From 1811e1c6214e27539e362b502719c6b916a0ea98 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sat, 22 May 2021 12:33:19 -0400 Subject: [PATCH] restructure results strong typing --- CHANGELOG.md | 7 +- demo/index.js | 6 +- dist/human.esm-nobundle.js | 19316 ++++++- dist/human.esm-nobundle.js.map | 4 +- dist/human.esm.js | 75949 ++++++++++++++++++++++++- dist/human.esm.js.map | 4 +- dist/human.js | 75975 +++++++++++++++++++++++++- dist/human.node-gpu.js | 89 +- dist/human.node-wasm.js | 89 +- dist/human.node.js | 89 +- dist/tfjs.esm.js | 59265 +++++++++++++++++++- dist/tfjs.esm.js.map | 2 +- server/build.log | 68 + src/draw/draw.ts | 65 +- src/efficientpose/efficientpose.ts | 6 +- src/face.ts | 27 +- src/gesture/gesture.ts | 10 +- src/handpose/handpose.ts | 35 +- src/human.ts | 6 +- src/object/centernet.ts | 6 +- src/object/nanodet.ts | 6 +- src/posenet/posenet.ts | 5 +- src/posenet/utils.ts | 7 +- src/result.ts | 247 +- typedoc/assets/js/search.js | 2 +- typedoc/classes/human.html | 47 +- typedoc/index.html | 38 + typedoc/interfaces/body.html | 234 + typedoc/interfaces/config.html | 15 + typedoc/interfaces/drawoptions.html | 15 + typedoc/interfaces/face.html | 397 + typedoc/interfaces/hand.html | 242 + typedoc/interfaces/object.html | 276 + typedoc/interfaces/result.html | 98 +- types/draw/draw.d.ts | 13 +- types/human.d.ts | 2 +- types/result.d.ts | 267 +- 37 files changed, 227902 insertions(+), 5027 deletions(-) create mode 100644 typedoc/interfaces/body.html create mode 100644 typedoc/interfaces/face.html create mode 100644 typedoc/interfaces/hand.html create mode 100644 typedoc/interfaces/object.html diff --git a/CHANGELOG.md b/CHANGELOG.md index 78f74ea0..e1b88501 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,11 +9,12 @@ Repository: **** ## Changelog +### **HEAD -> main** 2021/05/21 mandic00@live.com + + ### **1.9.1** 2021/05/21 mandic00@live.com - -### **origin/main** 2021/05/20 mandic00@live.com - +- caching improvements - sanitize server input - remove nanodet weights from default distribution - add experimental mb3-centernet object detection diff --git a/demo/index.js b/demo/index.js index 858084a9..dc568476 100644 --- a/demo/index.js +++ b/demo/index.js @@ -10,7 +10,6 @@ let human; const userConfig = { warmup: 'none', - /* backend: 'webgl', async: false, cacheSensitivity: 0, @@ -27,10 +26,9 @@ const userConfig = { }, hand: { enabled: false }, gesture: { enabled: false }, - body: { enabled: false, modelPath: 'posenet.json' }, + body: { enabled: true, modelPath: 'posenet.json' }, // body: { enabled: true, modelPath: 'blazepose.json' }, object: { enabled: false }, - */ }; // ui options @@ -46,6 +44,7 @@ const ui = { maxFPSframes: 10, // keep fps history for how many frames modelsPreload: true, // preload human models on startup modelsWarmup: true, // warmup human models on startup + buffered: true, // should output be buffered between frames // internal variables busy: false, // internal camera busy flag @@ -54,7 +53,6 @@ const ui = { camera: {}, // internal, holds details of webcam details detectFPS: [], // internal, holds fps values for detection performance drawFPS: [], // internal, holds fps values for draw performance - buffered: false, // should output be buffered between frames drawWarmup: false, // debug only, should warmup image processing be displayed on startup drawThread: null, // internl, perform draw operations in a separate thread detectThread: null, // internl, perform detect operations in a separate thread diff --git a/dist/human.esm-nobundle.js b/dist/human.esm-nobundle.js index f8cb577a..5efcb4be 100644 --- a/dist/human.esm-nobundle.js +++ b/dist/human.esm-nobundle.js @@ -5,14 +5,18842 @@ author: ' */ -var G5=Object.defineProperty;var n2=Object.getOwnPropertyDescriptor;var o2=Object.getOwnPropertyNames;var s2=Object.prototype.hasOwnProperty;var K=(A,e)=>{for(var t in e)G5(A,t,{get:e[t],enumerable:!0})},m=(A,e,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of o2(e))!s2.call(A,o)&&o!=="default"&&G5(A,o,{get:()=>e[o],enumerable:!(t=n2(e,o))||t.enumerable});return A};var Q5=(A,e,t)=>{if(!e.has(A))throw TypeError("Cannot "+t)};var Z=(A,e,t)=>(Q5(A,e,"read from private field"),t?t.call(A):e.get(A)),q=(A,e,t)=>{if(e.has(A))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(A):e.set(A,t)},Y=(A,e,t,o)=>(Q5(A,e,"write to private field"),o?o.call(A,t):e.set(A,t),t);function N(A,e){let t=A.endsWith("/")?"":"/",s=e.startsWith(".")||e.startsWith("/")||e.startsWith("http:")||e.startsWith("https:")||e.startsWith("file:")?`${e}`:`${A}${t}${e}`;if(!s.toLocaleLowerCase().includes(".json"))throw new Error(`Human: ModelPath Error: ${s} Expecting JSON file`);return s}function u(...A){let e=new Date,t=`${e.getHours().toString().padStart(2,"0")}:${e.getMinutes().toString().padStart(2,"0")}:${e.getSeconds().toString().padStart(2,"0")}.${e.getMilliseconds().toString().padStart(3,"0")}`;A&&console.log(t,"Human:",...A)}var S=()=>typeof performance!="undefined"?performance.now():parseInt((Number(process.hrtime.bigint())/1e3/1e3).toString());function B(...A){let e=t=>t&&typeof t=="object";return A.reduce((t,o)=>(Object.keys(o||{}).forEach(s=>{let r=t[s],n=o[s];Array.isArray(r)&&Array.isArray(n)?t[s]=r.concat(...n):e(r)&&e(n)?t[s]=B(r,n):t[s]=n}),t),{})}var _5={backend:"webgl",modelBasePath:"../models/",wasmPath:"../node_modules/@tensorflow/tfjs-backend-wasm/dist//",debug:!0,async:!0,warmup:"full",cacheSensitivity:.01,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:!1,maxDetected:10,skipFrames:21,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:31,minConfidence:.1},emotion:{enabled:!0,minConfidence:.1,skipFrames:32,modelPath:"emotion.json"}},body:{enabled:!0,modelPath:"posenet.json",maxDetected:1,minConfidence:.1},hand:{enabled:!0,rotation:!1,skipFrames:32,minConfidence:.1,iouThreshold:.1,maxDetected:2,landmarks:!0,detector:{modelPath:"handdetect.json"},skeleton:{modelPath:"handskeleton.json"}},object:{enabled:!1,modelPath:"mb3-centernet.json",minConfidence:.2,iouThreshold:.4,maxDetected:10,skipFrames:41}};function $5(){let A,e;if(typeof navigator!="undefined"){let t=navigator.userAgent.match(/\(([^()]+)\)/g);if(t&&t[0]){let o=t[0].match(/\(([^()]+)\)/g);A=o?o[0].replace(/\(|\)/g,""):"",e=navigator.userAgent.replace(t[0],""),A[1]&&(e=e.replace(t[1],"")),e=e.replace(/ /g," ")}}else typeof process!="undefined"&&(A=`${process.platform} ${process.arch}`,e=`NodeJS ${process.version}`);return{platform:A,agent:e}}var i={};K(i,{data:()=>x2,version:()=>y2});m(i,Y2);m(i,J2);m(i,K2);m(i,D2);m(i,G2);m(i,Q2);import*as AA from"@tensorflow/tfjs/package.json";import*as eA from"@tensorflow/tfjs-core/package.json";import*as tA from"@tensorflow/tfjs-data/package.json";import*as nA from"@tensorflow/tfjs-layers/package.json";import*as oA from"@tensorflow/tfjs-converter/package.json";import{version_cpu as r2}from"@tensorflow/tfjs-backend-cpu/dist/index.js";import{version_webgl as i2}from"@tensorflow/tfjs-backend-webgl/dist/index.js";import{version_wasm as a2}from"@tensorflow/tfjs-backend-wasm/dist/index.js";import*as Y2 from"@tensorflow/tfjs-core/dist/index.js";import*as J2 from"@tensorflow/tfjs-layers/dist/index.js";import*as K2 from"@tensorflow/tfjs-converter/dist/index.js";import*as x2 from"@tensorflow/tfjs-data/dist/index.js";import*as D2 from"@tensorflow/tfjs-backend-cpu/dist/index.js";import*as G2 from"@tensorflow/tfjs-backend-webgl/dist/index.js";import*as Q2 from"@tensorflow/tfjs-backend-wasm/dist/index.js";var y2={tfjs:(AA==null?void 0:AA.version)||void 0,"tfjs-core":(eA==null?void 0:eA.version)||void 0,"tfjs-data":(tA==null?void 0:tA.version)||void 0,"tfjs-layers":(nA==null?void 0:nA.version)||void 0,"tfjs-converter":(oA==null?void 0:oA.version)||void 0,"tfjs-backend-cpu":r2||void 0,"tfjs-backend-webgl":i2||void 0,"tfjs-backend-wasm":a2||void 0};var F={name:"humangl",priority:99,canvas:null,gl:null,width:1024,height:1024,webGLattr:{alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!1,desynchronized:!0}};function sA(){if(!i.findBackend(F.name)){u("backend registration:",F.name);try{F.canvas=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(F.width,F.height):document.createElement("canvas")}catch(A){u("error: cannot create canvas:",A);return}try{F.gl=F.canvas.getContext("webgl2",F.webGLattr)}catch(A){u("error: cannot get WebGL2 context:",A);return}try{i.setWebGLContext(2,F.gl)}catch(A){u("error: cannot set WebGL2 context:",A);return}try{let A=new i.GPGPUContext(F.gl);i.registerBackend(F.name,()=>new i.MathBackendWebGL(A),F.priority)}catch(A){u("error: cannot register WebGL backend:",A);return}try{i.getKernelsForBackend("webgl").forEach(e=>{let t={...e,backendName:F.name};i.registerKernel(t)})}catch(A){u("error: cannot update WebGL backend registration:",A);return}try{i.ENV.set("WEBGL_VERSION",2)}catch(A){u("error: cannot set WebGL backend flags:",A);return}u("backend registered:",F.name)}}var r5={};K(r5,{load:()=>s5,predict:()=>o5,triangulation:()=>uA,uvmap:()=>pA});function rA(A,e){let t=[A.startPoint[0]*e[0],A.startPoint[1]*e[1]],o=[A.endPoint[0]*e[0],A.endPoint[1]*e[1]];return{startPoint:t,endPoint:o}}function h0(A){return[Math.abs(A.endPoint[0]-A.startPoint[0]),Math.abs(A.endPoint[1]-A.startPoint[1])]}function a0(A){return[A.startPoint[0]+(A.endPoint[0]-A.startPoint[0])/2,A.startPoint[1]+(A.endPoint[1]-A.startPoint[1])/2]}function x0(A,e,t){let o=e.shape[1],s=e.shape[2],r=[[A.startPoint[1]/o,A.startPoint[0]/s,A.endPoint[1]/o,A.endPoint[0]/s]];return i.image.cropAndResize(e,r,[0],t)}function v0(A,e=1.5){let t=a0(A),o=h0(A),s=[e*o[0]/2,e*o[1]/2],r=[t[0]-s[0],t[1]-s[1]],n=[t[0]+s[0],t[1]+s[1]];return{startPoint:r,endPoint:n,landmarks:A.landmarks}}function R0(A){let e=a0(A),t=h0(A),s=Math.max(...t)/2,r=[Math.round(e[0]-s),Math.round(e[1]-s)],n=[Math.round(e[0]+s),Math.round(e[1]+s)];return{startPoint:r,endPoint:n,landmarks:A.landmarks}}function Q0(A){let e=A.map(r=>r[0]),t=A.map(r=>r[1]),o=[Math.min(...e),Math.min(...t)],s=[Math.max(...e),Math.max(...t)];return{startPoint:o,endPoint:s,landmarks:A}}var iA=A=>({startPoint:i.slice(A,[0,0],[-1,2]),endPoint:i.slice(A,[0,2],[-1,2])});var j0=[[1,0,0],[0,1,0],[0,0,1]];function l2(A){return A-2*Math.PI*Math.floor((A+Math.PI)/(2*Math.PI))}function _0(A,e){let t=Math.PI/2-Math.atan2(-(e[1]-A[1]),e[0]-A[0]);return l2(t)}function aA(A,e){return[[1,0,A],[0,1,e],[0,0,1]]}function Q(A,e){let t=0;for(let o=0;o{let y=e.resizeBilinear([this.inputSize,this.inputSize]).div(127.5).sub(.5),d=this.model.execute(y),l;if(Array.isArray(d)){let c=d.sort((v,j)=>v.size-j.size),g=i.concat([c[0],c[2]],2),M=i.concat([c[1],c[3]],2);l=i.concat([M,g],1).squeeze(0)}else l=d.squeeze();let f=d2(l,this.anchors,[this.inputSize,this.inputSize]),p=i.slice(l,[0,0],[-1,1]),z=i.sigmoid(p).squeeze().dataSync();return[l,f,z]}),r=await i.image.nonMaxSuppressionAsync(o,s,this.config.face.detector.maxDetected,this.config.face.detector.iouThreshold,this.config.face.detector.minConfidence),n=r.arraySync();r.dispose();let a=[];for(let x=0;xthis.config.face.detector.minConfidence){let d=i.slice(o,[n[x],0],[1,-1]),l=iA(d);d.dispose();let f=this.anchorsData[n[x]],p=i.tidy(()=>i.slice(t,[n[x],dA-1],[1,-1]).squeeze().reshape([dA,-1]));a.push({box:l,landmarks:p,anchor:f,confidence:y})}}return t.dispose(),o.dispose(),{boxes:a,scaleFactor:[e.shape[2]/this.inputSize,e.shape[1]/this.inputSize]}}};async function mA(A){let e=await i.loadGraphModel(N(A.modelBasePath,A.face.detector.modelPath),{fromTFHub:A.face.detector.modelPath.includes("tfhub.dev")}),t=new fA(e,A);return!e||!e.modelUrl?u("load model failed:",A.face.detector.modelPath):A.debug&&u("load model:",e.modelUrl),t}var D={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]},$0=[{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]}],u0=[[.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]],n0=[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 f2=[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],m2=[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],h2=[33,133,362,263,1,78,308],xe=f2.map(A=>u0[A]),ye=m2.map(A=>u0[A]),le=h2.map(A=>u0[A]);var A5=D.leftEyeLower0,e5=D.rightEyeLower0,y0={leftBounds:[A5[0],A5[A5.length-1]],rightBounds:[e5[0],e5[e5.length-1]]},w0={count:468,mouth:13,symmetryLine:[13,D.midwayBetweenEyes[0]]},hA={leftEye:0,rightEye:1,nose:2,mouth:3,leftEar:4,rightEar:5,symmetryLine:[3,2]},l0={upperCenter:3,lowerCenter:4,index:71,numCoordinates:76};function W0(A,e,t,o){for(let s=0;s<$0.length;s++){let{key:r,indices:n}=$0[s],a=D[`${t}${r}`];if(!o||o.includes(r))for(let x=0;x[r[0]/this.meshSize*(l[0]-this.meshSize/2),r[1]/this.meshSize*(l[1]-this.meshSize/2),l[2]]),a=o!==0?S0(o,[0,0]):j0,x=o!==0?n.map(l=>[...lA(l,a),l[2]]):n,y=o!==0?yA(s):j0,d=[...a0({startPoint:t.startPoint,endPoint:t.endPoint}),1];return x.map(l=>[Math.round(l[0]+Q(d,y[0])),Math.round(l[1]+Q(d,y[1])),Math.round(l[2])])}getLeftToRightEyeDepthDifference(e){let t=e[y0.leftBounds[0]][2],o=e[y0.rightBounds[0]][2];return t-o}getEyeBox(e,t,o,s,r=!1){let n=R0(v0(Q0([e[o],e[s]]),this.irisEnlarge)),a=h0(n),x=i.image.cropAndResize(t,[[n.startPoint[1]/this.meshSize,n.startPoint[0]/this.meshSize,n.endPoint[1]/this.meshSize,n.endPoint[0]/this.meshSize]],[0],[this.irisSize,this.irisSize]);return r&&i.ENV.flags.IS_BROWSER&&(x=i.image.flipLeftRight(x)),{box:n,boxSize:a,crop:x}}getEyeCoords(e,t,o,s=!1){let r=[];for(let n=0;n{let y=n;return x===2?y=s:x===4&&(y=r),[a[0],a[1],y]})}async predict(e,t){let o=!1,s;if((this.skipped===0||this.skipped>t.face.detector.skipFrames||!t.face.mesh.enabled||!t.skipFrame)&&(s=await this.boundingBoxDetector.getBoundingBoxes(e),this.skipped=0),t.skipFrame&&this.skipped++,!t.skipFrame||s&&s.boxes&&(!t.face.mesh.enabled||s.boxes.length!==this.detectedFaces&&this.detectedFaces!==t.face.detector.maxDetected)){this.storedBoxes=[],this.detectedFaces=0;for(let n of s.boxes)this.storedBoxes.push({startPoint:n.box.startPoint.dataSync(),endPoint:n.box.endPoint.dataSync(),landmarks:n.landmarks,confidence:n.confidence});this.storedBoxes.length>0&&(o=!0)}if(o){if(!s||!s.boxes||s.boxes.length===0)return this.storedBoxes=[],this.detectedFaces=0,null;for(let n=0;n{n.box.startPoint.dispose(),n.box.endPoint.dispose(),n.landmarks.dispose()});let r=i.tidy(()=>this.storedBoxes.map((n,a)=>{let x,y=0,d;if(t.face.detector.rotation&&t.face.mesh.enabled&&i.ENV.flags.IS_BROWSER){let[j,T]=n.landmarks.length>=w0.count?w0.symmetryLine:hA.symmetryLine;y=_0(n.landmarks[j],n.landmarks[T]);let h=a0({startPoint:n.startPoint,endPoint:n.endPoint}),P=[h[0]/e.shape[2],h[1]/e.shape[1]],R=i.image.rotateWithOffset(e,y,0,P);d=S0(-y,h),t.face.mesh.enabled?x=x0({startPoint:n.startPoint,endPoint:n.endPoint},R,[this.meshSize,this.meshSize]).div(255):x=x0({startPoint:n.startPoint,endPoint:n.endPoint},R,[this.boxSize,this.boxSize]).div(255)}else{d=j0;let j=e.clone();t.face.mesh.enabled?x=x0({startPoint:n.startPoint,endPoint:n.endPoint},j,[this.meshSize,this.meshSize]).div(255):x=x0({startPoint:n.startPoint,endPoint:n.endPoint},j,[this.boxSize,this.boxSize]).div(255)}if(!t.face.mesh.enabled)return{mesh:[],box:n,faceConfidence:null,boxConfidence:n.confidence,confidence:n.confidence,image:x};let[,l,f]=this.meshDetector.execute(x),p=l.dataSync()[0];if(p=w0.count?w0.symmetryLine:hA.symmetryLine;y=_0(n.landmarks[j],n.landmarks[T]);let h=a0({startPoint:n.startPoint,endPoint:n.endPoint}),P=[h[0]/e.shape[2],h[1]/e.shape[1]],R=i.image.rotateWithOffset(e.toFloat(),y,0,P);d=S0(-y,h),x=x0({startPoint:n.startPoint,endPoint:n.endPoint},R,[this.meshSize,this.meshSize]).div(255)}let b={mesh:g,box:n,faceConfidence:p,boxConfidence:n.confidence,image:x},v=R0(n);return v.confidence=n.confidence,v.faceConfidence=p,this.storedBoxes[a]=v,b}));return t.face.mesh.enabled&&(this.storedBoxes=this.storedBoxes.filter(n=>n.confidence>t.face.detector.minConfidence)),this.detectedFaces=r.length,r}};var I=[null,null,null],n5;async function o5(A,e){let t=await n5.predict(A,e),o=[];for(let s of t||[]){if(!s||s.isDisposedInternal)continue;let r=s.mesh.map(y=>[y[0]/A.shape[2],y[1]/A.shape[1],y[2]/n5.meshSize]),n={};if(s.mesh&&s.mesh.length>0)for(let y of Object.keys(D))n[y]=D[y].map(d=>s.mesh[d]);let a=s.box?[Math.max(0,s.box.startPoint[0]),Math.max(0,s.box.startPoint[1]),Math.min(A.shape[2],s.box.endPoint[0])-Math.max(0,s.box.startPoint[0]),Math.min(A.shape[1],s.box.endPoint[1])-Math.max(0,s.box.startPoint[1])]:0,x=s.box?[s.box.startPoint[0]/A.shape[2],s.box.startPoint[1]/A.shape[1],(s.box.endPoint[0]-s.box.startPoint[0])/A.shape[2],(s.box.endPoint[1]-s.box.startPoint[1])/A.shape[1]]:[];o.push({confidence:Math.round(100*s.faceConfidence||100*s.boxConfidence||0)/100,boxConfidence:Math.round(100*s.boxConfidence)/100,faceConfidence:Math.round(100*s.faceConfidence)/100,box:a,boxRaw:x,mesh:s.mesh,meshRaw:r,annotations:n,image:s.image}),s.coords&&s.coords.dispose()}return o}async function s5(A){return!I[0]&&A.face.enabled||!I[1]&&A.face.mesh.enabled||!I[2]&&A.face.iris.enabled?(I=await Promise.all([!I[0]&&A.face.enabled?mA(A):null,!I[1]&&A.face.mesh.enabled?i.loadGraphModel(N(A.modelBasePath,A.face.mesh.modelPath),{fromTFHub:A.face.mesh.modelPath.includes("tfhub.dev")}):null,!I[2]&&A.face.iris.enabled?i.loadGraphModel(N(A.modelBasePath,A.face.iris.modelPath),{fromTFHub:A.face.iris.modelPath.includes("tfhub.dev")}):null]),A.face.mesh.enabled&&(!I[1]||!I[1].modelUrl?u("load model failed:",A.face.mesh.modelPath):A.debug&&u("load model:",I[1].modelUrl)),A.face.iris.enabled&&(!I[2]||!I[1].modelUrl?u("load model failed:",A.face.iris.modelPath):A.debug&&u("load model:",I[2].modelUrl))):A.debug&&(u("cached model:",I[0].model.modelUrl),u("cached model:",I[1].modelUrl),u("cached model:",I[2].modelUrl)),n5=new t5(I[0],I[1],I[2]),I}var uA=n0,pA=u0;var y5={};K(y5,{load:()=>x5,predict:()=>N0});var u2=["angry","disgust","fear","happy","sad","surprise","neutral"],J,k0=[],bA=0,i5=Number.MAX_SAFE_INTEGER,a5=[.2989,.587,.114];async function x5(A){return J?A.debug&&u("cached model:",J.modelUrl):(J=await i.loadGraphModel(N(A.modelBasePath,A.face.emotion.modelPath)),!J||!J.modelUrl?u("load model failed:",A.face.emotion.modelPath):A.debug&&u("load model:",J.modelUrl)),J}async function N0(A,e,t,o){return J?i50?(i5++,k0[t]):(i5=0,new Promise(async s=>{let r=i.image.resizeBilinear(A,[J.inputs[0].shape[2],J.inputs[0].shape[1]],!1),[n,a,x]=i.split(r,3,3);r.dispose();let y=i.mul(n,a5[0]),d=i.mul(a,a5[1]),l=i.mul(x,a5[2]);n.dispose(),a.dispose(),x.dispose();let f=i.addN([y,d,l]);y.dispose(),d.dispose(),l.dispose();let p=i.tidy(()=>f.sub(.5).mul(2));f.dispose();let z=[];if(e.face.emotion.enabled){let c=await J.predict(p),g=c.dataSync();i.dispose(c);for(let M=0;Me.face.emotion.minConfidence&&z.push({score:Math.min(.99,Math.trunc(100*g[M])/100),emotion:u2[M]});z.sort((M,b)=>b.score-M.score)}p.dispose(),k0[t]=z,bA=o,s(z)})):null}var m5={};K(m5,{enhance:()=>f5,load:()=>c5,match:()=>TA,predict:()=>O0,similarity:()=>d5});var U,I0=[],gA=0,l5=Number.MAX_SAFE_INTEGER;async function c5(A){return U?A.debug&&u("cached model:",U.modelUrl):(U=await i.loadGraphModel(N(A.modelBasePath,A.face.description.modelPath)),!U||!U.modelUrl?u("load model failed:",A.face.description.modelPath):A.debug&&u("load model:",U.modelUrl)),U}function d5(A,e,t=2){if(!A||!e||(A==null?void 0:A.length)===0||(e==null?void 0:e.length)===0||(A==null?void 0:A.length)!==(e==null?void 0:e.length))return 0;let o=5*A.map((r,n)=>Math.abs(A[n]-e[n])**t).reduce((r,n)=>r+n,0)**(1/t);return Math.max(0,100-o)/100}function TA(A,e,t=0){let o={similarity:0,name:"",source:"",embedding:[]};if(!A||!e||!Array.isArray(A)||!Array.isArray(e))return o;for(let s of e)if(s.embedding&&s.name){let r=d5(A,s.embedding);r>t&&r>o.similarity&&(o={...s,similarity:r})}return o}function f5(A){return i.tidy(()=>{let t=A.image||A.tensor||A;if(!(t instanceof i.Tensor))return null;let o=[[.05,.15,.85,.85]];return(t.shape.length===3?i.image.cropAndResize(i.expandDims(t,0),o,[0],[U.inputs[0].shape[2],U.inputs[0].shape[1]]):i.image.cropAndResize(t,o,[0],[U.inputs[0].shape[2],U.inputs[0].shape[1]])).mul(255)})}async function O0(A,e,t,o){var s,r;return U?l50?(l5++,I0):(l5=0,new Promise(async n=>{let a=f5(A),x,y={age:0,gender:"unknown",genderConfidence:0,descriptor:[]};e.face.description.enabled&&(x=await U.predict(a)),i.dispose(a),x&&(i.tidy(()=>{let d=x.find(c=>c.shape[1]===1).dataSync(),l=Math.trunc(200*Math.abs(d[0]-.5))/100;l>e.face.description.minConfidence&&(y.gender=d[0]<=.5?"female":"male",y.genderConfidence=Math.min(.99,l));let f=x.find(c=>c.shape[1]===100).argMax(1).dataSync()[0],p=x.find(c=>c.shape[1]===100).dataSync();y.age=Math.round(p[f-1]>p[f+1]?10*f-100*p[f-1]:10*f+100*p[f+1])/10;let z=x.find(c=>c.shape[1]===1024);y.descriptor=[...z.dataSync()]}),x.forEach(d=>i.dispose(d))),I0[t]=y,gA=o,n(y)})):null}var p2=(A,e)=>{let t=g=>g*180/Math.PI,o=g=>{let M=Math.sqrt(g[0]*g[0]+g[1]*g[1]+g[2]*g[2]);return g[0]/=M,g[1]/=M,g[2]/=M,g},s=(g,M)=>{let b=g[0]-M[0],v=g[1]-M[1],j=g[2]-M[2];return[b,v,j]},r=(g,M)=>{let b=g[1]*M[2]-g[2]*M[1],v=g[2]*M[0]-g[0]*M[2],j=g[0]*M[1]-g[1]*M[0];return[b,v,j]},n=g=>{let[M,b,v,j,T,h,P,R,w]=g,O,G,X;return j<1?j>-1?(X=Math.asin(j),G=Math.atan2(-P,M),O=Math.atan2(-h,T)):(X=-Math.PI/2,G=-Math.atan2(R,w),O=0):(X=Math.PI/2,G=Math.atan2(R,w),O=0),{pitch:2*-O,yaw:2*-G,roll:2*-X}},a=g=>{let M=(v,j,T,h)=>Math.atan2(h-j,T-v);return{pitch:M(g[10][1],g[10][2],g[152][1],g[152][2]),yaw:M(g[33][0],g[33][2],g[263][0],g[263][2]),roll:M(g[33][0],g[33][1],g[263][0],g[263][1])}},x=A.meshRaw;if(!x||x.length<300)return{angle:{pitch:0,yaw:0,roll:0},matrix:[1,0,0,0,1,0,0,0,1]};let y=Math.max(A.boxRaw[2]*e[0],A.boxRaw[3]*e[1])/1.5,d=[x[10],x[152],x[234],x[454]].map(g=>[g[0]*e[0]/y,g[1]*e[1]/y,g[2]]),l=o(s(d[1],d[0])),f=o(s(d[3],d[2])),p=o(r(f,l));f=r(l,p);let z=[f[0],f[1],f[2],l[0],l[1],l[2],p[0],p[1],p[2]];return{angle:n(z),matrix:z}},h5=async(A,e)=>{var d,l,f,p,z,c,g,M;let t,o,s,r,n,a,x=[];A.state="run:face",t=S();let y=await o5(e,A.config);if(A.perf.face=Math.trunc(S()-t),!y)return[];for(let b=0;bM5,predict:()=>P5});var p0=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],PA=p0.length,b0=p0.reduce((A,e,t)=>(A[e]=t,A),{}),b2=[["leftHip","leftShoulder"],["leftElbow","leftShoulder"],["leftElbow","leftWrist"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["rightHip","rightShoulder"],["rightElbow","rightShoulder"],["rightElbow","rightWrist"],["rightHip","rightKnee"],["rightKnee","rightAnkle"],["leftShoulder","rightShoulder"],["leftHip","rightHip"]],g2=b2.map(([A,e])=>[b0[A],b0[e]]),MA=[["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 zA(A){let e=A.reduce(({maxX:t,maxY:o,minX:s,minY:r},{position:{x:n,y:a}})=>({maxX:Math.max(t,n),maxY:Math.max(o,a),minX:Math.min(s,n),minY:Math.min(r,a)}),{maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY,minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY});return[e.minX,e.minY,e.maxX-e.minX,e.maxY-e.minY]}function EA(A,[e,t],[o,s]){let r=(a,x,y)=>({score:a.score,box:[Math.trunc(a.box[0]*y),Math.trunc(a.box[1]*x),Math.trunc(a.box[2]*y),Math.trunc(a.box[3]*x)],keypoints:a.keypoints.map(({score:d,part:l,position:f})=>({score:d,part:l,position:{x:Math.trunc(f.x*y),y:Math.trunc(f.y*x)}}))});return A.map(a=>r(a,e/o,t/s))}var u5=class{constructor(e,t){this.priorityQueue=new Array(e),this.numberOfElements=-1,this.getElementValue=t}enqueue(e){this.priorityQueue[++this.numberOfElements]=e,this.swim(this.numberOfElements)}dequeue(){let e=this.priorityQueue[0];return this.exchange(0,this.numberOfElements--),this.sink(0),this.priorityQueue[this.numberOfElements+1]=null,e}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(e){for(;e>0&&this.less(Math.floor(e/2),e);)this.exchange(e,Math.floor(e/2)),e=Math.floor(e/2)}sink(e){for(;2*e<=this.numberOfElements;){let t=2*e;if(tt?t:A}function vA(A,e,t,o){let s=t-A,r=o-e;return s*s+r*r}function T5(A,e){return{x:A.x+e.x,y:A.y+e.y}}var Z0=1,c0=16,T2=50**2;function RA(A,e,t,o,s,r,n=2){let a=M=>({y:r.get(M.y,M.x,A),x:r.get(M.y,M.x,r.shape[2]/2+A)}),x=(M,b,v)=>({y:g5(Math.round(M.y/c0),0,b-1),x:g5(Math.round(M.x/c0),0,v-1)}),[y,d]=o.shape,l=x(e.position,y,d),f=a(l),z=T5(e.position,f);for(let M=0;M[b0[f],b0[p]]),n=r.map(([,f])=>f),a=r.map(([f])=>f),x=e.shape[2],y=n.length,d=new Array(x),l=b5(A.part,c0,t);d[A.part.id]={score:A.score,part:p0[A.part.id],position:l};for(let f=y-1;f>=0;--f){let p=n[f],z=a[f];d[p]&&!d[z]&&(d[z]=RA(f,d[p],z,e,t,s))}for(let f=0;fe){a=!1;break}if(!a)break}return a}function z2(A,e){let[t,o,s]=e.shape,r=new u5(t*o*s,({score:n})=>n);for(let n=0;n{var n;let r=(n=s[o])==null?void 0:n.position;return r?vA(t,e,r.y,r.x)<=T2:!1})}function E2(A,e){return e.reduce((o,{position:s,score:r},n)=>(jA(A,s,n)||(o+=r),o),0)/e.length}function SA(A,e,t,o,s,r){let n=[],a=z2(r,e);for(;n.lengthp.score>r);let l=E2(n,d),f=zA(d);l>r&&n.push({keypoints:d,box:f,score:Math.round(100*l)/100})}return n}var C,v2=["MobilenetV1/offset_2/BiasAdd","MobilenetV1/heatmap_2/BiasAdd","MobilenetV1/displacement_fwd_2/BiasAdd","MobilenetV1/displacement_bwd_2/BiasAdd"];async function P5(A,e){let t=i.tidy(()=>{let a=A.resizeBilinear([C.inputs[0].shape[2],C.inputs[0].shape[1]]).toFloat().div(127.5).sub(1),y=C.execute(a,v2).map(d=>d.squeeze([0]));return y[1]=y[1].sigmoid(),y}),o=await Promise.all(t.map(n=>n.buffer()));for(let n of t)n.dispose();let s=await SA(o[0],o[1],o[2],o[3],e.body.maxDetected,e.body.minConfidence);return EA(s,[A.shape[1],A.shape[2]],[C.inputs[0].shape[2],C.inputs[0].shape[1]])}async function M5(A){return C?A.debug&&u("cached model:",C.modelUrl):(C=await i.loadGraphModel(N(A.modelBasePath,A.body.modelPath)),!C||!C.modelUrl?u("load model failed:",A.body.modelPath):A.debug&&u("load model:",C.modelUrl)),C}var W5={};K(W5,{load:()=>w5,predict:()=>S5});function V0(A){return[Math.abs(A.endPoint[0]-A.startPoint[0]),Math.abs(A.endPoint[1]-A.startPoint[1])]}function g0(A){return[A.startPoint[0]+(A.endPoint[0]-A.startPoint[0])/2,A.startPoint[1]+(A.endPoint[1]-A.startPoint[1])/2]}function wA(A,e,t){let o=e.shape[1],s=e.shape[2],r=[[A.startPoint[1]/o,A.startPoint[0]/s,A.endPoint[1]/o,A.endPoint[0]/s]];return i.image.cropAndResize(e,r,[0],t)}function WA(A,e){let t=[A.startPoint[0]*e[0],A.startPoint[1]*e[1]],o=[A.endPoint[0]*e[0],A.endPoint[1]*e[1]],s=A.palmLandmarks.map(r=>[r[0]*e[0],r[1]*e[1]]);return{startPoint:t,endPoint:o,palmLandmarks:s,confidence:A.confidence}}function L0(A,e=1.5){let t=g0(A),o=V0(A),s=[e*o[0]/2,e*o[1]/2],r=[t[0]-s[0],t[1]-s[1]],n=[t[0]+s[0],t[1]+s[1]];return{startPoint:r,endPoint:n,palmLandmarks:A.palmLandmarks}}function H0(A){let e=g0(A),t=V0(A),s=Math.max(...t)/2,r=[e[0]-s,e[1]-s],n=[e[0]+s,e[1]+s];return{startPoint:r,endPoint:n,palmLandmarks:A.palmLandmarks}}var kA=[{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 E5=class{constructor(e){var t;this.model=e,this.anchors=kA.map(o=>[o.x,o.y]),this.anchorsTensor=i.tensor2d(this.anchors),this.inputSize=(t=this.model)==null?void 0:t.inputs[0].shape[2],this.inputSizeTensor=i.tensor1d([this.inputSize,this.inputSize]),this.doubleInputSizeTensor=i.tensor1d([this.inputSize*2,this.inputSize*2])}normalizeBoxes(e){return i.tidy(()=>{let t=i.slice(e,[0,0],[-1,2]),o=i.slice(e,[0,2],[-1,2]),s=i.add(i.div(t,this.inputSizeTensor),this.anchorsTensor),r=i.div(o,this.doubleInputSizeTensor),n=i.mul(i.sub(s,r),this.inputSizeTensor),a=i.mul(i.add(s,r),this.inputSizeTensor);return i.concat2d([n,a],1)})}normalizeLandmarks(e,t){return i.tidy(()=>{let o=i.add(i.div(e.reshape([-1,7,2]),this.inputSizeTensor),this.anchors[t]);return i.mul(o,this.inputSizeTensor)})}async getBoxes(e,t){let o=this.model.predict(e),s=o.squeeze();o.dispose();let r=i.tidy(()=>i.sigmoid(i.slice(s,[0,0],[-1,1])).squeeze()),n=r.dataSync(),a=i.slice(s,[0,1],[-1,4]),x=this.normalizeBoxes(a);a.dispose();let y=await i.image.nonMaxSuppressionAsync(x,n,t.hand.maxDetected,t.hand.iouThreshold,t.hand.minConfidence),d=y.arraySync();r.dispose(),y.dispose();let l=[];for(let f of d)if(n[f]>=t.hand.minConfidence){let p=i.slice(x,[f,0],[1,-1]),z=i.slice(s,[f,5],[1,14]),c=i.tidy(()=>this.normalizeLandmarks(z,f).reshape([-1,2]));z.dispose(),l.push({box:p,palmLandmarks:c,confidence:n[f]})}return s.dispose(),x.dispose(),l}async estimateHandBounds(e,t){let o=e.shape[1],s=e.shape[2],r=i.tidy(()=>e.resizeBilinear([this.inputSize,this.inputSize]).div(127.5).sub(1)),n=await this.getBoxes(r,t);r.dispose();let a=[];if(!n||n.length===0)return a;for(let x of n){let y=x.box.dataSync(),d=y.slice(0,2),l=y.slice(2,4),f=x.palmLandmarks.arraySync();x.box.dispose(),x.palmLandmarks.dispose(),a.push(WA({startPoint:d,endPoint:l,palmLandmarks:f,confidence:x.confidence},[s/this.inputSize,o/this.inputSize]))}return a}};function R2(A){return A-2*Math.PI*Math.floor((A+Math.PI)/(2*Math.PI))}function NA(A,e){let t=Math.PI/2-Math.atan2(-(e[1]-A[1]),e[0]-A[0]);return R2(t)}var IA=(A,e)=>[[1,0,A],[0,1,e],[0,0,1]];function _(A,e){let t=0;for(let o=0;on[0]),o=e.map(n=>n[1]),s=[Math.min(...t),Math.min(...o)],r=[Math.max(...t),Math.max(...o)];return{startPoint:s,endPoint:r}}getBoxForPalmLandmarks(e,t){let o=e.map(r=>R5([...r,1],t)),s=this.calculateLandmarksBoundingBox(o);return L0(H0(s),S2)}getBoxForHandLandmarks(e){let t=this.calculateLandmarksBoundingBox(e),o=L0(H0(t),VA);o.palmLandmarks=[];for(let s=0;s[n[0]*(p[0]-this.inputSize/2),n[1]*(p[1]-this.inputSize/2),n[2]*p[2]]),x=v5(o,[0,0]),y=a.map(p=>[...R5(p,x),p[2]]),d=ZA(s),l=[...g0(t),1],f=[_(l,d[0]),_(l,d[1])];return y.map(p=>[p[0]+f[0],p[1]+f[1],p[2]])}async estimateHands(e,t){let o=!1,s;(this.skipped===0||this.skipped>t.hand.skipFrames||!t.hand.landmarks||!t.skipFrame)&&(s=await this.handDetector.estimateHandBounds(e,t),this.skipped=0),t.skipFrame&&this.skipped++,s&&s.length>0&&(s.length!==this.detectedHands&&this.detectedHands!==t.hand.maxDetected||!t.hand.landmarks)&&(this.detectedHands=0,this.storedBoxes=[...s],this.storedBoxes.length>0&&(o=!0));let r=[];for(let n=0;n=t.hand.minConfidence){let v=i.reshape(M,[-1,3]),j=v.arraySync();M.dispose(),v.dispose();let T=this.transformRawCoords(j,p,x,f),h=this.getBoxForHandLandmarks(T);this.storedBoxes[n]=h;let P={landmarks:T,confidence:b,box:{topLeft:h.startPoint,bottomRight:h.endPoint}};r.push(P)}else this.storedBoxes[n]=null;M.dispose()}else{let x=L0(H0(a),VA),y={confidence:a.confidence,box:{topLeft:x.startPoint,bottomRight:x.endPoint}};r.push(y)}}return this.storedBoxes=this.storedBoxes.filter(n=>n!==null),this.detectedHands=r.length,r}};var HA={thumb:[1,2,3,4],indexFinger:[5,6,7,8],middleFinger:[9,10,11,12],ringFinger:[13,14,15,16],pinky:[17,18,19,20],palmBase:[0]},$,A0,XA;async function S5(A,e){let t=await XA.estimateHands(A,e);if(!t)return[];let o=[];for(let s of t){let r={};if(s.landmarks)for(let x of Object.keys(HA))r[x]=HA[x].map(y=>s.landmarks[y]);let n=s.box?[Math.max(0,s.box.topLeft[0]),Math.max(0,s.box.topLeft[1]),Math.min(A.shape[2],s.box.bottomRight[0])-Math.max(0,s.box.topLeft[0]),Math.min(A.shape[1],s.box.bottomRight[1])-Math.max(0,s.box.topLeft[1])]:[],a=[s.box.topLeft[0]/A.shape[2],s.box.topLeft[1]/A.shape[1],(s.box.bottomRight[0]-s.box.topLeft[0])/A.shape[2],(s.box.bottomRight[1]-s.box.topLeft[1])/A.shape[1]];o.push({confidence:Math.round(100*s.confidence)/100,box:n,boxRaw:a,landmarks:s.landmarks,annotations:r})}return o}async function w5(A){!$||!A0?([$,A0]=await Promise.all([A.hand.enabled?i.loadGraphModel(N(A.modelBasePath,A.hand.detector.modelPath),{fromTFHub:A.hand.detector.modelPath.includes("tfhub.dev")}):null,A.hand.landmarks?i.loadGraphModel(N(A.modelBasePath,A.hand.skeleton.modelPath),{fromTFHub:A.hand.skeleton.modelPath.includes("tfhub.dev")}):null]),A.hand.enabled&&(!$||!$.modelUrl?u("load model failed:",A.hand.detector.modelPath):A.debug&&u("load model:",$.modelUrl),!A0||!A0.modelUrl?u("load model failed:",A.hand.skeleton.modelPath):A.debug&&u("load model:",A0.modelUrl))):(A.debug&&u("cached model:",$.modelUrl),A.debug&&u("cached model:",A0.modelUrl));let e=new E5($);return XA=new j5(e,A0),[$,A0]}var I5={};K(I5,{load:()=>k5,predict:()=>N5});var FA=["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"],qA=["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 V;async function k5(A){return V?A.debug&&u("cached model:",V.modelUrl):(V=await i.loadGraphModel(N(A.modelBasePath,A.body.modelPath)),V.width=parseInt(V.signature.inputs["input_1:0"].tensorShape.dim[2].size),V.height=parseInt(V.signature.inputs["input_1:0"].tensorShape.dim[1].size),!V||!V.modelUrl?u("load model failed:",A.body.modelPath):A.debug&&u("load model:",V.modelUrl)),V}async function N5(A,e){if(!V||!e.body.enabled)return null;let t={width:A.shape[2],height:A.shape[1]},o=i.image.resizeBilinear(A,[V.width,V.height],!1),s=i.div(o,[255]);o.dispose();let r=await V.predict(s),n=r.find(l=>l.size===195||l.size===155).dataSync();r.forEach(l=>l.dispose()),s.dispose();let a=[],x=n.length===195?FA:qA,y=5;for(let l=0;lf.score>l?f.score:l,0),keypoints:a}]}var H5={};K(H5,{load:()=>V5,predict:()=>L5});var d0=[{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 L,O5=[],Z5=Number.MAX_SAFE_INTEGER,X0=2.5;async function V5(A){if(L)A.debug&&u("cached model:",L.modelUrl);else{L=await i.loadGraphModel(N(A.modelBasePath,A.object.modelPath));let e=Object.values(L.modelSignature.inputs);if(L.inputSize=Array.isArray(e)?parseInt(e[0].tensorShape.dim[2].size):null,!L.inputSize)throw new Error(`Human: Cannot determine model inputSize: ${A.object.modelPath}`);!L||!L.modelUrl?u("load model failed:",A.object.modelPath):A.debug&&u("load model:",L.modelUrl)}return L}async function k2(A,e,t,o){let s=0,r=[];for(let y of[1,2,4])i.tidy(()=>{var g,M;let d=y*13,l=(g=A.find(b=>b.shape[1]===d**2&&b.shape[2]===d0.length))==null?void 0:g.squeeze(),f=(M=A.find(b=>b.shape[1]===d**2&&b.shape[2]o.object.minConfidence&&v!==61){let T=(.5+Math.trunc(b%d))/d,h=(.5+Math.trunc(b/d))/d,P=z[b].map(t0=>t0*(d/y/e)),[R,w]=[T-X0/y*P[0],h-X0/y*P[1]],[O,G]=[T+X0/y*P[2]-R,h+X0/y*P[3]-w],X=[R,w,O,G];X=X.map(t0=>Math.max(0,Math.min(t0,1)));let E0=[X[0]*t[0],X[1]*t[1],X[2]*t[0],X[3]*t[1]],G0={id:s++,strideSize:y,score:Math.round(100*j)/100,class:v+1,label:d0[v].label,center:[Math.trunc(t[0]*T),Math.trunc(t[1]*h)],centerRaw:[T,h],box:E0.map(t0=>Math.trunc(t0)),boxRaw:X};r.push(G0)}}});A.forEach(y=>i.dispose(y));let n=r.map(y=>[y.boxRaw[1],y.boxRaw[0],y.boxRaw[3],y.boxRaw[2]]),a=r.map(y=>y.score),x=[];if(n&&n.length>0){let y=await i.image.nonMaxSuppressionAsync(n,a,o.object.maxDetected,o.object.iouThreshold,o.object.minConfidence);x=y.dataSync(),i.dispose(y)}return r=r.filter((y,d)=>x.includes(d)).sort((y,d)=>d.score-y.score),r}async function L5(A,e){return L?Z50?(Z5++,O5):(Z5=0,new Promise(async t=>{let o=[A.shape[2],A.shape[1]],s=i.image.resizeBilinear(A,[L.inputSize,L.inputSize],!1),r=s.div(255),n=r.transpose([0,3,1,2]);r.dispose(),s.dispose();let a;e.object.enabled&&(a=await L.predict(n)),n.dispose();let x=await k2(a,L.inputSize,o,e);O5=x,t(x)})):null}var U5={};K(U5,{load:()=>q5,predict:()=>B5});var H,X5=[],F5=Number.MAX_SAFE_INTEGER;async function q5(A){if(H)A.debug&&u("cached model:",H.modelUrl);else{H=await i.loadGraphModel(N(A.modelBasePath,A.object.modelPath));let e=Object.values(H.modelSignature.inputs);if(H.inputSize=Array.isArray(e)?parseInt(e[0].tensorShape.dim[2].size):null,!H.inputSize)throw new Error(`Human: Cannot determine model inputSize: ${A.object.modelPath}`);!H||!H.modelUrl?u("load model failed:",A.object.modelPath):A.debug&&u("load model:",H.modelUrl)}return H}async function N2(A,e,t,o){let s=[],r=A.arraySync(),n=i.squeeze(A);A.dispose();let a=i.split(n,6,1);n.dispose();let y=i.stack([a[1],a[0],a[3],a[2]],1).squeeze(),d=a[4].squeeze(),l=a[5].squeeze();a.forEach(z=>z.dispose());let f=await i.image.nonMaxSuppressionAsync(y,d,o.object.maxDetected,o.object.iouThreshold,o.object.minConfidence);y.dispose(),d.dispose(),l.dispose();let p=f.dataSync();f.dispose();for(let z of p){let c=r[0][z][4],g=r[0][z][5],M=d0[g].label,b=[r[0][z][0]/e,r[0][z][1]/e,r[0][z][2]/e,r[0][z][3]/e],v=[Math.trunc(b[0]*t[0]),Math.trunc(b[1]*t[1]),Math.trunc(b[2]*t[0]),Math.trunc(b[3]*t[1])];s.push({score:c,class:g,label:M,box:v,boxRaw:b})}return s}async function B5(A,e){return H?F50?(F5++,X5):(F5=0,new Promise(async t=>{let o=[A.shape[2],A.shape[1]],s=i.image.resizeBilinear(A,[H.inputSize,H.inputSize],!1),r;e.object.enabled&&(r=H.execute(s,"tower_0/detections")),s.dispose();let n=await N2(r,H.inputSize,o,e);X5=n,t(n)})):null}var BA=A=>{if(!A)return[];let e=[];for(let t=0;tx.part==="leftWrist"),s=A[t].keypoints.find(x=>x.part==="rightWrist"),r=A[t].keypoints.find(x=>x.part==="nose");r&&o&&s&&o.position.yx.part==="leftShoulder"),a=A[t].keypoints.find(x=>x.part==="rightShoulder");n&&a&&e.push({body:t,gesture:`leaning ${n.position.y>a.position.y?"left":"right"}`})}return e},UA=A=>{if(!A)return[];let e=[];for(let t=0;t0){let o=A[t].mesh[33][2]-A[t].mesh[263][2];Math.abs(o)<10?e.push({face:t,gesture:"facing center"}):e.push({face:t,gesture:`facing ${o<0?"left":"right"}`}),Math.abs(A[t].mesh[374][1]-A[t].mesh[386][1])/Math.abs(A[t].mesh[443][1]-A[t].mesh[450][1])<.2&&e.push({face:t,gesture:"blink left eye"}),Math.abs(A[t].mesh[145][1]-A[t].mesh[159][1])/Math.abs(A[t].mesh[223][1]-A[t].mesh[230][1])<.2&&e.push({face:t,gesture:"blink right eye"});let n=Math.min(100,500*Math.abs(A[t].mesh[13][1]-A[t].mesh[14][1])/Math.abs(A[t].mesh[10][1]-A[t].mesh[152][1]));n>10&&e.push({face:t,gesture:`mouth ${Math.trunc(n)}% open`});let a=A[t].mesh[152][2];Math.abs(a)>10&&e.push({face:t,gesture:`head ${a<0?"up":"down"}`})}return e},CA=A=>{if(!A)return[];let e=[];for(let t=0;t.033||l>.033)&&(y=!1),f>.033&&e.push({iris:t,gesture:"looking right"}),l>.033&&e.push({iris:t,gesture:"looking left"});let p=Math.abs(A[t].mesh[145][1]-A[t].annotations.rightEyeIris[0][1])/A[t].annotations.rightEyeIris[0][1],z=Math.abs(A[t].mesh[374][1]-A[t].annotations.leftEyeIris[0][1])/A[t].annotations.leftEyeIris[0][1];(z<.015||p<.015||z>.03||p>.03)&&(y=!1),(z<.015||p<.015)&&e.push({iris:t,gesture:"looking down"}),(z>.03||p>.03)&&e.push({iris:t,gesture:"looking up"}),y&&e.push({iris:t,gesture:"looking center"})}return e},YA=A=>{if(!A)return[];let e=[];for(let t=0;t0){let s=o.reduce((n,a)=>n.position[2]n.position[1](y[f]=0,l))},s=function(a,x){let y=A.createShader(x);if(A.shaderSource(y,a),A.compileShader(y),!A.getShaderParameter(y,A.COMPILE_STATUS))throw new Error("Filter: GL compile failed",A.getShaderInfoLog(y));return y};this.uniform={},this.attribute={};let r=s(e,A.VERTEX_SHADER),n=s(t,A.FRAGMENT_SHADER);if(this.id=A.createProgram(),A.attachShader(this.id,r),A.attachShader(this.id,n),A.linkProgram(this.id),!A.getProgramParameter(this.id,A.LINK_STATUS))throw new Error("Filter: GL link failed",A.getProgramInfoLog(this.id));A.useProgram(this.id),o(e,"attribute",this.attribute);for(let a in this.attribute)this.attribute[a]=A.getAttribLocation(this.id,a);o(e,"uniform",this.uniform),o(t,"uniform",this.uniform);for(let a in this.uniform)this.uniform[a]=A.getUniformLocation(this.id,a)}function JA(A){A||(A={});let e=0,t=null,o=!1,s=-1,r=[null,null],n=[],a=-1,x=-1,y=null,d=null,l={},f=A.canvas||document.createElement("canvas"),p={},z={INTERMEDIATE:1},c=f.getContext("webgl");if(!c)throw new Error("Filter: getContext() failed");this.addFilter=function(T){let h=Array.prototype.slice.call(arguments,1),P=l[T];n.push({func:P,args:h})},this.reset=function(){n=[]};let g=function(T,h){if(!(T===a&&h===x)){if(f.width=T,a=T,f.height=h,x=h,!y){let P=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]);y=c.createBuffer(),c.bindBuffer(c.ARRAY_BUFFER,y),c.bufferData(c.ARRAY_BUFFER,P,c.STATIC_DRAW),c.pixelStorei(c.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0)}c.viewport(0,0,a,x),r=[null,null]}},M=function(T,h){let P=c.createFramebuffer();c.bindFramebuffer(c.FRAMEBUFFER,P);let R=c.createRenderbuffer();c.bindRenderbuffer(c.RENDERBUFFER,R);let w=c.createTexture();return c.bindTexture(c.TEXTURE_2D,w),c.texImage2D(c.TEXTURE_2D,0,c.RGBA,T,h,0,c.RGBA,c.UNSIGNED_BYTE,null),c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MAG_FILTER,c.LINEAR),c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MIN_FILTER,c.LINEAR),c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_S,c.CLAMP_TO_EDGE),c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_T,c.CLAMP_TO_EDGE),c.framebufferTexture2D(c.FRAMEBUFFER,c.COLOR_ATTACHMENT0,c.TEXTURE_2D,w,0),c.bindTexture(c.TEXTURE_2D,null),c.bindFramebuffer(c.FRAMEBUFFER,null),{fbo:P,texture:w}},b=function(T){return r[T]=r[T]||M(a,x),r[T]},v=function(T=null){var w,O;let h=null,P=null,R=!1;e===0?h=t:h=(w=b(s))==null?void 0:w.texture,e++,o&&!(T&z.INTERMEDIATE)?(P=null,R=e%2==0):(s=(s+1)%2,P=(O=b(s))==null?void 0:O.fbo),c.bindTexture(c.TEXTURE_2D,h),c.bindFramebuffer(c.FRAMEBUFFER,P),c.uniform1f(d.uniform.flipY,R?-1:1),c.drawArrays(c.TRIANGLES,0,6)};this.apply=function(T){if(g(T.width,T.height),e=0,t||(t=c.createTexture()),c.bindTexture(c.TEXTURE_2D,t),c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_S,c.CLAMP_TO_EDGE),c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_T,c.CLAMP_TO_EDGE),c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MIN_FILTER,c.NEAREST),c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MAG_FILTER,c.NEAREST),c.texImage2D(c.TEXTURE_2D,0,c.RGBA,c.RGBA,c.UNSIGNED_BYTE,T),n.length===0)return v(),f;for(let h=0;h0,r=A.naturalHeight||A.videoHeight||A.height||A.shape&&A.shape[2]>0,n=s,a=r;if(n>F0&&(n=F0,a=n*r/s),a>F0&&(a=F0,n=a*s/r),e.filter.width>0?n=e.filter.width:e.filter.height>0&&(n=s*(e.filter.height/r)),e.filter.height>0?a=e.filter.height:e.filter.width>0&&(a=r*(e.filter.width/s)),!n||!a)throw new Error("Human: Input cannot determine dimension");(!E||(E==null?void 0:E.width)!==n||(E==null?void 0:E.height)!==a)&&(E=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(n,a):document.createElement("canvas"),(E==null?void 0:E.width)!==n&&(E.width=n),(E==null?void 0:E.height)!==a&&(E.height=a));let x=E.getContext("2d");if(A instanceof ImageData?x.putImageData(A,0,0):e.filter.flip&&typeof x.translate!="undefined"?(x.translate(s,0),x.scale(-1,1),x.drawImage(A,0,0,s,r,0,0,E==null?void 0:E.width,E==null?void 0:E.height),x.setTransform(1,0,0,1,0,0)):x.drawImage(A,0,0,s,r,0,0,E==null?void 0:E.width,E==null?void 0:E.height),e.filter.enabled){if((!k||!W||E.width!==W.width||(E==null?void 0:E.height)!==(W==null?void 0:W.height))&&(W=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(E==null?void 0:E.width,E==null?void 0:E.height):document.createElement("canvas"),(W==null?void 0:W.width)!==(E==null?void 0:E.width)&&(W.width=E==null?void 0:E.width),(W==null?void 0:W.height)!==(E==null?void 0:E.height)&&(W.height=E==null?void 0:E.height),k=i.ENV.flags.IS_BROWSER?new JA({canvas:W}):null),!k)return{tensor:null,canvas:E};k.reset(),k.addFilter("brightness",e.filter.brightness),e.filter.contrast!==0&&k.addFilter("contrast",e.filter.contrast),e.filter.sharpness!==0&&k.addFilter("sharpen",e.filter.sharpness),e.filter.blur!==0&&k.addFilter("blur",e.filter.blur),e.filter.saturation!==0&&k.addFilter("saturation",e.filter.saturation),e.filter.hue!==0&&k.addFilter("hue",e.filter.hue),e.filter.negative&&k.addFilter("negative"),e.filter.sepia&&k.addFilter("sepia"),e.filter.vintage&&k.addFilter("brownie"),e.filter.sepia&&k.addFilter("sepia"),e.filter.kodachrome&&k.addFilter("kodachrome"),e.filter.technicolor&&k.addFilter("technicolor"),e.filter.polaroid&&k.addFilter("polaroid"),e.filter.pixelate!==0&&k.addFilter("pixelate",e.filter.pixelate),k.apply(E)}else W=E,k&&(k=null);let y;if(W.data){let l=[W.height,W.width,3];y=i.tensor3d(W.data,l,"int32")}else if(W instanceof ImageData)y=i.browser.fromPixels(W);else if(e.backend==="webgl"||e.backend==="humangl"){let l=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(n,a):document.createElement("canvas");l.width=n,l.height=a;let f=l.getContext("2d");f==null||f.drawImage(W,0,0),y=i.browser.fromPixels(l)}else{let l=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(n,a):document.createElement("canvas");l.width=n,l.height=a;let f=l.getContext("2d");f==null||f.drawImage(W,0,0);let p=f==null?void 0:f.getImageData(0,0,n,a);y=i.browser.fromPixels(p)}let d=y.toFloat();t=d.expandDims(0),y.dispose(),d.dispose()}let o=e.filter.return?W:null;return{tensor:t,canvas:o}}var J5={};K(J5,{all:()=>Z2,body:()=>GA,canvas:()=>O2,face:()=>DA,gesture:()=>KA,hand:()=>QA,object:()=>_A,options:()=>o0});var o0={color:"rgba(173, 216, 230, 0.3)",labelColor:"rgba(173, 216, 230, 1)",shadowColor:"black",font:'small-caps 16px "Segoe UI"',lineHeight:24,lineWidth:6,pointSize:2,roundRect:28,drawPoints:!1,drawLabels:!0,drawBoxes:!0,drawPolygons:!0,fillPolygons:!1,useDepth:!0,useCurves:!1,bufferedOutput:!1,useRawBoxes:!1,calculateHandBox:!0};function q0(A,e,t,o=0,s){A.fillStyle=s.useDepth&&o?`rgba(${127.5+2*o}, ${127.5-2*o}, 255, 0.3)`:s.color,A.beginPath(),A.arc(e,t,s.pointSize,0,2*Math.PI),A.fill()}function s0(A,e,t,o,s,r){if(A.beginPath(),r.useCurves){let n=(e+e+o)/2,a=(t+t+s)/2;A.ellipse(n,a,o/2,s/2,0,0,2*Math.PI)}else A.lineWidth=r.lineWidth,A.moveTo(e+r.roundRect,t),A.lineTo(e+o-r.roundRect,t),A.quadraticCurveTo(e+o,t,e+o,t+r.roundRect),A.lineTo(e+o,t+s-r.roundRect),A.quadraticCurveTo(e+o,t+s,e+o-r.roundRect,t+s),A.lineTo(e+r.roundRect,t+s),A.quadraticCurveTo(e,t+s,e,t+s-r.roundRect),A.lineTo(e,t+r.roundRect),A.quadraticCurveTo(e,t,e+r.roundRect,t),A.closePath();A.stroke()}function Y5(A,e=[],t){if(!(e===void 0||e.length===0)){A.beginPath(),A.moveTo(e[0][0],e[0][1]);for(let o of e)A.strokeStyle=t.useDepth&&o[2]?`rgba(${127.5+2*o[2]}, ${127.5-2*o[2]}, 255, 0.3)`:t.color,A.fillStyle=t.useDepth&&o[2]?`rgba(${127.5+2*o[2]}, ${127.5-2*o[2]}, 255, 0.3)`:t.color,A.lineTo(o[0],parseInt(o[1]));A.stroke(),t.fillPolygons&&(A.closePath(),A.fill())}}function T0(A,e=[],t){if(!(e===void 0||e.length===0)){if(!t.useCurves||e.length<=2){Y5(A,e,t);return}A.moveTo(e[0][0],e[0][1]);for(let o=0;o1&&x[1].length>0){let y=a[1]>0?`#${a[1]}`:"",d=`${a[0]} ${y}: ${x[1]}`;o.shadowColor&&o.shadowColor!==""&&(s.fillStyle=o.shadowColor,s.fillText(d,8,2+r*o.lineHeight)),s.fillStyle=o.labelColor,s.fillText(d,6,0+r*o.lineHeight),r+=1}}}async function DA(A,e,t){let o=B(o0,t);if(!e||!A||!(A instanceof HTMLCanvasElement))return;let s=A.getContext("2d");if(!!s)for(let r of e){s.font=o.font,s.strokeStyle=o.color,s.fillStyle=o.color,o.drawBoxes&&(o.useRawBoxes?s0(s,A.width*r.boxRaw[0],A.height*r.boxRaw[1],A.width*r.boxRaw[2],A.height*r.boxRaw[3],o):s0(s,r.box[0],r.box[1],r.box[2],r.box[3],o));let n=[];if(n.push(`face confidence: ${Math.trunc(100*r.confidence)}%`),r.genderConfidence&&n.push(`${r.gender||""} ${Math.trunc(100*r.genderConfidence)}% confident`),r.age&&n.push(`age: ${r.age||""}`),r.iris&&n.push(`iris distance: ${r.iris}`),r.emotion&&r.emotion.length>0){let a=r.emotion.map(x=>`${Math.trunc(100*x.score)}% ${x.emotion}`);n.push(a.join(" "))}r.rotation&&r.rotation.angle&&r.rotation.angle.roll&&n.push(`roll: ${Math.trunc(100*r.rotation.angle.roll)/100} yaw:${Math.trunc(100*r.rotation.angle.yaw)/100} pitch:${Math.trunc(100*r.rotation.angle.pitch)/100}`),n.length===0&&n.push("face"),s.fillStyle=o.color;for(let a=n.length-1;a>=0;a--){let x=Math.max(r.box[0],0),y=a*o.lineHeight+r.box[1];o.shadowColor&&o.shadowColor!==""&&(s.fillStyle=o.shadowColor,s.fillText(n[a],x+5,y+16)),s.fillStyle=o.labelColor,s.fillText(n[a],x+4,y+15)}if(s.lineWidth=1,r.mesh&&r.mesh.length>0){if(o.drawPoints)for(let a of r.mesh)q0(s,a[0],a[1],a[2],o);if(o.drawPolygons){s.lineWidth=1;for(let a=0;ar.mesh[y]);Y5(s,x,o)}if(r.annotations&&r.annotations.leftEyeIris){s.strokeStyle=o.useDepth?"rgba(255, 200, 255, 0.3)":o.color,s.beginPath();let a=Math.abs(r.annotations.leftEyeIris[3][0]-r.annotations.leftEyeIris[1][0])/2,x=Math.abs(r.annotations.leftEyeIris[4][1]-r.annotations.leftEyeIris[2][1])/2;s.ellipse(r.annotations.leftEyeIris[0][0],r.annotations.leftEyeIris[0][1],a,x,0,0,2*Math.PI),s.stroke(),o.fillPolygons&&(s.fillStyle=o.useDepth?"rgba(255, 255, 200, 0.3)":o.color,s.fill())}if(r.annotations&&r.annotations.rightEyeIris){s.strokeStyle=o.useDepth?"rgba(255, 200, 255, 0.3)":o.color,s.beginPath();let a=Math.abs(r.annotations.rightEyeIris[3][0]-r.annotations.rightEyeIris[1][0])/2,x=Math.abs(r.annotations.rightEyeIris[4][1]-r.annotations.rightEyeIris[2][1])/2;s.ellipse(r.annotations.rightEyeIris[0][0],r.annotations.rightEyeIris[0][1],a,x,0,0,2*Math.PI),s.stroke(),o.fillPolygons&&(s.fillStyle=o.useDepth?"rgba(255, 255, 200, 0.3)":o.color,s.fill())}}}}}var e0=[];async function GA(A,e,t){let o=B(o0,t);if(!e||!A||!(A instanceof HTMLCanvasElement))return;let s=A.getContext("2d");if(!!s){s.lineJoin="round";for(let r=0;rx.part==="leftShoulder"),n&&a.push([n.position.x,n.position.y]),n=e[r].keypoints.find(x=>x.part==="rightShoulder"),n&&a.push([n.position.x,n.position.y]),T0(s,a,o),a.length=0,n=e[r].keypoints.find(x=>x.part==="rightShoulder"),n&&a.push([n.position.x,n.position.y]),n=e[r].keypoints.find(x=>x.part==="rightHip"),n&&a.push([n.position.x,n.position.y]),n=e[r].keypoints.find(x=>x.part==="leftHip"),n&&a.push([n.position.x,n.position.y]),n=e[r].keypoints.find(x=>x.part==="leftShoulder"),n&&a.push([n.position.x,n.position.y]),a.length===4&&Y5(s,a,o),a.length=0,n=e[r].keypoints.find(x=>x.part==="leftHip"),n&&a.push([n.position.x,n.position.y]),n=e[r].keypoints.find(x=>x.part==="leftKnee"),n&&a.push([n.position.x,n.position.y]),n=e[r].keypoints.find(x=>x.part==="leftAnkle"),n&&a.push([n.position.x,n.position.y]),n=e[r].keypoints.find(x=>x.part==="leftHeel"),n&&a.push([n.position.x,n.position.y]),n=e[r].keypoints.find(x=>x.part==="leftFoot"),n&&a.push([n.position.x,n.position.y]),T0(s,a,o),a.length=0,n=e[r].keypoints.find(x=>x.part==="rightHip"),n&&a.push([n.position.x,n.position.y]),n=e[r].keypoints.find(x=>x.part==="rightKnee"),n&&a.push([n.position.x,n.position.y]),n=e[r].keypoints.find(x=>x.part==="rightAnkle"),n&&a.push([n.position.x,n.position.y]),n=e[r].keypoints.find(x=>x.part==="rightHeel"),n&&a.push([n.position.x,n.position.y]),n=e[r].keypoints.find(x=>x.part==="rightFoot"),n&&a.push([n.position.x,n.position.y]),T0(s,a,o),a.length=0,n=e[r].keypoints.find(x=>x.part==="leftShoulder"),n&&a.push([n.position.x,n.position.y]),n=e[r].keypoints.find(x=>x.part==="leftElbow"),n&&a.push([n.position.x,n.position.y]),n=e[r].keypoints.find(x=>x.part==="leftWrist"),n&&a.push([n.position.x,n.position.y]),n=e[r].keypoints.find(x=>x.part==="leftPalm"),n&&a.push([n.position.x,n.position.y]),T0(s,a,o),a.length=0,n=e[r].keypoints.find(x=>x.part==="rightShoulder"),n&&a.push([n.position.x,n.position.y]),n=e[r].keypoints.find(x=>x.part==="rightElbow"),n&&a.push([n.position.x,n.position.y]),n=e[r].keypoints.find(x=>x.part==="rightWrist"),n&&a.push([n.position.x,n.position.y]),n=e[r].keypoints.find(x=>x.part==="rightPalm"),n&&a.push([n.position.x,n.position.y]),T0(s,a,o)}}}}async function QA(A,e,t){let o=B(o0,t);if(!e||!A||!(A instanceof HTMLCanvasElement))return;let s=A.getContext("2d");if(!!s){s.lineJoin="round",s.font=o.font;for(let r of e){if(o.drawBoxes){s.strokeStyle=o.color,s.fillStyle=o.color;let n;if(!o.calculateHandBox)n=o.useRawBoxes?r.boxRaw:r.box;else if(n=[Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER,0,0],r.landmarks&&r.landmarks.length>0){for(let a of r.landmarks)a[0]n[2]&&(n[2]=a[0]),a[1]>n[3]&&(n[3]=a[1]);n[2]-=n[0],n[3]-=n[1]}o.useRawBoxes?s0(s,A.width*n[0],A.height*n[1],A.width*n[2],A.height*n[3],o):s0(s,n[0],n[1],n[2],n[3],o),o.drawLabels&&(o.shadowColor&&o.shadowColor!==""&&(s.fillStyle=o.shadowColor,s.fillText("hand",n[0]+3,1+n[1]+o.lineHeight,n[2])),s.fillStyle=o.labelColor,s.fillText("hand",n[0]+2,0+n[1]+o.lineHeight,n[2])),s.stroke()}if(o.drawPoints&&r.landmarks&&r.landmarks.length>0)for(let n of r.landmarks)s.fillStyle=o.useDepth?`rgba(${127.5+2*n[2]}, ${127.5-2*n[2]}, 255, 0.5)`:o.color,q0(s,n[0],n[1],0,o);if(o.drawLabels){let n=(a,x)=>{s.fillStyle=o.useDepth?`rgba(${127.5+2*a[a.length-1][2]}, ${127.5-2*a[a.length-1][2]}, 255, 0.5)`:o.color,s.fillText(x,a[a.length-1][0]+4,a[a.length-1][1]+4)};s.font=o.font,n(r.annotations.indexFinger,"index"),n(r.annotations.middleFinger,"middle"),n(r.annotations.ringFinger,"ring"),n(r.annotations.pinky,"pinky"),n(r.annotations.thumb,"thumb"),n(r.annotations.palmBase,"palm")}if(o.drawPolygons){let n=a=>{if(!!a)for(let x=0;x0?x-1:0][0],a[x>0?x-1:0][1]),s.lineTo(a[x][0],a[x][1]),s.stroke()};s.lineWidth=o.lineWidth,n(r.annotations.indexFinger),n(r.annotations.middleFinger),n(r.annotations.ringFinger),n(r.annotations.pinky),n(r.annotations.thumb)}}}}async function _A(A,e,t){let o=B(o0,t);if(!e||!A||!(A instanceof HTMLCanvasElement))return;let s=A.getContext("2d");if(!!s){s.lineJoin="round",s.font=o.font;for(let r of e)if(o.drawBoxes){if(s.strokeStyle=o.color,s.fillStyle=o.color,o.useRawBoxes?s0(s,A.width*r.boxRaw[0],A.height*r.boxRaw[1],A.width*r.boxRaw[2],A.height*r.boxRaw[3],o):s0(s,r.box[0],r.box[1],r.box[2],r.box[3],o),o.drawLabels){let n=`${Math.round(100*r.score)}% ${r.label}`;o.shadowColor&&o.shadowColor!==""&&(s.fillStyle=o.shadowColor,s.fillText(n,r.box[0]+3,1+r.box[1]+o.lineHeight,r.box[2])),s.fillStyle=o.labelColor,s.fillText(n,r.box[0]+2,0+r.box[1]+o.lineHeight,r.box[2])}s.stroke()}}}async function O2(A,e){if(!A||!e||!(A instanceof HTMLCanvasElement)||!(e instanceof HTMLCanvasElement))return;let t=A.getContext("2d");t==null||t.drawImage(A,0,0)}async function Z2(A,e,t){let o=B(o0,t);!e||!A||A instanceof HTMLCanvasElement&&(DA(A,e.face,o),GA(A,e.body,o),QA(A,e.hand,o),KA(A,e.gesture,o),_A(A,e.object,o))}var B0=` +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all2) => { + 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: "../node_modules/@tensorflow/tfjs-backend-wasm/dist//", + debug: true, + async: true, + warmup: "full", + cacheSensitivity: 0.01, + 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: false, + maxDetected: 10, + skipFrames: 21, + 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: 31, + minConfidence: 0.1 + }, + emotion: { + enabled: true, + minConfidence: 0.1, + skipFrames: 32, + modelPath: "emotion.json" + } + }, + body: { + enabled: true, + modelPath: "posenet.json", + maxDetected: 1, + minConfidence: 0.1 + }, + hand: { + enabled: true, + rotation: false, + skipFrames: 32, + minConfidence: 0.1, + iouThreshold: 0.1, + maxDetected: 2, + 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: 41 + } +}; + +// 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].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 * as packageBundle from "@tensorflow/tfjs/package.json"; +import * as packageCore from "@tensorflow/tfjs-core/package.json"; +import * as packageData from "@tensorflow/tfjs-data/package.json"; +import * as packageLayers from "@tensorflow/tfjs-layers/package.json"; +import * as packageConverter from "@tensorflow/tfjs-converter/package.json"; +import { version_cpu } from "@tensorflow/tfjs-backend-cpu/dist/index.js"; +import { version_webgl } from "@tensorflow/tfjs-backend-webgl/dist/index.js"; +import { version_wasm } from "@tensorflow/tfjs-backend-wasm/dist/index.js"; +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: (packageBundle == null ? void 0 : packageBundle.version) || void 0, + "tfjs-core": (packageCore == null ? void 0 : packageCore.version) || void 0, + "tfjs-data": (packageData == null ? void 0 : packageData.version) || void 0, + "tfjs-layers": (packageLayers == null ? void 0 : packageLayers.version) || void 0, + "tfjs-converter": (packageConverter == null ? void 0 : packageConverter.version) || void 0, + "tfjs-backend-cpu": version_cpu || void 0, + "tfjs-backend-webgl": version_webgl || void 0, + "tfjs-backend-wasm": version_wasm || void 0 +}; + +// src/tfjs/backend.ts +var config2 = { + name: "humangl", + priority: 99, + canvas: null, + gl: null, + width: 1024, + height: 1024, + webGLattr: { + alpha: false, + antialias: false, + premultipliedAlpha: false, + preserveDrawingBuffer: false, + depth: false, + stencil: false, + failIfMajorPerformanceCaveat: false, + desynchronized: true + } +}; +function register() { + if (!tfjs_esm_exports.findBackend(config2.name)) { + log("backend registration:", 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; + } + log("backend registered:", config2.name); + } +} + +// src/blazeface/facemesh.ts +var facemesh_exports = {}; +__export(facemesh_exports, { + load: () => load2, + predict: () => predict, + triangulation: () => triangulation, + uvmap: () => uvmap +}); + +// src/blazeface/box.ts +function scaleBoxCoordinates(box4, factor) { + const startPoint = [box4.startPoint[0] * factor[0], box4.startPoint[1] * factor[1]]; + const endPoint = [box4.endPoint[0] * factor[0], box4.endPoint[1] * factor[1]]; + return { startPoint, endPoint }; +} +function getBoxSize(box4) { + return [ + Math.abs(box4.endPoint[0] - box4.startPoint[0]), + Math.abs(box4.endPoint[1] - box4.startPoint[1]) + ]; +} +function getBoxCenter(box4) { + return [ + box4.startPoint[0] + (box4.endPoint[0] - box4.startPoint[0]) / 2, + box4.startPoint[1] + (box4.endPoint[1] - box4.startPoint[1]) / 2 + ]; +} +function cutBoxFromImageAndResize(box4, image13, cropSize) { + const h = image13.shape[1]; + const w = image13.shape[2]; + const boxes = [[ + box4.startPoint[1] / h, + box4.startPoint[0] / w, + box4.endPoint[1] / h, + box4.endPoint[0] / w + ]]; + return tfjs_esm_exports.image.cropAndResize(image13, boxes, [0], cropSize); +} +function enlargeBox(box4, factor = 1.5) { + const center = getBoxCenter(box4); + const size = getBoxSize(box4); + 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: box4.landmarks }; +} +function squarifyBox(box4) { + const centers = getBoxCenter(box4); + const size = getBoxSize(box4); + 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: box4.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(model7, config3) { + this.model = model7; + this.anchorsData = generateAnchors(model7.inputs[0].shape[1]); + this.anchors = tfjs_esm_exports.tensor2d(this.anchorsData); + this.inputSize = model7.inputs[0].shape[2]; + this.config = config3; + } + async getBoundingBoxes(inputImage) { + 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 = inputImage.resizeBilinear([this.inputSize, this.inputSize]); + const normalizedImage = resizedImage.div(127.5).sub(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 = concat3.squeeze(0); + } else { + batchOut = res.squeeze(); + } + 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.sigmoid(logits).squeeze().dataSync(); + return [batchOut, boxesOut, scoresOut]; + }); + 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 = nmsTensor.arraySync(); + nmsTensor.dispose(); + const annotatedBoxes = []; + for (let i = 0; i < nms.length; i++) { + const confidence = scores[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); + boundingBox.dispose(); + const anchor = this.anchorsData[nms[i]]; + const landmarks = tfjs_esm_exports.tidy(() => tfjs_esm_exports.slice(batch, [nms[i], keypointsCount - 1], [1, -1]).squeeze().reshape([keypointsCount, -1])); + annotatedBoxes.push({ box: localBox, landmarks, anchor, confidence }); + } + } + batch.dispose(); + boxes.dispose(); + return { + boxes: annotatedBoxes, + scaleFactor: [inputImage.shape[2] / this.inputSize, inputImage.shape[1] / this.inputSize] + }; + } +}; +async function load(config3) { + const model7 = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.face.detector.modelPath), { fromTFHub: config3.face.detector.modelPath.includes("tfhub.dev") }); + const blazeFace = new BlazeFaceModel(model7, config3); + if (!model7 || !model7.modelUrl) + log("load model failed:", config3.face.detector.modelPath); + else if (config3.debug) + log("load model:", model7.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, box4, angle, rotationMatrix) { + const boxSize = getBoxSize({ startPoint: box4.startPoint, endPoint: box4.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: box4.startPoint, endPoint: box4.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 box4 = squarifyBox(enlargeBox(calculateLandmarksBoundingBox([rawCoords[eyeInnerCornerIndex], rawCoords[eyeOuterCornerIndex]]), this.irisEnlarge)); + const boxSize = getBoxSize(box4); + let crop = tfjs_esm_exports.image.cropAndResize(face5, [[ + box4.startPoint[1] / this.meshSize, + box4.startPoint[0] / this.meshSize, + box4.endPoint[1] / this.meshSize, + box4.endPoint[0] / this.meshSize + ]], [0], [this.irisSize, this.irisSize]); + if (flip && tfjs_esm_exports.ENV.flags.IS_BROWSER) { + crop = tfjs_esm_exports.image.flipLeftRight(crop); + } + return { box: box4, 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]; + }); + } + 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); + 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) { + this.storedBoxes.push({ startPoint: possible.box.startPoint.dataSync(), endPoint: possible.box.endPoint.dataSync(), landmarks: possible.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.arraySync(); + const confidence = this.storedBoxes[i].confidence; + this.storedBoxes[i] = { ...squarifiedBox, confidence, landmarks }; + } + } + if (detector && detector.boxes) { + detector.boxes.forEach((prediction) => { + prediction.box.startPoint.dispose(); + prediction.box.endPoint.dispose(); + prediction.landmarks.dispose(); + }); + } + const results = tfjs_esm_exports.tidy(() => this.storedBoxes.map((box4, i) => { + let face5; + let angle = 0; + let rotationMatrix; + if (config3.face.detector.rotation && config3.face.mesh.enabled && tfjs_esm_exports.ENV.flags.IS_BROWSER) { + const [indexOfMouth, indexOfForehead] = box4.landmarks.length >= meshLandmarks.count ? meshLandmarks.symmetryLine : blazeFaceLandmarks.symmetryLine; + angle = computeRotation(box4.landmarks[indexOfMouth], box4.landmarks[indexOfForehead]); + const faceCenter = getBoxCenter({ startPoint: box4.startPoint, endPoint: box4.endPoint }); + const faceCenterNormalized = [faceCenter[0] / input.shape[2], faceCenter[1] / input.shape[1]]; + const rotatedImage = tfjs_esm_exports.image.rotateWithOffset(input, angle, 0, faceCenterNormalized); + rotationMatrix = buildRotationMatrix(-angle, faceCenter); + if (config3.face.mesh.enabled) + face5 = cutBoxFromImageAndResize({ startPoint: box4.startPoint, endPoint: box4.endPoint }, rotatedImage, [this.meshSize, this.meshSize]).div(255); + else + face5 = cutBoxFromImageAndResize({ startPoint: box4.startPoint, endPoint: box4.endPoint }, rotatedImage, [this.boxSize, this.boxSize]).div(255); + } else { + rotationMatrix = IDENTITY_MATRIX; + const clonedImage = input.clone(); + if (config3.face.mesh.enabled) + face5 = cutBoxFromImageAndResize({ startPoint: box4.startPoint, endPoint: box4.endPoint }, clonedImage, [this.meshSize, this.meshSize]).div(255); + else + face5 = cutBoxFromImageAndResize({ startPoint: box4.startPoint, endPoint: box4.endPoint }, clonedImage, [this.boxSize, this.boxSize]).div(255); + } + if (!config3.face.mesh.enabled) { + const prediction2 = { + mesh: [], + box: box4, + faceConfidence: null, + boxConfidence: box4.confidence, + confidence: box4.confidence, + image: face5 + }; + return prediction2; + } + const [, confidence, contourCoords] = this.meshDetector.execute(face5); + const faceConfidence = confidence.dataSync()[0]; + if (faceConfidence < config3.face.detector.minConfidence) { + this.storedBoxes[i].confidence = faceConfidence; + return null; + } + const coordsReshaped = tfjs_esm_exports.reshape(contourCoords, [-1, 3]); + let rawCoords = coordsReshaped.arraySync(); + if (config3.face.iris.enabled) { + 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 eyePredictions = this.irisModel.predict(tfjs_esm_exports.concat([leftEyeCrop, rightEyeCrop])); + const eyePredictionsData = eyePredictions.dataSync(); + 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"); + rawCoords = rawCoords.concat(adjustedLeftIrisCoords).concat(adjustedRightIrisCoords); + } + const mesh = this.transformRawCoords(rawCoords, box4, angle, rotationMatrix); + const storeConfidence = box4.confidence; + box4 = enlargeBox(calculateLandmarksBoundingBox(mesh), 1.5); + box4.confidence = storeConfidence; + if (config3.face.detector.rotation && config3.face.mesh.enabled && config3.face.description.enabled && tfjs_esm_exports.ENV.flags.IS_BROWSER) { + const [indexOfMouth, indexOfForehead] = box4.landmarks.length >= meshLandmarks.count ? meshLandmarks.symmetryLine : blazeFaceLandmarks.symmetryLine; + angle = computeRotation(box4.landmarks[indexOfMouth], box4.landmarks[indexOfForehead]); + const faceCenter = getBoxCenter({ startPoint: box4.startPoint, endPoint: box4.endPoint }); + const faceCenterNormalized = [faceCenter[0] / input.shape[2], faceCenter[1] / input.shape[1]]; + const rotatedImage = tfjs_esm_exports.image.rotateWithOffset(input.toFloat(), angle, 0, faceCenterNormalized); + rotationMatrix = buildRotationMatrix(-angle, faceCenter); + face5 = cutBoxFromImageAndResize({ startPoint: box4.startPoint, endPoint: box4.endPoint }, rotatedImage, [this.meshSize, this.meshSize]).div(255); + } + const prediction = { + mesh, + box: box4, + faceConfidence, + boxConfidence: box4.confidence, + image: face5 + }; + const storedBox = squarifyBox(box4); + storedBox.confidence = box4.confidence; + storedBox.faceConfidence = faceConfidence; + this.storedBoxes[i] = storedBox; + return prediction; + })); + if (config3.face.mesh.enabled) + this.storedBoxes = this.storedBoxes.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 = []; + for (const prediction of predictions || []) { + if (!prediction || prediction.isDisposedInternal) + continue; + const meshRaw = prediction.mesh.map((pt) => [ + pt[0] / input.shape[2], + pt[1] / input.shape[1], + 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.max(0, prediction.box.startPoint[0]), + Math.max(0, prediction.box.startPoint[1]), + Math.min(input.shape[2], prediction.box.endPoint[0]) - Math.max(0, prediction.box.startPoint[0]), + Math.min(input.shape[1], prediction.box.endPoint[1]) - Math.max(0, prediction.box.startPoint[1]) + ] : 0; + const boxRaw = prediction.box ? [ + prediction.box.startPoint[0] / input.shape[2], + prediction.box.startPoint[1] / input.shape[1], + (prediction.box.endPoint[0] - prediction.box.startPoint[0]) / input.shape[2], + (prediction.box.endPoint[1] - prediction.box.startPoint[1]) / input.shape[1] + ] : []; + results.push({ + confidence: Math.round(100 * prediction.faceConfidence || 100 * prediction.boxConfidence || 0) / 100, + boxConfidence: Math.round(100 * prediction.boxConfidence) / 100, + faceConfidence: Math.round(100 * prediction.faceConfidence) / 100, + box: clampedBox, + boxRaw, + mesh: prediction.mesh, + meshRaw, + annotations: annotations3, + image: prediction.image + }); + if (prediction.coords) + prediction.coords.dispose(); + } + 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[1].modelUrl) + log("load model failed:", config3.face.iris.modelPath); + else if (config3.debug) + log("load model:", faceModels[2].modelUrl); + } + } else if (config3.debug) { + log("cached model:", faceModels[0].model.modelUrl); + log("cached model:", faceModels[1].modelUrl); + log("cached model:", faceModels[2].modelUrl); + } + facePipeline = new Pipeline(faceModels[0], faceModels[1], faceModels[2]); + return faceModels; +} +var triangulation = TRI468; +var uvmap = UV468; + +// src/emotion/emotion.ts +var emotion_exports = {}; +__export(emotion_exports, { + load: () => load3, + predict: () => predict2 +}); +var annotations = ["angry", "disgust", "fear", "happy", "sad", "surprise", "neutral"]; +var model; +var last = []; +var lastCount = 0; +var skipped = Number.MAX_SAFE_INTEGER; +var rgb = [0.2989, 0.587, 0.114]; +async function load3(config3) { + if (!model) { + model = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.face.emotion.modelPath)); + if (!model || !model.modelUrl) + log("load model failed:", config3.face.emotion.modelPath); + else if (config3.debug) + log("load model:", model.modelUrl); + } else if (config3.debug) + log("cached model:", model.modelUrl); + return model; +} +async function predict2(image13, config3, idx, count2) { + if (!model) + return null; + if (skipped < config3.face.emotion.skipFrames && config3.skipFrame && lastCount === count2 && last[idx] && last[idx].length > 0) { + skipped++; + return last[idx]; + } + skipped = 0; + return new Promise(async (resolve) => { + const resize = tfjs_esm_exports.image.resizeBilinear(image13, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false); + const [red, green, blue] = tfjs_esm_exports.split(resize, 3, 3); + resize.dispose(); + 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]); + red.dispose(); + green.dispose(); + blue.dispose(); + const grayscale = tfjs_esm_exports.addN([redNorm, greenNorm, blueNorm]); + redNorm.dispose(); + greenNorm.dispose(); + blueNorm.dispose(); + const normalize = tfjs_esm_exports.tidy(() => grayscale.sub(0.5).mul(2)); + grayscale.dispose(); + const obj = []; + if (config3.face.emotion.enabled) { + const emotionT = await model.predict(normalize); + const data2 = emotionT.dataSync(); + 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); + } + normalize.dispose(); + last[idx] = obj; + lastCount = count2; + resolve(obj); + }); +} + +// src/faceres/faceres.ts +var faceres_exports = {}; +__export(faceres_exports, { + enhance: () => enhance, + load: () => load4, + match: () => match, + predict: () => predict3, + similarity: () => similarity +}); +var model2; +var last2 = []; +var lastCount2 = 0; +var skipped2 = Number.MAX_SAFE_INTEGER; +async function load4(config3) { + if (!model2) { + model2 = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.face.description.modelPath)); + if (!model2 || !model2.modelUrl) + log("load model failed:", config3.face.description.modelPath); + else if (config3.debug) + log("load model:", model2.modelUrl); + } else if (config3.debug) + log("cached model:", model2.modelUrl); + return model2; +} +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 image13 = tfjs_esm_exports.tidy(() => { + const tensor = input.image || input.tensor || input; + if (!(tensor instanceof tfjs_esm_exports.Tensor)) + return null; + const box4 = [[0.05, 0.15, 0.85, 0.85]]; + const crop = tensor.shape.length === 3 ? tfjs_esm_exports.image.cropAndResize(tfjs_esm_exports.expandDims(tensor, 0), box4, [0], [model2.inputs[0].shape[2], model2.inputs[0].shape[1]]) : tfjs_esm_exports.image.cropAndResize(tensor, box4, [0], [model2.inputs[0].shape[2], model2.inputs[0].shape[1]]); + const norm = crop.mul(255); + return norm; + }); + return image13; +} +async function predict3(image13, config3, idx, count2) { + var _a, _b; + if (!model2) + return null; + if (skipped2 < config3.face.description.skipFrames && config3.skipFrame && lastCount2 === count2 && ((_a = last2[idx]) == null ? void 0 : _a.age) && ((_b = last2[idx]) == null ? void 0 : _b.age) > 0) { + skipped2++; + return last2; + } + skipped2 = 0; + return new Promise(async (resolve) => { + const enhanced = enhance(image13); + let resT; + const obj = { + age: 0, + gender: "unknown", + genderConfidence: 0, + descriptor: [] + }; + if (config3.face.description.enabled) + resT = await model2.predict(enhanced); + tfjs_esm_exports.dispose(enhanced); + if (resT) { + tfjs_esm_exports.tidy(() => { + const gender = resT.find((t) => t.shape[1] === 1).dataSync(); + 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.genderConfidence = Math.min(0.99, confidence); + } + const age = resT.find((t) => t.shape[1] === 100).argMax(1).dataSync()[0]; + const all2 = resT.find((t) => t.shape[1] === 100).dataSync(); + 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); + obj.descriptor = [...desc.dataSync()]; + }); + resT.forEach((t) => tfjs_esm_exports.dispose(t)); + } + last2[idx] = obj; + lastCount2 = count2; + resolve(obj); + }); +} + +// src/face.ts +var calculateFaceAngle = (face5, image_size) => { + const degrees = (theta) => theta * 180 / Math.PI; + 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; + } + 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] }; + const size = Math.max(face5.boxRaw[2] * image_size[0], face5.boxRaw[3] * image_size[1]) / 1.5; + const pts = [mesh[10], mesh[152], mesh[234], mesh[454]].map((pt) => [ + pt[0] * image_size[0] / size, + pt[1] * image_size[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); + return { angle, matrix }; +}; +var detectFace = async (parent, input) => { + var _a, _b, _c, _d, _e, _f, _g, _h; + let timeStamp; + let ageRes; + let genderRes; + let emotionRes; + let embeddingRes; + let descRes; + const faceRes = []; + parent.state = "run:face"; + timeStamp = now(); + const faces = await predict(input, parent.config); + parent.perf.face = Math.trunc(now() - timeStamp); + if (!faces) + return []; + for (let i = 0; i < faces.length; i++) { + parent.analyze("Get Face"); + if (!faces[i].image || faces[i].image.isDisposedInternal) { + log("Face object is disposed:", faces[i].image); + 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 ? predict2(faces[i].image, parent.config, i, faces.length) : {}; + } else { + parent.state = "run:emotion"; + timeStamp = now(); + emotionRes = parent.config.face.emotion.enabled ? await predict2(faces[i].image, parent.config, i, faces.length) : {}; + parent.perf.emotion = Math.trunc(now() - timeStamp); + } + parent.analyze("End Emotion:"); + parent.analyze("Start Description:"); + if (parent.config.async) { + descRes = parent.config.face.description.enabled ? predict3(faces[i], parent.config, i, faces.length) : []; + } else { + parent.state = "run:description"; + timeStamp = now(); + descRes = parent.config.face.description.enabled ? await predict3(faces[i].image, parent.config, i, faces.length) : []; + parent.perf.embedding = Math.trunc(now() - timeStamp); + } + parent.analyze("End Description:"); + if (parent.config.async) { + [ageRes, genderRes, emotionRes, embeddingRes, descRes] = await Promise.all([ageRes, genderRes, emotionRes, embeddingRes, descRes]); + } + 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) ? 11.7 * 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])) : 0; + faceRes.push({ + id: i, + ...faces[i], + age: descRes.age, + gender: descRes.gender, + genderConfidence: descRes.genderConfidence, + embedding: descRes.descriptor, + emotion: emotionRes, + iris: irisSize !== 0 ? Math.trunc(irisSize) / 100 : 0, + rotation, + tensor: parent.config.face.detector.return ? (_g = faces[i].image) == null ? void 0 : _g.squeeze() : null + }); + (_h = faces[i].image) == null ? void 0 : _h.dispose(); + parent.analyze("End Face"); + } + parent.analyze("End FaceMesh:"); + if (parent.config.async) { + if (parent.perf.face) + delete parent.perf.face; + if (parent.perf.age) + delete parent.perf.age; + if (parent.perf.gender) + delete parent.perf.gender; + if (parent.perf.emotion) + delete parent.perf.emotion; + } + return faceRes; +}; + +// src/posenet/posenet.ts +var posenet_exports = {}; +__export(posenet_exports, { + load: () => load5, + predict: () => predict4 +}); + +// 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(keypoints) { + const coord = keypoints.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) => ({ + score: pose.score, + bowRaw: [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, part, position }) => ({ + score, + part, + position: { x: Math.trunc(position.x * scaleX), y: Math.trunc(position.y * scaleY) } + })) + }); + const scaledPoses = poses2.map((pose) => scalePose(pose)); + 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 max = this.priorityQueue[0]; + this.exchange(0, this.numberOfElements--); + this.sink(0); + this.priorityQueue[this.numberOfElements + 1] = null; + return max; + } + 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, max) { + if (a < min) + return min; + if (a > max) + return max; + 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 score = scores.get(targetKeyPointIndices.y, targetKeyPointIndices.x, targetId); + return { position: targetKeypoint, part: partNames[targetId], score }; +} +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 keypoints = new Array(numParts); + const rootPoint = getImageCoords(root.part, outputStride, offsets); + keypoints[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 (keypoints[sourceId] && !keypoints[targetId]) { + keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsBwd); + } + } + for (let edge = 0; edge < numEdges; ++edge) { + const sourceId = edgesBwd[edge]; + const targetId = edgesFwd[edge]; + if (keypoints[sourceId] && !keypoints[targetId]) { + keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsFwd); + } + } + return keypoints; +} +function scoreIsMaximumInLocalWindow(keypointId, score, 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) > score) { + localMaximum = false; + break; + } + } + if (!localMaximum) + break; + } + return localMaximum; +} +function buildPartWithScoreQueue(minConfidence, scores) { + const [height, width, numKeypoints] = scores.shape; + const queue = new MaxHeap(height * width * numKeypoints, ({ score }) => score); + for (let heatmapY = 0; heatmapY < height; ++heatmapY) { + for (let heatmapX = 0; heatmapX < width; ++heatmapX) { + for (let keypointId = 0; keypointId < numKeypoints; ++keypointId) { + const score = scores.get(heatmapY, heatmapX, keypointId); + if (score < minConfidence) + continue; + if (scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores)) + queue.enqueue({ score, part: { heatmapY, heatmapX, id: keypointId } }); + } + } + } + return queue; +} +function withinRadius(poses2, { x, y }, keypointId) { + return poses2.some(({ keypoints }) => { + var _a; + const correspondingKeypoint = (_a = keypoints[keypointId]) == null ? void 0 : _a.position; + if (!correspondingKeypoint) + return false; + return squaredDistance(y, x, correspondingKeypoint.y, correspondingKeypoint.x) <= squaredNmsRadius; + }); +} +function getInstanceScore(existingPoses, keypoints) { + const notOverlappedKeypointScores = keypoints.reduce((result, { position, score }, keypointId) => { + if (!withinRadius(existingPoses, position, keypointId)) + result += score; + return result; + }, 0); + return notOverlappedKeypointScores / keypoints.length; +} +function decode(offsets, scores, displacementsFwd, displacementsBwd, maxDetected, minConfidence) { + const poses2 = []; + const queue = buildPartWithScoreQueue(minConfidence, 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 keypoints = decodePose(root, scores, offsets, displacementsFwd, displacementsBwd); + keypoints = keypoints.filter((a) => a.score > minConfidence); + const score = getInstanceScore(poses2, keypoints); + const box4 = getBoundingBox(keypoints); + if (score > minConfidence) + poses2.push({ keypoints, box: box4, score: Math.round(100 * score) / 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(() => { + const resized = input.resizeBilinear([model3.inputs[0].shape[2], model3.inputs[0].shape[1]]); + const normalized = resized.toFloat().div(127.5).sub(1); + const results = model3.execute(normalized, poseNetOutputs); + const results3d = results.map((y) => y.squeeze([0])); + results3d[1] = results3d[1].sigmoid(); + return results3d; + }); + const buffers = await Promise.all(res.map((tensor) => tensor.buffer())); + for (const t of res) + t.dispose(); + const decoded = await decode(buffers[0], buffers[1], buffers[2], buffers[3], config3.body.maxDetected, config3.body.minConfidence); + 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/handpose.ts +var handpose_exports = {}; +__export(handpose_exports, { + load: () => load6, + predict: () => predict5 +}); + +// src/handpose/box.ts +function getBoxSize2(box4) { + return [ + Math.abs(box4.endPoint[0] - box4.startPoint[0]), + Math.abs(box4.endPoint[1] - box4.startPoint[1]) + ]; +} +function getBoxCenter2(box4) { + return [ + box4.startPoint[0] + (box4.endPoint[0] - box4.startPoint[0]) / 2, + box4.startPoint[1] + (box4.endPoint[1] - box4.startPoint[1]) / 2 + ]; +} +function cutBoxFromImageAndResize2(box4, image13, cropSize) { + const h = image13.shape[1]; + const w = image13.shape[2]; + const boxes = [[ + box4.startPoint[1] / h, + box4.startPoint[0] / w, + box4.endPoint[1] / h, + box4.endPoint[0] / w + ]]; + return tfjs_esm_exports.image.cropAndResize(image13, boxes, [0], cropSize); +} +function scaleBoxCoordinates2(box4, factor) { + const startPoint = [box4.startPoint[0] * factor[0], box4.startPoint[1] * factor[1]]; + const endPoint = [box4.endPoint[0] * factor[0], box4.endPoint[1] * factor[1]]; + const palmLandmarks = box4.palmLandmarks.map((coord) => { + const scaledCoord = [coord[0] * factor[0], coord[1] * factor[1]]; + return scaledCoord; + }); + return { startPoint, endPoint, palmLandmarks, confidence: box4.confidence }; +} +function enlargeBox2(box4, factor = 1.5) { + const center = getBoxCenter2(box4); + const size = getBoxSize2(box4); + 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: box4.palmLandmarks }; +} +function squarifyBox2(box4) { + const centers = getBoxCenter2(box4); + const size = getBoxSize2(box4); + 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: box4.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(model7) { + var _a; + this.model = model7; + this.anchors = anchors.map((anchor) => [anchor.x, anchor.y]); + this.anchorsTensor = tfjs_esm_exports.tensor2d(this.anchors); + this.inputSize = (_a = this.model) == null ? void 0 : _a.inputs[0].shape[2]; + 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(rawPalmLandmarks.reshape([-1, 7, 2]), this.inputSizeTensor), this.anchors[index]); + return tfjs_esm_exports.mul(landmarks, this.inputSizeTensor); + }); + } + async getBoxes(input, config3) { + const batched = this.model.predict(input); + const predictions = batched.squeeze(); + batched.dispose(); + const scoresT = tfjs_esm_exports.tidy(() => tfjs_esm_exports.sigmoid(tfjs_esm_exports.slice(predictions, [0, 0], [-1, 1])).squeeze()); + const scores = scoresT.dataSync(); + const rawBoxes = tfjs_esm_exports.slice(predictions, [0, 1], [-1, 4]); + const boxes = this.normalizeBoxes(rawBoxes); + rawBoxes.dispose(); + const filteredT = await tfjs_esm_exports.image.nonMaxSuppressionAsync(boxes, scores, config3.hand.maxDetected, config3.hand.iouThreshold, config3.hand.minConfidence); + const filtered = filteredT.arraySync(); + scoresT.dispose(); + filteredT.dispose(); + const hands = []; + for (const index of filtered) { + if (scores[index] >= config3.hand.minConfidence) { + const matchingBox = tfjs_esm_exports.slice(boxes, [index, 0], [1, -1]); + const rawPalmLandmarks = tfjs_esm_exports.slice(predictions, [index, 5], [1, 14]); + const palmLandmarks = tfjs_esm_exports.tidy(() => this.normalizeLandmarks(rawPalmLandmarks, index).reshape([-1, 2])); + rawPalmLandmarks.dispose(); + hands.push({ box: matchingBox, palmLandmarks, confidence: scores[index] }); + } + } + predictions.dispose(); + boxes.dispose(); + return hands; + } + async estimateHandBounds(input, config3) { + const inputHeight = input.shape[1]; + const inputWidth = input.shape[2]; + const image13 = tfjs_esm_exports.tidy(() => input.resizeBilinear([this.inputSize, this.inputSize]).div(127.5).sub(1)); + const predictions = await this.getBoxes(image13, config3); + image13.dispose(); + const hands = []; + if (!predictions || predictions.length === 0) + return hands; + for (const prediction of predictions) { + const boxes = prediction.box.dataSync(); + const startPoint = boxes.slice(0, 2); + const endPoint = boxes.slice(2, 4); + const palmLandmarks = prediction.palmLandmarks.arraySync(); + prediction.box.dispose(); + prediction.palmLandmarks.dispose(); + 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, landmarkDetector) { + var _a; + this.handDetector = handDetector; + this.landmarkDetector = landmarkDetector; + this.inputSize = (_a = this.landmarkDetector) == 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) => [ + coord[0] + originalBoxCenter[0], + coord[1] + originalBoxCenter[1], + coord[2] + ]); + } + async estimateHands(image13, 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(image13, 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] / image13.shape[2], palmCenter[1] / image13.shape[1]]; + const rotatedImage = config3.hand.rotation ? tfjs_esm_exports.image.rotateWithOffset(image13, angle, 0, palmCenterNormalized) : image13.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 = croppedInput.div(255); + croppedInput.dispose(); + rotatedImage.dispose(); + const [confidenceT, keypoints] = await this.landmarkDetector.predict(handImage); + handImage.dispose(); + const confidence = confidenceT.dataSync()[0]; + confidenceT.dispose(); + if (confidence >= config3.hand.minConfidence) { + const keypointsReshaped = tfjs_esm_exports.reshape(keypoints, [-1, 3]); + const rawCoords = keypointsReshaped.arraySync(); + keypoints.dispose(); + keypointsReshaped.dispose(); + const coords3 = this.transformRawCoords(rawCoords, newBox, angle, rotationMatrix); + const nextBoundingBox = this.getBoxForHandLandmarks(coords3); + this.storedBoxes[i] = nextBoundingBox; + const result = { + landmarks: coords3, + confidence, + box: { topLeft: nextBoundingBox.startPoint, bottomRight: nextBoundingBox.endPoint } + }; + hands.push(result); + } else { + this.storedBoxes[i] = null; + } + keypoints.dispose(); + } 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/handpose/handpose.ts +var meshAnnotations = { + thumb: [1, 2, 3, 4], + indexFinger: [5, 6, 7, 8], + middleFinger: [9, 10, 11, 12], + ringFinger: [13, 14, 15, 16], + pinky: [17, 18, 19, 20], + palmBase: [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 box4 = predictions[i].box ? [ + Math.max(0, predictions[i].box.topLeft[0]), + Math.max(0, predictions[i].box.topLeft[1]), + Math.min(input.shape[2], predictions[i].box.bottomRight[0]) - Math.max(0, predictions[i].box.topLeft[0]), + Math.min(input.shape[1], predictions[i].box.bottomRight[1]) - Math.max(0, predictions[i].box.topLeft[1]) + ] : [0, 0, 0, 0]; + const boxRaw = [ + predictions[i].box.topLeft[0] / input.shape[2], + predictions[i].box.topLeft[1] / input.shape[1], + (predictions[i].box.bottomRight[0] - predictions[i].box.topLeft[0]) / input.shape[2], + (predictions[i].box.bottomRight[1] - predictions[i].box.topLeft[1]) / input.shape[1] + ]; + hands.push({ id: i, confidence: Math.round(100 * predictions[i].confidence) / 100, box: box4, boxRaw, landmarks: predictions[i].landmarks, annotations: annotations3 }); + } + 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/blazepose.ts +var blazepose_exports = {}; +__export(blazepose_exports, { + load: () => load7, + predict: () => predict6 +}); + +// 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(image13, config3) { + if (!model4) + return null; + if (!config3.body.enabled) + return null; + const imgSize = { width: image13.shape[2], height: image13.shape[1] }; + const resize = tfjs_esm_exports.image.resizeBilinear(image13, [model4.width, model4.height], false); + const normalize = tfjs_esm_exports.div(resize, [255]); + resize.dispose(); + const resT = await model4.predict(normalize); + const points = resT.find((t) => t.size === 195 || t.size === 155).dataSync(); + resT.forEach((t) => t.dispose()); + normalize.dispose(); + const keypoints = []; + const labels2 = points.length === 195 ? full : upper; + const depth = 5; + for (let i = 0; i < points.length / depth; i++) { + keypoints.push({ + id: i, + part: labels2[i], + position: { + x: Math.trunc(imgSize.width * points[depth * i + 0] / 255), + y: Math.trunc(imgSize.height * points[depth * i + 1] / 255), + z: Math.trunc(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 score = keypoints.reduce((prev, curr) => curr.score > prev ? curr.score : prev, 0); + return [{ score, keypoints }]; +} + +// src/object/nanodet.ts +var nanodet_exports = {}; +__export(nanodet_exports, { + load: () => load8, + predict: () => predict7 +}); + +// 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 model5; +var last3 = []; +var skipped3 = Number.MAX_SAFE_INTEGER; +var scaleBox = 2.5; +async function load8(config3) { + if (!model5) { + model5 = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.object.modelPath)); + const inputs = Object.values(model5.modelSignature["inputs"]); + model5.inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : null; + if (!model5.inputSize) + throw new Error(`Human: Cannot determine model inputSize: ${config3.object.modelPath}`); + if (!model5 || !model5.modelUrl) + log("load model failed:", config3.object.modelPath); + else if (config3.debug) + log("load model:", model5.modelUrl); + } else if (config3.debug) + log("cached model:", model5.modelUrl); + return model5; +} +async function process2(res, inputSize, outputShape, config3) { + let id = 0; + let results = []; + for (const strideSize of [1, 2, 4]) { + tfjs_esm_exports.tidy(() => { + 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 = boxesMax.argMax(2).arraySync(); + const scores = scoresT.arraySync(); + for (let i = 0; i < scoresT.shape[0]; i++) { + for (let j = 0; j < scoresT.shape[1]; j++) { + const score = scores[i][j]; + if (score > 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 boxRaw = [x, y, w, h]; + boxRaw = boxRaw.map((a) => Math.max(0, Math.min(a, 1))); + const box4 = [ + boxRaw[0] * outputShape[0], + boxRaw[1] * outputShape[1], + boxRaw[2] * outputShape[0], + boxRaw[3] * outputShape[1] + ]; + const result = { + id: id++, + strideSize, + score: Math.round(100 * score) / 100, + class: j + 1, + label: labels[j].label, + center: [Math.trunc(outputShape[0] * cx), Math.trunc(outputShape[1] * cy)], + centerRaw: [cx, cy], + box: box4.map((a) => Math.trunc(a)), + boxRaw + }; + 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 = nms.dataSync(); + tfjs_esm_exports.dispose(nms); + } + results = results.filter((a, idx) => nmsIdx.includes(idx)).sort((a, b) => b.score - a.score); + return results; +} +async function predict7(image13, config3) { + if (skipped3 < config3.object.skipFrames && config3.skipFrame && last3.length > 0) { + skipped3++; + return last3; + } + skipped3 = 0; + return new Promise(async (resolve) => { + const outputSize = [image13.shape[2], image13.shape[1]]; + const resize = tfjs_esm_exports.image.resizeBilinear(image13, [model5.inputSize, model5.inputSize], false); + const norm = resize.div(255); + const transpose = norm.transpose([0, 3, 1, 2]); + norm.dispose(); + resize.dispose(); + let objectT; + if (config3.object.enabled) + objectT = await model5.predict(transpose); + transpose.dispose(); + const obj = await process2(objectT, model5.inputSize, outputSize, config3); + last3 = obj; + resolve(obj); + }); +} + +// src/object/centernet.ts +var centernet_exports = {}; +__export(centernet_exports, { + load: () => load9, + predict: () => predict8 +}); +var model6; +var last4 = []; +var skipped4 = Number.MAX_SAFE_INTEGER; +async function load9(config3) { + if (!model6) { + model6 = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.object.modelPath)); + const inputs = Object.values(model6.modelSignature["inputs"]); + model6.inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : null; + if (!model6.inputSize) + throw new Error(`Human: Cannot determine model inputSize: ${config3.object.modelPath}`); + if (!model6 || !model6.modelUrl) + log("load model failed:", config3.object.modelPath); + else if (config3.debug) + log("load model:", model6.modelUrl); + } else if (config3.debug) + log("cached model:", model6.modelUrl); + return model6; +} +async function process3(res, inputSize, outputShape, config3) { + const results = []; + const detections = res.arraySync(); + const squeezeT = tfjs_esm_exports.squeeze(res); + res.dispose(); + const arr = tfjs_esm_exports.split(squeezeT, 6, 1); + squeezeT.dispose(); + const stackT = tfjs_esm_exports.stack([arr[1], arr[0], arr[3], arr[2]], 1); + const boxesT = stackT.squeeze(); + const scoresT = arr[4].squeeze(); + const classesT = arr[5].squeeze(); + arr.forEach((t) => t.dispose()); + const nmsT = await tfjs_esm_exports.image.nonMaxSuppressionAsync(boxesT, scoresT, config3.object.maxDetected, config3.object.iouThreshold, config3.object.minConfidence); + boxesT.dispose(); + scoresT.dispose(); + classesT.dispose(); + const nms = nmsT.dataSync(); + nmsT.dispose(); + for (const id of nms) { + const score = detections[0][id][4]; + const classVal = detections[0][id][5]; + const label = labels[classVal].label; + const boxRaw = [ + detections[0][id][0] / inputSize, + detections[0][id][1] / inputSize, + detections[0][id][2] / inputSize, + detections[0][id][3] / inputSize + ]; + const box4 = [ + Math.trunc(boxRaw[0] * outputShape[0]), + Math.trunc(boxRaw[1] * outputShape[1]), + Math.trunc(boxRaw[2] * outputShape[0]), + Math.trunc(boxRaw[3] * outputShape[1]) + ]; + results.push({ score, class: classVal, label, box: box4, boxRaw }); + } + return results; +} +async function predict8(image13, config3) { + if (skipped4 < config3.object.skipFrames && config3.skipFrame && last4.length > 0) { + skipped4++; + return last4; + } + skipped4 = 0; + return new Promise(async (resolve) => { + const outputSize = [image13.shape[2], image13.shape[1]]; + const resize = tfjs_esm_exports.image.resizeBilinear(image13, [model6.inputSize, model6.inputSize], false); + let objectT; + if (config3.object.enabled) + objectT = model6.execute(resize, "tower_0/detections"); + resize.dispose(); + const obj = await process3(objectT, model6.inputSize, outputSize, config3); + last4 = obj; + resolve(obj); + }); +} + +// 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].annotations.rightEyeIris[0][0]; + const leftIrisCenterX = Math.abs(res[i].mesh[263][0] - res[i].annotations.leftEyeIris[0][0]) / res[i].annotations.leftEyeIris[0][0]; + if (leftIrisCenterX > 0.033 || rightIrisCenterX > 0.033) + center = false; + if (leftIrisCenterX > 0.033) + gestures.push({ iris: i, gesture: "looking right" }); + if (rightIrisCenterX > 0.033) + gestures.push({ iris: i, gesture: "looking left" }); + const rightIrisCenterY = Math.abs(res[i].mesh[145][1] - res[i].annotations.rightEyeIris[0][1]) / res[i].annotations.rightEyeIris[0][1]; + const leftIrisCenterY = Math.abs(res[i].mesh[374][1] - res[i].annotations.leftEyeIris[0][1]) / res[i].annotations.leftEyeIris[0][1]; + if (leftIrisCenterY < 0.015 || rightIrisCenterY < 0.015 || leftIrisCenterY > 0.03 || rightIrisCenterY > 0.03) + center = false; + if (leftIrisCenterY < 0.015 || rightIrisCenterY < 0.015) + gestures.push({ iris: i, gesture: "looking down" }); + if (leftIrisCenterY > 0.03 || rightIrisCenterY > 0.03) + 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); + const highest = fingers.reduce((best, a) => best.position[1] < a.position[1] ? best : a); + gestures.push({ hand: i, gesture: `${closest.name} forward ${highest.name} up` }); + } + } + return gestures; +}; + +// 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, (match2, name) => { + collection[name] = 0; + return match2; + }); + }; + 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(image13) { + _resize(image13.width, image13.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, image13); + 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 tensor; + 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) + tensor = 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; + 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; + } + 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.fromPixels(outCanvas); + } 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.fromPixels(tempCanvas); + } 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.fromPixels(data2); + } + const casted = pixels.toFloat(); + tensor = casted.expandDims(0); + pixels.dispose(); + casted.dispose(); + } + const canvas2 = config3.filter.return ? outCanvas : null; + return { tensor, canvas: canvas2 }; +} + +// 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: () => options +}); +var options = { + color: "rgba(173, 216, 230, 0.3)", + labelColor: "rgba(173, 216, 230, 1)", + shadowColor: "black", + font: 'small-caps 16px "Segoe UI"', + lineHeight: 24, + lineWidth: 6, + pointSize: 2, + roundRect: 28, + drawPoints: false, + drawLabels: true, + drawBoxes: true, + drawPolygons: true, + fillPolygons: false, + useDepth: true, + useCurves: false, + bufferedOutput: true, + useRawBoxes: false, + calculateHandBox: true +}; +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) { + ctx.strokeStyle = localOptions.useDepth && pt[2] ? `rgba(${127.5 + 2 * pt[2]}, ${127.5 - 2 * pt[2]}, 255, 0.3)` : localOptions.color; + ctx.fillStyle = localOptions.useDepth && pt[2] ? `rgba(${127.5 + 2 * pt[2]}, ${127.5 - 2 * pt[2]}, 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(options, drawOptions); + if (!result || !inCanvas2) + return; + if (!(inCanvas2 instanceof HTMLCanvasElement)) + return; + const ctx = inCanvas2.getContext("2d"); + if (!ctx) + return; + 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 person = where[1] > 0 ? `#${where[1]}` : ""; + const label = `${where[0]} ${person}: ${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) { + const localOptions = mergeDeep(options, drawOptions); + if (!result || !inCanvas2) + return; + if (!(inCanvas2 instanceof HTMLCanvasElement)) + return; + const ctx = inCanvas2.getContext("2d"); + if (!ctx) + return; + for (const f of result) { + ctx.font = localOptions.font; + ctx.strokeStyle = localOptions.color; + ctx.fillStyle = localOptions.color; + if (localOptions.drawBoxes) { + if (localOptions.useRawBoxes) + rect(ctx, inCanvas2.width * f.boxRaw[0], inCanvas2.height * f.boxRaw[1], inCanvas2.width * f.boxRaw[2], inCanvas2.height * f.boxRaw[3], localOptions); + else + rect(ctx, f.box[0], f.box[1], f.box[2], f.box[3], localOptions); + } + const labels2 = []; + labels2.push(`face confidence: ${Math.trunc(100 * f.confidence)}%`); + if (f.genderConfidence) + labels2.push(`${f.gender || ""} ${Math.trunc(100 * f.genderConfidence)}% confident`); + if (f.age) + labels2.push(`age: ${f.age || ""}`); + if (f.iris) + labels2.push(`iris distance: ${f.iris}`); + if (f.emotion && f.emotion.length > 0) { + const emotion2 = f.emotion.map((a) => `${Math.trunc(100 * a.score)}% ${a.emotion}`); + labels2.push(emotion2.join(" ")); + } + if (f.rotation && f.rotation.angle && f.rotation.angle.roll) + labels2.push(`roll: ${Math.trunc(100 * f.rotation.angle.roll) / 100} yaw:${Math.trunc(100 * f.rotation.angle.yaw) / 100} pitch:${Math.trunc(100 * f.rotation.angle.pitch) / 100}`); + 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(); + } + } + } + } + } +} +var lastDrawnPose = []; +async function body2(inCanvas2, result, drawOptions) { + var _a; + const localOptions = mergeDeep(options, drawOptions); + if (!result || !inCanvas2) + return; + if (!(inCanvas2 instanceof HTMLCanvasElement)) + return; + const ctx = inCanvas2.getContext("2d"); + if (!ctx) + return; + ctx.lineJoin = "round"; + for (let i = 0; i < result.length; i++) { + if (!lastDrawnPose[i] && localOptions.bufferedOutput) + lastDrawnPose[i] = { ...result[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.z ? `rgba(${127.5 + 2 * result[i].keypoints[pt].position.z}, ${127.5 - 2 * result[i].keypoints[pt].position.z}, 255, 0.5)` : localOptions.color; + if (localOptions.bufferedOutput) { + lastDrawnPose[i].keypoints[pt][0] = (lastDrawnPose[i].keypoints[pt][0] + result[i].keypoints[pt].position.x) / 2; + lastDrawnPose[i].keypoints[pt][1] = (lastDrawnPose[i].keypoints[pt][1] + result[i].keypoints[pt].position.y) / 2; + point(ctx, lastDrawnPose[i].keypoints[pt][0], lastDrawnPose[i].keypoints[pt][1], 0, localOptions); + } else { + point(ctx, result[i].keypoints[pt].position.x, result[i].keypoints[pt].position.y, 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.z ? `rgba(${127.5 + 2 * pt.position.z}, ${127.5 - 2 * pt.position.z}, 255, 0.5)` : localOptions.color; + ctx.fillText(`${pt.part} ${Math.trunc(100 * pt.score)}%`, pt.position.x + 4, pt.position.y + 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.x, part.position.y]); + part = result[i].keypoints.find((a) => a.part === "rightShoulder"); + if (part) + points.push([part.position.x, part.position.y]); + curves(ctx, points, localOptions); + points.length = 0; + part = result[i].keypoints.find((a) => a.part === "rightShoulder"); + if (part) + points.push([part.position.x, part.position.y]); + part = result[i].keypoints.find((a) => a.part === "rightHip"); + if (part) + points.push([part.position.x, part.position.y]); + part = result[i].keypoints.find((a) => a.part === "leftHip"); + if (part) + points.push([part.position.x, part.position.y]); + part = result[i].keypoints.find((a) => a.part === "leftShoulder"); + if (part) + points.push([part.position.x, part.position.y]); + 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.x, part.position.y]); + part = result[i].keypoints.find((a) => a.part === "leftKnee"); + if (part) + points.push([part.position.x, part.position.y]); + part = result[i].keypoints.find((a) => a.part === "leftAnkle"); + if (part) + points.push([part.position.x, part.position.y]); + part = result[i].keypoints.find((a) => a.part === "leftHeel"); + if (part) + points.push([part.position.x, part.position.y]); + part = result[i].keypoints.find((a) => a.part === "leftFoot"); + if (part) + points.push([part.position.x, part.position.y]); + curves(ctx, points, localOptions); + points.length = 0; + part = result[i].keypoints.find((a) => a.part === "rightHip"); + if (part) + points.push([part.position.x, part.position.y]); + part = result[i].keypoints.find((a) => a.part === "rightKnee"); + if (part) + points.push([part.position.x, part.position.y]); + part = result[i].keypoints.find((a) => a.part === "rightAnkle"); + if (part) + points.push([part.position.x, part.position.y]); + part = result[i].keypoints.find((a) => a.part === "rightHeel"); + if (part) + points.push([part.position.x, part.position.y]); + part = result[i].keypoints.find((a) => a.part === "rightFoot"); + if (part) + points.push([part.position.x, part.position.y]); + curves(ctx, points, localOptions); + points.length = 0; + part = result[i].keypoints.find((a) => a.part === "leftShoulder"); + if (part) + points.push([part.position.x, part.position.y]); + part = result[i].keypoints.find((a) => a.part === "leftElbow"); + if (part) + points.push([part.position.x, part.position.y]); + part = result[i].keypoints.find((a) => a.part === "leftWrist"); + if (part) + points.push([part.position.x, part.position.y]); + part = result[i].keypoints.find((a) => a.part === "leftPalm"); + if (part) + points.push([part.position.x, part.position.y]); + curves(ctx, points, localOptions); + points.length = 0; + part = result[i].keypoints.find((a) => a.part === "rightShoulder"); + if (part) + points.push([part.position.x, part.position.y]); + part = result[i].keypoints.find((a) => a.part === "rightElbow"); + if (part) + points.push([part.position.x, part.position.y]); + part = result[i].keypoints.find((a) => a.part === "rightWrist"); + if (part) + points.push([part.position.x, part.position.y]); + part = result[i].keypoints.find((a) => a.part === "rightPalm"); + if (part) + points.push([part.position.x, part.position.y]); + curves(ctx, points, localOptions); + } + } +} +async function hand2(inCanvas2, result, drawOptions) { + const localOptions = mergeDeep(options, drawOptions); + if (!result || !inCanvas2) + return; + if (!(inCanvas2 instanceof HTMLCanvasElement)) + return; + const ctx = inCanvas2.getContext("2d"); + if (!ctx) + return; + ctx.lineJoin = "round"; + ctx.font = localOptions.font; + for (const h of result) { + if (localOptions.drawBoxes) { + ctx.strokeStyle = localOptions.color; + ctx.fillStyle = localOptions.color; + let box4; + if (!localOptions.calculateHandBox) { + box4 = localOptions.useRawBoxes ? h.boxRaw : h.box; + } else { + box4 = [Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, 0, 0]; + if (h.landmarks && h.landmarks.length > 0) { + for (const pt of h.landmarks) { + if (pt[0] < box4[0]) + box4[0] = pt[0]; + if (pt[1] < box4[1]) + box4[1] = pt[1]; + if (pt[0] > box4[2]) + box4[2] = pt[0]; + if (pt[1] > box4[3]) + box4[3] = pt[1]; + } + box4[2] -= box4[0]; + box4[3] -= box4[1]; + } + } + if (localOptions.useRawBoxes) + rect(ctx, inCanvas2.width * box4[0], inCanvas2.height * box4[1], inCanvas2.width * box4[2], inCanvas2.height * box4[3], localOptions); + else + rect(ctx, box4[0], box4[1], box4[2], box4[3], localOptions); + if (localOptions.drawLabels) { + if (localOptions.shadowColor && localOptions.shadowColor !== "") { + ctx.fillStyle = localOptions.shadowColor; + ctx.fillText("hand", box4[0] + 3, 1 + box4[1] + localOptions.lineHeight, box4[2]); + } + ctx.fillStyle = localOptions.labelColor; + ctx.fillText("hand", box4[0] + 2, 0 + box4[1] + localOptions.lineHeight, box4[2]); + } + ctx.stroke(); + } + if (localOptions.drawPoints) { + if (h.landmarks && h.landmarks.length > 0) { + for (const pt of h.landmarks) { + 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) => { + 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["indexFinger"], "index"); + addHandLabel(h.annotations["middleFinger"], "middle"); + addHandLabel(h.annotations["ringFinger"], "ring"); + addHandLabel(h.annotations["pinky"], "pinky"); + addHandLabel(h.annotations["thumb"], "thumb"); + addHandLabel(h.annotations["palmBase"], "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["indexFinger"]); + addHandLine(h.annotations["middleFinger"]); + addHandLine(h.annotations["ringFinger"]); + addHandLine(h.annotations["pinky"]); + addHandLine(h.annotations["thumb"]); + } + } +} +async function object(inCanvas2, result, drawOptions) { + const localOptions = mergeDeep(options, drawOptions); + if (!result || !inCanvas2) + return; + if (!(inCanvas2 instanceof HTMLCanvasElement)) + return; + const ctx = inCanvas2.getContext("2d"); + if (!ctx) + return; + ctx.lineJoin = "round"; + ctx.font = localOptions.font; + for (const h of result) { + if (localOptions.drawBoxes) { + ctx.strokeStyle = localOptions.color; + ctx.fillStyle = localOptions.color; + if (localOptions.useRawBoxes) + rect(ctx, inCanvas2.width * h.boxRaw[0], inCanvas2.height * h.boxRaw[1], inCanvas2.width * h.boxRaw[2], inCanvas2.height * h.boxRaw[3], localOptions); + else + rect(ctx, h.box[0], h.box[1], h.box[2], h.box[3], localOptions); + if (localOptions.drawLabels) { + const label = `${Math.round(100 * h.score)}% ${h.label}`; + 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 canvas(inCanvas2, outCanvas2) { + if (!inCanvas2 || !outCanvas2) + return; + if (!(inCanvas2 instanceof HTMLCanvasElement) || !(outCanvas2 instanceof HTMLCanvasElement)) + return; + const outCtx = inCanvas2.getContext("2d"); + outCtx == null ? void 0 : outCtx.drawImage(inCanvas2, 0, 0); +} +async function all(inCanvas2, result, drawOptions) { + const localOptions = mergeDeep(options, drawOptions); + if (!result || !inCanvas2) + return; + if (!(inCanvas2 instanceof HTMLCanvasElement)) + return; + face2(inCanvas2, result.face, localOptions); + body2(inCanvas2, result.body, localOptions); + hand2(inCanvas2, result.hand, localOptions); + gesture(inCanvas2, result.gesture, localOptions); + object(inCanvas2, result.object, localOptions); +} + +// src/sample.ts +var face3 = ` /9j/4AAQSkZJRgABAQEAYABgAAD/4QBoRXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUA AAABAAAARgEoAAMAAAABAAIAAAExAAIAAAARAAAATgAAAAAAAABgAAAAAQAAAGAAAAABcGFpbnQu bmV0IDQuMi4xMwAA/9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxob @@ -163,7 +18991,8 @@ PQ4GJ+ashuK0MhWaoWcA0AaOmASMK7jRNPWYBmHyiuepO2x10qfcv6vYxCzYqoGK4HVYVTJrmb5l c6oaM5TUJ8EgGsG4kLNUHT0M64OaqMMikSRsuKbnFMRLG3zVehOaGNE445NNlnVFpDMu6uie9Vo1 8z5mOAOST2pDK91cNN+5tsrH3PrW54a06KxT7fdrlh/q1Pc+tJ6IUdZGvHPLezMcnBOWbsPap5r3 ylFtbdT1xUWNWzU0/Zbwlgfmx8zGsHWtRHmMqE59aAMyNifvHPc1f0gtPdqkY5JosJHeNci2tktY -euPnNY+oXWZEVJNrZ9aun8SIq/CzodHuriIokhDIR1ronbKZr0o6o8ipoz//2Q==`,U0=` +euPnNY+oXWZEVJNrZ9aun8SIq/CzodHuriIokhDIR1ronbKZr0o6o8ipoz//2Q==`; +var body3 = ` /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAsICAoIBwsKCQoNDAsNERwSEQ8PESIZGhQcKSQrKigk JyctMkA3LTA9MCcnOEw5PUNFSElIKzZPVU5GVEBHSEX/2wBDAQwNDREPESESEiFFLicuRUVFRUVF RUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUX/wAARCASwBLADASIA @@ -731,5 +19560,472 @@ AAAAAAJAAAAAAAAAAAAAABAJEAAAAAAAAAAAAAAAIEoBKAAAAAAAAAAAAAAABAlAAAAAAAIAAAAA BAkBAkBAkBAlACEgMZjdjbFW8bWrEx8YWANb6Fp+bfwab+vLDKMFK9qxH5L0bAr8OPRPKz2AY7J2 SbAjYZAI2E7AIEgIEgIEgMdkSy2NgY7MdlmyNoBXsxmFuyNgVTVjNV3KjlBRNTlXTVHKCrlIqt5T lBhEMohlFerLlBjEMohMVTEARDKCITsAk2AEgAAAkAAAAAAAAAAAAAAAAAAAAAAAASAAAAAAAAD/ -2Q==`;var $A="1.9.1";var f0,P0,M0,r0,i0,m0,C0,z0,Y0,J0,K0,D0,L2=class{constructor(e={}){q(this,f0,void 0);q(this,P0,void 0);q(this,M0,void 0);q(this,r0,void 0);q(this,i0,void 0);q(this,m0,void 0);this.analyze=(...e)=>{if(!Z(this,P0))return;let t=this.tf.engine().state.numTensors,o=Z(this,f0);Y(this,f0,t);let s=t-o;s!==0&&u(...e,s)};q(this,C0,e=>{if(!Z(this,M0))return null;if(!e)return"input is not defined";if(this.tf.ENV.flags.IS_NODE&&!(e instanceof i.Tensor))return"input must be a tensor";try{this.tf.getBackend()}catch(t){return"backend not loaded"}return null});q(this,z0,async(e=!1)=>{var t;if(this.config.backend&&this.config.backend.length>0&&e||this.tf.getBackend()!==this.config.backend){let o=S();if(this.state="backend",this.config.backend&&this.config.backend.length>0){if(typeof window=="undefined"&&typeof WorkerGlobalScope!="undefined"&&this.config.debug&&u("running inside web worker"),this.tf.ENV.flags.IS_BROWSER&&this.config.backend==="tensorflow"&&(this.config.backend="webgl"),this.tf.ENV.flags.IS_NODE&&(this.config.backend==="webgl"||this.config.backend==="humangl")&&(this.config.backend="tensorflow"),this.config.debug&&u("setting backend:",this.config.backend),this.config.backend==="wasm"){if(this.config.debug&&u("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 s=await this.tf.env().getAsync("WASM_HAS_SIMD_SUPPORT"),r=await this.tf.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT");this.config.debug&&u(`wasm execution: ${s?"SIMD":"no SIMD"} ${r?"multithreaded":"singlethreaded"}`),this.config.debug&&!s&&u("warning: wasm simd support is not enabled")}this.config.backend==="humangl"&&sA();try{await this.tf.setBackend(this.config.backend)}catch(s){u("error: cannot set backend:",this.config.backend,s)}}if(this.tf.enableProdMode(),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),i.ENV.set("WEBGL_FORCE_F16_TEXTURES",!0),this.tf.ENV.set("WEBGL_PACK_DEPTHWISECONV",!0),typeof this.config.deallocate!="undefined"&&(u("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",!0),this.tf.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD",0));let s=await this.tf.backend().getGPGPUContext().gl;this.config.debug&&u(`gl version:${s.getParameter(s.VERSION)} renderer:${s.getParameter(s.RENDERER)}`)}await this.tf.ready(),this.perf.backend=Math.trunc(S()-o)}});q(this,Y0,async e=>{if(this.config.cacheSensitivity===0)return!1;let t=40,o=e.resizeBilinear([Math.trunc(e.shape[1]/t),Math.trunc(e.shape[2]/t)]),s=this.tf.sum(o),r=s.dataSync()[0];s.dispose(),o.dispose();let n=Math.max(r,Z(this,i0))/Math.min(r,Z(this,i0))-1;Y(this,i0,r);let a=n4*this.config.cacheSensitivity?0:n),a});q(this,J0,async()=>{let e=(s,r="application/octet-stream")=>fetch(`data:${r};base64,${s}`).then(n=>n.blob()),t,o;switch(this.config.warmup){case"face":t=await e(B0);break;case"full":t=await e(U0);break;default:t=null}if(t){let s=await createImageBitmap(t);o=await this.detect(s,this.config),s.close()}return o});q(this,K0,async()=>new Promise(e=>{let t,o=0;switch(this.config.warmup){case"face":o=256,t="data:image/jpeg;base64,"+B0;break;case"full":case"body":o=1200,t="data:image/jpeg;base64,"+U0;break;default:t=null}let s=new Image;s.onload=async()=>{let r=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(o,o):document.createElement("canvas");r.width=s.naturalWidth,r.height=s.naturalHeight;let n=r.getContext("2d");n==null||n.drawImage(s,0,0);let a=await this.detect(r,this.config);e(a)},t?s.src=t:e(null)}));q(this,D0,async()=>{let e=s=>Buffer.from(s,"base64"),t;if(this.config.warmup==="face"&&(t=e(B0)),(this.config.warmup==="body"||this.config.warmup==="full")&&(t=e(U0)),!t)return null;let o;if(typeof i.node!="undefined"){let s=i.node.decodeJpeg(t),r=s.expandDims(0);this.tf.dispose(s),o=await this.detect(r,this.config),this.tf.dispose(r)}else this.config.debug&&u("Warmup tfjs-node not loaded");return o});this.tf=i,this.draw=J5,this.version=$A,this.config=B(_5,e),this.state="idle",Y(this,f0,0),Y(this,P0,!1),Y(this,M0,!1),Y(this,r0,!0),Y(this,m0,0),this.perf={},this.models={face:null,posenet:null,blazepose:null,efficientpose:null,handpose:null,iris:null,age:null,gender:null,emotion:null,embedding:null,nanodet:null,centernet:null,faceres:null},this.image=t=>C5(t,this.config),this.classes={facemesh:r5,emotion:y5,faceres:m5,body:this.config.body.modelPath.includes("posenet")?z5:I5,hand:W5,nanodet:H5,centernet:U5},this.faceTriangulation=uA,this.faceUVMap=pA,this.sysinfo=$5(),Y(this,i0,1)}similarity(e,t){return d5(e,t)}enhance(e){return f5(e)}match(e,t,o=0){return TA(e,t,o)}async load(e={}){this.state="load";let t=S();e&&(this.config=B(this.config,e)),Z(this,r0)&&(this.config.debug&&u(`version: ${this.version}`),this.config.debug&&u(`tfjs version: ${this.tf.version_core}`),this.config.debug&&u("platform:",this.sysinfo.platform),this.config.debug&&u("agent:",this.sysinfo.agent),await Z(this,z0).call(this,!0),this.tf.ENV.flags.IS_BROWSER&&(this.config.debug&&u("configuration:",this.config),this.config.debug&&u("tf flags:",this.tf.ENV.flags))),this.config.async?[this.models.face,this.models.emotion,this.models.handpose,this.models.posenet,this.models.blazepose,this.models.nanodet,this.models.centernet,this.models.faceres]=await Promise.all([this.models.face||(this.config.face.enabled?s5(this.config):null),this.models.emotion||(this.config.face.enabled&&this.config.face.emotion.enabled?x5(this.config):null),this.models.handpose||(this.config.hand.enabled?w5(this.config):null),this.models.posenet||(this.config.body.enabled&&this.config.body.modelPath.includes("posenet")?M5(this.config):null),this.models.blazepose||(this.config.body.enabled&&this.config.body.modelPath.includes("blazepose")?k5(this.config):null),this.models.nanodet||(this.config.object.enabled&&this.config.object.modelPath.includes("nanodet")?V5(this.config):null),this.models.centernet||(this.config.object.enabled&&this.config.object.modelPath.includes("centernet")?q5(this.config):null),this.models.faceres||(this.config.face.enabled&&this.config.face.description.enabled?c5(this.config):null)]):(this.config.face.enabled&&!this.models.face&&(this.models.face=await s5(this.config)),this.config.face.enabled&&this.config.face.emotion.enabled&&!this.models.emotion&&(this.models.emotion=await x5(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await w5(this.config)),this.config.body.enabled&&!this.models.posenet&&this.config.body.modelPath.includes("posenet")&&(this.models.posenet=await M5(this.config)),this.config.body.enabled&&!this.models.blazepose&&this.config.body.modelPath.includes("blazepose")&&(this.models.blazepose=await k5(this.config)),this.config.object.enabled&&!this.models.nanodet&&this.config.object.modelPath.includes("nanodet")&&(this.models.nanodet=await V5(this.config)),this.config.object.enabled&&!this.models.centernet&&this.config.object.modelPath.includes("centernet")&&(this.models.centernet=await q5(this.config)),this.config.face.enabled&&this.config.face.description.enabled&&!this.models.faceres&&(this.models.faceres=await c5(this.config))),Z(this,r0)&&(this.config.debug&&u("tf engine state:",this.tf.engine().state.numBytes,"bytes",this.tf.engine().state.numTensors,"tensors"),Y(this,r0,!1));let o=Math.trunc(S()-t);o>(this.perf.load||0)&&(this.perf.load=o)}async detect(e,t={}){return new Promise(async o=>{this.state="config";let s;this.config=B(this.config,t),this.state="check";let r=Z(this,C0).call(this,e);r&&(u(r,e),o({error:r}));let n=S();await Z(this,z0).call(this),await this.load(),s=S();let a=C5(e,this.config);if(!a||!a.tensor){u("could not convert input to tensor"),o({error:"could not convert input to tensor"});return}this.perf.image=Math.trunc(S()-s),this.analyze("Get Image:"),s=S(),this.config.skipFrame=await Z(this,Y0).call(this,a.tensor),this.perf.frames||(this.perf.frames=0),this.perf.cached||(this.perf.cached=0),this.perf.frames++,this.config.skipFrame&&this.perf.cached++,this.perf.changed=Math.trunc(S()-s),this.analyze("Check Changed:");let x,y,d,l,f;this.config.async?(d=this.config.face.enabled?h5(this,a.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",s=S(),d=this.config.face.enabled?await h5(this,a.tensor):[],f=Math.trunc(S()-s),f>0&&(this.perf.face=f)),this.analyze("Start Body:"),this.config.async?(this.config.body.modelPath.includes("posenet")?x=this.config.body.enabled?P5(a.tensor,this.config):[]:this.config.body.modelPath.includes("blazepose")&&(x=this.config.body.enabled?N5(a.tensor,this.config):[]),this.perf.body&&delete this.perf.body):(this.state="run:body",s=S(),this.config.body.modelPath.includes("posenet")?x=this.config.body.enabled?await P5(a.tensor,this.config):[]:this.config.body.modelPath.includes("blazepose")&&(x=this.config.body.enabled?await N5(a.tensor,this.config):[]),f=Math.trunc(S()-s),f>0&&(this.perf.body=f)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.config.async?(y=this.config.hand.enabled?S5(a.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",s=S(),y=this.config.hand.enabled?await S5(a.tensor,this.config):[],f=Math.trunc(S()-s),f>0&&(this.perf.hand=f)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.config.async?(this.config.object.modelPath.includes("nanodet")?l=this.config.object.enabled?L5(a.tensor,this.config):[]:this.config.object.modelPath.includes("centernet")&&(l=this.config.object.enabled?B5(a.tensor,this.config):[]),this.perf.object&&delete this.perf.object):(this.state="run:object",s=S(),this.config.object.modelPath.includes("nanodet")?l=this.config.object.enabled?await L5(a.tensor,this.config):[]:this.config.object.modelPath.includes("centernet")&&(l=this.config.object.enabled?await B5(a.tensor,this.config):[]),f=Math.trunc(S()-s),f>0&&(this.perf.object=f)),this.analyze("End Object:"),this.config.async&&([d,x,y,l]=await Promise.all([d,x,y,l])),i.dispose(a.tensor);let p=[];this.config.gesture.enabled&&(s=S(),p=[...UA(d),...BA(x),...YA(y),...CA(d)],this.config.async?this.perf.gesture&&delete this.perf.gesture:this.perf.gesture=Math.trunc(S()-s)),this.perf.total=Math.trunc(S()-n),this.state="idle";let z={face:d,body:x,hand:y,gesture:p,object:l,performance:this.perf,canvas:a.canvas};o(z)})}async warmup(e={}){let t=S();if(e&&(this.config=B(this.config,e)),!this.config.warmup||this.config.warmup==="none")return{error:"null"};let o;typeof createImageBitmap=="function"?o=await Z(this,J0).call(this):typeof Image!="undefined"?o=await Z(this,K0).call(this):o=await Z(this,D0).call(this);let s=S();return this.config.debug&&u("Warmup",this.config.warmup,Math.round(s-t),"ms",o),o}};f0=new WeakMap,P0=new WeakMap,M0=new WeakMap,r0=new WeakMap,i0=new WeakMap,m0=new WeakMap,C0=new WeakMap,z0=new WeakMap,Y0=new WeakMap,J0=new WeakMap,K0=new WeakMap,D0=new WeakMap;export{L2 as Human,L2 as default}; +2Q==`; + +// package.json +var version2 = "1.9.1"; + +// 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 current = this.tf.engine().state.numTensors; + const previous = __privateGet(this, _numTensors); + __privateSet(this, _numTensors, current); + const leaked = current - previous; + 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") + this.config.backend = "webgl"; + if (this.tf.ENV.flags.IS_NODE && (this.config.backend === "webgl" || this.config.backend === "humangl")) + this.config.backend = "tensorflow"; + 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"); + } + if (this.config.backend === "humangl") + register(); + try { + await this.tf.setBackend(this.config.backend); + } catch (err) { + log("error: cannot set backend:", this.config.backend, err); + } + } + this.tf.enableProdMode(); + 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); + tfjs_esm_exports.ENV.set("WEBGL_FORCE_F16_TEXTURES", true); + this.tf.ENV.set("WEBGL_PACK_DEPTHWISECONV", true); + if (typeof this.config["deallocate"] !== "undefined") { + 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)}`); + } + await this.tf.ready(); + this.perf.backend = Math.trunc(now() - timeStamp); + } + }); + __privateAdd(this, _skipFrame, async (input) => { + if (this.config.cacheSensitivity === 0) + return false; + const resizeFact = 40; + const reduced = input.resizeBilinear([Math.trunc(input.shape[1] / resizeFact), Math.trunc(input.shape[2] / resizeFact)]); + const sumT = this.tf.sum(reduced); + const sum = sumT.dataSync()[0]; + sumT.dispose(); + reduced.dispose(); + const diff = 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 > 4 * 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.tf = tfjs_esm_exports; + this.draw = draw_exports; + this.version = version2; + this.config = mergeDeep(config, userConfig); + this.state = "idle"; + __privateSet(this, _numTensors, 0); + __privateSet(this, _analyzeMemoryLeaks, false); + __privateSet(this, _checkSanity, false); + __privateSet(this, _firstRun, true); + __privateSet(this, _lastCacheDiff, 0); + this.perf = {}; + this.models = { + face: null, + posenet: null, + blazepose: null, + efficientpose: null, + handpose: null, + iris: null, + age: null, + gender: null, + emotion: null, + embedding: null, + nanodet: null, + centernet: null, + faceres: null + }; + this.image = (input) => process4(input, this.config); + this.classes = { + facemesh: facemesh_exports, + emotion: emotion_exports, + faceres: faceres_exports, + body: this.config.body.modelPath.includes("posenet") ? posenet_exports : blazepose_exports, + hand: handpose_exports, + nanodet: nanodet_exports, + centernet: centernet_exports + }; + this.faceTriangulation = triangulation; + this.faceUVMap = uvmap; + this.sysinfo = info(); + __privateSet(this, _lastInputSum, 1); + } + similarity(embedding1, embedding2) { + return similarity(embedding1, embedding2); + } + 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); + } + } + if (this.config.async) { + [ + this.models.face, + this.models.emotion, + this.models.handpose, + this.models.posenet, + this.models.blazepose, + this.models.nanodet, + this.models.centernet, + this.models.faceres + ] = await Promise.all([ + this.models.face || (this.config.face.enabled ? load2(this.config) : null), + this.models.emotion || (this.config.face.enabled && this.config.face.emotion.enabled ? load3(this.config) : null), + this.models.handpose || (this.config.hand.enabled ? load6(this.config) : null), + this.models.posenet || (this.config.body.enabled && this.config.body.modelPath.includes("posenet") ? load5(this.config) : null), + this.models.blazepose || (this.config.body.enabled && this.config.body.modelPath.includes("blazepose") ? load7(this.config) : null), + this.models.nanodet || (this.config.object.enabled && this.config.object.modelPath.includes("nanodet") ? load8(this.config) : null), + this.models.centernet || (this.config.object.enabled && this.config.object.modelPath.includes("centernet") ? load9(this.config) : null), + this.models.faceres || (this.config.face.enabled && this.config.face.description.enabled ? load4(this.config) : null) + ]); + } else { + if (this.config.face.enabled && !this.models.face) + this.models.face = await load2(this.config); + if (this.config.face.enabled && this.config.face.emotion.enabled && !this.models.emotion) + this.models.emotion = await load3(this.config); + if (this.config.hand.enabled && !this.models.handpose) + this.models.handpose = await load6(this.config); + if (this.config.body.enabled && !this.models.posenet && this.config.body.modelPath.includes("posenet")) + this.models.posenet = await load5(this.config); + if (this.config.body.enabled && !this.models.blazepose && this.config.body.modelPath.includes("blazepose")) + this.models.blazepose = await load7(this.config); + if (this.config.object.enabled && !this.models.nanodet && this.config.object.modelPath.includes("nanodet")) + this.models.nanodet = await load8(this.config); + if (this.config.object.enabled && !this.models.centernet && this.config.object.modelPath.includes("centernet")) + this.models.centernet = await load9(this.config); + if (this.config.face.enabled && this.config.face.description.enabled && !this.models.faceres) + this.models.faceres = await load4(this.config); + } + 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.perf.load || 0)) + this.perf.load = current; + } + async detect(input, userConfig = {}) { + return new Promise(async (resolve) => { + this.state = "config"; + let timeStamp; + 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(); + const process5 = process4(input, this.config); + if (!process5 || !process5.tensor) { + log("could not convert input to tensor"); + resolve({ error: "could not convert input to tensor" }); + return; + } + this.perf.image = Math.trunc(now() - timeStamp); + this.analyze("Get Image:"); + timeStamp = now(); + this.config.skipFrame = await __privateGet(this, _skipFrame).call(this, process5.tensor); + if (!this.perf.frames) + this.perf.frames = 0; + if (!this.perf.cached) + this.perf.cached = 0; + this.perf.frames++; + if (this.config.skipFrame) + this.perf.cached++; + this.perf.changed = Math.trunc(now() - timeStamp); + this.analyze("Check Changed:"); + let bodyRes; + let handRes; + let faceRes; + let objectRes; + let current; + if (this.config.async) { + faceRes = this.config.face.enabled ? detectFace(this, process5.tensor) : []; + if (this.perf.face) + delete this.perf.face; + } else { + this.state = "run:face"; + timeStamp = now(); + faceRes = this.config.face.enabled ? await detectFace(this, process5.tensor) : []; + current = Math.trunc(now() - timeStamp); + if (current > 0) + this.perf.face = current; + } + this.analyze("Start Body:"); + if (this.config.async) { + if (this.config.body.modelPath.includes("posenet")) + bodyRes = this.config.body.enabled ? predict4(process5.tensor, this.config) : []; + else if (this.config.body.modelPath.includes("blazepose")) + bodyRes = this.config.body.enabled ? predict6(process5.tensor, this.config) : []; + if (this.perf.body) + delete this.perf.body; + } else { + this.state = "run:body"; + timeStamp = now(); + if (this.config.body.modelPath.includes("posenet")) + bodyRes = this.config.body.enabled ? await predict4(process5.tensor, this.config) : []; + else if (this.config.body.modelPath.includes("blazepose")) + bodyRes = this.config.body.enabled ? await predict6(process5.tensor, this.config) : []; + current = Math.trunc(now() - timeStamp); + if (current > 0) + this.perf.body = current; + } + this.analyze("End Body:"); + this.analyze("Start Hand:"); + if (this.config.async) { + handRes = this.config.hand.enabled ? predict5(process5.tensor, this.config) : []; + if (this.perf.hand) + delete this.perf.hand; + } else { + this.state = "run:hand"; + timeStamp = now(); + handRes = this.config.hand.enabled ? await predict5(process5.tensor, this.config) : []; + current = Math.trunc(now() - timeStamp); + if (current > 0) + this.perf.hand = current; + } + this.analyze("End Hand:"); + this.analyze("Start Object:"); + if (this.config.async) { + if (this.config.object.modelPath.includes("nanodet")) + objectRes = this.config.object.enabled ? predict7(process5.tensor, this.config) : []; + else if (this.config.object.modelPath.includes("centernet")) + objectRes = this.config.object.enabled ? predict8(process5.tensor, this.config) : []; + if (this.perf.object) + delete this.perf.object; + } else { + this.state = "run:object"; + timeStamp = now(); + if (this.config.object.modelPath.includes("nanodet")) + objectRes = this.config.object.enabled ? await predict7(process5.tensor, this.config) : []; + else if (this.config.object.modelPath.includes("centernet")) + objectRes = this.config.object.enabled ? await predict8(process5.tensor, this.config) : []; + current = Math.trunc(now() - timeStamp); + if (current > 0) + this.perf.object = current; + } + this.analyze("End Object:"); + if (this.config.async) { + [faceRes, bodyRes, handRes, objectRes] = await Promise.all([faceRes, bodyRes, handRes, objectRes]); + } + tfjs_esm_exports.dispose(process5.tensor); + let gestureRes = []; + if (this.config.gesture.enabled) { + timeStamp = now(); + gestureRes = [...face(faceRes), ...body(bodyRes), ...hand(handRes), ...iris(faceRes)]; + if (!this.config.async) + this.perf.gesture = Math.trunc(now() - timeStamp); + else if (this.perf.gesture) + delete this.perf.gesture; + } + this.perf.total = Math.trunc(now() - timeStart); + this.state = "idle"; + const res = { + face: faceRes, + body: bodyRes, + hand: handRes, + gesture: gestureRes, + object: objectRes, + performance: this.perf, + canvas: process5.canvas + }; + resolve(res); + }); + } + 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 952c4482..b7871ca6 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", "../src/tfjs/tf-browser.ts", "../src/tfjs/backend.ts", "../src/blazeface/facemesh.ts", "../src/blazeface/box.ts", "../src/blazeface/util.ts", "../src/blazeface/blazeface.ts", "../src/blazeface/coords.ts", "../src/blazeface/facepipeline.ts", "../src/emotion/emotion.ts", "../src/faceres/faceres.ts", "../src/face.ts", "../src/posenet/posenet.ts", "../src/posenet/keypoints.ts", "../src/posenet/utils.ts", "../src/posenet/poses.ts", "../src/handpose/handpose.ts", "../src/handpose/box.ts", "../src/handpose/anchors.ts", "../src/handpose/handdetector.ts", "../src/handpose/util.ts", "../src/handpose/handpipeline.ts", "../src/blazepose/blazepose.ts", "../src/blazepose/annotations.ts", "../src/object/nanodet.ts", "../src/object/labels.ts", "../src/object/centernet.ts", "../src/gesture/gesture.ts", "../src/image/imagefx.js", "../src/image/image.ts", "../src/draw/draw.ts", "../src/sample.ts", "../src/human.ts"], - "sourcesContent": ["// 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) {\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", "/* 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 */\nexport interface Config {\n /** Backend used for TFJS operations */\n backend: null | '' | 'cpu' | 'wasm' | 'webgl' | 'humangl' | 'tensorflow',\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 /** 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\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 },\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\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: '../node_modules/@tensorflow/tfjs-backend-wasm/dist//', // path for wasm binaries, only used for backend: wasm\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.01, // 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 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: false, // 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: 10, // maximum number of faces detected in the input\n // should be set to the minimum number for performance\n skipFrames: 21, // 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 },\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: 31, // 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: 32, // 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: 'posenet.json', // body model, can be absolute path or relative to modelBasePath\n // can be 'posenet' or 'blazepose'\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 blazepose only detects single pose\n minConfidence: 0.1, // threshold for discarding a prediction\n },\n\n hand: {\n enabled: true,\n rotation: false, // 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: 32, // 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.1, // threshold for discarding a prediction\n iouThreshold: 0.1, // ammount of overlap between two detected objects before one object is removed\n maxDetected: 2, // 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: 41, // how many max frames to go without re-running the detector\n // only used when cacheSensitivity is not zero\n },\n};\nexport { config as defaults };\n", "export 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].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", "// wrapper to load tfjs in a single place so version can be changed quickly\n\n// simplified\n// { modules: 1250, moduleBytes: 4013323, imports: 7, importBytes: 2255, outputBytes: 2991826, outputFiles: 'dist/tfjs.esm.js' }\n// export * from '@tensorflow/tfjs/dist/index.js';\n// export * from '@tensorflow/tfjs-backend-wasm';\n\n// modular\n// { modules: 1253, moduleBytes: 4029357, imports: 7, importBytes: 2285, outputBytes: 2998298, outputFiles: 'dist/tfjs.esm.js' }\n\n// get versions of all packages.\nimport * as packageBundle from '@tensorflow/tfjs/package.json';\nimport * as packageCore from '@tensorflow/tfjs-core/package.json';\nimport * as packageData from '@tensorflow/tfjs-data/package.json';\nimport * as packageLayers from '@tensorflow/tfjs-layers/package.json';\nimport * as packageConverter from '@tensorflow/tfjs-converter/package.json';\n// for backends, get version from source so it can register backend during import\nimport { version_cpu } from '@tensorflow/tfjs-backend-cpu/dist/index.js';\nimport { version_webgl } from '@tensorflow/tfjs-backend-webgl/dist/index.js';\nimport { version_wasm } from '@tensorflow/tfjs-backend-wasm/dist/index.js';\n\n// export all - compiled\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\n// export all - sources\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 versions\nexport const version = {\n tfjs: packageBundle?.version || undefined,\n 'tfjs-core': packageCore?.version || undefined,\n 'tfjs-data': packageData?.version || undefined,\n 'tfjs-layers': packageLayers?.version || undefined,\n 'tfjs-converter': packageConverter?.version || undefined,\n 'tfjs-backend-cpu': version_cpu || undefined,\n 'tfjs-backend-webgl': version_webgl || undefined,\n 'tfjs-backend-wasm': version_wasm || undefined,\n};\n// export const version = {};\n", "import { 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 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\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);\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 // tf.ENV.set('WEBGL_MAX_TEXTURE_SIZE', config.gl.getParameter(config.gl.MAX_TEXTURE_SIZE));\n // tf.ENV.set('WEBGL_FORCE_F16_TEXTURES', true);\n // tf.ENV.set('WEBGL_PACK_DEPTHWISECONV', true);\n } catch (err) {\n log('error: cannot set WebGL backend flags:', err);\n return;\n }\n log('backend registered:', config.name);\n }\n}\n", "import { 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';\n\nlet faceModels:[any, any, any] = [null, null, null];\nlet facePipeline;\n\nexport async function predict(input, config): Promise<{ confidence, boxConfidence, faceConfidence, box, mesh, boxRaw, meshRaw, annotations, image }[]> {\n const predictions = await facePipeline.predict(input, config);\n const results: Array<{ confidence, boxConfidence, faceConfidence, box, mesh, boxRaw, meshRaw, annotations, image }> = [];\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],\n pt[1] / input.shape[1],\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 = prediction.box ? [\n Math.max(0, prediction.box.startPoint[0]),\n Math.max(0, prediction.box.startPoint[1]),\n Math.min(input.shape[2], prediction.box.endPoint[0]) - Math.max(0, prediction.box.startPoint[0]),\n Math.min(input.shape[1], prediction.box.endPoint[1]) - Math.max(0, prediction.box.startPoint[1]),\n ] : 0;\n const boxRaw = prediction.box ? [\n prediction.box.startPoint[0] / input.shape[2],\n prediction.box.startPoint[1] / input.shape[1],\n (prediction.box.endPoint[0] - prediction.box.startPoint[0]) / input.shape[2],\n (prediction.box.endPoint[1] - prediction.box.startPoint[1]) / input.shape[1],\n ] : [];\n results.push({\n confidence: Math.round(100 * prediction.faceConfidence || 100 * prediction.boxConfidence || 0) / 100,\n boxConfidence: Math.round(100 * prediction.boxConfidence) / 100,\n faceConfidence: Math.round(100 * prediction.faceConfidence) / 100,\n box: clampedBox,\n boxRaw,\n mesh: prediction.mesh,\n meshRaw,\n annotations,\n image: prediction.image,\n });\n if (prediction.coords) prediction.coords.dispose();\n }\n return results;\n}\n\nexport async function load(config): Promise<[Object, Object, Object]> {\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') }) : 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') }) : 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[1].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 log('cached model:', faceModels[0].model.modelUrl);\n log('cached model:', faceModels[1].modelUrl);\n 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", "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 t.startPoint.dispose();\n t.endPoint.dispose();\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 } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as box from './box';\nimport * as util from './util';\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: any;\n anchorsData: any;\n anchors: any;\n inputSize: number;\n config: any;\n\n constructor(model, 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) {\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 = inputImage.resizeBilinear([this.inputSize, this.inputSize]);\n const normalizedImage = resizedImage.div(127.5).sub(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 = concat.squeeze(0);\n } else {\n batchOut = res.squeeze(); // 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.sigmoid(logits).squeeze().dataSync();\n return [batchOut, boxesOut, scoresOut];\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 = nmsTensor.arraySync();\n nmsTensor.dispose();\n const annotatedBoxes: Array<{ box: any, landmarks: any, anchor: number[], confidence: number }> = [];\n for (let i = 0; i < nms.length; i++) {\n const confidence = scores[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 boundingBox.dispose();\n const anchor = this.anchorsData[nms[i]];\n const landmarks = tf.tidy(() => tf.slice(batch, [nms[i], keypointsCount - 1], [1, -1]).squeeze().reshape([keypointsCount, -1]));\n annotatedBoxes.push({ box: localBox, landmarks, anchor, confidence });\n }\n }\n // boundingBoxes.forEach((t) => t.dispose());\n batch.dispose();\n boxes.dispose();\n // scores.dispose();\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) {\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';\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: any;\n boundingBoxDetector: any;\n meshDetector: any;\n irisModel: any;\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 crop = tf.image.flipLeftRight(crop); // flipLeftRight is not defined for tfjs-node\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 = [];\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 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);\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 this.storedBoxes.push({ startPoint: possible.box.startPoint.dataSync(), endPoint: possible.box.endPoint.dataSync(), landmarks: possible.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.arraySync();\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 prediction.box.startPoint.dispose();\n prediction.box.endPoint.dispose();\n prediction.landmarks.dispose();\n });\n }\n const results = tf.tidy(() => this.storedBoxes.map((box, i) => {\n // 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 const [indexOfMouth, indexOfForehead] = (box.landmarks.length >= meshLandmarks.count) ? meshLandmarks.symmetryLine : blazeFaceLandmarks.symmetryLine;\n 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 rotationMatrix = util.buildRotationMatrix(-angle, faceCenter);\n if (config.face.mesh.enabled) face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, rotatedImage, [this.meshSize, this.meshSize]).div(255);\n else face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, rotatedImage, [this.boxSize, this.boxSize]).div(255);\n } else {\n rotationMatrix = util.IDENTITY_MATRIX;\n const clonedImage = input.clone();\n if (config.face.mesh.enabled) face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, clonedImage, [this.meshSize, this.meshSize]).div(255);\n else face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, clonedImage, [this.boxSize, this.boxSize]).div(255);\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 const prediction = {\n mesh: [],\n box,\n faceConfidence: null,\n boxConfidence: box.confidence,\n confidence: box.confidence,\n image: face,\n };\n return prediction;\n }\n\n const [, confidence, contourCoords] = this.meshDetector.execute(face); // The first returned tensor represents facial contours which are already included in the coordinates.\n const faceConfidence = confidence.dataSync()[0];\n if (faceConfidence < config.face.detector.minConfidence) {\n this.storedBoxes[i].confidence = faceConfidence; // reset confidence of cached box\n return null; // if below confidence just exit\n }\n const coordsReshaped = tf.reshape(contourCoords, [-1, 3]);\n let rawCoords = coordsReshaped.arraySync();\n\n if (config.face.iris.enabled) {\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 eyePredictions = this.irisModel.predict(tf.concat([leftEyeCrop, rightEyeCrop]));\n const eyePredictionsData = eyePredictions.dataSync();\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 rawCoords = rawCoords.concat(adjustedLeftIrisCoords).concat(adjustedRightIrisCoords);\n }\n\n // override box from detection with one calculated from mesh\n const mesh = this.transformRawCoords(rawCoords, box, angle, rotationMatrix);\n const storeConfidence = box.confidence;\n box = bounding.enlargeBox(bounding.calculateLandmarksBoundingBox(mesh), 1.5); // redefine box with mesh calculated one\n box.confidence = storeConfidence;\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 const [indexOfMouth, indexOfForehead] = (box.landmarks.length >= meshLandmarks.count) ? meshLandmarks.symmetryLine : blazeFaceLandmarks.symmetryLine;\n 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.toFloat(), angle, 0, faceCenterNormalized); // rotateWithOffset is not defined for tfjs-node\n rotationMatrix = util.buildRotationMatrix(-angle, faceCenter);\n face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, rotatedImage, [this.meshSize, this.meshSize]).div(255);\n }\n\n const prediction = {\n mesh,\n box,\n faceConfidence,\n boxConfidence: box.confidence,\n image: face,\n };\n\n // updated stored cache values\n const storedBox = bounding.squarifyBox(box);\n // @ts-ignore box itself doesn't have those properties, but we stored them for future use\n storedBox.confidence = box.confidence;\n // @ts-ignore box itself doesn't have those properties, but we stored them for future use\n storedBox.faceConfidence = faceConfidence;\n // this.storedBoxes[i] = { ...squarifiedLandmarksBox, confidence: box.confidence, faceConfidence };\n this.storedBoxes[i] = storedBox;\n\n return prediction;\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 = this.storedBoxes.filter((a) => a.confidence > config.face.detector.minConfidence);\n this.detectedFaces = results.length;\n\n return results;\n }\n}\n", "import { log, join } from '../helpers';\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) {\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, 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 resize.dispose();\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 red.dispose();\n green.dispose();\n blue.dispose();\n const grayscale = tf.addN([redNorm, greenNorm, blueNorm]);\n redNorm.dispose();\n greenNorm.dispose();\n blueNorm.dispose();\n const normalize = tf.tidy(() => grayscale.sub(0.5).mul(2));\n grayscale.dispose();\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 = emotionT.dataSync();\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 normalize.dispose();\n last[idx] = obj;\n lastCount = count;\n resolve(obj);\n });\n}\n", "import { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\n\nlet model;\nconst last: Array<{ age: number}> = [];\nlet lastCount = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\ntype Tensor = typeof tf.Tensor;\ntype DB = Array<{ name: string, source: string, embedding: number[] }>;\n\nexport async function load(config) {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.face.description.modelPath));\n if (!model || !model.modelUrl) log('load model failed:', config.face.description.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 function similarity(embedding1, embedding2, 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 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 = crop.mul(255);\n\n return norm;\n });\n return image;\n}\n\nexport async function predict(image, 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;\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 genderConfidence: 0,\n descriptor: [] };\n\n if (config.face.description.enabled) resT = await model.predict(enhanced);\n tf.dispose(enhanced);\n\n if (resT) {\n tf.tidy(() => {\n const gender = resT.find((t) => t.shape[1] === 1).dataSync();\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.genderConfidence = Math.min(0.99, confidence);\n }\n const age = resT.find((t) => t.shape[1] === 100).argMax(1).dataSync()[0];\n const all = resT.find((t) => t.shape[1] === 100).dataSync();\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 obj.descriptor = [...desc.dataSync()];\n });\n resT.forEach((t) => tf.dispose(t));\n }\n\n last[idx] = obj;\n lastCount = count;\n resolve(obj);\n });\n}\n", "import { 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';\n\ntype Tensor = typeof tf.Tensor;\n\nconst calculateFaceAngle = (face, image_size): { angle: { pitch: number, yaw: number, roll: number }, matrix: [number, number, number, number, number, number, number, number, number] } => {\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const degrees = (theta) => (theta * 180) / Math.PI;\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; let thetaY; let thetaZ;\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 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 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] };\n\n const size = Math.max(face.boxRaw[2] * image_size[0], face.boxRaw[3] * image_size[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] * image_size[0] / size,\n pt[1] * image_size[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 return { angle, matrix };\n};\n\nexport const detectFace = async (parent, input): 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 genderRes;\n let emotionRes;\n let embeddingRes;\n let descRes;\n const faceRes: Array<{\n confidence: number,\n boxConfidence: number,\n faceConfidence: number,\n box: [number, number, number, number],\n mesh: Array<[number, number, number]>\n meshRaw: Array<[number, number, number]>\n boxRaw: [number, number, number, number],\n annotations: Array<{ part: string, points: Array<[number, number, number]>[] }>,\n age: number,\n gender: string,\n genderConfidence: number,\n emotion: string,\n embedding: number[],\n iris: number,\n rotation: {\n angle: { pitch: number, yaw: number, roll: number },\n matrix: [number, number, number, number, number, number, number, number, number]\n },\n tensor: Tensor,\n }> = [];\n parent.state = 'run:face';\n timeStamp = now();\n const faces = await facemesh.predict(input, parent.config);\n parent.perf.face = Math.trunc(now() - timeStamp);\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 if (!faces[i].image || faces[i].image.isDisposedInternal) {\n log('Face object is disposed:', faces[i].image);\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].image, 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].image, parent.config, i, faces.length) : {};\n parent.perf.emotion = Math.trunc(now() - timeStamp);\n }\n parent.analyze('End Emotion:');\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], 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].image, parent.config, i, faces.length) : [];\n parent.perf.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] = await Promise.all([ageRes, genderRes, emotionRes, embeddingRes, descRes]);\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 /* average human iris size is 11.7mm */\n ? 11.7 * 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]))\n : 0;\n\n // combine results\n faceRes.push({\n ...faces[i],\n age: descRes.age,\n gender: descRes.gender,\n genderConfidence: descRes.genderConfidence,\n embedding: descRes.descriptor,\n emotion: emotionRes,\n iris: (irisSize !== 0) ? Math.trunc(irisSize) / 100 : 0,\n rotation,\n tensor: parent.config.face.detector.return ? faces[i].image?.squeeze() : null,\n });\n // dispose original face tensor\n faces[i].image?.dispose();\n\n parent.analyze('End Face');\n }\n parent.analyze('End FaceMesh:');\n if (parent.config.async) {\n if (parent.perf.face) delete parent.perf.face;\n if (parent.perf.age) delete parent.perf.age;\n if (parent.perf.gender) delete parent.perf.gender;\n if (parent.perf.emotion) delete parent.perf.emotion;\n }\n return faceRes;\n};\n", "import { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as poses from './poses';\nimport * as util from './utils';\n\nlet model;\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, config) {\n const res = tf.tidy(() => {\n const resized = input.resizeBilinear([model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n const normalized = resized.toFloat().div(127.5).sub(1.0);\n const results = model.execute(normalized, poseNetOutputs);\n const results3d = results.map((y) => y.squeeze([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.buffer()));\n for (const t of res) t.dispose();\n\n const decoded = await poses.decode(buffers[0], buffers[1], buffers[2], buffers[3], config.body.maxDetected, config.body.minConfidence);\n const scaled = util.scalePoses(decoded, [input.shape[1], input.shape[2]], [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n return scaled;\n}\n\nexport async function load(config) {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.body.modelPath));\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", "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';\n\nexport function eitherPointDoesntMeetConfidence(a, b, minConfidence) {\n return (a < minConfidence || b < minConfidence);\n}\n\nexport function getAdjacentKeyPoints(keypoints, minConfidence) {\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) {\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]) {\n const scalePose = (pose, scaleY, scaleX) => ({\n score: pose.score,\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: { x: Math.trunc(position.x * scaleX), y: Math.trunc(position.y * scaleY) },\n })),\n });\n const scaledPoses = poses.map((pose) => scalePose(pose, height / inputResolutionHeight, width / inputResolutionWidth));\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: any;\n numberOfElements: number;\n getElementValue: any;\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 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: any, box: any, 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 const rootImageCoords = utils.getImageCoords(root.part, outputStride, offsets);\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", "import { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as handdetector from './handdetector';\nimport * as handpipeline from './handpipeline';\n\nconst meshAnnotations = {\n thumb: [1, 2, 3, 4],\n indexFinger: [5, 6, 7, 8],\n middleFinger: [9, 10, 11, 12],\n ringFinger: [13, 14, 15, 16],\n pinky: [17, 18, 19, 20],\n palmBase: [0],\n};\n\nlet handDetectorModel;\nlet handPoseModel;\nlet handPipeline;\n\nexport async function predict(input, config) {\n const predictions = await handPipeline.estimateHands(input, config);\n if (!predictions) return [];\n const hands: Array<{ confidence: number, box: any, boxRaw: any, landmarks: any, annotations: any }> = [];\n for (const prediction of predictions) {\n const annotations = {};\n if (prediction.landmarks) {\n for (const key of Object.keys(meshAnnotations)) {\n annotations[key] = meshAnnotations[key].map((index) => prediction.landmarks[index]);\n }\n }\n const box = prediction.box ? [\n Math.max(0, prediction.box.topLeft[0]),\n Math.max(0, prediction.box.topLeft[1]),\n Math.min(input.shape[2], prediction.box.bottomRight[0]) - Math.max(0, prediction.box.topLeft[0]),\n Math.min(input.shape[1], prediction.box.bottomRight[1]) - Math.max(0, prediction.box.topLeft[1]),\n ] : [];\n const boxRaw = [\n (prediction.box.topLeft[0]) / input.shape[2],\n (prediction.box.topLeft[1]) / input.shape[1],\n (prediction.box.bottomRight[0] - prediction.box.topLeft[0]) / input.shape[2],\n (prediction.box.bottomRight[1] - prediction.box.topLeft[1]) / input.shape[1],\n ];\n hands.push({ confidence: Math.round(100 * prediction.confidence) / 100, box, boxRaw, landmarks: prediction.landmarks, annotations });\n }\n return hands;\n}\n\nexport async function load(config): Promise<[Object, Object]> {\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') }) : null,\n config.hand.landmarks ? tf.loadGraphModel(join(config.modelBasePath, config.hand.skeleton.modelPath), { fromTFHub: config.hand.skeleton.modelPath.includes('tfhub.dev') }) : 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", "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 {\n x: 0.015625,\n y: 0.015625,\n },\n {\n x: 0.015625,\n y: 0.015625,\n },\n {\n x: 0.046875,\n y: 0.015625,\n },\n {\n x: 0.046875,\n y: 0.015625,\n },\n {\n x: 0.078125,\n y: 0.015625,\n },\n {\n x: 0.078125,\n y: 0.015625,\n },\n {\n x: 0.109375,\n y: 0.015625,\n },\n {\n x: 0.109375,\n y: 0.015625,\n },\n {\n x: 0.140625,\n y: 0.015625,\n },\n {\n x: 0.140625,\n y: 0.015625,\n },\n {\n x: 0.171875,\n y: 0.015625,\n },\n {\n x: 0.171875,\n y: 0.015625,\n },\n {\n x: 0.203125,\n y: 0.015625,\n },\n {\n x: 0.203125,\n y: 0.015625,\n },\n {\n x: 0.234375,\n y: 0.015625,\n },\n {\n x: 0.234375,\n y: 0.015625,\n },\n {\n x: 0.265625,\n y: 0.015625,\n },\n {\n x: 0.265625,\n y: 0.015625,\n },\n {\n x: 0.296875,\n y: 0.015625,\n },\n {\n x: 0.296875,\n y: 0.015625,\n },\n {\n x: 0.328125,\n y: 0.015625,\n },\n {\n x: 0.328125,\n y: 0.015625,\n },\n {\n x: 0.359375,\n y: 0.015625,\n },\n {\n x: 0.359375,\n y: 0.015625,\n },\n {\n x: 0.390625,\n y: 0.015625,\n },\n {\n x: 0.390625,\n y: 0.015625,\n },\n {\n x: 0.421875,\n y: 0.015625,\n },\n {\n x: 0.421875,\n y: 0.015625,\n },\n {\n x: 0.453125,\n y: 0.015625,\n },\n {\n x: 0.453125,\n y: 0.015625,\n },\n {\n x: 0.484375,\n y: 0.015625,\n },\n {\n x: 0.484375,\n y: 0.015625,\n },\n {\n x: 0.515625,\n y: 0.015625,\n },\n {\n x: 0.515625,\n y: 0.015625,\n },\n {\n x: 0.546875,\n y: 0.015625,\n },\n {\n x: 0.546875,\n y: 0.015625,\n },\n {\n x: 0.578125,\n y: 0.015625,\n },\n {\n x: 0.578125,\n y: 0.015625,\n },\n {\n x: 0.609375,\n y: 0.015625,\n },\n {\n x: 0.609375,\n y: 0.015625,\n },\n {\n x: 0.640625,\n y: 0.015625,\n },\n {\n x: 0.640625,\n y: 0.015625,\n },\n {\n x: 0.671875,\n y: 0.015625,\n },\n {\n x: 0.671875,\n y: 0.015625,\n },\n {\n x: 0.703125,\n y: 0.015625,\n },\n {\n x: 0.703125,\n y: 0.015625,\n },\n {\n x: 0.734375,\n y: 0.015625,\n },\n {\n x: 0.734375,\n y: 0.015625,\n },\n {\n x: 0.765625,\n y: 0.015625,\n },\n {\n x: 0.765625,\n y: 0.015625,\n },\n {\n x: 0.796875,\n y: 0.015625,\n },\n {\n x: 0.796875,\n y: 0.015625,\n },\n {\n x: 0.828125,\n y: 0.015625,\n },\n {\n x: 0.828125,\n y: 0.015625,\n },\n {\n x: 0.859375,\n y: 0.015625,\n },\n {\n x: 0.859375,\n y: 0.015625,\n },\n {\n x: 0.890625,\n y: 0.015625,\n },\n {\n x: 0.890625,\n y: 0.015625,\n },\n {\n x: 0.921875,\n y: 0.015625,\n },\n {\n x: 0.921875,\n y: 0.015625,\n },\n {\n x: 0.953125,\n y: 0.015625,\n },\n {\n x: 0.953125,\n y: 0.015625,\n },\n {\n x: 0.984375,\n y: 0.015625,\n },\n {\n x: 0.984375,\n y: 0.015625,\n },\n {\n x: 0.015625,\n y: 0.046875,\n },\n {\n x: 0.015625,\n y: 0.046875,\n },\n {\n x: 0.046875,\n y: 0.046875,\n },\n {\n x: 0.046875,\n y: 0.046875,\n },\n {\n x: 0.078125,\n y: 0.046875,\n },\n {\n x: 0.078125,\n y: 0.046875,\n },\n {\n x: 0.109375,\n y: 0.046875,\n },\n {\n x: 0.109375,\n y: 0.046875,\n },\n {\n x: 0.140625,\n y: 0.046875,\n },\n {\n x: 0.140625,\n y: 0.046875,\n },\n {\n x: 0.171875,\n y: 0.046875,\n },\n {\n x: 0.171875,\n y: 0.046875,\n },\n {\n x: 0.203125,\n y: 0.046875,\n },\n {\n x: 0.203125,\n y: 0.046875,\n },\n {\n x: 0.234375,\n y: 0.046875,\n },\n {\n x: 0.234375,\n y: 0.046875,\n },\n {\n x: 0.265625,\n y: 0.046875,\n },\n {\n x: 0.265625,\n y: 0.046875,\n },\n {\n x: 0.296875,\n y: 0.046875,\n },\n {\n x: 0.296875,\n y: 0.046875,\n },\n {\n x: 0.328125,\n y: 0.046875,\n },\n {\n x: 0.328125,\n y: 0.046875,\n },\n {\n x: 0.359375,\n y: 0.046875,\n },\n {\n x: 0.359375,\n y: 0.046875,\n },\n {\n x: 0.390625,\n y: 0.046875,\n },\n {\n x: 0.390625,\n y: 0.046875,\n },\n {\n x: 0.421875,\n y: 0.046875,\n },\n {\n x: 0.421875,\n y: 0.046875,\n },\n {\n x: 0.453125,\n y: 0.046875,\n },\n {\n x: 0.453125,\n y: 0.046875,\n },\n {\n x: 0.484375,\n y: 0.046875,\n },\n {\n x: 0.484375,\n y: 0.046875,\n },\n {\n x: 0.515625,\n y: 0.046875,\n },\n {\n x: 0.515625,\n y: 0.046875,\n },\n {\n x: 0.546875,\n y: 0.046875,\n },\n {\n x: 0.546875,\n y: 0.046875,\n },\n {\n x: 0.578125,\n y: 0.046875,\n },\n {\n x: 0.578125,\n y: 0.046875,\n },\n {\n x: 0.609375,\n y: 0.046875,\n },\n {\n x: 0.609375,\n y: 0.046875,\n },\n {\n x: 0.640625,\n y: 0.046875,\n },\n {\n x: 0.640625,\n y: 0.046875,\n },\n {\n x: 0.671875,\n y: 0.046875,\n },\n {\n x: 0.671875,\n y: 0.046875,\n },\n {\n x: 0.703125,\n y: 0.046875,\n },\n {\n x: 0.703125,\n y: 0.046875,\n },\n {\n x: 0.734375,\n y: 0.046875,\n },\n {\n x: 0.734375,\n y: 0.046875,\n },\n {\n x: 0.765625,\n y: 0.046875,\n },\n {\n x: 0.765625,\n y: 0.046875,\n },\n {\n x: 0.796875,\n y: 0.046875,\n },\n {\n x: 0.796875,\n y: 0.046875,\n },\n {\n x: 0.828125,\n y: 0.046875,\n },\n {\n x: 0.828125,\n y: 0.046875,\n },\n {\n x: 0.859375,\n y: 0.046875,\n },\n {\n x: 0.859375,\n y: 0.046875,\n },\n {\n x: 0.890625,\n y: 0.046875,\n },\n {\n x: 0.890625,\n y: 0.046875,\n },\n {\n x: 0.921875,\n y: 0.046875,\n },\n {\n x: 0.921875,\n y: 0.046875,\n },\n {\n x: 0.953125,\n y: 0.046875,\n },\n {\n x: 0.953125,\n y: 0.046875,\n },\n {\n x: 0.984375,\n y: 0.046875,\n },\n {\n x: 0.984375,\n y: 0.046875,\n },\n {\n x: 0.015625,\n y: 0.078125,\n },\n {\n x: 0.015625,\n y: 0.078125,\n },\n {\n x: 0.046875,\n y: 0.078125,\n },\n {\n x: 0.046875,\n y: 0.078125,\n },\n {\n x: 0.078125,\n y: 0.078125,\n },\n {\n x: 0.078125,\n y: 0.078125,\n },\n {\n x: 0.109375,\n y: 0.078125,\n },\n {\n x: 0.109375,\n y: 0.078125,\n },\n {\n x: 0.140625,\n y: 0.078125,\n },\n {\n x: 0.140625,\n y: 0.078125,\n },\n {\n x: 0.171875,\n y: 0.078125,\n },\n {\n x: 0.171875,\n y: 0.078125,\n },\n {\n x: 0.203125,\n y: 0.078125,\n },\n {\n x: 0.203125,\n y: 0.078125,\n },\n {\n x: 0.234375,\n y: 0.078125,\n },\n {\n x: 0.234375,\n y: 0.078125,\n },\n {\n x: 0.265625,\n y: 0.078125,\n },\n {\n x: 0.265625,\n y: 0.078125,\n },\n {\n x: 0.296875,\n y: 0.078125,\n },\n {\n x: 0.296875,\n y: 0.078125,\n },\n {\n x: 0.328125,\n y: 0.078125,\n },\n {\n x: 0.328125,\n y: 0.078125,\n },\n {\n x: 0.359375,\n y: 0.078125,\n },\n {\n x: 0.359375,\n y: 0.078125,\n },\n {\n x: 0.390625,\n y: 0.078125,\n },\n {\n x: 0.390625,\n y: 0.078125,\n },\n {\n x: 0.421875,\n y: 0.078125,\n },\n {\n x: 0.421875,\n y: 0.078125,\n },\n {\n x: 0.453125,\n y: 0.078125,\n },\n {\n x: 0.453125,\n y: 0.078125,\n },\n {\n x: 0.484375,\n y: 0.078125,\n },\n {\n x: 0.484375,\n y: 0.078125,\n },\n {\n x: 0.515625,\n y: 0.078125,\n },\n {\n x: 0.515625,\n y: 0.078125,\n },\n {\n x: 0.546875,\n y: 0.078125,\n },\n {\n x: 0.546875,\n y: 0.078125,\n },\n {\n x: 0.578125,\n y: 0.078125,\n },\n {\n x: 0.578125,\n y: 0.078125,\n },\n {\n x: 0.609375,\n y: 0.078125,\n },\n {\n x: 0.609375,\n y: 0.078125,\n },\n {\n x: 0.640625,\n y: 0.078125,\n },\n {\n x: 0.640625,\n y: 0.078125,\n },\n {\n x: 0.671875,\n y: 0.078125,\n },\n {\n x: 0.671875,\n y: 0.078125,\n },\n {\n x: 0.703125,\n y: 0.078125,\n },\n {\n x: 0.703125,\n y: 0.078125,\n },\n {\n x: 0.734375,\n y: 0.078125,\n },\n {\n x: 0.734375,\n y: 0.078125,\n },\n {\n x: 0.765625,\n y: 0.078125,\n },\n {\n x: 0.765625,\n y: 0.078125,\n },\n {\n x: 0.796875,\n y: 0.078125,\n },\n {\n x: 0.796875,\n y: 0.078125,\n },\n {\n x: 0.828125,\n y: 0.078125,\n },\n {\n x: 0.828125,\n y: 0.078125,\n },\n {\n x: 0.859375,\n y: 0.078125,\n },\n {\n x: 0.859375,\n y: 0.078125,\n },\n {\n x: 0.890625,\n y: 0.078125,\n },\n {\n x: 0.890625,\n y: 0.078125,\n },\n {\n x: 0.921875,\n y: 0.078125,\n },\n {\n x: 0.921875,\n y: 0.078125,\n },\n {\n x: 0.953125,\n y: 0.078125,\n },\n {\n x: 0.953125,\n y: 0.078125,\n },\n {\n x: 0.984375,\n y: 0.078125,\n },\n {\n x: 0.984375,\n y: 0.078125,\n },\n {\n x: 0.015625,\n y: 0.109375,\n },\n {\n x: 0.015625,\n y: 0.109375,\n },\n {\n x: 0.046875,\n y: 0.109375,\n },\n {\n x: 0.046875,\n y: 0.109375,\n },\n {\n x: 0.078125,\n y: 0.109375,\n },\n {\n x: 0.078125,\n y: 0.109375,\n },\n {\n x: 0.109375,\n y: 0.109375,\n },\n {\n x: 0.109375,\n y: 0.109375,\n },\n {\n x: 0.140625,\n y: 0.109375,\n },\n {\n x: 0.140625,\n y: 0.109375,\n },\n {\n x: 0.171875,\n y: 0.109375,\n },\n {\n x: 0.171875,\n y: 0.109375,\n },\n {\n x: 0.203125,\n y: 0.109375,\n },\n {\n x: 0.203125,\n y: 0.109375,\n },\n {\n x: 0.234375,\n y: 0.109375,\n },\n {\n x: 0.234375,\n y: 0.109375,\n },\n {\n x: 0.265625,\n y: 0.109375,\n },\n {\n x: 0.265625,\n y: 0.109375,\n },\n {\n x: 0.296875,\n y: 0.109375,\n },\n {\n x: 0.296875,\n y: 0.109375,\n },\n {\n x: 0.328125,\n y: 0.109375,\n },\n {\n x: 0.328125,\n y: 0.109375,\n },\n {\n x: 0.359375,\n y: 0.109375,\n },\n {\n x: 0.359375,\n y: 0.109375,\n },\n {\n x: 0.390625,\n y: 0.109375,\n },\n {\n x: 0.390625,\n y: 0.109375,\n },\n {\n x: 0.421875,\n y: 0.109375,\n },\n {\n x: 0.421875,\n y: 0.109375,\n },\n {\n x: 0.453125,\n y: 0.109375,\n },\n {\n x: 0.453125,\n y: 0.109375,\n },\n {\n x: 0.484375,\n y: 0.109375,\n },\n {\n x: 0.484375,\n y: 0.109375,\n },\n {\n x: 0.515625,\n y: 0.109375,\n },\n {\n x: 0.515625,\n y: 0.109375,\n },\n {\n x: 0.546875,\n y: 0.109375,\n },\n {\n x: 0.546875,\n y: 0.109375,\n },\n {\n x: 0.578125,\n y: 0.109375,\n },\n {\n x: 0.578125,\n y: 0.109375,\n },\n {\n x: 0.609375,\n y: 0.109375,\n },\n {\n x: 0.609375,\n y: 0.109375,\n },\n {\n x: 0.640625,\n y: 0.109375,\n },\n {\n x: 0.640625,\n y: 0.109375,\n },\n {\n x: 0.671875,\n y: 0.109375,\n },\n {\n x: 0.671875,\n y: 0.109375,\n },\n {\n x: 0.703125,\n y: 0.109375,\n },\n {\n x: 0.703125,\n y: 0.109375,\n },\n {\n x: 0.734375,\n y: 0.109375,\n },\n {\n x: 0.734375,\n y: 0.109375,\n },\n {\n x: 0.765625,\n y: 0.109375,\n },\n {\n x: 0.765625,\n y: 0.109375,\n },\n {\n x: 0.796875,\n y: 0.109375,\n },\n {\n x: 0.796875,\n y: 0.109375,\n },\n {\n x: 0.828125,\n y: 0.109375,\n },\n {\n x: 0.828125,\n y: 0.109375,\n },\n {\n x: 0.859375,\n y: 0.109375,\n },\n {\n x: 0.859375,\n y: 0.109375,\n },\n {\n x: 0.890625,\n y: 0.109375,\n },\n {\n x: 0.890625,\n y: 0.109375,\n },\n {\n x: 0.921875,\n y: 0.109375,\n },\n {\n x: 0.921875,\n y: 0.109375,\n },\n {\n x: 0.953125,\n y: 0.109375,\n },\n {\n x: 0.953125,\n y: 0.109375,\n },\n {\n x: 0.984375,\n y: 0.109375,\n },\n {\n x: 0.984375,\n y: 0.109375,\n },\n {\n x: 0.015625,\n y: 0.140625,\n },\n {\n x: 0.015625,\n y: 0.140625,\n },\n {\n x: 0.046875,\n y: 0.140625,\n },\n {\n x: 0.046875,\n y: 0.140625,\n },\n {\n x: 0.078125,\n y: 0.140625,\n },\n {\n x: 0.078125,\n y: 0.140625,\n },\n {\n x: 0.109375,\n y: 0.140625,\n },\n {\n x: 0.109375,\n y: 0.140625,\n },\n {\n x: 0.140625,\n y: 0.140625,\n },\n {\n x: 0.140625,\n y: 0.140625,\n },\n {\n x: 0.171875,\n y: 0.140625,\n },\n {\n x: 0.171875,\n y: 0.140625,\n },\n {\n x: 0.203125,\n y: 0.140625,\n },\n {\n x: 0.203125,\n y: 0.140625,\n },\n {\n x: 0.234375,\n y: 0.140625,\n },\n {\n x: 0.234375,\n y: 0.140625,\n },\n {\n x: 0.265625,\n y: 0.140625,\n },\n {\n x: 0.265625,\n y: 0.140625,\n },\n {\n x: 0.296875,\n y: 0.140625,\n },\n {\n x: 0.296875,\n y: 0.140625,\n },\n {\n x: 0.328125,\n y: 0.140625,\n },\n {\n x: 0.328125,\n y: 0.140625,\n },\n {\n x: 0.359375,\n y: 0.140625,\n },\n {\n x: 0.359375,\n y: 0.140625,\n },\n {\n x: 0.390625,\n y: 0.140625,\n },\n {\n x: 0.390625,\n y: 0.140625,\n },\n {\n x: 0.421875,\n y: 0.140625,\n },\n {\n x: 0.421875,\n y: 0.140625,\n },\n {\n x: 0.453125,\n y: 0.140625,\n },\n {\n x: 0.453125,\n y: 0.140625,\n },\n {\n x: 0.484375,\n y: 0.140625,\n },\n {\n x: 0.484375,\n y: 0.140625,\n },\n {\n x: 0.515625,\n y: 0.140625,\n },\n {\n x: 0.515625,\n y: 0.140625,\n },\n {\n x: 0.546875,\n y: 0.140625,\n },\n {\n x: 0.546875,\n y: 0.140625,\n },\n {\n x: 0.578125,\n y: 0.140625,\n },\n {\n x: 0.578125,\n y: 0.140625,\n },\n {\n x: 0.609375,\n y: 0.140625,\n },\n {\n x: 0.609375,\n y: 0.140625,\n },\n {\n x: 0.640625,\n y: 0.140625,\n },\n {\n x: 0.640625,\n y: 0.140625,\n },\n {\n x: 0.671875,\n y: 0.140625,\n },\n {\n x: 0.671875,\n y: 0.140625,\n },\n {\n x: 0.703125,\n y: 0.140625,\n },\n {\n x: 0.703125,\n y: 0.140625,\n },\n {\n x: 0.734375,\n y: 0.140625,\n },\n {\n x: 0.734375,\n y: 0.140625,\n },\n {\n x: 0.765625,\n y: 0.140625,\n },\n {\n x: 0.765625,\n y: 0.140625,\n },\n {\n x: 0.796875,\n y: 0.140625,\n },\n {\n x: 0.796875,\n y: 0.140625,\n },\n {\n x: 0.828125,\n y: 0.140625,\n },\n {\n x: 0.828125,\n y: 0.140625,\n },\n {\n x: 0.859375,\n y: 0.140625,\n },\n {\n x: 0.859375,\n y: 0.140625,\n },\n {\n x: 0.890625,\n y: 0.140625,\n },\n {\n x: 0.890625,\n y: 0.140625,\n },\n {\n x: 0.921875,\n y: 0.140625,\n },\n {\n x: 0.921875,\n y: 0.140625,\n },\n {\n x: 0.953125,\n y: 0.140625,\n },\n {\n x: 0.953125,\n y: 0.140625,\n },\n {\n x: 0.984375,\n y: 0.140625,\n },\n {\n x: 0.984375,\n y: 0.140625,\n },\n {\n x: 0.015625,\n y: 0.171875,\n },\n {\n x: 0.015625,\n y: 0.171875,\n },\n {\n x: 0.046875,\n y: 0.171875,\n },\n {\n x: 0.046875,\n y: 0.171875,\n },\n {\n x: 0.078125,\n y: 0.171875,\n },\n {\n x: 0.078125,\n y: 0.171875,\n },\n {\n x: 0.109375,\n y: 0.171875,\n },\n {\n x: 0.109375,\n y: 0.171875,\n },\n {\n x: 0.140625,\n y: 0.171875,\n },\n {\n x: 0.140625,\n y: 0.171875,\n },\n {\n x: 0.171875,\n y: 0.171875,\n },\n {\n x: 0.171875,\n y: 0.171875,\n },\n {\n x: 0.203125,\n y: 0.171875,\n },\n {\n x: 0.203125,\n y: 0.171875,\n },\n {\n x: 0.234375,\n y: 0.171875,\n },\n {\n x: 0.234375,\n y: 0.171875,\n },\n {\n x: 0.265625,\n y: 0.171875,\n },\n {\n x: 0.265625,\n y: 0.171875,\n },\n {\n x: 0.296875,\n y: 0.171875,\n },\n {\n x: 0.296875,\n y: 0.171875,\n },\n {\n x: 0.328125,\n y: 0.171875,\n },\n {\n x: 0.328125,\n y: 0.171875,\n },\n {\n x: 0.359375,\n y: 0.171875,\n },\n {\n x: 0.359375,\n y: 0.171875,\n },\n {\n x: 0.390625,\n y: 0.171875,\n },\n {\n x: 0.390625,\n y: 0.171875,\n },\n {\n x: 0.421875,\n y: 0.171875,\n },\n {\n x: 0.421875,\n y: 0.171875,\n },\n {\n x: 0.453125,\n y: 0.171875,\n },\n {\n x: 0.453125,\n y: 0.171875,\n },\n {\n x: 0.484375,\n y: 0.171875,\n },\n {\n x: 0.484375,\n y: 0.171875,\n },\n {\n x: 0.515625,\n y: 0.171875,\n },\n {\n x: 0.515625,\n y: 0.171875,\n },\n {\n x: 0.546875,\n y: 0.171875,\n },\n {\n x: 0.546875,\n y: 0.171875,\n },\n {\n x: 0.578125,\n y: 0.171875,\n },\n {\n x: 0.578125,\n y: 0.171875,\n },\n {\n x: 0.609375,\n y: 0.171875,\n },\n {\n x: 0.609375,\n y: 0.171875,\n },\n {\n x: 0.640625,\n y: 0.171875,\n },\n {\n x: 0.640625,\n y: 0.171875,\n },\n {\n x: 0.671875,\n y: 0.171875,\n },\n {\n x: 0.671875,\n y: 0.171875,\n },\n {\n x: 0.703125,\n y: 0.171875,\n },\n {\n x: 0.703125,\n y: 0.171875,\n },\n {\n x: 0.734375,\n y: 0.171875,\n },\n {\n x: 0.734375,\n y: 0.171875,\n },\n {\n x: 0.765625,\n y: 0.171875,\n },\n {\n x: 0.765625,\n y: 0.171875,\n },\n {\n x: 0.796875,\n y: 0.171875,\n },\n {\n x: 0.796875,\n y: 0.171875,\n },\n {\n x: 0.828125,\n y: 0.171875,\n },\n {\n x: 0.828125,\n y: 0.171875,\n },\n {\n x: 0.859375,\n y: 0.171875,\n },\n {\n x: 0.859375,\n y: 0.171875,\n },\n {\n x: 0.890625,\n y: 0.171875,\n },\n {\n x: 0.890625,\n y: 0.171875,\n },\n {\n x: 0.921875,\n y: 0.171875,\n },\n {\n x: 0.921875,\n y: 0.171875,\n },\n {\n x: 0.953125,\n y: 0.171875,\n },\n {\n x: 0.953125,\n y: 0.171875,\n },\n {\n x: 0.984375,\n y: 0.171875,\n },\n {\n x: 0.984375,\n y: 0.171875,\n },\n {\n x: 0.015625,\n y: 0.203125,\n },\n {\n x: 0.015625,\n y: 0.203125,\n },\n {\n x: 0.046875,\n y: 0.203125,\n },\n {\n x: 0.046875,\n y: 0.203125,\n },\n {\n x: 0.078125,\n y: 0.203125,\n },\n {\n x: 0.078125,\n y: 0.203125,\n },\n {\n x: 0.109375,\n y: 0.203125,\n },\n {\n x: 0.109375,\n y: 0.203125,\n },\n {\n x: 0.140625,\n y: 0.203125,\n },\n {\n x: 0.140625,\n y: 0.203125,\n },\n {\n x: 0.171875,\n y: 0.203125,\n },\n {\n x: 0.171875,\n y: 0.203125,\n },\n {\n x: 0.203125,\n y: 0.203125,\n },\n {\n x: 0.203125,\n y: 0.203125,\n },\n {\n x: 0.234375,\n y: 0.203125,\n },\n {\n x: 0.234375,\n y: 0.203125,\n },\n {\n x: 0.265625,\n y: 0.203125,\n },\n {\n x: 0.265625,\n y: 0.203125,\n },\n {\n x: 0.296875,\n y: 0.203125,\n },\n {\n x: 0.296875,\n y: 0.203125,\n },\n {\n x: 0.328125,\n y: 0.203125,\n },\n {\n x: 0.328125,\n y: 0.203125,\n },\n {\n x: 0.359375,\n y: 0.203125,\n },\n {\n x: 0.359375,\n y: 0.203125,\n },\n {\n x: 0.390625,\n y: 0.203125,\n },\n {\n x: 0.390625,\n y: 0.203125,\n },\n {\n x: 0.421875,\n y: 0.203125,\n },\n {\n x: 0.421875,\n y: 0.203125,\n },\n {\n x: 0.453125,\n y: 0.203125,\n },\n {\n x: 0.453125,\n y: 0.203125,\n },\n {\n x: 0.484375,\n y: 0.203125,\n },\n {\n x: 0.484375,\n y: 0.203125,\n },\n {\n x: 0.515625,\n y: 0.203125,\n },\n {\n x: 0.515625,\n y: 0.203125,\n },\n {\n x: 0.546875,\n y: 0.203125,\n },\n {\n x: 0.546875,\n y: 0.203125,\n },\n {\n x: 0.578125,\n y: 0.203125,\n },\n {\n x: 0.578125,\n y: 0.203125,\n },\n {\n x: 0.609375,\n y: 0.203125,\n },\n {\n x: 0.609375,\n y: 0.203125,\n },\n {\n x: 0.640625,\n y: 0.203125,\n },\n {\n x: 0.640625,\n y: 0.203125,\n },\n {\n x: 0.671875,\n y: 0.203125,\n },\n {\n x: 0.671875,\n y: 0.203125,\n },\n {\n x: 0.703125,\n y: 0.203125,\n },\n {\n x: 0.703125,\n y: 0.203125,\n },\n {\n x: 0.734375,\n y: 0.203125,\n },\n {\n x: 0.734375,\n y: 0.203125,\n },\n {\n x: 0.765625,\n y: 0.203125,\n },\n {\n x: 0.765625,\n y: 0.203125,\n },\n {\n x: 0.796875,\n y: 0.203125,\n },\n {\n x: 0.796875,\n y: 0.203125,\n },\n {\n x: 0.828125,\n y: 0.203125,\n },\n {\n x: 0.828125,\n y: 0.203125,\n },\n {\n x: 0.859375,\n y: 0.203125,\n },\n {\n x: 0.859375,\n y: 0.203125,\n },\n {\n x: 0.890625,\n y: 0.203125,\n },\n {\n x: 0.890625,\n y: 0.203125,\n },\n {\n x: 0.921875,\n y: 0.203125,\n },\n {\n x: 0.921875,\n y: 0.203125,\n },\n {\n x: 0.953125,\n y: 0.203125,\n },\n {\n x: 0.953125,\n y: 0.203125,\n },\n {\n x: 0.984375,\n y: 0.203125,\n },\n {\n x: 0.984375,\n y: 0.203125,\n },\n {\n x: 0.015625,\n y: 0.234375,\n },\n {\n x: 0.015625,\n y: 0.234375,\n },\n {\n x: 0.046875,\n y: 0.234375,\n },\n {\n x: 0.046875,\n y: 0.234375,\n },\n {\n x: 0.078125,\n y: 0.234375,\n },\n {\n x: 0.078125,\n y: 0.234375,\n },\n {\n x: 0.109375,\n y: 0.234375,\n },\n {\n x: 0.109375,\n y: 0.234375,\n },\n {\n x: 0.140625,\n y: 0.234375,\n },\n {\n x: 0.140625,\n y: 0.234375,\n },\n {\n x: 0.171875,\n y: 0.234375,\n },\n {\n x: 0.171875,\n y: 0.234375,\n },\n {\n x: 0.203125,\n y: 0.234375,\n },\n {\n x: 0.203125,\n y: 0.234375,\n },\n {\n x: 0.234375,\n y: 0.234375,\n },\n {\n x: 0.234375,\n y: 0.234375,\n },\n {\n x: 0.265625,\n y: 0.234375,\n },\n {\n x: 0.265625,\n y: 0.234375,\n },\n {\n x: 0.296875,\n y: 0.234375,\n },\n {\n x: 0.296875,\n y: 0.234375,\n },\n {\n x: 0.328125,\n y: 0.234375,\n },\n {\n x: 0.328125,\n y: 0.234375,\n },\n {\n x: 0.359375,\n y: 0.234375,\n },\n {\n x: 0.359375,\n y: 0.234375,\n },\n {\n x: 0.390625,\n y: 0.234375,\n },\n {\n x: 0.390625,\n y: 0.234375,\n },\n {\n x: 0.421875,\n y: 0.234375,\n },\n {\n x: 0.421875,\n y: 0.234375,\n },\n {\n x: 0.453125,\n y: 0.234375,\n },\n {\n x: 0.453125,\n y: 0.234375,\n },\n {\n x: 0.484375,\n y: 0.234375,\n },\n {\n x: 0.484375,\n y: 0.234375,\n },\n {\n x: 0.515625,\n y: 0.234375,\n },\n {\n x: 0.515625,\n y: 0.234375,\n },\n {\n x: 0.546875,\n y: 0.234375,\n },\n {\n x: 0.546875,\n y: 0.234375,\n },\n {\n x: 0.578125,\n y: 0.234375,\n },\n {\n x: 0.578125,\n y: 0.234375,\n },\n {\n x: 0.609375,\n y: 0.234375,\n },\n {\n x: 0.609375,\n y: 0.234375,\n },\n {\n x: 0.640625,\n y: 0.234375,\n },\n {\n x: 0.640625,\n y: 0.234375,\n },\n {\n x: 0.671875,\n y: 0.234375,\n },\n {\n x: 0.671875,\n y: 0.234375,\n },\n {\n x: 0.703125,\n y: 0.234375,\n },\n {\n x: 0.703125,\n y: 0.234375,\n },\n {\n x: 0.734375,\n y: 0.234375,\n },\n {\n x: 0.734375,\n y: 0.234375,\n },\n {\n x: 0.765625,\n y: 0.234375,\n },\n {\n x: 0.765625,\n y: 0.234375,\n },\n {\n x: 0.796875,\n y: 0.234375,\n },\n {\n x: 0.796875,\n y: 0.234375,\n },\n {\n x: 0.828125,\n y: 0.234375,\n },\n {\n x: 0.828125,\n y: 0.234375,\n },\n {\n x: 0.859375,\n y: 0.234375,\n },\n {\n x: 0.859375,\n y: 0.234375,\n },\n {\n x: 0.890625,\n y: 0.234375,\n },\n {\n x: 0.890625,\n y: 0.234375,\n },\n {\n x: 0.921875,\n y: 0.234375,\n },\n {\n x: 0.921875,\n y: 0.234375,\n },\n {\n x: 0.953125,\n y: 0.234375,\n },\n {\n x: 0.953125,\n y: 0.234375,\n },\n {\n x: 0.984375,\n y: 0.234375,\n },\n {\n x: 0.984375,\n y: 0.234375,\n },\n {\n x: 0.015625,\n y: 0.265625,\n },\n {\n x: 0.015625,\n y: 0.265625,\n },\n {\n x: 0.046875,\n y: 0.265625,\n },\n {\n x: 0.046875,\n y: 0.265625,\n },\n {\n x: 0.078125,\n y: 0.265625,\n },\n {\n x: 0.078125,\n y: 0.265625,\n },\n {\n x: 0.109375,\n y: 0.265625,\n },\n {\n x: 0.109375,\n y: 0.265625,\n },\n {\n x: 0.140625,\n y: 0.265625,\n },\n {\n x: 0.140625,\n y: 0.265625,\n },\n {\n x: 0.171875,\n y: 0.265625,\n },\n {\n x: 0.171875,\n y: 0.265625,\n },\n {\n x: 0.203125,\n y: 0.265625,\n },\n {\n x: 0.203125,\n y: 0.265625,\n },\n {\n x: 0.234375,\n y: 0.265625,\n },\n {\n x: 0.234375,\n y: 0.265625,\n },\n {\n x: 0.265625,\n y: 0.265625,\n },\n {\n x: 0.265625,\n y: 0.265625,\n },\n {\n x: 0.296875,\n y: 0.265625,\n },\n {\n x: 0.296875,\n y: 0.265625,\n },\n {\n x: 0.328125,\n y: 0.265625,\n },\n {\n x: 0.328125,\n y: 0.265625,\n },\n {\n x: 0.359375,\n y: 0.265625,\n },\n {\n x: 0.359375,\n y: 0.265625,\n },\n {\n x: 0.390625,\n y: 0.265625,\n },\n {\n x: 0.390625,\n y: 0.265625,\n },\n {\n x: 0.421875,\n y: 0.265625,\n },\n {\n x: 0.421875,\n y: 0.265625,\n },\n {\n x: 0.453125,\n y: 0.265625,\n },\n {\n x: 0.453125,\n y: 0.265625,\n },\n {\n x: 0.484375,\n y: 0.265625,\n },\n {\n x: 0.484375,\n y: 0.265625,\n },\n {\n x: 0.515625,\n y: 0.265625,\n },\n {\n x: 0.515625,\n y: 0.265625,\n },\n {\n x: 0.546875,\n y: 0.265625,\n },\n {\n x: 0.546875,\n y: 0.265625,\n },\n {\n x: 0.578125,\n y: 0.265625,\n },\n {\n x: 0.578125,\n y: 0.265625,\n },\n {\n x: 0.609375,\n y: 0.265625,\n },\n {\n x: 0.609375,\n y: 0.265625,\n },\n {\n x: 0.640625,\n y: 0.265625,\n },\n {\n x: 0.640625,\n y: 0.265625,\n },\n {\n x: 0.671875,\n y: 0.265625,\n },\n {\n x: 0.671875,\n y: 0.265625,\n },\n {\n x: 0.703125,\n y: 0.265625,\n },\n {\n x: 0.703125,\n y: 0.265625,\n },\n {\n x: 0.734375,\n y: 0.265625,\n },\n {\n x: 0.734375,\n y: 0.265625,\n },\n {\n x: 0.765625,\n y: 0.265625,\n },\n {\n x: 0.765625,\n y: 0.265625,\n },\n {\n x: 0.796875,\n y: 0.265625,\n },\n {\n x: 0.796875,\n y: 0.265625,\n },\n {\n x: 0.828125,\n y: 0.265625,\n },\n {\n x: 0.828125,\n y: 0.265625,\n },\n {\n x: 0.859375,\n y: 0.265625,\n },\n {\n x: 0.859375,\n y: 0.265625,\n },\n {\n x: 0.890625,\n y: 0.265625,\n },\n {\n x: 0.890625,\n y: 0.265625,\n },\n {\n x: 0.921875,\n y: 0.265625,\n },\n {\n x: 0.921875,\n y: 0.265625,\n },\n {\n x: 0.953125,\n y: 0.265625,\n },\n {\n x: 0.953125,\n y: 0.265625,\n },\n {\n x: 0.984375,\n y: 0.265625,\n },\n {\n x: 0.984375,\n y: 0.265625,\n },\n {\n x: 0.015625,\n y: 0.296875,\n },\n {\n x: 0.015625,\n y: 0.296875,\n },\n {\n x: 0.046875,\n y: 0.296875,\n },\n {\n x: 0.046875,\n y: 0.296875,\n },\n {\n x: 0.078125,\n y: 0.296875,\n },\n {\n x: 0.078125,\n y: 0.296875,\n },\n {\n x: 0.109375,\n y: 0.296875,\n },\n {\n x: 0.109375,\n y: 0.296875,\n },\n {\n x: 0.140625,\n y: 0.296875,\n },\n {\n x: 0.140625,\n y: 0.296875,\n },\n {\n x: 0.171875,\n y: 0.296875,\n },\n {\n x: 0.171875,\n y: 0.296875,\n },\n {\n x: 0.203125,\n y: 0.296875,\n },\n {\n x: 0.203125,\n y: 0.296875,\n },\n {\n x: 0.234375,\n y: 0.296875,\n },\n {\n x: 0.234375,\n y: 0.296875,\n },\n {\n x: 0.265625,\n y: 0.296875,\n },\n {\n x: 0.265625,\n y: 0.296875,\n },\n {\n x: 0.296875,\n y: 0.296875,\n },\n {\n x: 0.296875,\n y: 0.296875,\n },\n {\n x: 0.328125,\n y: 0.296875,\n },\n {\n x: 0.328125,\n y: 0.296875,\n },\n {\n x: 0.359375,\n y: 0.296875,\n },\n {\n x: 0.359375,\n y: 0.296875,\n },\n {\n x: 0.390625,\n y: 0.296875,\n },\n {\n x: 0.390625,\n y: 0.296875,\n },\n {\n x: 0.421875,\n y: 0.296875,\n },\n {\n x: 0.421875,\n y: 0.296875,\n },\n {\n x: 0.453125,\n y: 0.296875,\n },\n {\n x: 0.453125,\n y: 0.296875,\n },\n {\n x: 0.484375,\n y: 0.296875,\n },\n {\n x: 0.484375,\n y: 0.296875,\n },\n {\n x: 0.515625,\n y: 0.296875,\n },\n {\n x: 0.515625,\n y: 0.296875,\n },\n {\n x: 0.546875,\n y: 0.296875,\n },\n {\n x: 0.546875,\n y: 0.296875,\n },\n {\n x: 0.578125,\n y: 0.296875,\n },\n {\n x: 0.578125,\n y: 0.296875,\n },\n {\n x: 0.609375,\n y: 0.296875,\n },\n {\n x: 0.609375,\n y: 0.296875,\n },\n {\n x: 0.640625,\n y: 0.296875,\n },\n {\n x: 0.640625,\n y: 0.296875,\n },\n {\n x: 0.671875,\n y: 0.296875,\n },\n {\n x: 0.671875,\n y: 0.296875,\n },\n {\n x: 0.703125,\n y: 0.296875,\n },\n {\n x: 0.703125,\n y: 0.296875,\n },\n {\n x: 0.734375,\n y: 0.296875,\n },\n {\n x: 0.734375,\n y: 0.296875,\n },\n {\n x: 0.765625,\n y: 0.296875,\n },\n {\n x: 0.765625,\n y: 0.296875,\n },\n {\n x: 0.796875,\n y: 0.296875,\n },\n {\n x: 0.796875,\n y: 0.296875,\n },\n {\n x: 0.828125,\n y: 0.296875,\n },\n {\n x: 0.828125,\n y: 0.296875,\n },\n {\n x: 0.859375,\n y: 0.296875,\n },\n {\n x: 0.859375,\n y: 0.296875,\n },\n {\n x: 0.890625,\n y: 0.296875,\n },\n {\n x: 0.890625,\n y: 0.296875,\n },\n {\n x: 0.921875,\n y: 0.296875,\n },\n {\n x: 0.921875,\n y: 0.296875,\n },\n {\n x: 0.953125,\n y: 0.296875,\n },\n {\n x: 0.953125,\n y: 0.296875,\n },\n {\n x: 0.984375,\n y: 0.296875,\n },\n {\n x: 0.984375,\n y: 0.296875,\n },\n {\n x: 0.015625,\n y: 0.328125,\n },\n {\n x: 0.015625,\n y: 0.328125,\n },\n {\n x: 0.046875,\n y: 0.328125,\n },\n {\n x: 0.046875,\n y: 0.328125,\n },\n {\n x: 0.078125,\n y: 0.328125,\n },\n {\n x: 0.078125,\n y: 0.328125,\n },\n {\n x: 0.109375,\n y: 0.328125,\n },\n {\n x: 0.109375,\n y: 0.328125,\n },\n {\n x: 0.140625,\n y: 0.328125,\n },\n {\n x: 0.140625,\n y: 0.328125,\n },\n {\n x: 0.171875,\n y: 0.328125,\n },\n {\n x: 0.171875,\n y: 0.328125,\n },\n {\n x: 0.203125,\n y: 0.328125,\n },\n {\n x: 0.203125,\n y: 0.328125,\n },\n {\n x: 0.234375,\n y: 0.328125,\n },\n {\n x: 0.234375,\n y: 0.328125,\n },\n {\n x: 0.265625,\n y: 0.328125,\n },\n {\n x: 0.265625,\n y: 0.328125,\n },\n {\n x: 0.296875,\n y: 0.328125,\n },\n {\n x: 0.296875,\n y: 0.328125,\n },\n {\n x: 0.328125,\n y: 0.328125,\n },\n {\n x: 0.328125,\n y: 0.328125,\n },\n {\n x: 0.359375,\n y: 0.328125,\n },\n {\n x: 0.359375,\n y: 0.328125,\n },\n {\n x: 0.390625,\n y: 0.328125,\n },\n {\n x: 0.390625,\n y: 0.328125,\n },\n {\n x: 0.421875,\n y: 0.328125,\n },\n {\n x: 0.421875,\n y: 0.328125,\n },\n {\n x: 0.453125,\n y: 0.328125,\n },\n {\n x: 0.453125,\n y: 0.328125,\n },\n {\n x: 0.484375,\n y: 0.328125,\n },\n {\n x: 0.484375,\n y: 0.328125,\n },\n {\n x: 0.515625,\n y: 0.328125,\n },\n {\n x: 0.515625,\n y: 0.328125,\n },\n {\n x: 0.546875,\n y: 0.328125,\n },\n {\n x: 0.546875,\n y: 0.328125,\n },\n {\n x: 0.578125,\n y: 0.328125,\n },\n {\n x: 0.578125,\n y: 0.328125,\n },\n {\n x: 0.609375,\n y: 0.328125,\n },\n {\n x: 0.609375,\n y: 0.328125,\n },\n {\n x: 0.640625,\n y: 0.328125,\n },\n {\n x: 0.640625,\n y: 0.328125,\n },\n {\n x: 0.671875,\n y: 0.328125,\n },\n {\n x: 0.671875,\n y: 0.328125,\n },\n {\n x: 0.703125,\n y: 0.328125,\n },\n {\n x: 0.703125,\n y: 0.328125,\n },\n {\n x: 0.734375,\n y: 0.328125,\n },\n {\n x: 0.734375,\n y: 0.328125,\n },\n {\n x: 0.765625,\n y: 0.328125,\n },\n {\n x: 0.765625,\n y: 0.328125,\n },\n {\n x: 0.796875,\n y: 0.328125,\n },\n {\n x: 0.796875,\n y: 0.328125,\n },\n {\n x: 0.828125,\n y: 0.328125,\n },\n {\n x: 0.828125,\n y: 0.328125,\n },\n {\n x: 0.859375,\n y: 0.328125,\n },\n {\n x: 0.859375,\n y: 0.328125,\n },\n {\n x: 0.890625,\n y: 0.328125,\n },\n {\n x: 0.890625,\n y: 0.328125,\n },\n {\n x: 0.921875,\n y: 0.328125,\n },\n {\n x: 0.921875,\n y: 0.328125,\n },\n {\n x: 0.953125,\n y: 0.328125,\n },\n {\n x: 0.953125,\n y: 0.328125,\n },\n {\n x: 0.984375,\n y: 0.328125,\n },\n {\n x: 0.984375,\n y: 0.328125,\n },\n {\n x: 0.015625,\n y: 0.359375,\n },\n {\n x: 0.015625,\n y: 0.359375,\n },\n {\n x: 0.046875,\n y: 0.359375,\n },\n {\n x: 0.046875,\n y: 0.359375,\n },\n {\n x: 0.078125,\n y: 0.359375,\n },\n {\n x: 0.078125,\n y: 0.359375,\n },\n {\n x: 0.109375,\n y: 0.359375,\n },\n {\n x: 0.109375,\n y: 0.359375,\n },\n {\n x: 0.140625,\n y: 0.359375,\n },\n {\n x: 0.140625,\n y: 0.359375,\n },\n {\n x: 0.171875,\n y: 0.359375,\n },\n {\n x: 0.171875,\n y: 0.359375,\n },\n {\n x: 0.203125,\n y: 0.359375,\n },\n {\n x: 0.203125,\n y: 0.359375,\n },\n {\n x: 0.234375,\n y: 0.359375,\n },\n {\n x: 0.234375,\n y: 0.359375,\n },\n {\n x: 0.265625,\n y: 0.359375,\n },\n {\n x: 0.265625,\n y: 0.359375,\n },\n {\n x: 0.296875,\n y: 0.359375,\n },\n {\n x: 0.296875,\n y: 0.359375,\n },\n {\n x: 0.328125,\n y: 0.359375,\n },\n {\n x: 0.328125,\n y: 0.359375,\n },\n {\n x: 0.359375,\n y: 0.359375,\n },\n {\n x: 0.359375,\n y: 0.359375,\n },\n {\n x: 0.390625,\n y: 0.359375,\n },\n {\n x: 0.390625,\n y: 0.359375,\n },\n {\n x: 0.421875,\n y: 0.359375,\n },\n {\n x: 0.421875,\n y: 0.359375,\n },\n {\n x: 0.453125,\n y: 0.359375,\n },\n {\n x: 0.453125,\n y: 0.359375,\n },\n {\n x: 0.484375,\n y: 0.359375,\n },\n {\n x: 0.484375,\n y: 0.359375,\n },\n {\n x: 0.515625,\n y: 0.359375,\n },\n {\n x: 0.515625,\n y: 0.359375,\n },\n {\n x: 0.546875,\n y: 0.359375,\n },\n {\n x: 0.546875,\n y: 0.359375,\n },\n {\n x: 0.578125,\n y: 0.359375,\n },\n {\n x: 0.578125,\n y: 0.359375,\n },\n {\n x: 0.609375,\n y: 0.359375,\n },\n {\n x: 0.609375,\n y: 0.359375,\n },\n {\n x: 0.640625,\n y: 0.359375,\n },\n {\n x: 0.640625,\n y: 0.359375,\n },\n {\n x: 0.671875,\n y: 0.359375,\n },\n {\n x: 0.671875,\n y: 0.359375,\n },\n {\n x: 0.703125,\n y: 0.359375,\n },\n {\n x: 0.703125,\n y: 0.359375,\n },\n {\n x: 0.734375,\n y: 0.359375,\n },\n {\n x: 0.734375,\n y: 0.359375,\n },\n {\n x: 0.765625,\n y: 0.359375,\n },\n {\n x: 0.765625,\n y: 0.359375,\n },\n {\n x: 0.796875,\n y: 0.359375,\n },\n {\n x: 0.796875,\n y: 0.359375,\n },\n {\n x: 0.828125,\n y: 0.359375,\n },\n {\n x: 0.828125,\n y: 0.359375,\n },\n {\n x: 0.859375,\n y: 0.359375,\n },\n {\n x: 0.859375,\n y: 0.359375,\n },\n {\n x: 0.890625,\n y: 0.359375,\n },\n {\n x: 0.890625,\n y: 0.359375,\n },\n {\n x: 0.921875,\n y: 0.359375,\n },\n {\n x: 0.921875,\n y: 0.359375,\n },\n {\n x: 0.953125,\n y: 0.359375,\n },\n {\n x: 0.953125,\n y: 0.359375,\n },\n {\n x: 0.984375,\n y: 0.359375,\n },\n {\n x: 0.984375,\n y: 0.359375,\n },\n {\n x: 0.015625,\n y: 0.390625,\n },\n {\n x: 0.015625,\n y: 0.390625,\n },\n {\n x: 0.046875,\n y: 0.390625,\n },\n {\n x: 0.046875,\n y: 0.390625,\n },\n {\n x: 0.078125,\n y: 0.390625,\n },\n {\n x: 0.078125,\n y: 0.390625,\n },\n {\n x: 0.109375,\n y: 0.390625,\n },\n {\n x: 0.109375,\n y: 0.390625,\n },\n {\n x: 0.140625,\n y: 0.390625,\n },\n {\n x: 0.140625,\n y: 0.390625,\n },\n {\n x: 0.171875,\n y: 0.390625,\n },\n {\n x: 0.171875,\n y: 0.390625,\n },\n {\n x: 0.203125,\n y: 0.390625,\n },\n {\n x: 0.203125,\n y: 0.390625,\n },\n {\n x: 0.234375,\n y: 0.390625,\n },\n {\n x: 0.234375,\n y: 0.390625,\n },\n {\n x: 0.265625,\n y: 0.390625,\n },\n {\n x: 0.265625,\n y: 0.390625,\n },\n {\n x: 0.296875,\n y: 0.390625,\n },\n {\n x: 0.296875,\n y: 0.390625,\n },\n {\n x: 0.328125,\n y: 0.390625,\n },\n {\n x: 0.328125,\n y: 0.390625,\n },\n {\n x: 0.359375,\n y: 0.390625,\n },\n {\n x: 0.359375,\n y: 0.390625,\n },\n {\n x: 0.390625,\n y: 0.390625,\n },\n {\n x: 0.390625,\n y: 0.390625,\n },\n {\n x: 0.421875,\n y: 0.390625,\n },\n {\n x: 0.421875,\n y: 0.390625,\n },\n {\n x: 0.453125,\n y: 0.390625,\n },\n {\n x: 0.453125,\n y: 0.390625,\n },\n {\n x: 0.484375,\n y: 0.390625,\n },\n {\n x: 0.484375,\n y: 0.390625,\n },\n {\n x: 0.515625,\n y: 0.390625,\n },\n {\n x: 0.515625,\n y: 0.390625,\n },\n {\n x: 0.546875,\n y: 0.390625,\n },\n {\n x: 0.546875,\n y: 0.390625,\n },\n {\n x: 0.578125,\n y: 0.390625,\n },\n {\n x: 0.578125,\n y: 0.390625,\n },\n {\n x: 0.609375,\n y: 0.390625,\n },\n {\n x: 0.609375,\n y: 0.390625,\n },\n {\n x: 0.640625,\n y: 0.390625,\n },\n {\n x: 0.640625,\n y: 0.390625,\n },\n {\n x: 0.671875,\n y: 0.390625,\n },\n {\n x: 0.671875,\n y: 0.390625,\n },\n {\n x: 0.703125,\n y: 0.390625,\n },\n {\n x: 0.703125,\n y: 0.390625,\n },\n {\n x: 0.734375,\n y: 0.390625,\n },\n {\n x: 0.734375,\n y: 0.390625,\n },\n {\n x: 0.765625,\n y: 0.390625,\n },\n {\n x: 0.765625,\n y: 0.390625,\n },\n {\n x: 0.796875,\n y: 0.390625,\n },\n {\n x: 0.796875,\n y: 0.390625,\n },\n {\n x: 0.828125,\n y: 0.390625,\n },\n {\n x: 0.828125,\n y: 0.390625,\n },\n {\n x: 0.859375,\n y: 0.390625,\n },\n {\n x: 0.859375,\n y: 0.390625,\n },\n {\n x: 0.890625,\n y: 0.390625,\n },\n {\n x: 0.890625,\n y: 0.390625,\n },\n {\n x: 0.921875,\n y: 0.390625,\n },\n {\n x: 0.921875,\n y: 0.390625,\n },\n {\n x: 0.953125,\n y: 0.390625,\n },\n {\n x: 0.953125,\n y: 0.390625,\n },\n {\n x: 0.984375,\n y: 0.390625,\n },\n {\n x: 0.984375,\n y: 0.390625,\n },\n {\n x: 0.015625,\n y: 0.421875,\n },\n {\n x: 0.015625,\n y: 0.421875,\n },\n {\n x: 0.046875,\n y: 0.421875,\n },\n {\n x: 0.046875,\n y: 0.421875,\n },\n {\n x: 0.078125,\n y: 0.421875,\n },\n {\n x: 0.078125,\n y: 0.421875,\n },\n {\n x: 0.109375,\n y: 0.421875,\n },\n {\n x: 0.109375,\n y: 0.421875,\n },\n {\n x: 0.140625,\n y: 0.421875,\n },\n {\n x: 0.140625,\n y: 0.421875,\n },\n {\n x: 0.171875,\n y: 0.421875,\n },\n {\n x: 0.171875,\n y: 0.421875,\n },\n {\n x: 0.203125,\n y: 0.421875,\n },\n {\n x: 0.203125,\n y: 0.421875,\n },\n {\n x: 0.234375,\n y: 0.421875,\n },\n {\n x: 0.234375,\n y: 0.421875,\n },\n {\n x: 0.265625,\n y: 0.421875,\n },\n {\n x: 0.265625,\n y: 0.421875,\n },\n {\n x: 0.296875,\n y: 0.421875,\n },\n {\n x: 0.296875,\n y: 0.421875,\n },\n {\n x: 0.328125,\n y: 0.421875,\n },\n {\n x: 0.328125,\n y: 0.421875,\n },\n {\n x: 0.359375,\n y: 0.421875,\n },\n {\n x: 0.359375,\n y: 0.421875,\n },\n {\n x: 0.390625,\n y: 0.421875,\n },\n {\n x: 0.390625,\n y: 0.421875,\n },\n {\n x: 0.421875,\n y: 0.421875,\n },\n {\n x: 0.421875,\n y: 0.421875,\n },\n {\n x: 0.453125,\n y: 0.421875,\n },\n {\n x: 0.453125,\n y: 0.421875,\n },\n {\n x: 0.484375,\n y: 0.421875,\n },\n {\n x: 0.484375,\n y: 0.421875,\n },\n {\n x: 0.515625,\n y: 0.421875,\n },\n {\n x: 0.515625,\n y: 0.421875,\n },\n {\n x: 0.546875,\n y: 0.421875,\n },\n {\n x: 0.546875,\n y: 0.421875,\n },\n {\n x: 0.578125,\n y: 0.421875,\n },\n {\n x: 0.578125,\n y: 0.421875,\n },\n {\n x: 0.609375,\n y: 0.421875,\n },\n {\n x: 0.609375,\n y: 0.421875,\n },\n {\n x: 0.640625,\n y: 0.421875,\n },\n {\n x: 0.640625,\n y: 0.421875,\n },\n {\n x: 0.671875,\n y: 0.421875,\n },\n {\n x: 0.671875,\n y: 0.421875,\n },\n {\n x: 0.703125,\n y: 0.421875,\n },\n {\n x: 0.703125,\n y: 0.421875,\n },\n {\n x: 0.734375,\n y: 0.421875,\n },\n {\n x: 0.734375,\n y: 0.421875,\n },\n {\n x: 0.765625,\n y: 0.421875,\n },\n {\n x: 0.765625,\n y: 0.421875,\n },\n {\n x: 0.796875,\n y: 0.421875,\n },\n {\n x: 0.796875,\n y: 0.421875,\n },\n {\n x: 0.828125,\n y: 0.421875,\n },\n {\n x: 0.828125,\n y: 0.421875,\n },\n {\n x: 0.859375,\n y: 0.421875,\n },\n {\n x: 0.859375,\n y: 0.421875,\n },\n {\n x: 0.890625,\n y: 0.421875,\n },\n {\n x: 0.890625,\n y: 0.421875,\n },\n {\n x: 0.921875,\n y: 0.421875,\n },\n {\n x: 0.921875,\n y: 0.421875,\n },\n {\n x: 0.953125,\n y: 0.421875,\n },\n {\n x: 0.953125,\n y: 0.421875,\n },\n {\n x: 0.984375,\n y: 0.421875,\n },\n {\n x: 0.984375,\n y: 0.421875,\n },\n {\n x: 0.015625,\n y: 0.453125,\n },\n {\n x: 0.015625,\n y: 0.453125,\n },\n {\n x: 0.046875,\n y: 0.453125,\n },\n {\n x: 0.046875,\n y: 0.453125,\n },\n {\n x: 0.078125,\n y: 0.453125,\n },\n {\n x: 0.078125,\n y: 0.453125,\n },\n {\n x: 0.109375,\n y: 0.453125,\n },\n {\n x: 0.109375,\n y: 0.453125,\n },\n {\n x: 0.140625,\n y: 0.453125,\n },\n {\n x: 0.140625,\n y: 0.453125,\n },\n {\n x: 0.171875,\n y: 0.453125,\n },\n {\n x: 0.171875,\n y: 0.453125,\n },\n {\n x: 0.203125,\n y: 0.453125,\n },\n {\n x: 0.203125,\n y: 0.453125,\n },\n {\n x: 0.234375,\n y: 0.453125,\n },\n {\n x: 0.234375,\n y: 0.453125,\n },\n {\n x: 0.265625,\n y: 0.453125,\n },\n {\n x: 0.265625,\n y: 0.453125,\n },\n {\n x: 0.296875,\n y: 0.453125,\n },\n {\n x: 0.296875,\n y: 0.453125,\n },\n {\n x: 0.328125,\n y: 0.453125,\n },\n {\n x: 0.328125,\n y: 0.453125,\n },\n {\n x: 0.359375,\n y: 0.453125,\n },\n {\n x: 0.359375,\n y: 0.453125,\n },\n {\n x: 0.390625,\n y: 0.453125,\n },\n {\n x: 0.390625,\n y: 0.453125,\n },\n {\n x: 0.421875,\n y: 0.453125,\n },\n {\n x: 0.421875,\n y: 0.453125,\n },\n {\n x: 0.453125,\n y: 0.453125,\n },\n {\n x: 0.453125,\n y: 0.453125,\n },\n {\n x: 0.484375,\n y: 0.453125,\n },\n {\n x: 0.484375,\n y: 0.453125,\n },\n {\n x: 0.515625,\n y: 0.453125,\n },\n {\n x: 0.515625,\n y: 0.453125,\n },\n {\n x: 0.546875,\n y: 0.453125,\n },\n {\n x: 0.546875,\n y: 0.453125,\n },\n {\n x: 0.578125,\n y: 0.453125,\n },\n {\n x: 0.578125,\n y: 0.453125,\n },\n {\n x: 0.609375,\n y: 0.453125,\n },\n {\n x: 0.609375,\n y: 0.453125,\n },\n {\n x: 0.640625,\n y: 0.453125,\n },\n {\n x: 0.640625,\n y: 0.453125,\n },\n {\n x: 0.671875,\n y: 0.453125,\n },\n {\n x: 0.671875,\n y: 0.453125,\n },\n {\n x: 0.703125,\n y: 0.453125,\n },\n {\n x: 0.703125,\n y: 0.453125,\n },\n {\n x: 0.734375,\n y: 0.453125,\n },\n {\n x: 0.734375,\n y: 0.453125,\n },\n {\n x: 0.765625,\n y: 0.453125,\n },\n {\n x: 0.765625,\n y: 0.453125,\n },\n {\n x: 0.796875,\n y: 0.453125,\n },\n {\n x: 0.796875,\n y: 0.453125,\n },\n {\n x: 0.828125,\n y: 0.453125,\n },\n {\n x: 0.828125,\n y: 0.453125,\n },\n {\n x: 0.859375,\n y: 0.453125,\n },\n {\n x: 0.859375,\n y: 0.453125,\n },\n {\n x: 0.890625,\n y: 0.453125,\n },\n {\n x: 0.890625,\n y: 0.453125,\n },\n {\n x: 0.921875,\n y: 0.453125,\n },\n {\n x: 0.921875,\n y: 0.453125,\n },\n {\n x: 0.953125,\n y: 0.453125,\n },\n {\n x: 0.953125,\n y: 0.453125,\n },\n {\n x: 0.984375,\n y: 0.453125,\n },\n {\n x: 0.984375,\n y: 0.453125,\n },\n {\n x: 0.015625,\n y: 0.484375,\n },\n {\n x: 0.015625,\n y: 0.484375,\n },\n {\n x: 0.046875,\n y: 0.484375,\n },\n {\n x: 0.046875,\n y: 0.484375,\n },\n {\n x: 0.078125,\n y: 0.484375,\n },\n {\n x: 0.078125,\n y: 0.484375,\n },\n {\n x: 0.109375,\n y: 0.484375,\n },\n {\n x: 0.109375,\n y: 0.484375,\n },\n {\n x: 0.140625,\n y: 0.484375,\n },\n {\n x: 0.140625,\n y: 0.484375,\n },\n {\n x: 0.171875,\n y: 0.484375,\n },\n {\n x: 0.171875,\n y: 0.484375,\n },\n {\n x: 0.203125,\n y: 0.484375,\n },\n {\n x: 0.203125,\n y: 0.484375,\n },\n {\n x: 0.234375,\n y: 0.484375,\n },\n {\n x: 0.234375,\n y: 0.484375,\n },\n {\n x: 0.265625,\n y: 0.484375,\n },\n {\n x: 0.265625,\n y: 0.484375,\n },\n {\n x: 0.296875,\n y: 0.484375,\n },\n {\n x: 0.296875,\n y: 0.484375,\n },\n {\n x: 0.328125,\n y: 0.484375,\n },\n {\n x: 0.328125,\n y: 0.484375,\n },\n {\n x: 0.359375,\n y: 0.484375,\n },\n {\n x: 0.359375,\n y: 0.484375,\n },\n {\n x: 0.390625,\n y: 0.484375,\n },\n {\n x: 0.390625,\n y: 0.484375,\n },\n {\n x: 0.421875,\n y: 0.484375,\n },\n {\n x: 0.421875,\n y: 0.484375,\n },\n {\n x: 0.453125,\n y: 0.484375,\n },\n {\n x: 0.453125,\n y: 0.484375,\n },\n {\n x: 0.484375,\n y: 0.484375,\n },\n {\n x: 0.484375,\n y: 0.484375,\n },\n {\n x: 0.515625,\n y: 0.484375,\n },\n {\n x: 0.515625,\n y: 0.484375,\n },\n {\n x: 0.546875,\n y: 0.484375,\n },\n {\n x: 0.546875,\n y: 0.484375,\n },\n {\n x: 0.578125,\n y: 0.484375,\n },\n {\n x: 0.578125,\n y: 0.484375,\n },\n {\n x: 0.609375,\n y: 0.484375,\n },\n {\n x: 0.609375,\n y: 0.484375,\n },\n {\n x: 0.640625,\n y: 0.484375,\n },\n {\n x: 0.640625,\n y: 0.484375,\n },\n {\n x: 0.671875,\n y: 0.484375,\n },\n {\n x: 0.671875,\n y: 0.484375,\n },\n {\n x: 0.703125,\n y: 0.484375,\n },\n {\n x: 0.703125,\n y: 0.484375,\n },\n {\n x: 0.734375,\n y: 0.484375,\n },\n {\n x: 0.734375,\n y: 0.484375,\n },\n {\n x: 0.765625,\n y: 0.484375,\n },\n {\n x: 0.765625,\n y: 0.484375,\n },\n {\n x: 0.796875,\n y: 0.484375,\n },\n {\n x: 0.796875,\n y: 0.484375,\n },\n {\n x: 0.828125,\n y: 0.484375,\n },\n {\n x: 0.828125,\n y: 0.484375,\n },\n {\n x: 0.859375,\n y: 0.484375,\n },\n {\n x: 0.859375,\n y: 0.484375,\n },\n {\n x: 0.890625,\n y: 0.484375,\n },\n {\n x: 0.890625,\n y: 0.484375,\n },\n {\n x: 0.921875,\n y: 0.484375,\n },\n {\n x: 0.921875,\n y: 0.484375,\n },\n {\n x: 0.953125,\n y: 0.484375,\n },\n {\n x: 0.953125,\n y: 0.484375,\n },\n {\n x: 0.984375,\n y: 0.484375,\n },\n {\n x: 0.984375,\n y: 0.484375,\n },\n {\n x: 0.015625,\n y: 0.515625,\n },\n {\n x: 0.015625,\n y: 0.515625,\n },\n {\n x: 0.046875,\n y: 0.515625,\n },\n {\n x: 0.046875,\n y: 0.515625,\n },\n {\n x: 0.078125,\n y: 0.515625,\n },\n {\n x: 0.078125,\n y: 0.515625,\n },\n {\n x: 0.109375,\n y: 0.515625,\n },\n {\n x: 0.109375,\n y: 0.515625,\n },\n {\n x: 0.140625,\n y: 0.515625,\n },\n {\n x: 0.140625,\n y: 0.515625,\n },\n {\n x: 0.171875,\n y: 0.515625,\n },\n {\n x: 0.171875,\n y: 0.515625,\n },\n {\n x: 0.203125,\n y: 0.515625,\n },\n {\n x: 0.203125,\n y: 0.515625,\n },\n {\n x: 0.234375,\n y: 0.515625,\n },\n {\n x: 0.234375,\n y: 0.515625,\n },\n {\n x: 0.265625,\n y: 0.515625,\n },\n {\n x: 0.265625,\n y: 0.515625,\n },\n {\n x: 0.296875,\n y: 0.515625,\n },\n {\n x: 0.296875,\n y: 0.515625,\n },\n {\n x: 0.328125,\n y: 0.515625,\n },\n {\n x: 0.328125,\n y: 0.515625,\n },\n {\n x: 0.359375,\n y: 0.515625,\n },\n {\n x: 0.359375,\n y: 0.515625,\n },\n {\n x: 0.390625,\n y: 0.515625,\n },\n {\n x: 0.390625,\n y: 0.515625,\n },\n {\n x: 0.421875,\n y: 0.515625,\n },\n {\n x: 0.421875,\n y: 0.515625,\n },\n {\n x: 0.453125,\n y: 0.515625,\n },\n {\n x: 0.453125,\n y: 0.515625,\n },\n {\n x: 0.484375,\n y: 0.515625,\n },\n {\n x: 0.484375,\n y: 0.515625,\n },\n {\n x: 0.515625,\n y: 0.515625,\n },\n {\n x: 0.515625,\n y: 0.515625,\n },\n {\n x: 0.546875,\n y: 0.515625,\n },\n {\n x: 0.546875,\n y: 0.515625,\n },\n {\n x: 0.578125,\n y: 0.515625,\n },\n {\n x: 0.578125,\n y: 0.515625,\n },\n {\n x: 0.609375,\n y: 0.515625,\n },\n {\n x: 0.609375,\n y: 0.515625,\n },\n {\n x: 0.640625,\n y: 0.515625,\n },\n {\n x: 0.640625,\n y: 0.515625,\n },\n {\n x: 0.671875,\n y: 0.515625,\n },\n {\n x: 0.671875,\n y: 0.515625,\n },\n {\n x: 0.703125,\n y: 0.515625,\n },\n {\n x: 0.703125,\n y: 0.515625,\n },\n {\n x: 0.734375,\n y: 0.515625,\n },\n {\n x: 0.734375,\n y: 0.515625,\n },\n {\n x: 0.765625,\n y: 0.515625,\n },\n {\n x: 0.765625,\n y: 0.515625,\n },\n {\n x: 0.796875,\n y: 0.515625,\n },\n {\n x: 0.796875,\n y: 0.515625,\n },\n {\n x: 0.828125,\n y: 0.515625,\n },\n {\n x: 0.828125,\n y: 0.515625,\n },\n {\n x: 0.859375,\n y: 0.515625,\n },\n {\n x: 0.859375,\n y: 0.515625,\n },\n {\n x: 0.890625,\n y: 0.515625,\n },\n {\n x: 0.890625,\n y: 0.515625,\n },\n {\n x: 0.921875,\n y: 0.515625,\n },\n {\n x: 0.921875,\n y: 0.515625,\n },\n {\n x: 0.953125,\n y: 0.515625,\n },\n {\n x: 0.953125,\n y: 0.515625,\n },\n {\n x: 0.984375,\n y: 0.515625,\n },\n {\n x: 0.984375,\n y: 0.515625,\n },\n {\n x: 0.015625,\n y: 0.546875,\n },\n {\n x: 0.015625,\n y: 0.546875,\n },\n {\n x: 0.046875,\n y: 0.546875,\n },\n {\n x: 0.046875,\n y: 0.546875,\n },\n {\n x: 0.078125,\n y: 0.546875,\n },\n {\n x: 0.078125,\n y: 0.546875,\n },\n {\n x: 0.109375,\n y: 0.546875,\n },\n {\n x: 0.109375,\n y: 0.546875,\n },\n {\n x: 0.140625,\n y: 0.546875,\n },\n {\n x: 0.140625,\n y: 0.546875,\n },\n {\n x: 0.171875,\n y: 0.546875,\n },\n {\n x: 0.171875,\n y: 0.546875,\n },\n {\n x: 0.203125,\n y: 0.546875,\n },\n {\n x: 0.203125,\n y: 0.546875,\n },\n {\n x: 0.234375,\n y: 0.546875,\n },\n {\n x: 0.234375,\n y: 0.546875,\n },\n {\n x: 0.265625,\n y: 0.546875,\n },\n {\n x: 0.265625,\n y: 0.546875,\n },\n {\n x: 0.296875,\n y: 0.546875,\n },\n {\n x: 0.296875,\n y: 0.546875,\n },\n {\n x: 0.328125,\n y: 0.546875,\n },\n {\n x: 0.328125,\n y: 0.546875,\n },\n {\n x: 0.359375,\n y: 0.546875,\n },\n {\n x: 0.359375,\n y: 0.546875,\n },\n {\n x: 0.390625,\n y: 0.546875,\n },\n {\n x: 0.390625,\n y: 0.546875,\n },\n {\n x: 0.421875,\n y: 0.546875,\n },\n {\n x: 0.421875,\n y: 0.546875,\n },\n {\n x: 0.453125,\n y: 0.546875,\n },\n {\n x: 0.453125,\n y: 0.546875,\n },\n {\n x: 0.484375,\n y: 0.546875,\n },\n {\n x: 0.484375,\n y: 0.546875,\n },\n {\n x: 0.515625,\n y: 0.546875,\n },\n {\n x: 0.515625,\n y: 0.546875,\n },\n {\n x: 0.546875,\n y: 0.546875,\n },\n {\n x: 0.546875,\n y: 0.546875,\n },\n {\n x: 0.578125,\n y: 0.546875,\n },\n {\n x: 0.578125,\n y: 0.546875,\n },\n {\n x: 0.609375,\n y: 0.546875,\n },\n {\n x: 0.609375,\n y: 0.546875,\n },\n {\n x: 0.640625,\n y: 0.546875,\n },\n {\n x: 0.640625,\n y: 0.546875,\n },\n {\n x: 0.671875,\n y: 0.546875,\n },\n {\n x: 0.671875,\n y: 0.546875,\n },\n {\n x: 0.703125,\n y: 0.546875,\n },\n {\n x: 0.703125,\n y: 0.546875,\n },\n {\n x: 0.734375,\n y: 0.546875,\n },\n {\n x: 0.734375,\n y: 0.546875,\n },\n {\n x: 0.765625,\n y: 0.546875,\n },\n {\n x: 0.765625,\n y: 0.546875,\n },\n {\n x: 0.796875,\n y: 0.546875,\n },\n {\n x: 0.796875,\n y: 0.546875,\n },\n {\n x: 0.828125,\n y: 0.546875,\n },\n {\n x: 0.828125,\n y: 0.546875,\n },\n {\n x: 0.859375,\n y: 0.546875,\n },\n {\n x: 0.859375,\n y: 0.546875,\n },\n {\n x: 0.890625,\n y: 0.546875,\n },\n {\n x: 0.890625,\n y: 0.546875,\n },\n {\n x: 0.921875,\n y: 0.546875,\n },\n {\n x: 0.921875,\n y: 0.546875,\n },\n {\n x: 0.953125,\n y: 0.546875,\n },\n {\n x: 0.953125,\n y: 0.546875,\n },\n {\n x: 0.984375,\n y: 0.546875,\n },\n {\n x: 0.984375,\n y: 0.546875,\n },\n {\n x: 0.015625,\n y: 0.578125,\n },\n {\n x: 0.015625,\n y: 0.578125,\n },\n {\n x: 0.046875,\n y: 0.578125,\n },\n {\n x: 0.046875,\n y: 0.578125,\n },\n {\n x: 0.078125,\n y: 0.578125,\n },\n {\n x: 0.078125,\n y: 0.578125,\n },\n {\n x: 0.109375,\n y: 0.578125,\n },\n {\n x: 0.109375,\n y: 0.578125,\n },\n {\n x: 0.140625,\n y: 0.578125,\n },\n {\n x: 0.140625,\n y: 0.578125,\n },\n {\n x: 0.171875,\n y: 0.578125,\n },\n {\n x: 0.171875,\n y: 0.578125,\n },\n {\n x: 0.203125,\n y: 0.578125,\n },\n {\n x: 0.203125,\n y: 0.578125,\n },\n {\n x: 0.234375,\n y: 0.578125,\n },\n {\n x: 0.234375,\n y: 0.578125,\n },\n {\n x: 0.265625,\n y: 0.578125,\n },\n {\n x: 0.265625,\n y: 0.578125,\n },\n {\n x: 0.296875,\n y: 0.578125,\n },\n {\n x: 0.296875,\n y: 0.578125,\n },\n {\n x: 0.328125,\n y: 0.578125,\n },\n {\n x: 0.328125,\n y: 0.578125,\n },\n {\n x: 0.359375,\n y: 0.578125,\n },\n {\n x: 0.359375,\n y: 0.578125,\n },\n {\n x: 0.390625,\n y: 0.578125,\n },\n {\n x: 0.390625,\n y: 0.578125,\n },\n {\n x: 0.421875,\n y: 0.578125,\n },\n {\n x: 0.421875,\n y: 0.578125,\n },\n {\n x: 0.453125,\n y: 0.578125,\n },\n {\n x: 0.453125,\n y: 0.578125,\n },\n {\n x: 0.484375,\n y: 0.578125,\n },\n {\n x: 0.484375,\n y: 0.578125,\n },\n {\n x: 0.515625,\n y: 0.578125,\n },\n {\n x: 0.515625,\n y: 0.578125,\n },\n {\n x: 0.546875,\n y: 0.578125,\n },\n {\n x: 0.546875,\n y: 0.578125,\n },\n {\n x: 0.578125,\n y: 0.578125,\n },\n {\n x: 0.578125,\n y: 0.578125,\n },\n {\n x: 0.609375,\n y: 0.578125,\n },\n {\n x: 0.609375,\n y: 0.578125,\n },\n {\n x: 0.640625,\n y: 0.578125,\n },\n {\n x: 0.640625,\n y: 0.578125,\n },\n {\n x: 0.671875,\n y: 0.578125,\n },\n {\n x: 0.671875,\n y: 0.578125,\n },\n {\n x: 0.703125,\n y: 0.578125,\n },\n {\n x: 0.703125,\n y: 0.578125,\n },\n {\n x: 0.734375,\n y: 0.578125,\n },\n {\n x: 0.734375,\n y: 0.578125,\n },\n {\n x: 0.765625,\n y: 0.578125,\n },\n {\n x: 0.765625,\n y: 0.578125,\n },\n {\n x: 0.796875,\n y: 0.578125,\n },\n {\n x: 0.796875,\n y: 0.578125,\n },\n {\n x: 0.828125,\n y: 0.578125,\n },\n {\n x: 0.828125,\n y: 0.578125,\n },\n {\n x: 0.859375,\n y: 0.578125,\n },\n {\n x: 0.859375,\n y: 0.578125,\n },\n {\n x: 0.890625,\n y: 0.578125,\n },\n {\n x: 0.890625,\n y: 0.578125,\n },\n {\n x: 0.921875,\n y: 0.578125,\n },\n {\n x: 0.921875,\n y: 0.578125,\n },\n {\n x: 0.953125,\n y: 0.578125,\n },\n {\n x: 0.953125,\n y: 0.578125,\n },\n {\n x: 0.984375,\n y: 0.578125,\n },\n {\n x: 0.984375,\n y: 0.578125,\n },\n {\n x: 0.015625,\n y: 0.609375,\n },\n {\n x: 0.015625,\n y: 0.609375,\n },\n {\n x: 0.046875,\n y: 0.609375,\n },\n {\n x: 0.046875,\n y: 0.609375,\n },\n {\n x: 0.078125,\n y: 0.609375,\n },\n {\n x: 0.078125,\n y: 0.609375,\n },\n {\n x: 0.109375,\n y: 0.609375,\n },\n {\n x: 0.109375,\n y: 0.609375,\n },\n {\n x: 0.140625,\n y: 0.609375,\n },\n {\n x: 0.140625,\n y: 0.609375,\n },\n {\n x: 0.171875,\n y: 0.609375,\n },\n {\n x: 0.171875,\n y: 0.609375,\n },\n {\n x: 0.203125,\n y: 0.609375,\n },\n {\n x: 0.203125,\n y: 0.609375,\n },\n {\n x: 0.234375,\n y: 0.609375,\n },\n {\n x: 0.234375,\n y: 0.609375,\n },\n {\n x: 0.265625,\n y: 0.609375,\n },\n {\n x: 0.265625,\n y: 0.609375,\n },\n {\n x: 0.296875,\n y: 0.609375,\n },\n {\n x: 0.296875,\n y: 0.609375,\n },\n {\n x: 0.328125,\n y: 0.609375,\n },\n {\n x: 0.328125,\n y: 0.609375,\n },\n {\n x: 0.359375,\n y: 0.609375,\n },\n {\n x: 0.359375,\n y: 0.609375,\n },\n {\n x: 0.390625,\n y: 0.609375,\n },\n {\n x: 0.390625,\n y: 0.609375,\n },\n {\n x: 0.421875,\n y: 0.609375,\n },\n {\n x: 0.421875,\n y: 0.609375,\n },\n {\n x: 0.453125,\n y: 0.609375,\n },\n {\n x: 0.453125,\n y: 0.609375,\n },\n {\n x: 0.484375,\n y: 0.609375,\n },\n {\n x: 0.484375,\n y: 0.609375,\n },\n {\n x: 0.515625,\n y: 0.609375,\n },\n {\n x: 0.515625,\n y: 0.609375,\n },\n {\n x: 0.546875,\n y: 0.609375,\n },\n {\n x: 0.546875,\n y: 0.609375,\n },\n {\n x: 0.578125,\n y: 0.609375,\n },\n {\n x: 0.578125,\n y: 0.609375,\n },\n {\n x: 0.609375,\n y: 0.609375,\n },\n {\n x: 0.609375,\n y: 0.609375,\n },\n {\n x: 0.640625,\n y: 0.609375,\n },\n {\n x: 0.640625,\n y: 0.609375,\n },\n {\n x: 0.671875,\n y: 0.609375,\n },\n {\n x: 0.671875,\n y: 0.609375,\n },\n {\n x: 0.703125,\n y: 0.609375,\n },\n {\n x: 0.703125,\n y: 0.609375,\n },\n {\n x: 0.734375,\n y: 0.609375,\n },\n {\n x: 0.734375,\n y: 0.609375,\n },\n {\n x: 0.765625,\n y: 0.609375,\n },\n {\n x: 0.765625,\n y: 0.609375,\n },\n {\n x: 0.796875,\n y: 0.609375,\n },\n {\n x: 0.796875,\n y: 0.609375,\n },\n {\n x: 0.828125,\n y: 0.609375,\n },\n {\n x: 0.828125,\n y: 0.609375,\n },\n {\n x: 0.859375,\n y: 0.609375,\n },\n {\n x: 0.859375,\n y: 0.609375,\n },\n {\n x: 0.890625,\n y: 0.609375,\n },\n {\n x: 0.890625,\n y: 0.609375,\n },\n {\n x: 0.921875,\n y: 0.609375,\n },\n {\n x: 0.921875,\n y: 0.609375,\n },\n {\n x: 0.953125,\n y: 0.609375,\n },\n {\n x: 0.953125,\n y: 0.609375,\n },\n {\n x: 0.984375,\n y: 0.609375,\n },\n {\n x: 0.984375,\n y: 0.609375,\n },\n {\n x: 0.015625,\n y: 0.640625,\n },\n {\n x: 0.015625,\n y: 0.640625,\n },\n {\n x: 0.046875,\n y: 0.640625,\n },\n {\n x: 0.046875,\n y: 0.640625,\n },\n {\n x: 0.078125,\n y: 0.640625,\n },\n {\n x: 0.078125,\n y: 0.640625,\n },\n {\n x: 0.109375,\n y: 0.640625,\n },\n {\n x: 0.109375,\n y: 0.640625,\n },\n {\n x: 0.140625,\n y: 0.640625,\n },\n {\n x: 0.140625,\n y: 0.640625,\n },\n {\n x: 0.171875,\n y: 0.640625,\n },\n {\n x: 0.171875,\n y: 0.640625,\n },\n {\n x: 0.203125,\n y: 0.640625,\n },\n {\n x: 0.203125,\n y: 0.640625,\n },\n {\n x: 0.234375,\n y: 0.640625,\n },\n {\n x: 0.234375,\n y: 0.640625,\n },\n {\n x: 0.265625,\n y: 0.640625,\n },\n {\n x: 0.265625,\n y: 0.640625,\n },\n {\n x: 0.296875,\n y: 0.640625,\n },\n {\n x: 0.296875,\n y: 0.640625,\n },\n {\n x: 0.328125,\n y: 0.640625,\n },\n {\n x: 0.328125,\n y: 0.640625,\n },\n {\n x: 0.359375,\n y: 0.640625,\n },\n {\n x: 0.359375,\n y: 0.640625,\n },\n {\n x: 0.390625,\n y: 0.640625,\n },\n {\n x: 0.390625,\n y: 0.640625,\n },\n {\n x: 0.421875,\n y: 0.640625,\n },\n {\n x: 0.421875,\n y: 0.640625,\n },\n {\n x: 0.453125,\n y: 0.640625,\n },\n {\n x: 0.453125,\n y: 0.640625,\n },\n {\n x: 0.484375,\n y: 0.640625,\n },\n {\n x: 0.484375,\n y: 0.640625,\n },\n {\n x: 0.515625,\n y: 0.640625,\n },\n {\n x: 0.515625,\n y: 0.640625,\n },\n {\n x: 0.546875,\n y: 0.640625,\n },\n {\n x: 0.546875,\n y: 0.640625,\n },\n {\n x: 0.578125,\n y: 0.640625,\n },\n {\n x: 0.578125,\n y: 0.640625,\n },\n {\n x: 0.609375,\n y: 0.640625,\n },\n {\n x: 0.609375,\n y: 0.640625,\n },\n {\n x: 0.640625,\n y: 0.640625,\n },\n {\n x: 0.640625,\n y: 0.640625,\n },\n {\n x: 0.671875,\n y: 0.640625,\n },\n {\n x: 0.671875,\n y: 0.640625,\n },\n {\n x: 0.703125,\n y: 0.640625,\n },\n {\n x: 0.703125,\n y: 0.640625,\n },\n {\n x: 0.734375,\n y: 0.640625,\n },\n {\n x: 0.734375,\n y: 0.640625,\n },\n {\n x: 0.765625,\n y: 0.640625,\n },\n {\n x: 0.765625,\n y: 0.640625,\n },\n {\n x: 0.796875,\n y: 0.640625,\n },\n {\n x: 0.796875,\n y: 0.640625,\n },\n {\n x: 0.828125,\n y: 0.640625,\n },\n {\n x: 0.828125,\n y: 0.640625,\n },\n {\n x: 0.859375,\n y: 0.640625,\n },\n {\n x: 0.859375,\n y: 0.640625,\n },\n {\n x: 0.890625,\n y: 0.640625,\n },\n {\n x: 0.890625,\n y: 0.640625,\n },\n {\n x: 0.921875,\n y: 0.640625,\n },\n {\n x: 0.921875,\n y: 0.640625,\n },\n {\n x: 0.953125,\n y: 0.640625,\n },\n {\n x: 0.953125,\n y: 0.640625,\n },\n {\n x: 0.984375,\n y: 0.640625,\n },\n {\n x: 0.984375,\n y: 0.640625,\n },\n {\n x: 0.015625,\n y: 0.671875,\n },\n {\n x: 0.015625,\n y: 0.671875,\n },\n {\n x: 0.046875,\n y: 0.671875,\n },\n {\n x: 0.046875,\n y: 0.671875,\n },\n {\n x: 0.078125,\n y: 0.671875,\n },\n {\n x: 0.078125,\n y: 0.671875,\n },\n {\n x: 0.109375,\n y: 0.671875,\n },\n {\n x: 0.109375,\n y: 0.671875,\n },\n {\n x: 0.140625,\n y: 0.671875,\n },\n {\n x: 0.140625,\n y: 0.671875,\n },\n {\n x: 0.171875,\n y: 0.671875,\n },\n {\n x: 0.171875,\n y: 0.671875,\n },\n {\n x: 0.203125,\n y: 0.671875,\n },\n {\n x: 0.203125,\n y: 0.671875,\n },\n {\n x: 0.234375,\n y: 0.671875,\n },\n {\n x: 0.234375,\n y: 0.671875,\n },\n {\n x: 0.265625,\n y: 0.671875,\n },\n {\n x: 0.265625,\n y: 0.671875,\n },\n {\n x: 0.296875,\n y: 0.671875,\n },\n {\n x: 0.296875,\n y: 0.671875,\n },\n {\n x: 0.328125,\n y: 0.671875,\n },\n {\n x: 0.328125,\n y: 0.671875,\n },\n {\n x: 0.359375,\n y: 0.671875,\n },\n {\n x: 0.359375,\n y: 0.671875,\n },\n {\n x: 0.390625,\n y: 0.671875,\n },\n {\n x: 0.390625,\n y: 0.671875,\n },\n {\n x: 0.421875,\n y: 0.671875,\n },\n {\n x: 0.421875,\n y: 0.671875,\n },\n {\n x: 0.453125,\n y: 0.671875,\n },\n {\n x: 0.453125,\n y: 0.671875,\n },\n {\n x: 0.484375,\n y: 0.671875,\n },\n {\n x: 0.484375,\n y: 0.671875,\n },\n {\n x: 0.515625,\n y: 0.671875,\n },\n {\n x: 0.515625,\n y: 0.671875,\n },\n {\n x: 0.546875,\n y: 0.671875,\n },\n {\n x: 0.546875,\n y: 0.671875,\n },\n {\n x: 0.578125,\n y: 0.671875,\n },\n {\n x: 0.578125,\n y: 0.671875,\n },\n {\n x: 0.609375,\n y: 0.671875,\n },\n {\n x: 0.609375,\n y: 0.671875,\n },\n {\n x: 0.640625,\n y: 0.671875,\n },\n {\n x: 0.640625,\n y: 0.671875,\n },\n {\n x: 0.671875,\n y: 0.671875,\n },\n {\n x: 0.671875,\n y: 0.671875,\n },\n {\n x: 0.703125,\n y: 0.671875,\n },\n {\n x: 0.703125,\n y: 0.671875,\n },\n {\n x: 0.734375,\n y: 0.671875,\n },\n {\n x: 0.734375,\n y: 0.671875,\n },\n {\n x: 0.765625,\n y: 0.671875,\n },\n {\n x: 0.765625,\n y: 0.671875,\n },\n {\n x: 0.796875,\n y: 0.671875,\n },\n {\n x: 0.796875,\n y: 0.671875,\n },\n {\n x: 0.828125,\n y: 0.671875,\n },\n {\n x: 0.828125,\n y: 0.671875,\n },\n {\n x: 0.859375,\n y: 0.671875,\n },\n {\n x: 0.859375,\n y: 0.671875,\n },\n {\n x: 0.890625,\n y: 0.671875,\n },\n {\n x: 0.890625,\n y: 0.671875,\n },\n {\n x: 0.921875,\n y: 0.671875,\n },\n {\n x: 0.921875,\n y: 0.671875,\n },\n {\n x: 0.953125,\n y: 0.671875,\n },\n {\n x: 0.953125,\n y: 0.671875,\n },\n {\n x: 0.984375,\n y: 0.671875,\n },\n {\n x: 0.984375,\n y: 0.671875,\n },\n {\n x: 0.015625,\n y: 0.703125,\n },\n {\n x: 0.015625,\n y: 0.703125,\n },\n {\n x: 0.046875,\n y: 0.703125,\n },\n {\n x: 0.046875,\n y: 0.703125,\n },\n {\n x: 0.078125,\n y: 0.703125,\n },\n {\n x: 0.078125,\n y: 0.703125,\n },\n {\n x: 0.109375,\n y: 0.703125,\n },\n {\n x: 0.109375,\n y: 0.703125,\n },\n {\n x: 0.140625,\n y: 0.703125,\n },\n {\n x: 0.140625,\n y: 0.703125,\n },\n {\n x: 0.171875,\n y: 0.703125,\n },\n {\n x: 0.171875,\n y: 0.703125,\n },\n {\n x: 0.203125,\n y: 0.703125,\n },\n {\n x: 0.203125,\n y: 0.703125,\n },\n {\n x: 0.234375,\n y: 0.703125,\n },\n {\n x: 0.234375,\n y: 0.703125,\n },\n {\n x: 0.265625,\n y: 0.703125,\n },\n {\n x: 0.265625,\n y: 0.703125,\n },\n {\n x: 0.296875,\n y: 0.703125,\n },\n {\n x: 0.296875,\n y: 0.703125,\n },\n {\n x: 0.328125,\n y: 0.703125,\n },\n {\n x: 0.328125,\n y: 0.703125,\n },\n {\n x: 0.359375,\n y: 0.703125,\n },\n {\n x: 0.359375,\n y: 0.703125,\n },\n {\n x: 0.390625,\n y: 0.703125,\n },\n {\n x: 0.390625,\n y: 0.703125,\n },\n {\n x: 0.421875,\n y: 0.703125,\n },\n {\n x: 0.421875,\n y: 0.703125,\n },\n {\n x: 0.453125,\n y: 0.703125,\n },\n {\n x: 0.453125,\n y: 0.703125,\n },\n {\n x: 0.484375,\n y: 0.703125,\n },\n {\n x: 0.484375,\n y: 0.703125,\n },\n {\n x: 0.515625,\n y: 0.703125,\n },\n {\n x: 0.515625,\n y: 0.703125,\n },\n {\n x: 0.546875,\n y: 0.703125,\n },\n {\n x: 0.546875,\n y: 0.703125,\n },\n {\n x: 0.578125,\n y: 0.703125,\n },\n {\n x: 0.578125,\n y: 0.703125,\n },\n {\n x: 0.609375,\n y: 0.703125,\n },\n {\n x: 0.609375,\n y: 0.703125,\n },\n {\n x: 0.640625,\n y: 0.703125,\n },\n {\n x: 0.640625,\n y: 0.703125,\n },\n {\n x: 0.671875,\n y: 0.703125,\n },\n {\n x: 0.671875,\n y: 0.703125,\n },\n {\n x: 0.703125,\n y: 0.703125,\n },\n {\n x: 0.703125,\n y: 0.703125,\n },\n {\n x: 0.734375,\n y: 0.703125,\n },\n {\n x: 0.734375,\n y: 0.703125,\n },\n {\n x: 0.765625,\n y: 0.703125,\n },\n {\n x: 0.765625,\n y: 0.703125,\n },\n {\n x: 0.796875,\n y: 0.703125,\n },\n {\n x: 0.796875,\n y: 0.703125,\n },\n {\n x: 0.828125,\n y: 0.703125,\n },\n {\n x: 0.828125,\n y: 0.703125,\n },\n {\n x: 0.859375,\n y: 0.703125,\n },\n {\n x: 0.859375,\n y: 0.703125,\n },\n {\n x: 0.890625,\n y: 0.703125,\n },\n {\n x: 0.890625,\n y: 0.703125,\n },\n {\n x: 0.921875,\n y: 0.703125,\n },\n {\n x: 0.921875,\n y: 0.703125,\n },\n {\n x: 0.953125,\n y: 0.703125,\n },\n {\n x: 0.953125,\n y: 0.703125,\n },\n {\n x: 0.984375,\n y: 0.703125,\n },\n {\n x: 0.984375,\n y: 0.703125,\n },\n {\n x: 0.015625,\n y: 0.734375,\n },\n {\n x: 0.015625,\n y: 0.734375,\n },\n {\n x: 0.046875,\n y: 0.734375,\n },\n {\n x: 0.046875,\n y: 0.734375,\n },\n {\n x: 0.078125,\n y: 0.734375,\n },\n {\n x: 0.078125,\n y: 0.734375,\n },\n {\n x: 0.109375,\n y: 0.734375,\n },\n {\n x: 0.109375,\n y: 0.734375,\n },\n {\n x: 0.140625,\n y: 0.734375,\n },\n {\n x: 0.140625,\n y: 0.734375,\n },\n {\n x: 0.171875,\n y: 0.734375,\n },\n {\n x: 0.171875,\n y: 0.734375,\n },\n {\n x: 0.203125,\n y: 0.734375,\n },\n {\n x: 0.203125,\n y: 0.734375,\n },\n {\n x: 0.234375,\n y: 0.734375,\n },\n {\n x: 0.234375,\n y: 0.734375,\n },\n {\n x: 0.265625,\n y: 0.734375,\n },\n {\n x: 0.265625,\n y: 0.734375,\n },\n {\n x: 0.296875,\n y: 0.734375,\n },\n {\n x: 0.296875,\n y: 0.734375,\n },\n {\n x: 0.328125,\n y: 0.734375,\n },\n {\n x: 0.328125,\n y: 0.734375,\n },\n {\n x: 0.359375,\n y: 0.734375,\n },\n {\n x: 0.359375,\n y: 0.734375,\n },\n {\n x: 0.390625,\n y: 0.734375,\n },\n {\n x: 0.390625,\n y: 0.734375,\n },\n {\n x: 0.421875,\n y: 0.734375,\n },\n {\n x: 0.421875,\n y: 0.734375,\n },\n {\n x: 0.453125,\n y: 0.734375,\n },\n {\n x: 0.453125,\n y: 0.734375,\n },\n {\n x: 0.484375,\n y: 0.734375,\n },\n {\n x: 0.484375,\n y: 0.734375,\n },\n {\n x: 0.515625,\n y: 0.734375,\n },\n {\n x: 0.515625,\n y: 0.734375,\n },\n {\n x: 0.546875,\n y: 0.734375,\n },\n {\n x: 0.546875,\n y: 0.734375,\n },\n {\n x: 0.578125,\n y: 0.734375,\n },\n {\n x: 0.578125,\n y: 0.734375,\n },\n {\n x: 0.609375,\n y: 0.734375,\n },\n {\n x: 0.609375,\n y: 0.734375,\n },\n {\n x: 0.640625,\n y: 0.734375,\n },\n {\n x: 0.640625,\n y: 0.734375,\n },\n {\n x: 0.671875,\n y: 0.734375,\n },\n {\n x: 0.671875,\n y: 0.734375,\n },\n {\n x: 0.703125,\n y: 0.734375,\n },\n {\n x: 0.703125,\n y: 0.734375,\n },\n {\n x: 0.734375,\n y: 0.734375,\n },\n {\n x: 0.734375,\n y: 0.734375,\n },\n {\n x: 0.765625,\n y: 0.734375,\n },\n {\n x: 0.765625,\n y: 0.734375,\n },\n {\n x: 0.796875,\n y: 0.734375,\n },\n {\n x: 0.796875,\n y: 0.734375,\n },\n {\n x: 0.828125,\n y: 0.734375,\n },\n {\n x: 0.828125,\n y: 0.734375,\n },\n {\n x: 0.859375,\n y: 0.734375,\n },\n {\n x: 0.859375,\n y: 0.734375,\n },\n {\n x: 0.890625,\n y: 0.734375,\n },\n {\n x: 0.890625,\n y: 0.734375,\n },\n {\n x: 0.921875,\n y: 0.734375,\n },\n {\n x: 0.921875,\n y: 0.734375,\n },\n {\n x: 0.953125,\n y: 0.734375,\n },\n {\n x: 0.953125,\n y: 0.734375,\n },\n {\n x: 0.984375,\n y: 0.734375,\n },\n {\n x: 0.984375,\n y: 0.734375,\n },\n {\n x: 0.015625,\n y: 0.765625,\n },\n {\n x: 0.015625,\n y: 0.765625,\n },\n {\n x: 0.046875,\n y: 0.765625,\n },\n {\n x: 0.046875,\n y: 0.765625,\n },\n {\n x: 0.078125,\n y: 0.765625,\n },\n {\n x: 0.078125,\n y: 0.765625,\n },\n {\n x: 0.109375,\n y: 0.765625,\n },\n {\n x: 0.109375,\n y: 0.765625,\n },\n {\n x: 0.140625,\n y: 0.765625,\n },\n {\n x: 0.140625,\n y: 0.765625,\n },\n {\n x: 0.171875,\n y: 0.765625,\n },\n {\n x: 0.171875,\n y: 0.765625,\n },\n {\n x: 0.203125,\n y: 0.765625,\n },\n {\n x: 0.203125,\n y: 0.765625,\n },\n {\n x: 0.234375,\n y: 0.765625,\n },\n {\n x: 0.234375,\n y: 0.765625,\n },\n {\n x: 0.265625,\n y: 0.765625,\n },\n {\n x: 0.265625,\n y: 0.765625,\n },\n {\n x: 0.296875,\n y: 0.765625,\n },\n {\n x: 0.296875,\n y: 0.765625,\n },\n {\n x: 0.328125,\n y: 0.765625,\n },\n {\n x: 0.328125,\n y: 0.765625,\n },\n {\n x: 0.359375,\n y: 0.765625,\n },\n {\n x: 0.359375,\n y: 0.765625,\n },\n {\n x: 0.390625,\n y: 0.765625,\n },\n {\n x: 0.390625,\n y: 0.765625,\n },\n {\n x: 0.421875,\n y: 0.765625,\n },\n {\n x: 0.421875,\n y: 0.765625,\n },\n {\n x: 0.453125,\n y: 0.765625,\n },\n {\n x: 0.453125,\n y: 0.765625,\n },\n {\n x: 0.484375,\n y: 0.765625,\n },\n {\n x: 0.484375,\n y: 0.765625,\n },\n {\n x: 0.515625,\n y: 0.765625,\n },\n {\n x: 0.515625,\n y: 0.765625,\n },\n {\n x: 0.546875,\n y: 0.765625,\n },\n {\n x: 0.546875,\n y: 0.765625,\n },\n {\n x: 0.578125,\n y: 0.765625,\n },\n {\n x: 0.578125,\n y: 0.765625,\n },\n {\n x: 0.609375,\n y: 0.765625,\n },\n {\n x: 0.609375,\n y: 0.765625,\n },\n {\n x: 0.640625,\n y: 0.765625,\n },\n {\n x: 0.640625,\n y: 0.765625,\n },\n {\n x: 0.671875,\n y: 0.765625,\n },\n {\n x: 0.671875,\n y: 0.765625,\n },\n {\n x: 0.703125,\n y: 0.765625,\n },\n {\n x: 0.703125,\n y: 0.765625,\n },\n {\n x: 0.734375,\n y: 0.765625,\n },\n {\n x: 0.734375,\n y: 0.765625,\n },\n {\n x: 0.765625,\n y: 0.765625,\n },\n {\n x: 0.765625,\n y: 0.765625,\n },\n {\n x: 0.796875,\n y: 0.765625,\n },\n {\n x: 0.796875,\n y: 0.765625,\n },\n {\n x: 0.828125,\n y: 0.765625,\n },\n {\n x: 0.828125,\n y: 0.765625,\n },\n {\n x: 0.859375,\n y: 0.765625,\n },\n {\n x: 0.859375,\n y: 0.765625,\n },\n {\n x: 0.890625,\n y: 0.765625,\n },\n {\n x: 0.890625,\n y: 0.765625,\n },\n {\n x: 0.921875,\n y: 0.765625,\n },\n {\n x: 0.921875,\n y: 0.765625,\n },\n {\n x: 0.953125,\n y: 0.765625,\n },\n {\n x: 0.953125,\n y: 0.765625,\n },\n {\n x: 0.984375,\n y: 0.765625,\n },\n {\n x: 0.984375,\n y: 0.765625,\n },\n {\n x: 0.015625,\n y: 0.796875,\n },\n {\n x: 0.015625,\n y: 0.796875,\n },\n {\n x: 0.046875,\n y: 0.796875,\n },\n {\n x: 0.046875,\n y: 0.796875,\n },\n {\n x: 0.078125,\n y: 0.796875,\n },\n {\n x: 0.078125,\n y: 0.796875,\n },\n {\n x: 0.109375,\n y: 0.796875,\n },\n {\n x: 0.109375,\n y: 0.796875,\n },\n {\n x: 0.140625,\n y: 0.796875,\n },\n {\n x: 0.140625,\n y: 0.796875,\n },\n {\n x: 0.171875,\n y: 0.796875,\n },\n {\n x: 0.171875,\n y: 0.796875,\n },\n {\n x: 0.203125,\n y: 0.796875,\n },\n {\n x: 0.203125,\n y: 0.796875,\n },\n {\n x: 0.234375,\n y: 0.796875,\n },\n {\n x: 0.234375,\n y: 0.796875,\n },\n {\n x: 0.265625,\n y: 0.796875,\n },\n {\n x: 0.265625,\n y: 0.796875,\n },\n {\n x: 0.296875,\n y: 0.796875,\n },\n {\n x: 0.296875,\n y: 0.796875,\n },\n {\n x: 0.328125,\n y: 0.796875,\n },\n {\n x: 0.328125,\n y: 0.796875,\n },\n {\n x: 0.359375,\n y: 0.796875,\n },\n {\n x: 0.359375,\n y: 0.796875,\n },\n {\n x: 0.390625,\n y: 0.796875,\n },\n {\n x: 0.390625,\n y: 0.796875,\n },\n {\n x: 0.421875,\n y: 0.796875,\n },\n {\n x: 0.421875,\n y: 0.796875,\n },\n {\n x: 0.453125,\n y: 0.796875,\n },\n {\n x: 0.453125,\n y: 0.796875,\n },\n {\n x: 0.484375,\n y: 0.796875,\n },\n {\n x: 0.484375,\n y: 0.796875,\n },\n {\n x: 0.515625,\n y: 0.796875,\n },\n {\n x: 0.515625,\n y: 0.796875,\n },\n {\n x: 0.546875,\n y: 0.796875,\n },\n {\n x: 0.546875,\n y: 0.796875,\n },\n {\n x: 0.578125,\n y: 0.796875,\n },\n {\n x: 0.578125,\n y: 0.796875,\n },\n {\n x: 0.609375,\n y: 0.796875,\n },\n {\n x: 0.609375,\n y: 0.796875,\n },\n {\n x: 0.640625,\n y: 0.796875,\n },\n {\n x: 0.640625,\n y: 0.796875,\n },\n {\n x: 0.671875,\n y: 0.796875,\n },\n {\n x: 0.671875,\n y: 0.796875,\n },\n {\n x: 0.703125,\n y: 0.796875,\n },\n {\n x: 0.703125,\n y: 0.796875,\n },\n {\n x: 0.734375,\n y: 0.796875,\n },\n {\n x: 0.734375,\n y: 0.796875,\n },\n {\n x: 0.765625,\n y: 0.796875,\n },\n {\n x: 0.765625,\n y: 0.796875,\n },\n {\n x: 0.796875,\n y: 0.796875,\n },\n {\n x: 0.796875,\n y: 0.796875,\n },\n {\n x: 0.828125,\n y: 0.796875,\n },\n {\n x: 0.828125,\n y: 0.796875,\n },\n {\n x: 0.859375,\n y: 0.796875,\n },\n {\n x: 0.859375,\n y: 0.796875,\n },\n {\n x: 0.890625,\n y: 0.796875,\n },\n {\n x: 0.890625,\n y: 0.796875,\n },\n {\n x: 0.921875,\n y: 0.796875,\n },\n {\n x: 0.921875,\n y: 0.796875,\n },\n {\n x: 0.953125,\n y: 0.796875,\n },\n {\n x: 0.953125,\n y: 0.796875,\n },\n {\n x: 0.984375,\n y: 0.796875,\n },\n {\n x: 0.984375,\n y: 0.796875,\n },\n {\n x: 0.015625,\n y: 0.828125,\n },\n {\n x: 0.015625,\n y: 0.828125,\n },\n {\n x: 0.046875,\n y: 0.828125,\n },\n {\n x: 0.046875,\n y: 0.828125,\n },\n {\n x: 0.078125,\n y: 0.828125,\n },\n {\n x: 0.078125,\n y: 0.828125,\n },\n {\n x: 0.109375,\n y: 0.828125,\n },\n {\n x: 0.109375,\n y: 0.828125,\n },\n {\n x: 0.140625,\n y: 0.828125,\n },\n {\n x: 0.140625,\n y: 0.828125,\n },\n {\n x: 0.171875,\n y: 0.828125,\n },\n {\n x: 0.171875,\n y: 0.828125,\n },\n {\n x: 0.203125,\n y: 0.828125,\n },\n {\n x: 0.203125,\n y: 0.828125,\n },\n {\n x: 0.234375,\n y: 0.828125,\n },\n {\n x: 0.234375,\n y: 0.828125,\n },\n {\n x: 0.265625,\n y: 0.828125,\n },\n {\n x: 0.265625,\n y: 0.828125,\n },\n {\n x: 0.296875,\n y: 0.828125,\n },\n {\n x: 0.296875,\n y: 0.828125,\n },\n {\n x: 0.328125,\n y: 0.828125,\n },\n {\n x: 0.328125,\n y: 0.828125,\n },\n {\n x: 0.359375,\n y: 0.828125,\n },\n {\n x: 0.359375,\n y: 0.828125,\n },\n {\n x: 0.390625,\n y: 0.828125,\n },\n {\n x: 0.390625,\n y: 0.828125,\n },\n {\n x: 0.421875,\n y: 0.828125,\n },\n {\n x: 0.421875,\n y: 0.828125,\n },\n {\n x: 0.453125,\n y: 0.828125,\n },\n {\n x: 0.453125,\n y: 0.828125,\n },\n {\n x: 0.484375,\n y: 0.828125,\n },\n {\n x: 0.484375,\n y: 0.828125,\n },\n {\n x: 0.515625,\n y: 0.828125,\n },\n {\n x: 0.515625,\n y: 0.828125,\n },\n {\n x: 0.546875,\n y: 0.828125,\n },\n {\n x: 0.546875,\n y: 0.828125,\n },\n {\n x: 0.578125,\n y: 0.828125,\n },\n {\n x: 0.578125,\n y: 0.828125,\n },\n {\n x: 0.609375,\n y: 0.828125,\n },\n {\n x: 0.609375,\n y: 0.828125,\n },\n {\n x: 0.640625,\n y: 0.828125,\n },\n {\n x: 0.640625,\n y: 0.828125,\n },\n {\n x: 0.671875,\n y: 0.828125,\n },\n {\n x: 0.671875,\n y: 0.828125,\n },\n {\n x: 0.703125,\n y: 0.828125,\n },\n {\n x: 0.703125,\n y: 0.828125,\n },\n {\n x: 0.734375,\n y: 0.828125,\n },\n {\n x: 0.734375,\n y: 0.828125,\n },\n {\n x: 0.765625,\n y: 0.828125,\n },\n {\n x: 0.765625,\n y: 0.828125,\n },\n {\n x: 0.796875,\n y: 0.828125,\n },\n {\n x: 0.796875,\n y: 0.828125,\n },\n {\n x: 0.828125,\n y: 0.828125,\n },\n {\n x: 0.828125,\n y: 0.828125,\n },\n {\n x: 0.859375,\n y: 0.828125,\n },\n {\n x: 0.859375,\n y: 0.828125,\n },\n {\n x: 0.890625,\n y: 0.828125,\n },\n {\n x: 0.890625,\n y: 0.828125,\n },\n {\n x: 0.921875,\n y: 0.828125,\n },\n {\n x: 0.921875,\n y: 0.828125,\n },\n {\n x: 0.953125,\n y: 0.828125,\n },\n {\n x: 0.953125,\n y: 0.828125,\n },\n {\n x: 0.984375,\n y: 0.828125,\n },\n {\n x: 0.984375,\n y: 0.828125,\n },\n {\n x: 0.015625,\n y: 0.859375,\n },\n {\n x: 0.015625,\n y: 0.859375,\n },\n {\n x: 0.046875,\n y: 0.859375,\n },\n {\n x: 0.046875,\n y: 0.859375,\n },\n {\n x: 0.078125,\n y: 0.859375,\n },\n {\n x: 0.078125,\n y: 0.859375,\n },\n {\n x: 0.109375,\n y: 0.859375,\n },\n {\n x: 0.109375,\n y: 0.859375,\n },\n {\n x: 0.140625,\n y: 0.859375,\n },\n {\n x: 0.140625,\n y: 0.859375,\n },\n {\n x: 0.171875,\n y: 0.859375,\n },\n {\n x: 0.171875,\n y: 0.859375,\n },\n {\n x: 0.203125,\n y: 0.859375,\n },\n {\n x: 0.203125,\n y: 0.859375,\n },\n {\n x: 0.234375,\n y: 0.859375,\n },\n {\n x: 0.234375,\n y: 0.859375,\n },\n {\n x: 0.265625,\n y: 0.859375,\n },\n {\n x: 0.265625,\n y: 0.859375,\n },\n {\n x: 0.296875,\n y: 0.859375,\n },\n {\n x: 0.296875,\n y: 0.859375,\n },\n {\n x: 0.328125,\n y: 0.859375,\n },\n {\n x: 0.328125,\n y: 0.859375,\n },\n {\n x: 0.359375,\n y: 0.859375,\n },\n {\n x: 0.359375,\n y: 0.859375,\n },\n {\n x: 0.390625,\n y: 0.859375,\n },\n {\n x: 0.390625,\n y: 0.859375,\n },\n {\n x: 0.421875,\n y: 0.859375,\n },\n {\n x: 0.421875,\n y: 0.859375,\n },\n {\n x: 0.453125,\n y: 0.859375,\n },\n {\n x: 0.453125,\n y: 0.859375,\n },\n {\n x: 0.484375,\n y: 0.859375,\n },\n {\n x: 0.484375,\n y: 0.859375,\n },\n {\n x: 0.515625,\n y: 0.859375,\n },\n {\n x: 0.515625,\n y: 0.859375,\n },\n {\n x: 0.546875,\n y: 0.859375,\n },\n {\n x: 0.546875,\n y: 0.859375,\n },\n {\n x: 0.578125,\n y: 0.859375,\n },\n {\n x: 0.578125,\n y: 0.859375,\n },\n {\n x: 0.609375,\n y: 0.859375,\n },\n {\n x: 0.609375,\n y: 0.859375,\n },\n {\n x: 0.640625,\n y: 0.859375,\n },\n {\n x: 0.640625,\n y: 0.859375,\n },\n {\n x: 0.671875,\n y: 0.859375,\n },\n {\n x: 0.671875,\n y: 0.859375,\n },\n {\n x: 0.703125,\n y: 0.859375,\n },\n {\n x: 0.703125,\n y: 0.859375,\n },\n {\n x: 0.734375,\n y: 0.859375,\n },\n {\n x: 0.734375,\n y: 0.859375,\n },\n {\n x: 0.765625,\n y: 0.859375,\n },\n {\n x: 0.765625,\n y: 0.859375,\n },\n {\n x: 0.796875,\n y: 0.859375,\n },\n {\n x: 0.796875,\n y: 0.859375,\n },\n {\n x: 0.828125,\n y: 0.859375,\n },\n {\n x: 0.828125,\n y: 0.859375,\n },\n {\n x: 0.859375,\n y: 0.859375,\n },\n {\n x: 0.859375,\n y: 0.859375,\n },\n {\n x: 0.890625,\n y: 0.859375,\n },\n {\n x: 0.890625,\n y: 0.859375,\n },\n {\n x: 0.921875,\n y: 0.859375,\n },\n {\n x: 0.921875,\n y: 0.859375,\n },\n {\n x: 0.953125,\n y: 0.859375,\n },\n {\n x: 0.953125,\n y: 0.859375,\n },\n {\n x: 0.984375,\n y: 0.859375,\n },\n {\n x: 0.984375,\n y: 0.859375,\n },\n {\n x: 0.015625,\n y: 0.890625,\n },\n {\n x: 0.015625,\n y: 0.890625,\n },\n {\n x: 0.046875,\n y: 0.890625,\n },\n {\n x: 0.046875,\n y: 0.890625,\n },\n {\n x: 0.078125,\n y: 0.890625,\n },\n {\n x: 0.078125,\n y: 0.890625,\n },\n {\n x: 0.109375,\n y: 0.890625,\n },\n {\n x: 0.109375,\n y: 0.890625,\n },\n {\n x: 0.140625,\n y: 0.890625,\n },\n {\n x: 0.140625,\n y: 0.890625,\n },\n {\n x: 0.171875,\n y: 0.890625,\n },\n {\n x: 0.171875,\n y: 0.890625,\n },\n {\n x: 0.203125,\n y: 0.890625,\n },\n {\n x: 0.203125,\n y: 0.890625,\n },\n {\n x: 0.234375,\n y: 0.890625,\n },\n {\n x: 0.234375,\n y: 0.890625,\n },\n {\n x: 0.265625,\n y: 0.890625,\n },\n {\n x: 0.265625,\n y: 0.890625,\n },\n {\n x: 0.296875,\n y: 0.890625,\n },\n {\n x: 0.296875,\n y: 0.890625,\n },\n {\n x: 0.328125,\n y: 0.890625,\n },\n {\n x: 0.328125,\n y: 0.890625,\n },\n {\n x: 0.359375,\n y: 0.890625,\n },\n {\n x: 0.359375,\n y: 0.890625,\n },\n {\n x: 0.390625,\n y: 0.890625,\n },\n {\n x: 0.390625,\n y: 0.890625,\n },\n {\n x: 0.421875,\n y: 0.890625,\n },\n {\n x: 0.421875,\n y: 0.890625,\n },\n {\n x: 0.453125,\n y: 0.890625,\n },\n {\n x: 0.453125,\n y: 0.890625,\n },\n {\n x: 0.484375,\n y: 0.890625,\n },\n {\n x: 0.484375,\n y: 0.890625,\n },\n {\n x: 0.515625,\n y: 0.890625,\n },\n {\n x: 0.515625,\n y: 0.890625,\n },\n {\n x: 0.546875,\n y: 0.890625,\n },\n {\n x: 0.546875,\n y: 0.890625,\n },\n {\n x: 0.578125,\n y: 0.890625,\n },\n {\n x: 0.578125,\n y: 0.890625,\n },\n {\n x: 0.609375,\n y: 0.890625,\n },\n {\n x: 0.609375,\n y: 0.890625,\n },\n {\n x: 0.640625,\n y: 0.890625,\n },\n {\n x: 0.640625,\n y: 0.890625,\n },\n {\n x: 0.671875,\n y: 0.890625,\n },\n {\n x: 0.671875,\n y: 0.890625,\n },\n {\n x: 0.703125,\n y: 0.890625,\n },\n {\n x: 0.703125,\n y: 0.890625,\n },\n {\n x: 0.734375,\n y: 0.890625,\n },\n {\n x: 0.734375,\n y: 0.890625,\n },\n {\n x: 0.765625,\n y: 0.890625,\n },\n {\n x: 0.765625,\n y: 0.890625,\n },\n {\n x: 0.796875,\n y: 0.890625,\n },\n {\n x: 0.796875,\n y: 0.890625,\n },\n {\n x: 0.828125,\n y: 0.890625,\n },\n {\n x: 0.828125,\n y: 0.890625,\n },\n {\n x: 0.859375,\n y: 0.890625,\n },\n {\n x: 0.859375,\n y: 0.890625,\n },\n {\n x: 0.890625,\n y: 0.890625,\n },\n {\n x: 0.890625,\n y: 0.890625,\n },\n {\n x: 0.921875,\n y: 0.890625,\n },\n {\n x: 0.921875,\n y: 0.890625,\n },\n {\n x: 0.953125,\n y: 0.890625,\n },\n {\n x: 0.953125,\n y: 0.890625,\n },\n {\n x: 0.984375,\n y: 0.890625,\n },\n {\n x: 0.984375,\n y: 0.890625,\n },\n {\n x: 0.015625,\n y: 0.921875,\n },\n {\n x: 0.015625,\n y: 0.921875,\n },\n {\n x: 0.046875,\n y: 0.921875,\n },\n {\n x: 0.046875,\n y: 0.921875,\n },\n {\n x: 0.078125,\n y: 0.921875,\n },\n {\n x: 0.078125,\n y: 0.921875,\n },\n {\n x: 0.109375,\n y: 0.921875,\n },\n {\n x: 0.109375,\n y: 0.921875,\n },\n {\n x: 0.140625,\n y: 0.921875,\n },\n {\n x: 0.140625,\n y: 0.921875,\n },\n {\n x: 0.171875,\n y: 0.921875,\n },\n {\n x: 0.171875,\n y: 0.921875,\n },\n {\n x: 0.203125,\n y: 0.921875,\n },\n {\n x: 0.203125,\n y: 0.921875,\n },\n {\n x: 0.234375,\n y: 0.921875,\n },\n {\n x: 0.234375,\n y: 0.921875,\n },\n {\n x: 0.265625,\n y: 0.921875,\n },\n {\n x: 0.265625,\n y: 0.921875,\n },\n {\n x: 0.296875,\n y: 0.921875,\n },\n {\n x: 0.296875,\n y: 0.921875,\n },\n {\n x: 0.328125,\n y: 0.921875,\n },\n {\n x: 0.328125,\n y: 0.921875,\n },\n {\n x: 0.359375,\n y: 0.921875,\n },\n {\n x: 0.359375,\n y: 0.921875,\n },\n {\n x: 0.390625,\n y: 0.921875,\n },\n {\n x: 0.390625,\n y: 0.921875,\n },\n {\n x: 0.421875,\n y: 0.921875,\n },\n {\n x: 0.421875,\n y: 0.921875,\n },\n {\n x: 0.453125,\n y: 0.921875,\n },\n {\n x: 0.453125,\n y: 0.921875,\n },\n {\n x: 0.484375,\n y: 0.921875,\n },\n {\n x: 0.484375,\n y: 0.921875,\n },\n {\n x: 0.515625,\n y: 0.921875,\n },\n {\n x: 0.515625,\n y: 0.921875,\n },\n {\n x: 0.546875,\n y: 0.921875,\n },\n {\n x: 0.546875,\n y: 0.921875,\n },\n {\n x: 0.578125,\n y: 0.921875,\n },\n {\n x: 0.578125,\n y: 0.921875,\n },\n {\n x: 0.609375,\n y: 0.921875,\n },\n {\n x: 0.609375,\n y: 0.921875,\n },\n {\n x: 0.640625,\n y: 0.921875,\n },\n {\n x: 0.640625,\n y: 0.921875,\n },\n {\n x: 0.671875,\n y: 0.921875,\n },\n {\n x: 0.671875,\n y: 0.921875,\n },\n {\n x: 0.703125,\n y: 0.921875,\n },\n {\n x: 0.703125,\n y: 0.921875,\n },\n {\n x: 0.734375,\n y: 0.921875,\n },\n {\n x: 0.734375,\n y: 0.921875,\n },\n {\n x: 0.765625,\n y: 0.921875,\n },\n {\n x: 0.765625,\n y: 0.921875,\n },\n {\n x: 0.796875,\n y: 0.921875,\n },\n {\n x: 0.796875,\n y: 0.921875,\n },\n {\n x: 0.828125,\n y: 0.921875,\n },\n {\n x: 0.828125,\n y: 0.921875,\n },\n {\n x: 0.859375,\n y: 0.921875,\n },\n {\n x: 0.859375,\n y: 0.921875,\n },\n {\n x: 0.890625,\n y: 0.921875,\n },\n {\n x: 0.890625,\n y: 0.921875,\n },\n {\n x: 0.921875,\n y: 0.921875,\n },\n {\n x: 0.921875,\n y: 0.921875,\n },\n {\n x: 0.953125,\n y: 0.921875,\n },\n {\n x: 0.953125,\n y: 0.921875,\n },\n {\n x: 0.984375,\n y: 0.921875,\n },\n {\n x: 0.984375,\n y: 0.921875,\n },\n {\n x: 0.015625,\n y: 0.953125,\n },\n {\n x: 0.015625,\n y: 0.953125,\n },\n {\n x: 0.046875,\n y: 0.953125,\n },\n {\n x: 0.046875,\n y: 0.953125,\n },\n {\n x: 0.078125,\n y: 0.953125,\n },\n {\n x: 0.078125,\n y: 0.953125,\n },\n {\n x: 0.109375,\n y: 0.953125,\n },\n {\n x: 0.109375,\n y: 0.953125,\n },\n {\n x: 0.140625,\n y: 0.953125,\n },\n {\n x: 0.140625,\n y: 0.953125,\n },\n {\n x: 0.171875,\n y: 0.953125,\n },\n {\n x: 0.171875,\n y: 0.953125,\n },\n {\n x: 0.203125,\n y: 0.953125,\n },\n {\n x: 0.203125,\n y: 0.953125,\n },\n {\n x: 0.234375,\n y: 0.953125,\n },\n {\n x: 0.234375,\n y: 0.953125,\n },\n {\n x: 0.265625,\n y: 0.953125,\n },\n {\n x: 0.265625,\n y: 0.953125,\n },\n {\n x: 0.296875,\n y: 0.953125,\n },\n {\n x: 0.296875,\n y: 0.953125,\n },\n {\n x: 0.328125,\n y: 0.953125,\n },\n {\n x: 0.328125,\n y: 0.953125,\n },\n {\n x: 0.359375,\n y: 0.953125,\n },\n {\n x: 0.359375,\n y: 0.953125,\n },\n {\n x: 0.390625,\n y: 0.953125,\n },\n {\n x: 0.390625,\n y: 0.953125,\n },\n {\n x: 0.421875,\n y: 0.953125,\n },\n {\n x: 0.421875,\n y: 0.953125,\n },\n {\n x: 0.453125,\n y: 0.953125,\n },\n {\n x: 0.453125,\n y: 0.953125,\n },\n {\n x: 0.484375,\n y: 0.953125,\n },\n {\n x: 0.484375,\n y: 0.953125,\n },\n {\n x: 0.515625,\n y: 0.953125,\n },\n {\n x: 0.515625,\n y: 0.953125,\n },\n {\n x: 0.546875,\n y: 0.953125,\n },\n {\n x: 0.546875,\n y: 0.953125,\n },\n {\n x: 0.578125,\n y: 0.953125,\n },\n {\n x: 0.578125,\n y: 0.953125,\n },\n {\n x: 0.609375,\n y: 0.953125,\n },\n {\n x: 0.609375,\n y: 0.953125,\n },\n {\n x: 0.640625,\n y: 0.953125,\n },\n {\n x: 0.640625,\n y: 0.953125,\n },\n {\n x: 0.671875,\n y: 0.953125,\n },\n {\n x: 0.671875,\n y: 0.953125,\n },\n {\n x: 0.703125,\n y: 0.953125,\n },\n {\n x: 0.703125,\n y: 0.953125,\n },\n {\n x: 0.734375,\n y: 0.953125,\n },\n {\n x: 0.734375,\n y: 0.953125,\n },\n {\n x: 0.765625,\n y: 0.953125,\n },\n {\n x: 0.765625,\n y: 0.953125,\n },\n {\n x: 0.796875,\n y: 0.953125,\n },\n {\n x: 0.796875,\n y: 0.953125,\n },\n {\n x: 0.828125,\n y: 0.953125,\n },\n {\n x: 0.828125,\n y: 0.953125,\n },\n {\n x: 0.859375,\n y: 0.953125,\n },\n {\n x: 0.859375,\n y: 0.953125,\n },\n {\n x: 0.890625,\n y: 0.953125,\n },\n {\n x: 0.890625,\n y: 0.953125,\n },\n {\n x: 0.921875,\n y: 0.953125,\n },\n {\n x: 0.921875,\n y: 0.953125,\n },\n {\n x: 0.953125,\n y: 0.953125,\n },\n {\n x: 0.953125,\n y: 0.953125,\n },\n {\n x: 0.984375,\n y: 0.953125,\n },\n {\n x: 0.984375,\n y: 0.953125,\n },\n {\n x: 0.015625,\n y: 0.984375,\n },\n {\n x: 0.015625,\n y: 0.984375,\n },\n {\n x: 0.046875,\n y: 0.984375,\n },\n {\n x: 0.046875,\n y: 0.984375,\n },\n {\n x: 0.078125,\n y: 0.984375,\n },\n {\n x: 0.078125,\n y: 0.984375,\n },\n {\n x: 0.109375,\n y: 0.984375,\n },\n {\n x: 0.109375,\n y: 0.984375,\n },\n {\n x: 0.140625,\n y: 0.984375,\n },\n {\n x: 0.140625,\n y: 0.984375,\n },\n {\n x: 0.171875,\n y: 0.984375,\n },\n {\n x: 0.171875,\n y: 0.984375,\n },\n {\n x: 0.203125,\n y: 0.984375,\n },\n {\n x: 0.203125,\n y: 0.984375,\n },\n {\n x: 0.234375,\n y: 0.984375,\n },\n {\n x: 0.234375,\n y: 0.984375,\n },\n {\n x: 0.265625,\n y: 0.984375,\n },\n {\n x: 0.265625,\n y: 0.984375,\n },\n {\n x: 0.296875,\n y: 0.984375,\n },\n {\n x: 0.296875,\n y: 0.984375,\n },\n {\n x: 0.328125,\n y: 0.984375,\n },\n {\n x: 0.328125,\n y: 0.984375,\n },\n {\n x: 0.359375,\n y: 0.984375,\n },\n {\n x: 0.359375,\n y: 0.984375,\n },\n {\n x: 0.390625,\n y: 0.984375,\n },\n {\n x: 0.390625,\n y: 0.984375,\n },\n {\n x: 0.421875,\n y: 0.984375,\n },\n {\n x: 0.421875,\n y: 0.984375,\n },\n {\n x: 0.453125,\n y: 0.984375,\n },\n {\n x: 0.453125,\n y: 0.984375,\n },\n {\n x: 0.484375,\n y: 0.984375,\n },\n {\n x: 0.484375,\n y: 0.984375,\n },\n {\n x: 0.515625,\n y: 0.984375,\n },\n {\n x: 0.515625,\n y: 0.984375,\n },\n {\n x: 0.546875,\n y: 0.984375,\n },\n {\n x: 0.546875,\n y: 0.984375,\n },\n {\n x: 0.578125,\n y: 0.984375,\n },\n {\n x: 0.578125,\n y: 0.984375,\n },\n {\n x: 0.609375,\n y: 0.984375,\n },\n {\n x: 0.609375,\n y: 0.984375,\n },\n {\n x: 0.640625,\n y: 0.984375,\n },\n {\n x: 0.640625,\n y: 0.984375,\n },\n {\n x: 0.671875,\n y: 0.984375,\n },\n {\n x: 0.671875,\n y: 0.984375,\n },\n {\n x: 0.703125,\n y: 0.984375,\n },\n {\n x: 0.703125,\n y: 0.984375,\n },\n {\n x: 0.734375,\n y: 0.984375,\n },\n {\n x: 0.734375,\n y: 0.984375,\n },\n {\n x: 0.765625,\n y: 0.984375,\n },\n {\n x: 0.765625,\n y: 0.984375,\n },\n {\n x: 0.796875,\n y: 0.984375,\n },\n {\n x: 0.796875,\n y: 0.984375,\n },\n {\n x: 0.828125,\n y: 0.984375,\n },\n {\n x: 0.828125,\n y: 0.984375,\n },\n {\n x: 0.859375,\n y: 0.984375,\n },\n {\n x: 0.859375,\n y: 0.984375,\n },\n {\n x: 0.890625,\n y: 0.984375,\n },\n {\n x: 0.890625,\n y: 0.984375,\n },\n {\n x: 0.921875,\n y: 0.984375,\n },\n {\n x: 0.921875,\n y: 0.984375,\n },\n {\n x: 0.953125,\n y: 0.984375,\n },\n {\n x: 0.953125,\n y: 0.984375,\n },\n {\n x: 0.984375,\n y: 0.984375,\n },\n {\n x: 0.984375,\n y: 0.984375,\n },\n {\n x: 0.03125,\n y: 0.03125,\n },\n {\n x: 0.03125,\n y: 0.03125,\n },\n {\n x: 0.09375,\n y: 0.03125,\n },\n {\n x: 0.09375,\n y: 0.03125,\n },\n {\n x: 0.15625,\n y: 0.03125,\n },\n {\n x: 0.15625,\n y: 0.03125,\n },\n {\n x: 0.21875,\n y: 0.03125,\n },\n {\n x: 0.21875,\n y: 0.03125,\n },\n {\n x: 0.28125,\n y: 0.03125,\n },\n {\n x: 0.28125,\n y: 0.03125,\n },\n {\n x: 0.34375,\n y: 0.03125,\n },\n {\n x: 0.34375,\n y: 0.03125,\n },\n {\n x: 0.40625,\n y: 0.03125,\n },\n {\n x: 0.40625,\n y: 0.03125,\n },\n {\n x: 0.46875,\n y: 0.03125,\n },\n {\n x: 0.46875,\n y: 0.03125,\n },\n {\n x: 0.53125,\n y: 0.03125,\n },\n {\n x: 0.53125,\n y: 0.03125,\n },\n {\n x: 0.59375,\n y: 0.03125,\n },\n {\n x: 0.59375,\n y: 0.03125,\n },\n {\n x: 0.65625,\n y: 0.03125,\n },\n {\n x: 0.65625,\n y: 0.03125,\n },\n {\n x: 0.71875,\n y: 0.03125,\n },\n {\n x: 0.71875,\n y: 0.03125,\n },\n {\n x: 0.78125,\n y: 0.03125,\n },\n {\n x: 0.78125,\n y: 0.03125,\n },\n {\n x: 0.84375,\n y: 0.03125,\n },\n {\n x: 0.84375,\n y: 0.03125,\n },\n {\n x: 0.90625,\n y: 0.03125,\n },\n {\n x: 0.90625,\n y: 0.03125,\n },\n {\n x: 0.96875,\n y: 0.03125,\n },\n {\n x: 0.96875,\n y: 0.03125,\n },\n {\n x: 0.03125,\n y: 0.09375,\n },\n {\n x: 0.03125,\n y: 0.09375,\n },\n {\n x: 0.09375,\n y: 0.09375,\n },\n {\n x: 0.09375,\n y: 0.09375,\n },\n {\n x: 0.15625,\n y: 0.09375,\n },\n {\n x: 0.15625,\n y: 0.09375,\n },\n {\n x: 0.21875,\n y: 0.09375,\n },\n {\n x: 0.21875,\n y: 0.09375,\n },\n {\n x: 0.28125,\n y: 0.09375,\n },\n {\n x: 0.28125,\n y: 0.09375,\n },\n {\n x: 0.34375,\n y: 0.09375,\n },\n {\n x: 0.34375,\n y: 0.09375,\n },\n {\n x: 0.40625,\n y: 0.09375,\n },\n {\n x: 0.40625,\n y: 0.09375,\n },\n {\n x: 0.46875,\n y: 0.09375,\n },\n {\n x: 0.46875,\n y: 0.09375,\n },\n {\n x: 0.53125,\n y: 0.09375,\n },\n {\n x: 0.53125,\n y: 0.09375,\n },\n {\n x: 0.59375,\n y: 0.09375,\n },\n {\n x: 0.59375,\n y: 0.09375,\n },\n {\n x: 0.65625,\n y: 0.09375,\n },\n {\n x: 0.65625,\n y: 0.09375,\n },\n {\n x: 0.71875,\n y: 0.09375,\n },\n {\n x: 0.71875,\n y: 0.09375,\n },\n {\n x: 0.78125,\n y: 0.09375,\n },\n {\n x: 0.78125,\n y: 0.09375,\n },\n {\n x: 0.84375,\n y: 0.09375,\n },\n {\n x: 0.84375,\n y: 0.09375,\n },\n {\n x: 0.90625,\n y: 0.09375,\n },\n {\n x: 0.90625,\n y: 0.09375,\n },\n {\n x: 0.96875,\n y: 0.09375,\n },\n {\n x: 0.96875,\n y: 0.09375,\n },\n {\n x: 0.03125,\n y: 0.15625,\n },\n {\n x: 0.03125,\n y: 0.15625,\n },\n {\n x: 0.09375,\n y: 0.15625,\n },\n {\n x: 0.09375,\n y: 0.15625,\n },\n {\n x: 0.15625,\n y: 0.15625,\n },\n {\n x: 0.15625,\n y: 0.15625,\n },\n {\n x: 0.21875,\n y: 0.15625,\n },\n {\n x: 0.21875,\n y: 0.15625,\n },\n {\n x: 0.28125,\n y: 0.15625,\n },\n {\n x: 0.28125,\n y: 0.15625,\n },\n {\n x: 0.34375,\n y: 0.15625,\n },\n {\n x: 0.34375,\n y: 0.15625,\n },\n {\n x: 0.40625,\n y: 0.15625,\n },\n {\n x: 0.40625,\n y: 0.15625,\n },\n {\n x: 0.46875,\n y: 0.15625,\n },\n {\n x: 0.46875,\n y: 0.15625,\n },\n {\n x: 0.53125,\n y: 0.15625,\n },\n {\n x: 0.53125,\n y: 0.15625,\n },\n {\n x: 0.59375,\n y: 0.15625,\n },\n {\n x: 0.59375,\n y: 0.15625,\n },\n {\n x: 0.65625,\n y: 0.15625,\n },\n {\n x: 0.65625,\n y: 0.15625,\n },\n {\n x: 0.71875,\n y: 0.15625,\n },\n {\n x: 0.71875,\n y: 0.15625,\n },\n {\n x: 0.78125,\n y: 0.15625,\n },\n {\n x: 0.78125,\n y: 0.15625,\n },\n {\n x: 0.84375,\n y: 0.15625,\n },\n {\n x: 0.84375,\n y: 0.15625,\n },\n {\n x: 0.90625,\n y: 0.15625,\n },\n {\n x: 0.90625,\n y: 0.15625,\n },\n {\n x: 0.96875,\n y: 0.15625,\n },\n {\n x: 0.96875,\n y: 0.15625,\n },\n {\n x: 0.03125,\n y: 0.21875,\n },\n {\n x: 0.03125,\n y: 0.21875,\n },\n {\n x: 0.09375,\n y: 0.21875,\n },\n {\n x: 0.09375,\n y: 0.21875,\n },\n {\n x: 0.15625,\n y: 0.21875,\n },\n {\n x: 0.15625,\n y: 0.21875,\n },\n {\n x: 0.21875,\n y: 0.21875,\n },\n {\n x: 0.21875,\n y: 0.21875,\n },\n {\n x: 0.28125,\n y: 0.21875,\n },\n {\n x: 0.28125,\n y: 0.21875,\n },\n {\n x: 0.34375,\n y: 0.21875,\n },\n {\n x: 0.34375,\n y: 0.21875,\n },\n {\n x: 0.40625,\n y: 0.21875,\n },\n {\n x: 0.40625,\n y: 0.21875,\n },\n {\n x: 0.46875,\n y: 0.21875,\n },\n {\n x: 0.46875,\n y: 0.21875,\n },\n {\n x: 0.53125,\n y: 0.21875,\n },\n {\n x: 0.53125,\n y: 0.21875,\n },\n {\n x: 0.59375,\n y: 0.21875,\n },\n {\n x: 0.59375,\n y: 0.21875,\n },\n {\n x: 0.65625,\n y: 0.21875,\n },\n {\n x: 0.65625,\n y: 0.21875,\n },\n {\n x: 0.71875,\n y: 0.21875,\n },\n {\n x: 0.71875,\n y: 0.21875,\n },\n {\n x: 0.78125,\n y: 0.21875,\n },\n {\n x: 0.78125,\n y: 0.21875,\n },\n {\n x: 0.84375,\n y: 0.21875,\n },\n {\n x: 0.84375,\n y: 0.21875,\n },\n {\n x: 0.90625,\n y: 0.21875,\n },\n {\n x: 0.90625,\n y: 0.21875,\n },\n {\n x: 0.96875,\n y: 0.21875,\n },\n {\n x: 0.96875,\n y: 0.21875,\n },\n {\n x: 0.03125,\n y: 0.28125,\n },\n {\n x: 0.03125,\n y: 0.28125,\n },\n {\n x: 0.09375,\n y: 0.28125,\n },\n {\n x: 0.09375,\n y: 0.28125,\n },\n {\n x: 0.15625,\n y: 0.28125,\n },\n {\n x: 0.15625,\n y: 0.28125,\n },\n {\n x: 0.21875,\n y: 0.28125,\n },\n {\n x: 0.21875,\n y: 0.28125,\n },\n {\n x: 0.28125,\n y: 0.28125,\n },\n {\n x: 0.28125,\n y: 0.28125,\n },\n {\n x: 0.34375,\n y: 0.28125,\n },\n {\n x: 0.34375,\n y: 0.28125,\n },\n {\n x: 0.40625,\n y: 0.28125,\n },\n {\n x: 0.40625,\n y: 0.28125,\n },\n {\n x: 0.46875,\n y: 0.28125,\n },\n {\n x: 0.46875,\n y: 0.28125,\n },\n {\n x: 0.53125,\n y: 0.28125,\n },\n {\n x: 0.53125,\n y: 0.28125,\n },\n {\n x: 0.59375,\n y: 0.28125,\n },\n {\n x: 0.59375,\n y: 0.28125,\n },\n {\n x: 0.65625,\n y: 0.28125,\n },\n {\n x: 0.65625,\n y: 0.28125,\n },\n {\n x: 0.71875,\n y: 0.28125,\n },\n {\n x: 0.71875,\n y: 0.28125,\n },\n {\n x: 0.78125,\n y: 0.28125,\n },\n {\n x: 0.78125,\n y: 0.28125,\n },\n {\n x: 0.84375,\n y: 0.28125,\n },\n {\n x: 0.84375,\n y: 0.28125,\n },\n {\n x: 0.90625,\n y: 0.28125,\n },\n {\n x: 0.90625,\n y: 0.28125,\n },\n {\n x: 0.96875,\n y: 0.28125,\n },\n {\n x: 0.96875,\n y: 0.28125,\n },\n {\n x: 0.03125,\n y: 0.34375,\n },\n {\n x: 0.03125,\n y: 0.34375,\n },\n {\n x: 0.09375,\n y: 0.34375,\n },\n {\n x: 0.09375,\n y: 0.34375,\n },\n {\n x: 0.15625,\n y: 0.34375,\n },\n {\n x: 0.15625,\n y: 0.34375,\n },\n {\n x: 0.21875,\n y: 0.34375,\n },\n {\n x: 0.21875,\n y: 0.34375,\n },\n {\n x: 0.28125,\n y: 0.34375,\n },\n {\n x: 0.28125,\n y: 0.34375,\n },\n {\n x: 0.34375,\n y: 0.34375,\n },\n {\n x: 0.34375,\n y: 0.34375,\n },\n {\n x: 0.40625,\n y: 0.34375,\n },\n {\n x: 0.40625,\n y: 0.34375,\n },\n {\n x: 0.46875,\n y: 0.34375,\n },\n {\n x: 0.46875,\n y: 0.34375,\n },\n {\n x: 0.53125,\n y: 0.34375,\n },\n {\n x: 0.53125,\n y: 0.34375,\n },\n {\n x: 0.59375,\n y: 0.34375,\n },\n {\n x: 0.59375,\n y: 0.34375,\n },\n {\n x: 0.65625,\n y: 0.34375,\n },\n {\n x: 0.65625,\n y: 0.34375,\n },\n {\n x: 0.71875,\n y: 0.34375,\n },\n {\n x: 0.71875,\n y: 0.34375,\n },\n {\n x: 0.78125,\n y: 0.34375,\n },\n {\n x: 0.78125,\n y: 0.34375,\n },\n {\n x: 0.84375,\n y: 0.34375,\n },\n {\n x: 0.84375,\n y: 0.34375,\n },\n {\n x: 0.90625,\n y: 0.34375,\n },\n {\n x: 0.90625,\n y: 0.34375,\n },\n {\n x: 0.96875,\n y: 0.34375,\n },\n {\n x: 0.96875,\n y: 0.34375,\n },\n {\n x: 0.03125,\n y: 0.40625,\n },\n {\n x: 0.03125,\n y: 0.40625,\n },\n {\n x: 0.09375,\n y: 0.40625,\n },\n {\n x: 0.09375,\n y: 0.40625,\n },\n {\n x: 0.15625,\n y: 0.40625,\n },\n {\n x: 0.15625,\n y: 0.40625,\n },\n {\n x: 0.21875,\n y: 0.40625,\n },\n {\n x: 0.21875,\n y: 0.40625,\n },\n {\n x: 0.28125,\n y: 0.40625,\n },\n {\n x: 0.28125,\n y: 0.40625,\n },\n {\n x: 0.34375,\n y: 0.40625,\n },\n {\n x: 0.34375,\n y: 0.40625,\n },\n {\n x: 0.40625,\n y: 0.40625,\n },\n {\n x: 0.40625,\n y: 0.40625,\n },\n {\n x: 0.46875,\n y: 0.40625,\n },\n {\n x: 0.46875,\n y: 0.40625,\n },\n {\n x: 0.53125,\n y: 0.40625,\n },\n {\n x: 0.53125,\n y: 0.40625,\n },\n {\n x: 0.59375,\n y: 0.40625,\n },\n {\n x: 0.59375,\n y: 0.40625,\n },\n {\n x: 0.65625,\n y: 0.40625,\n },\n {\n x: 0.65625,\n y: 0.40625,\n },\n {\n x: 0.71875,\n y: 0.40625,\n },\n {\n x: 0.71875,\n y: 0.40625,\n },\n {\n x: 0.78125,\n y: 0.40625,\n },\n {\n x: 0.78125,\n y: 0.40625,\n },\n {\n x: 0.84375,\n y: 0.40625,\n },\n {\n x: 0.84375,\n y: 0.40625,\n },\n {\n x: 0.90625,\n y: 0.40625,\n },\n {\n x: 0.90625,\n y: 0.40625,\n },\n {\n x: 0.96875,\n y: 0.40625,\n },\n {\n x: 0.96875,\n y: 0.40625,\n },\n {\n x: 0.03125,\n y: 0.46875,\n },\n {\n x: 0.03125,\n y: 0.46875,\n },\n {\n x: 0.09375,\n y: 0.46875,\n },\n {\n x: 0.09375,\n y: 0.46875,\n },\n {\n x: 0.15625,\n y: 0.46875,\n },\n {\n x: 0.15625,\n y: 0.46875,\n },\n {\n x: 0.21875,\n y: 0.46875,\n },\n {\n x: 0.21875,\n y: 0.46875,\n },\n {\n x: 0.28125,\n y: 0.46875,\n },\n {\n x: 0.28125,\n y: 0.46875,\n },\n {\n x: 0.34375,\n y: 0.46875,\n },\n {\n x: 0.34375,\n y: 0.46875,\n },\n {\n x: 0.40625,\n y: 0.46875,\n },\n {\n x: 0.40625,\n y: 0.46875,\n },\n {\n x: 0.46875,\n y: 0.46875,\n },\n {\n x: 0.46875,\n y: 0.46875,\n },\n {\n x: 0.53125,\n y: 0.46875,\n },\n {\n x: 0.53125,\n y: 0.46875,\n },\n {\n x: 0.59375,\n y: 0.46875,\n },\n {\n x: 0.59375,\n y: 0.46875,\n },\n {\n x: 0.65625,\n y: 0.46875,\n },\n {\n x: 0.65625,\n y: 0.46875,\n },\n {\n x: 0.71875,\n y: 0.46875,\n },\n {\n x: 0.71875,\n y: 0.46875,\n },\n {\n x: 0.78125,\n y: 0.46875,\n },\n {\n x: 0.78125,\n y: 0.46875,\n },\n {\n x: 0.84375,\n y: 0.46875,\n },\n {\n x: 0.84375,\n y: 0.46875,\n },\n {\n x: 0.90625,\n y: 0.46875,\n },\n {\n x: 0.90625,\n y: 0.46875,\n },\n {\n x: 0.96875,\n y: 0.46875,\n },\n {\n x: 0.96875,\n y: 0.46875,\n },\n {\n x: 0.03125,\n y: 0.53125,\n },\n {\n x: 0.03125,\n y: 0.53125,\n },\n {\n x: 0.09375,\n y: 0.53125,\n },\n {\n x: 0.09375,\n y: 0.53125,\n },\n {\n x: 0.15625,\n y: 0.53125,\n },\n {\n x: 0.15625,\n y: 0.53125,\n },\n {\n x: 0.21875,\n y: 0.53125,\n },\n {\n x: 0.21875,\n y: 0.53125,\n },\n {\n x: 0.28125,\n y: 0.53125,\n },\n {\n x: 0.28125,\n y: 0.53125,\n },\n {\n x: 0.34375,\n y: 0.53125,\n },\n {\n x: 0.34375,\n y: 0.53125,\n },\n {\n x: 0.40625,\n y: 0.53125,\n },\n {\n x: 0.40625,\n y: 0.53125,\n },\n {\n x: 0.46875,\n y: 0.53125,\n },\n {\n x: 0.46875,\n y: 0.53125,\n },\n {\n x: 0.53125,\n y: 0.53125,\n },\n {\n x: 0.53125,\n y: 0.53125,\n },\n {\n x: 0.59375,\n y: 0.53125,\n },\n {\n x: 0.59375,\n y: 0.53125,\n },\n {\n x: 0.65625,\n y: 0.53125,\n },\n {\n x: 0.65625,\n y: 0.53125,\n },\n {\n x: 0.71875,\n y: 0.53125,\n },\n {\n x: 0.71875,\n y: 0.53125,\n },\n {\n x: 0.78125,\n y: 0.53125,\n },\n {\n x: 0.78125,\n y: 0.53125,\n },\n {\n x: 0.84375,\n y: 0.53125,\n },\n {\n x: 0.84375,\n y: 0.53125,\n },\n {\n x: 0.90625,\n y: 0.53125,\n },\n {\n x: 0.90625,\n y: 0.53125,\n },\n {\n x: 0.96875,\n y: 0.53125,\n },\n {\n x: 0.96875,\n y: 0.53125,\n },\n {\n x: 0.03125,\n y: 0.59375,\n },\n {\n x: 0.03125,\n y: 0.59375,\n },\n {\n x: 0.09375,\n y: 0.59375,\n },\n {\n x: 0.09375,\n y: 0.59375,\n },\n {\n x: 0.15625,\n y: 0.59375,\n },\n {\n x: 0.15625,\n y: 0.59375,\n },\n {\n x: 0.21875,\n y: 0.59375,\n },\n {\n x: 0.21875,\n y: 0.59375,\n },\n {\n x: 0.28125,\n y: 0.59375,\n },\n {\n x: 0.28125,\n y: 0.59375,\n },\n {\n x: 0.34375,\n y: 0.59375,\n },\n {\n x: 0.34375,\n y: 0.59375,\n },\n {\n x: 0.40625,\n y: 0.59375,\n },\n {\n x: 0.40625,\n y: 0.59375,\n },\n {\n x: 0.46875,\n y: 0.59375,\n },\n {\n x: 0.46875,\n y: 0.59375,\n },\n {\n x: 0.53125,\n y: 0.59375,\n },\n {\n x: 0.53125,\n y: 0.59375,\n },\n {\n x: 0.59375,\n y: 0.59375,\n },\n {\n x: 0.59375,\n y: 0.59375,\n },\n {\n x: 0.65625,\n y: 0.59375,\n },\n {\n x: 0.65625,\n y: 0.59375,\n },\n {\n x: 0.71875,\n y: 0.59375,\n },\n {\n x: 0.71875,\n y: 0.59375,\n },\n {\n x: 0.78125,\n y: 0.59375,\n },\n {\n x: 0.78125,\n y: 0.59375,\n },\n {\n x: 0.84375,\n y: 0.59375,\n },\n {\n x: 0.84375,\n y: 0.59375,\n },\n {\n x: 0.90625,\n y: 0.59375,\n },\n {\n x: 0.90625,\n y: 0.59375,\n },\n {\n x: 0.96875,\n y: 0.59375,\n },\n {\n x: 0.96875,\n y: 0.59375,\n },\n {\n x: 0.03125,\n y: 0.65625,\n },\n {\n x: 0.03125,\n y: 0.65625,\n },\n {\n x: 0.09375,\n y: 0.65625,\n },\n {\n x: 0.09375,\n y: 0.65625,\n },\n {\n x: 0.15625,\n y: 0.65625,\n },\n {\n x: 0.15625,\n y: 0.65625,\n },\n {\n x: 0.21875,\n y: 0.65625,\n },\n {\n x: 0.21875,\n y: 0.65625,\n },\n {\n x: 0.28125,\n y: 0.65625,\n },\n {\n x: 0.28125,\n y: 0.65625,\n },\n {\n x: 0.34375,\n y: 0.65625,\n },\n {\n x: 0.34375,\n y: 0.65625,\n },\n {\n x: 0.40625,\n y: 0.65625,\n },\n {\n x: 0.40625,\n y: 0.65625,\n },\n {\n x: 0.46875,\n y: 0.65625,\n },\n {\n x: 0.46875,\n y: 0.65625,\n },\n {\n x: 0.53125,\n y: 0.65625,\n },\n {\n x: 0.53125,\n y: 0.65625,\n },\n {\n x: 0.59375,\n y: 0.65625,\n },\n {\n x: 0.59375,\n y: 0.65625,\n },\n {\n x: 0.65625,\n y: 0.65625,\n },\n {\n x: 0.65625,\n y: 0.65625,\n },\n {\n x: 0.71875,\n y: 0.65625,\n },\n {\n x: 0.71875,\n y: 0.65625,\n },\n {\n x: 0.78125,\n y: 0.65625,\n },\n {\n x: 0.78125,\n y: 0.65625,\n },\n {\n x: 0.84375,\n y: 0.65625,\n },\n {\n x: 0.84375,\n y: 0.65625,\n },\n {\n x: 0.90625,\n y: 0.65625,\n },\n {\n x: 0.90625,\n y: 0.65625,\n },\n {\n x: 0.96875,\n y: 0.65625,\n },\n {\n x: 0.96875,\n y: 0.65625,\n },\n {\n x: 0.03125,\n y: 0.71875,\n },\n {\n x: 0.03125,\n y: 0.71875,\n },\n {\n x: 0.09375,\n y: 0.71875,\n },\n {\n x: 0.09375,\n y: 0.71875,\n },\n {\n x: 0.15625,\n y: 0.71875,\n },\n {\n x: 0.15625,\n y: 0.71875,\n },\n {\n x: 0.21875,\n y: 0.71875,\n },\n {\n x: 0.21875,\n y: 0.71875,\n },\n {\n x: 0.28125,\n y: 0.71875,\n },\n {\n x: 0.28125,\n y: 0.71875,\n },\n {\n x: 0.34375,\n y: 0.71875,\n },\n {\n x: 0.34375,\n y: 0.71875,\n },\n {\n x: 0.40625,\n y: 0.71875,\n },\n {\n x: 0.40625,\n y: 0.71875,\n },\n {\n x: 0.46875,\n y: 0.71875,\n },\n {\n x: 0.46875,\n y: 0.71875,\n },\n {\n x: 0.53125,\n y: 0.71875,\n },\n {\n x: 0.53125,\n y: 0.71875,\n },\n {\n x: 0.59375,\n y: 0.71875,\n },\n {\n x: 0.59375,\n y: 0.71875,\n },\n {\n x: 0.65625,\n y: 0.71875,\n },\n {\n x: 0.65625,\n y: 0.71875,\n },\n {\n x: 0.71875,\n y: 0.71875,\n },\n {\n x: 0.71875,\n y: 0.71875,\n },\n {\n x: 0.78125,\n y: 0.71875,\n },\n {\n x: 0.78125,\n y: 0.71875,\n },\n {\n x: 0.84375,\n y: 0.71875,\n },\n {\n x: 0.84375,\n y: 0.71875,\n },\n {\n x: 0.90625,\n y: 0.71875,\n },\n {\n x: 0.90625,\n y: 0.71875,\n },\n {\n x: 0.96875,\n y: 0.71875,\n },\n {\n x: 0.96875,\n y: 0.71875,\n },\n {\n x: 0.03125,\n y: 0.78125,\n },\n {\n x: 0.03125,\n y: 0.78125,\n },\n {\n x: 0.09375,\n y: 0.78125,\n },\n {\n x: 0.09375,\n y: 0.78125,\n },\n {\n x: 0.15625,\n y: 0.78125,\n },\n {\n x: 0.15625,\n y: 0.78125,\n },\n {\n x: 0.21875,\n y: 0.78125,\n },\n {\n x: 0.21875,\n y: 0.78125,\n },\n {\n x: 0.28125,\n y: 0.78125,\n },\n {\n x: 0.28125,\n y: 0.78125,\n },\n {\n x: 0.34375,\n y: 0.78125,\n },\n {\n x: 0.34375,\n y: 0.78125,\n },\n {\n x: 0.40625,\n y: 0.78125,\n },\n {\n x: 0.40625,\n y: 0.78125,\n },\n {\n x: 0.46875,\n y: 0.78125,\n },\n {\n x: 0.46875,\n y: 0.78125,\n },\n {\n x: 0.53125,\n y: 0.78125,\n },\n {\n x: 0.53125,\n y: 0.78125,\n },\n {\n x: 0.59375,\n y: 0.78125,\n },\n {\n x: 0.59375,\n y: 0.78125,\n },\n {\n x: 0.65625,\n y: 0.78125,\n },\n {\n x: 0.65625,\n y: 0.78125,\n },\n {\n x: 0.71875,\n y: 0.78125,\n },\n {\n x: 0.71875,\n y: 0.78125,\n },\n {\n x: 0.78125,\n y: 0.78125,\n },\n {\n x: 0.78125,\n y: 0.78125,\n },\n {\n x: 0.84375,\n y: 0.78125,\n },\n {\n x: 0.84375,\n y: 0.78125,\n },\n {\n x: 0.90625,\n y: 0.78125,\n },\n {\n x: 0.90625,\n y: 0.78125,\n },\n {\n x: 0.96875,\n y: 0.78125,\n },\n {\n x: 0.96875,\n y: 0.78125,\n },\n {\n x: 0.03125,\n y: 0.84375,\n },\n {\n x: 0.03125,\n y: 0.84375,\n },\n {\n x: 0.09375,\n y: 0.84375,\n },\n {\n x: 0.09375,\n y: 0.84375,\n },\n {\n x: 0.15625,\n y: 0.84375,\n },\n {\n x: 0.15625,\n y: 0.84375,\n },\n {\n x: 0.21875,\n y: 0.84375,\n },\n {\n x: 0.21875,\n y: 0.84375,\n },\n {\n x: 0.28125,\n y: 0.84375,\n },\n {\n x: 0.28125,\n y: 0.84375,\n },\n {\n x: 0.34375,\n y: 0.84375,\n },\n {\n x: 0.34375,\n y: 0.84375,\n },\n {\n x: 0.40625,\n y: 0.84375,\n },\n {\n x: 0.40625,\n y: 0.84375,\n },\n {\n x: 0.46875,\n y: 0.84375,\n },\n {\n x: 0.46875,\n y: 0.84375,\n },\n {\n x: 0.53125,\n y: 0.84375,\n },\n {\n x: 0.53125,\n y: 0.84375,\n },\n {\n x: 0.59375,\n y: 0.84375,\n },\n {\n x: 0.59375,\n y: 0.84375,\n },\n {\n x: 0.65625,\n y: 0.84375,\n },\n {\n x: 0.65625,\n y: 0.84375,\n },\n {\n x: 0.71875,\n y: 0.84375,\n },\n {\n x: 0.71875,\n y: 0.84375,\n },\n {\n x: 0.78125,\n y: 0.84375,\n },\n {\n x: 0.78125,\n y: 0.84375,\n },\n {\n x: 0.84375,\n y: 0.84375,\n },\n {\n x: 0.84375,\n y: 0.84375,\n },\n {\n x: 0.90625,\n y: 0.84375,\n },\n {\n x: 0.90625,\n y: 0.84375,\n },\n {\n x: 0.96875,\n y: 0.84375,\n },\n {\n x: 0.96875,\n y: 0.84375,\n },\n {\n x: 0.03125,\n y: 0.90625,\n },\n {\n x: 0.03125,\n y: 0.90625,\n },\n {\n x: 0.09375,\n y: 0.90625,\n },\n {\n x: 0.09375,\n y: 0.90625,\n },\n {\n x: 0.15625,\n y: 0.90625,\n },\n {\n x: 0.15625,\n y: 0.90625,\n },\n {\n x: 0.21875,\n y: 0.90625,\n },\n {\n x: 0.21875,\n y: 0.90625,\n },\n {\n x: 0.28125,\n y: 0.90625,\n },\n {\n x: 0.28125,\n y: 0.90625,\n },\n {\n x: 0.34375,\n y: 0.90625,\n },\n {\n x: 0.34375,\n y: 0.90625,\n },\n {\n x: 0.40625,\n y: 0.90625,\n },\n {\n x: 0.40625,\n y: 0.90625,\n },\n {\n x: 0.46875,\n y: 0.90625,\n },\n {\n x: 0.46875,\n y: 0.90625,\n },\n {\n x: 0.53125,\n y: 0.90625,\n },\n {\n x: 0.53125,\n y: 0.90625,\n },\n {\n x: 0.59375,\n y: 0.90625,\n },\n {\n x: 0.59375,\n y: 0.90625,\n },\n {\n x: 0.65625,\n y: 0.90625,\n },\n {\n x: 0.65625,\n y: 0.90625,\n },\n {\n x: 0.71875,\n y: 0.90625,\n },\n {\n x: 0.71875,\n y: 0.90625,\n },\n {\n x: 0.78125,\n y: 0.90625,\n },\n {\n x: 0.78125,\n y: 0.90625,\n },\n {\n x: 0.84375,\n y: 0.90625,\n },\n {\n x: 0.84375,\n y: 0.90625,\n },\n {\n x: 0.90625,\n y: 0.90625,\n },\n {\n x: 0.90625,\n y: 0.90625,\n },\n {\n x: 0.96875,\n y: 0.90625,\n },\n {\n x: 0.96875,\n y: 0.90625,\n },\n {\n x: 0.03125,\n y: 0.96875,\n },\n {\n x: 0.03125,\n y: 0.96875,\n },\n {\n x: 0.09375,\n y: 0.96875,\n },\n {\n x: 0.09375,\n y: 0.96875,\n },\n {\n x: 0.15625,\n y: 0.96875,\n },\n {\n x: 0.15625,\n y: 0.96875,\n },\n {\n x: 0.21875,\n y: 0.96875,\n },\n {\n x: 0.21875,\n y: 0.96875,\n },\n {\n x: 0.28125,\n y: 0.96875,\n },\n {\n x: 0.28125,\n y: 0.96875,\n },\n {\n x: 0.34375,\n y: 0.96875,\n },\n {\n x: 0.34375,\n y: 0.96875,\n },\n {\n x: 0.40625,\n y: 0.96875,\n },\n {\n x: 0.40625,\n y: 0.96875,\n },\n {\n x: 0.46875,\n y: 0.96875,\n },\n {\n x: 0.46875,\n y: 0.96875,\n },\n {\n x: 0.53125,\n y: 0.96875,\n },\n {\n x: 0.53125,\n y: 0.96875,\n },\n {\n x: 0.59375,\n y: 0.96875,\n },\n {\n x: 0.59375,\n y: 0.96875,\n },\n {\n x: 0.65625,\n y: 0.96875,\n },\n {\n x: 0.65625,\n y: 0.96875,\n },\n {\n x: 0.71875,\n y: 0.96875,\n },\n {\n x: 0.71875,\n y: 0.96875,\n },\n {\n x: 0.78125,\n y: 0.96875,\n },\n {\n x: 0.78125,\n y: 0.96875,\n },\n {\n x: 0.84375,\n y: 0.96875,\n },\n {\n x: 0.84375,\n y: 0.96875,\n },\n {\n x: 0.90625,\n y: 0.96875,\n },\n {\n x: 0.90625,\n y: 0.96875,\n },\n {\n x: 0.96875,\n y: 0.96875,\n },\n {\n x: 0.96875,\n y: 0.96875,\n },\n {\n x: 0.0625,\n y: 0.0625,\n },\n {\n x: 0.0625,\n y: 0.0625,\n },\n {\n x: 0.0625,\n y: 0.0625,\n },\n {\n x: 0.0625,\n y: 0.0625,\n },\n {\n x: 0.0625,\n y: 0.0625,\n },\n {\n x: 0.0625,\n y: 0.0625,\n },\n {\n x: 0.1875,\n y: 0.0625,\n },\n {\n x: 0.1875,\n y: 0.0625,\n },\n {\n x: 0.1875,\n y: 0.0625,\n },\n {\n x: 0.1875,\n y: 0.0625,\n },\n {\n x: 0.1875,\n y: 0.0625,\n },\n {\n x: 0.1875,\n y: 0.0625,\n },\n {\n x: 0.3125,\n y: 0.0625,\n },\n {\n x: 0.3125,\n y: 0.0625,\n },\n {\n x: 0.3125,\n y: 0.0625,\n },\n {\n x: 0.3125,\n y: 0.0625,\n },\n {\n x: 0.3125,\n y: 0.0625,\n },\n {\n x: 0.3125,\n y: 0.0625,\n },\n {\n x: 0.4375,\n y: 0.0625,\n },\n {\n x: 0.4375,\n y: 0.0625,\n },\n {\n x: 0.4375,\n y: 0.0625,\n },\n {\n x: 0.4375,\n y: 0.0625,\n },\n {\n x: 0.4375,\n y: 0.0625,\n },\n {\n x: 0.4375,\n y: 0.0625,\n },\n {\n x: 0.5625,\n y: 0.0625,\n },\n {\n x: 0.5625,\n y: 0.0625,\n },\n {\n x: 0.5625,\n y: 0.0625,\n },\n {\n x: 0.5625,\n y: 0.0625,\n },\n {\n x: 0.5625,\n y: 0.0625,\n },\n {\n x: 0.5625,\n y: 0.0625,\n },\n {\n x: 0.6875,\n y: 0.0625,\n },\n {\n x: 0.6875,\n y: 0.0625,\n },\n {\n x: 0.6875,\n y: 0.0625,\n },\n {\n x: 0.6875,\n y: 0.0625,\n },\n {\n x: 0.6875,\n y: 0.0625,\n },\n {\n x: 0.6875,\n y: 0.0625,\n },\n {\n x: 0.8125,\n y: 0.0625,\n },\n {\n x: 0.8125,\n y: 0.0625,\n },\n {\n x: 0.8125,\n y: 0.0625,\n },\n {\n x: 0.8125,\n y: 0.0625,\n },\n {\n x: 0.8125,\n y: 0.0625,\n },\n {\n x: 0.8125,\n y: 0.0625,\n },\n {\n x: 0.9375,\n y: 0.0625,\n },\n {\n x: 0.9375,\n y: 0.0625,\n },\n {\n x: 0.9375,\n y: 0.0625,\n },\n {\n x: 0.9375,\n y: 0.0625,\n },\n {\n x: 0.9375,\n y: 0.0625,\n },\n {\n x: 0.9375,\n y: 0.0625,\n },\n {\n x: 0.0625,\n y: 0.1875,\n },\n {\n x: 0.0625,\n y: 0.1875,\n },\n {\n x: 0.0625,\n y: 0.1875,\n },\n {\n x: 0.0625,\n y: 0.1875,\n },\n {\n x: 0.0625,\n y: 0.1875,\n },\n {\n x: 0.0625,\n y: 0.1875,\n },\n {\n x: 0.1875,\n y: 0.1875,\n },\n {\n x: 0.1875,\n y: 0.1875,\n },\n {\n x: 0.1875,\n y: 0.1875,\n },\n {\n x: 0.1875,\n y: 0.1875,\n },\n {\n x: 0.1875,\n y: 0.1875,\n },\n {\n x: 0.1875,\n y: 0.1875,\n },\n {\n x: 0.3125,\n y: 0.1875,\n },\n {\n x: 0.3125,\n y: 0.1875,\n },\n {\n x: 0.3125,\n y: 0.1875,\n },\n {\n x: 0.3125,\n y: 0.1875,\n },\n {\n x: 0.3125,\n y: 0.1875,\n },\n {\n x: 0.3125,\n y: 0.1875,\n },\n {\n x: 0.4375,\n y: 0.1875,\n },\n {\n x: 0.4375,\n y: 0.1875,\n },\n {\n x: 0.4375,\n y: 0.1875,\n },\n {\n x: 0.4375,\n y: 0.1875,\n },\n {\n x: 0.4375,\n y: 0.1875,\n },\n {\n x: 0.4375,\n y: 0.1875,\n },\n {\n x: 0.5625,\n y: 0.1875,\n },\n {\n x: 0.5625,\n y: 0.1875,\n },\n {\n x: 0.5625,\n y: 0.1875,\n },\n {\n x: 0.5625,\n y: 0.1875,\n },\n {\n x: 0.5625,\n y: 0.1875,\n },\n {\n x: 0.5625,\n y: 0.1875,\n },\n {\n x: 0.6875,\n y: 0.1875,\n },\n {\n x: 0.6875,\n y: 0.1875,\n },\n {\n x: 0.6875,\n y: 0.1875,\n },\n {\n x: 0.6875,\n y: 0.1875,\n },\n {\n x: 0.6875,\n y: 0.1875,\n },\n {\n x: 0.6875,\n y: 0.1875,\n },\n {\n x: 0.8125,\n y: 0.1875,\n },\n {\n x: 0.8125,\n y: 0.1875,\n },\n {\n x: 0.8125,\n y: 0.1875,\n },\n {\n x: 0.8125,\n y: 0.1875,\n },\n {\n x: 0.8125,\n y: 0.1875,\n },\n {\n x: 0.8125,\n y: 0.1875,\n },\n {\n x: 0.9375,\n y: 0.1875,\n },\n {\n x: 0.9375,\n y: 0.1875,\n },\n {\n x: 0.9375,\n y: 0.1875,\n },\n {\n x: 0.9375,\n y: 0.1875,\n },\n {\n x: 0.9375,\n y: 0.1875,\n },\n {\n x: 0.9375,\n y: 0.1875,\n },\n {\n x: 0.0625,\n y: 0.3125,\n },\n {\n x: 0.0625,\n y: 0.3125,\n },\n {\n x: 0.0625,\n y: 0.3125,\n },\n {\n x: 0.0625,\n y: 0.3125,\n },\n {\n x: 0.0625,\n y: 0.3125,\n },\n {\n x: 0.0625,\n y: 0.3125,\n },\n {\n x: 0.1875,\n y: 0.3125,\n },\n {\n x: 0.1875,\n y: 0.3125,\n },\n {\n x: 0.1875,\n y: 0.3125,\n },\n {\n x: 0.1875,\n y: 0.3125,\n },\n {\n x: 0.1875,\n y: 0.3125,\n },\n {\n x: 0.1875,\n y: 0.3125,\n },\n {\n x: 0.3125,\n y: 0.3125,\n },\n {\n x: 0.3125,\n y: 0.3125,\n },\n {\n x: 0.3125,\n y: 0.3125,\n },\n {\n x: 0.3125,\n y: 0.3125,\n },\n {\n x: 0.3125,\n y: 0.3125,\n },\n {\n x: 0.3125,\n y: 0.3125,\n },\n {\n x: 0.4375,\n y: 0.3125,\n },\n {\n x: 0.4375,\n y: 0.3125,\n },\n {\n x: 0.4375,\n y: 0.3125,\n },\n {\n x: 0.4375,\n y: 0.3125,\n },\n {\n x: 0.4375,\n y: 0.3125,\n },\n {\n x: 0.4375,\n y: 0.3125,\n },\n {\n x: 0.5625,\n y: 0.3125,\n },\n {\n x: 0.5625,\n y: 0.3125,\n },\n {\n x: 0.5625,\n y: 0.3125,\n },\n {\n x: 0.5625,\n y: 0.3125,\n },\n {\n x: 0.5625,\n y: 0.3125,\n },\n {\n x: 0.5625,\n y: 0.3125,\n },\n {\n x: 0.6875,\n y: 0.3125,\n },\n {\n x: 0.6875,\n y: 0.3125,\n },\n {\n x: 0.6875,\n y: 0.3125,\n },\n {\n x: 0.6875,\n y: 0.3125,\n },\n {\n x: 0.6875,\n y: 0.3125,\n },\n {\n x: 0.6875,\n y: 0.3125,\n },\n {\n x: 0.8125,\n y: 0.3125,\n },\n {\n x: 0.8125,\n y: 0.3125,\n },\n {\n x: 0.8125,\n y: 0.3125,\n },\n {\n x: 0.8125,\n y: 0.3125,\n },\n {\n x: 0.8125,\n y: 0.3125,\n },\n {\n x: 0.8125,\n y: 0.3125,\n },\n {\n x: 0.9375,\n y: 0.3125,\n },\n {\n x: 0.9375,\n y: 0.3125,\n },\n {\n x: 0.9375,\n y: 0.3125,\n },\n {\n x: 0.9375,\n y: 0.3125,\n },\n {\n x: 0.9375,\n y: 0.3125,\n },\n {\n x: 0.9375,\n y: 0.3125,\n },\n {\n x: 0.0625,\n y: 0.4375,\n },\n {\n x: 0.0625,\n y: 0.4375,\n },\n {\n x: 0.0625,\n y: 0.4375,\n },\n {\n x: 0.0625,\n y: 0.4375,\n },\n {\n x: 0.0625,\n y: 0.4375,\n },\n {\n x: 0.0625,\n y: 0.4375,\n },\n {\n x: 0.1875,\n y: 0.4375,\n },\n {\n x: 0.1875,\n y: 0.4375,\n },\n {\n x: 0.1875,\n y: 0.4375,\n },\n {\n x: 0.1875,\n y: 0.4375,\n },\n {\n x: 0.1875,\n y: 0.4375,\n },\n {\n x: 0.1875,\n y: 0.4375,\n },\n {\n x: 0.3125,\n y: 0.4375,\n },\n {\n x: 0.3125,\n y: 0.4375,\n },\n {\n x: 0.3125,\n y: 0.4375,\n },\n {\n x: 0.3125,\n y: 0.4375,\n },\n {\n x: 0.3125,\n y: 0.4375,\n },\n {\n x: 0.3125,\n y: 0.4375,\n },\n {\n x: 0.4375,\n y: 0.4375,\n },\n {\n x: 0.4375,\n y: 0.4375,\n },\n {\n x: 0.4375,\n y: 0.4375,\n },\n {\n x: 0.4375,\n y: 0.4375,\n },\n {\n x: 0.4375,\n y: 0.4375,\n },\n {\n x: 0.4375,\n y: 0.4375,\n },\n {\n x: 0.5625,\n y: 0.4375,\n },\n {\n x: 0.5625,\n y: 0.4375,\n },\n {\n x: 0.5625,\n y: 0.4375,\n },\n {\n x: 0.5625,\n y: 0.4375,\n },\n {\n x: 0.5625,\n y: 0.4375,\n },\n {\n x: 0.5625,\n y: 0.4375,\n },\n {\n x: 0.6875,\n y: 0.4375,\n },\n {\n x: 0.6875,\n y: 0.4375,\n },\n {\n x: 0.6875,\n y: 0.4375,\n },\n {\n x: 0.6875,\n y: 0.4375,\n },\n {\n x: 0.6875,\n y: 0.4375,\n },\n {\n x: 0.6875,\n y: 0.4375,\n },\n {\n x: 0.8125,\n y: 0.4375,\n },\n {\n x: 0.8125,\n y: 0.4375,\n },\n {\n x: 0.8125,\n y: 0.4375,\n },\n {\n x: 0.8125,\n y: 0.4375,\n },\n {\n x: 0.8125,\n y: 0.4375,\n },\n {\n x: 0.8125,\n y: 0.4375,\n },\n {\n x: 0.9375,\n y: 0.4375,\n },\n {\n x: 0.9375,\n y: 0.4375,\n },\n {\n x: 0.9375,\n y: 0.4375,\n },\n {\n x: 0.9375,\n y: 0.4375,\n },\n {\n x: 0.9375,\n y: 0.4375,\n },\n {\n x: 0.9375,\n y: 0.4375,\n },\n {\n x: 0.0625,\n y: 0.5625,\n },\n {\n x: 0.0625,\n y: 0.5625,\n },\n {\n x: 0.0625,\n y: 0.5625,\n },\n {\n x: 0.0625,\n y: 0.5625,\n },\n {\n x: 0.0625,\n y: 0.5625,\n },\n {\n x: 0.0625,\n y: 0.5625,\n },\n {\n x: 0.1875,\n y: 0.5625,\n },\n {\n x: 0.1875,\n y: 0.5625,\n },\n {\n x: 0.1875,\n y: 0.5625,\n },\n {\n x: 0.1875,\n y: 0.5625,\n },\n {\n x: 0.1875,\n y: 0.5625,\n },\n {\n x: 0.1875,\n y: 0.5625,\n },\n {\n x: 0.3125,\n y: 0.5625,\n },\n {\n x: 0.3125,\n y: 0.5625,\n },\n {\n x: 0.3125,\n y: 0.5625,\n },\n {\n x: 0.3125,\n y: 0.5625,\n },\n {\n x: 0.3125,\n y: 0.5625,\n },\n {\n x: 0.3125,\n y: 0.5625,\n },\n {\n x: 0.4375,\n y: 0.5625,\n },\n {\n x: 0.4375,\n y: 0.5625,\n },\n {\n x: 0.4375,\n y: 0.5625,\n },\n {\n x: 0.4375,\n y: 0.5625,\n },\n {\n x: 0.4375,\n y: 0.5625,\n },\n {\n x: 0.4375,\n y: 0.5625,\n },\n {\n x: 0.5625,\n y: 0.5625,\n },\n {\n x: 0.5625,\n y: 0.5625,\n },\n {\n x: 0.5625,\n y: 0.5625,\n },\n {\n x: 0.5625,\n y: 0.5625,\n },\n {\n x: 0.5625,\n y: 0.5625,\n },\n {\n x: 0.5625,\n y: 0.5625,\n },\n {\n x: 0.6875,\n y: 0.5625,\n },\n {\n x: 0.6875,\n y: 0.5625,\n },\n {\n x: 0.6875,\n y: 0.5625,\n },\n {\n x: 0.6875,\n y: 0.5625,\n },\n {\n x: 0.6875,\n y: 0.5625,\n },\n {\n x: 0.6875,\n y: 0.5625,\n },\n {\n x: 0.8125,\n y: 0.5625,\n },\n {\n x: 0.8125,\n y: 0.5625,\n },\n {\n x: 0.8125,\n y: 0.5625,\n },\n {\n x: 0.8125,\n y: 0.5625,\n },\n {\n x: 0.8125,\n y: 0.5625,\n },\n {\n x: 0.8125,\n y: 0.5625,\n },\n {\n x: 0.9375,\n y: 0.5625,\n },\n {\n x: 0.9375,\n y: 0.5625,\n },\n {\n x: 0.9375,\n y: 0.5625,\n },\n {\n x: 0.9375,\n y: 0.5625,\n },\n {\n x: 0.9375,\n y: 0.5625,\n },\n {\n x: 0.9375,\n y: 0.5625,\n },\n {\n x: 0.0625,\n y: 0.6875,\n },\n {\n x: 0.0625,\n y: 0.6875,\n },\n {\n x: 0.0625,\n y: 0.6875,\n },\n {\n x: 0.0625,\n y: 0.6875,\n },\n {\n x: 0.0625,\n y: 0.6875,\n },\n {\n x: 0.0625,\n y: 0.6875,\n },\n {\n x: 0.1875,\n y: 0.6875,\n },\n {\n x: 0.1875,\n y: 0.6875,\n },\n {\n x: 0.1875,\n y: 0.6875,\n },\n {\n x: 0.1875,\n y: 0.6875,\n },\n {\n x: 0.1875,\n y: 0.6875,\n },\n {\n x: 0.1875,\n y: 0.6875,\n },\n {\n x: 0.3125,\n y: 0.6875,\n },\n {\n x: 0.3125,\n y: 0.6875,\n },\n {\n x: 0.3125,\n y: 0.6875,\n },\n {\n x: 0.3125,\n y: 0.6875,\n },\n {\n x: 0.3125,\n y: 0.6875,\n },\n {\n x: 0.3125,\n y: 0.6875,\n },\n {\n x: 0.4375,\n y: 0.6875,\n },\n {\n x: 0.4375,\n y: 0.6875,\n },\n {\n x: 0.4375,\n y: 0.6875,\n },\n {\n x: 0.4375,\n y: 0.6875,\n },\n {\n x: 0.4375,\n y: 0.6875,\n },\n {\n x: 0.4375,\n y: 0.6875,\n },\n {\n x: 0.5625,\n y: 0.6875,\n },\n {\n x: 0.5625,\n y: 0.6875,\n },\n {\n x: 0.5625,\n y: 0.6875,\n },\n {\n x: 0.5625,\n y: 0.6875,\n },\n {\n x: 0.5625,\n y: 0.6875,\n },\n {\n x: 0.5625,\n y: 0.6875,\n },\n {\n x: 0.6875,\n y: 0.6875,\n },\n {\n x: 0.6875,\n y: 0.6875,\n },\n {\n x: 0.6875,\n y: 0.6875,\n },\n {\n x: 0.6875,\n y: 0.6875,\n },\n {\n x: 0.6875,\n y: 0.6875,\n },\n {\n x: 0.6875,\n y: 0.6875,\n },\n {\n x: 0.8125,\n y: 0.6875,\n },\n {\n x: 0.8125,\n y: 0.6875,\n },\n {\n x: 0.8125,\n y: 0.6875,\n },\n {\n x: 0.8125,\n y: 0.6875,\n },\n {\n x: 0.8125,\n y: 0.6875,\n },\n {\n x: 0.8125,\n y: 0.6875,\n },\n {\n x: 0.9375,\n y: 0.6875,\n },\n {\n x: 0.9375,\n y: 0.6875,\n },\n {\n x: 0.9375,\n y: 0.6875,\n },\n {\n x: 0.9375,\n y: 0.6875,\n },\n {\n x: 0.9375,\n y: 0.6875,\n },\n {\n x: 0.9375,\n y: 0.6875,\n },\n {\n x: 0.0625,\n y: 0.8125,\n },\n {\n x: 0.0625,\n y: 0.8125,\n },\n {\n x: 0.0625,\n y: 0.8125,\n },\n {\n x: 0.0625,\n y: 0.8125,\n },\n {\n x: 0.0625,\n y: 0.8125,\n },\n {\n x: 0.0625,\n y: 0.8125,\n },\n {\n x: 0.1875,\n y: 0.8125,\n },\n {\n x: 0.1875,\n y: 0.8125,\n },\n {\n x: 0.1875,\n y: 0.8125,\n },\n {\n x: 0.1875,\n y: 0.8125,\n },\n {\n x: 0.1875,\n y: 0.8125,\n },\n {\n x: 0.1875,\n y: 0.8125,\n },\n {\n x: 0.3125,\n y: 0.8125,\n },\n {\n x: 0.3125,\n y: 0.8125,\n },\n {\n x: 0.3125,\n y: 0.8125,\n },\n {\n x: 0.3125,\n y: 0.8125,\n },\n {\n x: 0.3125,\n y: 0.8125,\n },\n {\n x: 0.3125,\n y: 0.8125,\n },\n {\n x: 0.4375,\n y: 0.8125,\n },\n {\n x: 0.4375,\n y: 0.8125,\n },\n {\n x: 0.4375,\n y: 0.8125,\n },\n {\n x: 0.4375,\n y: 0.8125,\n },\n {\n x: 0.4375,\n y: 0.8125,\n },\n {\n x: 0.4375,\n y: 0.8125,\n },\n {\n x: 0.5625,\n y: 0.8125,\n },\n {\n x: 0.5625,\n y: 0.8125,\n },\n {\n x: 0.5625,\n y: 0.8125,\n },\n {\n x: 0.5625,\n y: 0.8125,\n },\n {\n x: 0.5625,\n y: 0.8125,\n },\n {\n x: 0.5625,\n y: 0.8125,\n },\n {\n x: 0.6875,\n y: 0.8125,\n },\n {\n x: 0.6875,\n y: 0.8125,\n },\n {\n x: 0.6875,\n y: 0.8125,\n },\n {\n x: 0.6875,\n y: 0.8125,\n },\n {\n x: 0.6875,\n y: 0.8125,\n },\n {\n x: 0.6875,\n y: 0.8125,\n },\n {\n x: 0.8125,\n y: 0.8125,\n },\n {\n x: 0.8125,\n y: 0.8125,\n },\n {\n x: 0.8125,\n y: 0.8125,\n },\n {\n x: 0.8125,\n y: 0.8125,\n },\n {\n x: 0.8125,\n y: 0.8125,\n },\n {\n x: 0.8125,\n y: 0.8125,\n },\n {\n x: 0.9375,\n y: 0.8125,\n },\n {\n x: 0.9375,\n y: 0.8125,\n },\n {\n x: 0.9375,\n y: 0.8125,\n },\n {\n x: 0.9375,\n y: 0.8125,\n },\n {\n x: 0.9375,\n y: 0.8125,\n },\n {\n x: 0.9375,\n y: 0.8125,\n },\n {\n x: 0.0625,\n y: 0.9375,\n },\n {\n x: 0.0625,\n y: 0.9375,\n },\n {\n x: 0.0625,\n y: 0.9375,\n },\n {\n x: 0.0625,\n y: 0.9375,\n },\n {\n x: 0.0625,\n y: 0.9375,\n },\n {\n x: 0.0625,\n y: 0.9375,\n },\n {\n x: 0.1875,\n y: 0.9375,\n },\n {\n x: 0.1875,\n y: 0.9375,\n },\n {\n x: 0.1875,\n y: 0.9375,\n },\n {\n x: 0.1875,\n y: 0.9375,\n },\n {\n x: 0.1875,\n y: 0.9375,\n },\n {\n x: 0.1875,\n y: 0.9375,\n },\n {\n x: 0.3125,\n y: 0.9375,\n },\n {\n x: 0.3125,\n y: 0.9375,\n },\n {\n x: 0.3125,\n y: 0.9375,\n },\n {\n x: 0.3125,\n y: 0.9375,\n },\n {\n x: 0.3125,\n y: 0.9375,\n },\n {\n x: 0.3125,\n y: 0.9375,\n },\n {\n x: 0.4375,\n y: 0.9375,\n },\n {\n x: 0.4375,\n y: 0.9375,\n },\n {\n x: 0.4375,\n y: 0.9375,\n },\n {\n x: 0.4375,\n y: 0.9375,\n },\n {\n x: 0.4375,\n y: 0.9375,\n },\n {\n x: 0.4375,\n y: 0.9375,\n },\n {\n x: 0.5625,\n y: 0.9375,\n },\n {\n x: 0.5625,\n y: 0.9375,\n },\n {\n x: 0.5625,\n y: 0.9375,\n },\n {\n x: 0.5625,\n y: 0.9375,\n },\n {\n x: 0.5625,\n y: 0.9375,\n },\n {\n x: 0.5625,\n y: 0.9375,\n },\n {\n x: 0.6875,\n y: 0.9375,\n },\n {\n x: 0.6875,\n y: 0.9375,\n },\n {\n x: 0.6875,\n y: 0.9375,\n },\n {\n x: 0.6875,\n y: 0.9375,\n },\n {\n x: 0.6875,\n y: 0.9375,\n },\n {\n x: 0.6875,\n y: 0.9375,\n },\n {\n x: 0.8125,\n y: 0.9375,\n },\n {\n x: 0.8125,\n y: 0.9375,\n },\n {\n x: 0.8125,\n y: 0.9375,\n },\n {\n x: 0.8125,\n y: 0.9375,\n },\n {\n x: 0.8125,\n y: 0.9375,\n },\n {\n x: 0.8125,\n y: 0.9375,\n },\n {\n x: 0.9375,\n y: 0.9375,\n },\n {\n x: 0.9375,\n y: 0.9375,\n },\n {\n x: 0.9375,\n y: 0.9375,\n },\n {\n x: 0.9375,\n y: 0.9375,\n },\n {\n x: 0.9375,\n y: 0.9375,\n },\n {\n x: 0.9375,\n y: 0.9375,\n },\n];\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as box from './box';\nimport * as anchors from './anchors';\n\nexport class HandDetector {\n model: any;\n anchors: any;\n anchorsTensor: any;\n inputSize: number;\n inputSizeTensor: any;\n doubleInputSizeTensor: any;\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?.inputs[0].shape[2];\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(rawPalmLandmarks.reshape([-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 batched = this.model.predict(input);\n const predictions = batched.squeeze();\n batched.dispose();\n const scoresT = tf.tidy(() => tf.sigmoid(tf.slice(predictions, [0, 0], [-1, 1])).squeeze());\n const scores = scoresT.dataSync();\n const rawBoxes = tf.slice(predictions, [0, 1], [-1, 4]);\n const boxes = this.normalizeBoxes(rawBoxes);\n rawBoxes.dispose();\n const filteredT = await tf.image.nonMaxSuppressionAsync(boxes, scores, config.hand.maxDetected, config.hand.iouThreshold, config.hand.minConfidence);\n const filtered = filteredT.arraySync();\n\n scoresT.dispose();\n filteredT.dispose();\n const hands: Array<{ box: any, palmLandmarks: any, confidence: number }> = [];\n for (const index of filtered) {\n if (scores[index] >= config.hand.minConfidence) {\n const matchingBox = tf.slice(boxes, [index, 0], [1, -1]);\n const rawPalmLandmarks = tf.slice(predictions, [index, 5], [1, 14]);\n const palmLandmarks = tf.tidy(() => this.normalizeLandmarks(rawPalmLandmarks, index).reshape([-1, 2]));\n rawPalmLandmarks.dispose();\n hands.push({ box: matchingBox, palmLandmarks, confidence: scores[index] });\n }\n }\n predictions.dispose();\n boxes.dispose();\n return hands;\n }\n\n async estimateHandBounds(input, config) {\n const inputHeight = input.shape[1];\n const inputWidth = input.shape[2];\n const image = tf.tidy(() => input.resizeBilinear([this.inputSize, this.inputSize]).div(127.5).sub(1));\n const predictions = await this.getBoxes(image, config);\n image.dispose();\n const hands: Array<{}> = [];\n if (!predictions || predictions.length === 0) return hands;\n for (const prediction of predictions) {\n const boxes = prediction.box.dataSync();\n const startPoint = boxes.slice(0, 2);\n const endPoint = boxes.slice(2, 4);\n const palmLandmarks = prediction.palmLandmarks.arraySync();\n prediction.box.dispose();\n prediction.palmLandmarks.dispose();\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';\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: any;\n landmarkDetector: any;\n inputSize: number;\n storedBoxes: any;\n skipped: number;\n detectedHands: number;\n\n constructor(handDetector, landmarkDetector) {\n this.handDetector = handDetector;\n this.landmarkDetector = landmarkDetector;\n this.inputSize = this.landmarkDetector?.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 coord[0] + originalBoxCenter[0],\n coord[1] + originalBoxCenter[1],\n 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 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<{}> = [];\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.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 = croppedInput.div(255);\n croppedInput.dispose();\n rotatedImage.dispose();\n const [confidenceT, keypoints] = await this.landmarkDetector.predict(handImage);\n handImage.dispose();\n const confidence = confidenceT.dataSync()[0];\n confidenceT.dispose();\n if (confidence >= config.hand.minConfidence) {\n const keypointsReshaped = tf.reshape(keypoints, [-1, 3]);\n const rawCoords = keypointsReshaped.arraySync();\n keypoints.dispose();\n keypointsReshaped.dispose();\n const coords = this.transformRawCoords(rawCoords, newBox, angle, rotationMatrix);\n const nextBoundingBox = this.getBoxForHandLandmarks(coords);\n this.storedBoxes[i] = nextBoundingBox;\n const result = {\n landmarks: coords,\n confidence,\n box: { topLeft: nextBoundingBox.startPoint, bottomRight: nextBoundingBox.endPoint },\n };\n hands.push(result);\n } else {\n this.storedBoxes[i] = null;\n }\n keypoints.dispose();\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", "// 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';\n\nlet model;\n\nexport async function load(config) {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.body.modelPath));\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, config) {\n if (!model) return null;\n if (!config.body.enabled) return null;\n const imgSize = { width: image.shape[2], height: image.shape[1] };\n const resize = tf.image.resizeBilinear(image, [model.width, model.height], false);\n const normalize = tf.div(resize, [255.0]);\n resize.dispose();\n const resT = await model.predict(normalize);\n const points = resT.find((t) => (t.size === 195 || t.size === 155)).dataSync(); // order of output tensors may change between models, full has 195 and upper has 155 items\n resT.forEach((t) => t.dispose());\n normalize.dispose();\n const keypoints: Array<{ id, part, position: { x, y, z }, 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 x: Math.trunc(imgSize.width * points[depth * i + 0] / 255), // return normalized x value istead of 0..255\n y: Math.trunc(imgSize.height * points[depth * i + 1] / 255), // return normalized y value istead of 0..255\n z: Math.trunc(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 score = keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);\n return [{ score, keypoints }];\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", "import { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { labels } from './labels';\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) {\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<{ score: number, strideSize: number, class: number, label: string, center: number[], centerRaw: number[], box: number[], boxRaw: number[] }> = [];\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(() => { // 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 = boxesMax.argMax(2).arraySync(); // what we need is indexes of features with highest scores, not values itself\n const scores = scoresT.arraySync(); // 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)),\n boxRaw,\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: any[] = [];\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 = nms.dataSync();\n tf.dispose(nms);\n }\n\n // filter & sort results\n results = results\n .filter((a, idx) => nmsIdx.includes(idx))\n .sort((a, b) => (b.score - a.score));\n\n return results;\n}\n\nexport async function predict(image, config) {\n if (!model) return null;\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 = resize.div(255);\n const transpose = norm.transpose([0, 3, 1, 2]);\n norm.dispose();\n resize.dispose();\n\n let objectT;\n if (config.object.enabled) objectT = await model.predict(transpose);\n transpose.dispose();\n\n const obj = await process(objectT, model.inputSize, outputSize, config);\n last = obj;\n resolve(obj);\n });\n}\n", "export 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", "import { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { labels } from './labels';\n\nlet model;\nlet last: Array<{}> = [];\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config) {\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 const results: Array<{ score: number, class: number, label: string, box: number[], boxRaw: number[] }> = [];\n const detections = res.arraySync();\n const squeezeT = tf.squeeze(res);\n res.dispose();\n const arr = tf.split(squeezeT, 6, 1); // x1, y1, x2, y2, score, class\n squeezeT.dispose();\n const stackT = tf.stack([arr[1], arr[0], arr[3], arr[2]], 1); // tf.nms expects y, x\n const boxesT = stackT.squeeze();\n const scoresT = arr[4].squeeze();\n const classesT = arr[5].squeeze();\n arr.forEach((t) => t.dispose());\n // @ts-ignore boxesT type is not correctly inferred\n const nmsT = await tf.image.nonMaxSuppressionAsync(boxesT, scoresT, config.object.maxDetected, config.object.iouThreshold, config.object.minConfidence);\n boxesT.dispose();\n scoresT.dispose();\n classesT.dispose();\n const nms = nmsT.dataSync();\n nmsT.dispose();\n for (const id of nms) {\n const score = detections[0][id][4];\n const classVal = detections[0][id][5];\n const label = labels[classVal].label;\n const boxRaw = [\n detections[0][id][0] / inputSize,\n detections[0][id][1] / inputSize,\n detections[0][id][2] / inputSize,\n detections[0][id][3] / inputSize,\n ];\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 ];\n results.push({ score, class: classVal, label, box, boxRaw });\n }\n return results;\n}\n\nexport async function predict(image, config) {\n if (!model) return null;\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\n let objectT;\n if (config.object.enabled) objectT = model.execute(resize, 'tower_0/detections');\n resize.dispose();\n\n const obj = await process(objectT, model.inputSize, outputSize, config);\n last = obj;\n resolve(obj);\n });\n}\n", "export const body = (res) => {\n if (!res) return [];\n const gestures: Array<{ body: number, gesture: string }> = [];\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) => {\n if (!res) return [];\n const gestures: Array<{ face: number, gesture: string }> = [];\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) => {\n if (!res) return [];\n const gestures: Array<{ iris: number, gesture: string }> = [];\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].annotations.rightEyeIris[0][0];\n const leftIrisCenterX = Math.abs(res[i].mesh[263][0] - res[i].annotations.leftEyeIris[0][0]) / res[i].annotations.leftEyeIris[0][0];\n if (leftIrisCenterX > 0.033 || rightIrisCenterX > 0.033) center = false;\n if (leftIrisCenterX > 0.033) gestures.push({ iris: i, gesture: 'looking right' });\n if (rightIrisCenterX > 0.033) 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].annotations.rightEyeIris[0][1];\n const leftIrisCenterY = Math.abs(res[i].mesh[374][1] - res[i].annotations.leftEyeIris[0][1]) / res[i].annotations.leftEyeIris[0][1];\n if (leftIrisCenterY < 0.015 || rightIrisCenterY < 0.015 || leftIrisCenterY > 0.030 || rightIrisCenterY > 0.030) center = false;\n if (leftIrisCenterY < 0.015 || rightIrisCenterY < 0.015) gestures.push({ iris: i, gesture: 'looking down' });\n if (leftIrisCenterY > 0.030 || rightIrisCenterY > 0.030) 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) => {\n if (!res) return [];\n const gestures: Array<{ hand: number, gesture: string }> = [];\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 const highest = fingers.reduce((best, a) => (best.position[1] < a.position[1] ? best : a));\n gestures.push({ hand: i, gesture: `${closest.name} forward ${highest.name} up` });\n }\n }\n return gestures;\n};\n", "/*\nWebGLImageFilter - MIT Licensed\n2013, Dominic Szablewski - phoboslab.org\n\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", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as fxImage from './imagefx';\n\nconst maxSize = 2048;\n// internal temp canvases\nlet inCanvas;\nlet outCanvas;\n// instance of fximage\nlet fx;\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, config): { tensor: typeof tf.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 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 }\n */\n } else {\n outCanvas = inCanvas;\n if (fx) fx = null;\n }\n\n // create tensor from image\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.fromPixels(outCanvas);\n } else if (config.backend === 'webgl' || config.backend === 'humangl') { // tf kernel-optimized method to get imagedata\n // we can 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.fromPixels(tempCanvas);\n } else { // cpu and wasm kernel does not implement efficient fromPixels method\n // we can 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 const data = tempCtx?.getImageData(0, 0, targetWidth, targetHeight);\n pixels = tf.browser.fromPixels(data);\n }\n const casted = pixels.toFloat();\n tensor = casted.expandDims(0);\n pixels.dispose();\n casted.dispose();\n }\n const canvas = config.filter.return ? outCanvas : null;\n return { tensor, canvas };\n}\n", "import { TRI468 as triangulation } from '../blazeface/coords';\nimport { mergeDeep } from '../helpers';\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 * -useRawBoxes: Boolean: internal: use non-normalized coordinates when performing draw methods,\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 fillPolygons: Boolean,\n useDepth: Boolean,\n useCurves: Boolean,\n bufferedOutput: Boolean,\n useRawBoxes: Boolean,\n calculateHandBox: Boolean,\n}\n\nexport const options: DrawOptions = {\n color: 'rgba(173, 216, 230, 0.3)', // 'lightblue' with light alpha channel\n labelColor: 'rgba(173, 216, 230, 1)', // 'lightblue' with dark alpha channel\n shadowColor: 'black',\n font: 'small-caps 16px \"Segoe UI\"',\n lineHeight: 24,\n lineWidth: 6,\n pointSize: 2,\n roundRect: 28,\n drawPoints: false,\n drawLabels: true,\n drawBoxes: true,\n drawPolygons: true,\n fillPolygons: false,\n useDepth: true,\n useCurves: false,\n bufferedOutput: false,\n useRawBoxes: false,\n calculateHandBox: true,\n};\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[] = [], 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 ctx.strokeStyle = localOptions.useDepth && pt[2] ? `rgba(${127.5 + (2 * pt[2])}, ${127.5 - (2 * pt[2])}, 255, 0.3)` : localOptions.color;\n ctx.fillStyle = localOptions.useDepth && pt[2] ? `rgba(${127.5 + (2 * pt[2])}, ${127.5 - (2 * pt[2])}, 255, 0.3)` : localOptions.color;\n ctx.lineTo(pt[0], parseInt(pt[1]));\n }\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.closePath();\n ctx.fill();\n }\n}\n\nfunction curves(ctx, points: 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 if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\n if (!ctx) return;\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:any[] = [];\n let what:any[] = [];\n [where, what] = Object.entries(result[j]);\n if ((what.length > 1) && (what[1].length > 0)) {\n const person = where[1] > 0 ? `#${where[1]}` : '';\n const label = `${where[0]} ${person}: ${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 if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\n if (!ctx) return;\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) {\n if (localOptions.useRawBoxes) rect(ctx, inCanvas.width * f.boxRaw[0], inCanvas.height * f.boxRaw[1], inCanvas.width * f.boxRaw[2], inCanvas.height * f.boxRaw[3], localOptions);\n else rect(ctx, f.box[0], f.box[1], f.box[2], f.box[3], localOptions);\n }\n // silly hack since fillText does not suport new line\n const labels:string[] = [];\n labels.push(`face confidence: ${Math.trunc(100 * f.confidence)}%`);\n if (f.genderConfidence) labels.push(`${f.gender || ''} ${Math.trunc(100 * f.genderConfidence)}% confident`);\n // if (f.genderConfidence) labels.push(f.gender);\n if (f.age) labels.push(`age: ${f.age || ''}`);\n if (f.iris) labels.push(`iris 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 labels.push(emotion.join(' '));\n }\n if (f.rotation && f.rotation.angle && f.rotation.angle.roll) labels.push(`roll: ${Math.trunc(100 * f.rotation.angle.roll) / 100} yaw:${Math.trunc(100 * f.rotation.angle.yaw) / 100} pitch:${Math.trunc(100 * f.rotation.angle.pitch) / 100}`);\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 }\n }\n }\n}\n\nconst lastDrawnPose:any[] = [];\nexport async function body(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\n if (!ctx) return;\n ctx.lineJoin = 'round';\n for (let i = 0; i < result.length; i++) {\n // result[i].keypoints = result[i].keypoints.filter((a) => a.score > 0.5);\n if (!lastDrawnPose[i] && localOptions.bufferedOutput) lastDrawnPose[i] = { ...result[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) {\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.z ? `rgba(${127.5 + (2 * result[i].keypoints[pt].position.z)}, ${127.5 - (2 * result[i].keypoints[pt].position.z)}, 255, 0.5)` : localOptions.color;\n if (localOptions.bufferedOutput) {\n lastDrawnPose[i].keypoints[pt][0] = (lastDrawnPose[i].keypoints[pt][0] + result[i].keypoints[pt].position.x) / 2;\n lastDrawnPose[i].keypoints[pt][1] = (lastDrawnPose[i].keypoints[pt][1] + result[i].keypoints[pt].position.y) / 2;\n point(ctx, lastDrawnPose[i].keypoints[pt][0], lastDrawnPose[i].keypoints[pt][1], 0, localOptions);\n } else {\n point(ctx, result[i].keypoints[pt].position.x, result[i].keypoints[pt].position.y, 0, localOptions);\n }\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.z ? `rgba(${127.5 + (2 * pt.position.z)}, ${127.5 - (2 * pt.position.z)}, 255, 0.5)` : localOptions.color;\n ctx.fillText(`${pt.part} ${Math.trunc(100 * pt.score)}%`, pt.position.x + 4, pt.position.y + 4);\n }\n }\n }\n if (localOptions.drawPolygons && result[i].keypoints) {\n let part;\n const points: any[] = [];\n // shoulder line\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'leftShoulder');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightShoulder');\n if (part) points.push([part.position.x, part.position.y]);\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.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightHip');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftHip');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftShoulder');\n if (part) points.push([part.position.x, part.position.y]);\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.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftKnee');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftAnkle');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftHeel');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftFoot');\n if (part) points.push([part.position.x, part.position.y]);\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.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightKnee');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightAnkle');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightHeel');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightFoot');\n if (part) points.push([part.position.x, part.position.y]);\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.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftElbow');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftWrist');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftPalm');\n if (part) points.push([part.position.x, part.position.y]);\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.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightElbow');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightWrist');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightPalm');\n if (part) points.push([part.position.x, part.position.y]);\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 if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\n if (!ctx) return;\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 let box;\n if (!localOptions.calculateHandBox) {\n box = localOptions.useRawBoxes ? h.boxRaw : h.box;\n } else {\n box = [Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, 0, 0];\n if (h.landmarks && h.landmarks.length > 0) {\n for (const pt of h.landmarks) {\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 }\n }\n if (localOptions.useRawBoxes) rect(ctx, inCanvas.width * box[0], inCanvas.height * box[1], inCanvas.width * box[2], inCanvas.height * box[3], localOptions);\n else rect(ctx, box[0], box[1], box[2], box[3], localOptions);\n if (localOptions.drawLabels) {\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText('hand', box[0] + 3, 1 + box[1] + localOptions.lineHeight, box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText('hand', box[0] + 2, 0 + box[1] + localOptions.lineHeight, box[2]);\n }\n ctx.stroke();\n }\n if (localOptions.drawPoints) {\n if (h.landmarks && h.landmarks.length > 0) {\n for (const pt of h.landmarks) {\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 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.indexFinger, 'index');\n addHandLabel(h.annotations.middleFinger, 'middle');\n addHandLabel(h.annotations.ringFinger, 'ring');\n addHandLabel(h.annotations.pinky, 'pinky');\n addHandLabel(h.annotations.thumb, 'thumb');\n addHandLabel(h.annotations.palmBase, '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.indexFinger);\n addHandLine(h.annotations.middleFinger);\n addHandLine(h.annotations.ringFinger);\n addHandLine(h.annotations.pinky);\n addHandLine(h.annotations.thumb);\n // addPart(h.annotations.palmBase);\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 if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\n if (!ctx) return;\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 if (localOptions.useRawBoxes) rect(ctx, inCanvas.width * h.boxRaw[0], inCanvas.height * h.boxRaw[1], inCanvas.width * h.boxRaw[2], inCanvas.height * h.boxRaw[3], localOptions);\n else rect(ctx, h.box[0], h.box[1], h.box[2], h.box[3], localOptions);\n if (localOptions.drawLabels) {\n const label = `${Math.round(100 * h.score)}% ${h.label}`;\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 canvas(inCanvas: HTMLCanvasElement, outCanvas: HTMLCanvasElement) {\n if (!inCanvas || !outCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement) || !(outCanvas instanceof HTMLCanvasElement)) return;\n const outCtx = inCanvas.getContext('2d');\n outCtx?.drawImage(inCanvas, 0, 0);\n}\n\nexport async function all(inCanvas: HTMLCanvasElement, result:any, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n face(inCanvas, result.face, localOptions);\n body(inCanvas, result.body, localOptions);\n hand(inCanvas, result.hand, localOptions);\n gesture(inCanvas, result.gesture, localOptions);\n object(inCanvas, result.object, localOptions);\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", "import { log, now, mergeDeep } from './helpers';\nimport { Config, defaults } from './config';\nimport { Result } from './result';\nimport * as sysinfo from './sysinfo';\nimport * as tf from '../dist/tfjs.esm.js';\nimport * as backend from './tfjs/backend';\nimport * as face from './face';\nimport * 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 nanodet from './object/nanodet';\nimport * as centernet from './object/centernet';\nimport * as gesture from './gesture/gesture';\nimport * as image from './image/image';\nimport * as draw from './draw/draw';\nimport * as sample from './sample';\nimport * as app from '../package.json';\n\n/** Generic Tensor object type */\nexport type Tensor = typeof tf.Tensor;\n\nexport type { Config } from './config';\nexport type { Result } from './result';\nexport type { DrawOptions } from './draw/draw';\n\n/** Defines all possible input types for **Human** detection */\nexport type Input = Tensor | typeof Image | ImageData | ImageBitmap | HTMLImageElement | HTMLMediaElement | HTMLVideoElement | HTMLCanvasElement | OffscreenCanvas;\n\n/** Error message */\nexport type Error = { error: string };\n\n/** Instance of TensorFlow/JS */\nexport type TensorFlow = typeof tf;\n\n/** Generic Model object type, holds instance of individual models */\ntype Model = Object;\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 */\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 /** Current state of Human library\n * - Can be polled to determine operations that are currently executed\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 styles\n * - options: global settings for all draw operations, can be overriden for each draw method, for details see {@link DrawOptions}\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 /** Internal: Currently loaded models */\n models: {\n face: [Model, Model, Model] | null,\n posenet: Model | null,\n blazepose: Model | null,\n efficientpose: Model | null,\n handpose: [Model, Model] | null,\n iris: Model | null,\n age: Model | null,\n gender: Model | null,\n emotion: Model | null,\n embedding: Model | null,\n nanodet: Model | null,\n centernet: Model | null,\n faceres: Model | null,\n };\n /** Internal: Currently loaded classes */\n classes: {\n facemesh: typeof facemesh;\n emotion: typeof emotion;\n body: typeof posenet | typeof blazepose;\n hand: typeof handpose;\n nanodet: typeof nanodet;\n centernet: typeof centernet;\n faceres: typeof faceres;\n };\n /** Face triangualtion array of 468 points, used for triangle references between points */\n faceTriangulation: typeof facemesh.triangulation;\n /** 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 perf: any;\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 | Object = {}) {\n this.tf = tf;\n this.draw = draw;\n this.version = app.version;\n this.config = mergeDeep(defaults, userConfig);\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.perf = {};\n // object that contains all initialized models\n this.models = {\n face: null,\n posenet: null,\n blazepose: null,\n efficientpose: null,\n handpose: null,\n iris: null,\n age: null,\n gender: null,\n emotion: null,\n embedding: null,\n nanodet: null,\n centernet: null,\n faceres: null,\n };\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.classes = {\n facemesh,\n emotion,\n faceres,\n body: this.config.body.modelPath.includes('posenet') ? posenet : blazepose,\n hand: handpose,\n nanodet,\n centernet,\n };\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) => {\n if (!this.#analyzeMemoryLeaks) return;\n const current = this.tf.engine().state.numTensors;\n const previous = this.#numTensors;\n this.#numTensors = current;\n const leaked = current - previous;\n if (leaked !== 0) log(...msg, leaked);\n }\n\n // quick sanity check on inputs\n /** @hidden */\n #sanity = (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 // eslint-disable-next-line class-methods-use-this\n similarity(embedding1: Array, embedding2: Array): number {\n return faceres.similarity(embedding1, embedding2);\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 /**\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 */\n async load(userConfig: Config | Object = {}) {\n this.state = 'load';\n const timeStamp = now();\n if (userConfig) this.config = mergeDeep(this.config, userConfig);\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 if (this.config.async) { // load models concurrently\n [\n this.models.face,\n this.models.emotion,\n this.models.handpose,\n this.models.posenet,\n this.models.blazepose,\n this.models.nanodet,\n this.models.centernet,\n this.models.faceres,\n ] = await Promise.all([\n this.models.face || (this.config.face.enabled ? facemesh.load(this.config) : null),\n this.models.emotion || ((this.config.face.enabled && this.config.face.emotion.enabled) ? emotion.load(this.config) : null),\n this.models.handpose || (this.config.hand.enabled ? handpose.load(this.config) : null),\n this.models.posenet || (this.config.body.enabled && this.config.body.modelPath.includes('posenet') ? posenet.load(this.config) : null),\n this.models.blazepose || (this.config.body.enabled && this.config.body.modelPath.includes('blazepose') ? blazepose.load(this.config) : null),\n this.models.nanodet || (this.config.object.enabled && this.config.object.modelPath.includes('nanodet') ? nanodet.load(this.config) : null),\n this.models.centernet || (this.config.object.enabled && this.config.object.modelPath.includes('centernet') ? centernet.load(this.config) : null),\n this.models.faceres || ((this.config.face.enabled && this.config.face.description.enabled) ? faceres.load(this.config) : null),\n ]);\n } else { // load models sequentially\n if (this.config.face.enabled && !this.models.face) this.models.face = await facemesh.load(this.config);\n if (this.config.face.enabled && this.config.face.emotion.enabled && !this.models.emotion) this.models.emotion = await emotion.load(this.config);\n if (this.config.hand.enabled && !this.models.handpose) this.models.handpose = await handpose.load(this.config);\n if (this.config.body.enabled && !this.models.posenet && this.config.body.modelPath.includes('posenet')) this.models.posenet = await posenet.load(this.config);\n if (this.config.body.enabled && !this.models.blazepose && this.config.body.modelPath.includes('blazepose')) this.models.blazepose = await blazepose.load(this.config);\n if (this.config.object.enabled && !this.models.nanodet && this.config.object.modelPath.includes('nanodet')) this.models.nanodet = await nanodet.load(this.config);\n if (this.config.object.enabled && !this.models.centernet && this.config.object.modelPath.includes('centernet')) this.models.centernet = await centernet.load(this.config);\n if (this.config.face.enabled && this.config.face.description.enabled && !this.models.faceres) this.models.faceres = await faceres.load(this.config);\n }\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.perf.load || 0)) this.perf.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 // @ts-ignore ignore missing type for WorkerGlobalScope as that is the point\n if (typeof window === 'undefined' && typeof WorkerGlobalScope !== 'undefined' && this.config.debug) log('running inside web worker');\n\n // force browser vs node backend\n if (this.tf.ENV.flags.IS_BROWSER && this.config.backend === 'tensorflow') this.config.backend = 'webgl';\n if (this.tf.ENV.flags.IS_NODE && (this.config.backend === 'webgl' || this.config.backend === 'humangl')) this.config.backend = 'tensorflow';\n\n if (this.config.debug) log('setting backend:', this.config.backend);\n\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 if (this.config.backend === 'humangl') backend.register();\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 this.tf.enableProdMode();\n // this.tf.enableDebugMode();\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 tf.ENV.set('WEBGL_FORCE_F16_TEXTURES', true);\n this.tf.ENV.set('WEBGL_PACK_DEPTHWISECONV', true);\n if (typeof this.config['deallocate'] !== 'undefined') {\n log('changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:', true);\n this.tf.ENV.set('WEBGL_DELETE_TEXTURE_THRESHOLD', 0);\n }\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 await this.tf.ready();\n this.perf.backend = Math.trunc(now() - timeStamp);\n }\n }\n\n // check if input changed sufficiently to trigger new detections\n /** @hidden */\n #skipFrame = async (input) => {\n if (this.config.cacheSensitivity === 0) return false;\n const resizeFact = 40;\n const reduced = input.resizeBilinear([Math.trunc(input.shape[1] / resizeFact), Math.trunc(input.shape[2] / resizeFact)]);\n // use tensor sum\n const sumT = this.tf.sum(reduced);\n const sum = sumT.dataSync()[0] as number;\n sumT.dispose();\n // use js loop sum\n /*\n const reducedData = reduced.dataSync();\n let sum = 0;\n for (let i = 0; i < reducedData.length; i++) sum += reducedData[i];\n */\n reduced.dispose();\n const diff = 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 4x threshold, don't use last value to force reset cache for significant change of scenes or images\n this.#lastCacheDiff = diff > 4 * this.config.cacheSensitivity ? 0 : 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 async detect(input: Input, userConfig: Config | Object = {}): Promise {\n // detection happens inside a promise\n return new Promise(async (resolve) => {\n this.state = 'config';\n let timeStamp;\n\n // update configuration\n this.config = mergeDeep(this.config, userConfig);\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 /*\n // function disabled in favor of inputChanged\n // disable video optimization for inputs of type image, but skip if inside worker thread\n let previousVideoOptimized;\n // @ts-ignore ignore missing type for WorkerGlobalScope as that is the point\n if (input && this.config.videoOptimized && (typeof window !== 'undefined') && (typeof WorkerGlobalScope !== 'undefined') && (\n (typeof HTMLImageElement !== 'undefined' && input instanceof HTMLImageElement)\n || (typeof Image !== 'undefined' && input instanceof Image)\n || (typeof ImageData !== 'undefined' && input instanceof ImageData)\n || (typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap))\n ) {\n log('disabling video optimization');\n previousVideoOptimized = this.config.videoOptimized;\n this.config.videoOptimized = false;\n }\n */\n\n timeStamp = now();\n const process = image.process(input, this.config);\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 this.perf.image = Math.trunc(now() - timeStamp);\n this.analyze('Get Image:');\n\n timeStamp = now();\n // @ts-ignore hidden dynamic property that is not part of definitions\n this.config.skipFrame = await this.#skipFrame(process.tensor);\n if (!this.perf.frames) this.perf.frames = 0;\n if (!this.perf.cached) this.perf.cached = 0;\n this.perf.frames++;\n // @ts-ignore hidden dynamic property that is not part of definitions\n if (this.config.skipFrame) this.perf.cached++;\n this.perf.changed = Math.trunc(now() - timeStamp);\n this.analyze('Check Changed:');\n\n // prepare where to store model results\n let bodyRes;\n let handRes;\n let faceRes;\n let objectRes;\n let current;\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.perf.face) delete this.perf.face;\n } else {\n this.state = 'run:face';\n timeStamp = now();\n faceRes = this.config.face.enabled ? await face.detectFace(this, process.tensor) : [];\n current = Math.trunc(now() - timeStamp);\n if (current > 0) this.perf.face = current;\n }\n\n // run body: can be posenet or blazepose\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 if (this.perf.body) delete this.perf.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 current = Math.trunc(now() - timeStamp);\n if (current > 0) this.perf.body = current;\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.perf.hand) delete this.perf.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 current = Math.trunc(now() - timeStamp);\n if (current > 0) this.perf.hand = current;\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.perf.object) delete this.perf.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 current = Math.trunc(now() - timeStamp);\n if (current > 0) this.perf.object = current;\n }\n this.analyze('End Object:');\n\n // if async wait for results\n if (this.config.async) {\n [faceRes, bodyRes, handRes, objectRes] = await Promise.all([faceRes, bodyRes, handRes, objectRes]);\n }\n tf.dispose(process.tensor);\n\n // run gesture analysis last\n let gestureRes: any[] = [];\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.perf.gesture = Math.trunc(now() - timeStamp);\n else if (this.perf.gesture) delete this.perf.gesture;\n }\n\n this.perf.total = Math.trunc(now() - timeStart);\n this.state = 'idle';\n const result = {\n face: faceRes,\n body: bodyRes,\n hand: handRes,\n gesture: gestureRes,\n object: objectRes,\n performance: this.perf,\n canvas: process.canvas,\n };\n // log('Result:', result);\n resolve(result);\n });\n }\n\n /** @hidden */\n #warmupBitmap = async () => {\n const b64toBlob = (base64, 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) => 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 metho pre-initializes all models for faster inference\n * - can take significant time on startup\n * - only used for `webgl` and `humangl` backends\n */\n async warmup(userConfig: Config | Object = {}): Promise {\n const t0 = now();\n if (userConfig) this.config = mergeDeep(this.config, userConfig);\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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mB,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,IA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K,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,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,IA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AG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EA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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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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", + "sourcesContent": ["// 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) {\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", "/* 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 */\nexport interface Config {\n /** Backend used for TFJS operations */\n backend: null | '' | 'cpu' | 'wasm' | 'webgl' | 'humangl' | 'tensorflow',\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 /** 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\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 },\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\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: '../node_modules/@tensorflow/tfjs-backend-wasm/dist//', // path for wasm binaries, only used for backend: wasm\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.01, // 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 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: false, // 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: 10, // maximum number of faces detected in the input\n // should be set to the minimum number for performance\n skipFrames: 21, // 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 },\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: 31, // 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: 32, // 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: 'posenet.json', // body model, can be absolute path or relative to modelBasePath\n // can be 'posenet' or 'blazepose'\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 blazepose only detects single pose\n minConfidence: 0.1, // threshold for discarding a prediction\n },\n\n hand: {\n enabled: true,\n rotation: false, // 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: 32, // 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.1, // threshold for discarding a prediction\n iouThreshold: 0.1, // ammount of overlap between two detected objects before one object is removed\n maxDetected: 2, // 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: 41, // how many max frames to go without re-running the detector\n // only used when cacheSensitivity is not zero\n },\n};\nexport { config as defaults };\n", "export 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].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", "// wrapper to load tfjs in a single place so version can be changed quickly\n\n// simplified\n// { modules: 1250, moduleBytes: 4013323, imports: 7, importBytes: 2255, outputBytes: 2991826, outputFiles: 'dist/tfjs.esm.js' }\n// export * from '@tensorflow/tfjs/dist/index.js';\n// export * from '@tensorflow/tfjs-backend-wasm';\n\n// modular\n// { modules: 1253, moduleBytes: 4029357, imports: 7, importBytes: 2285, outputBytes: 2998298, outputFiles: 'dist/tfjs.esm.js' }\n\n// get versions of all packages.\nimport * as packageBundle from '@tensorflow/tfjs/package.json';\nimport * as packageCore from '@tensorflow/tfjs-core/package.json';\nimport * as packageData from '@tensorflow/tfjs-data/package.json';\nimport * as packageLayers from '@tensorflow/tfjs-layers/package.json';\nimport * as packageConverter from '@tensorflow/tfjs-converter/package.json';\n// for backends, get version from source so it can register backend during import\nimport { version_cpu } from '@tensorflow/tfjs-backend-cpu/dist/index.js';\nimport { version_webgl } from '@tensorflow/tfjs-backend-webgl/dist/index.js';\nimport { version_wasm } from '@tensorflow/tfjs-backend-wasm/dist/index.js';\n\n// export all - compiled\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\n// export all - sources\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 versions\nexport const version = {\n tfjs: packageBundle?.version || undefined,\n 'tfjs-core': packageCore?.version || undefined,\n 'tfjs-data': packageData?.version || undefined,\n 'tfjs-layers': packageLayers?.version || undefined,\n 'tfjs-converter': packageConverter?.version || undefined,\n 'tfjs-backend-cpu': version_cpu || undefined,\n 'tfjs-backend-webgl': version_webgl || undefined,\n 'tfjs-backend-wasm': version_wasm || undefined,\n};\n// export const version = {};\n", "import { 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 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\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);\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 // tf.ENV.set('WEBGL_MAX_TEXTURE_SIZE', config.gl.getParameter(config.gl.MAX_TEXTURE_SIZE));\n // tf.ENV.set('WEBGL_FORCE_F16_TEXTURES', true);\n // tf.ENV.set('WEBGL_PACK_DEPTHWISECONV', true);\n } catch (err) {\n log('error: cannot set WebGL backend flags:', err);\n return;\n }\n log('backend registered:', config.name);\n }\n}\n", "import { 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';\n\nlet faceModels:[any, any, any] = [null, null, null];\nlet facePipeline;\n\nexport async function predict(input, config): Promise<{ confidence, boxConfidence, faceConfidence, box, mesh, boxRaw, meshRaw, annotations, image }[]> {\n const predictions = await facePipeline.predict(input, config);\n const results: Array<{ confidence, boxConfidence, faceConfidence, box, mesh, boxRaw, meshRaw, annotations, image }> = [];\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],\n pt[1] / input.shape[1],\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 = prediction.box ? [\n Math.max(0, prediction.box.startPoint[0]),\n Math.max(0, prediction.box.startPoint[1]),\n Math.min(input.shape[2], prediction.box.endPoint[0]) - Math.max(0, prediction.box.startPoint[0]),\n Math.min(input.shape[1], prediction.box.endPoint[1]) - Math.max(0, prediction.box.startPoint[1]),\n ] : 0;\n const boxRaw = prediction.box ? [\n prediction.box.startPoint[0] / input.shape[2],\n prediction.box.startPoint[1] / input.shape[1],\n (prediction.box.endPoint[0] - prediction.box.startPoint[0]) / input.shape[2],\n (prediction.box.endPoint[1] - prediction.box.startPoint[1]) / input.shape[1],\n ] : [];\n results.push({\n confidence: Math.round(100 * prediction.faceConfidence || 100 * prediction.boxConfidence || 0) / 100,\n boxConfidence: Math.round(100 * prediction.boxConfidence) / 100,\n faceConfidence: Math.round(100 * prediction.faceConfidence) / 100,\n box: clampedBox,\n boxRaw,\n mesh: prediction.mesh,\n meshRaw,\n annotations,\n image: prediction.image,\n });\n if (prediction.coords) prediction.coords.dispose();\n }\n return results;\n}\n\nexport async function load(config): Promise<[Object, Object, Object]> {\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') }) : 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') }) : 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[1].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 log('cached model:', faceModels[0].model.modelUrl);\n log('cached model:', faceModels[1].modelUrl);\n 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", "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 t.startPoint.dispose();\n t.endPoint.dispose();\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 } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as box from './box';\nimport * as util from './util';\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: any;\n anchorsData: any;\n anchors: any;\n inputSize: number;\n config: any;\n\n constructor(model, 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) {\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 = inputImage.resizeBilinear([this.inputSize, this.inputSize]);\n const normalizedImage = resizedImage.div(127.5).sub(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 = concat.squeeze(0);\n } else {\n batchOut = res.squeeze(); // 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.sigmoid(logits).squeeze().dataSync();\n return [batchOut, boxesOut, scoresOut];\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 = nmsTensor.arraySync();\n nmsTensor.dispose();\n const annotatedBoxes: Array<{ box: any, landmarks: any, anchor: number[], confidence: number }> = [];\n for (let i = 0; i < nms.length; i++) {\n const confidence = scores[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 boundingBox.dispose();\n const anchor = this.anchorsData[nms[i]];\n const landmarks = tf.tidy(() => tf.slice(batch, [nms[i], keypointsCount - 1], [1, -1]).squeeze().reshape([keypointsCount, -1]));\n annotatedBoxes.push({ box: localBox, landmarks, anchor, confidence });\n }\n }\n // boundingBoxes.forEach((t) => t.dispose());\n batch.dispose();\n boxes.dispose();\n // scores.dispose();\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) {\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';\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: any;\n boundingBoxDetector: any;\n meshDetector: any;\n irisModel: any;\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 crop = tf.image.flipLeftRight(crop); // flipLeftRight is not defined for tfjs-node\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 = [];\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 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);\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 this.storedBoxes.push({ startPoint: possible.box.startPoint.dataSync(), endPoint: possible.box.endPoint.dataSync(), landmarks: possible.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.arraySync();\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 prediction.box.startPoint.dispose();\n prediction.box.endPoint.dispose();\n prediction.landmarks.dispose();\n });\n }\n const results = tf.tidy(() => this.storedBoxes.map((box, i) => {\n // 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 const [indexOfMouth, indexOfForehead] = (box.landmarks.length >= meshLandmarks.count) ? meshLandmarks.symmetryLine : blazeFaceLandmarks.symmetryLine;\n 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 rotationMatrix = util.buildRotationMatrix(-angle, faceCenter);\n if (config.face.mesh.enabled) face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, rotatedImage, [this.meshSize, this.meshSize]).div(255);\n else face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, rotatedImage, [this.boxSize, this.boxSize]).div(255);\n } else {\n rotationMatrix = util.IDENTITY_MATRIX;\n const clonedImage = input.clone();\n if (config.face.mesh.enabled) face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, clonedImage, [this.meshSize, this.meshSize]).div(255);\n else face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, clonedImage, [this.boxSize, this.boxSize]).div(255);\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 const prediction = {\n mesh: [],\n box,\n faceConfidence: null,\n boxConfidence: box.confidence,\n confidence: box.confidence,\n image: face,\n };\n return prediction;\n }\n\n const [, confidence, contourCoords] = this.meshDetector.execute(face); // The first returned tensor represents facial contours which are already included in the coordinates.\n const faceConfidence = confidence.dataSync()[0];\n if (faceConfidence < config.face.detector.minConfidence) {\n this.storedBoxes[i].confidence = faceConfidence; // reset confidence of cached box\n return null; // if below confidence just exit\n }\n const coordsReshaped = tf.reshape(contourCoords, [-1, 3]);\n let rawCoords = coordsReshaped.arraySync();\n\n if (config.face.iris.enabled) {\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 eyePredictions = this.irisModel.predict(tf.concat([leftEyeCrop, rightEyeCrop]));\n const eyePredictionsData = eyePredictions.dataSync();\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 rawCoords = rawCoords.concat(adjustedLeftIrisCoords).concat(adjustedRightIrisCoords);\n }\n\n // override box from detection with one calculated from mesh\n const mesh = this.transformRawCoords(rawCoords, box, angle, rotationMatrix);\n const storeConfidence = box.confidence;\n box = bounding.enlargeBox(bounding.calculateLandmarksBoundingBox(mesh), 1.5); // redefine box with mesh calculated one\n box.confidence = storeConfidence;\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 const [indexOfMouth, indexOfForehead] = (box.landmarks.length >= meshLandmarks.count) ? meshLandmarks.symmetryLine : blazeFaceLandmarks.symmetryLine;\n 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.toFloat(), angle, 0, faceCenterNormalized); // rotateWithOffset is not defined for tfjs-node\n rotationMatrix = util.buildRotationMatrix(-angle, faceCenter);\n face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, rotatedImage, [this.meshSize, this.meshSize]).div(255);\n }\n\n const prediction = {\n mesh,\n box,\n faceConfidence,\n boxConfidence: box.confidence,\n image: face,\n };\n\n // updated stored cache values\n const storedBox = bounding.squarifyBox(box);\n // @ts-ignore box itself doesn't have those properties, but we stored them for future use\n storedBox.confidence = box.confidence;\n // @ts-ignore box itself doesn't have those properties, but we stored them for future use\n storedBox.faceConfidence = faceConfidence;\n // this.storedBoxes[i] = { ...squarifiedLandmarksBox, confidence: box.confidence, faceConfidence };\n this.storedBoxes[i] = storedBox;\n\n return prediction;\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 = this.storedBoxes.filter((a) => a.confidence > config.face.detector.minConfidence);\n this.detectedFaces = results.length;\n\n return results;\n }\n}\n", "import { log, join } from '../helpers';\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) {\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, 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 resize.dispose();\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 red.dispose();\n green.dispose();\n blue.dispose();\n const grayscale = tf.addN([redNorm, greenNorm, blueNorm]);\n redNorm.dispose();\n greenNorm.dispose();\n blueNorm.dispose();\n const normalize = tf.tidy(() => grayscale.sub(0.5).mul(2));\n grayscale.dispose();\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 = emotionT.dataSync();\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 normalize.dispose();\n last[idx] = obj;\n lastCount = count;\n resolve(obj);\n });\n}\n", "import { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\n\nlet model;\nconst last: Array<{ age: number}> = [];\nlet lastCount = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\ntype Tensor = typeof tf.Tensor;\ntype DB = Array<{ name: string, source: string, embedding: number[] }>;\n\nexport async function load(config) {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.face.description.modelPath));\n if (!model || !model.modelUrl) log('load model failed:', config.face.description.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 function similarity(embedding1, embedding2, 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 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 = crop.mul(255);\n\n return norm;\n });\n return image;\n}\n\nexport async function predict(image, 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;\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 genderConfidence: 0,\n descriptor: [] };\n\n if (config.face.description.enabled) resT = await model.predict(enhanced);\n tf.dispose(enhanced);\n\n if (resT) {\n tf.tidy(() => {\n const gender = resT.find((t) => t.shape[1] === 1).dataSync();\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.genderConfidence = Math.min(0.99, confidence);\n }\n const age = resT.find((t) => t.shape[1] === 100).argMax(1).dataSync()[0];\n const all = resT.find((t) => t.shape[1] === 100).dataSync();\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 obj.descriptor = [...desc.dataSync()];\n });\n resT.forEach((t) => tf.dispose(t));\n }\n\n last[idx] = obj;\n lastCount = count;\n resolve(obj);\n });\n}\n", "import { log, now } from './helpers';\nimport * as facemesh from './blazeface/facemesh';\nimport * as emotion from './emotion/emotion';\nimport * as faceres from './faceres/faceres';\nimport { Face } from './result';\n\nconst calculateFaceAngle = (face, image_size): { angle: { pitch: number, yaw: number, roll: number }, matrix: [number, number, number, number, number, number, number, number, number] } => {\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const degrees = (theta) => (theta * 180) / Math.PI;\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; let thetaY; let thetaZ;\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 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 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] };\n\n const size = Math.max(face.boxRaw[2] * image_size[0], face.boxRaw[3] * image_size[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] * image_size[0] / size,\n pt[1] * image_size[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 return { angle, matrix };\n};\n\nexport const detectFace = async (parent, input): 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 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.perf.face = Math.trunc(now() - timeStamp);\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 if (!faces[i].image || faces[i].image.isDisposedInternal) {\n log('Face object is disposed:', faces[i].image);\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].image, 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].image, parent.config, i, faces.length) : {};\n parent.perf.emotion = Math.trunc(now() - timeStamp);\n }\n parent.analyze('End Emotion:');\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], 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].image, parent.config, i, faces.length) : [];\n parent.perf.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] = await Promise.all([ageRes, genderRes, emotionRes, embeddingRes, descRes]);\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 /* average human iris size is 11.7mm */\n ? 11.7 * 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]))\n : 0;\n\n // combine results\n faceRes.push({\n id: i,\n ...faces[i],\n age: descRes.age,\n gender: descRes.gender,\n genderConfidence: descRes.genderConfidence,\n embedding: descRes.descriptor,\n emotion: emotionRes,\n iris: (irisSize !== 0) ? Math.trunc(irisSize) / 100 : 0,\n rotation,\n tensor: parent.config.face.detector.return ? faces[i].image?.squeeze() : null,\n });\n // dispose original face tensor\n faces[i].image?.dispose();\n\n parent.analyze('End Face');\n }\n parent.analyze('End FaceMesh:');\n if (parent.config.async) {\n if (parent.perf.face) delete parent.perf.face;\n if (parent.perf.age) delete parent.perf.age;\n if (parent.perf.gender) delete parent.perf.gender;\n if (parent.perf.emotion) delete parent.perf.emotion;\n }\n return faceRes;\n};\n", "import { 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';\n\nlet model;\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, config): Promise {\n const res = tf.tidy(() => {\n const resized = input.resizeBilinear([model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n const normalized = resized.toFloat().div(127.5).sub(1.0);\n const results = model.execute(normalized, poseNetOutputs);\n const results3d = results.map((y) => y.squeeze([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.buffer()));\n for (const t of res) t.dispose();\n\n const decoded = await poses.decode(buffers[0], buffers[1], buffers[2], buffers[3], config.body.maxDetected, config.body.minConfidence);\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) {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.body.modelPath));\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", "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';\n\nexport function eitherPointDoesntMeetConfidence(a, b, minConfidence) {\n return (a < minConfidence || b < minConfidence);\n}\n\nexport function getAdjacentKeyPoints(keypoints, minConfidence) {\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) {\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]) {\n const scaleY = height / inputResolutionHeight;\n const scaleX = width / inputResolutionWidth;\n const scalePose = (pose) => ({\n score: pose.score,\n bowRaw: [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: { x: Math.trunc(position.x * scaleX), y: Math.trunc(position.y * scaleY) },\n })),\n });\n const scaledPoses = poses.map((pose) => scalePose(pose));\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: any;\n numberOfElements: number;\n getElementValue: any;\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 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: any, box: any, 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 const rootImageCoords = utils.getImageCoords(root.part, outputStride, offsets);\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", "import { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as handdetector from './handdetector';\nimport * as handpipeline from './handpipeline';\nimport { Hand } from '../result';\n\nconst meshAnnotations = {\n thumb: [1, 2, 3, 4],\n indexFinger: [5, 6, 7, 8],\n middleFinger: [9, 10, 11, 12],\n ringFinger: [13, 14, 15, 16],\n pinky: [17, 18, 19, 20],\n palmBase: [0],\n};\n\nlet handDetectorModel;\nlet handPoseModel;\nlet handPipeline;\n\nexport async function predict(input, 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 annotations[key] = meshAnnotations[key].map((index) => predictions[i].landmarks[index]);\n }\n }\n const box: [number, number, number, number] = predictions[i].box ? [\n Math.max(0, predictions[i].box.topLeft[0]),\n Math.max(0, predictions[i].box.topLeft[1]),\n Math.min(input.shape[2], predictions[i].box.bottomRight[0]) - Math.max(0, predictions[i].box.topLeft[0]),\n Math.min(input.shape[1], predictions[i].box.bottomRight[1]) - Math.max(0, predictions[i].box.topLeft[1]),\n ] : [0, 0, 0, 0];\n const boxRaw: [number, number, number, number] = [\n (predictions[i].box.topLeft[0]) / input.shape[2],\n (predictions[i].box.topLeft[1]) / input.shape[1],\n (predictions[i].box.bottomRight[0] - predictions[i].box.topLeft[0]) / input.shape[2],\n (predictions[i].box.bottomRight[1] - predictions[i].box.topLeft[1]) / input.shape[1],\n ];\n hands.push({ id: i, confidence: Math.round(100 * predictions[i].confidence) / 100, box, boxRaw, landmarks: predictions[i].landmarks, annotations });\n }\n return hands;\n}\n\nexport async function load(config): Promise<[Object, Object]> {\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') }) : null,\n config.hand.landmarks ? tf.loadGraphModel(join(config.modelBasePath, config.hand.skeleton.modelPath), { fromTFHub: config.hand.skeleton.modelPath.includes('tfhub.dev') }) : 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", "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 {\n x: 0.015625,\n y: 0.015625,\n },\n {\n x: 0.015625,\n y: 0.015625,\n },\n {\n x: 0.046875,\n y: 0.015625,\n },\n {\n x: 0.046875,\n y: 0.015625,\n },\n {\n x: 0.078125,\n y: 0.015625,\n },\n {\n x: 0.078125,\n y: 0.015625,\n },\n {\n x: 0.109375,\n y: 0.015625,\n },\n {\n x: 0.109375,\n y: 0.015625,\n },\n {\n x: 0.140625,\n y: 0.015625,\n },\n {\n x: 0.140625,\n y: 0.015625,\n },\n {\n x: 0.171875,\n y: 0.015625,\n },\n {\n x: 0.171875,\n y: 0.015625,\n },\n {\n x: 0.203125,\n y: 0.015625,\n },\n {\n x: 0.203125,\n y: 0.015625,\n },\n {\n x: 0.234375,\n y: 0.015625,\n },\n {\n x: 0.234375,\n y: 0.015625,\n },\n {\n x: 0.265625,\n y: 0.015625,\n },\n {\n x: 0.265625,\n y: 0.015625,\n },\n {\n x: 0.296875,\n y: 0.015625,\n },\n {\n x: 0.296875,\n y: 0.015625,\n },\n {\n x: 0.328125,\n y: 0.015625,\n },\n {\n x: 0.328125,\n y: 0.015625,\n },\n {\n x: 0.359375,\n y: 0.015625,\n },\n {\n x: 0.359375,\n y: 0.015625,\n },\n {\n x: 0.390625,\n y: 0.015625,\n },\n {\n x: 0.390625,\n y: 0.015625,\n },\n {\n x: 0.421875,\n y: 0.015625,\n },\n {\n x: 0.421875,\n y: 0.015625,\n },\n {\n x: 0.453125,\n y: 0.015625,\n },\n {\n x: 0.453125,\n y: 0.015625,\n },\n {\n x: 0.484375,\n y: 0.015625,\n },\n {\n x: 0.484375,\n y: 0.015625,\n },\n {\n x: 0.515625,\n y: 0.015625,\n },\n {\n x: 0.515625,\n y: 0.015625,\n },\n {\n x: 0.546875,\n y: 0.015625,\n },\n {\n x: 0.546875,\n y: 0.015625,\n },\n {\n x: 0.578125,\n y: 0.015625,\n },\n {\n x: 0.578125,\n y: 0.015625,\n },\n {\n x: 0.609375,\n y: 0.015625,\n },\n {\n x: 0.609375,\n y: 0.015625,\n },\n {\n x: 0.640625,\n y: 0.015625,\n },\n {\n x: 0.640625,\n y: 0.015625,\n },\n {\n x: 0.671875,\n y: 0.015625,\n },\n {\n x: 0.671875,\n y: 0.015625,\n },\n {\n x: 0.703125,\n y: 0.015625,\n },\n {\n x: 0.703125,\n y: 0.015625,\n },\n {\n x: 0.734375,\n y: 0.015625,\n },\n {\n x: 0.734375,\n y: 0.015625,\n },\n {\n x: 0.765625,\n y: 0.015625,\n },\n {\n x: 0.765625,\n y: 0.015625,\n },\n {\n x: 0.796875,\n y: 0.015625,\n },\n {\n x: 0.796875,\n y: 0.015625,\n },\n {\n x: 0.828125,\n y: 0.015625,\n },\n {\n x: 0.828125,\n y: 0.015625,\n },\n {\n x: 0.859375,\n y: 0.015625,\n },\n {\n x: 0.859375,\n y: 0.015625,\n },\n {\n x: 0.890625,\n y: 0.015625,\n },\n {\n x: 0.890625,\n y: 0.015625,\n },\n {\n x: 0.921875,\n y: 0.015625,\n },\n {\n x: 0.921875,\n y: 0.015625,\n },\n {\n x: 0.953125,\n y: 0.015625,\n },\n {\n x: 0.953125,\n y: 0.015625,\n },\n {\n x: 0.984375,\n y: 0.015625,\n },\n {\n x: 0.984375,\n y: 0.015625,\n },\n {\n x: 0.015625,\n y: 0.046875,\n },\n {\n x: 0.015625,\n y: 0.046875,\n },\n {\n x: 0.046875,\n y: 0.046875,\n },\n {\n x: 0.046875,\n y: 0.046875,\n },\n {\n x: 0.078125,\n y: 0.046875,\n },\n {\n x: 0.078125,\n y: 0.046875,\n },\n {\n x: 0.109375,\n y: 0.046875,\n },\n {\n x: 0.109375,\n y: 0.046875,\n },\n {\n x: 0.140625,\n y: 0.046875,\n },\n {\n x: 0.140625,\n y: 0.046875,\n },\n {\n x: 0.171875,\n y: 0.046875,\n },\n {\n x: 0.171875,\n y: 0.046875,\n },\n {\n x: 0.203125,\n y: 0.046875,\n },\n {\n x: 0.203125,\n y: 0.046875,\n },\n {\n x: 0.234375,\n y: 0.046875,\n },\n {\n x: 0.234375,\n y: 0.046875,\n },\n {\n x: 0.265625,\n y: 0.046875,\n },\n {\n x: 0.265625,\n y: 0.046875,\n },\n {\n x: 0.296875,\n y: 0.046875,\n },\n {\n x: 0.296875,\n y: 0.046875,\n },\n {\n x: 0.328125,\n y: 0.046875,\n },\n {\n x: 0.328125,\n y: 0.046875,\n },\n {\n x: 0.359375,\n y: 0.046875,\n },\n {\n x: 0.359375,\n y: 0.046875,\n },\n {\n x: 0.390625,\n y: 0.046875,\n },\n {\n x: 0.390625,\n y: 0.046875,\n },\n {\n x: 0.421875,\n y: 0.046875,\n },\n {\n x: 0.421875,\n y: 0.046875,\n },\n {\n x: 0.453125,\n y: 0.046875,\n },\n {\n x: 0.453125,\n y: 0.046875,\n },\n {\n x: 0.484375,\n y: 0.046875,\n },\n {\n x: 0.484375,\n y: 0.046875,\n },\n {\n x: 0.515625,\n y: 0.046875,\n },\n {\n x: 0.515625,\n y: 0.046875,\n },\n {\n x: 0.546875,\n y: 0.046875,\n },\n {\n x: 0.546875,\n y: 0.046875,\n },\n {\n x: 0.578125,\n y: 0.046875,\n },\n {\n x: 0.578125,\n y: 0.046875,\n },\n {\n x: 0.609375,\n y: 0.046875,\n },\n {\n x: 0.609375,\n y: 0.046875,\n },\n {\n x: 0.640625,\n y: 0.046875,\n },\n {\n x: 0.640625,\n y: 0.046875,\n },\n {\n x: 0.671875,\n y: 0.046875,\n },\n {\n x: 0.671875,\n y: 0.046875,\n },\n {\n x: 0.703125,\n y: 0.046875,\n },\n {\n x: 0.703125,\n y: 0.046875,\n },\n {\n x: 0.734375,\n y: 0.046875,\n },\n {\n x: 0.734375,\n y: 0.046875,\n },\n {\n x: 0.765625,\n y: 0.046875,\n },\n {\n x: 0.765625,\n y: 0.046875,\n },\n {\n x: 0.796875,\n y: 0.046875,\n },\n {\n x: 0.796875,\n y: 0.046875,\n },\n {\n x: 0.828125,\n y: 0.046875,\n },\n {\n x: 0.828125,\n y: 0.046875,\n },\n {\n x: 0.859375,\n y: 0.046875,\n },\n {\n x: 0.859375,\n y: 0.046875,\n },\n {\n x: 0.890625,\n y: 0.046875,\n },\n {\n x: 0.890625,\n y: 0.046875,\n },\n {\n x: 0.921875,\n y: 0.046875,\n },\n {\n x: 0.921875,\n y: 0.046875,\n },\n {\n x: 0.953125,\n y: 0.046875,\n },\n {\n x: 0.953125,\n y: 0.046875,\n },\n {\n x: 0.984375,\n y: 0.046875,\n },\n {\n x: 0.984375,\n y: 0.046875,\n },\n {\n x: 0.015625,\n y: 0.078125,\n },\n {\n x: 0.015625,\n y: 0.078125,\n },\n {\n x: 0.046875,\n y: 0.078125,\n },\n {\n x: 0.046875,\n y: 0.078125,\n },\n {\n x: 0.078125,\n y: 0.078125,\n },\n {\n x: 0.078125,\n y: 0.078125,\n },\n {\n x: 0.109375,\n y: 0.078125,\n },\n {\n x: 0.109375,\n y: 0.078125,\n },\n {\n x: 0.140625,\n y: 0.078125,\n },\n {\n x: 0.140625,\n y: 0.078125,\n },\n {\n x: 0.171875,\n y: 0.078125,\n },\n {\n x: 0.171875,\n y: 0.078125,\n },\n {\n x: 0.203125,\n y: 0.078125,\n },\n {\n x: 0.203125,\n y: 0.078125,\n },\n {\n x: 0.234375,\n y: 0.078125,\n },\n {\n x: 0.234375,\n y: 0.078125,\n },\n {\n x: 0.265625,\n y: 0.078125,\n },\n {\n x: 0.265625,\n y: 0.078125,\n },\n {\n x: 0.296875,\n y: 0.078125,\n },\n {\n x: 0.296875,\n y: 0.078125,\n },\n {\n x: 0.328125,\n y: 0.078125,\n },\n {\n x: 0.328125,\n y: 0.078125,\n },\n {\n x: 0.359375,\n y: 0.078125,\n },\n {\n x: 0.359375,\n y: 0.078125,\n },\n {\n x: 0.390625,\n y: 0.078125,\n },\n {\n x: 0.390625,\n y: 0.078125,\n },\n {\n x: 0.421875,\n y: 0.078125,\n },\n {\n x: 0.421875,\n y: 0.078125,\n },\n {\n x: 0.453125,\n y: 0.078125,\n },\n {\n x: 0.453125,\n y: 0.078125,\n },\n {\n x: 0.484375,\n y: 0.078125,\n },\n {\n x: 0.484375,\n y: 0.078125,\n },\n {\n x: 0.515625,\n y: 0.078125,\n },\n {\n x: 0.515625,\n y: 0.078125,\n },\n {\n x: 0.546875,\n y: 0.078125,\n },\n {\n x: 0.546875,\n y: 0.078125,\n },\n {\n x: 0.578125,\n y: 0.078125,\n },\n {\n x: 0.578125,\n y: 0.078125,\n },\n {\n x: 0.609375,\n y: 0.078125,\n },\n {\n x: 0.609375,\n y: 0.078125,\n },\n {\n x: 0.640625,\n y: 0.078125,\n },\n {\n x: 0.640625,\n y: 0.078125,\n },\n {\n x: 0.671875,\n y: 0.078125,\n },\n {\n x: 0.671875,\n y: 0.078125,\n },\n {\n x: 0.703125,\n y: 0.078125,\n },\n {\n x: 0.703125,\n y: 0.078125,\n },\n {\n x: 0.734375,\n y: 0.078125,\n },\n {\n x: 0.734375,\n y: 0.078125,\n },\n {\n x: 0.765625,\n y: 0.078125,\n },\n {\n x: 0.765625,\n y: 0.078125,\n },\n {\n x: 0.796875,\n y: 0.078125,\n },\n {\n x: 0.796875,\n y: 0.078125,\n },\n {\n x: 0.828125,\n y: 0.078125,\n },\n {\n x: 0.828125,\n y: 0.078125,\n },\n {\n x: 0.859375,\n y: 0.078125,\n },\n {\n x: 0.859375,\n y: 0.078125,\n },\n {\n x: 0.890625,\n y: 0.078125,\n },\n {\n x: 0.890625,\n y: 0.078125,\n },\n {\n x: 0.921875,\n y: 0.078125,\n },\n {\n x: 0.921875,\n y: 0.078125,\n },\n {\n x: 0.953125,\n y: 0.078125,\n },\n {\n x: 0.953125,\n y: 0.078125,\n },\n {\n x: 0.984375,\n y: 0.078125,\n },\n {\n x: 0.984375,\n y: 0.078125,\n },\n {\n x: 0.015625,\n y: 0.109375,\n },\n {\n x: 0.015625,\n y: 0.109375,\n },\n {\n x: 0.046875,\n y: 0.109375,\n },\n {\n x: 0.046875,\n y: 0.109375,\n },\n {\n x: 0.078125,\n y: 0.109375,\n },\n {\n x: 0.078125,\n y: 0.109375,\n },\n {\n x: 0.109375,\n y: 0.109375,\n },\n {\n x: 0.109375,\n y: 0.109375,\n },\n {\n x: 0.140625,\n y: 0.109375,\n },\n {\n x: 0.140625,\n y: 0.109375,\n },\n {\n x: 0.171875,\n y: 0.109375,\n },\n {\n x: 0.171875,\n y: 0.109375,\n },\n {\n x: 0.203125,\n y: 0.109375,\n },\n {\n x: 0.203125,\n y: 0.109375,\n },\n {\n x: 0.234375,\n y: 0.109375,\n },\n {\n x: 0.234375,\n y: 0.109375,\n },\n {\n x: 0.265625,\n y: 0.109375,\n },\n {\n x: 0.265625,\n y: 0.109375,\n },\n {\n x: 0.296875,\n y: 0.109375,\n },\n {\n x: 0.296875,\n y: 0.109375,\n },\n {\n x: 0.328125,\n y: 0.109375,\n },\n {\n x: 0.328125,\n y: 0.109375,\n },\n {\n x: 0.359375,\n y: 0.109375,\n },\n {\n x: 0.359375,\n y: 0.109375,\n },\n {\n x: 0.390625,\n y: 0.109375,\n },\n {\n x: 0.390625,\n y: 0.109375,\n },\n {\n x: 0.421875,\n y: 0.109375,\n },\n {\n x: 0.421875,\n y: 0.109375,\n },\n {\n x: 0.453125,\n y: 0.109375,\n },\n {\n x: 0.453125,\n y: 0.109375,\n },\n {\n x: 0.484375,\n y: 0.109375,\n },\n {\n x: 0.484375,\n y: 0.109375,\n },\n {\n x: 0.515625,\n y: 0.109375,\n },\n {\n x: 0.515625,\n y: 0.109375,\n },\n {\n x: 0.546875,\n y: 0.109375,\n },\n {\n x: 0.546875,\n y: 0.109375,\n },\n {\n x: 0.578125,\n y: 0.109375,\n },\n {\n x: 0.578125,\n y: 0.109375,\n },\n {\n x: 0.609375,\n y: 0.109375,\n },\n {\n x: 0.609375,\n y: 0.109375,\n },\n {\n x: 0.640625,\n y: 0.109375,\n },\n {\n x: 0.640625,\n y: 0.109375,\n },\n {\n x: 0.671875,\n y: 0.109375,\n },\n {\n x: 0.671875,\n y: 0.109375,\n },\n {\n x: 0.703125,\n y: 0.109375,\n },\n {\n x: 0.703125,\n y: 0.109375,\n },\n {\n x: 0.734375,\n y: 0.109375,\n },\n {\n x: 0.734375,\n y: 0.109375,\n },\n {\n x: 0.765625,\n y: 0.109375,\n },\n {\n x: 0.765625,\n y: 0.109375,\n },\n {\n x: 0.796875,\n y: 0.109375,\n },\n {\n x: 0.796875,\n y: 0.109375,\n },\n {\n x: 0.828125,\n y: 0.109375,\n },\n {\n x: 0.828125,\n y: 0.109375,\n },\n {\n x: 0.859375,\n y: 0.109375,\n },\n {\n x: 0.859375,\n y: 0.109375,\n },\n {\n x: 0.890625,\n y: 0.109375,\n },\n {\n x: 0.890625,\n y: 0.109375,\n },\n {\n x: 0.921875,\n y: 0.109375,\n },\n {\n x: 0.921875,\n y: 0.109375,\n },\n {\n x: 0.953125,\n y: 0.109375,\n },\n {\n x: 0.953125,\n y: 0.109375,\n },\n {\n x: 0.984375,\n y: 0.109375,\n },\n {\n x: 0.984375,\n y: 0.109375,\n },\n {\n x: 0.015625,\n y: 0.140625,\n },\n {\n x: 0.015625,\n y: 0.140625,\n },\n {\n x: 0.046875,\n y: 0.140625,\n },\n {\n x: 0.046875,\n y: 0.140625,\n },\n {\n x: 0.078125,\n y: 0.140625,\n },\n {\n x: 0.078125,\n y: 0.140625,\n },\n {\n x: 0.109375,\n y: 0.140625,\n },\n {\n x: 0.109375,\n y: 0.140625,\n },\n {\n x: 0.140625,\n y: 0.140625,\n },\n {\n x: 0.140625,\n y: 0.140625,\n },\n {\n x: 0.171875,\n y: 0.140625,\n },\n {\n x: 0.171875,\n y: 0.140625,\n },\n {\n x: 0.203125,\n y: 0.140625,\n },\n {\n x: 0.203125,\n y: 0.140625,\n },\n {\n x: 0.234375,\n y: 0.140625,\n },\n {\n x: 0.234375,\n y: 0.140625,\n },\n {\n x: 0.265625,\n y: 0.140625,\n },\n {\n x: 0.265625,\n y: 0.140625,\n },\n {\n x: 0.296875,\n y: 0.140625,\n },\n {\n x: 0.296875,\n y: 0.140625,\n },\n {\n x: 0.328125,\n y: 0.140625,\n },\n {\n x: 0.328125,\n y: 0.140625,\n },\n {\n x: 0.359375,\n y: 0.140625,\n },\n {\n x: 0.359375,\n y: 0.140625,\n },\n {\n x: 0.390625,\n y: 0.140625,\n },\n {\n x: 0.390625,\n y: 0.140625,\n },\n {\n x: 0.421875,\n y: 0.140625,\n },\n {\n x: 0.421875,\n y: 0.140625,\n },\n {\n x: 0.453125,\n y: 0.140625,\n },\n {\n x: 0.453125,\n y: 0.140625,\n },\n {\n x: 0.484375,\n y: 0.140625,\n },\n {\n x: 0.484375,\n y: 0.140625,\n },\n {\n x: 0.515625,\n y: 0.140625,\n },\n {\n x: 0.515625,\n y: 0.140625,\n },\n {\n x: 0.546875,\n y: 0.140625,\n },\n {\n x: 0.546875,\n y: 0.140625,\n },\n {\n x: 0.578125,\n y: 0.140625,\n },\n {\n x: 0.578125,\n y: 0.140625,\n },\n {\n x: 0.609375,\n y: 0.140625,\n },\n {\n x: 0.609375,\n y: 0.140625,\n },\n {\n x: 0.640625,\n y: 0.140625,\n },\n {\n x: 0.640625,\n y: 0.140625,\n },\n {\n x: 0.671875,\n y: 0.140625,\n },\n {\n x: 0.671875,\n y: 0.140625,\n },\n {\n x: 0.703125,\n y: 0.140625,\n },\n {\n x: 0.703125,\n y: 0.140625,\n },\n {\n x: 0.734375,\n y: 0.140625,\n },\n {\n x: 0.734375,\n y: 0.140625,\n },\n {\n x: 0.765625,\n y: 0.140625,\n },\n {\n x: 0.765625,\n y: 0.140625,\n },\n {\n x: 0.796875,\n y: 0.140625,\n },\n {\n x: 0.796875,\n y: 0.140625,\n },\n {\n x: 0.828125,\n y: 0.140625,\n },\n {\n x: 0.828125,\n y: 0.140625,\n },\n {\n x: 0.859375,\n y: 0.140625,\n },\n {\n x: 0.859375,\n y: 0.140625,\n },\n {\n x: 0.890625,\n y: 0.140625,\n },\n {\n x: 0.890625,\n y: 0.140625,\n },\n {\n x: 0.921875,\n y: 0.140625,\n },\n {\n x: 0.921875,\n y: 0.140625,\n },\n {\n x: 0.953125,\n y: 0.140625,\n },\n {\n x: 0.953125,\n y: 0.140625,\n },\n {\n x: 0.984375,\n y: 0.140625,\n },\n {\n x: 0.984375,\n y: 0.140625,\n },\n {\n x: 0.015625,\n y: 0.171875,\n },\n {\n x: 0.015625,\n y: 0.171875,\n },\n {\n x: 0.046875,\n y: 0.171875,\n },\n {\n x: 0.046875,\n y: 0.171875,\n },\n {\n x: 0.078125,\n y: 0.171875,\n },\n {\n x: 0.078125,\n y: 0.171875,\n },\n {\n x: 0.109375,\n y: 0.171875,\n },\n {\n x: 0.109375,\n y: 0.171875,\n },\n {\n x: 0.140625,\n y: 0.171875,\n },\n {\n x: 0.140625,\n y: 0.171875,\n },\n {\n x: 0.171875,\n y: 0.171875,\n },\n {\n x: 0.171875,\n y: 0.171875,\n },\n {\n x: 0.203125,\n y: 0.171875,\n },\n {\n x: 0.203125,\n y: 0.171875,\n },\n {\n x: 0.234375,\n y: 0.171875,\n },\n {\n x: 0.234375,\n y: 0.171875,\n },\n {\n x: 0.265625,\n y: 0.171875,\n },\n {\n x: 0.265625,\n y: 0.171875,\n },\n {\n x: 0.296875,\n y: 0.171875,\n },\n {\n x: 0.296875,\n y: 0.171875,\n },\n {\n x: 0.328125,\n y: 0.171875,\n },\n {\n x: 0.328125,\n y: 0.171875,\n },\n {\n x: 0.359375,\n y: 0.171875,\n },\n {\n x: 0.359375,\n y: 0.171875,\n },\n {\n x: 0.390625,\n y: 0.171875,\n },\n {\n x: 0.390625,\n y: 0.171875,\n },\n {\n x: 0.421875,\n y: 0.171875,\n },\n {\n x: 0.421875,\n y: 0.171875,\n },\n {\n x: 0.453125,\n y: 0.171875,\n },\n {\n x: 0.453125,\n y: 0.171875,\n },\n {\n x: 0.484375,\n y: 0.171875,\n },\n {\n x: 0.484375,\n y: 0.171875,\n },\n {\n x: 0.515625,\n y: 0.171875,\n },\n {\n x: 0.515625,\n y: 0.171875,\n },\n {\n x: 0.546875,\n y: 0.171875,\n },\n {\n x: 0.546875,\n y: 0.171875,\n },\n {\n x: 0.578125,\n y: 0.171875,\n },\n {\n x: 0.578125,\n y: 0.171875,\n },\n {\n x: 0.609375,\n y: 0.171875,\n },\n {\n x: 0.609375,\n y: 0.171875,\n },\n {\n x: 0.640625,\n y: 0.171875,\n },\n {\n x: 0.640625,\n y: 0.171875,\n },\n {\n x: 0.671875,\n y: 0.171875,\n },\n {\n x: 0.671875,\n y: 0.171875,\n },\n {\n x: 0.703125,\n y: 0.171875,\n },\n {\n x: 0.703125,\n y: 0.171875,\n },\n {\n x: 0.734375,\n y: 0.171875,\n },\n {\n x: 0.734375,\n y: 0.171875,\n },\n {\n x: 0.765625,\n y: 0.171875,\n },\n {\n x: 0.765625,\n y: 0.171875,\n },\n {\n x: 0.796875,\n y: 0.171875,\n },\n {\n x: 0.796875,\n y: 0.171875,\n },\n {\n x: 0.828125,\n y: 0.171875,\n },\n {\n x: 0.828125,\n y: 0.171875,\n },\n {\n x: 0.859375,\n y: 0.171875,\n },\n {\n x: 0.859375,\n y: 0.171875,\n },\n {\n x: 0.890625,\n y: 0.171875,\n },\n {\n x: 0.890625,\n y: 0.171875,\n },\n {\n x: 0.921875,\n y: 0.171875,\n },\n {\n x: 0.921875,\n y: 0.171875,\n },\n {\n x: 0.953125,\n y: 0.171875,\n },\n {\n x: 0.953125,\n y: 0.171875,\n },\n {\n x: 0.984375,\n y: 0.171875,\n },\n {\n x: 0.984375,\n y: 0.171875,\n },\n {\n x: 0.015625,\n y: 0.203125,\n },\n {\n x: 0.015625,\n y: 0.203125,\n },\n {\n x: 0.046875,\n y: 0.203125,\n },\n {\n x: 0.046875,\n y: 0.203125,\n },\n {\n x: 0.078125,\n y: 0.203125,\n },\n {\n x: 0.078125,\n y: 0.203125,\n },\n {\n x: 0.109375,\n y: 0.203125,\n },\n {\n x: 0.109375,\n y: 0.203125,\n },\n {\n x: 0.140625,\n y: 0.203125,\n },\n {\n x: 0.140625,\n y: 0.203125,\n },\n {\n x: 0.171875,\n y: 0.203125,\n },\n {\n x: 0.171875,\n y: 0.203125,\n },\n {\n x: 0.203125,\n y: 0.203125,\n },\n {\n x: 0.203125,\n y: 0.203125,\n },\n {\n x: 0.234375,\n y: 0.203125,\n },\n {\n x: 0.234375,\n y: 0.203125,\n },\n {\n x: 0.265625,\n y: 0.203125,\n },\n {\n x: 0.265625,\n y: 0.203125,\n },\n {\n x: 0.296875,\n y: 0.203125,\n },\n {\n x: 0.296875,\n y: 0.203125,\n },\n {\n x: 0.328125,\n y: 0.203125,\n },\n {\n x: 0.328125,\n y: 0.203125,\n },\n {\n x: 0.359375,\n y: 0.203125,\n },\n {\n x: 0.359375,\n y: 0.203125,\n },\n {\n x: 0.390625,\n y: 0.203125,\n },\n {\n x: 0.390625,\n y: 0.203125,\n },\n {\n x: 0.421875,\n y: 0.203125,\n },\n {\n x: 0.421875,\n y: 0.203125,\n },\n {\n x: 0.453125,\n y: 0.203125,\n },\n {\n x: 0.453125,\n y: 0.203125,\n },\n {\n x: 0.484375,\n y: 0.203125,\n },\n {\n x: 0.484375,\n y: 0.203125,\n },\n {\n x: 0.515625,\n y: 0.203125,\n },\n {\n x: 0.515625,\n y: 0.203125,\n },\n {\n x: 0.546875,\n y: 0.203125,\n },\n {\n x: 0.546875,\n y: 0.203125,\n },\n {\n x: 0.578125,\n y: 0.203125,\n },\n {\n x: 0.578125,\n y: 0.203125,\n },\n {\n x: 0.609375,\n y: 0.203125,\n },\n {\n x: 0.609375,\n y: 0.203125,\n },\n {\n x: 0.640625,\n y: 0.203125,\n },\n {\n x: 0.640625,\n y: 0.203125,\n },\n {\n x: 0.671875,\n y: 0.203125,\n },\n {\n x: 0.671875,\n y: 0.203125,\n },\n {\n x: 0.703125,\n y: 0.203125,\n },\n {\n x: 0.703125,\n y: 0.203125,\n },\n {\n x: 0.734375,\n y: 0.203125,\n },\n {\n x: 0.734375,\n y: 0.203125,\n },\n {\n x: 0.765625,\n y: 0.203125,\n },\n {\n x: 0.765625,\n y: 0.203125,\n },\n {\n x: 0.796875,\n y: 0.203125,\n },\n {\n x: 0.796875,\n y: 0.203125,\n },\n {\n x: 0.828125,\n y: 0.203125,\n },\n {\n x: 0.828125,\n y: 0.203125,\n },\n {\n x: 0.859375,\n y: 0.203125,\n },\n {\n x: 0.859375,\n y: 0.203125,\n },\n {\n x: 0.890625,\n y: 0.203125,\n },\n {\n x: 0.890625,\n y: 0.203125,\n },\n {\n x: 0.921875,\n y: 0.203125,\n },\n {\n x: 0.921875,\n y: 0.203125,\n },\n {\n x: 0.953125,\n y: 0.203125,\n },\n {\n x: 0.953125,\n y: 0.203125,\n },\n {\n x: 0.984375,\n y: 0.203125,\n },\n {\n x: 0.984375,\n y: 0.203125,\n },\n {\n x: 0.015625,\n y: 0.234375,\n },\n {\n x: 0.015625,\n y: 0.234375,\n },\n {\n x: 0.046875,\n y: 0.234375,\n },\n {\n x: 0.046875,\n y: 0.234375,\n },\n {\n x: 0.078125,\n y: 0.234375,\n },\n {\n x: 0.078125,\n y: 0.234375,\n },\n {\n x: 0.109375,\n y: 0.234375,\n },\n {\n x: 0.109375,\n y: 0.234375,\n },\n {\n x: 0.140625,\n y: 0.234375,\n },\n {\n x: 0.140625,\n y: 0.234375,\n },\n {\n x: 0.171875,\n y: 0.234375,\n },\n {\n x: 0.171875,\n y: 0.234375,\n },\n {\n x: 0.203125,\n y: 0.234375,\n },\n {\n x: 0.203125,\n y: 0.234375,\n },\n {\n x: 0.234375,\n y: 0.234375,\n },\n {\n x: 0.234375,\n y: 0.234375,\n },\n {\n x: 0.265625,\n y: 0.234375,\n },\n {\n x: 0.265625,\n y: 0.234375,\n },\n {\n x: 0.296875,\n y: 0.234375,\n },\n {\n x: 0.296875,\n y: 0.234375,\n },\n {\n x: 0.328125,\n y: 0.234375,\n },\n {\n x: 0.328125,\n y: 0.234375,\n },\n {\n x: 0.359375,\n y: 0.234375,\n },\n {\n x: 0.359375,\n y: 0.234375,\n },\n {\n x: 0.390625,\n y: 0.234375,\n },\n {\n x: 0.390625,\n y: 0.234375,\n },\n {\n x: 0.421875,\n y: 0.234375,\n },\n {\n x: 0.421875,\n y: 0.234375,\n },\n {\n x: 0.453125,\n y: 0.234375,\n },\n {\n x: 0.453125,\n y: 0.234375,\n },\n {\n x: 0.484375,\n y: 0.234375,\n },\n {\n x: 0.484375,\n y: 0.234375,\n },\n {\n x: 0.515625,\n y: 0.234375,\n },\n {\n x: 0.515625,\n y: 0.234375,\n },\n {\n x: 0.546875,\n y: 0.234375,\n },\n {\n x: 0.546875,\n y: 0.234375,\n },\n {\n x: 0.578125,\n y: 0.234375,\n },\n {\n x: 0.578125,\n y: 0.234375,\n },\n {\n x: 0.609375,\n y: 0.234375,\n },\n {\n x: 0.609375,\n y: 0.234375,\n },\n {\n x: 0.640625,\n y: 0.234375,\n },\n {\n x: 0.640625,\n y: 0.234375,\n },\n {\n x: 0.671875,\n y: 0.234375,\n },\n {\n x: 0.671875,\n y: 0.234375,\n },\n {\n x: 0.703125,\n y: 0.234375,\n },\n {\n x: 0.703125,\n y: 0.234375,\n },\n {\n x: 0.734375,\n y: 0.234375,\n },\n {\n x: 0.734375,\n y: 0.234375,\n },\n {\n x: 0.765625,\n y: 0.234375,\n },\n {\n x: 0.765625,\n y: 0.234375,\n },\n {\n x: 0.796875,\n y: 0.234375,\n },\n {\n x: 0.796875,\n y: 0.234375,\n },\n {\n x: 0.828125,\n y: 0.234375,\n },\n {\n x: 0.828125,\n y: 0.234375,\n },\n {\n x: 0.859375,\n y: 0.234375,\n },\n {\n x: 0.859375,\n y: 0.234375,\n },\n {\n x: 0.890625,\n y: 0.234375,\n },\n {\n x: 0.890625,\n y: 0.234375,\n },\n {\n x: 0.921875,\n y: 0.234375,\n },\n {\n x: 0.921875,\n y: 0.234375,\n },\n {\n x: 0.953125,\n y: 0.234375,\n },\n {\n x: 0.953125,\n y: 0.234375,\n },\n {\n x: 0.984375,\n y: 0.234375,\n },\n {\n x: 0.984375,\n y: 0.234375,\n },\n {\n x: 0.015625,\n y: 0.265625,\n },\n {\n x: 0.015625,\n y: 0.265625,\n },\n {\n x: 0.046875,\n y: 0.265625,\n },\n {\n x: 0.046875,\n y: 0.265625,\n },\n {\n x: 0.078125,\n y: 0.265625,\n },\n {\n x: 0.078125,\n y: 0.265625,\n },\n {\n x: 0.109375,\n y: 0.265625,\n },\n {\n x: 0.109375,\n y: 0.265625,\n },\n {\n x: 0.140625,\n y: 0.265625,\n },\n {\n x: 0.140625,\n y: 0.265625,\n },\n {\n x: 0.171875,\n y: 0.265625,\n },\n {\n x: 0.171875,\n y: 0.265625,\n },\n {\n x: 0.203125,\n y: 0.265625,\n },\n {\n x: 0.203125,\n y: 0.265625,\n },\n {\n x: 0.234375,\n y: 0.265625,\n },\n {\n x: 0.234375,\n y: 0.265625,\n },\n {\n x: 0.265625,\n y: 0.265625,\n },\n {\n x: 0.265625,\n y: 0.265625,\n },\n {\n x: 0.296875,\n y: 0.265625,\n },\n {\n x: 0.296875,\n y: 0.265625,\n },\n {\n x: 0.328125,\n y: 0.265625,\n },\n {\n x: 0.328125,\n y: 0.265625,\n },\n {\n x: 0.359375,\n y: 0.265625,\n },\n {\n x: 0.359375,\n y: 0.265625,\n },\n {\n x: 0.390625,\n y: 0.265625,\n },\n {\n x: 0.390625,\n y: 0.265625,\n },\n {\n x: 0.421875,\n y: 0.265625,\n },\n {\n x: 0.421875,\n y: 0.265625,\n },\n {\n x: 0.453125,\n y: 0.265625,\n },\n {\n x: 0.453125,\n y: 0.265625,\n },\n {\n x: 0.484375,\n y: 0.265625,\n },\n {\n x: 0.484375,\n y: 0.265625,\n },\n {\n x: 0.515625,\n y: 0.265625,\n },\n {\n x: 0.515625,\n y: 0.265625,\n },\n {\n x: 0.546875,\n y: 0.265625,\n },\n {\n x: 0.546875,\n y: 0.265625,\n },\n {\n x: 0.578125,\n y: 0.265625,\n },\n {\n x: 0.578125,\n y: 0.265625,\n },\n {\n x: 0.609375,\n y: 0.265625,\n },\n {\n x: 0.609375,\n y: 0.265625,\n },\n {\n x: 0.640625,\n y: 0.265625,\n },\n {\n x: 0.640625,\n y: 0.265625,\n },\n {\n x: 0.671875,\n y: 0.265625,\n },\n {\n x: 0.671875,\n y: 0.265625,\n },\n {\n x: 0.703125,\n y: 0.265625,\n },\n {\n x: 0.703125,\n y: 0.265625,\n },\n {\n x: 0.734375,\n y: 0.265625,\n },\n {\n x: 0.734375,\n y: 0.265625,\n },\n {\n x: 0.765625,\n y: 0.265625,\n },\n {\n x: 0.765625,\n y: 0.265625,\n },\n {\n x: 0.796875,\n y: 0.265625,\n },\n {\n x: 0.796875,\n y: 0.265625,\n },\n {\n x: 0.828125,\n y: 0.265625,\n },\n {\n x: 0.828125,\n y: 0.265625,\n },\n {\n x: 0.859375,\n y: 0.265625,\n },\n {\n x: 0.859375,\n y: 0.265625,\n },\n {\n x: 0.890625,\n y: 0.265625,\n },\n {\n x: 0.890625,\n y: 0.265625,\n },\n {\n x: 0.921875,\n y: 0.265625,\n },\n {\n x: 0.921875,\n y: 0.265625,\n },\n {\n x: 0.953125,\n y: 0.265625,\n },\n {\n x: 0.953125,\n y: 0.265625,\n },\n {\n x: 0.984375,\n y: 0.265625,\n },\n {\n x: 0.984375,\n y: 0.265625,\n },\n {\n x: 0.015625,\n y: 0.296875,\n },\n {\n x: 0.015625,\n y: 0.296875,\n },\n {\n x: 0.046875,\n y: 0.296875,\n },\n {\n x: 0.046875,\n y: 0.296875,\n },\n {\n x: 0.078125,\n y: 0.296875,\n },\n {\n x: 0.078125,\n y: 0.296875,\n },\n {\n x: 0.109375,\n y: 0.296875,\n },\n {\n x: 0.109375,\n y: 0.296875,\n },\n {\n x: 0.140625,\n y: 0.296875,\n },\n {\n x: 0.140625,\n y: 0.296875,\n },\n {\n x: 0.171875,\n y: 0.296875,\n },\n {\n x: 0.171875,\n y: 0.296875,\n },\n {\n x: 0.203125,\n y: 0.296875,\n },\n {\n x: 0.203125,\n y: 0.296875,\n },\n {\n x: 0.234375,\n y: 0.296875,\n },\n {\n x: 0.234375,\n y: 0.296875,\n },\n {\n x: 0.265625,\n y: 0.296875,\n },\n {\n x: 0.265625,\n y: 0.296875,\n },\n {\n x: 0.296875,\n y: 0.296875,\n },\n {\n x: 0.296875,\n y: 0.296875,\n },\n {\n x: 0.328125,\n y: 0.296875,\n },\n {\n x: 0.328125,\n y: 0.296875,\n },\n {\n x: 0.359375,\n y: 0.296875,\n },\n {\n x: 0.359375,\n y: 0.296875,\n },\n {\n x: 0.390625,\n y: 0.296875,\n },\n {\n x: 0.390625,\n y: 0.296875,\n },\n {\n x: 0.421875,\n y: 0.296875,\n },\n {\n x: 0.421875,\n y: 0.296875,\n },\n {\n x: 0.453125,\n y: 0.296875,\n },\n {\n x: 0.453125,\n y: 0.296875,\n },\n {\n x: 0.484375,\n y: 0.296875,\n },\n {\n x: 0.484375,\n y: 0.296875,\n },\n {\n x: 0.515625,\n y: 0.296875,\n },\n {\n x: 0.515625,\n y: 0.296875,\n },\n {\n x: 0.546875,\n y: 0.296875,\n },\n {\n x: 0.546875,\n y: 0.296875,\n },\n {\n x: 0.578125,\n y: 0.296875,\n },\n {\n x: 0.578125,\n y: 0.296875,\n },\n {\n x: 0.609375,\n y: 0.296875,\n },\n {\n x: 0.609375,\n y: 0.296875,\n },\n {\n x: 0.640625,\n y: 0.296875,\n },\n {\n x: 0.640625,\n y: 0.296875,\n },\n {\n x: 0.671875,\n y: 0.296875,\n },\n {\n x: 0.671875,\n y: 0.296875,\n },\n {\n x: 0.703125,\n y: 0.296875,\n },\n {\n x: 0.703125,\n y: 0.296875,\n },\n {\n x: 0.734375,\n y: 0.296875,\n },\n {\n x: 0.734375,\n y: 0.296875,\n },\n {\n x: 0.765625,\n y: 0.296875,\n },\n {\n x: 0.765625,\n y: 0.296875,\n },\n {\n x: 0.796875,\n y: 0.296875,\n },\n {\n x: 0.796875,\n y: 0.296875,\n },\n {\n x: 0.828125,\n y: 0.296875,\n },\n {\n x: 0.828125,\n y: 0.296875,\n },\n {\n x: 0.859375,\n y: 0.296875,\n },\n {\n x: 0.859375,\n y: 0.296875,\n },\n {\n x: 0.890625,\n y: 0.296875,\n },\n {\n x: 0.890625,\n y: 0.296875,\n },\n {\n x: 0.921875,\n y: 0.296875,\n },\n {\n x: 0.921875,\n y: 0.296875,\n },\n {\n x: 0.953125,\n y: 0.296875,\n },\n {\n x: 0.953125,\n y: 0.296875,\n },\n {\n x: 0.984375,\n y: 0.296875,\n },\n {\n x: 0.984375,\n y: 0.296875,\n },\n {\n x: 0.015625,\n y: 0.328125,\n },\n {\n x: 0.015625,\n y: 0.328125,\n },\n {\n x: 0.046875,\n y: 0.328125,\n },\n {\n x: 0.046875,\n y: 0.328125,\n },\n {\n x: 0.078125,\n y: 0.328125,\n },\n {\n x: 0.078125,\n y: 0.328125,\n },\n {\n x: 0.109375,\n y: 0.328125,\n },\n {\n x: 0.109375,\n y: 0.328125,\n },\n {\n x: 0.140625,\n y: 0.328125,\n },\n {\n x: 0.140625,\n y: 0.328125,\n },\n {\n x: 0.171875,\n y: 0.328125,\n },\n {\n x: 0.171875,\n y: 0.328125,\n },\n {\n x: 0.203125,\n y: 0.328125,\n },\n {\n x: 0.203125,\n y: 0.328125,\n },\n {\n x: 0.234375,\n y: 0.328125,\n },\n {\n x: 0.234375,\n y: 0.328125,\n },\n {\n x: 0.265625,\n y: 0.328125,\n },\n {\n x: 0.265625,\n y: 0.328125,\n },\n {\n x: 0.296875,\n y: 0.328125,\n },\n {\n x: 0.296875,\n y: 0.328125,\n },\n {\n x: 0.328125,\n y: 0.328125,\n },\n {\n x: 0.328125,\n y: 0.328125,\n },\n {\n x: 0.359375,\n y: 0.328125,\n },\n {\n x: 0.359375,\n y: 0.328125,\n },\n {\n x: 0.390625,\n y: 0.328125,\n },\n {\n x: 0.390625,\n y: 0.328125,\n },\n {\n x: 0.421875,\n y: 0.328125,\n },\n {\n x: 0.421875,\n y: 0.328125,\n },\n {\n x: 0.453125,\n y: 0.328125,\n },\n {\n x: 0.453125,\n y: 0.328125,\n },\n {\n x: 0.484375,\n y: 0.328125,\n },\n {\n x: 0.484375,\n y: 0.328125,\n },\n {\n x: 0.515625,\n y: 0.328125,\n },\n {\n x: 0.515625,\n y: 0.328125,\n },\n {\n x: 0.546875,\n y: 0.328125,\n },\n {\n x: 0.546875,\n y: 0.328125,\n },\n {\n x: 0.578125,\n y: 0.328125,\n },\n {\n x: 0.578125,\n y: 0.328125,\n },\n {\n x: 0.609375,\n y: 0.328125,\n },\n {\n x: 0.609375,\n y: 0.328125,\n },\n {\n x: 0.640625,\n y: 0.328125,\n },\n {\n x: 0.640625,\n y: 0.328125,\n },\n {\n x: 0.671875,\n y: 0.328125,\n },\n {\n x: 0.671875,\n y: 0.328125,\n },\n {\n x: 0.703125,\n y: 0.328125,\n },\n {\n x: 0.703125,\n y: 0.328125,\n },\n {\n x: 0.734375,\n y: 0.328125,\n },\n {\n x: 0.734375,\n y: 0.328125,\n },\n {\n x: 0.765625,\n y: 0.328125,\n },\n {\n x: 0.765625,\n y: 0.328125,\n },\n {\n x: 0.796875,\n y: 0.328125,\n },\n {\n x: 0.796875,\n y: 0.328125,\n },\n {\n x: 0.828125,\n y: 0.328125,\n },\n {\n x: 0.828125,\n y: 0.328125,\n },\n {\n x: 0.859375,\n y: 0.328125,\n },\n {\n x: 0.859375,\n y: 0.328125,\n },\n {\n x: 0.890625,\n y: 0.328125,\n },\n {\n x: 0.890625,\n y: 0.328125,\n },\n {\n x: 0.921875,\n y: 0.328125,\n },\n {\n x: 0.921875,\n y: 0.328125,\n },\n {\n x: 0.953125,\n y: 0.328125,\n },\n {\n x: 0.953125,\n y: 0.328125,\n },\n {\n x: 0.984375,\n y: 0.328125,\n },\n {\n x: 0.984375,\n y: 0.328125,\n },\n {\n x: 0.015625,\n y: 0.359375,\n },\n {\n x: 0.015625,\n y: 0.359375,\n },\n {\n x: 0.046875,\n y: 0.359375,\n },\n {\n x: 0.046875,\n y: 0.359375,\n },\n {\n x: 0.078125,\n y: 0.359375,\n },\n {\n x: 0.078125,\n y: 0.359375,\n },\n {\n x: 0.109375,\n y: 0.359375,\n },\n {\n x: 0.109375,\n y: 0.359375,\n },\n {\n x: 0.140625,\n y: 0.359375,\n },\n {\n x: 0.140625,\n y: 0.359375,\n },\n {\n x: 0.171875,\n y: 0.359375,\n },\n {\n x: 0.171875,\n y: 0.359375,\n },\n {\n x: 0.203125,\n y: 0.359375,\n },\n {\n x: 0.203125,\n y: 0.359375,\n },\n {\n x: 0.234375,\n y: 0.359375,\n },\n {\n x: 0.234375,\n y: 0.359375,\n },\n {\n x: 0.265625,\n y: 0.359375,\n },\n {\n x: 0.265625,\n y: 0.359375,\n },\n {\n x: 0.296875,\n y: 0.359375,\n },\n {\n x: 0.296875,\n y: 0.359375,\n },\n {\n x: 0.328125,\n y: 0.359375,\n },\n {\n x: 0.328125,\n y: 0.359375,\n },\n {\n x: 0.359375,\n y: 0.359375,\n },\n {\n x: 0.359375,\n y: 0.359375,\n },\n {\n x: 0.390625,\n y: 0.359375,\n },\n {\n x: 0.390625,\n y: 0.359375,\n },\n {\n x: 0.421875,\n y: 0.359375,\n },\n {\n x: 0.421875,\n y: 0.359375,\n },\n {\n x: 0.453125,\n y: 0.359375,\n },\n {\n x: 0.453125,\n y: 0.359375,\n },\n {\n x: 0.484375,\n y: 0.359375,\n },\n {\n x: 0.484375,\n y: 0.359375,\n },\n {\n x: 0.515625,\n y: 0.359375,\n },\n {\n x: 0.515625,\n y: 0.359375,\n },\n {\n x: 0.546875,\n y: 0.359375,\n },\n {\n x: 0.546875,\n y: 0.359375,\n },\n {\n x: 0.578125,\n y: 0.359375,\n },\n {\n x: 0.578125,\n y: 0.359375,\n },\n {\n x: 0.609375,\n y: 0.359375,\n },\n {\n x: 0.609375,\n y: 0.359375,\n },\n {\n x: 0.640625,\n y: 0.359375,\n },\n {\n x: 0.640625,\n y: 0.359375,\n },\n {\n x: 0.671875,\n y: 0.359375,\n },\n {\n x: 0.671875,\n y: 0.359375,\n },\n {\n x: 0.703125,\n y: 0.359375,\n },\n {\n x: 0.703125,\n y: 0.359375,\n },\n {\n x: 0.734375,\n y: 0.359375,\n },\n {\n x: 0.734375,\n y: 0.359375,\n },\n {\n x: 0.765625,\n y: 0.359375,\n },\n {\n x: 0.765625,\n y: 0.359375,\n },\n {\n x: 0.796875,\n y: 0.359375,\n },\n {\n x: 0.796875,\n y: 0.359375,\n },\n {\n x: 0.828125,\n y: 0.359375,\n },\n {\n x: 0.828125,\n y: 0.359375,\n },\n {\n x: 0.859375,\n y: 0.359375,\n },\n {\n x: 0.859375,\n y: 0.359375,\n },\n {\n x: 0.890625,\n y: 0.359375,\n },\n {\n x: 0.890625,\n y: 0.359375,\n },\n {\n x: 0.921875,\n y: 0.359375,\n },\n {\n x: 0.921875,\n y: 0.359375,\n },\n {\n x: 0.953125,\n y: 0.359375,\n },\n {\n x: 0.953125,\n y: 0.359375,\n },\n {\n x: 0.984375,\n y: 0.359375,\n },\n {\n x: 0.984375,\n y: 0.359375,\n },\n {\n x: 0.015625,\n y: 0.390625,\n },\n {\n x: 0.015625,\n y: 0.390625,\n },\n {\n x: 0.046875,\n y: 0.390625,\n },\n {\n x: 0.046875,\n y: 0.390625,\n },\n {\n x: 0.078125,\n y: 0.390625,\n },\n {\n x: 0.078125,\n y: 0.390625,\n },\n {\n x: 0.109375,\n y: 0.390625,\n },\n {\n x: 0.109375,\n y: 0.390625,\n },\n {\n x: 0.140625,\n y: 0.390625,\n },\n {\n x: 0.140625,\n y: 0.390625,\n },\n {\n x: 0.171875,\n y: 0.390625,\n },\n {\n x: 0.171875,\n y: 0.390625,\n },\n {\n x: 0.203125,\n y: 0.390625,\n },\n {\n x: 0.203125,\n y: 0.390625,\n },\n {\n x: 0.234375,\n y: 0.390625,\n },\n {\n x: 0.234375,\n y: 0.390625,\n },\n {\n x: 0.265625,\n y: 0.390625,\n },\n {\n x: 0.265625,\n y: 0.390625,\n },\n {\n x: 0.296875,\n y: 0.390625,\n },\n {\n x: 0.296875,\n y: 0.390625,\n },\n {\n x: 0.328125,\n y: 0.390625,\n },\n {\n x: 0.328125,\n y: 0.390625,\n },\n {\n x: 0.359375,\n y: 0.390625,\n },\n {\n x: 0.359375,\n y: 0.390625,\n },\n {\n x: 0.390625,\n y: 0.390625,\n },\n {\n x: 0.390625,\n y: 0.390625,\n },\n {\n x: 0.421875,\n y: 0.390625,\n },\n {\n x: 0.421875,\n y: 0.390625,\n },\n {\n x: 0.453125,\n y: 0.390625,\n },\n {\n x: 0.453125,\n y: 0.390625,\n },\n {\n x: 0.484375,\n y: 0.390625,\n },\n {\n x: 0.484375,\n y: 0.390625,\n },\n {\n x: 0.515625,\n y: 0.390625,\n },\n {\n x: 0.515625,\n y: 0.390625,\n },\n {\n x: 0.546875,\n y: 0.390625,\n },\n {\n x: 0.546875,\n y: 0.390625,\n },\n {\n x: 0.578125,\n y: 0.390625,\n },\n {\n x: 0.578125,\n y: 0.390625,\n },\n {\n x: 0.609375,\n y: 0.390625,\n },\n {\n x: 0.609375,\n y: 0.390625,\n },\n {\n x: 0.640625,\n y: 0.390625,\n },\n {\n x: 0.640625,\n y: 0.390625,\n },\n {\n x: 0.671875,\n y: 0.390625,\n },\n {\n x: 0.671875,\n y: 0.390625,\n },\n {\n x: 0.703125,\n y: 0.390625,\n },\n {\n x: 0.703125,\n y: 0.390625,\n },\n {\n x: 0.734375,\n y: 0.390625,\n },\n {\n x: 0.734375,\n y: 0.390625,\n },\n {\n x: 0.765625,\n y: 0.390625,\n },\n {\n x: 0.765625,\n y: 0.390625,\n },\n {\n x: 0.796875,\n y: 0.390625,\n },\n {\n x: 0.796875,\n y: 0.390625,\n },\n {\n x: 0.828125,\n y: 0.390625,\n },\n {\n x: 0.828125,\n y: 0.390625,\n },\n {\n x: 0.859375,\n y: 0.390625,\n },\n {\n x: 0.859375,\n y: 0.390625,\n },\n {\n x: 0.890625,\n y: 0.390625,\n },\n {\n x: 0.890625,\n y: 0.390625,\n },\n {\n x: 0.921875,\n y: 0.390625,\n },\n {\n x: 0.921875,\n y: 0.390625,\n },\n {\n x: 0.953125,\n y: 0.390625,\n },\n {\n x: 0.953125,\n y: 0.390625,\n },\n {\n x: 0.984375,\n y: 0.390625,\n },\n {\n x: 0.984375,\n y: 0.390625,\n },\n {\n x: 0.015625,\n y: 0.421875,\n },\n {\n x: 0.015625,\n y: 0.421875,\n },\n {\n x: 0.046875,\n y: 0.421875,\n },\n {\n x: 0.046875,\n y: 0.421875,\n },\n {\n x: 0.078125,\n y: 0.421875,\n },\n {\n x: 0.078125,\n y: 0.421875,\n },\n {\n x: 0.109375,\n y: 0.421875,\n },\n {\n x: 0.109375,\n y: 0.421875,\n },\n {\n x: 0.140625,\n y: 0.421875,\n },\n {\n x: 0.140625,\n y: 0.421875,\n },\n {\n x: 0.171875,\n y: 0.421875,\n },\n {\n x: 0.171875,\n y: 0.421875,\n },\n {\n x: 0.203125,\n y: 0.421875,\n },\n {\n x: 0.203125,\n y: 0.421875,\n },\n {\n x: 0.234375,\n y: 0.421875,\n },\n {\n x: 0.234375,\n y: 0.421875,\n },\n {\n x: 0.265625,\n y: 0.421875,\n },\n {\n x: 0.265625,\n y: 0.421875,\n },\n {\n x: 0.296875,\n y: 0.421875,\n },\n {\n x: 0.296875,\n y: 0.421875,\n },\n {\n x: 0.328125,\n y: 0.421875,\n },\n {\n x: 0.328125,\n y: 0.421875,\n },\n {\n x: 0.359375,\n y: 0.421875,\n },\n {\n x: 0.359375,\n y: 0.421875,\n },\n {\n x: 0.390625,\n y: 0.421875,\n },\n {\n x: 0.390625,\n y: 0.421875,\n },\n {\n x: 0.421875,\n y: 0.421875,\n },\n {\n x: 0.421875,\n y: 0.421875,\n },\n {\n x: 0.453125,\n y: 0.421875,\n },\n {\n x: 0.453125,\n y: 0.421875,\n },\n {\n x: 0.484375,\n y: 0.421875,\n },\n {\n x: 0.484375,\n y: 0.421875,\n },\n {\n x: 0.515625,\n y: 0.421875,\n },\n {\n x: 0.515625,\n y: 0.421875,\n },\n {\n x: 0.546875,\n y: 0.421875,\n },\n {\n x: 0.546875,\n y: 0.421875,\n },\n {\n x: 0.578125,\n y: 0.421875,\n },\n {\n x: 0.578125,\n y: 0.421875,\n },\n {\n x: 0.609375,\n y: 0.421875,\n },\n {\n x: 0.609375,\n y: 0.421875,\n },\n {\n x: 0.640625,\n y: 0.421875,\n },\n {\n x: 0.640625,\n y: 0.421875,\n },\n {\n x: 0.671875,\n y: 0.421875,\n },\n {\n x: 0.671875,\n y: 0.421875,\n },\n {\n x: 0.703125,\n y: 0.421875,\n },\n {\n x: 0.703125,\n y: 0.421875,\n },\n {\n x: 0.734375,\n y: 0.421875,\n },\n {\n x: 0.734375,\n y: 0.421875,\n },\n {\n x: 0.765625,\n y: 0.421875,\n },\n {\n x: 0.765625,\n y: 0.421875,\n },\n {\n x: 0.796875,\n y: 0.421875,\n },\n {\n x: 0.796875,\n y: 0.421875,\n },\n {\n x: 0.828125,\n y: 0.421875,\n },\n {\n x: 0.828125,\n y: 0.421875,\n },\n {\n x: 0.859375,\n y: 0.421875,\n },\n {\n x: 0.859375,\n y: 0.421875,\n },\n {\n x: 0.890625,\n y: 0.421875,\n },\n {\n x: 0.890625,\n y: 0.421875,\n },\n {\n x: 0.921875,\n y: 0.421875,\n },\n {\n x: 0.921875,\n y: 0.421875,\n },\n {\n x: 0.953125,\n y: 0.421875,\n },\n {\n x: 0.953125,\n y: 0.421875,\n },\n {\n x: 0.984375,\n y: 0.421875,\n },\n {\n x: 0.984375,\n y: 0.421875,\n },\n {\n x: 0.015625,\n y: 0.453125,\n },\n {\n x: 0.015625,\n y: 0.453125,\n },\n {\n x: 0.046875,\n y: 0.453125,\n },\n {\n x: 0.046875,\n y: 0.453125,\n },\n {\n x: 0.078125,\n y: 0.453125,\n },\n {\n x: 0.078125,\n y: 0.453125,\n },\n {\n x: 0.109375,\n y: 0.453125,\n },\n {\n x: 0.109375,\n y: 0.453125,\n },\n {\n x: 0.140625,\n y: 0.453125,\n },\n {\n x: 0.140625,\n y: 0.453125,\n },\n {\n x: 0.171875,\n y: 0.453125,\n },\n {\n x: 0.171875,\n y: 0.453125,\n },\n {\n x: 0.203125,\n y: 0.453125,\n },\n {\n x: 0.203125,\n y: 0.453125,\n },\n {\n x: 0.234375,\n y: 0.453125,\n },\n {\n x: 0.234375,\n y: 0.453125,\n },\n {\n x: 0.265625,\n y: 0.453125,\n },\n {\n x: 0.265625,\n y: 0.453125,\n },\n {\n x: 0.296875,\n y: 0.453125,\n },\n {\n x: 0.296875,\n y: 0.453125,\n },\n {\n x: 0.328125,\n y: 0.453125,\n },\n {\n x: 0.328125,\n y: 0.453125,\n },\n {\n x: 0.359375,\n y: 0.453125,\n },\n {\n x: 0.359375,\n y: 0.453125,\n },\n {\n x: 0.390625,\n y: 0.453125,\n },\n {\n x: 0.390625,\n y: 0.453125,\n },\n {\n x: 0.421875,\n y: 0.453125,\n },\n {\n x: 0.421875,\n y: 0.453125,\n },\n {\n x: 0.453125,\n y: 0.453125,\n },\n {\n x: 0.453125,\n y: 0.453125,\n },\n {\n x: 0.484375,\n y: 0.453125,\n },\n {\n x: 0.484375,\n y: 0.453125,\n },\n {\n x: 0.515625,\n y: 0.453125,\n },\n {\n x: 0.515625,\n y: 0.453125,\n },\n {\n x: 0.546875,\n y: 0.453125,\n },\n {\n x: 0.546875,\n y: 0.453125,\n },\n {\n x: 0.578125,\n y: 0.453125,\n },\n {\n x: 0.578125,\n y: 0.453125,\n },\n {\n x: 0.609375,\n y: 0.453125,\n },\n {\n x: 0.609375,\n y: 0.453125,\n },\n {\n x: 0.640625,\n y: 0.453125,\n },\n {\n x: 0.640625,\n y: 0.453125,\n },\n {\n x: 0.671875,\n y: 0.453125,\n },\n {\n x: 0.671875,\n y: 0.453125,\n },\n {\n x: 0.703125,\n y: 0.453125,\n },\n {\n x: 0.703125,\n y: 0.453125,\n },\n {\n x: 0.734375,\n y: 0.453125,\n },\n {\n x: 0.734375,\n y: 0.453125,\n },\n {\n x: 0.765625,\n y: 0.453125,\n },\n {\n x: 0.765625,\n y: 0.453125,\n },\n {\n x: 0.796875,\n y: 0.453125,\n },\n {\n x: 0.796875,\n y: 0.453125,\n },\n {\n x: 0.828125,\n y: 0.453125,\n },\n {\n x: 0.828125,\n y: 0.453125,\n },\n {\n x: 0.859375,\n y: 0.453125,\n },\n {\n x: 0.859375,\n y: 0.453125,\n },\n {\n x: 0.890625,\n y: 0.453125,\n },\n {\n x: 0.890625,\n y: 0.453125,\n },\n {\n x: 0.921875,\n y: 0.453125,\n },\n {\n x: 0.921875,\n y: 0.453125,\n },\n {\n x: 0.953125,\n y: 0.453125,\n },\n {\n x: 0.953125,\n y: 0.453125,\n },\n {\n x: 0.984375,\n y: 0.453125,\n },\n {\n x: 0.984375,\n y: 0.453125,\n },\n {\n x: 0.015625,\n y: 0.484375,\n },\n {\n x: 0.015625,\n y: 0.484375,\n },\n {\n x: 0.046875,\n y: 0.484375,\n },\n {\n x: 0.046875,\n y: 0.484375,\n },\n {\n x: 0.078125,\n y: 0.484375,\n },\n {\n x: 0.078125,\n y: 0.484375,\n },\n {\n x: 0.109375,\n y: 0.484375,\n },\n {\n x: 0.109375,\n y: 0.484375,\n },\n {\n x: 0.140625,\n y: 0.484375,\n },\n {\n x: 0.140625,\n y: 0.484375,\n },\n {\n x: 0.171875,\n y: 0.484375,\n },\n {\n x: 0.171875,\n y: 0.484375,\n },\n {\n x: 0.203125,\n y: 0.484375,\n },\n {\n x: 0.203125,\n y: 0.484375,\n },\n {\n x: 0.234375,\n y: 0.484375,\n },\n {\n x: 0.234375,\n y: 0.484375,\n },\n {\n x: 0.265625,\n y: 0.484375,\n },\n {\n x: 0.265625,\n y: 0.484375,\n },\n {\n x: 0.296875,\n y: 0.484375,\n },\n {\n x: 0.296875,\n y: 0.484375,\n },\n {\n x: 0.328125,\n y: 0.484375,\n },\n {\n x: 0.328125,\n y: 0.484375,\n },\n {\n x: 0.359375,\n y: 0.484375,\n },\n {\n x: 0.359375,\n y: 0.484375,\n },\n {\n x: 0.390625,\n y: 0.484375,\n },\n {\n x: 0.390625,\n y: 0.484375,\n },\n {\n x: 0.421875,\n y: 0.484375,\n },\n {\n x: 0.421875,\n y: 0.484375,\n },\n {\n x: 0.453125,\n y: 0.484375,\n },\n {\n x: 0.453125,\n y: 0.484375,\n },\n {\n x: 0.484375,\n y: 0.484375,\n },\n {\n x: 0.484375,\n y: 0.484375,\n },\n {\n x: 0.515625,\n y: 0.484375,\n },\n {\n x: 0.515625,\n y: 0.484375,\n },\n {\n x: 0.546875,\n y: 0.484375,\n },\n {\n x: 0.546875,\n y: 0.484375,\n },\n {\n x: 0.578125,\n y: 0.484375,\n },\n {\n x: 0.578125,\n y: 0.484375,\n },\n {\n x: 0.609375,\n y: 0.484375,\n },\n {\n x: 0.609375,\n y: 0.484375,\n },\n {\n x: 0.640625,\n y: 0.484375,\n },\n {\n x: 0.640625,\n y: 0.484375,\n },\n {\n x: 0.671875,\n y: 0.484375,\n },\n {\n x: 0.671875,\n y: 0.484375,\n },\n {\n x: 0.703125,\n y: 0.484375,\n },\n {\n x: 0.703125,\n y: 0.484375,\n },\n {\n x: 0.734375,\n y: 0.484375,\n },\n {\n x: 0.734375,\n y: 0.484375,\n },\n {\n x: 0.765625,\n y: 0.484375,\n },\n {\n x: 0.765625,\n y: 0.484375,\n },\n {\n x: 0.796875,\n y: 0.484375,\n },\n {\n x: 0.796875,\n y: 0.484375,\n },\n {\n x: 0.828125,\n y: 0.484375,\n },\n {\n x: 0.828125,\n y: 0.484375,\n },\n {\n x: 0.859375,\n y: 0.484375,\n },\n {\n x: 0.859375,\n y: 0.484375,\n },\n {\n x: 0.890625,\n y: 0.484375,\n },\n {\n x: 0.890625,\n y: 0.484375,\n },\n {\n x: 0.921875,\n y: 0.484375,\n },\n {\n x: 0.921875,\n y: 0.484375,\n },\n {\n x: 0.953125,\n y: 0.484375,\n },\n {\n x: 0.953125,\n y: 0.484375,\n },\n {\n x: 0.984375,\n y: 0.484375,\n },\n {\n x: 0.984375,\n y: 0.484375,\n },\n {\n x: 0.015625,\n y: 0.515625,\n },\n {\n x: 0.015625,\n y: 0.515625,\n },\n {\n x: 0.046875,\n y: 0.515625,\n },\n {\n x: 0.046875,\n y: 0.515625,\n },\n {\n x: 0.078125,\n y: 0.515625,\n },\n {\n x: 0.078125,\n y: 0.515625,\n },\n {\n x: 0.109375,\n y: 0.515625,\n },\n {\n x: 0.109375,\n y: 0.515625,\n },\n {\n x: 0.140625,\n y: 0.515625,\n },\n {\n x: 0.140625,\n y: 0.515625,\n },\n {\n x: 0.171875,\n y: 0.515625,\n },\n {\n x: 0.171875,\n y: 0.515625,\n },\n {\n x: 0.203125,\n y: 0.515625,\n },\n {\n x: 0.203125,\n y: 0.515625,\n },\n {\n x: 0.234375,\n y: 0.515625,\n },\n {\n x: 0.234375,\n y: 0.515625,\n },\n {\n x: 0.265625,\n y: 0.515625,\n },\n {\n x: 0.265625,\n y: 0.515625,\n },\n {\n x: 0.296875,\n y: 0.515625,\n },\n {\n x: 0.296875,\n y: 0.515625,\n },\n {\n x: 0.328125,\n y: 0.515625,\n },\n {\n x: 0.328125,\n y: 0.515625,\n },\n {\n x: 0.359375,\n y: 0.515625,\n },\n {\n x: 0.359375,\n y: 0.515625,\n },\n {\n x: 0.390625,\n y: 0.515625,\n },\n {\n x: 0.390625,\n y: 0.515625,\n },\n {\n x: 0.421875,\n y: 0.515625,\n },\n {\n x: 0.421875,\n y: 0.515625,\n },\n {\n x: 0.453125,\n y: 0.515625,\n },\n {\n x: 0.453125,\n y: 0.515625,\n },\n {\n x: 0.484375,\n y: 0.515625,\n },\n {\n x: 0.484375,\n y: 0.515625,\n },\n {\n x: 0.515625,\n y: 0.515625,\n },\n {\n x: 0.515625,\n y: 0.515625,\n },\n {\n x: 0.546875,\n y: 0.515625,\n },\n {\n x: 0.546875,\n y: 0.515625,\n },\n {\n x: 0.578125,\n y: 0.515625,\n },\n {\n x: 0.578125,\n y: 0.515625,\n },\n {\n x: 0.609375,\n y: 0.515625,\n },\n {\n x: 0.609375,\n y: 0.515625,\n },\n {\n x: 0.640625,\n y: 0.515625,\n },\n {\n x: 0.640625,\n y: 0.515625,\n },\n {\n x: 0.671875,\n y: 0.515625,\n },\n {\n x: 0.671875,\n y: 0.515625,\n },\n {\n x: 0.703125,\n y: 0.515625,\n },\n {\n x: 0.703125,\n y: 0.515625,\n },\n {\n x: 0.734375,\n y: 0.515625,\n },\n {\n x: 0.734375,\n y: 0.515625,\n },\n {\n x: 0.765625,\n y: 0.515625,\n },\n {\n x: 0.765625,\n y: 0.515625,\n },\n {\n x: 0.796875,\n y: 0.515625,\n },\n {\n x: 0.796875,\n y: 0.515625,\n },\n {\n x: 0.828125,\n y: 0.515625,\n },\n {\n x: 0.828125,\n y: 0.515625,\n },\n {\n x: 0.859375,\n y: 0.515625,\n },\n {\n x: 0.859375,\n y: 0.515625,\n },\n {\n x: 0.890625,\n y: 0.515625,\n },\n {\n x: 0.890625,\n y: 0.515625,\n },\n {\n x: 0.921875,\n y: 0.515625,\n },\n {\n x: 0.921875,\n y: 0.515625,\n },\n {\n x: 0.953125,\n y: 0.515625,\n },\n {\n x: 0.953125,\n y: 0.515625,\n },\n {\n x: 0.984375,\n y: 0.515625,\n },\n {\n x: 0.984375,\n y: 0.515625,\n },\n {\n x: 0.015625,\n y: 0.546875,\n },\n {\n x: 0.015625,\n y: 0.546875,\n },\n {\n x: 0.046875,\n y: 0.546875,\n },\n {\n x: 0.046875,\n y: 0.546875,\n },\n {\n x: 0.078125,\n y: 0.546875,\n },\n {\n x: 0.078125,\n y: 0.546875,\n },\n {\n x: 0.109375,\n y: 0.546875,\n },\n {\n x: 0.109375,\n y: 0.546875,\n },\n {\n x: 0.140625,\n y: 0.546875,\n },\n {\n x: 0.140625,\n y: 0.546875,\n },\n {\n x: 0.171875,\n y: 0.546875,\n },\n {\n x: 0.171875,\n y: 0.546875,\n },\n {\n x: 0.203125,\n y: 0.546875,\n },\n {\n x: 0.203125,\n y: 0.546875,\n },\n {\n x: 0.234375,\n y: 0.546875,\n },\n {\n x: 0.234375,\n y: 0.546875,\n },\n {\n x: 0.265625,\n y: 0.546875,\n },\n {\n x: 0.265625,\n y: 0.546875,\n },\n {\n x: 0.296875,\n y: 0.546875,\n },\n {\n x: 0.296875,\n y: 0.546875,\n },\n {\n x: 0.328125,\n y: 0.546875,\n },\n {\n x: 0.328125,\n y: 0.546875,\n },\n {\n x: 0.359375,\n y: 0.546875,\n },\n {\n x: 0.359375,\n y: 0.546875,\n },\n {\n x: 0.390625,\n y: 0.546875,\n },\n {\n x: 0.390625,\n y: 0.546875,\n },\n {\n x: 0.421875,\n y: 0.546875,\n },\n {\n x: 0.421875,\n y: 0.546875,\n },\n {\n x: 0.453125,\n y: 0.546875,\n },\n {\n x: 0.453125,\n y: 0.546875,\n },\n {\n x: 0.484375,\n y: 0.546875,\n },\n {\n x: 0.484375,\n y: 0.546875,\n },\n {\n x: 0.515625,\n y: 0.546875,\n },\n {\n x: 0.515625,\n y: 0.546875,\n },\n {\n x: 0.546875,\n y: 0.546875,\n },\n {\n x: 0.546875,\n y: 0.546875,\n },\n {\n x: 0.578125,\n y: 0.546875,\n },\n {\n x: 0.578125,\n y: 0.546875,\n },\n {\n x: 0.609375,\n y: 0.546875,\n },\n {\n x: 0.609375,\n y: 0.546875,\n },\n {\n x: 0.640625,\n y: 0.546875,\n },\n {\n x: 0.640625,\n y: 0.546875,\n },\n {\n x: 0.671875,\n y: 0.546875,\n },\n {\n x: 0.671875,\n y: 0.546875,\n },\n {\n x: 0.703125,\n y: 0.546875,\n },\n {\n x: 0.703125,\n y: 0.546875,\n },\n {\n x: 0.734375,\n y: 0.546875,\n },\n {\n x: 0.734375,\n y: 0.546875,\n },\n {\n x: 0.765625,\n y: 0.546875,\n },\n {\n x: 0.765625,\n y: 0.546875,\n },\n {\n x: 0.796875,\n y: 0.546875,\n },\n {\n x: 0.796875,\n y: 0.546875,\n },\n {\n x: 0.828125,\n y: 0.546875,\n },\n {\n x: 0.828125,\n y: 0.546875,\n },\n {\n x: 0.859375,\n y: 0.546875,\n },\n {\n x: 0.859375,\n y: 0.546875,\n },\n {\n x: 0.890625,\n y: 0.546875,\n },\n {\n x: 0.890625,\n y: 0.546875,\n },\n {\n x: 0.921875,\n y: 0.546875,\n },\n {\n x: 0.921875,\n y: 0.546875,\n },\n {\n x: 0.953125,\n y: 0.546875,\n },\n {\n x: 0.953125,\n y: 0.546875,\n },\n {\n x: 0.984375,\n y: 0.546875,\n },\n {\n x: 0.984375,\n y: 0.546875,\n },\n {\n x: 0.015625,\n y: 0.578125,\n },\n {\n x: 0.015625,\n y: 0.578125,\n },\n {\n x: 0.046875,\n y: 0.578125,\n },\n {\n x: 0.046875,\n y: 0.578125,\n },\n {\n x: 0.078125,\n y: 0.578125,\n },\n {\n x: 0.078125,\n y: 0.578125,\n },\n {\n x: 0.109375,\n y: 0.578125,\n },\n {\n x: 0.109375,\n y: 0.578125,\n },\n {\n x: 0.140625,\n y: 0.578125,\n },\n {\n x: 0.140625,\n y: 0.578125,\n },\n {\n x: 0.171875,\n y: 0.578125,\n },\n {\n x: 0.171875,\n y: 0.578125,\n },\n {\n x: 0.203125,\n y: 0.578125,\n },\n {\n x: 0.203125,\n y: 0.578125,\n },\n {\n x: 0.234375,\n y: 0.578125,\n },\n {\n x: 0.234375,\n y: 0.578125,\n },\n {\n x: 0.265625,\n y: 0.578125,\n },\n {\n x: 0.265625,\n y: 0.578125,\n },\n {\n x: 0.296875,\n y: 0.578125,\n },\n {\n x: 0.296875,\n y: 0.578125,\n },\n {\n x: 0.328125,\n y: 0.578125,\n },\n {\n x: 0.328125,\n y: 0.578125,\n },\n {\n x: 0.359375,\n y: 0.578125,\n },\n {\n x: 0.359375,\n y: 0.578125,\n },\n {\n x: 0.390625,\n y: 0.578125,\n },\n {\n x: 0.390625,\n y: 0.578125,\n },\n {\n x: 0.421875,\n y: 0.578125,\n },\n {\n x: 0.421875,\n y: 0.578125,\n },\n {\n x: 0.453125,\n y: 0.578125,\n },\n {\n x: 0.453125,\n y: 0.578125,\n },\n {\n x: 0.484375,\n y: 0.578125,\n },\n {\n x: 0.484375,\n y: 0.578125,\n },\n {\n x: 0.515625,\n y: 0.578125,\n },\n {\n x: 0.515625,\n y: 0.578125,\n },\n {\n x: 0.546875,\n y: 0.578125,\n },\n {\n x: 0.546875,\n y: 0.578125,\n },\n {\n x: 0.578125,\n y: 0.578125,\n },\n {\n x: 0.578125,\n y: 0.578125,\n },\n {\n x: 0.609375,\n y: 0.578125,\n },\n {\n x: 0.609375,\n y: 0.578125,\n },\n {\n x: 0.640625,\n y: 0.578125,\n },\n {\n x: 0.640625,\n y: 0.578125,\n },\n {\n x: 0.671875,\n y: 0.578125,\n },\n {\n x: 0.671875,\n y: 0.578125,\n },\n {\n x: 0.703125,\n y: 0.578125,\n },\n {\n x: 0.703125,\n y: 0.578125,\n },\n {\n x: 0.734375,\n y: 0.578125,\n },\n {\n x: 0.734375,\n y: 0.578125,\n },\n {\n x: 0.765625,\n y: 0.578125,\n },\n {\n x: 0.765625,\n y: 0.578125,\n },\n {\n x: 0.796875,\n y: 0.578125,\n },\n {\n x: 0.796875,\n y: 0.578125,\n },\n {\n x: 0.828125,\n y: 0.578125,\n },\n {\n x: 0.828125,\n y: 0.578125,\n },\n {\n x: 0.859375,\n y: 0.578125,\n },\n {\n x: 0.859375,\n y: 0.578125,\n },\n {\n x: 0.890625,\n y: 0.578125,\n },\n {\n x: 0.890625,\n y: 0.578125,\n },\n {\n x: 0.921875,\n y: 0.578125,\n },\n {\n x: 0.921875,\n y: 0.578125,\n },\n {\n x: 0.953125,\n y: 0.578125,\n },\n {\n x: 0.953125,\n y: 0.578125,\n },\n {\n x: 0.984375,\n y: 0.578125,\n },\n {\n x: 0.984375,\n y: 0.578125,\n },\n {\n x: 0.015625,\n y: 0.609375,\n },\n {\n x: 0.015625,\n y: 0.609375,\n },\n {\n x: 0.046875,\n y: 0.609375,\n },\n {\n x: 0.046875,\n y: 0.609375,\n },\n {\n x: 0.078125,\n y: 0.609375,\n },\n {\n x: 0.078125,\n y: 0.609375,\n },\n {\n x: 0.109375,\n y: 0.609375,\n },\n {\n x: 0.109375,\n y: 0.609375,\n },\n {\n x: 0.140625,\n y: 0.609375,\n },\n {\n x: 0.140625,\n y: 0.609375,\n },\n {\n x: 0.171875,\n y: 0.609375,\n },\n {\n x: 0.171875,\n y: 0.609375,\n },\n {\n x: 0.203125,\n y: 0.609375,\n },\n {\n x: 0.203125,\n y: 0.609375,\n },\n {\n x: 0.234375,\n y: 0.609375,\n },\n {\n x: 0.234375,\n y: 0.609375,\n },\n {\n x: 0.265625,\n y: 0.609375,\n },\n {\n x: 0.265625,\n y: 0.609375,\n },\n {\n x: 0.296875,\n y: 0.609375,\n },\n {\n x: 0.296875,\n y: 0.609375,\n },\n {\n x: 0.328125,\n y: 0.609375,\n },\n {\n x: 0.328125,\n y: 0.609375,\n },\n {\n x: 0.359375,\n y: 0.609375,\n },\n {\n x: 0.359375,\n y: 0.609375,\n },\n {\n x: 0.390625,\n y: 0.609375,\n },\n {\n x: 0.390625,\n y: 0.609375,\n },\n {\n x: 0.421875,\n y: 0.609375,\n },\n {\n x: 0.421875,\n y: 0.609375,\n },\n {\n x: 0.453125,\n y: 0.609375,\n },\n {\n x: 0.453125,\n y: 0.609375,\n },\n {\n x: 0.484375,\n y: 0.609375,\n },\n {\n x: 0.484375,\n y: 0.609375,\n },\n {\n x: 0.515625,\n y: 0.609375,\n },\n {\n x: 0.515625,\n y: 0.609375,\n },\n {\n x: 0.546875,\n y: 0.609375,\n },\n {\n x: 0.546875,\n y: 0.609375,\n },\n {\n x: 0.578125,\n y: 0.609375,\n },\n {\n x: 0.578125,\n y: 0.609375,\n },\n {\n x: 0.609375,\n y: 0.609375,\n },\n {\n x: 0.609375,\n y: 0.609375,\n },\n {\n x: 0.640625,\n y: 0.609375,\n },\n {\n x: 0.640625,\n y: 0.609375,\n },\n {\n x: 0.671875,\n y: 0.609375,\n },\n {\n x: 0.671875,\n y: 0.609375,\n },\n {\n x: 0.703125,\n y: 0.609375,\n },\n {\n x: 0.703125,\n y: 0.609375,\n },\n {\n x: 0.734375,\n y: 0.609375,\n },\n {\n x: 0.734375,\n y: 0.609375,\n },\n {\n x: 0.765625,\n y: 0.609375,\n },\n {\n x: 0.765625,\n y: 0.609375,\n },\n {\n x: 0.796875,\n y: 0.609375,\n },\n {\n x: 0.796875,\n y: 0.609375,\n },\n {\n x: 0.828125,\n y: 0.609375,\n },\n {\n x: 0.828125,\n y: 0.609375,\n },\n {\n x: 0.859375,\n y: 0.609375,\n },\n {\n x: 0.859375,\n y: 0.609375,\n },\n {\n x: 0.890625,\n y: 0.609375,\n },\n {\n x: 0.890625,\n y: 0.609375,\n },\n {\n x: 0.921875,\n y: 0.609375,\n },\n {\n x: 0.921875,\n y: 0.609375,\n },\n {\n x: 0.953125,\n y: 0.609375,\n },\n {\n x: 0.953125,\n y: 0.609375,\n },\n {\n x: 0.984375,\n y: 0.609375,\n },\n {\n x: 0.984375,\n y: 0.609375,\n },\n {\n x: 0.015625,\n y: 0.640625,\n },\n {\n x: 0.015625,\n y: 0.640625,\n },\n {\n x: 0.046875,\n y: 0.640625,\n },\n {\n x: 0.046875,\n y: 0.640625,\n },\n {\n x: 0.078125,\n y: 0.640625,\n },\n {\n x: 0.078125,\n y: 0.640625,\n },\n {\n x: 0.109375,\n y: 0.640625,\n },\n {\n x: 0.109375,\n y: 0.640625,\n },\n {\n x: 0.140625,\n y: 0.640625,\n },\n {\n x: 0.140625,\n y: 0.640625,\n },\n {\n x: 0.171875,\n y: 0.640625,\n },\n {\n x: 0.171875,\n y: 0.640625,\n },\n {\n x: 0.203125,\n y: 0.640625,\n },\n {\n x: 0.203125,\n y: 0.640625,\n },\n {\n x: 0.234375,\n y: 0.640625,\n },\n {\n x: 0.234375,\n y: 0.640625,\n },\n {\n x: 0.265625,\n y: 0.640625,\n },\n {\n x: 0.265625,\n y: 0.640625,\n },\n {\n x: 0.296875,\n y: 0.640625,\n },\n {\n x: 0.296875,\n y: 0.640625,\n },\n {\n x: 0.328125,\n y: 0.640625,\n },\n {\n x: 0.328125,\n y: 0.640625,\n },\n {\n x: 0.359375,\n y: 0.640625,\n },\n {\n x: 0.359375,\n y: 0.640625,\n },\n {\n x: 0.390625,\n y: 0.640625,\n },\n {\n x: 0.390625,\n y: 0.640625,\n },\n {\n x: 0.421875,\n y: 0.640625,\n },\n {\n x: 0.421875,\n y: 0.640625,\n },\n {\n x: 0.453125,\n y: 0.640625,\n },\n {\n x: 0.453125,\n y: 0.640625,\n },\n {\n x: 0.484375,\n y: 0.640625,\n },\n {\n x: 0.484375,\n y: 0.640625,\n },\n {\n x: 0.515625,\n y: 0.640625,\n },\n {\n x: 0.515625,\n y: 0.640625,\n },\n {\n x: 0.546875,\n y: 0.640625,\n },\n {\n x: 0.546875,\n y: 0.640625,\n },\n {\n x: 0.578125,\n y: 0.640625,\n },\n {\n x: 0.578125,\n y: 0.640625,\n },\n {\n x: 0.609375,\n y: 0.640625,\n },\n {\n x: 0.609375,\n y: 0.640625,\n },\n {\n x: 0.640625,\n y: 0.640625,\n },\n {\n x: 0.640625,\n y: 0.640625,\n },\n {\n x: 0.671875,\n y: 0.640625,\n },\n {\n x: 0.671875,\n y: 0.640625,\n },\n {\n x: 0.703125,\n y: 0.640625,\n },\n {\n x: 0.703125,\n y: 0.640625,\n },\n {\n x: 0.734375,\n y: 0.640625,\n },\n {\n x: 0.734375,\n y: 0.640625,\n },\n {\n x: 0.765625,\n y: 0.640625,\n },\n {\n x: 0.765625,\n y: 0.640625,\n },\n {\n x: 0.796875,\n y: 0.640625,\n },\n {\n x: 0.796875,\n y: 0.640625,\n },\n {\n x: 0.828125,\n y: 0.640625,\n },\n {\n x: 0.828125,\n y: 0.640625,\n },\n {\n x: 0.859375,\n y: 0.640625,\n },\n {\n x: 0.859375,\n y: 0.640625,\n },\n {\n x: 0.890625,\n y: 0.640625,\n },\n {\n x: 0.890625,\n y: 0.640625,\n },\n {\n x: 0.921875,\n y: 0.640625,\n },\n {\n x: 0.921875,\n y: 0.640625,\n },\n {\n x: 0.953125,\n y: 0.640625,\n },\n {\n x: 0.953125,\n y: 0.640625,\n },\n {\n x: 0.984375,\n y: 0.640625,\n },\n {\n x: 0.984375,\n y: 0.640625,\n },\n {\n x: 0.015625,\n y: 0.671875,\n },\n {\n x: 0.015625,\n y: 0.671875,\n },\n {\n x: 0.046875,\n y: 0.671875,\n },\n {\n x: 0.046875,\n y: 0.671875,\n },\n {\n x: 0.078125,\n y: 0.671875,\n },\n {\n x: 0.078125,\n y: 0.671875,\n },\n {\n x: 0.109375,\n y: 0.671875,\n },\n {\n x: 0.109375,\n y: 0.671875,\n },\n {\n x: 0.140625,\n y: 0.671875,\n },\n {\n x: 0.140625,\n y: 0.671875,\n },\n {\n x: 0.171875,\n y: 0.671875,\n },\n {\n x: 0.171875,\n y: 0.671875,\n },\n {\n x: 0.203125,\n y: 0.671875,\n },\n {\n x: 0.203125,\n y: 0.671875,\n },\n {\n x: 0.234375,\n y: 0.671875,\n },\n {\n x: 0.234375,\n y: 0.671875,\n },\n {\n x: 0.265625,\n y: 0.671875,\n },\n {\n x: 0.265625,\n y: 0.671875,\n },\n {\n x: 0.296875,\n y: 0.671875,\n },\n {\n x: 0.296875,\n y: 0.671875,\n },\n {\n x: 0.328125,\n y: 0.671875,\n },\n {\n x: 0.328125,\n y: 0.671875,\n },\n {\n x: 0.359375,\n y: 0.671875,\n },\n {\n x: 0.359375,\n y: 0.671875,\n },\n {\n x: 0.390625,\n y: 0.671875,\n },\n {\n x: 0.390625,\n y: 0.671875,\n },\n {\n x: 0.421875,\n y: 0.671875,\n },\n {\n x: 0.421875,\n y: 0.671875,\n },\n {\n x: 0.453125,\n y: 0.671875,\n },\n {\n x: 0.453125,\n y: 0.671875,\n },\n {\n x: 0.484375,\n y: 0.671875,\n },\n {\n x: 0.484375,\n y: 0.671875,\n },\n {\n x: 0.515625,\n y: 0.671875,\n },\n {\n x: 0.515625,\n y: 0.671875,\n },\n {\n x: 0.546875,\n y: 0.671875,\n },\n {\n x: 0.546875,\n y: 0.671875,\n },\n {\n x: 0.578125,\n y: 0.671875,\n },\n {\n x: 0.578125,\n y: 0.671875,\n },\n {\n x: 0.609375,\n y: 0.671875,\n },\n {\n x: 0.609375,\n y: 0.671875,\n },\n {\n x: 0.640625,\n y: 0.671875,\n },\n {\n x: 0.640625,\n y: 0.671875,\n },\n {\n x: 0.671875,\n y: 0.671875,\n },\n {\n x: 0.671875,\n y: 0.671875,\n },\n {\n x: 0.703125,\n y: 0.671875,\n },\n {\n x: 0.703125,\n y: 0.671875,\n },\n {\n x: 0.734375,\n y: 0.671875,\n },\n {\n x: 0.734375,\n y: 0.671875,\n },\n {\n x: 0.765625,\n y: 0.671875,\n },\n {\n x: 0.765625,\n y: 0.671875,\n },\n {\n x: 0.796875,\n y: 0.671875,\n },\n {\n x: 0.796875,\n y: 0.671875,\n },\n {\n x: 0.828125,\n y: 0.671875,\n },\n {\n x: 0.828125,\n y: 0.671875,\n },\n {\n x: 0.859375,\n y: 0.671875,\n },\n {\n x: 0.859375,\n y: 0.671875,\n },\n {\n x: 0.890625,\n y: 0.671875,\n },\n {\n x: 0.890625,\n y: 0.671875,\n },\n {\n x: 0.921875,\n y: 0.671875,\n },\n {\n x: 0.921875,\n y: 0.671875,\n },\n {\n x: 0.953125,\n y: 0.671875,\n },\n {\n x: 0.953125,\n y: 0.671875,\n },\n {\n x: 0.984375,\n y: 0.671875,\n },\n {\n x: 0.984375,\n y: 0.671875,\n },\n {\n x: 0.015625,\n y: 0.703125,\n },\n {\n x: 0.015625,\n y: 0.703125,\n },\n {\n x: 0.046875,\n y: 0.703125,\n },\n {\n x: 0.046875,\n y: 0.703125,\n },\n {\n x: 0.078125,\n y: 0.703125,\n },\n {\n x: 0.078125,\n y: 0.703125,\n },\n {\n x: 0.109375,\n y: 0.703125,\n },\n {\n x: 0.109375,\n y: 0.703125,\n },\n {\n x: 0.140625,\n y: 0.703125,\n },\n {\n x: 0.140625,\n y: 0.703125,\n },\n {\n x: 0.171875,\n y: 0.703125,\n },\n {\n x: 0.171875,\n y: 0.703125,\n },\n {\n x: 0.203125,\n y: 0.703125,\n },\n {\n x: 0.203125,\n y: 0.703125,\n },\n {\n x: 0.234375,\n y: 0.703125,\n },\n {\n x: 0.234375,\n y: 0.703125,\n },\n {\n x: 0.265625,\n y: 0.703125,\n },\n {\n x: 0.265625,\n y: 0.703125,\n },\n {\n x: 0.296875,\n y: 0.703125,\n },\n {\n x: 0.296875,\n y: 0.703125,\n },\n {\n x: 0.328125,\n y: 0.703125,\n },\n {\n x: 0.328125,\n y: 0.703125,\n },\n {\n x: 0.359375,\n y: 0.703125,\n },\n {\n x: 0.359375,\n y: 0.703125,\n },\n {\n x: 0.390625,\n y: 0.703125,\n },\n {\n x: 0.390625,\n y: 0.703125,\n },\n {\n x: 0.421875,\n y: 0.703125,\n },\n {\n x: 0.421875,\n y: 0.703125,\n },\n {\n x: 0.453125,\n y: 0.703125,\n },\n {\n x: 0.453125,\n y: 0.703125,\n },\n {\n x: 0.484375,\n y: 0.703125,\n },\n {\n x: 0.484375,\n y: 0.703125,\n },\n {\n x: 0.515625,\n y: 0.703125,\n },\n {\n x: 0.515625,\n y: 0.703125,\n },\n {\n x: 0.546875,\n y: 0.703125,\n },\n {\n x: 0.546875,\n y: 0.703125,\n },\n {\n x: 0.578125,\n y: 0.703125,\n },\n {\n x: 0.578125,\n y: 0.703125,\n },\n {\n x: 0.609375,\n y: 0.703125,\n },\n {\n x: 0.609375,\n y: 0.703125,\n },\n {\n x: 0.640625,\n y: 0.703125,\n },\n {\n x: 0.640625,\n y: 0.703125,\n },\n {\n x: 0.671875,\n y: 0.703125,\n },\n {\n x: 0.671875,\n y: 0.703125,\n },\n {\n x: 0.703125,\n y: 0.703125,\n },\n {\n x: 0.703125,\n y: 0.703125,\n },\n {\n x: 0.734375,\n y: 0.703125,\n },\n {\n x: 0.734375,\n y: 0.703125,\n },\n {\n x: 0.765625,\n y: 0.703125,\n },\n {\n x: 0.765625,\n y: 0.703125,\n },\n {\n x: 0.796875,\n y: 0.703125,\n },\n {\n x: 0.796875,\n y: 0.703125,\n },\n {\n x: 0.828125,\n y: 0.703125,\n },\n {\n x: 0.828125,\n y: 0.703125,\n },\n {\n x: 0.859375,\n y: 0.703125,\n },\n {\n x: 0.859375,\n y: 0.703125,\n },\n {\n x: 0.890625,\n y: 0.703125,\n },\n {\n x: 0.890625,\n y: 0.703125,\n },\n {\n x: 0.921875,\n y: 0.703125,\n },\n {\n x: 0.921875,\n y: 0.703125,\n },\n {\n x: 0.953125,\n y: 0.703125,\n },\n {\n x: 0.953125,\n y: 0.703125,\n },\n {\n x: 0.984375,\n y: 0.703125,\n },\n {\n x: 0.984375,\n y: 0.703125,\n },\n {\n x: 0.015625,\n y: 0.734375,\n },\n {\n x: 0.015625,\n y: 0.734375,\n },\n {\n x: 0.046875,\n y: 0.734375,\n },\n {\n x: 0.046875,\n y: 0.734375,\n },\n {\n x: 0.078125,\n y: 0.734375,\n },\n {\n x: 0.078125,\n y: 0.734375,\n },\n {\n x: 0.109375,\n y: 0.734375,\n },\n {\n x: 0.109375,\n y: 0.734375,\n },\n {\n x: 0.140625,\n y: 0.734375,\n },\n {\n x: 0.140625,\n y: 0.734375,\n },\n {\n x: 0.171875,\n y: 0.734375,\n },\n {\n x: 0.171875,\n y: 0.734375,\n },\n {\n x: 0.203125,\n y: 0.734375,\n },\n {\n x: 0.203125,\n y: 0.734375,\n },\n {\n x: 0.234375,\n y: 0.734375,\n },\n {\n x: 0.234375,\n y: 0.734375,\n },\n {\n x: 0.265625,\n y: 0.734375,\n },\n {\n x: 0.265625,\n y: 0.734375,\n },\n {\n x: 0.296875,\n y: 0.734375,\n },\n {\n x: 0.296875,\n y: 0.734375,\n },\n {\n x: 0.328125,\n y: 0.734375,\n },\n {\n x: 0.328125,\n y: 0.734375,\n },\n {\n x: 0.359375,\n y: 0.734375,\n },\n {\n x: 0.359375,\n y: 0.734375,\n },\n {\n x: 0.390625,\n y: 0.734375,\n },\n {\n x: 0.390625,\n y: 0.734375,\n },\n {\n x: 0.421875,\n y: 0.734375,\n },\n {\n x: 0.421875,\n y: 0.734375,\n },\n {\n x: 0.453125,\n y: 0.734375,\n },\n {\n x: 0.453125,\n y: 0.734375,\n },\n {\n x: 0.484375,\n y: 0.734375,\n },\n {\n x: 0.484375,\n y: 0.734375,\n },\n {\n x: 0.515625,\n y: 0.734375,\n },\n {\n x: 0.515625,\n y: 0.734375,\n },\n {\n x: 0.546875,\n y: 0.734375,\n },\n {\n x: 0.546875,\n y: 0.734375,\n },\n {\n x: 0.578125,\n y: 0.734375,\n },\n {\n x: 0.578125,\n y: 0.734375,\n },\n {\n x: 0.609375,\n y: 0.734375,\n },\n {\n x: 0.609375,\n y: 0.734375,\n },\n {\n x: 0.640625,\n y: 0.734375,\n },\n {\n x: 0.640625,\n y: 0.734375,\n },\n {\n x: 0.671875,\n y: 0.734375,\n },\n {\n x: 0.671875,\n y: 0.734375,\n },\n {\n x: 0.703125,\n y: 0.734375,\n },\n {\n x: 0.703125,\n y: 0.734375,\n },\n {\n x: 0.734375,\n y: 0.734375,\n },\n {\n x: 0.734375,\n y: 0.734375,\n },\n {\n x: 0.765625,\n y: 0.734375,\n },\n {\n x: 0.765625,\n y: 0.734375,\n },\n {\n x: 0.796875,\n y: 0.734375,\n },\n {\n x: 0.796875,\n y: 0.734375,\n },\n {\n x: 0.828125,\n y: 0.734375,\n },\n {\n x: 0.828125,\n y: 0.734375,\n },\n {\n x: 0.859375,\n y: 0.734375,\n },\n {\n x: 0.859375,\n y: 0.734375,\n },\n {\n x: 0.890625,\n y: 0.734375,\n },\n {\n x: 0.890625,\n y: 0.734375,\n },\n {\n x: 0.921875,\n y: 0.734375,\n },\n {\n x: 0.921875,\n y: 0.734375,\n },\n {\n x: 0.953125,\n y: 0.734375,\n },\n {\n x: 0.953125,\n y: 0.734375,\n },\n {\n x: 0.984375,\n y: 0.734375,\n },\n {\n x: 0.984375,\n y: 0.734375,\n },\n {\n x: 0.015625,\n y: 0.765625,\n },\n {\n x: 0.015625,\n y: 0.765625,\n },\n {\n x: 0.046875,\n y: 0.765625,\n },\n {\n x: 0.046875,\n y: 0.765625,\n },\n {\n x: 0.078125,\n y: 0.765625,\n },\n {\n x: 0.078125,\n y: 0.765625,\n },\n {\n x: 0.109375,\n y: 0.765625,\n },\n {\n x: 0.109375,\n y: 0.765625,\n },\n {\n x: 0.140625,\n y: 0.765625,\n },\n {\n x: 0.140625,\n y: 0.765625,\n },\n {\n x: 0.171875,\n y: 0.765625,\n },\n {\n x: 0.171875,\n y: 0.765625,\n },\n {\n x: 0.203125,\n y: 0.765625,\n },\n {\n x: 0.203125,\n y: 0.765625,\n },\n {\n x: 0.234375,\n y: 0.765625,\n },\n {\n x: 0.234375,\n y: 0.765625,\n },\n {\n x: 0.265625,\n y: 0.765625,\n },\n {\n x: 0.265625,\n y: 0.765625,\n },\n {\n x: 0.296875,\n y: 0.765625,\n },\n {\n x: 0.296875,\n y: 0.765625,\n },\n {\n x: 0.328125,\n y: 0.765625,\n },\n {\n x: 0.328125,\n y: 0.765625,\n },\n {\n x: 0.359375,\n y: 0.765625,\n },\n {\n x: 0.359375,\n y: 0.765625,\n },\n {\n x: 0.390625,\n y: 0.765625,\n },\n {\n x: 0.390625,\n y: 0.765625,\n },\n {\n x: 0.421875,\n y: 0.765625,\n },\n {\n x: 0.421875,\n y: 0.765625,\n },\n {\n x: 0.453125,\n y: 0.765625,\n },\n {\n x: 0.453125,\n y: 0.765625,\n },\n {\n x: 0.484375,\n y: 0.765625,\n },\n {\n x: 0.484375,\n y: 0.765625,\n },\n {\n x: 0.515625,\n y: 0.765625,\n },\n {\n x: 0.515625,\n y: 0.765625,\n },\n {\n x: 0.546875,\n y: 0.765625,\n },\n {\n x: 0.546875,\n y: 0.765625,\n },\n {\n x: 0.578125,\n y: 0.765625,\n },\n {\n x: 0.578125,\n y: 0.765625,\n },\n {\n x: 0.609375,\n y: 0.765625,\n },\n {\n x: 0.609375,\n y: 0.765625,\n },\n {\n x: 0.640625,\n y: 0.765625,\n },\n {\n x: 0.640625,\n y: 0.765625,\n },\n {\n x: 0.671875,\n y: 0.765625,\n },\n {\n x: 0.671875,\n y: 0.765625,\n },\n {\n x: 0.703125,\n y: 0.765625,\n },\n {\n x: 0.703125,\n y: 0.765625,\n },\n {\n x: 0.734375,\n y: 0.765625,\n },\n {\n x: 0.734375,\n y: 0.765625,\n },\n {\n x: 0.765625,\n y: 0.765625,\n },\n {\n x: 0.765625,\n y: 0.765625,\n },\n {\n x: 0.796875,\n y: 0.765625,\n },\n {\n x: 0.796875,\n y: 0.765625,\n },\n {\n x: 0.828125,\n y: 0.765625,\n },\n {\n x: 0.828125,\n y: 0.765625,\n },\n {\n x: 0.859375,\n y: 0.765625,\n },\n {\n x: 0.859375,\n y: 0.765625,\n },\n {\n x: 0.890625,\n y: 0.765625,\n },\n {\n x: 0.890625,\n y: 0.765625,\n },\n {\n x: 0.921875,\n y: 0.765625,\n },\n {\n x: 0.921875,\n y: 0.765625,\n },\n {\n x: 0.953125,\n y: 0.765625,\n },\n {\n x: 0.953125,\n y: 0.765625,\n },\n {\n x: 0.984375,\n y: 0.765625,\n },\n {\n x: 0.984375,\n y: 0.765625,\n },\n {\n x: 0.015625,\n y: 0.796875,\n },\n {\n x: 0.015625,\n y: 0.796875,\n },\n {\n x: 0.046875,\n y: 0.796875,\n },\n {\n x: 0.046875,\n y: 0.796875,\n },\n {\n x: 0.078125,\n y: 0.796875,\n },\n {\n x: 0.078125,\n y: 0.796875,\n },\n {\n x: 0.109375,\n y: 0.796875,\n },\n {\n x: 0.109375,\n y: 0.796875,\n },\n {\n x: 0.140625,\n y: 0.796875,\n },\n {\n x: 0.140625,\n y: 0.796875,\n },\n {\n x: 0.171875,\n y: 0.796875,\n },\n {\n x: 0.171875,\n y: 0.796875,\n },\n {\n x: 0.203125,\n y: 0.796875,\n },\n {\n x: 0.203125,\n y: 0.796875,\n },\n {\n x: 0.234375,\n y: 0.796875,\n },\n {\n x: 0.234375,\n y: 0.796875,\n },\n {\n x: 0.265625,\n y: 0.796875,\n },\n {\n x: 0.265625,\n y: 0.796875,\n },\n {\n x: 0.296875,\n y: 0.796875,\n },\n {\n x: 0.296875,\n y: 0.796875,\n },\n {\n x: 0.328125,\n y: 0.796875,\n },\n {\n x: 0.328125,\n y: 0.796875,\n },\n {\n x: 0.359375,\n y: 0.796875,\n },\n {\n x: 0.359375,\n y: 0.796875,\n },\n {\n x: 0.390625,\n y: 0.796875,\n },\n {\n x: 0.390625,\n y: 0.796875,\n },\n {\n x: 0.421875,\n y: 0.796875,\n },\n {\n x: 0.421875,\n y: 0.796875,\n },\n {\n x: 0.453125,\n y: 0.796875,\n },\n {\n x: 0.453125,\n y: 0.796875,\n },\n {\n x: 0.484375,\n y: 0.796875,\n },\n {\n x: 0.484375,\n y: 0.796875,\n },\n {\n x: 0.515625,\n y: 0.796875,\n },\n {\n x: 0.515625,\n y: 0.796875,\n },\n {\n x: 0.546875,\n y: 0.796875,\n },\n {\n x: 0.546875,\n y: 0.796875,\n },\n {\n x: 0.578125,\n y: 0.796875,\n },\n {\n x: 0.578125,\n y: 0.796875,\n },\n {\n x: 0.609375,\n y: 0.796875,\n },\n {\n x: 0.609375,\n y: 0.796875,\n },\n {\n x: 0.640625,\n y: 0.796875,\n },\n {\n x: 0.640625,\n y: 0.796875,\n },\n {\n x: 0.671875,\n y: 0.796875,\n },\n {\n x: 0.671875,\n y: 0.796875,\n },\n {\n x: 0.703125,\n y: 0.796875,\n },\n {\n x: 0.703125,\n y: 0.796875,\n },\n {\n x: 0.734375,\n y: 0.796875,\n },\n {\n x: 0.734375,\n y: 0.796875,\n },\n {\n x: 0.765625,\n y: 0.796875,\n },\n {\n x: 0.765625,\n y: 0.796875,\n },\n {\n x: 0.796875,\n y: 0.796875,\n },\n {\n x: 0.796875,\n y: 0.796875,\n },\n {\n x: 0.828125,\n y: 0.796875,\n },\n {\n x: 0.828125,\n y: 0.796875,\n },\n {\n x: 0.859375,\n y: 0.796875,\n },\n {\n x: 0.859375,\n y: 0.796875,\n },\n {\n x: 0.890625,\n y: 0.796875,\n },\n {\n x: 0.890625,\n y: 0.796875,\n },\n {\n x: 0.921875,\n y: 0.796875,\n },\n {\n x: 0.921875,\n y: 0.796875,\n },\n {\n x: 0.953125,\n y: 0.796875,\n },\n {\n x: 0.953125,\n y: 0.796875,\n },\n {\n x: 0.984375,\n y: 0.796875,\n },\n {\n x: 0.984375,\n y: 0.796875,\n },\n {\n x: 0.015625,\n y: 0.828125,\n },\n {\n x: 0.015625,\n y: 0.828125,\n },\n {\n x: 0.046875,\n y: 0.828125,\n },\n {\n x: 0.046875,\n y: 0.828125,\n },\n {\n x: 0.078125,\n y: 0.828125,\n },\n {\n x: 0.078125,\n y: 0.828125,\n },\n {\n x: 0.109375,\n y: 0.828125,\n },\n {\n x: 0.109375,\n y: 0.828125,\n },\n {\n x: 0.140625,\n y: 0.828125,\n },\n {\n x: 0.140625,\n y: 0.828125,\n },\n {\n x: 0.171875,\n y: 0.828125,\n },\n {\n x: 0.171875,\n y: 0.828125,\n },\n {\n x: 0.203125,\n y: 0.828125,\n },\n {\n x: 0.203125,\n y: 0.828125,\n },\n {\n x: 0.234375,\n y: 0.828125,\n },\n {\n x: 0.234375,\n y: 0.828125,\n },\n {\n x: 0.265625,\n y: 0.828125,\n },\n {\n x: 0.265625,\n y: 0.828125,\n },\n {\n x: 0.296875,\n y: 0.828125,\n },\n {\n x: 0.296875,\n y: 0.828125,\n },\n {\n x: 0.328125,\n y: 0.828125,\n },\n {\n x: 0.328125,\n y: 0.828125,\n },\n {\n x: 0.359375,\n y: 0.828125,\n },\n {\n x: 0.359375,\n y: 0.828125,\n },\n {\n x: 0.390625,\n y: 0.828125,\n },\n {\n x: 0.390625,\n y: 0.828125,\n },\n {\n x: 0.421875,\n y: 0.828125,\n },\n {\n x: 0.421875,\n y: 0.828125,\n },\n {\n x: 0.453125,\n y: 0.828125,\n },\n {\n x: 0.453125,\n y: 0.828125,\n },\n {\n x: 0.484375,\n y: 0.828125,\n },\n {\n x: 0.484375,\n y: 0.828125,\n },\n {\n x: 0.515625,\n y: 0.828125,\n },\n {\n x: 0.515625,\n y: 0.828125,\n },\n {\n x: 0.546875,\n y: 0.828125,\n },\n {\n x: 0.546875,\n y: 0.828125,\n },\n {\n x: 0.578125,\n y: 0.828125,\n },\n {\n x: 0.578125,\n y: 0.828125,\n },\n {\n x: 0.609375,\n y: 0.828125,\n },\n {\n x: 0.609375,\n y: 0.828125,\n },\n {\n x: 0.640625,\n y: 0.828125,\n },\n {\n x: 0.640625,\n y: 0.828125,\n },\n {\n x: 0.671875,\n y: 0.828125,\n },\n {\n x: 0.671875,\n y: 0.828125,\n },\n {\n x: 0.703125,\n y: 0.828125,\n },\n {\n x: 0.703125,\n y: 0.828125,\n },\n {\n x: 0.734375,\n y: 0.828125,\n },\n {\n x: 0.734375,\n y: 0.828125,\n },\n {\n x: 0.765625,\n y: 0.828125,\n },\n {\n x: 0.765625,\n y: 0.828125,\n },\n {\n x: 0.796875,\n y: 0.828125,\n },\n {\n x: 0.796875,\n y: 0.828125,\n },\n {\n x: 0.828125,\n y: 0.828125,\n },\n {\n x: 0.828125,\n y: 0.828125,\n },\n {\n x: 0.859375,\n y: 0.828125,\n },\n {\n x: 0.859375,\n y: 0.828125,\n },\n {\n x: 0.890625,\n y: 0.828125,\n },\n {\n x: 0.890625,\n y: 0.828125,\n },\n {\n x: 0.921875,\n y: 0.828125,\n },\n {\n x: 0.921875,\n y: 0.828125,\n },\n {\n x: 0.953125,\n y: 0.828125,\n },\n {\n x: 0.953125,\n y: 0.828125,\n },\n {\n x: 0.984375,\n y: 0.828125,\n },\n {\n x: 0.984375,\n y: 0.828125,\n },\n {\n x: 0.015625,\n y: 0.859375,\n },\n {\n x: 0.015625,\n y: 0.859375,\n },\n {\n x: 0.046875,\n y: 0.859375,\n },\n {\n x: 0.046875,\n y: 0.859375,\n },\n {\n x: 0.078125,\n y: 0.859375,\n },\n {\n x: 0.078125,\n y: 0.859375,\n },\n {\n x: 0.109375,\n y: 0.859375,\n },\n {\n x: 0.109375,\n y: 0.859375,\n },\n {\n x: 0.140625,\n y: 0.859375,\n },\n {\n x: 0.140625,\n y: 0.859375,\n },\n {\n x: 0.171875,\n y: 0.859375,\n },\n {\n x: 0.171875,\n y: 0.859375,\n },\n {\n x: 0.203125,\n y: 0.859375,\n },\n {\n x: 0.203125,\n y: 0.859375,\n },\n {\n x: 0.234375,\n y: 0.859375,\n },\n {\n x: 0.234375,\n y: 0.859375,\n },\n {\n x: 0.265625,\n y: 0.859375,\n },\n {\n x: 0.265625,\n y: 0.859375,\n },\n {\n x: 0.296875,\n y: 0.859375,\n },\n {\n x: 0.296875,\n y: 0.859375,\n },\n {\n x: 0.328125,\n y: 0.859375,\n },\n {\n x: 0.328125,\n y: 0.859375,\n },\n {\n x: 0.359375,\n y: 0.859375,\n },\n {\n x: 0.359375,\n y: 0.859375,\n },\n {\n x: 0.390625,\n y: 0.859375,\n },\n {\n x: 0.390625,\n y: 0.859375,\n },\n {\n x: 0.421875,\n y: 0.859375,\n },\n {\n x: 0.421875,\n y: 0.859375,\n },\n {\n x: 0.453125,\n y: 0.859375,\n },\n {\n x: 0.453125,\n y: 0.859375,\n },\n {\n x: 0.484375,\n y: 0.859375,\n },\n {\n x: 0.484375,\n y: 0.859375,\n },\n {\n x: 0.515625,\n y: 0.859375,\n },\n {\n x: 0.515625,\n y: 0.859375,\n },\n {\n x: 0.546875,\n y: 0.859375,\n },\n {\n x: 0.546875,\n y: 0.859375,\n },\n {\n x: 0.578125,\n y: 0.859375,\n },\n {\n x: 0.578125,\n y: 0.859375,\n },\n {\n x: 0.609375,\n y: 0.859375,\n },\n {\n x: 0.609375,\n y: 0.859375,\n },\n {\n x: 0.640625,\n y: 0.859375,\n },\n {\n x: 0.640625,\n y: 0.859375,\n },\n {\n x: 0.671875,\n y: 0.859375,\n },\n {\n x: 0.671875,\n y: 0.859375,\n },\n {\n x: 0.703125,\n y: 0.859375,\n },\n {\n x: 0.703125,\n y: 0.859375,\n },\n {\n x: 0.734375,\n y: 0.859375,\n },\n {\n x: 0.734375,\n y: 0.859375,\n },\n {\n x: 0.765625,\n y: 0.859375,\n },\n {\n x: 0.765625,\n y: 0.859375,\n },\n {\n x: 0.796875,\n y: 0.859375,\n },\n {\n x: 0.796875,\n y: 0.859375,\n },\n {\n x: 0.828125,\n y: 0.859375,\n },\n {\n x: 0.828125,\n y: 0.859375,\n },\n {\n x: 0.859375,\n y: 0.859375,\n },\n {\n x: 0.859375,\n y: 0.859375,\n },\n {\n x: 0.890625,\n y: 0.859375,\n },\n {\n x: 0.890625,\n y: 0.859375,\n },\n {\n x: 0.921875,\n y: 0.859375,\n },\n {\n x: 0.921875,\n y: 0.859375,\n },\n {\n x: 0.953125,\n y: 0.859375,\n },\n {\n x: 0.953125,\n y: 0.859375,\n },\n {\n x: 0.984375,\n y: 0.859375,\n },\n {\n x: 0.984375,\n y: 0.859375,\n },\n {\n x: 0.015625,\n y: 0.890625,\n },\n {\n x: 0.015625,\n y: 0.890625,\n },\n {\n x: 0.046875,\n y: 0.890625,\n },\n {\n x: 0.046875,\n y: 0.890625,\n },\n {\n x: 0.078125,\n y: 0.890625,\n },\n {\n x: 0.078125,\n y: 0.890625,\n },\n {\n x: 0.109375,\n y: 0.890625,\n },\n {\n x: 0.109375,\n y: 0.890625,\n },\n {\n x: 0.140625,\n y: 0.890625,\n },\n {\n x: 0.140625,\n y: 0.890625,\n },\n {\n x: 0.171875,\n y: 0.890625,\n },\n {\n x: 0.171875,\n y: 0.890625,\n },\n {\n x: 0.203125,\n y: 0.890625,\n },\n {\n x: 0.203125,\n y: 0.890625,\n },\n {\n x: 0.234375,\n y: 0.890625,\n },\n {\n x: 0.234375,\n y: 0.890625,\n },\n {\n x: 0.265625,\n y: 0.890625,\n },\n {\n x: 0.265625,\n y: 0.890625,\n },\n {\n x: 0.296875,\n y: 0.890625,\n },\n {\n x: 0.296875,\n y: 0.890625,\n },\n {\n x: 0.328125,\n y: 0.890625,\n },\n {\n x: 0.328125,\n y: 0.890625,\n },\n {\n x: 0.359375,\n y: 0.890625,\n },\n {\n x: 0.359375,\n y: 0.890625,\n },\n {\n x: 0.390625,\n y: 0.890625,\n },\n {\n x: 0.390625,\n y: 0.890625,\n },\n {\n x: 0.421875,\n y: 0.890625,\n },\n {\n x: 0.421875,\n y: 0.890625,\n },\n {\n x: 0.453125,\n y: 0.890625,\n },\n {\n x: 0.453125,\n y: 0.890625,\n },\n {\n x: 0.484375,\n y: 0.890625,\n },\n {\n x: 0.484375,\n y: 0.890625,\n },\n {\n x: 0.515625,\n y: 0.890625,\n },\n {\n x: 0.515625,\n y: 0.890625,\n },\n {\n x: 0.546875,\n y: 0.890625,\n },\n {\n x: 0.546875,\n y: 0.890625,\n },\n {\n x: 0.578125,\n y: 0.890625,\n },\n {\n x: 0.578125,\n y: 0.890625,\n },\n {\n x: 0.609375,\n y: 0.890625,\n },\n {\n x: 0.609375,\n y: 0.890625,\n },\n {\n x: 0.640625,\n y: 0.890625,\n },\n {\n x: 0.640625,\n y: 0.890625,\n },\n {\n x: 0.671875,\n y: 0.890625,\n },\n {\n x: 0.671875,\n y: 0.890625,\n },\n {\n x: 0.703125,\n y: 0.890625,\n },\n {\n x: 0.703125,\n y: 0.890625,\n },\n {\n x: 0.734375,\n y: 0.890625,\n },\n {\n x: 0.734375,\n y: 0.890625,\n },\n {\n x: 0.765625,\n y: 0.890625,\n },\n {\n x: 0.765625,\n y: 0.890625,\n },\n {\n x: 0.796875,\n y: 0.890625,\n },\n {\n x: 0.796875,\n y: 0.890625,\n },\n {\n x: 0.828125,\n y: 0.890625,\n },\n {\n x: 0.828125,\n y: 0.890625,\n },\n {\n x: 0.859375,\n y: 0.890625,\n },\n {\n x: 0.859375,\n y: 0.890625,\n },\n {\n x: 0.890625,\n y: 0.890625,\n },\n {\n x: 0.890625,\n y: 0.890625,\n },\n {\n x: 0.921875,\n y: 0.890625,\n },\n {\n x: 0.921875,\n y: 0.890625,\n },\n {\n x: 0.953125,\n y: 0.890625,\n },\n {\n x: 0.953125,\n y: 0.890625,\n },\n {\n x: 0.984375,\n y: 0.890625,\n },\n {\n x: 0.984375,\n y: 0.890625,\n },\n {\n x: 0.015625,\n y: 0.921875,\n },\n {\n x: 0.015625,\n y: 0.921875,\n },\n {\n x: 0.046875,\n y: 0.921875,\n },\n {\n x: 0.046875,\n y: 0.921875,\n },\n {\n x: 0.078125,\n y: 0.921875,\n },\n {\n x: 0.078125,\n y: 0.921875,\n },\n {\n x: 0.109375,\n y: 0.921875,\n },\n {\n x: 0.109375,\n y: 0.921875,\n },\n {\n x: 0.140625,\n y: 0.921875,\n },\n {\n x: 0.140625,\n y: 0.921875,\n },\n {\n x: 0.171875,\n y: 0.921875,\n },\n {\n x: 0.171875,\n y: 0.921875,\n },\n {\n x: 0.203125,\n y: 0.921875,\n },\n {\n x: 0.203125,\n y: 0.921875,\n },\n {\n x: 0.234375,\n y: 0.921875,\n },\n {\n x: 0.234375,\n y: 0.921875,\n },\n {\n x: 0.265625,\n y: 0.921875,\n },\n {\n x: 0.265625,\n y: 0.921875,\n },\n {\n x: 0.296875,\n y: 0.921875,\n },\n {\n x: 0.296875,\n y: 0.921875,\n },\n {\n x: 0.328125,\n y: 0.921875,\n },\n {\n x: 0.328125,\n y: 0.921875,\n },\n {\n x: 0.359375,\n y: 0.921875,\n },\n {\n x: 0.359375,\n y: 0.921875,\n },\n {\n x: 0.390625,\n y: 0.921875,\n },\n {\n x: 0.390625,\n y: 0.921875,\n },\n {\n x: 0.421875,\n y: 0.921875,\n },\n {\n x: 0.421875,\n y: 0.921875,\n },\n {\n x: 0.453125,\n y: 0.921875,\n },\n {\n x: 0.453125,\n y: 0.921875,\n },\n {\n x: 0.484375,\n y: 0.921875,\n },\n {\n x: 0.484375,\n y: 0.921875,\n },\n {\n x: 0.515625,\n y: 0.921875,\n },\n {\n x: 0.515625,\n y: 0.921875,\n },\n {\n x: 0.546875,\n y: 0.921875,\n },\n {\n x: 0.546875,\n y: 0.921875,\n },\n {\n x: 0.578125,\n y: 0.921875,\n },\n {\n x: 0.578125,\n y: 0.921875,\n },\n {\n x: 0.609375,\n y: 0.921875,\n },\n {\n x: 0.609375,\n y: 0.921875,\n },\n {\n x: 0.640625,\n y: 0.921875,\n },\n {\n x: 0.640625,\n y: 0.921875,\n },\n {\n x: 0.671875,\n y: 0.921875,\n },\n {\n x: 0.671875,\n y: 0.921875,\n },\n {\n x: 0.703125,\n y: 0.921875,\n },\n {\n x: 0.703125,\n y: 0.921875,\n },\n {\n x: 0.734375,\n y: 0.921875,\n },\n {\n x: 0.734375,\n y: 0.921875,\n },\n {\n x: 0.765625,\n y: 0.921875,\n },\n {\n x: 0.765625,\n y: 0.921875,\n },\n {\n x: 0.796875,\n y: 0.921875,\n },\n {\n x: 0.796875,\n y: 0.921875,\n },\n {\n x: 0.828125,\n y: 0.921875,\n },\n {\n x: 0.828125,\n y: 0.921875,\n },\n {\n x: 0.859375,\n y: 0.921875,\n },\n {\n x: 0.859375,\n y: 0.921875,\n },\n {\n x: 0.890625,\n y: 0.921875,\n },\n {\n x: 0.890625,\n y: 0.921875,\n },\n {\n x: 0.921875,\n y: 0.921875,\n },\n {\n x: 0.921875,\n y: 0.921875,\n },\n {\n x: 0.953125,\n y: 0.921875,\n },\n {\n x: 0.953125,\n y: 0.921875,\n },\n {\n x: 0.984375,\n y: 0.921875,\n },\n {\n x: 0.984375,\n y: 0.921875,\n },\n {\n x: 0.015625,\n y: 0.953125,\n },\n {\n x: 0.015625,\n y: 0.953125,\n },\n {\n x: 0.046875,\n y: 0.953125,\n },\n {\n x: 0.046875,\n y: 0.953125,\n },\n {\n x: 0.078125,\n y: 0.953125,\n },\n {\n x: 0.078125,\n y: 0.953125,\n },\n {\n x: 0.109375,\n y: 0.953125,\n },\n {\n x: 0.109375,\n y: 0.953125,\n },\n {\n x: 0.140625,\n y: 0.953125,\n },\n {\n x: 0.140625,\n y: 0.953125,\n },\n {\n x: 0.171875,\n y: 0.953125,\n },\n {\n x: 0.171875,\n y: 0.953125,\n },\n {\n x: 0.203125,\n y: 0.953125,\n },\n {\n x: 0.203125,\n y: 0.953125,\n },\n {\n x: 0.234375,\n y: 0.953125,\n },\n {\n x: 0.234375,\n y: 0.953125,\n },\n {\n x: 0.265625,\n y: 0.953125,\n },\n {\n x: 0.265625,\n y: 0.953125,\n },\n {\n x: 0.296875,\n y: 0.953125,\n },\n {\n x: 0.296875,\n y: 0.953125,\n },\n {\n x: 0.328125,\n y: 0.953125,\n },\n {\n x: 0.328125,\n y: 0.953125,\n },\n {\n x: 0.359375,\n y: 0.953125,\n },\n {\n x: 0.359375,\n y: 0.953125,\n },\n {\n x: 0.390625,\n y: 0.953125,\n },\n {\n x: 0.390625,\n y: 0.953125,\n },\n {\n x: 0.421875,\n y: 0.953125,\n },\n {\n x: 0.421875,\n y: 0.953125,\n },\n {\n x: 0.453125,\n y: 0.953125,\n },\n {\n x: 0.453125,\n y: 0.953125,\n },\n {\n x: 0.484375,\n y: 0.953125,\n },\n {\n x: 0.484375,\n y: 0.953125,\n },\n {\n x: 0.515625,\n y: 0.953125,\n },\n {\n x: 0.515625,\n y: 0.953125,\n },\n {\n x: 0.546875,\n y: 0.953125,\n },\n {\n x: 0.546875,\n y: 0.953125,\n },\n {\n x: 0.578125,\n y: 0.953125,\n },\n {\n x: 0.578125,\n y: 0.953125,\n },\n {\n x: 0.609375,\n y: 0.953125,\n },\n {\n x: 0.609375,\n y: 0.953125,\n },\n {\n x: 0.640625,\n y: 0.953125,\n },\n {\n x: 0.640625,\n y: 0.953125,\n },\n {\n x: 0.671875,\n y: 0.953125,\n },\n {\n x: 0.671875,\n y: 0.953125,\n },\n {\n x: 0.703125,\n y: 0.953125,\n },\n {\n x: 0.703125,\n y: 0.953125,\n },\n {\n x: 0.734375,\n y: 0.953125,\n },\n {\n x: 0.734375,\n y: 0.953125,\n },\n {\n x: 0.765625,\n y: 0.953125,\n },\n {\n x: 0.765625,\n y: 0.953125,\n },\n {\n x: 0.796875,\n y: 0.953125,\n },\n {\n x: 0.796875,\n y: 0.953125,\n },\n {\n x: 0.828125,\n y: 0.953125,\n },\n {\n x: 0.828125,\n y: 0.953125,\n },\n {\n x: 0.859375,\n y: 0.953125,\n },\n {\n x: 0.859375,\n y: 0.953125,\n },\n {\n x: 0.890625,\n y: 0.953125,\n },\n {\n x: 0.890625,\n y: 0.953125,\n },\n {\n x: 0.921875,\n y: 0.953125,\n },\n {\n x: 0.921875,\n y: 0.953125,\n },\n {\n x: 0.953125,\n y: 0.953125,\n },\n {\n x: 0.953125,\n y: 0.953125,\n },\n {\n x: 0.984375,\n y: 0.953125,\n },\n {\n x: 0.984375,\n y: 0.953125,\n },\n {\n x: 0.015625,\n y: 0.984375,\n },\n {\n x: 0.015625,\n y: 0.984375,\n },\n {\n x: 0.046875,\n y: 0.984375,\n },\n {\n x: 0.046875,\n y: 0.984375,\n },\n {\n x: 0.078125,\n y: 0.984375,\n },\n {\n x: 0.078125,\n y: 0.984375,\n },\n {\n x: 0.109375,\n y: 0.984375,\n },\n {\n x: 0.109375,\n y: 0.984375,\n },\n {\n x: 0.140625,\n y: 0.984375,\n },\n {\n x: 0.140625,\n y: 0.984375,\n },\n {\n x: 0.171875,\n y: 0.984375,\n },\n {\n x: 0.171875,\n y: 0.984375,\n },\n {\n x: 0.203125,\n y: 0.984375,\n },\n {\n x: 0.203125,\n y: 0.984375,\n },\n {\n x: 0.234375,\n y: 0.984375,\n },\n {\n x: 0.234375,\n y: 0.984375,\n },\n {\n x: 0.265625,\n y: 0.984375,\n },\n {\n x: 0.265625,\n y: 0.984375,\n },\n {\n x: 0.296875,\n y: 0.984375,\n },\n {\n x: 0.296875,\n y: 0.984375,\n },\n {\n x: 0.328125,\n y: 0.984375,\n },\n {\n x: 0.328125,\n y: 0.984375,\n },\n {\n x: 0.359375,\n y: 0.984375,\n },\n {\n x: 0.359375,\n y: 0.984375,\n },\n {\n x: 0.390625,\n y: 0.984375,\n },\n {\n x: 0.390625,\n y: 0.984375,\n },\n {\n x: 0.421875,\n y: 0.984375,\n },\n {\n x: 0.421875,\n y: 0.984375,\n },\n {\n x: 0.453125,\n y: 0.984375,\n },\n {\n x: 0.453125,\n y: 0.984375,\n },\n {\n x: 0.484375,\n y: 0.984375,\n },\n {\n x: 0.484375,\n y: 0.984375,\n },\n {\n x: 0.515625,\n y: 0.984375,\n },\n {\n x: 0.515625,\n y: 0.984375,\n },\n {\n x: 0.546875,\n y: 0.984375,\n },\n {\n x: 0.546875,\n y: 0.984375,\n },\n {\n x: 0.578125,\n y: 0.984375,\n },\n {\n x: 0.578125,\n y: 0.984375,\n },\n {\n x: 0.609375,\n y: 0.984375,\n },\n {\n x: 0.609375,\n y: 0.984375,\n },\n {\n x: 0.640625,\n y: 0.984375,\n },\n {\n x: 0.640625,\n y: 0.984375,\n },\n {\n x: 0.671875,\n y: 0.984375,\n },\n {\n x: 0.671875,\n y: 0.984375,\n },\n {\n x: 0.703125,\n y: 0.984375,\n },\n {\n x: 0.703125,\n y: 0.984375,\n },\n {\n x: 0.734375,\n y: 0.984375,\n },\n {\n x: 0.734375,\n y: 0.984375,\n },\n {\n x: 0.765625,\n y: 0.984375,\n },\n {\n x: 0.765625,\n y: 0.984375,\n },\n {\n x: 0.796875,\n y: 0.984375,\n },\n {\n x: 0.796875,\n y: 0.984375,\n },\n {\n x: 0.828125,\n y: 0.984375,\n },\n {\n x: 0.828125,\n y: 0.984375,\n },\n {\n x: 0.859375,\n y: 0.984375,\n },\n {\n x: 0.859375,\n y: 0.984375,\n },\n {\n x: 0.890625,\n y: 0.984375,\n },\n {\n x: 0.890625,\n y: 0.984375,\n },\n {\n x: 0.921875,\n y: 0.984375,\n },\n {\n x: 0.921875,\n y: 0.984375,\n },\n {\n x: 0.953125,\n y: 0.984375,\n },\n {\n x: 0.953125,\n y: 0.984375,\n },\n {\n x: 0.984375,\n y: 0.984375,\n },\n {\n x: 0.984375,\n y: 0.984375,\n },\n {\n x: 0.03125,\n y: 0.03125,\n },\n {\n x: 0.03125,\n y: 0.03125,\n },\n {\n x: 0.09375,\n y: 0.03125,\n },\n {\n x: 0.09375,\n y: 0.03125,\n },\n {\n x: 0.15625,\n y: 0.03125,\n },\n {\n x: 0.15625,\n y: 0.03125,\n },\n {\n x: 0.21875,\n y: 0.03125,\n },\n {\n x: 0.21875,\n y: 0.03125,\n },\n {\n x: 0.28125,\n y: 0.03125,\n },\n {\n x: 0.28125,\n y: 0.03125,\n },\n {\n x: 0.34375,\n y: 0.03125,\n },\n {\n x: 0.34375,\n y: 0.03125,\n },\n {\n x: 0.40625,\n y: 0.03125,\n },\n {\n x: 0.40625,\n y: 0.03125,\n },\n {\n x: 0.46875,\n y: 0.03125,\n },\n {\n x: 0.46875,\n y: 0.03125,\n },\n {\n x: 0.53125,\n y: 0.03125,\n },\n {\n x: 0.53125,\n y: 0.03125,\n },\n {\n x: 0.59375,\n y: 0.03125,\n },\n {\n x: 0.59375,\n y: 0.03125,\n },\n {\n x: 0.65625,\n y: 0.03125,\n },\n {\n x: 0.65625,\n y: 0.03125,\n },\n {\n x: 0.71875,\n y: 0.03125,\n },\n {\n x: 0.71875,\n y: 0.03125,\n },\n {\n x: 0.78125,\n y: 0.03125,\n },\n {\n x: 0.78125,\n y: 0.03125,\n },\n {\n x: 0.84375,\n y: 0.03125,\n },\n {\n x: 0.84375,\n y: 0.03125,\n },\n {\n x: 0.90625,\n y: 0.03125,\n },\n {\n x: 0.90625,\n y: 0.03125,\n },\n {\n x: 0.96875,\n y: 0.03125,\n },\n {\n x: 0.96875,\n y: 0.03125,\n },\n {\n x: 0.03125,\n y: 0.09375,\n },\n {\n x: 0.03125,\n y: 0.09375,\n },\n {\n x: 0.09375,\n y: 0.09375,\n },\n {\n x: 0.09375,\n y: 0.09375,\n },\n {\n x: 0.15625,\n y: 0.09375,\n },\n {\n x: 0.15625,\n y: 0.09375,\n },\n {\n x: 0.21875,\n y: 0.09375,\n },\n {\n x: 0.21875,\n y: 0.09375,\n },\n {\n x: 0.28125,\n y: 0.09375,\n },\n {\n x: 0.28125,\n y: 0.09375,\n },\n {\n x: 0.34375,\n y: 0.09375,\n },\n {\n x: 0.34375,\n y: 0.09375,\n },\n {\n x: 0.40625,\n y: 0.09375,\n },\n {\n x: 0.40625,\n y: 0.09375,\n },\n {\n x: 0.46875,\n y: 0.09375,\n },\n {\n x: 0.46875,\n y: 0.09375,\n },\n {\n x: 0.53125,\n y: 0.09375,\n },\n {\n x: 0.53125,\n y: 0.09375,\n },\n {\n x: 0.59375,\n y: 0.09375,\n },\n {\n x: 0.59375,\n y: 0.09375,\n },\n {\n x: 0.65625,\n y: 0.09375,\n },\n {\n x: 0.65625,\n y: 0.09375,\n },\n {\n x: 0.71875,\n y: 0.09375,\n },\n {\n x: 0.71875,\n y: 0.09375,\n },\n {\n x: 0.78125,\n y: 0.09375,\n },\n {\n x: 0.78125,\n y: 0.09375,\n },\n {\n x: 0.84375,\n y: 0.09375,\n },\n {\n x: 0.84375,\n y: 0.09375,\n },\n {\n x: 0.90625,\n y: 0.09375,\n },\n {\n x: 0.90625,\n y: 0.09375,\n },\n {\n x: 0.96875,\n y: 0.09375,\n },\n {\n x: 0.96875,\n y: 0.09375,\n },\n {\n x: 0.03125,\n y: 0.15625,\n },\n {\n x: 0.03125,\n y: 0.15625,\n },\n {\n x: 0.09375,\n y: 0.15625,\n },\n {\n x: 0.09375,\n y: 0.15625,\n },\n {\n x: 0.15625,\n y: 0.15625,\n },\n {\n x: 0.15625,\n y: 0.15625,\n },\n {\n x: 0.21875,\n y: 0.15625,\n },\n {\n x: 0.21875,\n y: 0.15625,\n },\n {\n x: 0.28125,\n y: 0.15625,\n },\n {\n x: 0.28125,\n y: 0.15625,\n },\n {\n x: 0.34375,\n y: 0.15625,\n },\n {\n x: 0.34375,\n y: 0.15625,\n },\n {\n x: 0.40625,\n y: 0.15625,\n },\n {\n x: 0.40625,\n y: 0.15625,\n },\n {\n x: 0.46875,\n y: 0.15625,\n },\n {\n x: 0.46875,\n y: 0.15625,\n },\n {\n x: 0.53125,\n y: 0.15625,\n },\n {\n x: 0.53125,\n y: 0.15625,\n },\n {\n x: 0.59375,\n y: 0.15625,\n },\n {\n x: 0.59375,\n y: 0.15625,\n },\n {\n x: 0.65625,\n y: 0.15625,\n },\n {\n x: 0.65625,\n y: 0.15625,\n },\n {\n x: 0.71875,\n y: 0.15625,\n },\n {\n x: 0.71875,\n y: 0.15625,\n },\n {\n x: 0.78125,\n y: 0.15625,\n },\n {\n x: 0.78125,\n y: 0.15625,\n },\n {\n x: 0.84375,\n y: 0.15625,\n },\n {\n x: 0.84375,\n y: 0.15625,\n },\n {\n x: 0.90625,\n y: 0.15625,\n },\n {\n x: 0.90625,\n y: 0.15625,\n },\n {\n x: 0.96875,\n y: 0.15625,\n },\n {\n x: 0.96875,\n y: 0.15625,\n },\n {\n x: 0.03125,\n y: 0.21875,\n },\n {\n x: 0.03125,\n y: 0.21875,\n },\n {\n x: 0.09375,\n y: 0.21875,\n },\n {\n x: 0.09375,\n y: 0.21875,\n },\n {\n x: 0.15625,\n y: 0.21875,\n },\n {\n x: 0.15625,\n y: 0.21875,\n },\n {\n x: 0.21875,\n y: 0.21875,\n },\n {\n x: 0.21875,\n y: 0.21875,\n },\n {\n x: 0.28125,\n y: 0.21875,\n },\n {\n x: 0.28125,\n y: 0.21875,\n },\n {\n x: 0.34375,\n y: 0.21875,\n },\n {\n x: 0.34375,\n y: 0.21875,\n },\n {\n x: 0.40625,\n y: 0.21875,\n },\n {\n x: 0.40625,\n y: 0.21875,\n },\n {\n x: 0.46875,\n y: 0.21875,\n },\n {\n x: 0.46875,\n y: 0.21875,\n },\n {\n x: 0.53125,\n y: 0.21875,\n },\n {\n x: 0.53125,\n y: 0.21875,\n },\n {\n x: 0.59375,\n y: 0.21875,\n },\n {\n x: 0.59375,\n y: 0.21875,\n },\n {\n x: 0.65625,\n y: 0.21875,\n },\n {\n x: 0.65625,\n y: 0.21875,\n },\n {\n x: 0.71875,\n y: 0.21875,\n },\n {\n x: 0.71875,\n y: 0.21875,\n },\n {\n x: 0.78125,\n y: 0.21875,\n },\n {\n x: 0.78125,\n y: 0.21875,\n },\n {\n x: 0.84375,\n y: 0.21875,\n },\n {\n x: 0.84375,\n y: 0.21875,\n },\n {\n x: 0.90625,\n y: 0.21875,\n },\n {\n x: 0.90625,\n y: 0.21875,\n },\n {\n x: 0.96875,\n y: 0.21875,\n },\n {\n x: 0.96875,\n y: 0.21875,\n },\n {\n x: 0.03125,\n y: 0.28125,\n },\n {\n x: 0.03125,\n y: 0.28125,\n },\n {\n x: 0.09375,\n y: 0.28125,\n },\n {\n x: 0.09375,\n y: 0.28125,\n },\n {\n x: 0.15625,\n y: 0.28125,\n },\n {\n x: 0.15625,\n y: 0.28125,\n },\n {\n x: 0.21875,\n y: 0.28125,\n },\n {\n x: 0.21875,\n y: 0.28125,\n },\n {\n x: 0.28125,\n y: 0.28125,\n },\n {\n x: 0.28125,\n y: 0.28125,\n },\n {\n x: 0.34375,\n y: 0.28125,\n },\n {\n x: 0.34375,\n y: 0.28125,\n },\n {\n x: 0.40625,\n y: 0.28125,\n },\n {\n x: 0.40625,\n y: 0.28125,\n },\n {\n x: 0.46875,\n y: 0.28125,\n },\n {\n x: 0.46875,\n y: 0.28125,\n },\n {\n x: 0.53125,\n y: 0.28125,\n },\n {\n x: 0.53125,\n y: 0.28125,\n },\n {\n x: 0.59375,\n y: 0.28125,\n },\n {\n x: 0.59375,\n y: 0.28125,\n },\n {\n x: 0.65625,\n y: 0.28125,\n },\n {\n x: 0.65625,\n y: 0.28125,\n },\n {\n x: 0.71875,\n y: 0.28125,\n },\n {\n x: 0.71875,\n y: 0.28125,\n },\n {\n x: 0.78125,\n y: 0.28125,\n },\n {\n x: 0.78125,\n y: 0.28125,\n },\n {\n x: 0.84375,\n y: 0.28125,\n },\n {\n x: 0.84375,\n y: 0.28125,\n },\n {\n x: 0.90625,\n y: 0.28125,\n },\n {\n x: 0.90625,\n y: 0.28125,\n },\n {\n x: 0.96875,\n y: 0.28125,\n },\n {\n x: 0.96875,\n y: 0.28125,\n },\n {\n x: 0.03125,\n y: 0.34375,\n },\n {\n x: 0.03125,\n y: 0.34375,\n },\n {\n x: 0.09375,\n y: 0.34375,\n },\n {\n x: 0.09375,\n y: 0.34375,\n },\n {\n x: 0.15625,\n y: 0.34375,\n },\n {\n x: 0.15625,\n y: 0.34375,\n },\n {\n x: 0.21875,\n y: 0.34375,\n },\n {\n x: 0.21875,\n y: 0.34375,\n },\n {\n x: 0.28125,\n y: 0.34375,\n },\n {\n x: 0.28125,\n y: 0.34375,\n },\n {\n x: 0.34375,\n y: 0.34375,\n },\n {\n x: 0.34375,\n y: 0.34375,\n },\n {\n x: 0.40625,\n y: 0.34375,\n },\n {\n x: 0.40625,\n y: 0.34375,\n },\n {\n x: 0.46875,\n y: 0.34375,\n },\n {\n x: 0.46875,\n y: 0.34375,\n },\n {\n x: 0.53125,\n y: 0.34375,\n },\n {\n x: 0.53125,\n y: 0.34375,\n },\n {\n x: 0.59375,\n y: 0.34375,\n },\n {\n x: 0.59375,\n y: 0.34375,\n },\n {\n x: 0.65625,\n y: 0.34375,\n },\n {\n x: 0.65625,\n y: 0.34375,\n },\n {\n x: 0.71875,\n y: 0.34375,\n },\n {\n x: 0.71875,\n y: 0.34375,\n },\n {\n x: 0.78125,\n y: 0.34375,\n },\n {\n x: 0.78125,\n y: 0.34375,\n },\n {\n x: 0.84375,\n y: 0.34375,\n },\n {\n x: 0.84375,\n y: 0.34375,\n },\n {\n x: 0.90625,\n y: 0.34375,\n },\n {\n x: 0.90625,\n y: 0.34375,\n },\n {\n x: 0.96875,\n y: 0.34375,\n },\n {\n x: 0.96875,\n y: 0.34375,\n },\n {\n x: 0.03125,\n y: 0.40625,\n },\n {\n x: 0.03125,\n y: 0.40625,\n },\n {\n x: 0.09375,\n y: 0.40625,\n },\n {\n x: 0.09375,\n y: 0.40625,\n },\n {\n x: 0.15625,\n y: 0.40625,\n },\n {\n x: 0.15625,\n y: 0.40625,\n },\n {\n x: 0.21875,\n y: 0.40625,\n },\n {\n x: 0.21875,\n y: 0.40625,\n },\n {\n x: 0.28125,\n y: 0.40625,\n },\n {\n x: 0.28125,\n y: 0.40625,\n },\n {\n x: 0.34375,\n y: 0.40625,\n },\n {\n x: 0.34375,\n y: 0.40625,\n },\n {\n x: 0.40625,\n y: 0.40625,\n },\n {\n x: 0.40625,\n y: 0.40625,\n },\n {\n x: 0.46875,\n y: 0.40625,\n },\n {\n x: 0.46875,\n y: 0.40625,\n },\n {\n x: 0.53125,\n y: 0.40625,\n },\n {\n x: 0.53125,\n y: 0.40625,\n },\n {\n x: 0.59375,\n y: 0.40625,\n },\n {\n x: 0.59375,\n y: 0.40625,\n },\n {\n x: 0.65625,\n y: 0.40625,\n },\n {\n x: 0.65625,\n y: 0.40625,\n },\n {\n x: 0.71875,\n y: 0.40625,\n },\n {\n x: 0.71875,\n y: 0.40625,\n },\n {\n x: 0.78125,\n y: 0.40625,\n },\n {\n x: 0.78125,\n y: 0.40625,\n },\n {\n x: 0.84375,\n y: 0.40625,\n },\n {\n x: 0.84375,\n y: 0.40625,\n },\n {\n x: 0.90625,\n y: 0.40625,\n },\n {\n x: 0.90625,\n y: 0.40625,\n },\n {\n x: 0.96875,\n y: 0.40625,\n },\n {\n x: 0.96875,\n y: 0.40625,\n },\n {\n x: 0.03125,\n y: 0.46875,\n },\n {\n x: 0.03125,\n y: 0.46875,\n },\n {\n x: 0.09375,\n y: 0.46875,\n },\n {\n x: 0.09375,\n y: 0.46875,\n },\n {\n x: 0.15625,\n y: 0.46875,\n },\n {\n x: 0.15625,\n y: 0.46875,\n },\n {\n x: 0.21875,\n y: 0.46875,\n },\n {\n x: 0.21875,\n y: 0.46875,\n },\n {\n x: 0.28125,\n y: 0.46875,\n },\n {\n x: 0.28125,\n y: 0.46875,\n },\n {\n x: 0.34375,\n y: 0.46875,\n },\n {\n x: 0.34375,\n y: 0.46875,\n },\n {\n x: 0.40625,\n y: 0.46875,\n },\n {\n x: 0.40625,\n y: 0.46875,\n },\n {\n x: 0.46875,\n y: 0.46875,\n },\n {\n x: 0.46875,\n y: 0.46875,\n },\n {\n x: 0.53125,\n y: 0.46875,\n },\n {\n x: 0.53125,\n y: 0.46875,\n },\n {\n x: 0.59375,\n y: 0.46875,\n },\n {\n x: 0.59375,\n y: 0.46875,\n },\n {\n x: 0.65625,\n y: 0.46875,\n },\n {\n x: 0.65625,\n y: 0.46875,\n },\n {\n x: 0.71875,\n y: 0.46875,\n },\n {\n x: 0.71875,\n y: 0.46875,\n },\n {\n x: 0.78125,\n y: 0.46875,\n },\n {\n x: 0.78125,\n y: 0.46875,\n },\n {\n x: 0.84375,\n y: 0.46875,\n },\n {\n x: 0.84375,\n y: 0.46875,\n },\n {\n x: 0.90625,\n y: 0.46875,\n },\n {\n x: 0.90625,\n y: 0.46875,\n },\n {\n x: 0.96875,\n y: 0.46875,\n },\n {\n x: 0.96875,\n y: 0.46875,\n },\n {\n x: 0.03125,\n y: 0.53125,\n },\n {\n x: 0.03125,\n y: 0.53125,\n },\n {\n x: 0.09375,\n y: 0.53125,\n },\n {\n x: 0.09375,\n y: 0.53125,\n },\n {\n x: 0.15625,\n y: 0.53125,\n },\n {\n x: 0.15625,\n y: 0.53125,\n },\n {\n x: 0.21875,\n y: 0.53125,\n },\n {\n x: 0.21875,\n y: 0.53125,\n },\n {\n x: 0.28125,\n y: 0.53125,\n },\n {\n x: 0.28125,\n y: 0.53125,\n },\n {\n x: 0.34375,\n y: 0.53125,\n },\n {\n x: 0.34375,\n y: 0.53125,\n },\n {\n x: 0.40625,\n y: 0.53125,\n },\n {\n x: 0.40625,\n y: 0.53125,\n },\n {\n x: 0.46875,\n y: 0.53125,\n },\n {\n x: 0.46875,\n y: 0.53125,\n },\n {\n x: 0.53125,\n y: 0.53125,\n },\n {\n x: 0.53125,\n y: 0.53125,\n },\n {\n x: 0.59375,\n y: 0.53125,\n },\n {\n x: 0.59375,\n y: 0.53125,\n },\n {\n x: 0.65625,\n y: 0.53125,\n },\n {\n x: 0.65625,\n y: 0.53125,\n },\n {\n x: 0.71875,\n y: 0.53125,\n },\n {\n x: 0.71875,\n y: 0.53125,\n },\n {\n x: 0.78125,\n y: 0.53125,\n },\n {\n x: 0.78125,\n y: 0.53125,\n },\n {\n x: 0.84375,\n y: 0.53125,\n },\n {\n x: 0.84375,\n y: 0.53125,\n },\n {\n x: 0.90625,\n y: 0.53125,\n },\n {\n x: 0.90625,\n y: 0.53125,\n },\n {\n x: 0.96875,\n y: 0.53125,\n },\n {\n x: 0.96875,\n y: 0.53125,\n },\n {\n x: 0.03125,\n y: 0.59375,\n },\n {\n x: 0.03125,\n y: 0.59375,\n },\n {\n x: 0.09375,\n y: 0.59375,\n },\n {\n x: 0.09375,\n y: 0.59375,\n },\n {\n x: 0.15625,\n y: 0.59375,\n },\n {\n x: 0.15625,\n y: 0.59375,\n },\n {\n x: 0.21875,\n y: 0.59375,\n },\n {\n x: 0.21875,\n y: 0.59375,\n },\n {\n x: 0.28125,\n y: 0.59375,\n },\n {\n x: 0.28125,\n y: 0.59375,\n },\n {\n x: 0.34375,\n y: 0.59375,\n },\n {\n x: 0.34375,\n y: 0.59375,\n },\n {\n x: 0.40625,\n y: 0.59375,\n },\n {\n x: 0.40625,\n y: 0.59375,\n },\n {\n x: 0.46875,\n y: 0.59375,\n },\n {\n x: 0.46875,\n y: 0.59375,\n },\n {\n x: 0.53125,\n y: 0.59375,\n },\n {\n x: 0.53125,\n y: 0.59375,\n },\n {\n x: 0.59375,\n y: 0.59375,\n },\n {\n x: 0.59375,\n y: 0.59375,\n },\n {\n x: 0.65625,\n y: 0.59375,\n },\n {\n x: 0.65625,\n y: 0.59375,\n },\n {\n x: 0.71875,\n y: 0.59375,\n },\n {\n x: 0.71875,\n y: 0.59375,\n },\n {\n x: 0.78125,\n y: 0.59375,\n },\n {\n x: 0.78125,\n y: 0.59375,\n },\n {\n x: 0.84375,\n y: 0.59375,\n },\n {\n x: 0.84375,\n y: 0.59375,\n },\n {\n x: 0.90625,\n y: 0.59375,\n },\n {\n x: 0.90625,\n y: 0.59375,\n },\n {\n x: 0.96875,\n y: 0.59375,\n },\n {\n x: 0.96875,\n y: 0.59375,\n },\n {\n x: 0.03125,\n y: 0.65625,\n },\n {\n x: 0.03125,\n y: 0.65625,\n },\n {\n x: 0.09375,\n y: 0.65625,\n },\n {\n x: 0.09375,\n y: 0.65625,\n },\n {\n x: 0.15625,\n y: 0.65625,\n },\n {\n x: 0.15625,\n y: 0.65625,\n },\n {\n x: 0.21875,\n y: 0.65625,\n },\n {\n x: 0.21875,\n y: 0.65625,\n },\n {\n x: 0.28125,\n y: 0.65625,\n },\n {\n x: 0.28125,\n y: 0.65625,\n },\n {\n x: 0.34375,\n y: 0.65625,\n },\n {\n x: 0.34375,\n y: 0.65625,\n },\n {\n x: 0.40625,\n y: 0.65625,\n },\n {\n x: 0.40625,\n y: 0.65625,\n },\n {\n x: 0.46875,\n y: 0.65625,\n },\n {\n x: 0.46875,\n y: 0.65625,\n },\n {\n x: 0.53125,\n y: 0.65625,\n },\n {\n x: 0.53125,\n y: 0.65625,\n },\n {\n x: 0.59375,\n y: 0.65625,\n },\n {\n x: 0.59375,\n y: 0.65625,\n },\n {\n x: 0.65625,\n y: 0.65625,\n },\n {\n x: 0.65625,\n y: 0.65625,\n },\n {\n x: 0.71875,\n y: 0.65625,\n },\n {\n x: 0.71875,\n y: 0.65625,\n },\n {\n x: 0.78125,\n y: 0.65625,\n },\n {\n x: 0.78125,\n y: 0.65625,\n },\n {\n x: 0.84375,\n y: 0.65625,\n },\n {\n x: 0.84375,\n y: 0.65625,\n },\n {\n x: 0.90625,\n y: 0.65625,\n },\n {\n x: 0.90625,\n y: 0.65625,\n },\n {\n x: 0.96875,\n y: 0.65625,\n },\n {\n x: 0.96875,\n y: 0.65625,\n },\n {\n x: 0.03125,\n y: 0.71875,\n },\n {\n x: 0.03125,\n y: 0.71875,\n },\n {\n x: 0.09375,\n y: 0.71875,\n },\n {\n x: 0.09375,\n y: 0.71875,\n },\n {\n x: 0.15625,\n y: 0.71875,\n },\n {\n x: 0.15625,\n y: 0.71875,\n },\n {\n x: 0.21875,\n y: 0.71875,\n },\n {\n x: 0.21875,\n y: 0.71875,\n },\n {\n x: 0.28125,\n y: 0.71875,\n },\n {\n x: 0.28125,\n y: 0.71875,\n },\n {\n x: 0.34375,\n y: 0.71875,\n },\n {\n x: 0.34375,\n y: 0.71875,\n },\n {\n x: 0.40625,\n y: 0.71875,\n },\n {\n x: 0.40625,\n y: 0.71875,\n },\n {\n x: 0.46875,\n y: 0.71875,\n },\n {\n x: 0.46875,\n y: 0.71875,\n },\n {\n x: 0.53125,\n y: 0.71875,\n },\n {\n x: 0.53125,\n y: 0.71875,\n },\n {\n x: 0.59375,\n y: 0.71875,\n },\n {\n x: 0.59375,\n y: 0.71875,\n },\n {\n x: 0.65625,\n y: 0.71875,\n },\n {\n x: 0.65625,\n y: 0.71875,\n },\n {\n x: 0.71875,\n y: 0.71875,\n },\n {\n x: 0.71875,\n y: 0.71875,\n },\n {\n x: 0.78125,\n y: 0.71875,\n },\n {\n x: 0.78125,\n y: 0.71875,\n },\n {\n x: 0.84375,\n y: 0.71875,\n },\n {\n x: 0.84375,\n y: 0.71875,\n },\n {\n x: 0.90625,\n y: 0.71875,\n },\n {\n x: 0.90625,\n y: 0.71875,\n },\n {\n x: 0.96875,\n y: 0.71875,\n },\n {\n x: 0.96875,\n y: 0.71875,\n },\n {\n x: 0.03125,\n y: 0.78125,\n },\n {\n x: 0.03125,\n y: 0.78125,\n },\n {\n x: 0.09375,\n y: 0.78125,\n },\n {\n x: 0.09375,\n y: 0.78125,\n },\n {\n x: 0.15625,\n y: 0.78125,\n },\n {\n x: 0.15625,\n y: 0.78125,\n },\n {\n x: 0.21875,\n y: 0.78125,\n },\n {\n x: 0.21875,\n y: 0.78125,\n },\n {\n x: 0.28125,\n y: 0.78125,\n },\n {\n x: 0.28125,\n y: 0.78125,\n },\n {\n x: 0.34375,\n y: 0.78125,\n },\n {\n x: 0.34375,\n y: 0.78125,\n },\n {\n x: 0.40625,\n y: 0.78125,\n },\n {\n x: 0.40625,\n y: 0.78125,\n },\n {\n x: 0.46875,\n y: 0.78125,\n },\n {\n x: 0.46875,\n y: 0.78125,\n },\n {\n x: 0.53125,\n y: 0.78125,\n },\n {\n x: 0.53125,\n y: 0.78125,\n },\n {\n x: 0.59375,\n y: 0.78125,\n },\n {\n x: 0.59375,\n y: 0.78125,\n },\n {\n x: 0.65625,\n y: 0.78125,\n },\n {\n x: 0.65625,\n y: 0.78125,\n },\n {\n x: 0.71875,\n y: 0.78125,\n },\n {\n x: 0.71875,\n y: 0.78125,\n },\n {\n x: 0.78125,\n y: 0.78125,\n },\n {\n x: 0.78125,\n y: 0.78125,\n },\n {\n x: 0.84375,\n y: 0.78125,\n },\n {\n x: 0.84375,\n y: 0.78125,\n },\n {\n x: 0.90625,\n y: 0.78125,\n },\n {\n x: 0.90625,\n y: 0.78125,\n },\n {\n x: 0.96875,\n y: 0.78125,\n },\n {\n x: 0.96875,\n y: 0.78125,\n },\n {\n x: 0.03125,\n y: 0.84375,\n },\n {\n x: 0.03125,\n y: 0.84375,\n },\n {\n x: 0.09375,\n y: 0.84375,\n },\n {\n x: 0.09375,\n y: 0.84375,\n },\n {\n x: 0.15625,\n y: 0.84375,\n },\n {\n x: 0.15625,\n y: 0.84375,\n },\n {\n x: 0.21875,\n y: 0.84375,\n },\n {\n x: 0.21875,\n y: 0.84375,\n },\n {\n x: 0.28125,\n y: 0.84375,\n },\n {\n x: 0.28125,\n y: 0.84375,\n },\n {\n x: 0.34375,\n y: 0.84375,\n },\n {\n x: 0.34375,\n y: 0.84375,\n },\n {\n x: 0.40625,\n y: 0.84375,\n },\n {\n x: 0.40625,\n y: 0.84375,\n },\n {\n x: 0.46875,\n y: 0.84375,\n },\n {\n x: 0.46875,\n y: 0.84375,\n },\n {\n x: 0.53125,\n y: 0.84375,\n },\n {\n x: 0.53125,\n y: 0.84375,\n },\n {\n x: 0.59375,\n y: 0.84375,\n },\n {\n x: 0.59375,\n y: 0.84375,\n },\n {\n x: 0.65625,\n y: 0.84375,\n },\n {\n x: 0.65625,\n y: 0.84375,\n },\n {\n x: 0.71875,\n y: 0.84375,\n },\n {\n x: 0.71875,\n y: 0.84375,\n },\n {\n x: 0.78125,\n y: 0.84375,\n },\n {\n x: 0.78125,\n y: 0.84375,\n },\n {\n x: 0.84375,\n y: 0.84375,\n },\n {\n x: 0.84375,\n y: 0.84375,\n },\n {\n x: 0.90625,\n y: 0.84375,\n },\n {\n x: 0.90625,\n y: 0.84375,\n },\n {\n x: 0.96875,\n y: 0.84375,\n },\n {\n x: 0.96875,\n y: 0.84375,\n },\n {\n x: 0.03125,\n y: 0.90625,\n },\n {\n x: 0.03125,\n y: 0.90625,\n },\n {\n x: 0.09375,\n y: 0.90625,\n },\n {\n x: 0.09375,\n y: 0.90625,\n },\n {\n x: 0.15625,\n y: 0.90625,\n },\n {\n x: 0.15625,\n y: 0.90625,\n },\n {\n x: 0.21875,\n y: 0.90625,\n },\n {\n x: 0.21875,\n y: 0.90625,\n },\n {\n x: 0.28125,\n y: 0.90625,\n },\n {\n x: 0.28125,\n y: 0.90625,\n },\n {\n x: 0.34375,\n y: 0.90625,\n },\n {\n x: 0.34375,\n y: 0.90625,\n },\n {\n x: 0.40625,\n y: 0.90625,\n },\n {\n x: 0.40625,\n y: 0.90625,\n },\n {\n x: 0.46875,\n y: 0.90625,\n },\n {\n x: 0.46875,\n y: 0.90625,\n },\n {\n x: 0.53125,\n y: 0.90625,\n },\n {\n x: 0.53125,\n y: 0.90625,\n },\n {\n x: 0.59375,\n y: 0.90625,\n },\n {\n x: 0.59375,\n y: 0.90625,\n },\n {\n x: 0.65625,\n y: 0.90625,\n },\n {\n x: 0.65625,\n y: 0.90625,\n },\n {\n x: 0.71875,\n y: 0.90625,\n },\n {\n x: 0.71875,\n y: 0.90625,\n },\n {\n x: 0.78125,\n y: 0.90625,\n },\n {\n x: 0.78125,\n y: 0.90625,\n },\n {\n x: 0.84375,\n y: 0.90625,\n },\n {\n x: 0.84375,\n y: 0.90625,\n },\n {\n x: 0.90625,\n y: 0.90625,\n },\n {\n x: 0.90625,\n y: 0.90625,\n },\n {\n x: 0.96875,\n y: 0.90625,\n },\n {\n x: 0.96875,\n y: 0.90625,\n },\n {\n x: 0.03125,\n y: 0.96875,\n },\n {\n x: 0.03125,\n y: 0.96875,\n },\n {\n x: 0.09375,\n y: 0.96875,\n },\n {\n x: 0.09375,\n y: 0.96875,\n },\n {\n x: 0.15625,\n y: 0.96875,\n },\n {\n x: 0.15625,\n y: 0.96875,\n },\n {\n x: 0.21875,\n y: 0.96875,\n },\n {\n x: 0.21875,\n y: 0.96875,\n },\n {\n x: 0.28125,\n y: 0.96875,\n },\n {\n x: 0.28125,\n y: 0.96875,\n },\n {\n x: 0.34375,\n y: 0.96875,\n },\n {\n x: 0.34375,\n y: 0.96875,\n },\n {\n x: 0.40625,\n y: 0.96875,\n },\n {\n x: 0.40625,\n y: 0.96875,\n },\n {\n x: 0.46875,\n y: 0.96875,\n },\n {\n x: 0.46875,\n y: 0.96875,\n },\n {\n x: 0.53125,\n y: 0.96875,\n },\n {\n x: 0.53125,\n y: 0.96875,\n },\n {\n x: 0.59375,\n y: 0.96875,\n },\n {\n x: 0.59375,\n y: 0.96875,\n },\n {\n x: 0.65625,\n y: 0.96875,\n },\n {\n x: 0.65625,\n y: 0.96875,\n },\n {\n x: 0.71875,\n y: 0.96875,\n },\n {\n x: 0.71875,\n y: 0.96875,\n },\n {\n x: 0.78125,\n y: 0.96875,\n },\n {\n x: 0.78125,\n y: 0.96875,\n },\n {\n x: 0.84375,\n y: 0.96875,\n },\n {\n x: 0.84375,\n y: 0.96875,\n },\n {\n x: 0.90625,\n y: 0.96875,\n },\n {\n x: 0.90625,\n y: 0.96875,\n },\n {\n x: 0.96875,\n y: 0.96875,\n },\n {\n x: 0.96875,\n y: 0.96875,\n },\n {\n x: 0.0625,\n y: 0.0625,\n },\n {\n x: 0.0625,\n y: 0.0625,\n },\n {\n x: 0.0625,\n y: 0.0625,\n },\n {\n x: 0.0625,\n y: 0.0625,\n },\n {\n x: 0.0625,\n y: 0.0625,\n },\n {\n x: 0.0625,\n y: 0.0625,\n },\n {\n x: 0.1875,\n y: 0.0625,\n },\n {\n x: 0.1875,\n y: 0.0625,\n },\n {\n x: 0.1875,\n y: 0.0625,\n },\n {\n x: 0.1875,\n y: 0.0625,\n },\n {\n x: 0.1875,\n y: 0.0625,\n },\n {\n x: 0.1875,\n y: 0.0625,\n },\n {\n x: 0.3125,\n y: 0.0625,\n },\n {\n x: 0.3125,\n y: 0.0625,\n },\n {\n x: 0.3125,\n y: 0.0625,\n },\n {\n x: 0.3125,\n y: 0.0625,\n },\n {\n x: 0.3125,\n y: 0.0625,\n },\n {\n x: 0.3125,\n y: 0.0625,\n },\n {\n x: 0.4375,\n y: 0.0625,\n },\n {\n x: 0.4375,\n y: 0.0625,\n },\n {\n x: 0.4375,\n y: 0.0625,\n },\n {\n x: 0.4375,\n y: 0.0625,\n },\n {\n x: 0.4375,\n y: 0.0625,\n },\n {\n x: 0.4375,\n y: 0.0625,\n },\n {\n x: 0.5625,\n y: 0.0625,\n },\n {\n x: 0.5625,\n y: 0.0625,\n },\n {\n x: 0.5625,\n y: 0.0625,\n },\n {\n x: 0.5625,\n y: 0.0625,\n },\n {\n x: 0.5625,\n y: 0.0625,\n },\n {\n x: 0.5625,\n y: 0.0625,\n },\n {\n x: 0.6875,\n y: 0.0625,\n },\n {\n x: 0.6875,\n y: 0.0625,\n },\n {\n x: 0.6875,\n y: 0.0625,\n },\n {\n x: 0.6875,\n y: 0.0625,\n },\n {\n x: 0.6875,\n y: 0.0625,\n },\n {\n x: 0.6875,\n y: 0.0625,\n },\n {\n x: 0.8125,\n y: 0.0625,\n },\n {\n x: 0.8125,\n y: 0.0625,\n },\n {\n x: 0.8125,\n y: 0.0625,\n },\n {\n x: 0.8125,\n y: 0.0625,\n },\n {\n x: 0.8125,\n y: 0.0625,\n },\n {\n x: 0.8125,\n y: 0.0625,\n },\n {\n x: 0.9375,\n y: 0.0625,\n },\n {\n x: 0.9375,\n y: 0.0625,\n },\n {\n x: 0.9375,\n y: 0.0625,\n },\n {\n x: 0.9375,\n y: 0.0625,\n },\n {\n x: 0.9375,\n y: 0.0625,\n },\n {\n x: 0.9375,\n y: 0.0625,\n },\n {\n x: 0.0625,\n y: 0.1875,\n },\n {\n x: 0.0625,\n y: 0.1875,\n },\n {\n x: 0.0625,\n y: 0.1875,\n },\n {\n x: 0.0625,\n y: 0.1875,\n },\n {\n x: 0.0625,\n y: 0.1875,\n },\n {\n x: 0.0625,\n y: 0.1875,\n },\n {\n x: 0.1875,\n y: 0.1875,\n },\n {\n x: 0.1875,\n y: 0.1875,\n },\n {\n x: 0.1875,\n y: 0.1875,\n },\n {\n x: 0.1875,\n y: 0.1875,\n },\n {\n x: 0.1875,\n y: 0.1875,\n },\n {\n x: 0.1875,\n y: 0.1875,\n },\n {\n x: 0.3125,\n y: 0.1875,\n },\n {\n x: 0.3125,\n y: 0.1875,\n },\n {\n x: 0.3125,\n y: 0.1875,\n },\n {\n x: 0.3125,\n y: 0.1875,\n },\n {\n x: 0.3125,\n y: 0.1875,\n },\n {\n x: 0.3125,\n y: 0.1875,\n },\n {\n x: 0.4375,\n y: 0.1875,\n },\n {\n x: 0.4375,\n y: 0.1875,\n },\n {\n x: 0.4375,\n y: 0.1875,\n },\n {\n x: 0.4375,\n y: 0.1875,\n },\n {\n x: 0.4375,\n y: 0.1875,\n },\n {\n x: 0.4375,\n y: 0.1875,\n },\n {\n x: 0.5625,\n y: 0.1875,\n },\n {\n x: 0.5625,\n y: 0.1875,\n },\n {\n x: 0.5625,\n y: 0.1875,\n },\n {\n x: 0.5625,\n y: 0.1875,\n },\n {\n x: 0.5625,\n y: 0.1875,\n },\n {\n x: 0.5625,\n y: 0.1875,\n },\n {\n x: 0.6875,\n y: 0.1875,\n },\n {\n x: 0.6875,\n y: 0.1875,\n },\n {\n x: 0.6875,\n y: 0.1875,\n },\n {\n x: 0.6875,\n y: 0.1875,\n },\n {\n x: 0.6875,\n y: 0.1875,\n },\n {\n x: 0.6875,\n y: 0.1875,\n },\n {\n x: 0.8125,\n y: 0.1875,\n },\n {\n x: 0.8125,\n y: 0.1875,\n },\n {\n x: 0.8125,\n y: 0.1875,\n },\n {\n x: 0.8125,\n y: 0.1875,\n },\n {\n x: 0.8125,\n y: 0.1875,\n },\n {\n x: 0.8125,\n y: 0.1875,\n },\n {\n x: 0.9375,\n y: 0.1875,\n },\n {\n x: 0.9375,\n y: 0.1875,\n },\n {\n x: 0.9375,\n y: 0.1875,\n },\n {\n x: 0.9375,\n y: 0.1875,\n },\n {\n x: 0.9375,\n y: 0.1875,\n },\n {\n x: 0.9375,\n y: 0.1875,\n },\n {\n x: 0.0625,\n y: 0.3125,\n },\n {\n x: 0.0625,\n y: 0.3125,\n },\n {\n x: 0.0625,\n y: 0.3125,\n },\n {\n x: 0.0625,\n y: 0.3125,\n },\n {\n x: 0.0625,\n y: 0.3125,\n },\n {\n x: 0.0625,\n y: 0.3125,\n },\n {\n x: 0.1875,\n y: 0.3125,\n },\n {\n x: 0.1875,\n y: 0.3125,\n },\n {\n x: 0.1875,\n y: 0.3125,\n },\n {\n x: 0.1875,\n y: 0.3125,\n },\n {\n x: 0.1875,\n y: 0.3125,\n },\n {\n x: 0.1875,\n y: 0.3125,\n },\n {\n x: 0.3125,\n y: 0.3125,\n },\n {\n x: 0.3125,\n y: 0.3125,\n },\n {\n x: 0.3125,\n y: 0.3125,\n },\n {\n x: 0.3125,\n y: 0.3125,\n },\n {\n x: 0.3125,\n y: 0.3125,\n },\n {\n x: 0.3125,\n y: 0.3125,\n },\n {\n x: 0.4375,\n y: 0.3125,\n },\n {\n x: 0.4375,\n y: 0.3125,\n },\n {\n x: 0.4375,\n y: 0.3125,\n },\n {\n x: 0.4375,\n y: 0.3125,\n },\n {\n x: 0.4375,\n y: 0.3125,\n },\n {\n x: 0.4375,\n y: 0.3125,\n },\n {\n x: 0.5625,\n y: 0.3125,\n },\n {\n x: 0.5625,\n y: 0.3125,\n },\n {\n x: 0.5625,\n y: 0.3125,\n },\n {\n x: 0.5625,\n y: 0.3125,\n },\n {\n x: 0.5625,\n y: 0.3125,\n },\n {\n x: 0.5625,\n y: 0.3125,\n },\n {\n x: 0.6875,\n y: 0.3125,\n },\n {\n x: 0.6875,\n y: 0.3125,\n },\n {\n x: 0.6875,\n y: 0.3125,\n },\n {\n x: 0.6875,\n y: 0.3125,\n },\n {\n x: 0.6875,\n y: 0.3125,\n },\n {\n x: 0.6875,\n y: 0.3125,\n },\n {\n x: 0.8125,\n y: 0.3125,\n },\n {\n x: 0.8125,\n y: 0.3125,\n },\n {\n x: 0.8125,\n y: 0.3125,\n },\n {\n x: 0.8125,\n y: 0.3125,\n },\n {\n x: 0.8125,\n y: 0.3125,\n },\n {\n x: 0.8125,\n y: 0.3125,\n },\n {\n x: 0.9375,\n y: 0.3125,\n },\n {\n x: 0.9375,\n y: 0.3125,\n },\n {\n x: 0.9375,\n y: 0.3125,\n },\n {\n x: 0.9375,\n y: 0.3125,\n },\n {\n x: 0.9375,\n y: 0.3125,\n },\n {\n x: 0.9375,\n y: 0.3125,\n },\n {\n x: 0.0625,\n y: 0.4375,\n },\n {\n x: 0.0625,\n y: 0.4375,\n },\n {\n x: 0.0625,\n y: 0.4375,\n },\n {\n x: 0.0625,\n y: 0.4375,\n },\n {\n x: 0.0625,\n y: 0.4375,\n },\n {\n x: 0.0625,\n y: 0.4375,\n },\n {\n x: 0.1875,\n y: 0.4375,\n },\n {\n x: 0.1875,\n y: 0.4375,\n },\n {\n x: 0.1875,\n y: 0.4375,\n },\n {\n x: 0.1875,\n y: 0.4375,\n },\n {\n x: 0.1875,\n y: 0.4375,\n },\n {\n x: 0.1875,\n y: 0.4375,\n },\n {\n x: 0.3125,\n y: 0.4375,\n },\n {\n x: 0.3125,\n y: 0.4375,\n },\n {\n x: 0.3125,\n y: 0.4375,\n },\n {\n x: 0.3125,\n y: 0.4375,\n },\n {\n x: 0.3125,\n y: 0.4375,\n },\n {\n x: 0.3125,\n y: 0.4375,\n },\n {\n x: 0.4375,\n y: 0.4375,\n },\n {\n x: 0.4375,\n y: 0.4375,\n },\n {\n x: 0.4375,\n y: 0.4375,\n },\n {\n x: 0.4375,\n y: 0.4375,\n },\n {\n x: 0.4375,\n y: 0.4375,\n },\n {\n x: 0.4375,\n y: 0.4375,\n },\n {\n x: 0.5625,\n y: 0.4375,\n },\n {\n x: 0.5625,\n y: 0.4375,\n },\n {\n x: 0.5625,\n y: 0.4375,\n },\n {\n x: 0.5625,\n y: 0.4375,\n },\n {\n x: 0.5625,\n y: 0.4375,\n },\n {\n x: 0.5625,\n y: 0.4375,\n },\n {\n x: 0.6875,\n y: 0.4375,\n },\n {\n x: 0.6875,\n y: 0.4375,\n },\n {\n x: 0.6875,\n y: 0.4375,\n },\n {\n x: 0.6875,\n y: 0.4375,\n },\n {\n x: 0.6875,\n y: 0.4375,\n },\n {\n x: 0.6875,\n y: 0.4375,\n },\n {\n x: 0.8125,\n y: 0.4375,\n },\n {\n x: 0.8125,\n y: 0.4375,\n },\n {\n x: 0.8125,\n y: 0.4375,\n },\n {\n x: 0.8125,\n y: 0.4375,\n },\n {\n x: 0.8125,\n y: 0.4375,\n },\n {\n x: 0.8125,\n y: 0.4375,\n },\n {\n x: 0.9375,\n y: 0.4375,\n },\n {\n x: 0.9375,\n y: 0.4375,\n },\n {\n x: 0.9375,\n y: 0.4375,\n },\n {\n x: 0.9375,\n y: 0.4375,\n },\n {\n x: 0.9375,\n y: 0.4375,\n },\n {\n x: 0.9375,\n y: 0.4375,\n },\n {\n x: 0.0625,\n y: 0.5625,\n },\n {\n x: 0.0625,\n y: 0.5625,\n },\n {\n x: 0.0625,\n y: 0.5625,\n },\n {\n x: 0.0625,\n y: 0.5625,\n },\n {\n x: 0.0625,\n y: 0.5625,\n },\n {\n x: 0.0625,\n y: 0.5625,\n },\n {\n x: 0.1875,\n y: 0.5625,\n },\n {\n x: 0.1875,\n y: 0.5625,\n },\n {\n x: 0.1875,\n y: 0.5625,\n },\n {\n x: 0.1875,\n y: 0.5625,\n },\n {\n x: 0.1875,\n y: 0.5625,\n },\n {\n x: 0.1875,\n y: 0.5625,\n },\n {\n x: 0.3125,\n y: 0.5625,\n },\n {\n x: 0.3125,\n y: 0.5625,\n },\n {\n x: 0.3125,\n y: 0.5625,\n },\n {\n x: 0.3125,\n y: 0.5625,\n },\n {\n x: 0.3125,\n y: 0.5625,\n },\n {\n x: 0.3125,\n y: 0.5625,\n },\n {\n x: 0.4375,\n y: 0.5625,\n },\n {\n x: 0.4375,\n y: 0.5625,\n },\n {\n x: 0.4375,\n y: 0.5625,\n },\n {\n x: 0.4375,\n y: 0.5625,\n },\n {\n x: 0.4375,\n y: 0.5625,\n },\n {\n x: 0.4375,\n y: 0.5625,\n },\n {\n x: 0.5625,\n y: 0.5625,\n },\n {\n x: 0.5625,\n y: 0.5625,\n },\n {\n x: 0.5625,\n y: 0.5625,\n },\n {\n x: 0.5625,\n y: 0.5625,\n },\n {\n x: 0.5625,\n y: 0.5625,\n },\n {\n x: 0.5625,\n y: 0.5625,\n },\n {\n x: 0.6875,\n y: 0.5625,\n },\n {\n x: 0.6875,\n y: 0.5625,\n },\n {\n x: 0.6875,\n y: 0.5625,\n },\n {\n x: 0.6875,\n y: 0.5625,\n },\n {\n x: 0.6875,\n y: 0.5625,\n },\n {\n x: 0.6875,\n y: 0.5625,\n },\n {\n x: 0.8125,\n y: 0.5625,\n },\n {\n x: 0.8125,\n y: 0.5625,\n },\n {\n x: 0.8125,\n y: 0.5625,\n },\n {\n x: 0.8125,\n y: 0.5625,\n },\n {\n x: 0.8125,\n y: 0.5625,\n },\n {\n x: 0.8125,\n y: 0.5625,\n },\n {\n x: 0.9375,\n y: 0.5625,\n },\n {\n x: 0.9375,\n y: 0.5625,\n },\n {\n x: 0.9375,\n y: 0.5625,\n },\n {\n x: 0.9375,\n y: 0.5625,\n },\n {\n x: 0.9375,\n y: 0.5625,\n },\n {\n x: 0.9375,\n y: 0.5625,\n },\n {\n x: 0.0625,\n y: 0.6875,\n },\n {\n x: 0.0625,\n y: 0.6875,\n },\n {\n x: 0.0625,\n y: 0.6875,\n },\n {\n x: 0.0625,\n y: 0.6875,\n },\n {\n x: 0.0625,\n y: 0.6875,\n },\n {\n x: 0.0625,\n y: 0.6875,\n },\n {\n x: 0.1875,\n y: 0.6875,\n },\n {\n x: 0.1875,\n y: 0.6875,\n },\n {\n x: 0.1875,\n y: 0.6875,\n },\n {\n x: 0.1875,\n y: 0.6875,\n },\n {\n x: 0.1875,\n y: 0.6875,\n },\n {\n x: 0.1875,\n y: 0.6875,\n },\n {\n x: 0.3125,\n y: 0.6875,\n },\n {\n x: 0.3125,\n y: 0.6875,\n },\n {\n x: 0.3125,\n y: 0.6875,\n },\n {\n x: 0.3125,\n y: 0.6875,\n },\n {\n x: 0.3125,\n y: 0.6875,\n },\n {\n x: 0.3125,\n y: 0.6875,\n },\n {\n x: 0.4375,\n y: 0.6875,\n },\n {\n x: 0.4375,\n y: 0.6875,\n },\n {\n x: 0.4375,\n y: 0.6875,\n },\n {\n x: 0.4375,\n y: 0.6875,\n },\n {\n x: 0.4375,\n y: 0.6875,\n },\n {\n x: 0.4375,\n y: 0.6875,\n },\n {\n x: 0.5625,\n y: 0.6875,\n },\n {\n x: 0.5625,\n y: 0.6875,\n },\n {\n x: 0.5625,\n y: 0.6875,\n },\n {\n x: 0.5625,\n y: 0.6875,\n },\n {\n x: 0.5625,\n y: 0.6875,\n },\n {\n x: 0.5625,\n y: 0.6875,\n },\n {\n x: 0.6875,\n y: 0.6875,\n },\n {\n x: 0.6875,\n y: 0.6875,\n },\n {\n x: 0.6875,\n y: 0.6875,\n },\n {\n x: 0.6875,\n y: 0.6875,\n },\n {\n x: 0.6875,\n y: 0.6875,\n },\n {\n x: 0.6875,\n y: 0.6875,\n },\n {\n x: 0.8125,\n y: 0.6875,\n },\n {\n x: 0.8125,\n y: 0.6875,\n },\n {\n x: 0.8125,\n y: 0.6875,\n },\n {\n x: 0.8125,\n y: 0.6875,\n },\n {\n x: 0.8125,\n y: 0.6875,\n },\n {\n x: 0.8125,\n y: 0.6875,\n },\n {\n x: 0.9375,\n y: 0.6875,\n },\n {\n x: 0.9375,\n y: 0.6875,\n },\n {\n x: 0.9375,\n y: 0.6875,\n },\n {\n x: 0.9375,\n y: 0.6875,\n },\n {\n x: 0.9375,\n y: 0.6875,\n },\n {\n x: 0.9375,\n y: 0.6875,\n },\n {\n x: 0.0625,\n y: 0.8125,\n },\n {\n x: 0.0625,\n y: 0.8125,\n },\n {\n x: 0.0625,\n y: 0.8125,\n },\n {\n x: 0.0625,\n y: 0.8125,\n },\n {\n x: 0.0625,\n y: 0.8125,\n },\n {\n x: 0.0625,\n y: 0.8125,\n },\n {\n x: 0.1875,\n y: 0.8125,\n },\n {\n x: 0.1875,\n y: 0.8125,\n },\n {\n x: 0.1875,\n y: 0.8125,\n },\n {\n x: 0.1875,\n y: 0.8125,\n },\n {\n x: 0.1875,\n y: 0.8125,\n },\n {\n x: 0.1875,\n y: 0.8125,\n },\n {\n x: 0.3125,\n y: 0.8125,\n },\n {\n x: 0.3125,\n y: 0.8125,\n },\n {\n x: 0.3125,\n y: 0.8125,\n },\n {\n x: 0.3125,\n y: 0.8125,\n },\n {\n x: 0.3125,\n y: 0.8125,\n },\n {\n x: 0.3125,\n y: 0.8125,\n },\n {\n x: 0.4375,\n y: 0.8125,\n },\n {\n x: 0.4375,\n y: 0.8125,\n },\n {\n x: 0.4375,\n y: 0.8125,\n },\n {\n x: 0.4375,\n y: 0.8125,\n },\n {\n x: 0.4375,\n y: 0.8125,\n },\n {\n x: 0.4375,\n y: 0.8125,\n },\n {\n x: 0.5625,\n y: 0.8125,\n },\n {\n x: 0.5625,\n y: 0.8125,\n },\n {\n x: 0.5625,\n y: 0.8125,\n },\n {\n x: 0.5625,\n y: 0.8125,\n },\n {\n x: 0.5625,\n y: 0.8125,\n },\n {\n x: 0.5625,\n y: 0.8125,\n },\n {\n x: 0.6875,\n y: 0.8125,\n },\n {\n x: 0.6875,\n y: 0.8125,\n },\n {\n x: 0.6875,\n y: 0.8125,\n },\n {\n x: 0.6875,\n y: 0.8125,\n },\n {\n x: 0.6875,\n y: 0.8125,\n },\n {\n x: 0.6875,\n y: 0.8125,\n },\n {\n x: 0.8125,\n y: 0.8125,\n },\n {\n x: 0.8125,\n y: 0.8125,\n },\n {\n x: 0.8125,\n y: 0.8125,\n },\n {\n x: 0.8125,\n y: 0.8125,\n },\n {\n x: 0.8125,\n y: 0.8125,\n },\n {\n x: 0.8125,\n y: 0.8125,\n },\n {\n x: 0.9375,\n y: 0.8125,\n },\n {\n x: 0.9375,\n y: 0.8125,\n },\n {\n x: 0.9375,\n y: 0.8125,\n },\n {\n x: 0.9375,\n y: 0.8125,\n },\n {\n x: 0.9375,\n y: 0.8125,\n },\n {\n x: 0.9375,\n y: 0.8125,\n },\n {\n x: 0.0625,\n y: 0.9375,\n },\n {\n x: 0.0625,\n y: 0.9375,\n },\n {\n x: 0.0625,\n y: 0.9375,\n },\n {\n x: 0.0625,\n y: 0.9375,\n },\n {\n x: 0.0625,\n y: 0.9375,\n },\n {\n x: 0.0625,\n y: 0.9375,\n },\n {\n x: 0.1875,\n y: 0.9375,\n },\n {\n x: 0.1875,\n y: 0.9375,\n },\n {\n x: 0.1875,\n y: 0.9375,\n },\n {\n x: 0.1875,\n y: 0.9375,\n },\n {\n x: 0.1875,\n y: 0.9375,\n },\n {\n x: 0.1875,\n y: 0.9375,\n },\n {\n x: 0.3125,\n y: 0.9375,\n },\n {\n x: 0.3125,\n y: 0.9375,\n },\n {\n x: 0.3125,\n y: 0.9375,\n },\n {\n x: 0.3125,\n y: 0.9375,\n },\n {\n x: 0.3125,\n y: 0.9375,\n },\n {\n x: 0.3125,\n y: 0.9375,\n },\n {\n x: 0.4375,\n y: 0.9375,\n },\n {\n x: 0.4375,\n y: 0.9375,\n },\n {\n x: 0.4375,\n y: 0.9375,\n },\n {\n x: 0.4375,\n y: 0.9375,\n },\n {\n x: 0.4375,\n y: 0.9375,\n },\n {\n x: 0.4375,\n y: 0.9375,\n },\n {\n x: 0.5625,\n y: 0.9375,\n },\n {\n x: 0.5625,\n y: 0.9375,\n },\n {\n x: 0.5625,\n y: 0.9375,\n },\n {\n x: 0.5625,\n y: 0.9375,\n },\n {\n x: 0.5625,\n y: 0.9375,\n },\n {\n x: 0.5625,\n y: 0.9375,\n },\n {\n x: 0.6875,\n y: 0.9375,\n },\n {\n x: 0.6875,\n y: 0.9375,\n },\n {\n x: 0.6875,\n y: 0.9375,\n },\n {\n x: 0.6875,\n y: 0.9375,\n },\n {\n x: 0.6875,\n y: 0.9375,\n },\n {\n x: 0.6875,\n y: 0.9375,\n },\n {\n x: 0.8125,\n y: 0.9375,\n },\n {\n x: 0.8125,\n y: 0.9375,\n },\n {\n x: 0.8125,\n y: 0.9375,\n },\n {\n x: 0.8125,\n y: 0.9375,\n },\n {\n x: 0.8125,\n y: 0.9375,\n },\n {\n x: 0.8125,\n y: 0.9375,\n },\n {\n x: 0.9375,\n y: 0.9375,\n },\n {\n x: 0.9375,\n y: 0.9375,\n },\n {\n x: 0.9375,\n y: 0.9375,\n },\n {\n x: 0.9375,\n y: 0.9375,\n },\n {\n x: 0.9375,\n y: 0.9375,\n },\n {\n x: 0.9375,\n y: 0.9375,\n },\n];\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as box from './box';\nimport * as anchors from './anchors';\n\nexport class HandDetector {\n model: any;\n anchors: any;\n anchorsTensor: any;\n inputSize: number;\n inputSizeTensor: any;\n doubleInputSizeTensor: any;\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?.inputs[0].shape[2];\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(rawPalmLandmarks.reshape([-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 batched = this.model.predict(input);\n const predictions = batched.squeeze();\n batched.dispose();\n const scoresT = tf.tidy(() => tf.sigmoid(tf.slice(predictions, [0, 0], [-1, 1])).squeeze());\n const scores = scoresT.dataSync();\n const rawBoxes = tf.slice(predictions, [0, 1], [-1, 4]);\n const boxes = this.normalizeBoxes(rawBoxes);\n rawBoxes.dispose();\n const filteredT = await tf.image.nonMaxSuppressionAsync(boxes, scores, config.hand.maxDetected, config.hand.iouThreshold, config.hand.minConfidence);\n const filtered = filteredT.arraySync();\n\n scoresT.dispose();\n filteredT.dispose();\n const hands: Array<{ box: any, palmLandmarks: any, confidence: number }> = [];\n for (const index of filtered) {\n if (scores[index] >= config.hand.minConfidence) {\n const matchingBox = tf.slice(boxes, [index, 0], [1, -1]);\n const rawPalmLandmarks = tf.slice(predictions, [index, 5], [1, 14]);\n const palmLandmarks = tf.tidy(() => this.normalizeLandmarks(rawPalmLandmarks, index).reshape([-1, 2]));\n rawPalmLandmarks.dispose();\n hands.push({ box: matchingBox, palmLandmarks, confidence: scores[index] });\n }\n }\n predictions.dispose();\n boxes.dispose();\n return hands;\n }\n\n async estimateHandBounds(input, config) {\n const inputHeight = input.shape[1];\n const inputWidth = input.shape[2];\n const image = tf.tidy(() => input.resizeBilinear([this.inputSize, this.inputSize]).div(127.5).sub(1));\n const predictions = await this.getBoxes(image, config);\n image.dispose();\n const hands: Array<{}> = [];\n if (!predictions || predictions.length === 0) return hands;\n for (const prediction of predictions) {\n const boxes = prediction.box.dataSync();\n const startPoint = boxes.slice(0, 2);\n const endPoint = boxes.slice(2, 4);\n const palmLandmarks = prediction.palmLandmarks.arraySync();\n prediction.box.dispose();\n prediction.palmLandmarks.dispose();\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';\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: any;\n landmarkDetector: any;\n inputSize: number;\n storedBoxes: any;\n skipped: number;\n detectedHands: number;\n\n constructor(handDetector, landmarkDetector) {\n this.handDetector = handDetector;\n this.landmarkDetector = landmarkDetector;\n this.inputSize = this.landmarkDetector?.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 coord[0] + originalBoxCenter[0],\n coord[1] + originalBoxCenter[1],\n 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 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<{}> = [];\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.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 = croppedInput.div(255);\n croppedInput.dispose();\n rotatedImage.dispose();\n const [confidenceT, keypoints] = await this.landmarkDetector.predict(handImage);\n handImage.dispose();\n const confidence = confidenceT.dataSync()[0];\n confidenceT.dispose();\n if (confidence >= config.hand.minConfidence) {\n const keypointsReshaped = tf.reshape(keypoints, [-1, 3]);\n const rawCoords = keypointsReshaped.arraySync();\n keypoints.dispose();\n keypointsReshaped.dispose();\n const coords = this.transformRawCoords(rawCoords, newBox, angle, rotationMatrix);\n const nextBoundingBox = this.getBoxForHandLandmarks(coords);\n this.storedBoxes[i] = nextBoundingBox;\n const result = {\n landmarks: coords,\n confidence,\n box: { topLeft: nextBoundingBox.startPoint, bottomRight: nextBoundingBox.endPoint },\n };\n hands.push(result);\n } else {\n this.storedBoxes[i] = null;\n }\n keypoints.dispose();\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", "// 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';\n\nlet model;\n\nexport async function load(config) {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.body.modelPath));\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, config) {\n if (!model) return null;\n if (!config.body.enabled) return null;\n const imgSize = { width: image.shape[2], height: image.shape[1] };\n const resize = tf.image.resizeBilinear(image, [model.width, model.height], false);\n const normalize = tf.div(resize, [255.0]);\n resize.dispose();\n const resT = await model.predict(normalize);\n const points = resT.find((t) => (t.size === 195 || t.size === 155)).dataSync(); // order of output tensors may change between models, full has 195 and upper has 155 items\n resT.forEach((t) => t.dispose());\n normalize.dispose();\n const keypoints: Array<{ id, part, position: { x, y, z }, 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 x: Math.trunc(imgSize.width * points[depth * i + 0] / 255), // return normalized x value istead of 0..255\n y: Math.trunc(imgSize.height * points[depth * i + 1] / 255), // return normalized y value istead of 0..255\n z: Math.trunc(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 score = keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);\n return [{ score, keypoints }];\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", "import { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { labels } from './labels';\nimport { Item } from '../result';\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) {\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<{ score: number, strideSize: number, class: number, label: string, center: number[], centerRaw: number[], box: number[], boxRaw: number[] }> = [];\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(() => { // 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 = boxesMax.argMax(2).arraySync(); // what we need is indexes of features with highest scores, not values itself\n const scores = scoresT.arraySync(); // 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)),\n boxRaw,\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: any[] = [];\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 = nms.dataSync();\n tf.dispose(nms);\n }\n\n // filter & sort results\n results = results\n .filter((a, idx) => nmsIdx.includes(idx))\n .sort((a, b) => (b.score - a.score));\n\n return results;\n}\n\nexport async function predict(image, 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 = resize.div(255);\n const transpose = norm.transpose([0, 3, 1, 2]);\n norm.dispose();\n resize.dispose();\n\n let objectT;\n if (config.object.enabled) objectT = await model.predict(transpose);\n transpose.dispose();\n\n const obj = await process(objectT, model.inputSize, outputSize, config);\n last = obj;\n resolve(obj);\n });\n}\n", "export 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", "import { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { labels } from './labels';\nimport { Item } from '../result';\n\nlet model;\nlet last: Item[] = [];\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config) {\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 const results: Array<{ score: number, class: number, label: string, box: number[], boxRaw: number[] }> = [];\n const detections = res.arraySync();\n const squeezeT = tf.squeeze(res);\n res.dispose();\n const arr = tf.split(squeezeT, 6, 1); // x1, y1, x2, y2, score, class\n squeezeT.dispose();\n const stackT = tf.stack([arr[1], arr[0], arr[3], arr[2]], 1); // tf.nms expects y, x\n const boxesT = stackT.squeeze();\n const scoresT = arr[4].squeeze();\n const classesT = arr[5].squeeze();\n arr.forEach((t) => t.dispose());\n // @ts-ignore boxesT type is not correctly inferred\n const nmsT = await tf.image.nonMaxSuppressionAsync(boxesT, scoresT, config.object.maxDetected, config.object.iouThreshold, config.object.minConfidence);\n boxesT.dispose();\n scoresT.dispose();\n classesT.dispose();\n const nms = nmsT.dataSync();\n nmsT.dispose();\n for (const id of nms) {\n const score = detections[0][id][4];\n const classVal = detections[0][id][5];\n const label = labels[classVal].label;\n const boxRaw = [\n detections[0][id][0] / inputSize,\n detections[0][id][1] / inputSize,\n detections[0][id][2] / inputSize,\n detections[0][id][3] / inputSize,\n ];\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 ];\n results.push({ score, class: classVal, label, box, boxRaw });\n }\n return results;\n}\n\nexport async function predict(image, 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\n let objectT;\n if (config.object.enabled) objectT = model.execute(resize, 'tower_0/detections');\n resize.dispose();\n\n const obj = await process(objectT, model.inputSize, outputSize, config);\n last = obj;\n resolve(obj);\n });\n}\n", "import { Gesture } from '../result';\n\nexport const body = (res): Gesture[] => {\n if (!res) return [];\n const gestures: Array<{ body: number, gesture: string }> = [];\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: string }> = [];\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: string }> = [];\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].annotations.rightEyeIris[0][0];\n const leftIrisCenterX = Math.abs(res[i].mesh[263][0] - res[i].annotations.leftEyeIris[0][0]) / res[i].annotations.leftEyeIris[0][0];\n if (leftIrisCenterX > 0.033 || rightIrisCenterX > 0.033) center = false;\n if (leftIrisCenterX > 0.033) gestures.push({ iris: i, gesture: 'looking right' });\n if (rightIrisCenterX > 0.033) 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].annotations.rightEyeIris[0][1];\n const leftIrisCenterY = Math.abs(res[i].mesh[374][1] - res[i].annotations.leftEyeIris[0][1]) / res[i].annotations.leftEyeIris[0][1];\n if (leftIrisCenterY < 0.015 || rightIrisCenterY < 0.015 || leftIrisCenterY > 0.030 || rightIrisCenterY > 0.030) center = false;\n if (leftIrisCenterY < 0.015 || rightIrisCenterY < 0.015) gestures.push({ iris: i, gesture: 'looking down' });\n if (leftIrisCenterY > 0.030 || rightIrisCenterY > 0.030) 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: string }> = [];\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 const highest = fingers.reduce((best, a) => (best.position[1] < a.position[1] ? best : a));\n gestures.push({ hand: i, gesture: `${closest.name} forward ${highest.name} up` });\n }\n }\n return gestures;\n};\n", "/*\nWebGLImageFilter - MIT Licensed\n2013, Dominic Szablewski - phoboslab.org\n\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", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as fxImage from './imagefx';\n\nconst maxSize = 2048;\n// internal temp canvases\nlet inCanvas;\nlet outCanvas;\n// instance of fximage\nlet fx;\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, config): { tensor: typeof tf.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 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 }\n */\n } else {\n outCanvas = inCanvas;\n if (fx) fx = null;\n }\n\n // create tensor from image\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.fromPixels(outCanvas);\n } else if (config.backend === 'webgl' || config.backend === 'humangl') { // tf kernel-optimized method to get imagedata\n // we can 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.fromPixels(tempCanvas);\n } else { // cpu and wasm kernel does not implement efficient fromPixels method\n // we can 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 const data = tempCtx?.getImageData(0, 0, targetWidth, targetHeight);\n pixels = tf.browser.fromPixels(data);\n }\n const casted = pixels.toFloat();\n tensor = casted.expandDims(0);\n pixels.dispose();\n casted.dispose();\n }\n const canvas = config.filter.return ? outCanvas : null;\n return { tensor, canvas };\n}\n", "import { TRI468 as triangulation } from '../blazeface/coords';\nimport { mergeDeep } from '../helpers';\nimport type { Result, Face, Body, Hand, Item, Gesture } 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 * -useRawBoxes: Boolean: internal: use non-normalized coordinates when performing draw methods,\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 fillPolygons: Boolean,\n useDepth: Boolean,\n useCurves: Boolean,\n bufferedOutput: Boolean,\n useRawBoxes: Boolean,\n calculateHandBox: Boolean,\n}\n\nexport const options: DrawOptions = {\n color: 'rgba(173, 216, 230, 0.3)', // 'lightblue' with light alpha channel\n labelColor: 'rgba(173, 216, 230, 1)', // 'lightblue' with dark alpha channel\n shadowColor: 'black',\n font: 'small-caps 16px \"Segoe UI\"',\n lineHeight: 24,\n lineWidth: 6,\n pointSize: 2,\n roundRect: 28,\n drawPoints: false,\n drawLabels: true,\n drawBoxes: true,\n drawPolygons: true,\n fillPolygons: false,\n useDepth: true,\n useCurves: false,\n bufferedOutput: true,\n useRawBoxes: false,\n calculateHandBox: true,\n};\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 ctx.strokeStyle = localOptions.useDepth && pt[2] ? `rgba(${127.5 + (2 * pt[2])}, ${127.5 - (2 * pt[2])}, 255, 0.3)` : localOptions.color;\n ctx.fillStyle = localOptions.useDepth && pt[2] ? `rgba(${127.5 + (2 * pt[2])}, ${127.5 - (2 * pt[2])}, 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 if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\n if (!ctx) return;\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:any[] = [];\n let what:any[] = [];\n [where, what] = Object.entries(result[j]);\n if ((what.length > 1) && (what[1].length > 0)) {\n const person = where[1] > 0 ? `#${where[1]}` : '';\n const label = `${where[0]} ${person}: ${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 if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\n if (!ctx) return;\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) {\n if (localOptions.useRawBoxes) rect(ctx, inCanvas.width * f.boxRaw[0], inCanvas.height * f.boxRaw[1], inCanvas.width * f.boxRaw[2], inCanvas.height * f.boxRaw[3], localOptions);\n else rect(ctx, f.box[0], f.box[1], f.box[2], f.box[3], localOptions);\n }\n // silly hack since fillText does not suport new line\n const labels:string[] = [];\n labels.push(`face confidence: ${Math.trunc(100 * f.confidence)}%`);\n if (f.genderConfidence) labels.push(`${f.gender || ''} ${Math.trunc(100 * f.genderConfidence)}% confident`);\n // if (f.genderConfidence) labels.push(f.gender);\n if (f.age) labels.push(`age: ${f.age || ''}`);\n if (f.iris) labels.push(`iris 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 labels.push(emotion.join(' '));\n }\n if (f.rotation && f.rotation.angle && f.rotation.angle.roll) labels.push(`roll: ${Math.trunc(100 * f.rotation.angle.roll) / 100} yaw:${Math.trunc(100 * f.rotation.angle.yaw) / 100} pitch:${Math.trunc(100 * f.rotation.angle.pitch) / 100}`);\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 }\n }\n }\n}\n\nconst lastDrawnPose:any[] = [];\nexport async function body(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\n if (!ctx) return;\n ctx.lineJoin = 'round';\n for (let i = 0; i < result.length; i++) {\n if (!lastDrawnPose[i] && localOptions.bufferedOutput) lastDrawnPose[i] = { ...result[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 // @ts-ignore box may not exist\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 // @ts-ignore box may not exist\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 // @ts-ignore box may not exist\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.z ? `rgba(${127.5 + (2 * result[i].keypoints[pt].position.z)}, ${127.5 - (2 * result[i].keypoints[pt].position.z)}, 255, 0.5)` : localOptions.color;\n if (localOptions.bufferedOutput) {\n lastDrawnPose[i].keypoints[pt][0] = (lastDrawnPose[i].keypoints[pt][0] + result[i].keypoints[pt].position.x) / 2;\n lastDrawnPose[i].keypoints[pt][1] = (lastDrawnPose[i].keypoints[pt][1] + result[i].keypoints[pt].position.y) / 2;\n point(ctx, lastDrawnPose[i].keypoints[pt][0], lastDrawnPose[i].keypoints[pt][1], 0, localOptions);\n } else {\n point(ctx, result[i].keypoints[pt].position.x, result[i].keypoints[pt].position.y, 0, localOptions);\n }\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.z ? `rgba(${127.5 + (2 * pt.position.z)}, ${127.5 - (2 * pt.position.z)}, 255, 0.5)` : localOptions.color;\n ctx.fillText(`${pt.part} ${Math.trunc(100 * pt.score)}%`, pt.position.x + 4, pt.position.y + 4);\n }\n }\n }\n if (localOptions.drawPolygons && result[i].keypoints) {\n let part;\n const points: any[] = [];\n // shoulder line\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'leftShoulder');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightShoulder');\n if (part) points.push([part.position.x, part.position.y]);\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.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightHip');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftHip');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftShoulder');\n if (part) points.push([part.position.x, part.position.y]);\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.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftKnee');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftAnkle');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftHeel');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftFoot');\n if (part) points.push([part.position.x, part.position.y]);\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.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightKnee');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightAnkle');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightHeel');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightFoot');\n if (part) points.push([part.position.x, part.position.y]);\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.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftElbow');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftWrist');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftPalm');\n if (part) points.push([part.position.x, part.position.y]);\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.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightElbow');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightWrist');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightPalm');\n if (part) points.push([part.position.x, part.position.y]);\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 if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\n if (!ctx) return;\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 let box;\n if (!localOptions.calculateHandBox) {\n box = localOptions.useRawBoxes ? h.boxRaw : h.box;\n } else {\n box = [Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, 0, 0];\n if (h.landmarks && h.landmarks.length > 0) {\n for (const pt of h.landmarks) {\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 }\n }\n if (localOptions.useRawBoxes) rect(ctx, inCanvas.width * box[0], inCanvas.height * box[1], inCanvas.width * box[2], inCanvas.height * box[3], localOptions);\n else rect(ctx, box[0], box[1], box[2], box[3], localOptions);\n if (localOptions.drawLabels) {\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText('hand', box[0] + 3, 1 + box[1] + localOptions.lineHeight, box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText('hand', box[0] + 2, 0 + box[1] + localOptions.lineHeight, box[2]);\n }\n ctx.stroke();\n }\n if (localOptions.drawPoints) {\n if (h.landmarks && h.landmarks.length > 0) {\n for (const pt of h.landmarks) {\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 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['indexFinger'], 'index');\n addHandLabel(h.annotations['middleFinger'], 'middle');\n addHandLabel(h.annotations['ringFinger'], 'ring');\n addHandLabel(h.annotations['pinky'], 'pinky');\n addHandLabel(h.annotations['thumb'], 'thumb');\n addHandLabel(h.annotations['palmBase'], '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['indexFinger']);\n addHandLine(h.annotations['middleFinger']);\n addHandLine(h.annotations['ringFinger']);\n addHandLine(h.annotations['pinky']);\n addHandLine(h.annotations['thumb']);\n // addPart(h.annotations.palmBase);\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 if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\n if (!ctx) return;\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 if (localOptions.useRawBoxes) rect(ctx, inCanvas.width * h.boxRaw[0], inCanvas.height * h.boxRaw[1], inCanvas.width * h.boxRaw[2], inCanvas.height * h.boxRaw[3], localOptions);\n else rect(ctx, h.box[0], h.box[1], h.box[2], h.box[3], localOptions);\n if (localOptions.drawLabels) {\n const label = `${Math.round(100 * h.score)}% ${h.label}`;\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 canvas(inCanvas: HTMLCanvasElement, outCanvas: HTMLCanvasElement) {\n if (!inCanvas || !outCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement) || !(outCanvas instanceof HTMLCanvasElement)) return;\n const outCtx = inCanvas.getContext('2d');\n outCtx?.drawImage(inCanvas, 0, 0);\n}\n\nexport async function all(inCanvas: HTMLCanvasElement, result: Result, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n face(inCanvas, result.face, localOptions);\n body(inCanvas, result.body, localOptions);\n hand(inCanvas, result.hand, localOptions);\n gesture(inCanvas, result.gesture, localOptions);\n object(inCanvas, result.object, localOptions);\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\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAB5n2q03LfDqqx39y39npmlxbS/TOG5se29tuavzgWzeV4mtui2\nO3RRSY2hdVhqO2MvI36iu9lUsrSrvDHn6spnmSiq5jooyV6tq1VV69RC32byTh43h8otMx+r6I+Z\naK/g8TwX7bXh9Mid4iW+fjl8n1ICWb57xLBOm4zqse20Tbmj8+qKdnS9q8PhcTw5tumSm0/OHMxz\n0Za+uzx3sX1t0Zxurr1ZxvspWiZYWZbsbT0QK7KLrZVZJFaqt5vbezNOTg9J/FaZeJns93wCvLwb\nT/GJn92uGHldIBowAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADuAPA67F9H4l\nqMW20VvO3yRWW97T4fC4rXJHSMtI/WGhVlue3b473K2KzMML4+62tujG9pnozXaOSOVFMnVbmq1t\ntrJRW5E7wwvUxTvCyY6CHOt7moxz6Wh9PxTzYaT61h8x1MbZK/OH0zTf+Fxf6I/htj45vL9WgLMn\nmvbPFvocGWO9L7fq85p5maw9d7VYvE4JkmPu2if3eW0+PasdFNOnxfF1Y2hlykRsmY+LJ0MZjZXa\neq2eyi8oQTO0KLdZWzPRjWu6VaqtHR73g0bcI0sf0Q8Nkq93wqNuFaWP+XDTDDytwBowAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAef9q8HNpcGaI60vtPyl56k9Iew49j8ThGe\nPwxFv0l4zH2U26fDfTYiyJljvsjf4sm6vJ1hrXjq2MkqLdZEVbgbMx0auGdmzNt6iHN1Ub5af6of\nTdPG2nxx6Vj+HzaaTm1+nx/iyVj930ysbViPRrj45vL9SAuyc7j1efguqj+jd4/T33rD3HEcPj8O\n1GP8WOY/Z4TTT7sKadHhbcsZnaCJ3TPZk6VdrKbTutmP0U2nqgrGOsr8deiuI2X09EqKM1dt3uuG\nf/jdN/06/wAPE546S9rwud+Gaaf+XH8NMMPK2wGjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAABrcRp4nDtRWPPHP8PCYusPoWSvNjtX1iYfPuWaXtX8MzCuvjfw32siu8ptXoxi\n0wy5t4YulReqmazu2skbquURWFInddM7VYRGyL291KFnCcfj8e0le/Lbmn8n0N4b2Ur4nHLWmPsY\n5e5a5+OXyXugBZmiY3iY9Xz7NjnTa3Ph/BeYj5PoTxftFg8Hjk2iOmWkW/Psrr418V5WrWd2faFc\nV2jdnEMXWxntupmN7NiYU27iWML6dVMVnddjgVqMsdHr+CW5uE6f4Rt+7yuSsTDv+zWXn0WTHP3L\n/tK+GHl+O0A1c4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8Dn93W56/wDM\nt/L3z59qp24jn+OS38lnpr4r7ZxHQ2TEstt3PXUrt27K57rr1VT0BjKnJPRbMqMs7QlV2fYvHvrd\nVknyrEfu9m8f7FZI8fVU85iJewbT45NfQBKo817W4eulzxHaZrL0rje09ItwqbfhtBVs3leai8RD\nKLw1sduesL606dWFdsZT1jdhNeq6K9DlhCVUU6s4jZnt1YzAhnM71dH2bycmszY/K1d/0c6OzY4R\nfwuK4p8rTstn6z8k7HrwGzkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHz3\nVxvr80/8y38voTwGpj/F5/8AqT/JfjTx/WVeyY6FPspc9dZPVXaOq2WEwIUTVRmjo2rNfLHRI3vZ\nDJycXtX8dZh7t879nsnhcbwz23tt+r6I2nxyb+gCVBzuPY/E4PqI9K7ui19fTxNBnp60n+Aj5/pJ\n3jZu1aOnnltMNussdfXbm+l3ZM9URHREdZVXTuT1Nk7boQiOkJw28PU47/htEp5eivJPLMTCZ9Vv\nx7mJ3iJ9UqNHk8XR4b+tIXuhxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD\nweqjbWZ4/wCZP8vePCaz/wDIaiP+Zb+UX408f0r9lOxWOifJhXWjfyYWllPRXYQxnrCrJHRd3YZI\n6A1NJecHEsN/S0T+76bE7xE+r5dk93LW3pL6ZpMni6PDf8VIn9m2fjm8s9rgFmQxvHNS0esbMiew\nPnHLyai9fS0w2aNfUTtrs3+uf5bGPqy068fF227KtSsdFlKqNGMV6myyY6sbdIQI8tlOWOi6Jhhk\nj3RD0vA8nicMx9etZmHRcT2Zyb6XNT8N9/2dt0T449T2AJVAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAHhdfG3E9TH9cvdPEcXjk4zqI/q3L8aeP6xr2TsxpLOekMK6mFo6qpXSrm\nOqBixvHSVmzC4OfqK7S9/wAByeLwbTW9K7fo8Fqo6Paeyl+fglI/Da0NcMPK7QC7AAB8313TiOf/\nAKk/y2MHWrX4jG3E9R/1Lfyv0/aFNOrHxuU7LI7MMayGTVlHWUXhNe6Z6wIUsb9d1m20q7dkDpez\nN9tRqKT5xEvRvKez9+Xis1/FSYerb5+OTyf6AFlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAB43j9eXjN/jWJ/Z7J5L2mry8Upb8VIF8f6aGOey2eynHvOy7bowrrYSxZSwQJ2YXZ\n92N4BoanrEvVexmTm4blr+HJ/aHltRHSXofYm/1Wrp5RaJaYY+X49WA0c4AD51xONuKan/qW/lbp\n+0MOLRtxbU/9SU4J7KadWPjep2WQrr2WRPRk1TvsndXMpiRCb9FNu0rbTuqvKBscCjfi9PhWZeue\nV9n434rafTHL1TfPxy+T/QAszAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHmv\navHtfTZfnV6VxPajHzcNrf8ABeJFs/XnMcr4no18c+6vr2YadkY2YM57sEDLyY37Mo7MMnYGlqO0\nvQ+xNfqNVb1tEfs87qZ2rL0/sVX/AHdnt65P7Q0wx8vx6UBo5wAHz/jUbcX1PT78qtO2vaCnJxjP\n8Zif2amnnspp04+OjWejKJ6MKdmcMmyJn4m5ZHzEVPMwtJv0VZLbQDqezcb8RzT6Y/7vUPM+ytZt\nn1OTyiIh6Ztn45N/6AFlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABocbxeLw\nnUR5xXm/Rvq8+OMuDJjntaswEeBxT0bNZ6NatZpNqz3rO0rqsdO3PxlaWEMpY+aqWXkryT0ZT2V3\n7A0dVPuy9f7G124NM/iyT/Z4zWT7sw957MYfB4Fp4/FE2/WWmGHldcBowAAeM9qKcvFeb8VIly9P\n0nq7ntbTbVYL+tJj93CwT76unR4/jo0nozhhTsy3Y1sWljM9Ce7HyQIm3RRlttVbaWrnt0Sh6n2U\nx8vD8mSfv3/h3XN4Bi8Lg2nj8Uc36y6TeOPXugCUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAPD8RxeBxXUU26Tbmj8+quro+02Lw+I4ssdslNvzhzazvDPbq8d7GW7Dfqz2VzG\n0s2qd+iu/Zn5Ksk9BVztX1mI8930zh2LwOHabH+HHWP2fNYp4+vwYvxXiP3fUqxtWIjyjZtj45/L\nfaQFmQADzftfj3w6fJ6WmHmsP23rvaqnNwqLfhvEvIYZ+sV038bo0noy36MK9oZQxrdMyrlnMbMZ\nQKrS1M07zEestq/RRjr4utwY/wAV4j91p9V18fQdJj8LR4ccfdpEfsuREbREJbuMAAAAAAAAAAAA\nBAJAAAAEAJEAJQAJQAJEAJQAJQAJEACUJAQlAJEAJQAJQJAAAEAJEAJBAAAJAABAJEJAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwvanDzaPFmjvjv8A\ntLztJ3h7HjGHx+FainnFeaPnHV4vFbeIU038VbHeGF+kso7Mb9mTdhKnLK3dRm7SIrHhGPxeP6Sv\n9cT/AHfSnz72Zx+J7Q45/BWZ/Z9BbZ+OXyfQBZQABzeP4/E4NqI9Ii36S8Ng/wAx9C4jTxOH6ivr\njn+Hz3B/mQi/GvjdCnWNlsdI2V07LIlg6USrt2ZzZXMoFV+zPhGLxeOaavpbm/RVltEN72Yx+Jxm\nb7dKUmf7L5+s9/HtRA2cqRACRACRACRACUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQCQQCRACRACRCQBCQBCQB\nACRACRACRACRACL1i9LVntMbPATTwdRkxT3pea/u+gPE8Xx+DxrPHlaYt+qNfGvjvtXXsi0dOrKk\ndEXjZg6VMtbP2bMtXUdpEV0/Y2nNxbNf8OP+727xvsXH+N1U/wBEfy9k3nxyb+gCVQAGOWvNivX1\nrMPnGGOXNNfOJ2fSZ6w+dZKeHxDPX8N7R+6L8a+L63KdoZ7q6zvEMpnowdKJ6ywmWUyqvIKM0vQ+\nx+D6rU55+9aKx+TzWa36vbezmDwODYenW+95/Nphj5L6dQBo5wAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAEiAAAEoA\nAAAAAAAAAAAAAEAkEAkRuAkQbgkQAkQAkQAkQAl5T2nx8nEMOT8dNv0l6pwfarHvpcGWPu32/WCr\nYvK4mOem6b9mGKd4Z3idmFdka0y1c892zfpMtLPaNpEV6D2Kj/Eauf6YeweQ9ieuTVz8K/3evbT4\n5NfQBKoAA8FxCvJxrUx/XMvevD8Zry8fz/Haf2RfjTx/6RSOnRMyypHu9kXjowrqVSrvPRnZVl6V\nkK0775MsUjvadn0nT4ow6bFijtSsVfPuFYvpPGtNTy54mfy6vorXDm8l9pEC7JIgBIgBIgBIgBIg\nBIgBIhIAgBIhIAgBIgBIIBIAAhIAhIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAA\nAAAAAAAAABAJQkAEAAAAAAAAAAjc3BIjdG4Mkbo5kcwMjdhzHMDPc3V8xzAs3N1fMjmBZubq+Y5g\nWbm6vmOYFm5ur5jmBZubq+Y5gWbm6vmOYFm5ur5jmBZubq+Y5gWbm6vmTzAz3N2HMnmBlu5ftFTx\nOEZJ/DMW/d0t2rxKni8N1FPWkiZ9eS08e7Cy8dGGn6UhZaJljXZGnmc3UT3dPP2cnUT78xCIV6j2\nH/8A9c/6f7vXPI+w8bU1U+vL/d63du5NfUiDcVSIAS8b7RV5eOb/AIqRL2TyXtNX/e2KfXH/AHlF\n+NPH/pr4+2xcxx0hFpY11K7R16KM32ZWz3UaidqSgrc9kcPicWyZJjfw6T+727y3sXh2xarN+K0V\nh6lvPjj3e0ASqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJQAAAAAkQAkQAkAAAAAAAAAAAAAAA\nEgAAAAAAAAAAAAAAAAAAAAAgAAABKDcAN0bgkY8xzAyRux5kcwM9zdXNkTcFm6OZXzMeYFvMibKu\nZHMC2bo51U2RuC2bom6rc3BZzom6sBZzI52ADPnOdggFnMc6skFnMc6rc3BbznOp3RzAv50c6nml\nHMC/nOf4qOY5wX85zqOc5wbHOc7X5znBsc6edr85zg2ec52vzpi4NjmY5bROG+/bllVzsNTk5dLl\nn0pP8BHmMHWNmzt0aum8obm08vVjfrtnxztR0mXHzTvaZdjVRMTLkZo6yiFen9iZ2pqY/wBP93rN\n3kPY+/LfPX1rE/u9XzN3HfqzdO6vmTuIZ7m7Hc3Bnu8t7TR/vHBP9E/y9Pu837SV31umn+if5Rfi\n/j/01MMb1hjkrtKzBG0bMsmOZY11tOYamr6Und0LUc7XT7u3rJPqL8er9lcPhcFpbzyWm39v7O00\n+FYvA4Zpsc94xxu227jv1IAgAAAAAAAAABKAAAASgASgBIgBIgBIgBIhIAAAAAAAAAAAAAAAAAAC\nUACUJAAAAAAAAAAAABIAAAAAAAAAAAAAAAAAAAAg3AEbomQZbo3YzLGbAz3RNlc3YzcFs2YzdVN2\nM2Bdzom6nmNwW86JurTAMuY3REJ2BB1ZRVMVBhsbSsiqeUFXLucq3lTygp5TlXcpygp5TlXcpygp\n5TlXcqOUFXKjlXcrGYBXysdlswiYBVMdUTCyY6sZBWxlnMMZgGLGZZSwkDdHMiWO4MuY5mEyjcFn\nN1OdVzHMC3nTzqeY5gX85zqOZPMC+Lqdbk20eb/RKOZr8QybaK/XvtH7iZ9aGlp2luzT3fg19NHS\nOjbmPcYX67XH1XSZ9XIzRvMuzrK7zLkZYmYnciunb9lZ5dTk+OP+71cXeP8AZnJ/ip2nf3J/l6iL\n/Fu5L9bMWZczXi6YuIbEWTzKIuyiwLt3nuO25uI4a/hx7/rLuczg8TicvFLbfdpEK6+NPH/phhjo\nstLGkctUWnoxrrU3j1cnWTzZq1jzl1clo5Zcu8c+txR63iP3Tn6pv4+g4o5cVI9IiGe7CJ2iE7t3\nGyN2O6dwSINwSISAlAAlACRAAlAAlACRACRCQAAAAAAAAAASgASISAAAAAAAAAAAAACQAAAAAAAA\nAAAAAASAAAAAAAAAAAAAAAAIAAAQCAJljuljsCJlhMs9mOwMJYys5TkBVsjZdyHICrZPKt5E8oK4\nqmKrOVOwMIqyirPY2Bjyp2ZbAI2NmSARsbMgEbI2ZAMdjZICNkbMkSCNmOzJEgx2YyzljMAwlhKy\nWEwCuWErJhhMArlhLOWEgxljMpljIImWMyTKJA3N0IBO5vux3NwZbnMx3NwZczT4jf3MdPW27a3a\nfJOq1XNP2KdIRfi+J2trSYfcjeF+Wm1OicVeWIiN9kai8xjY12ORqultnI1Ecsujq79XP1FovWYI\nrTgeq+j8QrWZ+3Mx+r2UXeC0WG2Ti2kiN5mL807eUREvbzbaejefHJv62Iv8WUXa0WTFhVtRdlF2\nrz9WUXBtc7jR9dqc2T1ttHyhvZMvJitb0jdq6XHNcNenWVN3028U99WRj6Kb02be3Tq18/SN2Lpc\n3UdN9nOmZrqKX/DaJ/d0svvTLRzV3jomK6+Pd1vvWJj0ZczT0mXxNJht60hfFnQ4qu3N1cWTEgs3\nTur5k7gz3N2O5uDM3Y7m4MtxBuCQASIASIASAAAAAAACRCQAAAAAAAAEoSAAAAAAAAAAAlAAlCQA\nAAAAAAAAAAASAAAAAAAAAAAAIASgAAAEJAQJQCNkbMgGOyOVnsAw5TlZ7GwMOVPKy2NgY7GzIBGx\nskA2AAAAAAAAAAQkBAEghEskAxYzDPZGwK5hjMLJhjMAqmGEwumrCagomFcw2JqqtUFEsLLrV82F\no7gqljKyYYTGwMZRKUSCAQAboJnaN5Bjkneu0d5W4ccViIiOzHFWbTzNumP1Zarr8eeRMbxDW1Mx\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", "import { log, now, mergeDeep } from './helpers';\nimport { Config, defaults } from './config';\nimport { Result } from './result';\nimport * as sysinfo from './sysinfo';\nimport * as tf from '../dist/tfjs.esm.js';\nimport * as backend from './tfjs/backend';\nimport * as face from './face';\nimport * 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 nanodet from './object/nanodet';\nimport * as centernet from './object/centernet';\nimport * as gesture from './gesture/gesture';\nimport * as image from './image/image';\nimport * as draw from './draw/draw';\nimport * as sample from './sample';\nimport * as app from '../package.json';\n\n/** Generic Tensor object type */\nexport type Tensor = typeof tf.Tensor;\n\nexport type { Config } from './config';\nexport type { Result, Face, Hand, Body, Item, Gesture } from './result';\nexport type { DrawOptions } from './draw/draw';\n\n/** Defines all possible input types for **Human** detection */\nexport type Input = Tensor | typeof Image | ImageData | ImageBitmap | HTMLImageElement | HTMLMediaElement | HTMLVideoElement | HTMLCanvasElement | OffscreenCanvas;\n\n/** Error message */\nexport type Error = { error: string };\n\n/** Instance of TensorFlow/JS */\nexport type TensorFlow = typeof tf;\n\n/** Generic Model object type, holds instance of individual models */\ntype Model = Object;\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 */\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 /** Current state of Human library\n * - Can be polled to determine operations that are currently executed\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 styles\n * - options: global settings for all draw operations, can be overriden for each draw method, for details see {@link DrawOptions}\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 /** Internal: Currently loaded models */\n models: {\n face: [Model, Model, Model] | null,\n posenet: Model | null,\n blazepose: Model | null,\n efficientpose: Model | null,\n handpose: [Model, Model] | null,\n iris: Model | null,\n age: Model | null,\n gender: Model | null,\n emotion: Model | null,\n embedding: Model | null,\n nanodet: Model | null,\n centernet: Model | null,\n faceres: Model | null,\n };\n /** Internal: Currently loaded classes */\n classes: {\n facemesh: typeof facemesh;\n emotion: typeof emotion;\n body: typeof posenet | typeof blazepose;\n hand: typeof handpose;\n nanodet: typeof nanodet;\n centernet: typeof centernet;\n faceres: typeof faceres;\n };\n /** Face triangualtion array of 468 points, used for triangle references between points */\n faceTriangulation: typeof facemesh.triangulation;\n /** 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 perf: any;\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 | Object = {}) {\n this.tf = tf;\n this.draw = draw;\n this.version = app.version;\n this.config = mergeDeep(defaults, userConfig);\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.perf = {};\n // object that contains all initialized models\n this.models = {\n face: null,\n posenet: null,\n blazepose: null,\n efficientpose: null,\n handpose: null,\n iris: null,\n age: null,\n gender: null,\n emotion: null,\n embedding: null,\n nanodet: null,\n centernet: null,\n faceres: null,\n };\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.classes = {\n facemesh,\n emotion,\n faceres,\n body: this.config.body.modelPath.includes('posenet') ? posenet : blazepose,\n hand: handpose,\n nanodet,\n centernet,\n };\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) => {\n if (!this.#analyzeMemoryLeaks) return;\n const current = this.tf.engine().state.numTensors;\n const previous = this.#numTensors;\n this.#numTensors = current;\n const leaked = current - previous;\n if (leaked !== 0) log(...msg, leaked);\n }\n\n // quick sanity check on inputs\n /** @hidden */\n #sanity = (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 // eslint-disable-next-line class-methods-use-this\n similarity(embedding1: Array, embedding2: Array): number {\n return faceres.similarity(embedding1, embedding2);\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 /**\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 */\n async load(userConfig: Config | Object = {}) {\n this.state = 'load';\n const timeStamp = now();\n if (userConfig) this.config = mergeDeep(this.config, userConfig);\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 if (this.config.async) { // load models concurrently\n [\n this.models.face,\n this.models.emotion,\n this.models.handpose,\n this.models.posenet,\n this.models.blazepose,\n this.models.nanodet,\n this.models.centernet,\n this.models.faceres,\n ] = await Promise.all([\n this.models.face || (this.config.face.enabled ? facemesh.load(this.config) : null),\n this.models.emotion || ((this.config.face.enabled && this.config.face.emotion.enabled) ? emotion.load(this.config) : null),\n this.models.handpose || (this.config.hand.enabled ? handpose.load(this.config) : null),\n this.models.posenet || (this.config.body.enabled && this.config.body.modelPath.includes('posenet') ? posenet.load(this.config) : null),\n this.models.blazepose || (this.config.body.enabled && this.config.body.modelPath.includes('blazepose') ? blazepose.load(this.config) : null),\n this.models.nanodet || (this.config.object.enabled && this.config.object.modelPath.includes('nanodet') ? nanodet.load(this.config) : null),\n this.models.centernet || (this.config.object.enabled && this.config.object.modelPath.includes('centernet') ? centernet.load(this.config) : null),\n this.models.faceres || ((this.config.face.enabled && this.config.face.description.enabled) ? faceres.load(this.config) : null),\n ]);\n } else { // load models sequentially\n if (this.config.face.enabled && !this.models.face) this.models.face = await facemesh.load(this.config);\n if (this.config.face.enabled && this.config.face.emotion.enabled && !this.models.emotion) this.models.emotion = await emotion.load(this.config);\n if (this.config.hand.enabled && !this.models.handpose) this.models.handpose = await handpose.load(this.config);\n if (this.config.body.enabled && !this.models.posenet && this.config.body.modelPath.includes('posenet')) this.models.posenet = await posenet.load(this.config);\n if (this.config.body.enabled && !this.models.blazepose && this.config.body.modelPath.includes('blazepose')) this.models.blazepose = await blazepose.load(this.config);\n if (this.config.object.enabled && !this.models.nanodet && this.config.object.modelPath.includes('nanodet')) this.models.nanodet = await nanodet.load(this.config);\n if (this.config.object.enabled && !this.models.centernet && this.config.object.modelPath.includes('centernet')) this.models.centernet = await centernet.load(this.config);\n if (this.config.face.enabled && this.config.face.description.enabled && !this.models.faceres) this.models.faceres = await faceres.load(this.config);\n }\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.perf.load || 0)) this.perf.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 // @ts-ignore ignore missing type for WorkerGlobalScope as that is the point\n if (typeof window === 'undefined' && typeof WorkerGlobalScope !== 'undefined' && this.config.debug) log('running inside web worker');\n\n // force browser vs node backend\n if (this.tf.ENV.flags.IS_BROWSER && this.config.backend === 'tensorflow') this.config.backend = 'webgl';\n if (this.tf.ENV.flags.IS_NODE && (this.config.backend === 'webgl' || this.config.backend === 'humangl')) this.config.backend = 'tensorflow';\n\n if (this.config.debug) log('setting backend:', this.config.backend);\n\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 if (this.config.backend === 'humangl') backend.register();\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 this.tf.enableProdMode();\n // this.tf.enableDebugMode();\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 tf.ENV.set('WEBGL_FORCE_F16_TEXTURES', true);\n this.tf.ENV.set('WEBGL_PACK_DEPTHWISECONV', true);\n if (typeof this.config['deallocate'] !== 'undefined') {\n log('changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:', true);\n this.tf.ENV.set('WEBGL_DELETE_TEXTURE_THRESHOLD', 0);\n }\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 await this.tf.ready();\n this.perf.backend = Math.trunc(now() - timeStamp);\n }\n }\n\n // check if input changed sufficiently to trigger new detections\n /** @hidden */\n #skipFrame = async (input) => {\n if (this.config.cacheSensitivity === 0) return false;\n const resizeFact = 40;\n const reduced = input.resizeBilinear([Math.trunc(input.shape[1] / resizeFact), Math.trunc(input.shape[2] / resizeFact)]);\n // use tensor sum\n const sumT = this.tf.sum(reduced);\n const sum = sumT.dataSync()[0] as number;\n sumT.dispose();\n // use js loop sum\n /*\n const reducedData = reduced.dataSync();\n let sum = 0;\n for (let i = 0; i < reducedData.length; i++) sum += reducedData[i];\n */\n reduced.dispose();\n const diff = 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 4x threshold, don't use last value to force reset cache for significant change of scenes or images\n this.#lastCacheDiff = diff > 4 * this.config.cacheSensitivity ? 0 : 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 async detect(input: Input, userConfig: Config | Object = {}): Promise {\n // detection happens inside a promise\n return new Promise(async (resolve) => {\n this.state = 'config';\n let timeStamp;\n\n // update configuration\n this.config = mergeDeep(this.config, userConfig);\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 /*\n // function disabled in favor of inputChanged\n // disable video optimization for inputs of type image, but skip if inside worker thread\n let previousVideoOptimized;\n // @ts-ignore ignore missing type for WorkerGlobalScope as that is the point\n if (input && this.config.videoOptimized && (typeof window !== 'undefined') && (typeof WorkerGlobalScope !== 'undefined') && (\n (typeof HTMLImageElement !== 'undefined' && input instanceof HTMLImageElement)\n || (typeof Image !== 'undefined' && input instanceof Image)\n || (typeof ImageData !== 'undefined' && input instanceof ImageData)\n || (typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap))\n ) {\n log('disabling video optimization');\n previousVideoOptimized = this.config.videoOptimized;\n this.config.videoOptimized = false;\n }\n */\n\n timeStamp = now();\n const process = image.process(input, this.config);\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 this.perf.image = Math.trunc(now() - timeStamp);\n this.analyze('Get Image:');\n\n timeStamp = now();\n // @ts-ignore hidden dynamic property that is not part of definitions\n this.config.skipFrame = await this.#skipFrame(process.tensor);\n if (!this.perf.frames) this.perf.frames = 0;\n if (!this.perf.cached) this.perf.cached = 0;\n this.perf.frames++;\n // @ts-ignore hidden dynamic property that is not part of definitions\n if (this.config.skipFrame) this.perf.cached++;\n this.perf.changed = Math.trunc(now() - timeStamp);\n this.analyze('Check Changed:');\n\n // prepare where to store model results\n let bodyRes;\n let handRes;\n let faceRes;\n let objectRes;\n let current;\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.perf.face) delete this.perf.face;\n } else {\n this.state = 'run:face';\n timeStamp = now();\n faceRes = this.config.face.enabled ? await face.detectFace(this, process.tensor) : [];\n current = Math.trunc(now() - timeStamp);\n if (current > 0) this.perf.face = current;\n }\n\n // run body: can be posenet or blazepose\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 if (this.perf.body) delete this.perf.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 current = Math.trunc(now() - timeStamp);\n if (current > 0) this.perf.body = current;\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.perf.hand) delete this.perf.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 current = Math.trunc(now() - timeStamp);\n if (current > 0) this.perf.hand = current;\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.perf.object) delete this.perf.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 current = Math.trunc(now() - timeStamp);\n if (current > 0) this.perf.object = current;\n }\n this.analyze('End Object:');\n\n // if async wait for results\n if (this.config.async) {\n [faceRes, bodyRes, handRes, objectRes] = await Promise.all([faceRes, bodyRes, handRes, objectRes]);\n }\n tf.dispose(process.tensor);\n\n // run gesture analysis last\n let gestureRes: any[] = [];\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.perf.gesture = Math.trunc(now() - timeStamp);\n else if (this.perf.gesture) delete this.perf.gesture;\n }\n\n this.perf.total = Math.trunc(now() - timeStart);\n this.state = 'idle';\n const res = {\n face: faceRes,\n body: bodyRes,\n hand: handRes,\n gesture: gestureRes,\n object: objectRes,\n performance: this.perf,\n canvas: process.canvas,\n };\n // log('Result:', result);\n resolve(res);\n });\n }\n\n /** @hidden */\n #warmupBitmap = async () => {\n const b64toBlob = (base64, 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) => 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 metho pre-initializes all models for faster inference\n * - can take significant time on startup\n * - only used for `webgl` and `humangl` backends\n */\n async warmup(userConfig: Config | Object = {}): Promise {\n const t0 = now();\n if (userConfig) this.config = mergeDeep(this.config, userConfig);\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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,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;AAAA,EAAK;AAAA,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,EAAG;AAAA,EAAK;AAAA,EAAK;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AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA;;;AC3/WA,yBAAmB;AAAA,EAQxB,YAAY,QAAO;AAZrB;AAaI,SAAK,QAAQ;AACb,SAAK,UAAU,AAAQ,QAAQ,IAAI,CAAC,WAAW,CAAC,OAAO,GAAG,OAAO;AACjE,SAAK,gBAAgB,AAAG,0BAAS,KAAK;AACtC,SAAK,YAAY,WAAK,UAAL,mBAAY,OAAO,GAAG,MAAM;AAC7C,SAAK,kBAAkB,AAAG,0BAAS,CAAC,KAAK,WAAW,KAAK;AACzD,SAAK,wBAAwB,AAAG,0BAAS,CAAC,KAAK,YAAY,GAAG,KAAK,YAAY;AAAA;AAAA,EAGjF,eAAe,OAAO;AACpB,WAAO,AAAG,sBAAK,MAAM;AACnB,YAAM,aAAa,AAAG,uBAAM,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI;AAChD,YAAM,WAAW,AAAG,uBAAM,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI;AAC9C,YAAM,kBAAkB,AAAG,qBAAI,AAAG,qBAAI,YAAY,KAAK,kBAAkB,KAAK;AAC9E,YAAM,eAAe,AAAG,qBAAI,UAAU,KAAK;AAC3C,YAAM,cAAc,AAAG,qBAAI,AAAG,qBAAI,iBAAiB,eAAe,KAAK;AACvE,YAAM,YAAY,AAAG,qBAAI,AAAG,qBAAI,iBAAiB,eAAe,KAAK;AACrE,aAAO,AAAG,0BAAS,CAAC,aAAa,YAAY;AAAA;AAAA;AAAA,EAIjD,mBAAmB,kBAAkB,OAAO;AAC1C,WAAO,AAAG,sBAAK,MAAM;AACnB,YAAM,YAAY,AAAG,qBAAI,AAAG,qBAAI,iBAAiB,QAAQ,CAAC,IAAI,GAAG,KAAK,KAAK,kBAAkB,KAAK,QAAQ;AAC1G,aAAO,AAAG,qBAAI,WAAW,KAAK;AAAA;AAAA;AAAA,QAI5B,SAAS,OAAO,SAAQ;AAC5B,UAAM,UAAU,KAAK,MAAM,QAAQ;AACnC,UAAM,cAAc,QAAQ;AAC5B,YAAQ;AACR,UAAM,UAAU,AAAG,sBAAK,MAAM,AAAG,yBAAQ,AAAG,uBAAM,aAAa,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK;AACjF,UAAM,SAAS,QAAQ;AACvB,UAAM,WAAW,AAAG,uBAAM,aAAa,CAAC,GAAG,IAAI,CAAC,IAAI;AACpD,UAAM,QAAQ,KAAK,eAAe;AAClC,aAAS;AACT,UAAM,YAAY,MAAM,AAAG,uBAAM,uBAAuB,OAAO,QAAQ,QAAO,KAAK,aAAa,QAAO,KAAK,cAAc,QAAO,KAAK;AACtI,UAAM,WAAW,UAAU;AAE3B,YAAQ;AACR,cAAU;AACV,UAAM,QAAqE;AAC3E,eAAW,SAAS,UAAU;AAC5B,UAAI,OAAO,UAAU,QAAO,KAAK,eAAe;AAC9C,cAAM,cAAc,AAAG,uBAAM,OAAO,CAAC,OAAO,IAAI,CAAC,GAAG;AACpD,cAAM,mBAAmB,AAAG,uBAAM,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG;AAC/D,cAAM,gBAAgB,AAAG,sBAAK,MAAM,KAAK,mBAAmB,kBAAkB,OAAO,QAAQ,CAAC,IAAI;AAClG,yBAAiB;AACjB,cAAM,KAAK,EAAE,KAAK,aAAa,eAAe,YAAY,OAAO;AAAA;AAAA;AAGrE,gBAAY;AACZ,UAAM;AACN,WAAO;AAAA;AAAA,QAGH,mBAAmB,OAAO,SAAQ;AACtC,UAAM,cAAc,MAAM,MAAM;AAChC,UAAM,aAAa,MAAM,MAAM;AAC/B,UAAM,UAAQ,AAAG,sBAAK,MAAM,MAAM,eAAe,CAAC,KAAK,WAAW,KAAK,YAAY,IAAI,OAAO,IAAI;AAClG,UAAM,cAAc,MAAM,KAAK,SAAS,SAAO;AAC/C,YAAM;AACN,UAAM,QAAmB;AACzB,QAAI,CAAC,eAAe,YAAY,WAAW;AAAG,aAAO;AACrD,eAAW,cAAc,aAAa;AACpC,YAAM,QAAQ,WAAW,IAAI;AAC7B,YAAM,aAAa,MAAM,MAAM,GAAG;AAClC,YAAM,WAAW,MAAM,MAAM,GAAG;AAChC,YAAM,gBAAgB,WAAW,cAAc;AAC/C,iBAAW,IAAI;AACf,iBAAW,cAAc;AACzB,YAAM,KAAK,AAAI,qBAAoB,EAAE,YAAY,UAAU,eAAe,YAAY,WAAW,cAAc,CAAC,aAAa,KAAK,WAAW,cAAc,KAAK;AAAA;AAElK,WAAO;AAAA;AAAA;;;ACtFJ,2BAA0B,OAAO;AACtC,SAAO,QAAQ,IAAI,KAAK,KAAK,KAAK,MAAO,SAAQ,KAAK,MAAO,KAAI,KAAK;AAAA;AAGjE,0BAAyB,QAAQ,QAAQ;AAC9C,QAAM,UAAU,KAAK,KAAK,IAAI,KAAK,MAAM,CAAE,QAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO;AACtF,SAAO,kBAAiB;AAAA;AAGnB,IAAM,0BAAyB,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG;AAEvE,cAAa,IAAI,IAAI;AAC1B,MAAI,UAAU;AACd,WAAS,IAAI,GAAG,IAAI,GAAG,QAAQ,KAAK;AAClC,eAAW,GAAG,KAAK,GAAG;AAAA;AAExB,SAAO;AAAA;AAGF,6BAA4B,KAAK,aAAa;AACnD,QAAM,SAAwB;AAC9B,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,WAAO,KAAK,IAAI,GAAG;AAAA;AAErB,SAAO;AAAA;AAGF,oCAAmC,MAAM,MAAM;AACpD,QAAM,UAA2B;AACjC,QAAM,OAAO,KAAK;AAClB,WAAS,MAAM,GAAG,MAAM,MAAM,OAAO;AACnC,YAAQ,KAAK;AACb,aAAS,MAAM,GAAG,MAAM,MAAM,OAAO;AACnC,cAAQ,KAAK,KAAK,KAAI,KAAK,MAAM,oBAAmB,MAAM;AAAA;AAAA;AAG9D,SAAO;AAAA;AAGF,8BAA6B,UAAU,QAAQ;AACpD,QAAM,OAAO,KAAK,IAAI;AACtB,QAAM,OAAO,KAAK,IAAI;AACtB,QAAM,iBAAiB,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,MAAM,IAAI,CAAC,GAAG,GAAG;AAClE,QAAM,oBAAoB,wBAAuB,OAAO,IAAI,OAAO;AACnE,QAAM,2BAA2B,2BAA0B,mBAAmB;AAC9E,QAAM,4BAA4B,wBAAuB,CAAC,OAAO,IAAI,CAAC,OAAO;AAC7E,SAAO,2BAA0B,0BAA0B;AAAA;AAGtD,gCAA+B,QAAQ;AAC5C,QAAM,oBAAoB,CAAC,CAAC,OAAO,GAAG,IAAI,OAAO,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,OAAO,GAAG;AAClF,QAAM,uBAAuB,CAAC,OAAO,GAAG,IAAI,OAAO,GAAG;AACtD,QAAM,sBAAsB;AAAA,IAC1B,CAAC,KAAI,kBAAkB,IAAI;AAAA,IAC3B,CAAC,KAAI,kBAAkB,IAAI;AAAA;AAE7B,SAAO;AAAA,IACL,kBAAkB,GAAG,OAAO,oBAAoB;AAAA,IAChD,kBAAkB,GAAG,OAAO,oBAAoB;AAAA,IAChD,CAAC,GAAG,GAAG;AAAA;AAAA;AAIJ,sBAAqB,uBAAuB,gBAAgB;AACjE,SAAO;AAAA,IACL,KAAI,uBAAuB,eAAe;AAAA,IAC1C,KAAI,uBAAuB,eAAe;AAAA;AAAA;;;AC9D9C,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAC7B,IAAM,kBAAkB,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG;AAC7C,IAAM,wBAAwB;AAC9B,IAAM,gCAAgC;AAE/B,yBAAmB;AAAA,EAQxB,YAAY,cAAc,kBAAkB;AAlB9C;AAmBI,SAAK,eAAe;AACpB,SAAK,mBAAmB;AACxB,SAAK,YAAY,WAAK,qBAAL,mBAAuB,OAAO,GAAG,MAAM;AACxD,SAAK,cAAc;AACnB,SAAK,UAAU;AACf,SAAK,gBAAgB;AAAA;AAAA,EAIvB,8BAA8B,WAAW;AACvC,UAAM,KAAK,UAAU,IAAI,CAAC,MAAM,EAAE;AAClC,UAAM,KAAK,UAAU,IAAI,CAAC,MAAM,EAAE;AAClC,UAAM,aAAa,CAAC,KAAK,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG;AACjD,UAAM,WAAW,CAAC,KAAK,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG;AAC/C,WAAO,EAAE,YAAY;AAAA;AAAA,EAGvB,uBAAuB,eAAe,gBAAgB;AACpD,UAAM,uBAAuB,cAAc,IAAI,CAAC,UAAU,AAAK,aAAY,CAAC,GAAG,OAAO,IAAI;AAC1F,UAAM,gBAAgB,KAAK,8BAA8B;AACzD,WAAO,AAAI,YAAW,AAAI,aAAY,gBAAgB;AAAA;AAAA,EAGxD,uBAAuB,WAAW;AAChC,UAAM,cAAc,KAAK,8BAA8B;AACvD,UAAM,gBAAgB,AAAI,YAAW,AAAI,aAAY,cAAc;AACnE,kBAAc,gBAAgB;AAC9B,aAAS,IAAI,GAAG,IAAI,gBAAgB,QAAQ,KAAK;AAC/C,oBAAc,cAAc,KAAK,UAAU,gBAAgB,IAAI,MAAM,GAAG;AAAA;AAE1E,WAAO;AAAA;AAAA,EAGT,mBAAmB,WAAW,OAAM,OAAO,gBAAgB;AACzD,UAAM,UAAU,AAAI,YAAW;AAC/B,UAAM,cAAc,CAAC,QAAQ,KAAK,KAAK,WAAW,QAAQ,KAAK,KAAK,WAAY,SAAQ,KAAK,QAAQ,MAAM,KAAK,YAAY;AAC5H,UAAM,eAAe,UAAU,IAAI,CAAC,UAAU;AAAA,MAC5C,YAAY,KAAM,OAAM,KAAK,KAAK,YAAY;AAAA,MAC9C,YAAY,KAAM,OAAM,KAAK,KAAK,YAAY;AAAA,MAC9C,YAAY,KAAK,MAAM;AAAA;AAEzB,UAAM,uBAAuB,AAAK,qBAAoB,OAAO,CAAC,GAAG;AACjE,UAAM,gBAAgB,aAAa,IAAI,CAAC,UAAU;AAChD,YAAM,UAAU,AAAK,aAAY,OAAO;AACxC,aAAO,CAAC,GAAG,SAAS,MAAM;AAAA;AAE5B,UAAM,wBAAwB,AAAK,uBAAsB;AACzD,UAAM,YAAY,CAAC,GAAG,AAAI,cAAa,QAAO;AAC9C,UAAM,oBAAoB;AAAA,MACxB,AAAK,KAAI,WAAW,sBAAsB;AAAA,MAC1C,AAAK,KAAI,WAAW,sBAAsB;AAAA;AAE5C,WAAO,cAAc,IAAI,CAAC,UAAU;AAAA,MAClC,MAAM,KAAK,kBAAkB;AAAA,MAC7B,MAAM,KAAK,kBAAkB;AAAA,MAC7B,MAAM;AAAA;AAAA;AAAA,QAIJ,cAAc,SAAO,SAAQ;AACjC,QAAI,cAAc;AAGlB,QAAI;AAEJ,QAAK,KAAK,YAAY,KAAO,KAAK,UAAU,QAAO,KAAK,cAAe,CAAC,QAAO,KAAK,aAAa,CAAC,QAAO,WAAW;AAClH,cAAQ,MAAM,KAAK,aAAa,mBAAmB,SAAO;AAC1D,WAAK,UAAU;AAAA;AAEjB,QAAI,QAAO;AAAW,WAAK;AAG3B,QAAI,SAAU,MAAM,SAAS,KAAQ,OAAM,WAAW,KAAK,iBAAmB,KAAK,kBAAkB,QAAO,KAAK,eAAgB,CAAC,QAAO,KAAK,YAAY;AACxJ,WAAK,gBAAgB;AACrB,WAAK,cAAc,CAAC,GAAG;AAEvB,UAAI,KAAK,YAAY,SAAS;AAAG,sBAAc;AAAA;AAEjD,UAAM,QAAmB;AAGzB,aAAS,IAAI,GAAG,IAAI,KAAK,YAAY,QAAQ,KAAK;AAChD,YAAM,aAAa,KAAK,YAAY;AACpC,UAAI,CAAC;AAAY;AACjB,UAAI,QAAO,KAAK,WAAW;AACzB,cAAM,QAAQ,QAAO,KAAK,WAAW,AAAK,iBAAgB,WAAW,cAAc,wBAAwB,WAAW,cAAc,kCAAkC;AACtK,cAAM,aAAa,AAAI,cAAa;AACpC,cAAM,uBAAuB,CAAC,WAAW,KAAK,QAAM,MAAM,IAAI,WAAW,KAAK,QAAM,MAAM;AAC1F,cAAM,eAAe,QAAO,KAAK,WAAW,AAAG,uBAAM,iBAAiB,SAAO,OAAO,GAAG,wBAAwB,QAAM;AACrH,cAAM,iBAAiB,AAAK,qBAAoB,CAAC,OAAO;AACxD,cAAM,SAAS,cAAc,KAAK,uBAAuB,WAAW,eAAe,kBAAkB;AACrG,cAAM,eAAe,AAAI,0BAAyB,QAAQ,cAAc,CAAC,KAAK,WAAW,KAAK;AAC9F,cAAM,YAAY,aAAa,IAAI;AACnC,qBAAa;AACb,qBAAa;AACb,cAAM,CAAC,aAAa,aAAa,MAAM,KAAK,iBAAiB,QAAQ;AACrE,kBAAU;AACV,cAAM,aAAa,YAAY,WAAW;AAC1C,oBAAY;AACZ,YAAI,cAAc,QAAO,KAAK,eAAe;AAC3C,gBAAM,oBAAoB,AAAG,yBAAQ,WAAW,CAAC,IAAI;AACrD,gBAAM,YAAY,kBAAkB;AACpC,oBAAU;AACV,4BAAkB;AAClB,gBAAM,UAAS,KAAK,mBAAmB,WAAW,QAAQ,OAAO;AACjE,gBAAM,kBAAkB,KAAK,uBAAuB;AACpD,eAAK,YAAY,KAAK;AACtB,gBAAM,SAAS;AAAA,YACb,WAAW;AAAA,YACX;AAAA,YACA,KAAK,EAAE,SAAS,gBAAgB,YAAY,aAAa,gBAAgB;AAAA;AAE3E,gBAAM,KAAK;AAAA,eACN;AACL,eAAK,YAAY,KAAK;AAAA;AAExB,kBAAU;AAAA,aACL;AAEL,cAAM,WAAW,AAAI,YAAW,AAAI,aAAY,aAAa;AAC7D,cAAM,SAAS;AAAA,UACb,YAAY,WAAW;AAAA,UACvB,KAAK,EAAE,SAAS,SAAS,YAAY,aAAa,SAAS;AAAA;AAE7D,cAAM,KAAK;AAAA;AAAA;AAGf,SAAK,cAAc,KAAK,YAAY,OAAO,CAAC,MAAM,MAAM;AACxD,SAAK,gBAAgB,MAAM;AAC3B,WAAO;AAAA;AAAA;;;AL9IX,IAAM,kBAAkB;AAAA,EACtB,OAAO,CAAC,GAAG,GAAG,GAAG;AAAA,EACjB,aAAa,CAAC,GAAG,GAAG,GAAG;AAAA,EACvB,cAAc,CAAC,GAAG,IAAI,IAAI;AAAA,EAC1B,YAAY,CAAC,IAAI,IAAI,IAAI;AAAA,EACzB,OAAO,CAAC,IAAI,IAAI,IAAI;AAAA,EACpB,UAAU,CAAC;AAAA;AAGb,IAAI;AACJ,IAAI;AACJ,IAAI;AAEJ,wBAA8B,OAAO,SAAyB;AAC5D,QAAM,cAAc,MAAM,aAAa,cAAc,OAAO;AAC5D,MAAI,CAAC;AAAa,WAAO;AACzB,QAAM,QAAqB;AAC3B,WAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AAC3C,UAAM,eAAc;AACpB,QAAI,YAAY,GAAG,WAAW;AAC5B,iBAAW,OAAO,OAAO,KAAK,kBAAkB;AAC9C,qBAAY,OAAO,gBAAgB,KAAK,IAAI,CAAC,UAAU,YAAY,GAAG,UAAU;AAAA;AAAA;AAGpF,UAAM,OAAwC,YAAY,GAAG,MAAM;AAAA,MACjE,KAAK,IAAI,GAAG,YAAY,GAAG,IAAI,QAAQ;AAAA,MACvC,KAAK,IAAI,GAAG,YAAY,GAAG,IAAI,QAAQ;AAAA,MACvC,KAAK,IAAI,MAAM,MAAM,IAAI,YAAY,GAAG,IAAI,YAAY,MAAM,KAAK,IAAI,GAAG,YAAY,GAAG,IAAI,QAAQ;AAAA,MACrG,KAAK,IAAI,MAAM,MAAM,IAAI,YAAY,GAAG,IAAI,YAAY,MAAM,KAAK,IAAI,GAAG,YAAY,GAAG,IAAI,QAAQ;AAAA,QACnG,CAAC,GAAG,GAAG,GAAG;AACd,UAAM,SAA2C;AAAA,MAC9C,YAAY,GAAG,IAAI,QAAQ,KAAM,MAAM,MAAM;AAAA,MAC7C,YAAY,GAAG,IAAI,QAAQ,KAAM,MAAM,MAAM;AAAA,MAC7C,aAAY,GAAG,IAAI,YAAY,KAAK,YAAY,GAAG,IAAI,QAAQ,MAAM,MAAM,MAAM;AAAA,MACjF,aAAY,GAAG,IAAI,YAAY,KAAK,YAAY,GAAG,IAAI,QAAQ,MAAM,MAAM,MAAM;AAAA;AAEpF,UAAM,KAAK,EAAE,IAAI,GAAG,YAAY,KAAK,MAAM,MAAM,YAAY,GAAG,cAAc,KAAK,WAAK,QAAQ,WAAW,YAAY,GAAG,WAAW;AAAA;AAEvI,SAAO;AAAA;AAGT,qBAA2B,SAAmC;AAC5D,MAAI,CAAC,qBAAqB,CAAC,eAAe;AACxC,KAAC,mBAAmB,iBAAiB,MAAM,QAAQ,IAAI;AAAA,MACrD,QAAO,KAAK,UAAU,AAAG,gCAAe,KAAK,QAAO,eAAe,QAAO,KAAK,SAAS,YAAY,EAAE,WAAW,QAAO,KAAK,SAAS,UAAU,SAAS,kBAAkB;AAAA,MAC3K,QAAO,KAAK,YAAY,AAAG,gCAAe,KAAK,QAAO,eAAe,QAAO,KAAK,SAAS,YAAY,EAAE,WAAW,QAAO,KAAK,SAAS,UAAU,SAAS,kBAAkB;AAAA;AAE/K,QAAI,QAAO,KAAK,SAAS;AACvB,UAAI,CAAC,qBAAqB,CAAC,kBAAkB;AAAU,YAAI,sBAAsB,QAAO,KAAK,SAAS;AAAA,eAC7F,QAAO;AAAO,YAAI,eAAe,kBAAkB;AAC5D,UAAI,CAAC,iBAAiB,CAAC,cAAc;AAAU,YAAI,sBAAsB,QAAO,KAAK,SAAS;AAAA,eACrF,QAAO;AAAO,YAAI,eAAe,cAAc;AAAA;AAAA,SAErD;AACL,QAAI,QAAO;AAAO,UAAI,iBAAiB,kBAAkB;AACzD,QAAI,QAAO;AAAO,UAAI,iBAAiB,cAAc;AAAA;AAEvD,QAAM,eAAe,IAAiB,aAAa;AACnD,iBAAe,IAAiB,aAAa,cAAc;AAC3D,SAAO,CAAC,mBAAmB;AAAA;;;AMjE7B;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAGK,IAAM,QAAQ;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;;;ADnEF,IAAI;AAEJ,qBAA2B,SAAQ;AACjC,MAAI,CAAC,QAAO;AACV,aAAQ,MAAM,AAAG,gCAAe,KAAK,QAAO,eAAe,QAAO,KAAK;AACvE,WAAM,QAAQ,SAAS,OAAM,UAAU,OAAO,aAAa,YAAY,IAAI,GAAG;AAC9E,WAAM,SAAS,SAAS,OAAM,UAAU,OAAO,aAAa,YAAY,IAAI,GAAG;AAC/E,QAAI,CAAC,UAAS,CAAC,OAAM;AAAU,UAAI,sBAAsB,QAAO,KAAK;AAAA,aAC5D,QAAO;AAAO,UAAI,eAAe,OAAM;AAAA,aACvC,QAAO;AAAO,QAAI,iBAAiB,OAAM;AACpD,SAAO;AAAA;AAGT,wBAA8B,SAAO,SAAQ;AAC3C,MAAI,CAAC;AAAO,WAAO;AACnB,MAAI,CAAC,QAAO,KAAK;AAAS,WAAO;AACjC,QAAM,UAAU,EAAE,OAAO,QAAM,MAAM,IAAI,QAAQ,QAAM,MAAM;AAC7D,QAAM,SAAS,AAAG,uBAAM,eAAe,SAAO,CAAC,OAAM,OAAO,OAAM,SAAS;AAC3E,QAAM,YAAY,AAAG,qBAAI,QAAQ,CAAC;AAClC,SAAO;AACP,QAAM,OAAO,MAAM,OAAM,QAAQ;AACjC,QAAM,SAAS,KAAK,KAAK,CAAC,MAAO,EAAE,SAAS,OAAO,EAAE,SAAS,KAAM;AACpE,OAAK,QAAQ,CAAC,MAAM,EAAE;AACtB,YAAU;AACV,QAAM,YAAyE;AAC/E,QAAM,UAAS,OAAO,WAAW,MAAkB,OAAmB;AACtE,QAAM,QAAQ;AACd,WAAS,IAAI,GAAG,IAAI,OAAO,SAAS,OAAO,KAAK;AAC9C,cAAU,KAAK;AAAA,MACb,IAAI;AAAA,MACJ,MAAM,QAAO;AAAA,MACb,UAAU;AAAA,QACR,GAAG,KAAK,MAAM,QAAQ,QAAQ,OAAO,QAAQ,IAAI,KAAK;AAAA,QACtD,GAAG,KAAK,MAAM,QAAQ,SAAS,OAAO,QAAQ,IAAI,KAAK;AAAA,QACvD,GAAG,KAAK,MAAM,OAAO,QAAQ,IAAI,MAAM;AAAA;AAAA,MAEzC,OAAQ,OAAM,KAAK,MAAM,MAAO,KAAI,KAAK,IAAI,OAAO,QAAQ,IAAI,SAAS;AAAA,MACzE,UAAW,OAAM,KAAK,MAAM,MAAO,KAAI,KAAK,IAAI,OAAO,QAAQ,IAAI,SAAS;AAAA;AAAA;AAGhF,QAAM,QAAQ,UAAU,OAAO,CAAC,MAAM,SAAU,KAAK,QAAQ,OAAO,KAAK,QAAQ,MAAO;AACxF,SAAO,CAAC,EAAE,OAAO;AAAA;;;AE/CnB;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,SAAS;AAAA,EACpB,EAAE,OAAO,GAAG,OAAO;AAAA,EACnB,EAAE,OAAO,GAAG,OAAO;AAAA,EACnB,EAAE,OAAO,GAAG,OAAO;AAAA,EACnB,EAAE,OAAO,GAAG,OAAO;AAAA,EACnB,EAAE,OAAO,GAAG,OAAO;AAAA,EACnB,EAAE,OAAO,GAAG,OAAO;AAAA,EACnB,EAAE,OAAO,GAAG,OAAO;AAAA,EACnB,EAAE,OAAO,GAAG,OAAO;AAAA,EACnB,EAAE,OAAO,GAAG,OAAO;AAAA,EACnB,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,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;;;AD3EtB,IAAI;AACJ,IAAI,QAAoB;AACxB,IAAI,WAAU,OAAO;AAErB,IAAM,WAAW;AAEjB,qBAA2B,SAAQ;AACjC,MAAI,CAAC,QAAO;AACV,aAAQ,MAAM,AAAG,gCAAe,KAAK,QAAO,eAAe,QAAO,OAAO;AACzE,UAAM,SAAS,OAAO,OAAO,OAAM,eAAe;AAClD,WAAM,YAAY,MAAM,QAAQ,UAAU,SAAS,OAAO,GAAG,YAAY,IAAI,GAAG,QAAQ;AACxF,QAAI,CAAC,OAAM;AAAW,YAAM,IAAI,MAAM,4CAA4C,QAAO,OAAO;AAChG,QAAI,CAAC,UAAS,CAAC,OAAM;AAAU,UAAI,sBAAsB,QAAO,OAAO;AAAA,aAC9D,QAAO;AAAO,UAAI,eAAe,OAAM;AAAA,aACvC,QAAO;AAAO,QAAI,iBAAiB,OAAM;AACpD,SAAO;AAAA;AAGT,wBAAuB,KAAK,WAAW,aAAa,SAAQ;AAC1D,MAAI,KAAK;AACT,MAAI,UAA8J;AAClK,aAAW,cAAc,CAAC,GAAG,GAAG,IAAI;AAElC,IAAG,sBAAK,MAAM;AA5BlB;AA6BM,YAAM,WAAW,aAAa;AAE9B,YAAM,UAAU,UAAI,KAAK,CAAC,MAAO,EAAE,MAAM,OAAQ,YAAY,KAAM,EAAE,MAAM,OAAO,OAAO,YAAzE,mBAAmF;AACnG,YAAM,YAAY,UAAI,KAAK,CAAC,MAAO,EAAE,MAAM,OAAQ,YAAY,KAAM,EAAE,MAAM,KAAK,OAAO,YAAvE,mBAAiF;AACnG,YAAM,WAAW,UAAU,QAAQ,CAAC,IAAI,GAAG,UAAU,MAAM,KAAK;AAChE,YAAM,SAAS,SAAS,OAAO,GAAG;AAClC,YAAM,SAAS,QAAQ;AACvB,eAAS,IAAI,GAAG,IAAI,QAAQ,MAAM,IAAI,KAAK;AACzC,iBAAS,IAAI,GAAG,IAAI,QAAQ,MAAM,IAAI,KAAK;AACzC,gBAAM,QAAQ,OAAO,GAAG;AACxB,cAAI,QAAQ,QAAO,OAAO,iBAAiB,MAAM,IAAI;AACnD,kBAAM,KAAM,OAAM,KAAK,MAAM,IAAI,aAAa;AAC9C,kBAAM,KAAM,OAAM,KAAK,MAAM,IAAI,aAAa;AAC9C,kBAAM,YAAY,OAAO,GAAG,IAAI,CAAC,MAAM,IAAK,YAAW,aAAa;AACpE,kBAAM,CAAC,GAAG,KAAK;AAAA,cACb,KAAM,WAAW,aAAa,UAAU;AAAA,cACxC,KAAM,WAAW,aAAa,UAAU;AAAA;AAE1C,kBAAM,CAAC,GAAG,KAAK;AAAA,cACb,KAAM,WAAW,aAAa,UAAU,KAAM;AAAA,cAC9C,KAAM,WAAW,aAAa,UAAU,KAAM;AAAA;AAEhD,gBAAI,SAAS,CAAC,GAAG,GAAG,GAAG;AACvB,qBAAS,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG;AACnD,kBAAM,OAAM;AAAA,cACV,OAAO,KAAK,YAAY;AAAA,cACxB,OAAO,KAAK,YAAY;AAAA,cACxB,OAAO,KAAK,YAAY;AAAA,cACxB,OAAO,KAAK,YAAY;AAAA;AAE1B,kBAAM,SAAS;AAAA,cACb,IAAI;AAAA,cACJ;AAAA,cACA,OAAO,KAAK,MAAM,MAAM,SAAS;AAAA,cACjC,OAAO,IAAI;AAAA,cACX,OAAO,OAAO,GAAG;AAAA,cACjB,QAAQ,CAAC,KAAK,MAAM,YAAY,KAAK,KAAK,KAAK,MAAM,YAAY,KAAK;AAAA,cACtE,WAAW,CAAC,IAAI;AAAA,cAChB,KAAK,KAAI,IAAI,CAAC,MAAM,KAAK,MAAM;AAAA,cAC/B;AAAA;AAEF,oBAAQ,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAOvB,MAAI,QAAQ,CAAC,MAAM,AAAG,yBAAQ;AAI9B,QAAM,WAAW,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,IAAI,EAAE,OAAO,IAAI,EAAE,OAAO,IAAI,EAAE,OAAO;AACrF,QAAM,YAAY,QAAQ,IAAI,CAAC,MAAM,EAAE;AACvC,MAAI,SAAgB;AACpB,MAAI,YAAY,SAAS,SAAS,GAAG;AACnC,UAAM,MAAM,MAAM,AAAG,uBAAM,uBAAuB,UAAU,WAAW,QAAO,OAAO,aAAa,QAAO,OAAO,cAAc,QAAO,OAAO;AAC5I,aAAS,IAAI;AACb,IAAG,yBAAQ;AAAA;AAIb,YAAU,QACP,OAAO,CAAC,GAAG,QAAQ,OAAO,SAAS,MACnC,KAAK,CAAC,GAAG,MAAO,EAAE,QAAQ,EAAE;AAE/B,SAAO;AAAA;AAGT,wBAA8B,SAAO,SAAyB;AAC5D,MAAK,WAAU,QAAO,OAAO,cAAe,QAAO,aAAc,MAAK,SAAS,GAAI;AACjF;AACA,WAAO;AAAA;AAET,aAAU;AACV,SAAO,IAAI,QAAQ,OAAO,YAAY;AACpC,UAAM,aAAa,CAAC,QAAM,MAAM,IAAI,QAAM,MAAM;AAChD,UAAM,SAAS,AAAG,uBAAM,eAAe,SAAO,CAAC,OAAM,WAAW,OAAM,YAAY;AAClF,UAAM,OAAO,OAAO,IAAI;AACxB,UAAM,YAAY,KAAK,UAAU,CAAC,GAAG,GAAG,GAAG;AAC3C,SAAK;AACL,WAAO;AAEP,QAAI;AACJ,QAAI,QAAO,OAAO;AAAS,gBAAU,MAAM,OAAM,QAAQ;AACzD,cAAU;AAEV,UAAM,MAAM,MAAM,SAAQ,SAAS,OAAM,WAAW,YAAY;AAChE,YAAO;AACP,YAAQ;AAAA;AAAA;;;AEtHZ;AAAA;AAAA;AAAA;AAAA;AAKA,IAAI;AACJ,IAAI,QAAe;AACnB,IAAI,WAAU,OAAO;AAErB,qBAA2B,SAAQ;AACjC,MAAI,CAAC,QAAO;AACV,aAAQ,MAAM,AAAG,gCAAe,KAAK,QAAO,eAAe,QAAO,OAAO;AACzE,UAAM,SAAS,OAAO,OAAO,OAAM,eAAe;AAClD,WAAM,YAAY,MAAM,QAAQ,UAAU,SAAS,OAAO,GAAG,YAAY,IAAI,GAAG,QAAQ;AACxF,QAAI,CAAC,OAAM;AAAW,YAAM,IAAI,MAAM,4CAA4C,QAAO,OAAO;AAChG,QAAI,CAAC,UAAS,CAAC,OAAM;AAAU,UAAI,sBAAsB,QAAO,OAAO;AAAA,aAC9D,QAAO;AAAO,UAAI,eAAe,OAAM;AAAA,aACvC,QAAO;AAAO,QAAI,iBAAiB,OAAM;AACpD,SAAO;AAAA;AAGT,wBAAuB,KAAK,WAAW,aAAa,SAAQ;AAC1D,QAAM,UAAmG;AACzG,QAAM,aAAa,IAAI;AACvB,QAAM,WAAW,AAAG,yBAAQ;AAC5B,MAAI;AACJ,QAAM,MAAM,AAAG,uBAAM,UAAU,GAAG;AAClC,WAAS;AACT,QAAM,SAAS,AAAG,uBAAM,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK;AAC1D,QAAM,SAAS,OAAO;AACtB,QAAM,UAAU,IAAI,GAAG;AACvB,QAAM,WAAW,IAAI,GAAG;AACxB,MAAI,QAAQ,CAAC,MAAM,EAAE;AAErB,QAAM,OAAO,MAAM,AAAG,uBAAM,uBAAuB,QAAQ,SAAS,QAAO,OAAO,aAAa,QAAO,OAAO,cAAc,QAAO,OAAO;AACzI,SAAO;AACP,UAAQ;AACR,WAAS;AACT,QAAM,MAAM,KAAK;AACjB,OAAK;AACL,aAAW,MAAM,KAAK;AACpB,UAAM,QAAQ,WAAW,GAAG,IAAI;AAChC,UAAM,WAAW,WAAW,GAAG,IAAI;AACnC,UAAM,QAAQ,OAAO,UAAU;AAC/B,UAAM,SAAS;AAAA,MACb,WAAW,GAAG,IAAI,KAAK;AAAA,MACvB,WAAW,GAAG,IAAI,KAAK;AAAA,MACvB,WAAW,GAAG,IAAI,KAAK;AAAA,MACvB,WAAW,GAAG,IAAI,KAAK;AAAA;AAEzB,UAAM,OAAM;AAAA,MACV,KAAK,MAAM,OAAO,KAAK,YAAY;AAAA,MACnC,KAAK,MAAM,OAAO,KAAK,YAAY;AAAA,MACnC,KAAK,MAAM,OAAO,KAAK,YAAY;AAAA,MACnC,KAAK,MAAM,OAAO,KAAK,YAAY;AAAA;AAErC,YAAQ,KAAK,EAAE,OAAO,OAAO,UAAU,OAAO,WAAK;AAAA;AAErD,SAAO;AAAA;AAGT,wBAA8B,SAAO,SAAyB;AAC5D,MAAK,WAAU,QAAO,OAAO,cAAe,QAAO,aAAc,MAAK,SAAS,GAAI;AACjF;AACA,WAAO;AAAA;AAET,aAAU;AACV,SAAO,IAAI,QAAQ,OAAO,YAAY;AACpC,UAAM,aAAa,CAAC,QAAM,MAAM,IAAI,QAAM,MAAM;AAChD,UAAM,SAAS,AAAG,uBAAM,eAAe,SAAO,CAAC,OAAM,WAAW,OAAM,YAAY;AAElF,QAAI;AACJ,QAAI,QAAO,OAAO;AAAS,gBAAU,OAAM,QAAQ,QAAQ;AAC3D,WAAO;AAEP,UAAM,MAAM,MAAM,SAAQ,SAAS,OAAM,WAAW,YAAY;AAChE,YAAO;AACP,YAAQ;AAAA;AAAA;;;AC3EL,IAAM,OAAO,CAAC,QAAmB;AACtC,MAAI,CAAC;AAAK,WAAO;AACjB,QAAM,WAAqD;AAC3D,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AAEnC,UAAM,YAAY,IAAI,GAAG,UAAU,KAAK,CAAC,MAAO,EAAE,SAAS;AAC3D,UAAM,aAAa,IAAI,GAAG,UAAU,KAAK,CAAC,MAAO,EAAE,SAAS;AAC5D,UAAM,OAAO,IAAI,GAAG,UAAU,KAAK,CAAC,MAAO,EAAE,SAAS;AACtD,QAAI,QAAQ,aAAa,cAAe,UAAU,SAAS,IAAI,KAAK,SAAS,KAAO,WAAW,SAAS,IAAI,KAAK,SAAS;AAAI,eAAS,KAAK,EAAE,MAAM,GAAG,SAAS;AAAA,aACvJ,QAAQ,aAAc,UAAU,SAAS,IAAI,KAAK,SAAS;AAAI,eAAS,KAAK,EAAE,MAAM,GAAG,SAAS;AAAA,aACjG,QAAQ,cAAe,WAAW,SAAS,IAAI,KAAK,SAAS;AAAI,eAAS,KAAK,EAAE,MAAM,GAAG,SAAS;AAG5G,UAAM,eAAe,IAAI,GAAG,UAAU,KAAK,CAAC,MAAO,EAAE,SAAS;AAC9D,UAAM,gBAAgB,IAAI,GAAG,UAAU,KAAK,CAAC,MAAO,EAAE,SAAS;AAC/D,QAAI,gBAAgB;AAAe,eAAS,KAAK,EAAE,MAAM,GAAG,SAAS,WAAY,aAAa,SAAS,IAAI,cAAc,SAAS,IAAK,SAAS;AAAA;AAElJ,SAAO;AAAA;AAGF,IAAM,OAAO,CAAC,QAAmB;AACtC,MAAI,CAAC;AAAK,WAAO;AACjB,QAAM,WAAqD;AAC3D,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,QAAI,IAAI,GAAG,QAAQ,IAAI,GAAG,KAAK,SAAS,GAAG;AACzC,YAAM,YAAY,IAAI,GAAG,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,KAAK;AACxD,UAAI,KAAK,IAAI,aAAa;AAAI,iBAAS,KAAK,EAAE,MAAM,GAAG,SAAS;AAAA;AAC3D,iBAAS,KAAK,EAAE,MAAM,GAAG,SAAS,UAAU,YAAY,IAAI,SAAS;AAC1E,YAAM,WAAW,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK,MAAM,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK;AACvH,UAAI,WAAW;AAAK,iBAAS,KAAK,EAAE,MAAM,GAAG,SAAS;AACtD,YAAM,YAAY,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK,MAAM,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK;AACxH,UAAI,YAAY;AAAK,iBAAS,KAAK,EAAE,MAAM,GAAG,SAAS;AACvD,YAAM,YAAY,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,KAAK;AACzI,UAAI,YAAY;AAAI,iBAAS,KAAK,EAAE,MAAM,GAAG,SAAS,SAAS,KAAK,MAAM;AAC1E,YAAM,YAAY,IAAI,GAAG,KAAK,KAAK;AACnC,UAAI,KAAK,IAAI,aAAa;AAAI,iBAAS,KAAK,EAAE,MAAM,GAAG,SAAS,QAAQ,YAAY,IAAI,OAAO;AAAA;AAAA;AAGnG,SAAO;AAAA;AAGF,IAAM,OAAO,CAAC,QAAmB;AACtC,MAAI,CAAC;AAAK,WAAO;AACjB,QAAM,WAAqD;AAC3D,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,QAAI,CAAC,IAAI,GAAG,eAAe,CAAC,IAAI,GAAG,YAAY,eAAe,CAAC,IAAI,GAAG,YAAY;AAAc;AAChG,UAAM,YAAY,IAAI,GAAG,YAAY,YAAY,GAAG,KAAK,IAAI,GAAG,YAAY,YAAY,GAAG;AAC3F,UAAM,YAAY,IAAI,GAAG,YAAY,YAAY,GAAG,KAAK,IAAI,GAAG,YAAY,YAAY,GAAG;AAC3F,UAAM,WAAW,KAAK,IAAI,YAAY;AAEtC,UAAM,aAAa,IAAI,GAAG,YAAY,aAAa,GAAG,KAAK,IAAI,GAAG,YAAY,aAAa,GAAG;AAC9F,UAAM,aAAa,IAAI,GAAG,YAAY,aAAa,GAAG,KAAK,IAAI,GAAG,YAAY,aAAa,GAAG;AAC9F,UAAM,YAAY,KAAK,IAAI,aAAa;AAExC,QAAI,SAAS;AACb,UAAM,aAAa,KAAK,IAAI,WAAW,aAAa,KAAK,IAAI,UAAU;AACvE,QAAI,aAAa,MAAM;AACrB,eAAS;AACT,eAAS,KAAK,EAAE,MAAM,GAAG,SAAS;AAAA;AAGpC,UAAM,mBAAmB,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,KAAK,IAAI,GAAG,YAAY,aAAa,GAAG,MAAM,IAAI,GAAG,YAAY,aAAa,GAAG;AACnI,UAAM,kBAAkB,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,KAAK,IAAI,GAAG,YAAY,YAAY,GAAG,MAAM,IAAI,GAAG,YAAY,YAAY,GAAG;AACjI,QAAI,kBAAkB,SAAS,mBAAmB;AAAO,eAAS;AAClE,QAAI,kBAAkB;AAAO,eAAS,KAAK,EAAE,MAAM,GAAG,SAAS;AAC/D,QAAI,mBAAmB;AAAO,eAAS,KAAK,EAAE,MAAM,GAAG,SAAS;AAEhE,UAAM,mBAAmB,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,KAAK,IAAI,GAAG,YAAY,aAAa,GAAG,MAAM,IAAI,GAAG,YAAY,aAAa,GAAG;AACpI,UAAM,kBAAkB,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,KAAK,IAAI,GAAG,YAAY,YAAY,GAAG,MAAM,IAAI,GAAG,YAAY,YAAY,GAAG;AACjI,QAAI,kBAAkB,SAAS,mBAAmB,SAAS,kBAAkB,QAAS,mBAAmB;AAAO,eAAS;AACzH,QAAI,kBAAkB,SAAS,mBAAmB;AAAO,eAAS,KAAK,EAAE,MAAM,GAAG,SAAS;AAC3F,QAAI,kBAAkB,QAAS,mBAAmB;AAAO,eAAS,KAAK,EAAE,MAAM,GAAG,SAAS;AAG3F,QAAI;AAAQ,eAAS,KAAK,EAAE,MAAM,GAAG,SAAS;AAAA;AAEhD,SAAO;AAAA;AAGF,IAAM,OAAO,CAAC,QAAmB;AACtC,MAAI,CAAC;AAAK,WAAO;AACjB,QAAM,WAAqD;AAC3D,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,UAAM,UAAqD;AAC3D,eAAW,CAAC,QAAQ,QAAQ,OAAO,QAAQ,IAAI,GAAG,iBAAiB;AACjE,UAAI,WAAW,cAAc,MAAM,QAAQ;AAAM,gBAAQ,KAAK,EAAE,MAAM,OAAO,eAAe,UAAU,IAAI;AAAA;AAE5G,QAAI,WAAW,QAAQ,SAAS,GAAG;AACjC,YAAM,UAAU,QAAQ,OAAO,CAAC,MAAM,MAAO,KAAK,SAAS,KAAK,EAAE,SAAS,KAAK,OAAO;AACvF,YAAM,UAAU,QAAQ,OAAO,CAAC,MAAM,MAAO,KAAK,SAAS,KAAK,EAAE,SAAS,KAAK,OAAO;AACvF,eAAS,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,gBAAgB,QAAQ;AAAA;AAAA;AAGzE,SAAO;AAAA;;;ACzFT,mBAAmB,IAAI,cAAc,gBAAgB;AACnD,QAAM,WAAW,SAAU,QAAQ,QAAQ,YAAY;AACrD,UAAM,IAAI,IAAI,OAAO,QAAQ,SAAS,gBAAgB;AACtD,WAAO,QAAQ,GAAG,CAAC,QAAO,SAAS;AACjC,iBAAW,QAAQ;AACnB,aAAO;AAAA;AAAA;AAIX,QAAM,WAAW,SAAU,QAAQ,MAAM;AACvC,UAAM,SAAS,GAAG,aAAa;AAC/B,OAAG,aAAa,QAAQ;AACxB,OAAG,cAAc;AACjB,QAAI,CAAC,GAAG,mBAAmB,QAAQ,GAAG;AAAiB,YAAM,IAAI,MAAM,6BAA6B,GAAG,iBAAiB;AACxH,WAAO;AAAA;AAGT,OAAK,UAAU;AACf,OAAK,YAAY;AACjB,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,QAAM,OAAO,SAAS,gBAAgB,GAAG;AACzC,OAAK,KAAK,GAAG;AACb,KAAG,aAAa,KAAK,IAAI;AACzB,KAAG,aAAa,KAAK,IAAI;AACzB,KAAG,YAAY,KAAK;AAEpB,MAAI,CAAC,GAAG,oBAAoB,KAAK,IAAI,GAAG;AAAc,UAAM,IAAI,MAAM,0BAA0B,GAAG,kBAAkB,KAAK;AAE1H,KAAG,WAAW,KAAK;AAEnB,WAAS,cAAc,aAAa,KAAK;AACzC,aAAW,KAAK,KAAK;AAAW,SAAK,UAAU,KAAK,GAAG,kBAAkB,KAAK,IAAI;AAElF,WAAS,cAAc,WAAW,KAAK;AACvC,WAAS,gBAAgB,WAAW,KAAK;AACzC,aAAW,KAAK,KAAK;AAAS,SAAK,QAAQ,KAAK,GAAG,mBAAmB,KAAK,IAAI;AAAA;AAI1E,uBAAuB,QAAQ;AACpC,MAAI,CAAC;AAAQ,aAAS;AACtB,MAAI,aAAa;AACjB,MAAI,iBAAiB;AACrB,MAAI,eAAe;AACnB,MAAI,2BAA2B;AAC/B,MAAI,oBAAoB,CAAC,MAAM;AAC/B,MAAI,eAAe;AACnB,MAAI,SAAS;AACb,MAAI,UAAU;AACd,MAAI,gBAAgB;AACpB,MAAI,kBAAkB;AACtB,QAAM,UAAU;AAChB,QAAM,UAAU,OAAO,UAAU,SAAS,cAAc;AAExD,QAAM,sBAAsB;AAC5B,QAAM,OAAO,EAAE,cAAc;AAC7B,QAAM,KAAK,QAAQ,WAAW;AAC9B,MAAI,CAAC;AAAI,UAAM,IAAI,MAAM;AAEzB,OAAK,YAAY,SAAU,MAAM;AAE/B,UAAM,OAAO,MAAM,UAAU,MAAM,KAAK,WAAW;AACnD,UAAM,SAAS,QAAQ;AACvB,iBAAa,KAAK,EAAE,MAAM,QAAQ;AAAA;AAGpC,OAAK,QAAQ,WAAY;AACvB,mBAAe;AAAA;AAGjB,QAAM,UAAU,SAAU,OAAO,QAAQ;AAEvC,QAAI,UAAU,UAAU,WAAW,SAAS;AAAE;AAAA;AAC9C,YAAQ,QAAQ;AAChB,aAAS;AACT,YAAQ,SAAS;AACjB,cAAU;AAEV,QAAI,CAAC,eAAe;AAElB,YAAM,WAAW,IAAI,aAAa;AAAA,QAChC;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QACrC;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA;AAGrC,MAAC,gBAAgB,GAAG,gBAAgB,GAAG,WAAW,GAAG,cAAc;AACnE,SAAG,WAAW,GAAG,cAAc,UAAU,GAAG;AAC5C,SAAG,YAAY,GAAG,gCAAgC;AAAA;AAEpD,OAAG,SAAS,GAAG,GAAG,QAAQ;AAE1B,wBAAoB,CAAC,MAAM;AAAA;AAG7B,QAAM,4BAA4B,SAAU,OAAO,QAAQ;AACzD,UAAM,MAAM,GAAG;AACf,OAAG,gBAAgB,GAAG,aAAa;AACnC,UAAM,eAAe,GAAG;AACxB,OAAG,iBAAiB,GAAG,cAAc;AACrC,UAAM,UAAU,GAAG;AACnB,OAAG,YAAY,GAAG,YAAY;AAC9B,OAAG,WAAW,GAAG,YAAY,GAAG,GAAG,MAAM,OAAO,QAAQ,GAAG,GAAG,MAAM,GAAG,eAAe;AACtF,OAAG,cAAc,GAAG,YAAY,GAAG,oBAAoB,GAAG;AAC1D,OAAG,cAAc,GAAG,YAAY,GAAG,oBAAoB,GAAG;AAC1D,OAAG,cAAc,GAAG,YAAY,GAAG,gBAAgB,GAAG;AACtD,OAAG,cAAc,GAAG,YAAY,GAAG,gBAAgB,GAAG;AACtD,OAAG,qBAAqB,GAAG,aAAa,GAAG,mBAAmB,GAAG,YAAY,SAAS;AACtF,OAAG,YAAY,GAAG,YAAY;AAC9B,OAAG,gBAAgB,GAAG,aAAa;AACnC,WAAO,EAAE,KAAK;AAAA;AAGhB,QAAM,sBAAsB,SAAU,OAAO;AAC3C,sBAAkB,SAAS,kBAAkB,UAAU,0BAA0B,QAAQ;AACzF,WAAO,kBAAkB;AAAA;AAG3B,QAAM,QAAQ,SAAU,QAAQ,MAAM;AA3HxC;AA4HI,QAAI,SAAS;AACb,QAAI,SAAS;AACb,QAAI,QAAQ;AAEZ,QAAI,eAAe,GAAG;AAEpB,eAAS;AAAA,WACJ;AAEL,eAAS,0BAAoB,8BAApB,mBAA+C;AAAA;AAE1D;AAEA,QAAI,gBAAgB,CAAE,SAAQ,KAAK,eAAe;AAGhD,eAAS;AACT,cAAQ,aAAa,MAAM;AAAA,WACtB;AAEL,iCAA4B,4BAA2B,KAAK;AAC5D,eAAS,0BAAoB,8BAApB,mBAA+C;AAAA;AAG1D,OAAG,YAAY,GAAG,YAAY;AAC9B,OAAG,gBAAgB,GAAG,aAAa;AACnC,OAAG,UAAU,gBAAgB,QAAQ,OAAQ,QAAQ,KAAK;AAC1D,OAAG,WAAW,GAAG,WAAW,GAAG;AAAA;AAGjC,OAAK,QAAQ,SAAU,SAAO;AAC5B,YAAQ,QAAM,OAAO,QAAM;AAC3B,iBAAa;AAEb,QAAI,CAAC;AAAgB,uBAAiB,GAAG;AACzC,OAAG,YAAY,GAAG,YAAY;AAC9B,OAAG,cAAc,GAAG,YAAY,GAAG,gBAAgB,GAAG;AACtD,OAAG,cAAc,GAAG,YAAY,GAAG,gBAAgB,GAAG;AACtD,OAAG,cAAc,GAAG,YAAY,GAAG,oBAAoB,GAAG;AAC1D,OAAG,cAAc,GAAG,YAAY,GAAG,oBAAoB,GAAG;AAC1D,OAAG,WAAW,GAAG,YAAY,GAAG,GAAG,MAAM,GAAG,MAAM,GAAG,eAAe;AAEpE,QAAI,aAAa,WAAW,GAAG;AAE7B;AACA,aAAO;AAAA;AAET,aAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC5C,qBAAgB,MAAM,aAAa,SAAS;AAC5C,YAAM,IAAI,aAAa;AACvB,QAAE,KAAK,MAAM,MAAM,EAAE,QAAQ;AAAA;AAE/B,WAAO;AAAA;AAGT,QAAM,iBAAiB,SAAU,gBAAgB;AAC/C,QAAI,oBAAoB,iBAAiB;AACvC,wBAAkB,oBAAoB;AACtC,SAAG,WAAW,gBAAgB;AAC9B,aAAO;AAAA;AAGT,UAAM,SAAS;AACf,WAAO,kBAAkB;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK;AACP,WAAO,oBAAoB;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK;AACP,sBAAkB,IAAI,UAAU,IAAI,OAAO,iBAAiB;AAC5D,UAAM,YAAY,aAAa;AAC/B,UAAM,WAAW,IAAI;AACrB,OAAG,wBAAwB,gBAAgB,UAAU;AACrD,OAAG,oBAAoB,gBAAgB,UAAU,KAAK,GAAG,GAAG,OAAO,OAAO,UAAU,IAAI;AACxF,OAAG,wBAAwB,gBAAgB,UAAU;AACrD,OAAG,oBAAoB,gBAAgB,UAAU,IAAI,GAAG,GAAG,OAAO,OAAO,UAAU,IAAI;AACvF,wBAAoB,kBAAkB;AACtC,WAAO;AAAA;AAKT,UAAQ,cAAc,SAAU,QAAQ;AAEtC,UAAM,IAAI,IAAI,aAAa;AAC3B,MAAE,MAAM;AACR,MAAE,MAAM;AACR,MAAE,OAAO;AACT,MAAE,OAAO;AAET,UAAM,SAAU,EAAE,QAAQ,KAAK,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK,EAAE,QAAQ,KAAK,EAAE,QAAQ,KAAK,EAAE,QAAQ,KAAK,EAAE,QAAQ,KAAK,EAAE,QAAQ,IAC7H,QAAQ,YAAY,OAAO,gBAC3B,QAAQ,YAAY,OAAO;AAC/B,UAAM,UAAU,eAAe;AAC/B,OAAG,WAAW,QAAQ,QAAQ,GAAG;AACjC;AAAA;AAEF,UAAQ,YAAY,SAAS;AAC7B,UAAQ,YAAY,OAAO,aAAa;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK;AACP,UAAQ,YAAY,OAAO,gBAAgB;AAAA,IACzC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK;AAEP,UAAQ,aAAa,SAAU,YAAY;AACzC,UAAM,IAAK,eAAc,KAAK;AAC9B,YAAQ,YAAY;AAAA,MAClB;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MACZ;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MACZ;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MACZ;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA;AAIhB,UAAQ,aAAa,SAAU,QAAQ;AACrC,UAAM,IAAK,WAAU,KAAK,IAAI,IAAI;AAClC,UAAM,IAAM,KAAI,KAAK;AACrB,YAAQ,YAAY;AAAA,MAClB;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MACZ;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MACZ;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MACZ;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA;AAIhB,UAAQ,aAAa,WAAY;AAC/B,YAAQ,WAAW;AAAA;AAGrB,UAAQ,WAAW,SAAU,QAAQ;AACnC,UAAM,IAAK,WAAU,KAAK;AAC1B,UAAM,IAAI,OAAQ,KAAI;AAEtB,YAAQ,YAAY;AAAA,MAClB;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MACZ;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MACZ;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MACZ;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA;AAIhB,UAAQ,WAAW,WAAY;AAC7B,YAAQ,SAAS;AAAA;AAGnB,UAAQ,MAAM,SAAU,UAAU;AAChC,eAAY,aAAY,KAAK,MAAM,KAAK;AACxC,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,OAAO;AACb,UAAM,OAAO;AACb,UAAM,OAAO;AAEb,YAAQ,YAAY;AAAA,MAClB,OAAO,MAAO,KAAI,QAAQ,MAAO,CAAC;AAAA,MAAO,OAAO,MAAO,CAAC,OAAQ,MAAO,CAAC;AAAA,MAAO,OAAO,MAAO,CAAC,OAAQ,MAAO,KAAI;AAAA,MAAO;AAAA,MAAG;AAAA,MAC3H,OAAO,MAAO,CAAC,OAAQ,MAAO;AAAA,MAAQ,OAAO,MAAO,KAAI,QAAQ,MAAO;AAAA,MAAQ,OAAO,MAAO,CAAC,OAAQ,MAAO;AAAA,MAAS;AAAA,MAAG;AAAA,MACzH,OAAO,MAAO,CAAC,OAAQ,MAAO,CAAE,KAAI;AAAA,MAAQ,OAAO,MAAO,CAAC,OAAQ,MAAO;AAAA,MAAO,OAAO,MAAO,KAAI,QAAQ,MAAO;AAAA,MAAO;AAAA,MAAG;AAAA,MAC5H;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA;AAIhB,UAAQ,sBAAsB,WAAY;AACxC,YAAQ,YAAY;AAAA,MAClB;AAAA,MAAW;AAAA,MAAW;AAAA,MAAW;AAAA,MAAG;AAAA,MACpC;AAAA,MAAW;AAAA,MAAW;AAAA,MAAW;AAAA,MAAG;AAAA,MACpC;AAAA,MAAW;AAAA,MAAW;AAAA,MAAW;AAAA,MAAG;AAAA,MACpC;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA;AAIhB,UAAQ,QAAQ,WAAY;AAC1B,YAAQ,YAAY;AAAA,MAClB;AAAA,MAAO;AAAA,MAAW;AAAA,MAAY;AAAA,MAAG;AAAA,MACjC;AAAA,MAAO;AAAA,MAAW;AAAA,MAAY;AAAA,MAAG;AAAA,MACjC;AAAA,MAAO;AAAA,MAAW;AAAA,MAAY;AAAA,MAAG;AAAA,MACjC;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA;AAIhB,UAAQ,UAAU,WAAY;AAC5B,YAAQ,YAAY;AAAA,MAClB;AAAA,MAAoB;AAAA,MAAqB;AAAA,MAAqB;AAAA,MAAG;AAAA,MACjE;AAAA,MAAuB;AAAA,MAAoB;AAAA,MAAqB;AAAA,MAAG;AAAA,MACnE;AAAA,MAAqB;AAAA,MAAsB;AAAA,MAAqB;AAAA,MAAG;AAAA,MACnE;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA;AAIhB,UAAQ,iBAAiB,WAAY;AACnC,YAAQ,YAAY;AAAA,MAClB;AAAA,MAAoB;AAAA,MAAoB;AAAA,MAAsB;AAAA,MAAG;AAAA,MACjE;AAAA,MAAqB;AAAA,MAAoB;AAAA,MAAqB;AAAA,MAAG;AAAA,MACjE;AAAA,MAAoB;AAAA,MAAqB;AAAA,MAAoB;AAAA,MAAG;AAAA,MAChE;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA;AAIhB,UAAQ,aAAa,WAAY;AAC/B,YAAQ,YAAY;AAAA,MAClB;AAAA,MAAoB;AAAA,MAAqB;AAAA,MAAsB;AAAA,MAAG;AAAA,MAClE;AAAA,MAAsB;AAAA,MAAoB;AAAA,MAAsB;AAAA,MAAG;AAAA,MACnE;AAAA,MAAsB;AAAA,MAAqB;AAAA,MAAoB;AAAA,MAAG;AAAA,MAClE;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA;AAIhB,UAAQ,cAAc,WAAY;AAChC,YAAQ,YAAY;AAAA,MAClB;AAAA,MAAoB;AAAA,MAAqB;AAAA,MAAsB;AAAA,MAAG;AAAA,MAClE;AAAA,MAAqB;AAAA,MAAoB;AAAA,MAAsB;AAAA,MAAG;AAAA,MAClE;AAAA,MAAoB;AAAA,MAAqB;AAAA,MAAmB;AAAA,MAAG;AAAA,MAC/D;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA;AAIhB,UAAQ,WAAW,WAAY;AAC7B,YAAQ,YAAY;AAAA,MAClB;AAAA,MAAO;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAG;AAAA,MAC1B;AAAA,MAAQ;AAAA,MAAO;AAAA,MAAQ;AAAA,MAAG;AAAA,MAC1B;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAO;AAAA,MAAG;AAAA,MAC1B;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA;AAIhB,UAAQ,aAAa,WAAY;AAC/B,YAAQ,YAAY;AAAA,MAClB;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MACZ;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MACZ;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MACZ;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA;AAMhB,UAAQ,cAAc,SAAU,QAAQ;AACtC,UAAM,IAAI,IAAI,aAAa;AAC3B,UAAM,aAAa,IAAI;AACvB,UAAM,aAAa,IAAI;AACvB,UAAM,UAAU,eAAe,QAAQ,YAAY;AACnD,OAAG,WAAW,QAAQ,QAAQ,GAAG;AACjC,OAAG,UAAU,QAAQ,QAAQ,IAAI,YAAY;AAC7C;AAAA;AAGF,UAAQ,YAAY,SAAS;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK;AAEP,UAAQ,cAAc,WAAY;AAChC,YAAQ,YAAY,KAAK,MAAM;AAAA,MAC7B;AAAA,MAAG;AAAA,MAAG;AAAA,MACN;AAAA,MAAG;AAAA,MAAI;AAAA,MACP;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA;AAIV,UAAQ,SAAS,WAAY;AAC3B,YAAQ,YAAY,KAAK,MAAM;AAAA,MAC7B;AAAA,MAAI;AAAA,MAAG;AAAA,MACP;AAAA,MAAI;AAAA,MAAG;AAAA,MACP;AAAA,MAAI;AAAA,MAAG;AAAA;AAAA;AAIX,UAAQ,SAAS,WAAY;AAC3B,YAAQ,YAAY,KAAK,MAAM;AAAA,MAC7B;AAAA,MAAI;AAAA,MAAI;AAAA,MACR;AAAA,MAAG;AAAA,MAAG;AAAA,MACN;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA;AAIV,UAAQ,UAAU,SAAU,QAAQ;AAClC,UAAM,IAAI,UAAU;AACpB,YAAQ,YAAY,KAAK,MAAM;AAAA,MAC7B;AAAA,MAAG,KAAK;AAAA,MAAG;AAAA,MACX,KAAK;AAAA,MAAG,IAAI,IAAI;AAAA,MAAG,KAAK;AAAA,MACxB;AAAA,MAAG,KAAK;AAAA,MAAG;AAAA;AAAA;AAIf,UAAQ,SAAS,SAAU,MAAM;AAC/B,UAAM,IAAI,QAAQ;AAClB,YAAQ,YAAY,KAAK,MAAM;AAAA,MAC7B,KAAK;AAAA,MAAG,KAAK;AAAA,MAAG;AAAA,MAChB,KAAK;AAAA,MAAG;AAAA,MAAG,IAAI;AAAA,MACf;AAAA,MAAG,IAAI;AAAA,MAAG,IAAI;AAAA;AAAA;AAMlB,UAAQ,OAAO,SAAU,MAAM;AAC7B,UAAM,YAAa,OAAO,IAAK;AAC/B,UAAM,YAAa,OAAO,IAAK;AAC/B,UAAM,UAAU,eAAe,QAAQ,KAAK;AAE5C,OAAG,UAAU,QAAQ,QAAQ,IAAI,GAAG;AACpC,UAAM,KAAK;AAEX,OAAG,UAAU,QAAQ,QAAQ,IAAI,WAAW;AAC5C;AAAA;AAGF,UAAQ,KAAK,SAAS;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK;AAIP,UAAQ,WAAW,SAAU,MAAM;AACjC,UAAM,YAAa,OAAQ;AAC3B,UAAM,YAAa,OAAQ;AAC3B,UAAM,UAAU,eAAe,QAAQ,SAAS;AAEhD,OAAG,UAAU,QAAQ,QAAQ,MAAM,WAAW;AAC9C;AAAA;AAGF,UAAQ,SAAS,SAAS;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK;AAAA;;;ACjhBT,IAAM,UAAU;AAEhB,IAAI;AACJ,IAAI;AAEJ,IAAI;AAKG,kBAAiB,OAAO,SAA0F;AACvH,MAAI;AACJ,MAAI,CAAC;AAAO,UAAM,IAAI,MAAM;AAE5B,MACE,CAAE,kBAAoB,4BACnB,CAAE,QAAO,UAAU,eAAe,iBAAiB,UACnD,CAAE,QAAO,cAAc,eAAe,iBAAiB,cACvD,CAAE,QAAO,gBAAgB,eAAe,iBAAiB,gBACzD,CAAE,QAAO,qBAAqB,eAAe,iBAAiB,qBAC9D,CAAE,QAAO,qBAAqB,eAAe,iBAAiB,qBAC9D,CAAE,QAAO,qBAAqB,eAAe,iBAAiB,qBAC9D,CAAE,QAAO,sBAAsB,eAAe,iBAAiB,sBAC/D,CAAE,QAAO,oBAAoB,eAAe,iBAAiB,kBAChE;AACA,UAAM,IAAI,MAAM;AAAA;AAElB,MAAI,iBAAoB,yBAAQ;AAE9B,QAAI,MAAM,SAAS,MAAM,MAAM,WAAW,KAAK,MAAM,MAAM,OAAO,KAAK,MAAM,MAAM,OAAO;AAAG,eAAS,AAAG,uBAAM;AAAA;AAC1G,YAAM,IAAI,MAAM,2EAA2E,MAAM;AAAA,SACjG;AAEL,UAAM,gBAAgB,MAAM,mBAAmB,MAAM,iBAAiB,MAAM,YAAa,MAAM,YAAa,MAAM,SAAS,KAAK;AAChI,UAAM,iBAAiB,MAAM,oBAAoB,MAAM,kBAAkB,MAAM,aAAc,MAAM,YAAa,MAAM,SAAS,KAAK;AACpI,QAAI,cAAc;AAClB,QAAI,eAAe;AACnB,QAAI,cAAc,SAAS;AACzB,oBAAc;AACd,qBAAe,cAAc,iBAAiB;AAAA;AAEhD,QAAI,eAAe,SAAS;AAC1B,qBAAe;AACf,oBAAc,eAAe,gBAAgB;AAAA;AAI/C,QAAI,QAAO,OAAO,QAAQ;AAAG,oBAAc,QAAO,OAAO;AAAA,aAChD,QAAO,OAAO,SAAS;AAAG,oBAAc,gBAAiB,SAAO,OAAO,SAAS;AACzF,QAAI,QAAO,OAAO,SAAS;AAAG,qBAAe,QAAO,OAAO;AAAA,aAClD,QAAO,OAAO,QAAQ;AAAG,qBAAe,iBAAkB,SAAO,OAAO,QAAQ;AACzF,QAAI,CAAC,eAAe,CAAC;AAAc,YAAM,IAAI,MAAM;AACnD,QAAI,CAAC,YAAa,sCAAU,WAAU,eAAiB,sCAAU,YAAW,cAAe;AACzF,iBAAY,OAAO,oBAAoB,cAAe,IAAI,gBAAgB,aAAa,gBAAgB,SAAS,cAAc;AAC9H,UAAI,sCAAU,WAAU;AAAa,iBAAS,QAAQ;AACtD,UAAI,sCAAU,YAAW;AAAc,iBAAS,SAAS;AAAA;AAI3D,UAAM,MAAM,SAAS,WAAW;AAChC,QAAI,iBAAiB,WAAW;AAC9B,UAAI,aAAa,OAAO,GAAG;AAAA,WACtB;AACL,UAAI,QAAO,OAAO,QAAQ,OAAO,IAAI,cAAc,aAAa;AAC9D,YAAI,UAAU,eAAe;AAC7B,YAAI,MAAM,IAAI;AACd,YAAI,UAAU,OAAO,GAAG,GAAG,eAAe,gBAAgB,GAAG,GAAG,qCAAU,OAAO,qCAAU;AAC3F,YAAI,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG;AAAA,aAC3B;AACL,YAAI,UAAU,OAAO,GAAG,GAAG,eAAe,gBAAgB,GAAG,GAAG,qCAAU,OAAO,qCAAU;AAAA;AAAA;AAK/F,QAAI,QAAO,OAAO,SAAS;AACzB,UAAI,CAAC,MAAM,CAAC,aAAc,SAAS,UAAU,UAAU,SAAW,sCAAU,YAAW,wCAAW,SAAS;AACzG,oBAAa,OAAO,oBAAoB,cAAe,IAAI,gBAAgB,qCAAU,OAAO,qCAAU,UAAU,SAAS,cAAc;AACvI,YAAI,wCAAW,WAAU,sCAAU;AAAO,oBAAU,QAAQ,qCAAU;AACtE,YAAI,wCAAW,YAAW,sCAAU;AAAQ,oBAAU,SAAS,qCAAU;AAEzE,aAAK,AAAG,qBAAI,MAAM,aAAa,IAAY,cAAc,EAAE,QAAQ,eAAe;AAAA;AAEpF,UAAI,CAAC;AAAI,eAAO,EAAE,QAAQ,MAAM,QAAQ;AACxC,SAAG;AACH,SAAG,UAAU,cAAc,QAAO,OAAO;AACzC,UAAI,QAAO,OAAO,aAAa;AAAG,WAAG,UAAU,YAAY,QAAO,OAAO;AACzE,UAAI,QAAO,OAAO,cAAc;AAAG,WAAG,UAAU,WAAW,QAAO,OAAO;AACzE,UAAI,QAAO,OAAO,SAAS;AAAG,WAAG,UAAU,QAAQ,QAAO,OAAO;AACjE,UAAI,QAAO,OAAO,eAAe;AAAG,WAAG,UAAU,cAAc,QAAO,OAAO;AAC7E,UAAI,QAAO,OAAO,QAAQ;AAAG,WAAG,UAAU,OAAO,QAAO,OAAO;AAC/D,UAAI,QAAO,OAAO;AAAU,WAAG,UAAU;AACzC,UAAI,QAAO,OAAO;AAAO,WAAG,UAAU;AACtC,UAAI,QAAO,OAAO;AAAS,WAAG,UAAU;AACxC,UAAI,QAAO,OAAO;AAAO,WAAG,UAAU;AACtC,UAAI,QAAO,OAAO;AAAY,WAAG,UAAU;AAC3C,UAAI,QAAO,OAAO;AAAa,WAAG,UAAU;AAC5C,UAAI,QAAO,OAAO;AAAU,WAAG,UAAU;AACzC,UAAI,QAAO,OAAO,aAAa;AAAG,WAAG,UAAU,YAAY,QAAO,OAAO;AACzE,SAAG,MAAM;AAAA,WAsBJ;AACL,kBAAY;AACZ,UAAI;AAAI,aAAK;AAAA;AAIf,QAAI;AACJ,QAAI,UAAU,MAAM;AAClB,YAAM,QAAQ,CAAC,UAAU,QAAQ,UAAU,OAAO;AAClD,eAAS,AAAG,0BAAS,UAAU,MAAM,OAAO;AAAA,eACnC,qBAAqB,WAAW;AACzC,eAAS,AAAG,yBAAQ,WAAW;AAAA,eACtB,QAAO,YAAY,WAAW,QAAO,YAAY,WAAW;AAErE,YAAM,aAAc,OAAO,oBAAoB,cAAe,IAAI,gBAAgB,aAAa,gBAAgB,SAAS,cAAc;AACtI,iBAAW,QAAQ;AACnB,iBAAW,SAAS;AACpB,YAAM,UAAU,WAAW,WAAW;AACtC,yCAAS,UAAU,WAAW,GAAG;AACjC,eAAS,AAAG,yBAAQ,WAAW;AAAA,WAC1B;AAEL,YAAM,aAAc,OAAO,oBAAoB,cAAe,IAAI,gBAAgB,aAAa,gBAAgB,SAAS,cAAc;AACtI,iBAAW,QAAQ;AACnB,iBAAW,SAAS;AACpB,YAAM,UAAU,WAAW,WAAW;AACtC,yCAAS,UAAU,WAAW,GAAG;AACjC,YAAM,QAAO,mCAAS,aAAa,GAAG,GAAG,aAAa;AACtD,eAAS,AAAG,yBAAQ,WAAW;AAAA;AAEjC,UAAM,SAAS,OAAO;AACtB,aAAS,OAAO,WAAW;AAC3B,WAAO;AACP,WAAO;AAAA;AAET,QAAM,UAAS,QAAO,OAAO,SAAS,YAAY;AAClD,SAAO,EAAE,QAAQ;AAAA;;;AC/JnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8CO,IAAM,UAAuB;AAAA,EAClC,OAAe;AAAA,EACf,YAAoB;AAAA,EACpB,aAAqB;AAAA,EACrB,MAAc;AAAA,EACd,YAAoB;AAAA,EACpB,WAAmB;AAAA,EACnB,WAAmB;AAAA,EACnB,WAAmB;AAAA,EACnB,YAAqB;AAAA,EACrB,YAAqB;AAAA,EACrB,WAAoB;AAAA,EACpB,cAAuB;AAAA,EACvB,cAAuB;AAAA,EACvB,UAAmB;AAAA,EACnB,WAAoB;AAAA,EACpB,gBAAyB;AAAA,EACzB,aAAsB;AAAA,EACtB,kBAA2B;AAAA;AAG7B,eAAe,KAAK,GAAG,GAAG,IAAI,GAAG,cAAc;AAC7C,MAAI,YAAY,aAAa,YAAY,IAAI,QAAQ,QAAS,IAAI,MAAO,QAAS,IAAI,iBAAkB,aAAa;AACrH,MAAI;AACJ,MAAI,IAAI,GAAG,GAAG,aAAa,WAAW,GAAG,IAAI,KAAK;AAClD,MAAI;AAAA;AAGN,cAAc,KAAK,GAAG,GAAG,OAAO,QAAQ,cAAc;AACpD,MAAI;AACJ,MAAI,aAAa,WAAW;AAC1B,UAAM,KAAM,KAAI,IAAI,SAAS;AAC7B,UAAM,KAAM,KAAI,IAAI,UAAU;AAC9B,QAAI,QAAQ,IAAI,IAAI,QAAQ,GAAG,SAAS,GAAG,GAAG,GAAG,IAAI,KAAK;AAAA,SACrD;AACL,QAAI,YAAY,aAAa;AAC7B,QAAI,OAAO,IAAI,aAAa,WAAW;AACvC,QAAI,OAAO,IAAI,QAAQ,aAAa,WAAW;AAC/C,QAAI,iBAAiB,IAAI,OAAO,GAAG,IAAI,OAAO,IAAI,aAAa;AAC/D,QAAI,OAAO,IAAI,OAAO,IAAI,SAAS,aAAa;AAChD,QAAI,iBAAiB,IAAI,OAAO,IAAI,QAAQ,IAAI,QAAQ,aAAa,WAAW,IAAI;AACpF,QAAI,OAAO,IAAI,aAAa,WAAW,IAAI;AAC3C,QAAI,iBAAiB,GAAG,IAAI,QAAQ,GAAG,IAAI,SAAS,aAAa;AACjE,QAAI,OAAO,GAAG,IAAI,aAAa;AAC/B,QAAI,iBAAiB,GAAG,GAAG,IAAI,aAAa,WAAW;AACvD,QAAI;AAAA;AAEN,MAAI;AAAA;AAGN,eAAe,KAAK,SAAqC,IAAI,cAAc;AACzE,MAAI,WAAW,UAAa,OAAO,WAAW;AAAG;AACjD,MAAI;AACJ,MAAI,OAAO,OAAO,GAAG,IAAI,OAAO,GAAG;AACnC,aAAW,MAAM,QAAQ;AACvB,QAAI,cAAc,aAAa,YAAY,GAAG,KAAK,QAAQ,QAAS,IAAI,GAAG,OAAQ,QAAS,IAAI,GAAG,kBAAmB,aAAa;AACnI,QAAI,YAAY,aAAa,YAAY,GAAG,KAAK,QAAQ,QAAS,IAAI,GAAG,OAAQ,QAAS,IAAI,GAAG,kBAAmB,aAAa;AACjI,QAAI,OAAO,GAAG,IAAI,KAAK,MAAM,GAAG;AAAA;AAElC,MAAI;AACJ,MAAI,aAAa,cAAc;AAC7B,QAAI;AACJ,QAAI;AAAA;AAAA;AAIR,gBAAgB,KAAK,SAAqC,IAAI,cAAc;AAC1E,MAAI,WAAW,UAAa,OAAO,WAAW;AAAG;AACjD,MAAI,CAAC,aAAa,aAAa,OAAO,UAAU,GAAG;AACjD,UAAM,KAAK,QAAQ;AACnB;AAAA;AAEF,MAAI,OAAO,OAAO,GAAG,IAAI,OAAO,GAAG;AACnC,WAAS,IAAI,GAAG,IAAI,OAAO,SAAS,GAAG,KAAK;AAC1C,UAAM,KAAM,QAAO,GAAG,KAAK,OAAO,IAAI,GAAG,MAAM;AAC/C,UAAM,KAAM,QAAO,GAAG,KAAK,OAAO,IAAI,GAAG,MAAM;AAC/C,QAAI,iBAAiB,OAAO,GAAG,IAAI,OAAO,GAAG,IAAI,IAAI;AAAA;AAEvD,MAAI,iBAAiB,OAAO,OAAO,SAAS,GAAG,IAAI,OAAO,OAAO,SAAS,GAAG,IAAI,OAAO,OAAO,SAAS,GAAG,IAAI,OAAO,OAAO,SAAS,GAAG;AACzI,MAAI;AACJ,MAAI,aAAa,cAAc;AAC7B,QAAI;AACJ,QAAI;AAAA;AAAA;AAIR,uBAA8B,WAA6B,QAAwB,aAA2B;AAC5G,QAAM,eAAe,UAAU,SAAS;AACxC,MAAI,CAAC,UAAU,CAAC;AAAU;AAC1B,MAAI,CAAE,sBAAoB;AAAoB;AAC9C,QAAM,MAAM,UAAS,WAAW;AAChC,MAAI,CAAC;AAAK;AACV,MAAI,OAAO,aAAa;AACxB,MAAI,YAAY,aAAa;AAC7B,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,QAAI,QAAc;AAClB,QAAI,OAAa;AACjB,KAAC,OAAO,QAAQ,OAAO,QAAQ,OAAO;AACtC,QAAK,KAAK,SAAS,KAAO,KAAK,GAAG,SAAS,GAAI;AAC7C,YAAM,SAAS,MAAM,KAAK,IAAI,IAAI,MAAM,OAAO;AAC/C,YAAM,QAAQ,GAAG,MAAM,MAAM,WAAW,KAAK;AAC7C,UAAI,aAAa,eAAe,aAAa,gBAAgB,IAAI;AAC/D,YAAI,YAAY,aAAa;AAC7B,YAAI,SAAS,OAAO,GAAG,IAAK,IAAI,aAAa;AAAA;AAE/C,UAAI,YAAY,aAAa;AAC7B,UAAI,SAAS,OAAO,GAAG,IAAK,IAAI,aAAa;AAC7C,WAAK;AAAA;AAAA;AAAA;AAKX,qBAA2B,WAA6B,QAAqB,aAA2B;AACtG,QAAM,eAAe,UAAU,SAAS;AACxC,MAAI,CAAC,UAAU,CAAC;AAAU;AAC1B,MAAI,CAAE,sBAAoB;AAAoB;AAC9C,QAAM,MAAM,UAAS,WAAW;AAChC,MAAI,CAAC;AAAK;AACV,aAAW,KAAK,QAAQ;AACtB,QAAI,OAAO,aAAa;AACxB,QAAI,cAAc,aAAa;AAC/B,QAAI,YAAY,aAAa;AAC7B,QAAI,aAAa,WAAW;AAC1B,UAAI,aAAa;AAAa,aAAK,KAAK,UAAS,QAAQ,EAAE,OAAO,IAAI,UAAS,SAAS,EAAE,OAAO,IAAI,UAAS,QAAQ,EAAE,OAAO,IAAI,UAAS,SAAS,EAAE,OAAO,IAAI;AAAA;AAC7J,aAAK,KAAK,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI;AAAA;AAGzD,UAAM,UAAkB;AACxB,YAAO,KAAK,oBAAoB,KAAK,MAAM,MAAM,EAAE;AACnD,QAAI,EAAE;AAAkB,cAAO,KAAK,GAAG,EAAE,UAAU,MAAM,KAAK,MAAM,MAAM,EAAE;AAE5E,QAAI,EAAE;AAAK,cAAO,KAAK,QAAQ,EAAE,OAAO;AACxC,QAAI,EAAE;AAAM,cAAO,KAAK,kBAAkB,EAAE;AAC5C,QAAI,EAAE,WAAW,EAAE,QAAQ,SAAS,GAAG;AACrC,YAAM,WAAU,EAAE,QAAQ,IAAI,CAAC,MAAM,GAAG,KAAK,MAAM,MAAM,EAAE,WAAW,EAAE;AACxE,cAAO,KAAK,SAAQ,KAAK;AAAA;AAE3B,QAAI,EAAE,YAAY,EAAE,SAAS,SAAS,EAAE,SAAS,MAAM;AAAM,cAAO,KAAK,SAAS,KAAK,MAAM,MAAM,EAAE,SAAS,MAAM,QAAQ,WAAW,KAAK,MAAM,MAAM,EAAE,SAAS,MAAM,OAAO,aAAa,KAAK,MAAM,MAAM,EAAE,SAAS,MAAM,SAAS;AACxO,QAAI,QAAO,WAAW;AAAG,cAAO,KAAK;AACrC,QAAI,YAAY,aAAa;AAC7B,aAAS,IAAI,QAAO,SAAS,GAAG,KAAK,GAAG,KAAK;AAC3C,YAAM,IAAI,KAAK,IAAI,EAAE,IAAI,IAAI;AAC7B,YAAM,IAAI,IAAI,aAAa,aAAa,EAAE,IAAI;AAC9C,UAAI,aAAa,eAAe,aAAa,gBAAgB,IAAI;AAC/D,YAAI,YAAY,aAAa;AAC7B,YAAI,SAAS,QAAO,IAAI,IAAI,GAAG,IAAI;AAAA;AAErC,UAAI,YAAY,aAAa;AAC7B,UAAI,SAAS,QAAO,IAAI,IAAI,GAAG,IAAI;AAAA;AAErC,QAAI,YAAY;AAChB,QAAI,EAAE,QAAQ,EAAE,KAAK,SAAS,GAAG;AAC/B,UAAI,aAAa,YAAY;AAC3B,mBAAW,MAAM,EAAE;AAAM,gBAAM,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;AAAA;AAG3D,UAAI,aAAa,cAAc;AAC7B,YAAI,YAAY;AAChB,iBAAS,IAAI,GAAG,IAAI,OAAc,SAAS,GAAG,KAAK;AACjD,gBAAM,SAAS;AAAA,YACb,OAAc,IAAI,IAAI;AAAA,YACtB,OAAc,IAAI,IAAI;AAAA,YACtB,OAAc,IAAI,IAAI;AAAA,YACtB,IAAI,CAAC,UAAU,EAAE,KAAK;AACxB,gBAAM,KAAK,QAAQ;AAAA;AAGrB,YAAI,EAAE,eAAe,EAAE,YAAY,gBAAgB;AACjD,cAAI,cAAc,aAAa,WAAW,6BAA6B,aAAa;AACpF,cAAI;AACJ,gBAAM,QAAQ,KAAK,IAAI,EAAE,YAAY,eAAe,GAAG,KAAK,EAAE,YAAY,eAAe,GAAG,MAAM;AAClG,gBAAM,QAAQ,KAAK,IAAI,EAAE,YAAY,eAAe,GAAG,KAAK,EAAE,YAAY,eAAe,GAAG,MAAM;AAClG,cAAI,QAAQ,EAAE,YAAY,eAAe,GAAG,IAAI,EAAE,YAAY,eAAe,GAAG,IAAI,OAAO,OAAO,GAAG,GAAG,IAAI,KAAK;AACjH,cAAI;AACJ,cAAI,aAAa,cAAc;AAC7B,gBAAI,YAAY,aAAa,WAAW,6BAA6B,aAAa;AAClF,gBAAI;AAAA;AAAA;AAGR,YAAI,EAAE,eAAe,EAAE,YAAY,iBAAiB;AAClD,cAAI,cAAc,aAAa,WAAW,6BAA6B,aAAa;AACpF,cAAI;AACJ,gBAAM,QAAQ,KAAK,IAAI,EAAE,YAAY,gBAAgB,GAAG,KAAK,EAAE,YAAY,gBAAgB,GAAG,MAAM;AACpG,gBAAM,QAAQ,KAAK,IAAI,EAAE,YAAY,gBAAgB,GAAG,KAAK,EAAE,YAAY,gBAAgB,GAAG,MAAM;AACpG,cAAI,QAAQ,EAAE,YAAY,gBAAgB,GAAG,IAAI,EAAE,YAAY,gBAAgB,GAAG,IAAI,OAAO,OAAO,GAAG,GAAG,IAAI,KAAK;AACnH,cAAI;AACJ,cAAI,aAAa,cAAc;AAC7B,gBAAI,YAAY,aAAa,WAAW,6BAA6B,aAAa;AAClF,gBAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQhB,IAAM,gBAAsB;AAC5B,qBAA2B,WAA6B,QAAqB,aAA2B;AApPxG;AAqPE,QAAM,eAAe,UAAU,SAAS;AACxC,MAAI,CAAC,UAAU,CAAC;AAAU;AAC1B,MAAI,CAAE,sBAAoB;AAAoB;AAC9C,QAAM,MAAM,UAAS,WAAW;AAChC,MAAI,CAAC;AAAK;AACV,MAAI,WAAW;AACf,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,QAAI,CAAC,cAAc,MAAM,aAAa;AAAgB,oBAAc,KAAK,KAAK,OAAO;AACrF,QAAI,cAAc,aAAa;AAC/B,QAAI,YAAY,aAAa;AAC7B,QAAI,YAAY,aAAa;AAC7B,QAAI,OAAO,aAAa;AACxB,QAAI,aAAa,aAAa,OAAO,GAAG,OAAO,cAAO,GAAG,QAAV,mBAAe,YAAW,GAAG;AAE1E,WAAK,KAAK,OAAO,GAAG,IAAI,IAAI,OAAO,GAAG,IAAI,IAAI,OAAO,GAAG,IAAI,IAAI,OAAO,GAAG,IAAI,IAAI;AAClF,UAAI,aAAa,YAAY;AAC3B,YAAI,aAAa,eAAe,aAAa,gBAAgB,IAAI;AAC/D,cAAI,YAAY,aAAa;AAE7B,cAAI,SAAS,QAAQ,MAAM,OAAO,GAAG,UAAU,OAAO,GAAG,IAAI,KAAK,GAAG,IAAI,OAAO,GAAG,IAAI,KAAK,aAAa,YAAY,OAAO,GAAG,IAAI;AAAA;AAErI,YAAI,YAAY,aAAa;AAE7B,YAAI,SAAS,QAAQ,MAAM,OAAO,GAAG,UAAU,OAAO,GAAG,IAAI,KAAK,GAAG,IAAI,OAAO,GAAG,IAAI,KAAK,aAAa,YAAY,OAAO,GAAG,IAAI;AAAA;AAAA;AAGvI,QAAI,aAAa,YAAY;AAC3B,eAAS,KAAK,GAAG,KAAK,OAAO,GAAG,UAAU,QAAQ,MAAM;AACtD,YAAI,YAAY,aAAa,YAAY,OAAO,GAAG,UAAU,IAAI,SAAS,IAAI,QAAQ,QAAS,IAAI,OAAO,GAAG,UAAU,IAAI,SAAS,MAAO,QAAS,IAAI,OAAO,GAAG,UAAU,IAAI,SAAS,iBAAkB,aAAa;AACxN,YAAI,aAAa,gBAAgB;AAC/B,wBAAc,GAAG,UAAU,IAAI,KAAM,eAAc,GAAG,UAAU,IAAI,KAAK,OAAO,GAAG,UAAU,IAAI,SAAS,KAAK;AAC/G,wBAAc,GAAG,UAAU,IAAI,KAAM,eAAc,GAAG,UAAU,IAAI,KAAK,OAAO,GAAG,UAAU,IAAI,SAAS,KAAK;AAC/G,gBAAM,KAAK,cAAc,GAAG,UAAU,IAAI,IAAI,cAAc,GAAG,UAAU,IAAI,IAAI,GAAG;AAAA,eAC/E;AACL,gBAAM,KAAK,OAAO,GAAG,UAAU,IAAI,SAAS,GAAG,OAAO,GAAG,UAAU,IAAI,SAAS,GAAG,GAAG;AAAA;AAAA;AAAA;AAI5F,QAAI,aAAa,YAAY;AAC3B,UAAI,OAAO,aAAa;AACxB,UAAI,OAAO,GAAG,WAAW;AACvB,mBAAW,MAAM,OAAO,GAAG,WAAW;AACpC,cAAI,YAAY,aAAa,YAAY,GAAG,SAAS,IAAI,QAAQ,QAAS,IAAI,GAAG,SAAS,MAAO,QAAS,IAAI,GAAG,SAAS,iBAAkB,aAAa;AACzJ,cAAI,SAAS,GAAG,GAAG,QAAQ,KAAK,MAAM,MAAM,GAAG,WAAW,GAAG,SAAS,IAAI,GAAG,GAAG,SAAS,IAAI;AAAA;AAAA;AAAA;AAInG,QAAI,aAAa,gBAAgB,OAAO,GAAG,WAAW;AACpD,UAAI;AACJ,YAAM,SAAgB;AAEtB,aAAO,SAAS;AAChB,aAAO,OAAO,GAAG,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS;AAClD,UAAI;AAAM,eAAO,KAAK,CAAC,KAAK,SAAS,GAAG,KAAK,SAAS;AACtD,aAAO,OAAO,GAAG,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS;AAClD,UAAI;AAAM,eAAO,KAAK,CAAC,KAAK,SAAS,GAAG,KAAK,SAAS;AACtD,aAAO,KAAK,QAAQ;AAEpB,aAAO,SAAS;AAChB,aAAO,OAAO,GAAG,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS;AAClD,UAAI;AAAM,eAAO,KAAK,CAAC,KAAK,SAAS,GAAG,KAAK,SAAS;AACtD,aAAO,OAAO,GAAG,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS;AAClD,UAAI;AAAM,eAAO,KAAK,CAAC,KAAK,SAAS,GAAG,KAAK,SAAS;AACtD,aAAO,OAAO,GAAG,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS;AAClD,UAAI;AAAM,eAAO,KAAK,CAAC,KAAK,SAAS,GAAG,KAAK,SAAS;AACtD,aAAO,OAAO,GAAG,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS;AAClD,UAAI;AAAM,eAAO,KAAK,CAAC,KAAK,SAAS,GAAG,KAAK,SAAS;AACtD,UAAI,OAAO,WAAW;AAAG,cAAM,KAAK,QAAQ;AAE5C,aAAO,SAAS;AAChB,aAAO,OAAO,GAAG,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS;AAClD,UAAI;AAAM,eAAO,KAAK,CAAC,KAAK,SAAS,GAAG,KAAK,SAAS;AACtD,aAAO,OAAO,GAAG,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS;AAClD,UAAI;AAAM,eAAO,KAAK,CAAC,KAAK,SAAS,GAAG,KAAK,SAAS;AACtD,aAAO,OAAO,GAAG,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS;AAClD,UAAI;AAAM,eAAO,KAAK,CAAC,KAAK,SAAS,GAAG,KAAK,SAAS;AACtD,aAAO,OAAO,GAAG,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS;AAClD,UAAI;AAAM,eAAO,KAAK,CAAC,KAAK,SAAS,GAAG,KAAK,SAAS;AACtD,aAAO,OAAO,GAAG,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS;AAClD,UAAI;AAAM,eAAO,KAAK,CAAC,KAAK,SAAS,GAAG,KAAK,SAAS;AACtD,aAAO,KAAK,QAAQ;AAEpB,aAAO,SAAS;AAChB,aAAO,OAAO,GAAG,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS;AAClD,UAAI;AAAM,eAAO,KAAK,CAAC,KAAK,SAAS,GAAG,KAAK,SAAS;AACtD,aAAO,OAAO,GAAG,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS;AAClD,UAAI;AAAM,eAAO,KAAK,CAAC,KAAK,SAAS,GAAG,KAAK,SAAS;AACtD,aAAO,OAAO,GAAG,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS;AAClD,UAAI;AAAM,eAAO,KAAK,CAAC,KAAK,SAAS,GAAG,KAAK,SAAS;AACtD,aAAO,OAAO,GAAG,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS;AAClD,UAAI;AAAM,eAAO,KAAK,CAAC,KAAK,SAAS,GAAG,KAAK,SAAS;AACtD,aAAO,OAAO,GAAG,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS;AAClD,UAAI;AAAM,eAAO,KAAK,CAAC,KAAK,SAAS,GAAG,KAAK,SAAS;AACtD,aAAO,KAAK,QAAQ;AAEpB,aAAO,SAAS;AAChB,aAAO,OAAO,GAAG,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS;AAClD,UAAI;AAAM,eAAO,KAAK,CAAC,KAAK,SAAS,GAAG,KAAK,SAAS;AACtD,aAAO,OAAO,GAAG,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS;AAClD,UAAI;AAAM,eAAO,KAAK,CAAC,KAAK,SAAS,GAAG,KAAK,SAAS;AACtD,aAAO,OAAO,GAAG,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS;AAClD,UAAI;AAAM,eAAO,KAAK,CAAC,KAAK,SAAS,GAAG,KAAK,SAAS;AACtD,aAAO,OAAO,GAAG,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS;AAClD,UAAI;AAAM,eAAO,KAAK,CAAC,KAAK,SAAS,GAAG,KAAK,SAAS;AACtD,aAAO,KAAK,QAAQ;AAEpB,aAAO,SAAS;AAChB,aAAO,OAAO,GAAG,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS;AAClD,UAAI;AAAM,eAAO,KAAK,CAAC,KAAK,SAAS,GAAG,KAAK,SAAS;AACtD,aAAO,OAAO,GAAG,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS;AAClD,UAAI;AAAM,eAAO,KAAK,CAAC,KAAK,SAAS,GAAG,KAAK,SAAS;AACtD,aAAO,OAAO,GAAG,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS;AAClD,UAAI;AAAM,eAAO,KAAK,CAAC,KAAK,SAAS,GAAG,KAAK,SAAS;AACtD,aAAO,OAAO,GAAG,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS;AAClD,UAAI;AAAM,eAAO,KAAK,CAAC,KAAK,SAAS,GAAG,KAAK,SAAS;AACtD,aAAO,KAAK,QAAQ;AAAA;AAAA;AAAA;AAM1B,qBAA2B,WAA6B,QAAqB,aAA2B;AACtG,QAAM,eAAe,UAAU,SAAS;AACxC,MAAI,CAAC,UAAU,CAAC;AAAU;AAC1B,MAAI,CAAE,sBAAoB;AAAoB;AAC9C,QAAM,MAAM,UAAS,WAAW;AAChC,MAAI,CAAC;AAAK;AACV,MAAI,WAAW;AACf,MAAI,OAAO,aAAa;AACxB,aAAW,KAAK,QAAQ;AACtB,QAAI,aAAa,WAAW;AAC1B,UAAI,cAAc,aAAa;AAC/B,UAAI,YAAY,aAAa;AAC7B,UAAI;AACJ,UAAI,CAAC,aAAa,kBAAkB;AAClC,eAAM,aAAa,cAAc,EAAE,SAAS,EAAE;AAAA,aACzC;AACL,eAAM,CAAC,OAAO,kBAAkB,OAAO,kBAAkB,GAAG;AAC5D,YAAI,EAAE,aAAa,EAAE,UAAU,SAAS,GAAG;AACzC,qBAAW,MAAM,EAAE,WAAW;AAC5B,gBAAI,GAAG,KAAK,KAAI;AAAI,mBAAI,KAAK,GAAG;AAChC,gBAAI,GAAG,KAAK,KAAI;AAAI,mBAAI,KAAK,GAAG;AAChC,gBAAI,GAAG,KAAK,KAAI;AAAI,mBAAI,KAAK,GAAG;AAChC,gBAAI,GAAG,KAAK,KAAI;AAAI,mBAAI,KAAK,GAAG;AAAA;AAElC,eAAI,MAAM,KAAI;AACd,eAAI,MAAM,KAAI;AAAA;AAAA;AAGlB,UAAI,aAAa;AAAa,aAAK,KAAK,UAAS,QAAQ,KAAI,IAAI,UAAS,SAAS,KAAI,IAAI,UAAS,QAAQ,KAAI,IAAI,UAAS,SAAS,KAAI,IAAI;AAAA;AACzI,aAAK,KAAK,KAAI,IAAI,KAAI,IAAI,KAAI,IAAI,KAAI,IAAI;AAC/C,UAAI,aAAa,YAAY;AAC3B,YAAI,aAAa,eAAe,aAAa,gBAAgB,IAAI;AAC/D,cAAI,YAAY,aAAa;AAC7B,cAAI,SAAS,QAAQ,KAAI,KAAK,GAAG,IAAI,KAAI,KAAK,aAAa,YAAY,KAAI;AAAA;AAE7E,YAAI,YAAY,aAAa;AAC7B,YAAI,SAAS,QAAQ,KAAI,KAAK,GAAG,IAAI,KAAI,KAAK,aAAa,YAAY,KAAI;AAAA;AAE7E,UAAI;AAAA;AAEN,QAAI,aAAa,YAAY;AAC3B,UAAI,EAAE,aAAa,EAAE,UAAU,SAAS,GAAG;AACzC,mBAAW,MAAM,EAAE,WAAW;AAC5B,cAAI,YAAY,aAAa,WAAW,QAAQ,QAAS,IAAI,GAAG,OAAQ,QAAS,IAAI,GAAG,kBAAmB,aAAa;AACxH,gBAAM,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG;AAAA;AAAA;AAAA;AAIlC,QAAI,aAAa,YAAY;AAC3B,YAAM,eAAe,CAAC,MAAM,UAAU;AACpC,YAAI,YAAY,aAAa,WAAW,QAAQ,QAAS,IAAI,KAAK,KAAK,SAAS,GAAG,OAAQ,QAAS,IAAI,KAAK,KAAK,SAAS,GAAG,kBAAmB,aAAa;AAC9J,YAAI,SAAS,OAAO,KAAK,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK,KAAK,SAAS,GAAG,KAAK;AAAA;AAE/E,UAAI,OAAO,aAAa;AACxB,mBAAa,EAAE,YAAY,gBAAgB;AAC3C,mBAAa,EAAE,YAAY,iBAAiB;AAC5C,mBAAa,EAAE,YAAY,eAAe;AAC1C,mBAAa,EAAE,YAAY,UAAU;AACrC,mBAAa,EAAE,YAAY,UAAU;AACrC,mBAAa,EAAE,YAAY,aAAa;AAAA;AAE1C,QAAI,aAAa,cAAc;AAC7B,YAAM,cAAc,CAAC,SAAS;AAC5B,YAAI,CAAC;AAAM;AACX,iBAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,cAAI;AACJ,cAAI,cAAc,aAAa,WAAW,QAAQ,QAAS,IAAI,KAAK,GAAG,OAAQ,QAAS,IAAI,KAAK,GAAG,kBAAmB,aAAa;AACpI,cAAI,OAAO,KAAK,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,GAAG;AAC/D,cAAI,OAAO,KAAK,GAAG,IAAI,KAAK,GAAG;AAC/B,cAAI;AAAA;AAAA;AAGR,UAAI,YAAY,aAAa;AAC7B,kBAAY,EAAE,YAAY;AAC1B,kBAAY,EAAE,YAAY;AAC1B,kBAAY,EAAE,YAAY;AAC1B,kBAAY,EAAE,YAAY;AAC1B,kBAAY,EAAE,YAAY;AAAA;AAAA;AAAA;AAMhC,sBAA6B,WAA6B,QAAqB,aAA2B;AACxG,QAAM,eAAe,UAAU,SAAS;AACxC,MAAI,CAAC,UAAU,CAAC;AAAU;AAC1B,MAAI,CAAE,sBAAoB;AAAoB;AAC9C,QAAM,MAAM,UAAS,WAAW;AAChC,MAAI,CAAC;AAAK;AACV,MAAI,WAAW;AACf,MAAI,OAAO,aAAa;AACxB,aAAW,KAAK,QAAQ;AACtB,QAAI,aAAa,WAAW;AAC1B,UAAI,cAAc,aAAa;AAC/B,UAAI,YAAY,aAAa;AAC7B,UAAI,aAAa;AAAa,aAAK,KAAK,UAAS,QAAQ,EAAE,OAAO,IAAI,UAAS,SAAS,EAAE,OAAO,IAAI,UAAS,QAAQ,EAAE,OAAO,IAAI,UAAS,SAAS,EAAE,OAAO,IAAI;AAAA;AAC7J,aAAK,KAAK,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI;AACvD,UAAI,aAAa,YAAY;AAC3B,cAAM,QAAQ,GAAG,KAAK,MAAM,MAAM,EAAE,WAAW,EAAE;AACjD,YAAI,aAAa,eAAe,aAAa,gBAAgB,IAAI;AAC/D,cAAI,YAAY,aAAa;AAC7B,cAAI,SAAS,OAAO,EAAE,IAAI,KAAK,GAAG,IAAI,EAAE,IAAI,KAAK,aAAa,YAAY,EAAE,IAAI;AAAA;AAElF,YAAI,YAAY,aAAa;AAC7B,YAAI,SAAS,OAAO,EAAE,IAAI,KAAK,GAAG,IAAI,EAAE,IAAI,KAAK,aAAa,YAAY,EAAE,IAAI;AAAA;AAElF,UAAI;AAAA;AAAA;AAAA;AAKV,sBAA6B,WAA6B,YAA8B;AACtF,MAAI,CAAC,aAAY,CAAC;AAAW;AAC7B,MAAI,CAAE,sBAAoB,sBAAsB,CAAE,uBAAqB;AAAoB;AAC3F,QAAM,SAAS,UAAS,WAAW;AACnC,mCAAQ,UAAU,WAAU,GAAG;AAAA;AAGjC,mBAA0B,WAA6B,QAAgB,aAA2B;AAChG,QAAM,eAAe,UAAU,SAAS;AACxC,MAAI,CAAC,UAAU,CAAC;AAAU;AAC1B,MAAI,CAAE,sBAAoB;AAAoB;AAC9C,QAAK,WAAU,OAAO,MAAM;AAC5B,QAAK,WAAU,OAAO,MAAM;AAC5B,QAAK,WAAU,OAAO,MAAM;AAC5B,UAAQ,WAAU,OAAO,SAAS;AAClC,SAAO,WAAU,OAAO,QAAQ;AAAA;;;AC3e3B,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;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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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 3fa895c8..c85bd5e3 100644 --- a/dist/human.esm.js +++ b/dist/human.esm.js @@ -5,41 +5,22438 @@ author: ' */ -var Y9=Object.defineProperty;var fm=e=>{if(typeof require!="undefined")return require(e);throw new Error('Dynamic require of "'+e+'" is not supported')};var Da=(e,t)=>{for(var n in t)Y9(e,n,{get:t[n],enumerable:!0})};var Xg=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)};var sn=(e,t,n)=>(Xg(e,t,"read from private field"),n?n.call(e):t.get(e)),qn=(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)},ya=(e,t,n,a)=>(Xg(e,t,"write to private field"),a?a.call(e,n):t.set(e,n),n);function zt(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 ce(...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 nt=()=>typeof performance!="undefined"?performance.now():parseInt((Number(process.hrtime.bigint())/1e3/1e3).toString());function Xn(...e){let t=n=>n&&typeof n=="object";return e.reduce((n,a)=>(Object.keys(a||{}).forEach(r=>{let s=n[r],i=a[r];Array.isArray(s)&&Array.isArray(i)?n[r]=s.concat(...i):t(s)&&t(i)?n[r]=Xn(s,i):n[r]=i}),n),{})}var Kg={backend:"webgl",modelBasePath:"../models/",wasmPath:"../node_modules/@tensorflow/tfjs-backend-wasm/dist//",debug:!0,async:!0,warmup:"full",cacheSensitivity:.01,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:!1,maxDetected:10,skipFrames:21,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:31,minConfidence:.1},emotion:{enabled:!0,minConfidence:.1,skipFrames:32,modelPath:"emotion.json"}},body:{enabled:!0,modelPath:"posenet.json",maxDetected:1,minConfidence:.1},hand:{enabled:!0,rotation:!1,skipFrames:32,minConfidence:.1,iouThreshold:.1,maxDetected:2,landmarks:!0,detector:{modelPath:"handdetect.json"},skeleton:{modelPath:"handskeleton.json"}},object:{enabled:!1,modelPath:"mb3-centernet.json",minConfidence:.2,iouThreshold:.4,maxDetected:10,skipFrames:41}};function Zg(){let e,t;if(typeof navigator!="undefined"){let n=navigator.userAgent.match(/\(([^()]+)\)/g);if(n&&n[0]){let a=n[0].match(/\(([^()]+)\)/g);e=a?a[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 Yd={};Da(Yd,{Abs:()=>ao,Acos:()=>ro,Acosh:()=>so,AdadeltaOptimizer:()=>th,AdagradOptimizer:()=>nh,AdamOptimizer:()=>ah,AdamaxOptimizer:()=>rh,Add:()=>Nr,AddN:()=>ls,All:()=>io,Any:()=>oo,ArgMax:()=>us,ArgMin:()=>vu,Asin:()=>lo,Asinh:()=>uo,Atan:()=>po,Atan2:()=>ho,Atanh:()=>co,AvgPool:()=>ds,AvgPool3D:()=>wu,AvgPool3DGrad:()=>zp,AvgPoolGrad:()=>Dp,BackendWasm:()=>w6,BatchMatMul:()=>ps,BatchToSpaceND:()=>ku,Bincount:()=>Op,BroadcastTo:()=>Vx,Callback:()=>f8,CallbackList:()=>i4,Cast:()=>cs,Ceil:()=>hs,ClipByValue:()=>Tr,Complex:()=>_p,ComplexAbs:()=>Iu,Concat:()=>fo,Conv2D:()=>fs,Conv2DBackpropFilter:()=>Pp,Conv2DBackpropInput:()=>ms,Conv3D:()=>Su,Conv3DBackpropFilterV2:()=>Lp,Conv3DBackpropInputV2:()=>Wp,Cos:()=>As,Cosh:()=>mo,CropAndResize:()=>Ao,Cumsum:()=>ys,CustomCallback:()=>l4,DataStorage:()=>Rp,DenseBincount:()=>Bp,DepthToSpace:()=>yo,DepthwiseConv2dNative:()=>gs,DepthwiseConv2dNativeBackpropFilter:()=>Vp,DepthwiseConv2dNativeBackpropInput:()=>jp,Diag:()=>Up,Dilation2D:()=>Nu,Dilation2DBackpropFilter:()=>Gp,Dilation2DBackpropInput:()=>Hp,ENV:()=>oa,EarlyStopping:()=>A8,Einsum:()=>qp,Elu:()=>go,EluGrad:()=>Xp,Environment:()=>Wx,Equal:()=>bo,Erf:()=>xo,Exp:()=>bs,ExpandDims:()=>vo,Expm1:()=>wo,FFT:()=>Kp,Fill:()=>Tu,FlipLeftRight:()=>ko,Floor:()=>vs,FloorDiv:()=>ws,FromPixels:()=>pc,FusedBatchNorm:()=>ks,FusedConv2D:()=>ai,FusedDepthwiseConv2D:()=>ri,GPGPUContext:()=>vh,GatherNd:()=>So,GatherV2:()=>Io,GraphModel:()=>G8,Greater:()=>No,GreaterEqual:()=>Is,History:()=>o4,IFFT:()=>Zp,Identity:()=>Ss,Imag:()=>Yp,InputSpec:()=>Mt,IsFinite:()=>To,IsInf:()=>Eo,IsNan:()=>Co,KernelBackend:()=>gu,LRN:()=>Ru,LRNGrad:()=>Qp,LayerVariable:()=>t4,LayersModel:()=>fr,LeakyRelu:()=>Ns,Less:()=>Ro,LessEqual:()=>Mo,LinSpace:()=>Jp,Log:()=>Ts,Log1p:()=>Fo,LogSoftmax:()=>jx,LogicalAnd:()=>$o,LogicalNot:()=>Eu,LogicalOr:()=>Cu,MathBackendCPU:()=>lh,MathBackendWebGL:()=>Ll,Max:()=>Es,MaxPool:()=>Rs,MaxPool3D:()=>Mu,MaxPool3DGrad:()=>tc,MaxPoolGrad:()=>ec,MaxPoolWithArgmax:()=>nc,Maximum:()=>Cs,Mean:()=>Ms,Min:()=>Fs,Minimum:()=>$s,MirrorPad:()=>Ds,Mod:()=>Do,MomentumOptimizer:()=>sh,Multinomial:()=>ac,Multiply:()=>zs,Neg:()=>zo,NonMaxSuppressionV3:()=>_o,NonMaxSuppressionV4:()=>Po,NonMaxSuppressionV5:()=>Lo,NotEqual:()=>Oo,OP_SCOPE_SUFFIX:()=>eb,OneHot:()=>Os,OnesLike:()=>Wo,Optimizer:()=>dr,Pack:()=>Bo,PadV2:()=>_s,Pool:()=>JI,Pow:()=>Ps,Prelu:()=>Ls,Prod:()=>Vo,RMSPropOptimizer:()=>ih,RNN:()=>Za,Range:()=>Fu,Rank:()=>Cm,Real:()=>rc,RealDiv:()=>xs,Reciprocal:()=>jo,Reduction:()=>pn,Relu:()=>Ws,Relu6:()=>Vs,Reshape:()=>Uo,ResizeBilinear:()=>Bs,ResizeBilinearGrad:()=>ic,ResizeNearestNeighbor:()=>$u,ResizeNearestNeighborGrad:()=>sc,Reverse:()=>js,RotateWithOffset:()=>rl,Round:()=>Us,Rsqrt:()=>Hs,SGDOptimizer:()=>dd,ScatterNd:()=>Ho,Select:()=>Go,Selu:()=>qo,Sequential:()=>Xl,Sigmoid:()=>qs,Sign:()=>Zo,Sin:()=>Gs,Sinh:()=>Ko,Slice:()=>Xo,Softmax:()=>Zs,Softplus:()=>Yo,SpaceToBatchND:()=>Du,SparseFillEmptyRows:()=>oc,SparseReshape:()=>lc,SparseToDense:()=>uc,SplitV:()=>Jo,Sqrt:()=>Xs,Square:()=>zu,SquaredDifference:()=>Ys,Step:()=>Cr,StridedSlice:()=>Qo,Sub:()=>Js,Sum:()=>Ks,SymbolicTensor:()=>Ta,Tan:()=>Qs,Tanh:()=>ei,Tensor:()=>Le,TensorBuffer:()=>Ot,Tile:()=>Er,TopK:()=>el,Transform:()=>tl,Transpose:()=>ti,Unique:()=>dc,Unpack:()=>nl,UnsortedSegmentSum:()=>Ou,Variable:()=>ju,ZerosLike:()=>al,_FusedMatMul:()=>ni,abs:()=>_t,acos:()=>nA,acosh:()=>aA,add:()=>se,addN:()=>kc,all:()=>Ic,any:()=>Xu,argMax:()=>Ku,argMin:()=>rA,asin:()=>sA,asinh:()=>iA,atan:()=>oA,atan2:()=>lA,atanh:()=>uA,avgPool:()=>Yu,avgPool3d:()=>cA,backend:()=>zb,backend_util:()=>C,basicLSTMCell:()=>MT,batchNorm:()=>hi,batchNorm2d:()=>Lb,batchNorm3d:()=>Wb,batchNorm4d:()=>Bb,batchToSpaceND:()=>Ju,bincount:()=>hA,booleanMaskAsync:()=>_R,broadcastTo:()=>ml,browser:()=>ui,buffer:()=>We,callbacks:()=>Xre,cast:()=>fe,ceil:()=>fA,clipByValue:()=>Sn,clone:()=>_a,complex:()=>Rr,concat:()=>ot,concat1d:()=>Vb,concat2d:()=>Al,concat3d:()=>jb,concat4d:()=>Ub,constraints:()=>$6,conv1d:()=>Nc,conv2d:()=>ir,conv2dTranspose:()=>Tc,conv3d:()=>AA,conv3dTranspose:()=>Gb,copyRegisteredKernels:()=>tS,cos:()=>Qu,cosh:()=>Ec,cosineWindow:()=>jA,cumsum:()=>Cc,customGrad:()=>La,data:()=>q8,denseBincount:()=>qb,deprecationWarn:()=>eA,depthToSpace:()=>yA,depthwiseConv2d:()=>yl,deregisterOp:()=>Zre,device_util:()=>Hu,diag:()=>iE,dilation2d:()=>gA,disableDeprecationWarnings:()=>UN,dispose:()=>Ee,disposeVariables:()=>HN,div:()=>me,divNoNan:()=>xA,dot:()=>Xb,dropout:()=>m3,einsum:()=>Kb,elu:()=>gl,enableDebugMode:()=>jN,enableProdMode:()=>VN,enclosingPowerOfTwo:()=>A3,engine:()=>sr,env:()=>J,equal:()=>zr,erf:()=>bA,exp:()=>Zn,expandDims:()=>un,expm1:()=>vA,eye:()=>wA,fft:()=>ld,fill:()=>xl,findBackend:()=>tA,findBackendFactory:()=>JN,floor:()=>bl,floorDiv:()=>wc,forceHalfFloat:()=>$v,fused:()=>Lr,gather:()=>fi,gatherND:()=>f3,gather_util:()=>qm,getBackend:()=>ZN,getGradient:()=>Nm,getKernel:()=>cc,getKernelsForBackend:()=>il,gpgpu_util:()=>av,grad:()=>OE,grads:()=>_E,greater:()=>Dn,greaterEqual:()=>_r,ifft:()=>Sl,imag:()=>Rc,image:()=>Ge,inTopKAsync:()=>XR,initializers:()=>W6,input:()=>M4,io:()=>kn,irfft:()=>Gc,isFinite:()=>Zb,isInf:()=>Yb,isNaN:()=>kA,keep:()=>Ht,kernel_impls:()=>ja,layers:()=>J6,leakyRelu:()=>ed,less:()=>Mc,lessEqual:()=>Pr,linalg:()=>E3,linspace:()=>Jb,loadGraphModel:()=>Ft,loadLayersModel:()=>rae,localResponseNormalization:()=>IA,log:()=>zn,log1p:()=>Fc,logSigmoid:()=>e3,logSoftmax:()=>Dc,logSumExp:()=>TA,logicalAnd:()=>da,logicalNot:()=>td,logicalOr:()=>zc,logicalXor:()=>r3,losses:()=>gF,matMul:()=>Be,math:()=>Ab,max:()=>Yn,maxPool:()=>nd,maxPool3d:()=>EA,maxPoolWithArgmax:()=>s3,maximum:()=>Wa,mean:()=>wt,memory:()=>vc,meshgrid:()=>sC,metrics:()=>p8,min:()=>vl,minimum:()=>wl,mirrorPad:()=>CA,mod:()=>RA,model:()=>nae,models:()=>c8,moments:()=>Oc,movingAverage:()=>WR,mul:()=>_,multiRNNCell:()=>hC,multinomial:()=>i3,neg:()=>vt,nextFrame:()=>oh,norm:()=>Zc,notEqual:()=>yi,oneHot:()=>pl,ones:()=>On,onesLike:()=>_n,op:()=>z,outerProduct:()=>gC,pad:()=>or,pad1d:()=>vC,pad2d:()=>kC,pad3d:()=>SC,pad4d:()=>TC,pool:()=>o3,pow:()=>lr,prelu:()=>rd,print:()=>db,prod:()=>_c,profile:()=>GN,rand:()=>OC,randomGamma:()=>WC,randomNormal:()=>l3,randomUniform:()=>kl,range:()=>Il,ready:()=>KN,real:()=>sd,reciprocal:()=>$A,registerBackend:()=>hl,registerCallbackConstructor:()=>sae,registerGradient:()=>Ux,registerKernel:()=>si,registerOp:()=>Kre,regularizers:()=>h8,relu:()=>Ba,relu6:()=>Pc,removeBackend:()=>YN,reshape:()=>H,reverse:()=>Pn,reverse1d:()=>KC,reverse2d:()=>YC,reverse3d:()=>QC,reverse4d:()=>tR,rfft:()=>ud,round:()=>Lc,rsqrt:()=>Wc,scalar:()=>Se,scatterND:()=>h3,scatter_util:()=>Xm,selu:()=>Bc,separableConv2d:()=>DA,sequential:()=>aae,serialization:()=>ae,setBackend:()=>XN,setPlatform:()=>QN,setWasmPath:()=>lQ,setWasmPaths:()=>uQ,setWebGLContext:()=>fh,setdiff1dAsync:()=>u3,shared:()=>XA,sigmoid:()=>In,sign:()=>zA,signal:()=>yF,sin:()=>Vc,sinh:()=>jc,slice:()=>Re,slice1d:()=>Uc,slice2d:()=>OA,slice3d:()=>Hc,slice4d:()=>id,slice_util:()=>ln,softmax:()=>od,softplus:()=>mi,spaceToBatchND:()=>ad,sparse:()=>C3,sparseToDense:()=>VA,spectral:()=>AF,split:()=>Gt,sqrt:()=>Qt,square:()=>it,squaredDifference:()=>qc,squeeze:()=>Va,stack:()=>dn,step:()=>Nl,stridedSlice:()=>_A,sub:()=>ge,sum:()=>ke,sumOutType:()=>Ac,tan:()=>PA,tanh:()=>ci,tensor:()=>ua,tensor1d:()=>Tt,tensor2d:()=>ba,tensor3d:()=>xc,tensor4d:()=>TR,tensor5d:()=>ER,tensor6d:()=>CR,tensor_util:()=>ga,test_util:()=>Fb,tidy:()=>W,tile:()=>Or,time:()=>qN,topk:()=>LA,train:()=>xi,transpose:()=>Ye,truncatedNormal:()=>Xc,unique:()=>Kc,unregisterGradient:()=>eS,unregisterKernel:()=>QI,unsortedSegmentSum:()=>WA,unstack:()=>pa,upcastType:()=>la,util:()=>k,valueAndGrad:()=>PE,valueAndGrads:()=>LE,variable:()=>d3,variableGrads:()=>Qb,version:()=>Oie,version_converter:()=>Zse,version_core:()=>BN,version_cpu:()=>u7,version_layers:()=>dy,version_wasm:()=>I6,version_webgl:()=>Fv,webgl:()=>sB,webgl_util:()=>M7,where:()=>an,whereAsync:()=>BA,zeros:()=>Ct,zerosLike:()=>Ue});var J9=Object.create,Cp=Object.defineProperty,Q9=Object.getOwnPropertyDescriptor,eI=Object.getOwnPropertyNames,tI=Object.getPrototypeOf,nI=Object.prototype.hasOwnProperty,aI=e=>Cp(e,"__esModule",{value:!0}),Qi=e=>{if(typeof fm!="undefined")return fm(e);throw new Error('Dynamic require of "'+e+'" is not supported')},xt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),Fe=(e,t)=>{for(var n in t)Cp(e,n,{get:t[n],enumerable:!0})},rI=(e,t,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of eI(t))!nI.call(e,a)&&a!=="default"&&Cp(e,a,{get:()=>t[a],enumerable:!(n=Q9(t,a))||n.enumerable});return e},eo=e=>rI(aI(Cp(e!=null?J9(tI(e)):{},"default",e&&e.__esModule&&"default"in e?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e),sI=xt(()=>{}),iI=xt((e,t)=>{(function(n,a,r){function s(u){var d=this,p=l();d.next=function(){var c=2091639*d.s0+d.c*23283064365386963e-26;return d.s0=d.s1,d.s1=d.s2,d.s2=c-(d.c=c|0)},d.c=1,d.s0=p(" "),d.s1=p(" "),d.s2=p(" "),d.s0-=p(u),d.s0<0&&(d.s0+=1),d.s1-=p(u),d.s1<0&&(d.s1+=1),d.s2-=p(u),d.s2<0&&(d.s2+=1),p=null}function i(u,d){return d.c=u.c,d.s0=u.s0,d.s1=u.s1,d.s2=u.s2,d}function o(u,d){var p=new s(u),c=d&&d.state,h=p.next;return h.int32=function(){return p.next()*4294967296|0},h.double=function(){return h()+(h()*2097152|0)*11102230246251565e-32},h.quick=h,c&&(typeof c=="object"&&i(c,p),h.state=function(){return i(p,{})}),h}function l(){var u=4022871197,d=function(p){p=p.toString();for(var c=0;c>>0,h-=u,h*=u,u=h>>>0,h-=u,u+=h*4294967296}return(u>>>0)*23283064365386963e-26};return d}a&&a.exports?a.exports=o:r&&r.amd?r(function(){return o}):this.alea=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),oI=xt((e,t)=>{(function(n,a,r){function s(l){var u=this,d="";u.x=0,u.y=0,u.z=0,u.w=0,u.next=function(){var c=u.x^u.x<<11;return u.x=u.y,u.y=u.z,u.z=u.w,u.w^=u.w>>>19^c^c>>>8},l===(l|0)?u.x=l:d+=l;for(var p=0;p>>0)/4294967296};return c.double=function(){do var h=d.next()>>>11,m=(d.next()>>>0)/4294967296,f=(h+m)/(1<<21);while(f===0);return f},c.int32=d.next,c.quick=c,p&&(typeof p=="object"&&i(p,d),c.state=function(){return i(d,{})}),c}a&&a.exports?a.exports=o:r&&r.amd?r(function(){return o}):this.xor128=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),lI=xt((e,t)=>{(function(n,a,r){function s(l){var u=this,d="";u.next=function(){var c=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^(c^c<<1))|0},u.x=0,u.y=0,u.z=0,u.w=0,u.v=0,l===(l|0)?u.x=l:d+=l;for(var p=0;p>>4),u.next()}function i(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 o(l,u){var d=new s(l),p=u&&u.state,c=function(){return(d.next()>>>0)/4294967296};return c.double=function(){do var h=d.next()>>>11,m=(d.next()>>>0)/4294967296,f=(h+m)/(1<<21);while(f===0);return f},c.int32=d.next,c.quick=c,p&&(typeof p=="object"&&i(p,d),c.state=function(){return i(d,{})}),c}a&&a.exports?a.exports=o:r&&r.amd?r(function(){return o}):this.xorwow=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),uI=xt((e,t)=>{(function(n,a,r){function s(l){var u=this;u.next=function(){var p=u.x,c=u.i,h,m,f;return h=p[c],h^=h>>>7,m=h^h<<24,h=p[c+1&7],m^=h^h>>>10,h=p[c+3&7],m^=h^h>>>3,h=p[c+4&7],m^=h^h<<7,h=p[c+7&7],h=h^h<<13,m^=h^h<<9,p[c]=m,u.i=c+1&7,m};function d(p,c){var h,m,f=[];if(c===(c|0))m=f[0]=c;else for(c=""+c,h=0;h0;--h)p.next()}d(u,l)}function i(l,u){return u.x=l.x.slice(),u.i=l.i,u}function o(l,u){l==null&&(l=+new Date);var d=new s(l),p=u&&u.state,c=function(){return(d.next()>>>0)/4294967296};return c.double=function(){do var h=d.next()>>>11,m=(d.next()>>>0)/4294967296,f=(h+m)/(1<<21);while(f===0);return f},c.int32=d.next,c.quick=c,p&&(p.x&&i(p,d),c.state=function(){return i(d,{})}),c}a&&a.exports?a.exports=o:r&&r.amd?r(function(){return o}):this.xorshift7=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),dI=xt((e,t)=>{(function(n,a,r){function s(l){var u=this;u.next=function(){var p=u.w,c=u.X,h=u.i,m,f;return u.w=p=p+1640531527|0,f=c[h+34&127],m=c[h=h+1&127],f^=f<<13,m^=m<<17,f^=f>>>15,m^=m>>>12,f=c[h]=f^m,u.i=h,f+(p^p>>>16)|0};function d(p,c){var h,m,f,A,y,g=[],x=128;for(c===(c|0)?(m=c,c=null):(c=c+"\0",m=0,x=Math.max(x,c.length)),f=0,A=-32;A>>15,m^=m<<4,m^=m>>>13,A>=0&&(y=y+1640531527|0,h=g[A&127]^=m+y,f=h==0?f+1:0);for(f>=128&&(g[(c&&c.length||0)&127]=-1),f=127,A=4*128;A>0;--A)m=g[f+34&127],h=g[f=f+1&127],m^=m<<13,h^=h<<17,m^=m>>>15,h^=h>>>12,g[f]=m^h;p.w=y,p.X=g,p.i=f}d(u,l)}function i(l,u){return u.i=l.i,u.w=l.w,u.X=l.X.slice(),u}function o(l,u){l==null&&(l=+new Date);var d=new s(l),p=u&&u.state,c=function(){return(d.next()>>>0)/4294967296};return c.double=function(){do var h=d.next()>>>11,m=(d.next()>>>0)/4294967296,f=(h+m)/(1<<21);while(f===0);return f},c.int32=d.next,c.quick=c,p&&(p.X&&i(p,d),c.state=function(){return i(d,{})}),c}a&&a.exports?a.exports=o:r&&r.amd?r(function(){return o}):this.xor4096=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),pI=xt((e,t)=>{(function(n,a,r){function s(l){var u=this,d="";u.next=function(){var c=u.b,h=u.c,m=u.d,f=u.a;return c=c<<25^c>>>7^h,h=h-m|0,m=m<<24^m>>>8^f,f=f-c|0,u.b=c=c<<20^c>>>12^h,u.c=h=h-m|0,u.d=m<<16^h>>>16^f,u.a=f-c|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):d+=l;for(var p=0;p>>0)/4294967296};return c.double=function(){do var h=d.next()>>>11,m=(d.next()>>>0)/4294967296,f=(h+m)/(1<<21);while(f===0);return f},c.int32=d.next,c.quick=c,p&&(typeof p=="object"&&i(p,d),c.state=function(){return i(d,{})}),c}a&&a.exports?a.exports=o:r&&r.amd?r(function(){return o}):this.tychei=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),Yg=xt(()=>{}),cI=xt((e,t)=>{(function(n,a){var r=this,s=256,i=6,o=52,l="random",u=a.pow(s,i),d=a.pow(2,o),p=d*2,c=s-1,h;function m(b,v,N){var T=[];v=v==!0?{entropy:!0}:v||{};var R=g(y(v.entropy?[b,w(n)]:b==null?x():b,3),T),$=new f(T),O=function(){for(var P=$.g(i),V=u,j=0;P=p;)P/=2,V/=2,j>>>=1;return(P+j)/V};return O.int32=function(){return $.g(4)|0},O.quick=function(){return $.g(4)/4294967296},O.double=O,g(w($.S),n),(v.pass||N||function(P,V,j,U){return U&&(U.S&&A(U,$),P.state=function(){return A($,{})}),j?(a[l]=P,V):P})(O,R,"global"in v?v.global:this==a,v.state)}a["seed"+l]=m;function f(b){var v,N=b.length,T=this,R=0,$=T.i=T.j=0,O=T.S=[];for(N||(b=[N++]);R{var n=iI(),a=oI(),r=lI(),s=uI(),i=dI(),o=pI(),l=cI();l.alea=n,l.xor128=a,l.xorwow=r,l.xorshift7=s,l.xor4096=i,l.tychei=o,t.exports=l}),yu=xt(()=>{}),hI=xt(()=>{}),fI=xt(()=>{}),mI=xt((e,t)=>{var n=function(){var a=typeof document!="undefined"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename!="undefined"&&(a=a||__filename),function(r){r=r||{};function s(){return Q.buffer!=Ve&&Yt(Q.buffer),gn}function i(){return Q.buffer!=Ve&&Yt(Q.buffer),gt}function o(){return Q.buffer!=Ve&&Yt(Q.buffer),xn}function l(){return Q.buffer!=Ve&&Yt(Q.buffer),Hn}function u(){return Q.buffer!=Ve&&Yt(Q.buffer),rn}var d=typeof r!="undefined"?r:{},p,c;d.ready=new Promise(function(S,E){p=S,c=E});var h={},m;for(m in d)d.hasOwnProperty(m)&&(h[m]=d[m]);var f=[],A="./this.program",y=function(S,E){throw E},g=!1,x=!1,w=!1,b=!1;g=typeof window=="object",x=typeof importScripts=="function",w=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string",b=!g&&!w&&!x;var v=d.ENVIRONMENT_IS_PTHREAD||!1;v&&(Ve=d.buffer);var N="";function T(S){return d.locateFile?d.locateFile(S,N):N+S}var R,$,O,P,V,j;if(w){x?N=yu().dirname(N)+"/":N=__dirname+"/",R=function(S,E){return V||(V=Qi("fs")),j||(j=yu()),S=j.normalize(S),V.readFileSync(S,E?null:"utf8")},O=function(S){var E=R(S,!0);return E.buffer||(E=new Uint8Array(E)),he(E.buffer),E},process.argv.length>1&&(A=process.argv[1].replace(/\\/g,"/")),f=process.argv.slice(2),process.on("uncaughtException",function(S){if(!(S instanceof Au))throw S}),process.on("unhandledRejection",er),y=function(S){process.exit(S)},d.inspect=function(){return"[Emscripten Module object]"};var U;try{U=hI()}catch(S){throw console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?'),S}global.Worker=U.Worker}else b?(typeof read!="undefined"&&(R=function(S){return read(S)}),O=function(S){var E;return typeof readbuffer=="function"?new Uint8Array(readbuffer(S)):(E=read(S,"binary"),he(typeof E=="object"),E)},typeof scriptArgs!="undefined"?f=scriptArgs:typeof arguments!="undefined"&&(f=arguments),typeof quit=="function"&&(y=function(S){quit(S)}),typeof print!="undefined"&&(typeof console=="undefined"&&(console={}),console.log=print,console.warn=console.error=typeof printErr!="undefined"?printErr:print)):(g||x)&&(x?N=self.location.href:typeof document!="undefined"&&document.currentScript&&(N=document.currentScript.src),typeof a!="undefined"&&a&&(N=a),N.indexOf("blob:")!==0?N=N.substr(0,N.lastIndexOf("/")+1):N="",w?(R=function(S,E){return V||(V=Qi("fs")),j||(j=yu()),S=j.normalize(S),V.readFileSync(S,E?null:"utf8")},O=function(S){var E=R(S,!0);return E.buffer||(E=new Uint8Array(E)),he(E.buffer),E}):(R=function(S){var E=new XMLHttpRequest;return E.open("GET",S,!1),E.send(null),E.responseText},x&&(O=function(S){var E=new XMLHttpRequest;return E.open("GET",S,!1),E.responseType="arraybuffer",E.send(null),new Uint8Array(E.response)}),$=function(S,E,L){var q=new XMLHttpRequest;q.open("GET",S,!0),q.responseType="arraybuffer",q.onload=function(){if(q.status==200||q.status==0&&q.response){E(q.response);return}L()},q.onerror=L,q.send(null)}),P=function(S){document.title=S});w&&typeof performance=="undefined"&&(global.performance=fI().performance);var X=d.print||console.log.bind(console),G=d.printErr||console.warn.bind(console);for(m in h)h.hasOwnProperty(m)&&(d[m]=h[m]);h=null,d.arguments&&(f=d.arguments),d.thisProgram&&(A=d.thisProgram),d.quit&&(y=d.quit);var ee=Atomics.load,Y=Atomics.store,re=Atomics.compareExchange,ne;d.wasmBinary&&(ne=d.wasmBinary);var ie=d.noExitRuntime||!0;typeof WebAssembly!="object"&&er("no native wasm support detected");var Q,de,oe=!1,ye;function he(S,E){S||er("Assertion failed: "+E)}function Ie(S){var E=d["_"+S];return he(E,"Cannot call unknown function "+S+", make sure it is exported"),E}function Ne(S,E,L,q,pe){var le={string:function(wn){var Ji=0;if(wn!=null&&wn!==0){var qg=(wn.length<<2)+1;Ji=Ki(qg),et(wn,Ji,qg)}return Ji},array:function(wn){var Ji=Ki(wn.length);return Ke(wn,Ji),Ji}};function ue(wn){return E==="string"?De(wn):E==="boolean"?Boolean(wn):wn}var be=Ie(S),tt=[],jt=0;if(q)for(var Dt=0;Dt=q);){var le=S[E++];if(!le)return pe;if(!(le&128)){pe+=String.fromCharCode(le);continue}var ue=S[E++]&63;if((le&224)==192){pe+=String.fromCharCode((le&31)<<6|ue);continue}var be=S[E++]&63;if((le&240)==224?le=(le&15)<<12|ue<<6|be:le=(le&7)<<18|ue<<12|be<<6|S[E++]&63,le<65536)pe+=String.fromCharCode(le);else{var tt=le-65536;pe+=String.fromCharCode(55296|tt>>10,56320|tt&1023)}}return pe}function De(S,E){return S?Oe(i(),S,E):""}function Qe(S,E,L,q){if(!(q>0))return 0;for(var pe=L,le=L+q-1,ue=0;ue=55296&&be<=57343){var tt=S.charCodeAt(++ue);be=65536+((be&1023)<<10)|tt&1023}if(be<=127){if(L>=le)break;E[L++]=be}else if(be<=2047){if(L+1>=le)break;E[L++]=192|be>>6,E[L++]=128|be&63}else if(be<=65535){if(L+2>=le)break;E[L++]=224|be>>12,E[L++]=128|be>>6&63,E[L++]=128|be&63}else{if(L+3>=le)break;E[L++]=240|be>>18,E[L++]=128|be>>12&63,E[L++]=128|be>>6&63,E[L++]=128|be&63}}return E[L]=0,L-pe}function et(S,E,L){return Qe(S,i(),E,L)}function st(S){for(var E=0,L=0;L=55296&&q<=57343&&(q=65536+((q&1023)<<10)|S.charCodeAt(++L)&1023),q<=127?++E:q<=2047?E+=2:q<=65535?E+=3:E+=4}return E}function Ke(S,E){s().set(S,E)}function dt(S,E){return S%E>0&&(S+=E-S%E),S}var Ve,gn,gt,Un,Zt,xn,Hn,$n,rn;function Yt(S){Ve=S,d.HEAP8=gn=new Int8Array(S),d.HEAP16=Un=new Int16Array(S),d.HEAP32=xn=new Int32Array(S),d.HEAPU8=gt=new Uint8Array(S),d.HEAPU16=Zt=new Uint16Array(S),d.HEAPU32=Hn=new Uint32Array(S),d.HEAPF32=$n=new Float32Array(S),d.HEAPF64=rn=new Float64Array(S)}var Fa=d.INITIAL_MEMORY||16777216;if(v)Q=d.wasmMemory,Ve=d.buffer;else if(d.wasmMemory)Q=d.wasmMemory;else if(Q=new WebAssembly.Memory({initial:Fa/65536,maximum:2147483648/65536,shared:!0}),!(Q.buffer instanceof SharedArrayBuffer))throw G("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"),w&&console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)"),Error("bad memory");Q&&(Ve=Q.buffer),Fa=Ve.byteLength,Yt(Ve);var aa,ra=[],yr=[],Ja=[],gr=[],Vi=[],$a=!1,op=!1;v||yr.push({func:function(){wp()}});function j0(){if(!v){if(d.preRun)for(typeof d.preRun=="function"&&(d.preRun=[d.preRun]);d.preRun.length;)up(d.preRun.shift());Ui(ra)}}function iu(){$a=!0,!v&&Ui(yr)}function U0(){v||Ui(Ja)}function lp(){v||(op=!0)}function bn(){if(!v){if(d.postRun)for(typeof d.postRun=="function"&&(d.postRun=[d.postRun]);d.postRun.length;)H0(d.postRun.shift());Ui(Vi)}}function up(S){ra.unshift(S)}function H0(S){Vi.unshift(S)}var Qa=0,xr=null,as=null;function G0(S){he(!v,"addRunDependency cannot be used in a pthread worker"),Qa++,d.monitorRunDependencies&&d.monitorRunDependencies(Qa)}function q0(S){if(Qa--,d.monitorRunDependencies&&d.monitorRunDependencies(Qa),Qa==0&&(xr!==null&&(clearInterval(xr),xr=null),as)){var E=as;as=null,E()}}d.preloadedImages={},d.preloadedAudios={};function er(S){d.onAbort&&d.onAbort(S),v&&console.error("Pthread aborting at "+new Error().stack),S+="",G(S),oe=!0,ye=1,S="abort("+S+"). Build with -s ASSERTIONS=1 for more info.";var E=new WebAssembly.RuntimeError(S);throw c(E),E}function dp(S,E){return String.prototype.startsWith?S.startsWith(E):S.indexOf(E)===0}var ji="data:application/octet-stream;base64,";function pp(S){return dp(S,ji)}var X0="file://";function cp(S){return dp(S,X0)}var vn="tfjs-backend-wasm-threaded-simd.wasm";pp(vn)||(vn=T(vn));function hp(S){try{if(S==vn&&ne)return new Uint8Array(ne);if(O)return O(S);throw"both async and sync fetching of the wasm failed"}catch(E){er(E)}}function K0(){if(!ne&&(g||x)){if(typeof fetch=="function"&&!cp(vn))return fetch(vn,{credentials:"same-origin"}).then(function(S){if(!S.ok)throw"failed to load wasm binary file at '"+vn+"'";return S.arrayBuffer()}).catch(function(){return hp(vn)});if($)return new Promise(function(S,E){$(vn,function(L){S(new Uint8Array(L))},E)})}return Promise.resolve().then(function(){return hp(vn)})}function Z0(){var S={a:Bf};function E(ue,be){var tt=ue.exports;if(d.asm=tt,aa=d.asm.F,de=be,!v){var jt=we.unusedWorkers.length;we.unusedWorkers.forEach(function(Dt){we.loadWasmModuleToWorker(Dt,function(){--jt||q0("wasm-instantiate")})})}}v||G0("wasm-instantiate");function L(ue){E(ue.instance,ue.module)}function q(ue){return K0().then(function(be){return WebAssembly.instantiate(be,S)}).then(ue,function(be){G("failed to asynchronously prepare wasm: "+be),er(be)})}function pe(){return!ne&&typeof WebAssembly.instantiateStreaming=="function"&&!pp(vn)&&!cp(vn)&&typeof fetch=="function"?fetch(vn,{credentials:"same-origin"}).then(function(ue){var be=WebAssembly.instantiateStreaming(ue,S);return be.then(L,function(tt){return G("wasm streaming compile failed: "+tt),G("falling back to ArrayBuffer instantiation"),q(L)})}):q(L)}if(d.instantiateWasm)try{var le=d.instantiateWasm(S,E);return le}catch(ue){return G("Module.instantiateWasm callback failed with error: "+ue),!1}return pe().catch(c),{}}var Y0={9816:function(){throw"Canceled!"},9834:function(S,E){setTimeout(function(){Bg(S,E)},0)}};function fp(){we.initRuntime()}function Ui(S){for(;S.length>0;){var E=S.shift();if(typeof E=="function"){E(d);continue}var L=E.func;typeof L=="number"?E.arg===void 0?aa.get(L)():aa.get(L)(E.arg):L(E.arg===void 0?null:E.arg)}}function ou(S,E){if(S<=0||S>s().length||S&!0||E<0)return-28;if(E==0)return 0;E>=2147483647&&(E=Infinity);var L=Atomics.load(o(),Zi>>2),q=0;if(L==S){var pe=Atomics.compareExchange(o(),Zi>>2,L,0);if(pe==L&&(--E,q=1,E<=0))return 1}var le=Atomics.notify(o(),S>>2,E);if(le>=0)return le+q;throw"Atomics.notify returned an unexpected value "+le}d._emscripten_futex_wake=ou;function J0(S){if(v)throw"Internal Error! killThread() can only ever be called from main application thread!";if(!S)throw"Internal Error! Null pthread_ptr in killThread!";o()[S+12>>2]=0;var E=we.pthreads[S];E.worker.terminate(),we.freeThreadData(E),we.runningWorkers.splice(we.runningWorkers.indexOf(E.worker),1),E.worker.pthread=void 0}function Q0(S){if(v)throw"Internal Error! cancelThread() can only ever be called from main application thread!";if(!S)throw"Internal Error! Null pthread_ptr in cancelThread!";var E=we.pthreads[S];E.worker.postMessage({cmd:"cancel"})}function ef(S){if(v)throw"Internal Error! cleanupThread() can only ever be called from main application thread!";if(!S)throw"Internal Error! Null pthread_ptr in cleanupThread!";var E=we.pthreads[S];if(E){o()[S+12>>2]=0;var L=E.worker;we.returnWorkerToPool(L)}}var we={unusedWorkers:[],runningWorkers:[],initMainThreadBlock:function(){for(var S=Math.min(4,Math.max(1,(navigator.hardwareConcurrency||1)/2)),E=0;E>2]=S;var L=S+152;o()[L>>2]=L;for(var q=ss(512),E=0;E<128;++E)l()[q/4+E]=0;Atomics.store(l(),S+100>>2,q),Atomics.store(l(),S+40>>2,S),cm(S,!x,1),Wg(S)},initWorker:function(){},pthreads:{},threadExitHandlers:[],setThreadStatus:function(){},runExitHandlers:function(){for(;we.threadExitHandlers.length>0;)we.threadExitHandlers.pop()();v&&qi()&&Lg()},runExitHandlersAndDeinitThread:function(S,E){Atomics.store(l(),S+56>>2,1),Atomics.store(l(),S+60>>2,0),we.runExitHandlers(),Atomics.store(l(),S+4>>2,E),Atomics.store(l(),S+0>>2,1),ou(S+0,2147483647),cm(0,0,0)},threadExit:function(S){var E=qi();E&&(we.runExitHandlersAndDeinitThread(E,S),v&&postMessage({cmd:"exit"}))},threadCancel:function(){we.runExitHandlersAndDeinitThread(qi(),-1),postMessage({cmd:"cancelDone"})},terminateAllThreads:function(){for(var S in we.pthreads){var E=we.pthreads[S];E&&E.worker&&we.returnWorkerToPool(E.worker)}we.pthreads={};for(var L=0;L>2];o()[S.threadInfoStruct+100>>2]=0,fu(E),fu(S.threadInfoStruct)}S.threadInfoStruct=0,S.allocatedOwnStack&&S.stackBase&&fu(S.stackBase),S.stackBase=0,S.worker&&(S.worker.pthread=null)}},returnWorkerToPool:function(S){we.runWithoutMainThreadQueuedCalls(function(){delete we.pthreads[S.pthread.threadInfoStruct],we.unusedWorkers.push(S),we.runningWorkers.splice(we.runningWorkers.indexOf(S),1),we.freeThreadData(S.pthread),S.pthread=void 0})},runWithoutMainThreadQueuedCalls:function(S){o()[Gg>>2]=0;try{S()}finally{o()[Gg>>2]=1}},receiveObjectTransfer:function(S){},loadWasmModuleToWorker:function(S,E){S.onmessage=function(L){var q=L.data,pe=q.cmd;if(S.pthread&&(we.currentProxiedOperationCallerThread=S.pthread.threadInfoStruct),q.targetThread&&q.targetThread!=qi()){var le=we.pthreads[q.targetThread];le?le.worker.postMessage(L.data,q.transferList):console.error('Internal error! Worker sent a message "'+pe+'" to target pthread '+q.targetThread+", but that thread no longer exists!"),we.currentProxiedOperationCallerThread=void 0;return}if(pe==="processQueuedMainThreadWork")dm();else if(pe==="spawnThread")bp(L.data);else if(pe==="cleanupThread")ef(q.thread);else if(pe==="killThread")J0(q.thread);else if(pe==="cancelThread")Q0(q.thread);else if(pe==="loaded")S.loaded=!0,E&&E(S),S.runPthread&&(S.runPthread(),delete S.runPthread);else if(pe==="print")X("Thread "+q.threadId+": "+q.text);else if(pe==="printErr")G("Thread "+q.threadId+": "+q.text);else if(pe==="alert")alert("Thread "+q.threadId+": "+q.text);else if(pe==="exit"){var ue=S.pthread&&Atomics.load(l(),S.pthread.threadInfoStruct+64>>2);ue&&we.returnWorkerToPool(S)}else if(pe==="exitProcess")try{Z9(q.returnCode)}catch(be){if(be instanceof Au)return;throw be}else pe==="cancelDone"?we.returnWorkerToPool(S):pe==="objectTransfer"?we.receiveObjectTransfer(L.data):L.data.target==="setimmediate"?S.postMessage(L.data):G("worker sent an unknown command "+pe);we.currentProxiedOperationCallerThread=void 0},S.onerror=function(L){G("pthread sent an error! "+L.filename+":"+L.lineno+": "+L.message)},w&&(S.on("message",function(L){S.onmessage({data:L})}),S.on("error",function(L){S.onerror(L)}),S.on("exit",function(L){})),S.postMessage({cmd:"load",urlOrBlob:d.mainScriptUrlOrBlob||a,wasmMemory:Q,wasmModule:de})},allocateUnusedWorker:function(){var S=T("tfjs-backend-wasm-threaded-simd.worker.js");we.unusedWorkers.push(new Worker(S))},getNewWorker:function(){return we.unusedWorkers.length==0&&(we.allocateUnusedWorker(),we.loadWasmModuleToWorker(we.unusedWorkers[0])),we.unusedWorkers.length>0?we.unusedWorkers.pop():null},busySpinWait:function(S){for(var E=performance.now()+S;performance.now()>2]=S,S}function lf(S,E){if(v)return br(1,1,S,E)}function uf(S,E){if(S==E)postMessage({cmd:"processQueuedMainThreadWork"});else if(v)postMessage({targetThread:S,cmd:"processThreadQueue"});else{var L=we.pthreads[S],q=L&&L.worker;if(!q)return;q.postMessage({cmd:"processThreadQueue"})}return 1}function df(){er()}function pf(S,E,L){var q=Af(E,L);return Y0[S].apply(null,q)}function cf(S,E){}function hf(S,E,L){if(S<=0||S>s().length||S&!0)return-28;if(g){if(Atomics.load(o(),S>>2)!=E)return-6;for(var q=performance.now(),pe=q+L,le=Atomics.exchange(o(),Zi>>2,S);;){if(q=performance.now(),q>pe)return le=Atomics.exchange(o(),Zi>>2,0),-73;if(le=Atomics.exchange(o(),Zi>>2,0),le==0)break;if(dm(),Atomics.load(o(),S>>2)!=E)return-6;le=Atomics.exchange(o(),Zi>>2,S)}return 0}else{var ue=Atomics.wait(o(),S>>2,E,L);if(ue==="timed-out")return-73;if(ue==="not-equal")return-6;if(ue==="ok")return 0;throw"Atomics.wait returned an unexpected value "+ue}}function ff(S,E,L){i().copyWithin(S,E,E+L)}function mf(){return w?Qi("os").cpus().length:navigator.hardwareConcurrency}function br(S,E){for(var L=arguments.length-2,q=mu(),pe=L,le=Ki(pe*8),ue=le>>3,be=0;be>=2;L=i()[S++];){var q=L<105;q&&E&1&&E++,uu.push(q?u()[E++>>1]:o()[E]),++E}return uu}function yf(S,E,L){lu.length=E;for(var q=L>>3,pe=0;pe>>16),Yt(Q.buffer),1}catch(E){}}function bf(S){var E=gf();if(S<=E)return!1;var L=2147483648;if(S>L)return!1;for(var q=1;q<=4;q*=2){var pe=E*(1+.2/q);pe=Math.min(pe,S+100663296);var le=Math.min(L,dt(Math.max(S,pe),65536)),ue=xf(le);if(ue)return!0}return!1}var Pe={inEventHandler:0,removeAllEventListeners:function(){for(var S=Pe.eventHandlers.length-1;S>=0;--S)Pe._removeHandler(S);Pe.eventHandlers=[],Pe.deferredCalls=[]},registerRemoveEventListeners:function(){Pe.removeEventListenersRegistered||(gr.push(Pe.removeAllEventListeners),Pe.removeEventListenersRegistered=!0)},deferredCalls:[],deferCall:function(S,E,L){function q(ue,be){if(ue.length!=be.length)return!1;for(var tt in ue)if(ue[tt]!=be[tt])return!1;return!0}for(var pe in Pe.deferredCalls){var le=Pe.deferredCalls[pe];if(le.targetFunction==S&&q(le.argsList,L))return}Pe.deferredCalls.push({targetFunction:S,precedence:E,argsList:L}),Pe.deferredCalls.sort(function(ue,be){return ue.precedence>2]=L,o()[ue+4>>2]=q,o()[ue+8>>2]=pe,pm(0,S,637534208,E,q,ue),Xi(le)},getTargetThreadForEventCallback:function(S){switch(S){case 1:return 0;case 2:return we.currentProxiedOperationCallerThread;default:return S}},getNodeNameForTarget:function(S){return S?S==window?"#window":S==screen?"#screen":S&&S.nodeName?S.nodeName:"":""},fullscreenEnabled:function(){return document.fullscreenEnabled||document.webkitFullscreenEnabled}};function vf(S){var E=st(S)+1,L=ss(E);return et(S,L,E),L}function wf(S,E,L,q){var pe=mu(),le=Ki(12),ue=0;E&&(ue=vf(E)),o()[le>>2]=ue,o()[le+4>>2]=L,o()[le+8>>2]=q,pm(0,S,657457152,0,ue,le),Xi(pe)}function kf(S,E,L,q){E=E?De(E):"",wf(S,E,L,q)}function If(S){return S>2?De(S):S}var Sf=[0,typeof document!="undefined"?document:0,typeof window!="undefined"?window:0];function Nf(S){S=If(S);var E=Sf[S]||(typeof document!="undefined"?document.querySelector(S):void 0);return E}function du(S){return Nf(S)}function mp(S,E,L){var q=du(S);if(!q)return-4;if(q.canvasSharedPtr&&(o()[q.canvasSharedPtr>>2]=E,o()[q.canvasSharedPtr+4>>2]=L),q.offscreenCanvas||!q.controlTransferredOffscreen){q.offscreenCanvas&&(q=q.offscreenCanvas);var pe=!1;if(q.GLctxObject&&q.GLctxObject.GLctx){var le=q.GLctxObject.GLctx.getParameter(2978);pe=le[0]===0&&le[1]===0&&le[2]===q.width&&le[3]===q.height}q.width=E,q.height=L,pe&&q.GLctxObject.GLctx.viewport(0,0,E,L)}else if(q.canvasSharedPtr){var ue=o()[q.canvasSharedPtr+8>>2];return kf(ue,S,E,L),1}else return-4;return 0}function Ap(S,E,L){return v?br(2,1,S,E,L):mp(S,E,L)}function Tf(S,E,L){var q=du(S);return q?mp(S,E,L):Ap(S,E,L)}function Ef(S){}function Cf(S,E){}function Rf(S){var E=S.getExtension("ANGLE_instanced_arrays");if(E)return S.vertexAttribDivisor=function(L,q){E.vertexAttribDivisorANGLE(L,q)},S.drawArraysInstanced=function(L,q,pe,le){E.drawArraysInstancedANGLE(L,q,pe,le)},S.drawElementsInstanced=function(L,q,pe,le,ue){E.drawElementsInstancedANGLE(L,q,pe,le,ue)},1}function Mf(S){var E=S.getExtension("OES_vertex_array_object");if(E)return S.createVertexArray=function(){return E.createVertexArrayOES()},S.deleteVertexArray=function(L){E.deleteVertexArrayOES(L)},S.bindVertexArray=function(L){E.bindVertexArrayOES(L)},S.isVertexArray=function(L){return E.isVertexArrayOES(L)},1}function Ff(S){var E=S.getExtension("WEBGL_draw_buffers");if(E)return S.drawBuffers=function(L,q){E.drawBuffersWEBGL(L,q)},1}function $f(S){return!!(S.multiDrawWebgl=S.getExtension("WEBGL_multi_draw"))}var Je={counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],uniforms:[],shaders:[],vaos:[],contexts:{},offscreenCanvases:{},timerQueriesEXT:[],programInfos:{},stringCache:{},unpackAlignment:4,recordError:function(S){Je.lastError||(Je.lastError=S)},getNewId:function(S){for(var E=Je.counter++,L=S.length;L>2]:-1;pe+=De(o()[L+le*4>>2],ue<0?void 0:ue)}return pe},createContext:function(S,E){var L=S.getContext("webgl",E);if(!L)return 0;var q=Je.registerContext(L,E);return q},registerContext:function(S,E){var L=ss(8);o()[L+4>>2]=qi();var q={handle:L,attributes:E,version:E.majorVersion,GLctx:S};return S.canvas&&(S.canvas.GLctxObject=q),Je.contexts[L]=q,(typeof E.enableExtensionsByDefault=="undefined"||E.enableExtensionsByDefault)&&Je.initExtensions(q),L},makeContextCurrent:function(S){return Je.currentContext=Je.contexts[S],d.ctx=vr=Je.currentContext&&Je.currentContext.GLctx,!(S&&!vr)},getContext:function(S){return Je.contexts[S]},deleteContext:function(S){Je.currentContext===Je.contexts[S]&&(Je.currentContext=null),typeof Pe=="object"&&Pe.removeAllHandlersOnTarget(Je.contexts[S].GLctx.canvas),Je.contexts[S]&&Je.contexts[S].GLctx.canvas&&(Je.contexts[S].GLctx.canvas.GLctxObject=void 0),fu(Je.contexts[S].handle),Je.contexts[S]=null},initExtensions:function(S){if(S||(S=Je.currentContext),!S.initExtensionsDone){S.initExtensionsDone=!0;var E=S.GLctx;Rf(E),Mf(E),Ff(E),E.disjointTimerQueryExt=E.getExtension("EXT_disjoint_timer_query"),$f(E);var L=E.getSupportedExtensions()||[];L.forEach(function(q){q.indexOf("lose_context")<0&&q.indexOf("debug")<0&&E.getExtension(q)})}},populateUniformTable:function(S){for(var E=Je.programs[S],L=Je.programInfos[S]={uniforms:{},maxUniformLength:0,maxAttributeLength:-1,maxUniformBlockNameLength:-1},q=L.uniforms,pe=vr.getProgramParameter(E,35718),le=0;le>2,q=o()[L+(24>>2)],pe={alpha:!!o()[L+(0>>2)],depth:!!o()[L+(4>>2)],stencil:!!o()[L+(8>>2)],antialias:!!o()[L+(12>>2)],premultipliedAlpha:!!o()[L+(16>>2)],preserveDrawingBuffer:!!o()[L+(20>>2)],powerPreference:Df[q],failIfMajorPerformanceCaveat:!!o()[L+(28>>2)],majorVersion:o()[L+(32>>2)],minorVersion:o()[L+(36>>2)],enableExtensionsByDefault:o()[L+(40>>2)],explicitSwapControl:o()[L+(44>>2)],proxyContextToMainThread:o()[L+(48>>2)],renderViaOffscreenBackBuffer:o()[L+(52>>2)]},le=du(S);if(!le||pe.explicitSwapControl)return 0;var ue=Je.createContext(le,pe);return ue}function Of(S,E){return zf(S,E)}var Hi={mappings:{},buffers:[null,[],[]],printChar:function(S,E){var L=Hi.buffers[S];E===0||E===10?((S===1?X:G)(Oe(L,0)),L.length=0):L.push(E)},varargs:void 0,get:function(){Hi.varargs+=4;var S=o()[Hi.varargs-4>>2];return S},getStr:function(S){var E=De(S);return E},get64:function(S,E){return S}};function yp(S){return v?br(3,1,S):0}function gp(S,E,L,q,pe){if(v)return br(4,1,S,E,L,q,pe)}function xp(S,E,L,q){if(v)return br(5,1,S,E,L,q);for(var pe=0,le=0;le>2],be=o()[E+(le*8+4)>>2],tt=0;tt>2]=pe,0}function _f(S){var E=we.threadExitHandlers.pop();S&&E()}function Pf(S,E){we.threadExitHandlers.push(function(){aa.get(S)(E)})}function bp(S){if(v)throw"Internal Error! spawnThread() can only ever be called from main application thread!";var E=we.getNewWorker();if(E.pthread!==void 0)throw"Internal error!";if(!S.pthread_ptr)throw"Internal error, no pthread ptr!";we.runningWorkers.push(E);for(var L=ss(128*4),q=0;q<128;++q)o()[L+q*4>>2]=0;var pe=S.stackBase+S.stackSize,le=we.pthreads[S.pthread_ptr]={worker:E,stackBase:S.stackBase,stackSize:S.stackSize,allocatedOwnStack:S.allocatedOwnStack,threadInfoStruct:S.pthread_ptr},ue=le.threadInfoStruct>>2;Atomics.store(l(),ue+(64>>2),S.detached),Atomics.store(l(),ue+(100>>2),L),Atomics.store(l(),ue+(40>>2),le.threadInfoStruct),Atomics.store(l(),ue+(80>>2),S.stackSize),Atomics.store(l(),ue+(76>>2),pe),Atomics.store(l(),ue+(104>>2),S.stackSize),Atomics.store(l(),ue+(104+8>>2),pe),Atomics.store(l(),ue+(104+12>>2),S.detached);var be=Pg(),tt=be+40;Atomics.store(l(),ue+(172>>2),tt),E.pthread=le;var jt={cmd:"run",start_routine:S.startRoutine,arg:S.arg,threadInfoStruct:S.pthread_ptr,stackBase:S.stackBase,stackSize:S.stackSize};E.runPthread=function(){jt.time=performance.now(),E.postMessage(jt,S.transferList)},E.loaded&&(E.runPthread(),delete E.runPthread)}function Lf(S,E,L,q){if(typeof SharedArrayBuffer=="undefined")return G("Current environment does not support SharedArrayBuffer, pthreads are not available!"),6;if(!S)return G("pthread_create called with a null thread pointer!"),28;var pe=[],le=0;if(v&&(pe.length===0||le))return Vg(687865856,S,E,L,q);if(le)return le;var ue=0,be=0,tt=0;E&&E!=-1?(ue=o()[E>>2],ue+=81920,be=o()[E+8>>2],tt=o()[E+12>>2]!==0):ue=2097152;var jt=be==0;jt?be=Hg(16,ue):(be-=ue,he(be>0));for(var Dt=ss(228),kr=0;kr<228>>2;++kr)l()[(Dt>>2)+kr]=0;o()[S>>2]=Dt,o()[Dt+12>>2]=Dt;var Yi=Dt+152;o()[Yi>>2]=Yi;var wn={stackBase:be,stackSize:ue,allocatedOwnStack:jt,detached:tt,startRoutine:L,pthread_ptr:Dt,arg:q,transferList:pe};return v?(wn.cmd="spawnThread",postMessage(wn,pe)):bp(wn),0}function vp(S){if(v)return br(6,1,S);switch(S){case 30:return 16384;case 85:var E=2147483648;return E/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 of(28),-1}v||we.initMainThreadBlock();var vr,Wf=[null,lf,Ap,yp,gp,xp,vp],Bf={e:rf,r:sf,x:uf,b:df,y:pf,j:cf,c:hf,d:ou,f:rs,p:ff,z:mf,u:yf,q:bf,v:Tf,i:Ef,t:Cf,w:Of,m:yp,n:gp,g:xp,o:fp,a:Q||d.wasmMemory,k:_f,l:Pf,h:Lf,s:vp},Og=Z0(),wp=d.___wasm_call_ctors=function(){return(wp=d.___wasm_call_ctors=d.asm.A).apply(null,arguments)},Vf=d._init=function(){return(Vf=d._init=d.asm.B).apply(null,arguments)},jf=d._register_tensor=function(){return(jf=d._register_tensor=d.asm.C).apply(null,arguments)},Uf=d._dispose_data=function(){return(Uf=d._dispose_data=d.asm.D).apply(null,arguments)},Hf=d._dispose=function(){return(Hf=d._dispose=d.asm.E).apply(null,arguments)},Gf=d._Abs=function(){return(Gf=d._Abs=d.asm.G).apply(null,arguments)},qf=d._Add=function(){return(qf=d._Add=d.asm.H).apply(null,arguments)},Xf=d._AddN=function(){return(Xf=d._AddN=d.asm.I).apply(null,arguments)},Kf=d._All=function(){return(Kf=d._All=d.asm.J).apply(null,arguments)},Zf=d._Any=function(){return(Zf=d._Any=d.asm.K).apply(null,arguments)},Yf=d._ArgMax=function(){return(Yf=d._ArgMax=d.asm.L).apply(null,arguments)},Jf=d._AvgPool=function(){return(Jf=d._AvgPool=d.asm.M).apply(null,arguments)},Qf=d._BatchMatMul=function(){return(Qf=d._BatchMatMul=d.asm.N).apply(null,arguments)},em=d._Ceil=function(){return(em=d._Ceil=d.asm.O).apply(null,arguments)},tm=d._ClipByValue=function(){return(tm=d._ClipByValue=d.asm.P).apply(null,arguments)},nm=d._Conv2D=function(){return(nm=d._Conv2D=d.asm.Q).apply(null,arguments)},am=d._Conv2DBackpropInput=function(){return(am=d._Conv2DBackpropInput=d.asm.R).apply(null,arguments)},rm=d._Cos=function(){return(rm=d._Cos=d.asm.S).apply(null,arguments)},sm=d._CropAndResize=function(){return(sm=d._CropAndResize=d.asm.T).apply(null,arguments)},im=d._Cumsum=function(){return(im=d._Cumsum=d.asm.U).apply(null,arguments)},om=d._DepthToSpace=function(){return(om=d._DepthToSpace=d.asm.V).apply(null,arguments)},lm=d._DepthwiseConv2dNative=function(){return(lm=d._DepthwiseConv2dNative=d.asm.W).apply(null,arguments)},kp=d._Equal=function(){return(kp=d._Equal=d.asm.X).apply(null,arguments)},Ip=d._Exp=function(){return(Ip=d._Exp=d.asm.Y).apply(null,arguments)},Sp=d._FlipLeftRight=function(){return(Sp=d._FlipLeftRight=d.asm.Z).apply(null,arguments)},pu=d._Floor=function(){return(pu=d._Floor=d.asm._).apply(null,arguments)},Gi=d._FloorDiv=function(){return(Gi=d._FloorDiv=d.asm.$).apply(null,arguments)},um=d._FusedBatchNorm=function(){return(um=d._FusedBatchNorm=d.asm.aa).apply(null,arguments)},cu=d._FusedConv2D=function(){return(cu=d._FusedConv2D=d.asm.ba).apply(null,arguments)},K=d._FusedDepthwiseConv2D=function(){return(K=d._FusedDepthwiseConv2D=d.asm.ca).apply(null,arguments)},te=d._Gather=function(){return(te=d._Gather=d.asm.da).apply(null,arguments)},Te=d._GatherNd=function(){return(Te=d._GatherNd=d.asm.ea).apply(null,arguments)},Ze=d._Greater=function(){return(Ze=d._Greater=d.asm.fa).apply(null,arguments)},It=d._GreaterEqual=function(){return(It=d._GreaterEqual=d.asm.ga).apply(null,arguments)},ft=d._LeakyRelu=function(){return(ft=d._LeakyRelu=d.asm.ha).apply(null,arguments)},je=d._Less=function(){return(je=d._Less=d.asm.ia).apply(null,arguments)},He=d._LessEqual=function(){return(He=d._LessEqual=d.asm.ja).apply(null,arguments)},Jt=d._Log=function(){return(Jt=d._Log=d.asm.ka).apply(null,arguments)},tr=d._LogicalAnd=function(){return(tr=d._LogicalAnd=d.asm.la).apply(null,arguments)},nr=d._Max=function(){return(nr=d._Max=d.asm.ma).apply(null,arguments)},Np=d._MaxPool=function(){return(Np=d._MaxPool=d.asm.na).apply(null,arguments)},hu=d._Maximum=function(){return(hu=d._Maximum=d.asm.oa).apply(null,arguments)},Gn=d._Mean=function(){return(Gn=d._Mean=d.asm.pa).apply(null,arguments)},wr=d._Min=function(){return(wr=d._Min=d.asm.qa).apply(null,arguments)},Tp=d._Minimum=function(){return(Tp=d._Minimum=d.asm.ra).apply(null,arguments)},u9=d._MirrorPad=function(){return(u9=d._MirrorPad=d.asm.sa).apply(null,arguments)},d9=d._Multiply=function(){return(d9=d._Multiply=d.asm.ta).apply(null,arguments)},p9=d._Neg=function(){return(p9=d._Neg=d.asm.ua).apply(null,arguments)},c9=d._NonMaxSuppressionV3=function(){return(c9=d._NonMaxSuppressionV3=d.asm.va).apply(null,arguments)},h9=d._NonMaxSuppressionV4=function(){return(h9=d._NonMaxSuppressionV4=d.asm.wa).apply(null,arguments)},f9=d._NonMaxSuppressionV5=function(){return(f9=d._NonMaxSuppressionV5=d.asm.xa).apply(null,arguments)},m9=d._NotEqual=function(){return(m9=d._NotEqual=d.asm.ya).apply(null,arguments)},A9=d._OneHot=function(){return(A9=d._OneHot=d.asm.za).apply(null,arguments)},y9=d._PadV2=function(){return(y9=d._PadV2=d.asm.Aa).apply(null,arguments)},g9=d._Pow=function(){return(g9=d._Pow=d.asm.Ba).apply(null,arguments)},x9=d._Prelu=function(){return(x9=d._Prelu=d.asm.Ca).apply(null,arguments)},b9=d._Prod=function(){return(b9=d._Prod=d.asm.Da).apply(null,arguments)},v9=d._RealDiv=function(){return(v9=d._RealDiv=d.asm.Ea).apply(null,arguments)},w9=d._Relu=function(){return(w9=d._Relu=d.asm.Fa).apply(null,arguments)},k9=d._Relu6=function(){return(k9=d._Relu6=d.asm.Ga).apply(null,arguments)},I9=d._ResizeBilinear=function(){return(I9=d._ResizeBilinear=d.asm.Ha).apply(null,arguments)},S9=d._Reverse=function(){return(S9=d._Reverse=d.asm.Ia).apply(null,arguments)},N9=d._RotateWithOffset=function(){return(N9=d._RotateWithOffset=d.asm.Ja).apply(null,arguments)},T9=d._Round=function(){return(T9=d._Round=d.asm.Ka).apply(null,arguments)},E9=d._Rsqrt=function(){return(E9=d._Rsqrt=d.asm.La).apply(null,arguments)},C9=d._ScatterNd=function(){return(C9=d._ScatterNd=d.asm.Ma).apply(null,arguments)},R9=d._SelectV2=function(){return(R9=d._SelectV2=d.asm.Na).apply(null,arguments)},M9=d._Sigmoid=function(){return(M9=d._Sigmoid=d.asm.Oa).apply(null,arguments)},F9=d._Sin=function(){return(F9=d._Sin=d.asm.Pa).apply(null,arguments)},$9=d._Softmax=function(){return($9=d._Softmax=d.asm.Qa).apply(null,arguments)},D9=d._Sqrt=function(){return(D9=d._Sqrt=d.asm.Ra).apply(null,arguments)},z9=d._Square=function(){return(z9=d._Square=d.asm.Sa).apply(null,arguments)},O9=d._SquaredDifference=function(){return(O9=d._SquaredDifference=d.asm.Ta).apply(null,arguments)},_9=d._Step=function(){return(_9=d._Step=d.asm.Ua).apply(null,arguments)},P9=d._StridedSlice=function(){return(P9=d._StridedSlice=d.asm.Va).apply(null,arguments)},L9=d._Sub=function(){return(L9=d._Sub=d.asm.Wa).apply(null,arguments)},W9=d._Sum=function(){return(W9=d._Sum=d.asm.Xa).apply(null,arguments)},B9=d._Tan=function(){return(B9=d._Tan=d.asm.Ya).apply(null,arguments)},V9=d._Tanh=function(){return(V9=d._Tanh=d.asm.Za).apply(null,arguments)},j9=d._Tile=function(){return(j9=d._Tile=d.asm._a).apply(null,arguments)},U9=d._TopK=function(){return(U9=d._TopK=d.asm.$a).apply(null,arguments)},H9=d._Transform=function(){return(H9=d._Transform=d.asm.ab).apply(null,arguments)},G9=d._Transpose=function(){return(G9=d._Transpose=d.asm.bb).apply(null,arguments)},q9=d.__FusedMatMul=function(){return(q9=d.__FusedMatMul=d.asm.cb).apply(null,arguments)},ss=d._malloc=function(){return(ss=d._malloc=d.asm.db).apply(null,arguments)},fu=d._free=function(){return(fu=d._free=d.asm.eb).apply(null,arguments)},_g=d.___errno_location=function(){return(_g=d.___errno_location=d.asm.fb).apply(null,arguments)},Pg=d._emscripten_get_global_libc=function(){return(Pg=d._emscripten_get_global_libc=d.asm.gb).apply(null,arguments)},qi=d._pthread_self=function(){return(qi=d._pthread_self=d.asm.hb).apply(null,arguments)},Lg=d.___pthread_tsd_run_dtors=function(){return(Lg=d.___pthread_tsd_run_dtors=d.asm.ib).apply(null,arguments)},dm=d._emscripten_main_thread_process_queued_calls=function(){return(dm=d._emscripten_main_thread_process_queued_calls=d.asm.jb).apply(null,arguments)},X9=d._emscripten_current_thread_process_queued_calls=function(){return(X9=d._emscripten_current_thread_process_queued_calls=d.asm.kb).apply(null,arguments)},Wg=d._emscripten_register_main_browser_thread_id=function(){return(Wg=d._emscripten_register_main_browser_thread_id=d.asm.lb).apply(null,arguments)},Bg=d.__emscripten_do_dispatch_to_thread=function(){return(Bg=d.__emscripten_do_dispatch_to_thread=d.asm.mb).apply(null,arguments)},Vg=d._emscripten_sync_run_in_main_thread_4=function(){return(Vg=d._emscripten_sync_run_in_main_thread_4=d.asm.nb).apply(null,arguments)},jg=d._emscripten_run_in_main_runtime_thread_js=function(){return(jg=d._emscripten_run_in_main_runtime_thread_js=d.asm.ob).apply(null,arguments)},pm=d.__emscripten_call_on_thread=function(){return(pm=d.__emscripten_call_on_thread=d.asm.pb).apply(null,arguments)},K9=d._emscripten_tls_init=function(){return(K9=d._emscripten_tls_init=d.asm.qb).apply(null,arguments)},cm=d.__emscripten_thread_init=function(){return(cm=d.__emscripten_thread_init=d.asm.rb).apply(null,arguments)},mu=d.stackSave=function(){return(mu=d.stackSave=d.asm.sb).apply(null,arguments)},Xi=d.stackRestore=function(){return(Xi=d.stackRestore=d.asm.tb).apply(null,arguments)},Ki=d.stackAlloc=function(){return(Ki=d.stackAlloc=d.asm.ub).apply(null,arguments)},Ug=d._emscripten_stack_set_limits=function(){return(Ug=d._emscripten_stack_set_limits=d.asm.vb).apply(null,arguments)},Hg=d._memalign=function(){return(Hg=d._memalign=d.asm.wb).apply(null,arguments)},Gg=d.__emscripten_allow_main_runtime_queued_calls=9808,Zi=d.__emscripten_main_thread_futex=11432;d.cwrap=$e,d.PThread=we,d.PThread=we,d.wasmMemory=Q,d.ExitStatus=Au;var Ep;function Au(S){this.name="ExitStatus",this.message="Program terminated with exit("+S+")",this.status=S}as=function S(){Ep||hm(),Ep||(as=S)};function hm(S){if(S=S||f,Qa>0)return;if(v){p(d),iu(),postMessage({cmd:"loaded"});return}if(j0(),Qa>0)return;function E(){Ep||(Ep=!0,d.calledRun=!0,!oe&&(iu(),U0(),p(d),d.onRuntimeInitialized&&d.onRuntimeInitialized(),bn()))}d.setStatus?(d.setStatus("Running..."),setTimeout(function(){setTimeout(function(){d.setStatus("")},1),E()},1)):E()}d.run=hm;function Z9(S,E){if(!(E&&ie&&S===0)){if(!E&&v)throw postMessage({cmd:"exitProcess",returnCode:S}),new Au(S);ie||(we.terminateAllThreads(),ye=S,lp(),d.onExit&&d.onExit(S),oe=!0),y(S,new Au(S))}}if(d.preInit)for(typeof d.preInit=="function"&&(d.preInit=[d.preInit]);d.preInit.length>0;)d.preInit.pop()();return v&&(ie=!1,we.initWorker()),hm(),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)}),AI=xt((e,t)=>{var n=function(){var a=typeof document!="undefined"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename!="undefined"&&(a=a||__filename),function(r){r=r||{};var s=typeof r!="undefined"?r:{},i,o;s.ready=new Promise(function(K,te){i=K,o=te});var l={},u;for(u in s)s.hasOwnProperty(u)&&(l[u]=s[u]);var d=[],p="./this.program",c=function(K,te){throw te},h=!1,m=!1,f=!1,A=!1;h=typeof window=="object",m=typeof importScripts=="function",f=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string",A=!h&&!f&&!m;var y="";function g(K){return s.locateFile?s.locateFile(K,y):y+K}var x,w,b,v,N,T;f?(m?y=yu().dirname(y)+"/":y=__dirname+"/",x=function(K,te){return N||(N=Qi("fs")),T||(T=yu()),K=T.normalize(K),N.readFileSync(K,te?null:"utf8")},b=function(K){var te=x(K,!0);return te.buffer||(te=new Uint8Array(te)),X(te.buffer),te},process.argv.length>1&&(p=process.argv[1].replace(/\\/g,"/")),d=process.argv.slice(2),process.on("uncaughtException",function(K){if(!(K instanceof um))throw K}),process.on("unhandledRejection",$a),c=function(K){process.exit(K)},s.inspect=function(){return"[Emscripten Module object]"}):A?(typeof read!="undefined"&&(x=function(K){return read(K)}),b=function(K){var te;return typeof readbuffer=="function"?new Uint8Array(readbuffer(K)):(te=read(K,"binary"),X(typeof te=="object"),te)},typeof scriptArgs!="undefined"?d=scriptArgs:typeof arguments!="undefined"&&(d=arguments),typeof quit=="function"&&(c=function(K){quit(K)}),typeof print!="undefined"&&(typeof console=="undefined"&&(console={}),console.log=print,console.warn=console.error=typeof printErr!="undefined"?printErr:print)):(h||m)&&(m?y=self.location.href:typeof document!="undefined"&&document.currentScript&&(y=document.currentScript.src),a&&(y=a),y.indexOf("blob:")!==0?y=y.substr(0,y.lastIndexOf("/")+1):y="",x=function(K){var te=new XMLHttpRequest;return te.open("GET",K,!1),te.send(null),te.responseText},m&&(b=function(K){var te=new XMLHttpRequest;return te.open("GET",K,!1),te.responseType="arraybuffer",te.send(null),new Uint8Array(te.response)}),w=function(K,te,Te){var Ze=new XMLHttpRequest;Ze.open("GET",K,!0),Ze.responseType="arraybuffer",Ze.onload=function(){if(Ze.status==200||Ze.status==0&&Ze.response){te(Ze.response);return}Te()},Ze.onerror=Te,Ze.send(null)},v=function(K){document.title=K});var R=s.print||console.log.bind(console),$=s.printErr||console.warn.bind(console);for(u in l)l.hasOwnProperty(u)&&(s[u]=l[u]);l=null,s.arguments&&(d=s.arguments),s.thisProgram&&(p=s.thisProgram),s.quit&&(c=s.quit);var O;s.wasmBinary&&(O=s.wasmBinary);var P=s.noExitRuntime||!0;typeof WebAssembly!="object"&&$a("no native wasm support detected");var V,j=!1,U;function X(K,te){K||$a("Assertion failed: "+te)}function G(K){var te=s["_"+K];return X(te,"Cannot call unknown function "+K+", make sure it is exported"),te}function ee(K,te,Te,Ze,It){var ft={string:function(Gn){var wr=0;if(Gn!=null&&Gn!==0){var Tp=(Gn.length<<2)+1;wr=pu(Tp),de(Gn,wr,Tp)}return wr},array:function(Gn){var wr=pu(Gn.length);return oe(Gn,wr),wr}};function je(Gn){return te==="string"?ie(Gn):te==="boolean"?Boolean(Gn):Gn}var He=G(K),Jt=[],tr=0;if(Ze)for(var nr=0;nr=Ze);)++It;if(It-te>16&&K.subarray&&re)return re.decode(K.subarray(te,It));for(var ft="";te>10,56320|tr&1023)}}return ft}function ie(K,te){return K?ne(Ne,K,te):""}function Q(K,te,Te,Ze){if(!(Ze>0))return 0;for(var It=Te,ft=Te+Ze-1,je=0;je=55296&&He<=57343){var Jt=K.charCodeAt(++je);He=65536+((He&1023)<<10)|Jt&1023}if(He<=127){if(Te>=ft)break;te[Te++]=He}else if(He<=2047){if(Te+1>=ft)break;te[Te++]=192|He>>6,te[Te++]=128|He&63}else if(He<=65535){if(Te+2>=ft)break;te[Te++]=224|He>>12,te[Te++]=128|He>>6&63,te[Te++]=128|He&63}else{if(Te+3>=ft)break;te[Te++]=240|He>>18,te[Te++]=128|He>>12&63,te[Te++]=128|He>>6&63,te[Te++]=128|He&63}}return te[Te]=0,Te-It}function de(K,te,Te){return Q(K,Ne,te,Te)}function oe(K,te){Ie.set(K,te)}function ye(K,te){return K%te>0&&(K+=te-K%te),K}var he,Ie,Ne,$e,Oe,De,Qe,et,st;function Ke(K){he=K,s.HEAP8=Ie=new Int8Array(K),s.HEAP16=$e=new Int16Array(K),s.HEAP32=De=new Int32Array(K),s.HEAPU8=Ne=new Uint8Array(K),s.HEAPU16=Oe=new Uint16Array(K),s.HEAPU32=Qe=new Uint32Array(K),s.HEAPF32=et=new Float32Array(K),s.HEAPF64=st=new Float64Array(K)}var dt=s.INITIAL_MEMORY||16777216,Ve,gn=[],gt=[],Un=[],Zt=[],xn=!1;gt.push({func:function(){fp()}});function Hn(){if(s.preRun)for(typeof s.preRun=="function"&&(s.preRun=[s.preRun]);s.preRun.length;)Fa(s.preRun.shift());xr(gn)}function $n(){xn=!0,xr(gt)}function rn(){xr(Un)}function Yt(){if(s.postRun)for(typeof s.postRun=="function"&&(s.postRun=[s.postRun]);s.postRun.length;)aa(s.postRun.shift());xr(Zt)}function Fa(K){gn.unshift(K)}function aa(K){Zt.unshift(K)}var ra=0,yr=null,Ja=null;function gr(K){ra++,s.monitorRunDependencies&&s.monitorRunDependencies(ra)}function Vi(K){if(ra--,s.monitorRunDependencies&&s.monitorRunDependencies(ra),ra==0&&(yr!==null&&(clearInterval(yr),yr=null),Ja)){var te=Ja;Ja=null,te()}}s.preloadedImages={},s.preloadedAudios={};function $a(K){s.onAbort&&s.onAbort(K),K+="",$(K),j=!0,U=1,K="abort("+K+"). Build with -s ASSERTIONS=1 for more info.";var te=new WebAssembly.RuntimeError(K);throw o(te),te}function op(K,te){return String.prototype.startsWith?K.startsWith(te):K.indexOf(te)===0}var j0="data:application/octet-stream;base64,";function iu(K){return op(K,j0)}var U0="file://";function lp(K){return op(K,U0)}var bn="tfjs-backend-wasm.wasm";iu(bn)||(bn=g(bn));function up(K){try{if(K==bn&&O)return new Uint8Array(O);if(b)return b(K);throw"both async and sync fetching of the wasm failed"}catch(te){$a(te)}}function H0(){if(!O&&(h||m)){if(typeof fetch=="function"&&!lp(bn))return fetch(bn,{credentials:"same-origin"}).then(function(K){if(!K.ok)throw"failed to load wasm binary file at '"+bn+"'";return K.arrayBuffer()}).catch(function(){return up(bn)});if(w)return new Promise(function(K,te){w(bn,function(Te){K(new Uint8Array(Te))},te)})}return Promise.resolve().then(function(){return up(bn)})}function Qa(){var K={a:Z0};function te(je,He){var Jt=je.exports;s.asm=Jt,V=s.asm.i,Ke(V.buffer),Ve=s.asm.o,Vi("wasm-instantiate")}gr("wasm-instantiate");function Te(je){te(je.instance)}function Ze(je){return H0().then(function(He){return WebAssembly.instantiate(He,K)}).then(je,function(He){$("failed to asynchronously prepare wasm: "+He),$a(He)})}function It(){return!O&&typeof WebAssembly.instantiateStreaming=="function"&&!iu(bn)&&!lp(bn)&&typeof fetch=="function"?fetch(bn,{credentials:"same-origin"}).then(function(je){var He=WebAssembly.instantiateStreaming(je,K);return He.then(Te,function(Jt){return $("wasm streaming compile failed: "+Jt),$("falling back to ArrayBuffer instantiation"),Ze(Te)})}):Ze(Te)}if(s.instantiateWasm)try{var ft=s.instantiateWasm(K,te);return ft}catch(je){return $("Module.instantiateWasm callback failed with error: "+je),!1}return It().catch(o),{}}function xr(K){for(;K.length>0;){var te=K.shift();if(typeof te=="function"){te(s);continue}var Te=te.func;typeof Te=="number"?te.arg===void 0?Ve.get(Te)():Ve.get(Te)(te.arg):Te(te.arg===void 0?null:te.arg)}}function as(){$a()}function G0(K,te,Te){Ne.copyWithin(K,te,te+Te)}function q0(){return Ne.length}function er(K){try{return V.grow(K-he.byteLength+65535>>>16),Ke(V.buffer),1}catch(te){}}function dp(K){var te=q0(),Te=2147483648;if(K>Te)return!1;for(var Ze=1;Ze<=4;Ze*=2){var It=te*(1+.2/Ze);It=Math.min(It,K+100663296);var ft=Math.min(Te,ye(Math.max(K,It),65536)),je=er(ft);if(je)return!0}return!1}var ji={mappings:{},buffers:[null,[],[]],printChar:function(K,te){var Te=ji.buffers[K];te===0||te===10?((K===1?R:$)(ne(Te,0)),Te.length=0):Te.push(te)},varargs:void 0,get:function(){ji.varargs+=4;var K=De[ji.varargs-4>>2];return K},getStr:function(K){var te=ie(K);return te},get64:function(K,te){return K}};function pp(K){return 0}function X0(K,te,Te,Ze,It){}function cp(K,te,Te,Ze){for(var It=0,ft=0;ft>2],He=De[te+(ft*8+4)>>2],Jt=0;Jt>2]=It,0}function vn(){return 6}function hp(K){return De[kp()>>2]=K,K}function K0(K){switch(K){case 30:return 16384;case 85:var te=2147483648;return te/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 hp(28),-1}var Z0={a:as,d:G0,e:dp,f:pp,c:X0,b:cp,g:vn,h:K0},Y0=Qa(),fp=s.___wasm_call_ctors=function(){return(fp=s.___wasm_call_ctors=s.asm.j).apply(null,arguments)},Ui=s._init=function(){return(Ui=s._init=s.asm.k).apply(null,arguments)},ou=s._register_tensor=function(){return(ou=s._register_tensor=s.asm.l).apply(null,arguments)},J0=s._dispose_data=function(){return(J0=s._dispose_data=s.asm.m).apply(null,arguments)},Q0=s._dispose=function(){return(Q0=s._dispose=s.asm.n).apply(null,arguments)},ef=s._Abs=function(){return(ef=s._Abs=s.asm.p).apply(null,arguments)},we=s._Add=function(){return(we=s._Add=s.asm.q).apply(null,arguments)},tf=s._AddN=function(){return(tf=s._AddN=s.asm.r).apply(null,arguments)},nf=s._All=function(){return(nf=s._All=s.asm.s).apply(null,arguments)},af=s._Any=function(){return(af=s._Any=s.asm.t).apply(null,arguments)},rf=s._ArgMax=function(){return(rf=s._ArgMax=s.asm.u).apply(null,arguments)},sf=s._AvgPool=function(){return(sf=s._AvgPool=s.asm.v).apply(null,arguments)},rs=s._BatchMatMul=function(){return(rs=s._BatchMatMul=s.asm.w).apply(null,arguments)},of=s._Ceil=function(){return(of=s._Ceil=s.asm.x).apply(null,arguments)},lf=s._ClipByValue=function(){return(lf=s._ClipByValue=s.asm.y).apply(null,arguments)},uf=s._Conv2D=function(){return(uf=s._Conv2D=s.asm.z).apply(null,arguments)},df=s._Conv2DBackpropInput=function(){return(df=s._Conv2DBackpropInput=s.asm.A).apply(null,arguments)},pf=s._Cos=function(){return(pf=s._Cos=s.asm.B).apply(null,arguments)},cf=s._CropAndResize=function(){return(cf=s._CropAndResize=s.asm.C).apply(null,arguments)},hf=s._Cumsum=function(){return(hf=s._Cumsum=s.asm.D).apply(null,arguments)},ff=s._DepthToSpace=function(){return(ff=s._DepthToSpace=s.asm.E).apply(null,arguments)},mf=s._DepthwiseConv2dNative=function(){return(mf=s._DepthwiseConv2dNative=s.asm.F).apply(null,arguments)},br=s._Equal=function(){return(br=s._Equal=s.asm.G).apply(null,arguments)},lu=s._Exp=function(){return(lu=s._Exp=s.asm.H).apply(null,arguments)},uu=s._FlipLeftRight=function(){return(uu=s._FlipLeftRight=s.asm.I).apply(null,arguments)},Af=s._Floor=function(){return(Af=s._Floor=s.asm.J).apply(null,arguments)},yf=s._FloorDiv=function(){return(yf=s._FloorDiv=s.asm.K).apply(null,arguments)},gf=s._FusedBatchNorm=function(){return(gf=s._FusedBatchNorm=s.asm.L).apply(null,arguments)},xf=s._FusedConv2D=function(){return(xf=s._FusedConv2D=s.asm.M).apply(null,arguments)},bf=s._FusedDepthwiseConv2D=function(){return(bf=s._FusedDepthwiseConv2D=s.asm.N).apply(null,arguments)},Pe=s._Gather=function(){return(Pe=s._Gather=s.asm.O).apply(null,arguments)},vf=s._GatherNd=function(){return(vf=s._GatherNd=s.asm.P).apply(null,arguments)},wf=s._Greater=function(){return(wf=s._Greater=s.asm.Q).apply(null,arguments)},kf=s._GreaterEqual=function(){return(kf=s._GreaterEqual=s.asm.R).apply(null,arguments)},If=s._LeakyRelu=function(){return(If=s._LeakyRelu=s.asm.S).apply(null,arguments)},Sf=s._Less=function(){return(Sf=s._Less=s.asm.T).apply(null,arguments)},Nf=s._LessEqual=function(){return(Nf=s._LessEqual=s.asm.U).apply(null,arguments)},du=s._Log=function(){return(du=s._Log=s.asm.V).apply(null,arguments)},mp=s._LogicalAnd=function(){return(mp=s._LogicalAnd=s.asm.W).apply(null,arguments)},Ap=s._Max=function(){return(Ap=s._Max=s.asm.X).apply(null,arguments)},Tf=s._MaxPool=function(){return(Tf=s._MaxPool=s.asm.Y).apply(null,arguments)},Ef=s._Maximum=function(){return(Ef=s._Maximum=s.asm.Z).apply(null,arguments)},Cf=s._Mean=function(){return(Cf=s._Mean=s.asm._).apply(null,arguments)},Rf=s._Min=function(){return(Rf=s._Min=s.asm.$).apply(null,arguments)},Mf=s._Minimum=function(){return(Mf=s._Minimum=s.asm.aa).apply(null,arguments)},Ff=s._MirrorPad=function(){return(Ff=s._MirrorPad=s.asm.ba).apply(null,arguments)},$f=s._Multiply=function(){return($f=s._Multiply=s.asm.ca).apply(null,arguments)},Je=s._Neg=function(){return(Je=s._Neg=s.asm.da).apply(null,arguments)},Df=s._NonMaxSuppressionV3=function(){return(Df=s._NonMaxSuppressionV3=s.asm.ea).apply(null,arguments)},zf=s._NonMaxSuppressionV4=function(){return(zf=s._NonMaxSuppressionV4=s.asm.fa).apply(null,arguments)},Of=s._NonMaxSuppressionV5=function(){return(Of=s._NonMaxSuppressionV5=s.asm.ga).apply(null,arguments)},Hi=s._NotEqual=function(){return(Hi=s._NotEqual=s.asm.ha).apply(null,arguments)},yp=s._OneHot=function(){return(yp=s._OneHot=s.asm.ia).apply(null,arguments)},gp=s._PadV2=function(){return(gp=s._PadV2=s.asm.ja).apply(null,arguments)},xp=s._Pow=function(){return(xp=s._Pow=s.asm.ka).apply(null,arguments)},_f=s._Prelu=function(){return(_f=s._Prelu=s.asm.la).apply(null,arguments)},Pf=s._Prod=function(){return(Pf=s._Prod=s.asm.ma).apply(null,arguments)},bp=s._RealDiv=function(){return(bp=s._RealDiv=s.asm.na).apply(null,arguments)},Lf=s._Relu=function(){return(Lf=s._Relu=s.asm.oa).apply(null,arguments)},vp=s._Relu6=function(){return(vp=s._Relu6=s.asm.pa).apply(null,arguments)},vr=s._ResizeBilinear=function(){return(vr=s._ResizeBilinear=s.asm.qa).apply(null,arguments)},Wf=s._Reverse=function(){return(Wf=s._Reverse=s.asm.ra).apply(null,arguments)},Bf=s._RotateWithOffset=function(){return(Bf=s._RotateWithOffset=s.asm.sa).apply(null,arguments)},Og=s._Round=function(){return(Og=s._Round=s.asm.ta).apply(null,arguments)},wp=s._Rsqrt=function(){return(wp=s._Rsqrt=s.asm.ua).apply(null,arguments)},Vf=s._ScatterNd=function(){return(Vf=s._ScatterNd=s.asm.va).apply(null,arguments)},jf=s._SelectV2=function(){return(jf=s._SelectV2=s.asm.wa).apply(null,arguments)},Uf=s._Sigmoid=function(){return(Uf=s._Sigmoid=s.asm.xa).apply(null,arguments)},Hf=s._Sin=function(){return(Hf=s._Sin=s.asm.ya).apply(null,arguments)},Gf=s._Softmax=function(){return(Gf=s._Softmax=s.asm.za).apply(null,arguments)},qf=s._Sqrt=function(){return(qf=s._Sqrt=s.asm.Aa).apply(null,arguments)},Xf=s._Square=function(){return(Xf=s._Square=s.asm.Ba).apply(null,arguments)},Kf=s._SquaredDifference=function(){return(Kf=s._SquaredDifference=s.asm.Ca).apply(null,arguments)},Zf=s._Step=function(){return(Zf=s._Step=s.asm.Da).apply(null,arguments)},Yf=s._StridedSlice=function(){return(Yf=s._StridedSlice=s.asm.Ea).apply(null,arguments)},Jf=s._Sub=function(){return(Jf=s._Sub=s.asm.Fa).apply(null,arguments)},Qf=s._Sum=function(){return(Qf=s._Sum=s.asm.Ga).apply(null,arguments)},em=s._Tan=function(){return(em=s._Tan=s.asm.Ha).apply(null,arguments)},tm=s._Tanh=function(){return(tm=s._Tanh=s.asm.Ia).apply(null,arguments)},nm=s._Tile=function(){return(nm=s._Tile=s.asm.Ja).apply(null,arguments)},am=s._TopK=function(){return(am=s._TopK=s.asm.Ka).apply(null,arguments)},rm=s._Transform=function(){return(rm=s._Transform=s.asm.La).apply(null,arguments)},sm=s._Transpose=function(){return(sm=s._Transpose=s.asm.Ma).apply(null,arguments)},im=s.__FusedMatMul=function(){return(im=s.__FusedMatMul=s.asm.Na).apply(null,arguments)},om=s._malloc=function(){return(om=s._malloc=s.asm.Oa).apply(null,arguments)},lm=s._free=function(){return(lm=s._free=s.asm.Pa).apply(null,arguments)},kp=s.___errno_location=function(){return(kp=s.___errno_location=s.asm.Qa).apply(null,arguments)},Ip=s.stackSave=function(){return(Ip=s.stackSave=s.asm.Ra).apply(null,arguments)},Sp=s.stackRestore=function(){return(Sp=s.stackRestore=s.asm.Sa).apply(null,arguments)},pu=s.stackAlloc=function(){return(pu=s.stackAlloc=s.asm.Ta).apply(null,arguments)};s.cwrap=Y;var Gi;function um(K){this.name="ExitStatus",this.message="Program terminated with exit("+K+")",this.status=K}Ja=function K(){Gi||cu(),Gi||(Ja=K)};function cu(K){if(K=K||d,ra>0||(Hn(),ra>0))return;function te(){Gi||(Gi=!0,s.calledRun=!0,!j&&($n(),rn(),i(s),s.onRuntimeInitialized&&s.onRuntimeInitialized(),Yt()))}s.setStatus?(s.setStatus("Running..."),setTimeout(function(){setTimeout(function(){s.setStatus("")},1),te()},1)):te()}if(s.run=cu,s.preInit)for(typeof s.preInit=="function"&&(s.preInit=[s.preInit]);s.preInit.length>0;)s.preInit.pop()();return cu(),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)}),yI=xt((e,t)=>{(function(n,a,r){function s(u){var d=this,p=l();d.next=function(){var c=2091639*d.s0+d.c*23283064365386963e-26;return d.s0=d.s1,d.s1=d.s2,d.s2=c-(d.c=c|0)},d.c=1,d.s0=p(" "),d.s1=p(" "),d.s2=p(" "),d.s0-=p(u),d.s0<0&&(d.s0+=1),d.s1-=p(u),d.s1<0&&(d.s1+=1),d.s2-=p(u),d.s2<0&&(d.s2+=1),p=null}function i(u,d){return d.c=u.c,d.s0=u.s0,d.s1=u.s1,d.s2=u.s2,d}function o(u,d){var p=new s(u),c=d&&d.state,h=p.next;return h.int32=function(){return p.next()*4294967296|0},h.double=function(){return h()+(h()*2097152|0)*11102230246251565e-32},h.quick=h,c&&(typeof c=="object"&&i(c,p),h.state=function(){return i(p,{})}),h}function l(){var u=4022871197,d=function(p){p=String(p);for(var c=0;c>>0,h-=u,h*=u,u=h>>>0,h-=u,u+=h*4294967296}return(u>>>0)*23283064365386963e-26};return d}a&&a.exports?a.exports=o:r&&r.amd?r(function(){return o}):this.alea=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),gI=xt((e,t)=>{(function(n,a,r){function s(l){var u=this,d="";u.x=0,u.y=0,u.z=0,u.w=0,u.next=function(){var c=u.x^u.x<<11;return u.x=u.y,u.y=u.z,u.z=u.w,u.w^=u.w>>>19^c^c>>>8},l===(l|0)?u.x=l:d+=l;for(var p=0;p>>0)/4294967296};return c.double=function(){do var h=d.next()>>>11,m=(d.next()>>>0)/4294967296,f=(h+m)/(1<<21);while(f===0);return f},c.int32=d.next,c.quick=c,p&&(typeof p=="object"&&i(p,d),c.state=function(){return i(d,{})}),c}a&&a.exports?a.exports=o:r&&r.amd?r(function(){return o}):this.xor128=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),xI=xt((e,t)=>{(function(n,a,r){function s(l){var u=this,d="";u.next=function(){var c=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^(c^c<<1))|0},u.x=0,u.y=0,u.z=0,u.w=0,u.v=0,l===(l|0)?u.x=l:d+=l;for(var p=0;p>>4),u.next()}function i(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 o(l,u){var d=new s(l),p=u&&u.state,c=function(){return(d.next()>>>0)/4294967296};return c.double=function(){do var h=d.next()>>>11,m=(d.next()>>>0)/4294967296,f=(h+m)/(1<<21);while(f===0);return f},c.int32=d.next,c.quick=c,p&&(typeof p=="object"&&i(p,d),c.state=function(){return i(d,{})}),c}a&&a.exports?a.exports=o:r&&r.amd?r(function(){return o}):this.xorwow=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),bI=xt((e,t)=>{(function(n,a,r){function s(l){var u=this;u.next=function(){var p=u.x,c=u.i,h,m,f;return h=p[c],h^=h>>>7,m=h^h<<24,h=p[c+1&7],m^=h^h>>>10,h=p[c+3&7],m^=h^h>>>3,h=p[c+4&7],m^=h^h<<7,h=p[c+7&7],h=h^h<<13,m^=h^h<<9,p[c]=m,u.i=c+1&7,m};function d(p,c){var h,m,f=[];if(c===(c|0))m=f[0]=c;else for(c=""+c,h=0;h0;--h)p.next()}d(u,l)}function i(l,u){return u.x=l.x.slice(),u.i=l.i,u}function o(l,u){l==null&&(l=+new Date);var d=new s(l),p=u&&u.state,c=function(){return(d.next()>>>0)/4294967296};return c.double=function(){do var h=d.next()>>>11,m=(d.next()>>>0)/4294967296,f=(h+m)/(1<<21);while(f===0);return f},c.int32=d.next,c.quick=c,p&&(p.x&&i(p,d),c.state=function(){return i(d,{})}),c}a&&a.exports?a.exports=o:r&&r.amd?r(function(){return o}):this.xorshift7=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),vI=xt((e,t)=>{(function(n,a,r){function s(l){var u=this;u.next=function(){var p=u.w,c=u.X,h=u.i,m,f;return u.w=p=p+1640531527|0,f=c[h+34&127],m=c[h=h+1&127],f^=f<<13,m^=m<<17,f^=f>>>15,m^=m>>>12,f=c[h]=f^m,u.i=h,f+(p^p>>>16)|0};function d(p,c){var h,m,f,A,y,g=[],x=128;for(c===(c|0)?(m=c,c=null):(c=c+"\0",m=0,x=Math.max(x,c.length)),f=0,A=-32;A>>15,m^=m<<4,m^=m>>>13,A>=0&&(y=y+1640531527|0,h=g[A&127]^=m+y,f=h==0?f+1:0);for(f>=128&&(g[(c&&c.length||0)&127]=-1),f=127,A=4*128;A>0;--A)m=g[f+34&127],h=g[f=f+1&127],m^=m<<13,h^=h<<17,m^=m>>>15,h^=h>>>12,g[f]=m^h;p.w=y,p.X=g,p.i=f}d(u,l)}function i(l,u){return u.i=l.i,u.w=l.w,u.X=l.X.slice(),u}function o(l,u){l==null&&(l=+new Date);var d=new s(l),p=u&&u.state,c=function(){return(d.next()>>>0)/4294967296};return c.double=function(){do var h=d.next()>>>11,m=(d.next()>>>0)/4294967296,f=(h+m)/(1<<21);while(f===0);return f},c.int32=d.next,c.quick=c,p&&(p.X&&i(p,d),c.state=function(){return i(d,{})}),c}a&&a.exports?a.exports=o:r&&r.amd?r(function(){return o}):this.xor4096=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),wI=xt((e,t)=>{(function(n,a,r){function s(l){var u=this,d="";u.next=function(){var c=u.b,h=u.c,m=u.d,f=u.a;return c=c<<25^c>>>7^h,h=h-m|0,m=m<<24^m>>>8^f,f=f-c|0,u.b=c=c<<20^c>>>12^h,u.c=h=h-m|0,u.d=m<<16^h>>>16^f,u.a=f-c|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):d+=l;for(var p=0;p>>0)/4294967296};return c.double=function(){do var h=d.next()>>>11,m=(d.next()>>>0)/4294967296,f=(h+m)/(1<<21);while(f===0);return f},c.int32=d.next,c.quick=c,p&&(typeof p=="object"&&i(p,d),c.state=function(){return i(d,{})}),c}a&&a.exports?a.exports=o:r&&r.amd?r(function(){return o}):this.tychei=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),kI=xt((e,t)=>{(function(n,a,r){var s=256,i=6,o=52,l="random",u=r.pow(s,i),d=r.pow(2,o),p=d*2,c=s-1,h;function m(b,v,N){var T=[];v=v==!0?{entropy:!0}:v||{};var R=g(y(v.entropy?[b,w(a)]:b==null?x():b,3),T),$=new f(T),O=function(){for(var P=$.g(i),V=u,j=0;P=p;)P/=2,V/=2,j>>>=1;return(P+j)/V};return O.int32=function(){return $.g(4)|0},O.quick=function(){return $.g(4)/4294967296},O.double=O,g(w($.S),a),(v.pass||N||function(P,V,j,U){return U&&(U.S&&A(U,$),P.state=function(){return A($,{})}),j?(r[l]=P,V):P})(O,R,"global"in v?v.global:this==r,v.state)}function f(b){var v,N=b.length,T=this,R=0,$=T.i=T.j=0,O=T.S=[];for(N||(b=[N++]);R{var n=yI(),a=gI(),r=xI(),s=bI(),i=vI(),o=wI(),l=kI();l.alea=n,l.xor128=a,l.xorwow=r,l.xorshift7=s,l.xor4096=i,l.tychei=o,t.exports=l}),II=xt(()=>{}),mm={};Fe(mm,{bin:()=>d5,browser:()=>A5,default:()=>SI,dependencies:()=>m5,description:()=>n5,devDependencies:()=>h5,jsdelivr:()=>i5,license:()=>c5,main:()=>r5,miniprogram:()=>u5,module:()=>s5,name:()=>e5,private:()=>a5,repository:()=>p5,scripts:()=>f5,types:()=>l5,unpkg:()=>o5,version:()=>t5});var e5="@tensorflow/tfjs",t5="3.6.0",n5="An open-source machine learning framework.",a5=!1,r5="dist/tf.node.js",s5="dist/index.js",i5="dist/tf.min.js",o5="dist/tf.min.js",l5="dist/index.d.ts",u5="dist/miniprogram",d5={"tfjs-custom-module":"dist/tools/custom_module/cli.js"},p5={type:"git",url:"https://github.com/tensorflow/tfjs.git"},c5="Apache-2.0",h5={"@babel/core":"^7.9.0","@babel/polyfill":"^7.10.4","@babel/preset-env":"^7.9.5","@rollup/plugin-commonjs":"^11.0.2","@rollup/plugin-node-resolve":"^7.1.1","@rollup/plugin-typescript":"^3.0.0","@types/argparse":"^1.0.38","@types/jasmine":"2.8.7","@types/node":"~10.17.50","@types/shelljs":"^0.8.4","@types/yargs":"^15.0.7","clang-format":"~1.2.2",commander:"~2.14.1",jasmine:"3.1.0","jasmine-core":"~3.1.0",karma:"~6.3.2","karma-browserstack-launcher":"~1.6.0","karma-chrome-launcher":"~2.2.0","karma-firefox-launcher":"~1.1.0","karma-jasmine":"~1.1.1","karma-typescript":"~5.5.1","karma-typescript-es6-transform":"^5.5.1","npm-run-all":"~4.1.3",rimraf:"~2.6.2",rollup:"~2.3.2","rollup-plugin-babel":"^4.4.0","rollup-plugin-terser":"~7.0.2","rollup-plugin-visualizer":"~4.2.2",shelljs:"~0.8.1","ts-node":"~8.8.2",tslint:"~5.11.0","tslint-no-circular-imports":"~0.5.0",typescript:"3.5.3",yalc:"1.0.0-pre.50"},f5={build:"tsc && yarn build-cli && yarn bundle","build-ci":"tsc && yarn build-cli && yarn bundle-ci",bundle:"rollup -c","bundle-ci":"rollup -c --ci","build-core":"cd ../tfjs-core && yarn && yarn build","build-core-ci":"cd ../tfjs-core && yarn && yarn build-ci","build-layers":"cd ../tfjs-layers && yarn && yarn build","build-layers-ci":"cd ../tfjs-layers && yarn && yarn build-ci","build-converter":"cd ../tfjs-converter && yarn && yarn build","build-converter-ci":"cd ../tfjs-converter && yarn && yarn build-ci","build-data":"cd ../tfjs-data && yarn && yarn build","build-data-ci":"cd ../tfjs-data && yarn && yarn build-ci","build-backend-cpu":"cd ../tfjs-backend-cpu && yarn && yarn build","build-backend-cpu-ci":"cd ../tfjs-backend-cpu && yarn && yarn build-ci","build-backend-webgl":"cd ../tfjs-backend-webgl && yarn && yarn build","build-backend-webgl-ci":"cd ../tfjs-backend-webgl && yarn && yarn build-ci","build-deps":"yarn build-core && yarn build-layers && yarn build-converter && yarn build-data && yarn build-backend-cpu && yarn build-backend-webgl","build-deps-ci":"yarn build-core-ci && yarn build-layers-ci && yarn build-converter-ci && yarn build-data-ci && yarn build-backend-cpu-ci && yarn build-backend-webgl-ci","build-cli":"tsc --project ./tools/custom_module/tsconfig.json && chmod +x ./dist/tools/custom_module/cli.js","run-custom-build":"ts-node -s ./tools/custom_module/cli.ts","build-npm":"./scripts/build-npm.sh","link-local":"yalc link","publish-local":"yarn build-npm && yalc push","publish-npm":"npm publish",lint:"tslint -p . -t verbose",coverage:"KARMA_COVERAGE=1 karma start --browsers='Chrome' --singleRun",test:"yarn && yarn build-deps && yarn build && karma start","test-dev":"karma start","test-tools":"ts-node --project ./tools/custom_module/tsconfig.json run_tools_tests.ts","test-ci":"./scripts/test-ci.sh"},m5={"@tensorflow/tfjs-backend-cpu":"3.6.0","@tensorflow/tfjs-backend-webgl":"3.6.0","@tensorflow/tfjs-converter":"3.6.0","@tensorflow/tfjs-core":"3.6.0","@tensorflow/tfjs-data":"3.6.0","@tensorflow/tfjs-layers":"3.6.0",argparse:"^1.0.10",chalk:"^4.1.0","core-js":"3","regenerator-runtime":"^0.13.5",yargs:"^16.0.3"},A5={"node-fetch":!1,util:!1,crypto:!1},SI={name:e5,version:t5,description:n5,private:a5,main:r5,module:s5,jsdelivr:i5,unpkg:o5,types:l5,miniprogram:u5,bin:d5,repository:p5,license:c5,devDependencies:h5,scripts:f5,dependencies:m5,browser:A5},Am={};Fe(Am,{browser:()=>D5,default:()=>NI,dependencies:()=>$5,description:()=>x5,devDependencies:()=>M5,engines:()=>E5,jsdelivr:()=>w5,"jsnext:main":()=>S5,license:()=>R5,main:()=>v5,miniprogram:()=>T5,module:()=>N5,name:()=>y5,private:()=>b5,repository:()=>C5,scripts:()=>F5,sideEffects:()=>z5,types:()=>I5,unpkg:()=>k5,version:()=>g5});var y5="@tensorflow/tfjs-core",g5="3.6.0",x5="Hardware-accelerated JavaScript library for machine intelligence",b5=!1,v5="dist/tf-core.node.js",w5="dist/tf-core.min.js",k5="dist/tf-core.min.js",I5="dist/index.d.ts",S5="dist/index.js",N5="dist/index.js",T5="dist/miniprogram",E5={yarn:">= 1.3.2"},C5={type:"git",url:"https://github.com/tensorflow/tfjs-core.git"},R5="Apache-2.0",M5={"@bazel/bazelisk":"^1.3.0","@bazel/typescript":"^0.27.8","@rollup/plugin-commonjs":"^11.0.2","@rollup/plugin-node-resolve":"^7.1.1","@rollup/plugin-typescript":"^3.0.0","@tensorflow/tfjs-backend-cpu":"link:../tfjs-backend-cpu","@types/jasmine":"~3.0.0","@types/node":"~9.6.0","@types/node-fetch":"~2.1.2","clang-format":"~1.2.4",jasmine:"~3.1.0","jasmine-core":"~3.1.0",karma:"6.3.2","karma-browserstack-launcher":"~1.6.0","karma-chrome-launcher":"~3.1.0","karma-jasmine":"~4.0.1","karma-typescript":"~5.5.1","npm-run-all":"~4.1.3",rimraf:"~2.6.2",rollup:"~2.3.2","rollup-plugin-terser":"~5.3.0","rollup-plugin-visualizer":"~3.3.2",shelljs:"~0.8.3","ts-node":"~8.8.2",tslint:"~5.11.0","tslint-no-circular-imports":"~0.5.0",typescript:"3.5.3",yalc:"~1.0.0-pre.21",yargs:"~13.2.2"},F5={"build-ci":"./scripts/enumerate-tests.js --ci && tsc && yarn bundle-ci && yarn build-test-snippets",build:"node ./scripts/enumerate-tests.js && tsc && yarn bundle",bundle:"rollup -c","bundle-ci":"rollup -c --ci","build-npm":"./scripts/build-npm.sh","build-deps":"yarn build && yarn build-cpu-backend","build-cpu-backend":"cd ../tfjs-backend-cpu && yarn && yarn build","build-cpu-backend-ci":"cd ../tfjs-backend-cpu && yarn && yarn build-ci","build:bazel":"bazelisk build //...","build-test-snippets":"yarn tsc --project ./scripts/test_snippets/tsconfig.json","format-all":"clang-format -i -style=Google --glob=src/**/*.ts","link-local":"yalc link","publish-local":"rimraf dist/ && yarn build && rollup -c && yalc push","publish-npm":"npm publish",lint:"tslint -p . -t verbose",coverage:"KARMA_COVERAGE=1 karma start --browsers='Chrome' --singleRun",test:"yarn && yarn build-deps && karma start","test-dev":"karma start","test-ci":"./scripts/test-ci.sh","test-webworker":"karma start --worker","run-browserstack":"karma start --browserstack","test-bundle-size":"./scripts/test-bundle-size.js","test-node":"rimraf dist/ && yarn build-deps && yarn build && ts-node --transpile-only --skip-ignore -P tsconfig.test.json dist/test_node.js","test-node-dev":"tsc && ts-node --transpile-only --skip-ignore -P tsconfig.test.json dist/test_node.js","test-node-ci":"ts-node --transpile-only -P tsconfig.test.json dist/test_node.js","test-async-backends":"rimraf dist/ && yarn build && ts-node --transpile-only -P tsconfig.test.json dist/test_async_backends.js","test-async-backends-ci":"ts-node --transpile-only -P tsconfig.test.json dist/test_async_backends.js","test-snippets":"yarn build && yarn build-cpu-backend && ts-node -P tsconfig.test.json ./scripts/test_snippets/test_snippets.ts","test-snippets-ci":"ts-node -P tsconfig.test.json ./scripts/test_snippets/test_snippets.ts"},$5={"@types/offscreencanvas":"~2019.3.0","@types/seedrandom":"2.4.27","@types/webgl-ext":"0.0.30","node-fetch":"~2.6.1",seedrandom:"2.4.3"},D5={"node-fetch":!1,util:!1,crypto:!1,worker_threads:!1},z5=["./dist/index.js","./dist/engine.js","./dist/tensor.js","./dist/base_side_effects.js","./dist/flags.js","./dist/platforms/*.js","./dist/register_all_gradients.js","./dist/public/chained_ops/*.js","./dist/io/*.js"],NI={name:y5,version:g5,description:x5,private:b5,main:v5,jsdelivr:w5,unpkg:k5,types:I5,"jsnext:main":S5,module:N5,miniprogram:T5,engines:E5,repository:C5,license:R5,devDependencies:M5,scripts:F5,dependencies:$5,browser:D5,sideEffects:z5},ym={};Fe(ym,{browser:()=>J5,default:()=>TI,dependencies:()=>Y5,description:()=>P5,devDependencies:()=>X5,jsdelivr:()=>B5,"jsnext:main":()=>U5,license:()=>q5,main:()=>W5,miniprogram:()=>G5,module:()=>H5,name:()=>O5,peerDependencies:()=>Z5,private:()=>L5,scripts:()=>K5,types:()=>j5,unpkg:()=>V5,version:()=>_5});var O5="@tensorflow/tfjs-data",_5="3.6.0",P5="TensorFlow Data API in JavaScript",L5=!1,W5="dist/tf-data.node.js",B5="dist/tf-data.min.js",V5="dist/tf-data.min.js",j5="dist/index.d.ts",U5="dist/index.js",H5="dist/index.js",G5="dist/miniprogram",q5="Apache-2.0",X5={"@rollup/plugin-commonjs":"^11.0.2","@rollup/plugin-node-resolve":"^7.1.1","@rollup/plugin-typescript":"^3.0.0","@tensorflow/tfjs-backend-cpu":"3.6.0","@tensorflow/tfjs-core":"3.6.0","@tensorflow/tfjs-layers":"3.6.0","@types/jasmine":"~2.5.53","@types/seedrandom":"^2.4.27","@types/utf8":"~2.1.6","clang-format":"~1.2.2","http-server":"~0.12.3",jasmine:"3.1.0","jasmine-core":"~3.1.0",karma:"~6.3.1","karma-chrome-launcher":"~2.2.0","karma-firefox-launcher":"~1.1.0","karma-jasmine":"~1.1.1","karma-typescript":"~5.5.1","karma-typescript-es6-transform":"^5.0.2",nyc:"^15.1.0",rimraf:"~2.6.2",rollup:"~2.3.2","rollup-plugin-terser":"~7.0.2","rollup-plugin-visualizer":"~3.3.2","ts-node":"~7.0.0",tslint:"~6.1.3","tslint-no-circular-imports":"^0.7.0",typescript:"3.5.3",yalc:"^1.0.0-pre.50"},K5={build:"tsc && yarn bundle","build-ci":"tsc && yarn bundle-ci",bundle:"rollup -c","bundle-ci":"rollup -c --ci","build-core":"cd ../tfjs-core && yarn && yarn build","build-core-ci":"cd ../tfjs-core && yarn && yarn build-ci","build-layers":"cd ../tfjs-layers && yarn && yarn build","build-backend-cpu":"cd ../tfjs-backend-cpu && yarn && yarn build","build-backend-cpu-ci":"cd ../tfjs-backend-cpu && yarn && yarn build-ci","build-layers-ci":"cd ../tfjs-layers && yarn && yarn build-ci","build-deps":"yarn build-core && yarn build-layers && yarn build-backend-cpu","build-deps-ci":"yarn build-core-ci && yarn build-layers-ci && yarn build-backend-cpu-ci","build-npm":"./scripts/build-npm.sh","link-local":"yalc link","publish-local":"rimraf dist/ && yarn build-npm && yalc push","publish-npm":"npm publish",test:"yarn && yarn build-deps && yarn build && ts-node --transpile-only --project tsconfig.test.json src/test_node.ts","test-dev":"tsc && ts-node --transpile-only --project tsconfig.test.json src/test_node.ts","test-browsers":"karma start --browsers='Chrome,Firefox'","test-ci":"ts-node --transpile-only --skip-ignore -P tsconfig.test.json src/test_node.ts","test-snippets":"yarn && yarn build-deps && yarn build && ts-node --skip-ignore --project tsconfig.test.json ./scripts/test_snippets.ts","test-snippets-ci":"ts-node --skip-ignore --project tsconfig.test.json ./scripts/test_snippets.ts",coverage:"yarn nyc yarn ts-node --transpile-only -P tsconfig.test.json src/test_node.ts",lint:"tslint -p . -t verbose"},Z5={"@tensorflow/tfjs-core":"3.6.0",seedrandom:"~2.4.3"},Y5={"@types/node-fetch":"^2.1.2","node-fetch":"~2.6.1"},J5={fs:!1,"node-fetch":!1,string_decoder:!1,crypto:!1},TI={name:O5,version:_5,description:P5,private:L5,main:W5,jsdelivr:B5,unpkg:V5,types:j5,"jsnext:main":U5,module:H5,miniprogram:G5,license:q5,devDependencies:X5,scripts:K5,peerDependencies:Z5,dependencies:Y5,browser:J5},gm={};Fe(gm,{default:()=>EI,description:()=>tx,devDependencies:()=>px,jsdelivr:()=>lx,"jsnext:main":()=>ix,license:()=>nx,main:()=>rx,miniprogram:()=>dx,module:()=>ox,name:()=>Q5,peerDependencies:()=>hx,private:()=>ax,scripts:()=>cx,types:()=>sx,unpkg:()=>ux,version:()=>ex});var Q5="@tensorflow/tfjs-layers",ex="3.6.0",tx="TensorFlow layers API in JavaScript",nx="Apache-2.0 AND MIT",ax=!1,rx="dist/tf-layers.node.js",sx="dist/index.d.ts",ix="dist/index.js",ox="dist/index.js",lx="dist/tf-layers.min.js",ux="dist/tf-layers.min.js",dx="dist/miniprogram",px={"@babel/polyfill":"^7.8.7","@rollup/plugin-commonjs":"^11.0.2","@rollup/plugin-node-resolve":"^7.1.1","@rollup/plugin-typescript":"^3.0.0","@tensorflow/tfjs-backend-cpu":"3.6.0","@tensorflow/tfjs-backend-webgl":"3.6.0","@tensorflow/tfjs-core":"3.6.0","@types/jasmine":"~2.5.53","clang-format":"~1.2.2","http-server":"~0.12.3",jasmine:"~3.1.0","jasmine-core":"~3.1.0",karma:"~6.3.1","karma-browserstack-launcher":"~1.6.0","karma-chrome-launcher":"~2.2.0","karma-firefox-launcher":"~1.1.0","karma-jasmine":"~1.1.1","karma-typescript":"~5.5.1","karma-typescript-es6-transform":"^5.0.2",rimraf:"~2.6.2",rollup:"~2.3.2","rollup-plugin-terser":"~7.0.2","rollup-plugin-visualizer":"~3.3.2","ts-node":"~8.8.2",tslint:"~6.1.3","tslint-no-circular-imports":"^0.7.0",typescript:"3.5.3",yalc:"~1.0.0-pre.50"},cx={prep:"yarn install && yarn build-ci",build:"tsc && yarn bundle","build-ci":"tsc && yarn bundle-ci",bundle:"rollup -c","bundle-ci":"rollup -c --ci","build-core":"cd ../tfjs-core && yarn && yarn build","build-backend-cpu":"cd ../tfjs-backend-cpu && yarn && yarn build","build-backend-cpu-ci":"cd ../tfjs-backend-cpu && yarn && yarn build-ci","build-backend-webgl":"cd ../tfjs-backend-webgl && yarn && yarn build","build-backend-webgl-ci":"cd ../tfjs-backend-webgl && yarn && yarn build-ci","build-core-ci":"cd ../tfjs-core && yarn && yarn build-ci","build-deps":"yarn build-core && yarn build-backend-cpu && yarn build-backend-webgl","build-deps-ci":"yarn build-core-ci && yarn build-backend-cpu-ci && yarn build-backend-webgl-ci","build-npm":"./scripts/build-npm.sh",format:"./tools/clang_format_ts.sh","link-local":"yalc link","publish-local":"yarn build-npm && yalc push","publish-npm":"npm publish",coverage:"KARMA_COVERAGE=1 karma start --browsers='Chrome' --singleRun",test:"yarn && yarn build-deps && karma start","test-dev":"karma start","test-ci":"./scripts/test-ci.sh","test-snippets":"yarn && yarn build-deps && yarn build && ts-node --skip-ignore -s ./scripts/test_snippets.ts","test-snippets-ci":"ts-node --skip-ignore -s ./scripts/test_snippets.ts","run-browserstack":"karma start --browsers='bs_chrome_mac' --singleRun --reporters='dots,karma-typescript'",lint:"tslint -p . -t verbose"},hx={"@tensorflow/tfjs-core":"3.6.0"},EI={name:Q5,version:ex,description:tx,license:nx,private:ax,main:rx,types:sx,"jsnext:main":ix,module:ox,jsdelivr:lx,unpkg:ux,miniprogram:dx,devDependencies:px,scripts:cx,peerDependencies:hx},xm={};Fe(xm,{default:()=>CI,description:()=>Ax,devDependencies:()=>Tx,jsdelivr:()=>wx,"jsnext:main":()=>gx,license:()=>Sx,main:()=>yx,miniprogram:()=>kx,module:()=>xx,name:()=>fx,peerDependencies:()=>Nx,repository:()=>Ix,scripts:()=>Ex,types:()=>bx,unpkg:()=>vx,version:()=>mx});var fx="@tensorflow/tfjs-converter",mx="3.6.0",Ax="Tensorflow model converter for javascript",yx="dist/tf-converter.node.js",gx="dist/index.js",xx="dist/index.js",bx="dist/index.d.ts",vx="dist/tf-converter.min.js",wx="dist/tf-converter.min.js",kx="dist/miniprogram",Ix={type:"git",url:"https://github.com/tensorflow/tfjs-converter.git"},Sx="Apache-2.0",Nx={"@tensorflow/tfjs-core":"3.6.0"},Tx={"@rollup/plugin-commonjs":"^11.0.2","@rollup/plugin-node-resolve":"^7.1.1","@rollup/plugin-replace":"^2.3.3","@rollup/plugin-typescript":"^3.0.0","@tensorflow/tfjs-backend-cpu":"3.6.0","@tensorflow/tfjs-core":"3.6.0","@types/argparse":"^1.0.38","@types/deep-equal":"^1.0.1","@types/jasmine":"~2.8.6","@types/long":"~3.0.32","@types/node-fetch":"1.6.9",ajv:"~6.3.0",argparse:"^1.0.10","babel-core":"~6.26.3","babel-plugin-external-helpers":"~6.22.0","babel-preset-env":"~1.7.0","clang-format":"~1.2.2",copyfiles:"~1.2.0","deep-equal":"^1.0.1","jasmine-core":"~3.5.0","node-fetch":"~2.6.1",opn:"~5.1.0",protobufjs:"~6.8.6",rimraf:"~2.6.2",rollup:"~2.3.2","rollup-plugin-terser":"~7.0.2","rollup-plugin-visualizer":"~3.3.2","ts-morph":"^7.1.3","ts-node":"~8.8.2",tslint:"~6.1.3","tslint-no-circular-imports":"~0.7.0",typescript:"3.5.3",yalc:"~1.0.0-pre.50"},Ex={build:"yarn gen-json --test && yarn gen-kernel2ops && tsc && yarn bundle","build-ci":"yarn gen-json --test && yarn gen-kernel2ops && tsc && yarn bundle-ci",bundle:"rollup -c","bundle-ci":"rollup -c --ci","build-core":"cd ../tfjs-core && yarn && yarn build","build-backend-cpu":"cd ../tfjs-backend-cpu && yarn && yarn build","build-backend-cpu-ci":"cd ../tfjs-backend-cpu && yarn && yarn build-ci","build-core-ci":"cd ../tfjs-core && yarn && yarn build-ci","build-deps":"yarn build-core && yarn build-backend-cpu","build-deps-ci":"yarn build-core-ci && yarn build-backend-cpu","build-npm":"./scripts/build-npm.sh","link-local":"yalc link","publish-local":"yarn build-npm && yalc push","publish-npm":"npm publish",test:"yarn && yarn build-deps && yarn build && yarn gen-json --test && yarn gen-kernel2ops && ts-node --transpile-only -P tsconfig.test.json src/run_tests.ts","test-ci":"ts-node --transpile-only --skip-ignore -P tsconfig.test.json src/run_tests.ts","test-dev":"tsc && ts-node --transpile-only -P tsconfig.test.json src/run_tests.ts","test-snippets":"yarn && yarn build-deps && yarn build && ts-node --skip-ignore -s ./scripts/test_snippets.ts","test-snippets-ci":"ts-node --skip-ignore -s ./scripts/test_snippets.ts",lint:"tslint -p . -t verbose","make-version":"sh -c ./scripts/make-version","gen-doc":"ts-node -s ./scripts/gen_doc.ts","gen-json":"ts-node -s ./scripts/gen_json.ts","model-summary":"ts-node -s ./tools/model_summary.ts",pb2json:"ts-node -s ./tools/pb2json_converter.ts","build-pip-package":"yarn gen-json --test && cd python && ./build-pip-package.sh --test /tmp/tfjs-pips","run-python-tests":"yarn gen-json --test && cd python && ./run-python-tests.sh","gen-kernel2ops":"ts-node -s scripts/kernels_to_ops.ts --out metadata/kernel2op.json"},CI={name:fx,version:mx,description:Ax,main:yx,"jsnext:main":gx,module:xx,types:bx,unpkg:vx,jsdelivr:wx,miniprogram:kx,repository:Ix,license:Sx,peerDependencies:Nx,devDependencies:Tx,scripts:Ex},RI=1e-7,MI=1e-4,Rp=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}},gu=class{refCount(e){return sa("refCount")}incRef(e){return sa("incRef")}timerAvailable(){return!0}time(e){return sa("time")}read(e){return sa("read")}readSync(e){return sa("readSync")}numDataIds(){return sa("numDataIds")}disposeData(e,t){return sa("disposeData")}write(e,t,n){return sa("write")}move(e,t,n,a,r){return sa("move")}memory(){return sa("memory")}floatPrecision(){return sa("floatPrecision")}epsilon(){return this.floatPrecision()===32?RI:MI}dispose(){return sa("dispose")}};function sa(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 Cx(e){let t=e.length,n=0,a=0;for(;t>0;)a=Math.random()*t|0,t--,n=e[t],e[t]=e[a],e[a]=n}function FI(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,a,r,s=0;for(;n>0;)s=Math.random()*n|0,n--,a=e[n],r=t[n],e[n]=e[s],t[n]=t[s],e[s]=a,t[s]=r}function xu(e,t,n){return Math.max(e,Math.min(t,n))}function $I(e){return e%2==0?e:e+1}function DI(e){let t=0;for(let n=0;nn+` Shapes ${e} and ${t} must match`)}function is(e){F(e!=null,()=>"The input to the tensor constructor must be a non-null value.")}function os(e,t=[],n=!1){if(t==null&&(t=[]),Array.isArray(e)||nn(e)&&!n)for(let a=0;a0,n){return new Promise((a,r)=>{let s=0,i=()=>{if(e()){a();return}s++;let o=t(s);if(n!=null&&s>=n){r();return}setTimeout(i,o)};i()})}function VI(e,t){let n=1,a=-1;for(let s=0;s=0)n*=e[s];else if(e[s]===-1){if(a!==-1)throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${a} and dim ${s}`);a=s}else if(e[s]<0)throw Error(`Shapes can not be < 0. Found ${e[s]} at dim ${s}`);if(a===-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[a]=t/n,r}function ia(e,t){let n=t.length;return e=e==null?t.map((a,r)=>r):[].concat(e),F(e.every(a=>a>=-n&&a`All values in axis param must be in range [-${n}, ${n}) but got axis ${e}`),F(e.every(a=>Ut(a)),()=>`All values in axis param must be integers but got axis ${e}`),e.map(a=>a<0?n+a:a)}function Rx(e,t){let n=[],a=[],r=t!=null&&Array.isArray(t)&&t.length===0,s=t==null||r?null:ia(t,e).sort(),i=0;for(let o=0;oo)&&e[o]===1&&(n.push(e[o]),a.push(o)),s[i]<=o&&i++}e[o]!==1&&(n.push(e[o]),a.push(o))}return{newShape:n,keptDims:a}}function Mx(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 Fx(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 $x(e,t){for(let n=0;nt+=n.length),t}function Ir(e){return typeof e=="string"||e instanceof String}function Ox(e){return typeof e=="boolean"}function _x(e){return typeof e=="number"}function Mp(e){return Array.isArray(e)?Mp(e[0]):e instanceof Float32Array?"float32":e instanceof Int32Array||e instanceof Uint8Array?"int32":_x(e)?"float32":Ir(e)?"string":Ox(e)?"bool":"float32"}function Sr(e){return!!(e&&e.constructor&&e.call&&e.apply)}function Fp(e,t){for(let n=t;n=0;--a)n[a]=n[a+1]*e[a+1];return n}function Px(e,t,n,a=!1){let r=new Array;if(t.length===1){let s=t[0]*(a?2:1);for(let i=0;il*u)*(a?2:1);for(let l=0;lr*s)*(n?2:1);if(a===0)return[];if(a!==t.length)throw new Error(`[${e}] does not match the input size ${t.length}${n?" for a complex tensor":""}.`);return Px(0,e,t,n)}function vm(e,t){let n=$p(e,t);for(let a=0;aa*r,1);if(t==null||t==="float32")return no(e,new Float32Array(n));if(t==="int32")return no(e,new Int32Array(n));if(t==="bool")return no(e,new Uint8Array(n));throw new Error(`Unknown data type ${t}`)}function wm(e){e.forEach(t=>{F(Number.isInteger(t)&&t>=0,()=>`Tensor must have a shape comprised of positive integers but got shape [${e}].`)})}function HI(e,t,n){if(t===0)return 0;if(t===1)return e[0];let a=e[e.length-1];for(let r=0;r{let[n,a]=t.split(":");this.urlFlags[n]=KI(n,a)})}};function qI(e){let t={};return e.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g,(n,...a)=>(XI(t,a[0],a[1]),a.join("="))),t}function XI(e,t,n){e[decodeURIComponent(t)]=decodeURIComponent(n||"")}function KI(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 J(){return oa}var oa=null;function ZI(e){oa=e}var Im;function Bx(){if(Im==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");Im=e}return Im}function YI(){let e=Bx();return e._tfGlobals==null&&(e._tfGlobals=new Map),e._tfGlobals}function Sm(e,t){let n=YI();if(n.has(e))return n.get(e);{let a=t();return n.set(e,a),n.get(e)}}var ao="Abs",ro="Acos",so="Acosh",Nr="Add",ls="AddN",io="All",oo="Any",us="ArgMax",vu="ArgMin",lo="Asin",uo="Asinh",po="Atan",co="Atanh",ho="Atan2",ds="AvgPool",Dp="AvgPoolGrad",wu="AvgPool3D",zp="AvgPool3DGrad",ps="BatchMatMul",ku="BatchToSpaceND",Op="Bincount",Vx="BroadcastTo",cs="Cast",hs="Ceil",Tr="ClipByValue",_p="Complex",Iu="ComplexAbs",fo="Concat",fs="Conv2D",Pp="Conv2DBackpropFilter",ms="Conv2DBackpropInput",Su="Conv3D",Lp="Conv3DBackpropFilterV2",Wp="Conv3DBackpropInputV2",As="Cos",mo="Cosh",ys="Cumsum",Ao="CropAndResize",Bp="DenseBincount",yo="DepthToSpace",gs="DepthwiseConv2dNative",Vp="DepthwiseConv2dNativeBackpropFilter",jp="DepthwiseConv2dNativeBackpropInput",Up="Diag",Nu="Dilation2D",Hp="Dilation2DBackpropInput",Gp="Dilation2DBackpropFilter",xs="RealDiv",qp="Einsum",go="Elu",Xp="EluGrad",xo="Erf",bo="Equal",bs="Exp",vo="ExpandDims",wo="Expm1",Kp="FFT",Tu="Fill",ko="FlipLeftRight",vs="Floor",ws="FloorDiv",ks="FusedBatchNorm",Io="GatherV2",So="GatherNd",No="Greater",Is="GreaterEqual",Ss="Identity",Zp="IFFT",Yp="Imag",To="IsFinite",Eo="IsInf",Co="IsNan",Ns="LeakyRelu",Ro="Less",Mo="LessEqual",Jp="LinSpace",Ts="Log",Fo="Log1p",$o="LogicalAnd",Eu="LogicalNot",Cu="LogicalOr",jx="LogSoftmax",Ru="LRN",Qp="LRNGrad",Es="Max",Cs="Maximum",Rs="MaxPool",ec="MaxPoolGrad",Mu="MaxPool3D",tc="MaxPool3DGrad",nc="MaxPoolWithArgmax",Ms="Mean",Fs="Min",$s="Minimum",Ds="MirrorPad",Do="Mod",ac="Multinomial",zs="Multiply",zo="Neg",Oo="NotEqual",_o="NonMaxSuppressionV3",Po="NonMaxSuppressionV4",Lo="NonMaxSuppressionV5",Wo="OnesLike",Os="OneHot",Bo="Pack",_s="PadV2",JI="Pool",Ps="Pow",Ls="Prelu",Vo="Prod",Fu="Range",rc="Real",jo="Reciprocal",Ws="Relu",Uo="Reshape",$u="ResizeNearestNeighbor",sc="ResizeNearestNeighborGrad",Bs="ResizeBilinear",ic="ResizeBilinearGrad",Vs="Relu6",js="Reverse",Us="Round",Hs="Rsqrt",Ho="ScatterNd",Go="Select",qo="Selu",Xo="Slice",Gs="Sin",Ko="Sinh",Zo="Sign",qs="Sigmoid",Yo="Softplus",Xs="Sqrt",Ks="Sum",Du="SpaceToBatchND",Jo="SplitV",Zs="Softmax",oc="SparseFillEmptyRows",lc="SparseReshape",uc="SparseToDense",Ys="SquaredDifference",zu="Square",Qo="StridedSlice",Js="Sub",Qs="Tan",ei="Tanh",Er="Tile",el="TopK",tl="Transform",ti="Transpose",dc="Unique",nl="Unpack",Ou="UnsortedSegmentSum",al="ZerosLike",Cr="Step",pc="FromPixels",rl="RotateWithOffset",ni="_FusedMatMul",ai="FusedConv2D",ri="FusedDepthwiseConv2D",sl=Sm("kernelRegistry",()=>new Map),_u=Sm("gradRegistry",()=>new Map);function cc(e,t){let n=Tm(e,t);return sl.get(n)}function Nm(e){return _u.get(e)}function il(e){let t=sl.entries(),n=[];for(;;){let{done:a,value:r}=t.next();if(a)break;let[s,i]=r,[o]=s.split("_");o===e&&n.push(i)}return n}function si(e){let{kernelName:t,backendName:n}=e,a=Tm(t,n);sl.has(a)&&console.warn(`The kernel '${t}' for backend '${n}' is already registered`),sl.set(a,e)}function Ux(e){let{kernelName:t}=e;_u.has(t)&&J().getBool("DEBUG")&&console.warn(`Overriding the gradient for '${t}'`),_u.set(t,e)}function QI(e,t){let n=Tm(e,t);if(!sl.has(n))throw new Error(`The kernel '${e}' for backend '${t}' is not registered`);sl.delete(n)}function eS(e){if(!_u.has(e))throw new Error(`The gradient '${e}' for backend is not registered`);_u.delete(e)}function tS(e,t){il(e).forEach(n=>{let a=Object.assign({},n,{backendName:t});si(a)})}function Tm(e,t){return`${t}_${e}`}var k={};Fe(k,{arraysEqual:()=>ar,assert:()=>F,assertNonNegativeIntegerDimensions:()=>wm,assertNonNull:()=>is,assertShapesMatch:()=>on,bytesFromStringArray:()=>zx,bytesPerElement:()=>bm,checkConversionForErrors:()=>$x,clamp:()=>xu,computeStrides:()=>to,createScalarValue:()=>nS,createShuffledIndices:()=>WI,decodeString:()=>fc,distSquared:()=>OI,encodeString:()=>Lu,fetch:()=>rS,flatten:()=>os,getArrayFromDType:()=>Fx,getTypedArrayFromDType:()=>Mx,hasEncodingLoss:()=>jI,indexToLoc:()=>GI,inferDtype:()=>Mp,inferFromImplicitShape:()=>VI,isBoolean:()=>Ox,isFunction:()=>Sr,isInt:()=>Ut,isNumber:()=>_x,isPromise:()=>km,isScalarShape:()=>_I,isString:()=>Ir,isTypedArray:()=>nn,isValidDtype:()=>Dx,locToIndex:()=>HI,makeOnesTypedArray:()=>vm,makeZerosNestedTypedArray:()=>UI,makeZerosTypedArray:()=>$p,nearestDivisor:()=>Fp,nearestLargerEven:()=>$I,now:()=>Pu,parseAxisParam:()=>ia,randUniform:()=>zI,repeatedTry:()=>BI,rightPad:()=>bu,shuffle:()=>Cx,shuffleCombo:()=>FI,sizeFromShape:()=>Nt,sizeToSquarishShape:()=>LI,squeezeShape:()=>Rx,sum:()=>DI,tanh:()=>PI,toNestedArray:()=>no,toTypedArray:()=>hc});function nS(e,t){return t==="string"?Lu(e):hc([e],t)}function aS(e,t){return e instanceof Float32Array&&t==="float32"||e instanceof Int32Array&&t==="int32"||e instanceof Uint8Array&&t==="bool"}function hc(e,t){if(t==="string")throw new Error("Cannot convert a string[] to a TypedArray");if(Array.isArray(e)&&(e=os(e)),J().getBool("DEBUG")&&$x(e,t),aS(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 a=0;a{a=n()},s,i=Pu();if(this.backendTimer.timerAvailable())s=this.backendTimer.time(r);else{r();for(let o of a)o.dataSync();s=Promise.resolve({kernelMs:Pu()-i})}if(J().getBool("CHECK_COMPUTATION_FOR_ERRORS"))for(let o=0;o{iS(u,l.dtype,e)})}return{kernelName:e,outputs:a,inputs:t,timeMs:s.then(o=>o.kernelMs),extraInfo:s.then(o=>o.getExtraProfileInfo!=null?o.getExtraProfileInfo():"")}}logKernelProfile(e){let{kernelName:t,outputs:n,timeMs:a,inputs:r,extraInfo:s}=e;n.forEach(i=>{Promise.all([i.data(),a,s]).then(o=>{this.logger.logKernelProfile(t,i,o[0],o[1],r,o[2])})})}};function iS(e,t,n){if(t!=="float32")return!1;for(let a=0;a0?m:""} `}}console.log(`%c${o} %c${i} %c${l}D ${d} %c${u} %c${p} %c${s}`,"font-weight:bold","color:red","color:blue","color: orange","color: green","color: steelblue")}};function lS(e,t,n){let a={},r={};for(let l=0;la[f.id]=!0),h=!0,r[u.id]=!0;break}if(h)break}}let s={};s[n.id]=!0;let i={};for(let l=e.length-1;l>=0;l--){let u=e[l],d=u.inputs;for(let p=0;p=0;r--){let s=t[r],i=[];if(s.outputs.forEach(l=>{let u=e[l.id];u!=null?i.push(u):i.push(null)}),s.gradient==null)throw new Error(`Cannot compute gradient: gradient function not found for ${s.kernelName}.`);let o=s.gradient(i);for(let l in s.inputs){if(!(l in o))throw new Error(`Cannot backprop through input ${l}. Available gradients found: ${Object.keys(o)}.`);let u=n(()=>o[l]());if(u.dtype!=="float32")throw new Error(`Error in gradient for op ${s.kernelName}. The gradient of input ${l} must have 'float32' dtype, but has '${u.dtype}'`);let d=s.inputs[l];if(!ar(u.shape,d.shape))throw new Error(`Error in gradient for op ${s.kernelName}. The gradient of input '${l}' has shape '${u.shape}', which does not match the shape of the input '${d.shape}'`);if(e[d.id]==null)e[d.id]=u;else{let p=e[d.id];e[d.id]=a(p,u),p.dispose()}}}}var Hx=20,Wu=3,Em=7;function dS(e,t,n,a){let r=to(t),s=pS(e,t,n,r),i=t.length,o=mc(e,t,n,r,s),l=["Tensor"];return a&&(l.push(` dtype: ${n}`),l.push(` rank: ${i}`),l.push(` shape: [${t}]`),l.push(" values:")),l.push(o.map(u=>" "+u).join(` -`)),l.join(` -`)}function pS(e,t,n,a){let r=Nt(t),s=a[a.length-1],i=new Array(s).fill(0),o=t.length,l=n==="complex64"?Vu(e):e;if(o>1)for(let u=0;uHx){let A=Wu*i,y=Array.from(e.slice(0,A)),g=Array.from(e.slice((o-Wu)*i,o*i));return n==="complex64"&&(y=Vu(y),g=Vu(g)),["["+y.map((x,w)=>Bu(x,r[w],n)).join(", ")+", ..., "+g.map((x,w)=>Bu(x,r[o-Wu+w],n)).join(", ")+"]"]}let f=n==="complex64"?Vu(e):Array.from(e);return["["+f.map((A,y)=>Bu(A,r[y],n)).join(", ")+"]"]}let u=t.slice(1),d=a.slice(1),p=a[0]*i,c=[];if(o>Hx){for(let f=0;f`Length of values '${a}' 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||Fx(t,this.size),this.strides=to(e)}set(e,...t){t.length===0&&(t=[0]),F(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 a of e){if(a<0||a>=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 a=0;afc(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=za().readSync(this.dataId);if(this.dtype==="string")try{return e.map(t=>fc(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 za().read(this.dataId);return this.dtype==="string"?e:new Uint8Array(e.buffer)}dispose(){this.isDisposed||(za().disposeTensor(this),this.isDisposedInternal=!0)}get isDisposed(){return this.isDisposedInternal}throwIfDisposed(){if(this.isDisposed)throw new Error("Tensor is disposed.")}print(e=!1){return ol.print(this,e)}clone(){return this.throwIfDisposed(),ol.clone(this)}toString(e=!1){let t=this.dataSync();return dS(t,this.shape,this.dtype,e)}cast(e){return this.throwIfDisposed(),ol.cast(this,e)}variable(e=!0,t,n){return this.throwIfDisposed(),za().makeVariable(this,e,t,n)}};Object.defineProperty(Le,Symbol.hasInstance,{value:e=>!!e&&e.data!=null&&e.dataSync!=null&&e.throwIfDisposed!=null});function Z(){return Sm("Tensor",()=>Le)}Z();var ju=class extends Le{constructor(e,t,n,a){super(e.shape,e.dtype,e.dataId,a);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(!ar(e.shape,this.shape))throw new Error(`shape of the new value (${e.shape}) and previous value (${this.shape}) must match`);za().disposeTensor(this),this.dataId=e.dataId,za().incRef(this,null)}dispose(){za().disposeVariable(this),this.isDisposedInternal=!0}};Object.defineProperty(ju,Symbol.hasInstance,{value:e=>e instanceof Le&&e.assign!=null&&e.assign instanceof Function});var ga={};Fe(ga,{assertTypesMatch:()=>qx,getTensorsInContainer:()=>Dm,isTensorInList:()=>yS,makeTypesMatch:()=>bt});var Cm;(function(e){e.R0="R0",e.R1="R1",e.R2="R2",e.R3="R3",e.R4="R4",e.R5="R5",e.R6="R6"})(Cm||(Cm={}));var Rm;(function(e){e.float32="float32",e.int32="int32",e.bool="int32",e.complex64="complex64"})(Rm||(Rm={}));var Mm;(function(e){e.float32="float32",e.int32="int32",e.bool="bool",e.complex64="complex64"})(Mm||(Mm={}));var Fm;(function(e){e.float32="float32",e.int32="float32",e.bool="float32",e.complex64="complex64"})(Fm||(Fm={}));var $m;(function(e){e.float32="complex64",e.int32="complex64",e.bool="complex64",e.complex64="complex64"})($m||($m={}));var AS={float32:Fm,int32:Rm,bool:Mm,complex64:$m};function la(e,t){if(e==="string"||t==="string"){if(e==="string"&&t==="string")return"string";throw new Error(`Can not upcast ${e} with ${t}`)}return AS[e][t]}function Ac(e){return la(e,"int32")}function bt(e,t){if(e.dtype===t.dtype)return[e,t];let n=la(e.dtype,t.dtype);return[e.cast(n),t.cast(n)]}function qx(e,t){F(e.dtype===t.dtype,()=>`The dtypes of the first(${e.dtype}) and second(${t.dtype}) input must match`)}function yS(e,t){return t.some(n=>n.id===e.id)}function Dm(e){let t=[],n=new Set;return Xx(e,t,n),t}function Xx(e,t,n){if(e==null)return;if(e instanceof Le){t.push(e);return}if(!gS(e))return;let a=e;for(let r in a){let s=a[r];n.has(s)||(n.add(s),Xx(s,t,n))}}function gS(e){return Array.isArray(e)||typeof e=="object"}function zm(e){return e.kernelName!=null}var Kx=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()}},Uu=class{constructor(e){this.ENV=e,this.registry={},this.registryFactory={},this.pendingBackendInitId=0,this.state=new Kx}async ready(){if(this.pendingBackendInit!=null)return this.pendingBackendInit.then(()=>{});if(this.backendInstance!=null)return;let e=this.getSortedBackends();for(let t=0;t{e.setupFunc!=null&&e.setupFunc(this.backendInstance)})}disposeRegisteredKernels(e){il(e).forEach(t=>{t.disposeFunc!=null&&t.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 gu)&&typeof n.then=="function"){let a=++this.pendingBackendInitId,r=n.then(s=>a(athis.registryFactory[t].priority-this.registryFactory[e].priority)}initializeBackendsAndReturnBest(){let e=this.getSortedBackends();for(let t=0;tthis.startScope(n),()=>this.endScope(a),()=>(a=t(),a instanceof Promise&&console.error("Cannot return a Promise inside of tidy."),a))}scopedRun(e,t,n){e();try{let a=n();return t(),a}catch(a){throw t(),a}}nextTensorId(){return Uu.nextTensorId++}nextVariableId(){return Uu.nextVariableId++}clone(e){let t=D.runKernel(Ss,{x:e}),n={x:e},a=s=>({x:()=>{let i="float32",o={x:s},l={dtype:i};return D.runKernel(cs,o,l)}}),r=[];return this.addTapeNode(this.state.activeScope.name,n,[t],a,r,{}),t}runKernel(e,t,n){if(cc(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 a=this.backend.numDataIds(),r=0;n.forEach(o=>{r+=o.dtype==="complex64"?3:1});let s=this.state.numDataMovesStack[this.state.numDataMovesStack.length-1],i=a-t-r-s;if(i>0)throw new Error(`Backend '${this.backendName}' has an internal memory leak (${i} data ids) after running '${e}'`)}runKernelFunc(e){let t,n=[],a=this.isTapeOn(),r=this.state.numBytes,s=this.state.numTensors;this.shouldCheckForMemLeaks()&&this.state.numDataMovesStack.push(0);let i;this.backendName==null&&this.backend;let o,l=zm(e)?e.kernelName:this.state.activeScope!=null?this.state.activeScope.name:"";if(zm(e)){let{kernelName:h,inputs:m,attrs:f}=e;this.backendName==null&&this.backend;let A=cc(h,this.backendName);F(A!=null,()=>`Cannot find registered kernel '${h}' for backend '${this.backendName}'`),i=()=>{let y=this.backend.numDataIds();o=A.kernelFunc({inputs:m,attrs:f,backend:this.backend});let g=Array.isArray(o)?o:[o];this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(h,y,g);let x=g.map(w=>{if(w.rank!=null)return w;let{dataId:b,shape:v,dtype:N}=w;return this.makeTensorFromDataId(b,v,N)});if(a){let w=this.getTensorsForGradient(h,m,x);n=this.saveTensorsForBackwardMode(w)}return x}}else{let{forwardFunc:h}=e,m=f=>{!a||(n=f.map(A=>this.keep(this.clone(A))))};i=()=>{let f=this.backend.numDataIds();o=this.tidy(()=>h(this.backend,m));let A=Array.isArray(o)?o:[o];return this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(l,f,A),A}}let{inputs:u,attrs:d}=e,p=zm(e)?null:e.backwardsFunc,c;return this.scopedRun(()=>this.state.kernelDepth++,()=>this.state.kernelDepth--,()=>{!this.ENV.getBool("DEBUG")&&!this.state.profiling?t=i():(c=this.profiler.profileKernel(l,u,()=>i()),this.ENV.getBool("DEBUG")&&this.profiler.logKernelProfile(c),t=c.outputs)}),a&&this.addTapeNode(l,u,t,p,n,d),this.state.profiling&&this.state.activeProfile.kernels.push({name:l,bytesAdded:this.state.numBytes-r,totalBytesSnapshot:this.state.numBytes,tensorsAdded:this.state.numTensors-s,totalTensorsSnapshot:this.state.numTensors,inputShapes:Object.keys(u).map(h=>u[h]!=null?u[h].shape:null),outputShapes:t.map(h=>h.shape),kernelTimeMs:c.timeMs,extraInfo:c.extraInfo}),Array.isArray(o)?t:t[0]}saveTensorsForBackwardMode(e){return e.map(t=>this.keep(this.clone(t)))}getTensorsForGradient(e,t,n){let a=Nm(e);if(a!=null){let r=a.inputsToSave||[],s=a.outputsToSave||[],i;a.saveAllInputs?(F(Array.isArray(t),()=>"saveAllInputs is true, expected inputs to be an array."),i=Object.keys(t).map(l=>t[l])):i=r.map(l=>t[l]);let o=n.filter((l,u)=>s[u]);return i.concat(o)}return[]}makeTensor(e,t,n,a){if(e==null)throw new Error("Values passed to engine.makeTensor() are null");n=n||"float32",a=a||this.backend;let r=e;n==="string"&&Ir(e[0])&&(r=e.map(o=>Lu(o)));let s=a.write(r,t,n),i=new Le(t,n,s,this.nextTensorId());if(this.trackTensor(i,a),n==="string"){let o=this.state.tensorInfo.get(s),l=zx(r);this.state.numBytes+=l-o.bytes,o.bytes=l}return i}makeTensorFromDataId(e,t,n,a){n=n||"float32";let r=new Le(t,n,e,this.nextTensorId());return this.trackTensor(r,a),r}makeVariable(e,t=!0,n,a){n=n||this.nextVariableId().toString(),a!=null&&a!==e.dtype&&(e=e.cast(a));let r=new ju(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*bm(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 ju||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*bm(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(a=>a.totalBytesSnapshot)),this.state.activeProfile.newBytes=this.state.numBytes-t,this.state.activeProfile.newTensors=this.state.numTensors-n;for(let a of this.state.activeProfile.kernels)a.kernelTimeMs=await a.kernelTimeMs,a.extraInfo=await a.extraInfo;return this.state.activeProfile}isTapeOn(){return this.state.gradientDepth>0&&this.state.kernelDepth===0}addTapeNode(e,t,n,a,r,s){let i={id:this.state.nextTapeNodeId++,kernelName:e,inputs:t,outputs:n,saved:r},o=Nm(e);o!=null&&(a=o.gradFunc),a!=null&&(i.gradient=l=>(l=l.map((u,d)=>{if(u==null){let p=n[d],c=$p(p.size,p.dtype);return this.makeTensor(c,p.shape,p.dtype)}return u}),a(l.length>1?l:l[0],r,s))),this.state.activeTape.push(i)}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=Dm(e),n=new Set(t.map(r=>r.id));for(let r=0;r{!r.kept&&r.scopeId===a.id&&this.track(r)})}gradients(e,t,n,a=!1){if(F(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));F(r instanceof Le,()=>"The result y returned by f() must be a tensor.");let s=lS(this.state.activeTape,t,r);if(!a&&s.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 i={};i[r.id]=n==null?xS(r.shape):n,uS(i,s,l=>this.tidy(l),bS);let o=t.map(l=>i[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:o}})}customGrad(e){return F(Sr(e),()=>"The f passed in customGrad(f) must be a function."),(...t)=>{F(t.every(i=>i instanceof Le),()=>"The args passed in customGrad(f)(x1, x2,...) must all be tensors");let n,a={};t.forEach((i,o)=>{a[o]=i});let r=(i,o)=>(n=e(...t,o),F(n.value instanceof Le,()=>"The function f passed in customGrad(f) must return an object where `obj.value` is a tensor"),F(Sr(n.gradFunc),()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function."),n.value),s=(i,o)=>{let l=n.gradFunc(i,o),u=Array.isArray(l)?l:[l];F(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(...)."),F(u.every(p=>p instanceof Le),()=>"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 d={};return u.forEach((p,c)=>{d[c]=()=>p}),d};return this.runKernelFunc({forwardFunc:r,backwardsFunc:s,inputs:a})}}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=Pu(),n=await this.backend.time(e);return n.wallMs=Pu()-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 Kx;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}};Uu.nextTensorId=0;Uu.nextVariableId=0;function xS(e){let t=vm(Nt(e),"float32");return D.makeTensor(t,e,"float32")}function Zx(){let e=Bx();if(e._tfengine==null){let t=new Wx(e);e._tfengine=new Uu(t)}return ZI(e._tfengine.ENV),hS(()=>e._tfengine),e._tfengine}var D=Zx();function bS(e,t){let n={a:e,b:t};return D.runKernel(Nr,n)}var Hu={};Fe(Hu,{isBrowser:()=>Yx,isMobile:()=>wS});function vS(){return typeof navigator!="undefined"&&navigator!=null}function wS(e){if(e||vS()){if(e||(e=navigator),e.product==="ReactNative")return!0;let t=e.userAgent||e.vendor||window.opera;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 Yx(){return typeof window!="undefined"&&window.document!=null||typeof WorkerGlobalScope!="undefined"}var xa=J();xa.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.")});xa.registerFlag("IS_BROWSER",()=>Yx());xa.registerFlag("IS_NODE",()=>typeof process!="undefined"&&typeof process.versions!="undefined"&&typeof process.versions.node!="undefined");xa.registerFlag("IS_CHROME",()=>typeof navigator!="undefined"&&navigator!=null&&navigator.userAgent!=null&&/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor));xa.registerFlag("PROD",()=>!1);xa.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY",()=>xa.getBool("DEBUG"));xa.registerFlag("DEPRECATION_WARNINGS_ENABLED",()=>!0);xa.registerFlag("IS_TEST",()=>!1);xa.registerFlag("CHECK_COMPUTATION_FOR_ERRORS",()=>!0);xa.registerFlag("WRAP_TO_IMAGEBITMAP",()=>!1);function Oa(e,t){let n=e;if(nn(e))return t==="string"?[]:[e.length];if(!Array.isArray(e))return[];let a=[];for(;Array.isArray(n)||nn(n)&&t!=="string";)a.push(n.length),n=n[0];return Array.isArray(e)&&J().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")&&Jx(e,a,[]),a}function Jx(e,t,n){if(n=n||[],!Array.isArray(e)&&!nn(e)){F(t.length===0,()=>`Element arr[${n.join("][")}] is a primitive, but should be an array/TypedArray of ${t[0]} elements`);return}F(t.length>0,()=>`Element arr[${n.join("][")}] should be a primitive, but is an array of ${e.length} elements`),F(e.length===t[0],()=>`Element arr[${n.join("][")}] should have ${t[0]} elements, but has ${e.length} elements`);let a=t.slice(1);for(let r=0;r=0&&(r=a),Qx(a,r,t,n),e==null||!nn(e)&&!Array.isArray(e)&&typeof e!="number"&&typeof e!="boolean"&&typeof e!="string"){let o=e==null?"null":e.constructor.name;throw new Error(`Argument '${t}' passed to '${n}' must be a Tensor or TensorLike, but got '${o}'`)}let s=Oa(e,r);!nn(e)&&!Array.isArray(e)&&(e=[e]);let i=r!=="string"?hc(e,r):os(e,[],!0);return D.makeTensor(i,s,r)}function Gu(e,t,n,a="numeric"){if(!Array.isArray(e))throw new Error(`Argument ${t} passed to ${n} must be a \`Tensor[]\` or \`TensorLike[]\``);return e.map((r,s)=>M(r,`${t}[${s}]`,n,a))}var eb="__op";function z(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],a=e[n];n.endsWith("_")&&(n=n.substring(0,n.length-1)),n=n+eb;let r=(...s)=>{D.startScope(n);try{let i=a(...s);return km(i)&&console.error("Cannot return a Promise inside of tidy."),D.endScope(i),i}catch(i){throw D.endScope(null),i}};return Object.defineProperty(r,"name",{value:n,configurable:!0}),r}function kS(e,t){let n=M(e,"real","complex"),a=M(t,"imag","complex");on(n.shape,a.shape,`real and imag shapes, ${n.shape} and ${a.shape}, must match in call to tf.complex().`);let r={real:n,imag:a};return D.runKernel(_p,r)}var Rr=z({complex_:kS});function Mr(e,t,n,a){if(a==null&&(a=Mp(e)),a==="complex64")throw new Error("Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).");if(!nn(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){wm(t);let r=Nt(t),s=Nt(n);F(r===s,()=>`Based on the provided shape, [${t}], the tensor should have ${r} values but has ${s}`);for(let i=0;i`Error creating a new Tensor. Inferred shape (${n}) does not match the provided shape (${t}). `)}}return!nn(e)&&!Array.isArray(e)&&(e=[e]),t=t||n,e=a!=="string"?hc(e,a):os(e,[],!0),D.makeTensor(e,t,a)}function ua(e,t,n){let a=Oa(e,n);return Mr(e,t,a,n)}var Om={float32:4,float16:2,int32:4,uint16:2,uint8:1,bool:1,complex64:8},yc=4;async function IS(e,t){let n=[],a=[],r=Array.isArray(e)?e.map(i=>i.name):Object.keys(e);for(let i=0;i{let c=await l.bytes(),h=c.reduce((A,y)=>A+y.length,0)+yc*c.length,m=new Uint8Array(h),f=0;for(let A=0;A{if(t+=s.byteLength,n.push(s.byteLength===s.buffer.byteLength?s:new s.constructor(s)),!(s instanceof Float32Array||s instanceof Int32Array||s instanceof Uint8Array))throw new Error(`Unsupported TypedArray subtype: ${s.constructor.name}`)});let a=new Uint8Array(t),r=0;return n.forEach(s=>{a.set(new Uint8Array(s.buffer),r),r+=s.byteLength}),a.buffer}var _m=typeof Buffer!="undefined"&&(typeof Blob=="undefined"||typeof atob=="undefined"||typeof btoa=="undefined");function nb(e){return _m?Buffer.byteLength(e):new Blob([e]).size}function NS(e){if(_m)return Buffer.from(e).toString("base64");let t=new Uint8Array(e),n="";for(let a=0,r=t.length;a{t+=r.byteLength});let n=new Uint8Array(t),a=0;return e.forEach(r=>{n.set(new Uint8Array(r),a),a+=r.byteLength}),n.buffer}function ab(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 qu(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:nb(JSON.stringify(e.modelTopology)),weightSpecsBytes:e.weightSpecs==null?0:nb(JSON.stringify(e.weightSpecs)),weightDataBytes:e.weightData==null?0:e.weightData.byteLength}}function ES(){let e=n=>{let a=n<<13,r=0;for(;(a&8388608)==0;)r-=8388608,a<<=1;return a&=~8388608,r+=947912704,a|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 CS(){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 RS(){let e=new Uint32Array(64);for(let t=0;t<64;t++)e[t]=1024;return e[0]=e[32]=0,e}function MS(){let e=ES(),t=CS(),n=RS();return a=>{let r=new ArrayBuffer(4*a.length),s=new Uint32Array(r);for(let i=0;i>10]+(o&1023)]+t[o>>10];s[i]=l}return new Float32Array(r)}}var St=class{constructor(){this.saveRouters=[],this.loadRouters=[]}static getInstance(){return St.instance==null&&(St.instance=new St),St.instance}static registerSaveRouter(e){St.getInstance().saveRouters.push(e)}static registerLoadRouter(e){St.getInstance().loadRouters.push(e)}static getSaveHandlers(e){return St.getHandlers(e,"save")}static getLoadHandlers(e,t){return St.getHandlers(e,"load",t)}static getHandlers(e,t,n){let a=[];return(t==="load"?St.getInstance().loadRouters:St.getInstance().saveRouters).forEach(r=>{let s=r(e,n);s!==null&&a.push(s)}),a}},FS=e=>St.registerSaveRouter(e),$S=e=>St.registerLoadRouter(e),DS=e=>St.getSaveHandlers(e),zS=(e,t)=>St.getLoadHandlers(e,t),Lm="tensorflowjs",Wm=1,ii="models_store",Fr="model_info_store";function rb(){if(!J().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 Bm(e){let t=e.result;t.createObjectStore(ii,{keyPath:"modelPath"}),t.createObjectStore(Fr,{keyPath:"modelPath"})}var oi=class{constructor(e){if(this.indexedDB=rb(),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,a)=>{let r=this.indexedDB.open(Lm,Wm);r.onupgradeneeded=()=>Bm(r),r.onsuccess=()=>{let s=r.result;if(t==null){let i=s.transaction(ii,"readonly"),o=i.objectStore(ii).get(this.modelPath);o.onsuccess=()=>{if(o.result==null)return s.close(),a(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`));n(o.result.modelArtifacts)},o.onerror=l=>(s.close(),a(o.error)),i.oncomplete=()=>s.close()}else{let i=qu(t),o=s.transaction(Fr,"readwrite"),l=o.objectStore(Fr),u=l.put({modelPath:this.modelPath,modelArtifactsInfo:i}),d;u.onsuccess=()=>{d=s.transaction(ii,"readwrite");let p=d.objectStore(ii).put({modelPath:this.modelPath,modelArtifacts:t,modelArtifactsInfo:i});p.onsuccess=()=>n({modelArtifactsInfo:i}),p.onerror=c=>{l=o.objectStore(Fr);let h=l.delete(this.modelPath);h.onsuccess=()=>(s.close(),a(p.error)),h.onerror=m=>(s.close(),a(p.error))}},u.onerror=p=>(s.close(),a(u.error)),o.oncomplete=()=>{d==null?s.close():d.oncomplete=()=>s.close()}}},r.onerror=s=>a(r.error)})}};oi.URL_SCHEME="indexeddb://";var sb=e=>J().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(oi.URL_SCHEME)?OS(e.slice(oi.URL_SCHEME.length)):null;St.registerSaveRouter(sb);St.registerLoadRouter(sb);function OS(e){return new oi(e)}function _S(e){return e.startsWith(oi.URL_SCHEME)?e.slice(oi.URL_SCHEME.length):e}var PS=class{constructor(){this.indexedDB=rb()}async listModels(){return new Promise((e,t)=>{let n=this.indexedDB.open(Lm,Wm);n.onupgradeneeded=()=>Bm(n),n.onsuccess=()=>{let a=n.result,r=a.transaction(Fr,"readonly"),s=r.objectStore(Fr).getAll();s.onsuccess=()=>{let i={};for(let o of s.result)i[o.modelPath]=o.modelArtifactsInfo;e(i)},s.onerror=i=>(a.close(),t(s.error)),r.oncomplete=()=>a.close()},n.onerror=a=>t(n.error)})}async removeModel(e){return e=_S(e),new Promise((t,n)=>{let a=this.indexedDB.open(Lm,Wm);a.onupgradeneeded=()=>Bm(a),a.onsuccess=()=>{let r=a.result,s=r.transaction(Fr,"readwrite"),i=s.objectStore(Fr),o=i.get(e),l;o.onsuccess=()=>{if(o.result==null)return r.close(),n(new Error(`Cannot find model with path '${e}' in IndexedDB.`));{let u=i.delete(e),d=()=>{l=r.transaction(ii,"readwrite");let p=l.objectStore(ii).delete(e);p.onsuccess=()=>t(o.result.modelArtifactsInfo),p.onerror=c=>n(o.error)};u.onsuccess=d,u.onerror=p=>(d(),r.close(),n(o.error))}},o.onerror=u=>(r.close(),n(o.error)),s.oncomplete=()=>{l==null?r.close():l.oncomplete=()=>r.close()}},a.onerror=r=>n(a.error)})}},rr="/",ll="tensorflowjs_models",ib="info",LS="model_topology",WS="weight_specs",BS="weight_data",VS="model_metadata";function ob(e){return{info:[ll,e,ib].join(rr),topology:[ll,e,LS].join(rr),weightSpecs:[ll,e,WS].join(rr),weightData:[ll,e,BS].join(rr),modelMetadata:[ll,e,VS].join(rr)}}function jS(e){let t=e.split(rr);if(t.length<3)throw new Error(`Invalid key format: ${e}`);return t.slice(1,t.length-1).join(rr)}function US(e){return e.startsWith(li.URL_SCHEME)?e.slice(li.URL_SCHEME.length):e}var li=class{constructor(e){if(!J().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=ob(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),a=qu(e);try{this.LS.setItem(this.keys.info,JSON.stringify(a)),this.LS.setItem(this.keys.topology,t),this.LS.setItem(this.keys.weightSpecs,n),this.LS.setItem(this.keys.weightData,NS(e.weightData));let r={format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy};return e.signature!=null&&(r.signature=e.signature),e.userDefinedMetadata!=null&&(r.userDefinedMetadata=e.userDefinedMetadata),e.modelInitializer!=null&&(r.modelInitializer=e.modelInitializer),this.LS.setItem(this.keys.modelMetadata,JSON.stringify(r)),{modelArtifactsInfo:a}}catch(r){throw this.LS.removeItem(this.keys.info),this.LS.removeItem(this.keys.topology),this.LS.removeItem(this.keys.weightSpecs),this.LS.removeItem(this.keys.weightData),this.LS.removeItem(this.keys.modelMetadata),new Error(`Failed to save model '${this.modelPath}' to local storage: size quota being exceeded is a possible cause of this failure: modelTopologyBytes=${a.modelTopologyBytes}, weightSpecsBytes=${a.weightSpecsBytes}, weightDataBytes=${a.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 a=JSON.parse(this.LS.getItem(this.keys.weightSpecs));if(a==null)throw new Error(`In local storage, the weight specs of model '${this.modelPath}' are missing.`);t.weightSpecs=a;let r=this.LS.getItem(this.keys.modelMetadata);if(r!=null){let i=JSON.parse(r);t.format=i.format,t.generatedBy=i.generatedBy,t.convertedBy=i.convertedBy,i.signature!=null&&(t.signature=i.signature),i.userDefinedMetadata!=null&&(t.userDefinedMetadata=i.userDefinedMetadata),i.modelInitializer!=null&&(t.modelInitializer=i.modelInitializer)}let s=this.LS.getItem(this.keys.weightData);if(s==null)throw new Error(`In local storage, the binary weight values of model '${this.modelPath}' are missing.`);return t.weightData=TS(s),t}};li.URL_SCHEME="localstorage://";var lb=e=>J().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(li.URL_SCHEME)?HS(e.slice(li.URL_SCHEME.length)):null;St.registerSaveRouter(lb);St.registerLoadRouter(lb);function HS(e){return new li(e)}var GS=class{constructor(){F(J().getBool("IS_BROWSER"),()=>"Current environment is not a web browser"),F(typeof window=="undefined"||typeof window.localStorage!="undefined",()=>"Current browser does not appear to support localStorage"),this.LS=window.localStorage}async listModels(){let e={},t=ll+rr,n=rr+ib;for(let a=0;a"scheme must not be undefined or null."),e.endsWith(ul)&&(e=e.slice(0,e.indexOf(ul))),F(e.length>0,()=>"scheme must not be an empty string.");let n=Kn.getInstance();F(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 gc(e){if(e.indexOf(ul)===-1)throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${Kn.getSchemes().join(",")}`);return{scheme:e.split(ul)[0],path:e.split(ul)[1]}}async function ub(e,t,n=!1){F(e!==t,()=>`Old path and new path are the same: '${e}'`);let a=St.getLoadHandlers(e);F(a.length>0,()=>`Copying failed because no load handler is found for source URL ${e}.`),F(a.length<2,()=>`Copying failed because more than one (${a.length}) load handlers for source URL ${e}.`);let r=a[0],s=St.getSaveHandlers(t);F(s.length>0,()=>`Copying failed because no save handler is found for destination URL ${t}.`),F(s.length<2,()=>`Copying failed because more than one (${a.length}) save handlers for destination URL ${t}.`);let i=s[0],o=gc(e).scheme,l=gc(e).path,u=o===gc(e).scheme,d=await r.load();n&&u&&await Kn.getManager(o).removeModel(l);let p=await i.save(d);return n&&!u&&await Kn.getManager(o).removeModel(l),p.modelArtifactsInfo}async function qS(){let e=Kn.getSchemes(),t={};for(let n of e){let a=await Kn.getManager(n).listModels();for(let r in a){let s=n+ul+r;t[s]=a[r]}}return t}async function XS(e){let t=gc(e);return Kn.getManager(t.scheme).removeModel(t.path)}async function KS(e,t){return ub(e,t,!1)}async function ZS(e,t){return ub(e,t,!0)}var YS=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(J().get("IS_BROWSER")){J().setPlatform("browser",new YS);try{Kn.registerManager(li.URL_SCHEME,new GS)}catch(e){}try{Kn.registerManager(oi.URL_SCHEME,new PS)}catch(e){}}var JS={importFetch:()=>sI()},Vm,QS=class{constructor(){this.util=Qi("util"),this.textEncoder=new this.util.TextEncoder}fetch(e,t){return J().global.fetch!=null?J().global.fetch(e,t):(Vm==null&&(Vm=JS.importFetch()),Vm(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)}};J().get("IS_NODE")&&J().setPlatform("node",new QS);function We(e,t="float32",n){return t=t||"float32",wm(e),new Ot(e,t,n)}function eN(e,t){let n=M(e,"x","cast");if(!Dx(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 a={x:n},r={dtype:t};return D.runKernel(cs,a,r)}var fe=z({cast_:eN});function tN(e){let t={x:M(e,"x","clone","string_or_numeric")};return D.runKernel(Ss,t)}var _a=z({clone_:tN});function db(e,t=!1){console.log(e.toString(t))}Zx();var nN={buffer:We,cast:fe,clone:_a,print:db};fS(nN);var kn={};Fe(kn,{browserFiles:()=>uN,browserHTTPRequest:()=>fN,concatenateArrayBuffers:()=>Pm,copyModel:()=>KS,decodeWeights:()=>tb,encodeWeights:()=>IS,fromMemory:()=>AN,getLoadHandlers:()=>zS,getModelArtifactsInfoForJSON:()=>qu,getSaveHandlers:()=>DS,http:()=>Hm,isHTTPScheme:()=>Um,listModels:()=>qS,loadWeights:()=>dN,moveModel:()=>ZS,registerLoadRouter:()=>$S,registerSaveRouter:()=>FS,removeModel:()=>XS,weightsLoaderFactory:()=>fb,withSaveHandler:()=>yN});var aN="model",rN=".json",sN=".weights.bin";function pb(e){return new Promise(t=>setTimeout(t)).then(e)}var dl=class{constructor(e){if(!J().getBool("IS_BROWSER"))throw new Error("browserDownloads() cannot proceed because the current environment is not a browser.");e.startsWith(dl.URL_SCHEME)&&(e=e.slice(dl.URL_SCHEME.length)),(e==null||e.length===0)&&(e=aN),this.modelTopologyFileName=e+rN,this.weightDataFileName=e+sN}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}],a={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,weightsManifest:n};e.signature!=null&&(a.signature=e.signature),e.userDefinedMetadata!=null&&(a.userDefinedMetadata=e.userDefinedMetadata),e.modelInitializer!=null&&(a.modelInitializer=e.modelInitializer);let r=window.URL.createObjectURL(new Blob([JSON.stringify(a)],{type:"application/json"})),s=this.jsonAnchor==null?document.createElement("a"):this.jsonAnchor;if(s.download=this.modelTopologyFileName,s.href=r,await pb(()=>s.dispatchEvent(new MouseEvent("click"))),e.weightData!=null){let i=this.weightDataAnchor==null?document.createElement("a"):this.weightDataAnchor;i.download=this.weightDataFileName,i.href=t,await pb(()=>i.dispatchEvent(new MouseEvent("click")))}return{modelArtifactsInfo:qu(e)}}}};dl.URL_SCHEME="downloads://";var iN=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.files=e}async load(){let e=this.files[0],t=this.files.slice(1);return new Promise((n,a)=>{let r=new FileReader;r.onload=s=>{let i=JSON.parse(s.target.result),o=i.modelTopology;if(o==null){a(new Error(`modelTopology field is missing from file ${e.name}`));return}t.length===0&&n({modelTopology:o});let l=i.weightsManifest;if(l==null){a(new Error(`weightManifest field is missing from file ${e.name}`));return}let u;try{u=this.checkManifestAndWeightFiles(l,t)}catch(h){a(h);return}let d=[],p=[],c=[];l.forEach(h=>{h.paths.forEach(m=>{p.push(m),c.push(null)}),d.push(...h.weights)}),l.forEach(h=>{h.paths.forEach(m=>{let f=new FileReader;f.onload=A=>{let y=A.target.result,g=p.indexOf(m);if(c[g]=y,c.indexOf(null)===-1){let x={modelTopology:o,weightSpecs:d,weightData:Pm(c),format:i.format,generatedBy:i.generatedBy,convertedBy:i.convertedBy};i.signature!=null&&(x.signature=i.signature),i.userDefinedMetadata!=null&&(x.userDefinedMetadata=i.userDefinedMetadata),i.modelInitializer!=null&&(x.modelInitializer=i.modelInitializer),n(x)}},f.onerror=A=>a(`Failed to weights data from file of path '${m}'.`),f.readAsArrayBuffer(u[m])})})},r.onerror=s=>a(`Failed to read model topology and weights manifest JSON from file '${e.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`),r.readAsText(e)})}checkManifestAndWeightFiles(e,t){let n=[],a=t.map(s=>ab(s.name)),r={};for(let s of e)s.paths.forEach(i=>{let o=ab(i);if(n.indexOf(o)!==-1)throw new Error(`Duplicate file basename found in weights manifest: '${o}'`);if(n.push(o),a.indexOf(o)===-1)throw new Error(`Weight file with basename '${o}' is not provided.`);r[i]=t[a.indexOf(o)]});if(n.length!==t.length)throw new Error(`Mismatch in the number of files in weights manifest (${n.length}) and the number of weight files provided (${t.length}).`);return r}},oN=e=>J().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(dl.URL_SCHEME)?lN(e.slice(dl.URL_SCHEME.length)):null;St.registerSaveRouter(oN);function lN(e="model"){return new dl(e)}function uN(e){return new iN(e)}function cb(e,t,n,a){i(e),n=n==null?0:n,a=a==null?1:a,o(n,a);let r=0,s=l=>(l.then(u=>{let d=n+ ++r/e.length*(a-n);return t(d),u}),l);function i(l){F(l!=null&&Array.isArray(l)&&l.length>0,()=>"promises must be a none empty array")}function o(l,u){F(l>=0&&l<=1,()=>`Progress fraction must be in range [0, 1], but got startFraction ${l}`),F(u>=0&&u<=1,()=>`Progress fraction must be in range [0, 1], but got endFraction ${u}`),F(u>=l,()=>`startFraction must be no more than endFraction, but got startFraction ${l} and endFraction ${u}`)}return Promise.all(e.map(s))}async function hb(e,t){t==null&&(t={});let n=t.fetchFunc==null?J().platform.fetch:t.fetchFunc,a=e.map(u=>n(u,t.requestInit,{isBinary:!0})),r=0,s=.5,i=(t.onProgress==null?await Promise.all(a):await cb(a,t.onProgress,r,s)).map(u=>u.arrayBuffer()),o=.5,l=1;return t.onProgress==null?await Promise.all(i):await cb(i,t.onProgress,o,l)}async function dN(e,t="",n,a){return fb(r=>hb(r,{requestInit:a}))(e,t,n)}function fb(e){return async(t,n="",a)=>{let r=t.map(()=>!1),s={},i=a!=null?a.map(()=>!1):[],o=[];if(t.forEach((h,m)=>{let f=0;h.weights.forEach(A=>{let y="quantization"in A?A.quantization.dtype:A.dtype,g=Om[y]*Nt(A.shape),x=()=>{r[m]=!0,s[m]==null&&(s[m]=[]),s[m].push({manifestEntry:A,groupOffset:f,sizeBytes:g})};a!=null?a.forEach((w,b)=>{w===A.name&&(x(),i[b]=!0)}):x(),o.push(A.name),f+=g})}),!i.every(h=>h)){let h=a.filter((m,f)=>!i[f]);throw new Error(`Could not find weights in manifest with names: ${h.join(", ")}. -Manifest JSON has weights with names: ${o.join(", ")}.`)}let l=r.reduce((h,m,f)=>(m&&h.push(f),h),[]),u=[];l.forEach(h=>{t[h].paths.forEach(m=>{let f=n+(n.endsWith("/")?"":"/")+m;u.push(f)})});let d=await e(u),p={},c=0;return l.forEach(h=>{let m=t[h].paths.length,f=0;for(let x=0;x{let w=A.slice(x.groupOffset,x.groupOffset+x.sizeBytes),b=tb(w,[x.manifestEntry]);for(let v in b)p[v]=b[v]}),c+=m}),p}}var pN="application/octet-stream",cN="application/json",jm=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?(F(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=J().platform.fetch,F(e!=null&&e.length>0,()=>"URL path for http must not be null, undefined or empty."),Array.isArray(e)&&F(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}],a={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,weightsManifest:n};e.signature!=null&&(a.signature=e.signature),e.userDefinedMetadata!=null&&(a.userDefinedMetadata=e.userDefinedMetadata),e.modelInitializer!=null&&(a.modelInitializer=e.modelInitializer),t.body.append("model.json",new Blob([JSON.stringify(a)],{type:cN}),"model.json"),e.weightData!=null&&t.body.append("model.weights.bin",new Blob([e.weightData],{type:pN}),"model.weights.bin");let r=await this.fetch(this.path,t);if(r.ok)return{modelArtifactsInfo:qu(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(h){let m=`Failed to parse model JSON of response from ${this.path}.`;throw this.path.endsWith(".pb")?m+=" 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.":m+=" Please make sure the server is serving valid JSON for this request.",new Error(m)}let n=t.modelTopology,a=t.weightsManifest,r=t.generatedBy,s=t.convertedBy,i=t.format,o=t.signature,l=t.userDefinedMetadata;if(n==null&&a==null)throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`);let u,d;a!=null&&([u,d]=await this.loadWeights(a));let p={modelTopology:n,weightSpecs:u,weightData:d,generatedBy:r,convertedBy:s,format:i};o!=null&&(p.signature=o),l!=null&&(p.userDefinedMetadata=l);let c=t.modelInitializer;return c&&(p.modelInitializer=c),p}async loadWeights(e){let t=Array.isArray(this.path)?this.path[1]:this.path,[n,a]=hN(t),r=this.weightPathPrefix||n,s=[];for(let u of e)s.push(...u.weights);let i=[],o=[];for(let u of e)for(let d of u.paths)this.weightUrlConverter!=null?o.push(this.weightUrlConverter(d)):i.push(r+d+a);this.weightUrlConverter&&i.push(...await Promise.all(o));let l=await hb(i,{requestInit:this.requestInit,fetchFunc:this.fetch,onProgress:this.onProgress});return[s,Pm(l)]}};jm.URL_SCHEME_REGEX=/^https?:\/\//;function hN(e){let t=e.lastIndexOf("/"),n=e.lastIndexOf("?"),a=e.substring(0,t),r=n>t?e.substring(n):"";return[a+"/",r]}function Um(e){return e.match(jm.URL_SCHEME_REGEX)!=null}var mb=(e,t)=>{if(typeof fetch=="undefined"&&(t==null||t.fetchFunc==null))return null;{let n=!0;if(Array.isArray(e)?n=e.every(a=>Um(a)):n=Um(e),n)return Hm(e,t)}return null};St.registerSaveRouter(mb);St.registerLoadRouter(mb);function Hm(e,t){return new jm(e,t)}function fN(e,t){return Hm(e,t)}var Gm=class{constructor(e){this.modelArtifacts=e}async load(){return this.modelArtifacts}},mN=class{constructor(e){this.saveHandler=e}async save(e){return this.saveHandler(e)}};function AN(e,t,n,a){return arguments.length===1?e.modelTopology!=null||e.weightSpecs!=null?new Gm(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 Gm({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 Gm({modelTopology:e,weightSpecs:t,weightData:n,trainingConfig:a}))}function yN(e){return new mN(e)}var Ab={};Fe(Ab,{confusionMatrix:()=>wN});function gN(e,t,n=!1,a=!1){let r=M(e,"a","matMul"),s=M(t,"b","matMul");[r,s]=bt(r,s);let i={a:r,b:s},o={transposeA:n,transposeB:a};return D.runKernel(ps,i,o)}var Be=z({matMul_:gN});function xN(e,t,n=1,a=0){if(t<2)throw new Error(`Error in oneHot: depth must be >=2, but it is ${t}`);let r={indices:M(e,"indices","oneHot","int32")},s={depth:t,onValue:n,offValue:a};return D.runKernel(Os,r,s)}var pl=z({oneHot_:xN});function bN(e,t){let n=M(e,"x","transpose");if(t==null&&(t=n.shape.map((s,i)=>i).reverse()),F(n.rank===t.length,()=>`Error in transpose: rank of input ${n.rank} must match length of perm ${t}.`),t.forEach(s=>{F(s>=0&&s`All entries in 'perm' must be between 0 and ${n.rank-1} but got ${t}`)}),n.rank<=1)return n.clone();let a={x:n},r={perm:t};return D.runKernel(ti,a,r)}var Ye=z({transpose_:bN});function vN(e,t,n){let a=M(e,"labels","confusionMatrix"),r=M(t,"predictions","confusionMatrix");F(n==null||n>0&&Number.isInteger(n),()=>`If provided, numClasses must be a positive integer, but got ${n}`),F(a.rank===1,()=>`Expected the rank of labels to be 1, but got ${a.rank}`),F(r.rank===1,()=>`Expected the rank of predictions to be 1, but got ${r.rank}`),F(a.shape[0]===r.shape[0],()=>`Mismatch in the number of examples: ${a.shape[0]} vs. ${r.shape[0]}. Labels and predictions should have the same number of elements.`),F(n>0&&Number.isInteger(n),()=>`numClasses is required to be a positive integer, but got ${n}`);let s=pl(fe(a,"int32"),n),i=pl(fe(r,"int32"),n),o=Ye(s),l=Be(o,i);return fe(l,"int32")}var wN=z({confusionMatrix_:vN}),ui={};Fe(ui,{fromPixels:()=>CN,fromPixelsAsync:()=>TN,toPixels:()=>EN});function xc(e,t,n){if(is(e),t!=null&&t.length!==3)throw new Error("tensor3d() requires shape to have three numbers");let a=Oa(e,n);if(a.length!==3&&a.length!==1)throw new Error("tensor3d() requires values to be number[][][] or flat/TypedArray");if(a.length===1&&t==null)throw new Error("tensor3d() requires shape to be provided when `values` are a flat array");return Mr(e,t,a,n)}var cl;function yb(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,a=!1,r=!1,s=!1,i=!1,o=!1;if(e.data instanceof Uint8Array)n=!0;else if(typeof ImageData!="undefined"&&e instanceof ImageData)a=!0;else if(typeof HTMLVideoElement!="undefined"&&e instanceof HTMLVideoElement)r=!0;else if(typeof HTMLImageElement!="undefined"&&e instanceof HTMLImageElement)s=!0;else if(e.getContext!=null)i=!0;else if(typeof ImageBitmap!="undefined"&&e instanceof ImageBitmap)o=!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 c=2;if(r&&e.readyState element.")}if(cc(pc,D.backendName)!=null){let c={pixels:e},h={numChannels:t};return D.runKernel(pc,c,h)}let[l,u]=r?[e.videoWidth,e.videoHeight]:[e.width,e.height],d;i?d=e.getContext("2d").getImageData(0,0,l,u).data:a||n?d=e.data:(s||r||o)&&(cl==null&&(cl=document.createElement("canvas").getContext("2d")),cl.canvas.width=l,cl.canvas.height=u,cl.drawImage(e,0,0,l,u),d=cl.getImageData(0,0,l,u).data);let p;if(t===4)p=new Int32Array(d);else{let c=l*u;p=new Int32Array(c*t);for(let h=0;h4||s===2)throw new Error(`toPixels only supports depth of size 1, 3 or 4 but got ${s}`);if(n.dtype!=="float32"&&n.dtype!=="int32")throw new Error(`Unsupported type for toPixels: ${n.dtype}. Please use float32 or int32 tensors.`);let i=await n.data(),o=n.dtype==="float32"?255:1,l=new Uint8ClampedArray(r*a*4);for(let u=0;u1)throw new Error(`Tensor values for a float32 Tensor must be in the range [0 - 1] but encountered ${h}.`)}else if(n.dtype==="int32"&&(h<0||h>255))throw new Error(`Tensor values for a int32 Tensor must be in the range [0 - 255] but encountered ${h}.`);s===1?(d[0]=h*o,d[1]=h*o,d[2]=h*o):d[c]=h*o}let p=u*4;l[p+0]=Math.round(d[0]),l[p+1]=Math.round(d[1]),l[p+2]=Math.round(d[2]),l[p+3]=Math.round(d[3])}if(t!=null){t.width=r,t.height=a;let u=t.getContext("2d"),d=new ImageData(l,r,a);u.putImageData(d,0,0)}return n!==e&&n.dispose(),l}var CN=z({fromPixels_:yb}),qm={};Fe(qm,{prepareAndValidate:()=>gb});function gb(e,t){let n=e.shape.length,a=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(a<1)throw new Error(`tf.gatherND() expects the indices to be rank 1 or higher, but the rank was ${a}.`);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[a-1]>n)throw new Error(`index innermost dimension length must be <= tensor rank; saw: ${t.shape[a-1]} vs. ${n}`);if(Nt(e.shape)===0)throw new Error(`Requested more than 0 entries, but input is empty. Input shape: ${e.shape}.`);let r=t.shape,s=r[r.length-1],i=1;for(let p=0;pp/u),1].slice(0,s);return[l,i,u,d]}var Xm={};Fe(Xm,{calculateShapes:()=>xb,validateInput:()=>Zm,validateUpdateShape:()=>Km});function Km(e,t,n){let a=t.rank>1?t.shape[t.rank-1]:1,r=t.rank>1?t.rank-1:1,s=`Must have updates.shape = indices.shape[:batchDim] + shape[sliceDim:], got updates.shape: ${n.shape}, indices.shape: ${t.shape}, shape: ${e}, sliceDim: ${a}, and batchDim: ${r}.`;if(n.rank1?t.shape[a-1]:1,s=n.length,i=1;for(let p=r;pRN,computeFlatOffset:()=>FN,computeOutShape:()=>bb,getNormalizedAxes:()=>Ib,isSliceContinous:()=>MN,maskToAxes:()=>bc,parseSliceParams:()=>Rb,sliceInfo:()=>$N,startForAxis:()=>Eb,startIndicesWithElidedDims:()=>Sb,stopForAxis:()=>Cb,stopIndicesWithElidedDims:()=>Nb,stridesForAxis:()=>Tb,stridesWithElidedDims:()=>vb});function RN(e,t,n){let a=e.shape.length;F(a===t.length,()=>`Error in slice${a}D: Length of begin ${t} must match the rank of the array (${a}).`),F(a===n.length,()=>`Error in slice${a}D: Length of size ${n} must match the rank of the array (${a}).`);for(let r=0;r`Error in slice${a}D: begin[${r}] + size[${r}] (${t[r]+n[r]}) would overflow input.shape[${r}] (${e.shape[r]})`)}function bc(e){let t=[],n=0;for(;e>0;)e&1&&t.push(n),e/=2,n++;return t}function bb(e,t,n){let a=[];for(let r=0;r0){let h=t[0],m=n+1;d=Sb(i,h,m,a,e),p=Nb(o,h,m,r,e),c=vb(s,h,m,e)}else for(let h=0;h-1)s[o]=0;else{let l=wb(t,n,o),u=a[l];e&1<-1)s[o]=Number.MAX_SAFE_INTEGER;else{let l=wb(t,n,o),u=a[l];e&1<0?i=Number.MIN_SAFE_INTEGER:i=Number.MAX_SAFE_INTEGER);let l=a[r];return i<0&&(i+=l),i=xu(0,i,l-1),i}function Cb(e,t,n,a,r,s){let i=t[r],o=n[r]||1;(e&1<0?i=Number.MAX_SAFE_INTEGER:i=Number.MIN_SAFE_INTEGER);let l=a[r];return i<0&&(i+=l),o>0?i=xu(0,i,l):i=xu(-1,i,l-1),i}function MN(e,t,n){let a=n.length;for(let r=0;r1){a=r;break}for(let r=a+1;r0||n[r]!==e[r])return!1;return!0}function FN(e,t){let n=e.length>0?e[e.length-1]:1;for(let a=0;a{F(i!==-1,()=>"slice() does not support negative begin indexing.")});let s;return n==null?s=new Array(r).fill(-1):typeof n=="number"?s=[n,...new Array(r-1).fill(-1)]:n.lengthi>=0?i:(F(i===-1,()=>`Negative size values should be exactly -1 but got ${i} for the slice() size at index ${o}.`),e.shape[o]-a[o])),[a,s]}function $N(e,t,n,a,r,s,i,o,l){let u=t.slice(),d=n.slice(),p=a;a==null&&(p=new Array(u.length));let c=bc(i);if(c.length>1)throw new Error("Multiple ellipses in slice is not allowed.");if(i!==0&&o!==0)throw new Error("Using both ellipsisMask and newAxisMask is not yet supported.");if(i!==0&&l!==0)throw new Error("Using both ellipsisMask and shrinkAxisMask is not yet supported.");let h=e.length-u.length,m=bc(o),f=e.slice();m.forEach(v=>{u[v]=0,d[v]=1,f.splice(v,0,1)});let{begin:A,end:y,strides:g}=Ib(f,c,h,u,d,p,r,s,i);u=A,d=y,p=g;let x=bc(l);x.forEach(v=>{d[v]=u[v]+1,p[v]=1});let w=bb(u,d,p),b=w.filter((v,N)=>x.indexOf(N)===-1);return{nonStrided:p.every(v=>v===1),$begin:u,$end:d,$strides:p,size:w,newShape:f,outShape:b}}var ae={};Fe(ae,{Serializable:()=>Mb,SerializationMap:()=>di,registerClass:()=>$r});var Mb=class{getClassName(){return this.constructor.className}static fromConfig(e,t){return new e(t)}},di=class{constructor(){this.classNameMap={}}static getMap(){return di.instance==null&&(di.instance=new di),di.instance}static register(e){di.getMap().classNameMap[e.className]=[e,e.fromConfig]}};function $r(e){F(e.className!=null,()=>"Class being registered does not have the static className property defined."),F(typeof e.className=="string",()=>"className is required to be a string, but got type "+typeof e.className),F(e.className.length>0,()=>"Class being registered has an empty-string as its className, which is disallowed."),di.register(e)}var Fb={};Fe(Fb,{TEST_EPSILON_FLOAT16:()=>$b,encodeStrings:()=>Db,expectArrayBuffersEqual:()=>WN,expectArraysClose:()=>zN,expectArraysEqual:()=>_N,expectNumbersClose:()=>PN,expectPromiseToFail:()=>ON,expectValuesInRange:()=>LN,testEpsilon:()=>Ym});var DN=.001,$b=.1;function zN(e,t,n){return n==null&&(n=Ym()),Jm(e,t,(a,r)=>Qm(a,r,n))}function Ym(){return D.backend.floatPrecision()===32?DN:$b}function Jm(e,t,n){let a=!0;if((nn(e)||nn(t))&&(a=!1),nn(e)&&nn(t)&&(a=!0),a){let i=e.constructor.name,o=t.constructor.name;if(i!==o)throw new Error(`Arrays are of different type. Actual: ${i}. Expected: ${o}`)}if(Array.isArray(e)&&Array.isArray(t)){let i=Oa(e),o=Oa(t);if(!ar(i,o))throw new Error(`Arrays have different shapes. Actual: [${i}]. Expected: [${o}]`)}let r=nn(e)?e:os(e),s=nn(t)?t:os(t);if(r.length!==s.length)throw new Error(`Arrays have different lengths actual: ${r.length} vs expected: ${s.length}. -Actual: ${r}. -Expected: ${s}.`);for(let i=0;it.fail(),()=>t())}function _N(e,t){let n=typeof t=="string"||typeof t=="number"||typeof t=="boolean"?[t]:t;return Ir(e)||Ir(e[0])||Ir(t)||Ir(t[0])?Jm(e,n,(a,r)=>a==r):Jm(e,t,(a,r)=>Qm(a,r,0))}function PN(e,t,n){if(n==null&&(n=Ym()),!Qm(e,t,n))throw new Error(`Numbers differ: actual === ${e}, expected === ${t}`)}function Qm(e,t,n){return!isFinite(e)&&!isFinite(t)?!0:!(isNaN(e)||isNaN(t)||Math.abs(e-t)>n)}function LN(e,t,n){for(let a=0;an)throw new Error(`Value out of range:${e[a]} low: ${t}, high: ${n}`)}function WN(e,t){expect(new Float32Array(e)).toEqual(new Float32Array(t))}function Db(e){for(let t=0;tt.dispose())}function Ht(e){return D.keep(e)}function qN(e){return D.time(e)}function XN(e){return D.setBackend(e)}function KN(){return D.ready()}function ZN(){return D.backendName}function YN(e){D.removeBackend(e)}function tA(e){return D.findBackend(e)}function JN(e){return D.findBackendFactory(e)}function hl(e,t,n=1){return D.registerBackend(e,t,n)}function zb(){return D.backend}function QN(e,t){J().setPlatform(e,t)}function eT(e,t){let n=M(e,"a","add"),a=M(t,"b","add");[n,a]=bt(n,a);let r={a:n,b:a};return D.runKernel(Nr,r)}var se=z({add_:eT});function tT(e,t){let n=M(e,"a","floorDiv"),a=M(t,"b","floorDiv");[n,a]=bt(n,a);let r={a:n,b:a};return D.runKernel(ws,r)}var wc=z({floorDiv_:tT});function nT(e,t){let n=M(e,"a","div"),a=M(t,"b","div");if([n,a]=bt(n,a),n.dtype==="int32"&&a.dtype==="int32")return wc(n,a);let r={a:n,b:a},s={};return D.runKernel(xs,r,s)}var me=z({div_:nT});function aT(e,t){let n=M(e,"a","mul"),a=M(t,"b","mul");[n,a]=bt(n,a);let r={a:n,b:a};return D.runKernel(zs,r)}var _=z({mul_:aT});function rT(e){let t=M(e,"x","abs");if(t.dtype==="complex64"){let n={x:t};return D.runKernel(Iu,n)}else{let n={x:t};return D.runKernel(ao,n)}}var _t=z({abs_:rT});function sT(e){let t={x:M(e,"x","acos")};return D.runKernel(ro,t)}var nA=z({acos_:sT});function iT(e){let t={x:M(e,"x","acosh")};return D.runKernel(so,t)}var aA=z({acosh_:iT});function oT(e){F(Array.isArray(e),()=>"The argument passed to tf.addN() must be a list of tensors"),F(e.length>=1,()=>`Must pass at least one tensor to tf.addN(), but got ${e.length}`);let t=e.map((r,s)=>M(r,`tensors${s}`,"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(!ar(r.shape,n.shape))throw new Error("All tensors passed to tf.addN() must have the same shape")});let a=t;return D.runKernel(ls,a)}var kc=z({addN_:oT});function lT(e,t=null,n=!1){let a={x:M(e,"x","all","bool")},r={axis:t,keepDims:n};return D.runKernel(io,a,r)}var Ic=z({all_:lT});function uT(e,t=null,n=!1){let a={x:M(e,"x","any","bool")},r={axis:t,keepDims:n};return D.runKernel(oo,a,r)}var Xu=z({any_:uT});function dT(e,t=0){let n={x:M(e,"x","argMax")},a={axis:t};return D.runKernel(us,n,a)}var Ku=z({argMax_:dT});function pT(e,t=0){let n={x:M(e,"x","argMin")},a={axis:t};return D.runKernel(vu,n,a)}var rA=z({argMin_:pT});function cT(e){let t={x:M(e,"x","asin")};return D.runKernel(lo,t)}var sA=z({asin_:cT});function hT(e){let t={x:M(e,"x","asinh")};return D.runKernel(uo,t)}var iA=z({asinh_:hT});function fT(e){let t={x:M(e,"x","atan")};return D.runKernel(po,t)}var oA=z({atan_:fT});function mT(e,t){let n=M(e,"a","atan2"),a=M(t,"b","atan2");[n,a]=bt(n,a);let r={a:n,b:a};return D.runKernel(ho,r)}var lA=z({atan2_:mT});function AT(e){let t={x:M(e,"x","atanh")};return D.runKernel(co,t)}var uA=z({atanh_:AT});function yT(e,t,n,a,r="NHWC",s){let i=e[3],o=[...t,i],l=Pb(r);return Zu(e,o,n,s,a,null,null,l)}function Ob(e,t,n,a,r,s,i="channelsLast"){let[o,l]=Sc(t),u;if(i==="channelsLast")u=[o,l,e[3],e[3]];else if(i==="channelsFirst")u=[o,l,e[1],e[1]];else throw new Error(`Unknown dataFormat ${i}`);return Zu(e,u,n,a,r,s,!1,i)}function gT(e,t,n,a,r,s,i="NDHWC"){let[o,l,u]=pA(t),d,p;if(i==="NDHWC")p="channelsLast",d=[o,l,u,e[4],e[4]];else if(i==="NCDHW")p="channelsFirst",d=[o,l,u,e[1],e[1]];else throw new Error(`Unknown dataFormat ${i}`);return _b(e,d,n,a,r,!1,p,s)}function Zu(e,t,n,a,r,s,i=!1,o="channelsLast"){let[l,u,d,p]=[-1,-1,-1,-1];if(o==="channelsLast")[l,u,d,p]=e;else if(o==="channelsFirst")[l,p,u,d]=e;else throw new Error(`Unknown dataFormat ${o}`);let[c,h,,m]=t,[f,A]=Sc(n),[y,g]=Sc(a),x=fl(c,y),w=fl(h,g),{padInfo:b,outHeight:v,outWidth:N}=vT(r,u,d,f,A,x,w,s,o),T=i?m*p:m,R;return o==="channelsFirst"?R=[l,T,v,N]:o==="channelsLast"&&(R=[l,v,N,T]),{batchSize:l,dataFormat:o,inHeight:u,inWidth:d,inChannels:p,outHeight:v,outWidth:N,outChannels:T,padInfo:b,strideHeight:f,strideWidth:A,filterHeight:c,filterWidth:h,effectiveFilterHeight:x,effectiveFilterWidth:w,dilationHeight:y,dilationWidth:g,inShape:e,outShape:R,filterShape:t}}function _b(e,t,n,a,r,s=!1,i="channelsLast",o){let[l,u,d,p,c]=[-1,-1,-1,-1,-1];if(i==="channelsLast")[l,u,d,p,c]=e;else if(i==="channelsFirst")[l,c,u,d,p]=e;else throw new Error(`Unknown dataFormat ${i}`);let[h,m,f,,A]=t,[y,g,x]=pA(n),[w,b,v]=pA(a),N=fl(h,w),T=fl(m,b),R=fl(f,v),{padInfo:$,outDepth:O,outHeight:P,outWidth:V}=wT(r,u,d,p,y,g,x,N,T,R,o),j=s?A*c:A,U;return i==="channelsFirst"?U=[l,j,O,P,V]:i==="channelsLast"&&(U=[l,O,P,V,j]),{batchSize:l,dataFormat:i,inDepth:u,inHeight:d,inWidth:p,inChannels:c,outDepth:O,outHeight:P,outWidth:V,outChannels:j,padInfo:$,strideDepth:y,strideHeight:g,strideWidth:x,filterDepth:h,filterHeight:m,filterWidth:f,effectiveFilterDepth:N,effectiveFilterHeight:T,effectiveFilterWidth:R,dilationDepth:w,dilationHeight:b,dilationWidth:v,inShape:e,outShape:U,filterShape:t}}function xT(e,t,n,a,r){a==null&&(a=dA(e,t,n));let s=e[0],i=e[1],o=pi((s-t+2*a)/n+1,r),l=pi((i-t+2*a)/n+1,r);return[o,l]}function bT(e,t,n,a,r,s){r==null&&(r=dA(e,t,a));let i=e[0],o=e[1],l=e[2],u=pi((i-t+2*r)/a+1,s),d=pi((o-t+2*r)/a+1,s),p=pi((l-t+2*r)/a+1,s);return[u,d,p,n]}function dA(e,t,n,a=1){let r=fl(t,a);return Math.floor((e[0]*(n-1)-n+r)/2)}function Sc(e){return typeof e=="number"?[e,e,e]:e.length===2?[e[0],e[1],1]:e}function pA(e){return typeof e=="number"?[e,e,e]:e}function fl(e,t){return t<=1?e:e+(e-1)*(t-1)}function vT(e,t,n,a,r,s,i,o,l){let u,d,p;if(typeof e=="number"){u={top:e,bottom:e,left:e,right:e,type:e===0?"VALID":"NUMBER"};let c=xT([t,n],s,a,e,o);d=c[0],p=c[1]}else if(e==="same"){d=Math.ceil(t/a),p=Math.ceil(n/r);let c=Math.max(0,(d-1)*a+s-t),h=Math.max(0,(p-1)*r+i-n),m=Math.floor(c/2),f=c-m,A=Math.floor(h/2),y=h-A;u={top:m,bottom:f,left:A,right:y,type:"SAME"}}else if(e==="valid")u={top:0,bottom:0,left:0,right:0,type:"VALID"},d=Math.ceil((t-s+1)/a),p=Math.ceil((n-i+1)/r);else if(typeof e=="object"){let c=l==="channelsLast"?e[1][0]:e[2][0],h=l==="channelsLast"?e[1][1]:e[2][1],m=l==="channelsLast"?e[2][0]:e[3][0],f=l==="channelsLast"?e[2][1]:e[3][1];u={top:c,bottom:h,left:m,right:f,type:c===0&&h===0&&m===0&&f===0?"VALID":"EXPLICIT"},d=pi((t-s+c+h)/a+1,o),p=pi((n-i+m+f)/r+1,o)}else throw Error(`Unknown padding parameter: ${e}`);return{padInfo:u,outHeight:d,outWidth:p}}function wT(e,t,n,a,r,s,i,o,l,u,d){let p,c,h,m;if(typeof e=="number"){p={top:e,bottom:e,left:e,right:e,front:e,back:e,type:e===0?"VALID":"NUMBER"};let f=bT([t,n,a,1],o,1,r,e,d);c=f[0],h=f[1],m=f[2]}else if(e==="same"){c=Math.ceil(t/r),h=Math.ceil(n/s),m=Math.ceil(a/i);let f=(c-1)*r+o-t,A=(h-1)*s+l-n,y=(m-1)*i+u-a,g=Math.floor(f/2),x=f-g,w=Math.floor(A/2),b=A-w,v=Math.floor(y/2),N=y-v;p={top:w,bottom:b,left:v,right:N,front:g,back:x,type:"SAME"}}else if(e==="valid")p={top:0,bottom:0,left:0,right:0,front:0,back:0,type:"VALID"},c=Math.ceil((t-o+1)/r),h=Math.ceil((n-l+1)/s),m=Math.ceil((a-u+1)/i);else throw Error(`Unknown padding parameter: ${e}`);return{padInfo:p,outDepth:c,outHeight:h,outWidth:m}}function pi(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 Dr(e){let[t,n,a]=Sc(e);return t===1&&n===1&&a===1}function Pa(e,t){return Dr(e)||Dr(t)}function Pb(e){if(e==="NHWC")return"channelsLast";if(e==="NCHW")return"channelsFirst";throw new Error(`Unknown dataFormat ${e}`)}function kT(e,t){let n={x:M(e,"x","reshape","string_or_numeric")},a={shape:t};return D.runKernel(Uo,n,a)}var H=z({reshape_:kT});function IT(e,t,n,a,r){let s=M(e,"x","avgPool","float32"),i=1;F(Pa(n,i),()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${n} and dilations '${i}'`);let o=s,l=!1;s.rank===3&&(l=!0,o=H(s,[1,s.shape[0],s.shape[1],s.shape[2]])),F(o.rank===4,()=>`Error in avgPool: x must be rank 4 but got rank ${o.rank}.`),r!=null&&F(Ut(a),()=>`Error in avgPool: pad must be an integer when using, dimRoundingMode ${r} but got pad ${a}.`);let u={x:o},d={filterSize:t,strides:n,pad:a,dimRoundingMode:r},p=D.runKernel(ds,u,d);return p=fe(p,s.dtype),l?H(p,[p.shape[1],p.shape[2],p.shape[3]]):p}var Yu=z({avgPool_:IT});function ST(e,t,n,a,r,s="NDHWC"){let i=M(e,"x","avgPool3d","float32"),o=i,l=!1;i.rank===4&&(l=!0,o=H(i,[1,i.shape[0],i.shape[1],i.shape[2],i.shape[3]])),F(o.rank===5,()=>`Error in avgPool3d: x must be rank 5 but got rank ${o.rank}.`),F(s==="NDHWC",()=>`Error in avgPool3d: Only NDHWC is currently supported, but got dataFormat of ${s}`),r!=null&&F(Ut(a),()=>`Error in avgPool3d: pad must be an integer when using, dimRoundingMode ${r} but got pad ${a}.`);let u={x:o},d={filterSize:t,strides:n,pad:a,dimRoundingMode:r,dataFormat:s},p=D.runKernel(wu,u,d);return p=fe(p,o.dtype),l?H(p,[p.shape[1],p.shape[2],p.shape[3],p.shape[4]]):p}var cA=z({avgPool3d_:ST});function NT(e,t=0){F(e.length>=1,()=>"Pass at least one tensor to concat");let n=Gu(e,"tensors","concat","string_or_numeric");if(n[0].dtype==="complex64"&&n.forEach(s=>{if(s.dtype!=="complex64")throw new Error(`Cannot concatenate complex64 tensors with a tensor - with dtype ${s.dtype}. `)}),n.length===1)return _a(n[0]);let a=n,r={axis:t};return D.runKernel(fo,a,r)}var ot=z({concat_:NT});function TT(e){let t={x:M(e,"x","sigmoid")};return D.runKernel(qs,t)}var In=z({sigmoid_:TT});function ET(e,t,n){let a=M(e,"x","slice","string_or_numeric");if(a.rank===0)throw new Error("Slicing scalar is not possible");let r={x:a},s={begin:t,size:n};return D.runKernel(Xo,r,s)}var Re=z({slice_:ET});function CT(e){let t={x:M(e,"x","tanh")};return D.runKernel(ei,t)}var ci=z({tanh_:CT});function RT(e,t,n,a,r,s){let i=M(e,"forgetBias","basicLSTMCell"),o=M(t,"lstmKernel","basicLSTMCell"),l=M(n,"lstmBias","basicLSTMCell"),u=M(a,"data","basicLSTMCell"),d=M(r,"c","basicLSTMCell"),p=M(s,"h","basicLSTMCell"),c=ot([u,p],1),h=Be(c,o),m=se(h,l),f=m.shape[0],A=m.shape[1]/4,y=[f,A],g=Re(m,[0,0],y),x=Re(m,[0,A],y),w=Re(m,[0,A*2],y),b=Re(m,[0,A*3],y),v=se(_(In(g),ci(x)),_(d,In(se(i,w)))),N=_(ci(v),In(b));return[v,N]}var MT=z({basicLSTMCell_:RT});function FT(e,t,n){let a=M(e,"x","batchToSpaceND"),r=t.reduce((o,l)=>o*l);F(a.rank>=1+t.length,()=>`input rank is ${a.rank} but should be > than blockShape.length ${t.length}`),F(n.length===t.length,()=>`crops.length is ${n.length} but should be equal to blockShape.length ${t.length}`),F(a.shape[0]%r==0,()=>`input tensor batch is ${a.shape[0]} but is not divisible by the product of the elements of blockShape ${t.join(" * ")} === ${r}`);let s={x:a},i={blockShape:t,crops:n};return D.runKernel(ku,s,i)}var Ju=z({batchToSpaceND_:FT});function $T(e){let t;return e.rank===0||e.rank===1?t=H(e,[1,1,1,e.size]):e.rank===2?t=H(e,[1,1,e.shape[0],e.shape[1]]):e.rank===3?t=H(e,[1,e.shape[0],e.shape[1],e.shape[2]]):t=e,t}function DT(e,t,n,a,r,s){s==null&&(s=.001);let i=M(e,"x","batchNorm"),o=M(t,"mean","batchNorm"),l=M(n,"variance","batchNorm"),u;r!=null&&(u=M(r,"scale","batchNorm"));let d;a!=null&&(d=M(a,"offset","batchNorm")),F(o.rank===l.rank,()=>"Batch normalization gradient requires mean and variance to have equal ranks."),F(d==null||o.rank===d.rank,()=>"Batch normalization gradient requires mean and offset to have equal ranks."),F(u==null||o.rank===u.rank,()=>"Batch normalization gradient requires mean and scale to have equal ranks.");let p={x:$T(i),scale:u,offset:d,mean:o,variance:l},c={varianceEpsilon:s},h=D.runKernel(ks,p,c);return H(h,i.shape)}var hi=z({batchNorm_:DT});function zT(e,t,n,a,r,s){let i=M(e,"x","batchNorm"),o=M(t,"mean","batchNorm"),l=M(n,"variance","batchNorm"),u;r!=null&&(u=M(r,"scale","batchNorm"));let d;return a!=null&&(d=M(a,"offset","batchNorm")),F(i.rank===2,()=>`Error in batchNorm2D: x must be rank 2 but got rank ${i.rank}.`),F(o.rank===2||o.rank===1,()=>`Error in batchNorm2D: mean must be rank 2 or rank 1 but got rank ${o.rank}.`),F(l.rank===2||l.rank===1,()=>`Error in batchNorm2D: variance must be rank 2 or rank 1 but got rank ${l.rank}.`),u!=null&&F(u.rank===2||u.rank===1,()=>`Error in batchNorm2D: scale must be rank 2 or rank 1 but got rank ${u.rank}.`),d!=null&&F(d.rank===2||d.rank===1,()=>`Error in batchNorm2D: offset must be rank 2 or rank 1 but got rank ${d.rank}.`),hi(i,o,l,d,u,s)}var Lb=z({batchNorm2d_:zT});function OT(e,t,n,a,r,s){let i=M(e,"x","batchNorm"),o=M(t,"mean","batchNorm"),l=M(n,"variance","batchNorm"),u;r!=null&&(u=M(r,"scale","batchNorm"));let d;return a!=null&&(d=M(a,"offset","batchNorm")),F(i.rank===3,()=>`Error in batchNorm3D: x must be rank 3 but got rank ${i.rank}.`),F(o.rank===3||o.rank===1,()=>`Error in batchNorm3D: mean must be rank 3 or rank 1 but got rank ${o.rank}.`),F(l.rank===3||l.rank===1,()=>`Error in batchNorm3D: variance must be rank 3 or rank 1 but got rank ${l.rank}.`),u!=null&&F(u.rank===3||u.rank===1,()=>`Error in batchNorm3D: scale must be rank 3 or rank 1 but got rank ${u.rank}.`),d!=null&&F(d.rank===3||d.rank===1,()=>`Error in batchNorm3D: offset must be rank 3 or rank 1 but got rank ${d.rank}.`),hi(i,o,l,d,u,s)}var Wb=z({batchNorm3d_:OT});function _T(e,t,n,a,r,s){let i=M(e,"x","batchNorm"),o=M(t,"mean","batchNorm"),l=M(n,"variance","batchNorm"),u;r!=null&&(u=M(r,"scale","batchNorm"));let d;return a!=null&&(d=M(a,"offset","batchNorm")),F(i.rank===4,()=>`Error in batchNorm4D: x must be rank 4 but got rank ${i.rank}.`),F(o.rank===4||o.rank===1,()=>`Error in batchNorm4D: mean must be rank 4 or rank 1 but got rank ${o.rank}.`),F(l.rank===4||l.rank===1,()=>`Error in batchNorm4D: variance must be rank 4 or rank 1 but got rank ${l.rank}.`),u!=null&&F(u.rank===4||u.rank===1,()=>`Error in batchNorm4D: scale must be rank 4 or rank 1 but got rank ${u.rank}.`),d!=null&&F(d.rank===4||d.rank===1,()=>`Error in batchNorm4D: offset must be rank 4 or rank 1 but got rank ${d.rank}.`),hi(i,o,l,d,u,s)}var Bb=z({batchNorm4d_:_T});function PT(e,t,n){let a=M(e,"x","bincount"),r=M(t,"weights","bincount");F(a.dtype==="int32",()=>`Error in bincount: input dtype must be int32, but got ${a.dtype}`),F(n>=0,()=>`size must be non-negative, but got ${n}.`),F(r.size===a.size||r.size===0,()=>`Error in bincount: weights must have the same size as input or0-length, but got input shape: ${a.shape}, weights shape: ${r.shape}.`);let s={x:a,weights:r},i={size:n};return D.runKernel(Op,s,i)}var hA=z({bincount_:PT});function LT(e,t){let n=M(e,"broadcastTo","x"),a=n.shape;if(t.some(l=>!(l>0)||l%1!=0))throw new Error(`broadcastTo(): Invalid broadcast shape [${t}].`);if(t.lengthn.rank){let l=n.shape.slice();for(;l.length=0;l--)if(r[l]===t[l])s[l]=1;else if(n.shape[l]!==1)throw new Error(`broadcastTo(): [${a}] cannot be broadcast to [${t}].`);if(s.map((l,u)=>l>1?u:-1).filter(l=>l>=0).length===0)return _a(n);let i={x:n},o={reps:s};return D.runKernel(Er,i,o)}var ml=z({broadcastTo_:LT});function WT(e){let t={x:M(e,"x","ceil")};return D.runKernel(hs,t)}var fA=z({ceil_:WT});function BT(e,t,n){let a=M(e,"x","clipByValue");F(t<=n,()=>`Error in clip: min (${t}) must be less than or equal to max (${n}).`);let r={x:a},s={clipValueMin:t,clipValueMax:n};return D.runKernel(Tr,r,s)}var Sn=z({clipByValue_:BT});function VT(e){return ot(e,0)}var Vb=z({concat1d_:VT});function jT(e,t){return ot(e,t)}var Al=z({concat2d_:jT});function UT(e,t){return ot(e,t)}var jb=z({concat3d_:UT});function HT(e,t){return ot(e,t)}var Ub=z({concat4d_:HT});function GT(e,t,n,a,r="NHWC",s=[1,1],i){let o=M(e,"x","conv2d"),l=M(t,"filter","conv2d"),u=o,d=!1;o.rank===3&&(d=!0,u=H(o,[1,o.shape[0],o.shape[1],o.shape[2]])),F(u.rank===4,()=>`Error in conv2d: input must be rank 4, but got rank ${u.rank}.`),F(l.rank===4,()=>`Error in conv2d: filter must be rank 4, but got rank ${l.rank}.`),i!=null&&F(Ut(a),()=>`Error in conv2d: pad must be an integer when using, dimRoundingMode ${i} but got pad ${a}.`);let p=r==="NHWC"?u.shape[3]:u.shape[1];F(p===l.shape[2],()=>`Error in conv2d: depth of input (${p}) must match input depth for filter ${l.shape[2]}.`),F(Pa(n,s),()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`);let c={x:u,filter:l},h={strides:n,pad:a,dataFormat:r,dilations:s,dimRoundingMode:i},m=D.runKernel(fs,c,h);return d?H(m,[m.shape[1],m.shape[2],m.shape[3]]):m}var ir=z({conv2d_:GT});function qT(e,t,n,a,r="NWC",s=1,i){let o=M(e,"x","conv1d"),l=M(t,"filter","conv1d"),u=o,d=!1;o.rank===2&&(d=!0,u=H(o,[1,o.shape[0],o.shape[1]])),F(u.rank===3,()=>`Error in conv1d: input must be rank 3, but got rank ${u.rank}.`),F(l.rank===3,()=>`Error in conv1d: filter must be rank 3, but got rank ${l.rank}.`),i!=null&&F(Ut(a),()=>`Error in conv1d: pad must be an integer when using, dimRoundingMode ${i} but got pad ${a}.`),F(u.shape[2]===l.shape[1],()=>`Error in conv1d: depth of input (${u.shape[2]}) must match input depth for filter ${l.shape[1]}.`),F(Pa(n,s),()=>`Error in conv1D: Either stride or dilation must be 1. Got stride ${n} and dilation '${s}'`),F(r==="NWC",()=>`Error in conv1d: got dataFormat of ${r} but only NWC is currently supported.`);let p=H(l,[1,l.shape[0],l.shape[1],l.shape[2]]),c=H(u,[u.shape[0],1,u.shape[1],u.shape[2]]),h=ir(c,p,[1,n],a,"NHWC",[1,s],i);return d?H(h,[h.shape[2],h.shape[3]]):H(h,[h.shape[0],h.shape[2],h.shape[3]])}var Nc=z({conv1d_:qT});function XT(e,t,n,a,r,s="NHWC",i){F(e.length===t.rank,()=>`Length of inShape (${e.length}) and rank of dy (${t.rank}) must match`);let o=e,l=t,u=!1;t.rank===3&&(u=!0,l=H(t,[1,t.shape[0],t.shape[1],t.shape[2]]),o=[1,e[0],e[1],e[2]]),F(o.length===4,()=>`Error in conv2dDerInput: inShape must be length 4, but got length ${o.length}.`),F(l.rank===4,()=>`Error in conv2dDerInput: dy must be rank 4, but got rank ${l.rank}`),F(n.rank===4,()=>`Error in conv2dDerInput: filter must be rank 4, but got rank ${n.rank}`);let d=s==="NHWC"?o[3]:o[1],p=s==="NHWC"?l.shape[3]:l.shape[1];F(d===n.shape[2],()=>`Error in conv2dDerInput: depth of input (${d}) must match input depth for filter ${n.shape[2]}.`),F(p===n.shape[3],()=>`Error in conv2dDerInput: depth of output (${p}) must match output depth for filter ${n.shape[3]}.`),i!=null&&F(Ut(r),()=>`Error in conv2dDerInput: pad must be an integer when using, dimRoundingMode ${i} but got pad ${r}.`);let c={dy:l,filter:n},h={strides:a,pad:r,dataFormat:s,dimRoundingMode:i,inputShape:o},m=D.runKernel(ms,c,h);return u?H(m,[m.shape[1],m.shape[2],m.shape[3]]):m}var mA=z({conv2DBackpropInput_:XT});function KT(e,t,n,a,r,s){let i=M(e,"x","conv2dTranspose"),o=M(t,"filter","conv2dTranspose");return mA(n,i,o,a,r,"NHWC",s)}var Tc=z({conv2dTranspose_:KT});function ZT(e,t,n,a,r="NDHWC",s=[1,1,1]){let i=M(e,"x","conv3d"),o=M(t,"filter","conv3d"),l=i,u=!1;i.rank===4&&(u=!0,l=H(i,[1,i.shape[0],i.shape[1],i.shape[2],i.shape[3]])),F(l.rank===5,()=>`Error in conv3d: input must be rank 5, but got rank ${l.rank}.`),F(o.rank===5,()=>`Error in conv3d: filter must be rank 5, but got rank ${o.rank}.`),F(l.shape[4]===o.shape[3],()=>`Error in conv3d: depth of input (${l.shape[4]}) must match input depth for filter ${o.shape[3]}.`),F(Pa(n,s),()=>`Error in conv3D: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`),F(r==="NDHWC",()=>`Error in conv3d: got dataFormat of ${r} but only NDHWC is currently supported.`);let d={x:l,filter:o},p={strides:n,pad:a,dataFormat:r,dilations:s},c=D.runKernel(Su,d,p);return u?H(c,[c.shape[1],c.shape[2],c.shape[3],c.shape[4]]):c}var AA=z({conv3d_:ZT});function YT(e,t,n,a,r){F(e.length===t.rank,()=>`Length of inShape (${e.length}) and rank of dy (${t.rank}) must match`);let s=e,i=t,o=!1;t.rank===4&&(o=!0,i=H(t,[1,t.shape[0],t.shape[1],t.shape[2],t.shape[3]]),s=[1,e[0],e[1],e[2],e[3]]);let l=s[4],u=i.shape[4];F(s.length===5,()=>`Error in conv3dDerInput: inShape must be length 5, but got length ${s.length}.`),F(i.rank===5,()=>`Error in conv3dDerInput: dy must be rank 5, but got rank ${i.rank}`),F(n.rank===5,()=>`Error in conv3dDerInput: filter must be rank 5, but got rank ${n.rank}`),F(l===n.shape[3],()=>`Error in conv3dDerInput: depth of input (${l}) must match input depth for filter ${n.shape[3]}.`),F(u===n.shape[4],()=>`Error in conv3dDerInput: depth of output (${u}) must match output depth for filter ${n.shape[4]}.`);let d={dy:i,filter:n},p={pad:r,strides:a,inputShape:s},c=D.runKernel(Wp,d,p);return o?H(c,[c.shape[1],c.shape[2],c.shape[3],c.shape[4]]):c}var Hb=z({conv3DBackpropInput_:YT});function JT(e,t,n,a,r){let s=M(e,"x","conv3dTranspose"),i=M(t,"filter","conv3dTranspose");return Hb(n,s,i,a,r)}var Gb=z({conv3dTranspose_:JT});function QT(e){let t={x:M(e,"x","cos")};return D.runKernel(As,t)}var Qu=z({cos_:QT});function eE(e){let t={x:M(e,"x","cosh")};return D.runKernel(mo,t)}var Ec=z({cosh_:eE});function tE(e,t=0,n=!1,a=!1){let r={x:M(e,"x","cumsum")},s={axis:t,exclusive:n,reverse:a};return D.runKernel(ys,r,s)}var Cc=z({cumsum_:tE});function nE(e,t,n,a=!1){let r=M(e,"x","denseBincount"),s=M(t,"weights","denseBincount");F(r.dtype==="int32",()=>`Error in denseBincount: input dtype must be int32, but got ${r.dtype}`),F(r.rank<=2,()=>`Error in denseBincount: input must be at most rank 2, but got rank ${r.rank}.`),F(n>=0,()=>`size must be non-negative, but got ${n}.`),F(s.size===r.size||s.size===0,()=>`Error in denseBincount: weights must have the same shape as x or 0-length, but got x shape: ${r.shape}, weights shape: ${s.shape}.`);let i={x:r,weights:s},o={size:n,binaryOutput:a};return D.runKernel(Bp,i,o)}var qb=z({denseBincount_:nE});function aE(e,t,n="NHWC"){let a=M(e,"x","depthToSpace"),r=n==="NHWC"?a.shape[1]:a.shape[2],s=n==="NHWC"?a.shape[2]:a.shape[3],i=n==="NHWC"?a.shape[3]:a.shape[1];F(r*t>=0,()=>`Negative dimension size caused by overflow when multiplying - ${r} and ${t} for depthToSpace with input shape - ${a.shape}`),F(s*t>=0,()=>`Negative dimension size caused by overflow when multiplying - ${s} and ${t} for depthToSpace with input shape - ${a.shape}`),F(i%(t*t)==0,()=>`Dimension size must be evenly divisible by ${t*t} but is ${i} for depthToSpace with input shape ${a.shape}`);let o={x:a},l={blockSize:t,dataFormat:n};return D.runKernel(yo,o,l)}var yA=z({depthToSpace_:aE});function rE(e,t,n,a,r="NHWC",s=[1,1],i){let o=M(e,"x","depthwiseConv2d"),l=M(t,"filter","depthwiseConv2d"),u=o,d=!1;o.rank===3&&(d=!0,u=H(o,[1,o.shape[0],o.shape[1],o.shape[2]])),F(u.rank===4,()=>`Error in depthwiseConv2d: input must be rank 4, but got rank ${u.rank}.`),F(l.rank===4,()=>`Error in depthwiseConv2d: filter must be rank 4, but got rank ${l.rank}.`),F(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]}.`),i!=null&&F(Ut(a),()=>`Error in depthwiseConv2d: pad must be an integer when using, dimRoundingMode ${i} but got pad ${a}.`);let p={x:u,filter:l},c={strides:n,pad:a,dataFormat:r,dilations:s,dimRoundingMode:i},h=D.runKernel(gs,p,c);return d?H(h,[h.shape[1],h.shape[2],h.shape[3]]):h}var yl=z({depthwiseConv2d_:rE});function sE(e){let t={x:M(e,"x","diag")};return D.runKernel(Up,t)}var iE=z({diag_:sE});function oE(e,t,n,a,r=[1,1],s="NHWC"){let i=M(e,"x","dilation2d"),o=M(t,"filter","dilation2d");F(i.rank===3||i.rank===4,()=>`Error in dilation2d: input must be rank 3 or 4, but got rank ${i.rank}.`),F(o.rank===3,()=>`Error in dilation2d: filter must be rank 3, but got rank ${o.rank}.`),F(s==="NHWC",()=>`Error in dilation2d: Only NHWC is currently supported, but got dataFormat of ${s}`);let l=i,u=!1;i.rank===3&&(l=H(i,[1,i.shape[0],i.shape[1],i.shape[2]]),u=!0);let d={x:l,filter:o},p={strides:n,pad:a,dilations:r},c=D.runKernel(Nu,d,p);return u?H(c,[c.shape[1],c.shape[2],c.shape[3]]):c}var gA=z({dilation2d_:oE});function lE(e,t){let n=e.length,a=[];for(let r=0;r1&&i===1&&a.unshift(s)}return a}function Pt(e,t){let n=[];for(let a=0;a1)&&n.unshift(s)}return n}function pt(e,t){let n=[],a=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 ${a.rank}.`);let r=n.rank===1?n.size:n.shape[1],s=a.rank===1?a.size:a.shape[0];if(F(r===s,()=>`Error in dot: inner dimensions of inputs must match, but got ${r} and ${s}.`),n.rank===1&&a.rank===1){let i=H(n,[1,-1]),o=H(a,[-1,1]),l=Be(i,o);return H(l,[])}else if(n.rank===1&&a.rank===2){let i=H(n,[1,-1]),o=H(a,[a.shape[0],a.shape[1]]),l=Be(i,o);return H(l,[l.size])}else if(n.rank===2&&a.rank===1){let i=H(a,[-1,1]),o=Be(n,i);return H(o,[o.size])}else{let i=H(a,[a.shape[0],a.shape[1]]);return Be(n,i)}}var Xb=z({dot_:hE});function fE(e,...t){let n=t.map((r,s)=>M(r,`tensors${s}`,"einsum")),a={equation:e};return D.runKernel(qp,n,a)}var Kb=z({einsum_:fE});function mE(e){let t={x:M(e,"x","elu")};return D.runKernel(go,t)}var gl=z({elu_:mE});function AE(e){let t=M(e,"x","erf");F(t.dtype==="int32"||t.dtype==="float32",()=>"Input dtype must be `int32` or `float32`."),t.dtype==="int32"&&(t=fe(t,"float32"));let n={x:t};return D.runKernel(xo,n)}var bA=z({erf_:AE});function yE(e){let t={x:M(e,"x","exp")};return D.runKernel(bs,t)}var Zn=z({exp_:yE});function gE(e,t=0){let n=M(e,"x","expandDims","string_or_numeric");F(t<=n.rank,()=>"Axis must be <= rank of the tensor");let a={input:n},r={dim:t};return D.runKernel(vo,a,r)}var un=z({expandDims_:gE});function xE(e){let t={x:M(e,"x","expm1")};return D.runKernel(wo,t)}var vA=z({expm1_:xE});function bE(e,t){let n=M(e,"x","tile","string_or_numeric");F(n.rank===t.length,()=>`Error in transpose: rank of input ${n.rank} must match length of reps ${t}.`);let a={x:n},r={reps:t};return D.runKernel(Er,a,r)}var Or=z({tile_:bE});function vE(e,t,n,a="float32"){t==null&&(t=e);let r=We([e,t],a),s=e<=t?e:t;for(let o=0;o`Error in localResponseNormalization: x must be rank 3 or 4 but got - rank ${s.rank}.`),F(Ut(t),()=>`Error in localResponseNormalization: depthRadius must be an integer but got depthRadius ${t}.`);let i=s,o=!1;s.rank===3&&(o=!0,i=H(s,[1,s.shape[0],s.shape[1],s.shape[2]]));let l={x:i},u={depthRadius:t,bias:n,alpha:a,beta:r},d=D.runKernel(Ru,l,u);return o?H(d,[d.shape[1],d.shape[2],d.shape[3]]):d}var IA=z({localResponseNormalization_:$E});function DE(e){let t={x:M(e,"x","log")};return D.runKernel(Ts,t)}var zn=z({log_:DE});function zE(e){let t={x:M(e,"x","log1p")};return D.runKernel(Fo,t)}var Fc=z({log1p_:zE});function OE(e){return F(Sr(e),()=>"The f passed in grad(f) must be a function"),(t,n)=>{let a=M(t,"x","tf.grad","string_or_numeric"),r=n!=null?M(n,"dy","tf.grad"):null;return D.tidy(()=>{let{value:s,grads:i}=D.gradients(()=>e(a),[a],r);return r!=null&&on(s.shape,r.shape,"The shape of dy passed in grad(f)(x, dy) must match the shape returned by f(x)"),$c(i),i[0]})}}function _E(e){return F(Sr(e),()=>"The f passed in grads(f) must be a function"),(t,n)=>{F(Array.isArray(t),()=>"The args passed in grads(f)(args) must be an array of `Tensor`s or `TensorLike`s");let a=Gu(t,"args","tf.grads","string_or_numeric"),r=n!=null?M(n,"dy","tf.grads"):null;return D.tidy(()=>{let{value:s,grads:i}=D.gradients(()=>e(...a),a,r);return r!=null&&on(s.shape,r.shape,"The shape of dy passed in grads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),$c(i),i})}}function PE(e){return F(Sr(e),()=>"The f passed in valueAndGrad(f) must be a function"),(t,n)=>{F(t instanceof Le,()=>"The x passed in valueAndGrad(f)(x) must be a tensor"),F(n==null||n instanceof Le,()=>"The dy passed in valueAndGrad(f)(x, dy) must be a tensor");let{grads:a,value:r}=D.gradients(()=>e(t),[t],n);return $c(a),{grad:a[0],value:r}}}function LE(e){return F(Sr(e),()=>"The f passed in valueAndGrads(f) must be a function"),(t,n)=>{F(Array.isArray(t)&&t.every(r=>r instanceof Le),()=>"The args passed in valueAndGrads(f)(args) must be array of tensors"),F(n==null||n instanceof Le,()=>"The dy passed in valueAndGrads(f)(args, dy) must be a tensor");let a=D.gradients(()=>e(...t),t,n);return n!=null&&on(a.value.shape,n.shape,"The shape of dy passed in valueAndGrads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),$c(a.grads),a}}function Qb(e,t){F(Sr(e),()=>"The f passed in variableGrads(f) must be a function"),F(t==null||Array.isArray(t)&&t.every(u=>u instanceof ju),()=>"The varList passed in variableGrads(f, varList) must be an array of variables");let n=t!=null;if(!n){t=[];for(let u in D.registeredVariables)t.push(D.registeredVariables[u])}let a=n?t.filter(u=>!u.trainable):null,r=t.length;t=t.filter(u=>u.trainable),F(t.length>0,()=>`variableGrads() expects at least one of the input variables to be trainable, but none of the ${r} variables is trainable.`);let s=!0,{value:i,grads:o}=D.gradients(e,t,null,s);F(o.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()."),F(i.rank===0,()=>`The f passed in variableGrads(f) must return a scalar, but it returned a rank-${i.rank} tensor`);let l={};return t.forEach((u,d)=>{o[d]!=null&&(l[u.name]=o[d])}),a!=null&&a.forEach(u=>l[u.name]=null),{value:i,grads:l}}function La(e){return D.customGrad(e)}function $c(e){if(e.filter(t=>t==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 WE(e){let t={x:M(e,"x","neg")};return D.runKernel(zo,t)}var vt=z({neg_:WE});function BE(e){let t={x:M(e,"x","softplus")};return D.runKernel(Yo,t)}var mi=z({softplus_:BE});function VE(e){let t=M(e,"x","logSigmoid");return La(n=>({value:vt(mi(vt(n))),gradFunc:a=>_(a,In(vt(n)))}))(t)}var e3=z({logSigmoid_:VE});function jE(e,t=null,n=!1){let a={x:M(e,"x","max")},r={reductionIndices:t,keepDims:n};return D.runKernel(Es,a,r)}var Yn=z({max_:jE});function UE(e,t){let n=M(e,"a","sub"),a=M(t,"b","sub");[n,a]=bt(n,a);let r={a:n,b:a};return D.runKernel(Js,r)}var ge=z({sub_:UE});function HE(e,t=null,n=!1){let a=M(e,"x","sum");a.dtype==="bool"&&(a=fe(a,"int32"));let r={x:a},s={axis:t,keepDims:n};return D.runKernel(Ks,r,s)}var ke=z({sum_:HE});function GE(e,t=-1){let n=M(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 La((a,r)=>{let s=!0,i=Yn(a,t,!0),o=ge(a,i),l=ge(fe(o,"float32"),zn(ke(Zn(o),t,s)));return r([l]),{value:l,gradFunc:(u,d)=>{let[p]=d,c=!0,h=Zn(p);return ge(u,_(ke(u,t,c),h))}}})(n)}var Dc=z({logSoftmax_:GE});function SA(e,t){for(let n=0;ne[s]);return[n,r]}function Ai(e,t){let n=t.map(a=>1);return t3(e,n,t)}function qE(e,t,n){F(SA(t,n),()=>`${e} supports only inner-most axes for now. Got axes ${t} and rank-${n} input.`)}function a3(e,t){if(SA(e,t))return null;let n=[];for(let a=0;an.push(a)),n}function NA(e){return e.map((t,n)=>[n,t]).sort((t,n)=>t[1]-n[1]).map(t=>t[0])}function XE(e,t){let n=[];for(let a=t-e;a`Error in maxPool: input must be rank 4 but got rank ${o.rank}.`),F(Pa(n,i),()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${n} and dilations '${i}'`),r!=null&&F(Ut(a),()=>`Error in maxPool: pad must be an integer when using, dimRoundingMode ${r} but got pad ${a}.`);let u={x:o},d={filterSize:t,strides:n,pad:a,dimRoundingMode:r},p=D.runKernel(Rs,u,d);return l?H(p,[p.shape[1],p.shape[2],p.shape[3]]):p}var nd=z({maxPool_:eC});function tC(e,t=[1,1,1],n,a,r,s="NDHWC"){let i=M(e,"x","maxPool3d"),o=i,l=!1;i.rank===4&&(l=!0,o=H(i,[1,i.shape[0],i.shape[1],i.shape[2],i.shape[3]])),F(o.rank===5,()=>`Error in maxPool3d: x must be rank 5 but got rank ${o.rank}.`),F(s==="NDHWC",()=>`Error in maxPool3d: Only NDHWC is currently supported, but got dataFormat of ${s}`),r!=null&&F(Ut(a),()=>`Error in maxPool3d: pad must be an integer when using, dimRoundingMode ${r} but got pad ${a}.`);let u={x:o},d={filterSize:t,strides:n,pad:a,dimRoundingMode:r,dataFormat:s},p=D.runKernel(Mu,u,d);return l?H(p,[p.shape[1],p.shape[2],p.shape[3],p.shape[4]]):p}var EA=z({maxPool3d_:tC});function nC(e,t,n,a,r=!1){let s={x:M(e,"x","maxPoolWithArgmax")},i={filterSize:t,strides:n,pad:a,includeBatchInIndex:r},o=D.runKernel(nc,s,i);return{result:o[0],indexes:o[1]}}var s3=z({maxPoolWithArgmax_:nC});function aC(e,t){let n=M(e,"a","maximum"),a=M(t,"b","maximum");[n,a]=bt(n,a),n.dtype==="bool"&&(n=fe(n,"int32"),a=fe(a,"int32")),pt(n.shape,a.shape);let r={a:n,b:a};return D.runKernel(Cs,r)}var Wa=z({maximum_:aC});function rC(e,t=null,n=!1){let a={x:M(e,"x","mean")},r={axis:t,keepDims:n};return D.runKernel(Ms,a,r)}var wt=z({mean_:rC});function Ct(e,t="float32"){if(t==="complex64"){let a=Ct(e,"float32"),r=Ct(e,"float32");return Rr(a,r)}let n=$p(Nt(e),t);return D.makeTensor(n,e,t)}function On(e,t="float32"){if(t==="complex64"){let a=On(e,"float32"),r=Ct(e,"float32");return Rr(a,r)}let n=vm(Nt(e),t);return D.makeTensor(n,e,t)}function sC(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 a=M(e,"x","meshgrid",e instanceof Le?e.dtype:"float32");if(t===void 0)return[a];let r=M(t,"y","meshgrid",t instanceof Le?t.dtype:"float32"),s=Nt(a.shape),i=Nt(r.shape);return n==="xy"?(a=H(a,[1,-1]),r=H(r,[-1,1]),[Be(On([i,1],a.dtype),a),Be(r,On([1,s],r.dtype))]):(a=H(a,[-1,1]),r=H(r,[1,-1]),[Be(a,On([1,i],a.dtype)),Be(On([s,1],r.dtype),r)])}function iC(e,t=null,n=!1){let a={x:M(e,"x","min")},r={axis:t,keepDims:n};return D.runKernel(Fs,a,r)}var vl=z({min_:iC});function oC(e,t){let n=M(e,"a","minimum"),a=M(t,"b","minimum");[n,a]=bt(n,a),n.dtype==="bool"&&(n=fe(n,"int32"),a=fe(a,"int32")),pt(n.shape,a.shape);let r={a:n,b:a};return D.runKernel($s,r)}var wl=z({minimum_:oC});function lC(e,t,n){F(n==="reflect"||n==="symmetric",()=>`Invalid mode. Mode must be either reflect or symmetric. Got ${n}.`);let a=M(e,"x","mirrorPad");if(a.rank===0)throw new Error("mirrorPad(scalar) is not defined. Pass non-scalar to mirrorPad");F(t.length===a.rank,()=>`Padding doesn't match input. Must be ${a.rank}. Got ${t.length}.`);let r=n==="reflect"?1:0;for(let o=0;o"Invalid number of paddings. Must be length of 2 each."),F(t[o][0]>=0&&t[o][0]<=a.shape[o]-r&&t[o][1]>=0&&t[o][1]<=a.shape[o]-r,()=>`Padding in dimension ${o} cannot be greater than or equal to ${a.shape[o]-r} or less than 0 for input of shape ${a.shape}`);let s={paddings:t,mode:n},i={x:a};return D.runKernel(Ds,i,s)}var CA=z({mirrorPad_:lC});function uC(e,t){let n=M(e,"a","mod"),a=M(t,"b","mod");[n,a]=bt(n,a);let r={a:n,b:a};return D.runKernel(Do,r)}var RA=z({mod_:uC});function dC(e){let t=M(e,"x","square"),n={};return D.runKernel("Square",{x:t},n)}var it=z({square_:dC});function pC(e,t=null,n=!1){e=M(e,"x","moments");let a=ia(t,e.shape),r=wt(e,a,n),s=r.shape;n||(s=Ai(r.shape,a));let i=it(ge(fe(e,"float32"),H(r,s))),o=wt(i,a,n);return{mean:r,variance:o}}var Oc=z({moments_:pC});function cC(e,t,n,a){let r=M(t,"data","multiRNNCell"),s=Gu(n,"c","multiRNNCell"),i=Gu(a,"h","multiRNNCell"),o=r,l=[];for(let p=0;p2)throw new Error(`Rank of probabilities must be 1 or 2, but is ${i}`);n=n||Math.random();let o={logits:i===1?H(r,[1,-1]):r},l={numSamples:t,seed:n,normalized:a},u=D.runKernel(ac,o,l);return i===1?H(u,[u.size]):u}var i3=z({multinomial_:fC});function mC(e,t){let n=M(e,"a","notEqual"),a=M(t,"b","notEqual");[n,a]=bt(n,a),pt(n.shape,a.shape);let r={a:n,b:a};return D.runKernel(Oo,r)}var yi=z({notEqual_:mC});function AC(e){let t={x:M(e,"x","onesLike")};return D.runKernel(Wo,t)}var _n=z({onesLike_:AC});function yC(e,t){let n=M(e,"v1","outerProduct"),a=M(t,"v2","outerProduct");F(n.rank===1&&a.rank===1,()=>`Error in outerProduct: inputs must be rank 1, but got ranks ${n.rank} and ${a.rank}.`);let r=H(n,[-1,1]),s=H(a,[1,-1]);return Be(r,s)}var gC=z({outerProduct_:yC});function xC(e,t,n=0){let a=M(e,"x","pad");if(a.rank===0)throw new Error("pad(scalar) is not defined. Pass non-scalar to pad");let r={paddings:t,constantValue:n},s={x:a};return D.runKernel(_s,s,r)}var or=z({pad_:xC});function bC(e,t,n=0){return F(t.length===2,()=>"Invalid number of paddings. Must be length of 2."),or(e,[t],n)}var vC=z({pad1d_:bC});function wC(e,t,n=0){return F(t.length===2&&t[0].length===2&&t[1].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),or(e,t,n)}var kC=z({pad2d_:wC});function IC(e,t,n=0){return F(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."),or(e,t,n)}var SC=z({pad3d_:IC});function NC(e,t,n=0){return F(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."),or(e,t,n)}var TC=z({pad4d_:NC});function EC(e,t,n){let a=M(e,"x","spaceToBatchND");F(a.rank>=1+t.length,()=>`input rank ${a.rank} should be > than [blockShape] ${t.length}`),F(n.length===t.length,()=>`paddings.shape[0] ${n.length} must be equal to [blockShape] ${t.length}`),F(a.shape.reduce((i,o,l)=>l>0&&l<=t.length?i&&(o+n[l-1][0]+n[l-1][1])%t[l-1]==0:i,!0),()=>`input spatial dimensions ${a.shape.slice(1)} with paddings ${n.toString()} must be divisible by blockShapes ${t.toString()}`);let r={x:a},s={blockShape:t,paddings:n};return D.runKernel(Du,r,s)}var ad=z({spaceToBatchND_:EC});function CC(e,t,n,a,r,s){r==null&&(r=[1,1]),s==null&&(s=1),a===0&&(a="valid");let i=M(e,"x","maxPool"),o=i,l=!1;i.rank===3&&(l=!0,o=H(i,[1,i.shape[0],i.shape[1],i.shape[2]])),F(Pa(s,r),()=>`Error in pool: Either strides or dilations must be 1. Got strides ${s} and dilations '${r}'`);let u=Ob(o.shape,t,s,r,a),d=[u.dilationHeight,u.dilationWidth],p;a==="same"?p=MC([u.filterHeight,u.filterWidth],d):p=[[0,0],[0,0]];let c=d[0]===1&&d[1]===1,[h,m]=RC([u.inHeight,u.inWidth],d,p),f=c?a:"valid",A=c?o:ad(o,d,h),y=(n==="avg"?()=>Yu(A,t,s,f):()=>nd(A,t,s,f))(),g=c?y:Ju(y,d,m);return l?H(g,[g.shape[1],g.shape[2],g.shape[3]]):g}function RC(e,t,n){let a=n.map(d=>d[0]),r=n.map(d=>d[1]),s=e.concat(a,r),i=t.map((d,p)=>(d-s[p]%d)%d),o=r.map((d,p)=>d+i[p]),l=t.map((d,p)=>[a[p],o[p]]),u=t.map((d,p)=>[0,i[p]]);return[l,u]}function MC(e,t){let n=e.map((s,i)=>s+(s-1)*(t[i]-1)).map(s=>s-1),a=n.map(s=>Math.floor(s/2)),r=n.map((s,i)=>s-a[i]);return n.map((s,i)=>[a[i],r[i]])}var o3=z({pool_:CC});function FC(e,t){let n=M(e,"base","pow"),a=M(t,"exp","pow");[n,a]=bt(n,a);let r={a:n,b:a};return D.runKernel(Ps,r)}var lr=z({pow_:FC});function $C(e,t){let n=M(e,"x","prelu"),a=M(t,"alpha","prelu"),r={x:n,alpha:a};return D.runKernel(Ls,r)}var rd=z({prelu_:$C});function DC(e,t=null,n=!1){let a=M(e,"x","prod");a.dtype==="bool"&&(a=fe(a,"int32"));let r={x:a},s={axis:t,keepDims:n};return D.runKernel(Vo,r,s)}var _c=z({prod_:DC});function zC(e,t,n){let a=Nt(e),r=null;if(n==null||n==="float32")r=new Float32Array(a);else if(n==="int32")r=new Int32Array(a);else if(n==="bool")r=new Uint8Array(a);else throw new Error(`Unknown data type ${n}`);for(let s=0;s=1||s===0);let i=Math.sqrt(-2*Math.log(s)/s);e=this.mean+this.stdDev*a*i,t=this.mean+this.stdDev*r*i,(!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}},_C=class{constructor(e,t,n,a){this.alpha=e,this.beta=1/t,this.dtype=n;let r=a||Math.random();this.randu=MA.alea(r.toString()),this.randn=new FA(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,a,r,s;for(;;){do a=this.randn.nextValue(),s=1+this.c*a;while(s<=0);if(s*=s*s,e=a*a,t=1-.331*e*e,n=.5*e+this.d*(1-s+Math.log(s)),r=this.randu(),rthis.dtype==null||this.dtype==="float32",this.min=e,this.range=t-e,this.dtype=n,a==null&&(a=Math.random()),typeof a=="number"&&(a=a.toString()),!this.canReturnFloat()&&this.range<=1)throw new Error(`The difference between ${e} - ${t} <= 1 and dtype is not float`);this.random=MA.alea(a)}convertValue(e){return this.canReturnFloat()?e:Math.round(e)}nextValue(){return this.convertValue(this.min+this.range*this.random())}};function LC(e,t,n=1,a="float32",r){if(n==null&&(n=1),a==null&&(a="float32"),a!=="float32"&&a!=="int32")throw new Error(`Unsupported data type ${a}`);let s=new _C(t,n,a,r),i=We(e,a);for(let o=0;o`Error in reverse1D: x must be rank 1 but got rank ${t.rank}.`),Pn(t,0)}var KC=z({reverse1d_:XC});function ZC(e,t){let n=M(e,"x","reverse");return F(n.rank===2,()=>`Error in reverse2D: x must be rank 2 but got rank ${n.rank}.`),Pn(n,t)}var YC=z({reverse2d_:ZC});function JC(e,t){let n=M(e,"x","reverse");return F(n.rank===3,()=>`Error in reverse3D: x must be rank 3 but got rank ${n.rank}.`),Pn(n,t)}var QC=z({reverse3d_:JC});function eR(e,t){let n=M(e,"x","reverse");return F(n.rank===4,()=>`Error in reverse4D: x must be rank 4 but got rank ${n.rank}.`),Pn(n,t)}var tR=z({reverse4d_:eR});function nR(e){let t={x:M(e,"x","round")};return D.runKernel(Us,t)}var Lc=z({round_:nR});function aR(e){let t={x:M(e,"x","rsqrt")};return D.runKernel(Hs,t)}var Wc=z({rsqrt_:aR});function Se(e,t){if((nn(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"&&nn(e)&&!(e instanceof Uint8Array))throw new Error("When making a scalar from encoded string, the value must be `Uint8Array`.");return Mr(e,[],[],t)}function rR(e){let t={x:M(e,"x","selu")};return D.runKernel(qo,t)}var Bc=z({selu_:rR});function sR(e,t,n,a,r,s=[1,1],i="NHWC"){let o=M(e,"x","separableConv2d"),l=M(t,"depthwiseFilter","separableConv2d"),u=M(n,"pointwiseFilter","separableConv2d"),d=o,p=!1;if(o.rank===3&&(p=!0,d=H(o,[1,o.shape[0],o.shape[1],o.shape[2]])),i==="NCHW")throw new Error("separableConv2d currently does not support dataFormat NCHW; only NHWC is supported");F(d.rank===4,()=>`Error in separableConv2d: input must be rank 4, but got rank ${d.rank}.`),F(l.rank===4,()=>`Error in separableConv2d: depthwise filter must be rank 4, but got rank ${l.rank}.`),F(u.rank===4,()=>`Error in separableConv2d: pointwise filter must be rank 4, but got rank ${l.rank}.`),F(u.shape[0]===1,()=>`Error in separableConv2d: the first dimension of pointwise filter must be 1, but got ${u.shape[0]}.`),F(u.shape[1]===1,()=>`Error in separableConv2d: the second dimension of pointwise filter must be 1, but got ${u.shape[1]}.`);let c=l.shape[2],h=l.shape[3];F(u.shape[2]===c*h,()=>`Error in separableConv2d: the third dimension of pointwise filter must be ${c*h}, but got ${u.shape[2]}.`);let m=yl(d,l,a,r,i,s),f=ir(m,u,1,"valid",i);return p?H(f,[f.shape[1],f.shape[2],f.shape[3]]):f}var DA=z({separableConv2d_:sR});async function iR(e,t){let n=M(e,"x","setdiff1d"),a=M(t,"y","setdiff1d");F(n.dtype===a.dtype,()=>`x and y should have the same dtype, but got x (${n.dtype}) and y (${a.dtype}).`),F(n.rank===1,()=>`x should be 1D tensor, but got x (${n.shape}).`),F(a.rank===1,()=>`y should be 1D tensor, but got y (${a.shape}).`);let r=await n.data(),s=await a.data(),i=new Set(s),o=0;for(let d=0;d`slice1d expects a rank-1 tensor, but got a rank-${a.rank} tensor`),Re(a,[t],[n])}var Uc=z({slice1d_:dR});function pR(e,t,n){let a=M(e,"x","slice2d");return F(a.rank===2,()=>`slice2d expects a rank-2 tensor, but got a rank-${a.rank} tensor`),Re(a,t,n)}var OA=z({slice2d_:pR});function cR(e,t,n){let a=M(e,"x","slice3d");return F(a.rank===3,()=>`slice3d expects a rank-3 tensor, but got a rank-${a.rank} tensor`),Re(a,t,n)}var Hc=z({slice3d_:cR});function hR(e,t,n){let a=M(e,"x","slice4d");return F(a.rank===4,()=>`slice4d expects a rank-4 tensor, but got a rank-${a.rank} tensor`),Re(a,t,n)}var id=z({slice4d_:hR});function fR(e,t=-1){let n=M(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 a={logits:n},r={dim:t};return D.runKernel(Zs,a,r)}var od=z({softmax_:fR});function mR(e){F(e.dtype==="complex64",()=>`The dtype for tf.spectral.fft() must be complex64 but got ${e.dtype}.`);let t={input:e};return D.runKernel(Kp,t)}var ld=z({fft_:mR});function AR(e){F(e.dtype==="complex64",()=>`The dtype for tf.spectral.ifft() must be complex64 but got ${e.dtype}.`);let t={input:e};return D.runKernel(Zp,t)}var Sl=z({ifft_:AR});function yR(e){let t=e.shape[e.shape.length-1],n=e.size/t,a;if(t<=2){let r=H(e,[n,t]);a=Sl(r)}else{let r=[n,2*(t-1)],s=H(sd(e),[n,t]),i=H(Rc(e),[n,t]),o=Pn(Re(s,[0,1],[n,t-2]),1),l=_(Pn(Re(i,[0,1],[n,t-2]),1),Se(-1)),u=ot([s,o],1),d=ot([i,l],1),p=H(Rr(u,d),[r[0],r[1]]);a=Sl(p)}if(a=sd(a),e.rank===3&&e.shape[0]!==0){let r=a,s=e.shape[0];a=H(a,[s,a.shape[0]/s,a.shape[1]]),r.dispose()}return a}var Gc=z({irfft_:yR});function gR(e,t,n=0){let a={x:M(e,"x","split")},r={numOrSizeSplits:t,axis:n};return D.runKernel(Jo,a,r)}var Gt=z({split_:gR});function xR(e,t){F(e.dtype==="float32",()=>`The dtype for rfft() must be real value but got ${e.dtype}`);let n=e.shape[e.shape.length-1],a=e.size/n,r;if(t!=null&&t0),f=e.shape.map(A=>A);f[e.shape.length-1]=t,r=Re(e,m,f),n=t}else if(t!=null&&t>n){let m=e.shape.map(f=>f);m[e.shape.length-1]=t-n,r=ot([e,Ct(m)],e.shape.length-1),n=t}else r=e;let s=Ue(r),i=H(Rr(r,s),[a,n]),o=ld(i),l=Math.floor(n/2)+1,u=sd(o),d=Rc(o),p=Gt(u,[l,n-l],u.shape.length-1),c=Gt(d,[l,n-l],d.shape.length-1),h=r.shape.slice();return h[r.shape.length-1]=l,H(Rr(p[0],c[0]),h)}var ud=z({rfft_:xR});function bR(e){let t={x:M(e,"x","sqrt")};return D.runKernel(Xs,t)}var Qt=z({sqrt_:bR});function vR(e,t){let n=M(e,"a","squaredDifference"),a=M(t,"b","squaredDifference");[n,a]=bt(n,a),pt(n.shape,a.shape);let r={a:n,b:a},s={};return D.runKernel(Ys,r,s)}var qc=z({squaredDifference_:vR});function wR(e,t){let n=M(e,"x","squeeze");return H(n,Rx(n.shape,t).newShape)}var Va=z({squeeze_:wR});function kR(e,t=0){let n=Gu(e,"tensors","stack","string_or_numeric");F(n.length>=1,()=>"Pass at least one tensor to tf.stack"),n.length>0&&F(t<=n[0].rank,()=>"Axis must be <= rank of the tensor");let a=n,r={axis:t};return D.runKernel(Bo,a,r)}var dn=z({stack_:kR});function IR(e,t=0){let n={x:M(e,"x","step")},a={alpha:t};return D.runKernel(Cr,n,a)}var Nl=z({step_:IR});function SR(e,t,n,a,r=0,s=0,i=0,o=0,l=0){let u={x:M(e,"x","stridedSlice")},d={begin:t,end:n,strides:a,beginMask:r,endMask:s,ellipsisMask:i,newAxisMask:o,shrinkAxisMask:l};return D.runKernel(Qo,u,d)}var _A=z({stridedSlice_:SR});function NR(e){let t={x:M(e,"x","tan")};return D.runKernel(Qs,t)}var PA=z({tan_:NR});function Tt(e,t){is(e);let n=Oa(e,t);if(n.length!==1)throw new Error("tensor1d() requires values to be a flat/TypedArray");return Mr(e,null,n,t)}function ba(e,t,n){if(is(e),t!=null&&t.length!==2)throw new Error("tensor2d() requires shape to have two numbers");let a=Oa(e,n);if(a.length!==2&&a.length!==1)throw new Error("tensor2d() requires values to be number[][] or flat/TypedArray");if(a.length===1&&t==null)throw new Error("tensor2d() requires shape to be provided when `values` are a flat/TypedArray");return Mr(e,t,a,n)}function TR(e,t,n){if(is(e),t!=null&&t.length!==4)throw new Error("tensor4d() requires shape to have four numbers");let a=Oa(e,n);if(a.length!==4&&a.length!==1)throw new Error("tensor4d() requires values to be number[][][][] or flat/TypedArray");if(a.length===1&&t==null)throw new Error("tensor4d() requires shape to be provided when `values` are a flat array");return Mr(e,t,a,n)}function ER(e,t,n){if(is(e),t!=null&&t.length!==5)throw new Error("tensor5d() requires shape to have five numbers");let a=Oa(e,n);if(a.length!==5&&a.length!==1)throw new Error("tensor5d() requires values to be number[][][][][] or flat/TypedArray");if(a.length===1&&t==null)throw new Error("tensor5d() requires shape to be provided when `values` are a flat array");return Mr(e,t,a,n)}function CR(e,t,n){if(is(e),t!=null&&t.length!==6)throw new Error("tensor6d() requires shape to have six numbers");let a=Oa(e,n);if(a.length!==6&&a.length!==1)throw new Error("tensor6d() requires values to be number[][][][][][] or flat/TypedArray");if(a.length===1&&t==null)throw new Error("tensor6d() requires shape to be provided when `values` are a flat array");return t=t||a,Mr(e,t,a,n)}function RR(e,t=1,n=!0){let a=M(e,"x","topk");if(a.rank===0)throw new Error("topk() expects the input to be of rank 1 or higher");let r=a.shape[a.shape.length-1];if(t>r)throw new Error(`'k' passed to topk() must be <= the last dimension (${r}) but got ${t}`);let s={x:a},i={k:t,sorted:n},[o,l]=D.runKernel(el,s,i);return{values:o,indices:l}}var LA=z({topk_:RR});function MR(e,t=0,n=1,a,r){if(a!=null&&a==="bool")throw new Error("Unsupported data type $ { dtype }");let s=new FA(t,n,a,!0,r),i=We(e,a);for(let o=0;o0,()=>"The input tensor must be at least 1D");let a={x:n},r={axis:t},[s,i]=D.runKernel(dc,a,r);return{values:s,indices:i}}var Kc=z({unique_:FR});function $R(e,t,n){let a=M(e,"x","unsortedSegmentSum"),r=M(t,"segmentIds","unsortedSegmentSum","int32");F(Ut(n),()=>"numSegments must be of dtype int");let s={x:a,segmentIds:r},i={numSegments:n};return D.runKernel(Ou,s,i)}var WA=z({unsortedSegmentSum_:$R});function DR(e,t=0){let n=M(e,"x","unstack","string_or_numeric");F(t>=-n.shape.length&&t`Axis = ${t} is not in [-${n.shape.length}, ${n.shape.length})`);let a={value:n},r={axis:t};return D.runKernel(nl,a,r)}var pa=z({unstack_:DR});function d3(e,t=!0,n,a){return D.makeVariable(e,t,n,a)}function p3(e,t){let n=[];for(let s=0;s0,()=>"mask cannot be scalar"),on(o.slice(s,s+i),r.shape,"mask's shape must match the first K dimensions of tensor's shape,");let l=1;for(let f=s;f"Shape mismatch in v and x");let l=Se(1),u=ge(l,o),d=_(ge(i,s),u);if(r){F(a!=null,()=>"When using zeroDebias: true, step is required.");let p=M(a,"step","movingAverage");d=me(d,ge(l,lr(o,p)))}return se(s,d)}var WR=z({movingAverage_:LR});function BR(e,t,n){let a=M(e,"indices","scatterND","int32"),r=M(t,"updates","scatterND");Zm(r,a,n);let s={indices:a,updates:r},i={shape:n};return D.runKernel(Ho,s,i)}var h3=z({scatterND_:BR});function VR(e,t,n,a){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,s=e.rank>1?e.shape[1]:1;if(n.length!==s)throw new Error(`outputShape has incorrect number of elements:, ${n.length}, should be: ${s}.`);let i=t.size;if(!(t.rank===0||t.rank===1&&i===r))throw new Error(`sparseValues has incorrect shape ${t.shape}, should be [] or [${r}]`);if(t.dtype!==a.dtype)throw new Error("sparseValues.dtype must match defaultValues.dtype")}function jR(e,t,n,a=0){let r=M(e,"sparseIndices","sparseToDense","int32"),s=M(t,"sparseValues","sparseToDense"),i=M(a,"defaultValue","sparseToDense",s.dtype);VR(r,s,n,i);let o={sparseIndices:r,sparseValues:s,defaultValue:i},l={outputShape:n};return D.runKernel(uc,o,l)}var VA=z({sparseToDense_:jR});function UR(e,t){let n=M(t,"indices","gatherND","int32"),a={params:M(e,"x","gatherND"),indices:n};return D.runKernel(So,a)}var f3=z({gatherND_:UR});function HR(e,t){if(t==null)return e.shape.slice();if(ar(e.shape,t))return t;if(e.shape.length===t.length){let n=[];for(let a=0;a`x has to be a floating point tensor since it's going to be scaled, but got a ${r.dtype} tensor instead.`),F(t>=0&&t<1,()=>`rate must be a float in the range [0, 1), but got ${t}.`),t===0)return e instanceof Le?r.clone():r;let s=HR(r,n),i=1-t,o=me(bl(se(kl(s,0,1,"float32",a),i)),i);return _(r,o)}var m3=z({dropout_:GR});function A3(e){return Math.floor(Math.pow(2,Math.ceil(Math.log(e)/Math.log(2))))}function jA(e,t,n){let a=1-e%2,r=new Float32Array(e);for(let s=0;s1,()=>`inTopK() expects the predictions to be of rank 2 or higher, but got ${a.rank}`),F(a.rank-1===r.rank,()=>`predictions rank should be 1 larger than targets rank, but got predictions rank ${a.rank} and targets rank ${r.rank}`),on(a.shape.slice(0,a.shape.length-1),r.shape,"predictions's shape should be align with the targets' shape, except the last dimension.");let s=a.shape[a.shape.length-1];F(n>0&&n<=s,()=>`'k' passed to inTopK() must be > 0 && <= the predictions last dimension (${s}), but got ${n}`);let i=await a.data(),o=await r.data(),[l,u]=[i.length/s,s],d=Mx("bool",l);for(let p=0;pA.value-f.value),d[p]=0;for(let f=0;fYR,depthwiseConv2d:()=>tM,matMul:()=>aM});function KR(e,t,n,a,r,s="NHWC",i){let o=e;e.rank===3&&(o=H(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let l=t;l.rank===3&&(l=H(t,[1,t.shape[0],t.shape[1],t.shape[2]])),F(o.rank===4,()=>`Error in conv2dDerFilter: input must be rank 4, but got shape ${o.shape}.`),F(l.rank===4,()=>`Error in conv2dDerFilter: dy must be rank 4, but got shape ${l.shape}.`),F(n.length===4,()=>`Error in conv2dDerFilter: filterShape must be length 4, but got ${n}.`);let u=s==="NHWC"?o.shape[3]:o.shape[1],d=s==="NHWC"?l.shape[3]:l.shape[1];F(u===n[2],()=>`Error in conv2dDerFilter: depth of input ${u}) must match input depth in filter (${n[2]}.`),F(d===n[3],()=>`Error in conv2dDerFilter: depth of dy (${d}) must match output depth for filter (${n[3]}).`),i!=null&&F(Ut(r),()=>`Error in conv2dDerFilter: pad must be an integer when using, dimRoundingMode ${i} but got pad ${r}.`);let p={x:o,dy:l},c={strides:a,pad:r,dataFormat:s,dimRoundingMode:i,filterShape:n};return D.runKernel(Pp,p,c)}var UA=z({conv2DBackpropFilter_:KR});function Yc(e,t,n){if(n==null||n==="linear")return e;if(n==="relu")return _(e,Nl(t));throw new Error(`Cannot compute gradient for fused activation ${n}.`)}function Jc(e,t){let n=t,a=Pt(e.shape,t.shape);return a.length>0&&(n=ke(n,a)),H(n,e.shape)}function Qc(e,t,n,a){if(t==="linear")return e;if(t==="relu")return Ba(e);if(t==="elu")return gl(e);if(t==="relu6")return Pc(e);if(t==="prelu")return rd(e,n);if(t==="leakyrelu")return ed(e,a);if(t==="sigmoid")return In(e);throw new Error(`Unknown fused activation ${t}.`)}var eh=(e,t)=>!(e>0)||t==="linear";function ZR({x:e,filter:t,strides:n,pad:a,dataFormat:r="NHWC",dilations:s=[1,1],dimRoundingMode:i,bias:o,activation:l="linear",preluActivationWeights:u,leakyreluAlpha:d}){if(l=l||"linear",eh(D.state.gradientDepth,l)===!1){let b=ir(e,t,n,a,r,s,i);return o!=null&&(b=se(b,o)),Qc(b,l,u,d)}let p=M(e,"x","conv2d"),c=M(t,"filter","conv2d"),h=p,m=!1;p.rank===3&&(m=!0,h=H(p,[1,p.shape[0],p.shape[1],p.shape[2]])),F(h.rank===4,()=>`Error in fused conv2d: input must be rank 4, but got rank ${h.rank}.`),F(c.rank===4,()=>`Error in fused conv2d: filter must be rank 4, but got rank ${c.rank}.`),i!=null&&F(Ut(a),()=>`Error in fused conv2d: pad must be an integer when using, dimRoundingMode ${i} but got pad ${a}.`),F(h.shape[3]===c.shape[2],()=>`Error in conv2d: depth of input (${h.shape[3]}) must match input depth for filter ${c.shape[2]}.`),F(Pa(n,s),()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`),F(r==="NHWC",()=>`Error in conv2d: got dataFormat of ${r} but only NHWC is currently supported.`);let f=Zu(h.shape,c.shape,n,s,a,i),A;o!=null&&(A=M(o,"bias","fused conv2d"),[A]=bt(A,p),pt(f.outShape,A.shape));let y;u!=null&&(y=M(u,"prelu weights","fused conv2d"));let g=(b,v)=>{let[N,T,R,$]=v,O=Yc(b,R,l);F(Dr(s),()=>`Error in gradient of fused conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${s}'`);let P=mA(T.shape,O,N,n,a),V=UA(T,O,N.shape,n,a),j=[P,V];if($!=null){let U=Jc($,O);j.push(U)}return j},x={x:h,filter:c,bias:A,preluActivationWeights:y},w={strides:n,pad:a,dataFormat:r,dilations:s,dimRoundingMode:i,activation:l,leakyreluAlpha:d};return o==null?La((b,v,N)=>{let T=D.runKernel(ai,x,w);return N([v,b,T]),m&&(T=H(T,[T.shape[1],T.shape[2],T.shape[3]])),{value:T,gradFunc:g}})(h,c):La((b,v,N,T)=>{let R=D.runKernel(ai,x,w);return T([v,b,R,N]),m&&(R=H(R,[R.shape[1],R.shape[2],R.shape[3]])),{value:R,gradFunc:g}})(h,c,A)}var YR=z({fusedConv2d_:ZR});function JR(e,t,n,a,r,s=[1,1],i){let o=e;e.rank===3&&(o=H(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let l=t;l.rank===3&&(l=H(t,[1,t.shape[0],t.shape[1],t.shape[2]]));let u={x:o,dy:l},d={strides:a,pad:r,dimRoundingMode:i,dilations:s,filterShape:n};return D.runKernel(Vp,u,d)}var y3=z({depthwiseConv2dNativeBackpropFilter_:JR});function QR(e,t,n,a,r,s=[1,1],i){let o=t,l=!1;t.rank===3&&(l=!0,o=H(t,[1,t.shape[0],t.shape[1],t.shape[2]]));let u={dy:o,filter:n},d={strides:a,pad:r,dimRoundingMode:i,dilations:s,inputShape:e},p=D.runKernel(jp,u,d);return l?H(p,[p.shape[1],p.shape[2],p.shape[3]]):p}var g3=z({depthwiseConv2dNativeBackpropInput_:QR});function eM({x:e,filter:t,strides:n,pad:a,dataFormat:r="NHWC",dilations:s=[1,1],dimRoundingMode:i,bias:o,activation:l="linear",preluActivationWeights:u,leakyreluAlpha:d}){if(eh(D.state.gradientDepth,l)===!1){let b=yl(e,t,n,a,r,s,i);return o!=null&&(b=se(b,o)),Qc(b,l,u,d)}let p=M(e,"x","depthwiseConv2d"),c=M(t,"filter","depthwiseConv2d"),h=p,m=!1;p.rank===3&&(m=!0,h=H(p,[1,p.shape[0],p.shape[1],p.shape[2]])),F(h.rank===4,()=>`Error in fused depthwiseConv2d: input must be rank 4, but got rank ${h.rank}.`),F(c.rank===4,()=>`Error in fused depthwiseConv2d: filter must be rank 4, but got rank ${c.rank}.`),F(h.shape[3]===c.shape[2],()=>`Error in fused depthwiseConv2d: number of input channels (${h.shape[3]}) must match the inChannels dimension in filter ${c.shape[2]}.`),s==null&&(s=[1,1]),F(Pa(n,s),()=>`Error in fused depthwiseConv2d: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`),i!=null&&F(Ut(a),()=>`Error in fused depthwiseConv2d: pad must be an integer when using dimRoundingMode ${i} but got pad ${a}.`);let f=Zu(h.shape,c.shape,n,s,a,i,!0),A;o!=null&&(A=M(o,"bias","fused conv2d"),[A]=bt(A,p),pt(f.outShape,A.shape));let y;u!=null&&(y=M(u,"prelu weights","fused depthwiseConv2d"));let g=(b,v)=>{F(Dr(s),()=>`Error in gradient of fused depthwiseConv2d: dilation rates greater than 1 are not yet supported. Got dilations '${s}'`);let[N,T,R,$]=v,O=Yc(b,R,l),P=g3(T.shape,O,N,n,a,s,i),V=y3(T,O,N.shape,n,a,s,i);if($!=null){let j=Jc(A,O);return[P,V,j]}return[P,V]},x={x:h,filter:c,bias:A,preluActivationWeights:y},w={strides:n,pad:a,dataFormat:r,dilations:s,dimRoundingMode:i,activation:l,leakyreluAlpha:d};return o==null?La((b,v,N)=>{let T=D.runKernel(ri,x,w);return N([v,b,T]),m&&(T=H(T,[T.shape[1],T.shape[2],T.shape[3]])),{value:T,gradFunc:g}})(h,c):La((b,v,N,T)=>{let R=D.runKernel(ri,x,w);return T([v,b,R,N]),m&&(R=H(R,[R.shape[1],R.shape[2],R.shape[3]])),{value:R,gradFunc:g}})(h,c,A)}var tM=z({fusedDepthwiseConv2d_:eM});function nM({a:e,b:t,transposeA:n=!1,transposeB:a=!1,bias:r,activation:s="linear",preluActivationWeights:i,leakyreluAlpha:o}){if(eh(D.state.gradientDepth,s)===!1){let $=Be(e,t,n,a);return r!=null&&($=se($,r)),Qc($,s,i,o)}let l=M(e,"a","fused matMul"),u=M(t,"b","fused matMul");[l,u]=bt(l,u);let d=n?l.shape[l.rank-2]:l.shape[l.rank-1],p=a?u.shape[u.rank-1]:u.shape[u.rank-2],c=n?l.shape[l.rank-1]:l.shape[l.rank-2],h=a?u.shape[u.rank-2]:u.shape[u.rank-1],m=l.shape.slice(0,-2),f=u.shape.slice(0,-2),A=Nt(m),y=Nt(f);F(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}.`),F(ar(m,f),()=>`Error in fused matMul: outer dimensions (${m}) and (${f}) of Tensors with shapes ${l.shape} and ${u.shape} must match.`),F(d===p,()=>`Error in fused matMul: inner shapes (${d}) and (${p}) of Tensors with shapes ${l.shape} and ${u.shape} and transposeA=${n} and transposeB=${a} must match.`);let g=l.shape.slice(0,-2).concat([c,h]),x=n?H(l,[A,d,c]):H(l,[A,c,d]),w=a?H(u,[y,h,p]):H(u,[y,p,h]),b;r!=null&&(b=M(r,"bias","fused matMul"),[b]=bt(b,l),pt(g,b.shape));let v;i!=null&&(v=M(i,"prelu weights","fused matMul"));let N=($,O)=>{let[P,V,j,U]=O,X=Yc(H($,j.shape),j,s),G,ee;if(!n&&!a?(G=Be(X,V,!1,!0),ee=Be(P,X,!0,!1)):!n&&a?(G=Be(X,V,!1,!1),ee=Be(X,P,!0,!1)):n&&!a?(G=Be(V,X,!1,!0),ee=Be(P,X,!1,!1)):(G=Be(V,X,!0,!0),ee=Be(X,P,!0,!0)),r!=null){let Y=Jc(U,X);return[G,ee,Y]}else return[G,ee]},T={a:x,b:w,bias:b,preluActivationWeights:v},R={transposeA:n,transposeB:a,activation:s,leakyreluAlpha:o};return r==null?La(($,O,P)=>{let V=D.runKernel(ni,T,R);return P([$,O,V]),{value:H(V,g),gradFunc:N}})(x,w):La(($,O,P,V)=>{let j=D.runKernel(ni,T,R);return V([$,O,j,P]),{value:H(j,g),gradFunc:N}})(x,w,b)}var aM=z({fusedMatMul_:nM});function rM(e){return jA(e,.54,.46)}var sM=z({hammingWindow_:rM});function iM(e){return jA(e,.5,.5)}var x3=z({hannWindow_:iM});function oM(e,t,n,a=!1,r=0){let s=0,i=[];for(;s+t<=e.size;)i.push(Re(e,s,t)),s+=n;if(a)for(;s`Error in cropAndResize: image must be rank 4,but got rank ${i.rank}.`),F(o.rank===2&&o.shape[1]===4,()=>`Error in cropAndResize: boxes must be have size [${u},4] but had shape ${o.shape}.`),F(l.rank===1&&l.shape[0]===u,()=>`Error in cropAndResize: boxInd must be have size [${u}] but had shape ${o.shape}.`),F(a.length===2,()=>`Error in cropAndResize: cropSize must be of length 2, but got length ${a.length}.`),F(a[0]>=1&&a[1]>=1,()=>`cropSize must be atleast [1,1], but was ${a}`),F(r==="bilinear"||r==="nearest",()=>`method must be bilinear or nearest, but was ${r}`);let d={image:i,boxes:o,boxInd:l},p={method:r,extrapolationValue:s,cropSize:a};return D.runKernel(Ao,d,p)}var pM=z({cropAndResize_:dM});function cM(e){let t=M(e,"image","flipLeftRight","float32");F(t.rank===4,()=>`Error in flipLeftRight: image must be rank 4,but got rank ${t.rank}.`);let n={image:t};return D.runKernel(ko,n,{})}var hM=z({flipLeftRight_:cM});function fM(e,t,n=0,a=.5){let r=M(e,"image","rotateWithOffset","float32");F(r.rank===4,()=>`Error in rotateWithOffset: image must be rank 4,but got rank ${r.rank}.`);let s={image:r},i={radians:t,fillValue:n,center:a};return D.runKernel(rl,s,i)}var mM=z({rotateWithOffset_:fM});function Tl(e,t,n,a,r,s){a==null&&(a=.5),r==null&&(r=Number.NEGATIVE_INFINITY),s==null&&(s=0);let i=e.shape[0];return n=Math.min(n,i),F(0<=a&&a<=1,()=>`iouThreshold must be in [0, 1], but was '${a}'`),F(e.rank===2,()=>`boxes must be a 2D tensor, but was of rank '${e.rank}'`),F(e.shape[1]===4,()=>`boxes must have 4 columns, but 2nd dimension was ${e.shape[1]}`),F(t.rank===1,()=>"scores must be a 1D tensor"),F(t.shape[0]===i,()=>`scores has incompatible shape with boxes. Expected ${i}, but was ${t.shape[0]}`),F(0<=s&&s<=1,()=>`softNmsSigma must be in [0, 1], but was '${s}'`),{maxOutputSize:n,iouThreshold:a,scoreThreshold:r,softNmsSigma:s}}function AM(e,t,n,a=.5,r=Number.NEGATIVE_INFINITY){let s=M(e,"boxes","nonMaxSuppression"),i=M(t,"scores","nonMaxSuppression"),o=Tl(s,i,n,a,r);n=o.maxOutputSize,a=o.iouThreshold,r=o.scoreThreshold;let l={maxOutputSize:n,iouThreshold:a,scoreThreshold:r};return D.runKernel(_o,{boxes:s,scores:i},l)}var yM=z({nonMaxSuppression_:AM});function gM(e,t,n){let a=xM(e,t,n),r=a<0?-(a+1):a;e.splice(r,0,t)}function xM(e,t,n){return vM(e,t,n||bM)}function bM(e,t){return e>t?1:e>>1);let o=n(t,e[s]);o>0?a=s+1:(r=s,i=!o)}return i?a:-a-1}function v3(e,t,n,a,r){return HA(e,t,n,a,r,0)}function w3(e,t,n,a,r,s){return HA(e,t,n,a,r,0,!1,s,!0)}function k3(e,t,n,a,r,s){return HA(e,t,n,a,r,s,!0)}function HA(e,t,n,a,r,s,i=!1,o=!1,l=!1){let u=[];for(let A=0;Ar&&u.push({score:t[A],boxIndex:A,suppressBeginIndex:0});u.sort(I3);let d=s>0?-.5/s:0,p=[],c=[];for(;p.length0;){let A=u.pop(),{score:y,boxIndex:g,suppressBeginIndex:x}=A;if(y=x;--b){let v=wM(e,g,p[b]);if(v>=a){w=!0;break}if(A.score=A.score*kM(a,d,v),A.score<=r)break}A.suppressBeginIndex=p.length,w||(A.score===y?(p.push(g),c.push(A.score)):A.score>r&&gM(u,A,I3))}let h=p.length,m=n-h;o&&m>0&&(p.push(...new Array(m).fill(0)),c.push(...new Array(m).fill(0)));let f={selectedIndices:p};return i&&(f.selectedScores=c),l&&(f.validOutputs=h),f}function wM(e,t,n){let a=e.subarray(t*4,t*4+4),r=e.subarray(n*4,n*4+4),s=Math.min(a[0],a[2]),i=Math.min(a[1],a[3]),o=Math.max(a[0],a[2]),l=Math.max(a[1],a[3]),u=Math.min(r[0],r[2]),d=Math.min(r[1],r[3]),p=Math.max(r[0],r[2]),c=Math.max(r[1],r[3]),h=(o-s)*(l-i),m=(p-u)*(c-d);if(h<=0||m<=0)return 0;let f=Math.max(s,u),A=Math.max(i,d),y=Math.min(o,p),g=Math.min(l,c),x=Math.max(y-f,0)*Math.max(g-A,0);return x/(h+m-x)}function kM(e,t,n){let a=Math.exp(t*n*n);return n<=e?a:0}function I3(e,t){return e.score-t.score||e.score===t.score&&t.boxIndex-e.boxIndex}async function IM(e,t,n,a=.5,r=Number.NEGATIVE_INFINITY){let s=M(e,"boxes","nonMaxSuppressionAsync"),i=M(t,"scores","nonMaxSuppressionAsync"),o=Tl(s,i,n,a,r);n=o.maxOutputSize,a=o.iouThreshold,r=o.scoreThreshold;let l=await Promise.all([s.data(),i.data()]),u=l[0],d=l[1],{selectedIndices:p}=v3(u,d,n,a,r);return s!==e&&s.dispose(),i!==t&&i.dispose(),Tt(p,"int32")}var SM=IM;function NM(e,t,n,a=.5,r=Number.NEGATIVE_INFINITY,s=0){let i=M(e,"boxes","nonMaxSuppression"),o=M(t,"scores","nonMaxSuppression"),l=Tl(i,o,n,a,r,s);n=l.maxOutputSize,a=l.iouThreshold,r=l.scoreThreshold,s=l.softNmsSigma;let u={boxes:i,scores:o},d={maxOutputSize:n,iouThreshold:a,scoreThreshold:r,softNmsSigma:s},p=D.runKernel(Lo,u,d);return{selectedIndices:p[0],selectedScores:p[1]}}var TM=z({nonMaxSuppressionWithScore_:NM});async function EM(e,t,n,a=.5,r=Number.NEGATIVE_INFINITY,s=0){let i=M(e,"boxes","nonMaxSuppressionAsync"),o=M(t,"scores","nonMaxSuppressionAsync"),l=Tl(i,o,n,a,r,s);n=l.maxOutputSize,a=l.iouThreshold,r=l.scoreThreshold,s=l.softNmsSigma;let u=await Promise.all([i.data(),o.data()]),d=u[0],p=u[1],{selectedIndices:c,selectedScores:h}=k3(d,p,n,a,r,s);return i!==e&&i.dispose(),o!==t&&o.dispose(),{selectedIndices:Tt(c,"int32"),selectedScores:Tt(h)}}var CM=EM;function RM(e,t,n,a=.5,r=Number.NEGATIVE_INFINITY,s=!1){let i=M(e,"boxes","nonMaxSuppression"),o=M(t,"scores","nonMaxSuppression"),l=Tl(i,o,n,a,r,null),u=l.maxOutputSize,d=l.iouThreshold,p=l.scoreThreshold,c={boxes:i,scores:o},h={maxOutputSize:u,iouThreshold:d,scoreThreshold:p,padToMaxOutputSize:s},m=D.runKernel(Po,c,h);return{selectedIndices:m[0],validOutputs:m[1]}}var MM=z({nonMaxSuppressionPadded_:RM});async function FM(e,t,n,a=.5,r=Number.NEGATIVE_INFINITY,s=!1){let i=M(e,"boxes","nonMaxSuppressionAsync"),o=M(t,"scores","nonMaxSuppressionAsync"),l=Tl(i,o,n,a,r,null),u=l.maxOutputSize,d=l.iouThreshold,p=l.scoreThreshold,[c,h]=await Promise.all([i.data(),o.data()]),{selectedIndices:m,validOutputs:f}=w3(c,h,u,d,p,s);return i!==e&&i.dispose(),o!==t&&o.dispose(),{selectedIndices:Tt(m,"int32"),validOutputs:Se(f,"int32")}}var $M=FM;function DM(e,t,n=!1,a=!1){let r=M(e,"images","resizeBilinear");F(r.rank===3||r.rank===4,()=>`Error in resizeBilinear: x must be rank 3 or 4, but got rank ${r.rank}.`),F(t.length===2,()=>`Error in resizeBilinear: new shape must 2D, but got shape ${t}.`),F(a===!1||n===!1,()=>"Error in resizeBilinear: If halfPixelCenters is true, alignCorners must be false.");let s=r,i=!1;r.rank===3&&(i=!0,s=H(r,[1,r.shape[0],r.shape[1],r.shape[2]]));let[]=t,o={images:s},l={alignCorners:n,halfPixelCenters:a,size:t},u=D.runKernel(Bs,o,l);return i?H(u,[u.shape[1],u.shape[2],u.shape[3]]):u}var S3=z({resizeBilinear_:DM});function zM(e,t,n=!1,a=!1){let r=M(e,"images","resizeNearestNeighbor");F(r.rank===3||r.rank===4,()=>`Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank ${r.rank}.`),F(t.length===2,()=>`Error in resizeNearestNeighbor: new shape must 2D, but got shape ${t}.`),F(r.dtype==="float32"||r.dtype==="int32",()=>"`images` must have `int32` or `float32` as dtype"),F(a===!1||n===!1,()=>"Error in resizeNearestNeighbor: If halfPixelCenters is true, alignCorners must be false.");let s=r,i=!1;r.rank===3&&(i=!0,s=H(r,[1,r.shape[0],r.shape[1],r.shape[2]]));let[]=t,o={images:s},l={alignCorners:n,halfPixelCenters:a,size:t},u=D.runKernel($u,o,l);return i?H(u,[u.shape[1],u.shape[2],u.shape[3]]):u}var N3=z({resizeNearestNeighbor_:zM});function OM(e,t="binary",n=!1,a=.5){let r=M(e,"image","threshold"),s=.2989,i=.587,o=.114,l=r.shape[0]*r.shape[1],u=_(Tt([a]),255),d,p,c,h;if(F(r.rank===3,()=>`Error in threshold: image must be rank 3,but got rank ${r.rank}.`),F(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]}.`),F(r.dtype==="int32"||r.dtype==="float32",()=>`Error in dtype: image dtype must be int32 or float32,but got dtype ${r.dtype}.`),F(t==="otsu"||t==="binary",()=>`Method must be binary or otsu, but was ${t}`),r.shape[2]===3){[d,p,c]=Gt(r,[1,1,1],-1);let f=_(d,s),A=_(p,i),y=_(c,o);h=se(se(f,A),y)}else h=e;if(t==="otsu"){let f=hA(fe(Lc(h),"int32"),ua([]),256);u=_M(f,l)}let m=n?Pr(h,u):Dn(h,u);return fe(_(m,255),"int32")}function _M(e,t){let n=Tt([-1]),a=Tt([0]),r=Tt([0]),s,i,o,l,u,d;for(let p=0;p`Error in transform: image must be rank 4,but got rank ${i.rank}.`),F(o.rank===2&&(o.shape[0]===i.shape[0]||o.shape[0]===1)&&o.shape[1]===8,()=>"Error in transform: Input transform should be batch x 8 or 1 x 8"),F(s==null||s.length===2,()=>`Error in transform: outputShape must be [height, width] or null, but got ${s}.`);let l={image:i,transforms:o},u={interpolation:n,fillMode:a,fillValue:r,outputShape:s};return D.runKernel(tl,l,u)}var WM=z({transform_:LM});function BM(e,t,n){F(t%1==0,()=>`bandPart(): numLower must be an integer, got ${t}.`),F(n%1==0,()=>`bandPart(): numUpper must be an integer, got ${n}.`);let a=M(e,"a","bandPart");F(a.rank>=2,()=>`bandPart(): Rank must be at least 2, got ${a.rank}.`);let r=a.shape,[s,i]=a.shape.slice(-2);if(!(t<=s))throw new Error(`bandPart(): numLower (${t}) must not be greater than the number of rows (${s}).`);if(!(n<=i))throw new Error(`bandPart(): numUpper (${n}) must not be greater than the number of columns (${i}).`);t<0&&(t=s),n<0&&(n=i);let o=H(Il(0,s,1,"int32"),[-1,1]),l=Il(0,i,1,"int32"),u=ge(o,l),d=da(Pr(u,Se(+t,"int32")),_r(u,Se(-n,"int32"))),p=Ct([s,i],a.dtype);return H(dn(pa(H(a,[-1,s,i])).map(c=>an(d,c,p))),r)}var VM=z({bandPart_:BM});function jM(e){let t;if(Array.isArray(e)){t=!1,F(e!=null&&e.length>0,()=>"Gram-Schmidt process: input must not be null, undefined, or empty");let r=e[0].shape[0];for(let s=1;s`Gram-Schmidt: Non-unique lengths found in the input vectors: (${e[s].shape[0]} vs. ${r})`)}else t=!0,e=Gt(e,e.shape[0],0).map(r=>Va(r,[0]));F(e.length<=e[0].shape[0],()=>`Gram-Schmidt: Number of vectors (${e.length}) exceeds number of dimensions (${e[0].shape[0]}).`);let n=[],a=e;for(let r=0;r{let s=a[r];if(r>0)for(let i=0;i=2,()=>`qr() requires input tensor to have a rank >= 2, but got rank ${e.rank}`),e.rank===2)return T3(e,t);{let n=e.shape.slice(0,e.shape.length-2).reduce((l,u)=>l*u),a=pa(H(e,[n,e.shape[e.shape.length-2],e.shape[e.shape.length-1]]),0),r=[],s=[];a.forEach(l=>{let[u,d]=T3(l,t);r.push(u),s.push(d)});let i=H(dn(r,0),e.shape),o=H(dn(s,0),e.shape);return[i,o]}}function T3(e,t=!1){return D.tidy(()=>{F(e.shape.length===2,()=>`qr2d() requires a 2D Tensor, but got a ${e.shape.length}D Tensor.`);let n=e.shape[0],a=e.shape[1],r=wA(n),s=_a(e),i=ba([[1]],[1,1]),o=_a(i),l=n>=a?a:n;for(let u=0;u{let h=Re(s,[u,u],[n-u,1]),m=Zc(h),f=Re(s,[u,u],[1,1]),A=an(Dn(f,0),ba([[-1]]),ba([[1]])),y=ge(f,_(A,m)),g=me(h,y);g.shape[0]===1?o=_a(i):o=ot([i,Re(g,[1,0],[g.shape[0]-1,g.shape[1]])],0);let x=vt(me(Be(A,y),m)),w=Re(s,[u,0],[n-u,a]),b=_(x,o),v=Ye(o);if(u===0)s=ge(w,Be(b,Be(v,w)));else{let R=ge(w,Be(b,Be(v,w)));s=ot([Re(s,[0,0],[u,a]),R],0)}let N=Ye(b),T=Re(r,[0,u],[n,r.shape[1]-u]);if(u===0)r=ge(T,Be(Be(T,o),N));else{let R=ge(T,Be(Be(T,o),N));r=ot([Re(r,[0,0],[n,u]),R],1)}return[o,s,r]}),Ee([d,p,c])}return!t&&n>a&&(r=Re(r,[0,0],[n,a]),s=Re(s,[0,0],[a,a])),[r,s]})}var GM=z({qr_:HM}),pn;(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"})(pn||(pn={}));function qM(e,t,n=pn.SUM_BY_NONZERO_WEIGHTS){let a=M(e,"losses","computeWeightedLoss"),r=null;t!=null&&(r=M(t,"weights","computeWeightedLoss"));let s=r==null?a:_(a,r);if(n===pn.NONE)return s;if(n===pn.SUM)return ke(s);if(n===pn.MEAN){if(r==null)return wt(s);{let i=a.size/r.size,o=me(ke(s),ke(r));return i>1?me(o,Se(i)):o}}if(n===pn.SUM_BY_NONZERO_WEIGHTS){if(r==null)return me(ke(s),Se(a.size));{let i=_(r,On(a.shape)),o=fe(ke(yi(i,Se(0))),"float32");return me(ke(s),o)}}throw Error(`Unknown reduction: ${n}`)}var ur=z({computeWeightedLoss_:qM});function XM(e,t,n,a=pn.SUM_BY_NONZERO_WEIGHTS){let r=M(e,"labels","absoluteDifference"),s=M(t,"predictions","absoluteDifference"),i=null;n!=null&&(i=M(n,"weights","absoluteDifference")),on(r.shape,s.shape,"Error in absoluteDifference: ");let o=_t(ge(r,s));return ur(o,i,a)}var KM=z({absoluteDifference_:XM});function ZM(e,t,n,a,r=pn.SUM_BY_NONZERO_WEIGHTS){let s=M(e,"labels","cosineDistance"),i=M(t,"predictions","cosineDistance"),o=null;a!=null&&(o=M(a,"weights","cosineDistance")),on(s.shape,i.shape,"Error in cosineDistance: ");let l=Se(1),u=ge(l,ke(_(s,i),n,!0));return ur(u,o,r)}var YM=z({cosineDistance_:ZM});function JM(e,t,n,a=pn.SUM_BY_NONZERO_WEIGHTS){let r=M(e,"labels","hingeLoss"),s=M(t,"predictions","hingeLoss"),i=null;n!=null&&(i=M(n,"weights","hingeLoss")),on(r.shape,s.shape,"Error in hingeLoss: ");let o=Se(1);r=ge(_(Se(2),r),o);let l=Ba(ge(o,_(r,s)));return ur(l,i,a)}var QM=z({hingeLoss_:JM});function eF(e,t,n,a=1,r=pn.SUM_BY_NONZERO_WEIGHTS){let s=M(e,"labels","huberLoss"),i=M(t,"predictions","huberLoss"),o=null;n!=null&&(o=M(n,"weights","huberLoss")),on(s.shape,i.shape,"Error in huberLoss: ");let l=Se(a),u=_t(ge(i,s)),d=wl(u,l),p=ge(u,d),c=se(_(Se(.5),it(d)),_(l,p));return ur(c,o,r)}var tF=z({huberLoss_:eF});function nF(e,t,n,a=1e-7,r=pn.SUM_BY_NONZERO_WEIGHTS){let s=M(e,"labels","logLoss"),i=M(t,"predictions","logLoss"),o=null;n!=null&&(o=M(n,"weights","logLoss")),on(s.shape,i.shape,"Error in logLoss: ");let l=Se(1),u=Se(a),d=vt(_(s,zn(se(i,u)))),p=_(ge(l,s),zn(se(ge(l,i),u))),c=ge(d,p);return ur(c,o,r)}var aF=z({logLoss_:nF});function rF(e,t,n,a=pn.SUM_BY_NONZERO_WEIGHTS){let r=M(e,"labels","meanSquaredError"),s=M(t,"predictions","meanSquaredError"),i=null;n!=null&&(i=M(n,"weights","meanSquaredError")),on(r.shape,s.shape,"Error in meanSquaredError: ");let o=qc(r,s);return ur(o,i,a)}var sF=z({meanSquaredError_:rF});function iF(e,t){let n=M(e,"labels","sigmoidCrossEntropyWithLogits"),a=M(t,"logits","sigmoidCrossEntropyWithLogits");on(n.shape,a.shape,"Error in sigmoidCrossEntropyWithLogits: ");let r=Ba(a),s=_(a,n),i=Fc(Zn(vt(_t(a))));return se(ge(r,s),i)}function oF(e,t,n,a=0,r=pn.SUM_BY_NONZERO_WEIGHTS){let s=M(e,"multiClassLabels","sigmoidCrossEntropy"),i=M(t,"logits","sigmoidCrossEntropy"),o=null;if(n!=null&&(o=M(n,"weights","sigmoidCrossEntropy")),on(s.shape,i.shape,"Error in sigmoidCrossEntropy: "),a>0){let u=Se(a),d=Se(1),p=Se(.5);s=se(_(s,ge(d,u)),_(p,u))}let l=iF(s,i);return ur(l,o,r)}var lF=z({sigmoidCrossEntropy_:oF});function uF(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 La((a,r,s)=>{let i=TA(r,[n],!0),o=ge(fe(r,"float32"),i);s([a,o]);let l=vt(_(o,a));return{value:ke(l,[n]),gradFunc:(u,d)=>{let[p,c]=d,h=Ai(u.shape,[n]);return[_(H(u,h),ge(fe(p,"float32"),Zn(c))),_(H(u,h),ge(Zn(c),fe(p,"float32")))]}}})(e,t)}function dF(e,t,n,a=0,r=pn.SUM_BY_NONZERO_WEIGHTS){let s=M(e,"onehotLabels","softmaxCrossEntropy"),i=M(t,"logits","softmaxCrossEntropy"),o=null;if(n!=null&&(o=M(n,"weights","softmaxCrossEntropy")),on(s.shape,i.shape,"Error in softmaxCrossEntropy: "),a>0){let u=Se(a),d=Se(1),p=Se(s.shape[1]);s=se(_(s,ge(d,u)),me(u,p))}let l=uF(s,i);return ur(l,o,r)}var pF=z({softmaxCrossEntropy_:dF});function cF(e,t,n,a){let r=M(e,"indices","sparseFillEmptyRows"),s=M(t,"values","sparseFillEmptyRows"),i=M(n,"denseShape","sparseFillEmptyRows"),o=M(a,"defaultValue","sparseFillEmptyRows",s.dtype);if(r.rank!==2)throw new Error(`Indices should be Tensor2D but received shape - ${r.shape}`);if(s.rank!==1)throw new Error(`Values should be Tensor1D but received shape ${s.shape}`);if(i.rank!==1)throw new Error(`Dense shape should be Tensor1D but received shape ${i.shape}`);if(o.rank!==0)throw new Error(`Default value should be a scalar but received shape ${o.shape}`);let l={indices:r,values:s,denseShape:i,defaultValue:o},u=D.runKernel(oc,l);return{outputIndices:u[0],outputValues:u[1],emptyRowIndicator:u[2],reverseIndexMap:u[3]}}var hF=z({sparseFillEmptyRows_:cF});function fF(e,t,n){let a=M(e,"inputIndices","sparseReshape"),r=M(t,"inputShape","sparseReshape"),s=M(n,"newShape","sparseReshape");if(a.rank!==2)throw new Error(`Input indices should be Tensor2D but received shape - ${a.shape}`);if(r.rank!==1)throw new Error(`Input shape should be Tensor1D but received shape ${r.shape}`);if(s.rank!==1)throw new Error(`New shape should be Tensor1D but received shape ${s.shape}`);let i={inputIndices:a,inputShape:r,newShape:s},o=D.runKernel(lc,i);return{outputIndices:o[0],outputShape:o[1]}}var mF=z({sparseReshape_:fF}),AF={fft:ld,ifft:Sl,rfft:ud,irfft:Gc},yF={hammingWindow:sM,hannWindow:x3,frame:b3,stft:uM},Ge={flipLeftRight:hM,resizeNearestNeighbor:N3,resizeBilinear:S3,rotateWithOffset:mM,cropAndResize:pM,nonMaxSuppression:yM,nonMaxSuppressionAsync:SM,nonMaxSuppressionWithScore:TM,nonMaxSuppressionWithScoreAsync:CM,nonMaxSuppressionPadded:MM,nonMaxSuppressionPaddedAsync:$M,threshold:PM,transform:WM},E3={bandPart:VM,gramSchmidt:UM,qr:GM},gF={absoluteDifference:KM,computeWeightedLoss:ur,cosineDistance:YM,hingeLoss:QM,huberLoss:tF,logLoss:aF,meanSquaredError:sF,sigmoidCrossEntropy:lF,softmaxCrossEntropy:pF},C3={sparseFillEmptyRows:hF,sparseReshape:mF},dr=class extends Mb{minimize(e,t=!1,n){let{value:a,grads:r}=this.computeGradients(e,n);if(n!=null){let s=n.map(i=>({name:i.name,tensor:r[i.name]}));this.applyGradients(s)}else this.applyGradients(r);return Ee(r),t?a:(a.dispose(),null)}get iterations(){return this.iterations_==null&&(this.iterations_=0),this.iterations_}incrementIterations(){this.iterations_=this.iterations+1}computeGradients(e,t){return Qb(e,t)}dispose(){this.iterations_!=null&&Ee(this.iterations_)}async saveIterations(){return this.iterations_==null&&(this.iterations_=0),{name:"iter",tensor:Se(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(dr,Symbol.hasInstance,{value:e=>e.minimize!=null&&e.computeGradients!=null&&e.applyGradients!=null});var th=class extends dr{constructor(e,t,n=null){super();this.learningRate=e,this.rho=t,this.epsilon=n,this.accumulatedGrads=[],this.accumulatedUpdates=[],n==null&&(this.epsilon=D.backend.epsilon())}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let a=D.registeredVariables[t],r=!1;this.accumulatedGrads[n]==null&&(this.accumulatedGrads[n]={originalName:`${t}/accum_grad`,variable:W(()=>Ue(a).variable(r))}),this.accumulatedUpdates[n]==null&&(this.accumulatedUpdates[n]={originalName:`${t}/accum_var`,variable:W(()=>Ue(a).variable(r))});let s=Array.isArray(e)?e[n].tensor:e[t];if(s==null)return;let i=this.accumulatedGrads[n].variable,o=this.accumulatedUpdates[n].variable;W(()=>{let l=se(_(i,this.rho),_(it(s),1-this.rho)),u=_(me(Qt(se(o,this.epsilon)),Qt(se(i,this.epsilon))),s),d=se(_(o,this.rho),_(it(u),1-this.rho));i.assign(l),o.assign(d);let p=se(_(u,-this.learningRate),a);a.assign(p)})}),this.incrementIterations()}dispose(){this.accumulatedUpdates!=null&&(Ee(this.accumulatedGrads.map(e=>e.variable)),Ee(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(a=>({originalName:a.name,variable:a.tensor.variable(n)})),this.accumulatedUpdates=e.slice(t,t*2).map(a=>({originalName:a.name,variable:a.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)}};th.className="Adadelta";$r(th);var nh=class extends dr{constructor(e,t=.1){super();this.learningRate=e,this.initialAccumulatorValue=t,this.accumulatedGrads=[]}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let a=D.registeredVariables[t];if(this.accumulatedGrads[n]==null){let i=!1;this.accumulatedGrads[n]={originalName:`${t}/accumulator`,variable:W(()=>xl(a.shape,this.initialAccumulatorValue).variable(i))}}let r=Array.isArray(e)?e[n].tensor:e[t];if(r==null)return;let s=this.accumulatedGrads[n].variable;W(()=>{let i=se(s,it(r));s.assign(i);let o=se(_(me(r,Qt(se(i,D.backend.epsilon()))),-this.learningRate),a);a.assign(o)})}),this.incrementIterations()}dispose(){this.accumulatedGrads!=null&&Ee(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)}};nh.className="Adagrad";$r(nh);var ah=class extends dr{constructor(e,t,n,a=null){super();this.learningRate=e,this.beta1=t,this.beta2=n,this.epsilon=a,this.accumulatedFirstMoment=[],this.accumulatedSecondMoment=[],W(()=>{this.accBeta1=Se(t).variable(),this.accBeta2=Se(n).variable()}),a==null&&(this.epsilon=D.backend.epsilon())}applyGradients(e){let t=Array.isArray(e)?e.map(n=>n.name):Object.keys(e);W(()=>{let n=ge(1,this.accBeta1),a=ge(1,this.accBeta2);t.forEach((r,s)=>{let i=D.registeredVariables[r],o=!1;this.accumulatedFirstMoment[s]==null&&(this.accumulatedFirstMoment[s]={originalName:`${r}/m`,variable:W(()=>Ue(i).variable(o))}),this.accumulatedSecondMoment[s]==null&&(this.accumulatedSecondMoment[s]={originalName:`${r}/v`,variable:W(()=>Ue(i).variable(o))});let l=Array.isArray(e)?e[s].tensor:e[r];if(l==null)return;let u=this.accumulatedFirstMoment[s].variable,d=this.accumulatedSecondMoment[s].variable,p=se(_(u,this.beta1),_(l,1-this.beta1)),c=se(_(d,this.beta2),_(it(l),1-this.beta2)),h=me(p,n),m=me(c,a);u.assign(p),d.assign(c);let f=se(_(me(h,se(Qt(m),this.epsilon)),-this.learningRate),i);i.assign(f)}),this.accBeta1.assign(_(this.accBeta1,this.beta1)),this.accBeta2.assign(_(this.accBeta2,this.beta2))}),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.accBeta2.dispose(),this.accumulatedFirstMoment!=null&&Ee(this.accumulatedFirstMoment.map(e=>e.variable)),this.accumulatedSecondMoment!=null&&Ee(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),W(()=>{this.accBeta1.assign(lr(this.beta1,this.iterations_+1)),this.accBeta2.assign(lr(this.beta2,this.iterations_+1))});let t=e.length/2,n=!1;this.accumulatedFirstMoment=e.slice(0,t).map(a=>({originalName:a.name,variable:a.tensor.variable(n)})),this.accumulatedSecondMoment=e.slice(t,t*2).map(a=>({originalName:a.name,variable:a.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)}};ah.className="Adam";$r(ah);var rh=class extends dr{constructor(e,t,n,a=null,r=0){super();this.learningRate=e,this.beta1=t,this.beta2=n,this.epsilon=a,this.decay=r,this.accumulatedFirstMoment=[],this.accumulatedWeightedInfNorm=[],W(()=>{this.iteration=Se(0).variable(),this.accBeta1=Se(t).variable()}),a==null&&(this.epsilon=D.backend.epsilon())}applyGradients(e){let t=Array.isArray(e)?e.map(n=>n.name):Object.keys(e);W(()=>{let n=ge(1,this.accBeta1),a=me(-this.learningRate,se(_(this.iteration,this.decay),1));t.forEach((r,s)=>{let i=D.registeredVariables[r],o=!1;this.accumulatedFirstMoment[s]==null&&(this.accumulatedFirstMoment[s]={originalName:`${r}/m`,variable:Ue(i).variable(o)}),this.accumulatedWeightedInfNorm[s]==null&&(this.accumulatedWeightedInfNorm[s]={originalName:`${r}/v`,variable:Ue(i).variable(o)});let l=Array.isArray(e)?e[s].tensor:e[r];if(l==null)return;let u=this.accumulatedFirstMoment[s].variable,d=this.accumulatedWeightedInfNorm[s].variable,p=se(_(u,this.beta1),_(l,1-this.beta1)),c=_(d,this.beta2),h=_t(l),m=Wa(c,h);u.assign(p),d.assign(m);let f=se(_(me(a,n),me(p,se(m,this.epsilon))),i);i.assign(f)}),this.iteration.assign(se(this.iteration,1)),this.accBeta1.assign(_(this.accBeta1,this.beta1))}),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.iteration.dispose(),this.accumulatedFirstMoment!=null&&Ee(this.accumulatedFirstMoment.map(e=>e.variable)),this.accumulatedWeightedInfNorm!=null&&Ee(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)}};rh.className="Adamax";$r(rh);var dd=class extends dr{constructor(e){super();this.learningRate=e,this.setLearningRate(e)}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let a=Array.isArray(e)?e[n].tensor:e[t];if(a==null)return;let r=D.registeredVariables[t];W(()=>{let s=se(_(this.c,a),r);r.assign(s)})}),this.incrementIterations()}setLearningRate(e){this.learningRate=e,this.c!=null&&this.c.dispose(),this.c=Ht(Se(-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)}};dd.className="SGD";$r(dd);var sh=class extends dd{constructor(e,t,n=!1){super(e);this.learningRate=e,this.momentum=t,this.useNesterov=n,this.accumulations=[],this.m=Se(this.momentum)}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let a=D.registeredVariables[t];if(this.accumulations[n]==null){let i=!1;this.accumulations[n]={originalName:`${t}/momentum`,variable:W(()=>Ue(a).variable(i))}}let r=this.accumulations[n].variable,s=Array.isArray(e)?e[n].tensor:e[t];s!=null&&W(()=>{let i,o=se(_(this.m,r),s);this.useNesterov?i=se(_(this.c,se(s,_(o,this.m))),a):i=se(_(this.c,o),a),r.assign(o),a.assign(i)})}),this.incrementIterations()}dispose(){this.m.dispose(),this.accumulations!=null&&Ee(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)}};sh.className="Momentum";$r(sh);var ih=class extends dr{constructor(e,t=.9,n=0,a=null,r=!1){super();if(this.learningRate=e,this.decay=t,this.momentum=n,this.epsilon=a,this.accumulatedMeanSquares=[],this.accumulatedMoments=[],this.accumulatedMeanGrads=[],this.centered=r,a==null&&(this.epsilon=D.backend.epsilon()),e==null)throw new Error("learningRate for RMSPropOptimizer must be defined.")}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let a=D.registeredVariables[t],r=!1;this.accumulatedMeanSquares[n]==null&&(this.accumulatedMeanSquares[n]={originalName:`${t}/rms`,variable:W(()=>Ue(a).variable(r))}),this.accumulatedMoments[n]==null&&(this.accumulatedMoments[n]={originalName:`${t}/momentum`,variable:W(()=>Ue(a).variable(r))}),this.accumulatedMeanGrads[n]==null&&this.centered&&(this.accumulatedMeanGrads[n]={originalName:`${t}/mg`,variable:W(()=>Ue(a).variable(r))});let s=Array.isArray(e)?e[n].tensor:e[t];if(s==null)return;let i=this.accumulatedMeanSquares[n].variable,o=this.accumulatedMoments[n].variable;W(()=>{let l=se(_(i,this.decay),_(it(s),1-this.decay));if(this.centered){let u=this.accumulatedMeanGrads[n].variable,d=se(_(u,this.decay),_(s,1-this.decay)),p=me(_(s,this.learningRate),Qt(ge(l,se(it(d),this.epsilon)))),c=se(_(o,this.momentum),p);i.assign(l),u.assign(d),o.assign(c);let h=ge(a,c);a.assign(h)}else{let u=se(_(i,this.decay),_(it(s),1-this.decay)),d=se(_(o,this.momentum),me(_(s,this.learningRate),Qt(se(u,this.epsilon))));i.assign(u),o.assign(d);let p=ge(a,d);a.assign(p)}})}),this.incrementIterations()}dispose(){this.accumulatedMeanSquares!=null&&Ee(this.accumulatedMeanSquares.map(e=>e.variable)),this.accumulatedMeanGrads!=null&&this.centered&&Ee(this.accumulatedMeanGrads.map(e=>e.variable)),this.accumulatedMoments!=null&&Ee(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(a=>({originalName:a.name,variable:a.tensor.variable(n)})),this.accumulatedMoments=e.slice(t,t*2).map(a=>({originalName:a.name,variable:a.tensor.variable(n)})),this.centered&&(this.accumulatedMeanGrads=e.slice(t*2,t*3).map(a=>({originalName:a.name,variable:a.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)}};ih.className="RMSProp";$r(ih);var gi=class{static sgd(e){return new dd(e)}static momentum(e,t,n=!1){return new sh(e,t,n)}static rmsprop(e,t=.9,n=0,a=null,r=!1){return new ih(e,t,n,a,r)}static adam(e=.001,t=.9,n=.999,a=null){return new ah(e,t,n,a)}static adadelta(e=.001,t=.95,n=null){return new th(e,t,n)}static adamax(e=.002,t=.9,n=.999,a=null,r=0){return new rh(e,t,n,a,r)}static adagrad(e,t=.1){return new nh(e,t)}},xi={sgd:gi.sgd,momentum:gi.momentum,adadelta:gi.adadelta,adagrad:gi.adagrad,rmsprop:gi.rmsprop,adamax:gi.adamax,adam:gi.adam},xF=(()=>typeof requestAnimationFrame!="undefined"?requestAnimationFrame:typeof setImmediate!="undefined"?setImmediate:e=>e())();function oh(){return new Promise(e=>xF(()=>e()))}var C={};Fe(C,{ERF_A1:()=>RF,ERF_A2:()=>MF,ERF_A3:()=>FF,ERF_A4:()=>$F,ERF_A5:()=>DF,ERF_P:()=>CF,PARALLELIZE_THRESHOLD:()=>GA,SELU_SCALE:()=>M3,SELU_SCALEALPHA:()=>R3,applyActivation:()=>Qc,assertAndGetBroadcastShape:()=>pt,assertAxesAreInnerMostDims:()=>qE,assertParamsConsistent:()=>bF,assignToTypedArray:()=>VF,axesAreInnerMostDims:()=>SA,calculateShapes:()=>xb,checkEinsumDimSizes:()=>XF,combineLocations:()=>t3,complexWithEvenIndex:()=>LF,complexWithOddIndex:()=>WF,computeConv2DInfo:()=>Zu,computeConv3DInfo:()=>_b,computeDefaultPad:()=>dA,computeDilation2DInfo:()=>yT,computeOptimalWindowSize:()=>wF,computeOutAndReduceShapes:()=>n3,computeOutShape:()=>vF,computePool2DInfo:()=>Ob,computePool3DInfo:()=>gT,convertConv2DDataFormat:()=>Pb,decodeEinsumEquation:()=>GF,eitherStridesOrDilationsAreOne:()=>Pa,expandShapeToKeepDim:()=>Ai,exponent:()=>UF,exponents:()=>jF,fromStringArrayToUint8:()=>a$,fromUint8ToStringArray:()=>n$,getAxesPermutation:()=>a3,getBroadcastDims:()=>lE,getComplexWithIndex:()=>BF,getEinsumComputePath:()=>KF,getEinsumPermutation:()=>qF,getFusedBiasGradient:()=>Jc,getFusedDyActivation:()=>Yc,getImageCenter:()=>kF,getInnerMostAxes:()=>XE,getPermuted:()=>SF,getReductionAxes:()=>Pt,getReshaped:()=>IF,getReshapedPermuted:()=>NF,getSliceBeginCoords:()=>TF,getSliceSize:()=>EF,getUndoAxesPermutation:()=>NA,isIdentityPermutation:()=>ZF,log:()=>OF,mergeRealAndImagArrays:()=>_F,prepareAndValidate:()=>gb,prepareSplitSize:()=>JF,segment_util:()=>D3,shouldFuse:()=>eh,slice_util:()=>ln,splitRealAndImagArrays:()=>PF,tupleValuesAreOne:()=>Dr,upcastType:()=>la,validateInput:()=>Zm,validateUpdateShape:()=>Km,warn:()=>zF});function bF(e,t){let n=e[0].length;e.forEach((r,s)=>{F(r.length===n,()=>`Error in concat${n}D: rank of tensors[${s}] must be the same as the rank of the rest (${n})`)}),F(t>=0&&t`Error in concat${n}D: axis must be between 0 and ${n-1}.`);let a=e[0];e.forEach((r,s)=>{for(let i=0;i`Error in concat${n}D: Shape of tensors[${s}] (${r}) does not match the shape of the rest (${a}) along the non-concatenated axis ${s}.`)})}function vF(e,t){let n=e[0].slice();for(let a=1;a=t*2+1||i%2==1?s.push(i):r.push(i);a.push(...r),a.push(0),a.push(...s)}return a}function NF(e,t,n,a=!0){let r=[];a?r.push(e[0]/n):r.push(e[0]*n);for(let s=1;s/g,F3=",",$3="...";function GF(e,t){e=e.replace(/\s/g,"");let n=(e.length-e.replace(HF,"").length)/qA.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 ("${qA}").`);let[a,r]=e.split(qA);F(a.indexOf($3)===-1,()=>`The ellipsis notation ("${$3}") is not supported yet.`);let s=a.split(F3),i=s.length;if(t!==i)throw new Error(`Expected ${i} input tensors, received ${t}`);if(i>2)throw new Error("Support for more than 2 input tensors is not implemented yet.");let o=[];for(let c=0;cm.indexOf(h)!==-1))throw new Error(`Output subscripts contain the label ${h} not present in the input subscripts.`);o.indexOf(h)===-1&&o.push(h)}for(let c=0;cr!==-1),{permutationIndices:n,expandDims:a}}function XF(e,t,n){let a=new Array(e);for(let r=0;r`Expected dimension ${a[t[r][i]]} at axis ${i} of input shaped ${JSON.stringify(s)}, but got dimension ${s[i]}`)}}function KF(e,t){let n=e,a=[],r=0;e.length===0&&n.push(-1),r=e.length+1;for(let i=0;it===n)}function YF(e,t){let n=[];for(let a=0;a"Number of splits must evenly divide the axis."),a=new Array(t).fill(e.shape[n]/t);else{let r=t.reduce((i,o)=>(o===-1&&(i+=1),i),0);F(r<=1,()=>"There should be only one negative value in split array.");let s=t.indexOf(-1);if(s!==-1){let i=t.reduce((o,l)=>l>0?o+l:o);t[s]=e.shape[n]-i}F(e.shape[n]===t.reduce((i,o)=>i+o),()=>"The sum of sizes must match the size of the axis dimension."),a=t}return a}var D3={};Fe(D3,{collectGatherOpShapeInfo:()=>t$,computeOutShape:()=>e$,segOpComputeOptimalWindowSize:()=>QF});function QF(e,t){let n=!1,a;for(e<=GA?(a=e,n=!0):a=Fp(e,Math.floor(Math.sqrt(e)));!n;)a>t||a===e?n=!0:a=Fp(e,a+1);return a}function e$(e,t,n){let a=[],r=e.length;for(let s=0;sr))throw new Error(`Expect batchDims in the range of [-${r}, ${r}], but got ${a}`);if(a<0&&(a+=r),a>s)throw new Error(`batchDims (${a}) must be less than rank(x) ( - ${s}).`);if(nfc(t))}catch(t){throw new Error(`Failed to decode encoded string bytes into utf-8, error: ${t}`)}}function a$(e){return e.map(t=>Lu(t))}var ja={};Fe(ja,{nonMaxSuppressionV3Impl:()=>v3,nonMaxSuppressionV4Impl:()=>w3,nonMaxSuppressionV5Impl:()=>k3,whereImpl:()=>p3});function ve(e,t){Array.isArray(e)||(e=[e]),e.forEach(n=>{n!=null&&k.assert(n.dtype!=="complex64",()=>`${t} does not support complex64 tensors in the CPU backend.`)})}var r$=ja.whereImpl,lh=class extends gu{constructor(){super();this.blockSize=48,this.firstUse=!0,this.data=new Rp(this,sr())}nextDataId(){return lh.nextDataId++}write(e,t,n){this.firstUse&&(this.firstUse=!1,J().get("IS_NODE")&&C.warn(` -============================ -Hi there \u{1F44B}. Looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, which binds to TensorFlow C++, by running npm i @tensorflow/tfjs-node, or npm i @tensorflow/tfjs-node-gpu if you have CUDA. Then call require('@tensorflow/tfjs-node'); (-gpu suffix for CUDA) at the start of your program. Visit https://github.com/tensorflow/tfjs-node for more details. -============================`));let a={id:this.nextDataId()};return this.data.set(a,{values:e,dtype:n,refCount:1}),a}makeTensorInfo(e,t,n){let a;if(t==="string"&&n!=null&&n.length>0&&k.isString(n[0])){let r=n.map(s=>k.encodeString(s));a=this.write(r,e,t)}else a=this.write(n,e,t);return{dataId:a,shape:e,dtype:t}}refCount(e){return this.data.has(e)?this.data.get(e).refCount:0}incRef(e){let t=this.data.get(e);t.refCount++}decRef(e){if(this.data.has(e)){let t=this.data.get(e);t.refCount--}}move(e,t,n,a,r){this.data.set(e,{values:t,dtype:a,refCount:r})}numDataIds(){return this.data.numDataIds()}async read(e){return this.readSync(e)}readSync(e){let{dtype:t,complexTensorInfos:n}=this.data.get(e);if(t==="complex64"){let a=this.readSync(n.real.dataId),r=this.readSync(n.imag.dataId);return C.mergeRealAndImagArrays(a,r)}return this.data.get(e).values}bufferSync(e){let t=this.readSync(e.dataId),n=t;if(e.dtype==="string")try{n=t.map(a=>k.decodeString(a))}catch(a){throw new Error("Failed to decode encoded string bytes into utf-8")}return We(e.shape,e.dtype,n)}makeOutput(e,t,n){let a=this.write(e,t,n);return sr().makeTensorFromDataId(a,t,n,this)}disposeData(e,t=!1){if(this.data.has(e)){if(this.data.get(e).refCount--,!t&&this.data.get(e).refCount>0)return!1;let{complexTensorInfos:n}=this.data.get(e);n!=null&&(this.disposeData(n.real.dataId,!0),this.disposeData(n.imag.dataId,!0)),this.data.delete(e)}return!0}disposeIntermediateTensorInfo(e){this.disposeData(e.dataId)}async time(e){let t=k.now();return e(),{kernelMs:k.now()-t}}memory(){return{unreliable:!0,reasons:["The reported memory is an upper bound. Due to automatic garbage collection, the true allocated memory may be less."]}}where(e){ve([e],"where");let t=this.readSync(e.dataId);return r$(e.shape,t)}dispose(){}floatPrecision(){return 32}epsilon(){return super.epsilon()}};lh.nextDataId=0;var XA={};Fe(XA,{addImpl:()=>O3,bincountImpl:()=>ZA,bincountReduceImpl:()=>_3,ceilImpl:()=>P3,concatImpl:()=>YA,expImpl:()=>L3,expm1Impl:()=>B3,floorImpl:()=>V3,gatherV2Impl:()=>j3,greaterImpl:()=>U3,lessImpl:()=>H3,linSpaceImpl:()=>G3,logImpl:()=>q3,maxImpl:()=>X3,maximumImpl:()=>K3,minimumImpl:()=>Z3,multiplyImpl:()=>JA,negImpl:()=>Y3,notEqualImpl:()=>J3,prodImpl:()=>Q3,rangeImpl:()=>e1,rsqrtImpl:()=>e7,simpleAbsImpl:()=>z3,sliceImpl:()=>ph,sparseFillEmptyRowsImpl:()=>t7,sparseReshapeImpl:()=>n7,squaredDifferenceImpl:()=>a7,stridedSliceImpl:()=>r7,subImpl:()=>s7,tileImpl:()=>i7,topKImpl:()=>o7,transposeImpl:()=>QA,uniqueImpl:()=>l7});function z3(e){let t=new Float32Array(e.length);for(let n=0;n{let{x:t}=e.inputs,n=e.backend;ve(t,"abs");let a=new Float32Array(k.sizeFromShape(t.shape)),r=n.data.get(t.dataId).values;return a=z3(r),n.makeOutput(a,t.shape,"float32")},i$={kernelName:ao,backendName:"cpu",kernelFunc:s$};function Rt(e){return(t,n,a,r,s)=>{let i=C.assertAndGetBroadcastShape(t,n),o=i.length,l=k.computeStrides(i),u=k.sizeFromShape(i),d=k.getTypedArrayFromDType(s,u),p=t.length,c=n.length,h=k.computeStrides(t),m=k.computeStrides(n),f=C.getBroadcastDims(t,i),A=C.getBroadcastDims(n,i);if(f.length+A.length===0)for(let y=0;yx[N]=0);let w=k.locToIndex(x,p,h),b=g.slice(-c);A.forEach(N=>b[N]=0);let v=k.locToIndex(b,c,m);d[y]=e(a[w],r[v])}return[d,i]}}function Ln(e){let{inputs:t,backend:n}=e,{real:a,imag:r}=t,s=n.data.get(a.dataId).values,i=n.data.get(r.dataId).values,o=n.makeTensorInfo(a.shape,"complex64"),l=n.data.get(o.dataId);return l.complexTensorInfos={real:n.makeTensorInfo(a.shape,"float32",s),imag:n.makeTensorInfo(r.shape,"float32",i)},o}var o$={kernelName:_p,backendName:"cpu",kernelFunc:Ln};function uh(e,t,n="float32"){if(n==="complex64"){let r=uh(e,t,"float32"),s=uh(e,t,"float32");return Ln({inputs:{real:r,imag:s},backend:e})}let a=k.makeZerosTypedArray(k.sizeFromShape(t),n);return e.makeTensorInfo(t,n,a)}function Ua(e){let{inputs:t,backend:n}=e,{x:a}=t;return n.incRef(a.dataId),{dataId:a.dataId,shape:a.shape,dtype:a.dtype}}var l$={kernelName:Ss,backendName:"cpu",kernelFunc:Ua};function bi(e){let{inputs:t,backend:n}=e,{input:a}=t,r=n.data.get(a.dataId).complexTensorInfos.real,s=n.data.get(r.dataId).values;return n.makeTensorInfo(r.shape,r.dtype,s)}var u$={kernelName:rc,backendName:"cpu",kernelFunc:bi};function Wr(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{dtype:s}=a;if(s==="complex64"){if(r.dtype==="complex64")return Ua({inputs:{x:r},backend:n});let i=uh(n,r.shape,r.dtype),o=Wr({inputs:{x:r},backend:n,attrs:{dtype:"float32"}}),l=Ln({inputs:{real:o,imag:i},backend:n});return n.disposeIntermediateTensorInfo(i),n.disposeIntermediateTensorInfo(o),l}if(r.dtype==="complex64"){let i=bi({inputs:{input:r},backend:n}),o=Wr({inputs:{x:i},backend:n,attrs:{dtype:s}});return n.disposeIntermediateTensorInfo(i),o}if(!k.hasEncodingLoss(r.dtype,s)){let i=Ua({inputs:{x:r},backend:n});return{dataId:i.dataId,shape:i.shape,dtype:s}}if(s==="int32"){let i=n.data.get(r.dataId).values,o=Int32Array.from(i);return n.makeTensorInfo(r.shape,"int32",o)}if(s==="bool"){let i=n.data.get(r.dataId).values,o=k.toTypedArray([0],r.dtype),[l,u]=Rt((d,p)=>d!==p?1:0)(r.shape,[],i,o,"bool");return n.makeTensorInfo(u,"bool",l)}throw new Error(`Error in Cast: failed to cast ${r.dtype} to ${s}`)}var d$={kernelName:cs,backendName:"cpu",kernelFunc:Wr};function qt(e,t,n,a){return n==null?({inputs:r,backend:s})=>{let{a:i,b:o}=r,l=s;ve([i,o],e);let u=l.data.get(i.dataId).values,d=l.data.get(o.dataId).values,p=a||i.dtype,[c,h]=t(i.shape,o.shape,u,d,p);return l.makeTensorInfo(h,p,c)}:({inputs:r,backend:s})=>{let{a:i,b:o}=r,l=s;if(i.dtype==="complex64"||o.dtype==="complex64"){let u=Wr({inputs:{x:i},backend:l,attrs:{dtype:"complex64"}}),d=l.data.get(u.dataId),p=d.complexTensorInfos.real,c=d.complexTensorInfos.imag,h=l.data.get(p.dataId).values,m=l.data.get(c.dataId).values,f=Wr({inputs:{x:o},backend:l,attrs:{dtype:"complex64"}}),A=l.data.get(f.dataId),y=A.complexTensorInfos.real,g=A.complexTensorInfos.imag,x=l.data.get(y.dataId).values,w=l.data.get(g.dataId).values,[b,v,N]=n(i.shape,o.shape,h,m,x,w),T=l.makeTensorInfo(N,"float32",b),R=l.makeTensorInfo(N,"float32",v),$=Ln({inputs:{real:T,imag:R},backend:l});return l.disposeIntermediateTensorInfo(u),l.disposeIntermediateTensorInfo(f),l.disposeIntermediateTensorInfo(T),l.disposeIntermediateTensorInfo(R),$}else{let u=l.data.get(i.dataId).values,d=l.data.get(o.dataId).values,p=a||i.dtype,[c,h]=t(i.shape,o.shape,u,d,p);return l.makeTensorInfo(h,p,c)}}}function KA(e){return(t,n,a,r,s,i)=>{let o=C.assertAndGetBroadcastShape(t,n),l=k.sizeFromShape(o),u=o.length,d=k.computeStrides(o),p=k.getTypedArrayFromDType("float32",l),c=k.getTypedArrayFromDType("float32",l),h=C.getBroadcastDims(t,o),m=C.getBroadcastDims(n,o),f=C.mergeRealAndImagArrays(a,r),A=C.mergeRealAndImagArrays(s,i),y=t.length,g=k.computeStrides(t),x=n.length,w=k.computeStrides(n);if(h.length+m.length===0)for(let b=0;bN[P]=0);let T=k.locToIndex(N,y,g),R=v.slice(-x);m.forEach(P=>R[P]=0);let $=k.locToIndex(R,x,w),O=e(f[T*2],f[T*2+1],A[$*2],A[$*2+1]);p[b]=O.real,c[b]=O.imag}return[p,c,o]}}var O3=Rt((e,t)=>e+t),p$=KA((e,t,n,a)=>({real:e+n,imag:t+a})),pd=qt(Nr,O3,p$),c$={kernelName:Nr,backendName:"cpu",kernelFunc:pd};function ZA(e,t,n,a,r){let s=k.sizeFromShape(a),i=k.makeZerosTypedArray(r,n);for(let o=0;o=r||(s>0?i[l]+=t[o]:i[l]+=1)}return i}function _3(e,t,n,a=!1){let r=e.shape[0],s=e.shape[1],i=We([r,n],t.dtype);for(let o=0;o=n||(a?i.set(1,o,u):t.size>0?i.set(i.get(o,u)+t.get(o,l),o,u):i.set(i.get(o,u)+1,o,u))}return i}function El(e){return(t,n,a)=>{let r=k.getTypedArrayFromDType(n,t.length);for(let s=0;s{let{x:i}=a;if(ve(i,e),i.dtype==="string"||n==="string")throw new Error("unaryKernelFunc does not support string input/output");let o=s,l=o.data.get(i.dataId).values,u=k.sizeFromShape(i.shape),d=n||i.dtype,p=k.getArrayFromDType(d,u);for(let c=0;c{let{x:i}=a;if(ve(i,e),i.dtype==="string"||n==="string")throw new Error("unaryKernelFunc does not support string input/output");let o=s,l=o.data.get(i.dataId).values,u=n||i.dtype,d=t(l,u,r);return o.makeTensorInfo(i.shape,u,d)}}var P3=El(e=>Math.ceil(e)),h$=Cl(hs,P3),f$={kernelName:hs,backendName:"cpu",kernelFunc:h$};function YA(e,t,n,a){let r=k.getArrayFromDType(n,k.sizeFromShape(t));if(a&&n!=="string"){let s=0;e.forEach(i=>{let o=k.sizeFromShape(i.shape);r.set(i.vals,s),s+=o})}else{let s=0;e.forEach(i=>{let o=n==="string"?C.fromUint8ToStringArray(i.vals):i.vals,l=0;for(let u=0;uMath.exp(e)),W3=Cl(bs,L3),m$={kernelName:bs,backendName:"cpu",kernelFunc:W3},B3=El(e=>Math.expm1(e)),A$=Cl(wo,B3),y$={kernelName:wo,backendName:"cpu",kernelFunc:A$},V3=El(e=>Math.floor(e)),g$=Cl(vs,V3),x$={kernelName:vs,backendName:"cpu",kernelFunc:g$};function j3(e,t,n){let a=We(n,e.dtype);for(let r=0;re>t?1:0),b$=qt(No,U3,null,"bool"),v$={kernelName:No,backendName:"cpu",kernelFunc:b$},H3=Rt((e,t)=>eMath.log(e)),I$=Cl(Ts,q3),S$={kernelName:Ts,backendName:"cpu",kernelFunc:I$};function X3(e,t,n,a){let r=k.getTypedArrayFromDType(a,k.sizeFromShape(n));for(let s=0;so&&(o=u)}r[s]=o}return r}var K3=Rt((e,t)=>Math.max(e,t)),N$=qt(Cs,K3),T$={kernelName:Cs,backendName:"cpu",kernelFunc:N$},Z3=Rt((e,t)=>Math.min(e,t)),E$=qt($s,Z3),C$={kernelName:$s,backendName:"cpu",kernelFunc:E$},JA=Rt((e,t)=>e*t),R$=KA((e,t,n,a)=>({real:e*n-t*a,imag:e*a+t*n})),dh=qt(zs,JA,R$),M$={kernelName:zs,backendName:"cpu",kernelFunc:dh};function Y3(e,t,n){let a=k.createScalarValue(-1,n);return JA([],t,a,e,n)}function F$(e){let{inputs:t,backend:n}=e,{x:a}=t;ve(a,"neg");let r=n.data.get(a.dataId).values,[s,i]=Y3(r,a.shape,a.dtype);return n.makeTensorInfo(i,a.dtype,s)}var $$={kernelName:zo,backendName:"cpu",kernelFunc:F$},J3=Rt((e,t)=>e!==t?1:0),D$=qt(Oo,J3,null,"bool"),z$={kernelName:Oo,backendName:"cpu",kernelFunc:D$};function QA(e,t,n,a,r){let s=t.length,i=k.sizeFromShape(t),o=k.computeStrides(t),l=k.computeStrides(r),u=k.getTypedArrayFromDType(n,k.sizeFromShape(r));for(let d=0;dn.disposeIntermediateTensorInfo(g)),n.makeTensorInfo(y,A,m)}var P$={kernelName:Vo,backendName:"cpu",kernelFunc:_$};function e1(e,t,n,a){let r=e===t,s=e1;if(r||s||i)return k.makeZerosTypedArray(0,a);let o=Math.abs(Math.ceil((t-e)/n)),l=k.makeZerosTypedArray(o,a);t1/Math.sqrt(e)),L$=Cl(Hs,e7),W$={kernelName:Hs,backendName:"cpu",kernelFunc:L$};function ph(e,t,n,a,r){let s=ln.isSliceContinous(a,t,n),i=k.sizeFromShape(n),o=k.computeStrides(a);if(s){let p=ln.computeFlatOffset(t,o);return r==="string"?e.slice(p,p+i):e.subarray(p,p+i)}let l=r==="string"?C.fromUint8ToStringArray(e):e,u=We(a,r,l),d=We(n,r);for(let p=0;pm+t[f]);d.set(u.get(...h),...c)}return r==="string"?C.fromStringArrayToUint8(d.values):d.values}function vi(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{begin:s,size:i}=a;ve(r,"slice");let[o,l]=ln.parseSliceParams(r,s,i);ln.assertParamsValid(r,o,l);let u=n.data.get(r.dataId).values,d=ph(u,o,l,r.shape,r.dtype);return n.makeTensorInfo(l,r.dtype,d)}var B$={kernelName:Xo,backendName:"cpu",kernelFunc:vi};function t7(e,t,n,a,r,s,i){let o=t[0],l=s[0],u=new Array(l),d=new Array(o),p=t[1];if(l===0){if(o!==0)throw new Error(`Received SparseTensor with denseShape[0] = 0 but - indices.shape[0] = ${o}`);let A=k.getArrayFromDType(n,0),y=k.getArrayFromDType(r,0);return[A,[0,p],y,u,d]}let c=!0,h=0,m=new Array(l).fill(0);for(let A=0;A=l)throw new Error(`indices(${A}, 0) is invalid: ${y} >= ${l}`);++m[y],c=c&&y>=h,h=y}let f=!0;for(let A=0;A0&&(m[A]+=m[A-1])}if(f&&c){let A=e,y=a;for(let g=0;g0){h[c-1]=1;for(let A=c-2;A>=0;--A)h[A]=h[A+1]*a[A+1]}let m=[];if(o>0){m[o-1]=1;for(let A=o-2;A>=0;--A)m[A]=m[A+1]*l[A+1]}let f=k.getArrayFromDType(n,i*o);for(let A=0;A{let n=e-t;return n*n}),V$=qt(Ys,a7),j$={kernelName:Ys,backendName:"cpu",kernelFunc:V$};function r7(e,t,n,a){let r=We(e,t.dtype);for(let s=0;se-t),U$=KA((e,t,n,a)=>({real:e-n,imag:t-a})),t1=qt(Js,s7,U$),H$={kernelName:Js,backendName:"cpu",kernelFunc:t1};function i7(e,t){let n=new Array(e.rank);for(let r=0;rx.value-g.value);let f=p*a,A=l.subarray(f,f+a),y=u.subarray(f,f+a);for(let g=0;g{for(let A=0;Anew lh,1);var d7=at(go,e=>e>=0?e:Math.exp(e)-1),G$={kernelName:go,backendName:"cpu",kernelFunc:d7};function p7(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{alpha:s}=a;ve([r],"leakyRelu");let i=k.sizeFromShape(r.shape),o=n.data.get(r.dataId).values,l=k.getTypedArrayFromDType("float32",i);for(let u=0;ue<0?t*e:e);function c7(e){let{inputs:t,backend:n}=e,{x:a,alpha:r}=t;ve([a,r],"prelu");let s=n.data.get(a.dataId).values,i=n.data.get(r.dataId).values,[o,l]=X$(a.shape,r.shape,s,i,a.dtype);return n.makeTensorInfo(l,a.dtype,o)}var K$={kernelName:Ls,backendName:"cpu",kernelFunc:c7},h7=at(Ws,e=>Math.max(0,e)),Z$={kernelName:Ws,backendName:"cpu",kernelFunc:h7},f7=at(Vs,e=>Math.min(Math.max(0,e),6)),Y$={kernelName:Vs,backendName:"cpu",kernelFunc:f7},m7=at(qs,e=>1/(1+Math.exp(-e))),J$={kernelName:qs,backendName:"cpu",kernelFunc:m7};function n1(e,t,n,a,r){if(n==="linear")return Ua({inputs:{x:t},backend:e});if(n==="relu")return h7({inputs:{x:t},backend:e});if(n==="elu")return d7({inputs:{x:t},backend:e});if(n==="relu6")return f7({inputs:{x:t},backend:e});if(n==="prelu")return c7({inputs:{x:t,alpha:a},backend:e});if(n==="leakyrelu")return p7({inputs:{x:t},backend:e,attrs:{alpha:r}});if(n==="sigmoid")return m7({inputs:{x:t},backend:e});throw new Error(`Activation ${n} has not been implemented for the CPU backend.`)}function ct(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{shape:s}=a,i=k.sizeFromShape(r.shape),o=k.inferFromImplicitShape(s,i),l=k.sizeFromShape(o);k.assert(i===l,()=>`The new shape (${o}) has ${l} elements and the old shape (${r.shape}) has ${i} elements. The new shape and old shape must have the same number of elements.`),n.incRef(r.dataId);let u=n.data.get(r.dataId);if(u.complexTensorInfos!=null){let d=u.complexTensorInfos.real,p=u.complexTensorInfos.imag;d.shape=o,p.shape=o}return{dataId:r.dataId,shape:o,dtype:r.dtype}}var Q$={kernelName:Uo,backendName:"cpu",kernelFunc:ct};function A7(e){let{inputs:t,backend:n,attrs:a}=e,{a:r,b:s}=t,{transposeA:i,transposeB:o}=a;ve([r,s],"matMul");let l=r.shape.length,u=s.shape.length,d=i?r.shape[l-2]:r.shape[l-1],p=o?s.shape[u-1]:s.shape[u-2],c=i?r.shape[l-1]:r.shape[l-2],h=o?s.shape[u-2]:s.shape[u-1],m=r.shape.slice(0,-2),f=s.shape.slice(0,-2),A=k.sizeFromShape(m),y=k.sizeFromShape(f),g=A===y||A===1||y===1;k.assert(l>=2&&u>=2&&g,()=>`Error in matMul: the input batch dimensions must either be the same or at least one input batch dimension must be 1. Got input batch dimensions of (${m}) and (${f}).`);let x=(A>y?r.shape.slice(0,-2):s.shape.slice(0,-2)).concat([c,h]);k.assert(d===p,()=>`Error in matMul: inner shapes (${d}) and (${p}) of Tensors with shapes ${r.shape} and ${s.shape} and transposeA=${i} and transposeB=${o} must match.`);let w=i?[A,d,c]:[A,c,d],b=o?[y,h,p]:[y,p,h],v=ct({inputs:{x:r},backend:n,attrs:{shape:w}}),N=ct({inputs:{x:s},backend:n,attrs:{shape:b}}),T=i?v.shape[1]:v.shape[2],R=i?v.shape[2]:v.shape[1],$=o?N.shape[1]:N.shape[2],O=Math.max(A,y),P=n.data.get(v.dataId).values,V=n.data.get(N.dataId).values,j=k.computeStrides(v.shape),U=k.computeStrides(N.shape),[X,G,ee]=i?[j[0],1,j[1]]:[j[0],j[1],1],[Y,re,ne]=o?[1,U[1],U[0]]:[U[1],1,U[0]],ie=R*$,Q=We([O,R,$],v.dtype),de=Q.values,oe=n.blockSize;for(let ye=0;yeMath.acos(e)),rD={kernelName:ro,backendName:"cpu",kernelFunc:aD},sD=at(so,e=>Math.acosh(e)),iD={kernelName:so,backendName:"cpu",kernelFunc:sD};function oD(e){let{inputs:t,backend:n}=e,a=t;ve(t,"addN");let r=a.map(o=>n.data.get(o.dataId).values),s=We(a[0].shape,a[0].dtype),i=s.values;for(let o=0;og&&(g=b,x=w)}h[A]=x}return u.forEach(A=>n.disposeIntermediateTensorInfo(A)),n.makeTensorInfo(d,"int32",h)}var fD={kernelName:us,backendName:"cpu",kernelFunc:hD};function mD(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{axis:s}=a;ve(r,"argMin");let i=k.parseAxisParam(s,r.shape),o=C.getAxesPermutation(i,r.shape.length),l=r,u=[];o!=null&&(l=Jn({inputs:{x:r},backend:n,attrs:{perm:o}}),u.push(l),i=C.getInnerMostAxes(i.length,l.shape.length)),i=[i[0]],C.assertAxesAreInnerMostDims("argMin",i,l.shape.length);let[d,p]=C.computeOutAndReduceShapes(l.shape,i),c=k.sizeFromShape(d),h=k.makeZerosTypedArray(c,"int32"),m=k.sizeFromShape(p),f=n.data.get(l.dataId).values;for(let A=0;An.disposeIntermediateTensorInfo(A)),n.makeTensorInfo(d,"int32",h)}var AD={kernelName:vu,backendName:"cpu",kernelFunc:mD},yD=at(lo,e=>Math.asin(e)),gD={kernelName:lo,backendName:"cpu",kernelFunc:yD},xD=at(uo,e=>Math.asinh(e)),bD={kernelName:uo,backendName:"cpu",kernelFunc:xD},vD=at(po,e=>Math.atan(e)),wD={kernelName:po,backendName:"cpu",kernelFunc:vD},kD=Rt((e,t)=>Math.atan2(e,t)),ID=qt(ho,kD),SD={kernelName:ho,backendName:"cpu",kernelFunc:ID},ND=at(co,e=>Math.atanh(e)),TD={kernelName:co,backendName:"cpu",kernelFunc:ND};function a1(e,t,n,a,r,s){let i=r.strideHeight,o=r.strideWidth,l=r.dilationHeight,u=r.dilationWidth,d=r.effectiveFilterHeight,p=r.effectiveFilterWidth,c=r.padInfo.top,h=r.padInfo.left,m=s==="max"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,f=We(r.outShape,n),A=f.values,y=r.outShape[1]*r.outShape[2]*r.outShape[3],g=r.outShape[2]*r.outShape[3],x=r.outShape[3];for(let w=0;wG?G=oe:s==="avg"&&(ee+=oe,Y++)}if(isNaN(G))break}let re=P+V*x+N;A[re]=s==="avg"?ee/Y:G}}}return f}function y7(e,t,n,a,r=!1,s=!1){let i=We(a.outShape,"int32"),o=a.strideHeight,l=a.strideWidth,u=a.dilationHeight,d=a.dilationWidth,p=a.effectiveFilterHeight,c=a.effectiveFilterWidth,h=a.padInfo.top,m=a.padInfo.left,f=We(t,n,e);for(let A=0;A$&&($=X,r?O=s?((A*a.inHeight+P)*a.inWidth+j)*a.inChannels+y:(P*a.inWidth+j)*a.inChannels+y:O=V*c+U)}}i.set(O,A,g,v,y)}}return i}function g7(e,t,n,a,r,s){let i=r.strideDepth,o=r.strideHeight,l=r.strideWidth,u=r.dilationDepth,d=r.dilationHeight,p=r.dilationWidth,c=r.effectiveFilterDepth,h=r.effectiveFilterHeight,m=r.effectiveFilterWidth,f=r.padInfo.front,A=r.padInfo.top,y=r.padInfo.left,g=s==="max"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,x=We(r.outShape,n),w=x.values,b=r.outShape[1]*r.outShape[2]*r.outShape[3]*r.outShape[4],v=r.outShape[2]*r.outShape[3]*r.outShape[4],N=r.outShape[3]*r.outShape[4],T=r.outShape[4];for(let R=0;RIe?Ie=Ve:s==="avg"&&(Ne+=Ve,$e++),isNaN(Ie))break}if(isNaN(Ie))break}if(isNaN(Ie))break}let Oe=he+P;w[Oe]=s==="avg"?Ne/$e:Ie}}}}return x}function ED(e,t){let n=We(t.outShape,"int32"),a=t.strideDepth,r=t.strideHeight,s=t.strideWidth,i=t.dilationDepth,o=t.dilationHeight,l=t.dilationWidth,u=t.effectiveFilterDepth,d=t.effectiveFilterHeight,p=t.effectiveFilterWidth,c=t.padInfo.front,h=t.padInfo.top,m=t.padInfo.left;for(let f=0;f=V&&(V=ne,j=X*d*p+ee*d+re)}}}n.set(j,f,y,b,R,A)}}}return n}function CD(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t;ve(r,"avgPool");let{filterSize:s,strides:i,pad:o,dimRoundingMode:l}=a,u=1;k.assert(C.eitherStridesOrDilationsAreOne(i,u),()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${i} and dilations '${u}'`);let d=C.computePool2DInfo(r.shape,s,i,u,o,l),p;if(d.filterWidth===1&&d.filterHeight===1&&k.arraysEqual(d.inShape,d.outShape))p=Ua({inputs:{x:r},backend:n});else{let c=n.data.get(r.dataId).values,h=k.computeStrides(r.shape),m=a1(c,r.shape,r.dtype,h,d,"avg");p=n.makeTensorInfo(d.outShape,r.dtype,m.values)}return p}var RD={kernelName:ds,backendName:"cpu",kernelFunc:CD};function MD(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{filterSize:s,strides:i,pad:o,dimRoundingMode:l,dataFormat:u}=a;ve(r,"avgPool3d");let d=C.computePool3DInfo(r.shape,s,i,1,o,l,u),p=n.data.get(r.dataId).values,c=g7(p,r.shape,r.dtype,k.computeStrides(r.shape),d,"avg");return n.makeTensorInfo(c.shape,"float32",c.values)}var FD={kernelName:wu,backendName:"cpu",kernelFunc:MD};function $D(e){let{inputs:t,backend:n,attrs:a}=e,{dy:r,input:s}=t,{filterSize:i,strides:o,pad:l,dimRoundingMode:u}=a;ve([r,s],"avgPool3DGrad");let d=C.computePool3DInfo(s.shape,i,o,1,l,u),p=d.strideDepth,c=d.strideHeight,h=d.strideWidth,m=d.filterDepth,f=d.filterHeight,A=d.filterWidth,y=d.dilationDepth,g=d.dilationHeight,x=d.dilationWidth,w=d.effectiveFilterDepth,b=d.effectiveFilterHeight,v=d.effectiveFilterWidth,N=w-1-d.padInfo.front,T=v-1-d.padInfo.left,R=b-1-d.padInfo.top,$=We(s.shape,"float32"),O=1/(m*f*A),P=n.bufferSync(r);for(let V=0;V=d.outDepth||Math.floor(Q)!==Q))for(let de=0;de=d.outHeight||Math.floor(oe)!==oe))for(let ye=0;ye=d.outWidth||Math.floor(he)!==he||(ne+=P.get(V,Q,oe,he,j))}}}$.set(ne*O,V,U,X,G,j)}return n.makeTensorInfo($.shape,$.dtype,$.values)}var DD={kernelName:zp,backendName:"cpu",kernelFunc:$D};function zD(e){let{inputs:t,backend:n,attrs:a}=e,{dy:r,input:s}=t,i=s;ve([r,s],"avgPoolGrad");let{filterSize:o,strides:l,pad:u}=a,d=C.computePool2DInfo(i.shape,o,l,1,u),p=d.strideHeight,c=d.strideWidth,h=d.filterHeight,m=d.filterWidth,f=d.dilationHeight,A=d.dilationWidth,y=d.effectiveFilterHeight,g=d.effectiveFilterWidth,x=g-1-d.padInfo.left,w=y-1-d.padInfo.top,b=We(i.shape,"float32"),v=1/(h*m),N=n.data.get(r.dataId).values,T=We(r.shape,"float32",N);for(let R=0;R=d.outHeight||Math.floor(G)!==G))for(let ee=0;ee=d.outWidth||Math.floor(Y)!==Y||(U+=T.get(R,G,Y,$))}}b.set(U*v,R,O,P,$)}return n.makeTensorInfo(b.shape,b.dtype,b.values)}var OD={kernelName:Dp,backendName:"cpu",kernelFunc:zD};function _D(e){let{inputs:t,backend:n,attrs:a}=e,{x:r,scale:s,offset:i,mean:o,variance:l}=t;k.assert(o.shape.length===l.shape.length,()=>"Batch normalization gradient requires mean and variance to have equal ranks."),k.assert(i==null||o.shape.length===i.shape.length,()=>"Batch normalization gradient requires mean and offset to have equal ranks."),k.assert(s==null||o.shape.length===s.shape.length,()=>"Batch normalization gradient requires mean and scale to have equal ranks."),ve([r,o,l,s,i],"batchNorm");let{varianceEpsilon:u}=a;u==null&&(u=.001);let d=n.data.get(r.dataId).values,p=n.data.get(o.dataId).values,c=n.data.get(l.dataId).values,h=s?n.data.get(s.dataId).values:new Float32Array([1]),m=i?n.data.get(i.dataId).values:new Float32Array([0]),f=new Float32Array(d.length),A=m.length,y=h.length,g=c.length,x=p.length,w=0,b=0,v=0,N=0;for(let T=0;T=A&&(w=0),b>=x&&(b=0),v>=y&&(v=0),N>=g&&(N=0);return n.makeTensorInfo(r.shape,r.dtype,f)}var PD={kernelName:ks,backendName:"cpu",kernelFunc:_D};function LD(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{blockShape:s,crops:i}=a;ve([r],"batchToSpaceND");let o=s.reduce((y,g)=>y*g),l=C.getReshaped(r.shape,s,o),u=C.getPermuted(l.length,s.length),d=C.getReshapedPermuted(r.shape,s,o),p=C.getSliceBeginCoords(i,s.length),c=C.getSliceSize(d,i,s.length),h=ct({inputs:{x:r},backend:n,attrs:{shape:l}}),m=Jn({inputs:{x:h},backend:n,attrs:{perm:u}}),f=ct({inputs:{x:m},backend:n,attrs:{shape:d}}),A=vi({inputs:{x:f},backend:n,attrs:{begin:p,size:c}});return n.disposeIntermediateTensorInfo(h),n.disposeIntermediateTensorInfo(m),n.disposeIntermediateTensorInfo(f),A}var WD={kernelName:ku,backendName:"cpu",kernelFunc:LD};function BD(e){let{inputs:t,backend:n,attrs:a}=e,{x:r,weights:s}=t,{size:i}=a,o=n.data.get(r.dataId).values,l=n.data.get(s.dataId).values,u=ZA(o,l,s.dtype,s.shape,i);return n.makeTensorInfo([i],s.dtype,u)}var VD={kernelName:Op,backendName:"cpu",kernelFunc:BD},jD=at(Tr,(e,t)=>{let n=t;return e>n.clipValueMax?n.clipValueMax:e{let{x:t}=e.inputs,n=e.backend,a=new Float32Array(k.sizeFromShape(t.shape)),r=n.data.get(t.dataId),s=r.complexTensorInfos.real,i=r.complexTensorInfos.imag,o=n.data.get(s.dataId).values,l=n.data.get(i.dataId).values;for(let u=0;uf.shape),s);if(k.sizeFromShape(i)===0)return n.makeTensorInfo(i,t[0].dtype,[]);let o=t.filter(f=>k.sizeFromShape(f.shape)>0);if(o.length===1)return Ua({inputs:{x:o[0]},backend:n});let l=o.map(f=>f.shape);if(C.assertParamsConsistent(l,s),o[0].dtype==="complex64"){let f=o.map(w=>bi({inputs:{input:w},backend:n})),A=o.map(w=>Rl({inputs:{input:w},backend:n})),y=Ml({inputs:f,backend:n,attrs:{axis:s}}),g=Ml({inputs:A,backend:n,attrs:{axis:s}}),x=Ln({inputs:{real:y,imag:g},backend:n});return f.forEach(w=>n.disposeIntermediateTensorInfo(w)),A.forEach(w=>n.disposeIntermediateTensorInfo(w)),n.disposeIntermediateTensorInfo(y),n.disposeIntermediateTensorInfo(g),x}let u=o.map(f=>{let A=k.sizeFromShape(f.shape.slice(s));return ct({inputs:{x:f},backend:n,attrs:{shape:[-1,A]}})}),d=u.map(f=>({vals:n.data.get(f.dataId).values,shape:f.shape}));i=C.computeOutShape(u.map(f=>f.shape),1);let p=u[0].shape[0]===1,c=YA(d,i,t[0].dtype,p),h=C.computeOutShape(o.map(f=>f.shape),s),m=n.makeTensorInfo(h,t[0].dtype,c);return u.forEach(f=>n.disposeIntermediateTensorInfo(f)),m}var XD={kernelName:fo,backendName:"cpu",kernelFunc:Ml};function x7(e){let{inputs:t,backend:n,attrs:a}=e,{x:r,filter:s}=t,{strides:i,pad:o,dataFormat:l,dilations:u,dimRoundingMode:d}=a;ve([r,s],"conv2d");let p=C.convertConv2DDataFormat(l),c=C.computeConv2DInfo(r.shape,s.shape,i,u,o,d,!1,p),h=c.filterHeight,m=c.filterWidth,f=c.dilationHeight,A=c.dilationWidth,y=c.padInfo.left,g=c.padInfo.top,x=c.dataFormat==="channelsLast",w=new Ot(c.outShape,r.dtype),b=k.computeStrides(r.shape),v=k.computeStrides(s.shape),N=b[0],T=x?b[1]:b[2],R=x?b[2]:1,$=x?1:b[1],O=w.strides[0],P=x?w.strides[1]:w.strides[2],V=x?w.strides[2]:1,j=x?1:w.strides[1],U=n.data.get(r.dataId).values,X=n.data.get(s.dataId).values,G=w.values;for(let ee=0;ee=c.inHeight)continue;let ye=de*v[0],he=Y+oe*T;for(let Ie=0;Ie=c.inWidth)continue;let Qe=ye+Oe*v[1],et=he+De*R,st=Qe;for(let Ke=0;Ke=u.inDepth)continue;let ee=X*R[0],Y=O+G*T[1];for(let re=0;re=u.inHeight)continue;let oe=ee+Q*R[1],ye=Y+de*T[2];for(let he=0;he=u.inWidth)continue;let De=oe+$e*R[2],Qe=ye+Oe*u.inChannels,et=De;for(let st=0;stMath.cos(e)),oz={kernelName:As,backendName:"cpu",kernelFunc:iz},lz=at(mo,e=>Math.cosh(e)),uz={kernelName:mo,backendName:"cpu",kernelFunc:lz};function dz(e){let{inputs:t,backend:n,attrs:a}=e,{image:r,boxes:s,boxInd:i}=t,{cropSize:o,method:l,extrapolationValue:u}=a,[d,p,c,h]=r.shape,m=s.shape[0],[f,A]=o,y=We([m,f,A,h],"float32"),g=n.data.get(s.dataId).values,x=n.data.get(i.dataId).values,w=n.data.get(r.dataId).values,b=k.computeStrides(r.shape),v=k.computeStrides(y.shape);for(let N=0;N=d)continue;let j=f>1?(O-R)*(p-1)/(f-1):0,U=A>1?(P-$)*(c-1)/(A-1):0;for(let X=0;X1?R*(p-1)+X*j:.5*(R+O)*(p-1);if(G<0||G>p-1){for(let ee=0;ee1?$*(c-1)+ne*U:.5*($+P)*(c-1);if(ie<0||ie>c-1){for(let ye=0;ye1?$*(c-1)+ee*U:.5*($+P)*(c-1);if(Y<0||Y>c-1){for(let ie=0;iey+m-g-1:(y,g)=>y+g;for(let y=0;y`Only NHWC dataFormat supported on CPU for depthToSpace. Got ${i}`),k.assert(s>1,()=>`blockSize should be > 1 for depthToSpace, but was: ${s}`);let o=r.shape[0],l=r.shape[1],u=r.shape[2],d=r.shape[3],p=l*s,c=u*s,h=d/(s*s),m=n.data.get(r.dataId).values,f=new Float32Array(o*p*c*h),A=0;for(let y=0;y`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${i} and dilations '${c}'`);let h=C.computeConv2DInfo(r.shape,s.shape,i,c,o,u,!0),{filterHeight:m,filterWidth:f,dilationHeight:A,dilationWidth:y,padInfo:g}=h,x=g.left,w=g.top,b=h.outChannels/h.inChannels,v=new Ot(h.outShape,r.dtype),N=n.data.get(r.dataId).values,T=n.data.get(s.dataId).values,R=v.values;for(let $=0;$=h.inHeight)continue;let ee=X*p[0],Y=O+G*d[1];for(let re=0;re=h.inWidth)continue;let oe=ee+Q*p[1],ye=Y+de*h.inChannels,he=ne,Ie=oe;for(let Ne=0;Ne{let{x:a,filter:r}=e,{strides:s,pad:i,dilations:o}=n,l=t,u=l.data.get(a.dataId).values,d=a.shape.length,p=l.data.get(r.dataId).values,c=r.shape.length,{batchSize:h,inHeight:m,inWidth:f,inChannels:A,outHeight:y,outWidth:g,padInfo:x,strideHeight:w,strideWidth:b,filterHeight:v,filterWidth:N,dilationHeight:T,dilationWidth:R,outShape:$}=C.computeDilation2DInfo(a.shape,r.shape,s,i,"NHWC",o),O=k.sizeFromShape($),P=$.length,V=k.getArrayFromDType(a.dtype,O);for(let j=0;j=0&&Q=0&&oere&&(re=Ie)}}}let ne=k.locToIndex([j,U,G,Y],P,k.computeStrides($));V[ne]=re}}}return{dataId:l.write(k.toTypedArray(V,a.dtype),$,a.dtype),shape:$,dtype:a.dtype}}},Nz={kernelName:Gp,backendName:"cpu",kernelFunc:({inputs:e,backend:t,attrs:n})=>{let{x:a,filter:r,dy:s}=e,{strides:i,pad:o,dilations:l}=n,u=t,d=k.toNestedArray(a.shape,u.data.get(a.dataId).values),p=k.toNestedArray(r.shape,u.data.get(r.dataId).values),{batchSize:c,inHeight:h,inWidth:m,inChannels:f,outHeight:A,outWidth:y,padInfo:g,strideHeight:x,strideWidth:w,filterHeight:b,filterWidth:v,dilationHeight:N,dilationWidth:T,outShape:R}=C.computeDilation2DInfo(a.shape,r.shape,i,o,"NHWC",l);k.assert(s.rank===R.length,()=>`Error in ${Gp}, dy must have the same rank as output ${R.length}, but got ${s.rank}`);let $=k.toNestedArray(R,u.data.get(s.dataId).values),O=k.makeZerosNestedTypedArray(r.shape,r.dtype);for(let P=0;P=0&&ie=0&&deee&&(ee=oe,Y=ne,re=Q)}}}O[Y][re][G]+=$[P][V][U][G]}}}return{dataId:u.write(k.toTypedArray(O,a.dtype),r.shape,r.dtype),shape:r.shape,dtype:r.dtype}}},Tz={kernelName:Hp,backendName:"cpu",kernelFunc:({inputs:e,backend:t,attrs:n})=>{let{x:a,filter:r,dy:s}=e,{strides:i,pad:o,dilations:l}=n,u=t,d=k.toNestedArray(a.shape,u.data.get(a.dataId).values),p=k.toNestedArray(r.shape,u.data.get(r.dataId).values),{batchSize:c,inHeight:h,inWidth:m,inChannels:f,outHeight:A,outWidth:y,padInfo:g,strideHeight:x,strideWidth:w,filterHeight:b,filterWidth:v,dilationHeight:N,dilationWidth:T,outShape:R}=C.computeDilation2DInfo(a.shape,r.shape,i,o,"NHWC",l);k.assert(s.rank===R.length,()=>`Error in ${Hp}, dy must have the same rank as output ${R.length}, but got ${s.rank}`);let $=k.toNestedArray(R,u.data.get(s.dataId).values),O=k.makeZerosNestedTypedArray(a.shape,a.dtype);for(let P=0;P=0&&ie=0&&deee&&(ee=oe,Y=ie,re=de)}}}O[P][Y][re][G]+=$[P][V][U][G]}}}return{dataId:u.write(k.toTypedArray(O,a.dtype),a.shape,a.dtype),shape:a.shape,dtype:a.dtype}}};function cd(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{axis:s,keepDims:i}=a;ve(r,"sum");let o;r.dtype==="bool"?o=Wr({inputs:{x:r},backend:n,attrs:{dtype:"int32"}}):o=Ua({inputs:{x:r},backend:n});let l=o.shape.length,u=k.parseAxisParam(s,o.shape),d=C.getAxesPermutation(u,l),p=u,c=o;d!=null&&(c=Jn({inputs:{x:o},backend:n,attrs:{perm:d}}),p=C.getInnerMostAxes(p.length,l)),C.assertAxesAreInnerMostDims("sum",p,c.shape.length);let[h,m]=C.computeOutAndReduceShapes(c.shape,p),f=C.upcastType(c.dtype,"int32"),A=uh(n,h,f),y=k.sizeFromShape(m),g=n.data.get(A.dataId).values,x=n.data.get(c.dataId).values;for(let w=0;w=0&&(c=cd({inputs:{x:c},backend:n,attrs:{axis:u[f]-(i.length-h),keepDims:!1}}),m.push(c)),h--)}for(let f of m)f!==c&&n.disposeIntermediateTensorInfo(f);return c}var Rz={kernelName:qp,backendName:"cpu",kernelFunc:Cz};function Mz(e){let{inputs:t,backend:n}=e,{dy:a,y:r}=t;ve([a,r],"eluGrad");let s=new Float32Array(k.sizeFromShape(r.shape)),i=n.data.get(r.dataId).values,o=n.data.get(a.dataId).values;for(let l=0;l=1?s[l]=o[l]:s[l]=o[l]*(u+1)}return n.makeTensorInfo(r.shape,"float32",s)}var Fz={kernelName:Xp,backendName:"cpu",kernelFunc:Mz},$z=Rt((e,t)=>e===t?1:0),v7=qt(bo,$z,null,"bool"),Dz={kernelName:bo,backendName:"cpu",kernelFunc:v7},zz=C.ERF_P,Oz=C.ERF_A1,_z=C.ERF_A2,Pz=C.ERF_A3,Lz=C.ERF_A4,Wz=C.ERF_A5,Bz=at(xo,e=>{let t=Math.sign(e),n=Math.abs(e),a=1/(1+zz*n);return t*(1-((((Wz*a+Lz)*a+Pz)*a+_z)*a+Oz)*a*Math.exp(-n*n))}),Vz={kernelName:xo,backendName:"cpu",kernelFunc:Bz};function ch(e){let{inputs:t,backend:n,attrs:a}=e,{input:r}=t,{dim:s}=a,i=r.shape.length,o=r.shape.slice(),l=s;return s<0&&(k.assert(-(i+1)<=s,()=>`Axis must be in the interval [${-(i+1)}, ${i}]`),l=i+s+1),o.splice(l,0,1),ct({inputs:{x:r},backend:n,attrs:{shape:o}})}var jz={kernelName:vo,backendName:"cpu",kernelFunc:ch},Uz=Rt((e,t)=>e/t),r1=qt(xs,Uz),s1={kernelName:xs,backendName:"cpu",kernelFunc:r1};function w7(e,t,n){let a=e.shape,r=a[0],s=a[1],i=n.data.get(e.dataId),o=i.complexTensorInfos.real,l=i.complexTensorInfos.imag,u=[r,s],d=k.sizeFromShape(u),p=k.getTypedArrayFromDType("float32",d),c=k.getTypedArrayFromDType("float32",d);for(let A=0;A{let{image:a}=e,r=n,s=k.getTypedArrayFromDType(a.dtype,k.sizeFromShape(a.shape)),[i,o,l,u]=a.shape,d=r.data.get(a.dataId).values;for(let p=0;p=0&&xMath.floor(e/t)),eO=qt(ws,Qz,null,"int32"),tO={kernelName:ws,backendName:"cpu",kernelFunc:eO};function nO(e){let{inputs:t,backend:n,attrs:a}=e,{x:r,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:u,dataFormat:d,dilations:p,dimRoundingMode:c,activation:h,leakyreluAlpha:m}=a,f=x7({inputs:{x:r,filter:s},backend:n,attrs:{strides:l,pad:u,dataFormat:d,dilations:p,dimRoundingMode:c}});if(i){let A=f;f=pd({inputs:{a:f,b:i},backend:n}),n.disposeIntermediateTensorInfo(A)}if(h){let A=f;f=n1(n,f,h,o,m),n.disposeIntermediateTensorInfo(A)}return f}var aO={kernelName:ai,backendName:"cpu",kernelFunc:nO};function rO(e){let{inputs:t,backend:n,attrs:a}=e,{x:r,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:u,dataFormat:d,dilations:p,dimRoundingMode:c,activation:h,leakyreluAlpha:m}=a,f=b7({inputs:{x:r,filter:s},backend:n,attrs:{strides:l,pad:u,dataFormat:d,dilations:p,dimRoundingMode:c}});if(i){let A=f;f=pd({inputs:{a:f,b:i},backend:n}),n.disposeIntermediateTensorInfo(A)}if(h){let A=f;f=n1(n,f,h,o,m),n.disposeIntermediateTensorInfo(A)}return f}var sO={kernelName:ri,backendName:"cpu",kernelFunc:rO};function iO(e){let{inputs:t,backend:n}=e,{params:a,indices:r}=t,s=k.sizeFromShape(a.shape),i=r.shape,o=i[i.length-1],[l,u,d,p]=C.prepareAndValidate(a,r);if(u===0)return n.makeTensorInfo(l,a.dtype,[]);let c=We([u,d],a.dtype),h=n.data.get(r.dataId).values,m=n.data.get(a.dataId).values;for(let f=0;f=s/d)throw new Error(`Invalid indices: ${A} does not index into ${a.shape}`);for(let g=0;ge>=t?1:0),pO=qt(Is,dO,null,"bool"),cO={kernelName:Is,backendName:"cpu",kernelFunc:pO};function hO(e){let{inputs:t,backend:n}=e,{input:a}=t,r=k.sizeFromShape(a.shape),s=a.shape[a.shape.length-1],i=r/s,o=ct({inputs:{x:a},backend:n,attrs:{shape:[i,s]}}),l=w7(o,!0,n),u=ct({inputs:{x:l},backend:n,attrs:{shape:a.shape}});return n.disposeIntermediateTensorInfo(o),n.disposeIntermediateTensorInfo(l),u}var fO={kernelName:Zp,backendName:"cpu",kernelFunc:hO},mO=at(To,e=>Number.isFinite(e)?1:0,"bool"),AO={kernelName:To,backendName:"cpu",kernelFunc:mO},yO=at(Eo,e=>Math.abs(e)===Infinity?1:0,"bool"),gO={kernelName:Eo,backendName:"cpu",kernelFunc:yO},xO=at(Co,e=>Number.isNaN(e)?1:0,"bool"),bO={kernelName:Co,backendName:"cpu",kernelFunc:xO},vO=Rt((e,t)=>e<=t?1:0),wO=qt(Mo,vO,null,"bool"),kO={kernelName:Mo,backendName:"cpu",kernelFunc:wO};function IO(e){let{backend:t,attrs:n}=e,{start:a,stop:r,num:s}=n,i=G3(a,r,s);return t.makeTensorInfo([i.length],"float32",i)}var SO={kernelName:Jp,backendName:"cpu",kernelFunc:IO},NO=at(Fo,e=>Math.log1p(e)),TO={kernelName:Fo,backendName:"cpu",kernelFunc:NO},EO=Rt((e,t)=>e&&t),CO=qt($o,EO,null,"bool"),RO={kernelName:$o,backendName:"cpu",kernelFunc:CO},MO=at(Eu,e=>e?0:1,"bool"),FO={kernelName:Eu,backendName:"cpu",kernelFunc:MO},$O=Rt((e,t)=>e||t),DO=qt(Cu,$O,null,"bool"),zO={kernelName:Cu,backendName:"cpu",kernelFunc:DO};function OO(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{depthRadius:s,bias:i,alpha:o,beta:l}=a;ve(r,"LRN");let u=r.shape[3],d=u-1,p=n.data.get(r.dataId).values,c=k.sizeFromShape(r.shape),h=new Float32Array(c);function m(f){let A=f%u,y=f-A+Math.max(0,A-s),g=f-A+Math.min(A+s,d),x=0;for(;y<=g;y++){let w=p[y];x+=w*w}return x}for(let f=0;f`Error in maxPool: Either strides or dilations must be 1. Got strides ${i} and dilations '${u}'`);let d=C.computePool2DInfo(r.shape,s,i,u,o,l),p;if(d.filterWidth===1&&d.filterHeight===1&&k.arraysEqual(d.inShape,d.outShape))p=Ua({inputs:{x:r},backend:n});else{let c=n.data.get(r.dataId).values,h=k.computeStrides(r.shape),m=a1(c,r.shape,r.dtype,h,d,"max");p=n.makeTensorInfo(d.outShape,r.dtype,m.values)}return p}var VO={kernelName:Rs,backendName:"cpu",kernelFunc:BO};function jO(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{filterSize:s,strides:i,pad:o,dimRoundingMode:l,dataFormat:u}=a;ve(r,"maxPool3d");let d=C.computePool3DInfo(r.shape,s,i,1,o,l,u),p=n.data.get(r.dataId).values,c=g7(p,r.shape,r.dtype,k.computeStrides(r.shape),d,"max");return n.makeTensorInfo(c.shape,"float32",c.values)}var UO={kernelName:Mu,backendName:"cpu",kernelFunc:jO};function HO(e){let{inputs:t,backend:n,attrs:a}=e,{dy:r,input:s}=t,{filterSize:i,strides:o,pad:l,dimRoundingMode:u}=a;ve([r,s],"maxPool3DGrad");let d=C.computePool3DInfo(s.shape,i,o,1,l,u),p=n.bufferSync(s),c=ED(p,d),h=d.strideDepth,m=d.strideHeight,f=d.strideWidth,A=d.dilationDepth,y=d.dilationHeight,g=d.dilationWidth,x=d.effectiveFilterDepth,w=d.effectiveFilterHeight,b=d.effectiveFilterWidth,v=x-1-d.padInfo.front,N=b-1-d.padInfo.left,T=w-1-d.padInfo.top,R=We(s.shape,"float32"),$=n.bufferSync(r);for(let O=0;O=d.outDepth||Math.floor(ne)!==ne))for(let ie=0;ie=d.outHeight||Math.floor(Q)!==Q))for(let de=0;de=d.outWidth||Math.floor(oe)!==oe)continue;let ye=x*w*b-1-c.get(O,ne,Q,oe,P),he=re*w*b+ie*b+de,Ie=ye===he?1:0;Ie!==0&&(Y+=$.get(O,ne,Q,oe,P)*Ie)}}}R.set(Y,O,V,j,U,P)}return n.makeTensorInfo(R.shape,R.dtype,R.values)}var GO={kernelName:tc,backendName:"cpu",kernelFunc:HO};function qO(e){let{inputs:t,backend:n,attrs:a}=e,{dy:r,input:s,output:i}=t,o=s;ve([s,i],"maxPoolGrad");let{filterSize:l,strides:u,pad:d,dimRoundingMode:p}=a,c=C.computePool2DInfo(o.shape,l,u,1,d,p),h=n.data.get(o.dataId).values,m=We(c.outShape,o.dtype,y7(h,o.shape,o.dtype,c).values),f=c.strideHeight,A=c.strideWidth,y=c.dilationHeight,g=c.dilationWidth,x=c.effectiveFilterHeight,w=c.effectiveFilterWidth,b=w-1-c.padInfo.left,v=x-1-c.padInfo.top,N=We(o.shape,"float32"),T=n.data.get(r.dataId).values,R=We(r.shape,"float32",T);for(let $=0;$=c.outHeight||Math.floor(ee)!==ee))for(let Y=0;Y=c.outWidth||Math.floor(re)!==re)continue;let ne=x*w-1-m.get($,ee,re,O),ie=G*w+Y,Q=ne===ie?1:0;Q!==0&&(X+=R.get($,ee,re,O)*Q)}}N.set(X,$,P,V,O)}return n.makeTensorInfo(N.shape,N.dtype,N.values)}var XO={kernelName:ec,backendName:"cpu",kernelFunc:qO};function KO(e,t,n,a,r){let s=k.computeStrides(t),i=a1(e,t,n,s,r,"max"),o=y7(e,t,n,r,!0,a);return[i.values,o.values]}var ZO={kernelName:nc,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{let{x:a}=e,{filterSize:r,strides:s,pad:i,includeBatchInIndex:o}=t,l=n;ve(a,"MaxPoolWithArgmax");let u=l.data.get(a.dataId).values,d=C.computePool2DInfo(a.shape,r,s,[1,1],i),[p,c]=KO(u,a.shape,a.dtype,o,d),h=l.write(p,d.outShape,a.dtype),m=l.write(c,d.outShape,a.dtype);return[{dataId:h,shape:d.outShape,dtype:a.dtype},{dataId:m,shape:d.outShape,dtype:"int32"}]}};function YO(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{axis:s,keepDims:i}=a,o=k.parseAxisParam(s,r.shape),l=C.computeOutAndReduceShapes(r.shape,o)[1],u=k.sizeFromShape(l),d=[],p=n.makeTensorInfo([],"float32",new Float32Array([u]));d.push(p);let c=Wr({inputs:{x:r},backend:n,attrs:{dtype:"float32"}});d.push(c);let h=r1({inputs:{a:c,b:p},backend:n});d.push(h);let m=cd({inputs:{x:h},backend:n,attrs:{axis:s,keepDims:i}});return d.forEach(f=>n.disposeIntermediateTensorInfo(f)),m}var JO={kernelName:Ms,backendName:"cpu",kernelFunc:YO};function QO(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{axis:s,keepDims:i}=a;ve(r,"min");let o=k.parseAxisParam(s,r.shape),l=o,u=C.getAxesPermutation(l,r.shape.length),d=r;u!=null&&(d=Jn({inputs:{x:r},backend:n,attrs:{perm:u}}),l=C.getInnerMostAxes(l.length,r.shape.length)),C.assertAxesAreInnerMostDims("min",l,d.shape.length);let[p,c]=C.computeOutAndReduceShapes(d.shape,l),h=k.sizeFromShape(c),m=k.makeZerosTypedArray(k.sizeFromShape(p),d.dtype),f=n.data.get(d.dataId).values;for(let y=0;yg[0]+r.shape[x]+g[1]),l=s.map(g=>g[0]),u=s.map((g,x)=>g[0]+r.shape[x]),d=i==="reflect"?0:1,p=n.data.get(r.dataId).values,c=r.shape.length,h=k.computeStrides(r.shape),m=k.sizeFromShape(o),f=o.length,A=k.computeStrides(o),y=k.getTypedArrayFromDType(r.dtype,m);for(let g=0;g=u[b]&&(x[b]=(u[b]-1)*2-x[b]+d);x=x.map((b,v)=>b-l[v]);let w=k.locToIndex(x,c,h);y[g]=p[w]}return{dataId:n.write(y,o,r.dtype),shape:o,dtype:r.dtype}}var n_={kernelName:Ds,backendName:"cpu",kernelFunc:t_},a_=Rt((e,t)=>{let n=e%t;return e<0&&t<0||e>=0&&t>=0?n:(n+t)%t}),r_=qt(Do,a_),s_={kernelName:Do,backendName:"cpu",kernelFunc:r_},i_=eo(Jg());function I7(e){let{inputs:t,backend:n,attrs:a}=e,{logits:r}=t,{dim:s}=a,i=r.shape.length,o=s;if(o===-1&&(o=i-1),o!==i-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${i} and dim was ${o}`);let l=k.parseAxisParam([o],r.shape),u=k7({inputs:{x:r},backend:n,attrs:{reductionIndices:l,keepDims:!1}}),d=C.expandShapeToKeepDim(u.shape,l),p=ct({inputs:{x:u},backend:n,attrs:{shape:d}}),c=t1({inputs:{a:r,b:p},backend:n}),h=W3({inputs:{x:c},backend:n}),m=cd({inputs:{x:h},backend:n,attrs:{axis:l,keepDims:!1}}),f=ct({inputs:{x:m},backend:n,attrs:{shape:d}}),A=r1({inputs:{a:h,b:f},backend:n});return n.disposeIntermediateTensorInfo(u),n.disposeIntermediateTensorInfo(p),n.disposeIntermediateTensorInfo(c),n.disposeIntermediateTensorInfo(h),n.disposeIntermediateTensorInfo(m),n.disposeIntermediateTensorInfo(f),A}var o_={kernelName:Zs,backendName:"cpu",kernelFunc:I7};function l_(e){let{inputs:t,backend:n,attrs:a}=e,{logits:r}=t,{numSamples:s,seed:i,normalized:o}=a;ve(r,"multinomial");let l=o?r:I7({inputs:{logits:r},backend:n,attrs:{dim:-1}}),u=l.shape[0],d=l.shape[1],p=n.data.get(l.dataId).values,c=[u,s],h=k.makeZerosTypedArray(k.sizeFromShape(c),"int32");for(let m=0;m=0&&d[p]{k.assertShapesMatch(s,d.shape,"All tensors passed to stack must have matching shapes"),k.assert(i===d.dtype,()=>"All tensors passed to stack must have matching dtypes")});let o=[],l=t.map(d=>{let p=ch({inputs:{input:d},backend:n,attrs:{dim:r}});return o.push(p),p}),u=Ml({inputs:l,backend:n,attrs:{axis:r}});return o.forEach(d=>n.disposeIntermediateTensorInfo(d)),u}var k_={kernelName:Bo,backendName:"cpu",kernelFunc:N7};function I_(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{paddings:s,constantValue:i}=a;ve(r,"pad");let o=s.map((y,g)=>y[0]+r.shape[g]+y[1]),l=s.map(y=>y[0]),u=n.data.get(r.dataId).values,d=k.sizeFromShape(r.shape),p=r.shape.length,c=k.computeStrides(r.shape),h=k.sizeFromShape(o),m=o.length,f=k.computeStrides(o),A=k.getTypedArrayFromDType(r.dtype,h);i!==0&&A.fill(i);for(let y=0;yw+l[b]),x=k.locToIndex(g,m,f);A[x]=u[y]}return{dataId:n.write(A,o,r.dtype),shape:o,dtype:r.dtype}}var T7={kernelName:_s,backendName:"cpu",kernelFunc:I_},S_=Rt((e,t)=>Math.pow(e,t)),N_=qt(Ps,S_),T_={kernelName:Ps,backendName:"cpu",kernelFunc:N_};function E_(e){let{backend:t,attrs:n}=e,{start:a,stop:r,dtype:s,step:i}=n,o=e1(a,r,i,s);return t.makeTensorInfo([o.length],s,o)}var C_={kernelName:Fu,backendName:"cpu",kernelFunc:E_},R_=at(jo,e=>1/e),M_={kernelName:jo,backendName:"cpu",kernelFunc:R_};function F_(e){let{inputs:t,backend:n,attrs:a}=e,{images:r}=t,{alignCorners:s,halfPixelCenters:i,size:o}=a;ve(r,"resizeBilinear");let l=k.computeStrides(r.shape),[u,d]=o,[p,c,h,m]=r.shape,f=n.data.get(r.dataId).values,A=new Float32Array(k.sizeFromShape([p,u,d,m])),y=[s&&u>1?c-1:c,s&&d>1?h-1:h],g=[s&&u>1?u-1:u,s&&d>1?d-1:d],x=0,w=y[0]/g[0],b=y[1]/g[1];for(let v=0;v1?u-1:u,i&&h>1?d-1:d],A=[i&&c>1?c-1:c,i&&h>1?h-1:h],y=f[0]/A[0],g=f[1]/A[1],x=n.data.get(s.dataId).values,w=0;for(let b=0;b1?c-1:c,s&&d>1?h-1:h],g=[s&&u>1?u-1:u,s&&d>1?d-1:d],x=y[0]/g[0],w=y[1]/g[1],b=0;for(let v=0;v1?d-1:d,i&&m>1?p-1:p],g=[i&&h>1?h-1:h,i&&m>1?m-1:m],x=y[0]/g[0],w=y[1]/g[1],b=1/x,v=1/w,N=Math.ceil(b)*2+2,T=Math.ceil(v)*2+2;for(let R=0;R=h)continue;let Q=$+ie*l[1],de=ie*x,oe=Math.min(d-1,i?Math.round(de):Math.floor(de));if(O===oe)for(let ye=0;ye=m)continue;let Ie=Q+he*l[2],Ne=he*w,$e=Math.min(p-1,i?Math.round(Ne):Math.floor(Ne));U===$e&&(re+=A[Ie+Y])}}f[X+Y]=re}}}}return n.makeTensorInfo(r.shape,r.dtype,f)}var L_={kernelName:sc,backendName:"cpu",kernelFunc:P_};function W_(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{dims:s}=a;ve(r,"reverse");let i=r.shape.length,o=k.parseAxisParam(s,r.shape);if(i===0)return Ua({inputs:{x:r},backend:n});let l=new Ot(r.shape,r.dtype),u=n.bufferSync(r);for(let d=0;dc[h]=r.shape[h]-1-c[h]),l.set(u.get(...c),...p)}return n.makeTensorInfo(l.shape,l.dtype,l.values)}var B_={kernelName:js,backendName:"cpu",kernelFunc:W_},V_={kernelName:rl,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{let{image:a}=e,{radians:r,fillValue:s,center:i}=t,o=n,l=k.getTypedArrayFromDType(a.dtype,k.sizeFromShape(a.shape)),[u,d,p,c]=a.shape,[h,m]=C.getImageCenter(i,d,p),f=255,A=Math.sin(r),y=Math.cos(r),g=o.data.get(a.dataId).values;for(let x=0;x=0&&V=0&&j{let t=Math.floor(e);return e-t<.5?Math.floor(e):e-t>.5?Math.ceil(e):t%2==0?t:t+1}),U_={kernelName:Us,backendName:"cpu",kernelFunc:j_};function E7(e,t,n,a,r,s,i,o,l,u){let d=[a/r,r],p=e.values,c=t.values;if(a===0)return We(n,t.dtype);let h=We(d,t.dtype);h.values.fill(l);for(let m=0;m=a/r)throw new Error(`Invalid indices: ${f} does not index into ${n}`);for(let y=0;y1||r.shape.length===1?1:k.sizeFromShape(r.shape.slice(1));for(let m=0;me>=0?Z_*e:K_*(Math.exp(e)-1)),J_={kernelName:qo,backendName:"cpu",kernelFunc:Y_},Q_=at(Zo,e=>e<0?-1:e>0?1:0),eP={kernelName:Zo,backendName:"cpu",kernelFunc:Q_},tP=at(Gs,e=>Math.sin(e)),nP={kernelName:Gs,backendName:"cpu",kernelFunc:tP},aP=at(Ko,e=>Math.sinh(e)),rP={kernelName:Ko,backendName:"cpu",kernelFunc:aP},sP=11920928955078125e-23,C7=Math.log(sP)+2,iP=at(Yo,e=>{let t=e>-C7,n=eNumber(A)))),n.makeTensorInfo([f.length],a.dtype,new Int32Array(f))]}var pP={kernelName:oc,backendName:"cpu",kernelFunc:dP};function cP(e){let{inputs:t,backend:n}=e,{inputIndices:a,inputShape:r,newShape:s}=t;if(a.shape.length!==2)throw new Error(`Input indices should be a matrix but received shape - ${a.shape}`);if(r.shape.length!==1)throw new Error(`Input shape should be a vector but received shape - ${r.shape}`);if(s.shape.length!==1)throw new Error(`Target shape should be a vector but received shape ${s.shape}`);let i=Array.from(n.data.get(r.dataId).values),o=n.data.get(a.dataId).values,l=Array.from(n.data.get(s.dataId).values),[u,d,p]=n7(o,a.shape,a.dtype,i,l);return[n.makeTensorInfo(d,a.dtype,u),n.makeTensorInfo([p.length],s.dtype,new Int32Array(p))]}var hP={kernelName:lc,backendName:"cpu",kernelFunc:cP};function fP(e){let{inputs:t,backend:n,attrs:a}=e,{sparseIndices:r,sparseValues:s,defaultValue:i}=t,{outputShape:o}=a,{sliceRank:l,numUpdates:u,sliceSize:d,strides:p,outputSize:c}=C.calculateShapes(s,r,o),h=!1,m=n.bufferSync(r),f=n.bufferSync(s),A=n.data.get(i.dataId).values[0],y=E7(m,f,o,c,d,u,l,p,A,h);return n.makeTensorInfo(o,y.dtype,y.values)}var mP={kernelName:uc,backendName:"cpu",kernelFunc:fP};function AP(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{numOrSizeSplits:s,axis:i}=a,o=k.parseAxisParam(i,r.shape)[0],l=C.prepareSplitSize(r,s,o),u=new Array(r.shape.length).fill(0),d=r.shape.slice();return l.map(p=>{let c=[...d];c[o]=p;let h=vi({inputs:{x:r},backend:n,attrs:{begin:u,size:c}});return u[o]+=p,h})}var yP={kernelName:Jo,backendName:"cpu",kernelFunc:AP},gP=at(Xs,e=>Math.sqrt(e)),xP={kernelName:Xs,backendName:"cpu",kernelFunc:gP},bP={kernelName:zu,backendName:"cpu",kernelFunc:({inputs:e,backend:t})=>{let{x:n}=e,a=t;ve(n,"square");let r=a.data.get(n.dataId).values,s=new Float32Array(r.length);for(let i=0;i{let n=t;return isNaN(e)?NaN:e>0?1:n.alpha}),wP={kernelName:Cr,backendName:"cpu",kernelFunc:vP};function kP(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{begin:s,end:i,strides:o,beginMask:l,endMask:u,ellipsisMask:d,newAxisMask:p,shrinkAxisMask:c}=a;ve(r,"stridedSlice");let{nonStrided:h,$begin:m,$strides:f,size:A,newShape:y,outShape:g}=ln.sliceInfo(r.shape,s,i,o,l,u,d,p,c),x=ct({inputs:{x:r},backend:n,attrs:{shape:y}}),w;if(h){let v=vi({inputs:{x},backend:n,attrs:{begin:m,size:A}});w=ct({inputs:{x:v},backend:n,attrs:{shape:g}}),n.disposeIntermediateTensorInfo(v)}else if(g.some(v=>v===0))w=n.makeTensorInfo(g,r.dtype,[]);else{let v=n.bufferSync(x),N=r7(g,v,f,m);w=n.makeTensorInfo(N.shape,N.dtype,N.values)}let b=ct({inputs:{x:w},backend:n,attrs:{shape:g}});return n.disposeIntermediateTensorInfo(x),n.disposeIntermediateTensorInfo(w),b}var IP={kernelName:Qo,backendName:"cpu",kernelFunc:kP},SP=at(Qs,e=>Math.tan(e)),NP={kernelName:Qs,backendName:"cpu",kernelFunc:SP},TP=at(ei,e=>Math.tanh(e)),EP={kernelName:ei,backendName:"cpu",kernelFunc:TP};function CP(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{reps:s}=a;ve(r,"tile");let i=i7(n.bufferSync(r),s);return n.makeTensorInfo(i.shape,i.dtype,i.values)}var RP={kernelName:Er,backendName:"cpu",kernelFunc:CP};function MP(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{k:s,sorted:i}=a;ve(r,"topk");let o=n.data.get(r.dataId).values,[l,u]=o7(o,r.shape,r.dtype,s,i);return[n.makeTensorInfo(l.shape,l.dtype,l.values),n.makeTensorInfo(u.shape,u.dtype,u.values)]}var FP={kernelName:el,backendName:"cpu",kernelFunc:MP};function $P(e){let{inputs:t,attrs:n,backend:a}=e,{image:r,transforms:s}=t,{interpolation:i,fillMode:o,fillValue:l,outputShape:u}=n,[d,p,c,h]=r.shape,[m,f]=u!=null?u:[p,c],A=[d,m,f,h],y=k.computeStrides(r.shape),g=y[0],x=y[1],w=y[2],b=k.getTypedArrayFromDType(r.dtype,k.sizeFromShape(A));b.fill(l);let v=a.data.get(r.dataId).values,N=a.data.get(s.dataId).values;for(let T=0;Tt-1)if(t<=1)n=0;else{let a=2*t;n-=a*Math.trunc(n/a),n>=t&&(n=a-n-1)}return k.clamp(0,n,t-1)}function OP(e,t){let n=e;if(n<0)if(t<=1)n=0;else{let a=t-1;n+=t*(Math.trunc(-n/a)+1)}else if(n>t-1)if(t<=1)n=0;else{let a=t-1;n-=t*Math.trunc(n/a)}return k.clamp(0,n,t-1)}function _P(e,t){return e}function PP(e,t){return k.clamp(0,e,t-1)}function hd(e,t,n,a,r,s,i,o,l,u,d){let p=i*a+o*r+l*s+u;return 0<=o&&on.disposeIntermediateTensorInfo(m)),h}var GP={kernelName:Ou,backendName:"cpu",kernelFunc:HP},qP=[nD,i$,rD,iD,c$,lD,dD,cD,fD,AD,gD,bD,wD,SD,TD,RD,FD,DD,OD,eD,PD,WD,VD,d$,f$,UD,o$,GD,XD,YD,QD,KD,az,sz,tz,oz,uz,pz,hz,mz,yz,gz,bz,wz,Iz,Sz,Tz,Nz,s1,Rz,G$,Fz,Dz,Vz,m$,jz,y$,Kz,Zz,Jz,x$,tO,aO,sO,oO,uO,v$,cO,l$,fO,qD,AO,gO,bO,q$,k$,kO,SO,S$,TO,RO,FO,zO,_O,LO,T$,VO,UO,GO,XO,ZO,WO,JO,e_,C$,n_,s_,u_,M$,$$,c_,m_,g_,z$,b_,w_,k_,T7,T_,K$,P$,C_,u$,M_,Z$,Y$,Q$,$_,z_,__,L_,B_,V_,U_,W$,G_,X_,J_,J$,eP,nP,rP,B$,o_,oP,uP,pP,hP,mP,yP,xP,bP,j$,wP,IP,H$,Ez,NP,EP,RP,FP,O$,DP,VP,UP,GP,v_];for(let e of qP)si(e);var M7={};Fe(M7,{assertNotComplex:()=>$l,bindCanvasToFramebuffer:()=>sL,bindColorTextureToFramebuffer:()=>Ah,bindTextureToProgramUniformSampler:()=>G7,bindTextureUnit:()=>j7,bindVertexBufferToProgramAttribute:()=>d1,callAndCheck:()=>xe,canBeRepresented:()=>F7,createFragmentShader:()=>z7,createFramebuffer:()=>V7,createProgram:()=>O7,createStaticIndexBuffer:()=>L7,createStaticVertexBuffer:()=>P7,createTexture:()=>W7,createVertexShader:()=>D7,getBatchDim:()=>ki,getExtensionOrThrow:()=>yd,getFramebufferErrorMessage:()=>q7,getMaxTexturesInShader:()=>Y7,getNumChannels:()=>aL,getProgramUniformLocation:()=>H7,getProgramUniformLocationOrThrow:()=>U7,getRowsCols:()=>Ii,getShapeAs3D:()=>yh,getTextureShapeFromLogicalShape:()=>K7,getWebGLDisjointQueryTimerVersion:()=>J7,getWebGLErrorMessage:()=>$7,getWebGLMaxTextureSize:()=>Z7,hasExtension:()=>ea,isCapableOfRenderingToFloatTexture:()=>Q7,isDownloadFloatTextureEnabled:()=>ev,isReshapeFree:()=>xd,isWebGLFenceEnabled:()=>tv,isWebGLVersionEnabled:()=>c1,linkProgram:()=>_7,resetMaxTextureSize:()=>iL,resetMaxTexturesInShader:()=>oL,unbindColorTextureFromFramebuffer:()=>p1,unbindTextureUnit:()=>rL,validateFramebuffer:()=>gd,validateProgram:()=>mh,validateTextureSize:()=>B7});var wi={},l1={alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!0};function fh(e,t){wi[e]=t}function Ha(e){if(!(e in wi)){let n=KP(e);if(n!==null)wi[e]=n;else return console.log("Could not get context for WebGL version",e),null}let t=wi[e];return t.isContextLost()?(delete wi[e],Ha(e)):(t.disable(t.DEPTH_TEST),t.disable(t.STENCIL_TEST),t.disable(t.BLEND),t.disable(t.DITHER),t.disable(t.POLYGON_OFFSET_FILL),t.disable(t.SAMPLE_COVERAGE),t.enable(t.SCISSOR_TEST),t.enable(t.CULL_FACE),t.cullFace(t.BACK),wi[e])}function XP(e){if(typeof OffscreenCanvas!="undefined"&&e===2)return new OffscreenCanvas(300,150);if(typeof document!="undefined")return document.createElement("canvas");throw new Error("Cannot create a canvas in this context")}function KP(e){if(e!==1&&e!==2)throw new Error("Cannot get WebGL rendering context, WebGL is disabled.");let t=XP(e);return t.addEventListener("webglcontextlost",n=>{n.preventDefault(),delete wi[e]},!1),e===1?t.getContext("webgl",l1)||t.getContext("experimental-webgl",l1):t.getContext("webgl2",l1)}var fd;(function(e){e[e.DENSE=0]="DENSE",e[e.SHARED_BATCH=1]="SHARED_BATCH"})(fd||(fd={}));var Qn;(function(e){e[e.RENDER=0]="RENDER",e[e.UPLOAD=1]="UPLOAD",e[e.PIXELS=2]="PIXELS",e[e.DOWNLOAD=3]="DOWNLOAD"})(Qn||(Qn={}));var en;(function(e){e[e.UNPACKED_FLOAT16=0]="UNPACKED_FLOAT16",e[e.UNPACKED_FLOAT32=1]="UNPACKED_FLOAT32",e[e.PACKED_4X1_UNSIGNED_BYTE=2]="PACKED_4X1_UNSIGNED_BYTE",e[e.PACKED_2X2_FLOAT32=3]="PACKED_2X2_FLOAT32",e[e.PACKED_2X2_FLOAT16=4]="PACKED_2X2_FLOAT16"})(en||(en={}));function md(e,t){return[t,e]}function ZP(e,t){return e*t}function Ad(e){let t=k.sizeFromShape(e),n=Math.ceil(t/4);return k.sizeToSquarishShape(n)}function Fl(e,t){return[Math.max(1,Math.ceil(t/2)),Math.max(1,Math.ceil(e/2))]}function YP(e,t){let[n,a]=Fl(e,t);return n*a*4}function u1(e,t){let n=e,a,r,s,i,o,l,u,d,p,c;return J().getNumber("WEBGL_VERSION")===2?(a=n.R32F,r=n.R16F,s=n.RGBA16F,i=n.RGBA32F,o=n.RED,u=4,d=1,p=n.HALF_FLOAT,c=n.FLOAT):(a=e.RGBA,r=e.RGBA,s=e.RGBA,i=n.RGBA,o=e.RGBA,u=4,d=4,p=t!=null?t.HALF_FLOAT_OES:null,c=e.FLOAT),l=e.RGBA,{internalFormatFloat:a,internalFormatHalfFloat:r,internalFormatPackedHalfFloat:s,internalFormatPackedFloat:i,textureFormatFloat:o,downloadTextureFormat:l,downloadUnpackNumChannels:u,defaultNumChannels:d,textureTypeHalfFloat:p,textureTypeFloat:c}}function xe(e,t){let n=t();return J().getBool("DEBUG")&&JP(e),n}function JP(e){let t=e.getError();if(t!==e.NO_ERROR)throw new Error("WebGL Error: "+$7(e,t))}var QP=596e-10,eL=65504;function F7(e){return!!(J().getBool("WEBGL_RENDER_FLOAT32_ENABLED")||e===0||QPe.getExtension(t),'Extension "'+t+'" not supported on this browser.')}function D7(e,t){let n=pr(e,()=>e.createShader(e.VERTEX_SHADER),"Unable to create vertex WebGLShader.");if(xe(e,()=>e.shaderSource(n,t)),xe(e,()=>e.compileShader(n)),e.getShaderParameter(n,e.COMPILE_STATUS)===!1)throw console.log(e.getShaderInfoLog(n)),new Error("Failed to compile vertex shader.");return n}function z7(e,t){let n=pr(e,()=>e.createShader(e.FRAGMENT_SHADER),"Unable to create fragment WebGLShader.");if(xe(e,()=>e.shaderSource(n,t)),xe(e,()=>e.compileShader(n)),e.getShaderParameter(n,e.COMPILE_STATUS)===!1)throw nL(t,e.getShaderInfoLog(n)),new Error("Failed to compile fragment shader.");return n}var tL=/ERROR: [0-9]+:([0-9]+):/g;function nL(e,t){let n=tL.exec(t);if(n==null){console.log(`Couldn't parse line number in error: ${t}`),console.log(e);return}let a=+n[1],r=e.split(` -`),s=r.length.toString().length+2,i=r.map((p,c)=>k.rightPad((c+1).toString(),s)+p),o=0;for(let p=0;pe.createProgram(),"Unable to create WebGLProgram.")}function _7(e,t){if(xe(e,()=>e.linkProgram(t)),e.getProgramParameter(t,e.LINK_STATUS)===!1)throw console.log(e.getProgramInfoLog(t)),new Error("Failed to link vertex and fragment shaders.")}function mh(e,t){if(xe(e,()=>e.validateProgram(t)),e.getProgramParameter(t,e.VALIDATE_STATUS)===!1)throw console.log(e.getProgramInfoLog(t)),new Error("Shader program validation failed.")}function P7(e,t){let n=pr(e,()=>e.createBuffer(),"Unable to create WebGLBuffer");return xe(e,()=>e.bindBuffer(e.ARRAY_BUFFER,n)),xe(e,()=>e.bufferData(e.ARRAY_BUFFER,t,e.STATIC_DRAW)),n}function L7(e,t){let n=pr(e,()=>e.createBuffer(),"Unable to create WebGLBuffer");return xe(e,()=>e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,n)),xe(e,()=>e.bufferData(e.ELEMENT_ARRAY_BUFFER,t,e.STATIC_DRAW)),n}function aL(){return J().getNumber("WEBGL_VERSION")===2?1:4}function W7(e){return pr(e,()=>e.createTexture(),"Unable to create WebGLTexture.")}function B7(e,t){let n=J().getNumber("WEBGL_MAX_TEXTURE_SIZE");if(e<=0||t<=0){let a=`[${e}x${t}]`;throw new Error("Requested texture size "+a+" is invalid.")}if(e>n||t>n){let a=`[${e}x${t}]`,r=`[${n}x${n}]`;throw new Error("Requested texture size "+a+" greater than WebGL maximum on this browser / GPU "+r+".")}}function V7(e){return pr(e,()=>e.createFramebuffer(),"Unable to create WebGLFramebuffer.")}function d1(e,t,n,a,r,s,i){let o=e.getAttribLocation(t,n);return o===-1?!1:(xe(e,()=>e.bindBuffer(e.ARRAY_BUFFER,a)),xe(e,()=>e.vertexAttribPointer(o,r,e.FLOAT,!1,s,i)),xe(e,()=>e.enableVertexAttribArray(o)),!0)}function j7(e,t,n){X7(e,n),xe(e,()=>e.activeTexture(e.TEXTURE0+n)),xe(e,()=>e.bindTexture(e.TEXTURE_2D,t))}function rL(e,t){X7(e,t),xe(e,()=>e.activeTexture(e.TEXTURE0+t)),xe(e,()=>e.bindTexture(e.TEXTURE_2D,null))}function U7(e,t,n){return pr(e,()=>e.getUniformLocation(t,n),'uniform "'+n+'" not present in program.')}function H7(e,t,n){return e.getUniformLocation(t,n)}function G7(e,t,n,a){xe(e,()=>j7(e,t,a)),xe(e,()=>e.uniform1i(n,a))}function sL(e){xe(e,()=>e.bindFramebuffer(e.FRAMEBUFFER,null)),xe(e,()=>e.viewport(0,0,e.canvas.width,e.canvas.height)),xe(e,()=>e.scissor(0,0,e.canvas.width,e.canvas.height))}function Ah(e,t,n){xe(e,()=>e.bindFramebuffer(e.FRAMEBUFFER,n)),xe(e,()=>e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t,0))}function p1(e,t){xe(e,()=>e.bindFramebuffer(e.FRAMEBUFFER,t)),xe(e,()=>e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,null,0))}function gd(e){let t=e.checkFramebufferStatus(e.FRAMEBUFFER);if(t!==e.FRAMEBUFFER_COMPLETE)throw new Error("Error binding framebuffer: "+q7(e,t))}function q7(e,t){switch(t){case e.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_ATTACHMENT";case e.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT";case e.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:return"FRAMEBUFFER_INCOMPLETE_DIMENSIONS";case e.FRAMEBUFFER_UNSUPPORTED:return"FRAMEBUFFER_UNSUPPORTED";default:return`unknown error ${t}`}}function pr(e,t,n){let a=xe(e,()=>t());if(a==null)throw new Error(n);return a}function X7(e,t){let n=e.MAX_COMBINED_TEXTURE_IMAGE_UNITS-1,a=t+e.TEXTURE0;if(an){let r=`[gl.TEXTURE0, gl.TEXTURE${n}]`;throw new Error(`textureUnit must be in ${r}.`)}}function ki(e,t=2){return k.sizeFromShape(e.slice(0,e.length-t))}function Ii(e){if(e.length===0)throw Error("Cannot get rows and columns of an empty shape array.");return[e.length>1?e[e.length-2]:1,e[e.length-1]]}function yh(e){let t=[1,1,1];return e.length===0||e.length===1&&e[0]===1||(t=[ki(e),...Ii(e)]),t}function K7(e,t=!1){let n=J().getNumber("WEBGL_MAX_TEXTURE_SIZE");t&&(n=n*2,e=e.map((r,s)=>s>=e.length-2?k.nearestLargerEven(e[s]):e[s]),e.length===1&&(e=[2,e[0]])),e.length!==2&&(e=k.squeezeShape(e).newShape);let a=k.sizeFromShape(e);if(e.length<=1&&a<=n)return[1,a];if(e.length===2&&e[0]<=n&&e[1]<=n)return e;if(e.length===3&&e[0]*e[1]<=n&&e[2]<=n)return[e[0]*e[1],e[2]];if(e.length===3&&e[0]<=n&&e[1]*e[2]<=n)return[e[0],e[1]*e[2]];if(e.length===4&&e[0]*e[1]*e[2]<=n&&e[3]<=n)return[e[0]*e[1]*e[2],e[3]];if(e.length===4&&e[0]<=n&&e[1]*e[2]*e[3]<=n)return[e[0],e[1]*e[2]*e[3]];if(t){let r=ki(e),s=2,i=2;return e.length&&([s,i]=Ii(e)),a=r*(s/2)*(i/2),k.sizeToSquarishShape(a).map(o=>o*2)}return k.sizeToSquarishShape(a)}function gh(e){return e%2==0}function xd(e,t){if(e=e.slice(-2),t=t.slice(-2),k.arraysEqual(e,t)||!e.length||!t.length||e[0]===0||e[1]===0||t[0]===0||t[1]===0)return!0;if(e.length!==t.length){let n=e.slice(-1)[0],a=t.slice(-1)[0];if(n===a||gh(n)&&gh(a)&&(e[0]===1||t[0]===1))return!0}return e[1]===t[1]&&gh(e[0])&&gh(t[0])}var xh,bh;function Z7(e){if(xh==null){let t=Ha(e);xh=t.getParameter(t.MAX_TEXTURE_SIZE)}return xh}function iL(){xh=null}function oL(){bh=null}function Y7(e){if(bh==null){let t=Ha(e);bh=t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS)}return Math.min(16,bh)}function J7(e){if(e===0)return 0;let t,n=Ha(e);return ea(n,"EXT_disjoint_timer_query_webgl2")&&e===2?t=2:ea(n,"EXT_disjoint_timer_query")?t=1:t=0,t}function ea(e,t){return e.getExtension(t)!=null}function c1(e){try{if(Ha(e)!=null)return!0}catch(t){return console.log("Error when getting WebGL context: ",t),!1}return!1}function Q7(e){if(e===0)return!1;let t=Ha(e);if(e===1){if(!ea(t,"OES_texture_float"))return!1}else if(!ea(t,"EXT_color_buffer_float"))return!1;return h1(t)}function ev(e){if(e===0)return!1;let t=Ha(e);if(e===1){if(!ea(t,"OES_texture_float")||!ea(t,"WEBGL_color_buffer_float"))return!1}else{if(ea(t,"EXT_color_buffer_float"))return h1(t);let n="EXT_color_buffer_half_float";if(ea(t,n)){let a=t.getExtension(n);return lL(t,a)}return!1}return h1(t)}function h1(e){let t=u1(e),n=e.createTexture();e.bindTexture(e.TEXTURE_2D,n);let a=1,r=1;e.texImage2D(e.TEXTURE_2D,0,t.internalFormatFloat,a,r,0,t.textureFormatFloat,t.textureTypeFloat,null);let s=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,s),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,n,0);let i=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindTexture(e.TEXTURE_2D,null),e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteTexture(n),e.deleteFramebuffer(s),i}function lL(e,t){let n=u1(e,t),a=e.createTexture();e.bindTexture(e.TEXTURE_2D,a);let r=1,s=1;e.texImage2D(e.TEXTURE_2D,0,n.internalFormatHalfFloat,r,s,0,n.textureFormatFloat,n.textureTypeHalfFloat,null);let i=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,i),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,a,0);let o=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindTexture(e.TEXTURE_2D,null),e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteTexture(a),e.deleteFramebuffer(i),o}function tv(e){return e!==2?!1:Ha(e).fenceSync!=null}function $l(e,t){Array.isArray(e)||(e=[e]),e.forEach(n=>{n!=null&&k.assert(n.dtype!=="complex64",()=>`${t} does not support complex64 tensors in the WebGL backend.`)})}var Me=J();Me.registerFlag("HAS_WEBGL",()=>Me.getNumber("WEBGL_VERSION")>0);Me.registerFlag("WEBGL_VERSION",()=>c1(2)?2:c1(1)?1:0);Me.registerFlag("WEBGL_CHECK_NUMERICAL_PROBLEMS",()=>!1);Me.registerFlag("WEBGL_BUFFER_SUPPORTED",()=>Me.get("WEBGL_VERSION")===2);Me.registerFlag("WEBGL_CPU_FORWARD",()=>!0);Me.registerFlag("WEBGL_FORCE_F16_TEXTURES",()=>!1);Me.registerFlag("WEBGL_PACK",()=>Me.getBool("HAS_WEBGL"));Me.registerFlag("WEBGL_PACK_NORMALIZATION",()=>Me.getBool("WEBGL_PACK"));Me.registerFlag("WEBGL_PACK_CLIP",()=>Me.getBool("WEBGL_PACK"));Me.registerFlag("WEBGL_PACK_DEPTHWISECONV",()=>Me.getBool("WEBGL_PACK"));Me.registerFlag("WEBGL_PACK_BINARY_OPERATIONS",()=>Me.getBool("WEBGL_PACK"));Me.registerFlag("WEBGL_PACK_UNARY_OPERATIONS",()=>Me.getBool("WEBGL_PACK"));Me.registerFlag("WEBGL_PACK_ARRAY_OPERATIONS",()=>Me.getBool("WEBGL_PACK"));Me.registerFlag("WEBGL_PACK_IMAGE_OPERATIONS",()=>Me.getBool("WEBGL_PACK"));Me.registerFlag("WEBGL_PACK_REDUCE",()=>Me.getBool("WEBGL_PACK"));Me.registerFlag("WEBGL_LAZILY_UNPACK",()=>Me.getBool("WEBGL_PACK"));Me.registerFlag("WEBGL_CONV_IM2COL",()=>Me.getBool("WEBGL_PACK"));Me.registerFlag("WEBGL_MAX_TEXTURE_SIZE",()=>Z7(Me.getNumber("WEBGL_VERSION")));Me.registerFlag("WEBGL_MAX_TEXTURES_IN_SHADER",()=>Y7(Me.getNumber("WEBGL_VERSION")));Me.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION",()=>{let e=Me.getNumber("WEBGL_VERSION");return e===0?0:J7(e)});Me.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE",()=>Me.getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0&&!Hu.isMobile());Me.registerFlag("WEBGL_RENDER_FLOAT32_CAPABLE",()=>Q7(Me.getNumber("WEBGL_VERSION")));Me.registerFlag("WEBGL_RENDER_FLOAT32_ENABLED",()=>Me.getBool("WEBGL_FORCE_F16_TEXTURES")?!1:Me.getBool("WEBGL_RENDER_FLOAT32_CAPABLE"));Me.registerFlag("WEBGL_DOWNLOAD_FLOAT_ENABLED",()=>ev(Me.getNumber("WEBGL_VERSION")));Me.registerFlag("WEBGL_FENCE_API_ENABLED",()=>tv(Me.getNumber("WEBGL_VERSION")));Me.registerFlag("WEBGL_SIZE_UPLOAD_UNIFORM",()=>Me.getBool("WEBGL_RENDER_FLOAT32_ENABLED")?4:0);Me.registerFlag("WEBGL_DELETE_TEXTURE_THRESHOLD",()=>-1,e=>{if(e<0&&e!==-1)throw new Error(`WEBGL_DELETE_TEXTURE_THRESHOLD must be -1 (indicating never delete) or at least 0, but got ${e}.`)});Me.registerFlag("WEBGL_FLUSH_THRESHOLD",()=>Hu.isMobile()&&Me.getBool("IS_CHROME")?1:-1,e=>{if(e<0&&e!==-1)throw new Error(`WEBGL_FLUSH_THRESHOLD must be -1 (indicating never manual flush) or at least 0, but got ${e}.`)});function cn(){let e,t,n,a,r,s,i,o,l,u;return J().getNumber("WEBGL_VERSION")===2?(e="#version 300 es",t="in",n="out",a="in",r="texture",s="outputColor",i="out vec4 outputColor;",o=` +var __defProp = Object.defineProperty; +var __require = (x) => { + if (typeof require !== "undefined") + return require(x); + throw new Error('Dynamic require of "' + x + '" is not supported'); +}; +var __export = (target, all6) => { + for (var name6 in all6) + __defProp(target, name6, { get: all6[name6], 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: "../node_modules/@tensorflow/tfjs-backend-wasm/dist//", + debug: true, + async: true, + warmup: "full", + cacheSensitivity: 0.01, + 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: false, + maxDetected: 10, + skipFrames: 21, + 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: 31, + minConfidence: 0.1 + }, + emotion: { + enabled: true, + minConfidence: 0.1, + skipFrames: 32, + modelPath: "emotion.json" + } + }, + body: { + enabled: true, + modelPath: "posenet.json", + maxDetected: 1, + minConfidence: 0.1 + }, + hand: { + enabled: true, + rotation: false, + skipFrames: 32, + minConfidence: 0.1, + iouThreshold: 0.1, + maxDetected: 2, + 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: 41 + } +}; + +// 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].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, + 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, + SparseToDense: () => SparseToDense, + SplitV: () => SplitV, + Sqrt: () => Sqrt, + Square: () => Square, + SquaredDifference: () => SquaredDifference, + Step: () => Step, + StridedSlice: () => StridedSlice, + 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, + 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: () => log2, + 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, + 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: () => version13, + version_converter: () => version11, + version_core: () => version6, + version_cpu: () => version7, + version_layers: () => version10, + version_wasm: () => version9, + version_webgl: () => version8, + 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 __markAsModule = (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) => { + for (var name6 in all52) + __defProp2(target, name6, { get: all52[name6], enumerable: true }); +}; +var __reExport = (target, module6, desc) => { + if (module6 && typeof module6 === "object" || typeof module6 === "function") { + for (let key of __getOwnPropNames(module6)) + if (!__hasOwnProp.call(target, key) && key !== "default") + __defProp2(target, key, { get: () => module6[key], enumerable: !(desc = __getOwnPropDesc(module6, key)) || desc.enumerable }); + } + return target; +}; +var __toModule = (module6) => { + return __reExport(__markAsModule(__defProp2(module6 != null ? __create(__getProtoOf(module6)) : {}, "default", module6 && module6.__esModule && "default" in module6 ? { get: () => module6.default, enumerable: true } : { value: module6, enumerable: true })), module6); +}; +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, module6) { + (function(global2, module7, 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 (module7 && module7.exports) { + module7.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.alea = impl; + } + })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); + } +}); +var require_xor128 = __commonJS({ + "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/xor128.js"(exports, module6) { + (function(global2, module7, 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 (module7 && module7.exports) { + module7.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor128 = impl; + } + })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); + } +}); +var require_xorwow = __commonJS({ + "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/xorwow.js"(exports, module6) { + (function(global2, module7, 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 (module7 && module7.exports) { + module7.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorwow = impl; + } + })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); + } +}); +var require_xorshift7 = __commonJS({ + "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/xorshift7.js"(exports, module6) { + (function(global2, module7, 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 (module7 && module7.exports) { + module7.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorshift7 = impl; + } + })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); + } +}); +var require_xor4096 = __commonJS({ + "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/xor4096.js"(exports, module6) { + (function(global2, module7, 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 (module7 && module7.exports) { + module7.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor4096 = impl; + } + })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); + } +}); +var require_tychei = __commonJS({ + "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/tychei.js"(exports, module6) { + (function(global2, module7, 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 (module7 && module7.exports) { + module7.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.tychei = impl; + } + })(exports, typeof module6 == "object" && module6, 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, module6) { + (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, options2, callback) { + var key = []; + options2 = options2 == true ? { entropy: true } : options2 || {}; + var shortseed = mixkey(flatten4(options2.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 (options2.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 options2 ? options2.global : this == math, options2.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 browser4 = global2.navigator, plugins = browser4 && browser4.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 module6 == "object" && module6.exports) { + module6.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, module6) { + 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; + module6.exports = sr; + } +}); +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.6.0_@tensorflow+tfjs-core@3.6.0/node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.js"(exports, module6) { + 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, module7) { + var exports3 = instance.exports; + Module["asm"] = exports3; + wasmTable = Module["asm"]["F"]; + wasmModule = module7; + 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 = { 9816: function() { + throw "Canceled!"; + }, 9834: 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, name6) { + } + 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, string, 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()[string + 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 name6 = u.name; + ptable.maxUniformLength = Math.max(ptable.maxUniformLength, name6.length + 1); + if (name6.slice(-1) == "]") { + name6 = name6.slice(0, name6.lastIndexOf("[")); + } + var loc = GLctx.getUniformLocation(p2, name6); + if (loc) { + var id = GL.getNewId(GL.uniforms); + utable[name6] = [u.size, id]; + GL.uniforms[id] = loc; + for (var j = 1; j < u.size; ++j) { + var n = name6 + "[" + 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(name6) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(6, 1, name6); + switch (name6) { + 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 _CropAndResize = Module["_CropAndResize"] = function() { + return (_CropAndResize = Module["_CropAndResize"] = Module["asm"]["T"]).apply(null, arguments); + }; + var _Cumsum = Module["_Cumsum"] = function() { + return (_Cumsum = Module["_Cumsum"] = Module["asm"]["U"]).apply(null, arguments); + }; + var _DepthToSpace = Module["_DepthToSpace"] = function() { + return (_DepthToSpace = Module["_DepthToSpace"] = Module["asm"]["V"]).apply(null, arguments); + }; + var _DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = function() { + return (_DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = Module["asm"]["W"]).apply(null, arguments); + }; + var _Equal = Module["_Equal"] = function() { + return (_Equal = Module["_Equal"] = Module["asm"]["X"]).apply(null, arguments); + }; + var _Exp = Module["_Exp"] = function() { + return (_Exp = Module["_Exp"] = Module["asm"]["Y"]).apply(null, arguments); + }; + var _FlipLeftRight = Module["_FlipLeftRight"] = function() { + return (_FlipLeftRight = Module["_FlipLeftRight"] = Module["asm"]["Z"]).apply(null, arguments); + }; + var _Floor = Module["_Floor"] = function() { + return (_Floor = Module["_Floor"] = Module["asm"]["_"]).apply(null, arguments); + }; + var _FloorDiv = Module["_FloorDiv"] = function() { + return (_FloorDiv = Module["_FloorDiv"] = Module["asm"]["$"]).apply(null, arguments); + }; + var _FusedBatchNorm = Module["_FusedBatchNorm"] = function() { + return (_FusedBatchNorm = Module["_FusedBatchNorm"] = Module["asm"]["aa"]).apply(null, arguments); + }; + var _FusedConv2D = Module["_FusedConv2D"] = function() { + return (_FusedConv2D = Module["_FusedConv2D"] = Module["asm"]["ba"]).apply(null, arguments); + }; + var _FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = function() { + return (_FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = Module["asm"]["ca"]).apply(null, arguments); + }; + var _Gather = Module["_Gather"] = function() { + return (_Gather = Module["_Gather"] = Module["asm"]["da"]).apply(null, arguments); + }; + var _GatherNd = Module["_GatherNd"] = function() { + return (_GatherNd = Module["_GatherNd"] = Module["asm"]["ea"]).apply(null, arguments); + }; + var _Greater = Module["_Greater"] = function() { + return (_Greater = Module["_Greater"] = Module["asm"]["fa"]).apply(null, arguments); + }; + var _GreaterEqual = Module["_GreaterEqual"] = function() { + return (_GreaterEqual = Module["_GreaterEqual"] = Module["asm"]["ga"]).apply(null, arguments); + }; + var _LeakyRelu = Module["_LeakyRelu"] = function() { + return (_LeakyRelu = Module["_LeakyRelu"] = Module["asm"]["ha"]).apply(null, arguments); + }; + var _Less = Module["_Less"] = function() { + return (_Less = Module["_Less"] = Module["asm"]["ia"]).apply(null, arguments); + }; + var _LessEqual = Module["_LessEqual"] = function() { + return (_LessEqual = Module["_LessEqual"] = Module["asm"]["ja"]).apply(null, arguments); + }; + var _Log = Module["_Log"] = function() { + return (_Log = Module["_Log"] = Module["asm"]["ka"]).apply(null, arguments); + }; + var _LogicalAnd = Module["_LogicalAnd"] = function() { + return (_LogicalAnd = Module["_LogicalAnd"] = Module["asm"]["la"]).apply(null, arguments); + }; + var _Max = Module["_Max"] = function() { + return (_Max = Module["_Max"] = Module["asm"]["ma"]).apply(null, arguments); + }; + var _MaxPool = Module["_MaxPool"] = function() { + return (_MaxPool = Module["_MaxPool"] = Module["asm"]["na"]).apply(null, arguments); + }; + var _Maximum = Module["_Maximum"] = function() { + return (_Maximum = Module["_Maximum"] = Module["asm"]["oa"]).apply(null, arguments); + }; + var _Mean = Module["_Mean"] = function() { + return (_Mean = Module["_Mean"] = Module["asm"]["pa"]).apply(null, arguments); + }; + var _Min = Module["_Min"] = function() { + return (_Min = Module["_Min"] = Module["asm"]["qa"]).apply(null, arguments); + }; + var _Minimum = Module["_Minimum"] = function() { + return (_Minimum = Module["_Minimum"] = Module["asm"]["ra"]).apply(null, arguments); + }; + var _MirrorPad = Module["_MirrorPad"] = function() { + return (_MirrorPad = Module["_MirrorPad"] = Module["asm"]["sa"]).apply(null, arguments); + }; + var _Multiply = Module["_Multiply"] = function() { + return (_Multiply = Module["_Multiply"] = Module["asm"]["ta"]).apply(null, arguments); + }; + var _Neg = Module["_Neg"] = function() { + return (_Neg = Module["_Neg"] = Module["asm"]["ua"]).apply(null, arguments); + }; + var _NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = function() { + return (_NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = Module["asm"]["va"]).apply(null, arguments); + }; + var _NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = function() { + return (_NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = Module["asm"]["wa"]).apply(null, arguments); + }; + var _NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = function() { + return (_NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = Module["asm"]["xa"]).apply(null, arguments); + }; + var _NotEqual = Module["_NotEqual"] = function() { + return (_NotEqual = Module["_NotEqual"] = Module["asm"]["ya"]).apply(null, arguments); + }; + var _OneHot = Module["_OneHot"] = function() { + return (_OneHot = Module["_OneHot"] = Module["asm"]["za"]).apply(null, arguments); + }; + var _PadV2 = Module["_PadV2"] = function() { + return (_PadV2 = Module["_PadV2"] = Module["asm"]["Aa"]).apply(null, arguments); + }; + var _Pow = Module["_Pow"] = function() { + return (_Pow = Module["_Pow"] = Module["asm"]["Ba"]).apply(null, arguments); + }; + var _Prelu = Module["_Prelu"] = function() { + return (_Prelu = Module["_Prelu"] = Module["asm"]["Ca"]).apply(null, arguments); + }; + var _Prod = Module["_Prod"] = function() { + return (_Prod = Module["_Prod"] = Module["asm"]["Da"]).apply(null, arguments); + }; + var _RealDiv = Module["_RealDiv"] = function() { + return (_RealDiv = Module["_RealDiv"] = Module["asm"]["Ea"]).apply(null, arguments); + }; + var _Relu = Module["_Relu"] = function() { + return (_Relu = Module["_Relu"] = Module["asm"]["Fa"]).apply(null, arguments); + }; + var _Relu6 = Module["_Relu6"] = function() { + return (_Relu6 = Module["_Relu6"] = Module["asm"]["Ga"]).apply(null, arguments); + }; + var _ResizeBilinear = Module["_ResizeBilinear"] = function() { + return (_ResizeBilinear = Module["_ResizeBilinear"] = Module["asm"]["Ha"]).apply(null, arguments); + }; + var _Reverse = Module["_Reverse"] = function() { + return (_Reverse = Module["_Reverse"] = Module["asm"]["Ia"]).apply(null, arguments); + }; + var _RotateWithOffset = Module["_RotateWithOffset"] = function() { + return (_RotateWithOffset = Module["_RotateWithOffset"] = Module["asm"]["Ja"]).apply(null, arguments); + }; + var _Round = Module["_Round"] = function() { + return (_Round = Module["_Round"] = Module["asm"]["Ka"]).apply(null, arguments); + }; + var _Rsqrt = Module["_Rsqrt"] = function() { + return (_Rsqrt = Module["_Rsqrt"] = Module["asm"]["La"]).apply(null, arguments); + }; + var _ScatterNd = Module["_ScatterNd"] = function() { + return (_ScatterNd = Module["_ScatterNd"] = Module["asm"]["Ma"]).apply(null, arguments); + }; + var _SelectV2 = Module["_SelectV2"] = function() { + return (_SelectV2 = Module["_SelectV2"] = Module["asm"]["Na"]).apply(null, arguments); + }; + var _Sigmoid = Module["_Sigmoid"] = function() { + return (_Sigmoid = Module["_Sigmoid"] = Module["asm"]["Oa"]).apply(null, arguments); + }; + var _Sin = Module["_Sin"] = function() { + return (_Sin = Module["_Sin"] = Module["asm"]["Pa"]).apply(null, arguments); + }; + var _Softmax = Module["_Softmax"] = function() { + return (_Softmax = Module["_Softmax"] = Module["asm"]["Qa"]).apply(null, arguments); + }; + var _Sqrt = Module["_Sqrt"] = function() { + return (_Sqrt = Module["_Sqrt"] = Module["asm"]["Ra"]).apply(null, arguments); + }; + var _Square = Module["_Square"] = function() { + return (_Square = Module["_Square"] = Module["asm"]["Sa"]).apply(null, arguments); + }; + var _SquaredDifference = Module["_SquaredDifference"] = function() { + return (_SquaredDifference = Module["_SquaredDifference"] = Module["asm"]["Ta"]).apply(null, arguments); + }; + var _Step = Module["_Step"] = function() { + return (_Step = Module["_Step"] = Module["asm"]["Ua"]).apply(null, arguments); + }; + var _StridedSlice = Module["_StridedSlice"] = function() { + return (_StridedSlice = Module["_StridedSlice"] = Module["asm"]["Va"]).apply(null, arguments); + }; + var _Sub = Module["_Sub"] = function() { + return (_Sub = Module["_Sub"] = Module["asm"]["Wa"]).apply(null, arguments); + }; + var _Sum = Module["_Sum"] = function() { + return (_Sum = Module["_Sum"] = Module["asm"]["Xa"]).apply(null, arguments); + }; + var _Tan = Module["_Tan"] = function() { + return (_Tan = Module["_Tan"] = Module["asm"]["Ya"]).apply(null, arguments); + }; + var _Tanh = Module["_Tanh"] = function() { + return (_Tanh = Module["_Tanh"] = Module["asm"]["Za"]).apply(null, arguments); + }; + var _Tile = Module["_Tile"] = function() { + return (_Tile = Module["_Tile"] = Module["asm"]["_a"]).apply(null, arguments); + }; + var _TopK = Module["_TopK"] = function() { + return (_TopK = Module["_TopK"] = Module["asm"]["$a"]).apply(null, arguments); + }; + var _Transform = Module["_Transform"] = function() { + return (_Transform = Module["_Transform"] = Module["asm"]["ab"]).apply(null, arguments); + }; + var _Transpose = Module["_Transpose"] = function() { + return (_Transpose = Module["_Transpose"] = Module["asm"]["bb"]).apply(null, arguments); + }; + var __FusedMatMul = Module["__FusedMatMul"] = function() { + return (__FusedMatMul = Module["__FusedMatMul"] = Module["asm"]["cb"]).apply(null, arguments); + }; + var _malloc = Module["_malloc"] = function() { + return (_malloc = Module["_malloc"] = Module["asm"]["db"]).apply(null, arguments); + }; + var _free = Module["_free"] = function() { + return (_free = Module["_free"] = Module["asm"]["eb"]).apply(null, arguments); + }; + var ___errno_location = Module["___errno_location"] = function() { + return (___errno_location = Module["___errno_location"] = Module["asm"]["fb"]).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"]["gb"]).apply(null, arguments); + }; + var _pthread_self = Module["_pthread_self"] = function() { + return (_pthread_self = Module["_pthread_self"] = Module["asm"]["hb"]).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"]["ib"]).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"]["jb"]).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"]["kb"]).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"]["lb"]).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"]["mb"]).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"]["nb"]).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"]["ob"]).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"]["pb"]).apply(null, arguments); + }; + var _emscripten_tls_init = Module["_emscripten_tls_init"] = function() { + return (_emscripten_tls_init = Module["_emscripten_tls_init"] = Module["asm"]["qb"]).apply(null, arguments); + }; + var __emscripten_thread_init = Module["__emscripten_thread_init"] = function() { + return (__emscripten_thread_init = Module["__emscripten_thread_init"] = Module["asm"]["rb"]).apply(null, arguments); + }; + var stackSave = Module["stackSave"] = function() { + return (stackSave = Module["stackSave"] = Module["asm"]["sb"]).apply(null, arguments); + }; + var stackRestore = Module["stackRestore"] = function() { + return (stackRestore = Module["stackRestore"] = Module["asm"]["tb"]).apply(null, arguments); + }; + var stackAlloc = Module["stackAlloc"] = function() { + return (stackAlloc = Module["stackAlloc"] = Module["asm"]["ub"]).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"]["vb"]).apply(null, arguments); + }; + var _memalign = Module["_memalign"] = function() { + return (_memalign = Module["_memalign"] = Module["asm"]["wb"]).apply(null, arguments); + }; + var __emscripten_allow_main_runtime_queued_calls = Module["__emscripten_allow_main_runtime_queued_calls"] = 9808; + var __emscripten_main_thread_futex = Module["__emscripten_main_thread_futex"] = 11432; + 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 module6 === "object") + module6.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.6.0_@tensorflow+tfjs-core@3.6.0/node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js"(exports, module6) { + 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, module7) { + 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(name6) { + switch (name6) { + 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 _CropAndResize = Module["_CropAndResize"] = function() { + return (_CropAndResize = Module["_CropAndResize"] = Module["asm"]["C"]).apply(null, arguments); + }; + var _Cumsum = Module["_Cumsum"] = function() { + return (_Cumsum = Module["_Cumsum"] = Module["asm"]["D"]).apply(null, arguments); + }; + var _DepthToSpace = Module["_DepthToSpace"] = function() { + return (_DepthToSpace = Module["_DepthToSpace"] = Module["asm"]["E"]).apply(null, arguments); + }; + var _DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = function() { + return (_DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = Module["asm"]["F"]).apply(null, arguments); + }; + var _Equal = Module["_Equal"] = function() { + return (_Equal = Module["_Equal"] = Module["asm"]["G"]).apply(null, arguments); + }; + var _Exp = Module["_Exp"] = function() { + return (_Exp = Module["_Exp"] = Module["asm"]["H"]).apply(null, arguments); + }; + var _FlipLeftRight = Module["_FlipLeftRight"] = function() { + return (_FlipLeftRight = Module["_FlipLeftRight"] = Module["asm"]["I"]).apply(null, arguments); + }; + var _Floor = Module["_Floor"] = function() { + return (_Floor = Module["_Floor"] = Module["asm"]["J"]).apply(null, arguments); + }; + var _FloorDiv = Module["_FloorDiv"] = function() { + return (_FloorDiv = Module["_FloorDiv"] = Module["asm"]["K"]).apply(null, arguments); + }; + var _FusedBatchNorm = Module["_FusedBatchNorm"] = function() { + return (_FusedBatchNorm = Module["_FusedBatchNorm"] = Module["asm"]["L"]).apply(null, arguments); + }; + var _FusedConv2D = Module["_FusedConv2D"] = function() { + return (_FusedConv2D = Module["_FusedConv2D"] = Module["asm"]["M"]).apply(null, arguments); + }; + var _FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = function() { + return (_FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = Module["asm"]["N"]).apply(null, arguments); + }; + var _Gather = Module["_Gather"] = function() { + return (_Gather = Module["_Gather"] = Module["asm"]["O"]).apply(null, arguments); + }; + var _GatherNd = Module["_GatherNd"] = function() { + return (_GatherNd = Module["_GatherNd"] = Module["asm"]["P"]).apply(null, arguments); + }; + var _Greater = Module["_Greater"] = function() { + return (_Greater = Module["_Greater"] = Module["asm"]["Q"]).apply(null, arguments); + }; + var _GreaterEqual = Module["_GreaterEqual"] = function() { + return (_GreaterEqual = Module["_GreaterEqual"] = Module["asm"]["R"]).apply(null, arguments); + }; + var _LeakyRelu = Module["_LeakyRelu"] = function() { + return (_LeakyRelu = Module["_LeakyRelu"] = Module["asm"]["S"]).apply(null, arguments); + }; + var _Less = Module["_Less"] = function() { + return (_Less = Module["_Less"] = Module["asm"]["T"]).apply(null, arguments); + }; + var _LessEqual = Module["_LessEqual"] = function() { + return (_LessEqual = Module["_LessEqual"] = Module["asm"]["U"]).apply(null, arguments); + }; + var _Log = Module["_Log"] = function() { + return (_Log = Module["_Log"] = Module["asm"]["V"]).apply(null, arguments); + }; + var _LogicalAnd = Module["_LogicalAnd"] = function() { + return (_LogicalAnd = Module["_LogicalAnd"] = Module["asm"]["W"]).apply(null, arguments); + }; + var _Max = Module["_Max"] = function() { + return (_Max = Module["_Max"] = Module["asm"]["X"]).apply(null, arguments); + }; + var _MaxPool = Module["_MaxPool"] = function() { + return (_MaxPool = Module["_MaxPool"] = Module["asm"]["Y"]).apply(null, arguments); + }; + var _Maximum = Module["_Maximum"] = function() { + return (_Maximum = Module["_Maximum"] = Module["asm"]["Z"]).apply(null, arguments); + }; + var _Mean = Module["_Mean"] = function() { + return (_Mean = Module["_Mean"] = Module["asm"]["_"]).apply(null, arguments); + }; + var _Min = Module["_Min"] = function() { + return (_Min = Module["_Min"] = Module["asm"]["$"]).apply(null, arguments); + }; + var _Minimum = Module["_Minimum"] = function() { + return (_Minimum = Module["_Minimum"] = Module["asm"]["aa"]).apply(null, arguments); + }; + var _MirrorPad = Module["_MirrorPad"] = function() { + return (_MirrorPad = Module["_MirrorPad"] = Module["asm"]["ba"]).apply(null, arguments); + }; + var _Multiply = Module["_Multiply"] = function() { + return (_Multiply = Module["_Multiply"] = Module["asm"]["ca"]).apply(null, arguments); + }; + var _Neg = Module["_Neg"] = function() { + return (_Neg = Module["_Neg"] = Module["asm"]["da"]).apply(null, arguments); + }; + var _NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = function() { + return (_NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = Module["asm"]["ea"]).apply(null, arguments); + }; + var _NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = function() { + return (_NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = Module["asm"]["fa"]).apply(null, arguments); + }; + var _NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = function() { + return (_NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = Module["asm"]["ga"]).apply(null, arguments); + }; + var _NotEqual = Module["_NotEqual"] = function() { + return (_NotEqual = Module["_NotEqual"] = Module["asm"]["ha"]).apply(null, arguments); + }; + var _OneHot = Module["_OneHot"] = function() { + return (_OneHot = Module["_OneHot"] = Module["asm"]["ia"]).apply(null, arguments); + }; + var _PadV2 = Module["_PadV2"] = function() { + return (_PadV2 = Module["_PadV2"] = Module["asm"]["ja"]).apply(null, arguments); + }; + var _Pow = Module["_Pow"] = function() { + return (_Pow = Module["_Pow"] = Module["asm"]["ka"]).apply(null, arguments); + }; + var _Prelu = Module["_Prelu"] = function() { + return (_Prelu = Module["_Prelu"] = Module["asm"]["la"]).apply(null, arguments); + }; + var _Prod = Module["_Prod"] = function() { + return (_Prod = Module["_Prod"] = Module["asm"]["ma"]).apply(null, arguments); + }; + var _RealDiv = Module["_RealDiv"] = function() { + return (_RealDiv = Module["_RealDiv"] = Module["asm"]["na"]).apply(null, arguments); + }; + var _Relu = Module["_Relu"] = function() { + return (_Relu = Module["_Relu"] = Module["asm"]["oa"]).apply(null, arguments); + }; + var _Relu6 = Module["_Relu6"] = function() { + return (_Relu6 = Module["_Relu6"] = Module["asm"]["pa"]).apply(null, arguments); + }; + var _ResizeBilinear = Module["_ResizeBilinear"] = function() { + return (_ResizeBilinear = Module["_ResizeBilinear"] = Module["asm"]["qa"]).apply(null, arguments); + }; + var _Reverse = Module["_Reverse"] = function() { + return (_Reverse = Module["_Reverse"] = Module["asm"]["ra"]).apply(null, arguments); + }; + var _RotateWithOffset = Module["_RotateWithOffset"] = function() { + return (_RotateWithOffset = Module["_RotateWithOffset"] = Module["asm"]["sa"]).apply(null, arguments); + }; + var _Round = Module["_Round"] = function() { + return (_Round = Module["_Round"] = Module["asm"]["ta"]).apply(null, arguments); + }; + var _Rsqrt = Module["_Rsqrt"] = function() { + return (_Rsqrt = Module["_Rsqrt"] = Module["asm"]["ua"]).apply(null, arguments); + }; + var _ScatterNd = Module["_ScatterNd"] = function() { + return (_ScatterNd = Module["_ScatterNd"] = Module["asm"]["va"]).apply(null, arguments); + }; + var _SelectV2 = Module["_SelectV2"] = function() { + return (_SelectV2 = Module["_SelectV2"] = Module["asm"]["wa"]).apply(null, arguments); + }; + var _Sigmoid = Module["_Sigmoid"] = function() { + return (_Sigmoid = Module["_Sigmoid"] = Module["asm"]["xa"]).apply(null, arguments); + }; + var _Sin = Module["_Sin"] = function() { + return (_Sin = Module["_Sin"] = Module["asm"]["ya"]).apply(null, arguments); + }; + var _Softmax = Module["_Softmax"] = function() { + return (_Softmax = Module["_Softmax"] = Module["asm"]["za"]).apply(null, arguments); + }; + var _Sqrt = Module["_Sqrt"] = function() { + return (_Sqrt = Module["_Sqrt"] = Module["asm"]["Aa"]).apply(null, arguments); + }; + var _Square = Module["_Square"] = function() { + return (_Square = Module["_Square"] = Module["asm"]["Ba"]).apply(null, arguments); + }; + var _SquaredDifference = Module["_SquaredDifference"] = function() { + return (_SquaredDifference = Module["_SquaredDifference"] = Module["asm"]["Ca"]).apply(null, arguments); + }; + var _Step = Module["_Step"] = function() { + return (_Step = Module["_Step"] = Module["asm"]["Da"]).apply(null, arguments); + }; + var _StridedSlice = Module["_StridedSlice"] = function() { + return (_StridedSlice = Module["_StridedSlice"] = Module["asm"]["Ea"]).apply(null, arguments); + }; + var _Sub = Module["_Sub"] = function() { + return (_Sub = Module["_Sub"] = Module["asm"]["Fa"]).apply(null, arguments); + }; + var _Sum = Module["_Sum"] = function() { + return (_Sum = Module["_Sum"] = Module["asm"]["Ga"]).apply(null, arguments); + }; + var _Tan = Module["_Tan"] = function() { + return (_Tan = Module["_Tan"] = Module["asm"]["Ha"]).apply(null, arguments); + }; + var _Tanh = Module["_Tanh"] = function() { + return (_Tanh = Module["_Tanh"] = Module["asm"]["Ia"]).apply(null, arguments); + }; + var _Tile = Module["_Tile"] = function() { + return (_Tile = Module["_Tile"] = Module["asm"]["Ja"]).apply(null, arguments); + }; + var _TopK = Module["_TopK"] = function() { + return (_TopK = Module["_TopK"] = Module["asm"]["Ka"]).apply(null, arguments); + }; + var _Transform = Module["_Transform"] = function() { + return (_Transform = Module["_Transform"] = Module["asm"]["La"]).apply(null, arguments); + }; + var _Transpose = Module["_Transpose"] = function() { + return (_Transpose = Module["_Transpose"] = Module["asm"]["Ma"]).apply(null, arguments); + }; + var __FusedMatMul = Module["__FusedMatMul"] = function() { + return (__FusedMatMul = Module["__FusedMatMul"] = Module["asm"]["Na"]).apply(null, arguments); + }; + var _malloc = Module["_malloc"] = function() { + return (_malloc = Module["_malloc"] = Module["asm"]["Oa"]).apply(null, arguments); + }; + var _free = Module["_free"] = function() { + return (_free = Module["_free"] = Module["asm"]["Pa"]).apply(null, arguments); + }; + var ___errno_location = Module["___errno_location"] = function() { + return (___errno_location = Module["___errno_location"] = Module["asm"]["Qa"]).apply(null, arguments); + }; + var stackSave = Module["stackSave"] = function() { + return (stackSave = Module["stackSave"] = Module["asm"]["Ra"]).apply(null, arguments); + }; + var stackRestore = Module["stackRestore"] = function() { + return (stackRestore = Module["stackRestore"] = Module["asm"]["Sa"]).apply(null, arguments); + }; + var stackAlloc = Module["stackAlloc"] = function() { + return (stackAlloc = Module["stackAlloc"] = Module["asm"]["Ta"]).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 module6 === "object") + module6.exports = WasmBackendModule; + else if (typeof define === "function" && define["amd"]) + define([], function() { + return WasmBackendModule; + }); + else if (typeof exports === "object") + exports["WasmBackendModule"] = WasmBackendModule; + } +}); +var require_alea2 = __commonJS({ + "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/alea.js"(exports, module6) { + (function(global2, module7, 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 (module7 && module7.exports) { + module7.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.alea = impl; + } + })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); + } +}); +var require_xor1282 = __commonJS({ + "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xor128.js"(exports, module6) { + (function(global2, module7, 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 (module7 && module7.exports) { + module7.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor128 = impl; + } + })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); + } +}); +var require_xorwow2 = __commonJS({ + "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xorwow.js"(exports, module6) { + (function(global2, module7, 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 (module7 && module7.exports) { + module7.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorwow = impl; + } + })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); + } +}); +var require_xorshift72 = __commonJS({ + "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xorshift7.js"(exports, module6) { + (function(global2, module7, 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 (module7 && module7.exports) { + module7.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorshift7 = impl; + } + })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); + } +}); +var require_xor40962 = __commonJS({ + "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xor4096.js"(exports, module6) { + (function(global2, module7, 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 (module7 && module7.exports) { + module7.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor4096 = impl; + } + })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); + } +}); +var require_tychei2 = __commonJS({ + "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/tychei.js"(exports, module6) { + (function(global2, module7, 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 (module7 && module7.exports) { + module7.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.tychei = impl; + } + })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); + } +}); +var require_seedrandom3 = __commonJS({ + "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/seedrandom.js"(exports, module6) { + (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, options2, callback) { + var key = []; + options2 = options2 == true ? { entropy: true } : options2 || {}; + var shortseed = mixkey(flatten4(options2.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 (options2.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 options2 ? options2.global : this == math, options2.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 browser4 = global2.navigator, plugins = browser4 && browser4.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 module6 == "object" && module6.exports) { + module6.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, module6) { + 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; + module6.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 package_exports = {}; +__export2(package_exports, { + bin: () => bin, + browser: () => browser, + default: () => package_default, + dependencies: () => dependencies, + description: () => description, + devDependencies: () => devDependencies, + jsdelivr: () => jsdelivr, + license: () => license, + main: () => main, + miniprogram: () => miniprogram, + module: () => module, + name: () => name, + private: () => private2, + repository: () => repository, + scripts: () => scripts, + types: () => types, + unpkg: () => unpkg, + version: () => version +}); +var name = "@tensorflow/tfjs"; +var version = "3.6.0"; +var description = "An open-source machine learning framework."; +var private2 = false; +var main = "dist/tf.node.js"; +var module = "dist/index.js"; +var jsdelivr = "dist/tf.min.js"; +var unpkg = "dist/tf.min.js"; +var types = "dist/index.d.ts"; +var miniprogram = "dist/miniprogram"; +var bin = { + "tfjs-custom-module": "dist/tools/custom_module/cli.js" +}; +var repository = { + type: "git", + url: "https://github.com/tensorflow/tfjs.git" +}; +var license = "Apache-2.0"; +var devDependencies = { + "@babel/core": "^7.9.0", + "@babel/polyfill": "^7.10.4", + "@babel/preset-env": "^7.9.5", + "@rollup/plugin-commonjs": "^11.0.2", + "@rollup/plugin-node-resolve": "^7.1.1", + "@rollup/plugin-typescript": "^3.0.0", + "@types/argparse": "^1.0.38", + "@types/jasmine": "2.8.7", + "@types/node": "~10.17.50", + "@types/shelljs": "^0.8.4", + "@types/yargs": "^15.0.7", + "clang-format": "~1.2.2", + commander: "~2.14.1", + jasmine: "3.1.0", + "jasmine-core": "~3.1.0", + karma: "~6.3.2", + "karma-browserstack-launcher": "~1.6.0", + "karma-chrome-launcher": "~2.2.0", + "karma-firefox-launcher": "~1.1.0", + "karma-jasmine": "~1.1.1", + "karma-typescript": "~5.5.1", + "karma-typescript-es6-transform": "^5.5.1", + "npm-run-all": "~4.1.3", + rimraf: "~2.6.2", + rollup: "~2.3.2", + "rollup-plugin-babel": "^4.4.0", + "rollup-plugin-terser": "~7.0.2", + "rollup-plugin-visualizer": "~4.2.2", + shelljs: "~0.8.1", + "ts-node": "~8.8.2", + tslint: "~5.11.0", + "tslint-no-circular-imports": "~0.5.0", + typescript: "3.5.3", + yalc: "1.0.0-pre.50" +}; +var scripts = { + build: "tsc && yarn build-cli && yarn bundle", + "build-ci": "tsc && yarn build-cli && yarn bundle-ci", + bundle: "rollup -c", + "bundle-ci": "rollup -c --ci", + "build-core": "cd ../tfjs-core && yarn && yarn build", + "build-core-ci": "cd ../tfjs-core && yarn && yarn build-ci", + "build-layers": "cd ../tfjs-layers && yarn && yarn build", + "build-layers-ci": "cd ../tfjs-layers && yarn && yarn build-ci", + "build-converter": "cd ../tfjs-converter && yarn && yarn build", + "build-converter-ci": "cd ../tfjs-converter && yarn && yarn build-ci", + "build-data": "cd ../tfjs-data && yarn && yarn build", + "build-data-ci": "cd ../tfjs-data && yarn && yarn build-ci", + "build-backend-cpu": "cd ../tfjs-backend-cpu && yarn && yarn build", + "build-backend-cpu-ci": "cd ../tfjs-backend-cpu && yarn && yarn build-ci", + "build-backend-webgl": "cd ../tfjs-backend-webgl && yarn && yarn build", + "build-backend-webgl-ci": "cd ../tfjs-backend-webgl && yarn && yarn build-ci", + "build-deps": "yarn build-core && yarn build-layers && yarn build-converter && yarn build-data && yarn build-backend-cpu && yarn build-backend-webgl", + "build-deps-ci": "yarn build-core-ci && yarn build-layers-ci && yarn build-converter-ci && yarn build-data-ci && yarn build-backend-cpu-ci && yarn build-backend-webgl-ci", + "build-cli": "tsc --project ./tools/custom_module/tsconfig.json && chmod +x ./dist/tools/custom_module/cli.js", + "run-custom-build": "ts-node -s ./tools/custom_module/cli.ts", + "build-npm": "./scripts/build-npm.sh", + "link-local": "yalc link", + "publish-local": "yarn build-npm && yalc push", + "publish-npm": "npm publish", + lint: "tslint -p . -t verbose", + coverage: "KARMA_COVERAGE=1 karma start --browsers='Chrome' --singleRun", + test: "yarn && yarn build-deps && yarn build && karma start", + "test-dev": "karma start", + "test-tools": "ts-node --project ./tools/custom_module/tsconfig.json run_tools_tests.ts", + "test-ci": "./scripts/test-ci.sh" +}; +var dependencies = { + "@tensorflow/tfjs-backend-cpu": "3.6.0", + "@tensorflow/tfjs-backend-webgl": "3.6.0", + "@tensorflow/tfjs-converter": "3.6.0", + "@tensorflow/tfjs-core": "3.6.0", + "@tensorflow/tfjs-data": "3.6.0", + "@tensorflow/tfjs-layers": "3.6.0", + argparse: "^1.0.10", + chalk: "^4.1.0", + "core-js": "3", + "regenerator-runtime": "^0.13.5", + yargs: "^16.0.3" +}; +var browser = { + "node-fetch": false, + util: false, + crypto: false +}; +var package_default = { + name, + version, + description, + private: private2, + main, + module, + jsdelivr, + unpkg, + types, + miniprogram, + bin, + repository, + license, + devDependencies, + scripts, + dependencies, + browser +}; +var package_exports2 = {}; +__export2(package_exports2, { + browser: () => browser2, + default: () => package_default2, + dependencies: () => dependencies2, + description: () => description2, + devDependencies: () => devDependencies2, + engines: () => engines, + jsdelivr: () => jsdelivr2, + "jsnext:main": () => jsnext_main, + license: () => license2, + main: () => main2, + miniprogram: () => miniprogram2, + module: () => module2, + name: () => name2, + private: () => private3, + repository: () => repository2, + scripts: () => scripts2, + sideEffects: () => sideEffects, + types: () => types2, + unpkg: () => unpkg2, + version: () => version2 +}); +var name2 = "@tensorflow/tfjs-core"; +var version2 = "3.6.0"; +var description2 = "Hardware-accelerated JavaScript library for machine intelligence"; +var private3 = false; +var main2 = "dist/tf-core.node.js"; +var jsdelivr2 = "dist/tf-core.min.js"; +var unpkg2 = "dist/tf-core.min.js"; +var types2 = "dist/index.d.ts"; +var jsnext_main = "dist/index.js"; +var module2 = "dist/index.js"; +var miniprogram2 = "dist/miniprogram"; +var engines = { + yarn: ">= 1.3.2" +}; +var repository2 = { + type: "git", + url: "https://github.com/tensorflow/tfjs-core.git" +}; +var license2 = "Apache-2.0"; +var devDependencies2 = { + "@bazel/bazelisk": "^1.3.0", + "@bazel/typescript": "^0.27.8", + "@rollup/plugin-commonjs": "^11.0.2", + "@rollup/plugin-node-resolve": "^7.1.1", + "@rollup/plugin-typescript": "^3.0.0", + "@tensorflow/tfjs-backend-cpu": "link:../tfjs-backend-cpu", + "@types/jasmine": "~3.0.0", + "@types/node": "~9.6.0", + "@types/node-fetch": "~2.1.2", + "clang-format": "~1.2.4", + jasmine: "~3.1.0", + "jasmine-core": "~3.1.0", + karma: "6.3.2", + "karma-browserstack-launcher": "~1.6.0", + "karma-chrome-launcher": "~3.1.0", + "karma-jasmine": "~4.0.1", + "karma-typescript": "~5.5.1", + "npm-run-all": "~4.1.3", + rimraf: "~2.6.2", + rollup: "~2.3.2", + "rollup-plugin-terser": "~5.3.0", + "rollup-plugin-visualizer": "~3.3.2", + shelljs: "~0.8.3", + "ts-node": "~8.8.2", + tslint: "~5.11.0", + "tslint-no-circular-imports": "~0.5.0", + typescript: "3.5.3", + yalc: "~1.0.0-pre.21", + yargs: "~13.2.2" +}; +var scripts2 = { + "build-ci": "./scripts/enumerate-tests.js --ci && tsc && yarn bundle-ci && yarn build-test-snippets", + build: "node ./scripts/enumerate-tests.js && tsc && yarn bundle", + bundle: "rollup -c", + "bundle-ci": "rollup -c --ci", + "build-npm": "./scripts/build-npm.sh", + "build-deps": "yarn build && yarn build-cpu-backend", + "build-cpu-backend": "cd ../tfjs-backend-cpu && yarn && yarn build", + "build-cpu-backend-ci": "cd ../tfjs-backend-cpu && yarn && yarn build-ci", + "build:bazel": "bazelisk build //...", + "build-test-snippets": "yarn tsc --project ./scripts/test_snippets/tsconfig.json", + "format-all": "clang-format -i -style=Google --glob=src/**/*.ts", + "link-local": "yalc link", + "publish-local": "rimraf dist/ && yarn build && rollup -c && yalc push", + "publish-npm": "npm publish", + lint: "tslint -p . -t verbose", + coverage: "KARMA_COVERAGE=1 karma start --browsers='Chrome' --singleRun", + test: "yarn && yarn build-deps && karma start", + "test-dev": "karma start", + "test-ci": "./scripts/test-ci.sh", + "test-webworker": "karma start --worker", + "run-browserstack": "karma start --browserstack", + "test-bundle-size": "./scripts/test-bundle-size.js", + "test-node": "rimraf dist/ && yarn build-deps && yarn build && ts-node --transpile-only --skip-ignore -P tsconfig.test.json dist/test_node.js", + "test-node-dev": "tsc && ts-node --transpile-only --skip-ignore -P tsconfig.test.json dist/test_node.js", + "test-node-ci": "ts-node --transpile-only -P tsconfig.test.json dist/test_node.js", + "test-async-backends": "rimraf dist/ && yarn build && ts-node --transpile-only -P tsconfig.test.json dist/test_async_backends.js", + "test-async-backends-ci": "ts-node --transpile-only -P tsconfig.test.json dist/test_async_backends.js", + "test-snippets": "yarn build && yarn build-cpu-backend && ts-node -P tsconfig.test.json ./scripts/test_snippets/test_snippets.ts", + "test-snippets-ci": "ts-node -P tsconfig.test.json ./scripts/test_snippets/test_snippets.ts" +}; +var dependencies2 = { + "@types/offscreencanvas": "~2019.3.0", + "@types/seedrandom": "2.4.27", + "@types/webgl-ext": "0.0.30", + "node-fetch": "~2.6.1", + seedrandom: "2.4.3" +}; +var browser2 = { + "node-fetch": false, + util: false, + crypto: false, + worker_threads: false +}; +var sideEffects = [ + "./dist/index.js", + "./dist/engine.js", + "./dist/tensor.js", + "./dist/base_side_effects.js", + "./dist/flags.js", + "./dist/platforms/*.js", + "./dist/register_all_gradients.js", + "./dist/public/chained_ops/*.js", + "./dist/io/*.js" +]; +var package_default2 = { + name: name2, + version: version2, + description: description2, + private: private3, + main: main2, + jsdelivr: jsdelivr2, + unpkg: unpkg2, + types: types2, + "jsnext:main": jsnext_main, + module: module2, + miniprogram: miniprogram2, + engines, + repository: repository2, + license: license2, + devDependencies: devDependencies2, + scripts: scripts2, + dependencies: dependencies2, + browser: browser2, + sideEffects +}; +var package_exports3 = {}; +__export2(package_exports3, { + browser: () => browser3, + default: () => package_default3, + dependencies: () => dependencies3, + description: () => description3, + devDependencies: () => devDependencies3, + jsdelivr: () => jsdelivr3, + "jsnext:main": () => jsnext_main2, + license: () => license3, + main: () => main3, + miniprogram: () => miniprogram3, + module: () => module3, + name: () => name3, + peerDependencies: () => peerDependencies, + private: () => private4, + scripts: () => scripts3, + types: () => types3, + unpkg: () => unpkg3, + version: () => version3 +}); +var name3 = "@tensorflow/tfjs-data"; +var version3 = "3.6.0"; +var description3 = "TensorFlow Data API in JavaScript"; +var private4 = false; +var main3 = "dist/tf-data.node.js"; +var jsdelivr3 = "dist/tf-data.min.js"; +var unpkg3 = "dist/tf-data.min.js"; +var types3 = "dist/index.d.ts"; +var jsnext_main2 = "dist/index.js"; +var module3 = "dist/index.js"; +var miniprogram3 = "dist/miniprogram"; +var license3 = "Apache-2.0"; +var devDependencies3 = { + "@rollup/plugin-commonjs": "^11.0.2", + "@rollup/plugin-node-resolve": "^7.1.1", + "@rollup/plugin-typescript": "^3.0.0", + "@tensorflow/tfjs-backend-cpu": "3.6.0", + "@tensorflow/tfjs-core": "3.6.0", + "@tensorflow/tfjs-layers": "3.6.0", + "@types/jasmine": "~2.5.53", + "@types/seedrandom": "^2.4.27", + "@types/utf8": "~2.1.6", + "clang-format": "~1.2.2", + "http-server": "~0.12.3", + jasmine: "3.1.0", + "jasmine-core": "~3.1.0", + karma: "~6.3.1", + "karma-chrome-launcher": "~2.2.0", + "karma-firefox-launcher": "~1.1.0", + "karma-jasmine": "~1.1.1", + "karma-typescript": "~5.5.1", + "karma-typescript-es6-transform": "^5.0.2", + nyc: "^15.1.0", + rimraf: "~2.6.2", + rollup: "~2.3.2", + "rollup-plugin-terser": "~7.0.2", + "rollup-plugin-visualizer": "~3.3.2", + "ts-node": "~7.0.0", + tslint: "~6.1.3", + "tslint-no-circular-imports": "^0.7.0", + typescript: "3.5.3", + yalc: "^1.0.0-pre.50" +}; +var scripts3 = { + build: "tsc && yarn bundle", + "build-ci": "tsc && yarn bundle-ci", + bundle: "rollup -c", + "bundle-ci": "rollup -c --ci", + "build-core": "cd ../tfjs-core && yarn && yarn build", + "build-core-ci": "cd ../tfjs-core && yarn && yarn build-ci", + "build-layers": "cd ../tfjs-layers && yarn && yarn build", + "build-backend-cpu": "cd ../tfjs-backend-cpu && yarn && yarn build", + "build-backend-cpu-ci": "cd ../tfjs-backend-cpu && yarn && yarn build-ci", + "build-layers-ci": "cd ../tfjs-layers && yarn && yarn build-ci", + "build-deps": "yarn build-core && yarn build-layers && yarn build-backend-cpu", + "build-deps-ci": "yarn build-core-ci && yarn build-layers-ci && yarn build-backend-cpu-ci", + "build-npm": "./scripts/build-npm.sh", + "link-local": "yalc link", + "publish-local": "rimraf dist/ && yarn build-npm && yalc push", + "publish-npm": "npm publish", + test: "yarn && yarn build-deps && yarn build && ts-node --transpile-only --project tsconfig.test.json src/test_node.ts", + "test-dev": "tsc && ts-node --transpile-only --project tsconfig.test.json src/test_node.ts", + "test-browsers": "karma start --browsers='Chrome,Firefox'", + "test-ci": "ts-node --transpile-only --skip-ignore -P tsconfig.test.json src/test_node.ts", + "test-snippets": "yarn && yarn build-deps && yarn build && ts-node --skip-ignore --project tsconfig.test.json ./scripts/test_snippets.ts", + "test-snippets-ci": "ts-node --skip-ignore --project tsconfig.test.json ./scripts/test_snippets.ts", + coverage: "yarn nyc yarn ts-node --transpile-only -P tsconfig.test.json src/test_node.ts", + lint: "tslint -p . -t verbose" +}; +var peerDependencies = { + "@tensorflow/tfjs-core": "3.6.0", + seedrandom: "~2.4.3" +}; +var dependencies3 = { + "@types/node-fetch": "^2.1.2", + "node-fetch": "~2.6.1" +}; +var browser3 = { + fs: false, + "node-fetch": false, + string_decoder: false, + crypto: false +}; +var package_default3 = { + name: name3, + version: version3, + description: description3, + private: private4, + main: main3, + jsdelivr: jsdelivr3, + unpkg: unpkg3, + types: types3, + "jsnext:main": jsnext_main2, + module: module3, + miniprogram: miniprogram3, + license: license3, + devDependencies: devDependencies3, + scripts: scripts3, + peerDependencies, + dependencies: dependencies3, + browser: browser3 +}; +var package_exports4 = {}; +__export2(package_exports4, { + default: () => package_default4, + description: () => description4, + devDependencies: () => devDependencies4, + jsdelivr: () => jsdelivr4, + "jsnext:main": () => jsnext_main3, + license: () => license4, + main: () => main4, + miniprogram: () => miniprogram4, + module: () => module4, + name: () => name4, + peerDependencies: () => peerDependencies2, + private: () => private5, + scripts: () => scripts4, + types: () => types4, + unpkg: () => unpkg4, + version: () => version4 +}); +var name4 = "@tensorflow/tfjs-layers"; +var version4 = "3.6.0"; +var description4 = "TensorFlow layers API in JavaScript"; +var license4 = "Apache-2.0 AND MIT"; +var private5 = false; +var main4 = "dist/tf-layers.node.js"; +var types4 = "dist/index.d.ts"; +var jsnext_main3 = "dist/index.js"; +var module4 = "dist/index.js"; +var jsdelivr4 = "dist/tf-layers.min.js"; +var unpkg4 = "dist/tf-layers.min.js"; +var miniprogram4 = "dist/miniprogram"; +var devDependencies4 = { + "@babel/polyfill": "^7.8.7", + "@rollup/plugin-commonjs": "^11.0.2", + "@rollup/plugin-node-resolve": "^7.1.1", + "@rollup/plugin-typescript": "^3.0.0", + "@tensorflow/tfjs-backend-cpu": "3.6.0", + "@tensorflow/tfjs-backend-webgl": "3.6.0", + "@tensorflow/tfjs-core": "3.6.0", + "@types/jasmine": "~2.5.53", + "clang-format": "~1.2.2", + "http-server": "~0.12.3", + jasmine: "~3.1.0", + "jasmine-core": "~3.1.0", + karma: "~6.3.1", + "karma-browserstack-launcher": "~1.6.0", + "karma-chrome-launcher": "~2.2.0", + "karma-firefox-launcher": "~1.1.0", + "karma-jasmine": "~1.1.1", + "karma-typescript": "~5.5.1", + "karma-typescript-es6-transform": "^5.0.2", + rimraf: "~2.6.2", + rollup: "~2.3.2", + "rollup-plugin-terser": "~7.0.2", + "rollup-plugin-visualizer": "~3.3.2", + "ts-node": "~8.8.2", + tslint: "~6.1.3", + "tslint-no-circular-imports": "^0.7.0", + typescript: "3.5.3", + yalc: "~1.0.0-pre.50" +}; +var scripts4 = { + prep: "yarn install && yarn build-ci", + build: "tsc && yarn bundle", + "build-ci": "tsc && yarn bundle-ci", + bundle: "rollup -c", + "bundle-ci": "rollup -c --ci", + "build-core": "cd ../tfjs-core && yarn && yarn build", + "build-backend-cpu": "cd ../tfjs-backend-cpu && yarn && yarn build", + "build-backend-cpu-ci": "cd ../tfjs-backend-cpu && yarn && yarn build-ci", + "build-backend-webgl": "cd ../tfjs-backend-webgl && yarn && yarn build", + "build-backend-webgl-ci": "cd ../tfjs-backend-webgl && yarn && yarn build-ci", + "build-core-ci": "cd ../tfjs-core && yarn && yarn build-ci", + "build-deps": "yarn build-core && yarn build-backend-cpu && yarn build-backend-webgl", + "build-deps-ci": "yarn build-core-ci && yarn build-backend-cpu-ci && yarn build-backend-webgl-ci", + "build-npm": "./scripts/build-npm.sh", + format: "./tools/clang_format_ts.sh", + "link-local": "yalc link", + "publish-local": "yarn build-npm && yalc push", + "publish-npm": "npm publish", + coverage: "KARMA_COVERAGE=1 karma start --browsers='Chrome' --singleRun", + test: "yarn && yarn build-deps && karma start", + "test-dev": "karma start", + "test-ci": "./scripts/test-ci.sh", + "test-snippets": "yarn && yarn build-deps && yarn build && ts-node --skip-ignore -s ./scripts/test_snippets.ts", + "test-snippets-ci": "ts-node --skip-ignore -s ./scripts/test_snippets.ts", + "run-browserstack": "karma start --browsers='bs_chrome_mac' --singleRun --reporters='dots,karma-typescript'", + lint: "tslint -p . -t verbose" +}; +var peerDependencies2 = { + "@tensorflow/tfjs-core": "3.6.0" +}; +var package_default4 = { + name: name4, + version: version4, + description: description4, + license: license4, + private: private5, + main: main4, + types: types4, + "jsnext:main": jsnext_main3, + module: module4, + jsdelivr: jsdelivr4, + unpkg: unpkg4, + miniprogram: miniprogram4, + devDependencies: devDependencies4, + scripts: scripts4, + peerDependencies: peerDependencies2 +}; +var package_exports5 = {}; +__export2(package_exports5, { + default: () => package_default5, + description: () => description5, + devDependencies: () => devDependencies5, + jsdelivr: () => jsdelivr5, + "jsnext:main": () => jsnext_main4, + license: () => license5, + main: () => main5, + miniprogram: () => miniprogram5, + module: () => module5, + name: () => name5, + peerDependencies: () => peerDependencies3, + repository: () => repository3, + scripts: () => scripts5, + types: () => types5, + unpkg: () => unpkg5, + version: () => version5 +}); +var name5 = "@tensorflow/tfjs-converter"; +var version5 = "3.6.0"; +var description5 = "Tensorflow model converter for javascript"; +var main5 = "dist/tf-converter.node.js"; +var jsnext_main4 = "dist/index.js"; +var module5 = "dist/index.js"; +var types5 = "dist/index.d.ts"; +var unpkg5 = "dist/tf-converter.min.js"; +var jsdelivr5 = "dist/tf-converter.min.js"; +var miniprogram5 = "dist/miniprogram"; +var repository3 = { + type: "git", + url: "https://github.com/tensorflow/tfjs-converter.git" +}; +var license5 = "Apache-2.0"; +var peerDependencies3 = { + "@tensorflow/tfjs-core": "3.6.0" +}; +var devDependencies5 = { + "@rollup/plugin-commonjs": "^11.0.2", + "@rollup/plugin-node-resolve": "^7.1.1", + "@rollup/plugin-replace": "^2.3.3", + "@rollup/plugin-typescript": "^3.0.0", + "@tensorflow/tfjs-backend-cpu": "3.6.0", + "@tensorflow/tfjs-core": "3.6.0", + "@types/argparse": "^1.0.38", + "@types/deep-equal": "^1.0.1", + "@types/jasmine": "~2.8.6", + "@types/long": "~3.0.32", + "@types/node-fetch": "1.6.9", + ajv: "~6.3.0", + argparse: "^1.0.10", + "babel-core": "~6.26.3", + "babel-plugin-external-helpers": "~6.22.0", + "babel-preset-env": "~1.7.0", + "clang-format": "~1.2.2", + copyfiles: "~1.2.0", + "deep-equal": "^1.0.1", + "jasmine-core": "~3.5.0", + "node-fetch": "~2.6.1", + opn: "~5.1.0", + protobufjs: "~6.8.6", + rimraf: "~2.6.2", + rollup: "~2.3.2", + "rollup-plugin-terser": "~7.0.2", + "rollup-plugin-visualizer": "~3.3.2", + "ts-morph": "^7.1.3", + "ts-node": "~8.8.2", + tslint: "~6.1.3", + "tslint-no-circular-imports": "~0.7.0", + typescript: "3.5.3", + yalc: "~1.0.0-pre.50" +}; +var scripts5 = { + build: "yarn gen-json --test && yarn gen-kernel2ops && tsc && yarn bundle", + "build-ci": "yarn gen-json --test && yarn gen-kernel2ops && tsc && yarn bundle-ci", + bundle: "rollup -c", + "bundle-ci": "rollup -c --ci", + "build-core": "cd ../tfjs-core && yarn && yarn build", + "build-backend-cpu": "cd ../tfjs-backend-cpu && yarn && yarn build", + "build-backend-cpu-ci": "cd ../tfjs-backend-cpu && yarn && yarn build-ci", + "build-core-ci": "cd ../tfjs-core && yarn && yarn build-ci", + "build-deps": "yarn build-core && yarn build-backend-cpu", + "build-deps-ci": "yarn build-core-ci && yarn build-backend-cpu", + "build-npm": "./scripts/build-npm.sh", + "link-local": "yalc link", + "publish-local": "yarn build-npm && yalc push", + "publish-npm": "npm publish", + test: "yarn && yarn build-deps && yarn build && yarn gen-json --test && yarn gen-kernel2ops && ts-node --transpile-only -P tsconfig.test.json src/run_tests.ts", + "test-ci": "ts-node --transpile-only --skip-ignore -P tsconfig.test.json src/run_tests.ts", + "test-dev": "tsc && ts-node --transpile-only -P tsconfig.test.json src/run_tests.ts", + "test-snippets": "yarn && yarn build-deps && yarn build && ts-node --skip-ignore -s ./scripts/test_snippets.ts", + "test-snippets-ci": "ts-node --skip-ignore -s ./scripts/test_snippets.ts", + lint: "tslint -p . -t verbose", + "make-version": "sh -c ./scripts/make-version", + "gen-doc": "ts-node -s ./scripts/gen_doc.ts", + "gen-json": "ts-node -s ./scripts/gen_json.ts", + "model-summary": "ts-node -s ./tools/model_summary.ts", + pb2json: "ts-node -s ./tools/pb2json_converter.ts", + "build-pip-package": "yarn gen-json --test && cd python && ./build-pip-package.sh --test /tmp/tfjs-pips", + "run-python-tests": "yarn gen-json --test && cd python && ./run-python-tests.sh", + "gen-kernel2ops": "ts-node -s scripts/kernels_to_ops.ts --out metadata/kernel2op.json" +}; +var package_default5 = { + name: name5, + version: version5, + description: description5, + main: main5, + "jsnext:main": jsnext_main4, + module: module5, + types: types5, + unpkg: unpkg5, + jsdelivr: jsdelivr5, + miniprogram: miniprogram5, + repository: repository3, + license: license5, + peerDependencies: peerDependencies3, + devDependencies: devDependencies5, + scripts: scripts5 +}; +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 temp = 0; + let index = 0; + while (counter > 0) { + index = Math.random() * counter | 0; + counter--; + temp = array2[counter]; + array2[counter] = array2[index]; + array2[index] = temp; + } +} +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 temp, temp2; + let index = 0; + while (counter > 0) { + index = Math.random() * counter | 0; + counter--; + temp = array2[counter]; + temp2 = array22[counter]; + array2[counter] = array2[index]; + array22[counter] = array22[index]; + array2[index] = temp; + array22[index] = temp2; + } +} +function clamp(min6, x, max6) { + return Math.max(min6, Math.min(x, max6)); +} +function nearestLargerEven(val) { + return val % 2 === 0 ? val : val + 1; +} +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"; +} +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) { + console.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]; + console.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, name6, value) { + params[decodeURIComponent(name6)] = 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 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 SparseToDense = "SparseToDense"; +var SquaredDifference = "SquaredDifference"; +var Square = "Square"; +var StridedSlice = "StridedSlice"; +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)) { + console.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")) { + console.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: () => fetch2, + flatten: () => flatten, + getArrayFromDType: () => getArrayFromDType, + getTypedArrayFromDType: () => getTypedArrayFromDType, + hasEncodingLoss: () => hasEncodingLoss, + 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, + tanh: () => tanh, + toNestedArray: () => toNestedArray, + toTypedArray: () => toTypedArray +}); +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 fetch2(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(name6, result, vals, timeMs, inputs, extraInfo) { + const time2 = typeof timeMs === "number" ? rightPad(`${timeMs}ms`, 9) : timeMs["error"]; + const paddedName = rightPad(name6, 25); + const rank = result.rank; + const size = result.size; + const shape = rightPad(result.shape.toString(), 14); + let inputShapesDescription = ""; + for (const name7 in inputs) { + const input2 = inputs[name7]; + if (input2 != null) { + const inputShape = input2.shape || result.shape; + const inputRank = inputShape.length; + inputShapesDescription += `${name7}: ${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, name6, dtype) { + this.throwIfDisposed(); + return trackerFn().makeVariable(this, trainable, name6, 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, name6, tensorId) { + super(initialValue.shape, initialValue.dtype, initialValue.dataId, tensorId); + this.trainable = trainable; + this.name = name6; + } + 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: name6, asyncInit } = this.initializeBackendsAndReturnBest(); + if (asyncInit) { + throw new Error(`The highest priority backend '${name6}' has not yet been initialized. Make sure to await tf.ready() or await tf.setBackend() before calling other methods`); + } + this.setBackend(name6); + } + 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) { + console.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; + console.warn(`Initialization of backend ${backendName} failed`); + console.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) { + console.warn(`Initialization of backend ${backendName} failed`); + console.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 name6 = 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"); + } + name6 = nameOrFn; + } + let result; + return this.scopedRun(() => this.startScope(name6), () => 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) { + 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, name6, dtype) { + name6 = name6 || this.nextVariableId().toString(); + if (dtype != null && dtype !== initialValue.dtype) { + initialValue = initialValue.cast(dtype); + } + const v = new Variable(initialValue, trainable, name6, 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(name6) { + const scopeInfo = { + track: [], + name: "unnamed scope", + id: this.state.nextScopeId++ + }; + if (name6) { + scopeInfo.name = name6; + } + 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 || window.opera; + 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 name6 = names[i]; + const t = Array.isArray(tensors) ? tensors[i].tensor : tensors[name6]; + if (t.dtype !== "float32" && t.dtype !== "int32" && t.dtype !== "bool" && t.dtype !== "string" && t.dtype !== "complex64") { + throw new Error(`Unsupported dtype in weight '${name6}': ${t.dtype}`); + } + const spec = { name: name6, 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 name6 = 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 '${name6}': ${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 image3 = new Float32Array(values.length / 2); + for (let i = 0; i < real4.length; i++) { + real4[i] = values[i * 2]; + image3[i] = values[i * 2 + 1]; + } + const realTensor = tensor(real4, shape, "float32"); + const imageTensor = tensor(image3, shape, "float32"); + out[name6] = complex(realTensor, imageTensor); + realTensor.dispose(); + imageTensor.dispose(); + } else { + throw new Error(`Unsupported dtype in weight '${name6}': ${dtype}`); + } + offset += size * dtypeFactor; + } + if (dtype !== "complex64") { + out[name6] = 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 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 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 result = { + format: modelArtifacts.format, + generatedBy: modelArtifacts.generatedBy, + convertedBy: modelArtifacts.convertedBy + }; + if (modelArtifacts.signature != null) { + result.signature = modelArtifacts.signature; + } + if (modelArtifacts.userDefinedMetadata != null) { + result.userDefinedMetadata = modelArtifacts.userDefinedMetadata; + } + if (modelArtifacts.modelInitializer != null) { + result.modelInitializer = modelArtifacts.modelInitializer; + } + this.LS.setItem(this.keys.modelMetadata, JSON.stringify(result)); + return { modelArtifactsInfo }; + } catch (err) { + this.LS.removeItem(this.keys.info); + this.LS.removeItem(this.keys.topology); + this.LS.removeItem(this.keys.weightSpecs); + this.LS.removeItem(this.keys.weightData); + this.LS.removeItem(this.keys.modelMetadata); + 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"]; + } + } + 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)); + this.LS.removeItem(keys.info); + this.LS.removeItem(keys.topology); + this.LS.removeItem(keys.weightSpecs); + this.LS.removeItem(keys.weightData); + 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, + 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.modelTopologyFileName = 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 modelTopologyAndWeightManifest = { + modelTopology: modelArtifacts.modelTopology, + format: modelArtifacts.format, + generatedBy: modelArtifacts.generatedBy, + convertedBy: modelArtifacts.convertedBy, + weightsManifest + }; + if (modelArtifacts.signature != null) { + modelTopologyAndWeightManifest.signature = modelArtifacts.signature; + } + if (modelArtifacts.userDefinedMetadata != null) { + modelTopologyAndWeightManifest.userDefinedMetadata = modelArtifacts.userDefinedMetadata; + } + if (modelArtifacts.modelInitializer != null) { + modelTopologyAndWeightManifest.modelInitializer = modelArtifacts.modelInitializer; + } + const modelTopologyAndWeightManifestURL = window.URL.createObjectURL(new Blob([JSON.stringify(modelTopologyAndWeightManifest)], { type: "application/json" })); + const jsonAnchor = this.jsonAnchor == null ? document.createElement("a") : this.jsonAnchor; + jsonAnchor.download = this.modelTopologyFileName; + jsonAnchor.href = modelTopologyAndWeightManifestURL; + 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.files = files; + } + async load() { + const jsonFile = this.files[0]; + const weightFiles = this.files.slice(1); + 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 ${jsonFile.name}`)); + return; + } + if (weightFiles.length === 0) { + resolve({ modelTopology }); + } + const weightsManifest = modelJSON.weightsManifest; + if (weightsManifest == null) { + reject(new Error(`weightManifest field is missing from file ${jsonFile.name}`)); + return; + } + let pathToFile; + try { + pathToFile = this.checkManifestAndWeightFiles(weightsManifest, weightFiles); + } catch (err) { + reject(err); + return; + } + const weightSpecs = []; + const paths = []; + const perFileBuffers = []; + weightsManifest.forEach((weightsGroup) => { + weightsGroup.paths.forEach((path) => { + paths.push(path); + perFileBuffers.push(null); + }); + weightSpecs.push(...weightsGroup.weights); + }); + weightsManifest.forEach((weightsGroup) => { + weightsGroup.paths.forEach((path) => { + const weightFileReader = new FileReader(); + weightFileReader.onload = (event2) => { + const weightData = event2.target.result; + const index = paths.indexOf(path); + perFileBuffers[index] = weightData; + if (perFileBuffers.indexOf(null) === -1) { + const result = { + modelTopology, + weightSpecs, + weightData: concatenateArrayBuffers(perFileBuffers), + format: modelJSON.format, + generatedBy: modelJSON.generatedBy, + convertedBy: modelJSON.convertedBy + }; + if (modelJSON.signature != null) { + result.signature = modelJSON.signature; + } + if (modelJSON.userDefinedMetadata != null) { + result.userDefinedMetadata = modelJSON.userDefinedMetadata; + } + if (modelJSON.modelInitializer != null) { + result.modelInitializer = modelJSON.modelInitializer; + } + resolve(result); + } + }; + weightFileReader.onerror = (error) => reject(`Failed to weights data from file of path '${path}'.`); + weightFileReader.readAsArrayBuffer(pathToFile[path]); + }); + }); + }; + jsonReader.onerror = (error) => reject(`Failed to read model topology and weights manifest JSON from file '${jsonFile.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`); + jsonReader.readAsText(jsonFile); + }); + } + checkManifestAndWeightFiles(manifest, files) { + const basenames = []; + const fileNames = files.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] = files[fileNames.indexOf(pathBasename)]; + } + }); + } + if (basenames.length !== files.length) { + throw new Error(`Mismatch in the number of files in weights manifest (${basenames.length}) and the number of weight files provided (${files.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 name6 in nameToTensorMap) { + weightsTensorMap[name6] = nameToTensorMap[name6]; + } + }); + 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 = { + modelTopology: modelArtifacts.modelTopology, + format: modelArtifacts.format, + generatedBy: modelArtifacts.generatedBy, + convertedBy: modelArtifacts.convertedBy, + weightsManifest + }; + if (modelArtifacts.signature != null) { + modelTopologyAndWeightManifest.signature = modelArtifacts.signature; + } + if (modelArtifacts.userDefinedMetadata != null) { + modelTopologyAndWeightManifest.userDefinedMetadata = modelArtifacts.userDefinedMetadata; + } + if (modelArtifacts.modelInitializer != null) { + modelTopologyAndWeightManifest.modelInitializer = modelArtifacts.modelInitializer; + } + 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 modelConfig; + try { + modelConfig = 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 = modelConfig.modelTopology; + const weightsManifest = modelConfig.weightsManifest; + const generatedBy = modelConfig.generatedBy; + const convertedBy = modelConfig.convertedBy; + const format = modelConfig.format; + const signature = modelConfig.signature; + const userDefinedMetadata = modelConfig.userDefinedMetadata; + if (modelTopology == null && weightsManifest == null) { + throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`); + } + let weightSpecs; + let weightData; + if (weightsManifest != null) { + const results = await this.loadWeights(weightsManifest); + [weightSpecs, weightData] = results; + } + const artifacts = { + modelTopology, + weightSpecs, + weightData, + generatedBy, + convertedBy, + format + }; + if (signature != null) { + artifacts.signature = signature; + } + if (userDefinedMetadata != null) { + artifacts.userDefinedMetadata = userDefinedMetadata; + } + const initializer = modelConfig.modelInitializer; + if (initializer) { + artifacts.modelInitializer = initializer; + } + return artifacts; + } + 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