From cecff167012bc5bc4327abb01139a94c95862dff Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Fri, 18 Nov 2022 11:13:29 -0500 Subject: [PATCH] cleanup git history --- CHANGELOG.md | 14 +- dist/human.d.ts | 1 + dist/human.esm-nobundle.d.ts | 1 + dist/human.esm-nobundle.js | 840 + dist/human.esm.d.ts | 1 + dist/human.esm.js | 46264 ++++++++++++++++ dist/human.esm.js.map | 7 + dist/human.js | 7916 +++ dist/human.node-gpu.d.ts | 1 + dist/human.node-gpu.js | 840 + dist/human.node-wasm.d.ts | 1 + dist/human.node-wasm.js | 840 + dist/human.node.d.ts | 1 + dist/human.node.js | 840 + dist/tfjs.esm.d.ts | 25 + dist/tfjs.esm.js | 7083 +++ dist/tfjs.version.js | 7 + test/build.log | 100 +- typedoc/.nojekyll | 1 + typedoc/assets/highlight.css | 85 + typedoc/assets/main.js | 54 + typedoc/assets/search.js | 1 + typedoc/assets/style.css | 1257 + typedoc/classes/Env.html | 341 + typedoc/classes/GraphModel.html | 438 + typedoc/classes/Human.html | 602 + typedoc/classes/Tensor-1.html | 3547 ++ typedoc/classes/WebCam.html | 280 + typedoc/classes/models.Models.html | 171 + typedoc/enums/Rank.html | 105 + typedoc/functions/draw.all.html | 71 + typedoc/functions/draw.body.html | 71 + typedoc/functions/draw.canvas.html | 69 + typedoc/functions/draw.face.html | 71 + typedoc/functions/draw.gesture.html | 71 + typedoc/functions/draw.hand.html | 71 + typedoc/functions/draw.init.html | 62 + typedoc/functions/draw.object.html | 71 + typedoc/functions/draw.person.html | 71 + typedoc/functions/empty.html | 127 + typedoc/functions/match.distance.html | 74 + typedoc/functions/match.find.html | 85 + typedoc/functions/match.similarity.html | 78 + typedoc/functions/models.validateModel.html | 63 + typedoc/index.html | 222 + typedoc/interfaces/BodyConfig.html | 125 + typedoc/interfaces/BodyKeypoint.html | 108 + typedoc/interfaces/BodyResult.html | 117 + typedoc/interfaces/Config.html | 282 + typedoc/interfaces/DrawOptions.html | 300 + typedoc/interfaces/FaceAntiSpoofConfig.html | 107 + typedoc/interfaces/FaceAttentionConfig.html | 107 + typedoc/interfaces/FaceConfig.html | 170 + typedoc/interfaces/FaceDescriptionConfig.html | 119 + typedoc/interfaces/FaceDetectorConfig.html | 163 + typedoc/interfaces/FaceEmotionConfig.html | 116 + typedoc/interfaces/FaceGearConfig.html | 116 + typedoc/interfaces/FaceIrisConfig.html | 107 + typedoc/interfaces/FaceLivenessConfig.html | 107 + typedoc/interfaces/FaceMeshConfig.html | 116 + typedoc/interfaces/FaceResult.html | 247 + typedoc/interfaces/FilterConfig.html | 260 + typedoc/interfaces/GenericConfig.html | 116 + typedoc/interfaces/GestureConfig.html | 72 + typedoc/interfaces/HandConfig.html | 180 + typedoc/interfaces/HandResult.html | 153 + typedoc/interfaces/ModelInfo.html | 102 + typedoc/interfaces/ObjectConfig.html | 134 + typedoc/interfaces/ObjectResult.html | 117 + typedoc/interfaces/PersonResult.html | 136 + typedoc/interfaces/Result.html | 172 + typedoc/interfaces/SegmentationConfig.html | 129 + typedoc/interfaces/WebCamConfig.html | 131 + typedoc/interfaces/models.KernelOps.html | 89 + typedoc/interfaces/models.ModelStats.html | 113 + typedoc/modules/Tensor.html | 258 + typedoc/modules/draw.html | 76 + typedoc/modules/match.html | 66 + typedoc/modules/models.html | 67 + typedoc/types/AnyCanvas.html | 120 + typedoc/types/AnyImage.html | 120 + typedoc/types/AnyVideo.html | 120 + typedoc/types/BackendEnum.html | 120 + typedoc/types/BodyAnnotation.html | 118 + typedoc/types/BodyAnnotationBlazePose.html | 118 + .../types/BodyAnnotationEfficientPose.html | 118 + typedoc/types/BodyGesture.html | 120 + typedoc/types/BodyLandmark.html | 118 + typedoc/types/BodyLandmarkBlazePose.html | 118 + typedoc/types/BodyLandmarkEfficientNet.html | 118 + typedoc/types/BodyLandmarkMoveNet.html | 118 + typedoc/types/BodyLandmarkPoseNet.html | 118 + typedoc/types/Box.html | 120 + typedoc/types/Emotion.html | 118 + typedoc/types/Events.html | 127 + typedoc/types/ExternalCanvas.html | 120 + typedoc/types/FaceGesture.html | 120 + typedoc/types/FaceLandmark.html | 118 + typedoc/types/Finger.html | 118 + typedoc/types/FingerCurl.html | 118 + typedoc/types/FingerDirection.html | 118 + typedoc/types/Gender.html | 118 + typedoc/types/GestureResult.html | 125 + typedoc/types/HandGesture.html | 120 + typedoc/types/HandType.html | 118 + typedoc/types/ImageObjects.html | 120 + typedoc/types/Input.html | 120 + typedoc/types/IrisGesture.html | 120 + typedoc/types/ObjectType.html | 118 + typedoc/types/Point.html | 120 + typedoc/types/Race.html | 118 + typedoc/types/SegmentationEnum.html | 120 + typedoc/types/Tensor4D.html | 121 + typedoc/types/WarmupEnum.html | 120 + typedoc/types/match.Descriptor.html | 53 + typedoc/types/match.MatchOptions.html | 51 + typedoc/variables/defaults.html | 122 + typedoc/variables/draw.options.html | 58 + typedoc/variables/env-1.html | 118 + types/.eslintrc.json | 51 + types/human.d.ts | 2787 + types/tfjs-core.d.ts | 11357 ++++ types/tfjs.esm.d.ts | 9956 ++++ types/tsconfig.json | 49 + 124 files changed, 106439 insertions(+), 61 deletions(-) create mode 100644 dist/human.d.ts create mode 100644 dist/human.esm-nobundle.d.ts create mode 100644 dist/human.esm-nobundle.js create mode 100644 dist/human.esm.d.ts create mode 100644 dist/human.esm.js create mode 100644 dist/human.esm.js.map create mode 100644 dist/human.js create mode 100644 dist/human.node-gpu.d.ts create mode 100644 dist/human.node-gpu.js create mode 100644 dist/human.node-wasm.d.ts create mode 100644 dist/human.node-wasm.js create mode 100644 dist/human.node.d.ts create mode 100644 dist/human.node.js create mode 100644 dist/tfjs.esm.d.ts create mode 100644 dist/tfjs.esm.js create mode 100644 dist/tfjs.version.js create mode 100644 typedoc/.nojekyll create mode 100644 typedoc/assets/highlight.css create mode 100644 typedoc/assets/main.js create mode 100644 typedoc/assets/search.js create mode 100644 typedoc/assets/style.css create mode 100644 typedoc/classes/Env.html create mode 100644 typedoc/classes/GraphModel.html create mode 100644 typedoc/classes/Human.html create mode 100644 typedoc/classes/Tensor-1.html create mode 100644 typedoc/classes/WebCam.html create mode 100644 typedoc/classes/models.Models.html create mode 100644 typedoc/enums/Rank.html create mode 100644 typedoc/functions/draw.all.html create mode 100644 typedoc/functions/draw.body.html create mode 100644 typedoc/functions/draw.canvas.html create mode 100644 typedoc/functions/draw.face.html create mode 100644 typedoc/functions/draw.gesture.html create mode 100644 typedoc/functions/draw.hand.html create mode 100644 typedoc/functions/draw.init.html create mode 100644 typedoc/functions/draw.object.html create mode 100644 typedoc/functions/draw.person.html create mode 100644 typedoc/functions/empty.html create mode 100644 typedoc/functions/match.distance.html create mode 100644 typedoc/functions/match.find.html create mode 100644 typedoc/functions/match.similarity.html create mode 100644 typedoc/functions/models.validateModel.html create mode 100644 typedoc/index.html create mode 100644 typedoc/interfaces/BodyConfig.html create mode 100644 typedoc/interfaces/BodyKeypoint.html create mode 100644 typedoc/interfaces/BodyResult.html create mode 100644 typedoc/interfaces/Config.html create mode 100644 typedoc/interfaces/DrawOptions.html create mode 100644 typedoc/interfaces/FaceAntiSpoofConfig.html create mode 100644 typedoc/interfaces/FaceAttentionConfig.html create mode 100644 typedoc/interfaces/FaceConfig.html create mode 100644 typedoc/interfaces/FaceDescriptionConfig.html create mode 100644 typedoc/interfaces/FaceDetectorConfig.html create mode 100644 typedoc/interfaces/FaceEmotionConfig.html create mode 100644 typedoc/interfaces/FaceGearConfig.html create mode 100644 typedoc/interfaces/FaceIrisConfig.html create mode 100644 typedoc/interfaces/FaceLivenessConfig.html create mode 100644 typedoc/interfaces/FaceMeshConfig.html create mode 100644 typedoc/interfaces/FaceResult.html create mode 100644 typedoc/interfaces/FilterConfig.html create mode 100644 typedoc/interfaces/GenericConfig.html create mode 100644 typedoc/interfaces/GestureConfig.html create mode 100644 typedoc/interfaces/HandConfig.html create mode 100644 typedoc/interfaces/HandResult.html create mode 100644 typedoc/interfaces/ModelInfo.html create mode 100644 typedoc/interfaces/ObjectConfig.html create mode 100644 typedoc/interfaces/ObjectResult.html create mode 100644 typedoc/interfaces/PersonResult.html create mode 100644 typedoc/interfaces/Result.html create mode 100644 typedoc/interfaces/SegmentationConfig.html create mode 100644 typedoc/interfaces/WebCamConfig.html create mode 100644 typedoc/interfaces/models.KernelOps.html create mode 100644 typedoc/interfaces/models.ModelStats.html create mode 100644 typedoc/modules/Tensor.html create mode 100644 typedoc/modules/draw.html create mode 100644 typedoc/modules/match.html create mode 100644 typedoc/modules/models.html create mode 100644 typedoc/types/AnyCanvas.html create mode 100644 typedoc/types/AnyImage.html create mode 100644 typedoc/types/AnyVideo.html create mode 100644 typedoc/types/BackendEnum.html create mode 100644 typedoc/types/BodyAnnotation.html create mode 100644 typedoc/types/BodyAnnotationBlazePose.html create mode 100644 typedoc/types/BodyAnnotationEfficientPose.html create mode 100644 typedoc/types/BodyGesture.html create mode 100644 typedoc/types/BodyLandmark.html create mode 100644 typedoc/types/BodyLandmarkBlazePose.html create mode 100644 typedoc/types/BodyLandmarkEfficientNet.html create mode 100644 typedoc/types/BodyLandmarkMoveNet.html create mode 100644 typedoc/types/BodyLandmarkPoseNet.html create mode 100644 typedoc/types/Box.html create mode 100644 typedoc/types/Emotion.html create mode 100644 typedoc/types/Events.html create mode 100644 typedoc/types/ExternalCanvas.html create mode 100644 typedoc/types/FaceGesture.html create mode 100644 typedoc/types/FaceLandmark.html create mode 100644 typedoc/types/Finger.html create mode 100644 typedoc/types/FingerCurl.html create mode 100644 typedoc/types/FingerDirection.html create mode 100644 typedoc/types/Gender.html create mode 100644 typedoc/types/GestureResult.html create mode 100644 typedoc/types/HandGesture.html create mode 100644 typedoc/types/HandType.html create mode 100644 typedoc/types/ImageObjects.html create mode 100644 typedoc/types/Input.html create mode 100644 typedoc/types/IrisGesture.html create mode 100644 typedoc/types/ObjectType.html create mode 100644 typedoc/types/Point.html create mode 100644 typedoc/types/Race.html create mode 100644 typedoc/types/SegmentationEnum.html create mode 100644 typedoc/types/Tensor4D.html create mode 100644 typedoc/types/WarmupEnum.html create mode 100644 typedoc/types/match.Descriptor.html create mode 100644 typedoc/types/match.MatchOptions.html create mode 100644 typedoc/variables/defaults.html create mode 100644 typedoc/variables/draw.options.html create mode 100644 typedoc/variables/env-1.html create mode 100644 types/.eslintrc.json create mode 100644 types/human.d.ts create mode 100644 types/tfjs-core.d.ts create mode 100644 types/tfjs.esm.d.ts create mode 100644 types/tsconfig.json diff --git a/CHANGELOG.md b/CHANGELOG.md index d2283098..89fb1080 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ ### **HEAD -> main** 2022/11/17 mandic00@live.com +- refactor draw and models namespaces - refactor distance - add basic anthropometry - added webcam id specification @@ -26,9 +27,6 @@ - tensor rank strong typechecks - rebuild dependencies -### **release: 2.11.1** 2022/10/09 mandic00@live.com - - ### **2.11.1** 2022/10/09 mandic00@live.com - add rvm segmentation model @@ -43,9 +41,7 @@ ### **2.10.2** 2022/09/11 mandic00@live.com - add node.js esm compatibility (#292) - -### **release: 2.10.1** 2022/09/07 mandic00@live.com - +- release ### **2.10.1** 2022/09/07 mandic00@live.com @@ -81,9 +77,7 @@ ### **2.9.2** 2022/08/08 mandic00@live.com - -### **release: 2.9.1** 2022/07/25 mandic00@live.com - +- release rebuild ### **2.9.1** 2022/07/25 mandic00@live.com @@ -130,7 +124,6 @@ - enable precompile as part of warmup - prepare release beta - change default face crop -- face attention model is available in human-models - beta release 2.7 - refactor draw methods - implement face attention model @@ -442,7 +435,6 @@ - implemented human.next global interpolation method - finished draw buffering and smoothing and enabled by default - implemented service worker -- quantized centernet - release candidate - added usage restrictions - quantize handdetect model diff --git a/dist/human.d.ts b/dist/human.d.ts new file mode 100644 index 00000000..f94037de --- /dev/null +++ b/dist/human.d.ts @@ -0,0 +1 @@ +export * from '../types/human'; \ No newline at end of file diff --git a/dist/human.esm-nobundle.d.ts b/dist/human.esm-nobundle.d.ts new file mode 100644 index 00000000..f94037de --- /dev/null +++ b/dist/human.esm-nobundle.d.ts @@ -0,0 +1 @@ +export * from '../types/human'; \ No newline at end of file diff --git a/dist/human.esm-nobundle.js b/dist/human.esm-nobundle.js new file mode 100644 index 00000000..46f72414 --- /dev/null +++ b/dist/human.esm-nobundle.js @@ -0,0 +1,840 @@ +/* + Human + homepage: + author: ' +*/ + +var nt=Object.defineProperty;var Hn=Object.getOwnPropertyDescriptor;var Gn=Object.getOwnPropertyNames;var Vn=Object.prototype.hasOwnProperty;var Zn=(e,t,n)=>t in e?nt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var te=(e,t)=>{for(var n in t)nt(e,n,{get:t[n],enumerable:!0})},C5=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Gn(t))!Vn.call(e,s)&&s!==n&&nt(e,s,{get:()=>t[s],enumerable:!(o=Hn(t,s))||o.enumerable});return e},w=(e,t,n)=>(C5(e,t,"default"),n&&C5(n,t,"default"));var E=(e,t,n)=>(Zn(e,typeof t!="symbol"?t+"":t,n),n),W5=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)};var V0=(e,t,n)=>(W5(e,t,"read from private field"),n?n.call(e):t.get(e)),Ne=(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)},Ye=(e,t,n,o)=>(W5(e,t,"write to private field"),o?o.call(e,n):t.set(e,n),n);var r={};te(r,{version:()=>Ke});w(r,fA);w(r,mA);w(r,pA);w(r,uA);w(r,hA);w(r,bA);import*as fA from"@tensorflow/tfjs-core/dist/index.js";import*as mA from"@tensorflow/tfjs-converter/dist/index.js";import*as pA from"@tensorflow/tfjs-backend-cpu/dist/index.js";import*as uA from"@tensorflow/tfjs-backend-webgl/dist/index.js";import*as hA from"@tensorflow/tfjs-backend-wasm/dist/index.js";import*as bA from"@tensorflow/tfjs-backend-webgpu/dist/index.js";var D5="4.0.0",Xn="4.0.0",qn="4.0.0",Un="4.0.0",Yn="4.0.0",Kn="0.0.1-alpha.14",Ke={tfjs:D5,"tfjs-core":D5,"tfjs-converter":Xn,"tfjs-backend-cpu":qn,"tfjs-backend-webgl":Un,"tfjs-backend-wasm":Yn,"tfjs-backend-webgpu":Kn};function h(...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)}function F5(e,t){let n=e.endsWith("/")?"":"/",s=t.startsWith(".")||t.startsWith("/")||t.startsWith("http:")||t.startsWith("https:")||t.startsWith("file:")?`${t}`:`${e}${n}${t}`;if(!s.toLocaleLowerCase().includes(".json"))throw new Error(`modelpath error: expecting json file: ${s}`);return s}var T=()=>typeof performance!="undefined"?performance.now():parseInt((Number(process.hrtime.bigint())/1e3/1e3).toString());function ot(e,t,n="config",o=[]){for(let s of Object.keys(t))if(typeof t[s]=="object")ot(e[s],t[s],s,o);else{let A=e&&typeof e[s]!="undefined";A||o.push({reason:"unknown property",where:`${n}.${s} = ${t[s]}`});let a=e&&typeof e[s]==typeof t[s];A&&!a&&o.push({reason:"property type mismatch",where:`${n}.${s} = ${t[s]}`,expected:typeof e[s]})}return t.debug&&n==="config"&&o.length>0&&h("invalid configuration",o),o}function J(...e){let t=n=>n&&typeof n=="object";return e.reduce((n,o)=>(Object.keys(o||{}).forEach(s=>{let A=n[s],a=o[s];Array.isArray(A)&&Array.isArray(a)?n[s]=A.concat(...a):t(A)&&t(a)?n[s]=J(A,a):n[s]=a}),n),{})}var Ie={backend:"",modelBasePath:"",cacheModels:!0,validateModels:!0,wasmPath:"",wasmPlatformFetch:!1,debug:!1,async:!0,warmup:"full",cacheSensitivity:.7,skipAllowed:!1,deallocate:!1,flags:{},softwareKernels:!1,filter:{enabled:!0,equalization:!1,width:0,height:0,flip:!1,return:!0,autoBrightness:!0,brightness:0,contrast:0,sharpness:0,blur:0,saturation:0,hue:0,negative:!1,sepia:!1,vintage:!1,kodachrome:!1,technicolor:!1,polaroid:!1,pixelate:0},gesture:{enabled:!0},face:{enabled:!0,detector:{modelPath:"blazeface.json",rotation:!0,maxDetected:1,skipFrames:99,skipTime:2500,minConfidence:.2,iouThreshold:.1,mask:!1,return:!1},mesh:{enabled:!0,modelPath:"facemesh.json",keepInvalid:!1},attention:{enabled:!1,modelPath:"facemesh-attention.json"},iris:{enabled:!0,modelPath:"iris.json"},emotion:{enabled:!0,minConfidence:.1,skipFrames:99,skipTime:1500,modelPath:"emotion.json"},description:{enabled:!0,modelPath:"faceres.json",skipFrames:99,skipTime:3e3,minConfidence:.1},antispoof:{enabled:!1,skipFrames:99,skipTime:4e3,modelPath:"antispoof.json"},liveness:{enabled:!1,skipFrames:99,skipTime:4e3,modelPath:"liveness.json"}},body:{enabled:!0,modelPath:"movenet-lightning.json",maxDetected:-1,minConfidence:.3,skipFrames:1,skipTime:200},hand:{enabled:!0,rotation:!0,skipFrames:99,skipTime:1e3,minConfidence:.5,iouThreshold:.2,maxDetected:-1,landmarks:!0,detector:{modelPath:"handtrack.json"},skeleton:{modelPath:"handlandmark-full.json"}},object:{enabled:!1,modelPath:"centernet.json",minConfidence:.2,iouThreshold:.4,maxDetected:10,skipFrames:99,skipTime:2e3},segmentation:{enabled:!1,modelPath:"rvm.json",ratio:.5,mode:"default"}};var B5=` + 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.); + } +`;var H5=` + 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]; + } +`,G5=` + 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; + } +`,V5=` + 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); + } +`,Z5=` + 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; + } +`,X5=` + 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); // top left + vec4 c12 = texture2D(texture, vec2(vUv.x, vUv.y - px.y)); // top center + vec4 c13 = texture2D(texture, vec2(vUv.x + px.x, vUv.y - px.y)); // top right + vec4 c21 = texture2D(texture, vec2(vUv.x - px.x, vUv.y) ); // mid left + vec4 c22 = texture2D(texture, vUv); // mid center + vec4 c23 = texture2D(texture, vec2(vUv.x + px.x, vUv.y) ); // mid right + vec4 c31 = texture2D(texture, vec2(vUv.x - px.x, vUv.y + px.y) ); // bottom left + vec4 c32 = texture2D(texture, vec2(vUv.x, vUv.y + px.y) ); // bottom center + vec4 c33 = texture2D(texture, vUv + px ); // bottom right + 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; + } +`;var rt=(e,t,n)=>{let o=new RegExp("\\b"+t+" \\w+ (\\w+)","ig");e.replace(o,(s,A)=>(n[A]=0,s))},st=class{constructor(t,n,o){E(this,"uniform",{});E(this,"attribute",{});E(this,"gl");E(this,"id");E(this,"compile",(t,n)=>{let o=this.gl.createShader(n);return o?(this.gl.shaderSource(o,t),this.gl.compileShader(o),this.gl.getShaderParameter(o,this.gl.COMPILE_STATUS)?o:(h(`filter: gl compile failed: ${this.gl.getShaderInfoLog(o)||"unknown"}`),null)):(h("filter: could not create shader"),null)});this.gl=t;let s=this.compile(n,this.gl.VERTEX_SHADER),A=this.compile(o,this.gl.FRAGMENT_SHADER);if(this.id=this.gl.createProgram(),!(!s||!A)){if(!this.id){h("filter: could not create webgl program");return}if(this.gl.attachShader(this.id,s),this.gl.attachShader(this.id,A),this.gl.linkProgram(this.id),!this.gl.getProgramParameter(this.id,this.gl.LINK_STATUS)){h(`filter: gl link failed: ${this.gl.getProgramInfoLog(this.id)||"unknown"}`);return}this.gl.useProgram(this.id),rt(n,"attribute",this.attribute);for(let a in this.attribute)this.attribute[a]=this.gl.getAttribLocation(this.id,a);rt(n,"uniform",this.uniform),rt(o,"uniform",this.uniform);for(let a in this.uniform)this.uniform[a]=this.gl.getUniformLocation(this.id,a)}}};function q5(){let e=0,t=null,n=!1,o=-1,s=[null,null],A=[],a=null,i=null,c=I0(100,100),x={},y={INTERMEDIATE:1},l=c.getContext("webgl");if(!l){h("filter: cannot get webgl context");return}this.gl=l;function f(v,p){if(!(v===c.width&&p===c.height)){if(c.width=v,c.height=p,!a){let b=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]);a=l.createBuffer(),l.bindBuffer(l.ARRAY_BUFFER,a),l.bufferData(l.ARRAY_BUFFER,b,l.STATIC_DRAW),l.pixelStorei(l.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0)}l.viewport(0,0,c.width,c.height),s=[null,null]}}function d(v,p){let b=l.createFramebuffer();l.bindFramebuffer(l.FRAMEBUFFER,b);let j=l.createRenderbuffer();l.bindRenderbuffer(l.RENDERBUFFER,j);let k=l.createTexture();return l.bindTexture(l.TEXTURE_2D,k),l.texImage2D(l.TEXTURE_2D,0,l.RGBA,v,p,0,l.RGBA,l.UNSIGNED_BYTE,null),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_MAG_FILTER,l.LINEAR),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_MIN_FILTER,l.LINEAR),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_WRAP_S,l.CLAMP_TO_EDGE),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_WRAP_T,l.CLAMP_TO_EDGE),l.framebufferTexture2D(l.FRAMEBUFFER,l.COLOR_ATTACHMENT0,l.TEXTURE_2D,k,0),l.bindTexture(l.TEXTURE_2D,null),l.bindFramebuffer(l.FRAMEBUFFER,null),{fbo:b,texture:k}}function u(v){return s[v]=s[v]||d(c.width,c.height),s[v]}function m(v=0){if(!i)return;let p=null,b=null,j=!1;e===0?p=t:p=u(o).texture||null,e++,n&&!(v&y.INTERMEDIATE)?(b=null,j=e%2===0):(o=(o+1)%2,b=u(o).fbo||null),l.bindTexture(l.TEXTURE_2D,p),l.bindFramebuffer(l.FRAMEBUFFER,b),l.uniform1f(i.uniform.flipY,j?-1:1),l.drawArrays(l.TRIANGLES,0,6)}function g(v){if(x[v])return i=x[v],l.useProgram((i?i.id:null)||null),i;if(i=new st(l,B5,v),!i)return h("filter: could not get webgl program"),null;let p=Float32Array.BYTES_PER_ELEMENT,b=4*p;return l.enableVertexAttribArray(i.attribute.pos),l.vertexAttribPointer(i.attribute.pos,2,l.FLOAT,!1,b,0*p),l.enableVertexAttribArray(i.attribute.uv),l.vertexAttribPointer(i.attribute.uv,2,l.FLOAT,!1,b,2*p),x[v]=i,i}let P={colorMatrix:v=>{let p=new Float32Array(v);p[4]/=255,p[9]/=255,p[14]/=255,p[19]/=255;let b=p[18]===1&&p[3]===0&&p[8]===0&&p[13]===0&&p[15]===0&&p[16]===0&&p[17]===0&&p[19]===0?G5:H5,j=g(b);!j||(l.uniform1fv(j.uniform.m,p),m())},brightness:v=>{let p=(v||0)+1;P.colorMatrix([p,0,0,0,0,0,p,0,0,0,0,0,p,0,0,0,0,0,1,0])},saturation:v=>{let p=(v||0)*2/3+1,b=(p-1)*-.5;P.colorMatrix([p,b,b,0,0,b,p,b,0,0,b,b,p,0,0,0,0,0,1,0])},desaturate:()=>{P.saturation(-1)},contrast:v=>{let p=(v||0)+1,b=-128*(p-1);P.colorMatrix([p,0,0,0,b,0,p,0,0,b,0,0,p,0,b,0,0,0,1,0])},negative:()=>{P.contrast(-2)},hue:v=>{v=(v||0)/180*Math.PI;let p=Math.cos(v),b=Math.sin(v),j=.213,k=.715,I=.072;P.colorMatrix([j+p*(1-j)+b*-j,k+p*-k+b*-k,I+p*-I+b*(1-I),0,0,j+p*-j+b*.143,k+p*(1-k)+b*.14,I+p*-I+b*-.283,0,0,j+p*-j+b*-(1-j),k+p*-k+b*k,I+p*(1-I)+b*I,0,0,0,0,0,1,0])},desaturateLuminance:()=>{P.colorMatrix([.2764723,.929708,.0938197,0,-37.1,.2764723,.929708,.0938197,0,-37.1,.2764723,.929708,.0938197,0,-37.1,0,0,0,1,0])},sepia:()=>{P.colorMatrix([.393,.7689999,.18899999,0,0,.349,.6859999,.16799999,0,0,.272,.5339999,.13099999,0,0,0,0,0,1,0])},brownie:()=>{P.colorMatrix([.5997023498159715,.34553243048391263,-.2708298674538042,0,47.43192855600873,-.037703249837783157,.8609577587992641,.15059552388459913,0,-36.96841498319127,.24113635128153335,-.07441037908422492,.44972182064877153,0,-7.562075277591283,0,0,0,1,0])},vintagePinhole:()=>{P.colorMatrix([.6279345635605994,.3202183420819367,-.03965408211312453,0,9.651285835294123,.02578397704808868,.6441188644374771,.03259127616149294,0,7.462829176470591,.0466055556782719,-.0851232987247891,.5241648018700465,0,5.159190588235296,0,0,0,1,0])},kodachrome:()=>{P.colorMatrix([1.1285582396593525,-.3967382283601348,-.03992559172921793,0,63.72958762196502,-.16404339962244616,1.0835251566291304,-.05498805115633132,0,24.732407896706203,-.16786010706155763,-.5603416277695248,1.6014850761964943,0,35.62982807460946,0,0,0,1,0])},technicolor:()=>{P.colorMatrix([1.9125277891456083,-.8545344976951645,-.09155508482755585,0,11.793603434377337,-.3087833385928097,1.7658908555458428,-.10601743074722245,0,-70.35205161461398,-.231103377548616,-.7501899197440212,1.847597816108189,0,30.950940869491138,0,0,0,1,0])},polaroid:()=>{P.colorMatrix([1.438,-.062,-.062,0,0,-.122,1.378,-.122,0,0,-.016,-.016,1.483,0,0,0,0,0,1,0])},shiftToBGR:()=>{P.colorMatrix([0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0])},convolution:v=>{let p=new Float32Array(v),b=1/c.width,j=1/c.height,k=g(X5);!k||(l.uniform1fv(k.uniform.m,p),l.uniform2f(k.uniform.px,b,j),m())},detectEdges:()=>{P.convolution.call(this,[0,1,0,1,-4,1,0,1,0])},sobelX:()=>{P.convolution.call(this,[-1,0,1,-2,0,2,-1,0,1])},sobelY:()=>{P.convolution.call(this,[-1,-2,-1,0,0,0,1,2,1])},sharpen:v=>{let p=v||1;P.convolution.call(this,[0,-1*p,0,-1*p,1+4*p,-1*p,0,-1*p,0])},emboss:v=>{let p=v||1;P.convolution.call(this,[-2*p,-1*p,0,-1*p,1,1*p,0,1*p,2*p])},blur:v=>{let p=v/7/c.width,b=v/7/c.height,j=g(Z5);!j||(l.uniform2f(j.uniform.px,0,b),m(y.INTERMEDIATE),l.uniform2f(j.uniform.px,p,0),m())},pixelate:v=>{let p=v/c.width,b=v/c.height,j=g(V5);!j||(l.uniform2f(j.uniform.size,p,b),m())}};this.add=function(v){let p=Array.prototype.slice.call(arguments,1),b=P[v];A.push({func:b,args:p})},this.reset=function(){A=[]},this.get=function(){return A},this.apply=function(v){f(v.width,v.height),e=0,t||(t=l.createTexture()),l.bindTexture(l.TEXTURE_2D,t),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_WRAP_S,l.CLAMP_TO_EDGE),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_WRAP_T,l.CLAMP_TO_EDGE),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_MIN_FILTER,l.NEAREST),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_MAG_FILTER,l.NEAREST),l.texImage2D(l.TEXTURE_2D,0,l.RGBA,l.RGBA,l.UNSIGNED_BYTE,v);for(let p=0;py.data())),a=Math.max(A[0][0],A[1][0],A[2][0]),c=(a>1?255:1)/a,x;if(c>1){let y=[r.sub(n[0],o[0]),r.sub(n[1],o[1]),r.sub(n[2],o[2])],l=[r.sub(s[0],o[0]),r.sub(s[1],o[1]),r.sub(s[2],o[2])],f=[r.mul(y[0],c),r.mul(y[1],c),r.mul(y[2],c)],d=r.stack([f[0],f[1],f[2]],2);x=r.reshape(d,[1,t.shape[0]||0,t.shape[1]||0,3]),r.dispose([...y,...l,...f])}else x=r.expandDims(t,0);return r.dispose([...n,...o,...s,n,t,e]),x}var i2=3840,l0=null,c0=null,Le=null,X,E0={inputSum:0,cacheDiff:1,sumMethod:0,inputTensor:void 0};function At(){E0.inputSum=0,E0.cacheDiff=1,E0.sumMethod=0,E0.inputTensor=void 0}function I0(e,t){let n;if(M.browser)if(M.worker){if(typeof OffscreenCanvas=="undefined")throw new Error("canvas error: attempted to run in web worker but OffscreenCanvas is not supported");n=new OffscreenCanvas(e,t)}else{if(typeof document=="undefined")throw new Error("canvas error: attempted to run in browser but DOM is not defined");n=document.createElement("canvas"),n.width=e,n.height=t}else typeof M.Canvas!="undefined"?n=new M.Canvas(e,t):typeof globalThis.Canvas!="undefined"&&(n=new globalThis.Canvas(e,t));return n}function l2(e,t){let n=t||I0(e.width,e.height);return n.getContext("2d").drawImage(e,0,0),n}async function c2(e,t,n=!0){var f,d,u;if(!e)return t.debug&&h("input error: input is missing"),{tensor:null,canvas:null};if(!(e instanceof r.Tensor)&&!(typeof Image!="undefined"&&e instanceof Image)&&!(typeof M.Canvas!="undefined"&&e instanceof M.Canvas)&&!(typeof globalThis.Canvas!="undefined"&&e instanceof globalThis.Canvas)&&!(typeof ImageData!="undefined"&&e instanceof ImageData)&&!(typeof ImageBitmap!="undefined"&&e instanceof ImageBitmap)&&!(typeof HTMLImageElement!="undefined"&&e instanceof HTMLImageElement)&&!(typeof HTMLMediaElement!="undefined"&&e instanceof HTMLMediaElement)&&!(typeof HTMLVideoElement!="undefined"&&e instanceof HTMLVideoElement)&&!(typeof HTMLCanvasElement!="undefined"&&e instanceof HTMLCanvasElement)&&!(typeof OffscreenCanvas!="undefined"&&e instanceof OffscreenCanvas))throw new Error("input error: type is not recognized");if(e instanceof r.Tensor){let m=null;if(e.isDisposedInternal)throw new Error("input error: attempted to use tensor but it is disposed");if(!e.shape)throw new Error("input error: attempted to use tensor without a shape");if(e.shape.length===3){if(e.shape[2]===3)m=r.expandDims(e,0);else if(e.shape[2]===4){let g=r.slice3d(e,[0,0,0],[-1,-1,3]);m=r.expandDims(g,0),r.dispose(g)}}else e.shape.length===4&&(e.shape[3]===3?m=r.clone(e):e.shape[3]===4&&(m=r.slice4d(e,[0,0,0,0],[-1,-1,-1,3])));if(m==null||m.shape.length!==4||m.shape[0]!==1||m.shape[3]!==3)throw new Error(`input error: attempted to use tensor with unrecognized shape: ${e.shape.toString()}`);if(m.dtype==="int32"){let g=r.cast(m,"float32");r.dispose(m),m=g}return{tensor:m,canvas:t.filter.return?c0:null}}if(typeof e.readyState!="undefined"&&e.readyState<=2)return t.debug&&h("input stream is not ready"),{tensor:null,canvas:l0};let o=e.naturalWidth||e.videoWidth||e.width||e.shape&&e.shape[1]>0,s=e.naturalHeight||e.videoHeight||e.height||e.shape&&e.shape[2]>0;if(!o||!s)return t.debug&&h("cannot determine input dimensions"),{tensor:null,canvas:l0};let A=o,a=s;if(A>i2&&(A=i2,a=Math.trunc(A*s/o)),a>i2&&(a=i2,A=Math.trunc(a*o/s)),(((f=t.filter)==null?void 0:f.width)||0)>0?A=t.filter.width:(((d=t.filter)==null?void 0:d.height)||0)>0&&(A=o*((t.filter.height||0)/s)),(t.filter.height||0)>0?a=t.filter.height:(t.filter.width||0)>0&&(a=s*((t.filter.width||0)/o)),!A||!a)throw new Error("input error: cannot determine dimension");(!l0||l0.width!==A||l0.height!==a)&&(l0=I0(A,a));let i=l0.getContext("2d");if(typeof ImageData!="undefined"&&e instanceof ImageData?i.putImageData(e,0,0):t.filter.flip&&typeof i.translate!="undefined"?(i.translate(o,0),i.scale(-1,1),i.drawImage(e,0,0,o,s,0,0,l0.width,l0.height),i.setTransform(1,0,0,1,0,0)):i.drawImage(e,0,0,o,s,0,0,l0.width,l0.height),(!c0||l0.width!==c0.width||l0.height!==c0.height)&&(c0=I0(l0.width,l0.height)),t.filter.enabled&&M.webgl.supported?(X||(X=M.browser?new q5:null),M.filter=!!X,X!=null&&X.add?(X.reset(),t.filter.brightness!==0&&X.add("brightness",t.filter.brightness),t.filter.contrast!==0&&X.add("contrast",t.filter.contrast),t.filter.sharpness!==0&&X.add("sharpen",t.filter.sharpness),t.filter.blur!==0&&X.add("blur",t.filter.blur),t.filter.saturation!==0&&X.add("saturation",t.filter.saturation),t.filter.hue!==0&&X.add("hue",t.filter.hue),t.filter.negative&&X.add("negative"),t.filter.sepia&&X.add("sepia"),t.filter.vintage&&X.add("brownie"),t.filter.sepia&&X.add("sepia"),t.filter.kodachrome&&X.add("kodachrome"),t.filter.technicolor&&X.add("technicolor"),t.filter.polaroid&&X.add("polaroid"),t.filter.pixelate!==0&&X.add("pixelate",t.filter.pixelate),((u=X.get())==null?void 0:u.length)>1?c0=X.apply(l0):c0=X.draw(l0)):(t.debug&&h("input process error: cannot initialize filters"),M.webgl.supported=!1,t.filter.enabled=!1,l2(l0,c0))):(l2(l0,c0),X&&(X=null),M.filter=!!X),!n)return{tensor:null,canvas:c0};if(!c0)throw new Error("canvas error: cannot create output");let c,x=3;if(typeof ImageData!="undefined"&&e instanceof ImageData||e.data&&e.width&&e.height)if(M.browser&&r.browser)c=r.browser?r.browser.fromPixels(e):null;else{x=e.data.length/e.height/e.width;let m=new Uint8Array(e.data.buffer);c=r.tensor(m,[e.height,e.width,x],"int32")}else if((!Le||c0.width!==Le.width||c0.height!==Le.height)&&(Le=I0(c0.width,c0.height)),r.browser&&M.browser)t.backend==="webgl"||t.backend==="humangl"||t.backend==="webgpu"?c=r.browser.fromPixels(c0):(Le=l2(c0),c=r.browser.fromPixels(Le));else{let P=l2(c0).getContext("2d").getImageData(0,0,A,a);x=P.data.length/A/a;let v=new Uint8Array(P.data.buffer);c=r.tensor(v,[A,a,x])}if(x===4){let m=r.slice3d(c,[0,0,0],[-1,-1,3]);r.dispose(c),c=m}if(!c)throw new Error("input error: cannot create tensor");let y=r.cast(c,"float32"),l=t.filter.equalization?await a2(y):r.expandDims(y,0);if(r.dispose([c,y]),t.filter.autoBrightness){let m=r.max(l),g=await m.data();t.filter.brightness=g[0]>1?1-g[0]/255:1-g[0],r.dispose(m)}return{tensor:l,canvas:t.filter.return?c0:null}}async function U5(e,t){let n=!1;if(e.cacheSensitivity===0||!t.shape||t.shape.length!==4||t.shape[1]>3840||t.shape[2]>2160)return n;if(!E0.inputTensor)E0.inputTensor=r.clone(t);else if(E0.inputTensor.shape[1]!==t.shape[1]||E0.inputTensor.shape[2]!==t.shape[2])r.dispose(E0.inputTensor),E0.inputTensor=r.clone(t);else{let o={};o.diff=r.sub(t,E0.inputTensor),o.squared=r.mul(o.diff,o.diff),o.sum=r.sum(o.squared);let A=(await o.sum.data())[0]/(t.shape[1]||1)/(t.shape[2]||1)/255/3;r.dispose([E0.inputTensor,o.diff,o.squared,o.sum]),E0.inputTensor=r.clone(t),n=A<=(e.cacheSensitivity||0)}return n}async function Y5(e,t,n){let o={};if(!t||!n||t.shape.length!==4||t.shape.length!==n.shape.length)return e.debug||h("invalid input tensor or tensor shapes do not match:",t.shape,n.shape),0;if(t.shape[0]!==1||n.shape[0]!==1||t.shape[3]!==3||n.shape[3]!==3)return e.debug||h("input tensors must be of shape [1, height, width, 3]:",t.shape,n.shape),0;o.input1=r.clone(t),o.input2=t.shape[1]!==n.shape[1]||t.shape[2]!==n.shape[2]?r.image.resizeBilinear(n,[t.shape[1],t.shape[2]]):r.clone(n),o.diff=r.sub(o.input1,o.input2),o.squared=r.mul(o.diff,o.diff),o.sum=r.sum(o.squared);let A=(await o.sum.data())[0]/(t.shape[1]||1)/(t.shape[2]||1)/255/3;return r.dispose([o.input1,o.input2,o.diff,o.squared,o.sum]),A}var d2=class{constructor(){E(this,"browser");E(this,"node");E(this,"worker");E(this,"platform","");E(this,"agent","");E(this,"backends",[]);E(this,"initial");E(this,"filter");E(this,"tfjs");E(this,"offscreen");E(this,"perfadd",!1);E(this,"tensorflow",{version:void 0,gpu:void 0});E(this,"wasm",{supported:void 0,backend:void 0,simd:void 0,multithread:void 0});E(this,"webgl",{supported:void 0,backend:void 0,version:void 0,renderer:void 0,shader:void 0,vendor:void 0});E(this,"webgpu",{supported:void 0,backend:void 0,adapter:void 0});E(this,"cpu",{model:void 0,flags:[]});E(this,"kernels",[]);E(this,"Canvas");E(this,"Image");E(this,"ImageData");if(this.browser=typeof navigator!="undefined",this.node=typeof process!="undefined"&&typeof process.versions!="undefined"&&typeof process.versions.node!="undefined",this.tfjs={version:Ke["tfjs-core"]},this.offscreen=typeof OffscreenCanvas!="undefined",this.initial=!0,this.worker=this.browser&&this.offscreen?typeof WorkerGlobalScope!="undefined":void 0,typeof navigator!="undefined"){let t=navigator.userAgent.match(/\(([^()]+)\)/g);if(t!=null&&t[0]){let n=t[0].match(/\(([^()]+)\)/g);this.platform=n!=null&&n[0]?n[0].replace(/\(|\)/g,""):"",this.agent=navigator.userAgent.replace(t[0],""),this.platform[1]&&(this.agent=this.agent.replace(t[1],"")),this.agent=this.agent.replace(/ /g," ")}}else typeof process!="undefined"&&(this.platform=`${process.platform} ${process.arch}`,this.agent=`NodeJS ${process.version}`)}async updateBackend(){this.backends=Object.keys(r.engine().registryFactory);try{this.tensorflow={version:r.backend().binding?r.backend().binding.TF_Version:void 0,gpu:r.backend().binding?r.backend().binding.isUsingGpuDevice():void 0}}catch(o){}this.wasm.supported=typeof WebAssembly!="undefined",this.wasm.backend=this.backends.includes("wasm"),this.wasm.supported&&this.wasm.backend&&(this.wasm.simd=await r.env().getAsync("WASM_HAS_SIMD_SUPPORT"),this.wasm.multithread=await r.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT"));let t=I0(100,100),n=t?t.getContext("webgl2"):void 0;this.webgl.supported=typeof n!="undefined",this.webgl.backend=this.backends.includes("webgl"),this.webgl.supported&&this.webgl.backend&&n&&(this.webgl.version=n.getParameter(n.VERSION),this.webgl.vendor=n.getParameter(n.VENDOR),this.webgl.renderer=n.getParameter(n.RENDERER),this.webgl.shader=n.getParameter(n.SHADING_LANGUAGE_VERSION)),this.webgpu.supported=this.browser&&typeof navigator.gpu!="undefined",this.webgpu.backend=this.backends.includes("webgpu");try{if(this.webgpu.supported){let o=await navigator.gpu.requestAdapter();this.webgpu.adapter=await(o==null?void 0:o.requestAdapterInfo())}}catch(o){this.webgpu.supported=!1}try{this.kernels=r.getKernelsForBackend(r.getBackend()).map(o=>o.kernelName.toLowerCase())}catch(o){}}updateCPU(){let t={model:"",flags:[]};this.node&&this.platform.startsWith("linux"),this.cpu?this.cpu=t:Object.defineProperty(this,"cpu",{value:t})}},M=new d2;var y2=class{constructor(){E(this,"config");E(this,"element");E(this,"stream");E(this,"devices",[]);E(this,"enumerate",async()=>{try{let t=await navigator.mediaDevices.enumerateDevices();this.devices=t.filter(n=>n.kind==="videoinput")}catch(t){this.devices=[]}return this.devices});E(this,"start",async t=>{if(t!=null&&t.debug&&(this.config.debug=t==null?void 0:t.debug),t!=null&&t.crop&&(this.config.crop=t==null?void 0:t.crop),t!=null&&t.mode&&(this.config.mode=t==null?void 0:t.mode),t!=null&&t.width&&(this.config.width=t==null?void 0:t.width),t!=null&&t.height&&(this.config.height=t==null?void 0:t.height),t!=null&&t.id&&(this.config.id=t==null?void 0:t.id),t!=null&&t.element)if(typeof t.element=="string"){let s=document.getElementById(t.element);if(s&&s instanceof HTMLVideoElement)this.element=s;else{this.config.debug&&h("webcam","cannot get dom element",t.element);return}}else if(t.element instanceof HTMLVideoElement)this.element=t.element;else{this.config.debug&&h("webcam","unknown dom element",t.element);return}else this.element=document.createElement("video");let n={audio:!1,video:{facingMode:this.config.mode==="front"?"user":"environment",resizeMode:this.config.crop?"crop-and-scale":"none",width:{ideal:this.config.width>0?this.config.width:window.innerWidth},height:{ideal:this.config.height>0?this.config.height:window.innerHeight}}};if(this.config.id&&(n.video.deviceId=this.config.id),this.element.addEventListener("play",()=>{this.config.debug&&h("webcam","play")}),this.element.addEventListener("pause",()=>{this.config.debug&&h("webcam","pause")}),this.element.addEventListener("click",async()=>{!this.element||!this.stream||(this.element.paused?await this.element.play():this.element.pause())}),!(navigator!=null&&navigator.mediaDevices)){this.config.debug&&h("webcam","no devices");return}try{this.stream=await navigator.mediaDevices.getUserMedia(n)}catch(s){h("webcam",s);return}if(!this.stream){this.config.debug&&h("webcam","no stream");return}this.element.srcObject=this.stream,await new Promise(s=>{this.element?this.element.onloadeddata=()=>s(!0):s(!1)}),await this.element.play(),this.config.debug&&h("webcam",{width:this.width,height:this.height,label:this.label,stream:this.stream,track:this.track,settings:this.settings,constraints:this.constraints,capabilities:this.capabilities})});E(this,"pause",()=>{this.element&&this.element.pause()});E(this,"play",async()=>{this.element&&await this.element.play()});E(this,"stop",()=>{this.config.debug&&h("webcam","stop"),this.track&&this.track.stop()});this.config={element:void 0,debug:!0,mode:"front",crop:!1,width:0,height:0}}get track(){if(!!this.stream)return this.stream.getVideoTracks()[0]}get capabilities(){if(!!this.track)return this.track.getCapabilities?this.track.getCapabilities():void 0}get constraints(){if(!!this.track)return this.track.getConstraints?this.track.getConstraints():void 0}get settings(){if(!this.stream)return;let t=this.stream.getVideoTracks()[0];return t.getSettings?t.getSettings():void 0}get label(){return this.track?this.track.label:""}get paused(){var t;return((t=this.element)==null?void 0:t.paused)||!1}get width(){var t;return((t=this.element)==null?void 0:t.videoWidth)||0}get height(){var t;return((t=this.element)==null?void 0:t.videoHeight)||0}};var at={};te(at,{age:()=>xo,"anti-spoofing":()=>Xo,antispoof:()=>$n,blazeface:()=>eo,"blazeface-back":()=>yo,"blazeface-front":()=>fo,"blazepose-detect":()=>Zo,"blazepose-detector2d":()=>mo,"blazepose-detector3d":()=>po,"blazepose-full":()=>uo,"blazepose-heavy":()=>ho,"blazepose-lite":()=>bo,centernet:()=>to,default:()=>rr,efficientpose:()=>go,"efficientpose-i-lite":()=>qo,"efficientpose-ii-lite":()=>Uo,"efficientpose-iv":()=>Yo,emotion:()=>no,faceboxes:()=>To,facemesh:()=>oo,"facemesh-attention":()=>Ro,"facemesh-attention-alt":()=>vo,"facemesh-detection-full":()=>Mo,"facemesh-detection-short":()=>Po,"facemesh-orig":()=>ko,faceres:()=>ro,"faceres-deep":()=>wo,gear:()=>Eo,gender:()=>So,"gender-ssrnet-imdb":()=>zo,handdetect:()=>jo,"handlandmark-full":()=>so,"handlandmark-lite":()=>No,"handlandmark-sparse":()=>Io,handskeleton:()=>Lo,handtrack:()=>Ao,"insightface-efficientnet-b0":()=>Ko,"insightface-ghostnet-strides1":()=>Jo,"insightface-ghostnet-strides2":()=>Qo,"insightface-mobilenet-emore":()=>_o,"insightface-mobilenet-swish":()=>$o,iris:()=>ao,liveness:()=>io,meet:()=>Oo,mobileface:()=>Co,mobilefacenet:()=>Wo,models:()=>lo,"movenet-lightning":()=>co,"movenet-multipose":()=>Do,"movenet-thunder":()=>Fo,nanodet:()=>Bo,"nanodet-e":()=>er,"nanodet-g":()=>tr,"nanodet-m":()=>nr,"nanodet-t":()=>or,posenet:()=>Ho,rvm:()=>Go,selfie:()=>Vo});var $n=853098,eo=538928,to=4030290,no=820516,oo=1477958,ro=6978814,so=5431368,Ao=2964837,ao=2599092,io=592976,lo=0,co=4650216,xo=161240,yo=538928,fo=402048,mo=7499400,po=5928856,uo=6338290,ho=27501554,bo=2725490,go=5651240,To=2013002,vo=2387598,Ro=2382414,Mo=1026192,Po=201268,ko=2955780,wo=13957620,Eo=1498916,zo=161236,So=201808,jo=3515612,No=2023432,Io=5286322,Lo=5502280,Oo=372228,Co=2183192,Wo=5171976,Do=9448838,Fo=12477112,Bo=7574558,Ho=5032780,Go=3739355,Vo=212886,Zo=5928804,Xo=853098,qo=2269064,Uo=5651240,Yo=25643252,Ko=13013224,Jo=8093408,Qo=8049584,_o=6938536,$o=12168584,er=12319156,tr=7574558,nr=1887474,or=5294216,rr={antispoof:$n,blazeface:eo,centernet:to,emotion:no,facemesh:oo,faceres:ro,"handlandmark-full":so,handtrack:Ao,iris:ao,liveness:io,models:lo,"movenet-lightning":co,age:xo,"blazeface-back":yo,"blazeface-front":fo,"blazepose-detector2d":mo,"blazepose-detector3d":po,"blazepose-full":uo,"blazepose-heavy":ho,"blazepose-lite":bo,efficientpose:go,faceboxes:To,"facemesh-attention-alt":vo,"facemesh-attention":Ro,"facemesh-detection-full":Mo,"facemesh-detection-short":Po,"facemesh-orig":ko,"faceres-deep":wo,gear:Eo,"gender-ssrnet-imdb":zo,gender:So,handdetect:jo,"handlandmark-lite":No,"handlandmark-sparse":Io,handskeleton:Lo,meet:Oo,mobileface:Co,mobilefacenet:Wo,"movenet-multipose":Do,"movenet-thunder":Fo,nanodet:Bo,posenet:Ho,rvm:Go,selfie:Vo,"blazepose-detect":Zo,"anti-spoofing":Xo,"efficientpose-i-lite":qo,"efficientpose-ii-lite":Uo,"efficientpose-iv":Yo,"insightface-efficientnet-b0":Ko,"insightface-ghostnet-strides1":Jo,"insightface-ghostnet-strides2":Qo,"insightface-mobilenet-emore":_o,"insightface-mobilenet-swish":$o,"nanodet-e":er,"nanodet-g":tr,"nanodet-m":nr,"nanodet-t":or};var u0={cacheModels:!0,cacheSupported:!0,verbose:!0,debug:!1,modelBasePath:""},y0={};async function sr(e,t){return u0.debug&&h("load model fetch:",e,t),fetch(e,t)}function K5(e){u0.cacheModels=e.cacheModels,u0.verbose=e.debug,u0.modelBasePath=e.modelBasePath}async function L(e){var x,y,l,f;let t=F5(u0.modelBasePath,e||"");t.toLowerCase().endsWith(".json")||(t+=".json");let n=t.includes("/")?t.split("/"):t.split("\\"),o=n[n.length-1].replace(".json",""),s="indexeddb://"+o;y0[o]={name:o,sizeFromManifest:0,sizeLoadedWeights:0,sizeDesired:at[o],inCache:!1,url:""},u0.cacheSupported=typeof indexedDB!="undefined";let A={};try{A=u0.cacheSupported&&u0.cacheModels?await r.io.listModels():{}}catch(d){u0.cacheSupported=!1}y0[o].inCache=u0.cacheSupported&&u0.cacheModels&&Object.keys(A).includes(s),y0[o].url=y0[o].inCache?s:t;let a=typeof fetch=="undefined"?{}:{fetchFunc:(d,u)=>sr(d,u)},i=new r.GraphModel(y0[o].url,a),c=!1;try{i.findIOHandler(),u0.debug&&h("model load handler:",i.handler)}catch(d){h("error finding model i/o handler:",t,d)}try{let d=await((x=i.handler)==null?void 0:x.load())||null;y0[o].sizeFromManifest=((y=d==null?void 0:d.weightData)==null?void 0:y.byteLength)||0,d?i.loadSync(d):i=await r.loadGraphModel(y0[o].inCache?s:t,a),y0[o].sizeLoadedWeights=((f=(l=i.artifacts)==null?void 0:l.weightData)==null?void 0:f.byteLength)||0,u0.verbose&&h("load:",{model:o,url:i.modelUrl,bytes:y0[o].sizeLoadedWeights}),c=!0}catch(d){h("error loading model:",t,d)}if(c&&u0.cacheModels&&u0.cacheSupported&&!y0[o].inCache)try{let d=await i.save(s);u0.debug&&h("model saved:",s,d)}catch(d){h("error saving model:",t,d)}return i}var it="3.0.0";var U={name:"humangl",priority:999,canvas:null,gl:null,extensions:[],webGLattr:{alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!1,desynchronized:!0}};function ir(){let e=U.gl;!e||(U.extensions=e.getSupportedExtensions())}function J5(e){var t;if(e.config.backend==="humangl"&&(U.name in r.engine().registry&&!((t=U==null?void 0:U.gl)!=null&&t.getParameter(U.gl.VERSION))&&(h("humangl error: backend invalid context"),e.models.reset()),!r.findBackend(U.name))){try{U.canvas=I0(100,100)}catch(s){h("humangl error: cannot create canvas:",s);return}try{if(U.gl=U.canvas.getContext("webgl2",U.webGLattr),!U.gl){h("humangl error: cannot get webgl context");return}if(!U.gl.getParameter(U.gl.VERSION).includes("2.0")){h("backend override: using fallback webgl backend as webgl 2.0 is not detected"),e.config.backend="webgl";return}U.canvas&&(U.canvas.addEventListener("webglcontextlost",A=>{throw h("humangl error:",A.type),h("possible browser memory leak using webgl or conflict with multiple backend registrations"),e.emit("error"),new Error("backend error: webgl context lost")}),U.canvas.addEventListener("webglcontextrestored",A=>{h("humangl error: context restored:",A)}),U.canvas.addEventListener("webglcontextcreationerror",A=>{h("humangl error: context create:",A)}))}catch(s){h("humangl error: cannot get webgl context:",s);return}try{r.setWebGLContext(2,U.gl)}catch(s){h("humangl error: cannot set webgl context:",s);return}try{let s=new r.GPGPUContext(U.gl);r.registerBackend(U.name,()=>new r.MathBackendWebGL(s),U.priority)}catch(s){h("humangl error: cannot register webgl backend:",s);return}try{r.getKernelsForBackend("webgl").forEach(A=>{let a={...A,backendName:U.name};r.registerKernel(a)})}catch(s){h("humangl error: cannot update webgl backend registration:",s);return}try{r.env().flagRegistry.WEBGL_VERSION&&r.env().set("WEBGL_VERSION",2)}catch(s){h("humangl error: cannot set WebGL backend flags:",s);return}ir();let n=r.backend(),o=typeof n.gpgpu!="undefined"?n.getGPGPUContext().gl:null;o?e.config.debug&&h("humangl backend registered:",{webgl:o.getParameter(o.VERSION),renderer:o.getParameter(o.RENDERER)}):h("humangl error: no current gl context:",o,U.gl)}}var O={tf255:255,tf1:1,tf2:2,tf05:.5,tf127:127.5,rgb:[.2989,.587,.114]};function Q5(){O.tf255=r.scalar(255,"float32"),O.tf1=r.scalar(1,"float32"),O.tf2=r.scalar(2,"float32"),O.tf05=r.scalar(.5,"float32"),O.tf127=r.scalar(127.5,"float32"),O.rgb=r.tensor1d([.2989,.587,.114],"float32")}async function xr(){return await M.updateBackend(),M.browser?M.webgpu.supported&&M.webgpu.backend?"webgpu":M.webgl.supported&&M.webgl.backend?"webgl":M.wasm.supported&&M.wasm.backend?"wasm":"cpu":"tensorflow"}function dr(e){let t=[];if(!M.kernels.includes("mod")){let n={kernelName:"Mod",backendName:r.getBackend(),kernelFunc:o=>r.tidy(()=>r.sub(o.inputs.a,r.mul(r.div(o.inputs.a,o.inputs.b),o.inputs.b)))};r.registerKernel(n),M.kernels.push("mod"),t.push("mod")}if(!M.kernels.includes("floormod")){let n={kernelName:"FloorMod",backendName:r.getBackend(),kernelFunc:o=>r.tidy(()=>r.add(r.mul(r.floorDiv(o.inputs.a,o.inputs.b),o.inputs.b),r.mod(o.inputs.a,o.inputs.b)))};r.registerKernel(n),M.kernels.push("floormod"),t.push("floormod")}if(!M.kernels.includes("rotatewithoffset")&&e.softwareKernels){let n={kernelName:"RotateWithOffset",backendName:r.getBackend(),kernelFunc:o=>r.tidy(()=>{let s=r.getBackend();r.setBackend("cpu");let A=r.image.rotateWithOffset(o.inputs.image,o.attrs.radians,o.attrs.fillValue,o.attrs.center);return r.setBackend(s),A})};r.registerKernel(n),M.kernels.push("rotatewithoffset"),t.push("rotatewithoffset")}t.length>0&&e.debug&&h("registered kernels:",t)}var _5={};async function Je(e,t=!1){var n;if(e.state="backend",((n=e.config.backend)==null?void 0:n.length)===0&&(e.config.backend=await xr()),t||M.initial||e.config.backend&&e.config.backend.length>0&&r.getBackend()!==e.config.backend){let o=T();if(e.config.backend&&e.config.backend.length>0){if(typeof window=="undefined"&&typeof WorkerGlobalScope!="undefined"&&e.config.debug&&e.config.debug&&h("running inside web worker"),M.browser&&e.config.backend==="tensorflow"&&(e.config.debug&&h("override: backend set to tensorflow while running in browser"),e.config.backend="webgl"),M.node&&(e.config.backend==="webgl"||e.config.backend==="humangl")&&(e.config.debug&&h(`override: backend set to ${e.config.backend} while running in nodejs`),e.config.backend="tensorflow"),M.browser&&e.config.backend==="webgpu")if(typeof navigator=="undefined"||typeof navigator.gpu=="undefined")h("override: backend set to webgpu but browser does not support webgpu"),e.config.backend="webgl";else{let A=await navigator.gpu.requestAdapter();if(e.config.debug&&h("enumerated webgpu adapter:",A),!A)h("override: backend set to webgpu but browser reports no available gpu"),e.config.backend="webgl";else{let a="requestAdapterInfo"in A?await A.requestAdapterInfo():void 0;h("webgpu adapter info:",a)}}let s=Object.keys(r.engine().registryFactory);if(e.config.backend==="humangl"&&!s.includes("humangl")&&(J5(e),s=Object.keys(r.engine().registryFactory)),e.config.debug&&h("available backends:",s),s.includes(e.config.backend)||(h(`error: backend ${e.config.backend} not found in registry`),e.config.backend=M.node?"tensorflow":"webgl",e.config.debug&&h(`override: setting backend ${e.config.backend}`)),e.config.debug&&h("setting backend:",[e.config.backend]),e.config.backend==="wasm"){if(r.env().flagRegistry.CANVAS2D_WILL_READ_FREQUENTLY&&r.env().set("CANVAS2D_WILL_READ_FREQUENTLY",!0),e.config.debug&&h("wasm path:",e.config.wasmPath),typeof r.setWasmPaths!="undefined")r.setWasmPaths(e.config.wasmPath,e.config.wasmPlatformFetch);else throw new Error("backend error: attempting to use wasm backend but wasm path is not set");let A=!1,a=!1;try{A=await r.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT"),a=await r.env().getAsync("WASM_HAS_SIMD_SUPPORT"),e.config.debug&&h(`wasm execution: ${a?"simd":"no simd"} ${A?"multithreaded":"singlethreaded"}`),e.config.debug&&!a&&h("warning: wasm simd support is not enabled")}catch(i){h("wasm detection failed")}}try{await r.setBackend(e.config.backend),await r.ready()}catch(A){return h("error: cannot set backend:",e.config.backend,A),!1}e.config.debug&&(_5=JSON.parse(JSON.stringify(r.env().flags)))}if((r.getBackend()==="humangl"||r.getBackend()==="webgl")&&(r.env().flagRegistry.WEBGL_USE_SHAPES_UNIFORMS&&r.env().set("WEBGL_USE_SHAPES_UNIFORMS",!0),r.env().flagRegistry.WEBGL_EXP_CONV&&r.env().set("WEBGL_EXP_CONV",!0),e.config.debug&&typeof e.config.deallocate!="undefined"&&e.config.deallocate&&(h("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",!0),r.env().set("WEBGL_DELETE_TEXTURE_THRESHOLD",0))),r.getBackend(),e.config.debug){let s=r.env().flags,A={};for(let a of Object.keys(s))_5[a]!==s[a]&&(A[a]=s[a]);e.config.debug&&Object.keys(A).length>0&&h("backend:",r.getBackend(),"flags:",A)}if(e.config.flags&&Object.keys(e.config.flags).length>0){e.config.debug&&h("flags:",e.config.flags);for(let[s,A]of Object.entries(e.config.flags))r.env().set(s,A)}r.enableProdMode(),Q5(),e.performance.initBackend=Math.trunc(T()-o),e.config.backend=r.getBackend(),await M.updateBackend(),dr(e.config),M.initial=!1}return!0}function f2(e,t){for(let n of e){let o={kernelName:n,backendName:t.backend,kernelFunc:s=>{var A;return t.debug&&h("kernelFunc",n,t.backend,s),(A=s==null?void 0:s.inputs)==null?void 0:A.info}};r.registerKernel(o)}M.kernels=r.getKernelsForBackend(r.getBackend()).map(n=>n.kernelName.toLowerCase())}var pt={};te(pt,{all:()=>Vr,body:()=>p2,canvas:()=>Gr,face:()=>m2,gesture:()=>b2,hand:()=>u2,init:()=>mt,object:()=>h2,options:()=>$,person:()=>Hr});var z0=e=>{if(!e)h("draw error: invalid canvas");else if(!e.getContext)h("draw error: canvas context not defined");else{let t=e.getContext("2d");if(!t)h("draw error: cannot get canvas context");else return t}return null},ue=e=>Math.round(e*180/Math.PI),V=(e,t,n)=>e.replace(t,typeof n=="number"?n.toFixed(1):n),he=(e,t)=>{if(!t.useDepth||typeof e=="undefined")return t.color;let n=Uint8ClampedArray.from([127+2*e,127-2*e,255]);return`rgba(${n[0]}, ${n[1]}, ${n[2]}, ${t.alpha})`};function L0(e,t,n,o,s){let A=t.replace(/\[.*\]/g,"").split(` +`).map(i=>i.trim()),a=Math.max(0,n);for(let i=A.length-1;i>=0;i--){let c=i*s.lineHeight+o;s.shadowColor&&s.shadowColor!==""&&(e.fillStyle=s.shadowColor,e.fillText(A[i],a+5,c+16)),e.fillStyle=s.labelColor,e.fillText(A[i],a+4,c+15)}}function U0(e,t,n,o,s){e.fillStyle=he(o,s),e.beginPath(),e.arc(t,n,s.pointSize,0,2*Math.PI),e.fill()}function Z0(e,t,n,o,s,A){if(e.beginPath(),e.lineWidth=A.lineWidth,A.useCurves){let a=(t+t+o)/2,i=(n+n+s)/2;e.ellipse(a,i,o/2,s/2,0,0,2*Math.PI)}else e.moveTo(t+A.roundRect,n),e.lineTo(t+o-A.roundRect,n),e.quadraticCurveTo(t+o,n,t+o,n+A.roundRect),e.lineTo(t+o,n+s-A.roundRect),e.quadraticCurveTo(t+o,n+s,t+o-A.roundRect,n+s),e.lineTo(t+A.roundRect,n+s),e.quadraticCurveTo(t,n+s,t,n+s-A.roundRect),e.lineTo(t,n+A.roundRect),e.quadraticCurveTo(t,n,t+A.roundRect,n),e.closePath();e.stroke()}function lt(e,t,n){if(!(t.length<2)){e.beginPath(),e.moveTo(t[0][0],t[0][1]);for(let o of t)e.strokeStyle=he(o[2]||0,n),e.lineTo(Math.trunc(o[0]),Math.trunc(o[1]));e.stroke(),n.fillPolygons&&(e.closePath(),e.fill())}}function e1(e,t,n){if(!(t.length<2)){if(e.lineWidth=n.lineWidth,!n.useCurves||t.length<=2){lt(e,t,n);return}e.moveTo(t[0][0],t[0][1]);for(let o=0;oQe[e]),HA=fr.map(e=>Qe[e]),GA=mr.map(e=>Qe[e]);function ne(e){let t=e.map(n=>n[0]);return t.push(e[e.length-1][1]),t}var pr=[[61,146],[146,91],[91,181],[181,84],[84,17],[17,314],[314,405],[405,321],[321,375],[375,291],[61,185],[185,40],[40,39],[39,37],[37,0],[0,267],[267,269],[269,270],[270,409],[409,291],[78,95],[95,88],[88,178],[178,87],[87,14],[14,317],[317,402],[402,318],[318,324],[324,308],[78,191],[191,80],[80,81],[81,82],[82,13],[13,312],[312,311],[311,310],[310,415],[415,308]],ur=[[263,249],[249,390],[390,373],[373,374],[374,380],[380,381],[381,382],[382,362],[263,466],[466,388],[388,387],[387,386],[386,385],[385,384],[384,398],[398,362]],hr=[[276,283],[283,282],[282,295],[295,285],[300,293],[293,334],[334,296],[296,336]],br=[[474,475],[475,476],[476,477],[477,474]],gr=[[33,7],[7,163],[163,144],[144,145],[145,153],[153,154],[154,155],[155,133],[33,246],[246,161],[161,160],[160,159],[159,158],[158,157],[157,173],[173,133]],Tr=[[46,53],[53,52],[52,65],[65,55],[70,63],[63,105],[105,66],[66,107]],vr=[[469,470],[470,471],[471,472],[472,469]],Rr=[[10,338],[338,297],[297,332],[332,284],[284,251],[251,389],[389,356],[356,454],[454,323],[323,361],[361,288],[288,397],[397,365],[365,379],[379,378],[378,400],[400,377],[377,152],[152,148],[148,176],[176,149],[149,150],[150,136],[136,172],[172,58],[58,132],[132,93],[93,234],[234,127],[127,162],[162,21],[21,54],[54,103],[103,67],[67,109],[109,10]],VA={lips:ne(pr),leftEye:ne(ur),leftEyebrow:ne(hr),leftIris:ne(br),rightEye:ne(gr),rightEyebrow:ne(Tr),rightIris:ne(vr),faceOval:ne(Rr)};var Mr=[[61,146],[146,91],[91,181],[181,84],[84,17],[17,314],[314,405],[405,321],[321,375],[375,291],[61,185],[185,40],[40,39],[39,37],[37,0],[0,267],[267,269],[269,270],[270,409],[409,291],[78,95],[95,88],[88,178],[178,87],[87,14],[14,317],[317,402],[402,318],[318,324],[324,308],[78,191],[191,80],[80,81],[81,82],[82,13],[13,312],[312,311],[311,310],[310,415],[415,308]],Pr=[[263,249],[249,390],[390,373],[373,374],[374,380],[380,381],[381,382],[382,362],[263,466],[466,388],[388,387],[387,386],[386,385],[385,384],[384,398],[398,362]],kr=[[276,283],[283,282],[282,295],[295,285],[300,293],[293,334],[334,296],[296,336]],wr=[[474,475],[475,476],[476,477],[477,474]],Er=[[33,7],[7,163],[163,144],[144,145],[145,153],[153,154],[154,155],[155,133],[33,246],[246,161],[161,160],[160,159],[159,158],[158,157],[157,173],[173,133]],zr=[[46,53],[53,52],[52,65],[65,55],[70,63],[63,105],[105,66],[66,107]],Sr=[[469,470],[470,471],[471,472],[472,469]],jr=[[10,338],[338,297],[297,332],[332,284],[284,251],[251,389],[389,356],[356,454],[454,323],[323,361],[361,288],[288,397],[397,365],[365,379],[379,378],[378,400],[400,377],[377,152],[152,148],[148,176],[176,149],[149,150],[150,136],[136,172],[172,58],[58,132],[132,93],[93,234],[234,127],[127,162],[162,21],[21,54],[54,103],[103,67],[67,109],[109,10]];function oe(e){let t=e.map(n=>n[0]);return t.push(e[e.length-1][1]),t}var Nr={lips:oe(Mr),leftEye:oe(Pr),leftEyebrow:oe(kr),leftIris:oe(wr),rightEye:oe(Er),rightEyebrow:oe(zr),rightIris:oe(Sr),faceOval:oe(jr)},Ir=Object.entries(Nr).map(([e,t])=>t.map(n=>[n,e])).flat(),ZA=new Map(Ir),_e=[61,146,91,181,84,17,314,405,321,375,291,185,40,39,37,0,267,269,270,409,78,95,88,178,87,14,317,402,318,324,308,191,80,81,82,13,312,311,310,415,76,77,90,180,85,16,315,404,320,307,306,184,74,73,72,11,302,303,304,408,62,96,89,179,86,15,316,403,319,325,292,183,42,41,38,12,268,271,272,407],Te=[33,7,163,144,145,153,154,155,133,246,161,160,159,158,157,173,130,25,110,24,23,22,26,112,243,247,30,29,27,28,56,190,226,31,228,229,230,231,232,233,244,113,225,224,223,222,221,189,35,124,46,53,52,65,143,111,117,118,119,120,121,128,245,156,70,63,105,66,107,55,193],ve=[263,249,390,373,374,380,381,382,362,466,388,387,386,385,384,398,359,255,339,254,253,252,256,341,463,467,260,259,257,258,286,414,446,261,448,449,450,451,452,453,464,342,445,444,443,442,441,413,265,353,276,283,282,295,372,340,346,347,348,349,350,357,465,383,300,293,334,296,336,285,417];var G;function Lr(e,t){var o,s,A,a,i,c,x,y,l;if(!G.drawLabels||((o=G.faceLabels)==null?void 0:o.length)===0)return;let n=G.faceLabels.slice();if(e.score&&(n=V(n,"[score]",100*e.score)),e.gender&&(n=V(n,"[gender]",e.gender)),e.genderScore&&(n=V(n,"[genderScore]",100*e.genderScore)),e.age&&(n=V(n,"[age]",e.age)),e.distance&&(n=V(n,"[distance]",100*e.distance)),e.real&&(n=V(n,"[real]",100*e.real)),e.live&&(n=V(n,"[live]",100*e.live)),e.emotion&&e.emotion.length>0){let f=e.emotion.map(d=>`${Math.trunc(100*d.score)}% ${d.emotion}`);f.length>3&&(f.length=3),n=V(n,"[emotions]",f.join(" "))}(A=(s=e.rotation)==null?void 0:s.angle)!=null&&A.roll&&(n=V(n,"[roll]",ue(e.rotation.angle.roll))),(i=(a=e.rotation)==null?void 0:a.angle)!=null&&i.yaw&&(n=V(n,"[yaw]",ue(e.rotation.angle.yaw))),(x=(c=e.rotation)==null?void 0:c.angle)!=null&&x.pitch&&(n=V(n,"[pitch]",ue(e.rotation.angle.pitch))),(l=(y=e.rotation)==null?void 0:y.gaze)!=null&&l.bearing&&(n=V(n,"[gaze]",ue(e.rotation.gaze.bearing))),L0(t,n,e.box[0],e.box[1],G)}function Or(e,t){var n,o,s,A;if(((n=e.annotations)==null?void 0:n.leftEyeIris)&&((o=e.annotations)==null?void 0:o.leftEyeIris[0])){t.strokeStyle=G.useDepth?"rgba(255, 200, 255, 0.3)":G.color,t.beginPath();let a=Math.abs(e.annotations.leftEyeIris[3][0]-e.annotations.leftEyeIris[1][0])/2,i=Math.abs(e.annotations.leftEyeIris[4][1]-e.annotations.leftEyeIris[2][1])/2;t.ellipse(e.annotations.leftEyeIris[0][0],e.annotations.leftEyeIris[0][1],a,i,0,0,2*Math.PI),t.stroke(),G.fillPolygons&&(t.fillStyle=G.useDepth?"rgba(255, 255, 200, 0.3)":G.color,t.fill())}if(((s=e.annotations)==null?void 0:s.rightEyeIris)&&((A=e.annotations)==null?void 0:A.rightEyeIris[0])){t.strokeStyle=G.useDepth?"rgba(255, 200, 255, 0.3)":G.color,t.beginPath();let a=Math.abs(e.annotations.rightEyeIris[3][0]-e.annotations.rightEyeIris[1][0])/2,i=Math.abs(e.annotations.rightEyeIris[4][1]-e.annotations.rightEyeIris[2][1])/2;t.ellipse(e.annotations.rightEyeIris[0][0],e.annotations.rightEyeIris[0][1],a,i,0,0,2*Math.PI),t.stroke(),G.fillPolygons&&(t.fillStyle=G.useDepth?"rgba(255, 255, 200, 0.3)":G.color,t.fill())}}function Cr(e,t){var n;if(G.drawGaze&&((n=e.rotation)==null?void 0:n.angle)&&typeof Path2D!="undefined"){t.strokeStyle="pink";let o=e.box[0]+e.box[2]/2-e.box[3]*ue(e.rotation.angle.yaw)/90,s=e.box[1]+e.box[3]/2+e.box[2]*ue(e.rotation.angle.pitch)/90,A=new Path2D(` + M ${e.box[0]+e.box[2]/2} ${e.box[1]} + C + ${o} ${e.box[1]}, + ${o} ${e.box[1]+e.box[3]}, + ${e.box[0]+e.box[2]/2} ${e.box[1]+e.box[3]} + `),a=new Path2D(` + M ${e.box[0]} ${e.box[1]+e.box[3]/2} + C + ${e.box[0]} ${s}, + ${e.box[0]+e.box[2]} ${s}, + ${e.box[0]+e.box[2]} ${e.box[1]+e.box[3]/2} + `);t.stroke(a),t.stroke(A)}}function Wr(e,t){var n;if(G.drawGaze&&((n=e.rotation)==null?void 0:n.gaze.strength)&&e.rotation.gaze.bearing&&e.annotations.leftEyeIris&&e.annotations.rightEyeIris&&e.annotations.leftEyeIris[0]&&e.annotations.rightEyeIris[0]){t.strokeStyle="pink",t.fillStyle="pink";let o=[e.annotations.leftEyeIris[0][0]+Math.sin(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[3],e.annotations.leftEyeIris[0][1]+Math.cos(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[2]];ct(t,[e.annotations.leftEyeIris[0][0],e.annotations.leftEyeIris[0][1]],[o[0],o[1]],4);let s=[e.annotations.rightEyeIris[0][0]+Math.sin(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[3],e.annotations.rightEyeIris[0][1]+Math.cos(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[2]];ct(t,[e.annotations.rightEyeIris[0][0],e.annotations.rightEyeIris[0][1]],[s[0],s[1]],4)}}function Dr(e,t){if(G.drawPolygons&&e.mesh.length>=468){t.lineWidth=1;for(let n=0;ne.mesh[s]);lt(t,o,G)}Or(e,t)}}function Fr(e,t){if(G.drawPoints&&e.mesh.length>=468)for(let n=0;n0&&(Fr(s,o),Dr(s,o),Cr(s,o),Wr(s,o))}}function p2(e,t,n){var A,a;let o=J($,n);if(!t||!e)return;let s=z0(e);if(!!s){s.lineJoin="round";for(let i=0;i0)){let c=o.bodyLabels.slice();c=V(c,"[score]",100*t[i].score),L0(s,c,t[i].box[0],t[i].box[1],o)}if(o.drawPoints&&t[i].keypoints)for(let c=0;c0&&t[i].keypoints){s.font=o.font;for(let c of t[i].keypoints){if(!c.score||c.score===0)continue;let x=o.bodyPartLabels.slice();x=V(x,"[label]",c.part),x=V(x,"[score]",100*c.score),L0(s,x,c.position[0],c.position[1],o)}}if(o.drawPolygons&&t[i].keypoints&&t[i].annotations)for(let c of Object.values(t[i].annotations))for(let x of c)e1(s,x,o)}}}function u2(e,t,n){var A,a;let o=J($,n);if(!t||!e)return;let s=z0(e);if(!!s){s.lineJoin="round",s.font=o.font;for(let i of t){if(o.drawBoxes){if(s.strokeStyle=o.color,s.fillStyle=o.color,Z0(s,i.box[0],i.box[1],i.box[2],i.box[3],o),o.drawLabels&&((A=o.handLabels)==null?void 0:A.length)>0){let c=o.handLabels.slice();c=V(c,"[label]",i.label),c=V(c,"[score]",100*i.score),L0(s,c,i.box[0],i.box[1],o)}s.stroke()}if(o.drawPoints&&i.keypoints&&i.keypoints.length>0)for(let c of i.keypoints)s.fillStyle=he(c[2],o),U0(s,c[0],c[1],0,o);if(o.drawLabels&&i.annotations&&((a=o.fingerLabels)==null?void 0:a.length)>0)for(let[c,x]of Object.entries(i.annotations)){let y=o.fingerLabels.slice();y=V(y,"[label]",c),L0(s,y,x[x.length-1][0],x[x.length-1][1],o)}if(o.drawPolygons&&i.annotations){let c=x=>{if(!(!x||x.length===0||!x[0]))for(let y=0;y0?y-1:0][0],x[y>0?y-1:0][1]),s.lineTo(x[y][0],x[y][1]),s.stroke()}};s.lineWidth=o.lineWidth,c(i.annotations.index),c(i.annotations.middle),c(i.annotations.ring),c(i.annotations.pinky),c(i.annotations.thumb)}}}}function h2(e,t,n){var A;let o=J($,n);if(!t||!e)return;let s=z0(e);if(!!s){s.lineJoin="round",s.font=o.font;for(let a of t)if(o.drawBoxes){if(s.strokeStyle=o.color,s.fillStyle=o.color,Z0(s,a.box[0],a.box[1],a.box[2],a.box[3],o),o.drawLabels&&((A=o.objectLabels)==null?void 0:A.length)>0){let i=o.objectLabels.slice();i=V(i,"[label]",a.label),i=V(i,"[score]",100*a.score),L0(s,i,a.box[0],a.box[1],o)}s.stroke()}}}function b2(e,t,n){var s;let o=J($,n);if(!(!t||!e)&&o.drawGestures&&((s=o.gestureLabels)==null?void 0:s.length)>0){let A=z0(e);if(!A)return;A.font=o.font,A.fillStyle=o.color;let a=1;for(let i=0;i1&&x[1].length>0){let y=c[1]>0?`#${c[1]}`:"",l=o.gestureLabels.slice();l=V(l,"[where]",c[0]),l=V(l,"[who]",y),l=V(l,"[what]",x[1]),L0(A,l,8,2+a*o.lineHeight,o),a+=1}}}}var re={face:`face + confidence: [score]% + [gender] [genderScore]% + age: [age] years + distance: [distance]cm + real: [real]% + live: [live]% + [emotions] + roll: [roll]\xB0 yaw:[yaw]\xB0 pitch:[pitch]\xB0 + gaze: [gaze]\xB0`,body:"body [score]%",bodyPart:"[label] [score]%",object:"[label] [score]%",hand:"[label] [score]%",finger:"[label]",gesture:"[where] [who]: [what]"};var ft=0;function Hr(e,t,n){let o=J($,n);if(!t||!e)return;let s=z0(e);if(!!s){s.lineJoin="round",s.font=o.font;for(let A=0;Aht,kpt:()=>ut});var ut=["nose","leftEyeInside","leftEye","leftEyeOutside","rightEyeInside","rightEye","rightEyeOutside","leftEar","rightEar","leftMouth","rightMouth","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftPinky","rightPinky","leftIndex","rightIndex","leftThumb","rightThumb","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle","leftHeel","rightHeel","leftFoot","rightFoot","bodyCenter","bodyTop","leftPalm","leftHand","rightPalm","rightHand"],ht={shoulders:["leftShoulder","rightShoulder"],hips:["rightHip","leftHip"],mouth:["leftMouth","rightMouth"],leftLegUpper:["leftHip","leftKnee"],leftLegLower:["leftKnee","leftAnkle"],leftFoot:["leftAnkle","leftHeel","leftFoot"],leftTorso:["leftShoulder","leftHip"],leftArmUpper:["leftShoulder","leftElbow"],leftArmLower:["leftElbow","leftWrist"],leftHand:["leftWrist","leftPalm"],leftHandPinky:["leftPalm","leftPinky"],leftHandIndex:["leftPalm","leftIndex"],leftHandThumb:["leftPalm","leftThumb"],leftEyeOutline:["leftEyeInside","leftEyeOutside"],rightLegUpper:["rightHip","rightKnee"],rightLegLower:["rightKnee","rightAnkle"],rightFoot:["rightAnkle","rightHeel","rightFoot"],rightTorso:["rightShoulder","rightHip"],rightArmUpper:["rightShoulder","rightElbow"],rightArmLower:["rightElbow","rightWrist"],rightHand:["rightWrist","rightPalm"],rightHandPinky:["rightPalm","rightPinky"],rightHandIndex:["rightPalm","rightIndex"],rightHandThumb:["rightPalm","rightThumb"],rightEyeOutline:["rightEyeInside","rightEyeOutside"]};var S0,Re=224,o1,Zr=5,T2=[8,16,32,32,32];function Xr(){let e=[],t=0;for(;tn.x)),y:r.tensor1d(e.map(n=>n.y))}}async function r1(e){if(M.initial&&(S0=null),!S0&&e.body.detector&&e.body.detector.modelPath){S0=await L(e.body.detector.modelPath);let t=S0!=null&&S0.executor?Object.values(S0.modelSignature.inputs):void 0;Re=Array.isArray(t)?parseInt(t[0].tensorShape.dim[1].size):0}else e.debug&&S0&&h("cached model:",S0.modelUrl);return Xr(),S0}var n1=[5,5];function qr(e,t){return r.tidy(()=>{let n=r.split(e,12,1),o=r.squeeze(n[0]),s=r.squeeze(n[1]),A=r.squeeze(n[2]),a=r.squeeze(n[3]);o=r.add(r.div(o,Re),t.x),s=r.add(r.div(s,Re),t.y),A=r.mul(r.div(A,Re),n1[0]),a=r.mul(r.div(a,Re),n1[1]);let i=r.sub(o,r.div(A,2)),c=r.sub(s,r.div(a,2)),x=r.add(i,A),y=r.add(c,a);return r.stack([i,c,x,y],1)})}async function Ur(e,t,n,o){var x,y;let s=[],A={};A.boxes=qr(e,o1),A.scores=r.sigmoid(t),A.nms=await r.image.nonMaxSuppressionAsync(A.boxes,A.scores,1,((x=n.body.detector)==null?void 0:x.minConfidence)||.1,((y=n.body.detector)==null?void 0:y.iouThreshold)||.1);let a=await A.nms.data(),i=await A.scores.data(),c=await A.boxes.array();for(let l of Array.from(a)){let f=i[l],d=c[l],u=[Math.round(d[0]*o[0]),Math.round(d[1]*o[1]),Math.round(d[2]*o[0]),Math.round(d[3]*o[1])],m={score:f,boxRaw:d,box:u};s.push(m)}return Object.keys(A).forEach(l=>r.dispose(A[l])),s}async function s1(e,t,n){let o={};o.res=S0==null?void 0:S0.execute(e,["Identity"]),o.logitsRaw=r.slice(o.res,[0,0,0],[1,-1,1]),o.boxesRaw=r.slice(o.res,[0,0,1],[1,-1,-1]),o.logits=r.squeeze(o.logitsRaw),o.boxes=r.squeeze(o.boxesRaw);let s=await Ur(o.boxes,o.logits,t,n);return Object.keys(o).forEach(A=>r.dispose(o[A])),s}function Y0(e,t=[1,1]){let n=[e.map(i=>i[0]),e.map(i=>i[1])],o=[Math.min(...n[0]),Math.min(...n[1])],s=[Math.max(...n[0]),Math.max(...n[1])],A=[o[0],o[1],s[0]-o[0],s[1]-o[1]],a=[A[0]/t[0],A[1]/t[1],A[2]/t[0],A[3]/t[1]];return{box:A,boxRaw:a}}function A1(e,t=[1,1]){let n=[e.map(x=>x[0]),e.map(x=>x[1])],o=[Math.min(...n[0]),Math.min(...n[1])],s=[Math.max(...n[0]),Math.max(...n[1])],A=[(o[0]+s[0])/2,(o[1]+s[1])/2],a=Math.max(A[0]-o[0],A[1]-o[1],-A[0]+s[0],-A[1]+s[1]),i=[Math.trunc(A[0]-a),Math.trunc(A[1]-a),Math.trunc(2*a),Math.trunc(2*a)],c=[i[0]/t[0],i[1]/t[1],i[2]/t[0],i[3]/t[1]];return{box:i,boxRaw:c}}function v2(e,t){let n=[e[2]*t,e[3]*t];return[e[0]-(n[0]-e[2])/2,e[1]-(n[1]-e[3])/2,n[0],n[1]]}var g0,gt=256,bt=Number.MAX_SAFE_INTEGER,Yr={landmarks:["ld_3d","activation_segmentation","activation_heatmap","world_3d","output_poseflag"],detector:[]},M2=[],se=[[0,0],[0,0],[0,0],[0,0]],a1=0,i1=e=>1-1/(1+Math.exp(e)),c1=e=>r1(e);async function x1(e){if(M.initial&&(g0=null),g0)e.debug&&h("cached model:",g0.modelUrl);else{g0=await L(e.body.modelPath);let t=g0!=null&&g0.executor?Object.values(g0.modelSignature.inputs):void 0;gt=Array.isArray(t)?parseInt(t[0].tensorShape.dim[1].size):0}return g0}function l1(e,t,n){var A,a;let o={};if(!((A=e==null?void 0:e.shape)!=null&&A[1])||!((a=e==null?void 0:e.shape)!=null&&a[2]))return e;let s;if(n&&(o.cropped=r.image.cropAndResize(e,[n],[0],[e.shape[1],e.shape[2]])),e.shape[1]!==e.shape[2]){let i=[e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0,e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0],c=[e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0,e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0];se=[[0,0],i,c,[0,0]],o.pad=r.pad(o.cropped||e,se),o.resize=r.image.resizeBilinear(o.pad,[t,t]),s=r.div(o.resize,O.tf255)}else e.shape[1]!==t?(o.resize=r.image.resizeBilinear(o.cropped||e,[t,t]),s=r.div(o.resize,O.tf255)):s=r.div(o.cropped||e,O.tf255);return Object.keys(o).forEach(i=>r.dispose(o[i])),s}function Kr(e,t,n){for(let o of e)o.position=[Math.trunc(o.position[0]*(t[0]+se[2][0]+se[2][1])/t[0]-se[2][0]),Math.trunc(o.position[1]*(t[1]+se[1][0]+se[1][1])/t[1]-se[1][0]),o.position[2]],o.positionRaw=[o.position[0]/t[0],o.position[1]/t[1],2*o.position[2]/(t[0]+t[1])];if(n){let o=n[2]-n[0],s=n[3]-n[1];for(let A of e)A.positionRaw=[A.positionRaw[0]/s+n[1],A.positionRaw[1]/o+n[0],A.positionRaw[2]],A.position=[Math.trunc(A.positionRaw[0]*t[0]),Math.trunc(A.positionRaw[1]*t[1]),A.positionRaw[2]]}return e}function Jr(e){let t=e.find(i=>i.part==="leftPalm"),n=e.find(i=>i.part==="leftWrist"),o=e.find(i=>i.part==="leftIndex");t.position[2]=((n.position[2]||0)+(o.position[2]||0))/2;let s=e.find(i=>i.part==="rightPalm"),A=e.find(i=>i.part==="rightWrist"),a=e.find(i=>i.part==="rightIndex");s.position[2]=((A.position[2]||0)+(a.position[2]||0))/2}async function Qr(e,t,n){if(!(g0!=null&&g0.executor))return null;let o={};[o.ld,o.segmentation,o.heatmap,o.world,o.poseflag]=g0==null?void 0:g0.execute(e,Yr.landmarks);let s=(await o.poseflag.data())[0],A=await o.ld.data(),a=await o.world.data();Object.keys(o).forEach(u=>r.dispose(o[u]));let i=[],c=5;for(let u=0;uu.position),l=Y0(y,[n[0],n[1]]),f={};for(let[u,m]of Object.entries(ht)){let g=[];for(let P=0;Pb.part===m[P]),p=x.find(b=>b.part===m[P+1]);v&&p&&g.push([v.position,p.position])}f[u]=g}return{id:0,score:Math.trunc(100*s)/100,box:l.box,boxRaw:l.boxRaw,keypoints:x,annotations:f}}async function Tt(e,t){var A,a,i;let n=[e.shape[2]||0,e.shape[1]||0],o=(t.body.skipTime||0)>T()-a1,s=bt<(t.body.skipFrames||0);if(t.skipAllowed&&o&&s&&M2!==null)bt++;else{let c=[];if((a=(A=t.body)==null?void 0:A.detector)!=null&&a.enabled){let x=l1(e,224);c=await s1(x,t,n),r.dispose(x)}else c=[{box:[0,0,0,0],boxRaw:[0,0,1,1],score:0}];for(let x=0;xr.dispose(o[x])),s}async function Mt(e,t){if(!(T0!=null&&T0.executor))return[];let n=(t.object.skipTime||0)>T()-y1,o=Rt<(t.object.skipFrames||0);return t.skipAllowed&&n&&o&&vt.length>0?(Rt++,vt):(Rt=0,new Promise(async s=>{let A=[e.shape[2]||0,e.shape[1]||0],a=r.image.resizeBilinear(e,[Me,Me]),i=t.object.enabled?T0==null?void 0:T0.execute(a,["tower_0/detections"]):null;y1=T(),r.dispose(a);let c=await _r(i,A,t);vt=c,s(c)}))}var P2={};te(P2,{connected:()=>kt,kpt:()=>Pt});var Pt=["head","neck","rightShoulder","rightElbow","rightWrist","chest","leftShoulder","leftElbow","leftWrist","bodyCenter","rightHip","rightKnee","rightAnkle","leftHip","leftKnee","leftAnkle"],kt={leftLeg:["leftHip","leftKnee","leftAnkle"],rightLeg:["rightHip","rightKnee","rightAnkle"],torso:["leftShoulder","rightShoulder","rightHip","leftHip","leftShoulder"],leftArm:["leftShoulder","leftElbow","leftWrist"],rightArm:["rightShoulder","rightElbow","rightWrist"],head:[]};var Q,p1=0,h0={id:0,keypoints:[],box:[0,0,0,0],boxRaw:[0,0,0,0],score:0,annotations:{}},wt=Number.MAX_SAFE_INTEGER;async function u1(e){return M.initial&&(Q=null),Q?e.debug&&h("cached model:",Q.modelUrl):Q=await L(e.body.modelPath),Q}async function $r(e,t){let[n,o]=e.shape,s=r.reshape(e,[o*n]),A=r.max(s,0),a=(await A.data())[0];if(a>t){let i=r.argMax(s,0),c=r.mod(i,n),x=(await c.data())[0],y=r.div(i,n),l=(await y.data())[0];return r.dispose([s,A,i,c,y]),[x,l,a]}return r.dispose([s,A]),[0,0,a]}async function Et(e,t){if(!(Q!=null&&Q.executor)||!(Q!=null&&Q.inputs[0].shape))return[];let n=(t.body.skipTime||0)>T()-p1,o=wt<(t.body.skipFrames||0);return t.skipAllowed&&n&&o&&Object.keys(h0.keypoints).length>0?(wt++,[h0]):(wt=0,new Promise(async s=>{let A=r.tidy(()=>{var u,m;let l=r.image.resizeBilinear(e,[((u=Q==null?void 0:Q.inputs[0].shape)==null?void 0:u[2])||0,((m=Q==null?void 0:Q.inputs[0].shape)==null?void 0:m[1])||0],!1),f=r.mul(l,O.tf2);return r.sub(f,O.tf1)}),a;if(t.body.enabled&&(a=Q==null?void 0:Q.execute(A)),p1=T(),r.dispose(A),a){h0.keypoints.length=0;let l=r.squeeze(a);r.dispose(a);let f=r.unstack(l,2);r.dispose(l);for(let d=0;d(t.body.minConfidence||0)&&h0.keypoints.push({score:Math.round(100*g)/100,part:Pt[d],positionRaw:[u/Q.inputs[0].shape[2],m/Q.inputs[0].shape[1]],position:[Math.round(e.shape[2]*u/Q.inputs[0].shape[2]),Math.round(e.shape[1]*m/Q.inputs[0].shape[1])]})}f.forEach(d=>r.dispose(d))}h0.score=h0.keypoints.reduce((l,f)=>f.score>l?f.score:l,0);let i=h0.keypoints.map(l=>l.position[0]),c=h0.keypoints.map(l=>l.position[1]);h0.box=[Math.min(...i),Math.min(...c),Math.max(...i)-Math.min(...i),Math.max(...c)-Math.min(...c)];let x=h0.keypoints.map(l=>l.positionRaw[0]),y=h0.keypoints.map(l=>l.positionRaw[1]);h0.boxRaw=[Math.min(...x),Math.min(...y),Math.max(...x)-Math.min(...x),Math.max(...y)-Math.min(...y)];for(let[l,f]of Object.entries(kt)){let d=[];for(let u=0;uP.part===f[u]),g=h0.keypoints.find(P=>P.part===f[u+1]);m&&g&&m.score>(t.body.minConfidence||0)&&g.score>(t.body.minConfidence||0)&&d.push([m.position,g.position])}h0.annotations[l]=d}s([h0])}))}var Ce=e=>[Math.abs(e.endPoint[0]-e.startPoint[0]),Math.abs(e.endPoint[1]-e.startPoint[1])],k2=e=>[e.startPoint[0]+(e.endPoint[0]-e.startPoint[0])/2,e.startPoint[1]+(e.endPoint[1]-e.startPoint[1])/2,1],w2=(e,t)=>e?[Math.trunc(Math.max(0,e.startPoint[0])),Math.trunc(Math.max(0,e.startPoint[1])),Math.trunc(Math.min(t.shape[2]||0,e.endPoint[0])-Math.max(0,e.startPoint[0])),Math.trunc(Math.min(t.shape[1]||0,e.endPoint[1])-Math.max(0,e.startPoint[1]))]:[0,0,0,0],E2=(e,t)=>e?[e.startPoint[0]/(t.shape[2]||0),e.startPoint[1]/(t.shape[1]||0),(e.endPoint[0]-e.startPoint[0])/(t.shape[2]||0),(e.endPoint[1]-e.startPoint[1])/(t.shape[1]||0)]:[0,0,0,0],T1=(e,t)=>{let n=[e.startPoint[0]*t[0],e.startPoint[1]*t[1]],o=[e.endPoint[0]*t[0],e.endPoint[1]*t[1]];return{startPoint:n,endPoint:o,landmarks:e.landmarks,confidence:e.confidence}},zt=(e,t,n)=>{let o=t.shape[1],s=t.shape[2],A=[e.startPoint[1]/o,e.startPoint[0]/s,e.endPoint[1]/o,e.endPoint[0]/s],a=r.image.cropAndResize(t,[A],[0],n),i=r.div(a,O.tf255);return r.dispose(a),i},z2=(e,t)=>{let n=k2(e),o=Ce(e),s=[t*o[0]/2,t*o[1]/2];return{startPoint:[n[0]-s[0],n[1]-s[1]],endPoint:[n[0]+s[0],n[1]+s[1]],landmarks:e.landmarks,confidence:e.confidence}},S2=e=>{let t=k2(e),n=Ce(e),o=Math.max(...n)/2;return{startPoint:[Math.round(t[0]-o),Math.round(t[1]-o)],endPoint:[Math.round(t[0]+o),Math.round(t[1]+o)],landmarks:e.landmarks,confidence:e.confidence}},v1=e=>{let t=e.map(o=>o[0]),n=e.map(o=>o[1]);return{startPoint:[Math.min(...t),Math.min(...n)],endPoint:[Math.max(...t),Math.max(...n)],landmarks:e}},St=[[1,0,0],[0,1,0],[0,0,1]],es=e=>e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI)),ts=(e,t)=>es(Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]));var b1=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]],Pe=(e,t)=>{let n=0;for(let o=0;o{let n=[];for(let o=0;o{let n=[],o=e.length;for(let s=0;s{let n=Math.cos(e),o=Math.sin(e),s=[[n,-o,0],[o,n,0],[0,0,1]],A=b1(t[0],t[1]),a=g1(A,s),i=b1(-t[0],-t[1]);return g1(a,i)},os=e=>{let t=[[e[0][0],e[1][0]],[e[0][1],e[1][1]]],n=[e[0][2],e[1][2]],o=[-Pe(t[0],n),-Pe(t[1],n)];return[t[0].concat(o[0]),t[1].concat(o[1]),[0,0,1]]},rs=(e,t)=>[Pe(e,t[0]),Pe(e,t[1])];function M1(e){let t=e===192?{strides:[4],anchors:[1]}:{strides:[e/16,e/8],anchors:[2,6]},n=[];for(let o=0;o[A[0]/s*(d[0]-s/2),A[1]/s*(d[1]-s/2),d[2]||0]),i=n&&n!==0&&Math.abs(n)>.2,c=i?R1(n,[0,0]):St,x=i?a.map(d=>[...rs(d,c),d[2]]):a,y=i?os(o):St,l=k2(t),f=[Pe(l,y[0]),Pe(l,y[1])];return x.map(d=>[Math.trunc(d[0]+f[0]),Math.trunc(d[1]+f[1]),Math.trunc(d[2]||0)])}function k1(e,t,n,o){let s=t.landmarks.length>=xt.count?xt.symmetryLine:be.symmetryLine,A=0,a=St,i;if(e&&M.kernels.includes("rotatewithoffset"))if(A=ts(t.landmarks[s[0]],t.landmarks[s[1]]),A&&A!==0&&Math.abs(A)>.2){let x=k2(t),y=[x[0]/n.shape[2],x[1]/n.shape[1]],l=r.image.rotateWithOffset(n,A,0,[y[0],y[1]]);a=R1(-A,x),i=zt(t,l,[o,o]),r.dispose(l)}else i=zt(t,n,[o,o]);else i=zt(t,n,[o,o]);return[A,a,i]}var ss=e=>{let t=e.map(o=>o[0]),n=e.map(o=>o[1]);return[Math.min(...t)+(Math.max(...t)-Math.min(...t))/2,Math.min(...n)+(Math.max(...n)-Math.min(...n))/2]},w1=(e,t)=>{let n=ss(e),o=Ce(t);return{startPoint:[n[0]-o[0]/2,n[1]-o[1]/2],endPoint:[n[0]+o[0]/2,n[1]+o[1]/2]}};var E1=6,As=1.4,F0,Nt=null,Ae=0,We=null,De=()=>Ae;async function z1(e){var t;return M.initial&&(F0=null),F0?e.debug&&h("cached model:",F0.modelUrl):F0=await L((t=e.face.detector)==null?void 0:t.modelPath),Ae=F0.executor&&F0.inputs[0].shape?F0.inputs[0].shape[2]:256,We=r.scalar(Ae,"int32"),Nt=r.tensor2d(M1(Ae)),F0}function as(e){if(!Nt||!We)return r.zeros([0,0]);let t={};t.boxStarts=r.slice(e,[0,1],[-1,2]),t.centers=r.add(t.boxStarts,Nt),t.boxSizes=r.slice(e,[0,3],[-1,2]),t.boxSizesNormalized=r.div(t.boxSizes,We),t.centersNormalized=r.div(t.centers,We),t.halfBoxSize=r.div(t.boxSizesNormalized,O.tf2),t.starts=r.sub(t.centersNormalized,t.halfBoxSize),t.ends=r.add(t.centersNormalized,t.halfBoxSize),t.startNormalized=r.mul(t.starts,We),t.endNormalized=r.mul(t.ends,We);let n=r.concat2d([t.startNormalized,t.endNormalized],1);return Object.keys(t).forEach(o=>r.dispose(t[o])),n}async function S1(e,t){var i,c,x,y;if(!e||e.isDisposedInternal||e.shape.length!==4||e.shape[1]<1||e.shape[2]<1)return[];let n={};n.resized=r.image.resizeBilinear(e,[Ae,Ae]),n.div=r.div(n.resized,O.tf127),n.normalized=r.sub(n.div,O.tf05);let o=F0==null?void 0:F0.execute(n.normalized);if(Array.isArray(o)&&o.length>2){let l=o.sort((f,d)=>f.size-d.size);n.concat384=r.concat([l[0],l[2]],2),n.concat512=r.concat([l[1],l[3]],2),n.concat=r.concat([n.concat512,n.concat384],1),n.batch=r.squeeze(n.concat,[0])}else Array.isArray(o)?n.batch=r.squeeze(o[0]):n.batch=r.squeeze(o);r.dispose(o),n.boxes=as(n.batch),n.logits=r.slice(n.batch,[0,0],[-1,1]),n.sigmoid=r.sigmoid(n.logits),n.scores=r.squeeze(n.sigmoid),n.nms=await r.image.nonMaxSuppressionAsync(n.boxes,n.scores,((i=t.face.detector)==null?void 0:i.maxDetected)||0,((c=t.face.detector)==null?void 0:c.iouThreshold)||0,((x=t.face.detector)==null?void 0:x.minConfidence)||0);let s=await n.nms.array(),A=[],a=await n.scores.data();for(let l=0;l(((y=t.face.detector)==null?void 0:y.minConfidence)||0)){let d={};d.bbox=r.slice(n.boxes,[s[l],0],[1,-1]),d.slice=r.slice(n.batch,[s[l],E1-1],[1,-1]),d.squeeze=r.squeeze(d.slice),d.landmarks=r.reshape(d.squeeze,[E1,-1]);let u=await d.bbox.data(),m={startPoint:[u[0],u[1]],endPoint:[u[2],u[3]],landmarks:await d.landmarks.array(),confidence:f},g=T1(m,[(e.shape[2]||0)/Ae,(e.shape[1]||0)/Ae]),P=z2(g,t.face.scale||As),v=S2(P);A.push(v),Object.keys(d).forEach(p=>r.dispose(d[p]))}}return Object.keys(n).forEach(l=>r.dispose(n[l])),A}var v0,ae=0,is=2.3,It=O0.leftEyeLower0,Lt=O0.rightEyeLower0,Fe={leftBounds:[It[0],It[It.length-1]],rightBounds:[Lt[0],Lt[Lt.length-1]]},Be={upperCenter:3,lowerCenter:4,index:71,numCoordinates:76};async function O1(e){var t,n;return M.initial&&(v0=null),v0?e.debug&&h("cached model:",v0.modelUrl):v0=await L((t=e.face.iris)==null?void 0:t.modelPath),ae=(v0==null?void 0:v0.executor)&&((n=v0.inputs)==null?void 0:n[0].shape)?v0.inputs[0].shape[2]:0,ae===-1&&(ae=64),v0}function j2(e,t,n,o){for(let s=0;s{let t=e[Fe.leftBounds[0]][2],n=e[Fe.rightBounds[0]][2];return t-n},N1=(e,t,n,o,s,A=!1)=>{let a=S2(z2(v1([e[n],e[o]]),is)),i=Ce(a),c=r.image.cropAndResize(t,[[a.startPoint[1]/s,a.startPoint[0]/s,a.endPoint[1]/s,a.endPoint[0]/s]],[0],[ae,ae]);if(A&&M.kernels.includes("flipleftright")){let x=r.image.flipLeftRight(c);r.dispose(c),c=x}return{box:a,boxSize:i,crop:c}},I1=(e,t,n,o=!1)=>{let s=[];for(let A=0;A{let o=e[O0[`${n}EyeUpper0`][Be.upperCenter]][2],s=e[O0[`${n}EyeLower0`][Be.lowerCenter]][2],A=(o+s)/2;return t.map((a,i)=>{let c=A;return i===2?c=o:i===4&&(c=s),[a[0],a[1],c]})};async function C1(e,t,n){if(!(v0!=null&&v0.executor))return e;let{box:o,boxSize:s,crop:A}=N1(e,t,Fe.leftBounds[0],Fe.leftBounds[1],n,!0),{box:a,boxSize:i,crop:c}=N1(e,t,Fe.rightBounds[0],Fe.rightBounds[1],n,!0),x=r.concat([A,c]);r.dispose(A),r.dispose(c);let y=v0.execute(x);r.dispose(x);let l=await y.data();r.dispose(y);let f=l.slice(0,Be.numCoordinates*3),{rawCoords:d,iris:u}=I1(f,o,s,!0),m=l.slice(Be.numCoordinates*3),{rawCoords:g,iris:P}=I1(m,a,i,!1),v=ls(e);Math.abs(v)<30?(j2(e,d,"left",null),j2(e,g,"right",null)):v<1?j2(e,d,"left",["EyeUpper0","EyeLower0"]):j2(e,g,"right",["EyeUpper0","EyeLower0"]);let p=L1(e,u,"left"),b=L1(e,P,"right");return e.concat(p).concat(b)}async function D1(e,t){var A,a,i,c,x,y,l,f,d,u;let n={lips:await((a=(A=t.filter(m=>m.size===160))==null?void 0:A[0])==null?void 0:a.data()),irisL:await((c=(i=t.filter(m=>m.size===10))==null?void 0:i[0])==null?void 0:c.data()),eyeL:await((y=(x=t.filter(m=>m.size===142))==null?void 0:x[0])==null?void 0:y.data()),irisR:await((f=(l=t.filter(m=>m.size===10))==null?void 0:l[1])==null?void 0:f.data()),eyeR:await((u=(d=t.filter(m=>m.size===142))==null?void 0:d[1])==null?void 0:u.data())};for(let m of Object.values(n))if(!m)return e;let o=Te.reduce((m,g)=>m+=e[g][2],0)/Te.length;for(let m=0;mm+=e[g][2],0)/ve.length;for(let m=0;mT()-X0.timestamp,o=X0.skipped<(((x=t.face.detector)==null?void 0:x.skipFrames)||0);!t.skipAllowed||!n||!o||X0.boxes.length===0?(X0.boxes=await S1(e,t),X0.timestamp=T(),X0.skipped=0):X0.skipped++;let s=[],A=[],a=0,i=$e;for(let v=0;vW.shape[W.shape.length-1]===1).data();if(k.faceScore=Math.round(100*q[0])/100,k.faceScore<(((u=t.face.detector)==null?void 0:u.minConfidence)||1)){if(p.confidence=k.faceScore,t.face.mesh.keepInvalid){k.box=w2(p,e),k.boxRaw=E2(p,e),k.score=k.boxScore,k.mesh=p.landmarks.map(W=>[(p.startPoint[0]+p.endPoint[0])/2+(p.endPoint[0]+p.startPoint[0])*W[0]/De(),(p.startPoint[1]+p.endPoint[1])/2+(p.endPoint[1]+p.startPoint[1])*W[1]/De()]),k.meshRaw=k.mesh.map(W=>[W[0]/(e.shape[2]||1),W[1]/(e.shape[1]||1),(W[2]||0)/i]);for(let W of Object.keys(be))k.annotations[W]=[k.mesh[be[W]]]}}else{let W=I.find(D=>D.shape[D.shape.length-1]===1404),Z=r.reshape(W,[-1,3]),K=await Z.array();r.dispose(Z),(m=t.face.attention)!=null&&m.enabled?K=await D1(K,I):(g=t.face.iris)!=null&&g.enabled&&(K=await C1(K,k.tensor,$e)),k.mesh=P1(K,p,b,j,$e),k.meshRaw=k.mesh.map(D=>[D[0]/(e.shape[2]||0),D[1]/(e.shape[1]||0),(D[2]||0)/i]);for(let D of Object.keys(O0))k.annotations[D]=O0[D].map(A0=>k.mesh[A0]);k.score=k.faceScore;let R={...w1(k.mesh,p),confidence:p.confidence,landmarks:p.landmarks};k.box=w2(R,e),k.boxRaw=E2(R,e),A.push(R)}r.dispose(I)}else{k.box=w2(p,e),k.boxRaw=E2(p,e),k.score=k.boxScore,k.mesh=p.landmarks.map(I=>[(p.startPoint[0]+p.endPoint[0])/2+(p.endPoint[0]+p.startPoint[0])*I[0]/De(),(p.startPoint[1]+p.endPoint[1])/2+(p.endPoint[1]+p.startPoint[1])*I[1]/De()]),k.meshRaw=k.mesh.map(I=>[I[0]/(e.shape[2]||0),I[1]/(e.shape[1]||0),(I[2]||0)/i]);for(let I of Object.keys(be))k.annotations[I]=[k.mesh[be[I]]]}k.score>(((P=t.face.detector)==null?void 0:P.minConfidence)||1)?s.push(k):r.dispose(k.tensor)}return X0.boxes=A,s}async function B1(e){var t,n,o,s,A,a;return M.initial&&(Y=null),((t=e.face.attention)==null?void 0:t.enabled)&&(Y==null?void 0:Y.signature)&&Object.keys(((n=Y==null?void 0:Y.signature)==null?void 0:n.outputs)||{}).length<6&&(Y=null),Y?e.debug&&h("cached model:",Y.modelUrl):(o=e.face.attention)!=null&&o.enabled?Y=await L(e.face.attention.modelPath):Y=await L((s=e.face.mesh)==null?void 0:s.modelPath),$e=Y.executor&&((A=Y==null?void 0:Y.inputs)==null?void 0:A[0].shape)?(a=Y==null?void 0:Y.inputs)==null?void 0:a[0].shape[2]:256,Y}var H1=ge,G1=Qe;var xs=["angry","disgust","fear","happy","sad","surprise","neutral"],j0,N2=[],V1=0,Z1=0,Ct=Number.MAX_SAFE_INTEGER;async function X1(e){var t;return M.initial&&(j0=null),j0?e.debug&&h("cached model:",j0.modelUrl):j0=await L((t=e.face.emotion)==null?void 0:t.modelPath),j0}async function Wt(e,t,n,o){var a,i;if(!j0)return[];let s=Ct<(((a=t.face.emotion)==null?void 0:a.skipFrames)||0),A=(((i=t.face.emotion)==null?void 0:i.skipTime)||0)>T()-Z1;return t.skipAllowed&&A&&s&&V1===o&&N2[n]&&N2[n].length>0?(Ct++,N2[n]):(Ct=0,new Promise(async c=>{var y;let x=[];if((y=t.face.emotion)!=null&&y.enabled){let l={},f=j0!=null&&j0.inputs[0].shape?j0.inputs[0].shape[2]:0;l.resize=r.image.resizeBilinear(e,[f,f],!1),l.channels=r.mul(l.resize,O.rgb),l.grayscale=r.sum(l.channels,3,!0),l.grayscaleSub=r.sub(l.grayscale,O.tf05),l.grayscaleMul=r.mul(l.grayscaleSub,O.tf2),l.emotion=j0==null?void 0:j0.execute(l.grayscaleMul),Z1=T();let d=await l.emotion.data();for(let u=0;u(t.face.emotion.minConfidence||0)&&x.push({score:Math.min(.99,Math.trunc(100*d[u])/100),emotion:xs[u]});x.sort((u,m)=>m.score-u.score),Object.keys(l).forEach(u=>r.dispose(l[u]))}N2[n]=x,V1=o,c(x)}))}var f0,ie=[],U1=0,Y1=0,Dt=Number.MAX_SAFE_INTEGER;async function K1(e){var t;return M.initial&&(f0=null),f0?e.debug&&h("cached model:",f0.modelUrl):f0=await L((t=e.face.description)==null?void 0:t.modelPath),f0}function ds(e){let t=e.image||e.tensor||e;if(!(f0!=null&&f0.inputs[0].shape))return t;let n=r.image.resizeBilinear(t,[f0.inputs[0].shape[2],f0.inputs[0].shape[1]],!1),o=r.mul(n,O.tf255);return r.dispose(n),o}async function Ft(e,t,n,o){var i,c,x,y;let s={age:0,gender:"unknown",genderScore:0,descriptor:[]};if(!(f0!=null&&f0.executor))return s;let A=Dt<(((i=t.face.description)==null?void 0:i.skipFrames)||0),a=(((c=t.face.description)==null?void 0:c.skipTime)||0)>T()-U1;return t.skipAllowed&&A&&a&&Y1===o&&((x=ie==null?void 0:ie[n])==null?void 0:x.age)>0&&((y=ie==null?void 0:ie[n])==null?void 0:y.genderScore)>0?(Dt++,ie[n]):(Dt=0,new Promise(async l=>{var f;if((f=t.face.description)!=null&&f.enabled){let d=ds(e),u=f0==null?void 0:f0.execute(d);U1=T(),r.dispose(d);let g=await u.find(B=>B.shape[1]===1).data(),P=Math.trunc(200*Math.abs(g[0]-.5))/100;P>(t.face.description.minConfidence||0)&&(s.gender=g[0]<=.5?"female":"male",s.genderScore=Math.min(.99,P));let v=r.argMax(u.find(B=>B.shape[1]===100),1),p=(await v.data())[0];r.dispose(v);let j=await u.find(B=>B.shape[1]===100).data();s.age=Math.round(j[p-1]>j[p+1]?10*p-100*j[p-1]:10*p+100*j[p+1])/10,(Number.isNaN(g[0])||Number.isNaN(j[0]))&&h("faceres error:",{model:f0,result:u});let k=u.find(B=>B.shape[1]===1024),I=k?await k.data():[];s.descriptor=Array.from(I),u.forEach(B=>r.dispose(B))}ie[n]=s,Y1=o,l(s)}))}var He=.1,Bt=.5;function ys(e,t,n){let o=!1,s=n.length-1;for(let A=0;At!=n[s].y>t&&e<(n[s].x-n[A].x)*(t-n[A].y)/(n[s].y-n[A].y)+n[A].x&&(o=!o);return o}async function Q1(e){if(!e.tensor||!e.mesh||e.mesh.length<100)return e.tensor;let t=e.tensor.shape[2]||0,n=e.tensor.shape[1]||0,o=await e.tensor.buffer(),s=[];for(let a of O0.silhouette)s.push({x:(e.mesh[a][0]-e.box[0])/e.box[2],y:(e.mesh[a][1]-e.box[1])/e.box[3]});He&&He>0&&(s=s.map(a=>({x:a.x>.5?a.x+He:a.x-He,y:a.y>.5?a.y+He:a.y-He})));for(let a=0;aT()-$1,A=Ht<(((i=t.face.antispoof)==null?void 0:i.skipFrames)||0);return t.skipAllowed&&s&&A&&_1===o&&I2[n]?(Ht++,I2[n]):(Ht=0,new Promise(async c=>{let x=r.image.resizeBilinear(e,[x0!=null&&x0.inputs[0].shape?x0.inputs[0].shape[2]:0,x0!=null&&x0.inputs[0].shape?x0.inputs[0].shape[1]:0],!1),y=x0==null?void 0:x0.execute(x),l=(await y.data())[0];I2[n]=Math.round(100*l)/100,_1=o,$1=T(),r.dispose([x,y]),c(I2[n])}))}var d0,L2=[],Vt=Number.MAX_SAFE_INTEGER,n3=0,o3=0;async function r3(e){var t;return M.initial&&(d0=null),d0?e.debug&&h("cached model:",d0.modelUrl):d0=await L((t=e.face.liveness)==null?void 0:t.modelPath),d0}async function Zt(e,t,n,o){var a,i;if(!(d0!=null&&d0.executor))return 0;let s=(((a=t.face.liveness)==null?void 0:a.skipTime)||0)>T()-o3,A=Vt<(((i=t.face.liveness)==null?void 0:i.skipFrames)||0);return t.skipAllowed&&s&&A&&n3===o&&L2[n]?(Vt++,L2[n]):(Vt=0,new Promise(async c=>{let x=r.image.resizeBilinear(e,[d0!=null&&d0.inputs[0].shape?d0.inputs[0].shape[2]:0,d0!=null&&d0.inputs[0].shape?d0.inputs[0].shape[1]:0],!1),y=d0==null?void 0:d0.execute(x),l=(await y.data())[0];L2[n]=Math.round(100*l)/100,n3=o,o3=T(),r.dispose([x,y]),c(L2[n])}))}var C0,Xt=[],ms=["white","black","asian","indian","other"],ps=[15,23,28,35.5,45.5,55.5,65],A3=0,a3=0,qt=Number.MAX_SAFE_INTEGER;async function i3(e){var t;return M.initial&&(C0=null),C0?e.debug&&h("cached model:",C0.modelUrl):C0=await L((t=e.face.gear)==null?void 0:t.modelPath),C0}async function Ut(e,t,n,o){var a,i;if(!C0)return{age:0,gender:"unknown",genderScore:0,race:[]};let s=qt<(((a=t.face.gear)==null?void 0:a.skipFrames)||0),A=(((i=t.face.gear)==null?void 0:i.skipTime)||0)>T()-a3;return t.skipAllowed&&A&&s&&A3===o&&Xt[n]?(qt++,Xt[n]):(qt=0,new Promise(async c=>{var P,v;if(!(C0!=null&&C0.inputs[0].shape))return;let x={},y=[[0,.1,.9,.9]];x.resize=r.image.cropAndResize(e,y,[0],[C0.inputs[0].shape[2],C0.inputs[0].shape[1]]);let l={age:0,gender:"unknown",genderScore:0,race:[]};(P=t.face.gear)!=null&&P.enabled&&([x.age,x.gender,x.race]=C0.execute(x.resize,["age_output","gender_output","race_output"]));let f=await x.gender.data();l.gender=f[0]>f[1]?"male":"female",l.genderScore=Math.round(100*(f[0]>f[1]?f[0]:f[1]))/100;let d=await x.race.data();for(let p=0;p(((v=t.face.gear)==null?void 0:v.minConfidence)||.2)&&l.race.push({score:Math.round(100*d[p])/100,race:ms[p]});l.race.sort((p,b)=>b.score-p.score);let m=Array.from(await x.age.data()).map((p,b)=>[ps[b],p]).sort((p,b)=>b[1]-p[1]),g=m[0][0];for(let p=1;pr.dispose(x[p])),Xt[n]=l,A3=o,a3=T(),c(l)}))}var R0,O2=[],c3=0,x3=0,Yt=Number.MAX_SAFE_INTEGER;async function d3(e){return M.initial&&(R0=null),R0?e.debug&&h("cached model:",R0.modelUrl):R0=await L(e.face.ssrnet.modelPathAge),R0}async function Kt(e,t,n,o){var a,i,c,x;if(!R0)return{age:0};let s=Yt<(((a=t.face.ssrnet)==null?void 0:a.skipFrames)||0),A=(((i=t.face.ssrnet)==null?void 0:i.skipTime)||0)>T()-x3;return t.skipAllowed&&s&&A&&c3===o&&((c=O2[n])==null?void 0:c.age)&&((x=O2[n])==null?void 0:x.age)>0?(Yt++,O2[n]):(Yt=0,new Promise(async y=>{var d;if(!(R0!=null&&R0.inputs)||!R0.inputs[0]||!R0.inputs[0].shape)return;let l={};l.resize=r.image.resizeBilinear(e,[R0.inputs[0].shape[2],R0.inputs[0].shape[1]],!1),l.enhance=r.mul(l.resize,O.tf255);let f={age:0};if((d=t.face.ssrnet)!=null&&d.enabled&&(l.age=R0.execute(l.enhance)),l.age){let u=await l.age.data();f.age=Math.trunc(10*u[0])/10}Object.keys(l).forEach(u=>r.dispose(l[u])),O2[n]=f,c3=o,x3=T(),y(f)}))}var W0,C2=[],f3=0,m3=0,Jt=Number.MAX_SAFE_INTEGER,Qt=[.2989,.587,.114];async function p3(e){var t;return M.initial&&(W0=null),W0?e.debug&&h("cached model:",W0.modelUrl):W0=await L((t=e.face.ssrnet)==null?void 0:t.modelPathGender),W0}async function _t(e,t,n,o){var a,i,c,x;if(!W0)return{gender:"unknown",genderScore:0};let s=Jt<(((a=t.face.ssrnet)==null?void 0:a.skipFrames)||0),A=(((i=t.face.ssrnet)==null?void 0:i.skipTime)||0)>T()-m3;return t.skipAllowed&&s&&A&&f3===o&&((c=C2[n])==null?void 0:c.gender)&&((x=C2[n])==null?void 0:x.genderScore)>0?(Jt++,C2[n]):(Jt=0,new Promise(async y=>{var u;if(!(W0!=null&&W0.inputs[0].shape))return;let l={};l.resize=r.image.resizeBilinear(e,[W0.inputs[0].shape[2],W0.inputs[0].shape[1]],!1),l.enhance=r.tidy(()=>{let[m,g,P]=r.split(l.resize,3,3),v=r.mul(m,Qt[0]),p=r.mul(g,Qt[1]),b=r.mul(P,Qt[2]),j=r.addN([v,p,b]);return r.mul(r.sub(j,O.tf05),2)});let f={gender:"unknown",genderScore:0};(u=t.face.ssrnet)!=null&&u.enabled&&(l.gender=W0.execute(l.enhance));let d=await l.gender.data();f.gender=d[0]>d[1]?"female":"male",f.genderScore=d[0]>d[1]?Math.trunc(100*d[0])/100:Math.trunc(100*d[1])/100,Object.keys(l).forEach(m=>r.dispose(l[m])),C2[n]=f,f3=o,m3=T(),y(f)}))}var M0,$t=[],h3=0,b3=0,g3=Number.MAX_SAFE_INTEGER;async function T3(e){var t;return M.initial&&(M0=null),M0?e.debug&&h("cached model:",M0.modelUrl):M0=await L((t=e.face.mobilefacenet)==null?void 0:t.modelPath),M0}async function e5(e,t,n,o){var a,i;if(!(M0!=null&&M0.executor))return[];let s=g3<(((a=t.face.mobilefacenet)==null?void 0:a.skipFrames)||0),A=(((i=t.face.mobilefacenet)==null?void 0:i.skipTime)||0)>T()-b3;return t.skipAllowed&&A&&s&&h3===o&&$t[n]?(g3++,$t[n]):new Promise(async c=>{var y;let x=[];if(((y=t.face.mobilefacenet)==null?void 0:y.enabled)&&(M0==null?void 0:M0.inputs[0].shape)){let l={};l.crop=r.image.resizeBilinear(e,[M0.inputs[0].shape[2],M0.inputs[0].shape[1]],!1),l.data=M0.execute(l.crop);let f=await l.data.data();x=Array.from(f),Object.keys(l).forEach(d=>r.dispose(l[d]))}$t[n]=x,h3=o,b3=T(),c(x)})}var P0,t5=[],R3=0,M3=0,P3=Number.MAX_SAFE_INTEGER;async function k3(e){return M.initial&&(P0=null),P0?e.debug&&h("cached model:",P0.modelUrl):P0=await L(e.face.insightface.modelPath),P0}async function n5(e,t,n,o){var a,i;if(!(P0!=null&&P0.executor))return[];let s=P3<(((a=t.face.insightface)==null?void 0:a.skipFrames)||0),A=(((i=t.face.insightface)==null?void 0:i.skipTime)||0)>T()-M3;return t.skipAllowed&&A&&s&&R3===o&&t5[n]?(P3++,t5[n]):new Promise(async c=>{var y;let x=[];if(((y=t.face.insightface)==null?void 0:y.enabled)&&(P0==null?void 0:P0.inputs[0].shape)){let l={};l.crop=r.image.resizeBilinear(e,[P0.inputs[0].shape[2],P0.inputs[0].shape[1]],!1),l.data=P0.execute(l.crop);let f=await l.data.data();x=Array.from(f),Object.keys(l).forEach(d=>r.dispose(l[d]))}t5[n]=x,R3=o,M3=T(),c(x)})}var us=e=>{let t=(l,f)=>Math.atan2(l[1]-f[1],l[0]-f[0]);if(!e.annotations.rightEyeIris||!e.annotations.leftEyeIris)return{bearing:0,strength:0};let n=[0,-.1],o=1,s=(e.mesh[33][2]||0)>(e.mesh[263][2]||0),A=s?e.mesh[473]:e.mesh[468],a=s?[(e.mesh[133][0]+e.mesh[33][0])/2,(e.mesh[133][1]+e.mesh[33][1])/2]:[(e.mesh[263][0]+e.mesh[362][0])/2,(e.mesh[263][1]+e.mesh[362][1])/2],i=s?[e.mesh[133][0]-e.mesh[33][0],e.mesh[23][1]-e.mesh[27][1]]:[e.mesh[263][0]-e.mesh[362][0],e.mesh[253][1]-e.mesh[257][1]],c=[(a[0]-A[0])/i[0]-n[0],o*(A[1]-a[1])/i[1]-n[1]],x=Math.sqrt(c[0]*c[0]+c[1]*c[1]);return x=Math.min(x,e.boxRaw[2]/2,e.boxRaw[3]/2),{bearing:(t([0,0],c)+Math.PI/2)%Math.PI,strength:x}},E3=(e,t)=>{let n=m=>{let g=Math.sqrt(m[0]*m[0]+m[1]*m[1]+m[2]*m[2]);return m[0]/=g,m[1]/=g,m[2]/=g,m},o=(m,g)=>{let P=m[0]-g[0],v=m[1]-g[1],p=m[2]-g[2];return[P,v,p]},s=(m,g)=>{let P=m[1]*g[2]-m[2]*g[1],v=m[2]*g[0]-m[0]*g[2],p=m[0]*g[1]-m[1]*g[0];return[P,v,p]},A=m=>{let[g,P,v,p,b,j,k,I,B]=m,q,W,Z;return p<1?p>-1?(Z=Math.asin(p),W=Math.atan2(-k,g),q=Math.atan2(-j,b)):(Z=-Math.PI/2,W=-Math.atan2(I,B),q=0):(Z=Math.PI/2,W=Math.atan2(I,B),q=0),Number.isNaN(q)&&(q=0),Number.isNaN(W)&&(W=0),Number.isNaN(Z)&&(Z=0),{pitch:2*-q,yaw:2*-W,roll:2*-Z}},a=e.meshRaw;if(!a||a.length<300)return{angle:{pitch:0,yaw:0,roll:0},matrix:[1,0,0,0,1,0,0,0,1],gaze:{bearing:0,strength:0}};let i=Math.max(e.boxRaw[2]*t[0],e.boxRaw[3]*t[1])/1.5,c=[a[10],a[152],a[234],a[454]].map(m=>[m[0]*t[0]/i,m[1]*t[1]/i,m[2]]),x=n(o(c[1],c[0])),y=n(o(c[3],c[2])),l=n(s(y,x));y=s(x,l);let f=[y[0],y[1],y[2],x[0],x[1],x[2],l[0],l[1],l[2]],d=A(f),u=a.length===478?us(e):{bearing:0,strength:0};return{angle:d,matrix:f,gaze:u}};function z3(e,t){let n=e==null?void 0:e.annotations;if(!n)return 0;let o=Math.max(Math.abs(n.leftEyeIris[3][0]-n.leftEyeIris[1][0]),Math.abs(n.rightEyeIris[3][0]-n.rightEyeIris[1][0]))/t;return Math.round(1.17/o)/100}var o5=async(e,t)=>{var u,m,g,P,v,p,b,j,k,I,B,q,W,Z,K,R,D,A0,H,a0,n0,C,F;let n=T(),o,s,A,a,i,c,x,y,l,f=[];e.state="run:face";let d=await F1(t,e.config);if(e.performance.face=M.perfadd?(e.performance.face||0)+Math.trunc(T()-n):Math.trunc(T()-n),!t.shape||t.shape.length!==4)return[];if(!d)return[];for(let S=0;S200?E3(d[S],[t.shape[2],t.shape[1]]):null;e.analyze("Start Emotion:"),e.config.async?a=(m=e.config.face.emotion)!=null&&m.enabled?Wt(d[S].tensor||r.tensor([]),e.config,S,d.length):[]:(e.state="run:emotion",n=T(),a=(g=e.config.face.emotion)!=null&&g.enabled?await Wt(d[S].tensor||r.tensor([]),e.config,S,d.length):[],e.performance.emotion=M.perfadd?(e.performance.emotion||0)+Math.trunc(T()-n):Math.trunc(T()-n)),e.analyze("End Emotion:"),e.analyze("Start AntiSpoof:"),e.config.async?x=(P=e.config.face.antispoof)!=null&&P.enabled?Gt(d[S].tensor||r.tensor([]),e.config,S,d.length):0:(e.state="run:antispoof",n=T(),x=(v=e.config.face.antispoof)!=null&&v.enabled?await Gt(d[S].tensor||r.tensor([]),e.config,S,d.length):0,e.performance.antispoof=M.perfadd?(e.performance.antispoof||0)+Math.trunc(T()-n):Math.trunc(T()-n)),e.analyze("End AntiSpoof:"),e.analyze("Start Liveness:"),e.config.async?y=(p=e.config.face.liveness)!=null&&p.enabled?Zt(d[S].tensor||r.tensor([]),e.config,S,d.length):0:(e.state="run:liveness",n=T(),y=(b=e.config.face.liveness)!=null&&b.enabled?await Zt(d[S].tensor||r.tensor([]),e.config,S,d.length):0,e.performance.liveness=M.perfadd?(e.performance.antispoof||0)+Math.trunc(T()-n):Math.trunc(T()-n)),e.analyze("End Liveness:"),e.analyze("Start GEAR:"),e.config.async?s=(j=e.config.face.gear)!=null&&j.enabled?Ut(d[S].tensor||r.tensor([]),e.config,S,d.length):null:(e.state="run:gear",n=T(),s=(k=e.config.face.gear)!=null&&k.enabled?await Ut(d[S].tensor||r.tensor([]),e.config,S,d.length):null,e.performance.gear=Math.trunc(T()-n)),e.analyze("End GEAR:"),e.analyze("Start SSRNet:"),e.config.async?(o=(I=e.config.face.ssrnet)!=null&&I.enabled?Kt(d[S].tensor||r.tensor([]),e.config,S,d.length):null,A=(B=e.config.face.ssrnet)!=null&&B.enabled?_t(d[S].tensor||r.tensor([]),e.config,S,d.length):null):(e.state="run:ssrnet",n=T(),o=(q=e.config.face.ssrnet)!=null&&q.enabled?await Kt(d[S].tensor||r.tensor([]),e.config,S,d.length):null,A=(W=e.config.face.ssrnet)!=null&&W.enabled?await _t(d[S].tensor||r.tensor([]),e.config,S,d.length):null,e.performance.ssrnet=Math.trunc(T()-n)),e.analyze("End SSRNet:"),e.analyze("Start MobileFaceNet:"),e.config.async?i=(Z=e.config.face.mobilefacenet)!=null&&Z.enabled?e5(d[S].tensor||r.tensor([]),e.config,S,d.length):null:(e.state="run:mobilefacenet",n=T(),i=(K=e.config.face.mobilefacenet)!=null&&K.enabled?await e5(d[S].tensor||r.tensor([]),e.config,S,d.length):null,e.performance.mobilefacenet=Math.trunc(T()-n)),e.analyze("End MobileFaceNet:"),e.analyze("Start InsightFace:"),e.config.async?c=(R=e.config.face.insightface)!=null&&R.enabled?n5(d[S].tensor||r.tensor([]),e.config,S,d.length):null:(e.state="run:mobilefacenet",n=T(),c=(D=e.config.face.insightface)!=null&&D.enabled?await n5(d[S].tensor||r.tensor([]),e.config,S,d.length):null,e.performance.mobilefacenet=Math.trunc(T()-n)),e.analyze("End InsightFace:"),e.analyze("Start Description:"),e.config.async?l=Ft(d[S].tensor||r.tensor([]),e.config,S,d.length):(e.state="run:description",n=T(),l=await Ft(d[S].tensor||r.tensor([]),e.config,S,d.length),e.performance.description=M.perfadd?(e.performance.description||0)+Math.trunc(T()-n):Math.trunc(T()-n)),e.analyze("End Description:"),e.config.async&&([o,A,a,i,c,l,s,x,y]=await Promise.all([o,A,a,i,c,l,s,x,y])),e.analyze("Finish Face:"),((A0=e.config.face.ssrnet)==null?void 0:A0.enabled)&&o&&A&&(l={...l,age:o.age,gender:A.gender,genderScore:A.genderScore}),((H=e.config.face.gear)==null?void 0:H.enabled)&&s&&(l={...l,age:s.age,gender:s.gender,genderScore:s.genderScore,race:s.race}),((a0=e.config.face.mobilefacenet)==null?void 0:a0.enabled)&&i&&(l.descriptor=i),((n0=e.config.face.insightface)==null?void 0:n0.enabled)&&c&&(l.descriptor=c);let $0=(C=e.config.face.iris)!=null&&C.enabled?z3(d[S],t.shape[2]):0,ee=(F=e.config.face.detector)!=null&&F.return?r.squeeze(d[S].tensor):null;r.dispose(d[S].tensor),d[S].tensor&&delete d[S].tensor;let i0={...d[S],id:S};l.age&&(i0.age=l.age),l.gender&&(i0.gender=l.gender),l.genderScore&&(i0.genderScore=l.genderScore),l.descriptor&&(i0.embedding=l.descriptor),l.race&&(i0.race=l.race),a&&(i0.emotion=a),x&&(i0.real=x),y&&(i0.live=y),$0>0&&(i0.distance=$0),N0&&(i0.rotation=N0),ee&&(i0.tensor=ee),f.push(i0),e.analyze("End Face")}return e.analyze("End FaceMesh:"),e.config.async&&(e.performance.face&&delete e.performance.face,e.performance.age&&delete e.performance.age,e.performance.gender&&delete e.performance.gender,e.performance.emotion&&delete e.performance.emotion),f};var b0={thumb:0,index:1,middle:2,ring:3,pinky:4,all:[0,1,2,3,4],nameMapping:{0:"thumb",1:"index",2:"middle",3:"ring",4:"pinky"},pointsMapping:{0:[[0,1],[1,2],[2,3],[3,4]],1:[[0,5],[5,6],[6,7],[7,8]],2:[[0,9],[9,10],[10,11],[11,12]],3:[[0,13],[13,14],[14,15],[15,16]],4:[[0,17],[17,18],[18,19],[19,20]]},getName:e=>b0.nameMapping[e],getPoints:e=>b0.pointsMapping[e]},ce={none:0,half:1,full:2,nameMapping:{0:"none",1:"half",2:"full"},getName:e=>ce.nameMapping[e]},_={verticalUp:0,verticalDown:1,horizontalLeft:2,horizontalRight:3,diagonalUpRight:4,diagonalUpLeft:5,diagonalDownRight:6,diagonalDownLeft:7,nameMapping:{0:"verticalUp",1:"verticalDown",2:"horizontalLeft",3:"horizontalRight",4:"diagonalUpRight",5:"diagonalUpLeft",6:"diagonalDownRight",7:"diagonalDownLeft"},getName:e=>_.nameMapping[e]},le=class{constructor(t){E(this,"name");E(this,"curls");E(this,"directions");E(this,"weights");E(this,"weightsRelative");this.name=t,this.curls={},this.directions={},this.weights=[1,1,1,1,1],this.weightsRelative=[1,1,1,1,1]}curl(t,n,o){typeof this.curls[t]=="undefined"&&(this.curls[t]=[]),this.curls[t].push([n,o])}direction(t,n,o){this.directions[t]||(this.directions[t]=[]),this.directions[t].push([n,o])}weight(t,n){this.weights[t]=n;let o=this.weights.reduce((s,A)=>s+A,0);this.weightsRelative=this.weights.map(s=>s*5/o)}matchAgainst(t,n){let o=0;for(let s in t){let A=t[s],a=this.curls[s];if(typeof a=="undefined"){o+=this.weightsRelative[s];continue}for(let[i,c]of a)if(A===i){o+=c*this.weightsRelative[s];break}}for(let s in n){let A=n[s],a=this.directions[s];if(typeof a=="undefined"){o+=this.weightsRelative[s];continue}for(let[i,c]of a)if(A===i){o+=c*this.weightsRelative[s];break}}return o/10}};var{thumb:B0,index:K0,middle:J0,ring:ke,pinky:we}=b0,{none:H0,half:bs,full:G0}=ce,{verticalUp:Ge,verticalDown:Ya,horizontalLeft:r5,horizontalRight:gs,diagonalUpRight:Ts,diagonalUpLeft:Ve,diagonalDownRight:Ka,diagonalDownLeft:Ja}=_,xe=new le("thumbs up");xe.curl(B0,H0,1);xe.direction(B0,Ge,1);xe.direction(B0,Ve,.25);xe.direction(B0,Ts,.25);for(let e of[b0.index,b0.middle,b0.ring,b0.pinky])xe.curl(e,G0,1),xe.direction(e,r5,1),xe.direction(e,gs,1);var o0=new le("victory");o0.curl(B0,bs,.5);o0.curl(B0,H0,.5);o0.direction(B0,Ge,1);o0.direction(B0,Ve,1);o0.curl(K0,H0,1);o0.direction(K0,Ge,.75);o0.direction(K0,Ve,1);o0.curl(J0,H0,1);o0.direction(J0,Ge,1);o0.direction(J0,Ve,.75);o0.curl(ke,G0,1);o0.direction(ke,Ge,.2);o0.direction(ke,Ve,1);o0.direction(ke,r5,.2);o0.curl(we,G0,1);o0.direction(we,Ge,.2);o0.direction(we,Ve,1);o0.direction(we,r5,.2);o0.weight(K0,2);o0.weight(J0,2);var de=new le("point");de.curl(B0,G0,1);de.curl(K0,H0,.5);de.curl(J0,G0,.5);de.curl(ke,G0,.5);de.curl(we,G0,.5);de.weight(K0,2);de.weight(J0,2);var ye=new le("middle finger");ye.curl(B0,H0,1);ye.curl(K0,G0,.5);ye.curl(J0,G0,.5);ye.curl(ke,G0,.5);ye.curl(we,G0,.5);ye.weight(K0,2);ye.weight(J0,2);var Ze=new le("open palm");Ze.curl(B0,H0,.75);Ze.curl(K0,H0,.75);Ze.curl(J0,H0,.75);Ze.curl(ke,H0,.75);Ze.curl(we,H0,.75);var S3=[xe,o0,de,ye,Ze];var vs=.7,Ee={HALF_CURL_START_LIMIT:60,NO_CURL_START_LIMIT:130,DISTANCE_VOTE_POWER:1.1,SINGLE_ANGLE_VOTE_POWER:.9,TOTAL_ANGLE_VOTE_POWER:1.6};function j3(e,t,n,o){let s=(t-o)/(e-n),A=Math.atan(s)*180/Math.PI;return A<=0?A=-A:A>0&&(A=180-A),A}function I3(e,t){if(!e||!t)return[0,0];let n=j3(e[0],e[1],t[0],t[1]);if(e.length===2)return n;let o=j3(e[1],e[2],t[1],t[2]);return[n,o]}function N3(e,t=1){let n=0,o=0,s=0;return e>=75&&e<=105?n=1*t:e>=25&&e<=155?o=1*t:s=1*t,[n,o,s]}function Rs(e,t,n){let o=e[0]-t[0],s=e[0]-n[0],A=t[0]-n[0],a=e[1]-t[1],i=e[1]-n[1],c=t[1]-n[1],x=e[2]-t[2],y=e[2]-n[2],l=t[2]-n[2],f=Math.sqrt(o*o+a*a+x*x),d=Math.sqrt(s*s+i*i+y*y),u=Math.sqrt(A*A+c*c+l*l),m=(u*u+f*f-d*d)/(2*u*f);m>1?m=1:m<-1&&(m=-1);let g=Math.acos(m);g=57.2958*g%180;let P;return g>Ee.NO_CURL_START_LIMIT?P=ce.none:g>Ee.HALF_CURL_START_LIMIT?P=ce.half:P=ce.full,P}function L3(e,t,n,o){let s;return o===Math.abs(e)?e>0?s=_.horizontalLeft:s=_.horizontalRight:o===Math.abs(t)?t>0?s=_.horizontalLeft:s=_.horizontalRight:n>0?s=_.horizontalLeft:s=_.horizontalRight,s}function O3(e,t,n,o){let s;return o===Math.abs(e)?e<0?s=_.verticalDown:s=_.verticalUp:o===Math.abs(t)?t<0?s=_.verticalDown:s=_.verticalUp:n<0?s=_.verticalDown:s=_.verticalUp,s}function Ms(e,t,n,o,s,A,a,i){let c,x=O3(e,t,n,o),y=L3(s,A,a,i);return x===_.verticalUp?y===_.horizontalLeft?c=_.diagonalUpLeft:c=_.diagonalUpRight:y===_.horizontalLeft?c=_.diagonalDownLeft:c=_.diagonalDownRight,c}function Ps(e,t,n,o){let s=e[0]-t[0],A=e[0]-n[0],a=t[0]-n[0],i=e[1]-t[1],c=e[1]-n[1],x=t[1]-n[1],y=Math.max(Math.abs(s),Math.abs(A),Math.abs(a)),l=Math.max(Math.abs(i),Math.abs(c),Math.abs(x)),f=0,d=0,u=0,m=l/(y+1e-5);m>1.5?f+=Ee.DISTANCE_VOTE_POWER:m>.66?d+=Ee.DISTANCE_VOTE_POWER:u+=Ee.DISTANCE_VOTE_POWER;let g=Math.sqrt(s*s+i*i),P=Math.sqrt(A*A+c*c),v=Math.sqrt(a*a+x*x),p=Math.max(g,P,v),b=e[0],j=e[1],k=n[0],I=n[1];p===g?(k=n[0],I=n[1]):p===v&&(b=t[0],j=t[1]);let W=I3([b,j],[k,I]),Z=N3(W,Ee.TOTAL_ANGLE_VOTE_POWER);f+=Z[0],d+=Z[1],u+=Z[2];for(let R of o){let D=N3(R,Ee.SINGLE_ANGLE_VOTE_POWER);f+=D[0],d+=D[1],u+=D[2]}let K;return f===Math.max(f,d,u)?K=O3(c,i,x,l):u===Math.max(d,u)?K=L3(A,s,a,y):K=Ms(c,i,x,l,A,s,a,y),K}function C3(e){let t=[],n=[],o=[],s=[];if(!e)return{curls:o,directions:s};for(let A of b0.all){let a=b0.getPoints(A),i=[],c=[];for(let x of a){let y=e[x[0]],l=e[x[1]],f=I3(y,l),d=f[0],u=f[1];i.push(d),c.push(u)}t.push(i),n.push(c)}for(let A of b0.all){let a=A===b0.thumb?1:0,i=b0.getPoints(A),c=e[i[a][0]],x=e[i[a+1][1]],y=e[i[3][1]],l=Rs(c,x,y),f=Ps(c,x,y,t[A].slice(a));o[A]=l,s[A]=f}return{curls:o,directions:s}}function W2(e){if(!e||e.length===0)return null;let t=C3(e),n={};for(let o of b0.all)n[b0.getName(o)]={curl:ce.getName(t.curls[o]),direction:_.getName(t.directions[o])};return n}function W3(e){let t=[];if(!e||e.length===0)return t;let n=C3(e);for(let o of S3){let s=o.matchAgainst(n.curls,n.directions);s>=vs&&t.push({name:o.name,confidence:s})}return t}var D3=e=>{if(!e)return[];let t=[];for(let n=0;nc.part==="leftWrist"),s=e[n].keypoints.find(c=>c.part==="rightWrist"),A=e[n].keypoints.find(c=>c.part==="nose");A&&o&&s&&o.position[1]c.part==="leftShoulder"),i=e[n].keypoints.find(c=>c.part==="rightShoulder");a&&i&&Math.abs(a.positionRaw[1]-i.positionRaw[1])>.1&&t.push({body:n,gesture:`leaning ${a.position[1]>i.position[1]?"left":"right"}`})}return t},F3=e=>{if(!e)return[];let t=[];for(let n=0;n450){let o=(e[n].mesh[33][2]||0)-(e[n].mesh[263][2]||0),s=e[n].mesh[33][0]-e[n].mesh[263][0];Math.abs(o/s)<=.15?t.push({face:n,gesture:"facing center"}):t.push({face:n,gesture:`facing ${o<0?"left":"right"}`}),Math.abs(e[n].mesh[374][1]-e[n].mesh[386][1])/Math.abs(e[n].mesh[443][1]-e[n].mesh[450][1])<.2&&t.push({face:n,gesture:"blink left eye"}),Math.abs(e[n].mesh[145][1]-e[n].mesh[159][1])/Math.abs(e[n].mesh[223][1]-e[n].mesh[230][1])<.2&&t.push({face:n,gesture:"blink right eye"});let i=Math.min(100,500*Math.abs(e[n].mesh[13][1]-e[n].mesh[14][1])/Math.abs(e[n].mesh[10][1]-e[n].mesh[152][1]));i>10&&t.push({face:n,gesture:`mouth ${Math.trunc(i)}% open`});let c=e[n].mesh[152][2]||0;Math.abs(c)>10&&t.push({face:n,gesture:`head ${c<0?"up":"down"}`})}return t},B3=e=>{var n,o,s,A;if(!e)return[];let t=[];for(let a=0;a.06||g>.06)&&(d=!1),m>g?m>.05&&t.push({iris:a,gesture:"looking right"}):g>.05&&t.push({iris:a,gesture:"looking left"});let P=Math.abs(e[a].mesh[145][1]-e[a].annotations.rightEyeIris[0][1])/e[a].box[3],v=Math.abs(e[a].mesh[374][1]-e[a].annotations.leftEyeIris[0][1])/e[a].box[3];(v<.01||P<.01||v>.022||P>.022)&&(d=!1),(v<.01||P<.01)&&t.push({iris:a,gesture:"looking down"}),(v>.022||P>.022)&&t.push({iris:a,gesture:"looking up"}),d&&t.push({iris:a,gesture:"looking center"})}return t},H3=e=>{if(!e)return[];let t=[];for(let n=0;n0){let s=o.reduce((a,i)=>(a.position[2]||0)<(i.position[2]||0)?a:i);t.push({hand:n,gesture:`${s.name} forward`});let A=o.reduce((a,i)=>a.position[1][A[0]*t[0],A[1]*t[1]]);return{startPoint:n,endPoint:o,palmLandmarks:s,confidence:e.confidence}}function F2(e,t=1.5){let n=e2(e),o=D2(e),s=[t*o[0]/2,t*o[1]/2],A=[n[0]-s[0],n[1]-s[1]],a=[n[0]+s[0],n[1]+s[1]];return{startPoint:A,endPoint:a,palmLandmarks:e.palmLandmarks}}function B2(e){let t=e2(e),n=D2(e),s=Math.max(...n)/2,A=[t[0]-s,t[1]-s],a=[t[0]+s,t[1]+s];return{startPoint:A,endPoint:a,palmLandmarks:e.palmLandmarks}}function ws(e){return e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI))}function q3(e,t){let n=Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]);return ws(n)}var G3=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]];function fe(e,t){let n=0;for(let o=0;o[a.x,a.y]),this.anchorsTensor=r.tensor2d(this.anchors),this.inputSize=((A=(s=(o=(n=this==null?void 0:this.model)==null?void 0:n.inputs)==null?void 0:o[0])==null?void 0:s.shape)==null?void 0:A[2])||0,this.inputSizeTensor=r.tensor1d([this.inputSize,this.inputSize]),this.doubleInputSizeTensor=r.tensor1d([this.inputSize*2,this.inputSize*2])}normalizeBoxes(t){let n={};n.boxOffsets=r.slice(t,[0,0],[-1,2]),n.boxSizes=r.slice(t,[0,2],[-1,2]),n.div=r.div(n.boxOffsets,this.inputSizeTensor),n.boxCenterPoints=r.add(n.div,this.anchorsTensor),n.halfBoxSizes=r.div(n.boxSizes,this.doubleInputSizeTensor),n.sub=r.sub(n.boxCenterPoints,n.halfBoxSizes),n.startPoints=r.mul(n.sub,this.inputSizeTensor),n.add=r.add(n.boxCenterPoints,n.halfBoxSizes),n.endPoints=r.mul(n.add,this.inputSizeTensor);let o=r.concat2d([n.startPoints,n.endPoints],1);return Object.keys(n).forEach(s=>r.dispose(n[s])),o}normalizeLandmarks(t,n){let o={};o.reshape=r.reshape(t,[-1,7,2]),o.div=r.div(o.reshape,this.inputSizeTensor),o.landmarks=r.add(o.div,this.anchors[n]?this.anchors[n]:0);let s=r.mul(o.landmarks,this.inputSizeTensor);return Object.keys(o).forEach(A=>r.dispose(o[A])),s}async predict(t,n){var i;let o={};o.resize=r.image.resizeBilinear(t,[this.inputSize,this.inputSize]),o.div=r.div(o.resize,O.tf127),o.image=r.sub(o.div,O.tf1),o.batched=this.model.execute(o.image),o.predictions=r.squeeze(o.batched),o.slice=r.slice(o.predictions,[0,0],[-1,1]),o.sigmoid=r.sigmoid(o.slice),o.scores=r.squeeze(o.sigmoid);let s=await o.scores.data();o.boxes=r.slice(o.predictions,[0,1],[-1,4]),o.norm=this.normalizeBoxes(o.boxes),o.nms=await r.image.nonMaxSuppressionAsync(o.norm,o.scores,3*(((i=n.hand)==null?void 0:i.maxDetected)||1),n.hand.iouThreshold,n.hand.minConfidence);let A=await o.nms.array(),a=[];for(let c of A){let x={};x.box=r.slice(o.norm,[c,0],[1,-1]),x.slice=r.slice(o.predictions,[c,5],[1,14]),x.norm=this.normalizeLandmarks(x.slice,c),x.palmLandmarks=r.reshape(x.norm,[-1,2]);let y=await x.box.data(),l=y.slice(0,2),f=y.slice(2,4),d=await x.palmLandmarks.array(),u={startPoint:l,endPoint:f,palmLandmarks:d,confidence:s[c]},m=X3(u,[(t.shape[2]||1)/this.inputSize,(t.shape[1]||0)/this.inputSize]);a.push(m),Object.keys(x).forEach(g=>r.dispose(x[g]))}return Object.keys(o).forEach(c=>r.dispose(o[c])),a}};var js=5,J3=1.65,Q3=[0,5,9,13,17,1,2],Ns=0,Is=2,_3=0,G2=class{constructor(t,n){E(this,"handDetector");E(this,"handPoseModel");E(this,"inputSize");E(this,"storedBoxes");E(this,"skipped");E(this,"detectedHands");var o,s,A;this.handDetector=t,this.handPoseModel=n,this.inputSize=((A=(s=(o=this.handPoseModel)==null?void 0:o.inputs)==null?void 0:s[0].shape)==null?void 0:A[2])||0,this.storedBoxes=[],this.skipped=Number.MAX_SAFE_INTEGER,this.detectedHands=0}calculateLandmarksBoundingBox(t){let n=t.map(a=>a[0]),o=t.map(a=>a[1]),s=[Math.min(...n),Math.min(...o)],A=[Math.max(...n),Math.max(...o)];return{startPoint:s,endPoint:A}}getBoxForPalmLandmarks(t,n){let o=t.map(A=>a5([...A,1],n)),s=this.calculateLandmarksBoundingBox(o);return F2(B2(s),js)}getBoxForHandLandmarks(t){let n=this.calculateLandmarksBoundingBox(t),o=F2(B2(n),J3);o.palmLandmarks=[];for(let s=0;s[a[0]*(d[0]-this.inputSize/2),a[1]*(d[1]-this.inputSize/2),a[2]*d[2]]),c=A5(o,[0,0]),x=i.map(d=>[...a5(d,c),d[2]]),y=U3(s),l=[...e2(n),1],f=[fe(l,y[0]),fe(l,y[1])];return x.map(d=>[Math.trunc(d[0]+f[0]),Math.trunc(d[1]+f[1]),Math.trunc(d[2])])}async estimateHands(t,n){let o=!1,s,A=(n.hand.skipTime||0)>T()-_3,a=this.skipped<(n.hand.skipFrames||0);n.skipAllowed&&A&&a&&(s=await this.handDetector.predict(t,n),this.skipped=0),n.skipAllowed&&this.skipped++,s&&s.length>0&&(s.length!==this.detectedHands&&this.detectedHands!==n.hand.maxDetected||!n.hand.landmarks)&&(this.detectedHands=0,this.storedBoxes=[...s],this.storedBoxes.length>0&&(o=!0));let i=[];for(let c=0;c=n.hand.minConfidence/4){let j=r.reshape(p,[-1,3]),k=await j.array();r.dispose(p),r.dispose(j);let I=this.transformRawCoords(k,m,y,u),B=this.getBoxForHandLandmarks(I);this.storedBoxes[c]={...B,confidence:b};let q={landmarks:I,confidence:b,boxConfidence:x.confidence,fingerConfidence:b,box:{topLeft:B.startPoint,bottomRight:B.endPoint}};i.push(q)}else this.storedBoxes[c]=null;r.dispose(p)}else{let y=F2(B2(x),J3),l={confidence:x.confidence,boxConfidence:x.confidence,fingerConfidence:0,box:{topLeft:y.startPoint,bottomRight:y.endPoint},landmarks:[]};i.push(l)}}return this.storedBoxes=this.storedBoxes.filter(c=>c!==null),this.detectedHands=i.length,i.length>n.hand.maxDetected&&(i.length=n.hand.maxDetected),i}};var $3={thumb:[1,2,3,4],index:[5,6,7,8],middle:[9,10,11,12],ring:[13,14,15,16],pinky:[17,18,19,20],palm:[0]},ze,Se,en;async function i5(e,t){let n=await en.estimateHands(e,t);if(!n)return[];let o=[];for(let s=0;sn[s].landmarks[l]);let a=n[s].landmarks,i=[Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER,0,0],c=[0,0,0,0];if(a&&a.length>0){for(let y of a)y[0]i[2]&&(i[2]=y[0]),y[1]>i[3]&&(i[3]=y[1]);i[2]-=i[0],i[3]-=i[1],c=[i[0]/(e.shape[2]||0),i[1]/(e.shape[1]||0),i[2]/(e.shape[2]||0),i[3]/(e.shape[1]||0)]}else i=n[s].box?[Math.trunc(Math.max(0,n[s].box.topLeft[0])),Math.trunc(Math.max(0,n[s].box.topLeft[1])),Math.trunc(Math.min(e.shape[2]||0,n[s].box.bottomRight[0])-Math.max(0,n[s].box.topLeft[0])),Math.trunc(Math.min(e.shape[1]||0,n[s].box.bottomRight[1])-Math.max(0,n[s].box.topLeft[1]))]:[0,0,0,0],c=[n[s].box.topLeft[0]/(e.shape[2]||0),n[s].box.topLeft[1]/(e.shape[1]||0),(n[s].box.bottomRight[0]-n[s].box.topLeft[0])/(e.shape[2]||0),(n[s].box.bottomRight[1]-n[s].box.topLeft[1])/(e.shape[1]||0)];let x=W2(a);o.push({id:s,score:Math.round(100*n[s].confidence)/100,boxScore:Math.round(100*n[s].boxConfidence)/100,fingerScore:Math.round(100*n[s].fingerConfidence)/100,label:"hand",box:i,boxRaw:c,keypoints:a,annotations:A,landmarks:x})}return o}async function tn(e){var n,o;M.initial&&(ze=null,Se=null),!ze||!Se?[ze,Se]=await Promise.all([e.hand.enabled?L((n=e.hand.detector)==null?void 0:n.modelPath):null,e.hand.landmarks?L((o=e.hand.skeleton)==null?void 0:o.modelPath):null]):(e.debug&&h("cached model:",ze.modelUrl),e.debug&&h("cached model:",Se.modelUrl));let t=ze?new H2(ze):void 0;return t&&Se&&(en=new G2(t,Se)),[ze,Se]}var t0=[null,null],Os=["StatefulPartitionedCall/Postprocessor/Slice","StatefulPartitionedCall/Postprocessor/ExpandDims_1"],me=[[0,0],[0,0]],Cs=["hand","fist","pinch","point","face","tip","pinchtip"],on=4,rn=1.6,Ws=512,Ds=1.4,V2=Number.MAX_SAFE_INTEGER,l5=0,Q0=[0,0],e0={boxes:[],hands:[]},sn={thumb:[1,2,3,4],index:[5,6,7,8],middle:[9,10,11,12],ring:[13,14,15,16],pinky:[17,18,19,20],base:[0],palm:[0,17,13,9,5,1,0]};async function An(e){var t;if(M.initial&&(t0[0]=null),t0[0])e.debug&&h("cached model:",t0[0].modelUrl);else{f2(["tensorlistreserve","enter","tensorlistfromtensor","merge","loopcond","switch","exit","tensorliststack","nextiteration","tensorlistsetitem","tensorlistgetitem","reciprocal","shape","split","where"],e),t0[0]=await L((t=e.hand.detector)==null?void 0:t.modelPath);let n=t0[0].executor?Object.values(t0[0].modelSignature.inputs):void 0;me[0][0]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[1].size):0,me[0][1]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[2].size):0}return t0[0]}async function an(e){var t;if(M.initial&&(t0[1]=null),t0[1])e.debug&&h("cached model:",t0[1].modelUrl);else{t0[1]=await L((t=e.hand.skeleton)==null?void 0:t.modelPath);let n=t0[1].executor?Object.values(t0[1].modelSignature.inputs):void 0;me[1][0]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[1].size):0,me[1][1]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[2].size):0}return t0[1]}async function Fs(e,t){let n=[];if(!e||!t0[0])return n;let o={},s=(e.shape[2]||1)/(e.shape[1]||1),A=Math.min(Math.round((e.shape[1]||0)/8)*8,Ws),a=Math.round(A*s/8)*8;o.resize=r.image.resizeBilinear(e,[A,a]),o.cast=r.cast(o.resize,"int32"),[o.rawScores,o.rawBoxes]=await t0[0].executeAsync(o.cast,Os),o.boxes=r.squeeze(o.rawBoxes,[0,2]),o.scores=r.squeeze(o.rawScores,[0]);let i=r.unstack(o.scores,1);r.dispose(i[on]),i.splice(on,1),o.filtered=r.stack(i,1),r.dispose(i),o.max=r.max(o.filtered,1),o.argmax=r.argMax(o.filtered,1);let c=0;o.nms=await r.image.nonMaxSuppressionAsync(o.boxes,o.max,(t.hand.maxDetected||0)+1,t.hand.iouThreshold||0,t.hand.minConfidence||1);let x=await o.nms.data(),y=await o.max.data(),l=await o.argmax.data();for(let f of Array.from(x)){let d=r.slice(o.boxes,f,1),u=await d.data();r.dispose(d);let m=[u[1],u[0],u[3]-u[1],u[2]-u[0]],g=v2(m,Ds),P=[Math.trunc(m[0]*Q0[0]),Math.trunc(m[1]*Q0[1]),Math.trunc(m[2]*Q0[0]),Math.trunc(m[3]*Q0[1])],v=y[f],p=Cs[l[f]],b={id:c++,score:v,box:P,boxRaw:g,label:p};n.push(b)}return Object.keys(o).forEach(f=>r.dispose(o[f])),n.sort((f,d)=>d.score-f.score),n.length>(t.hand.maxDetected||1)&&(n.length=t.hand.maxDetected||1),n}async function c5(e,t,n){let o={id:t.id,score:Math.round(100*t.score)/100,boxScore:Math.round(100*t.score)/100,fingerScore:0,box:t.box,boxRaw:t.boxRaw,label:t.label,keypoints:[],landmarks:{},annotations:{}};if(e&&t0[1]&&n.hand.landmarks&&t.score>(n.hand.minConfidence||0)){let s={},A=[t.boxRaw[1],t.boxRaw[0],t.boxRaw[3]+t.boxRaw[1],t.boxRaw[2]+t.boxRaw[0]];s.crop=r.image.cropAndResize(e,[A],[0],[me[1][0],me[1][1]],"bilinear"),s.div=r.div(s.crop,O.tf255),[s.score,s.keypoints]=t0[1].execute(s.div,["Identity_1","Identity"]);let a=(await s.score.data())[0],i=(100-Math.trunc(100/(1+Math.exp(a))))/100;if(i>=(n.hand.minConfidence||0)){o.fingerScore=i,s.reshaped=r.reshape(s.keypoints,[-1,3]);let y=(await s.reshaped.array()).map(l=>[l[0]/me[1][1],l[1]/me[1][0],l[2]||0]).map(l=>[l[0]*t.boxRaw[2],l[1]*t.boxRaw[3],l[2]||0]);o.keypoints=y.map(l=>[Q0[0]*(l[0]+t.boxRaw[0]),Q0[1]*(l[1]+t.boxRaw[1]),l[2]||0]),o.landmarks=W2(o.keypoints);for(let l of Object.keys(sn))o.annotations[l]=sn[l].map(f=>o.landmarks&&o.keypoints[f]?o.keypoints[f]:null)}Object.keys(s).forEach(c=>r.dispose(s[c]))}return o}async function x5(e,t){var s,A;if(!((s=t0[0])!=null&&s.executor)||!((A=t0[1])!=null&&A.executor)||!t0[0].inputs[0].shape||!t0[1].inputs[0].shape)return[];Q0=[e.shape[2]||0,e.shape[1]||0],V2++;let n=(t.hand.skipTime||0)>T()-l5,o=V2<(t.hand.skipFrames||0);return t.skipAllowed&&n&&o?e0.hands:new Promise(async a=>{let i=3*(t.hand.skipTime||0)>T()-l5,c=V2<3*(t.hand.skipFrames||0);t.skipAllowed&&e0.hands.length===t.hand.maxDetected?e0.hands=await Promise.all(e0.boxes.map(y=>c5(e,y,t))):t.skipAllowed&&i&&c&&e0.hands.length>0?e0.hands=await Promise.all(e0.boxes.map(y=>c5(e,y,t))):(e0.boxes=await Fs(e,t),l5=T(),e0.hands=await Promise.all(e0.boxes.map(y=>c5(e,y,t))),V2=0);let x=[...e0.boxes];if(e0.boxes.length=0,t.cacheSensitivity>0)for(let y=0;y.05&&l.box[3]/(e.shape[1]||1)>.05&&e0.hands[y].fingerScore&&e0.hands[y].fingerScore>(t.hand.minConfidence||0)){let f=v2(l.box,rn),d=v2(l.boxRaw,rn);e0.boxes.push({...x[y],box:f,boxRaw:d})}}for(let y=0;y({face:[],body:[],hand:[],gesture:[],object:[],persons:[],performance:{},timestamp:0,width:0,height:0,error:e});var t2={};te(t2,{connected:()=>X2,horizontal:()=>d5,kpt:()=>Z2,relative:()=>f5,vertical:()=>y5});var Z2=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],d5=[["leftEye","rightEye"],["leftEar","rightEar"],["leftShoulder","rightShoulder"],["leftElbow","rightElbow"],["leftWrist","rightWrist"],["leftHip","rightHip"],["leftKnee","rightKnee"],["leftAnkle","rightAnkle"]],y5=[["leftKnee","leftShoulder"],["rightKnee","rightShoulder"],["leftAnkle","leftKnee"],["rightAnkle","rightKnee"]],f5=[[["leftHip","rightHip"],["leftShoulder","rightShoulder"]],[["leftElbow","rightElbow"],["leftShoulder","rightShoulder"]]],X2={leftLeg:["leftHip","leftKnee","leftAnkle"],rightLeg:["rightHip","rightKnee","rightAnkle"],torso:["leftShoulder","rightShoulder","rightHip","leftHip","leftShoulder"],leftArm:["leftShoulder","leftElbow","leftWrist"],rightArm:["rightShoulder","rightElbow","rightWrist"],head:[]};var z=_0(),m5=0;function cn(e,t){var a,i,c,x,y,l,f,d,u,m,g,P,v,p,b,j,k,I,B,q,W,Z,K;let n=T();if(!e)return _0();let o=Date.now()-e.timestamp,s=o<1e3?8-Math.log(o+1):1;if(e.canvas&&(z.canvas=e.canvas),e.error&&(z.error=e.error),!z.body||e.body.length!==z.body.length)z.body=JSON.parse(JSON.stringify(e.body));else for(let R=0;R((s-1)*z.body[R].box[F]+C)/s),A0=e.body[R].boxRaw.map((C,F)=>((s-1)*z.body[R].boxRaw[F]+C)/s),H=e.body[R].keypoints.map((C,F)=>{var S,N0,$0,ee,i0,Ue,I5,L5,O5;return{score:C.score,part:C.part,position:[z.body[R].keypoints[F]?((s-1)*(z.body[R].keypoints[F].position[0]||0)+(C.position[0]||0))/s:C.position[0],z.body[R].keypoints[F]?((s-1)*(z.body[R].keypoints[F].position[1]||0)+(C.position[1]||0))/s:C.position[1],z.body[R].keypoints[F]?((s-1)*(z.body[R].keypoints[F].position[2]||0)+(C.position[2]||0))/s:C.position[2]],positionRaw:[z.body[R].keypoints[F]?((s-1)*(z.body[R].keypoints[F].positionRaw[0]||0)+(C.positionRaw[0]||0))/s:C.positionRaw[0],z.body[R].keypoints[F]?((s-1)*(z.body[R].keypoints[F].positionRaw[1]||0)+(C.positionRaw[1]||0))/s:C.positionRaw[1],z.body[R].keypoints[F]?((s-1)*(z.body[R].keypoints[F].positionRaw[2]||0)+(C.positionRaw[2]||0))/s:C.positionRaw[2]],distance:[z.body[R].keypoints[F]?((s-1)*(((S=z.body[R].keypoints[F].distance)==null?void 0:S[0])||0)+(((N0=C.distance)==null?void 0:N0[0])||0))/s:($0=C.distance)==null?void 0:$0[0],z.body[R].keypoints[F]?((s-1)*(((ee=z.body[R].keypoints[F].distance)==null?void 0:ee[1])||0)+(((i0=C.distance)==null?void 0:i0[1])||0))/s:(Ue=C.distance)==null?void 0:Ue[1],z.body[R].keypoints[F]?((s-1)*(((I5=z.body[R].keypoints[F].distance)==null?void 0:I5[2])||0)+(((L5=C.distance)==null?void 0:L5[2])||0))/s:(O5=C.distance)==null?void 0:O5[2]]}}),a0={},n0={connected:{}};(a=t.body.modelPath)!=null&&a.includes("efficientpose")?n0=P2:(i=t.body.modelPath)!=null&&i.includes("blazepose")?n0=g2:(c=t.body.modelPath)!=null&&c.includes("movenet")&&(n0=t2);for(let[C,F]of Object.entries(n0.connected)){let S=[];for(let N0=0;N0i0.part===F[N0]),ee=H.find(i0=>i0.part===F[N0+1]);$0&&ee&&S.push([$0.position,ee.position])}a0[C]=S}z.body[R]={...e.body[R],box:D,boxRaw:A0,keypoints:H,annotations:a0}}if(!z.hand||e.hand.length!==z.hand.length)z.hand=JSON.parse(JSON.stringify(e.hand));else for(let R=0;R((s-1)*z.hand[R].box[C]+n0)/s),A0=e.hand[R].boxRaw.map((n0,C)=>((s-1)*z.hand[R].boxRaw[C]+n0)/s);z.hand[R].keypoints.length!==e.hand[R].keypoints.length&&(z.hand[R].keypoints=e.hand[R].keypoints);let H=e.hand[R].keypoints&&e.hand[R].keypoints.length>0?e.hand[R].keypoints.map((n0,C)=>n0.map((F,S)=>((s-1)*(z.hand[R].keypoints[C][S]||1)+(F||0))/s)):[],a0={};if(Object.keys(z.hand[R].annotations).length!==Object.keys(e.hand[R].annotations).length)z.hand[R].annotations=e.hand[R].annotations,a0=z.hand[R].annotations;else if(e.hand[R].annotations)for(let n0 of Object.keys(e.hand[R].annotations))a0[n0]=(l=(y=(x=e.hand[R])==null?void 0:x.annotations)==null?void 0:y[n0])!=null&&l[0]?e.hand[R].annotations[n0].map((C,F)=>C.map((S,N0)=>((s-1)*z.hand[R].annotations[n0][F][N0]+S)/s)):null;z.hand[R]={...e.hand[R],box:D,boxRaw:A0,keypoints:H,annotations:a0}}if(!z.face||e.face.length!==z.face.length)z.face=JSON.parse(JSON.stringify(e.face));else for(let R=0;R((s-1)*z.face[R].box[a0]+H)/s),A0=e.face[R].boxRaw.map((H,a0)=>((s-1)*z.face[R].boxRaw[a0]+H)/s);if(e.face[R].rotation){let H={matrix:[0,0,0,0,0,0,0,0,0],angle:{roll:0,yaw:0,pitch:0},gaze:{bearing:0,strength:0}};H.matrix=(f=e.face[R].rotation)==null?void 0:f.matrix,H.angle={roll:((s-1)*(((u=(d=z.face[R].rotation)==null?void 0:d.angle)==null?void 0:u.roll)||0)+(((g=(m=e.face[R].rotation)==null?void 0:m.angle)==null?void 0:g.roll)||0))/s,yaw:((s-1)*(((v=(P=z.face[R].rotation)==null?void 0:P.angle)==null?void 0:v.yaw)||0)+(((b=(p=e.face[R].rotation)==null?void 0:p.angle)==null?void 0:b.yaw)||0))/s,pitch:((s-1)*(((k=(j=z.face[R].rotation)==null?void 0:j.angle)==null?void 0:k.pitch)||0)+(((B=(I=e.face[R].rotation)==null?void 0:I.angle)==null?void 0:B.pitch)||0))/s},H.gaze={bearing:((s-1)*(((q=z.face[R].rotation)==null?void 0:q.gaze.bearing)||0)+(((W=e.face[R].rotation)==null?void 0:W.gaze.bearing)||0))/s,strength:((s-1)*(((Z=z.face[R].rotation)==null?void 0:Z.gaze.strength)||0)+(((K=e.face[R].rotation)==null?void 0:K.gaze.strength)||0))/s},z.face[R]={...e.face[R],rotation:H,box:D,boxRaw:A0}}else z.face[R]={...e.face[R],box:D,boxRaw:A0}}if(!z.object||e.object.length!==z.object.length)z.object=JSON.parse(JSON.stringify(e.object));else for(let R=0;R((s-1)*z.object[R].box[a0]+H)/s),A0=e.object[R].boxRaw.map((H,a0)=>((s-1)*z.object[R].boxRaw[a0]+H)/s);z.object[R]={...e.object[R],box:D,boxRaw:A0}}if(e.persons){let R=e.persons;if(!z.persons||R.length!==z.persons.length)z.persons=JSON.parse(JSON.stringify(R));else for(let D=0;D((s-1)*z.persons[D].box[H]+A0)/s)}e.gesture&&(z.gesture=e.gesture),z.width=e.width,z.height=e.height;let A=T();return m5=M.perfadd?m5+Math.round(A-n):Math.round(A-n),e.performance&&(z.performance={...e.performance,interpolate:m5}),z}var m0;async function p5(e){return!m0||M.initial?m0=await L(e.segmentation.modelPath):e.debug&&h("cached model:",m0.modelUrl),m0}async function xn(e,t){var s;if(m0||(m0=await p5(t)),!(m0!=null&&m0.executor)||!((s=m0==null?void 0:m0.inputs)!=null&&s[0].shape))return null;let n={};n.resize=r.image.resizeBilinear(e,[m0.inputs[0].shape?m0.inputs[0].shape[1]:0,m0.inputs[0].shape?m0.inputs[0].shape[2]:0],!1),n.norm=r.div(n.resize,O.tf255),n.res=m0.execute(n.norm),n.squeeze=r.squeeze(n.res,[0]),[n.bgRaw,n.fgRaw]=r.unstack(n.squeeze,2),n.fg=r.softmax(n.fgRaw),n.mul=r.mul(n.fg,O.tf255),n.expand=r.expandDims(n.mul,2),n.output=r.image.resizeBilinear(n.expand,[e.shape[1]||0,e.shape[2]||0]);let o;switch(t.segmentation.mode||"default"){case"default":n.input=r.squeeze(e),n.concat=r.concat([n.input,n.output],-1),o=r.cast(n.concat,"int32");break;case"alpha":o=r.cast(n.output,"int32");break;default:o=r.tensor(0)}return Object.keys(n).forEach(A=>r.dispose(n[A])),o}var h5={};te(h5,{distance:()=>u5,find:()=>Gs,similarity:()=>Hs});function u5(e,t,n={order:2,multiplier:25}){if(!e||!e)return Number.MAX_SAFE_INTEGER;let o=0;for(let s=0;s{if(e===0)return 1;let A=(1-(t===2?Math.sqrt(e):e**(1/t))/100-n)/(o-n);return Math.max(Math.min(A,1),0)};function Hs(e,t,n={order:2,multiplier:25,min:.2,max:.8}){let o=u5(e,t,n);return yn(o,n.order||2,n.min||0,n.max||1)}function Gs(e,t,n={order:2,multiplier:25,threshold:0,min:.2,max:.8}){if(!Array.isArray(e)||!Array.isArray(t)||e.length<64||t.length===0)return{index:-1,distance:Number.POSITIVE_INFINITY,similarity:0};let o=Number.MAX_SAFE_INTEGER,s=-1;for(let a=0;ar2,validateModel:()=>_2});var fn=.005,k0={keypoints:[],padding:[[0,0],[0,0],[0,0],[0,0]]};function b5(e){for(let t of d5){let n=e.keypoints.findIndex(s=>s.part===t[0]),o=e.keypoints.findIndex(s=>s.part===t[1]);if(e.keypoints[n]&&e.keypoints[o]&&e.keypoints[n].position[0]s&&s.part===t[0]),o=e.keypoints.findIndex(s=>s&&s.part===t[1]);e.keypoints[n]&&e.keypoints[o]&&e.keypoints[n].position[1]x&&x.part===t[0]),s=e.keypoints.findIndex(x=>x&&x.part===t[1]),A=e.keypoints.findIndex(x=>x&&x.part===n[0]),a=e.keypoints.findIndex(x=>x&&x.part===n[1]);if(!e.keypoints[A]||!e.keypoints[a])continue;let i=e.keypoints[o]?[Math.abs(e.keypoints[A].position[0]-e.keypoints[o].position[0]),Math.abs(e.keypoints[a].position[0]-e.keypoints[o].position[0])]:[0,0],c=e.keypoints[s]?[Math.abs(e.keypoints[a].position[0]-e.keypoints[s].position[0]),Math.abs(e.keypoints[A].position[0]-e.keypoints[s].position[0])]:[0,0];if(i[0]>i[1]||c[0]>c[1]){let x=e.keypoints[o];e.keypoints[o]=e.keypoints[s],e.keypoints[s]=x}}}function mn(e){for(let t=0;te.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0,e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0],[e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0,e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0],[0,0]],n.pad=r.pad(e,k0.padding),n.resize=r.image.resizeBilinear(n.pad,[t,t]);let o=r.cast(n.resize,"int32");return Object.keys(n).forEach(a=>r.dispose(n[a])),o}function un(e,t){e.keypoints=e.keypoints.filter(o=>o==null?void 0:o.position);for(let o of e.keypoints)o.position=[o.position[0]*(t[0]+k0.padding[2][0]+k0.padding[2][1])/t[0]-k0.padding[2][0],o.position[1]*(t[1]+k0.padding[1][0]+k0.padding[1][1])/t[1]-k0.padding[1][0]],o.positionRaw=[o.position[0]/t[0],o.position[1]/t[1]];let n=Y0(e.keypoints.map(o=>o.position),t);return e.box=n.box,e.boxRaw=n.boxRaw,e}var r0,q2=0,g5=Number.MAX_SAFE_INTEGER,je={boxes:[],bodies:[],last:0};async function hn(e){var t;return M.initial&&(r0=null),r0?e.debug&&h("cached model:",r0.modelUrl):(f2(["size"],e),r0=await L(e.body.modelPath)),q2=(r0==null?void 0:r0.executor)&&((t=r0==null?void 0:r0.inputs)==null?void 0:t[0].shape)?r0.inputs[0].shape[2]:0,q2<64&&(q2=256),r0}function Zs(e,t,n){let o=e[0][0],s=[],A=0;for(let y=0;yt.body.minConfidence){let l=[o[y][1],o[y][0]];s.push({score:Math.round(100*A)/100,part:Z2[y],positionRaw:l,position:[Math.round((n.shape[2]||0)*l[0]),Math.round((n.shape[1]||0)*l[1])]})}A=s.reduce((y,l)=>l.score>y?l.score:y,0);let a=[],i=Y0(s.map(y=>y.position),[n.shape[2],n.shape[1]]),c={};for(let[y,l]of Object.entries(X2)){let f=[];for(let d=0;dg.part===l[d]),m=s.find(g=>g.part===l[d+1]);u&&m&&u.score>(t.body.minConfidence||0)&&m.score>(t.body.minConfidence||0)&&f.push([u.position,m.position])}c[y]=f}let x={id:0,score:A,box:i.box,boxRaw:i.boxRaw,keypoints:s,annotations:c};return b5(x),a.push(x),a}function Xs(e,t,n){let o=[];for(let s=0;st.body.minConfidence){let i=[];for(let l=0;l<17;l++){let f=A[3*l+2];if(f>t.body.minConfidence){let d=[A[3*l+1],A[3*l+0]];i.push({part:Z2[l],score:Math.round(100*f)/100,positionRaw:d,position:[Math.round((n.shape[2]||0)*d[0]),Math.round((n.shape[1]||0)*d[1])]})}}let c=Y0(i.map(l=>l.position),[n.shape[2],n.shape[1]]),x={};for(let[l,f]of Object.entries(X2)){let d=[];for(let u=0;uP.part===f[u]),g=i.find(P=>P.part===f[u+1]);m&&g&&m.score>(t.body.minConfidence||0)&&g.score>(t.body.minConfidence||0)&&d.push([m.position,g.position])}x[l]=d}let y={id:s,score:a,box:c.box,boxRaw:c.boxRaw,keypoints:[...i],annotations:x};b5(y),o.push(y)}}return o.sort((s,A)=>A.score-s.score),o.length>t.body.maxDetected&&(o.length=t.body.maxDetected),o}async function T5(e,t){var s;if(!(r0!=null&&r0.executor)||!((s=r0==null?void 0:r0.inputs)!=null&&s[0].shape))return[];t.skipAllowed||(je.boxes.length=0),g5++;let n=(t.body.skipTime||0)>T()-je.last,o=g5<(t.body.skipFrames||0);return t.skipAllowed&&n&&o?je.bodies:new Promise(async A=>{let a={};g5=0,a.input=pn(e,q2),a.res=r0==null?void 0:r0.execute(a.input),je.last=T();let i=await a.res.array();je.bodies=a.res.shape[2]===17?Zs(i,t,e):Xs(i,t,e);for(let c of je.bodies)un(c,[e.shape[2]||1,e.shape[1]||1]),mn(c.keypoints);Object.keys(a).forEach(c=>r.dispose(a[c])),A(je.bodies)})}var D0,U2=[],gn=0,v5=Number.MAX_SAFE_INTEGER,K2=0,Y2=2.5;async function Tn(e){if(!D0||M.initial){D0=await L(e.object.modelPath);let t=D0!=null&&D0.executor?Object.values(D0.modelSignature.inputs):void 0;K2=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):416}else e.debug&&h("cached model:",D0.modelUrl);return D0}async function qs(e,t,n){var x,y;let o=0,s=[],A=K2;for(let l of[1,2,4]){let f=l*13,d=r.squeeze(e.find(p=>p.shape[1]===f**2&&(p.shape[2]||0)===Oe.length)),u=await d.array(),m=r.squeeze(e.find(p=>p.shape[1]===f**2&&(p.shape[2]||0)(n.object.minConfidence||0)&&b!==61){let k=(.5+Math.trunc(p%f))/f,I=(.5+Math.trunc(p/f))/f,B=v[p].map(H=>H*(f/l/A)),[q,W]=[k-Y2/l*B[0],I-Y2/l*B[1]],[Z,K]=[k+Y2/l*B[2]-q,I+Y2/l*B[3]-W],R=[q,W,Z,K];R=R.map(H=>Math.max(0,Math.min(H,1)));let D=[R[0]*t[0],R[1]*t[1],R[2]*t[0],R[3]*t[1]],A0={id:o++,score:Math.round(100*j)/100,class:b+1,label:Oe[b].label,box:D.map(H=>Math.trunc(H)),boxRaw:R};s.push(A0)}}r.dispose([d,m,g,P])}let a=s.map(l=>[l.boxRaw[1],l.boxRaw[0],l.boxRaw[3],l.boxRaw[2]]),i=s.map(l=>l.score),c=[];if(a&&a.length>0){let l=await r.image.nonMaxSuppressionAsync(a,i,n.object.maxDetected||0,n.object.iouThreshold,n.object.minConfidence);c=Array.from(await l.data()),r.dispose(l)}return s=s.filter((l,f)=>c.includes(f)).sort((l,f)=>f.score-l.score),s}async function R5(e,t){if(!(D0!=null&&D0.executor))return[];let n=(t.object.skipTime||0)>T()-gn,o=v5<(t.object.skipFrames||0);return t.skipAllowed&&n&&o&&U2.length>0?(v5++,U2):(v5=0,!M.kernels.includes("mod")||!M.kernels.includes("sparsetodense")?U2:new Promise(async s=>{let A=[e.shape[2]||0,e.shape[1]||0],a=r.image.resizeBilinear(e,[K2,K2],!1),i=r.div(a,O.tf255),c=r.transpose(i,[0,3,1,2]),x;t.object.enabled&&(x=D0.execute(c)),gn=T();let y=await qs(x,A,t);U2=y,r.dispose([a,i,c,...x]),s(y)}))}var o2=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],Us=o2.length,n2=o2.reduce((e,t,n)=>(e[t]=n,e),{}),Ys=[["leftHip","leftShoulder"],["leftElbow","leftShoulder"],["leftElbow","leftWrist"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["rightHip","rightShoulder"],["rightElbow","rightShoulder"],["rightElbow","rightWrist"],["rightHip","rightKnee"],["rightKnee","rightAnkle"],["leftShoulder","rightShoulder"],["leftHip","rightHip"]],H7=Ys.map(([e,t])=>[n2[e],n2[t]]),Rn=[["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 Mn(e){let t=e.reduce(({maxX:n,maxY:o,minX:s,minY:A},{position:{x:a,y:i}})=>({maxX:Math.max(n,a),maxY:Math.max(o,i),minX:Math.min(s,a),minY:Math.min(A,i)}),{maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY,minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY});return[t.minX,t.minY,t.maxX-t.minX,t.maxY-t.minY]}function Pn(e,[t,n],[o,s]){let A=t/o,a=n/s,i=(x,y)=>({id:y,score:x.score,boxRaw:[x.box[0]/s,x.box[1]/o,x.box[2]/s,x.box[3]/o],box:[Math.trunc(x.box[0]*a),Math.trunc(x.box[1]*A),Math.trunc(x.box[2]*a),Math.trunc(x.box[3]*A)],keypoints:x.keypoints.map(({score:l,part:f,position:d})=>({score:l,part:f,position:[Math.trunc(d.x*a),Math.trunc(d.y*A)],positionRaw:[d.x/o,d.y/o]})),annotations:{}});return e.map((x,y)=>i(x,y))}var J2=class{constructor(t,n){E(this,"priorityQueue");E(this,"numberOfElements");E(this,"getElementValue");this.priorityQueue=new Array(t),this.numberOfElements=-1,this.getElementValue=n}enqueue(t){this.priorityQueue[++this.numberOfElements]=t,this.swim(this.numberOfElements)}dequeue(){let t=this.priorityQueue[0];return this.exchange(0,this.numberOfElements--),this.sink(0),this.priorityQueue[this.numberOfElements+1]=null,t}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(t){for(;t>0&&this.less(Math.floor(t/2),t);)this.exchange(t,Math.floor(t/2)),t=Math.floor(t/2)}sink(t){for(;2*t<=this.numberOfElements;){let n=2*t;if(nn?n:e}function kn(e,t,n,o){let s=n-e,A=o-t;return s*s+A*A}function w5(e,t){return{x:e.x+t.x,y:e.y+t.y}}var w0,Js=["MobilenetV1/offset_2/BiasAdd","MobilenetV1/heatmap_2/BiasAdd","MobilenetV1/displacement_fwd_2/BiasAdd","MobilenetV1/displacement_bwd_2/BiasAdd"],Q2=1,Xe=16,Qs=50**2;function wn(e,t,n,o,s,A,a=2){let i=P=>({y:A.get(P.y,P.x,e),x:A.get(P.y,P.x,A.shape[2]/2+e)}),c=(P,v,p)=>({y:k5(Math.round(P.y/Xe),0,v-1),x:k5(Math.round(P.x/Xe),0,p-1)}),[x,y]=o.shape,l=c(t.position,x,y),f=i(l),u=w5(t.position,f);for(let P=0;P[n2[f],n2[d]]),a=A.map(([,f])=>f),i=A.map(([f])=>f),c=t.shape[2],x=a.length,y=new Array(c),l=P5(e.part,Xe,n);y[e.part.id]={score:e.score,part:o2[e.part.id],position:l};for(let f=x-1;f>=0;--f){let d=a[f],u=i[f];y[d]&&!y[u]&&(y[u]=wn(f,y[d],u,t,n,s))}for(let f=0;ft){i=!1;break}if(!i)break}return i}function eA(e,t){let[n,o,s]=t.shape,A=new J2(n*o*s,({score:a})=>a);for(let a=0;a{var a;let A=(a=s[o])==null?void 0:a.position;return A?kn(n,t,A.y,A.x)<=Qs:!1})}function tA(e,t){return t.reduce((o,{position:s,score:A},a)=>(En(e,s,a)||(o+=A),o),0)/t.length}function nA(e,t,n,o,s,A){let a=[],i=eA(A,t);for(;a.lengthd.score>A);let l=tA(a,y),f=Mn(y);l>A&&a.push({keypoints:y,box:f,score:Math.round(100*l)/100})}return a}async function E5(e,t){if(!(w0!=null&&w0.executor))return[];let n=r.tidy(()=>{if(!w0.inputs[0].shape)return[];let a=r.image.resizeBilinear(e,[w0.inputs[0].shape[2],w0.inputs[0].shape[1]]),i=r.sub(r.div(r.cast(a,"float32"),127.5),1),x=w0.execute(i,Js).map(y=>r.squeeze(y,[0]));return x[1]=r.sigmoid(x[1]),x}),o=await Promise.all(n.map(a=>a.buffer()));for(let a of n)r.dispose(a);let s=nA(o[0],o[1],o[2],o[3],t.body.maxDetected,t.body.minConfidence);return w0.inputs[0].shape?Pn(s,[e.shape[1],e.shape[2]],[w0.inputs[0].shape[2],w0.inputs[0].shape[1]]):[]}async function zn(e){return!w0||M.initial?w0=await L(e.body.modelPath):e.debug&&h("cached model:",w0.modelUrl),w0}var q0,oA=["fgr","pha","r1o","r2o","r3o","r4o"],s0={},S5=0;function Nn(e){r.dispose([s0.r1i,s0.r2i,s0.r3i,s0.r4i,s0.downsample_ratio]),s0.r1i=r.tensor(0),s0.r2i=r.tensor(0),s0.r3i=r.tensor(0),s0.r4i=r.tensor(0),S5=e.segmentation.ratio||.5,s0.downsample_ratio=r.tensor(S5)}async function j5(e){return!q0||M.initial?q0=await L(e.segmentation.modelPath):e.debug&&h("cached model:",q0.modelUrl),Nn(e),q0}var jn=e=>r.tidy(()=>{let t=r.squeeze(e,[0]),n=r.mul(t,O.tf255);return r.cast(n,"int32")});function z5(e,t){let n=e?jn(e):r.fill([t.shape[1]||0,t.shape[2]||0,3],255,"int32"),o=t?jn(t):r.fill([e.shape[1]||0,e.shape[2]||0,1],255,"int32"),s=r.concat([n,o],-1);return r.dispose([n,o]),s}function rA(e){return r.tidy(()=>{let t={};return t.unstack=r.unstack(e,-1),t.concat=r.concat(t.unstack,1),t.split=r.split(t.concat,4,1),t.stack=r.concat(t.split,2),t.squeeze=r.squeeze(t.stack,[0]),t.expand=r.expandDims(t.squeeze,-1),t.add=r.add(t.expand,1),t.mul=r.mul(t.add,127.5),t.cast=r.cast(t.mul,"int32"),t.tile=r.tile(t.cast,[1,1,3]),t.alpha=r.fill([t.tile.shape[0]||0,t.tile.shape[1]||0,1],255,"int32"),r.concat([t.tile,t.alpha],-1)})}async function In(e,t){if(q0||(q0=await j5(t)),!(q0!=null&&q0.executor))return null;s0.src=r.div(e,255),S5!==t.segmentation.ratio&&Nn(t);let[n,o,s,A,a,i]=await q0.executeAsync(s0,oA),c;switch(t.segmentation.mode||"default"){case"default":c=z5(n,o);break;case"alpha":c=z5(null,o);break;case"foreground":c=z5(n,null);break;case"state":c=rA(s);break;default:c=r.tensor(0)}return r.dispose([s0.src,n,o,s0.r1i,s0.r2i,s0.r3i,s0.r4i]),[s0.r1i,s0.r2i,s0.r3i,s0.r4i]=[s,A,a,i],c}var p0;async function N5(e){return!p0||M.initial?p0=await L(e.segmentation.modelPath):e.debug&&h("cached model:",p0.modelUrl),p0}async function On(e,t){var s;if(p0||(p0=await N5(t)),!(p0!=null&&p0.executor)||!((s=p0==null?void 0:p0.inputs)!=null&&s[0].shape))return null;let n={};n.resize=r.image.resizeBilinear(e,[p0.inputs[0].shape?p0.inputs[0].shape[1]:0,p0.inputs[0].shape?p0.inputs[0].shape[2]:0],!1),n.norm=r.div(n.resize,O.tf255),n.res=p0.execute(n.norm),n.squeeze=r.squeeze(n.res,[0]),n.alpha=r.image.resizeBilinear(n.squeeze,[e.shape[1]||0,e.shape[2]||0]),n.mul=r.mul(n.alpha,O.tf255);let o;switch(t.segmentation.mode||"default"){case"default":n.input=r.squeeze(e),n.concat=r.concat([n.input,n.mul],-1),o=r.cast(n.concat,"int32");break;case"alpha":o=r.cast(n.mul,"int32");break;default:o=r.tensor(0)}return Object.keys(n).forEach(A=>r.dispose(n[A])),o}function _2(e,t,n){var x,y;if(!t||!((x=e==null?void 0:e.config)!=null&&x.validateModels))return null;let o=["const","placeholder","noop","pad","squeeze","add","sub","mul","div"],s=["biasadd","fusedbatchnormv3","matmul","switch","shape","merge","split","broadcastto"],A=[],a=[],i=t.modelUrl,c=t.executor;if((y=c==null?void 0:c.graph)!=null&&y.nodes)for(let l of Object.values(c.graph.nodes)){let f=l.op.toLowerCase();A.includes(f)||A.push(f)}else!c&&e.config.debug&&h("model not loaded",n);for(let l of A)!o.includes(l)&&!s.includes(l)&&!e.env.kernels.includes(l)&&!e.env.kernels.includes(l.replace("_",""))&&!e.env.kernels.includes(l.replace("native",""))&&!e.env.kernels.includes(l.replace("v2",""))&&a.push(l);return e.config.debug&&a.length>0&&h("model validation failed:",n,a),a.length>0?{name:n,missing:a,ops:A,url:i}:null}var r2=class{constructor(t){E(this,"instance");E(this,"models");this.models={},this.instance=t}stats(){let t=0,n=0,o=0;for(let A of Object.values(y0))t+=A.sizeFromManifest,n+=A.sizeLoadedWeights,o+=A.sizeDesired;let s=o>0?n/o:0;return{numLoadedModels:Object.values(y0).length,numDefinedModels:Object.keys(this.models).length,percentageLoaded:s,totalSizeFromManifest:t,totalSizeWeights:n,totalSizeLoading:o,modelStats:Object.values(y0)}}reset(){for(let t of Object.keys(this.models))this.models[t]=null}async load(){var n,o,s,A,a,i,c,x,y,l,f,d,u,m,g,P,v,p,b,j,k,I,B,q,W,Z,K;M.initial&&this.reset();let t={};t.blazeface=this.instance.config.face.enabled&&!this.models.blazeface?z1(this.instance.config):null,t.antispoof=this.instance.config.face.enabled&&((n=this.instance.config.face.antispoof)==null?void 0:n.enabled)&&!this.models.antispoof?e3(this.instance.config):null,t.liveness=this.instance.config.face.enabled&&((o=this.instance.config.face.liveness)==null?void 0:o.enabled)&&!this.models.liveness?r3(this.instance.config):null,t.faceres=this.instance.config.face.enabled&&((s=this.instance.config.face.description)==null?void 0:s.enabled)&&!this.models.faceres?K1(this.instance.config):null,t.emotion=this.instance.config.face.enabled&&((A=this.instance.config.face.emotion)==null?void 0:A.enabled)&&!this.models.emotion?X1(this.instance.config):null,t.iris=this.instance.config.face.enabled&&((a=this.instance.config.face.iris)==null?void 0:a.enabled)&&!((i=this.instance.config.face.attention)!=null&&i.enabled)&&!this.models.iris?O1(this.instance.config):null,t.facemesh=this.instance.config.face.enabled&&((c=this.instance.config.face.mesh)==null?void 0:c.enabled)&&!this.models.facemesh?B1(this.instance.config):null,t.gear=this.instance.config.face.enabled&&((x=this.instance.config.face.gear)==null?void 0:x.enabled)&&!this.models.gear?i3(this.instance.config):null,t.ssrnetage=this.instance.config.face.enabled&&((y=this.instance.config.face.ssrnet)==null?void 0:y.enabled)&&!this.models.ssrnetage?d3(this.instance.config):null,t.ssrnetgender=this.instance.config.face.enabled&&((l=this.instance.config.face.ssrnet)==null?void 0:l.enabled)&&!this.models.ssrnetgender?p3(this.instance.config):null,t.mobilefacenet=this.instance.config.face.enabled&&((f=this.instance.config.face.mobilefacenet)==null?void 0:f.enabled)&&!this.models.mobilefacenet?T3(this.instance.config):null,t.insightface=this.instance.config.face.enabled&&((d=this.instance.config.face.insightface)==null?void 0:d.enabled)&&!this.models.insightface?k3(this.instance.config):null,t.blazepose=this.instance.config.body.enabled&&!this.models.blazepose&&((u=this.instance.config.body.modelPath)==null?void 0:u.includes("blazepose"))?x1(this.instance.config):null,t.blazeposedetect=this.instance.config.body.enabled&&!this.models.blazeposedetect&&this.instance.config.body.detector&&this.instance.config.body.detector.modelPath?c1(this.instance.config):null,t.efficientpose=this.instance.config.body.enabled&&!this.models.efficientpose&&((m=this.instance.config.body.modelPath)==null?void 0:m.includes("efficientpose"))?u1(this.instance.config):null,t.movenet=this.instance.config.body.enabled&&!this.models.movenet&&((g=this.instance.config.body.modelPath)==null?void 0:g.includes("movenet"))?hn(this.instance.config):null,t.posenet=this.instance.config.body.enabled&&!this.models.posenet&&((P=this.instance.config.body.modelPath)==null?void 0:P.includes("posenet"))?zn(this.instance.config):null,t.handtrack=this.instance.config.hand.enabled&&!this.models.handtrack&&((p=(v=this.instance.config.hand.detector)==null?void 0:v.modelPath)==null?void 0:p.includes("handtrack"))?An(this.instance.config):null,t.handskeleton=this.instance.config.hand.enabled&&this.instance.config.hand.landmarks&&!this.models.handskeleton&&((j=(b=this.instance.config.hand.detector)==null?void 0:b.modelPath)==null?void 0:j.includes("handtrack"))?an(this.instance.config):null,(I=(k=this.instance.config.hand.detector)==null?void 0:k.modelPath)!=null&&I.includes("handdetect")&&([t.handpose,t.handskeleton]=this.models.handpose?[null,null]:await tn(this.instance.config)),t.centernet=this.instance.config.object.enabled&&!this.models.centernet&&((B=this.instance.config.object.modelPath)==null?void 0:B.includes("centernet"))?f1(this.instance.config):null,t.nanodet=this.instance.config.object.enabled&&!this.models.nanodet&&((q=this.instance.config.object.modelPath)==null?void 0:q.includes("nanodet"))?Tn(this.instance.config):null,t.selfie=this.instance.config.segmentation.enabled&&!this.models.selfie&&((W=this.instance.config.segmentation.modelPath)==null?void 0:W.includes("selfie"))?N5(this.instance.config):null,t.meet=this.instance.config.segmentation.enabled&&!this.models.meet&&((Z=this.instance.config.segmentation.modelPath)==null?void 0:Z.includes("meet"))?p5(this.instance.config):null,t.rvm=this.instance.config.segmentation.enabled&&!this.models.rvm&&((K=this.instance.config.segmentation.modelPath)==null?void 0:K.includes("rvm"))?j5(this.instance.config):null,await Promise.all([...Object.values(t)]);for(let R of Object.keys(t))this.models[R]=t[R]||this.models[R]||null}list(){let t=Object.keys(this.models).map(n=>{var o;return{name:n,loaded:this.models[n]!==null,size:0,url:this.models[n]?(o=this.models[n])==null?void 0:o.modelUrl:null}});for(let n of t){let o=Object.keys(y0).find(s=>s.startsWith(n.name));!o||(n.size=y0[o].sizeLoadedWeights,n.url=y0[o].url)}return t}loaded(){return this.list().filter(o=>o.loaded).map(o=>o.name)}validate(){let t=[];for(let n of Object.keys(this.models)){let o=this.models[n];if(!o)continue;let s=_2(this.instance,o,n);s&&t.push(s)}return t}};function Dn(e,t,n,o,s){var i,c,x,y,l,f;let A=0,a=[];for(let d of e){let u={id:A++,face:d,body:null,hands:{left:null,right:null},gestures:[],box:[0,0,0,0]};for(let b of t)d.box[0]>b.box[0]&&d.box[0]b.box[1]&&d.box[1]+d.box[3]u.body.box[0]&&b.box[0]+b.box[2]u.body.box[1]&&b.box[1]+b.box[3]u.body.box[0]&&b.box[1]+b.box[3]>u.body.box[1]&&b.box[1]+b.box[3]{b&&b.length===4&&(m.push(b[0],b[0]+b[2]),g.push(b[1],b[1]+b[3]))};P(u.face.box),P((y=u.body)==null?void 0:y.box),P((l=u.hands.left)==null?void 0:l.box),P((f=u.hands.right)==null?void 0:f.box);let v=Math.min(...m),p=Math.min(...g);u.box=[v,p,Math.max(...m)-v,Math.max(...g)-p],(s==null?void 0:s[1])&&(s==null?void 0:s[2])&&(u.boxRaw=[u.box[0]/s[2],u.box[1]/s[1],u.box[2]/s[2],u.box[3]/s[1]]),a.push(u)}return a}var $2=` +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`,et=` +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 +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAa2p1UYo5adbz+xbxMlvqJ1OqjDHLXree0ejmzNrWm953tPmTPWbWneZ7yoy5YhjrXXTjH8s75N +mtkyxt0VZM2/m175N1V03yTKubMLXVXybeYLLX2VXy7eam+b0bOg4VquJW+rry4/O9uyZOq3UjVm +9r25axMzPaIdvhns1kzbZddM0p5Y47z8/R2+HcF03Doi1a8+Xzvbv+TotJnjDXkt+K8ODHp8cY8N +IpSO0RCwF2YAAAAAAAAACvUZYw6fJkntWN3k8dfHz2vLucdz8mkjFE9bz1+UOZosX1UzPm0nqI/W +MYo9FlcPNklfFGeH/NshLGun+Cz6PtHZtVZWlRLS+jxPkRpIn7rdoupHTdA5s6SI+7H6Mfo+32Y2 ++To3neSIiZ7A0IjPXpXLePlMotGW3272t85datKzHZjbTVnsDj+FG/2Y/RlGP4R+jo20u7H6N1Ql +o+H8I/REY957R+jpfReiK6eOYHLtj2tttH6KrY/6Y/R2c+kjeJiFVtLG24hxpw7/AHY/RRkw9O37 +O99Hrt1YX0tfOBLjcGp4XF8c+u8fs9c4dcVcGemSI61nd3IneN1orQAAAAAAAAAAAAABFqxes1tE +TE9JiUgPKcX4RbRXnNgiZwWnrH4XPi28PdXpW9JraImsxtMS8pxXhF9DecuGJtgmf+1TWW2N/la1 +L7N7T5e3Vy6W3hsYcvLbqzbO9jvvCzvDR0+XeO7crO6FmGSvRThy/RtVXJ92elvk2rRvDUzU7pl4 +izsd2J3jeBpcNz+Lg5LT7+Pp+Xk3W7js5eAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs0NTrN96Yp6edkW8Wzm6+LNTq4pvTHO9vOfRoWtt +1mes95YWvs1s2fZldddOczLPLn2ju0MmebT3YZc2/mpm3qqllN1drsbZIhr3yzvtHf4AsvlYYseb +V5Yx4KTe0+UQ6nDvZ3UazbJqd8OKeu33peq0eh0+hxcmnxxWPOfOfm0mP+steT/ji8N9mKY9suum +L37+HHaPm9DSlaVitKxWsdohI0Y22gAgAAAAAAAAAABXnyRhw3yT92Nwef4xm8bVzET0rPJH5d12 +CvLhho3rN9RWs9Z23n5y6O21YhrVYbdGOCfrrLPJRpv863zVS6FS09SvZj3lVZZRdPSqmnSWdrIE +ebOkK4ldTsgW1WKqd1oMZhEVZyRAImOjGI6rJ7IiATNd46qL02bHkiaxaoNGY2n4ImPgtyV2n0Vo +Gvlx7x2beiyTk08RPevSVUxux00+Fn2n7N+n5rRFb4AAAAAAAAAAAAAAACLVres1tETWekxKQHlu +L8InR2nPp43wz3j8P/s5dLveWrFqzW0bxPeJeV4xwmdFec+CJnDM9Y/CrY1xv8qvTZ+WYdbDk5oh +5zHk283U0eo3jaZZ2N5XYjrCnLSJhOK+8d1kxvCqzSwZvousrb7k9LfJ3nB1OLeJdLhufx9LEWn3 +6e7LXN9Ofy5/W4AuxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAETaKxMzO0Qi9646Ta07RDmZ9VbPbaOlI7Qi3i+c3TPUaqcu9adKfy0722ZXvFa9 +XO1OrjrESxt66ZJmcjPUanlidmhkzTZVfLN5VWvsC2b7R3U3yqrZZtO1esz2h2+F+zWTUcuXXTNM +feKR3n5+iZLVbqRzNJo9TxHLyaekz62ntD1fDOA6fQbZL7Zc/wCKY6R8odLBgxabFGPDSKUjyiFj +SZkYa3aALKAAAAAAAAAAAAAADQ4pl2pTFH3p3n5Q33E12Tn1eSfKscsLZ+orS00eJqbW+Lfnu1tF +XaJnZsz3WpCfsyp00fWSvmPdVYOmSUDd8kR3InoQosy7JmUX7MdwZ17ro7KKT1XRPRAsrO0rYndr +79V1ZBaQiJ6JgCSIJASwrO07MpV2nqBlrv1a1o2bf2qtfLXaQUTO0sb05o3jv3ZXhjS20xEphW5h +yeJjjf7UdJWNKLziyRePsz0lux1SgAQAAAAAAAAAAAAAADG9K5KTS8Rato2mJZAPIcU4ZbQZuekT +OC3afT4NXFkmlntc2GmoxWx5K71tG0vHa/RX0GpmlutJ61t6wrY2xr8dXS5uesN+tt4ef0eaa223 +2dnHk3juyreM81OaFGiy/RtZET9jJ7s/2bdutd2jqKeic3iNTsd8a2h1H0jTVtP2o6W+bZbOO+gA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABje9cdJt +adohGTLXFTmvO0fy52bJfU23t0pHaqLeL5xdK9Rnvqb+cUjtCi94xxvK3JetKuHrdZvaa1ljb10y +cnIs1Wt3naJc++TmVWvMz1YWybfMGdsm3eWek0mo4jm8PT0mfW3lDf4V7P5tdMZdRviwfvZ6/TaX +DpMMYsFIpWPTzXmf+steT8jn8L4Dp+HxF77Zc/4pjpHydYGjC3oAAAAAAAAAAAAAAAAADG9opS1p +7RG7zszN6WtPe0zLua+3Joss/wBOzhzG2OsL5+IrY09dsSyYRijbHEMvOChb7KjF0yS2LQ169Mso +S24noyrPVXWejNVKbTuw3T3REdQWU6LYlVvsyiUDPfqupPRr79VuOQX1lZEqoZxIMksd0gT2VT0l +bPZVbuCaW8i8bwr32WxbcGnkjaZa9p2ndv5qbw5+aNugLItF6TEtvTX5sMb969HMpfazc0d9stqe +vVZDdAQAAAAAAAAAAAAAAAADV1+iprtPOO/2u9bektoB4TJTJpNRbHkja1Z6uto8viVht+0HDvpG +H6Tjj6zHHvbecONw7Ltfkmeqmo6Ma69DXbbZTkr1mGWO3RneOaGbZRoM30fVzSelMnT83aef1FZ7 +x3h1tBqfpGnjmn369LNc3sc3kzy9bQCzIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAa+q1dNNXr7157VhGp1Xh70x+9f9ocy283m1p5rz3mVbrjXHjt91lz +5c9+fJ1nyjyhdM8lZlOOIiqrUXikd+kMreunnI5XEdX4dZiZcG+XmtNl/F83PeeWWHDOGanieSKY +q+5H2rz2hMzWd1Iqx1yajJXHhrNrW6REeb1nCPZumn2z62Ivl7xTyr/6uhwzhGn4Zj2xxzZJ+1kn +vLoNJnjHW7TbbsAszAAAAAAAAAAAAAAAAAAAAaPFrbaSK/itEOXt0rDf4xb/ACa/GZacRvaF58Q2 +IjasQnzPIhCU92tMbZGzHmotG10C6nZkwpPRmipIllEbMIZIE7solgmJBnCyk9VMM6z1BtVllEqK +z0WRILYlluriWcSDJVbusV27gwInaSWM9ECyZ3hqamnSWxFmOSOaqRx725bNnSZNs9J+OynVY+WZ +YYr7TE+nVaIr0Ais81Yn1hKAAAAAAAAAAAAAAAAAABExvG09peU4nov9n66L0j6q/WPg9Y1OJaON +ZpL0+9HWs/EWzeVz9PbmrEtnyc3h9reHy26TWdnSr2YX6657ijLXpLX0+onSamL/AHJ6W+Tbv2aW +ekTv16JzeI1Ox6KJiYiY7Slz+E6jxdN4dp3vj6fl5Og2clnKACAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZ2jeQRMxEbzO0Q08uqtkma4ulfO3r8lefUePMxWf +cjy9WvlzVxV6T1Z61/x0Y8f7Wc7Ur1lqVy+LqOWJ2hp6rXddon5rOF1tfmz5OkT0qzb8dWbxjp1c +biuuilJ5Z6r+IcQrixzEy8zl1E6rNt1tMztFY81sztU1eRucN4ffi2p5esRM72n0h7rS6XFo8FcO +CkVpX082nwXh3+z9FWLxHi36328vg6TZyW9ABAAAAAAAAAAAAAAAAAAAAAADj8Unm1tK/hqppHvw +y1k8/EMk+m0GOPeafiFpCZYwolnXspvHvLa9mF46gmnZmwozRUiUCBKYYsoBLOFbKAX0llEqqyzi +QXRLOJVRLOOwLIljZMEgrlhKyYYTAK5nZPN0RZjugUanHzVlz6xtLq361c+9eXItPpXX0dubTU+E +bL2lw2++O1fSW6m/VYAISAAAAAAAAAAAAAAAAAp1GbwcfTreelYEydcuMcRrM/L9nnlsV6wqpi2r +tv133mfWVkRyRtEdGFva7MzkYZNoamWN4bV4mYa9qztKIujhVppxGI8r1mJegeZpknBqKZY+7L0t +LRekWrO8TG8Ns/HJ5ZypAWZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAADS12fp4VJ6z9qVuq1HgUiI+3bpDl589cOKZmevqprXPTbx477rDJlrhr1nq4+s182tMRP +RqaziXiZJrWekNG17ZbxWJ336M5LXRbI3dLTJrs07RMY6fan1dHLrowY+X7MVjt6N3R6Kul0EbWm +s7bz8Z+LnabQX43r7Y53php/mXj+Dnv0f1JO1x/8ZxbUzj02O15mfLtD13AvZqnDds+pmMmo26el +XX0Wh0/D8EYtNjilY7+s/NstpOOTW7QBKgAAAAAAAAAAAAAAAAAAAAAADG88tLW9I3BwJtz6nNf1 +vK/DHVqYJ3pzT5y3MPZeojOWMQylEKpTVjZnDCwkqzYQyRRICATCITAJZQxhMAshnEq4ZQC2srKq +qrIBZCWNZZgwswmFloVyCu0dFcx1WyrtCBhv5NTPHXds2U5o3hIz4ffbPt+KHUcTSW5c9Jme0u2v +VYAKpAAAAAAAAAAAAAAAAYZctcVOa35R6tLrltN795/YvknNqrfhpPLH92V5isd9mWq6fHjk6rn0 +ZxG8KK5Jm/wbVZiYZtqrmkqL023bkxvCiY3lJHNyRG81mHS4Rn5sNsNp64+3yaWaNrzOzHBl+i6q +mT7s9J+S+ay8mex6EIneN47SNXKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAImYiJme0JafEs3h6fkidrZOn5eaLeJk7eOdm1Hi2vmtPTry/CHmOJcUvmvOPF1n09Pm +6HF9ZGm01qxO3R5vSY7XwzmzTy47zzTEd7en5Mfvt2/PURWdo3tvPrPlKymbktFqTtMTvHzbOLDG +f63JXbFX7FdnoODcDprZpq9TjiMMTvSn4vj8l5fxnrk91saPSa7i2hpOfbTVt5x1m0fLydzR6PDo +dPGHBXasd585n1lsRERG0dIF5OOe6tAEqgAAAAAAAAAAAAAAAAAAAAAAADX11+TRZrf0y2Gjxe22 +gtH4piP3TPpXKwxtjhuYo9xq442iIblI2pC1RET2ILd9kxCqRjZmwlCSEohIJAQAAJZISDKGUd2M +MoBnVbVVCyAWVWeSuqyOwIlXZZKue4MJV2WWYT2QKbKL9YlfdRdIo35b7/Hd3KTzUrPrDh27uxpb +c2mpPwX/ABX9XAKpAAAAAAAAAAAAAACekTIp1eTwtJmv+GkyJn1oafeazbfpMzLR4jq/o8b823zX +6XNF8ERCvTcNpxLV5LauvPhx9Irv3lhztdtv8TtaWLicXrt03jzjzb2k1nid56ty3s/w+a7Uwzjn +1raejlarhmbhl/FpbxMO/fzj5p/ixSeXOvTtRfeI280ZI26tfDm3pWe63LaZx7qtGvniJ6tPLvOK +fOa9WzbJvTbza02jl3n5SSljscK1MajSxWZ96nSW88xw/VfQ9XMT9nfa3yemid43jtLeXsce88qQ +EqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADia3UTm1l4j7OP3Y/u +7Vp2rM+kPJW1PhYcmS0+9MzKm/jbwz31weMzbV8UppazPL9q0/BF4rk1GLDSNqxPWPhCnHmnNrtT +qPKteWPm6U6OdHaZvO+SaRNvhv12Ub/q3FhtrNVj0uKOt56z6R5y9zix1w4qY6RtWsREOJ7L6OKa +S2rvX6zNM7T6Vh3mmZyOfya7eACzIAAAAAAAAAAAAAAAAAAAAAAAAAAczjVvqMVfW/8AZ03I41bf +Lp6/OVs/UVrY47NyOzUxd4bUJpEbb3Z7IiOrKIVSjZhMLJYyhKIgmGUQSDESIEbJEgQmCITEAmGU +IiGUAyhZVhDOoM4Wx2VQtqBKuyyWEgqlhKyyuyBVaGtkbNmvk7A15l1eH2300R6TMORPSXT4ZO+O +8fFefEX63gEAAAAAAAAAAAAAAAq1WPxdLlp+Kkx+y1Fvsz8gjhaDauGK8sx07y3OE3m1tT6RaP4c +vU6yMNKUx73zT0ilY3l2eF6a+m0kRl/zbzz3+Ez5M8z26fJruW6wzYq5sV8d43raNpZjRzPPaTmx +5b6bJ9rHO3zb2WJ8GWPEscY9bgzxH2t62n19GWW0eHOzHU5XbjXZ1x8WTnz2iZ7S2M1IjH2+LX0V +KTqs8zO9ot0j8nUthi1J3UaOFMTfLFo6xMbS9BwHWTqdHOO8+/hnln5eTjYMFo1WTH5VnePzXcIm +2k4zlpPSmXy/hfF5eMfJns69OA2cgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAADG/2LfJ874rW845mubliY7bPoto5qzHrDz0+yePNF41OotaJ7RWNtpV1OtfHqZ715fhu +j8adNpcVfeyzE2/vLuanhOu1nEctIxTTFa/+ZPbZ3eHcF0vDbTfFE2yzG03t32+DokynXl9+leDB +TTYKYccbUpWIhYCzEAAAAAAAAAAAAAAAAAAAAAAAAAAAAcXjE/4zDH9M/wAu04XF5/3jj/0f3Wz9 +RUYmzDWxS2I7FSyjuzY1ZKpRKEygEwiWUIkGIk2QJNhKQhMIhkCYZQxhlAMoZwwZwgWQshVCyATL +CWc9ldpBhZXLOVdpQK7NfJPRdaWvknoDVvPvOnwuel4+TlXn3nS4VPvXj4QtEV0wAAAAAAAAAAAA +AAAAAVV02CmTxK4qRf8AFFeq0AAAanEsfPpZmO9Ji0NDLfkwdOsulrumiyzHlVzJrz4Ovoy26vB8 +cTBa9NffLtMY77Rv8Yegx5ImkKdJoY1HC81Y+3OSbVn0mGGkmbY45u6tnrrTOu2xGO0RxCd+nNVj +qKxTV1vH2pjaGtnyzXXYdo96ZmGXEMk15b7/AGZiVerWPTYckZcNbx5wzc7hGbnxXxzPWk7x8pdF +0S9jh1OXgAlUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAcPjEf4/FP9H93ccXjMf4vDP9Mx+62fqKrx+S+GvibEFSsqyYwlVK +ZYsmIMoRKYJQIPIEiQ2ATCUQygCGUIhMAyhnDCGUIFkLIV1ZxIMpVWWSrsCuyqyyyq09ECq8tfJK +66jJ2Bp5J6upwn7dv9Lk5J951uE/av8AJaIrqAAAAAAAAAAAAAAAAAAAAAAq1Mc2myxPnWf4cmtu +XT9fR0tffk0WSe28bfq5Wbamm3326MtunwfK6PCv/AxPraZ/dz9PO97/AOqf5dHhdZrw7Dv3mOb9 +XOxRFM+avpe38mvkPHf/AFWlrKba7Tzt99ZxKkfR7euyNXMTrtPHfa0z+zPiM/UR8Zj+Wbdu8HpN +M2bfzrV13M4dO2pyR61dNvj44/J/oAWZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADj8bj63BPzdhyeNx0wz8ZWz9RWri7Nmv +VrYu0NmqaRZHZlDGGSiwxZSgCEkCBCQSCQBMJRCYgEsoYx3Z17AlMIhlCBnDOGEM4AlhZZKq4KrK +7LLKrIFN2vdfZReAaObu6/CO9vk5OePR1uEd7fJeIrqAIAAAAAAAAAAAAAAAAAAAAGtxCk5NFliI +3mI32+XVyNTyZOHTee946PQKPoeDffw4777eW/yVs60xv+ZxOnr4Okx1t05KRv8Ao41Z5q3yed5m +XY1szXRZ5jvFJ/hxItP0aOSN9q7yrtr4f2tHFM5+KT16Yq/vK/iGSbXw4vO14UcPx5MGfNbPG18m +1oj4THRsTw7VanPXVYpi3gzMcnrvCnG11JOupwuN8+a3pEQ6jT4divjxWnJExa09pbjbM5HHu90A +JUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAHM41H1GOf6nTc/jEf4Ws+lls/UX45uGekNujTwdm5RNIthKIZKLDFlsiQIShIC +EgCUJ7AmGTGO7IDzZQhMSDJMMYZQgZwzhhDOATuqssmVdgVWVWWyqtCBTeVF19lF+wNLNG7q8I+9 +8nLyupwnt+S8RXUAQAAAAAAAAAAAAAAAAAAAAAAItWL1mto3iY2lyrcLyUxzix2ia2nvPeK+jrCL +OrTVnxpanhuPPemSs8l6RtE7dJj0ldpNP9GwRSZ3neZmV4cR/Vs4AJQAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHi1d9H +M+kt5ra+vPoskfDdOfqK4mn7Q3aNHBPZu0W0RdDOGFWcKLCJZeTGQQlCQSgASBsCYZQxhlAJTAmA +TsmAgGcM4YQyjsgRLC3VnaVcgwsrt3Z2V2QK7tbJ1bN5a9waeWO7p8Knt8nNyebpcK8vkvlFdQBA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK9RXmwZI+ErEWjesx6wQeZwejeo0cccuW8 +elpblJaaRGxVnCuss4ZrMvJEgCAASISCQIBlCYYpieoM0wx8k7gzIRueYM4Z79FcSy3QEsLJmWFp +BjaVVpZWlXMoGNmvkXXlr3kGtknu6XCf7OXkl1OEdl8orqgIAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAHmskcmtzV/rls0U62OXiWX4zErcc9GmkRfWVkSqqziWayxCPIANwBIhIJSxS +CRG6dwZwlhEs4BluMdzfqgZxLLdXuy3AmVdpZTKuZBjaVVpWWV2QlhZRdfZRcGpl7urwfrzfJy8r +rcH61vPyWitdMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHA4nHLxKZ9awnH2ZcY +jbW459aq8fZpfiI2IZwrqzhmsz3Ebm4JN0AMhCQSIASndiAziWUSriWcAyRujc80DM3RCfIETLCW +UsZEsJYSslXZAwlTddPZTkBp5e7r8Gj6rJPxhx8k9Xa4PG2C8/FaK10QAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAcfjcbZMFvnDWx9m5x2PqcNvS+zSxT7sNPxH62YZQwqzhRZO6UCB +KUAJTux3SDIRuAncQAmJZRLBMSgZ7iIAZRKd2DICUSlAljLCYWMLIFVukNfI2bNbIDTyT7zu8Ijb +Sz/qcG/2nf4T/wCE/wD2WnxWt4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHL9oL ++Hw2cm28VvEuPptfgyVj6yIn0no7/FtJfW8NzYMe3PaPd39d3iMug1WktNc2C9dvPbeP1aZ9xF+v +T471tHu2iflK2HkqWmvaZj5Surqc9Ps5bx+alTHqYHm68S1Vf/NmfnC2vGNTXvyT84Ql6A3cSvHM +sfaxVn5Ssrxyv3sM/lKB1xza8bwT3pePyWV4tpZ+/MfOEjfGrXiGlt2zV/PotrqcN/s5aT/+wLRj +FontMSlAlKEgndO6IAZQljDIEgeQljLCzOVdkCu/SGrkbF56NPNeKxMzMRHxENe0+89DwuNtHHzl +5PJr8NcnLW3Pbf7r1nCZm2gpae8zMrz4i/W6AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAETETG0xukB4HVaeMHEtRi26RedvkyjBSfX9W77QYvC4xz7dMlYlrU7M929dWJLFc6aPK0q +7YLxPS0S22FlP6q38Zac0yR92s/KVc3tHfFf8tpbcsLRvB/dR/8ALLVnU0r9uL1+dZI1mnmdvGpv +6TOy6ym+Oto2tWJ+cJ/tW+KLK5KW+zes/KU7tG+h01p64qx8Y6NXNo6Y+uPJlp8rLf0rfG7MXtHa +0x8pZxqs9e2a8f8A7Oj7HaTHn0+f6RWM23LETfr6vRW4PoL99NT8ui7F4+vEdXXtnt+fVbXjGsr/ +AOZE/OsPS29nuH27YrV+VpeV9pdPXhOtw49NG9Mld55+vXcTPd42I47qo7xSfyWV9oM8d8VJ/VxM +d8l46xWF9cV7en6o/qLfxp2I9ob+eCv/AHMo9op89P8A/wBORGmyT5R+qfo2X8P7n9Q/jTsx7RR5 +6ef+4/8AuHftg/8A6cWcOSO9J/WEbWr3pY7Efzp2Lcfv5YK/9zWy8d1E/ZpSv5Oba1/+Hb9lc+LP +bFt87I7E/wAabWbiurvEx4nL/pjZzc2bJkn372t85ZXx55/BX85lucC0vPxnTxlnnjm32mOiZqUu +LJ2p4TwnVavNWaYbRTfre0bQ99pcH0bT0xb78vmtiIiNojaErMwAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAHnfarF7umzRHaZrLjYrdIen9ocPi8JyTt1xzF4eUw23rCm3R4r6bMy +wt6kdTaWLdjswmNoZontsCm0K5XWjopnuDC0dGpqG5bs08/daKV672MjbSaif6oh6Z5f2LtvptRX +0tEvUN3Jfo8f7cYve0eX4zV7B5z20xc/C8eSPuZIRficfXlcPaG7ino08HWIbePpLF2NuiyOyrHK +3fZFSwuovHVfaVF4QK5YWTM9UT0EKry6Ps1Tn4zjn8NZn9nOtLseydObiWW34cf918fWfk+PYANn +KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq1WKM+ly4p+/WYeBxTNd6zG0xO0 +vobw3FcP0bi2em20Tbmj5Srr418V9sa2Z7qKyzi07MXUylhaU7yjqhLCeiq3ddaFNxFYW7NLNG8t +zya+WO6Va9J7FW66mvwidnrXiPY3Ny8RyUn71Jj9Ht3RPjk19HK9pMHj8D1ER3rHN+jqqtTjjNps +uOe16zAifXzfTz7kNyndpYazS9qT0mszDdoxrsi6m8LazMq6zDOsq1ZEyrt1WWlXaUCqyq0rbKbi +Fdp6PReyFd8uqv8ACsfy83aXrPZHHto89/xX2/SP/dpj6y8vx6EBq5gAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAB5n2q03LfDqqx39y39npmlxbS/TOG5se29tuavzgWzeV4mtui2 +O3RRSY2hdVhqO2MvI36iu9lUsrSrvDHn6spnmSiq5jooyV6tq1VV69RC32byTh43h8otMx+r6I+Z +aK/g8TwX7bXh9Mid4iW+fjl8n1ICWb57xLBOm4zqse20Tbmj8+qKdnS9q8PhcTw5tumSm0/OHMxz +0Za+uzx3sX1t0Zxurr1ZxvspWiZYWZbsbT0QK7KLrZVZJFaqt5vbezNOTg9J/FaZeJns93wCvLwb +T/GJn92uGHldIBowAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADuAPA67F9H4l +qMW20VvO3yRWW97T4fC4rXJHSMtI/WGhVlue3b473K2KzMML4+62tujG9pnozXaOSOVFMnVbmq1t +trJRW5E7wwvUxTvCyY6CHOt7moxz6Wh9PxTzYaT61h8x1MbZK/OH0zTf+Fxf6I/htj45vL9WgLMn +mvbPFvocGWO9L7fq85p5maw9d7VYvE4JkmPu2if3eW0+PasdFNOnxfF1Y2hlykRsmY+LJ0MZjZXa +eq2eyi8oQTO0KLdZWzPRjWu6VaqtHR73g0bcI0sf0Q8Nkq93wqNuFaWP+XDTDDytwBowAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAef9q8HNpcGaI60vtPyl56k9Iew49j8ThGe +PwxFv0l4zH2U26fDfTYiyJljvsjf4sm6vJ1hrXjq2MkqLdZEVbgbMx0auGdmzNt6iHN1Ub5af6of +TdPG2nxx6Vj+HzaaTm1+nx/iyVj930ysbViPRrj45vL9SAuyc7j1efguqj+jd4/T33rD3HEcPj8O +1GP8WOY/Z4TTT7sKadHhbcsZnaCJ3TPZk6VdrKbTutmP0U2nqgrGOsr8deiuI2X09EqKM1dt3uuG +f/jdN/06/wAPE546S9rwud+Gaaf+XH8NMMPK2wGjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAABrcRp4nDtRWPPHP8PCYusPoWSvNjtX1iYfPuWaXtX8MzCuvjfw32siu8ptXoxi +0wy5t4YulReqmazu2skbquURWFInddM7VYRGyL291KFnCcfj8e0le/Lbmn8n0N4b2Ur4nHLWmPsY +5e5a5+OXyXugBZmiY3iY9Xz7NjnTa3Ph/BeYj5PoTxftFg8Hjk2iOmWkW/Psrr418V5WrWd2faFc +V2jdnEMXWxntupmN7NiYU27iWML6dVMVnddjgVqMsdHr+CW5uE6f4Rt+7yuSsTDv+zWXn0WTHP3L +/tK+GHl+O0A1c4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8Dn93W56/wDM +t/L3z59qp24jn+OS38lnpr4r7ZxHQ2TEstt3PXUrt27K57rr1VT0BjKnJPRbMqMs7QlV2fYvHvrd +VknyrEfu9m8f7FZI8fVU85iJewbT45NfQBKo817W4eulzxHaZrL0rje09ItwqbfhtBVs3leai8RD +KLw1sduesL606dWFdsZT1jdhNeq6K9DlhCVUU6s4jZnt1YzAhnM71dH2bycmszY/K1d/0c6OzY4R +fwuK4p8rTstn6z8k7HrwGzkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHz3 +Vxvr80/8y38voTwGpj/F5/8AqT/JfjTx/WVeyY6FPspc9dZPVXaOq2WEwIUTVRmjo2rNfLHRI3vZ +DJycXtX8dZh7t879nsnhcbwz23tt+r6I2nxyb+gCVBzuPY/E4PqI9K7ui19fTxNBnp60n+Aj5/pJ +3jZu1aOnnltMNussdfXbm+l3ZM9URHREdZVXTuT1Nk7boQiOkJw28PU47/htEp5eivJPLMTCZ9Vv +x7mJ3iJ9UqNHk8XR4b+tIXuhxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD +weqjbWZ4/wCZP8vePCaz/wDIaiP+Zb+UX408f0r9lOxWOifJhXWjfyYWllPRXYQxnrCrJHRd3YZI +6A1NJecHEsN/S0T+76bE7xE+r5dk93LW3pL6ZpMni6PDf8VIn9m2fjm8s9rgFmQxvHNS0esbMiew +PnHLyai9fS0w2aNfUTtrs3+uf5bGPqy068fF227KtSsdFlKqNGMV6myyY6sbdIQI8tlOWOi6Jhhk +j3RD0vA8nicMx9etZmHRcT2Zyb6XNT8N9/2dt0T449T2AJVAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAHhdfG3E9TH9cvdPEcXjk4zqI/q3L8aeP6xr2TsxpLOekMK6mFo6qpXSrm +OqBixvHSVmzC4OfqK7S9/wAByeLwbTW9K7fo8Fqo6Paeyl+fglI/Da0NcMPK7QC7AAB8313TiOf/ +AKk/y2MHWrX4jG3E9R/1Lfyv0/aFNOrHxuU7LI7MMayGTVlHWUXhNe6Z6wIUsb9d1m20q7dkDpez +N9tRqKT5xEvRvKez9+Xis1/FSYerb5+OTyf6AFlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAB43j9eXjN/jWJ/Z7J5L2mry8Upb8VIF8f6aGOey2eynHvOy7bowrrYSxZSwQJ2YXZ +92N4BoanrEvVexmTm4blr+HJ/aHltRHSXofYm/1Wrp5RaJaYY+X49WA0c4AD51xONuKan/qW/lbp ++0MOLRtxbU/9SU4J7KadWPjep2WQrr2WRPRk1TvsndXMpiRCb9FNu0rbTuqvKBscCjfi9PhWZeue +V9n434rafTHL1TfPxy+T/QAszAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHmv +avHtfTZfnV6VxPajHzcNrf8ABeJFs/XnMcr4no18c+6vr2YadkY2YM57sEDLyY37Mo7MMnYGlqO0 +vQ+xNfqNVb1tEfs87qZ2rL0/sVX/AHdnt65P7Q0wx8vx6UBo5wAHz/jUbcX1PT78qtO2vaCnJxjP +8Zif2amnnspp04+OjWejKJ6MKdmcMmyJn4m5ZHzEVPMwtJv0VZLbQDqezcb8RzT6Y/7vUPM+ytZt +n1OTyiIh6Ztn45N/6AFlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABocbxeLw +nUR5xXm/Rvq8+OMuDJjntaswEeBxT0bNZ6NatZpNqz3rO0rqsdO3PxlaWEMpY+aqWXkryT0ZT2V3 +7A0dVPuy9f7G124NM/iyT/Z4zWT7sw957MYfB4Fp4/FE2/WWmGHldcBowAAeM9qKcvFeb8VIly9P +0nq7ntbTbVYL+tJj93CwT76unR4/jo0nozhhTsy3Y1sWljM9Ce7HyQIm3RRlttVbaWrnt0Sh6n2U +x8vD8mSfv3/h3XN4Bi8Lg2nj8Uc36y6TeOPXugCUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAPD8RxeBxXUU26Tbmj8+quro+02Lw+I4ssdslNvzhzazvDPbq8d7GW7Dfqz2VzG +0s2qd+iu/Zn5Ksk9BVztX1mI8930zh2LwOHabH+HHWP2fNYp4+vwYvxXiP3fUqxtWIjyjZtj45/L +faQFmQADzftfj3w6fJ6WmHmsP23rvaqnNwqLfhvEvIYZ+sV038bo0noy36MK9oZQxrdMyrlnMbMZ +QKrS1M07zEestq/RRjr4utwY/wAV4j91p9V18fQdJj8LR4ccfdpEfsuREbREJbuMAAAAAAAAAAAA +BAJAAAAEAJEAJQAJQAJEAJQAJQAJEACUJAQlAJEAJQAJQJAAAEAJEAJBAAAJAABAJEJAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwvanDzaPFmjvjv8A +tLztJ3h7HjGHx+FainnFeaPnHV4vFbeIU038VbHeGF+kso7Mb9mTdhKnLK3dRm7SIrHhGPxeP6Sv +9cT/AHfSnz72Zx+J7Q45/BWZ/Z9BbZ+OXyfQBZQABzeP4/E4NqI9Ii36S8Ng/wAx9C4jTxOH6ivr +jn+Hz3B/mQi/GvjdCnWNlsdI2V07LIlg6USrt2ZzZXMoFV+zPhGLxeOaavpbm/RVltEN72Yx+Jxm +b7dKUmf7L5+s9/HtRA2cqRACRACRACRACUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQCQQCRACRACRCQBCQBCQB +ACRACRACRACRACL1i9LVntMbPATTwdRkxT3pea/u+gPE8Xx+DxrPHlaYt+qNfGvjvtXXsi0dOrKk +dEXjZg6VMtbP2bMtXUdpEV0/Y2nNxbNf8OP+727xvsXH+N1U/wBEfy9k3nxyb+gCVQAGOWvNivX1 +rMPnGGOXNNfOJ2fSZ6w+dZKeHxDPX8N7R+6L8a+L63KdoZ7q6zvEMpnowdKJ6ywmWUyqvIKM0vQ+ +x+D6rU55+9aKx+TzWa36vbezmDwODYenW+95/Nphj5L6dQBo5wAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAEiAAAEoA +AAAAAAAAAAAAAEAkEAkRuAkQbgkQAkQAkQAkQAl5T2nx8nEMOT8dNv0l6pwfarHvpcGWPu32/WCr +YvK4mOem6b9mGKd4Z3idmFdka0y1c892zfpMtLPaNpEV6D2Kj/Eauf6YeweQ9ieuTVz8K/3evbT4 +5NfQBKoAA8FxCvJxrUx/XMvevD8Zry8fz/Haf2RfjTx/6RSOnRMyypHu9kXjowrqVSrvPRnZVl6V +kK0775MsUjvadn0nT4ow6bFijtSsVfPuFYvpPGtNTy54mfy6vorXDm8l9pEC7JIgBIgBIgBIgBIg +BIgBIhIAgBIhIAgBIgBIIBIAAhIAhIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAA +AAAAAAAAABAJQkAEAAAAAAAAAAjc3BIjdG4Mkbo5kcwMjdhzHMDPc3V8xzAs3N1fMjmBZubq+Y5g +Wbm6vmOYFm5ur5jmBZubq+Y5gWbm6vmOYFm5ur5jmBZubq+Y5gWbm6vmTzAz3N2HMnmBlu5ftFTx +OEZJ/DMW/d0t2rxKni8N1FPWkiZ9eS08e7Cy8dGGn6UhZaJljXZGnmc3UT3dPP2cnUT78xCIV6j2 +H/8A9c/6f7vXPI+w8bU1U+vL/d63du5NfUiDcVSIAS8b7RV5eOb/AIqRL2TyXtNX/e2KfXH/AHlF ++NPH/pr4+2xcxx0hFpY11K7R16KM32ZWz3UaidqSgrc9kcPicWyZJjfw6T+727y3sXh2xarN+K0V +h6lvPjj3e0ASqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJQAAAAAkQAkQAkAAAAAAAAAAAAAAA +EgAAAAAAAAAAAAAAAAAAAAAgAAABKDcAN0bgkY8xzAyRux5kcwM9zdXNkTcFm6OZXzMeYFvMibKu +ZHMC2bo51U2RuC2bom6rc3BZzom6sBZzI52ADPnOdggFnMc6skFnMc6rc3BbznOp3RzAv50c6nml +HMC/nOf4qOY5wX85zqOc5wbHOc7X5znBsc6edr85zg2ec52vzpi4NjmY5bROG+/bllVzsNTk5dLl +n0pP8BHmMHWNmzt0aum8obm08vVjfrtnxztR0mXHzTvaZdjVRMTLkZo6yiFen9iZ2pqY/wBP93rN +3kPY+/LfPX1rE/u9XzN3HfqzdO6vmTuIZ7m7Hc3Bnu8t7TR/vHBP9E/y9Pu837SV31umn+if5Rfi +/j/01MMb1hjkrtKzBG0bMsmOZY11tOYamr6Und0LUc7XT7u3rJPqL8er9lcPhcFpbzyWm39v7O00 ++FYvA4Zpsc94xxu227jv1IAgAAAAAAAAABKAAAASgASgBIgBIgBIgBIhIAAAAAAAAAAAAAAAAAAC +UACUJAAAAAAAAAAAABIAAAAAAAAAAAAAAAAAAAAg3AEbomQZbo3YzLGbAz3RNlc3YzcFs2YzdVN2 +M2Bdzom6nmNwW86JurTAMuY3REJ2BB1ZRVMVBhsbSsiqeUFXLucq3lTygp5TlXcpygp5TlXcpygp +5TlXcqOUFXKjlXcrGYBXysdlswiYBVMdUTCyY6sZBWxlnMMZgGLGZZSwkDdHMiWO4MuY5mEyjcFn +N1OdVzHMC3nTzqeY5gX85zqOZPMC+Lqdbk20eb/RKOZr8QybaK/XvtH7iZ9aGlp2luzT3fg19NHS +OjbmPcYX67XH1XSZ9XIzRvMuzrK7zLkZYmYnciunb9lZ5dTk+OP+71cXeP8AZnJ/ip2nf3J/l6iL +/Fu5L9bMWZczXi6YuIbEWTzKIuyiwLt3nuO25uI4a/hx7/rLuczg8TicvFLbfdpEK6+NPH/phhjo +stLGkctUWnoxrrU3j1cnWTzZq1jzl1clo5Zcu8c+txR63iP3Tn6pv4+g4o5cVI9IiGe7CJ2iE7t3 +GyN2O6dwSINwSISAlAAlACRAAlAAlACRACRCQAAAAAAAAAASgASISAAAAAAAAAAAAACQAAAAAAAA +AAAAAASAAAAAAAAAAAAAAAAIAAAQCAJljuljsCJlhMs9mOwMJYys5TkBVsjZdyHICrZPKt5E8oK4 +qmKrOVOwMIqyirPY2Bjyp2ZbAI2NmSARsbMgEbI2ZAMdjZICNkbMkSCNmOzJEgx2YyzljMAwlhKy +WEwCuWErJhhMArlhLOWEgxljMpljIImWMyTKJA3N0IBO5vux3NwZbnMx3NwZczT4jf3MdPW27a3a +fJOq1XNP2KdIRfi+J2trSYfcjeF+Wm1OicVeWIiN9kai8xjY12ORqultnI1Ecsujq79XP1FovWYI +rTgeq+j8QrWZ+3Mx+r2UXeC0WG2Ti2kiN5mL807eUREvbzbaejefHJv62Iv8WUXa0WTFhVtRdlF2 +rz9WUXBtc7jR9dqc2T1ttHyhvZMvJitb0jdq6XHNcNenWVN3028U99WRj6Kb02be3Tq18/SN2Lpc +3UdN9nOmZrqKX/DaJ/d0svvTLRzV3jomK6+Pd1vvWJj0ZczT0mXxNJht60hfFnQ4qu3N1cWTEgs3 +Tur5k7gz3N2O5uDM3Y7m4MtxBuCQASIASIASAAAAAAACRCQAAAAAAAAEoSAAAAAAAAAAAlAAlCQA +AAAAAAAAAAASAAAAAAAAAAAAIASgAAAEJAQJQCNkbMgGOyOVnsAw5TlZ7GwMOVPKy2NgY7GzIBGx +skA2AAAAAAAAAAQkBAEghEskAxYzDPZGwK5hjMLJhjMAqmGEwumrCagomFcw2JqqtUFEsLLrV82F +o7gqljKyYYTGwMZRKUSCAQAboJnaN5Bjkneu0d5W4ccViIiOzHFWbTzNumP1Zarr8eeRMbxDW1Mx +NO67NbkhzNVnmInqzaOZrL93JyZeV0M1++7S02jvxDWxhxx033tPpC8Z6rrezWjmZyazJG2/u03h +2vFibTHoqvamiwVwY+nLGzV0+SZ1Mx8G0/45tOhzJ5lXMc3UVXRdlF1HP+iYsDPLPPy49/tz1+Te +pSIr0ho6ak5Ms5J8o2q6NImOrHV7XX488ypzTtHXo0s9t6zG7c1G1qz6ubeZiZ3UatXJG3yauSO7 +cvMTEx5tPLb3prPRMVr0HB8vicNxf0+7+kt+LOJwTJyY/Bnz3tH93X36N58cWvq6LSyiyndMSlC7 +mZcymLJiwLosmJVRLKLAtiU7q4lMSCzc3YxJuDMRuAlKAEgAAAlAkAAAAAABKAEgAAAAAJAAAAAA +AAAAAAAEgAAAAAAAAAAAAAkAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAhIAAACAAAASgAAAAAAEAAAA +hGzJAImGMwzQDDZjNVuyNgUTVhNGxysZqDVmiu1G5NN2M4waM0+DCaN2cbGcQNGaMZq3JxMJxA1J +qx2bU4kU09slorWNwa20z02RXHbJbl26QvtFovbHWkxEdJt5y2MOHlr2U1W3jx+1hiw8vSO63lmI +XRTaEWmtY6snRHO1VpmJ+DjavpSZl2s8b7y4HFcnh0n0gha5ebJN55KRM2mdoiPN6fh+kpwXh0Wy +RHj5Otp/s5Ps1p62y31+em9aTMYt/OfVfxTiPjZ52naI7fBrI5t66xz5+a1rW7yx0eSL6iZjtEOX +qNbSletom3lENjh2fbHzbbWt3iVozruc+5ztWubf4M4ybpQ2Oboyrva0Vjza8WdDR4OkXt3n9ldX +kaePP9VtYqctYhdvt5oivTeCZ2YOxXk6ubqMfV0b9mrljfqlFcq88k7z2U5axeItDa1OPessuC8P +ya7XRWYnwqdbT/ZMilvIu4dpslNdixXja8Y5tt85djZdbDWnGOesRtXFtuw6T27No5Kx2OrKYQlC +ExKJgBnEpiyvdlEgsizKLKollFgWxLKJVRLKJBbEp3VxLKJBnuMWQJEbpBIAAAJAAAABIAAAAAAA +lAJAAAAAAAAAAAAAASAAAAAAAAAAAAAJAAAABAJABAlAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAA +AAABAJQAAAAgAABAAI2EoBGyJhkgGPKxmqxAKpownHC+YRMdN5BrTj67R3bOn01o7p01Iv71u89o +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 +2Q==`;async function aA(e){let t=(s,A="application/octet-stream")=>fetch(`data:${A};base64,${s}`).then(a=>a.blob()),n,o;switch(e.config.warmup){case"face":n=await t($2);break;case"body":case"full":n=await t(et);break;default:n=null}if(n){let s=await createImageBitmap(n);o=await e.detect(s,e.config),s.close()}return o}async function iA(e){return new Promise(t=>{let n;switch(e.config.warmup){case"face":n="data:image/jpeg;base64,"+$2;break;case"full":case"body":n="data:image/jpeg;base64,"+et;break;default:n=""}let o;if(typeof Image!="undefined")o=new Image;else if(M.Image)o=new M.Image;else return;o.onload=async()=>{let s=I0(o.naturalWidth,o.naturalHeight);if(!s)h("Warmup: Canvas not found"),t(void 0);else{let A=s.getContext("2d");A&&A.drawImage(o,0,0);let a=await e.image(s,!0),i=a.tensor?await e.detect(a.tensor,e.config):void 0;t(i)}},n?o.src=n:t(void 0)})}async function lA(e){let t=s=>Buffer.from(s,"base64"),n;e.config.warmup==="face"?n=t($2):n=t(et);let o;if("node"in r&&r.getBackend()==="tensorflow"){let s=r.node.decodeJpeg(n),A=r.expandDims(s,0);e.tf.dispose(s),o=await e.detect(A,e.config),e.tf.dispose(A)}else e.config.debug&&h("Warmup tfjs-node not loaded");return o}async function cA(e){let t;return typeof createImageBitmap=="function"?t=await aA(e):typeof Image!="undefined"||M.Canvas!==void 0?t=await iA(e):t=await lA(e),t}async function xA(e){var i,c,x,y;if(!r.env().flagRegistry.ENGINE_COMPILE_ONLY)return;let t=r.getBackend(),n=r.backend();if(t!=="webgl"&&t!=="humangl"||!(n!=null&&n.checkCompileCompletion))return;r.env().set("ENGINE_COMPILE_ONLY",!0);let o=r.engine().state.numTensors,s=[];for(let[l,f]of Object.entries(e.models).filter(([d,u])=>d!==null&&u!==null)){let d=(f==null?void 0:f.modelSignature)&&((c=(i=f==null?void 0:f.inputs)==null?void 0:i[0])==null?void 0:c.shape)?[...f.inputs[0].shape]:[1,64,64,3],u=(f==null?void 0:f.modelSignature)&&((y=(x=f==null?void 0:f.inputs)==null?void 0:x[0])==null?void 0:y.dtype)?f.inputs[0].dtype:"float32";for(let g=0;gr.dispose(P)):r.dispose(g)}catch(g){e.config.debug&&h("compile fail model:",l)}r.dispose(m)}let A=await n.checkCompileCompletionAsync();n.getUniformLocations(),e.config.debug&&h("compile pass:",{models:s,kernels:A.length}),r.env().set("ENGINE_COMPILE_ONLY",!1);let a=r.engine().state.numTensors;a-o>0&&h("tensor leak:",a-o)}async function Fn(e,t){await Je(e,!1);let n=T();return e.state="warmup",t&&(e.config=J(e.config,t)),!e.config.warmup||e.config.warmup.length===0||e.config.warmup==="none"?_0():new Promise(async o=>{await e.models.load(),await xA(e);let s=await cA(e),A=T();e.config.debug&&h("warmup",e.config.warmup,Math.round(A-n),"ms"),e.emit("warmup"),o(s)})}var qe,s2,A2,tt,pe,Bn=class{constructor(t){E(this,"version");E(this,"config");E(this,"result");E(this,"state");E(this,"process");E(this,"tf");E(this,"env",M);E(this,"draw",pt);E(this,"match",h5);E(this,"models");E(this,"events");E(this,"faceTriangulation");E(this,"faceUVMap");E(this,"performance");Ne(this,qe,void 0);Ne(this,s2,void 0);Ne(this,A2,void 0);E(this,"analyze",(...t)=>{if(!V0(this,s2))return;let n=this.tf.engine().state.numTensors,o=V0(this,qe);Ye(this,qe,n);let s=n-o;s!==0&&h(...t,s)});Ne(this,tt,t=>{if(!V0(this,A2))return null;if(!t)return"input is not defined";if(this.env.node&&!(t instanceof r.Tensor))return"input must be a tensor";try{this.tf.getBackend()}catch(n){return"backend not loaded"}return null});E(this,"webcam",new y2);E(this,"emit",t=>{var n;(n=this.events)!=null&&n.dispatchEvent&&this.events.dispatchEvent(new Event(t))});Ne(this,pe,{});let n=(Ke.tfjs||r.version_core).replace(/-(.*)/,"");Ie.wasmPath=`https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${n}/dist/`,Ie.modelBasePath=M.browser?"../models/":"file://models/",this.version=it,Object.defineProperty(this,"version",{value:it}),this.config=JSON.parse(JSON.stringify(Ie)),Object.seal(this.config),this.config.cacheModels=typeof indexedDB!="undefined",t&&(this.config=J(this.config,t)),K5(this.config),this.tf=r,this.state="idle",Ye(this,qe,0),Ye(this,s2,!1),Ye(this,A2,!1),this.performance={},this.events=typeof EventTarget!="undefined"?new EventTarget:void 0,this.models=new r2(this),mt(),this.result=_0(),this.process={tensor:null,canvas:null},this.faceTriangulation=H1,this.faceUVMap=G1,_2(this,null,""),this.emit("create"),(this.config.debug||this.env.browser)&&h(`version: ${this.version}`),this.config.debug&&h(`tfjs version: ${this.tf.version["tfjs-core"]}`);let o=JSON.parse(JSON.stringify(this.env));delete o.kernels,delete o.initial,delete o.perfadd,this.config.debug&&h("environment:",o)}reset(){let t=this.config.backend;this.config=JSON.parse(JSON.stringify(Ie)),this.config.backend=t,At(),M.initial=!0}validate(t){let n=ot(Ie,t||this.config);return n.length===0&&(this.config=J(this.config,t)),n}now(){return T()}image(t,n=!1){return c2(t,this.config,n)}async segmentation(t,n){var A,a,i;if(n&&(this.config=J(this.config,n)),!this.config.segmentation.enabled)return null;let o=await c2(t,this.config);if(!o.tensor)return null;let s=null;return(A=this.config.segmentation.modelPath)!=null&&A.includes("rvm")&&(s=await In(o.tensor,this.config)),(a=this.config.segmentation.modelPath)!=null&&a.includes("meet")&&(s=await xn(o.tensor,this.config)),(i=this.config.segmentation.modelPath)!=null&&i.includes("selfie")&&(s=await On(o.tensor,this.config)),r.dispose(o.tensor),s}compare(t,n){return Y5(this.config,t,n)}async init(){await Je(this,!0),await this.tf.ready(),At()}async load(t){this.state="load";let n=T(),o=Object.values(this.models).filter(a=>a).length;t&&(this.config=J(this.config,t)),this.env.initial&&(await Je(this,!1)||h("error: backend check failed"),await r.ready(),this.env.browser&&(this.config.debug&&h("configuration:",this.config),this.config.debug&&h("tf flags:",this.tf.ENV.flags))),await this.models.load(),this.env.initial&&this.config.debug&&h("tf engine state:",this.tf.engine().state.numBytes,"bytes",this.tf.engine().state.numTensors,"tensors"),this.env.initial=!1,Object.values(this.models).filter(a=>a).length!==o&&(this.models.validate(),this.emit("load"));let A=Math.trunc(T()-n);A>(this.performance.loadModels||0)&&(this.performance.loadModels=this.env.perfadd?(this.performance.loadModels||0)+A:A)}next(t=this.result){return cn(t,this.config)}async warmup(t){let n=T(),o=await Fn(this,t),s=T();return this.performance.warmup=Math.trunc(s-n),o}async profile(t,n){let o=await this.tf.profile(()=>this.detect(t,n)),s={},A=0;for(let i of o.kernels){let c=Number(i.kernelTimeMs)||0;s[i.name]?s[i.name]+=c:s[i.name]=c,A+=c}let a=[];Object.entries(s).forEach(i=>a.push({kernel:i[0],time:i[1],perc:0}));for(let i of a)i.perc=Math.round(1e3*i.time/A)/1e3,i.time=Math.round(1e3*i.time)/1e3;return a.sort((i,c)=>c.time-i.time),a.length=20,a}async detect(t,n){return this.state="detect",new Promise(async o=>{var g,P,v,p,b,j,k,I,B,q,W,Z,K,R,D,A0,H,a0,n0,C,F;this.state="config";let s;this.config=J(this.config,n),this.state="check";let A=V0(this,tt).call(this,t);A&&(h(A,t),this.emit("error"),o(_0(A)));let a=T();await this.load(),s=T(),this.state="image";let i=await c2(t,this.config);if(this.process=i,this.performance.inputProcess=this.env.perfadd?(this.performance.inputProcess||0)+Math.trunc(T()-s):Math.trunc(T()-s),this.analyze("Get Image:"),!i.tensor){this.config.debug&&h("could not convert input to tensor"),this.emit("error"),o(_0("could not convert input to tensor"));return}this.emit("image"),s=T(),this.config.skipAllowed=await U5(this.config,i.tensor),this.config.filter.autoBrightness=(this.config.filter.autoBrightness||!1)&&this.config.skipAllowed,this.performance.totalFrames||(this.performance.totalFrames=0),this.performance.cachedFrames||(this.performance.cachedFrames=0),this.performance.totalFrames++,this.config.skipAllowed&&this.performance.cachedFrames++,this.performance.cacheCheck=this.env.perfadd?(this.performance.cacheCheck||0)+Math.trunc(T()-s):Math.trunc(T()-s),this.analyze("Check Changed:");let c=[],x=[],y=[],l=[];this.state="detect:face",this.config.async?(c=this.config.face.enabled?o5(this,i.tensor):[],this.performance.face&&delete this.performance.face):(s=T(),c=this.config.face.enabled?await o5(this,i.tensor):[],this.performance.face=this.env.perfadd?(this.performance.face||0)+Math.trunc(T()-s):Math.trunc(T()-s)),this.config.async&&(this.config.body.maxDetected===-1||this.config.hand.maxDetected===-1)&&(c=await c),this.analyze("Start Body:"),this.state="detect:body";let f=this.config.body.maxDetected===-1?J(this.config,{body:{maxDetected:this.config.face.enabled?1*c.length:1}}):this.config;this.config.async?((g=this.config.body.modelPath)!=null&&g.includes("posenet")?x=this.config.body.enabled?E5(i.tensor,f):[]:(P=this.config.body.modelPath)!=null&&P.includes("blazepose")?x=this.config.body.enabled?Tt(i.tensor,f):[]:(v=this.config.body.modelPath)!=null&&v.includes("efficientpose")?x=this.config.body.enabled?Et(i.tensor,f):[]:(p=this.config.body.modelPath)!=null&&p.includes("movenet")&&(x=this.config.body.enabled?T5(i.tensor,f):[]),this.performance.body&&delete this.performance.body):(s=T(),(b=this.config.body.modelPath)!=null&&b.includes("posenet")?x=this.config.body.enabled?await E5(i.tensor,f):[]:(j=this.config.body.modelPath)!=null&&j.includes("blazepose")?x=this.config.body.enabled?await Tt(i.tensor,f):[]:(k=this.config.body.modelPath)!=null&&k.includes("efficientpose")?x=this.config.body.enabled?await Et(i.tensor,f):[]:(I=this.config.body.modelPath)!=null&&I.includes("movenet")&&(x=this.config.body.enabled?await T5(i.tensor,f):[]),this.performance.body=this.env.perfadd?(this.performance.body||0)+Math.trunc(T()-s):Math.trunc(T()-s)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.state="detect:hand";let d=this.config.hand.maxDetected===-1?J(this.config,{hand:{maxDetected:this.config.face.enabled?2*c.length:1}}):this.config;this.config.async?((q=(B=this.config.hand.detector)==null?void 0:B.modelPath)!=null&&q.includes("handdetect")?y=this.config.hand.enabled?i5(i.tensor,d):[]:(Z=(W=this.config.hand.detector)==null?void 0:W.modelPath)!=null&&Z.includes("handtrack")&&(y=this.config.hand.enabled?x5(i.tensor,d):[]),this.performance.hand&&delete this.performance.hand):(s=T(),(R=(K=this.config.hand.detector)==null?void 0:K.modelPath)!=null&&R.includes("handdetect")?y=this.config.hand.enabled?await i5(i.tensor,d):[]:(A0=(D=this.config.hand.detector)==null?void 0:D.modelPath)!=null&&A0.includes("handtrack")&&(y=this.config.hand.enabled?await x5(i.tensor,d):[]),this.performance.hand=this.env.perfadd?(this.performance.hand||0)+Math.trunc(T()-s):Math.trunc(T()-s)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.state="detect:object",this.config.async?((H=this.config.object.modelPath)!=null&&H.includes("nanodet")?l=this.config.object.enabled?R5(i.tensor,this.config):[]:(a0=this.config.object.modelPath)!=null&&a0.includes("centernet")&&(l=this.config.object.enabled?Mt(i.tensor,this.config):[]),this.performance.object&&delete this.performance.object):(s=T(),(n0=this.config.object.modelPath)!=null&&n0.includes("nanodet")?l=this.config.object.enabled?await R5(i.tensor,this.config):[]:(C=this.config.object.modelPath)!=null&&C.includes("centernet")&&(l=this.config.object.enabled?await Mt(i.tensor,this.config):[]),this.performance.object=this.env.perfadd?(this.performance.object||0)+Math.trunc(T()-s):Math.trunc(T()-s)),this.analyze("End Object:"),this.state="detect:await",this.config.async&&([c,x,y,l]=await Promise.all([c,x,y,l])),this.state="detect:gesture";let u=[];this.config.gesture.enabled&&(s=T(),u=[...F3(c),...D3(x),...H3(y),...B3(c)],this.config.async?this.performance.gesture&&delete this.performance.gesture:this.performance.gesture=this.env.perfadd?(this.performance.gesture||0)+Math.trunc(T()-s):Math.trunc(T()-s)),this.performance.total=this.env.perfadd?(this.performance.total||0)+Math.trunc(T()-a):Math.trunc(T()-a);let m=((F=this.process.tensor)==null?void 0:F.shape)||[0,0,0,0];this.result={face:c,body:x,hand:y,gesture:u,object:l,performance:this.performance,canvas:this.process.canvas,timestamp:Date.now(),error:null,width:m[2],height:m[1],get persons(){return Dn(c,x,y,u,m)}},r.dispose(i.tensor),this.emit("detect"),this.state="idle",o(this.result)})}async sleep(t){return new Promise(n=>{setTimeout(n,t)})}async video(t,n=!0,o=0){n?(V0(this,pe)[t.id]||(this.config.debug&&h("video start",t.id),V0(this,pe)[t.id]=!0),!t.paused&&V0(this,pe)[t.id]&&t.readyState>=2&&await this.detect(t),o>0&&await this.sleep(o),V0(this,pe)[t.id]&&requestAnimationFrame(()=>this.video(t,n,o))):(this.config.debug&&h("video stop",t.id),V0(this,pe)[t.id]=!1)}};qe=new WeakMap,s2=new WeakMap,A2=new WeakMap,tt=new WeakMap,pe=new WeakMap;export{d2 as Env,Bn as Human,Bn as default,Ie as defaults,pt as draw,_0 as empty,M as env,h5 as match,Wn as models}; diff --git a/dist/human.esm.d.ts b/dist/human.esm.d.ts new file mode 100644 index 00000000..f94037de --- /dev/null +++ b/dist/human.esm.d.ts @@ -0,0 +1 @@ +export * from '../types/human'; \ No newline at end of file diff --git a/dist/human.esm.js b/dist/human.esm.js new file mode 100644 index 00000000..463c5b5a --- /dev/null +++ b/dist/human.esm.js @@ -0,0 +1,46264 @@ +/* + Human + homepage: + author: ' +*/ + +var __defProp = Object.defineProperty; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __require = /* @__PURE__ */ ((x6) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x6, { + get: (a, b) => (typeof require !== "undefined" ? require : a)[b] +}) : x6)(function(x6) { + if (typeof require !== "undefined") + return require.apply(this, arguments); + throw new Error('Dynamic require of "' + x6 + '" is not supported'); +}); +var __export = (target, all2) => { + for (var name in all2) + __defProp(target, name, { get: all2[name], enumerable: true }); +}; +var __publicField = (obj, key, value) => { + __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + return value; +}; +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; +}; + +// dist/tfjs.esm.js +var tfjs_esm_exports = {}; +__export(tfjs_esm_exports, { + Abs: () => sn, + Acos: () => Li, + Acosh: () => Bi, + AdadeltaOptimizer: () => xi, + AdagradOptimizer: () => yi, + AdamOptimizer: () => bi, + AdamaxOptimizer: () => Ci, + Add: () => _r, + AddN: () => an, + All: () => oa, + Any: () => na, + ArgMax: () => un, + ArgMin: () => ja, + Asin: () => Vi, + Asinh: () => zi, + Atan: () => Wi, + Atan2: () => sa, + Atanh: () => Ui, + AvgPool: () => pn, + AvgPool3D: () => ip, + AvgPool3DGrad: () => Fm, + AvgPoolGrad: () => Am, + BackendWasm: () => Gl, + BatchMatMul: () => cn, + BatchToSpaceND: () => hs, + Bincount: () => up, + BroadcastArgs: () => pp, + BroadcastTo: () => Tne, + Cast: () => to, + Ceil: () => ro, + ClipByValue: () => Ro, + Complex: () => aa, + ComplexAbs: () => cp, + Concat: () => gs, + Conv2D: () => ln, + Conv2DBackpropFilter: () => lp, + Conv2DBackpropInput: () => mn, + Conv3D: () => mp, + Conv3DBackpropFilterV2: () => Dm, + Conv3DBackpropInputV2: () => fp, + Cos: () => fn, + Cosh: () => dn, + CropAndResize: () => xn, + Cumprod: () => hn, + Cumsum: () => gn, + DataStorage: () => rn, + DenseBincount: () => dp, + DepthToSpace: () => yn, + DepthwiseConv2dNative: () => bn, + DepthwiseConv2dNativeBackpropFilter: () => hp, + DepthwiseConv2dNativeBackpropInput: () => gp, + Diag: () => xp, + Dilation2D: () => yp, + Dilation2DBackpropFilter: () => vb, + Dilation2DBackpropInput: () => Sb, + ENV: () => Cb, + Einsum: () => Xa, + Elu: () => In, + EluGrad: () => Pm, + Environment: () => Qc, + Equal: () => oo, + Erf: () => Gi, + Exp: () => no, + ExpandDims: () => xs, + Expm1: () => wn, + FFT: () => bp, + Fill: () => ys, + FlipLeftRight: () => Sn, + Floor: () => so, + FloorDiv: () => vn, + FromPixels: () => Zi, + FusedBatchNorm: () => kn, + FusedConv2D: () => Do, + FusedDepthwiseConv2D: () => Po, + GPGPUContext: () => Fu, + GatherNd: () => Tn, + GatherV2: () => bs, + GraphModel: () => bl, + Greater: () => ao, + GreaterEqual: () => io, + IFFT: () => Cp, + Identity: () => uo, + Imag: () => Ya, + IsFinite: () => Hi, + IsInf: () => qi, + IsNan: () => ia, + KernelBackend: () => Jr, + LRN: () => wp, + LRNGrad: () => Om, + LeakyRelu: () => Nn, + Less: () => po, + LessEqual: () => co, + LinSpace: () => Ip, + Log: () => lo, + Log1p: () => Ki, + LogSoftmax: () => Nne, + LogicalAnd: () => _n, + LogicalNot: () => En, + LogicalOr: () => ua, + LogicalXor: () => g0, + LowerBound: () => _ne, + MathBackendCPU: () => Si, + MathBackendWebGL: () => Ni, + Max: () => $n, + MaxPool: () => Rn, + MaxPool3D: () => Sp, + MaxPool3DGrad: () => Lm, + MaxPoolGrad: () => Mm, + MaxPoolWithArgmax: () => vp, + Maximum: () => mo, + Mean: () => An, + Min: () => Fn, + Minimum: () => fo, + MirrorPad: () => Dn, + Mod: () => ji, + MomentumOptimizer: () => Ii, + Multinomial: () => kp, + Multiply: () => ho, + Neg: () => Pn, + NonMaxSuppressionV3: () => On, + NonMaxSuppressionV4: () => pa, + NonMaxSuppressionV5: () => Mn, + NotEqual: () => go, + OP_SCOPE_SUFFIX: () => Ub, + OneHot: () => ca, + OnesLike: () => Cs, + Optimizer: () => wr, + OptimizerConstructors: () => ns, + Pack: () => Is, + PadV2: () => Ln, + Pool: () => Ene, + Pow: () => Bn, + Prelu: () => Vn, + Prod: () => Ao, + RMSPropOptimizer: () => wi, + RaggedGather: () => Tp, + RaggedRange: () => Np, + RaggedTensorToTensor: () => _p, + Range: () => ws, + Rank: () => Fb, + Real: () => la, + RealDiv: () => Cn, + Reciprocal: () => ma, + Reduction: () => Et, + Relu: () => zn, + Relu6: () => Gn, + Reshape: () => Ss, + ResizeBilinear: () => Un, + ResizeBilinearGrad: () => Vm, + ResizeNearestNeighbor: () => Wn, + ResizeNearestNeighborGrad: () => Bm, + Reverse: () => fa, + RotateWithOffset: () => es, + Round: () => da, + Rsqrt: () => xo, + SGDOptimizer: () => Us, + ScatterNd: () => Hn, + SearchSorted: () => Ep, + Select: () => vs, + Selu: () => Xi, + Sigmoid: () => yo, + Sign: () => Yi, + Sin: () => Kn, + Sinh: () => ha, + Slice: () => qn, + Softmax: () => Xn, + Softplus: () => Qi, + SpaceToBatchND: () => ks, + SparseFillEmptyRows: () => Qa, + SparseReshape: () => ga, + SparseSegmentMean: () => Za, + SparseSegmentSum: () => Ja, + SparseToDense: () => ei, + SplitV: () => Ts, + Sqrt: () => bo, + Square: () => ti, + SquaredDifference: () => Co, + Step: () => $s, + StridedSlice: () => Yn, + StringNGrams: () => Ns, + StringSplit: () => ri, + StringToHashBucketFast: () => oi, + Sub: () => Io, + Sum: () => jn, + Tan: () => xa, + Tanh: () => Qn, + Tensor: () => ut, + TensorBuffer: () => je, + Tile: () => wo, + TopK: () => Zn, + Transform: () => Jn, + Transpose: () => Mr, + Unique: () => $p, + Unpack: () => _s, + UnsortedSegmentSum: () => Rp, + UpperBound: () => $ne, + Variable: () => ba, + WebGPUBackend: () => Ai, + ZerosLike: () => Es, + _FusedMatMul: () => Fo, + abs: () => Qt, + acos: () => Vv, + acosh: () => zv, + add: () => ge, + addN: () => Wv, + all: () => Uv, + any: () => Gv, + argMax: () => Hv, + argMin: () => qv, + asin: () => Kv, + asinh: () => jv, + atan: () => Xv, + atan2: () => Yv, + atanh: () => Qv, + avgPool: () => mf, + avgPool3d: () => ek, + backend: () => Bie, + backend_util: () => I, + basicLSTMCell: () => tk, + batchNorm: () => li, + batchNorm2d: () => ok, + batchNorm3d: () => nk, + batchNorm4d: () => sk, + batchToSpaceND: () => ff, + bincount: () => df, + booleanMaskAsync: () => _H, + broadcastArgs: () => ak, + broadcastTo: () => Ls, + broadcast_util: () => br, + browser: () => Sv, + buffer: () => ne, + cast: () => qe, + ceil: () => ik, + clipByValue: () => uk, + clone: () => zr, + complex: () => Er, + concat: () => gt, + concat1d: () => pk, + concat2d: () => ck, + concat3d: () => lk, + concat4d: () => mk, + conv1d: () => fk, + conv2d: () => mi, + conv2dTranspose: () => dk, + conv3d: () => hk, + conv3dTranspose: () => xk, + copyRegisteredKernels: () => Lne, + cos: () => yk, + cosh: () => bk, + cosineWindow: () => hl, + cumprod: () => Ck, + cumsum: () => Ik, + customGrad: () => Cr, + denseBincount: () => wk, + deprecationWarn: () => sC, + depthToSpace: () => Sk, + depthwiseConv2d: () => Gp, + deregisterOp: () => YK, + device_util: () => ii, + diag: () => vk, + dilation2d: () => kk, + disableDeprecationWarnings: () => _ie, + dispose: () => Ft, + disposeVariables: () => Eie, + div: () => We, + divNoNan: () => Tk, + dot: () => Nk, + dropout: () => BH, + einsum: () => _k, + elu: () => xf, + enableDebugMode: () => Nie, + enableProdMode: () => Tie, + enclosingPowerOfTwo: () => wC, + engine: () => cr, + env: () => P, + equal: () => gf, + erf: () => Ek, + euclideanNorm: () => Ak, + exp: () => Bo, + expandDims: () => _a, + expm1: () => Fk, + eye: () => yf, + fft: () => qp, + fill: () => Bs, + findBackend: () => Mie, + findBackendFactory: () => Lie, + floor: () => bf, + floorDiv: () => cf, + forceHalfFloat: () => pR, + fused: () => SC, + gather: () => Cf, + gatherND: () => MH, + gather_util: () => af, + getBackend: () => Pie, + getGradient: () => kb, + getKernel: () => el, + getKernelsForBackend: () => zm, + getThreadsCount: () => nte, + gpgpu_util: () => Sw, + grad: () => GG, + grads: () => HG, + greater: () => cu, + greaterEqual: () => If, + ifft: () => hu, + imag: () => ci, + image: () => zq, + inTopKAsync: () => zH, + io: () => va, + irfft: () => Gf, + isFinite: () => Dk, + isInf: () => Pk, + isNaN: () => Ok, + keep: () => So, + kernel_impls: () => Bt, + leakyRelu: () => wf, + less: () => Mk, + lessEqual: () => Hp, + linalg: () => Wq, + linspace: () => Lk, + loadGraphModel: () => U6, + loadGraphModelSync: () => G6, + localResponseNormalization: () => Bk, + log: () => Ea, + log1p: () => Sf, + logSigmoid: () => Vk, + logSoftmax: () => zk, + logSumExp: () => Tf, + logicalAnd: () => lu, + logicalNot: () => Nf, + logicalOr: () => _f, + logicalXor: () => Wk, + losses: () => Uq, + lowerBound: () => Uk, + matMul: () => Xe, + math: () => Cv, + max: () => Vs, + maxPool: () => $f, + maxPool3d: () => Gk, + maxPoolWithArgmax: () => Hk, + maximum: () => Rf, + mean: () => mu, + memory: () => $ie, + meshgrid: () => qk, + min: () => fl, + minimum: () => Af, + mirrorPad: () => Kk, + mod: () => jk, + moments: () => Xk, + movingAverage: () => $H, + mul: () => oe, + multiRNNCell: () => Yk, + multinomial: () => Qk, + neg: () => yr, + nextFrame: () => kC, + norm: () => pu, + notEqual: () => Ff, + oneHot: () => pl, + ones: () => zs, + onesLike: () => Zk, + op: () => T, + outerProduct: () => Jk, + pad: () => Ws, + pad1d: () => e1, + pad2d: () => t1, + pad3d: () => r1, + pad4d: () => o1, + pool: () => n1, + pow: () => Na, + prelu: () => Pf, + print: () => ef, + prod: () => s1, + profile: () => Rie, + raggedGather: () => a1, + raggedRange: () => i1, + raggedTensorToTensor: () => u1, + rand: () => p1, + randomGamma: () => T1, + randomNormal: () => Vf, + randomStandardNormal: () => N1, + randomUniform: () => zf, + range: () => di, + ready: () => Die, + real: () => ka, + reciprocal: () => _1, + registerBackend: () => pi, + registerGradient: () => Pne, + registerKernel: () => ya, + registerOp: () => XK, + relu: () => hi, + relu6: () => Wf, + removeBackend: () => Oie, + reshape: () => z, + reverse: () => vo, + reverse1d: () => E1, + reverse2d: () => $1, + reverse3d: () => R1, + reverse4d: () => A1, + rfft: () => Kp, + round: () => Uf, + rsqrt: () => F1, + scalar: () => be, + scatterND: () => AH, + scatter_util: () => cl, + searchSorted: () => dl, + selu: () => D1, + separableConv2d: () => P1, + serialization: () => Pv, + setBackend: () => Fie, + setPlatform: () => Vie, + setThreadsCount: () => ote, + setWasmPath: () => tte, + setWasmPaths: () => rte, + setWebGLContext: () => MI, + setdiff1dAsync: () => O1, + shared: () => Ad, + sigmoid: () => Ms, + sign: () => M1, + signal: () => Vq, + sin: () => L1, + sinh: () => B1, + slice: () => Ue, + slice1d: () => V1, + slice2d: () => z1, + slice3d: () => W1, + slice4d: () => U1, + slice_util: () => et, + softmax: () => G1, + softplus: () => kf, + spaceToBatchND: () => Df, + sparse: () => Gq, + sparseToDense: () => PH, + spectral: () => Bq, + split: () => $a, + sqrt: () => Rr, + square: () => Zt, + squaredDifference: () => Hf, + squeeze: () => jp, + stack: () => Ir, + step: () => qf, + stridedSlice: () => H1, + string: () => Hq, + sub: () => ke, + sum: () => tt, + sumOutType: () => Ca, + tan: () => q1, + tanh: () => ml, + tensor: () => nr, + tensor1d: () => mr, + tensor2d: () => gi, + tensor3d: () => sf, + tensor4d: () => K1, + tensor5d: () => j1, + tensor6d: () => X1, + tensor_util: () => z0, + test_util: () => Bv, + tidy: () => Ne, + tile: () => fi, + time: () => Aie, + topk: () => Y1, + train: () => pMe, + transpose: () => Wp, + truncatedNormal: () => Q1, + unique: () => Z1, + unregisterGradient: () => Mne, + unregisterKernel: () => One, + unsortedSegmentSum: () => J1, + unstack: () => ko, + upcastType: () => ct, + upperBound: () => eT, + util: () => x, + valueAndGrad: () => qG, + valueAndGrads: () => KG, + variable: () => tT, + variableGrads: () => dC, + version: () => Cne, + version_converter: () => q6, + version_core: () => YW, + version_cpu: () => Ij, + version_wasm: () => ste, + version_webgl: () => gY, + webgl: () => R9e, + webgl_util: () => ic, + webgpu_util: () => pS, + where: () => os, + whereAsync: () => jf, + zeros: () => Wr, + zerosLike: () => Gt +}); +var QV = Object.create; +var fb = Object.defineProperty; +var ZV = Object.getOwnPropertyDescriptor; +var JV = Object.getOwnPropertyNames; +var ez = Object.getPrototypeOf; +var tz = Object.prototype.hasOwnProperty; +var Em = ((r) => typeof __require != "undefined" ? __require : typeof Proxy != "undefined" ? new Proxy(r, { get: (e, t10) => (typeof __require != "undefined" ? __require : e)[t10] }) : r)(function(r) { + if (typeof __require != "undefined") + return __require.apply(this, arguments); + throw new Error('Dynamic require of "' + r + '" is not supported'); +}); +var Kt = (r, e) => () => (e || r((e = { exports: {} }).exports, e), e.exports); +var Be = (r, e) => { + for (var t10 in e) + fb(r, t10, { get: e[t10], enumerable: true }); +}; +var rz = (r, e, t10, o) => { + if (e && typeof e == "object" || typeof e == "function") + for (let n of JV(e)) + !tz.call(r, n) && n !== t10 && fb(r, n, { get: () => e[n], enumerable: !(o = ZV(e, n)) || o.enumerable }); + return r; +}; +var rp = (r, e, t10) => (t10 = r != null ? QV(ez(r)) : {}, rz(e || !r || !r.__esModule ? fb(t10, "default", { value: r, enumerable: true }) : t10, r)); +var _0 = Kt((Vne, N0) => { + N0.exports = wt; + var Oo = null; + try { + Oo = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11])), {}).exports; + } catch (r) { + } + function wt(r, e, t10) { + this.low = r | 0, this.high = e | 0, this.unsigned = !!t10; + } + wt.prototype.__isLong__; + Object.defineProperty(wt.prototype, "__isLong__", { value: true }); + function Br(r) { + return (r && r.__isLong__) === true; + } + wt.isLong = Br; + var y0 = {}, b0 = {}; + function eu(r, e) { + var t10, o, n; + return e ? (r >>>= 0, (n = 0 <= r && r < 256) && (o = b0[r], o) ? o : (t10 = St(r, (r | 0) < 0 ? -1 : 0, true), n && (b0[r] = t10), t10)) : (r |= 0, (n = -128 <= r && r < 128) && (o = y0[r], o) ? o : (t10 = St(r, r < 0 ? -1 : 0, false), n && (y0[r] = t10), t10)); + } + wt.fromInt = eu; + function Mo(r, e) { + if (isNaN(r)) + return e ? Ji : Lo; + if (e) { + if (r < 0) + return Ji; + if (r >= S0) + return T0; + } else { + if (r <= -I0) + return Lr; + if (r + 1 >= I0) + return k0; + } + return r < 0 ? Mo(-r, e).neg() : St(r % Dp | 0, r / Dp | 0, e); + } + wt.fromNumber = Mo; + function St(r, e, t10) { + return new wt(r, e, t10); + } + wt.fromBits = St; + var Wm = Math.pow; + function _b(r, e, t10) { + if (r.length === 0) + throw Error("empty string"); + if (r === "NaN" || r === "Infinity" || r === "+Infinity" || r === "-Infinity") + return Lo; + if (typeof e == "number" ? (t10 = e, e = false) : e = !!e, t10 = t10 || 10, t10 < 2 || 36 < t10) + throw RangeError("radix"); + var o; + if ((o = r.indexOf("-")) > 0) + throw Error("interior hyphen"); + if (o === 0) + return _b(r.substring(1), e, t10).neg(); + for (var n = Mo(Wm(t10, 8)), s = Lo, a = 0; a < r.length; a += 8) { + var i = Math.min(8, r.length - a), p = parseInt(r.substring(a, a + i), t10); + if (i < 8) { + var u = Mo(Wm(t10, i)); + s = s.mul(u).add(Mo(p)); + } else + s = s.mul(n), s = s.add(Mo(p)); + } + return s.unsigned = e, s; + } + wt.fromString = _b; + function ts(r, e) { + return typeof r == "number" ? Mo(r, e) : typeof r == "string" ? _b(r, e) : St(r.low, r.high, typeof e == "boolean" ? e : r.unsigned); + } + wt.fromValue = ts; + var C0 = 1 << 16, vz = 1 << 24, Dp = C0 * C0, S0 = Dp * Dp, I0 = S0 / 2, w0 = eu(vz), Lo = eu(0); + wt.ZERO = Lo; + var Ji = eu(0, true); + wt.UZERO = Ji; + var Fp = eu(1); + wt.ONE = Fp; + var v0 = eu(1, true); + wt.UONE = v0; + var Nb = eu(-1); + wt.NEG_ONE = Nb; + var k0 = St(-1, 2147483647, false); + wt.MAX_VALUE = k0; + var T0 = St(-1, -1, true); + wt.MAX_UNSIGNED_VALUE = T0; + var Lr = St(0, -2147483648, false); + wt.MIN_VALUE = Lr; + var ce = wt.prototype; + ce.toInt = function() { + return this.unsigned ? this.low >>> 0 : this.low; + }; + ce.toNumber = function() { + return this.unsigned ? (this.high >>> 0) * Dp + (this.low >>> 0) : this.high * Dp + (this.low >>> 0); + }; + ce.toString = function(e) { + if (e = e || 10, e < 2 || 36 < e) + throw RangeError("radix"); + if (this.isZero()) + return "0"; + if (this.isNegative()) + if (this.eq(Lr)) { + var t10 = Mo(e), o = this.div(t10), n = o.mul(t10).sub(this); + return o.toString(e) + n.toInt().toString(e); + } else + return "-" + this.neg().toString(e); + for (var s = Mo(Wm(e, 6), this.unsigned), a = this, i = ""; ; ) { + var p = a.div(s), u = a.sub(p.mul(s)).toInt() >>> 0, c = u.toString(e); + if (a = p, a.isZero()) + return c + i; + for (; c.length < 6; ) + c = "0" + c; + i = "" + c + i; + } + }; + ce.getHighBits = function() { + return this.high; + }; + ce.getHighBitsUnsigned = function() { + return this.high >>> 0; + }; + ce.getLowBits = function() { + return this.low; + }; + ce.getLowBitsUnsigned = function() { + return this.low >>> 0; + }; + ce.getNumBitsAbs = function() { + if (this.isNegative()) + return this.eq(Lr) ? 64 : this.neg().getNumBitsAbs(); + for (var e = this.high != 0 ? this.high : this.low, t10 = 31; t10 > 0 && (e & 1 << t10) == 0; t10--) + ; + return this.high != 0 ? t10 + 33 : t10 + 1; + }; + ce.isZero = function() { + return this.high === 0 && this.low === 0; + }; + ce.eqz = ce.isZero; + ce.isNegative = function() { + return !this.unsigned && this.high < 0; + }; + ce.isPositive = function() { + return this.unsigned || this.high >= 0; + }; + ce.isOdd = function() { + return (this.low & 1) === 1; + }; + ce.isEven = function() { + return (this.low & 1) === 0; + }; + ce.equals = function(e) { + return Br(e) || (e = ts(e)), this.unsigned !== e.unsigned && this.high >>> 31 === 1 && e.high >>> 31 === 1 ? false : this.high === e.high && this.low === e.low; + }; + ce.eq = ce.equals; + ce.notEquals = function(e) { + return !this.eq(e); + }; + ce.neq = ce.notEquals; + ce.ne = ce.notEquals; + ce.lessThan = function(e) { + return this.comp(e) < 0; + }; + ce.lt = ce.lessThan; + ce.lessThanOrEqual = function(e) { + return this.comp(e) <= 0; + }; + ce.lte = ce.lessThanOrEqual; + ce.le = ce.lessThanOrEqual; + ce.greaterThan = function(e) { + return this.comp(e) > 0; + }; + ce.gt = ce.greaterThan; + ce.greaterThanOrEqual = function(e) { + return this.comp(e) >= 0; + }; + ce.gte = ce.greaterThanOrEqual; + ce.ge = ce.greaterThanOrEqual; + ce.compare = function(e) { + if (Br(e) || (e = ts(e)), this.eq(e)) + return 0; + var t10 = this.isNegative(), o = e.isNegative(); + return t10 && !o ? -1 : !t10 && o ? 1 : this.unsigned ? e.high >>> 0 > this.high >>> 0 || e.high === this.high && e.low >>> 0 > this.low >>> 0 ? -1 : 1 : this.sub(e).isNegative() ? -1 : 1; + }; + ce.comp = ce.compare; + ce.negate = function() { + return !this.unsigned && this.eq(Lr) ? Lr : this.not().add(Fp); + }; + ce.neg = ce.negate; + ce.add = function(e) { + Br(e) || (e = ts(e)); + var t10 = this.high >>> 16, o = this.high & 65535, n = this.low >>> 16, s = this.low & 65535, a = e.high >>> 16, i = e.high & 65535, p = e.low >>> 16, u = e.low & 65535, c = 0, l = 0, m = 0, f = 0; + return f += s + u, m += f >>> 16, f &= 65535, m += n + p, l += m >>> 16, m &= 65535, l += o + i, c += l >>> 16, l &= 65535, c += t10 + a, c &= 65535, St(m << 16 | f, c << 16 | l, this.unsigned); + }; + ce.subtract = function(e) { + return Br(e) || (e = ts(e)), this.add(e.neg()); + }; + ce.sub = ce.subtract; + ce.multiply = function(e) { + if (this.isZero()) + return Lo; + if (Br(e) || (e = ts(e)), Oo) { + var t10 = Oo.mul(this.low, this.high, e.low, e.high); + return St(t10, Oo.get_high(), this.unsigned); + } + if (e.isZero()) + return Lo; + if (this.eq(Lr)) + return e.isOdd() ? Lr : Lo; + if (e.eq(Lr)) + return this.isOdd() ? Lr : Lo; + if (this.isNegative()) + return e.isNegative() ? this.neg().mul(e.neg()) : this.neg().mul(e).neg(); + if (e.isNegative()) + return this.mul(e.neg()).neg(); + if (this.lt(w0) && e.lt(w0)) + return Mo(this.toNumber() * e.toNumber(), this.unsigned); + var o = this.high >>> 16, n = this.high & 65535, s = this.low >>> 16, a = this.low & 65535, i = e.high >>> 16, p = e.high & 65535, u = e.low >>> 16, c = e.low & 65535, l = 0, m = 0, f = 0, d = 0; + return d += a * c, f += d >>> 16, d &= 65535, f += s * c, m += f >>> 16, f &= 65535, f += a * u, m += f >>> 16, f &= 65535, m += n * c, l += m >>> 16, m &= 65535, m += s * u, l += m >>> 16, m &= 65535, m += a * p, l += m >>> 16, m &= 65535, l += o * c + n * u + s * p + a * i, l &= 65535, St(f << 16 | d, l << 16 | m, this.unsigned); + }; + ce.mul = ce.multiply; + ce.divide = function(e) { + if (Br(e) || (e = ts(e)), e.isZero()) + throw Error("division by zero"); + if (Oo) { + if (!this.unsigned && this.high === -2147483648 && e.low === -1 && e.high === -1) + return this; + var t10 = (this.unsigned ? Oo.div_u : Oo.div_s)(this.low, this.high, e.low, e.high); + return St(t10, Oo.get_high(), this.unsigned); + } + if (this.isZero()) + return this.unsigned ? Ji : Lo; + var o, n, s; + if (this.unsigned) { + if (e.unsigned || (e = e.toUnsigned()), e.gt(this)) + return Ji; + if (e.gt(this.shru(1))) + return v0; + s = Ji; + } else { + if (this.eq(Lr)) { + if (e.eq(Fp) || e.eq(Nb)) + return Lr; + if (e.eq(Lr)) + return Fp; + var a = this.shr(1); + return o = a.div(e).shl(1), o.eq(Lo) ? e.isNegative() ? Fp : Nb : (n = this.sub(e.mul(o)), s = o.add(n.div(e)), s); + } else if (e.eq(Lr)) + return this.unsigned ? Ji : Lo; + if (this.isNegative()) + return e.isNegative() ? this.neg().div(e.neg()) : this.neg().div(e).neg(); + if (e.isNegative()) + return this.div(e.neg()).neg(); + s = Lo; + } + for (n = this; n.gte(e); ) { + o = Math.max(1, Math.floor(n.toNumber() / e.toNumber())); + for (var i = Math.ceil(Math.log(o) / Math.LN2), p = i <= 48 ? 1 : Wm(2, i - 48), u = Mo(o), c = u.mul(e); c.isNegative() || c.gt(n); ) + o -= p, u = Mo(o, this.unsigned), c = u.mul(e); + u.isZero() && (u = Fp), s = s.add(u), n = n.sub(c); + } + return s; + }; + ce.div = ce.divide; + ce.modulo = function(e) { + if (Br(e) || (e = ts(e)), Oo) { + var t10 = (this.unsigned ? Oo.rem_u : Oo.rem_s)(this.low, this.high, e.low, e.high); + return St(t10, Oo.get_high(), this.unsigned); + } + return this.sub(this.div(e).mul(e)); + }; + ce.mod = ce.modulo; + ce.rem = ce.modulo; + ce.not = function() { + return St(~this.low, ~this.high, this.unsigned); + }; + ce.and = function(e) { + return Br(e) || (e = ts(e)), St(this.low & e.low, this.high & e.high, this.unsigned); + }; + ce.or = function(e) { + return Br(e) || (e = ts(e)), St(this.low | e.low, this.high | e.high, this.unsigned); + }; + ce.xor = function(e) { + return Br(e) || (e = ts(e)), St(this.low ^ e.low, this.high ^ e.high, this.unsigned); + }; + ce.shiftLeft = function(e) { + return Br(e) && (e = e.toInt()), (e &= 63) === 0 ? this : e < 32 ? St(this.low << e, this.high << e | this.low >>> 32 - e, this.unsigned) : St(0, this.low << e - 32, this.unsigned); + }; + ce.shl = ce.shiftLeft; + ce.shiftRight = function(e) { + return Br(e) && (e = e.toInt()), (e &= 63) === 0 ? this : e < 32 ? St(this.low >>> e | this.high << 32 - e, this.high >> e, this.unsigned) : St(this.high >> e - 32, this.high >= 0 ? 0 : -1, this.unsigned); + }; + ce.shr = ce.shiftRight; + ce.shiftRightUnsigned = function(e) { + if (Br(e) && (e = e.toInt()), e &= 63, e === 0) + return this; + var t10 = this.high; + if (e < 32) { + var o = this.low; + return St(o >>> e | t10 << 32 - e, t10 >>> e, this.unsigned); + } else + return e === 32 ? St(t10, 0, this.unsigned) : St(t10 >>> e - 32, 0, this.unsigned); + }; + ce.shru = ce.shiftRightUnsigned; + ce.shr_u = ce.shiftRightUnsigned; + ce.toSigned = function() { + return this.unsigned ? St(this.low, this.high, false) : this; + }; + ce.toUnsigned = function() { + return this.unsigned ? this : St(this.low, this.high, true); + }; + ce.toBytes = function(e) { + return e ? this.toBytesLE() : this.toBytesBE(); + }; + ce.toBytesLE = function() { + var e = this.high, t10 = this.low; + return [t10 & 255, t10 >>> 8 & 255, t10 >>> 16 & 255, t10 >>> 24, e & 255, e >>> 8 & 255, e >>> 16 & 255, e >>> 24]; + }; + ce.toBytesBE = function() { + var e = this.high, t10 = this.low; + return [e >>> 24, e >>> 16 & 255, e >>> 8 & 255, e & 255, t10 >>> 24, t10 >>> 16 & 255, t10 >>> 8 & 255, t10 & 255]; + }; + wt.fromBytes = function(e, t10, o) { + return o ? wt.fromBytesLE(e, t10) : wt.fromBytesBE(e, t10); + }; + wt.fromBytesLE = function(e, t10) { + return new wt(e[0] | e[1] << 8 | e[2] << 16 | e[3] << 24, e[4] | e[5] << 8 | e[6] << 16 | e[7] << 24, t10); + }; + wt.fromBytesBE = function(e, t10) { + return new wt(e[4] << 24 | e[5] << 16 | e[6] << 8 | e[7], e[0] << 24 | e[1] << 16 | e[2] << 8 | e[3], t10); + }; +}); +var pv = Kt(() => { +}); +var cv = Kt(() => { +}); +var l1 = Kt((c1, hC) => { + (function(r, e, t10) { + function o(i) { + var p = this, u = a(); + p.next = function() { + var c = 2091639 * p.s0 + p.c * 23283064365386963e-26; + return p.s0 = p.s1, p.s1 = p.s2, p.s2 = c - (p.c = c | 0); + }, p.c = 1, p.s0 = u(" "), p.s1 = u(" "), p.s2 = u(" "), p.s0 -= u(i), p.s0 < 0 && (p.s0 += 1), p.s1 -= u(i), p.s1 < 0 && (p.s1 += 1), p.s2 -= u(i), p.s2 < 0 && (p.s2 += 1), u = null; + } + function n(i, p) { + return p.c = i.c, p.s0 = i.s0, p.s1 = i.s1, p.s2 = i.s2, p; + } + function s(i, p) { + var u = new o(i), c = p && p.state, l = u.next; + return l.int32 = function() { + return u.next() * 4294967296 | 0; + }, l.double = function() { + return l() + (l() * 2097152 | 0) * 11102230246251565e-32; + }, l.quick = l, c && (typeof c == "object" && n(c, u), l.state = function() { + return n(u, {}); + }), l; + } + function a() { + var i = 4022871197, p = function(u) { + u = String(u); + for (var c = 0; c < u.length; c++) { + i += u.charCodeAt(c); + var l = 0.02519603282416938 * i; + i = l >>> 0, l -= i, l *= i, i = l >>> 0, l -= i, i += l * 4294967296; + } + return (i >>> 0) * 23283064365386963e-26; + }; + return p; + } + e && e.exports ? e.exports = s : t10 && t10.amd ? t10(function() { + return s; + }) : this.alea = s; + })(c1, typeof hC == "object" && hC, typeof define == "function" && define); +}); +var f1 = Kt((m1, gC) => { + (function(r, e, t10) { + function o(a) { + var i = this, p = ""; + i.x = 0, i.y = 0, i.z = 0, i.w = 0, i.next = function() { + var c = i.x ^ i.x << 11; + return i.x = i.y, i.y = i.z, i.z = i.w, i.w ^= i.w >>> 19 ^ c ^ c >>> 8; + }, a === (a | 0) ? i.x = a : p += a; + for (var u = 0; u < p.length + 64; u++) + i.x ^= p.charCodeAt(u) | 0, i.next(); + } + function n(a, i) { + return i.x = a.x, i.y = a.y, i.z = a.z, i.w = a.w, i; + } + function s(a, i) { + var p = new o(a), u = i && i.state, c = function() { + return (p.next() >>> 0) / 4294967296; + }; + return c.double = function() { + do + var l = p.next() >>> 11, m = (p.next() >>> 0) / 4294967296, f = (l + m) / (1 << 21); + while (f === 0); + return f; + }, c.int32 = p.next, c.quick = c, u && (typeof u == "object" && n(u, p), c.state = function() { + return n(p, {}); + }), c; + } + e && e.exports ? e.exports = s : t10 && t10.amd ? t10(function() { + return s; + }) : this.xor128 = s; + })(m1, typeof gC == "object" && gC, typeof define == "function" && define); +}); +var h1 = Kt((d1, xC) => { + (function(r, e, t10) { + function o(a) { + var i = this, p = ""; + i.next = function() { + var c = i.x ^ i.x >>> 2; + return i.x = i.y, i.y = i.z, i.z = i.w, i.w = i.v, (i.d = i.d + 362437 | 0) + (i.v = i.v ^ i.v << 4 ^ (c ^ c << 1)) | 0; + }, i.x = 0, i.y = 0, i.z = 0, i.w = 0, i.v = 0, a === (a | 0) ? i.x = a : p += a; + for (var u = 0; u < p.length + 64; u++) + i.x ^= p.charCodeAt(u) | 0, u == p.length && (i.d = i.x << 10 ^ i.x >>> 4), i.next(); + } + function n(a, i) { + return i.x = a.x, i.y = a.y, i.z = a.z, i.w = a.w, i.v = a.v, i.d = a.d, i; + } + function s(a, i) { + var p = new o(a), u = i && i.state, c = function() { + return (p.next() >>> 0) / 4294967296; + }; + return c.double = function() { + do + var l = p.next() >>> 11, m = (p.next() >>> 0) / 4294967296, f = (l + m) / (1 << 21); + while (f === 0); + return f; + }, c.int32 = p.next, c.quick = c, u && (typeof u == "object" && n(u, p), c.state = function() { + return n(p, {}); + }), c; + } + e && e.exports ? e.exports = s : t10 && t10.amd ? t10(function() { + return s; + }) : this.xorwow = s; + })(d1, typeof xC == "object" && xC, typeof define == "function" && define); +}); +var x1 = Kt((g1, yC) => { + (function(r, e, t10) { + function o(a) { + var i = this; + i.next = function() { + var u = i.x, c = i.i, l, m, f; + return l = u[c], l ^= l >>> 7, m = l ^ l << 24, l = u[c + 1 & 7], m ^= l ^ l >>> 10, l = u[c + 3 & 7], m ^= l ^ l >>> 3, l = u[c + 4 & 7], m ^= l ^ l << 7, l = u[c + 7 & 7], l = l ^ l << 13, m ^= l ^ l << 9, u[c] = m, i.i = c + 1 & 7, m; + }; + function p(u, c) { + var l, m, f = []; + if (c === (c | 0)) + m = f[0] = c; + else + for (c = "" + c, l = 0; l < c.length; ++l) + f[l & 7] = f[l & 7] << 15 ^ c.charCodeAt(l) + f[l + 1 & 7] << 13; + for (; f.length < 8; ) + f.push(0); + for (l = 0; l < 8 && f[l] === 0; ++l) + ; + for (l == 8 ? m = f[7] = -1 : m = f[l], u.x = f, u.i = 0, l = 256; l > 0; --l) + u.next(); + } + p(i, a); + } + function n(a, i) { + return i.x = a.x.slice(), i.i = a.i, i; + } + function s(a, i) { + a == null && (a = +new Date()); + var p = new o(a), u = i && i.state, c = function() { + return (p.next() >>> 0) / 4294967296; + }; + return c.double = function() { + do + var l = p.next() >>> 11, m = (p.next() >>> 0) / 4294967296, f = (l + m) / (1 << 21); + while (f === 0); + return f; + }, c.int32 = p.next, c.quick = c, u && (u.x && n(u, p), c.state = function() { + return n(p, {}); + }), c; + } + e && e.exports ? e.exports = s : t10 && t10.amd ? t10(function() { + return s; + }) : this.xorshift7 = s; + })(g1, typeof yC == "object" && yC, typeof define == "function" && define); +}); +var b1 = Kt((y1, bC) => { + (function(r, e, t10) { + function o(a) { + var i = this; + i.next = function() { + var u = i.w, c = i.X, l = i.i, m, f; + return i.w = u = u + 1640531527 | 0, f = c[l + 34 & 127], m = c[l = l + 1 & 127], f ^= f << 13, m ^= m << 17, f ^= f >>> 15, m ^= m >>> 12, f = c[l] = f ^ m, i.i = l, f + (u ^ u >>> 16) | 0; + }; + function p(u, c) { + var l, m, f, d, h, g = [], y = 128; + for (c === (c | 0) ? (m = c, c = null) : (c = c + "\0", m = 0, y = Math.max(y, c.length)), f = 0, d = -32; d < y; ++d) + c && (m ^= c.charCodeAt((d + 32) % c.length)), d === 0 && (h = m), m ^= m << 10, m ^= m >>> 15, m ^= m << 4, m ^= m >>> 13, d >= 0 && (h = h + 1640531527 | 0, l = g[d & 127] ^= m + h, f = l == 0 ? f + 1 : 0); + for (f >= 128 && (g[(c && c.length || 0) & 127] = -1), f = 127, d = 4 * 128; d > 0; --d) + m = g[f + 34 & 127], l = g[f = f + 1 & 127], m ^= m << 13, l ^= l << 17, m ^= m >>> 15, l ^= l >>> 12, g[f] = m ^ l; + u.w = h, u.X = g, u.i = f; + } + p(i, a); + } + function n(a, i) { + return i.i = a.i, i.w = a.w, i.X = a.X.slice(), i; + } + function s(a, i) { + a == null && (a = +new Date()); + var p = new o(a), u = i && i.state, c = function() { + return (p.next() >>> 0) / 4294967296; + }; + return c.double = function() { + do + var l = p.next() >>> 11, m = (p.next() >>> 0) / 4294967296, f = (l + m) / (1 << 21); + while (f === 0); + return f; + }, c.int32 = p.next, c.quick = c, u && (u.X && n(u, p), c.state = function() { + return n(p, {}); + }), c; + } + e && e.exports ? e.exports = s : t10 && t10.amd ? t10(function() { + return s; + }) : this.xor4096 = s; + })(y1, typeof bC == "object" && bC, typeof define == "function" && define); +}); +var I1 = Kt((C1, CC) => { + (function(r, e, t10) { + function o(a) { + var i = this, p = ""; + i.next = function() { + var c = i.b, l = i.c, m = i.d, f = i.a; + return c = c << 25 ^ c >>> 7 ^ l, l = l - m | 0, m = m << 24 ^ m >>> 8 ^ f, f = f - c | 0, i.b = c = c << 20 ^ c >>> 12 ^ l, i.c = l = l - m | 0, i.d = m << 16 ^ l >>> 16 ^ f, i.a = f - c | 0; + }, i.a = 0, i.b = 0, i.c = -1640531527, i.d = 1367130551, a === Math.floor(a) ? (i.a = a / 4294967296 | 0, i.b = a | 0) : p += a; + for (var u = 0; u < p.length + 20; u++) + i.b ^= p.charCodeAt(u) | 0, i.next(); + } + function n(a, i) { + return i.a = a.a, i.b = a.b, i.c = a.c, i.d = a.d, i; + } + function s(a, i) { + var p = new o(a), u = i && i.state, c = function() { + return (p.next() >>> 0) / 4294967296; + }; + return c.double = function() { + do + var l = p.next() >>> 11, m = (p.next() >>> 0) / 4294967296, f = (l + m) / (1 << 21); + while (f === 0); + return f; + }, c.int32 = p.next, c.quick = c, u && (typeof u == "object" && n(u, p), c.state = function() { + return n(p, {}); + }), c; + } + e && e.exports ? e.exports = s : t10 && t10.amd ? t10(function() { + return s; + }) : this.tychei = s; + })(C1, typeof CC == "object" && CC, typeof define == "function" && define); +}); +var w1 = Kt(() => { +}); +var v1 = Kt((S1, Of) => { + (function(r, e, t10) { + var o = 256, n = 6, s = 52, a = "random", i = t10.pow(o, n), p = t10.pow(2, s), u = p * 2, c = o - 1, l; + function m(C, w, k) { + var _ = []; + w = w == true ? { entropy: true } : w || {}; + var E = g(h(w.entropy ? [C, b(e)] : C == null ? y() : C, 3), _), R = new f(_), A = function() { + for (var D = R.g(n), O = i, M = 0; D < p; ) + D = (D + M) * o, O *= o, M = R.g(1); + for (; D >= u; ) + D /= 2, O /= 2, M >>>= 1; + return (D + M) / O; + }; + return A.int32 = function() { + return R.g(4) | 0; + }, A.quick = function() { + return R.g(4) / 4294967296; + }, A.double = A, g(b(R.S), e), (w.pass || k || function(D, O, M, L) { + return L && (L.S && d(L, R), D.state = function() { + return d(R, {}); + }), M ? (t10[a] = D, O) : D; + })(A, E, "global" in w ? w.global : this == t10, w.state); + } + function f(C) { + var w, k = C.length, _ = this, E = 0, R = _.i = _.j = 0, A = _.S = []; + for (k || (C = [k++]); E < o; ) + A[E] = E++; + for (E = 0; E < o; E++) + A[E] = A[R = c & R + C[E % k] + (w = A[E])], A[R] = w; + (_.g = function(D) { + for (var O, M = 0, L = _.i, W = _.j, V = _.S; D--; ) + O = V[L = c & L + 1], M = M * o + V[c & (V[L] = V[W = c & W + O]) + (V[W] = O)]; + return _.i = L, _.j = W, M; + })(o); + } + function d(C, w) { + return w.i = C.i, w.j = C.j, w.S = C.S.slice(), w; + } + function h(C, w) { + var k = [], _ = typeof C, E; + if (w && _ == "object") + for (E in C) + try { + k.push(h(C[E], w - 1)); + } catch (R) { + } + return k.length ? k : _ == "string" ? C : C + "\0"; + } + function g(C, w) { + for (var k = C + "", _, E = 0; E < k.length; ) + w[c & E] = c & (_ ^= w[c & E] * 19) + k.charCodeAt(E++); + return b(w); + } + function y() { + try { + var C; + return l && (C = l.randomBytes) ? C = C(o) : (C = new Uint8Array(o), (r.crypto || r.msCrypto).getRandomValues(C)), b(C); + } catch (_) { + var w = r.navigator, k = w && w.plugins; + return [+new Date(), r, k, r.screen, b(e)]; + } + } + function b(C) { + return String.fromCharCode.apply(0, C); + } + if (g(t10.random(), e), typeof Of == "object" && Of.exports) { + Of.exports = m; + try { + l = w1(); + } catch (C) { + } + } else + typeof define == "function" && define.amd ? define(function() { + return m; + }) : t10["seed" + a] = m; + })(typeof self != "undefined" ? self : S1, [], Math); +}); +var IC = Kt((_we, k1) => { + var F4 = l1(), D4 = f1(), P4 = h1(), O4 = x1(), M4 = b1(), L4 = I1(), fu = v1(); + fu.alea = F4; + fu.xor128 = D4; + fu.xorwow = P4; + fu.xorshift7 = O4; + fu.xor4096 = M4; + fu.tychei = L4; + k1.exports = fu; +}); +var Vl = Kt(() => { +}); +var Qw = Kt(() => { +}); +var D3 = Kt(() => { +}); +var P3 = Kt(() => { +}); +var O3 = Kt(() => { +}); +var M3 = Kt((Fg, Jw) => { + var Zw = (() => { + var r = typeof document != "undefined" && document.currentScript ? document.currentScript.src : void 0; + return typeof __filename != "undefined" && (r = r || __filename), function(e) { + e = e || {}; + function t10() { + return Q.buffer != De && Tt(Q.buffer), ft; + } + function o() { + return Q.buffer != De && Tt(Q.buffer), at; + } + function n() { + return Q.buffer != De && Tt(Q.buffer), dt; + } + function s() { + return Q.buffer != De && Tt(Q.buffer), Fr; + } + function a() { + return Q.buffer != De && Tt(Q.buffer), Pt; + } + function i() { + return Q.buffer != De && Tt(Q.buffer), jr; + } + function p() { + return Q.buffer != De && Tt(Q.buffer), er; + } + var u = typeof e != "undefined" ? e : {}, c, l; + u.ready = new Promise(function(F, B) { + c = F, l = B; + }); + var m; + typeof process != "undefined" && process.listeners && (m = { uncaughtException: process.listeners("uncaughtException"), unhandledRejection: process.listeners("unhandledRejection") }); + var f = Object.assign({}, u), d = [], h = "./this.program", g = (F, B) => { + throw B; + }, y = typeof window == "object", b = typeof importScripts == "function", C = typeof process == "object" && typeof process.versions == "object" && typeof process.versions.node == "string", w = u.ENVIRONMENT_IS_PTHREAD || false, k = ""; + function _(F) { + return u.locateFile ? u.locateFile(F, k) : k + F; + } + var E, R, A, D; + function O(F) { + if (F instanceof Di) + return; + q("exiting due to exception: " + F); + } + if (C) { + b ? k = Vl().dirname(k) + "/" : k = __dirname + "/"; + var M, L; + typeof Em == "function" && (M = Qw(), L = Vl()), E = (B, re) => (B = L.normalize(B), M.readFileSync(B, re ? void 0 : "utf8")), A = (B) => { + var re = E(B, true); + return re.buffer || (re = new Uint8Array(re)), re; + }, R = (B, re, le) => { + B = L.normalize(B), M.readFile(B, function(Te, Ze) { + Te ? le(Te) : re(Ze.buffer); + }); + }, process.argv.length > 1 && (h = process.argv[1].replace(/\\/g, "/")), d = process.argv.slice(2), process.on("uncaughtException", function(B) { + if (!(B instanceof Di)) + throw B; + }), process.on("unhandledRejection", function(B) { + throw B; + }), g = (B, re) => { + if (tn()) + throw process.exitCode = B, re; + O(re), process.exit(B); + }, u.inspect = function() { + return "[Emscripten Module object]"; + }; + let F; + try { + F = D3(); + } catch (B) { + throw console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?'), B; + } + global.Worker = F.Worker; + } else + (y || b) && (b ? k = self.location.href : typeof document != "undefined" && document.currentScript && (k = document.currentScript.src), typeof r != "undefined" && r && (k = r), k.indexOf("blob:") !== 0 ? k = k.substr(0, k.replace(/[?#].*/, "").lastIndexOf("/") + 1) : k = "", C || (E = (F) => { + var B = new XMLHttpRequest(); + return B.open("GET", F, false), B.send(null), B.responseText; + }, b && (A = (F) => { + var B = new XMLHttpRequest(); + return B.open("GET", F, false), B.responseType = "arraybuffer", B.send(null), new Uint8Array(B.response); + }), R = (F, B, re) => { + var le = new XMLHttpRequest(); + le.open("GET", F, true), le.responseType = "arraybuffer", le.onload = () => { + if (le.status == 200 || le.status == 0 && le.response) { + B(le.response); + return; + } + re(); + }, le.onerror = re, le.send(null); + }), D = (F) => document.title = F); + C && typeof performance == "undefined" && (global.performance = P3().performance); + var W = console.log.bind(console), V = console.warn.bind(console); + C && (W = (F) => M.writeSync(1, F + ` +`), V = (F) => M.writeSync(2, F + ` +`)); + var G = u.print || W, q = u.printErr || V; + Object.assign(u, f), f = null, u.arguments && (d = u.arguments), u.thisProgram && (h = u.thisProgram), u.quit && (g = u.quit); + var H = 4, j = Atomics.load, Y = Atomics.store, Z = Atomics.compareExchange, ee; + u.wasmBinary && (ee = u.wasmBinary); + var X = u.noExitRuntime || true; + typeof WebAssembly != "object" && Xu("no native wasm support detected"); + var Q, se, ie = false, de; + function Ie(F, B) { + F || Xu(B); + } + var Se = typeof TextDecoder != "undefined" ? new TextDecoder("utf8") : void 0; + function Ee(F, B, re) { + for (var le = B + re, Te = B; F[Te] && !(Te >= le); ) + ++Te; + if (Te - B > 16 && F.buffer && Se) + return Se.decode(F.buffer instanceof SharedArrayBuffer ? F.slice(B, Te) : F.subarray(B, Te)); + for (var Ze = ""; B < Te; ) { + var $e = F[B++]; + if (!($e & 128)) { + Ze += String.fromCharCode($e); + continue; + } + var Pe = F[B++] & 63; + if (($e & 224) == 192) { + Ze += String.fromCharCode(($e & 31) << 6 | Pe); + continue; + } + var Wt = F[B++] & 63; + if (($e & 240) == 224 ? $e = ($e & 15) << 12 | Pe << 6 | Wt : $e = ($e & 7) << 18 | Pe << 12 | Wt << 6 | F[B++] & 63, $e < 65536) + Ze += String.fromCharCode($e); + else { + var Zr = $e - 65536; + Ze += String.fromCharCode(55296 | Zr >> 10, 56320 | Zr & 1023); + } + } + return Ze; + } + function Me(F, B) { + return F ? Ee(o(), F, B) : ""; + } + function st(F, B, re, le) { + if (!(le > 0)) + return 0; + for (var Te = re, Ze = re + le - 1, $e = 0; $e < F.length; ++$e) { + var Pe = F.charCodeAt($e); + if (Pe >= 55296 && Pe <= 57343) { + var Wt = F.charCodeAt(++$e); + Pe = 65536 + ((Pe & 1023) << 10) | Wt & 1023; + } + if (Pe <= 127) { + if (re >= Ze) + break; + B[re++] = Pe; + } else if (Pe <= 2047) { + if (re + 1 >= Ze) + break; + B[re++] = 192 | Pe >> 6, B[re++] = 128 | Pe & 63; + } else if (Pe <= 65535) { + if (re + 2 >= Ze) + break; + B[re++] = 224 | Pe >> 12, B[re++] = 128 | Pe >> 6 & 63, B[re++] = 128 | Pe & 63; + } else { + if (re + 3 >= Ze) + break; + B[re++] = 240 | Pe >> 18, B[re++] = 128 | Pe >> 12 & 63, B[re++] = 128 | Pe >> 6 & 63, B[re++] = 128 | Pe & 63; + } + } + return B[re] = 0, re - Te; + } + function pt(F, B, re) { + return st(F, o(), B, re); + } + var De, ft, at, dt, It, Fr, Pt, jr, er; + w && (De = u.buffer); + function Tt(F) { + De = F, u.HEAP8 = ft = new Int8Array(F), u.HEAP16 = dt = new Int16Array(F), u.HEAP32 = Fr = new Int32Array(F), u.HEAPU8 = at = new Uint8Array(F), u.HEAPU16 = It = new Uint16Array(F), u.HEAPU32 = Pt = new Uint32Array(F), u.HEAPF32 = jr = new Float32Array(F), u.HEAPF64 = er = new Float64Array(F); + } + var tr = u.INITIAL_MEMORY || 16777216; + if (w) + Q = u.wasmMemory, De = u.buffer; + else if (u.wasmMemory) + Q = u.wasmMemory; + else if (Q = new WebAssembly.Memory({ initial: tr / 65536, maximum: 32768, shared: true }), !(Q.buffer instanceof SharedArrayBuffer)) + throw q("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"), C && console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)"), Error("bad memory"); + Q && (De = Q.buffer), tr = De.byteLength, Tt(De); + var rr, Xr = [], Yr = [], pr = [], Qs = false; + function tn() { + return X; + } + function Ua() { + if (u.preRun) + for (typeof u.preRun == "function" && (u.preRun = [u.preRun]); u.preRun.length; ) + Lc(u.preRun.shift()); + Uc(Xr); + } + function jt() { + Qs = true, !w && Uc(Yr); + } + function Zs() { + if (!w) { + if (u.postRun) + for (typeof u.postRun == "function" && (u.postRun = [u.postRun]); u.postRun.length; ) + KS(u.postRun.shift()); + Uc(pr); + } + } + function Lc(F) { + Xr.unshift(F); + } + function Bc(F) { + Yr.unshift(F); + } + function KS(F) { + pr.unshift(F); + } + var Ga = 0, ju = null, Js = null; + function jS(F) { + Ga++, u.monitorRunDependencies && u.monitorRunDependencies(Ga); + } + function XS(F) { + if (Ga--, u.monitorRunDependencies && u.monitorRunDependencies(Ga), Ga == 0 && (ju !== null && (clearInterval(ju), ju = null), Js)) { + var B = Js; + Js = null, B(); + } + } + function Xu(F) { + w ? postMessage({ cmd: "onAbort", arg: F }) : u.onAbort && u.onAbort(F), F = "Aborted(" + F + ")", q(F), ie = true, de = 1, F += ". Build with -sASSERTIONS for more info."; + var B = new WebAssembly.RuntimeError(F); + throw l(B), B; + } + var $x = "data:application/octet-stream;base64,"; + function nm(F) { + return F.startsWith($x); + } + function Vc(F) { + return F.startsWith("file://"); + } + var dr; + dr = "tfjs-backend-wasm-threaded-simd.wasm", nm(dr) || (dr = _(dr)); + function sm(F) { + try { + if (F == dr && ee) + return new Uint8Array(ee); + if (A) + return A(F); + throw "both async and sync fetching of the wasm failed"; + } catch (B) { + Xu(B); + } + } + function Rx() { + if (!ee && (y || b)) { + if (typeof fetch == "function" && !Vc(dr)) + return fetch(dr, { credentials: "same-origin" }).then(function(F) { + if (!F.ok) + throw "failed to load wasm binary file at '" + dr + "'"; + return F.arrayBuffer(); + }).catch(function() { + return sm(dr); + }); + if (R) + return new Promise(function(F, B) { + R(dr, function(re) { + F(new Uint8Array(re)); + }, B); + }); + } + return Promise.resolve().then(function() { + return sm(dr); + }); + } + function Ax() { + var F = { env: xm, wasi_snapshot_preview1: xm }; + function B($e, Pe) { + var Wt = $e.exports; + if (u.asm = Wt, Wx(u.asm._emscripten_tls_init), rr = u.asm.__indirect_function_table, Bc(u.asm.__wasm_call_ctors), se = Pe, !w) { + var Zr = Fe.unusedWorkers.length; + Fe.unusedWorkers.forEach(function(ta) { + Fe.loadWasmModuleToWorker(ta, function() { + --Zr || XS("wasm-instantiate"); + }); + }); + } + } + w || jS("wasm-instantiate"); + function re($e) { + B($e.instance, $e.module); + } + function le($e) { + return Rx().then(function(Pe) { + return WebAssembly.instantiate(Pe, F); + }).then(function(Pe) { + return Pe; + }).then($e, function(Pe) { + q("failed to asynchronously prepare wasm: " + Pe), Xu(Pe); + }); + } + function Te() { + return !ee && typeof WebAssembly.instantiateStreaming == "function" && !nm(dr) && !Vc(dr) && !C && typeof fetch == "function" ? fetch(dr, { credentials: "same-origin" }).then(function($e) { + var Pe = WebAssembly.instantiateStreaming($e, F); + return Pe.then(re, function(Wt) { + return q("wasm streaming compile failed: " + Wt), q("falling back to ArrayBuffer instantiation"), le(re); + }); + }) : le(re); + } + if (u.instantiateWasm) + try { + var Ze = u.instantiateWasm(F, B); + return Ze; + } catch ($e) { + q("Module.instantiateWasm callback failed with error: " + $e), l($e); + } + return Te().catch(l), {}; + } + var Fx, YS, Dx = {}; + function Di(F) { + this.name = "ExitStatus", this.message = "Program terminated with exit(" + F + ")", this.status = F; + } + function Px(F) { + var B = Fe.pthreads[F]; + delete Fe.pthreads[F], B.terminate(), cb(F), Fe.runningWorkers.splice(Fe.runningWorkers.indexOf(B), 1), B.pthread_ptr = 0; + } + function Ox(F) { + var B = Fe.pthreads[F]; + B.postMessage({ cmd: "cancel" }); + } + function zc(F) { + var B = Fe.pthreads[F]; + Ie(B), Fe.returnWorkerToPool(B); + } + function am(F) { + var B = Fe.getNewWorker(); + if (!B) + return 6; + Fe.runningWorkers.push(B), Fe.pthreads[F.pthread_ptr] = B, B.pthread_ptr = F.pthread_ptr; + var re = { cmd: "run", start_routine: F.startRoutine, arg: F.arg, pthread_ptr: F.pthread_ptr }; + return B.runPthread = () => { + re.time = performance.now(), B.postMessage(re, F.transferList); + }, B.loaded && (B.runPthread(), delete B.runPthread), 0; + } + var im = { varargs: void 0, get: function() { + im.varargs += 4; + var F = s()[im.varargs - 4 >> 2]; + return F; + }, getStr: function(F) { + var B = Me(F); + return B; + } }; + function Wc(F) { + if (w) + return Ha(1, 1, F); + de = F, tn() || (Fe.terminateAllThreads(), u.onExit && u.onExit(F), ie = true), g(F, new Di(F)); + } + function QS(F, B) { + if (de = F, !B && w) + throw pm(F), "unwind"; + Wc(F); + } + var um = QS; + function Mx(F) { + if (F instanceof Di || F == "unwind") + return de; + g(1, F); + } + var Fe = { unusedWorkers: [], runningWorkers: [], tlsInitFunctions: [], pthreads: {}, init: function() { + w ? Fe.initWorker() : Fe.initMainThread(); + }, initMainThread: function() { + for (var F = 8; F--; ) + Fe.allocateUnusedWorker(); + }, initWorker: function() { + X = false; + }, setExitStatus: function(F) { + de = F; + }, terminateAllThreads: function() { + for (var F of Object.values(Fe.pthreads)) + Fe.returnWorkerToPool(F); + for (var F of Fe.unusedWorkers) + F.terminate(); + Fe.unusedWorkers = []; + }, returnWorkerToPool: function(F) { + var B = F.pthread_ptr; + delete Fe.pthreads[B], Fe.unusedWorkers.push(F), Fe.runningWorkers.splice(Fe.runningWorkers.indexOf(F), 1), F.pthread_ptr = 0, cb(B); + }, receiveObjectTransfer: function(F) { + }, threadInitTLS: function() { + Fe.tlsInitFunctions.forEach((F) => F()); + }, loadWasmModuleToWorker: function(F, B) { + F.onmessage = (re) => { + var le = re.data, Te = le.cmd; + if (F.pthread_ptr && (Fe.currentProxiedOperationCallerThread = F.pthread_ptr), le.targetThread && le.targetThread != Sm()) { + var Ze = Fe.pthreads[le.targetThread]; + Ze ? Ze.postMessage(le, le.transferList) : q('Internal error! Worker sent a message "' + Te + '" to target pthread ' + le.targetThread + ", but that thread no longer exists!"), Fe.currentProxiedOperationCallerThread = void 0; + return; + } + Te === "processProxyingQueue" ? Gc(le.queue) : Te === "spawnThread" ? am(le) : Te === "cleanupThread" ? zc(le.thread) : Te === "killThread" ? Px(le.thread) : Te === "cancelThread" ? Ox(le.thread) : Te === "loaded" ? (F.loaded = true, B && B(F), F.runPthread && (F.runPthread(), delete F.runPthread)) : Te === "print" ? G("Thread " + le.threadId + ": " + le.text) : Te === "printErr" ? q("Thread " + le.threadId + ": " + le.text) : Te === "alert" ? alert("Thread " + le.threadId + ": " + le.text) : le.target === "setimmediate" ? F.postMessage(le) : Te === "onAbort" ? u.onAbort && u.onAbort(le.arg) : Te && q("worker sent an unknown command " + Te), Fe.currentProxiedOperationCallerThread = void 0; + }, F.onerror = (re) => { + var le = "worker sent an error!"; + throw q(le + " " + re.filename + ":" + re.lineno + ": " + re.message), re; + }, C && (F.on("message", function(re) { + F.onmessage({ data: re }); + }), F.on("error", function(re) { + F.onerror(re); + }), F.on("detachedExit", function() { + })), F.postMessage({ cmd: "load", urlOrBlob: u.mainScriptUrlOrBlob || r, wasmMemory: Q, wasmModule: se }); + }, allocateUnusedWorker: function() { + var F = _("tfjs-backend-wasm-threaded-simd.worker.js"); + Fe.unusedWorkers.push(new Worker(F)); + }, getNewWorker: function() { + return Fe.unusedWorkers.length == 0 && (Fe.allocateUnusedWorker(), Fe.loadWasmModuleToWorker(Fe.unusedWorkers[0])), Fe.unusedWorkers.pop(); + } }; + u.PThread = Fe; + function Uc(F) { + for (; F.length > 0; ) + F.shift()(u); + } + function Lx(F) { + var B = lb(), re = F(); + return vm(B), re; + } + function ZS(F) { + return F; + } + function JS(F) { + var B = /\b_Z[\w\d_]+/g; + return F.replace(B, function(re) { + var le = re; + return re === le ? re : le + " [" + re + "]"; + }); + } + function Bx() { + var F = Sm(), B = s()[F + 44 >> 2], re = s()[F + 48 >> 2], le = B - re; + a0(B, le), vm(B); + } + u.establishStackSpace = Bx; + function pm(F) { + if (w) + return Ha(2, 0, F); + try { + um(F); + } catch (B) { + Mx(B); + } + } + var Yu = []; + function Vx(F) { + var B = Yu[F]; + return B || (F >= Yu.length && (Yu.length = F + 1), Yu[F] = B = rr.get(F)), B; + } + function zx(F, B) { + var re = Vx(F)(B); + tn() ? Fe.setExitStatus(re) : s0(re); + } + u.invokeEntryPoint = zx; + function e0() { + var F = new Error(); + if (!F.stack) { + try { + throw new Error(); + } catch (B) { + F = B; + } + if (!F.stack) + return "(no stack trace available)"; + } + return F.stack.toString(); + } + function Wx(F) { + Fe.tlsInitFunctions.push(F); + } + function Ux(F, B) { + t10().set(F, B); + } + function Gx(F) { + r0(F, !b, 1, !y), Fe.threadInitTLS(); + } + function Hx(F) { + w ? postMessage({ cmd: "cleanupThread", thread: F }) : zc(F); + } + function cm(F, B, re, le) { + return w ? Ha(3, 1, F, B, re, le) : lm(F, B, re, le); + } + function lm(F, B, re, le) { + if (typeof SharedArrayBuffer == "undefined") + return q("Current environment does not support SharedArrayBuffer, pthreads are not available!"), 6; + var Te = [], Ze = 0; + if (w && (Te.length === 0 || Ze)) + return cm(F, B, re, le); + if (Ze) + return Ze; + var $e = { startRoutine: re, pthread_ptr: F, arg: le, transferList: Te }; + return w ? ($e.cmd = "spawnThread", postMessage($e, Te), 0) : am($e); + } + function qx() { + return 2097152; + } + var Kx = true; + function jx() { + return Kx; + } + function Gc(F) { + Atomics.store(s(), F >> 2, 1), Sm() && n0(F), Atomics.compareExchange(s(), F >> 2, 1, 0); + } + u.executeNotifiedProxyingQueue = Gc; + function Xx(F, B, re, le) { + if (F == B) + setTimeout(() => Gc(le)); + else if (w) + postMessage({ targetThread: F, cmd: "processProxyingQueue", queue: le }); + else { + var Te = Fe.pthreads[F]; + if (!Te) + return; + Te.postMessage({ cmd: "processProxyingQueue", queue: le }); + } + return 1; + } + function Yx(F, B, re) { + return -1; + } + function Qx() { + Xu(""); + } + function Pi(F) { + Pi.shown || (Pi.shown = {}), Pi.shown[F] || (Pi.shown[F] = 1, C && (F = "warning: " + F), q(F)); + } + function Zx() { + C || b || Pi("Blocking on the main thread is very dangerous, see https://emscripten.org/docs/porting/pthreads.html#blocking-on-the-main-browser-thread"); + } + function Jx() { + return Date.now(); + } + function mm() { + return 2147483648; + } + function ey() { + return mm(); + } + var Qu; + C ? Qu = () => { + var F = process.hrtime(); + return F[0] * 1e3 + F[1] / 1e6; + } : w ? Qu = () => performance.now() - u.__performance_now_clock_drift : Qu = () => performance.now(); + function ty(F, B, re) { + o().copyWithin(F, B, B + re); + } + function ry() { + return C ? O3().cpus().length : navigator.hardwareConcurrency; + } + function Ha(F, B) { + var re = arguments.length - 2, le = arguments; + return Lx(() => { + for (var Te = re, Ze = km(Te * 8), $e = Ze >> 3, Pe = 0; Pe < re; Pe++) { + var Wt = le[2 + Pe]; + p()[$e + Pe] = Wt; + } + return o0(F, Te, Ze, B); + }); + } + var Hc = []; + function oy(F, B, re) { + Hc.length = B; + for (var le = re >> 3, Te = 0; Te < B; Te++) + Hc[Te] = p()[le + Te]; + var Ze = F < 0, $e = Ze ? Dx[-F - 1] : ly[F]; + return $e.apply(null, Hc); + } + function ny(F) { + try { + return Q.grow(F - De.byteLength + 65535 >>> 16), Tt(Q.buffer), 1; + } catch (B) { + } + } + function sy(F) { + var B = o().length; + if (F = F >>> 0, F <= B) + return false; + var re = mm(); + if (F > re) + return false; + let le = (Wt, Zr) => Wt + (Zr - Wt % Zr) % Zr; + for (var Te = 1; Te <= 4; Te *= 2) { + var Ze = B * (1 + 0.2 / Te); + Ze = Math.min(Ze, F + 100663296); + var $e = Math.min(re, le(Math.max(F, Ze), 65536)), Pe = ny($e); + if (Pe) + return true; + } + return false; + } + function ay() { + throw "unwind"; + } + function fm(F) { + return w ? Ha(4, 1, F) : 52; + } + function dm(F, B, re, le, Te) { + return w ? Ha(5, 1, F, B, re, le, Te) : 70; + } + var iy = [null, [], []]; + function uy(F, B) { + var re = iy[F]; + B === 0 || B === 10 ? ((F === 1 ? G : q)(Ee(re, 0)), re.length = 0) : re.push(B); + } + function hm(F, B, re, le) { + if (w) + return Ha(6, 1, F, B, re, le); + for (var Te = 0, Ze = 0; Ze < re; Ze++) { + var $e = a()[B >> 2], Pe = a()[B + 4 >> 2]; + B += 8; + for (var Wt = 0; Wt < Pe; Wt++) + uy(F, o()[$e + Wt]); + Te += Pe; + } + return a()[le >> 2] = Te, 0; + } + function gm(F) { + var B = u["_" + F]; + return B; + } + function py(F, B, re, le, Te) { + var Ze = { string: (Dr) => { + var tp = 0; + if (Dr != null && Dr !== 0) { + var p0 = (Dr.length << 2) + 1; + tp = km(p0), pt(Dr, tp, p0); + } + return tp; + }, array: (Dr) => { + var tp = km(Dr.length); + return Ux(Dr, tp), tp; + } }; + function $e(Dr) { + return B === "string" ? Me(Dr) : B === "boolean" ? Boolean(Dr) : Dr; + } + var Pe = gm(F), Wt = [], Zr = 0; + if (le) + for (var ta = 0; ta < le.length; ta++) { + var u0 = Ze[re[ta]]; + u0 ? (Zr === 0 && (Zr = lb()), Wt[ta] = u0(le[ta])) : Wt[ta] = le[ta]; + } + var mb = Pe.apply(null, Wt); + function YV(Dr) { + return Zr !== 0 && vm(Zr), $e(Dr); + } + return mb = YV(mb), mb; + } + function cy(F, B, re, le) { + re = re || []; + var Te = re.every(($e) => $e === "number" || $e === "boolean"), Ze = B !== "string"; + return Ze && Te && !le ? gm(F) : function() { + return py(F, B, re, arguments, le); + }; + } + Fe.init(); + var ly = [null, Wc, pm, cm, fm, dm, hm], xm = { __emscripten_init_main_thread_js: Gx, __emscripten_thread_cleanup: Hx, __pthread_create_js: lm, _emscripten_default_pthread_stack_size: qx, _emscripten_get_now_is_monotonic: jx, _emscripten_notify_task_queue: Xx, _emscripten_set_offscreencanvas_size: Yx, abort: Qx, emscripten_check_blocking_allowed: Zx, emscripten_date_now: Jx, emscripten_get_heap_max: ey, emscripten_get_now: Qu, emscripten_memcpy_big: ty, emscripten_num_logical_cores: ry, emscripten_receive_on_main_thread_js: oy, emscripten_resize_heap: sy, emscripten_unwind_to_js_event_loop: ay, exit: um, fd_close: fm, fd_seek: dm, fd_write: hm, memory: Q || u.wasmMemory }, t0 = Ax(), my = u.___wasm_call_ctors = function() { + return (my = u.___wasm_call_ctors = u.asm.__wasm_call_ctors).apply(null, arguments); + }, fy = u._init = function() { + return (fy = u._init = u.asm.init).apply(null, arguments); + }, dy = u._init_with_threads_count = function() { + return (dy = u._init_with_threads_count = u.asm.init_with_threads_count).apply(null, arguments); + }, hy = u._get_threads_count = function() { + return (hy = u._get_threads_count = u.asm.get_threads_count).apply(null, arguments); + }, gy = u._register_tensor = function() { + return (gy = u._register_tensor = u.asm.register_tensor).apply(null, arguments); + }, xy = u._dispose_data = function() { + return (xy = u._dispose_data = u.asm.dispose_data).apply(null, arguments); + }, yy = u._dispose = function() { + return (yy = u._dispose = u.asm.dispose).apply(null, arguments); + }, by = u._Abs = function() { + return (by = u._Abs = u.asm.Abs).apply(null, arguments); + }, Cy = u._Add = function() { + return (Cy = u._Add = u.asm.Add).apply(null, arguments); + }, Iy = u._AddN = function() { + return (Iy = u._AddN = u.asm.AddN).apply(null, arguments); + }, wy = u._All = function() { + return (wy = u._All = u.asm.All).apply(null, arguments); + }, Sy = u._Any = function() { + return (Sy = u._Any = u.asm.Any).apply(null, arguments); + }, vy = u._ArgMax = function() { + return (vy = u._ArgMax = u.asm.ArgMax).apply(null, arguments); + }, ky = u._AvgPool = function() { + return (ky = u._AvgPool = u.asm.AvgPool).apply(null, arguments); + }, Ty = u._BatchMatMul = function() { + return (Ty = u._BatchMatMul = u.asm.BatchMatMul).apply(null, arguments); + }, Ny = u._Ceil = function() { + return (Ny = u._Ceil = u.asm.Ceil).apply(null, arguments); + }, _y = u._ClipByValue = function() { + return (_y = u._ClipByValue = u.asm.ClipByValue).apply(null, arguments); + }, Ey = u._Conv2D = function() { + return (Ey = u._Conv2D = u.asm.Conv2D).apply(null, arguments); + }, $y = u._Conv2DBackpropInput = function() { + return ($y = u._Conv2DBackpropInput = u.asm.Conv2DBackpropInput).apply(null, arguments); + }, Ry = u._Cos = function() { + return (Ry = u._Cos = u.asm.Cos).apply(null, arguments); + }, Ay = u._Cosh = function() { + return (Ay = u._Cosh = u.asm.Cosh).apply(null, arguments); + }, Fy = u._CropAndResize = function() { + return (Fy = u._CropAndResize = u.asm.CropAndResize).apply(null, arguments); + }, Dy = u._Cumprod = function() { + return (Dy = u._Cumprod = u.asm.Cumprod).apply(null, arguments); + }, Py = u._Cumsum = function() { + return (Py = u._Cumsum = u.asm.Cumsum).apply(null, arguments); + }, Oy = u._DepthToSpace = function() { + return (Oy = u._DepthToSpace = u.asm.DepthToSpace).apply(null, arguments); + }, My = u._DepthwiseConv2dNative = function() { + return (My = u._DepthwiseConv2dNative = u.asm.DepthwiseConv2dNative).apply(null, arguments); + }, Ly = u._Elu = function() { + return (Ly = u._Elu = u.asm.Elu).apply(null, arguments); + }, By = u._Equal = function() { + return (By = u._Equal = u.asm.Equal).apply(null, arguments); + }, Vy = u._Exp = function() { + return (Vy = u._Exp = u.asm.Exp).apply(null, arguments); + }, zy = u._FlipLeftRight = function() { + return (zy = u._FlipLeftRight = u.asm.FlipLeftRight).apply(null, arguments); + }, Wy = u._Floor = function() { + return (Wy = u._Floor = u.asm.Floor).apply(null, arguments); + }, Uy = u._FloorDiv = function() { + return (Uy = u._FloorDiv = u.asm.FloorDiv).apply(null, arguments); + }, Gy = u._FusedBatchNorm = function() { + return (Gy = u._FusedBatchNorm = u.asm.FusedBatchNorm).apply(null, arguments); + }, Hy = u._FusedConv2D = function() { + return (Hy = u._FusedConv2D = u.asm.FusedConv2D).apply(null, arguments); + }, qy = u._FusedDepthwiseConv2D = function() { + return (qy = u._FusedDepthwiseConv2D = u.asm.FusedDepthwiseConv2D).apply(null, arguments); + }, Ky = u._Gather = function() { + return (Ky = u._Gather = u.asm.Gather).apply(null, arguments); + }, jy = u._GatherNd = function() { + return (jy = u._GatherNd = u.asm.GatherNd).apply(null, arguments); + }, Xy = u._Greater = function() { + return (Xy = u._Greater = u.asm.Greater).apply(null, arguments); + }, Yy = u._GreaterEqual = function() { + return (Yy = u._GreaterEqual = u.asm.GreaterEqual).apply(null, arguments); + }, Qy = u._LeakyRelu = function() { + return (Qy = u._LeakyRelu = u.asm.LeakyRelu).apply(null, arguments); + }, Zy = u._Less = function() { + return (Zy = u._Less = u.asm.Less).apply(null, arguments); + }, Jy = u._LessEqual = function() { + return (Jy = u._LessEqual = u.asm.LessEqual).apply(null, arguments); + }, eb = u._Log = function() { + return (eb = u._Log = u.asm.Log).apply(null, arguments); + }, tb = u._LogicalAnd = function() { + return (tb = u._LogicalAnd = u.asm.LogicalAnd).apply(null, arguments); + }, rb = u._LogicalNot = function() { + return (rb = u._LogicalNot = u.asm.LogicalNot).apply(null, arguments); + }, ob = u._LogicalOr = function() { + return (ob = u._LogicalOr = u.asm.LogicalOr).apply(null, arguments); + }, nb = u._LogicalXor = function() { + return (nb = u._LogicalXor = u.asm.LogicalXor).apply(null, arguments); + }, sb = u._Max = function() { + return (sb = u._Max = u.asm.Max).apply(null, arguments); + }, ym = u._MaxPool = function() { + return (ym = u._MaxPool = u.asm.MaxPool).apply(null, arguments); + }, bm = u._Maximum = function() { + return (bm = u._Maximum = u.asm.Maximum).apply(null, arguments); + }, qc = u._Mean = function() { + return (qc = u._Mean = u.asm.Mean).apply(null, arguments); + }, ab = u._Min = function() { + return (ab = u._Min = u.asm.Min).apply(null, arguments); + }, ib = u._Minimum = function() { + return (ib = u._Minimum = u.asm.Minimum).apply(null, arguments); + }, Zu = u._MirrorPad = function() { + return (Zu = u._MirrorPad = u.asm.MirrorPad).apply(null, arguments); + }, Cm = u._Multiply = function() { + return (Cm = u._Multiply = u.asm.Multiply).apply(null, arguments); + }, Ju = u._Neg = function() { + return (Ju = u._Neg = u.asm.Neg).apply(null, arguments); + }, ep = u._NonMaxSuppressionV3 = function() { + return (ep = u._NonMaxSuppressionV3 = u.asm.NonMaxSuppressionV3).apply(null, arguments); + }, ub = u._NonMaxSuppressionV4 = function() { + return (ub = u._NonMaxSuppressionV4 = u.asm.NonMaxSuppressionV4).apply(null, arguments); + }, U = u._NonMaxSuppressionV5 = function() { + return (U = u._NonMaxSuppressionV5 = u.asm.NonMaxSuppressionV5).apply(null, arguments); + }, te = u._NotEqual = function() { + return (te = u._NotEqual = u.asm.NotEqual).apply(null, arguments); + }, ve = u._OneHot = function() { + return (ve = u._OneHot = u.asm.OneHot).apply(null, arguments); + }, Ke = u._PadV2 = function() { + return (Ke = u._PadV2 = u.asm.PadV2).apply(null, arguments); + }, Nt = u._Pow = function() { + return (Nt = u._Pow = u.asm.Pow).apply(null, arguments); + }, _t = u._Prelu = function() { + return (_t = u._Prelu = u.asm.Prelu).apply(null, arguments); + }, He = u._Prod = function() { + return (He = u._Prod = u.asm.Prod).apply(null, arguments); + }, ze = u._RealDiv = function() { + return (ze = u._RealDiv = u.asm.RealDiv).apply(null, arguments); + }, zt = u._Relu = function() { + return (zt = u._Relu = u.asm.Relu).apply(null, arguments); + }, Qr = u._Relu6 = function() { + return (Qr = u._Relu6 = u.asm.Relu6).apply(null, arguments); + }, ea = u._ResizeBilinear = function() { + return (ea = u._ResizeBilinear = u.asm.ResizeBilinear).apply(null, arguments); + }, Im = u._ResizeNearestNeighbor = function() { + return (Im = u._ResizeNearestNeighbor = u.asm.ResizeNearestNeighbor).apply(null, arguments); + }, Kc = u._Reverse = function() { + return (Kc = u._Reverse = u.asm.Reverse).apply(null, arguments); + }, pb = u._RotateWithOffset = function() { + return (pb = u._RotateWithOffset = u.asm.RotateWithOffset).apply(null, arguments); + }, hr = u._Round = function() { + return (hr = u._Round = u.asm.Round).apply(null, arguments); + }, qa = u._Rsqrt = function() { + return (qa = u._Rsqrt = u.asm.Rsqrt).apply(null, arguments); + }, wm = u._ScatterNd = function() { + return (wm = u._ScatterNd = u.asm.ScatterNd).apply(null, arguments); + }, yV = u._SelectV2 = function() { + return (yV = u._SelectV2 = u.asm.SelectV2).apply(null, arguments); + }, bV = u._Sigmoid = function() { + return (bV = u._Sigmoid = u.asm.Sigmoid).apply(null, arguments); + }, CV = u._Sin = function() { + return (CV = u._Sin = u.asm.Sin).apply(null, arguments); + }, IV = u._Softmax = function() { + return (IV = u._Softmax = u.asm.Softmax).apply(null, arguments); + }, wV = u._SparseFillEmptyRows = function() { + return (wV = u._SparseFillEmptyRows = u.asm.SparseFillEmptyRows).apply(null, arguments); + }, SV = u._SparseReshape = function() { + return (SV = u._SparseReshape = u.asm.SparseReshape).apply(null, arguments); + }, vV = u._SparseSegmentReduction = function() { + return (vV = u._SparseSegmentReduction = u.asm.SparseSegmentReduction).apply(null, arguments); + }, kV = u._Sqrt = function() { + return (kV = u._Sqrt = u.asm.Sqrt).apply(null, arguments); + }, TV = u._Square = function() { + return (TV = u._Square = u.asm.Square).apply(null, arguments); + }, NV = u._SquaredDifference = function() { + return (NV = u._SquaredDifference = u.asm.SquaredDifference).apply(null, arguments); + }, _V = u._Step = function() { + return (_V = u._Step = u.asm.Step).apply(null, arguments); + }, EV = u._StridedSlice = function() { + return (EV = u._StridedSlice = u.asm.StridedSlice).apply(null, arguments); + }, $V = u._Sub = function() { + return ($V = u._Sub = u.asm.Sub).apply(null, arguments); + }, RV = u._Sum = function() { + return (RV = u._Sum = u.asm.Sum).apply(null, arguments); + }, AV = u._Tan = function() { + return (AV = u._Tan = u.asm.Tan).apply(null, arguments); + }, FV = u._Tanh = function() { + return (FV = u._Tanh = u.asm.Tanh).apply(null, arguments); + }, DV = u._Tile = function() { + return (DV = u._Tile = u.asm.Tile).apply(null, arguments); + }, PV = u._TopK = function() { + return (PV = u._TopK = u.asm.TopK).apply(null, arguments); + }, OV = u._Transform = function() { + return (OV = u._Transform = u.asm.Transform).apply(null, arguments); + }, MV = u._Transpose = function() { + return (MV = u._Transpose = u.asm.Transpose).apply(null, arguments); + }, LV = u.__FusedMatMul = function() { + return (LV = u.__FusedMatMul = u.asm._FusedMatMul).apply(null, arguments); + }, BV = u._malloc = function() { + return (BV = u._malloc = u.asm.malloc).apply(null, arguments); + }, VV = u._free = function() { + return (VV = u._free = u.asm.free).apply(null, arguments); + }, zV = u.__emscripten_tls_init = function() { + return (zV = u.__emscripten_tls_init = u.asm._emscripten_tls_init).apply(null, arguments); + }, Sm = u._pthread_self = function() { + return (Sm = u._pthread_self = u.asm.pthread_self).apply(null, arguments); + }, WV = u.___errno_location = function() { + return (WV = u.___errno_location = u.asm.__errno_location).apply(null, arguments); + }, r0 = u.__emscripten_thread_init = function() { + return (r0 = u.__emscripten_thread_init = u.asm._emscripten_thread_init).apply(null, arguments); + }, UV = u.__emscripten_thread_crashed = function() { + return (UV = u.__emscripten_thread_crashed = u.asm._emscripten_thread_crashed).apply(null, arguments); + }, GV = u._emscripten_main_thread_process_queued_calls = function() { + return (GV = u._emscripten_main_thread_process_queued_calls = u.asm.emscripten_main_thread_process_queued_calls).apply(null, arguments); + }, HV = u._emscripten_main_browser_thread_id = function() { + return (HV = u._emscripten_main_browser_thread_id = u.asm.emscripten_main_browser_thread_id).apply(null, arguments); + }, o0 = u._emscripten_run_in_main_runtime_thread_js = function() { + return (o0 = u._emscripten_run_in_main_runtime_thread_js = u.asm.emscripten_run_in_main_runtime_thread_js).apply(null, arguments); + }, qV = u._emscripten_dispatch_to_thread_ = function() { + return (qV = u._emscripten_dispatch_to_thread_ = u.asm.emscripten_dispatch_to_thread_).apply(null, arguments); + }, n0 = u.__emscripten_proxy_execute_task_queue = function() { + return (n0 = u.__emscripten_proxy_execute_task_queue = u.asm._emscripten_proxy_execute_task_queue).apply(null, arguments); + }, cb = u.__emscripten_thread_free_data = function() { + return (cb = u.__emscripten_thread_free_data = u.asm._emscripten_thread_free_data).apply(null, arguments); + }, s0 = u.__emscripten_thread_exit = function() { + return (s0 = u.__emscripten_thread_exit = u.asm._emscripten_thread_exit).apply(null, arguments); + }, a0 = u._emscripten_stack_set_limits = function() { + return (a0 = u._emscripten_stack_set_limits = u.asm.emscripten_stack_set_limits).apply(null, arguments); + }, lb = u.stackSave = function() { + return (lb = u.stackSave = u.asm.stackSave).apply(null, arguments); + }, vm = u.stackRestore = function() { + return (vm = u.stackRestore = u.asm.stackRestore).apply(null, arguments); + }, km = u.stackAlloc = function() { + return (km = u.stackAlloc = u.asm.stackAlloc).apply(null, arguments); + }, KV = u.dynCall_iijjiiii = function() { + return (KV = u.dynCall_iijjiiii = u.asm.dynCall_iijjiiii).apply(null, arguments); + }, jV = u.dynCall_jiji = function() { + return (jV = u.dynCall_jiji = u.asm.dynCall_jiji).apply(null, arguments); + }; + u.keepRuntimeAlive = tn, u.wasmMemory = Q, u.cwrap = cy, u.ExitStatus = Di, u.PThread = Fe; + var Tm; + Js = function F() { + Tm || i0(), Tm || (Js = F); + }; + function i0(F) { + if (F = F || d, Ga > 0) + return; + if (w) { + c(u), jt(), postMessage({ cmd: "loaded" }); + return; + } + if (Ua(), Ga > 0) + return; + function B() { + Tm || (Tm = true, u.calledRun = true, !ie && (jt(), c(u), u.onRuntimeInitialized && u.onRuntimeInitialized(), Zs())); + } + u.setStatus ? (u.setStatus("Running..."), setTimeout(function() { + setTimeout(function() { + u.setStatus(""); + }, 1), B(); + }, 1)) : B(); + } + if (u.preInit) + for (typeof u.preInit == "function" && (u.preInit = [u.preInit]); u.preInit.length > 0; ) + u.preInit.pop()(); + i0(); + var Nm; + m && (Nm = { uncaughtException: process.listeners("uncaughtException").filter(function(F) { + return !m.uncaughtException.indexOf(F) > -1; + }), unhandledRejection: process.listeners("unhandledRejection").filter(function(F) { + return !m.unhandledRejection.indexOf(F) > -1; + }) }); + var _m; + if (typeof WasmBackendModule != "undefined") + _m = WasmBackendModule; + else if (typeof e != "undefined") + _m = e; + else + throw new Error("Could not find wasm module in post.js"); + if (Nm) { + var XV = _m._dispose; + _m._dispose = function() { + XV(), Nm.uncaughtException.forEach(function(F) { + process.removeListener("uncaughtException", F); + }), Nm.unhandledRejection.forEach(function(F) { + process.removeListener("unhandledRejection", F); + }); + }; + } + return e.ready; + }; + })(); + typeof Fg == "object" && typeof Jw == "object" ? Jw.exports = Zw : typeof define == "function" && define.amd ? define([], function() { + return Zw; + }) : typeof Fg == "object" && (Fg.WasmBackendModuleThreadedSimd = Zw); +}); +var B3 = Kt((ukt, L3) => { + L3.exports.wasmWorkerContents = `"use strict";var Module={};var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";if(ENVIRONMENT_IS_NODE){var nodeWorkerThreads=require("worker_threads");var parentPort=nodeWorkerThreads.parentPort;parentPort.on("message",data=>onmessage({data:data}));var fs=require("fs");Object.assign(global,{self:global,require:require,Module:Module,location:{href:__filename},Worker:nodeWorkerThreads.Worker,importScripts:function(f){(0,eval)(fs.readFileSync(f,"utf8"))},postMessage:function(msg){parentPort.postMessage(msg)},performance:global.performance||{now:function(){return Date.now()}}})}var initializedJS=false;var pendingNotifiedProxyingQueues=[];function threadPrintErr(){var text=Array.prototype.slice.call(arguments).join(" ");if(ENVIRONMENT_IS_NODE){fs.writeSync(2,text+" +");return}console.error(text)}function threadAlert(){var text=Array.prototype.slice.call(arguments).join(" ");postMessage({cmd:"alert",text:text,threadId:Module["_pthread_self"]()})}var err=threadPrintErr;self.alert=threadAlert;Module["instantiateWasm"]=(info,receiveInstance)=>{var instance=new WebAssembly.Instance(Module["wasmModule"],info);receiveInstance(instance);Module["wasmModule"]=null;return instance.exports};self.onunhandledrejection=e=>{throw e.reason??e};self.onmessage=e=>{try{if(e.data.cmd==="load"){Module["wasmModule"]=e.data.wasmModule;Module["wasmMemory"]=e.data.wasmMemory;Module["buffer"]=Module["wasmMemory"].buffer;Module["ENVIRONMENT_IS_PTHREAD"]=true;if(typeof e.data.urlOrBlob=="string"){importScripts(e.data.urlOrBlob)}else{var objectUrl=URL.createObjectURL(e.data.urlOrBlob);importScripts(objectUrl);URL.revokeObjectURL(objectUrl)}WasmBackendModuleThreadedSimd(Module).then(function(instance){Module=instance})}else if(e.data.cmd==="run"){Module["__performance_now_clock_drift"]=performance.now()-e.data.time;Module["__emscripten_thread_init"](e.data.pthread_ptr,0,0,1);Module["establishStackSpace"]();Module["PThread"].receiveObjectTransfer(e.data);Module["PThread"].threadInitTLS();if(!initializedJS){pendingNotifiedProxyingQueues.forEach(queue=>{Module["executeNotifiedProxyingQueue"](queue)});pendingNotifiedProxyingQueues=[];initializedJS=true}try{Module["invokeEntryPoint"](e.data.start_routine,e.data.arg)}catch(ex){if(ex!="unwind"){if(ex instanceof Module["ExitStatus"]){if(Module["keepRuntimeAlive"]()){}else{Module["__emscripten_thread_exit"](ex.status)}}else{throw ex}}}}else if(e.data.cmd==="cancel"){if(Module["_pthread_self"]()){Module["__emscripten_thread_exit"](-1)}}else if(e.data.target==="setimmediate"){}else if(e.data.cmd==="processProxyingQueue"){if(initializedJS){Module["executeNotifiedProxyingQueue"](e.data.queue)}else{pendingNotifiedProxyingQueues.push(e.data.queue)}}else if(e.data.cmd){err("worker.js received unknown command "+e.data.cmd);err(e.data)}}catch(ex){if(Module["__emscripten_thread_crashed"]){Module["__emscripten_thread_crashed"]()}throw ex}};`; +}); +var V3 = Kt((Dg, tS) => { + var eS = (() => { + var r = typeof document != "undefined" && document.currentScript ? document.currentScript.src : void 0; + return typeof __filename != "undefined" && (r = r || __filename), function(e) { + e = e || {}; + var t10 = typeof e != "undefined" ? e : {}, o, n; + t10.ready = new Promise(function(U, te) { + o = U, n = te; + }); + var s; + typeof process != "undefined" && process.listeners && (s = { uncaughtException: process.listeners("uncaughtException"), unhandledRejection: process.listeners("unhandledRejection") }); + var a = Object.assign({}, t10), i = [], p = "./this.program", u = (U, te) => { + throw te; + }, c = typeof window == "object", l = typeof importScripts == "function", m = typeof process == "object" && typeof process.versions == "object" && typeof process.versions.node == "string", f = ""; + function d(U) { + return t10.locateFile ? t10.locateFile(U, f) : f + U; + } + var h, g, y, b; + function C(U) { + if (U instanceof ju) + return; + E("exiting due to exception: " + U); + } + if (m) { + l ? f = Vl().dirname(f) + "/" : f = __dirname + "/"; + var w, k; + typeof Em == "function" && (w = Qw(), k = Vl()), h = (U, te) => (U = k.normalize(U), w.readFileSync(U, te ? void 0 : "utf8")), y = (U) => { + var te = h(U, true); + return te.buffer || (te = new Uint8Array(te)), te; + }, g = (U, te, ve) => { + U = k.normalize(U), w.readFile(U, function(Ke, Nt) { + Ke ? ve(Ke) : te(Nt.buffer); + }); + }, process.argv.length > 1 && (p = process.argv[1].replace(/\\/g, "/")), i = process.argv.slice(2), process.on("uncaughtException", function(U) { + if (!(U instanceof ju)) + throw U; + }), process.on("unhandledRejection", function(U) { + throw U; + }), u = (U, te) => { + if (at()) + throw process.exitCode = U, te; + C(te), process.exit(U); + }, t10.inspect = function() { + return "[Emscripten Module object]"; + }; + } else + (c || l) && (l ? f = self.location.href : typeof document != "undefined" && document.currentScript && (f = document.currentScript.src), r && (f = r), f.indexOf("blob:") !== 0 ? f = f.substr(0, f.replace(/[?#].*/, "").lastIndexOf("/") + 1) : f = "", h = (U) => { + var te = new XMLHttpRequest(); + return te.open("GET", U, false), te.send(null), te.responseText; + }, l && (y = (U) => { + var te = new XMLHttpRequest(); + return te.open("GET", U, false), te.responseType = "arraybuffer", te.send(null), new Uint8Array(te.response); + }), g = (U, te, ve) => { + var Ke = new XMLHttpRequest(); + Ke.open("GET", U, true), Ke.responseType = "arraybuffer", Ke.onload = () => { + if (Ke.status == 200 || Ke.status == 0 && Ke.response) { + te(Ke.response); + return; + } + ve(); + }, Ke.onerror = ve, Ke.send(null); + }, b = (U) => document.title = U); + var _ = t10.print || console.log.bind(console), E = t10.printErr || console.warn.bind(console); + Object.assign(t10, a), a = null, t10.arguments && (i = t10.arguments), t10.thisProgram && (p = t10.thisProgram), t10.quit && (u = t10.quit); + var R = 4, A; + t10.wasmBinary && (A = t10.wasmBinary); + var D = t10.noExitRuntime || true; + typeof WebAssembly != "object" && pr("no native wasm support detected"); + var O, M = false, L; + function W(U, te) { + U || pr(te); + } + var V = typeof TextDecoder != "undefined" ? new TextDecoder("utf8") : void 0; + function G(U, te, ve) { + for (var Ke = te + ve, Nt = te; U[Nt] && !(Nt >= Ke); ) + ++Nt; + if (Nt - te > 16 && U.buffer && V) + return V.decode(U.subarray(te, Nt)); + for (var _t = ""; te < Nt; ) { + var He = U[te++]; + if (!(He & 128)) { + _t += String.fromCharCode(He); + continue; + } + var ze = U[te++] & 63; + if ((He & 224) == 192) { + _t += String.fromCharCode((He & 31) << 6 | ze); + continue; + } + var zt = U[te++] & 63; + if ((He & 240) == 224 ? He = (He & 15) << 12 | ze << 6 | zt : He = (He & 7) << 18 | ze << 12 | zt << 6 | U[te++] & 63, He < 65536) + _t += String.fromCharCode(He); + else { + var Qr = He - 65536; + _t += String.fromCharCode(55296 | Qr >> 10, 56320 | Qr & 1023); + } + } + return _t; + } + function q(U, te) { + return U ? G(ee, U, te) : ""; + } + function H(U, te, ve, Ke) { + if (!(Ke > 0)) + return 0; + for (var Nt = ve, _t = ve + Ke - 1, He = 0; He < U.length; ++He) { + var ze = U.charCodeAt(He); + if (ze >= 55296 && ze <= 57343) { + var zt = U.charCodeAt(++He); + ze = 65536 + ((ze & 1023) << 10) | zt & 1023; + } + if (ze <= 127) { + if (ve >= _t) + break; + te[ve++] = ze; + } else if (ze <= 2047) { + if (ve + 1 >= _t) + break; + te[ve++] = 192 | ze >> 6, te[ve++] = 128 | ze & 63; + } else if (ze <= 65535) { + if (ve + 2 >= _t) + break; + te[ve++] = 224 | ze >> 12, te[ve++] = 128 | ze >> 6 & 63, te[ve++] = 128 | ze & 63; + } else { + if (ve + 3 >= _t) + break; + te[ve++] = 240 | ze >> 18, te[ve++] = 128 | ze >> 12 & 63, te[ve++] = 128 | ze >> 6 & 63, te[ve++] = 128 | ze & 63; + } + } + return te[ve] = 0, ve - Nt; + } + function j(U, te, ve) { + return H(U, ee, te, ve); + } + var Y, Z, ee, X, Q, se, ie, de, Ie; + function Se(U) { + Y = U, t10.HEAP8 = Z = new Int8Array(U), t10.HEAP16 = X = new Int16Array(U), t10.HEAP32 = se = new Int32Array(U), t10.HEAPU8 = ee = new Uint8Array(U), t10.HEAPU16 = Q = new Uint16Array(U), t10.HEAPU32 = ie = new Uint32Array(U), t10.HEAPF32 = de = new Float32Array(U), t10.HEAPF64 = Ie = new Float64Array(U); + } + var Ee = t10.INITIAL_MEMORY || 16777216, Me, st = [], pt = [], De = [], ft = false; + function at() { + return D; + } + function dt() { + if (t10.preRun) + for (typeof t10.preRun == "function" && (t10.preRun = [t10.preRun]); t10.preRun.length; ) + Pt(t10.preRun.shift()); + Js(st); + } + function It() { + ft = true, Js(pt); + } + function Fr() { + if (t10.postRun) + for (typeof t10.postRun == "function" && (t10.postRun = [t10.postRun]); t10.postRun.length; ) + er(t10.postRun.shift()); + Js(De); + } + function Pt(U) { + st.unshift(U); + } + function jr(U) { + pt.unshift(U); + } + function er(U) { + De.unshift(U); + } + var Tt = 0, tr = null, rr = null; + function Xr(U) { + Tt++, t10.monitorRunDependencies && t10.monitorRunDependencies(Tt); + } + function Yr(U) { + if (Tt--, t10.monitorRunDependencies && t10.monitorRunDependencies(Tt), Tt == 0 && (tr !== null && (clearInterval(tr), tr = null), rr)) { + var te = rr; + rr = null, te(); + } + } + function pr(U) { + t10.onAbort && t10.onAbort(U), U = "Aborted(" + U + ")", E(U), M = true, L = 1, U += ". Build with -sASSERTIONS for more info."; + var te = new WebAssembly.RuntimeError(U); + throw n(te), te; + } + var Qs = "data:application/octet-stream;base64,"; + function tn(U) { + return U.startsWith(Qs); + } + function Ua(U) { + return U.startsWith("file://"); + } + var jt; + jt = "tfjs-backend-wasm.wasm", tn(jt) || (jt = d(jt)); + function Zs(U) { + try { + if (U == jt && A) + return new Uint8Array(A); + if (y) + return y(U); + throw "both async and sync fetching of the wasm failed"; + } catch (te) { + pr(te); + } + } + function Lc() { + if (!A && (c || l)) { + if (typeof fetch == "function" && !Ua(jt)) + return fetch(jt, { credentials: "same-origin" }).then(function(U) { + if (!U.ok) + throw "failed to load wasm binary file at '" + jt + "'"; + return U.arrayBuffer(); + }).catch(function() { + return Zs(jt); + }); + if (g) + return new Promise(function(U, te) { + g(jt, function(ve) { + U(new Uint8Array(ve)); + }, te); + }); + } + return Promise.resolve().then(function() { + return Zs(jt); + }); + } + function Bc() { + var U = { env: Wc, wasi_snapshot_preview1: Wc }; + function te(He, ze) { + var zt = He.exports; + t10.asm = zt, O = t10.asm.memory, Se(O.buffer), Me = t10.asm.__indirect_function_table, jr(t10.asm.__wasm_call_ctors), Yr("wasm-instantiate"); + } + Xr("wasm-instantiate"); + function ve(He) { + te(He.instance); + } + function Ke(He) { + return Lc().then(function(ze) { + return WebAssembly.instantiate(ze, U); + }).then(function(ze) { + return ze; + }).then(He, function(ze) { + E("failed to asynchronously prepare wasm: " + ze), pr(ze); + }); + } + function Nt() { + return !A && typeof WebAssembly.instantiateStreaming == "function" && !tn(jt) && !Ua(jt) && !m && typeof fetch == "function" ? fetch(jt, { credentials: "same-origin" }).then(function(He) { + var ze = WebAssembly.instantiateStreaming(He, U); + return ze.then(ve, function(zt) { + return E("wasm streaming compile failed: " + zt), E("falling back to ArrayBuffer instantiation"), Ke(ve); + }); + }) : Ke(ve); + } + if (t10.instantiateWasm) + try { + var _t = t10.instantiateWasm(U, te); + return _t; + } catch (He) { + E("Module.instantiateWasm callback failed with error: " + He), n(He); + } + return Nt().catch(n), {}; + } + var KS, Ga; + function ju(U) { + this.name = "ExitStatus", this.message = "Program terminated with exit(" + U + ")", this.status = U; + } + function Js(U) { + for (; U.length > 0; ) + U.shift()(t10); + } + function jS(U) { + return U; + } + function XS(U) { + var te = /\b_Z[\w\d_]+/g; + return U.replace(te, function(ve) { + var Ke = ve; + return ve === Ke ? ve : Ke + " [" + ve + "]"; + }); + } + function Xu() { + var U = new Error(); + if (!U.stack) { + try { + throw new Error(); + } catch (te) { + U = te; + } + if (!U.stack) + return "(no stack trace available)"; + } + return U.stack.toString(); + } + function $x(U, te) { + Z.set(U, te); + } + function nm() { + pr(""); + } + function Vc() { + return 2147483648; + } + function dr() { + return Vc(); + } + function sm(U, te, ve) { + ee.copyWithin(U, te, te + ve); + } + function Rx(U) { + try { + return O.grow(U - Y.byteLength + 65535 >>> 16), Se(O.buffer), 1; + } catch (te) { + } + } + function Ax(U) { + var te = ee.length; + U = U >>> 0; + var ve = Vc(); + if (U > ve) + return false; + let Ke = (zt, Qr) => zt + (Qr - zt % Qr) % Qr; + for (var Nt = 1; Nt <= 4; Nt *= 2) { + var _t = te * (1 + 0.2 / Nt); + _t = Math.min(_t, U + 100663296); + var He = Math.min(ve, Ke(Math.max(U, _t), 65536)), ze = Rx(He); + if (ze) + return true; + } + return false; + } + var Fx = { varargs: void 0, get: function() { + Fx.varargs += 4; + var U = se[Fx.varargs - 4 >> 2]; + return U; + }, getStr: function(U) { + var te = q(U); + return te; + } }; + function YS(U) { + return 52; + } + function Dx(U, te, ve, Ke, Nt) { + return 70; + } + var Di = [null, [], []]; + function Px(U, te) { + var ve = Di[U]; + te === 0 || te === 10 ? ((U === 1 ? _ : E)(G(ve, 0)), ve.length = 0) : ve.push(te); + } + function Ox(U, te, ve, Ke) { + for (var Nt = 0, _t = 0; _t < ve; _t++) { + var He = ie[te >> 2], ze = ie[te + 4 >> 2]; + te += 8; + for (var zt = 0; zt < ze; zt++) + Px(U, ee[He + zt]); + Nt += ze; + } + return ie[Ke >> 2] = Nt, 0; + } + function zc(U) { + var te = t10["_" + U]; + return te; + } + function am(U, te, ve, Ke, Nt) { + var _t = { string: (hr) => { + var qa = 0; + if (hr != null && hr !== 0) { + var wm = (hr.length << 2) + 1; + qa = qc(wm), j(hr, qa, wm); + } + return qa; + }, array: (hr) => { + var qa = qc(hr.length); + return $x(hr, qa), qa; + } }; + function He(hr) { + return te === "string" ? q(hr) : te === "boolean" ? Boolean(hr) : hr; + } + var ze = zc(U), zt = [], Qr = 0; + if (Ke) + for (var ea = 0; ea < Ke.length; ea++) { + var Im = _t[ve[ea]]; + Im ? (Qr === 0 && (Qr = ym()), zt[ea] = Im(Ke[ea])) : zt[ea] = Ke[ea]; + } + var Kc = ze.apply(null, zt); + function pb(hr) { + return Qr !== 0 && bm(Qr), He(hr); + } + return Kc = pb(Kc), Kc; + } + function im(U, te, ve, Ke) { + ve = ve || []; + var Nt = ve.every((He) => He === "number" || He === "boolean"), _t = te !== "string"; + return _t && Nt && !Ke ? zc(U) : function() { + return am(U, te, ve, arguments, Ke); + }; + } + var Wc = { abort: nm, emscripten_get_heap_max: dr, emscripten_memcpy_big: sm, emscripten_resize_heap: Ax, fd_close: YS, fd_seek: Dx, fd_write: Ox }, QS = Bc(), um = t10.___wasm_call_ctors = function() { + return (um = t10.___wasm_call_ctors = t10.asm.__wasm_call_ctors).apply(null, arguments); + }, Mx = t10._init = function() { + return (Mx = t10._init = t10.asm.init).apply(null, arguments); + }, Fe = t10._init_with_threads_count = function() { + return (Fe = t10._init_with_threads_count = t10.asm.init_with_threads_count).apply(null, arguments); + }, Uc = t10._get_threads_count = function() { + return (Uc = t10._get_threads_count = t10.asm.get_threads_count).apply(null, arguments); + }, Lx = t10._register_tensor = function() { + return (Lx = t10._register_tensor = t10.asm.register_tensor).apply(null, arguments); + }, ZS = t10._dispose_data = function() { + return (ZS = t10._dispose_data = t10.asm.dispose_data).apply(null, arguments); + }, JS = t10._dispose = function() { + return (JS = t10._dispose = t10.asm.dispose).apply(null, arguments); + }, Bx = t10._Abs = function() { + return (Bx = t10._Abs = t10.asm.Abs).apply(null, arguments); + }, pm = t10._Add = function() { + return (pm = t10._Add = t10.asm.Add).apply(null, arguments); + }, Yu = t10._AddN = function() { + return (Yu = t10._AddN = t10.asm.AddN).apply(null, arguments); + }, Vx = t10._All = function() { + return (Vx = t10._All = t10.asm.All).apply(null, arguments); + }, zx = t10._Any = function() { + return (zx = t10._Any = t10.asm.Any).apply(null, arguments); + }, e0 = t10._ArgMax = function() { + return (e0 = t10._ArgMax = t10.asm.ArgMax).apply(null, arguments); + }, Wx = t10._AvgPool = function() { + return (Wx = t10._AvgPool = t10.asm.AvgPool).apply(null, arguments); + }, Ux = t10._BatchMatMul = function() { + return (Ux = t10._BatchMatMul = t10.asm.BatchMatMul).apply(null, arguments); + }, Gx = t10._Ceil = function() { + return (Gx = t10._Ceil = t10.asm.Ceil).apply(null, arguments); + }, Hx = t10._ClipByValue = function() { + return (Hx = t10._ClipByValue = t10.asm.ClipByValue).apply(null, arguments); + }, cm = t10._Conv2D = function() { + return (cm = t10._Conv2D = t10.asm.Conv2D).apply(null, arguments); + }, lm = t10._Conv2DBackpropInput = function() { + return (lm = t10._Conv2DBackpropInput = t10.asm.Conv2DBackpropInput).apply(null, arguments); + }, qx = t10._Cos = function() { + return (qx = t10._Cos = t10.asm.Cos).apply(null, arguments); + }, Kx = t10._Cosh = function() { + return (Kx = t10._Cosh = t10.asm.Cosh).apply(null, arguments); + }, jx = t10._CropAndResize = function() { + return (jx = t10._CropAndResize = t10.asm.CropAndResize).apply(null, arguments); + }, Gc = t10._Cumprod = function() { + return (Gc = t10._Cumprod = t10.asm.Cumprod).apply(null, arguments); + }, Xx = t10._Cumsum = function() { + return (Xx = t10._Cumsum = t10.asm.Cumsum).apply(null, arguments); + }, Yx = t10._DepthToSpace = function() { + return (Yx = t10._DepthToSpace = t10.asm.DepthToSpace).apply(null, arguments); + }, Qx = t10._DepthwiseConv2dNative = function() { + return (Qx = t10._DepthwiseConv2dNative = t10.asm.DepthwiseConv2dNative).apply(null, arguments); + }, Pi = t10._Elu = function() { + return (Pi = t10._Elu = t10.asm.Elu).apply(null, arguments); + }, Zx = t10._Equal = function() { + return (Zx = t10._Equal = t10.asm.Equal).apply(null, arguments); + }, Jx = t10._Exp = function() { + return (Jx = t10._Exp = t10.asm.Exp).apply(null, arguments); + }, mm = t10._FlipLeftRight = function() { + return (mm = t10._FlipLeftRight = t10.asm.FlipLeftRight).apply(null, arguments); + }, ey = t10._Floor = function() { + return (ey = t10._Floor = t10.asm.Floor).apply(null, arguments); + }, Qu = t10._FloorDiv = function() { + return (Qu = t10._FloorDiv = t10.asm.FloorDiv).apply(null, arguments); + }, ty = t10._FusedBatchNorm = function() { + return (ty = t10._FusedBatchNorm = t10.asm.FusedBatchNorm).apply(null, arguments); + }, ry = t10._FusedConv2D = function() { + return (ry = t10._FusedConv2D = t10.asm.FusedConv2D).apply(null, arguments); + }, Ha = t10._FusedDepthwiseConv2D = function() { + return (Ha = t10._FusedDepthwiseConv2D = t10.asm.FusedDepthwiseConv2D).apply(null, arguments); + }, Hc = t10._Gather = function() { + return (Hc = t10._Gather = t10.asm.Gather).apply(null, arguments); + }, oy = t10._GatherNd = function() { + return (oy = t10._GatherNd = t10.asm.GatherNd).apply(null, arguments); + }, ny = t10._Greater = function() { + return (ny = t10._Greater = t10.asm.Greater).apply(null, arguments); + }, sy = t10._GreaterEqual = function() { + return (sy = t10._GreaterEqual = t10.asm.GreaterEqual).apply(null, arguments); + }, ay = t10._LeakyRelu = function() { + return (ay = t10._LeakyRelu = t10.asm.LeakyRelu).apply(null, arguments); + }, fm = t10._Less = function() { + return (fm = t10._Less = t10.asm.Less).apply(null, arguments); + }, dm = t10._LessEqual = function() { + return (dm = t10._LessEqual = t10.asm.LessEqual).apply(null, arguments); + }, iy = t10._Log = function() { + return (iy = t10._Log = t10.asm.Log).apply(null, arguments); + }, uy = t10._LogicalAnd = function() { + return (uy = t10._LogicalAnd = t10.asm.LogicalAnd).apply(null, arguments); + }, hm = t10._LogicalNot = function() { + return (hm = t10._LogicalNot = t10.asm.LogicalNot).apply(null, arguments); + }, gm = t10._LogicalOr = function() { + return (gm = t10._LogicalOr = t10.asm.LogicalOr).apply(null, arguments); + }, py = t10._LogicalXor = function() { + return (py = t10._LogicalXor = t10.asm.LogicalXor).apply(null, arguments); + }, cy = t10._Max = function() { + return (cy = t10._Max = t10.asm.Max).apply(null, arguments); + }, ly = t10._MaxPool = function() { + return (ly = t10._MaxPool = t10.asm.MaxPool).apply(null, arguments); + }, xm = t10._Maximum = function() { + return (xm = t10._Maximum = t10.asm.Maximum).apply(null, arguments); + }, t0 = t10._Mean = function() { + return (t0 = t10._Mean = t10.asm.Mean).apply(null, arguments); + }, my = t10._Min = function() { + return (my = t10._Min = t10.asm.Min).apply(null, arguments); + }, fy = t10._Minimum = function() { + return (fy = t10._Minimum = t10.asm.Minimum).apply(null, arguments); + }, dy = t10._MirrorPad = function() { + return (dy = t10._MirrorPad = t10.asm.MirrorPad).apply(null, arguments); + }, hy = t10._Multiply = function() { + return (hy = t10._Multiply = t10.asm.Multiply).apply(null, arguments); + }, gy = t10._Neg = function() { + return (gy = t10._Neg = t10.asm.Neg).apply(null, arguments); + }, xy = t10._NonMaxSuppressionV3 = function() { + return (xy = t10._NonMaxSuppressionV3 = t10.asm.NonMaxSuppressionV3).apply(null, arguments); + }, yy = t10._NonMaxSuppressionV4 = function() { + return (yy = t10._NonMaxSuppressionV4 = t10.asm.NonMaxSuppressionV4).apply(null, arguments); + }, by = t10._NonMaxSuppressionV5 = function() { + return (by = t10._NonMaxSuppressionV5 = t10.asm.NonMaxSuppressionV5).apply(null, arguments); + }, Cy = t10._NotEqual = function() { + return (Cy = t10._NotEqual = t10.asm.NotEqual).apply(null, arguments); + }, Iy = t10._OneHot = function() { + return (Iy = t10._OneHot = t10.asm.OneHot).apply(null, arguments); + }, wy = t10._PadV2 = function() { + return (wy = t10._PadV2 = t10.asm.PadV2).apply(null, arguments); + }, Sy = t10._Pow = function() { + return (Sy = t10._Pow = t10.asm.Pow).apply(null, arguments); + }, vy = t10._Prelu = function() { + return (vy = t10._Prelu = t10.asm.Prelu).apply(null, arguments); + }, ky = t10._Prod = function() { + return (ky = t10._Prod = t10.asm.Prod).apply(null, arguments); + }, Ty = t10._RealDiv = function() { + return (Ty = t10._RealDiv = t10.asm.RealDiv).apply(null, arguments); + }, Ny = t10._Relu = function() { + return (Ny = t10._Relu = t10.asm.Relu).apply(null, arguments); + }, _y = t10._Relu6 = function() { + return (_y = t10._Relu6 = t10.asm.Relu6).apply(null, arguments); + }, Ey = t10._ResizeBilinear = function() { + return (Ey = t10._ResizeBilinear = t10.asm.ResizeBilinear).apply(null, arguments); + }, $y = t10._ResizeNearestNeighbor = function() { + return ($y = t10._ResizeNearestNeighbor = t10.asm.ResizeNearestNeighbor).apply(null, arguments); + }, Ry = t10._Reverse = function() { + return (Ry = t10._Reverse = t10.asm.Reverse).apply(null, arguments); + }, Ay = t10._RotateWithOffset = function() { + return (Ay = t10._RotateWithOffset = t10.asm.RotateWithOffset).apply(null, arguments); + }, Fy = t10._Round = function() { + return (Fy = t10._Round = t10.asm.Round).apply(null, arguments); + }, Dy = t10._Rsqrt = function() { + return (Dy = t10._Rsqrt = t10.asm.Rsqrt).apply(null, arguments); + }, Py = t10._ScatterNd = function() { + return (Py = t10._ScatterNd = t10.asm.ScatterNd).apply(null, arguments); + }, Oy = t10._SelectV2 = function() { + return (Oy = t10._SelectV2 = t10.asm.SelectV2).apply(null, arguments); + }, My = t10._Sigmoid = function() { + return (My = t10._Sigmoid = t10.asm.Sigmoid).apply(null, arguments); + }, Ly = t10._Sin = function() { + return (Ly = t10._Sin = t10.asm.Sin).apply(null, arguments); + }, By = t10._Softmax = function() { + return (By = t10._Softmax = t10.asm.Softmax).apply(null, arguments); + }, Vy = t10._SparseFillEmptyRows = function() { + return (Vy = t10._SparseFillEmptyRows = t10.asm.SparseFillEmptyRows).apply(null, arguments); + }, zy = t10._SparseReshape = function() { + return (zy = t10._SparseReshape = t10.asm.SparseReshape).apply(null, arguments); + }, Wy = t10._SparseSegmentReduction = function() { + return (Wy = t10._SparseSegmentReduction = t10.asm.SparseSegmentReduction).apply(null, arguments); + }, Uy = t10._Sqrt = function() { + return (Uy = t10._Sqrt = t10.asm.Sqrt).apply(null, arguments); + }, Gy = t10._Square = function() { + return (Gy = t10._Square = t10.asm.Square).apply(null, arguments); + }, Hy = t10._SquaredDifference = function() { + return (Hy = t10._SquaredDifference = t10.asm.SquaredDifference).apply(null, arguments); + }, qy = t10._Step = function() { + return (qy = t10._Step = t10.asm.Step).apply(null, arguments); + }, Ky = t10._StridedSlice = function() { + return (Ky = t10._StridedSlice = t10.asm.StridedSlice).apply(null, arguments); + }, jy = t10._Sub = function() { + return (jy = t10._Sub = t10.asm.Sub).apply(null, arguments); + }, Xy = t10._Sum = function() { + return (Xy = t10._Sum = t10.asm.Sum).apply(null, arguments); + }, Yy = t10._Tan = function() { + return (Yy = t10._Tan = t10.asm.Tan).apply(null, arguments); + }, Qy = t10._Tanh = function() { + return (Qy = t10._Tanh = t10.asm.Tanh).apply(null, arguments); + }, Zy = t10._Tile = function() { + return (Zy = t10._Tile = t10.asm.Tile).apply(null, arguments); + }, Jy = t10._TopK = function() { + return (Jy = t10._TopK = t10.asm.TopK).apply(null, arguments); + }, eb = t10._Transform = function() { + return (eb = t10._Transform = t10.asm.Transform).apply(null, arguments); + }, tb = t10._Transpose = function() { + return (tb = t10._Transpose = t10.asm.Transpose).apply(null, arguments); + }, rb = t10.__FusedMatMul = function() { + return (rb = t10.__FusedMatMul = t10.asm._FusedMatMul).apply(null, arguments); + }, ob = t10._malloc = function() { + return (ob = t10._malloc = t10.asm.malloc).apply(null, arguments); + }, nb = t10._free = function() { + return (nb = t10._free = t10.asm.free).apply(null, arguments); + }, sb = t10.___errno_location = function() { + return (sb = t10.___errno_location = t10.asm.__errno_location).apply(null, arguments); + }, ym = t10.stackSave = function() { + return (ym = t10.stackSave = t10.asm.stackSave).apply(null, arguments); + }, bm = t10.stackRestore = function() { + return (bm = t10.stackRestore = t10.asm.stackRestore).apply(null, arguments); + }, qc = t10.stackAlloc = function() { + return (qc = t10.stackAlloc = t10.asm.stackAlloc).apply(null, arguments); + }, ab = t10.dynCall_iijjiiii = function() { + return (ab = t10.dynCall_iijjiiii = t10.asm.dynCall_iijjiiii).apply(null, arguments); + }, ib = t10.dynCall_jiji = function() { + return (ib = t10.dynCall_jiji = t10.asm.dynCall_jiji).apply(null, arguments); + }; + t10.cwrap = im; + var Zu; + rr = function U() { + Zu || Cm(), Zu || (rr = U); + }; + function Cm(U) { + if (U = U || i, Tt > 0 || (dt(), Tt > 0)) + return; + function te() { + Zu || (Zu = true, t10.calledRun = true, !M && (It(), o(t10), t10.onRuntimeInitialized && t10.onRuntimeInitialized(), Fr())); + } + t10.setStatus ? (t10.setStatus("Running..."), setTimeout(function() { + setTimeout(function() { + t10.setStatus(""); + }, 1), te(); + }, 1)) : te(); + } + if (t10.preInit) + for (typeof t10.preInit == "function" && (t10.preInit = [t10.preInit]); t10.preInit.length > 0; ) + t10.preInit.pop()(); + Cm(); + var Ju; + s && (Ju = { uncaughtException: process.listeners("uncaughtException").filter(function(U) { + return !s.uncaughtException.indexOf(U) > -1; + }), unhandledRejection: process.listeners("unhandledRejection").filter(function(U) { + return !s.unhandledRejection.indexOf(U) > -1; + }) }); + var ep; + if (typeof e != "undefined") + ep = e; + else if (typeof WasmBackendModuleThreadedSimd != "undefined") + ep = WasmBackendModuleThreadedSimd; + else + throw new Error("Could not find wasm module in post.js"); + if (Ju) { + var ub = ep._dispose; + ep._dispose = function() { + ub(), Ju.uncaughtException.forEach(function(U) { + process.removeListener("uncaughtException", U); + }), Ju.unhandledRejection.forEach(function(U) { + process.removeListener("unhandledRejection", U); + }); + }; + } + return e.ready; + }; + })(); + typeof Dg == "object" && typeof tS == "object" ? tS.exports = eS : typeof define == "function" && define.amd ? define([], function() { + return eS; + }) : typeof Dg == "object" && (Dg.WasmBackendModule = eS); +}); +var rn = class { + constructor(e, t10) { + this.backend = e, this.dataMover = t10, this.data = /* @__PURE__ */ new WeakMap(), this.dataIdsCount = 0; + } + get(e) { + return this.data.has(e) || this.dataMover.moveData(this.backend, e), this.data.get(e); + } + set(e, t10) { + this.dataIdsCount++, this.data.set(e, t10); + } + has(e) { + return this.data.has(e); + } + delete(e) { + return this.dataIdsCount--, this.data.delete(e); + } + numDataIds() { + return this.dataIdsCount; + } +}; +var Jr = class { + refCount(e) { + return Pr("refCount"); + } + incRef(e) { + return Pr("incRef"); + } + timerAvailable() { + return true; + } + time(e) { + return Pr("time"); + } + read(e) { + return Pr("read"); + } + readSync(e) { + return Pr("readSync"); + } + readToGPU(e, t10) { + return Pr("readToGPU"); + } + numDataIds() { + return Pr("numDataIds"); + } + disposeData(e, t10) { + return Pr("disposeData"); + } + write(e, t10, o) { + return Pr("write"); + } + move(e, t10, o, n, s) { + return Pr("move"); + } + createTensorFromTexture(e, t10, o) { + return Pr("createTensorFromTexture"); + } + memory() { + return Pr("memory"); + } + floatPrecision() { + return Pr("floatPrecision"); + } + epsilon() { + return this.floatPrecision() === 32 ? 1e-7 : 1e-4; + } + dispose() { + return Pr("dispose"); + } +}; +function Pr(r) { + throw new Error(`'${r}' not yet implemented or not found in the registry. This kernel may not be supported by the tfjs backend you have chosen`); +} +function c0(r) { + let e = r.length, t10 = 0; + for (; e > 0; ) + t10 = Math.random() * e | 0, e--, $m(r, e, t10); +} +function oz(r, e) { + if (r.length !== e.length) + throw new Error(`Array sizes must match to be shuffled together First array length was ${r.length}Second array length was ${e.length}`); + let t10 = r.length, o = 0; + for (; t10 > 0; ) + o = Math.random() * t10 | 0, t10--, $m(r, t10, o), $m(e, t10, o); +} +function op(r, e, t10) { + return Math.max(r, Math.min(e, t10)); +} +function nz(r) { + return r % 2 === 0 ? r : r + 1; +} +function $m(r, e, t10) { + let o = r[e]; + r[e] = r[t10], r[t10] = o; +} +function sz(r) { + let e = 0; + for (let t10 = 0; t10 < r.length; t10++) + e += r[t10]; + return e; +} +function az(r, e) { + let t10 = Math.random(); + return e * t10 + (1 - t10) * r; +} +function iz(r, e) { + let t10 = 0; + for (let o = 0; o < r.length; o++) { + let n = Number(r[o]) - Number(e[o]); + t10 += n * n; + } + return t10; +} +function $(r, e) { + if (!r) + throw new Error(typeof e == "string" ? e : e()); +} +function ht(r, e, t10 = "") { + $(Or(r, e), () => t10 + ` Shapes ${r} and ${e} must match`); +} +function eo(r) { + $(r != null, () => "The input to the tensor constructor must be a non-null value."); +} +function on(r, e = [], t10 = false) { + if (e == null && (e = []), Array.isArray(r) || Ut(r) && !t10) + for (let o = 0; o < r.length; ++o) + on(r[o], e, t10); + else + e.push(r); + return e; +} +function Ve(r) { + if (r.length === 0) + return 1; + let e = r[0]; + for (let t10 = 1; t10 < r.length; t10++) + e *= r[t10]; + return e; +} +function uz(r) { + return r.length === 0; +} +function Or(r, e) { + if (r === e) + return true; + if (r == null || e == null || r.length !== e.length) + return false; + for (let t10 = 0; t10 < r.length; t10++) + if (r[t10] !== e[t10]) + return false; + return true; +} +function ra(r) { + return r % 1 === 0; +} +function pz(r) { + if (Math.tanh != null) + return Math.tanh(r); + if (r === 1 / 0) + return 1; + if (r === -1 / 0) + return -1; + { + let e = Math.exp(2 * r); + return (e - 1) / (e + 1); + } +} +function cz(r) { + let e = Math.ceil(Math.sqrt(r)); + return [e, Math.ceil(r / e)]; +} +function lz(r) { + let e = new Uint32Array(r); + for (let t10 = 0; t10 < r; ++t10) + e[t10] = t10; + return c0(e), e; +} +function Mi(r, e) { + return e <= r.length ? r : r + " ".repeat(e - r.length); +} +function mz(r, e = (n) => 0, t10, o) { + return new Promise((n, s) => { + let a = 0, i = () => { + if (r()) { + n(); + return; + } + a++; + let p = e(a); + if (t10 != null && a >= t10) { + s(); + return; + } + o != null ? o(i, p) : setTimeout(i, p); + }; + i(); + }); +} +function fz(r, e) { + let t10 = 1, o = -1; + for (let s = 0; s < r.length; ++s) + if (r[s] >= 0) + t10 *= r[s]; + else if (r[s] === -1) { + if (o !== -1) + throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${o} and dim ${s}`); + o = s; + } else if (r[s] < 0) + throw Error(`Shapes can not be < 0. Found ${r[s]} at dim ${s}`); + if (o === -1) { + if (e > 0 && e !== t10) + throw Error(`Size(${e}) must match the product of shape ${r}`); + return r; + } + if (t10 === 0) + throw Error(`Cannot infer the missing size in [${r}] when there are 0 elements`); + if (e % t10 !== 0) + throw Error(`The implicit shape can't be a fractional number. Got ${e} / ${t10}`); + let n = r.slice(); + return n[o] = e / t10, n; +} +function Ka(r, e) { + let t10 = e.length; + return r = r == null ? e.map((o, n) => n) : [].concat(r), $(r.every((o) => o >= -t10 && o < t10), () => `All values in axis param must be in range [-${t10}, ${t10}) but got axis ${r}`), $(r.every((o) => ra(o)), () => `All values in axis param must be integers but got axis ${r}`), r.map((o) => o < 0 ? t10 + o : o); +} +function db(r, e) { + let t10 = [], o = [], n = e != null && Array.isArray(e) && e.length === 0, s = e == null || n ? null : Ka(e, r).sort(), a = 0; + for (let i = 0; i < r.length; ++i) { + if (s != null) { + if (s[a] === i && r[i] !== 1) + throw new Error(`Can't squeeze axis ${i} since its dim '${r[i]}' is not 1`); + (s[a] == null || s[a] > i) && r[i] === 1 && (t10.push(r[i]), o.push(i)), s[a] <= i && a++; + } + r[i] !== 1 && (t10.push(r[i]), o.push(i)); + } + return { newShape: t10, keptDims: o }; +} +function hb(r, e) { + let t10 = null; + if (r == null || r === "float32") + t10 = new Float32Array(e); + else if (r === "int32") + t10 = new Int32Array(e); + else if (r === "bool") + t10 = new Uint8Array(e); + else + throw new Error(`Unknown data type ${r}`); + return t10; +} +function gb(r, e) { + let t10 = null; + if (r == null || r === "float32") + t10 = new Float32Array(e); + else if (r === "int32") + t10 = new Int32Array(e); + else if (r === "bool") + t10 = new Uint8Array(e); + else if (r === "string") + t10 = new Array(e); + else + throw new Error(`Unknown data type ${r}`); + return t10; +} +function xb(r, e) { + for (let t10 = 0; t10 < r.length; t10++) { + let o = r[t10]; + if (isNaN(o) || !isFinite(o)) + throw Error(`A tensor of type ${e} being uploaded contains ${o}.`); + } +} +function yb(r) { + return r === "bool" || r === "complex64" || r === "float32" || r === "int32" || r === "string"; +} +function dz(r, e) { + return !(e === "complex64" || e === "float32" && r !== "complex64" || e === "int32" && r !== "float32" && r !== "complex64" || e === "bool" && r === "bool"); +} +function Ut(r) { + return r instanceof Float32Array || r instanceof Int32Array || r instanceof Uint8Array || r instanceof Uint8ClampedArray; +} +function Rm(r) { + if (r === "float32" || r === "int32") + return 4; + if (r === "complex64") + return 8; + if (r === "bool") + return 1; + throw new Error(`Unknown dtype ${r}`); +} +function bb(r) { + if (r == null) + return 0; + let e = 0; + return r.forEach((t10) => e += t10.length), e; +} +function nn(r) { + return typeof r == "string" || r instanceof String; +} +function l0(r) { + return typeof r == "boolean"; +} +function m0(r) { + return typeof r == "number"; +} +function np(r) { + return Array.isArray(r) ? np(r[0]) : r instanceof Float32Array ? "float32" : r instanceof Int32Array || r instanceof Uint8Array || r instanceof Uint8ClampedArray ? "int32" : m0(r) ? "float32" : nn(r) ? "string" : l0(r) ? "bool" : "float32"; +} +function fs(r) { + return !!(r && r.constructor && r.call && r.apply); +} +function sp(r, e) { + for (let t10 = e; t10 < r; ++t10) + if (r % t10 === 0) + return t10; + return r; +} +function ds(r) { + let e = r.length; + if (e < 2) + return []; + let t10 = new Array(e - 1); + t10[e - 2] = r[e - 1]; + for (let o = e - 3; o >= 0; --o) + t10[o] = t10[o + 1] * r[o + 1]; + return t10; +} +function f0(r, e, t10, o = false) { + let n = new Array(); + if (e.length === 1) { + let s = e[0] * (o ? 2 : 1); + for (let a = 0; a < s; a++) + n[a] = t10[r + a]; + } else { + let s = e[0], a = e.slice(1), i = a.reduce((p, u) => p * u) * (o ? 2 : 1); + for (let p = 0; p < s; p++) + n[p] = f0(r + p * i, a, t10, o); + } + return n; +} +function Oi(r, e, t10 = false) { + if (r.length === 0) + return e[0]; + let o = r.reduce((n, s) => n * s) * (t10 ? 2 : 1); + if (o === 0) + return []; + if (o !== e.length) + throw new Error(`[${r}] does not match the input size ${e.length}${t10 ? " for a complex tensor" : ""}.`); + return f0(0, r, e, t10); +} +function jc(r, e) { + let t10 = ap(r, e); + for (let o = 0; o < t10.length; o++) + t10[o] = 1; + return t10; +} +function ap(r, e) { + if (e == null || e === "float32" || e === "complex64") + return new Float32Array(r); + if (e === "int32") + return new Int32Array(r); + if (e === "bool") + return new Uint8Array(r); + throw new Error(`Unknown data type ${e}`); +} +function hz(r, e) { + let t10 = r.reduce((o, n) => o * n, 1); + if (e == null || e === "float32") + return Oi(r, new Float32Array(t10)); + if (e === "int32") + return Oi(r, new Int32Array(t10)); + if (e === "bool") + return Oi(r, new Uint8Array(t10)); + throw new Error(`Unknown data type ${e}`); +} +function Xc(r) { + r.forEach((e) => { + $(Number.isInteger(e) && e >= 0, () => `Tensor must have a shape comprised of positive integers but got shape [${r}].`); + }); +} +function gz(r, e, t10) { + if (e === 0) + return 0; + if (e === 1) + return r[0]; + let o = r[r.length - 1]; + for (let n = 0; n < r.length - 1; ++n) + o += t10[n] * r[n]; + return o; +} +function xz(r, e, t10) { + if (e === 0) + return []; + if (e === 1) + return [r]; + let o = new Array(e); + for (let n = 0; n < o.length - 1; ++n) + o[n] = Math.floor(r / t10[n]), r -= o[n] * t10[n]; + return o[o.length - 1] = r, o; +} +function Yc(r) { + return r && r.then && typeof r.then == "function"; +} +var d0 = "tfjsflags"; +var Qc = class { + constructor(e) { + this.global = e, this.flags = {}, this.flagRegistry = {}, this.urlFlags = {}, this.getQueryParams = bz, this.populateURLFlags(); + } + setPlatform(e, t10) { + this.platform != null && (P().getBool("IS_TEST") || P().getBool("PROD") || console.warn(`Platform ${this.platformName} has already been set. Overwriting the platform with ${e}.`)), this.platformName = e, this.platform = t10; + } + registerFlag(e, t10, o) { + if (this.flagRegistry[e] = { evaluationFn: t10, setHook: o }, this.urlFlags[e] != null) { + let n = this.urlFlags[e]; + P().getBool("IS_TEST") || P().getBool("PROD") || console.warn(`Setting feature override from URL ${e}: ${n}.`), this.set(e, n); + } + } + async getAsync(e) { + return e in this.flags ? this.flags[e] : (this.flags[e] = await this.evaluateFlag(e), this.flags[e]); + } + get(e) { + if (e in this.flags) + return this.flags[e]; + let t10 = this.evaluateFlag(e); + if (Yc(t10)) + throw new Error(`Flag ${e} cannot be synchronously evaluated. Please use getAsync() instead.`); + return this.flags[e] = t10, this.flags[e]; + } + getNumber(e) { + return this.get(e); + } + getBool(e) { + return this.get(e); + } + getFlags() { + return this.flags; + } + get features() { + return this.flags; + } + set(e, t10) { + if (this.flagRegistry[e] == null) + throw new Error(`Cannot set flag ${e} as it has not been registered.`); + this.flags[e] = t10, this.flagRegistry[e].setHook != null && this.flagRegistry[e].setHook(t10); + } + evaluateFlag(e) { + if (this.flagRegistry[e] == null) + throw new Error(`Cannot evaluate flag '${e}': no evaluation function found.`); + return this.flagRegistry[e].evaluationFn(); + } + setFlags(e) { + this.flags = Object.assign({}, e); + } + 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; + let e = this.getQueryParams(this.global.location.search); + d0 in e && e[d0].split(",").forEach((o) => { + let [n, s] = o.split(":"); + this.urlFlags[n] = Iz(n, s); + }); + } +}; +function bz(r) { + let e = {}; + return r.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g, (t10, ...o) => (Cz(e, o[0], o[1]), o.join("="))), e; +} +function Cz(r, e, t10) { + r[decodeURIComponent(e)] = decodeURIComponent(t10 || ""); +} +function Iz(r, e) { + if (e = e.toLowerCase(), e === "true" || e === "false") + return e === "true"; + if (`${+e}` === e) + return +e; + throw new Error(`Could not parse value flag value ${e} for flag ${r}.`); +} +function P() { + return Cb; +} +var Cb = null; +function h0(r) { + Cb = r; +} +var Ib; +function wb() { + if (Ib == null) { + let r; + if (typeof window != "undefined") + r = window; + else if (typeof global != "undefined") + r = global; + else if (typeof process != "undefined") + r = process; + else if (typeof self != "undefined") + r = self; + else + throw new Error("Could not find a global object"); + Ib = r; + } + return Ib; +} +function wz() { + let r = wb(); + return r._tfGlobals == null && (r._tfGlobals = /* @__PURE__ */ new Map()), r._tfGlobals; +} +function Zc(r, e) { + let t10 = wz(); + if (t10.has(r)) + return t10.get(r); + { + let o = e(); + return t10.set(r, o), t10.get(r); + } +} +var sn = "Abs"; +var Li = "Acos"; +var Bi = "Acosh"; +var _r = "Add"; +var an = "AddN"; +var oa = "All"; +var na = "Any"; +var un = "ArgMax"; +var ja = "ArgMin"; +var Vi = "Asin"; +var zi = "Asinh"; +var Wi = "Atan"; +var Ui = "Atanh"; +var sa = "Atan2"; +var pn = "AvgPool"; +var Am = "AvgPoolGrad"; +var ip = "AvgPool3D"; +var Fm = "AvgPool3DGrad"; +var cn = "BatchMatMul"; +var hs = "BatchToSpaceND"; +var up = "Bincount"; +var Tne = "BroadcastTo"; +var pp = "BroadcastArgs"; +var to = "Cast"; +var ro = "Ceil"; +var Ro = "ClipByValue"; +var aa = "Complex"; +var cp = "ComplexAbs"; +var gs = "Concat"; +var ln = "Conv2D"; +var lp = "Conv2DBackpropFilter"; +var mn = "Conv2DBackpropInput"; +var mp = "Conv3D"; +var Dm = "Conv3DBackpropFilterV2"; +var fp = "Conv3DBackpropInputV2"; +var fn = "Cos"; +var dn = "Cosh"; +var hn = "Cumprod"; +var gn = "Cumsum"; +var xn = "CropAndResize"; +var dp = "DenseBincount"; +var yn = "DepthToSpace"; +var bn = "DepthwiseConv2dNative"; +var hp = "DepthwiseConv2dNativeBackpropFilter"; +var gp = "DepthwiseConv2dNativeBackpropInput"; +var xp = "Diag"; +var yp = "Dilation2D"; +var Sb = "Dilation2DBackpropInput"; +var vb = "Dilation2DBackpropFilter"; +var Cn = "RealDiv"; +var Xa = "Einsum"; +var In = "Elu"; +var Pm = "EluGrad"; +var Gi = "Erf"; +var oo = "Equal"; +var no = "Exp"; +var xs = "ExpandDims"; +var wn = "Expm1"; +var bp = "FFT"; +var ys = "Fill"; +var Sn = "FlipLeftRight"; +var so = "Floor"; +var vn = "FloorDiv"; +var kn = "FusedBatchNorm"; +var bs = "GatherV2"; +var Tn = "GatherNd"; +var ao = "Greater"; +var io = "GreaterEqual"; +var uo = "Identity"; +var Cp = "IFFT"; +var Ya = "Imag"; +var Hi = "IsFinite"; +var qi = "IsInf"; +var ia = "IsNan"; +var Nn = "LeakyRelu"; +var po = "Less"; +var co = "LessEqual"; +var Ip = "LinSpace"; +var lo = "Log"; +var Ki = "Log1p"; +var _n = "LogicalAnd"; +var En = "LogicalNot"; +var ua = "LogicalOr"; +var g0 = "LogicalXor"; +var Nne = "LogSoftmax"; +var _ne = "LowerBound"; +var wp = "LRN"; +var Om = "LRNGrad"; +var $n = "Max"; +var mo = "Maximum"; +var Rn = "MaxPool"; +var Mm = "MaxPoolGrad"; +var Sp = "MaxPool3D"; +var Lm = "MaxPool3DGrad"; +var vp = "MaxPoolWithArgmax"; +var An = "Mean"; +var Fn = "Min"; +var fo = "Minimum"; +var Dn = "MirrorPad"; +var ji = "Mod"; +var kp = "Multinomial"; +var ho = "Multiply"; +var Pn = "Neg"; +var go = "NotEqual"; +var On = "NonMaxSuppressionV3"; +var pa = "NonMaxSuppressionV4"; +var Mn = "NonMaxSuppressionV5"; +var Cs = "OnesLike"; +var ca = "OneHot"; +var Is = "Pack"; +var Ln = "PadV2"; +var Ene = "Pool"; +var Bn = "Pow"; +var Vn = "Prelu"; +var Ao = "Prod"; +var Tp = "RaggedGather"; +var Np = "RaggedRange"; +var _p = "RaggedTensorToTensor"; +var ws = "Range"; +var la = "Real"; +var ma = "Reciprocal"; +var zn = "Relu"; +var Ss = "Reshape"; +var Wn = "ResizeNearestNeighbor"; +var Bm = "ResizeNearestNeighborGrad"; +var Un = "ResizeBilinear"; +var Vm = "ResizeBilinearGrad"; +var Gn = "Relu6"; +var fa = "Reverse"; +var da = "Round"; +var xo = "Rsqrt"; +var Hn = "ScatterNd"; +var Ep = "SearchSorted"; +var vs = "Select"; +var Xi = "Selu"; +var qn = "Slice"; +var Kn = "Sin"; +var ha = "Sinh"; +var Yi = "Sign"; +var yo = "Sigmoid"; +var Qi = "Softplus"; +var bo = "Sqrt"; +var jn = "Sum"; +var ks = "SpaceToBatchND"; +var Ts = "SplitV"; +var Xn = "Softmax"; +var Qa = "SparseFillEmptyRows"; +var ga = "SparseReshape"; +var Za = "SparseSegmentMean"; +var Ja = "SparseSegmentSum"; +var ei = "SparseToDense"; +var Co = "SquaredDifference"; +var ti = "Square"; +var Yn = "StridedSlice"; +var Ns = "StringNGrams"; +var ri = "StringSplit"; +var oi = "StringToHashBucketFast"; +var Io = "Sub"; +var xa = "Tan"; +var Qn = "Tanh"; +var wo = "Tile"; +var Zn = "TopK"; +var Jn = "Transform"; +var Mr = "Transpose"; +var $p = "Unique"; +var _s = "Unpack"; +var Rp = "UnsortedSegmentSum"; +var $ne = "UpperBound"; +var Es = "ZerosLike"; +var $s = "Step"; +var Zi = "FromPixels"; +var es = "RotateWithOffset"; +var Fo = "_FusedMatMul"; +var Do = "FusedConv2D"; +var Po = "FusedDepthwiseConv2D"; +function Rs(...r) { + P().getBool("IS_TEST") || P().getBool("PROD") || console.warn(...r); +} +function Sz(...r) { + P().getBool("IS_TEST") || P().getBool("PROD") || console.log(...r); +} +var Ap = Zc("kernelRegistry", () => /* @__PURE__ */ new Map()); +var Jc = Zc("gradRegistry", () => /* @__PURE__ */ new Map()); +function el(r, e) { + let t10 = Tb(r, e); + return Ap.get(t10); +} +function kb(r) { + return Jc.get(r); +} +function zm(r) { + let e = Ap.entries(), t10 = []; + for (; ; ) { + let { done: o, value: n } = e.next(); + if (o) + break; + let [s, a] = n, [i] = s.split("_"); + i === r && t10.push(a); + } + return t10; +} +function ya(r) { + let { kernelName: e, backendName: t10 } = r, o = Tb(e, t10); + Ap.has(o) && Rs(`The kernel '${e}' for backend '${t10}' is already registered`), Ap.set(o, r); +} +function Pne(r) { + let { kernelName: e } = r; + Jc.has(e) && P().getBool("DEBUG") && Rs(`Overriding the gradient for '${e}'`), Jc.set(e, r); +} +function One(r, e) { + let t10 = Tb(r, e); + if (!Ap.has(t10)) + throw new Error(`The kernel '${r}' for backend '${e}' is not registered`); + Ap.delete(t10); +} +function Mne(r) { + if (!Jc.has(r)) + throw new Error(`The gradient '${r}' for backend is not registered`); + Jc.delete(r); +} +function Lne(r, e) { + zm(r).forEach((o) => { + let n = Object.assign({}, o, { backendName: e }); + ya(n); + }); +} +function Tb(r, e) { + return `${e}_${r}`; +} +var x = {}; +Be(x, { arraysEqual: () => Or, assert: () => $, assertNonNegativeIntegerDimensions: () => Xc, assertNonNull: () => eo, assertShapesMatch: () => ht, bytesFromStringArray: () => bb, bytesPerElement: () => Rm, checkConversionForErrors: () => xb, clamp: () => op, computeStrides: () => ds, createScalarValue: () => $z, createShuffledIndices: () => lz, decodeString: () => Op, distSquared: () => iz, encodeString: () => si, fetch: () => Az, fingerPrint64: () => Ez, flatten: () => on, getArrayFromDType: () => gb, getTypedArrayFromDType: () => hb, hasEncodingLoss: () => dz, hexToLong: () => tl, indexToLoc: () => xz, inferDtype: () => np, inferFromImplicitShape: () => fz, isBoolean: () => l0, isFunction: () => fs, isInt: () => ra, isNumber: () => m0, isPromise: () => Yc, isScalarShape: () => uz, isString: () => nn, isTypedArray: () => Ut, isValidDtype: () => yb, locToIndex: () => gz, makeOnesTypedArray: () => jc, makeZerosNestedTypedArray: () => hz, makeZerosTypedArray: () => ap, nearestDivisor: () => sp, nearestLargerEven: () => nz, now: () => ou, parseAxisParam: () => Ka, randUniform: () => az, repeatedTry: () => mz, rightPad: () => Mi, shuffle: () => c0, shuffleCombo: () => oz, sizeFromShape: () => Ve, sizeToSquarishShape: () => cz, squeezeShape: () => db, sum: () => sz, swap: () => $m, tanh: () => pz, toNestedArray: () => Oi, toTypedArray: () => Pp }); +var $b = rp(_0()); +var ru = $b.default || $b; +function tl(r) { + return ru.fromString(r, true, 16); +} +var $0 = tl("c3a5c85c97cb3127"); +var tu = tl("b492b66fbe98f273"); +var gr = tl("9ae16a3b2f90404f"); +function Eb(r) { + return r.xor(r.shru(47)); +} +function R0(r, e, t10) { + let o = r.slice(e, e + t10); + return ru.fromBytes(Array.from(o), true, true); +} +function yt(r, e) { + return R0(r, e, 8); +} +function E0(r, e) { + return R0(r, e, 4); +} +function Xt(r, e) { + return e === 0 ? r : r.shru(e).or(r.shl(64 - e)); +} +function ni(r, e, t10 = tl("9ddfea08eb382d69")) { + let o = r.xor(e).mul(t10); + o = o.xor(o.shru(47)); + let n = e.xor(o).mul(t10); + return n = n.xor(n.shru(47)), n = n.mul(t10), n; +} +function kz(r, e, t10, o, n, s) { + n = n.add(r), s = Xt(s.add(n).add(o), 21); + let a = n; + return n = n.add(e), n = n.add(t10), s = s.add(Xt(n, 44)), [n.add(o), s.add(a)]; +} +function Um(r, e, t10, o) { + return kz(yt(r, e), yt(r, e + 8), yt(r, e + 16), yt(r, e + 24), t10, o); +} +function Tz(r, e = r.length) { + if (e >= 8) { + let t10 = gr.add(e * 2), o = yt(r, 0).add(gr), n = yt(r, e - 8), s = Xt(n, 37).mul(t10).add(o), a = Xt(o, 25).add(n).mul(t10); + return ni(s, a, t10); + } + if (e >= 4) { + let t10 = gr.add(e * 2), o = E0(r, 0); + return ni(o.shl(3).add(e), E0(r, e - 4), t10); + } + if (e > 0) { + let t10 = r[0], o = r[e >> 1], n = r[e - 1], s = t10 + (o << 8), a = e + (n << 2); + return Eb(gr.mul(s).xor($0.mul(a))).mul(gr); + } + return gr; +} +function Nz(r, e = r.length) { + let t10 = gr.add(e * 2), o = yt(r, 0).mul(tu), n = yt(r, 8), s = yt(r, e - 8).mul(t10), a = yt(r, e - 16).mul(gr); + return ni(Xt(o.add(n), 43).add(Xt(s, 30)).add(a), o.add(Xt(n.add(gr), 18)).add(s), t10); +} +function _z(r, e = r.length) { + let t10 = gr.add(e * 2), o = yt(r, 0).mul(gr), n = yt(r, 8), s = yt(r, e - 8).mul(t10), a = yt(r, e - 16).mul(gr), i = Xt(o.add(n), 43).add(Xt(s, 30)).add(a), p = ni(i, o.add(Xt(n.add(gr), 18)).add(s), t10), u = yt(r, 16).mul(t10), c = yt(r, 24), l = i.add(yt(r, e - 32)).mul(t10), m = p.add(yt(r, e - 24)).mul(t10); + return ni(Xt(u.add(c), 43).add(Xt(l, 30)).add(m), u.add(Xt(c.add(o), 18)).add(l), t10); +} +function Ez(r, e = r.length) { + let t10 = ru.fromNumber(81, true); + if (e <= 32) + return e <= 16 ? Tz(r, e) : Nz(r, e); + if (e <= 64) + return _z(r, e); + let o = t10, n = t10.mul(tu).add(113), s = Eb(n.mul(gr).add(113)).mul(gr), a = [ru.UZERO, ru.UZERO], i = [ru.UZERO, ru.UZERO]; + o = o.mul(gr).add(yt(r, 0)); + let p = 0, u = (e - 1 >> 6) * 64, c = u + (e - 1 & 63) - 63; + do + o = Xt(o.add(n).add(a[0]).add(yt(r, p + 8)), 37).mul(tu), n = Xt(n.add(a[1]).add(yt(r, p + 48)), 42).mul(tu), o = o.xor(i[1]), n = n.add(a[0]).add(yt(r, p + 40)), s = Xt(s.add(i[0]), 33).mul(tu), a = Um(r, p, a[1].mul(tu), o.add(i[0])), i = Um(r, p + 32, s.add(i[1]), n.add(yt(r, p + 16))), [s, o] = [o, s], p += 64; + while (p !== u); + let l = tu.add(s.and(255).shl(1)); + return p = c, i[0] = i[0].add(e - 1 & 63), a[0] = a[0].add(i[0]), i[0] = i[0].add(a[0]), o = Xt(o.add(n).add(a[0]).add(yt(r, p + 8)), 37).mul(l), n = Xt(n.add(a[1]).add(yt(r, p + 48)), 42).mul(l), o = o.xor(i[1].mul(9)), n = n.add(a[0].mul(9).add(yt(r, p + 40))), s = Xt(s.add(i[0]), 33).mul(l), a = Um(r, p, a[1].mul(l), o.add(i[0])), i = Um(r, p + 32, s.add(i[1]), n.add(yt(r, p + 16))), [s, o] = [o, s], ni(ni(a[0], i[0], l).add(Eb(n).mul($0)).add(s), ni(a[1], i[1], l).add(o), l); +} +function $z(r, e) { + return e === "string" ? si(r) : Pp([r], e); +} +function Rz(r, e) { + return r instanceof Float32Array && e === "float32" || r instanceof Int32Array && e === "int32" || r instanceof Uint8Array && e === "bool"; +} +function Pp(r, e) { + if (e === "string") + throw new Error("Cannot convert a string[] to a TypedArray"); + if (Array.isArray(r) && (r = on(r)), P().getBool("DEBUG") && xb(r, e), Rz(r, e)) + return r; + if (e == null || e === "float32" || e === "complex64") + return new Float32Array(r); + if (e === "int32") + return new Int32Array(r); + if (e === "bool") { + let t10 = new Uint8Array(r.length); + for (let o = 0; o < t10.length; ++o) + Math.round(r[o]) !== 0 && (t10[o] = 1); + return t10; + } else + throw new Error(`Unknown data type ${e}`); +} +function ou() { + return P().platform.now(); +} +function Az(r, e) { + return P().platform.fetch(r, e); +} +function si(r, e = "utf-8") { + return e = e || "utf-8", P().platform.encode(r, e); +} +function Op(r, e = "utf-8") { + return e = e || "utf-8", P().platform.decode(r, e); +} +var Gm = class { + constructor(e, t10) { + this.backendTimer = e, this.logger = t10, t10 == null && (this.logger = new Rb()); + } + profileKernel(e, t10, o) { + let n, s = () => { + n = o(); + }, a, i = ou(); + if (this.backendTimer.timerAvailable()) + a = this.backendTimer.time(s); + else { + s(); + for (let u of n) + u.dataSync(); + a = Promise.resolve({ kernelMs: ou() - i }); + } + if (P().getBool("CHECK_COMPUTATION_FOR_ERRORS")) + for (let u = 0; u < n.length; u++) { + let c = n[u]; + c.data().then((l) => { + Fz(l, c.dtype, e); + }); + } + return { kernelName: e, outputs: n, inputs: t10, timeMs: a.then((u) => u.kernelMs), extraInfo: a.then((u) => u.getExtraProfileInfo != null ? u.getExtraProfileInfo() : "") }; + } + logKernelProfile(e) { + let { kernelName: t10, outputs: o, timeMs: n, inputs: s, extraInfo: a } = e; + o.forEach((i) => { + Promise.all([i.data(), n, a]).then((p) => { + this.logger.logKernelProfile(t10, i, p[0], p[1], s, p[2]); + }); + }); + } +}; +function Fz(r, e, t10) { + if (e !== "float32") + return false; + for (let o = 0; o < r.length; o++) { + let n = r[o]; + if (isNaN(n) || !isFinite(n)) + return console.warn(`Found ${n} in the result of '${t10}'`), true; + } + return false; +} +var Rb = class { + logKernelProfile(e, t10, o, n, s, a) { + let i = typeof n == "number" ? Mi(`${n}ms`, 9) : n.error, p = Mi(e, 25), u = t10.rank, c = t10.size, l = Mi(t10.shape.toString(), 14), m = ""; + for (let f in s) { + let d = s[f]; + if (d != null) { + let h = d.shape || t10.shape, g = h.length; + m += `${f}: ${g}D ${g > 0 ? h : ""} `; + } + } + console.log(`%c${p} %c${i} %c${u}D ${l} %c${c} %c${m} %c${a}`, "font-weight:bold", "color:red", "color:blue", "color: orange", "color: green", "color: steelblue"); + } +}; +function A0(r, e, t10) { + let o = {}, n = {}; + for (let p = 0; p < e.length; p++) + o[e[p].id] = true; + for (let p = 0; p < r.length; p++) { + let u = r[p], c = u.inputs; + for (let l in c) { + let m = c[l], f = false; + for (let d = 0; d < e.length; d++) + if (o[m.id]) { + u.outputs.forEach((h) => o[h.id] = true), f = true, n[u.id] = true; + break; + } + if (f) + break; + } + } + let s = {}; + s[t10.id] = true; + let a = {}; + for (let p = r.length - 1; p >= 0; p--) { + let u = r[p], c = u.inputs; + for (let l = 0; l < u.outputs.length; l++) + if (s[u.outputs[l].id]) { + for (let m in c) + s[c[m].id] = true, a[u.id] = true; + break; + } + } + let i = []; + for (let p = 0; p < r.length; p++) { + let u = r[p]; + if (n[u.id] && a[u.id]) { + let c = {}; + for (let m in u.inputs) { + let f = u.inputs[m]; + o[f.id] && (c[m] = f); + } + let l = Object.assign({}, u); + l.inputs = c, l.outputs = u.outputs, i.push(l); + } + } + return i; +} +function F0(r, e, t10, o) { + for (let n = e.length - 1; n >= 0; n--) { + let s = e[n], a = []; + if (s.outputs.forEach((p) => { + let u = r[p.id]; + u != null ? a.push(u) : a.push(null); + }), s.gradient == null) + throw new Error(`Cannot compute gradient: gradient function not found for ${s.kernelName}.`); + let i = s.gradient(a); + for (let p in s.inputs) { + if (!(p in i)) + throw new Error(`Cannot backprop through input ${p}. Available gradients found: ${Object.keys(i)}.`); + let u = t10(() => i[p]()); + if (u.dtype !== "float32") + throw new Error(`Error in gradient for op ${s.kernelName}. The gradient of input ${p} must have 'float32' dtype, but has '${u.dtype}'`); + let c = s.inputs[p]; + if (!Or(u.shape, c.shape)) + throw new Error(`Error in gradient for op ${s.kernelName}. The gradient of input '${p}' has shape '${u.shape}', which does not match the shape of the input '${c.shape}'`); + if (r[c.id] == null) + r[c.id] = u; + else { + let l = r[c.id]; + r[c.id] = o(l, u), l.dispose(); + } + } + } +} +var D0 = 20; +var rl = 3; +var Ab = 7; +function P0(r, e, t10, o) { + let n = ds(e), s = Dz(r, e, t10, n), a = e.length, i = Hm(r, e, t10, n, s), p = ["Tensor"]; + return o && (p.push(` dtype: ${t10}`), p.push(` rank: ${a}`), p.push(` shape: [${e}]`), p.push(" values:")), p.push(i.map((u) => " " + u).join(` +`)), p.join(` +`); +} +function Dz(r, e, t10, o) { + let n = Ve(e), s = o[o.length - 1], a = new Array(s).fill(0), i = e.length, p = t10 === "complex64" ? nl(r) : r; + if (i > 1) + for (let u = 0; u < n / s; u++) { + let c = u * s; + for (let l = 0; l < s; l++) + a[l] = Math.max(a[l], ol(p[c + l], 0, t10).length); + } + return a; +} +function ol(r, e, t10) { + let o; + return Array.isArray(r) ? o = `${parseFloat(r[0].toFixed(Ab))} + ${parseFloat(r[1].toFixed(Ab))}j` : nn(r) ? o = `'${r}'` : t10 === "bool" ? o = O0(r) : o = parseFloat(r.toFixed(Ab)).toString(), Mi(o, e); +} +function O0(r) { + return r === 0 ? "false" : "true"; +} +function Hm(r, e, t10, o, n, s = true) { + let a = t10 === "complex64" ? 2 : 1, i = e[0], p = e.length; + if (p === 0) { + if (t10 === "complex64") { + let h = nl(r); + return [ol(h[0], 0, t10)]; + } + return t10 === "bool" ? [O0(r[0])] : [r[0].toString()]; + } + if (p === 1) { + if (i > D0) { + let g = rl * a, y = Array.from(r.slice(0, g)), b = Array.from(r.slice((i - rl) * a, i * a)); + return t10 === "complex64" && (y = nl(y), b = nl(b)), ["[" + y.map((C, w) => ol(C, n[w], t10)).join(", ") + ", ..., " + b.map((C, w) => ol(C, n[i - rl + w], t10)).join(", ") + "]"]; + } + return ["[" + (t10 === "complex64" ? nl(r) : Array.from(r)).map((g, y) => ol(g, n[y], t10)).join(", ") + "]"]; + } + let u = e.slice(1), c = o.slice(1), l = o[0] * a, m = []; + if (i > D0) { + for (let h = 0; h < rl; h++) { + let g = h * l, y = g + l; + m.push(...Hm(r.slice(g, y), u, t10, c, n, false)); + } + m.push("..."); + for (let h = i - rl; h < i; h++) { + let g = h * l, y = g + l; + m.push(...Hm(r.slice(g, y), u, t10, c, n, h === i - 1)); + } + } else + for (let h = 0; h < i; h++) { + let g = h * l, y = g + l; + m.push(...Hm(r.slice(g, y), u, t10, c, n, h === i - 1)); + } + let f = p === 2 ? "," : ""; + m[0] = "[" + m[0] + f; + for (let h = 1; h < m.length - 1; h++) + m[h] = " " + m[h] + f; + let d = `, +`; + for (let h = 2; h < p; h++) + d += ` +`; + return m[m.length - 1] = " " + m[m.length - 1] + "]" + (s ? "" : d), m; +} +function nl(r) { + let e = []; + for (let t10 = 0; t10 < r.length; t10 += 2) + e.push([r[t10], r[t10 + 1]]); + return e; +} +var je = class { + constructor(e, t10, o) { + if (this.dtype = t10, this.shape = e.slice(), this.size = Ve(e), o != null) { + let n = o.length; + $(n === this.size, () => `Length of values '${n}' does not match the size inferred by the shape '${this.size}'.`); + } + if (t10 === "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 = o || gb(t10, this.size), this.strides = ds(e); + } + set(e, ...t10) { + t10.length === 0 && (t10 = [0]), $(t10.length === this.rank, () => `The number of provided coordinates (${t10.length}) must match the rank (${this.rank})`); + let o = this.locToIndex(t10); + this.values[o] = e; + } + get(...e) { + e.length === 0 && (e = [0]); + let t10 = 0; + for (let n of e) { + if (n < 0 || n >= this.shape[t10]) { + let s = `Requested out of range element at ${e}. Buffer shape=${this.shape}`; + throw new Error(s); + } + t10++; + } + let o = e[e.length - 1]; + for (let n = 0; n < e.length - 1; ++n) + o += this.strides[n] * e[n]; + return this.values[o]; + } + locToIndex(e) { + if (this.rank === 0) + return 0; + if (this.rank === 1) + return e[0]; + let t10 = e[e.length - 1]; + for (let o = 0; o < e.length - 1; ++o) + t10 += this.strides[o] * e[o]; + return t10; + } + indexToLoc(e) { + if (this.rank === 0) + return []; + if (this.rank === 1) + return [e]; + let t10 = new Array(this.shape.length); + for (let o = 0; o < t10.length - 1; ++o) + t10[o] = Math.floor(e / this.strides[o]), e -= t10[o] * this.strides[o]; + return t10[t10.length - 1] = e, t10; + } + get rank() { + return this.shape.length; + } + toTensor() { + return rs().makeTensor(this.values, this.shape, this.dtype); + } +}; +var rs = null; +var Mp = null; +var Pz = null; +function M0(r) { + rs = r; +} +function L0(r) { + Mp = r; +} +function B0(r) { + Pz = r; +} +var ut = class { + constructor(e, t10, o, n) { + this.kept = false, this.isDisposedInternal = false, this.shape = e.slice(), this.dtype = t10 || "float32", this.size = Ve(e), this.strides = ds(e), this.dataId = o, this.id = n, this.rankType = this.rank < 5 ? this.rank.toString() : "higher"; + } + get rank() { + return this.shape.length; + } + async buffer() { + let e = await this.data(); + return Mp.buffer(this.shape, this.dtype, e); + } + bufferSync() { + return Mp.buffer(this.shape, this.dtype, this.dataSync()); + } + async array() { + let e = await this.data(); + return Oi(this.shape, e, this.dtype === "complex64"); + } + arraySync() { + return Oi(this.shape, this.dataSync(), this.dtype === "complex64"); + } + async data() { + this.throwIfDisposed(); + let e = rs().read(this.dataId); + if (this.dtype === "string") { + let t10 = await e; + try { + return t10.map((o) => Op(o)); + } catch (o) { + throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes()."); + } + } + return e; + } + dataToGPU(e) { + return this.throwIfDisposed(), rs().readToGPU(this.dataId, e); + } + dataSync() { + this.throwIfDisposed(); + let e = rs().readSync(this.dataId); + if (this.dtype === "string") + try { + return e.map((t10) => Op(t10)); + } catch (t10) { + 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 rs().read(this.dataId); + return this.dtype === "string" ? e : new Uint8Array(e.buffer); + } + dispose() { + this.isDisposed || (rs().disposeTensor(this), this.isDisposedInternal = true); + } + get isDisposed() { + return this.isDisposedInternal; + } + throwIfDisposed() { + if (this.isDisposed) + throw new Error("Tensor is disposed."); + } + print(e = false) { + return Mp.print(this, e); + } + clone() { + return this.throwIfDisposed(), Mp.clone(this); + } + toString(e = false) { + let t10 = this.dataSync(); + return P0(t10, this.shape, this.dtype, e); + } + cast(e) { + return this.throwIfDisposed(), Mp.cast(this, e); + } + variable(e = true, t10, o) { + return this.throwIfDisposed(), rs().makeVariable(this, e, t10, o); + } +}; +Object.defineProperty(ut, Symbol.hasInstance, { value: (r) => !!r && r.data != null && r.dataSync != null && r.throwIfDisposed != null }); +function Oz() { + return Zc("Tensor", () => ut); +} +Oz(); +var ba = class extends ut { + constructor(e, t10, o, n) { + super(e.shape, e.dtype, e.dataId, n), this.trainable = t10, this.name = o; + } + 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 (!Or(e.shape, this.shape)) + throw new Error(`shape of the new value (${e.shape}) and previous value (${this.shape}) must match`); + rs().disposeTensor(this), this.dataId = e.dataId, rs().incRef(this, null); + } + dispose() { + rs().disposeVariable(this), this.isDisposedInternal = true; + } +}; +Object.defineProperty(ba, Symbol.hasInstance, { value: (r) => r instanceof ut && r.assign != null && r.assign instanceof Function }); +var z0 = {}; +Be(z0, { assertTypesMatch: () => Lb, getTensorsInContainer: () => sl, isTensorInList: () => Lz, makeTypesMatch: () => Re }); +var Fb; +(function(r) { + r.R0 = "R0", r.R1 = "R1", r.R2 = "R2", r.R3 = "R3", r.R4 = "R4", r.R5 = "R5", r.R6 = "R6"; +})(Fb || (Fb = {})); +var Db; +(function(r) { + r.float32 = "float32", r.int32 = "int32", r.bool = "int32", r.complex64 = "complex64"; +})(Db || (Db = {})); +var Pb; +(function(r) { + r.float32 = "float32", r.int32 = "int32", r.bool = "bool", r.complex64 = "complex64"; +})(Pb || (Pb = {})); +var Ob; +(function(r) { + r.float32 = "float32", r.int32 = "float32", r.bool = "float32", r.complex64 = "complex64"; +})(Ob || (Ob = {})); +var Mb; +(function(r) { + r.float32 = "complex64", r.int32 = "complex64", r.bool = "complex64", r.complex64 = "complex64"; +})(Mb || (Mb = {})); +var Mz = { float32: Ob, int32: Db, bool: Pb, complex64: Mb }; +function ct(r, e) { + if (r === "string" || e === "string") { + if (r === "string" && e === "string") + return "string"; + throw new Error(`Can not upcast ${r} with ${e}`); + } + return Mz[r][e]; +} +function Ca(r) { + return ct(r, "int32"); +} +function Re(r, e) { + if (r.dtype === e.dtype) + return [r, e]; + let t10 = ct(r.dtype, e.dtype); + return [r.cast(t10), e.cast(t10)]; +} +function Lb(r, e) { + $(r.dtype === e.dtype, () => `The dtypes of the first(${r.dtype}) and second(${e.dtype}) input must match`); +} +function Lz(r, e) { + return e.some((t10) => t10.id === r.id); +} +function sl(r) { + let e = []; + return V0(r, e, /* @__PURE__ */ new Set()), e; +} +function V0(r, e, t10) { + if (r == null) + return; + if (r instanceof ut) { + e.push(r); + return; + } + if (!Bz(r)) + return; + let o = r; + for (let n in o) { + let s = o[n]; + t10.has(s) || (t10.add(s), V0(s, e, t10)); + } +} +function Bz(r) { + return Array.isArray(r) || typeof r == "object"; +} +function Bb(r) { + return r.kernelName != null; +} +var qm = 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 = /* @__PURE__ */ 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((e) => e.name))); + } }; + } + dispose() { + for (let e in this.registeredVariables) + this.registeredVariables[e].dispose(); + } +}; +var ai = class { + constructor(e) { + this.ENV = e, this.registry = {}, this.registryFactory = {}, this.pendingBackendInitId = 0, this.state = new qm(); + } + async ready() { + if (this.pendingBackendInit != null) + return this.pendingBackendInit.then(() => { + }); + if (this.backendInstance != null) + return; + let e = this.getSortedBackends(); + for (let t10 = 0; t10 < e.length; t10++) { + let o = e[t10]; + if (await this.initializeBackend(o).success) { + await this.setBackend(o); + 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) { + let { name: e, asyncInit: t10 } = this.initializeBackendsAndReturnBest(); + if (t10) + throw new Error(`The highest priority backend '${e}' has not yet been initialized. Make sure to await tf.ready() or await tf.setBackend() before calling other methods`); + this.setBackend(e); + } + return this.backendInstance; + } + backendNames() { + return Object.keys(this.registryFactory); + } + findBackend(e) { + if (!(e in this.registry)) + if (e in this.registryFactory) { + let { asyncInit: t10 } = this.initializeBackend(e); + if (t10) + return null; + } else + return null; + return this.registry[e]; + } + findBackendFactory(e) { + return e in this.registryFactory ? this.registryFactory[e].factory : null; + } + registerBackend(e, t10, o = 1) { + return e in this.registryFactory ? (Rs(`${e} backend was already registered. Reusing existing backend factory.`), false) : (this.registryFactory[e] = { factory: t10, priority: o }, true); + } + async setBackend(e) { + if (this.registryFactory[e] == null) + throw new Error(`Backend name '${e}' not found in registry`); + if (this.backendName = e, this.registry[e] == null) { + this.backendInstance = null; + let { success: t10, asyncInit: o } = this.initializeBackend(e); + if (!(o ? await t10 : t10)) + return false; + } + return this.backendInstance = this.registry[e], this.setupRegisteredKernels(), this.profiler = new Gm(this.backendInstance), true; + } + setupRegisteredKernels() { + zm(this.backendName).forEach((t10) => { + t10.setupFunc != null && t10.setupFunc(this.backendInstance); + }); + } + disposeRegisteredKernels(e) { + zm(e).forEach((o) => { + o.disposeFunc != null && o.disposeFunc(this.registry[e]); + }); + } + initializeBackend(e) { + let t10 = this.registryFactory[e]; + if (t10 == null) + throw new Error(`Cannot initialize backend ${e}, no registration found.`); + try { + let o = t10.factory(); + if (o && !(o instanceof Jr) && typeof o.then == "function") { + let n = ++this.pendingBackendInitId, s = o.then((a) => n < this.pendingBackendInitId ? false : (this.registry[e] = a, this.pendingBackendInit = null, true)).catch((a) => (n < this.pendingBackendInitId || (this.pendingBackendInit = null, Rs(`Initialization of backend ${e} failed`), Rs(a.stack || a.message)), false)); + return this.pendingBackendInit = s, { success: s, asyncInit: true }; + } else + return this.registry[e] = o, { success: true, asyncInit: false }; + } catch (o) { + return Rs(`Initialization of backend ${e} failed`), Rs(o.stack || o.message), { success: false, asyncInit: false }; + } + } + removeBackend(e) { + if (!(e in this.registryFactory)) + throw new Error(`${e} backend not found in registry`); + this.backendName === e && this.pendingBackendInit != null && this.pendingBackendInitId++, e in this.registry && (this.disposeRegisteredKernels(e), this.registry[e].dispose(), delete this.registry[e]), delete this.registryFactory[e], this.backendName === e && (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((e, t10) => this.registryFactory[t10].priority - this.registryFactory[e].priority); + } + initializeBackendsAndReturnBest() { + let e = this.getSortedBackends(); + for (let t10 = 0; t10 < e.length; t10++) { + let o = e[t10], { success: n, asyncInit: s } = this.initializeBackend(o); + if (s || n) + return { name: o, asyncInit: s }; + } + throw new Error("Could not initialize any backends, all backend initializations failed."); + } + moveData(e, t10) { + let o = this.state.tensorInfo.get(t10), n = o.backend, s = this.readSync(t10), a = n.refCount(t10); + n.disposeData(t10, true), o.backend = e, e.move(t10, s, o.shape, o.dtype, a), this.shouldCheckForMemLeaks() && this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1]++; + } + tidy(e, t10) { + let o = null; + if (t10 == null) { + if (typeof e != "function") + throw new Error("Please provide a function to tidy()"); + t10 = e; + } else { + if (typeof e != "string" && !(e instanceof String)) + throw new Error("When calling with two arguments, the first argument to tidy() must be a string"); + if (typeof t10 != "function") + throw new Error("When calling with two arguments, the 2nd argument to tidy() must be a function"); + o = e; + } + let n; + return this.scopedRun(() => this.startScope(o), () => this.endScope(n), () => (n = t10(), n instanceof Promise && console.error("Cannot return a Promise inside of tidy."), n)); + } + scopedRun(e, t10, o) { + e(); + try { + let n = o(); + return t10(), n; + } catch (n) { + throw t10(), n; + } + } + nextTensorId() { + return ai.nextTensorId++; + } + nextVariableId() { + return ai.nextVariableId++; + } + clone(e) { + let t10 = N.runKernel(uo, { x: e }), o = { x: e }, n = (a) => ({ x: () => { + let i = "float32", p = { x: a }, u = { dtype: i }; + return N.runKernel(to, p, u); + } }), s = []; + return this.addTapeNode(this.state.activeScope.name, o, [t10], n, s, {}), t10; + } + runKernel(e, t10, o) { + if (this.backendName == null && this.backend, !(el(e, this.backendName) != null)) + throw new Error(`Kernel '${e}' not registered for backend '${this.backendName}'`); + return this.runKernelFunc({ kernelName: e, inputs: t10, attrs: o }); + } + shouldCheckForMemLeaks() { + return this.ENV.getBool("IS_TEST"); + } + checkKernelForMemLeak(e, t10, o) { + let n = this.backend.numDataIds(), s = 0; + o.forEach((p) => { + s += p.dtype === "complex64" ? 3 : 1; + }); + let a = this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1], i = n - t10 - s - a; + if (i > 0) + throw new Error(`Backend '${this.backendName}' has an internal memory leak (${i} data ids) after running '${e}'`); + } + runKernelFunc(e) { + let t10, o = [], n = this.isTapeOn(), s = this.state.numBytes, a = this.state.numTensors; + this.shouldCheckForMemLeaks() && this.state.numDataMovesStack.push(0); + let i; + this.backendName == null && this.backend; + let p, u = Bb(e) ? e.kernelName : this.state.activeScope != null ? this.state.activeScope.name : ""; + if (Bb(e)) { + let { kernelName: d, inputs: h, attrs: g } = e; + this.backendName == null && this.backend; + let y = el(d, this.backendName); + $(y != null, () => `Cannot find registered kernel '${d}' for backend '${this.backendName}'`), i = () => { + let b = this.backend.numDataIds(); + p = y.kernelFunc({ inputs: h, attrs: g, backend: this.backend }); + let C = Array.isArray(p) ? p : [p]; + this.shouldCheckForMemLeaks() && this.checkKernelForMemLeak(d, b, C); + let w = C.map((k) => k.rank != null ? k : this.makeTensorFromTensorInfo(k)); + if (n) { + let k = this.getTensorsForGradient(d, h, w); + o = this.saveTensorsForBackwardMode(k); + } + return w; + }; + } else { + let { forwardFunc: d } = e, h = (g) => { + !n || (o = g.map((y) => this.keep(this.clone(y)))); + }; + i = () => { + let g = this.backend.numDataIds(); + p = this.tidy(() => d(this.backend, h)); + let y = Array.isArray(p) ? p : [p]; + return this.shouldCheckForMemLeaks() && this.checkKernelForMemLeak(u, g, y), y; + }; + } + let { inputs: c, attrs: l } = e, m = Bb(e) ? null : e.backwardsFunc, f; + return this.scopedRun(() => this.state.kernelDepth++, () => this.state.kernelDepth--, () => { + !this.ENV.getBool("DEBUG") && !this.state.profiling ? t10 = i() : (f = this.profiler.profileKernel(u, c, () => i()), this.ENV.getBool("DEBUG") && this.profiler.logKernelProfile(f), t10 = f.outputs); + }), n && this.addTapeNode(u, c, t10, m, o, l), this.state.profiling && this.state.activeProfile.kernels.push({ name: u, bytesAdded: this.state.numBytes - s, totalBytesSnapshot: this.state.numBytes, tensorsAdded: this.state.numTensors - a, totalTensorsSnapshot: this.state.numTensors, inputShapes: Object.keys(c).map((d) => c[d] != null ? c[d].shape : null), outputShapes: t10.map((d) => d.shape), kernelTimeMs: f.timeMs, extraInfo: f.extraInfo }), Array.isArray(p) ? t10 : t10[0]; + } + saveTensorsForBackwardMode(e) { + return e.map((o) => this.keep(this.clone(o))); + } + getTensorsForGradient(e, t10, o) { + let n = kb(e); + if (n != null) { + let s = n.inputsToSave || [], a = n.outputsToSave || [], i; + n.saveAllInputs ? ($(Array.isArray(t10), () => "saveAllInputs is true, expected inputs to be an array."), i = Object.keys(t10).map((u) => t10[u])) : i = s.map((u) => t10[u]); + let p = o.filter((u, c) => a[c]); + return i.concat(p); + } + return []; + } + makeTensor(e, t10, o, n) { + if (e == null) + throw new Error("Values passed to engine.makeTensor() are null"); + o = o || "float32", n = n || this.backend; + let s = e; + o === "string" && nn(e[0]) && (s = e.map((p) => si(p))); + let a = n.write(s, t10, o), i = new ut(t10, o, a, this.nextTensorId()); + if (this.trackTensor(i, n), o === "string") { + let p = this.state.tensorInfo.get(a), u = bb(s); + this.state.numBytes += u - p.bytes, p.bytes = u; + } + return i; + } + makeTensorFromDataId(e, t10, o, n) { + o = o || "float32"; + let s = { dataId: e, shape: t10, dtype: o }; + return this.makeTensorFromTensorInfo(s, n); + } + makeTensorFromTensorInfo(e, t10) { + let { dataId: o, shape: n, dtype: s } = e, a = new ut(n, s, o, this.nextTensorId()); + return this.trackTensor(a, t10), a; + } + makeVariable(e, t10 = true, o, n) { + o = o || this.nextVariableId().toString(), n != null && n !== e.dtype && (e = e.cast(n)); + let s = new ba(e, t10, o, this.nextTensorId()); + if (this.state.registeredVariables[s.name] != null) + throw new Error(`Variable with name ${s.name} was already registered`); + return this.state.registeredVariables[s.name] = s, this.incRef(s, this.backend), s; + } + trackTensor(e, t10) { + this.state.numTensors++, e.dtype === "string" && this.state.numStringTensors++; + let o = 0; + e.dtype !== "complex64" && e.dtype !== "string" && (o = e.size * Rm(e.dtype)), this.state.numBytes += o, this.state.tensorInfo.has(e.dataId) || (this.state.numDataBuffers++, this.state.tensorInfo.set(e.dataId, { backend: t10 || this.backend, dtype: e.dtype, shape: e.shape, bytes: o })), e instanceof ba || this.track(e); + } + incRef(e, t10) { + this.trackTensor(e, t10), this.backend.incRef(e.dataId); + } + removeDataId(e, t10) { + this.state.tensorInfo.has(e) && this.state.tensorInfo.get(e).backend === t10 && (this.state.tensorInfo.delete(e), this.state.numDataBuffers--); + } + disposeTensor(e) { + if (!this.state.tensorInfo.has(e.dataId)) + return; + let t10 = this.state.tensorInfo.get(e.dataId); + if (this.state.numTensors--, e.dtype === "string" && (this.state.numStringTensors--, this.state.numBytes -= t10.bytes), e.dtype !== "complex64" && e.dtype !== "string") { + let o = e.size * Rm(e.dtype); + this.state.numBytes -= o; + } + t10.backend.disposeData(e.dataId) && this.removeDataId(e.dataId, t10.backend); + } + disposeVariables() { + for (let e in this.state.registeredVariables) { + let t10 = this.state.registeredVariables[e]; + this.disposeVariable(t10); + } + } + 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 = true, 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 = true; + let t10 = this.state.numBytes, o = this.state.numTensors; + this.state.activeProfile.kernels = [], this.state.activeProfile.result = await e(), this.state.profiling = false, this.state.activeProfile.peakBytes = Math.max(...this.state.activeProfile.kernels.map((n) => n.totalBytesSnapshot)), this.state.activeProfile.newBytes = this.state.numBytes - t10, this.state.activeProfile.newTensors = this.state.numTensors - o; + for (let n of this.state.activeProfile.kernels) + n.kernelTimeMs = await n.kernelTimeMs, n.extraInfo = await n.extraInfo; + return this.state.activeProfile; + } + isTapeOn() { + return this.state.gradientDepth > 0 && this.state.kernelDepth === 0; + } + addTapeNode(e, t10, o, n, s, a) { + let i = { id: this.state.nextTapeNodeId++, kernelName: e, inputs: t10, outputs: o, saved: s }, p = kb(e); + p != null && (n = p.gradFunc), n != null && (i.gradient = (u) => (u = u.map((c, l) => { + if (c == null) { + let m = o[l], f = ap(m.size, m.dtype); + return this.makeTensor(f, m.shape, m.dtype); + } + return c; + }), n(u.length > 1 ? u : u[0], s, a))), this.state.activeTape.push(i); + } + keep(e) { + return e.kept = true, e; + } + startTape() { + this.state.gradientDepth === 0 && (this.state.activeTape = []), this.state.gradientDepth++; + } + endTape() { + this.state.gradientDepth--; + } + startScope(e) { + let t10 = { track: [], name: "unnamed scope", id: this.state.nextScopeId++ }; + e && (t10.name = e), this.state.scopeStack.push(t10), this.state.activeScope = t10; + } + endScope(e) { + let t10 = sl(e), o = new Set(t10.map((s) => s.id)); + for (let s = 0; s < this.state.activeScope.track.length; s++) { + let a = this.state.activeScope.track[s]; + !a.kept && !o.has(a.id) && a.dispose(); + } + let n = this.state.scopeStack.pop(); + this.state.activeScope = this.state.scopeStack.length === 0 ? null : this.state.scopeStack[this.state.scopeStack.length - 1], t10.forEach((s) => { + !s.kept && s.scopeId === n.id && this.track(s); + }); + } + gradients(e, t10, o, n = false) { + if ($(t10.length > 0, () => "gradients() received an empty list of xs."), o != null && o.dtype !== "float32") + throw new Error(`dy must have 'float32' dtype, but has '${o.dtype}'`); + let s = this.scopedRun(() => this.startTape(), () => this.endTape(), () => this.tidy("forward", e)); + $(s instanceof ut, () => "The result y returned by f() must be a tensor."); + let a = A0(this.state.activeTape, t10, s); + if (!n && a.length === 0 && t10.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[s.id] = o == null ? Vz(s.shape) : o, F0(i, a, (u) => this.tidy(u), zz); + let p = t10.map((u) => i[u.id]); + return this.state.gradientDepth === 0 && (this.state.activeTape.forEach((u) => { + for (let c of u.saved) + c.dispose(); + }), this.state.activeTape = null), { value: s, grads: p }; + }); + } + customGrad(e) { + return $(fs(e), () => "The f passed in customGrad(f) must be a function."), (...t10) => { + $(t10.every((i) => i instanceof ut), () => "The args passed in customGrad(f)(x1, x2,...) must all be tensors"); + let o, n = {}; + t10.forEach((i, p) => { + n[p] = i; + }); + let s = (i, p) => (o = e(...t10, p), $(o.value instanceof ut, () => "The function f passed in customGrad(f) must return an object where `obj.value` is a tensor"), $(fs(o.gradFunc), () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function."), o.value), a = (i, p) => { + let u = o.gradFunc(i, p), c = Array.isArray(u) ? u : [u]; + $(c.length === t10.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(...)."), $(c.every((m) => m instanceof ut), () => "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 l = {}; + return c.forEach((m, f) => { + l[f] = () => m; + }), l; + }; + return this.runKernelFunc({ forwardFunc: s, backwardsFunc: a, inputs: n }); + }; + } + readSync(e) { + return this.state.tensorInfo.get(e).backend.readSync(e); + } + read(e) { + return this.state.tensorInfo.get(e).backend.read(e); + } + readToGPU(e, t10) { + return this.state.tensorInfo.get(e).backend.readToGPU(e, t10); + } + async time(e) { + let t10 = ou(), o = await this.backend.time(e); + return o.wallMs = ou() - t10, o; + } + 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 qm(); + 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; + } +}; +ai.nextTensorId = 0; +ai.nextVariableId = 0; +function Vz(r) { + let e = jc(Ve(r), "float32"); + return N.makeTensor(e, r, "float32"); +} +function Vb() { + let r = wb(); + if (r._tfengine == null) { + let e = new Qc(r); + r._tfengine = new ai(e); + } + return h0(r._tfengine.ENV), M0(() => r._tfengine), r._tfengine; +} +var N = Vb(); +function zz(r, e) { + let t10 = { a: r, b: e }; + return N.runKernel(_r, t10); +} +var ii = {}; +Be(ii, { isBrowser: () => Wb, isMobile: () => Gz, mockIsMobile: () => Uz }); +function Wz() { + return typeof navigator != "undefined" && navigator != null; +} +var zb; +function Uz(r) { + zb = r; +} +function Gz(r) { + if (zb !== void 0) + return zb; + if (r || Wz()) { + if (r || (r = navigator), r.product === "ReactNative") + return true; + let e = r.userAgent || r.vendor || (typeof window != "undefined" ? window.opera : ""); + if (!e) { + let t10 = r; + return t10.userAgentData && t10.userAgentData.mobile; + } + return /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(e) || /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(e.substr(0, 4)); + } + return false; +} +function Wb() { + return typeof window != "undefined" && window.document != null || typeof WorkerGlobalScope != "undefined"; +} +var Vr = P(); +Vr.registerFlag("DEBUG", () => false, (r) => { + r && 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."); +}); +Vr.registerFlag("IS_BROWSER", () => Wb()); +Vr.registerFlag("IS_NODE", () => typeof process != "undefined" && typeof process.versions != "undefined" && typeof process.versions.node != "undefined"); +Vr.registerFlag("IS_CHROME", () => typeof navigator != "undefined" && navigator != null && navigator.userAgent != null && /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor)); +Vr.registerFlag("PROD", () => false); +Vr.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY", () => Vr.getBool("DEBUG")); +Vr.registerFlag("DEPRECATION_WARNINGS_ENABLED", () => true); +Vr.registerFlag("IS_TEST", () => false); +Vr.registerFlag("CHECK_COMPUTATION_FOR_ERRORS", () => true); +Vr.registerFlag("WRAP_TO_IMAGEBITMAP", () => false); +Vr.registerFlag("ENGINE_COMPILE_ONLY", () => false); +Vr.registerFlag("CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU", () => false); +Vr.registerFlag("USE_SETTIMEOUTCUSTOM", () => false); +function or(r, e) { + let t10 = r; + if (Ut(r)) + return e === "string" ? [] : [r.length]; + if (typeof r == "object" && "texture" in r) { + let n = r.channels || "RGBA"; + return [r.height, r.width * n.length]; + } + if (!Array.isArray(r)) + return []; + let o = []; + for (; Array.isArray(t10) || Ut(t10) && e !== "string"; ) + o.push(t10.length), t10 = t10[0]; + return Array.isArray(r) && P().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY") && U0(r, o, []), o; +} +function U0(r, e, t10) { + if (t10 = t10 || [], !Array.isArray(r) && !Ut(r)) { + $(e.length === 0, () => `Element arr[${t10.join("][")}] is a primitive, but should be an array/TypedArray of ${e[0]} elements`); + return; + } + $(e.length > 0, () => `Element arr[${t10.join("][")}] should be a primitive, but is an array of ${r.length} elements`), $(r.length === e[0], () => `Element arr[${t10.join("][")}] should have ${e[0]} elements, but has ${r.length} elements`); + let o = e.slice(1); + for (let n = 0; n < r.length; ++n) + U0(r[n], o, t10.concat(n)); +} +function W0(r, e, t10, o) { + if (r !== "string_or_numeric") { + if (r == null) + throw new Error("Expected dtype cannot be null."); + if (r !== "numeric" && r !== e || r === "numeric" && e === "string") + throw new Error(`Argument '${t10}' passed to '${o}' must be ${r} tensor, but got ${e} tensor`); + } +} +function v(r, e, t10, o = "numeric") { + if (r instanceof ut) + return W0(o, r.dtype, e, t10), r; + let n = np(r); + if (n !== "string" && ["bool", "int32", "float32"].indexOf(o) >= 0 && (n = o), W0(o, n, e, t10), r == null || !Ut(r) && !Array.isArray(r) && typeof r != "number" && typeof r != "boolean" && typeof r != "string") { + let p = r == null ? "null" : r.constructor.name; + throw new Error(`Argument '${e}' passed to '${t10}' must be a Tensor or TensorLike, but got '${p}'`); + } + let s = or(r, n); + !Ut(r) && !Array.isArray(r) && (r = [r]); + let i = n !== "string" ? Pp(r, n) : on(r, [], true); + return N.makeTensor(i, s, n); +} +function Ia(r, e, t10, o = "numeric") { + if (!Array.isArray(r)) + throw new Error(`Argument ${e} passed to ${t10} must be a \`Tensor[]\` or \`TensorLike[]\``); + return r.map((s, a) => v(s, `${e}[${a}]`, t10, o)); +} +var Ub = "__op"; +function T(r) { + let e = Object.keys(r); + if (e.length !== 1) + throw new Error(`Please provide an object with a single key (operation name) mapping to a function. Got an object with ${e.length} keys.`); + let t10 = e[0], o = r[t10]; + t10.endsWith("_") && (t10 = t10.substring(0, t10.length - 1)), t10 = t10 + Ub; + let n = (...s) => { + N.startScope(t10); + try { + let a = o(...s); + return Yc(a) && console.error("Cannot return a Promise inside of tidy."), N.endScope(a), a; + } catch (a) { + throw N.endScope(null), a; + } + }; + return Object.defineProperty(n, "name", { value: t10, configurable: true }), n; +} +function Hz(r, e) { + let t10 = v(r, "real", "complex"), o = v(e, "imag", "complex"); + ht(t10.shape, o.shape, `real and imag shapes, ${t10.shape} and ${o.shape}, must match in call to tf.complex().`); + let n = { real: t10, imag: o }; + return N.runKernel(aa, n); +} +var Er = T({ complex_: Hz }); +function xr(r, e, t10, o) { + if (o == null && (o = np(r)), o === "complex64") + throw new Error("Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag)."); + if (typeof r == "object" && "texture" in r) { + if (o !== "float32" && o !== "int32") + throw new Error(`Creating tensor from texture only supports 'float32'|'int32' dtype, while the dtype is ${o}.`); + return r.channels = r.channels || "RGBA", N.backend.createTensorFromTexture(r, e || t10, o); + } + if (!Ut(r) && !Array.isArray(r) && typeof r != "number" && typeof r != "boolean" && typeof r != "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 (e != null) { + Xc(e); + let n = Ve(e), s = Ve(t10); + $(n === s, () => `Based on the provided shape, [${e}], the tensor should have ${n} values but has ${s}`); + for (let a = 0; a < t10.length; ++a) { + let i = t10[a], p = a === t10.length - 1 ? i !== Ve(e.slice(a)) : true; + $(t10[a] === e[a] || !p, () => `Error creating a new Tensor. Inferred shape (${t10}) does not match the provided shape (${e}). `); + } + } + return !Ut(r) && !Array.isArray(r) && (r = [r]), e = e || t10, r = o !== "string" ? Pp(r, o) : on(r, [], true), N.makeTensor(r, e, o); +} +function nr(r, e, t10) { + let o = or(r, t10); + return xr(r, e, o, t10); +} +var al = { float32: 4, float16: 2, int32: 4, uint16: 2, uint8: 1, bool: 1, complex64: 8 }; +var Km = 4; +async function H0(r, e) { + let t10 = [], o = [], n = Array.isArray(r) ? r.map((a) => a.name) : Object.keys(r); + for (let a = 0; a < n.length; ++a) { + let i = n[a], p = Array.isArray(r) ? r[a].tensor : r[i]; + if (p.dtype !== "float32" && p.dtype !== "int32" && p.dtype !== "bool" && p.dtype !== "string" && p.dtype !== "complex64") + throw new Error(`Unsupported dtype in weight '${i}': ${p.dtype}`); + let u = { name: i, shape: p.shape, dtype: p.dtype }; + if (p.dtype === "string") { + let c = new Promise(async (l) => { + let m = await p.bytes(), f = m.reduce((g, y) => g + y.length, 0) + Km * m.length, d = new Uint8Array(f), h = 0; + for (let g = 0; g < m.length; g++) { + let y = m[g], b = new Uint8Array(new Uint32Array([y.length]).buffer); + d.set(b, h), h += Km, d.set(y, h), h += y.length; + } + l(d); + }); + o.push(c); + } else + o.push(p.data()); + e != null && (u.group = e), t10.push(u); + } + let s = await Promise.all(o); + return { data: qz(s), specs: t10 }; +} +function jm(r, e) { + let t10 = {}, o, n = 0; + for (let s of e) { + let a = s.name, i = s.dtype, p = s.shape, u = Ve(p), c; + if ("quantization" in s) { + let l = s.quantization; + if (l.dtype === "uint8" || l.dtype === "uint16") { + if (!("min" in l && "scale" in l)) + throw new Error(`Weight ${s.name} with quantization ${l.dtype} doesn't have corresponding metadata min and scale.`); + } else if (l.dtype === "float16") { + if (i !== "float32") + throw new Error(`Weight ${s.name} is quantized with ${l.dtype} which only supports weights of type float32 not ${i}.`); + } else + throw new Error(`Weight ${s.name} has unknown quantization dtype ${l.dtype}. Supported quantization dtypes are: 'uint8', 'uint16', and 'float16'.`); + let m = al[l.dtype], f = r.slice(n, n + u * m), d = l.dtype === "uint8" ? new Uint8Array(f) : new Uint16Array(f); + if (i === "float32") + if (l.dtype === "uint8" || l.dtype === "uint16") { + c = new Float32Array(d.length); + for (let h = 0; h < d.length; h++) { + let g = d[h]; + c[h] = g * l.scale + l.min; + } + } else if (l.dtype === "float16") + o === void 0 && (o = Yz()), c = o(d); + else + throw new Error(`Unsupported quantization type ${l.dtype} for weight type float32.`); + else if (i === "int32") { + if (l.dtype !== "uint8" && l.dtype !== "uint16") + throw new Error(`Unsupported quantization type ${l.dtype} for weight type int32.`); + c = new Int32Array(d.length); + for (let h = 0; h < d.length; h++) { + let g = d[h]; + c[h] = Math.round(g * l.scale + l.min); + } + } else + throw new Error(`Unsupported dtype in weight '${a}': ${i}`); + n += u * m; + } else if (i === "string") { + let l = Ve(s.shape); + c = []; + for (let m = 0; m < l; m++) { + let f = new Uint32Array(r.slice(n, n + Km))[0]; + n += Km; + let d = new Uint8Array(r.slice(n, n + f)); + c.push(d), n += f; + } + } else { + let l = al[i], m = r.slice(n, n + u * l); + if (i === "float32") + c = new Float32Array(m); + else if (i === "int32") + c = new Int32Array(m); + else if (i === "bool") + c = new Uint8Array(m); + else if (i === "complex64") { + c = new Float32Array(m); + let f = new Float32Array(c.length / 2), d = new Float32Array(c.length / 2); + for (let y = 0; y < f.length; y++) + f[y] = c[y * 2], d[y] = c[y * 2 + 1]; + let h = nr(f, p, "float32"), g = nr(d, p, "float32"); + t10[a] = Er(h, g), h.dispose(), g.dispose(); + } else + throw new Error(`Unsupported dtype in weight '${a}': ${i}`); + n += u * l; + } + i !== "complex64" && (t10[a] = nr(c, p, i)); + } + return t10; +} +function qz(r) { + if (r === null) + throw new Error(`Invalid input value: ${JSON.stringify(r)}`); + let e = 0, t10 = []; + r.forEach((s) => { + if (e += s.byteLength, t10.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 o = new Uint8Array(e), n = 0; + return t10.forEach((s) => { + o.set(new Uint8Array(s.buffer), n), n += s.byteLength; + }), o.buffer; +} +var Gb = typeof Buffer != "undefined" && (typeof Blob == "undefined" || typeof atob == "undefined" || typeof btoa == "undefined"); +function G0(r) { + return Gb ? Buffer.byteLength(r) : new Blob([r]).size; +} +function q0(r) { + if (Gb) + return Buffer.from(r).toString("base64"); + let e = new Uint8Array(r), t10 = ""; + for (let o = 0, n = e.length; o < n; o++) + t10 += String.fromCharCode(e[o]); + return btoa(t10); +} +function K0(r) { + if (Gb) { + let o = Buffer.from(r, "base64"); + return o.buffer.slice(o.byteOffset, o.byteOffset + o.byteLength); + } + let e = atob(r), t10 = new Uint8Array(e.length); + for (let o = 0; o < e.length; ++o) + t10.set([e.charCodeAt(o)], o); + return t10.buffer; +} +function Lp(r) { + if (r.length === 1) + return r[0]; + let e = 0; + r.forEach((n) => { + e += n.byteLength; + }); + let t10 = new Uint8Array(e), o = 0; + return r.forEach((n) => { + t10.set(new Uint8Array(n), o), o += n.byteLength; + }), t10.buffer; +} +function Hb(r) { + let e = "/"; + for (r = r.trim(); r.endsWith(e); ) + r = r.slice(0, r.length - 1); + let t10 = r.split(e); + return t10[t10.length - 1]; +} +function Xm(r, e) { + let t10 = { modelTopology: r.modelTopology, format: r.format, generatedBy: r.generatedBy, convertedBy: r.convertedBy, weightsManifest: e }; + return r.signature != null && (t10.signature = r.signature), r.userDefinedMetadata != null && (t10.userDefinedMetadata = r.userDefinedMetadata), r.modelInitializer != null && (t10.modelInitializer = r.modelInitializer), r.initializerSignature != null && (t10.initializerSignature = r.initializerSignature), r.trainingConfig != null && (t10.trainingConfig = r.trainingConfig), t10; +} +function qb(r, e, t10) { + let o = { modelTopology: r.modelTopology, format: r.format, generatedBy: r.generatedBy, convertedBy: r.convertedBy }; + if (r.trainingConfig != null && (o.trainingConfig = r.trainingConfig), r.weightsManifest != null) { + if (!e) + throw new Error("modelJSON has weightsManifest but weightSpecs is null"); + if (!t10) + throw new Error("modelJSON has weightsManifest but weightData is null"); + o.weightSpecs = e, o.weightData = t10; + } + return r.signature != null && (o.signature = r.signature), r.userDefinedMetadata != null && (o.userDefinedMetadata = r.userDefinedMetadata), r.modelInitializer != null && (o.modelInitializer = r.modelInitializer), r.initializerSignature != null && (o.initializerSignature = r.initializerSignature), o; +} +async function Bp(r, e) { + let t10, o; + return r.weightsManifest != null && ([t10, o] = await e(r.weightsManifest)), qb(r, t10, o); +} +function As(r) { + if (r.modelTopology instanceof ArrayBuffer) + throw new Error("Expected JSON model topology, received ArrayBuffer."); + return { dateSaved: new Date(), modelTopologyType: "JSON", modelTopologyBytes: r.modelTopology == null ? 0 : G0(JSON.stringify(r.modelTopology)), weightSpecsBytes: r.weightSpecs == null ? 0 : G0(JSON.stringify(r.weightSpecs)), weightDataBytes: r.weightData == null ? 0 : r.weightData.byteLength }; +} +function Ym(r) { + let e = []; + for (let t10 of r) + e.push(...t10.weights); + return e; +} +function Kz() { + let r = (t10) => { + let o = t10 << 13, n = 0; + for (; (o & 8388608) === 0; ) + n -= 8388608, o <<= 1; + return o &= -8388609, n += 947912704, o | n; + }, e = new Uint32Array(2048); + e[0] = 0; + for (let t10 = 1; t10 < 1024; t10++) + e[t10] = r(t10); + for (let t10 = 1024; t10 < 2048; t10++) + e[t10] = 939524096 + (t10 - 1024 << 13); + return e; +} +function jz() { + let r = new Uint32Array(64); + r[0] = 0, r[31] = 1199570944, r[32] = 2147483648, r[63] = 3347054592; + for (let e = 1; e < 31; e++) + r[e] = e << 23; + for (let e = 33; e < 63; e++) + r[e] = 2147483648 + (e - 32 << 23); + return r; +} +function Xz() { + let r = new Uint32Array(64); + for (let e = 0; e < 64; e++) + r[e] = 1024; + return r[0] = r[32] = 0, r; +} +function Yz() { + let r = Kz(), e = jz(), t10 = Xz(); + return (o) => { + let n = new ArrayBuffer(4 * o.length), s = new Uint32Array(n); + for (let a = 0; a < o.length; a++) { + let i = o[a], p = r[t10[i >> 10] + (i & 1023)] + e[i >> 10]; + s[a] = p; + } + return new Float32Array(n); + }; +} +var mt = class { + constructor() { + this.saveRouters = [], this.loadRouters = []; + } + static getInstance() { + return mt.instance == null && (mt.instance = new mt()), mt.instance; + } + static registerSaveRouter(e) { + mt.getInstance().saveRouters.push(e); + } + static registerLoadRouter(e) { + mt.getInstance().loadRouters.push(e); + } + static getSaveHandlers(e) { + return mt.getHandlers(e, "save"); + } + static getLoadHandlers(e, t10) { + return mt.getHandlers(e, "load", t10); + } + static getHandlers(e, t10, o) { + let n = []; + return (t10 === "load" ? mt.getInstance().loadRouters : mt.getInstance().saveRouters).forEach((a) => { + let i = a(e, o); + i !== null && n.push(i); + }), n; + } +}; +var j0 = (r) => mt.registerSaveRouter(r); +var X0 = (r) => mt.registerLoadRouter(r); +var Y0 = (r) => mt.getSaveHandlers(r); +var Q0 = (r, e) => mt.getLoadHandlers(r, e); +var Kb = "tensorflowjs"; +var jb = 1; +var nu = "models_store"; +var ui = "model_info_store"; +function Z0() { + if (!P().getBool("IS_BROWSER")) + throw new Error("Failed to obtain IndexedDB factory because the current environmentis not a web browser."); + let r = typeof window == "undefined" ? self : window, e = r.indexedDB || r.mozIndexedDB || r.webkitIndexedDB || r.msIndexedDB || r.shimIndexedDB; + if (e == null) + throw new Error("The current browser does not appear to support IndexedDB."); + return e; +} +function Xb(r) { + let e = r.result; + e.createObjectStore(nu, { keyPath: "modelPath" }), e.createObjectStore(ui, { keyPath: "modelPath" }); +} +var Fs = class { + constructor(e) { + if (this.indexedDB = Z0(), 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, t10) { + return new Promise((o, n) => { + let s = this.indexedDB.open(Kb, jb); + s.onupgradeneeded = () => Xb(s), s.onsuccess = () => { + let a = s.result; + if (t10 == null) { + let i = a.transaction(nu, "readonly"), u = i.objectStore(nu).get(this.modelPath); + u.onsuccess = () => { + if (u.result == null) + return a.close(), n(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`)); + o(u.result.modelArtifacts); + }, u.onerror = (c) => (a.close(), n(u.error)), i.oncomplete = () => a.close(); + } else { + let i = As(t10), p = a.transaction(ui, "readwrite"), u = p.objectStore(ui), c = u.put({ modelPath: this.modelPath, modelArtifactsInfo: i }), l; + c.onsuccess = () => { + l = a.transaction(nu, "readwrite"); + let f = l.objectStore(nu).put({ modelPath: this.modelPath, modelArtifacts: t10, modelArtifactsInfo: i }); + f.onsuccess = () => o({ modelArtifactsInfo: i }), f.onerror = (d) => { + u = p.objectStore(ui); + let h = u.delete(this.modelPath); + h.onsuccess = () => (a.close(), n(f.error)), h.onerror = (g) => (a.close(), n(f.error)); + }; + }, c.onerror = (m) => (a.close(), n(c.error)), p.oncomplete = () => { + l == null ? a.close() : l.oncomplete = () => a.close(); + }; + } + }, s.onerror = (a) => n(s.error); + }); + } +}; +Fs.URL_SCHEME = "indexeddb://"; +var J0 = (r) => P().getBool("IS_BROWSER") && !Array.isArray(r) && r.startsWith(Fs.URL_SCHEME) ? Qz(r.slice(Fs.URL_SCHEME.length)) : null; +mt.registerSaveRouter(J0); +mt.registerLoadRouter(J0); +function Qz(r) { + return new Fs(r); +} +function Zz(r) { + return r.startsWith(Fs.URL_SCHEME) ? r.slice(Fs.URL_SCHEME.length) : r; +} +var Qm = class { + constructor() { + this.indexedDB = Z0(); + } + async listModels() { + return new Promise((e, t10) => { + let o = this.indexedDB.open(Kb, jb); + o.onupgradeneeded = () => Xb(o), o.onsuccess = () => { + let n = o.result, s = n.transaction(ui, "readonly"), i = s.objectStore(ui).getAll(); + i.onsuccess = () => { + let p = {}; + for (let u of i.result) + p[u.modelPath] = u.modelArtifactsInfo; + e(p); + }, i.onerror = (p) => (n.close(), t10(i.error)), s.oncomplete = () => n.close(); + }, o.onerror = (n) => t10(o.error); + }); + } + async removeModel(e) { + return e = Zz(e), new Promise((t10, o) => { + let n = this.indexedDB.open(Kb, jb); + n.onupgradeneeded = () => Xb(n), n.onsuccess = () => { + let s = n.result, a = s.transaction(ui, "readwrite"), i = a.objectStore(ui), p = i.get(e), u; + p.onsuccess = () => { + if (p.result == null) + return s.close(), o(new Error(`Cannot find model with path '${e}' in IndexedDB.`)); + { + let c = i.delete(e), l = () => { + u = s.transaction(nu, "readwrite"); + let f = u.objectStore(nu).delete(e); + f.onsuccess = () => t10(p.result.modelArtifactsInfo), f.onerror = (d) => o(p.error); + }; + c.onsuccess = l, c.onerror = (m) => (l(), s.close(), o(p.error)); + } + }, p.onerror = (c) => (s.close(), o(p.error)), a.oncomplete = () => { + u == null ? s.close() : u.oncomplete = () => s.close(); + }; + }, n.onerror = (s) => o(n.error); + }); + } +}; +var wa = "/"; +var Vp = "tensorflowjs_models"; +var ev = "info"; +var Jz = "model_topology"; +var eW = "weight_specs"; +var tW = "weight_data"; +var rW = "model_metadata"; +function tv(r) { + return { info: [Vp, r, ev].join(wa), topology: [Vp, r, Jz].join(wa), weightSpecs: [Vp, r, eW].join(wa), weightData: [Vp, r, tW].join(wa), modelMetadata: [Vp, r, rW].join(wa) }; +} +function rv(r) { + for (let e of Object.values(r)) + window.localStorage.removeItem(e); +} +function oW(r) { + let e = r.split(wa); + if (e.length < 3) + throw new Error(`Invalid key format: ${r}`); + return e.slice(1, e.length - 1).join(wa); +} +function nW(r) { + return r.startsWith(Ds.URL_SCHEME) ? r.slice(Ds.URL_SCHEME.length) : r; +} +var Ds = class { + constructor(e) { + if (!P().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 = tv(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 t10 = JSON.stringify(e.modelTopology), o = JSON.stringify(e.weightSpecs), n = As(e); + try { + this.LS.setItem(this.keys.info, JSON.stringify(n)), this.LS.setItem(this.keys.topology, t10), this.LS.setItem(this.keys.weightSpecs, o), this.LS.setItem(this.keys.weightData, q0(e.weightData)); + let s = { format: e.format, generatedBy: e.generatedBy, convertedBy: e.convertedBy, signature: e.signature != null ? e.signature : void 0, userDefinedMetadata: e.userDefinedMetadata != null ? e.userDefinedMetadata : void 0, modelInitializer: e.modelInitializer != null ? e.modelInitializer : void 0, initializerSignature: e.initializerSignature != null ? e.initializerSignature : void 0, trainingConfig: e.trainingConfig != null ? e.trainingConfig : void 0 }; + return this.LS.setItem(this.keys.modelMetadata, JSON.stringify(s)), { modelArtifactsInfo: n }; + } catch (s) { + throw rv(this.keys), new Error(`Failed to save model '${this.modelPath}' to local storage: size quota being exceeded is a possible cause of this failure: modelTopologyBytes=${n.modelTopologyBytes}, weightSpecsBytes=${n.weightSpecsBytes}, weightDataBytes=${n.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 t10 = {}, o = JSON.parse(this.LS.getItem(this.keys.topology)); + if (o == null) + throw new Error(`In local storage, the topology of model '${this.modelPath}' is missing.`); + t10.modelTopology = o; + let n = JSON.parse(this.LS.getItem(this.keys.weightSpecs)); + if (n == null) + throw new Error(`In local storage, the weight specs of model '${this.modelPath}' are missing.`); + t10.weightSpecs = n; + let s = this.LS.getItem(this.keys.modelMetadata); + if (s != null) { + let i = JSON.parse(s); + t10.format = i.format, t10.generatedBy = i.generatedBy, t10.convertedBy = i.convertedBy, i.signature != null && (t10.signature = i.signature), i.userDefinedMetadata != null && (t10.userDefinedMetadata = i.userDefinedMetadata), i.modelInitializer != null && (t10.modelInitializer = i.modelInitializer), i.initializerSignature != null && (t10.initializerSignature = i.initializerSignature), i.trainingConfig != null && (t10.trainingConfig = i.trainingConfig); + } + let a = this.LS.getItem(this.keys.weightData); + if (a == null) + throw new Error(`In local storage, the binary weight values of model '${this.modelPath}' are missing.`); + return t10.weightData = K0(a), t10; + } +}; +Ds.URL_SCHEME = "localstorage://"; +var ov = (r) => P().getBool("IS_BROWSER") && !Array.isArray(r) && r.startsWith(Ds.URL_SCHEME) ? sW(r.slice(Ds.URL_SCHEME.length)) : null; +mt.registerSaveRouter(ov); +mt.registerLoadRouter(ov); +function sW(r) { + return new Ds(r); +} +var Zm = class { + constructor() { + $(P().getBool("IS_BROWSER"), () => "Current environment is not a web browser"), $(typeof window == "undefined" || typeof window.localStorage != "undefined", () => "Current browser does not appear to support localStorage"), this.LS = window.localStorage; + } + async listModels() { + let e = {}, t10 = Vp + wa, o = wa + ev; + for (let n = 0; n < this.LS.length; ++n) { + let s = this.LS.key(n); + if (s.startsWith(t10) && s.endsWith(o)) { + let a = oW(s); + e[a] = JSON.parse(this.LS.getItem(s)); + } + } + return e; + } + async removeModel(e) { + e = nW(e); + let t10 = tv(e); + if (this.LS.getItem(t10.info) == null) + throw new Error(`Cannot find model at path '${e}'`); + let o = JSON.parse(this.LS.getItem(t10.info)); + return rv(t10), o; + } +}; +var zp = "://"; +var Yt = class { + constructor() { + this.managers = {}; + } + static getInstance() { + return Yt.instance == null && (Yt.instance = new Yt()), Yt.instance; + } + static registerManager(e, t10) { + $(e != null, () => "scheme must not be undefined or null."), e.endsWith(zp) && (e = e.slice(0, e.indexOf(zp))), $(e.length > 0, () => "scheme must not be an empty string."); + let o = Yt.getInstance(); + $(o.managers[e] == null, () => `A model store manager is already registered for scheme '${e}'.`), o.managers[e] = t10; + } + static getManager(e) { + let t10 = Yt.getInstance().managers[e]; + if (t10 == null) + throw new Error(`Cannot find model manager for scheme '${e}'`); + return t10; + } + static getSchemes() { + return Object.keys(Yt.getInstance().managers); + } +}; +function Jm(r) { + if (r.indexOf(zp) === -1) + throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${Yt.getSchemes().join(",")}`); + return { scheme: r.split(zp)[0], path: r.split(zp)[1] }; +} +async function nv(r, e, t10 = false) { + $(r !== e, () => `Old path and new path are the same: '${r}'`); + let o = mt.getLoadHandlers(r); + $(o.length > 0, () => `Copying failed because no load handler is found for source URL ${r}.`), $(o.length < 2, () => `Copying failed because more than one (${o.length}) load handlers for source URL ${r}.`); + let n = o[0], s = mt.getSaveHandlers(e); + $(s.length > 0, () => `Copying failed because no save handler is found for destination URL ${e}.`), $(s.length < 2, () => `Copying failed because more than one (${o.length}) save handlers for destination URL ${e}.`); + let a = s[0], i = Jm(r).scheme, p = Jm(r).path, u = i === Jm(r).scheme, c = await n.load(); + t10 && u && await Yt.getManager(i).removeModel(p); + let l = await a.save(c); + return t10 && !u && await Yt.getManager(i).removeModel(p), l.modelArtifactsInfo; +} +async function sv() { + let r = Yt.getSchemes(), e = {}; + for (let t10 of r) { + let o = await Yt.getManager(t10).listModels(); + for (let n in o) { + let s = t10 + zp + n; + e[s] = o[n]; + } + } + return e; +} +async function av(r) { + let e = Jm(r); + return Yt.getManager(e.scheme).removeModel(e.path); +} +async function iv(r, e) { + return nv(r, e, false); +} +async function uv(r, e) { + return nv(r, e, true); +} +var Yb = class { + constructor() { + this.messageName = "setTimeoutCustom", this.functionRefs = [], this.handledMessageCount = 0, this.hasEventListener = false; + } + fetch(e, t10) { + return fetch(e, t10); + } + now() { + return performance.now(); + } + encode(e, t10) { + if (t10 !== "utf-8" && t10 !== "utf8") + throw new Error(`Browser's encoder only supports utf-8, but got ${t10}`); + return this.textEncoder == null && (this.textEncoder = new TextEncoder()), this.textEncoder.encode(e); + } + decode(e, t10) { + return new TextDecoder(t10).decode(e); + } + setTimeoutCustom(e, t10) { + if (typeof window == "undefined" || !P().getBool("USE_SETTIMEOUTCUSTOM")) { + setTimeout(e, t10); + return; + } + this.functionRefs.push(e), setTimeout(() => { + window.postMessage({ name: this.messageName, index: this.functionRefs.length - 1 }, "*"); + }, t10), this.hasEventListener || (this.hasEventListener = true, window.addEventListener("message", (o) => { + if (o.source === window && o.data.name === this.messageName) { + o.stopPropagation(); + let n = this.functionRefs[o.data.index]; + n(), this.handledMessageCount++, this.handledMessageCount === this.functionRefs.length && (this.functionRefs = [], this.handledMessageCount = 0); + } + }, true)); + } +}; +if (P().get("IS_BROWSER")) { + P().setPlatform("browser", new Yb()); + try { + Yt.registerManager(Ds.URL_SCHEME, new Zm()); + } catch (r) { + } + try { + Yt.registerManager(Fs.URL_SCHEME, new Qm()); + } catch (r) { + } +} +var aW = { importFetch: () => pv() }; +var Qb; +var Zb = class { + constructor() { + this.util = cv(), this.textEncoder = new this.util.TextEncoder(); + } + fetch(e, t10) { + return P().global.fetch != null ? P().global.fetch(e, t10) : (Qb == null && (Qb = aW.importFetch()), Qb(e, t10)); + } + now() { + let e = process.hrtime(); + return e[0] * 1e3 + e[1] / 1e6; + } + encode(e, t10) { + if (t10 !== "utf-8" && t10 !== "utf8") + throw new Error(`Node built-in encoder only supports utf-8, but got ${t10}`); + return this.textEncoder.encode(e); + } + decode(e, t10) { + return e.length === 0 ? "" : new this.util.TextDecoder(t10).decode(e); + } +}; +P().get("IS_NODE") && !P().get("IS_BROWSER") && P().setPlatform("node", new Zb()); +function ne(r, e = "float32", t10) { + return e = e || "float32", Xc(r), new je(r, e, t10); +} +function iW(r, e) { + let t10 = v(r, "x", "cast"); + if (!yb(e)) + throw new Error(`Failed to cast to unknown dtype ${e}`); + if (e === "string" && t10.dtype !== "string" || e !== "string" && t10.dtype === "string") + throw new Error("Only strings can be casted to strings"); + let o = { x: t10 }, n = { dtype: e }; + return N.runKernel(to, o, n); +} +var qe = T({ cast_: iW }); +function uW(r) { + let t10 = { x: v(r, "x", "clone", "string_or_numeric") }; + return N.runKernel(uo, t10); +} +var zr = T({ clone_: uW }); +function ef(r, e = false) { + console.log(r.toString(e)); +} +Vb(); +var pW = { buffer: ne, cast: qe, clone: zr, print: ef }; +L0(pW); +var va = {}; +Be(va, { browserFiles: () => mv, browserHTTPRequest: () => hv, concatenateArrayBuffers: () => Lp, copyModel: () => iv, decodeWeights: () => jm, encodeWeights: () => H0, fromMemory: () => gv, fromMemorySync: () => nC, getLoadHandlers: () => Q0, getModelArtifactsForJSON: () => Bp, getModelArtifactsForJSONSync: () => qb, getModelArtifactsInfoForJSON: () => As, getSaveHandlers: () => Y0, getWeightSpecs: () => Ym, http: () => rf, isHTTPScheme: () => tf, listModels: () => sv, loadWeights: () => fv, moveModel: () => uv, registerLoadRouter: () => X0, registerSaveRouter: () => j0, removeModel: () => av, weightsLoaderFactory: () => rC, withSaveHandler: () => xv, withSaveHandlerSync: () => yv }); +var cW = "model"; +var lW = ".json"; +var mW = ".weights.bin"; +function lv(r) { + return new Promise((e) => setTimeout(e)).then(r); +} +var Sa = class { + constructor(e) { + if (!P().getBool("IS_BROWSER")) + throw new Error("browserDownloads() cannot proceed because the current environment is not a browser."); + e.startsWith(Sa.URL_SCHEME) && (e = e.slice(Sa.URL_SCHEME.length)), (e == null || e.length === 0) && (e = cW), this.modelJsonFileName = e + lW, this.weightDataFileName = e + mW; + } + async save(e) { + if (typeof document == "undefined") + throw new Error("Browser downloads are not supported in this environment since `document` is not present"); + let t10 = 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 o = [{ paths: ["./" + this.weightDataFileName], weights: e.weightSpecs }], n = Xm(e, o), s = window.URL.createObjectURL(new Blob([JSON.stringify(n)], { type: "application/json" })), a = this.modelJsonAnchor == null ? document.createElement("a") : this.modelJsonAnchor; + if (a.download = this.modelJsonFileName, a.href = s, await lv(() => a.dispatchEvent(new MouseEvent("click"))), e.weightData != null) { + let i = this.weightDataAnchor == null ? document.createElement("a") : this.weightDataAnchor; + i.download = this.weightDataFileName, i.href = t10, await lv(() => i.dispatchEvent(new MouseEvent("click"))); + } + return { modelArtifactsInfo: As(e) }; + } + } +}; +Sa.URL_SCHEME = "downloads://"; +var Jb = class { + constructor(e) { + if (e == null || e.length < 1) + throw new Error(`When calling browserFiles, at least 1 file is required, but received ${e}`); + this.jsonFile = e[0], this.weightsFiles = e.slice(1); + } + async load() { + return new Promise((e, t10) => { + let o = new FileReader(); + o.onload = (n) => { + let s = JSON.parse(n.target.result), a = s.modelTopology; + if (a == null) { + t10(new Error(`modelTopology field is missing from file ${this.jsonFile.name}`)); + return; + } + if (s.weightsManifest == null) { + t10(new Error(`weightManifest field is missing from file ${this.jsonFile.name}`)); + return; + } + if (this.weightsFiles.length === 0) { + e({ modelTopology: a }); + return; + } + let p = Bp(s, (u) => this.loadWeights(u)); + e(p); + }, o.onerror = (n) => t10(`Failed to read model topology and weights manifest JSON from file '${this.jsonFile.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`), o.readAsText(this.jsonFile); + }); + } + loadWeights(e) { + let t10 = [], o = []; + for (let a of e) + t10.push(...a.weights), o.push(...a.paths); + let n = this.checkManifestAndWeightFiles(e), s = o.map((a) => this.loadWeightsFile(a, n[a])); + return Promise.all(s).then((a) => [t10, Lp(a)]); + } + loadWeightsFile(e, t10) { + return new Promise((o, n) => { + let s = new FileReader(); + s.onload = (a) => { + let i = a.target.result; + o(i); + }, s.onerror = (a) => n(`Failed to weights data from file of path '${e}'.`), s.readAsArrayBuffer(t10); + }); + } + checkManifestAndWeightFiles(e) { + let t10 = [], o = this.weightsFiles.map((s) => Hb(s.name)), n = {}; + for (let s of e) + s.paths.forEach((a) => { + let i = Hb(a); + if (t10.indexOf(i) !== -1) + throw new Error(`Duplicate file basename found in weights manifest: '${i}'`); + if (t10.push(i), o.indexOf(i) === -1) + throw new Error(`Weight file with basename '${i}' is not provided.`); + n[a] = this.weightsFiles[o.indexOf(i)]; + }); + if (t10.length !== this.weightsFiles.length) + throw new Error(`Mismatch in the number of files in weights manifest (${t10.length}) and the number of weight files provided (${this.weightsFiles.length}).`); + return n; + } +}; +var fW = (r) => P().getBool("IS_BROWSER") && !Array.isArray(r) && r.startsWith(Sa.URL_SCHEME) ? dW(r.slice(Sa.URL_SCHEME.length)) : null; +mt.registerSaveRouter(fW); +function dW(r = "model") { + return new Sa(r); +} +function mv(r) { + return new Jb(r); +} +function eC(r, e, t10, o) { + a(r), t10 = t10 == null ? 0 : t10, o = o == null ? 1 : o, i(t10, o); + let n = 0, s = (p) => (p.then((u) => { + let c = t10 + ++n / r.length * (o - t10); + return e(c), u; + }), p); + function a(p) { + $(p != null && Array.isArray(p) && p.length > 0, () => "promises must be a none empty array"); + } + function i(p, u) { + $(p >= 0 && p <= 1, () => `Progress fraction must be in range [0, 1], but got startFraction ${p}`), $(u >= 0 && u <= 1, () => `Progress fraction must be in range [0, 1], but got endFraction ${u}`), $(u >= p, () => `startFraction must be no more than endFraction, but got startFraction ${p} and endFraction ${u}`); + } + return Promise.all(r.map(s)); +} +async function tC(r, e) { + e == null && (e = {}); + let t10 = e.fetchFunc == null ? P().platform.fetch : e.fetchFunc, o = r.map((l) => t10(l, e.requestInit, { isBinary: true })), n = 0, s = 0.5, i = (e.onProgress == null ? await Promise.all(o) : await eC(o, e.onProgress, n, s)).map((l) => l.arrayBuffer()), p = 0.5, u = 1; + return e.onProgress == null ? await Promise.all(i) : await eC(i, e.onProgress, p, u); +} +async function fv(r, e = "", t10, o) { + return rC((a) => tC(a, { requestInit: o }))(r, e, t10); +} +function rC(r) { + return async (e, t10 = "", o) => { + let n = e.map(() => false), s = {}, a = o != null ? o.map(() => false) : [], i = []; + if (e.forEach((f, d) => { + let h = 0; + f.weights.forEach((g) => { + let y = "quantization" in g ? g.quantization.dtype : g.dtype, b = al[y] * Ve(g.shape), C = () => { + n[d] = true, s[d] == null && (s[d] = []), s[d].push({ manifestEntry: g, groupOffset: h, sizeBytes: b }); + }; + o != null ? o.forEach((w, k) => { + w === g.name && (C(), a[k] = true); + }) : C(), i.push(g.name), h += b; + }); + }), !a.every((f) => f)) { + let f = o.filter((d, h) => !a[h]); + throw new Error(`Could not find weights in manifest with names: ${f.join(", ")}. +Manifest JSON has weights with names: ${i.join(", ")}.`); + } + let p = n.reduce((f, d, h) => (d && f.push(h), f), []), u = []; + p.forEach((f) => { + e[f].paths.forEach((d) => { + let h = t10 + (t10.endsWith("/") ? "" : "/") + d; + u.push(h); + }); + }); + let c = await r(u), l = {}, m = 0; + return p.forEach((f) => { + let d = e[f].paths.length, h = 0; + for (let w = 0; w < d; w++) + h += c[m + w].byteLength; + let g = new ArrayBuffer(h), y = new Uint8Array(g), b = 0; + for (let w = 0; w < d; w++) { + let k = new Uint8Array(c[m + w]); + y.set(k, b), b += k.byteLength; + } + s[f].forEach((w) => { + let k = g.slice(w.groupOffset, w.groupOffset + w.sizeBytes), _ = jm(k, [w.manifestEntry]); + for (let E in _) + l[E] = _[E]; + }), m += d; + }), l; + }; +} +var hW = "application/octet-stream"; +var gW = "application/json"; +var il = class { + constructor(e, t10) { + if (this.DEFAULT_METHOD = "POST", t10 == null && (t10 = {}), this.weightPathPrefix = t10.weightPathPrefix, this.onProgress = t10.onProgress, this.weightUrlConverter = t10.weightUrlConverter, t10.fetchFunc != null ? ($(typeof t10.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 = t10.fetchFunc) : this.fetch = P().platform.fetch, $(e != null && e.length > 0, () => "URL path for http must not be null, undefined or empty."), Array.isArray(e) && $(e.length === 2, () => `URL paths for http must have a length of 2, (actual length is ${e.length}).`), this.path = e, t10.requestInit != null && t10.requestInit.body != null) + throw new Error("requestInit is expected to have no pre-existing body, but has one."); + this.requestInit = t10.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 t10 = Object.assign({ method: this.DEFAULT_METHOD }, this.requestInit); + t10.body = new FormData(); + let o = [{ paths: ["./model.weights.bin"], weights: e.weightSpecs }], n = Xm(e, o); + t10.body.append("model.json", new Blob([JSON.stringify(n)], { type: gW }), "model.json"), e.weightData != null && t10.body.append("model.weights.bin", new Blob([e.weightData], { type: hW }), "model.weights.bin"); + let s = await this.fetch(this.path, t10); + if (s.ok) + return { modelArtifactsInfo: As(e), responses: [s] }; + throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${s.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 t10; + try { + t10 = await e.json(); + } catch (s) { + let a = `Failed to parse model JSON of response from ${this.path}.`; + throw this.path.endsWith(".pb") ? a += " Your path contains a .pb file extension. Support for .pb models have been removed in TensorFlow.js 1.0 in favor of .json models. You can re-convert your Python TensorFlow model using the TensorFlow.js 1.0 conversion scripts or you can convert your.pb models with the 'pb2json'NPM script in the tensorflow/tfjs-converter repository." : a += " Please make sure the server is serving valid JSON for this request.", new Error(a); + } + let o = t10.modelTopology, n = t10.weightsManifest; + if (o == null && n == null) + throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`); + return Bp(t10, (s) => this.loadWeights(s)); + } + async loadWeights(e) { + let t10 = Array.isArray(this.path) ? this.path[1] : this.path, [o, n] = xW(t10), s = this.weightPathPrefix || o, a = Ym(e), i = [], p = []; + for (let c of e) + for (let l of c.paths) + this.weightUrlConverter != null ? p.push(this.weightUrlConverter(l)) : i.push(s + l + n); + this.weightUrlConverter && i.push(...await Promise.all(p)); + let u = await tC(i, { requestInit: this.requestInit, fetchFunc: this.fetch, onProgress: this.onProgress }); + return [a, Lp(u)]; + } +}; +il.URL_SCHEME_REGEX = /^https?:\/\//; +function xW(r) { + let e = r.lastIndexOf("/"), t10 = r.lastIndexOf("?"), o = r.substring(0, e), n = t10 > e ? r.substring(t10) : ""; + return [o + "/", n]; +} +function tf(r) { + return r.match(il.URL_SCHEME_REGEX) != null; +} +var dv = (r, e) => { + if (typeof fetch == "undefined" && (e == null || e.fetchFunc == null)) + return null; + { + let t10 = true; + if (Array.isArray(r) ? t10 = r.every((o) => tf(o)) : t10 = tf(r), t10) + return rf(r, e); + } + return null; +}; +mt.registerSaveRouter(dv); +mt.registerLoadRouter(dv); +function rf(r, e) { + return new il(r, e); +} +function hv(r, e) { + return rf(r, e); +} +var ul = class { + constructor(e) { + this.modelArtifacts = e; + } + load() { + return this.modelArtifacts; + } +}; +var of = class { + constructor(e) { + this.saveHandler = e; + } + save(e) { + return this.saveHandler(e); + } +}; +var oC = class { + constructor(e) { + e.load && (this.load = () => Promise.resolve(e.load())), e.save && (this.save = (t10) => Promise.resolve(e.save(t10))); + } +}; +function gv(r, e, t10, o) { + let n = arguments; + return new oC(nC(...n)); +} +function nC(r, e, t10, o) { + return arguments.length === 1 ? r.modelTopology != null || r.weightSpecs != null ? new ul(r) : (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 ul({ modelTopology: r })) : (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 ul({ modelTopology: r, weightSpecs: e, weightData: t10, trainingConfig: o })); +} +function xv(r) { + return new of(r); +} +function yv(r) { + return new of(r); +} +var Cv = {}; +Be(Cv, { confusionMatrix: () => bv }); +function yW(r, e, t10 = false, o = false) { + let n = v(r, "a", "matMul"), s = v(e, "b", "matMul"); + [n, s] = Re(n, s); + let a = { a: n, b: s }, i = { transposeA: t10, transposeB: o }; + return N.runKernel(cn, a, i); +} +var Xe = T({ matMul_: yW }); +function bW(r, e, t10 = 1, o = 0, n = "int32") { + if (e < 2) + throw new Error(`Error in oneHot: depth must be >=2, but it is ${e}`); + let a = { indices: v(r, "indices", "oneHot", "int32") }, i = { dtype: n, depth: e, onValue: t10, offValue: o }; + return N.runKernel(ca, a, i); +} +var pl = T({ oneHot_: bW }); +function Tie() { + P().set("PROD", true); +} +function Nie() { + P().set("DEBUG", true); +} +function _ie() { + P().set("DEPRECATION_WARNINGS_ENABLED", false), console.warn("TensorFlow.js deprecation warnings have been disabled."); +} +function sC(r) { + P().getBool("DEPRECATION_WARNINGS_ENABLED") && console.warn(r + " You can disable deprecation warnings with tf.disableDeprecationWarnings()."); +} +B0(sC); +function Eie() { + N.disposeVariables(); +} +function cr() { + return N; +} +function $ie() { + return N.memory(); +} +function Rie(r) { + return N.profile(r); +} +function Ne(r, e) { + return N.tidy(r, e); +} +function Ft(r) { + sl(r).forEach((t10) => t10.dispose()); +} +function So(r) { + return N.keep(r); +} +function Aie(r) { + return N.time(r); +} +function Fie(r) { + return N.setBackend(r); +} +function Die() { + return N.ready(); +} +function Pie() { + return N.backendName; +} +function Oie(r) { + N.removeBackend(r); +} +function Mie(r) { + return N.findBackend(r); +} +function Lie(r) { + return N.findBackendFactory(r); +} +function pi(r, e, t10 = 1) { + return N.registerBackend(r, e, t10); +} +function Bie() { + return N.backend; +} +function Vie(r, e) { + P().setPlatform(r, e); +} +function CW(r) { + let t10 = { input: v(r, "input", "imag") }; + return N.runKernel(Ya, t10); +} +var ci = T({ imag_: CW }); +function IW(r) { + let t10 = { x: v(r, "x", "neg") }; + return N.runKernel(Pn, t10); +} +var yr = T({ neg_: IW }); +function wW(r) { + let t10 = { input: v(r, "input", "real") }; + return N.runKernel(la, t10); +} +var ka = T({ real_: wW }); +function SW(r, e, t10) { + let o = v(r, "x", "transpose"); + if (e == null && (e = o.shape.map((a, i) => i).reverse()), $(o.rank === e.length, () => `Error in transpose: rank of input ${o.rank} must match length of perm ${e}.`), e.forEach((a) => { + $(a >= 0 && a < o.rank, () => `All entries in 'perm' must be between 0 and ${o.rank - 1} but got ${e}`); + }), o.rank <= 1) + return o.clone(); + let n = { x: o }, s = { perm: e }; + return o.dtype === "complex64" ? Ne(() => { + let a = ka(o), i = ci(o); + return a = N.runKernel(Mr, { x: a }, s), i = N.runKernel(Mr, { x: i }, s), t10 && (i = yr(i)), Er(a, i); + }) : N.runKernel(Mr, n, s); +} +var Wp = T({ transpose_: SW }); +function vW(r, e, t10) { + let o = v(r, "labels", "confusionMatrix"), n = v(e, "predictions", "confusionMatrix"); + $(t10 == null || t10 > 0 && Number.isInteger(t10), () => `If provided, numClasses must be a positive integer, but got ${t10}`), $(o.rank === 1, () => `Expected the rank of labels to be 1, but got ${o.rank}`), $(n.rank === 1, () => `Expected the rank of predictions to be 1, but got ${n.rank}`), $(o.shape[0] === n.shape[0], () => `Mismatch in the number of examples: ${o.shape[0]} vs. ${n.shape[0]}. Labels and predictions should have the same number of elements.`), $(t10 > 0 && Number.isInteger(t10), () => `numClasses is required to be a positive integer, but got ${t10}`); + let s = pl(qe(o, "int32"), t10), a = pl(qe(n, "int32"), t10), i = Wp(s), p = Xe(i, a); + return qe(p, "int32"); +} +var bv = T({ confusionMatrix_: vW }); +var br = {}; +Be(br, { assertAndGetBroadcastShape: () => Je, getBroadcastDims: () => Iv, getReductionAxes: () => nf }); +function Iv(r, e) { + let t10 = r.length, o = []; + for (let n = 0; n < t10; n++) { + let s = t10 - 1 - n, a = r[s] || 1; + (e[e.length - 1 - n] || 1) > 1 && a === 1 && o.unshift(s); + } + return o; +} +function nf(r, e) { + let t10 = []; + for (let o = 0; o < e.length; o++) { + let n = r[r.length - o - 1], s = e.length - o - 1, a = e[s]; + (n == null || n === 1 && a > 1) && t10.unshift(s); + } + return t10; +} +function Je(r, e) { + let t10 = [], o = Math.max(r.length, e.length); + for (let n = 0; n < o; n++) { + let s = r[r.length - n - 1]; + s == null && (s = 1); + let a = e[e.length - n - 1]; + if (a == null && (a = 1), s === 1) + t10.unshift(a); + else if (a === 1) + t10.unshift(s); + else if (s !== a) { + let i = `Operands could not be broadcast together with shapes ${r} and ${e}.`; + throw Error(i); + } else + t10.unshift(s); + } + return t10; +} +var Sv = {}; +Be(Sv, { fromPixels: () => RW, fromPixelsAsync: () => EW, toPixels: () => $W }); +function sf(r, e, t10) { + if (eo(r), e != null && e.length !== 3) + throw new Error("tensor3d() requires shape to have three numbers"); + let o = or(r, t10); + if (o.length !== 3 && o.length !== 1) + throw new Error("tensor3d() requires values to be number[][][] or flat/TypedArray"); + if (o.length === 1 && e == null) + throw new Error("tensor3d() requires shape to be provided when `values` are a flat array"); + return xr(r, e, o, t10); +} +var su; +function wv(r, e = 3) { + if (e > 4) + throw new Error("Cannot construct Tensor with more than 4 channels from pixels."); + if (r == null) + throw new Error("pixels passed to tf.browser.fromPixels() can not be null"); + let t10 = false, o = false, n = false, s = false, a = false, i = false; + if (r.data instanceof Uint8Array) + t10 = true; + else if (typeof ImageData != "undefined" && r instanceof ImageData) + o = true; + else if (typeof HTMLVideoElement != "undefined" && r instanceof HTMLVideoElement) + n = true; + else if (typeof HTMLImageElement != "undefined" && r instanceof HTMLImageElement) + s = true; + else if (r.getContext != null) + a = true; + else if (typeof ImageBitmap != "undefined" && r instanceof ImageBitmap) + i = 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 ${r.constructor.name}`); + if (el(Zi, N.backendName) != null) { + let d = { pixels: r }, h = { numChannels: e }; + return N.runKernel(Zi, d, h); + } + let [u, c] = n ? [r.videoWidth, r.videoHeight] : [r.width, r.height], l; + if (a) + l = r.getContext("2d").getImageData(0, 0, u, c).data; + else if (o || t10) + l = r.data; + else if (s || n || i) { + if (su == null) + if (typeof document == "undefined") + if (typeof OffscreenCanvas != "undefined" && typeof OffscreenCanvasRenderingContext2D != "undefined") + su = new OffscreenCanvas(1, 1).getContext("2d"); + else + throw new Error("Cannot parse input in current context. Reason: OffscreenCanvas Context2D rendering is not supported."); + else + su = document.createElement("canvas").getContext("2d", { willReadFrequently: true }); + su.canvas.width = u, su.canvas.height = c, su.drawImage(r, 0, 0, u, c), l = su.getImageData(0, 0, u, c).data; + } + let m; + if (e === 4) + m = new Int32Array(l); + else { + let d = u * c; + m = new Int32Array(d * e); + for (let h = 0; h < d; h++) + for (let g = 0; g < e; ++g) + m[h * e + g] = l[h * 4 + g]; + } + return sf(m, [c, u, e], "int32"); +} +function kW(r) { + return r != null && r.data instanceof Uint8Array; +} +function TW() { + return typeof window != "undefined" && typeof ImageBitmap != "undefined" && window.hasOwnProperty("createImageBitmap"); +} +function NW(r) { + return r != null && r.width !== 0 && r.height !== 0; +} +function _W(r) { + return TW() && !(r instanceof ImageBitmap) && NW(r) && !kW(r); +} +async function EW(r, e = 3) { + let t10 = null; + if (P().getBool("WRAP_TO_IMAGEBITMAP") && _W(r)) { + let o; + try { + o = await createImageBitmap(r, { premultiplyAlpha: "none" }); + } catch (n) { + o = null; + } + o != null && o.width === r.width && o.height === r.height ? t10 = o : t10 = r; + } else + t10 = r; + return wv(t10, e); +} +async function $W(r, e) { + let t10 = v(r, "img", "toPixels"); + if (!(r instanceof ut)) { + let u = t10; + t10 = qe(u, "int32"), u.dispose(); + } + if (t10.rank !== 2 && t10.rank !== 3) + throw new Error(`toPixels only supports rank 2 or 3 tensors, got rank ${t10.rank}.`); + let [o, n] = t10.shape.slice(0, 2), s = t10.rank === 2 ? 1 : t10.shape[2]; + if (s > 4 || s === 2) + throw new Error(`toPixels only supports depth of size 1, 3 or 4 but got ${s}`); + if (t10.dtype !== "float32" && t10.dtype !== "int32") + throw new Error(`Unsupported type for toPixels: ${t10.dtype}. Please use float32 or int32 tensors.`); + let a = await t10.data(), i = t10.dtype === "float32" ? 255 : 1, p = new Uint8ClampedArray(n * o * 4); + for (let u = 0; u < o * n; ++u) { + let c = [0, 0, 0, 255]; + for (let m = 0; m < s; m++) { + let f = a[u * s + m]; + if (t10.dtype === "float32") { + if (f < 0 || f > 1) + throw new Error(`Tensor values for a float32 Tensor must be in the range [0 - 1] but encountered ${f}.`); + } else if (t10.dtype === "int32" && (f < 0 || f > 255)) + throw new Error(`Tensor values for a int32 Tensor must be in the range [0 - 255] but encountered ${f}.`); + s === 1 ? (c[0] = f * i, c[1] = f * i, c[2] = f * i) : c[m] = f * i; + } + let l = u * 4; + p[l + 0] = Math.round(c[0]), p[l + 1] = Math.round(c[1]), p[l + 2] = Math.round(c[2]), p[l + 3] = Math.round(c[3]); + } + if (e != null) { + e.width = n, e.height = o; + let u = e.getContext("2d"), c = new ImageData(p, n, o); + u.putImageData(c, 0, 0); + } + return t10 !== r && t10.dispose(), p; +} +var RW = T({ fromPixels_: wv }); +var af = {}; +Be(af, { prepareAndValidate: () => vv }); +function vv(r, e) { + let t10 = r.shape.length, o = e.shape.length; + if (t10 < 1) + throw new Error(`tf.gatherND() expects the input to be rank 1 or higher, but the rank was ${t10}.`); + if (o < 1) + throw new Error(`tf.gatherND() expects the indices to be rank 1 or higher, but the rank was ${o}.`); + if (e.dtype !== "int32") + throw new Error(`tf.gatherND() expects the indices to be int32 type, but the dtype was ${e.dtype}.`); + if (e.shape[o - 1] > t10) + throw new Error(`index innermost dimension length must be <= tensor rank; saw: ${e.shape[o - 1]} vs. ${t10}`); + if (Ve(r.shape) === 0) + throw new Error(`Requested more than 0 entries, but input is empty. Input shape: ${r.shape}.`); + let n = e.shape, s = n[n.length - 1], a = 1; + for (let l = 0; l < n.length - 1; ++l) + a *= n[l]; + let i = r.shape, p = n.slice(); + p.pop(); + let u = 1; + for (let l = s; l < t10; ++l) + u *= i[l], p.push(i[l]); + let c = [...ds(r.shape).map((l) => l / u), 1].slice(0, s); + return [p, a, u, c]; +} +var cl = {}; +Be(cl, { calculateShapes: () => kv, validateInput: () => uf, validateUpdateShape: () => aC }); +function aC(r, e, t10) { + let o = e.rank > 1 ? e.shape[e.rank - 1] : 1, n = e.rank > 1 ? e.rank - 1 : 1, s = `Must have updates.shape = indices.shape[:batchDim] + shape[sliceDim:], got updates.shape: ${t10.shape}, indices.shape: ${e.shape}, shape: ${r}, sliceDim: ${o}, and batchDim: ${n}.`; + if (t10.rank < n) + throw new Error(s + ` update.rank < ${n}. `); + if (r.length < o + (t10.rank - n)) + throw new Error(s + ` Output shape length < ${o + (t10.rank - n)}`); + if (t10.rank !== n + r.length - o) + throw new Error(s + ` update.rank != ${n + r.length - o}`); + for (let a = 0; a < n; ++a) + if (t10.shape[a] !== e.shape[a]) + throw new Error(s + ` updates.shape[${a}] (${t10.shape[a]}) != indices.shape[${a}] (${e.shape[a]}).`); + for (let a = 0; a < t10.rank - n; ++a) + if (t10.shape[a + n] !== r[a + o]) + throw new Error(s + ` updates.shape[${a + n}] (${t10.shape[a + n]}) != shape[${a + n}] (${r[a + n]})`); +} +function uf(r, e, t10) { + if (e.rank < 1) + throw new Error(`tf.scatterND() expects the indices to be rank 1 or higher, but the rank was ${e.rank}.`); + if (r.rank < 1) + throw new Error(`tf.scatterND() expects the updates to be rank 1 or higher, but the rank was ${r.rank}.`); + if (e.dtype !== "int32") + throw new Error(`The dtype of 'indices' should be int32, but got dtype: ${e.dtype}`); + if (t10.length < 1) + throw new Error(`Output rank must be greater or equal to 1, but got shape: ${t10}`); + if (t10.length === 0) { + if (e.size === 0) + throw new Error(`Indices specified for empty output. indices shape: ${e.shape}`); + if (r.size === 0) + throw new Error(`Updates specified for empty output. updates shape: ${r.shape}`); + } + aC(t10, e, r); +} +function kv(r, e, t10) { + let o = e.shape.length, n = o > 1 ? e.shape[o - 1] : 1, s = t10.length, a = 1; + for (let l = n; l < s; ++l) + a *= t10[l]; + let i = n < 1 ? 1 : n, p = Ve(e.shape) / i, u = [...ds(t10.slice(0, n)), 1], c = Ve(t10); + return { sliceRank: n, numUpdates: p, sliceSize: a, strides: u, outputSize: c }; +} +var et = {}; +Be(et, { assertParamsValid: () => FW, computeFlatOffset: () => LW, computeOutShape: () => PW, getNormalizedAxes: () => OW, isSliceContinous: () => MW, maskToAxes: () => DW, parseSliceParams: () => BW, sliceInfo: () => VW, startForAxis: () => Fv, startIndicesWithElidedDims: () => $v, stopForAxis: () => Dv, stopIndicesWithElidedDims: () => Rv, stridesForAxis: () => Av, stridesWithElidedDims: () => Nv }); +var iC = -2; +var AW = -1; +function FW(r, e, t10) { + let o = r.shape.length; + $(o === e.length, () => `Error in slice${o}D: Length of begin ${e} must match the rank of the array (${o}).`), $(o === t10.length, () => `Error in slice${o}D: Length of size ${t10} must match the rank of the array (${o}).`); + for (let n = 0; n < o; ++n) + $(e[n] + t10[n] <= r.shape[n], () => `Error in slice${o}D: begin[${n}] + size[${n}] (${e[n] + t10[n]}) would overflow input.shape[${n}] (${r.shape[n]})`); +} +function DW(r) { + let e = [], t10 = 0; + for (; r > 0; ) + r & 1 && e.push(t10), r /= 2, t10++; + return e; +} +function PW(r, e, t10) { + let o = []; + for (let n = 0; n < r.length; n++) + o[n] = Math.ceil((e[n] - r[n]) / t10[n]); + return o; +} +function Nv(r, e, t10, o) { + let n = [...r]; + for (let s = n.length; s < o.length; s++) + n.push(1); + for (let s = 0; s < t10; s++) + s === 0 ? n[e] = 1 : (n.splice(e, 0, 1), n.pop()); + return n; +} +function _v(r, e, t10) { + return t10 <= r ? t10 : t10 - (e - 1); +} +function Ev(r, e) { + let t10 = []; + for (let o = 0; o < r; o++) + t10.push(e + o); + return t10; +} +function OW(r, e, t10, o, n, s, a, i, p) { + let u = r.length, c = new Array(u), l = new Array(u), m = new Array(u); + if (e.length && t10 > 0) { + let f = e[0], d = t10 + 1; + c = $v(a, f, d, o, r), l = Rv(i, f, d, n, r), m = Nv(s, f, d, r); + } else + for (let f = 0; f < u; f++) + c[f] = Fv(a, o, s, r, f, p), l[f] = Dv(i, n, s, r, f, p), m[f] = Av(s, f, p); + return { begin: c, end: l, strides: m }; +} +function $v(r, e, t10, o, n) { + let s = [...n], a = Ev(t10, e); + for (let i = 0; i < s.length; i++) + if (a.indexOf(i) > -1) + s[i] = 0; + else { + let p = _v(e, t10, i), u = o[p]; + r & 1 << p && (u = 0), s[i] = u; + } + return s; +} +function Rv(r, e, t10, o, n) { + let s = [...n], a = Ev(t10, e); + for (let i = 0; i < s.length; i++) + if (a.indexOf(i) > -1) + s[i] = Number.MAX_SAFE_INTEGER; + else { + let p = _v(e, t10, i), u = o[p]; + r & 1 << p && (u = Number.MAX_SAFE_INTEGER), s[i] = u; + } + for (let i = 0; i < s.length; i++) { + let p = n[i]; + s[i] < 0 && (s[i] += p), s[i] = op(0, s[i], n[i]); + } + return s; +} +function Av(r, e, t10) { + let o = r[e]; + return (t10 & 1 << e || o == null) && (o = 1), o; +} +function Fv(r, e, t10, o, n, s) { + let a = e[n], i = t10[n] || 1; + (r & 1 << n || s & 1 << n || a == null) && (i > 0 ? a = Number.MIN_SAFE_INTEGER : a = Number.MAX_SAFE_INTEGER); + let p = o[n]; + return a < 0 && (a += p), a = op(0, a, p - 1), a; +} +function Dv(r, e, t10, o, n, s) { + let a = e[n], i = t10[n] || 1; + (r & 1 << n || s & 1 << n || a == null) && (i > 0 ? a = Number.MAX_SAFE_INTEGER : a = Number.MIN_SAFE_INTEGER); + let p = o[n]; + return a < 0 && (a += p), i > 0 ? a = op(0, a, p) : a = op(-1, a, p - 1), a; +} +function MW(r, e, t10) { + let o = t10.length; + for (let n = 0; n < t10.length; n++) + if (t10[n] > 1) { + o = n; + break; + } + for (let n = o + 1; n < t10.length; n++) + if (e[n] > 0 || t10[n] !== r[n]) + return false; + return true; +} +function LW(r, e) { + let t10 = r.length > 0 ? r[r.length - 1] : 1; + for (let o = 0; o < r.length - 1; o++) + t10 += r[o] * e[o]; + return t10; +} +function BW(r, e, t10) { + let o, n = r.shape.length; + typeof e == "number" ? o = [e, ...new Array(n - 1).fill(0)] : e.length < n ? o = e.concat(new Array(n - e.length).fill(0)) : o = e.slice(), o.forEach((a) => { + $(a !== -1, () => "slice() does not support negative begin indexing."); + }); + let s; + return t10 == null ? s = new Array(n).fill(-1) : typeof t10 == "number" ? s = [t10, ...new Array(n - 1).fill(-1)] : t10.length < n ? s = t10.concat(new Array(n - t10.length).fill(-1)) : s = t10, s = s.map((a, i) => a >= 0 ? a : ($(a === -1, () => `Negative size values should be exactly -1 but got ${a} for the slice() size at index ${i}.`), r.shape[i] - o[i])), [o, s]; +} +function VW(r, e, t10, o, n, s, a, i, p) { + let u; + if (o == null ? (u = new Array(e.length), u.fill(1)) : u = o, a != null && (a & a - 1) !== 0) + throw new Error("Multiple ellipses in slice is not allowed."); + let c = false, l = { dims: u.length, numAddAxisAfterEllipsis: 0, begin: e.slice(), end: t10.slice(), strides: u.slice(), beginMask: n, endMask: s, ellipsisMask: a, newAxisMask: i, shrinkAxisMask: p }; + for (let C = 0; C < l.dims; C++) + c && (1 << C & i) !== 0 && l.numAddAxisAfterEllipsis++, 1 << C & a && (c = true); + c || (l.ellipsisMask |= 1 << l.dims, l.dims++); + let m = { dims: r.length, beginMask: 0, endMask: 0, beginValid: false, endValid: false }; + zW(l, m); + let f = true, d = true, h = true, g = [], y = []; + for (let C = 0; C < r.length; ++C) { + if (m.strides[C] === 0) + throw Error(`strides[${C}] must be non-zero`); + let w = !!(m.shrinkAxisMask & 1 << C), k = r[C]; + if (k === -1) { + g.push(w ? 1 : -1); + continue; + } + let _ = [m.beginMask & 1 << C, m.endMask & 1 << C], E = [m.strides[C] > 0 ? 0 : -1, m.strides[C] > 0 ? k : k - 1]; + if (w && m.strides[C] <= 0) + throw Error("only stride 1 allowed on non-range indexing."); + h = h && m.strides[C] === 1; + let R = !!(m.beginMask & 1 << C && m.endMask & 1 << C); + if (m.beginValid && m.endValid) { + if (w) { + let M = m.begin[C] < 0 ? k + m.begin[C] : m.begin[C]; + if (m.begin[C] = M, m.end[C] = m.begin[C] + 1, M < 0 || M >= k) + throw Error(`slice index ${m.begin[C]} of dimension ${C} out of bounds.`); + } else + m.begin[C] = Tv(m.begin[C], 0, m.strides[C], k, _, E), m.end[C] = Tv(m.end[C], 1, m.strides[C], k, _, E); + let O = m.strides[C] === 1 && m.begin[C] === 0 && m.end[C] === k; + f = f && O, d = d && (C === 0 && m.strides[C] === 1 || O); + } else + f = f && m.strides[C] === 1 && R, d = d && (C === 0 && m.strides[C] === 1 || R); + let A, D = false; + if (m.beginValid && m.endValid ? (A = m.end[C] - m.begin[C], D = true) : w ? (A = 1, D = true) : R && k >= 0 && (m.strides[C] < 0 ? A = -k : A = k, D = true), D) { + let O; + A === 0 || A < 0 != m.strides[C] < 0 ? O = 0 : O = Math.trunc(A / m.strides[C]) + (A % m.strides[C] !== 0 ? 1 : 0), g.push(O); + } else + g.push(-1); + } + for (let C = 0; C < m.finalShapeGatherIndices.length; ++C) { + let w = m.finalShapeGatherIndices[C]; + w >= 0 ? y.push(g[w]) : w === iC && y.push(1); + } + return { finalShapeSparse: y.filter((C, w) => m.finalShapeGatherIndices[w] !== iC), finalShape: y, isIdentity: f, sliceDim0: d, isSimpleSlice: h, begin: m.begin, end: m.end, strides: m.strides }; +} +function zW(r, e) { + e.beginMask = 0, e.endMask = 0, e.shrinkAxisMask = 0; + let t10 = 0; + e.beginValid = r.begin != null, e.endValid = r.end != null, e.begin = new Array(e.dims), e.end = new Array(e.dims), e.strides = new Array(e.dims), e.finalShapeGatherIndices = [], e.finalShapeGatherIndicesSparse = [], e.inputShapeGatherIndicesSparse = new Array(e.dims); + for (let o = 0; o < r.dims; o++) + if (1 << o & r.ellipsisMask) { + let n = Math.min(e.dims - (r.dims - o) + 1 + r.numAddAxisAfterEllipsis, e.dims); + for (; t10 < n; t10++) + e.begin[t10] = 0, e.end[t10] = 0, e.strides[t10] = 1, e.beginMask |= 1 << t10, e.endMask |= 1 << t10, e.finalShapeGatherIndices.push(t10), e.finalShapeGatherIndicesSparse.push(-1), e.inputShapeGatherIndicesSparse[t10] = o; + } else if (1 << o & r.newAxisMask) + e.finalShapeGatherIndices.push(iC), e.finalShapeGatherIndicesSparse.push(-1); + else { + if (t10 === e.begin.length) + throw Error(`Index out of range using input dim ${t10}; input has only ${e.dims} dims, ${e.begin.length}.`); + r.begin != null && (e.begin[t10] = r.begin[o]), r.end != null && (e.end[t10] = r.end[o]), e.strides[t10] = r.strides[o], r.beginMask & 1 << o && (e.beginMask |= 1 << t10), r.endMask & 1 << o && (e.endMask |= 1 << t10), r.shrinkAxisMask & 1 << o ? (e.finalShapeGatherIndices.push(AW), e.finalShapeGatherIndicesSparse.push(-1), e.shrinkAxisMask |= 1 << t10) : (e.finalShapeGatherIndices.push(t10), e.finalShapeGatherIndicesSparse.push(o)), e.inputShapeGatherIndicesSparse[t10] = o, t10++; + } +} +function Tv(r, e, t10, o, n, s) { + if (n[e]) + return t10 > 0 ? s[e] : s[e + 1 & 1]; + { + let a = r < 0 ? o + r : r; + return a < s[0] ? s[0] : a > s[1] ? s[1] : a; + } +} +var Pv = {}; +Be(Pv, { Serializable: () => ll, SerializationMap: () => Ps, registerClass: () => $r }); +var ll = class { + getClassName() { + return this.constructor.className; + } + static fromConfig(e, t10) { + return new e(t10); + } +}; +var Ps = class { + constructor() { + this.classNameMap = {}; + } + static getMap() { + return Ps.instance == null && (Ps.instance = new Ps()), Ps.instance; + } + static register(e) { + Ps.getMap().classNameMap[e.className] = [e, e.fromConfig]; + } +}; +function $r(r) { + $(r.className != null, () => "Class being registered does not have the static className property defined."), $(typeof r.className == "string", () => "className is required to be a string, but got type " + typeof r.className), $(r.className.length > 0, () => "Class being registered has an empty-string as its className, which is disallowed."), Ps.register(r); +} +var Bv = {}; +Be(Bv, { TEST_EPSILON_FLOAT16: () => Ov, createVideoElement: () => jW, encodeStrings: () => Lv, expectArrayBuffersEqual: () => KW, expectArraysClose: () => UW, expectArraysEqual: () => HW, expectNumbersClose: () => Mv, expectPromiseToFail: () => GW, expectValuesInRange: () => qW, play: () => XW, testEpsilon: () => pf }); +var WW = 1e-3; +var Ov = 0.1; +function UW(r, e, t10) { + return t10 == null && (t10 = pf()), uC(r, e, (o, n) => pC(o, n, t10)); +} +function pf() { + return N.backend.floatPrecision() === 32 ? WW : Ov; +} +function uC(r, e, t10) { + let o = true; + if ((Ut(r) || Ut(e)) && (o = false), Ut(r) && Ut(e) && (o = true), o) { + let a = r.constructor.name, i = e.constructor.name; + if (a !== i) + throw new Error(`Arrays are of different type. Actual: ${a}. Expected: ${i}`); + } + if (Array.isArray(r) && Array.isArray(e)) { + let a = or(r), i = or(e); + if (!Or(a, i)) + throw new Error(`Arrays have different shapes. Actual: [${a}]. Expected: [${i}]`); + } + let n = Ut(r) ? r : on(r), s = Ut(e) ? e : on(e); + if (n.length !== s.length) + throw new Error(`Arrays have different lengths actual: ${n.length} vs expected: ${s.length}. +Actual: ${n}. +Expected: ${s}.`); + for (let a = 0; a < s.length; ++a) { + let i = n[a], p = s[a]; + if (!t10(i, p)) + throw new Error(`Arrays differ: actual[${a}] = ${i}, expected[${a}] = ${p}. +Actual: ${n}. +Expected: ${s}.`); + } + typeof expect != "undefined" && expect().nothing(); +} +function GW(r, e) { + r().then(() => e.fail(), () => e()), typeof expect != "undefined" && expect().nothing(); +} +function HW(r, e) { + let t10 = typeof e == "string" || typeof e == "number" || typeof e == "boolean" ? [e] : e; + return nn(r) || nn(r[0]) || nn(e) || nn(e[0]) ? uC(r, t10, (o, n) => o == n) : uC(r, e, (o, n) => pC(o, n, 0)); +} +function Mv(r, e, t10) { + if (t10 == null && (t10 = pf()), !pC(r, e, t10)) + throw new Error(`Numbers differ: actual === ${r}, expected === ${e}`); + typeof expect != "undefined" && expect().nothing(); +} +function pC(r, e, t10) { + return !isFinite(r) && !isFinite(e) ? true : !(isNaN(r) || isNaN(e) || Math.abs(r - e) > t10); +} +function qW(r, e, t10) { + for (let o = 0; o < r.length; o++) + if (r[o] < e || r[o] > t10) + throw new Error(`Value out of range:${r[o]} low: ${e}, high: ${t10}`); +} +function KW(r, e) { + let t10 = new Float32Array(r), o = new Float32Array(e); + if (t10.length !== o.length) + throw new Error(`Expected ArrayBuffer to be of length ${o.length}, but it was ${t10.length}`); + for (let n = 0; n < o.length; n++) + if (t10[n] !== o[n]) + throw new Error(`Expected ArrayBuffer value at ${n} to be ${o[n]} but got ${t10[n]} instead`); +} +function Lv(r) { + for (let e = 0; e < r.length; e++) { + let t10 = r[e]; + Array.isArray(t10) ? Lv(t10) : r[e] = si(t10); + } + return r; +} +function jW(r) { + let e = document.createElement("video"); + return "playsInline" in e && (e.playsInline = true), e.muted = true, e.loop = true, e.style.position = "fixed", e.style.left = "0px", e.style.top = "0px", e.preload = "auto", e.appendChild(r), new Promise((t10) => { + e.addEventListener("loadeddata", (o) => t10(e)), e.load(); + }); +} +async function XW(r) { + await r.play(), "requestVideoFrameCallback" in r && await new Promise((e) => { + r.requestVideoFrameCallback(e); + }); +} +var YW = "4.0.0"; +function QW(r, e) { + let t10 = v(r, "a", "add"), o = v(e, "b", "add"); + [t10, o] = Re(t10, o); + let n = { a: t10, b: o }; + return N.runKernel(_r, n); +} +var ge = T({ add_: QW }); +function ZW(r, e) { + let t10 = v(r, "a", "floorDiv"), o = v(e, "b", "floorDiv"); + [t10, o] = Re(t10, o); + let n = { a: t10, b: o }; + return N.runKernel(vn, n); +} +var cf = T({ floorDiv_: ZW }); +function JW(r, e) { + let t10 = v(r, "a", "div"), o = v(e, "b", "div"); + if ([t10, o] = Re(t10, o), t10.dtype === "int32" && o.dtype === "int32") + return cf(t10, o); + let n = { a: t10, b: o }, s = {}; + return N.runKernel(Cn, n, s); +} +var We = T({ div_: JW }); +function eU(r, e) { + let t10 = v(r, "a", "mul"), o = v(e, "b", "mul"); + [t10, o] = Re(t10, o); + let n = { a: t10, b: o }; + return N.runKernel(ho, n); +} +var oe = T({ mul_: eU }); +function tU(r) { + let e = v(r, "x", "abs"); + if (e.dtype === "complex64") { + let t10 = { x: e }; + return N.runKernel(cp, t10); + } else { + let t10 = { x: e }; + return N.runKernel(sn, t10); + } +} +var Qt = T({ abs_: tU }); +function rU(r) { + let t10 = { x: v(r, "x", "acos") }; + return N.runKernel(Li, t10); +} +var Vv = T({ acos_: rU }); +function oU(r) { + let t10 = { x: v(r, "x", "acosh") }; + return N.runKernel(Bi, t10); +} +var zv = T({ acosh_: oU }); +function nU(r) { + $(Array.isArray(r), () => "The argument passed to tf.addN() must be a list of tensors"), $(r.length >= 1, () => `Must pass at least one tensor to tf.addN(), but got ${r.length}`); + let e = r.map((n, s) => v(n, `tensors${s}`, "addN")), t10 = e[0]; + e.forEach((n) => { + if (n.dtype !== t10.dtype) + throw new Error("All tensors passed to tf.addN() must have the same dtype"); + }), e.forEach((n) => { + if (!Or(n.shape, t10.shape)) + throw new Error("All tensors passed to tf.addN() must have the same shape"); + }); + let o = e; + return N.runKernel(an, o); +} +var Wv = T({ addN_: nU }); +function sU(r, e = null, t10 = false) { + let n = { x: v(r, "x", "all", "bool") }, s = { axis: e, keepDims: t10 }; + return N.runKernel(oa, n, s); +} +var Uv = T({ all_: sU }); +function aU(r, e = null, t10 = false) { + let n = { x: v(r, "x", "any", "bool") }, s = { axis: e, keepDims: t10 }; + return N.runKernel(na, n, s); +} +var Gv = T({ any_: aU }); +function iU(r, e = 0) { + let o = { x: v(r, "x", "argMax") }, n = { axis: e }; + return N.runKernel(un, o, n); +} +var Hv = T({ argMax_: iU }); +function uU(r, e = 0) { + let o = { x: v(r, "x", "argMin") }, n = { axis: e }; + return N.runKernel(ja, o, n); +} +var qv = T({ argMin_: uU }); +function pU(r) { + let t10 = { x: v(r, "x", "asin") }; + return N.runKernel(Vi, t10); +} +var Kv = T({ asin_: pU }); +function cU(r) { + let t10 = { x: v(r, "x", "asinh") }; + return N.runKernel(zi, t10); +} +var jv = T({ asinh_: cU }); +function lU(r) { + let t10 = { x: v(r, "x", "atan") }; + return N.runKernel(Wi, t10); +} +var Xv = T({ atan_: lU }); +function mU(r, e) { + let t10 = v(r, "a", "atan2"), o = v(e, "b", "atan2"); + [t10, o] = Re(t10, o); + let n = { a: t10, b: o }; + return N.runKernel(sa, n); +} +var Yv = T({ atan2_: mU }); +function fU(r) { + let t10 = { x: v(r, "x", "atanh") }; + return N.runKernel(Ui, t10); +} +var Qv = T({ atanh_: fU }); +function dU(r, e, t10, o, n = "NHWC", s) { + let a = r[3], i = [...e, a], p = Jv(n); + return uu(r, i, t10, s, o, null, null, p); +} +function lC(r, e, t10, o, n, s, a = "channelsLast") { + let [i, p] = lf(e), u; + if (a === "channelsLast") + u = [i, p, r[3], r[3]]; + else if (a === "channelsFirst") + u = [i, p, r[1], r[1]]; + else + throw new Error(`Unknown dataFormat ${a}`); + return uu(r, u, t10, o, n, s, false, a); +} +function hU(r, e, t10, o, n, s, a = "NDHWC") { + let [i, p, u] = cC(e), c, l; + if (a === "NDHWC") + l = "channelsLast", c = [i, p, u, r[4], r[4]]; + else if (a === "NCDHW") + l = "channelsFirst", c = [i, p, u, r[1], r[1]]; + else + throw new Error(`Unknown dataFormat ${a}`); + return Zv(r, c, t10, o, n, false, l, s); +} +function uu(r, e, t10, o, n, s, a = false, i = "channelsLast") { + let [p, u, c, l] = [-1, -1, -1, -1]; + if (i === "channelsLast") + [p, u, c, l] = r; + else if (i === "channelsFirst") + [p, l, u, c] = r; + else + throw new Error(`Unknown dataFormat ${i}`); + let [m, f, , d] = e, [h, g] = lf(t10), [y, b] = lf(o), C = Up(m, y), w = Up(f, b), { padInfo: k, outHeight: _, outWidth: E } = yU(n, u, c, h, g, C, w, s, i), R = a ? d * l : d, A; + return i === "channelsFirst" ? A = [p, R, _, E] : i === "channelsLast" && (A = [p, _, E, R]), { batchSize: p, dataFormat: i, inHeight: u, inWidth: c, inChannels: l, outHeight: _, outWidth: E, outChannels: R, padInfo: k, strideHeight: h, strideWidth: g, filterHeight: m, filterWidth: f, effectiveFilterHeight: C, effectiveFilterWidth: w, dilationHeight: y, dilationWidth: b, inShape: r, outShape: A, filterShape: e }; +} +function Zv(r, e, t10, o, n, s = false, a = "channelsLast", i) { + let [p, u, c, l, m] = [-1, -1, -1, -1, -1]; + if (a === "channelsLast") + [p, u, c, l, m] = r; + else if (a === "channelsFirst") + [p, m, u, c, l] = r; + else + throw new Error(`Unknown dataFormat ${a}`); + let [f, d, h, , g] = e, [y, b, C] = cC(t10), [w, k, _] = cC(o), E = Up(f, w), R = Up(d, k), A = Up(h, _), { padInfo: D, outDepth: O, outHeight: M, outWidth: L } = bU(n, u, c, l, y, b, C, E, R, A, i), W = s ? g * m : g, V; + return a === "channelsFirst" ? V = [p, W, O, M, L] : a === "channelsLast" && (V = [p, O, M, L, W]), { batchSize: p, dataFormat: a, inDepth: u, inHeight: c, inWidth: l, inChannels: m, outDepth: O, outHeight: M, outWidth: L, outChannels: W, padInfo: D, strideDepth: y, strideHeight: b, strideWidth: C, filterDepth: f, filterHeight: d, filterWidth: h, effectiveFilterDepth: E, effectiveFilterHeight: R, effectiveFilterWidth: A, dilationDepth: w, dilationHeight: k, dilationWidth: _, inShape: r, outShape: V, filterShape: e }; +} +function gU(r, e, t10, o, n) { + o == null && (o = mC(r, e, t10)); + let s = r[0], a = r[1], i = au((s - e + 2 * o) / t10 + 1, n), p = au((a - e + 2 * o) / t10 + 1, n); + return [i, p]; +} +function xU(r, e, t10, o, n, s) { + n == null && (n = mC(r, e, o)); + let a = r[0], i = r[1], p = r[2], u = au((a - e + 2 * n) / o + 1, s), c = au((i - e + 2 * n) / o + 1, s), l = au((p - e + 2 * n) / o + 1, s); + return [u, c, l, t10]; +} +function mC(r, e, t10, o = 1) { + let n = Up(e, o); + return Math.floor((r[0] * (t10 - 1) - t10 + n) / 2); +} +function lf(r) { + return typeof r == "number" ? [r, r, r] : r.length === 2 ? [r[0], r[1], 1] : r; +} +function cC(r) { + return typeof r == "number" ? [r, r, r] : r; +} +function Up(r, e) { + return e <= 1 ? r : r + (r - 1) * (e - 1); +} +function yU(r, e, t10, o, n, s, a, i, p) { + let u, c, l; + if (typeof r == "number") { + u = { top: r, bottom: r, left: r, right: r, type: r === 0 ? "VALID" : "NUMBER" }; + let f = gU([e, t10], s, o, r, i); + c = f[0], l = f[1]; + } else if (r === "same") { + c = Math.ceil(e / o), l = Math.ceil(t10 / n); + let m = Math.max(0, (c - 1) * o + s - e), f = Math.max(0, (l - 1) * n + a - t10), d = Math.floor(m / 2), h = m - d, g = Math.floor(f / 2), y = f - g; + u = { top: d, bottom: h, left: g, right: y, type: "SAME" }; + } else if (r === "valid") + u = { top: 0, bottom: 0, left: 0, right: 0, type: "VALID" }, c = Math.ceil((e - s + 1) / o), l = Math.ceil((t10 - a + 1) / n); + else if (typeof r == "object") { + let m = p === "channelsLast" ? r[1][0] : r[2][0], f = p === "channelsLast" ? r[1][1] : r[2][1], d = p === "channelsLast" ? r[2][0] : r[3][0], h = p === "channelsLast" ? r[2][1] : r[3][1]; + u = { top: m, bottom: f, left: d, right: h, type: m === 0 && f === 0 && d === 0 && h === 0 ? "VALID" : "EXPLICIT" }, c = au((e - s + m + f) / o + 1, i), l = au((t10 - a + d + h) / n + 1, i); + } else + throw Error(`Unknown padding parameter: ${r}`); + return { padInfo: u, outHeight: c, outWidth: l }; +} +function bU(r, e, t10, o, n, s, a, i, p, u, c) { + let l, m, f, d; + if (typeof r == "number") { + l = { top: r, bottom: r, left: r, right: r, front: r, back: r, type: r === 0 ? "VALID" : "NUMBER" }; + let g = xU([e, t10, o, 1], i, 1, n, r, c); + m = g[0], f = g[1], d = g[2]; + } else if (r === "same") { + m = Math.ceil(e / n), f = Math.ceil(t10 / s), d = Math.ceil(o / a); + let h = (m - 1) * n + i - e, g = (f - 1) * s + p - t10, y = (d - 1) * a + u - o, b = Math.floor(h / 2), C = h - b, w = Math.floor(g / 2), k = g - w, _ = Math.floor(y / 2), E = y - _; + l = { top: w, bottom: k, left: _, right: E, front: b, back: C, type: "SAME" }; + } else if (r === "valid") + l = { top: 0, bottom: 0, left: 0, right: 0, front: 0, back: 0, type: "VALID" }, m = Math.ceil((e - i + 1) / n), f = Math.ceil((t10 - p + 1) / s), d = Math.ceil((o - u + 1) / a); + else + throw Error(`Unknown padding parameter: ${r}`); + return { padInfo: l, outDepth: m, outHeight: f, outWidth: d }; +} +function au(r, e) { + if (!e) + return Math.trunc(r); + switch (e) { + case "round": + return Math.round(r); + case "ceil": + return Math.ceil(r); + case "floor": + return Math.floor(r); + default: + throw new Error(`Unknown roundingMode ${e}`); + } +} +function iu(r) { + let [e, t10, o] = lf(r); + return e === 1 && t10 === 1 && o === 1; +} +function lr(r, e) { + return iu(r) || iu(e); +} +function Jv(r) { + if (r === "NHWC") + return "channelsLast"; + if (r === "NCHW") + return "channelsFirst"; + throw new Error(`Unknown dataFormat ${r}`); +} +function Ot(r, e, t10) { + if (t10 != null) { + if (typeof e == "string") + throw Error(`Error in ${r}: pad must be an integer when using dimRoundingMode ${t10} but got pad ${e}.`); + if (typeof e == "number") + $(ra(e), () => `Error in ${r}: pad must be an integer when using dimRoundingMode ${t10} but got pad ${e}.`); + else if (typeof e == "object") + e.forEach((o) => { + o.forEach((n) => { + $(ra(n), () => `Error in ${r}: pad must be an integer when using dimRoundingMode ${t10} but got pad ${n}.`); + }); + }); + else + throw Error(`Error in ${r}: Unknown padding parameter: ${e}`); + } +} +function CU(r, e) { + let o = { x: v(r, "x", "reshape", "string_or_numeric") }, n = { shape: e }; + return N.runKernel(Ss, o, n); +} +var z = T({ reshape_: CU }); +function IU(r, e, t10, o, n) { + let s = v(r, "x", "avgPool", "float32"), a = 1; + $(lr(t10, a), () => `Error in avgPool: Either strides or dilations must be 1. Got strides ${t10} and dilations '${a}'`); + let i = s, p = false; + s.rank === 3 && (p = true, i = z(s, [1, s.shape[0], s.shape[1], s.shape[2]])), $(i.rank === 4, () => `Error in avgPool: x must be rank 4 but got rank ${i.rank}.`), Ot("avgPool", o, n); + let u = { x: i }, c = { filterSize: e, strides: t10, pad: o, dimRoundingMode: n }, l = N.runKernel(pn, u, c); + return l = qe(l, s.dtype), p ? z(l, [l.shape[1], l.shape[2], l.shape[3]]) : l; +} +var mf = T({ avgPool_: IU }); +function wU(r, e, t10, o, n, s = "NDHWC") { + let a = v(r, "x", "avgPool3d", "float32"), i = a, p = false; + a.rank === 4 && (p = true, i = z(a, [1, a.shape[0], a.shape[1], a.shape[2], a.shape[3]])), $(i.rank === 5, () => `Error in avgPool3d: x must be rank 5 but got rank ${i.rank}.`), $(s === "NDHWC", () => `Error in avgPool3d: Only NDHWC is currently supported, but got dataFormat of ${s}`), Ot("avgPool3d", o, n); + let u = { x: i }, c = { filterSize: e, strides: t10, pad: o, dimRoundingMode: n, dataFormat: s }, l = N.runKernel(ip, u, c); + return l = qe(l, i.dtype), p ? z(l, [l.shape[1], l.shape[2], l.shape[3], l.shape[4]]) : l; +} +var ek = T({ avgPool3d_: wU }); +function SU(r, e = 0) { + $(r.length >= 1, () => "Pass at least one tensor to concat"); + let t10 = Ia(r, "tensors", "concat", "string_or_numeric"); + if (t10[0].dtype === "complex64" && t10.forEach((s) => { + if (s.dtype !== "complex64") + throw new Error(`Cannot concatenate complex64 tensors with a tensor + with dtype ${s.dtype}. `); + }), t10.length === 1) + return zr(t10[0]); + let o = t10, n = { axis: e }; + return N.runKernel(gs, o, n); +} +var gt = T({ concat_: SU }); +function vU(r) { + let t10 = { x: v(r, "x", "sigmoid", "float32") }; + return N.runKernel(yo, t10); +} +var Ms = T({ sigmoid_: vU }); +function kU(r, e, t10) { + let o = v(r, "x", "slice", "string_or_numeric"); + if (o.rank === 0) + throw new Error("Slicing scalar is not possible"); + let n = { x: o }, s = { begin: e, size: t10 }; + return N.runKernel(qn, n, s); +} +var Ue = T({ slice_: kU }); +function TU(r) { + let t10 = { x: v(r, "x", "tanh", "float32") }; + return N.runKernel(Qn, t10); +} +var ml = T({ tanh_: TU }); +function NU(r, e, t10, o, n, s) { + let a = v(r, "forgetBias", "basicLSTMCell"), i = v(e, "lstmKernel", "basicLSTMCell"), p = v(t10, "lstmBias", "basicLSTMCell"), u = v(o, "data", "basicLSTMCell"), c = v(n, "c", "basicLSTMCell"), l = v(s, "h", "basicLSTMCell"), m = gt([u, l], 1), f = Xe(m, i), d = ge(f, p), h = d.shape[0], g = d.shape[1] / 4, y = [h, g], b = Ue(d, [0, 0], y), C = Ue(d, [0, g], y), w = Ue(d, [0, g * 2], y), k = Ue(d, [0, g * 3], y), _ = ge(oe(Ms(b), ml(C)), oe(c, Ms(ge(a, w)))), E = oe(ml(_), Ms(k)); + return [_, E]; +} +var tk = T({ basicLSTMCell_: NU }); +function _U(r, e, t10) { + let o = v(r, "x", "batchToSpaceND"), n = e.reduce((i, p) => i * p); + $(o.rank >= 1 + e.length, () => `input rank is ${o.rank} but should be > than blockShape.length ${e.length}`), $(t10.length === e.length, () => `crops.length is ${t10.length} but should be equal to blockShape.length ${e.length}`), $(o.shape[0] % n === 0, () => `input tensor batch is ${o.shape[0]} but is not divisible by the product of the elements of blockShape ${e.join(" * ")} === ${n}`); + let s = { x: o }, a = { blockShape: e, crops: t10 }; + return N.runKernel(hs, s, a); +} +var ff = T({ batchToSpaceND_: _U }); +function rk(r) { + let e; + return r.rank === 0 || r.rank === 1 ? e = z(r, [1, 1, 1, r.size]) : r.rank === 2 ? e = z(r, [1, 1, r.shape[0], r.shape[1]]) : r.rank === 3 ? e = z(r, [1, r.shape[0], r.shape[1], r.shape[2]]) : e = r, e; +} +function EU(r, e, t10, o, n, s) { + s == null && (s = 1e-3); + let a = v(r, "x", "batchNorm"), i = v(e, "mean", "batchNorm"), p = v(t10, "variance", "batchNorm"), u; + n != null && (u = v(n, "scale", "batchNorm")); + let c; + o != null && (c = v(o, "offset", "batchNorm")), $(i.rank === p.rank, () => "Batch normalization gradient requires mean and variance to have equal ranks."), $(c == null || i.rank === c.rank, () => "Batch normalization gradient requires mean and offset to have equal ranks."), $(u == null || i.rank === u.rank, () => "Batch normalization gradient requires mean and scale to have equal ranks."); + let m = { x: rk(a), scale: u, offset: c, mean: i, variance: p }, f = { varianceEpsilon: s }, d = N.runKernel(kn, m, f); + return z(d, a.shape); +} +var li = T({ batchNorm_: EU }); +function $U(r, e, t10, o, n, s) { + let a = v(r, "x", "batchNorm"), i = v(e, "mean", "batchNorm"), p = v(t10, "variance", "batchNorm"), u; + n != null && (u = v(n, "scale", "batchNorm")); + let c; + return o != null && (c = v(o, "offset", "batchNorm")), $(a.rank === 2, () => `Error in batchNorm2D: x must be rank 2 but got rank ${a.rank}.`), $(i.rank === 2 || i.rank === 1, () => `Error in batchNorm2D: mean must be rank 2 or rank 1 but got rank ${i.rank}.`), $(p.rank === 2 || p.rank === 1, () => `Error in batchNorm2D: variance must be rank 2 or rank 1 but got rank ${p.rank}.`), u != null && $(u.rank === 2 || u.rank === 1, () => `Error in batchNorm2D: scale must be rank 2 or rank 1 but got rank ${u.rank}.`), c != null && $(c.rank === 2 || c.rank === 1, () => `Error in batchNorm2D: offset must be rank 2 or rank 1 but got rank ${c.rank}.`), li(a, i, p, c, u, s); +} +var ok = T({ batchNorm2d_: $U }); +function RU(r, e, t10, o, n, s) { + let a = v(r, "x", "batchNorm"), i = v(e, "mean", "batchNorm"), p = v(t10, "variance", "batchNorm"), u; + n != null && (u = v(n, "scale", "batchNorm")); + let c; + return o != null && (c = v(o, "offset", "batchNorm")), $(a.rank === 3, () => `Error in batchNorm3D: x must be rank 3 but got rank ${a.rank}.`), $(i.rank === 3 || i.rank === 1, () => `Error in batchNorm3D: mean must be rank 3 or rank 1 but got rank ${i.rank}.`), $(p.rank === 3 || p.rank === 1, () => `Error in batchNorm3D: variance must be rank 3 or rank 1 but got rank ${p.rank}.`), u != null && $(u.rank === 3 || u.rank === 1, () => `Error in batchNorm3D: scale must be rank 3 or rank 1 but got rank ${u.rank}.`), c != null && $(c.rank === 3 || c.rank === 1, () => `Error in batchNorm3D: offset must be rank 3 or rank 1 but got rank ${c.rank}.`), li(a, i, p, c, u, s); +} +var nk = T({ batchNorm3d_: RU }); +function AU(r, e, t10, o, n, s) { + let a = v(r, "x", "batchNorm"), i = v(e, "mean", "batchNorm"), p = v(t10, "variance", "batchNorm"), u; + n != null && (u = v(n, "scale", "batchNorm")); + let c; + return o != null && (c = v(o, "offset", "batchNorm")), $(a.rank === 4, () => `Error in batchNorm4D: x must be rank 4 but got rank ${a.rank}.`), $(i.rank === 4 || i.rank === 1, () => `Error in batchNorm4D: mean must be rank 4 or rank 1 but got rank ${i.rank}.`), $(p.rank === 4 || p.rank === 1, () => `Error in batchNorm4D: variance must be rank 4 or rank 1 but got rank ${p.rank}.`), u != null && $(u.rank === 4 || u.rank === 1, () => `Error in batchNorm4D: scale must be rank 4 or rank 1 but got rank ${u.rank}.`), c != null && $(c.rank === 4 || c.rank === 1, () => `Error in batchNorm4D: offset must be rank 4 or rank 1 but got rank ${c.rank}.`), li(a, i, p, c, u, s); +} +var sk = T({ batchNorm4d_: AU }); +function FU(r, e, t10) { + let o = v(r, "x", "bincount"), n = v(e, "weights", "bincount"); + $(o.dtype === "int32", () => `Error in bincount: input dtype must be int32, but got ${o.dtype}`), $(t10 >= 0, () => `size must be non-negative, but got ${t10}.`), $(n.size === o.size || n.size === 0, () => `Error in bincount: weights must have the same size as input or0-length, but got input shape: ${o.shape}, weights shape: ${n.shape}.`); + let s = { x: o, weights: n }, a = { size: t10 }; + return N.runKernel(up, s, a); +} +var df = T({ bincount_: FU }); +function DU(r, e) { + let t10 = v(r, "s0", "broadcastArgs", "int32"), o = v(e, "s1", "broadcastArgs", "int32"); + if (t10.rank !== 1) + throw new Error(`broadcastArgs(): first input must be a vector (rank=1). Has rank ${t10.rank}`); + if (o.rank !== 1) + throw new Error(`broadcastArgs(): second input must be a vector (rank=1). Has rank ${o.rank}`); + let n = { s0: t10, s1: o }; + return N.runKernel(pp, n); +} +var ak = T({ broadcastArgs_: DU }); +function PU(r, e) { + let t10 = v(r, "broadcastTo", "x"), o = t10.shape; + if (e.some((u) => !(u > 0) || u % 1 !== 0)) + throw new Error(`broadcastTo(): Invalid broadcast shape [${e}].`); + if (e.length < t10.rank) + throw new Error(`broadcastTo(): shape.length=${e.length} < input.rank=${t10.rank}.`); + if (e.length > t10.rank) { + let u = t10.shape.slice(); + for (; u.length < e.length; ) + u.unshift(1); + t10 = z(t10, u); + } + let n = t10.shape, s = Array.from(e); + for (let u = e.length - 1; u >= 0; u--) + if (n[u] === e[u]) + s[u] = 1; + else if (t10.shape[u] !== 1) + throw new Error(`broadcastTo(): [${o}] cannot be broadcast to [${e}].`); + if (s.map((u, c) => u > 1 ? c : -1).filter((u) => u >= 0).length === 0) + return zr(t10); + let i = { x: t10 }, p = { reps: s }; + return N.runKernel(wo, i, p); +} +var Ls = T({ broadcastTo_: PU }); +function OU(r) { + let t10 = { x: v(r, "x", "ceil", "float32") }; + return N.runKernel(ro, t10); +} +var ik = T({ ceil_: OU }); +function Bs(r, e, t10) { + let o = { shape: r, value: e, dtype: t10 }; + return N.runKernel(ys, {}, o); +} +function MU(r, e, t10) { + let o = v(r, "x", "clipByValue"); + if ($(e <= t10, () => `Error in clip: min (${e}) must be less than or equal to max (${t10}).`), e === t10) + return Bs(o.shape, e, o.dtype); + let n = { x: o }, s = { clipValueMin: e, clipValueMax: t10 }; + return N.runKernel(Ro, n, s); +} +var uk = T({ clipByValue_: MU }); +function LU(r) { + return gt(r, 0); +} +var pk = T({ concat1d_: LU }); +function BU(r, e) { + return gt(r, e); +} +var ck = T({ concat2d_: BU }); +function VU(r, e) { + return gt(r, e); +} +var lk = T({ concat3d_: VU }); +function zU(r, e) { + return gt(r, e); +} +var mk = T({ concat4d_: zU }); +function WU(r, e, t10, o, n = "NHWC", s = [1, 1], a) { + let i = v(r, "x", "conv2d", "float32"), p = v(e, "filter", "conv2d", "float32"), u = i, c = false; + i.rank === 3 && (c = true, u = z(i, [1, i.shape[0], i.shape[1], i.shape[2]])), $(u.rank === 4, () => `Error in conv2d: input must be rank 4, but got rank ${u.rank}.`), $(p.rank === 4, () => `Error in conv2d: filter must be rank 4, but got rank ${p.rank}.`), Ot("conv2d", o, a); + let l = n === "NHWC" ? u.shape[3] : u.shape[1]; + $(l === p.shape[2], () => `Error in conv2d: depth of input (${l}) must match input depth for filter ${p.shape[2]}.`), $(lr(t10, s), () => `Error in conv2D: Either strides or dilations must be 1. Got strides ${t10} and dilations '${s}'`); + let m = { x: u, filter: p }, f = { strides: t10, pad: o, dataFormat: n, dilations: s, dimRoundingMode: a }, d = N.runKernel(ln, m, f); + return c ? z(d, [d.shape[1], d.shape[2], d.shape[3]]) : d; +} +var mi = T({ conv2d_: WU }); +function UU(r, e, t10, o, n = "NWC", s = 1, a) { + let i = v(r, "x", "conv1d"), p = v(e, "filter", "conv1d"), u = i, c = false; + i.rank === 2 && (c = true, u = z(i, [1, i.shape[0], i.shape[1]])), $(u.rank === 3, () => `Error in conv1d: input must be rank 3, but got rank ${u.rank}.`), $(p.rank === 3, () => `Error in conv1d: filter must be rank 3, but got rank ${p.rank}.`), Ot("conv1d", o, a), $(u.shape[2] === p.shape[1], () => `Error in conv1d: depth of input (${u.shape[2]}) must match input depth for filter ${p.shape[1]}.`), $(lr(t10, s), () => `Error in conv1D: Either stride or dilation must be 1. Got stride ${t10} and dilation '${s}'`), $(n === "NWC", () => `Error in conv1d: got dataFormat of ${n} but only NWC is currently supported.`); + let l = z(p, [1, p.shape[0], p.shape[1], p.shape[2]]), m = z(u, [u.shape[0], 1, u.shape[1], u.shape[2]]), g = mi(m, l, [1, t10], o, "NHWC", [1, s], a); + return c ? z(g, [g.shape[2], g.shape[3]]) : z(g, [g.shape[0], g.shape[2], g.shape[3]]); +} +var fk = T({ conv1d_: UU }); +function GU(r, e, t10, o, n, s = "NHWC", a) { + $(r.length === e.rank, () => `Length of inShape (${r.length}) and rank of dy (${e.rank}) must match`); + let i = r, p = e, u = false; + e.rank === 3 && (u = true, p = z(e, [1, e.shape[0], e.shape[1], e.shape[2]]), i = [1, r[0], r[1], r[2]]), $(i.length === 4, () => `Error in conv2dDerInput: inShape must be length 4, but got length ${i.length}.`), $(p.rank === 4, () => `Error in conv2dDerInput: dy must be rank 4, but got rank ${p.rank}`), $(t10.rank === 4, () => `Error in conv2dDerInput: filter must be rank 4, but got rank ${t10.rank}`); + let c = s === "NHWC" ? i[3] : i[1], l = s === "NHWC" ? p.shape[3] : p.shape[1]; + $(c === t10.shape[2], () => `Error in conv2dDerInput: depth of input (${c}) must match input depth for filter ${t10.shape[2]}.`), $(l === t10.shape[3], () => `Error in conv2dDerInput: depth of output (${l}) must match output depth for filter ${t10.shape[3]}.`), Ot("conv2dDerInput", n, a); + let m = { dy: p, filter: t10 }, f = { strides: o, pad: n, dataFormat: s, dimRoundingMode: a, inputShape: i }, d = N.runKernel(mn, m, f); + return u ? z(d, [d.shape[1], d.shape[2], d.shape[3]]) : d; +} +var hf = T({ conv2DBackpropInput_: GU }); +function HU(r, e, t10, o, n, s) { + let a = v(r, "x", "conv2dTranspose"), i = v(e, "filter", "conv2dTranspose"); + return hf(t10, a, i, o, n, "NHWC", s); +} +var dk = T({ conv2dTranspose_: HU }); +function qU(r, e, t10, o, n = "NDHWC", s = [1, 1, 1]) { + let a = v(r, "x", "conv3d"), i = v(e, "filter", "conv3d"), p = a, u = false; + a.rank === 4 && (u = true, p = z(a, [1, a.shape[0], a.shape[1], a.shape[2], a.shape[3]])), $(p.rank === 5, () => `Error in conv3d: input must be rank 5, but got rank ${p.rank}.`), $(i.rank === 5, () => `Error in conv3d: filter must be rank 5, but got rank ${i.rank}.`), $(p.shape[4] === i.shape[3], () => `Error in conv3d: depth of input (${p.shape[4]}) must match input depth for filter ${i.shape[3]}.`), $(lr(t10, s), () => `Error in conv3D: Either strides or dilations must be 1. Got strides ${t10} and dilations '${s}'`), $(n === "NDHWC", () => `Error in conv3d: got dataFormat of ${n} but only NDHWC is currently supported.`); + let c = { x: p, filter: i }, l = { strides: t10, pad: o, dataFormat: n, dilations: s }, m = N.runKernel(mp, c, l); + return u ? z(m, [m.shape[1], m.shape[2], m.shape[3], m.shape[4]]) : m; +} +var hk = T({ conv3d_: qU }); +function KU(r, e, t10, o, n) { + $(r.length === e.rank, () => `Length of inShape (${r.length}) and rank of dy (${e.rank}) must match`); + let s = r, a = e, i = false; + e.rank === 4 && (i = true, a = z(e, [1, e.shape[0], e.shape[1], e.shape[2], e.shape[3]]), s = [1, r[0], r[1], r[2], r[3]]); + let p = s[4], u = a.shape[4]; + $(s.length === 5, () => `Error in conv3dDerInput: inShape must be length 5, but got length ${s.length}.`), $(a.rank === 5, () => `Error in conv3dDerInput: dy must be rank 5, but got rank ${a.rank}`), $(t10.rank === 5, () => `Error in conv3dDerInput: filter must be rank 5, but got rank ${t10.rank}`), $(p === t10.shape[3], () => `Error in conv3dDerInput: depth of input (${p}) must match input depth for filter ${t10.shape[3]}.`), $(u === t10.shape[4], () => `Error in conv3dDerInput: depth of output (${u}) must match output depth for filter ${t10.shape[4]}.`); + let c = { dy: a, filter: t10 }, l = { pad: n, strides: o, inputShape: s }, m = N.runKernel(fp, c, l); + return i ? z(m, [m.shape[1], m.shape[2], m.shape[3], m.shape[4]]) : m; +} +var gk = T({ conv3DBackpropInput_: KU }); +function jU(r, e, t10, o, n) { + let s = v(r, "x", "conv3dTranspose"), a = v(e, "filter", "conv3dTranspose"); + return gk(t10, s, a, o, n); +} +var xk = T({ conv3dTranspose_: jU }); +function XU(r) { + let t10 = { x: v(r, "x", "cos", "float32") }; + return N.runKernel(fn, t10); +} +var yk = T({ cos_: XU }); +function YU(r) { + let t10 = { x: v(r, "x", "cosh", "float32") }; + return N.runKernel(dn, t10); +} +var bk = T({ cosh_: YU }); +function QU(r, e = 0, t10 = false, o = false) { + let s = { x: v(r, "x", "cumprod") }, a = { axis: e, exclusive: t10, reverse: o }; + return N.runKernel(hn, s, a); +} +var Ck = T({ cumprod_: QU }); +function ZU(r, e = 0, t10 = false, o = false) { + let s = { x: v(r, "x", "cumsum") }, a = { axis: e, exclusive: t10, reverse: o }; + return N.runKernel(gn, s, a); +} +var Ik = T({ cumsum_: ZU }); +function JU(r, e, t10, o = false) { + let n = v(r, "x", "denseBincount"), s = v(e, "weights", "denseBincount"); + $(n.dtype === "int32", () => `Error in denseBincount: input dtype must be int32, but got ${n.dtype}`), $(n.rank <= 2, () => `Error in denseBincount: input must be at most rank 2, but got rank ${n.rank}.`), $(t10 >= 0, () => `size must be non-negative, but got ${t10}.`), $(s.size === n.size || s.size === 0, () => `Error in denseBincount: weights must have the same shape as x or 0-length, but got x shape: ${n.shape}, weights shape: ${s.shape}.`); + let a = { x: n, weights: s }, i = { size: t10, binaryOutput: o }; + return N.runKernel(dp, a, i); +} +var wk = T({ denseBincount_: JU }); +function eG(r, e, t10 = "NHWC") { + let o = v(r, "x", "depthToSpace", "float32"), n = t10 === "NHWC" ? o.shape[1] : o.shape[2], s = t10 === "NHWC" ? o.shape[2] : o.shape[3], a = t10 === "NHWC" ? o.shape[3] : o.shape[1]; + $(e > 1, () => `blockSize should be > 1 for depthToSpace, but was: ${e}`), $(n * e >= 0, () => `Negative dimension size caused by overflow when multiplying + ${n} and ${e} for depthToSpace with input shape + ${o.shape}`), $(s * e >= 0, () => `Negative dimension size caused by overflow when multiplying + ${s} and ${e} for depthToSpace with input shape + ${o.shape}`), $(a % (e * e) === 0, () => `Dimension size must be evenly divisible by ${e * e} but is ${a} for depthToSpace with input shape ${o.shape}`); + let i = { x: o }, p = { blockSize: e, dataFormat: t10 }; + return N.runKernel(yn, i, p); +} +var Sk = T({ depthToSpace_: eG }); +function tG(r, e, t10, o, n = "NHWC", s = [1, 1], a) { + let i = v(r, "x", "depthwiseConv2d", "float32"), p = v(e, "filter", "depthwiseConv2d", "float32"), u = i, c = false; + i.rank === 3 && (c = true, u = z(i, [1, i.shape[0], i.shape[1], i.shape[2]])), $(u.rank === 4, () => `Error in depthwiseConv2d: input must be rank 4, but got rank ${u.rank}.`), $(p.rank === 4, () => `Error in depthwiseConv2d: filter must be rank 4, but got rank ${p.rank}.`); + let l = n === "NHWC" ? u.shape[3] : u.shape[1]; + $(l === p.shape[2], () => `Error in depthwiseConv2d: number of input channels (${l}) must match the inChannels dimension in filter ${p.shape[2]}.`), Ot("depthwiseConv2d", o, a); + let m = { x: u, filter: p }, f = { strides: t10, pad: o, dataFormat: n, dilations: s, dimRoundingMode: a }, d = N.runKernel(bn, m, f); + return c ? z(d, [d.shape[1], d.shape[2], d.shape[3]]) : d; +} +var Gp = T({ depthwiseConv2d_: tG }); +function rG(r) { + let t10 = { x: v(r, "x", "diag") }; + return N.runKernel(xp, t10); +} +var vk = T({ diag_: rG }); +function oG(r, e, t10, o, n = [1, 1], s = "NHWC") { + let a = v(r, "x", "dilation2d"), i = v(e, "filter", "dilation2d"); + $(a.rank === 3 || a.rank === 4, () => `Error in dilation2d: input must be rank 3 or 4, but got rank ${a.rank}.`), $(i.rank === 3, () => `Error in dilation2d: filter must be rank 3, but got rank ${i.rank}.`), $(s === "NHWC", () => `Error in dilation2d: Only NHWC is currently supported, but got dataFormat of ${s}`); + let p = a, u = false; + a.rank === 3 && (p = z(a, [1, a.shape[0], a.shape[1], a.shape[2]]), u = true); + let c = { x: p, filter: i }, l = { strides: t10, pad: o, dilations: n }, m = N.runKernel(yp, c, l); + return u ? z(m, [m.shape[1], m.shape[2], m.shape[3]]) : m; +} +var kk = T({ dilation2d_: oG }); +function nG(r, e) { + let t10 = v(r, "a", "equal", "string_or_numeric"), o = v(e, "b", "equal", "string_or_numeric"); + [t10, o] = Re(t10, o), Je(t10.shape, o.shape); + let n = { a: t10, b: o }; + return N.runKernel(oo, n); +} +var gf = T({ equal_: nG }); +function sG(r, e, t10) { + let o = v(e, "a", "where"), n = v(t10, "b", "where"), s = v(r, "condition", "where", "bool"), a = Je(Je(s.shape, o.shape), n.shape), i = Ls(s, a), p = Ls(o, a), u = Ls(n, a), c = { condition: i, t: p, e: u }; + return N.runKernel(vs, c); +} +var os = T({ where_: sG }); +function aG(r) { + let t10 = { x: v(r, "x", "zerosLike") }; + return N.runKernel(Es, t10); +} +var Gt = T({ zerosLike_: aG }); +function iG(r, e) { + let t10 = v(r, "a", "div"), o = v(e, "b", "div"); + [t10, o] = Re(t10, o); + let n = We(t10, o), s = Gt(n), a = gf(o, s); + return os(a, s, n); +} +var Tk = T({ divNoNan_: iG }); +function uG(r, e) { + let t10 = v(r, "t1", "dot"), o = v(e, "t2", "dot"); + $((t10.rank === 1 || t10.rank === 2) && (o.rank === 1 || o.rank === 2), () => `Error in dot: inputs must all be rank 1 or 2, but got ranks ${t10.rank} and ${o.rank}.`); + let n = t10.rank === 1 ? t10.size : t10.shape[1], s = o.rank === 1 ? o.size : o.shape[0]; + if ($(n === s, () => `Error in dot: inner dimensions of inputs must match, but got ${n} and ${s}.`), t10.rank === 1 && o.rank === 1) { + let a = z(t10, [1, -1]), i = z(o, [-1, 1]), p = Xe(a, i); + return z(p, []); + } else if (t10.rank === 1 && o.rank === 2) { + let a = z(t10, [1, -1]), i = z(o, [o.shape[0], o.shape[1]]), p = Xe(a, i); + return z(p, [p.size]); + } else if (t10.rank === 2 && o.rank === 1) { + let a = z(o, [-1, 1]), i = Xe(t10, a); + return z(i, [i.size]); + } else { + let a = z(o, [o.shape[0], o.shape[1]]); + return Xe(t10, a); + } +} +var Nk = T({ dot_: uG }); +function pG(r, ...e) { + let t10 = e.map((n, s) => v(n, `tensors${s}`, "einsum")), o = { equation: r }; + return N.runKernel(Xa, t10, o); +} +var _k = T({ einsum_: pG }); +function cG(r) { + let t10 = { x: v(r, "x", "elu", "float32") }; + return N.runKernel(In, t10); +} +var xf = T({ elu_: cG }); +function lG(r) { + let e = v(r, "x", "erf"); + $(e.dtype === "int32" || e.dtype === "float32", () => "Input dtype must be `int32` or `float32`."), e.dtype === "int32" && (e = qe(e, "float32")); + let t10 = { x: e }; + return N.runKernel(Gi, t10); +} +var Ek = T({ erf_: lG }); +function fC(r, e) { + for (let t10 = 0; t10 < r.length; ++t10) + if (r[r.length - t10 - 1] !== e - 1 - t10) + return false; + return true; +} +function $k(r, e, t10) { + let o = r.length + e.length, n = [], s = 0, a = 0; + for (let i = 0; i < o; i++) + t10.indexOf(i) === -1 ? n.push(r[s++]) : n.push(e[a++]); + return n; +} +function mG(r, e) { + let t10 = [], o = r.length; + for (let s = 0; s < o; s++) + e.indexOf(s) === -1 && t10.push(r[s]); + let n = e.map((s) => r[s]); + return [t10, n]; +} +function Ta(r, e) { + let t10 = e.map((o) => 1); + return $k(r, t10, e); +} +function fG(r, e, t10) { + $(fC(e, t10), () => `${r} supports only inner-most axes for now. Got axes ${e} and rank-${t10} input.`); +} +function dG(r, e) { + if (fC(r, e)) + return null; + let t10 = []; + for (let o = 0; o < e; ++o) + r.indexOf(o) === -1 && t10.push(o); + return r.forEach((o) => t10.push(o)), t10; +} +function hG(r) { + return r.map((e, t10) => [t10, e]).sort((e, t10) => e[1] - t10[1]).map((e) => e[0]); +} +function gG(r, e) { + let t10 = []; + for (let o = e - r; o < e; ++o) + t10.push(o); + return t10; +} +function yG(r, e = null, t10 = false) { + let n = { x: v(r, "x", "max") }, s = { reductionIndices: e, keepDims: t10 }; + return N.runKernel($n, n, s); +} +var Vs = T({ max_: yG }); +function bG(r, e = null, t10 = false) { + let n = { x: v(r, "x", "min") }, s = { axis: e, keepDims: t10 }; + return N.runKernel(Fn, n, s); +} +var fl = T({ min_: bG }); +function CG(r, e) { + let t10 = v(r, "base", "pow"), o = v(e, "exp", "pow"); + [t10, o] = Re(t10, o); + let n = { a: t10, b: o }; + return N.runKernel(Bn, n); +} +var Na = T({ pow_: CG }); +function be(r, e) { + if ((Ut(r) && e !== "string" || Array.isArray(r)) && e !== "complex64") + throw new Error("Error creating a new Scalar: value must be a primitive (number|boolean|string)"); + if (e === "string" && Ut(r) && !(r instanceof Uint8Array)) + throw new Error("When making a scalar from encoded string, the value must be `Uint8Array`."); + return xr(r, [], [], e); +} +function IG(r) { + let t10 = { x: v(r, "x", "sqrt", "float32") }; + return N.runKernel(bo, t10); +} +var Rr = T({ sqrt_: IG }); +function wG(r) { + let e = v(r, "x", "square"), t10 = {}; + return N.runKernel("Square", { x: e }, t10); +} +var Zt = T({ square_: wG }); +function SG(r, e = null, t10 = false) { + let o = v(r, "x", "sum"); + o.dtype === "bool" && (o = qe(o, "int32")); + let n = { x: o }, s = { axis: e, keepDims: t10 }; + return N.runKernel(jn, n, s); +} +var tt = T({ sum_: SG }); +function vG(r, e = "euclidean", t10 = null, o = false) { + r = v(r, "x", "norm"); + let n = Rk(r, e, t10), s = n.shape; + if (o) { + let a = Ka(t10, r.shape); + s = Ta(n.shape, a); + } + return z(n, s); +} +function Rk(r, e, t10 = null) { + if (r.rank === 0) + return Qt(r); + if (r.rank !== 1 && t10 === null) + return Rk(z(r, [-1]), e, t10); + if (r.rank === 1 || typeof t10 == "number" || Array.isArray(t10) && t10.length === 1) { + if (e === 1) + return tt(Qt(r), t10); + if (e === 1 / 0) + return Vs(Qt(r), t10); + if (e === -1 / 0) + return fl(Qt(r), t10); + if (e === "euclidean" || e === 2) + return Rr(tt(Na(Qt(r), be(2, "int32")), t10)); + throw new Error(`Error in norm: invalid ord value: ${e}`); + } + if (Array.isArray(t10) && t10.length === 2) { + if (e === 1) + return Vs(tt(Qt(r), t10[0]), t10[1] - 1); + if (e === 1 / 0) + return Vs(tt(Qt(r), t10[1]), t10[0]); + if (e === -1 / 0) + return fl(tt(Qt(r), t10[1]), t10[0]); + if (e === "fro" || e === "euclidean") + return Rr(tt(Zt(r), t10)); + throw new Error(`Error in norm: invalid ord value: ${e}`); + } + throw new Error(`Error in norm: invalid axis: ${t10}`); +} +var pu = T({ norm_: vG }); +function kG(r, e = null, t10 = false) { + return pu(r, "euclidean", e, t10); +} +var Ak = T({ euclideanNorm_: kG }); +function TG(r) { + let t10 = { x: v(r, "x", "exp") }; + return N.runKernel(no, t10); +} +var Bo = T({ exp_: TG }); +function NG(r, e = 0) { + let t10 = v(r, "x", "expandDims", "string_or_numeric"); + $(e <= t10.rank, () => "Axis must be <= rank of the tensor"); + let o = { input: t10 }, n = { dim: e }; + return N.runKernel(xs, o, n); +} +var _a = T({ expandDims_: NG }); +function _G(r) { + let t10 = { x: v(r, "x", "expm1") }; + return N.runKernel(wn, t10); +} +var Fk = T({ expm1_: _G }); +function EG(r, e) { + let t10 = v(r, "x", "tile", "string_or_numeric"); + $(t10.rank === e.length, () => `Error in transpose: rank of input ${t10.rank} must match length of reps ${e}.`); + let o = { x: t10 }, n = { reps: e }; + return N.runKernel(wo, o, n); +} +var fi = T({ tile_: EG }); +function $G(r, e, t10, o = "float32") { + e == null && (e = r); + let n = ne([r, e], o), s = r <= e ? r : e; + for (let i = 0; i < s; ++i) + n.set(1, i, i); + let a = z(n.toTensor(), [r, e]); + if (t10 == null) + return a; + if (t10.length === 1) + return fi(_a(a, 0), [t10[0], 1, 1]); + if (t10.length === 2) + return fi(_a(_a(a, 0), 0), [t10[0], t10[1], 1, 1]); + if (t10.length === 3) + return fi(_a(_a(_a(a, 0), 0), 0), [t10[0], t10[1], t10[2], 1, 1]); + throw new Error(`eye() currently supports only 1D and 2D batchShapes, but received ${t10.length}D.`); +} +var yf = T({ eye_: $G }); +function RG(r) { + let t10 = { x: v(r, "x", "floor", "float32") }; + return N.runKernel(so, t10); +} +var bf = T({ floor_: RG }); +function AG(r, e, t10 = 0, o = 0) { + let n = v(r, "x", "gather"), s = v(e, "indices", "gather", "int32"), a = { x: n, indices: s }, i = { axis: t10, batchDims: o }; + return N.runKernel(bs, a, i); +} +var Cf = T({ gather_: AG }); +function FG(r, e) { + let t10 = v(r, "a", "greater", "string_or_numeric"), o = v(e, "b", "greater", "string_or_numeric"); + [t10, o] = Re(t10, o), Je(t10.shape, o.shape); + let n = { a: t10, b: o }; + return N.runKernel(ao, n); +} +var cu = T({ greater_: FG }); +function DG(r, e) { + let t10 = v(r, "a", "greaterEqual", "string_or_numeric"), o = v(e, "b", "greaterEqual", "string_or_numeric"); + [t10, o] = Re(t10, o), Je(t10.shape, o.shape); + let n = { a: t10, b: o }; + return N.runKernel(io, n); +} +var If = T({ greaterEqual_: DG }); +function PG(r) { + let t10 = { x: v(r, "x", "isFinite") }; + return N.runKernel(Hi, t10); +} +var Dk = T({ isFinite_: PG }); +function OG(r) { + let t10 = { x: v(r, "x", "isInf") }; + return N.runKernel(qi, t10); +} +var Pk = T({ isInf_: OG }); +function MG(r) { + let t10 = { x: v(r, "x", "isNaN") }; + return N.runKernel(ia, t10); +} +var Ok = T({ isNaN_: MG }); +function LG(r, e = 0.2) { + let o = { x: v(r, "x", "leakyRelu") }, n = { alpha: e }; + return N.runKernel(Nn, o, n); +} +var wf = T({ leakyRelu_: LG }); +function BG(r, e) { + let t10 = v(r, "a", "less", "string_or_numeric"), o = v(e, "b", "less", "string_or_numeric"); + [t10, o] = Re(t10, o), Je(t10.shape, o.shape); + let n = { a: t10, b: o }; + return N.runKernel(po, n); +} +var Mk = T({ less_: BG }); +function VG(r, e) { + let t10 = v(r, "a", "lessEqual", "string_or_numeric"), o = v(e, "b", "lessEqual", "string_or_numeric"); + [t10, o] = Re(t10, o), Je(t10.shape, o.shape); + let n = { a: t10, b: o }; + return N.runKernel(co, n); +} +var Hp = T({ lessEqual_: VG }); +function Lk(r, e, t10) { + if (t10 <= 0) + throw new Error("The number of values should be positive."); + let o = { start: r, stop: e, num: t10 }; + return N.runKernel(Ip, {}, o); +} +function zG(r, e = 5, t10 = 1, o = 1, n = 0.5) { + let s = v(r, "x", "localResponseNormalization"); + $(s.rank === 4 || s.rank === 3, () => `Error in localResponseNormalization: x must be rank 3 or 4 but got + rank ${s.rank}.`), $(ra(e), () => `Error in localResponseNormalization: depthRadius must be an integer but got depthRadius ${e}.`); + let a = s, i = false; + s.rank === 3 && (i = true, a = z(s, [1, s.shape[0], s.shape[1], s.shape[2]])); + let p = { x: a }, u = { depthRadius: e, bias: t10, alpha: o, beta: n }, c = N.runKernel(wp, p, u); + return i ? z(c, [c.shape[1], c.shape[2], c.shape[3]]) : c; +} +var Bk = T({ localResponseNormalization_: zG }); +function WG(r) { + let t10 = { x: v(r, "x", "log", "float32") }; + return N.runKernel(lo, t10); +} +var Ea = T({ log_: WG }); +function UG(r) { + let t10 = { x: v(r, "x", "log1p") }; + return N.runKernel(Ki, t10); +} +var Sf = T({ log1p_: UG }); +function GG(r) { + return $(fs(r), () => "The f passed in grad(f) must be a function"), (e, t10) => { + let o = v(e, "x", "tf.grad", "string_or_numeric"), n = t10 != null ? v(t10, "dy", "tf.grad") : null; + return N.tidy(() => { + let { value: s, grads: a } = N.gradients(() => r(o), [o], n); + return n != null && ht(s.shape, n.shape, "The shape of dy passed in grad(f)(x, dy) must match the shape returned by f(x)"), vf(a), a[0]; + }); + }; +} +function HG(r) { + return $(fs(r), () => "The f passed in grads(f) must be a function"), (e, t10) => { + $(Array.isArray(e), () => "The args passed in grads(f)(args) must be an array of `Tensor`s or `TensorLike`s"); + let o = Ia(e, "args", "tf.grads", "string_or_numeric"), n = t10 != null ? v(t10, "dy", "tf.grads") : null; + return N.tidy(() => { + let { value: s, grads: a } = N.gradients(() => r(...o), o, n); + return n != null && ht(s.shape, n.shape, "The shape of dy passed in grads(f)([x1,...], dy) must match the shape returned by f([x1,...])"), vf(a), a; + }); + }; +} +function qG(r) { + return $(fs(r), () => "The f passed in valueAndGrad(f) must be a function"), (e, t10) => { + $(e instanceof ut, () => "The x passed in valueAndGrad(f)(x) must be a tensor"), $(t10 == null || t10 instanceof ut, () => "The dy passed in valueAndGrad(f)(x, dy) must be a tensor"); + let { grads: o, value: n } = N.gradients(() => r(e), [e], t10); + return vf(o), { grad: o[0], value: n }; + }; +} +function KG(r) { + return $(fs(r), () => "The f passed in valueAndGrads(f) must be a function"), (e, t10) => { + $(Array.isArray(e) && e.every((n) => n instanceof ut), () => "The args passed in valueAndGrads(f)(args) must be array of tensors"), $(t10 == null || t10 instanceof ut, () => "The dy passed in valueAndGrads(f)(args, dy) must be a tensor"); + let o = N.gradients(() => r(...e), e, t10); + return t10 != null && ht(o.value.shape, t10.shape, "The shape of dy passed in valueAndGrads(f)([x1,...], dy) must match the shape returned by f([x1,...])"), vf(o.grads), o; + }; +} +function dC(r, e) { + $(fs(r), () => "The f passed in variableGrads(f) must be a function"), $(e == null || Array.isArray(e) && e.every((u) => u instanceof ba), () => "The varList passed in variableGrads(f, varList) must be an array of variables"); + let t10 = e != null; + if (!t10) { + e = []; + for (let u in N.registeredVariables) + e.push(N.registeredVariables[u]); + } + let o = t10 ? e.filter((u) => !u.trainable) : null, n = e.length; + e = e.filter((u) => u.trainable), $(e.length > 0, () => `variableGrads() expects at least one of the input variables to be trainable, but none of the ${n} variables is trainable.`); + let s = true, { value: a, grads: i } = N.gradients(r, e, null, s); + $(i.some((u) => u != null), () => "Cannot find a connection between any variable and the result of the loss function y=f(x). Please make sure the operations that use variables are inside the function f passed to minimize()."), $(a.rank === 0, () => `The f passed in variableGrads(f) must return a scalar, but it returned a rank-${a.rank} tensor`); + let p = {}; + return e.forEach((u, c) => { + i[c] != null && (p[u.name] = i[c]); + }), o != null && o.forEach((u) => p[u.name] = null), { value: a, grads: p }; +} +function Cr(r) { + return N.customGrad(r); +} +function vf(r) { + if (r.filter((t10) => t10 == 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 jG(r) { + let t10 = { x: v(r, "x", "softplus") }; + return N.runKernel(Qi, t10); +} +var kf = T({ softplus_: jG }); +function XG(r) { + let e = v(r, "x", "logSigmoid"); + return Cr((o) => ({ value: yr(kf(yr(o))), gradFunc: (a) => oe(a, Ms(yr(o))) }))(e); +} +var Vk = T({ logSigmoid_: XG }); +function YG(r, e) { + let t10 = v(r, "a", "sub"), o = v(e, "b", "sub"); + [t10, o] = Re(t10, o); + let n = { a: t10, b: o }; + return N.runKernel(Io, n); +} +var ke = T({ sub_: YG }); +function QG(r, e = -1) { + let t10 = v(r, "logits", "logSoftmax"); + if (e === -1 && (e = t10.rank - 1), e !== t10.rank - 1) + throw Error(`Log Softmax along a non-last dimension is not yet supported. Logits was rank ${t10.rank} and axis was ${e}`); + return Cr((n, s) => { + let i = Vs(n, e, true), p = ke(n, i), u = ke(qe(p, "float32"), Ea(tt(Bo(p), e, true))); + return s([u]), { value: u, gradFunc: (l, m) => { + let [f] = m, d = true, h = Bo(f); + return ke(l, oe(tt(l, e, d), h)); + } }; + })(t10); +} +var zk = T({ logSoftmax_: QG }); +function ZG(r, e = null, t10 = false) { + let o = v(r, "x", "logSumExp"), n = Ka(e, o.shape), s = Vs(o, n, true), a = ke(o, s), i = Bo(a), p = tt(i, n), u = Ea(p), c = ge(z(s, u.shape), u); + if (t10) { + let l = Ta(c.shape, n); + return z(c, l); + } + return c; +} +var Tf = T({ logSumExp_: ZG }); +function JG(r, e) { + let t10 = v(r, "a", "logicalAnd", "bool"), o = v(e, "b", "logicalAnd", "bool"); + Je(t10.shape, o.shape); + let n = { a: t10, b: o }; + return N.runKernel(_n, n); +} +var lu = T({ logicalAnd_: JG }); +function e4(r) { + let t10 = { x: v(r, "x", "logicalNot", "bool") }; + return N.runKernel(En, t10); +} +var Nf = T({ logicalNot_: e4 }); +function t4(r, e) { + let t10 = v(r, "a", "logicalOr", "bool"), o = v(e, "b", "logicalOr", "bool"); + Je(t10.shape, o.shape); + let n = { a: t10, b: o }; + return N.runKernel(ua, n); +} +var _f = T({ logicalOr_: t4 }); +function r4(r, e) { + let t10 = v(r, "a", "logicalXor", "bool"), o = v(e, "b", "logicalXor", "bool"); + return Je(t10.shape, o.shape), lu(_f(r, e), Nf(lu(r, e))); +} +var Wk = T({ logicalXor_: r4 }); +var Ef = 2147483648; +function o4(r, e, t10 = "left") { + let o = v(r, "sortedSequence", "searchSorted"), n = v(e, "values", "searchSorted"), s = o.shape[o.shape.length - 1], a = n.shape[n.shape.length - 1], i = z(o, [-1, s]), p = z(n, [-1, a]); + if (i.rank < 2) + throw new Error("Sorted input argument must be at least 2-dimensional"); + if (i.shape[0] !== p.shape[0]) + throw new Error("Leading dimension of 'sortedSequence' and 'values' must match."); + if (Ve(p.shape) >= Ef) + throw new Error(`values tensor size must less than ${Ef}`); + if (i.shape[1] >= Ef) + throw new Error(`trailing dim_size must less than ${Ef} for int32 output type, was ${i.shape[1]}`); + let u = { sortedSequence: i, values: p }, c = { side: t10 }; + return N.runKernel(Ep, u, c); +} +var dl = T({ searchSorted_: o4 }); +function Uk(r, e) { + return dl(r, e, "left"); +} +function n4(r, e, t10, o, n) { + let s = v(r, "x", "maxPool"), a = 1, i = s, p = false; + s.rank === 3 && (p = true, i = z(s, [1, s.shape[0], s.shape[1], s.shape[2]])), $(i.rank === 4, () => `Error in maxPool: input must be rank 4 but got rank ${i.rank}.`), $(lr(t10, a), () => `Error in maxPool: Either strides or dilations must be 1. Got strides ${t10} and dilations '${a}'`), Ot("maxPool", o, n); + let u = { x: i }, c = { filterSize: e, strides: t10, pad: o, dimRoundingMode: n }, l = N.runKernel(Rn, u, c); + return p ? z(l, [l.shape[1], l.shape[2], l.shape[3]]) : l; +} +var $f = T({ maxPool_: n4 }); +function s4(r, e = [1, 1, 1], t10, o, n, s = "NDHWC") { + let a = v(r, "x", "maxPool3d"), i = a, p = false; + a.rank === 4 && (p = true, i = z(a, [1, a.shape[0], a.shape[1], a.shape[2], a.shape[3]])), $(i.rank === 5, () => `Error in maxPool3d: x must be rank 5 but got rank ${i.rank}.`), $(s === "NDHWC", () => `Error in maxPool3d: Only NDHWC is currently supported, but got dataFormat of ${s}`), Ot("maxPool3d", o, n); + let u = { x: i }, c = { filterSize: e, strides: t10, pad: o, dimRoundingMode: n, dataFormat: s }, l = N.runKernel(Sp, u, c); + return p ? z(l, [l.shape[1], l.shape[2], l.shape[3], l.shape[4]]) : l; +} +var Gk = T({ maxPool3d_: s4 }); +function a4(r, e, t10, o, n = false) { + let a = { x: v(r, "x", "maxPoolWithArgmax") }, i = { filterSize: e, strides: t10, pad: o, includeBatchInIndex: n }, p = N.runKernel(vp, a, i); + return { result: p[0], indexes: p[1] }; +} +var Hk = T({ maxPoolWithArgmax_: a4 }); +function i4(r, e) { + let t10 = v(r, "a", "maximum"), o = v(e, "b", "maximum"); + [t10, o] = Re(t10, o), t10.dtype === "bool" && (t10 = qe(t10, "int32"), o = qe(o, "int32")), Je(t10.shape, o.shape); + let n = { a: t10, b: o }; + return N.runKernel(mo, n); +} +var Rf = T({ maximum_: i4 }); +function u4(r, e = null, t10 = false) { + let n = { x: v(r, "x", "mean") }, s = { axis: e, keepDims: t10 }; + return N.runKernel(An, n, s); +} +var mu = T({ mean_: u4 }); +function Wr(r, e = "float32") { + if (e === "complex64") { + let o = Wr(r, "float32"), n = Wr(r, "float32"); + return Er(o, n); + } + let t10 = ap(Ve(r), e); + return N.makeTensor(t10, r, e); +} +function zs(r, e = "float32") { + if (e === "complex64") { + let o = zs(r, "float32"), n = Wr(r, "float32"); + return Er(o, n); + } + let t10 = jc(Ve(r), e); + return N.makeTensor(t10, r, e); +} +function qk(r, e, { indexing: t10 = "xy" } = {}) { + if (t10 !== "xy" && t10 !== "ij") + throw new TypeError(`${t10} is not a valid third argument to meshgrid`); + if (r === void 0) + return []; + let o = v(r, "x", "meshgrid", r instanceof ut ? r.dtype : "float32"); + if (e === void 0) + return [o]; + let n = v(e, "y", "meshgrid", e instanceof ut ? e.dtype : "float32"), s = Ve(o.shape), a = Ve(n.shape); + return t10 === "xy" ? (o = z(o, [1, -1]), n = z(n, [-1, 1]), [Xe(zs([a, 1], o.dtype), o), Xe(n, zs([1, s], n.dtype))]) : (o = z(o, [-1, 1]), n = z(n, [1, -1]), [Xe(o, zs([1, a], o.dtype)), Xe(zs([s, 1], n.dtype), n)]); +} +function p4(r, e) { + let t10 = v(r, "a", "minimum"), o = v(e, "b", "minimum"); + [t10, o] = Re(t10, o), t10.dtype === "bool" && (t10 = qe(t10, "int32"), o = qe(o, "int32")), Je(t10.shape, o.shape); + let n = { a: t10, b: o }; + return N.runKernel(fo, n); +} +var Af = T({ minimum_: p4 }); +function c4(r, e, t10) { + $(t10 === "reflect" || t10 === "symmetric", () => `Invalid mode. Mode must be either reflect or symmetric. Got ${t10}.`); + let o = v(r, "x", "mirrorPad"); + if (o.rank === 0) + throw new Error("mirrorPad(scalar) is not defined. Pass non-scalar to mirrorPad"); + $(e.length === o.rank, () => `Padding doesn't match input. Must be ${o.rank}. Got ${e.length}.`); + let n = t10 === "reflect" ? 1 : 0; + for (let i = 0; i < o.rank; i++) + $(e[i].length === 2, () => "Invalid number of paddings. Must be length of 2 each."), $(e[i][0] >= 0 && e[i][0] <= o.shape[i] - n && e[i][1] >= 0 && e[i][1] <= o.shape[i] - n, () => `Padding in dimension ${i} cannot be greater than or equal to ${o.shape[i] - n} or less than 0 for input of shape ${o.shape}`); + let s = { paddings: e, mode: t10 }, a = { x: o }; + return N.runKernel(Dn, a, s); +} +var Kk = T({ mirrorPad_: c4 }); +function l4(r, e) { + let t10 = v(r, "a", "mod"), o = v(e, "b", "mod"); + [t10, o] = Re(t10, o); + let n = { a: t10, b: o }; + return N.runKernel(ji, n); +} +var jk = T({ mod_: l4 }); +function m4(r, e = null, t10 = false) { + r = v(r, "x", "moments"); + let o = Ka(e, r.shape), n = mu(r, o, t10), s = n.shape; + t10 || (s = Ta(n.shape, o)); + let a = Zt(ke(qe(r, "float32"), z(n, s))), i = mu(a, o, t10); + return { mean: n, variance: i }; +} +var Xk = T({ moments_: m4 }); +function f4(r, e, t10, o) { + let n = v(e, "data", "multiRNNCell"), s = Ia(t10, "c", "multiRNNCell"), a = Ia(o, "h", "multiRNNCell"), i = n, p = []; + for (let l = 0; l < r.length; l++) { + let m = r[l](i, s[l], a[l]); + p.push(m[0]), p.push(m[1]), i = m[1]; + } + let u = [], c = []; + for (let l = 0; l < p.length; l += 2) + u.push(p[l]), c.push(p[l + 1]); + return [u, c]; +} +var Yk = T({ multiRNNCell_: f4 }); +function d4(r, e, t10, o = false) { + let n = v(r, "logits", "multinomial"), s = n.size, a = n.rank; + if (s < 2) + throw new Error(`Error in multinomial: you need at least 2 outcomes, but got ${s}.`); + if (a > 2) + throw new Error(`Rank of probabilities must be 1 or 2, but is ${a}`); + t10 = t10 || Math.random(); + let p = { logits: a === 1 ? z(n, [1, -1]) : n }, u = { numSamples: e, seed: t10, normalized: o }, c = N.runKernel(kp, p, u); + return a === 1 ? z(c, [c.size]) : c; +} +var Qk = T({ multinomial_: d4 }); +function h4(r, e) { + let t10 = v(r, "a", "notEqual", "string_or_numeric"), o = v(e, "b", "notEqual", "string_or_numeric"); + [t10, o] = Re(t10, o), Je(t10.shape, o.shape); + let n = { a: t10, b: o }; + return N.runKernel(go, n); +} +var Ff = T({ notEqual_: h4 }); +function g4(r) { + let t10 = { x: v(r, "x", "onesLike") }; + return N.runKernel(Cs, t10); +} +var Zk = T({ onesLike_: g4 }); +function x4(r, e) { + let t10 = v(r, "v1", "outerProduct"), o = v(e, "v2", "outerProduct"); + $(t10.rank === 1 && o.rank === 1, () => `Error in outerProduct: inputs must be rank 1, but got ranks ${t10.rank} and ${o.rank}.`); + let n = z(t10, [-1, 1]), s = z(o, [1, -1]); + return Xe(n, s); +} +var Jk = T({ outerProduct_: x4 }); +function y4(r, e, t10 = 0) { + let o = v(r, "x", "pad"); + if (o.rank === 0) + throw new Error("pad(scalar) is not defined. Pass non-scalar to pad"); + let n = { paddings: e, constantValue: t10 }, s = { x: o }; + return N.runKernel(Ln, s, n); +} +var Ws = T({ pad_: y4 }); +function b4(r, e, t10 = 0) { + return $(e.length === 2, () => "Invalid number of paddings. Must be length of 2."), Ws(r, [e], t10); +} +var e1 = T({ pad1d_: b4 }); +function C4(r, e, t10 = 0) { + return $(e.length === 2 && e[0].length === 2 && e[1].length === 2, () => "Invalid number of paddings. Must be length of 2 each."), Ws(r, e, t10); +} +var t1 = T({ pad2d_: C4 }); +function I4(r, e, t10 = 0) { + return $(e.length === 3 && e[0].length === 2 && e[1].length === 2 && e[2].length === 2, () => "Invalid number of paddings. Must be length of 2 each."), Ws(r, e, t10); +} +var r1 = T({ pad3d_: I4 }); +function w4(r, e, t10 = 0) { + return $(e.length === 4 && e[0].length === 2 && e[1].length === 2 && e[2].length === 2 && e[3].length === 2, () => "Invalid number of paddings. Must be length of 2 each."), Ws(r, e, t10); +} +var o1 = T({ pad4d_: w4 }); +function S4(r, e, t10) { + let o = v(r, "x", "spaceToBatchND"); + $(o.rank >= 1 + e.length, () => `input rank ${o.rank} should be > than [blockShape] ${e.length}`), $(t10.length === e.length, () => `paddings.shape[0] ${t10.length} must be equal to [blockShape] ${e.length}`), $(o.shape.reduce((a, i, p) => p > 0 && p <= e.length ? a && (i + t10[p - 1][0] + t10[p - 1][1]) % e[p - 1] === 0 : a, true), () => `input spatial dimensions ${o.shape.slice(1)} with paddings ${t10.toString()} must be divisible by blockShapes ${e.toString()}`); + let n = { x: o }, s = { blockShape: e, paddings: t10 }; + return N.runKernel(ks, n, s); +} +var Df = T({ spaceToBatchND_: S4 }); +function v4(r, e, t10, o, n, s, a) { + n == null && (n = [1, 1]), s == null && (s = 1), o === 0 && (o = "valid"); + let i = v(r, "x", "maxPool"), p = i, u = false; + i.rank === 3 && (u = true, p = z(i, [1, i.shape[0], i.shape[1], i.shape[2]])), $(lr(s, n), () => `Error in pool: Either strides or dilations must be 1. Got strides ${s} and dilations '${n}'`); + let c = lC(p.shape, e, s, n, o), l = [c.dilationHeight, c.dilationWidth], m; + o === "same" ? m = T4([c.filterHeight, c.filterWidth], l) : m = [[0, 0], [0, 0]]; + let f = l[0] === 1 && l[1] === 1, [d, h] = k4([c.inHeight, c.inWidth], l, m), g = f ? o : "valid", y = f ? p : Df(p, l, d), C = (t10 === "avg" ? () => mf(y, e, s, g, a) : () => $f(y, e, s, g, a))(), w = f ? C : ff(C, l, h); + return u ? z(w, [w.shape[1], w.shape[2], w.shape[3]]) : w; +} +function k4(r, e, t10) { + let o = t10.map((c) => c[0]), n = t10.map((c) => c[1]), s = r.concat(o, n), a = e.map((c, l) => (c - s[l] % c) % c), i = n.map((c, l) => c + a[l]), p = e.map((c, l) => [o[l], i[l]]), u = e.map((c, l) => [0, a[l]]); + return [p, u]; +} +function T4(r, e) { + let o = r.map((a, i) => a + (a - 1) * (e[i] - 1)).map((a) => a - 1), n = o.map((a) => Math.floor(a / 2)), s = o.map((a, i) => a - n[i]); + return o.map((a, i) => [n[i], s[i]]); +} +var n1 = T({ pool_: v4 }); +function N4(r, e) { + let t10 = v(r, "x", "prelu"), o = v(e, "alpha", "prelu"), n = { x: t10, alpha: o }; + return N.runKernel(Vn, n); +} +var Pf = T({ prelu_: N4 }); +function _4(r, e = null, t10 = false) { + let o = v(r, "x", "prod"); + o.dtype === "bool" && (o = qe(o, "int32")); + let n = { x: o }, s = { axis: e, keepDims: t10 }; + return N.runKernel(Ao, n, s); +} +var s1 = T({ prod_: _4 }); +function E4(r, e, t10, o) { + let n = r.map((c, l) => v(c, `tensors${l}`, "raggedGather", "int32")), s = v(e, "paramsDenseValues", "raggedGather"), a = v(t10, "indices", "raggedGather", "int32"), i = { paramsNestedSplits: n, paramsDenseValues: s, indices: a }, p = { outputRaggedRank: o }, u = N.runKernel(Tp, i, p); + return { outputNestedSplits: u.slice(0, u.length - 1), outputDenseValues: u[u.length - 1] }; +} +var a1 = T({ raggedGather_: E4 }); +function $4(r, e, t10) { + let o = v(r, "starts", "raggedRange"), n = v(e, "limits", "raggedRange", o.dtype), s = v(t10, "deltas", "raggedRange", o.dtype), a = { starts: o, limits: n, deltas: s }, i = N.runKernel(Np, a); + return { rtNestedSplits: i[0], rtDenseValues: i[1] }; +} +var i1 = T({ raggedRange_: $4 }); +function R4(r, e, t10, o, n) { + let s = v(r, "shape", "raggedTensorToTensor", "int32"), a = v(e, "values", "raggedTensorToTensor"), i = v(t10, "defaultValue", "raggedTensorToTensor", a.dtype), p = o.map((l, m) => v(l, `tensors${m}`, "raggedTensorToTensor", "int32")), u = { shape: s, values: a, defaultValue: i, rowPartitionTensors: p }, c = { rowPartitionTypes: n }; + return N.runKernel(_p, u, c); +} +var u1 = T({ raggedTensorToTensor_: R4 }); +function A4(r, e, t10) { + let o = Ve(r), n = null; + if (t10 == null || t10 === "float32") + n = new Float32Array(o); + else if (t10 === "int32") + n = new Int32Array(o); + else if (t10 === "bool") + n = new Uint8Array(o); + else + throw new Error(`Unknown data type ${t10}`); + for (let s = 0; s < o; s++) + n[s] = e(); + return N.makeTensor(n, r, t10); +} +var p1 = T({ rand_: A4 }); +var Bf = rp(IC()); +var du = class { + constructor(e, t10, o, n, s) { + this.mean = e, this.stdDev = t10, this.dtype = o, this.nextVal = NaN, this.truncated = n, this.truncated && (this.upper = this.mean + this.stdDev * 2, this.lower = this.mean - this.stdDev * 2); + let a = s || Math.random(); + this.random = Bf.alea(a.toString()); + } + nextValue() { + if (!isNaN(this.nextVal)) { + let n = this.nextVal; + return this.nextVal = NaN, n; + } + let e, t10, o = false; + for (; !o; ) { + let n, s, a; + do + n = 2 * this.random() - 1, s = 2 * this.random() - 1, a = n * n + s * s; + while (a >= 1 || a === 0); + let i = Math.sqrt(-2 * Math.log(a) / a); + e = this.mean + this.stdDev * n * i, t10 = this.mean + this.stdDev * s * i, (!this.truncated || this.isValidTruncated(e)) && (o = true); + } + return (!this.truncated || this.isValidTruncated(t10)) && (this.nextVal = this.convertValue(t10)), 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; + } +}; +var Mf = class { + constructor(e, t10, o, n) { + this.alpha = e, this.beta = 1 / t10, this.dtype = o; + let s = n || Math.random(); + this.randu = Bf.alea(s.toString()), this.randn = new du(0, 1, o, false, 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, t10, o, n, s, a; + for (; ; ) { + do + n = this.randn.nextValue(), a = 1 + this.c * n; + while (a <= 0); + if (a *= a * a, e = n * n, t10 = 1 - 0.331 * e * e, o = 0.5 * e + this.d * (1 - a + Math.log(a)), s = this.randu(), s < t10 || Math.log(s) < o) + break; + } + return a = 1 / this.beta * this.d * a, this.alpha < 1 && (a *= Math.pow(this.randu(), 1 / this.alpha)), this.convertValue(a); + } + convertValue(e) { + return this.dtype === "float32" ? e : Math.round(e); + } +}; +var Lf = class { + constructor(e = 0, t10 = 1, o, n) { + if (this.canReturnFloat = () => this.dtype == null || this.dtype === "float32", this.min = e, this.range = t10 - e, this.dtype = o, n == null && (n = Math.random()), typeof n == "number" && (n = n.toString()), !this.canReturnFloat() && this.range <= 1) + throw new Error(`The difference between ${e} - ${t10} <= 1 and dtype is not float`); + this.random = Bf.alea(n); + } + convertValue(e) { + return this.canReturnFloat() ? e : Math.round(e); + } + nextValue() { + return this.convertValue(this.min + this.range * this.random()); + } +}; +function B4(r, e, t10 = 1, o = "float32", n) { + if (t10 == null && (t10 = 1), o == null && (o = "float32"), o !== "float32" && o !== "int32") + throw new Error(`Unsupported data type ${o}`); + let s = new Mf(e, t10, o, n), a = ne(r, o); + for (let i = 0; i < a.values.length; i++) + a.values[i] = s.nextValue(); + return a.toTensor(); +} +var T1 = T({ randomGamma_: B4 }); +function V4(r, e = 0, t10 = 1, o, n) { + if (o != null && o === "bool") + throw new Error(`Unsupported data type ${o}`); + let s = new du(e, t10, o, false, n), a = ne(r, o); + for (let i = 0; i < a.values.length; i++) + a.values[i] = s.nextValue(); + return a.toTensor(); +} +var Vf = T({ randomNormal_: V4 }); +function z4(r, e, t10) { + if (e != null && e === "bool") + throw new Error(`Unsupported data type ${e}`); + return Vf(r, 0, 1, e, t10); +} +var N1 = T({ randomStandardNormal_: z4 }); +function W4(r, e = 0, t10 = 1, o = "float32", n) { + let s = ne(r, o), a = new Lf(e, t10, null, n); + for (let i = 0; i < s.values.length; i++) + s.values[i] = a.nextValue(); + return s.toTensor(); +} +var zf = T({ randomUniform_: W4 }); +function di(r, e, t10 = 1, o = "float32") { + if (t10 === 0) + throw new Error("Cannot have a step of zero"); + let n = { start: r, stop: e, step: t10, dtype: o }; + return N.runKernel(ws, {}, n); +} +function U4(r) { + let t10 = { x: v(r, "x", "reciprocal") }; + return N.runKernel(ma, t10); +} +var _1 = T({ reciprocal_: U4 }); +function G4(r) { + let t10 = { x: v(r, "x", "relu") }; + return N.runKernel(zn, t10); +} +var hi = T({ relu_: G4 }); +function H4(r) { + let t10 = { x: v(r, "x", "relu6") }; + return N.runKernel(Gn, t10); +} +var Wf = T({ relu6_: H4 }); +function q4(r, e) { + let o = { x: v(r, "x", "reverse") }, n = { dims: e }; + return N.runKernel(fa, o, n); +} +var vo = T({ reverse_: q4 }); +function K4(r) { + let e = v(r, "x", "reverse"); + return $(e.rank === 1, () => `Error in reverse1D: x must be rank 1 but got rank ${e.rank}.`), vo(e, 0); +} +var E1 = T({ reverse1d_: K4 }); +function j4(r, e) { + let t10 = v(r, "x", "reverse"); + return $(t10.rank === 2, () => `Error in reverse2D: x must be rank 2 but got rank ${t10.rank}.`), vo(t10, e); +} +var $1 = T({ reverse2d_: j4 }); +function X4(r, e) { + let t10 = v(r, "x", "reverse"); + return $(t10.rank === 3, () => `Error in reverse3D: x must be rank 3 but got rank ${t10.rank}.`), vo(t10, e); +} +var R1 = T({ reverse3d_: X4 }); +function Y4(r, e) { + let t10 = v(r, "x", "reverse"); + return $(t10.rank === 4, () => `Error in reverse4D: x must be rank 4 but got rank ${t10.rank}.`), vo(t10, e); +} +var A1 = T({ reverse4d_: Y4 }); +function Q4(r) { + let t10 = { x: v(r, "x", "round") }; + return N.runKernel(da, t10); +} +var Uf = T({ round_: Q4 }); +function Z4(r) { + let t10 = { x: v(r, "x", "rsqrt", "float32") }; + return N.runKernel(xo, t10); +} +var F1 = T({ rsqrt_: Z4 }); +function J4(r) { + let t10 = { x: v(r, "x", "selu") }; + return N.runKernel(Xi, t10); +} +var D1 = T({ selu_: J4 }); +function eH(r, e, t10, o, n, s = [1, 1], a = "NHWC") { + let i = v(r, "x", "separableConv2d"), p = v(e, "depthwiseFilter", "separableConv2d"), u = v(t10, "pointwiseFilter", "separableConv2d"), c = i, l = false; + if (i.rank === 3 && (l = true, c = z(i, [1, i.shape[0], i.shape[1], i.shape[2]])), a === "NCHW") + throw new Error("separableConv2d currently does not support dataFormat NCHW; only NHWC is supported"); + $(c.rank === 4, () => `Error in separableConv2d: input must be rank 4, but got rank ${c.rank}.`), $(p.rank === 4, () => `Error in separableConv2d: depthwise filter must be rank 4, but got rank ${p.rank}.`), $(u.rank === 4, () => `Error in separableConv2d: pointwise filter must be rank 4, but got rank ${p.rank}.`), $(u.shape[0] === 1, () => `Error in separableConv2d: the first dimension of pointwise filter must be 1, but got ${u.shape[0]}.`), $(u.shape[1] === 1, () => `Error in separableConv2d: the second dimension of pointwise filter must be 1, but got ${u.shape[1]}.`); + let m = p.shape[2], f = p.shape[3]; + $(u.shape[2] === m * f, () => `Error in separableConv2d: the third dimension of pointwise filter must be ${m * f}, but got ${u.shape[2]}.`); + let d = Gp(c, p, o, n, a, s), g = mi(d, u, 1, "valid", a); + return l ? z(g, [g.shape[1], g.shape[2], g.shape[3]]) : g; +} +var P1 = T({ separableConv2d_: eH }); +async function tH(r, e) { + let t10 = v(r, "x", "setdiff1d"), o = v(e, "y", "setdiff1d"); + $(t10.dtype === o.dtype, () => `x and y should have the same dtype, but got x (${t10.dtype}) and y (${o.dtype}).`), $(t10.rank === 1, () => `x should be 1D tensor, but got x (${t10.shape}).`), $(o.rank === 1, () => `y should be 1D tensor, but got y (${o.shape}).`); + let n = await t10.data(), s = await o.data(), a = new Set(s), i = 0; + for (let c = 0; c < n.length; c++) + a.has(n[c]) || i++; + let p = new je([i], t10.dtype), u = new je([i], "int32"); + for (let c = 0, l = 0; c < n.length; c++) + a.has(n[c]) || (p.values[l] = n[c], u.values[l] = c, l++); + return [p.toTensor(), u.toTensor()]; +} +var O1 = tH; +function rH(r) { + let t10 = { x: v(r, "x", "sign") }; + return N.runKernel(Yi, t10); +} +var M1 = T({ sign_: rH }); +function oH(r) { + let t10 = { x: v(r, "x", "sin", "float32") }; + return N.runKernel(Kn, t10); +} +var L1 = T({ sin_: oH }); +function nH(r) { + let t10 = { x: v(r, "x", "sinh") }; + return N.runKernel(ha, t10); +} +var B1 = T({ sinh_: nH }); +function sH(r, e, t10) { + let o = v(r, "x", "slice1d"); + return $(o.rank === 1, () => `slice1d expects a rank-1 tensor, but got a rank-${o.rank} tensor`), Ue(o, [e], [t10]); +} +var V1 = T({ slice1d_: sH }); +function aH(r, e, t10) { + let o = v(r, "x", "slice2d"); + return $(o.rank === 2, () => `slice2d expects a rank-2 tensor, but got a rank-${o.rank} tensor`), Ue(o, e, t10); +} +var z1 = T({ slice2d_: aH }); +function iH(r, e, t10) { + let o = v(r, "x", "slice3d"); + return $(o.rank === 3, () => `slice3d expects a rank-3 tensor, but got a rank-${o.rank} tensor`), Ue(o, e, t10); +} +var W1 = T({ slice3d_: iH }); +function uH(r, e, t10) { + let o = v(r, "x", "slice4d"); + return $(o.rank === 4, () => `slice4d expects a rank-4 tensor, but got a rank-${o.rank} tensor`), Ue(o, e, t10); +} +var U1 = T({ slice4d_: uH }); +function pH(r, e = -1) { + let t10 = v(r, "logits", "softmax", "float32"); + if (e === -1 && (e = t10.rank - 1), e !== t10.rank - 1) + throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${t10.rank} and dim was ${e}`); + let o = { logits: t10 }, n = { dim: e }; + return N.runKernel(Xn, o, n); +} +var G1 = T({ softmax_: pH }); +function cH(r) { + $(r.dtype === "complex64", () => `The dtype for tf.spectral.fft() must be complex64 but got ${r.dtype}.`); + let e = { input: r }; + return N.runKernel(bp, e); +} +var qp = T({ fft_: cH }); +function lH(r) { + $(r.dtype === "complex64", () => `The dtype for tf.spectral.ifft() must be complex64 but got ${r.dtype}.`); + let e = { input: r }; + return N.runKernel(Cp, e); +} +var hu = T({ ifft_: lH }); +function mH(r) { + let e = r.shape[r.shape.length - 1], t10 = r.size / e, o; + if (e <= 2) { + let n = z(r, [t10, e]); + o = hu(n); + } else { + let n = [t10, 2 * (e - 1)], s = z(ka(r), [t10, e]), a = z(ci(r), [t10, e]), i = vo(Ue(s, [0, 1], [t10, e - 2]), 1), p = oe(vo(Ue(a, [0, 1], [t10, e - 2]), 1), be(-1)), u = gt([s, i], 1), c = gt([a, p], 1), l = z(Er(u, c), [n[0], n[1]]); + o = hu(l); + } + if (o = ka(o), r.rank === 3 && r.shape[0] !== 0) { + let n = o, s = r.shape[0]; + o = z(o, [s, o.shape[0] / s, o.shape[1]]), n.dispose(); + } + return o; +} +var Gf = T({ irfft_: mH }); +function fH(r, e, t10 = 0) { + let n = { x: v(r, "x", "split") }, s = { numOrSizeSplits: e, axis: t10 }; + return N.runKernel(Ts, n, s); +} +var $a = T({ split_: fH }); +function dH(r, e) { + $(r.dtype === "float32", () => `The dtype for rfft() must be real value but got ${r.dtype}`); + let t10 = r.shape[r.shape.length - 1], o = r.size / t10, n; + if (e != null && e < t10) { + let d = r.shape.map((g) => 0), h = r.shape.map((g) => g); + h[r.shape.length - 1] = e, n = Ue(r, d, h), t10 = e; + } else if (e != null && e > t10) { + let d = r.shape.map((h) => h); + d[r.shape.length - 1] = e - t10, n = gt([r, Wr(d)], r.shape.length - 1), t10 = e; + } else + n = r; + let s = Gt(n), a = z(Er(n, s), [o, t10]), i = qp(a), p = Math.floor(t10 / 2) + 1, u = ka(i), c = ci(i), l = $a(u, [p, t10 - p], u.shape.length - 1), m = $a(c, [p, t10 - p], c.shape.length - 1), f = n.shape.slice(); + return f[n.shape.length - 1] = p, z(Er(l[0], m[0]), f); +} +var Kp = T({ rfft_: dH }); +function hH(r, e) { + let t10 = v(r, "a", "squaredDifference"), o = v(e, "b", "squaredDifference"); + [t10, o] = Re(t10, o), Je(t10.shape, o.shape); + let n = { a: t10, b: o }, s = {}; + return N.runKernel(Co, n, s); +} +var Hf = T({ squaredDifference_: hH }); +function gH(r, e) { + let t10 = v(r, "x", "squeeze", "string_or_numeric"); + return z(t10, db(t10.shape, e).newShape); +} +var jp = T({ squeeze_: gH }); +function xH(r, e = 0) { + let t10 = Ia(r, "tensors", "stack", "string_or_numeric"); + $(t10.length >= 1, () => "Pass at least one tensor to tf.stack"), t10.length > 0 && $(e <= t10[0].rank, () => "Axis must be <= rank of the tensor"); + let o = t10, n = { axis: e }; + return N.runKernel(Is, o, n); +} +var Ir = T({ stack_: xH }); +function yH(r, e = 0) { + let o = { x: v(r, "x", "step") }, n = { alpha: e }; + return N.runKernel($s, o, n); +} +var qf = T({ step_: yH }); +function bH(r, e, t10, o, n = 0, s = 0, a = 0, i = 0, p = 0) { + let c = { x: v(r, "x", "stridedSlice", "string_or_numeric") }, l = { begin: e, end: t10, strides: o, beginMask: n, endMask: s, ellipsisMask: a, newAxisMask: i, shrinkAxisMask: p }; + return N.runKernel(Yn, c, l); +} +var H1 = T({ stridedSlice_: bH }); +function CH(r) { + let t10 = { x: v(r, "x", "tan", "float32") }; + return N.runKernel(xa, t10); +} +var q1 = T({ tan_: CH }); +function mr(r, e) { + eo(r); + let t10 = or(r, e); + if (t10.length !== 1) + throw new Error("tensor1d() requires values to be a flat/TypedArray"); + return xr(r, null, t10, e); +} +function gi(r, e, t10) { + if (eo(r), e != null && e.length !== 2) + throw new Error("tensor2d() requires shape to have two numbers"); + let o = or(r, t10); + if (o.length !== 2 && o.length !== 1) + throw new Error("tensor2d() requires values to be number[][] or flat/TypedArray"); + if (o.length === 1 && e == null) + throw new Error("tensor2d() requires shape to be provided when `values` are a flat/TypedArray"); + return xr(r, e, o, t10); +} +function K1(r, e, t10) { + if (eo(r), e != null && e.length !== 4) + throw new Error("tensor4d() requires shape to have four numbers"); + let o = or(r, t10); + if (o.length !== 4 && o.length !== 1) + throw new Error("tensor4d() requires values to be number[][][][] or flat/TypedArray"); + if (o.length === 1 && e == null) + throw new Error("tensor4d() requires shape to be provided when `values` are a flat array"); + return xr(r, e, o, t10); +} +function j1(r, e, t10) { + if (eo(r), e != null && e.length !== 5) + throw new Error("tensor5d() requires shape to have five numbers"); + let o = or(r, t10); + if (o.length !== 5 && o.length !== 1) + throw new Error("tensor5d() requires values to be number[][][][][] or flat/TypedArray"); + if (o.length === 1 && e == null) + throw new Error("tensor5d() requires shape to be provided when `values` are a flat array"); + return xr(r, e, o, t10); +} +function X1(r, e, t10) { + if (eo(r), e != null && e.length !== 6) + throw new Error("tensor6d() requires shape to have six numbers"); + let o = or(r, t10); + if (o.length !== 6 && o.length !== 1) + throw new Error("tensor6d() requires values to be number[][][][][][] or flat/TypedArray"); + if (o.length === 1 && e == null) + throw new Error("tensor6d() requires shape to be provided when `values` are a flat array"); + return e = e || o, xr(r, e, o, t10); +} +function IH(r, e = 1, t10 = true) { + let o = v(r, "x", "topk"); + if (o.rank === 0) + throw new Error("topk() expects the input to be of rank 1 or higher"); + let n = o.shape[o.shape.length - 1]; + if (e < 0) + throw new Error(`'k' passed to topk() must be >= 0 but got ${e}`); + if (e > n) + throw new Error(`'k' passed to topk() must be <= the last dimension (${n}) but got ${e}`); + let s = { x: o }, a = { k: e, sorted: t10 }, [i, p] = N.runKernel(Zn, s, a); + return { values: i, indices: p }; +} +var Y1 = T({ topk_: IH }); +function wH(r, e = 0, t10 = 1, o, n) { + if (o != null && o === "bool") + throw new Error("Unsupported data type $ { dtype }"); + let s = new du(e, t10, o, true, n), a = ne(r, o); + for (let i = 0; i < a.values.length; i++) + a.values[i] = s.nextValue(); + return a.toTensor(); +} +var Q1 = T({ truncatedNormal_: wH }); +function SH(r, e = 0) { + let t10 = v(r, "x", "unique", "string_or_numeric"); + $(t10.rank > 0, () => "The input tensor must be at least 1D"); + let o = { x: t10 }, n = { axis: e }, [s, a] = N.runKernel($p, o, n); + return { values: s, indices: a }; +} +var Z1 = T({ unique_: SH }); +function vH(r, e, t10) { + let o = v(r, "x", "unsortedSegmentSum"), n = v(e, "segmentIds", "unsortedSegmentSum", "int32"); + $(ra(t10), () => "numSegments must be of dtype int"); + let s = { x: o, segmentIds: n }, a = { numSegments: t10 }; + return N.runKernel(Rp, s, a); +} +var J1 = T({ unsortedSegmentSum_: vH }); +function kH(r, e = 0) { + let t10 = v(r, "x", "unstack", "string_or_numeric"); + $(e >= -t10.shape.length && e < t10.shape.length, () => `Axis = ${e} is not in [-${t10.shape.length}, ${t10.shape.length})`); + let o = { value: t10 }, n = { axis: e }; + return N.runKernel(_s, o, n); +} +var ko = T({ unstack_: kH }); +function eT(r, e) { + return dl(r, e, "right"); +} +function tT(r, e = true, t10, o) { + return N.makeVariable(r, e, t10, o); +} +function Kf(r, e) { + let t10 = []; + for (let s = 0; s < e.length; s++) + e[s] && t10.push(s); + let o = ne(r, "int32"), n = ne([t10.length, r.length], "int32"); + for (let s = 0; s < t10.length; s++) { + let a = o.indexToLoc(t10[s]), i = s * r.length; + n.values.set(a, i); + } + return n.toTensor(); +} +async function TH(r) { + let e = v(r, "condition", "whereAsync", "bool"), t10 = await e.data(), o = Kf(e.shape, t10); + return r !== e && e.dispose(), o; +} +var jf = TH; +async function NH(r, e, t10) { + let o = v(r, "tensor", "boolMask"), n = v(e, "mask", "boolMask", "bool"), s = t10 == null ? 0 : t10, a = n.rank, i = o.shape; + $(a > 0, () => "mask cannot be scalar"), ht(i.slice(s, s + a), n.shape, "mask's shape must match the first K dimensions of tensor's shape,"); + let p = 1; + for (let h = s; h < s + a; h++) + p *= i[h]; + let u = i.slice(0, s).concat([p], i.slice(s + a)), c = z(o, u), l = z(n, [-1]), m = await jf(l), f = jp(m, [1]), d = Cf(c, f, s); + return r !== o && o.dispose(), e !== n && n.dispose(), f.dispose(), c.dispose(), l.dispose(), m.dispose(), d; +} +var _H = NH; +function EH(r, e, t10, o, n = true) { + let s = v(r, "v", "movingAverage"), a = v(e, "x", "movingAverage"), i = v(t10, "decay", "movingAverage"); + Lb(s, a), $(Or(s.shape, a.shape), () => "Shape mismatch in v and x"); + let p = be(1), u = ke(p, i), c = oe(ke(a, s), u); + if (n) { + $(o != null, () => "When using zeroDebias: true, step is required."); + let l = v(o, "step", "movingAverage"); + c = We(c, ke(p, Na(i, l))); + } + return ge(s, c); +} +var $H = T({ movingAverage_: EH }); +function RH(r, e, t10) { + let o = v(r, "indices", "scatterND", "int32"), n = v(e, "updates", "scatterND"); + uf(n, o, t10); + let s = { indices: o, updates: n }, a = { shape: t10 }; + return N.runKernel(Hn, s, a); +} +var AH = T({ scatterND_: RH }); +function rT(r, e, t10, o) { + if (r.dtype !== "int32") + throw new Error(`tf.sparseToDense() expects the indices to be int32 type, but the dtype was ${r.dtype}.`); + if (r.rank > 2) + throw new Error(`sparseIndices should be a scalar, vector, or matrix, but got shape ${r.shape}.`); + let n = r.rank > 0 ? r.shape[0] : 1, s = r.rank > 1 ? r.shape[1] : 1; + if (t10.length !== s) + throw new Error(`outputShape has incorrect number of elements:, ${t10.length}, should be: ${s}.`); + let a = e.size; + if (!(e.rank === 0 || e.rank === 1 && a === n)) + throw new Error(`sparseValues has incorrect shape ${e.shape}, should be [] or [${n}]`); + if (e.dtype !== o.dtype) + throw new Error("sparseValues.dtype must match defaultValues.dtype"); +} +function DH(r, e, t10, o = 0) { + let n = v(r, "sparseIndices", "sparseToDense", "int32"), s = v(e, "sparseValues", "sparseToDense", "string_or_numeric"), a = v(o, "defaultValue", "sparseToDense", s.dtype); + rT(n, s, t10, a); + let i = { sparseIndices: n, sparseValues: s, defaultValue: a }, p = { outputShape: t10 }; + return N.runKernel(ei, i, p); +} +var PH = T({ sparseToDense_: DH }); +function OH(r, e) { + let t10 = v(e, "indices", "gatherND", "int32"), n = { params: v(r, "x", "gatherND", "string_or_numeric"), indices: t10 }; + return N.runKernel(Tn, n); +} +var MH = T({ gatherND_: OH }); +function oT(r, e) { + if (e == null) + return r.shape.slice(); + if (Or(r.shape, e)) + return e; + if (r.shape.length === e.length) { + let t10 = []; + for (let o = 0; o < r.shape.length; o++) + e[o] == null && r.shape[o] != null ? t10.push(r.shape[o]) : t10.push(e[o]); + return t10; + } + return e; +} +function LH(r, e, t10, o) { + let n = v(r, "x", "dropout"); + if ($(n.dtype === "float32", () => `x has to be a floating point tensor since it's going to be scaled, but got a ${n.dtype} tensor instead.`), $(e >= 0 && e < 1, () => `rate must be a float in the range [0, 1), but got ${e}.`), e === 0) + return r instanceof ut ? n.clone() : n; + let s = oT(n, t10), a = 1 - e, i = We(bf(ge(zf(s, 0, 1, "float32", o), a)), a); + return oe(n, i); +} +var BH = T({ dropout_: LH }); +function wC(r) { + return Math.floor(Math.pow(2, Math.ceil(Math.log(r) / Math.log(2)))); +} +function hl(r, e, t10) { + let o = 1 - r % 2, n = new Float32Array(r); + for (let s = 0; s < r; ++s) { + let a = 2 * Math.PI * s / (r + o - 1); + n[s] = e - t10 * Math.cos(a); + } + return mr(n, "float32"); +} +async function VH(r, e, t10 = 1) { + let o = v(r, "predictions", "inTopK"), n = v(e, "targets", "inTopK"); + $(o.rank > 1, () => `inTopK() expects the predictions to be of rank 2 or higher, but got ${o.rank}`), $(o.rank - 1 === n.rank, () => `predictions rank should be 1 larger than targets rank, but got predictions rank ${o.rank} and targets rank ${n.rank}`), ht(o.shape.slice(0, o.shape.length - 1), n.shape, "predictions's shape should be align with the targets' shape, except the last dimension."); + let s = o.shape[o.shape.length - 1]; + $(t10 > 0 && t10 <= s, () => `'k' passed to inTopK() must be > 0 && <= the predictions last dimension (${s}), but got ${t10}`); + let a = await o.data(), i = await n.data(), [p, u] = [a.length / s, s], c = hb("bool", p); + for (let l = 0; l < p; l++) { + let m = l * u, f = a.subarray(m, m + u), d = []; + for (let h = 0; h < f.length; h++) + d.push({ value: f[h], index: h }); + d.sort((h, g) => g.value - h.value), c[l] = 0; + for (let h = 0; h < t10; h++) + if (d[h].index === i[l]) { + c[l] = 1; + break; + } + } + return r !== o && o.dispose(), e !== n && n.dispose(), nr(c, n.shape, "bool"); +} +var zH = VH; +var SC = {}; +Be(SC, { conv2d: () => sT, depthwiseConv2d: () => uT, matMul: () => pT }); +function WH(r, e, t10, o, n, s = "NHWC", a) { + let i = r; + r.rank === 3 && (i = z(r, [1, r.shape[0], r.shape[1], r.shape[2]])); + let p = e; + p.rank === 3 && (p = z(e, [1, e.shape[0], e.shape[1], e.shape[2]])), $(i.rank === 4, () => `Error in conv2dDerFilter: input must be rank 4, but got shape ${i.shape}.`), $(p.rank === 4, () => `Error in conv2dDerFilter: dy must be rank 4, but got shape ${p.shape}.`), $(t10.length === 4, () => `Error in conv2dDerFilter: filterShape must be length 4, but got ${t10}.`); + let u = s === "NHWC" ? i.shape[3] : i.shape[1], c = s === "NHWC" ? p.shape[3] : p.shape[1]; + $(u === t10[2], () => `Error in conv2dDerFilter: depth of input ${u}) must match input depth in filter (${t10[2]}.`), $(c === t10[3], () => `Error in conv2dDerFilter: depth of dy (${c}) must match output depth for filter (${t10[3]}).`), Ot("conv2dDerFilter", n, a); + let l = { x: i, dy: p }, m = { strides: o, pad: n, dataFormat: s, dimRoundingMode: a, filterShape: t10 }; + return N.runKernel(lp, l, m); +} +var nT = T({ conv2DBackpropFilter_: WH }); +function gu(r, e, t10) { + if (t10 == null || t10 === "linear") + return r; + if (t10 === "relu") + return oe(r, qf(e)); + throw new Error(`Cannot compute gradient for fused activation ${t10}.`); +} +function xu(r, e) { + let t10 = e, o = nf(r.shape, e.shape); + return o.length > 0 && (t10 = tt(t10, o)), z(t10, r.shape); +} +function yu(r, e, t10, o) { + if (e === "linear") + return r; + if (e === "relu") + return hi(r); + if (e === "elu") + return xf(r); + if (e === "relu6") + return Wf(r); + if (e === "prelu") + return Pf(r, t10); + if (e === "leakyrelu") + return wf(r, o); + if (e === "sigmoid") + return Ms(r); + throw new Error(`Unknown fused activation ${e}.`); +} +var bu = (r, e) => !(r > 0) || e === "linear"; +function UH({ x: r, filter: e, strides: t10, pad: o, dataFormat: n = "NHWC", dilations: s = [1, 1], dimRoundingMode: a, bias: i, activation: p = "linear", preluActivationWeights: u, leakyreluAlpha: c }) { + if (p = p || "linear", bu(N.state.gradientDepth, p) === false) { + $(n === "NHWC", () => `Error in fused conv2d: got dataFormat of ${n} but only NHWC is currently supported for the case of gradient depth is 0 and the activation is not linear.`); + let _ = mi(r, e, t10, o, n, s, a); + return i != null && (_ = ge(_, i)), yu(_, p, u, c); + } + let l = v(r, "x", "conv2d", "float32"), m = v(e, "filter", "conv2d", "float32"), f = l, d = false; + l.rank === 3 && (d = true, f = z(l, [1, l.shape[0], l.shape[1], l.shape[2]])), $(f.rank === 4, () => `Error in fused conv2d: input must be rank 4, but got rank ${f.rank}.`), $(m.rank === 4, () => `Error in fused conv2d: filter must be rank 4, but got rank ${m.rank}.`), Ot("fused conv2d", o, a); + let h = n === "NHWC" ? f.shape[3] : f.shape[1]; + $(m.shape[2] === h, () => `Error in conv2d: depth of input (${h}) must match input depth for filter ${m.shape[2]}.`), $(lr(t10, s), () => `Error in conv2D: Either strides or dilations must be 1. Got strides ${t10} and dilations '${s}'`); + let g = uu(f.shape, m.shape, t10, s, o, a), y; + i != null && (y = v(i, "bias", "fused conv2d"), [y] = Re(y, l), n === "NHWC" ? Je(g.outShape, y.shape) : ($(y.shape.length <= 1, () => `Error in fused conv2d: only supports scalar or 1-D Tensor bias for NCHW format but got the bias of rank-${y.shape.length}.`), $(y.shape.length === 0 || y.shape[0] === g.outChannels || y.shape[0] === 1, () => `Error in fused conv2d: bias shape (${y.shape}) is not compatible with the number of output channels (${g.outChannels})`))); + let b; + if (u != null) { + let _ = u.shape; + if ($(_.length <= 1 || _.length === 3, () => `Error in fused conv2d: only supports scalar, 1-D Tensor or 3-D Tensor PReLU activation weights but got a tensor of rank-${_.length}.`), _.length === 1) + $(_[0] === 1 || _[0] === g.outChannels, () => `Error in fused conv2d: PReLU activation weights (${_}) is not compatible with the number of output channels (${g.outChannels}).`); + else if (_.length === 3) + try { + Je(_, g.outShape); + } catch (E) { + let R = `Error in fused conv2d: PReLU activation weights (${_}) is not compatible with the output shape of the conv2d (${g.outShape}).`; + throw Error(R); + } + b = v(u, "prelu weights", "fused conv2d"); + } + let C = (_, E) => { + $(n === "NHWC", () => `Error in gradient of fused conv2D: got dataFormat of ${n} but only NHWC is currently supported.`); + let [R, A, D, O] = E, M = gu(_, D, p); + $(iu(s), () => `Error in gradient of fused conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${s}'`); + let L = hf(A.shape, M, R, t10, o), W = nT(A, M, R.shape, t10, o), V = [L, W]; + if (O != null) { + let G = xu(O, M); + V.push(G); + } + return V; + }, w = { x: f, filter: m, bias: y, preluActivationWeights: b }, k = { strides: t10, pad: o, dataFormat: n, dilations: s, dimRoundingMode: a, activation: p, leakyreluAlpha: c }; + return i == null ? Cr((E, R, A) => { + let D = N.runKernel(Do, w, k); + return A([R, E, D]), d && (D = z(D, [D.shape[1], D.shape[2], D.shape[3]])), { value: D, gradFunc: C }; + })(f, m) : Cr((E, R, A, D) => { + let O = N.runKernel(Do, w, k); + return D([R, E, O, A]), d && (O = z(O, [O.shape[1], O.shape[2], O.shape[3]])), { value: O, gradFunc: C }; + })(f, m, y); +} +var sT = T({ fusedConv2d_: UH }); +function GH(r, e, t10, o, n, s = [1, 1], a) { + let i = r; + r.rank === 3 && (i = z(r, [1, r.shape[0], r.shape[1], r.shape[2]])); + let p = e; + p.rank === 3 && (p = z(e, [1, e.shape[0], e.shape[1], e.shape[2]])); + let u = { x: i, dy: p }, c = { strides: o, pad: n, dimRoundingMode: a, dilations: s, filterShape: t10 }; + return N.runKernel(hp, u, c); +} +var aT = T({ depthwiseConv2dNativeBackpropFilter_: GH }); +function HH(r, e, t10, o, n, s = [1, 1], a) { + let i = e, p = false; + e.rank === 3 && (p = true, i = z(e, [1, e.shape[0], e.shape[1], e.shape[2]])); + let u = { dy: i, filter: t10 }, c = { strides: o, pad: n, dimRoundingMode: a, dilations: s, inputShape: r }, l = N.runKernel(gp, u, c); + return p ? z(l, [l.shape[1], l.shape[2], l.shape[3]]) : l; +} +var iT = T({ depthwiseConv2dNativeBackpropInput_: HH }); +function qH({ x: r, filter: e, strides: t10, pad: o, dataFormat: n = "NHWC", dilations: s = [1, 1], dimRoundingMode: a, bias: i, activation: p = "linear", preluActivationWeights: u, leakyreluAlpha: c }) { + if (bu(N.state.gradientDepth, p) === false) { + let k = Gp(r, e, t10, o, n, s, a); + return i != null && (k = ge(k, i)), yu(k, p, u, c); + } + let l = v(r, "x", "depthwiseConv2d", "float32"), m = v(e, "filter", "depthwiseConv2d", "float32"), f = l, d = false; + l.rank === 3 && (d = true, f = z(l, [1, l.shape[0], l.shape[1], l.shape[2]])), $(f.rank === 4, () => `Error in fused depthwiseConv2d: input must be rank 4, but got rank ${f.rank}.`), $(m.rank === 4, () => `Error in fused depthwiseConv2d: filter must be rank 4, but got rank ${m.rank}.`), $(f.shape[3] === m.shape[2], () => `Error in fused depthwiseConv2d: number of input channels (${f.shape[3]}) must match the inChannels dimension in filter ${m.shape[2]}.`), s == null && (s = [1, 1]), $(lr(t10, s), () => `Error in fused depthwiseConv2d: Either strides or dilations must be 1. Got strides ${t10} and dilations '${s}'`), Ot("fused depthwiseConv2d", o, a); + let h = uu(f.shape, m.shape, t10, s, o, a, true), g; + i != null && (g = v(i, "bias", "fused conv2d"), [g] = Re(g, l), Je(h.outShape, g.shape)); + let y; + u != null && (y = v(u, "prelu weights", "fused depthwiseConv2d")); + let b = (k, _) => { + $(iu(s), () => `Error in gradient of fused depthwiseConv2d: dilation rates greater than 1 are not yet supported. Got dilations '${s}'`); + let [E, R, A, D] = _, O = gu(k, A, p), M = iT(R.shape, O, E, t10, o, s, a), L = aT(R, O, E.shape, t10, o, s, a); + if (D != null) { + let W = xu(g, O); + return [M, L, W]; + } + return [M, L]; + }, C = { x: f, filter: m, bias: g, preluActivationWeights: y }, w = { strides: t10, pad: o, dataFormat: n, dilations: s, dimRoundingMode: a, activation: p, leakyreluAlpha: c }; + return i == null ? Cr((_, E, R) => { + let A = N.runKernel(Po, C, w); + return R([E, _, A]), d && (A = z(A, [A.shape[1], A.shape[2], A.shape[3]])), { value: A, gradFunc: b }; + })(f, m) : Cr((_, E, R, A) => { + let D = N.runKernel(Po, C, w); + return A([E, _, D, R]), d && (D = z(D, [D.shape[1], D.shape[2], D.shape[3]])), { value: D, gradFunc: b }; + })(f, m, g); +} +var uT = T({ fusedDepthwiseConv2d_: qH }); +function KH({ a: r, b: e, transposeA: t10 = false, transposeB: o = false, bias: n, activation: s = "linear", preluActivationWeights: a, leakyreluAlpha: i = 0.2 }) { + if (bu(N.state.gradientDepth, s) === false) { + let O = Xe(r, e, t10, o); + return n != null && (O = ge(O, n)), yu(O, s, a, i); + } + let p = v(r, "a", "fused matMul"), u = v(e, "b", "fused matMul"); + [p, u] = Re(p, u); + let c = t10 ? p.shape[p.rank - 2] : p.shape[p.rank - 1], l = o ? u.shape[u.rank - 1] : u.shape[u.rank - 2], m = t10 ? p.shape[p.rank - 1] : p.shape[p.rank - 2], f = o ? u.shape[u.rank - 2] : u.shape[u.rank - 1], d = p.shape.slice(0, -2), h = u.shape.slice(0, -2), g = Ve(d), y = Ve(h); + $(c === l, () => `Error in fused matMul: inner shapes (${c}) and (${l}) of Tensors with shapes ${p.shape} and ${u.shape} and transposeA=${t10} and transposeB=${o} must match.`); + let C = Je(p.shape.slice(0, -2), u.shape.slice(0, -2)).concat([m, f]), w = t10 ? z(p, [g, c, m]) : z(p, [g, m, c]), k = o ? z(u, [y, f, l]) : z(u, [y, l, f]), _; + n != null && (_ = v(n, "bias", "fused matMul"), [_] = Re(_, p), Je(C, _.shape)); + let E; + a != null && (E = v(a, "prelu weights", "fused matMul")); + let R = (O, M) => { + let [L, W, V, G] = M, q = gu(z(O, V.shape), V, s), H, j; + if (!t10 && !o ? (H = Xe(q, W, false, true), j = Xe(L, q, true, false)) : !t10 && o ? (H = Xe(q, W, false, false), j = Xe(q, L, true, false)) : t10 && !o ? (H = Xe(W, q, false, true), j = Xe(L, q, false, false)) : (H = Xe(W, q, true, true), j = Xe(q, L, true, true)), n != null) { + let Y = xu(G, q); + return [H, j, Y]; + } else + return [H, j]; + }, A = { a: w, b: k, bias: _, preluActivationWeights: E }, D = { transposeA: t10, transposeB: o, activation: s, leakyreluAlpha: i }; + return n == null ? Cr((M, L, W) => { + let V = N.runKernel(Fo, A, D); + return W([M, L, V]), { value: z(V, C), gradFunc: R }; + })(w, k) : Cr((M, L, W, V) => { + let G = N.runKernel(Fo, A, D); + return V([M, L, G, W]), { value: z(G, C), gradFunc: R }; + })(w, k, _); +} +var pT = T({ fusedMatMul_: KH }); +function jH(r) { + return hl(r, 0.54, 0.46); +} +var cT = T({ hammingWindow_: jH }); +function XH(r) { + return hl(r, 0.5, 0.5); +} +var Xf = T({ hannWindow_: XH }); +function YH(r, e, t10, o = false, n = 0) { + let s = 0, a = []; + for (; s + e <= r.size; ) + a.push(Ue(r, s, e)), s += t10; + if (o) + for (; s < r.size; ) { + let i = s + e - r.size, p = gt([Ue(r, s, e - i), Bs([i], n)]); + a.push(p), s += t10; + } + return a.length === 0 ? gi([], [0, e]) : z(gt(a), [a.length, e]); +} +var Yf = T({ frame_: YH }); +function QH(r, e, t10, o, n = Xf) { + o == null && (o = wC(e)); + let s = Yf(r, e, t10), a = oe(s, n(e)); + return Kp(a, o); +} +var lT = T({ stft_: QH }); +function ZH(r, e, t10, o, n = "bilinear", s = 0) { + let a = v(r, "image", "cropAndResize"), i = v(e, "boxes", "cropAndResize", "float32"), p = v(t10, "boxInd", "cropAndResize", "int32"), u = i.shape[0]; + $(a.rank === 4, () => `Error in cropAndResize: image must be rank 4,but got rank ${a.rank}.`), $(i.rank === 2 && i.shape[1] === 4, () => `Error in cropAndResize: boxes must be have size [${u},4] but had shape ${i.shape}.`), $(p.rank === 1 && p.shape[0] === u, () => `Error in cropAndResize: boxInd must be have size [${u}] but had shape ${i.shape}.`), $(o.length === 2, () => `Error in cropAndResize: cropSize must be of length 2, but got length ${o.length}.`), $(o[0] >= 1 && o[1] >= 1, () => `cropSize must be atleast [1,1], but was ${o}`), $(n === "bilinear" || n === "nearest", () => `method must be bilinear or nearest, but was ${n}`); + let c = { image: a, boxes: i, boxInd: p }, l = { method: n, extrapolationValue: s, cropSize: o }; + return N.runKernel(xn, c, l); +} +var mT = T({ cropAndResize_: ZH }); +function JH(r) { + let e = v(r, "image", "flipLeftRight", "float32"); + $(e.rank === 4, () => `Error in flipLeftRight: image must be rank 4,but got rank ${e.rank}.`); + let t10 = { image: e }; + return N.runKernel(Sn, t10, {}); +} +var fT = T({ flipLeftRight_: JH }); +function eq(r) { + let e = v(r, "image", "grayscaleToRGB"), t10 = e.rank - 1, o = e.shape[t10]; + $(e.rank >= 2, () => `Error in grayscaleToRGB: images must be at least rank 2, but got rank ${e.rank}.`), $(o === 1, () => `Error in grayscaleToRGB: last dimension of a grayscale image should be size 1, but got size ${o}.`); + let n = new Array(e.rank); + return n.fill(1, 0, t10), n[t10] = 3, fi(e, n); +} +var dT = T({ grayscaleToRGB_: eq }); +function tq(r, e, t10 = 0, o = 0.5) { + let n = v(r, "image", "rotateWithOffset", "float32"); + $(n.rank === 4, () => `Error in rotateWithOffset: image must be rank 4,but got rank ${n.rank}.`); + let s = { image: n }, a = { radians: e, fillValue: t10, center: o }; + return N.runKernel(es, s, a); +} +var hT = T({ rotateWithOffset_: tq }); +function Vo(r, e, t10, o, n, s) { + o == null && (o = 0.5), n == null && (n = Number.NEGATIVE_INFINITY), s == null && (s = 0); + let a = r.shape[0]; + return t10 = Math.min(t10, a), $(0 <= o && o <= 1, () => `iouThreshold must be in [0, 1], but was '${o}'`), $(r.rank === 2, () => `boxes must be a 2D tensor, but was of rank '${r.rank}'`), $(r.shape[1] === 4, () => `boxes must have 4 columns, but 2nd dimension was ${r.shape[1]}`), $(e.rank === 1, () => "scores must be a 1D tensor"), $(e.shape[0] === a, () => `scores has incompatible shape with boxes. Expected ${a}, but was ${e.shape[0]}`), $(0 <= s && s <= 1, () => `softNmsSigma must be in [0, 1], but was '${s}'`), { maxOutputSize: t10, iouThreshold: o, scoreThreshold: n, softNmsSigma: s }; +} +function rq(r, e, t10, o = 0.5, n = Number.NEGATIVE_INFINITY) { + let s = v(r, "boxes", "nonMaxSuppression", "float32"), a = v(e, "scores", "nonMaxSuppression", "float32"), i = Vo(s, a, t10, o, n); + t10 = i.maxOutputSize, o = i.iouThreshold, n = i.scoreThreshold; + let p = { maxOutputSize: t10, iouThreshold: o, scoreThreshold: n }; + return N.runKernel(On, { boxes: s, scores: a }, p); +} +var gT = T({ nonMaxSuppression_: rq }); +function xT(r, e, t10) { + let o = oq(r, e, t10), n = o < 0 ? -(o + 1) : o; + r.splice(n, 0, e); +} +function oq(r, e, t10) { + return sq(r, e, t10 || nq); +} +function nq(r, e) { + return r > e ? 1 : r < e ? -1 : 0; +} +function sq(r, e, t10) { + let o = 0, n = r.length, s = 0, a = false; + for (; o < n; ) { + s = o + (n - o >>> 1); + let i = t10(e, r[s]); + i > 0 ? o = s + 1 : (n = s, a = !i); + } + return a ? o : -o - 1; +} +function Qf(r, e, t10, o, n) { + return vC(r, e, t10, o, n, 0); +} +function Zf(r, e, t10, o, n, s) { + return vC(r, e, t10, o, n, 0, false, s, true); +} +function Jf(r, e, t10, o, n, s) { + return vC(r, e, t10, o, n, s, true); +} +function vC(r, e, t10, o, n, s, a = false, i = false, p = false) { + let u = []; + for (let g = 0; g < e.length; g++) + e[g] > n && u.push({ score: e[g], boxIndex: g, suppressBeginIndex: 0 }); + u.sort(yT); + let c = s > 0 ? -0.5 / s : 0, l = [], m = []; + for (; l.length < t10 && u.length > 0; ) { + let g = u.pop(), { score: y, boxIndex: b, suppressBeginIndex: C } = g; + if (y < n) + break; + let w = false; + for (let k = l.length - 1; k >= C; --k) { + let _ = aq(r, b, l[k]); + if (_ >= o) { + w = true; + break; + } + if (g.score = g.score * iq(o, c, _), g.score <= n) + break; + } + g.suppressBeginIndex = l.length, w || (g.score === y ? (l.push(b), m.push(g.score)) : g.score > n && xT(u, g, yT)); + } + let f = l.length, d = t10 - f; + i && d > 0 && (l.push(...new Array(d).fill(0)), m.push(...new Array(d).fill(0))); + let h = { selectedIndices: l }; + return a && (h.selectedScores = m), p && (h.validOutputs = f), h; +} +function aq(r, e, t10) { + let o = r.subarray(e * 4, e * 4 + 4), n = r.subarray(t10 * 4, t10 * 4 + 4), s = Math.min(o[0], o[2]), a = Math.min(o[1], o[3]), i = Math.max(o[0], o[2]), p = Math.max(o[1], o[3]), u = Math.min(n[0], n[2]), c = Math.min(n[1], n[3]), l = Math.max(n[0], n[2]), m = Math.max(n[1], n[3]), f = (i - s) * (p - a), d = (l - u) * (m - c); + if (f <= 0 || d <= 0) + return 0; + let h = Math.max(s, u), g = Math.max(a, c), y = Math.min(i, l), b = Math.min(p, m), C = Math.max(y - h, 0) * Math.max(b - g, 0); + return C / (f + d - C); +} +function iq(r, e, t10) { + let o = Math.exp(e * t10 * t10); + return t10 <= r ? o : 0; +} +function yT(r, e) { + return r.score - e.score || r.score === e.score && e.boxIndex - r.boxIndex; +} +async function uq(r, e, t10, o = 0.5, n = Number.NEGATIVE_INFINITY) { + let s = v(r, "boxes", "nonMaxSuppressionAsync"), a = v(e, "scores", "nonMaxSuppressionAsync"), i = Vo(s, a, t10, o, n); + t10 = i.maxOutputSize, o = i.iouThreshold, n = i.scoreThreshold; + let p = await Promise.all([s.data(), a.data()]), u = p[0], c = p[1], { selectedIndices: l } = Qf(u, c, t10, o, n); + return s !== r && s.dispose(), a !== e && a.dispose(), mr(l, "int32"); +} +var bT = uq; +function pq(r, e, t10, o = 0.5, n = Number.NEGATIVE_INFINITY, s = 0) { + let a = v(r, "boxes", "nonMaxSuppression"), i = v(e, "scores", "nonMaxSuppression"), p = Vo(a, i, t10, o, n, s); + t10 = p.maxOutputSize, o = p.iouThreshold, n = p.scoreThreshold, s = p.softNmsSigma; + let u = { boxes: a, scores: i }, c = { maxOutputSize: t10, iouThreshold: o, scoreThreshold: n, softNmsSigma: s }, l = N.runKernel(Mn, u, c); + return { selectedIndices: l[0], selectedScores: l[1] }; +} +var CT = T({ nonMaxSuppressionWithScore_: pq }); +async function cq(r, e, t10, o = 0.5, n = Number.NEGATIVE_INFINITY, s = 0) { + let a = v(r, "boxes", "nonMaxSuppressionAsync"), i = v(e, "scores", "nonMaxSuppressionAsync"), p = Vo(a, i, t10, o, n, s); + t10 = p.maxOutputSize, o = p.iouThreshold, n = p.scoreThreshold, s = p.softNmsSigma; + let u = await Promise.all([a.data(), i.data()]), c = u[0], l = u[1], { selectedIndices: m, selectedScores: f } = Jf(c, l, t10, o, n, s); + return a !== r && a.dispose(), i !== e && i.dispose(), { selectedIndices: mr(m, "int32"), selectedScores: mr(f) }; +} +var IT = cq; +function lq(r, e, t10, o = 0.5, n = Number.NEGATIVE_INFINITY, s = false) { + let a = v(r, "boxes", "nonMaxSuppression"), i = v(e, "scores", "nonMaxSuppression"), p = Vo(a, i, t10, o, n, null), u = p.maxOutputSize, c = p.iouThreshold, l = p.scoreThreshold, m = { boxes: a, scores: i }, f = { maxOutputSize: u, iouThreshold: c, scoreThreshold: l, padToMaxOutputSize: s }, d = N.runKernel(pa, m, f); + return { selectedIndices: d[0], validOutputs: d[1] }; +} +var wT = T({ nonMaxSuppressionPadded_: lq }); +async function mq(r, e, t10, o = 0.5, n = Number.NEGATIVE_INFINITY, s = false) { + let a = v(r, "boxes", "nonMaxSuppressionAsync"), i = v(e, "scores", "nonMaxSuppressionAsync"), p = Vo(a, i, t10, o, n, null), u = p.maxOutputSize, c = p.iouThreshold, l = p.scoreThreshold, [m, f] = await Promise.all([a.data(), i.data()]), { selectedIndices: d, validOutputs: h } = Zf(m, f, u, c, l, s); + return a !== r && a.dispose(), i !== e && i.dispose(), { selectedIndices: mr(d, "int32"), validOutputs: be(h, "int32") }; +} +var ST = mq; +function fq(r, e, t10 = false, o = false) { + let n = v(r, "images", "resizeBilinear"); + $(n.rank === 3 || n.rank === 4, () => `Error in resizeBilinear: x must be rank 3 or 4, but got rank ${n.rank}.`), $(e.length === 2, () => `Error in resizeBilinear: new shape must 2D, but got shape ${e}.`), $(o === false || t10 === false, () => "Error in resizeBilinear: If halfPixelCenters is true, alignCorners must be false."); + let s = n, a = false; + n.rank === 3 && (a = true, s = z(n, [1, n.shape[0], n.shape[1], n.shape[2]])); + let [] = e, i = { images: s }, p = { alignCorners: t10, halfPixelCenters: o, size: e }, u = N.runKernel(Un, i, p); + return a ? z(u, [u.shape[1], u.shape[2], u.shape[3]]) : u; +} +var vT = T({ resizeBilinear_: fq }); +function dq(r, e, t10 = false, o = false) { + let n = v(r, "images", "resizeNearestNeighbor"); + $(n.rank === 3 || n.rank === 4, () => `Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank ${n.rank}.`), $(e.length === 2, () => `Error in resizeNearestNeighbor: new shape must 2D, but got shape ${e}.`), $(n.dtype === "float32" || n.dtype === "int32", () => "`images` must have `int32` or `float32` as dtype"), $(o === false || t10 === false, () => "Error in resizeNearestNeighbor: If halfPixelCenters is true, alignCorners must be false."); + let s = n, a = false; + n.rank === 3 && (a = true, s = z(n, [1, n.shape[0], n.shape[1], n.shape[2]])); + let [] = e, i = { images: s }, p = { alignCorners: t10, halfPixelCenters: o, size: e }, u = N.runKernel(Wn, i, p); + return a ? z(u, [u.shape[1], u.shape[2], u.shape[3]]) : u; +} +var kT = T({ resizeNearestNeighbor_: dq }); +function hq(r, e = "binary", t10 = false, o = 0.5) { + let n = v(r, "image", "threshold"), s = 0.2989, a = 0.587, i = 0.114, p = n.shape[0] * n.shape[1], u = oe(mr([o]), 255), c, l, m, f; + if ($(n.rank === 3, () => `Error in threshold: image must be rank 3,but got rank ${n.rank}.`), $(n.shape[2] === 3 || n.shape[2] === 1, () => `Error in threshold: image color channel must be equal to 3 or 1but got ${n.shape[2]}.`), $(n.dtype === "int32" || n.dtype === "float32", () => `Error in dtype: image dtype must be int32 or float32,but got dtype ${n.dtype}.`), $(e === "otsu" || e === "binary", () => `Method must be binary or otsu, but was ${e}`), n.shape[2] === 3) { + [c, l, m] = $a(n, [1, 1, 1], -1); + let g = oe(c, s), y = oe(l, a), b = oe(m, i); + f = ge(ge(g, y), b); + } else + f = r; + if (e === "otsu") { + let g = df(qe(Uf(f), "int32"), nr([]), 256); + u = gq(g, p); + } + let d = t10 ? Hp(f, u) : cu(f, u); + return qe(oe(d, 255), "int32"); +} +function gq(r, e) { + let t10 = mr([-1]), o = mr([0]), n = mr([0]), s, a, i, p, u, c; + for (let l = 0; l < r.size - 1; l++) { + s = Ue(r, 0, l + 1), a = Ue(r, l + 1), u = We(tt(s), e), c = We(tt(a), e); + let m = tt(oe(s, di(0, s.size))); + i = We(m, tt(s)); + let f = Bs(a.shape, s.size), d = ge(di(0, a.size), f), h = oe(a, d); + p = We(tt(h), tt(a)); + let g = ke(i, p), y = ke(i, p), b = oe(u, c); + n = oe(oe(b, g), y); + let C = cu(n, o); + o = os(C, n, o), t10 = os(C, mr([l]), t10); + } + return t10; +} +var TT = T({ threshold_: hq }); +function xq(r, e, t10 = "nearest", o = "constant", n = 0, s) { + let a = v(r, "image", "transform", "float32"), i = v(e, "transforms", "transform", "float32"); + $(a.rank === 4, () => `Error in transform: image must be rank 4,but got rank ${a.rank}.`), $(i.rank === 2 && (i.shape[0] === a.shape[0] || i.shape[0] === 1) && i.shape[1] === 8, () => "Error in transform: Input transform should be batch x 8 or 1 x 8"), $(s == null || s.length === 2, () => `Error in transform: outputShape must be [height, width] or null, but got ${s}.`); + let p = { image: a, transforms: i }, u = { interpolation: t10, fillMode: o, fillValue: n, outputShape: s }; + return N.runKernel(Jn, p, u); +} +var NT = T({ transform_: xq }); +function yq(r, e, t10) { + $(e % 1 === 0, () => `bandPart(): numLower must be an integer, got ${e}.`), $(t10 % 1 === 0, () => `bandPart(): numUpper must be an integer, got ${t10}.`); + let o = v(r, "a", "bandPart"); + $(o.rank >= 2, () => `bandPart(): Rank must be at least 2, got ${o.rank}.`); + let n = o.shape, [s, a] = o.shape.slice(-2); + if (!(e <= s)) + throw new Error(`bandPart(): numLower (${e}) must not be greater than the number of rows (${s}).`); + if (!(t10 <= a)) + throw new Error(`bandPart(): numUpper (${t10}) must not be greater than the number of columns (${a}).`); + e < 0 && (e = s), t10 < 0 && (t10 = a); + let i = z(di(0, s, 1, "int32"), [-1, 1]), p = di(0, a, 1, "int32"), u = ke(i, p), c = lu(Hp(u, be(+e, "int32")), If(u, be(-t10, "int32"))), l = Wr([s, a], o.dtype); + return z(Ir(ko(z(o, [-1, s, a])).map((m) => os(c, m, l))), n); +} +var _T = T({ bandPart_: yq }); +function bq(r) { + let e; + if (Array.isArray(r)) { + e = false, $(r != null && r.length > 0, () => "Gram-Schmidt process: input must not be null, undefined, or empty"); + let n = r[0].shape[0]; + for (let s = 1; s < r.length; ++s) + $(r[s].shape[0] === n, () => `Gram-Schmidt: Non-unique lengths found in the input vectors: (${r[s].shape[0]} vs. ${n})`); + } else + e = true, r = $a(r, r.shape[0], 0).map((n) => jp(n, [0])); + $(r.length <= r[0].shape[0], () => `Gram-Schmidt: Number of vectors (${r.length}) exceeds number of dimensions (${r[0].shape[0]}).`); + let t10 = [], o = r; + for (let n = 0; n < r.length; ++n) + t10.push(N.tidy(() => { + let s = o[n]; + if (n > 0) + for (let a = 0; a < n; ++a) { + let i = oe(tt(oe(t10[a], s)), t10[a]); + s = ke(s, i); + } + return We(s, pu(s, "euclidean")); + })); + return e ? Ir(t10, 0) : t10; +} +var ET = T({ gramSchmidt_: bq }); +function Cq(r, e = false) { + if ($(r.rank >= 2, () => `qr() requires input tensor to have a rank >= 2, but got rank ${r.rank}`), r.rank === 2) + return $T(r, e); + { + let t10 = r.shape.slice(0, r.shape.length - 2).reduce((p, u) => p * u), o = ko(z(r, [t10, r.shape[r.shape.length - 2], r.shape[r.shape.length - 1]]), 0), n = [], s = []; + o.forEach((p) => { + let [u, c] = $T(p, e); + n.push(u), s.push(c); + }); + let a = z(Ir(n, 0), r.shape), i = z(Ir(s, 0), r.shape); + return [a, i]; + } +} +function $T(r, e = false) { + return N.tidy(() => { + $(r.shape.length === 2, () => `qr2d() requires a 2D Tensor, but got a ${r.shape.length}D Tensor.`); + let t10 = r.shape[0], o = r.shape[1], n = yf(t10), s = zr(r), a = gi([[1]], [1, 1]), i = zr(a), p = t10 >= o ? o : t10; + for (let u = 0; u < p; ++u) { + let c = s, l = i, m = n; + [i, s, n] = N.tidy(() => { + let f = Ue(s, [u, u], [t10 - u, 1]), d = pu(f), h = Ue(s, [u, u], [1, 1]), g = os(cu(h, 0), gi([[-1]]), gi([[1]])), y = ke(h, oe(g, d)), b = We(f, y); + b.shape[0] === 1 ? i = zr(a) : i = gt([a, Ue(b, [1, 0], [b.shape[0] - 1, b.shape[1]])], 0); + let C = yr(We(Xe(g, y), d)), w = Ue(s, [u, 0], [t10 - u, o]), k = oe(C, i), _ = Wp(i); + if (u === 0) + s = ke(w, Xe(k, Xe(_, w))); + else { + let A = ke(w, Xe(k, Xe(_, w))); + s = gt([Ue(s, [0, 0], [u, o]), A], 0); + } + let E = Wp(k), R = Ue(n, [0, u], [t10, n.shape[1] - u]); + if (u === 0) + n = ke(R, Xe(Xe(R, i), E)); + else { + let A = ke(R, Xe(Xe(R, i), E)); + n = gt([Ue(n, [0, 0], [t10, u]), A], 1); + } + return [i, s, n]; + }), Ft([c, l, m]); + } + return !e && t10 > o && (n = Ue(n, [0, 0], [t10, o]), s = Ue(s, [0, 0], [o, o])), [n, s]; + }); +} +var RT = T({ qr_: Cq }); +var Et; +(function(r) { + r[r.NONE = 0] = "NONE", r[r.MEAN = 1] = "MEAN", r[r.SUM = 2] = "SUM", r[r.SUM_BY_NONZERO_WEIGHTS = 3] = "SUM_BY_NONZERO_WEIGHTS"; +})(Et || (Et = {})); +function Iq(r, e, t10 = Et.SUM_BY_NONZERO_WEIGHTS) { + let o = v(r, "losses", "computeWeightedLoss"), n = null; + e != null && (n = v(e, "weights", "computeWeightedLoss")); + let s = n == null ? o : oe(o, n); + if (t10 === Et.NONE) + return s; + if (t10 === Et.SUM) + return tt(s); + if (t10 === Et.MEAN) { + if (n == null) + return mu(s); + { + let a = o.size / n.size, i = We(tt(s), tt(n)); + return a > 1 ? We(i, be(a)) : i; + } + } + if (t10 === Et.SUM_BY_NONZERO_WEIGHTS) { + if (n == null) + return We(tt(s), be(o.size)); + { + let a = oe(n, zs(o.shape)), i = qe(tt(Ff(a, be(0))), "float32"); + return We(tt(s), i); + } + } + throw Error(`Unknown reduction: ${t10}`); +} +var sr = T({ computeWeightedLoss_: Iq }); +function wq(r, e, t10, o = Et.SUM_BY_NONZERO_WEIGHTS) { + let n = v(r, "labels", "absoluteDifference"), s = v(e, "predictions", "absoluteDifference"), a = null; + t10 != null && (a = v(t10, "weights", "absoluteDifference")), ht(n.shape, s.shape, "Error in absoluteDifference: "); + let i = Qt(ke(n, s)); + return sr(i, a, o); +} +var AT = T({ absoluteDifference_: wq }); +function Sq(r, e, t10, o, n = Et.SUM_BY_NONZERO_WEIGHTS) { + let s = v(r, "labels", "cosineDistance"), a = v(e, "predictions", "cosineDistance"), i = null; + o != null && (i = v(o, "weights", "cosineDistance")), ht(s.shape, a.shape, "Error in cosineDistance: "); + let p = be(1), u = ke(p, tt(oe(s, a), t10, true)); + return sr(u, i, n); +} +var FT = T({ cosineDistance_: Sq }); +function vq(r, e, t10, o = Et.SUM_BY_NONZERO_WEIGHTS) { + let n = v(r, "labels", "hingeLoss"), s = v(e, "predictions", "hingeLoss"), a = null; + t10 != null && (a = v(t10, "weights", "hingeLoss")), ht(n.shape, s.shape, "Error in hingeLoss: "); + let i = be(1); + n = ke(oe(be(2), n), i); + let p = hi(ke(i, oe(n, s))); + return sr(p, a, o); +} +var DT = T({ hingeLoss_: vq }); +function kq(r, e, t10, o = 1, n = Et.SUM_BY_NONZERO_WEIGHTS) { + let s = v(r, "labels", "huberLoss"), a = v(e, "predictions", "huberLoss"), i = null; + t10 != null && (i = v(t10, "weights", "huberLoss")), ht(s.shape, a.shape, "Error in huberLoss: "); + let p = be(o), u = Qt(ke(a, s)), c = Af(u, p), l = ke(u, c), m = ge(oe(be(0.5), Zt(c)), oe(p, l)); + return sr(m, i, n); +} +var PT = T({ huberLoss_: kq }); +function Tq(r, e, t10, o = 1e-7, n = Et.SUM_BY_NONZERO_WEIGHTS) { + let s = v(r, "labels", "logLoss"), a = v(e, "predictions", "logLoss"), i = null; + t10 != null && (i = v(t10, "weights", "logLoss")), ht(s.shape, a.shape, "Error in logLoss: "); + let p = be(1), u = be(o), c = yr(oe(s, Ea(ge(a, u)))), l = oe(ke(p, s), Ea(ge(ke(p, a), u))), m = ke(c, l); + return sr(m, i, n); +} +var OT = T({ logLoss_: Tq }); +function Nq(r, e, t10, o = Et.SUM_BY_NONZERO_WEIGHTS) { + let n = v(r, "labels", "meanSquaredError"), s = v(e, "predictions", "meanSquaredError"), a = null; + t10 != null && (a = v(t10, "weights", "meanSquaredError")), ht(n.shape, s.shape, "Error in meanSquaredError: "); + let i = Hf(n, s); + return sr(i, a, o); +} +var MT = T({ meanSquaredError_: Nq }); +function _q(r, e) { + let t10 = v(r, "labels", "sigmoidCrossEntropyWithLogits"), o = v(e, "logits", "sigmoidCrossEntropyWithLogits"); + ht(t10.shape, o.shape, "Error in sigmoidCrossEntropyWithLogits: "); + let n = hi(o), s = oe(o, t10), a = Sf(Bo(yr(Qt(o)))); + return ge(ke(n, s), a); +} +function Eq(r, e, t10, o = 0, n = Et.SUM_BY_NONZERO_WEIGHTS) { + let s = v(r, "multiClassLabels", "sigmoidCrossEntropy"), a = v(e, "logits", "sigmoidCrossEntropy"), i = null; + if (t10 != null && (i = v(t10, "weights", "sigmoidCrossEntropy")), ht(s.shape, a.shape, "Error in sigmoidCrossEntropy: "), o > 0) { + let u = be(o), c = be(1), l = be(0.5); + s = ge(oe(s, ke(c, u)), oe(l, u)); + } + let p = _q(s, a); + return sr(p, i, n); +} +var LT = T({ sigmoidCrossEntropy_: Eq }); +function $q(r, e, t10 = -1) { + if (t10 === -1 && (t10 = e.rank - 1), t10 !== e.rank - 1) + throw Error(`Softmax cross entropy along a non-last dimension is not yet supported. Labels / logits was rank ${e.rank} and dim was ${t10}`); + return Cr((n, s, a) => { + let p = Tf(s, [t10], true), u = ke(qe(s, "float32"), p); + a([n, u]); + let c = yr(oe(u, n)); + return { value: tt(c, [t10]), gradFunc: (f, d) => { + let [h, g] = d, y = Ta(f.shape, [t10]); + return [oe(z(f, y), ke(qe(h, "float32"), Bo(g))), oe(z(f, y), ke(Bo(g), qe(h, "float32")))]; + } }; + })(r, e); +} +function Rq(r, e, t10, o = 0, n = Et.SUM_BY_NONZERO_WEIGHTS) { + let s = v(r, "onehotLabels", "softmaxCrossEntropy"), a = v(e, "logits", "softmaxCrossEntropy"), i = null; + if (t10 != null && (i = v(t10, "weights", "softmaxCrossEntropy")), ht(s.shape, a.shape, "Error in softmaxCrossEntropy: "), o > 0) { + let u = be(o), c = be(1), l = be(s.shape[1]); + s = ge(oe(s, ke(c, u)), We(u, l)); + } + let p = $q(s, a); + return sr(p, i, n); +} +var BT = T({ softmaxCrossEntropy_: Rq }); +function Aq(r, e, t10, o) { + let n = v(r, "indices", "sparseFillEmptyRows", "int32"), s = v(e, "values", "sparseFillEmptyRows"), a = v(t10, "denseShape", "sparseFillEmptyRows", "int32"), i = v(o, "defaultValue", "sparseFillEmptyRows", s.dtype); + if (n.rank !== 2) + throw new Error(`Indices should be Tensor2D but received shape + ${n.shape}`); + if (s.rank !== 1) + throw new Error(`Values should be Tensor1D but received shape ${s.shape}`); + if (a.rank !== 1) + throw new Error(`Dense shape should be Tensor1D but received shape ${a.shape}`); + if (i.rank !== 0) + throw new Error(`Default value should be a scalar but received shape ${i.shape}`); + let p = { indices: n, values: s, denseShape: a, defaultValue: i }, u = N.runKernel(Qa, p); + return { outputIndices: u[0], outputValues: u[1], emptyRowIndicator: u[2], reverseIndexMap: u[3] }; +} +var VT = T({ sparseFillEmptyRows_: Aq }); +function Fq(r, e, t10) { + let o = v(r, "inputIndices", "sparseReshape", "int32"), n = v(e, "inputShape", "sparseReshape", "int32"), s = v(t10, "newShape", "sparseReshape", "int32"); + if (o.rank !== 2) + throw new Error(`Input indices should be Tensor2D but received shape + ${o.shape}`); + if (n.rank !== 1) + throw new Error(`Input shape should be Tensor1D but received shape ${n.shape}`); + if (s.rank !== 1) + throw new Error(`New shape should be Tensor1D but received shape ${s.shape}`); + let a = { inputIndices: o, inputShape: n, newShape: s }, i = N.runKernel(ga, a); + return { outputIndices: i[0], outputShape: i[1] }; +} +var zT = T({ sparseReshape_: Fq }); +function Dq(r, e, t10) { + let o = v(r, "data", "sparseSegmentMean"), n = v(e, "indices", "sparseSegmentMean", "int32"), s = v(t10, "segmentIds", "sparseSegmentMean", "int32"); + if (o.rank < 1) + throw new Error("Data should be at least 1 dimensional but received scalar"); + if (n.rank !== 1) + throw new Error(`Indices should be Tensor1D but received shape + ${n.shape}`); + if (s.rank !== 1) + throw new Error(`Segment ids should be Tensor1D but received shape + ${s.shape}`); + let a = { data: o, indices: n, segmentIds: s }; + return N.runKernel(Za, a); +} +var WT = T({ sparseSegmentMean_: Dq }); +function Pq(r, e, t10) { + let o = v(r, "data", "sparseSegmentSum"), n = v(e, "indices", "sparseSegmentSum", "int32"), s = v(t10, "segmentIds", "sparseSegmentSum", "int32"); + if (o.rank < 1) + throw new Error("Data should be at least 1 dimensional but received scalar"); + if (n.rank !== 1) + throw new Error(`Indices should be Tensor1D but received shape + ${n.shape}`); + if (s.rank !== 1) + throw new Error(`Segment ids should be Tensor1D but received shape + ${s.shape}`); + let a = { data: o, indices: n, segmentIds: s }; + return N.runKernel(Ja, a); +} +var UT = T({ sparseSegmentSum_: Pq }); +function Oq(r, e, t10, o, n, s, a, i) { + let p = v(r, "data", "stringNGrams", "string"); + if (p.dtype !== "string") + throw new Error("Data must be of datatype string"); + if (p.shape.length !== 1) + throw new Error(`Data must be a vector, saw: ${p.shape}`); + let u = v(e, "dataSplits", "stringNGrams"); + if (u.dtype !== "int32") + throw new Error("Data splits must be of datatype int32"); + let c = { separator: t10, nGramWidths: o, leftPad: n, rightPad: s, padWidth: a, preserveShortSequences: i }, l = { data: p, dataSplits: u }, m = N.runKernel(Ns, l, c); + return { nGrams: m[0], nGramsSplits: m[1] }; +} +var GT = T({ stringNGrams_: Oq }); +function Mq(r, e, t10 = true) { + let o = v(r, "input", "stringSplit", "string"), n = v(e, "delimiter", "stringSplit", "string"); + if (o.rank !== 1) + throw new Error(`Input should be Tensor1D but received shape ${o.shape}`); + if (n.rank !== 0) + throw new Error(`Delimiter should be a scalar but received shape ${n.shape}`); + let s = { skipEmpty: t10 }, a = { input: o, delimiter: n }, i = N.runKernel(ri, a, s); + return { indices: i[0], values: i[1], shape: i[2] }; +} +var HT = T({ stringSplit_: Mq }); +function Lq(r, e) { + let t10 = v(r, "input", "stringToHashBucketFast", "string"), o = { numBuckets: e }; + if (e <= 0) + throw new Error("Number of buckets must be at least 1"); + let n = { input: t10 }; + return N.runKernel(oi, n, o); +} +var qT = T({ stringToHashBucketFast_: Lq }); +var Bq = { fft: qp, ifft: hu, rfft: Kp, irfft: Gf }; +var Vq = { hammingWindow: cT, hannWindow: Xf, frame: Yf, stft: lT }; +var zq = { flipLeftRight: fT, grayscaleToRGB: dT, resizeNearestNeighbor: kT, resizeBilinear: vT, rotateWithOffset: hT, cropAndResize: mT, nonMaxSuppression: gT, nonMaxSuppressionAsync: bT, nonMaxSuppressionWithScore: CT, nonMaxSuppressionWithScoreAsync: IT, nonMaxSuppressionPadded: wT, nonMaxSuppressionPaddedAsync: ST, threshold: TT, transform: NT }; +var Wq = { bandPart: _T, gramSchmidt: ET, qr: RT }; +var Uq = { absoluteDifference: AT, computeWeightedLoss: sr, cosineDistance: FT, hingeLoss: DT, huberLoss: PT, logLoss: OT, meanSquaredError: MT, sigmoidCrossEntropy: LT, softmaxCrossEntropy: BT }; +var Gq = { sparseFillEmptyRows: VT, sparseReshape: zT, sparseSegmentMean: WT, sparseSegmentSum: UT }; +var Hq = { stringNGrams: GT, stringSplit: HT, stringToHashBucketFast: qT }; +var wr = class extends ll { + minimize(e, t10 = false, o) { + let { value: n, grads: s } = this.computeGradients(e, o); + if (o != null) { + let a = o.map((i) => ({ name: i.name, tensor: s[i.name] })); + this.applyGradients(a); + } else + this.applyGradients(s); + return Ft(s), t10 ? n : (n.dispose(), null); + } + get iterations() { + return this.iterations_ == null && (this.iterations_ = 0), this.iterations_; + } + incrementIterations() { + this.iterations_ = this.iterations + 1; + } + computeGradients(e, t10) { + return dC(e, t10); + } + dispose() { + this.iterations_ != null && Ft(this.iterations_); + } + async saveIterations() { + return this.iterations_ == null && (this.iterations_ = 0), { name: "iter", tensor: be(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(wr, Symbol.hasInstance, { value: (r) => r.minimize != null && r.computeGradients != null && r.applyGradients != null }); +var xi = class extends wr { + constructor(e, t10, o = null) { + super(), this.learningRate = e, this.rho = t10, this.epsilon = o, this.accumulatedGrads = [], this.accumulatedUpdates = [], o == null && (this.epsilon = N.backend.epsilon()); + } + applyGradients(e) { + (Array.isArray(e) ? e.map((o) => o.name) : Object.keys(e)).forEach((o, n) => { + let s = N.registeredVariables[o], a = false; + this.accumulatedGrads[n] == null && (this.accumulatedGrads[n] = { originalName: `${o}/accum_grad`, variable: Ne(() => Gt(s).variable(a)) }), this.accumulatedUpdates[n] == null && (this.accumulatedUpdates[n] = { originalName: `${o}/accum_var`, variable: Ne(() => Gt(s).variable(a)) }); + let i = Array.isArray(e) ? e[n].tensor : e[o]; + if (i == null) + return; + let p = this.accumulatedGrads[n].variable, u = this.accumulatedUpdates[n].variable; + Ne(() => { + let c = ge(oe(p, this.rho), oe(Zt(i), 1 - this.rho)), l = oe(We(Rr(ge(u, this.epsilon)), Rr(ge(p, this.epsilon))), i), m = ge(oe(u, this.rho), oe(Zt(l), 1 - this.rho)); + p.assign(c), u.assign(m); + let f = ge(oe(l, -this.learningRate), s); + s.assign(f); + }); + }), this.incrementIterations(); + } + dispose() { + this.accumulatedUpdates != null && (Ft(this.accumulatedGrads.map((e) => e.variable)), Ft(this.accumulatedUpdates.map((e) => e.variable))); + } + async getWeights() { + let e = [...this.accumulatedGrads, ...this.accumulatedUpdates]; + return [await this.saveIterations()].concat(e.map((t10) => ({ name: t10.originalName, tensor: t10.variable }))); + } + async setWeights(e) { + e = await this.extractIterations(e); + let t10 = e.length / 2, o = false; + this.accumulatedGrads = e.slice(0, t10).map((n) => ({ originalName: n.name, variable: n.tensor.variable(o) })), this.accumulatedUpdates = e.slice(t10, t10 * 2).map((n) => ({ originalName: n.name, variable: n.tensor.variable(o) })); + } + getConfig() { + return { learningRate: this.learningRate, rho: this.rho, epsilon: this.epsilon }; + } + static fromConfig(e, t10) { + return new e(t10.learningRate, t10.rho, t10.epsilon); + } +}; +xi.className = "Adadelta"; +$r(xi); +var yi = class extends wr { + constructor(e, t10 = 0.1) { + super(), this.learningRate = e, this.initialAccumulatorValue = t10, this.accumulatedGrads = []; + } + applyGradients(e) { + (Array.isArray(e) ? e.map((o) => o.name) : Object.keys(e)).forEach((o, n) => { + let s = N.registeredVariables[o]; + this.accumulatedGrads[n] == null && (this.accumulatedGrads[n] = { originalName: `${o}/accumulator`, variable: Ne(() => Bs(s.shape, this.initialAccumulatorValue).variable(false)) }); + let a = Array.isArray(e) ? e[n].tensor : e[o]; + if (a == null) + return; + let i = this.accumulatedGrads[n].variable; + Ne(() => { + let p = ge(i, Zt(a)); + i.assign(p); + let u = ge(oe(We(a, Rr(ge(p, N.backend.epsilon()))), -this.learningRate), s); + s.assign(u); + }); + }), this.incrementIterations(); + } + dispose() { + this.accumulatedGrads != null && Ft(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 t10 = false; + this.accumulatedGrads = e.map((o) => ({ originalName: o.name, variable: o.tensor.variable(t10) })); + } + getConfig() { + return { learningRate: this.learningRate, initialAccumulatorValue: this.initialAccumulatorValue }; + } + static fromConfig(e, t10) { + return new e(t10.learningRate, t10.initialAccumulatorValue); + } +}; +yi.className = "Adagrad"; +$r(yi); +var bi = class extends wr { + constructor(e, t10, o, n = null) { + super(), this.learningRate = e, this.beta1 = t10, this.beta2 = o, this.epsilon = n, this.accumulatedFirstMoment = [], this.accumulatedSecondMoment = [], Ne(() => { + this.accBeta1 = be(t10).variable(), this.accBeta2 = be(o).variable(); + }), n == null && (this.epsilon = N.backend.epsilon()); + } + applyGradients(e) { + let t10 = Array.isArray(e) ? e.map((o) => o.name) : Object.keys(e); + Ne(() => { + let o = ke(1, this.accBeta1), n = ke(1, this.accBeta2); + t10.forEach((s, a) => { + let i = N.registeredVariables[s], p = false; + this.accumulatedFirstMoment[a] == null && (this.accumulatedFirstMoment[a] = { originalName: `${s}/m`, variable: Ne(() => Gt(i).variable(p)) }), this.accumulatedSecondMoment[a] == null && (this.accumulatedSecondMoment[a] = { originalName: `${s}/v`, variable: Ne(() => Gt(i).variable(p)) }); + let u = Array.isArray(e) ? e[a].tensor : e[s]; + if (u == null) + return; + let c = this.accumulatedFirstMoment[a].variable, l = this.accumulatedSecondMoment[a].variable, m = ge(oe(c, this.beta1), oe(u, 1 - this.beta1)), f = ge(oe(l, this.beta2), oe(Zt(u), 1 - this.beta2)), d = We(m, o), h = We(f, n); + c.assign(m), l.assign(f); + let g = ge(oe(We(d, ge(Rr(h), this.epsilon)), -this.learningRate), i); + i.assign(g); + }), this.accBeta1.assign(oe(this.accBeta1, this.beta1)), this.accBeta2.assign(oe(this.accBeta2, this.beta2)); + }), this.incrementIterations(); + } + dispose() { + this.accBeta1.dispose(), this.accBeta2.dispose(), this.accumulatedFirstMoment != null && Ft(this.accumulatedFirstMoment.map((e) => e.variable)), this.accumulatedSecondMoment != null && Ft(this.accumulatedSecondMoment.map((e) => e.variable)); + } + async getWeights() { + let e = [...this.accumulatedFirstMoment, ...this.accumulatedSecondMoment]; + return [await this.saveIterations()].concat(e.map((t10) => ({ name: t10.originalName, tensor: t10.variable }))); + } + async setWeights(e) { + e = await this.extractIterations(e), Ne(() => { + this.accBeta1.assign(Na(this.beta1, this.iterations_ + 1)), this.accBeta2.assign(Na(this.beta2, this.iterations_ + 1)); + }); + let t10 = e.length / 2, o = false; + this.accumulatedFirstMoment = e.slice(0, t10).map((n) => ({ originalName: n.name, variable: n.tensor.variable(o) })), this.accumulatedSecondMoment = e.slice(t10, t10 * 2).map((n) => ({ originalName: n.name, variable: n.tensor.variable(o) })); + } + getConfig() { + return { learningRate: this.learningRate, beta1: this.beta1, beta2: this.beta2, epsilon: this.epsilon }; + } + static fromConfig(e, t10) { + return new e(t10.learningRate, t10.beta1, t10.beta2, t10.epsilon); + } +}; +bi.className = "Adam"; +$r(bi); +var Ci = class extends wr { + constructor(e, t10, o, n = null, s = 0) { + super(), this.learningRate = e, this.beta1 = t10, this.beta2 = o, this.epsilon = n, this.decay = s, this.accumulatedFirstMoment = [], this.accumulatedWeightedInfNorm = [], Ne(() => { + this.iteration = be(0).variable(), this.accBeta1 = be(t10).variable(); + }), n == null && (this.epsilon = N.backend.epsilon()); + } + applyGradients(e) { + let t10 = Array.isArray(e) ? e.map((o) => o.name) : Object.keys(e); + Ne(() => { + let o = ke(1, this.accBeta1), n = We(-this.learningRate, ge(oe(this.iteration, this.decay), 1)); + t10.forEach((s, a) => { + let i = N.registeredVariables[s], p = false; + this.accumulatedFirstMoment[a] == null && (this.accumulatedFirstMoment[a] = { originalName: `${s}/m`, variable: Gt(i).variable(p) }), this.accumulatedWeightedInfNorm[a] == null && (this.accumulatedWeightedInfNorm[a] = { originalName: `${s}/v`, variable: Gt(i).variable(p) }); + let u = Array.isArray(e) ? e[a].tensor : e[s]; + if (u == null) + return; + let c = this.accumulatedFirstMoment[a].variable, l = this.accumulatedWeightedInfNorm[a].variable, m = ge(oe(c, this.beta1), oe(u, 1 - this.beta1)), f = oe(l, this.beta2), d = Qt(u), h = Rf(f, d); + c.assign(m), l.assign(h); + let g = ge(oe(We(n, o), We(m, ge(h, this.epsilon))), i); + i.assign(g); + }), this.iteration.assign(ge(this.iteration, 1)), this.accBeta1.assign(oe(this.accBeta1, this.beta1)); + }), this.incrementIterations(); + } + dispose() { + this.accBeta1.dispose(), this.iteration.dispose(), this.accumulatedFirstMoment != null && Ft(this.accumulatedFirstMoment.map((e) => e.variable)), this.accumulatedWeightedInfNorm != null && Ft(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, t10) { + return new e(t10.learningRate, t10.beta1, t10.beta2, t10.epsilon, t10.decay); + } +}; +Ci.className = "Adamax"; +$r(Ci); +var Us = class extends wr { + constructor(e) { + super(), this.learningRate = e, this.setLearningRate(e); + } + applyGradients(e) { + (Array.isArray(e) ? e.map((o) => o.name) : Object.keys(e)).forEach((o, n) => { + let s = Array.isArray(e) ? e[n].tensor : e[o]; + if (s == null) + return; + let a = N.registeredVariables[o]; + Ne(() => { + let i = ge(oe(this.c, s), a); + a.assign(i); + }); + }), this.incrementIterations(); + } + setLearningRate(e) { + this.learningRate = e, this.c != null && this.c.dispose(), this.c = So(be(-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, t10) { + return new e(t10.learningRate); + } +}; +Us.className = "SGD"; +$r(Us); +var Ii = class extends Us { + constructor(e, t10, o = false) { + super(e), this.learningRate = e, this.momentum = t10, this.useNesterov = o, this.accumulations = [], this.m = be(this.momentum); + } + applyGradients(e) { + (Array.isArray(e) ? e.map((o) => o.name) : Object.keys(e)).forEach((o, n) => { + let s = N.registeredVariables[o]; + this.accumulations[n] == null && (this.accumulations[n] = { originalName: `${o}/momentum`, variable: Ne(() => Gt(s).variable(false)) }); + let a = this.accumulations[n].variable, i = Array.isArray(e) ? e[n].tensor : e[o]; + i != null && Ne(() => { + let p, u = ge(oe(this.m, a), i); + this.useNesterov ? p = ge(oe(this.c, ge(i, oe(u, this.m))), s) : p = ge(oe(this.c, u), s), a.assign(u), s.assign(p); + }); + }), this.incrementIterations(); + } + dispose() { + this.m.dispose(), this.accumulations != null && Ft(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 t10 = false; + this.accumulations = e.map((o) => ({ originalName: o.name, variable: o.tensor.variable(t10) })); + } + getConfig() { + return { learningRate: this.learningRate, momentum: this.momentum, useNesterov: this.useNesterov }; + } + static fromConfig(e, t10) { + return new e(t10.learningRate, t10.momentum, t10.useNesterov); + } +}; +Ii.className = "Momentum"; +$r(Ii); +var wi = class extends wr { + constructor(e, t10 = 0.9, o = 0, n = null, s = false) { + if (super(), this.learningRate = e, this.decay = t10, this.momentum = o, this.epsilon = n, this.accumulatedMeanSquares = [], this.accumulatedMoments = [], this.accumulatedMeanGrads = [], this.centered = s, n == null && (this.epsilon = N.backend.epsilon()), e == null) + throw new Error("learningRate for RMSPropOptimizer must be defined."); + } + applyGradients(e) { + (Array.isArray(e) ? e.map((o) => o.name) : Object.keys(e)).forEach((o, n) => { + let s = N.registeredVariables[o], a = false; + this.accumulatedMeanSquares[n] == null && (this.accumulatedMeanSquares[n] = { originalName: `${o}/rms`, variable: Ne(() => Gt(s).variable(a)) }), this.accumulatedMoments[n] == null && (this.accumulatedMoments[n] = { originalName: `${o}/momentum`, variable: Ne(() => Gt(s).variable(a)) }), this.accumulatedMeanGrads[n] == null && this.centered && (this.accumulatedMeanGrads[n] = { originalName: `${o}/mg`, variable: Ne(() => Gt(s).variable(a)) }); + let i = Array.isArray(e) ? e[n].tensor : e[o]; + if (i == null) + return; + let p = this.accumulatedMeanSquares[n].variable, u = this.accumulatedMoments[n].variable; + Ne(() => { + let c = ge(oe(p, this.decay), oe(Zt(i), 1 - this.decay)); + if (this.centered) { + let l = this.accumulatedMeanGrads[n].variable, m = ge(oe(l, this.decay), oe(i, 1 - this.decay)), f = We(oe(i, this.learningRate), Rr(ke(c, ge(Zt(m), this.epsilon)))), d = ge(oe(u, this.momentum), f); + p.assign(c), l.assign(m), u.assign(d); + let h = ke(s, d); + s.assign(h); + } else { + let l = ge(oe(p, this.decay), oe(Zt(i), 1 - this.decay)), m = ge(oe(u, this.momentum), We(oe(i, this.learningRate), Rr(ge(l, this.epsilon)))); + p.assign(l), u.assign(m); + let f = ke(s, m); + s.assign(f); + } + }); + }), this.incrementIterations(); + } + dispose() { + this.accumulatedMeanSquares != null && Ft(this.accumulatedMeanSquares.map((e) => e.variable)), this.accumulatedMeanGrads != null && this.centered && Ft(this.accumulatedMeanGrads.map((e) => e.variable)), this.accumulatedMoments != null && Ft(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((t10) => ({ name: t10.originalName, tensor: t10.variable }))); + } + async setWeights(e) { + e = await this.extractIterations(e); + let t10 = this.centered ? e.length / 3 : e.length / 2, o = false; + this.accumulatedMeanSquares = e.slice(0, t10).map((n) => ({ originalName: n.name, variable: n.tensor.variable(o) })), this.accumulatedMoments = e.slice(t10, t10 * 2).map((n) => ({ originalName: n.name, variable: n.tensor.variable(o) })), this.centered && (this.accumulatedMeanGrads = e.slice(t10 * 2, t10 * 3).map((n) => ({ originalName: n.name, variable: n.tensor.variable(o) }))); + } + getConfig() { + return { learningRate: this.learningRate, decay: this.decay, momentum: this.momentum, epsilon: this.epsilon, centered: this.centered }; + } + static fromConfig(e, t10) { + return new e(t10.learningRate, t10.decay, t10.momentum, t10.epsilon, t10.centered); + } +}; +wi.className = "RMSProp"; +$r(wi); +var ns = class { + static sgd(e) { + return new Us(e); + } + static momentum(e, t10, o = false) { + return new Ii(e, t10, o); + } + static rmsprop(e, t10 = 0.9, o = 0, n = null, s = false) { + return new wi(e, t10, o, n, s); + } + static adam(e = 1e-3, t10 = 0.9, o = 0.999, n = null) { + return new bi(e, t10, o, n); + } + static adadelta(e = 1e-3, t10 = 0.95, o = null) { + return new xi(e, t10, o); + } + static adamax(e = 2e-3, t10 = 0.9, o = 0.999, n = null, s = 0) { + return new Ci(e, t10, o, n, s); + } + static adagrad(e, t10 = 0.1) { + return new yi(e, t10); + } +}; +var pMe = { sgd: ns.sgd, momentum: ns.momentum, adadelta: ns.adadelta, adagrad: ns.adagrad, rmsprop: ns.rmsprop, adamax: ns.adamax, adam: ns.adam }; +var qq = (() => typeof requestAnimationFrame != "undefined" ? requestAnimationFrame : typeof setImmediate != "undefined" ? setImmediate : (r) => r())(); +function kC() { + return new Promise((r) => qq(() => r())); +} +var I = {}; +Be(I, { ERF_A1: () => pK, ERF_A2: () => cK, ERF_A3: () => lK, ERF_A4: () => mK, ERF_A5: () => fK, ERF_P: () => uK, PARALLELIZE_THRESHOLD: () => ed, RowPartitionType: () => Gs, SELU_SCALE: () => iK, SELU_SCALEALPHA: () => aK, applyActivation: () => yu, assertAndGetBroadcastShape: () => Je, assertAxesAreInnerMostDims: () => fG, assertParamsConsistent: () => Kq, assignToTypedArray: () => bK, axesAreInnerMostDims: () => fC, calculateShapes: () => kv, checkEinsumDimSizes: () => kK, checkPadOnDimRoundingMode: () => Ot, combineLocations: () => $k, combineRaggedTensorToTensorShapes: () => Xq, complexWithEvenIndex: () => gK, complexWithOddIndex: () => xK, computeConv2DInfo: () => uu, computeConv3DInfo: () => Zv, computeDefaultPad: () => mC, computeDilation2DInfo: () => dU, computeOptimalWindowSize: () => Jq, computeOutAndReduceShapes: () => mG, computeOutShape: () => jq, computePool2DInfo: () => lC, computePool3DInfo: () => hU, convertConv2DDataFormat: () => Jv, decodeEinsumEquation: () => SK, eitherStridesOrDilationsAreOne: () => lr, expandShapeToKeepDim: () => Ta, exponent: () => IK, exponents: () => CK, fromStringArrayToUint8: () => qK, fromUint8ToStringArray: () => HK, getAxesPermutation: () => dG, getBroadcastDims: () => Iv, getComplexWithIndex: () => yK, getEinsumComputePath: () => TK, getEinsumPermutation: () => vK, getFusedBiasGradient: () => xu, getFusedDyActivation: () => gu, getImageCenter: () => eK, getInnerMostAxes: () => gG, getPermuted: () => rK, getRaggedRank: () => Qq, getReductionAxes: () => nf, getReshaped: () => tK, getReshapedPermuted: () => oK, getRowPartitionTypesHelper: () => Yq, getSliceBeginCoords: () => nK, getSliceSize: () => sK, getSparseFillEmptyRowsIndicesDenseShapeMismatch: () => $K, getSparseFillEmptyRowsNegativeIndexErrorMessage: () => RK, getSparseFillEmptyRowsOutOfRangeIndexErrorMessage: () => AK, getSparseReshapeEmptyTensorZeroOutputDimErrorMessage: () => PK, getSparseReshapeInputOutputMismatchErrorMessage: () => MK, getSparseReshapeInputOutputMultipleErrorMessage: () => OK, getSparseReshapeMultipleNegativeOneOutputDimErrorMessage: () => FK, getSparseReshapeNegativeOutputDimErrorMessage: () => DK, getSparseSegmentReductionIndicesOutOfRangeErrorMessage: () => zK, getSparseSegmentReductionNegativeSegmentIdsErrorMessage: () => LK, getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage: () => BK, getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage: () => VK, getUndoAxesPermutation: () => hG, isIdentityPermutation: () => NK, log: () => Sz, mergeRealAndImagArrays: () => dK, prepareAndValidate: () => vv, prepareSplitSize: () => EK, segment_util: () => NC, shouldFuse: () => bu, slice_util: () => et, splitRealAndImagArrays: () => hK, tupleValuesAreOne: () => iu, upcastType: () => ct, validateDefaultValueShape: () => Zq, validateInput: () => uf, validateUpdateShape: () => aC, warn: () => Rs }); +function Kq(r, e) { + let t10 = r[0].length; + r.forEach((n, s) => { + $(n.length === t10, () => `Error in concat${t10}D: rank of tensors[${s}] must be the same as the rank of the rest (${t10})`); + }), $(e >= 0 && e < t10, () => `Error in concat${t10}D: axis must be between 0 and ${t10 - 1}.`); + let o = r[0]; + r.forEach((n, s) => { + for (let a = 0; a < t10; a++) + $(a === e || n[a] === o[a], () => `Error in concat${t10}D: Shape of tensors[${s}] (${n}) does not match the shape of the rest (${o}) along the non-concatenated axis ${s}.`); + }); +} +function jq(r, e) { + let t10 = r[0].slice(); + for (let o = 1; o < r.length; o++) + t10[e] += r[o][e]; + return t10; +} +var Gs; +(function(r) { + r[r.FIRST_DIM_SIZE = 0] = "FIRST_DIM_SIZE", r[r.VALUE_ROWIDS = 1] = "VALUE_ROWIDS", r[r.ROW_LENGTHS = 2] = "ROW_LENGTHS", r[r.ROW_SPLITS = 3] = "ROW_SPLITS", r[r.ROW_LIMITS = 4] = "ROW_LIMITS", r[r.ROW_STARTS = 5] = "ROW_STARTS"; +})(Gs || (Gs = {})); +function Xq(r, e, t10) { + let o = new Array(); + if (t10 == null && e == null) + return o; + if (e == null) + for (; o.length < r + t10.length; ) + o.push(-1); + else + o = e.slice(); + if (t10 == null) + return o; + if (r + t10.length !== o.length) + throw new Error(`rt input.shape and shape=${e} are incompatible: rt input.rank = ${r + t10.length}, but shape.rank = ${o.length}`); + for (let n = 1; n < t10.length; ++n) { + let s = t10[n], a = o[o.length - t10.length + n], i = o[a]; + if (s >= 0) + if (i >= 0) { + if (i !== s) + throw new Error(`rt input.shape and shape=${e} are incompatible: rt input.shape[${n + r}] = ${s} but shape[${n + r}] = ${i}`); + } else + o[a] = s; + } + return o; +} +function Yq(r) { + let e = { FIRST_DIM_SIZE: Gs.FIRST_DIM_SIZE, VALUE_ROWIDS: Gs.VALUE_ROWIDS, ROW_LENGTHS: Gs.ROW_LENGTHS, ROW_SPLITS: Gs.ROW_SPLITS, ROW_LIMITS: Gs.ROW_LIMITS, ROW_STARTS: Gs.ROW_STARTS }, t10 = []; + for (let o of r) + if (o in e) + t10.push(e[o]); + else + break; + return t10; +} +function Qq(r) { + return r.length === 0 ? 0 : r[0] === Gs.FIRST_DIM_SIZE ? r.length - 1 : r.length; +} +function Zq(r, e) { + if (r == null || e == null) + return; + let t10 = r.length, o = e.length; + if (t10 >= o) + throw new Error(`defaultValue.shape=${r} and ragged tensor flatValues.shape=${e}, are incompatible: defaultValue.rank = ${t10} must be less than ragged tensor input flatValues.rank = ${o})`); + for (let n = 0; n < Math.min(t10, o - 1); ++n) { + let s = r[n], a = e[n + 1]; + if (s >= 0 && a >= 0 && s !== 1 && s !== a) + throw new Error(`defaultValue.shape=${r}, and ragged tensor input flatValues.shape=${e} are incompatible: defaultValue.shape[${n - r.length}] = ${s} but ragged tensor input.flatValues.shape[${n - r.length}] = ${a}`); + } +} +var ed = 30; +function Jq(r) { + return r <= ed ? r : sp(r, Math.floor(Math.sqrt(r))); +} +function eK(r, e, t10) { + let o = t10 * (typeof r == "number" ? r : r[0]), n = e * (typeof r == "number" ? r : r[1]); + return [o, n]; +} +function tK(r, e, t10, o = true) { + let n = []; + if (o) + n = n.concat(e.slice(0)), n.push(r[0] / t10), n = n.concat(r.slice(1)); + else { + n = n.concat(r[0]); + let s = e.length; + for (let a = 0; a < s; ++a) + n = n.concat([r[a + 1] / e[a], e[a]]); + n = n.concat(r.slice(s + 1)); + } + return n; +} +function rK(r, e, t10 = true) { + let o = []; + if (t10) { + o.push(e); + for (let n = e + 1; n < r; ++n) + n <= 2 * e ? (o.push(n), o.push(n - (e + 1))) : o.push(n); + } else { + let n = [], s = []; + for (let a = 1; a < r; ++a) + a >= e * 2 + 1 || a % 2 === 1 ? s.push(a) : n.push(a); + o.push(...n), o.push(0), o.push(...s); + } + return o; +} +function oK(r, e, t10, o = true) { + let n = []; + o ? n.push(r[0] / t10) : n.push(r[0] * t10); + for (let s = 1; s < r.length; ++s) + s <= e.length ? o ? n.push(e[s - 1] * r[s]) : n.push(r[s] / e[s - 1]) : n.push(r[s]); + return n; +} +function nK(r, e) { + let t10 = [0]; + for (let o = 0; o < e; ++o) + t10.push(r[o][0]); + return t10; +} +function sK(r, e, t10) { + let o = r.slice(0, 1); + for (let n = 0; n < t10; ++n) + o.push(r[n + 1] - e[n][0] - e[n][1]); + return o; +} +var aK = 1.7580993408473768; +var iK = 1.0507009873554805; +var uK = 0.3275911; +var pK = 0.254829592; +var cK = -0.284496736; +var lK = 1.421413741; +var mK = -1.453152027; +var fK = 1.061405429; +function dK(r, e) { + if (r.length !== e.length) + throw new Error(`Cannot merge real and imag arrays of different lengths. real:${r.length}, imag: ${e.length}.`); + let t10 = new Float32Array(r.length * 2); + for (let o = 0; o < t10.length; o += 2) + t10[o] = r[o / 2], t10[o + 1] = e[o / 2]; + return t10; +} +function hK(r) { + let e = new Float32Array(r.length / 2), t10 = new Float32Array(r.length / 2); + for (let o = 0; o < r.length; o += 2) + e[o / 2] = r[o], t10[o / 2] = r[o + 1]; + return { real: e, imag: t10 }; +} +function gK(r) { + let e = Math.ceil(r.length / 4), t10 = new Float32Array(e), o = new Float32Array(e); + for (let n = 0; n < r.length; n += 4) + t10[Math.floor(n / 4)] = r[n], o[Math.floor(n / 4)] = r[n + 1]; + return { real: t10, imag: o }; +} +function xK(r) { + let e = Math.floor(r.length / 4), t10 = new Float32Array(e), o = new Float32Array(e); + for (let n = 2; n < r.length; n += 4) + t10[Math.floor(n / 4)] = r[n], o[Math.floor(n / 4)] = r[n + 1]; + return { real: t10, imag: o }; +} +function yK(r, e) { + let t10 = r[e * 2], o = r[e * 2 + 1]; + return { real: t10, imag: o }; +} +function bK(r, e, t10, o) { + r[o * 2] = e, r[o * 2 + 1] = t10; +} +function CK(r, e) { + let t10 = new Float32Array(r / 2), o = new Float32Array(r / 2); + for (let n = 0; n < Math.ceil(r / 2); n++) { + let s = (e ? 2 : -2) * Math.PI * (n / r); + t10[n] = Math.cos(s), o[n] = Math.sin(s); + } + return { real: t10, imag: o }; +} +function IK(r, e, t10) { + let o = (t10 ? 2 : -2) * Math.PI * (r / e), n = Math.cos(o), s = Math.sin(o); + return { real: n, imag: s }; +} +var TC = "->"; +var wK = /->/g; +var KT = ","; +var jT = "..."; +function SK(r, e) { + r = r.replace(/\s/g, ""); + let t10 = (r.length - r.replace(wK, "").length) / TC.length; + if (t10 < 1) + throw new Error("Equations without an arrow are not supported."); + if (t10 > 1) + throw new Error(`Equation must contain exactly one arrow ("${TC}").`); + let [o, n] = r.split(TC); + $(o.indexOf(jT) === -1, () => `The ellipsis notation ("${jT}") is not supported yet.`); + let s = o.split(KT), a = s.length; + if (e !== a) + throw new Error(`Expected ${a} input tensors, received ${e}`); + if (a > 2) + throw new Error("Support for more than 2 input tensors is not implemented yet."); + let i = []; + for (let m = 0; m < n.length; ++m) { + let f = n[m]; + if (!s.some((d) => d.indexOf(f) !== -1)) + throw new Error(`Output subscripts contain the label ${f} not present in the input subscripts.`); + i.indexOf(f) === -1 && i.push(f); + } + for (let m = 0; m < o.length; ++m) { + let f = o[m]; + i.indexOf(f) === -1 && f !== KT && i.push(f); + } + let p = new Array(s.length); + for (let m = 0; m < a; ++m) { + if (new Set(s[m].split("")).size !== s[m].length) + throw new Error(`Found duplicate axes in input component ${s[m]}. Support for duplicate axes in input is not implemented yet.`); + p[m] = []; + for (let f = 0; f < s[m].length; ++f) + p[m].push(i.indexOf(s[m][f])); + } + let u = i.length, c = n.length, l = []; + for (let m = c; m < u; ++m) + l.push(m); + return { allDims: i, summedDims: l, idDims: p }; +} +function vK(r, e) { + let t10 = new Array(r); + t10.fill(-1); + for (let n = 0; n < e.length; ++n) + t10[e[n]] = n; + let o = []; + for (let n = 0; n < r; ++n) + t10[n] === -1 && o.push(n); + return t10 = t10.filter((n) => n !== -1), { permutationIndices: t10, expandDims: o }; +} +function kK(r, e, t10) { + let o = new Array(r); + for (let n = 0; n < t10.length; ++n) { + let s = t10[n].shape; + for (let a = 0; a < e[n].length; ++a) + o[e[n][a]] === void 0 ? o[e[n][a]] = s[a] : $(o[e[n][a]] === s[a], () => `Expected dimension ${o[e[n][a]]} at axis ${a} of input shaped ${JSON.stringify(s)}, but got dimension ${s[a]}`); + } +} +function TK(r, e) { + let t10 = r, o = [], n = 0; + r.length === 0 && t10.push(-1), n = r.length + 1; + for (let a = 0; a < n; ++a) + o.push([]); + let s = []; + for (let a = 0; a < t10.length; ++a) { + let i = t10[a], p = _K(e, i); + for (let u of p) + s.indexOf(u) === -1 && (o[a].push(u), s.push(u)); + } + return { path: t10, steps: o }; +} +function NK(r) { + return r.every((e, t10) => e === t10); +} +function _K(r, e) { + let t10 = []; + for (let o = 0; o < r.length; ++o) + (r[o].length === 0 || r[o].indexOf(e) !== -1 || e === -1) && t10.push(o); + return t10; +} +function EK(r, e, t10 = 0) { + let o = []; + if (typeof e == "number") + $(r.shape[t10] % e === 0, () => "Number of splits must evenly divide the axis."), o = new Array(e).fill(r.shape[t10] / e); + else { + let n = e.reduce((a, i) => (i === -1 && (a += 1), a), 0); + $(n <= 1, () => "There should be only one negative value in split array."); + let s = e.indexOf(-1); + if (s !== -1) { + let a = e.reduce((i, p) => p > 0 ? i + p : i); + e[s] = r.shape[t10] - a; + } + $(r.shape[t10] === e.reduce((a, i) => a + i), () => "The sum of sizes must match the size of the axis dimension."), o = e; + } + return o; +} +function $K(r) { + return `Received SparseTensor with denseShape[0] = 0 but + indices.shape[0] = ${r}`; +} +function RK(r, e) { + return `indices(${r}, 0) is invalid: ${e} < 0`; +} +function AK(r, e, t10) { + return `indices(${r}, 0) is invalid: ${e} >= ${t10}`; +} +function FK(r, e) { + return `only one output dimension may be -1, not both ${r} and ${e}`; +} +function DK(r, e) { + return `size ${r} must be non-negative, not ${e}`; +} +function PK() { + return "reshape cannot infer the missing input size for an empty tensor unless all specified input sizes are non-zero"; +} +function OK(r, e) { + let t10 = Ve(r), o = Ve(e); + return `Input to reshape is a SparseTensor with ${t10} + dense values, but the requested shape requires a multiple of ${o}. inputShape=${r} outputShape= ${e}`; +} +function MK(r, e) { + let t10 = Ve(r), o = Ve(e); + return `Input to reshape is a tensor with ${t10} dense values, but the requested shape has ${o}. inputShape=${r} outputShape=${e}`; +} +function LK() { + return "segment ids must be >= 0"; +} +function BK() { + return "segment ids are not increasing"; +} +function VK(r, e) { + return `Segment id ${r} out of range [0, ${e}), possibly because segmentIds input is not sorted.`; +} +function zK(r, e, t10) { + return `Bad: indices[${r}] == ${e} out of range [0, ${t10})`; +} +var NC = {}; +Be(NC, { collectGatherOpShapeInfo: () => GK, computeOutShape: () => UK, segOpComputeOptimalWindowSize: () => WK }); +function WK(r, e) { + let t10 = false, o; + for (r <= ed ? (o = r, t10 = true) : o = sp(r, Math.floor(Math.sqrt(r))); !t10; ) + o > e || o === r ? t10 = true : o = sp(r, o + 1); + return o; +} +function UK(r, e, t10) { + let o = [], n = r.length; + for (let s = 0; s < n; s++) + s !== e ? o.push(r[s]) : o.push(t10); + return o; +} +function GK(r, e, t10, o) { + let n = e.shape.length, s = r.shape.length; + if (o !== 0 && (o < -n || o > n)) + throw new Error(`Expect batchDims in the range of [-${n}, ${n}], but got ${o}`); + if (o < 0 && (o += n), o > s) + throw new Error(`batchDims (${o}) must be less than rank(x) ( + ${s}).`); + if (t10 < o) + throw new Error(`batchDims (${o}) must be less than or equal to axis (${t10}).`); + for (let l = 0; l < o; ++l) + if (r.shape[l] !== e.shape[l]) + throw new Error(`x.shape[${l}]: ${r.shape[l]} should be equal to indices.shape[${l}]: ${e.shape[l]}.`); + let a = r.shape[t10], i = [], p = 1, u = 1, c = 1; + for (let l = 0; l < o; ++l) + i.push(r.shape[l]), p *= r.shape[l]; + for (let l = o; l < t10; l++) + i.push(r.shape[l]), u *= r.shape[l]; + for (let l = o; l < n; l++) + i.push(e.shape[l]); + for (let l = t10 + 1; l < s; l++) + i.push(r.shape[l]), c *= r.shape[l]; + return { batchSize: p, sliceSize: c, outerSize: u, dimSize: a, outputShape: i }; +} +function HK(r) { + try { + return r.map((e) => Op(e)); + } catch (e) { + throw new Error(`Failed to decode encoded string bytes into utf-8, error: ${e}`); + } +} +function qK(r) { + return r.map((e) => si(e)); +} +var Bt = {}; +Be(Bt, { nonMaxSuppressionV3Impl: () => Qf, nonMaxSuppressionV4Impl: () => Zf, nonMaxSuppressionV5Impl: () => Jf, whereImpl: () => Kf }); +var KK = P(); +KK.registerFlag("KEEP_INTERMEDIATE_TENSORS", () => false, (r) => { + r && console.warn("Keep intermediate tensors is ON. This will print the values of all intermediate tensors during model inference. Not all models support this mode. For details, check e2e/benchmarks/ model_config.js. This significantly impacts performance."); +}); +var To; +(function(r) { + r[r.DT_INVALID = 0] = "DT_INVALID", r[r.DT_FLOAT = 1] = "DT_FLOAT", r[r.DT_DOUBLE = 2] = "DT_DOUBLE", r[r.DT_INT32 = 3] = "DT_INT32", r[r.DT_UINT8 = 4] = "DT_UINT8", r[r.DT_INT16 = 5] = "DT_INT16", r[r.DT_INT8 = 6] = "DT_INT8", r[r.DT_STRING = 7] = "DT_STRING", r[r.DT_COMPLEX64 = 8] = "DT_COMPLEX64", r[r.DT_INT64 = 9] = "DT_INT64", r[r.DT_BOOL = 10] = "DT_BOOL", r[r.DT_QINT8 = 11] = "DT_QINT8", r[r.DT_QUINT8 = 12] = "DT_QUINT8", r[r.DT_QINT32 = 13] = "DT_QINT32", r[r.DT_BFLOAT16 = 14] = "DT_BFLOAT16", r[r.DT_QINT16 = 15] = "DT_QINT16", r[r.DT_QUINT16 = 16] = "DT_QUINT16", r[r.DT_UINT16 = 17] = "DT_UINT16", r[r.DT_COMPLEX128 = 18] = "DT_COMPLEX128", r[r.DT_HALF = 19] = "DT_HALF", r[r.DT_RESOURCE = 20] = "DT_RESOURCE", r[r.DT_VARIANT = 21] = "DT_VARIANT", r[r.DT_UINT32 = 22] = "DT_UINT32", r[r.DT_UINT64 = 23] = "DT_UINT64", r[r.DT_FLOAT_REF = 101] = "DT_FLOAT_REF", r[r.DT_DOUBLE_REF = 102] = "DT_DOUBLE_REF", r[r.DT_INT32_REF = 103] = "DT_INT32_REF", r[r.DT_UINT8_REF = 104] = "DT_UINT8_REF", r[r.DT_INT16_REF = 105] = "DT_INT16_REF", r[r.DT_INT8_REF = 106] = "DT_INT8_REF", r[r.DT_STRING_REF = 107] = "DT_STRING_REF", r[r.DT_COMPLEX64_REF = 108] = "DT_COMPLEX64_REF", r[r.DT_INT64_REF = 109] = "DT_INT64_REF", r[r.DT_BOOL_REF = 110] = "DT_BOOL_REF", r[r.DT_QINT8_REF = 111] = "DT_QINT8_REF", r[r.DT_QUINT8_REF = 112] = "DT_QUINT8_REF", r[r.DT_QINT32_REF = 113] = "DT_QINT32_REF", r[r.DT_BFLOAT16_REF = 114] = "DT_BFLOAT16_REF", r[r.DT_QINT16_REF = 115] = "DT_QINT16_REF", r[r.DT_QUINT16_REF = 116] = "DT_QUINT16_REF", r[r.DT_UINT16_REF = 117] = "DT_UINT16_REF", r[r.DT_COMPLEX128_REF = 118] = "DT_COMPLEX128_REF", r[r.DT_HALF_REF = 119] = "DT_HALF_REF", r[r.DT_RESOURCE_REF = 120] = "DT_RESOURCE_REF", r[r.DT_VARIANT_REF = 121] = "DT_VARIANT_REF", r[r.DT_UINT32_REF = 122] = "DT_UINT32_REF", r[r.DT_UINT64_REF = 123] = "DT_UINT64_REF"; +})(To || (To = {})); +var XT; +(function(r) { + let e; + (function(t10) { + t10[t10.LEGACY = 0] = "LEGACY", t10[t10.V1 = 1] = "V1", t10[t10.V2 = 2] = "V2"; + })(e = r.CheckpointFormatVersion || (r.CheckpointFormatVersion = {})); +})(XT || (XT = {})); +var EC = {}; +function XK(r, e) { + let t10 = { tfOpName: r, category: "custom", inputs: [], attrs: [], customExecutor: e }; + EC[r] = t10; +} +function td(r) { + return EC[r]; +} +function YK(r) { + delete EC[r]; +} +function S(r, e, t10, o, n) { + let s = e.inputParams[r]; + if (s && s.inputIndexStart !== void 0) { + let i = s.inputIndexStart, p = s.inputIndexEnd === 0 ? void 0 : s.inputIndexEnd === void 0 ? i + 1 : s.inputIndexEnd; + if (s.type === "tensor") + return Ht(e.inputNames[s.inputIndexStart], t10, o, n); + if (s.type === "tensors") + return e.inputNames.slice(i, p).map((m) => Ht(m, t10, o, n)); + let u = Ht(e.inputNames.slice(i)[0], t10, o, n), c = u.dataSync(); + return s.type === "number" ? c[0] : x.toNestedArray(u.shape, c); + } + let a = e.attrParams[r]; + return a && a.value; +} +function Ht(r, e, t10, o) { + let [n, s] = Sr(r); + if (o != null) { + let i = o.getHashTableHandleByName(n); + if (i != null) + return i; + } + let a = t10.currentContextIds.find((i) => !!e[rd(n, i)]); + return a !== void 0 ? e[rd(n, a)][s] : void 0; +} +function YT(r, e, t10) { + return e[rd(r, t10.currentContextId)]; +} +function zo(r, e) { + let [t10, o, n] = Sr(r); + return [rd(t10, e && e.currentContextId), o, n]; +} +function rd(r, e) { + return e ? `${r}-${e}` : r; +} +function Sr(r) { + let e = r.split(":"); + if (e.length === 1) + return [r, 0, void 0]; + let t10 = e[0], o = e.length === 3 ? e[1] : void 0, n = Number(e[e.length - 1]); + return [t10, n, o]; +} +function gl(r, e, t10) { + let o = S("pad", r, e, t10); + if (o === "explicit") { + o = S("explicitPaddings", r, e, t10); + let n = [[0, 0], [0, 0], [0, 0], [0, 0]]; + for (let s = 0; s < 4; s++) + n[s][0] = o[s * 2], n[s][1] = o[s * 2 + 1]; + return n; + } + return o; +} +function ss(r) { + return r.kept ? r : zr(r); +} +var $C = {}; +Be($C, { json: () => QK }); +var QK = [{ tfOpName: "Add", category: "arithmetic", inputs: [{ start: 0, name: "a", type: "tensor" }, { start: 1, name: "b", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "AddV2", category: "arithmetic", inputs: [{ start: 0, name: "a", type: "tensor" }, { start: 1, name: "b", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "AddN", category: "arithmetic", inputs: [{ start: 0, end: 0, name: "tensors", type: "tensors" }] }, { tfOpName: "BiasAdd", category: "arithmetic", inputs: [{ start: 0, name: "a", type: "tensor" }, { start: 1, name: "b", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }, { tfName: "data_format", name: "dataFormat", type: "string", notSupported: true }] }, { tfOpName: "Sub", category: "arithmetic", inputs: [{ start: 0, name: "a", type: "tensor" }, { start: 1, name: "b", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "RealDiv", category: "arithmetic", inputs: [{ start: 0, name: "a", type: "tensor" }, { start: 1, name: "b", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Div", category: "arithmetic", inputs: [{ start: 0, name: "a", type: "tensor" }, { start: 1, name: "b", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "DivNoNan", category: "arithmetic", inputs: [{ start: 0, name: "a", type: "tensor" }, { start: 1, name: "b", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "FloorDiv", category: "arithmetic", inputs: [{ start: 0, name: "a", type: "tensor" }, { start: 1, name: "b", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Mul", category: "arithmetic", inputs: [{ start: 0, name: "a", type: "tensor" }, { start: 1, name: "b", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Maximum", category: "arithmetic", inputs: [{ start: 0, name: "a", type: "tensor" }, { start: 1, name: "b", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Minimum", category: "arithmetic", inputs: [{ start: 0, name: "a", type: "tensor" }, { start: 1, name: "b", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Pow", category: "arithmetic", inputs: [{ start: 0, name: "a", type: "tensor" }, { start: 1, name: "b", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "SquaredDifference", category: "arithmetic", inputs: [{ start: 0, name: "a", type: "tensor" }, { start: 1, name: "b", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Mod", category: "arithmetic", inputs: [{ start: 0, name: "a", type: "tensor" }, { start: 1, name: "b", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "FloorMod", category: "arithmetic", inputs: [{ start: 0, name: "a", type: "tensor" }, { start: 1, name: "b", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }]; +var RC = {}; +Be(RC, { json: () => ZK }); +var ZK = [{ tfOpName: "Abs", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Acos", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Asin", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Atan", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Atan2", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "y", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Ceil", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "ClipByValue", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "clipValueMin", type: "number" }, { start: 2, name: "clipValueMax", type: "number" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Complex", category: "basic_math", inputs: [{ start: 0, name: "real", type: "tensor" }, { start: 1, name: "imag", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "ComplexAbs", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Cos", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Cosh", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Elu", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Exp", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Floor", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Log", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Imag", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }, { tfName: "Tout", name: "outputType", type: "dtype", notSupported: true }] }, { tfOpName: "Neg", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Real", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }, { tfName: "Tout", name: "outputType", type: "dtype", notSupported: true }] }, { tfOpName: "Prelu", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "alpha", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Relu", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Relu6", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Selu", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Sigmoid", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Sin", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Sinh", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Sqrt", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Rsqrt", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Square", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Tan", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Tanh", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Sign", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Round", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Expm1", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Log1p", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Reciprocal", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Softplus", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Asinh", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Acosh", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Atanh", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Erf", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Prod", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "axes", type: "number[]" }], attrs: [{ tfName: "keep_dims", name: "keepDims", type: "bool", notSupported: true }, { tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "LeakyRelu", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "alpha", name: "alpha", type: "number", defaultValue: 0.2 }, { tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "IsNan", category: "basic_math", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }]; +var AC = {}; +Be(AC, { json: () => JK }); +var JK = [{ tfOpName: "EmptyTensorList", category: "control", inputs: [{ start: 0, name: "elementShape", type: "shape" }, { start: 1, name: "maxNumElements", type: "number" }], attrs: [{ tfName: "element_dtype", name: "elementDType", type: "dtype" }] }, { tfOpName: "LoopCond", category: "control", inputs: [{ start: 0, name: "pred", type: "tensor" }] }, { tfOpName: "Switch", category: "control", inputs: [{ start: 0, name: "data", type: "tensor" }, { start: 1, name: "pred", type: "tensor" }] }, { tfOpName: "Merge", category: "control", inputs: [{ start: 0, end: 0, name: "tensors", type: "tensors" }] }, { tfOpName: "Enter", category: "control", inputs: [{ start: 0, name: "tensor", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }, { tfName: "frame_name", name: "frameName", type: "string" }, { tfName: "is_constant", name: "isConstant", type: "bool" }] }, { tfOpName: "Exit", category: "control", inputs: [{ start: 0, name: "tensor", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "NextIteration", category: "control", inputs: [{ start: 0, name: "tensor", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "TensorArrayV3", category: "control", inputs: [{ start: 0, name: "size", type: "number" }], attrs: [{ tfName: "dtype", name: "dtype", type: "dtype" }, { tfName: "element_shape", name: "elementShape", type: "shape" }, { tfName: "dynamic_size", name: "dynamicSize", type: "bool" }, { tfName: "clear_after_read", name: "clearAfterRead", type: "bool" }, { tfName: "identical_element_shapes", name: "identicalElementShapes", type: "bool" }, { tfName: "tensor_array_name", name: "name", type: "string" }] }, { tfOpName: "TensorArrayWriteV3", category: "control", inputs: [{ start: 0, name: "tensorArrayId", type: "tensor" }, { start: 1, name: "index", type: "number" }, { start: 2, name: "tensor", type: "tensor" }, { start: 3, name: "flowIn", type: "number" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "TensorArrayReadV3", category: "control", inputs: [{ start: 0, name: "tensorArrayId", type: "tensor" }, { start: 1, name: "index", type: "number" }, { start: 2, name: "flowIn", type: "number" }], attrs: [{ tfName: "dtype", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "TensorArrayGatherV3", category: "control", inputs: [{ start: 0, name: "tensorArrayId", type: "tensor" }, { start: 1, name: "indices", type: "number[]" }, { start: 2, name: "flowIn", type: "number" }], attrs: [{ tfName: "dtype", name: "dtype", type: "dtype" }, { tfName: "element_shape", name: "elementShape", type: "shape" }] }, { tfOpName: "TensorArrayScatterV3", category: "control", inputs: [{ start: 0, name: "tensorArrayId", type: "tensor" }, { start: 1, name: "indices", type: "number[]" }, { start: 2, name: "tensor", type: "tensor" }, { start: 3, name: "flowIn", type: "number" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype" }] }, { tfOpName: "TensorArrayConcatV3", category: "control", inputs: [{ start: 0, name: "tensorArrayId", type: "tensor" }, { start: 1, name: "flowIn", type: "number" }], attrs: [{ tfName: "dtype", name: "dtype", type: "dtype" }, { tfName: "element_shape_except0", name: "elementShapeExcept0", type: "shape", notSupported: true }] }, { tfOpName: "TensorArraySplitV3", category: "control", inputs: [{ start: 0, name: "tensorArrayId", type: "tensor" }, { start: 1, name: "tensor", type: "tensor" }, { start: 2, name: "lengths", type: "number[]" }, { start: 3, name: "flowIn", type: "number" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype" }] }, { tfOpName: "TensorArraySizeV3", category: "control", inputs: [{ start: 0, name: "tensorArrayId", type: "tensor" }, { start: 1, name: "flowIn", type: "number" }] }, { tfOpName: "TensorArrayCloseV3", category: "control", inputs: [{ start: 0, name: "tensorArrayId", type: "tensor" }] }, { tfOpName: "StatelessIf", category: "control", inputs: [{ start: 0, name: "cond", type: "tensor" }, { start: 1, end: 0, name: "args", type: "tensors" }], attrs: [{ tfName: "then_branch", name: "thenBranch", type: "func" }, { tfName: "else_branch", name: "elseBranch", type: "func" }] }, { tfOpName: "If", category: "control", inputs: [{ start: 0, name: "cond", type: "tensor" }, { start: 1, end: 0, name: "args", type: "tensors" }], attrs: [{ tfName: "then_branch", name: "thenBranch", type: "func" }, { tfName: "else_branch", name: "elseBranch", type: "func" }] }, { tfOpName: "StatelessWhile", category: "control", inputs: [{ start: 0, end: 0, name: "args", type: "tensors" }], attrs: [{ tfName: "cond", name: "cond", type: "func" }, { tfName: "body", name: "body", type: "func" }] }, { tfOpName: "While", category: "control", inputs: [{ start: 0, end: 0, name: "args", type: "tensors" }], attrs: [{ tfName: "cond", name: "cond", type: "func" }, { tfName: "body", name: "body", type: "func" }] }, { tfOpName: "TensorListScatter", category: "control", inputs: [{ start: 0, name: "tensor", type: "tensor" }, { start: 1, name: "indices", type: "number[]" }, { start: 2, name: "elementShape", type: "shape" }], attrs: [{ tfName: "element_dtype", name: "elementDType", type: "dtype" }] }, { tfOpName: "TensorListScatterV2", category: "control", inputs: [{ start: 0, name: "tensor", type: "tensor" }, { start: 1, name: "indices", type: "number[]" }, { start: 2, name: "elementShape", type: "shape" }, { start: 3, name: "numElements", type: "number" }], attrs: [{ tfName: "element_dtype", name: "elementDType", type: "dtype" }] }, { tfOpName: "TensorListGather", category: "control", inputs: [{ start: 0, name: "tensorListId", type: "tensor" }, { start: 1, name: "indices", type: "number[]" }, { start: 2, name: "elementShape", type: "shape" }], attrs: [{ tfName: "element_dtype", name: "elementDType", type: "dtype" }] }, { tfOpName: "TensorListGetItem", category: "control", inputs: [{ start: 0, name: "tensorListId", type: "tensor" }, { start: 1, name: "index", type: "number" }, { start: 2, name: "elementShape", type: "shape" }], attrs: [{ tfName: "element_dtype", name: "elementDType", type: "dtype" }] }, { tfOpName: "TensorListSetItem", category: "control", inputs: [{ start: 0, name: "tensorListId", type: "tensor" }, { start: 1, name: "index", type: "number" }, { start: 2, name: "tensor", type: "tensor" }], attrs: [{ tfName: "element_dtype", name: "elementDType", type: "dtype" }] }, { tfOpName: "TensorListReserve", category: "control", inputs: [{ start: 0, name: "elementShape", type: "shape" }, { start: 1, name: "numElements", type: "number" }], attrs: [{ tfName: "element_dtype", name: "elementDType", type: "dtype" }] }, { tfOpName: "TensorListFromTensor", category: "control", inputs: [{ start: 0, name: "tensor", type: "tensor" }, { start: 1, name: "elementShape", type: "shape" }], attrs: [{ tfName: "element_dtype", name: "elementDType", type: "dtype" }] }, { tfOpName: "TensorListStack", category: "control", inputs: [{ start: 0, name: "tensorListId", type: "tensor" }, { start: 1, name: "elementShape", type: "shape" }], attrs: [{ tfName: "element_dtype", name: "elementDType", type: "dtype" }, { tfName: "num_elements", name: "numElements", type: "dtype" }] }, { tfOpName: "TensorListSplit", category: "control", inputs: [{ start: 0, name: "tensor", type: "tensor" }, { start: 1, name: "elementShape", type: "shape" }, { start: 2, name: "lengths", type: "number[]" }], attrs: [{ tfName: "element_dtype", name: "elementDType", type: "dtype" }] }, { tfOpName: "TensorListConcat", category: "control", inputs: [{ start: 0, name: "tensorListId", type: "tensor" }], attrs: [{ tfName: "element_shape", name: "elementShape", type: "shape" }, { tfName: "element_dtype", name: "elementDType", type: "dtype" }] }, { tfOpName: "TensorListConcatV2", category: "control", inputs: [{ start: 0, name: "tensorListId", type: "tensor" }], attrs: [{ tfName: "element_shape", name: "elementShape", type: "shape" }, { tfName: "element_dtype", name: "elementDType", type: "dtype" }] }, { tfOpName: "TensorListPopBack", category: "control", inputs: [{ start: 0, name: "tensorListId", type: "tensor" }, { start: 1, name: "elementShape", type: "shape" }], attrs: [{ tfName: "element_dtype", name: "elementDType", type: "dtype" }] }, { tfOpName: "TensorListPushBack", category: "control", inputs: [{ start: 0, name: "tensorListId", type: "tensor" }, { start: 1, name: "tensor", type: "tensor" }], attrs: [{ tfName: "element_dtype", name: "elementDType", type: "dtype" }] }, { tfOpName: "TensorListLength", category: "control", inputs: [{ start: 0, name: "tensorListId", type: "tensor" }] }, { tfOpName: "TensorListResize", category: "control", inputs: [{ start: 0, name: "tensorListId", type: "tensor" }, { start: 1, name: "size", type: "number" }] }]; +var FC = {}; +Be(FC, { json: () => e6 }); +var e6 = [{ tfOpName: "AvgPool", category: "convolution", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "strides", name: "strides", type: "number[]" }, { tfName: "padding", name: "pad", type: "string" }, { tfName: "data_format", name: "dataFormat", type: "string", notSupported: true }, { tfName: "ksize", name: "kernelSize", type: "number[]" }, { tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "MaxPool", category: "convolution", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "strides", name: "strides", type: "number[]" }, { tfName: "padding", name: "pad", type: "string" }, { tfName: "data_format", name: "dataFormat", type: "string", notSupported: true }, { tfName: "ksize", name: "kernelSize", type: "number[]" }, { tfName: "explicit_paddings", name: "explicitPaddings", type: "number[]", defaultValue: [], notSupported: true }, { tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "MaxPoolWithArgmax", category: "convolution", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "strides", name: "strides", type: "number[]" }, { tfName: "padding", name: "pad", type: "string" }, { tfName: "ksize", name: "kernelSize", type: "number[]" }, { tfName: "include_batch_in_index", name: "includeBatchInIndex", type: "bool" }, { tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "AvgPool3D", category: "convolution", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "strides", name: "strides", type: "number[]" }, { tfName: "padding", name: "pad", type: "string" }, { tfName: "data_format", name: "dataFormat", type: "string", notSupported: true }, { tfName: "ksize", name: "kernelSize", type: "number[]" }, { tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "MaxPool3D", category: "convolution", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "strides", name: "strides", type: "number[]" }, { tfName: "padding", name: "pad", type: "string" }, { tfName: "data_format", name: "dataFormat", type: "string", notSupported: true }, { tfName: "ksize", name: "kernelSize", type: "number[]" }, { tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Conv1D", category: "convolution", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "filter", type: "tensor" }], attrs: [{ tfName: "stride", name: "stride", type: "number" }, { tfName: "padding", name: "pad", type: "string" }, { tfName: "data_format", name: "dataFormat", type: "string", defaultValue: "NWC" }, { tfName: "T", name: "dtype", type: "dtype", notSupported: true }, { tfName: "dilation", name: "dilation", type: "number", defaultValue: 1 }] }, { tfOpName: "Conv2D", category: "convolution", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "filter", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }, { tfName: "strides", name: "strides", type: "number[]" }, { tfName: "padding", name: "pad", type: "string" }, { tfName: "useCudnnOnGpu", name: "useCudnnOnGpu", type: "bool" }, { tfName: "data_format", name: "dataFormat", type: "string", defaultValue: "NHWC" }, { tfName: "explicit_paddings", name: "explicitPaddings", type: "number[]", defaultValue: [] }, { tfName: "dilations", name: "dilations", type: "number[]" }] }, { tfOpName: "_FusedConv2D", category: "convolution", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "filter", type: "tensor" }, { start: 2, end: 0, name: "args", type: "tensors" }], attrs: [{ tfName: "num_args", name: "numArgs", type: "number" }, { tfName: "T", name: "dtype", type: "dtype", notSupported: true }, { tfName: "strides", name: "strides", type: "number[]" }, { tfName: "padding", name: "pad", type: "string" }, { tfName: "explicit_paddings", name: "explicitPaddings", type: "number[]", defaultValue: [] }, { tfName: "use_cudnn_on_gpu", name: "useCudnnOnGpu", type: "bool", defaultValue: true }, { tfName: "data_format", name: "dataFormat", type: "string", defaultValue: "NHWC" }, { tfName: "dilations", name: "dilations", type: "number[]", defaultValue: [1, 1, 1, 1] }, { tfName: "fused_ops", name: "fusedOps", type: "string[]", defaultValue: [] }, { tfName: "epsilon", name: "epsilon", type: "number", defaultValue: 1e-4 }, { tfName: "leakyrelu_alpha", name: "leakyreluAlpha", type: "number", defaultValue: 0.2 }] }, { tfOpName: "Conv2DBackpropInput", category: "convolution", inputs: [{ start: 2, name: "x", type: "tensor" }, { start: 1, name: "filter", type: "tensor" }, { start: 0, name: "outputShape", type: "number[]" }], attrs: [{ tfName: "strides", name: "strides", type: "number[]" }, { tfName: "padding", name: "pad", type: "string" }, { tfName: "data_format", name: "dataFormat", type: "string", notSupported: true }, { tfName: "explicit_paddings", name: "explicitPaddings", type: "number[]", defaultValue: [] }, { tfName: "dilations", name: "dilations", type: "number[]", notSupported: true }] }, { tfOpName: "DepthwiseConv2d", category: "convolution", inputs: [{ start: 0, name: "input", type: "tensor" }, { start: 1, name: "filter", type: "tensor" }], attrs: [{ tfName: "strides", name: "strides", type: "number[]" }, { tfName: "padding", name: "pad", type: "string" }, { tfName: "data_format", name: "dataFormat", type: "string", defaultValue: "NHWC" }, { tfName: "explicit_paddings", name: "explicitPaddings", type: "number[]", defaultValue: [] }, { tfName: "dilations", name: "dilations", type: "number[]" }] }, { tfOpName: "DepthwiseConv2dNative", category: "convolution", inputs: [{ start: 0, name: "input", type: "tensor" }, { start: 1, name: "filter", type: "tensor" }], attrs: [{ tfName: "strides", name: "strides", type: "number[]" }, { tfName: "padding", name: "pad", type: "string" }, { tfName: "data_format", name: "dataFormat", type: "string", defaultValue: "NHWC" }, { tfName: "explicit_paddings", name: "explicitPaddings", type: "number[]", defaultValue: [] }, { tfName: "dilations", name: "dilations", type: "number[]" }] }, { tfOpName: "FusedDepthwiseConv2dNative", category: "convolution", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "filter", type: "tensor" }, { start: 2, end: 0, name: "args", type: "tensors" }], attrs: [{ tfName: "num_args", name: "numArgs", type: "number" }, { tfName: "T", name: "dtype", type: "dtype", notSupported: true }, { tfName: "strides", name: "strides", type: "number[]" }, { tfName: "padding", name: "pad", type: "string" }, { tfName: "data_format", name: "dataFormat", type: "string", defaultValue: "NHWC" }, { tfName: "dilations", name: "dilations", type: "number[]", defaultValue: [1, 1, 1, 1] }, { tfName: "fused_ops", name: "fusedOps", type: "string[]", defaultValue: [] }, { tfName: "explicit_paddings", name: "explicitPaddings", type: "number[]", defaultValue: [] }] }, { tfOpName: "Conv3D", category: "convolution", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "filter", type: "tensor" }], attrs: [{ tfName: "strides", name: "strides", type: "number[]" }, { tfName: "padding", name: "pad", type: "string" }, { tfName: "data_format", name: "dataFormat", type: "string", defaultValue: "NHWC" }, { tfName: "dilations", name: "dilations", type: "number[]" }] }, { tfOpName: "Dilation2D", category: "convolution", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "filter", type: "tensor" }], attrs: [{ tfName: "strides", name: "strides", type: "number[]" }, { tfName: "rates", name: "dilations", type: "number[]" }, { tfName: "padding", name: "pad", type: "string" }] }]; +var DC = {}; +Be(DC, { json: () => t6 }); +var t6 = [{ tfOpName: "Fill", category: "creation", inputs: [{ start: 0, name: "shape", type: "number[]" }, { start: 1, name: "value", type: "number" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype" }] }, { tfOpName: "LinSpace", category: "creation", inputs: [{ start: 0, name: "start", type: "number" }, { start: 1, name: "stop", type: "number" }, { start: 2, name: "num", type: "number" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "OneHot", category: "creation", inputs: [{ start: 0, name: "indices", type: "tensor" }, { start: 1, name: "depth", type: "number" }, { start: 2, name: "onValue", type: "number", defaultValue: 1 }, { start: 3, name: "offValue", type: "number", defaultValue: 0 }], attrs: [{ tfName: "axis", name: "axis", type: "number", notSupported: true }, { tfName: "T", name: "dtype", type: "dtype" }] }, { tfOpName: "Ones", category: "creation", inputs: [{ start: 0, name: "shape", type: "number[]" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype" }] }, { tfOpName: "OnesLike", category: "creation", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "dtype", name: "dtype", type: "dtype" }] }, { tfOpName: "RandomStandardNormal", category: "creation", inputs: [{ start: 0, name: "shape", type: "number[]" }], attrs: [{ tfName: "seed", name: "seed", type: "number", defaultValue: 0 }, { tfName: "seed2", name: "seed2", type: "number", defaultValue: 0, notSupported: true }, { tfName: "dtype", name: "dtype", type: "dtype" }, { tfName: "T", name: "T", type: "number", notSupported: true }] }, { tfOpName: "RandomUniform", category: "creation", inputs: [{ start: 0, name: "shape", type: "number[]" }], attrs: [{ tfName: "minval", name: "minval", type: "number", defaultValue: 0 }, { tfName: "maxval", name: "maxval", type: "number", defaultValue: 1 }, { tfName: "dtype", name: "dtype", type: "dtype" }, { tfName: "seed", name: "seed", type: "number", defaultValue: 0 }, { tfName: "seed2", name: "seed2", type: "number", defaultValue: 0, notSupported: true }, { tfName: "T", name: "T", type: "number", notSupported: true }] }, { tfOpName: "Range", category: "creation", inputs: [{ start: 0, name: "start", type: "number" }, { start: 1, name: "stop", type: "number" }, { start: 2, name: "step", type: "number", defaultValue: 0 }], attrs: [{ tfName: "Tidx", name: "dtype", type: "dtype" }] }, { tfOpName: "TruncatedNormal", category: "creation", inputs: [{ start: 0, name: "shape", type: "number[]" }], attrs: [{ tfName: "means", name: "mean", type: "number", defaultValue: 0 }, { tfName: "stddev", name: "stdDev", type: "number", defaultValue: 1 }, { tfName: "seed", name: "seed", type: "number" }, { tfName: "seed2", name: "seed2", type: "number", defaultValue: 0, notSupported: true }, { tfName: "dtype", name: "dtype", type: "dtype" }, { tfName: "T", name: "T", type: "number", notSupported: true }] }, { tfOpName: "Zeros", category: "creation", inputs: [{ start: 0, name: "shape", type: "number[]" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype" }] }, { tfOpName: "ZerosLike", category: "creation", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype" }] }, { tfOpName: "Multinomial", category: "creation", inputs: [{ start: 0, name: "logits", type: "tensor" }, { start: 1, name: "numSamples", type: "number" }], attrs: [{ tfName: "seed", name: "seed", type: "number" }, { tfName: "seed2", name: "seed2", type: "number" }, { tfName: "T", name: "dtype", type: "dtype" }, { tfName: "output_dtype", name: "output_dtype", type: "dtype" }] }]; +var PC = {}; +Be(PC, { json: () => r6 }); +var r6 = [{ tfOpName: "NonMaxSuppressionV2", category: "dynamic", inputs: [{ start: 0, name: "boxes", type: "tensor" }, { start: 1, name: "scores", type: "tensor" }, { start: 2, name: "maxOutputSize", type: "number" }, { start: 3, name: "iouThreshold", type: "number" }] }, { tfOpName: "NonMaxSuppressionV3", category: "dynamic", inputs: [{ start: 0, name: "boxes", type: "tensor" }, { start: 1, name: "scores", type: "tensor" }, { start: 2, name: "maxOutputSize", type: "number" }, { start: 3, name: "iouThreshold", type: "number" }, { start: 4, name: "scoreThreshold", type: "number" }] }, { tfOpName: "NonMaxSuppressionV4", category: "dynamic", inputs: [{ start: 0, name: "boxes", type: "tensor" }, { start: 1, name: "scores", type: "tensor" }, { start: 2, name: "maxOutputSize", type: "number" }, { start: 3, name: "iouThreshold", type: "number" }, { start: 4, name: "scoreThreshold", type: "number" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }, { tfName: "T_threshold", name: "threshold", type: "dtype", notSupported: true }, { tfName: "pad_to_max_output_size", name: "padToMaxOutputSize", type: "bool" }] }, { tfOpName: "NonMaxSuppressionV5", category: "dynamic", inputs: [{ start: 0, name: "boxes", type: "tensor" }, { start: 1, name: "scores", type: "tensor" }, { start: 2, name: "maxOutputSize", type: "number" }, { start: 3, name: "iouThreshold", type: "number" }, { start: 4, name: "scoreThreshold", type: "number" }, { start: 5, name: "softNmsSigma", type: "number" }] }, { tfOpName: "Where", category: "dynamic", inputs: [{ start: 0, name: "condition", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "ListDiff", category: "dynamic", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "y", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }]; +var OC = {}; +Be(OC, { json: () => o6 }); +var o6 = [{ tfOpName: "LowerBound", category: "evaluation", inputs: [{ start: 0, name: "sortedSequence", type: "tensor" }, { start: 1, name: "values", type: "tensor" }] }, { tfOpName: "TopKV2", category: "evaluation", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "k", type: "number" }], attrs: [{ tfName: "sorted", name: "sorted", type: "bool" }] }, { tfOpName: "UpperBound", category: "evaluation", inputs: [{ start: 0, name: "sortedSequence", type: "tensor" }, { start: 1, name: "values", type: "tensor" }] }, { tfOpName: "Unique", category: "evaluation", inputs: [{ start: 0, name: "x", type: "tensor" }] }, { tfOpName: "UniqueV2", category: "evaluation", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "axis", type: "number" }] }]; +var MC = {}; +Be(MC, { json: () => n6 }); +var n6 = [{ tfOpName: "PlaceholderWithDefault", category: "graph", inputs: [{ start: 0, name: "default", type: "tensor" }], attrs: [{ tfName: "shape", name: "shape", type: "shape" }, { tfName: "dtype", name: "dtype", type: "dtype" }] }, { tfOpName: "Placeholder", category: "graph", attrs: [{ tfName: "shape", name: "shape", type: "shape" }, { tfName: "dtype", name: "dtype", type: "dtype" }] }, { tfOpName: "Const", category: "graph" }, { tfOpName: "Identity", category: "graph", inputs: [{ start: 0, name: "x", type: "tensor" }] }, { tfOpName: "IdentityN", category: "graph", inputs: [{ start: 0, end: 0, name: "x", type: "tensors" }] }, { tfOpName: "Snapshot", category: "graph", inputs: [{ start: 0, name: "x", type: "tensor" }] }, { tfOpName: "Rank", category: "graph", inputs: [{ start: 0, name: "x", type: "tensor" }] }, { tfOpName: "Size", category: "graph", inputs: [{ start: 0, name: "x", type: "tensor" }] }, { tfOpName: "Shape", category: "graph", inputs: [{ start: 0, name: "x", type: "tensor" }] }, { tfOpName: "ShapeN", category: "graph", inputs: [{ start: 0, end: 0, name: "x", type: "tensors" }] }, { tfOpName: "Print", category: "graph", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "data", type: "tensors" }], attrs: [{ tfName: "message", name: "message", type: "string" }, { tfName: "first_n", name: "firstN", type: "number", notSupported: true }, { tfName: "summarize", name: "summarize", type: "number", defaultValue: 3 }] }, { tfOpName: "NoOp", category: "graph", inputs: [] }, { tfOpName: "StopGradient", category: "graph", inputs: [{ start: 0, name: "x", type: "tensor" }] }, { tfOpName: "FakeQuantWithMinMaxVars", category: "graph", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "min", name: "min", type: "number" }, { tfName: "max", name: "max", type: "number" }] }]; +var LC = {}; +Be(LC, { json: () => s6 }); +var s6 = [{ tfOpName: "HashTable", category: "hash_table", inputs: [], attrs: [{ tfName: "shared_name", name: "sharedName", type: "string" }, { tfName: "use_node_name_sharing", name: "useNodeNameSharing", type: "bool" }, { tfName: "key_dtype", name: "keyDType", type: "dtype" }, { tfName: "value_dtype", name: "valueDType", type: "dtype" }] }, { tfOpName: "HashTableV2", category: "hash_table", inputs: [], attrs: [{ tfName: "shared_name", name: "sharedName", type: "string" }, { tfName: "use_node_name_sharing", name: "useNodeNameSharing", type: "bool" }, { tfName: "key_dtype", name: "keyDType", type: "dtype" }, { tfName: "value_dtype", name: "valueDType", type: "dtype" }] }, { tfOpName: "LookupTableImport", category: "hash_table", inputs: [{ start: 0, name: "tableHandle", type: "tensor" }, { start: 1, name: "keys", type: "tensor" }, { start: 2, name: "values", type: "tensor" }], attrs: [{ tfName: "Tin", name: "tIn", type: "dtype", notSupported: true }, { tfName: "Tout", name: "tOut", type: "dtype", notSupported: true }] }, { tfOpName: "LookupTableImportV2", category: "hash_table", inputs: [{ start: 0, name: "tableHandle", type: "tensor" }, { start: 1, name: "keys", type: "tensor" }, { start: 2, name: "values", type: "tensor" }], attrs: [{ tfName: "Tin", name: "tIn", type: "dtype", notSupported: true }, { tfName: "Tout", name: "tOut", type: "dtype", notSupported: true }] }, { tfOpName: "LookupTableFind", category: "hash_table", inputs: [{ start: 0, name: "tableHandle", type: "tensor" }, { start: 1, name: "keys", type: "tensor" }, { start: 2, name: "defaultValue", type: "tensor" }], attrs: [{ tfName: "Tin", name: "tIn", type: "dtype", notSupported: true }, { tfName: "Tout", name: "tOut", type: "dtype", notSupported: true }] }, { tfOpName: "LookupTableFindV2", category: "hash_table", inputs: [{ start: 0, name: "tableHandle", type: "tensor" }, { start: 1, name: "keys", type: "tensor" }, { start: 2, name: "defaultValue", type: "tensor" }], attrs: [{ tfName: "Tin", name: "tIn", type: "dtype", notSupported: true }, { tfName: "Tout", name: "tOut", type: "dtype", notSupported: true }] }, { tfOpName: "LookupTableSize", category: "hash_table", inputs: [{ start: 0, name: "tableHandle", type: "tensor" }] }, { tfOpName: "LookupTableSizeV2", category: "hash_table", inputs: [{ start: 0, name: "tableHandle", type: "tensor" }] }]; +var BC = {}; +Be(BC, { json: () => a6 }); +var a6 = [{ tfOpName: "ResizeBilinear", category: "image", inputs: [{ start: 0, name: "images", type: "tensor" }, { start: 1, name: "size", type: "number[]" }], attrs: [{ tfName: "align_corners", name: "alignCorners", type: "bool" }, { tfName: "half_pixel_centers", name: "halfPixelCenters", type: "bool" }, { tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "ResizeNearestNeighbor", category: "image", inputs: [{ start: 0, name: "images", type: "tensor" }, { start: 1, name: "size", type: "number[]" }], attrs: [{ tfName: "align_corners", name: "alignCorners", type: "bool" }, { tfName: "half_pixel_centers", name: "halfPixelCenters", type: "bool" }, { tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "CropAndResize", category: "image", inputs: [{ start: 0, name: "image", type: "tensor" }, { start: 1, name: "boxes", type: "tensor" }, { start: 2, name: "boxInd", type: "tensor" }, { start: 3, name: "cropSize", type: "number[]" }], attrs: [{ tfName: "method", name: "method", type: "string" }, { tfName: "extrapolation_value", name: "extrapolationValue", type: "number" }] }, { tfOpName: "ImageProjectiveTransformV3", category: "image", inputs: [{ start: 0, name: "images", type: "tensor" }, { start: 1, name: "transforms", type: "tensor" }, { start: 2, name: "outputShape", type: "number[]" }, { start: 3, name: "fillValue", type: "number" }], attrs: [{ tfName: "interpolation", name: "interpolation", type: "string" }, { tfName: "fill_mode", name: "fillMode", type: "string" }] }]; +var VC = {}; +Be(VC, { json: () => i6 }); +var i6 = [{ tfOpName: "Equal", category: "logical", inputs: [{ start: 0, name: "a", type: "tensor" }, { start: 1, name: "b", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "NotEqual", category: "logical", inputs: [{ start: 0, name: "a", type: "tensor" }, { start: 1, name: "b", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Greater", category: "logical", inputs: [{ start: 0, name: "a", type: "tensor" }, { start: 1, name: "b", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "GreaterEqual", category: "logical", inputs: [{ start: 0, name: "a", type: "tensor" }, { start: 1, name: "b", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Less", category: "logical", inputs: [{ start: 0, name: "a", type: "tensor" }, { start: 1, name: "b", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "LessEqual", category: "logical", inputs: [{ start: 0, name: "a", type: "tensor" }, { start: 1, name: "b", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "LogicalAnd", category: "logical", inputs: [{ start: 0, name: "a", type: "tensor" }, { start: 1, name: "b", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "LogicalNot", category: "logical", inputs: [{ start: 0, name: "a", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "LogicalOr", category: "logical", inputs: [{ start: 0, name: "a", type: "tensor" }, { start: 1, name: "b", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Select", category: "logical", inputs: [{ start: 0, name: "condition", type: "tensor" }, { start: 1, name: "a", type: "tensor" }, { start: 2, name: "b", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "SelectV2", category: "logical", inputs: [{ start: 0, name: "condition", type: "tensor" }, { start: 1, name: "a", type: "tensor" }, { start: 2, name: "b", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }]; +var zC = {}; +Be(zC, { json: () => u6 }); +var u6 = [{ tfOpName: "_FusedMatMul", category: "matrices", inputs: [{ start: 0, name: "a", type: "tensor" }, { start: 1, name: "b", type: "tensor" }, { start: 2, end: 0, name: "args", type: "tensors" }], attrs: [{ tfName: "num_args", name: "numArgs", type: "number" }, { tfName: "fused_ops", name: "fusedOps", type: "string[]", defaultValue: [] }, { tfName: "epsilon", name: "epsilon", type: "number", defaultValue: 1e-4 }, { tfName: "transpose_a", name: "transposeA", type: "bool", defaultValue: false }, { tfName: "transpose_b", name: "transposeB", type: "bool", defaultValue: false }, { tfName: "leakyrelu_alpha", name: "leakyreluAlpha", type: "number", defaultValue: 0.2 }, { tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "MatMul", category: "matrices", inputs: [{ start: 0, name: "a", type: "tensor" }, { start: 1, name: "b", type: "tensor" }], attrs: [{ tfName: "transpose_a", name: "transposeA", type: "bool", defaultValue: false }, { tfName: "transpose_b", name: "transposeB", type: "bool", defaultValue: false }, { tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "BatchMatMul", category: "matrices", inputs: [{ start: 0, name: "a", type: "tensor" }, { start: 1, name: "b", type: "tensor" }], attrs: [{ tfName: "adj_x", name: "transposeA", type: "bool", defaultValue: false }, { tfName: "adj_y", name: "transposeB", type: "bool", defaultValue: false }, { tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "BatchMatMulV2", category: "matrices", inputs: [{ start: 0, name: "a", type: "tensor" }, { start: 1, name: "b", type: "tensor" }], attrs: [{ tfName: "adj_x", name: "transposeA", type: "bool", defaultValue: false }, { tfName: "adj_y", name: "transposeB", type: "bool", defaultValue: false }, { tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Transpose", category: "matrices", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "perm", type: "number[]" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "Einsum", category: "matrices", inputs: [{ start: 0, end: 0, name: "tensors", type: "tensors" }], attrs: [{ tfName: "equation", name: "equation", type: "string" }, { tfName: "N", name: "n", type: "number", defaultValue: 2 }, { tfName: "T", name: "dtype", type: "dtype" }] }]; +var WC = {}; +Be(WC, { json: () => p6 }); +var p6 = [{ tfOpName: "EuclideanNorm", category: "normalization", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "axis", type: "number[]" }], attrs: [{ tfName: "keep_dims", name: "keepDims", type: "bool", defaultValue: false }] }, { tfOpName: "FusedBatchNorm", category: "normalization", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "scale", type: "tensor" }, { start: 2, name: "offset", type: "tensor" }, { start: 3, name: "mean", type: "tensor" }, { start: 4, name: "variance", type: "tensor" }], attrs: [{ tfName: "epsilon", name: "epsilon", type: "number", defaultValue: 1e-3 }, { tfName: "data_format", name: "dataFormat", type: "string", notSupported: true }] }, { tfOpName: "FusedBatchNormV2", category: "normalization", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "scale", type: "tensor" }, { start: 2, name: "offset", type: "tensor" }, { start: 3, name: "mean", type: "tensor" }, { start: 4, name: "variance", type: "tensor" }], attrs: [{ tfName: "epsilon", name: "epsilon", type: "number", defaultValue: 1e-3 }, { tfName: "data_format", name: "dataFormat", type: "string", notSupported: true }] }, { tfOpName: "FusedBatchNormV3", category: "normalization", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "scale", type: "tensor" }, { start: 2, name: "offset", type: "tensor" }, { start: 3, name: "mean", type: "tensor" }, { start: 4, name: "variance", type: "tensor" }], attrs: [{ tfName: "epsilon", name: "epsilon", type: "number", defaultValue: 1e-3 }, { tfName: "data_format", name: "dataFormat", type: "string", notSupported: true }] }, { tfOpName: "LRN", category: "normalization", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "depth_radius", name: "radius", type: "number", defaultValue: 5 }, { tfName: "bias", name: "bias", type: "number", defaultValue: 1 }, { tfName: "alpha", name: "alpha", type: "number", defaultValue: 1 }, { tfName: "beta", name: "beta", type: "number", defaultValue: 0.5 }] }, { tfOpName: "Softmax", category: "normalization", inputs: [{ start: 0, name: "x", type: "tensor" }] }, { tfOpName: "LogSoftmax", category: "normalization", inputs: [{ start: 0, name: "x", type: "tensor" }] }, { tfOpName: "SparseToDense", category: "normalization", inputs: [{ start: 0, name: "sparseIndices", type: "tensor" }, { start: 1, name: "outputShape", type: "number[]" }, { start: 2, name: "sparseValues", type: "tensor" }, { start: 3, name: "defaultValue", type: "tensor" }], attrs: [{ tfName: "validate_indices", name: "validateIndices", type: "bool", defaultValue: true, notSupported: true }] }]; +var UC = {}; +Be(UC, { json: () => c6 }); +var c6 = [{ tfOpName: "Bincount", category: "reduction", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "size", type: "number" }, { start: 2, name: "weights", type: "tensor" }] }, { tfOpName: "DenseBincount", category: "reduction", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "size", type: "number" }, { start: 2, name: "weights", type: "tensor" }], attrs: [{ tfName: "binary_output", name: "binaryOutput", type: "bool" }] }, { tfOpName: "Max", category: "reduction", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "axis", type: "number[]" }], attrs: [{ tfName: "keep_dims", name: "keepDims", type: "bool" }] }, { tfOpName: "Mean", category: "reduction", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "axis", type: "number[]" }], attrs: [{ tfName: "keep_dims", name: "keepDims", type: "bool" }] }, { tfOpName: "Min", category: "reduction", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "axis", type: "number[]" }], attrs: [{ tfName: "keep_dims", name: "keepDims", type: "bool" }] }, { tfOpName: "Sum", category: "reduction", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "axis", type: "number[]" }], attrs: [{ tfName: "keep_dims", name: "keepDims", type: "bool" }] }, { tfOpName: "All", category: "reduction", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "axis", type: "number[]" }], attrs: [{ tfName: "keep_dims", name: "keepDims", type: "bool" }] }, { tfOpName: "Any", category: "reduction", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "axis", type: "number[]" }], attrs: [{ tfName: "keep_dims", name: "keepDims", type: "bool" }] }, { tfOpName: "ArgMax", category: "reduction", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "axis", type: "number" }] }, { tfOpName: "ArgMin", category: "reduction", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "axis", type: "number" }] }, { tfOpName: "Prod", category: "reduction", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "axis", type: "number[]" }], attrs: [{ tfName: "keep_dims", name: "keepDims", type: "bool" }] }, { tfOpName: "Cumprod", category: "reduction", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "axis", type: "number" }], attrs: [{ tfName: "exclusive", name: "exclusive", type: "bool" }, { tfName: "reverse", name: "reverse", type: "bool" }] }, { tfOpName: "Cumsum", category: "reduction", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "axis", type: "number" }], attrs: [{ tfName: "exclusive", name: "exclusive", type: "bool" }, { tfName: "reverse", name: "reverse", type: "bool" }] }]; +var GC = {}; +Be(GC, { json: () => l6 }); +var l6 = [{ tfOpName: "ConcatV2", category: "slice_join", inputs: [{ start: 0, end: -1, name: "tensors", type: "tensors" }, { start: -1, name: "axis", type: "number" }], attrs: [{ tfName: "N", name: "n", type: "number", defaultValue: 2 }] }, { tfOpName: "Concat", category: "slice_join", inputs: [{ start: 1, end: 0, name: "tensors", type: "tensors" }, { start: 0, name: "axis", type: "number" }], attrs: [{ tfName: "N", name: "n", type: "number", defaultValue: 2 }] }, { tfOpName: "GatherV2", category: "slice_join", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "indices", type: "tensor" }, { start: 2, name: "axis", type: "number", defaultValue: 0 }], attrs: [{ tfName: "batch_dims", name: "batchDims", type: "number", defaultValue: 0 }] }, { tfOpName: "Gather", category: "slice_join", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "indices", type: "tensor" }], attrs: [{ tfName: "validate_indices", name: "validateIndices", type: "bool", notSupported: true }] }, { tfOpName: "Reverse", category: "slice_join", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "dims", type: "bool[]" }] }, { tfOpName: "ReverseV2", category: "slice_join", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "axis", type: "number[]" }] }, { tfOpName: "Slice", category: "slice_join", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "begin", type: "number[]" }, { start: 2, name: "size", type: "number[]" }] }, { tfOpName: "StridedSlice", category: "slice_join", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "begin", type: "number[]" }, { start: 2, name: "end", type: "number[]" }, { start: 3, name: "strides", type: "number[]" }], attrs: [{ tfName: "begin_mask", name: "beginMask", type: "number", defaultValue: 0 }, { tfName: "end_mask", name: "endMask", type: "number", defaultValue: 0 }, { tfName: "new_axis_mask", name: "newAxisMask", type: "number", defaultValue: 0 }, { tfName: "ellipsis_mask", name: "ellipsisMask", type: "number", defaultValue: 0 }, { tfName: "shrink_axis_mask", name: "shrinkAxisMask", type: "number", defaultValue: 0 }] }, { tfOpName: "Pack", category: "slice_join", inputs: [{ start: 0, end: 0, name: "tensors", type: "tensors" }], attrs: [{ tfName: "axis", name: "axis", type: "number", defaultValue: 0 }] }, { tfOpName: "Unpack", category: "slice_join", inputs: [{ start: 0, name: "tensor", type: "tensor" }], attrs: [{ tfName: "axis", name: "axis", type: "number", defaultValue: 0 }, { tfName: "num", name: "num", type: "number", defaultValue: 0, notSupported: true }] }, { tfOpName: "Tile", category: "slice_join", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "reps", type: "number[]" }] }, { tfOpName: "Split", category: "slice_join", inputs: [{ start: 0, name: "axis", type: "number", defaultValue: 0 }, { start: 1, name: "x", type: "tensor" }], attrs: [{ tfName: "num_split", name: "numOrSizeSplits", type: "number", defaultValue: 1 }] }, { tfOpName: "SplitV", category: "slice_join", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "numOrSizeSplits", type: "number[]" }, { start: 2, name: "axis", type: "number", defaultValue: 0 }] }, { tfOpName: "ScatterNd", category: "slice_join", inputs: [{ start: 0, name: "indices", type: "tensor" }, { start: 1, name: "values", type: "tensor" }, { start: 2, name: "shape", type: "number[]" }] }, { tfOpName: "GatherNd", category: "slice_join", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "indices", type: "tensor" }] }, { tfOpName: "SparseToDense", category: "slice_join", inputs: [{ start: 0, name: "sparseIndices", type: "tensor" }, { start: 1, name: "outputShape", type: "number[]" }, { start: 2, name: "sparseValues", type: "tensor" }, { start: 3, name: "defaultValue", type: "tensor" }], attrs: [{ tfName: "validate_indices", name: "validateIndices", type: "bool", defaultValue: false, notSupported: true }] }]; +var HC = {}; +Be(HC, { json: () => m6 }); +var m6 = [{ tfOpName: "SparseFillEmptyRows", category: "sparse", inputs: [{ start: 0, name: "indices", type: "tensor" }, { start: 1, name: "values", type: "tensor" }, { start: 2, name: "denseShape", type: "tensor" }, { start: 3, name: "defaultValue", type: "tensor" }] }, { tfOpName: "SparseReshape", category: "sparse", inputs: [{ start: 0, name: "inputIndices", type: "tensor" }, { start: 1, name: "inputShape", type: "tensor" }, { start: 2, name: "newShape", type: "tensor" }], attrs: [{ tfName: "T", name: "dtype", type: "dtype", notSupported: true }] }, { tfOpName: "SparseSegmentMean", category: "sparse", inputs: [{ start: 0, name: "data", type: "tensor" }, { start: 1, name: "indices", type: "tensor" }, { start: 2, name: "segmentIds", type: "tensor" }] }, { tfOpName: "SparseSegmentSum", category: "sparse", inputs: [{ start: 0, name: "data", type: "tensor" }, { start: 1, name: "indices", type: "tensor" }, { start: 2, name: "segmentIds", type: "tensor" }] }]; +var qC = {}; +Be(qC, { json: () => f6 }); +var f6 = [{ tfOpName: "FFT", category: "spectral", inputs: [{ start: 0, name: "x", type: "tensor" }] }, { tfOpName: "IFFT", category: "spectral", inputs: [{ start: 0, name: "x", type: "tensor" }] }, { tfOpName: "RFFT", category: "spectral", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "fft_length", type: "number", notSupported: true }] }, { tfOpName: "IRFFT", category: "spectral", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "fft_length", type: "number", notSupported: true }] }]; +var KC = {}; +Be(KC, { json: () => d6 }); +var d6 = [{ tfOpName: "StringNGrams", category: "string", inputs: [{ start: 0, name: "data", type: "tensor" }, { start: 1, name: "dataSplits", type: "tensor" }], attrs: [{ tfName: "separator", name: "separator", type: "string" }, { tfName: "ngram_widths", name: "nGramWidths", type: "number[]" }, { tfName: "left_pad", name: "leftPad", type: "string" }, { tfName: "right_pad", name: "rightPad", type: "string" }, { tfName: "pad_width", name: "padWidth", type: "number" }, { tfName: "preserve_short_sequences", name: "preserveShortSequences", type: "bool" }], outputs: ["ngrams", "ngrams_splits"] }, { tfOpName: "StringSplit", category: "string", inputs: [{ start: 0, name: "input", type: "tensor" }, { start: 1, name: "delimiter", type: "tensor" }], attrs: [{ tfName: "skip_empty", name: "skipEmpty", type: "bool" }], outputs: ["indices", "values", "shape"] }, { tfOpName: "StringToHashBucketFast", category: "string", inputs: [{ start: 0, name: "input", type: "tensor" }], attrs: [{ tfName: "num_buckets", name: "numBuckets", type: "number" }] }]; +var jC = {}; +Be(jC, { json: () => h6 }); +var h6 = [{ tfOpName: "Cast", category: "transformation", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "SrcT", name: "sdtype", type: "dtype", notSupported: true }, { tfName: "DstT", name: "dtype", type: "dtype" }] }, { tfOpName: "ExpandDims", category: "transformation", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "axis", type: "number" }] }, { tfOpName: "MirrorPad", category: "transformation", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "padding", type: "number[]" }], attrs: [{ tfName: "mode", name: "mode", type: "string" }] }, { tfOpName: "Pad", category: "transformation", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "padding", type: "number[]" }], attrs: [{ tfName: "constant_value", name: "constantValue", type: "number", defaultValue: 0 }] }, { tfOpName: "PadV2", category: "transformation", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "padding", type: "number[]" }, { start: 2, name: "constantValue", type: "number", defaultValue: 0 }] }, { tfOpName: "Reshape", category: "transformation", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "shape", type: "number[]" }] }, { tfOpName: "Squeeze", category: "transformation", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "axis", tfDeprecatedName: "squeeze_dims", name: "axis", type: "number[]" }] }, { tfOpName: "SpaceToBatchND", category: "transformation", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "blockShape", type: "number[]" }, { start: 2, name: "paddings", type: "number[]" }] }, { tfOpName: "BatchToSpaceND", category: "transformation", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "blockShape", type: "number[]" }, { start: 2, name: "crops", type: "number[]" }] }, { tfOpName: "DepthToSpace", category: "transformation", inputs: [{ start: 0, name: "x", type: "tensor" }], attrs: [{ tfName: "block_size", name: "blockSize", type: "number" }, { tfName: "data_format", name: "dataFormat", type: "string" }] }, { tfOpName: "BroadcastTo", category: "transformation", inputs: [{ start: 0, name: "x", type: "tensor" }, { start: 1, name: "shape", type: "number[]" }], attrs: [] }, { tfOpName: "BroadcastArgs", category: "transformation", inputs: [{ start: 0, name: "s0", type: "tensor" }, { start: 1, name: "s1", type: "tensor" }], attrs: [] }]; +var xl = class { + constructor() { + let e = [$C, RC, AC, FC, DC, PC, OC, MC, LC, BC, VC, zC, WC, UC, GC, HC, qC, KC, jC], t10 = [].concat(...e.map((o) => o.json)); + this.opMappers = t10.reduce((o, n) => (o[n.tfOpName] = n, o), {}); + } + static get Instance() { + return this._instance || (this._instance = new this()); + } + transformGraph(e, t10 = {}) { + let o = e.node, n = [], s = [], a = [], i = o.reduce((h, g) => (h[g.name] = this.mapNode(g), g.op.startsWith("Placeholder") ? n.push(h[g.name]) : g.op === "Const" ? s.push(h[g.name]) : (g.input == null || g.input.length === 0) && a.push(h[g.name]), h), {}), p = [], u = [], c = {}, l = {}; + t10 != null && (c = this.mapSignatureEntries(t10.inputs), l = this.mapSignatureEntries(t10.outputs)); + let m = Object.keys(i); + m.forEach((h) => { + let g = i[h]; + g.inputNames.forEach((y, b) => { + let [C, , w] = zo(y), k = i[C]; + if (k.outputs != null) { + let _ = k.outputs.indexOf(w); + if (_ !== -1) { + let E = `${C}:${_}`; + g.inputNames[b] = E; + } + } + g.inputs.push(k), k.children.push(g); + }); + }), Object.keys(l).length === 0 ? m.forEach((h) => { + let g = i[h]; + g.children.length === 0 && u.push(g); + }) : Object.keys(l).forEach((h) => { + let [g] = zo(h), y = i[g]; + y != null && (y.signatureKey = l[h], u.push(y)); + }), Object.keys(c).length > 0 ? Object.keys(c).forEach((h) => { + let [g] = zo(h), y = i[g]; + y && (y.signatureKey = c[h], p.push(y)); + }) : p = n; + let f = {}; + e.library != null && e.library.function != null && (f = e.library.function.reduce((h, g) => (h[g.signature.name] = this.mapFunction(g), h), {})); + let d = { nodes: i, inputs: p, outputs: u, weights: s, placeholders: n, signature: t10, functions: f }; + return a.length > 0 && (d.initNodes = a), d; + } + mapSignatureEntries(e) { + return Object.keys(e || {}).reduce((t10, o) => (t10[e[o].name] = o, t10), {}); + } + mapNode(e) { + let t10 = td(e.op) || this.opMappers[e.op] || {}; + e.attr == null && (e.attr = {}); + let o = { name: e.name, op: e.op, category: t10.category, inputNames: (e.input || []).map((n) => n.startsWith("^") ? n.slice(1) : n), inputs: [], children: [], inputParams: {}, attrParams: {}, rawAttrs: e.attr, outputs: t10.outputs }; + return t10.inputs != null && (o.inputParams = t10.inputs.reduce((n, s) => (n[s.name] = { type: s.type, inputIndexStart: s.start, inputIndexEnd: s.end }, n), {})), t10.attrs != null && (o.attrParams = t10.attrs.reduce((n, s) => { + let a = s.type, i; + switch (s.type) { + case "string": + i = od(e.attr, s.tfName, s.defaultValue), i === void 0 && !!s.tfDeprecatedName && (i = od(e.attr, s.tfDeprecatedName, s.defaultValue)); + break; + case "string[]": + i = cd(e.attr, s.tfName, s.defaultValue), i === void 0 && !!s.tfDeprecatedName && (i = cd(e.attr, s.tfDeprecatedName, s.defaultValue)); + break; + case "number": + i = sd(e.attr, s.tfName, s.defaultValue || 0), i === void 0 && !!s.tfDeprecatedName && (i = sd(e.attr, s.tfDeprecatedName, s.defaultValue)); + break; + case "number[]": + i = pd(e.attr, s.tfName, s.defaultValue), i === void 0 && !!s.tfDeprecatedName && (i = pd(e.attr, s.tfDeprecatedName, s.defaultValue)); + break; + case "bool": + i = nd(e.attr, s.tfName, s.defaultValue), i === void 0 && !!s.tfDeprecatedName && (i = nd(e.attr, s.tfDeprecatedName, s.defaultValue)); + break; + case "bool[]": + i = md(e.attr, s.tfName, s.defaultValue), i === void 0 && !!s.tfDeprecatedName && (i = md(e.attr, s.tfDeprecatedName, s.defaultValue)); + break; + case "shape": + i = ud(e.attr, s.tfName, s.defaultValue), i === void 0 && !!s.tfDeprecatedName && (i = ud(e.attr, s.tfDeprecatedName, s.defaultValue)); + break; + case "shape[]": + i = ld(e.attr, s.tfName, s.defaultValue), i === void 0 && !!s.tfDeprecatedName && (i = ld(e.attr, s.tfDeprecatedName, s.defaultValue)); + break; + case "dtype": + i = ad(e.attr, s.tfName, s.defaultValue), i === void 0 && !!s.tfDeprecatedName && (i = ad(e.attr, s.tfDeprecatedName, s.defaultValue)); + break; + case "dtype[]": + i = id(e.attr, s.tfName, s.defaultValue), i === void 0 && !!s.tfDeprecatedName && (i = id(e.attr, s.tfDeprecatedName, s.defaultValue)); + break; + case "func": + i = QT(e.attr, s.tfName, s.defaultValue), i === void 0 && !!s.tfDeprecatedName && (i = QT(e.attr, s.tfDeprecatedName, s.defaultValue)); + break; + case "tensor": + case "tensors": + break; + default: + throw new Error(`Unsupported param type: ${s.type} for op: ${e.op}`); + } + return n[s.name] = { value: i, type: a }, n; + }, {})), o; + } + mapFunction(e) { + let t10 = e.nodeDef, o = [], n = [], s = {}; + t10 != null && (s = t10.reduce((l, m) => (l[m.name] = this.mapNode(m), m.op === "Const" && n.push(l[m.name]), l), {})); + let a = [], i = []; + e.signature.inputArg.forEach((l) => { + let [m] = zo(l.name), f = { name: m, op: "Placeholder", inputs: [], inputNames: [], category: "graph", inputParams: {}, attrParams: { dtype: { value: XC(l.type), type: "dtype" } }, children: [] }; + f.signatureKey = l.name, a.push(f), s[m] = f; + }), Object.keys(s).forEach((l) => { + let m = s[l]; + m.inputNames.forEach((f, d) => { + let [h, , g] = zo(f), y = s[h]; + if (y.outputs != null) { + let b = y.outputs.indexOf(g); + if (b !== -1) { + let C = `${h}:${b}`; + m.inputNames[d] = C; + } + } + m.inputs.push(y), y.children.push(m); + }); + }); + let u = e.ret; + e.signature.outputArg.forEach((l) => { + let [m, f] = zo(u[l.name]), d = s[m]; + d != null && (d.defaultOutput = f, i.push(d)); + }); + let c = this.mapArgsToSignature(e); + return { nodes: s, inputs: a, outputs: i, weights: n, placeholders: o, signature: c }; + } + mapArgsToSignature(e) { + return { methodName: e.signature.name, inputs: e.signature.inputArg.reduce((t10, o) => (t10[o.name] = this.mapArgToTensorInfo(o), t10), {}), outputs: e.signature.outputArg.reduce((t10, o) => (t10[o.name] = this.mapArgToTensorInfo(o, e.ret), t10), {}) }; + } + mapArgToTensorInfo(e, t10) { + let o = e.name; + return t10 != null && (o = t10[o]), { name: o, dtype: e.type }; + } +}; +function g6(r) { + let e = P().global; + if (typeof e.atob != "undefined") + return e.atob(r); + if (typeof Buffer != "undefined") + return new Buffer(r, "base64").toString(); + throw new Error("Unable to decode base64 in this environment. Missing built-in atob() or Buffer()"); +} +function ZT(r, e) { + let t10 = Array.isArray(r) ? String.fromCharCode.apply(null, r) : g6(r); + return e ? t10 : t10.toLowerCase(); +} +function od(r, e, t10, o = false) { + let n = r[e]; + return n != null ? ZT(n.s, o) : t10; +} +function nd(r, e, t10) { + let o = r[e]; + return o ? o.b : t10; +} +function sd(r, e, t10) { + let o = r[e] || {}, n = o.i != null ? o.i : o.f != null ? o.f : t10; + return typeof n == "number" ? n : parseInt(n, 10); +} +function XC(r) { + switch (typeof r == "string" && (r = To[r]), r) { + case To.DT_FLOAT: + case To.DT_HALF: + return "float32"; + case To.DT_INT32: + case To.DT_INT64: + case To.DT_INT8: + case To.DT_UINT8: + return "int32"; + case To.DT_BOOL: + return "bool"; + case To.DT_DOUBLE: + return "float32"; + case To.DT_STRING: + return "string"; + default: + return null; + } +} +function QT(r, e, t10) { + let o = r[e]; + return o && o.func ? o.func.name : t10; +} +function ad(r, e, t10) { + let o = r[e]; + return o && o.type ? XC(o.type) : t10; +} +function id(r, e, t10) { + let o = r[e]; + return o && o.list && o.list.type ? o.list.type.map((n) => XC(n)) : t10; +} +function JT(r) { + if (!r.unknownRank) + return r.dim != null ? r.dim.map((e) => typeof e.size == "number" ? e.size : parseInt(e.size, 10)) : []; +} +function ud(r, e, t10) { + let o = r[e]; + return o && o.shape ? JT(o.shape) : t10; +} +function pd(r, e, t10) { + let o = r[e]; + return o ? ((o.list.f && o.list.f.length ? o.list.f : o.list.i) || []).map((n) => typeof n == "number" ? n : parseInt(n, 10)) : t10; +} +function cd(r, e, t10, o = false) { + let n = r[e]; + return n && n.list && n.list.s ? n.list.s.map((s) => ZT(s, o)) : t10; +} +function ld(r, e, t10) { + let o = r[e]; + return o && o.list && o.list.shape ? o.list.shape.map((n) => JT(n)) : t10; +} +function md(r, e, t10) { + let o = r[e]; + return o && o.list && o.list.b ? o.list.b : t10; +} +var fd = class { + constructor(e, t10, o) { + this.node = e, this.tensorMap = t10, this.context = o, this.inputs = [], this.attrs = {}, this.inputs = e.inputNames.map((n) => this.getInput(n)), e.rawAttrs != null && (this.attrs = Object.keys(e.rawAttrs).reduce((n, s) => (n[s] = this.getAttr(s), n), {})); + } + getInput(e) { + return Ht(e, this.tensorMap, this.context); + } + getAttr(e, t10) { + let o = this.node.rawAttrs[e]; + if (o.tensor != null) + return Ht(e, this.tensorMap, this.context); + if (o.i != null || o.f != null) + return sd(this.node.rawAttrs, e, t10); + if (o.s != null) + return od(this.node.rawAttrs, e, t10); + if (o.b != null) + return nd(this.node.rawAttrs, e, t10); + if (o.shape != null) + return ud(this.node.rawAttrs, e, t10); + if (o.type != null) + return ad(this.node.rawAttrs, e, t10); + if (o.list != null) { + if (o.list.i != null || o.list.f != null) + return pd(this.node.rawAttrs, e, t10); + if (o.list.s != null) + return cd(this.node.rawAttrs, e, t10); + if (o.list.shape != null) + return ld(this.node.rawAttrs, e, t10); + if (o.list.b != null) + return md(this.node.rawAttrs, e, t10); + if (o.list.type != null) + return id(this.node.rawAttrs, e, t10); + } + return t10; + } +}; +var rt = {}; +Be(rt, { OP_SCOPE_SUFFIX: () => Ub, abs: () => Qt, acos: () => Vv, acosh: () => zv, add: () => ge, addN: () => Wv, all: () => Uv, any: () => Gv, argMax: () => Hv, argMin: () => qv, asin: () => Kv, asinh: () => jv, atan: () => Xv, atan2: () => Yv, atanh: () => Qv, avgPool: () => mf, avgPool3d: () => ek, basicLSTMCell: () => tk, batchNorm: () => li, batchNorm2d: () => ok, batchNorm3d: () => nk, batchNorm4d: () => sk, batchToSpaceND: () => ff, bincount: () => df, booleanMaskAsync: () => _H, broadcastArgs: () => ak, broadcastTo: () => Ls, buffer: () => ne, cast: () => qe, ceil: () => ik, clipByValue: () => uk, clone: () => zr, complex: () => Er, concat: () => gt, concat1d: () => pk, concat2d: () => ck, concat3d: () => lk, concat4d: () => mk, conv1d: () => fk, conv2d: () => mi, conv2dTranspose: () => dk, conv3d: () => hk, conv3dTranspose: () => xk, cos: () => yk, cosh: () => bk, cosineWindow: () => hl, cumprod: () => Ck, cumsum: () => Ik, denseBincount: () => wk, depthToSpace: () => Sk, depthwiseConv2d: () => Gp, diag: () => vk, dilation2d: () => kk, div: () => We, divNoNan: () => Tk, dot: () => Nk, dropout: () => BH, einsum: () => _k, elu: () => xf, enclosingPowerOfTwo: () => wC, equal: () => gf, erf: () => Ek, euclideanNorm: () => Ak, exp: () => Bo, expandDims: () => _a, expm1: () => Fk, eye: () => yf, fft: () => qp, fill: () => Bs, floor: () => bf, floorDiv: () => cf, fused: () => SC, gather: () => Cf, gatherND: () => MH, greater: () => cu, greaterEqual: () => If, ifft: () => hu, imag: () => ci, image: () => zq, inTopKAsync: () => zH, irfft: () => Gf, isFinite: () => Dk, isInf: () => Pk, isNaN: () => Ok, leakyRelu: () => wf, less: () => Mk, lessEqual: () => Hp, linalg: () => Wq, linspace: () => Lk, localResponseNormalization: () => Bk, log: () => Ea, log1p: () => Sf, logSigmoid: () => Vk, logSoftmax: () => zk, logSumExp: () => Tf, logicalAnd: () => lu, logicalNot: () => Nf, logicalOr: () => _f, logicalXor: () => Wk, losses: () => Uq, lowerBound: () => Uk, matMul: () => Xe, max: () => Vs, maxPool: () => $f, maxPool3d: () => Gk, maxPoolWithArgmax: () => Hk, maximum: () => Rf, mean: () => mu, meshgrid: () => qk, min: () => fl, minimum: () => Af, mirrorPad: () => Kk, mod: () => jk, moments: () => Xk, movingAverage: () => $H, mul: () => oe, multiRNNCell: () => Yk, multinomial: () => Qk, neg: () => yr, norm: () => pu, notEqual: () => Ff, oneHot: () => pl, ones: () => zs, onesLike: () => Zk, op: () => T, outerProduct: () => Jk, pad: () => Ws, pad1d: () => e1, pad2d: () => t1, pad3d: () => r1, pad4d: () => o1, pool: () => n1, pow: () => Na, prelu: () => Pf, print: () => ef, prod: () => s1, raggedGather: () => a1, raggedRange: () => i1, raggedTensorToTensor: () => u1, rand: () => p1, randomGamma: () => T1, randomNormal: () => Vf, randomStandardNormal: () => N1, randomUniform: () => zf, range: () => di, real: () => ka, reciprocal: () => _1, relu: () => hi, relu6: () => Wf, reshape: () => z, reverse: () => vo, reverse1d: () => E1, reverse2d: () => $1, reverse3d: () => R1, reverse4d: () => A1, rfft: () => Kp, round: () => Uf, rsqrt: () => F1, scalar: () => be, scatterND: () => AH, searchSorted: () => dl, selu: () => D1, separableConv2d: () => P1, setdiff1dAsync: () => O1, sigmoid: () => Ms, sign: () => M1, signal: () => Vq, sin: () => L1, sinh: () => B1, slice: () => Ue, slice1d: () => V1, slice2d: () => z1, slice3d: () => W1, slice4d: () => U1, softmax: () => G1, softplus: () => kf, spaceToBatchND: () => Df, sparse: () => Gq, sparseToDense: () => PH, spectral: () => Bq, split: () => $a, sqrt: () => Rr, square: () => Zt, squaredDifference: () => Hf, squeeze: () => jp, stack: () => Ir, step: () => qf, stridedSlice: () => H1, string: () => Hq, sub: () => ke, sum: () => tt, tan: () => q1, tanh: () => ml, tensor: () => nr, tensor1d: () => mr, tensor2d: () => gi, tensor3d: () => sf, tensor4d: () => K1, tensor5d: () => j1, tensor6d: () => X1, tile: () => fi, topk: () => Y1, transpose: () => Wp, truncatedNormal: () => Q1, unique: () => Z1, unsortedSegmentSum: () => J1, unstack: () => ko, upperBound: () => eT, variable: () => tT, where: () => os, whereAsync: () => jf, zeros: () => Wr, zerosLike: () => Gt }); +var eN = (r, e, t10, o = rt) => { + switch (r.op) { + case "BiasAdd": + case "AddV2": + case "Add": + return [o.add(S("a", r, e, t10), S("b", r, e, t10))]; + case "AddN": + return [o.addN(S("tensors", r, e, t10))]; + case "FloorMod": + case "Mod": + return [o.mod(S("a", r, e, t10), S("b", r, e, t10))]; + case "Mul": + return [o.mul(S("a", r, e, t10), S("b", r, e, t10))]; + case "RealDiv": + case "Div": + return [o.div(S("a", r, e, t10), S("b", r, e, t10))]; + case "DivNoNan": + return [o.divNoNan(S("a", r, e, t10), S("b", r, e, t10))]; + case "FloorDiv": + return [o.floorDiv(S("a", r, e, t10), S("b", r, e, t10))]; + case "Sub": + return [o.sub(S("a", r, e, t10), S("b", r, e, t10))]; + case "Minimum": + return [o.minimum(S("a", r, e, t10), S("b", r, e, t10))]; + case "Maximum": + return [o.maximum(S("a", r, e, t10), S("b", r, e, t10))]; + case "Pow": + return [o.pow(S("a", r, e, t10), S("b", r, e, t10))]; + case "SquaredDifference": + return [o.squaredDifference(S("a", r, e, t10), S("b", r, e, t10))]; + default: + throw TypeError(`Node type ${r.op} is not implemented`); + } +}; +var tN = (r, e, t10, o = rt) => { + switch (r.op) { + case "Abs": + case "ComplexAbs": + return [o.abs(S("x", r, e, t10))]; + case "Acos": + return [o.acos(S("x", r, e, t10))]; + case "Acosh": + return [o.acosh(S("x", r, e, t10))]; + case "Asin": + return [o.asin(S("x", r, e, t10))]; + case "Asinh": + return [o.asinh(S("x", r, e, t10))]; + case "Atan": + return [o.atan(S("x", r, e, t10))]; + case "Atan2": + return [o.atan2(S("x", r, e, t10), S("y", r, e, t10))]; + case "Atanh": + return [o.atanh(S("x", r, e, t10))]; + case "Ceil": + return [o.ceil(S("x", r, e, t10))]; + case "Complex": + return [o.complex(S("real", r, e, t10), S("imag", r, e, t10))]; + case "Cos": + return [o.cos(S("x", r, e, t10))]; + case "Cosh": + return [o.cosh(S("x", r, e, t10))]; + case "Elu": + return [o.elu(S("x", r, e, t10))]; + case "Erf": + return [o.erf(S("x", r, e, t10))]; + case "Exp": + return [o.exp(S("x", r, e, t10))]; + case "Expm1": + return [o.expm1(S("x", r, e, t10))]; + case "Floor": + return [o.floor(S("x", r, e, t10))]; + case "Log": + return [o.log(S("x", r, e, t10))]; + case "Log1p": + return [o.log1p(S("x", r, e, t10))]; + case "Imag": + return [o.imag(S("x", r, e, t10))]; + case "Neg": + return [o.neg(S("x", r, e, t10))]; + case "Reciprocal": + return [o.reciprocal(S("x", r, e, t10))]; + case "Real": + return [o.real(S("x", r, e, t10))]; + case "Relu": + return [o.relu(S("x", r, e, t10))]; + case "Round": + return [o.round(S("x", r, e, t10))]; + case "Selu": + return [o.selu(S("x", r, e, t10))]; + case "Sigmoid": + return [o.sigmoid(S("x", r, e, t10))]; + case "Sin": + return [o.sin(S("x", r, e, t10))]; + case "Sign": + return [o.sign(S("x", r, e, t10))]; + case "Sinh": + return [o.sinh(S("x", r, e, t10))]; + case "Softplus": + return [o.softplus(S("x", r, e, t10))]; + case "Sqrt": + return [o.sqrt(S("x", r, e, t10))]; + case "Square": + return [o.square(S("x", r, e, t10))]; + case "Tanh": + return [o.tanh(S("x", r, e, t10))]; + case "Tan": + return [o.tan(S("x", r, e, t10))]; + case "ClipByValue": + return [o.clipByValue(S("x", r, e, t10), S("clipValueMin", r, e, t10), S("clipValueMax", r, e, t10))]; + case "Relu6": + return [o.relu6(S("x", r, e, t10))]; + case "Rsqrt": + return [o.rsqrt(Ht(r.inputNames[0], e, t10))]; + case "Prod": + return [o.prod(S("x", r, e, t10), S("axes", r, e, t10))]; + case "LeakyRelu": + return [o.leakyRelu(S("x", r, e, t10), S("alpha", r, e, t10))]; + case "Prelu": + return [o.prelu(S("x", r, e, t10), S("alpha", r, e, t10))]; + case "IsNan": + return [o.isNaN(Ht(r.inputNames[0], e, t10))]; + default: + throw TypeError(`Node type ${r.op} is not implemented`); + } +}; +function Ur(r, e, t10 = "") { + if (!(typeof r == "number" || typeof e == "number")) { + x.assert(r.length === e.length, () => t10 + ` Shapes ${r} and ${e} must match`); + for (let o = 0; o < r.length; o++) { + let n = r[o], s = e[o]; + x.assert(n < 0 || s < 0 || n === s, () => t10 + ` Shapes ${r} and ${e} must match`); + } + } +} +function rN(r) { + return !(typeof r == "number" || r.some((e) => e < 0)); +} +function Xp(r, e, t10) { + let o = dd(r, t10), n = !rN(o); + if (n && e.length === 0) + throw new Error(`Tried to calculate elements of an empty list with non-fully-defined elementShape: ${o}`); + if (n && e.forEach((s) => { + o = dd(s.shape, o); + }), !rN(o)) + throw new Error(`Non-fully-defined elementShape: ${o}`); + return o; +} +function dd(r, e) { + if (typeof r == "number") + return e; + if (typeof e == "number") + return r; + if (r.length !== e.length) + throw new Error(`Incompatible ranks during merge: ${r} vs. ${e}`); + let t10 = []; + for (let o = 0; o < r.length; ++o) { + let n = r[o], s = e[o]; + if (n >= 0 && s >= 0 && n !== s) + throw new Error(`Incompatible shape during merge: ${r} vs. ${e}`); + t10[o] = n >= 0 ? n : s; + } + return t10; +} +var hd = class { + constructor(e, t10, o, n, s, a, i) { + this.name = e, this.dtype = t10, this.maxSize = o, this.elementShape = n, this.identicalElementShapes = s, this.dynamicSize = a, this.clearAfterRead = i, this.tensors = [], this.closed_ = false, this.idTensor = be(0), So(this.idTensor); + } + get id() { + return this.idTensor.id; + } + get closed() { + return this.closed_; + } + clearAndClose(e) { + this.tensors.forEach((t10) => { + (e == null || !e.has(t10.tensor.id)) && t10.tensor.dispose(); + }), this.tensors = [], this.closed_ = true, this.idTensor.dispose(); + } + size() { + return this.tensors.length; + } + read(e) { + if (this.closed_) + throw new Error(`TensorArray ${this.name} has already been closed.`); + if (e < 0 || e >= this.size()) + throw new Error(`Tried to read from index ${e}, but array size is: ${this.size()}`); + let t10 = this.tensors[e]; + if (t10.cleared) + throw new Error(`TensorArray ${this.name}: Could not read index ${e} twice because it was cleared after a previous read (perhaps try setting clear_after_read = false?).`); + return this.clearAfterRead && (t10.cleared = true), t10.read = true, t10.tensor; + } + readMany(e) { + return e.map((t10) => this.read(t10)); + } + write(e, t10) { + if (this.closed_) + throw new Error(`TensorArray ${this.name} has already been closed.`); + if (e < 0 || !this.dynamicSize && e >= this.maxSize) + throw new Error(`Tried to write to index ${e}, but array is not resizeable and size is: ${this.maxSize}`); + let o = this.tensors[e] || {}; + if (t10.dtype !== this.dtype) + throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${e}, + because the value dtype is ${t10.dtype}, but TensorArray dtype is ${this.dtype}.`); + if (this.size() === 0 && (this.elementShape == null || this.elementShape.length === 0) && (this.elementShape = t10.shape), Ur(this.elementShape, t10.shape, `TensorArray ${this.name}: Could not write to TensorArray index ${e}.`), o.read) + throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${e}, because it has already been read.`); + if (o.written) + throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${e}, because it has already been written.`); + o.tensor = t10, So(t10), o.written = true, this.tensors[e] = o; + } + writeMany(e, t10) { + if (e.length !== t10.length) + throw new Error(`TensorArray ${this.name}: could not write multiple tensors,because the index size: ${e.length} is not the same as tensors size: ${t10.length}.`); + e.forEach((o, n) => this.write(o, t10[n])); + } + gather(e, t10) { + if (!!t10 && t10 !== this.dtype) + throw new Error(`TensorArray dtype is ${this.dtype} but gather requested dtype ${t10}`); + if (e) + e = e.slice(0, this.size()); + else { + e = []; + for (let n = 0; n < this.size(); n++) + e.push(n); + } + if (e.length === 0) + return nr([], [0].concat(this.elementShape)); + let o = this.readMany(e); + return Ur(this.elementShape, o[0].shape, "TensorArray shape mismatch: "), Ir(o, 0); + } + concat(e) { + if (!!e && e !== this.dtype) + throw new Error(`TensorArray dtype is ${this.dtype} but concat requested dtype ${e}`); + if (this.size() === 0) + return nr([], [0].concat(this.elementShape)); + let t10 = []; + for (let n = 0; n < this.size(); n++) + t10.push(n); + let o = this.readMany(t10); + return Ur(this.elementShape, o[0].shape, `TensorArray shape mismatch: tensor array shape (${this.elementShape}) vs first tensor shape (${o[0].shape})`), gt(o, 0); + } + scatter(e, t10) { + if (t10.dtype !== this.dtype) + throw new Error(`TensorArray dtype is ${this.dtype} but tensor has dtype ${t10.dtype}`); + if (e.length !== t10.shape[0]) + throw new Error(`Expected len(indices) == tensor.shape[0], but saw: ${e.length} vs. ${t10.shape[0]}`); + let o = Math.max(...e); + if (!this.dynamicSize && o >= this.maxSize) + throw new Error(`Max index must be < array size (${o} vs. ${this.maxSize})`); + this.writeMany(e, ko(t10, 0)); + } + split(e, t10) { + if (t10.dtype !== this.dtype) + throw new Error(`TensorArray dtype is ${this.dtype} but tensor has dtype ${t10.dtype}`); + let o = 0, n = e.map((p) => (o += p, o)); + if (o !== t10.shape[0]) + throw new Error(`Expected sum of lengths to be equal to + tensor.shape[0], but sum of lengths is + ${o}, and tensor's shape is: ${t10.shape}`); + if (!this.dynamicSize && e.length !== this.maxSize) + throw new Error(`TensorArray's size is not equal to the size of lengths (${this.maxSize} vs. ${e.length}), and the TensorArray is not marked as dynamically resizeable`); + let s = o === 0 ? 0 : t10.size / o, a = []; + Ne(() => { + t10 = z(t10, [1, o, s]); + for (let p = 0; p < e.length; ++p) { + let c = [0, p === 0 ? 0 : n[p - 1], 0], l = [1, e[p], s]; + a[p] = z(Ue(t10, c, l), this.elementShape); + } + return a; + }); + let i = []; + for (let p = 0; p < e.length; p++) + i[p] = p; + this.writeMany(i, a); + } +}; +var Ra = class { + constructor(e, t10, o, n = -1) { + this.tensors = e, this.elementShape = t10, this.elementDtype = o, e != null && e.forEach((s) => { + if (o !== s.dtype) + throw new Error(`Invalid data types; op elements ${o}, but list elements ${s.dtype}`); + Ur(t10, s.shape, "TensorList shape mismatch: "), So(s); + }), this.idTensor = be(0), this.maxNumElements = n, So(this.idTensor); + } + get id() { + return this.idTensor.id; + } + copy() { + return new Ra([...this.tensors], this.elementShape, this.elementDtype); + } + clearAndClose(e) { + this.tensors.forEach((t10) => { + (e == null || !e.has(t10.id)) && t10.dispose(); + }), this.tensors.length = 0, this.idTensor.dispose(); + } + size() { + return this.tensors.length; + } + stack(e, t10, o = -1) { + if (t10 !== this.elementDtype) + throw new Error(`Invalid data types; op elements ${t10}, but list elements ${this.elementDtype}`); + if (o !== -1 && this.tensors.length !== o) + throw new Error(`Operation expected a list with ${o} elements but got a list with ${this.tensors.length} elements.`); + Ur(e, this.elementShape, "TensorList shape mismatch: "); + let n = Xp(this.elementShape, this.tensors, e); + return Ne(() => { + let s = this.tensors.map((a) => z(a, n)); + return Ir(s, 0); + }); + } + popBack(e, t10) { + if (t10 !== this.elementDtype) + throw new Error(`Invalid data types; op elements ${t10}, but list elements ${this.elementDtype}`); + if (this.size() === 0) + throw new Error("Trying to pop from an empty list."); + let o = Xp(this.elementShape, this.tensors, e), n = this.tensors.pop(); + return n.kept = false, Ur(n.shape, e, "TensorList shape mismatch: "), z(n, o); + } + pushBack(e) { + if (e.dtype !== this.elementDtype) + throw new Error(`Invalid data types; op elements ${e.dtype}, but list elements ${this.elementDtype}`); + if (Ur(e.shape, this.elementShape, "TensorList shape mismatch: "), this.maxNumElements === this.size()) + throw new Error("Trying to push element into a full list."); + So(e), this.tensors.push(e); + } + resize(e) { + if (e < 0) + throw new Error(`TensorListResize expects size to be non-negative. Got: ${e}`); + if (this.maxNumElements !== -1 && e > this.maxNumElements) + throw new Error(`TensorListResize input size ${e} is greater maxNumElement ${this.maxNumElements}.`); + let t10 = new Ra([], this.elementShape, this.elementDtype, this.maxNumElements); + t10.tensors.length = e; + for (let o = 0; o < Math.min(this.tensors.length, e); ++o) + t10.tensors[o] = this.tensors[o]; + return t10; + } + getItem(e, t10, o) { + if (o !== this.elementDtype) + throw new Error(`Invalid data types; op elements ${o}, but list elements ${this.elementDtype}`); + if (e < 0 || e > this.tensors.length) + throw new Error(`Trying to access element ${e} in a list with ${this.tensors.length} elements.`); + if (this.tensors[e] == null) + throw new Error(`element at index ${e} is null.`); + Ur(this.tensors[e].shape, t10, "TensorList shape mismatch: "); + let n = Xp(this.elementShape, this.tensors, t10); + return z(this.tensors[e], n); + } + setItem(e, t10) { + if (t10.dtype !== this.elementDtype) + throw new Error(`Invalid data types; op elements ${t10.dtype}, but list elements ${this.elementDtype}`); + if (e < 0 || this.maxNumElements !== -1 && e >= this.maxNumElements) + throw new Error(`Trying to set element ${e} in a list with max ${this.maxNumElements} elements.`); + Ur(this.elementShape, t10.shape, "TensorList shape mismatch: "), So(t10), this.tensors[e] != null && (this.tensors[e].kept = false), this.tensors[e] = t10; + } + gather(e, t10, o) { + if (t10 !== this.elementDtype) + throw new Error(`Invalid data types; op elements ${t10}, but list elements ${this.elementDtype}`); + Ur(this.elementShape, o, "TensorList shape mismatch: "), e = e.slice(0, this.size()); + let n = Xp(this.elementShape, this.tensors, o); + return e.length === 0 ? nr([], [0].concat(n)) : Ne(() => { + let s = e.map((a) => z(this.tensors[a], n)); + return Ir(s, 0); + }); + } + concat(e, t10) { + if (!!e && e !== this.elementDtype) + throw new Error(`TensorList dtype is ${this.elementDtype} but concat requested dtype ${e}`); + Ur(this.elementShape, t10, "TensorList shape mismatch: "); + let o = Xp(this.elementShape, this.tensors, t10); + return this.size() === 0 ? nr([], [0].concat(o)) : Ne(() => { + let n = this.tensors.map((s) => z(s, o)); + return gt(n, 0); + }); + } +}; +function oN(r, e, t10) { + let o = r.dtype; + if (r.shape.length < 1) + throw new Error(`Tensor must be at least a vector, but saw shape: ${r.shape}`); + if (r.dtype !== t10) + throw new Error(`Invalid data types; op elements ${r.dtype}, but list elements ${t10}`); + let n = r.shape.slice(1); + Ur(n, e, "TensorList shape mismatch: "); + let s = ko(r); + return new Ra(s, e, o); +} +function nN(r, e, t10, o) { + return new Ra([], r, e, o); +} +function sN(r, e, t10, o) { + if (e.length !== r.shape[0]) + throw new Error(`Expected len(indices) == tensor.shape[0], but saw: ${e.length} vs. ${r.shape[0]}`); + let n = Math.max(...e); + if (o != null && o !== -1 && n >= o) + throw new Error(`Max index must be < array size (${n} vs. ${o})`); + let s = new Ra([], t10, r.dtype, o), a = ko(r, 0); + return e.forEach((i, p) => { + s.setItem(i, a[p]); + }), s; +} +function aN(r, e, t10) { + let o = 0, n = e.map((c) => (o += c, o)); + if (o !== r.shape[0]) + throw new Error(`Expected sum of lengths to be equal to + tensor.shape[0], but sum of lengths is + ${o}, and tensor's shape is: ${r.shape}`); + let s = r.shape.slice(1), a = dd(s, t10), i = o === 0 ? 0 : r.size / o, p = Ne(() => { + let c = []; + r = z(r, [1, o, i]); + for (let l = 0; l < e.length; ++l) { + let f = [0, l === 0 ? 0 : n[l - 1], 0], d = [1, e[l], i]; + c[l] = z(Ue(r, f, d), a); + } + return r.dispose(), c; + }), u = new Ra([], t10, r.dtype, e.length); + for (let c = 0; c < p.length; c++) + u.setItem(c, p[c]); + return u; +} +var iN = async (r, e, t10) => { + switch (r.op) { + case "If": + case "StatelessIf": { + let o = S("thenBranch", r, e, t10), n = S("elseBranch", r, e, t10), s = S("cond", r, e, t10), a = S("args", r, e, t10); + return (await s.data())[0] ? t10.functionMap[o].executeFunctionAsync(a, t10.tensorArrayMap, t10.tensorListMap) : t10.functionMap[n].executeFunctionAsync(a, t10.tensorArrayMap, t10.tensorListMap); + } + case "While": + case "StatelessWhile": { + let o = S("body", r, e, t10), n = S("cond", r, e, t10), s = S("args", r, e, t10), a = await t10.functionMap[n].executeFunctionAsync(s, t10.tensorArrayMap, t10.tensorListMap), i = s.map((c) => c.id), p = await a[0].data(); + a.forEach((c) => { + !c.kept && i.indexOf(c.id) === -1 && c.dispose(); + }); + let u = s; + for (; p[0]; ) { + let c = u; + u = await t10.functionMap[o].executeFunctionAsync(u, t10.tensorArrayMap, t10.tensorListMap); + let l = u.map((f) => f.id); + c.forEach((f) => { + !f.kept && i.indexOf(f.id) === -1 && l.indexOf(f.id) === -1 && f.dispose(); + }); + let m = await t10.functionMap[n].executeFunctionAsync(u, t10.tensorArrayMap, t10.tensorListMap); + p = await m[0].data(), m.forEach((f) => { + !f.kept && i.indexOf(f.id) === -1 && l.indexOf(f.id) === -1 && f.dispose(); + }); + } + return u; + } + case "LoopCond": { + let o = S("pred", r, e, t10); + return [ss(o)]; + } + case "Switch": { + let o = S("pred", r, e, t10), n = S("data", r, e, t10); + return n.kept || (n = ss(n)), (await o.data())[0] ? [void 0, n] : [n, void 0]; + } + case "Merge": { + let o = r.inputNames.find((n) => Ht(n, e, t10) !== void 0); + if (o) { + let n = Ht(o, e, t10); + return [ss(n)]; + } + return; + } + case "Enter": { + let o = S("frameName", r, e, t10), n = S("tensor", r, e, t10); + return t10.enterFrame(o), [ss(n)]; + } + case "Exit": { + let o = S("tensor", r, e, t10); + return t10.exitFrame(), [ss(o)]; + } + case "NextIteration": { + let o = S("tensor", r, e, t10); + return t10.nextIteration(), [ss(o)]; + } + case "TensorArrayV3": { + let o = S("size", r, e, t10), n = S("dtype", r, e, t10), s = S("elementShape", r, e, t10), a = S("dynamicSize", r, e, t10), i = S("clearAfterRead", r, e, t10), p = S("identicalElementShapes", r, e, t10), u = S("name", r, e, t10), c = new hd(u, n, o, s, p, a, i); + return t10.addTensorArray(c), [c.idTensor, be(1)]; + } + case "TensorArrayWriteV3": { + let o = S("tensorArrayId", r, e, t10), n = S("index", r, e, t10), s = S("tensor", r, e, t10), a = t10.getTensorArray(o.id); + return a.write(n, s), [a.idTensor]; + } + case "TensorArrayReadV3": { + let o = S("tensorArrayId", r, e, t10), n = S("index", r, e, t10); + return [t10.getTensorArray(o.id).read(n)]; + } + case "TensorArrayGatherV3": { + let o = S("tensorArrayId", r, e, t10), n = S("indices", r, e, t10), s = S("dtype", r, e, t10); + return [t10.getTensorArray(o.id).gather(n, s)]; + } + case "TensorArrayScatterV3": { + let o = S("tensorArrayId", r, e, t10), n = S("indices", r, e, t10), s = S("tensor", r, e, t10), a = t10.getTensorArray(o.id); + return a.scatter(n, s), [a.idTensor]; + } + case "TensorArrayConcatV3": { + let o = S("tensorArrayId", r, e, t10), n = t10.getTensorArray(o.id), s = S("dtype", r, e, t10); + return [n.concat(s)]; + } + case "TensorArraySplitV3": { + let o = S("tensorArrayId", r, e, t10), n = S("tensor", r, e, t10), s = S("lengths", r, e, t10), a = t10.getTensorArray(o.id); + return a.split(s, n), [a.idTensor]; + } + case "TensorArraySizeV3": { + let o = S("tensorArrayId", r, e, t10), n = t10.getTensorArray(o.id); + return [be(n.size(), "int32")]; + } + case "TensorArrayCloseV3": { + let o = S("tensorArrayId", r, e, t10), n = t10.getTensorArray(o.id); + return n.clearAndClose(), [n.idTensor]; + } + case "TensorListSetItem": { + let o = S("tensorListId", r, e, t10), n = S("index", r, e, t10), s = S("tensor", r, e, t10), a = t10.getTensorList(o.id); + return a.setItem(n, s), [a.idTensor]; + } + case "TensorListGetItem": { + let o = S("tensorListId", r, e, t10), n = S("index", r, e, t10), s = S("elementShape", r, e, t10), a = S("elementDType", r, e, t10); + return [t10.getTensorList(o.id).getItem(n, s, a)]; + } + case "TensorListScatterV2": + case "TensorListScatter": { + let o = S("indices", r, e, t10), n = S("tensor", r, e, t10), s = S("elementShape", r, e, t10), a = S("numElements", r, e, t10), i = sN(n, o, s, a); + return t10.addTensorList(i), [i.idTensor]; + } + case "TensorListReserve": + case "EmptyTensorList": { + let o = S("elementShape", r, e, t10), n = S("elementDType", r, e, t10), s; + r.op === "TensorListReserve" ? s = "numElements" : s = "maxNumElements"; + let a = S(s, r, e, t10), i = r.op === "TensorListReserve" ? -1 : a, p = nN(o, n, a, i); + return t10.addTensorList(p), [p.idTensor]; + } + case "TensorListGather": { + let o = S("tensorListId", r, e, t10), n = S("indices", r, e, t10), s = S("elementShape", r, e, t10), a = S("elementDType", r, e, t10); + return [t10.getTensorList(o.id).gather(n, a, s)]; + } + case "TensorListStack": { + let o = S("tensorListId", r, e, t10), n = S("elementShape", r, e, t10), s = S("elementDType", r, e, t10), a = S("numElements", r, e, t10); + return [t10.getTensorList(o.id).stack(n, s, a)]; + } + case "TensorListFromTensor": { + let o = S("tensor", r, e, t10), n = S("elementShape", r, e, t10), s = S("elementDType", r, e, t10), a = oN(o, n, s); + return t10.addTensorList(a), [a.idTensor]; + } + case "TensorListConcat": + case "TensorListConcatV2": { + let o = S("tensorListId", r, e, t10), n = t10.getTensorList(o.id), s = S("dtype", r, e, t10), a = S("elementShape", r, e, t10); + return [n.concat(s, a)]; + } + case "TensorListPushBack": { + let o = S("tensorListId", r, e, t10), n = S("tensor", r, e, t10), s = t10.getTensorList(o.id); + return s.pushBack(n), [s.idTensor]; + } + case "TensorListPopBack": { + let o = S("tensorListId", r, e, t10), n = S("elementShape", r, e, t10), s = S("elementDType", r, e, t10); + return [t10.getTensorList(o.id).popBack(n, s)]; + } + case "TensorListSplit": { + let o = S("tensor", r, e, t10), n = S("elementShape", r, e, t10), s = S("lengths", r, e, t10), a = aN(o, s, n); + return t10.addTensorList(a), [a.idTensor]; + } + case "TensorListLength": { + let o = S("tensorListId", r, e, t10), n = t10.getTensorList(o.id); + return [be(n.size(), "int32")]; + } + case "TensorListResize": { + let o = S("tensorListId", r, e, t10), n = S("size", r, e, t10), a = t10.getTensorList(o.id).resize(n); + return t10.addTensorList(a), [a.idTensor]; + } + default: + throw TypeError(`Node type ${r.op} is not implemented`); + } +}; +function uN(r, e, t10) { + let [o, n] = S("fusedOps", r, e, t10), s = o === "biasadd", a = !s, i = n === "prelu", p = o === "fusedbatchnorm", u = S("numArgs", r, e, t10); + if (s) { + if (i && u !== 2) + throw new Error("FusedConv2d and DepthwiseConv2d with BiasAdd and Prelu must have two extra arguments: bias and alpha."); + if (!i && s && u !== 1) + throw new Error("FusedConv2d and DepthwiseConv2d with BiasAdd must have one extra argument: bias."); + } + if (p) + throw new Error("FusedConv2d and DepthwiseConv2d with FusedBatchNorm is not supported"); + let c = S("strides", r, e, t10), l = gl(r, e, t10), m = S("dataFormat", r, e, t10).toUpperCase(), f = S("dilations", r, e, t10), [d, h] = S("args", r, e, t10); + a && (h = d, d = void 0); + let g = S("leakyreluAlpha", r, e, t10); + return { stride: c, pad: l, dataFormat: m, dilations: f, biasArg: d, preluArg: h, activationFunc: n, leakyreluAlpha: g }; +} +var pN = (r, e, t10, o = rt) => { + switch (r.op) { + case "Conv1D": { + let n = S("stride", r, e, t10), s = S("pad", r, e, t10), a = S("dataFormat", r, e, t10).toUpperCase(), i = S("dilation", r, e, t10); + return [o.conv1d(S("x", r, e, t10), S("filter", r, e, t10), n, s, a, i)]; + } + case "Conv2D": { + let n = S("strides", r, e, t10), s = gl(r, e, t10), a = S("dataFormat", r, e, t10).toUpperCase(), i = S("dilations", r, e, t10); + return [o.conv2d(S("x", r, e, t10), S("filter", r, e, t10), [n[1], n[2]], s, a, [i[1], i[2]])]; + } + case "_FusedConv2D": { + let { stride: n, pad: s, dataFormat: a, dilations: i, biasArg: p, preluArg: u, activationFunc: c, leakyreluAlpha: l } = uN(r, e, t10); + return [o.fused.conv2d({ x: S("x", r, e, t10), filter: S("filter", r, e, t10), strides: [n[1], n[2]], pad: s, dataFormat: a, dilations: [i[1], i[2]], bias: p, activation: c, preluActivationWeights: u, leakyreluAlpha: l })]; + } + case "FusedDepthwiseConv2dNative": { + let { stride: n, pad: s, dataFormat: a, dilations: i, biasArg: p, preluArg: u, activationFunc: c, leakyreluAlpha: l } = uN(r, e, t10); + return [o.fused.depthwiseConv2d({ x: S("x", r, e, t10), filter: S("filter", r, e, t10), strides: [n[1], n[2]], pad: s, dataFormat: a, dilations: [i[1], i[2]], bias: p, activation: c, preluActivationWeights: u, leakyreluAlpha: l })]; + } + case "Conv2DBackpropInput": + case "Conv2dTranspose": { + let n = S("outputShape", r, e, t10), s = S("strides", r, e, t10), a = gl(r, e, t10); + return [o.conv2dTranspose(S("x", r, e, t10), S("filter", r, e, t10), n, [s[1], s[2]], a)]; + } + case "DepthwiseConv2dNative": + case "DepthwiseConv2d": { + let n = S("strides", r, e, t10), s = gl(r, e, t10), a = S("dilations", r, e, t10), i = S("dataFormat", r, e, t10).toUpperCase(); + return [o.depthwiseConv2d(S("input", r, e, t10), S("filter", r, e, t10), [n[1], n[2]], s, i, [a[1], a[2]])]; + } + case "Conv3D": { + let n = S("strides", r, e, t10), s = S("pad", r, e, t10), a = S("dataFormat", r, e, t10).toUpperCase(), i = S("dilations", r, e, t10); + return [o.conv3d(S("x", r, e, t10), S("filter", r, e, t10), [n[1], n[2], n[3]], s, a, [i[1], i[2], i[3]])]; + } + case "AvgPool": { + let n = S("strides", r, e, t10), s = S("pad", r, e, t10), a = S("kernelSize", r, e, t10); + return [o.avgPool(S("x", r, e, t10), [a[1], a[2]], [n[1], n[2]], s)]; + } + case "MaxPool": { + let n = S("strides", r, e, t10), s = S("pad", r, e, t10), a = S("kernelSize", r, e, t10); + return [o.maxPool(S("x", r, e, t10), [a[1], a[2]], [n[1], n[2]], s)]; + } + case "MaxPoolWithArgmax": { + let n = S("strides", r, e, t10), s = S("pad", r, e, t10), a = S("kernelSize", r, e, t10), i = S("includeBatchInIndex", r, e, t10), { result: p, indexes: u } = o.maxPoolWithArgmax(S("x", r, e, t10), [a[1], a[2]], [n[1], n[2]], s, i); + return [p, u]; + } + case "AvgPool3D": { + let n = S("strides", r, e, t10), s = S("pad", r, e, t10), a = S("kernelSize", r, e, t10); + return [o.avgPool3d(S("x", r, e, t10), [a[1], a[2], a[3]], [n[1], n[2], n[3]], s)]; + } + case "MaxPool3D": { + let n = S("strides", r, e, t10), s = S("pad", r, e, t10), a = S("kernelSize", r, e, t10); + return [o.maxPool3d(S("x", r, e, t10), [a[1], a[2], a[3]], [n[1], n[2], n[3]], s)]; + } + case "Dilation2D": { + let n = S("strides", r, e, t10), s = S("pad", r, e, t10), a = S("dilations", r, e, t10), i = n[1], p = n[2], u = a[1], c = a[2]; + return [o.dilation2d(S("x", r, e, t10), S("filter", r, e, t10), [i, p], s, [u, c], "NHWC")]; + } + default: + throw TypeError(`Node type ${r.op} is not implemented`); + } +}; +var cN = (r, e, t10, o = rt) => { + switch (r.op) { + case "Fill": { + let n = S("shape", r, e, t10), s = S("dtype", r, e, t10), a = S("value", r, e, t10); + return [o.fill(n, a, s)]; + } + case "LinSpace": { + let n = S("start", r, e, t10), s = S("stop", r, e, t10), a = S("num", r, e, t10); + return [o.linspace(n, s, a)]; + } + case "Multinomial": { + let n = S("logits", r, e, t10), s = S("numSamples", r, e, t10), a = S("seed", r, e, t10); + return [o.multinomial(n, s, a)]; + } + case "OneHot": { + let n = S("indices", r, e, t10), s = S("depth", r, e, t10), a = S("onValue", r, e, t10), i = S("offValue", r, e, t10), p = S("dtype", r, e, t10); + return [o.oneHot(n, s, a, i, p)]; + } + case "Ones": + return [o.ones(S("shape", r, e, t10), S("dtype", r, e, t10))]; + case "OnesLike": + return [o.onesLike(S("x", r, e, t10))]; + case "RandomStandardNormal": + return [o.randomStandardNormal(S("shape", r, e, t10), S("dtype", r, e, t10), S("seed", r, e, t10))]; + case "RandomUniform": + return [o.randomUniform(S("shape", r, e, t10), S("minval", r, e, t10), S("maxval", r, e, t10), S("dtype", r, e, t10))]; + case "Range": { + let n = S("start", r, e, t10), s = S("stop", r, e, t10), a = S("step", r, e, t10); + return [o.range(n, s, a, S("dtype", r, e, t10))]; + } + case "TruncatedNormal": { + let n = S("shape", r, e, t10), s = S("mean", r, e, t10), a = S("stdDev", r, e, t10), i = S("seed", r, e, t10); + return [o.truncatedNormal(n, s, a, S("dtype", r, e, t10), i)]; + } + case "Zeros": + return [o.zeros(S("shape", r, e, t10), S("dtype", r, e, t10))]; + case "ZerosLike": + return [o.zerosLike(S("x", r, e, t10))]; + default: + throw TypeError(`Node type ${r.op} is not implemented`); + } +}; +function YC(r, e, t10) { + let o = S("boxes", r, e, t10), n = S("scores", r, e, t10), s = S("maxOutputSize", r, e, t10), a = S("iouThreshold", r, e, t10), i = S("scoreThreshold", r, e, t10), p = S("softNmsSigma", r, e, t10); + return { boxes: o, scores: n, maxOutputSize: s, iouThreshold: a, scoreThreshold: i, softNmsSigma: p }; +} +var lN = async (r, e, t10, o, n = rt) => { + switch (r.op) { + case "NonMaxSuppressionV5": { + let { boxes: s, scores: a, maxOutputSize: i, iouThreshold: p, scoreThreshold: u, softNmsSigma: c } = YC(r, e, t10), l = await n.image.nonMaxSuppressionWithScoreAsync(s, a, i, p, u, c); + return [l.selectedIndices, l.selectedScores]; + } + case "NonMaxSuppressionV4": { + let { boxes: s, scores: a, maxOutputSize: i, iouThreshold: p, scoreThreshold: u } = YC(r, e, t10), c = S("padToMaxOutputSize", r, e, t10), l = await n.image.nonMaxSuppressionPaddedAsync(s, a, i, p, u, c); + return [l.selectedIndices, l.validOutputs]; + } + case "NonMaxSuppressionV3": + case "NonMaxSuppressionV2": { + let { boxes: s, scores: a, maxOutputSize: i, iouThreshold: p, scoreThreshold: u } = YC(r, e, t10); + return [await n.image.nonMaxSuppressionAsync(s, a, i, p, u)]; + } + case "Where": { + let s = n.cast(S("condition", r, e, t10), "bool"), a = [await n.whereAsync(s)]; + return s.dispose(), a; + } + case "ListDiff": + return n.setdiff1dAsync(S("x", r, e, t10), S("y", r, e, t10)); + default: + throw TypeError(`Node type ${r.op} is not implemented`); + } +}; +var mN = (r, e, t10, o = rt) => { + switch (r.op) { + case "LowerBound": { + let n = S("sortedSequence", r, e, t10), s = S("values", r, e, t10); + return [o.lowerBound(n, s)]; + } + case "TopKV2": { + let n = S("x", r, e, t10), s = S("k", r, e, t10), a = S("sorted", r, e, t10), i = o.topk(n, s, a); + return [i.values, i.indices]; + } + case "UpperBound": { + let n = S("sortedSequence", r, e, t10), s = S("values", r, e, t10); + return [o.upperBound(n, s)]; + } + case "Unique": { + let n = S("x", r, e, t10), s = o.unique(n); + return [s.values, s.indices]; + } + case "UniqueV2": { + let n = S("x", r, e, t10), s = S("axis", r, e, t10), a = o.unique(n, s); + return [a.values, a.indices]; + } + default: + throw TypeError(`Node type ${r.op} is not implemented`); + } +}; +var fN = (r, e, t10, o = rt) => { + switch (r.op) { + case "Const": + return e[r.name]; + case "PlaceholderWithDefault": + let n = S("default", r, e, t10); + return [Ht(r.name, e, t10) || n]; + case "Placeholder": + return [Ht(r.name, e, t10)]; + case "Identity": + case "StopGradient": + case "FakeQuantWithMinMaxVars": { + let c = S("x", r, e, t10); + return [ss(c)]; + } + case "IdentityN": + return S("x", r, e, t10).map((c) => ss(c)); + case "Snapshot": + let s = S("x", r, e, t10); + return [ss(s)]; + case "Shape": + return [o.tensor1d(S("x", r, e, t10).shape, "int32")]; + case "ShapeN": + return S("x", r, e, t10).map((c) => o.tensor1d(c.shape)); + case "Size": + return [o.scalar(S("x", r, e, t10).size, "int32")]; + case "Rank": + return [o.scalar(S("x", r, e, t10).rank, "int32")]; + case "NoOp": + return [o.scalar(1)]; + case "Print": + let a = S("x", r, e, t10), i = S("data", r, e, t10), p = S("message", r, e, t10), u = S("summarize", r, e, t10); + console.warn("The graph has a tf.print() operation,usually used for debugging, which slows down performance."), console.log(p); + for (let c = 0; c < i.length; c++) + console.log(Array.prototype.slice.call(i[c].dataSync()).slice(0, u)); + return [a]; + default: + throw TypeError(`Node type ${r.op} is not implemented`); + } +}; +var gd = class { + constructor(e, t10) { + this.keyDType = e, this.valueDType = t10, this.handle = be(0), this.tensorMap = /* @__PURE__ */ new Map(), So(this.handle); + } + get id() { + return this.handle.id; + } + clearAndClose() { + this.tensorMap.forEach((e) => e.dispose()), this.tensorMap.clear(), this.handle.dispose(); + } + size() { + return this.tensorMap.size; + } + tensorSize() { + return be(this.size(), "int32"); + } + async import(e, t10) { + this.checkKeyAndValueTensor(e, t10); + let o = await e.data(); + return this.tensorMap.forEach((n) => n.dispose()), this.tensorMap.clear(), Ne(() => { + let n = ko(t10), s = o.length, a = n.length; + x.assert(s === a, () => `The number of elements doesn't match, keys has ${s} elements, the values has ${a} elements.`); + for (let i = 0; i < s; i++) { + let p = o[i], u = n[i]; + So(u), this.tensorMap.set(p, u); + } + return this.handle; + }); + } + async find(e, t10) { + this.checkKeyAndValueTensor(e, t10); + let o = await e.data(); + return Ne(() => { + let n = []; + for (let s = 0; s < o.length; s++) { + let a = o[s], i = this.findWithDefault(a, t10); + n.push(i); + } + return Ir(n); + }); + } + findWithDefault(e, t10) { + let o = this.tensorMap.get(e); + return o != null ? o : t10; + } + checkKeyAndValueTensor(e, t10) { + if (e.dtype !== this.keyDType) + throw new Error(`Expect key dtype ${this.keyDType}, but got ${e.dtype}`); + if (t10.dtype !== this.valueDType) + throw new Error(`Expect value dtype ${this.valueDType}, but got ${t10.dtype}`); + } +}; +var dN = async (r, e, t10, o) => { + switch (r.op) { + case "HashTable": + case "HashTableV2": { + let n = o.getHashTableHandleByName(r.name); + if (n != null) + return [n]; + { + let s = S("keyDType", r, e, t10), a = S("valueDType", r, e, t10), i = new gd(s, a); + return o.addHashTable(r.name, i), [i.handle]; + } + } + case "LookupTableImport": + case "LookupTableImportV2": { + let n = S("tableHandle", r, e, t10, o), s = S("keys", r, e, t10), a = S("values", r, e, t10); + return [await o.getHashTableById(n.id).import(s, a)]; + } + case "LookupTableFind": + case "LookupTableFindV2": { + let n = S("tableHandle", r, e, t10, o), s = S("keys", r, e, t10), a = S("defaultValue", r, e, t10); + return [await o.getHashTableById(n.id).find(s, a)]; + } + case "LookupTableSize": + case "LookupTableSizeV2": { + let n = S("tableHandle", r, e, t10, o); + return [o.getHashTableById(n.id).tensorSize()]; + } + default: + throw TypeError(`Node type ${r.op} is not implemented`); + } +}; +var hN = (r, e, t10, o = rt) => { + switch (r.op) { + case "ResizeBilinear": { + let n = S("images", r, e, t10), s = S("size", r, e, t10), a = S("alignCorners", r, e, t10), i = S("halfPixelCenters", r, e, t10); + return [o.image.resizeBilinear(n, [s[0], s[1]], a, i)]; + } + case "ResizeNearestNeighbor": { + let n = S("images", r, e, t10), s = S("size", r, e, t10), a = S("alignCorners", r, e, t10), i = S("halfPixelCenters", r, e, t10); + return [o.image.resizeNearestNeighbor(n, [s[0], s[1]], a, i)]; + } + case "CropAndResize": { + let n = S("image", r, e, t10), s = S("boxes", r, e, t10), a = S("boxInd", r, e, t10), i = S("cropSize", r, e, t10), p = S("method", r, e, t10), u = S("extrapolationValue", r, e, t10); + return [o.image.cropAndResize(n, s, a, i, p, u)]; + } + case "ImageProjectiveTransformV3": { + let n = S("images", r, e, t10), s = S("transforms", r, e, t10), a = S("outputShape", r, e, t10), i = S("fillValue", r, e, t10), p = S("interpolation", r, e, t10), u = S("fillMode", r, e, t10); + return [o.image.transform(n, s, p.toLowerCase(), u.toLowerCase(), i, a)]; + } + default: + throw TypeError(`Node type ${r.op} is not implemented`); + } +}; +var gN = (r, e, t10, o = rt) => { + switch (r.op) { + case "Equal": + return [o.equal(S("a", r, e, t10), S("b", r, e, t10))]; + case "NotEqual": + return [o.notEqual(S("a", r, e, t10), S("b", r, e, t10))]; + case "Greater": + return [o.greater(S("a", r, e, t10), S("b", r, e, t10))]; + case "GreaterEqual": + return [o.greaterEqual(S("a", r, e, t10), S("b", r, e, t10))]; + case "Less": + return [o.less(S("a", r, e, t10), S("b", r, e, t10))]; + case "LessEqual": + return [o.lessEqual(S("a", r, e, t10), S("b", r, e, t10))]; + case "LogicalAnd": + return [o.logicalAnd(S("a", r, e, t10), S("b", r, e, t10))]; + case "LogicalNot": + return [o.logicalNot(S("a", r, e, t10))]; + case "LogicalOr": + return [o.logicalOr(S("a", r, e, t10), S("b", r, e, t10))]; + case "Select": + case "SelectV2": + return [o.where(S("condition", r, e, t10), S("a", r, e, t10), S("b", r, e, t10))]; + default: + throw TypeError(`Node type ${r.op} is not implemented`); + } +}; +var xN = (r, e, t10, o = rt) => { + switch (r.op) { + case "BatchMatMul": + case "BatchMatMulV2": + case "MatMul": + return [o.matMul(S("a", r, e, t10), S("b", r, e, t10), S("transposeA", r, e, t10), S("transposeB", r, e, t10))]; + case "Einsum": + return [o.einsum(S("equation", r, e, t10), ...S("tensors", r, e, t10))]; + case "Transpose": + return [o.transpose(S("x", r, e, t10), S("perm", r, e, t10))]; + case "_FusedMatMul": + let [n, s] = S("fusedOps", r, e, t10), a = n === "biasadd", i = s === "prelu", p = S("numArgs", r, e, t10), u = S("leakyreluAlpha", r, e, t10); + if (a) { + if (i && p !== 2) + throw new Error("Fused MatMul with BiasAdd and Prelu must have two extra arguments: bias and alpha."); + if (!i && p !== 1) + throw new Error("Fused MatMul with BiasAdd must have one extra argument: bias."); + } + let [c, l] = S("args", r, e, t10); + return [o.fused.matMul({ a: S("a", r, e, t10), b: S("b", r, e, t10), transposeA: S("transposeA", r, e, t10), transposeB: S("transposeB", r, e, t10), bias: c, activation: s, preluActivationWeights: l, leakyreluAlpha: u })]; + default: + throw TypeError(`Node type ${r.op} is not implemented`); + } +}; +var yN = (r, e, t10, o = rt) => { + switch (r.op) { + case "EuclideanNorm": + return [o.euclideanNorm(S("x", r, e, t10), S("axis", r, e, t10), S("keepDims", r, e, t10))]; + case "FusedBatchNorm": + case "FusedBatchNormV2": + return [o.batchNorm(S("x", r, e, t10), S("mean", r, e, t10), S("variance", r, e, t10), S("offset", r, e, t10), S("scale", r, e, t10), S("epsilon", r, e, t10))]; + case "FusedBatchNormV3": + return [o.batchNorm(S("x", r, e, t10), S("mean", r, e, t10), S("variance", r, e, t10), S("offset", r, e, t10), S("scale", r, e, t10), S("epsilon", r, e, t10))]; + case "LRN": + return [o.localResponseNormalization(S("x", r, e, t10), S("radius", r, e, t10), S("bias", r, e, t10), S("alpha", r, e, t10), S("beta", r, e, t10))]; + case "Softmax": + return [o.softmax(S("x", r, e, t10))]; + case "LogSoftmax": + return [o.logSoftmax(S("x", r, e, t10))]; + case "SparseToDense": + return [o.sparseToDense(S("sparseIndices", r, e, t10), S("outputShape", r, e, t10), S("sparseValues", r, e, t10), S("defaultValue", r, e, t10))]; + default: + throw TypeError(`Node type ${r.op} is not implemented`); + } +}; +var bN = (r, e, t10, o = rt) => { + switch (r.op) { + case "Max": { + let i = S("axis", r, e, t10), p = S("keepDims", r, e, t10); + return [o.max(S("x", r, e, t10), i, p)]; + } + case "Mean": { + let i = S("axis", r, e, t10), p = S("keepDims", r, e, t10); + return [o.mean(S("x", r, e, t10), i, p)]; + } + case "Min": { + let i = S("axis", r, e, t10), p = S("keepDims", r, e, t10); + return [o.min(S("x", r, e, t10), i, p)]; + } + case "Sum": { + let i = S("axis", r, e, t10), p = S("keepDims", r, e, t10); + return [o.sum(S("x", r, e, t10), i, p)]; + } + case "All": { + let i = S("axis", r, e, t10), p = S("keepDims", r, e, t10); + return [o.all(S("x", r, e, t10), i, p)]; + } + case "Any": { + let i = S("axis", r, e, t10), p = S("keepDims", r, e, t10); + return [o.any(S("x", r, e, t10), i, p)]; + } + case "ArgMax": { + let i = S("axis", r, e, t10); + return [o.argMax(S("x", r, e, t10), i)]; + } + case "ArgMin": { + let i = S("axis", r, e, t10); + return [o.argMin(S("x", r, e, t10), i)]; + } + case "Prod": { + let i = S("axis", r, e, t10), p = S("keepDims", r, e, t10); + return [o.prod(S("x", r, e, t10), i, p)]; + } + case "Cumprod": { + let i = S("axis", r, e, t10), p = S("exclusive", r, e, t10), u = S("reverse", r, e, t10); + return [o.cumprod(S("x", r, e, t10), i, p, u)]; + } + case "Cumsum": { + let i = S("axis", r, e, t10), p = S("exclusive", r, e, t10), u = S("reverse", r, e, t10); + return [o.cumsum(S("x", r, e, t10), i, p, u)]; + } + case "Bincount": + let n = S("x", r, e, t10), s = S("weights", r, e, t10), a = S("size", r, e, t10); + return [o.bincount(n, s, a)]; + case "DenseBincount": { + let i = S("x", r, e, t10), p = S("weights", r, e, t10), u = S("size", r, e, t10), c = S("binaryOutput", r, e, t10); + return [o.denseBincount(i, p, u, c)]; + } + default: + throw TypeError(`Node type ${r.op} is not implemented`); + } +}; +var CN = (r, e, t10, o = rt) => { + switch (r.op) { + case "ConcatV2": + case "Concat": { + let n = S("n", r, e, t10), s = S("axis", r, e, t10), a = S("tensors", r, e, t10); + return a = a.slice(0, n), [o.concat(a, s)]; + } + case "Gather": { + let n = S("x", r, e, t10), s = S("indices", r, e, t10); + return [o.gather(n, o.cast(s, "int32"), 0)]; + } + case "GatherV2": { + let n = S("axis", r, e, t10), s = S("batchDims", r, e, t10), a = S("x", r, e, t10), i = S("indices", r, e, t10); + return [o.gather(a, o.cast(i, "int32"), n, s)]; + } + case "Reverse": { + let n = S("dims", r, e, t10), s = []; + for (let i = 0; i < n.length; i++) + n[i] && s.push(i); + let a = S("x", r, e, t10); + return [o.reverse(a, s)]; + } + case "ReverseV2": { + let n = S("axis", r, e, t10), s = S("x", r, e, t10); + return [o.reverse(s, n)]; + } + case "Slice": { + let n = S("begin", r, e, t10), s = S("size", r, e, t10); + return [o.slice(S("x", r, e, t10), n, s)]; + } + case "StridedSlice": { + let n = S("begin", r, e, t10), s = S("end", r, e, t10), a = S("strides", r, e, t10), i = S("beginMask", r, e, t10), p = S("endMask", r, e, t10), u = S("ellipsisMask", r, e, t10), c = S("newAxisMask", r, e, t10), l = S("shrinkAxisMask", r, e, t10), m = S("x", r, e, t10); + return [o.stridedSlice(m, n, s, a, i, p, u, c, l)]; + } + case "Pack": + return Ne(() => { + let n = S("axis", r, e, t10), s = S("tensors", r, e, t10), a = s[0].shape, i = o.squeeze(s[0]).shape, p = s.map((u) => { + let c = x.arraysEqual(u.shape, a); + if (!c && !x.arraysEqual(o.squeeze(u).shape, i)) + throw new Error("the input tensors shape does not match"); + return c ? u : o.reshape(u, a); + }); + return [o.stack(p, n)]; + }); + case "Unpack": { + let n = S("axis", r, e, t10), s = S("tensor", r, e, t10); + return o.unstack(s, n); + } + case "Tile": { + let n = S("reps", r, e, t10); + return [o.tile(S("x", r, e, t10), n)]; + } + case "Split": + case "SplitV": { + let n = S("axis", r, e, t10), s = S("numOrSizeSplits", r, e, t10), a = S("x", r, e, t10); + return o.split(a, s, n); + } + case "ScatterNd": { + let n = S("indices", r, e, t10), s = S("values", r, e, t10), a = S("shape", r, e, t10); + return [o.scatterND(n, s, a)]; + } + case "GatherNd": { + let n = S("x", r, e, t10), s = S("indices", r, e, t10); + return [o.gatherND(n, s)]; + } + case "SparseToDense": { + let n = S("sparseIndices", r, e, t10), s = S("outputShape", r, e, t10), a = S("sparseValues", r, e, t10), i = S("defaultValue", r, e, t10); + return [o.sparseToDense(n, a, s, a.dtype === i.dtype ? i : o.cast(i, a.dtype))]; + } + default: + throw TypeError(`Node type ${r.op} is not implemented`); + } +}; +var IN = (r, e, t10, o = rt) => { + switch (r.op) { + case "SparseFillEmptyRows": { + let { outputIndices: n, outputValues: s, emptyRowIndicator: a, reverseIndexMap: i } = o.sparse.sparseFillEmptyRows(S("indices", r, e, t10), S("values", r, e, t10), S("denseShape", r, e, t10), S("defaultValue", r, e, t10)); + return [n, s, a, i]; + } + case "SparseReshape": { + let { outputIndices: n, outputShape: s } = o.sparse.sparseReshape(S("inputIndices", r, e, t10), S("inputShape", r, e, t10), S("newShape", r, e, t10)); + return [n, s]; + } + case "SparseSegmentMean": + return [o.sparse.sparseSegmentMean(S("data", r, e, t10), S("indices", r, e, t10), S("segmentIds", r, e, t10))]; + case "SparseSegmentSum": + return [o.sparse.sparseSegmentSum(S("data", r, e, t10), S("indices", r, e, t10), S("segmentIds", r, e, t10))]; + default: + throw TypeError(`Node type ${r.op} is not implemented`); + } +}; +var wN = (r, e, t10, o = rt) => { + switch (r.op) { + case "FFT": + return [o.fft(S("x", r, e, t10))]; + case "IFFT": + return [o.ifft(S("x", r, e, t10))]; + case "RFFT": + return [o.rfft(S("x", r, e, t10))]; + case "IRFFT": + return [o.irfft(S("x", r, e, t10))]; + default: + throw TypeError(`Node type ${r.op} is not implemented`); + } +}; +var SN = (r, e, t10, o = rt) => { + switch (r.op) { + case "StringNGrams": { + let { nGrams: n, nGramsSplits: s } = o.string.stringNGrams(S("data", r, e, t10), S("dataSplits", r, e, t10), S("separator", r, e, t10), S("nGramWidths", r, e, t10), S("leftPad", r, e, t10), S("rightPad", r, e, t10), S("padWidth", r, e, t10), S("preserveShortSequences", r, e, t10)); + return [n, s]; + } + case "StringSplit": { + let { indices: n, values: s, shape: a } = o.string.stringSplit(S("input", r, e, t10), S("delimiter", r, e, t10), S("skipEmpty", r, e, t10)); + return [n, s, a]; + } + case "StringToHashBucketFast": + return [o.string.stringToHashBucketFast(S("input", r, e, t10), S("numBuckets", r, e, t10))]; + default: + throw TypeError(`Node type ${r.op} is not implemented`); + } +}; +var vN = (r, e, t10, o = rt) => { + switch (r.op) { + case "Cast": + return [o.cast(S("x", r, e, t10), S("dtype", r, e, t10))]; + case "ExpandDims": { + let n = S("axis", r, e, t10); + return [o.expandDims(S("x", r, e, t10), n)]; + } + case "Squeeze": { + let n = S("axis", r, e, t10); + return [o.squeeze(S("x", r, e, t10), n)]; + } + case "Reshape": + return [o.reshape(S("x", r, e, t10), S("shape", r, e, t10))]; + case "MirrorPad": + return [o.mirrorPad(S("x", r, e, t10), S("padding", r, e, t10), S("mode", r, e, t10))]; + case "PadV2": + case "Pad": + return [o.pad(S("x", r, e, t10), S("padding", r, e, t10), S("constantValue", r, e, t10))]; + case "SpaceToBatchND": { + let n = S("blockShape", r, e, t10), s = S("paddings", r, e, t10); + return [o.spaceToBatchND(S("x", r, e, t10), n, s)]; + } + case "BatchToSpaceND": { + let n = S("blockShape", r, e, t10), s = S("crops", r, e, t10); + return [o.batchToSpaceND(S("x", r, e, t10), n, s)]; + } + case "DepthToSpace": { + let n = S("blockSize", r, e, t10), s = S("dataFormat", r, e, t10).toUpperCase(); + return [o.depthToSpace(S("x", r, e, t10), n, s)]; + } + case "BroadcastTo": + return [o.broadcastTo(S("x", r, e, t10), S("shape", r, e, t10))]; + case "BroadcastArgs": + return [o.broadcastArgs(S("s0", r, e, t10), S("s1", r, e, t10))]; + default: + throw TypeError(`Node type ${r.op} is not implemented`); + } +}; +function QC(r, e, t10, o, n = Ne) { + let s = ((a, i, p) => { + switch (a.category) { + case "arithmetic": + return n(() => eN(a, i, p)); + case "basic_math": + return n(() => tN(a, i, p)); + case "control": + return iN(a, i, p); + case "convolution": + return n(() => pN(a, i, p)); + case "creation": + return n(() => cN(a, i, p)); + case "dynamic": + return lN(a, i, p); + case "evaluation": + return n(() => mN(a, i, p)); + case "image": + return n(() => hN(a, i, p)); + case "graph": + return n(() => fN(a, i, p)); + case "logical": + return n(() => gN(a, i, p)); + case "matrices": + return n(() => xN(a, i, p)); + case "normalization": + return n(() => yN(a, i, p)); + case "reduction": + return n(() => bN(a, i, p)); + case "slice_join": + return n(() => CN(a, i, p)); + case "sparse": + return n(() => IN(a, i, p)); + case "spectral": + return n(() => wN(a, i, p)); + case "string": + return n(() => SN(a, i, p)); + case "transformation": + return n(() => vN(a, i, p)); + case "hash_table": + return dN(a, i, p, o); + case "custom": + let u = td(a.op); + if (u && u.customExecutor) + return u.customExecutor(new fd(a, i, p)); + throw TypeError(`Custom op ${a.op} is not registered.`); + default: + throw TypeError(`Unknown op '${a.op}'. File an issue at https://github.com/tensorflow/tfjs/issues so we can add it, or register a custom execution with tf.registerOp()`); + } + })(r, e, t10); + return x.isPromise(s) ? s.then((a) => [].concat(a)) : [].concat(s); +} +var yl = class { + constructor(e = {}, t10 = {}, o = {}, n = {}) { + this.weightMap = e, this.tensorArrayMap = t10, this.tensorListMap = o, this.functionMap = n, this.rootContext = { id: 0, frameName: "", iterationId: 0 }, this.contexts = [this.rootContext], this.lastId = 0, this.generateCurrentContextIds(); + } + newFrame(e, t10) { + return { id: e, frameName: t10, iterationId: 0 }; + } + set currentContext(e) { + this.contexts !== e && (this.contexts = e, this.generateCurrentContextIds()); + } + get currentContext() { + return this.contexts; + } + get currentContextId() { + return this._currentContextIds[0]; + } + get currentContextIds() { + return this._currentContextIds; + } + generateCurrentContextIds() { + let e = []; + for (let t10 = 0; t10 < this.contexts.length - 1; t10++) { + let o = this.contexts.slice(0, this.contexts.length - t10); + e.push(this.contextIdforContexts(o)); + } + e.push(""), this._currentContextIds = e; + } + contextIdforContexts(e) { + return e ? e.map((t10) => t10.id === 0 && t10.iterationId === 0 ? "" : `${t10.frameName}-${t10.iterationId}`).join("/") : ""; + } + enterFrame(e) { + this.contexts && (this.lastId++, this.contexts = this.contexts.slice(), this.contexts.push(this.newFrame(this.lastId, e)), this._currentContextIds.unshift(this.contextIdforContexts(this.contexts))); + } + exitFrame() { + if (this.contexts && this.contexts.length > 1) + this.contexts = this.contexts.slice(), this.contexts.splice(-1), this.currentContextIds.shift(); + else + throw new Error("Cannot exit frame, the context is empty"); + } + nextIteration() { + if (this.contexts && this.contexts.length > 0) { + this.contexts = this.contexts.slice(), this.lastId++; + let e = Object.assign({}, this.contexts[this.contexts.length - 1]); + e.iterationId += 1, e.id = this.lastId, this.contexts.splice(-1, 1, e), this._currentContextIds.splice(0, 1, this.contextIdforContexts(this.contexts)); + } else + throw new Error("Cannot increase frame iteration, the context is empty"); + } + getWeight(e) { + return this.weightMap[e]; + } + addTensorArray(e) { + this.tensorArrayMap[e.id] = e; + } + getTensorArray(e) { + return this.tensorArrayMap[e]; + } + addTensorList(e) { + this.tensorListMap[e.id] = e; + } + getTensorList(e) { + return this.tensorListMap[e]; + } + dispose(e) { + for (let t10 in this.tensorArrayMap) + this.tensorArrayMap[t10].clearAndClose(e); + for (let t10 in this.tensorListMap) + this.tensorListMap[t10].clearAndClose(e); + } +}; +function ZC(r, e, t10, o) { + let n = /* @__PURE__ */ new Set(), s = [], a = null, i = null, p = /* @__PURE__ */ new Set(), u = Object.keys(r).map((m) => Sr(m)[0]), c = []; + o != null && (c = o.map((m) => Sr(m.name)[0])); + let l = [...e]; + for (; l.length > 0; ) { + let m = l.pop(); + if ((JC(m) || B6(m) || V6(m)) && a == null && (a = m, i = a.children.map((f) => f.name).filter((f) => n.has(f))), n.add(m.name), t10[m.name] == null && u.indexOf(m.name) === -1 && c.indexOf(m.name) === -1) { + if (m.inputs.length === 0) { + s.push(m.name); + continue; + } + m.inputs.forEach((f) => { + p.has(f.name) || (p.add(f.name), l.push(f)); + }); + } + } + return { inputs: r, outputs: e, usedNodes: n, missingInputs: s, dynamicNode: a, syncInputs: i }; +} +function kN(r, e, t10) { + let { usedNodes: o, inputs: n } = t10, s = [], a = Object.keys(n).map((c) => Sr(c)[0]).map((c) => r.nodes[c]), i = r.initNodes; + a.forEach((c) => { + o.has(c.name) && s.push(c); + }), r.weights.forEach((c) => { + o.has(c.name) && s.push(c); + }), i != null && i.forEach((c) => { + o.has(c.name) && s.push(c); + }); + let p = /* @__PURE__ */ new Set(), u = []; + for (; s.length > 0; ) { + let c = s.pop(); + p.add(c.name), e[c.name] || u.push(c), c.children.forEach((l) => { + !p.has(l.name) && o.has(l.name) && l.inputs.every((m) => p.has(m.name)) && s.push(l); + }); + } + return u; +} +var O6 = ["Switch", "Merge", "Enter", "Exit", "NextIteration", "StatelessIf", "StatelessWhile", "if", "While"]; +var M6 = ["NonMaxSuppressionV2", "NonMaxSuppressionV3", "NonMaxSuppressionV5", "Where"]; +var L6 = ["HashTable", "HashTableV2", "LookupTableImport", "LookupTableImportV2", "LookupTableFind", "LookupTableFindV2", "LookupTableSize", "LookupTableSizeV2"]; +function JC(r) { + return O6.indexOf(r.op) >= 0; +} +function B6(r) { + return M6.indexOf(r.op) >= 0; +} +function V6(r) { + return L6.indexOf(r.op) >= 0; +} +var Cu = class { + constructor(e, t10) { + this.graph = e, this.parent = t10, this.compiledMap = /* @__PURE__ */ new Map(), this._weightMap = {}, this.SEPERATOR = ",", this._functions = {}, this._functionExecutorMap = {}, this.intermediateTensors = {}, this.keepTensorForDebug = false, this._outputs = e.outputs, this._inputs = e.inputs, this._initNodes = e.initNodes, this._signature = e.signature, this._functions = e.functions, e.functions != null && Object.keys(e.functions).forEach((o) => { + this._functionExecutorMap[o] = new Cu(e.functions[o], this); + }); + } + get weightIds() { + return this.parent ? this.parent.weightIds : this._weightIds; + } + get functionExecutorMap() { + return this.parent ? this.parent.functionExecutorMap : this._functionExecutorMap; + } + get weightMap() { + return this.parent ? this.parent.weightMap : this._weightMap; + } + set weightMap(e) { + let t10 = Object.keys(e).map((o) => e[o].map((n) => n.id)); + this._weightIds = [].concat(...t10), this._weightMap = e; + } + set resourceManager(e) { + this._resourceManager = e; + } + get inputs() { + return this._inputs.map((e) => ({ name: e.name, shape: e.attrParams.shape ? e.attrParams.shape.value : void 0, dtype: e.attrParams.dtype ? e.attrParams.dtype.value : void 0 })); + } + get outputs() { + return this._outputs.map((e) => ({ name: e.name, shape: e.attrParams.shape ? e.attrParams.shape.value : void 0, dtype: e.attrParams.dtype ? e.attrParams.dtype.value : void 0 })); + } + get inputNodes() { + return this._inputs.map((e) => e.signatureKey || e.name); + } + get outputNodes() { + return this._outputs.map((e) => { + let t10 = e.signatureKey || e.name; + return e.defaultOutput ? `${t10}:${e.defaultOutput}` : t10; + }); + } + get functions() { + return Object.keys(this._functions).reduce((e, t10) => (e[t10] = this._functions[t10].signature, e), {}); + } + getCompilationKey(e, t10) { + let o = e.map((s) => s.name).sort(), n = t10.map((s) => s.name).sort(); + return o.join(this.SEPERATOR) + "--" + n.join(this.SEPERATOR); + } + compile(e, t10) { + let o = ZC(e, t10, this.weightMap, this._initNodes), { missingInputs: n, dynamicNode: s, syncInputs: a } = o; + if (s != null) + throw new Error(`This execution contains the node '${s.name}', which has the dynamic op '${s.op}'. Please use model.executeAsync() instead. Alternatively, to avoid the dynamic ops, specify the inputs [${a}]`); + if (n.length > 0) { + let i = t10.map((u) => u.name), p = Object.keys(e); + throw new Error(`Cannot compute the outputs [${i}] from the provided inputs [${p}]. Missing the following inputs: [${n}]`); + } + return kN(this.graph, this.weightMap, o); + } + execute(e, t10) { + e = this.mapInputs(e); + let o = Object.keys(e).sort(); + this.checkInputs(e), this.checkInputShapeAndType(e), t10 = this.mapOutputs(t10), this.checkOutputs(t10); + let n = o.map((l) => this.graph.nodes[Sr(l)[0]]), s = t10.map((l) => Sr(l)[0]), a = s.map((l) => this.graph.nodes[l]); + this.resetIntermediateTensors(), a.length === 0 && (a = this._outputs); + let i = this.getCompilationKey(n, a), p = this.compiledMap.get(i); + p == null && (p = this.compile(e, a), this.compiledMap.set(i, p)); + let u = {}, c = {}; + return Ne(() => { + let l = new yl(this.weightMap, u, c, this.functionExecutorMap), m = Object.assign({}, this.weightMap); + Object.keys(e).forEach((h) => { + let [g, y] = Sr(h), b = []; + b[y] = e[h], m[g] = b; + }); + let f = this.getFrozenTensorIds(m), d = {}; + for (let h = 0; h < p.length; h++) { + let g = p[h]; + if (!m[g.name]) { + let y = QC(g, m, l, this._resourceManager); + if (x.isPromise(y)) + throw new Error(`The execution of the op '${g.op}' returned a promise. Please use model.executeAsync() instead.`); + m[g.name] = y, this.checkTensorForDisposal(g.name, g, m, l, f, s, d); + } + } + return this.parent == null && l.dispose(f), t10.map((h) => Ht(h, m, l)); + }); + } + getFrozenTensorIds(e) { + let t10 = [].concat.apply([], Object.keys(e).map((o) => e[o]).map((o) => o.map((n) => n.id))); + return new Set(t10); + } + checkTensorForDisposal(e, t10, o, n, s, a, i) { + t10.category === "control" || a.indexOf(e) !== -1 || (o[e].forEach((p) => { + p != null && (i[p.id] = (i[p.id] || 0) + t10.children.length); + }), t10.inputs.forEach((p) => { + if (p.category !== "control") { + let u = YT(p.name, o, n); + u != null && u.forEach((c) => { + if (c && !c.kept && !s.has(c.id)) { + let l = i[c.id]; + if (l === 1) { + if (!this.keepTensorForDebug) + c.dispose(); + else { + let [m, f] = zo(t10.name, n); + this.intermediateTensors[m] ? this.intermediateTensors[m][f] = c : (this.intermediateTensors[m] = [], this.intermediateTensors[m][f] = c); + } + delete i[c.id]; + } else + l != null && i[c.id]--; + } + }); + } + })); + } + async executeAsync(e, t10) { + return this._executeAsync(e, t10); + } + disposeIntermediateTensors() { + !this.intermediateTensors || (Object.keys(this.intermediateTensors).forEach((e) => this.intermediateTensors[e].forEach((t10) => t10.dispose())), this.disposeTensorsMap()); + } + disposeTensorsMap() { + !this.tensorsMap || Object.keys(this.tensorsMap).forEach((e) => { + this.tensorsMap[e].forEach((o) => { + o && !o.kept && !o.isDisposed && !this.keepIds.has(o.id) && o.dispose(); + }); + }); + } + getIntermediateTensors() { + return this.tensorsMap; + } + resetIntermediateTensors() { + for (let e in this.intermediateTensors) + this.intermediateTensors[e].forEach((t10) => t10.dispose()), delete this.intermediateTensors[e]; + } + async _executeAsync(e, t10, o = false, n = {}, s = {}) { + o || (e = this.mapInputs(e), this.checkInputs(e), this.checkInputShapeAndType(e), t10 = this.mapOutputs(t10), this.checkOutputs(t10)); + try { + this.keepTensorForDebug = P().getBool("KEEP_INTERMEDIATE_TENSORS"); + } catch (c) { + console.warn(c.message); + } + this.resetIntermediateTensors(); + let a = new yl(this.weightMap, n, s, this.functionExecutorMap); + this.tensorsMap = await this.executeWithControlFlow(e, a, t10, o); + let i = t10.map((c) => Ht(c, this.tensorsMap, a)), p = i.map((c) => c.id), u = Object.keys(e).map((c) => e[c].id); + return this.keepIds = /* @__PURE__ */ new Set([...p, ...u, ...this.weightIds]), this.keepTensorForDebug || this.disposeTensorsMap(), this.parent == null && a.dispose(this.keepIds), i; + } + async executeFunctionAsync(e, t10, o) { + let n = e.reduce((s, a, i) => (s[this.inputs[i].name] = a, s), {}); + return this._executeAsync(n, this.outputNodes, true, t10, o); + } + async executeWithControlFlow(e, t10, o, n) { + let s = Object.keys(e), a = s.map((C) => this.graph.nodes[Sr(C)[0]]), i = o.map((C) => Sr(C)[0]), p = i.map((C) => this.graph.nodes[C]); + p.length === 0 && (p = this._outputs); + let { usedNodes: u, missingInputs: c, dynamicNode: l, syncInputs: m } = ZC(e, p, this.weightMap, this._initNodes), f = [...a, ...this.graph.weights, ...this._initNodes || []].map((C) => ({ node: C, contexts: t10.currentContext })), d = Object.assign({}, this.weightMap); + Object.keys(e).forEach((C) => { + let [w, k] = Sr(C), _ = []; + _[k] = e[C], d[w] = _; + }); + let h = {}, g = this.getFrozenTensorIds(d), y = {}; + for (; f.length > 0; ) { + let C = this.processStack(a, f, t10, d, y, g, i, h, u); + await Promise.all(C); + } + l == null && !n && console.warn("This model execution did not contain any nodes with control flow or dynamic output shapes. You can use model.execute() instead."); + let b = p.filter((C) => !JC(C) && !Ht(C.name, d, t10)).map((C) => C.name); + if (b.length > 0) { + let C = ""; + throw l != null && (C = `Alternatively, to avoid the dynamic ops, use model.execute() and specify the inputs [${m}]`), new Error(`Cannot compute the outputs [${b}] from the provided inputs [${s}]. Consider providing the following inputs: [${c}]. ${C}`); + } + return d; + } + processStack(e, t10, o, n, s, a, i, p, u) { + let c = []; + for (; t10.length > 0; ) { + let l = t10.pop(); + o.currentContext = l.contexts; + let m = ""; + if (l.node.op === "Enter" && S("isConstant", l.node, n, o) && ([m] = zo(l.node.name, o)), n[l.node.name] == null) { + let f = QC(l.node, n, o, this._resourceManager); + m || ([m] = zo(l.node.name, o)); + let d = o.currentContext; + x.isPromise(f) ? c.push(f.then((h) => (n[m] = h, o.currentContext = d, this.checkTensorForDisposal(m, l.node, n, o, a, i, p), this.processChildNodes(l.node, t10, o, n, s, u), h))) : (n[m] = f, this.checkTensorForDisposal(m, l.node, n, o, a, i, p), this.processChildNodes(l.node, t10, o, n, s, u)); + } else + this.processChildNodes(l.node, t10, o, n, s, u); + } + return c; + } + processChildNodes(e, t10, o, n, s, a) { + e.children.forEach((i) => { + let [p] = zo(i.name, o); + s[p] || !a.has(i.name) || (i.op === "Merge" ? i.inputNames.some((u) => !!Ht(u, n, o)) && (s[p] = true, t10.push({ contexts: o.currentContext, node: i })) : i.inputNames.every((u) => !!Ht(u, n, o)) && (s[p] = true, t10.push({ contexts: o.currentContext, node: i }))); + }); + } + dispose() { + Object.keys(this.weightMap).forEach((e) => this.weightMap[e].forEach((t10) => t10.dispose())); + } + checkInputShapeAndType(e) { + Object.keys(e).forEach((t10) => { + let o = e[t10], [n] = Sr(t10), s = this.graph.nodes[n]; + if (s.attrParams.shape && s.attrParams.shape.value) { + let a = s.attrParams.shape.value, i = a.length === o.shape.length && o.shape.every((p, u) => a[u] === -1 || a[u] === p); + x.assert(i, () => `The shape of dict['${s.name}'] provided in model.execute(dict) must be [${a}], but was [${o.shape}]`); + } + s.attrParams.dtype && s.attrParams.dtype.value && x.assert(o.dtype === s.attrParams.dtype.value, () => `The dtype of dict['${s.name}'] provided in model.execute(dict) must be ${s.attrParams.dtype.value}, but was ${o.dtype}`); + }); + } + mapInputs(e) { + let t10 = {}; + for (let o in e) + if (this._signature != null && this._signature.inputs != null && this._signature.inputs[o] != null) { + let n = this._signature.inputs[o]; + t10[n.name] = e[o]; + } else + t10[o] = e[o]; + return t10; + } + checkInputs(e) { + let t10 = Object.keys(e).filter((o) => { + let [n] = Sr(o); + return this.graph.nodes[n] == null; + }); + if (t10.length > 0) + throw new Error(`The dict provided in model.execute(dict) has keys: [${t10}] that are not part of graph`); + } + mapOutputs(e) { + return e.map((t10) => this._signature != null && this._signature.outputs != null && this._signature.outputs[t10] != null ? this._signature.outputs[t10].name : t10, {}); + } + checkOutputs(e) { + e.forEach((t10) => { + let [o] = Sr(t10); + if (!this.graph.nodes[o]) + throw new Error(`The output '${t10}' is not found in the graph`); + }); + } +}; +var xd = class { + constructor(e = {}, t10 = {}) { + this.hashTableNameToHandle = e, this.hashTableMap = t10; + } + addHashTable(e, t10) { + this.hashTableNameToHandle[e] = t10.handle, this.hashTableMap[t10.id] = t10; + } + getHashTableHandleByName(e) { + return this.hashTableNameToHandle[e]; + } + getHashTableById(e) { + return this.hashTableMap[e]; + } + dispose() { + for (let e in this.hashTableMap) + this.hashTableMap[e].clearAndClose(), delete this.hashTableMap[e]; + for (let e in this.hashTableNameToHandle) + this.hashTableNameToHandle[e].dispose(), delete this.hashTableNameToHandle[e]; + } +}; +var z6 = "?tfjs-format=file"; +var W6 = "model.json"; +var bl = class { + constructor(e, t10 = {}, o = va) { + this.modelUrl = e, this.loadOptions = t10, this.version = "n/a", this.io = o, t10 == null && (this.loadOptions = {}), this.resourceManager = new xd(); + } + get modelVersion() { + return this.version; + } + get inputNodes() { + return this.executor.inputNodes; + } + get outputNodes() { + return this.executor.outputNodes; + } + get inputs() { + return this.executor.inputs; + } + get outputs() { + return this.executor.outputs; + } + get weights() { + return this.executor.weightMap; + } + get metadata() { + return this.artifacts.userDefinedMetadata; + } + get modelSignature() { + return this.signature; + } + get modelStructuredOutputKeys() { + return this.structuredOutputKeys; + } + findIOHandler() { + let e = this.modelUrl; + if (e.load != null) + this.handler = e; + else if (this.loadOptions.requestInit != null) + this.handler = this.io.browserHTTPRequest(e, this.loadOptions); + else { + let t10 = this.io.getLoadHandlers(e, this.loadOptions); + if (t10.length === 0) + t10.push(this.io.browserHTTPRequest(e, this.loadOptions)); + else if (t10.length > 1) + throw new Error(`Found more than one (${t10.length}) load handlers for URL '${[e]}'`); + this.handler = t10[0]; + } + } + load() { + if (this.findIOHandler(), this.handler.load == null) + throw new Error("Cannot proceed with model loading because the IOHandler provided does not have the `load` method implemented."); + let e = this.handler.load(); + return x.isPromise(e) ? e.then((t10) => this.loadSync(t10)) : this.loadSync(e); + } + loadSync(e) { + this.artifacts = e; + let t10 = this.artifacts.modelTopology, o = this.artifacts.signature; + if (this.artifacts.userDefinedMetadata != null) { + let s = this.artifacts.userDefinedMetadata; + s.signature != null && (o = s.signature), s.structuredOutputKeys != null && (this.structuredOutputKeys = s.structuredOutputKeys); + } + this.signature = o, this.version = `${t10.versions.producer}.${t10.versions.minConsumer}`; + let n = this.io.decodeWeights(this.artifacts.weightData, this.artifacts.weightSpecs); + if (this.executor = new Cu(xl.Instance.transformGraph(t10, this.signature)), this.executor.weightMap = this.convertTensorMapToTensorsMap(n), this.executor.resourceManager = this.resourceManager, e.modelInitializer != null && e.modelInitializer.node != null) { + let s = xl.Instance.transformGraph(e.modelInitializer); + this.initializer = new Cu(s), this.initializer.weightMap = this.executor.weightMap, this.initializer.resourceManager = this.resourceManager, this.initializerSignature = e.initializerSignature; + } + return true; + } + async save(e, t10) { + if (typeof e == "string") { + let o = this.io.getSaveHandlers(e); + if (o.length === 0) + throw new Error(`Cannot find any save handlers for URL '${e}'`); + if (o.length > 1) + throw new Error(`Found more than one (${o.length}) save handlers for URL '${e}'`); + e = o[0]; + } + if (e.save == null) + throw new Error("GraphModel.save() cannot proceed because the IOHandler provided does not have the `save` attribute defined."); + return e.save(this.artifacts); + } + predict(e, t10) { + let o = this.execute(e, this.outputNodes); + if (this.structuredOutputKeys) { + let n = o instanceof ut ? [o] : o, s = {}; + return n.forEach((a, i) => s[this.structuredOutputKeys[i]] = a), s; + } + return o; + } + normalizeInputs(e) { + if (!(e instanceof ut) && !Array.isArray(e)) { + if (this.signature != null && this.signature.inputs != null) + for (let n in this.signature.inputs) { + let s = this.signature.inputs[n]; + s.resourceId != null && (e[n] = this.resourceIdToCapturedInput[s.resourceId]); + } + return e; + } + e = Array.isArray(e) ? e : [e]; + let t10 = Object.keys(this.resourceIdToCapturedInput).length; + if (e.length + t10 !== this.inputNodes.length) + throw new Error(`Input tensor count mismatch, the graph model has ${this.inputNodes.length - t10} non-resource placeholders, while there are ${e.length} input tensors provided.`); + let o = 0; + return this.inputNodes.reduce((n, s) => { + let a = this.signature ? this.signature.inputs[s] : null; + return a != null && a.resourceId != null ? n[s] = this.resourceIdToCapturedInput[a.resourceId] : n[s] = e[o++], n; + }, {}); + } + normalizeOutputs(e) { + return e = e || this.outputNodes, Array.isArray(e) ? e : [e]; + } + executeInitializerGraph() { + return this.initializer == null ? [] : this.initializerSignature == null ? this.initializer.execute({}, []) : this.initializer.execute({}, Object.keys(this.initializerSignature.outputs)); + } + async executeInitializerGraphAsync() { + return this.initializer == null ? [] : this.initializerSignature == null ? this.initializer.executeAsync({}, []) : this.initializer.executeAsync({}, Object.keys(this.initializerSignature.outputs)); + } + setResourceIdToCapturedInput(e) { + if (this.resourceIdToCapturedInput = {}, this.initializerSignature) { + let t10 = Object.keys(this.initializerSignature.outputs); + for (let o = 0; o < t10.length; o++) { + let n = t10[o], s = this.initializerSignature.outputs[n]; + this.resourceIdToCapturedInput[s.resourceId] = e[o]; + } + } + } + execute(e, t10) { + this.resourceIdToCapturedInput == null && this.setResourceIdToCapturedInput(this.executeInitializerGraph()), e = this.normalizeInputs(e), t10 = this.normalizeOutputs(t10); + let o = this.executor.execute(e, t10); + return o.length > 1 ? o : o[0]; + } + async executeAsync(e, t10) { + this.resourceIdToCapturedInput == null && this.setResourceIdToCapturedInput(await this.executeInitializerGraphAsync()), e = this.normalizeInputs(e), t10 = this.normalizeOutputs(t10); + let o = await this.executor.executeAsync(e, t10); + return o.length > 1 ? o : o[0]; + } + getIntermediateTensors() { + return this.executor.getIntermediateTensors(); + } + disposeIntermediateTensors() { + this.executor.disposeIntermediateTensors(); + } + convertTensorMapToTensorsMap(e) { + return Object.keys(e).reduce((t10, o) => (t10[o] = [e[o]], t10), {}); + } + dispose() { + this.executor.dispose(), this.initializer && (this.initializer.dispose(), this.resourceIdToCapturedInput && Ft(this.resourceIdToCapturedInput)), this.resourceManager.dispose(); + } +}; +async function U6(r, e = {}, t10 = va) { + if (r == null) + throw new Error("modelUrl in loadGraphModel() cannot be null. Please provide a url or an IOHandler that loads the model"); + e == null && (e = {}), e.fromTFHub && typeof r == "string" && (r = H6(r)); + let o = new bl(r, e, t10); + return await o.load(), o; +} +function G6(r) { + if (r == null) + throw new Error("modelUrl in loadGraphModelSync() cannot be null. Please provide model artifacts or an IOHandler that loads the model"); + let e; + if (r instanceof Array) { + let [o, n] = r; + if (!o) + throw new Error("modelJSON must be the first element of the array"); + if (!n || !(n instanceof ArrayBuffer)) + throw new Error("An ArrayBuffer of weights must be the second element of the array"); + if (!("modelTopology" in o)) + throw new Error("Model JSON is missing 'modelTopology'"); + if (!("weightsManifest" in o)) + throw new Error("Model JSON is missing 'weightsManifest'"); + let s = va.getWeightSpecs(o.weightsManifest), a = va.getModelArtifactsForJSONSync(o, s, n); + e = va.fromMemorySync(a); + } else if ("load" in r) + e = r; + else if ("modelTopology" in r && "weightSpecs" in r && "weightData" in r) + e = va.fromMemorySync(r); + else + throw new Error("Unknown model format"); + let t10 = new bl(e); + return t10.load(), t10; +} +function H6(r) { + return r.endsWith("/") || (r = r + "/"), `${r}${W6}${z6}`; +} +var q6 = "4.0.0"; +function K(r, e) { + Array.isArray(r) || (r = [r]), r.forEach((t10) => { + t10 != null && x.assert(t10.dtype !== "complex64", () => `${e} does not support complex64 tensors in the CPU backend.`); + }); +} +var K6 = Bt.whereImpl; +var Si = class extends Jr { + constructor() { + super(), this.blockSize = 48, this.firstUse = true, this.data = new rn(this, cr()); + } + nextDataId() { + return Si.nextDataId++; + } + write(e, t10, o) { + this.firstUse && (this.firstUse = false, P().get("IS_NODE") && I.warn(` +============================ +Hi, looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, visit https://github.com/tensorflow/tfjs-node for more details. +============================`)); + let n = { id: this.nextDataId() }; + return this.data.set(n, { values: e, dtype: o, refCount: 1 }), n; + } + makeTensorInfo(e, t10, o) { + let n; + if (t10 === "string" && o != null && o.length > 0 && x.isString(o[0])) { + let s = o.map((a) => x.encodeString(a)); + n = this.write(s, e, t10); + } else + n = this.write(o, e, t10); + return { dataId: n, shape: e, dtype: t10 }; + } + refCount(e) { + return this.data.has(e) ? this.data.get(e).refCount : 0; + } + incRef(e) { + let t10 = this.data.get(e); + t10.refCount++; + } + decRef(e) { + if (this.data.has(e)) { + let t10 = this.data.get(e); + t10.refCount--; + } + } + move(e, t10, o, n, s) { + this.data.set(e, { values: t10, dtype: n, refCount: s }); + } + numDataIds() { + return this.data.numDataIds(); + } + async read(e) { + return this.readSync(e); + } + readSync(e) { + let { dtype: t10, complexTensorInfos: o } = this.data.get(e); + if (t10 === "complex64") { + let n = this.readSync(o.real.dataId), s = this.readSync(o.imag.dataId); + return I.mergeRealAndImagArrays(n, s); + } + return this.data.get(e).values; + } + bufferSync(e) { + let t10 = this.readSync(e.dataId); + if (e.dtype === "string") + try { + let o = t10.map((n) => x.decodeString(n)); + return ne(e.shape, e.dtype, o); + } catch (o) { + throw new Error("Failed to decode encoded string bytes into utf-8"); + } + return ne(e.shape, e.dtype, t10); + } + makeOutput(e, t10, o) { + return cr().makeTensorFromTensorInfo(this.makeTensorInfo(t10, o, e), this); + } + disposeData(e, t10 = false) { + if (this.data.has(e)) { + if (this.data.get(e).refCount--, !t10 && this.data.get(e).refCount > 0) + return false; + let { complexTensorInfos: o } = this.data.get(e); + o != null && (this.disposeData(o.real.dataId, true), this.disposeData(o.imag.dataId, true)), this.data.delete(e); + } + return true; + } + disposeIntermediateTensorInfo(e) { + this.disposeData(e.dataId); + } + async time(e) { + let t10 = x.now(); + return e(), { kernelMs: x.now() - t10 }; + } + memory() { + return { unreliable: true, reasons: ["The reported memory is an upper bound. Due to automatic garbage collection, the true allocated memory may be less."] }; + } + where(e) { + K([e], "where"); + let t10 = this.readSync(e.dataId); + return K6(e.shape, t10); + } + dispose() { + } + floatPrecision() { + return 32; + } + epsilon() { + return super.epsilon(); + } +}; +Si.nextDataId = 0; +var Ad = {}; +Be(Ad, { addImpl: () => rI, bincountImpl: () => Zp, bincountReduceImpl: () => yd, castImpl: () => tI, ceilImpl: () => oI, concatImpl: () => Iu, equalImpl: () => nI, expImpl: () => aI, expm1Impl: () => uI, floorImpl: () => pI, gatherNdImpl: () => bd, gatherV2Impl: () => Cd, greaterEqualImpl: () => lI, greaterImpl: () => cI, lessEqualImpl: () => fI, lessImpl: () => mI, linSpaceImpl: () => Id, logImpl: () => dI, maxImpl: () => wd, maximumImpl: () => hI, minimumImpl: () => gI, multiplyImpl: () => Cl, negImpl: () => xI, notEqualImpl: () => yI, prodImpl: () => bI, raggedGatherImpl: () => Sd, raggedRangeImpl: () => vd, raggedTensorToTensorImpl: () => kd, rangeImpl: () => Su, rsqrtImpl: () => CI, scatterImpl: () => Aa, sigmoidImpl: () => e2, simpleAbsImpl: () => eI, sliceImpl: () => vu, sparseFillEmptyRowsImpl: () => Td, sparseReshapeImpl: () => Nd, sparseSegmentReductionImpl: () => tc, sqrtImpl: () => o2, squaredDifferenceImpl: () => wI, stridedSliceImpl: () => _d, stringNGramsImpl: () => ku, stringSplitImpl: () => Tu, stringToHashBucketFastImpl: () => Nu, subImpl: () => vI, tileImpl: () => Ed, topKImpl: () => $d, transposeImpl: () => Jp, uniqueImpl: () => Rd }); +function eI(r) { + let e = new Float32Array(r.length); + for (let t10 = 0; t10 < r.length; ++t10) + e[t10] = Math.abs(r[t10]); + return e; +} +var j6 = (r) => { + let { x: e } = r.inputs, t10 = r.backend; + K(e, "abs"); + let o = new Float32Array(x.sizeFromShape(e.shape)), n = t10.data.get(e.dataId).values; + return o = eI(n), t10.makeOutput(o, e.shape, e.dtype); +}; +var TN = { kernelName: sn, backendName: "cpu", kernelFunc: j6 }; +function Le(r) { + return (e, t10, o, n, s) => { + let a = I.assertAndGetBroadcastShape(e, t10), i = a.length, p = x.computeStrides(a), u = x.sizeFromShape(a), c = x.getTypedArrayFromDType(s, u), l = e.length, m = t10.length, f = x.computeStrides(e), d = x.computeStrides(t10), h = I.getBroadcastDims(e, a), g = I.getBroadcastDims(t10, a); + if (h.length + g.length === 0) + for (let y = 0; y < c.length; ++y) + c[y] = r(o[y % o.length], n[y % n.length]); + else + for (let y = 0; y < c.length; ++y) { + let b = x.indexToLoc(y, i, p), C = b.slice(-l); + h.forEach((E) => C[E] = 0); + let w = x.locToIndex(C, l, f), k = b.slice(-m); + g.forEach((E) => k[E] = 0); + let _ = x.locToIndex(k, m, d); + c[y] = r(o[w], n[_]); + } + return [c, a]; + }; +} +function qt(r) { + let { inputs: e, backend: t10 } = r, { real: o, imag: n } = e, s = t10.data.get(o.dataId).values, a = t10.data.get(n.dataId).values, i = t10.makeTensorInfo(o.shape, "complex64"), p = t10.data.get(i.dataId); + return p.complexTensorInfos = { real: t10.makeTensorInfo(o.shape, "float32", s), imag: t10.makeTensorInfo(n.shape, "float32", a) }, i; +} +var NN = { kernelName: aa, backendName: "cpu", kernelFunc: qt }; +function Yp(r, e, t10 = "float32") { + if (t10 === "complex64") { + let n = Yp(r, e, "float32"), s = Yp(r, e, "float32"); + return qt({ inputs: { real: n, imag: s }, backend: r }); + } + let o = x.makeZerosTypedArray(x.sizeFromShape(e), t10); + return r.makeTensorInfo(e, t10, o); +} +function ar(r) { + let { inputs: e, backend: t10 } = r, { x: o } = e; + return t10.incRef(o.dataId), { dataId: o.dataId, shape: o.shape, dtype: o.dtype }; +} +var _N = { kernelName: uo, backendName: "cpu", kernelFunc: ar }; +function Wo(r) { + let { inputs: e, backend: t10 } = r, { input: o } = e, n = t10.data.get(o.dataId).complexTensorInfos.real, s = t10.data.get(n.dataId).values; + return t10.makeTensorInfo(n.shape, n.dtype, s); +} +var EN = { kernelName: la, backendName: "cpu", kernelFunc: Wo }; +function tI(r, e, t10, o) { + if (o === "int32") { + let n = Int32Array.from(r); + return [e, "int32", n]; + } + if (o === "bool") { + let n = x.toTypedArray([0], t10), [s, a] = Le((i, p) => i !== p ? 1 : 0)(e, [], r, n, "bool"); + return [a, "bool", s]; + } + throw new Error(`Error in Cast: failed to cast ${t10} to ${o}`); +} +function Uo(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { dtype: s } = o; + if (s === "complex64") { + if (n.dtype === "complex64") + return ar({ inputs: { x: n }, backend: t10 }); + let c = Yp(t10, n.shape, n.dtype), l = Uo({ inputs: { x: n }, backend: t10, attrs: { dtype: "float32" } }), m = qt({ inputs: { real: l, imag: c }, backend: t10 }); + return t10.disposeIntermediateTensorInfo(c), t10.disposeIntermediateTensorInfo(l), m; + } + if (n.dtype === "complex64") { + let c = Wo({ inputs: { input: n }, backend: t10 }), l = Uo({ inputs: { x: c }, backend: t10, attrs: { dtype: s } }); + return t10.disposeIntermediateTensorInfo(c), l; + } + if (!x.hasEncodingLoss(n.dtype, s)) { + let c = ar({ inputs: { x: n }, backend: t10 }); + return { dataId: c.dataId, shape: c.shape, dtype: s }; + } + let a = t10.data.get(n.dataId).values, [i, p, u] = tI(a, n.shape, n.dtype, s); + return t10.makeTensorInfo(i, p, u); +} +var $N = { kernelName: to, backendName: "cpu", kernelFunc: Uo }; +function Ye(r, e, t10, o) { + return t10 == null ? ({ inputs: n, backend: s }) => { + let { a, b: i } = n, p = s; + K([a, i], r); + let u = p.data.get(a.dataId).values, c = p.data.get(i.dataId).values, l = a.dtype === "string" ? I.fromUint8ToStringArray(u) : u, m = a.dtype === "string" ? I.fromUint8ToStringArray(c) : c, f = o || a.dtype, [d, h] = e(a.shape, i.shape, l, m, f); + return p.makeTensorInfo(h, f, d); + } : ({ inputs: n, backend: s }) => { + let { a, b: i } = n, p = s; + if (a.dtype === "complex64" || i.dtype === "complex64") { + let u = Uo({ inputs: { x: a }, backend: p, attrs: { dtype: "complex64" } }), c = p.data.get(u.dataId), l = c.complexTensorInfos.real, m = c.complexTensorInfos.imag, f = p.data.get(l.dataId).values, d = p.data.get(m.dataId).values, h = Uo({ inputs: { x: i }, backend: p, attrs: { dtype: "complex64" } }), g = p.data.get(h.dataId), y = g.complexTensorInfos.real, b = g.complexTensorInfos.imag, C = p.data.get(y.dataId).values, w = p.data.get(b.dataId).values, [k, _, E] = t10(a.shape, i.shape, f, d, C, w), R = p.makeTensorInfo(E, "float32", k), A = p.makeTensorInfo(E, "float32", _), D = qt({ inputs: { real: R, imag: A }, backend: p }); + return p.disposeIntermediateTensorInfo(u), p.disposeIntermediateTensorInfo(h), p.disposeIntermediateTensorInfo(R), p.disposeIntermediateTensorInfo(A), D; + } else { + let u = p.data.get(a.dataId).values, c = p.data.get(i.dataId).values, l = o || a.dtype, [m, f] = e(a.shape, i.shape, u, c, l); + return p.makeTensorInfo(f, l, m); + } + }; +} +function Qp(r) { + return (e, t10, o, n, s, a) => { + let i = I.assertAndGetBroadcastShape(e, t10), p = x.sizeFromShape(i), u = i.length, c = x.computeStrides(i), l = x.getTypedArrayFromDType("float32", p), m = x.getTypedArrayFromDType("float32", p), f = I.getBroadcastDims(e, i), d = I.getBroadcastDims(t10, i), h = I.mergeRealAndImagArrays(o, n), g = I.mergeRealAndImagArrays(s, a), y = e.length, b = x.computeStrides(e), C = t10.length, w = x.computeStrides(t10); + if (f.length + d.length === 0) + for (let k = 0; k < l.length; k++) { + let _ = k % h.length, E = k % g.length, R = r(h[_ * 2], h[_ * 2 + 1], g[E * 2], g[E * 2 + 1]); + l[k] = R.real, m[k] = R.imag; + } + else + for (let k = 0; k < l.length; k++) { + let _ = x.indexToLoc(k, u, c), E = _.slice(-y); + f.forEach((M) => E[M] = 0); + let R = x.locToIndex(E, y, b), A = _.slice(-C); + d.forEach((M) => A[M] = 0); + let D = x.locToIndex(A, C, w), O = r(h[R * 2], h[R * 2 + 1], g[D * 2], g[D * 2 + 1]); + l[k] = O.real, m[k] = O.imag; + } + return [l, m, i]; + }; +} +var rI = Le((r, e) => r + e); +var X6 = Qp((r, e, t10, o) => ({ real: r + t10, imag: e + o })); +var Hs = Ye(_r, rI, X6); +var RN = { kernelName: _r, backendName: "cpu", kernelFunc: Hs }; +function Zp(r, e, t10, o, n) { + let s = x.sizeFromShape(o), a = x.makeZerosTypedArray(n, t10); + for (let i = 0; i < r.length; i++) { + let p = r[i]; + if (p < 0) + throw new Error("Input x must be non-negative!"); + p >= n || (s > 0 ? a[p] += e[i] : a[p] += 1); + } + return a; +} +function yd(r, e, t10, o = false) { + let n = r.shape[0], s = r.shape[1], a = ne([n, t10], e.dtype); + for (let i = 0; i < n; i++) + for (let p = 0; p < s; p++) { + let u = r.get(i, p); + if (u < 0) + throw new Error("Input x must be non-negative!"); + u >= t10 || (o ? a.set(1, i, u) : e.size > 0 ? a.set(a.get(i, u) + e.get(i, p), i, u) : a.set(a.get(i, u) + 1, i, u)); + } + return a; +} +function vr(r) { + return (e, t10, o) => { + let n = x.getTypedArrayFromDType(t10, e.length); + for (let s = 0; s < e.length; ++s) + n[s] = r(e[s], o); + return n; + }; +} +function we(r, e, t10) { + return ({ inputs: o, attrs: n, backend: s }) => { + let { x: a } = o; + if (K(a, r), a.dtype === "string" || t10 === "string") + throw new Error("unaryKernelFunc does not support string input/output"); + let i = s, p = i.data.get(a.dataId).values, u = x.sizeFromShape(a.shape), c = t10 || a.dtype, l = x.getArrayFromDType(c, u); + for (let m = 0; m < u; ++m) + l[m] = e(p[m], n); + return i.makeTensorInfo(a.shape, c, l); + }; +} +function Go(r, e, t10) { + return ({ inputs: o, attrs: n, backend: s }) => { + let { x: a } = o; + if (K(a, r), a.dtype === "string" || t10 === "string") + throw new Error("unaryKernelFunc does not support string input/output"); + let i = s, p = i.data.get(a.dataId).values, u = t10 || a.dtype, c = e(p, u, n); + return i.makeTensorInfo(a.shape, u, c); + }; +} +var oI = vr((r) => Math.ceil(r)); +var Y6 = Go(ro, oI); +var AN = { kernelName: ro, backendName: "cpu", kernelFunc: Y6 }; +function Iu(r, e, t10, o) { + let n = x.getArrayFromDType(t10, x.sizeFromShape(e)); + if (o && t10 !== "string") { + let s = 0; + r.forEach((a) => { + let i = x.sizeFromShape(a.shape); + n.set(a.vals, s), s += i; + }); + } else { + let s = 0; + r.forEach((a) => { + let i = t10 === "string" ? I.fromUint8ToStringArray(a.vals) : a.vals, p = 0; + for (let u = 0; u < a.shape[0]; ++u) { + let c = u * e[1] + s; + for (let l = 0; l < a.shape[1]; ++l) + n[c + l] = i[p++]; + } + s += a.shape[1]; + }); + } + return n; +} +var nI = Le((r, e) => r === e ? 1 : 0); +var sI = Ye(oo, nI, null, "bool"); +var FN = { kernelName: oo, backendName: "cpu", kernelFunc: sI }; +var aI = vr((r) => Math.exp(r)); +var iI = Go(no, aI, "float32"); +var DN = { kernelName: no, backendName: "cpu", kernelFunc: iI }; +var uI = vr((r) => Math.expm1(r)); +var Q6 = Go(wn, uI); +var PN = { kernelName: wn, backendName: "cpu", kernelFunc: Q6 }; +var pI = vr((r) => Math.floor(r)); +var Z6 = Go(so, pI); +var ON = { kernelName: so, backendName: "cpu", kernelFunc: Z6 }; +function bd(r, e, t10, o, n, s, a, i, p) { + let u = ne([o, s], t10); + for (let c = 0; c < o; c++) { + let l = [], m = 0; + for (let f = 0; f < n; f++) { + let d = r[c * n + f]; + m += d * a[f], l.push(d); + } + if (m < 0 || m >= p / s) + throw new Error(`Invalid indices: ${l} does not index into ${i}`); + for (let f = 0; f < s; f++) + u.values[c * s + f] = e.get(...e.indexToLoc(m * s + f)); + } + return u; +} +function Cd(r, e, t10) { + let o = ne(t10, r.dtype); + for (let n = 0; n < o.size; ++n) { + let a = o.indexToLoc(n).slice(), i = a[0], p = a[2], u = e.locToIndex([i, p]); + a[2] = e.values[u]; + let c = r.locToIndex(a); + 0 <= c && c < r.values.length && (o.values[n] = r.values[c]); + } + return o; +} +var cI = Le((r, e) => r > e ? 1 : 0); +var J6 = Ye(ao, cI, null, "bool"); +var MN = { kernelName: ao, backendName: "cpu", kernelFunc: J6 }; +var lI = Le((r, e) => r >= e ? 1 : 0); +var ej = Ye(io, lI, null, "bool"); +var LN = { kernelName: io, backendName: "cpu", kernelFunc: ej }; +var mI = Le((r, e) => r < e ? 1 : 0); +var tj = Ye(po, mI, null, "bool"); +var BN = { kernelName: po, backendName: "cpu", kernelFunc: tj }; +var fI = Le((r, e) => r <= e ? 1 : 0); +var rj = Ye(co, fI, null, "bool"); +var VN = { kernelName: co, backendName: "cpu", kernelFunc: rj }; +function Id(r, e, t10) { + let o = (e - r) / (t10 - 1), n = x.makeZerosTypedArray(t10, "float32"); + n[0] = r; + for (let s = 1; s < n.length; s++) + n[s] = n[s - 1] + o; + return n; +} +var dI = vr((r) => Math.log(r)); +var oj = Go(lo, dI); +var zN = { kernelName: lo, backendName: "cpu", kernelFunc: oj }; +function wd(r, e, t10, o) { + let n = x.getTypedArrayFromDType(o, x.sizeFromShape(t10)); + for (let s = 0; s < n.length; ++s) { + let a = s * e, i = r[a]; + for (let p = 0; p < e; ++p) { + let u = r[a + p]; + (Number.isNaN(u) || u > i) && (i = u); + } + n[s] = i; + } + return n; +} +var hI = Le((r, e) => Math.max(r, e)); +var nj = Ye(mo, hI); +var WN = { kernelName: mo, backendName: "cpu", kernelFunc: nj }; +var gI = Le((r, e) => Math.min(r, e)); +var sj = Ye(fo, gI); +var UN = { kernelName: fo, backendName: "cpu", kernelFunc: sj }; +var Cl = Le((r, e) => r * e); +var aj = Qp((r, e, t10, o) => ({ real: r * t10 - e * o, imag: r * o + e * t10 })); +var wu = Ye(ho, Cl, aj); +var GN = { kernelName: ho, backendName: "cpu", kernelFunc: wu }; +function xI(r, e, t10) { + let o = x.createScalarValue(-1, t10); + return Cl([], e, o, r, t10); +} +function ij(r) { + let { inputs: e, backend: t10 } = r, { x: o } = e; + K(o, "neg"); + let n = t10.data.get(o.dataId).values, [s, a] = xI(n, o.shape, o.dtype); + return t10.makeTensorInfo(a, o.dtype, s); +} +var HN = { kernelName: Pn, backendName: "cpu", kernelFunc: ij }; +var yI = Le((r, e) => r !== e ? 1 : 0); +var uj = Ye(go, yI, null, "bool"); +var qN = { kernelName: go, backendName: "cpu", kernelFunc: uj }; +function Jp(r, e, t10, o, n) { + let s = e.length, a = x.sizeFromShape(e), i = x.computeStrides(e), p = x.computeStrides(n), u = x.getTypedArrayFromDType(t10, x.sizeFromShape(n)); + for (let c = 0; c < a; ++c) { + let l = x.indexToLoc(c, s, i), m = new Array(l.length); + for (let d = 0; d < m.length; d++) + m[d] = l[o[d]]; + let f = x.locToIndex(m, s, p); + u[f] = r[c]; + } + return u; +} +function bt(r) { + let { inputs: e, attrs: t10, backend: o } = r, { x: n } = e, { perm: s } = t10; + K(n, "transpose"); + let a = n.shape.length, i = new Array(a); + for (let l = 0; l < i.length; l++) + i[l] = n.shape[s[l]]; + let p = o.data.get(n.dataId).values, u = Jp(p, n.shape, n.dtype, s, i); + return { dataId: o.write(u, i, n.dtype), shape: i, dtype: n.dtype }; +} +var KN = { kernelName: Mr, backendName: "cpu", kernelFunc: bt }; +function bI(r, e, t10, o) { + let [n, s] = I.computeOutAndReduceShapes(r, o), a = ct(e, "int32"), i = x.makeZerosTypedArray(x.sizeFromShape(n), a), p = x.sizeFromShape(s); + for (let u = 0; u < i.length; ++u) { + let c = u * p, l = 1; + for (let m = 0; m < p; ++m) + l *= t10[c + m]; + i[u] = l; + } + return { outVals: i, outShape: n, outDtype: a }; +} +function pj(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { axis: s, keepDims: a } = o; + K(n, "prod"); + let i = n.shape.length, p = x.parseAxisParam(s, n.shape), u = I.getAxesPermutation(p, i), c = p, l = n, m = []; + u != null && (l = bt({ inputs: { x: n }, backend: t10, attrs: { perm: u } }), m.push(l), c = I.getInnerMostAxes(c.length, i)); + let f = t10.data.get(l.dataId).values, { outVals: d, outShape: h, outDtype: g } = bI(l.shape, l.dtype, f, c), y = h; + return a && (y = I.expandShapeToKeepDim(h, p)), m.forEach((b) => t10.disposeIntermediateTensorInfo(b)), t10.makeTensorInfo(y, g, d); +} +var jN = { kernelName: Ao, backendName: "cpu", kernelFunc: pj }; +function cj(r, e, t10) { + r.forEach((o, n) => { + if (o < 0 || o >= t10) { + let s = x.indexToLoc(n, e.length, x.computeStrides(e)).join(","); + throw new Error(`indices[${s}] = ${o} is not in [0, ${t10})`); + } + }); +} +function lj(r, e) { + for (let t10 = 0; t10 < r.length; ++t10) { + let o = r[t10], n = t10 === r.length - 1 ? e : r[t10 + 1].length; + if (o.length === 0) + throw new Error("Ragged splits may not be empty"); + if (o[0] < 0) + throw new Error("Ragged splits must be non-negative"); + if (o[o.length - 1] > n) + throw new Error("Ragged splits must not point past values"); + for (let s = 1; s < o.length; ++s) + if (o[s - 1] > o[s]) + throw new Error("Ragged splits must be sorted in ascending order"); + } +} +function mj(r, e, t10, o) { + let n = [], s = 0, a = e.length - 1 + t10.length, i = new Array(a).fill(null).map(() => [0]); + lj(t10, o); + let p = 1; + for (let u = 0; u < e.length - 1; ++u) { + p *= e[u]; + let c = e[u + 1]; + for (let l = 1; l < p + 1; ++l) + i[u].push(l * c); + } + for (let u = 0; u < r.length; ++u) { + let c = r[u], l = r[u] + 1; + for (let m = 0; m < t10.length; ++m) { + let f = t10[m], d = m + e.length - 1; + if (d >= 0) { + let h = i[d], g = h[h.length - 1] - f[c]; + for (let y = c; y < l; ++y) + i[d].push(f[y + 1] + g); + } + c = f[c], l = f[l]; + } + l !== c && (n.push([c, l]), s += l - c); + } + return { outSplits: i, valueSlices: n, numValues: s }; +} +function fj(r) { + let e = []; + for (let t10 = 0; t10 < r.length; ++t10) { + let o = r[t10].length, n = x.getArrayFromDType("int32", o); + e.push(n), r[t10].forEach((s, a) => n[a] = s); + } + return e; +} +function XN(r, e) { + let t10 = r.slice(0, e); + for (; t10.length < e; ) + t10.push(1); + for (let o = e; o < r.length; o++) + t10[e - 1] *= r[o]; + return t10; +} +function dj(r, e, t10, o, n, s) { + let a = XN(e, 2)[1], i = XN(s, 2)[1], p = 0; + for (let u of t10) + for (let c = u[0]; c < u[1]; ++c) { + for (let l = 0; l < o; ++l) + n[p * i + l] = r[c * a + l]; + ++p; + } +} +function hj(r, e, t10, o, n) { + let s = e.slice(); + s[0] = n; + let a = x.getArrayFromDType(t10, x.sizeFromShape(s)), i = r.length, p = i === 0 ? 0 : i / e[0]; + return dj(r, e, o, p, a, s), [a, s]; +} +function Sd(r, e, t10, o, n, s, a, i) { + if (r.length === 0) + throw new Error("paramsNestedSplits must be non empty"); + if (e[0].length === 0) + throw new Error("Split tensors must not be scalars"); + let p = e[0][0] - 1; + if (cj(s, a, p), o.length === 0) + throw new Error("params.rank must be nonzero"); + let u = o[0], { outSplits: c, valueSlices: l, numValues: m } = mj(s, a, r, u), f = fj(c), d = hj(t10, o, n, l, m); + return [f, d[0], d[1]]; +} +var YN = 2147483647; +function vd(r, e, t10, o, n, s, a) { + if (e.length > 1) + throw new Error("starts must be a scalar or vector"); + if (n.length > 1) + throw new Error("limits must be a scalar or vector"); + if (a.length > 1) + throw new Error("deltas must be a scalar or vector"); + let i = e.length === 0, p = n.length === 0, u = a.length === 0, c = []; + i || c.push(e[0]), p || c.push(n[0]), u || c.push(a[0]); + for (let g = 1; g < c.length; ++g) + if (c[g] !== c[g - 1]) + throw new Error("starts, limits, and deltas must have the same shape"); + let l = c.length === 0 ? 1 : c[0], m = x.getArrayFromDType("int32", l + 1); + m[0] = 0; + for (let g = 0; g < l; ++g) { + let y = i ? r[0] : r[g], b = p ? o[0] : o[g], C = u ? s[0] : s[g]; + if (C === 0) + throw new Error("Requires delta != 0"); + let w; + if (C > 0 && b < y || C < 0 && b > y) + w = 0; + else if (w = Math.ceil(Math.abs((b - y) / C)), w > YN) + throw new Error(`Requires ((limit - start) / delta) <= ${YN}`); + m[g + 1] = m[g] + w; + } + let f = m[l], d = x.getArrayFromDType(t10, f), h = 0; + for (let g = 0; g < l; ++g) { + let y = m[g + 1] - m[g], b = i ? r[0] : r[g], C = u ? s[0] : s[g]; + for (let w = 0; w < y; ++w) + d[h++] = b, b += C; + } + return [m, d]; +} +var Ho = I.RowPartitionType; +var ec = class { + constructor(e, t10, o, n, s, a, i, p, u, c) { + this.shape = e, this.shapeShape = t10, this.values = o, this.valuesShape = n, this.valuesDType = s, this.defaultValue = a, this.defaultValueShape = i, this.rowPartitionValues = p, this.rowPartitionValuesShapes = u, this.rowPartitionTypes = I.getRowPartitionTypesHelper(c), this.raggedRank = I.getRaggedRank(this.rowPartitionTypes); + } + getRowPartitionTypeByDimension(e) { + return this.rowPartitionTypes[0] === Ho.FIRST_DIM_SIZE ? this.rowPartitionTypes[e + 1] : this.rowPartitionTypes[e]; + } + getRowPartitionTensor(e) { + return this.rowPartitionTypes[0] === Ho.FIRST_DIM_SIZE ? this.rowPartitionValues[e + 1] : this.rowPartitionValues[e]; + } + getMaxWidth(e) { + let t10 = this.getRowPartitionTensor(e - 1); + switch (this.getRowPartitionTypeByDimension(e - 1)) { + case Ho.VALUE_ROWIDS: + return ec.getMaxWidthValueRowID(t10); + case Ho.ROW_SPLITS: + return ec.getMaxWidthRowSplit(t10); + default: + throw new Error(`Cannot handle partition type ${Ho[this.getRowPartitionTypeByDimension(e - 1)]}`); + } + } + static getMaxWidthRowSplit(e) { + let t10 = e.length; + if (t10 === 0 || t10 === 1) + return 0; + let o = 0; + for (let n = 0; n < t10 - 1; ++n) { + let s = e[n + 1] - e[n]; + s > o && (o = s); + } + return o; + } + static getMaxWidthValueRowID(e) { + let t10 = e.length; + if (t10 === 0) + return 0; + let o = 0, n = e[0], s = 0; + for (let a = 1; a < t10; ++a) { + let i = e[a]; + i !== n && (n = i, s = Math.max(a - o, s), o = a); + } + return Math.max(t10 - o, s); + } + tensorShapeFromTensor(e, t10, o = true) { + if (t10.length === 0) { + if (e[0] === -1) + return []; + throw new Error("The only valid scalar shape tensor is the fully unknown shape specified as -1."); + } + return ZN(e, o); + } + calculateOutputSize(e) { + let t10 = this.valuesShape, o = this.defaultValueShape; + I.validateDefaultValueShape(o, t10); + let n = this.tensorShapeFromTensor(this.shape, this.shapeShape), a = I.combineRaggedTensorToTensorShapes(this.raggedRank, n, t10); + a[0] < 0 && (a[0] = e); + for (let i = 1; i <= this.raggedRank; ++i) + a[i] < 0 && (a[i] = this.getMaxWidth(i)); + return a; + } + calculateFirstParentOutputIndex(e, t10, o) { + let n = Math.min(e, o), s = [], a = 0; + for (let i = 0; i < n; ++i, a += t10) + s.push(a); + for (let i = n; i < e; ++i) + s.push(-1); + return x.assert(s.length === e, () => "Final length of result must be equal to firstDimension."), s; + } + calculateOutputIndexRowSplit(e, t10, o, n) { + let s = e.length, a = []; + for (let i = 0; i < s - 1; ++i) { + let p = e[i + 1] - e[i], u = Math.min(n, p), c = t10[i]; + c === -1 && (u = 0); + for (let l = 0; l < u; ++l) + a.push(c), c += o; + for (let l = 0; l < p - u; ++l) + a.push(-1); + } + if (s > 0 && a.length !== e[s - 1]) + throw new Error("Invalid row split size."); + return a; + } + calculateOutputIndexValueRowID(e, t10, o, n) { + let s = e.length, a = []; + if (s === 0) + return []; + let i = 0, p = e[0]; + if (p >= t10.length) + throw new Error(`Got currentValueRowId=${p}, which is not less than ${t10.length}`); + let u = t10[p]; + a.push(u); + for (let c = 1; c < s; ++c) { + let l = e[c]; + if (l === p) + u >= 0 && (++i, i < n ? u += o : u = -1); + else { + if (i = 0, p = l, l >= t10.length) + throw new Error(`Got nextValueRowId=${l} which is not less than ${t10.length}`); + u = t10[l]; + } + a.push(u); + } + if (a.length !== e.length) + throw new Error("Invalid row ids."); + return a; + } + calculateOutputIndex(e, t10, o, n) { + let s = this.getRowPartitionTensor(e), a = this.getRowPartitionTypeByDimension(e); + switch (a) { + case Ho.VALUE_ROWIDS: + return this.calculateOutputIndexValueRowID(s, t10, o, n); + case Ho.ROW_SPLITS: + if (s.length - 1 > t10.length) + throw new Error(`Row partition size is greater than output size: ${s.length - 1} > ${t10.length}`); + return this.calculateOutputIndexRowSplit(s, t10, o, n); + default: + throw new Error(`Unsupported partition type: ${Ho[a]}`); + } + } + getFirstDimensionSize() { + let e = this.rowPartitionValues[0]; + if (this.rowPartitionTypes.length === 0) + throw new Error("No row_partition_types given."); + let t10 = this.rowPartitionTypes[0]; + switch (t10) { + case Ho.FIRST_DIM_SIZE: + return e[0]; + case Ho.VALUE_ROWIDS: + throw new Error("Cannot handle VALUE_ROWIDS in first dimension."); + case Ho.ROW_SPLITS: + return this.rowPartitionValuesShapes[0][0] - 1; + default: + throw new Error(`Cannot handle type ${Ho[t10]}`); + } + } + compute() { + if (this.rowPartitionValues[0].length <= 0) + throw new Error("Invalid first partition input. Tensor requires at least one element."); + let t10 = this.getFirstDimensionSize(), o = this.calculateOutputSize(t10), n = new Array(this.raggedRank + 1); + n[n.length - 1] = 1; + for (let p = n.length - 2; p >= 0; --p) + n[p] = n[p + 1] * o[p + 1]; + let s = ZN(o, false), a = x.getArrayFromDType(this.valuesDType, x.sizeFromShape(s)); + if (n[0] * o[0] > 0) { + let p = this.calculateFirstParentOutputIndex(t10, n[0], o[0]); + for (let u = 1; u <= this.raggedRank; ++u) + p = this.calculateOutputIndex(u - 1, p, n[u], o[u]); + this.setOutput(this.raggedRank, p, a, s); + } + return [s, a]; + } + setOutput(e, t10, o, n) { + if (o.length === 0) + return; + let s = this.values, a = o, i = n.slice(); + i = i.slice(e + 1); + let p = x.sizeFromShape(i), u = t10.length, c = this.defaultValue; + if (c.length !== p && c.length !== 1) { + let d = this.defaultValueShape; + Ne(() => { + let h = z(c, d); + c = Ls(h, i).dataSync(); + }); + } + let l = 0, m = 0, f = 0; + for (let d = 0; d <= u; ++d) { + let h = d < u ? t10[d] : -1; + if (h === f) { + ++f; + continue; + } + if (m < f) { + let g = s.subarray(l * p), y = a.subarray(m * p), b = (f - m) * p; + QN(y, g, b); + } + if (d >= u) { + let g = o.length; + h = Math.floor(g / p); + } + if (h > f) + if (this.defaultValue.length === 1) + a.subarray(f * p, h * p).fill(this.defaultValue[0]), f = h; + else + for (; h > f; ) { + let g = a.slice(f * p); + QN(g, c, p), ++f; + } + h < 0 ? (l = d + 1, m = f) : (l = d, m = f, f = m + 1); + } + } +}; +function QN(r, e, t10) { + for (let o = 0; o < t10; o++) + r[o] = e[o]; +} +function ZN(r, e) { + let t10 = []; + for (let o of r) { + if (o < 0) { + if (!e) + throw new Error(`Dimension ${o} must be >= 0`); + if (o < -1) + throw new Error(`Dimension ${o} must be >= -1`); + o = -1; + } + t10.push(o); + } + return t10; +} +function kd(r, e, t10, o, n, s, a, i, p, u) { + return new ec(r, e, t10, o, n, s, a, i, p, u).compute(); +} +function Su(r, e, t10, o) { + let n = r === e, s = r < e && t10 < 0, a = e < r && t10 > 1; + if (n || s || a) + return x.makeZerosTypedArray(0, o); + let i = Math.abs(Math.ceil((e - r) / t10)), p = x.makeZerosTypedArray(i, o); + e < r && t10 === 1 && (t10 = -1), p[0] = r; + for (let u = 1; u < p.length; u++) + p[u] = p[u - 1] + t10; + return p; +} +var CI = vr((r) => 1 / Math.sqrt(r)); +var gj = Go(xo, CI); +var JN = { kernelName: xo, backendName: "cpu", kernelFunc: gj }; +function Aa(r, e, t10, o, n, s, a, i, p, u) { + let c = [o / n, n], l = r.values, m = e.values; + if (o === 0) + return ne(t10, e.dtype); + let f = ne(c, e.dtype); + typeof p == "string" || typeof p == "number" ? f.values.fill(p) : typeof p == "boolean" && f.values.fill(+p); + for (let d = 0; d < s; d++) { + let h = [], g = 0; + for (let y = 0; y < a; y++) { + let b = l[d * a + y]; + h.push(b), g += b * i[y]; + } + if (g < 0 || g >= o / n) + throw new Error(`Invalid indices: ${h} does not index into ${t10}`); + for (let y = 0; y < n; y++) + u ? f.values[g * n + y] += m[d * n + y] : f.values[g * n + y] = e.rank === 0 ? m[0] : m[d * n + y]; + } + return f; +} +var e2 = vr((r) => 1 / (1 + Math.exp(-r))); +var II = we(yo, (r) => 1 / (1 + Math.exp(-r))); +var t2 = { kernelName: yo, backendName: "cpu", kernelFunc: II }; +function vu(r, e, t10, o, n) { + let s = et.isSliceContinous(o, e, t10), a = x.sizeFromShape(t10), i = x.computeStrides(o); + if (s) { + let l = et.computeFlatOffset(e, i); + return n === "string" ? r.slice(l, l + a) : r.subarray(l, l + a); + } + let p = n === "string" ? I.fromUint8ToStringArray(r) : r, u = ne(o, n, p), c = ne(t10, n); + for (let l = 0; l < c.size; ++l) { + let m = c.indexToLoc(l), f = m.map((d, h) => d + e[h]); + c.set(u.get(...f), ...m); + } + return n === "string" ? I.fromStringArrayToUint8(c.values) : c.values; +} +function qo(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { begin: s, size: a } = o; + K(n, "slice"); + let [i, p] = et.parseSliceParams(n, s, a); + et.assertParamsValid(n, i, p); + let u = t10.data.get(n.dataId).values, c = vu(u, i, p, n.shape, n.dtype); + return t10.makeTensorInfo(p, n.dtype, c); +} +var r2 = { kernelName: qn, backendName: "cpu", kernelFunc: qo }; +function Td(r, e, t10, o, n, s, a) { + let i = e[0], p = s[0], u = new Array(p), c = new Array(i), l = e[1]; + if (p === 0) { + if (i !== 0) + throw new Error(I.getSparseFillEmptyRowsIndicesDenseShapeMismatch(i)); + let g = x.getArrayFromDType(t10, 0), y = x.getArrayFromDType(n, 0); + return [g, [0, l], y, u, c]; + } + let m = true, f = 0, d = new Array(p).fill(0); + for (let g = 0; g < i; ++g) { + let y = r[g * l]; + if (y < 0) + throw new Error(I.getSparseFillEmptyRowsNegativeIndexErrorMessage(g, y)); + if (y >= p) + throw new Error(I.getSparseFillEmptyRowsOutOfRangeIndexErrorMessage(g, y, p)); + ++d[y], m = m && y >= f, f = y; + } + let h = true; + for (let g = 0; g < p; ++g) { + let y = d[g] === 0; + u[g] = y, h = h && !y, d[g] = Math.max(d[g], 1), g > 0 && (d[g] += d[g - 1]); + } + if (h && m) { + let g = r, y = o; + for (let b = 0; b < i; ++b) + c[b] = b; + return [g, [i, l], y, u, c]; + } else { + let g = d[p - 1], y = x.getArrayFromDType(t10, g * l), b = x.getArrayFromDType(n, g), C = new Array(p).fill(0); + for (let w = 0; w < i; ++w) { + let k = r[w * l], _ = C[k], E = (k === 0 ? 0 : d[k - 1]) + _; + C[k]++; + for (let R = 0; R < l; ++R) + y[E * l + R] = r[w * l + R]; + b[E] = o[w], c[w] = E; + } + for (let w = 0; w < p; ++w) + if (C[w] === 0) { + let _ = w === 0 ? 0 : d[w - 1]; + y[_ * l + 0] = w; + for (let E = 1; E < l; ++E) + y[_ * l + E] = 0; + b[_] = a; + } + return [y, [g, l], b, u, c]; + } +} +function Nd(r, e, t10, o, n) { + let s = x.sizeFromShape(o), a = e[0], i = n.length, p = [], u = 1, c = -1; + for (let g = 0; g < i; ++g) { + let y = n[g]; + if (y === -1) { + if (c !== -1) + throw new Error(I.getSparseReshapeMultipleNegativeOneOutputDimErrorMessage(c, g)); + c = g, p.push(1); + } else { + if (y < 0) + throw new Error(I.getSparseReshapeNegativeOutputDimErrorMessage(g, y)); + u *= y, p.push(y); + } + } + if (c !== -1) { + if (u <= 0) + throw new Error(I.getSparseReshapeEmptyTensorZeroOutputDimErrorMessage()); + let g = Math.trunc(s / u); + if (u * g !== s) + throw new Error(I.getSparseReshapeInputOutputMultipleErrorMessage(o, p)); + p[c] = g; + } + if (x.sizeFromShape(p) !== s) + throw new Error(I.getSparseReshapeInputOutputMismatchErrorMessage(o, p)); + let m = o.length, f = []; + if (m > 0) { + f[m - 1] = 1; + for (let g = m - 2; g >= 0; --g) + f[g] = f[g + 1] * o[g + 1]; + } + let d = []; + if (i > 0) { + d[i - 1] = 1; + for (let g = i - 2; g >= 0; --g) + d[g] = d[g + 1] * p[g + 1]; + } + let h = x.getArrayFromDType(t10, a * i); + for (let g = 0; g < a; ++g) { + let y = 0; + for (let b = 0; b < m; ++b) + y += r[g * m + b] * f[b]; + for (let b = 0; b < i; ++b) + h[g * i + b] = Math.trunc(y / d[b]), y %= d[b]; + } + return [h, [a, i], p]; +} +function tc(r, e, t10, o, n, s = false, a = 0) { + let i = o.length, p = [e[0], r.length / e[0]], u = p[1], l = i > 0 ? n[i - 1] + 1 : 0; + if (l < 0) + throw new Error(I.getSparseSegmentReductionNegativeSegmentIdsErrorMessage()); + let m = e.slice(); + m[0] = l; + let f = m.reduce((C, w) => C * w, 1), d = x.getArrayFromDType(t10, f); + if (i === 0) + return l > 0 && d.fill(a), [d, m]; + if (l <= 0) + throw new Error(I.getSparseSegmentReductionNegativeSegmentIdsErrorMessage()); + let h = 0, g = 1, y = 0, b = n[h]; + for (; ; ) { + let C = 0; + if (g < i) { + if (C = n[g], b === C) { + ++g; + continue; + } + if (b >= C) + throw new Error(I.getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage()); + } + if (b < 0 || b >= l) + throw new Error(I.getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage(b, l)); + b > y && d.fill(a, y * u, b * u); + for (let w = h; w < g; ++w) { + let k = o[w]; + if (k < 0 || k >= p[0]) + throw new Error(I.getSparseSegmentReductionIndicesOutOfRangeErrorMessage(w, o[w], p[0])); + for (let _ = 0; _ < u; _++) + d[b * u + _] += r[k * u + _]; + } + if (s) + for (let w = 0; w < u; w++) + d[b * u + w] /= g - h; + if (h = g, ++g, y = b + 1, b = C, g > i) + break; + } + return y < l && d.fill(a, y * u, l * u), [d, m]; +} +var o2 = vr((r) => Math.sqrt(r)); +var xj = we(bo, (r) => Math.sqrt(r)); +var n2 = { kernelName: bo, backendName: "cpu", kernelFunc: xj }; +var wI = Le((r, e) => { + let t10 = r - e; + return t10 * t10; +}); +var yj = Ye(Co, wI); +var s2 = { kernelName: Co, backendName: "cpu", kernelFunc: yj }; +function _d(r, e, t10, o) { + let n = ne(r, e.dtype); + for (let s = 0; s < n.size; s++) { + let a = n.indexToLoc(s), i = new Array(a.length); + for (let p = 0; p < i.length; p++) + i[p] = a[p] * t10[p] + o[p]; + n.set(e.get(...i), ...a); + } + return n; +} +var SI = class { + constructor(e, t10, o, n, s, a) { + this.separator = x.encodeString(e), this.nGramWidths = t10, this.leftPad = x.encodeString(o), this.rightPad = x.encodeString(n), this.padWidth = s, this.preserveShort = a; + } + getPadWidth(e) { + return Math.min(this.padWidth < 0 ? e - 1 : this.padWidth, e - 1); + } + getNumNGrams(e, t10) { + let o = this.getPadWidth(t10); + return Math.max(0, e + 2 * o - t10 + 1); + } + createNGrams(e, t10, o, n, s, a) { + for (let i = 0; i < s; ++i) { + let p = this.getPadWidth(a), u = Math.max(0, p - i), c = Math.max(0, p - (s - (i + 1))), l = a - (u + c), m = t10 + (u > 0 ? 0 : i - p), f = 0; + f += u * this.leftPad.length; + for (let b = 0; b < l; ++b) + f += e[m + b].length; + f += c * this.rightPad.length; + let d = u + c + l - 1; + f += d * this.separator.length, o[n + i] = new Uint8Array(f); + let h = o[n + i], g = 0, y = (b) => b.forEach((C) => h[g++] = C); + for (let b = 0; b < u; ++b) + y(this.leftPad), y(this.separator); + for (let b = 0; b < l - 1; ++b) + y(e[m + b]), y(this.separator); + if (l > 0) { + y(e[m + l - 1]); + for (let b = 0; b < c; ++b) + y(this.separator), y(this.rightPad); + } else { + for (let b = 0; b < c - 1; ++b) + y(this.rightPad), y(this.separator); + y(this.rightPad); + } + } + } + compute(e, t10) { + let o = e.length, n = t10.length; + if (n > 0) { + let p = t10[0]; + if (p !== 0) + throw new Error(`First split value must be 0, got ${p}`); + for (let u = 1; u < n; ++u) { + let c = t10[u] >= p; + if (c = c && t10[u] <= o, !c) + throw new Error(`Invalid split value ${t10[u]}, must be in [${p}, ${o}]`); + p = t10[u]; + } + if (p !== o) + throw new Error(`Last split value must be data size. Expected ${o}, got ${p}`); + } + let s = n - 1, a = x.getArrayFromDType("int32", n); + if (o === 0 || n === 0) { + let p = new Array(o); + for (let u = 0; u <= s; ++u) + a[u] = 0; + return [p, a]; + } + a[0] = 0; + for (let p = 1; p <= s; ++p) { + let u = t10[p] - t10[p - 1], c = 0; + this.nGramWidths.forEach((l) => { + c += this.getNumNGrams(u, l); + }), this.preserveShort && u > 0 && c === 0 && (c = 1), a[p] = a[p - 1] + c; + } + let i = new Array(a[s]); + for (let p = 0; p < s; ++p) { + let u = t10[p], c = a[p]; + if (this.nGramWidths.forEach((l) => { + let m = t10[p + 1] - t10[p], f = this.getNumNGrams(m, l); + this.createNGrams(e, u, i, c, f, l), c += f; + }), this.preserveShort && c === a[p]) { + let l = t10[p + 1] - t10[p]; + if (l === 0) + continue; + let m = l + 2 * this.padWidth, f = 1; + this.createNGrams(e, u, i, c, f, m); + } + } + return [i, a]; + } +}; +function ku(r, e, t10, o, n, s, a, i) { + return new SI(t10, o, n, s, a, i).compute(r, e); +} +function bj(r, e, t10, o) { + if (!r.length) + return; + if (e.length === 0) { + for (let s = 0; s < r.length; ++s) + o.push(r.subarray(s, s + 1)); + return; + } + if (e.length === 1) { + let s = e[0], a = r.indexOf(s); + for (; a !== -1; ) { + let i = r.subarray(0, a); + (!t10 || i.length !== 0) && o.push(i), r = r.subarray(a + 1), a = r.indexOf(s); + } + (!t10 || r.length !== 0) && o.push(r); + return; + } + let n = 0; + for (let s = 0; s < r.length + 1; s++) + if (s === r.length || e.indexOf(r[s]) !== -1) { + let a = r.subarray(n, s); + (!t10 || a.length !== 0) && o.push(a), n = s + 1; + } +} +function Tu(r, e, t10) { + let o = r.length, n = [], s = 0, a = 0, i = new Array(o); + for (let m = 0; m < o; ++m) { + let f = n.length; + bj(r[m], e, t10, n); + let d = n.length - f; + i[m] = d, s += d, a = Math.max(a, d); + } + let p = x.getArrayFromDType("int32", s * 2), u = new Array(s), c = [o, a], l = 0; + for (let m = 0; m < o; ++m) + for (let f = 0; f < i[m]; ++f) + p[l * 2] = m, p[l * 2 + 1] = f, u[l] = n[l], ++l; + return [p, u, c]; +} +function Nu(r, e) { + let t10 = x.getArrayFromDType("int32", r.length); + for (let o = 0; o < r.length; ++o) + t10[o] = x.fingerPrint64(r[o]).modulo(e).getLowBitsUnsigned(); + return t10; +} +var vI = Le((r, e) => r - e); +var Cj = Qp((r, e, t10, o) => ({ real: r - t10, imag: e - o })); +var Il = Ye(Io, vI, Cj); +var a2 = { kernelName: Io, backendName: "cpu", kernelFunc: Il }; +function Ed(r, e) { + let t10 = new Array(r.rank); + for (let n = 0; n < t10.length; n++) + t10[n] = r.shape[n] * e[n]; + let o = ne(t10, r.dtype); + for (let n = 0; n < o.values.length; ++n) { + let s = o.indexToLoc(n), a = new Array(r.rank); + for (let p = 0; p < a.length; p++) + a[p] = s[p] % r.shape[p]; + let i = r.locToIndex(a); + o.values[n] = r.values[i]; + } + return o; +} +var wl = (r, e) => { + let t10 = e.value - r.value; + return t10 === 0 ? r.index - e.index : t10; +}; +function i2(r, e, t10 = 0, o = r.length - 1) { + for (; o > t10; ) { + if (o - t10 > 600) { + let i = o - t10 + 1, p = e - t10 + 1, u = Math.log(i), c = 0.5 * Math.exp(2 * u / 3), l = 0.5 * Math.sqrt(u * c * (i - c) / i) * Math.sign(p - i / 2), m = Math.max(t10, Math.floor(e - p * c / i + l)), f = Math.min(o, Math.floor(e + (i - p) * c / i + l)); + i2(r, e, m, f); + } + let n = r[e], s = t10, a = o; + for (x.swap(r, t10, e), wl(r[o], n) > 0 && x.swap(r, t10, o); s < a; ) { + for (x.swap(r, s, a), s++, a--; wl(r[s], n) < 0; ) + s = s + 1; + for (; wl(r[a], n) > 0; ) + a = a - 1; + } + wl(r[t10], n) === 0 ? x.swap(r, t10, a) : (a = a + 1, x.swap(r, a, o)), a <= e && (t10 = a + 1), e <= a && (o = a - 1); + } +} +function $d(r, e, t10, o, n) { + let s = e[e.length - 1], [a, i] = [r.length / s, s], p = x.getTypedArrayFromDType(t10, a * o), u = x.getTypedArrayFromDType("int32", a * o); + for (let l = 0; l < a; l++) { + let m = l * i, f = r.subarray(m, m + i), d = new Array(f.length); + f.forEach((b, C) => d[C] = { value: b, index: C }), o < d.length && (i2(d, o), d = d.slice(0, o)), n && d.sort(wl); + let h = l * o, g = p.subarray(h, h + o), y = u.subarray(h, h + o); + for (let b = 0; b < o; b++) + g[b] = d[b].value, y[b] = d[b].index; + } + let c = e.slice(); + return c[c.length - 1] = o, [ne(c, t10, p), ne(c, "int32", u)]; +} +function Rd(r, e, t10, o) { + let n = x.parseAxisParam(e, t10)[0], s = [1, t10[0], 1]; + for (let d = 0; d < n; d++) + s[0] *= t10[d]; + s[1] = t10[n]; + for (let d = n + 1; d < t10.length; d++) + s[2] *= t10[d]; + let a = {}, i = new Int32Array(t10[n]), p = new je(s, o, r), u = [], c = s[0] === 1 && s[2] === 1; + for (let d = 0; d < t10[n]; d++) { + let h; + if (c) + h = r[d].toString(); + else { + let g = []; + for (let y = 0; y < s[0]; y++) + for (let b = 0; b < s[2]; b++) + g.push(p.get(y, d, b)); + h = g.join(","); + } + if (a[h] !== void 0) + i[d] = a[h]; + else { + let g = Object.keys(a).length; + a[h] = g, i[d] = g, u.push(d); + } + } + let l = s.slice(); + l[1] = Object.keys(a).length; + let m = new je(l, o); + u.forEach((d, h) => { + for (let g = 0; g < s[0]; g++) + for (let y = 0; y < s[2]; y++) + m.set(p.get(g, d, y), g, h, y); + }); + let f = t10.slice(); + return f[n] = l[1], { outputValues: m.values, outputShape: f, indices: i }; +} +var Ij = "4.0.0"; +pi("cpu", () => new Si(), 1); +var kI = we(In, (r) => r >= 0 ? r : Math.exp(r) - 1); +var u2 = { kernelName: In, backendName: "cpu", kernelFunc: kI }; +function TI(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { alpha: s } = o; + K([n], "leakyRelu"); + let a = x.sizeFromShape(n.shape), i = t10.data.get(n.dataId).values, p = x.getTypedArrayFromDType("float32", a); + for (let u = 0; u < i.length; u++) + p[u] = i[u] < 0 ? s * i[u] : i[u]; + return t10.makeTensorInfo(n.shape, "float32", p); +} +var p2 = { kernelName: Nn, backendName: "cpu", kernelFunc: TI }; +var wj = Le((r, e) => r < 0 ? e * r : r); +function NI(r) { + let { inputs: e, backend: t10 } = r, { x: o, alpha: n } = e; + K([o, n], "prelu"); + let s = t10.data.get(o.dataId).values, a = t10.data.get(n.dataId).values, [i, p] = wj(o.shape, n.shape, s, a, "float32"); + return t10.makeTensorInfo(p, "float32", i); +} +var c2 = { kernelName: Vn, backendName: "cpu", kernelFunc: NI }; +var _I = we(zn, (r) => Math.max(0, r)); +var l2 = { kernelName: zn, backendName: "cpu", kernelFunc: _I }; +var EI = we(Gn, (r) => Math.min(Math.max(0, r), 6)); +var m2 = { kernelName: Gn, backendName: "cpu", kernelFunc: EI }; +function _u(r, e, t10, o, n) { + if (t10 === "linear") + return ar({ inputs: { x: e }, backend: r }); + if (t10 === "relu") + return _I({ inputs: { x: e }, backend: r }); + if (t10 === "elu") + return kI({ inputs: { x: e }, backend: r }); + if (t10 === "relu6") + return EI({ inputs: { x: e }, backend: r }); + if (t10 === "prelu") + return NI({ inputs: { x: e, alpha: o }, backend: r }); + if (t10 === "leakyrelu") + return TI({ inputs: { x: e }, backend: r, attrs: { alpha: n } }); + if (t10 === "sigmoid") + return II({ inputs: { x: e }, backend: r }); + throw new Error(`Activation ${t10} has not been implemented for the CPU backend.`); +} +function Oe(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { shape: s } = o, a = x.sizeFromShape(n.shape), i = x.inferFromImplicitShape(s, a), p = x.sizeFromShape(i); + x.assert(a === p, () => `The new shape (${i}) has ${p} elements and the old shape (${n.shape}) has ${a} elements. The new shape and old shape must have the same number of elements.`), t10.incRef(n.dataId); + let u = t10.data.get(n.dataId); + if (u.complexTensorInfos != null) { + let c = u.complexTensorInfos.real, l = u.complexTensorInfos.imag; + c.shape = i, l.shape = i; + } + return { dataId: n.dataId, shape: i, dtype: n.dtype }; +} +var f2 = { kernelName: Ss, backendName: "cpu", kernelFunc: Oe }; +function $I(r) { + let { inputs: e, backend: t10, attrs: o } = r, { a: n, b: s } = e, { transposeA: a, transposeB: i } = o; + K([n, s], "matMul"); + let p = n.shape.length, u = s.shape.length, c = a ? n.shape[p - 2] : n.shape[p - 1], l = i ? s.shape[u - 1] : s.shape[u - 2], m = a ? n.shape[p - 1] : n.shape[p - 2], f = i ? s.shape[u - 2] : s.shape[u - 1], d = n.shape.slice(0, -2), h = s.shape.slice(0, -2), g = x.sizeFromShape(d), y = x.sizeFromShape(h), C = br.assertAndGetBroadcastShape(n.shape.slice(0, -2), s.shape.slice(0, -2)).concat([m, f]); + x.assert(c === l, () => `Error in matMul: inner shapes (${c}) and (${l}) of Tensors with shapes ${n.shape} and ${s.shape} and transposeA=${a} and transposeB=${i} must match.`); + let w = a ? [g, c, m] : [g, m, c], k = i ? [y, f, l] : [y, l, f], _ = Oe({ inputs: { x: n }, backend: t10, attrs: { shape: w } }), E = Oe({ inputs: { x: s }, backend: t10, attrs: { shape: k } }), R = a ? _.shape[1] : _.shape[2], A = a ? _.shape[2] : _.shape[1], D = i ? E.shape[1] : E.shape[2], O = Math.max(g, y), M = t10.data.get(_.dataId).values, L = t10.data.get(E.dataId).values, W = x.computeStrides(_.shape), V = x.computeStrides(E.shape), [G, q, H] = a ? [W[0], 1, W[1]] : [W[0], W[1], 1], [j, Y, Z] = i ? [1, V[1], V[0]] : [V[1], 1, V[0]], ee = A * D, X = ne([O, A, D], _.dtype), Q = X.values, se = t10.blockSize; + for (let ie = 0; ie < O; ie++) + for (let de = 0; de < A; de += se) + for (let Ie = 0; Ie < D; Ie += se) + for (let Se = 0; Se < R; Se += se) { + let Ee = Math.min(de + se, A), Me = Math.min(Ie + se, D), st = Math.min(Se + se, R); + for (let pt = de; pt < Ee; pt++) + for (let De = Ie; De < Me; De++) { + let ft = 0; + for (let at = Se; at < st; at++) { + let dt = Math.min(ie, g - 1) * G, It = Math.min(ie, y - 1) * Z, Fr = M[dt + pt * q + at * H], Pt = L[at * j + De * Y + It]; + ft += Fr * Pt; + } + Q[ie * ee + (pt * D + De)] += ft; + } + } + return t10.disposeIntermediateTensorInfo(_), t10.disposeIntermediateTensorInfo(E), t10.makeTensorInfo(C, X.dtype, X.values); +} +var d2 = { kernelName: cn, backendName: "cpu", kernelFunc: $I }; +function Sj(r) { + let { inputs: e, backend: t10, attrs: o } = r, { a: n, b: s, bias: a, preluActivationWeights: i } = e, { transposeA: p, transposeB: u, activation: c, leakyreluAlpha: l } = o, m, f, d, h = []; + m = $I({ inputs: { a: n, b: s }, attrs: { transposeA: p, transposeB: u }, backend: t10 }), a && (f = Hs({ inputs: { a: m, b: a }, backend: t10 }), h.push(m), m = f), c && (d = _u(t10, m, c, i, l), h.push(m), m = d); + for (let y of h) + t10.disposeIntermediateTensorInfo(y); + return m; +} +var h2 = { kernelName: Fo, backendName: "cpu", kernelFunc: Sj }; +var vj = we(Li, (r) => Math.acos(r)); +var g2 = { kernelName: Li, backendName: "cpu", kernelFunc: vj }; +var kj = we(Bi, (r) => Math.acosh(r)); +var x2 = { kernelName: Bi, backendName: "cpu", kernelFunc: kj }; +function Tj(r) { + let { inputs: e, backend: t10 } = r, o = e; + K(e, "addN"); + let n = o.map((i) => t10.data.get(i.dataId).values), s = ne(o[0].shape, o[0].dtype), a = s.values; + for (let i = 0; i < o.length; i++) { + let p = n[i]; + for (let u = 0; u < a.length; u++) + a[u] += p[u]; + } + return t10.makeTensorInfo(s.shape, s.dtype, s.values); +} +var y2 = { kernelName: an, backendName: "cpu", kernelFunc: Tj }; +function Nj(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { axis: s, keepDims: a } = o; + K(n, "all"); + let i = x.parseAxisParam(s, n.shape), p = i, u = I.getAxesPermutation(p, n.shape.length), c = n; + u != null && (c = bt({ inputs: { x: n }, backend: t10, attrs: { perm: u } }), p = I.getInnerMostAxes(p.length, n.shape.length)), I.assertAxesAreInnerMostDims("all", p, c.shape.length); + let [l, m] = I.computeOutAndReduceShapes(c.shape, p), f = x.sizeFromShape(m), d = x.makeZerosTypedArray(x.sizeFromShape(l), c.dtype), h = t10.data.get(c.dataId).values; + for (let y = 0; y < d.length; ++y) { + let b = y * f, C = h[b]; + for (let w = 0; w < f; ++w) { + let k = h[b + w]; + C = C && k; + } + d[y] = C; + } + u != null && t10.disposeIntermediateTensorInfo(c); + let g = t10.makeTensorInfo(l, c.dtype, d); + if (a) { + let y = I.expandShapeToKeepDim(l, i), b = Oe({ inputs: { x: g }, backend: t10, attrs: { shape: y } }); + return t10.disposeIntermediateTensorInfo(g), b; + } + return g; +} +var b2 = { kernelName: oa, backendName: "cpu", kernelFunc: Nj }; +function _j(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { axis: s, keepDims: a } = o; + K(n, "any"); + let i = x.parseAxisParam(s, n.shape), p = i, u = I.getAxesPermutation(p, n.shape.length), c = n; + u != null && (c = bt({ inputs: { x: n }, backend: t10, attrs: { perm: u } }), p = I.getInnerMostAxes(p.length, n.shape.length)), I.assertAxesAreInnerMostDims("any", p, c.shape.length); + let [l, m] = I.computeOutAndReduceShapes(c.shape, p), f = x.sizeFromShape(m), d = x.makeZerosTypedArray(x.sizeFromShape(l), c.dtype), h = t10.data.get(c.dataId).values; + for (let y = 0; y < d.length; ++y) { + let b = y * f, C = h[b]; + for (let w = 0; w < f; ++w) { + let k = h[b + w]; + C = C || k; + } + d[y] = C; + } + u != null && t10.disposeIntermediateTensorInfo(c); + let g = t10.makeTensorInfo(l, c.dtype, d); + if (a) { + let y = I.expandShapeToKeepDim(l, i), b = Oe({ inputs: { x: g }, backend: t10, attrs: { shape: y } }); + return t10.disposeIntermediateTensorInfo(g), b; + } + return g; +} +var C2 = { kernelName: na, backendName: "cpu", kernelFunc: _j }; +function Ej(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { axis: s } = o; + K(n, "argMax"); + let a = x.parseAxisParam(s, n.shape), i = I.getAxesPermutation(a, n.shape.length), p = n, u = []; + i != null && (p = bt({ inputs: { x: n }, backend: t10, attrs: { perm: i } }), u.push(p), a = I.getInnerMostAxes(a.length, p.shape.length)), a = [a[0]], I.assertAxesAreInnerMostDims("argMax", a, p.shape.length); + let [c, l] = I.computeOutAndReduceShapes(p.shape, a), m = x.sizeFromShape(c), f = x.makeZerosTypedArray(m, "int32"), d = x.sizeFromShape(l), h = t10.data.get(p.dataId).values; + for (let g = 0; g < f.length; ++g) { + let y = g * d, b = h[y], C = 0; + for (let w = 0; w < d; ++w) { + let k = h[y + w]; + k > b && (b = k, C = w); + } + f[g] = C; + } + return u.forEach((g) => t10.disposeIntermediateTensorInfo(g)), t10.makeTensorInfo(c, "int32", f); +} +var I2 = { kernelName: un, backendName: "cpu", kernelFunc: Ej }; +function $j(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { axis: s } = o; + K(n, "argMin"); + let a = x.parseAxisParam(s, n.shape), i = I.getAxesPermutation(a, n.shape.length), p = n, u = []; + i != null && (p = bt({ inputs: { x: n }, backend: t10, attrs: { perm: i } }), u.push(p), a = I.getInnerMostAxes(a.length, p.shape.length)), a = [a[0]], I.assertAxesAreInnerMostDims("argMin", a, p.shape.length); + let [c, l] = I.computeOutAndReduceShapes(p.shape, a), m = x.sizeFromShape(c), f = x.makeZerosTypedArray(m, "int32"), d = x.sizeFromShape(l), h = t10.data.get(p.dataId).values; + for (let g = 0; g < f.length; ++g) { + let y = g * d, b = h[y], C = 0; + for (let w = 0; w < d; ++w) { + let k = h[y + w]; + k < b && (b = k, C = w); + } + f[g] = C; + } + return u.forEach((g) => t10.disposeIntermediateTensorInfo(g)), t10.makeTensorInfo(c, "int32", f); +} +var w2 = { kernelName: ja, backendName: "cpu", kernelFunc: $j }; +var Rj = we(Vi, (r) => Math.asin(r)); +var S2 = { kernelName: Vi, backendName: "cpu", kernelFunc: Rj }; +var Aj = we(zi, (r) => Math.asinh(r)); +var v2 = { kernelName: zi, backendName: "cpu", kernelFunc: Aj }; +var Fj = we(Wi, (r) => Math.atan(r)); +var k2 = { kernelName: Wi, backendName: "cpu", kernelFunc: Fj }; +var Dj = Le((r, e) => Math.atan2(r, e)); +var Pj = Ye(sa, Dj); +var T2 = { kernelName: sa, backendName: "cpu", kernelFunc: Pj }; +var Oj = we(Ui, (r) => Math.atanh(r)); +var N2 = { kernelName: Ui, backendName: "cpu", kernelFunc: Oj }; +function rc(r, e, t10, o, n, s) { + let a = n.strideHeight, i = n.strideWidth, p = n.dilationHeight, u = n.dilationWidth, c = n.effectiveFilterHeight, l = n.effectiveFilterWidth, m = n.padInfo.top, f = n.padInfo.left, d = s === "max" ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY, h = ne(n.outShape, t10), g = h.values, y = n.outShape[1] * n.outShape[2] * n.outShape[3], b = n.outShape[2] * n.outShape[3], C = n.outShape[3]; + for (let w = 0; w < n.batchSize; ++w) { + let k = w * y, _ = w * o[0]; + for (let E = 0; E < n.inChannels; ++E) + for (let R = 0; R < n.outHeight; ++R) { + let A = R * a - m, D = Math.max(0, A), O = Math.min(n.inHeight, c + A), M = k + R * b; + for (let L = 0; L < n.outWidth; ++L) { + let W = L * i - f, V = Math.max(0, W), G = Math.min(n.inWidth, l + W), q = d, H = 0, j = 0; + for (let Z = D; Z < O; Z += p) { + let ee = _ + Z * o[1]; + for (let X = V; X < G; X += u) { + let Q = ee + X * o[2], se = r[Q + E]; + s === "max" && se > q ? q = se : s === "avg" && (H += se, j++); + } + if (isNaN(q)) + break; + } + let Y = M + L * C + E; + g[Y] = s === "avg" ? H / j : q; + } + } + } + return h; +} +function Fd(r, e, t10, o, n = false, s = false) { + let a = ne(o.outShape, "int32"), i = o.strideHeight, p = o.strideWidth, u = o.dilationHeight, c = o.dilationWidth, l = o.effectiveFilterHeight, m = o.effectiveFilterWidth, f = o.padInfo.top, d = o.padInfo.left, h = ne(e, t10, r); + for (let g = 0; g < o.batchSize; ++g) + for (let y = 0; y < o.inChannels; ++y) + for (let b = 0; b < o.outHeight; ++b) { + let C = b * i - f, w = C; + for (; w < 0; ) + w += u; + let k = Math.min(o.inHeight, l + C); + for (let _ = 0; _ < o.outWidth; ++_) { + let E = _ * p - d, R = E; + for (; R < 0; ) + R += c; + let A = Math.min(o.inWidth, m + E), D = Number.NEGATIVE_INFINITY, O = -1; + for (let M = w; M < k; M += u) { + let L = M - C; + for (let W = R; W < A; W += c) { + let V = W - E, G = h.get(g, M, W, y); + G > D && (D = G, n ? O = s ? ((g * o.inHeight + M) * o.inWidth + W) * o.inChannels + y : (M * o.inWidth + W) * o.inChannels + y : O = L * m + V); + } + } + a.set(O, g, b, _, y); + } + } + return a; +} +function Dd(r, e, t10, o, n, s) { + let a = n.strideDepth, i = n.strideHeight, p = n.strideWidth, u = n.dilationDepth, c = n.dilationHeight, l = n.dilationWidth, m = n.effectiveFilterDepth, f = n.effectiveFilterHeight, d = n.effectiveFilterWidth, h = n.padInfo.front, g = n.padInfo.top, y = n.padInfo.left, b = s === "max" ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY, C = ne(n.outShape, t10), w = C.values, k = n.outShape[1] * n.outShape[2] * n.outShape[3] * n.outShape[4], _ = n.outShape[2] * n.outShape[3] * n.outShape[4], E = n.outShape[3] * n.outShape[4], R = n.outShape[4]; + for (let A = 0; A < n.batchSize; ++A) { + let D = A * k, O = A * o[0]; + for (let M = 0; M < n.inChannels; ++M) + for (let L = 0; L < n.outDepth; ++L) { + let W = L * a - h, V = W; + for (; V < 0; ) + V += u; + let G = Math.min(n.inDepth, m + W), q = D + L * _; + for (let H = 0; H < n.outHeight; ++H) { + let j = H * i - g, Y = j; + for (; Y < 0; ) + Y += c; + let Z = Math.min(n.inHeight, f + j), ee = q + H * E; + for (let X = 0; X < n.outWidth; ++X) { + let Q = X * p - y, se = Q; + for (; se < 0; ) + se += l; + let ie = Math.min(n.inWidth, d + Q), de = ee + X * R, Ie = b, Se = 0, Ee = 0; + for (let st = V; st < G; st += u) { + let pt = O + st * o[1]; + for (let De = Y; De < Z; De += c) { + let ft = pt + De * o[2]; + for (let at = se; at < ie; at += l) { + let dt = ft + at * o[3], It = r[dt + M]; + if (s === "max" && It > Ie ? Ie = It : s === "avg" && (Se += It, Ee++), isNaN(Ie)) + break; + } + if (isNaN(Ie)) + break; + } + if (isNaN(Ie)) + break; + } + let Me = de + M; + w[Me] = s === "avg" ? Se / Ee : Ie; + } + } + } + } + return C; +} +function _2(r, e) { + let t10 = ne(e.outShape, "int32"), o = e.strideDepth, n = e.strideHeight, s = e.strideWidth, a = e.dilationDepth, i = e.dilationHeight, p = e.dilationWidth, u = e.effectiveFilterDepth, c = e.effectiveFilterHeight, l = e.effectiveFilterWidth, m = e.padInfo.front, f = e.padInfo.top, d = e.padInfo.left; + for (let h = 0; h < e.batchSize; ++h) + for (let g = 0; g < e.inChannels; ++g) + for (let y = 0; y < e.outDepth; ++y) { + let b = y * o - m, C = b; + for (; C < 0; ) + C += a; + let w = Math.min(e.inDepth, u + b); + for (let k = 0; k < e.outHeight; ++k) { + let _ = k * n - f, E = _; + for (; E < 0; ) + E += i; + let R = Math.min(e.inHeight, c + _); + for (let A = 0; A < e.outWidth; ++A) { + let D = A * s - d, O = D; + for (; O < 0; ) + O += p; + let M = Math.min(e.inWidth, l + D), L = Number.NEGATIVE_INFINITY, W = -1; + for (let V = C; V < w; V += a) { + let G = V - b; + for (let q = E; q < R; q += i) { + let H = q - _; + for (let j = O; j < M; j += p) { + let Y = j - D, Z = r.get(h, V, q, j, g); + Z >= L && (L = Z, W = G * c * l + H * c + Y); + } + } + } + t10.set(W, h, y, k, A, g); + } + } + } + return t10; +} +function Mj(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e; + K(n, "avgPool"); + let { filterSize: s, strides: a, pad: i, dimRoundingMode: p } = o, u = 1; + x.assert(I.eitherStridesOrDilationsAreOne(a, u), () => `Error in avgPool: Either strides or dilations must be 1. Got strides ${a} and dilations '${u}'`); + let c = I.computePool2DInfo(n.shape, s, a, u, i, p), l; + if (c.filterWidth === 1 && c.filterHeight === 1 && x.arraysEqual(c.inShape, c.outShape)) + l = ar({ inputs: { x: n }, backend: t10 }); + else { + let m = t10.data.get(n.dataId).values, f = x.computeStrides(n.shape), d = rc(m, n.shape, n.dtype, f, c, "avg"); + l = t10.makeTensorInfo(c.outShape, n.dtype, d.values); + } + return l; +} +var E2 = { kernelName: pn, backendName: "cpu", kernelFunc: Mj }; +function Lj(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { filterSize: s, strides: a, pad: i, dimRoundingMode: p, dataFormat: u } = o; + K(n, "avgPool3d"); + let c = I.computePool3DInfo(n.shape, s, a, 1, i, p, u), l = t10.data.get(n.dataId).values, m = Dd(l, n.shape, n.dtype, x.computeStrides(n.shape), c, "avg"); + return t10.makeTensorInfo(m.shape, "float32", m.values); +} +var $2 = { kernelName: ip, backendName: "cpu", kernelFunc: Lj }; +function Bj(r) { + let { inputs: e, backend: t10, attrs: o } = r, { dy: n, input: s } = e, { filterSize: a, strides: i, pad: p, dimRoundingMode: u } = o; + K([n, s], "avgPool3DGrad"); + let c = I.computePool3DInfo(s.shape, a, i, 1, p, u), l = c.strideDepth, m = c.strideHeight, f = c.strideWidth, d = c.filterDepth, h = c.filterHeight, g = c.filterWidth, y = c.dilationDepth, b = c.dilationHeight, C = c.dilationWidth, w = c.effectiveFilterDepth, k = c.effectiveFilterHeight, _ = c.effectiveFilterWidth, E = w - 1 - c.padInfo.front, R = _ - 1 - c.padInfo.left, A = k - 1 - c.padInfo.top, D = ne(s.shape, "float32"), O = 1 / (d * h * g), M = t10.bufferSync(n); + for (let L = 0; L < c.batchSize; ++L) + for (let W = 0; W < c.inChannels; ++W) + for (let V = 0; V < c.inDepth; ++V) + for (let G = 0; G < c.inHeight; ++G) + for (let q = 0; q < c.inWidth; ++q) { + let H = V - E, j = G - A, Y = q - R, Z = 0; + for (let ee = 0; ee < w; ee += y) { + let X = (H + ee) / l; + if (!(X < 0 || X >= c.outDepth || Math.floor(X) !== X)) + for (let Q = 0; Q < k; Q += b) { + let se = (j + Q) / m; + if (!(se < 0 || se >= c.outHeight || Math.floor(se) !== se)) + for (let ie = 0; ie < _; ie += C) { + let de = (Y + ie) / f; + if (de < 0 || de >= c.outWidth || Math.floor(de) !== de) + continue; + let Ie = M.get(L, X, se, de, W); + Z += Ie; + } + } + } + D.set(Z * O, L, V, G, q, W); + } + return t10.makeTensorInfo(D.shape, D.dtype, D.values); +} +var R2 = { kernelName: Fm, backendName: "cpu", kernelFunc: Bj }; +function Vj(r) { + let { inputs: e, backend: t10, attrs: o } = r, { dy: n, input: s } = e, a = s; + K([n, s], "avgPoolGrad"); + let { filterSize: i, strides: p, pad: u } = o, c = I.computePool2DInfo(a.shape, i, p, 1, u), l = c.strideHeight, m = c.strideWidth, f = c.filterHeight, d = c.filterWidth, h = c.dilationHeight, g = c.dilationWidth, y = c.effectiveFilterHeight, b = c.effectiveFilterWidth, C = b - 1 - c.padInfo.left, w = y - 1 - c.padInfo.top, k = ne(a.shape, "float32"), _ = 1 / (f * d), E = t10.data.get(n.dataId).values, R = ne(n.shape, "float32", E); + for (let A = 0; A < c.batchSize; ++A) + for (let D = 0; D < c.inChannels; ++D) + for (let O = 0; O < c.inHeight; ++O) + for (let M = 0; M < c.inWidth; ++M) { + let L = O - w, W = M - C, V = 0; + for (let G = 0; G < y; G += h) { + let q = (L + G) / l; + if (!(q < 0 || q >= c.outHeight || Math.floor(q) !== q)) + for (let H = 0; H < b; H += g) { + let j = (W + H) / m; + if (j < 0 || j >= c.outWidth || Math.floor(j) !== j) + continue; + let Y = R.get(A, q, j, D); + V += Y; + } + } + k.set(V * _, A, O, M, D); + } + return t10.makeTensorInfo(k.shape, k.dtype, k.values); +} +var A2 = { kernelName: Am, backendName: "cpu", kernelFunc: Vj }; +function zj(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, scale: s, offset: a, mean: i, variance: p } = e; + x.assert(i.shape.length === p.shape.length, () => "Batch normalization gradient requires mean and variance to have equal ranks."), x.assert(a == null || i.shape.length === a.shape.length, () => "Batch normalization gradient requires mean and offset to have equal ranks."), x.assert(s == null || i.shape.length === s.shape.length, () => "Batch normalization gradient requires mean and scale to have equal ranks."), K([n, i, p, s, a], "batchNorm"); + let { varianceEpsilon: u } = o; + u == null && (u = 1e-3); + let c = t10.data.get(n.dataId).values, l = t10.data.get(i.dataId).values, m = t10.data.get(p.dataId).values, f = s ? t10.data.get(s.dataId).values : new Float32Array([1]), d = a ? t10.data.get(a.dataId).values : new Float32Array([0]), h = new Float32Array(c.length), g = d.length, y = f.length, b = m.length, C = l.length, w = 0, k = 0, _ = 0, E = 0; + for (let R = 0; R < c.length; ++R) + h[R] = d[w++] + (c[R] - l[k++]) * f[_++] / Math.sqrt(m[E++] + u), w >= g && (w = 0), k >= C && (k = 0), _ >= y && (_ = 0), E >= b && (E = 0); + return t10.makeTensorInfo(n.shape, n.dtype, h); +} +var F2 = { kernelName: kn, backendName: "cpu", kernelFunc: zj }; +function Wj(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { blockShape: s, crops: a } = o; + K([n], "batchToSpaceND"); + let i = s.reduce((y, b) => y * b), p = I.getReshaped(n.shape, s, i), u = I.getPermuted(p.length, s.length), c = I.getReshapedPermuted(n.shape, s, i), l = I.getSliceBeginCoords(a, s.length), m = I.getSliceSize(c, a, s.length), f = Oe({ inputs: { x: n }, backend: t10, attrs: { shape: p } }), d = bt({ inputs: { x: f }, backend: t10, attrs: { perm: u } }), h = Oe({ inputs: { x: d }, backend: t10, attrs: { shape: c } }), g = qo({ inputs: { x: h }, backend: t10, attrs: { begin: l, size: m } }); + return t10.disposeIntermediateTensorInfo(f), t10.disposeIntermediateTensorInfo(d), t10.disposeIntermediateTensorInfo(h), g; +} +var D2 = { kernelName: hs, backendName: "cpu", kernelFunc: Wj }; +function Uj(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, weights: s } = e, { size: a } = o, i = t10.data.get(n.dataId).values, p = t10.data.get(s.dataId).values, u = Zp(i, p, s.dtype, s.shape, a); + return t10.makeTensorInfo([a], s.dtype, u); +} +var P2 = { kernelName: up, backendName: "cpu", kernelFunc: Uj }; +function Gj(r) { + let { inputs: e, backend: t10 } = r, { s0: o, s1: n } = e, s = t10.data.get(o.dataId).values, a = t10.data.get(n.dataId).values, i = I.assertAndGetBroadcastShape(Array.from(s), Array.from(a)); + return t10.makeTensorInfo([i.length], "int32", Int32Array.from(i)); +} +var O2 = { kernelName: pp, backendName: "cpu", kernelFunc: Gj }; +var Hj = we(Ro, (r, e) => { + let t10 = e; + return r > t10.clipValueMax ? t10.clipValueMax : r < t10.clipValueMin ? t10.clipValueMin : r; +}); +var M2 = { kernelName: Ro, backendName: "cpu", kernelFunc: Hj }; +var qj = (r) => { + let { x: e } = r.inputs, t10 = r.backend, o = new Float32Array(x.sizeFromShape(e.shape)), n = t10.data.get(e.dataId), s = n.complexTensorInfos.real, a = n.complexTensorInfos.imag, i = t10.data.get(s.dataId).values, p = t10.data.get(a.dataId).values; + for (let u = 0; u < i.length; u++) { + let c = i[u], l = p[u]; + o[u] = Math.hypot(c, l); + } + return t10.makeOutput(o, e.shape, "float32"); +}; +var L2 = { kernelName: cp, backendName: "cpu", kernelFunc: qj }; +function qs(r) { + let { inputs: e, backend: t10 } = r, { input: o } = e, n = t10.data.get(o.dataId).complexTensorInfos.imag, s = t10.data.get(n.dataId).values; + return t10.makeTensorInfo(n.shape, n.dtype, s); +} +var B2 = { kernelName: Ya, backendName: "cpu", kernelFunc: qs }; +function vi(r) { + let { inputs: e, backend: t10, attrs: o } = r, { axis: n } = o, s = x.parseAxisParam(n, e[0].shape)[0], a = e.map((h) => h.shape); + I.assertParamsConsistent(a, s); + let i = I.computeOutShape(e.map((h) => h.shape), s); + if (x.sizeFromShape(i) === 0) + return t10.makeTensorInfo(i, e[0].dtype, []); + let p = e.filter((h) => x.sizeFromShape(h.shape) > 0); + if (p.length === 1) + return ar({ inputs: { x: p[0] }, backend: t10 }); + if (p[0].dtype === "complex64") { + let h = p.map((w) => Wo({ inputs: { input: w }, backend: t10 })), g = p.map((w) => qs({ inputs: { input: w }, backend: t10 })), y = vi({ inputs: h, backend: t10, attrs: { axis: s } }), b = vi({ inputs: g, backend: t10, attrs: { axis: s } }), C = qt({ inputs: { real: y, imag: b }, backend: t10 }); + return h.forEach((w) => t10.disposeIntermediateTensorInfo(w)), g.forEach((w) => t10.disposeIntermediateTensorInfo(w)), t10.disposeIntermediateTensorInfo(y), t10.disposeIntermediateTensorInfo(b), C; + } + let u = p.map((h) => { + let y = [-1, x.sizeFromShape(h.shape.slice(s))]; + return Oe({ inputs: { x: h }, backend: t10, attrs: { shape: y } }); + }), c = u.map((h) => ({ vals: t10.data.get(h.dataId).values, shape: h.shape })); + i = I.computeOutShape(u.map((h) => h.shape), 1); + let l = u[0].shape[0] === 1, m = Iu(c, i, e[0].dtype, l), f = I.computeOutShape(p.map((h) => h.shape), s), d = t10.makeTensorInfo(f, e[0].dtype, m); + return u.forEach((h) => t10.disposeIntermediateTensorInfo(h)), d; +} +var V2 = { kernelName: gs, backendName: "cpu", kernelFunc: vi }; +function RI(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, filter: s } = e, { strides: a, pad: i, dataFormat: p, dilations: u, dimRoundingMode: c } = o; + K([n, s], "conv2d"); + let l = I.convertConv2DDataFormat(p), m = I.computeConv2DInfo(n.shape, s.shape, a, u, i, c, false, l), f = m.filterHeight, d = m.filterWidth, h = m.dilationHeight, g = m.dilationWidth, y = m.padInfo.left, b = m.padInfo.top, C = m.dataFormat === "channelsLast", w = new je(m.outShape, n.dtype), k = x.computeStrides(n.shape), _ = x.computeStrides(s.shape), E = k[0], R = C ? k[1] : k[2], A = C ? k[2] : 1, D = C ? 1 : k[1], O = w.strides[0], M = C ? w.strides[1] : w.strides[2], L = C ? w.strides[2] : 1, W = C ? 1 : w.strides[1], V = t10.data.get(n.dataId).values, G = t10.data.get(s.dataId).values, q = w.values; + for (let H = 0; H < m.batchSize; ++H) { + let j = H * E, Y = H * O; + for (let Z = 0; Z < m.outHeight; ++Z) { + let ee = Y + Z * M, X = Z * m.strideHeight - b; + for (let Q = 0; Q < f; ++Q) { + let se = X + Q * h; + if (se < 0 || se >= m.inHeight) + continue; + let ie = Q * _[0], de = j + se * R; + for (let Ie = 0; Ie < m.outWidth; ++Ie) { + let Se = ee + Ie * L, Ee = Ie * m.strideWidth - y; + for (let Me = 0; Me < d; ++Me) { + let st = Ee + Me * g; + if (st < 0 || st >= m.inWidth) + continue; + let pt = ie + Me * _[1], De = de + st * A, ft = pt; + for (let at = 0; at < m.inChannels; ++at) { + let dt = V[De + at * D]; + for (let It = 0; It < m.outChannels; ++It) + q[Se + It * W] += dt * G[ft + It]; + ft += m.outChannels; + } + } + } + } + } + } + return t10.makeTensorInfo(w.shape, w.dtype, q); +} +var z2 = { kernelName: ln, backendName: "cpu", kernelFunc: RI }; +function Kj(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, dy: s } = e, { strides: a, pad: i, dataFormat: p, dimRoundingMode: u, filterShape: c } = o; + K([n, s], "conv2dBackpropFilter"); + let l = I.convertConv2DDataFormat(p), m = I.computeConv2DInfo(n.shape, c, a, 1, i, u, false, l), { strideHeight: f, strideWidth: d, filterHeight: h, filterWidth: g } = m, y = m.dataFormat === "channelsLast", b = new je(m.filterShape, "float32"), C = m.padInfo.left, w = m.padInfo.top, k = t10.data.get(n.dataId).values, _ = t10.data.get(s.dataId).values, E = new je(n.shape, n.dtype, k), R = new je(s.shape, s.dtype, _); + for (let A = 0; A < h; ++A) { + let D = Math.max(0, Math.ceil((w - A) / f)), O = Math.min(m.outHeight, (m.inHeight + w - A) / f); + for (let M = 0; M < g; ++M) { + let L = Math.max(0, Math.ceil((C - M) / d)), W = Math.min(m.outWidth, (m.inWidth + C - M) / d); + for (let V = 0; V < m.inChannels; ++V) + for (let G = 0; G < m.outChannels; ++G) { + let q = 0; + for (let H = 0; H < m.batchSize; ++H) + for (let j = D; j < O; ++j) { + let Y = A + j * f - w; + for (let Z = L; Z < W; ++Z) { + let ee = M + Z * d - C; + y ? q += E.get(H, Y, ee, V) * R.get(H, j, Z, G) : q += E.get(H, V, Y, ee) * R.get(H, G, j, Z); + } + } + b.set(q, A, M, V, G); + } + } + } + return t10.makeTensorInfo(b.shape, b.dtype, b.values); +} +var W2 = { kernelName: lp, backendName: "cpu", kernelFunc: Kj }; +function jj(r) { + let { inputs: e, backend: t10, attrs: o } = r, { dy: n, filter: s } = e, { inputShape: a, strides: i, pad: p, dataFormat: u, dimRoundingMode: c } = o; + K([n, s], "conv2dBackpropInput"); + let l = x.computeStrides(s.shape), m = x.computeStrides(n.shape), f = I.convertConv2DDataFormat(u), d = I.computeConv2DInfo(a, s.shape, i, 1, p, c, false, f), h = new je(d.inShape, "float32"), g = h.values, y = t10.data.get(n.dataId).values, b = t10.data.get(s.dataId).values, [C, w, k] = l, { batchSize: _, filterHeight: E, filterWidth: R, inChannels: A, inHeight: D, inWidth: O, outChannels: M, outHeight: L, outWidth: W, strideHeight: V, strideWidth: G } = d; + f = d.dataFormat; + let q = E - 1 - d.padInfo.top, H = R - 1 - d.padInfo.left, j = f === "channelsLast", Y = h.strides[0], Z = j ? h.strides[1] : h.strides[2], ee = j ? h.strides[2] : 1, X = j ? 1 : h.strides[1], Q = m[0], se = j ? m[1] : m[2], ie = j ? m[2] : 1, de = j ? 1 : m[1]; + for (let Ie = 0; Ie < _; ++Ie) + for (let Se = 0; Se < A; ++Se) + for (let Ee = 0; Ee < D; ++Ee) { + let Me = Ee - q, st = Math.max(0, Math.ceil(Me / V)), pt = Math.min(L, (E + Me) / V); + for (let De = 0; De < O; ++De) { + let ft = De - H, at = Math.max(0, Math.ceil(ft / G)), dt = Math.min(W, (R + ft) / G), It = 0; + for (let Pt = st; Pt < pt; ++Pt) { + let jr = Pt * V - Me; + for (let er = at; er < dt; ++er) { + let Tt = er * G - ft, tr = Q * Ie + se * Pt + ie * er, rr = C * (E - 1 - jr) + w * (R - 1 - Tt) + k * Se; + for (let Xr = 0; Xr < M; ++Xr) { + let Yr = y[tr + de * Xr], pr = b[rr + Xr]; + It += Yr * pr; + } + } + } + let Fr = Y * Ie + Z * Ee + ee * De + X * Se; + g[Fr] = It; + } + } + return t10.makeTensorInfo(h.shape, h.dtype, h.values); +} +var U2 = { kernelName: mn, backendName: "cpu", kernelFunc: jj }; +function Xj(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, filter: s } = e, { strides: a, pad: i, dilations: p } = o; + K([n, s], "conv3d"); + let u = I.computeConv3DInfo(n.shape, s.shape, a, p, i), { filterDepth: c, filterHeight: l, filterWidth: m, dilationDepth: f, dilationHeight: d, dilationWidth: h, padInfo: g } = u, y = g.front, b = g.left, C = g.top, w = new je(u.outShape, n.dtype), k = t10.data.get(n.dataId).values, _ = t10.data.get(s.dataId).values, E = w.values, R = x.computeStrides(n.shape), A = x.computeStrides(s.shape); + for (let D = 0; D < u.batchSize; ++D) { + let O = D * R[0], M = D * w.strides[0]; + for (let L = 0; L < u.outDepth; ++L) { + let W = M + L * w.strides[1], V = L * u.strideDepth - y; + for (let G = 0; G < c; ++G) { + let q = V + G * f; + if (q < 0 || q >= u.inDepth) + continue; + let H = G * A[0], j = O + q * R[1]; + for (let Y = 0; Y < u.outHeight; ++Y) { + let Z = W + Y * w.strides[2], ee = Y * u.strideHeight - C; + for (let X = 0; X < l; ++X) { + let Q = ee + X * d; + if (Q < 0 || Q >= u.inHeight) + continue; + let se = H + X * A[1], ie = j + Q * R[2]; + for (let de = 0; de < u.outWidth; ++de) { + let Ie = Z + de * u.outChannels, Se = de * u.strideWidth - b; + for (let Ee = 0; Ee < m; ++Ee) { + let Me = Se + Ee * h; + if (Me < 0 || Me >= u.inWidth) + continue; + let st = se + Ee * A[2], pt = ie + Me * u.inChannels, De = st; + for (let ft = 0; ft < u.inChannels; ++ft) { + let at = k[pt + ft]; + for (let dt = 0; dt < u.outChannels; ++dt) + E[Ie + dt] += at * _[De + dt]; + De += u.outChannels; + } + } + } + } + } + } + } + } + return t10.makeTensorInfo(w.shape, w.dtype, w.values); +} +var G2 = { kernelName: mp, backendName: "cpu", kernelFunc: Xj }; +function Yj(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, dy: s } = e, { strides: a, pad: i, filterShape: p } = o; + K([n, s], "conv3dBackpropFilterV2"); + let u = x.computeStrides(n.shape), c = x.computeStrides(s.shape), l = I.computeConv3DInfo(n.shape, p, a, 1, i), m = l.strideDepth, f = l.strideHeight, d = l.strideWidth, h = l.filterDepth, g = l.filterHeight, y = l.filterWidth, b = new je(l.filterShape, "float32"), C = b.values, [w, k, _, E] = b.strides, R = t10.data.get(s.dataId).values, [A, D, O, M] = c, L = t10.data.get(n.dataId).values, [W, V, G, q] = u, H = l.padInfo.front, j = l.padInfo.left, Y = l.padInfo.top; + for (let Z = 0; Z < h; ++Z) { + let ee = Math.max(0, Math.ceil((H - Z) / m)), X = Math.min(l.outDepth, (l.inDepth + H - Z) / m), Q = Z * w; + for (let se = 0; se < g; ++se) { + let ie = Math.max(0, Math.ceil((Y - se) / f)), de = Math.min(l.outHeight, (l.inHeight + Y - se) / f), Ie = se * k + Q; + for (let Se = 0; Se < y; ++Se) { + let Ee = Math.max(0, Math.ceil((j - Se) / d)), Me = Math.min(l.outWidth, (l.inWidth + j - Se) / d), st = Se * _ + Ie; + for (let pt = 0; pt < l.inChannels; ++pt) { + let De = pt * E + st; + for (let ft = 0; ft < l.outChannels; ++ft) { + let at = 0; + for (let dt = 0; dt < l.batchSize; ++dt) { + let It = dt * W, Fr = dt * A; + for (let Pt = ee; Pt < X; ++Pt) { + let er = (Z + Pt * m - H) * V + It, Tt = Pt * D + Fr; + for (let tr = ie; tr < de; ++tr) { + let Xr = (se + tr * f - Y) * G + er, Yr = tr * O + Tt; + for (let pr = Ee; pr < Me; ++pr) { + let tn = (Se + pr * d - j) * q + Xr, Ua = pr * M + Yr; + at += L[tn + pt] * R[Ua + ft]; + } + } + } + } + C[De + ft] = at; + } + } + } + } + } + return t10.makeTensorInfo(b.shape, b.dtype, b.values); +} +var H2 = { kernelName: Dm, backendName: "cpu", kernelFunc: Yj }; +function Qj(r) { + let { inputs: e, backend: t10, attrs: o } = r, { dy: n, filter: s } = e, { pad: a, strides: i, inputShape: p } = o; + K([n], "conv3dBackpropInputV2"); + let u = x.computeStrides(n.shape), c = x.computeStrides(s.shape), l = I.computeConv3DInfo(p, s.shape, i, 1, a), m = new je(l.inShape, "float32"), f = m.values, [d, h, g, y] = m.strides, b = t10.data.get(n.dataId).values, [C, w, k, _] = u, E = t10.data.get(s.dataId).values, [R, A, D, O] = c, { batchSize: M, filterDepth: L, filterHeight: W, filterWidth: V, inChannels: G, inDepth: q, inHeight: H, inWidth: j, outChannels: Y, outDepth: Z, outHeight: ee, outWidth: X, strideDepth: Q, strideHeight: se, strideWidth: ie } = l, de = L - 1 - l.padInfo.front, Ie = W - 1 - l.padInfo.top, Se = V - 1 - l.padInfo.left; + for (let Ee = 0; Ee < M; ++Ee) + for (let Me = 0; Me < G; ++Me) + for (let st = 0; st < q; ++st) { + let pt = st - de, De = Math.max(0, Math.ceil(pt / Q)), ft = Math.min(Z, (L + pt) / Q); + for (let at = 0; at < H; ++at) { + let dt = at - Ie, It = Math.max(0, Math.ceil(dt / se)), Fr = Math.min(ee, (W + dt) / se); + for (let Pt = 0; Pt < j; ++Pt) { + let jr = Pt - Se, er = Math.max(0, Math.ceil(jr / ie)), Tt = Math.min(X, (V + jr) / ie), tr = 0; + for (let rr = De; rr < ft; ++rr) { + let Xr = rr * Q - pt; + for (let Yr = It; Yr < Fr; ++Yr) { + let pr = Yr * se - dt; + for (let Qs = er; Qs < Tt; ++Qs) { + let tn = Qs * ie - jr, Ua = C * Ee + w * rr + k * Yr + _ * Qs, jt = R * (L - 1 - Xr) + A * (W - 1 - pr) + D * (V - 1 - tn) + O * Me; + for (let Zs = 0; Zs < Y; ++Zs) { + let Lc = b[Ua + Zs], Bc = E[jt + Zs]; + tr += Lc * Bc; + } + } + } + } + f[d * Ee + h * st + g * at + y * Pt + Me] = tr; + } + } + } + return t10.makeTensorInfo(m.shape, m.dtype, m.values); +} +var q2 = { kernelName: fp, backendName: "cpu", kernelFunc: Qj }; +var Zj = we(fn, (r) => Math.cos(r)); +var K2 = { kernelName: fn, backendName: "cpu", kernelFunc: Zj }; +var Jj = we(dn, (r) => Math.cosh(r)); +var j2 = { kernelName: dn, backendName: "cpu", kernelFunc: Jj }; +function eX(r) { + let { inputs: e, backend: t10, attrs: o } = r, { image: n, boxes: s, boxInd: a } = e, { cropSize: i, method: p, extrapolationValue: u } = o, [c, l, m, f] = n.shape, d = s.shape[0], [h, g] = i, y = ne([d, h, g, f], "float32"), b = t10.data.get(s.dataId).values, C = t10.data.get(a.dataId).values, w = t10.data.get(n.dataId).values, k = x.computeStrides(n.shape), _ = x.computeStrides(y.shape); + for (let E = 0; E < d; E++) { + let R = E * 4, A = b[R], D = b[R + 1], O = b[R + 2], M = b[R + 3], L = C[E]; + if (L >= c) + continue; + let W = h > 1 ? (O - A) * (l - 1) / (h - 1) : 0, V = g > 1 ? (M - D) * (m - 1) / (g - 1) : 0; + for (let G = 0; G < h; G++) { + let q = h > 1 ? A * (l - 1) + G * W : 0.5 * (A + O) * (l - 1); + if (q < 0 || q > l - 1) { + for (let H = 0; H < g; H++) + for (let j = 0; j < f; j++) { + let Y = j + H * _[2] + G * _[1] + E * _[0]; + y.values[Y] = u; + } + continue; + } + if (p === "bilinear") { + let H = Math.floor(q), j = Math.ceil(q), Y = q - H; + for (let Z = 0; Z < g; Z++) { + let ee = g > 1 ? D * (m - 1) + Z * V : 0.5 * (D + M) * (m - 1); + if (ee < 0 || ee > m - 1) { + for (let ie = 0; ie < f; ie++) { + let de = ie + Z * _[2] + G * _[1] + E * _[0]; + y.values[de] = u; + } + continue; + } + let X = Math.floor(ee), Q = Math.ceil(ee), se = ee - X; + for (let ie = 0; ie < f; ie++) { + let de = ie + X * k[2] + H * k[1] + L * k[0], Ie = w[de]; + de = ie + Q * k[2] + H * k[1] + L * k[0]; + let Se = w[de]; + de = ie + X * k[2] + j * k[1] + L * k[0]; + let Ee = w[de]; + de = ie + Q * k[2] + j * k[1] + L * k[0]; + let Me = w[de], st = Ie + (Se - Ie) * se, pt = Ee + (Me - Ee) * se; + de = ie + Z * _[2] + G * _[1] + E * _[0], y.values[de] = st + (pt - st) * Y; + } + } + } else + for (let H = 0; H < g; ++H) { + let j = g > 1 ? D * (m - 1) + H * V : 0.5 * (D + M) * (m - 1); + if (j < 0 || j > m - 1) { + for (let ee = 0; ee < f; ee++) { + let X = ee + H * _[2] + G * _[1] + E * _[0]; + y.values[X] = u; + } + continue; + } + let Y = Math.round(j), Z = Math.round(q); + for (let ee = 0; ee < f; ee++) { + let X = ee + Y * k[2] + Z * k[1] + L * k[0], Q = ee + H * _[2] + G * _[1] + E * _[0]; + y.values[Q] = w[X]; + } + } + } + } + return t10.makeTensorInfo(y.shape, y.dtype, y.values); +} +var X2 = { kernelName: xn, backendName: "cpu", kernelFunc: eX }; +function tX(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { axis: s, exclusive: a, reverse: i } = o; + K(n, "cumprod"); + let p = I.getAxesPermutation([s], n.shape.length), u = n; + p != null && (u = bt({ inputs: { x: n }, backend: t10, attrs: { perm: p } })); + let c = I.getInnerMostAxes(1, n.shape.length)[0]; + if (c !== u.shape.length - 1) + throw new Error(`backend.cumprod in CPU expects an inner-most axis=${u.shape.length - 1} but got axis=${c}`); + let l = ct(u.dtype, "int32"), m = x.makeOnesTypedArray(x.sizeFromShape(u.shape), l), f = t10.data.get(u.dataId).values, d = u.shape[u.shape.length - 1], h = i ? (y, b) => y + d - b - 1 : (y, b) => y + b; + for (let y = 0; y < f.length; y += d) + for (let b = 0; b < d; b++) { + let C = h(y, b); + if (b === 0) + m[C] = a ? 1 : f[C]; + else { + let w = h(y, b - 1); + m[C] = a ? f[w] * m[w] : f[C] * m[w]; + } + } + let g = t10.makeTensorInfo(u.shape, l, m); + if (p != null) { + let y = I.getUndoAxesPermutation(p), b = bt({ inputs: { x: g }, backend: t10, attrs: { perm: y } }); + return t10.disposeIntermediateTensorInfo(g), t10.disposeIntermediateTensorInfo(u), b; + } + return g; +} +var Y2 = { kernelName: hn, backendName: "cpu", kernelFunc: tX }; +function rX(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { axis: s, exclusive: a, reverse: i } = o; + K(n, "cumsum"); + let p = I.getAxesPermutation([s], n.shape.length), u = n; + p != null && (u = bt({ inputs: { x: n }, backend: t10, attrs: { perm: p } })); + let c = I.getInnerMostAxes(1, n.shape.length)[0]; + if (c !== u.shape.length - 1) + throw new Error(`backend.cumsum in CPU expects an inner-most axis=${u.shape.length - 1} but got axis=${c}`); + let l = ct(u.dtype, "int32"), m = x.makeZerosTypedArray(x.sizeFromShape(u.shape), l), f = t10.data.get(u.dataId).values, d = u.shape[u.shape.length - 1], h = i ? (y, b) => y + d - b - 1 : (y, b) => y + b; + for (let y = 0; y < f.length; y += d) + for (let b = 0; b < d; b++) { + let C = h(y, b); + if (b === 0) + m[C] = a ? 0 : f[C]; + else { + let w = h(y, b - 1); + m[C] = a ? f[w] + m[w] : f[C] + m[w]; + } + } + let g = t10.makeTensorInfo(u.shape, l, m); + if (p != null) { + let y = I.getUndoAxesPermutation(p), b = bt({ inputs: { x: g }, backend: t10, attrs: { perm: y } }); + return t10.disposeIntermediateTensorInfo(g), t10.disposeIntermediateTensorInfo(u), b; + } + return g; +} +var Q2 = { kernelName: gn, backendName: "cpu", kernelFunc: rX }; +function oX(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, weights: s } = e, { size: a, binaryOutput: i } = o; + if (n.shape.length === 1) { + let p = t10.data.get(n.dataId).values, u = t10.data.get(s.dataId).values, c = Zp(p, u, s.dtype, s.shape, a); + return t10.makeTensorInfo([a], s.dtype, c); + } else if (n.shape.length === 2) { + let p = t10.bufferSync(n), u = t10.bufferSync(s), c = yd(p, u, a, i); + return t10.makeTensorInfo(c.shape, s.dtype, c.values); + } + throw new Error(`Error in denseBincount: input must be at most rank 2, but got rank${n.shape.length}.`); +} +var Z2 = { kernelName: dp, backendName: "cpu", kernelFunc: oX }; +function nX(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { blockSize: s, dataFormat: a } = o; + x.assert(a === "NHWC", () => `Only NHWC dataFormat supported on CPU for depthToSpace. Got ${a}`); + let i = n.shape[0], p = n.shape[1], u = n.shape[2], c = n.shape[3], l = p * s, m = u * s, f = c / (s * s), d = t10.data.get(n.dataId).values, h = new Float32Array(i * l * m * f), g = 0; + for (let y = 0; y < i; ++y) + for (let b = 0; b < l; ++b) { + let C = Math.floor(b / s), w = b % s; + for (let k = 0; k < m; ++k) { + let _ = Math.floor(k / s), E = k % s, R = (w * s + E) * f; + for (let A = 0; A < f; ++A) { + let O = A + R + c * (_ + u * (C + p * y)); + h[g++] = d[O]; + } + } + } + return t10.makeTensorInfo([i, l, m, f], n.dtype, h); +} +var J2 = { kernelName: yn, backendName: "cpu", kernelFunc: nX }; +function AI(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, filter: s } = e, { strides: a, pad: i, dilations: p, dimRoundingMode: u } = o; + K([n, s], "depthwiseConv2DNative"); + let c = x.computeStrides(n.shape), l = x.computeStrides(s.shape), m = p; + m == null && (m = [1, 1]), x.assert(I.eitherStridesOrDilationsAreOne(a, m), () => `Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${a} and dilations '${m}'`); + let f = I.computeConv2DInfo(n.shape, s.shape, a, m, i, u, true), { filterHeight: d, filterWidth: h, dilationHeight: g, dilationWidth: y, padInfo: b } = f, C = b.left, w = b.top, k = f.outChannels / f.inChannels, _ = new je(f.outShape, n.dtype), E = t10.data.get(n.dataId).values, R = t10.data.get(s.dataId).values, A = _.values; + for (let D = 0; D < f.batchSize; ++D) { + let O = D * c[0], M = D * _.strides[0]; + for (let L = 0; L < f.outHeight; ++L) { + let W = M + L * _.strides[1], V = L * f.strideHeight - w; + for (let G = 0; G < d; ++G) { + let q = V + G * g; + if (q < 0 || q >= f.inHeight) + continue; + let H = G * l[0], j = O + q * c[1]; + for (let Y = 0; Y < f.outWidth; ++Y) { + let Z = W + Y * _.strides[2], ee = Y * f.strideWidth - C; + for (let X = 0; X < h; ++X) { + let Q = ee + X * y; + if (Q < 0 || Q >= f.inWidth) + continue; + let se = H + X * l[1], ie = j + Q * f.inChannels, de = Z, Ie = se; + for (let Se = 0; Se < f.inChannels; ++Se) { + let Ee = E[ie + Se]; + for (let Me = 0; Me < k; ++Me) + A[de + Me] += Ee * R[Ie + Me]; + de += k, Ie += k; + } + } + } + } + } + } + return t10.makeTensorInfo(_.shape, _.dtype, _.values); +} +var e_ = { kernelName: bn, backendName: "cpu", kernelFunc: AI }; +function sX(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, dy: s } = e, { strides: a, dilations: i, pad: p, dimRoundingMode: u, filterShape: c } = o; + K([n, s], "depthwiseConv2dNativeBackpropFilter"); + let l = I.computeConv2DInfo(n.shape, c, a, i, p, u, true), { strideHeight: m, strideWidth: f, filterHeight: d, filterWidth: h } = l, g = new je(l.filterShape, "float32"), y = l.padInfo.left, b = l.padInfo.top, C = l.outChannels / l.inChannels, w = t10.data.get(n.dataId).values, k = new je(n.shape, n.dtype, w), _ = t10.data.get(s.dataId).values, E = new je(s.shape, s.dtype, _); + for (let R = 0; R < d; ++R) { + let A = Math.max(0, Math.ceil((b - R) / m)), D = Math.min(l.outHeight, (l.inHeight + b - R) / m); + for (let O = 0; O < h; ++O) { + let M = Math.max(0, Math.ceil((y - O) / f)), L = Math.min(l.outWidth, (l.inWidth + y - O) / f); + for (let W = 0; W < l.outChannels; ++W) { + let V = Math.trunc(W / C), G = W % C, q = 0; + for (let H = 0; H < l.batchSize; ++H) + for (let j = A; j < D; ++j) { + let Y = R + j * m - b; + for (let Z = M; Z < L; ++Z) { + let ee = O + Z * f - y; + q += k.get(H, Y, ee, V) * E.get(H, j, Z, W); + } + } + g.set(q, R, O, V, G); + } + } + } + return t10.makeTensorInfo(g.shape, g.dtype, g.values); +} +var t_ = { kernelName: hp, backendName: "cpu", kernelFunc: sX }; +function aX(r) { + let { inputs: e, backend: t10, attrs: o } = r, { dy: n, filter: s } = e, { strides: a, dilations: i, pad: p, dimRoundingMode: u, inputShape: c } = o; + K([n, s], "depthwiseConv2DNativeBackpropInput"); + let l = x.computeStrides(n.shape), m = x.computeStrides(s.shape), f = I.computeConv2DInfo(c, s.shape, a, i, p, u, true), d = new je(f.inShape, "float32"), h = d.values, [g, y, b] = d.strides, C = t10.data.get(n.dataId).values, [w, k, _] = l, E = t10.data.get(s.dataId).values, [R, A, D] = m, { batchSize: O, filterHeight: M, filterWidth: L, inChannels: W, inHeight: V, inWidth: G, outChannels: q, outHeight: H, outWidth: j, strideHeight: Y, strideWidth: Z } = f, ee = M - 1 - f.padInfo.top, X = L - 1 - f.padInfo.left, Q = q / W; + for (let se = 0; se < O; ++se) + for (let ie = 0; ie < W; ++ie) + for (let de = 0; de < V; ++de) { + let Ie = de - ee, Se = Math.max(0, Math.ceil(Ie / Y)), Ee = Math.min(H, (M + Ie) / Y); + for (let Me = 0; Me < G; ++Me) { + let st = Me - X, pt = Math.max(0, Math.ceil(st / Z)), De = Math.min(j, (L + st) / Z), ft = 0; + for (let at = Se; at < Ee; ++at) { + let dt = at * Y - Ie; + for (let It = pt; It < De; ++It) { + let Fr = It * Z - st, Pt = w * se + k * at + _ * It, jr = R * (M - 1 - dt) + A * (L - 1 - Fr) + D * ie; + for (let er = 0; er < Q; ++er) { + let Tt = ie * Q + er, tr = C[Pt + Tt], rr = E[jr + er]; + ft += tr * rr; + } + } + } + h[g * se + y * de + b * Me + ie] = ft; + } + } + return t10.makeTensorInfo(d.shape, d.dtype, d.values); +} +var r_ = { kernelName: gp, backendName: "cpu", kernelFunc: aX }; +function iX(r) { + let { inputs: e, backend: t10 } = r, { x: o } = e, n = x.sizeFromShape(o.shape), s = t10.data.get(o.dataId).values, a = ne([n, n], o.dtype), i = a.values; + for (let u = 0; u < s.length; u++) + i[u * n + u] = s[u]; + let p = [...o.shape, ...o.shape]; + return t10.makeTensorInfo(p, a.dtype, a.values); +} +var o_ = { kernelName: xp, backendName: "cpu", kernelFunc: iX }; +var n_ = { kernelName: yp, backendName: "cpu", kernelFunc: ({ inputs: r, backend: e, attrs: t10 }) => { + let { x: o, filter: n } = r, { strides: s, pad: a, dilations: i } = t10, p = e, u = p.data.get(o.dataId).values, c = o.shape.length, l = p.data.get(n.dataId).values, m = n.shape.length, { batchSize: f, inHeight: d, inWidth: h, inChannels: g, outHeight: y, outWidth: b, padInfo: C, strideHeight: w, strideWidth: k, filterHeight: _, filterWidth: E, dilationHeight: R, dilationWidth: A, outShape: D } = I.computeDilation2DInfo(o.shape, n.shape, s, a, "NHWC", i), O = x.sizeFromShape(D), M = D.length, L = x.getArrayFromDType(o.dtype, O); + for (let V = 0; V < f; ++V) + for (let G = 0; G < y; ++G) { + let q = G * w - C.top; + for (let H = 0; H < b; ++H) { + let j = H * k - C.left; + for (let Y = 0; Y < g; ++Y) { + let Z = Number.MIN_SAFE_INTEGER; + for (let X = 0; X < _; ++X) { + let Q = q + X * R; + if (Q >= 0 && Q < d) + for (let se = 0; se < E; ++se) { + let ie = j + se * A; + if (ie >= 0 && ie < h) { + let de = x.locToIndex([V, Q, ie, Y], c, x.computeStrides(o.shape)), Ie = x.locToIndex([X, se, Y], m, x.computeStrides(n.shape)), Se = u[de] + l[Ie]; + Se > Z && (Z = Se); + } + } + } + let ee = x.locToIndex([V, G, H, Y], M, x.computeStrides(D)); + L[ee] = Z; + } + } + } + return { dataId: p.write(x.toTypedArray(L, o.dtype), D, o.dtype), shape: D, dtype: o.dtype }; +} }; +var s_ = { kernelName: vb, backendName: "cpu", kernelFunc: ({ inputs: r, backend: e, attrs: t10 }) => { + let { x: o, filter: n, dy: s } = r, { strides: a, pad: i, dilations: p } = t10, u = e, c = x.toNestedArray(o.shape, u.data.get(o.dataId).values), l = x.toNestedArray(n.shape, u.data.get(n.dataId).values), { batchSize: m, inHeight: f, inWidth: d, inChannels: h, outHeight: g, outWidth: y, padInfo: b, strideHeight: C, strideWidth: w, filterHeight: k, filterWidth: _, dilationHeight: E, dilationWidth: R, outShape: A } = I.computeDilation2DInfo(o.shape, n.shape, a, i, "NHWC", p); + x.assert(s.rank === A.length, () => `Error in ${vb}, dy must have the same rank as output ${A.length}, but got ${s.rank}`); + let D = x.toNestedArray(A, u.data.get(s.dataId).values), O = x.makeZerosNestedTypedArray(n.shape, n.dtype); + for (let L = 0; L < m; ++L) + for (let W = 0; W < g; ++W) { + let V = W * C - b.top; + for (let G = 0; G < y; ++G) { + let q = G * w - b.left; + for (let H = 0; H < h; ++H) { + let j = Number.MIN_SAFE_INTEGER, Y = 0, Z = 0; + for (let ee = 0; ee < k; ++ee) { + let X = V + ee * E; + if (X >= 0 && X < f) + for (let Q = 0; Q < _; ++Q) { + let se = q + Q * R; + if (se >= 0 && se < d) { + let ie = c[L][X][se][H] + l[ee][Q][H]; + ie > j && (j = ie, Y = ee, Z = Q); + } + } + } + O[Y][Z][H] += D[L][W][G][H]; + } + } + } + return { dataId: u.write(x.toTypedArray(O, o.dtype), n.shape, n.dtype), shape: n.shape, dtype: n.dtype }; +} }; +var a_ = { kernelName: Sb, backendName: "cpu", kernelFunc: ({ inputs: r, backend: e, attrs: t10 }) => { + let { x: o, filter: n, dy: s } = r, { strides: a, pad: i, dilations: p } = t10, u = e, c = x.toNestedArray(o.shape, u.data.get(o.dataId).values), l = x.toNestedArray(n.shape, u.data.get(n.dataId).values), { batchSize: m, inHeight: f, inWidth: d, inChannels: h, outHeight: g, outWidth: y, padInfo: b, strideHeight: C, strideWidth: w, filterHeight: k, filterWidth: _, dilationHeight: E, dilationWidth: R, outShape: A } = I.computeDilation2DInfo(o.shape, n.shape, a, i, "NHWC", p); + x.assert(s.rank === A.length, () => `Error in ${Sb}, dy must have the same rank as output ${A.length}, but got ${s.rank}`); + let D = x.toNestedArray(A, u.data.get(s.dataId).values), O = x.makeZerosNestedTypedArray(o.shape, o.dtype); + for (let L = 0; L < m; ++L) + for (let W = 0; W < g; ++W) { + let V = W * C - b.top; + for (let G = 0; G < y; ++G) { + let q = G * w - b.left; + for (let H = 0; H < h; ++H) { + let j = Number.MIN_SAFE_INTEGER, Y = V < 0 ? 0 : V, Z = q < 0 ? 0 : q; + for (let ee = 0; ee < k; ++ee) { + let X = V + ee * E; + if (X >= 0 && X < f) + for (let Q = 0; Q < _; ++Q) { + let se = q + Q * R; + if (se >= 0 && se < d) { + let ie = c[L][X][se][H] + l[ee][Q][H]; + ie > j && (j = ie, Y = X, Z = se); + } + } + } + O[L][Y][Z][H] += D[L][W][G][H]; + } + } + } + return { dataId: u.write(x.toTypedArray(O, o.dtype), o.shape, o.dtype), shape: o.shape, dtype: o.dtype }; +} }; +function Fa(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { axis: s, keepDims: a } = o; + K(n, "sum"); + let i; + n.dtype === "bool" ? i = Uo({ inputs: { x: n }, backend: t10, attrs: { dtype: "int32" } }) : i = ar({ inputs: { x: n }, backend: t10 }); + let p = i.shape.length, u = x.parseAxisParam(s, i.shape), c = I.getAxesPermutation(u, p), l = u, m = i; + c != null && (m = bt({ inputs: { x: i }, backend: t10, attrs: { perm: c } }), l = I.getInnerMostAxes(l.length, p)), I.assertAxesAreInnerMostDims("sum", l, m.shape.length); + let [f, d] = I.computeOutAndReduceShapes(m.shape, l), h = I.upcastType(m.dtype, "int32"), g = Yp(t10, f, h), y = x.sizeFromShape(d), b = t10.data.get(g.dataId).values, C = t10.data.get(m.dataId).values; + for (let w = 0; w < b.length; ++w) { + let k = w * y, _ = 0; + for (let E = 0; E < y; ++E) + _ += C[k + E]; + b[w] = _; + } + if (a) { + let w = I.expandShapeToKeepDim(g.shape, u), k = g; + g = Oe({ inputs: { x: g }, backend: t10, attrs: { shape: w } }), t10.disposeIntermediateTensorInfo(k); + } + return t10.disposeIntermediateTensorInfo(i), c != null && t10.disposeIntermediateTensorInfo(m), g; +} +var i_ = { kernelName: jn, backendName: "cpu", kernelFunc: Fa }; +function uX(r) { + let { inputs: e, backend: t10, attrs: o } = r, { equation: n } = o, s = e, { allDims: a, summedDims: i, idDims: p } = I.decodeEinsumEquation(n, s.length); + I.checkEinsumDimSizes(a.length, p, s); + let { path: u, steps: c } = I.getEinsumComputePath(i, p), l = c.length, m = null, f = a.length, d = []; + for (let h = 0; h < l; ++h) { + for (let g of c[h]) { + let { permutationIndices: y, expandDims: b } = I.getEinsumPermutation(f, p[g]), C; + I.isIdentityPermutation(y) ? C = s[g] : (C = bt({ inputs: { x: s[g] }, backend: t10, attrs: { perm: y } }), d.push(C)); + let w = C.shape.slice(); + for (let k = 0; k < b.length; ++k) + w.splice(b[k], 0, 1); + x.arraysEqual(C.shape, w) || (C = Oe({ inputs: { x: C }, backend: t10, attrs: { shape: w } }), d.push(C)), m === null ? m = C : (m = wu({ inputs: { a: C, b: m }, backend: t10 }), d.push(m)); + } + h < l - 1 && (u[h] >= 0 && (m = Fa({ inputs: { x: m }, backend: t10, attrs: { axis: u[h] - (a.length - f), keepDims: false } }), d.push(m)), f--); + } + for (let h of d) + h !== m && t10.disposeIntermediateTensorInfo(h); + return m; +} +var u_ = { kernelName: Xa, backendName: "cpu", kernelFunc: uX }; +function pX(r) { + let { inputs: e, backend: t10 } = r, { dy: o, y: n } = e; + K([o, n], "eluGrad"); + let s = new Float32Array(x.sizeFromShape(n.shape)), a = t10.data.get(n.dataId).values, i = t10.data.get(o.dataId).values; + for (let p = 0; p < a.length; ++p) { + let u = a[p]; + u >= 1 ? s[p] = i[p] : s[p] = i[p] * (u + 1); + } + return t10.makeTensorInfo(n.shape, "float32", s); +} +var p_ = { kernelName: Pm, backendName: "cpu", kernelFunc: pX }; +var cX = I.ERF_P; +var lX = I.ERF_A1; +var mX = I.ERF_A2; +var fX = I.ERF_A3; +var dX = I.ERF_A4; +var hX = I.ERF_A5; +var gX = we(Gi, (r) => { + let e = Math.sign(r), t10 = Math.abs(r), o = 1 / (1 + cX * t10); + return e * (1 - ((((hX * o + dX) * o + fX) * o + mX) * o + lX) * o * Math.exp(-t10 * t10)); +}); +var c_ = { kernelName: Gi, backendName: "cpu", kernelFunc: gX }; +function oc(r) { + let { inputs: e, backend: t10, attrs: o } = r, { input: n } = e, { dim: s } = o, a = n.shape.length, i = n.shape.slice(), p = s; + return s < 0 && (x.assert(-(a + 1) <= s, () => `Axis must be in the interval [${-(a + 1)}, ${a}]`), p = a + s + 1), i.splice(p, 0, 1), Oe({ inputs: { x: n }, backend: t10, attrs: { shape: i } }); +} +var l_ = { kernelName: xs, backendName: "cpu", kernelFunc: oc }; +var xX = Le((r, e) => r / e); +var Sl = Ye(Cn, xX); +var vl = { kernelName: Cn, backendName: "cpu", kernelFunc: Sl }; +function Pd(r, e, t10) { + let o = r.shape, n = o[0], s = o[1], a = t10.data.get(r.dataId), i = a.complexTensorInfos.real, p = a.complexTensorInfos.imag, u = [n, s], c = x.sizeFromShape(u), l = x.getTypedArrayFromDType("float32", c), m = x.getTypedArrayFromDType("float32", c); + for (let g = 0; g < n; g++) { + let y = qo({ inputs: { x: i }, backend: t10, attrs: { begin: [g, 0], size: [1, s] } }), b = qo({ inputs: { x: p }, backend: t10, attrs: { begin: [g, 0], size: [1, s] } }), C = qt({ inputs: { real: y, imag: b }, backend: t10 }), { real: w, imag: k } = yX(C, e, t10), _ = I.mergeRealAndImagArrays(w, k); + for (let E = 0; E < s; E++) { + let R = I.getComplexWithIndex(_, E); + l[g * s + E] = R.real, m[g * s + E] = R.imag; + } + t10.disposeIntermediateTensorInfo(y), t10.disposeIntermediateTensorInfo(b), t10.disposeIntermediateTensorInfo(C); + } + let f = t10.makeTensorInfo(u, "float32", l), d = t10.makeTensorInfo(u, "float32", m), h = qt({ inputs: { real: f, imag: d }, backend: t10 }); + return t10.disposeIntermediateTensorInfo(f), t10.disposeIntermediateTensorInfo(d), h; +} +function yX(r, e, t10) { + let o = x.sizeFromShape(r.shape), n = t10.data.get(r.dataId), s = t10.data.get(n.complexTensorInfos.real.dataId).values, a = t10.data.get(n.complexTensorInfos.imag.dataId).values; + if (bX(o)) { + let i = FI(s, a, o, e, t10), p = [r.shape[0], r.shape[1]]; + if (e) { + let u = t10.makeTensorInfo(p, "float32", i.real), c = t10.makeTensorInfo(p, "float32", i.imag), l = t10.makeTensorInfo([], "float32", x.createScalarValue(o, "float32")), m = ar({ inputs: { x: l }, backend: t10 }), f = vl.kernelFunc({ inputs: { a: u, b: l }, backend: t10 }), d = vl.kernelFunc({ inputs: { a: c, b: m }, backend: t10 }), h = t10.data.get(f.dataId).values, g = t10.data.get(d.dataId).values; + return t10.disposeIntermediateTensorInfo(u), t10.disposeIntermediateTensorInfo(c), t10.disposeIntermediateTensorInfo(l), t10.disposeIntermediateTensorInfo(m), t10.disposeIntermediateTensorInfo(f), t10.disposeIntermediateTensorInfo(d), { real: h, imag: g }; + } + return i; + } else { + let i = I.mergeRealAndImagArrays(s, a), p = CX(i, o, e); + return I.splitRealAndImagArrays(p); + } +} +function bX(r) { + return (r & r - 1) === 0; +} +function FI(r, e, t10, o, n) { + if (t10 === 1) + return { real: r, imag: e }; + let s = I.mergeRealAndImagArrays(r, e), a = t10 / 2, i = I.complexWithEvenIndex(s), p = i.real, u = i.imag, c = [p.length], l = n.makeTensorInfo(c, "float32", p), m = n.makeTensorInfo(c, "float32", u), f = qt({ inputs: { real: l, imag: m }, backend: n }), d = I.complexWithOddIndex(s), h = d.real, g = d.imag, y = [h.length], b = n.makeTensorInfo(y, "float32", h), C = n.makeTensorInfo(y, "float32", g), w = qt({ inputs: { real: b, imag: C }, backend: n }), k = FI(p, u, a, o, n), _ = k.real, E = k.imag, R = [_.length], A = n.makeTensorInfo(R, "float32", _), D = n.makeTensorInfo(R, "float32", E), O = qt({ inputs: { real: A, imag: D }, backend: n }), M = FI(h, g, a, o, n), L = M.real, W = M.imag, V = [L.length], G = n.makeTensorInfo(V, "float32", L), q = n.makeTensorInfo(V, "float32", W), H = qt({ inputs: { real: G, imag: q }, backend: n }), j = I.exponents(t10, o), Y = [j.real.length], Z = n.makeTensorInfo(Y, "float32", j.real), ee = n.makeTensorInfo(Y, "float32", j.imag), X = qt({ inputs: { real: Z, imag: ee }, backend: n }), Q = wu({ inputs: { a: X, b: H }, backend: n }), se = Hs({ inputs: { a: O, b: Q }, backend: n }), ie = Il({ inputs: { a: O, b: Q }, backend: n }), de = Wo({ inputs: { input: se }, backend: n }), Ie = Wo({ inputs: { input: ie }, backend: n }), Se = qs({ inputs: { input: se }, backend: n }), Ee = qs({ inputs: { input: ie }, backend: n }), Me = vi({ inputs: [de, Ie], backend: n, attrs: { axis: 0 } }), st = vi({ inputs: [Se, Ee], backend: n, attrs: { axis: 0 } }), pt = n.data.get(Me.dataId).values, De = n.data.get(st.dataId).values; + return n.disposeIntermediateTensorInfo(l), n.disposeIntermediateTensorInfo(m), n.disposeIntermediateTensorInfo(f), n.disposeIntermediateTensorInfo(b), n.disposeIntermediateTensorInfo(C), n.disposeIntermediateTensorInfo(w), n.disposeIntermediateTensorInfo(A), n.disposeIntermediateTensorInfo(D), n.disposeIntermediateTensorInfo(O), n.disposeIntermediateTensorInfo(G), n.disposeIntermediateTensorInfo(q), n.disposeIntermediateTensorInfo(H), n.disposeIntermediateTensorInfo(Z), n.disposeIntermediateTensorInfo(ee), n.disposeIntermediateTensorInfo(X), n.disposeIntermediateTensorInfo(Q), n.disposeIntermediateTensorInfo(se), n.disposeIntermediateTensorInfo(ie), n.disposeIntermediateTensorInfo(de), n.disposeIntermediateTensorInfo(Se), n.disposeIntermediateTensorInfo(Ie), n.disposeIntermediateTensorInfo(Ee), n.disposeIntermediateTensorInfo(Me), n.disposeIntermediateTensorInfo(st), { real: pt, imag: De }; +} +function CX(r, e, t10) { + let o = new Float32Array(e * 2); + for (let n = 0; n < e; n++) { + let s = 0, a = 0; + for (let i = 0; i < e; i++) { + let p = I.exponent(n * i, e, t10), u = I.getComplexWithIndex(r, i); + s += u.real * p.real - u.imag * p.imag, a += u.real * p.imag + u.imag * p.real; + } + t10 && (s /= e, a /= e), I.assignToTypedArray(o, s, a, n); + } + return o; +} +function IX(r) { + let { inputs: e, backend: t10 } = r, { input: o } = e, n = x.sizeFromShape(o.shape), s = o.shape[o.shape.length - 1], a = n / s, i = Oe({ inputs: { x: o }, backend: t10, attrs: { shape: [a, s] } }), p = Pd(i, false, t10), u = Oe({ inputs: { x: p }, backend: t10, attrs: { shape: o.shape } }); + return t10.disposeIntermediateTensorInfo(i), t10.disposeIntermediateTensorInfo(p), u; +} +var m_ = { kernelName: bp, backendName: "cpu", kernelFunc: IX }; +function kl(r) { + let { backend: e, attrs: t10 } = r, { shape: o, value: n, dtype: s } = t10, a = s || x.inferDtype(n), i = x.getArrayFromDType(a, x.sizeFromShape(o)); + return wX(i, n, a), e.makeTensorInfo(o, a, i); +} +var f_ = { kernelName: ys, backendName: "cpu", kernelFunc: kl }; +function wX(r, e, t10) { + r.fill(e); +} +var d_ = { kernelName: Sn, backendName: "cpu", kernelFunc: ({ inputs: r, attrs: e, backend: t10 }) => { + let { image: o } = r, n = t10, s = x.getTypedArrayFromDType(o.dtype, x.sizeFromShape(o.shape)), [a, i, p, u] = o.shape, c = n.data.get(o.dataId).values; + for (let m = 0; m < a; m++) { + let f = m * p * i * u; + for (let d = 0; d < i; d++) { + let h = d * (p * u); + for (let g = 0; g < p; g++) { + let y = g * u; + for (let b = 0; b < u; b++) { + let C = Math.round(p - g - 1), w = f + h + y + b, k = c[w]; + if (C >= 0 && C < p) { + let _ = C * u, E = f + h + _ + b; + k = c[E]; + } + s[w] = k; + } + } + } + } + return { dataId: n.write(s, o.shape, o.dtype), shape: o.shape, dtype: o.dtype }; +} }; +var SX = Le((r, e) => Math.floor(r / e)); +var vX = Ye(vn, SX, null, "int32"); +var h_ = { kernelName: vn, backendName: "cpu", kernelFunc: vX }; +function kX(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, filter: s, bias: a, preluActivationWeights: i } = e, { strides: p, pad: u, dataFormat: c, dilations: l, dimRoundingMode: m, activation: f, leakyreluAlpha: d } = o, h = RI({ inputs: { x: n, filter: s }, backend: t10, attrs: { strides: p, pad: u, dataFormat: c, dilations: l, dimRoundingMode: m } }); + if (a) { + let g = h; + if (c === "NCHW" && a.shape.length === 1 && a.shape[0] !== 1) { + let y = Oe({ inputs: { x: a }, backend: t10, attrs: { shape: [a.shape[0], 1, 1] } }); + h = Hs({ inputs: { a: h, b: y }, backend: t10 }), t10.disposeIntermediateTensorInfo(y); + } else + h = Hs({ inputs: { a: h, b: a }, backend: t10 }); + t10.disposeIntermediateTensorInfo(g); + } + if (f) { + let g = h; + if (c === "NCHW" && f === "prelu" && i.shape.length === 1 && i.shape[0] !== 1) { + let y = Oe({ inputs: { x: i }, backend: t10, attrs: { shape: [i.shape[0], 1, 1] } }); + h = _u(t10, h, f, y, d), t10.disposeIntermediateTensorInfo(y); + } else + h = _u(t10, h, f, i, d); + t10.disposeIntermediateTensorInfo(g); + } + return h; +} +var g_ = { kernelName: Do, backendName: "cpu", kernelFunc: kX }; +function TX(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, filter: s, bias: a, preluActivationWeights: i } = e, { strides: p, pad: u, dataFormat: c, dilations: l, dimRoundingMode: m, activation: f, leakyreluAlpha: d } = o, h = AI({ inputs: { x: n, filter: s }, backend: t10, attrs: { strides: p, pad: u, dataFormat: c, dilations: l, dimRoundingMode: m } }); + if (a) { + let g = h; + h = Hs({ inputs: { a: h, b: a }, backend: t10 }), t10.disposeIntermediateTensorInfo(g); + } + if (f) { + let g = h; + h = _u(t10, h, f, i, d), t10.disposeIntermediateTensorInfo(g); + } + return h; +} +var x_ = { kernelName: Po, backendName: "cpu", kernelFunc: TX }; +function NX(r) { + let { inputs: e, backend: t10 } = r, { params: o, indices: n } = e, s = x.sizeFromShape(o.shape), a = n.shape, i = a[a.length - 1], [p, u, c, l] = I.prepareAndValidate(o, n); + if (u === 0) + return t10.makeTensorInfo(p, o.dtype, []); + let m = t10.data.get(n.dataId).values, f = t10.bufferSync(o), d = bd(m, f, o.dtype, u, i, c, l, o.shape, s); + return t10.makeTensorInfo(p, o.dtype, d.values); +} +var y_ = { kernelName: Tn, backendName: "cpu", kernelFunc: NX }; +function _X(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, indices: s } = e, { axis: a, batchDims: i } = o; + K([n, s], "gatherV2"); + let p = x.parseAxisParam(a, n.shape)[0], u = t10.data.get(s.dataId).values, c = n.shape[p]; + for (let w = 0; w < u.length; ++w) { + let k = u[w]; + x.assert(k <= c - 1 && k >= 0, () => `GatherV2: the index value ${k} is not in [0, ${c - 1}]`); + } + let l = i; + i == null && (l = 0); + let m = x.sizeFromShape(s.shape), f = I.segment_util.collectGatherOpShapeInfo(n, s, p, l), d = Oe({ inputs: { x: n }, backend: t10, attrs: { shape: [f.batchSize, f.outerSize, f.dimSize, f.sliceSize] } }), h = Oe({ inputs: { x: s }, backend: t10, attrs: { shape: [f.batchSize, m / f.batchSize] } }), g = [f.batchSize, f.outerSize, m / f.batchSize, f.sliceSize], y = t10.bufferSync(h), b = t10.bufferSync(d), C = Cd(b, y, g); + return t10.disposeIntermediateTensorInfo(d), t10.disposeIntermediateTensorInfo(h), t10.makeTensorInfo(f.outputShape, C.dtype, C.values); +} +var b_ = { kernelName: bs, backendName: "cpu", kernelFunc: _X }; +function EX(r) { + let { inputs: e, backend: t10 } = r, { input: o } = e, n = x.sizeFromShape(o.shape), s = o.shape[o.shape.length - 1], a = n / s, i = Oe({ inputs: { x: o }, backend: t10, attrs: { shape: [a, s] } }), p = Pd(i, true, t10), u = Oe({ inputs: { x: p }, backend: t10, attrs: { shape: o.shape } }); + return t10.disposeIntermediateTensorInfo(i), t10.disposeIntermediateTensorInfo(p), u; +} +var C_ = { kernelName: Cp, backendName: "cpu", kernelFunc: EX }; +var $X = we(Hi, (r) => Number.isFinite(r) ? 1 : 0, "bool"); +var I_ = { kernelName: Hi, backendName: "cpu", kernelFunc: $X }; +var RX = we(qi, (r) => Math.abs(r) === 1 / 0 ? 1 : 0, "bool"); +var w_ = { kernelName: qi, backendName: "cpu", kernelFunc: RX }; +var AX = we(ia, (r) => Number.isNaN(r) ? 1 : 0, "bool"); +var S_ = { kernelName: ia, backendName: "cpu", kernelFunc: AX }; +function FX(r) { + let { backend: e, attrs: t10 } = r, { start: o, stop: n, num: s } = t10, a = Id(o, n, s); + return e.makeTensorInfo([a.length], "float32", a); +} +var v_ = { kernelName: Ip, backendName: "cpu", kernelFunc: FX }; +var DX = we(Ki, (r) => Math.log1p(r)); +var k_ = { kernelName: Ki, backendName: "cpu", kernelFunc: DX }; +var PX = Le((r, e) => r && e); +var OX = Ye(_n, PX, null, "bool"); +var T_ = { kernelName: _n, backendName: "cpu", kernelFunc: OX }; +var MX = we(En, (r) => r ? 0 : 1, "bool"); +var N_ = { kernelName: En, backendName: "cpu", kernelFunc: MX }; +var LX = Le((r, e) => r || e); +var BX = Ye(ua, LX, null, "bool"); +var __ = { kernelName: ua, backendName: "cpu", kernelFunc: BX }; +function VX(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { depthRadius: s, bias: a, alpha: i, beta: p } = o; + K(n, "LRN"); + let u = n.shape[3], c = u - 1, l = t10.data.get(n.dataId).values, m = x.sizeFromShape(n.shape), f = new Float32Array(m); + function d(h) { + let g = h % u, y = h - g + Math.max(0, g - s), b = h - g + Math.min(g + s, c), C = 0; + for (; y <= b; y++) { + let w = l[y]; + C += w * w; + } + return C; + } + for (let h = 0; h < m; h++) { + let g = d(h), y = l[h] * Math.pow(a + i * g, -p); + f[h] = y; + } + return t10.makeTensorInfo(n.shape, n.dtype, f); +} +var E_ = { kernelName: wp, backendName: "cpu", kernelFunc: VX }; +function zX(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, y: s, dy: a } = e, { depthRadius: i, bias: p, alpha: u, beta: c } = o; + K(a, "LRNGrad"); + let l = x.sizeFromShape(a.shape), m = a.shape[3], f = t10.data.get(a.dataId).values, d = t10.data.get(n.dataId).values, h = t10.data.get(s.dataId).values, g = new Float32Array(l), y = l; + for (let b = 0; b < y; b++) { + let C = b % m, w = b - C + Math.max(0, C - i), k = b - C + Math.min(m, C + i + 1), _ = 0; + for (let E = w; E < k; E++) + _ += Math.pow(d[E], 2); + _ = u * _ + p; + for (let E = w; E < k; E++) { + let R = -2 * u * c * d[E] * h[b] / _; + b === E && (R += Math.pow(_, -c)), R *= f[b], g[E] += R; + } + } + return t10.makeTensorInfo(a.shape, n.dtype, g); +} +var $_ = { kernelName: Om, backendName: "cpu", kernelFunc: zX }; +function DI(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { reductionIndices: s, keepDims: a } = o, i = t10, p = n.shape, u = p.length, c = x.parseAxisParam(s, p), l = c, m = I.getAxesPermutation(l, u), f = i.data.get(n.dataId).values; + if (m != null) { + let w = new Array(u); + for (let k = 0; k < w.length; k++) + w[k] = p[m[k]]; + f = Jp(f, p, n.dtype, m, w), l = I.getInnerMostAxes(l.length, u), p = w; + } + K(n, "max"), I.assertAxesAreInnerMostDims("max", l, u); + let [d, h] = I.computeOutAndReduceShapes(p, l), g = x.sizeFromShape(h), y = wd(f, g, d, n.dtype), b = i.write(y, d, n.dtype), C = d; + return a && (C = I.expandShapeToKeepDim(d, c)), { dataId: b, shape: C, dtype: n.dtype }; +} +var R_ = { kernelName: $n, backendName: "cpu", kernelFunc: DI }; +function WX(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e; + K(n, "maxPool"); + let { filterSize: s, strides: a, pad: i, dimRoundingMode: p } = o, u = 1; + x.assert(I.eitherStridesOrDilationsAreOne(a, u), () => `Error in maxPool: Either strides or dilations must be 1. Got strides ${a} and dilations '${u}'`); + let c = I.computePool2DInfo(n.shape, s, a, u, i, p), l; + if (c.filterWidth === 1 && c.filterHeight === 1 && x.arraysEqual(c.inShape, c.outShape)) + l = ar({ inputs: { x: n }, backend: t10 }); + else { + let m = t10.data.get(n.dataId).values, f = x.computeStrides(n.shape), d = rc(m, n.shape, n.dtype, f, c, "max"); + l = t10.makeTensorInfo(c.outShape, n.dtype, d.values); + } + return l; +} +var A_ = { kernelName: Rn, backendName: "cpu", kernelFunc: WX }; +function UX(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { filterSize: s, strides: a, pad: i, dimRoundingMode: p, dataFormat: u } = o; + K(n, "maxPool3d"); + let c = I.computePool3DInfo(n.shape, s, a, 1, i, p, u), l = t10.data.get(n.dataId).values, m = Dd(l, n.shape, n.dtype, x.computeStrides(n.shape), c, "max"); + return t10.makeTensorInfo(m.shape, "float32", m.values); +} +var F_ = { kernelName: Sp, backendName: "cpu", kernelFunc: UX }; +function GX(r) { + let { inputs: e, backend: t10, attrs: o } = r, { dy: n, input: s } = e, { filterSize: a, strides: i, pad: p, dimRoundingMode: u } = o; + K([n, s], "maxPool3DGrad"); + let c = I.computePool3DInfo(s.shape, a, i, 1, p, u), l = t10.bufferSync(s), m = _2(l, c), f = c.strideDepth, d = c.strideHeight, h = c.strideWidth, g = c.dilationDepth, y = c.dilationHeight, b = c.dilationWidth, C = c.effectiveFilterDepth, w = c.effectiveFilterHeight, k = c.effectiveFilterWidth, _ = C - 1 - c.padInfo.front, E = k - 1 - c.padInfo.left, R = w - 1 - c.padInfo.top, A = ne(s.shape, "float32"), D = t10.bufferSync(n); + for (let O = 0; O < c.batchSize; ++O) + for (let M = 0; M < c.inChannels; ++M) + for (let L = 0; L < c.inDepth; ++L) + for (let W = 0; W < c.inHeight; ++W) + for (let V = 0; V < c.inWidth; ++V) { + let G = L - _, q = W - R, H = V - E, j = 0; + for (let Y = 0; Y < C; Y += g) { + let Z = (G + Y) / f; + if (!(Z < 0 || Z >= c.outDepth || Math.floor(Z) !== Z)) + for (let ee = 0; ee < w; ee += y) { + let X = (q + ee) / d; + if (!(X < 0 || X >= c.outHeight || Math.floor(X) !== X)) + for (let Q = 0; Q < k; Q += b) { + let se = (H + Q) / h; + if (se < 0 || se >= c.outWidth || Math.floor(se) !== se) + continue; + let ie = C * w * k - 1 - m.get(O, Z, X, se, M), de = Y * w * k + ee * k + Q, Ie = ie === de ? 1 : 0; + if (Ie === 0) + continue; + let Se = D.get(O, Z, X, se, M); + j += Se * Ie; + } + } + } + A.set(j, O, L, W, V, M); + } + return t10.makeTensorInfo(A.shape, A.dtype, A.values); +} +var D_ = { kernelName: Lm, backendName: "cpu", kernelFunc: GX }; +function HX(r) { + let { inputs: e, backend: t10, attrs: o } = r, { dy: n, input: s, output: a } = e, i = s; + K([s, a], "maxPoolGrad"); + let { filterSize: p, strides: u, pad: c, dimRoundingMode: l } = o, m = I.computePool2DInfo(i.shape, p, u, 1, c, l), f = t10.data.get(i.dataId).values, d = ne(m.outShape, i.dtype, Fd(f, i.shape, i.dtype, m).values), h = m.strideHeight, g = m.strideWidth, y = m.dilationHeight, b = m.dilationWidth, C = m.effectiveFilterHeight, w = m.effectiveFilterWidth, k = w - 1 - m.padInfo.left, _ = C - 1 - m.padInfo.top, E = ne(i.shape, "float32"), R = t10.data.get(n.dataId).values, A = ne(n.shape, "float32", R); + for (let D = 0; D < m.batchSize; ++D) + for (let O = 0; O < m.inChannels; ++O) + for (let M = 0; M < m.inHeight; ++M) + for (let L = 0; L < m.inWidth; ++L) { + let W = M - _, V = L - k, G = 0; + for (let q = 0; q < C; q += y) { + let H = (W + q) / h; + if (!(H < 0 || H >= m.outHeight || Math.floor(H) !== H)) + for (let j = 0; j < w; j += b) { + let Y = (V + j) / g; + if (Y < 0 || Y >= m.outWidth || Math.floor(Y) !== Y) + continue; + let Z = C * w - 1 - d.get(D, H, Y, O), ee = q * w + j, X = Z === ee ? 1 : 0; + if (X === 0) + continue; + let Q = A.get(D, H, Y, O); + G += Q * X; + } + } + E.set(G, D, M, L, O); + } + return t10.makeTensorInfo(E.shape, E.dtype, E.values); +} +var P_ = { kernelName: Mm, backendName: "cpu", kernelFunc: HX }; +function O_(r, e, t10, o, n) { + let s = x.computeStrides(e), a = rc(r, e, t10, s, n, "max"), i = Fd(r, e, t10, n, true, o); + return [a.values, i.values]; +} +var M_ = { kernelName: vp, backendName: "cpu", kernelFunc: ({ inputs: r, attrs: e, backend: t10 }) => { + let { x: o } = r, { filterSize: n, strides: s, pad: a, includeBatchInIndex: i } = e, p = t10; + K(o, "MaxPoolWithArgmax"); + let u = p.data.get(o.dataId).values, c = I.computePool2DInfo(o.shape, n, s, [1, 1], a), [l, m] = O_(u, o.shape, o.dtype, i, c), f = p.write(l, c.outShape, o.dtype), d = p.write(m, c.outShape, o.dtype); + return [{ dataId: f, shape: c.outShape, dtype: o.dtype }, { dataId: d, shape: c.outShape, dtype: "int32" }]; +} }; +function qX(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { axis: s, keepDims: a } = o, i = x.parseAxisParam(s, n.shape), u = I.computeOutAndReduceShapes(n.shape, i)[1], c = x.sizeFromShape(u), l = [], m = t10.makeTensorInfo([], "float32", new Float32Array([c])); + l.push(m); + let f = Uo({ inputs: { x: n }, backend: t10, attrs: { dtype: "float32" } }); + l.push(f); + let d = Sl({ inputs: { a: f, b: m }, backend: t10 }); + l.push(d); + let h = Fa({ inputs: { x: d }, backend: t10, attrs: { axis: s, keepDims: a } }); + return l.forEach((g) => t10.disposeIntermediateTensorInfo(g)), h; +} +var L_ = { kernelName: An, backendName: "cpu", kernelFunc: qX }; +function KX(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { axis: s, keepDims: a } = o; + K(n, "min"); + let i = x.parseAxisParam(s, n.shape), p = i, u = I.getAxesPermutation(p, n.shape.length), c = n; + u != null && (c = bt({ inputs: { x: n }, backend: t10, attrs: { perm: u } }), p = I.getInnerMostAxes(p.length, n.shape.length)), I.assertAxesAreInnerMostDims("min", p, c.shape.length); + let [l, m] = I.computeOutAndReduceShapes(c.shape, p), f = x.sizeFromShape(m), d = x.makeZerosTypedArray(x.sizeFromShape(l), c.dtype), h = t10.data.get(c.dataId).values; + for (let y = 0; y < d.length; ++y) { + let b = y * f, C = h[b]; + for (let w = 0; w < f; ++w) { + let k = h[b + w]; + (Number.isNaN(k) || k < C) && (C = k); + } + d[y] = C; + } + u != null && t10.disposeIntermediateTensorInfo(c); + let g = t10.makeTensorInfo(l, c.dtype, d); + if (a) { + let y = I.expandShapeToKeepDim(l, i), b = Oe({ inputs: { x: g }, backend: t10, attrs: { shape: y } }); + return t10.disposeIntermediateTensorInfo(g), b; + } + return g; +} +var B_ = { kernelName: Fn, backendName: "cpu", kernelFunc: KX }; +function jX(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { paddings: s, mode: a } = o; + K(n, "mirrorPad"); + let i = s.map((C, w) => C[0] + n.shape[w] + C[1]), p = s.map((C) => C[0]), u = s.map((C, w) => C[0] + n.shape[w]), c = a === "reflect" ? 0 : 1, l = t10.data.get(n.dataId).values, m = n.shape.length, f = x.computeStrides(n.shape), d = x.sizeFromShape(i), h = i.length, g = x.computeStrides(i), y = x.getTypedArrayFromDType(n.dtype, d); + for (let C = 0; C < d; C++) { + let w = x.indexToLoc(C, h, g); + for (let _ = 0; _ < h; _++) + w[_] < p[_] ? w[_] = p[_] * 2 - w[_] - c : w[_] >= u[_] && (w[_] = (u[_] - 1) * 2 - w[_] + c); + w = w.map((_, E) => _ - p[E]); + let k = x.locToIndex(w, m, f); + y[C] = l[k]; + } + return { dataId: t10.write(y, i, n.dtype), shape: i, dtype: n.dtype }; +} +var V_ = { kernelName: Dn, backendName: "cpu", kernelFunc: jX }; +var XX = Le((r, e) => { + let t10 = r % e; + return r < 0 && e < 0 || r >= 0 && e >= 0 ? t10 : (t10 + e) % e; +}); +var YX = Ye(ji, XX); +var z_ = { kernelName: ji, backendName: "cpu", kernelFunc: YX }; +var U_ = rp(IC()); +function PI(r) { + let { inputs: e, backend: t10, attrs: o } = r, { logits: n } = e, { dim: s } = o, a = n.shape.length, i = s; + if (i === -1 && (i = a - 1), i !== a - 1) + throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${a} and dim was ${i}`); + let p = x.parseAxisParam([i], n.shape), u = DI({ inputs: { x: n }, backend: t10, attrs: { reductionIndices: p, keepDims: false } }), c = I.expandShapeToKeepDim(u.shape, p), l = Oe({ inputs: { x: u }, backend: t10, attrs: { shape: c } }), m = Il({ inputs: { a: n, b: l }, backend: t10 }), f = iI({ inputs: { x: m }, backend: t10 }), d = Fa({ inputs: { x: f }, backend: t10, attrs: { axis: p, keepDims: false } }), h = Oe({ inputs: { x: d }, backend: t10, attrs: { shape: c } }), g = Sl({ inputs: { a: f, b: h }, backend: t10 }); + return t10.disposeIntermediateTensorInfo(u), t10.disposeIntermediateTensorInfo(l), t10.disposeIntermediateTensorInfo(m), t10.disposeIntermediateTensorInfo(f), t10.disposeIntermediateTensorInfo(d), t10.disposeIntermediateTensorInfo(h), g; +} +var W_ = { kernelName: Xn, backendName: "cpu", kernelFunc: PI }; +function QX(r) { + let { inputs: e, backend: t10, attrs: o } = r, { logits: n } = e, { numSamples: s, seed: a, normalized: i } = o; + K(n, "multinomial"); + let p = i ? n : PI({ inputs: { logits: n }, backend: t10, attrs: { dim: -1 } }), u = p.shape[0], c = p.shape[1], l = t10.data.get(p.dataId).values, m = [u, s], f = x.makeZerosTypedArray(x.sizeFromShape(m), "int32"); + for (let d = 0; d < u; ++d) { + let h = d * c, g = new Float32Array(c - 1); + g[0] = l[h]; + for (let C = 1; C < g.length; ++C) + g[C] = g[C - 1] + l[h + C]; + let y = U_.alea(a.toString()), b = d * s; + for (let C = 0; C < s; ++C) { + let w = y(); + f[b + C] = g.length; + for (let k = 0; k < g.length; k++) + if (w < g[k]) { + f[b + C] = k; + break; + } + } + } + return i || t10.disposeIntermediateTensorInfo(p), t10.makeTensorInfo(m, "int32", f); +} +var G_ = { kernelName: kp, backendName: "cpu", kernelFunc: QX }; +var ZX = Bt.nonMaxSuppressionV3Impl; +function JX(r) { + let { inputs: e, backend: t10, attrs: o } = r, { boxes: n, scores: s } = e, { maxOutputSize: a, iouThreshold: i, scoreThreshold: p } = o; + K(n, "NonMaxSuppression"); + let u = t10.data.get(n.dataId).values, c = t10.data.get(s.dataId).values, { selectedIndices: l } = ZX(u, c, a, i, p); + return t10.makeTensorInfo([l.length], "int32", new Int32Array(l)); +} +var H_ = { kernelName: On, backendName: "cpu", kernelFunc: JX }; +var e5 = Bt.nonMaxSuppressionV4Impl; +function t5(r) { + let { inputs: e, backend: t10, attrs: o } = r, { boxes: n, scores: s } = e, { maxOutputSize: a, iouThreshold: i, scoreThreshold: p, padToMaxOutputSize: u } = o; + K(n, "NonMaxSuppressionPadded"); + let c = t10.data.get(n.dataId).values, l = t10.data.get(s.dataId).values, { selectedIndices: m, validOutputs: f } = e5(c, l, a, i, p, u); + return [t10.makeTensorInfo([m.length], "int32", new Int32Array(m)), t10.makeTensorInfo([], "int32", new Int32Array([f]))]; +} +var q_ = { kernelName: pa, backendName: "cpu", kernelFunc: t5 }; +var r5 = Bt.nonMaxSuppressionV5Impl; +function o5(r) { + let { inputs: e, backend: t10, attrs: o } = r, { boxes: n, scores: s } = e, { maxOutputSize: a, iouThreshold: i, scoreThreshold: p, softNmsSigma: u } = o; + K(n, "NonMaxSuppressionWithScore"); + let c = t10.data.get(n.dataId).values, l = t10.data.get(s.dataId).values, m = a, f = i, d = p, h = u, { selectedIndices: g, selectedScores: y } = r5(c, l, m, f, d, h); + return [t10.makeTensorInfo([g.length], "int32", new Int32Array(g)), t10.makeTensorInfo([y.length], "float32", new Float32Array(y))]; +} +var K_ = { kernelName: Mn, backendName: "cpu", kernelFunc: o5 }; +function n5(r) { + let { inputs: e, backend: t10, attrs: o } = r, { indices: n } = e, { dtype: s, depth: a, onValue: i, offValue: p } = o; + K(n, "oneHot"); + let u = x.sizeFromShape(n.shape), c = new Float32Array(u * a); + c.fill(p); + let l = t10.data.get(n.dataId).values; + for (let m = 0; m < u; ++m) + l[m] >= 0 && l[m] < a && (c[m * a + l[m]] = i); + return t10.makeTensorInfo([...n.shape, a], s, c); +} +var j_ = { kernelName: ca, backendName: "cpu", kernelFunc: n5 }; +function Tl(r) { + let { inputs: e, backend: t10 } = r, { x: o } = e; + if (o.dtype === "string") + throw new Error("zerosLike is not supported for string tensors"); + if (o.dtype === "complex64") { + let n = Wo({ inputs: { input: o }, backend: t10 }), s = Tl({ inputs: { x: n }, backend: t10 }), a = qs({ inputs: { input: o }, backend: t10 }), i = Tl({ inputs: { x: a }, backend: t10 }), p = qt({ inputs: { real: s, imag: i }, backend: t10 }); + return t10.disposeIntermediateTensorInfo(n), t10.disposeIntermediateTensorInfo(s), t10.disposeIntermediateTensorInfo(a), t10.disposeIntermediateTensorInfo(i), p; + } else + return kl({ backend: t10, attrs: { shape: o.shape, value: 0, dtype: o.dtype } }); +} +var X_ = { kernelName: Es, backendName: "cpu", kernelFunc: Tl }; +function Y_(r) { + let { inputs: e, backend: t10 } = r, { x: o } = e; + if (o.dtype === "string") + throw new Error("onesLike is not supported for string tensors"); + if (o.dtype === "complex64") { + let n = Wo({ inputs: { input: o }, backend: t10 }), s = Y_({ inputs: { x: n }, backend: t10 }), a = qs({ inputs: { input: o }, backend: t10 }), i = Tl({ inputs: { x: a }, backend: t10 }), p = qt({ inputs: { real: s, imag: i }, backend: t10 }); + return t10.disposeIntermediateTensorInfo(n), t10.disposeIntermediateTensorInfo(s), t10.disposeIntermediateTensorInfo(a), t10.disposeIntermediateTensorInfo(i), p; + } else + return kl({ backend: t10, attrs: { shape: o.shape, value: 1, dtype: o.dtype } }); +} +var Q_ = { kernelName: Cs, backendName: "cpu", kernelFunc: Y_ }; +function OI(r) { + let { inputs: e, backend: t10, attrs: o } = r, { axis: n } = o; + if (e.length === 1) + return oc({ inputs: { input: e[0] }, backend: t10, attrs: { dim: n } }); + let s = e[0].shape, a = e[0].dtype; + e.forEach((c) => { + x.assertShapesMatch(s, c.shape, "All tensors passed to stack must have matching shapes"), x.assert(a === c.dtype, () => "All tensors passed to stack must have matching dtypes"); + }); + let i = [], p = e.map((c) => { + let l = oc({ inputs: { input: c }, backend: t10, attrs: { dim: n } }); + return i.push(l), l; + }), u = vi({ inputs: p, backend: t10, attrs: { axis: n } }); + return i.forEach((c) => t10.disposeIntermediateTensorInfo(c)), u; +} +var Z_ = { kernelName: Is, backendName: "cpu", kernelFunc: OI }; +function s5(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { paddings: s, constantValue: a } = o; + K(n, "pad"); + let i = s.map((b, C) => b[0] + n.shape[C] + b[1]), p = s.map((b) => b[0]), u = t10.data.get(n.dataId).values, c = x.sizeFromShape(n.shape), l = n.shape.length, m = x.computeStrides(n.shape), f = x.sizeFromShape(i), d = i.length, h = x.computeStrides(i), g = x.getTypedArrayFromDType(n.dtype, f); + a !== 0 && g.fill(a); + for (let b = 0; b < c; b++) { + let w = x.indexToLoc(b, l, m).map((_, E) => _ + p[E]), k = x.locToIndex(w, d, h); + g[k] = u[b]; + } + return { dataId: t10.write(g, i, n.dtype), shape: i, dtype: n.dtype }; +} +var Od = { kernelName: Ln, backendName: "cpu", kernelFunc: s5 }; +var a5 = Le((r, e) => Math.pow(r, e)); +var i5 = Ye(Bn, a5); +var J_ = { kernelName: Bn, backendName: "cpu", kernelFunc: i5 }; +function u5(r) { + let { inputs: e, backend: t10, attrs: o } = r, { paramsNestedSplits: n, paramsDenseValues: s, indices: a } = e, { outputRaggedRank: i } = o, p = n.map((y) => t10.data.get(y.dataId).values), u = n.map((y) => y.shape), c = t10.data.get(s.dataId).values, l = t10.data.get(a.dataId).values, [m, f, d] = Sd(p, u, c, s.shape, s.dtype, l, a.shape, i), h = m.map((y) => t10.makeTensorInfo([y.length], "int32", y)), g = t10.makeTensorInfo(d, s.dtype, f); + return h.concat([g]); +} +var eE = { kernelName: Tp, backendName: "cpu", kernelFunc: u5 }; +function p5(r) { + let { inputs: e, backend: t10 } = r, { starts: o, limits: n, deltas: s } = e, a = t10.data.get(o.dataId).values, i = t10.data.get(n.dataId).values, p = t10.data.get(s.dataId).values, [u, c] = vd(a, o.shape, o.dtype, i, n.shape, p, s.shape), l = t10.makeTensorInfo([u.length], "int32", u), m = t10.makeTensorInfo([c.length], o.dtype, c); + return [l, m]; +} +var tE = { kernelName: Np, backendName: "cpu", kernelFunc: p5 }; +function c5(r) { + let { inputs: e, backend: t10, attrs: o } = r, { shape: n, values: s, defaultValue: a, rowPartitionTensors: i } = e, { rowPartitionTypes: p } = o, u = t10.data.get(n.dataId).values, c = t10.data.get(s.dataId).values, l = t10.data.get(a.dataId).values, m = i.map((g) => t10.data.get(g.dataId).values), f = i.map((g) => g.shape), [d, h] = kd(u, n.shape, c, s.shape, s.dtype, l, a.shape, m, f, p); + return t10.makeTensorInfo(d, s.dtype, h); +} +var rE = { kernelName: _p, backendName: "cpu", kernelFunc: c5 }; +function l5(r) { + let { backend: e, attrs: t10 } = r, { start: o, stop: n, dtype: s, step: a } = t10, i = Su(o, n, a, s); + return e.makeTensorInfo([i.length], s, i); +} +var oE = { kernelName: ws, backendName: "cpu", kernelFunc: l5 }; +var m5 = we(ma, (r) => 1 / r); +var nE = { kernelName: ma, backendName: "cpu", kernelFunc: m5 }; +function f5(r) { + let { inputs: e, backend: t10, attrs: o } = r, { images: n } = e, { alignCorners: s, halfPixelCenters: a, size: i } = o; + K(n, "resizeBilinear"); + let p = x.computeStrides(n.shape), [u, c] = i, [l, m, f, d] = n.shape, h = t10.data.get(n.dataId).values, g = new Float32Array(x.sizeFromShape([l, u, c, d])), y = [s && u > 1 ? m - 1 : m, s && c > 1 ? f - 1 : f], b = [s && u > 1 ? u - 1 : u, s && c > 1 ? c - 1 : c], C = 0, w = y[0] / b[0], k = y[1] / b[1]; + for (let _ = 0; _ < l; _++) + for (let E = 0; E < u; E++) { + let R; + a ? R = w * (E + 0.5) - 0.5 : R = w * E; + let A = Math.max(0, Math.floor(R)), D = R - A, O = Math.min(m - 1, Math.ceil(R)), M = _ * p[0] + A * p[1], L = _ * p[0] + O * p[1]; + for (let W = 0; W < c; W++) { + let V; + a ? V = k * (W + 0.5) - 0.5 : V = k * W; + let G = Math.max(0, Math.floor(V)), q = V - G, H = Math.min(f - 1, Math.ceil(V)), j = M + G * p[2], Y = L + G * p[2], Z = M + H * p[2], ee = L + H * p[2]; + for (let X = 0; X < d; X++) { + let Q = h[j + X], se = h[Y + X], ie = h[Z + X], de = h[ee + X], Ie = Q + (ie - Q) * q, Se = se + (de - se) * q, Ee = Ie + (Se - Ie) * D; + g[C++] = Ee; + } + } + } + return t10.makeTensorInfo([l, u, c, d], "float32", g); +} +var sE = { kernelName: Un, backendName: "cpu", kernelFunc: f5 }; +function d5(r) { + let { inputs: e, backend: t10, attrs: o } = r, { images: n, dy: s } = e, { alignCorners: a } = o; + K([s, n], "resizeBilinearGrad"); + let i = x.computeStrides(n.shape), [p, u, c, l] = n.shape, [, m, f] = s.shape, d = new Float32Array(p * u * c * l), h = [a && m > 1 ? u - 1 : u, a && f > 1 ? c - 1 : c], g = [a && m > 1 ? m - 1 : m, a && f > 1 ? f - 1 : f], y = h[0] / g[0], b = h[1] / g[1], C = t10.data.get(s.dataId).values, w = 0; + for (let k = 0; k < p; k++) { + let _ = k * i[0]; + for (let E = 0; E < m; E++) { + let R = E * y, A = Math.floor(R), D = Math.min(Math.ceil(R), u - 1), O = _ + A * i[1], M = _ + D * i[1], L = R - A, W = 1 - L; + for (let V = 0; V < f; V++) { + let G = V * b, q = Math.floor(G), H = Math.min(Math.ceil(G), c - 1), j = G - q, Y = 1 - j, Z = O + q * i[2], ee = O + H * i[2], X = M + q * i[2], Q = M + H * i[2], se = W * Y, ie = W * j, de = L * Y, Ie = L * j; + for (let Se = 0; Se < l; Se++) { + let Ee = C[w++]; + d[Z + Se] += Ee * se, d[ee + Se] += Ee * ie, d[X + Se] += Ee * de, d[Q + Se] += Ee * Ie; + } + } + } + } + return t10.makeTensorInfo([p, c, u, l], "float32", d); +} +var aE = { kernelName: Vm, backendName: "cpu", kernelFunc: d5 }; +function h5(r) { + let { inputs: e, backend: t10, attrs: o } = r, { images: n } = e, { alignCorners: s, halfPixelCenters: a, size: i } = o; + K(n, "resizeNearestNeighbor"); + let p = x.computeStrides(n.shape), [u, c] = i, [l, m, f, d] = n.shape, h = t10.data.get(n.dataId).values, g = new Float32Array(l * u * c * d), y = [s && u > 1 ? m - 1 : m, s && c > 1 ? f - 1 : f], b = [s && u > 1 ? u - 1 : u, s && c > 1 ? c - 1 : c], C = y[0] / b[0], w = y[1] / b[1], k = 0; + for (let _ = 0; _ < l; _++) { + let E = _ * p[0]; + for (let R = 0; R < u; R++) { + let A = a ? C * (R + 0.5) : C * R, D = Math.min(m - 1, s ? Math.round(A) : Math.floor(A)); + a && (D = Math.max(0, D)); + let O = E + D * p[1]; + for (let M = 0; M < c; M++) { + let L = a ? w * (M + 0.5) : w * M, W = Math.min(f - 1, s ? Math.round(L) : Math.floor(L)); + a && (W = Math.max(0, W)); + let V = O + W * p[2]; + for (let G = 0; G < d; G++) { + let q = h[V + G]; + g[k++] = q; + } + } + } + } + return t10.makeTensorInfo([l, u, c, d], n.dtype, g); +} +var iE = { kernelName: Wn, backendName: "cpu", kernelFunc: h5 }; +function g5(r) { + let { inputs: e, backend: t10, attrs: o } = r, { images: n, dy: s } = e, { alignCorners: a } = o; + K([s, n], "resizeNearestNeighborGrad"); + let i = x.computeStrides(n.shape), p = x.computeStrides(s.shape), [u, c, l, m] = n.shape, [, f, d] = s.shape, h = new Float32Array(u * c * l * m), g = t10.data.get(s.dataId).values, y = [a && f > 1 ? c - 1 : c, a && d > 1 ? l - 1 : l], b = [a && f > 1 ? f - 1 : f, a && d > 1 ? d - 1 : d], C = y[0] / b[0], w = y[1] / b[1], k = 1 / C, _ = 1 / w, E = Math.ceil(k) * 2 + 2, R = Math.ceil(_) * 2 + 2; + for (let A = 0; A < u; A++) { + let D = A * i[0]; + for (let O = 0; O < c; O++) { + let M = D + O * i[1], L = Math.floor(O * k), W = Math.floor(L - E / 2); + for (let V = 0; V < l; V++) { + let G = M + V * i[2], q = Math.floor(V * _), H = Math.floor(q - R / 2); + for (let j = 0; j < m; j++) { + let Y = 0; + for (let Z = 0; Z < E; Z++) { + let ee = Z + W; + if (ee < 0 || ee >= f) + continue; + let X = D + ee * p[1], Q = ee * C, se = Math.min(c - 1, a ? Math.round(Q) : Math.floor(Q)); + if (O === se) + for (let ie = 0; ie < R; ie++) { + let de = ie + H; + if (de < 0 || de >= d) + continue; + let Ie = X + de * p[2], Se = de * w, Ee = Math.min(l - 1, a ? Math.round(Se) : Math.floor(Se)); + V === Ee && (Y += g[Ie + j]); + } + } + h[G + j] = Y; + } + } + } + } + return t10.makeTensorInfo(n.shape, n.dtype, h); +} +var uE = { kernelName: Bm, backendName: "cpu", kernelFunc: g5 }; +function x5(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { dims: s } = o; + K(n, "reverse"); + let a = n.shape.length, i = x.parseAxisParam(s, n.shape); + if (a === 0) + return ar({ inputs: { x: n }, backend: t10 }); + let p = new je(n.shape, n.dtype), u = t10.bufferSync(n); + for (let c = 0; c < p.size; c++) { + let l = p.indexToLoc(c), m = l.slice(); + i.forEach((f) => m[f] = n.shape[f] - 1 - m[f]), p.set(u.get(...m), ...l); + } + return t10.makeTensorInfo(p.shape, p.dtype, p.values); +} +var pE = { kernelName: fa, backendName: "cpu", kernelFunc: x5 }; +var cE = { kernelName: es, backendName: "cpu", kernelFunc: ({ inputs: r, attrs: e, backend: t10 }) => { + let { image: o } = r, { radians: n, fillValue: s, center: a } = e, i = t10, p = x.getTypedArrayFromDType(o.dtype, x.sizeFromShape(o.shape)), [u, c, l, m] = o.shape, [f, d] = I.getImageCenter(a, c, l), h = 255, g = Math.sin(n), y = Math.cos(n), b = i.data.get(o.dataId).values; + for (let w = 0; w < u; w++) { + let k = w * l * c * m; + for (let _ = 0; _ < c; _++) { + let E = _ * (l * m); + for (let R = 0; R < l; R++) { + let A = R * m; + for (let D = 0; D < m; D++) { + let O = [u, _, R, D], M = O[2], L = O[1], W = (M - f) * y - (L - d) * g, V = (M - f) * g + (L - d) * y; + W = Math.round(W + f), V = Math.round(V + d); + let G = s; + if (typeof s != "number" && (D === 3 ? G = h : G = s[D]), W >= 0 && W < l && V >= 0 && V < c) { + let H = V * (l * m), j = W * m, Y = k + H + j + D; + G = b[Y]; + } + let q = k + E + A + D; + p[q] = G; + } + } + } + } + return { dataId: i.write(p, o.shape, o.dtype), shape: o.shape, dtype: o.dtype }; +} }; +var y5 = we(da, (r) => { + let e = Math.floor(r); + return r - e < 0.5 ? Math.floor(r) : r - e > 0.5 ? Math.ceil(r) : e % 2 === 0 ? e : e + 1; +}); +var lE = { kernelName: da, backendName: "cpu", kernelFunc: y5 }; +function b5(r) { + let { inputs: e, backend: t10, attrs: o } = r, { indices: n, updates: s } = e, { shape: a } = o, { sliceRank: i, numUpdates: p, sliceSize: u, strides: c, outputSize: l } = I.calculateShapes(s, n, a), m = true, f = t10.bufferSync(n), d = t10.bufferSync(s), h = Aa(f, d, a, l, u, p, i, c, 0, m); + return t10.makeTensorInfo(a, h.dtype, h.values); +} +var mE = { kernelName: Hn, backendName: "cpu", kernelFunc: b5 }; +function C5(r, e) { + let t10 = 0, o = r.length, n = 0; + for (; t10 < o; ) + n = Math.floor((t10 + o) / 2), r[n] < e ? t10 = n + 1 : o = n; + return o; +} +function I5(r, e) { + let t10 = 0, o = r.length, n = 0; + for (; t10 < o; ) + n = Math.floor((t10 + o) / 2), r[n] <= e ? t10 = n + 1 : o = n; + return o; +} +function fE(r, e, t10, o, n, s) { + let a = x.getArrayFromDType("int32", t10 * n); + for (let i = 0; i < t10; ++i) { + let p = r.slice(i * o, (i + 1) * o), u = i * n; + for (let c = 0; c < n; ++c) + a[u + c] = s === "left" ? C5(p, e[c + u]) : I5(p, e[c + u]); + } + return a; +} +function w5(r) { + let { inputs: e, backend: t10, attrs: o } = r, { sortedSequence: n, values: s } = e, { side: a } = o, i = t10.data.get(n.dataId).values, p = t10.data.get(s.dataId).values, u = fE(i, p, n.shape[0], n.shape[1], s.shape[1], a); + return t10.makeTensorInfo(s.shape, "int32", u); +} +var dE = { kernelName: Ep, backendName: "cpu", kernelFunc: w5 }; +function S5(r) { + let { inputs: e, backend: t10 } = r, { condition: o, t: n, e: s } = e; + K([o, n, s], "select"); + let a = o.shape.length, i = t10.data.get(o.dataId).values, p = t10.data.get(n.dataId).values, u = t10.data.get(s.dataId).values, c = ct(n.dtype, s.dtype), l = x.makeZerosTypedArray(x.sizeFromShape(n.shape), c), m = 0, f = a === 0 || a > 1 || n.shape.length === 1 ? 1 : x.sizeFromShape(n.shape.slice(1)); + for (let d = 0; d < i.length; d++) + for (let h = 0; h < f; h++) + i[d] === 1 ? l[m++] = p[d] : l[m++] = u[d]; + return t10.makeTensorInfo(n.shape, c, l); +} +var hE = { kernelName: vs, backendName: "cpu", kernelFunc: S5 }; +var v5 = I.SELU_SCALEALPHA; +var k5 = I.SELU_SCALE; +var T5 = we(Xi, (r) => r >= 0 ? k5 * r : v5 * (Math.exp(r) - 1)); +var gE = { kernelName: Xi, backendName: "cpu", kernelFunc: T5 }; +var N5 = we(Yi, (r) => r < 0 ? -1 : r > 0 ? 1 : 0); +var xE = { kernelName: Yi, backendName: "cpu", kernelFunc: N5 }; +var _5 = we(Kn, (r) => Math.sin(r)); +var yE = { kernelName: Kn, backendName: "cpu", kernelFunc: _5 }; +var E5 = we(ha, (r) => Math.sinh(r)); +var bE = { kernelName: ha, backendName: "cpu", kernelFunc: E5 }; +var $5 = 11920928955078125e-23; +var CE = Math.log($5) + 2; +var R5 = we(Qi, (r) => { + let e = r > -CE, t10 = r < CE, o = Math.exp(r), n; + return t10 ? n = o : e ? n = r : n = Math.log(1 + o), n; +}); +var IE = { kernelName: Qi, backendName: "cpu", kernelFunc: R5 }; +function A5(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { blockShape: s, paddings: a } = o; + K([n], "spaceToBatchND"); + let i = x.sizeFromShape(s), p = [[0, 0]]; + p.push(...a); + for (let _ = 1 + s.length; _ < n.shape.length; ++_) + p.push([0, 0]); + let u = Od.kernelFunc({ inputs: { x: n }, backend: t10, attrs: { paddings: p, constantValue: 0 } }), c = I.getReshaped(u.shape, s, i, false), l = I.getPermuted(c.length, s.length, false), m = I.getReshapedPermuted(u.shape, s, i, false), h = Oe({ inputs: { x: u }, backend: t10, attrs: { shape: c } }), b = bt({ inputs: { x: h }, backend: t10, attrs: { perm: l } }), k = Oe({ inputs: { x: b }, backend: t10, attrs: { shape: m } }); + return t10.disposeIntermediateTensorInfo(u), t10.disposeIntermediateTensorInfo(h), t10.disposeIntermediateTensorInfo(b), k; +} +var wE = { kernelName: ks, backendName: "cpu", kernelFunc: A5 }; +function F5(r) { + let { inputs: e, backend: t10 } = r, { indices: o, values: n, denseShape: s, defaultValue: a } = e; + if (s.shape.length !== 1) + throw new Error(`Dense shape must be a vector, saw: + ${s.shape}`); + if (o.shape.length !== 2) + throw new Error(`Indices must be a matrix, saw: + ${o.shape}`); + if (n.shape.length !== 1) + throw new Error(`Values must be a vector, saw: + ${n.shape}`); + if (a.shape.length !== 0) + throw new Error(`Default value must be a scalar, saw: + ${a.shape}`); + let i = t10.data.get(o.dataId).values, p = t10.data.get(n.dataId).values, u = t10.data.get(s.dataId).values, c = t10.data.get(a.dataId).values[0], [l, m, f, d, h] = Td(i, o.shape, o.dtype, p, n.dtype, u, c); + return [t10.makeTensorInfo(m, o.dtype, l), t10.makeTensorInfo([m[0]], n.dtype, f), t10.makeTensorInfo([d.length], "bool", new Uint8Array(d.map((g) => Number(g)))), t10.makeTensorInfo([h.length], o.dtype, new Int32Array(h))]; +} +var SE = { kernelName: Qa, backendName: "cpu", kernelFunc: F5 }; +function D5(r) { + let { inputs: e, backend: t10 } = r, { inputIndices: o, inputShape: n, newShape: s } = e; + if (o.shape.length !== 2) + throw new Error(`Input indices should be a matrix but received shape + ${o.shape}`); + if (n.shape.length !== 1) + throw new Error(`Input shape should be a vector but received shape + ${n.shape}`); + if (s.shape.length !== 1) + throw new Error(`Target shape should be a vector but received shape ${s.shape}`); + let a = Array.from(t10.data.get(n.dataId).values), i = t10.data.get(o.dataId).values, p = Array.from(t10.data.get(s.dataId).values), [u, c, l] = Nd(i, o.shape, o.dtype, a, p); + return [t10.makeTensorInfo(c, o.dtype, u), t10.makeTensorInfo([l.length], s.dtype, new Int32Array(l))]; +} +var vE = { kernelName: ga, backendName: "cpu", kernelFunc: D5 }; +function P5(r) { + let { inputs: e, backend: t10 } = r, { data: o, indices: n, segmentIds: s } = e; + if (o.shape.length < 1) + throw new Error("Data should be at least 1 dimensional but received scalar"); + if (n.shape.length !== 1) + throw new Error(`Indices should be a vector but received shape + ${n.shape}`); + if (s.shape.length !== 1) + throw new Error(`Segment ids should be a vector but received shape + ${s.shape}`); + if (n.shape[0] !== s.shape[0]) + throw new Error("segmentIds and indices should have same size."); + let a = t10.data.get(o.dataId).values, i = t10.data.get(n.dataId).values, p = t10.data.get(s.dataId).values, [u, c] = tc(a, o.shape, o.dtype, i, p, true); + return t10.makeTensorInfo(c, o.dtype, u); +} +var kE = { kernelName: Za, backendName: "cpu", kernelFunc: P5 }; +function O5(r) { + let { inputs: e, backend: t10 } = r, { data: o, indices: n, segmentIds: s } = e; + if (o.shape.length < 1) + throw new Error("Data should be at least 1 dimensional but received scalar"); + if (n.shape.length !== 1) + throw new Error(`Indices should be a vector but received shape + ${n.shape}`); + if (s.shape.length !== 1) + throw new Error(`Segment ids should be a vector but received shape + ${s.shape}`); + if (n.shape[0] !== s.shape[0]) + throw new Error("segmentIds and indices should have same size."); + let a = t10.data.get(o.dataId).values, i = t10.data.get(n.dataId).values, p = t10.data.get(s.dataId).values, [u, c] = tc(a, o.shape, o.dtype, i, p); + return t10.makeTensorInfo(c, o.dtype, u); +} +var TE = { kernelName: Ja, backendName: "cpu", kernelFunc: O5 }; +function M5(r) { + let { inputs: e, backend: t10, attrs: o } = r, { sparseIndices: n, sparseValues: s, defaultValue: a } = e, { outputShape: i } = o, { sliceRank: p, numUpdates: u, sliceSize: c, strides: l, outputSize: m } = I.calculateShapes(s, n, i), f = false, d = t10.bufferSync(n), h; + switch (s.dtype) { + case "bool": { + let g = t10.bufferSync(s), y = Boolean(t10.data.get(a.dataId).values[0]); + h = Aa(d, g, i, m, c, u, p, l, y, f); + break; + } + case "float32": { + let g = t10.bufferSync(s), y = t10.data.get(a.dataId).values[0]; + h = Aa(d, g, i, m, c, u, p, l, y, f); + break; + } + case "int32": { + let g = t10.bufferSync(s), y = t10.data.get(a.dataId).values[0]; + h = Aa(d, g, i, m, c, u, p, l, y, f); + break; + } + case "string": { + let g = t10.bufferSync(s), y = x.decodeString(t10.data.get(a.dataId).values[0]); + h = Aa(d, g, i, m, c, u, p, l, y, f); + break; + } + default: + throw new Error(`Unsupported type ${s.dtype}`); + } + return t10.makeTensorInfo(i, h.dtype, h.values); +} +var NE = { kernelName: ei, backendName: "cpu", kernelFunc: M5 }; +function L5(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { numOrSizeSplits: s, axis: a } = o, i = x.parseAxisParam(a, n.shape)[0], p = I.prepareSplitSize(n, s, i), u = new Array(n.shape.length).fill(0), c = n.shape.slice(); + return p.map((l) => { + let m = [...c]; + m[i] = l; + let f = qo({ inputs: { x: n }, backend: t10, attrs: { begin: u, size: m } }); + return u[i] += l, f; + }); +} +var _E = { kernelName: Ts, backendName: "cpu", kernelFunc: L5 }; +var EE = { kernelName: ti, backendName: "cpu", kernelFunc: ({ inputs: r, backend: e }) => { + let { x: t10 } = r, o = e; + K(t10, "square"); + let n = o.data.get(t10.dataId).values, s = new Float32Array(n.length); + for (let i = 0; i < n.length; ++i) { + let p = n[i]; + s[i] = p * p; + } + return { dataId: o.write(s, t10.shape, t10.dtype), shape: t10.shape, dtype: t10.dtype }; +} }; +var B5 = we($s, (r, e) => { + let t10 = e; + return isNaN(r) ? NaN : r > 0 ? 1 : t10.alpha; +}); +var $E = { kernelName: $s, backendName: "cpu", kernelFunc: B5 }; +function V5(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { begin: s, end: a, strides: i, beginMask: p, endMask: u, ellipsisMask: c, newAxisMask: l, shrinkAxisMask: m } = o; + K(n, "stridedSlice"); + let { finalShapeSparse: f, finalShape: d, isIdentity: h, sliceDim0: g, isSimpleSlice: y, begin: b, end: C, strides: w } = et.sliceInfo(n.shape, s, a, i, p, u, c, l, m), k; + if (h) + k = Oe({ inputs: { x: n }, backend: t10, attrs: { shape: d } }); + else if (g || y) { + x.assert(n.shape.length >= 1, () => `Input must have rank at least 1, got: ${n.shape.length}`); + let _ = et.computeOutShape(b, C, w), E = qo({ inputs: { x: n }, backend: t10, attrs: { begin: b, size: _ } }); + k = Oe({ inputs: { x: E }, backend: t10, attrs: { shape: d } }), t10.disposeIntermediateTensorInfo(E); + } else { + let _ = t10.bufferSync(n), E = _d(f, _, w, b); + k = t10.makeTensorInfo(d, E.dtype, E.values); + } + return k; +} +var RE = { kernelName: Yn, backendName: "cpu", kernelFunc: V5 }; +function z5(r) { + let { inputs: e, backend: t10, attrs: o } = r, { separator: n, nGramWidths: s, leftPad: a, rightPad: i, padWidth: p, preserveShortSequences: u } = o, { data: c, dataSplits: l } = e, m = t10.data.get(c.dataId).values, f = t10.data.get(l.dataId).values, [d, h] = ku(m, f, n, s, a, i, p, u); + return [t10.makeTensorInfo([d.length], "string", d), t10.makeTensorInfo(l.shape, "int32", h)]; +} +var AE = { kernelName: Ns, backendName: "cpu", kernelFunc: z5 }; +function W5(r) { + let { inputs: e, backend: t10, attrs: o } = r, { skipEmpty: n } = o, { input: s, delimiter: a } = e; + if (s.dtype !== "string") + throw new Error("Input must be of datatype string"); + if (s.shape.length !== 1) + throw new Error(`Input must be a vector, got shape: ${s.shape}`); + if (a.shape.length !== 0) + throw new Error(`Delimiter must be a scalar, got shape: ${a.shape}`); + let i = t10.data.get(s.dataId).values, p = t10.data.get(a.dataId).values[0], [u, c, l] = Tu(i, p, n), m = c.length; + return [t10.makeTensorInfo([m, 2], "int32", u), t10.makeTensorInfo([m], "string", c), t10.makeTensorInfo([2], "int32", new Int32Array(l))]; +} +var FE = { kernelName: ri, backendName: "cpu", kernelFunc: W5 }; +function U5(r) { + let { inputs: e, backend: t10, attrs: o } = r, { numBuckets: n } = o, { input: s } = e; + if (s.dtype !== "string") + throw new Error("Input must be of datatype string"); + if (n <= 0) + throw new Error("Number of buckets must be at least 1"); + let a = t10.data.get(s.dataId).values, i = Nu(a, n); + return t10.makeTensorInfo(s.shape, "int32", i); +} +var DE = { kernelName: oi, backendName: "cpu", kernelFunc: U5 }; +var G5 = we(xa, (r) => Math.tan(r)); +var PE = { kernelName: xa, backendName: "cpu", kernelFunc: G5 }; +var H5 = we(Qn, (r) => Math.tanh(r)); +var OE = { kernelName: Qn, backendName: "cpu", kernelFunc: H5 }; +function q5(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { reps: s } = o; + K(n, "tile"); + let a = Ed(t10.bufferSync(n), s); + return t10.makeTensorInfo(a.shape, a.dtype, a.values); +} +var ME = { kernelName: wo, backendName: "cpu", kernelFunc: q5 }; +function K5(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { k: s, sorted: a } = o; + K(n, "topk"); + let i = t10.data.get(n.dataId).values, [p, u] = $d(i, n.shape, n.dtype, s, a); + return [t10.makeTensorInfo(p.shape, p.dtype, p.values), t10.makeTensorInfo(u.shape, u.dtype, u.values)]; +} +var LE = { kernelName: Zn, backendName: "cpu", kernelFunc: K5 }; +function j5(r) { + let { inputs: e, attrs: t10, backend: o } = r, { image: n, transforms: s } = e, { interpolation: a, fillMode: i, fillValue: p, outputShape: u } = t10, [c, l, m, f] = n.shape, [d, h] = u != null ? u : [l, m], g = [c, d, h, f], y = x.computeStrides(n.shape), b = y[0], C = y[1], w = y[2], k = x.computeStrides(g), _ = k[0], E = k[1], R = k[2], A = x.getTypedArrayFromDType(n.dtype, x.sizeFromShape(g)); + A.fill(p); + let D = o.data.get(n.dataId).values, O = o.data.get(s.dataId).values; + for (let L = 0; L < c; ++L) { + let W = s.shape[0] === 1 ? O : O.subarray(L * 8, L * 8 + 8); + for (let V = 0; V < d; ++V) + for (let G = 0; G < h; ++G) + for (let q = 0; q < f; ++q) { + let H, j = W[6] * G + W[7] * V + 1; + if (j === 0) + continue; + let Y = (W[0] * G + W[1] * V + W[2]) / j, Z = (W[3] * G + W[4] * V + W[5]) / j, ee = BE(Y, m, i), X = BE(Z, l, i); + switch (a) { + case "nearest": + H = J5(D, l, m, b, C, w, L, X, ee, q, p); + break; + case "bilinear": + H = e8(D, l, m, b, C, w, L, X, ee, q, p); + break; + default: + throw new Error(`Error in Transform: Expect 'nearest' or 'bilinear', but got ${a}`); + } + let Q = L * _ + V * E + G * R + q; + A[Q] = H; + } + return o.makeTensorInfo(g, n.dtype, A); + } + return { dataId: o.write(A, g, n.dtype), shape: n.shape, dtype: n.dtype }; +} +var VE = { kernelName: Jn, backendName: "cpu", kernelFunc: j5 }; +function BE(r, e, t10) { + switch (t10) { + case "reflect": + return X5(r, e); + case "wrap": + return Y5(r, e); + case "nearest": + return Z5(r, e); + case "constant": + default: + return Q5(r, e); + } +} +function X5(r, e) { + let t10 = r; + if (t10 < 0) + if (e <= 1) + t10 = 0; + else { + let o = 2 * e; + t10 < o && (t10 = o * Math.trunc(-t10 / o) + t10), t10 = t10 < -e ? t10 + o : -t10 - 1; + } + else if (t10 > e - 1) + if (e <= 1) + t10 = 0; + else { + let o = 2 * e; + t10 -= o * Math.trunc(t10 / o), t10 >= e && (t10 = o - t10 - 1); + } + return x.clamp(0, t10, e - 1); +} +function Y5(r, e) { + let t10 = r; + if (t10 < 0) + if (e <= 1) + t10 = 0; + else { + let o = e - 1; + t10 += e * (Math.trunc(-t10 / o) + 1); + } + else if (t10 > e - 1) + if (e <= 1) + t10 = 0; + else { + let o = e - 1; + t10 -= e * Math.trunc(t10 / o); + } + return x.clamp(0, t10, e - 1); +} +function Q5(r, e) { + return r; +} +function Z5(r, e) { + return x.clamp(0, r, e - 1); +} +function Nl(r, e, t10, o, n, s, a, i, p, u, c) { + let l = a * o + i * n + p * s + u; + return 0 <= i && i < e && 0 <= p && p < t10 ? r[l] : c; +} +function J5(r, e, t10, o, n, s, a, i, p, u, c) { + let l = Math.round(i), m = Math.round(p); + return Nl(r, e, t10, o, n, s, a, l, m, u, c); +} +function e8(r, e, t10, o, n, s, a, i, p, u, c) { + let l = Math.floor(i), m = Math.floor(p), f = l + 1, d = m + 1, h = (d - p) * Nl(r, e, t10, o, n, s, a, l, m, u, c) + (p - m) * Nl(r, e, t10, o, n, s, a, l, d, u, c), g = (d - p) * Nl(r, e, t10, o, n, s, a, f, m, u, c) + (p - m) * Nl(r, e, t10, o, n, s, a, f, d, u, c); + return (f - i) * h + (i - l) * g; +} +function t8(r) { + let { inputs: e, attrs: t10, backend: o } = r, { axis: n } = t10, { x: s } = e; + K(s, "unique"); + let a = o.data.get(s.dataId).values, { outputValues: i, outputShape: p, indices: u } = Rd(a, n, s.shape, s.dtype); + return [o.makeTensorInfo(p, s.dtype, i), o.makeTensorInfo([u.length], "int32", u)]; +} +var zE = { kernelName: $p, backendName: "cpu", kernelFunc: t8 }; +function r8(r) { + let { inputs: e, backend: t10, attrs: o } = r, { value: n } = e, { axis: s } = o; + s < 0 && (s += n.shape.length); + let a = n.shape.length, i = n.shape[s], p = new Array(a - 1), u = 0; + for (let f = 0; f < a; f++) + f !== s && (p[u++] = n.shape[f]); + let c = new Array(a).fill(0), l = n.shape.slice(); + l[s] = 1; + let m = new Array(i); + for (let f = 0; f < m.length; f++) { + c[s] = f; + let d = qo({ inputs: { x: n }, backend: t10, attrs: { begin: c, size: l } }); + m[f] = Oe({ inputs: { x: d }, backend: t10, attrs: { shape: p } }), t10.disposeIntermediateTensorInfo(d); + } + return m; +} +var WE = { kernelName: _s, backendName: "cpu", kernelFunc: r8 }; +function o8(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, segmentIds: s } = e, { numSegments: a } = o; + K(n, "unsortedSegmentSum"); + let i = n.shape.length, p = s.shape.length, u = [], c = [], l = i - p, m = s; + for (let d = 0; d < l; ++d) { + let h = oc({ inputs: { input: m }, backend: t10, attrs: { dim: d + 1 } }); + m = h, c.push(h); + } + for (let d = 0; d < a; ++d) { + let h = x.createScalarValue(d, "int32"), g = t10.makeTensorInfo([], "int32", h), y = sI({ inputs: { a: g, b: m }, backend: t10 }), b = Uo({ inputs: { x: y }, backend: t10, attrs: { dtype: "float32" } }), C = wu({ inputs: { a: b, b: n }, backend: t10 }), w = Fa({ inputs: { x: C }, backend: t10, attrs: { axis: 0, keepDims: false } }); + u.push(w), c.push(g), c.push(y), c.push(b), c.push(C), c.push(w); + } + let f = OI({ inputs: u, backend: t10, attrs: { axis: 0 } }); + return c.forEach((d) => t10.disposeIntermediateTensorInfo(d)), f; +} +var UE = { kernelName: Rp, backendName: "cpu", kernelFunc: o8 }; +var n8 = [h2, TN, g2, x2, RN, y2, b2, C2, I2, w2, S2, v2, k2, T2, N2, E2, $2, R2, A2, d2, F2, D2, P2, O2, $N, AN, M2, NN, L2, V2, z2, W2, U2, G2, H2, q2, K2, j2, X2, Y2, Q2, Z2, J2, e_, t_, r_, o_, n_, s_, a_, u_, u2, p_, FN, c_, DN, l_, PN, m_, f_, d_, ON, h_, g_, x_, y_, b_, MN, LN, _N, C_, B2, I_, w_, S_, p2, BN, VN, v_, zN, k_, T_, N_, __, E_, $_, R_, WN, A_, F_, D_, P_, M_, L_, B_, UN, V_, z_, G_, GN, HN, H_, q_, K_, qN, j_, Q_, Z_, Od, J_, c2, jN, eE, tE, rE, oE, EN, vl, nE, l2, m2, f2, sE, aE, iE, uE, pE, cE, lE, JN, mE, dE, hE, gE, t2, xE, yE, bE, r2, W_, IE, wE, SE, vE, kE, TE, NE, _E, n2, EE, s2, $E, RE, AE, FE, DE, a2, i_, PE, OE, ME, LE, VE, KN, zE, WE, UE, X_]; +for (let r of n8) + ya(r); +var ic = {}; +Be(ic, { assertNotComplex: () => as, bindCanvasToFramebuffer: () => f8, bindColorTextureToFramebuffer: () => Rl, bindTextureToProgramUniformSampler: () => ZI, bindTextureUnit: () => KE, bindVertexBufferToProgramAttribute: () => Wd, callAndCheck: () => me, canBeRepresented: () => VI, createFragmentShader: () => WI, createFramebuffer: () => XI, createProgram: () => UI, createStaticIndexBuffer: () => qI, createStaticVertexBuffer: () => HI, createTexture: () => KI, createVertexShader: () => zI, getBatchDim: () => Pa, getExtensionOrThrow: () => nc, getFramebufferErrorMessage: () => jE, getMaxTexturesInShader: () => tw, getNumChannels: () => l8, getProgramUniformLocation: () => QI, getProgramUniformLocationOrThrow: () => YI, getRowsCols: () => Oa, getShapeAs3D: () => ac, getTextureShapeFromLogicalShape: () => JI, getWebGLDisjointQueryTimerVersion: () => rw, getWebGLErrorMessage: () => qE, getWebGLMaxTextureSize: () => ew, hasExtension: () => Hr, isCapableOfRenderingToFloatTexture: () => ow, isDownloadFloatTextureEnabled: () => nw, isReshapeFree: () => Ti, isWebGLFenceEnabled: () => sw, isWebGLVersionEnabled: () => Gd, linkProgram: () => GI, logShaderSourceAndInfoLog: () => zd, resetMaxTextureSize: () => d8, resetMaxTexturesInShader: () => h8, unbindColorTextureFromFramebuffer: () => Ud, unbindTextureUnit: () => m8, validateFramebuffer: () => sc, validateProgram: () => $l, validateTextureSize: () => jI }); +var Eu = {}; +var Md = { alpha: false, antialias: false, premultipliedAlpha: false, preserveDrawingBuffer: false, depth: false, stencil: false, failIfMajorPerformanceCaveat: true }; +function MI(r, e) { + Eu[r] = e; +} +function Gr(r, e) { + if (!(r in Eu) || e != null) { + let o = a8(r, e); + if (o !== null) + Eu[r] = o; + else + return console.log("Could not get context for WebGL version", r), null; + } + let t10 = Eu[r]; + return t10 == null || t10.isContextLost() ? (delete Eu[r], Gr(r)) : (t10.disable(t10.DEPTH_TEST), t10.disable(t10.STENCIL_TEST), t10.disable(t10.BLEND), t10.disable(t10.DITHER), t10.disable(t10.POLYGON_OFFSET_FILL), t10.disable(t10.SAMPLE_COVERAGE), t10.enable(t10.SCISSOR_TEST), t10.enable(t10.CULL_FACE), t10.cullFace(t10.BACK), Eu[r]); +} +function s8(r) { + if (typeof OffscreenCanvas != "undefined" && r === 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 a8(r, e) { + if (r !== 1 && r !== 2) + throw new Error("Cannot get WebGL rendering context, WebGL is disabled."); + let t10 = e == null ? s8(r) : e; + return t10.addEventListener("webglcontextlost", (o) => { + o.preventDefault(), delete Eu[r]; + }, false), P().getBool("SOFTWARE_WEBGL_ENABLED") && (Md.failIfMajorPerformanceCaveat = false), r === 1 ? t10.getContext("webgl", Md) || t10.getContext("experimental-webgl", Md) : t10.getContext("webgl2", Md); +} +var ki; +(function(r) { + r[r.DENSE = 0] = "DENSE", r[r.SHARED_BATCH = 1] = "SHARED_BATCH"; +})(ki || (ki = {})); +var ir; +(function(r) { + r[r.RENDER = 0] = "RENDER", r[r.UPLOAD = 1] = "UPLOAD", r[r.PIXELS = 2] = "PIXELS", r[r.DOWNLOAD = 3] = "DOWNLOAD"; +})(ir || (ir = {})); +var Jt; +(function(r) { + r[r.UNPACKED_FLOAT16 = 0] = "UNPACKED_FLOAT16", r[r.UNPACKED_FLOAT32 = 1] = "UNPACKED_FLOAT32", r[r.PACKED_4X1_UNSIGNED_BYTE = 2] = "PACKED_4X1_UNSIGNED_BYTE", r[r.PACKED_2X2_FLOAT32 = 3] = "PACKED_2X2_FLOAT32", r[r.PACKED_2X2_FLOAT16 = 4] = "PACKED_2X2_FLOAT16"; +})(Jt || (Jt = {})); +function $u(r, e) { + return [e, r]; +} +function GE(r, e) { + return r * e; +} +function _l(r) { + let e = x.sizeFromShape(r), t10 = Math.ceil(e / 4); + return x.sizeToSquarishShape(t10); +} +function Ks(r, e) { + return [Math.max(1, Math.ceil(e / 2)), Math.max(1, Math.ceil(r / 2))]; +} +function HE(r, e) { + let [t10, o] = Ks(r, e); + return t10 * o * 4; +} +function El(r, e) { + let t10 = r, o, n, s, a, i, p, u, c, l, m; + return P().getNumber("WEBGL_VERSION") === 2 ? (o = t10.R32F, n = t10.R16F, s = t10.RGBA16F, a = t10.RGBA32F, i = t10.RED, u = 4, c = 1, l = t10.HALF_FLOAT, m = t10.FLOAT, p = t10.RGBA8) : (o = r.RGBA, n = r.RGBA, s = r.RGBA, a = t10.RGBA, i = r.RGBA, u = 4, c = 4, l = e != null ? e.HALF_FLOAT_OES : null, m = r.FLOAT, p = r.RGBA), { internalFormatFloat: o, internalFormatHalfFloat: n, internalFormatPackedHalfFloat: s, internalFormatPackedFloat: a, textureFormatFloat: i, downloadTextureFormat: p, downloadUnpackNumChannels: u, defaultNumChannels: c, textureTypeHalfFloat: l, textureTypeFloat: m }; +} +function me(r, e) { + let t10 = e(); + return P().getBool("DEBUG") && i8(r), t10; +} +function i8(r) { + let e = r.getError(); + if (e !== r.NO_ERROR) + throw new Error("WebGL Error: " + qE(r, e)); +} +var u8 = 596e-10; +var p8 = 65504; +function VI(r) { + return !!(P().getBool("WEBGL_RENDER_FLOAT32_ENABLED") || r === 0 || u8 < Math.abs(r) && Math.abs(r) < p8); +} +function qE(r, e) { + switch (e) { + case r.NO_ERROR: + return "NO_ERROR"; + case r.INVALID_ENUM: + return "INVALID_ENUM"; + case r.INVALID_VALUE: + return "INVALID_VALUE"; + case r.INVALID_OPERATION: + return "INVALID_OPERATION"; + case r.INVALID_FRAMEBUFFER_OPERATION: + return "INVALID_FRAMEBUFFER_OPERATION"; + case r.OUT_OF_MEMORY: + return "OUT_OF_MEMORY"; + case r.CONTEXT_LOST_WEBGL: + return "CONTEXT_LOST_WEBGL"; + default: + return `Unknown error code ${e}`; + } +} +function nc(r, e) { + return Da(r, () => r.getExtension(e), 'Extension "' + e + '" not supported on this browser.'); +} +function zI(r, e) { + let t10 = Da(r, () => r.createShader(r.VERTEX_SHADER), "Unable to create vertex WebGLShader."); + if (me(r, () => r.shaderSource(t10, e)), me(r, () => r.compileShader(t10)), r.getShaderParameter(t10, r.COMPILE_STATUS) === false) + throw console.log(r.getShaderInfoLog(t10)), new Error("Failed to compile vertex shader."); + return t10; +} +function WI(r, e) { + let t10 = Da(r, () => r.createShader(r.FRAGMENT_SHADER), "Unable to create fragment WebGLShader."); + if (me(r, () => r.shaderSource(t10, e)), me(r, () => r.compileShader(t10)), P().get("ENGINE_COMPILE_ONLY")) + return t10; + if (r.getShaderParameter(t10, r.COMPILE_STATUS) === false) + throw zd(e, r.getShaderInfoLog(t10)), new Error("Failed to compile fragment shader."); + return t10; +} +var c8 = /ERROR: [0-9]+:([0-9]+):/g; +function zd(r, e) { + let t10 = c8.exec(e); + if (t10 == null) { + console.log(`Couldn't parse line number in error: ${e}`), console.log(r); + return; + } + let o = +t10[1], n = r.split(` +`), s = n.length.toString().length + 2, a = n.map((l, m) => x.rightPad((m + 1).toString(), s) + l), i = 0; + for (let l = 0; l < a.length; l++) + i = Math.max(a[l].length, i); + let p = a.slice(0, o - 1), u = a.slice(o - 1, o), c = a.slice(o); + console.log(p.join(` +`)), console.log(e.split(` +`)[0]), console.log(`%c ${x.rightPad(u[0], i)}`, "border:1px solid red; background-color:#e3d2d2; color:#a61717"), console.log(c.join(` +`)); +} +function UI(r) { + return Da(r, () => r.createProgram(), "Unable to create WebGLProgram."); +} +function GI(r, e) { + if (me(r, () => r.linkProgram(e)), !P().get("ENGINE_COMPILE_ONLY") && r.getProgramParameter(e, r.LINK_STATUS) === false) + throw console.log(r.getProgramInfoLog(e)), new Error("Failed to link vertex and fragment shaders."); +} +function $l(r, e) { + if (me(r, () => r.validateProgram(e)), r.getProgramParameter(e, r.VALIDATE_STATUS) === false) + throw console.log(r.getProgramInfoLog(e)), new Error("Shader program validation failed."); +} +function HI(r, e) { + let t10 = Da(r, () => r.createBuffer(), "Unable to create WebGLBuffer"); + return me(r, () => r.bindBuffer(r.ARRAY_BUFFER, t10)), me(r, () => r.bufferData(r.ARRAY_BUFFER, e, r.STATIC_DRAW)), t10; +} +function qI(r, e) { + let t10 = Da(r, () => r.createBuffer(), "Unable to create WebGLBuffer"); + return me(r, () => r.bindBuffer(r.ELEMENT_ARRAY_BUFFER, t10)), me(r, () => r.bufferData(r.ELEMENT_ARRAY_BUFFER, e, r.STATIC_DRAW)), t10; +} +function l8() { + return P().getNumber("WEBGL_VERSION") === 2 ? 1 : 4; +} +function KI(r) { + return Da(r, () => r.createTexture(), "Unable to create WebGLTexture."); +} +function jI(r, e) { + let t10 = P().getNumber("WEBGL_MAX_TEXTURE_SIZE"); + if (r <= 0 || e <= 0) { + let o = `[${r}x${e}]`; + throw new Error("Requested texture size " + o + " is invalid."); + } + if (r > t10 || e > t10) { + let o = `[${r}x${e}]`, n = `[${t10}x${t10}]`; + throw new Error("Requested texture size " + o + " greater than WebGL maximum on this browser / GPU " + n + "."); + } +} +function XI(r) { + return Da(r, () => r.createFramebuffer(), "Unable to create WebGLFramebuffer."); +} +function Wd(r, e, t10, o, n, s, a) { + let i = r.getAttribLocation(e, t10); + return i === -1 ? false : (me(r, () => r.bindBuffer(r.ARRAY_BUFFER, o)), me(r, () => r.vertexAttribPointer(i, n, r.FLOAT, false, s, a)), me(r, () => r.enableVertexAttribArray(i)), true); +} +function KE(r, e, t10) { + XE(r, t10), me(r, () => r.activeTexture(r.TEXTURE0 + t10)), me(r, () => r.bindTexture(r.TEXTURE_2D, e)); +} +function m8(r, e) { + XE(r, e), me(r, () => r.activeTexture(r.TEXTURE0 + e)), me(r, () => r.bindTexture(r.TEXTURE_2D, null)); +} +function YI(r, e, t10) { + return Da(r, () => r.getUniformLocation(e, t10), 'uniform "' + t10 + '" not present in program.'); +} +function QI(r, e, t10) { + return r.getUniformLocation(e, t10); +} +function ZI(r, e, t10, o) { + me(r, () => KE(r, e, o)), me(r, () => r.uniform1i(t10, o)); +} +function f8(r) { + me(r, () => r.bindFramebuffer(r.FRAMEBUFFER, null)), me(r, () => r.viewport(0, 0, r.canvas.width, r.canvas.height)), me(r, () => r.scissor(0, 0, r.canvas.width, r.canvas.height)); +} +function Rl(r, e, t10) { + me(r, () => r.bindFramebuffer(r.FRAMEBUFFER, t10)), me(r, () => r.framebufferTexture2D(r.FRAMEBUFFER, r.COLOR_ATTACHMENT0, r.TEXTURE_2D, e, 0)); +} +function Ud(r, e) { + me(r, () => r.bindFramebuffer(r.FRAMEBUFFER, e)), me(r, () => r.framebufferTexture2D(r.FRAMEBUFFER, r.COLOR_ATTACHMENT0, r.TEXTURE_2D, null, 0)); +} +function sc(r) { + let e = r.checkFramebufferStatus(r.FRAMEBUFFER); + if (e !== r.FRAMEBUFFER_COMPLETE) + throw new Error("Error binding framebuffer: " + jE(r, e)); +} +function jE(r, e) { + switch (e) { + case r.FRAMEBUFFER_INCOMPLETE_ATTACHMENT: + return "FRAMEBUFFER_INCOMPLETE_ATTACHMENT"; + case r.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: + return "FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT"; + case r.FRAMEBUFFER_INCOMPLETE_DIMENSIONS: + return "FRAMEBUFFER_INCOMPLETE_DIMENSIONS"; + case r.FRAMEBUFFER_UNSUPPORTED: + return "FRAMEBUFFER_UNSUPPORTED"; + default: + return `unknown error ${e}`; + } +} +function Da(r, e, t10) { + let o = me(r, () => e()); + if (o == null) + throw new Error(t10); + return o; +} +function XE(r, e) { + let t10 = r.MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1, o = e + r.TEXTURE0; + if (o < r.TEXTURE0 || o > t10) { + let n = `[gl.TEXTURE0, gl.TEXTURE${t10}]`; + throw new Error(`textureUnit must be in ${n}.`); + } +} +function Pa(r, e = 2) { + return x.sizeFromShape(r.slice(0, r.length - e)); +} +function Oa(r) { + if (r.length === 0) + throw Error("Cannot get rows and columns of an empty shape array."); + return [r.length > 1 ? r[r.length - 2] : 1, r[r.length - 1]]; +} +function ac(r) { + let e = [1, 1, 1]; + return r.length === 0 || r.length === 1 && r[0] === 1 || (e = [Pa(r), ...Oa(r)]), e; +} +function JI(r, e = false) { + let t10 = P().getNumber("WEBGL_MAX_TEXTURE_SIZE"), o = P().getNumber("WEBGL_MAX_SIZE_FOR_NARROW_TEXTURE"); + o === 1 / 0 && P().getBool("WEBGL_AUTO_SQUARIFY_NARROW_TEXTURE_SHAPE") && (o = t10 / 2), e && (t10 = t10 * 2, o = o * 2, r = r.map((i, p) => p >= r.length - 2 ? x.nearestLargerEven(r[p]) : r[p]), r.length === 1 && (r = [2, r[0]])), r.length !== 2 && (r = x.squeezeShape(r).newShape); + let n = x.sizeFromShape(r), s = null; + r.length <= 1 && n <= t10 ? s = [1, n] : r.length === 2 && r[0] <= t10 && r[1] <= t10 ? s = r : r.length === 3 && r[0] * r[1] <= t10 && r[2] <= t10 ? s = [r[0] * r[1], r[2]] : r.length === 3 && r[0] <= t10 && r[1] * r[2] <= t10 ? s = [r[0], r[1] * r[2]] : r.length === 4 && r[0] * r[1] * r[2] <= t10 && r[3] <= t10 ? s = [r[0] * r[1] * r[2], r[3]] : r.length === 4 && r[0] <= t10 && r[1] * r[2] * r[3] <= t10 && (s = [r[0], r[1] * r[2] * r[3]]); + let a = s != null && Math.max(...s) > o && Math.min(...s) <= (e ? 2 : 1) && Math.min(...s) > 0; + if (s == null || a) + if (e) { + let i = Pa(r), p = 2, u = 2; + r.length && ([p, u] = Oa(r)), n = i * (p / 2) * (u / 2), s = x.sizeToSquarishShape(n).map((c) => c * 2); + } else + s = x.sizeToSquarishShape(n); + return s; +} +function Ld(r) { + return r % 2 === 0; +} +function Ti(r, e) { + if (r = r.slice(-2), e = e.slice(-2), x.arraysEqual(r, e) || !r.length || !e.length || r[0] === 0 || r[1] === 0 || e[0] === 0 || e[1] === 0) + return true; + if (r.length !== e.length) { + let t10 = r.slice(-1)[0], o = e.slice(-1)[0]; + if (t10 === o || Ld(t10) && Ld(o) && (r[0] === 1 || e[0] === 1)) + return true; + } + return r[1] === e[1] && Ld(r[0]) && Ld(e[0]); +} +var Bd; +var Vd; +function ew(r) { + if (Bd == null) { + let e = Gr(r); + Bd = e.getParameter(e.MAX_TEXTURE_SIZE); + } + return Bd; +} +function d8() { + Bd = null; +} +function h8() { + Vd = null; +} +function tw(r) { + if (Vd == null) { + let e = Gr(r); + Vd = e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS); + } + return Math.min(16, Vd); +} +function rw(r) { + if (r === 0) + return 0; + let e, t10 = Gr(r); + return Hr(t10, "EXT_disjoint_timer_query_webgl2") && r === 2 ? e = 2 : Hr(t10, "EXT_disjoint_timer_query") ? e = 1 : e = 0, e; +} +function Hr(r, e) { + return r.getExtension(e) != null; +} +function Gd(r) { + try { + if (Gr(r) != null) + return true; + } catch (e) { + return console.log("Error when getting WebGL context: ", e), false; + } + return false; +} +function ow(r) { + if (r === 0) + return false; + let e = Gr(r); + if (r === 1) { + if (!Hr(e, "OES_texture_float")) + return false; + } else if (!Hr(e, "EXT_color_buffer_float")) + return false; + return BI(e); +} +function nw(r) { + if (r === 0) + return false; + let e = Gr(r); + if (r === 1) { + if (!Hr(e, "OES_texture_float") || !Hr(e, "WEBGL_color_buffer_float")) + return false; + } else { + if (Hr(e, "EXT_color_buffer_float")) + return BI(e); + let o = "EXT_color_buffer_half_float"; + if (Hr(e, o)) { + let n = e.getExtension(o); + return g8(e, n); + } + return false; + } + return BI(e); +} +function BI(r) { + let e = El(r), t10 = r.createTexture(); + r.bindTexture(r.TEXTURE_2D, t10); + let o = 1, n = 1; + r.texImage2D(r.TEXTURE_2D, 0, e.internalFormatFloat, o, n, 0, e.textureFormatFloat, e.textureTypeFloat, null); + let s = r.createFramebuffer(); + r.bindFramebuffer(r.FRAMEBUFFER, s), r.framebufferTexture2D(r.FRAMEBUFFER, r.COLOR_ATTACHMENT0, r.TEXTURE_2D, t10, 0); + let a = r.checkFramebufferStatus(r.FRAMEBUFFER) === r.FRAMEBUFFER_COMPLETE; + return r.bindTexture(r.TEXTURE_2D, null), r.bindFramebuffer(r.FRAMEBUFFER, null), r.deleteTexture(t10), r.deleteFramebuffer(s), a; +} +function g8(r, e) { + let t10 = El(r, e), o = r.createTexture(); + r.bindTexture(r.TEXTURE_2D, o); + let n = 1, s = 1; + r.texImage2D(r.TEXTURE_2D, 0, t10.internalFormatHalfFloat, n, s, 0, t10.textureFormatFloat, t10.textureTypeHalfFloat, null); + let a = r.createFramebuffer(); + r.bindFramebuffer(r.FRAMEBUFFER, a), r.framebufferTexture2D(r.FRAMEBUFFER, r.COLOR_ATTACHMENT0, r.TEXTURE_2D, o, 0); + let i = r.checkFramebufferStatus(r.FRAMEBUFFER) === r.FRAMEBUFFER_COMPLETE; + return r.bindTexture(r.TEXTURE_2D, null), r.bindFramebuffer(r.FRAMEBUFFER, null), r.deleteTexture(o), r.deleteFramebuffer(a), i; +} +function sw(r) { + return r !== 2 ? false : Gr(r).fenceSync != null; +} +function as(r, e) { + Array.isArray(r) || (r = [r]), r.forEach((t10) => { + t10 != null && x.assert(t10.dtype !== "complex64", () => `${e} does not support complex64 tensors in the WebGL backend.`); + }); +} +var Ce = P(); +Ce.registerFlag("HAS_WEBGL", () => Ce.getNumber("WEBGL_VERSION") > 0); +Ce.registerFlag("WEBGL_VERSION", () => Gd(2) ? 2 : Gd(1) ? 1 : 0); +Ce.registerFlag("WEBGL_CHECK_NUMERICAL_PROBLEMS", () => false); +Ce.registerFlag("WEBGL_BUFFER_SUPPORTED", () => Ce.get("WEBGL_VERSION") === 2); +Ce.registerFlag("WEBGL_CPU_FORWARD", () => true); +Ce.registerFlag("WEBGL_FORCE_F16_TEXTURES", () => false); +Ce.registerFlag("WEBGL_PACK", () => Ce.getBool("HAS_WEBGL")); +Ce.registerFlag("WEBGL_PACK_NORMALIZATION", () => Ce.getBool("WEBGL_PACK")); +Ce.registerFlag("WEBGL_PACK_CLIP", () => Ce.getBool("WEBGL_PACK")); +Ce.registerFlag("WEBGL_PACK_DEPTHWISECONV", () => Ce.getBool("WEBGL_PACK")); +Ce.registerFlag("WEBGL_PACK_BINARY_OPERATIONS", () => Ce.getBool("WEBGL_PACK")); +Ce.registerFlag("WEBGL_PACK_UNARY_OPERATIONS", () => Ce.getBool("WEBGL_PACK")); +Ce.registerFlag("WEBGL_PACK_ARRAY_OPERATIONS", () => Ce.getBool("WEBGL_PACK")); +Ce.registerFlag("WEBGL_PACK_IMAGE_OPERATIONS", () => Ce.getBool("WEBGL_PACK")); +Ce.registerFlag("WEBGL_PACK_REDUCE", () => Ce.getBool("WEBGL_PACK")); +Ce.registerFlag("WEBGL_LAZILY_UNPACK", () => Ce.getBool("WEBGL_PACK")); +Ce.registerFlag("WEBGL_CONV_IM2COL", () => Ce.getBool("WEBGL_PACK")); +Ce.registerFlag("WEBGL_MAX_TEXTURE_SIZE", () => ew(Ce.getNumber("WEBGL_VERSION"))); +Ce.registerFlag("WEBGL_MAX_TEXTURES_IN_SHADER", () => tw(Ce.getNumber("WEBGL_VERSION"))); +Ce.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION", () => { + let r = Ce.getNumber("WEBGL_VERSION"); + return r === 0 ? 0 : rw(r); +}); +Ce.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE", () => Ce.getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION") > 0 && !ii.isMobile()); +Ce.registerFlag("WEBGL_RENDER_FLOAT32_CAPABLE", () => ow(Ce.getNumber("WEBGL_VERSION"))); +Ce.registerFlag("WEBGL_RENDER_FLOAT32_ENABLED", () => Ce.getBool("WEBGL_FORCE_F16_TEXTURES") ? false : Ce.getBool("WEBGL_RENDER_FLOAT32_CAPABLE")); +Ce.registerFlag("WEBGL_DOWNLOAD_FLOAT_ENABLED", () => nw(Ce.getNumber("WEBGL_VERSION"))); +Ce.registerFlag("WEBGL_FENCE_API_ENABLED", () => sw(Ce.getNumber("WEBGL_VERSION"))); +Ce.registerFlag("WEBGL_SIZE_UPLOAD_UNIFORM", () => Ce.getBool("WEBGL_RENDER_FLOAT32_ENABLED") ? 4 : 0); +Ce.registerFlag("WEBGL_DELETE_TEXTURE_THRESHOLD", () => -1, (r) => { + if (r < 0 && r !== -1) + throw new Error(`WEBGL_DELETE_TEXTURE_THRESHOLD must be -1 (indicating never delete) or at least 0, but got ${r}.`); +}); +Ce.registerFlag("WEBGL_FLUSH_THRESHOLD", () => ii.isMobile() ? 1 : -1, (r) => { + if (r < 0 && r !== -1) + throw new Error(`WEBGL_FLUSH_THRESHOLD must be -1 (indicating never manual flush) or at least 0, but got ${r}.`); +}); +Ce.registerFlag("CPU_HANDOFF_SIZE_THRESHOLD", () => 128); +Ce.registerFlag("WEBGL_USE_SHAPES_UNIFORMS", () => false); +Ce.registerFlag("TOPK_LAST_DIM_CPU_HANDOFF_SIZE_THRESHOLD", () => 1e5); +Ce.registerFlag("TOPK_K_CPU_HANDOFF_THRESHOLD", () => 128); +Ce.registerFlag("WEBGL_EXP_CONV", () => false); +Ce.registerFlag("SOFTWARE_WEBGL_ENABLED", () => Ce.getBool("IS_TEST")); +Ce.registerFlag("WEBGL_MAX_SIZE_FOR_NARROW_TEXTURE", () => 1 / 0); +Ce.registerFlag("WEBGL_AUTO_SQUARIFY_NARROW_TEXTURE_SHAPE", () => false); +Ce.registerFlag("WEBGL2_ISNAN_CUSTOM", () => false); +function Ct() { + let r, e, t10, o, n, s, a, i, p, u; + return P().getNumber("WEBGL_VERSION") === 2 ? (r = "#version 300 es", e = "in", t10 = "out", o = "in", n = "texture", s = "outputColor", a = "out vec4 outputColor;", i = P().getBool("WEBGL2_ISNAN_CUSTOM") ? ` + bool isnan_custom(float val) { + uint floatToUint = floatBitsToUint(val); + return (floatToUint & 0x7fffffffu) > 0x7f800000u; + } + + bvec4 isnan_custom(vec4 val) { + return bvec4(isnan_custom(val.x), + isnan_custom(val.y), isnan_custom(val.z), isnan_custom(val.w)); + } + + #define isnan(value) isnan_custom(value) + ` : "", p = "", u = ` + #define round(value) newRound(value) + int newRound(float value) { + return int(floor(value + 0.5)); + } + + ivec4 newRound(vec4 value) { + return ivec4(floor(value + vec4(0.5))); + } + `) : (r = "", e = "attribute", t10 = "varying", o = "varying", n = "texture2D", s = "gl_FragColor", a = "", i = ` + #define isnan(value) isnan_custom(value) + bool isnan_custom(float val) { + return (val > 0. || val < 1. || val == 0.) ? false : true; + } + bvec4 isnan_custom(vec4 val) { + return bvec4(isnan(val.x), isnan(val.y), isnan(val.z), isnan(val.w)); + } + `, p = ` + uniform float INFINITY; + + bool isinf(float val) { + return abs(val) == INFINITY; + } + bvec4 isinf(vec4 val) { + return equal(abs(val), vec4(INFINITY)); + } + `, u = ` + int round(float value) { + return int(floor(value + 0.5)); + } + + ivec4 round(vec4 value) { + return ivec4(floor(value + vec4(0.5))); + } + `), { version: r, attribute: e, varyingVs: t10, varyingFs: o, texture2D: n, output: s, defineOutput: a, defineSpecialNaN: i, defineSpecialInf: p, defineRound: u }; +} +function is(r, e, t10 = "index") { + let o = x.computeStrides(e); + return o.map((n, s) => { + let a = `int ${r[s]} = ${t10} / ${n}`, i = s === o.length - 1 ? `int ${r[s + 1]} = ${t10} - ${r[s]} * ${n}` : `index -= ${r[s]} * ${n}`; + return `${a}; ${i};`; + }).join(""); +} +function Ru(r, e, t10 = "index") { + let o = x.computeStrides(e); + return o.map((n, s) => { + let a = `int ${r[s]} = ${t10} / outShapeStrides[${s}]`, i = s === o.length - 1 ? `int ${r[s + 1]} = ${t10} - ${r[s]} * outShapeStrides[${s}]` : `index -= ${r[s]} * outShapeStrides[${s}]`; + return `${a}; ${i};`; + }).join(""); +} +function x8(r, e) { + let t10 = r.length, o = r.map((s) => `${e}[${s}]`), n = new Array(t10 - 1); + n[t10 - 2] = o[t10 - 1]; + for (let s = t10 - 3; s >= 0; --s) + n[s] = `(${n[s + 1]} * ${o[s + 1]})`; + return n; +} +function YE(r, e, t10 = "index") { + let o = r.map((s, a) => a), n = x8(o, e); + return n.map((s, a) => { + let i = `int ${r[a]} = ${t10} / ${n[a]}`, p = a === n.length - 1 ? `int ${r[a + 1]} = ${t10} - ${r[a]} * ${n[a]}` : `index -= ${r[a]} * ${n[a]}`; + return `${i}; ${p};`; + }).join(""); +} +function uc(r) { + let e = x.computeStrides(r).map((t10) => t10.toString()); + return ` + int getFlatIndex(ivec3 coords) { + return coords.x * ${e[0]} + coords.y * ${e[1]} + coords.z; + } +`; +} +function pc() { + return ` + int getFlatIndex(ivec3 coords) { + return coords.x * outShapeStrides[0] + coords.y * outShapeStrides[1] + coords.z; + } +`; +} +var Hd = ` + const float FLOAT_MAX = 1.70141184e38; + const float FLOAT_MIN = 1.17549435e-38; + + lowp vec4 encode_float(highp float v) { + if (isnan(v)) { + return vec4(255, 255, 255, 255); + } + + highp float av = abs(v); + + if(av < FLOAT_MIN) { + return vec4(0.0, 0.0, 0.0, 0.0); + } else if(v > FLOAT_MAX) { + return vec4(0.0, 0.0, 128.0, 127.0) / 255.0; + } else if(v < -FLOAT_MAX) { + return vec4(0.0, 0.0, 128.0, 255.0) / 255.0; + } + + highp vec4 c = vec4(0,0,0,0); + + highp float e = floor(log2(av)); + highp float m = exp2(fract(log2(av))) - 1.0; + + c[2] = floor(128.0 * m); + m -= c[2] / 128.0; + c[1] = floor(32768.0 * m); + m -= c[1] / 32768.0; + c[0] = floor(8388608.0 * m); + + highp float ebias = e + 127.0; + c[3] = floor(ebias / 2.0); + ebias -= c[3] * 2.0; + c[2] += floor(ebias) * 128.0; + + c[3] += 128.0 * step(0.0, -v); + + return c / 255.0; + } +`; +var { getBroadcastDims: QE } = I; +function ZE(r, e, t10) { + let o = []; + if (r.forEach((f) => { + let d = x.sizeFromShape(f.shapeInfo.logicalShape); + if (f.shapeInfo.isUniform ? o.push(`uniform float ${f.name}${d > 1 ? `[${d}]` : ""};`) : (o.push(`uniform sampler2D ${f.name};`), o.push(`uniform int offset${f.name};`)), t10.enableShapeUniforms) { + let { uniformShape: h } = qd(t10.packedInputs, f.shapeInfo.logicalShape, f.shapeInfo.texShape); + switch (h.length) { + case 1: + o.push(`uniform int ${f.name}Shape;`); + break; + case 2: + o.push(`uniform ivec2 ${f.name}Shape;`); + break; + case 3: + o.push(`uniform ivec3 ${f.name}Shape;`); + break; + case 4: + o.push(`uniform ivec4 ${f.name}Shape;`); + break; + default: + break; + } + o.push(`uniform ivec2 ${f.name}TexShape;`); + } + }), t10.enableShapeUniforms) { + switch (e.logicalShape.length) { + case 1: + o.push("uniform int outShape;"); + break; + case 2: + o.push("uniform ivec2 outShape;"), o.push("uniform int outShapeStrides;"); + break; + case 3: + o.push("uniform ivec3 outShape;"), o.push("uniform ivec2 outShapeStrides;"); + break; + case 4: + o.push("uniform ivec4 outShape;"), o.push("uniform ivec3 outShapeStrides;"); + break; + default: + break; + } + o.push("uniform ivec2 outTexShape;"); + } + t10.customUniforms && t10.customUniforms.forEach((f) => { + o.push(`uniform ${f.type} ${f.name}${f.arrayIndex ? `[${f.arrayIndex}]` : ""};`); + }); + let n = o.join(` +`), s = r.map((f) => y8(f, e, t10.packedInputs, t10.enableShapeUniforms)).join(` +`), a = e.texShape, i = Ct(), p = I8(i), u, c, l = v8(i); + return e.isPacked ? (u = b8(e.logicalShape, a, t10.enableShapeUniforms), c = S8(i)) : (u = C8(e.logicalShape, a, t10.enableShapeUniforms), c = w8(i)), t10.packedInputs && (l += _8), [l, p, c, n, u, s, t10.userCode].join(` +`); +} +function lc(r, e = false) { + let t10 = r.shapeInfo.logicalShape; + switch (t10.length) { + case 0: + return V8(r, e); + case 1: + return W8(r, e); + case 2: + return G8(r, e); + case 3: + return q8(r, e); + case 4: + return j8(r, e); + case 5: + return X8(r); + case 6: + return Y8(r); + default: + throw new Error(`${t10.length}-D input sampling is not yet supported`); + } +} +function JE(r, e) { + switch (r.shapeInfo.logicalShape.length) { + case 0: + return B8(r); + case 1: + return z8(r, e); + case 2: + return U8(r, e); + case 3: + return H8(r, e); + default: + return K8(r, e); + } +} +function y8(r, e, t10 = false, o) { + let n = ""; + t10 ? n += JE(r, o) : n += lc(r, o); + let s = r.shapeInfo.logicalShape, a = e.logicalShape; + return s.length <= a.length && (t10 ? n += Q8(r, e) : n += Z8(r, e)), n; +} +function b8(r, e, t10) { + switch (r.length) { + case 0: + return e$(); + case 1: + return E8(r, e, t10); + case 2: + return M8(r, e, t10); + case 3: + return R8(r, e, t10); + default: + return F8(r, e, t10); + } +} +function C8(r, e, t10) { + switch (r.length) { + case 0: + return e$(); + case 1: + return $8(r, e, t10); + case 2: + return L8(r, e, t10); + case 3: + return A8(r, e, t10); + case 4: + return D8(r, e, t10); + case 5: + return P8(r, e); + case 6: + return O8(r, e); + default: + throw new Error(`${r.length}-D output sampling is not yet supported`); + } +} +function I8(r) { + return ` + float sampleTexture(sampler2D textureSampler, vec2 uv) { + return ${r.texture2D}(textureSampler, uv).r; + } + `; +} +function w8(r) { + return ` + void setOutput(float val) { + ${r.output} = vec4(val, 0, 0, 0); + } + `; +} +function S8(r) { + return ` + void setOutput(vec4 val) { + ${r.output} = val; + } + `; +} +function v8(r) { + return `${r.version} + precision highp float; + precision highp int; + precision highp sampler2D; + ${r.varyingFs} vec2 resultUV; + ${r.defineOutput} + const vec2 halfCR = vec2(0.5, 0.5); + + struct ivec5 + { + int x; + int y; + int z; + int w; + int u; + }; + + struct ivec6 + { + int x; + int y; + int z; + int w; + int u; + int v; + }; + + uniform float NAN; + ${r.defineSpecialNaN} + ${r.defineSpecialInf} + ${r.defineRound} + + int imod(int x, int y) { + return x - y * (x / y); + } + + int idiv(int a, int b, float sign) { + int res = a / b; + int mod = imod(a, b); + if (sign < 0. && mod != 0) { + res -= 1; + } + return res; + } + + //Based on the work of Dave Hoskins + //https://www.shadertoy.com/view/4djSRW + #define HASHSCALE1 443.8975 + float random(float seed){ + vec2 p = resultUV * seed; + vec3 p3 = fract(vec3(p.xyx) * HASHSCALE1); + p3 += dot(p3, p3.yzx + 19.19); + return fract((p3.x + p3.y) * p3.z); + } + + ${k8} + ${T8} + ${N8} + `; +} +var k8 = ` +vec2 uvFromFlat(int texNumR, int texNumC, int index) { + int texR = index / texNumC; + int texC = index - texR * texNumC; + return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR); +} +vec2 packedUVfrom1D(int texNumR, int texNumC, int index) { + int texelIndex = index / 2; + int texR = texelIndex / texNumC; + int texC = texelIndex - texR * texNumC; + return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR); +} +`; +var T8 = ` +vec2 packedUVfrom2D(int texelsInLogicalRow, int texNumR, + int texNumC, int row, int col) { + int texelIndex = (row / 2) * texelsInLogicalRow + (col / 2); + int texR = texelIndex / texNumC; + int texC = texelIndex - texR * texNumC; + return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR); +} +`; +var N8 = ` +vec2 packedUVfrom3D(int texNumR, int texNumC, + int texelsInBatch, int texelsInLogicalRow, int b, + int row, int col) { + int index = b * texelsInBatch + (row / 2) * texelsInLogicalRow + (col / 2); + int texR = index / texNumC; + int texC = index - texR * texNumC; + return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR); +} +`; +var _8 = ` + float getChannel(vec4 frag, vec2 innerDims) { + vec2 modCoord = mod(innerDims, 2.); + return modCoord.x == 0. ? + (modCoord.y == 0. ? frag.r : frag.g) : + (modCoord.y == 0. ? frag.b : frag.a); + } + float getChannel(vec4 frag, int dim) { + float modCoord = mod(float(dim), 2.); + return modCoord == 0. ? frag.r : frag.g; + } +`; +function e$() { + return ` + int getOutputCoords() { + return 0; + } + `; +} +function E8(r, e, t10) { + let o = [Math.ceil(e[0] / 2), Math.ceil(e[1] / 2)]; + return o[0] === 1 ? t10 ? ` + int getOutputCoords() { + return 2 * int(resultUV.x * ceil(float(outTexShape[1]) / 2.0)); + } + ` : ` + int getOutputCoords() { + return 2 * int(resultUV.x * ${o[1]}.0); + } + ` : o[1] === 1 ? t10 ? ` + int getOutputCoords() { + return 2 * int(resultUV.y * ceil(float(outTexShape[0]) / 2.0)); + } + ` : ` + int getOutputCoords() { + return 2 * int(resultUV.y * ${o[0]}.0); + } + ` : t10 ? ` + int getOutputCoords() { + ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0)); + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(packedTexShape[0], packedTexShape[1])); + return 2 * (resTexRC.x * packedTexShape[1] + resTexRC.y); + } + ` : ` + int getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${o[0]}, ${o[1]})); + return 2 * (resTexRC.x * ${o[1]} + resTexRC.y); + } + `; +} +function $8(r, e, t10) { + return e[0] === 1 ? t10 ? ` + int getOutputCoords() { + return int(resultUV.x * float(outTexShape[1])); + } + ` : ` + int getOutputCoords() { + return int(resultUV.x * ${e[1]}.0); + } + ` : e[1] === 1 ? t10 ? ` + int getOutputCoords() { + return int(resultUV.y * float(outTexShape[0])); + } + ` : ` + int getOutputCoords() { + return int(resultUV.y * ${e[0]}.0); + } + ` : t10 ? ` + int getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(outTexShape[0], outTexShape[1])); + return resTexRC.x * outTexShape[1] + resTexRC.y; + } + ` : ` + int getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${e[0]}, ${e[1]})); + return resTexRC.x * ${e[1]} + resTexRC.y; + } + `; +} +function R8(r, e, t10) { + if (t10) + return ` + ivec3 getOutputCoords() { + ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0)); + int texelsInLogicalRow = int(ceil(float(outShape[2]) / 2.0)); + int texelsInBatch = texelsInLogicalRow * int(ceil(float(outShape[1]) / 2.0)); + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(packedTexShape[0], packedTexShape[1])); + int index = resTexRC.x * packedTexShape[1] + resTexRC.y; + + int b = index / texelsInBatch; + index -= b * texelsInBatch; + + int r = 2 * (index / texelsInLogicalRow); + int c = imod(index, texelsInLogicalRow) * 2; + + return ivec3(b, r, c); + } + `; + let o = [Math.ceil(e[0] / 2), Math.ceil(e[1] / 2)], n = Math.ceil(r[2] / 2), s = n * Math.ceil(r[1] / 2); + return ` + ivec3 getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${o[0]}, ${o[1]})); + int index = resTexRC.x * ${o[1]} + resTexRC.y; + + int b = index / ${s}; + index -= b * ${s}; + + int r = 2 * (index / ${n}); + int c = imod(index, ${n}) * 2; + + return ivec3(b, r, c); + } + `; +} +function A8(r, e, t10) { + if (t10) + return ` + ivec3 getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(outTexShape[0], outTexShape[1])); + int index = resTexRC.x * outTexShape[1] + resTexRC.y; + ${Ru(["r", "c", "d"], r)} + return ivec3(r, c, d); + } +`; + let o = is(["r", "c", "d"], r); + return ` + ivec3 getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${e[0]}, ${e[1]})); + int index = resTexRC.x * ${e[1]} + resTexRC.y; + ${o} + return ivec3(r, c, d); + } + `; +} +function F8(r, e, t10) { + if (t10) + return ` + ivec4 getOutputCoords() { + ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0)); + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(packedTexShape[0], packedTexShape[1])); + int index = resTexRC.x * packedTexShape[1] + resTexRC.y; + + int texelsInLogicalRow = int(ceil(float(outShape[3]) / 2.0)); + int texelsInBatch = texelsInLogicalRow * int(ceil(float(outShape[2]) / 2.0)); + int texelsInBatchN = texelsInBatch * outShape[1]; + + int b2 = index / texelsInBatchN; + index -= b2 * texelsInBatchN; + + int b = index / texelsInBatch; + index -= b * texelsInBatch; + + int r = 2 * (index / texelsInLogicalRow); + int c = imod(index, texelsInLogicalRow) * 2; + + return ivec4(b2, b, r, c); + } + `; + let o = [Math.ceil(e[0] / 2), Math.ceil(e[1] / 2)], n = Math.ceil(r[r.length - 1] / 2), s = n * Math.ceil(r[r.length - 2] / 2), a = s, i = "", p = "b, r, c"; + for (let u = 2; u < r.length - 1; u++) + a *= r[r.length - u - 1], i = ` + int b${u} = index / ${a}; + index -= b${u} * ${a}; + ` + i, p = `b${u}, ` + p; + return ` + ivec${r.length} getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${o[0]}, ${o[1]})); + int index = resTexRC.x * ${o[1]} + resTexRC.y; + + ${i} + + int b = index / ${s}; + index -= b * ${s}; + + int r = 2 * (index / ${n}); + int c = imod(index, ${n}) * 2; + + return ivec${r.length}(${p}); + } + `; +} +function D8(r, e, t10) { + if (t10) + return ` + ivec4 getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(outTexShape[0], outTexShape[1])); + int index = resTexRC.x * outTexShape[1] + resTexRC.y; + ${Ru(["r", "c", "d", "d2"], r)} + return ivec4(r, c, d, d2); + } + `; + let o = is(["r", "c", "d", "d2"], r); + return ` + ivec4 getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${e[0]}, ${e[1]})); + int index = resTexRC.x * ${e[1]} + resTexRC.y; + ${o} + return ivec4(r, c, d, d2); + } + `; +} +function P8(r, e) { + let t10 = is(["r", "c", "d", "d2", "d3"], r); + return ` + ivec5 getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * vec2(${e[0]}, + ${e[1]})); + + int index = resTexRC.x * ${e[1]} + resTexRC.y; + + ${t10} + + ivec5 outShape = ivec5(r, c, d, d2, d3); + return outShape; + } + `; +} +function O8(r, e) { + let t10 = is(["r", "c", "d", "d2", "d3", "d4"], r); + return ` + ivec6 getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${e[0]}, ${e[1]})); + int index = resTexRC.x * ${e[1]} + resTexRC.y; + + ${t10} + + ivec6 result = ivec6(r, c, d, d2, d3, d4); + return result; + } + `; +} +function M8(r, e, t10) { + let o = [Math.ceil(e[0] / 2), Math.ceil(e[1] / 2)]; + if (x.arraysEqual(r, e)) + return t10 ? ` + ivec2 getOutputCoords() { + ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0)); + return 2 * ivec2(resultUV.yx * vec2(packedTexShape[0], packedTexShape[1])); + } + ` : ` + ivec2 getOutputCoords() { + return 2 * ivec2(resultUV.yx * vec2(${o[0]}, ${o[1]})); + } + `; + let n = Math.ceil(r[1] / 2); + return t10 ? ` + ivec2 getOutputCoords() { + ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0)); + int texelsInLogicalRow = int(ceil(float(outShape[1]) / 2.0)); + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(packedTexShape[0], packedTexShape[1])); + + int index = resTexRC.x * packedTexShape[1] + resTexRC.y; + int r = 2 * (index / texelsInLogicalRow); + int c = imod(index, texelsInLogicalRow) * 2; + + return ivec2(r, c); + } + ` : ` + ivec2 getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${o[0]}, ${o[1]})); + + int index = resTexRC.x * ${o[1]} + resTexRC.y; + int r = 2 * (index / ${n}); + int c = imod(index, ${n}) * 2; + + return ivec2(r, c); + } + `; +} +function L8(r, e, t10) { + return x.arraysEqual(r, e) ? t10 ? ` + ivec2 getOutputCoords() { + return ivec2(resultUV.yx * vec2(outTexShape[0], outTexShape[1])); + } + ` : ` + ivec2 getOutputCoords() { + return ivec2(resultUV.yx * vec2(${e[0]}, ${e[1]})); + } + ` : r[1] === 1 ? t10 ? ` + ivec2 getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(outTexShape[0], outTexShape[1])); + int index = resTexRC.x * outTexShape[1] + resTexRC.y; + return ivec2(index, 0); + } + ` : ` + ivec2 getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${e[0]}, ${e[1]})); + int index = resTexRC.x * ${e[1]} + resTexRC.y; + return ivec2(index, 0); + } + ` : r[0] === 1 ? t10 ? ` + ivec2 getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(outTexShape[0], outTexShape[1])); + int index = resTexRC.x * outTexShape[1] + resTexRC.y; + return ivec2(0, index); + } + ` : ` + ivec2 getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${e[0]}, ${e[1]})); + int index = resTexRC.x * ${e[1]} + resTexRC.y; + return ivec2(0, index); + } + ` : t10 ? ` + ivec2 getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(outTexShape[0], outTexShape[1])); + int index = resTexRC.x * outTexShape[1] + resTexRC.y; + int r = index / outShape[1]; + int c = index - r * outShape[1]; + return ivec2(r, c); + } + ` : ` + ivec2 getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${e[0]}, ${e[1]})); + int index = resTexRC.x * ${e[1]} + resTexRC.y; + int r = index / ${r[1]}; + int c = index - r * ${r[1]}; + return ivec2(r, c); + } + `; +} +function Au(r) { + return `offset${r}`; +} +function B8(r) { + let e = r.name, t10 = "get" + e.charAt(0).toUpperCase() + e.slice(1), o = Ct(); + return ` + vec4 ${t10}() { + return ${o.texture2D}(${e}, halfCR); + } + `; +} +function V8(r, e) { + let t10 = r.name, o = "get" + t10.charAt(0).toUpperCase() + t10.slice(1); + if (r.shapeInfo.isUniform) + return `float ${o}() {return ${t10};}`; + let [n, s] = r.shapeInfo.texShape; + if (n === 1 && s === 1) + return ` + float ${o}() { + return sampleTexture(${t10}, halfCR); + } + `; + let a = Au(t10); + if (e) + return ` + float ${o}() { + vec2 uv = uvFromFlat(${t10}TexShape[0], ${t10}TexShape[1], ${a}); + return sampleTexture(${t10}, uv); + } + `; + let [i, p] = r.shapeInfo.texShape; + return ` + float ${o}() { + vec2 uv = uvFromFlat(${i}, ${p}, ${a}); + return sampleTexture(${t10}, uv); + } + `; +} +function z8(r, e) { + let t10 = r.name, o = "get" + t10.charAt(0).toUpperCase() + t10.slice(1), n = r.shapeInfo.texShape, s = Ct(); + if (e) + return ` + vec4 ${o}(int index) { + ivec2 packedTexShape = ivec2(ceil(float(${t10}TexShape[0]) / 2.0), ceil(float(${t10}TexShape[1]) / 2.0)); + vec2 uv = packedUVfrom1D( + packedTexShape[0], packedTexShape[1], index); + return ${s.texture2D}(${t10}, uv); + } + `; + let a = [Math.ceil(n[0] / 2), Math.ceil(n[1] / 2)]; + return ` + vec4 ${o}(int index) { + vec2 uv = packedUVfrom1D( + ${a[0]}, ${a[1]}, index); + return ${s.texture2D}(${t10}, uv); + } + `; +} +function W8(r, e) { + let t10 = r.name, o = "get" + t10.charAt(0).toUpperCase() + t10.slice(1); + if (r.shapeInfo.isUniform) + return ` + float ${o}(int index) { + ${mc(r)} + } + `; + let n = r.shapeInfo.texShape, s = n[0], a = n[1]; + if (a === 1 && s === 1) + return ` + float ${o}(int index) { + return sampleTexture(${t10}, halfCR); + } + `; + let i = Au(t10); + return a === 1 ? e ? ` + float ${o}(int index) { + vec2 uv = vec2(0.5, (float(index + ${i}) + 0.5) / float(${t10}TexShape[0])); + return sampleTexture(${t10}, uv); + } + ` : ` + float ${o}(int index) { + vec2 uv = vec2(0.5, (float(index + ${i}) + 0.5) / ${s}.0); + return sampleTexture(${t10}, uv); + } + ` : s === 1 ? e ? ` + float ${o}(int index) { + vec2 uv = vec2((float(index + ${i}) + 0.5) / float(${t10}TexShape[1]), 0.5); + return sampleTexture(${t10}, uv); + } + ` : ` + float ${o}(int index) { + vec2 uv = vec2((float(index + ${i}) + 0.5) / ${a}.0, 0.5); + return sampleTexture(${t10}, uv); + } + ` : e ? ` + float ${o}(int index) { + vec2 uv = uvFromFlat(${t10}TexShape[0], ${t10}TexShape[1], index + ${i}); + return sampleTexture(${t10}, uv); + } + ` : ` + float ${o}(int index) { + vec2 uv = uvFromFlat(${s}, ${a}, index + ${i}); + return sampleTexture(${t10}, uv); + } + `; +} +function U8(r, e) { + let t10 = r.shapeInfo.logicalShape, o = r.name, n = "get" + o.charAt(0).toUpperCase() + o.slice(1), s = r.shapeInfo.texShape, a = s[0], i = s[1], p = Ct(); + if (s != null && x.arraysEqual(t10, s)) + return e ? ` + vec4 ${n}(int row, int col) { + vec2 uv = (vec2(col, row) + halfCR) / vec2(${o}TexShape[1], ${o}TexShape[0]); + + return ${p.texture2D}(${o}, uv); + } + ` : ` + vec4 ${n}(int row, int col) { + vec2 uv = (vec2(col, row) + halfCR) / vec2(${i}.0, ${a}.0); + + return ${p.texture2D}(${o}, uv); + } + `; + if (e) + return ` + vec4 ${n}(int row, int col) { + ivec2 packedTexShape = ivec2(ceil(float(${o}TexShape[0]) / 2.0), ceil(float(${o}TexShape[1]) / 2.0)); + int valuesPerRow = int(ceil(float(${o}Shape[1]) / 2.0)); + vec2 uv = packedUVfrom2D(valuesPerRow, packedTexShape[0], packedTexShape[1], row, col); + return ${p.texture2D}(${o}, uv); + } + `; + let u = [Math.ceil(s[0] / 2), Math.ceil(s[1] / 2)], c = Math.ceil(t10[1] / 2); + return ` + vec4 ${n}(int row, int col) { + vec2 uv = packedUVfrom2D(${c}, ${u[0]}, ${u[1]}, row, col); + return ${p.texture2D}(${o}, uv); + } + `; +} +function G8(r, e) { + let t10 = r.shapeInfo.logicalShape, o = r.name, n = "get" + o.charAt(0).toUpperCase() + o.slice(1), s = r.shapeInfo.texShape; + if (s != null && x.arraysEqual(t10, s)) { + if (e) + return ` + float ${n}(int row, int col) { + vec2 uv = (vec2(col, row) + halfCR) / vec2(${o}TexShape[1], ${o}TexShape[0]); + return sampleTexture(${o}, uv); + } + `; + let m = s[0], f = s[1]; + return ` + float ${n}(int row, int col) { + vec2 uv = (vec2(col, row) + halfCR) / vec2(${f}.0, ${m}.0); + return sampleTexture(${o}, uv); + } + `; + } + let { newShape: a, keptDims: i } = x.squeezeShape(t10), p = a; + if (p.length < t10.length) { + let m = fc(r, p), f = ["row", "col"]; + return ` + ${lc(m, e)} + float ${n}(int row, int col) { + return ${n}(${dc(f, i)}); + } + `; + } + if (r.shapeInfo.isUniform) + return ` + float ${n}(int row, int col) { + int index = round(dot(vec2(row, col), vec2(${t10[1]}, 1))); + ${mc(r)} + } + `; + let u = s[0], c = s[1], l = Au(o); + return c === 1 ? e ? ` + float ${n}(int row, int col) { + float index = dot(vec3(row, col, ${l}), vec3(${o}Shape[1], 1, 1)); + vec2 uv = vec2(0.5, (index + 0.5) / float(${o}TexShape[0])); + return sampleTexture(${o}, uv); + } + ` : ` + float ${n}(int row, int col) { + float index = dot(vec3(row, col, ${l}), vec3(${t10[1]}, 1, 1)); + vec2 uv = vec2(0.5, (index + 0.5) / ${u}.0); + return sampleTexture(${o}, uv); + } + ` : u === 1 ? e ? ` + float ${n}(int row, int col) { + float index = dot(vec3(row, col, ${l}), vec3(${o}Shape[1], 1, 1)); + vec2 uv = vec2((index + 0.5) / float(${o}TexShape[1]), 0.5); + return sampleTexture(${o}, uv); + } + ` : ` + float ${n}(int row, int col) { + float index = dot(vec3(row, col, ${l}), vec3(${t10[1]}, 1, 1)); + vec2 uv = vec2((index + 0.5) / ${c}.0, 0.5); + return sampleTexture(${o}, uv); + } + ` : e ? ` + float ${n}(int row, int col) { + // Explicitly use integer operations as dot() only works on floats. + int index = row * ${o}Shape[1] + col + ${l}; + vec2 uv = uvFromFlat(${o}TexShape[0], ${o}TexShape[1], index); + return sampleTexture(${o}, uv); + } + ` : ` + float ${n}(int row, int col) { + // Explicitly use integer operations as dot() only works on floats. + int index = row * ${t10[1]} + col + ${l}; + vec2 uv = uvFromFlat(${u}, ${c}, index); + return sampleTexture(${o}, uv); + } +`; +} +function H8(r, e) { + let t10 = r.shapeInfo.logicalShape, o = r.name, n = "get" + o.charAt(0).toUpperCase() + o.slice(1), s = r.shapeInfo.texShape, a = [Math.ceil(s[0] / 2), Math.ceil(s[1] / 2)]; + if (t10[0] === 1) { + let m = t10.slice(1), f = [1, 2], d = fc(r, m), h = ["b", "row", "col"]; + return ` + ${JE(d, e)} + vec4 ${n}(int b, int row, int col) { + return ${n}(${dc(h, f)}); + } + `; + } + let i = Ct(); + if (e) + return ` + vec4 ${n}(int b, int row, int col) { + ivec2 packedTexShape = ivec2(ceil(float(${o}TexShape[0]) / 2.0), ceil(float(${o}TexShape[1]) / 2.0)); + int valuesPerRow = int(ceil(float(${o}Shape[2]) / 2.0)); + int texelsInBatch = valuesPerRow * int(ceil(float(${o}Shape[1]) / 2.0)); + vec2 uv = packedUVfrom3D( + packedTexShape[0], packedTexShape[1], texelsInBatch, valuesPerRow, b, row, col); + return ${i.texture2D}(${o}, uv); + } + `; + let p = a[0], u = a[1], c = Math.ceil(t10[2] / 2), l = c * Math.ceil(t10[1] / 2); + return ` + vec4 ${n}(int b, int row, int col) { + vec2 uv = packedUVfrom3D( + ${p}, ${u}, ${l}, ${c}, b, row, col); + return ${i.texture2D}(${o}, uv); + } + `; +} +function q8(r, e) { + let t10 = r.shapeInfo.logicalShape, o = r.name, n = "get" + o.charAt(0).toUpperCase() + o.slice(1), s = t10[1] * t10[2], a = t10[2], { newShape: i, keptDims: p } = x.squeezeShape(t10), u = i; + if (u.length < t10.length) { + let h = fc(r, u), g = ["row", "col", "depth"]; + return ` + ${lc(h, e)} + float ${n}(int row, int col, int depth) { + return ${n}(${dc(g, p)}); + } + `; + } + if (r.shapeInfo.isUniform) + return ` + float ${n}(int row, int col, int depth) { + int index = round(dot(vec3(row, col, depth), + vec3(${s}, ${a}, 1))); + ${mc(r)} + } + `; + let c = r.shapeInfo.texShape, l = c[0], m = c[1], f = r.shapeInfo.flatOffset; + if (m === s && f == null) + return e ? ` + float ${n}(int row, int col, int depth) { + int stride1 = ${o}Shape[2]; + float texR = float(row); + float texC = dot(vec2(col, depth), vec2(stride1, 1)); + vec2 uv = (vec2(texC, texR) + halfCR) / + vec2(${o}TexShape[1], ${o}TexShape[0]); + return sampleTexture(${o}, uv); + } + ` : ` + float ${n}(int row, int col, int depth) { + float texR = float(row); + float texC = dot(vec2(col, depth), vec2(${a}, 1)); + vec2 uv = (vec2(texC, texR) + halfCR) / + vec2(${m}.0, ${l}.0); + return sampleTexture(${o}, uv); + } + `; + if (m === a && f == null) + return e ? ` + float ${n}(int row, int col, int depth) { + float texR = dot(vec2(row, col), vec2(${o}Shape[1], 1)); + float texC = float(depth); + vec2 uv = (vec2(texC, texR) + halfCR) / vec2(${o}TexShape[1], ${o}TexShape[0]); + return sampleTexture(${o}, uv); + } + ` : ` + float ${n}(int row, int col, int depth) { + float texR = dot(vec2(row, col), vec2(${t10[1]}, 1)); + float texC = float(depth); + vec2 uv = (vec2(texC, texR) + halfCR) / vec2(${m}.0, ${l}.0); + return sampleTexture(${o}, uv); + } + `; + let d = Au(o); + return e ? ` + float ${n}(int row, int col, int depth) { + // Explicitly use integer operations as dot() only works on floats. + int stride0 = ${o}Shape[1] * ${o}Shape[2]; + int stride1 = ${o}Shape[2]; + int index = row * stride0 + col * stride1 + depth + ${d}; + vec2 uv = uvFromFlat(${o}TexShape[0], ${o}TexShape[1], index); + return sampleTexture(${o}, uv); + } + ` : ` + float ${n}(int row, int col, int depth) { + // Explicitly use integer operations as dot() only works on floats. + int index = row * ${s} + col * ${a} + depth + ${d}; + vec2 uv = uvFromFlat(${l}, ${m}, index); + return sampleTexture(${o}, uv); + } + `; +} +function K8(r, e) { + let t10 = r.name, o = "get" + t10.charAt(0).toUpperCase() + t10.slice(1), n = Ct(); + if (e) + return ` + vec4 ${o}(int b2, int b, int row, int col) { + int valuesPerRow = int(ceil(float(${t10}Shape[3]) / 2.0)); + int texelsInBatch = valuesPerRow * int(ceil(float(${t10}Shape[2]) / 2.0)); + int index = b * texelsInBatch + (row / 2) * valuesPerRow + (col / 2); + texelsInBatch *= ${t10}Shape[1]; + index = b2 * texelsInBatch + index; + ivec2 packedTexShape = ivec2(ceil(float(${t10}TexShape[0]) / 2.0), ceil(float(${t10}TexShape[1]) / 2.0)); + int texR = index / packedTexShape[1]; + int texC = index - texR * packedTexShape[1]; + vec2 uv = (vec2(texC, texR) + halfCR) / vec2(packedTexShape[1], packedTexShape[0]); return ${n.texture2D}(${t10}, uv); + } + `; + let s = r.shapeInfo.logicalShape, a = s.length, i = r.shapeInfo.texShape, p = [Math.ceil(i[0] / 2), Math.ceil(i[1] / 2)], u = p[0], c = p[1], l = Math.ceil(s[a - 1] / 2), m = l * Math.ceil(s[a - 2] / 2), f = "int b, int row, int col", d = `b * ${m} + (row / 2) * ${l} + (col / 2)`; + for (let h = 2; h < a - 1; h++) + f = `int b${h}, ` + f, m *= s[a - h - 1], d = `b${h} * ${m} + ` + d; + return ` + vec4 ${o}(${f}) { + int index = ${d}; + int texR = index / ${c}; + int texC = index - texR * ${c}; + vec2 uv = (vec2(texC, texR) + halfCR) / vec2(${c}, ${u}); + return ${n.texture2D}(${t10}, uv); + } + `; +} +function j8(r, e) { + let t10 = r.shapeInfo.logicalShape, o = r.name, n = "get" + o.charAt(0).toUpperCase() + o.slice(1), s = t10[3], a = t10[2] * s, i = t10[1] * a, { newShape: p, keptDims: u } = x.squeezeShape(t10); + if (p.length < t10.length) { + let b = fc(r, p), C = ["row", "col", "depth", "depth2"]; + return ` + ${lc(b, e)} + float ${n}(int row, int col, int depth, int depth2) { + return ${n}(${dc(C, u)}); + } + `; + } + if (r.shapeInfo.isUniform) + return ` + float ${n}(int row, int col, int depth, int depth2) { + int index = round(dot(vec4(row, col, depth, depth2), + vec4(${i}, ${a}, ${s}, 1))); + ${mc(r)} + } + `; + let c = r.shapeInfo.flatOffset, l = r.shapeInfo.texShape, m = l[0], f = l[1], d = `int stride2 = ${o}Shape[3];`, h = `int stride1 = ${o}Shape[2] * stride2;`, g = `int stride0 = ${o}Shape[1] * stride1;`; + if (f === i && c == null) + return e ? ` + float ${n}(int row, int col, int depth, int depth2) { + ${d} + ${h} + float texR = float(row); + float texC = + dot(vec3(col, depth, depth2), + vec3(stride1, stride2, 1)); + vec2 uv = (vec2(texC, texR) + halfCR) / + vec2(${o}TexShape[1], ${o}TexShape[0]); + return sampleTexture(${o}, uv); + } + ` : ` + float ${n}(int row, int col, int depth, int depth2) { + float texR = float(row); + float texC = + dot(vec3(col, depth, depth2), + vec3(${a}, ${s}, 1)); + vec2 uv = (vec2(texC, texR) + halfCR) / + vec2(${f}.0, ${m}.0); + return sampleTexture(${o}, uv); + } + `; + if (f === s && c == null) + return e ? ` + float ${n}(int row, int col, int depth, int depth2) { + float texR = dot(vec3(row, col, depth), + vec3(${o}Shape[1] * ${o}Shape[2], ${o}Shape[2], 1)); + float texC = float(depth2); + vec2 uv = (vec2(texC, texR) + halfCR) / + vec2(${o}TexShape[1], ${o}TexShape[0]); + return sampleTexture(${o}, uv); + } + ` : ` + float ${n}(int row, int col, int depth, int depth2) { + float texR = dot(vec3(row, col, depth), + vec3(${t10[1] * t10[2]}, ${t10[2]}, 1)); + float texC = float(depth2); + vec2 uv = (vec2(texC, texR) + halfCR) / + vec2(${f}.0, ${m}.0); + return sampleTexture(${o}, uv); + } + `; + let y = Au(o); + return e ? ` + float ${n}(int row, int col, int depth, int depth2) { + // Explicitly use integer operations as dot() only works on floats. + ${d} + ${h} + ${g} + int index = row * stride0 + col * stride1 + + depth * stride2 + depth2; + vec2 uv = uvFromFlat(${o}TexShape[0], ${o}TexShape[1], index + ${y}); + return sampleTexture(${o}, uv); + } + ` : ` + float ${n}(int row, int col, int depth, int depth2) { + // Explicitly use integer operations as dot() only works on floats. + int index = row * ${i} + col * ${a} + + depth * ${s} + depth2; + vec2 uv = uvFromFlat(${m}, ${f}, index + ${y}); + return sampleTexture(${o}, uv); + } + `; +} +function X8(r) { + let e = r.shapeInfo.logicalShape, t10 = r.name, o = "get" + t10.charAt(0).toUpperCase() + t10.slice(1), n = e[4], s = e[3] * n, a = e[2] * s, i = e[1] * a, { newShape: p, keptDims: u } = x.squeezeShape(e); + if (p.length < e.length) { + let h = fc(r, p), g = ["row", "col", "depth", "depth2", "depth3"]; + return ` + ${lc(h)} + float ${o}(int row, int col, int depth, int depth2, int depth3) { + return ${o}(${dc(g, u)}); + } + `; + } + if (r.shapeInfo.isUniform) + return ` + float ${o}(int row, int col, int depth, int depth2, int depth3) { + float index = dot( + vec4(row, col, depth, depth2), + vec4(${i}, ${a}, ${s}, ${n})) + + depth3; + ${mc(r)} + } + `; + let c = r.shapeInfo.flatOffset, l = r.shapeInfo.texShape, m = l[0], f = l[1]; + if (f === i && c == null) + return ` + float ${o}(int row, int col, int depth, int depth2, int depth3) { + int texR = row; + float texC = dot(vec4(col, depth, depth2, depth3), + vec4(${a}, ${s}, ${n}, 1)); + vec2 uv = (vec2(texC, texR) + halfCR) / + vec2(${f}.0, ${m}.0); + return sampleTexture(${t10}, uv); + } + `; + if (f === n && c == null) + return ` + float ${o}(int row, int col, int depth, int depth2, int depth3) { + float texR = dot( + vec4(row, col, depth, depth2), + vec4(${e[1] * e[2] * e[3]}, + ${e[2] * e[3]}, ${e[3]}, 1)); + int texC = depth3; + vec2 uv = (vec2(texC, texR) + halfCR) / + vec2(${f}.0, ${m}.0); + return sampleTexture(${t10}, uv); + } + `; + let d = Au(t10); + return ` + float ${o}(int row, int col, int depth, int depth2, int depth3) { + // Explicitly use integer operations as dot() only works on floats. + int index = row * ${i} + col * ${a} + depth * ${s} + + depth2 * ${n} + depth3 + ${d}; + vec2 uv = uvFromFlat(${m}, ${f}, index); + return sampleTexture(${t10}, uv); + } + `; +} +function Y8(r) { + let e = r.shapeInfo.logicalShape, t10 = r.name, o = "get" + t10.charAt(0).toUpperCase() + t10.slice(1), { newShape: n, keptDims: s } = x.squeezeShape(e); + if (n.length < e.length) { + let g = fc(r, n), y = ["row", "col", "depth", "depth2", "depth3", "depth4"]; + return ` + ${lc(g)} + float ${o}(int row, int col, int depth, + int depth2, int depth3, int depth4) { + return ${o}(${dc(y, s)}); + } + `; + } + let a = e[5], i = e[4] * a, p = e[3] * i, u = e[2] * p, c = e[1] * u; + if (r.shapeInfo.isUniform) + return ` + float ${o}(int row, int col, int depth, + int depth2, int depth3, int depth4) { + int index = round(dot( + vec4(row, col, depth, depth2), + vec4(${c}, ${u}, ${p}, ${i})) + + dot( + vec2(depth3, depth4), + vec2(${a}, 1))); + ${mc(r)} + } + `; + let l = r.shapeInfo.flatOffset, m = r.shapeInfo.texShape, f = m[0], d = m[1]; + if (d === c && l == null) + return ` + float ${o}(int row, int col, int depth, + int depth2, int depth3, int depth4) { + int texR = row; + float texC = dot(vec4(col, depth, depth2, depth3), + vec4(${u}, ${p}, ${i}, ${a})) + + float(depth4); + vec2 uv = (vec2(texC, texR) + halfCR) / + vec2(${d}.0, ${f}.0); + return sampleTexture(${t10}, uv); + } + `; + if (d === a && l == null) + return ` + float ${o}(int row, int col, int depth, + int depth2, int depth3, int depth4) { + float texR = dot(vec4(row, col, depth, depth2), + vec4(${e[1] * e[2] * e[3] * e[4]}, + ${e[2] * e[3] * e[4]}, + ${e[3] * e[4]}, + ${e[4]})) + float(depth3); + int texC = depth4; + vec2 uv = (vec2(texC, texR) + halfCR) / + vec2(${d}.0, ${f}.0); + return sampleTexture(${t10}, uv); + } + `; + let h = Au(t10); + return ` + float ${o}(int row, int col, int depth, + int depth2, int depth3, int depth4) { + // Explicitly use integer operations as dot() only works on floats. + int index = row * ${c} + col * ${u} + depth * ${p} + + depth2 * ${i} + depth3 * ${a} + depth4 + ${h}; + vec2 uv = uvFromFlat(${f}, ${d}, index); + return sampleTexture(${t10}, uv); + } + `; +} +function mc(r) { + let e = r.name, t10 = x.sizeFromShape(r.shapeInfo.logicalShape); + return t10 < 2 ? `return ${e};` : ` + for (int i = 0; i < ${t10}; i++) { + if (i == index) { + return ${e}[i]; + } + } + `; +} +function Q8(r, e) { + let t10 = r.name, o = t10.charAt(0).toUpperCase() + t10.slice(1), n = "get" + o + "AtOutCoords", s = r.shapeInfo.logicalShape.length, a = e.logicalShape.length, i = QE(r.shapeInfo.logicalShape, e.logicalShape), p = _e(a), u = a - s, c, l = ["x", "y", "z", "w", "u", "v"]; + s === 0 ? c = "" : a < 2 && i.length >= 1 ? c = "coords = 0;" : c = i.map((b) => `coords.${l[b + u]} = 0;`).join(` +`); + let m = ""; + a < 2 && s > 0 ? m = "coords" : m = r.shapeInfo.logicalShape.map((b, C) => `coords.${l[C + u]}`).join(", "); + let f = "return outputValue;", h = x.sizeFromShape(r.shapeInfo.logicalShape) === 1, y = x.sizeFromShape(e.logicalShape) === 1; + if (s === 1 && !h && !y) + f = ` + return vec4(outputValue.xy, outputValue.xy); + `; + else if (h && !y) + a === 1 ? f = ` + return vec4(outputValue.x, outputValue.x, 0., 0.); + ` : f = ` + return vec4(outputValue.x); + `; + else if (i.length) { + let b = s - 2, C = s - 1; + i.indexOf(b) > -1 && i.indexOf(C) > -1 ? f = "return vec4(outputValue.x);" : i.indexOf(b) > -1 ? f = "return vec4(outputValue.x, outputValue.y, outputValue.x, outputValue.y);" : i.indexOf(C) > -1 && (f = "return vec4(outputValue.xx, outputValue.zz);"); + } + return ` + vec4 ${n}() { + ${p} coords = getOutputCoords(); + ${c} + vec4 outputValue = get${o}(${m}); + ${f} + } + `; +} +function Z8(r, e) { + let t10 = r.name, o = t10.charAt(0).toUpperCase() + t10.slice(1), n = "get" + o + "AtOutCoords", s = e.texShape, a = r.shapeInfo.texShape, i = r.shapeInfo.logicalShape.length, p = e.logicalShape.length; + if (!r.shapeInfo.isUniform && i === p && r.shapeInfo.flatOffset == null && x.arraysEqual(a, s)) + return ` + float ${n}() { + return sampleTexture(${t10}, resultUV); + } + `; + let u = _e(p), c = QE(r.shapeInfo.logicalShape, e.logicalShape), l = p - i, m, f = ["x", "y", "z", "w", "u", "v"]; + i === 0 ? m = "" : p < 2 && c.length >= 1 ? m = "coords = 0;" : m = c.map((h) => `coords.${f[h + l]} = 0;`).join(` +`); + let d = ""; + return p < 2 && i > 0 ? d = "coords" : d = r.shapeInfo.logicalShape.map((h, g) => `coords.${f[g + l]}`).join(", "), ` + float ${n}() { + ${u} coords = getOutputCoords(); + ${m} + return get${o}(${d}); + } + `; +} +function _e(r) { + if (r <= 1) + return "int"; + if (r === 2) + return "ivec2"; + if (r === 3) + return "ivec3"; + if (r === 4) + return "ivec4"; + if (r === 5) + return "ivec5"; + if (r === 6) + return "ivec6"; + throw Error(`GPU for rank ${r} is not yet supported`); +} +function qd(r, e, t10) { + let { newShape: o, keptDims: n } = x.squeezeShape(e), s = e.length, a = r && s === 3 && e[0] === 1, i = a ? e.slice(1) : o, p = !r && s > 1 && !x.arraysEqual(e, t10) && o.length < s || a; + return { useSqueezeShape: p, uniformShape: p ? i : e, keptDims: n }; +} +function fc(r, e) { + let t10 = JSON.parse(JSON.stringify(r)); + return t10.shapeInfo.logicalShape = e, t10; +} +function dc(r, e) { + return e.map((t10) => r[t10]).join(", "); +} +function r$(r, e, t10, o) { + let n = t10.map((c, l) => { + let m = { logicalShape: c.shape, texShape: c.isUniform ? null : c.texData.texShape, isUniform: c.isUniform, isPacked: c.isUniform ? false : c.texData.isPacked, flatOffset: null }; + return c.texData != null && c.texData.slice != null && c.texData.slice.flatOffset > 0 && (m.flatOffset = c.texData.slice.flatOffset), { name: e.variableNames[l], shapeInfo: m }; + }), s = n.map((c) => c.shapeInfo), a = { logicalShape: o.shape, texShape: o.texData.texShape, isUniform: false, isPacked: o.texData.isPacked, flatOffset: null }, i = ZE(n, a, e), p = WI(r.gl, i), u = r.createProgram(p); + return P().get("ENGINE_COMPILE_ONLY") ? { program: e, fragmentShader: p, source: i, webGLProgram: u, inShapeInfos: s, outShapeInfo: a, uniformLocations: null, customUniformLocations: null, infLoc: null, nanLoc: null, inShapesLocations: null, inTexShapesLocations: null, outShapeLocation: null, outShapeStridesLocation: null, outTexShapeLocation: null } : Object.assign({ program: e, fragmentShader: p, source: i, webGLProgram: u, inShapeInfos: s, outShapeInfo: a }, aw(r, e, u)); +} +function aw(r, e, t10) { + let o = {}, n = {}, s = {}, a = [], i, p, u, c = null, l = null; + l = r.getUniformLocation(t10, "NAN", false), P().getNumber("WEBGL_VERSION") === 1 && (c = r.getUniformLocation(t10, "INFINITY", false)); + let m = false; + for (let f = 0; f < e.variableNames.length; f++) { + let d = e.variableNames[f]; + o[d] = r.getUniformLocation(t10, d, m), o[`offset${d}`] = r.getUniformLocation(t10, `offset${d}`, m), e.enableShapeUniforms && (n[`${d}Shape`] = r.getUniformLocation(t10, `${d}Shape`, m), s[`${d}TexShape`] = r.getUniformLocation(t10, `${d}TexShape`, m)); + } + return e.enableShapeUniforms && (i = r.getUniformLocation(t10, "outShape", m), u = r.getUniformLocation(t10, "outShapeStrides", m), p = r.getUniformLocation(t10, "outTexShape", m)), e.customUniforms && e.customUniforms.forEach((f, d) => { + a[d] = r.getUniformLocation(t10, f.name, m); + }), { uniformLocations: o, customUniformLocations: a, infLoc: c, nanLoc: l, inShapesLocations: n, inTexShapesLocations: s, outShapeLocation: i, outShapeStridesLocation: u, outTexShapeLocation: p }; +} +function t$(r, e) { + if (r.length !== e.length) + throw Error(`Binary was compiled with ${r.length} inputs, but was executed with ${e.length} inputs`); + r.forEach((t10, o) => { + let n = t10.logicalShape, s = e[o], a = s.shape; + if (!x.arraysEqual(n, a)) + throw Error(`Binary was compiled with different shapes than the current args. Shapes ${n} and ${a} must match`); + if (t10.isUniform && s.isUniform) + return; + let i = t10.texShape, p = s.isUniform ? null : s.texData.texShape; + if (!x.arraysEqual(i, p)) + throw Error(`Binary was compiled with different texture shapes than the current args. Shape ${i} and ${p} must match`); + }); +} +function o$(r, e, t10, o, n) { + e.program.enableShapeUniforms || (t$(e.inShapeInfos, t10), t$([e.outShapeInfo], [o])); + let s = o.texData.texture, a = o.texData.texShape; + o.texData.isPacked ? r.setOutputPackedMatrixTexture(s.texture, a[0], a[1]) : r.setOutputMatrixTexture(s.texture, a[0], a[1]), r.setProgram(e.webGLProgram), P().getNumber("WEBGL_VERSION") === 1 && e.infLoc !== null && r.gl.uniform1f(e.infLoc, 1 / 0), e.nanLoc !== null && r.gl.uniform1f(e.nanLoc, NaN), t10.forEach((p, u) => { + let c = e.program.variableNames[u], l = e.uniformLocations[c], m = e.uniformLocations[`offset${c}`], f = e.inShapesLocations[`${c}Shape`], d = e.inTexShapesLocations[`${c}TexShape`]; + if (f) { + let { uniformShape: h } = qd(e.program.packedInputs, p.shape, p.texData.texShape); + switch (h.length) { + case 1: + r.gl.uniform1iv(f, new Int32Array(h)); + break; + case 2: + r.gl.uniform2iv(f, new Int32Array(h)); + break; + case 3: + r.gl.uniform3iv(f, new Int32Array(h)); + break; + case 4: + r.gl.uniform4iv(f, new Int32Array(h)); + break; + default: + break; + } + } + if (d && r.gl.uniform2i(d, p.texData.texShape[0], p.texData.texShape[1]), l != null) { + if (p.isUniform) { + if (x.sizeFromShape(p.shape) < 2) + r.gl.uniform1f(l, p.uniformValues[0]); + else { + let h = p.uniformValues; + h instanceof Float32Array || (h = new Float32Array(h)), r.gl.uniform1fv(l, h); + } + return; + } + p.texData.slice != null && m != null && r.gl.uniform1i(m, p.texData.slice.flatOffset), r.setInputMatrixTexture(p.texData.texture.texture, l, u); + } + }); + let i = e.outShapeLocation; + if (i) + switch (o.shape.length) { + case 1: + r.gl.uniform1iv(i, new Int32Array(o.shape)); + break; + case 2: + r.gl.uniform2iv(i, new Int32Array(o.shape)); + break; + case 3: + r.gl.uniform3iv(i, new Int32Array(o.shape)); + break; + case 4: + r.gl.uniform4iv(i, new Int32Array(o.shape)); + break; + default: + break; + } + if (e.outShapeStridesLocation) { + let p = x.computeStrides(o.shape); + switch (o.shape.length) { + case 2: + r.gl.uniform1iv(e.outShapeStridesLocation, new Int32Array(p)); + break; + case 3: + r.gl.uniform2iv(e.outShapeStridesLocation, new Int32Array(p)); + break; + case 4: + r.gl.uniform3iv(e.outShapeStridesLocation, new Int32Array(p)); + break; + default: + break; + } + } + e.outTexShapeLocation && r.gl.uniform2i(e.outTexShapeLocation, o.texData.texShape[0], o.texData.texShape[1]), e.program.customUniforms && n && e.program.customUniforms.forEach((p, u) => { + let c = e.customUniformLocations[u], l = n[u]; + if (p.type === "float") + r.gl.uniform1fv(c, l); + else if (p.type === "vec2") + r.gl.uniform2fv(c, l); + else if (p.type === "vec3") + r.gl.uniform3fv(c, l); + else if (p.type === "vec4") + r.gl.uniform4fv(c, l); + else if (p.type === "int") + r.gl.uniform1iv(c, l); + else if (p.type === "ivec2") + r.gl.uniform2iv(c, l); + else if (p.type === "ivec3") + r.gl.uniform3iv(c, l); + else if (p.type === "ivec4") + r.gl.uniform4iv(c, l); + else + throw Error(`uniform type ${p.type} is not supported yet.`); + }), r.executeProgram(); +} +function n$(r, e, t10) { + let o = ""; + e.concat(t10).forEach((a) => { + let i = a.texData != null && a.texData.slice != null && a.texData.slice.flatOffset > 0; + if (r.enableShapeUniforms && !a.isUniform) { + let p = a.texData.texShape, { useSqueezeShape: u, uniformShape: c, keptDims: l } = qd(r.packedInputs, a.shape, p), m = "", f = "", d = ""; + if (c.length === 1 && r.packedInputs) { + let k = [Math.ceil(p[0] / 2), Math.ceil(p[1] / 2)]; + m = `${k[0] > 1}_${k[1] > 1}`; + } else if (c.length === 2 && !r.packedInputs) + f = `${c[0] > 1}_${c[1] > 1}`; + else if (c.length > 2 && !r.packedInputs) { + let k = x.computeStrides(c); + d = `${k[0] === p[1]}_${k[k.length - 1] === p[1]}`; + } + let h = a.shape.length, g = c.length === 2 && x.arraysEqual(a.shape, p), y = x.sizeFromShape(a.shape) === 1, b = I.getBroadcastDims(a.shape, t10.shape), C = !r.packedInputs && h === t10.shape.length && x.arraysEqual(p, t10.texData.texShape), w = r.packedInputs || c.length > 2 ? "" : `${p[0] > 1}_${p[1] > 1}`; + o += `${h}_${C}_${u ? l : ""}_${c.length}_${y}_${b}_${g}_${m}_${f}_${d}_${w}_${i}`; + } else { + let p = a.isUniform ? "uniform" : a.texData.texShape; + o += `${a.shape}_${p}_${i}`; + } + }); + let n = r.userCode, s = r.constructor.name; + return s += "_" + o + "_" + n + `${P().getNumber("WEBGL_VERSION")}`, s; +} +function lt(r) { + return P().getBool("WEBGL_USE_SHAPES_UNIFORMS") && r <= 4; +} +var Kd = class { + constructor(e) { + this.variableNames = ["A"], this.packedInputs = false, this.packedOutput = true, this.outPackingScheme = ki.DENSE, this.customUniforms = [{ name: "texShape", type: "ivec2" }]; + let t10 = Ct(); + this.outputShape = e, this.enableShapeUniforms = lt(this.outputShape.length), this.userCode = ` + ivec3 outCoordsFromFlatIndex(int index) { + ${this.enableShapeUniforms ? Ru(["r", "c", "d"], e) : is(["r", "c", "d"], e)} + return ivec3(r, c, d); + } + + void main() { + ivec2 resTexRC = ivec2(resultUV.yx * vec2(texShape[0], texShape[1])); + int index = 4 * (resTexRC.x * texShape[1] + resTexRC.y); + + vec4 result = vec4(0.); + + for (int i=0; i<4; i++) { + int flatIndex = index + i; + ivec3 rc = outCoordsFromFlatIndex(flatIndex); + result[i] = getA(rc.x, rc.y, rc.z); + } + + ${t10.output} = result; + } + `; + } +}; +var jd = class { + constructor(e) { + this.variableNames = ["A"], this.packedInputs = true, this.packedOutput = true, this.outPackingScheme = ki.DENSE, this.customUniforms = [{ name: "texShape", type: "ivec2" }]; + let t10 = Ct(); + this.outputShape = e, this.enableShapeUniforms = lt(this.outputShape.length), this.userCode = ` + ivec3 outCoordsFromFlatIndex(int index) { + ${this.enableShapeUniforms ? Ru(["r", "c", "d"], e) : is(["r", "c", "d"], e)} + return ivec3(r, c, d); + } + + void main() { + ivec2 resTexRC = ivec2(resultUV.yx * vec2(texShape[0], texShape[1])); + int index = 4 * (resTexRC.x * texShape[1] + resTexRC.y); + + vec4 result = vec4(0.); + + for (int i=0; i<4; i++) { + int flatIndex = index + i; + ivec3 rc = outCoordsFromFlatIndex(flatIndex); + result[i] = getChannel(getA(rc.x, rc.y, rc.z), vec2(rc.y, rc.z)); + } + + ${t10.output} = result; + } + `; + } +}; +var Xd = class { + constructor(e) { + this.variableNames = ["A"], this.outTexUsage = ir.DOWNLOAD; + let t10 = Ct(); + this.outputShape = e, this.userCode = ` + ${Hd} + + void main() { + float x = getAAtOutCoords(); + ${t10.output} = encode_float(x); + } + `; + } +}; +var Yd = class { + constructor(e) { + this.variableNames = ["A"], this.packedInputs = true, this.packedOutput = false, this.outTexUsage = ir.DOWNLOAD; + let t10 = Ct(); + this.outputShape = e, this.userCode = ` + ${Hd} + + void main() { + ivec3 coords = getOutputCoords(); + float x = getChannel(getAAtOutCoords(), vec2(coords.y, coords.z)); + ${t10.output} = encode_float(x); + } + `; + } +}; +var tY = { R: 0, G: 1, B: 2, A: 3 }; +var Al = class { + constructor(e, t10 = false, o = "RGBA") { + this.variableNames = ["A"], this.customUniforms = [{ name: "texShape", type: "ivec2" }]; + let n = Ct(); + this.outputShape = e, this.enableShapeUniforms = lt(this.outputShape.length); + let s = "result"; + t10 && (s = "floor(result * 255. + 0.5)"); + let a = ""; + for (let i = 0; i < o.length; i++) { + let p = o[i]; + a += ` + if(offset == ${i}) { + result = values[${tY[p]}]; + }`; + } + this.userCode = ` + ${this.enableShapeUniforms ? pc() : uc(e)} + + void main() { + ivec3 coords = getOutputCoords(); + int flatIndex = getFlatIndex(coords); + float result = 0.; + int offset = imod(flatIndex, ${o.length}); + + flatIndex = idiv(flatIndex, ${o.length}, 1.); + + int r = flatIndex / texShape[1]; + if (r < texShape[0]) { + int c = imod(flatIndex, texShape[1]); + vec2 uv = (vec2(c, r) + halfCR) / vec2(texShape[1], texShape[0]); + vec4 values = ${n.texture2D}(A, uv); + ${a} + } + ${n.output} = vec4(${s}, 0., 0., 0.); + } + `; + } +}; +var Qd = class { + constructor(e, t10 = false) { + this.variableNames = ["A"], this.packedInputs = false, this.packedOutput = true, this.customUniforms = [{ name: "texShape", type: "ivec2" }]; + let o = Ct(); + this.outputShape = e, this.enableShapeUniforms = lt(this.outputShape.length); + let n = "", s = "result"; + t10 && (s = "floor(result * 255. + 0.5)"); + for (let a = 0; a <= 1; a++) + for (let i = 0; i <= 1; i++) { + let p = a * 2 + i; + n += ` + localCoords = coords; + if(localCoords[2] + ${i} < ${this.enableShapeUniforms ? "outShape[2]" : `${e[2]}`}) { + localCoords[2] += ${i}; + if (localCoords[1] + ${a} < ${this.enableShapeUniforms ? "outShape[1]" : `${e[1]}`}) { + localCoords[1] += ${a}; + + flatIndex = getFlatIndex(localCoords); + offset = imod(flatIndex, 4); + + flatIndex = idiv(flatIndex, 4, 1.); + + int r = flatIndex / texShape[1]; + int c = imod(flatIndex, texShape[1]); + vec2 uv = (vec2(c, r) + halfCR) / vec2(texShape[1], texShape[0]); + values = ${o.texture2D}(A, uv); + + if (offset == 0) { + result[${p}] = values[0]; + } else if (offset == 1) { + result[${p}] = values[1]; + } else if (offset == 2) { + result[${p}] = values[2]; + } else { + result[${p}] = values[3]; + } + } + } + `; + } + this.userCode = ` + ${this.enableShapeUniforms ? pc() : uc(e)} + + void main() { + ivec3 coords = getOutputCoords(); + + vec4 result = vec4(0.); + int flatIndex, r, c, offset; + ivec3 localCoords; + vec2 uv; + vec4 values; + + ${n} + + ${o.output} = ${s}; + } + `; + } +}; +var Sw = {}; +Be(Sw, { bindVertexProgramAttributeStreams: () => hw, createBufferFromOutputTexture: () => yw, createFloat16MatrixTexture: () => lw, createFloat16PackedMatrixTexture: () => dw, createFloat32MatrixTexture: () => cw, createIndexBuffer: () => pw, createPackedMatrixTexture: () => fw, createUnsignedBytesMatrixTexture: () => mw, createVertexBuffer: () => uw, createVertexShader: () => iw, downloadByteEncodedFloatMatrixFromOutputTexture: () => Cw, downloadFloat32MatrixFromBuffer: () => bw, downloadMatrixFromPackedOutputTexture: () => ww, downloadPackedMatrixFromBuffer: () => Iw, getInternalFormatForFloat16MatrixTexture: () => Jd, getInternalFormatForFloat16PackedMatrixTexture: () => rh, getInternalFormatForFloat32MatrixTexture: () => Zd, getInternalFormatForPackedMatrixTexture: () => th, getInternalFormatForUnsignedBytesMatrixTexture: () => eh, uploadDenseMatrixToTexture: () => gw, uploadPixelDataToTexture: () => xw }); +function iw(r) { + let e = Ct(), t10 = `${e.version} + precision highp float; + ${e.attribute} vec3 clipSpacePos; + ${e.attribute} vec2 uv; + ${e.varyingVs} vec2 resultUV; + + void main() { + gl_Position = vec4(clipSpacePos, 1); + resultUV = uv; + }`; + return zI(r, t10); +} +function uw(r) { + let e = new Float32Array([-1, 1, 0, 0, 1, -1, -1, 0, 0, 0, 1, 1, 0, 1, 1, 1, -1, 0, 1, 0]); + return HI(r, e); +} +function pw(r) { + let e = new Uint16Array([0, 1, 2, 2, 1, 3]); + return qI(r, e); +} +function Fl(r, e, t10, o, n, s) { + jI(e, t10); + let a = KI(r), i = r.TEXTURE_2D; + return me(r, () => r.bindTexture(i, a)), me(r, () => r.texParameteri(i, r.TEXTURE_WRAP_S, r.CLAMP_TO_EDGE)), me(r, () => r.texParameteri(i, r.TEXTURE_WRAP_T, r.CLAMP_TO_EDGE)), me(r, () => r.texParameteri(i, r.TEXTURE_MIN_FILTER, r.NEAREST)), me(r, () => r.texParameteri(i, r.TEXTURE_MAG_FILTER, r.NEAREST)), P().getNumber("WEBGL_VERSION") === 1 ? me(r, () => r.texImage2D(i, 0, o, e, t10, 0, n, s, null)) : me(r, () => r.texStorage2D(i, 1, o, e, t10)), me(r, () => r.bindTexture(r.TEXTURE_2D, null)), { texture: a, texShape: [t10, e] }; +} +function Zd(r) { + return r.internalFormatFloat; +} +function cw(r, e, t10, o) { + let [n, s] = $u(e, t10); + return Fl(r, n, s, Zd(o), o.textureFormatFloat, r.FLOAT); +} +function Jd(r) { + return r.internalFormatHalfFloat; +} +function lw(r, e, t10, o) { + let [n, s] = $u(e, t10); + return Fl(r, n, s, Jd(o), o.textureFormatFloat, o.textureTypeHalfFloat); +} +function eh(r) { + return r.downloadTextureFormat; +} +function mw(r, e, t10, o) { + let [n, s] = $u(e, t10); + return Fl(r, n, s, eh(o), r.RGBA, r.UNSIGNED_BYTE); +} +function th(r) { + return r.internalFormatPackedFloat; +} +function fw(r, e, t10, o) { + let [n, s] = Ks(e, t10); + return Fl(r, n, s, th(o), r.RGBA, r.FLOAT); +} +function rh(r) { + return r.internalFormatPackedHalfFloat; +} +function dw(r, e, t10, o) { + let [n, s] = Ks(e, t10); + return Fl(r, n, s, rh(o), r.RGBA, o.textureTypeHalfFloat); +} +function hw(r, e, t10) { + return me(r, () => r.bindBuffer(r.ARRAY_BUFFER, t10)), Wd(r, e, "clipSpacePos", t10, 3, 20, 0) && Wd(r, e, "uv", t10, 2, 20, 12); +} +function gw(r, e, t10, o, n, s) { + me(r, () => r.bindTexture(r.TEXTURE_2D, e)); + let a, i, p; + n instanceof Uint8Array ? (a = new Uint8Array(t10 * o * 4), i = r.UNSIGNED_BYTE, p = r.RGBA) : (a = new Float32Array(t10 * o * 4), i = r.FLOAT, p = s.internalFormatPackedFloat), a.set(n), P().getNumber("WEBGL_VERSION") === 2 ? me(r, () => r.texSubImage2D(r.TEXTURE_2D, 0, 0, 0, t10, o, r.RGBA, i, a)) : me(r, () => r.texImage2D(r.TEXTURE_2D, 0, p, t10, o, 0, r.RGBA, i, a)), me(r, () => r.bindTexture(r.TEXTURE_2D, null)); +} +function xw(r, e, t10) { + me(r, () => r.bindTexture(r.TEXTURE_2D, e)), t10.data instanceof Uint8Array ? P().getNumber("WEBGL_VERSION") === 2 ? me(r, () => r.texSubImage2D(r.TEXTURE_2D, 0, 0, 0, t10.width, t10.height, r.RGBA, r.UNSIGNED_BYTE, t10.data)) : me(r, () => r.texImage2D(r.TEXTURE_2D, 0, r.RGBA, t10.width, t10.height, 0, r.RGBA, r.UNSIGNED_BYTE, t10.data)) : P().getNumber("WEBGL_VERSION") === 2 ? me(r, () => r.texSubImage2D(r.TEXTURE_2D, 0, 0, 0, r.RGBA, r.UNSIGNED_BYTE, t10)) : me(r, () => r.texImage2D(r.TEXTURE_2D, 0, r.RGBA, r.RGBA, r.UNSIGNED_BYTE, t10)), me(r, () => r.bindTexture(r.TEXTURE_2D, null)); +} +function yw(r, e, t10, o) { + let n = r.createBuffer(); + me(r, () => r.bindBuffer(r.PIXEL_PACK_BUFFER, n)); + let i = 4 * 4 * e * t10; + return me(r, () => r.bufferData(r.PIXEL_PACK_BUFFER, i, r.STREAM_READ)), me(r, () => r.readPixels(0, 0, t10, e, r.RGBA, r.FLOAT, 0)), me(r, () => r.bindBuffer(r.PIXEL_PACK_BUFFER, null)), n; +} +function bw(r, e, t10) { + let o = r, n = new Float32Array(t10); + return o.bindBuffer(o.PIXEL_PACK_BUFFER, e), o.getBufferSubData(o.PIXEL_PACK_BUFFER, 0, n), o.bindBuffer(o.PIXEL_PACK_BUFFER, null), n; +} +function Cw(r, e, t10, o) { + let [n, s] = $u(e, t10), a = 4, i = new Uint8Array(GE(e * t10, a)); + return me(r, () => r.readPixels(0, 0, n, s, o.downloadTextureFormat, r.UNSIGNED_BYTE, i)), new Float32Array(i.buffer); +} +function Iw(r, e, t10, o, n, s, a, i) { + let p = r, u = new Float32Array(HE(s, a)); + return p.bindBuffer(p.PIXEL_PACK_BUFFER, e), p.getBufferSubData(p.PIXEL_PACK_BUFFER, 0, u), p.bindBuffer(p.PIXEL_PACK_BUFFER, null), u; +} +function ww(r, e, t10) { + let o = new Float32Array(e * t10 * 4); + return me(r, () => r.readPixels(0, 0, t10, e, r.RGBA, r.FLOAT, o)), o; +} +var Fu = class { + constructor(e) { + this.outputTexture = null, this.program = null, this.disposed = false, this.vertexAttrsAreBound = false, this.itemsToPoll = []; + let t10 = P().getNumber("WEBGL_VERSION"); + e != null ? (this.gl = e, MI(t10, e)) : this.gl = Gr(t10); + let o = "WEBGL_color_buffer_float", n = "EXT_color_buffer_half_float"; + if (this.parallelCompilationExtension = this.gl.getExtension("KHR_parallel_shader_compile"), P().getNumber("WEBGL_VERSION") === 1) { + let s = "OES_texture_float", a = "OES_texture_half_float"; + if (this.textureFloatExtension = nc(this.gl, s), Hr(this.gl, a)) + this.textureHalfFloatExtension = nc(this.gl, a); + else if (P().get("WEBGL_FORCE_F16_TEXTURES")) + throw new Error("GL context does not support half float textures, yet the environment flag WEBGL_FORCE_F16_TEXTURES is set to true."); + if (this.colorBufferFloatExtension = this.gl.getExtension(o), Hr(this.gl, n)) + this.colorBufferHalfFloatExtension = nc(this.gl, n); + else if (P().get("WEBGL_FORCE_F16_TEXTURES")) + throw new Error("GL context does not support color renderable half floats, yet the environment flag WEBGL_FORCE_F16_TEXTURES is set to true."); + } else if (o = "EXT_color_buffer_float", Hr(this.gl, o)) + this.colorBufferFloatExtension = this.gl.getExtension(o); + else if (Hr(this.gl, n)) + this.colorBufferHalfFloatExtension = this.gl.getExtension(n); + else + throw new Error("GL context does not support color renderable floats"); + this.vertexBuffer = uw(this.gl), this.indexBuffer = pw(this.gl), this.framebuffer = XI(this.gl), this.textureConfig = El(this.gl, this.textureHalfFloatExtension); + } + get debug() { + return P().getBool("DEBUG"); + } + dispose() { + if (this.disposed) + return; + this.program != null && console.warn("Disposing a GPGPUContext that still has a bound WebGLProgram. This is probably a resource leak, delete the program with GPGPUContext.deleteProgram before disposing."), this.outputTexture != null && console.warn("Disposing a GPGPUContext that still has a bound output matrix texture. This is probably a resource leak, delete the output matrix texture with GPGPUContext.deleteMatrixTexture before disposing."); + let e = this.gl; + me(e, () => e.finish()), me(e, () => e.bindFramebuffer(e.FRAMEBUFFER, null)), me(e, () => e.deleteFramebuffer(this.framebuffer)), me(e, () => e.bindBuffer(e.ARRAY_BUFFER, null)), me(e, () => e.bindBuffer(e.ELEMENT_ARRAY_BUFFER, null)), me(e, () => e.deleteBuffer(this.indexBuffer)), this.disposed = true; + } + createFloat32MatrixTexture(e, t10) { + return this.throwIfDisposed(), cw(this.gl, e, t10, this.textureConfig); + } + createFloat16MatrixTexture(e, t10) { + return this.throwIfDisposed(), lw(this.gl, e, t10, this.textureConfig); + } + createUnsignedBytesMatrixTexture(e, t10) { + return this.throwIfDisposed(), mw(this.gl, e, t10, this.textureConfig); + } + uploadPixelDataToTexture(e, t10) { + this.throwIfDisposed(), xw(this.gl, e, t10); + } + uploadDenseMatrixToTexture(e, t10, o, n) { + this.throwIfDisposed(), gw(this.gl, e, t10, o, n, this.textureConfig); + } + createFloat16PackedMatrixTexture(e, t10) { + return this.throwIfDisposed(), dw(this.gl, e, t10, this.textureConfig); + } + createPackedMatrixTexture(e, t10) { + return this.throwIfDisposed(), fw(this.gl, e, t10, this.textureConfig); + } + deleteMatrixTexture(e) { + this.throwIfDisposed(), this.outputTexture === e && (Ud(this.gl, this.framebuffer), this.outputTexture = null), me(this.gl, () => this.gl.deleteTexture(e)); + } + downloadByteEncodedFloatMatrixFromOutputTexture(e, t10, o) { + return this.downloadMatrixDriver(e, () => Cw(this.gl, t10, o, this.textureConfig)); + } + downloadPackedMatrixFromBuffer(e, t10, o, n, s, a) { + return Iw(this.gl, e, t10, o, n, s, a, this.textureConfig); + } + downloadFloat32MatrixFromBuffer(e, t10) { + return bw(this.gl, e, t10); + } + createBufferFromTexture(e, t10, o) { + this.bindTextureToFrameBuffer(e); + let n = yw(this.gl, t10, o, this.textureConfig); + return this.unbindTextureToFrameBuffer(), n; + } + createAndWaitForFence() { + let e = this.createFence(this.gl); + return this.pollFence(e); + } + createFence(e) { + let t10, o; + if (P().getBool("WEBGL_FENCE_API_ENABLED")) { + let n = e, s = n.fenceSync(n.SYNC_GPU_COMMANDS_COMPLETE, 0); + e.flush(), o = () => { + let a = n.clientWaitSync(s, 0, 0); + return a === n.ALREADY_SIGNALED || a === n.CONDITION_SATISFIED; + }, t10 = s; + } else + P().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION") > 0 ? (t10 = this.beginQuery(), this.endQuery(), o = () => this.isQueryAvailable(t10, P().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION"))) : o = () => true; + return { query: t10, isFencePassed: o }; + } + downloadMatrixFromPackedTexture(e, t10, o) { + return this.downloadMatrixDriver(e, () => ww(this.gl, t10, o)); + } + createProgram(e) { + this.throwIfDisposed(); + let t10 = this.gl; + this.vertexShader == null && (this.vertexShader = iw(t10)); + let o = UI(t10); + return me(t10, () => t10.attachShader(o, this.vertexShader)), me(t10, () => t10.attachShader(o, e)), GI(t10, o), this.debug && $l(t10, o), this.vertexAttrsAreBound || (this.setProgram(o), this.vertexAttrsAreBound = hw(t10, this.program, this.vertexBuffer)), o; + } + deleteProgram(e) { + this.throwIfDisposed(), e === this.program && (this.program = null), e != null && me(this.gl, () => this.gl.deleteProgram(e)); + } + setProgram(e) { + this.throwIfDisposed(), this.program = e, this.program != null && this.debug && $l(this.gl, this.program), me(this.gl, () => this.gl.useProgram(e)); + } + getUniformLocation(e, t10, o = true) { + return this.throwIfDisposed(), o ? YI(this.gl, e, t10) : QI(this.gl, e, t10); + } + getAttributeLocation(e, t10) { + return this.throwIfDisposed(), me(this.gl, () => this.gl.getAttribLocation(e, t10)); + } + getUniformLocationNoThrow(e, t10) { + return this.throwIfDisposed(), this.gl.getUniformLocation(e, t10); + } + setInputMatrixTexture(e, t10, o) { + this.throwIfDisposed(), this.throwIfNoProgram(), ZI(this.gl, e, t10, o); + } + setOutputMatrixTexture(e, t10, o) { + this.setOutputMatrixTextureDriver(e, o, t10); + } + setOutputPackedMatrixTexture(e, t10, o) { + this.throwIfDisposed(); + let [n, s] = Ks(t10, o); + this.setOutputMatrixTextureDriver(e, n, s); + } + setOutputMatrixWriteRegion(e, t10, o, n) { + this.setOutputMatrixWriteRegionDriver(o, e, n, t10); + } + setOutputPackedMatrixWriteRegion(e, t10, o, n) { + throw new Error("setOutputPackedMatrixWriteRegion not implemented."); + } + debugValidate() { + this.program != null && $l(this.gl, this.program), sc(this.gl); + } + executeProgram() { + this.throwIfDisposed(), this.throwIfNoProgram(); + let e = this.gl; + this.debug && this.debugValidate(), me(e, () => e.drawElements(e.TRIANGLES, 6, e.UNSIGNED_SHORT, 0)); + } + blockUntilAllProgramsCompleted() { + this.throwIfDisposed(), me(this.gl, () => this.gl.finish()); + } + getQueryTimerExtension() { + return this.disjointQueryTimerExtension == null && (this.disjointQueryTimerExtension = nc(this.gl, P().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION") === 2 ? "EXT_disjoint_timer_query_webgl2" : "EXT_disjoint_timer_query")), this.disjointQueryTimerExtension; + } + getQueryTimerExtensionWebGL2() { + return this.getQueryTimerExtension(); + } + getQueryTimerExtensionWebGL1() { + return this.getQueryTimerExtension(); + } + beginQuery() { + if (P().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION") === 2) { + let o = this.gl, n = this.getQueryTimerExtensionWebGL2(), s = o.createQuery(); + return o.beginQuery(n.TIME_ELAPSED_EXT, s), s; + } + let e = this.getQueryTimerExtensionWebGL1(), t10 = e.createQueryEXT(); + return e.beginQueryEXT(e.TIME_ELAPSED_EXT, t10), t10; + } + endQuery() { + if (P().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION") === 2) { + let t10 = this.gl, o = this.getQueryTimerExtensionWebGL2(); + t10.endQuery(o.TIME_ELAPSED_EXT); + return; + } + let e = this.getQueryTimerExtensionWebGL1(); + e.endQueryEXT(e.TIME_ELAPSED_EXT); + } + async waitForQueryAndGetTime(e) { + return await x.repeatedTry(() => this.disposed || this.isQueryAvailable(e, P().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION"))), this.getQueryTime(e, P().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")); + } + getQueryTime(e, t10) { + if (t10 === 0) + return null; + if (t10 === 2) { + let o = this.gl; + return o.getQueryParameter(e, o.QUERY_RESULT) / 1e6; + } else { + let o = this.getQueryTimerExtensionWebGL1(); + return o.getQueryObjectEXT(e, o.QUERY_RESULT_EXT) / 1e6; + } + } + isQueryAvailable(e, t10) { + if (t10 === 0) + return true; + if (t10 === 2) { + let o = this.gl, n = this.getQueryTimerExtensionWebGL2(), s = o.getQueryParameter(e, o.QUERY_RESULT_AVAILABLE); + return this.disjoint == null && (this.disjoint = this.gl.getParameter(n.GPU_DISJOINT_EXT)), s && !this.disjoint; + } else { + let o = this.getQueryTimerExtensionWebGL1(), n = o.getQueryObjectEXT(e, o.QUERY_RESULT_AVAILABLE_EXT); + return this.disjoint == null && (this.disjoint = this.gl.getParameter(o.GPU_DISJOINT_EXT)), n && !this.disjoint; + } + } + pollFence(e) { + return new Promise((t10) => { + this.addItemToPoll(() => e.isFencePassed(), () => t10()); + }); + } + pollItems() { + let e = rY(this.itemsToPoll.map((t10) => t10.isDoneFn)); + for (let t10 = 0; t10 <= e; ++t10) { + let { resolveFn: o } = this.itemsToPoll[t10]; + o(); + } + this.itemsToPoll = this.itemsToPoll.slice(e + 1); + } + addItemToPoll(e, t10) { + if (this.itemsToPoll.push({ isDoneFn: e, resolveFn: t10 }), this.itemsToPoll.length > 1) + return; + let o; + "setTimeoutCustom" in P().platform && (o = P().platform.setTimeoutCustom.bind(P().platform)), x.repeatedTry(() => (this.pollItems(), this.itemsToPoll.length === 0), () => 0, null, o); + } + bindTextureToFrameBuffer(e) { + this.throwIfDisposed(), Rl(this.gl, e, this.framebuffer), this.debug && sc(this.gl); + } + unbindTextureToFrameBuffer() { + this.outputTexture != null ? (Rl(this.gl, this.outputTexture, this.framebuffer), this.debug && sc(this.gl)) : Ud(this.gl, this.framebuffer); + } + downloadMatrixDriver(e, t10) { + this.bindTextureToFrameBuffer(e); + let o = t10(); + return this.unbindTextureToFrameBuffer(), o; + } + setOutputMatrixTextureDriver(e, t10, o) { + this.throwIfDisposed(); + let n = this.gl; + Rl(n, e, this.framebuffer), this.debug && sc(n), this.outputTexture = e, me(n, () => n.viewport(0, 0, t10, o)), me(n, () => n.scissor(0, 0, t10, o)); + } + setOutputMatrixWriteRegionDriver(e, t10, o, n) { + this.throwIfDisposed(), me(this.gl, () => this.gl.scissor(e, t10, o, n)); + } + throwIfDisposed() { + if (this.disposed) + throw new Error("Attempted to use disposed GPGPUContext."); + } + throwIfNoProgram() { + if (this.program == null) + throw new Error("No GPU program is currently set."); + } +}; +function rY(r) { + let e = 0; + for (; e < r.length && r[e](); ++e) + ; + return e - 1; +} +var { addImpl: s$, bincountImpl: oh, bincountReduceImpl: a$, castImpl: i$, ceilImpl: u$, concatImpl: p$, equalImpl: c$, expImpl: l$, expm1Impl: m$, floorImpl: f$, gatherNdImpl: d$, gatherV2Impl: h$, greaterImpl: g$, greaterEqualImpl: x$, lessImpl: y$, lessEqualImpl: b$, linSpaceImpl: C$, logImpl: I$, maxImpl: w$, maximumImpl: S$, minimumImpl: v$, multiplyImpl: k$, negImpl: T$, notEqualImpl: N$, prodImpl: _$, raggedGatherImpl: E$, raggedRangeImpl: $$, raggedTensorToTensorImpl: R$, rangeImpl: A$, rsqrtImpl: F$, scatterImpl: D$, sigmoidImpl: P$, simpleAbsImpl: nh, sliceImpl: O$, sparseFillEmptyRowsImpl: M$, sparseReshapeImpl: L$, sparseSegmentReductionImpl: sh, sqrtImpl: B$, stridedSliceImpl: V$, stringNGramsImpl: z$, stringSplitImpl: W$, stringToHashBucketFastImpl: U$, subImpl: G$, tileImpl: H$, topKImpl: q$, transposeImpl: Du, uniqueImpl: K$ } = Ad; +function vw(r, e) { + return ["x", "y", "z", "w", "u", "v"].slice(0, e).map((t10) => `${r}.${t10}`); +} +function $t(r, e) { + return e === 1 ? [r] : vw(r, e); +} +function j$(r, e) { + if (r === 1) + return "rc"; + let t10 = ""; + for (let o = 0; o < r; o++) + t10 += e[o], o < r - 1 && (t10 += ","); + return t10; +} +var ah = class { + constructor(e) { + if (this.variableNames = ["A"], this.packedInputs = false, this.packedOutput = true, this.outputShape = e, this.rank = e.length, this.enableShapeUniforms = lt(this.outputShape.length), this.rank === 0) + this.userCode = ` + void main() { + setOutput(vec4(getA(), 0., 0., 0.)); + } + `; + else { + let t10 = $t("rc", this.rank), o = _e(this.rank), n = this.getOutOfBoundsCondition(t10), s = this.getSetup(t10), a = this.getOutput(t10); + this.userCode = ` + void main() { + ${o} rc = getOutputCoords(); + + if(${n}) { + setOutput(vec4(0)); + } else { + ${s} + + setOutput(vec4(${a})); + } + } + `; + } + } + getSourceCoordsArr(e) { + let t10 = []; + for (let o = 0; o <= 1; o++) + for (let n = 0; n <= 1; n++) { + let s = `${o === 0 ? "r" : "rp1"}, ${n === 0 ? "c" : "cp1"}`; + for (let a = 2; a < this.rank; a++) + s = `${e[e.length - 1 - a]},` + s; + t10.push(s); + } + return t10; + } + getOutOfBoundsCondition(e) { + if (this.rank === 1) + return `rc > ${this.enableShapeUniforms ? "outShape" : this.outputShape[0]}`; + let t10 = ""; + for (let o = this.rank - 2; o < this.rank; o++) + t10 += `${e[o]} >= ${this.enableShapeUniforms ? `outShape[${o}]` : this.outputShape[o]}`, o < this.rank - 1 && (t10 += "||"); + return t10; + } + getSetup(e) { + if (this.rank === 1) + return ""; + let t10 = e.slice(-2), o = this.enableShapeUniforms ? `outShape[${this.rank} - 1]` : this.outputShape[this.rank - 1], n = this.enableShapeUniforms ? `outShape[${this.rank} - 2]` : this.outputShape[this.rank - 2]; + return ` + int r = ${t10[0]}; + int c = ${t10[1]}; + int rp1 = r + 1; + int cp1 = c + 1; + + bool cEdge = cp1 >= ${o}; + bool rEdge = rp1 >= ${n}; + `; + } + getOutput(e) { + let t10 = this.getSourceCoordsArr(e); + return this.rank === 1 ? `getA(rc), (rc + 1 >= ${this.enableShapeUniforms ? "outShape" : this.outputShape[0]} ? 0. : getA(rc + 1)), 0, 0` : `getA(${t10[0]}), + cEdge ? 0. : getA(${t10[1]}), + rEdge ? 0. : getA(${t10[2]}), + rEdge || cEdge ? 0. : getA(${t10[3]})`; + } +}; +var hc = class { + constructor(e, t10) { + this.variableNames = ["A"], this.packedInputs = true, this.packedOutput = true, this.customUniforms = [{ name: "inputShape", type: "ivec3" }], this.outputShape = e, this.enableShapeUniforms = lt(this.outputShape.length); + let o = ""; + for (let n = 0; n < 4; n++) { + let s = "thisRC = rc;"; + n % 2 === 1 && (s += "thisRC.z += 1;"), n > 1 && (s += "thisRC.y += 1;"), o += ` + ${s} + ${n > 0 ? "if(thisRC.y < rows && thisRC.z < cols){" : ""} + int flatIndex = getFlatIndex(thisRC); + + ivec3 inputRC = inputCoordsFromReshapedOutCoords(flatIndex); + vec2 inputRCInnerDims = vec2(float(inputRC.y),float(inputRC.z)); + + result[${n}] = + getChannel(getA(inputRC.x, inputRC.y, inputRC.z), inputRCInnerDims); + ${n > 0 ? "}" : ""} + `; + } + this.userCode = ` + ${oY(t10, this.enableShapeUniforms)} + ${this.enableShapeUniforms ? pc() : uc(e)} + + void main() { + ivec3 rc = getOutputCoords(); + + vec4 result = vec4(0.); + + ivec3 thisRC; + int rows = ${this.enableShapeUniforms ? "outShape[1]" : e[1]}; + int cols = ${this.enableShapeUniforms ? "outShape[2]" : e[2]}; + + ${o} + + setOutput(result); + } + `; + } +}; +function oY(r, e) { + return ` + ivec3 inputCoordsFromReshapedOutCoords(int index) { + ${e ? YE(["r", "c", "d"], "inputShape") : is(["r", "c", "d"], r)} + return ivec3(r, c, d); + } + `; +} +var ih = class { + constructor(e) { + this.gpgpu = e, this.numUsedTextures = 0, this.numFreeTextures = 0, this._numBytesAllocated = 0, this._numBytesFree = 0, this.freeTextures = {}, this.logEnabled = false, this.usedTextures = {}; + } + acquireTexture(e, t10, o) { + let n = Y$(t10, o), s = Q$(e, n, o); + s in this.freeTextures || (this.freeTextures[s] = []), s in this.usedTextures || (this.usedTextures[s] = []); + let a = X$(e, n, this.gpgpu.gl, this.gpgpu.textureConfig, o); + if (this.freeTextures[s].length > 0) { + this.numFreeTextures--, this.numUsedTextures++, this._numBytesFree -= a, this.log(); + let p = this.freeTextures[s].shift(); + return this.usedTextures[s].push(p), p; + } + let i; + return n === Jt.PACKED_2X2_FLOAT32 ? i = this.gpgpu.createPackedMatrixTexture(e[0], e[1]) : n === Jt.PACKED_2X2_FLOAT16 ? i = this.gpgpu.createFloat16PackedMatrixTexture(e[0], e[1]) : n === Jt.UNPACKED_FLOAT32 ? i = this.gpgpu.createFloat32MatrixTexture(e[0], e[1]) : n === Jt.UNPACKED_FLOAT16 ? i = this.gpgpu.createFloat16MatrixTexture(e[0], e[1]) : n === Jt.PACKED_4X1_UNSIGNED_BYTE && (i = this.gpgpu.createUnsignedBytesMatrixTexture(e[0], e[1])), this.usedTextures[s].push(i), this.numUsedTextures++, this._numBytesAllocated += a, this.log(), i; + } + releaseTexture(e, t10, o, n) { + if (this.freeTextures == null) + return; + let s = Y$(o, n), a = Q$(t10, s, n); + a in this.freeTextures || (this.freeTextures[a] = []); + let i = X$(t10, s, this.gpgpu.gl, this.gpgpu.textureConfig, n), p = P().get("WEBGL_DELETE_TEXTURE_THRESHOLD"); + p !== -1 && this._numBytesAllocated > p ? (this.gpgpu.deleteMatrixTexture(e.texture), this._numBytesAllocated -= i) : (this.freeTextures[a].push(e), this.numFreeTextures++, this._numBytesFree += i), this.numUsedTextures--; + let u = this.usedTextures[a], c = u.indexOf(e); + if (c < 0) + throw new Error("Cannot release a texture that was never provided by this texture manager"); + u.splice(c, 1), this.log(); + } + log() { + if (!this.logEnabled) + return; + let e = this.numFreeTextures + this.numUsedTextures; + console.log("Free/Used", `${this.numFreeTextures} / ${this.numUsedTextures}`, `(${e})`); + let t10 = this._numBytesFree / this._numBytesAllocated; + console.log(`Bytes allocated: ${this._numBytesAllocated}`), console.log(`Bytes unused: ${this._numBytesFree} (${Math.round(100 * t10)}%)`); + } + get numBytesAllocated() { + return this._numBytesAllocated; + } + get numBytesFree() { + return this._numBytesFree; + } + getNumUsedTextures() { + return this.numUsedTextures; + } + getNumFreeTextures() { + return this.numFreeTextures; + } + dispose() { + if (this.freeTextures != null) { + for (let e in this.freeTextures) + this.freeTextures[e].forEach((t10) => { + this.gpgpu.deleteMatrixTexture(t10.texture); + }); + for (let e in this.usedTextures) + this.usedTextures[e].forEach((t10) => { + this.gpgpu.deleteMatrixTexture(t10.texture); + }); + this.freeTextures = null, this.usedTextures = null, this.numUsedTextures = 0, this.numFreeTextures = 0, this._numBytesAllocated = 0, this._numBytesFree = 0; + } + } +}; +function nY(r, e) { + let t10 = r; + if (e === t10.R32F) + return 4; + if (e === t10.R16F) + return 2; + if (e === t10.RGBA32F) + return 16; + if (e === r.RGBA) + return 16; + if (e === t10.RGBA16F) + return 8; + if (e === t10.RGBA8) + return 4; + throw new Error(`Unknown internal format ${e}`); +} +function X$(r, e, t10, o, n) { + let s = sY(e, o), a; + if (n) { + let [p, u] = Ks(r[0], r[1]); + a = p * u; + } else { + let [p, u] = $u(r[0], r[1]); + a = p * u; + } + let i = nY(t10, s); + return a * i; +} +function sY(r, e) { + switch (r) { + case Jt.PACKED_2X2_FLOAT32: + return th(e); + case Jt.PACKED_2X2_FLOAT16: + return rh(e); + case Jt.UNPACKED_FLOAT32: + return Zd(e); + case Jt.UNPACKED_FLOAT16: + return Jd(e); + case Jt.PACKED_4X1_UNSIGNED_BYTE: + return eh(e); + default: + throw new Error(`Unknown physical texture type ${r}`); + } +} +function aY(r) { + return P().getBool("WEBGL_RENDER_FLOAT32_ENABLED") ? r ? Jt.PACKED_2X2_FLOAT32 : Jt.UNPACKED_FLOAT32 : r ? Jt.PACKED_2X2_FLOAT16 : Jt.UNPACKED_FLOAT16; +} +function Y$(r, e) { + if (r === ir.UPLOAD) + return Jt.PACKED_2X2_FLOAT32; + if (r === ir.RENDER || r == null) + return aY(e); + if (r === ir.DOWNLOAD || r === ir.PIXELS) + return Jt.PACKED_4X1_UNSIGNED_BYTE; + throw new Error(`Unknown logical texture type ${r}`); +} +function Q$(r, e, t10) { + return `${r[0]}_${r[1]}_${e}_${t10}`; +} +var fr = class { + constructor(e, t10) { + this.variableNames = ["A"], this.outputShape = e, this.enableShapeUniforms = lt(this.outputShape.length), this.userCode = ` + float unaryOperation(float x) { + ${t10} + } + + void main() { + float x = getAAtOutCoords(); + float y = unaryOperation(x); + + setOutput(y); + } + `; + } +}; +var Vt = "if (isnan(x)) return x;"; +var Z$ = "return x;"; +var kw = "return abs(x);"; +var J$ = "return (x >= 0.0) ? x : (exp(x) - 1.0);"; +var eR = Vt + ` + return (x < 0.0) ? 0.0 : x; +`; +var tR = Vt + ` + return (x < 0.0) ? 0.0 : min(6.0, x); +`; +var Pu = "return x;"; +var rR = "return 1.0 / (1.0 + exp(-1.0 * x));"; +var nR = "return x;"; +var sR = ` + vec4 result; + + result.r = (x.r >= 0.0) ? x.r : (exp(x.r) - 1.0); + result.g = (x.g >= 0.0) ? x.g : (exp(x.g) - 1.0); + result.b = (x.b >= 0.0) ? x.b : (exp(x.b) - 1.0); + result.a = (x.a >= 0.0) ? x.a : (exp(x.a) - 1.0); + + return result; +`; +var aR = ` + vec4 result = x * vec4(greaterThanEqual(x, vec4(0.0))); + bvec4 isNaN = isnan(x); + + result.r = isNaN.r ? x.r : result.r; + result.g = isNaN.g ? x.g : result.g; + result.b = isNaN.b ? x.b : result.b; + result.a = isNaN.a ? x.a : result.a; + + return result; +`; +var iR = ` + vec4 result = min(x, vec4(6.)) * vec4(greaterThanEqual(x, vec4(0.0))); + bvec4 isNaN = isnan(x); + + result.r = isNaN.r ? x.r : result.r; + result.g = isNaN.g ? x.g : result.g; + result.b = isNaN.b ? x.b : result.b; + result.a = isNaN.a ? x.a : result.a; + + return result; +`; +var uR = "return 1.0 / (1.0 + exp(-1.0 * x));"; +var No = class { + constructor(e, t10) { + this.variableNames = ["A"], this.packedInputs = true, this.packedOutput = true, this.outputShape = e, this.enableShapeUniforms = lt(this.outputShape.length), this.userCode = ` + vec4 unaryOperation(vec4 x) { + ${t10} + } + + void main() { + vec4 x = getAAtOutCoords(); + vec4 y = unaryOperation(x); + + setOutput(y); + } + `; + } +}; +var uh = class { + constructor(e) { + this.variableNames = ["A"], this.packedInputs = true, this.packedOutput = false, this.outputShape = e, this.enableShapeUniforms = lt(this.outputShape.length); + let t10 = e.length, o = $t("rc", t10), n = _e(t10), s = j$(t10, o), a = o.slice(-2), i = t10 <= 1 ? "rc" : `vec2(${a.join(",")})`; + this.userCode = ` + void main() { + ${n} rc = getOutputCoords(); + vec4 packedInput = getA(${s}); + + setOutput(getChannel(packedInput, ${i})); + } + `; + } +}; +var uY = Bt.whereImpl; +var pY = 1e-7; +var cY = 1e-4; +var ph = {}; +function lY(r) { + return r in ph || (ph[r] = {}), ph[r]; +} +var mY = P().getNumber("CPU_HANDOFF_SIZE_THRESHOLD"); +var fY = 600; +function dY() { + return P().global.screen == null ? 1024 : P().global.screen.height * P().global.screen.width * window.devicePixelRatio * fY / 1024 / 1024; +} +var Ni = class extends Jr { + constructor(e) { + if (super(), this.pendingRead = /* @__PURE__ */ new WeakMap(), this.pendingDisposal = /* @__PURE__ */ new WeakSet(), this.dataRefCount = /* @__PURE__ */ new WeakMap(), this.numBytesInGPU = 0, this.uploadWaitMs = 0, this.downloadWaitMs = 0, this.lastGlFlushTime = 0, this.warnedAboutMemory = false, this.pendingDeletes = 0, this.disposed = false, !P().getBool("HAS_WEBGL")) + throw new Error("WebGL is not supported on this device"); + let t10; + if (e != null) { + if (e instanceof Fu) + t10 = e; + else { + let o = Gr(P().getNumber("WEBGL_VERSION"), e); + t10 = new Fu(o); + } + this.binaryCache = {}, this.gpgpuCreatedLocally = false; + } else { + let o = Gr(P().getNumber("WEBGL_VERSION")); + t10 = new Fu(o), this.binaryCache = lY(P().getNumber("WEBGL_VERSION")), this.gpgpuCreatedLocally = true; + } + this.gpgpu = t10, this.canvas = this.gpgpu.gl.canvas, this.textureManager = new ih(this.gpgpu), this.numMBBeforeWarning = dY(), this.texData = new rn(this, cr()); + } + nextDataId() { + return Ni.nextDataId++; + } + numDataIds() { + return this.texData.numDataIds() - this.pendingDeletes; + } + writeTexture(e, t10, o, n, s, a) { + let i = this.makeTensorInfo(t10, o), p = this.texData.get(i.dataId); + p.isPacked = false, p.texture = { texture: e, texShape: [n, s] }, p.texShape = [n, s]; + let u = ac(t10), c = new Al(u, false, a), l = this.runWebGLProgram(c, [i], o, [[n, s]]); + return l.shape = t10, p.texture = null, this.disposeIntermediateTensorInfo(i), l.dataId; + } + write(e, t10, o) { + if ((P().getBool("WEBGL_CHECK_NUMERICAL_PROBLEMS") || P().getBool("DEBUG")) && this.checkNumericalProblems(e), o === "complex64" && e != null) + throw new Error("Cannot write to a complex64 dtype. Please use tf.complex(real, imag)."); + let n = { id: this.nextDataId() }; + return this.texData.set(n, { shape: t10, dtype: o, values: e, usage: ir.UPLOAD, refCount: 1 }), n; + } + refCount(e) { + return this.texData.has(e) ? this.texData.get(e).refCount : 0; + } + incRef(e) { + let t10 = this.texData.get(e); + t10.refCount++; + } + decRef(e) { + if (this.texData.has(e)) { + let t10 = this.texData.get(e); + t10.refCount--; + } + } + move(e, t10, o, n, s) { + if (P().getBool("DEBUG") && this.checkNumericalProblems(t10), n === "complex64") + throw new Error("Cannot write to a complex64 dtype. Please use tf.complex(real, imag)."); + this.texData.set(e, { shape: o, dtype: n, values: t10, usage: ir.UPLOAD, refCount: s }); + } + disposeIntermediateTensorInfo(e) { + this.disposeData(e.dataId); + } + readSync(e) { + let t10 = this.texData.get(e), { values: o, dtype: n, complexTensorInfos: s, slice: a, shape: i, isPacked: p } = t10; + if (a != null) { + let m; + p ? m = new No(i, Pu) : m = new fr(i, Pu); + let f = this.runWebGLProgram(m, [{ dataId: e, shape: i, dtype: n }], n), d = this.readSync(f.dataId); + return this.disposeIntermediateTensorInfo(f), d; + } + if (o != null) + return this.convertAndCacheOnCPU(e); + if (n === "string") + return o; + let u = this.activeTimers != null, c; + u && (c = x.now()); + let l; + if (n === "complex64") { + let m = this.readSync(s.real.dataId), f = this.readSync(s.imag.dataId); + l = I.mergeRealAndImagArrays(m, f); + } else + l = this.getValuesFromTexture(e); + return u && (this.downloadWaitMs += x.now() - c), this.convertAndCacheOnCPU(e, l); + } + async read(e) { + if (this.pendingRead.has(e)) { + let d = this.pendingRead.get(e); + return new Promise((h) => d.push(h)); + } + let t10 = this.texData.get(e), { values: o, shape: n, slice: s, dtype: a, complexTensorInfos: i, isPacked: p } = t10; + if (s != null) { + let d; + p ? d = new No(n, Pu) : d = new fr(n, Pu); + let h = this.runWebGLProgram(d, [{ dataId: e, shape: n, dtype: a }], a), g = this.read(h.dataId); + return this.disposeIntermediateTensorInfo(h), g; + } + if (o != null) + return this.convertAndCacheOnCPU(e); + if (P().getBool("DEBUG") && !P().getBool("WEBGL_DOWNLOAD_FLOAT_ENABLED") && P().getNumber("WEBGL_VERSION") === 2) + throw new Error("tensor.data() with WEBGL_DOWNLOAD_FLOAT_ENABLED=false and WEBGL_VERSION=2 not yet supported."); + let u = null, c; + if (a !== "complex64" && P().get("WEBGL_BUFFER_SUPPORTED")) { + c = this.decode(e); + let d = this.texData.get(c.dataId); + u = this.gpgpu.createBufferFromTexture(d.texture.texture, ..._l(n)); + } + this.pendingRead.set(e, []), a !== "complex64" && await this.gpgpu.createAndWaitForFence(); + let l; + if (a === "complex64") { + let d = await Promise.all([this.read(i.real.dataId), this.read(i.imag.dataId)]), h = d[0], g = d[1]; + l = I.mergeRealAndImagArrays(h, g); + } else if (u == null) + l = this.getValuesFromTexture(e); + else { + let d = x.sizeFromShape(n); + l = this.gpgpu.downloadFloat32MatrixFromBuffer(u, d); + } + if (c != null && this.disposeIntermediateTensorInfo(c), u != null) { + let d = this.gpgpu.gl; + me(d, () => d.deleteBuffer(u)); + } + let m = this.convertAndCacheOnCPU(e, l), f = this.pendingRead.get(e); + return this.pendingRead.delete(e), f.forEach((d) => d(m)), this.pendingDisposal.has(e) && (this.pendingDisposal.delete(e), this.disposeData(e) && cr().removeDataId(e, this), this.pendingDeletes--), m; + } + readToGPU(e, t10 = {}) { + let o = this.texData.get(e), { values: n, shape: s, slice: a, dtype: i, isPacked: p, texture: u } = o; + if (i === "complex64") + throw new Error("Does not support reading texture for complex64 dtype."); + if (a != null) { + let f; + p ? f = new No(s, Pu) : f = new fr(s, Pu); + let d = this.runWebGLProgram(f, [{ dataId: e, shape: s, dtype: i }], i), h = this.readToGPU(d, t10); + return this.disposeIntermediateTensorInfo(d), h; + } + if (u == null) + throw n != null ? new Error("Data is not on GPU but on CPU.") : new Error("There is no data on GPU or CPU."); + let c = this.decode(e, t10.customTexShape), l = cr().makeTensorFromTensorInfo(c), m = this.texData.get(c.dataId); + return Object.assign({ tensorRef: l }, m.texture); + } + bufferSync(e) { + let t10 = this.readSync(e.dataId); + if (e.dtype === "string") + try { + let o = t10.map((n) => x.decodeString(n)); + return ne(e.shape, e.dtype, o); + } catch (o) { + throw new Error("Failed to decode encoded string bytes into utf-8"); + } + return ne(e.shape, e.dtype, t10); + } + checkNumericalProblems(e) { + if (e != null) + for (let t10 = 0; t10 < e.length; t10++) { + let o = e[t10]; + if (!VI(o)) + throw P().getBool("WEBGL_RENDER_FLOAT32_CAPABLE") ? Error(`The value ${o} cannot be represented with your current settings. Consider enabling float32 rendering: 'tf.env().set('WEBGL_RENDER_FLOAT32_ENABLED', true);'`) : Error(`The value ${o} cannot be represented on this device.`); + } + } + getValuesFromTexture(e) { + let { shape: t10, dtype: o, isPacked: n } = this.texData.get(e), s = x.sizeFromShape(t10); + if (P().getBool("WEBGL_DOWNLOAD_FLOAT_ENABLED")) { + let m = this.decode(e), f = this.texData.get(m.dataId), d = this.gpgpu.downloadMatrixFromPackedTexture(f.texture.texture, ..._l(t10)).subarray(0, s); + return this.disposeIntermediateTensorInfo(m), d; + } + let a = P().getBool("WEBGL_PACK") && n === true, i = a ? ac(t10) : t10, p = a ? new Yd(i) : new Xd(i), u = this.runWebGLProgram(p, [{ shape: i, dtype: o, dataId: e }], "float32"), c = this.texData.get(u.dataId), l = this.gpgpu.downloadByteEncodedFloatMatrixFromOutputTexture(c.texture.texture, c.texShape[0], c.texShape[1]).subarray(0, s); + return this.disposeIntermediateTensorInfo(u), l; + } + timerAvailable() { + return P().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE") > 0; + } + time(e) { + let t10 = this.activeTimers, o = [], n = false; + this.programTimersStack == null ? (this.programTimersStack = o, n = true) : this.activeTimers.push(o), this.activeTimers = o, e(); + let s = x.flatten(this.activeTimers.map((p) => p.query)).filter((p) => p != null), a = x.flatten(this.activeTimers.map((p) => p.name)).filter((p) => p != null); + this.activeTimers = t10, n && (this.programTimersStack = null); + let i = { uploadWaitMs: this.uploadWaitMs, downloadWaitMs: this.downloadWaitMs, kernelMs: null, wallMs: null }; + return (async () => { + if (P().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE") > 0) { + let p = await Promise.all(s); + i.kernelMs = x.sum(p), i.getExtraProfileInfo = () => p.map((u, c) => ({ name: a[c], ms: u })).map((u) => `${u.name}: ${u.ms}`).join(", "); + } else + i.kernelMs = { error: "WebGL query timers are not supported in this environment." }; + return this.uploadWaitMs = 0, this.downloadWaitMs = 0, i; + })(); + } + memory() { + return { unreliable: false, numBytesInGPU: this.numBytesInGPU, numBytesInGPUAllocated: this.textureManager.numBytesAllocated, numBytesInGPUFree: this.textureManager.numBytesFree }; + } + startTimer() { + return P().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE") > 0 ? this.gpgpu.beginQuery() : { startMs: x.now(), endMs: null }; + } + endTimer(e) { + return P().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE") > 0 ? (this.gpgpu.endQuery(), e) : (e.endMs = x.now(), e); + } + async getQueryTime(e) { + if (P().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE") > 0) + return this.gpgpu.waitForQueryAndGetTime(e); + let t10 = e; + return t10.endMs - t10.startMs; + } + disposeData(e, t10 = false) { + if (this.pendingDisposal.has(e)) + return false; + if (!this.texData.has(e)) + return true; + if (t10 ? this.texData.get(e).refCount = 0 : this.texData.get(e).refCount--, !t10 && this.texData.get(e).refCount > 0) + return false; + if (this.pendingRead.has(e)) + return this.pendingDisposal.add(e), this.pendingDeletes++, false; + this.releaseGPUData(e); + let { complexTensorInfos: o } = this.texData.get(e); + return o != null && (this.disposeData(o.real.dataId, t10), this.disposeData(o.imag.dataId, t10)), this.texData.delete(e), true; + } + releaseGPUData(e) { + let { texture: t10, dtype: o, texShape: n, usage: s, isPacked: a, slice: i } = this.texData.get(e), p = i && i.origDataId || e, u = this.dataRefCount.get(p); + u > 1 ? this.dataRefCount.set(p, u - 1) : (this.dataRefCount.delete(p), t10 != null && (this.numBytesInGPU -= this.computeBytes(n, o), this.textureManager.releaseTexture(t10, n, s, a))); + let c = this.texData.get(e); + c.texture = null, c.texShape = null, c.isPacked = false, c.slice = null; + } + getTexture(e) { + return this.uploadToGPU(e), this.texData.get(e).texture.texture; + } + getDataInfo(e) { + return this.texData.get(e); + } + shouldExecuteOnCPU(e, t10 = mY) { + return P().getBool("WEBGL_CPU_FORWARD") && e.every((o) => this.texData.get(o.dataId).texture == null && x.sizeFromShape(o.shape) < t10); + } + getGPGPUContext() { + return this.gpgpu; + } + where(e) { + I.warn("tf.where() in webgl locks the UI thread. Call tf.whereAsync() instead"); + let t10 = e.dataSync(); + return uY(e.shape, t10); + } + packedUnaryOp(e, t10, o) { + let n = new No(e.shape, t10), s = this.compileAndRun(n, [e], o); + return cr().makeTensorFromTensorInfo(s); + } + abs(e) { + if (this.shouldExecuteOnCPU([e]) && e.dtype !== "complex64") { + let n = nh(this.texData.get(e.dataId).values); + return this.makeOutput(e.shape, e.dtype, n); + } + if (P().getBool("WEBGL_PACK_UNARY_OPERATIONS")) + return this.packedUnaryOp(e, kw, e.dtype); + let t10 = new fr(e.shape, kw), o = this.compileAndRun(t10, [e]); + return cr().makeTensorFromTensorInfo(o); + } + makeTensorInfo(e, t10, o) { + let n; + if (t10 === "string" && o != null && o.length > 0 && x.isString(o[0])) { + let s = o.map((a) => x.encodeString(a)); + n = this.write(s, e, t10); + } else + n = this.write(o, e, t10); + return this.texData.get(n).usage = null, { dataId: n, shape: e, dtype: t10 }; + } + makeOutput(e, t10, o) { + return cr().makeTensorFromTensorInfo(this.makeTensorInfo(e, t10, o), this); + } + unpackTensor(e) { + let t10 = new uh(e.shape); + return this.runWebGLProgram(t10, [e], e.dtype); + } + packTensor(e) { + let t10 = new ah(e.shape), o = true; + return this.runWebGLProgram(t10, [e], e.dtype, null, o); + } + packedReshape(e, t10) { + let o = [Pa(e.shape), ...Oa(e.shape)], n = { dtype: e.dtype, shape: o, dataId: e.dataId }, s = [Pa(t10), ...Oa(t10)], a = new hc(s, o), i = true, p = [o], u = this.runWebGLProgram(a, [n], e.dtype, p, i); + return { dataId: u.dataId, shape: t10, dtype: u.dtype }; + } + decode(e, t10) { + let o = this.texData.get(e), { isPacked: n, shape: s, dtype: a } = o; + if (t10 != null) { + let m = x.sizeFromShape(s), f = t10[0] * t10[1] * 4; + x.assert(m <= f, () => "customTexShape is too small. Row * Column * 4 should be equal or larger than the size of the tensor data."); + } + let i = ac(s), p; + n ? p = new jd(i) : p = new Kd(i); + let u = true, c = [t10 != null ? t10 : _l(i)], l = this.runWebGLProgram(p, [{ shape: i, dtype: a, dataId: e }], a, c, u, t10); + return { dtype: a, shape: s, dataId: l.dataId }; + } + runWebGLProgram(e, t10, o, n, s = false, a) { + let i = this.makeTensorInfo(e.outputShape, o), p = this.texData.get(i.dataId); + if (e.packedOutput && (p.isPacked = true), e.outPackingScheme === ki.DENSE) { + let y = a != null ? a : _l(e.outputShape); + p.texShape = y.map((b) => b * 2); + } + if (e.outTexUsage != null && (p.usage = e.outTexUsage), x.sizeFromShape(i.shape) === 0) + return p.values = x.getTypedArrayFromDType(i.dtype, 0), i; + let u = [], c = t10.map((y) => { + if (y.dtype === "complex64") + throw new Error("GPGPUProgram does not support complex64 input. For complex64 dtypes, please separate the program into real and imaginary parts."); + let b = this.texData.get(y.dataId); + if (b.texture == null) { + if (!e.packedInputs && x.sizeFromShape(y.shape) <= P().getNumber("WEBGL_SIZE_UPLOAD_UNIFORM")) + return { shape: y.shape, texData: null, isUniform: true, uniformValues: b.values }; + e.packedInputs && (b.isPacked = true, b.shape = y.shape); + } + if (this.uploadToGPU(y.dataId), !!b.isPacked != !!e.packedInputs) + y = b.isPacked ? this.unpackTensor(y) : this.packTensor(y), u.push(y), b = this.texData.get(y.dataId); + else if (b.isPacked && !Ti(b.shape, y.shape)) { + let C = y, w = y.shape; + y.shape = b.shape, y = this.packedReshape(y, w), u.push(y), b = this.texData.get(y.dataId), C.shape = w; + } + return { shape: y.shape, texData: b, isUniform: false }; + }); + this.uploadToGPU(i.dataId); + let l = { shape: i.shape, texData: p, isUniform: false }, m = n$(e, c, l), f = this.getAndSaveBinary(m, () => r$(this.gpgpu, e, c, l)), d = this.activeTimers != null, h; + d && (h = this.startTimer()), P().get("ENGINE_COMPILE_ONLY") || o$(this.gpgpu, f, c, l, n), u.forEach((y) => this.disposeIntermediateTensorInfo(y)), d && (h = this.endTimer(h), this.activeTimers.push({ name: e.constructor.name, query: this.getQueryTime(h) })); + let g = P().get("WEBGL_FLUSH_THRESHOLD"); + if (g > 0) { + let y = x.now(); + y - this.lastGlFlushTime > g && (this.gpgpu.gl.flush(), this.lastGlFlushTime = y); + } + if (!P().getBool("WEBGL_LAZILY_UNPACK") && p.isPacked && s === false) { + let y = this.unpackTensor(i); + return this.disposeIntermediateTensorInfo(i), y; + } + return i; + } + compileAndRun(e, t10, o, n, s = false) { + return o = o || t10[0].dtype, this.runWebGLProgram(e, t10, o, n, s); + } + getAndSaveBinary(e, t10) { + return e in this.binaryCache || (this.binaryCache[e] = t10()), this.binaryCache[e]; + } + getTextureManager() { + return this.textureManager; + } + dispose() { + this.disposed || (P().getBool("IS_TEST") || Object.keys(this.binaryCache).forEach((t10) => { + this.gpgpu.deleteProgram(this.binaryCache[t10].webGLProgram), delete this.binaryCache[t10]; + }), this.textureManager.dispose(), this.canvas != null && typeof HTMLCanvasElement != "undefined" && this.canvas instanceof HTMLCanvasElement ? this.canvas.remove() : this.canvas = null, this.gpgpuCreatedLocally && (this.gpgpu.program = null, this.gpgpu.dispose()), this.disposed = true); + } + floatPrecision() { + return this.floatPrecisionValue == null && (this.floatPrecisionValue = Ne(() => { + if (!P().get("WEBGL_RENDER_FLOAT32_ENABLED")) { + let e = P().getBool("DEBUG"); + P().set("DEBUG", false); + let t10 = this.abs(be(1e-8)).dataSync()[0]; + if (P().set("DEBUG", e), t10 > 0) + return 32; + } + return 16; + })), this.floatPrecisionValue; + } + epsilon() { + return this.floatPrecision() === 32 ? pY : cY; + } + uploadToGPU(e) { + let t10 = this.texData.get(e), { shape: o, dtype: n, values: s, texture: a, usage: i, isPacked: p } = t10; + if (a != null) + return; + let u = this.activeTimers != null, c; + u && (c = x.now()); + let l = t10.texShape; + if (l == null && (l = JI(o, p), t10.texShape = l), s != null) { + let m = ac(o), f, d = l[1], h = l[0], g = s instanceof Uint8Array || s instanceof Uint8ClampedArray; + (p || !g) && ([d, h] = Ks(l[0], l[1])), p ? f = new Qd(m, g) : f = new Al(m, g); + let y = g ? [h, d] : l, b = this.makeTensorInfo(y, n), C = this.texData.get(b.dataId); + g ? C.usage = ir.PIXELS : C.usage = ir.UPLOAD, C.texShape = y, this.gpgpu.uploadDenseMatrixToTexture(this.getTexture(b.dataId), d, h, s); + let w = [[h, d]], k = true, _ = this.runWebGLProgram(f, [b], n, w, k), E = this.texData.get(_.dataId); + t10.texShape = E.texShape, t10.isPacked = E.isPacked, t10.usage = E.usage, P().get("ENGINE_COMPILE_ONLY") ? this.disposeData(_.dataId) : (t10.texture = E.texture, t10.values = null, this.texData.delete(_.dataId)), this.disposeIntermediateTensorInfo(b), u && (this.uploadWaitMs += x.now() - c); + } else { + let m = this.acquireTexture(l, i, n, p); + t10.texture = m; + } + } + convertAndCacheOnCPU(e, t10) { + let o = this.texData.get(e), { dtype: n } = o; + return this.releaseGPUData(e), t10 != null && (o.values = hY(t10, n)), o.values; + } + acquireTexture(e, t10, o, n) { + if (this.numBytesInGPU += this.computeBytes(e, o), !this.warnedAboutMemory && this.numBytesInGPU > this.numMBBeforeWarning * 1024 * 1024) { + let s = (this.numBytesInGPU / 1024 / 1024).toFixed(2); + this.warnedAboutMemory = true, console.warn(`High memory usage in GPU: ${s} MB, most likely due to a memory leak`); + } + return this.textureManager.acquireTexture(e, t10, n); + } + computeBytes(e, t10) { + return e[0] * e[1] * x.bytesPerElement(t10); + } + checkCompileCompletion() { + for (let [, e] of Object.entries(this.binaryCache)) + this.checkCompletion_(e); + } + async checkCompileCompletionAsync() { + let e = []; + if (this.gpgpu.parallelCompilationExtension) { + for (let [, t10] of Object.entries(this.binaryCache)) + e.push(this.checkCompletionAsync_(t10)); + return Promise.all(e); + } else { + for (let [, t10] of Object.entries(this.binaryCache)) { + let o = new Promise((n) => { + try { + this.checkCompletion_(t10), n(true); + } catch (s) { + throw s; + } + }); + e.push(o); + } + return Promise.all(e); + } + } + async checkCompletionAsync_(e) { + return this.gpgpu.gl.getProgramParameter(e.webGLProgram, this.gpgpu.parallelCompilationExtension.COMPLETION_STATUS_KHR) ? this.checkCompletion_(e) : (await kC(), this.checkCompletionAsync_(e)); + } + checkCompletion_(e) { + if (this.gpgpu.gl.getProgramParameter(e.webGLProgram, this.gpgpu.gl.LINK_STATUS) === false) + throw console.log(this.gpgpu.gl.getProgramInfoLog(e.webGLProgram)), this.gpgpu.gl.getShaderParameter(e.fragmentShader, this.gpgpu.gl.COMPILE_STATUS) === false ? (zd(e.source, this.gpgpu.gl.getShaderInfoLog(e.fragmentShader)), new Error("Failed to compile fragment shader.")) : new Error("Failed to link vertex and fragment shaders."); + return true; + } + getUniformLocations() { + for (let [, e] of Object.entries(this.binaryCache)) { + let { uniformLocations: t10, customUniformLocations: o, infLoc: n, nanLoc: s, inShapesLocations: a, inTexShapesLocations: i, outShapeLocation: p, outShapeStridesLocation: u, outTexShapeLocation: c } = aw(this.gpgpu, e.program, e.webGLProgram); + e.uniformLocations = t10, e.customUniformLocations = o, e.infLoc = n, e.nanLoc = s, e.inShapesLocations = a, e.inTexShapesLocations = i, e.outShapeLocation = p, e.outShapeStridesLocation = u, e.outTexShapeLocation = c; + } + } + createTensorFromTexture(e, t10, o) { + let { texture: n, height: s, width: a, channels: i } = e, p = cr().backend; + if (!p.gpgpu.gl.isTexture(n)) + throw new Error("The texture is invalid. Also, please make sure the texture and the TFJS WebGL backend are using the same canvas. If you want to use your own custom canvas, you have to create and use the custom TFJS WebGL backend created from the canvas through 'new tf.MathBackendWebGL(customCanvas)'."); + let u = p.writeTexture(n, t10, o, s, a, i); + return cr().makeTensorFromDataId(u, t10, o, p); + } +}; +Ni.nextDataId = 0; +function hY(r, e) { + if (e === "float32" || e === "complex64") + return r; + if (e === "int32" || e === "bool") { + let t10 = e === "int32" ? new Int32Array(r.length) : new Uint8Array(r.length); + for (let o = 0; o < t10.length; ++o) + t10[o] = Math.round(r[o]); + return t10; + } else + throw new Error(`Unknown dtype ${e}`); +} +var gY = "4.0.0"; +function pR() { + P().set("WEBGL_FORCE_F16_TEXTURES", true); +} +ii.isBrowser() && pi("webgl", () => new Ni(), 2); +var R9e = { forceHalfFloat: pR }; +var gc = ` + if (isnan(a)) return a; + if (isnan(b)) return b; +`; +var _o = class { + constructor(e, t10, o) { + this.variableNames = ["A", "B"], this.outputShape = I.assertAndGetBroadcastShape(t10, o), this.enableShapeUniforms = lt(this.outputShape.length), this.userCode = ` + float binaryOperation(float a, float b) { + ${e} + } + + void main() { + float a = getAAtOutCoords(); + float b = getBAtOutCoords(); + setOutput(binaryOperation(a, b)); + } + `; + } +}; +var js = ` + result.r = isNaN.r ? NAN : result.r; + result.g = isNaN.g ? NAN : result.g; + result.b = isNaN.b ? NAN : result.b; + result.a = isNaN.a ? NAN : result.a; +`; +var Ko = class { + constructor(e, t10, o, n = false) { + this.variableNames = ["A", "B"], this.supportsBroadcasting = true, this.packedInputs = true, this.packedOutput = true, this.outputShape = I.assertAndGetBroadcastShape(t10, o); + let s = this.outputShape.length; + this.enableShapeUniforms = lt(s); + let a = ""; + if (n) + if (s === 0 || x.sizeFromShape(this.outputShape) === 1) + a = ` + result.y = 0.; + result.z = 0.; + result.w = 0.; + `; + else if (a = ` + ${_e(s)} coords = getOutputCoords(); + `, s === 1) + this.enableShapeUniforms ? a += ` + result.y = (coords + 1) >= outShape ? 0. : result.y; + result.z = 0.; + result.w = 0.; + ` : a += ` + result.y = (coords + 1) >= ${this.outputShape[0]} ? 0. : result.y; + result.z = 0.; + result.w = 0.; + `; + else { + let p = $t("coords", s); + this.enableShapeUniforms ? a += ` + bool nextRowOutOfBounds = + (${p[s - 2]} + 1) >= outShape[${s} - 2]; + bool nextColOutOfBounds = + (${p[s - 1]} + 1) >= outShape[${s} - 1]; + result.y = nextColOutOfBounds ? 0. : result.y; + result.z = nextRowOutOfBounds ? 0. : result.z; + result.w = nextColOutOfBounds || nextRowOutOfBounds ? 0. : result.w; + ` : a += ` + bool nextRowOutOfBounds = + (${p[s - 2]} + 1) >= ${this.outputShape[s - 2]}; + bool nextColOutOfBounds = + (${p[s - 1]} + 1) >= ${this.outputShape[s - 1]}; + result.y = nextColOutOfBounds ? 0. : result.y; + result.z = nextRowOutOfBounds ? 0. : result.z; + result.w = nextColOutOfBounds || nextRowOutOfBounds ? 0. : result.w; + `; + } + this.userCode = ` + vec4 binaryOperation(vec4 a, vec4 b) { + ${e} + } + + void main() { + vec4 a = getAAtOutCoords(); + vec4 b = getBAtOutCoords(); + + vec4 result = binaryOperation(a, b); + ${a} + + setOutput(result); + } + `; + } +}; +function Rt(r) { + let { inputs: e, backend: t10 } = r, { x: o } = e; + return t10.incRef(o.dataId), { dataId: o.dataId, shape: o.shape, dtype: o.dtype }; +} +var cR = { kernelName: uo, backendName: "webgl", kernelFunc: Rt }; +function Ar(r) { + let { inputs: e, backend: t10 } = r, { real: o, imag: n } = e, s = t10.makeTensorInfo(o.shape, "complex64"), a = t10.texData.get(s.dataId), i = Rt({ inputs: { x: o }, backend: t10 }), p = Rt({ inputs: { x: n }, backend: t10 }); + return a.complexTensorInfos = { real: i, imag: p }, s; +} +var lR = { kernelName: aa, backendName: "webgl", kernelFunc: Ar }; +var Tw = "return (a < 0.) ? b * a : a;"; +var Nw = ` + vec4 aLessThanZero = vec4(lessThan(a, vec4(0.))); + return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a); +`; +function xY(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { alpha: s } = o, a = t10.makeTensorInfo([], "float32", x.createScalarValue(s, "float32")), i = P().getBool("WEBGL_PACK_BINARY_OPERATIONS") ? new Ko(Nw, n.shape, a.shape) : new _o(Tw, n.shape, a.shape), p = t10.runWebGLProgram(i, [n, a], "float32"); + return t10.disposeIntermediateTensorInfo(a), p; +} +var mR = { kernelName: Nn, backendName: "webgl", kernelFunc: xY }; +var _w = "return (a < 0.) ? b * a : a;"; +var Ew = ` + vec4 aLessThanZero = vec4(lessThan(a, vec4(0.))); + return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a); +`; +function yY(r) { + let { inputs: e, backend: t10 } = r, { x: o, alpha: n } = e, s = P().getBool("WEBGL_PACK_BINARY_OPERATIONS") ? new Ko(Ew, o.shape, n.shape) : new _o(_w, o.shape, n.shape); + return t10.runWebGLProgram(s, [o, n], "float32"); +} +var fR = { kernelName: Vn, backendName: "webgl", kernelFunc: yY }; +var jo = "if (isnan(x)) return x;"; +function he({ opSnippet: r, packedOpSnippet: e, cpuKernelImpl: t10, dtype: o }) { + return ({ inputs: n, backend: s }) => { + let { x: a } = n, i = s, p = o || a.dtype; + if (i.shouldExecuteOnCPU([a]) && t10 != null) { + let l = i.texData.get(a.dataId), m = t10(l.values, p); + return i.makeTensorInfo(a.shape, p, m); + } + let u = P().getBool("WEBGL_PACK_UNARY_OPERATIONS") && e != null, c; + return u ? c = new No(a.shape, e) : c = new fr(a.shape, r), i.runWebGLProgram(c, [a], p); + }; +} +function ot({ opSnippet: r, packedOpSnippet: e, checkOutOfBounds: t10 = false, supportsComplex: o = false, cpuKernelImpl: n, dtype: s }) { + return ({ inputs: a, backend: i }) => { + let { a: p, b: u } = a, c = i; + if (o && p.dtype === "complex64") { + let d = c.texData.get(p.dataId), h = c.texData.get(u.dataId), [g, y] = [[d.complexTensorInfos.real, h.complexTensorInfos.real], [d.complexTensorInfos.imag, h.complexTensorInfos.imag]].map((C) => { + let [w, k] = C, _ = { dataId: w.dataId, dtype: w.dtype, shape: p.shape }, E = { dataId: k.dataId, dtype: k.dtype, shape: u.shape }, R = new _o(r, p.shape, u.shape); + return c.runWebGLProgram(R, [_, E], ct(w.dtype, k.dtype)); + }), b = Ar({ inputs: { real: g, imag: y }, backend: c }); + return c.disposeIntermediateTensorInfo(g), c.disposeIntermediateTensorInfo(y), b; + } + let l = s || ct(p.dtype, u.dtype); + if ((p.dtype === "string" || u.dtype === "string" || c.shouldExecuteOnCPU([p, u])) && n != null) { + let d = c.texData.get(p.dataId).values, h = c.texData.get(u.dataId).values, g = p.dtype === "string" ? I.fromUint8ToStringArray(d) : d, y = p.dtype === "string" ? I.fromUint8ToStringArray(h) : h, [b, C] = n(p.shape, u.shape, g, y, l), w = c.makeTensorInfo(C, l), k = c.texData.get(w.dataId); + return k.values = b, w; + } + let m = P().getBool("WEBGL_PACK_BINARY_OPERATIONS") && e != null, f; + return m ? f = new Ko(e, p.shape, u.shape, t10) : f = new _o(r, p.shape, u.shape), c.runWebGLProgram(f, [p, u], l); + }; +} +function Ma(r, e = false) { + if (r === "linear") + return e ? nR : Z$; + if (r === "relu") + return e ? aR : eR; + if (r === "elu") + return e ? sR : J$; + if (r === "relu6") + return e ? iR : tR; + if (r === "prelu") + return e ? Ew : _w; + if (r === "leakyrelu") + return e ? Nw : Tw; + if (r === "sigmoid") + return e ? uR : rR; + throw new Error(`Activation ${r} has not been implemented for the WebGL backend.`); +} +var xc = class { + constructor(e, t10, o, n = false, s = false, a = false, i = null, p = false, u = false) { + this.variableNames = ["matrixA", "matrixB"], this.packedInputs = true, this.packedOutput = true, this.outputShape = o, this.enableShapeUniforms = lt(this.outputShape.length); + let c = n ? e[1] : e[2], l = Math.ceil(c / 2), m = n ? "i * 2, rc.y" : "rc.y, i * 2", f = s ? "rc.z, i * 2" : "i * 2, rc.z", d = n ? ["a.xxyy", "a.zzww"] : ["a.xxzz", "a.yyww"], h = s ? ["b.xzxz", "b.ywyw"] : ["b.xyxy", "b.zwzw"], g = "", y = ""; + i && (p ? g = `vec4 activation(vec4 a) { + vec4 b = getPreluActivationWeightsAtOutCoords(); + ${i} + }` : u ? g = `vec4 activation(vec4 a) { + vec4 b = getLeakyreluAlphaAtOutCoords(); + ${i} + }` : g = `vec4 activation(vec4 x) { + ${i} + }`, y = "result = activation(result);"); + let b = a ? "result += getBiasAtOutCoords();" : ""; + a && this.variableNames.push("bias"), p && this.variableNames.push("preluActivationWeights"), u && this.variableNames.push("leakyreluAlpha"); + let C = "rc.x", w = "rc.x"; + e[0] < t10[0] ? C = `int(min(float(rc.x), ${e[0] - 1}.))` : t10[0] < e[0] && (w = `int(min(float(rc.x), ${t10[0] - 1}.))`), this.userCode = ` + ${g} + // Don't use uniform for sharedDimensionPacked for performance. + const float sharedDimension = ${l}.0; + + vec4 dot2x2ARowBCol(ivec3 rc) { + vec4 result = vec4(0); + for (int i = 0; i < ${l}; i++) { + int batchA = ${C}; + int batchB = ${w}; + vec4 a = getMatrixA(batchA, ${m}); + vec4 b = getMatrixB(batchB, ${f}); + + // These swizzled products need to be separately added. + // See: https://github.com/tensorflow/tfjs/issues/1735 + result += (${d[0]} * ${h[0]}); + result += (${d[1]} * ${h[1]}); + } + return result; + } + + void main() { + ivec3 rc = getOutputCoords(); + vec4 result = dot2x2ARowBCol(rc); + + ${b} + + ${y} + + setOutput(result); + } + `; + } +}; +var $w = { REAL: "return areal * breal - aimag * bimag;", IMAG: "return areal * bimag + aimag * breal;" }; +var Dl = class { + constructor(e, t10, o) { + this.variableNames = ["AReal", "AImag", "BReal", "BImag"], this.outputShape = I.assertAndGetBroadcastShape(t10, o), this.userCode = ` + float binaryOpComplex( + float areal, float aimag, float breal, float bimag) { + ${e} + } + + void main() { + float areal = getARealAtOutCoords(); + float aimag = getAImagAtOutCoords(); + float breal = getBRealAtOutCoords(); + float bimag = getBImagAtOutCoords(); + setOutput(binaryOpComplex(areal, aimag, breal, bimag)); + } + `; + } +}; +var dR = "return a * b;"; +function Pl(r) { + let { inputs: e, backend: t10 } = r, { a: o, b: n } = e, s = I.upcastType(o.dtype, n.dtype); + if (o.dtype === "complex64") { + let i = t10.texData.get(o.dataId), p = t10.texData.get(n.dataId), u = new Dl($w.REAL, o.shape, n.shape), c = new Dl($w.IMAG, o.shape, n.shape), l = [{ dataId: i.complexTensorInfos.real.dataId, dtype: i.complexTensorInfos.real.dtype, shape: o.shape }, { dataId: i.complexTensorInfos.imag.dataId, dtype: i.complexTensorInfos.imag.dtype, shape: o.shape }, { dataId: p.complexTensorInfos.real.dataId, dtype: p.complexTensorInfos.real.dtype, shape: n.shape }, { dataId: p.complexTensorInfos.imag.dataId, dtype: p.complexTensorInfos.imag.dtype, shape: n.shape }], m = t10.runWebGLProgram(u, l, "float32"), f = t10.runWebGLProgram(c, l, "float32"), d = Ar({ inputs: { real: m, imag: f }, backend: t10 }); + return t10.disposeIntermediateTensorInfo(m), t10.disposeIntermediateTensorInfo(f), d; + } + if (t10.shouldExecuteOnCPU([o, n])) { + let i = t10.texData.get(o.dataId), p = t10.texData.get(n.dataId), [u, c] = k$(o.shape, n.shape, i.values, p.values, s), l = t10.makeTensorInfo(c, s), m = t10.texData.get(l.dataId); + return m.values = u, l; + } + let a; + return P().getBool("WEBGL_PACK_BINARY_OPERATIONS") ? a = new Ko(dR, o.shape, n.shape) : a = new _o(dR, o.shape, n.shape), t10.runWebGLProgram(a, [o, n], s); +} +var hR = { kernelName: ho, backendName: "webgl", kernelFunc: Pl }; +function gR(r, e, t10) { + let o = [Pa(r.shape), ...Oa(r.shape)], n = { dtype: r.dtype, shape: o, dataId: r.dataId }, s = [Pa(e), ...Oa(e)], a = new hc(s, o), i = true, p = [o], u = t10.runWebGLProgram(a, [n], r.dtype, p, i); + return { dataId: u.dataId, shape: e, dtype: u.dtype }; +} +function J(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { shape: s } = o, a = t10, i = x.sizeFromShape(n.shape), p = x.inferFromImplicitShape(s, i), u = x.sizeFromShape(p); + x.assert(i === u, () => `The new shape (${p}) has ${u} elements and the old shape (${n.shape}) has ${i} elements. The new shape and old shape must have the same number of elements.`); + let c = a.texData.get(n.dataId); + return c.isPacked && !Ti(n.shape, p) && !(c.texture !== null && Ti(c.shape, p)) ? gR(n, p, a) : (a.incRef(n.dataId), { dataId: n.dataId, shape: p, dtype: n.dtype }); +} +var xR = { kernelName: Ss, backendName: "webgl", kernelFunc: J }; +var Ol = class { + constructor(e, t10) { + this.variableNames = ["x"]; + let { windowSize: o, batchSize: n, inSize: s, outSize: a } = e; + this.outputShape = [n, a]; + let i = Math.floor(o / 4) * 4, p = o % 4, u = "sumValue += dot(values, ones);"; + if (t10 != null) { + let l = 1 / t10; + u = `sumValue += dot(values * ${x.isInt(l) ? l.toPrecision(2) : l}, ones);`; + } + let c = ""; + s % o > 0 && (c = ` + if (inIdx < 0 || inIdx >= ${s}) { + return 0.0; + } + `), this.userCode = ` + const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0); + + float getValue(int batch, int inIdx) { + ${c} + return getX(batch, inIdx); + } + + void main() { + ivec2 coords = getOutputCoords(); + int batch = coords[0]; + int outIdx = coords[1]; + int inOffset = outIdx * ${o}; + + float sumValue = 0.0; + + for (int i = 0; i < ${i}; i += 4) { + int inIdx = inOffset + i; + vec4 values = vec4( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + getValue(batch, inIdx + 2), + getValue(batch, inIdx + 3) + ); + + ${u} + } + + int inIdx = inOffset + ${i}; + if (${p === 1}) { + vec4 values = vec4(getValue(batch, inIdx), 0.0, 0.0, 0.0); + + ${u} + } else if (${p === 2}) { + vec4 values = vec4( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), 0.0, 0.0); + + ${u} + } else if (${p === 3}) { + vec4 values = vec4( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + getValue(batch, inIdx + 2), 0.0); + + ${u} + } + setOutput(sumValue); + } + `; + } +}; +var ch = class { + constructor(e, t10) { + this.variableNames = ["x"]; + let { windowSize: o, batchSize: n, inSize: s, outSize: a } = e; + this.outputShape = [n, a]; + let i = "0.0", p = ""; + t10 === "prod" ? i = "1.0" : t10 === "min" ? (i = "1.0 / 1e-20", p = "min") : t10 === "max" && (i = "-1.0 / 1e-20", p = "max"); + let u = `${t10}(${t10}(${t10}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`; + t10 === "sum" ? u = "sumValue" : t10 === "prod" ? u = "prodValue" : t10 === "all" ? u = "allValue" : t10 === "any" && (u = "anyValue"); + let c = Math.floor(o / 4) * 4, l = o % 4, m = ` + if (${t10 === "sum"}) { + sumValue += dot(values, ones); + } else if (${t10 === "prod"}) { + vec2 tmp = vec2(values[0], values[1]) * vec2(values[2], values[3]); + prodValue *= tmp[0] * tmp[1]; + } else { + minMaxValue = ${p}(values, minMaxValue); + if (${t10 === "min"} || ${t10 === "max"}) { + minMaxValue = ${p}(values, minMaxValue); + bvec4 isNaN = isnan(values); + if (isNaN.r || isNaN.g || isNaN.b || isNaN.a) { + minMaxValue = vec4(NAN); + } + } + } + `, f = "vec4"; + t10 === "all" ? (i = "1.0", m = ` + bool reducedAllValue = all(values); + float floatedReducedAllValue = float(reducedAllValue); + allValue = float(allValue >= 1.0 && floatedReducedAllValue >= 1.0); + `, f = "bvec4") : t10 === "any" && (i = "0.0", m = ` + bool reducedAnyValue = any(values); + float floatedReducedAnyValue = float(reducedAnyValue); + anyValue = float(anyValue >= 1.0 || floatedReducedAnyValue >= 1.0); + `, f = "bvec4"); + let d = ""; + s % o > 0 && (d = ` + if (inIdx < 0 || inIdx >= ${s}) { + return initializationValue; + } + `), this.userCode = ` + const float initializationValue = ${i}; + const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0); + + float getValue(int batch, int inIdx) { + ${d} + return getX(batch, inIdx); + } + + void main() { + ivec2 coords = getOutputCoords(); + int batch = coords[0]; + int outIdx = coords[1]; + int inOffset = outIdx * ${o}; + + vec4 minMaxValue = vec4(${i}); + float prodValue = 1.0; + float sumValue = 0.0; + float allValue = 1.0; + float anyValue = 0.0; + + for (int i = 0; i < ${c}; i += 4) { + int inIdx = inOffset + i; + ${f} values = ${f}( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + getValue(batch, inIdx + 2), + getValue(batch, inIdx + 3) + ); + + ${m} + } + + int inIdx = inOffset + ${c}; + if (${l === 1}) { + ${f} values = ${f}( + getValue(batch, inIdx), + initializationValue, + initializationValue, + initializationValue + ); + + ${m} + } else if (${l === 2}) { + ${f} values = ${f}( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + initializationValue, + initializationValue + ); + + ${m} + } else if (${l === 3}) { + ${f} values = ${f}( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + getValue(batch, inIdx + 2), + initializationValue + ); + + ${m} + } + setOutput(${u}); + } + `; + } +}; +function CY(r) { + let e = []; + for (; e.length === 0 || e[e.length - 1].outSize !== 1; ) { + let t10 = e.length ? e[e.length - 1].outSize : r[1], o = I.computeOptimalWindowSize(t10); + e.push({ inSize: t10, windowSize: o, outSize: Math.ceil(t10 / o) }); + } + return e; +} +function qr(r, e, t10, o) { + let n = CY(r.shape), s = r; + for (let a = 0; a < n.length; a++) { + let { inSize: i, windowSize: p, outSize: u } = n[a], c, l; + t10 === "mean" ? c = a === 0 ? new Ol({ windowSize: p, inSize: i, batchSize: r.shape[0], outSize: u }, i) : new Ol({ windowSize: p, inSize: i, batchSize: r.shape[0], outSize: u }) : c = new ch({ windowSize: p, inSize: i, batchSize: r.shape[0], outSize: u }, t10), l = s, s = o.runWebGLProgram(c, [s], e), l.dataId !== r.dataId && o.disposeIntermediateTensorInfo(l); + } + return s; +} +var lh = class { + constructor(e, t10) { + this.variableNames = ["A"]; + let o = new Array(e.length); + for (let a = 0; a < o.length; a++) + o[a] = e[t10[a]]; + this.outputShape = o, this.rank = o.length; + let n = _e(this.rank), s = IY(t10); + this.userCode = ` + void main() { + ${n} resRC = getOutputCoords(); + setOutput(getA(${s})); + } + `; + } +}; +function IY(r) { + let e = r.length; + if (e > 6) + throw Error(`Transpose for rank ${e} is not yet supported`); + let t10 = ["resRC.x", "resRC.y", "resRC.z", "resRC.w", "resRC.u", "resRC.v"], o = new Array(e); + for (let n = 0; n < r.length; n++) + o[r[n]] = t10[n]; + return o.join(); +} +var mh = class { + constructor(e, t10) { + this.variableNames = ["A"], this.packedInputs = true, this.packedOutput = true; + let o = new Array(e.length); + for (let c = 0; c < o.length; c++) + o[c] = e[t10[c]]; + if (this.outputShape = o, this.rank = o.length, this.rank > 6) + throw Error(`Packed transpose for rank ${this.rank} is not yet supported.`); + let n = _e(this.rank), s = vw("rc", this.rank), a = new Array(this.rank); + for (let c = 0; c < t10.length; c++) + a[t10[c]] = s[c]; + let i = `vec2(${a.slice(-2).join()})`, p = `++${s[this.rank - 1]} < ${o[this.rank - 1]}`, u = `getChannel(getA(${a.join()}), ${i})`; + this.userCode = ` + void main() { + ${n} rc = getOutputCoords(); + vec4 result = vec4(0.); + result[0] = ${u}; + if(${p}) { + result[1] = ${u}; + } + --${s[this.rank - 1]}; + if(++${s[this.rank - 2]} < ${o[this.rank - 2]}) { + result[2] = ${u}; + if(${p}) { + result[3] = ${u}; + } + } + setOutput(result); + } + `; + } +}; +function _i(r, e, t10) { + let o = P().getBool("WEBGL_PACK_ARRAY_OPERATIONS") ? new mh(r.shape, e) : new lh(r.shape, e); + return t10.runWebGLProgram(o, [r], r.dtype); +} +function yR(r, e, t10, o) { + let n = e, s = r.shape.length, a = x.parseAxisParam(n, r.shape), i = a, p = I.getAxesPermutation(i, s), u = p != null, c = r; + u && (c = _i(r, p, o), i = I.getInnerMostAxes(i.length, s)), I.assertAxesAreInnerMostDims("sum", i, s); + let [l, m] = I.computeOutAndReduceShapes(c.shape, i), f = l; + t10 && (f = I.expandShapeToKeepDim(l, a)); + let d = x.sizeFromShape(m), g = x.sizeFromShape(r.shape) / d, y = J({ inputs: { x: c }, attrs: { shape: [g, d] }, backend: o }), b = Ca(r.dtype), C = qr(y, b, "sum", o), w = J({ inputs: { x: C }, attrs: { shape: f }, backend: o }); + return o.disposeIntermediateTensorInfo(y), o.disposeIntermediateTensorInfo(C), u && o.disposeIntermediateTensorInfo(c), w; +} +function Ou(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { axis: s, keepDims: a } = o; + return yR(n, s, a, t10); +} +var bR = { kernelName: jn, backendName: "webgl", kernelFunc: Ou }; +function xt(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { perm: s } = o, a = t10, i = n.shape.length, p = new Array(i); + for (let c = 0; c < p.length; c++) + p[c] = n.shape[s[c]]; + let u; + if (a.shouldExecuteOnCPU([n])) { + let l = a.texData.get(n.dataId).values, m = Du(l, n.shape, n.dtype, s, p); + u = a.makeTensorInfo(p, n.dtype); + let f = a.texData.get(u.dataId); + f.values = m; + } else + u = _i(n, s, a); + return u; +} +var CR = { kernelName: Mr, backendName: "webgl", kernelFunc: xt }; +var Rw = 1e3; +function Mu({ a: r, b: e, transposeA: t10, transposeB: o, backend: n, bias: s = null, preluActivationWeights: a = null, leakyreluAlpha: i = 0, activation: p = null }) { + let u = r.shape.length, c = e.shape.length, l = t10 ? r.shape[u - 2] : r.shape[u - 1], m = o ? e.shape[c - 1] : e.shape[c - 2], f = t10 ? r.shape[u - 1] : r.shape[u - 2], d = o ? e.shape[c - 2] : e.shape[c - 1], h = r.shape.slice(0, -2), g = e.shape.slice(0, -2), y = x.sizeFromShape(h), b = x.sizeFromShape(g), w = br.assertAndGetBroadcastShape(r.shape.slice(0, -2), e.shape.slice(0, -2)).concat([f, d]); + x.assert(l === m, () => `Error in matMul: inner shapes (${l}) and (${m}) of Tensors with shapes ${r.shape} and ${e.shape} and transposeA=${t10} and transposeB=${o} must match.`); + let k = t10 ? [y, l, f] : [y, f, l], _ = o ? [b, d, m] : [b, m, d], E = J({ inputs: { x: r }, backend: n, attrs: { shape: k } }), R = J({ inputs: { x: e }, backend: n, attrs: { shape: _ } }), A = [E, R], D = Math.max(y, b), O = t10 ? E.shape[1] : E.shape[2], M = s != null, L = a != null, W = p === "leakyrelu", V = p != null ? Ma(p, true) : null, G = M || L || W || V != null, q; + if ((f === 1 || d === 1) && O > Rw && G === false) { + let j = E, Y = R; + t10 && (j = xt({ inputs: { x: E }, backend: n, attrs: { perm: [0, 2, 1] } }), A.push(j)), o && (Y = xt({ inputs: { x: R }, backend: n, attrs: { perm: [0, 2, 1] } }), A.push(Y)); + let Z = d !== 1, ee = d === 1, X = j; + Z && (X = J({ inputs: { x: j }, backend: n, attrs: { shape: [D, O, 1] } }), A.push(X)); + let Q = d === 1 ? 2 : 1, se = Y; + ee && (se = J({ inputs: { x: Y }, backend: n, attrs: { shape: [D, 1, O] } }), A.push(se)); + let ie = Pl({ inputs: { a: X, b: se }, backend: n }); + q = Ou({ inputs: { x: ie }, backend: n, attrs: { axis: Q, keepDims: true } }), A.push(ie); + } else { + let j = ct(r.dtype, e.dtype), Y = new xc(k, _, [D, f, d], t10, o, M, V, L, W), Z = [E, R]; + if (s != null && Z.push(s), L && Z.push(a), W) { + let ee = n.makeTensorInfo([], "float32", x.createScalarValue(i, "float32")); + Z.push(ee), A.push(ee); + } + q = n.runWebGLProgram(Y, Z, j); + } + let H = J({ inputs: { x: q }, backend: n, attrs: { shape: w } }); + A.push(q); + for (let j of A) + n.disposeIntermediateTensorInfo(j); + return H; +} +function wY(r) { + let { inputs: e, backend: t10, attrs: o } = r, { a: n, b: s, bias: a, preluActivationWeights: i } = e, { transposeA: p, transposeB: u, activation: c, leakyreluAlpha: l } = o; + return Mu({ a: n, b: s, transposeA: p, transposeB: u, backend: t10, bias: a, preluActivationWeights: i, leakyreluAlpha: l, activation: c }); +} +var IR = { kernelName: Fo, backendName: "webgl", kernelFunc: wY }; +var wR = "return abs(x);"; +function SY(r) { + let { inputs: e, backend: t10 } = r, { x: o } = e; + if (t10.shouldExecuteOnCPU([o]) && o.dtype !== "complex64") { + let s = t10.texData.get(o.dataId), a = nh(s.values); + return t10.makeTensorInfo(o.shape, o.dtype, a); + } + let n; + return P().getBool("WEBGL_PACK_UNARY_OPERATIONS") ? n = new No(o.shape, wR) : n = new fr(o.shape, wR), t10.runWebGLProgram(n, [o], o.dtype); +} +var SR = { kernelName: sn, backendName: "webgl", kernelFunc: SY }; +var vY = Vt + ` + if (abs(x) > 1.) { + return NAN; + } + return acos(x); +`; +var kY = he({ opSnippet: vY }); +var vR = { kernelName: Li, backendName: "webgl", kernelFunc: kY }; +var TY = Vt + ` + if (x < 1.0) return NAN; +return log(x + sqrt(x * x - 1.0));`; +var NY = he({ opSnippet: TY }); +var kR = { kernelName: Bi, backendName: "webgl", kernelFunc: NY }; +var TR = "return a + b;"; +var _Y = ot({ opSnippet: TR, packedOpSnippet: TR, supportsComplex: true, cpuKernelImpl: s$ }); +var NR = { kernelName: _r, backendName: "webgl", kernelFunc: _Y }; +var fh = class { + constructor(e, t10) { + this.outputShape = [], this.outputShape = e, this.variableNames = t10.map((s, a) => `T${a}`); + let o = []; + this.variableNames.forEach((s) => { + o.push(`float v${s} = get${s}AtOutCoords();`); + }); + let n = this.variableNames.map((s) => `v${s}`).join(" + "); + this.userCode = ` + void main() { + ${o.join(` + `)} + + float result = ${n}; + setOutput(result); + } + `; + } +}; +var dh = class { + constructor(e, t10) { + this.outputShape = [], this.packedInputs = true, this.packedOutput = true, this.outputShape = e, this.variableNames = t10.map((s, a) => `T${a}`); + let o = []; + this.variableNames.forEach((s) => { + o.push(`vec4 v${s} = get${s}AtOutCoords();`); + }); + let n = this.variableNames.map((s) => `v${s}`).join(" + "); + this.userCode = ` + void main() { + ${o.join(` + `)} + + vec4 result = ${n}; + setOutput(result); + } + `; + } +}; +function hh(r) { + let { inputs: e, backend: t10 } = r, o = e; + if (o.length === 1) + return Rt({ inputs: { x: o[0] }, backend: t10 }); + if (o.length > P().get("WEBGL_MAX_TEXTURES_IN_SHADER")) { + let p = Math.floor(o.length / 2), u = hh({ inputs: o.slice(0, p), backend: t10 }), c = hh({ inputs: o.slice(p), backend: t10 }); + return hh({ inputs: [u, c], backend: t10 }); + } + let n = o.map((p) => p.dtype).reduce((p, u) => ct(p, u)), s = o.map((p) => p.shape), i = P().getBool("WEBGL_PACK") ? new dh(o[0].shape, s) : new fh(o[0].shape, s); + return t10.runWebGLProgram(i, o, n); +} +var _R = { kernelName: an, backendName: "webgl", kernelFunc: hh }; +function EY(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { axis: s, keepDims: a } = o, i = n.shape.length, p = x.parseAxisParam(s, n.shape), u = p, c = I.getAxesPermutation(u, i), l = n; + c != null && (l = xt({ inputs: { x: n }, backend: t10, attrs: { perm: c } }), u = I.getInnerMostAxes(u.length, i)), I.assertAxesAreInnerMostDims("all", u, i); + let [m, f] = I.computeOutAndReduceShapes(l.shape, u), d = x.sizeFromShape(f), h = J({ inputs: { x: l }, backend: t10, attrs: { shape: [-1, d] } }), g = qr(h, h.dtype, "all", t10), y; + if (a) { + let b = I.expandShapeToKeepDim(m, p); + y = J({ inputs: { x: g }, backend: t10, attrs: { shape: b } }); + } else + y = J({ inputs: { x: g }, backend: t10, attrs: { shape: m } }); + return t10.disposeIntermediateTensorInfo(h), t10.disposeIntermediateTensorInfo(g), c != null && t10.disposeIntermediateTensorInfo(l), y; +} +var ER = { kernelName: oa, backendName: "webgl", kernelFunc: EY }; +function $Y(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { axis: s, keepDims: a } = o, i = n.shape.length, p = x.parseAxisParam(s, n.shape), u = p, c = I.getAxesPermutation(u, i), l = n; + c != null && (l = xt({ inputs: { x: n }, backend: t10, attrs: { perm: c } }), u = I.getInnerMostAxes(u.length, i)), I.assertAxesAreInnerMostDims("any", u, i); + let [m, f] = I.computeOutAndReduceShapes(l.shape, u), d = x.sizeFromShape(f), h = J({ inputs: { x: l }, backend: t10, attrs: { shape: [-1, d] } }), g = qr(h, h.dtype, "any", t10), y; + if (a) { + let b = I.expandShapeToKeepDim(m, p); + y = J({ inputs: { x: g }, backend: t10, attrs: { shape: b } }); + } else + y = J({ inputs: { x: g }, backend: t10, attrs: { shape: m } }); + return t10.disposeIntermediateTensorInfo(h), t10.disposeIntermediateTensorInfo(g), c != null && t10.disposeIntermediateTensorInfo(l), y; +} +var $R = { kernelName: na, backendName: "webgl", kernelFunc: $Y }; +var gh = class { + constructor(e, t10, o) { + this.variableNames = ["A"]; + let { windowSize: n, batchSize: s, outSize: a } = e; + o || this.variableNames.push("bestIndicesA"), this.outputShape = [s, a]; + let i = t10 === "max" ? ">" : "<", p = o ? "inOffset + i;" : "round(getBestIndicesA(batch, inOffset + i));"; + this.userCode = ` + void main() { + ivec2 coords = getOutputCoords(); + int batch = coords[0]; + int outIdx = coords[1]; + int inOffset = outIdx * ${n}; + + int bestIndex = inOffset; + float bestValue = getA(batch, bestIndex); + + for (int i = 0; i < ${n}; i++) { + int inIdx = ${p}; + float candidate = getA(batch, inIdx); + if (candidate ${i} bestValue) { + bestValue = candidate; + bestIndex = inIdx; + } + } + setOutput(float(bestIndex)); + } + `; + } +}; +var xh = class { + constructor(e, t10, o, n) { + this.variableNames = ["A"], this.packedInputs = true, this.packedOutput = true, x.assert(e.length > 2, () => `Packed arg${o.charAt(0).toUpperCase() + o.slice(1)} supports only inputs with rank above 2.`); + let s = e[e.length - 1], a = Math.ceil(s / t10); + this.outputShape = e.slice(0, -1), a > 1 && this.outputShape.push(a), n || this.variableNames.push("bestIndicesA"); + let i = this.outputShape, p = i.length, u = _e(p), c = $t("coords", p), l, m; + if (a === 1) { + m = p + 1; + let R = _e(m); + l = ` + ${R} sourceLocR = ${R}(${c.join()}, 0); + ++${c[p - 1]}; + ${R} sourceLocG = ${R}(${c.join()}, 0); + ++${c[p - 2]}; + ${R} sourceLocA = ${R}(${c.join()}, 0); + --${c[p - 1]}; + ${R} sourceLocB = ${R}(${c.join()}, 0); + --${c[p - 2]};`; + } else + m = p, l = ` + ${u} sourceLocR = coords; + ++${c[p - 1]}; + ${u} sourceLocG = coords; + ++${c[p - 2]}; + ${u} sourceLocA = coords; + --${c[p - 1]}; + ${u} sourceLocB = coords; + --${c[p - 2]};`; + let f = ["x", "y", "z", "w", "u", "v"].slice(0, m), d = "." + f[m - 1], h = f.map((R) => "int " + R), g = $t("sourceLocR", m - 1).concat("inIdx.r"), y = $t("sourceLocG", m - 1).concat("inIdx.g"), b = $t("sourceLocB", m - 1).concat("inIdx.b"), C = $t("sourceLocA", m - 1).concat("inIdx.a"), w = o === "max" ? "greaterThan" : "lessThan", k = n ? "" : ` + inIdx = round(vec4(getBestIndicesAChannel(${g.join()}), + getBestIndicesAChannel(${y.join()}), + getBestIndicesAChannel(${b.join()}), + getBestIndicesAChannel(${C.join()})));`, _ = `vec4( + getAChannel(${g.join()}), + hasNextCol ? getAChannel(${y.join()}) : 0., + hasNextRow ? getAChannel(${b.join()}) : 0., + hasNextRow && hasNextCol ? getAChannel(${C.join()}) : 0.)`, E = n ? "" : ` + float getBestIndicesAChannel(${h.join()}) { + return getChannel(getBestIndicesA(${f.join()}), + vec2(${f.slice(-2).join()})); + }`; + this.userCode = ` + float getAChannel(${h.join()}) { + return getChannel(getA(${f.join()}), + vec2(${f.slice(-2).join()})); + } + ${E} + void main() { + ${u} coords = getOutputCoords(); + bool hasNextCol = ${c[p - 1]} < ${i[p - 1] - 1}; + bool hasNextRow = ${c[p - 2]} < ${i[p - 2] - 1}; + ${l} + ivec4 srcIdx = ivec4(sourceLocR${d}, sourceLocG${d}, + sourceLocB${d}, sourceLocA${d}) * ${t10}; + ivec4 inIdx = srcIdx; + vec4 bestIndex = vec4(inIdx); + vec4 bestValue = ${_}; + + for (int i = 0; i < ${t10}; i++) { + inIdx = srcIdx; + ${k} + vec4 candidate = ${_}; + bvec4 nan = isnan(candidate); + bvec4 replace = bvec4( + vec4(${w}(candidate, bestValue)) * (vec4(1.0) - vec4(nan))); + + bestValue = vec4(replace.x ? candidate.x : bestValue.x, + replace.y ? candidate.y : bestValue.y, + replace.z ? candidate.z : bestValue.z, + replace.w ? candidate.w : bestValue.w); + bestIndex = mix(bestIndex, vec4(inIdx), vec4(replace)); + srcIdx++; + } + setOutput(bestIndex); + } + `; + } +}; +function RR(r, e, t10, o = null) { + let n = e.shape[0], s = e.shape[1]; + o != null && (n = o.shape[0], s = o.shape[1]); + let a = I.computeOptimalWindowSize(s), i = { windowSize: a, inSize: s, batchSize: n, outSize: Math.ceil(s / a) }, p = new gh(i, t10, o == null), u = [e]; + o != null && u.push(o); + let c = r.runWebGLProgram(p, u, "int32"); + if (c.shape[1] === 1) + return c; + let l = RR(r, e, t10, c); + return r.disposeIntermediateTensorInfo(c), l; +} +function AR(r, e, t10, o = null) { + let n = o != null ? o.shape : e.shape, s = n[n.length - 1], a = I.computeOptimalWindowSize(s), i = new xh(n, a, t10, o == null), p = o == null ? [e] : [e, o], u = r.runWebGLProgram(i, p, "int32"); + if (u.shape.length === e.shape.length) { + let c = AR(r, e, t10, u); + return r.disposeIntermediateTensorInfo(u), c; + } + return u; +} +function yh(r, e, t10, o) { + let n = [t10]; + if (I.assertAxesAreInnerMostDims("arg" + o.charAt(0).toUpperCase() + o.slice(1), n, e.shape.length), !P().getBool("WEBGL_PACK_REDUCE") || e.shape.length <= 2) { + let s = [], a = r.texData.get(e.dataId), i = a !== null && a.isPacked, p = e; + i && (p = r.unpackTensor(e), s.push(p)); + let [u, c] = I.computeOutAndReduceShapes(p.shape, n), l = x.sizeFromShape(c), m = J({ inputs: { x: p }, backend: r, attrs: { shape: [-1, l] } }); + s.push(m); + let f = RR(r, m, o); + s.push(f); + let d = J({ inputs: { x: f }, backend: r, attrs: { shape: u } }); + return s.forEach((h) => r.disposeIntermediateTensorInfo(h)), d; + } + return AR(r, e, o); +} +function RY(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { axis: s } = o, a = x.parseAxisParam(s, n.shape), i = I.getAxesPermutation(a, n.shape.length), p = n, u = []; + i != null && (p = xt({ inputs: { x: n }, backend: t10, attrs: { perm: i } }), u.push(p), a = I.getInnerMostAxes(a.length, p.shape.length)), I.assertAxesAreInnerMostDims("argMax", [a[0]], p.shape.length); + let c = yh(t10, p, a[0], "max"); + return u.forEach((l) => t10.disposeIntermediateTensorInfo(l)), c; +} +var FR = { kernelName: un, backendName: "webgl", kernelFunc: RY }; +function AY(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { axis: s } = o, a = x.parseAxisParam(s, n.shape), i = I.getAxesPermutation(a, n.shape.length), p = n, u = []; + i != null && (p = xt({ inputs: { x: n }, backend: t10, attrs: { perm: i } }), u.push(p), a = I.getInnerMostAxes(a.length, p.shape.length)), I.assertAxesAreInnerMostDims("argMin", [a[0]], p.shape.length); + let c = yh(t10, p, a[0], "min"); + return u.forEach((l) => t10.disposeIntermediateTensorInfo(l)), c; +} +var DR = { kernelName: ja, backendName: "webgl", kernelFunc: AY }; +var FY = Vt + ` + if (abs(x) > 1.) { + return NAN; + } + return asin(x); +`; +var DY = he({ opSnippet: FY }); +var PR = { kernelName: Vi, backendName: "webgl", kernelFunc: DY }; +var PY = Vt + "return log(x + sqrt(x * x + 1.0));"; +var OY = he({ opSnippet: PY }); +var OR = { kernelName: zi, backendName: "webgl", kernelFunc: OY }; +var MY = Vt + ` + return atan(x); +`; +var LY = he({ opSnippet: MY }); +var MR = { kernelName: Wi, backendName: "webgl", kernelFunc: LY }; +var BY = gc + ` + return atan(a, b); +`; +var VY = ` + vec4 result = atan(a, b); + bvec4 isNaNA = isnan(a); + bvec4 isNaNB = isnan(b); + bvec4 isNaN = bvec4(isNaNA.x || isNaNB.x, isNaNA.y || isNaNB.y, isNaNA.z || isNaNB.z, isNaNA.w || isNaNB.w); + ` + js + ` + return result; +`; +var zY = ot({ opSnippet: BY, packedOpSnippet: VY }); +var LR = { kernelName: sa, backendName: "webgl", kernelFunc: zY }; +var WY = Vt + ` + if ((x < -1.0) || (x > 1.0)) return NAN; +return (log(1.0 + x) - log(1.0 - x)) / 2.0;`; +var UY = he({ opSnippet: WY }); +var BR = { kernelName: Ui, backendName: "webgl", kernelFunc: UY }; +var us = class { + constructor(e, t10, o, n = false, s = false) { + if (this.variableNames = ["x"], t10 === "avg" && o) + throw new Error("Cannot compute positions for average pool."); + let a = e.filterWidth, i = e.strideHeight, p = e.strideWidth, u = e.dilationHeight, c = e.dilationWidth, l = e.effectiveFilterHeight, m = e.effectiveFilterWidth, f = e.padInfo.top, d = e.padInfo.left; + this.outputShape = e.outShape; + let h = t10 === "avg", g = `((batch * ${e.inHeight} + xR) * ${e.inWidth} + xC) * ${e.inChannels} + d`, y = `(xR * ${e.inWidth} + xC) * ${e.inChannels} + d`, b = "0.0"; + if (h || (b = "-1.0 / 1e-20"), o) { + let R = ">="; + this.userCode = ` + const ivec2 strides = ivec2(${i}, ${p}); + const ivec2 pads = ivec2(${f}, ${d}); + + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords[0]; + int d = coords[3]; + + ivec2 xRCCorner = coords.yz * strides - pads; + int xRCorner = xRCCorner.x; + int xCCorner = xRCCorner.y; + + // max/min x(?, ?, d) to get y(yR, yC, d). + // ? = to be determined + float minMaxValue = 0.0; + float minMaxValueFound = 0.0; + int minMaxPosition = 0; + float avgValue = 0.0; + + for (int wR = 0; wR < ${l}; + wR += ${u}) { + int xR = xRCorner + wR; + + if (xR < 0 || xR >= ${e.inHeight}) { + continue; + } + + for (int wC = 0; wC < ${m}; + wC += ${c}) { + int xC = xCCorner + wC; + + if (xC < 0 || xC >= ${e.inWidth}) { + continue; + } + + float value = getX(batch, xR, xC, d); + + // If a min / max value has already been found, use it. If not, + // use the current value. + float currMinMaxValue = mix( + value, minMaxValue, minMaxValueFound); + if (value ${R} currMinMaxValue) { + minMaxValue = value; + minMaxValueFound = 1.0; + minMaxPosition = ${n ? s ? g : y : `wR * ${m} + wC`}; + } + } + } + setOutput(float(minMaxPosition)); + } + `; + return; + } + let C = "max", w = `${t10}(${t10}(${t10}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`; + t10 === "avg" && (w = "avgValue / count"); + let k = Math.floor(a / 4) * 4, _ = a % 4, E = ` + if (${h}) { + avgValue += dot(values, ones); + } else { + minMaxValue = ${C}(values, minMaxValue); + } + `; + this.userCode = ` + const ivec2 strides = ivec2(${i}, ${p}); + const ivec2 pads = ivec2(${f}, ${d}); + const float initializationValue = ${b}; + const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0); + + float count = 0.0; + + float getValue(int batch, int xR, int xC, int d) { + if (xC < 0 || xC >= ${e.inWidth}) { + return initializationValue; + } + count += 1.0; + return getX(batch, xR, xC, d); + } + + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords[0]; + int d = coords[3]; + + ivec2 xRCCorner = coords.yz * strides - pads; + int xRCorner = xRCCorner.x; + int xCCorner = xRCCorner.y; + + // max/min x(?, ?, d) to get y(yR, yC, d). + // ? = to be determined + vec4 minMaxValue = vec4(${b}); + float avgValue = 0.0; + count = 0.0; + + for (int wR = 0; wR < ${l}; + wR += ${u}) { + int xR = xRCorner + wR; + + if (xR < 0 || xR >= ${e.inHeight}) { + continue; + } + + for (int wC = 0; wC < ${k}; wC += 4) { + int xC = xCCorner + wC * ${c}; + + vec4 values = vec4( + getValue(batch, xR, xC, d), + getValue(batch, xR, xC + ${c}, d), + getValue(batch, xR, xC + 2 * ${c}, d), + getValue(batch, xR, xC + 3 * ${c}, d) + ); + + ${E} + } + + int xC = xCCorner + ${k}; + if (${_ === 1}) { + vec4 values = vec4( + getValue(batch, xR, xC, d), + initializationValue, + initializationValue, + initializationValue + ); + + ${E} + } else if (${_ === 2}) { + vec4 values = vec4( + getValue(batch, xR, xC, d), + getValue(batch, xR, xC + ${c}, d), + initializationValue, + initializationValue + ); + + ${E} + } else if (${_ === 3}) { + vec4 values = vec4( + getValue(batch, xR, xC, d), + getValue(batch, xR, xC + ${c}, d), + getValue(batch, xR, xC + 2 * ${c}, d), + initializationValue + ); + + ${E} + } + } + setOutput(${w}); + } + `; + } +}; +var Ei = class { + constructor(e, t10, o, n = false, s = false) { + if (this.variableNames = ["x"], t10 === "avg" && o) + throw new Error("Cannot compute positions for average pool."); + let a = e.filterWidth, i = e.strideDepth, p = e.strideHeight, u = e.strideWidth, c = e.dilationDepth, l = e.dilationHeight, m = e.dilationWidth, f = e.effectiveFilterDepth, d = e.effectiveFilterHeight, h = e.effectiveFilterWidth, g = e.padInfo.front, y = e.padInfo.top, b = e.padInfo.left; + this.outputShape = e.outShape; + let C = t10 === "avg", w = "0.0"; + if (C || (w = "-1.0 / 1e-20"), o) { + let D = ">="; + this.userCode = ` + const ivec3 strides = + ivec3(${i}, ${p}, ${u}); + const ivec3 pads = ivec3(${g}, ${y}, ${b}); + + void main() { + ivec5 coords = getOutputCoords(); + int batch = coords.x; + int ch = coords.u; + + ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads; + int xDCorner = xCorner.x; + int xRCorner = xCorner.y; + int xCCorner = xCorner.z; + + // max/min x(?, ?, ?, ch) to get y(yD, yR, yC, ch). + // ? = to be determined + float minMaxValue = 0.0; + float minMaxValueFound = 0.0; + int minMaxPosition = 0; + + for (int wD = 0; wD < ${f}; + wD += ${c}) { + int xD = xDCorner + wD; + + if (xD < 0 || xD >= ${e.inDepth}) { + continue; + } + + for (int wR = 0; wR < ${d}; + wR += ${l}) { + int xR = xRCorner + wR; + + if (xR < 0 || xR >= ${e.inHeight}) { + continue; + } + + for (int wC = 0; wC < ${h}; + wC += ${m}) { + int xC = xCCorner + wC; + + if (xC < 0 || xC >= ${e.inWidth}) { + continue; + } + + float value = getX(batch, xD, xR, xC, ch); + + // If a min / max value has already been found, use it. If not, + // use the current value. + float currMinMaxValue = mix( + value, minMaxValue, minMaxValueFound); + if (value ${D} currMinMaxValue) { + minMaxValue = value; + minMaxValueFound = 1.0; + minMaxPosition = ${n ? s ? `(((batch * ${e.inDepth} + xD) * ${e.inHeight} + xR) * ${e.inWidth} + xC) * ${e.inChannels} + ch` : `((xD * ${e.inHeight} + xR) * ${e.inWidth} + xC) * ${e.inChannels} + ch` : `wD * ${d} * ${h} + + wR * ${h} + wC`}; + } + } + } + } + setOutput(float(minMaxPosition)); + } + `; + return; + } + let k = "max", _ = `${t10}(${t10}(${t10}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`; + t10 === "avg" && (_ = "avgValue / count"); + let E = Math.floor(a / 4) * 4, R = a % 4, A = ` + if (${C}) { + avgValue += dot(values, ones); + } else { + minMaxValue = ${k}(values, minMaxValue); + } + `; + this.userCode = ` + const ivec3 strides = + ivec3(${i}, ${p}, ${u}); + const ivec3 pads = ivec3(${g}, ${y}, ${b}); + const float initializationValue = ${w}; + const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0); + + float count = 0.0; + + float getValue(int batch, int xD, int xR, int xC, int ch) { + if (xC < 0 || xC >= ${e.inWidth}) { + return initializationValue; + } + count += 1.0; + return getX(batch, xD, xR, xC, ch); + } + + void main() { + ivec5 coords = getOutputCoords(); + int batch = coords.x; + int ch = coords.u; + + ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads; + int xDCorner = xCorner.x; + int xRCorner = xCorner.y; + int xCCorner = xCorner.z; + + // max/min x(?, ?, ?, d) to get y(yD, yR, yC, ch). + // ? = to be determined + vec4 minMaxValue = vec4(${w}); + float avgValue = 0.0; + count = 0.0; + + for (int wD = 0; wD < ${f}; + wD += ${c}) { + int xD = xDCorner + wD; + + if (xD < 0 || xD >= ${e.inDepth}) { + continue; + } + + for (int wR = 0; wR < ${d}; + wR += ${l}) { + int xR = xRCorner + wR; + + if (xR < 0 || xR >= ${e.inHeight}) { + continue; + } + + for (int wC = 0; wC < ${E}; wC += 4) { + int xC = xCCorner + wC * ${m}; + + vec4 values = vec4( + getValue(batch, xD, xR, xC, ch), + getValue(batch, xD, xR, xC + ${m}, ch), + getValue(batch, xD, xR, xC + 2 * ${m}, ch), + getValue(batch, xD, xR, xC + 3 * ${m}, ch) + ); + + ${A} + } + + int xC = xCCorner + ${E}; + if (${R === 1}) { + vec4 values = vec4( + getValue(batch, xD, xR, xC, ch), + initializationValue, + initializationValue, + initializationValue + ); + + ${A} + } else if (${R === 2}) { + vec4 values = vec4( + getValue(batch, xD, xR, xC, ch), + getValue(batch, xD, xR, xC + ${m}, ch), + initializationValue, + initializationValue + ); + + ${A} + } else if (${R === 3}) { + vec4 values = vec4( + getValue(batch, xD, xR, xC, ch), + getValue(batch, xD, xR, xC + ${m}, ch), + getValue(batch, xD, xR, xC + 2 * ${m}, ch), + initializationValue + ); + + ${A} + } + } + setOutput(${_}); + } + } + `; + } +}; +function GY(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e; + as(n, "avgPool"); + let { filterSize: s, strides: a, pad: i, dimRoundingMode: p } = o, u = 1; + x.assert(I.eitherStridesOrDilationsAreOne(a, u), () => `Error in avgPool: Either strides or dilations must be 1. Got strides ${a} and dilations '${u}'`); + let c = I.computePool2DInfo(n.shape, s, a, u, i, p); + if (c.filterWidth === 1 && c.filterHeight === 1 && x.arraysEqual(c.inShape, c.outShape)) + return Rt({ inputs: { x: n }, backend: t10 }); + let l = new us(c, "avg", false); + return t10.runWebGLProgram(l, [n], "float32"); +} +var VR = { kernelName: pn, backendName: "webgl", kernelFunc: GY }; +function HY(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { filterSize: s, strides: a, pad: i, dimRoundingMode: p, dataFormat: u } = o, c = [1, 1, 1], l = I.computePool3DInfo(n.shape, s, a, c, i, p, u), m = new Ei(l, "avg", false); + return t10.runWebGLProgram(m, [n], "float32"); +} +var zR = { kernelName: ip, backendName: "webgl", kernelFunc: HY }; +var bh = class { + constructor(e) { + this.variableNames = ["dy"], this.outputShape = e.inShape; + let t10 = e.filterHeight, o = e.filterWidth, n = e.strideHeight, s = e.strideWidth, a = e.dilationHeight, i = e.dilationWidth, p = e.effectiveFilterHeight, u = e.effectiveFilterWidth, c = p - 1 - e.padInfo.top, l = u - 1 - e.padInfo.left, m = 1 / (t10 * o); + this.userCode = ` + const ivec2 pads = ivec2(${c}, ${l}); + const float avgMultiplier = float(${m}); + + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + + ivec2 dyRCCorner = coords.yz - pads; + int dyRCorner = dyRCCorner.x; + int dyCCorner = dyRCCorner.y; + + // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + for (int wR = 0; wR < ${p}; + wR += ${a}) { + float dyR = float(dyRCorner + wR) / ${n}.0; + + if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) { + continue; + } + int idyR = int(dyR); + + for (int wC = 0; wC < ${u}; + wC+= ${i}) { + float dyC = float(dyCCorner + wC) / ${s}.0; + + if (dyC < 0.0 || dyC >= ${e.outWidth}.0 || + fract(dyC) > 0.0) { + continue; + } + int idyC = int(dyC); + + float dyValue = getDy(b, idyR, idyC, d); + + dotProd += dyValue * avgMultiplier; + } + } + setOutput(dotProd); + } + `; + } +}; +var Ch = class { + constructor(e) { + this.variableNames = ["dy"], this.outputShape = e.inShape; + let t10 = e.filterDepth, o = e.filterHeight, n = e.filterWidth, s = e.strideDepth, a = e.strideHeight, i = e.strideWidth, p = e.dilationDepth, u = e.dilationHeight, c = e.dilationWidth, l = e.effectiveFilterDepth, m = e.effectiveFilterHeight, f = e.effectiveFilterWidth, d = l - 1 - e.padInfo.front, h = m - 1 - e.padInfo.top, g = f - 1 - e.padInfo.left, y = 1 / (t10 * o * n); + this.userCode = ` + const ivec3 pads = ivec3(${d}, ${h}, ${g}); + const float avgMultiplier = float(${y}); + + void main() { + ivec5 coords = getOutputCoords(); + int batch = coords.x; + int ch = coords.u; + + ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads; + int dyDCorner = dyCorner.x; + int dyRCorner = dyCorner.y; + int dyCCorner = dyCorner.z; + + // Convolve dy(?, ?, ?, d) with pos mask(:, :, :, ch) to get + // dx(xD, xR, xC, ch). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + + for (int wD = 0; wD < ${l}; + wD += ${p}) { + float dyD = float(dyDCorner + wD) / ${s}.0; + + if (dyD < 0.0 || dyD >= ${e.outDepth}.0 || fract(dyD) > 0.0) { + continue; + } + int idyD = int(dyD); + + for (int wR = 0; wR < ${m}; + wR += ${u}) { + float dyR = float(dyRCorner + wR) / ${a}.0; + + if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || + fract(dyR) > 0.0) { + continue; + } + int idyR = int(dyR); + + for (int wC = 0; wC < ${f}; + wC += ${c}) { + float dyC = float(dyCCorner + wC) / ${i}.0; + + if (dyC < 0.0 || dyC >= ${e.outWidth}.0 || + fract(dyC) > 0.0) { + continue; + } + int idyC = int(dyC); + + float dyValue = getDy(batch, idyD, idyR, idyC, ch); + + dotProd += dyValue * avgMultiplier; + } + } + } + setOutput(dotProd); + } + `; + } +}; +function qY(r) { + let { inputs: e, backend: t10, attrs: o } = r, { dy: n, input: s } = e, a = s, { filterSize: i, strides: p, pad: u, dimRoundingMode: c } = o, l = [1, 1, 1], m = I.computePool3DInfo(a.shape, i, p, l, u, c), f = new Ch(m); + return t10.runWebGLProgram(f, [n], a.dtype); +} +var WR = { kernelName: Fm, backendName: "webgl", kernelFunc: qY }; +function KY(r) { + let { inputs: e, backend: t10, attrs: o } = r, { dy: n, input: s } = e, a = s; + as([n, s], "avgPoolGrad"); + let { filterSize: i, strides: p, pad: u } = o, c = I.computePool2DInfo(a.shape, i, p, 1, u), l = new bh(c); + return t10.runWebGLProgram(l, [n], a.dtype); +} +var UR = { kernelName: Am, backendName: "webgl", kernelFunc: KY }; +function jY(r) { + let { inputs: e, backend: t10, attrs: o } = r, { a: n, b: s } = e, { transposeA: a, transposeB: i } = o; + return Mu({ a: n, b: s, transposeA: a, transposeB: i, backend: t10 }); +} +var GR = { kernelName: cn, backendName: "webgl", kernelFunc: jY }; +var Ih = class { + constructor(e, t10, o, n, s, a) { + this.outputShape = [], this.variableNames = ["x", "mean", "variance"], I.assertAndGetBroadcastShape(e, t10), I.assertAndGetBroadcastShape(e, o); + let i = "0.0"; + n != null && (I.assertAndGetBroadcastShape(e, n), this.variableNames.push("offset"), i = "getOffsetAtOutCoords()"); + let p = "1.0"; + s != null && (I.assertAndGetBroadcastShape(e, s), this.variableNames.push("scale"), p = "getScaleAtOutCoords()"), this.outputShape = e, this.userCode = ` + void main() { + float x = getXAtOutCoords(); + float mean = getMeanAtOutCoords(); + float variance = getVarianceAtOutCoords(); + float offset = ${i}; + float scale = ${p}; + float inv = scale * inversesqrt(variance + float(${a})); + setOutput(dot(vec3(x, -mean, offset), vec3(inv, inv, 1))); + } + `; + } +}; +var wh = class { + constructor(e, t10, o, n, s, a) { + this.packedInputs = true, this.packedOutput = true, this.variableNames = ["x", "mean", "variance"], I.assertAndGetBroadcastShape(e, t10), I.assertAndGetBroadcastShape(e, o); + let i = "vec4(0.0)"; + n != null && (I.assertAndGetBroadcastShape(e, n), this.variableNames.push("offset"), i = "getOffsetAtOutCoords()"); + let p = "vec4(1.0)"; + s != null && (I.assertAndGetBroadcastShape(e, s), this.variableNames.push("scale"), p = "getScaleAtOutCoords()"), this.outputShape = e, this.userCode = ` + void main() { + vec4 offset = ${i}; + vec4 scale = ${p}; + + vec4 x = getXAtOutCoords(); + vec4 mean = getMeanAtOutCoords(); + vec4 variance = getVarianceAtOutCoords(); + + vec4 inv = scale * inversesqrt(variance + vec4(${a})); + + setOutput((x - mean) * inv + offset); + } + `; + } +}; +var XY = ({ inputs: r, backend: e, attrs: t10 }) => { + let { x: o, mean: n, variance: s, offset: a, scale: i } = r; + x.assert(n.shape.length === s.shape.length, () => "Batch normalization gradient requires mean and variance to have equal ranks."), x.assert(a == null || n.shape.length === a.shape.length, () => "Batch normalization gradient requires mean and offset to have equal ranks."), x.assert(i == null || n.shape.length === i.shape.length, () => "Batch normalization gradient requires mean and scale to have equal ranks."); + let { varianceEpsilon: p } = t10; + p == null && (p = 1e-3); + let u = [o, n, s], c = null; + a != null && (c = a.shape, u.push(a)); + let l = null; + i != null && (l = i.shape, u.push(i)); + let m = P().getBool("WEBGL_PACK_NORMALIZATION") ? new wh(o.shape, n.shape, s.shape, c, l, p) : new Ih(o.shape, n.shape, s.shape, c, l, p); + return e.runWebGLProgram(m, u, u[0].dtype); +}; +var HR = { kernelName: kn, backendName: "webgl", kernelFunc: XY }; +var Sh = class { + constructor(e) { + this.variableNames = ["source"], this.outputShape = e, this.rank = e.length; + let t10 = _e(this.rank); + this.customUniforms = [{ name: "start", arrayIndex: this.rank, type: "int" }]; + let o = YY(this.rank), n, s = e.map((a, i) => `sourceLoc.${Aw[i]} = start[${i}] + coords.${Aw[i]};`); + n = ` + ${t10} sourceLoc; + ${t10} coords = getOutputCoords(); + ${s.join(` +`)} + `, this.userCode = ` + void main() { + ${n} + setOutput(getSource(${o})); + } + `; + } +}; +var Aw = ["x", "y", "z", "w", "u", "v"]; +function YY(r) { + if (r === 1) + return "sourceLoc"; + if (r <= 6) + return Aw.slice(0, r).map((e) => "sourceLoc." + e).join(","); + throw Error(`Slicing for rank ${r} is not yet supported`); +} +var vh = class { + constructor(e) { + this.variableNames = ["source"], this.packedInputs = true, this.packedOutput = true, this.outputShape = e, this.rank = e.length, this.customUniforms = [{ name: "start", arrayIndex: this.rank, type: "int" }]; + let t10 = _e(this.rank), o = $t("coords", this.rank), n = $t("sourceLoc", this.rank), s = this.rank === 1 ? "sourceLoc" : `vec2(${n.slice(-2).join()})`, a = `getChannel(getSource(${n.join()}), ${s})`, i = ` + result.x = ${a}; + if (++${o[this.rank - 1]} < ${e[this.rank - 1]}) { + ++${n[this.rank - 1]}; + result.y = ${a}; + --${n[this.rank - 1]}; + } + `, p = this.rank === 1 ? "" : ` + --${o[this.rank - 1]}; + if (++${o[this.rank - 2]} < ${e[this.rank - 2]}) { + ++${n[this.rank - 2]}; + result.z = ${a}; + if (++${o[this.rank - 1]} < ${e[this.rank - 1]}) { + ++${n[this.rank - 1]}; + result.w = ${a}; + } + } + `, u = this.rank <= 4 ? `sourceLoc = coords + + ${t10}(${e.map((c, l) => `start[${l}]`).join()});` : e.map((c, l) => `${n[l]} = ${o[l]} + start[${l}];`).join(` +`); + this.userCode = ` + void main() { + ${t10} coords = getOutputCoords(); + ${t10} sourceLoc; + ${u} + vec4 result = vec4(0.); + ${i} + ${p} + setOutput(result); + } + `; + } +}; +function QY(r, e, t10, o) { + let n = o.texData.get(r.dataId), s = o.makeTensorInfo(t10, r.dtype), a = o.texData.get(s.dataId); + Object.assign(a, n), a.refCount = 1, a.shape = t10, a.dtype = r.dtype; + let i = et.computeFlatOffset(e, x.computeStrides(r.shape)); + n.slice && (i += n.slice.flatOffset), a.slice = { flatOffset: i, origDataId: n.slice && n.slice.origDataId || r.dataId }; + let p = o.dataRefCount.get(a.slice.origDataId) || 1; + return o.dataRefCount.set(a.slice.origDataId, p + 1), s; +} +function ps(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { begin: s, size: a } = o, [i, p] = et.parseSliceParams(n, s, a); + if (et.assertParamsValid(n, i, p), x.sizeFromShape(p) === 0) + return t10.makeTensorInfo(p, n.dtype, []); + if (t10.shouldExecuteOnCPU([n]) || n.dtype === "string") { + let l = t10.texData.get(n.dataId), m = O$(l.values, i, p, n.shape, n.dtype); + return t10.makeTensorInfo(p, n.dtype, m); + } + let { isPacked: u } = t10.texData.get(n.dataId), c = et.isSliceContinous(n.shape, i, p); + if (u || !c) { + let l = P().getBool("WEBGL_PACK_ARRAY_OPERATIONS") ? new vh(p) : new Sh(p), m = [i]; + return t10.runWebGLProgram(l, [n], n.dtype, m); + } + return t10.uploadToGPU(n.dataId), QY(n, i, p, t10); +} +var qR = { kernelName: qn, backendName: "webgl", kernelFunc: ps }; +var ZY = (r) => { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { blockShape: s, crops: a } = o; + x.assert(n.shape.length <= 4, () => "batchToSpaceND for rank > 4 with a WebGL backend not implemented yet"); + let i = s.reduce((b, C) => b * C), p = I.getReshaped(n.shape, s, i), u = I.getPermuted(p.length, s.length), c = I.getReshapedPermuted(n.shape, s, i), l = I.getSliceBeginCoords(a, s.length), m = I.getSliceSize(c, a, s.length), f = [], d = J({ inputs: { x: n }, backend: t10, attrs: { shape: p } }), h = xt({ inputs: { x: d }, backend: t10, attrs: { perm: u } }), g = J({ inputs: { x: h }, backend: t10, attrs: { shape: c } }), y = ps({ inputs: { x: g }, backend: t10, attrs: { begin: l, size: m } }); + return f.push(d), f.push(h), f.push(g), f.forEach((b) => t10.disposeIntermediateTensorInfo(b)), y; +}; +var KR = { kernelName: hs, backendName: "webgl", kernelFunc: ZY }; +function JY(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, weights: s } = e, { size: a } = o, i = t10.readSync(n.dataId), p = t10.readSync(s.dataId), u = oh(i, p, s.dtype, s.shape, a); + return t10.makeTensorInfo([a], s.dtype, u); +} +var jR = { kernelName: up, backendName: "webgl", kernelFunc: JY }; +function eQ(r) { + let { inputs: e, backend: t10 } = r, { s0: o, s1: n } = e, s = t10.readSync(o.dataId), a = t10.readSync(n.dataId), i = I.assertAndGetBroadcastShape(Array.from(s), Array.from(a)); + return t10.makeTensorInfo([i.length], "int32", Int32Array.from(i)); +} +var XR = { kernelName: pp, backendName: "webgl", kernelFunc: eQ }; +var tQ = "return float(a != b);"; +var Fw = ot({ opSnippet: tQ, cpuKernelImpl: N$, dtype: "bool" }); +var YR = { kernelName: go, backendName: "webgl", kernelFunc: Fw }; +function La(r) { + let { inputs: e, backend: t10 } = r, { input: o } = e, n = t10.texData.get(o.dataId); + return Rt({ inputs: { x: n.complexTensorInfos.real }, backend: t10 }); +} +var QR = { kernelName: la, backendName: "webgl", kernelFunc: La }; +var rQ = "return float(int(x));"; +function ZR(r, e) { + let t10 = new fr(r.shape, rQ), o = e.runWebGLProgram(t10, [r], "int32"); + return { dataId: o.dataId, shape: o.shape, dtype: o.dtype }; +} +function Dw(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { dtype: s } = o; + if (s === "complex64") { + if (n.dtype === "complex64") + return Rt({ inputs: { x: n }, backend: t10 }); + let a = Wr(n.shape), i = Dw({ inputs: { x: n }, backend: t10, attrs: { dtype: "float32" } }), p = Ar({ inputs: { real: i, imag: a }, backend: t10 }); + return a.dispose(), t10.disposeIntermediateTensorInfo(i), p; + } + if (n.dtype === "complex64") { + let a = La({ inputs: { input: n }, backend: t10 }), i = Dw({ inputs: { x: a }, backend: t10, attrs: { dtype: s } }); + return t10.disposeIntermediateTensorInfo(a), i; + } + if (!x.hasEncodingLoss(n.dtype, s)) { + let a = Rt({ inputs: { x: n }, backend: t10 }); + return { dataId: a.dataId, shape: a.shape, dtype: s }; + } + if (t10.shouldExecuteOnCPU([n])) { + let a = t10.texData.get(n.dataId).values, [i, p, u] = i$(a, n.shape, n.dtype, s); + return t10.makeTensorInfo(i, p, u); + } + if (s === "int32") + return ZR(n, t10); + if (s === "bool") { + let a = t10.makeTensorInfo([], "bool", x.getTypedArrayFromDType("bool", 1)), p = Fw({ inputs: { a: n, b: a }, backend: t10 }); + return t10.disposeIntermediateTensorInfo(a), p; + } + throw new Error(`Error in Cast: failed to cast ${n.dtype} to ${s}`); +} +var JR = { kernelName: to, backendName: "webgl", kernelFunc: Dw }; +var eA = "return ceil(x);"; +var oQ = he({ opSnippet: eA, packedOpSnippet: eA, cpuKernelImpl: u$ }); +var tA = { kernelName: ro, backendName: "webgl", kernelFunc: oQ }; +var kh = class { + constructor(e) { + this.variableNames = ["A"], this.customUniforms = [{ name: "minVal", type: "float" }, { name: "maxVal", type: "float" }], this.outputShape = e, this.userCode = ` + + void main() { + float value = getAAtOutCoords(); + if (isnan(value)) { + setOutput(value); + return; + } + + setOutput(clamp(value, minVal, maxVal)); + } + `; + } +}; +var Th = class { + constructor(e) { + this.variableNames = ["A"], this.packedInputs = true, this.packedOutput = true, this.customUniforms = [{ name: "minVal", type: "float" }, { name: "maxVal", type: "float" }], this.outputShape = e, this.userCode = ` + void main() { + vec4 value = getAAtOutCoords(); + + if (any(isnan(value))) { + setOutput(value); + return; + } + + setOutput(clamp(value, vec4(minVal), vec4(maxVal))); + } + `; + } +}; +function nQ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { clipValueMin: s, clipValueMax: a } = o, i; + P().getBool("WEBGL_PACK_CLIP") ? i = new Th(n.shape) : i = new kh(n.shape); + let p = [[s], [a]]; + return t10.runWebGLProgram(i, [n], n.dtype, p); +} +var rA = { kernelName: Ro, backendName: "webgl", kernelFunc: nQ }; +var Nh = class { + constructor(e) { + this.variableNames = ["real", "imag"], this.outputShape = e, this.userCode = ` + void main() { + float re = abs(getRealAtOutCoords()); + float im = abs(getImagAtOutCoords()); + float mx = max(re, im); + + // sadly the length function in glsl is not underflow-safe + // (at least not on Intel GPUs). So the safe solution is + // to ensure underflow-safety in all cases. + setOutput( + mx == 0.0 ? 0.0 : mx * length(vec2(1, min(re, im)/mx)) + ); + } + `; + } +}; +function oA(r, e) { + return { dataId: e.dataId, dtype: e.dtype, shape: r.shape }; +} +function sQ(r) { + let { inputs: e, backend: t10 } = r, { x: o } = e, n = t10.texData.get(o.dataId), s = new Nh(o.shape), a = [oA(o, n.complexTensorInfos.real), oA(o, n.complexTensorInfos.imag)]; + return t10.runWebGLProgram(s, a, a[0].dtype); +} +var nA = { kernelName: cp, backendName: "webgl", kernelFunc: sQ }; +var _h = class { + constructor(e) { + this.outputShape = [], this.outputShape = I.computeOutShape(e, 1), this.variableNames = e.map((a, i) => `T${i}`); + let t10 = new Array(e.length - 1); + t10[0] = e[0][1]; + for (let a = 1; a < t10.length; a++) + t10[a] = t10[a - 1] + e[a][1]; + let o = [`if (yC < ${t10[0]}) setOutput(getT0(yR, yC));`]; + for (let a = 1; a < t10.length; a++) { + let i = t10[a - 1]; + o.push(`else if (yC < ${t10[a]}) setOutput(getT${a}(yR, yC-${i}));`); + } + let n = t10.length, s = t10[t10.length - 1]; + o.push(`else setOutput(getT${n}(yR, yC-${s}));`), this.userCode = ` + void main() { + ivec2 coords = getOutputCoords(); + int yR = coords.x; + int yC = coords.y; + + ${o.join(` + `)} + } + `; + } +}; +var $h = class { + constructor(e, t10) { + this.packedInputs = true, this.packedOutput = true, this.outputShape = [], this.outputShape = I.computeOutShape(e, t10); + let o = this.outputShape, n = o.length, s = _e(n), a = $t("coords", n), i = ["x", "y", "z", "w", "u", "v"].slice(0, n); + this.variableNames = e.map((h, g) => `T${g}`); + let p = new Array(e.length - 1); + p[0] = e[0][t10]; + for (let h = 1; h < p.length; h++) + p[h] = p[h - 1] + e[h][t10]; + let u = i[t10], c = i.slice(-2), l = i.join(), m = `if (${u} < ${p[0]}) { + return getChannel( + getT0(${l}), vec2(${c.join()})); + }`; + for (let h = 1; h < p.length; h++) { + let g = p[h - 1]; + m += ` + if (${u} < ${p[h]} && ${u} >= ${p[h - 1]}) { + return getChannel( + getT${h}(${Eh(i, u, g)}), + vec2(${Eh(c, u, g)})); + }`; + } + let f = p.length, d = p[p.length - 1]; + m += ` + return getChannel( + getT${f}(${Eh(i, u, d)}), + vec2(${Eh(c, u, d)}));`, this.userCode = ` + float getValue(${i.map((h) => "int " + h)}) { + ${m} + } + + void main() { + ${s} coords = getOutputCoords(); + vec4 result = vec4(getValue(${a}), 0., 0., 0.); + + ${a[n - 1]} = ${a[n - 1]} + 1; + if (${a[n - 1]} < ${o[n - 1]}) { + result.g = getValue(${a}); + } + + ${a[n - 2]} = ${a[n - 2]} + 1; + if (${a[n - 2]} < ${o[n - 2]}) { + result.a = getValue(${a}); + } + + ${a[n - 1]} = ${a[n - 1]} - 1; + if (${a[n - 2]} < ${o[n - 2]} && + ${a[n - 1]} < ${o[n - 1]}) { + result.b = getValue(${a}); + } + setOutput(result); + } + `; + } +}; +function Eh(r, e, t10) { + let o = r.indexOf(e); + return r.map((s, a) => a === o ? `${s} - ${t10}` : s).join(); +} +function Lu(r) { + let { inputs: e, backend: t10 } = r, { input: o } = e, n = t10.texData.get(o.dataId); + return Rt({ inputs: { x: n.complexTensorInfos.imag }, backend: t10 }); +} +var sA = { kernelName: Ya, backendName: "webgl", kernelFunc: Lu }; +function yc(r, e, t10) { + let o = r[0].dtype; + if (o === "complex64") { + let l = r.map((g) => La({ inputs: { input: g }, backend: t10 })), m = r.map((g) => Lu({ inputs: { input: g }, backend: t10 })), f = yc(l, e, t10), d = yc(m, e, t10), h = Ar({ inputs: { real: f, imag: d }, backend: t10 }); + return l.forEach((g) => t10.disposeIntermediateTensorInfo(g)), m.forEach((g) => t10.disposeIntermediateTensorInfo(g)), t10.disposeIntermediateTensorInfo(f), t10.disposeIntermediateTensorInfo(d), h; + } + let n = t10.shouldExecuteOnCPU(r); + if (o === "string" && (n = true), n) { + let l = r.map((b) => { + let w = [-1, x.sizeFromShape(b.shape.slice(e))]; + return J({ inputs: { x: b }, backend: t10, attrs: { shape: w } }); + }), m = l.map((b) => ({ vals: t10.readSync(b.dataId), shape: b.shape })), f = I.computeOutShape(l.map((b) => b.shape), 1), d = l[0].shape[0] === 1, h = p$(m, f, o, d), g = I.computeOutShape(r.map((b) => b.shape), e), y = t10.makeTensorInfo(g, o, h); + return l.forEach((b) => t10.disposeIntermediateTensorInfo(b)), y; + } + let s = P().getNumber("WEBGL_MAX_TEXTURES_IN_SHADER"); + if (r.length > s) { + let l = []; + for (let f = 0; f < r.length; f += s) { + let d = r.slice(f, f + s); + l.push(yc(d, e, t10)); + } + let m = yc(l, e, t10); + for (let f of l) + t10.disposeIntermediateTensorInfo(f); + return m; + } + if (P().getBool("WEBGL_PACK_ARRAY_OPERATIONS") && r[0].shape.length > 1) { + let l = new $h(r.map((m) => m.shape), e); + return t10.runWebGLProgram(l, r, o); + } + let { tensors2D: a, outShape: i } = aQ(r, e, t10), p = new _h(a.map((l) => l.shape)), u = t10.runWebGLProgram(p, a, o); + a.forEach((l) => t10.disposeIntermediateTensorInfo(l)); + let c = J({ inputs: { x: u }, attrs: { shape: i }, backend: t10 }); + return t10.disposeIntermediateTensorInfo(u), c; +} +function aQ(r, e, t10) { + let o = I.computeOutShape(r.map((s) => s.shape), e); + return { tensors2D: r.map((s) => J({ inputs: { x: s }, attrs: { shape: [-1, x.sizeFromShape(s.shape.slice(e))] }, backend: t10 })), outShape: o }; +} +function Pw(r) { + let { inputs: e, backend: t10, attrs: o } = r, { axis: n } = o, s = x.parseAxisParam(n, e[0].shape)[0], a = e.map((u) => u.shape); + I.assertParamsConsistent(a, s); + let i = I.computeOutShape(e.map((u) => u.shape), s); + if (x.sizeFromShape(i) === 0) + return t10.makeTensorInfo(i, e[0].dtype, []); + let p = e.filter((u) => x.sizeFromShape(u.shape) > 0); + return p.length === 1 ? Rt({ inputs: { x: p[0] }, backend: t10 }) : yc(p, s, t10); +} +var aA = { kernelName: gs, backendName: "webgl", kernelFunc: Pw }; +var bc = class { + constructor(e, t10 = false, o = null, n = false, s = false) { + this.variableNames = ["x", "W"], this.outputShape = e.outShape; + let a = e.padInfo.top, i = e.padInfo.left, p = e.strideHeight, u = e.strideWidth, c = e.dilationHeight, l = e.dilationWidth, m = e.filterHeight, f = e.filterWidth, d = Math.floor(e.inChannels / 4) * 4, h = e.inChannels % 4, g = e.dataFormat === "channelsLast", y = g ? 1 : 2, b = g ? 2 : 3, C = g ? 3 : 1, w = "", k = ""; + o && (n ? w = `float activation(float a) { + float b = getPreluActivationWeightsAtOutCoords(); + ${o} + }` : s ? w = `float activation(float a) { + float b = getLeakyreluAlphaAtOutCoords(); + ${o} + }` : w = ` + float activation(float x) { + ${o} + } + `, k = "result = activation(result);"); + let _ = t10 ? "result += getBiasAtOutCoords();" : ""; + t10 && this.variableNames.push("bias"), n && this.variableNames.push("preluActivationWeights"), s && this.variableNames.push("leakyreluAlpha"), this.userCode = ` + ${w} + + const ivec2 strides = ivec2(${p}, ${u}); + const ivec2 pads = ivec2(${a}, ${i}); + + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords[0]; + int d2 = coords[${C}]; + + ivec2 xRCCorner = + ivec2(coords[${y}], coords[${b}]) * strides - pads; + int xRCorner = xRCCorner.x; + int xCCorner = xRCCorner.y; + + // Convolve x(?, ?, d1) with w(:, :, d1, d2) to get y(yR, yC, d2). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + for (int wR = 0; wR < ${m}; wR++) { + int xR = xRCorner + wR * ${c}; + + if (xR < 0 || xR >= ${e.inHeight}) { + continue; + } + + for (int wC = 0; wC < ${f}; wC++) { + int xC = xCCorner + wC * ${l}; + + if (xC < 0 || xC >= ${e.inWidth}) { + continue; + } + + for (int d1 = 0; d1 < ${d}; d1 += 4) { + vec4 wValues = vec4( + getW(wR, wC, d1, d2), + getW(wR, wC, d1 + 1, d2), + getW(wR, wC, d1 + 2, d2), + getW(wR, wC, d1 + 3, d2) + ); + + if (${g}) { + vec4 xValues = vec4( + getX(batch, xR, xC, d1), + getX(batch, xR, xC, d1 + 1), + getX(batch, xR, xC, d1 + 2), + getX(batch, xR, xC, d1 + 3) + ); + dotProd += dot(xValues, wValues); + } else { + vec4 xValues = vec4( + getX(batch, d1, xR, xC), + getX(batch, d1 + 1, xR, xC), + getX(batch, d1 + 2, xR, xC), + getX(batch, d1 + 3, xR, xC) + ); + dotProd += dot(xValues, wValues); + } + } + + if (${h === 1}) { + + if (${g}) { + dotProd += + getX(batch, xR, xC, ${d}) * + getW(wR, wC, ${d}, d2); + } else { + dotProd += + getX(batch, ${d}, xR, xC) * + getW(wR, wC, ${d}, d2); + } + + } else if (${h === 2}) { + vec2 wValues = vec2( + getW(wR, wC, ${d}, d2), + getW(wR, wC, ${d} + 1, d2) + ); + + if (${g}) { + vec2 xValues = vec2( + getX(batch, xR, xC, ${d}), + getX(batch, xR, xC, ${d} + 1) + ); + dotProd += dot(xValues, wValues); + } else { + vec2 xValues = vec2( + getX(batch, ${d}, xR, xC), + getX(batch, ${d} + 1, xR, xC) + ); + dotProd += dot(xValues, wValues); + } + + } else if (${h === 3}) { + vec3 wValues = vec3( + getW(wR, wC, ${d}, d2), + getW(wR, wC, ${d} + 1, d2), + getW(wR, wC, ${d} + 2, d2) + ); + + if (${g}) { + vec3 xValues = vec3( + getX(batch, xR, xC, ${d}), + getX(batch, xR, xC, ${d} + 1), + getX(batch, xR, xC, ${d} + 2) + ); + dotProd += dot(xValues, wValues); + } else { + vec3 xValues = vec3( + getX(batch, ${d}, xR, xC), + getX(batch, ${d} + 1, xR, xC), + getX(batch, ${d} + 2, xR, xC) + ); + dotProd += dot(xValues, wValues); + } + + } + } + } + + float result = dotProd; + ${_} + ${k} + setOutput(result); + } + `; + } +}; +var Rh = class { + constructor(e) { + this.variableNames = ["x", "W"], this.outputShape = e.outShape; + let t10 = e.padInfo.front, o = e.padInfo.top, n = e.padInfo.left, s = e.strideDepth, a = e.strideHeight, i = e.strideWidth, p = e.dilationDepth, u = e.dilationHeight, c = e.dilationWidth, l = e.filterDepth, m = e.filterHeight, f = e.filterWidth, d = Math.floor(e.inChannels / 4) * 4, h = e.inChannels % 4; + this.userCode = ` + const ivec3 strides = ivec3(${s}, ${a}, ${i}); + const ivec3 pads = ivec3(${t10}, ${o}, ${n}); + + void main() { + ivec5 coords = getOutputCoords(); + int batch = coords.x; + int d2 = coords.u; + + ivec3 xFRCCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads; + int xFCorner = xFRCCorner.x; + int xRCorner = xFRCCorner.y; + int xCCorner = xFRCCorner.z; + + // Convolve x(?, ?, ?, d1) with w(:, :, :, d1, d2) to get + // y(yF, yR, yC, d2). ? = to be determined. : = across all + // values in that axis. + float dotProd = 0.0; + for (int wF = 0; wF < ${l}; wF++) { + int xF = xFCorner + wF * ${p}; + + if (xF < 0 || xF >= ${e.inDepth}) { + continue; + } + + for (int wR = 0; wR < ${m}; wR++) { + int xR = xRCorner + wR * ${u}; + + if (xR < 0 || xR >= ${e.inHeight}) { + continue; + } + + for (int wC = 0; wC < ${f}; wC++) { + int xC = xCCorner + wC * ${c}; + + if (xC < 0 || xC >= ${e.inWidth}) { + continue; + } + + for (int d1 = 0; d1 < ${d}; d1 += 4) { + vec4 xValues = vec4( + getX(batch, xF, xR, xC, d1), + getX(batch, xF, xR, xC, d1 + 1), + getX(batch, xF, xR, xC, d1 + 2), + getX(batch, xF, xR, xC, d1 + 3) + ); + vec4 wValues = vec4( + getW(wF, wR, wC, d1, d2), + getW(wF, wR, wC, d1 + 1, d2), + getW(wF, wR, wC, d1 + 2, d2), + getW(wF, wR, wC, d1 + 3, d2) + ); + + dotProd += dot(xValues, wValues); + } + + if (${h === 1}) { + dotProd += + getX(batch, xF, xR, xC, ${d}) * + getW(wF, wR, wC, ${d}, d2); + } else if (${h === 2}) { + vec2 xValues = vec2( + getX(batch, xF, xR, xC, ${d}), + getX(batch, xF, xR, xC, ${d} + 1) + ); + vec2 wValues = vec2( + getW(wF, wR, wC, ${d}, d2), + getW(wF, wR, wC, ${d} + 1, d2) + ); + dotProd += dot(xValues, wValues); + } else if (${h === 3}) { + vec3 xValues = vec3( + getX(batch, xF, xR, xC, ${d}), + getX(batch, xF, xR, xC, ${d} + 1), + getX(batch, xF, xR, xC, ${d} + 2) + ); + vec3 wValues = vec3( + getW(wF, wR, wC, ${d}, d2), + getW(wF, wR, wC, ${d} + 1, d2), + getW(wF, wR, wC, ${d} + 2, d2) + ); + dotProd += dot(xValues, wValues); + } + } + } + } + setOutput(dotProd); + } + `; + } +}; +var Cc = class { + constructor(e, t10 = false, o = null, n = false, s = false) { + this.variableNames = ["x", "W"], this.packedInputs = true, this.packedOutput = true, this.customUniforms = [{ name: "pads", type: "ivec2" }, { name: "strides", type: "ivec2" }, { name: "dilations", type: "ivec2" }, { name: "inDims", type: "ivec2" }], this.outputShape = e.outShape, this.enableShapeUniforms = lt(this.outputShape.length); + let a = e.padInfo.left, i = e.strideWidth, p = e.dilationWidth, u = e.filterHeight, c = e.filterWidth, l = c, m = ` + int xR; int xC; int xCOffset; + vec4 wTexel; vec4 previous; vec4 final;`; + for (let g = 0; g < c; g++) + m += ` + vec4 xTexelC${g * 2}; + int xTexelC${g * 2}Ready; + vec4 xTexelC${g * 2 + 1}; + int xTexelC${g * 2 + 1}Ready; + vec4 xC${g};`; + m += ` + for (int r = 0; r < ${u}; r++) { + for (int d1 = 0; d1 < ${e.inChannels}; d1 += 2) { + `; + for (let g = 0; g < c; g++) + m += ` + xTexelC${g * 2} = vec4(0.0); + xTexelC${g * 2}Ready = 0; + xTexelC${g * 2 + 1} = vec4(0.0); + xTexelC${g * 2 + 1}Ready = 0; + xC${g} = vec4(0.0);`; + m += ` + xR = xRCorner + r * dilations[0]; + if (xR >=0 && xR < inDims[0]) { + `; + for (let g = 0; g < (l + 1) / 2; g++) { + let y = g * 2; + if (m += ` + xC = xCCorner + ${y * p}; + `, i === 1) { + if (y < c && (a % 2 === 1 ? (m += ` + xCOffset = xC + 1; + if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${y}Ready == 0) { + xTexelC${y} = getX(batch, xR, xCOffset, d1); + + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xCOffset + 1 >= inDims[1]) { + xTexelC${y}.zw = vec2(0.0); + } + xTexelC${y}Ready = 1; + } + `, p === 1 && y > 0 ? m += ` + xC${y} = vec4(xTexelC${y - 2}.zw, xTexelC${y}.xy); + ` : m += ` + xCOffset = xC + 1 - 2; + + if (xCOffset >= 0 && xCOffset < inDims[1]) { + previous = getX(batch, xR, xCOffset, d1); + + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xCOffset + 1 >= inDims[1]) { + previous.zw = vec2(0.0); + } + + xC${y} = vec4(previous.zw, xTexelC${y}.xy); + } else { + xC${y} = vec4(0.0, 0.0, xTexelC${y}.xy); + } + `) : m += ` + if (xC >= 0 && xC < inDims[1] && xTexelC${y}Ready == 0) { + xTexelC${y} = getX(batch, xR, xC, d1); + if (xC + 1 >= inDims[1]) { + xTexelC${y}.zw = vec2(0.0); + } + xTexelC${y}Ready = 1; + } + + xC${y} = xTexelC${y}; + `, y + 1 < c)) { + let b = a % 2 === 0 ? x.nearestLargerEven(p) : p; + p % 2 === 0 && a % 2 === 1 || p % 2 !== 0 && a % 2 !== 1 ? (m += ` + xCOffset = xC + imod(pads[1], 2) + ${b}; + + if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${y + 1}Ready == 0) { + xTexelC${y + 1} = getX(batch, xR, xCOffset, d1); + + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xCOffset + 1 >= inDims[1]) { + xTexelC${y + 1}.zw = vec2(0.0); + } + xTexelC${y + 1}Ready = 1; + } + `, p > 1 ? m += ` + xCOffset -= 2; + if (xCOffset >= 0 && xCOffset < inDims[1]) { + previous = getX(batch, xR, xCOffset, d1); + xC${y + 1} = vec4(previous.zw, xTexelC${y + 1}.xy); + } else { + xC${y + 1} = vec4(0.0, 0.0, xTexelC${y + 1}.xy); + } + ` : m += ` + xC${y + 1} = vec4(xTexelC${y}.zw, xTexelC${y + 1}.xy); + `) : b === 1 ? m += ` + xC${y + 1} = xTexelC${y}; + ` : m += ` + xCOffset = xC + ${b}; + + if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${y + 1}Ready == 0) { + xTexelC${y + 1} = getX(batch, xR, xCOffset, d1); + if (xCOffset + 1 >= inDims[1]) { + xTexelC${y + 1}.zw = vec2(0.0); + } + xTexelC${y + 1}Ready = 1; + } + + xC${y + 1} = xTexelC${y + 1}; + `; + } + } else + y < c && (a % 2 === 1 ? (m += ` + xCOffset = xC + 1 - strides[1]; + if(xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${y}Ready == 0) { + xTexelC${y} = getX(batch, xR, xCOffset, d1); + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xCOffset + 1 >= inDims[1]) { + xTexelC${y}.zw = vec2(0.0); + } + xTexelC${y}Ready = 1; + } + + if(xC + 1 >= 0 && xC + 1 < inDims[1] && xTexelC${y + 1}Ready == 0) { + xTexelC${y + 1} = getX(batch, xR, xC + 1, d1); + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xC + 2 >= inDims[1]) { + xTexelC${y + 1}.zw = vec2(0.0); + } + xTexelC${y + 1}Ready = 1; + } + + xC${y} = vec4(xTexelC${y}.zw, xTexelC${y + 1}.zw); + `, y + 1 < c && (m += ` + final = vec4(0.0); + xCOffset = xC + 1 + strides[1]; + if(xCOffset >= 0 && xCOffset < inDims[1]) { + final = getX(batch, xR, xCOffset, d1); + } + xC${y + 1} = vec4(xTexelC${y + 1}.xy, final.xy); + `)) : (m += ` + if(xC >= 0 && xC < inDims[1] && xTexelC${y}Ready == 0) { + xTexelC${y} = getX(batch, xR, xC, d1); + if (xC + 1 >= inDims[1]) { + xTexelC${y}.zw = vec2(0.0); + } + xTexelC${y}Ready = 1; + } + + xCOffset = xC + strides[1]; + if(xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${y + 1}Ready == 0) { + xTexelC${y + 1} = getX(batch, xR, xCOffset, d1); + if (xCOffset + 1 >= inDims[1]) { + xTexelC${y + 1}.zw = vec2(0.); + } + xTexelC${y + 1}Ready = 1; + } + + xC${y} = vec4( + xTexelC${y}.xy, xTexelC${y + 1}.xy); + `, y + 1 < c && (m += ` + xC${y + 1} = vec4(xTexelC${y}.zw, xTexelC${y + 1}.zw); + `))); + y < c && (m += ` + wTexel = getW(r, ${y}, d1, d2); + dotProd += xC${y}.xxzz * vec4(wTexel.xy, wTexel.xy); + if(d1 + 1 < ${e.inChannels}) { + dotProd += xC${y}.yyww * vec4(wTexel.zw, wTexel.zw); + } + `, y + 1 < c && (m += ` + wTexel = getW(r, ${y + 1}, d1, d2); + dotProd += xC${y + 1}.xxzz * vec4(wTexel.xy, wTexel.xy); + if(d1 + 1 < ${e.inChannels}) { + dotProd += xC${y + 1}.yyww * vec4(wTexel.zw, wTexel.zw); + } + `)); + } + m += ` + } + `, m += ` + } + `, m += ` + } + `; + let f = "", d = ""; + o && (n ? f = `vec4 activation(vec4 a) { + vec4 b = getPreluActivationWeightsAtOutCoords(); + ${o} + }` : s ? f = `vec4 activation(vec4 a) { + vec4 b = getLeakyreluAlphaAtOutCoords(); + ${o} + }` : f = `vec4 activation(vec4 x) { + ${o} + }`, d = "result = activation(result);"); + let h = t10 ? "result += getBiasAtOutCoords();" : ""; + t10 && this.variableNames.push("bias"), n && this.variableNames.push("preluActivationWeights"), s && this.variableNames.push("leakyreluAlpha"), this.userCode = ` + ${f} + + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords.x; + ivec2 xRCCorner = coords.yz * strides - pads; + int d2 = coords.w; + int xRCorner = xRCCorner.x; + int xCCorner = xRCCorner.y; + + //intialize dotProd with a small epsilon seems to reduce GPU accuracy loss. + vec4 dotProd = vec4(0.000000000000001); + + ${m} + + vec4 result = dotProd - vec4(0.000000000000001); + ${h} + ${d} + setOutput(result); + } + `; + } +}; +var Ah = class { + constructor(e, t10) { + this.variableNames = ["A"], this.packedInputs = true, this.packedOutput = true, this.customUniforms = [{ name: "inputShape", type: "ivec4" }, { name: "pad", type: "ivec2" }, { name: "stride", type: "ivec2" }, { name: "dilation", type: "ivec2" }, { name: "inChannels", type: "int" }, { name: "itemsPerBlockRow", type: "int" }, { name: "outWidth", type: "int" }], this.outputShape = e, this.enableShapeUniforms = lt(this.outputShape.length); + let { dataFormat: o } = t10, n = Ct(), s = o === "channelsLast", a = s ? 1 : 2, i = s ? 2 : 3, p = this.enableShapeUniforms ? "if(blockIndex < outShape[2] && pos < outShape[1]) {" : `if(blockIndex < ${e[2]} && pos < ${e[1]}) {`, u = ""; + for (let c = 0; c <= 1; c++) + for (let l = 0; l <= 1; l++) + u += ` + blockIndex = rc.z + ${l}; + pos = rc.y + ${c}; + + ${p} + offsetY = int(blockIndex / outWidth) * stride[0] - pad[0]; + d0 = offsetY + dilation[0] * (pos / itemsPerBlockRow); + + if(d0 < inputShape[${a}] && d0 >= 0) { + // Use custom imod instead mod. On Intel GPU, mod may generate + // unexpected value. + // https://github.com/tensorflow/tfjs/issues/5447 + offsetX = imod(blockIndex, outWidth) * stride[1] - pad[1]; + d1 = offsetX + dilation[1] * (imod(pos, itemsPerBlockRow) / + inChannels); + + if(d1 < inputShape[${i}] && d1 >= 0) { + + ch = imod(pos, inChannels); + + if (${s}) { + innerDims = vec2(d1, ch); + result[${c * 2 + l}] = getChannel( + getA(rc.x, d0, int(innerDims.x), + int(innerDims.y)), innerDims); + } else { + innerDims = vec2(d0, d1); + result[${c * 2 + l}] = getChannel( + getA(rc.x, ch, int(innerDims.x), + int(innerDims.y)), innerDims); + } + } + } + } + `; + this.userCode = ` + void main() { + ivec3 rc = getOutputCoords(); + + vec4 result = vec4(0); + + int blockIndex, pos, offsetY, d0, offsetX, d1, ch; + vec2 innerDims; + + ${u} + + ${n.output} = result; + } + `; + } +}; +function Fh(r, e) { + let t10 = r.length; + return t10 >= 3 ? e ? [...r.slice(0, -3), r[t10 - 3] * r[t10 - 2], r[t10 - 1]] : [...r.slice(0, -3), r[t10 - 3], r[t10 - 2] * r[t10 - 1]] : !e && t10 === 1 && r[0] > 1 ? [r[0], 1] : null; +} +function Dh({ x: r, filter: e, convInfo: t10, backend: o, bias: n = null, preluActivationWeights: s = null, leakyreluAlpha: a = 0, activation: i = null }) { + let p = r.shape, u = o.texData.get(r.dataId), c = t10.inChannels, l = p[0] * p[1] * p[2], m = t10.outChannels, f = t10.dataFormat === "channelsLast", d = false, h = false, g, y = []; + if (s != null) { + let w = Fh(s.shape, f); + w != null && (s = J({ inputs: { x: s }, backend: o, attrs: { shape: w } }), y.push(s)); + } + if (n != null) { + let w = Fh(n.shape, f); + w != null && (n = J({ inputs: { x: n }, backend: o, attrs: { shape: w } }), y.push(n)); + } + if (!((l === 1 || m === 1) && c > Rw) && u.isPacked && f && u.texture != null && p[2] % 2 !== 0 && x.arraysEqual(u.shape.slice(-3), p.slice(-3))) { + let w = p[0] * p[1] * (p[2] + 1), k = { dataId: r.dataId, shape: [1, w, t10.inChannels], dtype: r.dtype }, _ = u.shape; + u.shape = u.shape.slice(), u.shape[u.shape.length - 2]++, x.assert(Ti(u.shape, k.shape), () => `packed reshape ${u.shape} to ${k.shape} isn't free`); + let E = J({ inputs: { x: e }, backend: o, attrs: { shape: [1, t10.inChannels, t10.outChannels] } }); + y.push(E); + let R = Mu({ a: k, b: E, backend: o, transposeA: d, transposeB: h, bias: n, activation: i, preluActivationWeights: s, leakyreluAlpha: a }), A = o.texData.get(R.dataId); + x.assert(A.isPacked, () => "batchMatMul result is expected to be packed"), u.shape = _, A.shape = t10.outShape, g = Rt({ inputs: { x: R }, backend: o }), g.shape = t10.outShape, y.push(R); + } else { + let w = t10.outHeight * t10.outWidth, k = J({ inputs: { x: r }, backend: o, attrs: { shape: f ? [t10.batchSize, w, t10.inChannels] : [t10.batchSize, t10.inChannels, w] } }), _ = J({ inputs: { x: e }, backend: o, attrs: { shape: [1, t10.inChannels, t10.outChannels] } }), E = Mu({ a: f ? k : _, b: f ? _ : k, transposeA: !f, transposeB: h, backend: o, bias: n, activation: i, preluActivationWeights: s, leakyreluAlpha: a }); + g = J({ inputs: { x: E }, backend: o, attrs: { shape: t10.outShape } }), y.push(k), y.push(_), y.push(E); + } + for (let w of y) + o.disposeIntermediateTensorInfo(w); + return g; +} +function Ph({ x: r, filter: e, convInfo: t10, backend: o, bias: n = null, preluActivationWeights: s = null, leakyreluAlpha: a = 0, activation: i = null }) { + let { filterWidth: p, filterHeight: u, inChannels: c, outWidth: l, outHeight: m, dataFormat: f } = t10, d = f === "channelsLast", h = p * u * c, g = m * l, y = [t10.batchSize, h, g], b = true, C = false, w = []; + if (s != null) { + let H = Fh(s.shape, d); + H != null && (s = J({ inputs: { x: s }, backend: o, attrs: { shape: H } }), w.push(s)); + } + if (n != null) { + let H = Fh(n.shape, d); + H != null && (n = J({ inputs: { x: n }, backend: o, attrs: { shape: H } }), w.push(n)); + } + let k = J({ inputs: { x: e }, backend: o, attrs: { shape: [1, h, x.sizeFromShape(e.shape) / h] } }); + w.push(k); + let _ = new Ah(y, t10), E = [r.shape, [t10.padInfo.top, t10.padInfo.left], [t10.strideHeight, t10.strideWidth], [t10.dilationHeight, t10.dilationWidth], [t10.inChannels], [t10.filterWidth * t10.inChannels], [t10.outWidth]], R = o.runWebGLProgram(_, [r], "float32", E), A = J({ inputs: { x: R }, backend: o, attrs: { shape: y } }); + w.push(R), w.push(A); + let D = n != null, O = s != null, M = i === "leakyrelu", L = i ? Ma(i, true) : null, W = new xc(d ? A.shape : k.shape, d ? k.shape : A.shape, d ? [t10.batchSize, g, t10.outChannels] : [t10.batchSize, t10.outChannels, g], b, C, D, L, O, M), V = d ? [A, k] : [k, A]; + if (n && V.push(n), O && V.push(s), M) { + let H = o.makeTensorInfo([], "float32", x.createScalarValue(a, "float32")); + V.push(H), w.push(H); + } + let G = o.runWebGLProgram(W, V, "float32"), q = J({ inputs: { x: G }, backend: o, attrs: { shape: t10.outShape } }); + w.push(G); + for (let H of w) + o.disposeIntermediateTensorInfo(H); + return q; +} +function iQ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, filter: s } = e, { strides: a, pad: i, dataFormat: p, dilations: u, dimRoundingMode: c } = o, l = I.convertConv2DDataFormat(p), m = I.computeConv2DInfo(n.shape, s.shape, a, u, i, c, false, l), f; + if (m.filterHeight === 1 && m.filterWidth === 1 && m.dilationHeight === 1 && m.dilationWidth === 1 && m.strideHeight === 1 && m.strideWidth === 1 && (m.padInfo.type === "SAME" || m.padInfo.type === "VALID")) + f = Dh({ x: n, filter: s, convInfo: m, backend: t10 }); + else if (m.strideWidth <= 2 && l === "channelsLast" && P().getBool("WEBGL_EXP_CONV")) { + let h = new Cc(m), g = [[m.padInfo.top, m.padInfo.left], [m.strideHeight, m.strideWidth], [m.dilationHeight, m.dilationWidth], [m.inHeight, m.inWidth]]; + f = t10.runWebGLProgram(h, [n, s], "float32", g); + } else if (P().getBool("WEBGL_CONV_IM2COL")) + f = Ph({ x: n, filter: s, convInfo: m, backend: t10 }); + else { + let h = new bc(m); + f = t10.runWebGLProgram(h, [n, s], "float32"); + } + let d = J({ inputs: { x: f }, backend: t10, attrs: { shape: m.outShape } }); + return t10.disposeIntermediateTensorInfo(f), d; +} +var iA = { kernelName: ln, backendName: "webgl", kernelFunc: iQ }; +var Oh = class { + constructor(e) { + this.variableNames = ["x", "dy"], this.outputShape = e.filterShape; + let t10 = e.strideHeight, o = e.strideWidth, n = e.padInfo.top, s = e.padInfo.left, a = e.dataFormat === "channelsLast"; + this.userCode = ` + void main() { + ivec4 coords = getOutputCoords(); + int wR = coords.x; + int wC = coords.y; + int d1 = coords.z; + int d2 = coords.w; + + // Convolve x(?, ?, d1) with dy(:, :, d2) to get dw(wR, wC, d1, d2). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + + for (int b = 0; b < ${e.batchSize}; b++) { + for (int yR = 0; yR < ${e.outHeight}; yR++) { + int xR = wR + yR * ${t10} - ${n}; + + if (xR < 0 || xR >= ${e.inHeight}) { + continue; + } + + for (int yC = 0; yC < ${e.outWidth}; yC++) { + int xC = wC + yC * ${o} - ${s}; + + if (xC < 0 || xC >= ${e.inWidth}) { + continue; + } + + if (${a}) { + float dyValue = getDy(b, yR, yC, d2); + float xValue = getX(b, xR, xC, d1); + dotProd += (xValue * dyValue); + } else { + float dyValue = getDy(b, d2, yR, yC); + float xValue = getX(b, d1, xR, xC); + dotProd += (xValue * dyValue); + } + + } + } + } + setOutput(dotProd); + } + `; + } +}; +var Mh = class { + constructor(e) { + this.variableNames = ["dy", "W"], this.outputShape = e.inShape; + let t10 = e.filterHeight, o = e.filterWidth, n = e.strideHeight, s = e.strideWidth, a = e.dataFormat === "channelsLast", i = t10 - 1 - e.padInfo.top, p = o - 1 - e.padInfo.left, u = a ? 1 : 2, c = a ? 2 : 3, l = a ? 3 : 1; + this.userCode = ` + const ivec2 pads = ivec2(${i}, ${p}); + + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords[0]; + int d1 = coords[${l}]; + + ivec2 dyCorner = ivec2(coords[${u}], coords[${c}]) - pads; + int dyRCorner = dyCorner.x; + int dyCCorner = dyCorner.y; + + // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + for (int wR = 0; wR < ${t10}; wR++) { + float dyR = float(dyRCorner + wR) / ${n}.0; + + if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) { + continue; + } + int idyR = int(dyR); + + int wRPerm = ${t10} - 1 - wR; + + for (int wC = 0; wC < ${o}; wC++) { + float dyC = float(dyCCorner + wC) / ${s}.0; + + if (dyC < 0.0 || dyC >= ${e.outWidth}.0 || + fract(dyC) > 0.0) { + continue; + } + int idyC = int(dyC); + + int wCPerm = ${o} - 1 - wC; + + for (int d2 = 0; d2 < ${e.outChannels}; d2++) { + + if (${a}) { + float xValue = getDy(batch, idyR, idyC, d2); + float wValue = getW(wRPerm, wCPerm, d1, d2); + dotProd += xValue * wValue; + } else { + float xValue = getDy(batch, d2, idyR, idyC); + float wValue = getW(wRPerm, wCPerm, d1, d2); + dotProd += xValue * wValue; + } + + } + } + } + setOutput(dotProd); + } + `; + } +}; +var Lh = class { + constructor(e) { + this.variableNames = ["x", "dy"], this.outputShape = e.filterShape; + let t10 = e.strideDepth, o = e.strideHeight, n = e.strideWidth, s = e.padInfo.front, a = e.padInfo.top, i = e.padInfo.left; + this.userCode = ` + void main() { + ivec5 coords = getOutputCoords(); + int wF = coords.x; + int wR = coords.y; + int wC = coords.z; + int d1 = coords.w; + int d2 = coords.u; + + float dotProd = 0.0; + + for (int b = 0; b < ${e.batchSize}; b++) { + for (int yF = 0; yF < ${e.outDepth}; yF++) { + int xF = wF + yF * ${t10} - ${s}; + + if (xF < 0 || xF >= ${e.inDepth}) { + continue; + } + + for (int yR = 0; yR < ${e.outHeight}; yR++) { + int xR = wR + yR * ${o} - ${a}; + + if (xR < 0 || xR >= ${e.inHeight}) { + continue; + } + + for (int yC = 0; yC < ${e.outWidth}; yC++) { + int xC = wC + yC * ${n} - ${i}; + + if (xC < 0 || xC >= ${e.inWidth}) { + continue; + } + + float dyValue = getDy(b, yF, yR, yC, d2); + float xValue = getX(b, xF, xR, xC, d1); + dotProd += (xValue * dyValue); + } + } + } + } + setOutput(dotProd); + } + `; + } +}; +var Bh = class { + constructor(e) { + this.variableNames = ["dy", "W"], this.outputShape = e.inShape; + let t10 = e.filterDepth, o = e.filterHeight, n = e.filterWidth, s = e.strideDepth, a = e.strideHeight, i = e.strideWidth, p = t10 - 1 - e.padInfo.front, u = o - 1 - e.padInfo.top, c = n - 1 - e.padInfo.left; + this.userCode = ` + const ivec3 pads = ivec3(${p}, ${u}, ${c}); + + void main() { + ivec5 coords = getOutputCoords(); + int batch = coords.x; + int d1 = coords.u; + + + ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads; + int dyFCorner = dyCorner.x; + int dyRCorner = dyCorner.y; + int dyCCorner = dyCorner.z; + + float dotProd = 0.0; + for (int wF = 0; wF < ${t10}; wF++) { + float dyF = float(dyFCorner + wF) / ${s}.0; + + if (dyF < 0.0 || dyF >= ${e.outDepth}.0 || fract(dyF) > 0.0) { + continue; + } + int idyF = int(dyF); + + int wFPerm = ${t10} - 1 - wF; + + for (int wR = 0; wR < ${o}; wR++) { + float dyR = float(dyRCorner + wR) / ${a}.0; + + if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || + fract(dyR) > 0.0) { + continue; + } + int idyR = int(dyR); + + int wRPerm = ${o} - 1 - wR; + + for (int wC = 0; wC < ${n}; wC++) { + float dyC = float(dyCCorner + wC) / ${i}.0; + + if (dyC < 0.0 || dyC >= ${e.outWidth}.0 || + fract(dyC) > 0.0) { + continue; + } + int idyC = int(dyC); + + int wCPerm = ${n} - 1 - wC; + + for (int d2 = 0; d2 < ${e.outChannels}; d2++) { + float xValue = getDy(batch, idyF, idyR, idyC, d2); + float wValue = getW(wFPerm, wRPerm, wCPerm, d1, d2); + dotProd += xValue * wValue; + } + } + } + } + setOutput(dotProd); + } + `; + } +}; +function uQ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, dy: s } = e, { strides: a, pad: i, dataFormat: p, dimRoundingMode: u, filterShape: c } = o, l = I.convertConv2DDataFormat(p), m = I.computeConv2DInfo(n.shape, c, a, 1, i, u, false, l), f = new Oh(m); + return t10.runWebGLProgram(f, [n, s], "float32"); +} +var uA = { kernelName: lp, backendName: "webgl", kernelFunc: uQ }; +function pQ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { dy: n, filter: s } = e, { inputShape: a, strides: i, pad: p, dataFormat: u, dimRoundingMode: c } = o, l = I.convertConv2DDataFormat(u), m = I.computeConv2DInfo(a, s.shape, i, 1, p, c, false, l), f = new Mh(m); + return t10.runWebGLProgram(f, [n, s], "float32"); +} +var pA = { kernelName: mn, backendName: "webgl", kernelFunc: pQ }; +function cQ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, filter: s } = e, { strides: a, pad: i, dilations: p } = o, u = I.computeConv3DInfo(n.shape, s.shape, a, p, i), c = new Rh(u); + return t10.runWebGLProgram(c, [n, s], "float32"); +} +var cA = { kernelName: mp, backendName: "webgl", kernelFunc: cQ }; +function lQ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, dy: s } = e, { strides: a, pad: i, filterShape: p } = o, u = I.computeConv3DInfo(n.shape, p, a, 1, i), c = new Lh(u); + return t10.runWebGLProgram(c, [n, s], "float32"); +} +var lA = { kernelName: Dm, backendName: "webgl", kernelFunc: lQ }; +function mQ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { dy: n, filter: s } = e, { pad: a, strides: i, inputShape: p } = o, u = I.computeConv3DInfo(p, s.shape, i, 1, a), c = new Bh(u); + return t10.runWebGLProgram(c, [n, s], "float32"); +} +var mA = { kernelName: fp, backendName: "webgl", kernelFunc: mQ }; +var fQ = jo + ` + return cos(x); +`; +var dQ = he({ opSnippet: fQ }); +var fA = { kernelName: fn, backendName: "webgl", kernelFunc: dQ }; +var hQ = ` + float e2x = exp(-x); + return (e2x + 1.0 / e2x) / 2.0; +`; +var gQ = he({ opSnippet: hQ }); +var dA = { kernelName: dn, backendName: "webgl", kernelFunc: gQ }; +var Vh = class { + constructor(e, t10, o, n, s) { + this.variableNames = ["Image", "Boxes", "BoxInd"], this.outputShape = []; + let [a, i, p, u] = e, [c] = t10, [l, m] = o; + this.outputShape = [c, l, m, u]; + let f = n === "bilinear" ? 1 : 0, [d, h] = [`${i - 1}.0`, `${p - 1}.0`], [g, y, b] = l > 1 ? [`${(i - 1) / (l - 1)}`, "(y2-y1) * height_ratio", `y1*${d} + float(y)*(height_scale)`] : ["0.0", "0.0", `0.5 * (y1+y2) * ${d}`], [C, w, k] = m > 1 ? [`${(p - 1) / (m - 1)}`, "(x2-x1) * width_ratio", `x1*${h} + float(x)*(width_scale)`] : ["0.0", "0.0", `0.5 * (x1+x2) * ${h}`]; + this.userCode = ` + const float height_ratio = float(${g}); + const float width_ratio = float(${C}); + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int y = coords[1]; + int x = coords[2]; + int d = coords[3]; + + // get box vals + float y1 = getBoxes(b,0); + float x1 = getBoxes(b,1); + float y2 = getBoxes(b,2); + float x2 = getBoxes(b,3); + + // get image in batch index + int bInd = round(getBoxInd(b)); + if(bInd < 0 || bInd >= ${a}) { + return; + } + + float height_scale = ${y}; + float width_scale = ${w}; + + float in_y = ${b}; + if( in_y < 0.0 || in_y > ${d} ) { + setOutput(float(${s})); + return; + } + float in_x = ${k}; + if( in_x < 0.0 || in_x > ${h} ) { + setOutput(float(${s})); + return; + } + + vec2 sourceFracIndexCR = vec2(in_x,in_y); + if(${f} == 1) { + // Compute the four integer indices. + ivec2 sourceFloorCR = ivec2(sourceFracIndexCR); + ivec2 sourceCeilCR = ivec2(ceil(sourceFracIndexCR)); + + float topLeft = getImage(b, sourceFloorCR.y, sourceFloorCR.x, d); + float bottomLeft = getImage(b, sourceCeilCR.y, sourceFloorCR.x, d); + float topRight = getImage(b, sourceFloorCR.y, sourceCeilCR.x, d); + float bottomRight = getImage(b, sourceCeilCR.y, sourceCeilCR.x, d); + + vec2 fracCR = sourceFracIndexCR - vec2(sourceFloorCR); + + float top = topLeft + (topRight - topLeft) * fracCR.x; + float bottom = bottomLeft + (bottomRight - bottomLeft) * fracCR.x; + float newValue = top + (bottom - top) * fracCR.y; + setOutput(newValue); + } else { + // Compute the coordinators of nearest neighbor point. + ivec2 sourceNearestCR = ivec2(floor( + sourceFracIndexCR + vec2(0.5,0.5))); + float newValue = getImage(b, sourceNearestCR.y, sourceNearestCR.x, d); + setOutput(newValue); + } + } + `; + } +}; +var xQ = (r) => { + let { inputs: e, backend: t10, attrs: o } = r, { image: n, boxes: s, boxInd: a } = e, { cropSize: i, method: p, extrapolationValue: u } = o, c = new Vh(n.shape, s.shape, i, p, u); + return t10.runWebGLProgram(c, [n, s, a], "float32"); +}; +var hA = { kernelName: xn, backendName: "webgl", kernelFunc: xQ }; +var Bu; +(function(r) { + r.Prod = "*", r.Sum = "+"; +})(Bu || (Bu = {})); +var Ml = class { + constructor(e, t10, o, n) { + this.op = e, this.outputShape = t10, this.variableNames = ["x"], this.customUniforms = [{ name: "index", type: "float" }]; + let s = this.outputShape.length, a = this.op === Bu.Prod ? "1.0" : "0.0", i = o ? a : `getX(${gA(s, "coords", this.op)})`, p = this.outputShape[this.outputShape.length - 1], u = "", c = ""; + o ? (u = n ? `end != ${p - 1}` : "end != 0", c = n ? "end + 1" : "end - 1") : (u = n ? `end + pow2 < ${p}` : "end >= pow2", c = n ? "end + pow2" : "end - pow2"), this.userCode = ` + void main() { + ${_e(s)} coords = getOutputCoords(); + int end = ${xA(s, "coords", this.op)}; + float val = ${i}; + int pow2 = int(pow(2.0, index)); + if (${u}) { + int idx = ${c}; + ${xA(s, "coords", this.op)} = idx; + val ${this.op}= getX(${gA(s, "coords", this.op)}); + } + setOutput(val); + } + `; + } +}; +function gA(r, e, t10) { + if (r === 1) + return `${e}`; + if (r === 2) + return `${e}.x, ${e}.y`; + if (r === 3) + return `${e}.x, ${e}.y, ${e}.z`; + if (r === 4) + return `${e}.x, ${e}.y, ${e}.z, ${e}.w`; + throw new Error(`Cumulative ${t10} for rank ${r} is not yet supported`); +} +function xA(r, e, t10) { + if (r === 1) + return `${e}`; + if (r === 2) + return `${e}.y`; + if (r === 3) + return `${e}.z`; + if (r === 4) + return `${e}.w`; + throw new Error(`Cumulative ${t10} for rank ${r} is not yet supported`); +} +function zh(r, e, t10, o, n, s) { + let a = e.shape.length, i = I.getAxesPermutation([o], a), p = e; + i != null && (p = xt({ inputs: { x: e }, backend: t10, attrs: { perm: i } })); + let u = I.getInnerMostAxes(1, a)[0]; + if (u !== a - 1) + throw new Error(`WebGL cumprod shader expects an inner-most axis=${e.shape.length - 1} but got axis=${o}`); + let c = p.shape[u], l = Rt({ inputs: { x: p }, backend: t10 }); + for (let m = 0; m <= Math.ceil(Math.log2(c)) - 1; m++) { + let f = new Ml(r, p.shape, false, s), d = [[m]], h = l; + l = t10.runWebGLProgram(f, [l], l.dtype, d), t10.disposeIntermediateTensorInfo(h); + } + if (n) { + let m = new Ml(r, p.shape, n, s), f = l; + l = t10.runWebGLProgram(m, [l], l.dtype), t10.disposeIntermediateTensorInfo(f); + } + if (i != null) { + let m = I.getUndoAxesPermutation(i), f = xt({ inputs: { x: l }, backend: t10, attrs: { perm: m } }); + return t10.disposeIntermediateTensorInfo(l), t10.disposeIntermediateTensorInfo(p), f; + } + return l; +} +function yQ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { axis: s, exclusive: a, reverse: i } = o; + return zh(Bu.Prod, n, t10, s, a, i); +} +var yA = { kernelName: hn, backendName: "webgl", kernelFunc: yQ }; +function bQ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { axis: s, exclusive: a, reverse: i } = o; + return zh(Bu.Sum, n, t10, s, a, i); +} +var bA = { kernelName: gn, backendName: "webgl", kernelFunc: bQ }; +function CQ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, weights: s } = e, { size: a, binaryOutput: i } = o; + if (n.shape.length === 1) { + let p = t10.readSync(n.dataId), u = t10.readSync(s.dataId), c = oh(p, u, s.dtype, s.shape, a); + return t10.makeTensorInfo([a], s.dtype, c); + } else if (n.shape.length === 2) { + let p = t10.bufferSync(n), u = t10.bufferSync(s), c = a$(p, u, a, i); + return t10.makeTensorInfo(c.shape, s.dtype, c.values); + } + throw new Error(`Error in denseBincount: input must be at most rank 2, but got rank${n.shape.length}.`); +} +var CA = { kernelName: dp, backendName: "webgl", kernelFunc: CQ }; +var Wh = class { + constructor(e, t10, o) { + this.variableNames = ["x"], this.outputShape = [], this.outputShape = e, this.blockSize = t10, this.dataFormat = o, this.userCode = ` + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int h = ${this.getHeightCoordString()}; + int w = ${this.getWidthCoordString()}; + int d = ${this.getDepthCoordString()}; + + int in_h = h / ${t10}; + int offset_h = imod(h, ${t10}); + int in_w = w / ${t10}; + int offset_w = imod(w, ${t10}); + int offset_d = (offset_h * ${t10} + offset_w) * + ${this.getOutputDepthSize()}; + int in_d = d + offset_d; + + float result = ${this.getInputSamplingString()}; + setOutput(result); + } + `; + } + getHeightCoordString() { + return this.dataFormat === "NHWC" ? "coords[1]" : "coords[2]"; + } + getWidthCoordString() { + return this.dataFormat === "NHWC" ? "coords[2]" : "coords[3]"; + } + getDepthCoordString() { + return this.dataFormat === "NHWC" ? "coords[3]" : "coords[1]"; + } + getOutputDepthSize() { + return this.dataFormat === "NHWC" ? this.outputShape[3] : this.outputShape[1]; + } + getInputSamplingString() { + return this.dataFormat === "NHWC" ? "getX(b, in_h, in_w, in_d)" : "getX(b, in_d, in_h, in_w)"; + } +}; +function IQ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { blockSize: s, dataFormat: a } = o, i = n.shape[0], p = a === "NHWC" ? n.shape[1] : n.shape[2], u = a === "NHWC" ? n.shape[2] : n.shape[3], c = a === "NHWC" ? n.shape[3] : n.shape[1], l = p * s, m = u * s, f = c / (s * s), d = a === "NHWC" ? [i, l, m, f] : [i, f, l, m], h = new Wh(d, s, a); + return t10.runWebGLProgram(h, [n], n.dtype); +} +var IA = { kernelName: yn, backendName: "webgl", kernelFunc: IQ }; +var Ic = class { + constructor(e, t10 = false, o = null, n = false, s = false) { + this.variableNames = ["x", "W"], this.customUniforms = [{ name: "pads", type: "ivec2" }, { name: "strides", type: "ivec2" }, { name: "dilations", type: "ivec2" }, { name: "inDims", type: "ivec2" }], this.outputShape = e.outShape, this.enableShapeUniforms = lt(this.outputShape.length); + let a = e.filterHeight, i = e.filterWidth, p = e.outChannels / e.inChannels, u = "", c = ""; + o && (n ? u = `float activation(float a) { + float b = getPreluActivationWeightsAtOutCoords(); + ${o} + }` : s ? u = `float activation(float a) { + float b = getLeakyreluAlphaAtOutCoords(); + ${o} + }` : u = ` + float activation(float x) { + ${o} + } + `, c = "result = activation(result);"); + let l = t10 ? "result += getBiasAtOutCoords();" : ""; + t10 && this.variableNames.push("bias"), n && this.variableNames.push("preluActivationWeights"), s && this.variableNames.push("leakyreluAlpha"), this.userCode = ` + ${u} + + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords.x; + ivec2 xRCCorner = coords.yz * strides - pads; + int d2 = coords.w; + int d1 = d2 / ${p}; + int q = d2 - d1 * ${p}; + + int xRCorner = xRCCorner.x; + int xCCorner = xRCCorner.y; + + // Convolve x(?, ?, d1) with w(:, :, d1, q) to get y(yR, yC, d2). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + // TO DO(dsmilkov): Flatten the two for loops and vec4 the operations. + for (int wR = 0; wR < ${a}; wR++) { + int xR = xRCorner + wR * dilations[0]; + + if (xR < 0 || xR >= inDims[0]) { + continue; + } + + for (int wC = 0; wC < ${i}; wC++) { + int xC = xCCorner + wC * dilations[1]; + + if (xC < 0 || xC >= inDims[1]) { + continue; + } + + float xVal = getX(batch, xR, xC, d1); + float wVal = getW(wR, wC, d1, q); + dotProd += xVal * wVal; + } + } + + float result = dotProd; + ${l} + ${c} + setOutput(result); + } + `; + } +}; +var wc = class { + constructor(e, t10 = false, o = null, n = false, s = false) { + this.variableNames = ["x", "W"], this.packedInputs = true, this.packedOutput = true, this.customUniforms = [{ name: "pads", type: "ivec2" }, { name: "strides", type: "ivec2" }, { name: "dilations", type: "ivec2" }, { name: "inDims", type: "ivec2" }], this.outputShape = e.outShape, this.enableShapeUniforms = lt(this.outputShape.length); + let a = e.outChannels / e.inChannels, i = e.padInfo.left, p = e.strideWidth, u = e.dilationWidth, c = e.filterHeight, l = e.filterWidth, m = l, f = ` + int xR; int xC; int xCOffset; + vec4 wTexel; vec4 previous; vec4 final;`; + for (let y = 0; y < l; y++) + f += ` + vec4 xTexelC${y * 2}; + int xTexelC${y * 2}Ready; + vec4 xTexelC${y * 2 + 1}; + int xTexelC${y * 2 + 1}Ready; + vec4 xC${y};`; + f += ` + for (int r = 0; r < ${c}; r++) { + `; + for (let y = 0; y < l; y++) + f += ` + xTexelC${y * 2} = vec4(0.0); + xTexelC${y * 2}Ready = 0; + xTexelC${y * 2 + 1} = vec4(0.0); + xTexelC${y * 2 + 1}Ready = 0; + xC${y} = vec4(0.0);`; + f += ` + xR = xRCorner + r * dilations[0]; + if (xR >=0 && xR < inDims[0]) { + `; + for (let y = 0; y < (m + 1) / 2; y++) { + let b = y * 2; + if (f += ` + xC = xCCorner + ${b * u}; + `, p === 1) { + if (b < l && (i % 2 === 1 ? (f += ` + xCOffset = xC + 1; + if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${b}Ready == 0) { + xTexelC${b} = getX(batch, xR, xCOffset, d1); + + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xCOffset + 1 >= inDims[1]) { + xTexelC${b}.zw = vec2(0.0); + } + xTexelC${b}Ready = 1; + } + `, u === 1 && b > 0 ? f += ` + xC${b} = vec4(xTexelC${b - 2}.zw, xTexelC${b}.xy); + ` : f += ` + xCOffset = xC + 1 - 2; + + if (xCOffset >= 0 && xCOffset < inDims[1]) { + previous = getX(batch, xR, xCOffset, d1); + + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xCOffset + 1 >= inDims[1]) { + previous.zw = vec2(0.0); + } + + xC${b} = vec4(previous.zw, xTexelC${b}.xy); + } else { + xC${b} = vec4(0.0, 0.0, xTexelC${b}.xy); + } + `) : f += ` + if (xC >= 0 && xC < inDims[1] && xTexelC${b}Ready == 0) { + xTexelC${b} = getX(batch, xR, xC, d1); + if (xC + 1 >= inDims[1]) { + xTexelC${b}.zw = vec2(0.0); + } + xTexelC${b}Ready = 1; + } + + xC${b} = xTexelC${b}; + `, b + 1 < l)) { + let C = i % 2 === 0 ? x.nearestLargerEven(u) : u; + u % 2 === 0 && i % 2 === 1 || u % 2 !== 0 && i % 2 !== 1 ? (f += ` + xCOffset = xC + imod(pads[1], 2) + ${C}; + + if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${b + 1}Ready == 0) { + xTexelC${b + 1} = getX(batch, xR, xCOffset, d1); + + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xCOffset + 1 >= inDims[1]) { + xTexelC${b + 1}.zw = vec2(0.0); + } + xTexelC${b + 1}Ready = 1; + } + `, u > 1 ? f += ` + xCOffset -= 2; + if (xCOffset >= 0 && xCOffset < inDims[1]) { + previous = getX(batch, xR, xCOffset, d1); + xC${b + 1} = vec4(previous.zw, xTexelC${b + 1}.xy); + } else { + xC${b + 1} = vec4(0.0, 0.0, xTexelC${b + 1}.xy); + } + ` : f += ` + xC${b + 1} = vec4(xTexelC${b}.zw, xTexelC${b + 1}.xy); + `) : C === 1 ? f += ` + xC${b + 1} = xTexelC${b}; + ` : f += ` + xCOffset = xC + ${C}; + + if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${b + 1}Ready == 0) { + xTexelC${b + 1} = getX(batch, xR, xCOffset, d1); + if (xCOffset + 1 >= inDims[1]) { + xTexelC${b + 1}.zw = vec2(0.0); + } + xTexelC${b + 1}Ready = 1; + } + + xC${b + 1} = xTexelC${b + 1}; + `; + } + } else + b < l && (i % 2 === 1 ? (f += ` + xCOffset = xC + 1 - strides[1]; + if(xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${b}Ready == 0) { + xTexelC${b} = getX(batch, xR, xCOffset, d1); + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xCOffset + 1 >= inDims[1]) { + xTexelC${b}.zw = vec2(0.0); + } + xTexelC${b}Ready = 1; + } + + if(xC + 1 >= 0 && xC + 1 < inDims[1] && xTexelC${b + 1}Ready == 0) { + xTexelC${b + 1} = getX(batch, xR, xC + 1, d1); + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xC + 2 >= inDims[1]) { + xTexelC${b + 1}.zw = vec2(0.0); + } + xTexelC${b + 1}Ready = 1; + } + + xC${b} = vec4(xTexelC${b}.zw, xTexelC${b + 1}.zw); + `, b + 1 < l && (f += ` + final = vec4(0.0); + xCOffset = xC + 1 + strides[1]; + if(xCOffset >= 0 && xCOffset < inDims[1]) { + final = getX(batch, xR, xCOffset, d1); + } + xC${b + 1} = vec4(xTexelC${b + 1}.xy, final.xy); + `)) : (f += ` + if(xC >= 0 && xC < inDims[1] && xTexelC${b}Ready == 0) { + xTexelC${b} = getX(batch, xR, xC, d1); + if (xC + 1 >= inDims[1]) { + xTexelC${b}.zw = vec2(0.0); + } + xTexelC${b}Ready = 1; + } + + xCOffset = xC + strides[1]; + if(xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${b + 1}Ready == 0) { + xTexelC${b + 1} = getX(batch, xR, xCOffset, d1); + if (xCOffset + 1 >= inDims[1]) { + xTexelC${b + 1}.zw = vec2(0.); + } + xTexelC${b + 1}Ready = 1; + } + + xC${b} = vec4( + xTexelC${b}.xy, xTexelC${b + 1}.xy); + `, b + 1 < l && (f += ` + xC${b + 1} = vec4(xTexelC${b}.zw, xTexelC${b + 1}.zw); + `))); + b < l && (f += ` + wTexel = getW(r, ${b}, d1, q); + dotProd += xC${b} * vec4(wTexel.xz, wTexel.xz); + `, b + 1 < l && (f += ` + wTexel = getW(r, ${b + 1}, d1, q); + dotProd += xC${b + 1} * vec4(wTexel.xz, wTexel.xz); + `)); + } + f += ` + } + `, f += ` + } + `; + let d = "", h = ""; + o && (n ? d = `vec4 activation(vec4 a) { + vec4 b = getPreluActivationWeightsAtOutCoords(); + ${o} + }` : s ? d = `vec4 activation(vec4 a) { + vec4 b = getLeakyreluAlphaAtOutCoords(); + ${o} + }` : d = `vec4 activation(vec4 x) { + ${o} + }`, h = "result = activation(result);"); + let g = t10 ? "result += getBiasAtOutCoords();" : ""; + t10 && this.variableNames.push("bias"), n && this.variableNames.push("preluActivationWeights"), s && this.variableNames.push("leakyreluAlpha"), this.userCode = ` + ${d} + + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords.x; + ivec2 xRCCorner = coords.yz * strides - pads; + int d2 = coords.w; + int d1 = d2 / ${a}; + int q = d2 - d1 * ${a}; + int xRCorner = xRCCorner.x; + int xCCorner = xRCCorner.y; + + //intialize dotProd with a small epsilon seems to reduce GPU accuracy loss. + vec4 dotProd = vec4(0.000000000000001); + + ${f} + + vec4 result = dotProd - vec4(0.000000000000001); + ${g} + ${h} + setOutput(result); + } + `; + } +}; +function wQ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, filter: s } = e, { strides: a, pad: i, dilations: p, dimRoundingMode: u } = o, c = p; + c == null && (c = [1, 1]), x.assert(I.eitherStridesOrDilationsAreOne(a, c), () => `Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${a} and dilations '${c}'`); + let l = I.computeConv2DInfo(n.shape, s.shape, a, c, i, u, true), m; + P().getBool("WEBGL_PACK_DEPTHWISECONV") && l.strideWidth <= 2 && l.outChannels / l.inChannels === 1 ? m = new wc(l) : m = new Ic(l); + let f = [[l.padInfo.top, l.padInfo.left], [l.strideHeight, l.strideWidth], [l.dilationHeight, l.dilationWidth], [l.inHeight, l.inWidth]]; + return t10.runWebGLProgram(m, [n, s], "float32", f); +} +var wA = { kernelName: bn, backendName: "webgl", kernelFunc: wQ }; +var Uh = class { + constructor(e) { + this.variableNames = ["x", "dy"], this.outputShape = e.filterShape; + let t10 = e.strideHeight, o = e.strideWidth, n = e.padInfo.top, s = e.padInfo.left, a = e.outChannels / e.inChannels; + this.userCode = ` + void main() { + ivec4 coords = getOutputCoords(); + int wR = coords.x; + int wC = coords.y; + int d1 = coords.z; + int dm = coords.w; + int d2 = d1 * ${a} + dm; + + float dotProd = 0.0; + + // TO DO: Vec4 over the batch size + for (int b = 0; b < ${e.batchSize}; b++) { + for (int yR = 0; yR < ${e.outHeight}; yR++) { + int xR = wR + yR * ${t10} - ${n}; + + if (xR < 0 || xR >= ${e.inHeight}) { + continue; + } + + for (int yC = 0; yC < ${e.outWidth}; yC++) { + int xC = wC + yC * ${o} - ${s}; + + if (xC < 0 || xC >= ${e.inWidth}) { + continue; + } + + float dyValue = getDy(b, yR, yC, d2); + float xValue = getX(b, xR, xC, d1); + dotProd += (xValue * dyValue); + } + } + } + setOutput(dotProd); + } + `; + } +}; +var Gh = class { + constructor(e) { + this.variableNames = ["dy", "W"], this.outputShape = e.inShape; + let t10 = e.filterHeight, o = e.filterWidth, n = e.strideHeight, s = e.strideWidth, a = t10 - 1 - e.padInfo.top, i = o - 1 - e.padInfo.left, p = e.outChannels / e.inChannels; + this.userCode = ` + const ivec2 pads = ivec2(${a}, ${i}); + + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords[0]; + int d1 = coords[3]; + ivec2 dyCorner = coords.yz - pads; + int dyRCorner = dyCorner.x; + int dyCCorner = dyCorner.y; + + float dotProd = 0.0; + + for (int wR = 0; wR < ${t10}; wR++) { + float dyR = float(dyRCorner + wR) / ${n}.0; + + if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) { + continue; + } + int idyR = int(dyR); + + int wRPerm = ${t10} - 1 - wR; + + for (int wC = 0; wC < ${o}; wC++) { + float dyC = float(dyCCorner + wC) / ${s}.0; + + if (dyC < 0.0 || dyC >= ${e.outWidth}.0 || + fract(dyC) > 0.0) { + continue; + } + int idyC = int(dyC); + + int wCPerm = ${o} - 1 - wC; + + // TO DO: Vec4 over the channelMul + for (int dm = 0; dm < ${p}; dm++) { + int d2 = d1 * ${p} + dm; + float xValue = getDy(batch, idyR, idyC, d2); + float wValue = getW(wRPerm, wCPerm, d1, dm); + dotProd += xValue * wValue; + } + } + } + setOutput(dotProd); + } + `; + } +}; +function SQ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, dy: s } = e, { strides: a, dilations: i, pad: p, dimRoundingMode: u, filterShape: c } = o, l = I.computeConv2DInfo(n.shape, c, a, i, p, u, true), m = new Uh(l); + return t10.runWebGLProgram(m, [n, s], "float32"); +} +var SA = { kernelName: hp, backendName: "webgl", kernelFunc: SQ }; +function vQ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { dy: n, filter: s } = e, { strides: a, dilations: i, pad: p, dimRoundingMode: u, inputShape: c } = o, l = I.computeConv2DInfo(c, s.shape, a, i, p, u, true), m = new Gh(l); + return t10.runWebGLProgram(m, [n, s], "float32"); +} +var vA = { kernelName: gp, backendName: "webgl", kernelFunc: vQ }; +var Hh = class { + constructor(e) { + this.variableNames = ["X"], this.outputShape = [e, e], this.userCode = ` + void main() { + ivec2 coords = getOutputCoords(); + float val = coords[0] == coords[1] ? getX(coords[0]) : 0.0; + setOutput(val); + } + `; + } +}; +function kQ(r) { + let { inputs: e, backend: t10 } = r, { x: o } = e, n = [...o.shape, ...o.shape], s = x.sizeFromShape(o.shape), a = J({ inputs: { x: o }, backend: t10, attrs: { shape: [s] } }), i = new Hh(s), p = t10.runWebGLProgram(i, [a], a.dtype), u = J({ inputs: { x: p }, backend: t10, attrs: { shape: n } }); + return t10.disposeIntermediateTensorInfo(a), t10.disposeIntermediateTensorInfo(p), u; +} +var kA = { kernelName: xp, backendName: "webgl", kernelFunc: kQ }; +var qh = class { + constructor(e) { + this.variableNames = ["x", "W"], this.outputShape = e.outShape; + let { inHeight: t10, inWidth: o, padInfo: n, strideHeight: s, strideWidth: a, filterHeight: i, filterWidth: p, dilationHeight: u, dilationWidth: c } = e, { top: l, left: m } = n; + this.userCode = ` + const ivec2 strides = ivec2(${s}, ${a}); + const ivec2 pads = ivec2(${l}, ${m}); + const float neg_infinity = -3.4e38; + + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords.x; + int d1 = coords.w; + ivec2 outTopLeftCorner = + coords.yz * strides - pads; + int hBeg = outTopLeftCorner.x; + int wBeg = outTopLeftCorner.y; + + float curVal = neg_infinity; + for (int h = 0; h < ${i}; h++) { + int hIn = hBeg + h * ${u}; + + if (hIn >= 0 && hIn < ${t10}) { + for (int w = 0; w < ${p}; w++) { + int wIn = wBeg + w * ${c}; + + if (wIn >= 0 && wIn < ${o}) { + float xVal = getX(batch, hIn, wIn, d1); + float wVal = getW(h, w, d1); + + float val = xVal + wVal; + if (val > curVal) { + curVal = val; + } + } + } + } + } + + float result = curVal; + setOutput(result); + } + `; + } +}; +function TQ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, filter: s } = e, { strides: a, pad: i, dilations: p } = o, u = I.computeDilation2DInfo(n.shape, s.shape, a, i, "NHWC", p), c, l = new qh(u); + c = t10.runWebGLProgram(l, [n, s], "float32"); + let m = J({ inputs: { x: c }, backend: t10, attrs: { shape: u.outShape } }); + return t10.disposeIntermediateTensorInfo(c), m; +} +var TA = { kernelName: yp, backendName: "webgl", kernelFunc: TQ }; +function NQ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { equation: n } = o, s = e, { allDims: a, summedDims: i, idDims: p } = I.decodeEinsumEquation(n, s.length); + I.checkEinsumDimSizes(a.length, p, s); + let { path: u, steps: c } = I.getEinsumComputePath(i, p), l = c.length, m = null, f = a.length, d = []; + for (let h = 0; h < l; ++h) { + for (let g of c[h]) { + let { permutationIndices: y, expandDims: b } = I.getEinsumPermutation(f, p[g]), C; + I.isIdentityPermutation(y) ? C = s[g] : (C = xt({ inputs: { x: s[g] }, backend: t10, attrs: { perm: y } }), d.push(C)); + let w = C.shape.slice(); + for (let k = 0; k < b.length; ++k) + w.splice(b[k], 0, 1); + x.arraysEqual(C.shape, w) || (C = J({ inputs: { x: C }, backend: t10, attrs: { shape: w } }), d.push(C)), m === null ? m = C : (m = Pl({ inputs: { a: C, b: m }, backend: t10 }), d.push(m)); + } + h < l - 1 && (u[h] >= 0 && (m = Ou({ inputs: { x: m }, backend: t10, attrs: { axis: u[h] - (a.length - f), keepDims: false } }), d.push(m)), f--); + } + for (let h of d) + h !== m && t10.disposeIntermediateTensorInfo(h); + return m; +} +var NA = { kernelName: Xa, backendName: "webgl", kernelFunc: NQ }; +var _Q = "return (x >= 0.0) ? x : (exp(x) - 1.0);"; +var EQ = ` + vec4 result; + + result.r = (x.r >= 0.0) ? x.r : (exp(x.r) - 1.0); + result.g = (x.g >= 0.0) ? x.g : (exp(x.g) - 1.0); + result.b = (x.b >= 0.0) ? x.b : (exp(x.b) - 1.0); + result.a = (x.a >= 0.0) ? x.a : (exp(x.a) - 1.0); + + return result; +`; +var $Q = he({ opSnippet: _Q, packedOpSnippet: EQ }); +var _A = { kernelName: In, backendName: "webgl", kernelFunc: $Q }; +var RQ = "return (b >= 1.0) ? a : a * (b + 1.0);"; +var AQ = ` + vec4 bGTEZero = vec4(greaterThanEqual(b, vec4(0.))); + return (bGTEZero * a) + ((vec4(1.0) - bGTEZero) * (a * (b + vec4(1.0)))); +`; +var FQ = (r) => { + let { inputs: e, backend: t10 } = r, { dy: o, y: n } = e, s = P().getBool("WEBGL_PACK_BINARY_OPERATIONS") ? new Ko(AQ, o.shape, n.shape) : new _o(RQ, o.shape, n.shape); + return t10.runWebGLProgram(s, [o, n], o.dtype); +}; +var EA = { kernelName: Pm, backendName: "webgl", kernelFunc: FQ }; +var DQ = ` + return vec4(equal(a, b)); +`; +var PQ = "return float(a == b);"; +var OQ = ot({ opSnippet: PQ, packedOpSnippet: DQ, dtype: "bool", cpuKernelImpl: c$ }); +var $A = { kernelName: oo, backendName: "webgl", kernelFunc: OQ }; +var MQ = ` + // Error function is calculated approximately with elementary function. + // See "Handbook of Mathematical Functions with Formulas, + // Graphs, and Mathematical Tables", Abramowitz and Stegun. + float p = ${I.ERF_P}; + float a1 = ${I.ERF_A1}; + float a2 = ${I.ERF_A2}; + float a3 = ${I.ERF_A3}; + float a4 = ${I.ERF_A4}; + float a5 = ${I.ERF_A5}; + + float sign = sign(x); + x = abs(x); + float t = 1.0 / (1.0 + p * x); + return sign * (1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*exp(-x*x)); +`; +var LQ = he({ opSnippet: MQ }); +var RA = { kernelName: Gi, backendName: "webgl", kernelFunc: LQ }; +var BQ = jo + ` + return exp(x); +`; +var VQ = ` + vec4 result = exp(x); + bvec4 isNaN = isnan(x); + result.r = isNaN.r ? x.r : result.r; + result.g = isNaN.g ? x.g : result.g; + result.b = isNaN.b ? x.b : result.b; + result.a = isNaN.a ? x.a : result.a; + + return result; +`; +var Ow = he({ opSnippet: BQ, packedOpSnippet: VQ, cpuKernelImpl: l$, dtype: "float32" }); +var AA = { kernelName: no, backendName: "webgl", kernelFunc: Ow }; +function Kh(r) { + let { inputs: e, attrs: t10, backend: o } = r, { dim: n } = t10, { input: s } = e, a = s.shape.length, i = s.shape.slice(), p = n; + return n < 0 && (x.assert(-(a + 1) <= n, () => `Axis must be in the interval [${-(a + 1)}, ${a}]`), p = a + n + 1), i.splice(p, 0, 1), J({ inputs: { x: s }, backend: o, attrs: { shape: i } }); +} +var FA = { kernelName: xs, backendName: "webgl", kernelFunc: Kh }; +var DA = "return exp(x) - 1.0;"; +var zQ = he({ opSnippet: DA, packedOpSnippet: DA, cpuKernelImpl: m$ }); +var PA = { kernelName: wn, backendName: "webgl", kernelFunc: zQ }; +var Ll = class { + constructor(e, t10, o) { + this.variableNames = ["real", "imag"]; + let n = t10[1]; + this.outputShape = t10; + let s = o ? `2.0 * ${Math.PI}` : `-2.0 * ${Math.PI}`, a = o ? `${n}.0` : "1.0", i; + if (e === "real") + i = "return real * expR - imag * expI;"; + else if (e === "imag") + i = "return real * expI + imag * expR;"; + else + throw new Error(`FFT component must be either "real" or "imag", got ${e}.`); + this.userCode = ` + const float exponentMultiplier = ${s}; + + float unaryOpComplex(float real, float expR, float imag, float expI) { + ${i} + } + + float mulMatDFT(int batch, int index) { + float indexRatio = float(index) / float(${n}); + float exponentMultiplierTimesIndexRatio = + exponentMultiplier * indexRatio; + + float result = 0.0; + + for (int i = 0; i < ${n}; i++) { + // x = (-2|2 * PI / N) * index * i; + float x = exponentMultiplierTimesIndexRatio * float(i); + float expR = cos(x); + float expI = sin(x); + float real = getReal(batch, i); + float imag = getImag(batch, i); + + result += + unaryOpComplex(real, expR, imag, expI) / ${a}; + } + + return result; + } + + void main() { + ivec2 coords = getOutputCoords(); + setOutput(mulMatDFT(coords[0], coords[1])); + } + `; + } +}; +function jh(r, e, t10) { + let o = t10.texData.get(r.dataId), n = x.sizeFromShape(r.shape), s = r.shape[r.shape.length - 1], a = n / s, i = J({ inputs: { x: r }, backend: t10, attrs: { shape: [a, s] } }), p = i.shape, u = new Ll("real", p, e), c = new Ll("imag", p, e), l = [{ dataId: o.complexTensorInfos.real.dataId, dtype: o.complexTensorInfos.real.dtype, shape: p }, { dataId: o.complexTensorInfos.imag.dataId, dtype: o.complexTensorInfos.imag.dtype, shape: p }], m = t10.runWebGLProgram(u, l, "float32"), f = t10.runWebGLProgram(c, l, "float32"), d = Ar({ inputs: { real: m, imag: f }, backend: t10 }); + t10.disposeIntermediateTensorInfo(m), t10.disposeIntermediateTensorInfo(f); + let h = J({ inputs: { x: d }, backend: t10, attrs: { shape: r.shape } }); + return t10.disposeIntermediateTensorInfo(i), t10.disposeIntermediateTensorInfo(d), h; +} +function WQ(r) { + let { inputs: e, backend: t10 } = r, { input: o } = e; + return jh(o, false, t10); +} +var OA = { kernelName: bp, backendName: "webgl", kernelFunc: WQ }; +var Xh = class { + constructor(e, t10) { + this.outputShape = [], this.customUniforms = [{ name: "value", type: "float" }], this.variableNames = ["x"], this.outputShape = e, this.userCode = ` + void main() { + // Input can be obtained from uniform value. + setOutput(value); + } + `; + } +}; +function Ba(r) { + let { backend: e, attrs: t10 } = r, { shape: o, value: n } = t10, { dtype: s } = t10; + if (s = s || x.inferDtype(n), s === "string") { + let a = x.getArrayFromDType(s, x.sizeFromShape(o)); + return a.fill(n), e.makeTensorInfo(o, s, a); + } else { + let a = new Xh(o, n), i = [[n]]; + return e.runWebGLProgram(a, [], s, i); + } +} +var MA = { kernelName: ys, backendName: "webgl", kernelFunc: Ba }; +var Yh = class { + constructor(e) { + this.variableNames = ["Image"], this.outputShape = []; + let t10 = e[2]; + this.outputShape = e, this.userCode = ` + void main() { + ivec4 coords = getOutputCoords(); + int x = coords[2]; + + int coordX = ${t10} - x - 1; + float outputValue; + if(coordX >= 0 && coordX < ${t10}) { + outputValue = getImage(coords[0], coords[1], coordX, coords[3]); + } else { + outputValue = getImage(coords[0], coords[1], coords[2], coords[3]); + } + setOutput(outputValue); + } + `; + } +}; +var LA = { kernelName: Sn, backendName: "webgl", kernelFunc: ({ inputs: r, backend: e }) => { + let { image: t10 } = r, o = e, n = new Yh(t10.shape); + return o.runWebGLProgram(n, [t10], t10.dtype); +} }; +var BA = "return floor(x);"; +var UQ = he({ opSnippet: BA, packedOpSnippet: BA, cpuKernelImpl: f$ }); +var VA = { kernelName: so, backendName: "webgl", kernelFunc: UQ }; +var GQ = ` + float s = sign(a) * sign(b); + int ia = round(a); + int ib = round(b); + if (ib != 0) { + // Windows (D3D) wants guaranteed non-zero int division at compile-time. + return float(idiv(ia, ib, s)); + } else { + return NAN; + } +`; +var HQ = ` + ivec4 ia = round(a); + ivec4 ib = round(b); + bvec4 cond = notEqual(ib, ivec4(0)); + ivec4 result = ivec4(0); + vec4 s = sign(a) * sign(b); + + // Windows (D3D) wants guaranteed non-zero int division at compile-time. + if (cond[0]) { + result[0] = idiv(ia[0], ib[0], s[0]); + } + if (cond[1]) { + result[1] = idiv(ia[1], ib[1], s[1]); + } + if (cond[2]) { + result[2] = idiv(ia[2], ib[2], s[2]); + } + if (cond[3]) { + result[3] = idiv(ia[3], ib[3], s[3]); + } + return vec4(result); +`; +var qQ = ot({ opSnippet: GQ, packedOpSnippet: HQ, dtype: "int32" }); +var zA = { kernelName: vn, backendName: "webgl", kernelFunc: qQ }; +var Qh = class { + constructor(e) { + this.variableNames = ["A"]; + let t10 = Ct(), [o, n] = e; + this.outputShape = e, this.userCode = ` + void main() { + ivec3 coords = getOutputCoords(); + int texR = coords[0]; + int texC = coords[1]; + int depth = coords[2]; + vec2 uv = (vec2(texC, texR) + halfCR) / vec2(${n}.0, ${o}.0); + + vec4 values = ${t10.texture2D}(A, uv); + float value; + if (depth == 0) { + value = values.r; + } else if (depth == 1) { + value = values.g; + } else if (depth == 2) { + value = values.b; + } else if (depth == 3) { + value = values.a; + } + + setOutput(floor(value * 255.0 + 0.5)); + } + `; + } +}; +var Zh = class { + constructor(e) { + this.variableNames = ["A"], this.packedInputs = false, this.packedOutput = true; + let t10 = Ct(), [o, n] = e; + this.outputShape = e, this.userCode = ` + void main() { + ivec3 coords = getOutputCoords(); + int texR = coords[0]; + int texC = coords[1]; + int depth = coords[2]; + + vec4 result = vec4(0.); + + for(int row=0; row<=1; row++) { + for(int col=0; col<=1; col++) { + texC = coords[1] + row; + depth = coords[2] + col; + + vec2 uv = (vec2(texC, texR) + halfCR) / + vec2(${n}.0, ${o}.0); + vec4 values = ${t10.texture2D}(A, uv); + float value; + if (depth == 0) { + value = values.r; + } else if (depth == 1) { + value = values.g; + } else if (depth == 2) { + value = values.b; + } else if (depth == 3) { + value = values.a; + } + + result[row * 2 + col] = floor(value * 255.0 + 0.5); + } + } + + ${t10.output} = result; + } + `; + } +}; +var WA = { kernelName: Zi, backendName: "webgl", kernelFunc: KQ }; +var Sc; +var Mw = P().getBool("CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU"); +function KQ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { pixels: n } = e, { numChannels: s } = o, a = typeof HTMLVideoElement != "undefined" && n instanceof HTMLVideoElement, i = typeof HTMLImageElement != "undefined" && n instanceof HTMLImageElement, [p, u] = a ? [n.videoWidth, n.videoHeight] : [n.width, n.height], c = [u, p], l = [u, p, s]; + if (i || a) { + let h = P().getBool("CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU"); + (Sc == null || h !== Mw) && (Mw = h, Sc = document.createElement("canvas").getContext("2d", { willReadFrequently: Mw })), Sc.canvas.width = p, Sc.canvas.height = u, Sc.drawImage(n, 0, 0, p, u), n = Sc.canvas; + } + let m = t10.makeTensorInfo(c, "int32"); + t10.texData.get(m.dataId).usage = ir.PIXELS, t10.gpgpu.uploadPixelDataToTexture(t10.getTexture(m.dataId), n); + let f = P().getBool("WEBGL_PACK") ? new Zh(l) : new Qh(l), d = t10.runWebGLProgram(f, [m], "int32"); + return t10.disposeData(m.dataId), d; +} +function jQ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, filter: s, bias: a, preluActivationWeights: i } = e, { strides: p, pad: u, dataFormat: c, dilations: l, dimRoundingMode: m, activation: f, leakyreluAlpha: d } = o, h = I.convertConv2DDataFormat(c), g = I.computeConv2DInfo(n.shape, s.shape, p, l, u, m, false, h), y, b = [], C = a != null, w = i != null, k = f === "leakyrelu", _ = () => { + let R = [n, s], A = (D, O) => { + if (O === "NCHW" && D.shape.length === 1 && D.shape[0] !== 1) { + let M = J({ inputs: { x: D }, backend: t10, attrs: { shape: [D.shape[0], 1, 1] } }); + return b.push(M), M; + } + return D; + }; + if (C && R.push(A(a, c)), w && R.push(A(i, c)), k) { + let D = t10.makeTensorInfo([], "float32", x.createScalarValue(d, "float32")); + R.push(D), b.push(D); + } + return R; + }; + if (g.filterHeight === 1 && g.filterWidth === 1 && g.dilationHeight === 1 && g.dilationWidth === 1 && g.strideHeight === 1 && g.strideWidth === 1 && (g.padInfo.type === "SAME" || g.padInfo.type === "VALID")) + y = Dh({ x: n, filter: s, convInfo: g, backend: t10, bias: a, activation: f, preluActivationWeights: i, leakyreluAlpha: d }); + else if (g.strideWidth <= 2 && h === "channelsLast" && P().getBool("WEBGL_EXP_CONV")) { + let R = f ? Ma(f, true) : null, A = new Cc(g, C, R, w, k), D = [[g.padInfo.top, g.padInfo.left], [g.strideHeight, g.strideWidth], [g.dilationHeight, g.dilationWidth], [g.inHeight, g.inWidth]], O = _(); + y = t10.runWebGLProgram(A, O, "float32", D); + } else if (P().getBool("WEBGL_CONV_IM2COL")) + y = Ph({ x: n, filter: s, convInfo: g, backend: t10, bias: a, activation: f, preluActivationWeights: i, leakyreluAlpha: d }); + else { + let R = f ? Ma(f, false) : null, A = new bc(g, C, R, w, k), D = _(); + y = t10.runWebGLProgram(A, D, "float32"); + } + let E = J({ inputs: { x: y }, backend: t10, attrs: { shape: g.outShape } }); + return b.push(y), b.forEach((R) => t10.disposeIntermediateTensorInfo(R)), E; +} +var UA = { kernelName: Do, backendName: "webgl", kernelFunc: jQ }; +function XQ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, filter: s, bias: a, preluActivationWeights: i } = e, { strides: p, pad: u, dilations: c, dimRoundingMode: l, activation: m, leakyreluAlpha: f } = o, d = [], h = c; + h == null && (h = [1, 1]), x.assert(I.eitherStridesOrDilationsAreOne(p, h), () => `Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${p} and dilations '${h}'`); + let g = I.computeConv2DInfo(n.shape, s.shape, p, h, u, l, true), y = P().getBool("WEBGL_PACK_DEPTHWISECONV") && g.strideWidth <= 2 && g.outChannels / g.inChannels === 1, b = m ? Ma(m, y) : null, C = [n, s], w = a != null, k = i != null, _ = m === "leakyrelu"; + if (w && C.push(a), k && C.push(i), _) { + let D = t10.makeTensorInfo([], "float32", x.createScalarValue(f, "float32")); + C.push(D), d.push(D); + } + let E; + y ? E = new wc(g, w, b, k, _) : E = new Ic(g, w, b, k, _); + let R = [[g.padInfo.top, g.padInfo.left], [g.strideHeight, g.strideWidth], [g.dilationHeight, g.dilationWidth], [g.inHeight, g.inWidth]], A = t10.runWebGLProgram(E, C, "float32", R); + return d.forEach((D) => t10.disposeIntermediateTensorInfo(D)), A; +} +var GA = { kernelName: Po, backendName: "webgl", kernelFunc: XQ }; +var Jh = class { + constructor(e, t10, o, n) { + this.sliceDim = e, this.strides = t10, this.paramsShape = n, this.variableNames = ["x", "indices"], this.outputShape = o; + let s = _e(o.length), a = ` + int index;`; + for (let i = 0; i < this.sliceDim; i++) + a += ` + index = round(getIndices(coords[0], ${i})); + out_of_bounds = out_of_bounds || index < 0; + out_of_bounds = out_of_bounds || index >= ${this.paramsShape[i]}; + flattenIndex += index * ${this.strides[i]};`; + this.userCode = ` + void main() { + ${s} coords = getOutputCoords(); + int flattenIndex = 0; + bool out_of_bounds = false; + + ${a} + + setOutput(out_of_bounds ? 0.0 : getX(flattenIndex, coords[1])); + } + `; + } +}; +function YQ(r) { + let { inputs: e, backend: t10 } = r, { params: o, indices: n } = e, s = n.shape, a = s[s.length - 1], i = x.sizeFromShape(o.shape), [p, u, c, l] = I.prepareAndValidate(o, n), m = J({ inputs: { x: n }, backend: t10, attrs: { shape: [u, a] } }), f = J({ inputs: { x: o }, backend: t10, attrs: { shape: [x.sizeFromShape(o.shape) / c, c] } }); + if (t10.shouldExecuteOnCPU([o, n]) || o.dtype === "string") { + let y = t10.readSync(n.dataId), b = t10.bufferSync(o), C = d$(y, b, o.dtype, u, a, c, l, o.shape, i); + return t10.makeTensorInfo(p, o.dtype, C.values); + } + let d = new Jh(a, l, [u, c], o.shape), h = t10.runWebGLProgram(d, [f, m], f.dtype), g = J({ inputs: { x: h }, backend: t10, attrs: { shape: p } }); + return t10.disposeIntermediateTensorInfo(m), t10.disposeIntermediateTensorInfo(f), t10.disposeIntermediateTensorInfo(h), g; +} +var HA = { kernelName: Tn, backendName: "webgl", kernelFunc: YQ }; +var eg = class { + constructor(e, t10) { + this.variableNames = ["A", "indices"], this.outputShape = t10, this.rank = t10.length; + let o = _e(this.rank), n = QQ(e, 2); + this.userCode = ` + void main() { + ${o} resRC = getOutputCoords(); + int index = int(getIndices(resRC.x, resRC.z)); + float inBounds = (index >= 0) && (index < ${e[2]}) ? 1.0 : 0.0; + setOutput(inBounds * getA(${n})); + } + `; + } +}; +function QQ(r, e) { + let t10 = ["resRC.x", "resRC.y", "resRC.z", "resRC.w"], o = []; + for (let n = 0; n < r.length; n++) + n === 2 ? o.push("index") : o.push(`${t10[n]}`); + return o.join(); +} +function Lw(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, indices: s } = e, { axis: a, batchDims: i } = o, p = x.parseAxisParam(a, n.shape)[0]; + if (P().get("DEBUG")) { + let b = t10.readSync(s.dataId), C = n.shape[p]; + for (let w = 0; w < b.length; ++w) { + let k = b[w]; + x.assert(k <= C - 1 && k >= 0, () => `GatherV2: the index value ${k} is not in [0, ${C - 1}]`); + } + } + let u = I.segment_util.collectGatherOpShapeInfo(n, s, p, i), c = x.sizeFromShape(s.shape), l = [], m = J({ inputs: { x: n }, backend: t10, attrs: { shape: [u.batchSize, u.outerSize, u.dimSize, u.sliceSize] } }), f = J({ inputs: { x: s }, backend: t10, attrs: { shape: [u.batchSize, c / u.batchSize] } }); + l.push(m), l.push(f); + let d = [u.batchSize, u.outerSize, c / u.batchSize, u.sliceSize]; + if (t10.shouldExecuteOnCPU([n, s]) || n.dtype === "string") { + let b = t10.bufferSync(f), C = t10.bufferSync(m), w = h$(C, b, d); + return l.forEach((k) => t10.disposeIntermediateTensorInfo(k)), t10.makeTensorInfo(u.outputShape, w.dtype, w.values); + } + let h = new eg(m.shape, d), g = t10.runWebGLProgram(h, [m, f], m.dtype); + l.push(g); + let y = J({ inputs: { x: g }, backend: t10, attrs: { shape: u.outputShape } }); + return l.forEach((b) => t10.disposeIntermediateTensorInfo(b)), y; +} +var qA = { kernelName: bs, backendName: "webgl", kernelFunc: Lw }; +var ZQ = "return float(a > b);"; +var JQ = ` + return vec4(greaterThan(a, b)); +`; +var e7 = ot({ opSnippet: ZQ, packedOpSnippet: JQ, cpuKernelImpl: g$, dtype: "bool" }); +var KA = { kernelName: ao, backendName: "webgl", kernelFunc: e7 }; +var t7 = "return float(a >= b);"; +var r7 = ` + return vec4(greaterThanEqual(a, b)); +`; +var o7 = ot({ opSnippet: t7, packedOpSnippet: r7, dtype: "bool", cpuKernelImpl: x$ }); +var jA = { kernelName: io, backendName: "webgl", kernelFunc: o7 }; +function n7(r) { + let { inputs: e, backend: t10 } = r, { input: o } = e; + return jh(o, true, t10); +} +var XA = { kernelName: Cp, backendName: "webgl", kernelFunc: n7 }; +var s7 = "return float(!isnan(x) && !isinf(x));"; +var a7 = he({ opSnippet: s7, dtype: "bool" }); +var YA = { kernelName: Hi, backendName: "webgl", kernelFunc: a7 }; +var i7 = "return float(isinf(x));"; +var u7 = he({ opSnippet: i7, dtype: "bool" }); +var QA = { kernelName: qi, backendName: "webgl", kernelFunc: u7 }; +var p7 = "return float(isnan(x));"; +var c7 = he({ opSnippet: p7, dtype: "bool" }); +var ZA = { kernelName: ia, backendName: "webgl", kernelFunc: c7 }; +var l7 = "return float(a < b);"; +var m7 = ` + return vec4(lessThan(a, b)); +`; +var f7 = ot({ opSnippet: l7, packedOpSnippet: m7, cpuKernelImpl: y$, dtype: "bool" }); +var JA = { kernelName: po, backendName: "webgl", kernelFunc: f7 }; +var d7 = "return float(a <= b);"; +var h7 = ` + return vec4(lessThanEqual(a, b)); +`; +var g7 = ot({ opSnippet: d7, packedOpSnippet: h7, cpuKernelImpl: b$, dtype: "bool" }); +var eF = { kernelName: co, backendName: "webgl", kernelFunc: g7 }; +function x7(r) { + let { backend: e, attrs: t10 } = r, { start: o, stop: n, num: s } = t10, a = C$(o, n, s); + return e.makeTensorInfo([a.length], "float32", a); +} +var tF = { kernelName: Ip, backendName: "webgl", kernelFunc: x7 }; +var y7 = jo + ` + return x < 0.0 ? 0./0. : log(x); +`; +var b7 = ` + vec4 result = log(x); + bvec4 isNaN = isnan(x); + result.r = isNaN.r ? x.r : (x.r < 0.0 ? 0./0. : result.r); + result.g = isNaN.g ? x.g : (x.g < 0.0 ? 0./0. : result.g); + result.b = isNaN.b ? x.b : (x.b < 0.0 ? 0./0. : result.b); + result.a = isNaN.a ? x.a : (x.a < 0.0 ? 0./0. : result.a); + return result; +`; +var C7 = he({ opSnippet: y7, packedOpSnippet: b7, cpuKernelImpl: I$ }); +var rF = { kernelName: lo, backendName: "webgl", kernelFunc: C7 }; +var I7 = jo + ` + return log(1.0 + x); +`; +var w7 = he({ opSnippet: I7 }); +var oF = { kernelName: Ki, backendName: "webgl", kernelFunc: w7 }; +var S7 = "return float(a >= 1.0 && b >= 1.0);"; +var v7 = ` + return vec4( + vec4(greaterThanEqual(a, vec4(1.0))) * + vec4(greaterThanEqual(b, vec4(1.0)))); +`; +var k7 = ot({ opSnippet: S7, packedOpSnippet: v7, dtype: "bool" }); +var nF = { kernelName: _n, backendName: "webgl", kernelFunc: k7 }; +var T7 = "return float(!(x >= 1.0));"; +var N7 = he({ opSnippet: T7 }); +var sF = { kernelName: En, backendName: "webgl", kernelFunc: N7 }; +var _7 = "return float(a >= 1.0 || b >= 1.0);"; +var E7 = ` + return min( + vec4(greaterThanEqual(a, vec4(1.0))) + + vec4(greaterThanEqual(b, vec4(1.0))), + vec4(1.0)); +`; +var $7 = ot({ opSnippet: _7, packedOpSnippet: E7, dtype: "bool" }); +var aF = { kernelName: ua, backendName: "webgl", kernelFunc: $7 }; +var tg = class { + constructor(e, t10, o, n, s) { + this.variableNames = ["x"], this.outputShape = []; + let a = t10, i = e[3] - 1; + this.outputShape = e; + let p, u = `float(${o}) + float(${n}) * sum`; + s === 0.5 ? p = `inversesqrt(${u})` : s === 1 ? p = `1.0/(${u})` : p = `exp(log(${u}) * float(-${s}));`, this.userCode = ` + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int r = coords[1]; + int c = coords[2]; + int d = coords[3]; + float x = getX(b, r, c, d); + float sum = 0.0; + for (int j = -${a}; j <= ${a}; j++) { + int idx = d + j; + if (idx >= 0 && idx <= ${i}) { + float z = getX(b, r, c, idx); + sum += z * z; + } + } + float val = x * ${p}; + setOutput(val); + } + `; + } +}; +var rg = class { + constructor(e, t10, o, n, s) { + this.variableNames = ["x"], this.outputShape = [], this.packedInputs = true, this.packedOutput = true; + let a = t10, i = e[3] - 1; + this.outputShape = e; + let p, u = `float(${o}) + float(${n}) * sum`; + s === 0.5 ? p = `inversesqrt(${u})` : s === 1 ? p = `1.0/(${u})` : p = `exp(log(${u}) * float(-${s}));`, this.userCode = ` + void main() { + ivec4 coords = getOutputCoords(); + int b = coords.x; + int r = coords.y; + int c = coords.z; + int d = coords.w; + + bool hasNextCol = d < ${this.outputShape[3]}; + bool hasNextRow = c < ${this.outputShape[2]}; + + vec4 sum = vec4(0.); + vec4 xFragAtOutputCoords = getX(b, r, c, d); + + vec4 xAtOutputCoords = vec4( + getChannel(xFragAtOutputCoords, vec2(c, d)), + hasNextCol ? + getChannel(xFragAtOutputCoords, vec2(c, d + 1)) : 0.0, + hasNextRow ? + getChannel(xFragAtOutputCoords , vec2(c + 1, d)) : 0.0, + (hasNextRow && hasNextCol) ? + getChannel(xFragAtOutputCoords, vec2(c + 1, d + 1)) : 0.0 + ); + + int firstChannel = d - ${a}; + vec2 cache = vec2(0.); + if(firstChannel >= 0){ + vec4 firstChannelFrag = getX(b, r, c, firstChannel); + cache.x = getChannel(firstChannelFrag, vec2(c, firstChannel)); + if(hasNextRow){ + cache.y = getChannel(firstChannelFrag, vec2(c + 1, firstChannel)); + } + } + + ivec2 depth = ivec2(d, d + 1); + for (int j = - ${a}; j <= ${a}; j++) { + ivec2 idx = depth + j; + bvec2 aboveLowerBound = greaterThanEqual(idx, ivec2(0)); + bvec2 belowUpperBound = lessThanEqual(idx, ivec2(${i})); + + bool depthInRange = aboveLowerBound.x && belowUpperBound.x; + bool depthPlusOneInRange = aboveLowerBound.y && belowUpperBound.y; + + if(depthInRange || depthPlusOneInRange){ + vec4 z = vec4(0.); + vec4 xFragAtCurrentDepth; + z.xz = cache.xy; + if(depthPlusOneInRange && hasNextCol){ + xFragAtCurrentDepth = idx.y != d ? + getX(b, r, c, idx.y) : xFragAtOutputCoords; + z.y = getChannel(xFragAtCurrentDepth, vec2(c, idx.y)); + if(hasNextRow){ + z.w = getChannel(xFragAtCurrentDepth, vec2(c + 1, idx.y)); + } + } + cache.xy = z.yw; + sum += z * z; + } + } + vec4 result = xAtOutputCoords * ${p}; + setOutput(result); + } + `; + } +}; +var R7 = (r) => { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { depthRadius: s, bias: a, alpha: i, beta: p } = o, u = P().getBool("WEBGL_PACK_NORMALIZATION") ? new rg(n.shape, s, a, i, p) : new tg(n.shape, s, a, i, p); + return t10.runWebGLProgram(u, [n], n.dtype); +}; +var iF = { kernelName: wp, backendName: "webgl", kernelFunc: R7 }; +var og = class { + constructor(e, t10, o, n, s) { + this.variableNames = ["inputImage", "outputImage", "dy"], this.outputShape = [], this.outputShape = e, this.depth = e[3], this.depthRadius = t10, this.bias = o, this.alpha = n, this.beta = s, this.userCode = ` + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int r = coords[1]; + int c = coords[2]; + + float result = 0.0; + for (int d = 0; d < ${this.depth}; ++d) { + int depthBegin = int(max(0.0, float(d - ${t10}))); + int depthEnd = int(min(float(${this.depth}), + float(d + ${t10} + 1))); + + const int MIN_DEPTH_BEGIN = 0; + const int MAX_DEPTH_END = ${this.depth}; + + float norm = 0.0; + for (int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k) { + if (k < depthBegin){ + continue; + } + else if (k >= depthBegin && k < depthEnd) { + norm += getInputImage(b, r, c, k) * getInputImage(b, r, c, k); + } + else { + break; + } + } + + norm = float(${n}) * norm + float(${o}); + + for(int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k){ + if (k < depthBegin){ + continue; + } + else if (k >= depthBegin && k < depthEnd){ + float dyi = -2.0 * float(${n}) + * float(${s}) + * getInputImage(b ,r ,c, k) * getOutputImage(b, r, c, d) + / norm; + if (k == d) { + dyi += pow(norm, -1.0 * ${s}); + } + if (k == coords[3]) { + dyi *= getDy(b, r, c, d); + result += dyi; + } + } + else { + break; + } + } + } + setOutput(result); + } + `; + } +}; +var A7 = (r) => { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, y: s, dy: a } = e, { depthRadius: i, bias: p, alpha: u, beta: c } = o, l = new og(n.shape, i, p, u, c); + return t10.runWebGLProgram(l, [n, s, a], n.dtype); +}; +var uF = { kernelName: Om, backendName: "webgl", kernelFunc: A7 }; +function pF(r, e, t10, o) { + let n = x.sizeFromShape(e), a = x.sizeFromShape(r.shape) / n, i = J({ inputs: { x: r }, attrs: { shape: [a, n] }, backend: o }), p = qr(i, r.dtype, "max", o), u = J({ inputs: { x: p }, attrs: { shape: t10 }, backend: o }); + return o.disposeIntermediateTensorInfo(i), o.disposeIntermediateTensorInfo(p), u; +} +function Bw(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { reductionIndices: s, keepDims: a } = o, i = n.shape.length, p = x.parseAxisParam(s, n.shape), u = p, c = I.getAxesPermutation(u, i), l = c != null, m = t10.shouldExecuteOnCPU([n]), f = n; + if (l) { + if (m) { + let C = t10.texData.get(f.dataId).values, w = new Array(i); + for (let E = 0; E < w.length; E++) + w[E] = n.shape[c[E]]; + let k = Du(C, n.shape, n.dtype, c, w); + f = t10.makeTensorInfo(w, n.dtype); + let _ = t10.texData.get(f.dataId); + _.values = k; + } else + f = _i(n, c, t10); + u = I.getInnerMostAxes(u.length, i); + } + I.assertAxesAreInnerMostDims("max", u, i); + let [d, h] = I.computeOutAndReduceShapes(f.shape, u), g = d; + a && (g = I.expandShapeToKeepDim(d, p)); + let y; + if (m) { + let C = t10.texData.get(f.dataId).values, w = w$(C, x.sizeFromShape(h), g, n.dtype); + y = t10.makeTensorInfo(g, n.dtype); + let k = t10.texData.get(y.dataId); + k.values = w; + } else + y = pF(f, h, g, t10); + return l && t10.disposeIntermediateTensorInfo(f), y; +} +var cF = { kernelName: $n, backendName: "webgl", kernelFunc: Bw }; +var F7 = gc + ` + return max(a, b); +`; +var D7 = ` + vec4 result = vec4(max(a, b)); + bvec4 isNaNA = isnan(a); + bvec4 isNaNB = isnan(b); + bvec4 isNaN = bvec4(isNaNA.x || isNaNB.x, isNaNA.y || isNaNB.y, isNaNA.z || isNaNB.z, isNaNA.w || isNaNB.w); + ` + js + ` + return result; +`; +var P7 = ot({ opSnippet: F7, packedOpSnippet: D7, cpuKernelImpl: S$ }); +var lF = { kernelName: mo, backendName: "webgl", kernelFunc: P7 }; +function O7(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e; + as(n, "maxPool"); + let { filterSize: s, strides: a, pad: i, dimRoundingMode: p } = o, u = 1; + x.assert(I.eitherStridesOrDilationsAreOne(a, u), () => `Error in maxPool: Either strides or dilations must be 1. Got strides ${a} and dilations '${u}'`); + let c = I.computePool2DInfo(n.shape, s, a, u, i, p); + if (c.filterWidth === 1 && c.filterHeight === 1 && x.arraysEqual(c.inShape, c.outShape)) + return Rt({ inputs: { x: n }, backend: t10 }); + let l = new us(c, "max", false); + return t10.runWebGLProgram(l, [n], n.dtype); +} +var mF = { kernelName: Rn, backendName: "webgl", kernelFunc: O7 }; +function M7(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { filterSize: s, strides: a, pad: i, dataFormat: p, dimRoundingMode: u } = o, c = [1, 1, 1], l = I.computePool3DInfo(n.shape, s, a, c, i, u, p), m = new Ei(l, "max", false); + return t10.runWebGLProgram(m, [n], n.dtype); +} +var fF = { kernelName: Sp, backendName: "webgl", kernelFunc: M7 }; +var ng = class { + constructor(e) { + this.variableNames = ["dy", "maxPos"], this.outputShape = e.inShape; + let t10 = e.strideHeight, o = e.strideWidth, n = e.dilationHeight, s = e.effectiveFilterHeight, a = e.effectiveFilterWidth, i = s - 1 - e.padInfo.top, p = a - 1 - e.padInfo.left, u = s * a - 1; + this.userCode = ` + const ivec2 pads = ivec2(${i}, ${p}); + + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + + ivec2 dyRCCorner = coords.yz - pads; + int dyRCorner = dyRCCorner.x; + int dyCCorner = dyRCCorner.y; + + // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + for (int wR = 0; wR < ${s}; + wR += ${n}) { + float dyR = float(dyRCorner + wR) / ${t10}.0; + + if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) { + continue; + } + int idyR = int(dyR); + + for (int wC = 0; wC < ${a}; wC++) { + float dyC = float(dyCCorner + wC) / ${o}.0; + + if (dyC < 0.0 || dyC >= ${e.outWidth}.0 || + fract(dyC) > 0.0) { + continue; + } + int idyC = int(dyC); + + float dyValue = getDy(b, idyR, idyC, d); + int maxPosValue = ${u} - int(getMaxPos(b, idyR, idyC, d)); + + // Get the current value, check it against the value from the + // position matrix. + int curPosValue = wR * ${a} + wC; + float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0); + + dotProd += dyValue * mask; + } + } + setOutput(dotProd); + } + `; + } +}; +var sg = class { + constructor(e) { + this.variableNames = ["dy", "maxPos"], this.outputShape = e.inShape; + let t10 = e.strideDepth, o = e.strideHeight, n = e.strideWidth, s = e.dilationDepth, a = e.dilationHeight, i = e.dilationWidth, p = e.effectiveFilterDepth, u = e.effectiveFilterHeight, c = e.effectiveFilterWidth, l = p - 1 - e.padInfo.front, m = u - 1 - e.padInfo.top, f = c - 1 - e.padInfo.left, d = p * u * c - 1; + this.userCode = ` + const ivec3 pads = ivec3(${l}, ${m}, ${f}); + + void main() { + ivec5 coords = getOutputCoords(); + int batch = coords.x; + int ch = coords.u; + + ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads; + int dyDCorner = dyCorner.x; + int dyRCorner = dyCorner.y; + int dyCCorner = dyCorner.z; + + // Convolve dy(?, ?, ?, ch) with pos mask(:, :, :, d) to get + // dx(xD, xR, xC, ch). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + + for (int wD = 0; wD < ${p}; + wD += ${s}) { + float dyD = float(dyDCorner + wD) / ${t10}.0; + + if (dyD < 0.0 || dyD >= ${e.outDepth}.0 || fract(dyD) > 0.0) { + continue; + } + int idyD = int(dyD); + + for (int wR = 0; wR < ${u}; + wR += ${a}) { + float dyR = float(dyRCorner + wR) / ${o}.0; + + if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || + fract(dyR) > 0.0) { + continue; + } + int idyR = int(dyR); + + for (int wC = 0; wC < ${c}; + wC += ${i}) { + float dyC = float(dyCCorner + wC) / ${n}.0; + + if (dyC < 0.0 || dyC >= ${e.outWidth}.0 || + fract(dyC) > 0.0) { + continue; + } + int idyC = int(dyC); + + float dyValue = getDy(batch, idyD, idyR, idyC, ch); + int maxPosValue = ${d} - + int(getMaxPos(batch, idyD, idyR, idyC, ch)); + + // Get the current value, check it against the value from the + // position matrix. + int curPosValue = + wD * ${u} * ${c} + + wR * ${c} + wC; + float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0); + + dotProd += dyValue * mask; + } + } + } + setOutput(dotProd); + } + `; + } +}; +function L7(r) { + let { inputs: e, backend: t10, attrs: o } = r, { dy: n, input: s } = e, a = s, { filterSize: i, strides: p, pad: u, dimRoundingMode: c } = o, l = [1, 1, 1], m = I.computePool3DInfo(a.shape, i, p, l, u, c), f = new Ei(m, "max", true), d = t10.runWebGLProgram(f, [a], a.dtype), h = new sg(m), g = t10.runWebGLProgram(h, [n, d], a.dtype); + return t10.disposeIntermediateTensorInfo(d), g; +} +var dF = { kernelName: Lm, backendName: "webgl", kernelFunc: L7 }; +function B7(r) { + let { inputs: e, backend: t10, attrs: o } = r, { dy: n, input: s, output: a } = e, i = s; + as([s, a], "maxPoolGrad"); + let { filterSize: p, strides: u, pad: c, dimRoundingMode: l } = o, m = I.computePool2DInfo(i.shape, p, u, 1, c, l), f = true, d = new us(m, "max", f), h = t10.runWebGLProgram(d, [i], i.dtype), g = new ng(m), y = t10.runWebGLProgram(g, [n, h], i.dtype); + return t10.disposeIntermediateTensorInfo(h), y; +} +var hF = { kernelName: Mm, backendName: "webgl", kernelFunc: B7 }; +function gF(r, e, t10, o) { + let n = new us(t10, "max", false), s = o.runWebGLProgram(n, [r], "float32"); + n = new us(t10, "max", true, true, e); + let a = o.runWebGLProgram(n, [r], "float32"); + return [s, a]; +} +var xF = { kernelName: vp, backendName: "webgl", kernelFunc: ({ inputs: r, attrs: e, backend: t10 }) => { + let { x: o } = r, { filterSize: n, strides: s, pad: a, includeBatchInIndex: i } = e, p = t10; + x.assert(o.shape.length === 4, () => `Error in maxPool: input must be rank 4 but got rank ${o.shape.length}.`); + let u = [1, 1]; + x.assert(I.eitherStridesOrDilationsAreOne(s, u), () => `Error in maxPool: Either strides or dilations must be 1. Got strides ${s} and dilations '${u}'`); + let c = I.computePool2DInfo(o.shape, n, s, u, a), [l, m] = gF(o, i, c, p); + return [l, m]; +} }; +function yF(r, e, t10, o) { + let n = x.sizeFromShape(e), a = x.sizeFromShape(r.shape) / n, i = J({ inputs: { x: r }, attrs: { shape: [a, n] }, backend: o }), p = qr(i, "float32", "mean", o), u = J({ inputs: { x: p }, attrs: { shape: t10 }, backend: o }); + return o.disposeIntermediateTensorInfo(i), o.disposeIntermediateTensorInfo(p), u; +} +var bF = { kernelName: An, backendName: "webgl", kernelFunc: ({ inputs: r, attrs: e, backend: t10 }) => { + let { x: o } = r, { keepDims: n, axis: s } = e, a = t10, i = o.shape.length, p = x.parseAxisParam(s, o.shape), u = p, c = I.getAxesPermutation(u, i), l = c != null, m = a.shouldExecuteOnCPU([o]), f = [], d = o; + if (l) { + if (m) { + let w = a.texData.get(d.dataId).values, k = new Array(i); + for (let R = 0; R < k.length; R++) + k[R] = o.shape[c[R]]; + let _ = Du(w, o.shape, o.dtype, c, k); + d = a.makeTensorInfo(k, o.dtype); + let E = a.texData.get(d.dataId); + E.values = _; + } else + d = _i(o, c, a); + f.push(d), u = I.getInnerMostAxes(u.length, i); + } + I.assertAxesAreInnerMostDims("sum", u, i); + let [h, g] = I.computeOutAndReduceShapes(d.shape, u), y = h; + n && (y = I.expandShapeToKeepDim(h, p)); + let b = yF(d, g, y, a); + for (let C of f) + a.disposeIntermediateTensorInfo(C); + return b; +} }; +function V7(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { axis: s, keepDims: a } = o, i = n.shape.length, p = x.parseAxisParam(s, n.shape), u = p, c = I.getAxesPermutation(u, i), l = n; + c != null && (l = xt({ inputs: { x: n }, backend: t10, attrs: { perm: c } }), u = I.getInnerMostAxes(u.length, n.shape.length)), I.assertAxesAreInnerMostDims("min", u, i); + let [m, f] = I.computeOutAndReduceShapes(l.shape, u), d = x.sizeFromShape(f), h = J({ inputs: { x: l }, backend: t10, attrs: { shape: [-1, d] } }), g = qr(h, h.dtype, "min", t10), y; + if (a) { + let b = I.expandShapeToKeepDim(m, p); + y = J({ inputs: { x: g }, backend: t10, attrs: { shape: b } }); + } else + y = J({ inputs: { x: g }, backend: t10, attrs: { shape: m } }); + return t10.disposeIntermediateTensorInfo(h), t10.disposeIntermediateTensorInfo(g), c != null && t10.disposeIntermediateTensorInfo(l), y; +} +var CF = { kernelName: Fn, backendName: "webgl", kernelFunc: V7 }; +var z7 = gc + ` + return min(a, b); +`; +var W7 = ` + vec4 result = vec4(min(a, b)); + bvec4 isNaNA = isnan(a); + bvec4 isNaNB = isnan(b); + bvec4 isNaN = bvec4(isNaNA.x || isNaNB.x, isNaNA.y || isNaNB.y, isNaNA.z || isNaNB.z, isNaNA.w || isNaNB.w); + ` + js + ` + return result; +`; +var U7 = ot({ opSnippet: z7, packedOpSnippet: W7, cpuKernelImpl: v$ }); +var IF = { kernelName: fo, backendName: "webgl", kernelFunc: U7 }; +var ag = class { + constructor(e, t10, o) { + this.variableNames = ["x"], this.outputShape = t10.map((c, l) => c[0] + e[l] + c[1]); + let n = e.length, s = _e(n), a = t10.map((c) => c[0]).join(","), i = t10.map((c, l) => c[0] + e[l]).join(","), p = ["coords[0]", "coords[1]", "coords[2]", "coords[3]"].slice(0, n), u = o === "reflect" ? 0 : 1; + if (n === 1) { + this.userCode = ` + int start = ${a}; + int end = ${i}; + + void main() { + int outC = getOutputCoords(); + if (outC < start) { + outC = start * 2 - outC - ${u}; + } else if(outC >= end) { + outC = (end - 1) * 2 - outC + ${u}; + } + setOutput(getX(outC - start)); + } + `; + return; + } + this.userCode = ` + ${s} start = ${s}(${a}); + ${s} end = ${s}(${i}); + + void main() { + ${s} outC = getOutputCoords(); + for (int i = 0; i < ${n}; i++) { + if (outC[i] < start[i]) { + outC[i] = start[i] * 2 - outC[i] - ${u}; + } else if(outC[i] >= end[i]) { + outC[i] = (end[i] - 1) * 2 - outC[i] + ${u}; + } + } + ${s} coords = outC - start; + setOutput(getX(${p})); + } + `; + } +}; +var ig = class { + constructor(e, t10, o) { + this.variableNames = ["x"], this.packedInputs = true, this.packedOutput = true, this.outputShape = t10.map((d, h) => d[0] + e[h] + d[1]); + let n = e.length, s = _e(n), a = t10.map((d) => d[0]).join(","), i = t10.map((d, h) => d[0] + e[h]).join(","), p = $t("rc", n), u = $t("source", n), c = `${p[n - 1]} < ${this.outputShape[n - 1]}`, l = n === 1 ? "source" : `vec2(${u.slice(-2).join()})`, m = o === "reflect" ? 0 : 1, f = ""; + if (n === 1) { + let d = ` + ${s} source = rc; + if (source < start) { + source = start * 2 - source - ${m}; + } else if (source >= end) { + source = (end - 1) * 2 - source + ${m}; + } + source -= start; + `; + f = ` + ${s} rc = outputLoc; + ${d} + result[0] = getChannel(getX(${u.join()}), ${l}); + ${p[n - 1]} += 1; + if(${c}) { + ${d} + result[1] = getChannel(getX(${u.join()}), ${l}); + } + `; + } else { + let d = ` + ${s} source = rc; + ${s} lt = ${s}(lessThan(source, start)); + ${s} gte = ${s}(greaterThanEqual(source, end)); + ${s} orig = 1 - (lt + gte); + source = orig * source + + lt * (start * 2 - source - ${m}) + + gte * ((end - 1) * 2 - source + ${m}); + source -= start; + `; + f = ` + ${s} rc = outputLoc; + ${d} + result[0] = getChannel(getX(${u.join()}), ${l}); + ${p[n - 1]} += 1; + if(${c}) { + ${d} + result[1] = getChannel(getX(${u.join()}), ${l}); + } + rc = outputLoc; + ${p[n - 2]} += 1; + if(${p[n - 2]} < ${this.outputShape[n - 2]}) { + ${d} + result[2] = getChannel(getX(${u.join()}), ${l}); + ${p[n - 1]} += 1; + if(${c}) { + ${d} + result[3] = getChannel(getX(${u.join()}), ${l}); + } + } + `; + } + this.userCode = ` + const ${s} start = ${s}(${a}); + const ${s} end = ${s}(${i}); + + void main() { + ${s} outputLoc = getOutputCoords(); + vec4 result = vec4(0.); + ${f} + setOutput(result); + } + `; + } +}; +var G7 = ({ inputs: r, backend: e, attrs: t10 }) => { + let { x: o } = r, { paddings: n, mode: s } = t10, a = P().getBool("WEBGL_PACK_ARRAY_OPERATIONS") ? new ig(o.shape, n, s) : new ag(o.shape, n, s); + return e.runWebGLProgram(a, [o], o.dtype); +}; +var wF = { kernelName: Dn, backendName: "webgl", kernelFunc: G7 }; +var H7 = `if (b == 0.0) return NAN; + return mod(a, b);`; +var q7 = ` + vec4 result = mod(a, b); + bvec4 isNaN = equal(b, vec4(0.0)); + ` + js + ` + return result; +`; +var K7 = ot({ opSnippet: H7, packedOpSnippet: q7 }); +var SF = { kernelName: ji, backendName: "webgl", kernelFunc: K7 }; +var ug = class { + constructor(e, t10, o) { + this.variableNames = ["probs"], this.customUniforms = [{ name: "seed", type: "float" }], this.outputShape = [e, o], this.userCode = ` + void main() { + ivec2 coords = getOutputCoords(); + int batch = coords[0]; + + float r = random(seed); + float cdf = 0.0; + + for (int i = 0; i < ${t10 - 1}; i++) { + cdf += getProbs(batch, i); + + if (r < cdf) { + setOutput(float(i)); + return; + } + } + + // If no other event happened, last event happened. + setOutput(float(${t10 - 1})); + } + `; + } +}; +var j7 = ` +if (a == b) { + return 1.0; +}; +return a / b;`; +var X7 = ` + // vec4 one = vec4(equal(a, b)); + // return one + (vec4(1.0) - one) * a / b; + vec4 result = a / b; + if(a.x == b.x) { + result.x = 1.; + } + if(a.y == b.y) { + result.y = 1.; + } + if(a.z == b.z) { + result.z = 1.; + } + if(a.w == b.w) { + result.w = 1.; + } + + return result; +`; +var Vw = ot({ opSnippet: j7, packedOpSnippet: X7, checkOutOfBounds: true }); +var vF = { kernelName: Cn, backendName: "webgl", kernelFunc: Vw }; +var kF = "return a - b;"; +var zw = ot({ opSnippet: kF, packedOpSnippet: kF, supportsComplex: true, cpuKernelImpl: G$ }); +var TF = { kernelName: Io, backendName: "webgl", kernelFunc: zw }; +function Ww(r) { + let { inputs: e, backend: t10, attrs: o } = r, { logits: n } = e, { dim: s } = o, a = x.parseAxisParam([s], n.shape), i = Bw({ inputs: { x: n }, backend: t10, attrs: { reductionIndices: a, keepDims: false } }), p = I.expandShapeToKeepDim(i.shape, a), u = J({ inputs: { x: i }, backend: t10, attrs: { shape: p } }), c = zw({ inputs: { a: n, b: u }, backend: t10 }), l = Ow({ inputs: { x: c }, backend: t10 }), m = Ou({ inputs: { x: l }, backend: t10, attrs: { axis: a, keepDims: false } }), f = J({ inputs: { x: m }, backend: t10, attrs: { shape: p } }), d = Vw({ inputs: { a: l, b: f }, backend: t10 }); + return t10.disposeIntermediateTensorInfo(i), t10.disposeIntermediateTensorInfo(u), t10.disposeIntermediateTensorInfo(c), t10.disposeIntermediateTensorInfo(l), t10.disposeIntermediateTensorInfo(m), t10.disposeIntermediateTensorInfo(f), d; +} +var NF = { kernelName: Xn, backendName: "webgl", kernelFunc: Ww }; +function Y7(r) { + let { inputs: e, backend: t10, attrs: o } = r, { logits: n } = e, { numSamples: s, seed: a, normalized: i } = o, p = i ? n : Ww({ inputs: { logits: n }, backend: t10, attrs: { dim: n.shape.length - 1 } }), u = p.shape[0], c = p.shape[1], l = new ug(u, c, s), m = [[a]], f = t10.runWebGLProgram(l, [p], "int32", m); + return i || t10.disposeIntermediateTensorInfo(p), f; +} +var _F = { kernelName: kp, backendName: "webgl", kernelFunc: Y7 }; +var Q7 = Vt + ` + return -x; +`; +var Z7 = ` + vec4 result = -x; + bvec4 isNaN = isnan(x); + + result.r = isNaN.r ? x.r : result.r; + result.g = isNaN.g ? x.g : result.g; + result.b = isNaN.b ? x.b : result.b; + result.a = isNaN.a ? x.a : result.a; + + return result; +`; +function J7(r) { + let { inputs: e, backend: t10 } = r, { x: o } = e; + if (t10.shouldExecuteOnCPU([o])) { + let s = t10.texData.get(o.dataId), [a, i] = T$(s.values, o.shape, o.dtype); + return t10.makeTensorInfo(i, o.dtype, a); + } + let n; + return P().getBool("WEBGL_PACK_UNARY_OPERATIONS") ? n = new No(o.shape, Z7) : n = new fr(o.shape, Q7), t10.runWebGLProgram(n, [o], o.dtype); +} +var EF = { kernelName: Pn, backendName: "webgl", kernelFunc: J7 }; +var eZ = Bt.nonMaxSuppressionV3Impl; +function tZ(r) { + I.warn("tf.nonMaxSuppression() in webgl locks the UI thread. Call tf.nonMaxSuppressionAsync() instead"); + let { inputs: e, backend: t10, attrs: o } = r, { boxes: n, scores: s } = e, { maxOutputSize: a, iouThreshold: i, scoreThreshold: p } = o, u = t10.readSync(n.dataId), c = t10.readSync(s.dataId), { selectedIndices: l } = eZ(u, c, a, i, p); + return t10.makeTensorInfo([l.length], "int32", new Int32Array(l)); +} +var $F = { kernelName: On, backendName: "webgl", kernelFunc: tZ }; +var rZ = Bt.nonMaxSuppressionV4Impl; +function oZ(r) { + I.warn("tf.nonMaxSuppression() in webgl locks the UI thread. Call tf.nonMaxSuppressionAsync() instead"); + let { inputs: e, backend: t10, attrs: o } = r, { boxes: n, scores: s } = e, { maxOutputSize: a, iouThreshold: i, scoreThreshold: p, padToMaxOutputSize: u } = o, c = t10.readSync(n.dataId), l = t10.readSync(s.dataId), { selectedIndices: m, validOutputs: f } = rZ(c, l, a, i, p, u); + return [t10.makeTensorInfo([m.length], "int32", new Int32Array(m)), t10.makeTensorInfo([], "int32", new Int32Array([f]))]; +} +var RF = { kernelName: pa, backendName: "webgl", kernelFunc: oZ }; +var nZ = Bt.nonMaxSuppressionV5Impl; +function sZ(r) { + I.warn("tf.nonMaxSuppression() in webgl locks the UI thread. Call tf.nonMaxSuppressionAsync() instead"); + let { inputs: e, backend: t10, attrs: o } = r, { boxes: n, scores: s } = e, { maxOutputSize: a, iouThreshold: i, scoreThreshold: p, softNmsSigma: u } = o, c = t10.readSync(n.dataId), l = t10.readSync(s.dataId), m = a, f = i, d = p, h = u, { selectedIndices: g, selectedScores: y } = nZ(c, l, m, f, d, h); + return [t10.makeTensorInfo([g.length], "int32", new Int32Array(g)), t10.makeTensorInfo([y.length], "float32", new Float32Array(y))]; +} +var AF = { kernelName: Mn, backendName: "webgl", kernelFunc: sZ }; +var pg = class { + constructor(e, t10, o, n) { + this.variableNames = ["indices"], this.outputShape = [e, t10], this.userCode = ` + void main() { + ivec2 coords = getOutputCoords(); + int index = round(getIndices(coords.x)); + setOutput(mix(float(${n}), float(${o}), + float(index == coords.y))); + } + `; + } +}; +var aZ = (r) => { + let { inputs: e, backend: t10, attrs: o } = r, { indices: n } = e, { dtype: s, depth: a, onValue: i, offValue: p } = o, u = x.sizeFromShape(n.shape), c = new pg(u, a, i, p), l = J({ inputs: { x: n }, backend: t10, attrs: { shape: [u] } }), m = t10.runWebGLProgram(c, [l], s); + t10.disposeIntermediateTensorInfo(l); + let f = [...n.shape, a], d = J({ inputs: { x: m }, backend: t10, attrs: { shape: f } }); + return t10.disposeIntermediateTensorInfo(m), d; +}; +var FF = { kernelName: ca, backendName: "webgl", kernelFunc: aZ }; +function Bl(r) { + let { inputs: e, backend: t10 } = r, { x: o } = e; + if (o.dtype === "complex64") { + let n = La({ inputs: { input: o }, backend: t10 }), s = Bl({ inputs: { x: n }, backend: t10 }), a = Lu({ inputs: { input: o }, backend: t10 }), i = Bl({ inputs: { x: a }, backend: t10 }), p = Ar({ inputs: { real: s, imag: i }, backend: t10 }); + return t10.disposeIntermediateTensorInfo(n), t10.disposeIntermediateTensorInfo(s), t10.disposeIntermediateTensorInfo(a), t10.disposeIntermediateTensorInfo(i), p; + } else + return Ba({ attrs: { shape: o.shape, dtype: o.dtype, value: o.dtype === "string" ? "" : 0 }, backend: t10 }); +} +var DF = { kernelName: Es, backendName: "webgl", kernelFunc: Bl }; +function PF(r) { + let { inputs: e, backend: t10 } = r, { x: o } = e; + if (o.dtype === "string") + throw new Error("onesLike is not supported under string dtype"); + if (o.dtype === "complex64") { + let n = La({ inputs: { input: o }, backend: t10 }), s = PF({ inputs: { x: n }, backend: t10 }), a = Lu({ inputs: { input: o }, backend: t10 }), i = Bl({ inputs: { x: a }, backend: t10 }), p = Ar({ inputs: { real: s, imag: i }, backend: t10 }); + return t10.disposeIntermediateTensorInfo(n), t10.disposeIntermediateTensorInfo(s), t10.disposeIntermediateTensorInfo(a), t10.disposeIntermediateTensorInfo(i), p; + } else + return Ba({ attrs: { shape: o.shape, dtype: o.dtype, value: 1 }, backend: t10 }); +} +var OF = { kernelName: Cs, backendName: "webgl", kernelFunc: PF }; +function iZ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { axis: n } = o; + if (e.length === 1) + return Kh({ inputs: { input: e[0] }, backend: t10, attrs: { dim: n } }); + let s = e[0].shape, a = e[0].dtype; + e.forEach((c) => { + x.assertShapesMatch(s, c.shape, "All tensors passed to stack must have matching shapes"), x.assert(a === c.dtype, () => "All tensors passed to stack must have matching dtypes"); + }); + let i = [], p = e.map((c) => { + let l = Kh({ inputs: { input: c }, backend: t10, attrs: { dim: n } }); + return i.push(l), l; + }), u = Pw({ inputs: p, backend: t10, attrs: { axis: n } }); + return i.forEach((c) => t10.disposeIntermediateTensorInfo(c)), u; +} +var MF = { kernelName: Is, backendName: "webgl", kernelFunc: iZ }; +var cg = class { + constructor(e, t10, o) { + this.variableNames = ["x"], this.customUniforms = [{ name: "value", type: "float" }], this.outputShape = t10.map((u, c) => u[0] + e[c] + u[1]); + let n = e.length, s = _e(n), a = t10.map((u) => u[0]).join(","), i = t10.map((u, c) => u[0] + e[c]).join(","), p = ["coords[0]", "coords[1]", "coords[2]", "coords[3]"].slice(0, n); + if (n === 1) { + this.userCode = ` + int start = ${a}; + int end = ${i}; + + void main() { + int outC = getOutputCoords(); + if (outC < start || outC >= end) { + setOutput(value); + } else { + setOutput(getX(outC - start)); + } + } + `; + return; + } + this.userCode = ` + ${s} start = ${s}(${a}); + ${s} end = ${s}(${i}); + + void main() { + ${s} outC = getOutputCoords(); + if (any(lessThan(outC, start)) || any(greaterThanEqual(outC, end))) { + setOutput(value); + } else { + ${s} coords = outC - start; + setOutput(getX(${p})); + } + } + `; + } +}; +var lg = class { + constructor(e, t10, o) { + this.variableNames = ["x"], this.packedInputs = true, this.packedOutput = true, this.customUniforms = [{ name: "value", type: "float" }], this.outputShape = t10.map((h, g) => h[0] + e[g] + h[1]); + let n = e.length, s = _e(n), a = t10.map((h) => h[0]).join(","), i = t10.map((h, g) => h[0] + e[g]).join(","), p = $t("rc", n), u = $t("source", n), c = `${p[n - 1]} < ${this.outputShape[n - 1]}`, l = n === 1 ? "source" : `vec2(${u.slice(-2).join()})`, m = [`${s} rc = outputLoc;`, `${p[n - 1]} += 1; + if(${c}) { + `, n === 1 ? "" : `} + rc = outputLoc; + ${p[n - 2]} += 1; + if(${p[n - 2]} < ${this.outputShape[n - 2]}) {`, n === 1 ? "" : ` ${p[n - 1]} += 1; + if(${c}) {`], f = n === 1 ? "rc < start || rc >= end" : "any(lessThan(rc, start)) || any(greaterThanEqual(rc, end))", d = ""; + for (let h = 0, g = n === 1 ? 2 : 4; h < g; h++) + d += ` + ${m[h]} + if (${f}) { + result[${h}] = float(value); + } else { + ${s} source = rc - start; + result[${h}] = getChannel(getX(${u.join()}), ${l}); + } + `; + d += n === 1 ? "} " : "}}", this.userCode = ` + const ${s} start = ${s}(${a}); + const ${s} end = ${s}(${i}); + + void main() { + ${s} outputLoc = getOutputCoords(); + vec4 result = vec4(0.); + ${d} + setOutput(result); + } + `; + } +}; +var Uw = (r) => { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { paddings: s, constantValue: a } = o; + if (x.sizeFromShape(n.shape) === 0) { + let u = s.map((c, l) => c[0] + n.shape[l] + c[1]); + return Ba({ backend: t10, attrs: { shape: u, value: a, dtype: n.dtype } }); + } + let i = P().getBool("WEBGL_PACK_ARRAY_OPERATIONS") ? new lg(n.shape, s, a) : new cg(n.shape, s, a), p = [[a]]; + return t10.runWebGLProgram(i, [n], n.dtype, p); +}; +var LF = { kernelName: Ln, backendName: "webgl", kernelFunc: Uw }; +var uZ = ` + if(a < 0.0 && floor(b) < b){ + return NAN; + } + if (b == 0.0) { + return 1.0; + } + return (round(mod(b, 2.0)) != 1) ? + pow(abs(a), b) : sign(a) * pow(abs(a), b); +`; +var pZ = ` + // isModRound1 has 1 for components with round(mod(b, 2.0)) == 1, 0 otherwise. + vec4 isModRound1 = vec4(equal(round(mod(b, 2.0)), ivec4(1))); + vec4 multiplier = sign(a) * isModRound1 + (vec4(1.0) - isModRound1); + vec4 result = multiplier * pow(abs(a), b); + + // Ensure that a^0 = 1, including 0^0 = 1 as this correspond to TF and JS + bvec4 isExpZero = equal(b, vec4(0.0)); + result.r = isExpZero.r ? 1.0 : result.r; + result.g = isExpZero.g ? 1.0 : result.g; + result.b = isExpZero.b ? 1.0 : result.b; + result.a = isExpZero.a ? 1.0 : result.a; + + bvec4 isNaN1 = lessThan(a, vec4(0.0)); + bvec4 isNaN2 = lessThan(floor(b), b); + bvec4 isNaN = bvec4(isNaN1.x && isNaN2.x, isNaN1.y && isNaN2.y, isNaN1.z && isNaN2.z, isNaN1.w && isNaN2.w); + ` + js + ` + return result; +`; +var cZ = ot({ opSnippet: uZ, packedOpSnippet: pZ }); +var BF = { kernelName: Bn, backendName: "webgl", kernelFunc: cZ }; +function lZ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { axis: s, keepDims: a } = o, i = n.shape.length, p = [], u = x.parseAxisParam(s, n.shape), c = u, l = I.getAxesPermutation(c, i), m = n; + l != null && (m = xt({ inputs: { x: n }, backend: t10, attrs: { perm: l } }), c = I.getInnerMostAxes(c.length, i), p.push(m)), I.assertAxesAreInnerMostDims("prod", c, i); + let f; + if (t10.shouldExecuteOnCPU([m])) { + let d = t10.texData.get(m.dataId).values, { outVals: h, outShape: g, outDtype: y } = _$(m.shape, m.dtype, d, c); + f = t10.makeTensorInfo(g, y, h); + } else { + let [d, h] = I.computeOutAndReduceShapes(m.shape, c), g = x.sizeFromShape(h), y = J({ inputs: { x: m }, backend: t10, attrs: { shape: [-1, g] } }), b = Ca(n.dtype), C = qr(y, b, "prod", t10); + f = J({ inputs: { x: C }, backend: t10, attrs: { shape: d } }), p.push(y), p.push(C); + } + if (a) { + p.push(f); + let d = I.expandShapeToKeepDim(f.shape, u); + f = J({ inputs: { x: f }, backend: t10, attrs: { shape: d } }); + } + return p.forEach((d) => t10.disposeIntermediateTensorInfo(d)), f; +} +var VF = { kernelName: Ao, backendName: "webgl", kernelFunc: lZ }; +function mZ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { paramsNestedSplits: n, paramsDenseValues: s, indices: a } = e, { outputRaggedRank: i } = o, p = n.map((y) => t10.readSync(y.dataId)), u = n.map((y) => y.shape), c = t10.readSync(s.dataId), l = t10.readSync(a.dataId), [m, f, d] = E$(p, u, c, s.shape, s.dtype, l, a.shape, i), h = m.map((y) => t10.makeTensorInfo([y.length], "int32", y)), g = t10.makeTensorInfo(d, s.dtype, f); + return h.concat([g]); +} +var zF = { kernelName: Tp, backendName: "webgl", kernelFunc: mZ }; +function fZ(r) { + let { inputs: e, backend: t10 } = r, { starts: o, limits: n, deltas: s } = e, a = t10.readSync(o.dataId), i = t10.readSync(n.dataId), p = t10.readSync(s.dataId), [u, c] = $$(a, o.shape, o.dtype, i, n.shape, p, s.shape), l = t10.makeTensorInfo([u.length], "int32", u), m = t10.makeTensorInfo([c.length], o.dtype, c); + return [l, m]; +} +var WF = { kernelName: Np, backendName: "webgl", kernelFunc: fZ }; +function dZ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { shape: n, values: s, defaultValue: a, rowPartitionTensors: i } = e, { rowPartitionTypes: p } = o, u = t10.readSync(n.dataId), c = t10.readSync(s.dataId), l = t10.readSync(a.dataId), m = i.map((g) => t10.readSync(g.dataId)), f = i.map((g) => g.shape), [d, h] = R$(u, n.shape, c, s.shape, s.dtype, l, a.shape, m, f, p); + return t10.makeTensorInfo(d, s.dtype, h); +} +var UF = { kernelName: _p, backendName: "webgl", kernelFunc: dZ }; +var Gw = (r) => { + let { backend: e, attrs: t10 } = r, { start: o, stop: n, step: s, dtype: a } = t10, i = A$(o, n, s, a); + return e.makeTensorInfo([i.length], a, i); +}; +var GF = { kernelName: ws, backendName: "webgl", kernelFunc: Gw }; +var hZ = "return 1.0 / x;"; +var gZ = he({ opSnippet: hZ }); +var HF = { kernelName: ma, backendName: "webgl", kernelFunc: gZ }; +var xZ = Vt + ` + return (x < 0.0) ? 0.0 : x; +`; +var yZ = ` + vec4 result = x * vec4(greaterThanEqual(x, vec4(0.0))); + bvec4 isNaN = isnan(x); + + result.r = isNaN.r ? x.r : result.r; + result.g = isNaN.g ? x.g : result.g; + result.b = isNaN.b ? x.b : result.b; + result.a = isNaN.a ? x.a : result.a; + + return result; +`; +var bZ = he({ opSnippet: xZ, packedOpSnippet: yZ }); +var qF = { kernelName: zn, backendName: "webgl", kernelFunc: bZ }; +var CZ = Vt + ` + return (x < 0.0) ? 0.0 : min(6.0, x); +`; +var IZ = ` + vec4 result = min(x, vec4(6.)) * vec4(greaterThanEqual(x, vec4(0.0))); + bvec4 isNaN = isnan(x); + + result.r = isNaN.r ? x.r : result.r; + result.g = isNaN.g ? x.g : result.g; + result.b = isNaN.b ? x.b : result.b; + result.a = isNaN.a ? x.a : result.a; + + return result; +`; +var wZ = he({ opSnippet: CZ, packedOpSnippet: IZ }); +var KF = { kernelName: Gn, backendName: "webgl", kernelFunc: wZ }; +var mg = class { + constructor(e, t10, o, n, s) { + this.variableNames = ["A"], this.outputShape = []; + let [a, i, p, u] = e; + this.outputShape = [a, t10, o, u]; + let c = [n && t10 > 1 ? i - 1 : i, n && o > 1 ? p - 1 : p], l = [n && t10 > 1 ? t10 - 1 : t10, n && o > 1 ? o - 1 : o], m; + s ? m = "(vec2(yRC) + vec2(0.5)) * effectiveInputOverOutputRatioRC - vec2(0.5)" : m = "vec2(yRC) * effectiveInputOverOutputRatioRC", this.userCode = ` + const vec2 effectiveInputOverOutputRatioRC = vec2( + ${c[0] / l[0]}, + ${c[1] / l[1]}); + const vec2 inputShapeRC = vec2(${i}.0, ${p}.0); + + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + ivec2 yRC = coords.yz; + + // Fractional source index. + vec2 sourceFracIndexRC = ${m}; + + // Compute the four integer indices. + ivec2 sourceFloorRC = ivec2(max(sourceFracIndexRC, vec2(0.0))); + ivec2 sourceCeilRC = ivec2( + min(inputShapeRC - 1.0, ceil(sourceFracIndexRC))); + + float topLeft = getA(b, sourceFloorRC.x, sourceFloorRC.y, d); + float bottomLeft = getA(b, sourceCeilRC.x, sourceFloorRC.y, d); + float topRight = getA(b, sourceFloorRC.x, sourceCeilRC.y, d); + float bottomRight = getA(b, sourceCeilRC.x, sourceCeilRC.y, d); + + vec2 fracRC = sourceFracIndexRC - vec2(sourceFloorRC); + + float top = topLeft + (topRight - topLeft) * fracRC.y; + float bottom = bottomLeft + (bottomRight - bottomLeft) * fracRC.y; + float newValue = top + (bottom - top) * fracRC.x; + + setOutput(newValue); + } + `; + } +}; +var fg = class { + constructor(e, t10, o, n, s) { + this.variableNames = ["A"], this.packedInputs = true, this.packedOutput = true, this.outputShape = []; + let [a, i, p, u] = e; + this.outputShape = [a, t10, o, u]; + let c = [n && t10 > 1 ? i - 1 : i, n && o > 1 ? p - 1 : p], l = [n && t10 > 1 ? t10 - 1 : t10, n && o > 1 ? o - 1 : o], m; + s ? m = "(vec3(yRC) + vec3(0.5)) * effectiveInputOverOutputRatioRC - vec3(0.5)" : m = "vec3(yRC) * effectiveInputOverOutputRatioRC", this.userCode = ` + const vec3 effectiveInputOverOutputRatioRC = vec3( + ${c[0] / l[0]}, + ${c[1] / l[1]}, + ${c[1] / l[1]}); + const vec3 inputShapeRC = vec3(${i}.0, ${p}.0, + ${p}.0); + + float getAValue(int b, int r, int c, int d) { + return getChannel(getA(b, r, c, d), vec2(c, d)); + } + + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + // Calculate values for next column in yRC.z. + ivec3 yRC = coords.yzz + ivec3(0, 0, 1); + + // Fractional source index. + vec3 sourceFracIndexRC = ${m}; + + // Compute the four integer indices. + ivec3 sourceFloorRC = ivec3(max(sourceFracIndexRC, vec3(0.0))); + ivec3 sourceCeilRC = ivec3( + min(inputShapeRC - 1.0, ceil(sourceFracIndexRC))); + + // Should we calculate next column and row elements in 2x2 packed cell. + bool hasNextCol = d < ${u - 1}; + bool hasNextRow = coords.z < ${o - 1}; + + // In parallel, construct four corners for all four components in + // packed 2x2 cell. + vec4 topLeft = vec4( + getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d), + hasNextCol ? getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d + 1) + : 0.0, + hasNextRow ? getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d) + : 0.0, + (hasNextRow && hasNextCol) ? + getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d + 1) : 0.0); + + vec4 bottomLeft = vec4( + getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d), + hasNextCol ? getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d + 1) + : 0.0, + hasNextRow ? getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d) + : 0.0, + (hasNextRow && hasNextCol) ? + getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d + 1) : 0.0); + + vec4 topRight = vec4( + getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d), + hasNextCol ? getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d + 1) + : 0.0, + hasNextRow ? getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d) + : 0.0, + (hasNextRow && hasNextCol) ? + getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d + 1) : 0.0); + + vec4 bottomRight = vec4( + getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d), + hasNextCol ? getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d + 1) + : 0.0, + hasNextRow ? getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d) + : 0.0, + (hasNextRow && hasNextCol) ? + getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d + 1) : 0.0); + + vec3 fracRC = sourceFracIndexRC - vec3(sourceFloorRC); + + vec4 top = mix(topLeft, topRight, fracRC.yyzz); + vec4 bottom = mix(bottomLeft, bottomRight, fracRC.yyzz); + vec4 newValue = mix(top, bottom, fracRC.x); + + setOutput(newValue); + } + `; + } +}; +function SZ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { images: n } = e, { alignCorners: s, halfPixelCenters: a, size: i } = o, [p, u] = i, c = P().getBool("WEBGL_PACK_IMAGE_OPERATIONS") ? new fg(n.shape, p, u, s, a) : new mg(n.shape, p, u, s, a); + return t10.runWebGLProgram(c, [n], "float32"); +} +var jF = { kernelName: Un, backendName: "webgl", kernelFunc: SZ }; +var dg = class { + constructor(e, t10, o) { + this.variableNames = ["dy"], this.outputShape = [], this.outputShape = t10; + let [, n, s] = t10, [, a, i] = e, p = [o && a > 1 ? n - 1 : n, o && i > 1 ? s - 1 : s], u = [o && a > 1 ? a - 1 : a, o && i > 1 ? i - 1 : i], c = p[0] / u[0], l = p[1] / u[1], m = 1 / c, f = 1 / l, d = Math.ceil(m) * 2 + 2, h = Math.ceil(f) * 2 + 2; + this.userCode = ` + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + int r = coords[1]; + int c = coords[2]; + + float accumulator = 0.0; + + const float heightScale = float(${c}); + const float widthScale = float(${l}); + + const float invHeightScale = float(${m}); + const float invWidthScale = float(${f}); + + const int winHeight = int(${d}); + const int winWidth = int(${h}); + + // Compute bounds for where in dy we will look + float startRLerp = floor(float(r) * invHeightScale); + int startDyR = int(startRLerp - float(winHeight / 2)); + + float startCLerp = floor(float(c) * invWidthScale); + int startDyC = int(startCLerp - float(winWidth / 2)); + + // Loop over dy + for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) { + int dyR = dyROffset + startDyR; + + // Guard against the window exceeding the bounds of dy + if (dyR < 0 || dyR >= ${a}) { + continue; + } + + for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) { + int dyC = dyCOffset + startDyC; + + // Guard against the window exceeding the bounds of dy + if (dyC < 0 || dyC >= ${i}) { + continue; + } + + float dxR = float(dyR) * heightScale; + int topDxRIndex = int(floor(dxR)); + int bottomDxRIndex = int(min(ceil(dxR), ${n - 1}.0)); + float dxRLerp = dxR - float(topDxRIndex); + float inverseDxRLerp = 1.0 - dxRLerp; + + float dxC = float(dyC) * widthScale; + int leftDxCIndex = int(floor(dxC)); + int rightDxCIndex = int(min(ceil(dxC), ${s - 1}.0)); + float dxCLerp = dxC - float(leftDxCIndex); + float inverseDxCLerp = 1.0 - dxCLerp; + + if (r == topDxRIndex && c == leftDxCIndex) { + // topLeft + accumulator += + getDy(b, dyR, dyC, d) * inverseDxRLerp * inverseDxCLerp; + } + + if (r == topDxRIndex && c == rightDxCIndex) { + // topRight + accumulator += getDy(b, dyR, dyC, d) * inverseDxRLerp * dxCLerp; + } + + if (r == bottomDxRIndex && c == leftDxCIndex) { + // bottomLeft + accumulator += getDy(b, dyR, dyC, d) * dxRLerp * inverseDxCLerp; + } + + if (r == bottomDxRIndex && c == rightDxCIndex) { + // bottomRight + accumulator += getDy(b, dyR, dyC, d) * dxRLerp * dxCLerp; + } + } + } + // End loop over dy + + setOutput(accumulator); + } + `; + } +}; +function vZ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { images: n, dy: s } = e, { alignCorners: a } = o, i = new dg(s.shape, n.shape, a); + return t10.runWebGLProgram(i, [s], s.dtype); +} +var XF = { kernelName: Vm, backendName: "webgl", kernelFunc: vZ }; +var hg = class { + constructor(e, t10, o, n, s) { + this.variableNames = ["A"], this.outputShape = []; + let [a, i, p, u] = e; + this.outputShape = [a, t10, o, u]; + let c = [n && t10 > 1 ? i - 1 : i, n && o > 1 ? p - 1 : p], l = [n && t10 > 1 ? t10 - 1 : t10, n && o > 1 ? o - 1 : o], m = n ? "0.5" : "0.0", f; + s ? f = "max((vec2(yRC) + vec2(0.5)) * effectiveInputOverOutputRatioRC, vec2(0.0))" : f = "vec2(yRC) * effectiveInputOverOutputRatioRC", this.userCode = ` + const vec2 effectiveInputOverOutputRatioRC = vec2( + ${c[0] / l[0]}, + ${c[1] / l[1]}); + const vec2 inputShapeRC = vec2(${i}.0, ${p}.0); + + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + ivec2 yRC = coords.yz; + + // Fractional source index. + vec2 sourceFracIndexRC = ${f}; + + // Compute the coordinators of nearest neighbor point. + ivec2 sourceNearestRC = ivec2( + min(inputShapeRC - 1.0, floor(sourceFracIndexRC + ${m}))); + float newValue = getA(b, sourceNearestRC.x, sourceNearestRC.y, d); + + setOutput(newValue); + } + `; + } +}; +var gg = class { + constructor(e, t10, o, n, s) { + this.variableNames = ["A"], this.packedInputs = true, this.packedOutput = true, this.outputShape = []; + let [a, i, p, u] = e; + this.outputShape = [a, t10, o, u]; + let c = [n && t10 > 1 ? i - 1 : i, n && o > 1 ? p - 1 : p], l = [n && t10 > 1 ? t10 - 1 : t10, n && o > 1 ? o - 1 : o], m = n ? "0.5" : "0.0", f; + s ? f = "max((vec3(yRC) + vec3(0.5)) * effectiveInputOverOutputRatioRC, vec3(0.0))" : f = "vec3(yRC) * effectiveInputOverOutputRatioRC", this.userCode = ` + const vec3 effectiveInputOverOutputRatioRC = vec3( + ${c[0] / l[0]}, + ${c[1] / l[1]}, + ${c[1] / l[1]}); + const vec3 inputShapeRC = vec3(${i}.0, ${p}.0, + ${p}.0); + + float getAValue(int b, int r, int c, int d) { + return getChannel(getA(b, r, c, d), vec2(c, d)); + } + + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + // Calculate values for next column in yRC.z. + ivec3 yRC = coords.yzz + ivec3(0, 0, 1); + + // Fractional source index. + vec3 sourceFracIndexRC = ${f}; + + // Compute the coordinators of nearest neighbor point. + ivec3 sourceNearestRC = ivec3( + min(inputShapeRC - 1.0, floor(sourceFracIndexRC + ${m}))); + + // Should we calculate next column and row elements in 2x2 packed cell. + bool hasNextCol = d < ${u - 1}; + bool hasNextRow = coords.z < ${o - 1}; + + vec4 newValue = vec4( + getAValue(b, sourceNearestRC.x, sourceNearestRC.y, d), + hasNextCol ? getAValue(b, sourceNearestRC.x, sourceNearestRC.y, d + 1) + : 0.0, + hasNextRow ? getAValue(b, sourceNearestRC.x, sourceNearestRC.z, d) + : 0.0, + (hasNextRow && hasNextCol) ? + getAValue(b, sourceNearestRC.x, sourceNearestRC.z, d + 1) : 0.0); + + setOutput(newValue); + } + `; + } +}; +function kZ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { images: n } = e, { alignCorners: s, halfPixelCenters: a, size: i } = o, [p, u] = i, c = P().getBool("WEBGL_PACK_IMAGE_OPERATIONS") ? new gg(n.shape, p, u, s, a) : new hg(n.shape, p, u, s, a); + return t10.runWebGLProgram(c, [n], n.dtype); +} +var YF = { kernelName: Wn, backendName: "webgl", kernelFunc: kZ }; +var xg = class { + constructor(e, t10, o) { + this.variableNames = ["dy"], this.outputShape = [], this.outputShape = t10; + let [, n, s] = t10, [, a, i] = e, p = [o && a > 1 ? n - 1 : n, o && i > 1 ? s - 1 : s], u = [o && a > 1 ? a - 1 : a, o && i > 1 ? i - 1 : i], c = p[0] / u[0], l = p[1] / u[1], m = 1 / c, f = 1 / l, d = Math.ceil(m) * 2 + 2, h = Math.ceil(f) * 2 + 2; + this.userCode = ` + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + int r = coords[1]; + int c = coords[2]; + + float accumulator = 0.0; + + const float heightScale = float(${c}); + const float widthScale = float(${l}); + + const float invHeightScale = float(${m}); + const float invWidthScale = float(${f}); + + const int winHeight = int(${d}); + const int winWidth = int(${h}); + + // Compute bounds for where in dy we will look + float startRLerp = floor(float(r) * invHeightScale); + int startDyR = int(floor(startRLerp - float(winHeight / 2))); + + float startCLerp = floor(float(c) * invWidthScale); + int startDyC = int(floor(startCLerp - float(winWidth / 2))); + + // Loop over dy + for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) { + int dyR = dyROffset + startDyR; + + // Guard against the window exceeding the bounds of dy + if (dyR < 0 || dyR >= ${a}) { + continue; + } + + for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) { + int dyC = dyCOffset + startDyC; + + // Guard against the window exceeding the bounds of dy + if (dyC < 0 || dyC >= ${i}) { + continue; + } + + float sourceFracRow = + float(${p[0]}) * + (float(dyR) / float(${u[0]})); + + float sourceFracCol = + float(${p[1]}) * + (float(dyC) / float(${u[1]})); + + int sourceNearestRow = int(min( + float(int(${n}) - 1), + ${o} ? float(round(sourceFracRow)) : + float(floor(sourceFracRow)))); + + int sourceNearestCol = int(min( + float(int(${s}) - 1), + ${o} ? float(round(sourceFracCol)) : + float(floor(sourceFracCol)))); + + if (r == sourceNearestRow && c == sourceNearestCol) { + accumulator += getDy(b, dyR, dyC, d); + } + } + } + // End loop over dy + + setOutput(accumulator); + } + `; + } +}; +function TZ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { images: n, dy: s } = e, { alignCorners: a } = o, i = new xg(s.shape, n.shape, a); + return t10.runWebGLProgram(i, [s], s.dtype); +} +var QF = { kernelName: Bm, backendName: "webgl", kernelFunc: TZ }; +var yg = class { + constructor(e, t10) { + this.variableNames = ["x"]; + let o = e.length; + if (o > 4) + throw new Error(`WebGL backend: Reverse of rank-${o} tensor is not yet supported`); + if (this.outputShape = e, o === 1) { + this.userCode = ` + void main() { + int coord = getOutputCoords(); + setOutput(getX(${e[0]} - coord - 1)); + } + `; + return; + } + let n = (i) => t10.indexOf(i) !== -1 && e[i] !== 1 ? `${e[i]} - coords[${i}] - 1` : `coords[${i}]`, s = e.map((i, p) => n(p)).join(","), a = _e(o); + this.userCode = ` + void main() { + ${a} coords = getOutputCoords(); + setOutput(getX(${s})); + } + `; + } +}; +var bg = class { + constructor(e, t10) { + this.variableNames = ["x"], this.packedInputs = true, this.packedOutput = true; + let o = e.length; + if (o > 4) + throw new Error(`WebGL backend: Reverse of rank-${o} tensor is not yet supported`); + this.outputShape = e; + let n = $t("rc", o), s = `${n[o - 1]} + 1 < ${this.outputShape[o - 1]}`, a = `${n[o - 2]} + 1 < ${this.outputShape[o - 2]}`, i = _e(o); + o === 1 ? this.userCode = ` + void main(){ + int rc = getOutputCoords(); + vec4 result = vec4(0.); + result.r = getChannel(getX(${e[0]} - rc - 1), + ${e[0]} - rc - 1); + if(${s}){ + result.g = getChannel(getX(${e[0]} - (rc + 1) - 1), + ${e[0]} - (rc + 1) - 1); + } + setOutput(result); + } + ` : this.userCode = ` + void main() { + ${i} rc = getOutputCoords(); + vec4 result = vec4(0.); + result.r = ${p(n.slice())}; + if(${s}){ + result.g = ${u(n.slice())}; + } + if(${a}) { + result.b = ${c(n.slice())}; + if(${s}) { + result.a = ${l(n.slice())}; + } + } + setOutput(result); + } + `; + function p(d) { + return m(d); + } + function u(d) { + return d[o - 1] = "(" + d[o - 1] + " + 1)", m(d); + } + function c(d) { + return d[o - 2] = "(" + d[o - 2] + " + 1)", m(d); + } + function l(d) { + return d[o - 1] = "(" + d[o - 1] + " + 1)", d[o - 2] = "(" + d[o - 2] + " + 1)", m(d); + } + function m(d) { + let h = e.map((b, C) => f(C, d)), g = h.join(","), y = h.slice(-2).join(","); + return `getChannel(getX(${g}), vec2(${y}))`; + } + function f(d, h) { + return t10.indexOf(d) !== -1 && e[d] !== 1 ? `${e[d]} - ${h[d]} - 1` : `${h[d]}`; + } + } +}; +function NZ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { dims: s } = o, a = n.shape.length, i = x.parseAxisParam(s, n.shape); + if (a === 0) + return Rt({ inputs: { x: n }, backend: t10 }); + let p = P().getBool("WEBGL_PACK_ARRAY_OPERATIONS") ? new bg(n.shape, i) : new yg(n.shape, i); + return t10.runWebGLProgram(p, [n], n.dtype); +} +var ZF = { kernelName: fa, backendName: "webgl", kernelFunc: NZ }; +var Cg = class { + constructor(e, t10) { + this.variableNames = ["Image"], this.outputShape = [], this.customUniforms = [{ name: "params", type: "vec4" }]; + let o = e[1], n = e[2]; + this.outputShape = e; + let s = ""; + typeof t10 == "number" ? s = `float outputValue = ${t10.toFixed(2)};` : s = ` + vec3 fill = vec3(${t10.join(",")}); + float outputValue = fill[coords[3]];`, this.userCode = ` + void main() { + ivec4 coords = getOutputCoords(); + int x = coords[2]; + int y = coords[1]; + float coordXFloat = (float(x) - params[0]) * params[3] - + (float(y) - params[1]) * params[2]; + float coordYFloat = (float(x) - params[0]) * params[2] + + (float(y) - params[1]) * params[3]; + int coordX = int(round(coordXFloat + params[0])); + int coordY = int(round(coordYFloat + params[1])); + ${s} + if(coordX >= 0 && coordX < ${n} && coordY >= 0 && coordY < ${o}) { + outputValue = getImage(coords[0], coordY, coordX, coords[3]); + } + setOutput(outputValue); + } + `; + } +}; +var JF = { kernelName: es, backendName: "webgl", kernelFunc: ({ inputs: r, attrs: e, backend: t10 }) => { + let { image: o } = r, { radians: n, fillValue: s, center: a } = e, i = t10, p = new Cg(o.shape, s), [u, c] = I.getImageCenter(a, o.shape[1], o.shape[2]), l = [[u, c, Math.sin(n), Math.cos(n)]]; + return i.runWebGLProgram(p, [o], o.dtype, l); +} }; +var _Z = ` + // OpenGL ES does not support round function. + // The algorithm is based on banker's rounding. + float base = floor(x); + if ((x - base) < 0.5) { + return floor(x); + } else if ((x - base) > 0.5) { + return ceil(x); + } else { + if (mod(base, 2.0) == 0.0) { + return base; + } else { + return base + 1.0; + } + } +`; +var EZ = he({ opSnippet: _Z }); +var eD = { kernelName: da, backendName: "webgl", kernelFunc: EZ }; +var $Z = "return inversesqrt(x);"; +var RZ = he({ opSnippet: $Z, cpuKernelImpl: F$ }); +var tD = { kernelName: xo, backendName: "webgl", kernelFunc: RZ }; +var vc = class { + constructor(e, t10, o, n, s, a, i = true) { + this.variableNames = ["updates", "indices", "defaultValue"], this.outputShape = a; + let p = _e(s.length), u = _e(a.length), c = ""; + o === 1 ? c = "i" : o === 2 && (c = "i, j"); + let l = `getIndices(${c})`, m = ""; + n === 1 ? m = "i" : n === 2 && (m = "i, coords[1]"); + let f = `getUpdates(${m})`, d = t10 > 1 ? "strides[j]" : "strides"; + this.userCode = ` + ${p} strides = ${p}(${s}); + + void main() { + ${u} coords = getOutputCoords(); + float sum = 0.0; + bool found = false; + for (int i = 0; i < ${e}; i++) { + int flattenedIndex = 0; + for (int j = 0; j < ${t10}; j++) { + int index = round(${l}); + flattenedIndex += index * ${d}; + } + if (flattenedIndex == coords[0]) { + sum += ${f}; + found = true; + } + } + setOutput(mix(getDefaultValue(), sum, float(found))); + } + `; + } +}; +function AZ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { indices: n, updates: s } = e, { shape: a } = o, { sliceRank: i, numUpdates: p, sliceSize: u, strides: c, outputSize: l } = I.calculateShapes(s, n, a), m = [l / u, u]; + if (l === 0) + return t10.makeTensorInfo(a, n.dtype); + let f = J({ inputs: { x: n }, backend: t10, attrs: { shape: [p, i] } }), d = J({ inputs: { x: s }, backend: t10, attrs: { shape: [p, u] } }), h = t10.makeTensorInfo([], "float32", new Float32Array([0])), g = new vc(p, i, f.shape.length, d.shape.length, c, m), y = t10.runWebGLProgram(g, [d, f, h], d.dtype), b = J({ inputs: { x: y }, backend: t10, attrs: { shape: a } }); + return t10.disposeIntermediateTensorInfo(f), t10.disposeIntermediateTensorInfo(d), t10.disposeIntermediateTensorInfo(y), t10.disposeIntermediateTensorInfo(h), b; +} +var rD = { kernelName: Hn, backendName: "webgl", kernelFunc: AZ }; +var Ig = class { + constructor(e, t10, o, n) { + this.variableNames = ["sortedSequence", "values"], this.customUniforms = [{ name: "numInputs", type: "int" }], this.outputShape = [e, o]; + let s = "while (left < right) {", a = `for (int i = 0; i < ${Math.ceil(Math.log2(t10 + 1))}; ++i) { if (left >= right) break;`, i = P().getNumber("WEBGL_VERSION") === 2 ? s : a, p = n === "left" ? "<" : "<="; + this.userCode = ` + int findBound(int batch, float value) { + int left = 0; + int right = numInputs; + int mid; + ${i} + mid = (left + right) / 2; + if (getSortedSequence(batch, mid) ${p} value) { + left = mid + 1; + } else { + right = mid; + } + } + return right; + } + + void main() { + ivec2 coords = getOutputCoords(); + int batch = coords[0]; + int valueIndex = coords[1]; + + float value = getValues(batch, valueIndex); + + setOutput(float(findBound(batch, value))); + } + `; + } +}; +function FZ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { sortedSequence: n, values: s } = e, { side: a } = o, i = new Ig(n.shape[0], n.shape[1], s.shape[1], a), p = [[n.shape[1]]]; + return t10.runWebGLProgram(i, [n, s], "int32", p); +} +var oD = { kernelName: Ep, backendName: "webgl", kernelFunc: FZ }; +var wg = class { + constructor(e, t10, o) { + this.variableNames = ["c", "a", "b"], this.outputShape = t10; + let n, s; + if (o > 4) + throw Error(`Where for rank ${o} is not yet supported`); + if (o === 1) + s = "resRC", n = "resRC"; + else { + let i = ["resRC.x", "resRC.y", "resRC.z", "resRC.w"], p = [], u = []; + for (let c = 0; c < t10.length; c++) + u.push(`${i[c]}`), c < e && p.push(`${i[c]}`); + n = p.join(), s = u.join(); + } + let a = _e(o); + this.userCode = ` + void main() { + ${a} resRC = getOutputCoords(); + float cVal = getC(${n}); + if (cVal >= 1.0) { + setOutput(getA(${s})); + } else { + setOutput(getB(${s})); + } + } + `; + } +}; +function DZ(r) { + let { inputs: e, backend: t10 } = r, { condition: o, t: n, e: s } = e, a = new wg(o.shape.length, n.shape, n.shape.length); + return t10.runWebGLProgram(a, [o, n, s], ct(n.dtype, s.dtype)); +} +var nD = { kernelName: vs, backendName: "webgl", kernelFunc: DZ }; +var PZ = ` + // Stable and Attracting Fixed Point (0, 1) for Normalized Weights. + // see: https://arxiv.org/abs/1706.02515 + float scaleAlpha = ${I.SELU_SCALEALPHA}; + float scale = ${I.SELU_SCALE}; + return (x >= 0.0) ? scale * x : scaleAlpha * (exp(x) - 1.0); +`; +var OZ = he({ opSnippet: PZ }); +var sD = { kernelName: Xi, backendName: "webgl", kernelFunc: OZ }; +var MZ = jo + ` + return 1.0 / (1.0 + exp(-1.0 * x)); +`; +var LZ = ` + vec4 result = 1.0 / (1.0 + exp(-1.0 * x)); + bvec4 isNaN = isnan(x); + + result.r = isNaN.r ? x.r : result.r; + result.g = isNaN.g ? x.g : result.g; + result.b = isNaN.b ? x.b : result.b; + result.a = isNaN.a ? x.a : result.a; + + return result; +`; +var BZ = he({ opSnippet: MZ, packedOpSnippet: LZ, cpuKernelImpl: P$ }); +var aD = { kernelName: yo, backendName: "webgl", kernelFunc: BZ }; +var VZ = ` + if (isnan(x)) { return 0.0; } + return sign(x); +`; +var zZ = he({ opSnippet: VZ }); +var iD = { kernelName: Yi, backendName: "webgl", kernelFunc: zZ }; +var WZ = jo + ` + return sin(x); +`; +var UZ = he({ opSnippet: WZ }); +var uD = { kernelName: Kn, backendName: "webgl", kernelFunc: UZ }; +var GZ = ` + float e2x = exp(x); + return (e2x - 1.0 / e2x) / 2.0; +`; +var HZ = he({ opSnippet: GZ }); +var pD = { kernelName: ha, backendName: "webgl", kernelFunc: HZ }; +var qZ = ` + float epsilon = 1.1920928955078125e-7; + float threshold = log(epsilon) + 2.0; + + bool too_large = x > -threshold; + bool too_small = x < threshold; + + float result; + float exp_x = exp(x); + + if (too_large){ + result = x; + } + else if (too_small){ + result = exp_x; + } + else{ + result = log(exp_x + 1.0); + } + return result; +`; +var KZ = he({ opSnippet: qZ }); +var cD = { kernelName: Qi, backendName: "webgl", kernelFunc: KZ }; +var jZ = (r) => { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { blockShape: s, paddings: a } = o; + x.assert(n.shape.length <= 4, () => "spaceToBatchND for rank > 4 with a WebGL backend not implemented yet"); + let i = s.reduce((y, b) => y * b), p = [[0, 0]]; + p.push(...a); + for (let y = 1 + s.length; y < n.shape.length; ++y) + p.push([0, 0]); + let u = [], c = Uw({ inputs: { x: n }, backend: t10, attrs: { paddings: p, constantValue: 0 } }), l = I.getReshaped(c.shape, s, i, false), m = I.getPermuted(l.length, s.length, false), f = I.getReshapedPermuted(c.shape, s, i, false), d = J({ inputs: { x: c }, backend: t10, attrs: { shape: l } }), h = xt({ inputs: { x: d }, backend: t10, attrs: { perm: m } }), g = J({ inputs: { x: h }, backend: t10, attrs: { shape: f } }); + return u.push(c), u.push(d), u.push(h), u.forEach((y) => t10.disposeIntermediateTensorInfo(y)), g; +}; +var lD = { kernelName: ks, backendName: "webgl", kernelFunc: jZ }; +function XZ(r) { + let { inputs: e, backend: t10 } = r, { indices: o, values: n, denseShape: s, defaultValue: a } = e; + if (s.shape.length !== 1) + throw new Error(`Dense shape must be a vector, saw: + ${s.shape}`); + if (o.shape.length !== 2) + throw new Error(`Indices must be a matrix, saw: + ${o.shape}`); + if (n.shape.length !== 1) + throw new Error(`Values must be a vector, saw: + ${n.shape}`); + if (a.shape.length !== 0) + throw new Error(`Default value must be a scalar, saw: + ${a.shape}`); + let i = t10.readSync(o.dataId), p = t10.readSync(n.dataId), u = t10.readSync(s.dataId), c = t10.readSync(a.dataId)[0], [l, m, f, d, h] = M$(i, o.shape, o.dtype, p, n.dtype, u, c); + return [t10.makeTensorInfo(m, o.dtype, l), t10.makeTensorInfo([m[0]], n.dtype, f), t10.makeTensorInfo([d.length], "bool", new Uint8Array(d.map((g) => Number(g)))), t10.makeTensorInfo([h.length], o.dtype, new Int32Array(h))]; +} +var mD = { kernelName: Qa, backendName: "webgl", kernelFunc: XZ }; +function YZ(r) { + let { inputs: e, backend: t10 } = r, { inputIndices: o, inputShape: n, newShape: s } = e; + if (o.shape.length !== 2) + throw new Error(`Input indices should be a matrix but received shape ${o.shape}`); + if (n.shape.length !== 1) + throw new Error(`Input shape should be a vector but received shape ${n.shape}`); + if (s.shape.length !== 1) + throw new Error(`Target shape should be a vector but received shape ${s.shape}`); + let a = Array.from(t10.readSync(n.dataId)), i = t10.readSync(o.dataId), p = Array.from(t10.readSync(s.dataId)), [u, c, l] = L$(i, o.shape, o.dtype, a, p); + return [t10.makeTensorInfo(c, o.dtype, u), t10.makeTensorInfo([l.length], s.dtype, new Int32Array(l))]; +} +var fD = { kernelName: ga, backendName: "webgl", kernelFunc: YZ }; +function QZ(r) { + let { inputs: e, backend: t10 } = r, { data: o, indices: n, segmentIds: s } = e; + if (o.shape.length < 1) + throw new Error("Data should be at least 1 dimensional but received scalar"); + if (n.shape.length !== 1) + throw new Error(`Indices should be a vector but received shape + ${n.shape}`); + if (s.shape.length !== 1) + throw new Error(`Segment ids should be a vector but received shape + ${s.shape}`); + let a = t10.readSync(o.dataId), i = t10.readSync(n.dataId), p = t10.readSync(s.dataId), [u, c] = sh(a, o.shape, o.dtype, i, p, true); + return t10.makeTensorInfo(c, o.dtype, u); +} +var dD = { kernelName: Za, backendName: "webgl", kernelFunc: QZ }; +function ZZ(r) { + let { inputs: e, backend: t10 } = r, { data: o, indices: n, segmentIds: s } = e; + if (o.shape.length < 1) + throw new Error("Data should be at least 1 dimensional but received scalar"); + if (n.shape.length !== 1) + throw new Error(`Indices should be a vector but received shape + ${n.shape}`); + if (s.shape.length !== 1) + throw new Error(`Segment ids should be a vector but received shape + ${s.shape}`); + let a = t10.readSync(o.dataId), i = t10.readSync(n.dataId), p = t10.readSync(s.dataId), [u, c] = sh(a, o.shape, o.dtype, i, p); + return t10.makeTensorInfo(c, o.dtype, u); +} +var hD = { kernelName: Ja, backendName: "webgl", kernelFunc: ZZ }; +function JZ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { sparseIndices: n, sparseValues: s, defaultValue: a } = e, { outputShape: i } = o, { sliceRank: p, numUpdates: u, sliceSize: c, strides: l, outputSize: m } = I.calculateShapes(s, n, i), f = false; + if (s.dtype === "string") { + let y = t10.bufferSync(n), b = t10.bufferSync(s), C = x.decodeString(t10.readSync(a.dataId)[0]), w = D$(y, b, i, m, c, u, p, l, C, f); + return t10.makeTensorInfo(i, w.dtype, w.values); + } + let d = new vc(u, p, n.shape.length, s.shape.length, l, [m, 1], f), h = t10.runWebGLProgram(d, [s, n, a], s.dtype), g = J({ inputs: { x: h }, backend: t10, attrs: { shape: i } }); + return t10.disposeIntermediateTensorInfo(h), g; +} +var gD = { kernelName: ei, backendName: "webgl", kernelFunc: JZ }; +function e9(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { numOrSizeSplits: s, axis: a } = o, i = x.parseAxisParam(a, n.shape)[0], p = I.prepareSplitSize(n, s, i), u = n.shape.length, c = new Array(u).fill(0), l = n.shape.slice(); + return p.map((m) => { + let f = [...l]; + f[i] = m; + let d = ps({ inputs: { x: n }, backend: t10, attrs: { begin: c, size: f } }); + return c[i] += m, d; + }); +} +var xD = { kernelName: Ts, backendName: "webgl", kernelFunc: e9 }; +var yD = "return sqrt(x);"; +var t9 = he({ opSnippet: yD, packedOpSnippet: yD, cpuKernelImpl: B$ }); +var bD = { kernelName: bo, backendName: "webgl", kernelFunc: t9 }; +var r9 = "return x * x;"; +var o9 = he({ opSnippet: r9 }); +var CD = { kernelName: ti, backendName: "webgl", kernelFunc: o9 }; +var ID = "return (a - b) * (a - b);"; +var n9 = ot({ opSnippet: ID, packedOpSnippet: ID }); +var wD = { kernelName: Co, backendName: "webgl", kernelFunc: n9 }; +function s9({ inputs: r, attrs: e, backend: t10 }) { + let { x: o } = r, n = Vt + ` + return x > 0.0 ? 1.0 : float(${e.alpha}); + `, s = new fr(o.shape, n); + return t10.runWebGLProgram(s, [o], o.dtype); +} +var SD = { kernelName: $s, backendName: "webgl", kernelFunc: s9 }; +var Sg = class { + constructor(e, t10, o) { + this.variableNames = ["x"], this.outputShape = o; + let n = o.length, s = _e(o.length), a = _e(o.length), i = ""; + if (n === 1) + i = "coords * strides + begin"; + else { + let p = 0; + i = o.map((u, c) => (p++, o.length === 1 ? `coords * strides[${c}] + begin[${c}]` : `coords[${p - 1}] * strides[${c}] + begin[${c}]`)).join(","); + } + this.userCode = ` + ${s} begin = ${s}(${e}); + ${s} strides = ${s}(${t10}); + + void main() { + ${a} coords = getOutputCoords(); + setOutput(getX(${i})); + } + `; + } +}; +function a9(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { begin: s, end: a, strides: i, beginMask: p, endMask: u, ellipsisMask: c, newAxisMask: l, shrinkAxisMask: m } = o, { finalShapeSparse: f, finalShape: d, isIdentity: h, sliceDim0: g, isSimpleSlice: y, begin: b, end: C, strides: w } = et.sliceInfo(n.shape, s, a, i, p, u, c, l, m), k; + if (h) + k = J({ inputs: { x: n }, backend: t10, attrs: { shape: d } }); + else if (g || y) { + x.assert(n.shape.length >= 1, () => `Input must have rank at least 1, got: ${n.shape.length}`); + let E = et.computeOutShape(b, C, w), R = ps({ inputs: { x: n }, backend: t10, attrs: { begin: b, size: E } }); + k = J({ inputs: { x: R }, backend: t10, attrs: { shape: d } }), t10.disposeIntermediateTensorInfo(R); + } else if (t10.shouldExecuteOnCPU([n])) { + let R = t10.readSync(n.dataId), A = ne(n.shape, n.dtype, R), D = V$(f, A, w, b); + k = t10.makeTensorInfo(d, n.dtype, D.values); + } else { + let R = new Sg(b, w, f); + k = t10.runWebGLProgram(R, [n], n.dtype); + } + let _ = J({ inputs: { x: k }, backend: t10, attrs: { shape: d } }); + return t10.disposeIntermediateTensorInfo(k), _; +} +var vD = { kernelName: Yn, backendName: "webgl", kernelFunc: a9 }; +function i9(r) { + let { inputs: e, backend: t10, attrs: o } = r, { separator: n, nGramWidths: s, leftPad: a, rightPad: i, padWidth: p, preserveShortSequences: u } = o, { data: c, dataSplits: l } = e, m = t10.readSync(c.dataId), f = t10.readSync(l.dataId), [d, h] = z$(m, f, n, s, a, i, p, u); + return [t10.makeTensorInfo([d.length], "string", d), t10.makeTensorInfo(l.shape, "int32", h)]; +} +var kD = { kernelName: Ns, backendName: "webgl", kernelFunc: i9 }; +function u9(r) { + let { inputs: e, backend: t10, attrs: o } = r, { skipEmpty: n } = o, { input: s, delimiter: a } = e; + if (s.dtype !== "string") + throw new Error("Input must be of datatype string"); + if (s.shape.length !== 1) + throw new Error(`Input must be a vector, got shape: ${s.shape}`); + if (a.shape.length !== 0) + throw new Error(`Delimiter must be a scalar, got shape: ${a.shape}`); + let i = t10.readSync(s.dataId), p = t10.readSync(a.dataId)[0], [u, c, l] = W$(i, p, n), m = c.length; + return [t10.makeTensorInfo([m, 2], "int32", u), t10.makeTensorInfo([m], "string", c), t10.makeTensorInfo([2], "int32", new Int32Array(l))]; +} +var TD = { kernelName: ri, backendName: "webgl", kernelFunc: u9 }; +function p9(r) { + let { inputs: e, backend: t10, attrs: o } = r, { numBuckets: n } = o, { input: s } = e; + if (s.dtype !== "string") + throw new Error("Input must be of datatype string"); + if (n <= 0) + throw new Error("Number of buckets must be at least 1"); + let a = t10.readSync(s.dataId), i = U$(a, n); + return t10.makeTensorInfo(s.shape, "int32", i); +} +var ND = { kernelName: oi, backendName: "webgl", kernelFunc: p9 }; +var c9 = "return tan(x);"; +var l9 = he({ opSnippet: c9 }); +var _D = { kernelName: xa, backendName: "webgl", kernelFunc: l9 }; +var m9 = ` + float e2x = exp(-2.0 * abs(x)); + return sign(x) * (1.0 - e2x) / (1.0 + e2x); +`; +var f9 = he({ opSnippet: m9 }); +var ED = { kernelName: Qn, backendName: "webgl", kernelFunc: f9 }; +var vg = class { + constructor(e, t10) { + this.variableNames = ["A"]; + let o = new Array(e.length); + for (let a = 0; a < o.length; a++) + o[a] = e[a] * t10[a]; + this.outputShape = o, this.rank = o.length; + let n = _e(this.rank), s = d9(e); + this.userCode = ` + void main() { + ${n} resRC = getOutputCoords(); + setOutput(getA(${s})); + } + `; + } +}; +function d9(r) { + let e = r.length; + if (e > 5) + throw Error(`Tile for rank ${e} is not yet supported`); + if (e === 1) + return `imod(resRC, ${r[0]})`; + let t10 = ["resRC.x", "resRC.y", "resRC.z", "resRC.w", "resRC.u"], o = []; + for (let n = 0; n < r.length; n++) + o.push(`imod(${t10[n]}, ${r[n]})`); + return o.join(); +} +function Hw(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { reps: s } = o; + if (n.dtype === "string" || n.shape.length > 5) { + let p = t10.readSync(n.dataId), u = n.dtype === "string" ? p.map((m) => x.decodeString(m)) : p, c = ne(n.shape, n.dtype, u), l = H$(c, s); + return t10.makeTensorInfo(l.shape, l.dtype, l.values); + } + let a = new vg(n.shape, s); + return t10.runWebGLProgram(a, [n], n.dtype); +} +var $D = { kernelName: wo, backendName: "webgl", kernelFunc: Hw }; +var kg = class { + constructor(e) { + this.variableNames = ["x", "indices"], this.customUniforms = [{ name: "n", type: "int" }, { name: "firstPass", type: "int" }, { name: "negativeInf", type: "float" }, { name: "dir", type: "int" }, { name: "inc", type: "int" }], this.outputShape = e, this.userCode = ` + void main() { + ivec2 coords = getOutputCoords(); + int batch = coords[0]; + int elemIdx = coords[1]; + + // We compare elements pair-wise within a group of size 2 * inc. + // The comparing rule for each group alternates between ascending + // and descending. Within each group, we compare each pair at + // positions i and i+inc. To decide whether an element at position i + // is x0 or x1, we mod it by 2 * inc, if the result is smaller than + // inc, it is in the first half of the group, we denote it as x0, + // otherwise we denote it as x1. + // For example, as shown in the Bitonic top K paper referenced above, + // Figure5(a) shows that element[1] is in the + // second half of the group when group size is 2, but it is in the + // first half of the group when group size is 4. + + bool isFirstInPair = imod(elemIdx, 2 * inc) < inc; + int i = isFirstInPair ? elemIdx : elemIdx - inc; + + int i0 = firstPass == 1 ? i : int(getIndices(batch, i)); + int i1 = firstPass == 1 ? i + inc : int(getIndices(batch, i + inc)); + float x0 = i0 < n ? getX(batch, i0) : negativeInf; + float x1 = i1 < n ? getX(batch, i1) : negativeInf; + + // Denotes which direction indices are in (ascending or descending). + bool reverse = imod(elemIdx, 2 * dir) >= dir; + bool isGreater = x0 > x1 || (x0 == x1 && i1 > i0); + if (reverse == isGreater) { // Elements in opposite order of direction + int iTemp = i0; + i0 = i1; + i1 = iTemp; + } + if (isFirstInPair) { + setOutput(float(i0)); + } else { + setOutput(float(i1)); + } + } + `; + } +}; +var Tg = class { + constructor(e) { + this.variableNames = ["x", "indices"], this.customUniforms = [{ name: "n", type: "int" }, { name: "firstPass", type: "int" }, { name: "k", type: "int" }], this.outputShape = e, this.userCode = ` + void main() { + // Takes max of indices (0, k), (1, k + 1), (2, k + 2) ... + ivec2 coords = getOutputCoords(); + int batch = coords[0]; + int elemIdx = coords[1]; + + // The output size is half of the previous size. + // If the previous sequence is | | | | _ _ _ _ | | | | _ _ _ _ (k=4), + // we only need to output the indices at positions |, the indices at + // positions _ can be thrown away, see Figure5(b) After Phase 2 + // (Merge phase) in the Bitonic Top K paper referenced above. + // For example, the paper shows we only need to output the orange bars. + // The output sequence should look like this | | | | | | | |. + // Because the sequence is halved, to map the output index back + // to the previous sequence to find the corresponding value, + // we need to double the index. When we double the index, + // we basically interpolate a position, so 2i looks like + // | _ | _ | _ | _ | _ | _ | _. We move the | to the first k position + // of each 2k positions by - elemIdx % k. E.g. for output at + // index 4,5,6,7, we want to get the corresponding element at + // original index 8,9,10,11, for output at index 8,9,10,11, + // we want to get the corresponding element at original index + // 16,17,18,19, so on and so forth. + + int i = elemIdx < k ? elemIdx : (elemIdx * 2 - imod(elemIdx, k)); + int i0 = firstPass == 1 ? i : int(getIndices(batch, i)); + int i1 = firstPass == 1 ? i + k : int(getIndices(batch, i + k)); + + float x0 = getX(batch, i0); + float x1 = i1 < n ? getX(batch, i1) : x0; + + setOutput(x0 >= x1 ? float(i0) : float(i1)); + } + `; + } +}; +function Vu(r, e) { + e !== null && r.disposeIntermediateTensorInfo(e); +} +function RD(r) { + let e = 1; + for (; e < r; ) + e *= 2; + return e; +} +function h9(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { k: s, sorted: a } = o, i = P().getNumber("TOPK_LAST_DIM_CPU_HANDOFF_SIZE_THRESHOLD"), p = P().getNumber("TOPK_K_CPU_HANDOFF_THRESHOLD"), u = n.shape, c = u[u.length - 1]; + if (t10.shouldExecuteOnCPU([n]) || c < i || s > p) { + let D = t10.readSync(n.dataId), [O, M] = q$(D, u, n.dtype, s, a); + return [t10.makeTensorInfo(O.shape, O.dtype, O.values), t10.makeTensorInfo(M.shape, M.dtype, M.values)]; + } + if (s === 0) + return u[u.length - 1] = 0, [t10.makeTensorInfo(u, n.dtype, []), t10.makeTensorInfo(u, "int32", [])]; + if (c === 1) + return [n, Ba({ attrs: { shape: u, dtype: "int32", value: 0 }, backend: t10 })]; + let l = t10.texData.get(n.dataId), m = l !== null && l.isPacked, f = m ? t10.unpackTensor(n) : n, h = x.sizeFromShape(u) / c, g = J({ inputs: { x: f }, attrs: { shape: [h, c] }, backend: t10 }); + m && Vu(t10, f); + let y = RD(s), b = RD(c), C = null, w = () => C === null ? [g, g] : [g, C], k = (D, O, M) => { + let L = w(), W = new kg(M), G = [[c], [C === null ? 1 : 0], [Number.NEGATIVE_INFINITY], [D], [O]], q = C; + C = t10.runWebGLProgram(W, L, "int32", G), Vu(t10, q); + }; + for (let D = 1; D < y; D *= 2) { + let O = D * 2; + for (let M = D; M >= 1; M /= 2) + k(O, M, [h, b]); + } + for (let D = b; D > y; D /= 2) { + let O = w(), M = new Tg([h, D / 2]), W = [[c], [C === null ? 1 : 0], [y]], V = C; + C = t10.runWebGLProgram(M, O, "int32", W), Vu(t10, V); + let G = y / 2, q = G * 2; + for (let H = G; H >= 1; H /= 2) + k(q, H, C.shape); + } + let _ = C; + C = ps({ inputs: { x: C }, backend: t10, attrs: { begin: 0, size: [h, s] } }), Vu(t10, _); + let E = Lw({ inputs: { x: g, indices: C }, backend: t10, attrs: { axis: 1, batchDims: 1 } }); + Vu(t10, g); + let R = u.slice(0, -1); + R.push(s), _ = C, C = J({ inputs: { x: C }, attrs: { shape: R }, backend: t10 }), Vu(t10, _); + let A = E; + return E = J({ inputs: { x: E }, attrs: { shape: R }, backend: t10 }), Vu(t10, A), [E, C]; +} +var AD = { kernelName: Zn, backendName: "webgl", kernelFunc: h9 }; +var Ng = class { + constructor(e, t10, o, n, s, a) { + this.variableNames = ["Image", "Transforms"], this.outputShape = a; + let i = o === "nearest" ? 1 : 2, p; + switch (n) { + case "constant": + p = 1; + break; + case "reflect": + p = 2; + break; + case "wrap": + p = 3; + break; + case "nearest": + p = 4; + break; + default: + p = 1; + break; + } + this.userCode = ` + float mapCoord(float outCoord, float len) { + float inCoord = outCoord; + if(${p} == 2) { + if (inCoord < 0.0) { + if (len <= 1.0) { + inCoord = 0.0; + } else { + float sz2 = 2.0 * len; + if (inCoord < sz2) { + inCoord = sz2 * float(int(float(-inCoord / sz2))) + + inCoord; + } + inCoord = inCoord < -len ? inCoord + sz2 : -inCoord - 1.0; + } + } else if (inCoord > len - 1.0) { + if (len <= 1.0) { + inCoord = 0.0; + } else { + float sz2 = 2.0 * len; + inCoord -= sz2 * float(int(float(inCoord / sz2))); + if (inCoord >= len) { + inCoord = sz2 - inCoord - 1.0; + } + } + } + return clamp(inCoord, 0.0, len - 1.0); + } else if (${p} == 3) { + if (inCoord < 0.0) { + if (len <= 1.0) { + inCoord = 0.0; + } else { + float sz = len - 1.0; + inCoord += len * (float(int(float(-inCoord / sz))) + 1.0); + } + } else if (inCoord > len - 1.0) { + if (len <= 1.0) { + inCoord = 0.0; + } else { + float sz = len - 1.0; + inCoord -= len * float(int(float(inCoord / sz))); + } + } + return clamp(inCoord, 0.0, len - 1.0); + } else if (${p} == 4) { + return clamp(outCoord, 0.0, len - 1.0); + } else { + return outCoord; + } + } + + float readWithFillValue(int batch, int coordY, int coordX, + int channel) { + float outputValue; + if (0 <= coordY && coordY < ${e} && 0 <= coordX && coordX < ${t10}) { + outputValue = getImage(batch, coordY, coordX, channel); + } else { + outputValue = float(${s}); + } + return outputValue; + } + + void main() { + ivec4 coords = getOutputCoords(); + float outputValue; + int batch = coords[0]; + int x = coords[2]; + int y = coords[1]; + int channel = coords[3]; + float xf = float(x); + float yf = float(y); + float a1 = getTransforms(batch, 0); + float a2 = getTransforms(batch, 1); + float a3 = getTransforms(batch, 2); + float b1 = getTransforms(batch, 3); + float b2 = getTransforms(batch, 4); + float b3 = getTransforms(batch, 5); + float c1 = getTransforms(batch, 6); + float c2 = getTransforms(batch, 7); + float projection = c1 * xf + c2 * yf + 1.0; + if (projection == 0.0) { + outputValue = float(${s}); + } else { + float inX = (a1 * xf + a2 * yf + a3) / projection; + float inY = (b1 * xf + b2 * yf + b3) / projection; + float mapX = mapCoord(inX, float(${t10})); + float mapY = mapCoord(inY, float(${e})); + + if (${i} == 1) { + int coordY = int(round(mapY)); + int coordX = int(round(mapX)); + outputValue = readWithFillValue(batch, coordY, coordX, + channel); + } else { + float yFloor = floor(mapY); + float xFloor = floor(mapX); + float yCeil = yFloor + 1.0; + float xCeil = xFloor + 1.0; + float valueYFloor = (xCeil - mapX) * + readWithFillValue(batch, int(yFloor), int(xFloor), channel) + + (mapX - xFloor) * + readWithFillValue(batch, int(yFloor), int(xCeil), channel); + float valueYCeil = (xCeil - mapX) * + readWithFillValue(batch, int(yCeil), int(xFloor), channel) + + (mapX - xFloor) * + readWithFillValue(batch, int(yCeil), int(xCeil), channel); + outputValue = (yCeil - mapY) * valueYFloor + + (mapY - yFloor) * valueYCeil; + } + } + setOutput(outputValue); + } + `; + } +}; +function g9(r) { + let { inputs: e, backend: t10, attrs: o } = r, { image: n, transforms: s } = e, { interpolation: a, fillMode: i, fillValue: p, outputShape: u } = o, [c, l, m, f] = n.shape, [d, h] = u != null ? u : [l, m], g = [c, d, h, f], y = new Ng(l, m, a, i, p, g); + return t10.runWebGLProgram(y, [n, s], "float32"); +} +var FD = { kernelName: Jn, backendName: "webgl", kernelFunc: g9 }; +function x9(r) { + let { inputs: e, attrs: t10, backend: o } = r, { axis: n } = t10, { x: s } = e; + as(s, "unique"), console.warn("WARNING: ", "UI might be locked temporarily as data is being downloaded"); + let a = o.readSync(s.dataId), { outputValues: i, outputShape: p, indices: u } = K$(a, n, s.shape, s.dtype); + return [o.makeTensorInfo(p, s.dtype, i), o.makeTensorInfo([u.length], "int32", u)]; +} +var DD = { kernelName: $p, backendName: "webgl", kernelFunc: x9 }; +function y9(r) { + let { inputs: e, backend: t10, attrs: o } = r, { value: n } = e, { axis: s } = o; + s < 0 && (s += n.shape.length); + let a = n, i = a.shape.length, p = n.shape[s], u = new Array(i - 1), c = 0; + for (let h = 0; h < i; h++) + h !== s && (u[c++] = a.shape[h]); + let l = [], m = new Array(i).fill(0), f = a.shape.slice(); + f[s] = 1; + let d = new Array(p); + for (let h = 0; h < d.length; h++) { + m[s] = h; + let g = ps({ inputs: { x: a }, backend: t10, attrs: { begin: m, size: f } }), y = J({ inputs: { x: g }, backend: t10, attrs: { shape: u } }); + d[h] = y, l.push(g); + } + return l.forEach((h) => t10.disposeIntermediateTensorInfo(h)), d; +} +var PD = { kernelName: _s, backendName: "webgl", kernelFunc: y9 }; +var _g = class { + constructor(e, t10) { + this.variableNames = ["x", "segmentIds"]; + let o = e.windowSize, n = e.batchSize, s = e.inSize, a = e.numSegments, i = a * Math.ceil(s / o); + this.outputShape = [n, i]; + let p = "0.0", u = "sumValue", c = Math.floor(o / 4) * 4, l = o % 4, m = ` + sumValue += dot(values, segFilter); + `, f = ""; + s % o > 0 && (f = ` + if (inIdx < 0 || inIdx >= ${s}) { + return initializationValue; + } + `); + let d = ""; + s % o > 0 && (d = ` + if (inIdx < 0 || inIdx >= ${s}) { + return -1.0; + } + `), this.userCode = ` + const float initializationValue = ${p}; + + float getValue(int batch, int inIdx) { + ${f} + return getX(batch, inIdx); + } + + float getSegmentIdAtIndex(int inIdx) { + ${d} + return getSegmentIds(inIdx); + } + + void main() { + ivec2 coords = getOutputCoords(); + int batch = coords[0]; + int outIdx = coords[1]; + int inOffset = int(floor(float(outIdx) / float( + ${a})) * float(${o})); + int currentSeg = int(mod(float(outIdx), float(${a}))); + + float sumValue = 0.0; + + for (int i = 0; i < ${c}; i += 4) { + int inIdx = inOffset + i; + vec4 values = vec4( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + getValue(batch, inIdx + 2), + getValue(batch, inIdx + 3) + ); + + vec4 segFilter = vec4( + int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0, + int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0, + int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0, + int(getSegmentIdAtIndex(inIdx + 3)) == currentSeg ? 1 : 0 + ); + + ${m} + } + + int inIdx = inOffset + ${c}; + if (${l === 1}) { + vec4 values = vec4( + getValue(batch, inIdx), + initializationValue, + initializationValue, + initializationValue + ); + + int inIdxSeg = int(getSegmentIdAtIndex(inIdx)); + + vec4 segFilter = vec4( + int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0, + 0, + 0, + 0 + ); + + ${m} + } else if (${l === 2}) { + vec4 values = vec4( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + initializationValue, + initializationValue + ); + + vec4 segFilter = vec4( + int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0, + int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0, + 0, + 0 + ); + + ${m} + } else if (${l === 3}) { + vec4 values = vec4( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + getValue(batch, inIdx + 2), + initializationValue + ); + + vec4 segFilter = vec4( + int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0, + int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0, + int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0, + 0 + ); + + ${m} + } + setOutput(${u}); + } + `; + } +}; +function b9(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, segmentIds: s } = e, { numSegments: a } = o, i = n.shape.length, p = [], u = 0, c = I.getAxesPermutation([u], i), l = n; + c != null && (l = xt({ inputs: { x: n }, backend: t10, attrs: { perm: c } }), p.push(l), u = I.getInnerMostAxes(1, i)[0]); + let m = I.segment_util.computeOutShape(l.shape, u, a), f = x.sizeFromShape([l.shape[u]]), d = J({ inputs: { x: l }, backend: t10, attrs: { shape: [-1, f] } }); + p.push(d); + let h = Ca(n.dtype), g = (w, k, _, E, R) => { + let A = w.shape[0], D = w.shape[1], O = I.segment_util.segOpComputeOptimalWindowSize(D, R), M = { windowSize: O, inSize: D, batchSize: A, numSegments: R }, L = new _g(M, k), W = t10.compileAndRun(L, [w, _], E); + if (p.push(W), W.shape[1] === R) + return W; + let V = Gw({ backend: t10, attrs: { start: 0, stop: R, step: 1, dtype: "float32" } }), G = Hw({ inputs: { x: V }, backend: t10, attrs: { reps: [D / O] } }); + return p.push(V), p.push(G), g(W, k, G, E, R); + }, y = g(d, "unsortedSegmentSum", s, h, a), b = J({ inputs: { x: y }, backend: t10, attrs: { shape: m } }), C = b; + if (c != null) { + p.push(b); + let w = I.getUndoAxesPermutation(c); + C = xt({ inputs: { x: C }, backend: t10, attrs: { perm: w } }); + } + return p.forEach((w) => t10.disposeIntermediateTensorInfo(w)), C; +} +var OD = { kernelName: Rp, backendName: "webgl", kernelFunc: b9 }; +var C9 = [IR, SR, vR, kR, NR, _R, ER, $R, FR, DR, PR, OR, MR, LR, BR, VR, zR, WR, UR, GR, HR, KR, jR, XR, JR, tA, rA, lR, nA, aA, iA, uA, pA, cA, lA, mA, fA, dA, hA, yA, bA, CA, IA, wA, SA, vA, kA, TA, NA, _A, EA, $A, RA, AA, FA, PA, OA, MA, LA, VA, zA, WA, UA, GA, HA, qA, KA, jA, cR, XA, sA, YA, QA, ZA, mR, JA, eF, tF, rF, oF, nF, sF, aF, iF, uF, cF, lF, mF, fF, dF, hF, xF, bF, CF, IF, wF, SF, _F, hR, EF, $F, RF, AF, YR, FF, OF, MF, LF, BF, fR, VF, zF, WF, UF, GF, QR, vF, HF, qF, KF, xR, jF, XF, YF, QF, ZF, JF, eD, tD, rD, oD, nD, sD, aD, iD, uD, pD, qR, NF, cD, lD, mD, fD, dD, hD, gD, xD, bD, CD, wD, SD, vD, kD, TD, ND, TF, bR, _D, ED, $D, AD, FD, CR, DD, PD, OD, DF]; +for (let r of C9) + ya(r); +var Ae; +(function(r) { + r[r.float32 = 0] = "float32", r[r.int32 = 1] = "int32", r[r.bool = 2] = "bool", r[r.string = 3] = "string", r[r.complex64 = 4] = "complex64"; +})(Ae || (Ae = {})); +var $i; +(function(r) { + r[r.linear = 0] = "linear", r[r.relu = 1] = "relu", r[r.relu6 = 2] = "relu6", r[r.prelu = 3] = "prelu", r[r.leakyrelu = 4] = "leakyrelu", r[r.sigmoid = 5] = "sigmoid", r[r.elu = 6] = "elu"; +})($i || ($i = {})); +var MD; +function I9(r) { + MD = r.wasm.cwrap(Fo, null, ["number", "array", "number", "number", "array", "number", "number", "number", "number", "number", "number", "number", "number"]); +} +function w9(r) { + let { inputs: e, backend: t10, attrs: o } = r, { a: n, b: s, bias: a, preluActivationWeights: i } = e; + if (n.dtype !== "float32" || s.dtype !== "float32") + throw new Error("_FusedMatMul for non non-float32 tensors not yet supported."); + let { transposeA: p, transposeB: u, activation: c, leakyreluAlpha: l } = o, m = t10.dataIdMap.get(n.dataId).id, f = t10.dataIdMap.get(s.dataId).id, d = 0; + if (a != null) { + let R = t10.dataIdMap.get(a.dataId); + if (R.shape.length !== 1) + throw new Error(`_FusedMatMul only supports rank-1 bias but got rank ${R.shape.length}.`); + d = R.id; + } + let h = i == null ? 0 : t10.dataIdMap.get(i.dataId).id, g = $i[c]; + if (g == null) + throw new Error(`${c} activation not yet supported for FusedConv2D in the wasm backend.`); + let y = p ? n.shape[2] : n.shape[1], b = u ? s.shape[1] : s.shape[2], C = br.assertAndGetBroadcastShape(n.shape.slice(0, -2), s.shape.slice(0, -2)), w = t10.makeOutput([...C, y, b], n.dtype), k = t10.dataIdMap.get(w.dataId).id, _ = new Uint8Array(new Int32Array(n.shape).buffer), E = new Uint8Array(new Int32Array(s.shape).buffer); + return MD(m, _, n.shape.length, f, E, s.shape.length, p, u, g, d, h, l || 0, k), w; +} +var LD = { kernelName: Fo, backendName: "wasm", setupFunc: I9, kernelFunc: w9 }; +function Qe(r, e) { + let t10; + function o(s) { + t10 = s.wasm.cwrap(r, null, ["number", "number", "number"]); + } + function n(s) { + let { backend: a, inputs: { x: i } } = s, p = a.dataIdMap.get(i.dataId).id, u = a.makeOutput(i.shape, e || i.dtype), c = a.dataIdMap.get(u.dataId).id; + return x.sizeFromShape(u.shape) === 0 || t10(p, Ae[i.dtype], c), u; + } + return { kernelName: r, backendName: "wasm", setupFunc: o, kernelFunc: n }; +} +var BD = Qe(sn); +function nt(r, e, t10) { + let o; + function n(a) { + o = a.wasm.cwrap(r, null, ["number", "array", "number", "number", "array", "number", "number", "number"]); + } + function s(a) { + let { backend: i, inputs: p } = a, { a: u, b: c } = p, l = i.dataIdMap.get(u.dataId).id, m = i.dataIdMap.get(c.dataId).id, f = t10 != null ? t10 : u.dtype, d = I.assertAndGetBroadcastShape(u.shape, c.shape), h = i.makeOutput(d, f); + if (x.sizeFromShape(d) === 0) + return h; + let g = new Uint8Array(new Int32Array(u.shape).buffer), y = new Uint8Array(new Int32Array(c.shape).buffer), b = i.dataIdMap.get(h.dataId).id; + return (() => o(l, g, u.shape.length, m, y, c.shape.length, Ae[u.dtype], b))(), h; + } + return { kernelName: r, backendName: "wasm", setupFunc: n, kernelFunc: s }; +} +var S9 = true; +var VD = nt(_r, S9); +var zD; +function v9(r) { + zD = r.wasm.cwrap(an, null, ["array", "number", "number", "number"]); +} +function k9(r) { + let { inputs: e, backend: t10 } = r, o = t10.makeOutput(e[0].shape, e[0].dtype); + if (x.sizeFromShape(o.shape) === 0) + return o; + let n = e.map((i) => t10.dataIdMap.get(i.dataId).id), s = new Uint8Array(new Int32Array(n).buffer), a = t10.dataIdMap.get(o.dataId).id; + return zD(s, n.length, Ae[o.dtype], a), o; +} +var WD = { kernelName: an, backendName: "wasm", setupFunc: v9, kernelFunc: k9 }; +function zu(r) { + let { inputs: { x: e }, backend: t10 } = r; + if (e.dtype === "string") + return nr(t10.readSync(e.dataId), e.shape, e.dtype); + let o = t10.makeOutput(e.shape, e.dtype), n = t10.typedArrayFromHeap(e); + return t10.typedArrayFromHeap(o).set(n), o; +} +var UD = { kernelName: uo, backendName: "wasm", kernelFunc: zu }; +var GD; +function T9(r) { + GD = r.wasm.cwrap(Mr, null, ["number", "array", "number", "number", "number", "array", "number"]); +} +function Eo(r) { + let { inputs: e, backend: t10, attrs: o } = r, [n, s] = _9(e.x.shape, o.perm), a = true; + for (let d = 0; d < s.length; d++) + s[d] !== d && (a = false); + let i = N9(e.x.shape, o.perm), p = { dataId: e.x.dataId, shape: n, dtype: e.x.dtype }; + if (a) { + let d = zu({ inputs: e, backend: t10 }); + return d.shape = i, d; + } + let u = t10.makeOutput(i, p.dtype), c = t10.dataIdMap.get(p.dataId).id, l = t10.dataIdMap.get(u.dataId).id, m = new Uint8Array(new Int32Array(s).buffer), f = new Uint8Array(new Int32Array(p.shape).buffer); + return GD(c, f, p.shape.length, Ae[p.dtype], l, m, s.length), u; +} +function N9(r, e) { + let t10 = new Array(r.length); + for (let o = 0; o < t10.length; o++) + t10[o] = r[e[o]]; + return t10; +} +function _9(r, e) { + let t10 = [], o = []; + for (let n = 0; n < r.length; ++n) + r[n] !== 1 && t10.push(r[n]), r[e[n]] !== 1 && o.push(e[n]); + for (let n = 0; n < o.length; ++n) { + let s = -1; + for (let a = 0; a < o.length; ++a) + o[a] >= n && (s === -1 || o[s] > o[a]) && (s = a); + o[s] = n; + } + return [t10, o]; +} +var HD = { kernelName: Mr, backendName: "wasm", kernelFunc: Eo, setupFunc: T9 }; +function kr(r, e, t10) { + let o = r.shape, n = r.shape.length, s = x.parseAxisParam(e, o), a = s, i = I.getAxesPermutation(a, n), p = null, u = false; + if (i != null) { + let c = new Array(n); + for (let f = 0; f < c.length; f++) + c[f] = o[i[f]]; + a = I.getInnerMostAxes(a.length, n), p = Eo({ inputs: { x: r }, attrs: { perm: i }, backend: t10 }); + let l = t10.dataIdMap.get(r.dataId).id; + t10.dataIdMap.get(p.dataId).id !== l && (u = true); + } + return { transposed: p, originalAxes: s, axes: a, inputWasTransposed: u }; +} +var qD; +function E9(r) { + qD = r.wasm.cwrap(oa, null, ["number, number, number"]); +} +function $9(r) { + let { backend: e, inputs: t10, attrs: o } = r, { axis: n, keepDims: s } = o, { x: a } = t10, p = e.dataIdMap.get(a.dataId).id, u = a, { transposed: c, axes: l, originalAxes: m, inputWasTransposed: f } = kr(a, n, e); + if (f) { + let C = e.dataIdMap.get(c.dataId).id; + u = c, p = C; + } + let d = u.shape.length; + I.assertAxesAreInnerMostDims("all", l, d); + let [h, g] = I.computeOutAndReduceShapes(u.shape, l), y = x.sizeFromShape(g), b = e.makeOutput(h, a.dtype); + if (x.sizeFromShape(u.shape) !== 0) { + let C = e.dataIdMap.get(b.dataId).id; + qD(p, y, C); + } + if (f && e.disposeData(c.dataId), s) { + let C = I.expandShapeToKeepDim(b.shape, m); + b.shape = C; + } + return b; +} +var KD = { kernelName: oa, backendName: "wasm", setupFunc: E9, kernelFunc: $9 }; +var jD; +function R9(r) { + jD = r.wasm.cwrap(na, null, ["number, number, number"]); +} +function A9(r) { + let { backend: e, inputs: t10, attrs: o } = r, { axis: n, keepDims: s } = o, { x: a } = t10, p = e.dataIdMap.get(a.dataId).id, u = a, { transposed: c, axes: l, originalAxes: m, inputWasTransposed: f } = kr(a, n, e); + if (f) { + let C = e.dataIdMap.get(c.dataId).id; + u = c, p = C; + } + let d = u.shape.length; + I.assertAxesAreInnerMostDims("any", l, d); + let [h, g] = I.computeOutAndReduceShapes(u.shape, l), y = x.sizeFromShape(g), b = e.makeOutput(h, a.dtype); + if (x.sizeFromShape(u.shape) !== 0) { + let C = e.dataIdMap.get(b.dataId).id; + jD(p, y, C); + } + if (f && e.disposeData(c.dataId), s) { + let C = I.expandShapeToKeepDim(b.shape, m); + b.shape = C; + } + return b; +} +var XD = { kernelName: na, backendName: "wasm", setupFunc: R9, kernelFunc: A9 }; +var YD; +function F9(r) { + YD = r.wasm.cwrap(un, null, ["number", "number", "number", "number", "number"]); +} +function D9(r) { + let { backend: e, inputs: t10, attrs: o } = r, { axis: n } = o, { x: s } = t10, a = e.dataIdMap.get(s.dataId).id, i = a, p = s, { transposed: u, axes: c, inputWasTransposed: l } = kr(s, n, e); + if (l) { + let y = e.dataIdMap.get(u.dataId).id; + y !== a && (p = u, i = y); + } + let m = p.shape.slice(0, -1), f = e.makeOutput(m, "int32"), d = e.dataIdMap.get(f.dataId).id, h = x.sizeFromShape(f.shape), g = p.shape[c[0]]; + return YD(i, Ae[p.dtype], h, g, d), l && e.disposeData(u.dataId), f; +} +var QD = { kernelName: un, backendName: "wasm", kernelFunc: D9, setupFunc: F9 }; +var ZD; +function P9(r) { + ZD = r.wasm.cwrap(pn, null, ["number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number"]); +} +function O9(r) { + let { inputs: e, attrs: t10, backend: o } = r, n = e.x, s = o.dataIdMap.get(n.dataId).id, { filterSize: a, strides: i, pad: p, dimRoundingMode: u } = t10, c = I.computePool2DInfo(n.shape, a, i, 1, p, u), l = c.filterHeight, m = c.filterWidth, f = c.padInfo.top, d = c.padInfo.right, h = c.padInfo.bottom, g = c.padInfo.left, y = c.strideHeight, b = c.strideWidth, C = c.inChannels; + if (c.dataFormat !== "channelsLast") + throw new Error(`wasm backend does not support dataFormat:'${c.dataFormat}'. Please use 'channelsLast'.`); + if (c.dilationWidth !== 1 || c.dilationHeight !== 1) + throw new Error(`was backend only supports average pooling with dilation = [1, 1], got [${c.dilationHeight}, ${c.dilationWidth}].`); + let w = o.makeOutput(c.outShape, "float32"), k = o.dataIdMap.get(w.dataId).id; + return ZD(s, n.shape[0], n.shape[1], n.shape[2], l, m, f, d, h, g, y, b, C, k), w; +} +var JD = { kernelName: pn, backendName: "wasm", setupFunc: P9, kernelFunc: O9 }; +function Mt(r) { + let { inputs: e, attrs: t10 } = r, { x: o } = e, { shape: n } = t10, s = x.sizeFromShape(o.shape), a = x.inferFromImplicitShape(n, s); + return x.assert(s === x.sizeFromShape(a), () => `new shape: ${a}, old shape: ${o.shape}. New shape and old shape must have the same number of elements.`), r.backend.incRef(o.dataId), { dataId: o.dataId, shape: a, dtype: o.dtype }; +} +var eP = { kernelName: Ss, backendName: "wasm", kernelFunc: Mt }; +var tP; +function M9(r) { + tP = r.wasm.cwrap(cn, null, ["number", "array", "number", "number", "array", "number", "number", "number", "number"]); +} +function L9(r) { + let { inputs: e, backend: t10, attrs: o } = r, { a: n, b: s } = e, { transposeA: a, transposeB: i } = o; + if (n.dtype !== "float32" || s.dtype !== "float32") + throw new Error("BatchMatMul for non non-float32 tensors not yet supported."); + let p = n.shape.length, u = s.shape.length, c = a ? n.shape[p - 2] : n.shape[p - 1], l = i ? s.shape[u - 1] : s.shape[u - 2], m = a ? n.shape[p - 1] : n.shape[p - 2], f = i ? s.shape[u - 2] : s.shape[u - 1], d = n.shape.slice(0, -2), h = s.shape.slice(0, -2), g = x.sizeFromShape(d), y = x.sizeFromShape(h), C = br.assertAndGetBroadcastShape(n.shape.slice(0, -2), s.shape.slice(0, -2)).concat([m, f]); + x.assert(c === l, () => `Error in matMul: inner shapes (${c}) and (${l}) of Tensors with shapes ${n.shape} and ${s.shape} and transposeA=${a} and transposeB=${i} must match.`); + let w = a ? [g, c, m] : [g, m, c], k = i ? [y, f, l] : [y, l, f], _ = Mt({ inputs: { x: n }, backend: t10, attrs: { shape: w } }), E = Mt({ inputs: { x: s }, backend: t10, attrs: { shape: k } }), R = t10.dataIdMap.get(_.dataId).id, A = t10.dataIdMap.get(E.dataId).id, D = a ? _.shape[2] : _.shape[1], O = i ? E.shape[1] : E.shape[2], M = Math.max(g, y), L = t10.makeOutput([M, D, O], _.dtype), W = t10.dataIdMap.get(L.dataId).id, V = new Uint8Array(new Int32Array(_.shape).buffer), G = new Uint8Array(new Int32Array(E.shape).buffer); + return tP(R, V, _.shape.length, A, G, E.shape.length, a, i, W), t10.disposeData(_.dataId), t10.disposeData(E.dataId), L.shape = C, L; +} +var rP = { kernelName: cn, backendName: "wasm", setupFunc: M9, kernelFunc: L9 }; +function Xo(r) { + let { inputs: { x: e }, attrs: { begin: t10, size: o }, backend: n } = r, [s, a] = et.parseSliceParams(e, t10, o), i = et.isSliceContinous(e.shape, s, a), p = n.readSync(e.dataId), u = n.makeOutput(a, e.dtype), c = x.computeStrides(e.shape), l = n.dataIdMap.get(u.dataId); + if (i) { + let d = et.computeFlatOffset(s, c); + return e.dtype === "string" ? l.stringBytes = p.slice(d, d + x.sizeFromShape(a)) : n.typedArrayFromHeap(u).set(p.subarray(d, d + x.sizeFromShape(a))), u; + } + if (e.dtype === "string") { + let d = vu(p, s, a, e.shape, e.dtype); + return l.stringBytes = d, u; + } + let m = n.typedArrayFromHeap(u), f = e.shape.length; + if (f === 2) + B9(p, c[0], m, s, a); + else if (f === 3) + V9(p, c[0], c[1], m, s, a); + else if (f === 4) + z9(p, c[0], c[1], c[2], m, s, a); + else { + let d = vu(p, s, a, e.shape, e.dtype); + m.set(d); + } + return u; +} +function B9(r, e, t10, o, n) { + let s = 0, a = o[0], i = o[1], p = a + n[0]; + for (let u = a; u < p; u++) { + let c = u * e + i; + t10.set(r.subarray(c, c + n[1]), s), s += n[1]; + } +} +function V9(r, e, t10, o, n, s) { + let a = 0, i = n[0], p = n[1], u = n[2], c = i + s[0], l = p + s[1]; + for (let m = i; m < c; m++) + for (let f = p; f < l; f++) { + let d = m * e + f * t10 + u; + o.set(r.subarray(d, d + s[2]), a), a += s[2]; + } +} +function z9(r, e, t10, o, n, s, a) { + let i = 0, p = s[0], u = s[1], c = s[2], l = p + a[0], m = u + a[1], f = c + a[2], d = s[3]; + for (let h = p; h < l; h++) + for (let g = u; g < m; g++) + for (let y = c; y < f; y++) { + let b = h * e + g * t10 + y * o + d; + n.set(r.subarray(b, b + a[3]), i), i += a[3]; + } +} +var oP = { kernelName: qn, backendName: "wasm", kernelFunc: Xo }; +function W9(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { blockShape: s, crops: a } = o, i = s.reduce((y, b) => y * b), p = I.getReshaped(n.shape, s, i), u = I.getPermuted(p.length, s.length), c = I.getReshapedPermuted(n.shape, s, i), l = I.getSliceBeginCoords(a, s.length), m = I.getSliceSize(c, a, s.length), f = Mt({ inputs: { x: n }, backend: t10, attrs: { shape: p } }), d = Eo({ inputs: { x: f }, backend: t10, attrs: { perm: u } }), h = Mt({ inputs: { x: d }, backend: t10, attrs: { shape: c } }), g = Xo({ inputs: { x: h }, backend: t10, attrs: { begin: l, size: m } }); + return t10.disposeData(f.dataId), t10.disposeData(d.dataId), t10.disposeData(f.dataId), g; +} +var nP = { kernelName: hs, backendName: "wasm", kernelFunc: W9 }; +function cs(r) { + let { inputs: { x: e }, attrs: { dtype: t10 }, backend: o } = r, n = o.makeOutput(e.shape, t10), s = o.typedArrayFromHeap(e); + return o.typedArrayFromHeap(n).set(s), n; +} +var sP = { kernelName: to, backendName: "wasm", kernelFunc: cs }; +var aP = Qe(ro); +var iP; +function U9(r) { + iP = r.wasm.cwrap(Ro, null, ["number", "number", "number", "number"]); +} +function G9(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { clipValueMin: s, clipValueMax: a } = o, i = t10.dataIdMap.get(n.dataId).id, p = t10.makeOutput(n.shape, n.dtype), u = t10.dataIdMap.get(p.dataId).id; + return iP(i, s, a, u), p; +} +var uP = { kernelName: Ro, backendName: "wasm", setupFunc: U9, kernelFunc: G9 }; +function qw(r) { + let { inputs: e, backend: t10 } = r, o = x.parseAxisParam(r.attrs.axis, e[0].shape)[0], n = e.map((f) => f.shape); + I.assertParamsConsistent(n, o); + let s = I.computeOutShape(e.map((f) => f.shape), o), a = e.filter((f) => x.sizeFromShape(f.shape) > 0); + if (a.length === 1) + return zu({ inputs: { x: a[0] }, backend: t10 }); + let i = t10.makeOutput(s, e[0].dtype); + if (x.sizeFromShape(s) === 0) + return i; + if (a[0].dtype === "string") { + let f = a.map((C) => { + let k = [-1, x.sizeFromShape(C.shape.slice(o))]; + return Mt({ inputs: { x: C }, backend: t10, attrs: { shape: k } }); + }), d = f.map((C) => ({ vals: t10.readSync(C.dataId), shape: C.shape })); + s = I.computeOutShape(f.map((C) => C.shape), 1); + let h = f[0].shape[0] === 1, g = Iu(d, s, e[0].dtype, h), y = I.computeOutShape(a.map((C) => C.shape), o); + i.shape = y; + let b = t10.dataIdMap.get(i.dataId); + return b.stringBytes = I.fromStringArrayToUint8(g), f.forEach((C) => t10.disposeData(C.dataId)), i; + } + let p = x.sizeFromShape(a[0].shape.slice(0, o)), u = 0, c = a.map((f) => { + let d = x.sizeFromShape(f.shape.slice(o)); + return u += d, d; + }), l = a.map((f) => t10.typedArrayFromHeap(f)), m = t10.typedArrayFromHeap(i); + for (let f = 0; f < p; f++) { + let d = f * u; + for (let h = 0; h < l.length; h++) { + let g = c[h], y = f * g, b = l[h].subarray(y, y + g); + m.set(b, d), d += g; + } + } + return i; +} +var pP = { kernelName: gs, backendName: "wasm", kernelFunc: qw }; +var cP; +function H9(r) { + cP = r.wasm.cwrap(ln, null, ["number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number"]); +} +function q9(r) { + let { inputs: e, attrs: t10, backend: o } = r, { x: n, filter: s } = e, a = o.dataIdMap.get(n.dataId).id, i = o.dataIdMap.get(s.dataId).id, { strides: p, dilations: u, pad: c, dimRoundingMode: l, dataFormat: m } = t10, f = I.convertConv2DDataFormat(m), d = I.computeConv2DInfo(n.shape, s.shape, p, u, c, l, false, f), h = d.filterHeight, g = d.filterWidth, y = d.padInfo.top, b = d.padInfo.right, C = d.padInfo.bottom, w = d.padInfo.left, k = d.dilationHeight, _ = d.dilationWidth, E = d.strideHeight, R = d.strideWidth, A = d.inChannels, D = d.outChannels, O = d.padInfo.type === "SAME" ? 1 : 0; + if (d.dataFormat !== "channelsLast") + throw new Error(`wasm backend Conv2D does not support dataFormat:'${d.dataFormat}'. Please use 'channelsLast'.`); + let M = o.makeOutput(d.outShape, "float32"), L = o.dataIdMap.get(M.dataId).id; + return cP(a, n.shape[0], n.shape[1], n.shape[2], i, h, g, y, b, C, w, O, k, _, E, R, A, D, L), M; +} +var lP = { kernelName: ln, backendName: "wasm", setupFunc: H9, kernelFunc: q9 }; +var mP; +function K9(r) { + mP = r.wasm.cwrap(mn, null, ["number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number"]); +} +function j9(r) { + let { backend: e, inputs: t10, attrs: o } = r, { dy: n, filter: s } = t10, { strides: a, pad: i, dataFormat: p, dimRoundingMode: u, inputShape: c } = o, l = 1, m = I.convertConv2DDataFormat(p), f = I.computeConv2DInfo(c, s.shape, a, l, i, u, false, m), { batchSize: d, filterHeight: h, filterWidth: g, inChannels: y, inHeight: b, inWidth: C, outChannels: w, outHeight: k, outWidth: _, strideHeight: E, strideWidth: R } = f, A = h - 1 - f.padInfo.top, D = g - 1 - f.padInfo.left, O = f.dataFormat === "channelsLast", M = x.computeStrides(f.inShape), L = x.computeStrides(n.shape), [W, V, G] = x.computeStrides(s.shape), q = M[0], H = O ? M[1] : M[2], j = O ? M[2] : 1, Y = O ? 1 : M[1], Z = L[0], ee = O ? L[1] : L[2], X = O ? L[2] : 1, Q = O ? 1 : L[1], se = e.makeOutput(f.inShape, "float32"), ie = e.dataIdMap.get(se.dataId).id, de = e.dataIdMap.get(n.dataId).id, Ie = e.dataIdMap.get(s.dataId).id; + return mP(de, Ie, d, h, g, b, C, y, k, _, w, E, R, A, D, W, V, G, q, H, j, Y, Z, ee, X, Q, ie), se; +} +var fP = { kernelName: mn, backendName: "wasm", setupFunc: K9, kernelFunc: j9 }; +var dP = Qe(fn); +var hP = Qe(dn); +var Kw; +(function(r) { + r[r.bilinear = 0] = "bilinear", r[r.nearest = 1] = "nearest"; +})(Kw || (Kw = {})); +var gP; +function X9(r) { + gP = r.wasm.cwrap(xn, null, ["number", "number", "number", "number", "array", "number", "number", "number", "number", "number"]); +} +function Y9(r) { + let { backend: e, inputs: t10, attrs: o } = r, { method: n, extrapolationValue: s, cropSize: a } = o, { image: i, boxes: p, boxInd: u } = t10, c = p.shape[0], [l, m] = a, f = [c, l, m, i.shape[3]], d = e.dataIdMap.get(i.dataId), h; + i.dtype !== "float32" && (h = cs({ backend: e, inputs: { x: i }, attrs: { dtype: "float32" } }), d = e.dataIdMap.get(h.dataId)); + let g = d.id, y = e.dataIdMap.get(p.dataId).id, b = e.dataIdMap.get(u.dataId).id, C = e.makeOutput(f, "float32"), w = e.dataIdMap.get(C.dataId).id, k = new Uint8Array(new Int32Array(i.shape).buffer); + return gP(g, y, b, c, k, l, m, Kw[n], s, w), h != null && e.disposeData(h.dataId), C; +} +var xP = { kernelName: xn, backendName: "wasm", setupFunc: X9, kernelFunc: Y9 }; +var yP; +function Q9(r) { + yP = r.wasm.cwrap(hn, null, ["number", "number", "number", "number", "number", "number"]); +} +function Z9(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { axis: s, exclusive: a, reverse: i } = o, p = n.shape.length; + x.assert(n.dtype === "float32" || n.dtype === "int32", () => `cumprod does not support ${n.dtype} tensors in the WASM backend`); + let u = I.getAxesPermutation([s], p), c = n; + u !== null && (c = Eo({ inputs: { x: n }, attrs: { perm: u }, backend: t10 })); + let l = I.getInnerMostAxes(1, p)[0]; + I.assertAxesAreInnerMostDims("cumprod", [l], p); + let m = t10.makeOutput(c.shape, c.dtype), f = c.shape[l], d = t10.dataIdMap.get(c.dataId).id, h = t10.dataIdMap.get(m.dataId).id; + yP(d, a ? 1 : 0, i ? 1 : 0, f, h, Ae[n.dtype]); + let g = m; + if (u !== null) { + let y = I.getUndoAxesPermutation(u); + g = Eo({ inputs: { x: m }, attrs: { perm: y }, backend: t10 }), t10.disposeData(c.dataId), t10.disposeData(m.dataId); + } + return g; +} +var bP = { kernelName: hn, backendName: "wasm", setupFunc: Q9, kernelFunc: Z9 }; +var CP; +function J9(r) { + CP = r.wasm.cwrap(gn, null, ["number", "number", "number", "number", "number", "number"]); +} +function eJ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { axis: s, exclusive: a, reverse: i } = o, p = n.shape.length; + x.assert(n.dtype === "float32" || n.dtype === "int32", () => `cumsum does not support ${n.dtype} tensors in the WASM backend`); + let u = I.getAxesPermutation([s], p), c = n; + u !== null && (c = Eo({ inputs: { x: n }, attrs: { perm: u }, backend: t10 })); + let l = I.getInnerMostAxes(1, p)[0]; + I.assertAxesAreInnerMostDims("cumsum", [l], p); + let m = t10.makeOutput(c.shape, c.dtype), f = c.shape[l], d = t10.dataIdMap.get(c.dataId).id, h = t10.dataIdMap.get(m.dataId).id; + CP(d, a ? 1 : 0, i ? 1 : 0, f, h, Ae[n.dtype]); + let g = m; + if (u !== null) { + let y = I.getUndoAxesPermutation(u); + g = Eo({ inputs: { x: m }, attrs: { perm: y }, backend: t10 }), t10.disposeData(c.dataId), t10.disposeData(m.dataId); + } + return g; +} +var IP = { kernelName: gn, backendName: "wasm", setupFunc: J9, kernelFunc: eJ }; +var wP; +function tJ(r) { + wP = r.wasm.cwrap(yn, null, ["number", "number", "number", "array", "number", "array", "array", "number", "number"]); +} +function rJ(r) { + let { backend: e, inputs: t10, attrs: o } = r, { x: n } = t10, { blockSize: s, dataFormat: a } = o, i = n.shape[0], p = a === "NHWC" ? n.shape[1] : n.shape[2], u = a === "NHWC" ? n.shape[2] : n.shape[3], c = a === "NHWC" ? n.shape[3] : n.shape[1], l = p * s, m = u * s, f = c / (s * s), d = a === "NHWC" ? [i, l, m, f] : [i, f, l, m], h = e.makeOutput(d, "float32"), y = e.dataIdMap.get(n.dataId).id, b = new Uint8Array(new Int32Array(x.computeStrides(n.shape)).buffer), C = new Uint8Array(new Int32Array(d).buffer), w = new Uint8Array(new Int32Array(x.computeStrides(d)).buffer), k = e.dataIdMap.get(h.dataId).id; + return wP(y, s, a === "NHWC" ? 1 : 0, b, n.shape.length - 1, C, w, d.length, k), h; +} +var SP = { kernelName: yn, backendName: "wasm", setupFunc: tJ, kernelFunc: rJ }; +var vP; +function oJ(r) { + vP = r.wasm.cwrap(bn, null, ["number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number"]); +} +function nJ(r) { + let { inputs: e, attrs: t10, backend: o } = r, { x: n, filter: s } = e, a = o.dataIdMap.get(n.dataId).id, i = o.dataIdMap.get(s.dataId).id, { strides: p, dilations: u, pad: c, dimRoundingMode: l } = t10, m = u == null ? [1, 1] : u, f = I.computeConv2DInfo(n.shape, s.shape, p, m, c, l, true), d = f.filterHeight, h = f.filterWidth, g = f.padInfo.top, y = f.padInfo.right, b = f.padInfo.bottom, C = f.padInfo.left, w = f.dilationHeight, k = f.dilationWidth, _ = f.strideHeight, E = f.strideWidth, R = f.inChannels, A = f.outChannels, D = f.padInfo.type === "SAME" ? 1 : 0; + if (f.dataFormat !== "channelsLast") + throw new Error(`wasm backend DepthwiseConv2dNative does not support dataFormat:'${f.dataFormat}'. Please use 'channelsLast'.`); + let O = o.makeOutput(f.outShape, "float32"), M = o.dataIdMap.get(O.dataId).id; + return vP(a, n.shape[0], n.shape[1], n.shape[2], i, d, h, g, y, b, C, D, w, k, _, E, R, A, M), O; +} +var kP = { kernelName: bn, backendName: "wasm", setupFunc: oJ, kernelFunc: nJ }; +var TP = Qe(In); +var sJ = false; +var NP = nt(oo, sJ, "bool"); +var _P = Qe(no, "float32"); +function Eg(r) { + let { inputs: e, attrs: t10, backend: o } = r, { input: n } = e, { dim: s } = t10, a = n.shape.length, i = n.shape.slice(), p = s; + return s < 0 && (x.assert(-(a + 1) <= s, () => `Axis must be in the interval [${-(a + 1)}, ${a}]`), p = a + s + 1), i.splice(p, 0, 1), Mt({ inputs: { x: n }, backend: o, attrs: { shape: i } }); +} +var EP = { kernelName: xs, backendName: "wasm", kernelFunc: Eg }; +function jw(r) { + let { attrs: { shape: e, value: t10, dtype: o }, backend: n } = r, s = n.makeOutput(e, o); + return n.typedArrayFromHeap(s).fill(t10), s; +} +var $P = { kernelName: ys, backendName: "wasm", kernelFunc: jw }; +var RP; +function aJ(r) { + RP = r.wasm.cwrap(Sn, null, ["number", "number", "number", "number", "number", "number"]); +} +function iJ(r) { + let { inputs: e, backend: t10 } = r, { image: o } = e, n = t10.makeOutput(o.shape, o.dtype), s = t10.dataIdMap.get(o.dataId).id, a = t10.dataIdMap.get(n.dataId).id, [i, p, u, c] = o.shape; + return RP(s, i, p, u, c, a), n; +} +var AP = { kernelName: Sn, backendName: "wasm", kernelFunc: iJ, setupFunc: aJ }; +var FP = Qe(so); +var uJ = false; +var DP = nt(vn, uJ); +var PP; +function pJ(r) { + PP = r.wasm.cwrap(kn, null, ["number", "number", "number", "number", "number", "number", "number"]); +} +function cJ(r) { + let { backend: e, inputs: t10, attrs: o } = r, { varianceEpsilon: n } = o, { x: s, mean: a, variance: i, offset: p, scale: u } = t10, c = e.dataIdMap.get(s.dataId).id, l = e.dataIdMap.get(a.dataId).id, m = e.dataIdMap.get(i.dataId).id, f = p != null ? e.dataIdMap.get(p.dataId).id : 0, d = u != null ? e.dataIdMap.get(u.dataId).id : 0, h = e.makeOutput(s.shape, s.dtype); + if (x.sizeFromShape(s.shape) === 0) + return h; + let g = e.dataIdMap.get(h.dataId).id; + return PP(c, l, m, f, d, n, g), h; +} +var OP = { kernelName: kn, backendName: "wasm", setupFunc: pJ, kernelFunc: cJ }; +var MP; +function lJ(r) { + MP = r.wasm.cwrap(Do, null, ["number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number"]); +} +function mJ(r) { + let { inputs: e, attrs: t10, backend: o } = r, { x: n, filter: s, bias: a, preluActivationWeights: i } = e, { strides: p, pad: u, dilations: c, dataFormat: l, dimRoundingMode: m, activation: f, leakyreluAlpha: d } = t10, h = I.computeConv2DInfo(n.shape, s.shape, p, c, u, m), g = $i[f]; + if (g == null) + throw new Error(`${f} activation not yet supported for FusedConv2D in the wasm backend.`); + let y = o.dataIdMap.get(n.dataId).id, b = o.dataIdMap.get(s.dataId).id, C = h.outChannels, w = 0; + if (a != null) { + let X = o.dataIdMap.get(a.dataId); + if (X.shape.length !== 1) + throw new Error(`FusedConv2D only supports rank-1 bias but got rank ${X.shape.length}.`); + if (X.shape[0] !== C) + throw new Error(`FusedConv2D bias shape (${X.shape}) does not match the number of output channels (${C})`); + w = X.id; + } + let k = h.filterHeight, _ = h.filterWidth, E = h.padInfo.top, R = h.padInfo.right, A = h.padInfo.bottom, D = h.padInfo.left, O = h.dilationHeight, M = h.dilationWidth, L = h.strideHeight, W = h.strideWidth, V = h.inChannels, G = h.padInfo.type === "SAME" ? 1 : 0, q = h.batchSize, H = h.inHeight, j = h.inWidth; + if (l !== "NHWC") + throw new Error(`wasm backend FusedConv2D does not support dataFormat:'${l}'. Please use 'NHWC'.`); + let Y = o.makeOutput(h.outShape, "float32"), Z = o.dataIdMap.get(Y.dataId).id, ee = i == null ? 0 : o.dataIdMap.get(i.dataId).id; + return MP(y, q, H, j, b, k, _, w, E, R, A, D, G, O, M, L, W, V, C, g, ee, d || 0, Z), Y; +} +var LP = { kernelName: Do, backendName: "wasm", setupFunc: lJ, kernelFunc: mJ }; +var BP; +function fJ(r) { + BP = r.wasm.cwrap(Po, null, ["number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number"]); +} +function dJ(r) { + let { inputs: e, attrs: t10, backend: o } = r, { x: n, filter: s, bias: a, preluActivationWeights: i } = e, { strides: p, pad: u, dilations: c, dataFormat: l, dimRoundingMode: m, activation: f, leakyreluAlpha: d } = t10, h = I.computeConv2DInfo(n.shape, s.shape, p, c, u, m, true), g = $i[f]; + if (g == null) + throw new Error(`${f} activation not yet supported for FusedDepthwiseConv2D in the wasm backend.`); + let y = o.dataIdMap.get(n.dataId).id, b = o.dataIdMap.get(s.dataId).id, C = h.outChannels, w = 0; + if (a != null) { + let X = o.dataIdMap.get(a.dataId); + if (X.shape.length !== 1) + throw new Error(`FusedDepthwiseConv2D only supports rank-1 bias but got rank ${X.shape.length}.`); + if (X.shape[0] !== C) + throw new Error(`FusedDepthwiseConv2D bias shape (${X.shape}) does not match the number of output channels (${C})`); + w = X.id; + } + let k = h.filterHeight, _ = h.filterWidth, E = h.padInfo.top, R = h.padInfo.right, A = h.padInfo.bottom, D = h.padInfo.left, O = h.dilationHeight, M = h.dilationWidth, L = h.strideHeight, W = h.strideWidth, V = h.inChannels, G = h.padInfo.type === "SAME" ? 1 : 0, q = h.batchSize, H = h.inHeight, j = h.inWidth; + if (l !== "NHWC") + throw new Error(`wasm backend FusedDepthwiseConv2D does not support dataFormat:'${l}'. Please use 'NHWC'.`); + let Y = o.makeOutput(h.outShape, "float32"), Z = o.dataIdMap.get(Y.dataId).id, ee = i == null ? 0 : o.dataIdMap.get(i.dataId).id; + return BP(y, q, H, j, b, k, _, w, E, R, A, D, G, O, M, L, W, V, C, g, ee, d || 0, Z), Y; +} +var VP = { kernelName: Po, backendName: "wasm", setupFunc: fJ, kernelFunc: dJ }; +var zP; +function hJ(r) { + zP = r.wasm.cwrap(Tn, null, ["number", "number", "number", "number", "number", "number", "array", "number"]); +} +function gJ(r) { + let { backend: e, inputs: t10 } = r, { params: o, indices: n } = t10, [s, a, i, p] = af.prepareAndValidate(o, n), u = e.makeOutput(s, o.dtype); + if (a === 0) + return u; + let c = n.shape, l = c[c.length - 1], f = e.dataIdMap.get(o.dataId).id, h = e.dataIdMap.get(n.dataId).id, g = new Uint8Array(new Int32Array(p).buffer), y = e.dataIdMap.get(u.dataId).id; + return zP(f, Ae[o.dtype], h, a, l, i, g, y), u; +} +var WP = { kernelName: Tn, backendName: "wasm", setupFunc: hJ, kernelFunc: gJ }; +var UP; +function xJ(r) { + UP = r.wasm.cwrap("Gather", null, ["number", "number", "array", "number", "number", "number", "array", "number"]); +} +function yJ(r) { + let { backend: e, inputs: t10, attrs: o } = r, { x: n, indices: s } = t10, { axis: a, batchDims: i } = o, p = x.parseAxisParam(a, n.shape)[0], u = e.readSync(s.dataId), c = n.shape[p]; + for (let A = 0; A < u.length; ++A) { + let D = u[A]; + x.assert(D <= c - 1 && D >= 0, () => `GatherV2: the index value ${D} is not in [0, ${c - 1}]`); + } + let l = I.segment_util.collectGatherOpShapeInfo(n, s, p, i), m = Mt({ inputs: { x: n }, attrs: { shape: [l.batchSize, l.outerSize, l.dimSize, l.sliceSize] }, backend: e }), f = x.sizeFromShape(s.shape), d = Mt({ inputs: { x: s }, attrs: { shape: [l.batchSize, f / l.batchSize] }, backend: e }), h = [l.batchSize, l.outerSize, f / l.batchSize, l.sliceSize], g = e.makeOutput(h, n.dtype); + if (x.sizeFromShape(n.shape) === 0) + return g; + let y = m.shape.length - 1, C = e.dataIdMap.get(m.dataId).id, k = e.dataIdMap.get(d.dataId).id, _ = e.dataIdMap.get(g.dataId).id, E = new Uint8Array(new Int32Array(x.computeStrides(m.shape)).buffer), R = new Uint8Array(new Int32Array(x.computeStrides(h)).buffer); + return UP(C, Ae[n.dtype], E, y, k, l.batchSize, R, _), e.disposeData(m.dataId), e.disposeData(d.dataId), g.shape = l.outputShape, g; +} +var GP = { kernelName: bs, backendName: "wasm", setupFunc: xJ, kernelFunc: yJ }; +var bJ = false; +var HP = nt(ao, bJ, "bool"); +var CJ = false; +var qP = nt(io, CJ, "bool"); +var KP; +function IJ(r) { + KP = r.wasm.cwrap(Nn, null, ["number", "number", "number", "number"]); +} +function wJ(r) { + let { inputs: { x: e }, attrs: { alpha: t10 }, backend: o } = r, n = o.dataIdMap.get(e.dataId).id, s = o.makeOutput(e.shape, "float32"); + if (x.sizeFromShape(e.shape) !== 0) { + let a = o.dataIdMap.get(s.dataId).id; + KP(n, Ae[e.dtype], t10, a); + } + return s; +} +var jP = { kernelName: Nn, backendName: "wasm", setupFunc: IJ, kernelFunc: wJ }; +var SJ = false; +var XP = nt(po, SJ, "bool"); +var vJ = false; +var YP = nt(co, vJ, "bool"); +var QP = Qe(lo); +var kJ = false; +var ZP = nt(_n, kJ, "bool"); +var JP = Qe(En); +var TJ = false; +var eO = nt(ua, TJ, "bool"); +var NJ = false; +var tO = nt(g0, NJ, "bool"); +var rO; +function _J(r) { + rO = r.wasm.cwrap($n, null, ["number", "number", "number", "number"]); +} +function EJ(r) { + let { backend: e, inputs: t10, attrs: o } = r, { reductionIndices: n, keepDims: s } = o, { x: a } = t10, p = e.dataIdMap.get(a.dataId).id, u = a, { transposed: c, axes: l, originalAxes: m, inputWasTransposed: f } = kr(a, n, e); + if (f) { + let C = e.dataIdMap.get(c.dataId).id; + u = c, p = C; + } + let d = u.shape.length; + I.assertAxesAreInnerMostDims("max", l, d); + let [h, g] = I.computeOutAndReduceShapes(u.shape, l), y = x.sizeFromShape(g), b = e.makeOutput(h, a.dtype); + if (x.sizeFromShape(u.shape) !== 0) { + let C = e.dataIdMap.get(b.dataId).id; + rO(p, Ae[a.dtype], y, C); + } + if (f && e.disposeData(c.dataId), s) { + let C = I.expandShapeToKeepDim(b.shape, m); + b.shape = C; + } + return b; +} +var oO = { kernelName: $n, backendName: "wasm", setupFunc: _J, kernelFunc: EJ }; +var $J = false; +var nO = nt(mo, $J); +var sO; +function RJ(r) { + sO = r.wasm.cwrap(Rn, null, ["number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number"]); +} +function AJ(r) { + let { inputs: e, attrs: t10, backend: o } = r, n = e.x, s = o.dataIdMap.get(n.dataId).id; + x.assert(n.dtype === "float32", () => `Error in MaxPool: only float32 input is supported. Got ${n.dtype}.`); + let { filterSize: a, strides: i, pad: p, dimRoundingMode: u } = t10, c = I.computePool2DInfo(n.shape, a, i, 1, p, u), l = c.filterHeight, m = c.filterWidth, f = c.padInfo.top, d = c.padInfo.right, h = c.padInfo.bottom, g = c.padInfo.left, y = c.dilationHeight, b = c.dilationWidth, C = c.strideHeight, w = c.strideWidth, k = c.inChannels, _ = c.outChannels; + if (c.dataFormat !== "channelsLast") + throw new Error(`wasm backend does not support dataFormat:'${c.dataFormat}'. Please use 'channelsLast'.`); + let E = o.makeOutput(c.outShape, "float32"), R = o.dataIdMap.get(E.dataId).id; + return sO(s, n.shape[0], n.shape[1], n.shape[2], l, m, f, d, h, g, y, b, C, w, k, _, R), E; +} +var aO = { kernelName: Rn, backendName: "wasm", setupFunc: RJ, kernelFunc: AJ }; +var iO; +function FJ(r) { + iO = r.wasm.cwrap(An, null, ["number, number, number"]); +} +function DJ(r) { + let { backend: e, inputs: t10, attrs: o } = r, { axis: n, keepDims: s } = o, { x: a } = t10, i = e.dataIdMap.get(a.dataId).id, p = i, u = a, { transposed: c, axes: l, originalAxes: m, inputWasTransposed: f } = kr(a, n, e), d = l; + if (f) { + let w = e.dataIdMap.get(c.dataId).id; + w !== i && (u = c, p = w, d = I.getInnerMostAxes(d.length, u.shape.length)); + } + I.assertAxesAreInnerMostDims("mean", d, u.shape.length); + let [h, g] = I.computeOutAndReduceShapes(u.shape, d), y = x.sizeFromShape(g), b = u; + u.dtype !== "float32" && (b = cs({ backend: e, inputs: { x: u }, attrs: { dtype: "float32" } }), p = e.dataIdMap.get(b.dataId).id); + let C = e.makeOutput(h, "float32"); + if (x.sizeFromShape(u.shape) !== 0) { + let w = e.dataIdMap.get(C.dataId).id; + iO(p, y, w); + } + if (f && e.disposeData(c.dataId), s) { + let w = I.expandShapeToKeepDim(C.shape, m); + C.shape = w; + } + return u.dtype !== "float32" && e.disposeData(b.dataId), C; +} +var uO = { kernelName: An, backendName: "wasm", setupFunc: FJ, kernelFunc: DJ }; +var pO; +function PJ(r) { + pO = r.wasm.cwrap(Fn, null, ["number", "number", "number", "number"]); +} +function OJ(r) { + let { backend: e, inputs: t10, attrs: o } = r, { axis: n, keepDims: s } = o, { x: a } = t10, i = e.dataIdMap.get(a.dataId).id, p = i, u = a, { transposed: c, axes: l, originalAxes: m, inputWasTransposed: f } = kr(a, n, e); + if (f) { + let C = e.dataIdMap.get(c.dataId).id; + C !== i && (u = c, p = C); + } + let d = u.shape.length; + I.assertAxesAreInnerMostDims("min", l, d); + let [h, g] = I.computeOutAndReduceShapes(u.shape, l), y = x.sizeFromShape(g), b = e.makeOutput(h, u.dtype); + if (x.sizeFromShape(u.shape) !== 0) { + let C = e.dataIdMap.get(b.dataId).id; + pO(p, Ae[a.dtype], y, C); + } + if (f && e.disposeData(c.dataId), s) { + let C = I.expandShapeToKeepDim(b.shape, m); + b.shape = C; + } + return b; +} +var cO = { kernelName: Fn, backendName: "wasm", setupFunc: PJ, kernelFunc: OJ }; +var MJ = false; +var lO = nt(fo, MJ); +var Xw; +(function(r) { + r[r.reflect = 0] = "reflect", r[r.symmetric = 1] = "symmetric"; +})(Xw || (Xw = {})); +var mO; +function LJ(r) { + mO = r.wasm.cwrap(Dn, null, ["number", "array", "number", "number", "array", "array", "number", "number"]); +} +function BJ(r) { + let { inputs: { x: e }, backend: t10, attrs: { paddings: o, mode: n } } = r, s = o.map((d, h) => d[0] + e.shape[h] + d[1]), a = t10.dataIdMap.get(e.dataId).id, i = t10.makeOutput(s, e.dtype), p = t10.dataIdMap.get(i.dataId).id, u = new Uint8Array(new Int32Array(e.shape).buffer), c = o.map((d) => d[0]), l = o.map((d) => d[1]), m = new Uint8Array(new Int32Array(c).buffer), f = new Uint8Array(new Int32Array(l).buffer); + return mO(a, u, e.shape.length, Ae[e.dtype], m, f, Xw[n], p), i; +} +var fO = { kernelName: Dn, backendName: "wasm", kernelFunc: BJ, setupFunc: LJ }; +var VJ = true; +var dO = nt(ho, VJ); +var hO = Qe(Pn); +function kc(r, e) { + let t10 = new Int32Array(r.wasm.HEAPU8.buffer, e, 4), o = t10[0], n = t10[1], s = t10[2], a = t10[3]; + return r.wasm._free(e), { pSelectedIndices: o, selectedSize: n, pSelectedScores: s, pValidOutputs: a }; +} +var gO; +function zJ(r) { + gO = r.wasm.cwrap(On, "number", ["number", "number", "number", "number", "number"]); +} +function WJ(r) { + let { backend: e, inputs: t10, attrs: o } = r, { iouThreshold: n, maxOutputSize: s, scoreThreshold: a } = o, { boxes: i, scores: p } = t10, u = e.dataIdMap.get(i.dataId).id, c = e.dataIdMap.get(p.dataId).id, l = gO(u, c, s, n, a), { pSelectedIndices: m, selectedSize: f, pSelectedScores: d, pValidOutputs: h } = kc(e, l); + return e.wasm._free(d), e.wasm._free(h), e.makeOutput([f], "int32", m); +} +var xO = { kernelName: On, backendName: "wasm", setupFunc: zJ, kernelFunc: WJ }; +var yO; +function UJ(r) { + yO = r.wasm.cwrap(pa, "number", ["number", "number", "number", "number", "number", "bool"]); +} +function GJ(r) { + let { backend: e, inputs: t10, attrs: o } = r, { iouThreshold: n, maxOutputSize: s, scoreThreshold: a, padToMaxOutputSize: i } = o, { boxes: p, scores: u } = t10, c = e.dataIdMap.get(p.dataId).id, l = e.dataIdMap.get(u.dataId).id, m = yO(c, l, s, n, a, i), { pSelectedIndices: f, selectedSize: d, pSelectedScores: h, pValidOutputs: g } = kc(e, m); + e.wasm._free(h); + let y = e.makeOutput([d], "int32", f), b = e.makeOutput([], "int32", g); + return [y, b]; +} +var bO = { kernelName: pa, backendName: "wasm", setupFunc: UJ, kernelFunc: GJ }; +var CO; +function HJ(r) { + CO = r.wasm.cwrap(Mn, "number", ["number", "number", "number", "number", "number", "number"]); +} +function qJ(r) { + let { backend: e, inputs: t10, attrs: o } = r, { iouThreshold: n, maxOutputSize: s, scoreThreshold: a, softNmsSigma: i } = o, { boxes: p, scores: u } = t10, c = e.dataIdMap.get(p.dataId).id, l = e.dataIdMap.get(u.dataId).id, m = CO(c, l, s, n, a, i), { pSelectedIndices: f, selectedSize: d, pSelectedScores: h, pValidOutputs: g } = kc(e, m); + e.wasm._free(g); + let y = e.makeOutput([d], "int32", f), b = e.makeOutput([d], "float32", h); + return [y, b]; +} +var IO = { kernelName: Mn, backendName: "wasm", setupFunc: HJ, kernelFunc: qJ }; +var KJ = false; +var wO = nt(go, KJ, "bool"); +var SO; +function jJ(r) { + SO = r.wasm.cwrap(ca, null, ["number", "number", "number", "number", "number"]); +} +function XJ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { indices: n } = e, { dtype: s, depth: a, onValue: i, offValue: p } = o, u = t10.makeOutput([...n.shape, a], s), c = t10.dataIdMap.get(u.dataId).id, m = t10.dataIdMap.get(n.dataId).id; + return SO(m, a, i, p, c), u; +} +var vO = { kernelName: ca, backendName: "wasm", setupFunc: jJ, kernelFunc: XJ }; +function YJ(r) { + let { inputs: { x: e }, backend: t10 } = r, o = t10.makeOutput(e.shape, e.dtype); + return t10.typedArrayFromHeap(o).fill(1), o; +} +var kO = { kernelName: Cs, backendName: "wasm", kernelFunc: YJ }; +function QJ(r) { + let { inputs: e, backend: t10, attrs: o } = r, { axis: n } = o; + if (e.length === 1) + return Eg({ inputs: { input: e[0] }, backend: t10, attrs: { dim: n } }); + let s = e[0].shape, a = e[0].dtype; + e.forEach((c) => { + x.assertShapesMatch(s, c.shape, "All tensors passed to stack must have matching shapes"), x.assert(a === c.dtype, () => "All tensors passed to stack must have matching dtypes"); + }); + let i = [], p = e.map((c) => { + let l = Eg({ inputs: { input: c }, backend: t10, attrs: { dim: n } }); + return i.push(l), l; + }), u = qw({ inputs: p, backend: t10, attrs: { axis: n } }); + return i.forEach((c) => t10.disposeData(c.dataId)), u; +} +var TO = { kernelName: Is, backendName: "wasm", kernelFunc: QJ }; +var NO; +function ZJ(r) { + NO = r.wasm.cwrap(Ln, null, ["number", "array", "number", "number", "array", "array", "number", "number"]); +} +function JJ(r) { + let { inputs: { x: e }, backend: t10, attrs: { paddings: o, constantValue: n } } = r, s = o.map((h, g) => h[0] + e.shape[g] + h[1]); + if (x.sizeFromShape(e.shape) === 0) + return jw({ backend: t10, attrs: { shape: s, value: n, dtype: e.dtype } }); + let a = t10.dataIdMap.get(e.dataId).id, i = t10.makeOutput(s, e.dtype), u = t10.dataIdMap.get(i.dataId).id, c = new Uint8Array(new Int32Array(e.shape).buffer), l = o.map((h) => h[0]), m = o.map((h) => h[1]), f = new Uint8Array(new Int32Array(l).buffer), d = new Uint8Array(new Int32Array(m).buffer); + return NO(a, c, e.shape.length, Ae[e.dtype], f, d, n, u), i; +} +var $g = { kernelName: Ln, backendName: "wasm", kernelFunc: JJ, setupFunc: ZJ }; +var eee = false; +var _O = nt(Bn, eee); +var EO; +function tee(r) { + EO = r.wasm.cwrap(Vn, null, ["number", "number", "number"]); +} +function ree(r) { + let { inputs: e, backend: t10 } = r, { x: o, alpha: n } = e, s = t10.dataIdMap.get(o.dataId).id, a = t10.dataIdMap.get(n.dataId).id, i = s, p = o, u = p; + p.dtype !== "float32" && (u = cs({ backend: t10, inputs: { x: o }, attrs: { dtype: "float32" } }), i = t10.dataIdMap.get(u.dataId).id); + let c = t10.makeOutput(o.shape, "float32"), l = t10.dataIdMap.get(c.dataId).id; + return EO(i, a, l), p.dtype !== "float32" && t10.disposeData(u.dataId), c; +} +var $O = { kernelName: Vn, backendName: "wasm", setupFunc: tee, kernelFunc: ree }; +var RO; +function oee(r) { + RO = r.wasm.cwrap(Ao, null, ["number", "number", "number", "number"]); +} +function nee(r) { + let { backend: e, inputs: t10, attrs: o } = r, { axis: n, keepDims: s } = o, { x: a } = t10, i = e.dataIdMap.get(a.dataId).id, p = i, u = a, { transposed: c, axes: l, originalAxes: m, inputWasTransposed: f } = kr(a, n, e), d = l; + if (f) { + let C = e.dataIdMap.get(c.dataId).id; + C !== i && (u = c, p = C, d = I.getInnerMostAxes(d.length, u.shape.length)); + } + I.assertAxesAreInnerMostDims("prod", d, u.shape.length); + let [h, g] = I.computeOutAndReduceShapes(u.shape, d), y = x.sizeFromShape(g), b = e.makeOutput(h, u.dtype); + if (x.sizeFromShape(u.shape) !== 0) { + let C = e.dataIdMap.get(b.dataId).id; + RO(p, y, Ae[b.dtype], C); + } + if (f && e.disposeData(c.dataId), s) { + let C = I.expandShapeToKeepDim(b.shape, m); + b.shape = C; + } + return b; +} +var AO = { kernelName: Ao, backendName: "wasm", setupFunc: oee, kernelFunc: nee }; +var see = (r) => { + let { backend: e, attrs: t10 } = r, { start: o, stop: n, step: s, dtype: a } = t10, i = Su(o, n, s, a), p = e.makeOutput([i.length], a); + return e.typedArrayFromHeap(p).set(i), p; +}; +var FO = { kernelName: ws, backendName: "wasm", kernelFunc: see }; +var aee = true; +var DO = nt(Cn, aee); +var PO = Qe(zn); +var OO = Qe(Gn); +var MO; +function iee(r) { + MO = r.wasm.cwrap(Un, null, ["number", "number", "number", "number", "number", "number", "number", "number", "number", "number"]); +} +function uee(r) { + let { backend: e, inputs: t10, attrs: o } = r, { images: n } = t10, { alignCorners: s, halfPixelCenters: a, size: i } = o, [p, u] = i, [c, l, m, f] = n.shape, d = [c, p, u, f], h = e.dataIdMap.get(n.dataId), g; + h.dtype !== "float32" && (g = cs({ backend: e, inputs: { x: n }, attrs: { dtype: "float32" } }), h = e.dataIdMap.get(g.dataId)); + let y = h.id, b = e.makeOutput(d, "float32"); + if (x.sizeFromShape(n.shape) === 0) + return b; + let C = e.dataIdMap.get(b.dataId).id; + return MO(y, c, l, m, f, p, u, s ? 1 : 0, a ? 1 : 0, C), g != null && e.disposeData(g.dataId), b; +} +var LO = { kernelName: Un, backendName: "wasm", setupFunc: iee, kernelFunc: uee }; +var BO; +function pee(r) { + BO = r.wasm.cwrap(Wn, null, ["number", "number", "number", "number", "number", "number", "number", "number", "number", "number"]); +} +function cee(r) { + let { backend: e, inputs: t10, attrs: o } = r, { images: n } = t10, { alignCorners: s, halfPixelCenters: a, size: i } = o, [p, u] = i, [c, l, m, f] = n.shape, d = [c, p, u, f], h = e.makeOutput(d, "float32"); + if (x.sizeFromShape(n.shape) === 0) + return h; + let g = e.dataIdMap.get(n.dataId), y; + g.dtype !== "float32" && (y = cs({ backend: e, inputs: { x: n }, attrs: { dtype: "float32" } }), g = e.dataIdMap.get(y.dataId)); + let b = g.id, C = e.dataIdMap.get(h.dataId).id; + return BO(b, c, l, m, f, p, u, s ? 1 : 0, a ? 1 : 0, C), y != null && e.disposeData(y.dataId), h; +} +var VO = { kernelName: Wn, backendName: "wasm", setupFunc: pee, kernelFunc: cee }; +var zO; +function lee(r) { + zO = r.wasm.cwrap(fa, null, ["number", "array", "number", "array", "number", "number"]); +} +function mee(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { dims: s } = o, a = x.parseAxisParam(s, n.shape); + if (n.shape.length === 0) + return zu({ inputs: { x: n }, backend: t10 }); + let i = t10.makeOutput(n.shape, n.dtype), p = t10.dataIdMap.get(n.dataId).id, u = t10.dataIdMap.get(i.dataId).id, c = new Uint8Array(new Int32Array(a).buffer), l = new Uint8Array(new Int32Array(n.shape).buffer); + zO(p, c, a.length, l, n.shape.length, u); + let m = Mt({ inputs: { x: i }, attrs: { shape: n.shape }, backend: t10 }); + return t10.disposeData(i.dataId), m; +} +var WO = { kernelName: fa, backendName: "wasm", kernelFunc: mee, setupFunc: lee }; +var UO; +function fee(r) { + UO = r.wasm.cwrap(es, null, ["number", "number", "number", "number", "number", "number", "number", "number", "array", "number", "number"]); +} +function dee(r) { + let { inputs: e, backend: t10, attrs: o } = r, { image: n } = e, { radians: s, fillValue: a, center: i } = o, p = t10.makeOutput(n.shape, n.dtype), u = t10.dataIdMap.get(n.dataId).id, c = t10.dataIdMap.get(p.dataId).id, [l, m, f, d] = n.shape, [h, g] = I.getImageCenter(i, m, f), y = a === 0, b = 255, C = typeof a == "number" ? [a, a, a, y ? 0 : b] : [...a, b], w = new Uint8Array(new Int32Array(C).buffer); + return UO(u, l, m, f, d, s, h, g, w, C.length, c), p; +} +var GO = { kernelName: es, backendName: "wasm", kernelFunc: dee, setupFunc: fee }; +var HO = Qe(da); +var qO = Qe(xo); +var KO; +function hee(r) { + KO = r.wasm.cwrap(Hn, null, ["number", "number", "number", "number", "number", "number", "array", "number", "number"]); +} +function gee(r) { + let { backend: e, inputs: t10, attrs: o } = r, { indices: n, updates: s } = t10, { shape: a } = o, i = e.makeOutput(a, s.dtype); + if (x.sizeFromShape(a) === 0) + return i; + let { sliceRank: p, numUpdates: u, sliceSize: c, strides: l, outputSize: m } = cl.calculateShapes(s, n, a), d = e.dataIdMap.get(n.dataId).id, g = e.dataIdMap.get(s.dataId).id, y = new Uint8Array(new Int32Array(l).buffer), b = e.dataIdMap.get(i.dataId).id; + return KO(d, g, Ae[s.dtype], p, u, c, y, m, b), i; +} +var jO = { kernelName: Hn, backendName: "wasm", setupFunc: hee, kernelFunc: gee }; +var XO; +function xee(r) { + XO = r.wasm.cwrap("SelectV2", null, ["number", "number", "number", "number", "number"]); +} +function yee(r) { + let { inputs: e, backend: t10 } = r, { condition: o, t: n, e: s } = e, a = t10.dataIdMap.get(o.dataId).id, i = t10.dataIdMap.get(n.dataId).id, p = t10.dataIdMap.get(s.dataId).id, u = t10.makeOutput(n.shape, n.dtype), c = t10.dataIdMap.get(u.dataId).id, l = o.shape.length, m = n.shape.length, f = l === 0 || l > 1 || m === 1 ? 1 : x.sizeFromShape(n.shape.slice(1)); + return XO(a, i, p, f, c), u; +} +var YO = { kernelName: vs, backendName: "wasm", kernelFunc: yee, setupFunc: xee }; +var QO; +function bee(r) { + QO = r.wasm.cwrap(yo, null, ["number", "number"]); +} +function Cee(r) { + let { backend: e, inputs: { x: t10 } } = r, o = e.dataIdMap.get(t10.dataId).id, n = e.makeOutput(t10.shape, t10.dtype), s = e.dataIdMap.get(n.dataId).id; + return x.sizeFromShape(n.shape) === 0 || QO(o, s), n; +} +var ZO = { kernelName: "Sigmoid", backendName: "wasm", setupFunc: bee, kernelFunc: Cee }; +var JO = Qe(Kn); +var e3; +function Iee(r) { + e3 = r.wasm.cwrap(Xn, null, ["number", "number", "number", "number"]); +} +function wee(r) { + let { backend: e, inputs: { logits: t10 }, attrs: { dim: o } } = r, n = e.dataIdMap.get(t10.dataId).id, s = e.makeOutput(t10.shape, t10.dtype), a = e.dataIdMap.get(s.dataId).id, i = t10.shape[o], p = x.sizeFromShape(t10.shape) / i; + return x.sizeFromShape(s.shape) === 0 || e3(n, a, i, p), s; +} +var t3 = { kernelName: Xn, backendName: "wasm", setupFunc: Iee, kernelFunc: wee }; +function See(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { blockShape: s, paddings: a } = o, i = x.sizeFromShape(s), p = [[0, 0]]; + p.push(...a); + for (let _ = 1 + s.length; _ < n.shape.length; ++_) + p.push([0, 0]); + let u = $g.kernelFunc({ inputs: { x: n }, backend: t10, attrs: { paddings: p, constantValue: 0 } }), c = I.getReshaped(u.shape, s, i, false), l = I.getPermuted(c.length, s.length, false), m = I.getReshapedPermuted(u.shape, s, i, false), h = Mt({ inputs: { x: u }, backend: t10, attrs: { shape: c } }), b = Eo({ inputs: { x: h }, backend: t10, attrs: { perm: l } }), k = Mt({ inputs: { x: b }, backend: t10, attrs: { shape: m } }); + return t10.disposeData(u.dataId), t10.disposeData(h.dataId), t10.disposeData(b.dataId), k; +} +var r3 = { kernelName: ks, backendName: "wasm", kernelFunc: See }; +var o3; +function vee(r) { + o3 = r.wasm.cwrap("SparseFillEmptyRows", "number", ["number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number", "number"]); +} +function kee(r) { + let { backend: e, inputs: t10 } = r, { indices: o, values: n, denseShape: s, defaultValue: a } = t10, i = o.shape[0], p = o.shape[1], u = e.readSync(s.dataId)[0], c = [i + u, p], l = e.dataIdMap.get(o.dataId).id, m = e.dataIdMap.get(n.dataId).id, f = e.dataIdMap.get(a.dataId).id, d = e.makeOutput(c, o.dtype), h = e.dataIdMap.get(d.dataId).id, g = e.makeOutput(c.slice(0, 1), n.dtype), y = e.dataIdMap.get(g.dataId).id, b = e.makeOutput([u], "bool"), C = e.dataIdMap.get(b.dataId).id, w = e.makeOutput([i], o.dtype), k = e.dataIdMap.get(w.dataId).id, _ = e.makeOutput([4], "int32"), E = e.dataIdMap.get(_.dataId).id, R = o3(l, m, Ae[n.dtype], i, u, p, f, h, y, C, k, E), A = e.readSync(_.dataId), D; + switch (A[0]) { + case 1: { + D = I.getSparseFillEmptyRowsIndicesDenseShapeMismatch(A[1]); + break; + } + case 2: { + D = I.getSparseFillEmptyRowsNegativeIndexErrorMessage(A[1], A[2]); + break; + } + case 3: + D = I.getSparseFillEmptyRowsOutOfRangeIndexErrorMessage(A[1], A[2], A[3]); + break; + default: + D = ""; + } + if (e.disposeData(_.dataId), D) + throw e.disposeData(d.dataId), e.disposeData(g.dataId), e.disposeData(b.dataId), e.disposeData(w.dataId), new Error(D); + let O = d, M = g; + return R !== c[0] && (O = Xo({ inputs: { x: d }, attrs: { begin: 0, size: [R, p] }, backend: e }), M = Xo({ inputs: { x: g }, attrs: { begin: 0, size: R }, backend: e }), e.disposeData(d.dataId), e.disposeData(g.dataId)), [O, M, b, w]; +} +var n3 = { kernelName: Qa, backendName: "wasm", setupFunc: vee, kernelFunc: kee }; +var s3; +function Tee(r) { + s3 = r.wasm.cwrap(ga, null, ["number", "number", "number", "number", "number", "number", "number"]); +} +function Nee(r) { + let { backend: e, inputs: t10 } = r, { inputIndices: o, inputShape: n, newShape: s } = t10; + if (o.shape.length !== 2) + throw new Error(`Input indices should be a matrix but received shape + ${o.shape}`); + if (n.shape.length !== 1) + throw new Error(`Input shape should be a vector but received shape + ${n.shape}`); + if (s.shape.length !== 1) + throw new Error(`Target shape should be a vector but received shape ${s.shape}`); + let a = e.dataIdMap.get(o.dataId).id, i = e.dataIdMap.get(n.dataId).id, p = e.dataIdMap.get(s.dataId).id, u = o.shape[0], c = x.sizeFromShape(s.shape), l = e.makeOutput([u, c], o.dtype), m = e.dataIdMap.get(l.dataId).id, f = e.makeOutput([c], s.dtype), d = e.dataIdMap.get(f.dataId).id, h = e.makeOutput([3], "int32"), g = e.dataIdMap.get(h.dataId).id; + s3(a, i, p, u, m, d, g); + let y = e.readSync(h.dataId), b; + switch (y[0]) { + case 0: { + b = I.getSparseReshapeMultipleNegativeOneOutputDimErrorMessage(y[1], y[2]); + break; + } + case 1: { + b = I.getSparseReshapeNegativeOutputDimErrorMessage(y[1], y[2]); + break; + } + case 2: + b = I.getSparseReshapeEmptyTensorZeroOutputDimErrorMessage(); + break; + case 3: { + let C = Array.from(e.readSync(n.dataId)), w = Array.from(e.readSync(f.dataId)); + b = I.getSparseReshapeInputOutputMultipleErrorMessage(C, w); + break; + } + case 4: { + let C = Array.from(e.readSync(n.dataId)), w = Array.from(e.readSync(f.dataId)); + b = I.getSparseReshapeInputOutputMismatchErrorMessage(C, w); + break; + } + default: + b = ""; + } + if (e.disposeData(h.dataId), b) + throw e.disposeData(l.dataId), e.disposeData(f.dataId), new Error(b); + return [l, f]; +} +var a3 = { kernelName: ga, backendName: "wasm", setupFunc: Tee, kernelFunc: Nee }; +var i3; +function Rg(r) { + i3 = r.wasm.cwrap("SparseSegmentReduction", null, ["number", "number", "number", "number", "number", "number", "number", "number", "number"]); +} +function Ag(r, e) { + let { backend: t10, inputs: o } = r, { data: n, indices: s, segmentIds: a } = o, i = s.shape[0], p = t10.readSync(a.dataId, i - 1, i)[0], c = i > 0 ? p + 1 : 0; + if (c < 0) + throw new Error(I.getSparseSegmentReductionNegativeSegmentIdsErrorMessage()); + let l = n.shape.slice(); + l[0] = c; + let m = t10.dataIdMap.get(n.dataId).id, f = t10.dataIdMap.get(s.dataId).id, d = t10.dataIdMap.get(a.dataId).id, h = t10.makeOutput(l, n.dtype), g = t10.dataIdMap.get(h.dataId).id, y = t10.makeOutput([4], "int32"), b = t10.dataIdMap.get(y.dataId).id; + i3(m, Ae[n.dtype], n.shape[0], f, d, g, b, e, 0); + let C = t10.readSync(y.dataId), w; + switch (C[0]) { + case 0: { + w = I.getSparseSegmentReductionNegativeSegmentIdsErrorMessage(); + break; + } + case 1: { + w = I.getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage(); + break; + } + case 2: + w = I.getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage(C[1], C[2]); + break; + case 3: + w = I.getSparseSegmentReductionIndicesOutOfRangeErrorMessage(C[1], C[2], C[3]); + break; + default: + w = ""; + } + if (t10.disposeData(y.dataId), w) + throw t10.disposeData(h.dataId), new Error(w); + return h; +} +function _ee(r) { + return Ag(r, true); +} +var u3 = { kernelName: Za, backendName: "wasm", setupFunc: Rg, kernelFunc: _ee }; +function Eee(r) { + return Ag(r, false); +} +var p3 = { kernelName: Ja, backendName: "wasm", setupFunc: Rg, kernelFunc: Eee }; +function $ee(r) { + let { inputs: e, attrs: t10, backend: o } = r, { x: n } = e, { numOrSizeSplits: s, axis: a } = t10, i = x.parseAxisParam(a, n.shape)[0], p = I.prepareSplitSize(n, s, i), u = new Array(n.shape.length).fill(0), c = n.shape.slice(); + return p.map((l) => { + let m = [...c]; + m[i] = l; + let f = Xo({ inputs: { x: n }, attrs: { begin: u, size: m }, backend: o }); + return u[i] += l, f; + }); +} +var c3 = { kernelName: Ts, backendName: "wasm", kernelFunc: $ee }; +var l3 = Qe(bo); +var m3 = Qe(ti); +var Ree = true; +var f3 = nt(Co, Ree); +var d3; +function Aee(r) { + d3 = r.wasm.cwrap($s, null, ["number", "number", "number", "number"]); +} +function Fee(r) { + let { backend: e, inputs: t10, attrs: o } = r, { alpha: n } = o, { x: s } = t10, a = e.dataIdMap.get(s.dataId).id, i = e.makeOutput(s.shape, s.dtype), p = e.dataIdMap.get(i.dataId).id; + return d3(a, n, Ae[s.dtype], p), i; +} +var h3 = { kernelName: $s, backendName: "wasm", setupFunc: Aee, kernelFunc: Fee }; +var g3; +function Dee(r) { + g3 = r.wasm.cwrap(Yn, null, ["number", "array", "number", "array", "array", "array", "array", "array", "number", "number"]); +} +function Pee(r) { + let { backend: e, inputs: t10, attrs: o } = r, { x: n } = t10, { begin: s, end: a, strides: i, beginMask: p, endMask: u, ellipsisMask: c, newAxisMask: l, shrinkAxisMask: m } = o, { finalShapeSparse: f, finalShape: d, isIdentity: h, sliceDim0: g, isSimpleSlice: y, begin: b, end: C, strides: w } = et.sliceInfo(n.shape, s, a, i, p, u, c, l, m), k; + if (h) + k = Mt({ inputs: { x: n }, backend: e, attrs: { shape: d } }); + else if (g || y) { + x.assert(n.shape.length >= 1, () => `Input must have rank at least 1, got: ${n.shape.length}`); + let _ = et.computeOutShape(b, C, w), E = Xo({ inputs: { x: n }, backend: e, attrs: { begin: b, size: _ } }); + k = Mt({ inputs: { x: E }, backend: e, attrs: { shape: d } }), e.disposeData(E.dataId); + } else { + let _ = e.makeOutput(f, "float32"), E = e.dataIdMap.get(n.dataId).id, R = new Uint8Array(new Int32Array(x.computeStrides(n.shape)).buffer), A = new Uint8Array(new Int32Array(b).buffer), D = new Uint8Array(new Int32Array(C).buffer), O = new Uint8Array(new Int32Array(w).buffer), M = new Uint8Array(new Int32Array(f).buffer), L = new Uint8Array(new Int32Array(x.computeStrides(f)).buffer), W = e.dataIdMap.get(_.dataId).id; + g3(E, R, n.shape.length, A, D, O, M, L, f.length, W), k = Mt({ inputs: { x: _ }, backend: e, attrs: { shape: d } }), e.disposeData(_.dataId); + } + return k; +} +var x3 = { kernelName: Yn, backendName: "wasm", setupFunc: Dee, kernelFunc: Pee }; +function Oee(r) { + let { backend: e, inputs: t10, attrs: o } = r, { data: n, dataSplits: s } = t10, { separator: a, nGramWidths: i, leftPad: p, rightPad: u, padWidth: c, preserveShortSequences: l } = o, m = e.readSync(n.dataId), f = e.readSync(s.dataId), [d, h] = ku(m, f, a, i, p, u, c, l), g = e.makeOutput([d.length], "string"), y = e.dataIdMap.get(g.dataId); + y.stringBytes = d; + let b = e.makeOutput(s.shape, "int32"); + return e.typedArrayFromHeap(b).set(h), [g, b]; +} +var y3 = { kernelName: Ns, backendName: "wasm", kernelFunc: Oee }; +function Mee(r) { + let { backend: e, inputs: t10, attrs: o } = r, { input: n, delimiter: s } = t10, { skipEmpty: a } = o, i = e.readSync(n.dataId), p = e.readSync(s.dataId), [u, c, l] = Tu(i, p[0], a), m = c.length, f = e.makeOutput([m, 2], "int32"); + e.typedArrayFromHeap(f).set(u); + let h = e.makeOutput([m], "string"), g = e.dataIdMap.get(h.dataId); + g.stringBytes = c; + let y = e.makeOutput([2], "int32"); + return e.typedArrayFromHeap(y).set(l), [f, h, y]; +} +var b3 = { kernelName: ri, backendName: "wasm", kernelFunc: Mee }; +function Lee(r) { + let { backend: e, inputs: t10, attrs: o } = r, { input: n } = t10, { numBuckets: s } = o, a = e.readSync(n.dataId), i = Nu(a, s), p = e.makeOutput(n.shape, "int32"); + return e.typedArrayFromHeap(p).set(i), p; +} +var C3 = { kernelName: oi, backendName: "wasm", kernelFunc: Lee }; +var Bee = true; +var I3 = nt(Io, Bee); +var w3; +function Vee(r) { + w3 = r.wasm.cwrap(jn, null, ["number", "number", "number", "number"]); +} +function zee(r) { + let { backend: e, inputs: t10, attrs: o } = r, { axis: n, keepDims: s } = o, { x: a } = t10, i = e.dataIdMap.get(a.dataId).id, p = i, u = a, { transposed: c, axes: l, originalAxes: m, inputWasTransposed: f } = kr(a, n, e), d = l; + if (f) { + let C = e.dataIdMap.get(c.dataId).id; + C !== i && (u = c, p = C, d = I.getInnerMostAxes(d.length, u.shape.length)); + } + I.assertAxesAreInnerMostDims("sum", d, u.shape.length); + let [h, g] = I.computeOutAndReduceShapes(u.shape, d), y = x.sizeFromShape(g), b = e.makeOutput(h, u.dtype); + if (x.sizeFromShape(u.shape) !== 0) { + let C = e.dataIdMap.get(b.dataId).id; + w3(p, y, Ae[b.dtype], C); + } + if (f && e.disposeData(c.dataId), s) { + let C = I.expandShapeToKeepDim(b.shape, m); + b.shape = C; + } + return b; +} +var S3 = { kernelName: jn, backendName: "wasm", setupFunc: Vee, kernelFunc: zee }; +var v3 = Qe(xa); +var k3 = Qe(Qn); +var T3; +function Wee(r) { + T3 = r.wasm.cwrap(wo, null, ["number", "array", "number", "array", "number", "number"]); +} +function Uee(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, s = t10.dataIdMap.get(n.dataId).id, { reps: a } = o, i = new Array(n.shape.length); + for (let m = 0; m < i.length; m++) + i[m] = n.shape[m] * a[m]; + let p = new Uint8Array(new Int32Array(n.shape).buffer), u = new Uint8Array(new Int32Array(i).buffer), c = t10.makeOutput(i, n.dtype), l = t10.dataIdMap.get(c.dataId).id; + return T3(s, p, n.shape.length, u, i.length, Ae[c.dtype], l), c; +} +var N3 = { kernelName: wo, backendName: "wasm", setupFunc: Wee, kernelFunc: Uee }; +var _3; +function Gee(r) { + _3 = r.wasm.cwrap(Zn, null, ["number", "array", "number", "number", "number", "bool", "number", "number"]); +} +var Hee = ({ inputs: r, backend: e, attrs: t10 }) => { + let { x: o } = r, { k: n, sorted: s } = t10, a = e.dataIdMap.get(o.dataId).id, i = new Uint8Array(new Int32Array(o.shape).buffer), p = o.shape.slice(); + p[p.length - 1] = n; + let u = e.makeOutput(p, o.dtype), c = e.dataIdMap.get(u.dataId).id, l = e.makeOutput(p, "int32"), m = e.dataIdMap.get(l.dataId).id; + return _3(a, i, o.shape.length, Ae[o.dtype], n, s, c, m), [u, l]; +}; +var E3 = { kernelName: Zn, backendName: "wasm", setupFunc: Gee, kernelFunc: Hee }; +var $3; +function qee(r) { + $3 = r.wasm.cwrap(Jn, null, ["number", "number", "bool", "number", "number", "number", "number", "number", "number", "array", "number", "array", "number", "number", "number", "number", "number"]); +} +function Kee(r) { + let { backend: e, inputs: t10, attrs: o } = r, { image: n, transforms: s } = t10, { interpolation: a, fillMode: i, fillValue: p, outputShape: u } = o, [c, l, m, f] = n.shape, [d, h] = u != null ? u : [l, m], g = [c, d, h, f], y = new Uint8Array(new Int32Array(x.computeStrides(n.shape)).buffer), b = new Uint8Array(new Int32Array(x.computeStrides(g)).buffer), C = e.makeOutput(g, n.dtype), w = e.dataIdMap.get(C.dataId).id, _ = e.dataIdMap.get(n.dataId).id, R = e.dataIdMap.get(s.dataId).id, A = a === "nearest" ? 1 : 2, D; + switch (i) { + case "constant": + D = 1; + break; + case "reflect": + D = 2; + break; + case "wrap": + D = 3; + break; + case "nearest": + D = 4; + break; + default: + D = 1; + break; + } + return $3(_, R, s.shape[0] > 1, c, d, h, f, m, l, y, n.shape.length - 1, b, g.length - 1, A, D, p, w), C; +} +var R3 = { kernelName: Jn, backendName: "wasm", setupFunc: qee, kernelFunc: Kee }; +function jee(r) { + let { inputs: e, backend: t10, attrs: o } = r, { value: n } = e, { axis: s } = o; + s < 0 && (s += n.shape.length); + let a = n.shape[s], i = n.shape.length, p = new Array(i - 1), u = 0; + for (let f = 0; f < i; f++) + f !== s && (p[u++] = n.shape[f]); + let c = new Array(a), l = new Array(i).fill(0), m = n.shape.slice(); + m[s] = 1; + for (let f = 0; f < c.length; f++) + l[s] = f, c[f] = Xo({ inputs: { x: n }, attrs: { begin: l, size: m }, backend: t10 }); + return c.map(({ dataId: f, dtype: d }) => ({ dataId: f, dtype: d, shape: p })); +} +var A3 = { kernelName: _s, backendName: "wasm", kernelFunc: jee }; +function Xee(r) { + let { inputs: { x: e }, backend: t10 } = r, o = t10.makeOutput(e.shape, e.dtype); + return t10.typedArrayFromHeap(o).fill(0), o; +} +var F3 = { kernelName: Es, backendName: "wasm", kernelFunc: Xee }; +var Yee = [LD, BD, VD, WD, KD, XD, QD, JD, rP, nP, sP, aP, uP, pP, lP, fP, dP, hP, xP, bP, IP, SP, kP, TP, NP, _P, EP, $P, AP, FP, DP, OP, LP, VP, WP, GP, HP, qP, UD, jP, XP, YP, QP, ZP, JP, eO, tO, oO, nO, aO, uO, cO, lO, fO, dO, hO, xO, bO, IO, wO, vO, kO, TO, $g, _O, $O, AO, FO, DO, PO, OO, eP, LO, VO, WO, GO, HO, qO, jO, YO, ZO, JO, oP, t3, r3, n3, a3, u3, p3, c3, l3, m3, f3, h3, x3, y3, b3, C3, I3, S3, v3, k3, N3, E3, R3, HD, A3, F3]; +for (let r of Yee) + ya(r); +var Yw = P(); +Yw.registerFlag("WASM_HAS_SIMD_SUPPORT", async () => { + try { + return WebAssembly.validate(new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0, 1, 4, 1, 96, 0, 0, 3, 2, 1, 0, 10, 9, 1, 7, 0, 65, 0, 253, 15, 26, 11])); + } catch (r) { + return false; + } +}); +Yw.registerFlag("WASM_HAS_MULTITHREAD_SUPPORT", async () => { + if (Yw.get("IS_NODE")) + return false; + try { + return new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)), WebAssembly.validate(new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0, 1, 4, 1, 96, 0, 0, 3, 2, 1, 0, 5, 4, 1, 3, 1, 1, 10, 11, 1, 9, 0, 65, 0, 254, 16, 2, 0, 26, 11])); + } catch (r) { + return false; + } +}); +var oS = rp(M3()); +var U3 = rp(B3()); +var nS = rp(V3()); +var z3 = oS.default || oS; +var Qee = nS.default || nS; +var Gl = class extends Jr { + constructor(e) { + super(), this.wasm = e, this.dataIdNextNumber = 1, this.wasm.tfjs.initWithThreadsCount(H3), rS = this.wasm.tfjs.getThreadsCount(), this.dataIdMap = new rn(this, cr()); + } + write(e, t10, o) { + let n = { id: this.dataIdNextNumber++ }; + return this.move(n, e, t10, o, 1), n; + } + numDataIds() { + return this.dataIdMap.numDataIds(); + } + async time(e) { + let t10 = x.now(); + return e(), { kernelMs: x.now() - t10 }; + } + move(e, t10, o, n, s) { + let a = this.dataIdNextNumber++; + if (n === "string") { + let c = t10; + this.dataIdMap.set(e, { id: a, stringBytes: c, shape: o, dtype: n, memoryOffset: null, refCount: s }); + return; + } + let i = x.sizeFromShape(o), p = i * x.bytesPerElement(n), u = this.wasm._malloc(p); + this.dataIdMap.set(e, { id: a, memoryOffset: u, shape: o, dtype: n, refCount: s }), this.wasm.tfjs.registerTensor(a, i, u), t10 != null && this.wasm.HEAPU8.set(new Uint8Array(t10.buffer, t10.byteOffset, p), u); + } + async read(e) { + return this.readSync(e); + } + readSync(e, t10, o) { + let { memoryOffset: n, dtype: s, shape: a, stringBytes: i } = this.dataIdMap.get(e); + if (s === "string") + return (t10 == null || t10 === 0) && (o == null || o >= i.length) ? i : i.slice(t10, o); + t10 = t10 || 0, o = o || x.sizeFromShape(a); + let p = x.bytesPerElement(s), u = this.wasm.HEAPU8.slice(n + t10 * p, n + o * p); + return Jee(u.buffer, s); + } + disposeData(e, t10 = false) { + if (this.dataIdMap.has(e)) { + let o = this.dataIdMap.get(e); + if (o.refCount--, !t10 && o.refCount > 0) + return false; + this.wasm._free(o.memoryOffset), this.wasm.tfjs.disposeData(o.id), this.dataIdMap.delete(e); + } + return true; + } + refCount(e) { + return this.dataIdMap.has(e) ? this.dataIdMap.get(e).refCount : 0; + } + incRef(e) { + let t10 = this.dataIdMap.get(e); + t10 != null && t10.refCount++; + } + floatPrecision() { + return 32; + } + getMemoryOffset(e) { + return this.dataIdMap.get(e).memoryOffset; + } + dispose() { + this.wasm.tfjs.dispose(), "PThread" in this.wasm && this.wasm.PThread.terminateAllThreads(), this.wasm = null; + } + memory() { + return { unreliable: false }; + } + makeOutput(e, t10, o) { + let n; + if (o == null) + n = this.write(null, e, t10); + else { + let s = this.dataIdNextNumber++; + n = { id: s }, this.dataIdMap.set(n, { id: s, memoryOffset: o, shape: e, dtype: t10, refCount: 1 }); + let a = x.sizeFromShape(e); + this.wasm.tfjs.registerTensor(s, a, o); + } + return { dataId: n, shape: e, dtype: t10 }; + } + typedArrayFromHeap({ shape: e, dtype: t10, dataId: o }) { + let n = this.wasm.HEAPU8.buffer, { memoryOffset: s } = this.dataIdMap.get(o), a = x.sizeFromShape(e); + switch (t10) { + case "float32": + return new Float32Array(n, s, a); + case "int32": + return new Int32Array(n, s, a); + case "bool": + return new Uint8Array(n, s, a); + default: + throw new Error(`Unknown dtype ${t10}`); + } + } +}; +function Zee(r) { + return (e, t10) => (x.fetch(r, { credentials: "same-origin" }).then((o) => { + o.ok || e.env.a(`failed to load wasm binary file at '${r}'`), o.arrayBuffer().then((n) => { + WebAssembly.instantiate(n, e).then((s) => { + t10(s.instance, s.module); + }); + }); + }), {}); +} +function W3(r, e, t10) { + if (Pg != null) + return Pg; + let o = "tfjs-backend-wasm.wasm"; + return r && e ? o = "tfjs-backend-wasm-threaded-simd.wasm" : r && (o = "tfjs-backend-wasm-simd.wasm"), Wl != null && Wl[o] != null ? Wl[o] : t10 + o; +} +async function G3() { + let [r, e] = await Promise.all([P().getAsync("WASM_HAS_SIMD_SUPPORT"), P().getAsync("WASM_HAS_MULTITHREAD_SUPPORT")]); + return new Promise((t10, o) => { + let n = {}; + n.locateFile = (i, p) => { + if (i.endsWith(".worker.js")) { + let u = U3.wasmWorkerContents.replace(/\n/g, "\\n"), c = new Blob([u], { type: "application/javascript" }); + return URL.createObjectURL(c); + } + return i.endsWith(".wasm") ? W3(r, e, zl != null ? zl : p) : p + i; + }, sS && (n.instantiateWasm = Zee(W3(r, e, zl != null ? zl : ""))); + let s = false; + n.onAbort = () => { + if (s || Ul) + return; + Ul = true, o({ message: "Make sure the server can serve the `.wasm` file relative to the bundled js file. For more details see https://github.com/tensorflow/tfjs/blob/master/tfjs-backend-wasm/README.md#using-bundlers" }); + }; + let a; + e && r && Pg == null ? (n.mainScriptUrlOrBlob = new Blob(["var WasmBackendModuleThreadedSimd = " + z3.toString()], { type: "text/javascript" }), a = z3(n)) : a = Qee(n), a.then((i) => { + s = true, Ul = false; + let p = null; + i.tfjs = { init: i.cwrap("init", null, []), initWithThreadsCount: i.cwrap("init_with_threads_count", null, ["number"]), getThreadsCount: i.cwrap("get_threads_count", "number", []), registerTensor: i.cwrap("register_tensor", null, ["number", "number", "number"]), disposeData: i.cwrap("dispose_data", p, ["number"]), dispose: i.cwrap("dispose", p, []) }, t10({ wasm: i }); + }).catch(o); + }); +} +function Jee(r, e) { + switch (e) { + case "float32": + return new Float32Array(r); + case "int32": + return new Int32Array(r); + case "bool": + return new Uint8Array(r); + default: + throw new Error(`Unknown dtype ${e}`); + } +} +var ete = ["tfjs-backend-wasm.wasm", "tfjs-backend-wasm-simd.wasm", "tfjs-backend-wasm-threaded-simd.wasm"]; +var Pg = null; +var zl = null; +var Wl = {}; +var Ul = false; +var sS = false; +function tte(r, e = false) { + if (sC("setWasmPath has been deprecated in favor of setWasmPaths and will be removed in a future release."), Ul) + throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPath()` before you call `tf.setBackend()` or `tf.ready()`"); + Pg = r, sS = e; +} +function rte(r, e = false) { + if (Ul) + throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPaths()` before you call `tf.setBackend()` or `tf.ready()`"); + if (typeof r == "string") + zl = r; + else { + Wl = r; + let t10 = ete.filter((o) => Wl[o] == null); + if (t10.length > 0) + throw new Error(`There were no entries found for the following binaries: ${t10.join(",")}. Please either call setWasmPaths with a map providing a path for each binary, or with a string indicating the directory where all the binaries can be found.`); + } + sS = e; +} +var H3 = -1; +var rS = -1; +function ote(r) { + H3 = r; +} +function nte() { + if (rS === -1) + throw new Error("WASM backend not initialized."); + return rS; +} +var ste = "4.0.0"; +var ate = 2; +pi("wasm", async () => { + let { wasm: r } = await G3(); + return new Gl(r); +}, ate); +var Va = P(); +Va.registerFlag("WEBGPU_DEFERRED_SUBMIT_BATCH_SIZE", () => 15); +Va.registerFlag("WEBGPU_CPU_FORWARD", () => true); +Va.registerFlag("WEBGPU_MATMUL_PROGRAM_TYPE", () => -1); +Va.registerFlag("WEBGPU_USE_NAIVE_CONV2D_TRANSPOSE", () => false); +Va.registerFlag("WEBGPU_USE_LOW_POWER_GPU", () => false); +Va.registerFlag("WEBGPU_CPU_HANDOFF_SIZE_THRESHOLD", () => 1e3); +Va.registerFlag("WEBGPU_USE_PROFILE_TOOL", () => false); +Va.registerFlag("WEBGPU_IMPORT_EXTERNAL_TEXTURE", () => true); +Va.registerFlag("WEBGPU_USE_NAIVE_CONV2D_DEBUG", () => false); +var Og = class { + constructor(e) { + e && (this.vendor = e.vendor); + } + isIntel() { + return this.vendor === "intel"; + } +}; +var Mg = class { + constructor(e) { + this.device = e, this.numUsedBuffers = 0, this.numFreeBuffers = 0, this.freeBuffers = /* @__PURE__ */ new Map(), this.usedBuffers = /* @__PURE__ */ new Map(), this.numBytesUsed = 0, this.numBytesAllocated = 0; + } + acquireUploadBuffer(e, t10) { + return this.acquireBuffer(e, t10, true); + } + acquireBuffer(e, t10, o = false) { + let n = q3(e, t10); + if (this.freeBuffers.has(n) || this.freeBuffers.set(n, []), this.usedBuffers.has(n) || this.usedBuffers.set(n, []), this.numBytesUsed += e, this.numUsedBuffers++, this.freeBuffers.get(n).length > 0) { + this.numFreeBuffers--; + let a = this.freeBuffers.get(n).shift(); + return this.usedBuffers.get(n).push(a), a; + } + this.numBytesAllocated += e; + let s = this.device.createBuffer({ size: e, usage: t10, mappedAtCreation: o }); + return this.usedBuffers.get(n).push(s), s; + } + releaseBuffer(e, t10, o) { + if (this.freeBuffers.size === 0) + return; + let n = q3(t10, o); + this.freeBuffers.has(n) || this.freeBuffers.set(n, []), this.freeBuffers.get(n).push(e), this.numFreeBuffers++, this.numUsedBuffers--; + let s = this.usedBuffers.get(n), a = s.indexOf(e); + if (a < 0) + throw new Error("Cannot release a buffer that was never provided by this buffer manager"); + s.splice(a, 1), this.numBytesUsed -= t10; + } + releaseUploadBuffer(e, t10, o) { + e.mapAsync(GPUMapMode.WRITE).then(() => { + this.releaseBuffer(e, t10, o); + }, (n) => { + }); + } + getNumUsedBuffers() { + return this.numUsedBuffers; + } + getNumFreeBuffers() { + return this.numFreeBuffers; + } + dispose() { + this.freeBuffers.forEach((e, t10) => { + e.forEach((o) => { + o.destroy(); + }); + }), this.usedBuffers.forEach((e, t10) => { + e.forEach((o) => { + o.destroy(); + }); + }), this.freeBuffers = /* @__PURE__ */ new Map(), this.usedBuffers = /* @__PURE__ */ new Map(), this.numUsedBuffers = 0, this.numFreeBuffers = 0, this.numBytesUsed = 0, this.numBytesAllocated = 0; + } +}; +function q3(r, e) { + return `${r}_${e}`; +} +var Lg = class { + constructor(e) { + this.device = e, this.numUsedTextures = 0, this.numFreeTextures = 0, this.freeTextures = /* @__PURE__ */ new Map(), this.usedTextures = /* @__PURE__ */ new Map(), this.numBytesUsed = 0, this.numBytesAllocated = 0; + } + acquireTexture(e, t10, o, n) { + let s = j3(o), a = e * t10 * s, i = K3(e, t10, o, n); + if (this.freeTextures.has(i) || this.freeTextures.set(i, []), this.usedTextures.has(i) || this.usedTextures.set(i, []), this.numBytesUsed += a, this.numUsedTextures++, this.freeTextures.get(i).length > 0) { + this.numFreeTextures--; + let u = this.freeTextures.get(i).shift(); + return this.usedTextures.get(i).push(u), u; + } + this.numBytesAllocated += a; + let p = this.device.createTexture({ size: [e, t10], format: o, usage: n }); + return this.usedTextures.get(i).push(p), p; + } + releaseTexture(e, t10, o, n, s) { + if (this.freeTextures.size === 0) + return; + let a = K3(t10, o, n, s); + this.freeTextures.has(a) || this.freeTextures.set(a, []), this.freeTextures.get(a).push(e), this.numFreeTextures++, this.numUsedTextures--; + let i = this.usedTextures.get(a), p = i.indexOf(e); + if (p < 0) + throw new Error("Cannot release a texture that was never provided by this texture manager"); + i.splice(p, 1); + let u = j3(n), c = t10 * o * u; + this.numBytesUsed -= c; + } + getNumUsedTextures() { + return this.numUsedTextures; + } + getNumFreeTextures() { + return this.numFreeTextures; + } + dispose() { + this.freeTextures.forEach((e, t10) => { + e.forEach((o) => { + o.destroy(); + }); + }), this.usedTextures.forEach((e, t10) => { + e.forEach((o) => { + o.destroy(); + }); + }), this.freeTextures = /* @__PURE__ */ new Map(), this.usedTextures = /* @__PURE__ */ new Map(), this.numUsedTextures = 0, this.numFreeTextures = 0, this.numBytesUsed = 0, this.numBytesAllocated = 0; + } +}; +function K3(r, e, t10, o) { + return `${r}_${e}_${t10}_${o}`; +} +function j3(r) { + if (r === "rgba8unorm") + return 16; + throw new Error(`${r} is not supported!`); +} +function X3(r, e) { + if (Math.max(...r) > 3) + throw new Error("Cannot symbolically compute strides for rank > 4 tensor."); + let t10 = r.length, o = r.map((s) => `${e}[${s}]`), n = new Array(t10 - 1); + n[t10 - 2] = o[t10 - 1]; + for (let s = t10 - 3; s >= 0; --s) + n[s] = `(${n[s + 1]} * ${o[s + 1]})`; + return n; +} +var Z3 = (r, e, t10, o) => { + let n = { dtype: o.dtype, shape: o.shape }, s = ite(t10, n, e), a = r.createShaderModule({ code: s, label: e.constructor.name }); + return r.createComputePipeline({ compute: { module: a, entryPoint: "_start" }, label: e.constructor.name, layout: "auto" }); +}; +function At(r) { + if (r <= 1) + return "i32"; + if (r === 2) + return "vec2"; + if (r === 3) + return "vec3"; + if (r === 4) + return "vec4"; + if (r === 5) + return "vec5"; + if (r === 6) + return "vec6"; + throw Error(`GPU for rank ${r} is not yet supported`); +} +function Yo(r) { + if (r === 0) + return "x"; + if (r === 1) + return "y"; + if (r === 2) + return "z"; + if (r === 3) + return "w"; + if (r === 4) + return "u"; + if (r === 5) + return "v"; + throw Error(`Index ${r} is not yet supported`); +} +function ue(...r) { + let e; + switch (r.length) { + case 0: + e = ` + ${Ri()} + fn _start(@builtin(local_invocation_id) LocalId : vec3, + @builtin(global_invocation_id) GlobalId : vec3, + @builtin(num_workgroups) NumWorkgroups : vec3) { + localId = LocalId; + globalId = GlobalId; + numWorkgroups = NumWorkgroups; + main(); + } + + fn main() + `; + break; + case 1: + e = ` + ${Ri()} + fn _start(@builtin(local_invocation_id) LocalId : vec3, + @builtin(global_invocation_id) GlobalId : vec3, + @builtin(num_workgroups) NumWorkgroups : vec3) { + localId = LocalId; + globalId = GlobalId; + numWorkgroups = NumWorkgroups; + main(getGlobalIndex()); + } + + fn main(${r[0]} : i32) + `; + break; + default: + throw Error("Unreachable"); + } + return e; +} +function Ri() { + return ` + @compute @workgroup_size(workGroupSizeX, workGroupSizeY, workGroupSizeZ) +`; +} +function ite(r, e, t10) { + let o = []; + if (o.push(` + const workGroupSizeX = ${t10.workGroupSize[0]}u; + const workGroupSizeY = ${t10.workGroupSize[1]}u; + const workGroupSizeZ = ${t10.workGroupSize[2]}u; + + var localId: vec3; + var globalId: vec3; + var numWorkgroups: vec3; + + // Only used when the y/z dimension of workgroup size is 1. + fn getGlobalIndex() -> i32 { + ${eM(t10) ? " return i32(globalId.x);" : ` let localInvocationIndex = localId.z * workGroupSizeX * workGroupSizeY + + localId.y * workGroupSizeX + localId.x; + let workGroupID = (globalId - localId)/vec3( + workGroupSizeX, workGroupSizeY, workGroupSizeZ); + + return i32((workGroupID.z * numWorkgroups.x * numWorkgroups.y + + workGroupID.y * numWorkgroups.x + workGroupID.x) * + (workGroupSizeX * workGroupSizeY * workGroupSizeZ) + + localInvocationIndex); + `} + } + `), t10.isFromPixels) + return o.push(` + struct Uniform { + size : i32, + numChannels : i32, + outShapeStrides : vec2, + }; + + @group(0) @binding(0) var result: array<${Tc(e.dtype, t10.isVec4)}>; + @group(0) @binding(2) var uniforms: Uniform; + `), [Y3, o.join(` +`), Q3(e.shape), t10.getUserCode()].join(` +`); + let n = "struct Uniforms { NAN : f32, "; + t10.variableNames.forEach((m, f) => { + let d = At(r[f].shape.length); + n += `${m.charAt(0).toLowerCase() + m.slice(1)}Shape : ${d}, `; + }); + let s = At(e.shape.length); + n += `outShape : ${s}, `; + let a = e.shape.length - 1, i = At(a); + n += ` + outShapeStrides: ${i}, `, t10.size && (n += "size : i32, "), t10.uniforms && (n += t10.uniforms), n += "};", n = dte(n), o.push(n), t10.atomic ? o.push(` + @group(0) @binding(0) var result: array>; + `) : o.push(` + @group(0) @binding(0) var result: array<${Tc(e.dtype, t10.isVec4)}>; + `), t10.variableNames.forEach((m, f) => { + o.push(` + @group(0) @binding(${1 + f}) var ${m}: array<${t10.variableTypes ? t10.variableTypes[f] : Tc(r[f].dtype, t10.isVec4)}>; + `); + }), n !== "" && o.push(` + @group(0) @binding(${1 + t10.variableNames.length}) var uniforms: Uniforms; + `); + let p = lte(e.shape, t10.dispatchLayout), u = [Y3, o.join(` +`), Q3(e.shape), p, mte(e.shape.length)]; + t10.atomic || u.push(fte(e.shape, e.dtype, t10.isVec4)); + let c = r.map((m, f) => cte(m, e.shape, t10.variableTypes ? t10.variableTypes[f] === "vec4" : t10.isVec4, t10.dispatchLayout.x.length === e.shape.length)).join(` +`); + return u.push(c), u.push(t10.getUserCode()), u.join(` +`); +} +function J3(r, e, t10, o) { + let n = r.shaderKey; + if (r.isFromPixels) + return n; + let s = t10.map((c) => c.dtype).concat(o.dtype), a = t10.map((c) => I.getBroadcastDims(c.shape, o.shape)), i = t10.map((c) => x.arraysEqual(c.shape, o.shape)).join("_"), p = a.map((c) => c.join("_")).join(";"), u = eM(r) ? "flatDispatch" : ""; + return n += "_" + (r.workGroupSize ? r.workGroupSize.join(",") : "") + e.map((c) => c.length).join(",") + s.join(",") + r.variableNames.join(",") + p + i + u, n; +} +var Y3 = ` + struct vec5 {x: i32, y: i32, z: i32, w: i32, u: i32}; + struct vec6 {x: i32, y: i32, z: i32, w: i32, u: i32, v: i32}; + + // Checks whether coordinates lie within the bounds of the shape. + fn coordsInBounds2D(coord : vec2, shape : vec2) -> bool { + return all(coord >= vec2(0)) && all(coord < shape); + } + fn coordsInBounds3D(coord : vec3, shape : vec3) -> bool { + return all(coord >= vec3(0)) && all(coord < shape); + } + fn coordsInBounds4D(coord : vec4, shape : vec4) -> bool { + return all(coord >= vec4(0)) && all(coord < shape); + } + + fn getIndexFromCoords1D(coord : i32, shape : i32) -> i32 { + return coord; + } + fn getIndexFromCoords2D(coords : vec2, shape : vec2) -> i32 { + return dot(coords, vec2(shape.y, 1)); + } + fn getIndexFromCoords3D(coords : vec3, shape : vec3) -> i32 { + return dot(coords, vec3(shape.y * shape.z, shape.z, 1)); + } + fn getIndexFromCoords4D(coords : vec4, shape : vec4) -> i32 { + return dot(coords, vec4( + shape.y * shape.z * shape.w, shape.z * shape.w, shape.w, 1)); + } + fn getIndexFromCoords5D(coords : vec5, shape : vec5) -> i32 { + let shapeStrides: vec5 = vec5(shape.y * shape.z * shape.w * shape.u, shape.z * shape.w * shape.u, shape.w * shape.u, shape.u, 1); + return coords.x*shapeStrides.x + coords.y*shapeStrides.y + coords.z*shapeStrides.z + coords.w*shapeStrides.w + coords.u*shapeStrides.u; + } + fn getIndexFromCoords6D(coords : vec6, shape : vec6) -> i32 { + let shapeStrides: vec6 = vec6(shape.y * shape.z * shape.w * shape.u * shape.v, shape.z * shape.w * shape.u * shape.v, shape.w * shape.u * shape.v, shape.u * shape.v, shape.v, 1); + return coords.x*shapeStrides.x + coords.y*shapeStrides.y + coords.z*shapeStrides.z + coords.w*shapeStrides.w + coords.u*shapeStrides.u + coords.v*shapeStrides.v; + } + + fn idiv(a: i32, b: i32, sign: f32) -> i32 { + var res: i32 = a / b; + let modulo: i32 = a % b; + if (sign < 0. && modulo != 0) { + res = res - 1; + } + return res; + } + + // NaN defination in IEEE 754-1985 is : + // - sign = either 0 or 1. + // - biased exponent = all 1 bits. + // - fraction = anything except all 0 bits (since all 0 bits represents infinity). + // https://en.wikipedia.org/wiki/IEEE_754-1985#Representation_of_non-numbers + fn isnan(val: f32) -> bool { + let floatToUint: u32 = bitcast(val); + return (floatToUint & 0x7fffffffu) > 0x7f800000u; + } + fn isnanVec4(val : vec4) -> vec4 { + return vec4(isnan(val[0]), isnan(val[1]), isnan(val[2]), isnan(val[3])); + } +`; +function Q3(r) { + let e = r.length; + if (e <= 1) + return "fn getCoordsFromIndex(index : i32) -> i32 { return index; }"; + let t10 = x.computeStrides(r), o = At(e), n = []; + for (let a = 0; a < e; a++) + n.push(`d${a}`); + if (t10.length === 1) + return ` fn getCoordsFromIndex(index : i32) -> vec2 { + let d0 = index / uniforms.outShapeStrides; let d1 = index - d0 * uniforms.outShapeStrides; + return vec2(d0, d1); + }`; + let s; + return s = "var index2 = index;" + t10.map((a, i) => { + let p = `let ${n[i]} = index2 / uniforms.outShapeStrides.${Yo(i)}`, u = i === t10.length - 1 ? `let ${n[i + 1]} = index2 - ${n[i]} * uniforms.outShapeStrides.${Yo(i)}` : `index2 = index2 - ${n[i]} * uniforms.outShapeStrides.${Yo(i)}`; + return `${p}; ${u};`; + }).join(""), ` + fn getCoordsFromIndex(index : i32) -> ${o} { + ${s} + return ${o}(${n.join(",")}); + } + `; +} +function ute(r, e) { + let t10 = r.name, o = r.shape.length, n = At(o), s = "get" + t10.charAt(0).toUpperCase() + t10.slice(1), a = ["d0", "d1", "d2", "d3", "d4", "d5"].slice(0, o), i = a.map((c) => `${c} : i32`).join(", "); + if (o < 1) + return e ? ` + fn ${s}() -> vec4 { + return vec4(${t10}[0]); + } + ` : ` + fn ${s}() ->f32 { + return f32(${t10}[0]); + } + `; + let p = `uniforms.${t10.charAt(0).toLowerCase() + t10.slice(1)}Shape`, u = `${o}D`; + return o === 0 && (u = "1D"), e ? ` + fn ${s}(${i}) -> vec4 { + return vec4(${t10}[getIndexFromCoords${u}(${n}(${a.join(",")}), + ${p}) / 4]); + } + ` : ` + fn ${s}(${i}) -> f32 { + return f32(${t10}[getIndexFromCoords${u}(${n}(${a.join(",")}), + ${p})]); + } + `; +} +function pte(r, e, t10, o) { + let n = r.name, s = n.charAt(0).toUpperCase() + n.slice(1), a = "get" + s + "ByOutput", i = r.shape.length, p = e.length, u = At(p); + if (x.arraysEqual(r.shape, e) && o) + return t10 ? ` + fn ${a}Index(globalIndex : i32) -> vec4 { + return vec4(${n}[globalIndex]); + } + + fn ${a}Coords(coords : ${u}) -> vec4 { + return vec4(${n}[${p > 1 ? "getOutputIndexFromCoords(coords)" : "coords"} / 4]); + } + ` : ` + fn ${a}Index(globalIndex : i32) -> f32 { + return f32(${n}[globalIndex]); + } + + fn ${a}Coords(coords : ${u}) -> f32 { + return f32(${n}[${p > 1 ? "getOutputIndexFromCoords(coords)" : "coords"}]); + } + `; + let c = I.getBroadcastDims(r.shape, e), l = p - i, m = ""; + if (i === 0) + return t10 ? ` + fn ${a}Index(globalIndex : i32) -> vec4 { + return get${s}(); + } + + fn ${a}Coords(coords : ${u}) -> vec4 { + return get${s}(); + } + ` : ` + fn ${a}Index(globalIndex : i32) -> f32{ + return get${s}(); + } + + fn ${a}Coords(coords : ${u}) -> f32{ + return get${s}(); + } + `; + p < 2 && c.length >= 1 ? m = "coords = 0;" : m = c.map((g) => `coords.${Yo(g + l)} = 0;`).join(` +`); + let f = ""; + if (p < 2 && i > 0) + f = "coords"; + else if (p > 1) { + let g = At(i), y = r.shape.map((b, C) => `coords.${Yo(C + l)}`).join(", "); + f = `${g}(${y})`; + } else + f = "coords"; + let d = `uniforms.${n.charAt(0).toLowerCase() + n.slice(1)}Shape`, h = `${i}D`; + return t10 ? ` + fn ${a}Index(globalIndex : i32) -> vec4 { + var coords = getCoordsFromIndex(globalIndex); + ${m} + return ${n}[getIndexFromCoords${h}(${f}, ${d}) / 4]; + } + + fn ${a}Coords(coordsIn : ${u}) -> vec4 { + var coords = coordsIn; + ${m} + return ${n}[getIndexFromCoords${h}(${f}, ${d}) / 4]; + } + ` : ` + fn ${a}Index(globalIndex : i32) -> f32 { + var coords = getCoordsFromIndex(globalIndex); + ${m} + return f32(${n}[getIndexFromCoords${h}(${f}, ${d})]); + } + + fn ${a}Coords(coordsIn : ${u}) -> f32 { + var coords = coordsIn; + ${m} + return f32(${n}[getIndexFromCoords${h}(${f}, ${d})]); + } +`; +} +function cte(r, e, t10, o) { + let n = ute(r, t10); + return r.shape.length <= e.length && (n += pte(r, e, t10, o)), n; +} +function lte(r, e) { + let { x: t10, y: o = [], z: n = [] } = e, s = r.length, a = t10.length + o.length + n.length; + if (a !== s) + return ""; + if (t10.length === s) + return `fn getOutputCoords() -> ${At(s)}{ + let globalIndex = getGlobalIndex(); + return getCoordsFromIndex(globalIndex); + } + `; + let i = "", p = [t10, o, n]; + for (let m = 0; m < p.length; m++) { + let f = p[m]; + if (f.length !== 0) + if (f.length === 1) + i += `let d${f[0]} = i32(globalId[${m}]);`; + else { + let d = X3(f, "uniforms.outShape"); + i += `var index${m} = i32(globalId[${m}]);`; + for (let h = 0; h < d.length; h++) + i += `let d${f[h]} = index${m} / ${d[h]};`, h === d.length - 1 ? i += `let d${f[h + 1]} = index${m} - d${f[h]} * ${d[h]};` : i += `index${m} = index${m} - d${f[h]} * ${d[h]};`; + } + } + let u = []; + for (let m = 0; m < a; m++) + u.push(`d${m}`); + let c = At(a), l = `fn getOutputCoords() -> ${c} { + ${i} +`; + return u.length === 0 ? l += `return ${c}(0); }` : l += `return ${c}(${u.join(",")}); }`, l; +} +function mte(r) { + let e = ""; + switch (r) { + case 0: + case 1: + e += ` + fn getOutputIndexFromCoords(coords : i32) -> i32 { + return coords; + } + `; + break; + case 2: + e += ` + fn getOutputIndexFromCoords(coords : vec2) -> i32 { + return dot(coords, vec2(uniforms.outShapeStrides, 1)); + } + `; + break; + case 3: + e += ` + fn getOutputIndexFromCoords(coords : vec3) -> i32 { + return dot(coords, vec3(uniforms.outShapeStrides.x, uniforms.outShapeStrides.y, 1)); + } + `; + break; + case 4: + e += ` + fn getOutputIndexFromCoords(coords : vec4) -> i32 { + return dot(coords, vec4( + uniforms.outShapeStrides.x, uniforms.outShapeStrides.y, uniforms.outShapeStrides.z, 1)); + } + `; + break; + case 5: + e += ` + fn getOutputIndexFromCoords(coords : vec5) -> i32 { + return coords.x * uniforms.outShapeStrides.x + + coords.y * uniforms.outShapeStrides.y + + coords.z * uniforms.outShapeStrides.z + + coords.w * uniforms.outShapeStrides.w + + coords.u; + } + `; + break; + case 6: + e += ` + fn getOutputIndexFromCoords(coords : vec6) -> i32 { + return coords.x * uniforms.outShapeStrides.x + + coords.y * uniforms.outShapeStrides.y + + coords.z * uniforms.outShapeStrides.z + + coords.w * uniforms.outShapeStrides.w + + coords.u * uniforms.outShapeStrides.u + + coords.v; + } + `; + break; + default: + x.assert(false, () => `Unsupported ${r}D shape`); + break; + } + return e; +} +function eM(r) { + return r.dispatch[1] === 1 && r.dispatch[2] === 1; +} +function Tc(r, e) { + return r === "float32" ? e ? "vec4" : "f32" : r === "int32" || r === "bool" ? e ? "vec4" : "i32" : r; +} +function fte(r, e, t10) { + let o = r.length, n = Tc(e, t10), s; + if (t10 ? s = `fn setOutputAtIndex(flatIndex : i32, value : vec4) { + result[flatIndex] = ${n}(value); + } + fn setOutputAtIndexI32(flatIndex : i32, value : vec4) { + result[flatIndex] = ${n}(value); + }` : s = `fn setOutputAtIndex(flatIndex : i32, value : f32) { + result[flatIndex] = ${n}(value); + } + fn setOutputAtIndexI32(flatIndex : i32, value : i32) { + result[flatIndex] = ${n}(value); + }`, o >= 2) { + let a = ["d0", "d1", "d2", "d3", "d4", "d5"].slice(0, o), i = At(o); + t10 ? s += ` + fn setOutputAtCoords(${a.map((p) => `${p} : i32`).join(", ")}, value : vec4) { + let flatIndex = getOutputIndexFromCoords(${i}(${a.join(", ")})); + setOutputAtIndex(flatIndex / 4, value); + } + fn setOutputAtCoordsI32(${a.map((p) => `${p} : i32`).join(", ")}, value : vec4) { + let flatIndex = getOutputIndexFromCoords(${i}(${a.join(", ")})); + setOutputAtIndexI32(flatIndex / 4, value); + } + ` : s += ` + fn setOutputAtCoords(${a.map((p) => `${p} : i32`).join(", ")}, value : f32) { + let flatIndex = getOutputIndexFromCoords(${i}(${a.join(", ")})); + setOutputAtIndex(flatIndex, value); + } + fn setOutputAtCoordsI32(${a.map((p) => `${p} : i32`).join(", ")}, value : i32) { + let flatIndex = getOutputIndexFromCoords(${i}(${a.join(", ")})); + setOutputAtIndexI32(flatIndex, value); + } + `; + } + return s; +} +function dte(r) { + let e = /(\w+)\s*:\s*vec(5|6)/g; + r = r.replace(e, (o) => "@align(16) " + o); + let t10 = /vec(5|6)\s*,\s*(\w+)/g; + return r = r.replace(t10, (o, n, s) => `vec${n}, @align(16) ${s}`), r; +} +var pS = {}; +Be(pS, { ArrayBufferToTypedArray: () => uS, GPUBytesPerElement: () => iS, MatMulProgramType: () => Qo, computeDispatch: () => ae, computeWorkGroupInfoForMatMul: () => aS, computeWorkGroupSizeForConv2d: () => Hl, computeWorkPerThreadForConv2d: () => ql, flatDispatchLayout: () => fe, isWebGPUSupported: () => Kl, tilesFitEvenlyIntoShape: () => gte }); +var Wu = (r) => { + let e = 1; + for (let t10 = 0; t10 < r.length; t10++) + e *= r[t10]; + return e; +}; +function gte(r, e) { + if (r.length !== e.length) + throw new Error(`Cannot compute whether rank ${r.length} tiles fit evenly into rank ${e.length} shape - ranks must match.`); + return e.every((t10, o) => t10 % r[o] === 0); +} +function ae(r, e, t10 = [1, 1, 1], o = [1, 1, 1]) { + let [n, s, a] = [Math.ceil(Wu(r.x.map((i) => e[i])) / (t10[0] * o[0])), r.y ? Math.ceil(Wu(r.y.map((i) => e[i])) / (t10[1] * o[1])) : 1, r.z ? Math.ceil(Wu(r.z.map((i) => e[i])) / (t10[2] * o[2])) : 1]; + return [n, s, a]; +} +function aS(r, e, t10, o = false) { + let n = [8, 8, 1], s = [4, 4, 1]; + return o || (r <= 8 && (s[1] = 1), e <= 16 && t10 <= 16 && (n[0] = 4)), { workGroupSize: n, elementsPerThread: s }; +} +function Hl(r, e, t10 = false) { + if (t10) + return [8, 8, 1]; + let o = Wu(r.x.map((s) => e[s])), n = Wu(r.y.map((s) => e[s])); + return o <= 4 ? [4, 16, 1] : n <= 4 ? [16, 4, 1] : [16, 16, 1]; +} +function ql(r, e, t10 = false) { + if (t10) + return [4, 4, 1]; + let o = Wu(r.x.map((s) => e[s])), n = Wu(r.y.map((s) => e[s])); + return o <= 4 ? [1, 2, 1] : n <= 4 ? [2, 1, 1] : [2, 2, 1]; +} +function fe(r) { + return { x: r.map((e, t10) => t10) }; +} +function iS(r) { + if (r === "float32" || r === "int32" || r === "bool" || r === "string") + return 4; + if (r === "complex64") + return 8; + throw new Error(`Unknown dtype ${r}`); +} +function uS(r, e) { + if (e === "float32") + return new Float32Array(r); + if (e === "int32") + return new Int32Array(r); + if (e === "bool" || e === "string") + return Uint8Array.from(new Int32Array(r)); + throw new Error(`Unknown dtype ${e}`); +} +function Kl() { + return (typeof window != "undefined" || typeof WorkerGlobalScope != "undefined") && !!navigator.gpu; +} +var Qo; +(function(r) { + r[r.MatMulReduceProgram = 0] = "MatMulReduceProgram", r[r.MatMulSplitKProgram = 1] = "MatMulSplitKProgram", r[r.MatMulSmallOutputSizeProgram = 2] = "MatMulSmallOutputSizeProgram", r[r.MatMulPackedProgram = 3] = "MatMulPackedProgram", r[r.MatMulMax = 4] = "MatMulMax"; +})(Qo || (Qo = {})); +var xte = P().getNumber("WEBGPU_CPU_HANDOFF_SIZE_THRESHOLD"); +var yte = (r, e) => { + let t10 = r.limits.maxComputeWorkgroupsPerDimension, o = e.dispatchLayout, n = e.dispatch; + if (n.every((a) => a <= t10)) + return n; + x.assert(n[0] > t10 && o.y === void 0 && o.z === void 0, () => "Dispatch size exceeds WebGPU limits in Y or Z dimension."); + let s = Math.ceil(Math.sqrt(n[0])); + return s > t10 ? (s = Math.ceil(Math.cbrt(n[0])), x.assert(s <= t10, () => "Total dispatch size exceeds WebGPU maximum."), [s, s, s]) : [s, s, 1]; +}; +var Ai = class extends Jr { + constructor(e, t10) { + if (super(), this.commandQueueOwnedIds = /* @__PURE__ */ new WeakSet(), this.dispatchNumberInEncoder = 0, this.disposed = false, this.downloadWaitMs = 0, this.tensorDataPendingDisposal = [], this.stagingPendingDisposal = [], this.uniformPendingDisposal = [], this.uploadWaitMs = 0, !Kl()) + throw new Error("WebGPU is not supported on this device"); + this.pipelineCache = {}, this.device = e, this.queue = e.queue, this.currentCommandEncoder = null, this.currentComputePass = null, this.supportTimeQuery = e.features.has("timestamp-query"), this.adapterInfo = new Og(t10), this.bufferManager = new Mg(this.device), this.textureManager = new Lg(this.device), this.tensorMap = new rn(this, cr()), this.supportTimeQuery && (this.querySet = this.device.createQuerySet({ type: "timestamp", count: 2 })), P().getBool("WEBGPU_USE_PROFILE_TOOL") && (this.dummyCanvas = document.createElement("canvas"), this.dummyCanvas.width = 1, this.dummyCanvas.height = 1, this.dummyContext = this.dummyCanvas.getContext("webgpu"), this.dummyContext.configure({ device: e, format: "bgra8unorm" }), document.body.appendChild(this.dummyCanvas)); + } + nextDataId() { + return Ai.nextDataId++; + } + floatPrecision() { + return 32; + } + defaultGpuBufferUsage() { + return GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST; + } + disposeData(e, t10 = false) { + if (this.tensorDataPendingDisposal.indexOf(e) >= 0) + return false; + if (!this.tensorMap.has(e)) + return true; + let o = this.tensorMap.get(e); + if (this.decRef(e), !t10 && o.refCount > 0) + return false; + if (this.commandQueueOwnedIds.has(e)) + return this.tensorDataPendingDisposal.push(e), false; + let { complexTensorInfos: n } = this.tensorMap.get(e); + return n != null && (this.disposeData(n.real.dataId, t10), this.disposeData(n.imag.dataId, t10)), this.releaseResource(e), this.tensorMap.delete(e), true; + } + memory() { + return { numBytesInGPU: this.bufferManager.numBytesUsed, numBytesAllocatedInGPU: this.bufferManager.numBytesAllocated, unreliable: false }; + } + releaseResource(e) { + let t10 = this.tensorMap.get(e); + if (!(!t10 || !t10.resourceInfo)) { + if ("texture" in t10.resourceInfo) { + let o = t10.resourceInfo; + o.texture instanceof GPUTexture && this.textureManager.releaseTexture(o.texture, o.width, o.height, o.format, o.usage), o.texture = null; + } else { + let o = t10.resourceInfo; + this.bufferManager.releaseBuffer(o.buffer, o.size, o.usage), o.buffer = null; + } + t10.resourceInfo = null; + } + } + refCount(e) { + return this.tensorMap.has(e) ? this.tensorMap.get(e).refCount : 0; + } + incRef(e) { + let t10 = this.tensorMap.get(e); + t10.refCount++; + } + decRef(e) { + if (this.tensorMap.has(e)) { + let t10 = this.tensorMap.get(e); + t10.refCount--; + } + } + write(e, t10, o) { + if (o === "complex64" && e != null) + throw new Error("Cannot write to a complex64 dtype. Please use tf.complex(real, imag)."); + let n = { id: this.nextDataId() }; + return this.tensorMap.set(n, { dtype: o, shape: t10, values: e, refCount: 1 }), n; + } + move(e, t10, o, n, s) { + if (n === "complex64") + throw new Error("Cannot write to a complex64 dtype. Please use tf.complex(real, imag)."); + this.tensorMap.set(e, { dtype: n, shape: o, values: t10, refCount: s }); + } + submitQueue() { + this.ensureComputePassEnded(), this.queue.submit([this.currentCommandEncoder.finish()]), this.currentCommandEncoder = null, this.dispatchNumberInEncoder = 0, this.commandQueueOwnedIds = /* @__PURE__ */ new WeakSet(), this.tensorDataPendingDisposal.forEach((e) => { + this.releaseResource(e), this.tensorMap.delete(e); + }), this.uniformPendingDisposal.forEach((e) => this.bufferManager.releaseBuffer(e.buffer, e.size, e.usage)), this.stagingPendingDisposal.forEach((e) => this.bufferManager.releaseUploadBuffer(e.buffer, e.size, e.usage)), this.tensorDataPendingDisposal = [], this.uniformPendingDisposal = [], this.stagingPendingDisposal = []; + } + ensureCommandEncoderReady() { + this.currentCommandEncoder || (this.currentCommandEncoder = this.device.createCommandEncoder()); + } + ensureComputePassEnded() { + this.currentComputePass && (this.currentComputePass.end(), this.currentComputePass = null); + } + getComputePass() { + return this.currentComputePass || (this.currentComputePass = this.currentCommandEncoder.beginComputePass()), this.currentComputePass; + } + async getBufferData(e, t10) { + let o = this.bufferManager.acquireBuffer(t10, GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ); + this.ensureCommandEncoderReady(), this.ensureComputePassEnded(), this.currentCommandEncoder.copyBufferToBuffer(e, 0, o, 0, t10), this.submitQueue(), await o.mapAsync(GPUMapMode.READ); + let n = o.getMappedRange().slice(0); + return o.unmap(), o != null && this.bufferManager.releaseBuffer(o, t10, GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ), P().getBool("WEBGPU_USE_PROFILE_TOOL") && (x.assert(this.dummyContext !== void 0, () => "Fail to get context for profiling tool"), this.dummyContext.getCurrentTexture()), n; + } + convertAndCacheOnCPU(e, t10) { + let o = this.tensorMap.get(e); + return this.releaseResource(e), o.values = t10, o.values; + } + readSync(e) { + let t10 = this.tensorMap.get(e), { values: o } = t10; + if (o == null) + throw new Error("WebGPU readSync is only available for CPU-resident tensors."); + return o; + } + async read(e) { + if (!this.tensorMap.has(e)) + throw new Error(`Tensor ${e} was not registered!`); + let t10 = this.tensorMap.get(e), { values: o } = t10; + if (o != null) + return this.convertAndCacheOnCPU(e, o); + let n; + if (t10.dtype === "complex64") { + let s = await Promise.all([this.read(t10.complexTensorInfos.real.dataId), this.read(t10.complexTensorInfos.imag.dataId)]), a = s[0], i = s[1]; + n = I.mergeRealAndImagArrays(a, i); + } else { + let s = t10.resourceInfo, a = await this.getBufferData(s.buffer, s.size); + n = uS(a, t10.dtype); + } + return this.convertAndCacheOnCPU(e, n), n; + } + readToGPU(e) { + let t10 = this.tensorMap.get(e), { values: o, dtype: n, shape: s, resourceInfo: a } = t10; + if (n === "complex64") + throw new Error("Does not support reading buffer for complex64 dtype."); + if (a == null) + throw o != null ? new Error("Data is not on GPU but on CPU.") : new Error("There is no data on GPU or CPU."); + let i = a.size, p = this.bufferManager.acquireBuffer(i, a.usage); + this.ensureCommandEncoderReady(), this.ensureComputePassEnded(), this.currentCommandEncoder.copyBufferToBuffer(a.buffer, 0, p, 0, i), this.submitQueue(); + let u = this.makeTensorInfo(s, n), c = cr().makeTensorFromTensorInfo(u), l = this.tensorMap.get(u.dataId); + return l.resourceInfo = { size: i, usage: this.defaultGpuBufferUsage(), buffer: p }, { tensorRef: c, buffer: p, bufSize: i }; + } + bufferSync(e) { + let t10 = this.readSync(e.dataId); + if (e.dtype === "string") + try { + let o = t10.map((n) => x.decodeString(n)); + return ne(e.shape, e.dtype, o); + } catch (o) { + throw new Error("Failed to decode encoded string bytes into utf-8"); + } + return ne(e.shape, e.dtype, t10); + } + async time(e) { + this.supportTimeQuery || console.warn("This device doesn't support timestamp-query extension. Start Chrome browser with flag --disable-dawn-features=disallow_unsafe_apis then try again. Otherwise, zero will be shown for the kernel time when profiling mode is enabled. Using performance.now is not workable for webgpu since it doesn't support synchronous data read from GPU."); + let t10 = this.activeTimers, o = [], n = false; + this.programTimersStack == null ? (this.programTimersStack = o, n = true) : this.activeTimers.push(o), this.activeTimers = o, e(); + let s = x.flatten(this.activeTimers.map((u) => u.query)).filter((u) => u != null), a = x.flatten(this.activeTimers.map((u) => u.name)).filter((u) => u != null); + this.activeTimers = t10, n && (this.programTimersStack = null); + let i = { uploadWaitMs: this.uploadWaitMs, downloadWaitMs: this.downloadWaitMs, kernelMs: null, wallMs: null }, p = await Promise.all(s); + return i.kernelMs = x.sum(p), i.getExtraProfileInfo = () => p.map((u, c) => ({ name: a[c], ms: u })).map((u) => `${u.name}: ${u.ms}`).join(", "), this.uploadWaitMs = 0, this.downloadWaitMs = 0, i; + } + makeTensorInfo(e, t10, o) { + return t10 === "string" && o != null && o.length > 0 && x.isString(o[0]) && (o = o.map((s) => x.encodeString(s))), { dataId: this.write(o, e, t10), shape: e, dtype: t10 }; + } + tensorToBinding(e) { + if (!e) + return null; + let t10 = this.tensorMap.get(e.dataId); + if ("texture" in t10.resourceInfo) { + let n = t10.resourceInfo; + return n.texture instanceof GPUExternalTexture ? n.texture : n.texture.createView(); + } + let o = t10.resourceInfo; + return { offset: 0, size: o.size, buffer: o.buffer }; + } + async getQueryTime(e) { + return this.supportTimeQuery ? this.getTimeFromQuerySet(e) : 0; + } + uploadToGPU(e) { + let t10 = this.tensorMap.get(e); + if (t10.resourceInfo) + return; + let o = iS(t10.dtype) * x.sizeFromShape(t10.shape), n = this.bufferManager.acquireBuffer(o, this.defaultGpuBufferUsage()); + if (t10.resourceInfo = { size: o, usage: this.defaultGpuBufferUsage(), buffer: n }, t10.values) { + let s = this.bufferManager.acquireUploadBuffer(o, GPUBufferUsage.MAP_WRITE | GPUBufferUsage.COPY_SRC), a = s.getMappedRange(); + t10.dtype === "int32" || t10.dtype === "bool" ? new Int32Array(a).set(t10.values) : new Float32Array(a).set(t10.values), s.unmap(), this.ensureCommandEncoderReady(), this.ensureComputePassEnded(), this.currentCommandEncoder.copyBufferToBuffer(s, 0, n, 0, o); + let i = { size: o, usage: GPUBufferUsage.MAP_WRITE | GPUBufferUsage.COPY_SRC, buffer: s }; + this.stagingPendingDisposal.push(i); + } + } + makeUniforms(e) { + let t10 = 0, o = 0, n = []; + e.forEach((p) => { + p.data.length === 0 && (p.data = [1]); + let u; + switch (p.data.length) { + case 1: + u = 4; + break; + case 2: + u = 8; + break; + case 3: + u = 16; + break; + case 4: + u = 16; + break; + case 5: + u = 16; + break; + case 6: + u = 16; + break; + default: + x.assert(false, () => `Unsupported ${p.data.length}D shape`); + } + (o === 5 || o === 6) && (u = 16), t10 = Math.ceil(t10 / u) * u, o = p.data.length, n.push(t10), t10 += p.data.length * 4; + }); + let s = new ArrayBuffer(t10); + e.forEach((p, u) => { + let c = n[u]; + p.type === "int32" ? new Int32Array(s, c, p.data.length).set(p.data) : p.type === "uint32" ? new Uint32Array(s, c, p.data.length).set(p.data) : new Float32Array(s, c, p.data.length).set(p.data); + }); + let a = this.bufferManager.acquireBuffer(t10, GPUBufferUsage.COPY_DST | GPUBufferUsage.UNIFORM); + this.queue.writeBuffer(a, 0, s, 0, t10); + let i = { size: t10, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.UNIFORM, buffer: a }; + return this.uniformPendingDisposal.push(i), { offset: 0, size: t10, buffer: a }; + } + runWebGPUProgram(e, t10, o, n, s) { + if (s || (s = this.makeTensorInfo(e.outputShape, o)), x.sizeFromShape(s.shape) === 0) + return this.tensorMap.get(s.dataId).values = x.getTypedArrayFromDType(s.dtype, 0), s; + this.uploadToGPU(s.dataId), e.dispatch = yte(this.device, e); + let a = [], i = []; + if (!e.isFromPixels) { + a.push({ type: "float32", data: [NaN] }), i = t10.concat(s).map((y) => y.shape); + let h = "int32"; + i.map((y) => { + a.push({ type: h, data: y }); + }); + let g = x.computeStrides(s.shape); + if (a.push({ type: h, data: g }), e.size) { + let y = x.sizeFromShape(e.outputShape); + a.push({ type: h, data: [e.isVec4 ? y / 4 : y] }); + } + } + let p = t10.map((h, g) => { + if (h.dtype === "complex64") + throw new Error("GPGPUProgram does not support complex64 input. For complex64 dtypes, please separate the program into real and imaginary parts."); + return this.uploadToGPU(h.dataId), { dtype: this.tensorMap.get(h.dataId).dtype, shape: h.shape, name: e.variableNames[g] }; + }), u = J3(e, i, p, s), c; + u in this.pipelineCache ? c = this.pipelineCache[u] : (c = Z3(this.device, e, p, s), this.pipelineCache[u] = c), n && (a = [...a, ...n]); + let l = [this.tensorToBinding(s), ...t10.map((h) => this.tensorToBinding(h)), this.makeUniforms(a)], m = this.device.createBindGroup({ layout: c.getBindGroupLayout(0), entries: l.map((h, g) => ({ binding: g, resource: h })) }); + this.ensureCommandEncoderReady(); + let f = this.getComputePass(), d = this.activeTimers != null; + return d && this.supportTimeQuery && f.writeTimestamp(this.querySet, 0), f.setPipeline(c), f.setBindGroup(0, m), f.dispatchWorkgroups(e.dispatch[0], e.dispatch[1], e.dispatch[2]), d && this.supportTimeQuery && f.writeTimestamp(this.querySet, 1), this.dispatchNumberInEncoder++, t10.forEach((h) => { + this.commandQueueOwnedIds.add(h.dataId); + }), this.commandQueueOwnedIds.add(s.dataId), P().get("WEBGPU_DEFERRED_SUBMIT_BATCH_SIZE") <= this.dispatchNumberInEncoder && this.submitQueue(), d && this.activeTimers.push({ name: e.constructor.name, query: this.getQueryTime(this.querySet) }), s; + } + async getTimeFromQuerySet(e) { + let t10 = this.bufferManager.acquireBuffer(16, GPUBufferUsage.COPY_SRC | GPUBufferUsage.QUERY_RESOLVE), o = this.bufferManager.acquireBuffer(16, GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST); + this.ensureCommandEncoderReady(), this.ensureComputePassEnded(), this.currentCommandEncoder.resolveQuerySet(e, 0, 2, t10, 0), this.currentCommandEncoder.copyBufferToBuffer(t10, 0, o, 0, 16), this.submitQueue(), await o.mapAsync(GPUMapMode.READ); + let n = new BigUint64Array(o.getMappedRange()), s = Number(n[1] - n[0]); + return o.unmap(), this.bufferManager.releaseBuffer(o, 16, GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST), this.bufferManager.releaseBuffer(t10, 16, GPUBufferUsage.COPY_SRC | GPUBufferUsage.QUERY_RESOLVE), s / 1e6; + } + shouldExecuteOnCPU(e, t10 = xte) { + return P().getBool("WEBGPU_CPU_FORWARD") && e.every((o) => this.tensorMap.get(o.dataId).resourceInfo == null && x.sizeFromShape(o.shape) < t10); + } + numDataIds() { + return this.tensorMap.numDataIds() - this.tensorDataPendingDisposal.length; + } + dispose() { + this.disposed || (this.bufferManager.dispose(), this.textureManager.dispose(), this.disposed = true); + } +}; +Ai.nextDataId = 0; +Kl() && pi("webgpu", async () => { + P().set("CHECK_COMPUTATION_FOR_ERRORS", false); + let r = { powerPreference: P().get("WEBGPU_USE_LOW_POWER_GPU") ? "low-power" : "high-performance" }, e = await navigator.gpu.requestAdapter(r), t10 = e.limits, o = {}, n = e.features.has("timestamp-query"); + o.requiredLimits = { maxComputeWorkgroupStorageSize: t10.maxComputeWorkgroupStorageSize, maxComputeWorkgroupsPerDimension: t10.maxComputeWorkgroupsPerDimension, maxStorageBufferBindingSize: t10.maxStorageBufferBindingSize }, n && (o.requiredFeatures = ["timestamp-query"]); + let s = await e.requestDevice(o), a = await e.requestAdapterInfo(); + return new Ai(s, a); +}, 3); +var ye; +(function(r) { + r[r.MUL = 0] = "MUL", r[r.ADD = 1] = "ADD", r[r.ATAN2 = 2] = "ATAN2", r[r.SUB = 3] = "SUB", r[r.DIV = 4] = "DIV", r[r.EQUAL = 5] = "EQUAL", r[r.GREATER = 6] = "GREATER", r[r.GREATER_EQUAL = 7] = "GREATER_EQUAL", r[r.LESS = 8] = "LESS", r[r.LESS_EQUAL = 9] = "LESS_EQUAL", r[r.LOGICAL_AND = 10] = "LOGICAL_AND", r[r.NOT_EQUAL = 11] = "NOT_EQUAL", r[r.SQUARED_DIFFERENCE = 12] = "SQUARED_DIFFERENCE", r[r.INT_DIV = 13] = "INT_DIV", r[r.POW = 14] = "POW", r[r.PRELU = 15] = "PRELU", r[r.MAX = 16] = "MAX", r[r.MIN = 17] = "MIN", r[r.COMPLEX_MULTIPLY_REAL = 18] = "COMPLEX_MULTIPLY_REAL", r[r.COMPLEX_MULTIPLY_IMAG = 19] = "COMPLEX_MULTIPLY_IMAG"; +})(ye || (ye = {})); +var bte = ` + if (isnan(a)) { return a; } + if (isnan(b)) { return b; } + `; +var tM = ` + if (isNaN.r) { + resultTemp.r = valueForNaN; + } + if (isNaN.g) { + resultTemp.g = valueForNaN; + } + if (isNaN.b) { + resultTemp.b = valueForNaN; + } + if (isNaN.a) { + resultTemp.a = valueForNaN; + } + `; +var rM = ` + let isNaN = isnanVec4(a) | isnanVec4(b); + ${tM} + `; +var Cte = "return a + b;"; +var Ite = "return areal * breal - aimag * bimag;"; +var wte = "return areal * bimag + aimag * breal;"; +var Ste = "return a / b;"; +var vte = "return a * b;"; +var kte = "return (a - b) * (a - b);"; +var Tte = "return a - b;"; +var Nte = "return f32(a == b);"; +var _te = "return vec4(a == b);"; +var Ete = "return f32(a > b);"; +var $te = "return vec4(a > b);"; +var Rte = "return f32(a >= b);"; +var Ate = "return vec4(a >= b);"; +var Fte = "return f32(a < b);"; +var Dte = "return vec4(a < b);"; +var Pte = "return f32(a <= b);"; +var Ote = "return vec4(a <= b);"; +var Mte = "return f32(f32(a) >= 1.0 && f32(b) >= 1.0);"; +var Lte = `return (vec4(a >= vec4(1.0)) * + vec4(b >= vec4(1.0)));`; +var Bte = ` + let s = sign(a) * sign(b); + let ia = i32(round(a)); + let ib = i32(round(b)); + return f32(idiv(ia, ib, s)); + `; +var Vte = ` + let ia = vec4(round(a)); + let ib = vec4(round(b)); + let cond = ib != vec4(0); + var resultTemp = vec4(0); + let s = sign(a) * sign(b); + + // Windows (D3D) wants guaranteed non-zero int division at compile-time. + if (cond[0]) { + resultTemp[0] = idiv(ia[0], ib[0], s[0]); + } + if (cond[1]) { + resultTemp[1] = idiv(ia[1], ib[1], s[1]); + } + if (cond[2]) { + resultTemp[2] = idiv(ia[2], ib[2], s[2]); + } + if (cond[3]) { + resultTemp[3] = idiv(ia[3], ib[3], s[3]); + } + return vec4(resultTemp); + `; +var zte = ` + if (isnan(a) || isnan(b)) { + return 1.0; + } + return f32(a != b); +`; +var Wte = ` + var resultTemp = vec4(a != b); + let valueForNaN = 1.0; + ${rM} + + return resultTemp; +`; +var Ute = ` + if(a < 0.0 && floor(b) < b) { + return uniforms.NAN; + } + if (b == 0.0) { + return 1.0; + } + if (round(abs(b) % 2.0) != 1.0) { + return pow(abs(a), b); + } + return sign(a) * pow(abs(a), b); + `; +var Gte = ` + let isModRound1Bool = vec4(round(abs(b) % vec4(2.0))) == vec4(1); + let isModRound1 = vec4(isModRound1Bool); + let multiplier = sign(a) * isModRound1 + (vec4(1.0) - isModRound1); + var resultTemp = multiplier * pow(abs(a), b); + + // Ensure that a^0 = 1, including 0^0 = 1 as this correspond to TF and JS + let isExpZero = b == vec4(0.0); + if (isExpZero.r) { + resultTemp.r = 1.0; + } + if (isExpZero.g) { + resultTemp.g = 1.0; + } + if (isExpZero.b) { + resultTemp.b = 1.0; + } + if (isExpZero.a) { + resultTemp.a = 1.0; + } + let isNaN = (a < vec4(0.0)) & (floor(b) < b); + let valueForNaN = uniforms.NAN; + ${tM} + return resultTemp; + `; +var Hte = "if (a < 0.0) { return b * a; } return a;"; +var qte = ` + let aLessThanZero = vec4(a < vec4(0.0)); + return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a); + `; +function cS(r, e, t10 = "uniforms.NAN") { + let o = e ? rM : bte; + return e ? ` + let valueForNaN = ${t10}; + var resultTemp = vec4(${r}(a, b)); + ` + o + ` + return resultTemp; + ` : o + ` + return ${r}(a, b); + `; +} +function Nc(r, e) { + switch (r) { + case ye.MUL: + return vte; + case ye.ADD: + return Cte; + case ye.ATAN2: + return cS("atan2", e); + case ye.SUB: + return Tte; + case ye.DIV: + return Ste; + case ye.EQUAL: + return e ? _te : Nte; + case ye.GREATER: + return e ? $te : Ete; + case ye.GREATER_EQUAL: + return e ? Ate : Rte; + case ye.LESS: + return e ? Dte : Fte; + case ye.LESS_EQUAL: + return e ? Ote : Pte; + case ye.LOGICAL_AND: + return e ? Lte : Mte; + case ye.NOT_EQUAL: + return e ? Wte : zte; + case ye.SQUARED_DIFFERENCE: + return kte; + case ye.INT_DIV: + return e ? Vte : Bte; + case ye.PRELU: + return e ? qte : Hte; + case ye.MAX: + return cS("max", e); + case ye.MIN: + return cS("min", e); + case ye.POW: + return e ? Gte : Ute; + case ye.COMPLEX_MULTIPLY_REAL: + return Ite; + case ye.COMPLEX_MULTIPLY_IMAG: + return wte; + default: + throw new Error(`BinaryType ${r} is not implemented!`); + } +} +var pe; +(function(r) { + r[r.ABS = 0] = "ABS", r[r.CEIL = 1] = "CEIL", r[r.COS = 2] = "COS", r[r.COSH = 3] = "COSH", r[r.ELU = 4] = "ELU", r[r.EXP = 5] = "EXP", r[r.EXPM1 = 6] = "EXPM1", r[r.FLOOR = 7] = "FLOOR", r[r.IS_NAN = 8] = "IS_NAN", r[r.LINEAR = 9] = "LINEAR", r[r.LOG = 10] = "LOG", r[r.LOGICAL_NOT = 11] = "LOGICAL_NOT", r[r.NEG = 12] = "NEG", r[r.RELU = 13] = "RELU", r[r.RELU6 = 14] = "RELU6", r[r.LEAKYRELU = 15] = "LEAKYRELU", r[r.RECIPROCAL = 16] = "RECIPROCAL", r[r.RSQRT = 17] = "RSQRT", r[r.SIN = 18] = "SIN", r[r.SINH = 19] = "SINH", r[r.SIGMOID = 20] = "SIGMOID", r[r.SQRT = 21] = "SQRT", r[r.SQUARE = 22] = "SQUARE", r[r.TANH = 23] = "TANH", r[r.TO_INT = 24] = "TO_INT"; +})(pe || (pe = {})); +var Kte = "return abs(a);"; +var jte = "return ceil(a);"; +var Xte = "return cos(a);"; +var Yte = ` + let e2x = exp(-a); + return (e2x + 1.0 / e2x) / 2.0; +`; +var Qte = "return exp(a) - 1.0;"; +var Zte = "if (a >= 0.0) { return a; } return (exp(a) - 1.0);"; +var Jte = ` + var resFloat = exp(a) - vec4(1.0); + if (a.r >= 0.0) { + resFloat.r = a.r; + } + if (a.g >= 0.0) { + resFloat.g = a.g; + } + if (a.b >= 0.0) { + resFloat.b = a.b; + } + if (a.a >= 0.0) { + resFloat.a = a.a; + } + return resFloat; +`; +var ere = "return exp(a);"; +var tre = "return floor(a);"; +var rre = "return f32(isnan(a));"; +var ore = "return a;"; +var nre = `if (a < 0.0) { return uniforms.NAN; } + return log(a);`; +var sre = "return f32(!(a >= 1.0));"; +var are = "return -a;"; +var ire = "if (a < 0.0) { return uniforms.alpha * a; } return a;"; +var ure = ` + let aLessThanZero = vec4(a < vec4(0.0)); + return (aLessThanZero * (uniforms.alpha * a)) + ((vec4(1.0) - aLessThanZero) * a); +`; +var pre = "return 1.0 / a;"; +var cre = "return select(a, 0.0, a < 0.0);"; +var lre = "return clamp(a, 0.0, 6.0);"; +var mre = "return clamp(a, vec4(0.0, 0.0, 0.0, 0.0), vec4(6.0, 6.0, 6.0, 6.0));"; +var fre = ` + return select(a, vec4(0.0), a < vec4(0.0)); +`; +var dre = "return 1.0/sqrt(a);"; +var hre = "return 1.0 / (1.0 + exp(-1.0 * a));"; +var gre = "return sin(a);"; +var xre = ` + let e2x = exp(a); + return (e2x - 1.0 / e2x) / 2.0; +`; +var yre = "return sqrt(a);"; +var bre = "return a * a;"; +var Cre = ` + let e2x = exp(-2.0 * abs(a)); + return sign(a) * (1.0 - e2x) / (1.0 + e2x); +`; +var Ire = "return f32(i32((a)));"; +function za(r, e) { + switch (r) { + case pe.ABS: + return Kte; + case pe.COS: + return Xte; + case pe.COSH: + return Yte; + case pe.CEIL: + return jte; + case pe.ELU: + return e ? Jte : Zte; + case pe.EXP: + return ere; + case pe.EXPM1: + return Qte; + case pe.FLOOR: + return tre; + case pe.IS_NAN: + return rre; + case pe.LINEAR: + return ore; + case pe.LOG: + return nre; + case pe.LOGICAL_NOT: + return sre; + case pe.NEG: + return are; + case pe.LEAKYRELU: + return e ? ure : ire; + case pe.RECIPROCAL: + return pre; + case pe.RELU: + return e ? fre : cre; + case pe.RELU6: + return e ? mre : lre; + case pe.RSQRT: + return dre; + case pe.SIGMOID: + return hre; + case pe.SIN: + return gre; + case pe.SINH: + return xre; + case pe.SQRT: + return yre; + case pe.SQUARE: + return bre; + case pe.TANH: + return Cre; + case pe.TO_INT: + return Ire; + default: + throw new Error(`BinaryType ${r} is not implemented!`); + } +} +var vt = (r) => { + switch (r) { + case 1: + return "f32"; + case 2: + return "vec2"; + case 3: + return "vec3"; + case 4: + return "vec4"; + default: + throw new Error(`${r}-component is not supported.`); + } +}; +function ur(r, e = false, t10 = false, o = 3) { + if (r === null) + return ""; + let n = ""; + if (r === "linear") + n = za(pe.LINEAR); + else if (r === "relu") + n = za(pe.RELU, t10); + else if (r === "elu") + n = za(pe.ELU, t10); + else if (r === "relu6") + n = za(pe.RELU6, t10); + else if (r === "prelu") + n = Nc(ye.PRELU, t10); + else if (r === "sigmoid") + n = za(pe.SIGMOID, t10); + else if (r === "leakyrelu") + n = za(pe.LEAKYRELU, t10); + else + throw new Error(`Activation ${r} has not been implemented for the WebGPU backend.`); + let a = vt(t10 ? 4 : 1), i = ""; + return e ? i = ` + fn activation(a : ${a}, coords : vec${o}) -> ${a} { + let b = getPreluActivationWeightsByOutputCoords(coords); + ${n} + }` : i = ` + fn activation(a : ${a}, coords : vec${o}) -> ${a} { + ${n} + }`, i; +} +function Kr(r, e) { + return ` + ${r ? "value = value + getBiasByOutputCoords(coords);" : ""} + ${e ? "value = activation(value, coords);" : ""} + `; +} +function lS(r, e, t10, o, n = false, s = false, a = false, i = 1) { + x.assert(t10 && i === 1 || !t10, () => `transposeA ${t10} is not compatible with component size ${i}`); + let p = ` + let batch = ${r ? "0" : "batchIn"}; + ${t10 ? "value = getA(batch, col, row);" : "value = getA(batch, row, col);"} + + `, u = o ? "value = getB(batch, col, row);" : "value = getB(batch, row, col);"; + return ` + fn mm_readA(batchIn: i32, row: i32, colIn: i32) -> ${vt(i)} { + var value = ${vt(i)}(0.0); + let col = colIn * ${i}; + ${n && a ? p : ` + ${t10 ? "if(row < uniforms.dimAOuter && col < uniforms.dimInner)" : "if(row < uniforms.aShape[1] && col < uniforms.aShape[2])"} + { + ${p} + } + `} + return value; + } + + fn mm_readB(batchIn: i32, row: i32, colIn: i32) -> ${vt(i)} { + let col = colIn * ${i}; + let batch = ${e ? "0" : "batchIn"}; + var value = ${vt(i)}(0.0); + ${u} + return value; + } + `; +} +function jl(r, e, t10, o, n, s, a = false, i = false, p = false, u = 1) { + return ` + ${lS(t10, o, n, s, a, i, p, u)} + fn mm_write(batch: i32, row: i32, colIn: i32, valueIn: ${vt(u)}) { + let col = colIn * ${u}; + ${a && i ? "" : "if (row < uniforms.dimAOuter && col < uniforms.dimBOuter)"} + { + var value = valueIn; + let coords = vec3(batch, row, col); + ${Kr(r, e)} + setOutputAtCoords(coords[0], coords[1], coords[2], value); + } + } + `; +} +var wre = (r) => r ? ` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + kStart + inputRow, + globalRowStart / InnerElementSize + inputCol); + ` : ` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + globalRow + innerRow, + kStart / InnerElementSize + inputCol); + `; +var Sre = (r, e) => r ? ` + let ACached0 = mm_Asub[k * InnerElementSize][localRow]; + let ACached1 = mm_Asub[k * InnerElementSize + 1][localRow]; + let ACached2 = mm_Asub[k * InnerElementSize + 2][localRow]; + ${e === 3 ? "" : "let ACached3 = mm_Asub[k * InnerElementSize + 3][localRow];"} + for (var i = 0; i < RowPerThread; i = i + 1) { + acc[i] = BCached0 * ACached0[i] + acc[i]; + acc[i] = BCached1 * ACached1[i] + acc[i]; + acc[i] = BCached2 * ACached2[i] + acc[i]; + ${e === 3 ? "" : "acc[i] = BCached3 * ACached3[i] + acc[i];"} + }` : ` + for (var i = 0; i < RowPerThread; i = i + 1) { + let ACached = mm_Asub[tileRow + i][k]; + acc[i] = BCached0 * ACached.x + acc[i]; + acc[i] = BCached1 * ACached.y + acc[i]; + acc[i] = BCached2 * ACached.z + acc[i]; + ${e === 3 ? "" : "acc[i] = BCached3 * ACached.w + acc[i];"} + }`; +function Uu(r, e, t10 = false, o = 32, n = false, s = 32, a = false) { + let i = e[1] * r[1], p = e[0] * r[0], u = t10 ? i : o, c = t10 ? o : i, l = u / e[0], m = o / e[1]; + return x.assert((t10 && l === 4 && r[1] === 4 || !t10 && (l === 3 || l === 4)) && u % e[0] === 0 && o % e[1] === 0 && r[0] === 4, () => `If transposeA ${t10} is true, innerElementSize ${l} and workPerThread[1] ${r[1]} must be 4. + Otherwise, innerElementSize ${l} must be 3 or 4. + tileAWidth ${u} must be divisible by workGroupSize[0]${e[0]}. tileInner ${o} must be divisible by workGroupSize[1] ${e[1]}. ColPerThread ${r[0]} must be 4.`), ` + var mm_Asub : array, ${u / l}>, ${c}>; + var mm_Bsub : array, ${p / r[0]}>, ${o}>; + + const RowPerThread = ${r[1]}; + const ColPerThread = ${r[0]}; + const InnerElementSize = ${l}; + const TileInner = ${o}; + + @compute @workgroup_size(workGroupSizeX, workGroupSizeY, workGroupSizeZ) + fn _start(@builtin(local_invocation_id) LocalId : vec3, + @builtin(global_invocation_id) GlobalId : vec3, + @builtin(num_workgroups) NumWorkgroups: vec3, + @builtin(workgroup_id) workgroupId: vec3) { + localId = LocalId; + globalId = GlobalId; + numWorkgroups = NumWorkgroups; + + let localRow = i32(localId.y); + let tileRow = ${a ? "0" : "localRow * RowPerThread"}; + let tileCol = i32(localId.x); + + let globalRow = ${a ? "0" : "i32(globalId.y) * RowPerThread"}; + let globalCol = i32(globalId.x); + let batch = ${n ? "0" : "i32(globalId.z)"}; + let globalRowStart = i32(workgroupId.y) * ${i}; + + let numTiles = ${n ? `${Math.ceil(s / o)}` : "(uniforms.dimInner - 1) / TileInner + 1"}; + var kStart = ${n ? `i32(globalId.z) * ${s}` : "0"}; + + var acc: array, RowPerThread>; + + // Loop over shared dimension. + let tileRowB = localRow * ${m}; + for (var t = 0; t < numTiles; t = t + 1) { + // Load one tile of A into local memory. + for (var innerRow = 0; innerRow < RowPerThread; innerRow = innerRow + 1) { + let inputRow = tileRow + innerRow; + let inputCol = tileCol; + ${wre(t10)} + } + + // Load one tile of B into local memory. + for (var innerRow = 0; innerRow < ${m}; innerRow = innerRow + 1) { + let inputRow = tileRowB + innerRow; + let inputCol = tileCol; + mm_Bsub[inputRow][inputCol] = mm_readB(batch, kStart + inputRow, globalCol); + } + kStart = kStart + TileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + for (var k = 0; k < TileInner / InnerElementSize; k = k + 1) { + let BCached0 = mm_Bsub[k * InnerElementSize][tileCol]; + let BCached1 = mm_Bsub[k * InnerElementSize + 1][tileCol]; + let BCached2 = mm_Bsub[k * InnerElementSize + 2][tileCol]; + ${l === 3 ? "" : "let BCached3 = mm_Bsub[k * InnerElementSize + 3][tileCol];"} + + ${Sre(t10, l)} + } + + workgroupBarrier(); + } + + for (var innerRow = 0; innerRow < RowPerThread; innerRow = innerRow + 1) { + mm_write(batch, globalRow + innerRow, globalCol, acc[innerRow]); + } + }`; +} +var oM = (r) => r ? ` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + kStart + inputRow, + globalRowStart + inputCol); + ` : ` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + globalRowStart + inputRow, + kStart + inputCol); + `; +var vre = (r) => r ? "let ACached = mm_Asub[k][tileRow + innerRow];" : "let ACached = mm_Asub[tileRow + innerRow][k];"; +function Gu(r, e, t10 = false, o = 32, n = false, s = 32, a = false) { + let i = r[1] * e[1], p = r[0] * e[0], u = t10 ? i : o, c = t10 ? o : i; + x.assert(c % e[1] === 0 && u % e[0] === 0 && o % e[1] === 0, () => `tileAHight ${c} must be divisible by workGroupSize[1]${e[1]}, tileAWidth ${u} must be divisible by workGroupSize[0]${e[0]}, tileInner ${o} must be divisible by workGroupSize[1]${e[1]}`); + let l = c / e[1], m = u / e[0], f = o / e[1], d = a ? ` + let localRow = i32(localId.y); + let localCol = i32(localId.x); + let globalRowStart = i32(workgroupId.y) * ${i}; + let globalColStart = i32(workgroupId.x) * ${p}; + + // Loop over shared dimension. + for (var t = 0; t < numTiles; t = t + 1) { + // Load one tile of A into local memory. + for (var inputRow = localRow; inputRow < ${c}; inputRow = inputRow + ${e[1]}) { + for (var inputCol = localCol; inputCol < ${u}; inputCol = inputCol + ${e[0]}) { + ${oM(t10)} + } + } + // Load one tile of B into local memory. + for (var inputRow = localRow; inputRow < ${o}; inputRow = inputRow + ${e[1]}) { + for (var inputCol = localCol; inputCol < ${p}; inputCol = inputCol + ${e[0]}) { + mm_Bsub[inputRow][inputCol] = mm_readB(batch, + kStart + inputRow, + globalColStart + inputCol); + } + } + kStart = kStart + TileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + var BCached : array; + for (var k = 0; k < TileInner; k = k + 1) { + for (var inner = 0; inner < ColPerThread; inner = inner + 1) { + BCached[inner] = mm_Bsub[k][localCol + inner * ${e[0]}]; + } + for (var innerRow = 0; innerRow < RowPerThread; innerRow = innerRow + 1) { + let ACached = ${t10 ? `mm_Asub[k][localRow + innerRow * ${e[1]}];` : `mm_Asub[localRow + innerRow * ${e[1]}][k];`} + for (var innerCol = 0; innerCol < ColPerThread; innerCol = innerCol + 1) { + acc[innerRow][innerCol] = acc[innerRow][innerCol] + + ACached * BCached[innerCol]; + } + } + } + workgroupBarrier(); + } + for (var innerRow = 0; innerRow < RowPerThread; innerRow = innerRow + 1) { + let gRow = globalRowStart + localRow + innerRow * ${e[1]}; + for (var innerCol = 0; innerCol < ColPerThread; innerCol = innerCol + 1) { + let gCol = globalColStart + localCol + innerCol * ${e[0]}; + mm_write(batch, gRow, gCol, acc[innerRow][innerCol]); + } + } + ` : ` + let tileRow = i32(localId.y) * RowPerThread; + let tileCol = i32(localId.x) * ColPerThread; + + let globalRow = i32(globalId.y) * RowPerThread; + let globalCol = i32(globalId.x) * ColPerThread; + let globalRowStart = i32(workgroupId.y) * ${i}; + + let tileRowA = i32(localId.y) * ${l}; + let tileColA = i32(localId.x) * ${m}; + let tileRowB = i32(localId.y) * ${f}; + // Loop over shared dimension. + for (var t = 0; t < numTiles; t = t + 1) { + // Load one tile of A into local memory. + for (var innerRow = 0; innerRow < ${l}; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < ${m}; innerCol = innerCol + 1) { + let inputRow = tileRowA + innerRow; + let inputCol = tileColA + innerCol; + ${oM(t10)} + } + } + + // Load one tile of B into local memory. + for (var innerRow = 0; innerRow < ${f}; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < ColPerThread; innerCol = innerCol + 1) { + let inputRow = tileRowB + innerRow; + let inputCol = tileCol + innerCol; + mm_Bsub[inputRow][inputCol] = mm_readB(batch, + kStart + inputRow, + globalCol + innerCol); + } + } + kStart = kStart + TileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + var BCached : array; + for (var k = 0; k < TileInner; k = k + 1) { + for (var inner = 0; inner < ColPerThread; inner = inner + 1) { + BCached[inner] = mm_Bsub[k][tileCol + inner]; + } + + for (var innerRow = 0; innerRow < RowPerThread; innerRow = innerRow + 1) { + ${vre(t10)} + for (var innerCol = 0; innerCol < ColPerThread; innerCol = innerCol + 1) { + acc[innerRow][innerCol] = acc[innerRow][innerCol] + ACached * BCached[innerCol]; + } + } + } + + workgroupBarrier(); + } + + for (var innerRow = 0; innerRow < RowPerThread; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < ColPerThread; innerCol = innerCol + 1) { + mm_write(batch, globalRow + innerRow, globalCol + innerCol, + acc[innerRow][innerCol]); + } + } + `; + return ` + var mm_Asub : array, ${c}>; + var mm_Bsub : array, ${o}>; + const RowPerThread = ${r[1]}; + const ColPerThread = ${r[0]}; + const TileInner = ${o}; + + @compute @workgroup_size(workGroupSizeX, workGroupSizeY, workGroupSizeZ) + fn _start(@builtin(local_invocation_id) LocalId : vec3, + @builtin(global_invocation_id) GlobalId : vec3, + @builtin(num_workgroups) NumWorkgroups: vec3, + @builtin(workgroup_id) workgroupId: vec3) { + localId = LocalId; + globalId = GlobalId; + numWorkgroups = NumWorkgroups; + + let batch = ${n ? "0" : "i32(globalId.z)"}; + let numTiles = ${n ? `${Math.ceil(s / o)}` : "(uniforms.dimInner - 1) / TileInner + 1"}; + var kStart = ${n ? `i32(globalId.z) * ${s}` : "0"}; + + var acc : array, RowPerThread>; + + // Without this initialization strange values show up in acc. + for (var innerRow = 0; innerRow < RowPerThread; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < ColPerThread; innerCol = innerCol + 1) { + acc[innerRow][innerCol] = 0.0; + } + } + ${d} + } + `; +} +var kre = (r) => r ? ` + mm_readA(batch, colA, globalRow), + mm_readA(batch, colA + 1, globalRow), + mm_readA(batch, colA + 2, globalRow), + mm_readA(batch, colA + 3, globalRow) + ` : ` + mm_readA(batch, globalRow, colA), + mm_readA(batch, globalRow, colA + 1), + mm_readA(batch, globalRow, colA + 2), + mm_readA(batch, globalRow, colA + 3) + `; +function Tre(r, e = false) { + return x.assert(r[1] === 1 && r[2] === 1, () => `A linear work group size is required. But got ${r}.`), ` + const TileSize = ${r[0] * 4}; + var mm_Asub : array, ${r[0]}>; + + ${ue()} { + let tileCol = i32(localId.x); + let globalCol = i32(globalId.x); + let globalRow = i32(globalId.y); + + let numTiles = (uniforms.dimInner - 1) / TileSize + 1; + let batch = i32(globalId.z); + // Without this initialization strange values show up in acc. + var acc = 0.0; + + // Loop over shared dimension. + for (var t = 0; t < numTiles; t = t + 1) { + // Load one tile of A into local memory. + let colA = t * TileSize + tileCol * 4; + mm_Asub[tileCol] = vec4(${kre(e)}); + workgroupBarrier(); + + // Compute acc values for a single thread. + for (var k = 0; k < TileSize / 4; k = k + 1) { + let rowB = t * TileSize + k * 4; + let BCached = vec4(mm_readB(batch, rowB, globalCol), + mm_readB(batch, rowB + 1, globalCol), + mm_readB(batch, rowB + 2, globalCol), + mm_readB(batch, rowB + 3, globalCol)); + + let ACached = mm_Asub[k]; + acc = acc + dot(ACached, BCached); + } + + workgroupBarrier(); + } + + mm_write(batch, globalRow, globalCol, acc); + } + `; +} +var Bg = class { + constructor(e, t10, o, n, s = false, a = false, i = null, p = null, u = null, c = false) { + this.variableNames = ["A", "B"], this.uniforms = "dimAOuter : i32, dimBOuter : i32, dimInner : i32,", this.outputShape = t10, this.dispatchLayout = { x: [2], y: [1], z: [0] }; + let l = s ? e[1] : e[2]; + if (this.isVec4 = (l % 4 === 0 && !s || t10[1] % 4 === 0 && s) && t10[2] % 4 === 0 && !a, this.isVectorA = t10[1] === 1 && !s, !this.isVec4 && this.isVectorA) + this.elementsPerThread = [1, 1, 1], this.workGroupSize = [32, 1, 1]; + else { + let d = aS(t10[1], l, t10[2], s); + this.workGroupSize = d.workGroupSize, this.elementsPerThread = d.elementsPerThread; + } + this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize, this.elementsPerThread); + let m = i != null, f = u != null; + m && this.variableNames.push("bias"), f && this.variableNames.push("preluActivationWeights"), this.sequentialAccessByThreads = c, this.transposeA = s, this.transposeB = a, this.addBias = m, this.activation = p, this.hasPreluActivationWeights = f, this.batchAEqualOne = o, this.batchBEqualOne = n, [this.fitAOuter, this.fitBOuter, this.fitInner] = this.getShapeFit(t10[1], t10[2], l), this.shaderKey = `matMulPacked_${this.elementsPerThread}_${s}_${a}_${this.activation}_${this.fitAOuter}_${this.fitBOuter}_${this.fitInner}_${this.isVec4}_${this.isVectorA}_${this.batchAEqualOne}_${this.batchBEqualOne}_${this.sequentialAccessByThreads}`; + } + getShapeFit(e, t10, o) { + let n = this.workGroupSize[1] * this.elementsPerThread[1], s = this.workGroupSize[0] * this.elementsPerThread[0]; + !this.isVec4 && this.isVectorA ? this.tileInner = this.workGroupSize[0] * 4 : this.tileInner = s; + let a = e % n === 0, i = t10 % s === 0, p = o % this.tileInner === 0; + return [a, i, p]; + } + getUserCode() { + return ` + ${ur(this.activation, this.hasPreluActivationWeights, this.isVec4)} + ${jl(this.addBias, this.activation, this.batchAEqualOne, this.batchBEqualOne, false, this.transposeB, this.fitAOuter, this.fitBOuter, this.fitInner, this.isVec4 ? 4 : 1)} + ${this.isVec4 ? Uu(this.elementsPerThread, this.workGroupSize, this.transposeA, this.tileInner, false, null, this.isVectorA) : this.isVectorA ? Tre(this.workGroupSize, this.transposeA) : Gu(this.elementsPerThread, this.workGroupSize, this.transposeA, this.tileInner, false, null, this.sequentialAccessByThreads)} + `; + } +}; +function Nre() { + return ` + var sumValues : array; + ${ue()} { + let coords = getOutputCoords(); + let batch = coords[0]; + let row = coords[1]; + let col = coords[2]; + var sum = 0.0; + let Length = uniforms.dimInner; + for (var k = i32(localId.x); k < Length; k = k + i32(workGroupSizeX)) { + let dataA = mm_readA(batch, row, k); + let dataB = mm_readB(batch, k, col); + sum = sum + dataA * dataB; + } + sumValues[localId.x] = sum; + workgroupBarrier(); + + for(var currentSize = workGroupSizeX / 2u; currentSize > 1u; + currentSize = currentSize / 2u) { + if (localId.x < currentSize) + { + sumValues[localId.x] = sumValues[localId.x] + sumValues[localId.x + currentSize]; + } + workgroupBarrier(); + } + + if (localId.x == 0u) { + sum = sumValues[0] + sumValues[1]; + mm_write(batch, row, col, sum); + } + } + `; +} +var Vg = class { + constructor(e, t10, o, n = false, s = false, a = null, i = null, p = null) { + this.variableNames = ["A", "B"], this.uniforms = "dimAOuter : i32, dimBOuter : i32, dimInner : i32,", this.workGroupSize = [256, 1, 1], this.outputShape = e, this.dispatchLayout = { x: [], y: [1, 2], z: [0] }, this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize); + let u = a != null, c = p != null; + u && this.variableNames.push("bias"), c && this.variableNames.push("preluActivationWeights"), this.transposeA = n, this.transposeB = s, this.addBias = u, this.activation = i, this.hasPreluActivationWeights = c, this.batchAEqualOne = t10, this.batchBEqualOne = o, this.shaderKey = `matMulReduce_${this.activation}_${n}_${s}_${this.batchAEqualOne}_${this.batchBEqualOne}`; + } + getUserCode() { + return ` + ${ur(this.activation, this.hasPreluActivationWeights)} + ${jl(this.addBias, this.activation, this.batchAEqualOne, this.batchBEqualOne, this.transposeA, this.transposeB)} + ${Nre()} + `; + } +}; +function _re(r) { + let e = r[1], t10 = r[0], o = e > t10 ? e : t10; + return ` + var mm_Asub : array, ${e}>; + var mm_Bsub : array, ${o}>; + + // If the output size is small for matrix multiplication, avoid to use vec4 + // and handle some elements per thread to optimally utilize the ALU. + // Read data from global memory to registers firstly, then store them into + // shared memory, so it is instruction-Level parallelism for arithmetic + // operations and others handle IO operations between barrier api, makes ALU + // and load/store units work simultaneously, could improves the performance. + ${ue()} { + let tileRow = i32(localId.y); + let tileCol = i32(localId.x); + let globalRow = i32(globalId.y); + let globalCol = i32(globalId.x); + let batch = i32(globalId.z); + + // uniforms.dimInner should be greater than 0. + let numTiles = (uniforms.dimInner - 1) / ${o} + 1; + var acc = 0.0; + + var globalColA = tileCol; + var globalRowB = 0; + var regA = mm_readA(batch, globalRow, globalColA); + var regB0 = mm_readB(batch, globalRowB + 2 * tileRow, globalCol); + var regB1 = mm_readB(batch, globalRowB + 2 * tileRow + 1, globalCol); + globalColA = globalColA + ${o}; + globalRowB = globalRowB + ${o}; + + for (var t = 0; t < numTiles; t = t + 1) { + mm_Asub[tileRow][tileCol] = regA; + mm_Bsub[2 * tileRow][tileCol] = regB0; + mm_Bsub[2 * tileRow + 1][tileCol] = regB1; + + workgroupBarrier(); + + regA = mm_readA(batch, globalRow, globalColA); + regB0 = mm_readB(batch, globalRowB + 2 * tileRow, globalCol); + regB1 = mm_readB(batch, globalRowB + 2 * tileRow + 1, globalCol); + globalColA = globalColA + ${o}; + globalRowB = globalRowB + ${o}; + + for (var k = 0; k < ${o}; k = k + 1) { + acc = acc + mm_Asub[tileRow][k] * mm_Bsub[k][tileCol]; + } + workgroupBarrier(); + } + + mm_write(batch, globalRow, globalCol, acc); + } + `; +} +var zg = class { + constructor(e, t10, o, n = false, s = false, a = null, i = null, p = null) { + this.variableNames = ["A", "B"], this.uniforms = "dimAOuter : i32, dimBOuter : i32, dimInner : i32,", this.workGroupSize = [16, 8, 1], this.outputShape = o, this.dispatchLayout = { x: [2], y: [1], z: [0] }, this.dispatch = [Math.ceil(o[2] / this.workGroupSize[0]), Math.ceil(o[1] / this.workGroupSize[1]), o[0]]; + let u = a != null; + u && this.variableNames.push("bias"); + let c = p != null; + c && this.variableNames.push("preluActivationWeights"), this.transposeA = n, this.transposeB = s, this.addBias = u, this.activation = i, this.hasPreluActivationWeights = c, this.batchAEqualOne = e[0] === 1, this.batchBEqualOne = t10[0] === 1, this.shaderKey = `matMulSmallOutputSize_${this.activation}_${n}_${s}_${this.batchAEqualOne}_${this.batchBEqualOne}`; + } + getUserCode() { + return ` + ${ur(this.activation, this.hasPreluActivationWeights)} + ${jl(this.addBias, this.activation, this.batchAEqualOne, this.batchBEqualOne, this.transposeA, this.transposeB)} + ${_re(this.workGroupSize)} + `; + } +}; +var Wg = class { + constructor(e, t10, o, n, s = false, a = false) { + this.variableNames = ["A", "B"], this.uniforms = "dimAOuter : i32, dimBOuter : i32, dimInner : i32,", this.workGroupSize = [8, 8, 1], this.atomic = true, this.isVec4 = false, this.splitedDimInner = 128, x.assert(e[0] === 1, () => "MatMulSplitKProgram only supports batch = 1."), this.outputShape = e, this.dispatchLayout = { x: [2], y: [1], z: [0, 3] }, this.isVec4 = (s && this.outputShape[1] % 4 === 0 || !s && t10 % 4 === 0) && this.outputShape[2] % 4 === 0, this.elementsPerThread = [4, 4, this.splitedDimInner], this.isVec4 || (this.outputShape[1] < 16 && (this.elementsPerThread[1] = 1), this.outputShape[2] < 16 && (this.elementsPerThread[0] = 1)), this.dispatch = ae(this.dispatchLayout, [this.outputShape[0], this.outputShape[1], this.outputShape[2], t10], this.workGroupSize, this.elementsPerThread), this.transposeA = s, this.transposeB = a, this.batchAEqualOne = o, this.batchBEqualOne = n, this.shaderKey = `matMulSplitK_${s}_${a}_${o}_${n}_${this.elementsPerThread}_${this.isVec4}`; + } + getUserCode() { + let e = (n) => ` + for (var i = 0; i < ${n}; i = i + 1) + { + var oldValue = atomicLoad(&(result[flatIndex + i])); + var exchanged = false; + for (; !exchanged;) { + let newValueF32 = bitcast(oldValue) + ${n > 1 ? "value[i]" : "value"}; + let newValue = bitcast(newValueF32); + let res = atomicCompareExchangeWeak(&(result[flatIndex + i]), oldValue, newValue); + oldValue = res.old_value; + exchanged = res.exchanged; + } + } + `, t10 = this.isVec4 ? 4 : 1; + return ` + ${lS(this.batchAEqualOne, this.batchBEqualOne, false, this.transposeB, false, false, false, t10)} + fn mm_write(batch: i32, row : i32, colIn : i32, value : ${vt(t10)}) { + let col = colIn * ${t10}; + if (row < uniforms.dimAOuter && col < uniforms.dimBOuter) { + let coords = vec3(batch, row, col); + let flatIndex = getOutputIndexFromCoords(coords); + // The problem is that we should initialize output to zero before using. + // Otherwise, the original value will be added to the result. + ${e(t10)} + } + } + ${this.isVec4 ? Uu(this.elementsPerThread, this.workGroupSize, this.transposeA, 32, true, this.splitedDimInner) : Gu(this.elementsPerThread, this.workGroupSize, this.transposeA, 32, true, this.splitedDimInner)} + `; + } +}; +var Ug = class { + constructor(e, t10 = null, o = null, n = null) { + this.uniforms = "", this.variableNames = ["x"], this.workGroupSize = [64, 1, 1], this.size = true, this.outputShape = e, this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize), this.addBias = t10 != null, this.hasPreluActivationWeights = n != null, this.activation = o, this.addBias && this.variableNames.push("bias"), this.hasPreluActivationWeights && this.variableNames.push("preluActivationWeights"), this.shaderKey = `biasActivation_${o}`; + } + getUserCode() { + return ` + ${ur(this.activation, this.hasPreluActivationWeights)} + ${ue("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + var value = getXByOutputIndex(index); + ${Kr(this.addBias, this.activation)} + setOutputAtIndex(index, value); + } + } + `; + } +}; +var Gg = class { + constructor(e) { + this.variableNames = [], this.outputShape = [], this.uniforms = "value : f32,", this.workGroupSize = [64, 1, 1], this.size = true, this.outputShape = e, this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize), this.shaderKey = "fill"; + } + getUserCode() { + return ` + ${ue("index")} { + if (index < uniforms.size) { + setOutputAtIndex(index, uniforms.value); + } + } + `; + } +}; +function $o(r) { + let { backend: e, attrs: t10 } = r, { shape: o, value: n } = t10, { dtype: s } = t10; + if (s = s || x.inferDtype(n), s === "string") { + let a = x.getArrayFromDType(s, x.sizeFromShape(o)); + return a.fill(n), e.makeTensorInfo(o, s, a); + } else { + let a = new Gg(o), i = [{ type: "float32", data: [n] }]; + return e.runWebGPUProgram(a, [], s, i); + } +} +var nM = { kernelName: ys, backendName: "webgpu", kernelFunc: $o }; +function xe(r) { + let { inputs: e, attrs: t10 } = r, { x: o } = e, { shape: n } = t10, s = x.sizeFromShape(o.shape), a = x.inferFromImplicitShape(n, s), i = x.sizeFromShape(a); + return x.assert(s === i, () => `The new shape (${a}) has ${i} elements and the old shape (${o.shape}) has ${s} elements. The new shape and old shape must have the same number of elements.`), r.backend.incRef(o.dataId), { dataId: o.dataId, shape: a, dtype: o.dtype }; +} +var sM = { kernelName: Ss, backendName: "webgpu", kernelFunc: xe }; +function _c({ a: r, b: e, transposeA: t10, transposeB: o, backend: n, bias: s = null, preluActivationWeights: a = null, leakyreluAlpha: i = 0, activation: p = null }) { + let u = r.shape.length, c = e.shape.length, l = t10 ? r.shape[u - 2] : r.shape[u - 1], m = o ? e.shape[c - 1] : e.shape[c - 2], f = t10 ? r.shape[u - 1] : r.shape[u - 2], d = o ? e.shape[c - 2] : e.shape[c - 1], h = r.shape.slice(0, -2), g = e.shape.slice(0, -2), y = x.sizeFromShape(h), b = x.sizeFromShape(g), w = br.assertAndGetBroadcastShape(r.shape.slice(0, -2), e.shape.slice(0, -2)).concat([f, d]); + x.assert(l === m, () => `Error in matMul: inner shapes (${l}) and (${m}) of Tensors with shapes ${r.shape} and ${e.shape} and transposeA=${t10} and transposeB=${o} must match.`); + let k = t10 ? [y, l, f] : [y, f, l], _ = o ? [b, d, m] : [b, m, d], E = xe({ inputs: { x: r }, backend: n, attrs: { shape: k } }), R = xe({ inputs: { x: e }, backend: n, attrs: { shape: _ } }), A = [E, R], D = Math.max(y, b), O = y === 1, M = b === 1, L = [E, R], W = [{ type: "int32", data: [f] }, { type: "int32", data: [d] }, { type: "int32", data: [l] }], V, G, q = [D, f, d], H = P().get("WEBGPU_MATMUL_PROGRAM_TYPE"); + switch (H < 0 && (f * d <= 128 ? H = Qo.MatMulReduceProgram : D === 1 && f <= 128 && d <= 48 && m >= 2e3 ? H = Qo.MatMulSplitKProgram : f <= 16 && (d <= 512 || m >= 2 * d) || d <= 16 && (f <= 512 || l >= 2 * f) ? H = Qo.MatMulSmallOutputSizeProgram : H = Qo.MatMulPackedProgram), H) { + case Qo.MatMulReduceProgram: + V = new Vg(q, O, M, t10, o, s, p, a); + break; + case Qo.MatMulSplitKProgram: { + if (G = $o({ backend: n, attrs: { shape: q, value: 0, dtype: r.dtype } }), V = new Wg(q, m, O, M, t10, o), s || p) { + G = n.runWebGPUProgram(V, L, r.dtype, W, G); + let Z = new Ug(G.shape, s, p, a), ee = null, X = [G]; + s && X.push(s), a && X.push(a), p === "leakyrelu" && (ee = [{ type: "float32", data: [i] }], Z.uniforms += " alpha : f32,"); + let Q = n.runWebGPUProgram(Z, X, G.dtype, ee); + A.push(G); + let se = xe({ inputs: { x: Q }, backend: n, attrs: { shape: w } }); + A.push(Q); + for (let ie of A) + n.disposeData(ie.dataId); + return se; + } + break; + } + case Qo.MatMulSmallOutputSizeProgram: + V = new zg(k, _, q, t10, o, s, p, a); + break; + case Qo.MatMulPackedProgram: + let Y = n.adapterInfo.isIntel(); + V = new Bg(k, q, O, M, t10, o, s, p, a, Y); + break; + default: + throw new Error(`Unsupported MatMulProgramType ${H}.`); + } + s && L.push(s), a && L.push(a), p === "leakyrelu" && (W.push({ type: "float32", data: [i] }), V.uniforms += " alpha : f32,"), G = n.runWebGPUProgram(V, L, r.dtype, W, G); + let j = xe({ inputs: { x: G }, backend: n, attrs: { shape: w } }); + A.push(G); + for (let Y of A) + n.disposeData(Y.dataId); + return j; +} +function Ere(r) { + let { inputs: e, backend: t10, attrs: o } = r, { a: n, b: s, bias: a, preluActivationWeights: i } = e, { transposeA: p, transposeB: u, activation: c, leakyreluAlpha: l } = o; + return _c({ a: n, b: s, transposeA: p, transposeB: u, backend: t10, bias: a, preluActivationWeights: i, leakyreluAlpha: l, activation: c }); +} +var aM = { kernelName: Fo, backendName: "webgpu", kernelFunc: Ere }; +var Xl = class { + constructor(e, t10, o) { + this.variableNames = ["AReal", "AImag", "BReal", "BImag"], this.workGroupSize = [128, 1, 1], this.size = true, this.outputShape = I.assertAndGetBroadcastShape(t10, o), this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize), this.shaderKey = `binaryOpComplex_${e}`, this.op = e; + } + getUserCode() { + return ` + fn binaryOpComplex( + areal : f32, aimag : f32, breal : f32, bimag : f32) -> f32 { + ${Nc(this.op, false)} + } + + ${ue("index")} { + if(index < uniforms.size) { + let areal = getARealByOutputIndex(index); + let aimag = getAImagByOutputIndex(index); + let breal = getBRealByOutputIndex(index); + let bimag = getBImagByOutputIndex(index); + setOutputAtIndex(index, binaryOpComplex(areal, aimag, breal, bimag)); + } + } + `; + } +}; +var Hu = class { + constructor(e, t10, o) { + this.size = true, this.variableNames = ["A", "B"], this.outputShape = I.assertAndGetBroadcastShape(t10, o), this.dispatchLayout = fe(this.outputShape), this.op = e, this.useSharedMemoryWithA = t10.length <= 1 && o.length > 1 && t10[0] < 128, this.useSharedMemoryWithB = o.length <= 1 && t10.length > 1 && o[0] < 128, this.useSharedMemoryWithA || this.useSharedMemoryWithB ? (this.isVec4 = false, this.lastDimensionSize = this.useSharedMemoryWithB ? o[0] : t10[0], this.shaderKey = `binary_${this.type}_${e}_${this.lastDimensionSize}_${this.useSharedMemoryWithB}`, this.type = "shared", this.workGroupSize = [256, 1, 1], this.workPerThread = 1) : (x.arraysEqual(t10, o) && x.sizeFromShape(t10) % 4 === 0 ? (this.isVec4 = true, this.type = "vec4", this.workPerThread = 4) : (this.isVec4 = false, this.type = "plain", this.workPerThread = 1), this.shaderKey = `binary_${this.type}_${e}`, this.workGroupSize = [128, 1, 1]), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize, [this.workPerThread, 1, 1]); + } + getUserCode() { + let e, t10 = this.isVec4 ? "vec4" : "f32", o = ` + fn binaryOperation(a : ${t10}, b : ${t10}) -> ${t10} { + ${Nc(this.op, this.isVec4)} + }; + `; + if (this.type === "shared") { + let n = this.lastDimensionSize > 1 ? `coords[${this.outputShape.length - 1}]` : "0", s = this.useSharedMemoryWithB ? `let a = getAByOutputIndex(index); + let b = sharedBuf[${n}];` : `let a = sharedBuf[${n}]; + let b = getBByOutputIndex(index);`; + e = ` + ${o} + var sharedBuf : array; + ${ue("index")} { + // Fill in the shared memory buffer. + let localIndex = i32(localId.x); + if(localIndex < ${this.lastDimensionSize}) { + sharedBuf[localIndex] = f32(${this.useSharedMemoryWithB ? "B" : "A"}[localIndex]); + } + workgroupBarrier(); + + if(index < uniforms.size) { + let coords = getCoordsFromIndex(index); + ${s} + setOutputAtIndex(index, binaryOperation(a, b)); + } + } + `; + } else + e = ` + ${o} + ${ue("index")} { + if (index < uniforms.size) { + let a = getAByOutputIndex(index); + let b = getBByOutputIndex(index); + setOutputAtIndex(index, binaryOperation(a, b)); + } + } + `; + return e; + } +}; +function Lt(r) { + let { inputs: e } = r, { x: t10 } = e; + return r.backend.incRef(t10.dataId), { dataId: t10.dataId, shape: t10.shape, dtype: t10.dtype }; +} +var iM = { kernelName: uo, backendName: "webgpu", kernelFunc: Lt }; +function ls(r) { + let { inputs: e, backend: t10 } = r, { real: o, imag: n } = e, s = t10.makeTensorInfo(o.shape, "complex64"), a = t10.tensorMap.get(s.dataId), i = Lt({ inputs: { x: o }, backend: t10 }), p = Lt({ inputs: { x: n }, backend: t10 }); + return a.complexTensorInfos = { real: i, imag: p }, s; +} +var uM = { kernelName: aa, backendName: "webgpu", kernelFunc: ls }; +var Zo = class { + constructor(e, t10) { + this.variableNames = ["A"], this.size = true; + let o = 128; + this.workGroupSize = [o, 1, 1], this.outputShape = e, this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize), this.op = t10, this.shaderKey = `unary_${t10}`; + } + getUserCode() { + return ` + fn unaryOperation(a : f32) -> f32 { + ${za(this.op, false)} + } + ${ue("index")} { + if (index < uniforms.size) { + let a = getAByOutputIndex(index); + setOutputAtIndex(index, unaryOperation(a)); + } + } + `; + } +}; +function Ge({ opType: r, cpuKernelImpl: e, dtype: t10 }) { + return ({ inputs: o, backend: n }) => { + let { x: s } = o, a = n, i = t10 || s.dtype; + if (a.shouldExecuteOnCPU([s]) && e != null) { + let u = a.tensorMap.get(s.dataId), c = e(u.values, i); + return a.makeTensorInfo(s.shape, i, c); + } + let p = new Zo(s.shape, r); + return a.runWebGPUProgram(p, [s], i); + }; +} +function it({ opType: r, cpuKernelImpl: e, supportsComplex: t10 = false, dtype: o }) { + return ({ inputs: n, backend: s }) => { + let { a, b: i } = n, p = s; + if (t10 && a.dtype === "complex64") { + let l = p.tensorMap.get(a.dataId), m = p.tensorMap.get(i.dataId), f, d; + if (r !== ye.MUL) + [f, d] = [[l.complexTensorInfos.real, m.complexTensorInfos.real], [l.complexTensorInfos.imag, m.complexTensorInfos.imag]].map((g) => { + let [y, b] = g, C = { dataId: y.dataId, dtype: y.dtype, shape: a.shape }, w = { dataId: b.dataId, dtype: b.dtype, shape: i.shape }, k = new Hu(r, a.shape, i.shape); + return p.runWebGPUProgram(k, [C, w], ct(y.dtype, b.dtype)); + }); + else { + let g = new Xl(ye.COMPLEX_MULTIPLY_REAL, a.shape, i.shape), y = new Xl(ye.COMPLEX_MULTIPLY_IMAG, a.shape, i.shape), b = [{ dataId: l.complexTensorInfos.real.dataId, dtype: l.complexTensorInfos.real.dtype, shape: a.shape }, { dataId: l.complexTensorInfos.imag.dataId, dtype: l.complexTensorInfos.imag.dtype, shape: a.shape }, { dataId: m.complexTensorInfos.real.dataId, dtype: m.complexTensorInfos.real.dtype, shape: i.shape }, { dataId: m.complexTensorInfos.imag.dataId, dtype: m.complexTensorInfos.imag.dtype, shape: i.shape }]; + f = p.runWebGPUProgram(g, b, "float32"), d = p.runWebGPUProgram(y, b, "float32"); + } + let h = ls({ inputs: { real: f, imag: d }, backend: p }); + return p.disposeData(f.dataId), p.disposeData(d.dataId), h; + } + let u = o || ct(a.dtype, i.dtype); + if ((a.dtype === "string" || i.dtype === "string" || p.shouldExecuteOnCPU([a, i])) && e != null) { + let l = p.tensorMap.get(a.dataId).values, m = p.tensorMap.get(i.dataId).values, f = a.dtype === "string" ? I.fromUint8ToStringArray(l) : l, d = a.dtype === "string" ? I.fromUint8ToStringArray(m) : m, [h, g] = e(a.shape, i.shape, f, d, u); + return p.makeTensorInfo(g, u, h); + } + let c = new Hu(r, a.shape, i.shape); + return p.runWebGPUProgram(c, [a, i], u); + }; +} +var FS = {}; +Be(FS, { addImpl: () => dS, bincountImpl: () => lM, bincountReduceImpl: () => mM, castImpl: () => fS, ceilImpl: () => hS, concatImpl: () => fM, equalImpl: () => gS, expImpl: () => xS, expm1Impl: () => yS, floorImpl: () => bS, gatherNdImpl: () => dM, gatherV2Impl: () => hM, greaterEqualImpl: () => IS, greaterImpl: () => CS, lessEqualImpl: () => SS, lessImpl: () => wS, linSpaceImpl: () => gM, logImpl: () => vS, maxImpl: () => xM, maximumImpl: () => kS, minimumImpl: () => TS, multiplyImpl: () => Ql, negImpl: () => yM, notEqualImpl: () => NS, prodImpl: () => bM, raggedGatherImpl: () => IM, raggedTensorToTensorImpl: () => vM, rangeImpl: () => kM, rsqrtImpl: () => ES, scatterImpl: () => TM, sigmoidImpl: () => NM, simpleAbsImpl: () => pM, sliceImpl: () => _M, sparseFillEmptyRowsImpl: () => EM, sparseReshapeImpl: () => $M, sparseSegmentReductionImpl: () => RM, sqrtImpl: () => AM, squaredDifferenceImpl: () => $S, stridedSliceImpl: () => FM, stringNGramsImpl: () => DM, stringSplitImpl: () => PM, stringToHashBucketFastImpl: () => OM, subImpl: () => AS, tileImpl: () => MM, topKImpl: () => BM, transposeImpl: () => _S, uniqueImpl: () => VM }); +function Xs(r, e) { + Array.isArray(r) || (r = [r]), r.forEach((t10) => { + t10 != null && x.assert(t10.dtype !== "complex64", () => `${e} does not support complex64 tensors in the CPU backend.`); + }); +} +function pM(r) { + let e = new Float32Array(r.length); + for (let t10 = 0; t10 < r.length; ++t10) + e[t10] = Math.abs(r[t10]); + return e; +} +function kt(r) { + return (e, t10, o, n, s) => { + let a = I.assertAndGetBroadcastShape(e, t10), i = a.length, p = x.computeStrides(a), u = x.sizeFromShape(a), c = x.getTypedArrayFromDType(s, u), l = e.length, m = t10.length, f = x.computeStrides(e), d = x.computeStrides(t10), h = I.getBroadcastDims(e, a), g = I.getBroadcastDims(t10, a); + if (h.length + g.length === 0) + for (let y = 0; y < c.length; ++y) + c[y] = r(o[y % o.length], n[y % n.length]); + else + for (let y = 0; y < c.length; ++y) { + let b = x.indexToLoc(y, i, p), C = b.slice(-l); + h.forEach((E) => C[E] = 0); + let w = x.locToIndex(C, l, f), k = b.slice(-m); + g.forEach((E) => k[E] = 0); + let _ = x.locToIndex(k, m, d); + c[y] = r(o[w], n[_]); + } + return [c, a]; + }; +} +function Ec(r) { + let { inputs: e, backend: t10 } = r, { real: o, imag: n } = e, s = t10.data.get(o.dataId).values, a = t10.data.get(n.dataId).values, i = t10.makeTensorInfo(o.shape, "complex64"), p = t10.data.get(i.dataId); + return p.complexTensorInfos = { real: t10.makeTensorInfo(o.shape, "float32", s), imag: t10.makeTensorInfo(n.shape, "float32", a) }, i; +} +function Hg(r, e, t10 = "float32") { + if (t10 === "complex64") { + let n = Hg(r, e, "float32"), s = Hg(r, e, "float32"); + return Ec({ inputs: { real: n, imag: s }, backend: r }); + } + let o = x.makeZerosTypedArray(x.sizeFromShape(e), t10); + return r.makeTensorInfo(e, t10, o); +} +function mS(r) { + let { inputs: e, backend: t10 } = r, { x: o } = e; + return t10.incRef(o.dataId), { dataId: o.dataId, shape: o.shape, dtype: o.dtype }; +} +function cM(r) { + let { inputs: e, backend: t10 } = r, { input: o } = e, n = t10.data.get(o.dataId).complexTensorInfos.real, s = t10.data.get(n.dataId).values; + return t10.makeTensorInfo(n.shape, n.dtype, s); +} +function fS(r, e, t10, o) { + if (o === "int32") { + let n = Int32Array.from(r); + return [e, "int32", n]; + } + if (o === "bool") { + let n = x.toTypedArray([0], t10), [s, a] = kt((i, p) => i !== p ? 1 : 0)(e, [], r, n, "bool"); + return [a, "bool", s]; + } + throw new Error(`Error in Cast: failed to cast ${t10} to ${o}`); +} +function Yl(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { dtype: s } = o; + if (s === "complex64") { + if (n.dtype === "complex64") + return mS({ inputs: { x: n }, backend: t10 }); + let c = Hg(t10, n.shape, n.dtype), l = Yl({ inputs: { x: n }, backend: t10, attrs: { dtype: "float32" } }), m = Ec({ inputs: { real: l, imag: c }, backend: t10 }); + return t10.disposeIntermediateTensorInfo(c), t10.disposeIntermediateTensorInfo(l), m; + } + if (n.dtype === "complex64") { + let c = cM({ inputs: { input: n }, backend: t10 }), l = Yl({ inputs: { x: c }, backend: t10, attrs: { dtype: s } }); + return t10.disposeIntermediateTensorInfo(c), l; + } + if (!x.hasEncodingLoss(n.dtype, s)) { + let c = mS({ inputs: { x: n }, backend: t10 }); + return { dataId: c.dataId, shape: c.shape, dtype: s }; + } + let a = t10.data.get(n.dataId).values, [i, p, u] = fS(a, n.shape, n.dtype, s); + return t10.makeTensorInfo(i, p, u); +} +function Dt(r, e, t10, o) { + return t10 == null ? ({ inputs: n, backend: s }) => { + let { a, b: i } = n, p = s; + Xs([a, i], r); + let u = p.data.get(a.dataId).values, c = p.data.get(i.dataId).values, l = a.dtype === "string" ? I.fromUint8ToStringArray(u) : u, m = a.dtype === "string" ? I.fromUint8ToStringArray(c) : c, f = o || a.dtype, [d, h] = e(a.shape, i.shape, l, m, f); + return p.makeTensorInfo(h, f, d); + } : ({ inputs: n, backend: s }) => { + let { a, b: i } = n, p = s; + if (a.dtype === "complex64" || i.dtype === "complex64") { + let u = Yl({ inputs: { x: a }, backend: p, attrs: { dtype: "complex64" } }), c = p.data.get(u.dataId), l = c.complexTensorInfos.real, m = c.complexTensorInfos.imag, f = p.data.get(l.dataId).values, d = p.data.get(m.dataId).values, h = Yl({ inputs: { x: i }, backend: p, attrs: { dtype: "complex64" } }), g = p.data.get(h.dataId), y = g.complexTensorInfos.real, b = g.complexTensorInfos.imag, C = p.data.get(y.dataId).values, w = p.data.get(b.dataId).values, [k, _, E] = t10(a.shape, i.shape, f, d, C, w), R = p.makeTensorInfo(E, "float32", k), A = p.makeTensorInfo(E, "float32", _), D = Ec({ inputs: { real: R, imag: A }, backend: p }); + return p.disposeIntermediateTensorInfo(u), p.disposeIntermediateTensorInfo(h), p.disposeIntermediateTensorInfo(R), p.disposeIntermediateTensorInfo(A), D; + } else { + let u = p.data.get(a.dataId).values, c = p.data.get(i.dataId).values, l = o || a.dtype, [m, f] = e(a.shape, i.shape, u, c, l); + return p.makeTensorInfo(f, l, m); + } + }; +} +function $c(r) { + return (e, t10, o, n, s, a) => { + let i = I.assertAndGetBroadcastShape(e, t10), p = x.sizeFromShape(i), u = i.length, c = x.computeStrides(i), l = x.getTypedArrayFromDType("float32", p), m = x.getTypedArrayFromDType("float32", p), f = I.getBroadcastDims(e, i), d = I.getBroadcastDims(t10, i), h = I.mergeRealAndImagArrays(o, n), g = I.mergeRealAndImagArrays(s, a), y = e.length, b = x.computeStrides(e), C = t10.length, w = x.computeStrides(t10); + if (f.length + d.length === 0) + for (let k = 0; k < l.length; k++) { + let _ = k % h.length, E = k % g.length, R = r(h[_ * 2], h[_ * 2 + 1], g[E * 2], g[E * 2 + 1]); + l[k] = R.real, m[k] = R.imag; + } + else + for (let k = 0; k < l.length; k++) { + let _ = x.indexToLoc(k, u, c), E = _.slice(-y); + f.forEach((M) => E[M] = 0); + let R = x.locToIndex(E, y, b), A = _.slice(-C); + d.forEach((M) => A[M] = 0); + let D = x.locToIndex(A, C, w), O = r(h[R * 2], h[R * 2 + 1], g[D * 2], g[D * 2 + 1]); + l[k] = O.real, m[k] = O.imag; + } + return [l, m, i]; + }; +} +var dS = kt((r, e) => r + e); +var $re = $c((r, e, t10, o) => ({ real: r + t10, imag: e + o })); +var LTt = Dt(_r, dS, $re); +function lM(r, e, t10, o, n) { + let s = x.sizeFromShape(o), a = x.makeZerosTypedArray(n, t10); + for (let i = 0; i < r.length; i++) { + let p = r[i]; + if (p < 0) + throw new Error("Input x must be non-negative!"); + p >= n || (s > 0 ? a[p] += e[i] : a[p] += 1); + } + return a; +} +function mM(r, e, t10, o = false) { + let n = r.shape[0], s = r.shape[1], a = ne([n, t10], e.dtype); + for (let i = 0; i < n; i++) + for (let p = 0; p < s; p++) { + let u = r.get(i, p); + if (u < 0) + throw new Error("Input x must be non-negative!"); + u >= t10 || (o ? a.set(1, i, u) : e.size > 0 ? a.set(a.get(i, u) + e.get(i, p), i, u) : a.set(a.get(i, u) + 1, i, u)); + } + return a; +} +function Tr(r) { + return (e, t10, o) => { + let n = x.getTypedArrayFromDType(t10, e.length); + for (let s = 0; s < e.length; ++s) + n[s] = r(e[s], o); + return n; + }; +} +function qg(r, e, t10) { + return ({ inputs: o, attrs: n, backend: s }) => { + let { x: a } = o; + if (Xs(a, r), a.dtype === "string" || t10 === "string") + throw new Error("unaryKernelFunc does not support string input/output"); + let i = s, p = i.data.get(a.dataId).values, u = x.sizeFromShape(a.shape), c = t10 || a.dtype, l = x.getArrayFromDType(c, u); + for (let m = 0; m < u; ++m) + l[m] = e(p[m], n); + return i.makeTensorInfo(a.shape, c, l); + }; +} +function Jo(r, e, t10) { + return ({ inputs: o, attrs: n, backend: s }) => { + let { x: a } = o; + if (Xs(a, r), a.dtype === "string" || t10 === "string") + throw new Error("unaryKernelFunc does not support string input/output"); + let i = s, p = i.data.get(a.dataId).values, u = t10 || a.dtype, c = e(p, u, n); + return i.makeTensorInfo(a.shape, u, c); + }; +} +var hS = Tr((r) => Math.ceil(r)); +var YTt = Jo(ro, hS); +function fM(r, e, t10, o) { + let n = x.getArrayFromDType(t10, x.sizeFromShape(e)); + if (o && t10 !== "string") { + let s = 0; + r.forEach((a) => { + let i = x.sizeFromShape(a.shape); + n.set(a.vals, s), s += i; + }); + } else { + let s = 0; + r.forEach((a) => { + let i = t10 === "string" ? I.fromUint8ToStringArray(a.vals) : a.vals, p = 0; + for (let u = 0; u < a.shape[0]; ++u) { + let c = u * e[1] + s; + for (let l = 0; l < a.shape[1]; ++l) + n[c + l] = i[p++]; + } + s += a.shape[1]; + }); + } + return n; +} +var gS = kt((r, e) => r === e ? 1 : 0); +var oNt = Dt(oo, gS, null, "bool"); +var xS = Tr((r) => Math.exp(r)); +var uNt = Jo(no, xS, "float32"); +var yS = Tr((r) => Math.expm1(r)); +var fNt = Jo(wn, yS); +var bS = Tr((r) => Math.floor(r)); +var yNt = Jo(so, bS); +function dM(r, e, t10, o, n, s, a, i, p) { + let u = ne([o, s], t10); + for (let c = 0; c < o; c++) { + let l = [], m = 0; + for (let f = 0; f < n; f++) { + let d = r[c * n + f]; + m += d * a[f], l.push(d); + } + if (m < 0 || m >= p / s) + throw new Error(`Invalid indices: ${l} does not index into ${i}`); + for (let f = 0; f < s; f++) + u.values[c * s + f] = e.get(...e.indexToLoc(m * s + f)); + } + return u; +} +function hM(r, e, t10) { + let o = ne(t10, r.dtype); + for (let n = 0; n < o.size; ++n) { + let a = o.indexToLoc(n).slice(), i = a[0], p = a[2], u = e.locToIndex([i, p]); + a[2] = e.values[u]; + let c = r.locToIndex(a); + 0 <= c && c < r.values.length && (o.values[n] = r.values[c]); + } + return o; +} +var CS = kt((r, e) => r > e ? 1 : 0); +var NNt = Dt(ao, CS, null, "bool"); +var IS = kt((r, e) => r >= e ? 1 : 0); +var ANt = Dt(io, IS, null, "bool"); +var wS = kt((r, e) => r < e ? 1 : 0); +var MNt = Dt(po, wS, null, "bool"); +var SS = kt((r, e) => r <= e ? 1 : 0); +var WNt = Dt(co, SS, null, "bool"); +function gM(r, e, t10) { + let o = (e - r) / (t10 - 1), n = x.makeZerosTypedArray(t10, "float32"); + n[0] = r; + for (let s = 1; s < n.length; s++) + n[s] = n[s - 1] + o; + return n; +} +var vS = Tr((r) => Math.log(r)); +var XNt = Jo(lo, vS); +function xM(r, e, t10, o) { + let n = x.getTypedArrayFromDType(o, x.sizeFromShape(t10)); + for (let s = 0; s < n.length; ++s) { + let a = s * e, i = r[a]; + for (let p = 0; p < e; ++p) { + let u = r[a + p]; + (Number.isNaN(u) || u > i) && (i = u); + } + n[s] = i; + } + return n; +} +var kS = kt((r, e) => Math.max(r, e)); +var r2t = Dt(mo, kS); +var TS = kt((r, e) => Math.min(r, e)); +var i2t = Dt(fo, TS); +var Ql = kt((r, e) => r * e); +var Rre = $c((r, e, t10, o) => ({ real: r * t10 - e * o, imag: r * o + e * t10 })); +var m2t = Dt(ho, Ql, Rre); +function yM(r, e, t10) { + let o = x.createScalarValue(-1, t10); + return Ql([], e, o, r, t10); +} +var NS = kt((r, e) => r !== e ? 1 : 0); +var I2t = Dt(go, NS, null, "bool"); +function _S(r, e, t10, o, n) { + let s = e.length, a = x.sizeFromShape(e), i = x.computeStrides(e), p = x.computeStrides(n), u = x.getTypedArrayFromDType(t10, x.sizeFromShape(n)); + for (let c = 0; c < a; ++c) { + let l = x.indexToLoc(c, s, i), m = new Array(l.length); + for (let d = 0; d < m.length; d++) + m[d] = l[o[d]]; + let f = x.locToIndex(m, s, p); + u[f] = r[c]; + } + return u; +} +function bM(r, e, t10, o) { + let [n, s] = I.computeOutAndReduceShapes(r, o), a = ct(e, "int32"), i = x.makeZerosTypedArray(x.sizeFromShape(n), a), p = x.sizeFromShape(s); + for (let u = 0; u < i.length; ++u) { + let c = u * p, l = 1; + for (let m = 0; m < p; ++m) + l *= t10[c + m]; + i[u] = l; + } + return { outVals: i, outShape: n, outDtype: a }; +} +function Are(r, e, t10) { + r.forEach((o, n) => { + if (o < 0 || o >= t10) { + let s = x.indexToLoc(n, e.length, x.computeStrides(e)).join(","); + throw new Error(`indices[${s}] = ${o} is not in [0, ${t10})`); + } + }); +} +function Fre(r, e) { + for (let t10 = 0; t10 < r.length; ++t10) { + let o = r[t10], n = t10 === r.length - 1 ? e : r[t10 + 1].length; + if (o.length === 0) + throw new Error("Ragged splits may not be empty"); + if (o[0] < 0) + throw new Error("Ragged splits must be non-negative"); + if (o[o.length - 1] > n) + throw new Error("Ragged splits must not point past values"); + for (let s = 1; s < o.length; ++s) + if (o[s - 1] > o[s]) + throw new Error("Ragged splits must be sorted in ascending order"); + } +} +function Dre(r, e, t10, o) { + let n = [], s = 0, a = e.length - 1 + t10.length, i = new Array(a).fill(null).map(() => [0]); + Fre(t10, o); + let p = 1; + for (let u = 0; u < e.length - 1; ++u) { + p *= e[u]; + let c = e[u + 1]; + for (let l = 1; l < p + 1; ++l) + i[u].push(l * c); + } + for (let u = 0; u < r.length; ++u) { + let c = r[u], l = r[u] + 1; + for (let m = 0; m < t10.length; ++m) { + let f = t10[m], d = m + e.length - 1; + if (d >= 0) { + let h = i[d], g = h[h.length - 1] - f[c]; + for (let y = c; y < l; ++y) + i[d].push(f[y + 1] + g); + } + c = f[c], l = f[l]; + } + l !== c && (n.push([c, l]), s += l - c); + } + return { outSplits: i, valueSlices: n, numValues: s }; +} +function Pre(r) { + let e = []; + for (let t10 = 0; t10 < r.length; ++t10) { + let o = r[t10].length, n = x.getArrayFromDType("int32", o); + e.push(n), r[t10].forEach((s, a) => n[a] = s); + } + return e; +} +function CM(r, e) { + let t10 = r.slice(0, e); + for (; t10.length < e; ) + t10.push(1); + for (let o = e; o < r.length; o++) + t10[e - 1] *= r[o]; + return t10; +} +function Ore(r, e, t10, o, n, s) { + let a = CM(e, 2)[1], i = CM(s, 2)[1], p = 0; + for (let u of t10) + for (let c = u[0]; c < u[1]; ++c) { + for (let l = 0; l < o; ++l) + n[p * i + l] = r[c * a + l]; + ++p; + } +} +function Mre(r, e, t10, o, n) { + let s = e.slice(); + s[0] = n; + let a = x.getArrayFromDType(t10, x.sizeFromShape(s)), i = r.length, p = i === 0 ? 0 : i / e[0]; + return Ore(r, e, o, p, a, s), [a, s]; +} +function IM(r, e, t10, o, n, s, a, i) { + if (r.length === 0) + throw new Error("paramsNestedSplits must be non empty"); + if (e[0].length === 0) + throw new Error("Split tensors must not be scalars"); + let p = e[0][0] - 1; + if (Are(s, a, p), o.length === 0) + throw new Error("params.rank must be nonzero"); + let u = o[0], { outSplits: c, valueSlices: l, numValues: m } = Dre(s, a, r, u), f = Pre(c), d = Mre(t10, o, n, l, m); + return [f, d[0], d[1]]; +} +var en = I.RowPartitionType; +var Rc = class { + constructor(e, t10, o, n, s, a, i, p, u, c) { + this.shape = e, this.shapeShape = t10, this.values = o, this.valuesShape = n, this.valuesDType = s, this.defaultValue = a, this.defaultValueShape = i, this.rowPartitionValues = p, this.rowPartitionValuesShapes = u, this.rowPartitionTypes = I.getRowPartitionTypesHelper(c), this.raggedRank = I.getRaggedRank(this.rowPartitionTypes); + } + getRowPartitionTypeByDimension(e) { + return this.rowPartitionTypes[0] === en.FIRST_DIM_SIZE ? this.rowPartitionTypes[e + 1] : this.rowPartitionTypes[e]; + } + getRowPartitionTensor(e) { + return this.rowPartitionTypes[0] === en.FIRST_DIM_SIZE ? this.rowPartitionValues[e + 1] : this.rowPartitionValues[e]; + } + getMaxWidth(e) { + let t10 = this.getRowPartitionTensor(e - 1); + switch (this.getRowPartitionTypeByDimension(e - 1)) { + case en.VALUE_ROWIDS: + return Rc.getMaxWidthValueRowID(t10); + case en.ROW_SPLITS: + return Rc.getMaxWidthRowSplit(t10); + default: + throw new Error(`Cannot handle partition type ${en[this.getRowPartitionTypeByDimension(e - 1)]}`); + } + } + static getMaxWidthRowSplit(e) { + let t10 = e.length; + if (t10 === 0 || t10 === 1) + return 0; + let o = 0; + for (let n = 0; n < t10 - 1; ++n) { + let s = e[n + 1] - e[n]; + s > o && (o = s); + } + return o; + } + static getMaxWidthValueRowID(e) { + let t10 = e.length; + if (t10 === 0) + return 0; + let o = 0, n = e[0], s = 0; + for (let a = 1; a < t10; ++a) { + let i = e[a]; + i !== n && (n = i, s = Math.max(a - o, s), o = a); + } + return Math.max(t10 - o, s); + } + tensorShapeFromTensor(e, t10, o = true) { + if (t10.length === 0) { + if (e[0] === -1) + return []; + throw new Error("The only valid scalar shape tensor is the fully unknown shape specified as -1."); + } + return SM(e, o); + } + calculateOutputSize(e) { + let t10 = this.valuesShape, o = this.defaultValueShape; + I.validateDefaultValueShape(o, t10); + let n = this.tensorShapeFromTensor(this.shape, this.shapeShape), a = I.combineRaggedTensorToTensorShapes(this.raggedRank, n, t10); + a[0] < 0 && (a[0] = e); + for (let i = 1; i <= this.raggedRank; ++i) + a[i] < 0 && (a[i] = this.getMaxWidth(i)); + return a; + } + calculateFirstParentOutputIndex(e, t10, o) { + let n = Math.min(e, o), s = [], a = 0; + for (let i = 0; i < n; ++i, a += t10) + s.push(a); + for (let i = n; i < e; ++i) + s.push(-1); + return x.assert(s.length === e, () => "Final length of result must be equal to firstDimension."), s; + } + calculateOutputIndexRowSplit(e, t10, o, n) { + let s = e.length, a = []; + for (let i = 0; i < s - 1; ++i) { + let p = e[i + 1] - e[i], u = Math.min(n, p), c = t10[i]; + c === -1 && (u = 0); + for (let l = 0; l < u; ++l) + a.push(c), c += o; + for (let l = 0; l < p - u; ++l) + a.push(-1); + } + if (s > 0 && a.length !== e[s - 1]) + throw new Error("Invalid row split size."); + return a; + } + calculateOutputIndexValueRowID(e, t10, o, n) { + let s = e.length, a = []; + if (s === 0) + return []; + let i = 0, p = e[0]; + if (p >= t10.length) + throw new Error(`Got currentValueRowId=${p}, which is not less than ${t10.length}`); + let u = t10[p]; + a.push(u); + for (let c = 1; c < s; ++c) { + let l = e[c]; + if (l === p) + u >= 0 && (++i, i < n ? u += o : u = -1); + else { + if (i = 0, p = l, l >= t10.length) + throw new Error(`Got nextValueRowId=${l} which is not less than ${t10.length}`); + u = t10[l]; + } + a.push(u); + } + if (a.length !== e.length) + throw new Error("Invalid row ids."); + return a; + } + calculateOutputIndex(e, t10, o, n) { + let s = this.getRowPartitionTensor(e), a = this.getRowPartitionTypeByDimension(e); + switch (a) { + case en.VALUE_ROWIDS: + return this.calculateOutputIndexValueRowID(s, t10, o, n); + case en.ROW_SPLITS: + if (s.length - 1 > t10.length) + throw new Error(`Row partition size is greater than output size: ${s.length - 1} > ${t10.length}`); + return this.calculateOutputIndexRowSplit(s, t10, o, n); + default: + throw new Error(`Unsupported partition type: ${en[a]}`); + } + } + getFirstDimensionSize() { + let e = this.rowPartitionValues[0]; + if (this.rowPartitionTypes.length === 0) + throw new Error("No row_partition_types given."); + let t10 = this.rowPartitionTypes[0]; + switch (t10) { + case en.FIRST_DIM_SIZE: + return e[0]; + case en.VALUE_ROWIDS: + throw new Error("Cannot handle VALUE_ROWIDS in first dimension."); + case en.ROW_SPLITS: + return this.rowPartitionValuesShapes[0][0] - 1; + default: + throw new Error(`Cannot handle type ${en[t10]}`); + } + } + compute() { + if (this.rowPartitionValues[0].length <= 0) + throw new Error("Invalid first partition input. Tensor requires at least one element."); + let t10 = this.getFirstDimensionSize(), o = this.calculateOutputSize(t10), n = new Array(this.raggedRank + 1); + n[n.length - 1] = 1; + for (let p = n.length - 2; p >= 0; --p) + n[p] = n[p + 1] * o[p + 1]; + let s = SM(o, false), a = x.getArrayFromDType(this.valuesDType, x.sizeFromShape(s)); + if (n[0] * o[0] > 0) { + let p = this.calculateFirstParentOutputIndex(t10, n[0], o[0]); + for (let u = 1; u <= this.raggedRank; ++u) + p = this.calculateOutputIndex(u - 1, p, n[u], o[u]); + this.setOutput(this.raggedRank, p, a, s); + } + return [s, a]; + } + setOutput(e, t10, o, n) { + if (o.length === 0) + return; + let s = this.values, a = o, i = n.slice(); + i = i.slice(e + 1); + let p = x.sizeFromShape(i), u = t10.length, c = this.defaultValue; + if (c.length !== p && c.length !== 1) { + let d = this.defaultValueShape; + Ne(() => { + let h = z(c, d); + c = Ls(h, i).dataSync(); + }); + } + let l = 0, m = 0, f = 0; + for (let d = 0; d <= u; ++d) { + let h = d < u ? t10[d] : -1; + if (h === f) { + ++f; + continue; + } + if (m < f) { + let g = s.subarray(l * p), y = a.subarray(m * p), b = (f - m) * p; + wM(y, g, b); + } + if (d >= u) { + let g = o.length; + h = Math.floor(g / p); + } + if (h > f) + if (this.defaultValue.length === 1) + a.subarray(f * p, h * p).fill(this.defaultValue[0]), f = h; + else + for (; h > f; ) { + let g = a.slice(f * p); + wM(g, c, p), ++f; + } + h < 0 ? (l = d + 1, m = f) : (l = d, m = f, f = m + 1); + } + } +}; +function wM(r, e, t10) { + for (let o = 0; o < t10; o++) + r[o] = e[o]; +} +function SM(r, e) { + let t10 = []; + for (let o of r) { + if (o < 0) { + if (!e) + throw new Error(`Dimension ${o} must be >= 0`); + if (o < -1) + throw new Error(`Dimension ${o} must be >= -1`); + o = -1; + } + t10.push(o); + } + return t10; +} +function vM(r, e, t10, o, n, s, a, i, p, u) { + return new Rc(r, e, t10, o, n, s, a, i, p, u).compute(); +} +function kM(r, e, t10, o) { + let n = r === e, s = r < e && t10 < 0, a = e < r && t10 > 1; + if (n || s || a) + return x.makeZerosTypedArray(0, o); + let i = Math.abs(Math.ceil((e - r) / t10)), p = x.makeZerosTypedArray(i, o); + e < r && t10 === 1 && (t10 = -1), p[0] = r; + for (let u = 1; u < p.length; u++) + p[u] = p[u - 1] + t10; + return p; +} +var ES = Tr((r) => 1 / Math.sqrt(r)); +var U2t = Jo(xo, ES); +function TM(r, e, t10, o, n, s, a, i, p, u) { + let c = [o / n, n], l = r.values, m = e.values; + if (o === 0) + return ne(t10, e.dtype); + let f = ne(c, e.dtype); + typeof p == "string" || typeof p == "number" ? f.values.fill(p) : typeof p == "boolean" && f.values.fill(+p); + for (let d = 0; d < s; d++) { + let h = [], g = 0; + for (let y = 0; y < a; y++) { + let b = l[d * a + y]; + h.push(b), g += b * i[y]; + } + if (g < 0 || g >= o / n) + throw new Error(`Invalid indices: ${h} does not index into ${t10}`); + for (let y = 0; y < n; y++) + u ? f.values[g * n + y] += m[d * n + y] : f.values[g * n + y] = e.rank === 0 ? m[0] : m[d * n + y]; + } + return f; +} +var NM = Tr((r) => 1 / (1 + Math.exp(-r))); +var Y2t = qg(yo, (r) => 1 / (1 + Math.exp(-r))); +function _M(r, e, t10, o, n) { + let s = et.isSliceContinous(o, e, t10), a = x.sizeFromShape(t10), i = x.computeStrides(o); + if (s) { + let l = et.computeFlatOffset(e, i); + return n === "string" ? r.slice(l, l + a) : r.subarray(l, l + a); + } + let p = n === "string" ? I.fromUint8ToStringArray(r) : r, u = ne(o, n, p), c = ne(t10, n); + for (let l = 0; l < c.size; ++l) { + let m = c.indexToLoc(l), f = m.map((d, h) => d + e[h]); + c.set(u.get(...f), ...m); + } + return n === "string" ? I.fromStringArrayToUint8(c.values) : c.values; +} +function EM(r, e, t10, o, n, s, a) { + let i = e[0], p = s[0], u = new Array(p), c = new Array(i), l = e[1]; + if (p === 0) { + if (i !== 0) + throw new Error(I.getSparseFillEmptyRowsIndicesDenseShapeMismatch(i)); + let g = x.getArrayFromDType(t10, 0), y = x.getArrayFromDType(n, 0); + return [g, [0, l], y, u, c]; + } + let m = true, f = 0, d = new Array(p).fill(0); + for (let g = 0; g < i; ++g) { + let y = r[g * l]; + if (y < 0) + throw new Error(I.getSparseFillEmptyRowsNegativeIndexErrorMessage(g, y)); + if (y >= p) + throw new Error(I.getSparseFillEmptyRowsOutOfRangeIndexErrorMessage(g, y, p)); + ++d[y], m = m && y >= f, f = y; + } + let h = true; + for (let g = 0; g < p; ++g) { + let y = d[g] === 0; + u[g] = y, h = h && !y, d[g] = Math.max(d[g], 1), g > 0 && (d[g] += d[g - 1]); + } + if (h && m) { + let g = r, y = o; + for (let b = 0; b < i; ++b) + c[b] = b; + return [g, [i, l], y, u, c]; + } else { + let g = d[p - 1], y = x.getArrayFromDType(t10, g * l), b = x.getArrayFromDType(n, g), C = new Array(p).fill(0); + for (let w = 0; w < i; ++w) { + let k = r[w * l], _ = C[k], E = (k === 0 ? 0 : d[k - 1]) + _; + C[k]++; + for (let R = 0; R < l; ++R) + y[E * l + R] = r[w * l + R]; + b[E] = o[w], c[w] = E; + } + for (let w = 0; w < p; ++w) + if (C[w] === 0) { + let _ = w === 0 ? 0 : d[w - 1]; + y[_ * l + 0] = w; + for (let E = 1; E < l; ++E) + y[_ * l + E] = 0; + b[_] = a; + } + return [y, [g, l], b, u, c]; + } +} +function $M(r, e, t10, o, n) { + let s = x.sizeFromShape(o), a = e[0], i = n.length, p = [], u = 1, c = -1; + for (let g = 0; g < i; ++g) { + let y = n[g]; + if (y === -1) { + if (c !== -1) + throw new Error(I.getSparseReshapeMultipleNegativeOneOutputDimErrorMessage(c, g)); + c = g, p.push(1); + } else { + if (y < 0) + throw new Error(I.getSparseReshapeNegativeOutputDimErrorMessage(g, y)); + u *= y, p.push(y); + } + } + if (c !== -1) { + if (u <= 0) + throw new Error(I.getSparseReshapeEmptyTensorZeroOutputDimErrorMessage()); + let g = Math.trunc(s / u); + if (u * g !== s) + throw new Error(I.getSparseReshapeInputOutputMultipleErrorMessage(o, p)); + p[c] = g; + } + if (x.sizeFromShape(p) !== s) + throw new Error(I.getSparseReshapeInputOutputMismatchErrorMessage(o, p)); + let m = o.length, f = []; + if (m > 0) { + f[m - 1] = 1; + for (let g = m - 2; g >= 0; --g) + f[g] = f[g + 1] * o[g + 1]; + } + let d = []; + if (i > 0) { + d[i - 1] = 1; + for (let g = i - 2; g >= 0; --g) + d[g] = d[g + 1] * p[g + 1]; + } + let h = x.getArrayFromDType(t10, a * i); + for (let g = 0; g < a; ++g) { + let y = 0; + for (let b = 0; b < m; ++b) + y += r[g * m + b] * f[b]; + for (let b = 0; b < i; ++b) + h[g * i + b] = Math.trunc(y / d[b]), y %= d[b]; + } + return [h, [a, i], p]; +} +function RM(r, e, t10, o, n, s = false, a = 0) { + let i = o.length, p = [e[0], r.length / e[0]], u = p[1], l = i > 0 ? n[i - 1] + 1 : 0; + if (l < 0) + throw new Error(I.getSparseSegmentReductionNegativeSegmentIdsErrorMessage()); + let m = e.slice(); + m[0] = l; + let f = m.reduce((C, w) => C * w, 1), d = x.getArrayFromDType(t10, f); + if (i === 0) + return l > 0 && d.fill(a), [d, m]; + if (l <= 0) + throw new Error(I.getSparseSegmentReductionNegativeSegmentIdsErrorMessage()); + let h = 0, g = 1, y = 0, b = n[h]; + for (; ; ) { + let C = 0; + if (g < i) { + if (C = n[g], b === C) { + ++g; + continue; + } + if (b >= C) + throw new Error(I.getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage()); + } + if (b < 0 || b >= l) + throw new Error(I.getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage(b, l)); + b > y && d.fill(a, y * u, b * u); + for (let w = h; w < g; ++w) { + let k = o[w]; + if (k < 0 || k >= p[0]) + throw new Error(I.getSparseSegmentReductionIndicesOutOfRangeErrorMessage(w, o[w], p[0])); + for (let _ = 0; _ < u; _++) + d[b * u + _] += r[k * u + _]; + } + if (s) + for (let w = 0; w < u; w++) + d[b * u + w] /= g - h; + if (h = g, ++g, y = b + 1, b = C, g > i) + break; + } + return y < l && d.fill(a, y * u, l * u), [d, m]; +} +var AM = Tr((r) => Math.sqrt(r)); +var c_t = qg(bo, (r) => Math.sqrt(r)); +var $S = kt((r, e) => { + let t10 = r - e; + return t10 * t10; +}); +var h_t = Dt(Co, $S); +function FM(r, e, t10, o) { + let n = ne(r, e.dtype); + for (let s = 0; s < n.size; s++) { + let a = n.indexToLoc(s), i = new Array(a.length); + for (let p = 0; p < i.length; p++) + i[p] = a[p] * t10[p] + o[p]; + n.set(e.get(...i), ...a); + } + return n; +} +var RS = class { + constructor(e, t10, o, n, s, a) { + this.separator = x.encodeString(e), this.nGramWidths = t10, this.leftPad = x.encodeString(o), this.rightPad = x.encodeString(n), this.padWidth = s, this.preserveShort = a; + } + getPadWidth(e) { + return Math.min(this.padWidth < 0 ? e - 1 : this.padWidth, e - 1); + } + getNumNGrams(e, t10) { + let o = this.getPadWidth(t10); + return Math.max(0, e + 2 * o - t10 + 1); + } + createNGrams(e, t10, o, n, s, a) { + for (let i = 0; i < s; ++i) { + let p = this.getPadWidth(a), u = Math.max(0, p - i), c = Math.max(0, p - (s - (i + 1))), l = a - (u + c), m = t10 + (u > 0 ? 0 : i - p), f = 0; + f += u * this.leftPad.length; + for (let b = 0; b < l; ++b) + f += e[m + b].length; + f += c * this.rightPad.length; + let d = u + c + l - 1; + f += d * this.separator.length, o[n + i] = new Uint8Array(f); + let h = o[n + i], g = 0, y = (b) => b.forEach((C) => h[g++] = C); + for (let b = 0; b < u; ++b) + y(this.leftPad), y(this.separator); + for (let b = 0; b < l - 1; ++b) + y(e[m + b]), y(this.separator); + if (l > 0) { + y(e[m + l - 1]); + for (let b = 0; b < c; ++b) + y(this.separator), y(this.rightPad); + } else { + for (let b = 0; b < c - 1; ++b) + y(this.rightPad), y(this.separator); + y(this.rightPad); + } + } + } + compute(e, t10) { + let o = e.length, n = t10.length; + if (n > 0) { + let p = t10[0]; + if (p !== 0) + throw new Error(`First split value must be 0, got ${p}`); + for (let u = 1; u < n; ++u) { + let c = t10[u] >= p; + if (c = c && t10[u] <= o, !c) + throw new Error(`Invalid split value ${t10[u]}, must be in [${p}, ${o}]`); + p = t10[u]; + } + if (p !== o) + throw new Error(`Last split value must be data size. Expected ${o}, got ${p}`); + } + let s = n - 1, a = x.getArrayFromDType("int32", n); + if (o === 0 || n === 0) { + let p = new Array(o); + for (let u = 0; u <= s; ++u) + a[u] = 0; + return [p, a]; + } + a[0] = 0; + for (let p = 1; p <= s; ++p) { + let u = t10[p] - t10[p - 1], c = 0; + this.nGramWidths.forEach((l) => { + c += this.getNumNGrams(u, l); + }), this.preserveShort && u > 0 && c === 0 && (c = 1), a[p] = a[p - 1] + c; + } + let i = new Array(a[s]); + for (let p = 0; p < s; ++p) { + let u = t10[p], c = a[p]; + if (this.nGramWidths.forEach((l) => { + let m = t10[p + 1] - t10[p], f = this.getNumNGrams(m, l); + this.createNGrams(e, u, i, c, f, l), c += f; + }), this.preserveShort && c === a[p]) { + let l = t10[p + 1] - t10[p]; + if (l === 0) + continue; + let m = l + 2 * this.padWidth, f = 1; + this.createNGrams(e, u, i, c, f, m); + } + } + return [i, a]; + } +}; +function DM(r, e, t10, o, n, s, a, i) { + return new RS(t10, o, n, s, a, i).compute(r, e); +} +function Lre(r, e, t10, o) { + if (!r.length) + return; + if (e.length === 0) { + for (let s = 0; s < r.length; ++s) + o.push(r.subarray(s, s + 1)); + return; + } + if (e.length === 1) { + let s = e[0], a = r.indexOf(s); + for (; a !== -1; ) { + let i = r.subarray(0, a); + (!t10 || i.length !== 0) && o.push(i), r = r.subarray(a + 1), a = r.indexOf(s); + } + (!t10 || r.length !== 0) && o.push(r); + return; + } + let n = 0; + for (let s = 0; s < r.length + 1; s++) + if (s === r.length || e.indexOf(r[s]) !== -1) { + let a = r.subarray(n, s); + (!t10 || a.length !== 0) && o.push(a), n = s + 1; + } +} +function PM(r, e, t10) { + let o = r.length, n = [], s = 0, a = 0, i = new Array(o); + for (let m = 0; m < o; ++m) { + let f = n.length; + Lre(r[m], e, t10, n); + let d = n.length - f; + i[m] = d, s += d, a = Math.max(a, d); + } + let p = x.getArrayFromDType("int32", s * 2), u = new Array(s), c = [o, a], l = 0; + for (let m = 0; m < o; ++m) + for (let f = 0; f < i[m]; ++f) + p[l * 2] = m, p[l * 2 + 1] = f, u[l] = n[l], ++l; + return [p, u, c]; +} +function OM(r, e) { + let t10 = x.getArrayFromDType("int32", r.length); + for (let o = 0; o < r.length; ++o) + t10[o] = x.fingerPrint64(r[o]).modulo(e).getLowBitsUnsigned(); + return t10; +} +var AS = kt((r, e) => r - e); +var Bre = $c((r, e, t10, o) => ({ real: r - t10, imag: e - o })); +var __t = Dt(Io, AS, Bre); +function MM(r, e) { + let t10 = new Array(r.rank); + for (let n = 0; n < t10.length; n++) + t10[n] = r.shape[n] * e[n]; + let o = ne(t10, r.dtype); + for (let n = 0; n < o.values.length; ++n) { + let s = o.indexToLoc(n), a = new Array(r.rank); + for (let p = 0; p < a.length; p++) + a[p] = s[p] % r.shape[p]; + let i = r.locToIndex(a); + o.values[n] = r.values[i]; + } + return o; +} +var Zl = (r, e) => { + let t10 = e.value - r.value; + return t10 === 0 ? r.index - e.index : t10; +}; +function LM(r, e, t10 = 0, o = r.length - 1) { + for (; o > t10; ) { + if (o - t10 > 600) { + let i = o - t10 + 1, p = e - t10 + 1, u = Math.log(i), c = 0.5 * Math.exp(2 * u / 3), l = 0.5 * Math.sqrt(u * c * (i - c) / i) * Math.sign(p - i / 2), m = Math.max(t10, Math.floor(e - p * c / i + l)), f = Math.min(o, Math.floor(e + (i - p) * c / i + l)); + LM(r, e, m, f); + } + let n = r[e], s = t10, a = o; + for (x.swap(r, t10, e), Zl(r[o], n) > 0 && x.swap(r, t10, o); s < a; ) { + for (x.swap(r, s, a), s++, a--; Zl(r[s], n) < 0; ) + s = s + 1; + for (; Zl(r[a], n) > 0; ) + a = a - 1; + } + Zl(r[t10], n) === 0 ? x.swap(r, t10, a) : (a = a + 1, x.swap(r, a, o)), a <= e && (t10 = a + 1), e <= a && (o = a - 1); + } +} +function BM(r, e, t10, o, n) { + let s = e[e.length - 1], [a, i] = [r.length / s, s], p = x.getTypedArrayFromDType(t10, a * o), u = x.getTypedArrayFromDType("int32", a * o); + for (let l = 0; l < a; l++) { + let m = l * i, f = r.subarray(m, m + i), d = new Array(f.length); + f.forEach((b, C) => d[C] = { value: b, index: C }), o < d.length && (LM(d, o), d = d.slice(0, o)), n && d.sort(Zl); + let h = l * o, g = p.subarray(h, h + o), y = u.subarray(h, h + o); + for (let b = 0; b < o; b++) + g[b] = d[b].value, y[b] = d[b].index; + } + let c = e.slice(); + return c[c.length - 1] = o, [ne(c, t10, p), ne(c, "int32", u)]; +} +function VM(r, e, t10, o) { + let n = x.parseAxisParam(e, t10)[0], s = [1, t10[0], 1]; + for (let d = 0; d < n; d++) + s[0] *= t10[d]; + s[1] = t10[n]; + for (let d = n + 1; d < t10.length; d++) + s[2] *= t10[d]; + let a = {}, i = new Int32Array(t10[n]), p = new je(s, o, r), u = [], c = s[0] === 1 && s[2] === 1; + for (let d = 0; d < t10[n]; d++) { + let h; + if (c) + h = r[d].toString(); + else { + let g = []; + for (let y = 0; y < s[0]; y++) + for (let b = 0; b < s[2]; b++) + g.push(p.get(y, d, b)); + h = g.join(","); + } + if (a[h] !== void 0) + i[d] = a[h]; + else { + let g = Object.keys(a).length; + a[h] = g, i[d] = g, u.push(d); + } + } + let l = s.slice(); + l[1] = Object.keys(a).length; + let m = new je(l, o); + u.forEach((d, h) => { + for (let g = 0; g < s[0]; g++) + for (let y = 0; y < s[2]; y++) + m.set(p.get(g, d, y), g, h, y); + }); + let f = t10.slice(); + return f[n] = l[1], { outputValues: m.values, outputShape: f, indices: i }; +} +var { addImpl: zM, castImpl: WM, ceilImpl: UM, concatImpl: GM, equalImpl: HM, expImpl: qM, expm1Impl: KM, floorImpl: jM, gatherNdImpl: XM, gatherV2Impl: YM, greaterEqualImpl: QM, greaterImpl: ZM, lessEqualImpl: JM, lessImpl: eL, logImpl: tL, maxImpl: rL, maximumImpl: oL, minimumImpl: nL, multiplyImpl: sL, negImpl: aL, notEqualImpl: iL, prodImpl: uL, rangeImpl: pL, rsqrtImpl: cL, scatterImpl: lL, simpleAbsImpl: mL, sliceImpl: fL, stridedSliceImpl: dL, stringNGramsImpl: hL, subImpl: gL, tileImpl: xL, topKImpl: yL, transposeImpl: bL, uniqueImpl: _Et } = FS; +var Vre = Ge({ opType: pe.ABS, cpuKernelImpl: mL }); +var CL = { kernelName: sn, backendName: "webgpu", kernelFunc: Vre }; +var zre = it({ opType: ye.ADD, cpuKernelImpl: zM, supportsComplex: true }); +var IL = { kernelName: _r, backendName: "webgpu", kernelFunc: zre }; +var Kg = class { + constructor(e) { + this.workPerThread = 1, this.workGroupSize = [64, 1, 1], this.size = true, this.outputShape = e[0], this.variableNames = e.map((t10, o) => `T${o}`), this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize, [this.workPerThread, 1, 1]), this.shaderKey = "addN"; + } + getUserCode() { + let e = []; + this.variableNames.forEach((n) => { + e.push(`let v${n} = get${n}ByOutputCoords(coords);`); + }); + let t10 = this.variableNames.map((n) => `v${n}`).join(" + "); + return ` + ${ue("index")} { + for (var i = 0; i < ${this.workPerThread}; i = i + 1) { + let flatIndex = index * ${this.workPerThread} + i; + if (flatIndex < uniforms.size) { + let coords = getCoordsFromIndex(flatIndex); + ${e.join(` + `)} + setOutputAtIndex(flatIndex, ${t10}); + } + } + } + `; + } +}; +function Wre(r) { + let { inputs: e, backend: t10 } = r, o = e; + if (o.length === 1) + return Lt({ inputs: { x: o[0] }, backend: t10 }); + let n = o.map((i) => i.dtype).reduce((i, p) => ct(i, p)), s = o.map((i) => i.shape), a = new Kg(s); + return t10.runWebGPUProgram(a, o, n); +} +var wL = { kernelName: an, backendName: "webgpu", kernelFunc: Wre }; +var Ac = class { + constructor(e, t10, o) { + this.workGroupSize = [64, 1, 1], this.variableNames = ["x"], this.uniforms = "infinityValue : f32,", this.size = true; + let n = [t10]; + this.op = o === "min" ? "<" : ">"; + let [s, a] = I.computeOutAndReduceShapes(e, n); + this.outputShape = s.length === 0 ? [1] : s, this.dispatchLayout = fe(this.outputShape), x.sizeFromShape(a) < 32 || x.sizeFromShape(s) > 1e3 ? (this.type = "plain", this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize)) : (this.type = "shared", this.dispatch = ae(this.dispatchLayout, this.outputShape, [1, 1, 1])), this.inputShape = e, this.shaderKey = `argMinMax_${this.op}_${this.type}`; + } + getUserCode() { + let e = () => this.inputShape.length === 1 ? "uniforms.xShape" : `uniforms.xShape.${Yo(this.inputShape.length - 1)}`, t10 = () => { + let o = ""; + if (this.outputShape.length === 1) + this.inputShape.length !== 1 && (o += "outputCoords,"); + else + for (let n = 0; n < this.outputShape.length; n++) + o += `outputCoords.${Yo(n)},`; + return o; + }; + return this.type === "shared" ? ` + fn DIV_CEIL(a : u32, b : u32) -> u32 { + return ((a - 1u) / b + 1u); + } + + ${` + var xBestIndices : array; + var xBestValues : array; + `} + + ${ue("index")} { + let outputIndex = index / i32(workGroupSizeX); + let reduceLength = ${e()}; + + var bestIndex = i32(localId.x); + var bestValue = uniforms.infinityValue; + let outputCoords = getCoordsFromIndex(outputIndex); + for (var k = i32(localId.x); k < reduceLength && outputIndex < uniforms.size; + k = k + i32(workGroupSizeX)) { + let candidate = getX(${t10()} k); + if (!isnan(candidate) && candidate ${this.op} bestValue) { + bestValue = candidate; + bestIndex = k; + } + } + xBestValues[localId.x] = bestValue; + xBestIndices[localId.x] = bestIndex; + workgroupBarrier(); + + var reduceSize = min(u32(reduceLength), workGroupSizeX); + for (var currentSize = reduceSize / 2u; reduceSize > 1u; + currentSize = reduceSize / 2u) { + let interval = DIV_CEIL(reduceSize, 2u); + if (localId.x < currentSize) { + let candidate = xBestValues[localId.x + interval]; + if (candidate ${this.op} bestValue) { + bestValue = candidate; + xBestValues[localId.x] = bestValue; + xBestIndices[localId.x] = xBestIndices[localId.x + interval]; + } + } + reduceSize = interval; + workgroupBarrier(); + } + + if (localId.x == 0u && outputIndex < uniforms.size) { + setOutputAtIndexI32(outputIndex, xBestIndices[localId.x]); + } + } + ` : ` + ${ue("index")} { + if (index < uniforms.size) { + let outputCoords = getCoordsFromIndex(index); + var bestIndex = 0; + var bestValue = getX(${t10()} 0); + let reduceLength = ${e()}; + for (var i = 1; i < reduceLength; i++) { + let candidate = getX(${t10()} i); + if (candidate ${this.op} bestValue) { + bestValue = candidate; + bestIndex = i; + } + } + setOutputAtIndexI32(index, bestIndex); + } + } + `; + } +}; +var jg = class { + constructor(e, t10) { + this.variableNames = ["A"], this.workGroupSize = [16, 16, 1]; + let o = new Array(e.length); + for (let n = 0; n < o.length; n++) + o[n] = e[t10[n]]; + this.outputShape = o, this.dispatchLayout = { x: [0], y: [1] }, this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize, [1, 1, 1]), this.shaderKey = "transposeShared"; + } + getUserCode() { + return ` + const TILE_DIM = ${this.workGroupSize[0]}; + var tile : array, ${this.workGroupSize[0]}>; + ${Ri()} + fn _start(@builtin(local_invocation_id) localId : vec3, + @builtin(workgroup_id) workgroupId : vec3) { + var x = i32(workgroupId.x) * TILE_DIM + i32(localId.x); + var y = i32(workgroupId.y) * TILE_DIM + i32(localId.y); + let width = uniforms.outShape[0]; + let height = uniforms.outShape[1]; + if (x < width && y < height) { + tile[localId.y][localId.x] = A[y * width + x]; + } + workgroupBarrier(); + + x = i32(workgroupId.y) * TILE_DIM + i32(localId.x); + y = i32(workgroupId.x) * TILE_DIM + i32(localId.y); + if (x < height && y < width) { + setOutputAtIndex((y * height + x), tile[localId.x] + [localId.y]); + } + } + `; + } +}; +var Xg = class { + constructor(e, t10) { + this.variableNames = ["A"], this.workPerThread = 1, this.workGroupSize = [64, 1, 1], this.size = true; + let o = new Array(e.length); + for (let n = 0; n < o.length; n++) + o[n] = e[t10[n]]; + this.outputShape = o, this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize, [this.workPerThread, 1, 1]), this.newDim = t10, this.shaderKey = `transpose_${t10}`; + } + getUserCode() { + let e = At(this.outputShape.length), t10 = Ure(this.newDim); + return ` + ${ue("index")} { + for(var i = 0; i < ${this.workPerThread}; i = i + 1) { + let flatIndex = index * ${this.workPerThread} + i; + if(flatIndex < uniforms.size) { + let resRC = getCoordsFromIndex(flatIndex); + setOutputAtIndex(flatIndex, A[getIndexFromCoords${this.outputShape.length}D( + ${e}(${t10}), uniforms.aShape)]); + } + } + } + `; + } +}; +function Ure(r) { + let e = r.length; + if (e > 6) + throw Error(`Transpose for rank ${e} is not yet supported`); + let t10 = new Array(e); + for (let o = 0; o < r.length; o++) + t10[r[o]] = `resRC.${Yo(o)}`; + return t10.join(); +} +function Nr(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { perm: s } = o, a = t10, i = n.shape.length, p = new Array(i); + for (let c = 0; c < p.length; c++) + p[c] = n.shape[s[c]]; + if (t10.shouldExecuteOnCPU([n])) { + let l = a.tensorMap.get(n.dataId).values, m = bL(l, n.shape, n.dtype, s, p); + return t10.makeTensorInfo(p, n.dtype, m); + } + if (n.shape.length === 2 && x.arraysEqual(s, [1, 0])) { + let c = new jg(n.shape, s); + return a.runWebGPUProgram(c, [n], n.dtype); + } + let u = new Xg(n.shape, s); + return a.runWebGPUProgram(u, [n], n.dtype); +} +var SL = { kernelName: Mr, backendName: "webgpu", kernelFunc: Nr }; +function Gre(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { axis: s } = o, a = x.parseAxisParam(s, n.shape), i = I.getAxesPermutation(a, n.shape.length), p = n, u = []; + i != null && (p = Nr({ inputs: { x: n }, backend: t10, attrs: { perm: i } }), u.push(p), a = I.getInnerMostAxes(a.length, p.shape.length)), I.assertAxesAreInnerMostDims("argMax", [a[0]], p.shape.length); + let c = new Ac(p.shape, a[0], "max"), l = [{ type: "float32", data: [Number.NEGATIVE_INFINITY] }], m = t10.runWebGPUProgram(c, [p], "int32", l); + return u.forEach((f) => t10.disposeData(f.dataId)), m; +} +var vL = { kernelName: un, backendName: "webgpu", kernelFunc: Gre }; +function Hre(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { axis: s } = o, a = x.parseAxisParam(s, n.shape), i = I.getAxesPermutation(a, n.shape.length), p = n, u = []; + i != null && (p = Nr({ inputs: { x: n }, backend: t10, attrs: { perm: i } }), u.push(p), a = I.getInnerMostAxes(a.length, p.shape.length)), I.assertAxesAreInnerMostDims("argMin", [a[0]], p.shape.length); + let c = new Ac(p.shape, a[0], "min"), l = [{ type: "float32", data: [Number.POSITIVE_INFINITY] }], m = t10.runWebGPUProgram(c, [p], "int32", l); + return u.forEach((f) => t10.disposeData(f.dataId)), m; +} +var kL = { kernelName: ja, backendName: "webgpu", kernelFunc: Hre }; +var qre = it({ opType: ye.ATAN2 }); +var TL = { kernelName: sa, backendName: "webgpu", kernelFunc: qre }; +var Jl = class { + constructor(e, t10) { + this.variableNames = ["x"], this.uniforms = "stride : vec2, pad : vec2, dilation : vec2, convDims : vec2, filterDims : vec2,", this.workGroupSize = [128, 1, 1], this.size = true, this.outputShape = e.outShape, this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize), this.shaderKey = `pool2D_${t10}`, this.poolType = t10; + } + getUserCode() { + let e = "resultValue = max(value, resultValue);"; + this.poolType === "avg" && (e = "resultValue = resultValue + value; count = count + 1.0;"); + let t10 = "resultValue"; + return this.poolType === "avg" && (t10 = "resultValue / count"), ` + ${ue("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + let batch = coords[0]; + let xRCCorner = vec2(coords.yz) * uniforms.stride - uniforms.pad; + let xRCorner = xRCCorner.x; + let xCCorner = xRCCorner.y; + + var resultValue = ${this.poolType === "avg" ? "0.0" : "-1.0 / pow(10.0, -20.0)"}; + var count = 0.0; + + for (var wR = 0; wR < uniforms.filterDims.x; wR = wR + uniforms.dilation.x) { + let xR = xRCorner + wR; + + if (xR < 0 || xR >= uniforms.convDims.x) { + continue; + } + + for (var wC = 0; wC < uniforms.filterDims.y; wC = wC + uniforms.dilation.y) { + let xC = xCCorner + wC; + if (xC < 0 || xC >= uniforms.convDims.y) { + continue; + } + + let value = getX(batch, xR, xC, coords[3]); + ${e} + } + } + + setOutputAtIndex(index, ${t10}); + } + } + `; + } +}; +var Yg = class { + constructor(e) { + this.variableNames = ["x"], this.uniforms = "stride : vec2,", this.workGroupSize = [256, 1, 1], this.size = true, this.outputShape = e.outShape, this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize), this.shaderKey = "poolWithFilterSizeEqualsOne"; + } + getUserCode() { + return ` + ${ue("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + let batch = coords[0]; + let d = coords[3]; + + let xRCCorner = coords.yz * uniforms.stride; + let xRCorner = xRCCorner.x; + let xCCorner = xRCCorner.y; + + let value = getX(batch, xRCorner, xCCorner, d); + setOutputAtIndex(index, value); + } + } + `; + } +}; +var Qg = class { + constructor(e, t10) { + this.workGroupSize = [64, 1, 1], this.variableNames = ["x"], this.uniforms = "reduceSize : i32,", this.size = true, this.inputShape = [e.batchSize, e.inSize]; + let [o] = I.computeOutAndReduceShapes(this.inputShape, [1]); + this.outputShape = o.length === 0 ? [1] : o, this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, [1, 1, 1]), this.reduceType = t10, this.shaderKey = `reduce_${t10}`; + } + getUserCode() { + let e = "", t10 = "0.0"; + this.reduceType === "min" || this.reduceType === "max" ? (e = ` + if (isnan(candidate)) { + bestValue = uniforms.NAN; + } else if (!isnan(bestValue) && candidate ${this.reduceType === "min" ? "<" : ">"} bestValue) + { bestValue = candidate; }`, t10 = "f32(x[offset])") : this.reduceType === "sum" || this.reduceType === "mean" ? e = " bestValue = bestValue + candidate; " : this.reduceType === "prod" && (e = " bestValue = bestValue * candidate; ", t10 = "1.0"); + let o = this.reduceType === "mean" ? "setOutputAtIndex(outputIndex, bestValue / f32(uniforms.reduceSize));" : "setOutputAtIndex(outputIndex, bestValue);"; + return ` + fn DIV_CEIL(a : u32, b : u32) -> u32 { + return ((a - 1u) / b + 1u); + } + + ${` + var xBestValues : array; + `} + fn getOffset(outputIndex : i32) -> i32 { + let outputCoords = getCoordsFromIndex(outputIndex); + let offset = ${this.outputShape.length === 1 ? "outputCoords" : "outputCoords[0]"} * uniforms.reduceSize; + return offset; + } + ${ue("index")} { + let outputIndex = index / i32(workGroupSizeX); + let offset = getOffset(outputIndex); + var bestValue = ${t10}; + let Length = uniforms.reduceSize; + let WorkPerThread = DIV_CEIL(u32(Length), workGroupSizeX); + for (var k = i32(localId.x); k < Length && outputIndex < uniforms.size; + k = k + i32(workGroupSizeX)) { + let candidate = f32(x[offset + k]); + ${e} + } + xBestValues[localId.x] = bestValue; + workgroupBarrier(); + + var reduceSize = min(u32(Length), workGroupSizeX); + for (var currentSize = reduceSize / 2u; reduceSize > 1u; + currentSize = reduceSize / 2u) { + let interval = DIV_CEIL(reduceSize, 2u); + if (localId.x < currentSize) { + let candidate = xBestValues[localId.x + interval]; + ${e} + xBestValues[localId.x] = bestValue; + } + reduceSize = interval; + workgroupBarrier(); + } + + if (localId.x == 0u && outputIndex < uniforms.size) { + ${o} + } + } + `; + } +}; +function Ys(r, e, t10, o, n) { + let s = r.shape.length, a = [], i = x.parseAxisParam(e, r.shape), p = i, u = I.getAxesPermutation(p, s), c = r; + u != null && (c = Nr({ inputs: { x: r }, attrs: { perm: u }, backend: n }), p = I.getInnerMostAxes(p.length, s), a.push(c)), I.assertAxesAreInnerMostDims(o, p, s); + let [l, m] = I.computeOutAndReduceShapes(c.shape, p), f = l; + t10 && (f = I.expandShapeToKeepDim(l, i)); + let d; + if ((o === "max" || o === "prod") && n.shouldExecuteOnCPU([c])) { + let h = n.tensorMap.get(c.dataId).values; + switch (o) { + case "max": + let g = rL(h, x.sizeFromShape(m), f, r.dtype); + d = n.makeTensorInfo(f, r.dtype, g); + break; + case "prod": + let { outVals: y, outShape: b, outDtype: C } = uL(c.shape, c.dtype, h, p); + d = n.makeTensorInfo(b, C, y); + break; + default: + throw new Error(`${o} CPU implementation is not yet supported.`); + } + } else { + let h = x.sizeFromShape(m), y = x.sizeFromShape(c.shape) / h, b = { windowSize: h, inSize: h, batchSize: y, outSize: 1 }, C = o === "mean" ? "float32" : Ca(r.dtype), w = [{ type: "int32", data: [h] }], k = new Qg(b, o), _ = n.runWebGPUProgram(k, [c], C, w); + a.push(_), d = xe({ inputs: { x: _ }, attrs: { shape: f }, backend: n }); + } + return a.forEach((h) => n.disposeData(h.dataId)), d; +} +function em(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { reductionIndices: s, keepDims: a } = o; + return Ys(n, s, a, "max", t10); +} +var NL = { kernelName: $n, backendName: "webgpu", kernelFunc: em }; +function DS(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { keepDims: s, axis: a } = o; + return Ys(n, a, s, "mean", t10); +} +var _L = { kernelName: An, backendName: "webgpu", kernelFunc: DS }; +function Zg(r, e, t10, o) { + if (e.filterWidth === 1 && e.filterHeight === 1 && x.arraysEqual(e.inShape, e.outShape)) + return Lt({ inputs: { x: r }, backend: o }); + if (e.filterWidth === e.inWidth && e.filterHeight === e.inHeight && e.batchSize === 1 && e.padInfo.type === "VALID") { + let a = r.shape.length, i = xe({ inputs: { x: r }, backend: o, attrs: { shape: [r.shape[a - 3] * r.shape[a - 2], r.shape[a - 1]] } }), p; + t10 === "avg" ? p = DS({ inputs: { x: i }, backend: o, attrs: { axis: 0, keepDims: false } }) : (x.assert(t10 === "max", () => `Invalid pool type ${t10}`), p = em({ inputs: { x: i }, backend: o, attrs: { reductionIndices: 0, keepDims: false } })); + let u = xe({ inputs: { x: p }, backend: o, attrs: { shape: e.outShape } }); + return o.disposeData(i.dataId), o.disposeData(p.dataId), u; + } + let n, s = [{ type: "int32", data: [e.strideHeight, e.strideWidth] }]; + return e.filterHeight === 1 && e.filterWidth === 1 ? n = new Yg(e) : (t10 === "avg" ? n = new Jl(e, "avg") : (x.assert(t10 === "max", () => `Invalid pool type ${t10}`), n = new Jl(e, "max")), s.push({ type: "int32", data: [e.padInfo.top, e.padInfo.left] }, { type: "int32", data: [e.dilationHeight, e.dilationWidth] }, { type: "int32", data: [e.inHeight, e.inWidth] }, { type: "int32", data: [e.effectiveFilterHeight, e.effectiveFilterWidth] })), o.runWebGPUProgram(n, [r], r.dtype, s); +} +function Kre(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { filterSize: s, strides: a, pad: i, dimRoundingMode: p } = o, u = 1, c = I.computePool2DInfo(n.shape, s, a, u, i, p); + return Zg(n, c, "avg", t10); +} +var EL = { kernelName: pn, backendName: "webgpu", kernelFunc: Kre }; +function jre(r) { + let { inputs: e, backend: t10, attrs: o } = r, { a: n, b: s } = e, { transposeA: a, transposeB: i } = o; + return _c({ a: n, b: s, transposeA: a, transposeB: i, backend: t10 }); +} +var $L = { kernelName: cn, backendName: "webgpu", kernelFunc: jre }; +var Jg = class { + constructor(e, t10) { + this.variableNames = ["source"], this.workPerThread = 1, this.workGroupSize = [64, 1, 1], this.size = true, this.outputShape = t10, this.rank = t10.length, this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize, [this.workPerThread, 1, 1]), this.start = e, this.uniforms = `start : ${At(e.length)}, `, this.shaderKey = "slice"; + } + getUserCode() { + let e = At(this.rank), t10 = Xre(this.rank), o; + return this.start.length === 1 ? o = this.outputShape.map((s, a) => "sourceLoc = uniforms.start + coords;") : o = this.outputShape.map((s, a) => `sourceLoc.${PS[a]} = uniforms.start.${Yo(a)} + coords.${PS[a]};`), ` + ${ue("index")} { + if (index < uniforms.size) { + var sourceLoc : ${e}; + let coords = getCoordsFromIndex(index); + ${o.join(` +`)} + setOutputAtIndex(index, getSource(${t10})); + } + } + `; + } +}; +var PS = ["x", "y", "z", "w", "u", "v"]; +function Xre(r) { + if (r === 1) + return "sourceLoc"; + if (r <= 6) + return PS.slice(0, r).map((e) => `sourceLoc.${e}`).join(","); + throw Error(`Slicing for rank ${r} is not yet supported`); +} +function ms(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { begin: s, size: a } = o, [i, p] = et.parseSliceParams(n, s, a); + if (et.assertParamsValid(n, i, p), t10.shouldExecuteOnCPU([n]) || n.dtype === "string") { + let l = t10.tensorMap.get(n.dataId), m = fL(l.values, i, p, n.shape, n.dtype); + return t10.makeTensorInfo(p, n.dtype, m); + } + if (x.sizeFromShape(p) === 0) + return t10.makeTensorInfo(p, n.dtype, []); + let u = new Jg(i, p), c = [{ type: "int32", data: i }]; + return t10.runWebGPUProgram(u, [n], n.dtype, c); +} +var RL = { kernelName: qn, backendName: "webgpu", kernelFunc: ms }; +var Yre = (r) => { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { blockShape: s, crops: a } = o; + x.assert(n.shape.length <= 4, () => "batchToSpaceND for rank > 4 with a WebGPU backend not implemented yet"); + let i = s.reduce((b, C) => b * C), p = I.getReshaped(n.shape, s, i), u = I.getPermuted(p.length, s.length), c = I.getReshapedPermuted(n.shape, s, i), l = I.getSliceBeginCoords(a, s.length), m = I.getSliceSize(c, a, s.length), f = [], d = xe({ inputs: { x: n }, backend: t10, attrs: { shape: p } }), h = Nr({ inputs: { x: d }, backend: t10, attrs: { perm: u } }), g = xe({ inputs: { x: h }, backend: t10, attrs: { shape: c } }), y = ms({ inputs: { x: g }, backend: t10, attrs: { begin: l, size: m } }); + return f.push(d), f.push(h), f.push(g), f.forEach((b) => t10.disposeData(b.dataId)), y; +}; +var AL = { kernelName: hs, backendName: "webgpu", kernelFunc: Yre }; +var OS = it({ opType: ye.NOT_EQUAL, dtype: "bool", cpuKernelImpl: iL }); +var FL = { kernelName: go, backendName: "webgpu", kernelFunc: OS }; +function Wa(r) { + let { inputs: e, backend: t10 } = r, { input: o } = e, n = t10.tensorMap.get(o.dataId); + return Lt({ inputs: { x: n.complexTensorInfos.real }, backend: t10 }); +} +var DL = { kernelName: la, backendName: "webgpu", kernelFunc: Wa }; +function PL(r, e) { + let t10 = new Zo(r.shape, pe.TO_INT), o = e.runWebGPUProgram(t10, [r], "int32"); + return { dataId: o.dataId, shape: o.shape, dtype: o.dtype }; +} +function MS(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { dtype: s } = o; + if (s === "complex64") { + if (n.dtype === "complex64") + return Lt({ inputs: { x: n }, backend: t10 }); + let a = Wr(n.shape), i = MS({ inputs: { x: n }, backend: t10, attrs: { dtype: "float32" } }), p = ls({ inputs: { real: i, imag: a }, backend: t10 }); + return a.dispose(), t10.disposeData(i.dataId), p; + } + if (n.dtype === "complex64") { + let a = Wa({ inputs: { input: n }, backend: t10 }), i = MS({ inputs: { x: a }, backend: t10, attrs: { dtype: s } }); + return t10.disposeData(a.dataId), i; + } + if (!x.hasEncodingLoss(n.dtype, s)) { + let a = Lt({ inputs: { x: n }, backend: t10 }); + return { dataId: a.dataId, shape: a.shape, dtype: s }; + } + if (t10.shouldExecuteOnCPU([n])) { + let a = t10.tensorMap.get(n.dataId).values, [i, p, u] = WM(a, n.shape, n.dtype, s); + return t10.makeTensorInfo(i, p, u); + } + if (s === "int32") + return PL(n, t10); + if (s === "bool") { + let a = t10.makeTensorInfo([], "bool", x.getTypedArrayFromDType("bool", 1)), p = OS({ inputs: { a: n, b: a }, backend: t10 }); + return t10.disposeData(a.dataId), p; + } + throw new Error(`Error in Cast: failed to cast ${n.dtype} to ${s}`); +} +var OL = { kernelName: to, backendName: "webgpu", kernelFunc: MS }; +var Qre = Ge({ opType: pe.CEIL, cpuKernelImpl: UM }); +var ML = { kernelName: ro, backendName: "webgpu", kernelFunc: Qre }; +var ex = class { + constructor(e) { + this.variableNames = ["A"], this.uniforms = "minVal : f32, maxVal : f32,", this.workPerThread = 4, this.workGroupSize = [64, 1, 1], this.isVec4 = true, this.size = true, this.outputShape = e, this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize, [this.workPerThread, 1, 1]), this.shaderKey = "clipVec4"; + } + getUserCode() { + return ` + ${ue("index")} { + if(index < uniforms.size) { + let value = getAByOutputIndex(index); + var clampedValue : vec4; + for (var i = 0; i < 4; i = i + 1) { + if (isnan(value[i])) { + clampedValue[i] = value[i]; + } else { + clampedValue[i] = clamp(value[i], uniforms.minVal, uniforms.maxVal); + } + } + + setOutputAtIndex(index, clampedValue); + } + } + `; + } +}; +var tx = class { + constructor(e) { + this.variableNames = ["A"], this.uniforms = "minVal : f32, maxVal : f32,", this.workGroupSize = [64, 1, 1], this.size = true, this.outputShape = e, this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize), this.shaderKey = "clip"; + } + getUserCode() { + return ` + ${ue("index")} { + if(index < uniforms.size) { + let value = getAByOutputIndex(index); + if (isnan(value)) { + setOutputAtIndex(index, value); + return; + } + setOutputAtIndex(index, clamp(value, uniforms.minVal, uniforms.maxVal)); + } + } + `; + } +}; +function Zre(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { clipValueMin: s, clipValueMax: a } = o, i, p = [{ type: "float32", data: [s] }, { type: "float32", data: [a] }]; + return x.sizeFromShape(n.shape) % 4 === 0 ? i = new ex(n.shape) : i = new tx(n.shape), t10.runWebGPUProgram(i, [n], n.dtype, p); +} +var LL = { kernelName: Ro, backendName: "webgpu", kernelFunc: Zre }; +var rx = class { + constructor(e) { + this.uniforms = "", this.workPerThread = 1, this.workGroupSize = [64, 1, 1], this.size = true, this.outputShape = I.computeOutShape(e, 1), this.variableNames = e.map((t10, o) => `T${o}`), this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize, [this.workPerThread, 1, 1]), this.offsetLength = e.length - 1; + for (let t10 = 0; t10 < this.offsetLength; t10++) + this.uniforms += `offset${t10} : i32,`; + this.shaderKey = "concat"; + } + getUserCode() { + let e = []; + if (this.offsetLength > 0) { + e.push("if (yC < uniforms.offset0){ setOutputAtCoords(coords.x, coords.y, getT0(yR, yC)); }"); + for (let s = 1; s < this.offsetLength; s++) + e.push(`else if (yC < uniforms.offset${[s]}){ setOutputAtCoords(coords.x, coords.y, getT${s}(yR, yC - uniforms.offset${s - 1})); }`); + let o = this.offsetLength, n = this.offsetLength - 1; + e.push(`else { setOutputAtCoords(coords.x, coords.y, getT${o}(yR, yC - uniforms.offset${n})); }`); + } else + e.push("setOutputAtCoords(coords.x, coords.y, getT0(yR, yC));"); + return ` + ${ue("index")} { + for(var i = 0; i < ${this.workPerThread}; i = i + 1) { + let flatIndex = index * ${this.workPerThread} + i; + if(flatIndex < uniforms.size) { + let coords = getCoordsFromIndex(flatIndex); + let yR = coords.x; + let yC = coords.y; + + ${e.join(` + `)} + } + } + } + `; + } +}; +function qu(r) { + let { inputs: e, backend: t10 } = r, { input: o } = e, n = t10.tensorMap.get(o.dataId); + return Lt({ inputs: { x: n.complexTensorInfos.imag }, backend: t10 }); +} +var BL = { kernelName: Ya, backendName: "webgpu", kernelFunc: qu }; +function Fc(r, e, t10) { + let o = r[0].dtype; + if (o === "complex64") { + let d = r.map((C) => Wa({ inputs: { input: C }, backend: t10 })), h = r.map((C) => qu({ inputs: { input: C }, backend: t10 })), g = Fc(d, e, t10), y = Fc(h, e, t10), b = ls({ inputs: { real: g, imag: y }, backend: t10 }); + return d.forEach((C) => t10.disposeData(C.dataId)), h.forEach((C) => t10.disposeData(C.dataId)), t10.disposeData(g.dataId), t10.disposeData(y.dataId), b; + } + let n = t10.shouldExecuteOnCPU(r); + if (o === "string" && (n = true), n) { + let d = r.map((k) => { + let E = [-1, x.sizeFromShape(k.shape.slice(e))]; + return xe({ inputs: { x: k }, backend: t10, attrs: { shape: E } }); + }), h = d.map((k) => ({ vals: t10.readSync(k.dataId), shape: k.shape })), g = I.computeOutShape(d.map((k) => k.shape), 1), y = d[0].shape[0] === 1, b = GM(h, g, o, y), C = I.computeOutShape(r.map((k) => k.shape), e), w = t10.makeTensorInfo(C, o, b); + return d.forEach((k) => t10.disposeData(k.dataId)), w; + } + let s = t10.device.limits.maxStorageBuffersPerShaderStage - 1; + if (r.length > s) { + let d = []; + for (let g = 0; g < r.length; g += s) { + let y = r.slice(g, g + s); + d.push(Fc(y, e, t10)); + } + let h = Fc(d, e, t10); + for (let g of d) + t10.disposeData(g.dataId); + return h; + } + let { tensors2D: a, outShape: i } = Jre(r, e, t10), p = a.map((d) => d.shape), u = new rx(p), c = [], l = new Array(p.length - 1); + if (l.length > 0) { + l[0] = p[0][1], c.push({ type: "int32", data: [l[0]] }); + for (let d = 1; d < l.length; d++) + l[d] = l[d - 1] + p[d][1], c.push({ type: "int32", data: [l[d]] }); + } + let m = t10.runWebGPUProgram(u, a, a[0].dtype, c); + a.forEach((d) => t10.disposeData(d.dataId)); + let f = xe({ inputs: { x: m }, backend: t10, attrs: { shape: i } }); + return t10.disposeData(m.dataId), f; +} +function Jre(r, e, t10) { + let o = I.computeOutShape(r.map((s) => s.shape), e); + return { tensors2D: r.map((s) => xe({ inputs: { x: s }, backend: t10, attrs: { shape: [x.sizeFromShape(s.shape.slice(0, e)), x.sizeFromShape(s.shape.slice(e))] } })), outShape: o }; +} +function LS(r) { + let { inputs: e, backend: t10, attrs: o } = r, { axis: n } = o, s = x.parseAxisParam(n, e[0].shape)[0], a = e.map((u) => u.shape); + I.assertParamsConsistent(a, s); + let i = I.computeOutShape(e.map((u) => u.shape), s); + if (x.sizeFromShape(i) === 0) + return t10.makeTensorInfo(i, e[0].dtype, []); + let p = e.filter((u) => x.sizeFromShape(u.shape) > 0); + return p.length === 1 ? Lt({ inputs: { x: p[0] }, backend: t10 }) : Fc(p, s, t10); +} +var VL = { kernelName: gs, backendName: "webgpu", kernelFunc: LS }; +function eoe(r, e, t10, o, n = false, s = null, a = false, i = 4, p = 4, u = 4) { + let c = (A) => { + switch (A) { + case 1: + return "resData = x[xIndex];"; + case 3: + return "resData = vec3(x[xIndex], x[xIndex + 1], x[xIndex + 2]);"; + case 4: + return "resData = x[xIndex / 4];"; + default: + throw new Error(`innerElementSize ${A} is not supported.`); + } + }, l = (A) => { + switch (A) { + case 1: + return "return W[row * uniforms.wShape[3] + colIn];"; + case 4: + return "return W[row * uniforms.wShape[3] / 4 + colIn];"; + default: + throw new Error(`innerElementSize ${A} is not supported.`); + } + }, m = r ? ` + let coord = vec4(batch, xRow, xCol, xCh); + ` : ` + let coord = vec4(batch, xCh, xRow, xCol); + `, f = r ? ` + let coords = vec4( + batch, + row / outWidth, + row % outWidth, + col); + ` : ` + let coords = vec4( + batch, + row, + col / outWidth, + col % outWidth); + `, d = r ? "uniforms.xShape[1]" : "uniforms.xShape[2]", h = r ? "uniforms.xShape[2]" : "uniforms.xShape[3]", g = r ? "row" : "col", y = r ? "col" : "row", b = ` + let inChannels = uniforms.wShape[2]; + let outWidth = ${r ? "uniforms.outShape[2]" : "uniforms.outShape[3]"}; + let outRow = ${g} / outWidth; + let outCol = ${g} % outWidth; + + let WRow = ${y} / (uniforms.filterDims[1] * inChannels); + let WCol = ${y} / inChannels % uniforms.filterDims[1]; + let xRow = outRow * uniforms.stride[0] + uniforms.dilation[0] * WRow - uniforms.pad[0]; + let xCol = outCol * uniforms.stride[1] + uniforms.dilation[1] * WCol - uniforms.pad[1]; + let xCh = ${y} % inChannels; + var resData = ${vt(i)}(0.0); + // The bounds checking is always needed since we use it to pad zero for + // the 'same' padding type. + if (xRow >= 0 && xRow < ${d} && xCol >= 0 && xCol < ${h}) { + ${m} + let xIndex = getIndexFromCoords4D(coord, uniforms.xShape); + ${c(i)} + } + return resData;`, C = r ? e && o ? ` + let col = colIn * ${i}; + ${b}` : ` + let col = colIn * ${i}; + if (row < uniforms.dimAOuter && col < uniforms.dimInner) { + ${b} + } + return ${vt(i)}(0.0);` : o && t10 ? ` + let col = colIn * ${i}; + ${b}` : ` + let col = colIn * ${i}; + if (row < uniforms.dimInner && col < uniforms.dimBOuter) { + ${b} + } + return ${vt(i)}(0.0);`, w = `${l(p)}`, k = vt(u), _ = r ? vt(i) : vt(p), E = r ? vt(p) : vt(i); + return ` + ${ur(s, a, u === 4, 4)} + fn mm_readA(batch: i32, row : i32, colIn : i32) -> ${_} { + ${r ? C : w} + } + + fn mm_readB(batch: i32, row : i32, colIn : i32) -> ${E} { + ${r ? w : C} + } + + fn mm_write(batch: i32, row : i32, colIn : i32, valueIn : ${k}) { + let col = colIn * ${u}; + if (row < uniforms.dimAOuter && col < uniforms.dimBOuter) + { + var value = valueIn; + let outWidth = ${r ? "uniforms.outShape[2]" : "uniforms.outShape[3]"}; + ${f} + ${Kr(n, s)} + setOutputAtCoords(coords[0], coords[1], coords[2], coords[3], value); + } + }`; +} +var ox = class { + constructor(e, t10, o, n, s = false, a = null, i = false, p = false) { + this.variableNames = ["x", "W"], this.uniforms = "filterDims : vec2, pad : vec2, stride : vec2, dilation : vec2, dimAOuter : i32, dimBOuter : i32, dimInner : i32,", this.outputShape = e.outShape, this.isChannelsLast = e.dataFormat === "channelsLast", this.isVec4 = ((e.inChannels % 4 === 0 || e.inChannels % 3 === 0) && this.isChannelsLast || e.outWidth % 4 === 0 && !this.isChannelsLast) && e.outChannels % 4 === 0, this.dispatchLayout = this.isChannelsLast ? { x: [3], y: [1, 2], z: [0] } : { x: [2, 3], y: [1], z: [0] }, this.workGroupSize = Hl(this.dispatchLayout, this.outputShape, this.isVec4), this.elementsPerThread = ql(this.dispatchLayout, this.outputShape, this.isVec4), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize, this.elementsPerThread), this.isVec4 ? (this.isChannelsLast && e.inChannels % 4 !== 0 ? (this.innerElementSize = 3, this.variableTypes = ["f32", "vec4"]) : (this.innerElementSize = 4, this.variableTypes = ["vec4", "vec4"]), s && (this.variableNames.push("bias"), this.variableTypes.push("vec4")), i && (this.variableNames.push("preluActivationWeights"), this.variableTypes.push("vec4"))) : (this.innerElementSize = this.elementsPerThread[0], s && this.variableNames.push("bias"), i && this.variableNames.push("preluActivationWeights")), this.sequentialAccessByThreads = p, this.addBias = s, this.activation = a, this.hasPreluActivationWeights = i, this.tileAOuter = this.workGroupSize[1] * this.elementsPerThread[1], this.tileBOuter = this.workGroupSize[0] * this.elementsPerThread[0], this.tileInner = Math.max(this.workGroupSize[0] * this.innerElementSize, this.workGroupSize[1]), this.fitAOuter = t10 % this.tileAOuter === 0, this.fitBOuter = o % this.tileBOuter === 0, this.fitInner = n % this.tileInner === 0, this.shaderKey = `conv2DMM_${this.elementsPerThread}_${this.activation}}_${this.fitAOuter}_${this.fitBOuter}_${this.fitInner}_${this.isVec4}_${this.innerElementSize}_${this.isChannelsLast}_${this.sequentialAccessByThreads}`; + } + getUserCode() { + let e = this.isVec4 ? Uu(this.elementsPerThread, this.workGroupSize, !this.isChannelsLast, this.tileInner) : Gu(this.elementsPerThread, this.workGroupSize, !this.isChannelsLast, this.tileInner, false, null, this.sequentialAccessByThreads), t10 = this.isVec4 ? [this.innerElementSize, 4, 4] : [1, 1, 1]; + return ` + ${eoe(this.isChannelsLast, this.fitAOuter, this.fitBOuter, this.fitInner, this.addBias, this.activation, this.hasPreluActivationWeights, t10[0], t10[1], t10[2])} + ${e} + `; + } +}; +var nx = class { + constructor(e, t10 = false, o = null, n = false) { + this.variableNames = ["x", "W"], this.uniforms = "filterDims: vec2, pad: vec2, stride: vec2, dilation: vec2,", this.workGroupSize = [4, 4, 8], this.outputShape = e.outShape, this.isChannelsLast = e.dataFormat === "channelsLast", this.dispatchLayout = this.isChannelsLast ? { x: [2], y: [1], z: [0, 3] } : { x: [3], y: [2], z: [0, 1] }, this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize), this.addBias = t10, this.activation = o, this.hasPreluActivationWeights = n, t10 && this.variableNames.push("bias"), n && this.variableNames.push("preluActivationWeights"), this.shaderKey = `conv2dnaive_${this.activation}_${this.isChannelsLast}`; + } + getUserCode() { + return ` + ${ur(this.activation, this.hasPreluActivationWeights, false, 4)} + fn readInp(batch : i32, row : i32, col : i32, chan : i32) -> f32{ + let coords = vec4(batch, row, col, chan); + if (coordsInBounds4D(coords, uniforms.xShape)) { + return getX(batch, row, col, chan); + } else { + return 0.0; + } + } + fn readFilt(row : i32, col : i32, xChannel : i32, outChannel : i32) -> f32{ + let coords = vec4(row, col, xChannel, outChannel); + if(coordsInBounds4D(coords, uniforms.wShape)) { + return getW(row, col, xChannel, outChannel); + } else { + return 0.0; + } + } + fn writeResult(batch : i32, row : i32, col : i32, chan : i32, valueIn : f32) { + let coords = ${this.isChannelsLast ? "vec4(batch, row, col, chan);" : "vec4(batch, chan, row, col);"} + if (coordsInBounds4D(coords, uniforms.outShape)) { + var value = valueIn; + ${Kr(this.addBias, this.activation)} + setOutputAtCoords(coords.x, coords.y, coords.z, coords.w, value); + } + } + ${ue("index")} { + let coords = getOutputCoords(); + let batch = coords[0]; + let outChannel = ${this.isChannelsLast ? "coords[3];" : "coords[1];"} + let outRow = ${this.isChannelsLast ? "coords[1];" : "coords[2];"} + let outCol = ${this.isChannelsLast ? "coords[2];" : "coords[3];"} + var acc : f32 = 0.0; + for (var row = 0; row < uniforms.filterDims[0]; row = row + 1) { + for (var col = 0; col < uniforms.filterDims[1]; col = col + 1) { + let xRow = outRow * uniforms.stride[0] + uniforms.dilation[0] * row - uniforms.pad[0]; + let xCol = outCol * uniforms.stride[1] + uniforms.dilation[1] * col - uniforms.pad[1]; + for (var xChannel = 0; xChannel < ${this.isChannelsLast ? "uniforms.xShape[3];" : "uniforms.xShape[1];"} xChannel = xChannel + 1) { + ${this.isChannelsLast ? "let v = readInp(batch, xRow, xCol, xChannel);" : "let v = readInp(batch, xChannel, xRow, xCol);"} + let f = readFilt(row, col, xChannel, outChannel); + acc = acc + v * f; + } + } + } + writeResult(batch, outRow, outCol, outChannel, acc); + } + `; + } +}; +function zL(r, e) { + let t10 = r.length; + return t10 >= 3 ? e ? [...r.slice(0, -3), r[t10 - 3] * r[t10 - 2], r[t10 - 1]] : [...r.slice(0, -3), r[t10 - 3], r[t10 - 2] * r[t10 - 1]] : !e && t10 === 1 && r[0] > 1 ? [r[0], 1] : null; +} +function toe({ x: r, filter: e, convInfo: t10, backend: o, bias: n = null, preluActivationWeights: s = null, leakyreluAlpha: a = 0, activation: i = null }) { + let p = t10.dataFormat === "channelsLast", u = !p, c = false, l = p && t10.filterHeight === t10.inHeight && t10.filterWidth === t10.inWidth && t10.padInfo.type === "VALID", m = [], f, d; + if (l) { + let y = t10.inHeight * t10.inWidth * t10.inChannels; + f = xe({ inputs: { x: r }, backend: o, attrs: { shape: [1, t10.batchSize, y] } }), d = xe({ inputs: { x: e }, backend: o, attrs: { shape: [1, y, t10.outChannels] } }); + } else + f = xe({ inputs: { x: r }, backend: o, attrs: { shape: p ? [t10.batchSize, t10.inHeight * t10.inWidth, t10.inChannels] : [t10.batchSize, t10.inChannels, t10.inHeight * t10.inWidth] } }), d = xe({ inputs: { x: e }, backend: o, attrs: { shape: [1, t10.inChannels, t10.outChannels] } }); + if (m.push(f), m.push(d), s != null) { + let y = zL(s.shape, p); + y != null && (s = xe({ inputs: { x: s }, backend: o, attrs: { shape: y } }), m.push(s)); + } + if (n != null) { + let y = zL(n.shape, p); + y != null && (n = xe({ inputs: { x: n }, backend: o, attrs: { shape: y } }), m.push(n)); + } + let h = _c({ a: p ? f : d, b: p ? d : f, transposeA: u, transposeB: c, backend: o, bias: n, activation: i, preluActivationWeights: s, leakyreluAlpha: a }), g = xe({ inputs: { x: h }, backend: o, attrs: { shape: t10.outShape } }); + m.push(h); + for (let y of m) + o.disposeData(y.dataId); + return g; +} +function sx({ x: r, filter: e, convInfo: t10, backend: o, bias: n = null, preluActivationWeights: s = null, leakyreluAlpha: a = 0, activation: i = null }) { + let p = n != null, u = s != null, c = t10.dataFormat === "channelsLast", l = c && t10.filterHeight === t10.inHeight && t10.filterWidth === t10.inWidth && t10.padInfo.type === "VALID", m = P().getBool("WEBGPU_USE_NAIVE_CONV2D_DEBUG"); + if (!m && (l || t10.filterHeight === 1 && t10.filterWidth === 1 && t10.dilationHeight === 1 && t10.dilationWidth === 1 && t10.strideHeight === 1 && t10.strideWidth === 1 && (t10.padInfo.type === "SAME" || t10.padInfo.type === "VALID"))) + return toe({ x: r, filter: e, convInfo: t10, backend: o, bias: n, activation: i, preluActivationWeights: s, leakyreluAlpha: a }); + let f, d = [t10.padInfo.top, t10.padInfo.left], h = [{ type: "int32", data: [t10.filterHeight, t10.filterWidth] }, { type: "int32", data: [...d] }, { type: "int32", data: [t10.strideHeight, t10.strideWidth] }, { type: "int32", data: [t10.dilationHeight, t10.dilationWidth] }]; + if (m) + f = new nx(t10, p, i, u); + else { + let C = c ? t10.outHeight * t10.outWidth : t10.outChannels, w = c ? t10.outChannels : t10.outHeight * t10.outWidth, k = t10.filterHeight * t10.filterWidth * t10.inChannels; + h.push({ type: "int32", data: [C] }, { type: "int32", data: [w] }, { type: "int32", data: [k] }); + let _ = o.adapterInfo.isIntel(); + f = new ox(t10, C, w, k, p, i, u, _); + } + let g = [], y = [r, e]; + p && (!c && n.shape.length === 1 && (n = xe({ inputs: { x: n }, backend: o, attrs: { shape: [n.shape[0], 1, 1] } }), g.push(n)), y.push(n)), u && (!c && s.shape.length === 1 && (s = xe({ inputs: { x: s }, backend: o, attrs: { shape: [s.shape[0], 1, 1] } }), g.push(s)), y.push(s)), i === "leakyrelu" && (h.push({ type: "float32", data: [a] }), f.uniforms += " alpha : f32,"); + let b = o.runWebGPUProgram(f, y, r.dtype, h); + for (let C of g) + o.disposeData(C.dataId); + return b; +} +function roe(r) { + let { inputs: e, attrs: t10, backend: o } = r, { x: n, filter: s } = e, { strides: a, pad: i, dataFormat: p, dilations: u, dimRoundingMode: c } = t10, l = I.convertConv2DDataFormat(p), m = I.computeConv2DInfo(n.shape, s.shape, a, u, i, c, false, l); + return sx({ x: n, filter: s, convInfo: m, backend: o }); +} +var WL = { kernelName: ln, backendName: "webgpu", kernelFunc: roe }; +function ooe(r = 4) { + let e = (s) => { + switch (s) { + case 1: + return "return W[getIndexFromCoords4D(coord, uniforms.wShape)];"; + case 4: + return ` + let coord1 = vec4(coordX, coordY, col + 1, rowInner); + let coord2 = vec4(coordX, coordY, col + 2, rowInner); + let coord3 = vec4(coordX, coordY, col + 3, rowInner); + let v0 = W[getIndexFromCoords4D(coord, uniforms.wShape)]; + let v1 = W[getIndexFromCoords4D(coord1, uniforms.wShape)]; + let v2 = W[getIndexFromCoords4D(coord2, uniforms.wShape)]; + let v3 = W[getIndexFromCoords4D(coord3, uniforms.wShape)]; + return vec4(v0, v1, v2, v3); + `; + default: + throw new Error(`innerElementSize ${s} is not supported.`); + } + }, o = `if (row < uniforms.dimAOuter && col < uniforms.dimInner) { + ${` + let outRow = row / uniforms.outShape[2]; + let outCol = row % uniforms.outShape[2]; + + let WRow = col / (uniforms.filterDims[1] * uniforms.outBackprop[3]); + let WCol = col / uniforms.outBackprop[3] % uniforms.filterDims[1]; + let xR = f32(outRow - uniforms.pads[0] + WRow) / f32(uniforms.stride[0]); + let xC = f32(outCol - uniforms.pads[1] + WCol) / f32(uniforms.stride[1]); + if (xR < 0.0 || xR >= f32(uniforms.outBackprop[1]) || fract(xR) > 0.0) { + return ${vt(r)}(0.0); + } + if (xC < 0.0 || xC >= f32(uniforms.outBackprop[2]) || fract(xC) > 0.0) { + return ${vt(r)}(0.0); + } + let coord = vec4( + batch, + i32(xR), + i32(xC), + col % uniforms.outBackprop[3]); + return x[getIndexFromCoords4D(coord, uniforms.xShape)/${r}];`} + } + return ${vt(r)}(0.0);`; + return ` + fn mm_readA(batch: i32, row : i32, colIn : i32) -> ${vt(r)} { + let col = colIn * ${r}; + ${o} + } + + fn mm_readB(batch: i32, row : i32, colIn : i32) -> ${vt(r)} { + let col = colIn * ${r}; + let coordX = uniforms.filterDims.x - 1 - + row / (uniforms.filterDims[1] * uniforms.outBackprop[3]); + let coordY = uniforms.filterDims.y - 1 - + (row / uniforms.outBackprop[3]) % uniforms.filterDims[1]; + if (row < uniforms.dimInner && col < uniforms.dimBOuter && + coordX >= 0 && coordY >= 0) { + let rowInner = row % uniforms.outBackprop[3]; + let coord = vec4(coordX, coordY, col, rowInner); + ${e(r)} + } + return ${vt(r)}(0.0); + } + + fn mm_write(batch: i32, row : i32, colIn : i32, valueInput : ${vt(r)}) { + let col = colIn * ${r}; + if (row < uniforms.dimAOuter && (col + ${r - 1}) < uniforms.dimBOuter) { + var value = valueInput; + let outCoord = vec4( + batch, + row / uniforms.outShape[2], + row % uniforms.outShape[2], + col); + result[getIndexFromCoords4D(outCoord, uniforms.outShape)/${r}] = value; + } + }`; +} +var ax = class { + constructor(e) { + this.variableNames = ["x", "W"], this.uniforms = "filterDims : vec2, pads : vec2, stride : vec2, outBackprop : vec4, dimAOuter : i32, dimBOuter : i32, dimInner : i32,", this.outputShape = e.inShape, x.assert(e.dataFormat === "channelsLast", () => "TODO: NCHW is unimplemented"), this.isVec4 = e.inChannels % 4 === 0 && e.outChannels % 4 === 0, this.dispatchLayout = { x: [3], y: [1, 2], z: [0] }, this.workGroupSize = Hl(this.dispatchLayout, this.outputShape, this.isVec4), this.elementsPerThread = ql(this.dispatchLayout, this.outputShape, this.isVec4), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize, this.elementsPerThread), this.isVec4 && (this.variableTypes = ["vec4", "f32"]), this.shaderKey = `conv2DDerInputMM_${this.isVec4}_${this.elementsPerThread}`; + } + getUserCode() { + let e = this.isVec4 ? Uu(this.elementsPerThread, this.workGroupSize) : Gu(this.elementsPerThread, this.workGroupSize); + return ` + ${ooe(this.isVec4 ? 4 : 1)} + ${e} + `; + } +}; +var ix = class { + constructor(e) { + this.variableNames = ["dy", "W"], this.uniforms = "filterDims : vec2, pads : vec2, stride : vec2, outBackprop : vec4,", this.workGroupSize = [64, 1, 1], this.size = true, this.outputShape = e.inShape, this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize), this.isChannelsLast = e.dataFormat === "channelsLast", this.shaderKey = `conv2DDerInput_${this.isChannelsLast}`; + } + getUserCode() { + let e = this.isChannelsLast ? 1 : 2, t10 = this.isChannelsLast ? 2 : 3, o = this.isChannelsLast ? 3 : 1; + return ` + ${ue("index")} { + if(index < uniforms.size) { + let coords = getCoordsFromIndex(index); + let batch = coords[0]; + let d1 = coords[${o}]; + + let dyCorner = vec2(coords[${e}], coords[${t10}]) - uniforms.pads; + let dyRCorner = dyCorner.x; + let dyCCorner = dyCorner.y; + + // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1). + // ? = to be determined. : = across all values in that axis. + var dotProd = 0.0; + for (var wR = 0; wR < uniforms.filterDims.x; wR = wR + 1) { + let dyR = (f32(dyRCorner) + f32(wR)) / f32(uniforms.stride.x); + let wRPerm = uniforms.filterDims.x - 1 - wR; + if (dyR < 0.0 || dyR >= f32(uniforms.outBackprop[1]) || fract(dyR) > 0.0 || + wRPerm < 0) { + continue; + } + let idyR = i32(dyR); + + for (var wC = 0; wC < uniforms.filterDims.y; wC = wC + 1) { + let dyC = (f32(dyCCorner) + f32(wC)) / f32(uniforms.stride.y); + let wCPerm = uniforms.filterDims.y - 1 - wC; + if (dyC < 0.0 || dyC >= f32(uniforms.outBackprop[2]) || + fract(dyC) > 0.0 || wCPerm < 0) { + continue; + } + let idyC = i32(dyC); + + for (var d2 = 0; d2 < uniforms.outBackprop[3]; d2 = d2 + 1) { + if (${this.isChannelsLast}) { + let xValue = getDy(batch, idyR, idyC, d2); + let wValue = getW(wRPerm, wCPerm, d1, d2); + dotProd = dotProd + xValue * wValue; + } else { + let xValue = getDy(batch, d2, idyR, idyC); + let wValue = getW(wRPerm, wCPerm, d1, d2); + dotProd = dotProd + xValue * wValue; + } + + } + } + } + setOutputAtIndex(index, dotProd); + } + } + `; + } +}; +function noe(r) { + let { inputs: e, backend: t10, attrs: o } = r, { dy: n, filter: s } = e, { inputShape: a, strides: i, pad: p, dataFormat: u, dimRoundingMode: c } = o, l = I.convertConv2DDataFormat(u), m = I.computeConv2DInfo(a, s.shape, i, 1, p, c, false, l), f = [{ type: "int32", data: [m.filterHeight, m.filterWidth] }, { type: "int32", data: [m.filterHeight - 1 - m.padInfo.top, m.filterWidth - 1 - m.padInfo.left] }, { type: "int32", data: [m.strideHeight, m.strideWidth] }, { type: "int32", data: [m.batchSize, m.outHeight, m.outWidth, m.outChannels] }], d; + if (P().getBool("WEBGPU_USE_NAIVE_CONV2D_TRANSPOSE") || m.filterHeight <= 2 && m.filterWidth <= 2 && m.outChannels <= 16 && m.inChannels === 1) + d = new ix(m); + else { + d = new ax(m); + let h = m.inHeight * m.inWidth, g = m.inChannels, y = m.filterHeight * m.filterWidth * m.outChannels; + f.push({ type: "uint32", data: [h] }, { type: "uint32", data: [g] }, { type: "uint32", data: [y] }); + } + return t10.runWebGPUProgram(d, [n, s], "float32", f); +} +var UL = { kernelName: mn, backendName: "webgpu", kernelFunc: noe }; +var soe = Ge({ opType: pe.COS }); +var GL = { kernelName: fn, backendName: "webgpu", kernelFunc: soe }; +var aoe = Ge({ opType: pe.COSH }); +var HL = { kernelName: dn, backendName: "webgpu", kernelFunc: aoe }; +var ux = class { + constructor(e, t10, o, n) { + this.variableNames = ["Image", "Boxes", "BoxInd"], this.uniforms = "extrapolationValue : f32,", this.workGroupSize = [64, 1, 1], this.size = true; + let [s] = t10; + this.outputShape = [s, o[0], o[1], e], this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize), this.methodId = n === "bilinear" ? 1 : 0, this.cropHeightBiggerThan1 = this.outputShape[1] > 1, this.cropWidthBiggerThan1 = this.outputShape[2] > 1, this.shaderKey = `cropAndResize_${this.methodId}_${this.cropHeightBiggerThan1}_${this.cropWidthBiggerThan1}`; + } + getUserCode() { + let [e, t10] = ["f32(uniforms.imageShape[1] - 1)", "f32(uniforms.imageShape[2] - 1)"], [o, n, s] = this.cropHeightBiggerThan1 ? [`(${e} / f32(uniforms.outShape[1] - 1))`, "(y2-y1) * height_ratio", `y1*${e} + f32(y)*(height_scale)`] : ["0.0", "0.0", `0.5 * (y1+y2) * ${e}`], [a, i, p] = this.cropWidthBiggerThan1 ? [`(${t10} / f32(uniforms.outShape[2] - 1))`, "(x2-x1) * width_ratio", `x1*${t10} + f32(x)*(width_scale)`] : ["0.0", "0.0", `0.5 * (x1+x2) * ${t10}`]; + return ` + ${ue("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + let height_ratio = f32(${o}); + let width_ratio = f32(${a}); + let b = coords[0]; + let y = coords[1]; + let x = coords[2]; + let d = coords[3]; + // get box vals + let y1 = getBoxes(b, 0); + let x1 = getBoxes(b, 1); + let y2 = getBoxes(b, 2); + let x2 = getBoxes(b, 3); + // get image in batch index + let bInd = i32(round(getBoxInd(b))); + if(bInd < 0 || bInd >= uniforms.outShape[0]) { + return; + } + let height_scale = ${n}; + let width_scale = ${i}; + let in_y = ${s}; + if( in_y < 0.0 || in_y > ${e} ) { + setOutputAtIndex(index, uniforms.extrapolationValue); + return; + } + let in_x = ${p}; + if( in_x < 0.0 || in_x > ${t10} ) { + setOutputAtIndex(index, uniforms.extrapolationValue); + return; + } + let sourceFracIndexCR = vec2(in_x,in_y); + if(${this.methodId} == 1) { + // Compute the four integer indices. + let sourceFloorCR = vec2(sourceFracIndexCR); + let sourceCeilCR = vec2(ceil(sourceFracIndexCR)); + let topLeft = getImage(bInd, sourceFloorCR.y, sourceFloorCR.x, d); + let bottomLeft = getImage(bInd, sourceCeilCR.y, sourceFloorCR.x, d); + let topRight = getImage(bInd, sourceFloorCR.y, sourceCeilCR.x, d); + let bottomRight = getImage(bInd, sourceCeilCR.y, sourceCeilCR.x, d); + let fracCR = sourceFracIndexCR - vec2(sourceFloorCR); + let top = topLeft + (topRight - topLeft) * fracCR.x; + let bottom = bottomLeft + (bottomRight - bottomLeft) * fracCR.x; + let newValue = top + (bottom - top) * fracCR.y; + setOutputAtIndex(index, newValue); + } else { + // Compute the coordinators of nearest neighbor point. + let sourceNearestCR = vec2(floor( + sourceFracIndexCR + vec2(0.5,0.5))); + let newValue = getImage( + bInd, sourceNearestCR.y, sourceNearestCR.x, d); + setOutputAtIndex(index, newValue); + } + } + } + `; + } +}; +var ioe = (r) => { + let { inputs: e, backend: t10, attrs: o } = r, { image: n, boxes: s, boxInd: a } = e, { cropSize: i, method: p, extrapolationValue: u } = o, c = new ux(n.shape[3], s.shape, i, p), l = [{ type: "float32", data: [u] }]; + return t10.runWebGPUProgram(c, [n, s, a], "float32", l); +}; +var qL = { kernelName: xn, backendName: "webgpu", kernelFunc: ioe }; +var Ku; +(function(r) { + r.Prod = "*", r.Sum = "+"; +})(Ku || (Ku = {})); +var tm = class { + constructor(e, t10, o, n) { + this.variableNames = ["x"], this.uniforms = "index : f32,", this.size = true; + let s = 128; + this.workGroupSize = [s, 1, 1], this.outputShape = t10, this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize), this.exclusive = o, this.reverse = n, this.op = e, this.shaderKey = `cum_${this.op}_${this.exclusive}_${this.reverse}`; + } + getUserCode() { + let e = this.outputShape.length, t10 = this.op === Ku.Prod ? "1.0" : "0.0", o = this.exclusive ? t10 : `getX(${KL(e, "coords", this.op)})`, n = this.outputShape[this.outputShape.length - 1], s = "", a = ""; + return this.exclusive ? (s = this.reverse ? `end != ${n - 1}` : "end != 0", a = this.reverse ? "end + 1" : "end - 1") : (s = this.reverse ? `end + pow2 < ${n}` : "end >= pow2", a = this.reverse ? "end + pow2" : "end - pow2"), ` + ${ue("index")} { + if (index < uniforms.size) { + var coords = getCoordsFromIndex(index); + + let end = ${jL(e, "coords", this.op)}; + var val = ${o}; + let pow2 = i32(pow(2.0, uniforms.index)); + if (${s}) { + let idx = ${a}; + ${jL(e, "coords", this.op)} = idx; + val ${this.op}= getX(${KL(e, "coords", this.op)}); + } + setOutputAtIndex(index, val); + } + } + `; + } +}; +function KL(r, e, t10) { + if (r === 1) + return `${e}`; + if (r === 2) + return `${e}.x, ${e}.y`; + if (r === 3) + return `${e}.x, ${e}.y, ${e}.z`; + if (r === 4) + return `${e}.x, ${e}.y, ${e}.z, ${e}.w`; + throw Error(`Cumulative ${t10} for rank ${r} is not yet supported`); +} +function jL(r, e, t10) { + if (r === 1) + return `${e}`; + if (r === 2) + return `${e}.y`; + if (r === 3) + return `${e}.z`; + if (r === 4) + return `${e}.w`; + throw Error(`Cumulative ${t10} for rank ${r} is not yet supported`); +} +function px(r, e, t10, o, n, s) { + let a = e.shape.length, i = I.getAxesPermutation([o], a), p = e; + i != null && (p = Nr({ inputs: { x: e }, backend: t10, attrs: { perm: i } })); + let u = I.getInnerMostAxes(1, a)[0]; + if (u !== a - 1) + throw new Error(`WebGPU cumprod shader expects an inner-most axis=${e.shape.length - 1} but got axis=${o}`); + let c = p.shape[u], l = Lt({ inputs: { x: p }, backend: t10 }); + for (let m = 0; m <= Math.ceil(Math.log2(c)) - 1; m++) { + let f = new tm(r, p.shape, false, s), d = l, h = [{ type: "float32", data: [m] }]; + l = t10.runWebGPUProgram(f, [l], l.dtype, h), t10.disposeData(d.dataId); + } + if (n) { + let m = new tm(r, p.shape, n, s), f = l, d = [{ type: "float32", data: [0] }]; + l = t10.runWebGPUProgram(m, [l], l.dtype, d), t10.disposeData(f.dataId); + } + if (i != null) { + let m = I.getUndoAxesPermutation(i), f = Nr({ inputs: { x: l }, backend: t10, attrs: { perm: m } }); + return t10.disposeData(l.dataId), t10.disposeData(p.dataId), f; + } + return l; +} +function uoe(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { axis: s, exclusive: a, reverse: i } = o; + return px(Ku.Prod, n, t10, s, a, i); +} +var XL = { kernelName: hn, backendName: "webgpu", kernelFunc: uoe }; +function poe(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { axis: s, exclusive: a, reverse: i } = o; + return px(Ku.Sum, n, t10, s, a, i); +} +var YL = { kernelName: gn, backendName: "webgpu", kernelFunc: poe }; +var cx = class { + constructor(e, t10) { + this.variableNames = ["x"], this.workGroupSize = [64, 1, 1], this.size = true, this.uniforms = "blockSize : i32,", this.outputShape = e, this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize), this.shaderKey = `depthToSpace_${t10}`, this.dataFormat = t10; + } + getUserCode() { + return ` + ${ue("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + let b = coords[0]; + let h = ${this.getHeightCoordString()}; + let w = ${this.getWidthCoordString()}; + let d = ${this.getDepthCoordString()}; + + let in_h = h / uniforms.blockSize; + let offset_h = h % uniforms.blockSize; + let in_w = w / uniforms.blockSize; + let offset_w = w % uniforms.blockSize; + let offset_d = (offset_h * uniforms.blockSize + offset_w) * + ${this.getOutputDepthSize()}; + let in_d = d + offset_d; + + let rlt = ${this.getInputSamplingString()}; + setOutputAtIndex(index, rlt); + } + }`; + } + getHeightCoordString() { + return this.dataFormat === "NHWC" ? "coords[1]" : "coords[2]"; + } + getWidthCoordString() { + return this.dataFormat === "NHWC" ? "coords[2]" : "coords[3]"; + } + getDepthCoordString() { + return this.dataFormat === "NHWC" ? "coords[3]" : "coords[1]"; + } + getOutputDepthSize() { + return this.dataFormat === "NHWC" ? "uniforms.outShape[3]" : "uniforms.outShape[1]"; + } + getInputSamplingString() { + return this.dataFormat === "NHWC" ? "getX(b, in_h, in_w, in_d)" : "getX(b, in_d, in_h, in_w)"; + } +}; +function coe(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { blockSize: s, dataFormat: a } = o, i = n.shape[0], p = a === "NHWC" ? n.shape[1] : n.shape[2], u = a === "NHWC" ? n.shape[2] : n.shape[3], c = a === "NHWC" ? n.shape[3] : n.shape[1], l = p * s, m = u * s, f = c / (s * s), d = a === "NHWC" ? [i, l, m, f] : [i, f, l, m], h = [{ type: "int32", data: [s] }], g = new cx(d, a); + return t10.runWebGPUProgram(g, [n], n.dtype, h); +} +var QL = { kernelName: yn, backendName: "webgpu", kernelFunc: coe }; +var lx = class { + constructor(e, t10, o, n = false, s = null, a = false) { + this.variableNames = ["x", "W"], this.uniforms = "pad : vec2, inDims : vec2,", this.workGroupSize = [16, 16, 1], this.outputShape = e, this.dispatchLayout = { x: [3], y: [2], z: [0, 1] }, this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize), n && this.variableNames.push("bias"), a && this.variableNames.push("preluActivationWeights"), this.addBias = n, this.activation = s, this.hasPreluActivation = a, this.filterHeight = t10, this.filterWidth = o, this.shaderKey = `depthwiseNCHW_${this.activation}_${this.filterHeight}_${this.filterWidth}`; + } + getUserCode() { + let e = this.filterWidth * this.filterHeight, t10 = this.workGroupSize[0] * this.workGroupSize[1] * this.workGroupSize[2], o = this.workGroupSize[1] + this.filterHeight - 1, n = this.workGroupSize[0] + this.filterWidth - 1; + return ` + ${ur(this.activation, this.hasPreluActivation, false, 4)} + + var mm_Asub : array, ${o}>; + var mm_Bsub : array, ${this.filterHeight}>; + fn readX(batch : i32, channel : i32, row : i32, col : i32) -> f32 { + var value = 0.0; + if (row >=0 && row < uniforms.inDims[0] && col >=0 && col < uniforms.inDims[1]) + { + value = getX(batch, channel, row, col); + } + return value; + } + + ${Ri()} + fn _start(@builtin(local_invocation_id) LocalId : vec3, + @builtin(global_invocation_id) GlobalId : vec3, + @builtin(local_invocation_index) LocalIndex: u32, + @builtin(num_workgroups) NumWorkgroups: vec3) { + localId = LocalId; + globalId = GlobalId; + let localIndex = i32(LocalIndex); + numWorkgroups = NumWorkgroups; + let coords = getOutputCoords(); + let batch = coords[0]; + let xRCCorner = vec2(coords.zw) - uniforms.pad; + let channelMul = uniforms.wShape[3]; + let d1 = coords[1] / channelMul; + let q = coords[1] % channelMul; + + let inputRowStart = xRCCorner.x; + let inputColStart = xRCCorner.y; + + let localRow = i32(localId.y); + let localCol = i32(localId.x); + + // Load one tile of X into local memory. + for (var inputRow = localRow; inputRow < ${o}; inputRow = inputRow + ${this.workGroupSize[1]}) { + for (var inputCol = localCol; inputCol < ${n}; inputCol = inputCol + ${this.workGroupSize[0]}) { + let rowOffset = inputRow - localRow; + let colOffset = inputCol - localCol; + mm_Asub[inputRow][inputCol] = readX(batch, d1, inputRowStart + rowOffset, inputColStart + colOffset); + } + } + + // Load one tile of W into local memory. + var wIndex = localIndex; + ${e < t10 ? `if (wIndex < ${e})` : `for(; wIndex < ${e}; wIndex = wIndex + ${t10})`} + + { + let wRow = wIndex / ${this.filterWidth}; + let wCol = wIndex % ${this.filterWidth}; + mm_Bsub[wRow][wCol] = getW(wRow, wCol, d1, q); + } + + workgroupBarrier(); + + var value = 0.0; + for (var wR = 0; wR < ${this.filterHeight}; wR = wR + 1) { + for (var wC = 0; wC < ${this.filterWidth}; wC = wC + 1) { + let xVal = mm_Asub[localRow + wR][localCol + wC]; + let wVal = mm_Bsub[wR][wC]; + value = fma(xVal, wVal, value); + } + } + ${Kr(this.addBias, this.activation)} + if (coordsInBounds4D(coords, uniforms.outShape)) { + setOutputAtCoords(coords[0], coords[1], coords[2], coords[3], value); + } + } + `; + } +}; +var Dc = class { + constructor(e, t10 = false, o = null, n = false) { + this.variableNames = ["x", "W"], this.uniforms = "pad : vec2, inDims : vec2,", this.workGroupSize = [4, 4, 4], this.workPerThread = 4, this.isVec4 = true, this.outputShape = e.outShape, this.dispatchLayout = { x: [3], y: [2], z: [0, 1] }, this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize, [4, this.workPerThread, 1]), x.assert(e.dataFormat === "channelsLast", () => "TODO: NCHW is unimplemented"), t10 && this.variableNames.push("bias"), n && this.variableNames.push("preluActivationWeights"), this.convInfo = e, this.addBias = t10, this.activation = o, this.hasPreluActivation = n, this.shaderKey = `depthwiseVec4_${o}_${this.convInfo.filterHeight}_${this.convInfo.filterWidth}_${this.convInfo.strideHeight}_${this.convInfo.strideWidth}_${this.workPerThread}`; + } + getUserCode() { + let e = (this.workPerThread - 1) * this.convInfo.strideWidth + this.convInfo.filterWidth; + return ` + ${ur(this.activation, this.hasPreluActivation, true, 4)} + fn readX(batch : i32, row : i32, col : i32, channel : i32) -> vec4 { + var value = vec4(0.0); + if (col >=0 && col < uniforms.inDims[1]) { + value = getX(batch, row, col, channel); + } + return value; + } + + const strideHeight = ${this.convInfo.strideHeight}; + const strideWidth = ${this.convInfo.strideWidth}; + ${Ri()} + fn _start(@builtin(global_invocation_id) globalId: vec3) { + let batch = i32(globalId.z) / uniforms.outShape[1]; + let r = i32(globalId.z) % uniforms.outShape[1]; + let c = i32(globalId.y) * ${this.workPerThread}; + let d1 = i32(globalId.x) * 4; + let xRCCorner = vec2(r, c) * vec2(strideHeight, strideWidth) - uniforms.pad; + + let xRCorner = xRCCorner.x; + let xCCorner = xRCCorner.y; + var xVals : array, ${e}>; + var dotProd : array, ${this.workPerThread}>; + for (var i = 0; i < ${this.workPerThread}; i++) { + dotProd[i] = vec4(0.0); + } + + // Use constant instead of uniform can give better performance. + for (var wR = 0; wR < ${this.convInfo.filterHeight}; wR = wR + 1) { + let xR = xRCorner + wR; + if (xR >=0 && xR < uniforms.inDims[0]) { + for (var i = 0; i < ${e}; i++) { + xVals[i] = readX(batch, xR, xCCorner + i, d1); + } + for (var wC = 0; wC < ${this.convInfo.filterWidth}; wC = wC + 1) { + let wValue = getW(wR, wC, d1, 0); + for (var i = 0; i < ${this.workPerThread}; i++) { + dotProd[i] = fma(xVals[i * strideWidth + wC], wValue, dotProd[i]); + } + } + } + } + + for (var i = 0; i < ${this.workPerThread}; i = i + 1) { + let coords = vec4(batch, r, c + i, d1); + if (coordsInBounds4D(coords, uniforms.outShape)) { + var value = dotProd[i]; + ${Kr(this.addBias, this.activation)} + setOutputAtCoords(coords[0], coords[1], coords[2], coords[3], value); + } + } + } + `; + } +}; +var Pc = class { + constructor(e, t10 = false, o = null, n = false) { + this.variableNames = ["x", "W"], this.uniforms = `pad : vec2, inDims : vec2, filterHeight : i32, + filterWidth : i32, stride : vec2, dilation : vec2,`, this.workGroupSize = [256, 1, 1], this.outputShape = e.outShape, this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize), this.isChannelsLast = e.dataFormat === "channelsLast", t10 && this.variableNames.push("bias"), n && this.variableNames.push("preluActivationWeights"), this.convInfo = e, this.addBias = t10, this.activation = o, this.hasPreluActivation = n, this.shaderKey = `depthwise_${this.activation}_${this.isChannelsLast}`; + } + getUserCode() { + let e = this.isChannelsLast ? "getX(batch, xR, xC, d1);" : "getX(batch, d1, xR, xC);"; + return ` + ${ur(this.activation, this.hasPreluActivation, false, 4)} + + ${ue()} { + let coords = getOutputCoords(); + let batch = coords[0]; + let xRCCorner = vec2(coords.${this.isChannelsLast ? "yz" : "zw"}) * uniforms.stride - uniforms.pad; + let d2 = coords[${this.isChannelsLast ? 3 : 1}]; + let channelMul = uniforms.wShape[3]; + let d1 = d2 / channelMul; + let q = d2 % channelMul; + + let inputRowStart = xRCCorner.x; + let inputColStart = xRCCorner.y; + let inputRowEnd = inputRowStart + uniforms.filterHeight * + uniforms.dilation[0]; + let inputColEnd = inputColStart + uniforms.filterWidth * + uniforms.dilation[1]; + + // Convolve x(?, ?, d1)|x(d1, ?, ?) with w(:, :, d1, q) to get + // y(yR, yC, d2)|y(d2, yR, yC). ? = to be determined. : = across all + // values in that axis. x(?, ?, d1) and y(yR, yC, d2) is for NHWC. + // x(d1, ?, ?) and y(d2, yR, yC) is for NCHW. + var value = 0.0; + + // Extract if checking out of for loop for performance. + if (inputRowStart >= 0 && inputColStart >= 0 && + inputRowEnd < uniforms.inDims[0] && + inputColEnd < uniforms.inDims[1]) { + for (var wR = 0; wR < uniforms.filterHeight; wR = wR + 1) { + let xR = inputRowStart + wR * uniforms.dilation[0]; + + for (var wC = 0; wC < uniforms.filterWidth; wC = wC + 1) { + let xC = inputColStart + wC * uniforms.dilation[1]; + + let xVal = ${e}; + let wVal = getW(wR, wC, d1, q); + value = value + xVal * wVal; + } + } + } else { + for (var wR = 0; wR < uniforms.filterHeight; wR = wR + 1) { + let xR = inputRowStart + wR * uniforms.dilation[0]; + + if (xR < 0 || xR >= uniforms.inDims[0]) { + continue; + } + + for (var wC = 0; wC < uniforms.filterWidth; wC = wC + 1) { + let xC = inputColStart + wC * uniforms.dilation[1]; + + if (xC < 0 || xC >= uniforms.inDims[1]) { + continue; + } + + let xVal = ${e}; + let wVal = getW(wR, wC, d1, q); + value = value + xVal * wVal; + } + } + } + ${Kr(this.addBias, this.activation)} + if (coordsInBounds4D(coords, uniforms.outShape)) { + setOutputAtCoords(coords[0], coords[1], coords[2], coords[3], value); + } + } + `; + } +}; +function loe(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, filter: s } = e, { strides: a, pad: i, dataFormat: p, dilations: u, dimRoundingMode: c } = o, l = I.convertConv2DDataFormat(p), m = u; + m == null && (m = [1, 1]); + let f = I.computeConv2DInfo(n.shape, s.shape, a, m, i, c, true, l), d = [{ type: "int32", data: [f.padInfo.top, f.padInfo.left] }, { type: "int32", data: [f.inHeight, f.inWidth] }], h = f.dataFormat === "channelsLast", g; + return !h && f.inHeight > 16 && f.inWidth > 16 && f.strideHeight === 1 && f.strideWidth === 1 && f.dilationWidth === 1 && f.dilationHeight === 1 && f.inChannels === f.outChannels ? g = new lx(f.outShape, f.filterHeight, f.filterWidth) : h && f.inHeight > 4 && f.inWidth > 4 && f.strideWidth <= 2 && f.inChannels === f.outChannels && f.dilationHeight === 1 && f.dilationWidth === 1 && f.inChannels % 4 === 0 ? g = new Dc(f) : (g = new Pc(f), d.push({ type: "int32", data: [f.filterHeight] }, { type: "int32", data: [f.filterWidth] }, { type: "int32", data: [f.strideHeight, f.strideWidth] }, { type: "int32", data: [f.dilationHeight, f.dilationWidth] })), t10.runWebGPUProgram(g, [n, s], n.dtype, d); +} +var ZL = { kernelName: bn, backendName: "webgpu", kernelFunc: loe }; +var BS = it({ opType: ye.MUL, cpuKernelImpl: sL, supportsComplex: true }); +var JL = { kernelName: ho, backendName: "webgpu", kernelFunc: BS }; +function rm(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { axis: s, keepDims: a } = o; + return Ys(n, s, a, "sum", t10); +} +var eB = { kernelName: jn, backendName: "webgpu", kernelFunc: rm }; +function moe(r) { + let { inputs: e, backend: t10, attrs: o } = r, { equation: n } = o, s = e, { allDims: a, summedDims: i, idDims: p } = I.decodeEinsumEquation(n, s.length); + I.checkEinsumDimSizes(a.length, p, s); + let { path: u, steps: c } = I.getEinsumComputePath(i, p), l = c.length, m = null, f = a.length, d = []; + for (let h = 0; h < l; ++h) { + for (let g of c[h]) { + let { permutationIndices: y, expandDims: b } = I.getEinsumPermutation(f, p[g]), C; + I.isIdentityPermutation(y) ? C = s[g] : (C = Nr({ inputs: { x: s[g] }, backend: t10, attrs: { perm: y } }), d.push(C)); + let w = C.shape.slice(); + for (let k = 0; k < b.length; ++k) + w.splice(b[k], 0, 1); + x.arraysEqual(C.shape, w) || (C = xe({ inputs: { x: C }, backend: t10, attrs: { shape: w } }), d.push(C)), m === null ? m = C : (m = BS({ inputs: { a: C, b: m }, backend: t10 }), d.push(m)); + } + h < l - 1 && (u[h] >= 0 && (m = rm({ inputs: { x: m }, backend: t10, attrs: { axis: u[h] - (a.length - f), keepDims: false } }), d.push(m)), f--); + } + for (let h of d) + h !== m && t10.disposeData(h.dataId); + return m; +} +var tB = { kernelName: Xa, backendName: "webgpu", kernelFunc: moe }; +var foe = Ge({ opType: pe.ELU }); +var rB = { kernelName: In, backendName: "webgpu", kernelFunc: foe }; +var doe = it({ opType: ye.EQUAL, dtype: "bool", cpuKernelImpl: HM }); +var oB = { kernelName: oo, backendName: "webgpu", kernelFunc: doe }; +var VS = Ge({ opType: pe.EXP, cpuKernelImpl: qM, dtype: "float32" }); +var nB = { kernelName: no, backendName: "webgpu", kernelFunc: VS }; +function mx(r) { + let { inputs: e, attrs: t10, backend: o } = r, { dim: n } = t10, { input: s } = e, a = s.shape.length, i = s.shape.slice(), p = n; + return n < 0 && (x.assert(-(a + 1) <= n, () => `Axis must be in the interval [${-(a + 1)}, ${a}]`), p = a + n + 1), i.splice(p, 0, 1), xe({ inputs: { x: s }, backend: o, attrs: { shape: i } }); +} +var sB = { kernelName: xs, backendName: "webgpu", kernelFunc: mx }; +var hoe = Ge({ opType: pe.EXPM1, cpuKernelImpl: KM }); +var aB = { kernelName: wn, backendName: "webgpu", kernelFunc: hoe }; +var fx = class { + constructor(e) { + this.outputShape = [], this.variableNames = ["x"], this.workGroupSize = [64, 1, 1], this.size = true, this.outputShape = e, this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize), this.shaderKey = "flipLeftRight"; + } + getUserCode() { + return ` + ${ue("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + let coordX = uniforms.xShape[2] - coords[2] - 1; + let outputValue = getX(coords[0], coords[1], coordX, coords[3]); + setOutputAtIndex(index, outputValue); + } + } + `; + } +}; +var iB = { kernelName: Sn, backendName: "webgpu", kernelFunc: ({ inputs: r, backend: e }) => { + let { image: t10 } = r, o = e, n = new fx(t10.shape); + return o.runWebGPUProgram(n, [t10], t10.dtype); +} }; +var goe = Ge({ opType: pe.FLOOR, cpuKernelImpl: jM }); +var uB = { kernelName: so, backendName: "webgpu", kernelFunc: goe }; +var xoe = it({ opType: ye.INT_DIV, dtype: "int32" }); +var pB = { kernelName: vn, backendName: "webgpu", kernelFunc: xoe }; +var dx = class { + constructor(e, t10, o = false) { + this.isFromPixels = true, this.outputShape = [0], this.variableNames = [], this.workGroupSize = [256, 1, 1], this.outputShape = e, this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize, [t10, 1, 1]), this.importVideo = o, this.shaderKey = `fromPixels_${this.importVideo}`; + } + getUserCode() { + let e = this.importVideo ? "textureLoad(src, vec2(coords.yx));" : "textureLoad(src, vec2(coords.yx), 0)"; + return ` + @binding(1) @group(0) var src: ${this.importVideo ? "texture_external" : "texture_2d"}; + ${ue("index")} { + let flatIndex = index * uniforms.numChannels; + if (flatIndex < uniforms.size) { + let coords = getCoordsFromIndex(flatIndex); + let values = ${e}; + for (var i = 0; i < uniforms.numChannels; i = i + 1) { + result[flatIndex + i] = i32(floor(255.0 * values[i])); + } + } + } + `; + } +}; +var cB = { kernelName: Zi, backendName: "webgpu", kernelFunc: yoe }; +var Oc; +var zS = P().getBool("CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU"); +var hx = /* @__PURE__ */ new Map(); +function yoe(r) { + let { inputs: e, backend: t10, attrs: o } = r, { pixels: n } = e, { numChannels: s } = o; + if (n == null) + throw new Error("pixels passed to tf.browser.fromPixels() can not be null"); + let a = typeof HTMLVideoElement != "undefined" && n instanceof HTMLVideoElement, i = typeof HTMLImageElement != "undefined" && n instanceof HTMLImageElement, p = typeof HTMLCanvasElement != "undefined" && n instanceof HTMLCanvasElement || typeof OffscreenCanvas != "undefined" && n instanceof OffscreenCanvas, u = typeof ImageBitmap != "undefined" && n instanceof ImageBitmap, [c, l] = a ? [n.videoWidth, n.videoHeight] : [n.width, n.height], m = [l, c, s], f = false, d = a || i; + if (u || p || d) { + let b; + if (f) { + let D = n; + if (!hx.has(D) || hx.get(D).expired) { + let O = { source: D }; + hx.set(D, t10.device.importExternalTexture(O)); + } + b = { width: c, height: l, format: null, usage: null, texture: hx.get(D) }; + } else { + if (d) { + let L = P().getBool("CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU"); + (Oc == null || L !== zS) && (zS = L, Oc = document.createElement("canvas").getContext("2d", { willReadFrequently: zS })), Oc.canvas.width = c, Oc.canvas.height = l, Oc.drawImage(n, 0, 0, c, l), n = Oc.canvas; + } + let D = GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING, O = "rgba8unorm", M = t10.textureManager.acquireTexture(m[1], m[0], O, D); + t10.queue.copyExternalImageToTexture({ source: n }, { texture: M }, [m[1], m[0]]), b = { width: c, height: l, format: O, usage: D, texture: M }; + } + let C = x.sizeFromShape(m), w = x.computeStrides(m), k = new dx(m, s, f), _ = [{ type: "uint32", data: [C] }, { type: "uint32", data: [s] }, { type: "uint32", data: [...w] }], E = t10.makeTensorInfo([l, c], "int32"), R = t10.tensorMap.get(E.dataId); + R.resourceInfo = b; + let A = t10.runWebGPUProgram(k, [E], "int32", _); + return t10.disposeData(E.dataId), A; + } + let h = n.data, g = h; + if (s != null && s !== 4) { + g = new Uint8Array(n.width * n.height * s); + let b = h.length, C = 0; + for (let w = 0; w < b; w++) + w % 4 < s && (g[C++] = h[w]); + } + let y = t10.makeTensorInfo(m, "int32", new Int32Array(g)); + return t10.uploadToGPU(y.dataId), y; +} +var gx = class { + constructor(e, t10, o, n, s) { + this.uniforms = "varianceEpsilon : f32,", this.workGroupSize = [128, 1, 1], this.size = true, this.variableNames = ["x", "mean", "variance"], I.assertAndGetBroadcastShape(e, t10), I.assertAndGetBroadcastShape(e, o), this.outputShape = e, this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize), n != null && (I.assertAndGetBroadcastShape(e, n), this.variableNames.push("offset")), s != null && (I.assertAndGetBroadcastShape(e, s), this.variableNames.push("scale")), this.offsetShape = n, this.scaleShape = s, this.shaderKey = "batchNorm"; + } + getUserCode() { + let e = "0.0"; + this.offsetShape != null && (e = "getOffsetByOutputIndex(index)"); + let t10 = "1.0"; + return this.scaleShape != null && (t10 = "getScaleByOutputIndex(index)"), ` + ${ue("index")} { + if (index < uniforms.size) + { + let xValue = getXByOutputIndex(index); + let meanValue = getMeanByOutputIndex(index); + let varianValue = getVarianceByOutputIndex(index); + let offsetValue = ${e}; + let scaleValue = ${t10}; + let inv = scaleValue * inverseSqrt(varianValue + f32(uniforms.varianceEpsilon)); + setOutputAtIndex(index,dot(vec3(xValue, -meanValue, offsetValue), vec3(inv, inv, 1.0))); + } + } + `; + } +}; +var lB = { kernelName: kn, backendName: "webgpu", kernelFunc: ({ inputs: r, attrs: e, backend: t10 }) => { + let { x: o, scale: n, offset: s, mean: a, variance: i } = r, { varianceEpsilon: p } = e, u = t10, c = [o, a, i], l = null; + s != null && (l = s.shape, c.push(s)); + let m = null; + n != null && (m = n.shape, c.push(n)); + let f = new gx(o.shape, a.shape, i.shape, l, m), d = [{ type: "float32", data: [p] }]; + return u.runWebGPUProgram(f, c, o.dtype, d); +} }; +function boe(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, filter: s, bias: a, preluActivationWeights: i } = e, { strides: p, pad: u, dataFormat: c, dilations: l, dimRoundingMode: m, activation: f, leakyreluAlpha: d } = o, h = I.convertConv2DDataFormat(c), g = I.computeConv2DInfo(n.shape, s.shape, p, l, u, m, false, h); + return sx({ x: n, filter: s, convInfo: g, backend: t10, bias: a, preluActivationWeights: i, leakyreluAlpha: d, activation: f }); +} +var mB = { kernelName: Do, backendName: "webgpu", kernelFunc: boe }; +function Coe(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, filter: s, bias: a, preluActivationWeights: i } = e, { strides: p, pad: u, dilations: c, dimRoundingMode: l, activation: m, leakyreluAlpha: f } = o, d = c; + d == null && (d = [1, 1]), x.assert(I.eitherStridesOrDilationsAreOne(p, d), () => `Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${p} and dilations '${d}'`); + let h = I.computeConv2DInfo(n.shape, s.shape, p, d, u, l, true), g = [n, s], y = a != null, b = i != null; + y && g.push(a), b && g.push(i); + let C = [{ type: "int32", data: [h.padInfo.top, h.padInfo.left] }, { type: "int32", data: [h.inHeight, h.inWidth] }], w; + return h.inHeight > 4 && h.inWidth > 4 && h.strideWidth <= 2 && h.inChannels === h.outChannels && h.dilationHeight === 1 && h.dilationWidth === 1 && h.inChannels % 4 === 0 ? w = new Dc(h, y, m, b) : (w = new Pc(h, y, m, b), C.push({ type: "int32", data: [h.filterHeight] }, { type: "int32", data: [h.filterWidth] }, { type: "int32", data: [h.strideHeight, h.strideWidth] }, { type: "int32", data: [h.dilationHeight, h.dilationWidth] })), m === "leakyrelu" && (C.push({ type: "float32", data: [f] }), w.uniforms += " alpha : f32,"), t10.runWebGPUProgram(w, g, "float32", C); +} +var fB = { kernelName: Po, backendName: "webgpu", kernelFunc: Coe }; +var xx = class { + constructor(e, t10) { + this.variableNames = ["A", "indices"], this.workGroupSize = [64, 1, 1], this.size = true, this.outputShape = t10, this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize), this.shaderKey = `gathernd_${e}`, this.sliceDim = e, this.uniforms = `sliceDim : i32, strides : ${At(e)},`; + } + getUserCode() { + let e; + return this.sliceDim > 1 ? e = "uniforms.strides[j]" : e = "uniforms.strides", ` + ${ue("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + var flattenIndex = 0; + for (var j = 0; j < uniforms.sliceDim; j = j + 1) { + let indexTemp = i32(round(getIndices(coords[0], j))); + let strideNum = ${e}; + flattenIndex = flattenIndex + indexTemp * strideNum; + } + + setOutputAtIndex(index, getA(flattenIndex, coords[1])); + } + } + `; + } +}; +function Ioe(r) { + let { inputs: e, backend: t10 } = r, { params: o, indices: n } = e, s = n.shape, a = s[s.length - 1], i = x.sizeFromShape(o.shape), [p, u, c, l] = I.prepareAndValidate(o, n), m = xe({ inputs: { x: n }, backend: t10, attrs: { shape: [u, a] } }), f = xe({ inputs: { x: o }, backend: t10, attrs: { shape: [x.sizeFromShape(o.shape) / c, c] } }); + if (t10.shouldExecuteOnCPU([o, n]) || o.dtype === "string") { + let b = t10.readSync(n.dataId), C = t10.bufferSync(o), w = XM(b, C, o.dtype, u, a, c, l, o.shape, i); + return t10.makeTensorInfo(p, o.dtype, w.values); + } + let d = new xx(a, [u, c]), h = [{ type: "int32", data: [a] }, { type: "int32", data: l }], g = t10.runWebGPUProgram(d, [f, m], f.dtype, h), y = xe({ inputs: { x: g }, backend: t10, attrs: { shape: p } }); + return t10.disposeData(m.dataId), t10.disposeData(f.dataId), t10.disposeData(g.dataId), y; +} +var dB = { kernelName: Tn, backendName: "webgpu", kernelFunc: Ioe }; +var yx = class { + constructor(e, t10) { + this.variableNames = ["A", "indices"], this.workGroupSize = [64, 1, 1], this.size = true, this.outputShape = e.slice(), this.aShape = e, this.outputShape = t10, this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize), this.shaderKey = "gather"; + } + getUserCode() { + let e = woe(this.aShape); + return ` + ${ue("index")} { + if (index < uniforms.size) { + let resRC = getCoordsFromIndex(index); + let indexZ = i32(getIndices(resRC.x, resRC.z)); + let inBounds = select(0.0, 1.0, indexZ >= 0 && indexZ < uniforms.aShape[2]); + setOutputAtIndex(index, inBounds * getA(${e})); + } + } + `; + } +}; +function woe(r) { + let e = ["resRC.x", "resRC.y", "resRC.z", "resRC.w"], t10 = []; + for (let o = 0; o < r.length; o++) + o === 2 ? t10.push("indexZ") : t10.push(`${e[o]}`); + return t10.join(); +} +function WS(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n, indices: s } = e, { axis: a, batchDims: i } = o, p = x.parseAxisParam(a, n.shape)[0], u = I.segment_util.collectGatherOpShapeInfo(n, s, p, i), c = x.sizeFromShape(s.shape), l = [], m = xe({ inputs: { x: n }, backend: t10, attrs: { shape: [u.batchSize, u.outerSize, u.dimSize, u.sliceSize] } }), f = xe({ inputs: { x: s }, backend: t10, attrs: { shape: [u.batchSize, c / u.batchSize] } }); + l.push(m), l.push(f); + let d = [u.batchSize, u.outerSize, c / u.batchSize, u.sliceSize]; + if (t10.shouldExecuteOnCPU([n, s])) { + let C = t10.tensorMap.get(f.dataId).values, w = ne(f.shape, f.dtype, C), _ = t10.tensorMap.get(m.dataId).values, E = ne(m.shape, m.dtype, _), R = YM(E, w, d); + return l.forEach((A) => t10.disposeData(A.dataId)), t10.makeTensorInfo(u.outputShape, R.dtype, R.values); + } + let h = new yx(m.shape, d), g = t10.runWebGPUProgram(h, [m, f], m.dtype); + l.push(g); + let y = xe({ inputs: { x: g }, backend: t10, attrs: { shape: u.outputShape } }); + return l.forEach((b) => t10.disposeData(b.dataId)), y; +} +var hB = { kernelName: bs, backendName: "webgpu", kernelFunc: WS }; +var Soe = it({ opType: ye.GREATER, cpuKernelImpl: ZM, dtype: "bool" }); +var gB = { kernelName: ao, backendName: "webgpu", kernelFunc: Soe }; +var voe = it({ opType: ye.GREATER_EQUAL, dtype: "bool", cpuKernelImpl: QM }); +var xB = { kernelName: io, backendName: "webgpu", kernelFunc: voe }; +var koe = Ge({ opType: pe.IS_NAN, dtype: "bool" }); +var yB = { kernelName: ia, backendName: "webgpu", kernelFunc: koe }; +function Toe(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { alpha: s } = o, a = [{ type: "float32", data: [s] }], i = new Zo(n.shape, pe.LEAKYRELU); + return i.uniforms = "alpha : f32,", t10.runWebGPUProgram(i, [n], "float32", a); +} +var bB = { kernelName: Nn, backendName: "webgpu", kernelFunc: Toe }; +var Noe = it({ opType: ye.LESS, dtype: "bool", cpuKernelImpl: eL }); +var CB = { kernelName: po, backendName: "webgpu", kernelFunc: Noe }; +var _oe = it({ opType: ye.LESS_EQUAL, dtype: "bool", cpuKernelImpl: JM }); +var IB = { kernelName: co, backendName: "webgpu", kernelFunc: _oe }; +var Eoe = Ge({ opType: pe.LOG, cpuKernelImpl: tL }); +var wB = { kernelName: lo, backendName: "webgpu", kernelFunc: Eoe }; +var $oe = it({ opType: ye.LOGICAL_AND, dtype: "bool" }); +var SB = { kernelName: _n, backendName: "webgpu", kernelFunc: $oe }; +var Roe = Ge({ opType: pe.LOGICAL_NOT }); +var vB = { kernelName: En, backendName: "webgpu", kernelFunc: Roe }; +var Aoe = it({ opType: ye.MAX, cpuKernelImpl: oL }); +var kB = { kernelName: mo, backendName: "webgpu", kernelFunc: Aoe }; +function Foe(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { filterSize: s, strides: a, pad: i, dimRoundingMode: p } = o, u = 1, c = I.computePool2DInfo(n.shape, s, a, u, i, p); + return Zg(n, c, "max", t10); +} +var TB = { kernelName: Rn, backendName: "webgpu", kernelFunc: Foe }; +function Doe(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { axis: s, keepDims: a } = o; + return Ys(n, s, a, "min", t10); +} +var NB = { kernelName: Fn, backendName: "webgpu", kernelFunc: Doe }; +var Poe = it({ opType: ye.MIN, cpuKernelImpl: nL }); +var _B = { kernelName: fo, backendName: "webgpu", kernelFunc: Poe }; +var bx = class { + constructor(e, t10, o) { + this.uniforms = "", this.variableNames = ["x"], this.workGroupSize = [64, 1, 1], this.size = true, this.outputShape = t10.map((n, s) => n[0] + e[s] + n[1]), this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize), this.xShape = e, t10.map((n, s) => { + this.uniforms += ` pad${s} : vec2,`; + }), this.offset = o === "reflect" ? 0 : 1, this.shaderKey = `mirrorPad_${o}`; + } + getUserCode() { + let e = this.xShape.length, t10 = this.xShape.map((u, c) => `uniforms.pad${c}[0]`).join(","), o = this.xShape.map((u, c) => `uniforms.pad${c}[0] + uniforms.xShape${e > 1 ? `[${c}]` : ""}`).join(","), n = e === 1 ? "start" : "start[i]", s = e === 1 ? "end" : "end[i]", a = e === 1 ? "outC" : "outC[i]", i = At(e), p = e > 1 ? ["coords[0]", "coords[1]", "coords[2]", "coords[3]"].slice(0, e) : "coords"; + return ` + ${ue("index")} { + if (index < uniforms.size) { + let start = ${i}(${t10}); + let end = ${i}(${o}); + var outC = getCoordsFromIndex(index); + for (var i = 0; i < ${e}; i = i + 1) { + if (${a} < ${n}) { + ${a} = ${n} * 2 - ${a} - ${this.offset}; + } else if(${a} >= ${s}) { + ${a} = (${s} - 1) * 2 - ${a} + ${this.offset}; + } + } + let coords = outC - start; + setOutputAtIndex(index, getX(${p})); + } + } + `; + } +}; +var EB = { kernelName: Dn, backendName: "webgpu", kernelFunc: ({ inputs: r, attrs: e, backend: t10 }) => { + let { x: o } = r, { paddings: n, mode: s } = e, a = t10, i = n.map((c) => ({ type: "int32", data: [c[0], c[1]] })), p = new bx(o.shape, n, s); + return a.runWebGPUProgram(p, [o], o.dtype, i); +} }; +function Ooe(r) { + let { inputs: e, backend: t10 } = r, { x: o } = e; + if (t10.shouldExecuteOnCPU([o])) { + let s = t10.tensorMap.get(o.dataId), [a, i] = aL(s.values, o.shape, o.dtype); + return t10.makeTensorInfo(i, o.dtype, a); + } + let n = new Zo(o.shape, pe.NEG); + return t10.runWebGPUProgram(n, [o], o.dtype); +} +var $B = { kernelName: Pn, backendName: "webgpu", kernelFunc: Ooe }; +function Moe(r) { + console.warn("tf.nonMaxSuppression() in webgpu locks the UI thread. Call tf.nonMaxSuppressionAsync() instead"); + let { inputs: e, backend: t10, attrs: o } = r, { boxes: n, scores: s } = e, { maxOutputSize: a, iouThreshold: i, scoreThreshold: p } = o, u = t10.readSync(n.dataId), c = t10.readSync(s.dataId), { selectedIndices: l } = Bt.nonMaxSuppressionV3Impl(u, c, a, i, p); + return t10.makeTensorInfo([l.length], "int32", new Int32Array(l)); +} +var RB = { kernelName: On, backendName: "webgpu", kernelFunc: Moe }; +function Loe(r) { + console.warn("tf.nonMaxSuppression() in webgpu locks the UI thread. Call tf.nonMaxSuppressionAsync() instead"); + let { inputs: e, backend: t10, attrs: o } = r, { boxes: n, scores: s } = e, { maxOutputSize: a, iouThreshold: i, scoreThreshold: p, softNmsSigma: u } = o, c = t10.readSync(n.dataId), l = t10.readSync(s.dataId), m = a, f = i, d = p, h = u, { selectedIndices: g, selectedScores: y } = Bt.nonMaxSuppressionV5Impl(c, l, m, f, d, h); + return [t10.makeTensorInfo([g.length], "int32", new Int32Array(g)), t10.makeTensorInfo([y.length], "float32", new Float32Array(y))]; +} +var AB = { kernelName: Mn, backendName: "webgpu", kernelFunc: Loe }; +function om(r) { + let { inputs: e, backend: t10 } = r, { x: o } = e; + if (o.dtype === "complex64") { + let n = Wa({ inputs: { input: o }, backend: t10 }), s = om({ inputs: { x: n }, backend: t10 }), a = qu({ inputs: { input: o }, backend: t10 }), i = om({ inputs: { x: a }, backend: t10 }), p = ls({ inputs: { real: s, imag: i }, backend: t10 }); + return t10.disposeData(n.dataId), t10.disposeData(s.dataId), t10.disposeData(a.dataId), t10.disposeData(i.dataId), p; + } else + return $o({ attrs: { shape: o.shape, dtype: o.dtype, value: o.dtype === "string" ? "" : 0 }, backend: t10 }); +} +var FB = { kernelName: Es, backendName: "webgpu", kernelFunc: om }; +function DB(r) { + let { inputs: e, backend: t10 } = r, { x: o } = e; + if (o.dtype === "string") + throw new Error("onesLike is not supported under string dtype"); + if (o.dtype === "complex64") { + let n = Wa({ inputs: { input: o }, backend: t10 }), s = DB({ inputs: { x: n }, backend: t10 }), a = qu({ inputs: { input: o }, backend: t10 }), i = om({ inputs: { x: a }, backend: t10 }), p = ls({ inputs: { real: s, imag: i }, backend: t10 }); + return t10.disposeData(n.dataId), t10.disposeData(s.dataId), t10.disposeData(a.dataId), t10.disposeData(i.dataId), p; + } else + return $o({ attrs: { shape: o.shape, dtype: o.dtype, value: 1 }, backend: t10 }); +} +var PB = { kernelName: Cs, backendName: "webgpu", kernelFunc: DB }; +function Boe(r) { + let { inputs: e, backend: t10, attrs: o } = r, { axis: n } = o; + if (e.length === 1) + return mx({ inputs: { input: e[0] }, backend: t10, attrs: { dim: n } }); + let s = e[0].shape, a = e[0].dtype; + e.forEach((c) => { + x.assertShapesMatch(s, c.shape, "All tensors passed to stack must have matching shapes"), x.assert(a === c.dtype, () => "All tensors passed to stack must have matching dtypes"); + }); + let i = [], p = e.map((c) => { + let l = mx({ inputs: { input: c }, backend: t10, attrs: { dim: n } }); + return i.push(l), l; + }), u = LS({ inputs: p, backend: t10, attrs: { axis: n } }); + return i.forEach((c) => t10.disposeData(c.dataId)), u; +} +var OB = { kernelName: Is, backendName: "webgpu", kernelFunc: Boe }; +var Cx = class { + constructor(e, t10) { + this.variableNames = ["x"], this.uniforms = "constantValue : f32,", this.workGroupSize = [64, 1, 1], this.size = true, this.outputShape = t10.map((o, n) => o[0] + e[n] + o[1]), this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize), t10.map((o, n) => { + this.uniforms += ` pad${n} : vec2,`; + }), this.xShape = e, this.shaderKey = "pad"; + } + getUserCode() { + let e = this.xShape.length, t10 = At(e), o = this.xShape.map((l, m) => `uniforms.pad${m}[0]`).join(","), n = this.xShape.map((l, m) => `uniforms.pad${m}[0] + uniforms.xShape${e > 1 ? `[${m}]` : ""}`).join(","), s = e > 1 ? `${t10}(${o})` : `${o}`, a = e > 1 ? `${t10}(${n})` : `${n}`, i = e > 1 ? "any(outC < start)" : "outC < start", p = e > 1 ? "any(outC >= end)" : "outC >= end", u = e > 1 ? ["coords[0]", "coords[1]", "coords[2]", "coords[3]"].slice(0, e) : "coords"; + return ` + ${ue("index")} { + if (index < uniforms.size) { + let start = ${s}; + let end = ${a}; + let outC = getCoordsFromIndex(index); + + if (${i} || ${p}) { + setOutputAtIndex(index, uniforms.constantValue); + } else { + let coords = outC - start; + setOutputAtIndex(index, getX(${u})); + } + } + } + `; + } +}; +var US = (r) => { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { paddings: s, constantValue: a } = o; + if (s.every((u) => x.arraysEqual(u, [0, 0]))) + return Lt({ inputs: { x: n }, backend: t10 }); + if (x.sizeFromShape(n.shape) === 0) { + let u = s.map((c, l) => c[0] + n.shape[l] + c[1]); + return $o({ backend: t10, attrs: { shape: u, value: a, dtype: n.dtype } }); + } + let i = [{ type: "float32", data: [a] }]; + s.map((u) => i.push({ type: "int32", data: [u[0], u[1]] })); + let p = new Cx(n.shape, s); + return t10.runWebGPUProgram(p, [n], n.dtype, i); +}; +var MB = { kernelName: Ln, backendName: "webgpu", kernelFunc: US }; +var Voe = it({ opType: ye.POW }); +var LB = { kernelName: Bn, backendName: "webgpu", kernelFunc: Voe }; +function zoe(r) { + let { inputs: e, backend: t10 } = r, { x: o, alpha: n } = e, s = new Hu(ye.PRELU, o.shape, n.shape); + return t10.runWebGPUProgram(s, [o, n], "float32"); +} +var BB = { kernelName: Vn, backendName: "webgpu", kernelFunc: zoe }; +function Woe(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { axis: s, keepDims: a } = o; + return Ys(n, s, a, "prod", t10); +} +var VB = { kernelName: Ao, backendName: "webgpu", kernelFunc: Woe }; +var Uoe = (r) => { + let { backend: e, attrs: t10 } = r, { start: o, stop: n, step: s, dtype: a } = t10, i = pL(o, n, s, a); + return e.makeTensorInfo([i.length], a, i); +}; +var zB = { kernelName: ws, backendName: "webgpu", kernelFunc: Uoe }; +var GS = it({ opType: ye.DIV }); +var WB = { kernelName: Cn, backendName: "webgpu", kernelFunc: GS }; +var Goe = Ge({ opType: pe.RECIPROCAL }); +var UB = { kernelName: ma, backendName: "webgpu", kernelFunc: Goe }; +var Hoe = Ge({ opType: pe.RELU }); +var GB = { kernelName: zn, backendName: "webgpu", kernelFunc: Hoe }; +var qoe = Ge({ opType: pe.RELU6 }); +var HB = { kernelName: Gn, backendName: "webgpu", kernelFunc: qoe }; +var Ix = class { + constructor(e, t10, o) { + this.variableNames = ["x"], this.uniforms = "adjustHeightWidth : vec2, halfPixelCenters : f32,", this.workGroupSize = [64, 1, 1], this.size = true, this.outputShape = [e[0], t10, o, e[3]], this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize), this.shaderKey = "resizeBilinear"; + } + getUserCode() { + return ` + ${ue("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + let b = coords[0]; + let d = coords[3]; + let rc = coords.yz; + + let effectiveInSize = vec2( + f32(uniforms.xShape.y) - uniforms.adjustHeightWidth[0], + f32(uniforms.xShape.z) - uniforms.adjustHeightWidth[1]); + + let effectiveOutSize = vec2( + f32(uniforms.outShape.y) - uniforms.adjustHeightWidth[0], + f32(uniforms.outShape.z) - uniforms.adjustHeightWidth[1]); + + let effectiveInputOverOutputRatioRC = + effectiveInSize / effectiveOutSize; + + // Fractional source index + let sourceFracIndexRC = + (vec2(rc) + vec2(uniforms.halfPixelCenters)) * + effectiveInputOverOutputRatioRC - vec2(uniforms.halfPixelCenters); + + // Compute the four integer indices. + let sourceFloorRC = vec2(sourceFracIndexRC); + let sourceCeilRC = vec2( + min(vec2(uniforms.xShape.yz) - vec2(1.0), ceil(sourceFracIndexRC))); + + let topLeft = getX(b, sourceFloorRC.x, sourceFloorRC.y, d); + let bottomLeft = getX(b, sourceCeilRC.x, sourceFloorRC.y, d); + let topRight = getX(b, sourceFloorRC.x, sourceCeilRC.y, d); + let bottomRight = getX(b, sourceCeilRC.x, sourceCeilRC.y, d); + + let fracRC = sourceFracIndexRC - vec2(sourceFloorRC); + + let top = topLeft + (topRight - topLeft) * fracRC.y; + let bottom = bottomLeft + (bottomRight - bottomLeft) * fracRC.y; + let newValue = top + (bottom - top) * fracRC.x; + + setOutputAtIndex(index, newValue); + } + } + `; + } +}; +function Koe(r) { + let { inputs: e, backend: t10, attrs: o } = r, { images: n } = e, { alignCorners: s, size: a, halfPixelCenters: i } = o, [p, u] = a, c = s && p > 1 ? 1 : 0, l = s && u > 1 ? 1 : 0, f = [{ type: "float32", data: [c, l] }, { type: "float32", data: [i ? 0.5 : 0] }], d = new Ix(n.shape, p, u); + return t10.runWebGPUProgram(d, [n], "float32", f); +} +var qB = { kernelName: Un, backendName: "webgpu", kernelFunc: Koe }; +var wx = class { + constructor(e, t10, o, n) { + this.variableNames = ["x"], this.uniforms = "adjustHeightWidth : vec2, roundBase : f32,", this.workGroupSize = [64, 1, 1], this.size = true, this.outputShape = [e[0], t10, o, e[3]], this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize), this.halfPixelCenters = n, this.shaderKey = `resizeNearest_${n}`; + } + getUserCode() { + let e; + return this.halfPixelCenters ? e = "max((vec2(rc) + vec2(0.5)) * effectiveInputOverOutputRatioRC, vec2(0.0))" : e = "vec2(rc) * effectiveInputOverOutputRatioRC", ` + ${ue("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + let b = coords[0]; + let d = coords[3]; + let rc = coords.yz; + + let effectiveInSize = vec2( + f32(uniforms.xShape.y) - uniforms.adjustHeightWidth[0], + f32(uniforms.xShape.z) - uniforms.adjustHeightWidth[1]); + + let effectiveOutSize = vec2( + f32(uniforms.outShape.y) - uniforms.adjustHeightWidth[0], + f32(uniforms.outShape.z) - uniforms.adjustHeightWidth[1]); + + let effectiveInputOverOutputRatioRC = + effectiveInSize / effectiveOutSize; + + // Fractional source index + let sourceFracIndexRC = ${e}; + + // Compute the coordinators of nearest neighbor point. + let inputShapeRC = vec2(f32(uniforms.xShape.y), f32(uniforms.xShape.z)); + let sourceNearestRC = vec2( + min(inputShapeRC - 1.0, floor(sourceFracIndexRC + uniforms.roundBase))); + let newValue = getX(b, sourceNearestRC.x, sourceNearestRC.y, d); + + setOutputAtIndex(index, newValue); + } + } + `; + } +}; +function joe(r) { + let { inputs: e, backend: t10, attrs: o } = r, { images: n } = e, { alignCorners: s, halfPixelCenters: a, size: i } = o, [p, u] = i, c = s && p > 1 ? 1 : 0, l = s && u > 1 ? 1 : 0, f = [{ type: "float32", data: [c, l] }, { type: "float32", data: [s ? 0.5 : 0] }], d = new wx(n.shape, p, u, a); + return t10.runWebGPUProgram(d, [n], n.dtype, f); +} +var KB = { kernelName: Wn, backendName: "webgpu", kernelFunc: joe }; +var Sx = class { + constructor(e, t10) { + this.outputShape = [], this.variableNames = ["x"], this.workGroupSize = [64, 1, 1], this.size = true, this.outputShape = e, this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize), this.uniforms = `centerX : f32, centerY : f32, sinRadians : f32, + cosRadians : f32,`, this.shaderKey = "rotate", this.outputShape = e, typeof t10 == "number" ? (this.uniforms += " fillValue : f32,", this.fillSnippet = "var outputValue = uniforms.fillValue;", this.shaderKey += "_float") : (this.uniforms += " fillValue : vec3,", this.fillSnippet = "var outputValue = uniforms.fillValue[coords[3]];", this.shaderKey += "_vec3"); + } + getUserCode() { + return ` + ${ue("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + let coordXFloat = (f32(coords[2]) - uniforms.centerX) * + uniforms.cosRadians - (f32(coords[1]) - uniforms.centerY) * + uniforms.sinRadians; + let coordYFloat = (f32(coords[2]) - uniforms.centerX) * + uniforms.sinRadians + (f32(coords[1]) - uniforms.centerY) * + uniforms.cosRadians; + let coordX = i32(round(coordXFloat + uniforms.centerX)); + let coordY = i32(round(coordYFloat + uniforms.centerY)); + ${this.fillSnippet} + if(coordX >= 0 && coordX < uniforms.xShape[2] && coordY >= 0 && + coordY < uniforms.xShape[1]) { + outputValue = getX(coords[0], coordY, coordX, coords[3]); + } + setOutputAtIndex(index, outputValue); + } + } + `; + } +}; +var jB = { kernelName: es, backendName: "webgpu", kernelFunc: ({ inputs: r, attrs: e, backend: t10 }) => { + let { image: o } = r, { radians: n, fillValue: s, center: a } = e, i = t10, p = new Sx(o.shape, s), [u, c] = I.getImageCenter(a, o.shape[1], o.shape[2]), l = [{ type: "float32", data: [u] }, { type: "float32", data: [c] }, { type: "float32", data: [Math.sin(n)] }, { type: "float32", data: [Math.cos(n)] }]; + return typeof s == "number" ? l.push({ type: "float32", data: [Number.parseFloat(s.toFixed(2))] }) : l.push({ type: "float32", data: s }), i.runWebGPUProgram(p, [o], o.dtype, l); +} }; +var Xoe = Ge({ opType: pe.RSQRT, cpuKernelImpl: cL }); +var XB = { kernelName: xo, backendName: "webgpu", kernelFunc: Xoe }; +var Fi = class { + constructor(e, t10, o, n, s, a, i, p = true) { + this.variableNames = ["updates", "indices"], this.workGroupSize = [64, 1, 1], this.atomic = true, this.outputShape = a, this.type = i, this.sumDupeIndices = p, this.dispatchLayout = fe(e), this.dispatch = ae(this.dispatchLayout, e, this.workGroupSize), this.sliceDimGreaterThanOne = t10 > 1, this.shaderKey = `scatter_${o}_${n}_${this.sliceDimGreaterThanOne}_${i}_${p}`; + let u = At(s.length); + this.uniforms = `sliceDim : i32, strides: ${u}, size: i32,`, this.updatesRank = n, this.indicesRank = o; + } + getUserCode() { + let e = ""; + this.indicesRank === 1 ? e = "coords[0]" : this.indicesRank === 2 && (e = "coords[0], j"); + let t10 = `getIndices(${e})`, o = this.sliceDimGreaterThanOne ? "uniforms.strides[j]" : "uniforms.strides", n = "", s = ""; + this.dispatchLayout.x.length === 1 ? (n = "flattenedIndex", s = ` + fn getUpdatesCoordsFromFlatIndex(index : i32) -> i32 { + return index; + } + `) : this.dispatchLayout.x.length === 2 && (n = "vec2(flattenedIndex, coords[1])", s = ` + fn getUpdatesCoordsFromFlatIndex(index : i32) -> vec2 { + // N.B. |updates| could be a scalar tensor, conceptually representing a + // 2D tensor with all values equal to that. By design, its size must be + // the same as |outShape[1]| in one dimension, and |indicesShape[0]| + // gives the other. + let sliceSize = uniforms.outShape[1]; + let d0 = index / sliceSize; + let d1 = index - d0 * sliceSize; + return vec2(d0, d1); + } + `); + let i = `getUpdates(${Array.from({ length: this.updatesRank }, (c, l) => `coords[${l}]`).join(", ")})`, p = (c, l) => { + let m = `atomicAdd(${c}, bitcast(${l}))`; + this.type === "float32" && (m = ` + { + var oldBits = 0; + var newBits = bitcast(${l}); + loop { + let info = atomicCompareExchangeWeak(${c}, oldBits, newBits); + if (info.exchanged) { + break; + } + oldBits = info.old_value; + let oldValue = bitcast(oldBits); + let newValue = oldValue + (${l}); + newBits = bitcast(newValue); + } + } + `); + let f = `atomicStore(${c}, bitcast(${l}));`; + return this.sumDupeIndices ? m : f; + }; + return ` + ${s} + + ${ue("index")} { + if (index < uniforms.size) { + let coords = getUpdatesCoordsFromFlatIndex(index); + var flattenedIndex = 0; + for (var j = 0; j < uniforms.sliceDim; j = j + 1) { + let indexInside = i32(round(${t10})); + flattenedIndex = flattenedIndex + indexInside * ${o}; + } + let updateValue = + ${Tc(this.type, false)}(${i}); + let flatIndex = getOutputIndexFromCoords(${n}); + + ${p("&result[flatIndex]", "updateValue")}; + } + }`; + } +}; +function Yoe(r) { + let { inputs: e, backend: t10, attrs: o } = r, { indices: n, updates: s } = e, { shape: a } = o, { sliceRank: i, numUpdates: p, sliceSize: u, strides: c, outputSize: l } = I.calculateShapes(s, n, a), m = [l / u, u]; + if (l === 0) + return t10.makeTensorInfo(a, n.dtype); + let f = xe({ inputs: { x: n }, backend: t10, attrs: { shape: [p, i] } }), d = xe({ inputs: { x: s }, backend: t10, attrs: { shape: [p, u] } }), h = d.dtype, g = $o({ backend: t10, attrs: { shape: m, value: 0, dtype: h } }), y = x.sizeFromShape(d.shape), b = [{ type: "int32", data: [i] }, { type: "int32", data: c }, { type: "int32", data: [y] }], C = new Fi(d.shape, i, f.shape.length, d.shape.length, c, m, h), w = t10.runWebGPUProgram(C, [d, f], h, b, g), k = xe({ inputs: { x: w }, backend: t10, attrs: { shape: a } }); + return t10.disposeData(f.dataId), t10.disposeData(d.dataId), t10.disposeData(w.dataId), k; +} +var YB = { kernelName: Hn, backendName: "webgpu", kernelFunc: Yoe }; +var vx = class { + constructor(e, t10, o) { + this.variableNames = ["c", "a", "b"], this.workGroupSize = [64, 1, 1], this.size = true, this.outputShape = t10, this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize), this.cRank = e, this.rank = o, this.shaderKey = "select"; + } + getUserCode() { + let e, t10; + if (this.rank > 4) + throw Error(`Where for rank ${this.rank} is not yet supported`); + if (this.rank === 1) + t10 = "resRC", e = "resRC"; + else { + let n = ["resRC.x", "resRC.y", "resRC.z", "resRC.w"], s = [], a = []; + for (let i = 0; i < this.outputShape.length; i++) + a.push(`${n[i]}`), i < this.cRank && s.push(`${n[i]}`); + e = s.join(), t10 = a.join(); + } + return ` + ${ue("index")} { + if (index < uniforms.size) { + let resRC = getCoordsFromIndex(index); + let cVal = getC(${e}); + if (cVal >= 1.0) { + setOutputAtIndex(index, getA(${t10})); + } else { + setOutputAtIndex(index, getB(${t10})); + } + } + } + `; + } +}; +function Qoe(r) { + let { inputs: e, backend: t10 } = r, { condition: o, t: n, e: s } = e, a = new vx(o.shape.length, n.shape, n.shape.length); + return t10.runWebGPUProgram(a, [o, n, s], ct(n.dtype, s.dtype)); +} +var QB = { kernelName: vs, backendName: "webgpu", kernelFunc: Qoe }; +var Zoe = Ge({ opType: pe.SIGMOID }); +var ZB = { kernelName: yo, backendName: "webgpu", kernelFunc: Zoe }; +var Joe = Ge({ opType: pe.SIN }); +var JB = { kernelName: Kn, backendName: "webgpu", kernelFunc: Joe }; +var ene = Ge({ opType: pe.SINH }); +var eV = { kernelName: ha, backendName: "webgpu", kernelFunc: ene }; +var HS = it({ opType: ye.SUB, cpuKernelImpl: gL, supportsComplex: true }); +var tV = { kernelName: Io, backendName: "webgpu", kernelFunc: HS }; +function tne(r) { + let { inputs: e, backend: t10, attrs: o } = r, { logits: n } = e, { dim: s } = o, a = x.parseAxisParam([s], n.shape), i = em({ inputs: { x: n }, backend: t10, attrs: { reductionIndices: a, keepDims: false } }), p = I.expandShapeToKeepDim(i.shape, a), u = xe({ inputs: { x: i }, backend: t10, attrs: { shape: p } }), c = HS({ inputs: { a: n, b: u }, backend: t10 }), l = VS({ inputs: { x: c }, backend: t10 }), m = rm({ inputs: { x: l }, backend: t10, attrs: { axis: a, keepDims: false } }), f = xe({ inputs: { x: m }, backend: t10, attrs: { shape: p } }), d = GS({ inputs: { a: l, b: f }, backend: t10 }); + return t10.disposeData(i.dataId), t10.disposeData(u.dataId), t10.disposeData(c.dataId), t10.disposeData(l.dataId), t10.disposeData(m.dataId), t10.disposeData(f.dataId), d; +} +var rV = { kernelName: Xn, backendName: "webgpu", kernelFunc: tne }; +var rne = (r) => { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { blockShape: s, paddings: a } = o; + x.assert(n.shape.length <= 4, () => "spaceToBatchND for rank > 4 with a WebGPU backend not implemented yet"); + let i = s.reduce((y, b) => y * b), p = [[0, 0]]; + p.push(...a); + for (let y = 1 + s.length; y < n.shape.length; ++y) + p.push([0, 0]); + let u = [], c = US({ inputs: { x: n }, backend: t10, attrs: { paddings: p, constantValue: 0 } }), l = I.getReshaped(c.shape, s, i, false), m = I.getPermuted(l.length, s.length, false), f = I.getReshapedPermuted(c.shape, s, i, false), d = xe({ inputs: { x: c }, backend: t10, attrs: { shape: l } }), h = Nr({ inputs: { x: d }, backend: t10, attrs: { perm: m } }), g = xe({ inputs: { x: h }, backend: t10, attrs: { shape: f } }); + return u.push(c), u.push(d), u.push(h), u.forEach((y) => t10.disposeData(y.dataId)), g; +}; +var oV = { kernelName: ks, backendName: "webgpu", kernelFunc: rne }; +var kx = class { + constructor(e, t10) { + this.variableNames = ["A"], this.workGroupSize = [64, 1, 1], this.size = true; + let o = new Array(e.length); + for (let n = 0; n < o.length; n++) + o[n] = e[n] * t10[n]; + this.outputShape = o, this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize), this.rank = this.outputShape.length, this.shaderKey = "tile"; + } + getUserCode() { + let e = one(this.rank, "uniforms."); + return ` + ${ue("index")} { + if (index < uniforms.size) { + let resRC = getCoordsFromIndex(index); + setOutputAtIndex(index, getA(${e})); + } + } + `; + } +}; +function one(r, e = "") { + if (r >= 5) + throw Error(`Tile for rank ${r} is not yet supported`); + if (r === 1) + return `(resRC % ${e}aShape)`; + let t10 = ["resRC.x", "resRC.y", "resRC.z", "resRC.w"], o = []; + for (let n = 0; n < r; n++) + o.push(`(${t10[n]} % ${e}aShape[${n}])`); + return o.join(); +} +function qS(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { reps: s } = o; + if (t10.shouldExecuteOnCPU([n]) || n.dtype === "string" || n.shape.length >= 5) { + let p = t10.readSync(n.dataId), u = n.dtype === "string" ? p.map((m) => x.decodeString(m)) : p, c = ne(n.shape, n.dtype, u), l = xL(c, s); + return t10.makeTensorInfo(l.shape, l.dtype, l.values); + } + let a = new kx(n.shape, s); + return t10.runWebGPUProgram(a, [n], n.dtype); +} +var nV = { kernelName: wo, backendName: "webgpu", kernelFunc: qS }; +function nne(r) { + let { inputs: e, backend: t10, attrs: o } = r, { sparseIndices: n, sparseValues: s, defaultValue: a } = e, { outputShape: i } = o, { sliceRank: p, numUpdates: u, sliceSize: c, strides: l, outputSize: m } = I.calculateShapes(s, n, i), f = false; + if (s.dtype === "string") { + let R = t10.bufferSync(n), A = t10.bufferSync(s), D = x.decodeString(t10.readSync(a.dataId)[0]), O = lL(R, A, i, m, c, u, p, l, D, f); + return t10.makeTensorInfo(i, O.dtype, O.values); + } + let d = [m / c, c], h = xe({ inputs: { x: n }, backend: t10, attrs: { shape: [u, p] } }), g = s.shape.length ? xe({ inputs: { x: s }, backend: t10, attrs: { shape: [u, c] } }) : Lt({ inputs: { x: s }, backend: t10 }), y = g.dtype, b = t10.makeTensorInfo([], y, x.makeZerosTypedArray(1, y)), C = xe({ inputs: { x: a }, backend: t10, attrs: { shape: Array(d.length).fill(1) } }), w = qS({ inputs: { x: C }, backend: t10, attrs: { reps: d } }), k = x.sizeFromShape([u, c]), _ = [{ type: "int32", data: [p] }, { type: "int32", data: l }, { type: "int32", data: [k] }]; + switch (u) { + case 0: + break; + case 1: + { + let R = new Fi([u, c], p, h.shape.length, g.shape.length, l, d, y, f); + t10.runWebGPUProgram(R, [g, h], y, _, w); + } + break; + default: + { + let R = new Fi([u, c], p, h.shape.length, b.shape.length, l, d, y, f); + t10.runWebGPUProgram(R, [b, h], y, _, w); + } + { + let R = new Fi([u, c], p, h.shape.length, g.shape.length, l, d, y); + t10.runWebGPUProgram(R, [g, h], y, _, w); + } + } + let E = xe({ inputs: { x: w }, backend: t10, attrs: { shape: i } }); + return t10.disposeData(h.dataId), t10.disposeData(g.dataId), t10.disposeData(C.dataId), t10.disposeData(b.dataId), t10.disposeData(w.dataId), E; +} +var sV = { kernelName: ei, backendName: "webgpu", kernelFunc: nne }; +function sne(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { numOrSizeSplits: s, axis: a } = o, i = x.parseAxisParam(a, n.shape)[0], p = I.prepareSplitSize(n, s, i), u = n.shape.length, c = new Array(u).fill(0), l = n.shape.slice(); + return p.map((m) => { + let f = [...l]; + f[i] = m; + let d = ms({ inputs: { x: n }, backend: t10, attrs: { begin: c, size: f } }); + return c[i] += m, d; + }); +} +var aV = { kernelName: Ts, backendName: "webgpu", kernelFunc: sne }; +var ane = Ge({ opType: pe.SQRT }); +var iV = { kernelName: bo, backendName: "webgpu", kernelFunc: ane }; +var uV = { kernelName: ti, backendName: "webgpu", kernelFunc: ({ inputs: r, backend: e }) => { + let { x: t10 } = r, o = e, n = new Zo(t10.shape, pe.SQUARE); + return o.runWebGPUProgram(n, [t10], t10.dtype); +} }; +var ine = it({ opType: ye.SQUARED_DIFFERENCE }); +var pV = { kernelName: Co, backendName: "webgpu", kernelFunc: ine }; +var Tx = class { + constructor(e) { + this.variableNames = ["x"], this.workPerThread = 1, this.workGroupSize = [64, 1, 1], this.size = true, this.outputShape = e, this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize, [this.workPerThread, 1, 1]); + let t10 = At(this.outputShape.length); + this.uniforms = `begin : ${t10}, strides : ${t10}, `, this.shaderKey = "stridedSlice"; + } + getUserCode() { + let e = this.outputShape.length, t10 = ""; + if (e === 1) + t10 = "coords * uniforms.strides + uniforms.begin"; + else { + let n = 0; + t10 = this.outputShape.map((s, a) => (n++, this.outputShape.length === 1 ? `coords * uniforms.strides[${a}] + uniforms.begin[${a}]` : `coords[${n - 1}] * uniforms.strides[${a}] + uniforms.begin[${a}]`)).join(","); + } + return ` + ${ue("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + setOutputAtIndex(index, getX(${t10})); + } + } + `; + } +}; +function une(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { begin: s, end: a, strides: i, beginMask: p, endMask: u, ellipsisMask: c, newAxisMask: l, shrinkAxisMask: m } = o, { finalShapeSparse: f, finalShape: d, isIdentity: h, sliceDim0: g, isSimpleSlice: y, begin: b, end: C, strides: w } = et.sliceInfo(n.shape, s, a, i, p, u, c, l, m), k; + if (h) + k = xe({ inputs: { x: n }, backend: t10, attrs: { shape: d } }); + else if (g || y) { + x.assert(n.shape.length >= 1, () => `Input must have rank at least 1, got: ${n.shape.length}`); + let _ = et.computeOutShape(b, C, w), E = ms({ inputs: { x: n }, backend: t10, attrs: { begin: b, size: _ } }); + k = xe({ inputs: { x: E }, backend: t10, attrs: { shape: d } }), t10.disposeData(E.dataId); + } else if (t10.shouldExecuteOnCPU([n])) { + let E = t10.readSync(n.dataId), R = ne(n.shape, n.dtype, E), A = dL(f, R, w, b); + k = t10.makeTensorInfo(d, n.dtype, A.values); + } else { + let E = new Tx(f), R = [{ type: "int32", data: b }, { type: "int32", data: w }], A = t10.runWebGPUProgram(E, [n], n.dtype, R); + k = xe({ inputs: { x: A }, backend: t10, attrs: { shape: d } }), t10.disposeData(A.dataId); + } + return k; +} +var cV = { kernelName: Yn, backendName: "webgpu", kernelFunc: une }; +function pne(r) { + let { inputs: e, backend: t10, attrs: o } = r, { separator: n, nGramWidths: s, leftPad: a, rightPad: i, padWidth: p, preserveShortSequences: u } = o, { data: c, dataSplits: l } = e, m = t10.readSync(c.dataId), f = t10.readSync(l.dataId), [d, h] = hL(m, f, n, s, a, i, p, u); + return [t10.makeTensorInfo([d.length], "string", d), t10.makeTensorInfo(l.shape, "int32", h)]; +} +var lV = { kernelName: Ns, backendName: "webgpu", kernelFunc: pne }; +var cne = Ge({ opType: pe.TANH }); +var mV = { kernelName: Qn, backendName: "webgpu", kernelFunc: cne }; +var Nx = class { + constructor(e) { + this.variableNames = ["x", "indices"], this.workGroupSize = [256, 1, 1], this.size = true, this.outputShape = e, this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize), this.uniforms = `inputSize : i32, firstPass : i32, negativeInf : f32, + dir : i32, inc : i32,`, this.shaderKey = "swap"; + } + getUserCode() { + return ` + ${ue("index")} { + if (index < uniforms.size) { + let outC = getCoordsFromIndex(index); + let batch = outC[0]; + let elemIdx = outC[1]; + // We compare elements pair-wise within a group of size 2 * inc. + // The comparing rule for each group alternates between ascending + // and descending. Within each group, we compare each pair at + // positions i and i+inc. To decide whether an element at position i + // is x0 or x1, we mod it by 2 * inc, if the result is smaller than + // inc, it is in the first half of the group, we denote it as x0, + // otherwise we denote it as x1. + // For example, as shown in the Bitonic top K paper referenced + // above, Figure5(a) shows that element[1] is in the second half of + // the group when group size is 2, but it is in the first half of + // the group when group size is 4. + let isFirstInPair = elemIdx % (2 * uniforms.inc) < uniforms.inc; + var i = 0; + if (isFirstInPair) { + i = elemIdx; + } else { + i = elemIdx - uniforms.inc; + } + + var i0 = 0; + if (uniforms.firstPass == 1) { + i0 = i; + } else { + i0 = i32(getIndices(batch, i)); + } + + var i1 = 0; + if (uniforms.firstPass == 1) { + i1 = i + uniforms.inc; + } else { + i1 = i32(getIndices(batch, i + uniforms.inc)); + } + + var x0 = f32(0.0); + var x1 = f32(0.0); + if (i0 < uniforms.inputSize) { + x0 = getX(batch, i0); + } else { + x0 = uniforms.negativeInf; + } + if (i1 < uniforms.inputSize) { + x1 = getX(batch, i1); + } else { + x1 = uniforms.negativeInf; + } + + let reverse = elemIdx % (2 * uniforms.dir) >= uniforms.dir; + let isGreater = x0 > x1 || (x0 == x1 && i1 > i0); + if (reverse == isGreater) { + // Elements in opposite order of direction + let iTemp = i0; + i0 = i1; + i1 = iTemp; + } + if (isFirstInPair) { + setOutputAtIndex(index, f32(i0)); + } else { + setOutputAtIndex(index, f32(i1)); + } + } + } + `; + } +}; +var _x = class { + constructor(e) { + this.variableNames = ["x", "indices"], this.workGroupSize = [256, 1, 1], this.size = true, this.outputShape = e, this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize), this.uniforms = "inputSize : i32, firstPass : i32, k : i32,", this.shaderKey = "merge"; + } + getUserCode() { + return ` + ${ue("index")} { + if (index < uniforms.size) { + let outC = getCoordsFromIndex(index); + let batch = outC[0]; + let elemIdx = outC[1]; + // The output size is half of the previous size. + // If the previous sequence is | | | | _ _ _ _ | | | | _ _ _ _ + // (k=4), we only need to output the indices at positions |, the + // indices at positions _ can be thrown away, see Figure5(b) After + // Phase 2 (Merge phase) in the Bitonic Top K paper referenced + // above. + // For example, the paper shows we only need to output the orange + // bars. The output sequence should look like this | | | | | | | |. + // Because the sequence is halved, to map the output index back to + // the previous sequence to find the corresponding value, we need + // to double the index. When we double the index, we basically + // interpolate a position, so 2i looks like + // | _ | _ | _ | _ | _ | _ | _. We move the | to the first k + // position of each 2k positions by - elemIdx % k. E.g. for output + // at index 4,5,6,7, we want to get the corresponding element at + // original index 8,9,10,11, for output at index 8,9,10,11, + // we want to get the corresponding element at original index + // 16,17,18,19, so on and so forth. + + var i = 0; + if (elemIdx < uniforms.k) { + i = elemIdx; + } else { + i = elemIdx * 2 - elemIdx % uniforms.k; + } + var i0 = 0; + if (uniforms.firstPass == 1) { + i0 = i; + } else { + i0 = i32(getIndices(batch, i)); + } + var i1 = 0; + if (uniforms.firstPass == 1) { + i1 = i + uniforms.k; + } else { + i1 = i32(getIndices(batch, i + uniforms.k)); + } + + let x0 = getX(batch, i0); + var x1 = f32(0.0); + if (i1 < uniforms.inputSize) { + x1 = getX(batch, i1); + } else { + x1 = x0; + } + + if (x0 >= x1) { + setOutputAtIndex(index, f32(i0)); + } else { + setOutputAtIndex(index, f32(i1)); + } + } + } + `; + } +}; +function Mc(r, e) { + e !== null && r.disposeData(e.dataId); +} +function fV(r) { + let e = 1; + for (; e < r; ) + e *= 2; + return e; +} +function lne(r) { + let { inputs: e, backend: t10, attrs: o } = r, { x: n } = e, { k: s, sorted: a } = o, i = n.shape, p = i[i.length - 1]; + if (t10.shouldExecuteOnCPU([n])) { + let k = t10.readSync(n.dataId), [_, E] = yL(k, i, n.dtype, s, a); + return [t10.makeTensorInfo(_.shape, _.dtype, _.values), t10.makeTensorInfo(E.shape, E.dtype, E.values)]; + } + if (s === 0) + return i[i.length - 1] = 0, [t10.makeTensorInfo(i, n.dtype, []), t10.makeTensorInfo(i, "int32", [])]; + if (p === 1) + return [n, $o({ attrs: { shape: i, dtype: "int32", value: 0 }, backend: t10 })]; + let c = x.sizeFromShape(i) / p, l = xe({ inputs: { x: n }, attrs: { shape: [c, p] }, backend: t10 }), m = fV(s), f = fV(p), d = null, h = () => d === null ? [l, l] : [l, d], g = (k, _, E) => { + let R = h(), A = new Nx(E), O = [{ type: "int32", data: [p] }, { type: "int32", data: [d === null ? 1 : 0] }, { type: "float32", data: [Number.NEGATIVE_INFINITY] }, { type: "int32", data: [k] }, { type: "int32", data: [_] }], M = d; + d = t10.runWebGPUProgram(A, R, "int32", O), Mc(t10, M); + }; + for (let k = 1; k < m; k *= 2) { + let _ = k * 2; + for (let E = k; E >= 1; E /= 2) + g(_, E, [c, f]); + } + for (let k = f; k > m; k /= 2) { + let _ = h(), E = new _x([c, k / 2]), A = [{ type: "int32", data: [p] }, { type: "int32", data: [d === null ? 1 : 0] }, { type: "int32", data: [m] }], D = d; + d = t10.runWebGPUProgram(E, _, "int32", A), Mc(t10, D); + let O = m / 2, M = O * 2; + for (let L = O; L >= 1; L /= 2) + g(M, L, d.shape); + } + let y = d; + d = ms({ inputs: { x: d }, backend: t10, attrs: { begin: 0, size: [c, s] } }), Mc(t10, y); + let b = WS({ inputs: { x: l, indices: d }, backend: t10, attrs: { axis: 1, batchDims: 1 } }); + Mc(t10, l); + let C = i.slice(0, -1); + C.push(s), y = d, d = xe({ inputs: { x: d }, attrs: { shape: C }, backend: t10 }), Mc(t10, y); + let w = b; + return b = xe({ inputs: { x: b }, attrs: { shape: C }, backend: t10 }), Mc(t10, w), [b, d]; +} +var dV = { kernelName: Zn, backendName: "webgpu", kernelFunc: lne }; +var Ex = class { + constructor(e) { + this.variableNames = ["Image", "Transforms"], this.uniforms = "interpolationModeId : i32, fillModeId : i32, fillValue : f32,", this.workGroupSize = [64, 1, 1], this.size = true, this.outputShape = e, this.dispatchLayout = fe(this.outputShape), this.dispatch = ae(this.dispatchLayout, this.outputShape, this.workGroupSize), this.shaderKey = "transform"; + } + getUserCode() { + return ` + fn mapCoord(outCoord : f32, len : f32) -> f32{ + var inCoord = outCoord; + if(uniforms.fillModeId == 2) { + if (inCoord < 0.0) { + if (len <= 1.0) { + inCoord = 0.0; + } else { + let sz2 = 2.0 * len; + if (inCoord < sz2) { + inCoord = sz2 * f32(i32(f32(-inCoord / sz2))) + + inCoord; + } + if (inCoord < -len) { + inCoord = inCoord + sz2; + } else { + inCoord = -inCoord - 1.0; + } + } + } else if (inCoord > len - 1.0) { + if (len <= 1.0) { + inCoord = 0.0; + } else { + let sz2 = 2.0 * len; + inCoord = inCoord - sz2 * f32(i32(f32(inCoord / sz2))); + if (inCoord >= len) { + inCoord = sz2 - inCoord - 1.0; + } + } + } + return clamp(inCoord, 0.0, len - 1.0); + } else if (uniforms.fillModeId == 3) { + if (inCoord < 0.0) { + if (len <= 1.0) { + inCoord = 0.0; + } else { + let sz = len - 1.0; + inCoord = inCoord + len * (f32(i32(f32(-inCoord / sz))) + 1.0); + } + } else if (inCoord > len - 1.0) { + if (len <= 1.0) { + inCoord = 0.0; + } else { + let sz = len - 1.0; + inCoord = inCoord - len * f32(i32(f32(inCoord / sz))); + } + } + return clamp(inCoord, 0.0, len - 1.0); + } else if (uniforms.fillModeId == 4) { + return clamp(outCoord, 0.0, len - 1.0); + } + return outCoord; + } + fn readWithFillValue(batch : i32, coordY : i32, coordX : i32, + channel : i32) -> f32 { + var outputValue : f32; + if (0 <= coordY && coordY < uniforms.imageShape[1] && 0 <= coordX && coordX < uniforms.imageShape[2]) { + outputValue = getImage(batch, coordY, coordX, channel); + } else { + outputValue = uniforms.fillValue; + } + return outputValue; + } + + ${ue("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + var outputValue : f32; + let batch = coords[0]; + let x = coords[2]; + let y = coords[1]; + let channel = coords[3]; + let xf = f32(x); + let yf = f32(y); + let a1 = getTransforms(batch, 0); + let a2 = getTransforms(batch, 1); + let a3 = getTransforms(batch, 2); + let b1 = getTransforms(batch, 3); + let b2 = getTransforms(batch, 4); + let b3 = getTransforms(batch, 5); + let c1 = getTransforms(batch, 6); + let c2 = getTransforms(batch, 7); + let projection = c1 * xf + c2 * yf + 1.0; + if (projection == 0.0) { + outputValue = uniforms.fillValue; + } else { + let inX = (a1 * xf + a2 * yf + a3) / projection; + let inY = (b1 * xf + b2 * yf + b3) / projection; + let mapX = mapCoord(inX, f32(uniforms.imageShape[2])); + let mapY = mapCoord(inY, f32(uniforms.imageShape[1])); + + if (uniforms.interpolationModeId == 1) { + let coordY = i32(round(mapY)); + let coordX = i32(round(mapX)); + outputValue = readWithFillValue(batch, coordY, coordX, + channel); + } else { + let yFloor = floor(mapY); + let xFloor = floor(mapX); + let yCeil = yFloor + 1.0; + let xCeil = xFloor + 1.0; + let valueYFloor = (xCeil - mapX) * + readWithFillValue(batch, i32(yFloor), i32(xFloor), channel) + + (mapX - xFloor) * + readWithFillValue(batch, i32(yFloor), i32(xCeil), channel); + let valueYCeil = (xCeil - mapX) * + readWithFillValue(batch, i32(yCeil), i32(xFloor), channel) + + (mapX - xFloor) * + readWithFillValue(batch, i32(yCeil), i32(xCeil), channel); + outputValue = (yCeil - mapY) * valueYFloor + + (mapY - yFloor) * valueYCeil; + } + } + setOutputAtIndex(index, outputValue); + } + } + `; + } +}; +function mne(r) { + let { inputs: e, backend: t10, attrs: o } = r, { image: n, transforms: s } = e, { interpolation: a, fillMode: i, fillValue: p, outputShape: u } = o, [c, l, m, f] = n.shape, [d, h] = u != null ? u : [l, m], g = [c, d, h, f], y = new Ex(g), b = a === "nearest" ? 1 : 2, C; + switch (i) { + case "constant": + C = 1; + break; + case "reflect": + C = 2; + break; + case "wrap": + C = 3; + break; + case "nearest": + C = 4; + break; + default: + C = 1; + break; + } + let w = [{ type: "int32", data: [b] }, { type: "int32", data: [C] }, { type: "float32", data: [p] }]; + return t10.runWebGPUProgram(y, [n, s], "float32", w); +} +var hV = { kernelName: Jn, backendName: "webgpu", kernelFunc: mne }; +function fne(r) { + let { inputs: e, backend: t10, attrs: o } = r, { value: n } = e, { axis: s } = o; + s < 0 && (s += n.shape.length); + let a = n, i = a.shape.length, p = n.shape[s], u = new Array(i - 1), c = 0; + for (let h = 0; h < i; h++) + h !== s && (u[c++] = a.shape[h]); + let l = [], m = new Array(i).fill(0), f = a.shape.slice(); + f[s] = 1; + let d = new Array(p); + for (let h = 0; h < d.length; h++) { + m[s] = h; + let g = ms({ inputs: { x: a }, backend: t10, attrs: { begin: m, size: f } }), y = xe({ inputs: { x: g }, backend: t10, attrs: { shape: u } }); + d[h] = y, l.push(g); + } + return l.forEach((h) => t10.disposeData(h.dataId)), d; +} +var gV = { kernelName: _s, backendName: "webgpu", kernelFunc: fne }; +var dne = [aM, CL, IL, wL, vL, kL, TL, EL, $L, AL, OL, ML, LL, uM, VL, WL, UL, GL, HL, qL, XL, YL, QL, ZL, tB, rB, oB, nB, sB, aB, nM, iB, cB, uB, pB, lB, mB, fB, dB, hB, gB, xB, iM, BL, yB, bB, CB, IB, wB, SB, vB, NL, kB, TB, _L, NB, _B, EB, JL, $B, RB, AB, FL, PB, OB, MB, LB, BB, VB, zB, DL, WB, UB, GB, HB, sM, qB, KB, jB, XB, YB, QB, ZB, JB, eV, RL, cV, lV, rV, oV, sV, aV, iV, uV, pV, tV, eB, mV, nV, dV, hV, SL, gV, FB]; +for (let r of dne) + ya(r); +var xV = "4.0.0"; +var hne = "4.0.0"; +var gne = "4.0.0"; +var xne = "4.0.0"; +var yne = "4.0.0"; +var bne = "0.0.1-alpha.14"; +var Cne = { tfjs: xV, "tfjs-core": xV, "tfjs-converter": hne, "tfjs-backend-cpu": gne, "tfjs-backend-webgl": xne, "tfjs-backend-wasm": yne, "tfjs-backend-webgpu": bne }; + +// src/util/util.ts +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); +} +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(`modelpath error: expecting json file: ${path}`); + return path; +} +var now = () => { + if (typeof performance !== "undefined") + return performance.now(); + return parseInt((Number(process.hrtime.bigint()) / 1e3 / 1e3).toString()); +}; +function validate(defaults, config3, parent = "config", msgs = []) { + for (const key of Object.keys(config3)) { + if (typeof config3[key] === "object") { + validate(defaults[key], config3[key], key, msgs); + } else { + const defined = defaults && typeof defaults[key] !== "undefined"; + if (!defined) + msgs.push({ reason: "unknown property", where: `${parent}.${key} = ${config3[key]}` }); + const same = defaults && typeof defaults[key] === typeof config3[key]; + if (defined && !same) + msgs.push({ reason: "property type mismatch", where: `${parent}.${key} = ${config3[key]}`, expected: typeof defaults[key] }); + } + } + if (config3.debug && parent === "config" && msgs.length > 0) + log("invalid configuration", msgs); + return msgs; +} +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: "", + modelBasePath: "", + cacheModels: true, + validateModels: true, + wasmPath: "", + wasmPlatformFetch: false, + debug: false, + async: true, + warmup: "full", + cacheSensitivity: 0.7, + skipAllowed: false, + deallocate: false, + flags: {}, + softwareKernels: false, + filter: { + enabled: true, + equalization: false, + width: 0, + height: 0, + flip: false, + return: true, + autoBrightness: true, + brightness: 0, + contrast: 0, + sharpness: 0, + blur: 0, + saturation: 0, + hue: 0, + negative: false, + sepia: false, + vintage: false, + kodachrome: false, + technicolor: false, + polaroid: false, + pixelate: 0 + }, + gesture: { + enabled: true + }, + face: { + enabled: true, + detector: { + modelPath: "blazeface.json", + rotation: true, + maxDetected: 1, + skipFrames: 99, + skipTime: 2500, + minConfidence: 0.2, + iouThreshold: 0.1, + mask: false, + return: false + }, + mesh: { + enabled: true, + modelPath: "facemesh.json", + keepInvalid: false + }, + attention: { + enabled: false, + modelPath: "facemesh-attention.json" + }, + iris: { + enabled: true, + modelPath: "iris.json" + }, + emotion: { + enabled: true, + minConfidence: 0.1, + skipFrames: 99, + skipTime: 1500, + modelPath: "emotion.json" + }, + description: { + enabled: true, + modelPath: "faceres.json", + skipFrames: 99, + skipTime: 3e3, + minConfidence: 0.1 + }, + antispoof: { + enabled: false, + skipFrames: 99, + skipTime: 4e3, + modelPath: "antispoof.json" + }, + liveness: { + enabled: false, + skipFrames: 99, + skipTime: 4e3, + modelPath: "liveness.json" + } + }, + body: { + enabled: true, + modelPath: "movenet-lightning.json", + maxDetected: -1, + minConfidence: 0.3, + skipFrames: 1, + skipTime: 200 + }, + hand: { + enabled: true, + rotation: true, + skipFrames: 99, + skipTime: 1e3, + minConfidence: 0.5, + iouThreshold: 0.2, + maxDetected: -1, + landmarks: true, + detector: { + modelPath: "handtrack.json" + }, + skeleton: { + modelPath: "handlandmark-full.json" + } + }, + object: { + enabled: false, + modelPath: "centernet.json", + minConfidence: 0.2, + iouThreshold: 0.4, + maxDetected: 10, + skipFrames: 99, + skipTime: 2e3 + }, + segmentation: { + enabled: false, + modelPath: "rvm.json", + ratio: 0.5, + mode: "default" + } +}; + +// src/image/imagefxshaders.ts +var vertexIdentity = ` + 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.); + } +`; +var colorMatrixWithAlpha = ` + 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]; + } +`; +var colorMatrixWithoutAlpha = ` + 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; + } +`; +var pixelate = ` + 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); + } +`; +var blur = ` + 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; + } +`; +var convolution = ` + 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); // top left + vec4 c12 = texture2D(texture, vec2(vUv.x, vUv.y - px.y)); // top center + vec4 c13 = texture2D(texture, vec2(vUv.x + px.x, vUv.y - px.y)); // top right + vec4 c21 = texture2D(texture, vec2(vUv.x - px.x, vUv.y) ); // mid left + vec4 c22 = texture2D(texture, vUv); // mid center + vec4 c23 = texture2D(texture, vec2(vUv.x + px.x, vUv.y) ); // mid right + vec4 c31 = texture2D(texture, vec2(vUv.x - px.x, vUv.y + px.y) ); // bottom left + vec4 c32 = texture2D(texture, vec2(vUv.x, vUv.y + px.y) ); // bottom center + vec4 c33 = texture2D(texture, vUv + px ); // bottom right + 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; + } +`; + +// src/image/imagefx.ts +var collect = (source, prefix, collection) => { + const r = new RegExp("\\b" + prefix + " \\w+ (\\w+)", "ig"); + source.replace(r, (match2, name) => { + collection[name] = 0; + return match2; + }); +}; +var GLProgram = class { + constructor(gl2, vertexSource, fragmentSource) { + __publicField(this, "uniform", {}); + __publicField(this, "attribute", {}); + __publicField(this, "gl"); + __publicField(this, "id"); + __publicField(this, "compile", (source, type) => { + const shader = this.gl.createShader(type); + if (!shader) { + log("filter: could not create shader"); + return null; + } + this.gl.shaderSource(shader, source); + this.gl.compileShader(shader); + if (!this.gl.getShaderParameter(shader, this.gl.COMPILE_STATUS)) { + log(`filter: gl compile failed: ${this.gl.getShaderInfoLog(shader) || "unknown"}`); + return null; + } + return shader; + }); + this.gl = gl2; + const vertexShader = this.compile(vertexSource, this.gl.VERTEX_SHADER); + const fragmentShader = this.compile(fragmentSource, this.gl.FRAGMENT_SHADER); + this.id = this.gl.createProgram(); + if (!vertexShader || !fragmentShader) + return; + if (!this.id) { + log("filter: could not create webgl program"); + return; + } + this.gl.attachShader(this.id, vertexShader); + this.gl.attachShader(this.id, fragmentShader); + this.gl.linkProgram(this.id); + if (!this.gl.getProgramParameter(this.id, this.gl.LINK_STATUS)) { + log(`filter: gl link failed: ${this.gl.getProgramInfoLog(this.id) || "unknown"}`); + return; + } + this.gl.useProgram(this.id); + collect(vertexSource, "attribute", this.attribute); + for (const a in this.attribute) + this.attribute[a] = this.gl.getAttribLocation(this.id, a); + collect(vertexSource, "uniform", this.uniform); + collect(fragmentSource, "uniform", this.uniform); + for (const u in this.uniform) + this.uniform[u] = this.gl.getUniformLocation(this.id, u); + } +}; +function GLImageFilter() { + let drawCount = 0; + let sourceTexture = null; + let lastInChain = false; + let currentFramebufferIndex = -1; + let tempFramebuffers = [null, null]; + let filterChain = []; + let vertexBuffer = null; + let currentProgram = null; + const fxcanvas = canvas(100, 100); + const shaderProgramCache = {}; + const DRAW = { INTERMEDIATE: 1 }; + const gl2 = fxcanvas.getContext("webgl"); + if (!gl2) { + log("filter: cannot get webgl context"); + return; + } + this.gl = gl2; + function resize(width, height) { + if (width === fxcanvas.width && height === fxcanvas.height) + return; + fxcanvas.width = width; + fxcanvas.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 = gl2.createBuffer(); + gl2.bindBuffer(gl2.ARRAY_BUFFER, vertexBuffer); + gl2.bufferData(gl2.ARRAY_BUFFER, vertices, gl2.STATIC_DRAW); + gl2.pixelStorei(gl2.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + } + gl2.viewport(0, 0, fxcanvas.width, fxcanvas.height); + tempFramebuffers = [null, null]; + } + function createFramebufferTexture(width, height) { + const fbo = gl2.createFramebuffer(); + gl2.bindFramebuffer(gl2.FRAMEBUFFER, fbo); + const renderbuffer = gl2.createRenderbuffer(); + gl2.bindRenderbuffer(gl2.RENDERBUFFER, renderbuffer); + const texture = gl2.createTexture(); + gl2.bindTexture(gl2.TEXTURE_2D, texture); + gl2.texImage2D(gl2.TEXTURE_2D, 0, gl2.RGBA, width, height, 0, gl2.RGBA, gl2.UNSIGNED_BYTE, null); + gl2.texParameteri(gl2.TEXTURE_2D, gl2.TEXTURE_MAG_FILTER, gl2.LINEAR); + gl2.texParameteri(gl2.TEXTURE_2D, gl2.TEXTURE_MIN_FILTER, gl2.LINEAR); + gl2.texParameteri(gl2.TEXTURE_2D, gl2.TEXTURE_WRAP_S, gl2.CLAMP_TO_EDGE); + gl2.texParameteri(gl2.TEXTURE_2D, gl2.TEXTURE_WRAP_T, gl2.CLAMP_TO_EDGE); + gl2.framebufferTexture2D(gl2.FRAMEBUFFER, gl2.COLOR_ATTACHMENT0, gl2.TEXTURE_2D, texture, 0); + gl2.bindTexture(gl2.TEXTURE_2D, null); + gl2.bindFramebuffer(gl2.FRAMEBUFFER, null); + return { fbo, texture }; + } + function getTempFramebuffer(index2) { + tempFramebuffers[index2] = tempFramebuffers[index2] || createFramebufferTexture(fxcanvas.width, fxcanvas.height); + return tempFramebuffers[index2]; + } + function draw(flags = 0) { + if (!currentProgram) + return; + let source = null; + let target = null; + let flipY = false; + if (drawCount === 0) + source = sourceTexture; + else + source = getTempFramebuffer(currentFramebufferIndex).texture || null; + drawCount++; + if (lastInChain && !(flags & DRAW.INTERMEDIATE)) { + target = null; + flipY = drawCount % 2 === 0; + } else { + currentFramebufferIndex = (currentFramebufferIndex + 1) % 2; + target = getTempFramebuffer(currentFramebufferIndex).fbo || null; + } + gl2.bindTexture(gl2.TEXTURE_2D, source); + gl2.bindFramebuffer(gl2.FRAMEBUFFER, target); + gl2.uniform1f(currentProgram.uniform["flipY"], flipY ? -1 : 1); + gl2.drawArrays(gl2.TRIANGLES, 0, 6); + } + function compileShader(fragmentSource) { + if (shaderProgramCache[fragmentSource]) { + currentProgram = shaderProgramCache[fragmentSource]; + gl2.useProgram((currentProgram ? currentProgram.id : null) || null); + return currentProgram; + } + currentProgram = new GLProgram(gl2, vertexIdentity, fragmentSource); + if (!currentProgram) { + log("filter: could not get webgl program"); + return null; + } + const floatSize = Float32Array.BYTES_PER_ELEMENT; + const vertSize = 4 * floatSize; + gl2.enableVertexAttribArray(currentProgram.attribute["pos"]); + gl2.vertexAttribPointer(currentProgram.attribute["pos"], 2, gl2.FLOAT, false, vertSize, 0 * floatSize); + gl2.enableVertexAttribArray(currentProgram.attribute["uv"]); + gl2.vertexAttribPointer(currentProgram.attribute["uv"], 2, gl2.FLOAT, false, vertSize, 2 * floatSize); + shaderProgramCache[fragmentSource] = currentProgram; + return currentProgram; + } + const filter = { + colorMatrix: (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 ? colorMatrixWithoutAlpha : colorMatrixWithAlpha; + const program = compileShader(shader); + if (!program) + return; + gl2.uniform1fv(program.uniform["m"], m); + draw(); + }, + brightness: (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 + ]); + }, + saturation: (amount) => { + const x6 = (amount || 0) * 2 / 3 + 1; + const y = (x6 - 1) * -0.5; + filter.colorMatrix([ + x6, + y, + y, + 0, + 0, + y, + x6, + y, + 0, + 0, + y, + y, + x6, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ]); + }, + desaturate: () => { + filter.saturation(-1); + }, + contrast: (amount) => { + const v6 = (amount || 0) + 1; + const o = -128 * (v6 - 1); + filter.colorMatrix([ + v6, + 0, + 0, + 0, + o, + 0, + v6, + 0, + 0, + o, + 0, + 0, + v6, + 0, + o, + 0, + 0, + 0, + 1, + 0 + ]); + }, + negative: () => { + filter.contrast(-2); + }, + hue: (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 + ]); + }, + desaturateLuminance: () => { + 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 + ]); + }, + sepia: () => { + 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 + ]); + }, + brownie: () => { + 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 + ]); + }, + vintagePinhole: () => { + 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 + ]); + }, + kodachrome: () => { + 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 + ]); + }, + technicolor: () => { + 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 + ]); + }, + polaroid: () => { + 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 + ]); + }, + shiftToBGR: () => { + filter.colorMatrix([ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ]); + }, + convolution: (matrix) => { + const m = new Float32Array(matrix); + const pixelSizeX = 1 / fxcanvas.width; + const pixelSizeY = 1 / fxcanvas.height; + const program = compileShader(convolution); + if (!program) + return; + gl2.uniform1fv(program.uniform["m"], m); + gl2.uniform2f(program.uniform["px"], pixelSizeX, pixelSizeY); + draw(); + }, + detectEdges: () => { + filter.convolution.call(this, [ + 0, + 1, + 0, + 1, + -4, + 1, + 0, + 1, + 0 + ]); + }, + sobelX: () => { + filter.convolution.call(this, [ + -1, + 0, + 1, + -2, + 0, + 2, + -1, + 0, + 1 + ]); + }, + sobelY: () => { + filter.convolution.call(this, [ + -1, + -2, + -1, + 0, + 0, + 0, + 1, + 2, + 1 + ]); + }, + sharpen: (amount) => { + const a = amount || 1; + filter.convolution.call(this, [ + 0, + -1 * a, + 0, + -1 * a, + 1 + 4 * a, + -1 * a, + 0, + -1 * a, + 0 + ]); + }, + emboss: (size2) => { + const s = size2 || 1; + filter.convolution.call(this, [ + -2 * s, + -1 * s, + 0, + -1 * s, + 1, + 1 * s, + 0, + 1 * s, + 2 * s + ]); + }, + blur: (size2) => { + const blurSizeX = size2 / 7 / fxcanvas.width; + const blurSizeY = size2 / 7 / fxcanvas.height; + const program = compileShader(blur); + if (!program) + return; + gl2.uniform2f(program.uniform["px"], 0, blurSizeY); + draw(DRAW.INTERMEDIATE); + gl2.uniform2f(program.uniform["px"], blurSizeX, 0); + draw(); + }, + pixelate: (size2) => { + const blurSizeX = size2 / fxcanvas.width; + const blurSizeY = size2 / fxcanvas.height; + const program = compileShader(pixelate); + if (!program) + return; + gl2.uniform2f(program.uniform["size"], blurSizeX, blurSizeY); + draw(); + } + }; + this.add = function(name) { + const args = Array.prototype.slice.call(arguments, 1); + const func = filter[name]; + filterChain.push({ func, args }); + }; + this.reset = function() { + filterChain = []; + }; + this.get = function() { + return filterChain; + }; + this.apply = function(image) { + resize(image.width, image.height); + drawCount = 0; + if (!sourceTexture) + sourceTexture = gl2.createTexture(); + gl2.bindTexture(gl2.TEXTURE_2D, sourceTexture); + gl2.texParameteri(gl2.TEXTURE_2D, gl2.TEXTURE_WRAP_S, gl2.CLAMP_TO_EDGE); + gl2.texParameteri(gl2.TEXTURE_2D, gl2.TEXTURE_WRAP_T, gl2.CLAMP_TO_EDGE); + gl2.texParameteri(gl2.TEXTURE_2D, gl2.TEXTURE_MIN_FILTER, gl2.NEAREST); + gl2.texParameteri(gl2.TEXTURE_2D, gl2.TEXTURE_MAG_FILTER, gl2.NEAREST); + gl2.texImage2D(gl2.TEXTURE_2D, 0, gl2.RGBA, gl2.RGBA, gl2.UNSIGNED_BYTE, image); + for (let i = 0; i < filterChain.length; i++) { + lastInChain = i === filterChain.length - 1; + const f = filterChain[i]; + f.func.apply(this, f.args || []); + } + return fxcanvas; + }; + this.draw = function(image) { + this.add("brightness", 0); + return this.apply(image); + }; +} + +// src/image/enhance.ts +async function histogramEqualization(inputImage) { + const squeeze = inputImage.shape.length === 4 ? jp(inputImage) : inputImage; + const rgb2 = $a(squeeze, 3, 2); + const min = [fl(rgb2[0]), fl(rgb2[1]), fl(rgb2[2])]; + const max = [Vs(rgb2[0]), Vs(rgb2[1]), Vs(rgb2[2])]; + const absMax = await Promise.all(max.map((channel) => channel.data())); + const maxValue = Math.max(absMax[0][0], absMax[1][0], absMax[2][0]); + const maxRange = maxValue > 1 ? 255 : 1; + const factor = maxRange / maxValue; + let final; + if (factor > 1) { + const sub = [ke(rgb2[0], min[0]), ke(rgb2[1], min[1]), ke(rgb2[2], min[2])]; + const range = [ke(max[0], min[0]), ke(max[1], min[1]), ke(max[2], min[2])]; + const enh = [oe(sub[0], factor), oe(sub[1], factor), oe(sub[2], factor)]; + const stack = Ir([enh[0], enh[1], enh[2]], 2); + final = z(stack, [1, squeeze.shape[0] || 0, squeeze.shape[1] || 0, 3]); + Ft([...sub, ...range, ...enh]); + } else { + final = _a(squeeze, 0); + } + Ft([...rgb2, ...min, ...max, rgb2, squeeze, inputImage]); + return final; +} + +// src/image/image.ts +var maxSize = 3840; +var inCanvas = null; +var outCanvas = null; +var tmpCanvas = null; +var fx2; +var last = { + inputSum: 0, + cacheDiff: 1, + sumMethod: 0, + inputTensor: void 0 +}; +function reset() { + last.inputSum = 0; + last.cacheDiff = 1; + last.sumMethod = 0; + last.inputTensor = void 0; +} +function canvas(width, height) { + let c; + if (env.browser) { + if (env.worker) { + if (typeof OffscreenCanvas === "undefined") + throw new Error("canvas error: attempted to run in web worker but OffscreenCanvas is not supported"); + c = new OffscreenCanvas(width, height); + } else { + if (typeof document === "undefined") + throw new Error("canvas error: attempted to run in browser but DOM is not defined"); + c = document.createElement("canvas"); + c.width = width; + c.height = height; + } + } else { + if (typeof env.Canvas !== "undefined") + c = new env.Canvas(width, height); + else if (typeof globalThis.Canvas !== "undefined") + c = new globalThis.Canvas(width, height); + } + return c; +} +function copy(input, output) { + const outputCanvas = output || canvas(input.width, input.height); + const ctx = outputCanvas.getContext("2d"); + ctx.drawImage(input, 0, 0); + return outputCanvas; +} +async function process2(input, config3, getTensor = true) { + var _a2, _b, _c2; + if (!input) { + if (config3.debug) + log("input error: input is missing"); + return { tensor: null, canvas: null }; + } + if (!(input instanceof ut) && !(typeof Image !== "undefined" && input instanceof Image) && !(typeof env.Canvas !== "undefined" && input instanceof env.Canvas) && !(typeof globalThis.Canvas !== "undefined" && input instanceof globalThis.Canvas) && !(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("input error: type is not recognized"); + } + if (input instanceof ut) { + let tensor2 = null; + if (input["isDisposedInternal"]) + throw new Error("input error: attempted to use tensor but it is disposed"); + if (!input.shape) + throw new Error("input error: attempted to use tensor without a shape"); + if (input.shape.length === 3) { + if (input.shape[2] === 3) { + tensor2 = _a(input, 0); + } else if (input.shape[2] === 4) { + const rgb2 = W1(input, [0, 0, 0], [-1, -1, 3]); + tensor2 = _a(rgb2, 0); + Ft(rgb2); + } + } else if (input.shape.length === 4) { + if (input.shape[3] === 3) { + tensor2 = zr(input); + } else if (input.shape[3] === 4) { + tensor2 = U1(input, [0, 0, 0, 0], [-1, -1, -1, 3]); + } + } + if (tensor2 == null || tensor2.shape.length !== 4 || tensor2.shape[0] !== 1 || tensor2.shape[3] !== 3) + throw new Error(`input error: attempted to use tensor with unrecognized shape: ${input.shape.toString()}`); + if (tensor2.dtype === "int32") { + const cast = qe(tensor2, "float32"); + Ft(tensor2); + tensor2 = cast; + } + return { tensor: tensor2, canvas: config3.filter.return ? outCanvas : null }; + } + if (typeof input["readyState"] !== "undefined" && input.readyState <= 2) { + if (config3.debug) + log("input stream is not ready"); + return { tensor: null, canvas: inCanvas }; + } + const originalWidth = input["naturalWidth"] || input["videoWidth"] || input["width"] || input["shape"] && input["shape"][1] > 0; + const originalHeight = input["naturalHeight"] || input["videoHeight"] || input["height"] || input["shape"] && input["shape"][2] > 0; + if (!originalWidth || !originalHeight) { + if (config3.debug) + log("cannot determine input dimensions"); + return { tensor: null, canvas: inCanvas }; + } + let targetWidth = originalWidth; + let targetHeight = originalHeight; + if (targetWidth > maxSize) { + targetWidth = maxSize; + targetHeight = Math.trunc(targetWidth * originalHeight / originalWidth); + } + if (targetHeight > maxSize) { + targetHeight = maxSize; + targetWidth = Math.trunc(targetHeight * originalWidth / originalHeight); + } + if ((((_a2 = config3.filter) == null ? void 0 : _a2.width) || 0) > 0) + targetWidth = config3.filter.width; + else if ((((_b = config3.filter) == null ? void 0 : _b.height) || 0) > 0) + targetWidth = originalWidth * ((config3.filter.height || 0) / originalHeight); + if ((config3.filter.height || 0) > 0) + targetHeight = config3.filter.height; + else if ((config3.filter.width || 0) > 0) + targetHeight = originalHeight * ((config3.filter.width || 0) / originalWidth); + if (!targetWidth || !targetHeight) + throw new Error("input error: cannot determine dimension"); + if (!inCanvas || inCanvas.width !== targetWidth || inCanvas.height !== targetHeight) + inCanvas = canvas(targetWidth, targetHeight); + const inCtx = inCanvas.getContext("2d"); + if (typeof ImageData !== "undefined" && input instanceof ImageData) { + inCtx.putImageData(input, 0, 0); + } else { + if (config3.filter.flip && typeof inCtx.translate !== "undefined") { + inCtx.translate(originalWidth, 0); + inCtx.scale(-1, 1); + inCtx.drawImage(input, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas.width, inCanvas.height); + inCtx.setTransform(1, 0, 0, 1, 0, 0); + } else { + inCtx.drawImage(input, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas.width, inCanvas.height); + } + } + if (!outCanvas || inCanvas.width !== outCanvas.width || inCanvas.height !== outCanvas.height) + outCanvas = canvas(inCanvas.width, inCanvas.height); + if (config3.filter.enabled && env.webgl.supported) { + if (!fx2) + fx2 = env.browser ? new GLImageFilter() : null; + env.filter = !!fx2; + if (!(fx2 == null ? void 0 : fx2.add)) { + if (config3.debug) + log("input process error: cannot initialize filters"); + env.webgl.supported = false; + config3.filter.enabled = false; + copy(inCanvas, outCanvas); + } else { + fx2.reset(); + if (config3.filter.brightness !== 0) + fx2.add("brightness", config3.filter.brightness); + if (config3.filter.contrast !== 0) + fx2.add("contrast", config3.filter.contrast); + if (config3.filter.sharpness !== 0) + fx2.add("sharpen", config3.filter.sharpness); + if (config3.filter.blur !== 0) + fx2.add("blur", config3.filter.blur); + if (config3.filter.saturation !== 0) + fx2.add("saturation", config3.filter.saturation); + if (config3.filter.hue !== 0) + fx2.add("hue", config3.filter.hue); + if (config3.filter.negative) + fx2.add("negative"); + if (config3.filter.sepia) + fx2.add("sepia"); + if (config3.filter.vintage) + fx2.add("brownie"); + if (config3.filter.sepia) + fx2.add("sepia"); + if (config3.filter.kodachrome) + fx2.add("kodachrome"); + if (config3.filter.technicolor) + fx2.add("technicolor"); + if (config3.filter.polaroid) + fx2.add("polaroid"); + if (config3.filter.pixelate !== 0) + fx2.add("pixelate", config3.filter.pixelate); + if (((_c2 = fx2.get()) == null ? void 0 : _c2.length) > 1) + outCanvas = fx2.apply(inCanvas); + else + outCanvas = fx2.draw(inCanvas); + } + } else { + copy(inCanvas, outCanvas); + if (fx2) + fx2 = null; + env.filter = !!fx2; + } + if (!getTensor) + return { tensor: null, canvas: outCanvas }; + if (!outCanvas) + throw new Error("canvas error: cannot create output"); + let pixels; + let depth = 3; + if (typeof ImageData !== "undefined" && input instanceof ImageData || input.data && input.width && input.height) { + if (env.browser && Sv) { + pixels = Sv ? Sv.fromPixels(input) : null; + } else { + depth = input.data.length / input.height / input.width; + const arr = new Uint8Array(input.data.buffer); + pixels = nr(arr, [input.height, input.width, depth], "int32"); + } + } else { + if (!tmpCanvas || outCanvas.width !== tmpCanvas.width || outCanvas.height !== tmpCanvas.height) + tmpCanvas = canvas(outCanvas.width, outCanvas.height); + if (Sv && env.browser) { + if (config3.backend === "webgl" || config3.backend === "humangl" || config3.backend === "webgpu") { + pixels = Sv.fromPixels(outCanvas); + } else { + tmpCanvas = copy(outCanvas); + pixels = Sv.fromPixels(tmpCanvas); + } + } else { + const tempCanvas = copy(outCanvas); + const tempCtx = tempCanvas.getContext("2d"); + const tempData = tempCtx.getImageData(0, 0, targetWidth, targetHeight); + depth = tempData.data.length / targetWidth / targetHeight; + const arr = new Uint8Array(tempData.data.buffer); + pixels = nr(arr, [targetWidth, targetHeight, depth]); + } + } + if (depth === 4) { + const rgb2 = W1(pixels, [0, 0, 0], [-1, -1, 3]); + Ft(pixels); + pixels = rgb2; + } + if (!pixels) + throw new Error("input error: cannot create tensor"); + const casted = qe(pixels, "float32"); + const tensor = config3.filter.equalization ? await histogramEqualization(casted) : _a(casted, 0); + Ft([pixels, casted]); + if (config3.filter.autoBrightness) { + const max = Vs(tensor); + const maxVal = await max.data(); + config3.filter.brightness = maxVal[0] > 1 ? 1 - maxVal[0] / 255 : 1 - maxVal[0]; + Ft(max); + } + return { tensor, canvas: config3.filter.return ? outCanvas : null }; +} +async function skip(config3, input) { + let skipFrame = false; + if (config3.cacheSensitivity === 0 || !input.shape || input.shape.length !== 4 || input.shape[1] > 3840 || input.shape[2] > 2160) + return skipFrame; + if (!last.inputTensor) { + last.inputTensor = zr(input); + } else if (last.inputTensor.shape[1] !== input.shape[1] || last.inputTensor.shape[2] !== input.shape[2]) { + Ft(last.inputTensor); + last.inputTensor = zr(input); + } else { + const t10 = {}; + t10.diff = ke(input, last.inputTensor); + t10.squared = oe(t10.diff, t10.diff); + t10.sum = tt(t10.squared); + const diffSum = await t10.sum.data(); + const diffRelative = diffSum[0] / (input.shape[1] || 1) / (input.shape[2] || 1) / 255 / 3; + Ft([last.inputTensor, t10.diff, t10.squared, t10.sum]); + last.inputTensor = zr(input); + skipFrame = diffRelative <= (config3.cacheSensitivity || 0); + } + return skipFrame; +} +async function compare(config3, input1, input2) { + const t10 = {}; + if (!input1 || !input2 || input1.shape.length !== 4 || input1.shape.length !== input2.shape.length) { + if (!config3.debug) + log("invalid input tensor or tensor shapes do not match:", input1.shape, input2.shape); + return 0; + } + if (input1.shape[0] !== 1 || input2.shape[0] !== 1 || input1.shape[3] !== 3 || input2.shape[3] !== 3) { + if (!config3.debug) + log("input tensors must be of shape [1, height, width, 3]:", input1.shape, input2.shape); + return 0; + } + t10.input1 = zr(input1); + t10.input2 = input1.shape[1] !== input2.shape[1] || input1.shape[2] !== input2.shape[2] ? zq.resizeBilinear(input2, [input1.shape[1], input1.shape[2]]) : zr(input2); + t10.diff = ke(t10.input1, t10.input2); + t10.squared = oe(t10.diff, t10.diff); + t10.sum = tt(t10.squared); + const diffSum = await t10.sum.data(); + const diffRelative = diffSum[0] / (input1.shape[1] || 1) / (input1.shape[2] || 1) / 255 / 3; + Ft([t10.input1, t10.input2, t10.diff, t10.squared, t10.sum]); + return diffRelative; +} + +// src/util/env.ts +var Env = class { + constructor() { + __publicField(this, "browser"); + __publicField(this, "node"); + __publicField(this, "worker"); + __publicField(this, "platform", ""); + __publicField(this, "agent", ""); + __publicField(this, "backends", []); + __publicField(this, "initial"); + __publicField(this, "filter"); + __publicField(this, "tfjs"); + __publicField(this, "offscreen"); + __publicField(this, "perfadd", false); + __publicField(this, "tensorflow", { + version: void 0, + gpu: void 0 + }); + __publicField(this, "wasm", { + supported: void 0, + backend: void 0, + simd: void 0, + multithread: void 0 + }); + __publicField(this, "webgl", { + supported: void 0, + backend: void 0, + version: void 0, + renderer: void 0, + shader: void 0, + vendor: void 0 + }); + __publicField(this, "webgpu", { + supported: void 0, + backend: void 0, + adapter: void 0 + }); + __publicField(this, "cpu", { + model: void 0, + flags: [] + }); + __publicField(this, "kernels", []); + __publicField(this, "Canvas"); + __publicField(this, "Image"); + __publicField(this, "ImageData"); + this.browser = typeof navigator !== "undefined"; + this.node = typeof process !== "undefined" && typeof process.versions !== "undefined" && typeof process.versions.node !== "undefined"; + this.tfjs = { version: Cne["tfjs-core"] }; + this.offscreen = typeof OffscreenCanvas !== "undefined"; + this.initial = true; + this.worker = this.browser && this.offscreen ? typeof WorkerGlobalScope !== "undefined" : void 0; + if (typeof navigator !== "undefined") { + const raw = navigator.userAgent.match(/\(([^()]+)\)/g); + if (raw == null ? void 0 : raw[0]) { + const platformMatch = raw[0].match(/\(([^()]+)\)/g); + this.platform = (platformMatch == null ? void 0 : platformMatch[0]) ? platformMatch[0].replace(/\(|\)/g, "") : ""; + this.agent = navigator.userAgent.replace(raw[0], ""); + if (this.platform[1]) + this.agent = this.agent.replace(raw[1], ""); + this.agent = this.agent.replace(/ /g, " "); + } + } else if (typeof process !== "undefined") { + this.platform = `${process.platform} ${process.arch}`; + this.agent = `NodeJS ${process.version}`; + } + } + async updateBackend() { + this.backends = Object.keys(cr().registryFactory); + try { + this.tensorflow = { + version: Bie()["binding"] ? Bie()["binding"].TF_Version : void 0, + gpu: Bie()["binding"] ? Bie()["binding"].isUsingGpuDevice() : void 0 + }; + } catch (e) { + } + this.wasm.supported = typeof WebAssembly !== "undefined"; + this.wasm.backend = this.backends.includes("wasm"); + if (this.wasm.supported && this.wasm.backend) { + this.wasm.simd = await P().getAsync("WASM_HAS_SIMD_SUPPORT"); + this.wasm.multithread = await P().getAsync("WASM_HAS_MULTITHREAD_SUPPORT"); + } + const c = canvas(100, 100); + const gl2 = c ? c.getContext("webgl2") : void 0; + this.webgl.supported = typeof gl2 !== "undefined"; + this.webgl.backend = this.backends.includes("webgl"); + if (this.webgl.supported && this.webgl.backend && gl2) { + this.webgl.version = gl2.getParameter(gl2.VERSION); + this.webgl.vendor = gl2.getParameter(gl2.VENDOR); + this.webgl.renderer = gl2.getParameter(gl2.RENDERER); + this.webgl.shader = gl2.getParameter(gl2.SHADING_LANGUAGE_VERSION); + } + this.webgpu.supported = this.browser && typeof navigator.gpu !== "undefined"; + this.webgpu.backend = this.backends.includes("webgpu"); + try { + if (this.webgpu.supported) { + const adapter = await navigator.gpu.requestAdapter(); + this.webgpu.adapter = await (adapter == null ? void 0 : adapter.requestAdapterInfo()); + } + } catch (e) { + this.webgpu.supported = false; + } + try { + this.kernels = zm(Pie()).map((kernel) => kernel.kernelName.toLowerCase()); + } catch (e) { + } + } + updateCPU() { + const cpu = { model: "", flags: [] }; + if (this.node && this.platform.startsWith("linux")) { + } + if (!this.cpu) + Object.defineProperty(this, "cpu", { value: cpu }); + else + this.cpu = cpu; + } +}; +var env = new Env(); + +// src/util/webcam.ts +var WebCam = class { + constructor() { + __publicField(this, "config"); + __publicField(this, "element"); + __publicField(this, "stream"); + __publicField(this, "devices", []); + __publicField(this, "enumerate", async () => { + try { + const devices = await navigator.mediaDevices.enumerateDevices(); + this.devices = devices.filter((device) => device.kind === "videoinput"); + } catch (e) { + this.devices = []; + } + return this.devices; + }); + __publicField(this, "start", async (webcamConfig) => { + if (webcamConfig == null ? void 0 : webcamConfig.debug) + this.config.debug = webcamConfig == null ? void 0 : webcamConfig.debug; + if (webcamConfig == null ? void 0 : webcamConfig.crop) + this.config.crop = webcamConfig == null ? void 0 : webcamConfig.crop; + if (webcamConfig == null ? void 0 : webcamConfig.mode) + this.config.mode = webcamConfig == null ? void 0 : webcamConfig.mode; + if (webcamConfig == null ? void 0 : webcamConfig.width) + this.config.width = webcamConfig == null ? void 0 : webcamConfig.width; + if (webcamConfig == null ? void 0 : webcamConfig.height) + this.config.height = webcamConfig == null ? void 0 : webcamConfig.height; + if (webcamConfig == null ? void 0 : webcamConfig.id) + this.config.id = webcamConfig == null ? void 0 : webcamConfig.id; + if (webcamConfig == null ? void 0 : webcamConfig.element) { + if (typeof webcamConfig.element === "string") { + const el2 = document.getElementById(webcamConfig.element); + if (el2 && el2 instanceof HTMLVideoElement) { + this.element = el2; + } else { + if (this.config.debug) + log("webcam", "cannot get dom element", webcamConfig.element); + return; + } + } else if (webcamConfig.element instanceof HTMLVideoElement) { + this.element = webcamConfig.element; + } else { + if (this.config.debug) + log("webcam", "unknown dom element", webcamConfig.element); + return; + } + } else { + this.element = document.createElement("video"); + } + const requestedConstraints = { + audio: false, + video: { + facingMode: this.config.mode === "front" ? "user" : "environment", + resizeMode: this.config.crop ? "crop-and-scale" : "none", + width: { ideal: this.config.width > 0 ? this.config.width : window.innerWidth }, + height: { ideal: this.config.height > 0 ? this.config.height : window.innerHeight } + } + }; + if (this.config.id) + requestedConstraints.video.deviceId = this.config.id; + this.element.addEventListener("play", () => { + if (this.config.debug) + log("webcam", "play"); + }); + this.element.addEventListener("pause", () => { + if (this.config.debug) + log("webcam", "pause"); + }); + this.element.addEventListener("click", async () => { + if (!this.element || !this.stream) + return; + if (this.element.paused) + await this.element.play(); + else + this.element.pause(); + }); + if (!(navigator == null ? void 0 : navigator.mediaDevices)) { + if (this.config.debug) + log("webcam", "no devices"); + return; + } + try { + this.stream = await navigator.mediaDevices.getUserMedia(requestedConstraints); + } catch (err) { + log("webcam", err); + return; + } + if (!this.stream) { + if (this.config.debug) + log("webcam", "no stream"); + return; + } + this.element.srcObject = this.stream; + const ready = new Promise((resolve) => { + if (!this.element) + resolve(false); + else + this.element.onloadeddata = () => resolve(true); + }); + await ready; + await this.element.play(); + if (this.config.debug) { + log("webcam", { + width: this.width, + height: this.height, + label: this.label, + stream: this.stream, + track: this.track, + settings: this.settings, + constraints: this.constraints, + capabilities: this.capabilities + }); + } + }); + __publicField(this, "pause", () => { + if (this.element) + this.element.pause(); + }); + __publicField(this, "play", async () => { + if (this.element) + await this.element.play(); + }); + __publicField(this, "stop", () => { + if (this.config.debug) + log("webcam", "stop"); + if (this.track) + this.track.stop(); + }); + this.config = { + element: void 0, + debug: true, + mode: "front", + crop: false, + width: 0, + height: 0 + }; + } + get track() { + if (!this.stream) + return void 0; + return this.stream.getVideoTracks()[0]; + } + get capabilities() { + if (!this.track) + return void 0; + return this.track.getCapabilities ? this.track.getCapabilities() : void 0; + } + get constraints() { + if (!this.track) + return void 0; + return this.track.getConstraints ? this.track.getConstraints() : void 0; + } + get settings() { + if (!this.stream) + return void 0; + const track = this.stream.getVideoTracks()[0]; + return track.getSettings ? track.getSettings() : void 0; + } + get label() { + if (!this.track) + return ""; + return this.track.label; + } + get paused() { + var _a2; + return ((_a2 = this.element) == null ? void 0 : _a2.paused) || false; + } + get width() { + var _a2; + return ((_a2 = this.element) == null ? void 0 : _a2.videoWidth) || 0; + } + get height() { + var _a2; + return ((_a2 = this.element) == null ? void 0 : _a2.videoHeight) || 0; + } +}; + +// models/models.json +var models_exports = {}; +__export(models_exports, { + age: () => age, + "anti-spoofing": () => anti_spoofing, + antispoof: () => antispoof, + blazeface: () => blazeface, + "blazeface-back": () => blazeface_back, + "blazeface-front": () => blazeface_front, + "blazepose-detect": () => blazepose_detect, + "blazepose-detector2d": () => blazepose_detector2d, + "blazepose-detector3d": () => blazepose_detector3d, + "blazepose-full": () => blazepose_full, + "blazepose-heavy": () => blazepose_heavy, + "blazepose-lite": () => blazepose_lite, + centernet: () => centernet, + default: () => models_default, + efficientpose: () => efficientpose, + "efficientpose-i-lite": () => efficientpose_i_lite, + "efficientpose-ii-lite": () => efficientpose_ii_lite, + "efficientpose-iv": () => efficientpose_iv, + emotion: () => emotion, + faceboxes: () => faceboxes, + facemesh: () => facemesh, + "facemesh-attention": () => facemesh_attention, + "facemesh-attention-alt": () => facemesh_attention_alt, + "facemesh-detection-full": () => facemesh_detection_full, + "facemesh-detection-short": () => facemesh_detection_short, + "facemesh-orig": () => facemesh_orig, + faceres: () => faceres, + "faceres-deep": () => faceres_deep, + gear: () => gear, + gender: () => gender, + "gender-ssrnet-imdb": () => gender_ssrnet_imdb, + handdetect: () => handdetect, + "handlandmark-full": () => handlandmark_full, + "handlandmark-lite": () => handlandmark_lite, + "handlandmark-sparse": () => handlandmark_sparse, + handskeleton: () => handskeleton, + handtrack: () => handtrack, + "insightface-efficientnet-b0": () => insightface_efficientnet_b0, + "insightface-ghostnet-strides1": () => insightface_ghostnet_strides1, + "insightface-ghostnet-strides2": () => insightface_ghostnet_strides2, + "insightface-mobilenet-emore": () => insightface_mobilenet_emore, + "insightface-mobilenet-swish": () => insightface_mobilenet_swish, + iris: () => iris, + liveness: () => liveness, + meet: () => meet, + mobileface: () => mobileface, + mobilefacenet: () => mobilefacenet, + models: () => models, + "movenet-lightning": () => movenet_lightning, + "movenet-multipose": () => movenet_multipose, + "movenet-thunder": () => movenet_thunder, + nanodet: () => nanodet, + "nanodet-e": () => nanodet_e, + "nanodet-g": () => nanodet_g, + "nanodet-m": () => nanodet_m, + "nanodet-t": () => nanodet_t, + posenet: () => posenet, + rvm: () => rvm, + selfie: () => selfie +}); +var antispoof = 853098; +var blazeface = 538928; +var centernet = 4030290; +var emotion = 820516; +var facemesh = 1477958; +var faceres = 6978814; +var handlandmark_full = 5431368; +var handtrack = 2964837; +var iris = 2599092; +var liveness = 592976; +var models = 0; +var movenet_lightning = 4650216; +var age = 161240; +var blazeface_back = 538928; +var blazeface_front = 402048; +var blazepose_detector2d = 7499400; +var blazepose_detector3d = 5928856; +var blazepose_full = 6338290; +var blazepose_heavy = 27501554; +var blazepose_lite = 2725490; +var efficientpose = 5651240; +var faceboxes = 2013002; +var facemesh_attention_alt = 2387598; +var facemesh_attention = 2382414; +var facemesh_detection_full = 1026192; +var facemesh_detection_short = 201268; +var facemesh_orig = 2955780; +var faceres_deep = 13957620; +var gear = 1498916; +var gender_ssrnet_imdb = 161236; +var gender = 201808; +var handdetect = 3515612; +var handlandmark_lite = 2023432; +var handlandmark_sparse = 5286322; +var handskeleton = 5502280; +var meet = 372228; +var mobileface = 2183192; +var mobilefacenet = 5171976; +var movenet_multipose = 9448838; +var movenet_thunder = 12477112; +var nanodet = 7574558; +var posenet = 5032780; +var rvm = 3739355; +var selfie = 212886; +var blazepose_detect = 5928804; +var anti_spoofing = 853098; +var efficientpose_i_lite = 2269064; +var efficientpose_ii_lite = 5651240; +var efficientpose_iv = 25643252; +var insightface_efficientnet_b0 = 13013224; +var insightface_ghostnet_strides1 = 8093408; +var insightface_ghostnet_strides2 = 8049584; +var insightface_mobilenet_emore = 6938536; +var insightface_mobilenet_swish = 12168584; +var nanodet_e = 12319156; +var nanodet_g = 7574558; +var nanodet_m = 1887474; +var nanodet_t = 5294216; +var models_default = { + antispoof, + blazeface, + centernet, + emotion, + facemesh, + faceres, + "handlandmark-full": handlandmark_full, + handtrack, + iris, + liveness, + models, + "movenet-lightning": movenet_lightning, + age, + "blazeface-back": blazeface_back, + "blazeface-front": blazeface_front, + "blazepose-detector2d": blazepose_detector2d, + "blazepose-detector3d": blazepose_detector3d, + "blazepose-full": blazepose_full, + "blazepose-heavy": blazepose_heavy, + "blazepose-lite": blazepose_lite, + efficientpose, + faceboxes, + "facemesh-attention-alt": facemesh_attention_alt, + "facemesh-attention": facemesh_attention, + "facemesh-detection-full": facemesh_detection_full, + "facemesh-detection-short": facemesh_detection_short, + "facemesh-orig": facemesh_orig, + "faceres-deep": faceres_deep, + gear, + "gender-ssrnet-imdb": gender_ssrnet_imdb, + gender, + handdetect, + "handlandmark-lite": handlandmark_lite, + "handlandmark-sparse": handlandmark_sparse, + handskeleton, + meet, + mobileface, + mobilefacenet, + "movenet-multipose": movenet_multipose, + "movenet-thunder": movenet_thunder, + nanodet, + posenet, + rvm, + selfie, + "blazepose-detect": blazepose_detect, + "anti-spoofing": anti_spoofing, + "efficientpose-i-lite": efficientpose_i_lite, + "efficientpose-ii-lite": efficientpose_ii_lite, + "efficientpose-iv": efficientpose_iv, + "insightface-efficientnet-b0": insightface_efficientnet_b0, + "insightface-ghostnet-strides1": insightface_ghostnet_strides1, + "insightface-ghostnet-strides2": insightface_ghostnet_strides2, + "insightface-mobilenet-emore": insightface_mobilenet_emore, + "insightface-mobilenet-swish": insightface_mobilenet_swish, + "nanodet-e": nanodet_e, + "nanodet-g": nanodet_g, + "nanodet-m": nanodet_m, + "nanodet-t": nanodet_t +}; + +// src/tfjs/load.ts +var options = { + cacheModels: true, + cacheSupported: true, + verbose: true, + debug: false, + modelBasePath: "" +}; +var modelStats = {}; +async function httpHandler(url, init4) { + if (options.debug) + log("load model fetch:", url, init4); + return fetch(url, init4); +} +function setModelLoadOptions(config3) { + options.cacheModels = config3.cacheModels; + options.verbose = config3.debug; + options.modelBasePath = config3.modelBasePath; +} +async function loadModel(modelPath) { + var _a2, _b, _c2, _d2; + let modelUrl = join(options.modelBasePath, modelPath || ""); + if (!modelUrl.toLowerCase().endsWith(".json")) + modelUrl += ".json"; + const modelPathSegments = modelUrl.includes("/") ? modelUrl.split("/") : modelUrl.split("\\"); + const shortModelName = modelPathSegments[modelPathSegments.length - 1].replace(".json", ""); + const cachedModelName = "indexeddb://" + shortModelName; + modelStats[shortModelName] = { + name: shortModelName, + sizeFromManifest: 0, + sizeLoadedWeights: 0, + sizeDesired: models_exports[shortModelName], + inCache: false, + url: "" + }; + options.cacheSupported = typeof indexedDB !== "undefined"; + let cachedModels = {}; + try { + cachedModels = options.cacheSupported && options.cacheModels ? await va.listModels() : {}; + } catch (e) { + options.cacheSupported = false; + } + modelStats[shortModelName].inCache = options.cacheSupported && options.cacheModels && Object.keys(cachedModels).includes(cachedModelName); + modelStats[shortModelName].url = modelStats[shortModelName].inCache ? cachedModelName : modelUrl; + const tfLoadOptions = typeof fetch === "undefined" ? {} : { fetchFunc: (url, init4) => httpHandler(url, init4) }; + let model23 = new bl(modelStats[shortModelName].url, tfLoadOptions); + let loaded = false; + try { + model23.findIOHandler(); + if (options.debug) + log("model load handler:", model23["handler"]); + } catch (err) { + log("error finding model i/o handler:", modelUrl, err); + } + try { + const artifacts = await ((_a2 = model23.handler) == null ? void 0 : _a2.load()) || null; + modelStats[shortModelName].sizeFromManifest = ((_b = artifacts == null ? void 0 : artifacts.weightData) == null ? void 0 : _b.byteLength) || 0; + if (artifacts) + model23.loadSync(artifacts); + else + model23 = await U6(modelStats[shortModelName].inCache ? cachedModelName : modelUrl, tfLoadOptions); + modelStats[shortModelName].sizeLoadedWeights = ((_d2 = (_c2 = model23.artifacts) == null ? void 0 : _c2.weightData) == null ? void 0 : _d2.byteLength) || 0; + if (options.verbose) + log("load:", { model: shortModelName, url: model23["modelUrl"], bytes: modelStats[shortModelName].sizeLoadedWeights }); + loaded = true; + } catch (err) { + log("error loading model:", modelUrl, err); + } + if (loaded && options.cacheModels && options.cacheSupported && !modelStats[shortModelName].inCache) { + try { + const saveResult = await model23.save(cachedModelName); + if (options.debug) + log("model saved:", cachedModelName, saveResult); + } catch (err) { + log("error saving model:", modelUrl, err); + } + } + return model23; +} + +// package.json +var version = "3.0.0"; + +// src/tfjs/humangl.ts +var config2 = { + name: "humangl", + priority: 999, + canvas: null, + gl: null, + extensions: [], + webGLattr: { + alpha: false, + antialias: false, + premultipliedAlpha: false, + preserveDrawingBuffer: false, + depth: false, + stencil: false, + failIfMajorPerformanceCaveat: false, + desynchronized: true + } +}; +function extensions() { + const gl2 = config2.gl; + if (!gl2) + return; + config2.extensions = gl2.getSupportedExtensions(); +} +function register(instance) { + var _a2; + if (instance.config.backend !== "humangl") + return; + if (config2.name in cr().registry && !((_a2 = config2 == null ? void 0 : config2.gl) == null ? void 0 : _a2.getParameter(config2.gl.VERSION))) { + log("humangl error: backend invalid context"); + instance.models.reset(); + } + if (!Mie(config2.name)) { + try { + config2.canvas = canvas(100, 100); + } catch (err) { + log("humangl error: cannot create canvas:", err); + return; + } + try { + config2.gl = config2.canvas.getContext("webgl2", config2.webGLattr); + if (!config2.gl) { + log("humangl error: cannot get webgl context"); + return; + } + const glv2 = config2.gl.getParameter(config2.gl.VERSION).includes("2.0"); + if (!glv2) { + log("backend override: using fallback webgl backend as webgl 2.0 is not detected"); + instance.config.backend = "webgl"; + return; + } + if (config2.canvas) { + config2.canvas.addEventListener("webglcontextlost", (e) => { + log("humangl error:", e.type); + log("possible browser memory leak using webgl or conflict with multiple backend registrations"); + instance.emit("error"); + throw new Error("backend error: webgl context lost"); + }); + config2.canvas.addEventListener("webglcontextrestored", (e) => { + log("humangl error: context restored:", e); + }); + config2.canvas.addEventListener("webglcontextcreationerror", (e) => { + log("humangl error: context create:", e); + }); + } + } catch (err) { + log("humangl error: cannot get webgl context:", err); + return; + } + try { + MI(2, config2.gl); + } catch (err) { + log("humangl error: cannot set webgl context:", err); + return; + } + try { + const ctx = new Fu(config2.gl); + pi(config2.name, () => new Ni(ctx), config2.priority); + } catch (err) { + log("humangl error: cannot register webgl backend:", err); + return; + } + try { + const kernels = zm("webgl"); + kernels.forEach((kernelConfig) => { + const newKernelConfig = { ...kernelConfig, backendName: config2.name }; + ya(newKernelConfig); + }); + } catch (err) { + log("humangl error: cannot update webgl backend registration:", err); + return; + } + try { + if (P().flagRegistry.WEBGL_VERSION) + P().set("WEBGL_VERSION", 2); + } catch (err) { + log("humangl error: cannot set WebGL backend flags:", err); + return; + } + extensions(); + const backend = Bie(); + const current = typeof backend["gpgpu"] !== "undefined" ? backend["getGPGPUContext"]().gl : null; + if (current) { + if (instance.config.debug) + log("humangl backend registered:", { webgl: current.getParameter(current.VERSION), renderer: current.getParameter(current.RENDERER) }); + } else { + log("humangl error: no current gl context:", current, config2.gl); + } + } +} + +// src/tfjs/constants.ts +var constants = { + tf255: 255, + tf1: 1, + tf2: 2, + tf05: 0.5, + tf127: 127.5, + rgb: [0.2989, 0.587, 0.114] +}; +function init() { + constants.tf255 = be(255, "float32"); + constants.tf1 = be(1, "float32"); + constants.tf2 = be(2, "float32"); + constants.tf05 = be(0.5, "float32"); + constants.tf127 = be(127.5, "float32"); + constants.rgb = mr([0.2989, 0.587, 0.114], "float32"); +} + +// src/tfjs/backend.ts +async function getBestBackend() { + await env.updateBackend(); + if (!env.browser) + return "tensorflow"; + if (env.webgpu.supported && env.webgpu.backend) + return "webgpu"; + if (env.webgl.supported && env.webgl.backend) + return "webgl"; + if (env.wasm.supported && env.wasm.backend) + return "wasm"; + return "cpu"; +} +function registerCustomOps(config3) { + const newKernels = []; + if (!env.kernels.includes("mod")) { + const kernelMod = { + kernelName: "Mod", + backendName: Pie(), + kernelFunc: (op2) => Ne(() => ke(op2.inputs.a, oe(We(op2.inputs.a, op2.inputs.b), op2.inputs.b))) + }; + ya(kernelMod); + env.kernels.push("mod"); + newKernels.push("mod"); + } + if (!env.kernels.includes("floormod")) { + const kernelFloorMod = { + kernelName: "FloorMod", + backendName: Pie(), + kernelFunc: (op2) => Ne(() => ge(oe(cf(op2.inputs.a, op2.inputs.b), op2.inputs.b), jk(op2.inputs.a, op2.inputs.b))) + }; + ya(kernelFloorMod); + env.kernels.push("floormod"); + newKernels.push("floormod"); + } + if (!env.kernels.includes("rotatewithoffset") && config3.softwareKernels) { + const kernelRotateWithOffset = { + kernelName: "RotateWithOffset", + backendName: Pie(), + kernelFunc: (op2) => Ne(() => { + const backend = Pie(); + Fie("cpu"); + const t10 = zq.rotateWithOffset(op2.inputs.image, op2.attrs.radians, op2.attrs.fillValue, op2.attrs.center); + Fie(backend); + return t10; + }) + }; + ya(kernelRotateWithOffset); + env.kernels.push("rotatewithoffset"); + newKernels.push("rotatewithoffset"); + } + if (newKernels.length > 0 && config3.debug) + log("registered kernels:", newKernels); +} +var defaultFlags = {}; +async function check(instance, force = false) { + var _a2; + instance.state = "backend"; + if (((_a2 = instance.config.backend) == null ? void 0 : _a2.length) === 0) + instance.config.backend = await getBestBackend(); + if (force || env.initial || instance.config.backend && instance.config.backend.length > 0 && Pie() !== instance.config.backend) { + const timeStamp = now(); + if (instance.config.backend && instance.config.backend.length > 0) { + if (typeof window === "undefined" && typeof WorkerGlobalScope !== "undefined" && instance.config.debug) { + if (instance.config.debug) + log("running inside web worker"); + } + if (env.browser && instance.config.backend === "tensorflow") { + if (instance.config.debug) + log("override: backend set to tensorflow while running in browser"); + instance.config.backend = "webgl"; + } + if (env.node && (instance.config.backend === "webgl" || instance.config.backend === "humangl")) { + if (instance.config.debug) + log(`override: backend set to ${instance.config.backend} while running in nodejs`); + instance.config.backend = "tensorflow"; + } + if (env.browser && instance.config.backend === "webgpu") { + if (typeof navigator === "undefined" || typeof navigator.gpu === "undefined") { + log("override: backend set to webgpu but browser does not support webgpu"); + instance.config.backend = "webgl"; + } else { + const adapter = await navigator.gpu.requestAdapter(); + if (instance.config.debug) + log("enumerated webgpu adapter:", adapter); + if (!adapter) { + log("override: backend set to webgpu but browser reports no available gpu"); + instance.config.backend = "webgl"; + } else { + const adapterInfo = "requestAdapterInfo" in adapter ? await adapter.requestAdapterInfo() : void 0; + log("webgpu adapter info:", adapterInfo); + } + } + } + let available = Object.keys(cr().registryFactory); + if (instance.config.backend === "humangl" && !available.includes("humangl")) { + register(instance); + available = Object.keys(cr().registryFactory); + } + if (instance.config.debug) + log("available backends:", available); + if (!available.includes(instance.config.backend)) { + log(`error: backend ${instance.config.backend} not found in registry`); + instance.config.backend = env.node ? "tensorflow" : "webgl"; + if (instance.config.debug) + log(`override: setting backend ${instance.config.backend}`); + } + if (instance.config.debug) + log("setting backend:", [instance.config.backend]); + if (instance.config.backend === "wasm") { + if (P().flagRegistry.CANVAS2D_WILL_READ_FREQUENTLY) + P().set("CANVAS2D_WILL_READ_FREQUENTLY", true); + if (instance.config.debug) + log("wasm path:", instance.config.wasmPath); + if (typeof rte !== "undefined") + rte(instance.config.wasmPath, instance.config.wasmPlatformFetch); + else + throw new Error("backend error: attempting to use wasm backend but wasm path is not set"); + let mt2 = false; + let simd = false; + try { + mt2 = await P().getAsync("WASM_HAS_MULTITHREAD_SUPPORT"); + simd = await P().getAsync("WASM_HAS_SIMD_SUPPORT"); + if (instance.config.debug) + log(`wasm execution: ${simd ? "simd" : "no simd"} ${mt2 ? "multithreaded" : "singlethreaded"}`); + if (instance.config.debug && !simd) + log("warning: wasm simd support is not enabled"); + } catch (e) { + log("wasm detection failed"); + } + } + try { + await Fie(instance.config.backend); + await Die(); + } catch (err) { + log("error: cannot set backend:", instance.config.backend, err); + return false; + } + if (instance.config.debug) + defaultFlags = JSON.parse(JSON.stringify(P().flags)); + } + if (Pie() === "humangl" || Pie() === "webgl") { + if (P().flagRegistry.WEBGL_USE_SHAPES_UNIFORMS) + P().set("WEBGL_USE_SHAPES_UNIFORMS", true); + if (P().flagRegistry.WEBGL_EXP_CONV) + P().set("WEBGL_EXP_CONV", true); + if (instance.config.debug && typeof instance.config.deallocate !== "undefined" && instance.config.deallocate) { + log("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:", true); + P().set("WEBGL_DELETE_TEXTURE_THRESHOLD", 0); + } + } + if (Pie() === "webgpu") { + } + if (instance.config.debug) { + const newFlags = P().flags; + const updatedFlags = {}; + for (const key of Object.keys(newFlags)) { + if (defaultFlags[key] === newFlags[key]) + continue; + updatedFlags[key] = newFlags[key]; + } + if (instance.config.debug && Object.keys(updatedFlags).length > 0) + log("backend:", Pie(), "flags:", updatedFlags); + } + if (instance.config.flags && Object.keys(instance.config.flags).length > 0) { + if (instance.config.debug) + log("flags:", instance.config["flags"]); + for (const [key, val] of Object.entries(instance.config.flags)) { + P().set(key, val); + } + } + Tie(); + init(); + instance.performance.initBackend = Math.trunc(now() - timeStamp); + instance.config.backend = Pie(); + await env.updateBackend(); + registerCustomOps(instance.config); + env.initial = false; + } + return true; +} +function fakeOps(kernelNames, config3) { + for (const kernelName of kernelNames) { + const kernelConfig = { + kernelName, + backendName: config3.backend, + kernelFunc: (param) => { + var _a2; + if (config3.debug) + log("kernelFunc", kernelName, config3.backend, param); + return (_a2 = param == null ? void 0 : param.inputs) == null ? void 0 : _a2.info; + } + }; + ya(kernelConfig); + } + env.kernels = zm(Pie()).map((kernel) => kernel.kernelName.toLowerCase()); +} + +// src/draw/draw.ts +var draw_exports = {}; +__export(draw_exports, { + all: () => all, + body: () => body, + canvas: () => canvas2, + face: () => face, + gesture: () => gesture, + hand: () => hand, + init: () => init2, + object: () => object, + options: () => options2, + person: () => person +}); + +// src/draw/primitives.ts +var getCanvasContext = (input) => { + if (!input) + log("draw error: invalid canvas"); + else if (!input.getContext) + log("draw error: canvas context not defined"); + else { + const ctx = input.getContext("2d"); + if (!ctx) + log("draw error: cannot get canvas context"); + else + return ctx; + } + return null; +}; +var rad2deg = (theta) => Math.round(theta * 180 / Math.PI); +var replace = (str, source, target) => str.replace(source, typeof target === "number" ? target.toFixed(1) : target); +var colorDepth = (z10, opt) => { + if (!opt.useDepth || typeof z10 === "undefined") + return opt.color; + const rgb2 = Uint8ClampedArray.from([127 + 2 * z10, 127 - 2 * z10, 255]); + return `rgba(${rgb2[0]}, ${rgb2[1]}, ${rgb2[2]}, ${opt.alpha})`; +}; +function labels(ctx, str, startX, startY, localOptions2) { + const line = str.replace(/\[.*\]/g, "").split("\n").map((l) => l.trim()); + const x6 = Math.max(0, startX); + for (let i = line.length - 1; i >= 0; i--) { + const y = i * localOptions2.lineHeight + startY; + if (localOptions2.shadowColor && localOptions2.shadowColor !== "") { + ctx.fillStyle = localOptions2.shadowColor; + ctx.fillText(line[i], x6 + 5, y + 16); + } + ctx.fillStyle = localOptions2.labelColor; + ctx.fillText(line[i], x6 + 4, y + 15); + } +} +function point(ctx, x6, y, z10, localOptions2) { + ctx.fillStyle = colorDepth(z10, localOptions2); + ctx.beginPath(); + ctx.arc(x6, y, localOptions2.pointSize, 0, 2 * Math.PI); + ctx.fill(); +} +function rect(ctx, x6, y, width, height, localOptions2) { + ctx.beginPath(); + ctx.lineWidth = localOptions2.lineWidth; + if (localOptions2.useCurves) { + const cx2 = (x6 + x6 + width) / 2; + const cy = (y + y + height) / 2; + ctx.ellipse(cx2, cy, width / 2, height / 2, 0, 0, 2 * Math.PI); + } else { + ctx.moveTo(x6 + localOptions2.roundRect, y); + ctx.lineTo(x6 + width - localOptions2.roundRect, y); + ctx.quadraticCurveTo(x6 + width, y, x6 + width, y + localOptions2.roundRect); + ctx.lineTo(x6 + width, y + height - localOptions2.roundRect); + ctx.quadraticCurveTo(x6 + width, y + height, x6 + width - localOptions2.roundRect, y + height); + ctx.lineTo(x6 + localOptions2.roundRect, y + height); + ctx.quadraticCurveTo(x6, y + height, x6, y + height - localOptions2.roundRect); + ctx.lineTo(x6, y + localOptions2.roundRect); + ctx.quadraticCurveTo(x6, y, x6 + localOptions2.roundRect, y); + ctx.closePath(); + } + ctx.stroke(); +} +function lines(ctx, points, localOptions2) { + if (points.length < 2) + return; + ctx.beginPath(); + ctx.moveTo(points[0][0], points[0][1]); + for (const pt of points) { + ctx.strokeStyle = colorDepth(pt[2] || 0, localOptions2); + ctx.lineTo(Math.trunc(pt[0]), Math.trunc(pt[1])); + } + ctx.stroke(); + if (localOptions2.fillPolygons) { + ctx.closePath(); + ctx.fill(); + } +} +function curves(ctx, points, localOptions2) { + if (points.length < 2) + return; + ctx.lineWidth = localOptions2.lineWidth; + if (!localOptions2.useCurves || points.length <= 2) { + lines(ctx, points, localOptions2); + return; + } + ctx.moveTo(points[0][0], points[0][1]); + for (let i = 0; i < points.length - 2; i++) { + const xc2 = (points[i][0] + points[i + 1][0]) / 2; + const yc2 = (points[i][1] + points[i + 1][1]) / 2; + ctx.quadraticCurveTo(points[i][0], points[i][1], xc2, yc2); + } + 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 (localOptions2.fillPolygons) { + ctx.closePath(); + ctx.fill(); + } +} +function arrow(ctx, from, to2, radius = 5) { + let angle; + let x6; + let y; + ctx.beginPath(); + ctx.moveTo(from[0], from[1]); + ctx.lineTo(to2[0], to2[1]); + angle = Math.atan2(to2[1] - from[1], to2[0] - from[0]); + x6 = radius * Math.cos(angle) + to2[0]; + y = radius * Math.sin(angle) + to2[1]; + ctx.moveTo(x6, y); + angle += 1 / 3 * (2 * Math.PI); + x6 = radius * Math.cos(angle) + to2[0]; + y = radius * Math.sin(angle) + to2[1]; + ctx.lineTo(x6, y); + angle += 1 / 3 * (2 * Math.PI); + x6 = radius * Math.cos(angle) + to2[0]; + y = radius * Math.sin(angle) + to2[1]; + ctx.lineTo(x6, y); + ctx.closePath(); + ctx.stroke(); + ctx.fill(); +} + +// src/draw/options.ts +var options2 = { + color: "rgba(173, 216, 230, 0.6)", + labelColor: "rgba(173, 216, 230, 1)", + shadowColor: "black", + alpha: 0.5, + font: 'small-caps 16px "Segoe UI"', + lineHeight: 18, + lineWidth: 4, + pointSize: 2, + roundRect: 8, + drawPoints: false, + drawLabels: true, + drawBoxes: true, + drawAttention: true, + drawGestures: true, + drawPolygons: true, + drawGaze: true, + fillPolygons: false, + useDepth: true, + useCurves: false, + faceLabels: "", + bodyLabels: "", + bodyPartLabels: "", + objectLabels: "", + handLabels: "", + fingerLabels: "", + gestureLabels: "" +}; + +// src/face/facemeshcoords.ts +var meshAnnotations = { + 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: [185, 40, 39, 37, 0, 267, 269, 270, 409], + lipsLowerOuter: [61, 146, 91, 181, 84, 17, 314, 405, 321, 375, 291], + lipsUpperInner: [191, 80, 81, 82, 13, 312, 311, 310, 415], + lipsLowerInner: [78, 95, 88, 178, 87, 14, 317, 402, 318, 324, 308], + lipsLowerSemiOuter: [76, 77, 90, 180, 85, 16, 315, 404, 320, 307, 306], + lipsUpperSemiOuter: [184, 74, 73, 72, 11, 302, 303, 304, 408], + lipsLowerSemiInner: [62, 96, 89, 179, 86, 15, 316, 403, 319, 325, 292], + lipsUpperSemiInner: [183, 42, 41, 38, 12, 268, 271, 272, 407], + 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 meshLandmarks = { + count: 468, + mouth: 13, + symmetryLine: [13, meshAnnotations.midwayBetweenEyes[0]] +}; +var blazeFaceLandmarks = { + leftEye: 0, + rightEye: 1, + nose: 2, + mouth: 3, + leftEar: 4, + rightEar: 5, + symmetryLine: [3, 2] +}; +var irisIndices = [ + { 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] }, + { key: "EyebrowUpper", indices: [63, 64, 65, 66, 67, 68, 69, 70] }, + { key: "EyebrowLower", indices: [48, 49, 50, 51, 52, 53] } +]; +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((x6) => UV468[x6]); +var UV33 = VTX33.map((x6) => UV468[x6]); +var UV7 = VTX7.map((x6) => UV468[x6]); +function connectionsToIndices(connections) { + const indices = connections.map((connection) => connection[0]); + indices.push(connections[connections.length - 1][1]); + return indices; +} +var pairsLips = [ + [61, 146], + [146, 91], + [91, 181], + [181, 84], + [84, 17], + [17, 314], + [314, 405], + [405, 321], + [321, 375], + [375, 291], + [61, 185], + [185, 40], + [40, 39], + [39, 37], + [37, 0], + [0, 267], + [267, 269], + [269, 270], + [270, 409], + [409, 291], + [78, 95], + [95, 88], + [88, 178], + [178, 87], + [87, 14], + [14, 317], + [317, 402], + [402, 318], + [318, 324], + [324, 308], + [78, 191], + [191, 80], + [80, 81], + [81, 82], + [82, 13], + [13, 312], + [312, 311], + [311, 310], + [310, 415], + [415, 308] +]; +var pairsLeftEye = [[263, 249], [249, 390], [390, 373], [373, 374], [374, 380], [380, 381], [381, 382], [382, 362], [263, 466], [466, 388], [388, 387], [387, 386], [386, 385], [385, 384], [384, 398], [398, 362]]; +var pairsLeftEyebrow = [[276, 283], [283, 282], [282, 295], [295, 285], [300, 293], [293, 334], [334, 296], [296, 336]]; +var pairsLeftIris = [[474, 475], [475, 476], [476, 477], [477, 474]]; +var pairsRightEye = [[33, 7], [7, 163], [163, 144], [144, 145], [145, 153], [153, 154], [154, 155], [155, 133], [33, 246], [246, 161], [161, 160], [160, 159], [159, 158], [158, 157], [157, 173], [173, 133]]; +var pairsRightEyebrow = [[46, 53], [53, 52], [52, 65], [65, 55], [70, 63], [63, 105], [105, 66], [66, 107]]; +var pairsRightIris = [[469, 470], [470, 471], [471, 472], [472, 469]]; +var pairsFaceContour = [ + [10, 338], + [338, 297], + [297, 332], + [332, 284], + [284, 251], + [251, 389], + [389, 356], + [356, 454], + [454, 323], + [323, 361], + [361, 288], + [288, 397], + [397, 365], + [365, 379], + [379, 378], + [378, 400], + [400, 377], + [377, 152], + [152, 148], + [148, 176], + [176, 149], + [149, 150], + [150, 136], + [136, 172], + [172, 58], + [58, 132], + [132, 93], + [93, 234], + [234, 127], + [127, 162], + [162, 21], + [21, 54], + [54, 103], + [103, 67], + [67, 109], + [109, 10] +]; +var contourKeypoints = { + lips: connectionsToIndices(pairsLips), + leftEye: connectionsToIndices(pairsLeftEye), + leftEyebrow: connectionsToIndices(pairsLeftEyebrow), + leftIris: connectionsToIndices(pairsLeftIris), + rightEye: connectionsToIndices(pairsRightEye), + rightEyebrow: connectionsToIndices(pairsRightEyebrow), + rightIris: connectionsToIndices(pairsRightIris), + faceOval: connectionsToIndices(pairsFaceContour) +}; + +// src/face/constants.ts +var LIPS_CONNECTIONS = [ + [61, 146], + [146, 91], + [91, 181], + [181, 84], + [84, 17], + [17, 314], + [314, 405], + [405, 321], + [321, 375], + [375, 291], + [61, 185], + [185, 40], + [40, 39], + [39, 37], + [37, 0], + [0, 267], + [267, 269], + [269, 270], + [270, 409], + [409, 291], + [78, 95], + [95, 88], + [88, 178], + [178, 87], + [87, 14], + [14, 317], + [317, 402], + [402, 318], + [318, 324], + [324, 308], + [78, 191], + [191, 80], + [80, 81], + [81, 82], + [82, 13], + [13, 312], + [312, 311], + [311, 310], + [310, 415], + [415, 308] +]; +var LEFT_EYE_CONNECTIONS = [[263, 249], [249, 390], [390, 373], [373, 374], [374, 380], [380, 381], [381, 382], [382, 362], [263, 466], [466, 388], [388, 387], [387, 386], [386, 385], [385, 384], [384, 398], [398, 362]]; +var LEFT_EYEBROW_CONNECTIONS = [[276, 283], [283, 282], [282, 295], [295, 285], [300, 293], [293, 334], [334, 296], [296, 336]]; +var LEFT_IRIS_CONNECTIONS = [[474, 475], [475, 476], [476, 477], [477, 474]]; +var RIGHT_EYE_CONNECTIONS = [[33, 7], [7, 163], [163, 144], [144, 145], [145, 153], [153, 154], [154, 155], [155, 133], [33, 246], [246, 161], [161, 160], [160, 159], [159, 158], [158, 157], [157, 173], [173, 133]]; +var RIGHT_EYEBROW_CONNECTIONS = [[46, 53], [53, 52], [52, 65], [65, 55], [70, 63], [63, 105], [105, 66], [66, 107]]; +var RIGHT_IRIS_CONNECTIONS = [[469, 470], [470, 471], [471, 472], [472, 469]]; +var FACE_OVAL_CONNECTIONS = [ + [10, 338], + [338, 297], + [297, 332], + [332, 284], + [284, 251], + [251, 389], + [389, 356], + [356, 454], + [454, 323], + [323, 361], + [361, 288], + [288, 397], + [397, 365], + [365, 379], + [379, 378], + [378, 400], + [400, 377], + [377, 152], + [152, 148], + [148, 176], + [176, 149], + [149, 150], + [150, 136], + [136, 172], + [172, 58], + [58, 132], + [132, 93], + [93, 234], + [234, 127], + [127, 162], + [162, 21], + [21, 54], + [54, 103], + [103, 67], + [67, 109], + [109, 10] +]; +function connectionsToIndices2(connections) { + const indices = connections.map((connection) => connection[0]); + indices.push(connections[connections.length - 1][1]); + return indices; +} +var MEDIAPIPE_FACE_MESH_KEYPOINTS_BY_CONTOUR = { + lips: connectionsToIndices2(LIPS_CONNECTIONS), + leftEye: connectionsToIndices2(LEFT_EYE_CONNECTIONS), + leftEyebrow: connectionsToIndices2(LEFT_EYEBROW_CONNECTIONS), + leftIris: connectionsToIndices2(LEFT_IRIS_CONNECTIONS), + rightEye: connectionsToIndices2(RIGHT_EYE_CONNECTIONS), + rightEyebrow: connectionsToIndices2(RIGHT_EYEBROW_CONNECTIONS), + rightIris: connectionsToIndices2(RIGHT_IRIS_CONNECTIONS), + faceOval: connectionsToIndices2(FACE_OVAL_CONNECTIONS) +}; +var indexLabelPairs = Object.entries(MEDIAPIPE_FACE_MESH_KEYPOINTS_BY_CONTOUR).map(([label, indices]) => indices.map((index2) => [index2, label])).flat(); +var MEDIAPIPE_FACE_MESH_KEYPOINTS = new Map(indexLabelPairs); +var LANDMARKS_REFINEMENT_LIPS_CONFIG = [ + 61, + 146, + 91, + 181, + 84, + 17, + 314, + 405, + 321, + 375, + 291, + 185, + 40, + 39, + 37, + 0, + 267, + 269, + 270, + 409, + 78, + 95, + 88, + 178, + 87, + 14, + 317, + 402, + 318, + 324, + 308, + 191, + 80, + 81, + 82, + 13, + 312, + 311, + 310, + 415, + 76, + 77, + 90, + 180, + 85, + 16, + 315, + 404, + 320, + 307, + 306, + 184, + 74, + 73, + 72, + 11, + 302, + 303, + 304, + 408, + 62, + 96, + 89, + 179, + 86, + 15, + 316, + 403, + 319, + 325, + 292, + 183, + 42, + 41, + 38, + 12, + 268, + 271, + 272, + 407 +]; +var LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG = [ + 33, + 7, + 163, + 144, + 145, + 153, + 154, + 155, + 133, + 246, + 161, + 160, + 159, + 158, + 157, + 173, + 130, + 25, + 110, + 24, + 23, + 22, + 26, + 112, + 243, + 247, + 30, + 29, + 27, + 28, + 56, + 190, + 226, + 31, + 228, + 229, + 230, + 231, + 232, + 233, + 244, + 113, + 225, + 224, + 223, + 222, + 221, + 189, + 35, + 124, + 46, + 53, + 52, + 65, + 143, + 111, + 117, + 118, + 119, + 120, + 121, + 128, + 245, + 156, + 70, + 63, + 105, + 66, + 107, + 55, + 193 +]; +var LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG = [ + 263, + 249, + 390, + 373, + 374, + 380, + 381, + 382, + 362, + 466, + 388, + 387, + 386, + 385, + 384, + 398, + 359, + 255, + 339, + 254, + 253, + 252, + 256, + 341, + 463, + 467, + 260, + 259, + 257, + 258, + 286, + 414, + 446, + 261, + 448, + 449, + 450, + 451, + 452, + 453, + 464, + 342, + 445, + 444, + 443, + 442, + 441, + 413, + 265, + 353, + 276, + 283, + 282, + 295, + 372, + 340, + 346, + 347, + 348, + 349, + 350, + 357, + 465, + 383, + 300, + 293, + 334, + 296, + 336, + 285, + 417 +]; + +// src/draw/face.ts +var localOptions; +function drawLabels(f, ctx) { + var _a2, _b, _c2, _d2, _e2, _f2, _g2, _h2, _i2; + if (!localOptions.drawLabels || ((_a2 = localOptions.faceLabels) == null ? void 0 : _a2.length) === 0) + return; + let l = localOptions.faceLabels.slice(); + if (f.score) + l = replace(l, "[score]", 100 * f.score); + if (f.gender) + l = replace(l, "[gender]", f.gender); + if (f.genderScore) + l = replace(l, "[genderScore]", 100 * f.genderScore); + if (f.age) + l = replace(l, "[age]", f.age); + if (f.distance) + l = replace(l, "[distance]", 100 * f.distance); + if (f.real) + l = replace(l, "[real]", 100 * f.real); + if (f.live) + l = replace(l, "[live]", 100 * f.live); + if (f.emotion && f.emotion.length > 0) { + const emotion2 = f.emotion.map((a) => `${Math.trunc(100 * a.score)}% ${a.emotion}`); + if (emotion2.length > 3) + emotion2.length = 3; + l = replace(l, "[emotions]", emotion2.join(" ")); + } + if ((_c2 = (_b = f.rotation) == null ? void 0 : _b.angle) == null ? void 0 : _c2.roll) + l = replace(l, "[roll]", rad2deg(f.rotation.angle.roll)); + if ((_e2 = (_d2 = f.rotation) == null ? void 0 : _d2.angle) == null ? void 0 : _e2.yaw) + l = replace(l, "[yaw]", rad2deg(f.rotation.angle.yaw)); + if ((_g2 = (_f2 = f.rotation) == null ? void 0 : _f2.angle) == null ? void 0 : _g2.pitch) + l = replace(l, "[pitch]", rad2deg(f.rotation.angle.pitch)); + if ((_i2 = (_h2 = f.rotation) == null ? void 0 : _h2.gaze) == null ? void 0 : _i2.bearing) + l = replace(l, "[gaze]", rad2deg(f.rotation.gaze.bearing)); + labels(ctx, l, f.box[0], f.box[1], localOptions); +} +function drawIrisElipse(f, ctx) { + var _a2, _b, _c2, _d2; + if (((_a2 = f.annotations) == null ? void 0 : _a2.leftEyeIris) && ((_b = f.annotations) == null ? void 0 : _b.leftEyeIris[0])) { + 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 (((_c2 = f.annotations) == null ? void 0 : _c2.rightEyeIris) && ((_d2 = f.annotations) == null ? void 0 : _d2.rightEyeIris[0])) { + 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(); + } + } +} +function drawGazeSpheres(f, ctx) { + var _a2; + if (localOptions.drawGaze && ((_a2 = f.rotation) == null ? void 0 : _a2.angle) && typeof Path2D !== "undefined") { + ctx.strokeStyle = "pink"; + const valX = f.box[0] + f.box[2] / 2 - f.box[3] * rad2deg(f.rotation.angle.yaw) / 90; + const valY = f.box[1] + f.box[3] / 2 + f.box[2] * rad2deg(f.rotation.angle.pitch) / 90; + const pathV = new Path2D(` + M ${f.box[0] + f.box[2] / 2} ${f.box[1]} + C + ${valX} ${f.box[1]}, + ${valX} ${f.box[1] + f.box[3]}, + ${f.box[0] + f.box[2] / 2} ${f.box[1] + f.box[3]} + `); + const pathH = new Path2D(` + M ${f.box[0]} ${f.box[1] + f.box[3] / 2} + C + ${f.box[0]} ${valY}, + ${f.box[0] + f.box[2]} ${valY}, + ${f.box[0] + f.box[2]} ${f.box[1] + f.box[3] / 2} + `); + ctx.stroke(pathH); + ctx.stroke(pathV); + } +} +function drawGazeArrows(f, ctx) { + var _a2; + if (localOptions.drawGaze && ((_a2 = f.rotation) == null ? void 0 : _a2.gaze.strength) && f.rotation.gaze.bearing && f.annotations.leftEyeIris && f.annotations.rightEyeIris && f.annotations.leftEyeIris[0] && f.annotations.rightEyeIris[0]) { + ctx.strokeStyle = "pink"; + ctx.fillStyle = "pink"; + const leftGaze = [ + f.annotations.leftEyeIris[0][0] + Math.sin(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[3], + f.annotations.leftEyeIris[0][1] + Math.cos(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[2] + ]; + arrow(ctx, [f.annotations.leftEyeIris[0][0], f.annotations.leftEyeIris[0][1]], [leftGaze[0], leftGaze[1]], 4); + const rightGaze = [ + f.annotations.rightEyeIris[0][0] + Math.sin(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[3], + f.annotations.rightEyeIris[0][1] + Math.cos(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[2] + ]; + arrow(ctx, [f.annotations.rightEyeIris[0][0], f.annotations.rightEyeIris[0][1]], [rightGaze[0], rightGaze[1]], 4); + } +} +function drawFacePolygons(f, ctx) { + if (localOptions.drawPolygons && f.mesh.length >= 468) { + 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((index2) => f.mesh[index2]); + lines(ctx, points, localOptions); + } + drawIrisElipse(f, ctx); + } +} +function drawFacePoints(f, ctx) { + if (localOptions.drawPoints && f.mesh.length >= 468) { + for (let i = 0; i < f.mesh.length; i++) { + point(ctx, f.mesh[i][0], f.mesh[i][1], f.mesh[i][2], localOptions); + if (localOptions.drawAttention) { + if (LANDMARKS_REFINEMENT_LIPS_CONFIG.includes(i)) + point(ctx, f.mesh[i][0], f.mesh[i][1], f.mesh[i][2] + 127, localOptions); + if (LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG.includes(i)) + point(ctx, f.mesh[i][0], f.mesh[i][1], f.mesh[i][2] - 127, localOptions); + if (LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG.includes(i)) + point(ctx, f.mesh[i][0], f.mesh[i][1], f.mesh[i][2] - 127, localOptions); + } + } + } +} +function drawFaceBoxes(f, ctx) { + if (localOptions.drawBoxes) { + rect(ctx, f.box[0], f.box[1], f.box[2], f.box[3], localOptions); + } +} +function face(inCanvas2, result, drawOptions) { + localOptions = mergeDeep(options2, drawOptions); + if (!result || !inCanvas2) + return; + const ctx = getCanvasContext(inCanvas2); + if (!ctx) + return; + ctx.font = localOptions.font; + ctx.strokeStyle = localOptions.color; + ctx.fillStyle = localOptions.color; + for (const f of result) { + drawFaceBoxes(f, ctx); + drawLabels(f, ctx); + if (f.mesh && f.mesh.length > 0) { + drawFacePoints(f, ctx); + drawFacePolygons(f, ctx); + drawGazeSpheres(f, ctx); + drawGazeArrows(f, ctx); + } + } +} + +// src/draw/body.ts +function body(inCanvas2, result, drawOptions) { + var _a2, _b; + const localOptions2 = mergeDeep(options2, drawOptions); + if (!result || !inCanvas2) + return; + const ctx = getCanvasContext(inCanvas2); + if (!ctx) + return; + ctx.lineJoin = "round"; + for (let i = 0; i < result.length; i++) { + ctx.strokeStyle = localOptions2.color; + ctx.fillStyle = localOptions2.color; + ctx.lineWidth = localOptions2.lineWidth; + ctx.font = localOptions2.font; + if (localOptions2.drawBoxes && result[i].box && result[i].box.length === 4) { + rect(ctx, result[i].box[0], result[i].box[1], result[i].box[2], result[i].box[3], localOptions2); + if (localOptions2.drawLabels && ((_a2 = localOptions2.bodyLabels) == null ? void 0 : _a2.length) > 0) { + let l = localOptions2.bodyLabels.slice(); + l = replace(l, "[score]", 100 * result[i].score); + labels(ctx, l, result[i].box[0], result[i].box[1], localOptions2); + } + } + if (localOptions2.drawPoints && result[i].keypoints) { + for (let pt = 0; pt < result[i].keypoints.length; pt++) { + if (!result[i].keypoints[pt].score || result[i].keypoints[pt].score === 0) + continue; + ctx.fillStyle = colorDepth(result[i].keypoints[pt].position[2], localOptions2); + point(ctx, result[i].keypoints[pt].position[0], result[i].keypoints[pt].position[1], 0, localOptions2); + } + } + if (localOptions2.drawLabels && ((_b = localOptions2.bodyPartLabels) == null ? void 0 : _b.length) > 0 && result[i].keypoints) { + ctx.font = localOptions2.font; + for (const pt of result[i].keypoints) { + if (!pt.score || pt.score === 0) + continue; + let l = localOptions2.bodyPartLabels.slice(); + l = replace(l, "[label]", pt.part); + l = replace(l, "[score]", 100 * pt.score); + labels(ctx, l, pt.position[0], pt.position[1], localOptions2); + } + } + if (localOptions2.drawPolygons && result[i].keypoints && result[i].annotations) { + for (const part of Object.values(result[i].annotations)) { + for (const connected4 of part) + curves(ctx, connected4, localOptions2); + } + } + } +} + +// src/draw/hand.ts +function hand(inCanvas2, result, drawOptions) { + var _a2, _b; + const localOptions2 = mergeDeep(options2, drawOptions); + if (!result || !inCanvas2) + return; + const ctx = getCanvasContext(inCanvas2); + if (!ctx) + return; + ctx.lineJoin = "round"; + ctx.font = localOptions2.font; + for (const h of result) { + if (localOptions2.drawBoxes) { + ctx.strokeStyle = localOptions2.color; + ctx.fillStyle = localOptions2.color; + rect(ctx, h.box[0], h.box[1], h.box[2], h.box[3], localOptions2); + if (localOptions2.drawLabels && ((_a2 = localOptions2.handLabels) == null ? void 0 : _a2.length) > 0) { + let l = localOptions2.handLabels.slice(); + l = replace(l, "[label]", h.label); + l = replace(l, "[score]", 100 * h.score); + labels(ctx, l, h.box[0], h.box[1], localOptions2); + } + ctx.stroke(); + } + if (localOptions2.drawPoints) { + if (h.keypoints && h.keypoints.length > 0) { + for (const pt of h.keypoints) { + ctx.fillStyle = colorDepth(pt[2], localOptions2); + point(ctx, pt[0], pt[1], 0, localOptions2); + } + } + } + if (localOptions2.drawLabels && h.annotations && ((_b = localOptions2.fingerLabels) == null ? void 0 : _b.length) > 0) { + for (const [part, pt] of Object.entries(h.annotations)) { + let l = localOptions2.fingerLabels.slice(); + l = replace(l, "[label]", part); + labels(ctx, l, pt[pt.length - 1][0], pt[pt.length - 1][1], localOptions2); + } + } + if (localOptions2.drawPolygons && h.annotations) { + const addHandLine = (part) => { + if (!part || part.length === 0 || !part[0]) + return; + for (let i = 0; i < part.length; i++) { + ctx.beginPath(); + const z10 = part[i][2] || 0; + ctx.strokeStyle = colorDepth(i * z10, localOptions2); + 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 = localOptions2.lineWidth; + addHandLine(h.annotations.index); + addHandLine(h.annotations.middle); + addHandLine(h.annotations.ring); + addHandLine(h.annotations.pinky); + addHandLine(h.annotations.thumb); + } + } +} + +// src/draw/object.ts +function object(inCanvas2, result, drawOptions) { + var _a2; + const localOptions2 = mergeDeep(options2, drawOptions); + if (!result || !inCanvas2) + return; + const ctx = getCanvasContext(inCanvas2); + if (!ctx) + return; + ctx.lineJoin = "round"; + ctx.font = localOptions2.font; + for (const h of result) { + if (localOptions2.drawBoxes) { + ctx.strokeStyle = localOptions2.color; + ctx.fillStyle = localOptions2.color; + rect(ctx, h.box[0], h.box[1], h.box[2], h.box[3], localOptions2); + if (localOptions2.drawLabels && ((_a2 = localOptions2.objectLabels) == null ? void 0 : _a2.length) > 0) { + let l = localOptions2.objectLabels.slice(); + l = replace(l, "[label]", h.label); + l = replace(l, "[score]", 100 * h.score); + labels(ctx, l, h.box[0], h.box[1], localOptions2); + } + ctx.stroke(); + } + } +} + +// src/draw/gesture.ts +function gesture(inCanvas2, result, drawOptions) { + var _a2; + const localOptions2 = mergeDeep(options2, drawOptions); + if (!result || !inCanvas2) + return; + if (localOptions2.drawGestures && ((_a2 = localOptions2.gestureLabels) == null ? void 0 : _a2.length) > 0) { + const ctx = getCanvasContext(inCanvas2); + if (!ctx) + return; + ctx.font = localOptions2.font; + ctx.fillStyle = localOptions2.color; + let i = 1; + for (let j = 0; j < result.length; j++) { + const [where, what] = Object.entries(result[j]); + if (what.length > 1 && what[1].length > 0) { + const who = where[1] > 0 ? `#${where[1]}` : ""; + let l = localOptions2.gestureLabels.slice(); + l = replace(l, "[where]", where[0]); + l = replace(l, "[who]", who); + l = replace(l, "[what]", what[1]); + labels(ctx, l, 8, 2 + i * localOptions2.lineHeight, localOptions2); + i += 1; + } + } + } +} + +// src/draw/labels.ts +var defaultLabels = { + face: `face + confidence: [score]% + [gender] [genderScore]% + age: [age] years + distance: [distance]cm + real: [real]% + live: [live]% + [emotions] + roll: [roll]\xB0 yaw:[yaw]\xB0 pitch:[pitch]\xB0 + gaze: [gaze]\xB0`, + body: "body [score]%", + bodyPart: "[label] [score]%", + object: "[label] [score]%", + hand: "[label] [score]%", + finger: "[label]", + gesture: "[where] [who]: [what]" +}; + +// src/draw/draw.ts +var drawTime = 0; +function person(inCanvas2, result, drawOptions) { + const localOptions2 = mergeDeep(options2, drawOptions); + if (!result || !inCanvas2) + return; + const ctx = getCanvasContext(inCanvas2); + if (!ctx) + return; + ctx.lineJoin = "round"; + ctx.font = localOptions2.font; + for (let i = 0; i < result.length; i++) { + if (localOptions2.drawBoxes) { + ctx.strokeStyle = localOptions2.color; + ctx.fillStyle = localOptions2.color; + rect(ctx, result[i].box[0], result[i].box[1], result[i].box[2], result[i].box[3], localOptions2); + if (localOptions2.drawLabels) { + const label = `person #${i}`; + if (localOptions2.shadowColor && localOptions2.shadowColor !== "") { + ctx.fillStyle = localOptions2.shadowColor; + ctx.fillText(label, result[i].box[0] + 3, 1 + result[i].box[1] + localOptions2.lineHeight, result[i].box[2]); + } + ctx.fillStyle = localOptions2.labelColor; + ctx.fillText(label, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions2.lineHeight, result[i].box[2]); + } + ctx.stroke(); + } + } +} +function canvas2(input, output) { + if (!input || !output) + return; + const ctx = getCanvasContext(output); + if (!ctx) + return; + ctx.drawImage(input, 0, 0); +} +async function all(inCanvas2, result, drawOptions) { + if (!(result == null ? void 0 : result.performance) || !inCanvas2) + return null; + const timeStamp = now(); + const localOptions2 = mergeDeep(options2, drawOptions); + const promise = Promise.all([ + face(inCanvas2, result.face, localOptions2), + body(inCanvas2, result.body, localOptions2), + hand(inCanvas2, result.hand, localOptions2), + object(inCanvas2, result.object, localOptions2), + gesture(inCanvas2, result.gesture, localOptions2) + ]); + drawTime = env.perfadd ? drawTime + Math.round(now() - timeStamp) : Math.round(now() - timeStamp); + result.performance.draw = drawTime; + return promise; +} +function init2() { + options2.faceLabels = defaultLabels.face; + options2.bodyLabels = defaultLabels.body; + options2.bodyPartLabels = defaultLabels.bodyPart; + options2.handLabels = defaultLabels.hand; + options2.fingerLabels = defaultLabels.finger; + options2.objectLabels = defaultLabels.object; + options2.gestureLabels = defaultLabels.gesture; +} + +// src/body/blazeposecoords.ts +var blazeposecoords_exports = {}; +__export(blazeposecoords_exports, { + connected: () => connected, + kpt: () => kpt +}); +var kpt = [ + "nose", + "leftEyeInside", + "leftEye", + "leftEyeOutside", + "rightEyeInside", + "rightEye", + "rightEyeOutside", + "leftEar", + "rightEar", + "leftMouth", + "rightMouth", + "leftShoulder", + "rightShoulder", + "leftElbow", + "rightElbow", + "leftWrist", + "rightWrist", + "leftPinky", + "rightPinky", + "leftIndex", + "rightIndex", + "leftThumb", + "rightThumb", + "leftHip", + "rightHip", + "leftKnee", + "rightKnee", + "leftAnkle", + "rightAnkle", + "leftHeel", + "rightHeel", + "leftFoot", + "rightFoot", + "bodyCenter", + "bodyTop", + "leftPalm", + "leftHand", + "rightPalm", + "rightHand" +]; +var connected = { + shoulders: ["leftShoulder", "rightShoulder"], + hips: ["rightHip", "leftHip"], + mouth: ["leftMouth", "rightMouth"], + leftLegUpper: ["leftHip", "leftKnee"], + leftLegLower: ["leftKnee", "leftAnkle"], + leftFoot: ["leftAnkle", "leftHeel", "leftFoot"], + leftTorso: ["leftShoulder", "leftHip"], + leftArmUpper: ["leftShoulder", "leftElbow"], + leftArmLower: ["leftElbow", "leftWrist"], + leftHand: ["leftWrist", "leftPalm"], + leftHandPinky: ["leftPalm", "leftPinky"], + leftHandIndex: ["leftPalm", "leftIndex"], + leftHandThumb: ["leftPalm", "leftThumb"], + leftEyeOutline: ["leftEyeInside", "leftEyeOutside"], + rightLegUpper: ["rightHip", "rightKnee"], + rightLegLower: ["rightKnee", "rightAnkle"], + rightFoot: ["rightAnkle", "rightHeel", "rightFoot"], + rightTorso: ["rightShoulder", "rightHip"], + rightArmUpper: ["rightShoulder", "rightElbow"], + rightArmLower: ["rightElbow", "rightWrist"], + rightHand: ["rightWrist", "rightPalm"], + rightHandPinky: ["rightPalm", "rightPinky"], + rightHandIndex: ["rightPalm", "rightIndex"], + rightHandThumb: ["rightPalm", "rightThumb"], + rightEyeOutline: ["rightEyeInside", "rightEyeOutside"] +}; + +// src/body/blazeposedetector.ts +var model; +var inputSize = 224; +var anchorTensor; +var numLayers = 5; +var strides = [8, 16, 32, 32, 32]; +function createAnchors() { + const anchors3 = []; + let layerId = 0; + while (layerId < numLayers) { + let anchorCount = 0; + let lastSameStrideLayer = layerId; + while (lastSameStrideLayer < strides.length && strides[lastSameStrideLayer] === strides[layerId]) { + anchorCount += 2; + lastSameStrideLayer++; + } + const stride = strides[layerId]; + const featureMapHeight = Math.ceil(inputSize / stride); + const featureMapWidth = Math.ceil(inputSize / stride); + for (let y = 0; y < featureMapHeight; ++y) { + for (let x6 = 0; x6 < featureMapWidth; ++x6) { + for (let anchorId = 0; anchorId < anchorCount; ++anchorId) { + anchors3.push({ x: (x6 + 0.5) / featureMapWidth, y: (y + 0.5) / featureMapHeight }); + } + } + } + layerId = lastSameStrideLayer; + } + anchorTensor = { x: mr(anchors3.map((a) => a.x)), y: mr(anchors3.map((a) => a.y)) }; +} +async function loadDetector(config3) { + if (env.initial) + model = null; + if (!model && config3.body["detector"] && config3.body["detector"].modelPath || "") { + model = await loadModel(config3.body["detector"].modelPath); + const inputs = (model == null ? void 0 : model["executor"]) ? Object.values(model.modelSignature["inputs"]) : void 0; + inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0; + } else if (config3.debug && model) + log("cached model:", model["modelUrl"]); + createAnchors(); + return model; +} +var cropFactor = [5, 5]; +function decodeBoxes(boxesTensor, anchor) { + return Ne(() => { + const split = $a(boxesTensor, 12, 1); + let xCenter = jp(split[0]); + let yCenter = jp(split[1]); + let width = jp(split[2]); + let height = jp(split[3]); + xCenter = ge(We(xCenter, inputSize), anchor.x); + yCenter = ge(We(yCenter, inputSize), anchor.y); + width = oe(We(width, inputSize), cropFactor[0]); + height = oe(We(height, inputSize), cropFactor[1]); + const xMin = ke(xCenter, We(width, 2)); + const yMin = ke(yCenter, We(height, 2)); + const xMax = ge(xMin, width); + const yMax = ge(yMin, height); + const boxes = Ir([xMin, yMin, xMax, yMax], 1); + return boxes; + }); +} +async function decodeResults(boxesTensor, logitsTensor, config3, outputSize2) { + var _a2, _b; + const detectedBoxes = []; + const t10 = {}; + t10.boxes = decodeBoxes(boxesTensor, anchorTensor); + t10.scores = Ms(logitsTensor); + t10.nms = await zq.nonMaxSuppressionAsync(t10.boxes, t10.scores, 1, ((_a2 = config3.body["detector"]) == null ? void 0 : _a2.minConfidence) || 0.1, ((_b = config3.body["detector"]) == null ? void 0 : _b.iouThreshold) || 0.1); + const nms = await t10.nms.data(); + const scores = await t10.scores.data(); + const boxes = await t10.boxes.array(); + for (const i of Array.from(nms)) { + const score = scores[i]; + const boxRaw = boxes[i]; + const box = [Math.round(boxRaw[0] * outputSize2[0]), Math.round(boxRaw[1] * outputSize2[1]), Math.round(boxRaw[2] * outputSize2[0]), Math.round(boxRaw[3] * outputSize2[1])]; + const detectedBox = { score, boxRaw, box }; + detectedBoxes.push(detectedBox); + } + Object.keys(t10).forEach((tensor) => Ft(t10[tensor])); + return detectedBoxes; +} +async function detectBoxes(input, config3, outputSize2) { + const t10 = {}; + t10.res = model == null ? void 0 : model.execute(input, ["Identity"]); + t10.logitsRaw = Ue(t10.res, [0, 0, 0], [1, -1, 1]); + t10.boxesRaw = Ue(t10.res, [0, 0, 1], [1, -1, -1]); + t10.logits = jp(t10.logitsRaw); + t10.boxes = jp(t10.boxesRaw); + const boxes = await decodeResults(t10.boxes, t10.logits, config3, outputSize2); + Object.keys(t10).forEach((tensor) => Ft(t10[tensor])); + return boxes; +} + +// src/util/box.ts +function calc(keypoints, outputSize2 = [1, 1]) { + const coords = [keypoints.map((pt) => pt[0]), keypoints.map((pt) => pt[1])]; + const min = [Math.min(...coords[0]), Math.min(...coords[1])]; + const max = [Math.max(...coords[0]), Math.max(...coords[1])]; + const box = [min[0], min[1], max[0] - min[0], max[1] - min[1]]; + const boxRaw = [box[0] / outputSize2[0], box[1] / outputSize2[1], box[2] / outputSize2[0], box[3] / outputSize2[1]]; + return { box, boxRaw }; +} +function square(keypoints, outputSize2 = [1, 1]) { + const coords = [keypoints.map((pt) => pt[0]), keypoints.map((pt) => pt[1])]; + const min = [Math.min(...coords[0]), Math.min(...coords[1])]; + const max = [Math.max(...coords[0]), Math.max(...coords[1])]; + const center = [(min[0] + max[0]) / 2, (min[1] + max[1]) / 2]; + const dist = Math.max(center[0] - min[0], center[1] - min[1], -center[0] + max[0], -center[1] + max[1]); + const box = [Math.trunc(center[0] - dist), Math.trunc(center[1] - dist), Math.trunc(2 * dist), Math.trunc(2 * dist)]; + const boxRaw = [box[0] / outputSize2[0], box[1] / outputSize2[1], box[2] / outputSize2[0], box[3] / outputSize2[1]]; + return { box, boxRaw }; +} +function scale(box, scaleFact) { + const dist = [box[2] * scaleFact, box[3] * scaleFact]; + const newBox = [ + box[0] - (dist[0] - box[2]) / 2, + box[1] - (dist[1] - box[3]) / 2, + dist[0], + dist[1] + ]; + return newBox; +} + +// src/body/blazepose.ts +var model2; +var inputSize2 = 256; +var skipped = Number.MAX_SAFE_INTEGER; +var outputNodes = { + landmarks: ["ld_3d", "activation_segmentation", "activation_heatmap", "world_3d", "output_poseflag"], + detector: [] +}; +var cache = []; +var padding = [[0, 0], [0, 0], [0, 0], [0, 0]]; +var lastTime = 0; +var sigmoid = (x6) => 1 - 1 / (1 + Math.exp(x6)); +var loadDetect = (config3) => loadDetector(config3); +async function loadPose(config3) { + if (env.initial) + model2 = null; + if (!model2) { + model2 = await loadModel(config3.body.modelPath); + const inputs = (model2 == null ? void 0 : model2["executor"]) ? Object.values(model2.modelSignature["inputs"]) : void 0; + inputSize2 = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0; + } else if (config3.debug) + log("cached model:", model2["modelUrl"]); + return model2; +} +function prepareImage(input, size2, cropBox) { + var _a2, _b; + const t10 = {}; + if (!((_a2 = input == null ? void 0 : input.shape) == null ? void 0 : _a2[1]) || !((_b = input == null ? void 0 : input.shape) == null ? void 0 : _b[2])) + return input; + let final; + if (cropBox) { + t10.cropped = zq.cropAndResize(input, [cropBox], [0], [input.shape[1], input.shape[2]]); + } + if (input.shape[1] !== input.shape[2]) { + const height = [ + input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0, + input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0 + ]; + const width = [ + input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0, + input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0 + ]; + padding = [ + [0, 0], + height, + width, + [0, 0] + ]; + t10.pad = Ws(t10.cropped || input, padding); + t10.resize = zq.resizeBilinear(t10.pad, [size2, size2]); + final = We(t10.resize, constants.tf255); + } else if (input.shape[1] !== size2) { + t10.resize = zq.resizeBilinear(t10.cropped || input, [size2, size2]); + final = We(t10.resize, constants.tf255); + } else { + final = We(t10.cropped || input, constants.tf255); + } + Object.keys(t10).forEach((tensor) => Ft(t10[tensor])); + return final; +} +function rescaleKeypoints(keypoints, outputSize2, cropBox) { + for (const kpt4 of keypoints) { + kpt4.position = [ + Math.trunc(kpt4.position[0] * (outputSize2[0] + padding[2][0] + padding[2][1]) / outputSize2[0] - padding[2][0]), + Math.trunc(kpt4.position[1] * (outputSize2[1] + padding[1][0] + padding[1][1]) / outputSize2[1] - padding[1][0]), + kpt4.position[2] + ]; + kpt4.positionRaw = [kpt4.position[0] / outputSize2[0], kpt4.position[1] / outputSize2[1], 2 * kpt4.position[2] / (outputSize2[0] + outputSize2[1])]; + } + if (cropBox) { + const width = cropBox[2] - cropBox[0]; + const height = cropBox[3] - cropBox[1]; + for (const kpt4 of keypoints) { + kpt4.positionRaw = [ + kpt4.positionRaw[0] / height + cropBox[1], + kpt4.positionRaw[1] / width + cropBox[0], + kpt4.positionRaw[2] + ]; + kpt4.position = [ + Math.trunc(kpt4.positionRaw[0] * outputSize2[0]), + Math.trunc(kpt4.positionRaw[1] * outputSize2[1]), + kpt4.positionRaw[2] + ]; + } + } + return keypoints; +} +function fixKeypoints(keypoints) { + const leftPalm = keypoints.find((k) => k.part === "leftPalm"); + const leftWrist = keypoints.find((k) => k.part === "leftWrist"); + const leftIndex = keypoints.find((k) => k.part === "leftIndex"); + leftPalm.position[2] = ((leftWrist.position[2] || 0) + (leftIndex.position[2] || 0)) / 2; + const rightPalm = keypoints.find((k) => k.part === "rightPalm"); + const rightWrist = keypoints.find((k) => k.part === "rightWrist"); + const rightIndex = keypoints.find((k) => k.part === "rightIndex"); + rightPalm.position[2] = ((rightWrist.position[2] || 0) + (rightIndex.position[2] || 0)) / 2; +} +async function detectLandmarks(input, config3, outputSize2) { + if (!(model2 == null ? void 0 : model2["executor"])) + return null; + const t10 = {}; + [t10.ld, t10.segmentation, t10.heatmap, t10.world, t10.poseflag] = model2 == null ? void 0 : model2.execute(input, outputNodes.landmarks); + const poseScore = (await t10.poseflag.data())[0]; + const points = await t10.ld.data(); + const distances = await t10.world.data(); + Object.keys(t10).forEach((tensor) => Ft(t10[tensor])); + const keypointsRelative = []; + const depth = 5; + for (let i = 0; i < points.length / depth; i++) { + const score = sigmoid(points[depth * i + 3]); + const presence = sigmoid(points[depth * i + 4]); + const adjScore = Math.trunc(100 * score * presence * poseScore) / 100; + const positionRaw = [points[depth * i + 0] / inputSize2, points[depth * i + 1] / inputSize2, points[depth * i + 2] + 0]; + const position = [Math.trunc(outputSize2[0] * positionRaw[0]), Math.trunc(outputSize2[1] * positionRaw[1]), positionRaw[2]]; + const distance2 = [distances[depth * i + 0], distances[depth * i + 1], distances[depth * i + 2] + 0]; + keypointsRelative.push({ part: kpt[i], positionRaw, position, distance: distance2, score: adjScore }); + } + if (poseScore < (config3.body.minConfidence || 0)) + return null; + fixKeypoints(keypointsRelative); + const keypoints = rescaleKeypoints(keypointsRelative, outputSize2); + const kpts = keypoints.map((k) => k.position); + const boxes = calc(kpts, [outputSize2[0], outputSize2[1]]); + const annotations2 = {}; + for (const [name, indexes] of Object.entries(connected)) { + const pt = []; + for (let i = 0; i < indexes.length - 1; i++) { + const pt0 = keypoints.find((kpt4) => kpt4.part === indexes[i]); + const pt1 = keypoints.find((kpt4) => kpt4.part === indexes[i + 1]); + if (pt0 && pt1) + pt.push([pt0.position, pt1.position]); + } + annotations2[name] = pt; + } + const body4 = { id: 0, score: Math.trunc(100 * poseScore) / 100, box: boxes.box, boxRaw: boxes.boxRaw, keypoints, annotations: annotations2 }; + return body4; +} +async function predict(input, config3) { + var _a2, _b, _c2; + const outputSize2 = [input.shape[2] || 0, input.shape[1] || 0]; + const skipTime = (config3.body.skipTime || 0) > now() - lastTime; + const skipFrame = skipped < (config3.body.skipFrames || 0); + if (config3.skipAllowed && skipTime && skipFrame && cache !== null) { + skipped++; + } else { + let boxes = []; + if ((_b = (_a2 = config3.body) == null ? void 0 : _a2["detector"]) == null ? void 0 : _b["enabled"]) { + const preparedImage = prepareImage(input, 224); + boxes = await detectBoxes(preparedImage, config3, outputSize2); + Ft(preparedImage); + } else { + boxes = [{ box: [0, 0, 0, 0], boxRaw: [0, 0, 1, 1], score: 0 }]; + } + for (let i = 0; i < boxes.length; i++) { + const preparedBox = prepareImage(input, 256, (_c2 = boxes[i]) == null ? void 0 : _c2.boxRaw); + cache.length = 0; + const bodyResult = await detectLandmarks(preparedBox, config3, outputSize2); + Ft(preparedBox); + if (!bodyResult) + continue; + bodyResult.id = i; + cache.push(bodyResult); + } + lastTime = now(); + skipped = 0; + } + return cache; +} + +// src/object/labels.ts +var labels2 = [ + { 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/centernet.ts +var model3; +var inputSize3 = 0; +var last2 = []; +var lastTime2 = 0; +var skipped2 = Number.MAX_SAFE_INTEGER; +async function load(config3) { + if (env.initial) + model3 = null; + if (!model3) { + model3 = await loadModel(config3.object.modelPath); + const inputs = (model3 == null ? void 0 : model3["executor"]) ? Object.values(model3.modelSignature["inputs"]) : void 0; + inputSize3 = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0; + } else if (config3.debug) + log("cached model:", model3["modelUrl"]); + return model3; +} +async function process3(res, outputShape, config3) { + if (!res) + return []; + const t10 = {}; + const results = []; + const detections = await res.array(); + t10.squeeze = jp(res); + const arr = $a(t10.squeeze, 6, 1); + t10.stack = Ir([arr[1], arr[0], arr[3], arr[2]], 1); + t10.boxes = jp(t10.stack); + t10.scores = jp(arr[4]); + t10.classes = jp(arr[5]); + Ft([res, ...arr]); + t10.nms = await zq.nonMaxSuppressionAsync(t10.boxes, t10.scores, config3.object.maxDetected || 0, config3.object.iouThreshold, config3.object.minConfidence || 0); + const nms = await t10.nms.data(); + let i = 0; + for (const id2 of Array.from(nms)) { + const score = Math.trunc(100 * detections[0][id2][4]) / 100; + const classVal = detections[0][id2][5]; + if (Number.isNaN(classVal)) + continue; + const label = labels2[classVal].label; + const [x6, y] = [ + detections[0][id2][0] / inputSize3, + detections[0][id2][1] / inputSize3 + ]; + const boxRaw = [ + x6, + y, + detections[0][id2][2] / inputSize3 - x6, + detections[0][id2][3] / inputSize3 - y + ]; + const box = [ + 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({ id: i++, score, class: classVal, label, box, boxRaw }); + } + Object.keys(t10).forEach((tensor) => Ft(t10[tensor])); + return results; +} +async function predict2(input, config3) { + if (!(model3 == null ? void 0 : model3["executor"])) + return []; + const skipTime = (config3.object.skipTime || 0) > now() - lastTime2; + const skipFrame = skipped2 < (config3.object.skipFrames || 0); + if (config3.skipAllowed && skipTime && skipFrame && last2.length > 0) { + skipped2++; + return last2; + } + skipped2 = 0; + return new Promise(async (resolve) => { + const outputSize2 = [input.shape[2] || 0, input.shape[1] || 0]; + const resize = zq.resizeBilinear(input, [inputSize3, inputSize3]); + const objectT = config3.object.enabled ? model3 == null ? void 0 : model3.execute(resize, ["tower_0/detections"]) : null; + lastTime2 = now(); + Ft(resize); + const obj = await process3(objectT, outputSize2, config3); + last2 = obj; + resolve(obj); + }); +} + +// src/body/efficientposecoords.ts +var efficientposecoords_exports = {}; +__export(efficientposecoords_exports, { + connected: () => connected2, + kpt: () => kpt2 +}); +var kpt2 = [ + "head", + "neck", + "rightShoulder", + "rightElbow", + "rightWrist", + "chest", + "leftShoulder", + "leftElbow", + "leftWrist", + "bodyCenter", + "rightHip", + "rightKnee", + "rightAnkle", + "leftHip", + "leftKnee", + "leftAnkle" +]; +var connected2 = { + leftLeg: ["leftHip", "leftKnee", "leftAnkle"], + rightLeg: ["rightHip", "rightKnee", "rightAnkle"], + torso: ["leftShoulder", "rightShoulder", "rightHip", "leftHip", "leftShoulder"], + leftArm: ["leftShoulder", "leftElbow", "leftWrist"], + rightArm: ["rightShoulder", "rightElbow", "rightWrist"], + head: [] +}; + +// src/body/efficientpose.ts +var model4; +var lastTime3 = 0; +var cache2 = { id: 0, keypoints: [], box: [0, 0, 0, 0], boxRaw: [0, 0, 0, 0], score: 0, annotations: {} }; +var skipped3 = Number.MAX_SAFE_INTEGER; +async function load2(config3) { + if (env.initial) + model4 = null; + if (!model4) + model4 = await loadModel(config3.body.modelPath); + else if (config3.debug) + log("cached model:", model4["modelUrl"]); + return model4; +} +async function max2d(inputs, minScore) { + const [width, height] = inputs.shape; + const reshaped = z(inputs, [height * width]); + const max = Vs(reshaped, 0); + const newScore = (await max.data())[0]; + if (newScore > minScore) { + const coordinates = Hv(reshaped, 0); + const mod = jk(coordinates, width); + const x6 = (await mod.data())[0]; + const div = We(coordinates, width); + const y = (await div.data())[0]; + Ft([reshaped, max, coordinates, mod, div]); + return [x6, y, newScore]; + } + Ft([reshaped, max]); + return [0, 0, newScore]; +} +async function predict3(image, config3) { + if (!(model4 == null ? void 0 : model4["executor"]) || !(model4 == null ? void 0 : model4.inputs[0].shape)) + return []; + const skipTime = (config3.body.skipTime || 0) > now() - lastTime3; + const skipFrame = skipped3 < (config3.body.skipFrames || 0); + if (config3.skipAllowed && skipTime && skipFrame && Object.keys(cache2.keypoints).length > 0) { + skipped3++; + return [cache2]; + } + skipped3 = 0; + return new Promise(async (resolve) => { + const tensor = Ne(() => { + var _a2, _b; + const resize = zq.resizeBilinear(image, [((_a2 = model4 == null ? void 0 : model4.inputs[0].shape) == null ? void 0 : _a2[2]) || 0, ((_b = model4 == null ? void 0 : model4.inputs[0].shape) == null ? void 0 : _b[1]) || 0], false); + const enhance2 = oe(resize, constants.tf2); + const norm = ke(enhance2, constants.tf1); + return norm; + }); + let resT; + if (config3.body.enabled) + resT = model4 == null ? void 0 : model4.execute(tensor); + lastTime3 = now(); + Ft(tensor); + if (resT) { + cache2.keypoints.length = 0; + const squeeze = jp(resT); + Ft(resT); + const stack = ko(squeeze, 2); + Ft(squeeze); + for (let id2 = 0; id2 < stack.length; id2++) { + const [x10, y6, partScore] = await max2d(stack[id2], config3.body.minConfidence); + if (partScore > (config3.body.minConfidence || 0)) { + cache2.keypoints.push({ + score: Math.round(100 * partScore) / 100, + part: kpt2[id2], + positionRaw: [ + x10 / model4.inputs[0].shape[2], + y6 / model4.inputs[0].shape[1] + ], + position: [ + Math.round(image.shape[2] * x10 / model4.inputs[0].shape[2]), + Math.round(image.shape[1] * y6 / model4.inputs[0].shape[1]) + ] + }); + } + } + stack.forEach((s) => Ft(s)); + } + cache2.score = cache2.keypoints.reduce((prev, curr) => curr.score > prev ? curr.score : prev, 0); + const x6 = cache2.keypoints.map((a) => a.position[0]); + const y = cache2.keypoints.map((a) => a.position[1]); + cache2.box = [ + Math.min(...x6), + Math.min(...y), + Math.max(...x6) - Math.min(...x6), + Math.max(...y) - Math.min(...y) + ]; + const xRaw = cache2.keypoints.map((a) => a.positionRaw[0]); + const yRaw = cache2.keypoints.map((a) => a.positionRaw[1]); + cache2.boxRaw = [ + Math.min(...xRaw), + Math.min(...yRaw), + Math.max(...xRaw) - Math.min(...xRaw), + Math.max(...yRaw) - Math.min(...yRaw) + ]; + for (const [name, indexes] of Object.entries(connected2)) { + const pt = []; + for (let i = 0; i < indexes.length - 1; i++) { + const pt0 = cache2.keypoints.find((kpt4) => kpt4.part === indexes[i]); + const pt1 = cache2.keypoints.find((kpt4) => kpt4.part === indexes[i + 1]); + if (pt0 && pt1 && pt0.score > (config3.body.minConfidence || 0) && pt1.score > (config3.body.minConfidence || 0)) + pt.push([pt0.position, pt1.position]); + } + cache2.annotations[name] = pt; + } + resolve([cache2]); + }); +} + +// src/face/facemeshutil.ts +var getBoxSize = (box) => [Math.abs(box.endPoint[0] - box.startPoint[0]), Math.abs(box.endPoint[1] - box.startPoint[1])]; +var getBoxCenter = (box) => [box.startPoint[0] + (box.endPoint[0] - box.startPoint[0]) / 2, box.startPoint[1] + (box.endPoint[1] - box.startPoint[1]) / 2, 1]; +var clampBox = (box, input) => box ? [ + Math.trunc(Math.max(0, box.startPoint[0])), + Math.trunc(Math.max(0, box.startPoint[1])), + Math.trunc(Math.min(input.shape[2] || 0, box.endPoint[0]) - Math.max(0, box.startPoint[0])), + Math.trunc(Math.min(input.shape[1] || 0, box.endPoint[1]) - Math.max(0, box.startPoint[1])) +] : [0, 0, 0, 0]; +var getRawBox = (box, input) => box ? [ + box.startPoint[0] / (input.shape[2] || 0), + box.startPoint[1] / (input.shape[1] || 0), + (box.endPoint[0] - box.startPoint[0]) / (input.shape[2] || 0), + (box.endPoint[1] - box.startPoint[1]) / (input.shape[1] || 0) +] : [0, 0, 0, 0]; +var scaleBoxCoordinates = (box, factor) => { + const startPoint = [box.startPoint[0] * factor[0], box.startPoint[1] * factor[1]]; + const endPoint = [box.endPoint[0] * factor[0], box.endPoint[1] * factor[1]]; + return { startPoint, endPoint, landmarks: box.landmarks, confidence: box.confidence }; +}; +var cutAndResize = (box, image, cropSize) => { + const h = image.shape[1]; + const w = image.shape[2]; + const cutBox = [box.startPoint[1] / h, box.startPoint[0] / w, box.endPoint[1] / h, box.endPoint[0] / w]; + const crop = zq.cropAndResize(image, [cutBox], [0], cropSize); + const norm = We(crop, constants.tf255); + Ft(crop); + return norm; +}; +var enlargeBox = (box, factor) => { + const center = getBoxCenter(box); + const size2 = getBoxSize(box); + const halfSize = [factor * size2[0] / 2, factor * size2[1] / 2]; + return { startPoint: [center[0] - halfSize[0], center[1] - halfSize[1]], endPoint: [center[0] + halfSize[0], center[1] + halfSize[1]], landmarks: box.landmarks, confidence: box.confidence }; +}; +var squarifyBox = (box) => { + const centers = getBoxCenter(box); + const size2 = getBoxSize(box); + const halfSize = Math.max(...size2) / 2; + return { startPoint: [Math.round(centers[0] - halfSize), Math.round(centers[1] - halfSize)], endPoint: [Math.round(centers[0] + halfSize), Math.round(centers[1] + halfSize)], landmarks: box.landmarks, confidence: box.confidence }; +}; +var calculateLandmarksBoundingBox = (landmarks) => { + const x6 = landmarks.map((d) => d[0]); + const y = landmarks.map((d) => d[1]); + return { startPoint: [Math.min(...x6), Math.min(...y)], endPoint: [Math.max(...x6), Math.max(...y)], landmarks }; +}; +var fixedRotationMatrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]; +var normalizeRadians = (angle) => angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI)); +var computeRotation = (point1, point2) => normalizeRadians(Math.PI / 2 - Math.atan2(-(point2[1] - point1[1]), point2[0] - point1[0])); +var buildTranslationMatrix = (x6, y) => [[1, 0, x6], [0, 1, y], [0, 0, 1]]; +var dot = (v12, v22) => { + let product = 0; + for (let i = 0; i < v12.length; i++) + product += v12[i] * v22[i]; + return product; +}; +var getColumnFrom2DArr = (arr, columnIndex) => { + const column = []; + for (let i = 0; i < arr.length; i++) + column.push(arr[i][columnIndex]); + return column; +}; +var multiplyTransformMatrices = (mat1, mat2) => { + const product = []; + const size2 = mat1.length; + for (let row = 0; row < size2; row++) { + product.push([]); + for (let col = 0; col < size2; col++) + product[row].push(dot(mat1[row], getColumnFrom2DArr(mat2, col))); + } + return product; +}; +var 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); +}; +var 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]]; +}; +var rotatePoint = (homogeneousCoordinate, rotationMatrix) => [dot(homogeneousCoordinate, rotationMatrix[0]), dot(homogeneousCoordinate, rotationMatrix[1])]; +function generateAnchors(inputSize10) { + const spec = inputSize10 === 192 ? { strides: [4], anchors: [1] } : { strides: [inputSize10 / 16, inputSize10 / 8], anchors: [2, 6] }; + const anchors3 = []; + for (let i = 0; i < spec.strides.length; i++) { + const stride = spec.strides[i]; + const gridRows = Math.floor((inputSize10 + stride - 1) / stride); + const gridCols = Math.floor((inputSize10 + 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; +} +function transformRawCoords(coordsRaw, box, angle, rotationMatrix, inputSize10) { + const boxSize = getBoxSize(box); + const coordsScaled = coordsRaw.map((coord) => [ + boxSize[0] / inputSize10 * (coord[0] - inputSize10 / 2), + boxSize[1] / inputSize10 * (coord[1] - inputSize10 / 2), + coord[2] || 0 + ]); + const largeAngle = angle && angle !== 0 && Math.abs(angle) > 0.2; + const coordsRotationMatrix = largeAngle ? buildRotationMatrix(angle, [0, 0]) : fixedRotationMatrix; + const coordsRotated = largeAngle ? coordsScaled.map((coord) => [...rotatePoint(coord, coordsRotationMatrix), coord[2]]) : coordsScaled; + const inverseRotationMatrix = largeAngle ? invertTransformMatrix(rotationMatrix) : fixedRotationMatrix; + const boxCenter = getBoxCenter(box); + const offsets = [dot(boxCenter, inverseRotationMatrix[0]), dot(boxCenter, inverseRotationMatrix[1])]; + return coordsRotated.map((coord) => [ + Math.trunc(coord[0] + offsets[0]), + Math.trunc(coord[1] + offsets[1]), + Math.trunc(coord[2] || 0) + ]); +} +function correctFaceRotation(rotate, box, input, inputSize10) { + const symmetryLine = box.landmarks.length >= meshLandmarks.count ? meshLandmarks.symmetryLine : blazeFaceLandmarks.symmetryLine; + let angle = 0; + let rotationMatrix = fixedRotationMatrix; + let face4; + if (rotate && env.kernels.includes("rotatewithoffset")) { + angle = computeRotation(box.landmarks[symmetryLine[0]], box.landmarks[symmetryLine[1]]); + const largeAngle = angle && angle !== 0 && Math.abs(angle) > 0.2; + if (largeAngle) { + const center = getBoxCenter(box); + const centerRaw = [center[0] / input.shape[2], center[1] / input.shape[1]]; + const rotated = zq.rotateWithOffset(input, angle, 0, [centerRaw[0], centerRaw[1]]); + rotationMatrix = buildRotationMatrix(-angle, center); + face4 = cutAndResize(box, rotated, [inputSize10, inputSize10]); + Ft(rotated); + } else { + face4 = cutAndResize(box, input, [inputSize10, inputSize10]); + } + } else { + face4 = cutAndResize(box, input, [inputSize10, inputSize10]); + } + return [angle, rotationMatrix, face4]; +} +var findFaceCenter = (mesh) => { + const x6 = mesh.map((m) => m[0]); + const y = mesh.map((m) => m[1]); + return [Math.min(...x6) + (Math.max(...x6) - Math.min(...x6)) / 2, Math.min(...y) + (Math.max(...y) - Math.min(...y)) / 2]; +}; +var calculateFaceBox = (mesh, previousBox) => { + const center = findFaceCenter(mesh); + const boxSize = getBoxSize(previousBox); + const calculatedBox = { + startPoint: [center[0] - boxSize[0] / 2, center[1] - boxSize[1] / 2], + endPoint: [center[0] + boxSize[0] / 2, center[1] + boxSize[1] / 2] + }; + return calculatedBox; +}; + +// src/face/blazeface.ts +var keypointsCount = 6; +var faceBoxScaleFactor = 1.4; +var model5; +var anchors = null; +var inputSize4 = 0; +var inputSizeT = null; +var size = () => inputSize4; +async function load3(config3) { + var _a2; + if (env.initial) + model5 = null; + if (!model5) + model5 = await loadModel((_a2 = config3.face.detector) == null ? void 0 : _a2.modelPath); + else if (config3.debug) + log("cached model:", model5["modelUrl"]); + inputSize4 = model5["executor"] && model5.inputs[0].shape ? model5.inputs[0].shape[2] : 256; + inputSizeT = be(inputSize4, "int32"); + anchors = gi(generateAnchors(inputSize4)); + return model5; +} +function decodeBoxes2(boxOutputs) { + if (!anchors || !inputSizeT) + return Wr([0, 0]); + const t10 = {}; + t10.boxStarts = Ue(boxOutputs, [0, 1], [-1, 2]); + t10.centers = ge(t10.boxStarts, anchors); + t10.boxSizes = Ue(boxOutputs, [0, 3], [-1, 2]); + t10.boxSizesNormalized = We(t10.boxSizes, inputSizeT); + t10.centersNormalized = We(t10.centers, inputSizeT); + t10.halfBoxSize = We(t10.boxSizesNormalized, constants.tf2); + t10.starts = ke(t10.centersNormalized, t10.halfBoxSize); + t10.ends = ge(t10.centersNormalized, t10.halfBoxSize); + t10.startNormalized = oe(t10.starts, inputSizeT); + t10.endNormalized = oe(t10.ends, inputSizeT); + const boxes = ck([t10.startNormalized, t10.endNormalized], 1); + Object.keys(t10).forEach((tensor) => Ft(t10[tensor])); + return boxes; +} +async function getBoxes(inputImage, config3) { + var _a2, _b, _c2, _d2; + if (!inputImage || inputImage["isDisposedInternal"] || inputImage.shape.length !== 4 || inputImage.shape[1] < 1 || inputImage.shape[2] < 1) + return []; + const t10 = {}; + t10.resized = zq.resizeBilinear(inputImage, [inputSize4, inputSize4]); + t10.div = We(t10.resized, constants.tf127); + t10.normalized = ke(t10.div, constants.tf05); + const res = model5 == null ? void 0 : model5.execute(t10.normalized); + if (Array.isArray(res) && res.length > 2) { + const sorted = res.sort((a, b) => a.size - b.size); + t10.concat384 = gt([sorted[0], sorted[2]], 2); + t10.concat512 = gt([sorted[1], sorted[3]], 2); + t10.concat = gt([t10.concat512, t10.concat384], 1); + t10.batch = jp(t10.concat, [0]); + } else if (Array.isArray(res)) { + t10.batch = jp(res[0]); + } else { + t10.batch = jp(res); + } + Ft(res); + t10.boxes = decodeBoxes2(t10.batch); + t10.logits = Ue(t10.batch, [0, 0], [-1, 1]); + t10.sigmoid = Ms(t10.logits); + t10.scores = jp(t10.sigmoid); + t10.nms = await zq.nonMaxSuppressionAsync(t10.boxes, t10.scores, ((_a2 = config3.face.detector) == null ? void 0 : _a2.maxDetected) || 0, ((_b = config3.face.detector) == null ? void 0 : _b.iouThreshold) || 0, ((_c2 = config3.face.detector) == null ? void 0 : _c2.minConfidence) || 0); + const nms = await t10.nms.array(); + const boxes = []; + const scores = await t10.scores.data(); + for (let i = 0; i < nms.length; i++) { + const confidence = scores[nms[i]]; + if (confidence > (((_d2 = config3.face.detector) == null ? void 0 : _d2.minConfidence) || 0)) { + const b = {}; + b.bbox = Ue(t10.boxes, [nms[i], 0], [1, -1]); + b.slice = Ue(t10.batch, [nms[i], keypointsCount - 1], [1, -1]); + b.squeeze = jp(b.slice); + b.landmarks = z(b.squeeze, [keypointsCount, -1]); + const points = await b.bbox.data(); + const rawBox = { + startPoint: [points[0], points[1]], + endPoint: [points[2], points[3]], + landmarks: await b.landmarks.array(), + confidence + }; + const scaledBox = scaleBoxCoordinates(rawBox, [(inputImage.shape[2] || 0) / inputSize4, (inputImage.shape[1] || 0) / inputSize4]); + const enlargedBox = enlargeBox(scaledBox, config3.face["scale"] || faceBoxScaleFactor); + const squaredBox = squarifyBox(enlargedBox); + boxes.push(squaredBox); + Object.keys(b).forEach((tensor) => Ft(b[tensor])); + } + } + Object.keys(t10).forEach((tensor) => Ft(t10[tensor])); + return boxes; +} + +// src/face/iris.ts +var model6; +var inputSize5 = 0; +var irisEnlarge = 2.3; +var leftOutline = meshAnnotations.leftEyeLower0; +var rightOutline = meshAnnotations.rightEyeLower0; +var eyeLandmarks = { + leftBounds: [leftOutline[0], leftOutline[leftOutline.length - 1]], + rightBounds: [rightOutline[0], rightOutline[rightOutline.length - 1]] +}; +var irisLandmarks = { + upperCenter: 3, + lowerCenter: 4, + index: 71, + numCoordinates: 76 +}; +async function load4(config3) { + var _a2, _b; + if (env.initial) + model6 = null; + if (!model6) + model6 = await loadModel((_a2 = config3.face.iris) == null ? void 0 : _a2.modelPath); + else if (config3.debug) + log("cached model:", model6["modelUrl"]); + inputSize5 = (model6 == null ? void 0 : model6["executor"]) && ((_b = model6.inputs) == null ? void 0 : _b[0].shape) ? model6.inputs[0].shape[2] : 0; + if (inputSize5 === -1) + inputSize5 = 64; + return model6; +} +function replaceIrisCoords(rawCoords, newCoords, prefix, keys) { + for (let i = 0; i < irisIndices.length; i++) { + const { key, indices } = irisIndices[i]; + const originalIndices = meshAnnotations[`${prefix}${key}`]; + if (!keys || keys.includes(key)) { + for (let j = 0; j < indices.length; j++) { + const index2 = indices[j]; + rawCoords[originalIndices[j]] = [ + newCoords[index2][0], + newCoords[index2][1], + (newCoords[index2][2] + rawCoords[originalIndices[j]][2]) / 2 + ]; + } + } + } +} +var getLeftToRightEyeDepthDifference = (rawCoords) => { + const leftEyeZ = rawCoords[eyeLandmarks.leftBounds[0]][2]; + const rightEyeZ = rawCoords[eyeLandmarks.rightBounds[0]][2]; + return leftEyeZ - rightEyeZ; +}; +var getEyeBox = (rawCoords, face4, eyeInnerCornerIndex, eyeOuterCornerIndex, meshSize, flip = false) => { + const box = squarifyBox(enlargeBox(calculateLandmarksBoundingBox([rawCoords[eyeInnerCornerIndex], rawCoords[eyeOuterCornerIndex]]), irisEnlarge)); + const boxSize = getBoxSize(box); + let crop = zq.cropAndResize(face4, [[ + box.startPoint[1] / meshSize, + box.startPoint[0] / meshSize, + box.endPoint[1] / meshSize, + box.endPoint[0] / meshSize + ]], [0], [inputSize5, inputSize5]); + if (flip && env.kernels.includes("flipleftright")) { + const flipped = zq.flipLeftRight(crop); + Ft(crop); + crop = flipped; + } + return { box, boxSize, crop }; +}; +var getEyeCoords = (eyeData, eyeBox, eyeBoxSize, flip = false) => { + const eyeRawCoords = []; + for (let i = 0; i < irisLandmarks.numCoordinates; i++) { + const x6 = eyeData[i * 3]; + const y = eyeData[i * 3 + 1]; + const z10 = eyeData[i * 3 + 2]; + eyeRawCoords.push([ + (flip ? 1 - x6 / inputSize5 : x6 / inputSize5) * eyeBoxSize[0] + eyeBox.startPoint[0], + y / inputSize5 * eyeBoxSize[1] + eyeBox.startPoint[1], + z10 + ]); + } + return { rawCoords: eyeRawCoords, iris: eyeRawCoords.slice(irisLandmarks.index) }; +}; +var getAdjustedIrisCoords = (rawCoords, irisCoords, direction) => { + const upperCenterZ = rawCoords[meshAnnotations[`${direction}EyeUpper0`][irisLandmarks.upperCenter]][2]; + const lowerCenterZ = rawCoords[meshAnnotations[`${direction}EyeLower0`][irisLandmarks.lowerCenter]][2]; + const averageZ = (upperCenterZ + lowerCenterZ) / 2; + return irisCoords.map((coord, i) => { + let z10 = averageZ; + if (i === 2) { + z10 = upperCenterZ; + } else if (i === 4) { + z10 = lowerCenterZ; + } + return [coord[0], coord[1], z10]; + }); +}; +async function augmentIris(rawCoords, face4, meshSize) { + if (!(model6 == null ? void 0 : model6["executor"])) + return rawCoords; + const { box: leftEyeBox, boxSize: leftEyeBoxSize, crop: leftEyeCrop } = getEyeBox(rawCoords, face4, eyeLandmarks.leftBounds[0], eyeLandmarks.leftBounds[1], meshSize, true); + const { box: rightEyeBox, boxSize: rightEyeBoxSize, crop: rightEyeCrop } = getEyeBox(rawCoords, face4, eyeLandmarks.rightBounds[0], eyeLandmarks.rightBounds[1], meshSize, true); + const combined = gt([leftEyeCrop, rightEyeCrop]); + Ft(leftEyeCrop); + Ft(rightEyeCrop); + const eyePredictions = model6.execute(combined); + Ft(combined); + const eyePredictionsData = await eyePredictions.data(); + Ft(eyePredictions); + const leftEyeData = eyePredictionsData.slice(0, irisLandmarks.numCoordinates * 3); + const { rawCoords: leftEyeRawCoords, iris: leftIrisRawCoords } = getEyeCoords(leftEyeData, leftEyeBox, leftEyeBoxSize, true); + const rightEyeData = eyePredictionsData.slice(irisLandmarks.numCoordinates * 3); + const { rawCoords: rightEyeRawCoords, iris: rightIrisRawCoords } = getEyeCoords(rightEyeData, rightEyeBox, rightEyeBoxSize, false); + const leftToRightEyeDepthDifference = getLeftToRightEyeDepthDifference(rawCoords); + if (Math.abs(leftToRightEyeDepthDifference) < 30) { + replaceIrisCoords(rawCoords, leftEyeRawCoords, "left", null); + replaceIrisCoords(rawCoords, rightEyeRawCoords, "right", null); + } else if (leftToRightEyeDepthDifference < 1) { + replaceIrisCoords(rawCoords, leftEyeRawCoords, "left", ["EyeUpper0", "EyeLower0"]); + } else { + replaceIrisCoords(rawCoords, rightEyeRawCoords, "right", ["EyeUpper0", "EyeLower0"]); + } + const adjustedLeftIrisCoords = getAdjustedIrisCoords(rawCoords, leftIrisRawCoords, "left"); + const adjustedRightIrisCoords = getAdjustedIrisCoords(rawCoords, rightIrisRawCoords, "right"); + const newCoords = rawCoords.concat(adjustedLeftIrisCoords).concat(adjustedRightIrisCoords); + return newCoords; +} + +// src/face/attention.ts +async function augment(rawCoords, results) { + var _a2, _b, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j2; + const t10 = { + lips: await ((_b = (_a2 = results.filter((r) => r.size === 160)) == null ? void 0 : _a2[0]) == null ? void 0 : _b.data()), + irisL: await ((_d2 = (_c2 = results.filter((r) => r.size === 10)) == null ? void 0 : _c2[0]) == null ? void 0 : _d2.data()), + eyeL: await ((_f2 = (_e2 = results.filter((r) => r.size === 142)) == null ? void 0 : _e2[0]) == null ? void 0 : _f2.data()), + irisR: await ((_h2 = (_g2 = results.filter((r) => r.size === 10)) == null ? void 0 : _g2[1]) == null ? void 0 : _h2.data()), + eyeR: await ((_j2 = (_i2 = results.filter((r) => r.size === 142)) == null ? void 0 : _i2[1]) == null ? void 0 : _j2.data()) + }; + for (const val of Object.values(t10)) { + if (!val) + return rawCoords; + } + const irisLDepth = LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG.reduce((prev, curr) => prev += rawCoords[curr][2], 0) / LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG.length; + for (let i = 0; i < t10.irisL.length / 2; i++) + rawCoords.push([t10.irisL[2 * i + 0], t10.irisL[2 * i + 1], irisLDepth]); + const irisRDepth = LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG.reduce((prev, curr) => prev += rawCoords[curr][2], 0) / LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG.length; + for (let i = 0; i < t10.irisR.length / 2; i++) + rawCoords.push([t10.irisR[2 * i + 0], t10.irisR[2 * i + 1], irisRDepth]); + for (let i = 0; i < t10.eyeL.length / 2; i++) + rawCoords[LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG[i]] = [t10.eyeL[2 * i + 0], t10.eyeL[2 * i + 1], rawCoords[LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG[i]][2]]; + for (let i = 0; i < t10.eyeR.length / 2; i++) + rawCoords[LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG[i]] = [t10.eyeR[2 * i + 0], t10.eyeR[2 * i + 1], rawCoords[LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG[i]][2]]; + for (let i = 0; i < t10.lips.length / 2; i++) + rawCoords[LANDMARKS_REFINEMENT_LIPS_CONFIG[i]] = [t10.lips[2 * i + 0], t10.lips[2 * i + 1], rawCoords[LANDMARKS_REFINEMENT_LIPS_CONFIG[i]][2]]; + return rawCoords; +} + +// src/face/facemesh.ts +var cache3 = { + boxes: [], + skipped: Number.MAX_SAFE_INTEGER, + timestamp: 0 +}; +var model7 = null; +var inputSize6 = 0; +async function predict4(input, config3) { + var _a2, _b, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j2; + if (!(model7 == null ? void 0 : model7["executor"])) + return []; + const skipTime = (((_a2 = config3.face.detector) == null ? void 0 : _a2.skipTime) || 0) > now() - cache3.timestamp; + const skipFrame = cache3.skipped < (((_b = config3.face.detector) == null ? void 0 : _b.skipFrames) || 0); + if (!config3.skipAllowed || !skipTime || !skipFrame || cache3.boxes.length === 0) { + cache3.boxes = await getBoxes(input, config3); + cache3.timestamp = now(); + cache3.skipped = 0; + } else { + cache3.skipped++; + } + const faces = []; + const newCache = []; + let id2 = 0; + const size2 = inputSize6; + for (let i = 0; i < cache3.boxes.length; i++) { + const box = cache3.boxes[i]; + let angle = 0; + let rotationMatrix; + const face4 = { + id: id2++, + mesh: [], + meshRaw: [], + box: [0, 0, 0, 0], + boxRaw: [0, 0, 0, 0], + score: 0, + boxScore: 0, + faceScore: 0, + annotations: {} + }; + [angle, rotationMatrix, face4.tensor] = correctFaceRotation((_c2 = config3.face.detector) == null ? void 0 : _c2.rotation, box, input, ((_d2 = config3.face.mesh) == null ? void 0 : _d2.enabled) ? inputSize6 : size()); + if (config3.filter.equalization) { + const equilized = face4.tensor ? await histogramEqualization(face4.tensor) : void 0; + Ft(face4.tensor); + if (equilized) + face4.tensor = equilized; + } + face4.boxScore = Math.round(100 * box.confidence) / 100; + if (!((_e2 = config3.face.mesh) == null ? void 0 : _e2.enabled)) { + face4.box = clampBox(box, input); + face4.boxRaw = getRawBox(box, input); + face4.score = face4.boxScore; + face4.mesh = box.landmarks.map((pt) => [ + (box.startPoint[0] + box.endPoint[0]) / 2 + (box.endPoint[0] + box.startPoint[0]) * pt[0] / size(), + (box.startPoint[1] + box.endPoint[1]) / 2 + (box.endPoint[1] + box.startPoint[1]) * pt[1] / size() + ]); + face4.meshRaw = face4.mesh.map((pt) => [pt[0] / (input.shape[2] || 0), pt[1] / (input.shape[1] || 0), (pt[2] || 0) / size2]); + for (const key of Object.keys(blazeFaceLandmarks)) { + face4.annotations[key] = [face4.mesh[blazeFaceLandmarks[key]]]; + } + } else if (!model7) { + if (config3.debug) + log("face mesh detection requested, but model is not loaded"); + } else { + if (((_f2 = config3.face.attention) == null ? void 0 : _f2.enabled) && !env.kernels.includes("atan2")) { + config3.face.attention.enabled = false; + Ft(face4.tensor); + return faces; + } + const results = model7.execute(face4.tensor); + const confidenceT = results.find((t10) => t10.shape[t10.shape.length - 1] === 1); + const faceConfidence = await confidenceT.data(); + face4.faceScore = Math.round(100 * faceConfidence[0]) / 100; + if (face4.faceScore < (((_g2 = config3.face.detector) == null ? void 0 : _g2.minConfidence) || 1)) { + box.confidence = face4.faceScore; + if (config3.face.mesh.keepInvalid) { + face4.box = clampBox(box, input); + face4.boxRaw = getRawBox(box, input); + face4.score = face4.boxScore; + face4.mesh = box.landmarks.map((pt) => [ + (box.startPoint[0] + box.endPoint[0]) / 2 + (box.endPoint[0] + box.startPoint[0]) * pt[0] / size(), + (box.startPoint[1] + box.endPoint[1]) / 2 + (box.endPoint[1] + box.startPoint[1]) * pt[1] / size() + ]); + face4.meshRaw = face4.mesh.map((pt) => [pt[0] / (input.shape[2] || 1), pt[1] / (input.shape[1] || 1), (pt[2] || 0) / size2]); + for (const key of Object.keys(blazeFaceLandmarks)) { + face4.annotations[key] = [face4.mesh[blazeFaceLandmarks[key]]]; + } + } + } else { + const meshT = results.find((t10) => t10.shape[t10.shape.length - 1] === 1404); + const coordsReshaped = z(meshT, [-1, 3]); + let rawCoords = await coordsReshaped.array(); + Ft(coordsReshaped); + if ((_h2 = config3.face.attention) == null ? void 0 : _h2.enabled) { + rawCoords = await augment(rawCoords, results); + } else if ((_i2 = config3.face.iris) == null ? void 0 : _i2.enabled) { + rawCoords = await augmentIris(rawCoords, face4.tensor, inputSize6); + } + face4.mesh = transformRawCoords(rawCoords, box, angle, rotationMatrix, inputSize6); + face4.meshRaw = face4.mesh.map((pt) => [pt[0] / (input.shape[2] || 0), pt[1] / (input.shape[1] || 0), (pt[2] || 0) / size2]); + for (const key of Object.keys(meshAnnotations)) + face4.annotations[key] = meshAnnotations[key].map((index2) => face4.mesh[index2]); + face4.score = face4.faceScore; + const calculatedBox = { ...calculateFaceBox(face4.mesh, box), confidence: box.confidence, landmarks: box.landmarks }; + face4.box = clampBox(calculatedBox, input); + face4.boxRaw = getRawBox(calculatedBox, input); + newCache.push(calculatedBox); + } + Ft(results); + } + if (face4.score > (((_j2 = config3.face.detector) == null ? void 0 : _j2.minConfidence) || 1)) + faces.push(face4); + else + Ft(face4.tensor); + } + cache3.boxes = newCache; + return faces; +} +async function load5(config3) { + var _a2, _b, _c2, _d2, _e2, _f2; + if (env.initial) + model7 = null; + if (((_a2 = config3.face.attention) == null ? void 0 : _a2.enabled) && (model7 == null ? void 0 : model7["signature"])) { + if (Object.keys(((_b = model7 == null ? void 0 : model7["signature"]) == null ? void 0 : _b.outputs) || {}).length < 6) + model7 = null; + } + if (!model7) { + if ((_c2 = config3.face.attention) == null ? void 0 : _c2.enabled) + model7 = await loadModel(config3.face.attention.modelPath); + else + model7 = await loadModel((_d2 = config3.face.mesh) == null ? void 0 : _d2.modelPath); + } else if (config3.debug) { + log("cached model:", model7["modelUrl"]); + } + inputSize6 = model7["executor"] && ((_e2 = model7 == null ? void 0 : model7.inputs) == null ? void 0 : _e2[0].shape) ? (_f2 = model7 == null ? void 0 : model7.inputs) == null ? void 0 : _f2[0].shape[2] : 256; + return model7; +} +var triangulation = TRI468; +var uvmap = UV468; + +// src/gear/emotion.ts +var annotations = ["angry", "disgust", "fear", "happy", "sad", "surprise", "neutral"]; +var model8; +var last3 = []; +var lastCount = 0; +var lastTime4 = 0; +var skipped4 = Number.MAX_SAFE_INTEGER; +async function load6(config3) { + var _a2; + if (env.initial) + model8 = null; + if (!model8) + model8 = await loadModel((_a2 = config3.face.emotion) == null ? void 0 : _a2.modelPath); + else if (config3.debug) + log("cached model:", model8["modelUrl"]); + return model8; +} +async function predict5(image, config3, idx, count2) { + var _a2, _b; + if (!model8) + return []; + const skipFrame = skipped4 < (((_a2 = config3.face.emotion) == null ? void 0 : _a2.skipFrames) || 0); + const skipTime = (((_b = config3.face.emotion) == null ? void 0 : _b.skipTime) || 0) > now() - lastTime4; + if (config3.skipAllowed && skipTime && skipFrame && lastCount === count2 && last3[idx] && last3[idx].length > 0) { + skipped4++; + return last3[idx]; + } + skipped4 = 0; + return new Promise(async (resolve) => { + var _a3; + const obj = []; + if ((_a3 = config3.face.emotion) == null ? void 0 : _a3.enabled) { + const t10 = {}; + const inputSize10 = (model8 == null ? void 0 : model8.inputs[0].shape) ? model8.inputs[0].shape[2] : 0; + t10.resize = zq.resizeBilinear(image, [inputSize10, inputSize10], false); + t10.channels = oe(t10.resize, constants.rgb); + t10.grayscale = tt(t10.channels, 3, true); + t10.grayscaleSub = ke(t10.grayscale, constants.tf05); + t10.grayscaleMul = oe(t10.grayscaleSub, constants.tf2); + t10.emotion = model8 == null ? void 0 : model8.execute(t10.grayscaleMul); + lastTime4 = now(); + const data = await t10.emotion.data(); + for (let i = 0; i < data.length; i++) { + if (data[i] > (config3.face.emotion.minConfidence || 0)) + obj.push({ score: Math.min(0.99, Math.trunc(100 * data[i]) / 100), emotion: annotations[i] }); + } + obj.sort((a, b) => b.score - a.score); + Object.keys(t10).forEach((tensor) => Ft(t10[tensor])); + } + last3[idx] = obj; + lastCount = count2; + resolve(obj); + }); +} + +// src/face/faceres.ts +var model9; +var last4 = []; +var lastTime5 = 0; +var lastCount2 = 0; +var skipped5 = Number.MAX_SAFE_INTEGER; +async function load7(config3) { + var _a2; + if (env.initial) + model9 = null; + if (!model9) + model9 = await loadModel((_a2 = config3.face.description) == null ? void 0 : _a2.modelPath); + else if (config3.debug) + log("cached model:", model9["modelUrl"]); + return model9; +} +function enhance(input) { + const tensor = input.image || input.tensor || input; + if (!(model9 == null ? void 0 : model9.inputs[0].shape)) + return tensor; + const crop = zq.resizeBilinear(tensor, [model9.inputs[0].shape[2], model9.inputs[0].shape[1]], false); + const norm = oe(crop, constants.tf255); + Ft(crop); + return norm; +} +async function predict6(image, config3, idx, count2) { + var _a2, _b, _c2, _d2; + const obj = { + age: 0, + gender: "unknown", + genderScore: 0, + descriptor: [] + }; + if (!(model9 == null ? void 0 : model9["executor"])) + return obj; + const skipFrame = skipped5 < (((_a2 = config3.face.description) == null ? void 0 : _a2.skipFrames) || 0); + const skipTime = (((_b = config3.face.description) == null ? void 0 : _b.skipTime) || 0) > now() - lastTime5; + if (config3.skipAllowed && skipFrame && skipTime && lastCount2 === count2 && ((_c2 = last4 == null ? void 0 : last4[idx]) == null ? void 0 : _c2.age) > 0 && ((_d2 = last4 == null ? void 0 : last4[idx]) == null ? void 0 : _d2.genderScore) > 0) { + skipped5++; + return last4[idx]; + } + skipped5 = 0; + return new Promise(async (resolve) => { + var _a3; + if ((_a3 = config3.face.description) == null ? void 0 : _a3.enabled) { + const enhanced = enhance(image); + const resT = model9 == null ? void 0 : model9.execute(enhanced); + lastTime5 = now(); + Ft(enhanced); + const genderT = resT.find((t10) => t10.shape[1] === 1); + const gender2 = await genderT.data(); + const confidence = Math.trunc(200 * Math.abs(gender2[0] - 0.5)) / 100; + if (confidence > (config3.face.description.minConfidence || 0)) { + obj.gender = gender2[0] <= 0.5 ? "female" : "male"; + obj.genderScore = Math.min(0.99, confidence); + } + const argmax = Hv(resT.find((t10) => t10.shape[1] === 100), 1); + const ageIdx = (await argmax.data())[0]; + Ft(argmax); + const ageT = resT.find((t10) => t10.shape[1] === 100); + const all2 = await ageT.data(); + obj.age = Math.round(all2[ageIdx - 1] > all2[ageIdx + 1] ? 10 * ageIdx - 100 * all2[ageIdx - 1] : 10 * ageIdx + 100 * all2[ageIdx + 1]) / 10; + if (Number.isNaN(gender2[0]) || Number.isNaN(all2[0])) + log("faceres error:", { model: model9, result: resT }); + const desc = resT.find((t10) => t10.shape[1] === 1024); + const descriptor = desc ? await desc.data() : []; + obj.descriptor = Array.from(descriptor); + resT.forEach((t10) => Ft(t10)); + } + last4[idx] = obj; + lastCount2 = count2; + resolve(obj); + }); +} + +// src/face/mask.ts +var expandFact = 0.1; +var alpha = 0.5; +function insidePoly(x6, y, polygon) { + let inside = false; + let j = polygon.length - 1; + for (let i = 0; i < polygon.length; j = i++) { + if (polygon[i].y > y !== polygon[j].y > y && x6 < (polygon[j].x - polygon[i].x) * (y - polygon[i].y) / (polygon[j].y - polygon[i].y) + polygon[i].x) + inside = !inside; + } + return inside; +} +async function mask(face4) { + if (!face4.tensor) + return face4.tensor; + if (!face4.mesh || face4.mesh.length < 100) + return face4.tensor; + const width = face4.tensor.shape[2] || 0; + const height = face4.tensor.shape[1] || 0; + const buffer = await face4.tensor.buffer(); + let silhouette = []; + for (const pt of meshAnnotations.silhouette) + silhouette.push({ x: (face4.mesh[pt][0] - face4.box[0]) / face4.box[2], y: (face4.mesh[pt][1] - face4.box[1]) / face4.box[3] }); + if (expandFact && expandFact > 0) + silhouette = silhouette.map((pt) => ({ x: pt.x > 0.5 ? pt.x + expandFact : pt.x - expandFact, y: pt.y > 0.5 ? pt.y + expandFact : pt.y - expandFact })); + for (let x6 = 0; x6 < width; x6++) { + for (let y = 0; y < height; y++) { + const inside = insidePoly(x6 / width, y / width, silhouette); + if (!inside) { + buffer.set(alpha * buffer.get(0, y, x6, 0), 0, y, x6, 0); + buffer.set(alpha * buffer.get(0, y, x6, 1), 0, y, x6, 1); + buffer.set(alpha * buffer.get(0, y, x6, 2), 0, y, x6, 2); + } + } + } + const output = buffer.toTensor(); + return output; +} + +// src/face/antispoof.ts +var model10; +var cached = []; +var skipped6 = Number.MAX_SAFE_INTEGER; +var lastCount3 = 0; +var lastTime6 = 0; +async function load8(config3) { + var _a2; + if (env.initial) + model10 = null; + if (!model10) + model10 = await loadModel((_a2 = config3.face.antispoof) == null ? void 0 : _a2.modelPath); + else if (config3.debug) + log("cached model:", model10["modelUrl"]); + return model10; +} +async function predict7(image, config3, idx, count2) { + var _a2, _b; + if (!(model10 == null ? void 0 : model10["executor"])) + return 0; + const skipTime = (((_a2 = config3.face.antispoof) == null ? void 0 : _a2.skipTime) || 0) > now() - lastTime6; + const skipFrame = skipped6 < (((_b = config3.face.antispoof) == null ? void 0 : _b.skipFrames) || 0); + if (config3.skipAllowed && skipTime && skipFrame && lastCount3 === count2 && cached[idx]) { + skipped6++; + return cached[idx]; + } + skipped6 = 0; + return new Promise(async (resolve) => { + const resize = zq.resizeBilinear(image, [(model10 == null ? void 0 : model10.inputs[0].shape) ? model10.inputs[0].shape[2] : 0, (model10 == null ? void 0 : model10.inputs[0].shape) ? model10.inputs[0].shape[1] : 0], false); + const res = model10 == null ? void 0 : model10.execute(resize); + const num = (await res.data())[0]; + cached[idx] = Math.round(100 * num) / 100; + lastCount3 = count2; + lastTime6 = now(); + Ft([resize, res]); + resolve(cached[idx]); + }); +} + +// src/face/liveness.ts +var model11; +var cached2 = []; +var skipped7 = Number.MAX_SAFE_INTEGER; +var lastCount4 = 0; +var lastTime7 = 0; +async function load9(config3) { + var _a2; + if (env.initial) + model11 = null; + if (!model11) + model11 = await loadModel((_a2 = config3.face.liveness) == null ? void 0 : _a2.modelPath); + else if (config3.debug) + log("cached model:", model11["modelUrl"]); + return model11; +} +async function predict8(image, config3, idx, count2) { + var _a2, _b; + if (!(model11 == null ? void 0 : model11["executor"])) + return 0; + const skipTime = (((_a2 = config3.face.liveness) == null ? void 0 : _a2.skipTime) || 0) > now() - lastTime7; + const skipFrame = skipped7 < (((_b = config3.face.liveness) == null ? void 0 : _b.skipFrames) || 0); + if (config3.skipAllowed && skipTime && skipFrame && lastCount4 === count2 && cached2[idx]) { + skipped7++; + return cached2[idx]; + } + skipped7 = 0; + return new Promise(async (resolve) => { + const resize = zq.resizeBilinear(image, [(model11 == null ? void 0 : model11.inputs[0].shape) ? model11.inputs[0].shape[2] : 0, (model11 == null ? void 0 : model11.inputs[0].shape) ? model11.inputs[0].shape[1] : 0], false); + const res = model11 == null ? void 0 : model11.execute(resize); + const num = (await res.data())[0]; + cached2[idx] = Math.round(100 * num) / 100; + lastCount4 = count2; + lastTime7 = now(); + Ft([resize, res]); + resolve(cached2[idx]); + }); +} + +// src/gear/gear.ts +var model12; +var last5 = []; +var raceNames = ["white", "black", "asian", "indian", "other"]; +var ageWeights = [15, 23, 28, 35.5, 45.5, 55.5, 65]; +var lastCount5 = 0; +var lastTime8 = 0; +var skipped8 = Number.MAX_SAFE_INTEGER; +async function load10(config3) { + var _a2; + if (env.initial) + model12 = null; + if (!model12) + model12 = await loadModel((_a2 = config3.face.gear) == null ? void 0 : _a2.modelPath); + else if (config3.debug) + log("cached model:", model12["modelUrl"]); + return model12; +} +async function predict9(image, config3, idx, count2) { + var _a2, _b; + if (!model12) + return { age: 0, gender: "unknown", genderScore: 0, race: [] }; + const skipFrame = skipped8 < (((_a2 = config3.face.gear) == null ? void 0 : _a2.skipFrames) || 0); + const skipTime = (((_b = config3.face.gear) == null ? void 0 : _b.skipTime) || 0) > now() - lastTime8; + if (config3.skipAllowed && skipTime && skipFrame && lastCount5 === count2 && last5[idx]) { + skipped8++; + return last5[idx]; + } + skipped8 = 0; + return new Promise(async (resolve) => { + var _a3, _b2; + if (!(model12 == null ? void 0 : model12.inputs[0].shape)) + return; + const t10 = {}; + const box = [[0, 0.1, 0.9, 0.9]]; + t10.resize = zq.cropAndResize(image, box, [0], [model12.inputs[0].shape[2], model12.inputs[0].shape[1]]); + const obj = { age: 0, gender: "unknown", genderScore: 0, race: [] }; + if ((_a3 = config3.face.gear) == null ? void 0 : _a3.enabled) + [t10.age, t10.gender, t10.race] = model12.execute(t10.resize, ["age_output", "gender_output", "race_output"]); + const gender2 = await t10.gender.data(); + obj.gender = gender2[0] > gender2[1] ? "male" : "female"; + obj.genderScore = Math.round(100 * (gender2[0] > gender2[1] ? gender2[0] : gender2[1])) / 100; + const race = await t10.race.data(); + for (let i = 0; i < race.length; i++) { + if (race[i] > (((_b2 = config3.face.gear) == null ? void 0 : _b2.minConfidence) || 0.2)) + obj.race.push({ score: Math.round(100 * race[i]) / 100, race: raceNames[i] }); + } + obj.race.sort((a, b) => b.score - a.score); + const ageDistribution = Array.from(await t10.age.data()); + const ageSorted = ageDistribution.map((a, i) => [ageWeights[i], a]).sort((a, b) => b[1] - a[1]); + let age2 = ageSorted[0][0]; + for (let i = 1; i < ageSorted.length; i++) + age2 += ageSorted[i][1] * (ageSorted[i][0] - age2); + obj.age = Math.round(10 * age2) / 10; + Object.keys(t10).forEach((tensor) => Ft(t10[tensor])); + last5[idx] = obj; + lastCount5 = count2; + lastTime8 = now(); + resolve(obj); + }); +} + +// src/gear/ssrnet-age.ts +var model13; +var last6 = []; +var lastCount6 = 0; +var lastTime9 = 0; +var skipped9 = Number.MAX_SAFE_INTEGER; +async function load11(config3) { + if (env.initial) + model13 = null; + if (!model13) + model13 = await loadModel(config3.face["ssrnet"].modelPathAge); + else if (config3.debug) + log("cached model:", model13["modelUrl"]); + return model13; +} +async function predict10(image, config3, idx, count2) { + var _a2, _b, _c2, _d2; + if (!model13) + return { age: 0 }; + const skipFrame = skipped9 < (((_a2 = config3.face["ssrnet"]) == null ? void 0 : _a2.skipFrames) || 0); + const skipTime = (((_b = config3.face["ssrnet"]) == null ? void 0 : _b.skipTime) || 0) > now() - lastTime9; + if (config3.skipAllowed && skipFrame && skipTime && lastCount6 === count2 && ((_c2 = last6[idx]) == null ? void 0 : _c2.age) && ((_d2 = last6[idx]) == null ? void 0 : _d2.age) > 0) { + skipped9++; + return last6[idx]; + } + skipped9 = 0; + return new Promise(async (resolve) => { + var _a3; + if (!(model13 == null ? void 0 : model13.inputs) || !model13.inputs[0] || !model13.inputs[0].shape) + return; + const t10 = {}; + t10.resize = zq.resizeBilinear(image, [model13.inputs[0].shape[2], model13.inputs[0].shape[1]], false); + t10.enhance = oe(t10.resize, constants.tf255); + const obj = { age: 0 }; + if ((_a3 = config3.face["ssrnet"]) == null ? void 0 : _a3.enabled) + t10.age = model13.execute(t10.enhance); + if (t10.age) { + const data = await t10.age.data(); + obj.age = Math.trunc(10 * data[0]) / 10; + } + Object.keys(t10).forEach((tensor) => Ft(t10[tensor])); + last6[idx] = obj; + lastCount6 = count2; + lastTime9 = now(); + resolve(obj); + }); +} + +// src/gear/ssrnet-gender.ts +var model14; +var last7 = []; +var lastCount7 = 0; +var lastTime10 = 0; +var skipped10 = Number.MAX_SAFE_INTEGER; +var rgb = [0.2989, 0.587, 0.114]; +async function load12(config3) { + var _a2; + if (env.initial) + model14 = null; + if (!model14) + model14 = await loadModel((_a2 = config3.face["ssrnet"]) == null ? void 0 : _a2.modelPathGender); + else if (config3.debug) + log("cached model:", model14["modelUrl"]); + return model14; +} +async function predict11(image, config3, idx, count2) { + var _a2, _b, _c2, _d2; + if (!model14) + return { gender: "unknown", genderScore: 0 }; + const skipFrame = skipped10 < (((_a2 = config3.face["ssrnet"]) == null ? void 0 : _a2.skipFrames) || 0); + const skipTime = (((_b = config3.face["ssrnet"]) == null ? void 0 : _b.skipTime) || 0) > now() - lastTime10; + if (config3.skipAllowed && skipFrame && skipTime && lastCount7 === count2 && ((_c2 = last7[idx]) == null ? void 0 : _c2.gender) && ((_d2 = last7[idx]) == null ? void 0 : _d2.genderScore) > 0) { + skipped10++; + return last7[idx]; + } + skipped10 = 0; + return new Promise(async (resolve) => { + var _a3; + if (!(model14 == null ? void 0 : model14.inputs[0].shape)) + return; + const t10 = {}; + t10.resize = zq.resizeBilinear(image, [model14.inputs[0].shape[2], model14.inputs[0].shape[1]], false); + t10.enhance = Ne(() => { + const [red, green, blue] = $a(t10.resize, 3, 3); + const redNorm = oe(red, rgb[0]); + const greenNorm = oe(green, rgb[1]); + const blueNorm = oe(blue, rgb[2]); + const grayscale = Wv([redNorm, greenNorm, blueNorm]); + const normalize2 = oe(ke(grayscale, constants.tf05), 2); + return normalize2; + }); + const obj = { gender: "unknown", genderScore: 0 }; + if ((_a3 = config3.face["ssrnet"]) == null ? void 0 : _a3.enabled) + t10.gender = model14.execute(t10.enhance); + const data = await t10.gender.data(); + obj.gender = data[0] > data[1] ? "female" : "male"; + obj.genderScore = data[0] > data[1] ? Math.trunc(100 * data[0]) / 100 : Math.trunc(100 * data[1]) / 100; + Object.keys(t10).forEach((tensor) => Ft(t10[tensor])); + last7[idx] = obj; + lastCount7 = count2; + lastTime10 = now(); + resolve(obj); + }); +} + +// src/face/mobilefacenet.ts +var model15; +var last8 = []; +var lastCount8 = 0; +var lastTime11 = 0; +var skipped11 = Number.MAX_SAFE_INTEGER; +async function load13(config3) { + var _a2; + if (env.initial) + model15 = null; + if (!model15) + model15 = await loadModel((_a2 = config3.face["mobilefacenet"]) == null ? void 0 : _a2.modelPath); + else if (config3.debug) + log("cached model:", model15["modelUrl"]); + return model15; +} +async function predict12(input, config3, idx, count2) { + var _a2, _b; + if (!(model15 == null ? void 0 : model15["executor"])) + return []; + const skipFrame = skipped11 < (((_a2 = config3.face["mobilefacenet"]) == null ? void 0 : _a2.skipFrames) || 0); + const skipTime = (((_b = config3.face["mobilefacenet"]) == null ? void 0 : _b.skipTime) || 0) > now() - lastTime11; + if (config3.skipAllowed && skipTime && skipFrame && lastCount8 === count2 && last8[idx]) { + skipped11++; + return last8[idx]; + } + return new Promise(async (resolve) => { + var _a3; + let data = []; + if (((_a3 = config3.face["mobilefacenet"]) == null ? void 0 : _a3.enabled) && (model15 == null ? void 0 : model15.inputs[0].shape)) { + const t10 = {}; + t10.crop = zq.resizeBilinear(input, [model15.inputs[0].shape[2], model15.inputs[0].shape[1]], false); + t10.data = model15.execute(t10.crop); + const output = await t10.data.data(); + data = Array.from(output); + Object.keys(t10).forEach((tensor) => Ft(t10[tensor])); + } + last8[idx] = data; + lastCount8 = count2; + lastTime11 = now(); + resolve(data); + }); +} + +// src/face/insightface.ts +var model16; +var last9 = []; +var lastCount9 = 0; +var lastTime12 = 0; +var skipped12 = Number.MAX_SAFE_INTEGER; +async function load14(config3) { + if (env.initial) + model16 = null; + if (!model16) + model16 = await loadModel(config3.face["insightface"].modelPath); + else if (config3.debug) + log("cached model:", model16["modelUrl"]); + return model16; +} +async function predict13(input, config3, idx, count2) { + var _a2, _b; + if (!(model16 == null ? void 0 : model16["executor"])) + return []; + const skipFrame = skipped12 < (((_a2 = config3.face["insightface"]) == null ? void 0 : _a2.skipFrames) || 0); + const skipTime = (((_b = config3.face["insightface"]) == null ? void 0 : _b.skipTime) || 0) > now() - lastTime12; + if (config3.skipAllowed && skipTime && skipFrame && lastCount9 === count2 && last9[idx]) { + skipped12++; + return last9[idx]; + } + return new Promise(async (resolve) => { + var _a3; + let data = []; + if (((_a3 = config3.face["insightface"]) == null ? void 0 : _a3.enabled) && (model16 == null ? void 0 : model16.inputs[0].shape)) { + const t10 = {}; + t10.crop = zq.resizeBilinear(input, [model16.inputs[0].shape[2], model16.inputs[0].shape[1]], false); + t10.data = model16.execute(t10.crop); + const output = await t10.data.data(); + data = Array.from(output); + Object.keys(t10).forEach((tensor) => Ft(t10[tensor])); + } + last9[idx] = data; + lastCount9 = count2; + lastTime12 = now(); + resolve(data); + }); +} + +// src/face/angles.ts +var calculateGaze = (face4) => { + const radians = (pt1, pt2) => Math.atan2(pt1[1] - pt2[1], pt1[0] - pt2[0]); + if (!face4.annotations.rightEyeIris || !face4.annotations.leftEyeIris) + return { bearing: 0, strength: 0 }; + const offsetIris = [0, -0.1]; + const eyeRatio = 1; + const left = (face4.mesh[33][2] || 0) > (face4.mesh[263][2] || 0); + const irisCenter = left ? face4.mesh[473] : face4.mesh[468]; + const eyeCenter = left ? [(face4.mesh[133][0] + face4.mesh[33][0]) / 2, (face4.mesh[133][1] + face4.mesh[33][1]) / 2] : [(face4.mesh[263][0] + face4.mesh[362][0]) / 2, (face4.mesh[263][1] + face4.mesh[362][1]) / 2]; + const eyeSize = left ? [face4.mesh[133][0] - face4.mesh[33][0], face4.mesh[23][1] - face4.mesh[27][1]] : [face4.mesh[263][0] - face4.mesh[362][0], face4.mesh[253][1] - face4.mesh[257][1]]; + const eyeDiff = [ + (eyeCenter[0] - irisCenter[0]) / eyeSize[0] - offsetIris[0], + eyeRatio * (irisCenter[1] - eyeCenter[1]) / eyeSize[1] - offsetIris[1] + ]; + let strength = Math.sqrt(eyeDiff[0] * eyeDiff[0] + eyeDiff[1] * eyeDiff[1]); + strength = Math.min(strength, face4.boxRaw[2] / 2, face4.boxRaw[3] / 2); + const bearing = (radians([0, 0], eyeDiff) + Math.PI / 2) % Math.PI; + return { bearing, strength }; +}; +var calculateFaceAngle = (face4, imageSize) => { + const normalize2 = (v6) => { + const length = Math.sqrt(v6[0] * v6[0] + v6[1] * v6[1] + v6[2] * v6[2]); + v6[0] /= length; + v6[1] /= length; + v6[2] /= length; + return v6; + }; + const subVectors = (a, b) => { + const x6 = a[0] - b[0]; + const y = a[1] - b[1]; + const z10 = a[2] - b[2]; + return [x6, y, z10]; + }; + const crossVectors = (a, b) => { + const x6 = a[1] * b[2] - a[2] * b[1]; + const y = a[2] * b[0] - a[0] * b[2]; + const z10 = a[0] * b[1] - a[1] * b[0]; + return [x6, y, z10]; + }; + const rotationMatrixToEulerAngle = (r) => { + const [r00, _r01, _r02, r10, r11, r12, r20, r21, r22] = r; + let thetaX; + let thetaY; + let thetaZ; + if (r10 < 1) { + if (r10 > -1) { + thetaZ = Math.asin(r10); + thetaY = Math.atan2(-r20, r00); + thetaX = Math.atan2(-r12, r11); + } else { + thetaZ = -Math.PI / 2; + thetaY = -Math.atan2(r21, r22); + thetaX = 0; + } + } else { + thetaZ = Math.PI / 2; + thetaY = Math.atan2(r21, r22); + thetaX = 0; + } + if (Number.isNaN(thetaX)) + thetaX = 0; + if (Number.isNaN(thetaY)) + thetaY = 0; + if (Number.isNaN(thetaZ)) + thetaZ = 0; + return { pitch: 2 * -thetaX, yaw: 2 * -thetaY, roll: 2 * -thetaZ }; + }; + const mesh = face4.meshRaw; + if (!mesh || mesh.length < 300) + return { angle: { pitch: 0, yaw: 0, roll: 0 }, matrix: [1, 0, 0, 0, 1, 0, 0, 0, 1], gaze: { bearing: 0, strength: 0 } }; + const size2 = Math.max(face4.boxRaw[2] * imageSize[0], face4.boxRaw[3] * imageSize[1]) / 1.5; + const pts = [mesh[10], mesh[152], mesh[234], mesh[454]].map((pt) => [pt[0] * imageSize[0] / size2, pt[1] * imageSize[1] / size2, pt[2]]); + const yAxis = normalize2(subVectors(pts[1], pts[0])); + let xAxis = normalize2(subVectors(pts[3], pts[2])); + const zAxis = normalize2(crossVectors(xAxis, yAxis)); + xAxis = crossVectors(yAxis, zAxis); + const matrix = [ + xAxis[0], + xAxis[1], + xAxis[2], + yAxis[0], + yAxis[1], + yAxis[2], + zAxis[0], + zAxis[1], + zAxis[2] + ]; + const angle = rotationMatrixToEulerAngle(matrix); + const gaze = mesh.length === 478 ? calculateGaze(face4) : { bearing: 0, strength: 0 }; + return { angle, matrix, gaze }; +}; + +// src/face/anthropometry.ts +function calculateCameraDistance(face4, width) { + const f = face4 == null ? void 0 : face4.annotations; + if (!f) + return 0; + const irisSize = Math.max(Math.abs(f.leftEyeIris[3][0] - f.leftEyeIris[1][0]), Math.abs(f.rightEyeIris[3][0] - f.rightEyeIris[1][0])) / width; + const cameraDistance = Math.round(1.17 / irisSize) / 100; + return cameraDistance; +} + +// src/face/face.ts +var detectFace = async (instance, input) => { + var _a2, _b, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j2, _k2, _l2, _m, _n2, _o2, _p2, _q2, _r2, _s2, _t, _u2, _v2, _w2; + let timeStamp = now(); + let ageRes; + let gearRes; + let genderRes; + let emotionRes; + let mobilefacenetRes; + let insightfaceRes; + let antispoofRes; + let livenessRes; + let descRes; + const faceRes = []; + instance.state = "run:face"; + const faces = await predict4(input, instance.config); + instance.performance.face = env.perfadd ? (instance.performance.face || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); + if (!input.shape || input.shape.length !== 4) + return []; + if (!faces) + return []; + for (let i = 0; i < faces.length; i++) { + instance.analyze("Get Face"); + if (!faces[i].tensor || faces[i].tensor.isDisposedInternal) { + log("Face object is disposed:", faces[i].tensor); + continue; + } + if ((_a2 = instance.config.face.detector) == null ? void 0 : _a2.mask) { + const masked = await mask(faces[i]); + Ft(faces[i].tensor); + if (masked) + faces[i].tensor = masked; + } + const rotation = faces[i].mesh && faces[i].mesh.length > 200 ? calculateFaceAngle(faces[i], [input.shape[2], input.shape[1]]) : null; + instance.analyze("Start Emotion:"); + if (instance.config.async) { + emotionRes = ((_b = instance.config.face.emotion) == null ? void 0 : _b.enabled) ? predict5(faces[i].tensor || nr([]), instance.config, i, faces.length) : []; + } else { + instance.state = "run:emotion"; + timeStamp = now(); + emotionRes = ((_c2 = instance.config.face.emotion) == null ? void 0 : _c2.enabled) ? await predict5(faces[i].tensor || nr([]), instance.config, i, faces.length) : []; + instance.performance.emotion = env.perfadd ? (instance.performance.emotion || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); + } + instance.analyze("End Emotion:"); + instance.analyze("Start AntiSpoof:"); + if (instance.config.async) { + antispoofRes = ((_d2 = instance.config.face.antispoof) == null ? void 0 : _d2.enabled) ? predict7(faces[i].tensor || nr([]), instance.config, i, faces.length) : 0; + } else { + instance.state = "run:antispoof"; + timeStamp = now(); + antispoofRes = ((_e2 = instance.config.face.antispoof) == null ? void 0 : _e2.enabled) ? await predict7(faces[i].tensor || nr([]), instance.config, i, faces.length) : 0; + instance.performance.antispoof = env.perfadd ? (instance.performance.antispoof || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); + } + instance.analyze("End AntiSpoof:"); + instance.analyze("Start Liveness:"); + if (instance.config.async) { + livenessRes = ((_f2 = instance.config.face.liveness) == null ? void 0 : _f2.enabled) ? predict8(faces[i].tensor || nr([]), instance.config, i, faces.length) : 0; + } else { + instance.state = "run:liveness"; + timeStamp = now(); + livenessRes = ((_g2 = instance.config.face.liveness) == null ? void 0 : _g2.enabled) ? await predict8(faces[i].tensor || nr([]), instance.config, i, faces.length) : 0; + instance.performance.liveness = env.perfadd ? (instance.performance.antispoof || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); + } + instance.analyze("End Liveness:"); + instance.analyze("Start GEAR:"); + if (instance.config.async) { + gearRes = ((_h2 = instance.config.face.gear) == null ? void 0 : _h2.enabled) ? predict9(faces[i].tensor || nr([]), instance.config, i, faces.length) : null; + } else { + instance.state = "run:gear"; + timeStamp = now(); + gearRes = ((_i2 = instance.config.face.gear) == null ? void 0 : _i2.enabled) ? await predict9(faces[i].tensor || nr([]), instance.config, i, faces.length) : null; + instance.performance.gear = Math.trunc(now() - timeStamp); + } + instance.analyze("End GEAR:"); + instance.analyze("Start SSRNet:"); + if (instance.config.async) { + ageRes = ((_j2 = instance.config.face["ssrnet"]) == null ? void 0 : _j2.enabled) ? predict10(faces[i].tensor || nr([]), instance.config, i, faces.length) : null; + genderRes = ((_k2 = instance.config.face["ssrnet"]) == null ? void 0 : _k2.enabled) ? predict11(faces[i].tensor || nr([]), instance.config, i, faces.length) : null; + } else { + instance.state = "run:ssrnet"; + timeStamp = now(); + ageRes = ((_l2 = instance.config.face["ssrnet"]) == null ? void 0 : _l2.enabled) ? await predict10(faces[i].tensor || nr([]), instance.config, i, faces.length) : null; + genderRes = ((_m = instance.config.face["ssrnet"]) == null ? void 0 : _m.enabled) ? await predict11(faces[i].tensor || nr([]), instance.config, i, faces.length) : null; + instance.performance.ssrnet = Math.trunc(now() - timeStamp); + } + instance.analyze("End SSRNet:"); + instance.analyze("Start MobileFaceNet:"); + if (instance.config.async) { + mobilefacenetRes = ((_n2 = instance.config.face["mobilefacenet"]) == null ? void 0 : _n2.enabled) ? predict12(faces[i].tensor || nr([]), instance.config, i, faces.length) : null; + } else { + instance.state = "run:mobilefacenet"; + timeStamp = now(); + mobilefacenetRes = ((_o2 = instance.config.face["mobilefacenet"]) == null ? void 0 : _o2.enabled) ? await predict12(faces[i].tensor || nr([]), instance.config, i, faces.length) : null; + instance.performance.mobilefacenet = Math.trunc(now() - timeStamp); + } + instance.analyze("End MobileFaceNet:"); + instance.analyze("Start InsightFace:"); + if (instance.config.async) { + insightfaceRes = ((_p2 = instance.config.face["insightface"]) == null ? void 0 : _p2.enabled) ? predict13(faces[i].tensor || nr([]), instance.config, i, faces.length) : null; + } else { + instance.state = "run:mobilefacenet"; + timeStamp = now(); + insightfaceRes = ((_q2 = instance.config.face["insightface"]) == null ? void 0 : _q2.enabled) ? await predict13(faces[i].tensor || nr([]), instance.config, i, faces.length) : null; + instance.performance.mobilefacenet = Math.trunc(now() - timeStamp); + } + instance.analyze("End InsightFace:"); + instance.analyze("Start Description:"); + if (instance.config.async) { + descRes = predict6(faces[i].tensor || nr([]), instance.config, i, faces.length); + } else { + instance.state = "run:description"; + timeStamp = now(); + descRes = await predict6(faces[i].tensor || nr([]), instance.config, i, faces.length); + instance.performance.description = env.perfadd ? (instance.performance.description || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); + } + instance.analyze("End Description:"); + if (instance.config.async) { + [ageRes, genderRes, emotionRes, mobilefacenetRes, insightfaceRes, descRes, gearRes, antispoofRes, livenessRes] = await Promise.all([ageRes, genderRes, emotionRes, mobilefacenetRes, insightfaceRes, descRes, gearRes, antispoofRes, livenessRes]); + } + instance.analyze("Finish Face:"); + if (((_r2 = instance.config.face["ssrnet"]) == null ? void 0 : _r2.enabled) && ageRes && genderRes) { + descRes = { + ...descRes, + age: ageRes.age, + gender: genderRes.gender, + genderScore: genderRes.genderScore + }; + } + if (((_s2 = instance.config.face.gear) == null ? void 0 : _s2.enabled) && gearRes) { + descRes = { + ...descRes, + age: gearRes.age, + gender: gearRes.gender, + genderScore: gearRes.genderScore, + race: gearRes.race + }; + } + if (((_t = instance.config.face["mobilefacenet"]) == null ? void 0 : _t.enabled) && mobilefacenetRes) { + descRes.descriptor = mobilefacenetRes; + } + if (((_u2 = instance.config.face["insightface"]) == null ? void 0 : _u2.enabled) && insightfaceRes) { + descRes.descriptor = insightfaceRes; + } + const irisSize = ((_v2 = instance.config.face.iris) == null ? void 0 : _v2.enabled) ? calculateCameraDistance(faces[i], input.shape[2]) : 0; + const tensor = ((_w2 = instance.config.face.detector) == null ? void 0 : _w2.return) ? jp(faces[i].tensor) : null; + Ft(faces[i].tensor); + if (faces[i].tensor) + delete faces[i].tensor; + const res = { + ...faces[i], + id: i + }; + if (descRes.age) + res.age = descRes.age; + if (descRes.gender) + res.gender = descRes.gender; + if (descRes.genderScore) + res.genderScore = descRes.genderScore; + if (descRes.descriptor) + res.embedding = descRes.descriptor; + if (descRes.race) + res.race = descRes.race; + if (emotionRes) + res.emotion = emotionRes; + if (antispoofRes) + res.real = antispoofRes; + if (livenessRes) + res.live = livenessRes; + if (irisSize > 0) + res.distance = irisSize; + if (rotation) + res.rotation = rotation; + if (tensor) + res.tensor = tensor; + faceRes.push(res); + instance.analyze("End Face"); + } + instance.analyze("End FaceMesh:"); + if (instance.config.async) { + if (instance.performance.face) + delete instance.performance.face; + if (instance.performance.age) + delete instance.performance.age; + if (instance.performance.gender) + delete instance.performance.gender; + if (instance.performance.emotion) + delete instance.performance.emotion; + } + return faceRes; +}; + +// src/hand/fingerdef.ts +var Finger = { + thumb: 0, + index: 1, + middle: 2, + ring: 3, + pinky: 4, + all: [0, 1, 2, 3, 4], + nameMapping: { 0: "thumb", 1: "index", 2: "middle", 3: "ring", 4: "pinky" }, + pointsMapping: { + 0: [[0, 1], [1, 2], [2, 3], [3, 4]], + 1: [[0, 5], [5, 6], [6, 7], [7, 8]], + 2: [[0, 9], [9, 10], [10, 11], [11, 12]], + 3: [[0, 13], [13, 14], [14, 15], [15, 16]], + 4: [[0, 17], [17, 18], [18, 19], [19, 20]] + }, + getName: (value) => Finger.nameMapping[value], + getPoints: (value) => Finger.pointsMapping[value] +}; +var FingerCurl = { + none: 0, + half: 1, + full: 2, + nameMapping: { 0: "none", 1: "half", 2: "full" }, + getName: (value) => FingerCurl.nameMapping[value] +}; +var FingerDirection = { + verticalUp: 0, + verticalDown: 1, + horizontalLeft: 2, + horizontalRight: 3, + diagonalUpRight: 4, + diagonalUpLeft: 5, + diagonalDownRight: 6, + diagonalDownLeft: 7, + nameMapping: { 0: "verticalUp", 1: "verticalDown", 2: "horizontalLeft", 3: "horizontalRight", 4: "diagonalUpRight", 5: "diagonalUpLeft", 6: "diagonalDownRight", 7: "diagonalDownLeft" }, + getName: (value) => FingerDirection.nameMapping[value] +}; +var FingerGesture = class { + constructor(name) { + __publicField(this, "name"); + __publicField(this, "curls"); + __publicField(this, "directions"); + __publicField(this, "weights"); + __publicField(this, "weightsRelative"); + this.name = name; + this.curls = {}; + this.directions = {}; + this.weights = [1, 1, 1, 1, 1]; + this.weightsRelative = [1, 1, 1, 1, 1]; + } + curl(finger, curl, confidence) { + if (typeof this.curls[finger] === "undefined") + this.curls[finger] = []; + this.curls[finger].push([curl, confidence]); + } + direction(finger, position, confidence) { + if (!this.directions[finger]) + this.directions[finger] = []; + this.directions[finger].push([position, confidence]); + } + weight(finger, weight) { + this.weights[finger] = weight; + const total = this.weights.reduce((a, b) => a + b, 0); + this.weightsRelative = this.weights.map((el2) => el2 * 5 / total); + } + matchAgainst(detectedCurls, detectedDirections) { + let confidence = 0; + for (const fingerIdx in detectedCurls) { + const detectedCurl = detectedCurls[fingerIdx]; + const expectedCurls = this.curls[fingerIdx]; + if (typeof expectedCurls === "undefined") { + confidence += this.weightsRelative[fingerIdx]; + continue; + } + for (const [expectedCurl, score] of expectedCurls) { + if (detectedCurl === expectedCurl) { + confidence += score * this.weightsRelative[fingerIdx]; + break; + } + } + } + for (const fingerIdx in detectedDirections) { + const detectedDirection = detectedDirections[fingerIdx]; + const expectedDirections = this.directions[fingerIdx]; + if (typeof expectedDirections === "undefined") { + confidence += this.weightsRelative[fingerIdx]; + continue; + } + for (const [expectedDirection, score] of expectedDirections) { + if (detectedDirection === expectedDirection) { + confidence += score * this.weightsRelative[fingerIdx]; + break; + } + } + } + return confidence / 10; + } +}; + +// src/hand/fingergesture.ts +var { thumb, index, middle, ring, pinky } = Finger; +var { none, half, full } = FingerCurl; +var { verticalUp, verticalDown, horizontalLeft, horizontalRight, diagonalUpRight, diagonalUpLeft, diagonalDownRight, diagonalDownLeft } = FingerDirection; +var ThumbsUp = new FingerGesture("thumbs up"); +ThumbsUp.curl(thumb, none, 1); +ThumbsUp.direction(thumb, verticalUp, 1); +ThumbsUp.direction(thumb, diagonalUpLeft, 0.25); +ThumbsUp.direction(thumb, diagonalUpRight, 0.25); +for (const finger of [Finger.index, Finger.middle, Finger.ring, Finger.pinky]) { + ThumbsUp.curl(finger, full, 1); + ThumbsUp.direction(finger, horizontalLeft, 1); + ThumbsUp.direction(finger, horizontalRight, 1); +} +var Victory = new FingerGesture("victory"); +Victory.curl(thumb, half, 0.5); +Victory.curl(thumb, none, 0.5); +Victory.direction(thumb, verticalUp, 1); +Victory.direction(thumb, diagonalUpLeft, 1); +Victory.curl(index, none, 1); +Victory.direction(index, verticalUp, 0.75); +Victory.direction(index, diagonalUpLeft, 1); +Victory.curl(middle, none, 1); +Victory.direction(middle, verticalUp, 1); +Victory.direction(middle, diagonalUpLeft, 0.75); +Victory.curl(ring, full, 1); +Victory.direction(ring, verticalUp, 0.2); +Victory.direction(ring, diagonalUpLeft, 1); +Victory.direction(ring, horizontalLeft, 0.2); +Victory.curl(pinky, full, 1); +Victory.direction(pinky, verticalUp, 0.2); +Victory.direction(pinky, diagonalUpLeft, 1); +Victory.direction(pinky, horizontalLeft, 0.2); +Victory.weight(index, 2); +Victory.weight(middle, 2); +var Point = new FingerGesture("point"); +Point.curl(thumb, full, 1); +Point.curl(index, none, 0.5); +Point.curl(middle, full, 0.5); +Point.curl(ring, full, 0.5); +Point.curl(pinky, full, 0.5); +Point.weight(index, 2); +Point.weight(middle, 2); +var MiddleFinger = new FingerGesture("middle finger"); +MiddleFinger.curl(thumb, none, 1); +MiddleFinger.curl(index, full, 0.5); +MiddleFinger.curl(middle, full, 0.5); +MiddleFinger.curl(ring, full, 0.5); +MiddleFinger.curl(pinky, full, 0.5); +MiddleFinger.weight(index, 2); +MiddleFinger.weight(middle, 2); +var OpenPalm = new FingerGesture("open palm"); +OpenPalm.curl(thumb, none, 0.75); +OpenPalm.curl(index, none, 0.75); +OpenPalm.curl(middle, none, 0.75); +OpenPalm.curl(ring, none, 0.75); +OpenPalm.curl(pinky, none, 0.75); +var fingergesture_default = [ThumbsUp, Victory, Point, MiddleFinger, OpenPalm]; + +// src/hand/fingerpose.ts +var minConfidence = 0.7; +var options3 = { + HALF_CURL_START_LIMIT: 60, + NO_CURL_START_LIMIT: 130, + DISTANCE_VOTE_POWER: 1.1, + SINGLE_ANGLE_VOTE_POWER: 0.9, + TOTAL_ANGLE_VOTE_POWER: 1.6 +}; +function calculateSlope(point1x, point1y, point2x, point2y) { + const value = (point1y - point2y) / (point1x - point2x); + let slope = Math.atan(value) * 180 / Math.PI; + if (slope <= 0) + slope = -slope; + else if (slope > 0) + slope = 180 - slope; + return slope; +} +function getSlopes(point1, point2) { + if (!point1 || !point2) + return [0, 0]; + const slopeXY = calculateSlope(point1[0], point1[1], point2[0], point2[1]); + if (point1.length === 2) + return slopeXY; + const slopeYZ = calculateSlope(point1[1], point1[2], point2[1], point2[2]); + return [slopeXY, slopeYZ]; +} +function angleOrientationAt(angle, weightageAt = 1) { + let isVertical = 0; + let isDiagonal = 0; + let isHorizontal = 0; + if (angle >= 75 && angle <= 105) + isVertical = 1 * weightageAt; + else if (angle >= 25 && angle <= 155) + isDiagonal = 1 * weightageAt; + else + isHorizontal = 1 * weightageAt; + return [isVertical, isDiagonal, isHorizontal]; +} +function estimateFingerCurl(startPoint, midPoint, endPoint) { + const start_mid_x_dist = startPoint[0] - midPoint[0]; + const start_end_x_dist = startPoint[0] - endPoint[0]; + const mid_end_x_dist = midPoint[0] - endPoint[0]; + const start_mid_y_dist = startPoint[1] - midPoint[1]; + const start_end_y_dist = startPoint[1] - endPoint[1]; + const mid_end_y_dist = midPoint[1] - endPoint[1]; + const start_mid_z_dist = startPoint[2] - midPoint[2]; + const start_end_z_dist = startPoint[2] - endPoint[2]; + const mid_end_z_dist = midPoint[2] - endPoint[2]; + const start_mid_dist = Math.sqrt(start_mid_x_dist * start_mid_x_dist + start_mid_y_dist * start_mid_y_dist + start_mid_z_dist * start_mid_z_dist); + const start_end_dist = Math.sqrt(start_end_x_dist * start_end_x_dist + start_end_y_dist * start_end_y_dist + start_end_z_dist * start_end_z_dist); + const mid_end_dist = Math.sqrt(mid_end_x_dist * mid_end_x_dist + mid_end_y_dist * mid_end_y_dist + mid_end_z_dist * mid_end_z_dist); + let cos_in = (mid_end_dist * mid_end_dist + start_mid_dist * start_mid_dist - start_end_dist * start_end_dist) / (2 * mid_end_dist * start_mid_dist); + if (cos_in > 1) + cos_in = 1; + else if (cos_in < -1) + cos_in = -1; + let angleOfCurve = Math.acos(cos_in); + angleOfCurve = 57.2958 * angleOfCurve % 180; + let fingerCurl; + if (angleOfCurve > options3.NO_CURL_START_LIMIT) + fingerCurl = FingerCurl.none; + else if (angleOfCurve > options3.HALF_CURL_START_LIMIT) + fingerCurl = FingerCurl.half; + else + fingerCurl = FingerCurl.full; + return fingerCurl; +} +function estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x) { + let estimatedDirection; + if (max_dist_x === Math.abs(start_end_x_dist)) { + if (start_end_x_dist > 0) + estimatedDirection = FingerDirection.horizontalLeft; + else + estimatedDirection = FingerDirection.horizontalRight; + } else if (max_dist_x === Math.abs(start_mid_x_dist)) { + if (start_mid_x_dist > 0) + estimatedDirection = FingerDirection.horizontalLeft; + else + estimatedDirection = FingerDirection.horizontalRight; + } else { + if (mid_end_x_dist > 0) + estimatedDirection = FingerDirection.horizontalLeft; + else + estimatedDirection = FingerDirection.horizontalRight; + } + return estimatedDirection; +} +function estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y) { + let estimatedDirection; + if (max_dist_y === Math.abs(start_end_y_dist)) { + if (start_end_y_dist < 0) + estimatedDirection = FingerDirection.verticalDown; + else + estimatedDirection = FingerDirection.verticalUp; + } else if (max_dist_y === Math.abs(start_mid_y_dist)) { + if (start_mid_y_dist < 0) + estimatedDirection = FingerDirection.verticalDown; + else + estimatedDirection = FingerDirection.verticalUp; + } else { + if (mid_end_y_dist < 0) + estimatedDirection = FingerDirection.verticalDown; + else + estimatedDirection = FingerDirection.verticalUp; + } + return estimatedDirection; +} +function estimateDiagonalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y, start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x) { + let estimatedDirection; + const reqd_vertical_direction = estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y); + const reqd_horizontal_direction = estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x); + if (reqd_vertical_direction === FingerDirection.verticalUp) { + if (reqd_horizontal_direction === FingerDirection.horizontalLeft) + estimatedDirection = FingerDirection.diagonalUpLeft; + else + estimatedDirection = FingerDirection.diagonalUpRight; + } else { + if (reqd_horizontal_direction === FingerDirection.horizontalLeft) + estimatedDirection = FingerDirection.diagonalDownLeft; + else + estimatedDirection = FingerDirection.diagonalDownRight; + } + return estimatedDirection; +} +function calculateFingerDirection(startPoint, midPoint, endPoint, fingerSlopes) { + const start_mid_x_dist = startPoint[0] - midPoint[0]; + const start_end_x_dist = startPoint[0] - endPoint[0]; + const mid_end_x_dist = midPoint[0] - endPoint[0]; + const start_mid_y_dist = startPoint[1] - midPoint[1]; + const start_end_y_dist = startPoint[1] - endPoint[1]; + const mid_end_y_dist = midPoint[1] - endPoint[1]; + const max_dist_x = Math.max(Math.abs(start_mid_x_dist), Math.abs(start_end_x_dist), Math.abs(mid_end_x_dist)); + const max_dist_y = Math.max(Math.abs(start_mid_y_dist), Math.abs(start_end_y_dist), Math.abs(mid_end_y_dist)); + let voteVertical = 0; + let voteDiagonal = 0; + let voteHorizontal = 0; + const start_end_x_y_dist_ratio = max_dist_y / (max_dist_x + 1e-5); + if (start_end_x_y_dist_ratio > 1.5) + voteVertical += options3.DISTANCE_VOTE_POWER; + else if (start_end_x_y_dist_ratio > 0.66) + voteDiagonal += options3.DISTANCE_VOTE_POWER; + else + voteHorizontal += options3.DISTANCE_VOTE_POWER; + const start_mid_dist = Math.sqrt(start_mid_x_dist * start_mid_x_dist + start_mid_y_dist * start_mid_y_dist); + const start_end_dist = Math.sqrt(start_end_x_dist * start_end_x_dist + start_end_y_dist * start_end_y_dist); + const mid_end_dist = Math.sqrt(mid_end_x_dist * mid_end_x_dist + mid_end_y_dist * mid_end_y_dist); + const max_dist = Math.max(start_mid_dist, start_end_dist, mid_end_dist); + let calc_start_point_x = startPoint[0]; + let calc_start_point_y = startPoint[1]; + let calc_end_point_x = endPoint[0]; + let calc_end_point_y = endPoint[1]; + if (max_dist === start_mid_dist) { + calc_end_point_x = endPoint[0]; + calc_end_point_y = endPoint[1]; + } else if (max_dist === mid_end_dist) { + calc_start_point_x = midPoint[0]; + calc_start_point_y = midPoint[1]; + } + const calcStartPoint = [calc_start_point_x, calc_start_point_y]; + const calcEndPoint = [calc_end_point_x, calc_end_point_y]; + const totalAngle = getSlopes(calcStartPoint, calcEndPoint); + const votes = angleOrientationAt(totalAngle, options3.TOTAL_ANGLE_VOTE_POWER); + voteVertical += votes[0]; + voteDiagonal += votes[1]; + voteHorizontal += votes[2]; + for (const fingerSlope of fingerSlopes) { + const fingerVotes = angleOrientationAt(fingerSlope, options3.SINGLE_ANGLE_VOTE_POWER); + voteVertical += fingerVotes[0]; + voteDiagonal += fingerVotes[1]; + voteHorizontal += fingerVotes[2]; + } + let estimatedDirection; + if (voteVertical === Math.max(voteVertical, voteDiagonal, voteHorizontal)) { + estimatedDirection = estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y); + } else if (voteHorizontal === Math.max(voteDiagonal, voteHorizontal)) { + estimatedDirection = estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x); + } else { + estimatedDirection = estimateDiagonalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y, start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x); + } + return estimatedDirection; +} +function estimate(landmarks) { + const slopesXY = []; + const slopesYZ = []; + const fingerCurls = []; + const fingerDirections = []; + if (!landmarks) + return { curls: fingerCurls, directions: fingerDirections }; + for (const finger of Finger.all) { + const points = Finger.getPoints(finger); + const slopeAtXY = []; + const slopeAtYZ = []; + for (const point2 of points) { + const point1 = landmarks[point2[0]]; + const point22 = landmarks[point2[1]]; + const slopes = getSlopes(point1, point22); + const slopeXY = slopes[0]; + const slopeYZ = slopes[1]; + slopeAtXY.push(slopeXY); + slopeAtYZ.push(slopeYZ); + } + slopesXY.push(slopeAtXY); + slopesYZ.push(slopeAtYZ); + } + for (const finger of Finger.all) { + const pointIndexAt = finger === Finger.thumb ? 1 : 0; + const fingerPointsAt = Finger.getPoints(finger); + const startPoint = landmarks[fingerPointsAt[pointIndexAt][0]]; + const midPoint = landmarks[fingerPointsAt[pointIndexAt + 1][1]]; + const endPoint = landmarks[fingerPointsAt[3][1]]; + const fingerCurled = estimateFingerCurl(startPoint, midPoint, endPoint); + const fingerPosition = calculateFingerDirection(startPoint, midPoint, endPoint, slopesXY[finger].slice(pointIndexAt)); + fingerCurls[finger] = fingerCurled; + fingerDirections[finger] = fingerPosition; + } + return { curls: fingerCurls, directions: fingerDirections }; +} +function analyze(keypoints) { + if (!keypoints || keypoints.length === 0) + return null; + const estimatorRes = estimate(keypoints); + const landmarks = {}; + for (const fingerIdx of Finger.all) { + landmarks[Finger.getName(fingerIdx)] = { + curl: FingerCurl.getName(estimatorRes.curls[fingerIdx]), + direction: FingerDirection.getName(estimatorRes.directions[fingerIdx]) + }; + } + return landmarks; +} +function match(keypoints) { + const poses = []; + if (!keypoints || keypoints.length === 0) + return poses; + const estimatorRes = estimate(keypoints); + for (const gesture2 of fingergesture_default) { + const confidence = gesture2.matchAgainst(estimatorRes.curls, estimatorRes.directions); + if (confidence >= minConfidence) + poses.push({ name: gesture2.name, confidence }); + } + return poses; +} + +// src/gesture/gesture.ts +var body2 = (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[1] < nose.position[1] && rightWrist.position[1] < nose.position[1]) + gestures.push({ body: i, gesture: "i give up" }); + else if (nose && leftWrist && leftWrist.position[1] < nose.position[1]) + gestures.push({ body: i, gesture: "raise left hand" }); + else if (nose && rightWrist && rightWrist.position[1] < nose.position[1]) + 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 && Math.abs(leftShoulder.positionRaw[1] - rightShoulder.positionRaw[1]) > 0.1) { + gestures.push({ body: i, gesture: `leaning ${leftShoulder.position[1] > rightShoulder.position[1] ? "left" : "right"}` }); + } + } + return gestures; +}; +var face2 = (res) => { + if (!res) + return []; + const gestures = []; + for (let i = 0; i < res.length; i++) { + if (res[i].mesh && res[i].mesh.length > 450) { + const zDiff = (res[i].mesh[33][2] || 0) - (res[i].mesh[263][2] || 0); + const xDiff = res[i].mesh[33][0] - res[i].mesh[263][0]; + if (Math.abs(zDiff / xDiff) <= 0.15) + gestures.push({ face: i, gesture: "facing center" }); + else + gestures.push({ face: i, gesture: `facing ${zDiff < 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] || 0; + if (Math.abs(chinDepth) > 10) + gestures.push({ face: i, gesture: `head ${chinDepth < 0 ? "up" : "down"}` }); + } + } + return gestures; +}; +var iris2 = (res) => { + var _a2, _b, _c2, _d2; + if (!res) + return []; + const gestures = []; + for (let i = 0; i < res.length; i++) { + if (!((_b = (_a2 = res[i].annotations) == null ? void 0 : _a2.leftEyeIris) == null ? void 0 : _b[0]) || !((_d2 = (_c2 = res[i].annotations) == null ? void 0 : _c2.rightEyeIris) == null ? void 0 : _d2[0])) + 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 leftIrisCenterX = Math.abs(res[i].mesh[263][0] - res[i].annotations.leftEyeIris[0][0]) / res[i].box[2]; + const rightIrisCenterX = Math.abs(res[i].mesh[33][0] - res[i].annotations.rightEyeIris[0][0]) / res[i].box[2]; + if (leftIrisCenterX > 0.06 || rightIrisCenterX > 0.06) + center = false; + if (leftIrisCenterX > rightIrisCenterX) { + if (leftIrisCenterX > 0.05) + gestures.push({ iris: i, gesture: "looking right" }); + } else { + if (rightIrisCenterX > 0.05) + gestures.push({ iris: i, gesture: "looking left" }); + } + const rightIrisCenterY = Math.abs(res[i].mesh[145][1] - res[i].annotations.rightEyeIris[0][1]) / res[i].box[3]; + const leftIrisCenterY = Math.abs(res[i].mesh[374][1] - res[i].annotations.leftEyeIris[0][1]) / res[i].box[3]; + if (leftIrisCenterY < 0.01 || rightIrisCenterY < 0.01 || leftIrisCenterY > 0.022 || rightIrisCenterY > 0.022) + center = false; + if (leftIrisCenterY < 0.01 || rightIrisCenterY < 0.01) + gestures.push({ iris: i, gesture: "looking down" }); + if (leftIrisCenterY > 0.022 || rightIrisCenterY > 0.022) + gestures.push({ iris: i, gesture: "looking up" }); + if (center) + gestures.push({ iris: i, gesture: "looking center" }); + } + return gestures; +}; +var hand2 = (res) => { + if (!res) + return []; + const gestures = []; + for (let i = 0; i < res.length; i++) { + const fingers = []; + if (res[i].annotations) { + for (const [finger, pos] of Object.entries(res[i].annotations)) { + if (finger !== "palmBase" && Array.isArray(pos) && pos[0]) + fingers.push({ name: finger.toLowerCase(), position: pos[0] }); + } + } + if (fingers && fingers.length > 0) { + const closest = fingers.reduce((best, a) => (best.position[2] || 0) < (a.position[2] || 0) ? best : a); + gestures.push({ hand: i, gesture: `${closest.name} forward` }); + const highest = fingers.reduce((best, a) => best.position[1] < a.position[1] ? best : a); + gestures.push({ hand: i, gesture: `${highest.name} up` }); + } + if (res[i].keypoints) { + const poses = match(res[i].keypoints); + for (const pose of poses) + gestures.push({ hand: i, gesture: pose.name }); + } + } + return gestures; +}; + +// src/hand/handposeutil.ts +function getBoxSize2(box) { + return [ + Math.abs(box.endPoint[0] - box.startPoint[0]), + Math.abs(box.endPoint[1] - box.startPoint[1]) + ]; +} +function getBoxCenter2(box) { + return [ + box.startPoint[0] + (box.endPoint[0] - box.startPoint[0]) / 2, + box.startPoint[1] + (box.endPoint[1] - box.startPoint[1]) / 2 + ]; +} +function cutBoxFromImageAndResize(box, image, cropSize) { + const h = image.shape[1]; + const w = image.shape[2]; + const boxes = [[ + box.startPoint[1] / h, + box.startPoint[0] / w, + box.endPoint[1] / h, + box.endPoint[0] / w + ]]; + return zq.cropAndResize(image, boxes, [0], cropSize); +} +function scaleBoxCoordinates2(box, factor) { + const startPoint = [box.startPoint[0] * factor[0], box.startPoint[1] * factor[1]]; + const endPoint = [box.endPoint[0] * factor[0], box.endPoint[1] * factor[1]]; + const palmLandmarks = box.palmLandmarks.map((coord) => { + const scaledCoord = [coord[0] * factor[0], coord[1] * factor[1]]; + return scaledCoord; + }); + return { startPoint, endPoint, palmLandmarks, confidence: box.confidence }; +} +function enlargeBox2(box, factor = 1.5) { + const center = getBoxCenter2(box); + const size2 = getBoxSize2(box); + const newHalfSize = [factor * size2[0] / 2, factor * size2[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: box.palmLandmarks }; +} +function squarifyBox2(box) { + const centers = getBoxCenter2(box); + const size2 = getBoxSize2(box); + const maxEdge = Math.max(...size2); + const halfSize = maxEdge / 2; + const startPoint = [centers[0] - halfSize, centers[1] - halfSize]; + const endPoint = [centers[0] + halfSize, centers[1] + halfSize]; + return { startPoint, endPoint, palmLandmarks: box.palmLandmarks }; +} +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 = (x6, y) => [[1, 0, x6], [0, 1, y], [0, 0, 1]]; +function dot2(v12, v22) { + let product = 0; + for (let i = 0; i < v12.length; i++) { + product += v12[i] * v22[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 size2 = mat1.length; + for (let row = 0; row < size2; row++) { + product.push([]); + for (let col = 0; col < size2; 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/hand/handposeanchors.ts +var anchors2 = [ + { 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/hand/handposedetector.ts +var HandDetector = class { + constructor(model23) { + __publicField(this, "model"); + __publicField(this, "anchors"); + __publicField(this, "anchorsTensor"); + __publicField(this, "inputSize"); + __publicField(this, "inputSizeTensor"); + __publicField(this, "doubleInputSizeTensor"); + var _a2, _b, _c2, _d2; + this.model = model23; + this.anchors = anchors2.map((anchor) => [anchor.x, anchor.y]); + this.anchorsTensor = gi(this.anchors); + this.inputSize = ((_d2 = (_c2 = (_b = (_a2 = this == null ? void 0 : this.model) == null ? void 0 : _a2.inputs) == null ? void 0 : _b[0]) == null ? void 0 : _c2.shape) == null ? void 0 : _d2[2]) || 0; + this.inputSizeTensor = mr([this.inputSize, this.inputSize]); + this.doubleInputSizeTensor = mr([this.inputSize * 2, this.inputSize * 2]); + } + normalizeBoxes(boxes) { + const t10 = {}; + t10.boxOffsets = Ue(boxes, [0, 0], [-1, 2]); + t10.boxSizes = Ue(boxes, [0, 2], [-1, 2]); + t10.div = We(t10.boxOffsets, this.inputSizeTensor); + t10.boxCenterPoints = ge(t10.div, this.anchorsTensor); + t10.halfBoxSizes = We(t10.boxSizes, this.doubleInputSizeTensor); + t10.sub = ke(t10.boxCenterPoints, t10.halfBoxSizes); + t10.startPoints = oe(t10.sub, this.inputSizeTensor); + t10.add = ge(t10.boxCenterPoints, t10.halfBoxSizes); + t10.endPoints = oe(t10.add, this.inputSizeTensor); + const res = ck([t10.startPoints, t10.endPoints], 1); + Object.keys(t10).forEach((tensor) => Ft(t10[tensor])); + return res; + } + normalizeLandmarks(rawPalmLandmarks, index2) { + const t10 = {}; + t10.reshape = z(rawPalmLandmarks, [-1, 7, 2]); + t10.div = We(t10.reshape, this.inputSizeTensor); + t10.landmarks = ge(t10.div, this.anchors[index2] ? this.anchors[index2] : 0); + const res = oe(t10.landmarks, this.inputSizeTensor); + Object.keys(t10).forEach((tensor) => Ft(t10[tensor])); + return res; + } + async predict(input, config3) { + var _a2; + const t10 = {}; + t10.resize = zq.resizeBilinear(input, [this.inputSize, this.inputSize]); + t10.div = We(t10.resize, constants.tf127); + t10.image = ke(t10.div, constants.tf1); + t10.batched = this.model.execute(t10.image); + t10.predictions = jp(t10.batched); + t10.slice = Ue(t10.predictions, [0, 0], [-1, 1]); + t10.sigmoid = Ms(t10.slice); + t10.scores = jp(t10.sigmoid); + const scores = await t10.scores.data(); + t10.boxes = Ue(t10.predictions, [0, 1], [-1, 4]); + t10.norm = this.normalizeBoxes(t10.boxes); + t10.nms = await zq.nonMaxSuppressionAsync(t10.norm, t10.scores, 3 * (((_a2 = config3.hand) == null ? void 0 : _a2.maxDetected) || 1), config3.hand.iouThreshold, config3.hand.minConfidence); + const nms = await t10.nms.array(); + const hands = []; + for (const index2 of nms) { + const p = {}; + p.box = Ue(t10.norm, [index2, 0], [1, -1]); + p.slice = Ue(t10.predictions, [index2, 5], [1, 14]); + p.norm = this.normalizeLandmarks(p.slice, index2); + p.palmLandmarks = z(p.norm, [-1, 2]); + const box = await p.box.data(); + const startPoint = box.slice(0, 2); + const endPoint = box.slice(2, 4); + const palmLandmarks = await p.palmLandmarks.array(); + const hand3 = { startPoint, endPoint, palmLandmarks, confidence: scores[index2] }; + const scaled = scaleBoxCoordinates2(hand3, [(input.shape[2] || 1) / this.inputSize, (input.shape[1] || 0) / this.inputSize]); + hands.push(scaled); + Object.keys(p).forEach((tensor) => Ft(p[tensor])); + } + Object.keys(t10).forEach((tensor) => Ft(t10[tensor])); + return hands; + } +}; + +// src/hand/handposepipeline.ts +var palmBoxEnlargeFactor = 5; +var handBoxEnlargeFactor = 1.65; +var palmLandmarkIds = [0, 5, 9, 13, 17, 1, 2]; +var palmLandmarksPalmBase = 0; +var palmLandmarksMiddleFingerBase = 2; +var lastTime13 = 0; +var HandPipeline = class { + constructor(handDetector, handPoseModel2) { + __publicField(this, "handDetector"); + __publicField(this, "handPoseModel"); + __publicField(this, "inputSize"); + __publicField(this, "storedBoxes"); + __publicField(this, "skipped"); + __publicField(this, "detectedHands"); + var _a2, _b, _c2; + this.handDetector = handDetector; + this.handPoseModel = handPoseModel2; + this.inputSize = ((_c2 = (_b = (_a2 = this.handPoseModel) == null ? void 0 : _a2.inputs) == null ? void 0 : _b[0].shape) == null ? void 0 : _c2[2]) || 0; + this.storedBoxes = []; + this.skipped = Number.MAX_SAFE_INTEGER; + this.detectedHands = 0; + } + calculateLandmarksBoundingBox(landmarks) { + const xs2 = landmarks.map((d) => d[0]); + const ys2 = landmarks.map((d) => d[1]); + const startPoint = [Math.min(...xs2), Math.min(...ys2)]; + const endPoint = [Math.max(...xs2), Math.max(...ys2)]; + 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, box2, angle, rotationMatrix) { + const boxSize = getBoxSize2(box2); + 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(box2), 1]; + const originalBoxCenter = [ + dot2(boxCenter, inverseRotationMatrix[0]), + dot2(boxCenter, inverseRotationMatrix[1]) + ]; + return coordsRotated.map((coord) => [ + Math.trunc(coord[0] + originalBoxCenter[0]), + Math.trunc(coord[1] + originalBoxCenter[1]), + Math.trunc(coord[2]) + ]); + } + async estimateHands(image, config3) { + let useFreshBox = false; + let boxes; + const skipTime = (config3.hand.skipTime || 0) > now() - lastTime13; + const skipFrame = this.skipped < (config3.hand.skipFrames || 0); + if (config3.skipAllowed && skipTime && skipFrame) { + boxes = await this.handDetector.predict(image, config3); + this.skipped = 0; + } + if (config3.skipAllowed) + 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] / image.shape[2], palmCenter[1] / image.shape[1]]; + const rotatedImage = config3.hand.rotation && env.kernels.includes("rotatewithoffset") ? zq.rotateWithOffset(image, angle, 0, palmCenterNormalized) : image.clone(); + const rotationMatrix = buildRotationMatrix2(-angle, palmCenter); + const newBox = useFreshBox ? this.getBoxForPalmLandmarks(currentBox.palmLandmarks, rotationMatrix) : currentBox; + const croppedInput = cutBoxFromImageAndResize(newBox, rotatedImage, [this.inputSize, this.inputSize]); + const handImage = We(croppedInput, constants.tf255); + Ft(croppedInput); + Ft(rotatedImage); + const [confidenceT, keypoints] = this.handPoseModel.execute(handImage); + lastTime13 = now(); + Ft(handImage); + const confidence = (await confidenceT.data())[0]; + Ft(confidenceT); + if (confidence >= config3.hand.minConfidence / 4) { + const keypointsReshaped = z(keypoints, [-1, 3]); + const rawCoords = await keypointsReshaped.array(); + Ft(keypoints); + Ft(keypointsReshaped); + const coords = this.transformRawCoords(rawCoords, newBox, angle, rotationMatrix); + const nextBoundingBox = this.getBoxForHandLandmarks(coords); + this.storedBoxes[i] = { ...nextBoundingBox, confidence }; + const result = { + landmarks: coords, + confidence, + boxConfidence: currentBox.confidence, + fingerConfidence: confidence, + box: { topLeft: nextBoundingBox.startPoint, bottomRight: nextBoundingBox.endPoint } + }; + hands.push(result); + } else { + this.storedBoxes[i] = null; + } + Ft(keypoints); + } else { + const enlarged = enlargeBox2(squarifyBox2(currentBox), handBoxEnlargeFactor); + const result = { + confidence: currentBox.confidence, + boxConfidence: currentBox.confidence, + fingerConfidence: 0, + box: { topLeft: enlarged.startPoint, bottomRight: enlarged.endPoint }, + landmarks: [] + }; + hands.push(result); + } + } + this.storedBoxes = this.storedBoxes.filter((a) => a !== null); + this.detectedHands = hands.length; + if (hands.length > config3.hand.maxDetected) + hands.length = config3.hand.maxDetected; + return hands; + } +}; + +// src/hand/handpose.ts +var meshAnnotations2 = { + thumb: [1, 2, 3, 4], + index: [5, 6, 7, 8], + middle: [9, 10, 11, 12], + ring: [13, 14, 15, 16], + pinky: [17, 18, 19, 20], + palm: [0] +}; +var handDetectorModel; +var handPoseModel; +var handPipeline; +async function predict14(input, config3) { + const predictions = await handPipeline.estimateHands(input, config3); + if (!predictions) + return []; + const hands = []; + for (let i = 0; i < predictions.length; i++) { + const annotations2 = {}; + if (predictions[i].landmarks) { + for (const key of Object.keys(meshAnnotations2)) { + annotations2[key] = meshAnnotations2[key].map((index2) => predictions[i].landmarks[index2]); + } + } + const keypoints = predictions[i].landmarks; + let box = [Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, 0, 0]; + let boxRaw = [0, 0, 0, 0]; + if (keypoints && keypoints.length > 0) { + for (const pt of keypoints) { + if (pt[0] < box[0]) + box[0] = pt[0]; + if (pt[1] < box[1]) + box[1] = pt[1]; + if (pt[0] > box[2]) + box[2] = pt[0]; + if (pt[1] > box[3]) + box[3] = pt[1]; + } + box[2] -= box[0]; + box[3] -= box[1]; + boxRaw = [box[0] / (input.shape[2] || 0), box[1] / (input.shape[1] || 0), box[2] / (input.shape[2] || 0), box[3] / (input.shape[1] || 0)]; + } else { + box = predictions[i].box ? [ + Math.trunc(Math.max(0, predictions[i].box.topLeft[0])), + Math.trunc(Math.max(0, predictions[i].box.topLeft[1])), + Math.trunc(Math.min(input.shape[2] || 0, predictions[i].box.bottomRight[0]) - Math.max(0, predictions[i].box.topLeft[0])), + Math.trunc(Math.min(input.shape[1] || 0, predictions[i].box.bottomRight[1]) - Math.max(0, predictions[i].box.topLeft[1])) + ] : [0, 0, 0, 0]; + boxRaw = [ + predictions[i].box.topLeft[0] / (input.shape[2] || 0), + predictions[i].box.topLeft[1] / (input.shape[1] || 0), + (predictions[i].box.bottomRight[0] - predictions[i].box.topLeft[0]) / (input.shape[2] || 0), + (predictions[i].box.bottomRight[1] - predictions[i].box.topLeft[1]) / (input.shape[1] || 0) + ]; + } + const landmarks = analyze(keypoints); + hands.push({ + id: i, + score: Math.round(100 * predictions[i].confidence) / 100, + boxScore: Math.round(100 * predictions[i].boxConfidence) / 100, + fingerScore: Math.round(100 * predictions[i].fingerConfidence) / 100, + label: "hand", + box, + boxRaw, + keypoints, + annotations: annotations2, + landmarks + }); + } + return hands; +} +async function load15(config3) { + var _a2, _b; + if (env.initial) { + handDetectorModel = null; + handPoseModel = null; + } + if (!handDetectorModel || !handPoseModel) { + [handDetectorModel, handPoseModel] = await Promise.all([ + config3.hand.enabled ? loadModel((_a2 = config3.hand.detector) == null ? void 0 : _a2.modelPath) : null, + config3.hand.landmarks ? loadModel((_b = config3.hand.skeleton) == null ? void 0 : _b.modelPath) : null + ]); + } else { + if (config3.debug) + log("cached model:", handDetectorModel["modelUrl"]); + if (config3.debug) + log("cached model:", handPoseModel["modelUrl"]); + } + const handDetector = handDetectorModel ? new HandDetector(handDetectorModel) : void 0; + if (handDetector && handPoseModel) + handPipeline = new HandPipeline(handDetector, handPoseModel); + return [handDetectorModel, handPoseModel]; +} + +// src/hand/handtrack.ts +var models2 = [null, null]; +var modelOutputNodes = ["StatefulPartitionedCall/Postprocessor/Slice", "StatefulPartitionedCall/Postprocessor/ExpandDims_1"]; +var inputSize7 = [[0, 0], [0, 0]]; +var classes = ["hand", "fist", "pinch", "point", "face", "tip", "pinchtip"]; +var faceIndex = 4; +var boxExpandFact = 1.6; +var maxDetectorResolution = 512; +var detectorExpandFact = 1.4; +var skipped13 = Number.MAX_SAFE_INTEGER; +var lastTime14 = 0; +var outputSize = [0, 0]; +var cache4 = { + boxes: [], + hands: [] +}; +var fingerMap = { + thumb: [1, 2, 3, 4], + index: [5, 6, 7, 8], + middle: [9, 10, 11, 12], + ring: [13, 14, 15, 16], + pinky: [17, 18, 19, 20], + base: [0], + palm: [0, 17, 13, 9, 5, 1, 0] +}; +async function loadDetect2(config3) { + var _a2; + if (env.initial) + models2[0] = null; + if (!models2[0]) { + fakeOps(["tensorlistreserve", "enter", "tensorlistfromtensor", "merge", "loopcond", "switch", "exit", "tensorliststack", "nextiteration", "tensorlistsetitem", "tensorlistgetitem", "reciprocal", "shape", "split", "where"], config3); + models2[0] = await loadModel((_a2 = config3.hand.detector) == null ? void 0 : _a2.modelPath); + const inputs = models2[0]["executor"] ? Object.values(models2[0].modelSignature["inputs"]) : void 0; + inputSize7[0][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0; + inputSize7[0][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0; + } else if (config3.debug) + log("cached model:", models2[0]["modelUrl"]); + return models2[0]; +} +async function loadSkeleton(config3) { + var _a2; + if (env.initial) + models2[1] = null; + if (!models2[1]) { + models2[1] = await loadModel((_a2 = config3.hand.skeleton) == null ? void 0 : _a2.modelPath); + const inputs = models2[1]["executor"] ? Object.values(models2[1].modelSignature["inputs"]) : void 0; + inputSize7[1][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0; + inputSize7[1][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0; + } else if (config3.debug) + log("cached model:", models2[1]["modelUrl"]); + return models2[1]; +} +async function detectHands(input, config3) { + const hands = []; + if (!input || !models2[0]) + return hands; + const t10 = {}; + const ratio2 = (input.shape[2] || 1) / (input.shape[1] || 1); + const height = Math.min(Math.round((input.shape[1] || 0) / 8) * 8, maxDetectorResolution); + const width = Math.round(height * ratio2 / 8) * 8; + t10.resize = zq.resizeBilinear(input, [height, width]); + t10.cast = qe(t10.resize, "int32"); + [t10.rawScores, t10.rawBoxes] = await models2[0].executeAsync(t10.cast, modelOutputNodes); + t10.boxes = jp(t10.rawBoxes, [0, 2]); + t10.scores = jp(t10.rawScores, [0]); + const classScores = ko(t10.scores, 1); + Ft(classScores[faceIndex]); + classScores.splice(faceIndex, 1); + t10.filtered = Ir(classScores, 1); + Ft(classScores); + t10.max = Vs(t10.filtered, 1); + t10.argmax = Hv(t10.filtered, 1); + let id2 = 0; + t10.nms = await zq.nonMaxSuppressionAsync(t10.boxes, t10.max, (config3.hand.maxDetected || 0) + 1, config3.hand.iouThreshold || 0, config3.hand.minConfidence || 1); + const nms = await t10.nms.data(); + const scores = await t10.max.data(); + const classNum = await t10.argmax.data(); + for (const nmsIndex of Array.from(nms)) { + const boxSlice = Ue(t10.boxes, nmsIndex, 1); + const boxYX = await boxSlice.data(); + Ft(boxSlice); + const boxData = [boxYX[1], boxYX[0], boxYX[3] - boxYX[1], boxYX[2] - boxYX[0]]; + const boxRaw = scale(boxData, detectorExpandFact); + const boxFull = [Math.trunc(boxData[0] * outputSize[0]), Math.trunc(boxData[1] * outputSize[1]), Math.trunc(boxData[2] * outputSize[0]), Math.trunc(boxData[3] * outputSize[1])]; + const score = scores[nmsIndex]; + const label = classes[classNum[nmsIndex]]; + const hand3 = { id: id2++, score, box: boxFull, boxRaw, label }; + hands.push(hand3); + } + Object.keys(t10).forEach((tensor) => Ft(t10[tensor])); + hands.sort((a, b) => b.score - a.score); + if (hands.length > (config3.hand.maxDetected || 1)) + hands.length = config3.hand.maxDetected || 1; + return hands; +} +async function detectFingers(input, h, config3) { + const hand3 = { + id: h.id, + score: Math.round(100 * h.score) / 100, + boxScore: Math.round(100 * h.score) / 100, + fingerScore: 0, + box: h.box, + boxRaw: h.boxRaw, + label: h.label, + keypoints: [], + landmarks: {}, + annotations: {} + }; + if (input && models2[1] && config3.hand.landmarks && h.score > (config3.hand.minConfidence || 0)) { + const t10 = {}; + const boxCrop = [h.boxRaw[1], h.boxRaw[0], h.boxRaw[3] + h.boxRaw[1], h.boxRaw[2] + h.boxRaw[0]]; + t10.crop = zq.cropAndResize(input, [boxCrop], [0], [inputSize7[1][0], inputSize7[1][1]], "bilinear"); + t10.div = We(t10.crop, constants.tf255); + [t10.score, t10.keypoints] = models2[1].execute(t10.div, ["Identity_1", "Identity"]); + const rawScore = (await t10.score.data())[0]; + const score = (100 - Math.trunc(100 / (1 + Math.exp(rawScore)))) / 100; + if (score >= (config3.hand.minConfidence || 0)) { + hand3.fingerScore = score; + t10.reshaped = z(t10.keypoints, [-1, 3]); + const coordsData = await t10.reshaped.array(); + const coordsRaw = coordsData.map((kpt4) => [kpt4[0] / inputSize7[1][1], kpt4[1] / inputSize7[1][0], kpt4[2] || 0]); + const coordsNorm = coordsRaw.map((kpt4) => [kpt4[0] * h.boxRaw[2], kpt4[1] * h.boxRaw[3], kpt4[2] || 0]); + hand3.keypoints = coordsNorm.map((kpt4) => [outputSize[0] * (kpt4[0] + h.boxRaw[0]), outputSize[1] * (kpt4[1] + h.boxRaw[1]), kpt4[2] || 0]); + hand3.landmarks = analyze(hand3.keypoints); + for (const key of Object.keys(fingerMap)) { + hand3.annotations[key] = fingerMap[key].map((index2) => hand3.landmarks && hand3.keypoints[index2] ? hand3.keypoints[index2] : null); + } + } + Object.keys(t10).forEach((tensor) => Ft(t10[tensor])); + } + return hand3; +} +async function predict15(input, config3) { + var _a2, _b; + if (!((_a2 = models2[0]) == null ? void 0 : _a2["executor"]) || !((_b = models2[1]) == null ? void 0 : _b["executor"]) || !models2[0].inputs[0].shape || !models2[1].inputs[0].shape) + return []; + outputSize = [input.shape[2] || 0, input.shape[1] || 0]; + skipped13++; + const skipTime = (config3.hand.skipTime || 0) > now() - lastTime14; + const skipFrame = skipped13 < (config3.hand.skipFrames || 0); + if (config3.skipAllowed && skipTime && skipFrame) { + return cache4.hands; + } + return new Promise(async (resolve) => { + const skipTimeExtended = 3 * (config3.hand.skipTime || 0) > now() - lastTime14; + const skipFrameExtended = skipped13 < 3 * (config3.hand.skipFrames || 0); + if (config3.skipAllowed && cache4.hands.length === config3.hand.maxDetected) { + cache4.hands = await Promise.all(cache4.boxes.map((handBox) => detectFingers(input, handBox, config3))); + } else if (config3.skipAllowed && skipTimeExtended && skipFrameExtended && cache4.hands.length > 0) { + cache4.hands = await Promise.all(cache4.boxes.map((handBox) => detectFingers(input, handBox, config3))); + } else { + cache4.boxes = await detectHands(input, config3); + lastTime14 = now(); + cache4.hands = await Promise.all(cache4.boxes.map((handBox) => detectFingers(input, handBox, config3))); + skipped13 = 0; + } + const oldCache = [...cache4.boxes]; + cache4.boxes.length = 0; + if (config3.cacheSensitivity > 0) { + for (let i = 0; i < cache4.hands.length; i++) { + const boxKpt = square(cache4.hands[i].keypoints, outputSize); + if (boxKpt.box[2] / (input.shape[2] || 1) > 0.05 && boxKpt.box[3] / (input.shape[1] || 1) > 0.05 && cache4.hands[i].fingerScore && cache4.hands[i].fingerScore > (config3.hand.minConfidence || 0)) { + const boxScale = scale(boxKpt.box, boxExpandFact); + const boxScaleRaw = scale(boxKpt.boxRaw, boxExpandFact); + cache4.boxes.push({ ...oldCache[i], box: boxScale, boxRaw: boxScaleRaw }); + } + } + } + for (let i = 0; i < cache4.hands.length; i++) { + const bbox = calc(cache4.hands[i].keypoints, outputSize); + cache4.hands[i].box = bbox.box; + cache4.hands[i].boxRaw = bbox.boxRaw; + } + resolve(cache4.hands); + }); +} + +// src/result.ts +var empty = (error = null) => ({ face: [], body: [], hand: [], gesture: [], object: [], persons: [], performance: {}, timestamp: 0, width: 0, height: 0, error }); + +// src/body/movenetcoords.ts +var movenetcoords_exports = {}; +__export(movenetcoords_exports, { + connected: () => connected3, + horizontal: () => horizontal, + kpt: () => kpt3, + relative: () => relative, + vertical: () => vertical +}); +var kpt3 = [ + "nose", + "leftEye", + "rightEye", + "leftEar", + "rightEar", + "leftShoulder", + "rightShoulder", + "leftElbow", + "rightElbow", + "leftWrist", + "rightWrist", + "leftHip", + "rightHip", + "leftKnee", + "rightKnee", + "leftAnkle", + "rightAnkle" +]; +var horizontal = [ + ["leftEye", "rightEye"], + ["leftEar", "rightEar"], + ["leftShoulder", "rightShoulder"], + ["leftElbow", "rightElbow"], + ["leftWrist", "rightWrist"], + ["leftHip", "rightHip"], + ["leftKnee", "rightKnee"], + ["leftAnkle", "rightAnkle"] +]; +var vertical = [ + ["leftKnee", "leftShoulder"], + ["rightKnee", "rightShoulder"], + ["leftAnkle", "leftKnee"], + ["rightAnkle", "rightKnee"] +]; +var relative = [ + [["leftHip", "rightHip"], ["leftShoulder", "rightShoulder"]], + [["leftElbow", "rightElbow"], ["leftShoulder", "rightShoulder"]] +]; +var connected3 = { + leftLeg: ["leftHip", "leftKnee", "leftAnkle"], + rightLeg: ["rightHip", "rightKnee", "rightAnkle"], + torso: ["leftShoulder", "rightShoulder", "rightHip", "leftHip", "leftShoulder"], + leftArm: ["leftShoulder", "leftElbow", "leftWrist"], + rightArm: ["rightShoulder", "rightElbow", "rightWrist"], + head: [] +}; + +// src/util/interpolate.ts +var bufferedResult = empty(); +var interpolateTime = 0; +function calc2(newResult, config3) { + var _a2, _b, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j2, _k2, _l2, _m, _n2, _o2, _p2, _q2, _r2, _s2, _t, _u2, _v2, _w2; + const t0 = now(); + if (!newResult) + return empty(); + const elapsed = Date.now() - newResult.timestamp; + const bufferedFactor = elapsed < 1e3 ? 8 - Math.log(elapsed + 1) : 1; + if (newResult.canvas) + bufferedResult.canvas = newResult.canvas; + if (newResult.error) + bufferedResult.error = newResult.error; + if (!bufferedResult.body || newResult.body.length !== bufferedResult.body.length) { + bufferedResult.body = JSON.parse(JSON.stringify(newResult.body)); + } else { + for (let i = 0; i < newResult.body.length; i++) { + const box = newResult.body[i].box.map((newBoxCoord, j) => ((bufferedFactor - 1) * bufferedResult.body[i].box[j] + newBoxCoord) / bufferedFactor); + const boxRaw = newResult.body[i].boxRaw.map((newBoxCoord, j) => ((bufferedFactor - 1) * bufferedResult.body[i].boxRaw[j] + newBoxCoord) / bufferedFactor); + const keypoints = newResult.body[i].keypoints.map((newKpt, j) => { + var _a3, _b2, _c3, _d3, _e3, _f3, _g3, _h3, _i3; + return { + score: newKpt.score, + part: newKpt.part, + position: [ + bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].position[0] || 0) + (newKpt.position[0] || 0)) / bufferedFactor : newKpt.position[0], + bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].position[1] || 0) + (newKpt.position[1] || 0)) / bufferedFactor : newKpt.position[1], + bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].position[2] || 0) + (newKpt.position[2] || 0)) / bufferedFactor : newKpt.position[2] + ], + positionRaw: [ + bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].positionRaw[0] || 0) + (newKpt.positionRaw[0] || 0)) / bufferedFactor : newKpt.positionRaw[0], + bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].positionRaw[1] || 0) + (newKpt.positionRaw[1] || 0)) / bufferedFactor : newKpt.positionRaw[1], + bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].positionRaw[2] || 0) + (newKpt.positionRaw[2] || 0)) / bufferedFactor : newKpt.positionRaw[2] + ], + distance: [ + bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (((_a3 = bufferedResult.body[i].keypoints[j].distance) == null ? void 0 : _a3[0]) || 0) + (((_b2 = newKpt.distance) == null ? void 0 : _b2[0]) || 0)) / bufferedFactor : (_c3 = newKpt.distance) == null ? void 0 : _c3[0], + bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (((_d3 = bufferedResult.body[i].keypoints[j].distance) == null ? void 0 : _d3[1]) || 0) + (((_e3 = newKpt.distance) == null ? void 0 : _e3[1]) || 0)) / bufferedFactor : (_f3 = newKpt.distance) == null ? void 0 : _f3[1], + bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (((_g3 = bufferedResult.body[i].keypoints[j].distance) == null ? void 0 : _g3[2]) || 0) + (((_h3 = newKpt.distance) == null ? void 0 : _h3[2]) || 0)) / bufferedFactor : (_i3 = newKpt.distance) == null ? void 0 : _i3[2] + ] + }; + }); + const annotations2 = {}; + let coords = { connected: {} }; + if ((_a2 = config3.body.modelPath) == null ? void 0 : _a2.includes("efficientpose")) + coords = efficientposecoords_exports; + else if ((_b = config3.body.modelPath) == null ? void 0 : _b.includes("blazepose")) + coords = blazeposecoords_exports; + else if ((_c2 = config3.body.modelPath) == null ? void 0 : _c2.includes("movenet")) + coords = movenetcoords_exports; + for (const [name, indexes] of Object.entries(coords.connected)) { + const pt = []; + for (let j = 0; j < indexes.length - 1; j++) { + const pt0 = keypoints.find((kp2) => kp2.part === indexes[j]); + const pt1 = keypoints.find((kp2) => kp2.part === indexes[j + 1]); + if (pt0 && pt1) + pt.push([pt0.position, pt1.position]); + } + annotations2[name] = pt; + } + bufferedResult.body[i] = { ...newResult.body[i], box, boxRaw, keypoints, annotations: annotations2 }; + } + } + if (!bufferedResult.hand || newResult.hand.length !== bufferedResult.hand.length) { + bufferedResult.hand = JSON.parse(JSON.stringify(newResult.hand)); + } else { + for (let i = 0; i < newResult.hand.length; i++) { + const box = newResult.hand[i].box.map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i].box[j] + b) / bufferedFactor); + const boxRaw = newResult.hand[i].boxRaw.map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i].boxRaw[j] + b) / bufferedFactor); + if (bufferedResult.hand[i].keypoints.length !== newResult.hand[i].keypoints.length) + bufferedResult.hand[i].keypoints = newResult.hand[i].keypoints; + const keypoints = newResult.hand[i].keypoints && newResult.hand[i].keypoints.length > 0 ? newResult.hand[i].keypoints.map((landmark, j) => landmark.map((coord, k) => ((bufferedFactor - 1) * (bufferedResult.hand[i].keypoints[j][k] || 1) + (coord || 0)) / bufferedFactor)) : []; + let annotations2 = {}; + if (Object.keys(bufferedResult.hand[i].annotations).length !== Object.keys(newResult.hand[i].annotations).length) { + bufferedResult.hand[i].annotations = newResult.hand[i].annotations; + annotations2 = bufferedResult.hand[i].annotations; + } else if (newResult.hand[i].annotations) { + for (const key of Object.keys(newResult.hand[i].annotations)) { + annotations2[key] = ((_f2 = (_e2 = (_d2 = newResult.hand[i]) == null ? void 0 : _d2.annotations) == null ? void 0 : _e2[key]) == null ? void 0 : _f2[0]) ? newResult.hand[i].annotations[key].map((val, j) => val.map((coord, k) => ((bufferedFactor - 1) * bufferedResult.hand[i].annotations[key][j][k] + coord) / bufferedFactor)) : null; + } + } + bufferedResult.hand[i] = { ...newResult.hand[i], box, boxRaw, keypoints, annotations: annotations2 }; + } + } + if (!bufferedResult.face || newResult.face.length !== bufferedResult.face.length) { + bufferedResult.face = JSON.parse(JSON.stringify(newResult.face)); + } else { + for (let i = 0; i < newResult.face.length; i++) { + const box = newResult.face[i].box.map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i].box[j] + b) / bufferedFactor); + const boxRaw = newResult.face[i].boxRaw.map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i].boxRaw[j] + b) / bufferedFactor); + if (newResult.face[i].rotation) { + const rotation = { matrix: [0, 0, 0, 0, 0, 0, 0, 0, 0], angle: { roll: 0, yaw: 0, pitch: 0 }, gaze: { bearing: 0, strength: 0 } }; + rotation.matrix = (_g2 = newResult.face[i].rotation) == null ? void 0 : _g2.matrix; + rotation.angle = { + roll: ((bufferedFactor - 1) * (((_i2 = (_h2 = bufferedResult.face[i].rotation) == null ? void 0 : _h2.angle) == null ? void 0 : _i2.roll) || 0) + (((_k2 = (_j2 = newResult.face[i].rotation) == null ? void 0 : _j2.angle) == null ? void 0 : _k2.roll) || 0)) / bufferedFactor, + yaw: ((bufferedFactor - 1) * (((_m = (_l2 = bufferedResult.face[i].rotation) == null ? void 0 : _l2.angle) == null ? void 0 : _m.yaw) || 0) + (((_o2 = (_n2 = newResult.face[i].rotation) == null ? void 0 : _n2.angle) == null ? void 0 : _o2.yaw) || 0)) / bufferedFactor, + pitch: ((bufferedFactor - 1) * (((_q2 = (_p2 = bufferedResult.face[i].rotation) == null ? void 0 : _p2.angle) == null ? void 0 : _q2.pitch) || 0) + (((_s2 = (_r2 = newResult.face[i].rotation) == null ? void 0 : _r2.angle) == null ? void 0 : _s2.pitch) || 0)) / bufferedFactor + }; + rotation.gaze = { + bearing: ((bufferedFactor - 1) * (((_t = bufferedResult.face[i].rotation) == null ? void 0 : _t.gaze.bearing) || 0) + (((_u2 = newResult.face[i].rotation) == null ? void 0 : _u2.gaze.bearing) || 0)) / bufferedFactor, + strength: ((bufferedFactor - 1) * (((_v2 = bufferedResult.face[i].rotation) == null ? void 0 : _v2.gaze.strength) || 0) + (((_w2 = newResult.face[i].rotation) == null ? void 0 : _w2.gaze.strength) || 0)) / bufferedFactor + }; + bufferedResult.face[i] = { ...newResult.face[i], rotation, box, boxRaw }; + } else { + bufferedResult.face[i] = { ...newResult.face[i], box, boxRaw }; + } + } + } + if (!bufferedResult.object || newResult.object.length !== bufferedResult.object.length) { + bufferedResult.object = JSON.parse(JSON.stringify(newResult.object)); + } else { + for (let i = 0; i < newResult.object.length; i++) { + const box = newResult.object[i].box.map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i].box[j] + b) / bufferedFactor); + const boxRaw = newResult.object[i].boxRaw.map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i].boxRaw[j] + b) / bufferedFactor); + bufferedResult.object[i] = { ...newResult.object[i], box, boxRaw }; + } + } + if (newResult.persons) { + const newPersons = newResult.persons; + if (!bufferedResult.persons || newPersons.length !== bufferedResult.persons.length) { + bufferedResult.persons = JSON.parse(JSON.stringify(newPersons)); + } else { + for (let i = 0; i < newPersons.length; i++) { + bufferedResult.persons[i].box = newPersons[i].box.map((box, j) => ((bufferedFactor - 1) * bufferedResult.persons[i].box[j] + box) / bufferedFactor); + } + } + } + if (newResult.gesture) + bufferedResult.gesture = newResult.gesture; + bufferedResult.width = newResult.width; + bufferedResult.height = newResult.height; + const t12 = now(); + interpolateTime = env.perfadd ? interpolateTime + Math.round(t12 - t0) : Math.round(t12 - t0); + if (newResult.performance) + bufferedResult.performance = { ...newResult.performance, interpolate: interpolateTime }; + return bufferedResult; +} + +// src/segmentation/meet.ts +var model17; +async function load16(config3) { + if (!model17 || env.initial) + model17 = await loadModel(config3.segmentation.modelPath); + else if (config3.debug) + log("cached model:", model17["modelUrl"]); + return model17; +} +async function predict16(input, config3) { + var _a2; + if (!model17) + model17 = await load16(config3); + if (!(model17 == null ? void 0 : model17["executor"]) || !((_a2 = model17 == null ? void 0 : model17.inputs) == null ? void 0 : _a2[0].shape)) + return null; + const t10 = {}; + t10.resize = zq.resizeBilinear(input, [model17.inputs[0].shape ? model17.inputs[0].shape[1] : 0, model17.inputs[0].shape ? model17.inputs[0].shape[2] : 0], false); + t10.norm = We(t10.resize, constants.tf255); + t10.res = model17.execute(t10.norm); + t10.squeeze = jp(t10.res, [0]); + [t10.bgRaw, t10.fgRaw] = ko(t10.squeeze, 2); + t10.fg = G1(t10.fgRaw); + t10.mul = oe(t10.fg, constants.tf255); + t10.expand = _a(t10.mul, 2); + t10.output = zq.resizeBilinear(t10.expand, [input.shape[1] || 0, input.shape[2] || 0]); + let rgba; + switch (config3.segmentation.mode || "default") { + case "default": + t10.input = jp(input); + t10.concat = gt([t10.input, t10.output], -1); + rgba = qe(t10.concat, "int32"); + break; + case "alpha": + rgba = qe(t10.output, "int32"); + break; + default: + rgba = nr(0); + } + Object.keys(t10).forEach((tensor) => Ft(t10[tensor])); + return rgba; +} + +// src/face/match.ts +var match_exports = {}; +__export(match_exports, { + distance: () => distance, + find: () => find, + similarity: () => similarity +}); +function distance(descriptor1, descriptor2, options4 = { order: 2, multiplier: 25 }) { + if (!descriptor1 || !descriptor1) + return Number.MAX_SAFE_INTEGER; + let sum = 0; + for (let i = 0; i < descriptor1.length; i++) { + const diff = !options4.order || options4.order === 2 ? descriptor1[i] - descriptor2[i] : Math.abs(descriptor1[i] - descriptor2[i]); + sum += !options4.order || options4.order === 2 ? diff * diff : diff ** options4.order; + } + return (options4.multiplier || 20) * sum; +} +var normalizeDistance = (dist, order, min, max) => { + if (dist === 0) + return 1; + const root = order === 2 ? Math.sqrt(dist) : dist ** (1 / order); + const norm = (1 - root / 100 - min) / (max - min); + const clamp2 = Math.max(Math.min(norm, 1), 0); + return clamp2; +}; +function similarity(descriptor1, descriptor2, options4 = { order: 2, multiplier: 25, min: 0.2, max: 0.8 }) { + const dist = distance(descriptor1, descriptor2, options4); + return normalizeDistance(dist, options4.order || 2, options4.min || 0, options4.max || 1); +} +function find(descriptor, descriptors, options4 = { order: 2, multiplier: 25, threshold: 0, min: 0.2, max: 0.8 }) { + if (!Array.isArray(descriptor) || !Array.isArray(descriptors) || descriptor.length < 64 || descriptors.length === 0) { + return { index: -1, distance: Number.POSITIVE_INFINITY, similarity: 0 }; + } + let lowestDistance = Number.MAX_SAFE_INTEGER; + let index2 = -1; + for (let i = 0; i < descriptors.length; i++) { + const res = descriptors[i].length === descriptor.length ? distance(descriptor, descriptors[i], options4) : Number.MAX_SAFE_INTEGER; + if (res < lowestDistance) { + lowestDistance = res; + index2 = i; + } + if (lowestDistance < (options4.threshold || 0)) + break; + } + const normalizedSimilarity = normalizeDistance(lowestDistance, options4.order || 2, options4.min || 0, options4.max || 1); + return { index: index2, distance: lowestDistance, similarity: normalizedSimilarity }; +} + +// src/models.ts +var models_exports2 = {}; +__export(models_exports2, { + Models: () => Models, + validateModel: () => validateModel +}); + +// src/body/movenetfix.ts +var maxJitter = 5e-3; +var cache5 = { + keypoints: [], + padding: [[0, 0], [0, 0], [0, 0], [0, 0]] +}; +function bodyParts(body4) { + for (const pair of horizontal) { + const left = body4.keypoints.findIndex((kp2) => kp2.part === pair[0]); + const right = body4.keypoints.findIndex((kp2) => kp2.part === pair[1]); + if (body4.keypoints[left] && body4.keypoints[right]) { + if (body4.keypoints[left].position[0] < body4.keypoints[right].position[0]) { + const tmp = body4.keypoints[left]; + body4.keypoints[left] = body4.keypoints[right]; + body4.keypoints[right] = tmp; + } + } + } + for (const pair of vertical) { + const lower = body4.keypoints.findIndex((kp2) => kp2 && kp2.part === pair[0]); + const higher = body4.keypoints.findIndex((kp2) => kp2 && kp2.part === pair[1]); + if (body4.keypoints[lower] && body4.keypoints[higher]) { + if (body4.keypoints[lower].position[1] < body4.keypoints[higher].position[1]) { + body4.keypoints.splice(lower, 1); + } + } + } + for (const [pair, compare2] of relative) { + const left = body4.keypoints.findIndex((kp2) => kp2 && kp2.part === pair[0]); + const right = body4.keypoints.findIndex((kp2) => kp2 && kp2.part === pair[1]); + const leftTo = body4.keypoints.findIndex((kp2) => kp2 && kp2.part === compare2[0]); + const rightTo = body4.keypoints.findIndex((kp2) => kp2 && kp2.part === compare2[1]); + if (!body4.keypoints[leftTo] || !body4.keypoints[rightTo]) + continue; + const distanceLeft = body4.keypoints[left] ? [ + Math.abs(body4.keypoints[leftTo].position[0] - body4.keypoints[left].position[0]), + Math.abs(body4.keypoints[rightTo].position[0] - body4.keypoints[left].position[0]) + ] : [0, 0]; + const distanceRight = body4.keypoints[right] ? [ + Math.abs(body4.keypoints[rightTo].position[0] - body4.keypoints[right].position[0]), + Math.abs(body4.keypoints[leftTo].position[0] - body4.keypoints[right].position[0]) + ] : [0, 0]; + if (distanceLeft[0] > distanceLeft[1] || distanceRight[0] > distanceRight[1]) { + const tmp = body4.keypoints[left]; + body4.keypoints[left] = body4.keypoints[right]; + body4.keypoints[right] = tmp; + } + } +} +function jitter(keypoints) { + for (let i = 0; i < keypoints.length; i++) { + if (keypoints[i] && cache5.keypoints[i]) { + const diff = [Math.abs(keypoints[i].positionRaw[0] - cache5.keypoints[i].positionRaw[0]), Math.abs(keypoints[i].positionRaw[1] - cache5.keypoints[i].positionRaw[1])]; + if (diff[0] < maxJitter && diff[1] < maxJitter) { + keypoints[i] = cache5.keypoints[i]; + } else { + cache5.keypoints[i] = keypoints[i]; + } + } else { + cache5.keypoints[i] = keypoints[i]; + } + } + return keypoints; +} +function padInput(input, inputSize10) { + var _a2, _b; + const t10 = {}; + if (!((_a2 = input == null ? void 0 : input.shape) == null ? void 0 : _a2[1]) || !((_b = input == null ? void 0 : input.shape) == null ? void 0 : _b[2])) + return input; + cache5.padding = [ + [0, 0], + [input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0, input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0], + [input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0, input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0], + [0, 0] + ]; + t10.pad = Ws(input, cache5.padding); + t10.resize = zq.resizeBilinear(t10.pad, [inputSize10, inputSize10]); + const final = qe(t10.resize, "int32"); + Object.keys(t10).forEach((tensor) => Ft(t10[tensor])); + return final; +} +function rescaleBody(body4, outputSize2) { + body4.keypoints = body4.keypoints.filter((kpt4) => kpt4 == null ? void 0 : kpt4.position); + for (const kpt4 of body4.keypoints) { + kpt4.position = [ + kpt4.position[0] * (outputSize2[0] + cache5.padding[2][0] + cache5.padding[2][1]) / outputSize2[0] - cache5.padding[2][0], + kpt4.position[1] * (outputSize2[1] + cache5.padding[1][0] + cache5.padding[1][1]) / outputSize2[1] - cache5.padding[1][0] + ]; + kpt4.positionRaw = [ + kpt4.position[0] / outputSize2[0], + kpt4.position[1] / outputSize2[1] + ]; + } + const rescaledBoxes = calc(body4.keypoints.map((pt) => pt.position), outputSize2); + body4.box = rescaledBoxes.box; + body4.boxRaw = rescaledBoxes.boxRaw; + return body4; +} + +// src/body/movenet.ts +var model18; +var inputSize8 = 0; +var skipped14 = Number.MAX_SAFE_INTEGER; +var cache6 = { + boxes: [], + bodies: [], + last: 0 +}; +async function load17(config3) { + var _a2; + if (env.initial) + model18 = null; + if (!model18) { + fakeOps(["size"], config3); + model18 = await loadModel(config3.body.modelPath); + } else if (config3.debug) + log("cached model:", model18["modelUrl"]); + inputSize8 = (model18 == null ? void 0 : model18["executor"]) && ((_a2 = model18 == null ? void 0 : model18.inputs) == null ? void 0 : _a2[0].shape) ? model18.inputs[0].shape[2] : 0; + if (inputSize8 < 64) + inputSize8 = 256; + return model18; +} +function parseSinglePose(res, config3, image) { + const kpt4 = res[0][0]; + const keypoints = []; + let score = 0; + for (let id2 = 0; id2 < kpt4.length; id2++) { + score = kpt4[id2][2]; + if (score > config3.body.minConfidence) { + const positionRaw = [kpt4[id2][1], kpt4[id2][0]]; + keypoints.push({ + score: Math.round(100 * score) / 100, + part: kpt3[id2], + positionRaw, + position: [ + Math.round((image.shape[2] || 0) * positionRaw[0]), + Math.round((image.shape[1] || 0) * positionRaw[1]) + ] + }); + } + } + score = keypoints.reduce((prev, curr) => curr.score > prev ? curr.score : prev, 0); + const bodies = []; + const newBox = calc(keypoints.map((pt) => pt.position), [image.shape[2], image.shape[1]]); + const annotations2 = {}; + for (const [name, indexes] of Object.entries(connected3)) { + const pt = []; + for (let i = 0; i < indexes.length - 1; i++) { + const pt0 = keypoints.find((kp2) => kp2.part === indexes[i]); + const pt1 = keypoints.find((kp2) => kp2.part === indexes[i + 1]); + if (pt0 && pt1 && pt0.score > (config3.body.minConfidence || 0) && pt1.score > (config3.body.minConfidence || 0)) + pt.push([pt0.position, pt1.position]); + } + annotations2[name] = pt; + } + const body4 = { id: 0, score, box: newBox.box, boxRaw: newBox.boxRaw, keypoints, annotations: annotations2 }; + bodyParts(body4); + bodies.push(body4); + return bodies; +} +function parseMultiPose(res, config3, image) { + const bodies = []; + for (let id2 = 0; id2 < res[0].length; id2++) { + const kpt4 = res[0][id2]; + const totalScore = Math.round(100 * kpt4[51 + 4]) / 100; + if (totalScore > config3.body.minConfidence) { + const keypoints = []; + for (let i = 0; i < 17; i++) { + const score = kpt4[3 * i + 2]; + if (score > config3.body.minConfidence) { + const positionRaw = [kpt4[3 * i + 1], kpt4[3 * i + 0]]; + keypoints.push({ + part: kpt3[i], + score: Math.round(100 * score) / 100, + positionRaw, + position: [Math.round((image.shape[2] || 0) * positionRaw[0]), Math.round((image.shape[1] || 0) * positionRaw[1])] + }); + } + } + const newBox = calc(keypoints.map((pt) => pt.position), [image.shape[2], image.shape[1]]); + const annotations2 = {}; + for (const [name, indexes] of Object.entries(connected3)) { + const pt = []; + for (let i = 0; i < indexes.length - 1; i++) { + const pt0 = keypoints.find((kp2) => kp2.part === indexes[i]); + const pt1 = keypoints.find((kp2) => kp2.part === indexes[i + 1]); + if (pt0 && pt1 && pt0.score > (config3.body.minConfidence || 0) && pt1.score > (config3.body.minConfidence || 0)) + pt.push([pt0.position, pt1.position]); + } + annotations2[name] = pt; + } + const body4 = { id: id2, score: totalScore, box: newBox.box, boxRaw: newBox.boxRaw, keypoints: [...keypoints], annotations: annotations2 }; + bodyParts(body4); + bodies.push(body4); + } + } + bodies.sort((a, b) => b.score - a.score); + if (bodies.length > config3.body.maxDetected) + bodies.length = config3.body.maxDetected; + return bodies; +} +async function predict17(input, config3) { + var _a2; + if (!(model18 == null ? void 0 : model18["executor"]) || !((_a2 = model18 == null ? void 0 : model18.inputs) == null ? void 0 : _a2[0].shape)) + return []; + if (!config3.skipAllowed) + cache6.boxes.length = 0; + skipped14++; + const skipTime = (config3.body.skipTime || 0) > now() - cache6.last; + const skipFrame = skipped14 < (config3.body.skipFrames || 0); + if (config3.skipAllowed && skipTime && skipFrame) { + return cache6.bodies; + } + return new Promise(async (resolve) => { + const t10 = {}; + skipped14 = 0; + t10.input = padInput(input, inputSize8); + t10.res = model18 == null ? void 0 : model18.execute(t10.input); + cache6.last = now(); + const res = await t10.res.array(); + cache6.bodies = t10.res.shape[2] === 17 ? parseSinglePose(res, config3, input) : parseMultiPose(res, config3, input); + for (const body4 of cache6.bodies) { + rescaleBody(body4, [input.shape[2] || 1, input.shape[1] || 1]); + jitter(body4.keypoints); + } + Object.keys(t10).forEach((tensor) => Ft(t10[tensor])); + resolve(cache6.bodies); + }); +} + +// src/object/nanodet.ts +var model19; +var last10 = []; +var lastTime15 = 0; +var skipped15 = Number.MAX_SAFE_INTEGER; +var inputSize9 = 0; +var scaleBox = 2.5; +async function load18(config3) { + if (!model19 || env.initial) { + model19 = await loadModel(config3.object.modelPath); + const inputs = (model19 == null ? void 0 : model19["executor"]) ? Object.values(model19.modelSignature["inputs"]) : void 0; + inputSize9 = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 416; + } else if (config3.debug) + log("cached model:", model19["modelUrl"]); + return model19; +} +async function process4(res, outputShape, config3) { + var _a2, _b; + let id2 = 0; + let results = []; + const size2 = inputSize9; + for (const strideSize of [1, 2, 4]) { + const baseSize = strideSize * 13; + const scoresT = jp(res.find((a) => a.shape[1] === baseSize ** 2 && (a.shape[2] || 0) === labels2.length)); + const scores = await scoresT.array(); + const featuresT = jp(res.find((a) => a.shape[1] === baseSize ** 2 && (a.shape[2] || 0) < labels2.length)); + const boxesMaxT = z(featuresT, [-1, 4, (((_a2 = featuresT.shape) == null ? void 0 : _a2[1]) || 0) / 4]); + const boxIdxT = Hv(boxesMaxT, 2); + const boxIdx = await boxIdxT.array(); + for (let i = 0; i < scoresT.shape[0]; i++) { + for (let j = 0; j < (((_b = scoresT.shape) == null ? void 0 : _b[1]) || 0); j++) { + const score = scores[i][j]; + if (score > (config3.object.minConfidence || 0) && j !== 61) { + const cx2 = (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 / size2)); + const [x6, y] = [ + cx2 - scaleBox / strideSize * boxOffset[0], + cy - scaleBox / strideSize * boxOffset[1] + ]; + const [w, h] = [ + cx2 + scaleBox / strideSize * boxOffset[2] - x6, + cy + scaleBox / strideSize * boxOffset[3] - y + ]; + let boxRaw = [x6, y, w, h]; + boxRaw = boxRaw.map((a) => Math.max(0, Math.min(a, 1))); + const box = [ + boxRaw[0] * outputShape[0], + boxRaw[1] * outputShape[1], + boxRaw[2] * outputShape[0], + boxRaw[3] * outputShape[1] + ]; + const result = { + id: id2++, + score: Math.round(100 * score) / 100, + class: j + 1, + label: labels2[j].label, + box: box.map((a) => Math.trunc(a)), + boxRaw + }; + results.push(result); + } + } + } + Ft([scoresT, featuresT, boxesMaxT, boxIdxT]); + } + 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 zq.nonMaxSuppressionAsync(nmsBoxes, nmsScores, config3.object.maxDetected || 0, config3.object.iouThreshold, config3.object.minConfidence); + nmsIdx = Array.from(await nms.data()); + Ft(nms); + } + results = results.filter((_val, idx) => nmsIdx.includes(idx)).sort((a, b) => b.score - a.score); + return results; +} +async function predict18(image, config3) { + if (!(model19 == null ? void 0 : model19["executor"])) + return []; + const skipTime = (config3.object.skipTime || 0) > now() - lastTime15; + const skipFrame = skipped15 < (config3.object.skipFrames || 0); + if (config3.skipAllowed && skipTime && skipFrame && last10.length > 0) { + skipped15++; + return last10; + } + skipped15 = 0; + if (!env.kernels.includes("mod") || !env.kernels.includes("sparsetodense")) + return last10; + return new Promise(async (resolve) => { + const outputSize2 = [image.shape[2] || 0, image.shape[1] || 0]; + const resizeT = zq.resizeBilinear(image, [inputSize9, inputSize9], false); + const normT = We(resizeT, constants.tf255); + const transposeT = Wp(normT, [0, 3, 1, 2]); + let objectT; + if (config3.object.enabled) + objectT = model19.execute(transposeT); + lastTime15 = now(); + const obj = await process4(objectT, outputSize2, config3); + last10 = obj; + Ft([resizeT, normT, transposeT, ...objectT]); + resolve(obj); + }); +} + +// src/body/posenetutils.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"] +]; +function getBoundingBox(keypoints) { + const coord = keypoints.reduce(({ maxX, maxY, minX, minY }, { position: { x: x6, y } }) => ({ + maxX: Math.max(maxX, x6), + maxY: Math.max(maxY, y), + minX: Math.min(minX, x6), + 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(poses, [height, width], [inputResolutionHeight, inputResolutionWidth]) { + const scaleY = height / inputResolutionHeight; + const scaleX = width / inputResolutionWidth; + const scalePose = (pose, i) => ({ + id: i, + score: pose.score, + boxRaw: [pose.box[0] / inputResolutionWidth, pose.box[1] / inputResolutionHeight, pose.box[2] / inputResolutionWidth, pose.box[3] / inputResolutionHeight], + box: [Math.trunc(pose.box[0] * scaleX), Math.trunc(pose.box[1] * scaleY), Math.trunc(pose.box[2] * scaleX), Math.trunc(pose.box[3] * scaleY)], + keypoints: pose.keypoints.map(({ score, part, position }) => ({ + score, + part, + position: [Math.trunc(position.x * scaleX), Math.trunc(position.y * scaleY)], + positionRaw: [position.x / inputResolutionHeight, position.y / inputResolutionHeight] + })), + annotations: {} + }); + const scaledPoses = poses.map((pose, i) => scalePose(pose, i)); + return scaledPoses; +} +var MaxHeap = class { + constructor(maxSize2, getElementValue) { + __publicField(this, "priorityQueue"); + __publicField(this, "numberOfElements"); + __publicField(this, "getElementValue"); + this.priorityQueue = new Array(maxSize2); + this.numberOfElements = -1; + this.getElementValue = getElementValue; + } + enqueue(x6) { + this.priorityQueue[++this.numberOfElements] = x6; + 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 t10 = this.priorityQueue[i]; + this.priorityQueue[i] = this.priorityQueue[j]; + this.priorityQueue[j] = t10; + } +}; +function getOffsetPoint(y, x6, keypoint, offsets) { + return { + y: offsets.get(y, x6, keypoint), + x: offsets.get(y, x6, keypoint + count) + }; +} +function getImageCoords(part, outputStride2, offsets) { + const { heatmapY, heatmapX, id: keypoint } = part; + const { y, x: x6 } = getOffsetPoint(heatmapY, heatmapX, keypoint, offsets); + return { + x: part.heatmapX * outputStride2 + x6, + 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, x12, y22, x22) { + const dy = y22 - y1; + const dx2 = x22 - x12; + return dy * dy + dx2 * dx2; +} +function addVectors(a, b) { + return { x: a.x + b.x, y: a.y + b.y }; +} + +// src/body/posenet.ts +var model20; +var poseNetOutputs = ["MobilenetV1/offset_2/BiasAdd", "MobilenetV1/heatmap_2/BiasAdd", "MobilenetV1/displacement_fwd_2/BiasAdd", "MobilenetV1/displacement_bwd_2/BiasAdd"]; +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(minConfidence2, 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 < minConfidence2) + continue; + if (scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores)) + queue.enqueue({ score, part: { heatmapY, heatmapX, id: keypointId } }); + } + } + } + return queue; +} +function withinRadius(poses, { x: x6, y }, keypointId) { + return poses.some(({ keypoints }) => { + var _a2; + const correspondingKeypoint = (_a2 = keypoints[keypointId]) == null ? void 0 : _a2.position; + if (!correspondingKeypoint) + return false; + return squaredDistance(y, x6, 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, minConfidence2) { + const poses = []; + const queue = buildPartWithScoreQueue(minConfidence2, scores); + while (poses.length < maxDetected && !queue.empty()) { + const root = queue.dequeue(); + const rootImageCoords = getImageCoords(root.part, outputStride, offsets); + if (withinRadius(poses, rootImageCoords, root.part.id)) + continue; + let keypoints = decodePose(root, scores, offsets, displacementsFwd, displacementsBwd); + keypoints = keypoints.filter((a) => a.score > minConfidence2); + const score = getInstanceScore(poses, keypoints); + const box = getBoundingBox(keypoints); + if (score > minConfidence2) + poses.push({ keypoints, box, score: Math.round(100 * score) / 100 }); + } + return poses; +} +async function predict19(input, config3) { + if (!(model20 == null ? void 0 : model20["executor"])) + return []; + const res = Ne(() => { + if (!model20.inputs[0].shape) + return []; + const resized = zq.resizeBilinear(input, [model20.inputs[0].shape[2], model20.inputs[0].shape[1]]); + const normalized = ke(We(qe(resized, "float32"), 127.5), 1); + const results = model20.execute(normalized, poseNetOutputs); + const results3d = results.map((y) => jp(y, [0])); + results3d[1] = Ms(results3d[1]); + return results3d; + }); + const buffers = await Promise.all(res.map((tensor) => tensor.buffer())); + for (const t10 of res) + Ft(t10); + const decoded = decode(buffers[0], buffers[1], buffers[2], buffers[3], config3.body.maxDetected, config3.body.minConfidence); + if (!model20.inputs[0].shape) + return []; + const scaled = scalePoses(decoded, [input.shape[1], input.shape[2]], [model20.inputs[0].shape[2], model20.inputs[0].shape[1]]); + return scaled; +} +async function load19(config3) { + if (!model20 || env.initial) + model20 = await loadModel(config3.body.modelPath); + else if (config3.debug) + log("cached model:", model20["modelUrl"]); + return model20; +} + +// src/segmentation/rvm.ts +var model21; +var outputNodes2 = ["fgr", "pha", "r1o", "r2o", "r3o", "r4o"]; +var t = {}; +var ratio = 0; +function init3(config3) { + Ft([t.r1i, t.r2i, t.r3i, t.r4i, t.downsample_ratio]); + t.r1i = nr(0); + t.r2i = nr(0); + t.r3i = nr(0); + t.r4i = nr(0); + ratio = config3.segmentation.ratio || 0.5; + t.downsample_ratio = nr(ratio); +} +async function load20(config3) { + if (!model21 || env.initial) + model21 = await loadModel(config3.segmentation.modelPath); + else if (config3.debug) + log("cached model:", model21["modelUrl"]); + init3(config3); + return model21; +} +var normalize = (r) => Ne(() => { + const squeeze = jp(r, [0]); + const mul = oe(squeeze, constants.tf255); + const cast = qe(mul, "int32"); + return cast; +}); +function getRGBA(fgr, pha) { + const rgb2 = fgr ? normalize(fgr) : Bs([pha.shape[1] || 0, pha.shape[2] || 0, 3], 255, "int32"); + const a = pha ? normalize(pha) : Bs([fgr.shape[1] || 0, fgr.shape[2] || 0, 1], 255, "int32"); + const rgba = gt([rgb2, a], -1); + Ft([rgb2, a]); + return rgba; +} +function getState(state) { + return Ne(() => { + const r = {}; + r.unstack = ko(state, -1); + r.concat = gt(r.unstack, 1); + r.split = $a(r.concat, 4, 1); + r.stack = gt(r.split, 2); + r.squeeze = jp(r.stack, [0]); + r.expand = _a(r.squeeze, -1); + r.add = ge(r.expand, 1); + r.mul = oe(r.add, 127.5); + r.cast = qe(r.mul, "int32"); + r.tile = fi(r.cast, [1, 1, 3]); + r.alpha = Bs([r.tile.shape[0] || 0, r.tile.shape[1] || 0, 1], 255, "int32"); + return gt([r.tile, r.alpha], -1); + }); +} +async function predict20(input, config3) { + if (!model21) + model21 = await load20(config3); + if (!(model21 == null ? void 0 : model21["executor"])) + return null; + t.src = We(input, 255); + if (ratio !== config3.segmentation.ratio) + init3(config3); + const [fgr, pha, r1o, r2o, r3o, r4o] = await model21.executeAsync(t, outputNodes2); + let rgba; + switch (config3.segmentation.mode || "default") { + case "default": + rgba = getRGBA(fgr, pha); + break; + case "alpha": + rgba = getRGBA(null, pha); + break; + case "foreground": + rgba = getRGBA(fgr, null); + break; + case "state": + rgba = getState(r1o); + break; + default: + rgba = nr(0); + } + Ft([t.src, fgr, pha, t.r1i, t.r2i, t.r3i, t.r4i]); + [t.r1i, t.r2i, t.r3i, t.r4i] = [r1o, r2o, r3o, r4o]; + return rgba; +} + +// src/segmentation/selfie.ts +var model22; +async function load21(config3) { + if (!model22 || env.initial) + model22 = await loadModel(config3.segmentation.modelPath); + else if (config3.debug) + log("cached model:", model22["modelUrl"]); + return model22; +} +async function predict21(input, config3) { + var _a2; + if (!model22) + model22 = await load21(config3); + if (!(model22 == null ? void 0 : model22["executor"]) || !((_a2 = model22 == null ? void 0 : model22.inputs) == null ? void 0 : _a2[0].shape)) + return null; + const t10 = {}; + t10.resize = zq.resizeBilinear(input, [model22.inputs[0].shape ? model22.inputs[0].shape[1] : 0, model22.inputs[0].shape ? model22.inputs[0].shape[2] : 0], false); + t10.norm = We(t10.resize, constants.tf255); + t10.res = model22.execute(t10.norm); + t10.squeeze = jp(t10.res, [0]); + t10.alpha = zq.resizeBilinear(t10.squeeze, [input.shape[1] || 0, input.shape[2] || 0]); + t10.mul = oe(t10.alpha, constants.tf255); + let rgba; + switch (config3.segmentation.mode || "default") { + case "default": + t10.input = jp(input); + t10.concat = gt([t10.input, t10.mul], -1); + rgba = qe(t10.concat, "int32"); + break; + case "alpha": + rgba = qe(t10.mul, "int32"); + break; + default: + rgba = nr(0); + } + Object.keys(t10).forEach((tensor) => Ft(t10[tensor])); + return rgba; +} + +// src/models.ts +function validateModel(instance, model23, name) { + var _a2, _b; + if (!model23) + return null; + if (!((_a2 = instance == null ? void 0 : instance.config) == null ? void 0 : _a2.validateModels)) + return null; + const simpleOps = ["const", "placeholder", "noop", "pad", "squeeze", "add", "sub", "mul", "div"]; + const ignoreOps = ["biasadd", "fusedbatchnormv3", "matmul", "switch", "shape", "merge", "split", "broadcastto"]; + const ops = []; + const missing = []; + const url = model23["modelUrl"]; + const executor = model23["executor"]; + if ((_b = executor == null ? void 0 : executor.graph) == null ? void 0 : _b.nodes) { + for (const kernel of Object.values(executor.graph.nodes)) { + const op2 = kernel.op.toLowerCase(); + if (!ops.includes(op2)) + ops.push(op2); + } + } else { + if (!executor && instance.config.debug) { + log("model not loaded", name); + } + } + for (const op2 of ops) { + if (!simpleOps.includes(op2) && !ignoreOps.includes(op2) && !instance.env.kernels.includes(op2) && !instance.env.kernels.includes(op2.replace("_", "")) && !instance.env.kernels.includes(op2.replace("native", "")) && !instance.env.kernels.includes(op2.replace("v2", ""))) { + missing.push(op2); + } + } + if (instance.config.debug && missing.length > 0) + log("model validation failed:", name, missing); + return missing.length > 0 ? { name, missing, ops, url } : null; +} +var Models = class { + constructor(currentInstance) { + __publicField(this, "instance"); + __publicField(this, "models"); + this.models = {}; + this.instance = currentInstance; + } + stats() { + let totalSizeFromManifest = 0; + let totalSizeWeights = 0; + let totalSizeLoading = 0; + for (const m of Object.values(modelStats)) { + totalSizeFromManifest += m.sizeFromManifest; + totalSizeWeights += m.sizeLoadedWeights; + totalSizeLoading += m.sizeDesired; + } + const percentageLoaded = totalSizeLoading > 0 ? totalSizeWeights / totalSizeLoading : 0; + return { + numLoadedModels: Object.values(modelStats).length, + numDefinedModels: Object.keys(this.models).length, + percentageLoaded, + totalSizeFromManifest, + totalSizeWeights, + totalSizeLoading, + modelStats: Object.values(modelStats) + }; + } + reset() { + for (const model23 of Object.keys(this.models)) + this.models[model23] = null; + } + async load() { + var _a2, _b, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j2, _k2, _l2, _m, _n2, _o2, _p2, _q2, _r2, _s2, _t, _u2, _v2, _w2, _x2, _y, _z2, _A2; + if (env.initial) + this.reset(); + const m = {}; + m.blazeface = this.instance.config.face.enabled && !this.models.blazeface ? load3(this.instance.config) : null; + m.antispoof = this.instance.config.face.enabled && ((_a2 = this.instance.config.face.antispoof) == null ? void 0 : _a2.enabled) && !this.models.antispoof ? load8(this.instance.config) : null; + m.liveness = this.instance.config.face.enabled && ((_b = this.instance.config.face.liveness) == null ? void 0 : _b.enabled) && !this.models.liveness ? load9(this.instance.config) : null; + m.faceres = this.instance.config.face.enabled && ((_c2 = this.instance.config.face.description) == null ? void 0 : _c2.enabled) && !this.models.faceres ? load7(this.instance.config) : null; + m.emotion = this.instance.config.face.enabled && ((_d2 = this.instance.config.face.emotion) == null ? void 0 : _d2.enabled) && !this.models.emotion ? load6(this.instance.config) : null; + m.iris = this.instance.config.face.enabled && ((_e2 = this.instance.config.face.iris) == null ? void 0 : _e2.enabled) && !((_f2 = this.instance.config.face.attention) == null ? void 0 : _f2.enabled) && !this.models.iris ? load4(this.instance.config) : null; + m.facemesh = this.instance.config.face.enabled && ((_g2 = this.instance.config.face.mesh) == null ? void 0 : _g2.enabled) && !this.models.facemesh ? load5(this.instance.config) : null; + m.gear = this.instance.config.face.enabled && ((_h2 = this.instance.config.face["gear"]) == null ? void 0 : _h2.enabled) && !this.models.gear ? load10(this.instance.config) : null; + m.ssrnetage = this.instance.config.face.enabled && ((_i2 = this.instance.config.face["ssrnet"]) == null ? void 0 : _i2.enabled) && !this.models.ssrnetage ? load11(this.instance.config) : null; + m.ssrnetgender = this.instance.config.face.enabled && ((_j2 = this.instance.config.face["ssrnet"]) == null ? void 0 : _j2.enabled) && !this.models.ssrnetgender ? load12(this.instance.config) : null; + m.mobilefacenet = this.instance.config.face.enabled && ((_k2 = this.instance.config.face["mobilefacenet"]) == null ? void 0 : _k2.enabled) && !this.models.mobilefacenet ? load13(this.instance.config) : null; + m.insightface = this.instance.config.face.enabled && ((_l2 = this.instance.config.face["insightface"]) == null ? void 0 : _l2.enabled) && !this.models.insightface ? load14(this.instance.config) : null; + m.blazepose = this.instance.config.body.enabled && !this.models.blazepose && ((_m = this.instance.config.body.modelPath) == null ? void 0 : _m.includes("blazepose")) ? loadPose(this.instance.config) : null; + m.blazeposedetect = this.instance.config.body.enabled && !this.models.blazeposedetect && this.instance.config.body["detector"] && this.instance.config.body["detector"].modelPath ? loadDetect(this.instance.config) : null; + m.efficientpose = this.instance.config.body.enabled && !this.models.efficientpose && ((_n2 = this.instance.config.body.modelPath) == null ? void 0 : _n2.includes("efficientpose")) ? load2(this.instance.config) : null; + m.movenet = this.instance.config.body.enabled && !this.models.movenet && ((_o2 = this.instance.config.body.modelPath) == null ? void 0 : _o2.includes("movenet")) ? load17(this.instance.config) : null; + m.posenet = this.instance.config.body.enabled && !this.models.posenet && ((_p2 = this.instance.config.body.modelPath) == null ? void 0 : _p2.includes("posenet")) ? load19(this.instance.config) : null; + m.handtrack = this.instance.config.hand.enabled && !this.models.handtrack && ((_r2 = (_q2 = this.instance.config.hand.detector) == null ? void 0 : _q2.modelPath) == null ? void 0 : _r2.includes("handtrack")) ? loadDetect2(this.instance.config) : null; + m.handskeleton = this.instance.config.hand.enabled && this.instance.config.hand.landmarks && !this.models.handskeleton && ((_t = (_s2 = this.instance.config.hand.detector) == null ? void 0 : _s2.modelPath) == null ? void 0 : _t.includes("handtrack")) ? loadSkeleton(this.instance.config) : null; + if ((_v2 = (_u2 = this.instance.config.hand.detector) == null ? void 0 : _u2.modelPath) == null ? void 0 : _v2.includes("handdetect")) + [m.handpose, m.handskeleton] = !this.models.handpose ? await load15(this.instance.config) : [null, null]; + m.centernet = this.instance.config.object.enabled && !this.models.centernet && ((_w2 = this.instance.config.object.modelPath) == null ? void 0 : _w2.includes("centernet")) ? load(this.instance.config) : null; + m.nanodet = this.instance.config.object.enabled && !this.models.nanodet && ((_x2 = this.instance.config.object.modelPath) == null ? void 0 : _x2.includes("nanodet")) ? load18(this.instance.config) : null; + m.selfie = this.instance.config.segmentation.enabled && !this.models.selfie && ((_y = this.instance.config.segmentation.modelPath) == null ? void 0 : _y.includes("selfie")) ? load21(this.instance.config) : null; + m.meet = this.instance.config.segmentation.enabled && !this.models.meet && ((_z2 = this.instance.config.segmentation.modelPath) == null ? void 0 : _z2.includes("meet")) ? load16(this.instance.config) : null; + m.rvm = this.instance.config.segmentation.enabled && !this.models.rvm && ((_A2 = this.instance.config.segmentation.modelPath) == null ? void 0 : _A2.includes("rvm")) ? load20(this.instance.config) : null; + await Promise.all([...Object.values(m)]); + for (const model23 of Object.keys(m)) + this.models[model23] = m[model23] || this.models[model23] || null; + } + list() { + const models3 = Object.keys(this.models).map((model23) => { + var _a2; + return { name: model23, loaded: this.models[model23] !== null, size: 0, url: this.models[model23] ? (_a2 = this.models[model23]) == null ? void 0 : _a2["modelUrl"] : null }; + }); + for (const m of models3) { + const stats = Object.keys(modelStats).find((s) => s.startsWith(m.name)); + if (!stats) + continue; + m.size = modelStats[stats].sizeLoadedWeights; + m.url = modelStats[stats].url; + } + return models3; + } + loaded() { + const list = this.list(); + const loaded = list.filter((model23) => model23.loaded).map((model23) => model23.name); + return loaded; + } + validate() { + const missing = []; + for (const defined of Object.keys(this.models)) { + const model23 = this.models[defined]; + if (!model23) + continue; + const res = validateModel(this.instance, model23, defined); + if (res) + missing.push(res); + } + return missing; + } +}; + +// src/util/persons.ts +function join2(faces, bodies, hands, gestures, shape) { + var _a2, _b, _c2, _d2, _e2, _f2; + let id2 = 0; + const persons = []; + for (const face4 of faces) { + const person2 = { id: id2++, face: face4, body: null, hands: { left: null, right: null }, gestures: [], box: [0, 0, 0, 0] }; + for (const body4 of bodies) { + if (face4.box[0] > body4.box[0] && face4.box[0] < body4.box[0] + body4.box[2] && face4.box[1] + face4.box[3] > body4.box[1] && face4.box[1] + face4.box[3] < body4.box[1] + body4.box[3]) { + person2.body = body4; + } + } + if (person2.body) { + for (const hand3 of hands) { + if (hand3.box[0] + hand3.box[2] > person2.body.box[0] && hand3.box[0] + hand3.box[2] < person2.body.box[0] + person2.body.box[2] && hand3.box[1] + hand3.box[3] > person2.body.box[1] && hand3.box[1] + hand3.box[3] < person2.body.box[1] + person2.body.box[3]) { + if (person2.hands) + person2.hands.left = hand3; + } + if (hand3.box[0] < person2.body.box[0] + person2.body.box[2] && hand3.box[0] > person2.body.box[0] && hand3.box[1] + hand3.box[3] > person2.body.box[1] && hand3.box[1] + hand3.box[3] < person2.body.box[1] + person2.body.box[3]) { + if (person2.hands) + person2.hands.right = hand3; + } + } + } + for (const gesture2 of gestures) { + if (gesture2["face"] !== void 0 && gesture2["face"] === face4.id) + person2.gestures.push(gesture2); + else if (gesture2["iris"] !== void 0 && gesture2["iris"] === face4.id) + person2.gestures.push(gesture2); + else if (gesture2["body"] !== void 0 && gesture2["body"] === ((_a2 = person2.body) == null ? void 0 : _a2.id)) + person2.gestures.push(gesture2); + else if (gesture2["hand"] !== void 0 && gesture2["hand"] === ((_b = person2.hands.left) == null ? void 0 : _b.id)) + person2.gestures.push(gesture2); + else if (gesture2["hand"] !== void 0 && gesture2["hand"] === ((_c2 = person2.hands.right) == null ? void 0 : _c2.id)) + person2.gestures.push(gesture2); + } + const x6 = []; + const y = []; + const extractXY = (box) => { + if (box && box.length === 4) { + x6.push(box[0], box[0] + box[2]); + y.push(box[1], box[1] + box[3]); + } + }; + extractXY(person2.face.box); + extractXY((_d2 = person2.body) == null ? void 0 : _d2.box); + extractXY((_e2 = person2.hands.left) == null ? void 0 : _e2.box); + extractXY((_f2 = person2.hands.right) == null ? void 0 : _f2.box); + const minX = Math.min(...x6); + const minY = Math.min(...y); + person2.box = [minX, minY, Math.max(...x6) - minX, Math.max(...y) - minY]; + if ((shape == null ? void 0 : shape[1]) && (shape == null ? void 0 : shape[2])) + person2.boxRaw = [person2.box[0] / shape[2], person2.box[1] / shape[1], person2.box[2] / shape[2], person2.box[3] / shape[1]]; + persons.push(person2); + } + return persons; +} + +// src/sample.ts +var face3 = ` +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`; +var body3 = ` +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 +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAa2p1UYo5adbz+xbxMlvqJ1OqjDHLXree0ejmzNrWm953tPmTPWbWneZ7yoy5YhjrXXTjH8s75N +mtkyxt0VZM2/m175N1V03yTKubMLXVXybeYLLX2VXy7eam+b0bOg4VquJW+rry4/O9uyZOq3UjVm +9r25axMzPaIdvhns1kzbZddM0p5Y47z8/R2+HcF03Doi1a8+Xzvbv+TotJnjDXkt+K8ODHp8cY8N +IpSO0RCwF2YAAAAAAAAACvUZYw6fJkntWN3k8dfHz2vLucdz8mkjFE9bz1+UOZosX1UzPm0nqI/W +MYo9FlcPNklfFGeH/NshLGun+Cz6PtHZtVZWlRLS+jxPkRpIn7rdoupHTdA5s6SI+7H6Mfo+32Y2 ++To3neSIiZ7A0IjPXpXLePlMotGW3272t85datKzHZjbTVnsDj+FG/2Y/RlGP4R+jo20u7H6N1Ql +o+H8I/REY957R+jpfReiK6eOYHLtj2tttH6KrY/6Y/R2c+kjeJiFVtLG24hxpw7/AHY/RRkw9O37 +O99Hrt1YX0tfOBLjcGp4XF8c+u8fs9c4dcVcGemSI61nd3IneN1orQAAAAAAAAAAAAABFqxes1tE +TE9JiUgPKcX4RbRXnNgiZwWnrH4XPi28PdXpW9JraImsxtMS8pxXhF9DecuGJtgmf+1TWW2N/la1 +L7N7T5e3Vy6W3hsYcvLbqzbO9jvvCzvDR0+XeO7crO6FmGSvRThy/RtVXJ92elvk2rRvDUzU7pl4 +izsd2J3jeBpcNz+Lg5LT7+Pp+Xk3W7js5eAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs0NTrN96Yp6edkW8Wzm6+LNTq4pvTHO9vOfRoWtt +1mes95YWvs1s2fZldddOczLPLn2ju0MmebT3YZc2/mpm3qqllN1drsbZIhr3yzvtHf4AsvlYYseb +V5Yx4KTe0+UQ6nDvZ3UazbJqd8OKeu33peq0eh0+hxcmnxxWPOfOfm0mP+steT/ji8N9mKY9suum +L37+HHaPm9DSlaVitKxWsdohI0Y22gAgAAAAAAAAAABXnyRhw3yT92Nwef4xm8bVzET0rPJH5d12 +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 +NO67NbkhzNVnmInqzaOZrL93JyZeV0M1++7S02jvxDWxhxx033tPpC8Z6rrezWjmZyazJG2/u03h +2vFibTHoqvamiwVwY+nLGzV0+SZ1Mx8G0/45tOhzJ5lXMc3UVXRdlF1HP+iYsDPLPPy49/tz1+Te +pSIr0ho6ak5Ms5J8o2q6NImOrHV7XX488ypzTtHXo0s9t6zG7c1G1qz6ubeZiZ3UatXJG3yauSO7 +cvMTEx5tPLb3prPRMVr0HB8vicNxf0+7+kt+LOJwTJyY/Bnz3tH93X36N58cWvq6LSyiyndMSlC7 +mZcymLJiwLosmJVRLKLAtiU7q4lMSCzc3YxJuDMRuAlKAEgAAAlAkAAAAAABKAEgAAAAAJAAAAAA +AAAAAAAEgAAAAAAAAAAAAAkAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAhIAAACAAAASgAAAAAAEAAAA +hGzJAImGMwzQDDZjNVuyNgUTVhNGxysZqDVmiu1G5NN2M4waM0+DCaN2cbGcQNGaMZq3JxMJxA1J +qx2bU4kU09slorWNwa20z02RXHbJbl26QvtFovbHWkxEdJt5y2MOHlr2U1W3jx+1hiw8vSO63lmI +XRTaEWmtY6snRHO1VpmJ+DjavpSZl2s8b7y4HFcnh0n0gha5ebJN55KRM2mdoiPN6fh+kpwXh0Wy +RHj5Otp/s5Ps1p62y31+em9aTMYt/OfVfxTiPjZ52naI7fBrI5t66xz5+a1rW7yx0eSL6iZjtEOX +qNbSletom3lENjh2fbHzbbWt3iVozruc+5ztWubf4M4ybpQ2Oboyrva0Vjza8WdDR4OkXt3n9ldX +kaePP9VtYqctYhdvt5oivTeCZ2YOxXk6ubqMfV0b9mrljfqlFcq88k7z2U5axeItDa1OPessuC8P +ya7XRWYnwqdbT/ZMilvIu4dpslNdixXja8Y5tt85djZdbDWnGOesRtXFtuw6T27No5Kx2OrKYQlC +ExKJgBnEpiyvdlEgsizKLKollFgWxLKJVRLKJBbEp3VxLKJBnuMWQJEbpBIAAAJAAAABIAAAAAAA +lAJAAAAAAAAAAAAAASAAAAAAAAAAAAAJAAAABAJABAlAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAA +AAABAJQAAAAgAABAAI2EoBGyJhkgGPKxmqxAKpownHC+YRMdN5BrTj67R3bOn01o7p01Iv71u89o +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 +2Q==`; + +// src/warmup.ts +async function warmupBitmap(instance) { + const b64toBlob = (base64, type = "application/octet-stream") => fetch(`data:${type};base64,${base64}`).then((res2) => res2.blob()); + let blob; + let res; + switch (instance.config.warmup) { + case "face": + blob = await b64toBlob(face3); + break; + case "body": + case "full": + blob = await b64toBlob(body3); + break; + default: + blob = null; + } + if (blob) { + const bitmap = await createImageBitmap(blob); + res = await instance.detect(bitmap, instance.config); + bitmap.close(); + } + return res; +} +async function warmupCanvas(instance) { + return new Promise((resolve) => { + let src; + switch (instance.config.warmup) { + case "face": + src = "data:image/jpeg;base64," + face3; + break; + case "full": + case "body": + src = "data:image/jpeg;base64," + body3; + break; + default: + src = ""; + } + let img; + if (typeof Image !== "undefined") + img = new Image(); + else if (env.Image) + img = new env.Image(); + else + return; + img.onload = async () => { + const canvas3 = canvas(img.naturalWidth, img.naturalHeight); + if (!canvas3) { + log("Warmup: Canvas not found"); + resolve(void 0); + } else { + const ctx = canvas3.getContext("2d"); + if (ctx) + ctx.drawImage(img, 0, 0); + const tensor = await instance.image(canvas3, true); + const res = tensor.tensor ? await instance.detect(tensor.tensor, instance.config) : void 0; + resolve(res); + } + }; + if (src) + img.src = src; + else + resolve(void 0); + }); +} +async function warmupNode(instance) { + const atob2 = (str) => Buffer.from(str, "base64"); + let img; + if (instance.config.warmup === "face") + img = atob2(face3); + else + img = atob2(body3); + let res; + if ("node" in tfjs_esm_exports && Pie() === "tensorflow") { + const data = (void 0).decodeJpeg(img); + const expanded = _a(data, 0); + instance.tf.dispose(data); + res = await instance.detect(expanded, instance.config); + instance.tf.dispose(expanded); + } else { + if (instance.config.debug) + log("Warmup tfjs-node not loaded"); + } + return res; +} +async function runInference(instance) { + let res; + if (typeof createImageBitmap === "function") + res = await warmupBitmap(instance); + else if (typeof Image !== "undefined" || env.Canvas !== void 0) + res = await warmupCanvas(instance); + else + res = await warmupNode(instance); + return res; +} +async function runCompile(instance) { + var _a2, _b, _c2, _d2; + if (!P().flagRegistry.ENGINE_COMPILE_ONLY) + return; + const backendType = Pie(); + const webGLBackend = Bie(); + if (backendType !== "webgl" && backendType !== "humangl" || !(webGLBackend == null ? void 0 : webGLBackend["checkCompileCompletion"])) { + return; + } + P().set("ENGINE_COMPILE_ONLY", true); + const numTensorsStart = cr().state.numTensors; + const compiledModels = []; + for (const [modelName, model23] of Object.entries(instance.models).filter(([key, val]) => key !== null && val !== null)) { + const shape = (model23 == null ? void 0 : model23.modelSignature) && ((_b = (_a2 = model23 == null ? void 0 : model23.inputs) == null ? void 0 : _a2[0]) == null ? void 0 : _b.shape) ? [...model23.inputs[0].shape] : [1, 64, 64, 3]; + const dtype = (model23 == null ? void 0 : model23.modelSignature) && ((_d2 = (_c2 = model23 == null ? void 0 : model23.inputs) == null ? void 0 : _c2[0]) == null ? void 0 : _d2.dtype) ? model23.inputs[0].dtype : "float32"; + for (let dim = 0; dim < shape.length; dim++) { + if (shape[dim] === -1) + shape[dim] = dim === 0 ? 1 : 64; + } + const tensor = Wr(shape, dtype); + try { + const res = model23.execute(tensor); + compiledModels.push(modelName); + if (Array.isArray(res)) + res.forEach((t10) => Ft(t10)); + else + Ft(res); + } catch (e) { + if (instance.config.debug) + log("compile fail model:", modelName); + } + Ft(tensor); + } + const kernels = await webGLBackend["checkCompileCompletionAsync"](); + webGLBackend["getUniformLocations"](); + if (instance.config.debug) + log("compile pass:", { models: compiledModels, kernels: kernels.length }); + P().set("ENGINE_COMPILE_ONLY", false); + const numTensorsEnd = cr().state.numTensors; + if (numTensorsEnd - numTensorsStart > 0) + log("tensor leak:", numTensorsEnd - numTensorsStart); +} +async function warmup(instance, userConfig) { + await check(instance, false); + const t0 = now(); + instance.state = "warmup"; + if (userConfig) + instance.config = mergeDeep(instance.config, userConfig); + if (!instance.config.warmup || instance.config.warmup.length === 0 || instance.config.warmup === "none") { + return empty(); + } + return new Promise(async (resolve) => { + await instance.models.load(); + await runCompile(instance); + const res = await runInference(instance); + const t12 = now(); + if (instance.config.debug) + log("warmup", instance.config.warmup, Math.round(t12 - t0), "ms"); + instance.emit("warmup"); + resolve(res); + }); +} + +// src/human.ts +var _numTensors, _analyzeMemoryLeaks, _checkSanity, _sanity, _loops; +var Human = class { + constructor(userConfig) { + __publicField(this, "version"); + __publicField(this, "config"); + __publicField(this, "result"); + __publicField(this, "state"); + __publicField(this, "process"); + __publicField(this, "tf"); + __publicField(this, "env", env); + __publicField(this, "draw", draw_exports); + __publicField(this, "match", match_exports); + __publicField(this, "models"); + __publicField(this, "events"); + __publicField(this, "faceTriangulation"); + __publicField(this, "faceUVMap"); + __publicField(this, "performance"); + __privateAdd(this, _numTensors, void 0); + __privateAdd(this, _analyzeMemoryLeaks, void 0); + __privateAdd(this, _checkSanity, void 0); + __publicField(this, "analyze", (...msg) => { + if (!__privateGet(this, _analyzeMemoryLeaks)) + return; + const currentTensors = this.tf.engine().state.numTensors; + const previousTensors = __privateGet(this, _numTensors); + __privateSet(this, _numTensors, currentTensors); + const leaked = currentTensors - previousTensors; + if (leaked !== 0) + log(...msg, leaked); + }); + __privateAdd(this, _sanity, (input) => { + if (!__privateGet(this, _checkSanity)) + return null; + if (!input) + return "input is not defined"; + if (this.env.node && !(input instanceof ut)) + return "input must be a tensor"; + try { + this.tf.getBackend(); + } catch (e) { + return "backend not loaded"; + } + return null; + }); + __publicField(this, "webcam", new WebCam()); + __publicField(this, "emit", (event) => { + var _a2; + if ((_a2 = this.events) == null ? void 0 : _a2.dispatchEvent) + this.events.dispatchEvent(new Event(event)); + }); + __privateAdd(this, _loops, {}); + const tfVersion = (Cne.tfjs || YW).replace(/-(.*)/, ""); + config.wasmPath = `https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${tfVersion}/dist/`; + config.modelBasePath = env.browser ? "../models/" : "file://models/"; + this.version = version; + Object.defineProperty(this, "version", { value: version }); + this.config = JSON.parse(JSON.stringify(config)); + Object.seal(this.config); + this.config.cacheModels = typeof indexedDB !== "undefined"; + if (userConfig) + this.config = mergeDeep(this.config, userConfig); + setModelLoadOptions(this.config); + this.tf = tfjs_esm_exports; + this.state = "idle"; + __privateSet(this, _numTensors, 0); + __privateSet(this, _analyzeMemoryLeaks, false); + __privateSet(this, _checkSanity, false); + this.performance = {}; + this.events = typeof EventTarget !== "undefined" ? new EventTarget() : void 0; + this.models = new Models(this); + init2(); + this.result = empty(); + this.process = { tensor: null, canvas: null }; + this.faceTriangulation = triangulation; + this.faceUVMap = uvmap; + validateModel(this, null, ""); + this.emit("create"); + if (this.config.debug || this.env.browser) + log(`version: ${this.version}`); + if (this.config.debug) + log(`tfjs version: ${this.tf.version["tfjs-core"]}`); + const envTemp = JSON.parse(JSON.stringify(this.env)); + delete envTemp.kernels; + delete envTemp.initial; + delete envTemp.perfadd; + if (this.config.debug) + log("environment:", envTemp); + } + reset() { + const currentBackend = this.config.backend; + this.config = JSON.parse(JSON.stringify(config)); + this.config.backend = currentBackend; + reset(); + env.initial = true; + } + validate(userConfig) { + const msgs = validate(config, userConfig || this.config); + if (msgs.length === 0) + this.config = mergeDeep(this.config, userConfig); + return msgs; + } + now() { + return now(); + } + image(input, getTensor = false) { + return process2(input, this.config, getTensor); + } + async segmentation(input, userConfig) { + var _a2, _b, _c2; + if (userConfig) + this.config = mergeDeep(this.config, userConfig); + if (!this.config.segmentation.enabled) + return null; + const processed = await process2(input, this.config); + if (!processed.tensor) + return null; + let tensor = null; + if ((_a2 = this.config.segmentation.modelPath) == null ? void 0 : _a2.includes("rvm")) + tensor = await predict20(processed.tensor, this.config); + if ((_b = this.config.segmentation.modelPath) == null ? void 0 : _b.includes("meet")) + tensor = await predict16(processed.tensor, this.config); + if ((_c2 = this.config.segmentation.modelPath) == null ? void 0 : _c2.includes("selfie")) + tensor = await predict21(processed.tensor, this.config); + Ft(processed.tensor); + return tensor; + } + compare(firstImageTensor, secondImageTensor) { + return compare(this.config, firstImageTensor, secondImageTensor); + } + async init() { + await check(this, true); + await this.tf.ready(); + reset(); + } + async load(userConfig) { + this.state = "load"; + const timeStamp = now(); + const count2 = Object.values(this.models).filter((model23) => model23).length; + if (userConfig) + this.config = mergeDeep(this.config, userConfig); + if (this.env.initial) { + if (!await check(this, false)) + log("error: backend check failed"); + await Die(); + if (this.env.browser) { + if (this.config.debug) + log("configuration:", this.config); + if (this.config.debug) + log("tf flags:", this.tf.ENV.flags); + } + } + await this.models.load(); + if (this.env.initial && this.config.debug) + log("tf engine state:", this.tf.engine().state.numBytes, "bytes", this.tf.engine().state.numTensors, "tensors"); + this.env.initial = false; + const loaded = Object.values(this.models).filter((model23) => model23).length; + if (loaded !== count2) { + this.models.validate(); + this.emit("load"); + } + const current = Math.trunc(now() - timeStamp); + if (current > (this.performance.loadModels || 0)) + this.performance.loadModels = this.env.perfadd ? (this.performance.loadModels || 0) + current : current; + } + next(result = this.result) { + return calc2(result, this.config); + } + async warmup(userConfig) { + const t0 = now(); + const res = await warmup(this, userConfig); + const t12 = now(); + this.performance.warmup = Math.trunc(t12 - t0); + return res; + } + async profile(input, userConfig) { + const profile = await this.tf.profile(() => this.detect(input, userConfig)); + const kernels = {}; + let total = 0; + for (const kernel of profile.kernels) { + const ms2 = Number(kernel.kernelTimeMs) || 0; + if (kernels[kernel.name]) + kernels[kernel.name] += ms2; + else + kernels[kernel.name] = ms2; + total += ms2; + } + const kernelArr = []; + Object.entries(kernels).forEach((key) => kernelArr.push({ kernel: key[0], time: key[1], perc: 0 })); + for (const kernel of kernelArr) { + kernel.perc = Math.round(1e3 * kernel.time / total) / 1e3; + kernel.time = Math.round(1e3 * kernel.time) / 1e3; + } + kernelArr.sort((a, b) => b.time - a.time); + kernelArr.length = 20; + return kernelArr; + } + async detect(input, userConfig) { + this.state = "detect"; + return new Promise(async (resolve) => { + var _a2, _b, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j2, _k2, _l2, _m, _n2, _o2, _p2, _q2, _r2, _s2, _t, _u2; + 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); + this.emit("error"); + resolve(empty(error)); + } + const timeStart = now(); + await this.load(); + timeStamp = now(); + this.state = "image"; + const img = await process2(input, this.config); + this.process = img; + this.performance.inputProcess = this.env.perfadd ? (this.performance.inputProcess || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); + this.analyze("Get Image:"); + if (!img.tensor) { + if (this.config.debug) + log("could not convert input to tensor"); + this.emit("error"); + resolve(empty("could not convert input to tensor")); + return; + } + this.emit("image"); + timeStamp = now(); + this.config.skipAllowed = await skip(this.config, img.tensor); + this.config.filter.autoBrightness = (this.config.filter.autoBrightness || false) && this.config.skipAllowed; + if (!this.performance.totalFrames) + this.performance.totalFrames = 0; + if (!this.performance.cachedFrames) + this.performance.cachedFrames = 0; + this.performance.totalFrames++; + if (this.config.skipAllowed) + this.performance.cachedFrames++; + this.performance.cacheCheck = this.env.perfadd ? (this.performance.cacheCheck || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); + this.analyze("Check Changed:"); + let faceRes = []; + let bodyRes = []; + let handRes = []; + let objectRes = []; + this.state = "detect:face"; + if (this.config.async) { + faceRes = this.config.face.enabled ? detectFace(this, img.tensor) : []; + if (this.performance.face) + delete this.performance.face; + } else { + timeStamp = now(); + faceRes = this.config.face.enabled ? await detectFace(this, img.tensor) : []; + this.performance.face = this.env.perfadd ? (this.performance.face || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); + } + if (this.config.async && (this.config.body.maxDetected === -1 || this.config.hand.maxDetected === -1)) + faceRes = await faceRes; + this.analyze("Start Body:"); + this.state = "detect:body"; + const bodyConfig = this.config.body.maxDetected === -1 ? mergeDeep(this.config, { body: { maxDetected: this.config.face.enabled ? 1 * faceRes.length : 1 } }) : this.config; + if (this.config.async) { + if ((_a2 = this.config.body.modelPath) == null ? void 0 : _a2.includes("posenet")) + bodyRes = this.config.body.enabled ? predict19(img.tensor, bodyConfig) : []; + else if ((_b = this.config.body.modelPath) == null ? void 0 : _b.includes("blazepose")) + bodyRes = this.config.body.enabled ? predict(img.tensor, bodyConfig) : []; + else if ((_c2 = this.config.body.modelPath) == null ? void 0 : _c2.includes("efficientpose")) + bodyRes = this.config.body.enabled ? predict3(img.tensor, bodyConfig) : []; + else if ((_d2 = this.config.body.modelPath) == null ? void 0 : _d2.includes("movenet")) + bodyRes = this.config.body.enabled ? predict17(img.tensor, bodyConfig) : []; + if (this.performance.body) + delete this.performance.body; + } else { + timeStamp = now(); + if ((_e2 = this.config.body.modelPath) == null ? void 0 : _e2.includes("posenet")) + bodyRes = this.config.body.enabled ? await predict19(img.tensor, bodyConfig) : []; + else if ((_f2 = this.config.body.modelPath) == null ? void 0 : _f2.includes("blazepose")) + bodyRes = this.config.body.enabled ? await predict(img.tensor, bodyConfig) : []; + else if ((_g2 = this.config.body.modelPath) == null ? void 0 : _g2.includes("efficientpose")) + bodyRes = this.config.body.enabled ? await predict3(img.tensor, bodyConfig) : []; + else if ((_h2 = this.config.body.modelPath) == null ? void 0 : _h2.includes("movenet")) + bodyRes = this.config.body.enabled ? await predict17(img.tensor, bodyConfig) : []; + this.performance.body = this.env.perfadd ? (this.performance.body || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); + } + this.analyze("End Body:"); + this.analyze("Start Hand:"); + this.state = "detect:hand"; + const handConfig = this.config.hand.maxDetected === -1 ? mergeDeep(this.config, { hand: { maxDetected: this.config.face.enabled ? 2 * faceRes.length : 1 } }) : this.config; + if (this.config.async) { + if ((_j2 = (_i2 = this.config.hand.detector) == null ? void 0 : _i2.modelPath) == null ? void 0 : _j2.includes("handdetect")) + handRes = this.config.hand.enabled ? predict14(img.tensor, handConfig) : []; + else if ((_l2 = (_k2 = this.config.hand.detector) == null ? void 0 : _k2.modelPath) == null ? void 0 : _l2.includes("handtrack")) + handRes = this.config.hand.enabled ? predict15(img.tensor, handConfig) : []; + if (this.performance.hand) + delete this.performance.hand; + } else { + timeStamp = now(); + if ((_n2 = (_m = this.config.hand.detector) == null ? void 0 : _m.modelPath) == null ? void 0 : _n2.includes("handdetect")) + handRes = this.config.hand.enabled ? await predict14(img.tensor, handConfig) : []; + else if ((_p2 = (_o2 = this.config.hand.detector) == null ? void 0 : _o2.modelPath) == null ? void 0 : _p2.includes("handtrack")) + handRes = this.config.hand.enabled ? await predict15(img.tensor, handConfig) : []; + this.performance.hand = this.env.perfadd ? (this.performance.hand || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); + } + this.analyze("End Hand:"); + this.analyze("Start Object:"); + this.state = "detect:object"; + if (this.config.async) { + if ((_q2 = this.config.object.modelPath) == null ? void 0 : _q2.includes("nanodet")) + objectRes = this.config.object.enabled ? predict18(img.tensor, this.config) : []; + else if ((_r2 = this.config.object.modelPath) == null ? void 0 : _r2.includes("centernet")) + objectRes = this.config.object.enabled ? predict2(img.tensor, this.config) : []; + if (this.performance.object) + delete this.performance.object; + } else { + timeStamp = now(); + if ((_s2 = this.config.object.modelPath) == null ? void 0 : _s2.includes("nanodet")) + objectRes = this.config.object.enabled ? await predict18(img.tensor, this.config) : []; + else if ((_t = this.config.object.modelPath) == null ? void 0 : _t.includes("centernet")) + objectRes = this.config.object.enabled ? await predict2(img.tensor, this.config) : []; + this.performance.object = this.env.perfadd ? (this.performance.object || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); + } + this.analyze("End Object:"); + this.state = "detect:await"; + if (this.config.async) + [faceRes, bodyRes, handRes, objectRes] = await Promise.all([faceRes, bodyRes, handRes, objectRes]); + this.state = "detect:gesture"; + let gestureRes = []; + if (this.config.gesture.enabled) { + timeStamp = now(); + gestureRes = [...face2(faceRes), ...body2(bodyRes), ...hand2(handRes), ...iris2(faceRes)]; + if (!this.config.async) + this.performance.gesture = this.env.perfadd ? (this.performance.gesture || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); + else if (this.performance.gesture) + delete this.performance.gesture; + } + this.performance.total = this.env.perfadd ? (this.performance.total || 0) + Math.trunc(now() - timeStart) : Math.trunc(now() - timeStart); + const shape = ((_u2 = this.process.tensor) == null ? void 0 : _u2.shape) || [0, 0, 0, 0]; + this.result = { + face: faceRes, + body: bodyRes, + hand: handRes, + gesture: gestureRes, + object: objectRes, + performance: this.performance, + canvas: this.process.canvas, + timestamp: Date.now(), + error: null, + width: shape[2], + height: shape[1], + get persons() { + return join2(faceRes, bodyRes, handRes, gestureRes, shape); + } + }; + Ft(img.tensor); + this.emit("detect"); + this.state = "idle"; + resolve(this.result); + }); + } + async sleep(ms2) { + return new Promise((resolve) => { + setTimeout(resolve, ms2); + }); + } + async video(element, run = true, delay = 0) { + if (run) { + if (!__privateGet(this, _loops)[element.id]) { + if (this.config.debug) + log("video start", element.id); + __privateGet(this, _loops)[element.id] = true; + } + if (!element.paused && __privateGet(this, _loops)[element.id] && element.readyState >= 2) + await this.detect(element); + if (delay > 0) + await this.sleep(delay); + if (__privateGet(this, _loops)[element.id]) + requestAnimationFrame(() => this.video(element, run, delay)); + } else { + if (this.config.debug) + log("video stop", element.id); + __privateGet(this, _loops)[element.id] = false; + } + } +}; +_numTensors = new WeakMap(); +_analyzeMemoryLeaks = new WeakMap(); +_checkSanity = new WeakMap(); +_sanity = new WeakMap(); +_loops = new WeakMap(); +export { + Env, + Human, + Human as default, + config as defaults, + draw_exports as draw, + empty, + env, + match_exports as match, + models_exports2 as models +}; +//# sourceMappingURL=human.esm.js.map diff --git a/dist/human.esm.js.map b/dist/human.esm.js.map new file mode 100644 index 00000000..a2f516e2 --- /dev/null +++ b/dist/human.esm.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["tfjs.esm.js", "../src/util/util.ts", "../src/config.ts", "../src/image/imagefxshaders.ts", "../src/image/imagefx.ts", "../src/image/enhance.ts", "../src/image/image.ts", "../src/util/env.ts", "../src/util/webcam.ts", "../src/tfjs/load.ts", "../src/tfjs/humangl.ts", "../src/tfjs/constants.ts", "../src/tfjs/backend.ts", "../src/draw/draw.ts", "../src/draw/primitives.ts", "../src/draw/options.ts", "../src/face/facemeshcoords.ts", "../src/face/constants.ts", "../src/draw/face.ts", "../src/draw/body.ts", "../src/draw/hand.ts", "../src/draw/object.ts", "../src/draw/gesture.ts", "../src/draw/labels.ts", "../src/body/blazeposecoords.ts", "../src/body/blazeposedetector.ts", "../src/util/box.ts", "../src/body/blazepose.ts", "../src/object/labels.ts", "../src/object/centernet.ts", "../src/body/efficientposecoords.ts", "../src/body/efficientpose.ts", "../src/face/facemeshutil.ts", "../src/face/blazeface.ts", "../src/face/iris.ts", "../src/face/attention.ts", "../src/face/facemesh.ts", "../src/gear/emotion.ts", "../src/face/faceres.ts", "../src/face/mask.ts", "../src/face/antispoof.ts", "../src/face/liveness.ts", "../src/gear/gear.ts", "../src/gear/ssrnet-age.ts", "../src/gear/ssrnet-gender.ts", "../src/face/mobilefacenet.ts", "../src/face/insightface.ts", "../src/face/angles.ts", "../src/face/anthropometry.ts", "../src/face/face.ts", "../src/hand/fingerdef.ts", "../src/hand/fingergesture.ts", "../src/hand/fingerpose.ts", "../src/gesture/gesture.ts", "../src/hand/handposeutil.ts", "../src/hand/handposeanchors.ts", "../src/hand/handposedetector.ts", "../src/hand/handposepipeline.ts", "../src/hand/handpose.ts", "../src/hand/handtrack.ts", "../src/result.ts", "../src/body/movenetcoords.ts", "../src/util/interpolate.ts", "../src/segmentation/meet.ts", "../src/face/match.ts", "../src/models.ts", "../src/body/movenetfix.ts", "../src/body/movenet.ts", "../src/object/nanodet.ts", "../src/body/posenetutils.ts", "../src/body/posenet.ts", "../src/segmentation/rvm.ts", "../src/segmentation/selfie.ts", "../src/util/persons.ts", "../src/sample.ts", "../src/warmup.ts", "../src/human.ts"], + "sourcesContent": ["/*\n Human\n homepage: \n author: '\n*/\n\nvar QV=Object.create;var fb=Object.defineProperty;var ZV=Object.getOwnPropertyDescriptor;var JV=Object.getOwnPropertyNames;var ez=Object.getPrototypeOf,tz=Object.prototype.hasOwnProperty;var Em=(r=>typeof require!=\"undefined\"?require:typeof Proxy!=\"undefined\"?new Proxy(r,{get:(e,t)=>(typeof require!=\"undefined\"?require:e)[t]}):r)(function(r){if(typeof require!=\"undefined\")return require.apply(this,arguments);throw new Error('Dynamic require of \"'+r+'\" is not supported')});var Kt=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),Be=(r,e)=>{for(var t in e)fb(r,t,{get:e[t],enumerable:!0})},rz=(r,e,t,o)=>{if(e&&typeof e==\"object\"||typeof e==\"function\")for(let n of JV(e))!tz.call(r,n)&&n!==t&&fb(r,n,{get:()=>e[n],enumerable:!(o=ZV(e,n))||o.enumerable});return r};var rp=(r,e,t)=>(t=r!=null?QV(ez(r)):{},rz(e||!r||!r.__esModule?fb(t,\"default\",{value:r,enumerable:!0}):t,r));var _0=Kt((Vne,N0)=>{N0.exports=wt;var Oo=null;try{Oo=new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0,1,13,2,96,0,1,127,96,4,127,127,127,127,1,127,3,7,6,0,1,1,1,1,1,6,6,1,127,1,65,0,11,7,50,6,3,109,117,108,0,1,5,100,105,118,95,115,0,2,5,100,105,118,95,117,0,3,5,114,101,109,95,115,0,4,5,114,101,109,95,117,0,5,8,103,101,116,95,104,105,103,104,0,0,10,191,1,6,4,0,35,0,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,126,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,127,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,128,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,129,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,130,34,4,66,32,135,167,36,0,32,4,167,11])),{}).exports}catch(r){}function wt(r,e,t){this.low=r|0,this.high=e|0,this.unsigned=!!t}wt.prototype.__isLong__;Object.defineProperty(wt.prototype,\"__isLong__\",{value:!0});function Br(r){return(r&&r.__isLong__)===!0}wt.isLong=Br;var y0={},b0={};function eu(r,e){var t,o,n;return e?(r>>>=0,(n=0<=r&&r<256)&&(o=b0[r],o)?o:(t=St(r,(r|0)<0?-1:0,!0),n&&(b0[r]=t),t)):(r|=0,(n=-128<=r&&r<128)&&(o=y0[r],o)?o:(t=St(r,r<0?-1:0,!1),n&&(y0[r]=t),t))}wt.fromInt=eu;function Mo(r,e){if(isNaN(r))return e?Ji:Lo;if(e){if(r<0)return Ji;if(r>=S0)return T0}else{if(r<=-I0)return Lr;if(r+1>=I0)return k0}return r<0?Mo(-r,e).neg():St(r%Dp|0,r/Dp|0,e)}wt.fromNumber=Mo;function St(r,e,t){return new wt(r,e,t)}wt.fromBits=St;var Wm=Math.pow;function _b(r,e,t){if(r.length===0)throw Error(\"empty string\");if(r===\"NaN\"||r===\"Infinity\"||r===\"+Infinity\"||r===\"-Infinity\")return Lo;if(typeof e==\"number\"?(t=e,e=!1):e=!!e,t=t||10,t<2||360)throw Error(\"interior hyphen\");if(o===0)return _b(r.substring(1),e,t).neg();for(var n=Mo(Wm(t,8)),s=Lo,a=0;a>>0:this.low};ce.toNumber=function(){return this.unsigned?(this.high>>>0)*Dp+(this.low>>>0):this.high*Dp+(this.low>>>0)};ce.toString=function(e){if(e=e||10,e<2||36>>0,c=u.toString(e);if(a=p,a.isZero())return c+i;for(;c.length<6;)c=\"0\"+c;i=\"\"+c+i}};ce.getHighBits=function(){return this.high};ce.getHighBitsUnsigned=function(){return this.high>>>0};ce.getLowBits=function(){return this.low};ce.getLowBitsUnsigned=function(){return this.low>>>0};ce.getNumBitsAbs=function(){if(this.isNegative())return this.eq(Lr)?64:this.neg().getNumBitsAbs();for(var e=this.high!=0?this.high:this.low,t=31;t>0&&(e&1<=0};ce.isOdd=function(){return(this.low&1)===1};ce.isEven=function(){return(this.low&1)===0};ce.equals=function(e){return Br(e)||(e=ts(e)),this.unsigned!==e.unsigned&&this.high>>>31===1&&e.high>>>31===1?!1:this.high===e.high&&this.low===e.low};ce.eq=ce.equals;ce.notEquals=function(e){return!this.eq(e)};ce.neq=ce.notEquals;ce.ne=ce.notEquals;ce.lessThan=function(e){return this.comp(e)<0};ce.lt=ce.lessThan;ce.lessThanOrEqual=function(e){return this.comp(e)<=0};ce.lte=ce.lessThanOrEqual;ce.le=ce.lessThanOrEqual;ce.greaterThan=function(e){return this.comp(e)>0};ce.gt=ce.greaterThan;ce.greaterThanOrEqual=function(e){return this.comp(e)>=0};ce.gte=ce.greaterThanOrEqual;ce.ge=ce.greaterThanOrEqual;ce.compare=function(e){if(Br(e)||(e=ts(e)),this.eq(e))return 0;var t=this.isNegative(),o=e.isNegative();return t&&!o?-1:!t&&o?1:this.unsigned?e.high>>>0>this.high>>>0||e.high===this.high&&e.low>>>0>this.low>>>0?-1:1:this.sub(e).isNegative()?-1:1};ce.comp=ce.compare;ce.negate=function(){return!this.unsigned&&this.eq(Lr)?Lr:this.not().add(Fp)};ce.neg=ce.negate;ce.add=function(e){Br(e)||(e=ts(e));var t=this.high>>>16,o=this.high&65535,n=this.low>>>16,s=this.low&65535,a=e.high>>>16,i=e.high&65535,p=e.low>>>16,u=e.low&65535,c=0,l=0,m=0,f=0;return f+=s+u,m+=f>>>16,f&=65535,m+=n+p,l+=m>>>16,m&=65535,l+=o+i,c+=l>>>16,l&=65535,c+=t+a,c&=65535,St(m<<16|f,c<<16|l,this.unsigned)};ce.subtract=function(e){return Br(e)||(e=ts(e)),this.add(e.neg())};ce.sub=ce.subtract;ce.multiply=function(e){if(this.isZero())return Lo;if(Br(e)||(e=ts(e)),Oo){var t=Oo.mul(this.low,this.high,e.low,e.high);return St(t,Oo.get_high(),this.unsigned)}if(e.isZero())return Lo;if(this.eq(Lr))return e.isOdd()?Lr:Lo;if(e.eq(Lr))return this.isOdd()?Lr:Lo;if(this.isNegative())return e.isNegative()?this.neg().mul(e.neg()):this.neg().mul(e).neg();if(e.isNegative())return this.mul(e.neg()).neg();if(this.lt(w0)&&e.lt(w0))return Mo(this.toNumber()*e.toNumber(),this.unsigned);var o=this.high>>>16,n=this.high&65535,s=this.low>>>16,a=this.low&65535,i=e.high>>>16,p=e.high&65535,u=e.low>>>16,c=e.low&65535,l=0,m=0,f=0,d=0;return d+=a*c,f+=d>>>16,d&=65535,f+=s*c,m+=f>>>16,f&=65535,f+=a*u,m+=f>>>16,f&=65535,m+=n*c,l+=m>>>16,m&=65535,m+=s*u,l+=m>>>16,m&=65535,m+=a*p,l+=m>>>16,m&=65535,l+=o*c+n*u+s*p+a*i,l&=65535,St(f<<16|d,l<<16|m,this.unsigned)};ce.mul=ce.multiply;ce.divide=function(e){if(Br(e)||(e=ts(e)),e.isZero())throw Error(\"division by zero\");if(Oo){if(!this.unsigned&&this.high===-2147483648&&e.low===-1&&e.high===-1)return this;var t=(this.unsigned?Oo.div_u:Oo.div_s)(this.low,this.high,e.low,e.high);return St(t,Oo.get_high(),this.unsigned)}if(this.isZero())return this.unsigned?Ji:Lo;var o,n,s;if(this.unsigned){if(e.unsigned||(e=e.toUnsigned()),e.gt(this))return Ji;if(e.gt(this.shru(1)))return v0;s=Ji}else{if(this.eq(Lr)){if(e.eq(Fp)||e.eq(Nb))return Lr;if(e.eq(Lr))return Fp;var a=this.shr(1);return o=a.div(e).shl(1),o.eq(Lo)?e.isNegative()?Fp:Nb:(n=this.sub(e.mul(o)),s=o.add(n.div(e)),s)}else if(e.eq(Lr))return this.unsigned?Ji:Lo;if(this.isNegative())return e.isNegative()?this.neg().div(e.neg()):this.neg().div(e).neg();if(e.isNegative())return this.div(e.neg()).neg();s=Lo}for(n=this;n.gte(e);){o=Math.max(1,Math.floor(n.toNumber()/e.toNumber()));for(var i=Math.ceil(Math.log(o)/Math.LN2),p=i<=48?1:Wm(2,i-48),u=Mo(o),c=u.mul(e);c.isNegative()||c.gt(n);)o-=p,u=Mo(o,this.unsigned),c=u.mul(e);u.isZero()&&(u=Fp),s=s.add(u),n=n.sub(c)}return s};ce.div=ce.divide;ce.modulo=function(e){if(Br(e)||(e=ts(e)),Oo){var t=(this.unsigned?Oo.rem_u:Oo.rem_s)(this.low,this.high,e.low,e.high);return St(t,Oo.get_high(),this.unsigned)}return this.sub(this.div(e).mul(e))};ce.mod=ce.modulo;ce.rem=ce.modulo;ce.not=function(){return St(~this.low,~this.high,this.unsigned)};ce.and=function(e){return Br(e)||(e=ts(e)),St(this.low&e.low,this.high&e.high,this.unsigned)};ce.or=function(e){return Br(e)||(e=ts(e)),St(this.low|e.low,this.high|e.high,this.unsigned)};ce.xor=function(e){return Br(e)||(e=ts(e)),St(this.low^e.low,this.high^e.high,this.unsigned)};ce.shiftLeft=function(e){return Br(e)&&(e=e.toInt()),(e&=63)===0?this:e<32?St(this.low<>>32-e,this.unsigned):St(0,this.low<>>e|this.high<<32-e,this.high>>e,this.unsigned):St(this.high>>e-32,this.high>=0?0:-1,this.unsigned)};ce.shr=ce.shiftRight;ce.shiftRightUnsigned=function(e){if(Br(e)&&(e=e.toInt()),e&=63,e===0)return this;var t=this.high;if(e<32){var o=this.low;return St(o>>>e|t<<32-e,t>>>e,this.unsigned)}else return e===32?St(t,0,this.unsigned):St(t>>>e-32,0,this.unsigned)};ce.shru=ce.shiftRightUnsigned;ce.shr_u=ce.shiftRightUnsigned;ce.toSigned=function(){return this.unsigned?St(this.low,this.high,!1):this};ce.toUnsigned=function(){return this.unsigned?this:St(this.low,this.high,!0)};ce.toBytes=function(e){return e?this.toBytesLE():this.toBytesBE()};ce.toBytesLE=function(){var e=this.high,t=this.low;return[t&255,t>>>8&255,t>>>16&255,t>>>24,e&255,e>>>8&255,e>>>16&255,e>>>24]};ce.toBytesBE=function(){var e=this.high,t=this.low;return[e>>>24,e>>>16&255,e>>>8&255,e&255,t>>>24,t>>>16&255,t>>>8&255,t&255]};wt.fromBytes=function(e,t,o){return o?wt.fromBytesLE(e,t):wt.fromBytesBE(e,t)};wt.fromBytesLE=function(e,t){return new wt(e[0]|e[1]<<8|e[2]<<16|e[3]<<24,e[4]|e[5]<<8|e[6]<<16|e[7]<<24,t)};wt.fromBytesBE=function(e,t){return new wt(e[4]<<24|e[5]<<16|e[6]<<8|e[7],e[0]<<24|e[1]<<16|e[2]<<8|e[3],t)}});var pv=Kt(()=>{});var cv=Kt(()=>{});var l1=Kt((c1,hC)=>{(function(r,e,t){function o(i){var p=this,u=a();p.next=function(){var c=2091639*p.s0+p.c*23283064365386963e-26;return p.s0=p.s1,p.s1=p.s2,p.s2=c-(p.c=c|0)},p.c=1,p.s0=u(\" \"),p.s1=u(\" \"),p.s2=u(\" \"),p.s0-=u(i),p.s0<0&&(p.s0+=1),p.s1-=u(i),p.s1<0&&(p.s1+=1),p.s2-=u(i),p.s2<0&&(p.s2+=1),u=null}function n(i,p){return p.c=i.c,p.s0=i.s0,p.s1=i.s1,p.s2=i.s2,p}function s(i,p){var u=new o(i),c=p&&p.state,l=u.next;return l.int32=function(){return u.next()*4294967296|0},l.double=function(){return l()+(l()*2097152|0)*11102230246251565e-32},l.quick=l,c&&(typeof c==\"object\"&&n(c,u),l.state=function(){return n(u,{})}),l}function a(){var i=4022871197,p=function(u){u=String(u);for(var c=0;c>>0,l-=i,l*=i,i=l>>>0,l-=i,i+=l*4294967296}return(i>>>0)*23283064365386963e-26};return p}e&&e.exports?e.exports=s:t&&t.amd?t(function(){return s}):this.alea=s})(c1,typeof hC==\"object\"&&hC,typeof define==\"function\"&&define)});var f1=Kt((m1,gC)=>{(function(r,e,t){function o(a){var i=this,p=\"\";i.x=0,i.y=0,i.z=0,i.w=0,i.next=function(){var c=i.x^i.x<<11;return i.x=i.y,i.y=i.z,i.z=i.w,i.w^=i.w>>>19^c^c>>>8},a===(a|0)?i.x=a:p+=a;for(var u=0;u>>0)/4294967296};return c.double=function(){do var l=p.next()>>>11,m=(p.next()>>>0)/4294967296,f=(l+m)/(1<<21);while(f===0);return f},c.int32=p.next,c.quick=c,u&&(typeof u==\"object\"&&n(u,p),c.state=function(){return n(p,{})}),c}e&&e.exports?e.exports=s:t&&t.amd?t(function(){return s}):this.xor128=s})(m1,typeof gC==\"object\"&&gC,typeof define==\"function\"&&define)});var h1=Kt((d1,xC)=>{(function(r,e,t){function o(a){var i=this,p=\"\";i.next=function(){var c=i.x^i.x>>>2;return i.x=i.y,i.y=i.z,i.z=i.w,i.w=i.v,(i.d=i.d+362437|0)+(i.v=i.v^i.v<<4^(c^c<<1))|0},i.x=0,i.y=0,i.z=0,i.w=0,i.v=0,a===(a|0)?i.x=a:p+=a;for(var u=0;u>>4),i.next()}function n(a,i){return i.x=a.x,i.y=a.y,i.z=a.z,i.w=a.w,i.v=a.v,i.d=a.d,i}function s(a,i){var p=new o(a),u=i&&i.state,c=function(){return(p.next()>>>0)/4294967296};return c.double=function(){do var l=p.next()>>>11,m=(p.next()>>>0)/4294967296,f=(l+m)/(1<<21);while(f===0);return f},c.int32=p.next,c.quick=c,u&&(typeof u==\"object\"&&n(u,p),c.state=function(){return n(p,{})}),c}e&&e.exports?e.exports=s:t&&t.amd?t(function(){return s}):this.xorwow=s})(d1,typeof xC==\"object\"&&xC,typeof define==\"function\"&&define)});var x1=Kt((g1,yC)=>{(function(r,e,t){function o(a){var i=this;i.next=function(){var u=i.x,c=i.i,l,m,f;return l=u[c],l^=l>>>7,m=l^l<<24,l=u[c+1&7],m^=l^l>>>10,l=u[c+3&7],m^=l^l>>>3,l=u[c+4&7],m^=l^l<<7,l=u[c+7&7],l=l^l<<13,m^=l^l<<9,u[c]=m,i.i=c+1&7,m};function p(u,c){var l,m,f=[];if(c===(c|0))m=f[0]=c;else for(c=\"\"+c,l=0;l0;--l)u.next()}p(i,a)}function n(a,i){return i.x=a.x.slice(),i.i=a.i,i}function s(a,i){a==null&&(a=+new Date);var p=new o(a),u=i&&i.state,c=function(){return(p.next()>>>0)/4294967296};return c.double=function(){do var l=p.next()>>>11,m=(p.next()>>>0)/4294967296,f=(l+m)/(1<<21);while(f===0);return f},c.int32=p.next,c.quick=c,u&&(u.x&&n(u,p),c.state=function(){return n(p,{})}),c}e&&e.exports?e.exports=s:t&&t.amd?t(function(){return s}):this.xorshift7=s})(g1,typeof yC==\"object\"&&yC,typeof define==\"function\"&&define)});var b1=Kt((y1,bC)=>{(function(r,e,t){function o(a){var i=this;i.next=function(){var u=i.w,c=i.X,l=i.i,m,f;return i.w=u=u+1640531527|0,f=c[l+34&127],m=c[l=l+1&127],f^=f<<13,m^=m<<17,f^=f>>>15,m^=m>>>12,f=c[l]=f^m,i.i=l,f+(u^u>>>16)|0};function p(u,c){var l,m,f,d,h,g=[],y=128;for(c===(c|0)?(m=c,c=null):(c=c+\"\\0\",m=0,y=Math.max(y,c.length)),f=0,d=-32;d>>15,m^=m<<4,m^=m>>>13,d>=0&&(h=h+1640531527|0,l=g[d&127]^=m+h,f=l==0?f+1:0);for(f>=128&&(g[(c&&c.length||0)&127]=-1),f=127,d=4*128;d>0;--d)m=g[f+34&127],l=g[f=f+1&127],m^=m<<13,l^=l<<17,m^=m>>>15,l^=l>>>12,g[f]=m^l;u.w=h,u.X=g,u.i=f}p(i,a)}function n(a,i){return i.i=a.i,i.w=a.w,i.X=a.X.slice(),i}function s(a,i){a==null&&(a=+new Date);var p=new o(a),u=i&&i.state,c=function(){return(p.next()>>>0)/4294967296};return c.double=function(){do var l=p.next()>>>11,m=(p.next()>>>0)/4294967296,f=(l+m)/(1<<21);while(f===0);return f},c.int32=p.next,c.quick=c,u&&(u.X&&n(u,p),c.state=function(){return n(p,{})}),c}e&&e.exports?e.exports=s:t&&t.amd?t(function(){return s}):this.xor4096=s})(y1,typeof bC==\"object\"&&bC,typeof define==\"function\"&&define)});var I1=Kt((C1,CC)=>{(function(r,e,t){function o(a){var i=this,p=\"\";i.next=function(){var c=i.b,l=i.c,m=i.d,f=i.a;return c=c<<25^c>>>7^l,l=l-m|0,m=m<<24^m>>>8^f,f=f-c|0,i.b=c=c<<20^c>>>12^l,i.c=l=l-m|0,i.d=m<<16^l>>>16^f,i.a=f-c|0},i.a=0,i.b=0,i.c=-1640531527,i.d=1367130551,a===Math.floor(a)?(i.a=a/4294967296|0,i.b=a|0):p+=a;for(var u=0;u>>0)/4294967296};return c.double=function(){do var l=p.next()>>>11,m=(p.next()>>>0)/4294967296,f=(l+m)/(1<<21);while(f===0);return f},c.int32=p.next,c.quick=c,u&&(typeof u==\"object\"&&n(u,p),c.state=function(){return n(p,{})}),c}e&&e.exports?e.exports=s:t&&t.amd?t(function(){return s}):this.tychei=s})(C1,typeof CC==\"object\"&&CC,typeof define==\"function\"&&define)});var w1=Kt(()=>{});var v1=Kt((S1,Of)=>{(function(r,e,t){var o=256,n=6,s=52,a=\"random\",i=t.pow(o,n),p=t.pow(2,s),u=p*2,c=o-1,l;function m(C,w,k){var _=[];w=w==!0?{entropy:!0}:w||{};var E=g(h(w.entropy?[C,b(e)]:C==null?y():C,3),_),R=new f(_),A=function(){for(var D=R.g(n),O=i,M=0;D=u;)D/=2,O/=2,M>>>=1;return(D+M)/O};return A.int32=function(){return R.g(4)|0},A.quick=function(){return R.g(4)/4294967296},A.double=A,g(b(R.S),e),(w.pass||k||function(D,O,M,L){return L&&(L.S&&d(L,R),D.state=function(){return d(R,{})}),M?(t[a]=D,O):D})(A,E,\"global\"in w?w.global:this==t,w.state)}function f(C){var w,k=C.length,_=this,E=0,R=_.i=_.j=0,A=_.S=[];for(k||(C=[k++]);E{var F4=l1(),D4=f1(),P4=h1(),O4=x1(),M4=b1(),L4=I1(),fu=v1();fu.alea=F4;fu.xor128=D4;fu.xorwow=P4;fu.xorshift7=O4;fu.xor4096=M4;fu.tychei=L4;k1.exports=fu});var Vl=Kt(()=>{});var Qw=Kt(()=>{});var D3=Kt(()=>{});var P3=Kt(()=>{});var O3=Kt(()=>{});var M3=Kt((Fg,Jw)=>{var Zw=(()=>{var r=typeof document!=\"undefined\"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename!=\"undefined\"&&(r=r||__filename),function(e){e=e||{};function t(){return Q.buffer!=De&&Tt(Q.buffer),ft}function o(){return Q.buffer!=De&&Tt(Q.buffer),at}function n(){return Q.buffer!=De&&Tt(Q.buffer),dt}function s(){return Q.buffer!=De&&Tt(Q.buffer),Fr}function a(){return Q.buffer!=De&&Tt(Q.buffer),Pt}function i(){return Q.buffer!=De&&Tt(Q.buffer),jr}function p(){return Q.buffer!=De&&Tt(Q.buffer),er}var u=typeof e!=\"undefined\"?e:{},c,l;u.ready=new Promise(function(F,B){c=F,l=B});var m;typeof process!=\"undefined\"&&process.listeners&&(m={uncaughtException:process.listeners(\"uncaughtException\"),unhandledRejection:process.listeners(\"unhandledRejection\")});var f=Object.assign({},u),d=[],h=\"./this.program\",g=(F,B)=>{throw B},y=typeof window==\"object\",b=typeof importScripts==\"function\",C=typeof process==\"object\"&&typeof process.versions==\"object\"&&typeof process.versions.node==\"string\",w=u.ENVIRONMENT_IS_PTHREAD||!1,k=\"\";function _(F){return u.locateFile?u.locateFile(F,k):k+F}var E,R,A,D;function O(F){if(F instanceof Di)return;q(\"exiting due to exception: \"+F)}if(C){b?k=Vl().dirname(k)+\"/\":k=__dirname+\"/\";var M,L;typeof Em==\"function\"&&(M=Qw(),L=Vl()),E=(B,re)=>(B=L.normalize(B),M.readFileSync(B,re?void 0:\"utf8\")),A=B=>{var re=E(B,!0);return re.buffer||(re=new Uint8Array(re)),re},R=(B,re,le)=>{B=L.normalize(B),M.readFile(B,function(Te,Ze){Te?le(Te):re(Ze.buffer)})},process.argv.length>1&&(h=process.argv[1].replace(/\\\\/g,\"/\")),d=process.argv.slice(2),process.on(\"uncaughtException\",function(B){if(!(B instanceof Di))throw B}),process.on(\"unhandledRejection\",function(B){throw B}),g=(B,re)=>{if(tn())throw process.exitCode=B,re;O(re),process.exit(B)},u.inspect=function(){return\"[Emscripten Module object]\"};let F;try{F=D3()}catch(B){throw console.error('The \"worker_threads\" module is not supported in this node.js build - perhaps a newer version is needed?'),B}global.Worker=F.Worker}else(y||b)&&(b?k=self.location.href:typeof document!=\"undefined\"&&document.currentScript&&(k=document.currentScript.src),typeof r!=\"undefined\"&&r&&(k=r),k.indexOf(\"blob:\")!==0?k=k.substr(0,k.replace(/[?#].*/,\"\").lastIndexOf(\"/\")+1):k=\"\",C||(E=F=>{var B=new XMLHttpRequest;return B.open(\"GET\",F,!1),B.send(null),B.responseText},b&&(A=F=>{var B=new XMLHttpRequest;return B.open(\"GET\",F,!1),B.responseType=\"arraybuffer\",B.send(null),new Uint8Array(B.response)}),R=(F,B,re)=>{var le=new XMLHttpRequest;le.open(\"GET\",F,!0),le.responseType=\"arraybuffer\",le.onload=()=>{if(le.status==200||le.status==0&&le.response){B(le.response);return}re()},le.onerror=re,le.send(null)}),D=F=>document.title=F);C&&typeof performance==\"undefined\"&&(global.performance=P3().performance);var W=console.log.bind(console),V=console.warn.bind(console);C&&(W=F=>M.writeSync(1,F+`\n`),V=F=>M.writeSync(2,F+`\n`));var G=u.print||W,q=u.printErr||V;Object.assign(u,f),f=null,u.arguments&&(d=u.arguments),u.thisProgram&&(h=u.thisProgram),u.quit&&(g=u.quit);var H=4,j=Atomics.load,Y=Atomics.store,Z=Atomics.compareExchange,ee;u.wasmBinary&&(ee=u.wasmBinary);var X=u.noExitRuntime||!0;typeof WebAssembly!=\"object\"&&Xu(\"no native wasm support detected\");var Q,se,ie=!1,de;function Ie(F,B){F||Xu(B)}var Se=typeof TextDecoder!=\"undefined\"?new TextDecoder(\"utf8\"):void 0;function Ee(F,B,re){for(var le=B+re,Te=B;F[Te]&&!(Te>=le);)++Te;if(Te-B>16&&F.buffer&&Se)return Se.decode(F.buffer instanceof SharedArrayBuffer?F.slice(B,Te):F.subarray(B,Te));for(var Ze=\"\";B>10,56320|Zr&1023)}}return Ze}function Me(F,B){return F?Ee(o(),F,B):\"\"}function st(F,B,re,le){if(!(le>0))return 0;for(var Te=re,Ze=re+le-1,$e=0;$e=55296&&Pe<=57343){var Wt=F.charCodeAt(++$e);Pe=65536+((Pe&1023)<<10)|Wt&1023}if(Pe<=127){if(re>=Ze)break;B[re++]=Pe}else if(Pe<=2047){if(re+1>=Ze)break;B[re++]=192|Pe>>6,B[re++]=128|Pe&63}else if(Pe<=65535){if(re+2>=Ze)break;B[re++]=224|Pe>>12,B[re++]=128|Pe>>6&63,B[re++]=128|Pe&63}else{if(re+3>=Ze)break;B[re++]=240|Pe>>18,B[re++]=128|Pe>>12&63,B[re++]=128|Pe>>6&63,B[re++]=128|Pe&63}}return B[re]=0,re-Te}function pt(F,B,re){return st(F,o(),B,re)}var De,ft,at,dt,It,Fr,Pt,jr,er;w&&(De=u.buffer);function Tt(F){De=F,u.HEAP8=ft=new Int8Array(F),u.HEAP16=dt=new Int16Array(F),u.HEAP32=Fr=new Int32Array(F),u.HEAPU8=at=new Uint8Array(F),u.HEAPU16=It=new Uint16Array(F),u.HEAPU32=Pt=new Uint32Array(F),u.HEAPF32=jr=new Float32Array(F),u.HEAPF64=er=new Float64Array(F)}var tr=u.INITIAL_MEMORY||16777216;if(w)Q=u.wasmMemory,De=u.buffer;else if(u.wasmMemory)Q=u.wasmMemory;else if(Q=new WebAssembly.Memory({initial:tr/65536,maximum:32768,shared:!0}),!(Q.buffer instanceof SharedArrayBuffer))throw q(\"requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag\"),C&&console.log(\"(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)\"),Error(\"bad memory\");Q&&(De=Q.buffer),tr=De.byteLength,Tt(De);var rr,Xr=[],Yr=[],pr=[],Qs=!1;function tn(){return X}function Ua(){if(u.preRun)for(typeof u.preRun==\"function\"&&(u.preRun=[u.preRun]);u.preRun.length;)Lc(u.preRun.shift());Uc(Xr)}function jt(){Qs=!0,!w&&Uc(Yr)}function Zs(){if(!w){if(u.postRun)for(typeof u.postRun==\"function\"&&(u.postRun=[u.postRun]);u.postRun.length;)KS(u.postRun.shift());Uc(pr)}}function Lc(F){Xr.unshift(F)}function Bc(F){Yr.unshift(F)}function KS(F){pr.unshift(F)}var Ga=0,ju=null,Js=null;function jS(F){Ga++,u.monitorRunDependencies&&u.monitorRunDependencies(Ga)}function XS(F){if(Ga--,u.monitorRunDependencies&&u.monitorRunDependencies(Ga),Ga==0&&(ju!==null&&(clearInterval(ju),ju=null),Js)){var B=Js;Js=null,B()}}function Xu(F){w?postMessage({cmd:\"onAbort\",arg:F}):u.onAbort&&u.onAbort(F),F=\"Aborted(\"+F+\")\",q(F),ie=!0,de=1,F+=\". Build with -sASSERTIONS for more info.\";var B=new WebAssembly.RuntimeError(F);throw l(B),B}var $x=\"data:application/octet-stream;base64,\";function nm(F){return F.startsWith($x)}function Vc(F){return F.startsWith(\"file://\")}var dr;dr=\"tfjs-backend-wasm-threaded-simd.wasm\",nm(dr)||(dr=_(dr));function sm(F){try{if(F==dr&&ee)return new Uint8Array(ee);if(A)return A(F);throw\"both async and sync fetching of the wasm failed\"}catch(B){Xu(B)}}function Rx(){if(!ee&&(y||b)){if(typeof fetch==\"function\"&&!Vc(dr))return fetch(dr,{credentials:\"same-origin\"}).then(function(F){if(!F.ok)throw\"failed to load wasm binary file at '\"+dr+\"'\";return F.arrayBuffer()}).catch(function(){return sm(dr)});if(R)return new Promise(function(F,B){R(dr,function(re){F(new Uint8Array(re))},B)})}return Promise.resolve().then(function(){return sm(dr)})}function Ax(){var F={env:xm,wasi_snapshot_preview1:xm};function B($e,Pe){var Wt=$e.exports;if(u.asm=Wt,Wx(u.asm._emscripten_tls_init),rr=u.asm.__indirect_function_table,Bc(u.asm.__wasm_call_ctors),se=Pe,!w){var Zr=Fe.unusedWorkers.length;Fe.unusedWorkers.forEach(function(ta){Fe.loadWasmModuleToWorker(ta,function(){--Zr||XS(\"wasm-instantiate\")})})}}w||jS(\"wasm-instantiate\");function re($e){B($e.instance,$e.module)}function le($e){return Rx().then(function(Pe){return WebAssembly.instantiate(Pe,F)}).then(function(Pe){return Pe}).then($e,function(Pe){q(\"failed to asynchronously prepare wasm: \"+Pe),Xu(Pe)})}function Te(){return!ee&&typeof WebAssembly.instantiateStreaming==\"function\"&&!nm(dr)&&!Vc(dr)&&!C&&typeof fetch==\"function\"?fetch(dr,{credentials:\"same-origin\"}).then(function($e){var Pe=WebAssembly.instantiateStreaming($e,F);return Pe.then(re,function(Wt){return q(\"wasm streaming compile failed: \"+Wt),q(\"falling back to ArrayBuffer instantiation\"),le(re)})}):le(re)}if(u.instantiateWasm)try{var Ze=u.instantiateWasm(F,B);return Ze}catch($e){q(\"Module.instantiateWasm callback failed with error: \"+$e),l($e)}return Te().catch(l),{}}var Fx,YS,Dx={};function Di(F){this.name=\"ExitStatus\",this.message=\"Program terminated with exit(\"+F+\")\",this.status=F}function Px(F){var B=Fe.pthreads[F];delete Fe.pthreads[F],B.terminate(),cb(F),Fe.runningWorkers.splice(Fe.runningWorkers.indexOf(B),1),B.pthread_ptr=0}function Ox(F){var B=Fe.pthreads[F];B.postMessage({cmd:\"cancel\"})}function zc(F){var B=Fe.pthreads[F];Ie(B),Fe.returnWorkerToPool(B)}function am(F){var B=Fe.getNewWorker();if(!B)return 6;Fe.runningWorkers.push(B),Fe.pthreads[F.pthread_ptr]=B,B.pthread_ptr=F.pthread_ptr;var re={cmd:\"run\",start_routine:F.startRoutine,arg:F.arg,pthread_ptr:F.pthread_ptr};return B.runPthread=()=>{re.time=performance.now(),B.postMessage(re,F.transferList)},B.loaded&&(B.runPthread(),delete B.runPthread),0}var im={varargs:void 0,get:function(){im.varargs+=4;var F=s()[im.varargs-4>>2];return F},getStr:function(F){var B=Me(F);return B}};function Wc(F){if(w)return Ha(1,1,F);de=F,tn()||(Fe.terminateAllThreads(),u.onExit&&u.onExit(F),ie=!0),g(F,new Di(F))}function QS(F,B){if(de=F,!B&&w)throw pm(F),\"unwind\";Wc(F)}var um=QS;function Mx(F){if(F instanceof Di||F==\"unwind\")return de;g(1,F)}var Fe={unusedWorkers:[],runningWorkers:[],tlsInitFunctions:[],pthreads:{},init:function(){w?Fe.initWorker():Fe.initMainThread()},initMainThread:function(){for(var F=8;F--;)Fe.allocateUnusedWorker()},initWorker:function(){X=!1},setExitStatus:function(F){de=F},terminateAllThreads:function(){for(var F of Object.values(Fe.pthreads))Fe.returnWorkerToPool(F);for(var F of Fe.unusedWorkers)F.terminate();Fe.unusedWorkers=[]},returnWorkerToPool:function(F){var B=F.pthread_ptr;delete Fe.pthreads[B],Fe.unusedWorkers.push(F),Fe.runningWorkers.splice(Fe.runningWorkers.indexOf(F),1),F.pthread_ptr=0,cb(B)},receiveObjectTransfer:function(F){},threadInitTLS:function(){Fe.tlsInitFunctions.forEach(F=>F())},loadWasmModuleToWorker:function(F,B){F.onmessage=re=>{var le=re.data,Te=le.cmd;if(F.pthread_ptr&&(Fe.currentProxiedOperationCallerThread=F.pthread_ptr),le.targetThread&&le.targetThread!=Sm()){var Ze=Fe.pthreads[le.targetThread];Ze?Ze.postMessage(le,le.transferList):q('Internal error! Worker sent a message \"'+Te+'\" to target pthread '+le.targetThread+\", but that thread no longer exists!\"),Fe.currentProxiedOperationCallerThread=void 0;return}Te===\"processProxyingQueue\"?Gc(le.queue):Te===\"spawnThread\"?am(le):Te===\"cleanupThread\"?zc(le.thread):Te===\"killThread\"?Px(le.thread):Te===\"cancelThread\"?Ox(le.thread):Te===\"loaded\"?(F.loaded=!0,B&&B(F),F.runPthread&&(F.runPthread(),delete F.runPthread)):Te===\"print\"?G(\"Thread \"+le.threadId+\": \"+le.text):Te===\"printErr\"?q(\"Thread \"+le.threadId+\": \"+le.text):Te===\"alert\"?alert(\"Thread \"+le.threadId+\": \"+le.text):le.target===\"setimmediate\"?F.postMessage(le):Te===\"onAbort\"?u.onAbort&&u.onAbort(le.arg):Te&&q(\"worker sent an unknown command \"+Te),Fe.currentProxiedOperationCallerThread=void 0},F.onerror=re=>{var le=\"worker sent an error!\";throw q(le+\" \"+re.filename+\":\"+re.lineno+\": \"+re.message),re},C&&(F.on(\"message\",function(re){F.onmessage({data:re})}),F.on(\"error\",function(re){F.onerror(re)}),F.on(\"detachedExit\",function(){})),F.postMessage({cmd:\"load\",urlOrBlob:u.mainScriptUrlOrBlob||r,wasmMemory:Q,wasmModule:se})},allocateUnusedWorker:function(){var F=_(\"tfjs-backend-wasm-threaded-simd.worker.js\");Fe.unusedWorkers.push(new Worker(F))},getNewWorker:function(){return Fe.unusedWorkers.length==0&&(Fe.allocateUnusedWorker(),Fe.loadWasmModuleToWorker(Fe.unusedWorkers[0])),Fe.unusedWorkers.pop()}};u.PThread=Fe;function Uc(F){for(;F.length>0;)F.shift()(u)}function Lx(F){var B=lb(),re=F();return vm(B),re}function ZS(F){return F}function JS(F){var B=/\\b_Z[\\w\\d_]+/g;return F.replace(B,function(re){var le=re;return re===le?re:le+\" [\"+re+\"]\"})}function Bx(){var F=Sm(),B=s()[F+44>>2],re=s()[F+48>>2],le=B-re;a0(B,le),vm(B)}u.establishStackSpace=Bx;function pm(F){if(w)return Ha(2,0,F);try{um(F)}catch(B){Mx(B)}}var Yu=[];function Vx(F){var B=Yu[F];return B||(F>=Yu.length&&(Yu.length=F+1),Yu[F]=B=rr.get(F)),B}function zx(F,B){var re=Vx(F)(B);tn()?Fe.setExitStatus(re):s0(re)}u.invokeEntryPoint=zx;function e0(){var F=new Error;if(!F.stack){try{throw new Error}catch(B){F=B}if(!F.stack)return\"(no stack trace available)\"}return F.stack.toString()}function Wx(F){Fe.tlsInitFunctions.push(F)}function Ux(F,B){t().set(F,B)}function Gx(F){r0(F,!b,1,!y),Fe.threadInitTLS()}function Hx(F){w?postMessage({cmd:\"cleanupThread\",thread:F}):zc(F)}function cm(F,B,re,le){return w?Ha(3,1,F,B,re,le):lm(F,B,re,le)}function lm(F,B,re,le){if(typeof SharedArrayBuffer==\"undefined\")return q(\"Current environment does not support SharedArrayBuffer, pthreads are not available!\"),6;var Te=[],Ze=0;if(w&&(Te.length===0||Ze))return cm(F,B,re,le);if(Ze)return Ze;var $e={startRoutine:re,pthread_ptr:F,arg:le,transferList:Te};return w?($e.cmd=\"spawnThread\",postMessage($e,Te),0):am($e)}function qx(){return 2097152}var Kx=!0;function jx(){return Kx}function Gc(F){Atomics.store(s(),F>>2,1),Sm()&&n0(F),Atomics.compareExchange(s(),F>>2,1,0)}u.executeNotifiedProxyingQueue=Gc;function Xx(F,B,re,le){if(F==B)setTimeout(()=>Gc(le));else if(w)postMessage({targetThread:F,cmd:\"processProxyingQueue\",queue:le});else{var Te=Fe.pthreads[F];if(!Te)return;Te.postMessage({cmd:\"processProxyingQueue\",queue:le})}return 1}function Yx(F,B,re){return-1}function Qx(){Xu(\"\")}function Pi(F){Pi.shown||(Pi.shown={}),Pi.shown[F]||(Pi.shown[F]=1,C&&(F=\"warning: \"+F),q(F))}function Zx(){C||b||Pi(\"Blocking on the main thread is very dangerous, see https://emscripten.org/docs/porting/pthreads.html#blocking-on-the-main-browser-thread\")}function Jx(){return Date.now()}function mm(){return 2147483648}function ey(){return mm()}var Qu;C?Qu=()=>{var F=process.hrtime();return F[0]*1e3+F[1]/1e6}:w?Qu=()=>performance.now()-u.__performance_now_clock_drift:Qu=()=>performance.now();function ty(F,B,re){o().copyWithin(F,B,B+re)}function ry(){return C?O3().cpus().length:navigator.hardwareConcurrency}function Ha(F,B){var re=arguments.length-2,le=arguments;return Lx(()=>{for(var Te=re,Ze=km(Te*8),$e=Ze>>3,Pe=0;Pe>3,Te=0;Te>>16),Tt(Q.buffer),1}catch(B){}}function sy(F){var B=o().length;if(F=F>>>0,F<=B)return!1;var re=mm();if(F>re)return!1;let le=(Wt,Zr)=>Wt+(Zr-Wt%Zr)%Zr;for(var Te=1;Te<=4;Te*=2){var Ze=B*(1+.2/Te);Ze=Math.min(Ze,F+100663296);var $e=Math.min(re,le(Math.max(F,Ze),65536)),Pe=ny($e);if(Pe)return!0}return!1}function ay(){throw\"unwind\"}function fm(F){return w?Ha(4,1,F):52}function dm(F,B,re,le,Te){return w?Ha(5,1,F,B,re,le,Te):70}var iy=[null,[],[]];function uy(F,B){var re=iy[F];B===0||B===10?((F===1?G:q)(Ee(re,0)),re.length=0):re.push(B)}function hm(F,B,re,le){if(w)return Ha(6,1,F,B,re,le);for(var Te=0,Ze=0;Ze>2],Pe=a()[B+4>>2];B+=8;for(var Wt=0;Wt>2]=Te,0}function gm(F){var B=u[\"_\"+F];return B}function py(F,B,re,le,Te){var Ze={string:Dr=>{var tp=0;if(Dr!=null&&Dr!==0){var p0=(Dr.length<<2)+1;tp=km(p0),pt(Dr,tp,p0)}return tp},array:Dr=>{var tp=km(Dr.length);return Ux(Dr,tp),tp}};function $e(Dr){return B===\"string\"?Me(Dr):B===\"boolean\"?Boolean(Dr):Dr}var Pe=gm(F),Wt=[],Zr=0;if(le)for(var ta=0;ta$e===\"number\"||$e===\"boolean\"),Ze=B!==\"string\";return Ze&&Te&&!le?gm(F):function(){return py(F,B,re,arguments,le)}}Fe.init();var ly=[null,Wc,pm,cm,fm,dm,hm],xm={__emscripten_init_main_thread_js:Gx,__emscripten_thread_cleanup:Hx,__pthread_create_js:lm,_emscripten_default_pthread_stack_size:qx,_emscripten_get_now_is_monotonic:jx,_emscripten_notify_task_queue:Xx,_emscripten_set_offscreencanvas_size:Yx,abort:Qx,emscripten_check_blocking_allowed:Zx,emscripten_date_now:Jx,emscripten_get_heap_max:ey,emscripten_get_now:Qu,emscripten_memcpy_big:ty,emscripten_num_logical_cores:ry,emscripten_receive_on_main_thread_js:oy,emscripten_resize_heap:sy,emscripten_unwind_to_js_event_loop:ay,exit:um,fd_close:fm,fd_seek:dm,fd_write:hm,memory:Q||u.wasmMemory},t0=Ax(),my=u.___wasm_call_ctors=function(){return(my=u.___wasm_call_ctors=u.asm.__wasm_call_ctors).apply(null,arguments)},fy=u._init=function(){return(fy=u._init=u.asm.init).apply(null,arguments)},dy=u._init_with_threads_count=function(){return(dy=u._init_with_threads_count=u.asm.init_with_threads_count).apply(null,arguments)},hy=u._get_threads_count=function(){return(hy=u._get_threads_count=u.asm.get_threads_count).apply(null,arguments)},gy=u._register_tensor=function(){return(gy=u._register_tensor=u.asm.register_tensor).apply(null,arguments)},xy=u._dispose_data=function(){return(xy=u._dispose_data=u.asm.dispose_data).apply(null,arguments)},yy=u._dispose=function(){return(yy=u._dispose=u.asm.dispose).apply(null,arguments)},by=u._Abs=function(){return(by=u._Abs=u.asm.Abs).apply(null,arguments)},Cy=u._Add=function(){return(Cy=u._Add=u.asm.Add).apply(null,arguments)},Iy=u._AddN=function(){return(Iy=u._AddN=u.asm.AddN).apply(null,arguments)},wy=u._All=function(){return(wy=u._All=u.asm.All).apply(null,arguments)},Sy=u._Any=function(){return(Sy=u._Any=u.asm.Any).apply(null,arguments)},vy=u._ArgMax=function(){return(vy=u._ArgMax=u.asm.ArgMax).apply(null,arguments)},ky=u._AvgPool=function(){return(ky=u._AvgPool=u.asm.AvgPool).apply(null,arguments)},Ty=u._BatchMatMul=function(){return(Ty=u._BatchMatMul=u.asm.BatchMatMul).apply(null,arguments)},Ny=u._Ceil=function(){return(Ny=u._Ceil=u.asm.Ceil).apply(null,arguments)},_y=u._ClipByValue=function(){return(_y=u._ClipByValue=u.asm.ClipByValue).apply(null,arguments)},Ey=u._Conv2D=function(){return(Ey=u._Conv2D=u.asm.Conv2D).apply(null,arguments)},$y=u._Conv2DBackpropInput=function(){return($y=u._Conv2DBackpropInput=u.asm.Conv2DBackpropInput).apply(null,arguments)},Ry=u._Cos=function(){return(Ry=u._Cos=u.asm.Cos).apply(null,arguments)},Ay=u._Cosh=function(){return(Ay=u._Cosh=u.asm.Cosh).apply(null,arguments)},Fy=u._CropAndResize=function(){return(Fy=u._CropAndResize=u.asm.CropAndResize).apply(null,arguments)},Dy=u._Cumprod=function(){return(Dy=u._Cumprod=u.asm.Cumprod).apply(null,arguments)},Py=u._Cumsum=function(){return(Py=u._Cumsum=u.asm.Cumsum).apply(null,arguments)},Oy=u._DepthToSpace=function(){return(Oy=u._DepthToSpace=u.asm.DepthToSpace).apply(null,arguments)},My=u._DepthwiseConv2dNative=function(){return(My=u._DepthwiseConv2dNative=u.asm.DepthwiseConv2dNative).apply(null,arguments)},Ly=u._Elu=function(){return(Ly=u._Elu=u.asm.Elu).apply(null,arguments)},By=u._Equal=function(){return(By=u._Equal=u.asm.Equal).apply(null,arguments)},Vy=u._Exp=function(){return(Vy=u._Exp=u.asm.Exp).apply(null,arguments)},zy=u._FlipLeftRight=function(){return(zy=u._FlipLeftRight=u.asm.FlipLeftRight).apply(null,arguments)},Wy=u._Floor=function(){return(Wy=u._Floor=u.asm.Floor).apply(null,arguments)},Uy=u._FloorDiv=function(){return(Uy=u._FloorDiv=u.asm.FloorDiv).apply(null,arguments)},Gy=u._FusedBatchNorm=function(){return(Gy=u._FusedBatchNorm=u.asm.FusedBatchNorm).apply(null,arguments)},Hy=u._FusedConv2D=function(){return(Hy=u._FusedConv2D=u.asm.FusedConv2D).apply(null,arguments)},qy=u._FusedDepthwiseConv2D=function(){return(qy=u._FusedDepthwiseConv2D=u.asm.FusedDepthwiseConv2D).apply(null,arguments)},Ky=u._Gather=function(){return(Ky=u._Gather=u.asm.Gather).apply(null,arguments)},jy=u._GatherNd=function(){return(jy=u._GatherNd=u.asm.GatherNd).apply(null,arguments)},Xy=u._Greater=function(){return(Xy=u._Greater=u.asm.Greater).apply(null,arguments)},Yy=u._GreaterEqual=function(){return(Yy=u._GreaterEqual=u.asm.GreaterEqual).apply(null,arguments)},Qy=u._LeakyRelu=function(){return(Qy=u._LeakyRelu=u.asm.LeakyRelu).apply(null,arguments)},Zy=u._Less=function(){return(Zy=u._Less=u.asm.Less).apply(null,arguments)},Jy=u._LessEqual=function(){return(Jy=u._LessEqual=u.asm.LessEqual).apply(null,arguments)},eb=u._Log=function(){return(eb=u._Log=u.asm.Log).apply(null,arguments)},tb=u._LogicalAnd=function(){return(tb=u._LogicalAnd=u.asm.LogicalAnd).apply(null,arguments)},rb=u._LogicalNot=function(){return(rb=u._LogicalNot=u.asm.LogicalNot).apply(null,arguments)},ob=u._LogicalOr=function(){return(ob=u._LogicalOr=u.asm.LogicalOr).apply(null,arguments)},nb=u._LogicalXor=function(){return(nb=u._LogicalXor=u.asm.LogicalXor).apply(null,arguments)},sb=u._Max=function(){return(sb=u._Max=u.asm.Max).apply(null,arguments)},ym=u._MaxPool=function(){return(ym=u._MaxPool=u.asm.MaxPool).apply(null,arguments)},bm=u._Maximum=function(){return(bm=u._Maximum=u.asm.Maximum).apply(null,arguments)},qc=u._Mean=function(){return(qc=u._Mean=u.asm.Mean).apply(null,arguments)},ab=u._Min=function(){return(ab=u._Min=u.asm.Min).apply(null,arguments)},ib=u._Minimum=function(){return(ib=u._Minimum=u.asm.Minimum).apply(null,arguments)},Zu=u._MirrorPad=function(){return(Zu=u._MirrorPad=u.asm.MirrorPad).apply(null,arguments)},Cm=u._Multiply=function(){return(Cm=u._Multiply=u.asm.Multiply).apply(null,arguments)},Ju=u._Neg=function(){return(Ju=u._Neg=u.asm.Neg).apply(null,arguments)},ep=u._NonMaxSuppressionV3=function(){return(ep=u._NonMaxSuppressionV3=u.asm.NonMaxSuppressionV3).apply(null,arguments)},ub=u._NonMaxSuppressionV4=function(){return(ub=u._NonMaxSuppressionV4=u.asm.NonMaxSuppressionV4).apply(null,arguments)},U=u._NonMaxSuppressionV5=function(){return(U=u._NonMaxSuppressionV5=u.asm.NonMaxSuppressionV5).apply(null,arguments)},te=u._NotEqual=function(){return(te=u._NotEqual=u.asm.NotEqual).apply(null,arguments)},ve=u._OneHot=function(){return(ve=u._OneHot=u.asm.OneHot).apply(null,arguments)},Ke=u._PadV2=function(){return(Ke=u._PadV2=u.asm.PadV2).apply(null,arguments)},Nt=u._Pow=function(){return(Nt=u._Pow=u.asm.Pow).apply(null,arguments)},_t=u._Prelu=function(){return(_t=u._Prelu=u.asm.Prelu).apply(null,arguments)},He=u._Prod=function(){return(He=u._Prod=u.asm.Prod).apply(null,arguments)},ze=u._RealDiv=function(){return(ze=u._RealDiv=u.asm.RealDiv).apply(null,arguments)},zt=u._Relu=function(){return(zt=u._Relu=u.asm.Relu).apply(null,arguments)},Qr=u._Relu6=function(){return(Qr=u._Relu6=u.asm.Relu6).apply(null,arguments)},ea=u._ResizeBilinear=function(){return(ea=u._ResizeBilinear=u.asm.ResizeBilinear).apply(null,arguments)},Im=u._ResizeNearestNeighbor=function(){return(Im=u._ResizeNearestNeighbor=u.asm.ResizeNearestNeighbor).apply(null,arguments)},Kc=u._Reverse=function(){return(Kc=u._Reverse=u.asm.Reverse).apply(null,arguments)},pb=u._RotateWithOffset=function(){return(pb=u._RotateWithOffset=u.asm.RotateWithOffset).apply(null,arguments)},hr=u._Round=function(){return(hr=u._Round=u.asm.Round).apply(null,arguments)},qa=u._Rsqrt=function(){return(qa=u._Rsqrt=u.asm.Rsqrt).apply(null,arguments)},wm=u._ScatterNd=function(){return(wm=u._ScatterNd=u.asm.ScatterNd).apply(null,arguments)},yV=u._SelectV2=function(){return(yV=u._SelectV2=u.asm.SelectV2).apply(null,arguments)},bV=u._Sigmoid=function(){return(bV=u._Sigmoid=u.asm.Sigmoid).apply(null,arguments)},CV=u._Sin=function(){return(CV=u._Sin=u.asm.Sin).apply(null,arguments)},IV=u._Softmax=function(){return(IV=u._Softmax=u.asm.Softmax).apply(null,arguments)},wV=u._SparseFillEmptyRows=function(){return(wV=u._SparseFillEmptyRows=u.asm.SparseFillEmptyRows).apply(null,arguments)},SV=u._SparseReshape=function(){return(SV=u._SparseReshape=u.asm.SparseReshape).apply(null,arguments)},vV=u._SparseSegmentReduction=function(){return(vV=u._SparseSegmentReduction=u.asm.SparseSegmentReduction).apply(null,arguments)},kV=u._Sqrt=function(){return(kV=u._Sqrt=u.asm.Sqrt).apply(null,arguments)},TV=u._Square=function(){return(TV=u._Square=u.asm.Square).apply(null,arguments)},NV=u._SquaredDifference=function(){return(NV=u._SquaredDifference=u.asm.SquaredDifference).apply(null,arguments)},_V=u._Step=function(){return(_V=u._Step=u.asm.Step).apply(null,arguments)},EV=u._StridedSlice=function(){return(EV=u._StridedSlice=u.asm.StridedSlice).apply(null,arguments)},$V=u._Sub=function(){return($V=u._Sub=u.asm.Sub).apply(null,arguments)},RV=u._Sum=function(){return(RV=u._Sum=u.asm.Sum).apply(null,arguments)},AV=u._Tan=function(){return(AV=u._Tan=u.asm.Tan).apply(null,arguments)},FV=u._Tanh=function(){return(FV=u._Tanh=u.asm.Tanh).apply(null,arguments)},DV=u._Tile=function(){return(DV=u._Tile=u.asm.Tile).apply(null,arguments)},PV=u._TopK=function(){return(PV=u._TopK=u.asm.TopK).apply(null,arguments)},OV=u._Transform=function(){return(OV=u._Transform=u.asm.Transform).apply(null,arguments)},MV=u._Transpose=function(){return(MV=u._Transpose=u.asm.Transpose).apply(null,arguments)},LV=u.__FusedMatMul=function(){return(LV=u.__FusedMatMul=u.asm._FusedMatMul).apply(null,arguments)},BV=u._malloc=function(){return(BV=u._malloc=u.asm.malloc).apply(null,arguments)},VV=u._free=function(){return(VV=u._free=u.asm.free).apply(null,arguments)},zV=u.__emscripten_tls_init=function(){return(zV=u.__emscripten_tls_init=u.asm._emscripten_tls_init).apply(null,arguments)},Sm=u._pthread_self=function(){return(Sm=u._pthread_self=u.asm.pthread_self).apply(null,arguments)},WV=u.___errno_location=function(){return(WV=u.___errno_location=u.asm.__errno_location).apply(null,arguments)},r0=u.__emscripten_thread_init=function(){return(r0=u.__emscripten_thread_init=u.asm._emscripten_thread_init).apply(null,arguments)},UV=u.__emscripten_thread_crashed=function(){return(UV=u.__emscripten_thread_crashed=u.asm._emscripten_thread_crashed).apply(null,arguments)},GV=u._emscripten_main_thread_process_queued_calls=function(){return(GV=u._emscripten_main_thread_process_queued_calls=u.asm.emscripten_main_thread_process_queued_calls).apply(null,arguments)},HV=u._emscripten_main_browser_thread_id=function(){return(HV=u._emscripten_main_browser_thread_id=u.asm.emscripten_main_browser_thread_id).apply(null,arguments)},o0=u._emscripten_run_in_main_runtime_thread_js=function(){return(o0=u._emscripten_run_in_main_runtime_thread_js=u.asm.emscripten_run_in_main_runtime_thread_js).apply(null,arguments)},qV=u._emscripten_dispatch_to_thread_=function(){return(qV=u._emscripten_dispatch_to_thread_=u.asm.emscripten_dispatch_to_thread_).apply(null,arguments)},n0=u.__emscripten_proxy_execute_task_queue=function(){return(n0=u.__emscripten_proxy_execute_task_queue=u.asm._emscripten_proxy_execute_task_queue).apply(null,arguments)},cb=u.__emscripten_thread_free_data=function(){return(cb=u.__emscripten_thread_free_data=u.asm._emscripten_thread_free_data).apply(null,arguments)},s0=u.__emscripten_thread_exit=function(){return(s0=u.__emscripten_thread_exit=u.asm._emscripten_thread_exit).apply(null,arguments)},a0=u._emscripten_stack_set_limits=function(){return(a0=u._emscripten_stack_set_limits=u.asm.emscripten_stack_set_limits).apply(null,arguments)},lb=u.stackSave=function(){return(lb=u.stackSave=u.asm.stackSave).apply(null,arguments)},vm=u.stackRestore=function(){return(vm=u.stackRestore=u.asm.stackRestore).apply(null,arguments)},km=u.stackAlloc=function(){return(km=u.stackAlloc=u.asm.stackAlloc).apply(null,arguments)},KV=u.dynCall_iijjiiii=function(){return(KV=u.dynCall_iijjiiii=u.asm.dynCall_iijjiiii).apply(null,arguments)},jV=u.dynCall_jiji=function(){return(jV=u.dynCall_jiji=u.asm.dynCall_jiji).apply(null,arguments)};u.keepRuntimeAlive=tn,u.wasmMemory=Q,u.cwrap=cy,u.ExitStatus=Di,u.PThread=Fe;var Tm;Js=function F(){Tm||i0(),Tm||(Js=F)};function i0(F){if(F=F||d,Ga>0)return;if(w){c(u),jt(),postMessage({cmd:\"loaded\"});return}if(Ua(),Ga>0)return;function B(){Tm||(Tm=!0,u.calledRun=!0,!ie&&(jt(),c(u),u.onRuntimeInitialized&&u.onRuntimeInitialized(),Zs()))}u.setStatus?(u.setStatus(\"Running...\"),setTimeout(function(){setTimeout(function(){u.setStatus(\"\")},1),B()},1)):B()}if(u.preInit)for(typeof u.preInit==\"function\"&&(u.preInit=[u.preInit]);u.preInit.length>0;)u.preInit.pop()();i0();var Nm;m&&(Nm={uncaughtException:process.listeners(\"uncaughtException\").filter(function(F){return!m.uncaughtException.indexOf(F)>-1}),unhandledRejection:process.listeners(\"unhandledRejection\").filter(function(F){return!m.unhandledRejection.indexOf(F)>-1})});var _m;if(typeof WasmBackendModule!=\"undefined\")_m=WasmBackendModule;else if(typeof e!=\"undefined\")_m=e;else throw new Error(\"Could not find wasm module in post.js\");if(Nm){var XV=_m._dispose;_m._dispose=function(){XV(),Nm.uncaughtException.forEach(function(F){process.removeListener(\"uncaughtException\",F)}),Nm.unhandledRejection.forEach(function(F){process.removeListener(\"unhandledRejection\",F)})}}return e.ready}})();typeof Fg==\"object\"&&typeof Jw==\"object\"?Jw.exports=Zw:typeof define==\"function\"&&define.amd?define([],function(){return Zw}):typeof Fg==\"object\"&&(Fg.WasmBackendModuleThreadedSimd=Zw)});var B3=Kt((ukt,L3)=>{L3.exports.wasmWorkerContents=`\"use strict\";var Module={};var ENVIRONMENT_IS_NODE=typeof process==\"object\"&&typeof process.versions==\"object\"&&typeof process.versions.node==\"string\";if(ENVIRONMENT_IS_NODE){var nodeWorkerThreads=require(\"worker_threads\");var parentPort=nodeWorkerThreads.parentPort;parentPort.on(\"message\",data=>onmessage({data:data}));var fs=require(\"fs\");Object.assign(global,{self:global,require:require,Module:Module,location:{href:__filename},Worker:nodeWorkerThreads.Worker,importScripts:function(f){(0,eval)(fs.readFileSync(f,\"utf8\"))},postMessage:function(msg){parentPort.postMessage(msg)},performance:global.performance||{now:function(){return Date.now()}}})}var initializedJS=false;var pendingNotifiedProxyingQueues=[];function threadPrintErr(){var text=Array.prototype.slice.call(arguments).join(\" \");if(ENVIRONMENT_IS_NODE){fs.writeSync(2,text+\"\n\");return}console.error(text)}function threadAlert(){var text=Array.prototype.slice.call(arguments).join(\" \");postMessage({cmd:\"alert\",text:text,threadId:Module[\"_pthread_self\"]()})}var err=threadPrintErr;self.alert=threadAlert;Module[\"instantiateWasm\"]=(info,receiveInstance)=>{var instance=new WebAssembly.Instance(Module[\"wasmModule\"],info);receiveInstance(instance);Module[\"wasmModule\"]=null;return instance.exports};self.onunhandledrejection=e=>{throw e.reason??e};self.onmessage=e=>{try{if(e.data.cmd===\"load\"){Module[\"wasmModule\"]=e.data.wasmModule;Module[\"wasmMemory\"]=e.data.wasmMemory;Module[\"buffer\"]=Module[\"wasmMemory\"].buffer;Module[\"ENVIRONMENT_IS_PTHREAD\"]=true;if(typeof e.data.urlOrBlob==\"string\"){importScripts(e.data.urlOrBlob)}else{var objectUrl=URL.createObjectURL(e.data.urlOrBlob);importScripts(objectUrl);URL.revokeObjectURL(objectUrl)}WasmBackendModuleThreadedSimd(Module).then(function(instance){Module=instance})}else if(e.data.cmd===\"run\"){Module[\"__performance_now_clock_drift\"]=performance.now()-e.data.time;Module[\"__emscripten_thread_init\"](e.data.pthread_ptr,0,0,1);Module[\"establishStackSpace\"]();Module[\"PThread\"].receiveObjectTransfer(e.data);Module[\"PThread\"].threadInitTLS();if(!initializedJS){pendingNotifiedProxyingQueues.forEach(queue=>{Module[\"executeNotifiedProxyingQueue\"](queue)});pendingNotifiedProxyingQueues=[];initializedJS=true}try{Module[\"invokeEntryPoint\"](e.data.start_routine,e.data.arg)}catch(ex){if(ex!=\"unwind\"){if(ex instanceof Module[\"ExitStatus\"]){if(Module[\"keepRuntimeAlive\"]()){}else{Module[\"__emscripten_thread_exit\"](ex.status)}}else{throw ex}}}}else if(e.data.cmd===\"cancel\"){if(Module[\"_pthread_self\"]()){Module[\"__emscripten_thread_exit\"](-1)}}else if(e.data.target===\"setimmediate\"){}else if(e.data.cmd===\"processProxyingQueue\"){if(initializedJS){Module[\"executeNotifiedProxyingQueue\"](e.data.queue)}else{pendingNotifiedProxyingQueues.push(e.data.queue)}}else if(e.data.cmd){err(\"worker.js received unknown command \"+e.data.cmd);err(e.data)}}catch(ex){if(Module[\"__emscripten_thread_crashed\"]){Module[\"__emscripten_thread_crashed\"]()}throw ex}};`});var V3=Kt((Dg,tS)=>{var eS=(()=>{var r=typeof document!=\"undefined\"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename!=\"undefined\"&&(r=r||__filename),function(e){e=e||{};var t=typeof e!=\"undefined\"?e:{},o,n;t.ready=new Promise(function(U,te){o=U,n=te});var s;typeof process!=\"undefined\"&&process.listeners&&(s={uncaughtException:process.listeners(\"uncaughtException\"),unhandledRejection:process.listeners(\"unhandledRejection\")});var a=Object.assign({},t),i=[],p=\"./this.program\",u=(U,te)=>{throw te},c=typeof window==\"object\",l=typeof importScripts==\"function\",m=typeof process==\"object\"&&typeof process.versions==\"object\"&&typeof process.versions.node==\"string\",f=\"\";function d(U){return t.locateFile?t.locateFile(U,f):f+U}var h,g,y,b;function C(U){if(U instanceof ju)return;E(\"exiting due to exception: \"+U)}if(m){l?f=Vl().dirname(f)+\"/\":f=__dirname+\"/\";var w,k;typeof Em==\"function\"&&(w=Qw(),k=Vl()),h=(U,te)=>(U=k.normalize(U),w.readFileSync(U,te?void 0:\"utf8\")),y=U=>{var te=h(U,!0);return te.buffer||(te=new Uint8Array(te)),te},g=(U,te,ve)=>{U=k.normalize(U),w.readFile(U,function(Ke,Nt){Ke?ve(Ke):te(Nt.buffer)})},process.argv.length>1&&(p=process.argv[1].replace(/\\\\/g,\"/\")),i=process.argv.slice(2),process.on(\"uncaughtException\",function(U){if(!(U instanceof ju))throw U}),process.on(\"unhandledRejection\",function(U){throw U}),u=(U,te)=>{if(at())throw process.exitCode=U,te;C(te),process.exit(U)},t.inspect=function(){return\"[Emscripten Module object]\"}}else(c||l)&&(l?f=self.location.href:typeof document!=\"undefined\"&&document.currentScript&&(f=document.currentScript.src),r&&(f=r),f.indexOf(\"blob:\")!==0?f=f.substr(0,f.replace(/[?#].*/,\"\").lastIndexOf(\"/\")+1):f=\"\",h=U=>{var te=new XMLHttpRequest;return te.open(\"GET\",U,!1),te.send(null),te.responseText},l&&(y=U=>{var te=new XMLHttpRequest;return te.open(\"GET\",U,!1),te.responseType=\"arraybuffer\",te.send(null),new Uint8Array(te.response)}),g=(U,te,ve)=>{var Ke=new XMLHttpRequest;Ke.open(\"GET\",U,!0),Ke.responseType=\"arraybuffer\",Ke.onload=()=>{if(Ke.status==200||Ke.status==0&&Ke.response){te(Ke.response);return}ve()},Ke.onerror=ve,Ke.send(null)},b=U=>document.title=U);var _=t.print||console.log.bind(console),E=t.printErr||console.warn.bind(console);Object.assign(t,a),a=null,t.arguments&&(i=t.arguments),t.thisProgram&&(p=t.thisProgram),t.quit&&(u=t.quit);var R=4,A;t.wasmBinary&&(A=t.wasmBinary);var D=t.noExitRuntime||!0;typeof WebAssembly!=\"object\"&&pr(\"no native wasm support detected\");var O,M=!1,L;function W(U,te){U||pr(te)}var V=typeof TextDecoder!=\"undefined\"?new TextDecoder(\"utf8\"):void 0;function G(U,te,ve){for(var Ke=te+ve,Nt=te;U[Nt]&&!(Nt>=Ke);)++Nt;if(Nt-te>16&&U.buffer&&V)return V.decode(U.subarray(te,Nt));for(var _t=\"\";te>10,56320|Qr&1023)}}return _t}function q(U,te){return U?G(ee,U,te):\"\"}function H(U,te,ve,Ke){if(!(Ke>0))return 0;for(var Nt=ve,_t=ve+Ke-1,He=0;He=55296&&ze<=57343){var zt=U.charCodeAt(++He);ze=65536+((ze&1023)<<10)|zt&1023}if(ze<=127){if(ve>=_t)break;te[ve++]=ze}else if(ze<=2047){if(ve+1>=_t)break;te[ve++]=192|ze>>6,te[ve++]=128|ze&63}else if(ze<=65535){if(ve+2>=_t)break;te[ve++]=224|ze>>12,te[ve++]=128|ze>>6&63,te[ve++]=128|ze&63}else{if(ve+3>=_t)break;te[ve++]=240|ze>>18,te[ve++]=128|ze>>12&63,te[ve++]=128|ze>>6&63,te[ve++]=128|ze&63}}return te[ve]=0,ve-Nt}function j(U,te,ve){return H(U,ee,te,ve)}var Y,Z,ee,X,Q,se,ie,de,Ie;function Se(U){Y=U,t.HEAP8=Z=new Int8Array(U),t.HEAP16=X=new Int16Array(U),t.HEAP32=se=new Int32Array(U),t.HEAPU8=ee=new Uint8Array(U),t.HEAPU16=Q=new Uint16Array(U),t.HEAPU32=ie=new Uint32Array(U),t.HEAPF32=de=new Float32Array(U),t.HEAPF64=Ie=new Float64Array(U)}var Ee=t.INITIAL_MEMORY||16777216,Me,st=[],pt=[],De=[],ft=!1;function at(){return D}function dt(){if(t.preRun)for(typeof t.preRun==\"function\"&&(t.preRun=[t.preRun]);t.preRun.length;)Pt(t.preRun.shift());Js(st)}function It(){ft=!0,Js(pt)}function Fr(){if(t.postRun)for(typeof t.postRun==\"function\"&&(t.postRun=[t.postRun]);t.postRun.length;)er(t.postRun.shift());Js(De)}function Pt(U){st.unshift(U)}function jr(U){pt.unshift(U)}function er(U){De.unshift(U)}var Tt=0,tr=null,rr=null;function Xr(U){Tt++,t.monitorRunDependencies&&t.monitorRunDependencies(Tt)}function Yr(U){if(Tt--,t.monitorRunDependencies&&t.monitorRunDependencies(Tt),Tt==0&&(tr!==null&&(clearInterval(tr),tr=null),rr)){var te=rr;rr=null,te()}}function pr(U){t.onAbort&&t.onAbort(U),U=\"Aborted(\"+U+\")\",E(U),M=!0,L=1,U+=\". Build with -sASSERTIONS for more info.\";var te=new WebAssembly.RuntimeError(U);throw n(te),te}var Qs=\"data:application/octet-stream;base64,\";function tn(U){return U.startsWith(Qs)}function Ua(U){return U.startsWith(\"file://\")}var jt;jt=\"tfjs-backend-wasm.wasm\",tn(jt)||(jt=d(jt));function Zs(U){try{if(U==jt&&A)return new Uint8Array(A);if(y)return y(U);throw\"both async and sync fetching of the wasm failed\"}catch(te){pr(te)}}function Lc(){if(!A&&(c||l)){if(typeof fetch==\"function\"&&!Ua(jt))return fetch(jt,{credentials:\"same-origin\"}).then(function(U){if(!U.ok)throw\"failed to load wasm binary file at '\"+jt+\"'\";return U.arrayBuffer()}).catch(function(){return Zs(jt)});if(g)return new Promise(function(U,te){g(jt,function(ve){U(new Uint8Array(ve))},te)})}return Promise.resolve().then(function(){return Zs(jt)})}function Bc(){var U={env:Wc,wasi_snapshot_preview1:Wc};function te(He,ze){var zt=He.exports;t.asm=zt,O=t.asm.memory,Se(O.buffer),Me=t.asm.__indirect_function_table,jr(t.asm.__wasm_call_ctors),Yr(\"wasm-instantiate\")}Xr(\"wasm-instantiate\");function ve(He){te(He.instance)}function Ke(He){return Lc().then(function(ze){return WebAssembly.instantiate(ze,U)}).then(function(ze){return ze}).then(He,function(ze){E(\"failed to asynchronously prepare wasm: \"+ze),pr(ze)})}function Nt(){return!A&&typeof WebAssembly.instantiateStreaming==\"function\"&&!tn(jt)&&!Ua(jt)&&!m&&typeof fetch==\"function\"?fetch(jt,{credentials:\"same-origin\"}).then(function(He){var ze=WebAssembly.instantiateStreaming(He,U);return ze.then(ve,function(zt){return E(\"wasm streaming compile failed: \"+zt),E(\"falling back to ArrayBuffer instantiation\"),Ke(ve)})}):Ke(ve)}if(t.instantiateWasm)try{var _t=t.instantiateWasm(U,te);return _t}catch(He){E(\"Module.instantiateWasm callback failed with error: \"+He),n(He)}return Nt().catch(n),{}}var KS,Ga;function ju(U){this.name=\"ExitStatus\",this.message=\"Program terminated with exit(\"+U+\")\",this.status=U}function Js(U){for(;U.length>0;)U.shift()(t)}function jS(U){return U}function XS(U){var te=/\\b_Z[\\w\\d_]+/g;return U.replace(te,function(ve){var Ke=ve;return ve===Ke?ve:Ke+\" [\"+ve+\"]\"})}function Xu(){var U=new Error;if(!U.stack){try{throw new Error}catch(te){U=te}if(!U.stack)return\"(no stack trace available)\"}return U.stack.toString()}function $x(U,te){Z.set(U,te)}function nm(){pr(\"\")}function Vc(){return 2147483648}function dr(){return Vc()}function sm(U,te,ve){ee.copyWithin(U,te,te+ve)}function Rx(U){try{return O.grow(U-Y.byteLength+65535>>>16),Se(O.buffer),1}catch(te){}}function Ax(U){var te=ee.length;U=U>>>0;var ve=Vc();if(U>ve)return!1;let Ke=(zt,Qr)=>zt+(Qr-zt%Qr)%Qr;for(var Nt=1;Nt<=4;Nt*=2){var _t=te*(1+.2/Nt);_t=Math.min(_t,U+100663296);var He=Math.min(ve,Ke(Math.max(U,_t),65536)),ze=Rx(He);if(ze)return!0}return!1}var Fx={varargs:void 0,get:function(){Fx.varargs+=4;var U=se[Fx.varargs-4>>2];return U},getStr:function(U){var te=q(U);return te}};function YS(U){return 52}function Dx(U,te,ve,Ke,Nt){return 70}var Di=[null,[],[]];function Px(U,te){var ve=Di[U];te===0||te===10?((U===1?_:E)(G(ve,0)),ve.length=0):ve.push(te)}function Ox(U,te,ve,Ke){for(var Nt=0,_t=0;_t>2],ze=ie[te+4>>2];te+=8;for(var zt=0;zt>2]=Nt,0}function zc(U){var te=t[\"_\"+U];return te}function am(U,te,ve,Ke,Nt){var _t={string:hr=>{var qa=0;if(hr!=null&&hr!==0){var wm=(hr.length<<2)+1;qa=qc(wm),j(hr,qa,wm)}return qa},array:hr=>{var qa=qc(hr.length);return $x(hr,qa),qa}};function He(hr){return te===\"string\"?q(hr):te===\"boolean\"?Boolean(hr):hr}var ze=zc(U),zt=[],Qr=0;if(Ke)for(var ea=0;eaHe===\"number\"||He===\"boolean\"),_t=te!==\"string\";return _t&&Nt&&!Ke?zc(U):function(){return am(U,te,ve,arguments,Ke)}}var Wc={abort:nm,emscripten_get_heap_max:dr,emscripten_memcpy_big:sm,emscripten_resize_heap:Ax,fd_close:YS,fd_seek:Dx,fd_write:Ox},QS=Bc(),um=t.___wasm_call_ctors=function(){return(um=t.___wasm_call_ctors=t.asm.__wasm_call_ctors).apply(null,arguments)},Mx=t._init=function(){return(Mx=t._init=t.asm.init).apply(null,arguments)},Fe=t._init_with_threads_count=function(){return(Fe=t._init_with_threads_count=t.asm.init_with_threads_count).apply(null,arguments)},Uc=t._get_threads_count=function(){return(Uc=t._get_threads_count=t.asm.get_threads_count).apply(null,arguments)},Lx=t._register_tensor=function(){return(Lx=t._register_tensor=t.asm.register_tensor).apply(null,arguments)},ZS=t._dispose_data=function(){return(ZS=t._dispose_data=t.asm.dispose_data).apply(null,arguments)},JS=t._dispose=function(){return(JS=t._dispose=t.asm.dispose).apply(null,arguments)},Bx=t._Abs=function(){return(Bx=t._Abs=t.asm.Abs).apply(null,arguments)},pm=t._Add=function(){return(pm=t._Add=t.asm.Add).apply(null,arguments)},Yu=t._AddN=function(){return(Yu=t._AddN=t.asm.AddN).apply(null,arguments)},Vx=t._All=function(){return(Vx=t._All=t.asm.All).apply(null,arguments)},zx=t._Any=function(){return(zx=t._Any=t.asm.Any).apply(null,arguments)},e0=t._ArgMax=function(){return(e0=t._ArgMax=t.asm.ArgMax).apply(null,arguments)},Wx=t._AvgPool=function(){return(Wx=t._AvgPool=t.asm.AvgPool).apply(null,arguments)},Ux=t._BatchMatMul=function(){return(Ux=t._BatchMatMul=t.asm.BatchMatMul).apply(null,arguments)},Gx=t._Ceil=function(){return(Gx=t._Ceil=t.asm.Ceil).apply(null,arguments)},Hx=t._ClipByValue=function(){return(Hx=t._ClipByValue=t.asm.ClipByValue).apply(null,arguments)},cm=t._Conv2D=function(){return(cm=t._Conv2D=t.asm.Conv2D).apply(null,arguments)},lm=t._Conv2DBackpropInput=function(){return(lm=t._Conv2DBackpropInput=t.asm.Conv2DBackpropInput).apply(null,arguments)},qx=t._Cos=function(){return(qx=t._Cos=t.asm.Cos).apply(null,arguments)},Kx=t._Cosh=function(){return(Kx=t._Cosh=t.asm.Cosh).apply(null,arguments)},jx=t._CropAndResize=function(){return(jx=t._CropAndResize=t.asm.CropAndResize).apply(null,arguments)},Gc=t._Cumprod=function(){return(Gc=t._Cumprod=t.asm.Cumprod).apply(null,arguments)},Xx=t._Cumsum=function(){return(Xx=t._Cumsum=t.asm.Cumsum).apply(null,arguments)},Yx=t._DepthToSpace=function(){return(Yx=t._DepthToSpace=t.asm.DepthToSpace).apply(null,arguments)},Qx=t._DepthwiseConv2dNative=function(){return(Qx=t._DepthwiseConv2dNative=t.asm.DepthwiseConv2dNative).apply(null,arguments)},Pi=t._Elu=function(){return(Pi=t._Elu=t.asm.Elu).apply(null,arguments)},Zx=t._Equal=function(){return(Zx=t._Equal=t.asm.Equal).apply(null,arguments)},Jx=t._Exp=function(){return(Jx=t._Exp=t.asm.Exp).apply(null,arguments)},mm=t._FlipLeftRight=function(){return(mm=t._FlipLeftRight=t.asm.FlipLeftRight).apply(null,arguments)},ey=t._Floor=function(){return(ey=t._Floor=t.asm.Floor).apply(null,arguments)},Qu=t._FloorDiv=function(){return(Qu=t._FloorDiv=t.asm.FloorDiv).apply(null,arguments)},ty=t._FusedBatchNorm=function(){return(ty=t._FusedBatchNorm=t.asm.FusedBatchNorm).apply(null,arguments)},ry=t._FusedConv2D=function(){return(ry=t._FusedConv2D=t.asm.FusedConv2D).apply(null,arguments)},Ha=t._FusedDepthwiseConv2D=function(){return(Ha=t._FusedDepthwiseConv2D=t.asm.FusedDepthwiseConv2D).apply(null,arguments)},Hc=t._Gather=function(){return(Hc=t._Gather=t.asm.Gather).apply(null,arguments)},oy=t._GatherNd=function(){return(oy=t._GatherNd=t.asm.GatherNd).apply(null,arguments)},ny=t._Greater=function(){return(ny=t._Greater=t.asm.Greater).apply(null,arguments)},sy=t._GreaterEqual=function(){return(sy=t._GreaterEqual=t.asm.GreaterEqual).apply(null,arguments)},ay=t._LeakyRelu=function(){return(ay=t._LeakyRelu=t.asm.LeakyRelu).apply(null,arguments)},fm=t._Less=function(){return(fm=t._Less=t.asm.Less).apply(null,arguments)},dm=t._LessEqual=function(){return(dm=t._LessEqual=t.asm.LessEqual).apply(null,arguments)},iy=t._Log=function(){return(iy=t._Log=t.asm.Log).apply(null,arguments)},uy=t._LogicalAnd=function(){return(uy=t._LogicalAnd=t.asm.LogicalAnd).apply(null,arguments)},hm=t._LogicalNot=function(){return(hm=t._LogicalNot=t.asm.LogicalNot).apply(null,arguments)},gm=t._LogicalOr=function(){return(gm=t._LogicalOr=t.asm.LogicalOr).apply(null,arguments)},py=t._LogicalXor=function(){return(py=t._LogicalXor=t.asm.LogicalXor).apply(null,arguments)},cy=t._Max=function(){return(cy=t._Max=t.asm.Max).apply(null,arguments)},ly=t._MaxPool=function(){return(ly=t._MaxPool=t.asm.MaxPool).apply(null,arguments)},xm=t._Maximum=function(){return(xm=t._Maximum=t.asm.Maximum).apply(null,arguments)},t0=t._Mean=function(){return(t0=t._Mean=t.asm.Mean).apply(null,arguments)},my=t._Min=function(){return(my=t._Min=t.asm.Min).apply(null,arguments)},fy=t._Minimum=function(){return(fy=t._Minimum=t.asm.Minimum).apply(null,arguments)},dy=t._MirrorPad=function(){return(dy=t._MirrorPad=t.asm.MirrorPad).apply(null,arguments)},hy=t._Multiply=function(){return(hy=t._Multiply=t.asm.Multiply).apply(null,arguments)},gy=t._Neg=function(){return(gy=t._Neg=t.asm.Neg).apply(null,arguments)},xy=t._NonMaxSuppressionV3=function(){return(xy=t._NonMaxSuppressionV3=t.asm.NonMaxSuppressionV3).apply(null,arguments)},yy=t._NonMaxSuppressionV4=function(){return(yy=t._NonMaxSuppressionV4=t.asm.NonMaxSuppressionV4).apply(null,arguments)},by=t._NonMaxSuppressionV5=function(){return(by=t._NonMaxSuppressionV5=t.asm.NonMaxSuppressionV5).apply(null,arguments)},Cy=t._NotEqual=function(){return(Cy=t._NotEqual=t.asm.NotEqual).apply(null,arguments)},Iy=t._OneHot=function(){return(Iy=t._OneHot=t.asm.OneHot).apply(null,arguments)},wy=t._PadV2=function(){return(wy=t._PadV2=t.asm.PadV2).apply(null,arguments)},Sy=t._Pow=function(){return(Sy=t._Pow=t.asm.Pow).apply(null,arguments)},vy=t._Prelu=function(){return(vy=t._Prelu=t.asm.Prelu).apply(null,arguments)},ky=t._Prod=function(){return(ky=t._Prod=t.asm.Prod).apply(null,arguments)},Ty=t._RealDiv=function(){return(Ty=t._RealDiv=t.asm.RealDiv).apply(null,arguments)},Ny=t._Relu=function(){return(Ny=t._Relu=t.asm.Relu).apply(null,arguments)},_y=t._Relu6=function(){return(_y=t._Relu6=t.asm.Relu6).apply(null,arguments)},Ey=t._ResizeBilinear=function(){return(Ey=t._ResizeBilinear=t.asm.ResizeBilinear).apply(null,arguments)},$y=t._ResizeNearestNeighbor=function(){return($y=t._ResizeNearestNeighbor=t.asm.ResizeNearestNeighbor).apply(null,arguments)},Ry=t._Reverse=function(){return(Ry=t._Reverse=t.asm.Reverse).apply(null,arguments)},Ay=t._RotateWithOffset=function(){return(Ay=t._RotateWithOffset=t.asm.RotateWithOffset).apply(null,arguments)},Fy=t._Round=function(){return(Fy=t._Round=t.asm.Round).apply(null,arguments)},Dy=t._Rsqrt=function(){return(Dy=t._Rsqrt=t.asm.Rsqrt).apply(null,arguments)},Py=t._ScatterNd=function(){return(Py=t._ScatterNd=t.asm.ScatterNd).apply(null,arguments)},Oy=t._SelectV2=function(){return(Oy=t._SelectV2=t.asm.SelectV2).apply(null,arguments)},My=t._Sigmoid=function(){return(My=t._Sigmoid=t.asm.Sigmoid).apply(null,arguments)},Ly=t._Sin=function(){return(Ly=t._Sin=t.asm.Sin).apply(null,arguments)},By=t._Softmax=function(){return(By=t._Softmax=t.asm.Softmax).apply(null,arguments)},Vy=t._SparseFillEmptyRows=function(){return(Vy=t._SparseFillEmptyRows=t.asm.SparseFillEmptyRows).apply(null,arguments)},zy=t._SparseReshape=function(){return(zy=t._SparseReshape=t.asm.SparseReshape).apply(null,arguments)},Wy=t._SparseSegmentReduction=function(){return(Wy=t._SparseSegmentReduction=t.asm.SparseSegmentReduction).apply(null,arguments)},Uy=t._Sqrt=function(){return(Uy=t._Sqrt=t.asm.Sqrt).apply(null,arguments)},Gy=t._Square=function(){return(Gy=t._Square=t.asm.Square).apply(null,arguments)},Hy=t._SquaredDifference=function(){return(Hy=t._SquaredDifference=t.asm.SquaredDifference).apply(null,arguments)},qy=t._Step=function(){return(qy=t._Step=t.asm.Step).apply(null,arguments)},Ky=t._StridedSlice=function(){return(Ky=t._StridedSlice=t.asm.StridedSlice).apply(null,arguments)},jy=t._Sub=function(){return(jy=t._Sub=t.asm.Sub).apply(null,arguments)},Xy=t._Sum=function(){return(Xy=t._Sum=t.asm.Sum).apply(null,arguments)},Yy=t._Tan=function(){return(Yy=t._Tan=t.asm.Tan).apply(null,arguments)},Qy=t._Tanh=function(){return(Qy=t._Tanh=t.asm.Tanh).apply(null,arguments)},Zy=t._Tile=function(){return(Zy=t._Tile=t.asm.Tile).apply(null,arguments)},Jy=t._TopK=function(){return(Jy=t._TopK=t.asm.TopK).apply(null,arguments)},eb=t._Transform=function(){return(eb=t._Transform=t.asm.Transform).apply(null,arguments)},tb=t._Transpose=function(){return(tb=t._Transpose=t.asm.Transpose).apply(null,arguments)},rb=t.__FusedMatMul=function(){return(rb=t.__FusedMatMul=t.asm._FusedMatMul).apply(null,arguments)},ob=t._malloc=function(){return(ob=t._malloc=t.asm.malloc).apply(null,arguments)},nb=t._free=function(){return(nb=t._free=t.asm.free).apply(null,arguments)},sb=t.___errno_location=function(){return(sb=t.___errno_location=t.asm.__errno_location).apply(null,arguments)},ym=t.stackSave=function(){return(ym=t.stackSave=t.asm.stackSave).apply(null,arguments)},bm=t.stackRestore=function(){return(bm=t.stackRestore=t.asm.stackRestore).apply(null,arguments)},qc=t.stackAlloc=function(){return(qc=t.stackAlloc=t.asm.stackAlloc).apply(null,arguments)},ab=t.dynCall_iijjiiii=function(){return(ab=t.dynCall_iijjiiii=t.asm.dynCall_iijjiiii).apply(null,arguments)},ib=t.dynCall_jiji=function(){return(ib=t.dynCall_jiji=t.asm.dynCall_jiji).apply(null,arguments)};t.cwrap=im;var Zu;rr=function U(){Zu||Cm(),Zu||(rr=U)};function Cm(U){if(U=U||i,Tt>0||(dt(),Tt>0))return;function te(){Zu||(Zu=!0,t.calledRun=!0,!M&&(It(),o(t),t.onRuntimeInitialized&&t.onRuntimeInitialized(),Fr()))}t.setStatus?(t.setStatus(\"Running...\"),setTimeout(function(){setTimeout(function(){t.setStatus(\"\")},1),te()},1)):te()}if(t.preInit)for(typeof t.preInit==\"function\"&&(t.preInit=[t.preInit]);t.preInit.length>0;)t.preInit.pop()();Cm();var Ju;s&&(Ju={uncaughtException:process.listeners(\"uncaughtException\").filter(function(U){return!s.uncaughtException.indexOf(U)>-1}),unhandledRejection:process.listeners(\"unhandledRejection\").filter(function(U){return!s.unhandledRejection.indexOf(U)>-1})});var ep;if(typeof e!=\"undefined\")ep=e;else if(typeof WasmBackendModuleThreadedSimd!=\"undefined\")ep=WasmBackendModuleThreadedSimd;else throw new Error(\"Could not find wasm module in post.js\");if(Ju){var ub=ep._dispose;ep._dispose=function(){ub(),Ju.uncaughtException.forEach(function(U){process.removeListener(\"uncaughtException\",U)}),Ju.unhandledRejection.forEach(function(U){process.removeListener(\"unhandledRejection\",U)})}}return e.ready}})();typeof Dg==\"object\"&&typeof tS==\"object\"?tS.exports=eS:typeof define==\"function\"&&define.amd?define([],function(){return eS}):typeof Dg==\"object\"&&(Dg.WasmBackendModule=eS)});var rn=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}},Jr=class{refCount(e){return Pr(\"refCount\")}incRef(e){return Pr(\"incRef\")}timerAvailable(){return!0}time(e){return Pr(\"time\")}read(e){return Pr(\"read\")}readSync(e){return Pr(\"readSync\")}readToGPU(e,t){return Pr(\"readToGPU\")}numDataIds(){return Pr(\"numDataIds\")}disposeData(e,t){return Pr(\"disposeData\")}write(e,t,o){return Pr(\"write\")}move(e,t,o,n,s){return Pr(\"move\")}createTensorFromTexture(e,t,o){return Pr(\"createTensorFromTexture\")}memory(){return Pr(\"memory\")}floatPrecision(){return Pr(\"floatPrecision\")}epsilon(){return this.floatPrecision()===32?1e-7:1e-4}dispose(){return Pr(\"dispose\")}};function Pr(r){throw new Error(`'${r}' not yet implemented or not found in the registry. This kernel may not be supported by the tfjs backend you have chosen`)}function c0(r){let e=r.length,t=0;for(;e>0;)t=Math.random()*e|0,e--,$m(r,e,t)}function oz(r,e){if(r.length!==e.length)throw new Error(`Array sizes must match to be shuffled together First array length was ${r.length}Second array length was ${e.length}`);let t=r.length,o=0;for(;t>0;)o=Math.random()*t|0,t--,$m(r,t,o),$m(e,t,o)}function op(r,e,t){return Math.max(r,Math.min(e,t))}function nz(r){return r%2===0?r:r+1}function $m(r,e,t){let o=r[e];r[e]=r[t],r[t]=o}function sz(r){let e=0;for(let t=0;tt+` Shapes ${r} and ${e} must match`)}function eo(r){$(r!=null,()=>\"The input to the tensor constructor must be a non-null value.\")}function on(r,e=[],t=!1){if(e==null&&(e=[]),Array.isArray(r)||Ut(r)&&!t)for(let o=0;o0,t,o){return new Promise((n,s)=>{let a=0,i=()=>{if(r()){n();return}a++;let p=e(a);if(t!=null&&a>=t){s();return}o!=null?o(i,p):setTimeout(i,p)};i()})}function fz(r,e){let t=1,o=-1;for(let s=0;s=0)t*=r[s];else if(r[s]===-1){if(o!==-1)throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${o} and dim ${s}`);o=s}else if(r[s]<0)throw Error(`Shapes can not be < 0. Found ${r[s]} at dim ${s}`);if(o===-1){if(e>0&&e!==t)throw Error(`Size(${e}) must match the product of shape ${r}`);return r}if(t===0)throw Error(`Cannot infer the missing size in [${r}] when there are 0 elements`);if(e%t!==0)throw Error(`The implicit shape can't be a fractional number. Got ${e} / ${t}`);let n=r.slice();return n[o]=e/t,n}function Ka(r,e){let t=e.length;return r=r==null?e.map((o,n)=>n):[].concat(r),$(r.every(o=>o>=-t&&o`All values in axis param must be in range [-${t}, ${t}) but got axis ${r}`),$(r.every(o=>ra(o)),()=>`All values in axis param must be integers but got axis ${r}`),r.map(o=>o<0?t+o:o)}function db(r,e){let t=[],o=[],n=e!=null&&Array.isArray(e)&&e.length===0,s=e==null||n?null:Ka(e,r).sort(),a=0;for(let i=0;ii)&&r[i]===1&&(t.push(r[i]),o.push(i)),s[a]<=i&&a++}r[i]!==1&&(t.push(r[i]),o.push(i))}return{newShape:t,keptDims:o}}function hb(r,e){let t=null;if(r==null||r===\"float32\")t=new Float32Array(e);else if(r===\"int32\")t=new Int32Array(e);else if(r===\"bool\")t=new Uint8Array(e);else throw new Error(`Unknown data type ${r}`);return t}function gb(r,e){let t=null;if(r==null||r===\"float32\")t=new Float32Array(e);else if(r===\"int32\")t=new Int32Array(e);else if(r===\"bool\")t=new Uint8Array(e);else if(r===\"string\")t=new Array(e);else throw new Error(`Unknown data type ${r}`);return t}function xb(r,e){for(let t=0;te+=t.length),e}function nn(r){return typeof r==\"string\"||r instanceof String}function l0(r){return typeof r==\"boolean\"}function m0(r){return typeof r==\"number\"}function np(r){return Array.isArray(r)?np(r[0]):r instanceof Float32Array?\"float32\":r instanceof Int32Array||r instanceof Uint8Array||r instanceof Uint8ClampedArray?\"int32\":m0(r)?\"float32\":nn(r)?\"string\":l0(r)?\"bool\":\"float32\"}function fs(r){return!!(r&&r.constructor&&r.call&&r.apply)}function sp(r,e){for(let t=e;t=0;--o)t[o]=t[o+1]*r[o+1];return t}function f0(r,e,t,o=!1){let n=new Array;if(e.length===1){let s=e[0]*(o?2:1);for(let a=0;ap*u)*(o?2:1);for(let p=0;pn*s)*(t?2:1);if(o===0)return[];if(o!==e.length)throw new Error(`[${r}] does not match the input size ${e.length}${t?\" for a complex tensor\":\"\"}.`);return f0(0,r,e,t)}function jc(r,e){let t=ap(r,e);for(let o=0;oo*n,1);if(e==null||e===\"float32\")return Oi(r,new Float32Array(t));if(e===\"int32\")return Oi(r,new Int32Array(t));if(e===\"bool\")return Oi(r,new Uint8Array(t));throw new Error(`Unknown data type ${e}`)}function Xc(r){r.forEach(e=>{$(Number.isInteger(e)&&e>=0,()=>`Tensor must have a shape comprised of positive integers but got shape [${r}].`)})}function gz(r,e,t){if(e===0)return 0;if(e===1)return r[0];let o=r[r.length-1];for(let n=0;n{let[n,s]=o.split(\":\");this.urlFlags[n]=Iz(n,s)})}};function bz(r){let e={};return r.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g,(t,...o)=>(Cz(e,o[0],o[1]),o.join(\"=\"))),e}function Cz(r,e,t){r[decodeURIComponent(e)]=decodeURIComponent(t||\"\")}function Iz(r,e){if(e=e.toLowerCase(),e===\"true\"||e===\"false\")return e===\"true\";if(`${+e}`===e)return+e;throw new Error(`Could not parse value flag value ${e} for flag ${r}.`)}function P(){return Cb}var Cb=null;function h0(r){Cb=r}var Ib;function wb(){if(Ib==null){let r;if(typeof window!=\"undefined\")r=window;else if(typeof global!=\"undefined\")r=global;else if(typeof process!=\"undefined\")r=process;else if(typeof self!=\"undefined\")r=self;else throw new Error(\"Could not find a global object\");Ib=r}return Ib}function wz(){let r=wb();return r._tfGlobals==null&&(r._tfGlobals=new Map),r._tfGlobals}function Zc(r,e){let t=wz();if(t.has(r))return t.get(r);{let o=e();return t.set(r,o),t.get(r)}}var sn=\"Abs\",Li=\"Acos\",Bi=\"Acosh\",_r=\"Add\",an=\"AddN\",oa=\"All\",na=\"Any\",un=\"ArgMax\",ja=\"ArgMin\",Vi=\"Asin\",zi=\"Asinh\",Wi=\"Atan\",Ui=\"Atanh\",sa=\"Atan2\",pn=\"AvgPool\",Am=\"AvgPoolGrad\",ip=\"AvgPool3D\",Fm=\"AvgPool3DGrad\",cn=\"BatchMatMul\",hs=\"BatchToSpaceND\",up=\"Bincount\",Tne=\"BroadcastTo\",pp=\"BroadcastArgs\",to=\"Cast\",ro=\"Ceil\",Ro=\"ClipByValue\",aa=\"Complex\",cp=\"ComplexAbs\",gs=\"Concat\",ln=\"Conv2D\",lp=\"Conv2DBackpropFilter\",mn=\"Conv2DBackpropInput\",mp=\"Conv3D\",Dm=\"Conv3DBackpropFilterV2\",fp=\"Conv3DBackpropInputV2\",fn=\"Cos\",dn=\"Cosh\",hn=\"Cumprod\",gn=\"Cumsum\",xn=\"CropAndResize\",dp=\"DenseBincount\",yn=\"DepthToSpace\",bn=\"DepthwiseConv2dNative\",hp=\"DepthwiseConv2dNativeBackpropFilter\",gp=\"DepthwiseConv2dNativeBackpropInput\",xp=\"Diag\",yp=\"Dilation2D\",Sb=\"Dilation2DBackpropInput\",vb=\"Dilation2DBackpropFilter\",Cn=\"RealDiv\",Xa=\"Einsum\",In=\"Elu\",Pm=\"EluGrad\",Gi=\"Erf\",oo=\"Equal\",no=\"Exp\",xs=\"ExpandDims\",wn=\"Expm1\",bp=\"FFT\",ys=\"Fill\",Sn=\"FlipLeftRight\",so=\"Floor\",vn=\"FloorDiv\",kn=\"FusedBatchNorm\",bs=\"GatherV2\",Tn=\"GatherNd\",ao=\"Greater\",io=\"GreaterEqual\",uo=\"Identity\",Cp=\"IFFT\",Ya=\"Imag\",Hi=\"IsFinite\",qi=\"IsInf\",ia=\"IsNan\",Nn=\"LeakyRelu\",po=\"Less\",co=\"LessEqual\",Ip=\"LinSpace\",lo=\"Log\",Ki=\"Log1p\",_n=\"LogicalAnd\",En=\"LogicalNot\",ua=\"LogicalOr\",g0=\"LogicalXor\",Nne=\"LogSoftmax\",_ne=\"LowerBound\",wp=\"LRN\",Om=\"LRNGrad\",$n=\"Max\",mo=\"Maximum\",Rn=\"MaxPool\",Mm=\"MaxPoolGrad\",Sp=\"MaxPool3D\",Lm=\"MaxPool3DGrad\",vp=\"MaxPoolWithArgmax\",An=\"Mean\",Fn=\"Min\",fo=\"Minimum\",Dn=\"MirrorPad\",ji=\"Mod\",kp=\"Multinomial\",ho=\"Multiply\",Pn=\"Neg\",go=\"NotEqual\",On=\"NonMaxSuppressionV3\",pa=\"NonMaxSuppressionV4\",Mn=\"NonMaxSuppressionV5\",Cs=\"OnesLike\",ca=\"OneHot\",Is=\"Pack\",Ln=\"PadV2\",Ene=\"Pool\",Bn=\"Pow\",Vn=\"Prelu\",Ao=\"Prod\",Tp=\"RaggedGather\",Np=\"RaggedRange\",_p=\"RaggedTensorToTensor\",ws=\"Range\",la=\"Real\",ma=\"Reciprocal\",zn=\"Relu\",Ss=\"Reshape\",Wn=\"ResizeNearestNeighbor\",Bm=\"ResizeNearestNeighborGrad\",Un=\"ResizeBilinear\",Vm=\"ResizeBilinearGrad\",Gn=\"Relu6\",fa=\"Reverse\",da=\"Round\",xo=\"Rsqrt\",Hn=\"ScatterNd\",Ep=\"SearchSorted\",vs=\"Select\",Xi=\"Selu\",qn=\"Slice\",Kn=\"Sin\",ha=\"Sinh\",Yi=\"Sign\",yo=\"Sigmoid\",Qi=\"Softplus\",bo=\"Sqrt\",jn=\"Sum\",ks=\"SpaceToBatchND\",Ts=\"SplitV\",Xn=\"Softmax\",Qa=\"SparseFillEmptyRows\",ga=\"SparseReshape\",Za=\"SparseSegmentMean\",Ja=\"SparseSegmentSum\",ei=\"SparseToDense\",Co=\"SquaredDifference\",ti=\"Square\",Yn=\"StridedSlice\",Ns=\"StringNGrams\",ri=\"StringSplit\",oi=\"StringToHashBucketFast\",Io=\"Sub\",xa=\"Tan\",Qn=\"Tanh\",wo=\"Tile\",Zn=\"TopK\",Jn=\"Transform\",Mr=\"Transpose\",$p=\"Unique\",_s=\"Unpack\",Rp=\"UnsortedSegmentSum\",$ne=\"UpperBound\",Es=\"ZerosLike\",$s=\"Step\",Zi=\"FromPixels\",es=\"RotateWithOffset\",Fo=\"_FusedMatMul\",Do=\"FusedConv2D\",Po=\"FusedDepthwiseConv2D\";function Rs(...r){P().getBool(\"IS_TEST\")||P().getBool(\"PROD\")||console.warn(...r)}function Sz(...r){P().getBool(\"IS_TEST\")||P().getBool(\"PROD\")||console.log(...r)}var Ap=Zc(\"kernelRegistry\",()=>new Map),Jc=Zc(\"gradRegistry\",()=>new Map);function el(r,e){let t=Tb(r,e);return Ap.get(t)}function kb(r){return Jc.get(r)}function zm(r){let e=Ap.entries(),t=[];for(;;){let{done:o,value:n}=e.next();if(o)break;let[s,a]=n,[i]=s.split(\"_\");i===r&&t.push(a)}return t}function ya(r){let{kernelName:e,backendName:t}=r,o=Tb(e,t);Ap.has(o)&&Rs(`The kernel '${e}' for backend '${t}' is already registered`),Ap.set(o,r)}function Pne(r){let{kernelName:e}=r;Jc.has(e)&&P().getBool(\"DEBUG\")&&Rs(`Overriding the gradient for '${e}'`),Jc.set(e,r)}function One(r,e){let t=Tb(r,e);if(!Ap.has(t))throw new Error(`The kernel '${r}' for backend '${e}' is not registered`);Ap.delete(t)}function Mne(r){if(!Jc.has(r))throw new Error(`The gradient '${r}' for backend is not registered`);Jc.delete(r)}function Lne(r,e){zm(r).forEach(o=>{let n=Object.assign({},o,{backendName:e});ya(n)})}function Tb(r,e){return`${e}_${r}`}var x={};Be(x,{arraysEqual:()=>Or,assert:()=>$,assertNonNegativeIntegerDimensions:()=>Xc,assertNonNull:()=>eo,assertShapesMatch:()=>ht,bytesFromStringArray:()=>bb,bytesPerElement:()=>Rm,checkConversionForErrors:()=>xb,clamp:()=>op,computeStrides:()=>ds,createScalarValue:()=>$z,createShuffledIndices:()=>lz,decodeString:()=>Op,distSquared:()=>iz,encodeString:()=>si,fetch:()=>Az,fingerPrint64:()=>Ez,flatten:()=>on,getArrayFromDType:()=>gb,getTypedArrayFromDType:()=>hb,hasEncodingLoss:()=>dz,hexToLong:()=>tl,indexToLoc:()=>xz,inferDtype:()=>np,inferFromImplicitShape:()=>fz,isBoolean:()=>l0,isFunction:()=>fs,isInt:()=>ra,isNumber:()=>m0,isPromise:()=>Yc,isScalarShape:()=>uz,isString:()=>nn,isTypedArray:()=>Ut,isValidDtype:()=>yb,locToIndex:()=>gz,makeOnesTypedArray:()=>jc,makeZerosNestedTypedArray:()=>hz,makeZerosTypedArray:()=>ap,nearestDivisor:()=>sp,nearestLargerEven:()=>nz,now:()=>ou,parseAxisParam:()=>Ka,randUniform:()=>az,repeatedTry:()=>mz,rightPad:()=>Mi,shuffle:()=>c0,shuffleCombo:()=>oz,sizeFromShape:()=>Ve,sizeToSquarishShape:()=>cz,squeezeShape:()=>db,sum:()=>sz,swap:()=>$m,tanh:()=>pz,toNestedArray:()=>Oi,toTypedArray:()=>Pp});var $b=rp(_0());var ru=$b.default||$b;function tl(r){return ru.fromString(r,!0,16)}var $0=tl(\"c3a5c85c97cb3127\"),tu=tl(\"b492b66fbe98f273\"),gr=tl(\"9ae16a3b2f90404f\");function Eb(r){return r.xor(r.shru(47))}function R0(r,e,t){let o=r.slice(e,e+t);return ru.fromBytes(Array.from(o),!0,!0)}function yt(r,e){return R0(r,e,8)}function E0(r,e){return R0(r,e,4)}function Xt(r,e){return e===0?r:r.shru(e).or(r.shl(64-e))}function ni(r,e,t=tl(\"9ddfea08eb382d69\")){let o=r.xor(e).mul(t);o=o.xor(o.shru(47));let n=e.xor(o).mul(t);return n=n.xor(n.shru(47)),n=n.mul(t),n}function kz(r,e,t,o,n,s){n=n.add(r),s=Xt(s.add(n).add(o),21);let a=n;return n=n.add(e),n=n.add(t),s=s.add(Xt(n,44)),[n.add(o),s.add(a)]}function Um(r,e,t,o){return kz(yt(r,e),yt(r,e+8),yt(r,e+16),yt(r,e+24),t,o)}function Tz(r,e=r.length){if(e>=8){let t=gr.add(e*2),o=yt(r,0).add(gr),n=yt(r,e-8),s=Xt(n,37).mul(t).add(o),a=Xt(o,25).add(n).mul(t);return ni(s,a,t)}if(e>=4){let t=gr.add(e*2),o=E0(r,0);return ni(o.shl(3).add(e),E0(r,e-4),t)}if(e>0){let t=r[0],o=r[e>>1],n=r[e-1],s=t+(o<<8),a=e+(n<<2);return Eb(gr.mul(s).xor($0.mul(a))).mul(gr)}return gr}function Nz(r,e=r.length){let t=gr.add(e*2),o=yt(r,0).mul(tu),n=yt(r,8),s=yt(r,e-8).mul(t),a=yt(r,e-16).mul(gr);return ni(Xt(o.add(n),43).add(Xt(s,30)).add(a),o.add(Xt(n.add(gr),18)).add(s),t)}function _z(r,e=r.length){let t=gr.add(e*2),o=yt(r,0).mul(gr),n=yt(r,8),s=yt(r,e-8).mul(t),a=yt(r,e-16).mul(gr),i=Xt(o.add(n),43).add(Xt(s,30)).add(a),p=ni(i,o.add(Xt(n.add(gr),18)).add(s),t),u=yt(r,16).mul(t),c=yt(r,24),l=i.add(yt(r,e-32)).mul(t),m=p.add(yt(r,e-24)).mul(t);return ni(Xt(u.add(c),43).add(Xt(l,30)).add(m),u.add(Xt(c.add(o),18)).add(l),t)}function Ez(r,e=r.length){let t=ru.fromNumber(81,!0);if(e<=32)return e<=16?Tz(r,e):Nz(r,e);if(e<=64)return _z(r,e);let o=t,n=t.mul(tu).add(113),s=Eb(n.mul(gr).add(113)).mul(gr),a=[ru.UZERO,ru.UZERO],i=[ru.UZERO,ru.UZERO];o=o.mul(gr).add(yt(r,0));let p=0,u=(e-1>>6)*64,c=u+(e-1&63)-63;do o=Xt(o.add(n).add(a[0]).add(yt(r,p+8)),37).mul(tu),n=Xt(n.add(a[1]).add(yt(r,p+48)),42).mul(tu),o=o.xor(i[1]),n=n.add(a[0]).add(yt(r,p+40)),s=Xt(s.add(i[0]),33).mul(tu),a=Um(r,p,a[1].mul(tu),o.add(i[0])),i=Um(r,p+32,s.add(i[1]),n.add(yt(r,p+16))),[s,o]=[o,s],p+=64;while(p!==u);let l=tu.add(s.and(255).shl(1));return p=c,i[0]=i[0].add(e-1&63),a[0]=a[0].add(i[0]),i[0]=i[0].add(a[0]),o=Xt(o.add(n).add(a[0]).add(yt(r,p+8)),37).mul(l),n=Xt(n.add(a[1]).add(yt(r,p+48)),42).mul(l),o=o.xor(i[1].mul(9)),n=n.add(a[0].mul(9).add(yt(r,p+40))),s=Xt(s.add(i[0]),33).mul(l),a=Um(r,p,a[1].mul(l),o.add(i[0])),i=Um(r,p+32,s.add(i[1]),n.add(yt(r,p+16))),[s,o]=[o,s],ni(ni(a[0],i[0],l).add(Eb(n).mul($0)).add(s),ni(a[1],i[1],l).add(o),l)}function $z(r,e){return e===\"string\"?si(r):Pp([r],e)}function Rz(r,e){return r instanceof Float32Array&&e===\"float32\"||r instanceof Int32Array&&e===\"int32\"||r instanceof Uint8Array&&e===\"bool\"}function Pp(r,e){if(e===\"string\")throw new Error(\"Cannot convert a string[] to a TypedArray\");if(Array.isArray(r)&&(r=on(r)),P().getBool(\"DEBUG\")&&xb(r,e),Rz(r,e))return r;if(e==null||e===\"float32\"||e===\"complex64\")return new Float32Array(r);if(e===\"int32\")return new Int32Array(r);if(e===\"bool\"){let t=new Uint8Array(r.length);for(let o=0;o{n=o()},a,i=ou();if(this.backendTimer.timerAvailable())a=this.backendTimer.time(s);else{s();for(let u of n)u.dataSync();a=Promise.resolve({kernelMs:ou()-i})}if(P().getBool(\"CHECK_COMPUTATION_FOR_ERRORS\"))for(let u=0;u{Fz(l,c.dtype,e)})}return{kernelName:e,outputs:n,inputs:t,timeMs:a.then(u=>u.kernelMs),extraInfo:a.then(u=>u.getExtraProfileInfo!=null?u.getExtraProfileInfo():\"\")}}logKernelProfile(e){let{kernelName:t,outputs:o,timeMs:n,inputs:s,extraInfo:a}=e;o.forEach(i=>{Promise.all([i.data(),n,a]).then(p=>{this.logger.logKernelProfile(t,i,p[0],p[1],s,p[2])})})}};function Fz(r,e,t){if(e!==\"float32\")return!1;for(let o=0;o0?h:\"\"} `}}console.log(`%c${p}\t%c${i}\t%c${u}D ${l}\t%c${c}\t%c${m}\t%c${a}`,\"font-weight:bold\",\"color:red\",\"color:blue\",\"color: orange\",\"color: green\",\"color: steelblue\")}};function A0(r,e,t){let o={},n={};for(let p=0;po[h.id]=!0),f=!0,n[u.id]=!0;break}if(f)break}}let s={};s[t.id]=!0;let a={};for(let p=r.length-1;p>=0;p--){let u=r[p],c=u.inputs;for(let l=0;l=0;n--){let s=e[n],a=[];if(s.outputs.forEach(p=>{let u=r[p.id];u!=null?a.push(u):a.push(null)}),s.gradient==null)throw new Error(`Cannot compute gradient: gradient function not found for ${s.kernelName}.`);let i=s.gradient(a);for(let p in s.inputs){if(!(p in i))throw new Error(`Cannot backprop through input ${p}. Available gradients found: ${Object.keys(i)}.`);let u=t(()=>i[p]());if(u.dtype!==\"float32\")throw new Error(`Error in gradient for op ${s.kernelName}. The gradient of input ${p} must have 'float32' dtype, but has '${u.dtype}'`);let c=s.inputs[p];if(!Or(u.shape,c.shape))throw new Error(`Error in gradient for op ${s.kernelName}. The gradient of input '${p}' has shape '${u.shape}', which does not match the shape of the input '${c.shape}'`);if(r[c.id]==null)r[c.id]=u;else{let l=r[c.id];r[c.id]=o(l,u),l.dispose()}}}}var D0=20,rl=3,Ab=7;function P0(r,e,t,o){let n=ds(e),s=Dz(r,e,t,n),a=e.length,i=Hm(r,e,t,n,s),p=[\"Tensor\"];return o&&(p.push(` dtype: ${t}`),p.push(` rank: ${a}`),p.push(` shape: [${e}]`),p.push(\" values:\")),p.push(i.map(u=>\" \"+u).join(`\n`)),p.join(`\n`)}function Dz(r,e,t,o){let n=Ve(e),s=o[o.length-1],a=new Array(s).fill(0),i=e.length,p=t===\"complex64\"?nl(r):r;if(i>1)for(let u=0;uD0){let g=rl*a,y=Array.from(r.slice(0,g)),b=Array.from(r.slice((i-rl)*a,i*a));return t===\"complex64\"&&(y=nl(y),b=nl(b)),[\"[\"+y.map((C,w)=>ol(C,n[w],t)).join(\", \")+\", ..., \"+b.map((C,w)=>ol(C,n[i-rl+w],t)).join(\", \")+\"]\"]}return[\"[\"+(t===\"complex64\"?nl(r):Array.from(r)).map((g,y)=>ol(g,n[y],t)).join(\", \")+\"]\"]}let u=e.slice(1),c=o.slice(1),l=o[0]*a,m=[];if(i>D0){for(let h=0;h`Length of values '${n}' 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=o||gb(t,this.size),this.strides=ds(e)}set(e,...t){t.length===0&&(t=[0]),$(t.length===this.rank,()=>`The number of provided coordinates (${t.length}) must match the rank (${this.rank})`);let o=this.locToIndex(t);this.values[o]=e}get(...e){e.length===0&&(e=[0]);let t=0;for(let n of e){if(n<0||n>=this.shape[t]){let s=`Requested out of range element at ${e}. Buffer shape=${this.shape}`;throw new Error(s)}t++}let o=e[e.length-1];for(let n=0;nOp(o))}catch(o){throw new Error(\"Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().\")}}return e}dataToGPU(e){return this.throwIfDisposed(),rs().readToGPU(this.dataId,e)}dataSync(){this.throwIfDisposed();let e=rs().readSync(this.dataId);if(this.dtype===\"string\")try{return e.map(t=>Op(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 rs().read(this.dataId);return this.dtype===\"string\"?e:new Uint8Array(e.buffer)}dispose(){this.isDisposed||(rs().disposeTensor(this),this.isDisposedInternal=!0)}get isDisposed(){return this.isDisposedInternal}throwIfDisposed(){if(this.isDisposed)throw new Error(\"Tensor is disposed.\")}print(e=!1){return Mp.print(this,e)}clone(){return this.throwIfDisposed(),Mp.clone(this)}toString(e=!1){let t=this.dataSync();return P0(t,this.shape,this.dtype,e)}cast(e){return this.throwIfDisposed(),Mp.cast(this,e)}variable(e=!0,t,o){return this.throwIfDisposed(),rs().makeVariable(this,e,t,o)}};Object.defineProperty(ut,Symbol.hasInstance,{value:r=>!!r&&r.data!=null&&r.dataSync!=null&&r.throwIfDisposed!=null});function Oz(){return Zc(\"Tensor\",()=>ut)}Oz();var ba=class extends ut{constructor(e,t,o,n){super(e.shape,e.dtype,e.dataId,n),this.trainable=t,this.name=o}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(!Or(e.shape,this.shape))throw new Error(`shape of the new value (${e.shape}) and previous value (${this.shape}) must match`);rs().disposeTensor(this),this.dataId=e.dataId,rs().incRef(this,null)}dispose(){rs().disposeVariable(this),this.isDisposedInternal=!0}};Object.defineProperty(ba,Symbol.hasInstance,{value:r=>r instanceof ut&&r.assign!=null&&r.assign instanceof Function});var z0={};Be(z0,{assertTypesMatch:()=>Lb,getTensorsInContainer:()=>sl,isTensorInList:()=>Lz,makeTypesMatch:()=>Re});var Fb;(function(r){r.R0=\"R0\",r.R1=\"R1\",r.R2=\"R2\",r.R3=\"R3\",r.R4=\"R4\",r.R5=\"R5\",r.R6=\"R6\"})(Fb||(Fb={}));var Db;(function(r){r.float32=\"float32\",r.int32=\"int32\",r.bool=\"int32\",r.complex64=\"complex64\"})(Db||(Db={}));var Pb;(function(r){r.float32=\"float32\",r.int32=\"int32\",r.bool=\"bool\",r.complex64=\"complex64\"})(Pb||(Pb={}));var Ob;(function(r){r.float32=\"float32\",r.int32=\"float32\",r.bool=\"float32\",r.complex64=\"complex64\"})(Ob||(Ob={}));var Mb;(function(r){r.float32=\"complex64\",r.int32=\"complex64\",r.bool=\"complex64\",r.complex64=\"complex64\"})(Mb||(Mb={}));var Mz={float32:Ob,int32:Db,bool:Pb,complex64:Mb};function ct(r,e){if(r===\"string\"||e===\"string\"){if(r===\"string\"&&e===\"string\")return\"string\";throw new Error(`Can not upcast ${r} with ${e}`)}return Mz[r][e]}function Ca(r){return ct(r,\"int32\")}function Re(r,e){if(r.dtype===e.dtype)return[r,e];let t=ct(r.dtype,e.dtype);return[r.cast(t),e.cast(t)]}function Lb(r,e){$(r.dtype===e.dtype,()=>`The dtypes of the first(${r.dtype}) and second(${e.dtype}) input must match`)}function Lz(r,e){return e.some(t=>t.id===r.id)}function sl(r){let e=[];return V0(r,e,new Set),e}function V0(r,e,t){if(r==null)return;if(r instanceof ut){e.push(r);return}if(!Bz(r))return;let o=r;for(let n in o){let s=o[n];t.has(s)||(t.add(s),V0(s,e,t))}}function Bz(r){return Array.isArray(r)||typeof r==\"object\"}function Bb(r){return r.kernelName!=null}var qm=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()}},ai=class{constructor(e){this.ENV=e,this.registry={},this.registryFactory={},this.pendingBackendInitId=0,this.state=new qm}async ready(){if(this.pendingBackendInit!=null)return this.pendingBackendInit.then(()=>{});if(this.backendInstance!=null)return;let e=this.getSortedBackends();for(let t=0;t{t.setupFunc!=null&&t.setupFunc(this.backendInstance)})}disposeRegisteredKernels(e){zm(e).forEach(o=>{o.disposeFunc!=null&&o.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 o=t.factory();if(o&&!(o instanceof Jr)&&typeof o.then==\"function\"){let n=++this.pendingBackendInitId,s=o.then(a=>n(nthis.registryFactory[t].priority-this.registryFactory[e].priority)}initializeBackendsAndReturnBest(){let e=this.getSortedBackends();for(let t=0;tthis.startScope(o),()=>this.endScope(n),()=>(n=t(),n instanceof Promise&&console.error(\"Cannot return a Promise inside of tidy.\"),n))}scopedRun(e,t,o){e();try{let n=o();return t(),n}catch(n){throw t(),n}}nextTensorId(){return ai.nextTensorId++}nextVariableId(){return ai.nextVariableId++}clone(e){let t=N.runKernel(uo,{x:e}),o={x:e},n=a=>({x:()=>{let i=\"float32\",p={x:a},u={dtype:i};return N.runKernel(to,p,u)}}),s=[];return this.addTapeNode(this.state.activeScope.name,o,[t],n,s,{}),t}runKernel(e,t,o){if(this.backendName==null&&this.backend,!(el(e,this.backendName)!=null))throw new Error(`Kernel '${e}' not registered for backend '${this.backendName}'`);return this.runKernelFunc({kernelName:e,inputs:t,attrs:o})}shouldCheckForMemLeaks(){return this.ENV.getBool(\"IS_TEST\")}checkKernelForMemLeak(e,t,o){let n=this.backend.numDataIds(),s=0;o.forEach(p=>{s+=p.dtype===\"complex64\"?3:1});let a=this.state.numDataMovesStack[this.state.numDataMovesStack.length-1],i=n-t-s-a;if(i>0)throw new Error(`Backend '${this.backendName}' has an internal memory leak (${i} data ids) after running '${e}'`)}runKernelFunc(e){let t,o=[],n=this.isTapeOn(),s=this.state.numBytes,a=this.state.numTensors;this.shouldCheckForMemLeaks()&&this.state.numDataMovesStack.push(0);let i;this.backendName==null&&this.backend;let p,u=Bb(e)?e.kernelName:this.state.activeScope!=null?this.state.activeScope.name:\"\";if(Bb(e)){let{kernelName:d,inputs:h,attrs:g}=e;this.backendName==null&&this.backend;let y=el(d,this.backendName);$(y!=null,()=>`Cannot find registered kernel '${d}' for backend '${this.backendName}'`),i=()=>{let b=this.backend.numDataIds();p=y.kernelFunc({inputs:h,attrs:g,backend:this.backend});let C=Array.isArray(p)?p:[p];this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(d,b,C);let w=C.map(k=>k.rank!=null?k:this.makeTensorFromTensorInfo(k));if(n){let k=this.getTensorsForGradient(d,h,w);o=this.saveTensorsForBackwardMode(k)}return w}}else{let{forwardFunc:d}=e,h=g=>{!n||(o=g.map(y=>this.keep(this.clone(y))))};i=()=>{let g=this.backend.numDataIds();p=this.tidy(()=>d(this.backend,h));let y=Array.isArray(p)?p:[p];return this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(u,g,y),y}}let{inputs:c,attrs:l}=e,m=Bb(e)?null:e.backwardsFunc,f;return this.scopedRun(()=>this.state.kernelDepth++,()=>this.state.kernelDepth--,()=>{!this.ENV.getBool(\"DEBUG\")&&!this.state.profiling?t=i():(f=this.profiler.profileKernel(u,c,()=>i()),this.ENV.getBool(\"DEBUG\")&&this.profiler.logKernelProfile(f),t=f.outputs)}),n&&this.addTapeNode(u,c,t,m,o,l),this.state.profiling&&this.state.activeProfile.kernels.push({name:u,bytesAdded:this.state.numBytes-s,totalBytesSnapshot:this.state.numBytes,tensorsAdded:this.state.numTensors-a,totalTensorsSnapshot:this.state.numTensors,inputShapes:Object.keys(c).map(d=>c[d]!=null?c[d].shape:null),outputShapes:t.map(d=>d.shape),kernelTimeMs:f.timeMs,extraInfo:f.extraInfo}),Array.isArray(p)?t:t[0]}saveTensorsForBackwardMode(e){return e.map(o=>this.keep(this.clone(o)))}getTensorsForGradient(e,t,o){let n=kb(e);if(n!=null){let s=n.inputsToSave||[],a=n.outputsToSave||[],i;n.saveAllInputs?($(Array.isArray(t),()=>\"saveAllInputs is true, expected inputs to be an array.\"),i=Object.keys(t).map(u=>t[u])):i=s.map(u=>t[u]);let p=o.filter((u,c)=>a[c]);return i.concat(p)}return[]}makeTensor(e,t,o,n){if(e==null)throw new Error(\"Values passed to engine.makeTensor() are null\");o=o||\"float32\",n=n||this.backend;let s=e;o===\"string\"&&nn(e[0])&&(s=e.map(p=>si(p)));let a=n.write(s,t,o),i=new ut(t,o,a,this.nextTensorId());if(this.trackTensor(i,n),o===\"string\"){let p=this.state.tensorInfo.get(a),u=bb(s);this.state.numBytes+=u-p.bytes,p.bytes=u}return i}makeTensorFromDataId(e,t,o,n){o=o||\"float32\";let s={dataId:e,shape:t,dtype:o};return this.makeTensorFromTensorInfo(s,n)}makeTensorFromTensorInfo(e,t){let{dataId:o,shape:n,dtype:s}=e,a=new ut(n,s,o,this.nextTensorId());return this.trackTensor(a,t),a}makeVariable(e,t=!0,o,n){o=o||this.nextVariableId().toString(),n!=null&&n!==e.dtype&&(e=e.cast(n));let s=new ba(e,t,o,this.nextTensorId());if(this.state.registeredVariables[s.name]!=null)throw new Error(`Variable with name ${s.name} was already registered`);return this.state.registeredVariables[s.name]=s,this.incRef(s,this.backend),s}trackTensor(e,t){this.state.numTensors++,e.dtype===\"string\"&&this.state.numStringTensors++;let o=0;e.dtype!==\"complex64\"&&e.dtype!==\"string\"&&(o=e.size*Rm(e.dtype)),this.state.numBytes+=o,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:o})),e instanceof ba||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 o=e.size*Rm(e.dtype);this.state.numBytes-=o}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,o=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(n=>n.totalBytesSnapshot)),this.state.activeProfile.newBytes=this.state.numBytes-t,this.state.activeProfile.newTensors=this.state.numTensors-o;for(let n of this.state.activeProfile.kernels)n.kernelTimeMs=await n.kernelTimeMs,n.extraInfo=await n.extraInfo;return this.state.activeProfile}isTapeOn(){return this.state.gradientDepth>0&&this.state.kernelDepth===0}addTapeNode(e,t,o,n,s,a){let i={id:this.state.nextTapeNodeId++,kernelName:e,inputs:t,outputs:o,saved:s},p=kb(e);p!=null&&(n=p.gradFunc),n!=null&&(i.gradient=u=>(u=u.map((c,l)=>{if(c==null){let m=o[l],f=ap(m.size,m.dtype);return this.makeTensor(f,m.shape,m.dtype)}return c}),n(u.length>1?u:u[0],s,a))),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=sl(e),o=new Set(t.map(s=>s.id));for(let s=0;s{!s.kept&&s.scopeId===n.id&&this.track(s)})}gradients(e,t,o,n=!1){if($(t.length>0,()=>\"gradients() received an empty list of xs.\"),o!=null&&o.dtype!==\"float32\")throw new Error(`dy must have 'float32' dtype, but has '${o.dtype}'`);let s=this.scopedRun(()=>this.startTape(),()=>this.endTape(),()=>this.tidy(\"forward\",e));$(s instanceof ut,()=>\"The result y returned by f() must be a tensor.\");let a=A0(this.state.activeTape,t,s);if(!n&&a.length===0&&t.length>0)throw new Error(\"Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y.\");return this.tidy(\"backward\",()=>{let i={};i[s.id]=o==null?Vz(s.shape):o,F0(i,a,u=>this.tidy(u),zz);let p=t.map(u=>i[u.id]);return this.state.gradientDepth===0&&(this.state.activeTape.forEach(u=>{for(let c of u.saved)c.dispose()}),this.state.activeTape=null),{value:s,grads:p}})}customGrad(e){return $(fs(e),()=>\"The f passed in customGrad(f) must be a function.\"),(...t)=>{$(t.every(i=>i instanceof ut),()=>\"The args passed in customGrad(f)(x1, x2,...) must all be tensors\");let o,n={};t.forEach((i,p)=>{n[p]=i});let s=(i,p)=>(o=e(...t,p),$(o.value instanceof ut,()=>\"The function f passed in customGrad(f) must return an object where `obj.value` is a tensor\"),$(fs(o.gradFunc),()=>\"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function.\"),o.value),a=(i,p)=>{let u=o.gradFunc(i,p),c=Array.isArray(u)?u:[u];$(c.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(...).\"),$(c.every(m=>m instanceof ut),()=>\"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 l={};return c.forEach((m,f)=>{l[f]=()=>m}),l};return this.runKernelFunc({forwardFunc:s,backwardsFunc:a,inputs:n})}}readSync(e){return this.state.tensorInfo.get(e).backend.readSync(e)}read(e){return this.state.tensorInfo.get(e).backend.read(e)}readToGPU(e,t){return this.state.tensorInfo.get(e).backend.readToGPU(e,t)}async time(e){let t=ou(),o=await this.backend.time(e);return o.wallMs=ou()-t,o}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 qm;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}};ai.nextTensorId=0;ai.nextVariableId=0;function Vz(r){let e=jc(Ve(r),\"float32\");return N.makeTensor(e,r,\"float32\")}function Vb(){let r=wb();if(r._tfengine==null){let e=new Qc(r);r._tfengine=new ai(e)}return h0(r._tfengine.ENV),M0(()=>r._tfengine),r._tfengine}var N=Vb();function zz(r,e){let t={a:r,b:e};return N.runKernel(_r,t)}var ii={};Be(ii,{isBrowser:()=>Wb,isMobile:()=>Gz,mockIsMobile:()=>Uz});function Wz(){return typeof navigator!=\"undefined\"&&navigator!=null}var zb;function Uz(r){zb=r}function Gz(r){if(zb!==void 0)return zb;if(r||Wz()){if(r||(r=navigator),r.product===\"ReactNative\")return!0;let e=r.userAgent||r.vendor||(typeof window!=\"undefined\"?window.opera:\"\");if(!e){let t=r;return t.userAgentData&&t.userAgentData.mobile}return/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(e)||/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(e.substr(0,4))}return!1}function Wb(){return typeof window!=\"undefined\"&&window.document!=null||typeof WorkerGlobalScope!=\"undefined\"}var Vr=P();Vr.registerFlag(\"DEBUG\",()=>!1,r=>{r&&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.\")});Vr.registerFlag(\"IS_BROWSER\",()=>Wb());Vr.registerFlag(\"IS_NODE\",()=>typeof process!=\"undefined\"&&typeof process.versions!=\"undefined\"&&typeof process.versions.node!=\"undefined\");Vr.registerFlag(\"IS_CHROME\",()=>typeof navigator!=\"undefined\"&&navigator!=null&&navigator.userAgent!=null&&/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor));Vr.registerFlag(\"PROD\",()=>!1);Vr.registerFlag(\"TENSORLIKE_CHECK_SHAPE_CONSISTENCY\",()=>Vr.getBool(\"DEBUG\"));Vr.registerFlag(\"DEPRECATION_WARNINGS_ENABLED\",()=>!0);Vr.registerFlag(\"IS_TEST\",()=>!1);Vr.registerFlag(\"CHECK_COMPUTATION_FOR_ERRORS\",()=>!0);Vr.registerFlag(\"WRAP_TO_IMAGEBITMAP\",()=>!1);Vr.registerFlag(\"ENGINE_COMPILE_ONLY\",()=>!1);Vr.registerFlag(\"CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU\",()=>!1);Vr.registerFlag(\"USE_SETTIMEOUTCUSTOM\",()=>!1);function or(r,e){let t=r;if(Ut(r))return e===\"string\"?[]:[r.length];if(typeof r==\"object\"&&\"texture\"in r){let n=r.channels||\"RGBA\";return[r.height,r.width*n.length]}if(!Array.isArray(r))return[];let o=[];for(;Array.isArray(t)||Ut(t)&&e!==\"string\";)o.push(t.length),t=t[0];return Array.isArray(r)&&P().getBool(\"TENSORLIKE_CHECK_SHAPE_CONSISTENCY\")&&U0(r,o,[]),o}function U0(r,e,t){if(t=t||[],!Array.isArray(r)&&!Ut(r)){$(e.length===0,()=>`Element arr[${t.join(\"][\")}] is a primitive, but should be an array/TypedArray of ${e[0]} elements`);return}$(e.length>0,()=>`Element arr[${t.join(\"][\")}] should be a primitive, but is an array of ${r.length} elements`),$(r.length===e[0],()=>`Element arr[${t.join(\"][\")}] should have ${e[0]} elements, but has ${r.length} elements`);let o=e.slice(1);for(let n=0;n=0&&(n=o),W0(o,n,e,t),r==null||!Ut(r)&&!Array.isArray(r)&&typeof r!=\"number\"&&typeof r!=\"boolean\"&&typeof r!=\"string\"){let p=r==null?\"null\":r.constructor.name;throw new Error(`Argument '${e}' passed to '${t}' must be a Tensor or TensorLike, but got '${p}'`)}let s=or(r,n);!Ut(r)&&!Array.isArray(r)&&(r=[r]);let i=n!==\"string\"?Pp(r,n):on(r,[],!0);return N.makeTensor(i,s,n)}function Ia(r,e,t,o=\"numeric\"){if(!Array.isArray(r))throw new Error(`Argument ${e} passed to ${t} must be a \\`Tensor[]\\` or \\`TensorLike[]\\``);return r.map((s,a)=>v(s,`${e}[${a}]`,t,o))}var Ub=\"__op\";function T(r){let e=Object.keys(r);if(e.length!==1)throw new Error(`Please provide an object with a single key (operation name) mapping to a function. Got an object with ${e.length} keys.`);let t=e[0],o=r[t];t.endsWith(\"_\")&&(t=t.substring(0,t.length-1)),t=t+Ub;let n=(...s)=>{N.startScope(t);try{let a=o(...s);return Yc(a)&&console.error(\"Cannot return a Promise inside of tidy.\"),N.endScope(a),a}catch(a){throw N.endScope(null),a}};return Object.defineProperty(n,\"name\",{value:t,configurable:!0}),n}function Hz(r,e){let t=v(r,\"real\",\"complex\"),o=v(e,\"imag\",\"complex\");ht(t.shape,o.shape,`real and imag shapes, ${t.shape} and ${o.shape}, must match in call to tf.complex().`);let n={real:t,imag:o};return N.runKernel(aa,n)}var Er=T({complex_:Hz});function xr(r,e,t,o){if(o==null&&(o=np(r)),o===\"complex64\")throw new Error(\"Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).\");if(typeof r==\"object\"&&\"texture\"in r){if(o!==\"float32\"&&o!==\"int32\")throw new Error(`Creating tensor from texture only supports 'float32'|'int32' dtype, while the dtype is ${o}.`);return r.channels=r.channels||\"RGBA\",N.backend.createTensorFromTexture(r,e||t,o)}if(!Ut(r)&&!Array.isArray(r)&&typeof r!=\"number\"&&typeof r!=\"boolean\"&&typeof r!=\"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(e!=null){Xc(e);let n=Ve(e),s=Ve(t);$(n===s,()=>`Based on the provided shape, [${e}], the tensor should have ${n} values but has ${s}`);for(let a=0;a`Error creating a new Tensor. Inferred shape (${t}) does not match the provided shape (${e}). `)}}return!Ut(r)&&!Array.isArray(r)&&(r=[r]),e=e||t,r=o!==\"string\"?Pp(r,o):on(r,[],!0),N.makeTensor(r,e,o)}function nr(r,e,t){let o=or(r,t);return xr(r,e,o,t)}var al={float32:4,float16:2,int32:4,uint16:2,uint8:1,bool:1,complex64:8};var Km=4;async function H0(r,e){let t=[],o=[],n=Array.isArray(r)?r.map(a=>a.name):Object.keys(r);for(let a=0;a{let m=await p.bytes(),f=m.reduce((g,y)=>g+y.length,0)+Km*m.length,d=new Uint8Array(f),h=0;for(let g=0;g{if(e+=s.byteLength,t.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 o=new Uint8Array(e),n=0;return t.forEach(s=>{o.set(new Uint8Array(s.buffer),n),n+=s.byteLength}),o.buffer}var Gb=typeof Buffer!=\"undefined\"&&(typeof Blob==\"undefined\"||typeof atob==\"undefined\"||typeof btoa==\"undefined\");function G0(r){return Gb?Buffer.byteLength(r):new Blob([r]).size}function q0(r){if(Gb)return Buffer.from(r).toString(\"base64\");let e=new Uint8Array(r),t=\"\";for(let o=0,n=e.length;o{e+=n.byteLength});let t=new Uint8Array(e),o=0;return r.forEach(n=>{t.set(new Uint8Array(n),o),o+=n.byteLength}),t.buffer}function Hb(r){let e=\"/\";for(r=r.trim();r.endsWith(e);)r=r.slice(0,r.length-1);let t=r.split(e);return t[t.length-1]}function Xm(r,e){let t={modelTopology:r.modelTopology,format:r.format,generatedBy:r.generatedBy,convertedBy:r.convertedBy,weightsManifest:e};return r.signature!=null&&(t.signature=r.signature),r.userDefinedMetadata!=null&&(t.userDefinedMetadata=r.userDefinedMetadata),r.modelInitializer!=null&&(t.modelInitializer=r.modelInitializer),r.initializerSignature!=null&&(t.initializerSignature=r.initializerSignature),r.trainingConfig!=null&&(t.trainingConfig=r.trainingConfig),t}function qb(r,e,t){let o={modelTopology:r.modelTopology,format:r.format,generatedBy:r.generatedBy,convertedBy:r.convertedBy};if(r.trainingConfig!=null&&(o.trainingConfig=r.trainingConfig),r.weightsManifest!=null){if(!e)throw new Error(\"modelJSON has weightsManifest but weightSpecs is null\");if(!t)throw new Error(\"modelJSON has weightsManifest but weightData is null\");o.weightSpecs=e,o.weightData=t}return r.signature!=null&&(o.signature=r.signature),r.userDefinedMetadata!=null&&(o.userDefinedMetadata=r.userDefinedMetadata),r.modelInitializer!=null&&(o.modelInitializer=r.modelInitializer),r.initializerSignature!=null&&(o.initializerSignature=r.initializerSignature),o}async function Bp(r,e){let t,o;return r.weightsManifest!=null&&([t,o]=await e(r.weightsManifest)),qb(r,t,o)}function As(r){if(r.modelTopology instanceof ArrayBuffer)throw new Error(\"Expected JSON model topology, received ArrayBuffer.\");return{dateSaved:new Date,modelTopologyType:\"JSON\",modelTopologyBytes:r.modelTopology==null?0:G0(JSON.stringify(r.modelTopology)),weightSpecsBytes:r.weightSpecs==null?0:G0(JSON.stringify(r.weightSpecs)),weightDataBytes:r.weightData==null?0:r.weightData.byteLength}}function Ym(r){let e=[];for(let t of r)e.push(...t.weights);return e}function Kz(){let r=t=>{let o=t<<13,n=0;for(;(o&8388608)===0;)n-=8388608,o<<=1;return o&=-8388609,n+=947912704,o|n},e=new Uint32Array(2048);e[0]=0;for(let t=1;t<1024;t++)e[t]=r(t);for(let t=1024;t<2048;t++)e[t]=939524096+(t-1024<<13);return e}function jz(){let r=new Uint32Array(64);r[0]=0,r[31]=1199570944,r[32]=2147483648,r[63]=3347054592;for(let e=1;e<31;e++)r[e]=e<<23;for(let e=33;e<63;e++)r[e]=2147483648+(e-32<<23);return r}function Xz(){let r=new Uint32Array(64);for(let e=0;e<64;e++)r[e]=1024;return r[0]=r[32]=0,r}function Yz(){let r=Kz(),e=jz(),t=Xz();return o=>{let n=new ArrayBuffer(4*o.length),s=new Uint32Array(n);for(let a=0;a>10]+(i&1023)]+e[i>>10];s[a]=p}return new Float32Array(n)}}var mt=class{constructor(){this.saveRouters=[],this.loadRouters=[]}static getInstance(){return mt.instance==null&&(mt.instance=new mt),mt.instance}static registerSaveRouter(e){mt.getInstance().saveRouters.push(e)}static registerLoadRouter(e){mt.getInstance().loadRouters.push(e)}static getSaveHandlers(e){return mt.getHandlers(e,\"save\")}static getLoadHandlers(e,t){return mt.getHandlers(e,\"load\",t)}static getHandlers(e,t,o){let n=[];return(t===\"load\"?mt.getInstance().loadRouters:mt.getInstance().saveRouters).forEach(a=>{let i=a(e,o);i!==null&&n.push(i)}),n}},j0=r=>mt.registerSaveRouter(r),X0=r=>mt.registerLoadRouter(r),Y0=r=>mt.getSaveHandlers(r),Q0=(r,e)=>mt.getLoadHandlers(r,e);var Kb=\"tensorflowjs\",jb=1,nu=\"models_store\",ui=\"model_info_store\";function Z0(){if(!P().getBool(\"IS_BROWSER\"))throw new Error(\"Failed to obtain IndexedDB factory because the current environmentis not a web browser.\");let r=typeof window==\"undefined\"?self:window,e=r.indexedDB||r.mozIndexedDB||r.webkitIndexedDB||r.msIndexedDB||r.shimIndexedDB;if(e==null)throw new Error(\"The current browser does not appear to support IndexedDB.\");return e}function Xb(r){let e=r.result;e.createObjectStore(nu,{keyPath:\"modelPath\"}),e.createObjectStore(ui,{keyPath:\"modelPath\"})}var Fs=class{constructor(e){if(this.indexedDB=Z0(),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((o,n)=>{let s=this.indexedDB.open(Kb,jb);s.onupgradeneeded=()=>Xb(s),s.onsuccess=()=>{let a=s.result;if(t==null){let i=a.transaction(nu,\"readonly\"),u=i.objectStore(nu).get(this.modelPath);u.onsuccess=()=>{if(u.result==null)return a.close(),n(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`));o(u.result.modelArtifacts)},u.onerror=c=>(a.close(),n(u.error)),i.oncomplete=()=>a.close()}else{let i=As(t),p=a.transaction(ui,\"readwrite\"),u=p.objectStore(ui),c=u.put({modelPath:this.modelPath,modelArtifactsInfo:i}),l;c.onsuccess=()=>{l=a.transaction(nu,\"readwrite\");let f=l.objectStore(nu).put({modelPath:this.modelPath,modelArtifacts:t,modelArtifactsInfo:i});f.onsuccess=()=>o({modelArtifactsInfo:i}),f.onerror=d=>{u=p.objectStore(ui);let h=u.delete(this.modelPath);h.onsuccess=()=>(a.close(),n(f.error)),h.onerror=g=>(a.close(),n(f.error))}},c.onerror=m=>(a.close(),n(c.error)),p.oncomplete=()=>{l==null?a.close():l.oncomplete=()=>a.close()}}},s.onerror=a=>n(s.error)})}};Fs.URL_SCHEME=\"indexeddb://\";var J0=r=>P().getBool(\"IS_BROWSER\")&&!Array.isArray(r)&&r.startsWith(Fs.URL_SCHEME)?Qz(r.slice(Fs.URL_SCHEME.length)):null;mt.registerSaveRouter(J0);mt.registerLoadRouter(J0);function Qz(r){return new Fs(r)}function Zz(r){return r.startsWith(Fs.URL_SCHEME)?r.slice(Fs.URL_SCHEME.length):r}var Qm=class{constructor(){this.indexedDB=Z0()}async listModels(){return new Promise((e,t)=>{let o=this.indexedDB.open(Kb,jb);o.onupgradeneeded=()=>Xb(o),o.onsuccess=()=>{let n=o.result,s=n.transaction(ui,\"readonly\"),i=s.objectStore(ui).getAll();i.onsuccess=()=>{let p={};for(let u of i.result)p[u.modelPath]=u.modelArtifactsInfo;e(p)},i.onerror=p=>(n.close(),t(i.error)),s.oncomplete=()=>n.close()},o.onerror=n=>t(o.error)})}async removeModel(e){return e=Zz(e),new Promise((t,o)=>{let n=this.indexedDB.open(Kb,jb);n.onupgradeneeded=()=>Xb(n),n.onsuccess=()=>{let s=n.result,a=s.transaction(ui,\"readwrite\"),i=a.objectStore(ui),p=i.get(e),u;p.onsuccess=()=>{if(p.result==null)return s.close(),o(new Error(`Cannot find model with path '${e}' in IndexedDB.`));{let c=i.delete(e),l=()=>{u=s.transaction(nu,\"readwrite\");let f=u.objectStore(nu).delete(e);f.onsuccess=()=>t(p.result.modelArtifactsInfo),f.onerror=d=>o(p.error)};c.onsuccess=l,c.onerror=m=>(l(),s.close(),o(p.error))}},p.onerror=c=>(s.close(),o(p.error)),a.oncomplete=()=>{u==null?s.close():u.oncomplete=()=>s.close()}},n.onerror=s=>o(n.error)})}};var wa=\"/\",Vp=\"tensorflowjs_models\",ev=\"info\",Jz=\"model_topology\",eW=\"weight_specs\",tW=\"weight_data\",rW=\"model_metadata\";function tv(r){return{info:[Vp,r,ev].join(wa),topology:[Vp,r,Jz].join(wa),weightSpecs:[Vp,r,eW].join(wa),weightData:[Vp,r,tW].join(wa),modelMetadata:[Vp,r,rW].join(wa)}}function rv(r){for(let e of Object.values(r))window.localStorage.removeItem(e)}function oW(r){let e=r.split(wa);if(e.length<3)throw new Error(`Invalid key format: ${r}`);return e.slice(1,e.length-1).join(wa)}function nW(r){return r.startsWith(Ds.URL_SCHEME)?r.slice(Ds.URL_SCHEME.length):r}var Ds=class{constructor(e){if(!P().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=tv(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),o=JSON.stringify(e.weightSpecs),n=As(e);try{this.LS.setItem(this.keys.info,JSON.stringify(n)),this.LS.setItem(this.keys.topology,t),this.LS.setItem(this.keys.weightSpecs,o),this.LS.setItem(this.keys.weightData,q0(e.weightData));let s={format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,signature:e.signature!=null?e.signature:void 0,userDefinedMetadata:e.userDefinedMetadata!=null?e.userDefinedMetadata:void 0,modelInitializer:e.modelInitializer!=null?e.modelInitializer:void 0,initializerSignature:e.initializerSignature!=null?e.initializerSignature:void 0,trainingConfig:e.trainingConfig!=null?e.trainingConfig:void 0};return this.LS.setItem(this.keys.modelMetadata,JSON.stringify(s)),{modelArtifactsInfo:n}}catch(s){throw rv(this.keys),new Error(`Failed to save model '${this.modelPath}' to local storage: size quota being exceeded is a possible cause of this failure: modelTopologyBytes=${n.modelTopologyBytes}, weightSpecsBytes=${n.weightSpecsBytes}, weightDataBytes=${n.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={},o=JSON.parse(this.LS.getItem(this.keys.topology));if(o==null)throw new Error(`In local storage, the topology of model '${this.modelPath}' is missing.`);t.modelTopology=o;let n=JSON.parse(this.LS.getItem(this.keys.weightSpecs));if(n==null)throw new Error(`In local storage, the weight specs of model '${this.modelPath}' are missing.`);t.weightSpecs=n;let s=this.LS.getItem(this.keys.modelMetadata);if(s!=null){let i=JSON.parse(s);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),i.initializerSignature!=null&&(t.initializerSignature=i.initializerSignature),i.trainingConfig!=null&&(t.trainingConfig=i.trainingConfig)}let a=this.LS.getItem(this.keys.weightData);if(a==null)throw new Error(`In local storage, the binary weight values of model '${this.modelPath}' are missing.`);return t.weightData=K0(a),t}};Ds.URL_SCHEME=\"localstorage://\";var ov=r=>P().getBool(\"IS_BROWSER\")&&!Array.isArray(r)&&r.startsWith(Ds.URL_SCHEME)?sW(r.slice(Ds.URL_SCHEME.length)):null;mt.registerSaveRouter(ov);mt.registerLoadRouter(ov);function sW(r){return new Ds(r)}var Zm=class{constructor(){$(P().getBool(\"IS_BROWSER\"),()=>\"Current environment is not a web browser\"),$(typeof window==\"undefined\"||typeof window.localStorage!=\"undefined\",()=>\"Current browser does not appear to support localStorage\"),this.LS=window.localStorage}async listModels(){let e={},t=Vp+wa,o=wa+ev;for(let n=0;n\"scheme must not be undefined or null.\"),e.endsWith(zp)&&(e=e.slice(0,e.indexOf(zp))),$(e.length>0,()=>\"scheme must not be an empty string.\");let o=Yt.getInstance();$(o.managers[e]==null,()=>`A model store manager is already registered for scheme '${e}'.`),o.managers[e]=t}static getManager(e){let t=Yt.getInstance().managers[e];if(t==null)throw new Error(`Cannot find model manager for scheme '${e}'`);return t}static getSchemes(){return Object.keys(Yt.getInstance().managers)}};function Jm(r){if(r.indexOf(zp)===-1)throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${Yt.getSchemes().join(\",\")}`);return{scheme:r.split(zp)[0],path:r.split(zp)[1]}}async function nv(r,e,t=!1){$(r!==e,()=>`Old path and new path are the same: '${r}'`);let o=mt.getLoadHandlers(r);$(o.length>0,()=>`Copying failed because no load handler is found for source URL ${r}.`),$(o.length<2,()=>`Copying failed because more than one (${o.length}) load handlers for source URL ${r}.`);let n=o[0],s=mt.getSaveHandlers(e);$(s.length>0,()=>`Copying failed because no save handler is found for destination URL ${e}.`),$(s.length<2,()=>`Copying failed because more than one (${o.length}) save handlers for destination URL ${e}.`);let a=s[0],i=Jm(r).scheme,p=Jm(r).path,u=i===Jm(r).scheme,c=await n.load();t&&u&&await Yt.getManager(i).removeModel(p);let l=await a.save(c);return t&&!u&&await Yt.getManager(i).removeModel(p),l.modelArtifactsInfo}async function sv(){let r=Yt.getSchemes(),e={};for(let t of r){let o=await Yt.getManager(t).listModels();for(let n in o){let s=t+zp+n;e[s]=o[n]}}return e}async function av(r){let e=Jm(r);return Yt.getManager(e.scheme).removeModel(e.path)}async function iv(r,e){return nv(r,e,!1)}async function uv(r,e){return nv(r,e,!0)}var Yb=class{constructor(){this.messageName=\"setTimeoutCustom\",this.functionRefs=[],this.handledMessageCount=0,this.hasEventListener=!1}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)}setTimeoutCustom(e,t){if(typeof window==\"undefined\"||!P().getBool(\"USE_SETTIMEOUTCUSTOM\")){setTimeout(e,t);return}this.functionRefs.push(e),setTimeout(()=>{window.postMessage({name:this.messageName,index:this.functionRefs.length-1},\"*\")},t),this.hasEventListener||(this.hasEventListener=!0,window.addEventListener(\"message\",o=>{if(o.source===window&&o.data.name===this.messageName){o.stopPropagation();let n=this.functionRefs[o.data.index];n(),this.handledMessageCount++,this.handledMessageCount===this.functionRefs.length&&(this.functionRefs=[],this.handledMessageCount=0)}},!0))}};if(P().get(\"IS_BROWSER\")){P().setPlatform(\"browser\",new Yb);try{Yt.registerManager(Ds.URL_SCHEME,new Zm)}catch(r){}try{Yt.registerManager(Fs.URL_SCHEME,new Qm)}catch(r){}}var aW={importFetch:()=>pv()},Qb;var Zb=class{constructor(){this.util=cv(),this.textEncoder=new this.util.TextEncoder}fetch(e,t){return P().global.fetch!=null?P().global.fetch(e,t):(Qb==null&&(Qb=aW.importFetch()),Qb(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)}};P().get(\"IS_NODE\")&&!P().get(\"IS_BROWSER\")&&P().setPlatform(\"node\",new Zb);function ne(r,e=\"float32\",t){return e=e||\"float32\",Xc(r),new je(r,e,t)}function iW(r,e){let t=v(r,\"x\",\"cast\");if(!yb(e))throw new Error(`Failed to cast to unknown dtype ${e}`);if(e===\"string\"&&t.dtype!==\"string\"||e!==\"string\"&&t.dtype===\"string\")throw new Error(\"Only strings can be casted to strings\");let o={x:t},n={dtype:e};return N.runKernel(to,o,n)}var qe=T({cast_:iW});function uW(r){let t={x:v(r,\"x\",\"clone\",\"string_or_numeric\")};return N.runKernel(uo,t)}var zr=T({clone_:uW});function ef(r,e=!1){console.log(r.toString(e))}Vb();var pW={buffer:ne,cast:qe,clone:zr,print:ef};L0(pW);var va={};Be(va,{browserFiles:()=>mv,browserHTTPRequest:()=>hv,concatenateArrayBuffers:()=>Lp,copyModel:()=>iv,decodeWeights:()=>jm,encodeWeights:()=>H0,fromMemory:()=>gv,fromMemorySync:()=>nC,getLoadHandlers:()=>Q0,getModelArtifactsForJSON:()=>Bp,getModelArtifactsForJSONSync:()=>qb,getModelArtifactsInfoForJSON:()=>As,getSaveHandlers:()=>Y0,getWeightSpecs:()=>Ym,http:()=>rf,isHTTPScheme:()=>tf,listModels:()=>sv,loadWeights:()=>fv,moveModel:()=>uv,registerLoadRouter:()=>X0,registerSaveRouter:()=>j0,removeModel:()=>av,weightsLoaderFactory:()=>rC,withSaveHandler:()=>xv,withSaveHandlerSync:()=>yv});var cW=\"model\",lW=\".json\",mW=\".weights.bin\";function lv(r){return new Promise(e=>setTimeout(e)).then(r)}var Sa=class{constructor(e){if(!P().getBool(\"IS_BROWSER\"))throw new Error(\"browserDownloads() cannot proceed because the current environment is not a browser.\");e.startsWith(Sa.URL_SCHEME)&&(e=e.slice(Sa.URL_SCHEME.length)),(e==null||e.length===0)&&(e=cW),this.modelJsonFileName=e+lW,this.weightDataFileName=e+mW}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 o=[{paths:[\"./\"+this.weightDataFileName],weights:e.weightSpecs}],n=Xm(e,o),s=window.URL.createObjectURL(new Blob([JSON.stringify(n)],{type:\"application/json\"})),a=this.modelJsonAnchor==null?document.createElement(\"a\"):this.modelJsonAnchor;if(a.download=this.modelJsonFileName,a.href=s,await lv(()=>a.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 lv(()=>i.dispatchEvent(new MouseEvent(\"click\")))}return{modelArtifactsInfo:As(e)}}}};Sa.URL_SCHEME=\"downloads://\";var Jb=class{constructor(e){if(e==null||e.length<1)throw new Error(`When calling browserFiles, at least 1 file is required, but received ${e}`);this.jsonFile=e[0],this.weightsFiles=e.slice(1)}async load(){return new Promise((e,t)=>{let o=new FileReader;o.onload=n=>{let s=JSON.parse(n.target.result),a=s.modelTopology;if(a==null){t(new Error(`modelTopology field is missing from file ${this.jsonFile.name}`));return}if(s.weightsManifest==null){t(new Error(`weightManifest field is missing from file ${this.jsonFile.name}`));return}if(this.weightsFiles.length===0){e({modelTopology:a});return}let p=Bp(s,u=>this.loadWeights(u));e(p)},o.onerror=n=>t(`Failed to read model topology and weights manifest JSON from file '${this.jsonFile.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`),o.readAsText(this.jsonFile)})}loadWeights(e){let t=[],o=[];for(let a of e)t.push(...a.weights),o.push(...a.paths);let n=this.checkManifestAndWeightFiles(e),s=o.map(a=>this.loadWeightsFile(a,n[a]));return Promise.all(s).then(a=>[t,Lp(a)])}loadWeightsFile(e,t){return new Promise((o,n)=>{let s=new FileReader;s.onload=a=>{let i=a.target.result;o(i)},s.onerror=a=>n(`Failed to weights data from file of path '${e}'.`),s.readAsArrayBuffer(t)})}checkManifestAndWeightFiles(e){let t=[],o=this.weightsFiles.map(s=>Hb(s.name)),n={};for(let s of e)s.paths.forEach(a=>{let i=Hb(a);if(t.indexOf(i)!==-1)throw new Error(`Duplicate file basename found in weights manifest: '${i}'`);if(t.push(i),o.indexOf(i)===-1)throw new Error(`Weight file with basename '${i}' is not provided.`);n[a]=this.weightsFiles[o.indexOf(i)]});if(t.length!==this.weightsFiles.length)throw new Error(`Mismatch in the number of files in weights manifest (${t.length}) and the number of weight files provided (${this.weightsFiles.length}).`);return n}},fW=r=>P().getBool(\"IS_BROWSER\")&&!Array.isArray(r)&&r.startsWith(Sa.URL_SCHEME)?dW(r.slice(Sa.URL_SCHEME.length)):null;mt.registerSaveRouter(fW);function dW(r=\"model\"){return new Sa(r)}function mv(r){return new Jb(r)}function eC(r,e,t,o){a(r),t=t==null?0:t,o=o==null?1:o,i(t,o);let n=0,s=p=>(p.then(u=>{let c=t+ ++n/r.length*(o-t);return e(c),u}),p);function a(p){$(p!=null&&Array.isArray(p)&&p.length>0,()=>\"promises must be a none empty array\")}function i(p,u){$(p>=0&&p<=1,()=>`Progress fraction must be in range [0, 1], but got startFraction ${p}`),$(u>=0&&u<=1,()=>`Progress fraction must be in range [0, 1], but got endFraction ${u}`),$(u>=p,()=>`startFraction must be no more than endFraction, but got startFraction ${p} and endFraction ${u}`)}return Promise.all(r.map(s))}async function tC(r,e){e==null&&(e={});let t=e.fetchFunc==null?P().platform.fetch:e.fetchFunc,o=r.map(l=>t(l,e.requestInit,{isBinary:!0})),n=0,s=.5,i=(e.onProgress==null?await Promise.all(o):await eC(o,e.onProgress,n,s)).map(l=>l.arrayBuffer()),p=.5,u=1;return e.onProgress==null?await Promise.all(i):await eC(i,e.onProgress,p,u)}async function fv(r,e=\"\",t,o){return rC(a=>tC(a,{requestInit:o}))(r,e,t)}function rC(r){return async(e,t=\"\",o)=>{let n=e.map(()=>!1),s={},a=o!=null?o.map(()=>!1):[],i=[];if(e.forEach((f,d)=>{let h=0;f.weights.forEach(g=>{let y=\"quantization\"in g?g.quantization.dtype:g.dtype,b=al[y]*Ve(g.shape),C=()=>{n[d]=!0,s[d]==null&&(s[d]=[]),s[d].push({manifestEntry:g,groupOffset:h,sizeBytes:b})};o!=null?o.forEach((w,k)=>{w===g.name&&(C(),a[k]=!0)}):C(),i.push(g.name),h+=b})}),!a.every(f=>f)){let f=o.filter((d,h)=>!a[h]);throw new Error(`Could not find weights in manifest with names: ${f.join(\", \")}. \nManifest JSON has weights with names: ${i.join(\", \")}.`)}let p=n.reduce((f,d,h)=>(d&&f.push(h),f),[]),u=[];p.forEach(f=>{e[f].paths.forEach(d=>{let h=t+(t.endsWith(\"/\")?\"\":\"/\")+d;u.push(h)})});let c=await r(u),l={},m=0;return p.forEach(f=>{let d=e[f].paths.length,h=0;for(let w=0;w{let k=g.slice(w.groupOffset,w.groupOffset+w.sizeBytes),_=jm(k,[w.manifestEntry]);for(let E in _)l[E]=_[E]}),m+=d}),l}}var hW=\"application/octet-stream\",gW=\"application/json\",il=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?($(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=P().platform.fetch,$(e!=null&&e.length>0,()=>\"URL path for http must not be null, undefined or empty.\"),Array.isArray(e)&&$(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 o=[{paths:[\"./model.weights.bin\"],weights:e.weightSpecs}],n=Xm(e,o);t.body.append(\"model.json\",new Blob([JSON.stringify(n)],{type:gW}),\"model.json\"),e.weightData!=null&&t.body.append(\"model.weights.bin\",new Blob([e.weightData],{type:hW}),\"model.weights.bin\");let s=await this.fetch(this.path,t);if(s.ok)return{modelArtifactsInfo:As(e),responses:[s]};throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${s.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(s){let a=`Failed to parse model JSON of response from ${this.path}.`;throw this.path.endsWith(\".pb\")?a+=\" Your path contains a .pb file extension. Support for .pb models have been removed in TensorFlow.js 1.0 in favor of .json models. You can re-convert your Python TensorFlow model using the TensorFlow.js 1.0 conversion scripts or you can convert your.pb models with the 'pb2json'NPM script in the tensorflow/tfjs-converter repository.\":a+=\" Please make sure the server is serving valid JSON for this request.\",new Error(a)}let o=t.modelTopology,n=t.weightsManifest;if(o==null&&n==null)throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`);return Bp(t,s=>this.loadWeights(s))}async loadWeights(e){let t=Array.isArray(this.path)?this.path[1]:this.path,[o,n]=xW(t),s=this.weightPathPrefix||o,a=Ym(e),i=[],p=[];for(let c of e)for(let l of c.paths)this.weightUrlConverter!=null?p.push(this.weightUrlConverter(l)):i.push(s+l+n);this.weightUrlConverter&&i.push(...await Promise.all(p));let u=await tC(i,{requestInit:this.requestInit,fetchFunc:this.fetch,onProgress:this.onProgress});return[a,Lp(u)]}};il.URL_SCHEME_REGEX=/^https?:\\/\\//;function xW(r){let e=r.lastIndexOf(\"/\"),t=r.lastIndexOf(\"?\"),o=r.substring(0,e),n=t>e?r.substring(t):\"\";return[o+\"/\",n]}function tf(r){return r.match(il.URL_SCHEME_REGEX)!=null}var dv=(r,e)=>{if(typeof fetch==\"undefined\"&&(e==null||e.fetchFunc==null))return null;{let t=!0;if(Array.isArray(r)?t=r.every(o=>tf(o)):t=tf(r),t)return rf(r,e)}return null};mt.registerSaveRouter(dv);mt.registerLoadRouter(dv);function rf(r,e){return new il(r,e)}function hv(r,e){return rf(r,e)}var ul=class{constructor(e){this.modelArtifacts=e}load(){return this.modelArtifacts}},of=class{constructor(e){this.saveHandler=e}save(e){return this.saveHandler(e)}},oC=class{constructor(e){e.load&&(this.load=()=>Promise.resolve(e.load())),e.save&&(this.save=t=>Promise.resolve(e.save(t)))}};function gv(r,e,t,o){let n=arguments;return new oC(nC(...n))}function nC(r,e,t,o){return arguments.length===1?r.modelTopology!=null||r.weightSpecs!=null?new ul(r):(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 ul({modelTopology:r})):(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 ul({modelTopology:r,weightSpecs:e,weightData:t,trainingConfig:o}))}function xv(r){return new of(r)}function yv(r){return new of(r)}var Cv={};Be(Cv,{confusionMatrix:()=>bv});function yW(r,e,t=!1,o=!1){let n=v(r,\"a\",\"matMul\"),s=v(e,\"b\",\"matMul\");[n,s]=Re(n,s);let a={a:n,b:s},i={transposeA:t,transposeB:o};return N.runKernel(cn,a,i)}var Xe=T({matMul_:yW});function bW(r,e,t=1,o=0,n=\"int32\"){if(e<2)throw new Error(`Error in oneHot: depth must be >=2, but it is ${e}`);let a={indices:v(r,\"indices\",\"oneHot\",\"int32\")},i={dtype:n,depth:e,onValue:t,offValue:o};return N.runKernel(ca,a,i)}var pl=T({oneHot_:bW});function Tie(){P().set(\"PROD\",!0)}function Nie(){P().set(\"DEBUG\",!0)}function _ie(){P().set(\"DEPRECATION_WARNINGS_ENABLED\",!1),console.warn(\"TensorFlow.js deprecation warnings have been disabled.\")}function sC(r){P().getBool(\"DEPRECATION_WARNINGS_ENABLED\")&&console.warn(r+\" You can disable deprecation warnings with tf.disableDeprecationWarnings().\")}B0(sC);function Eie(){N.disposeVariables()}function cr(){return N}function $ie(){return N.memory()}function Rie(r){return N.profile(r)}function Ne(r,e){return N.tidy(r,e)}function Ft(r){sl(r).forEach(t=>t.dispose())}function So(r){return N.keep(r)}function Aie(r){return N.time(r)}function Fie(r){return N.setBackend(r)}function Die(){return N.ready()}function Pie(){return N.backendName}function Oie(r){N.removeBackend(r)}function Mie(r){return N.findBackend(r)}function Lie(r){return N.findBackendFactory(r)}function pi(r,e,t=1){return N.registerBackend(r,e,t)}function Bie(){return N.backend}function Vie(r,e){P().setPlatform(r,e)}function CW(r){let t={input:v(r,\"input\",\"imag\")};return N.runKernel(Ya,t)}var ci=T({imag_:CW});function IW(r){let t={x:v(r,\"x\",\"neg\")};return N.runKernel(Pn,t)}var yr=T({neg_:IW});function wW(r){let t={input:v(r,\"input\",\"real\")};return N.runKernel(la,t)}var ka=T({real_:wW});function SW(r,e,t){let o=v(r,\"x\",\"transpose\");if(e==null&&(e=o.shape.map((a,i)=>i).reverse()),$(o.rank===e.length,()=>`Error in transpose: rank of input ${o.rank} must match length of perm ${e}.`),e.forEach(a=>{$(a>=0&&a`All entries in 'perm' must be between 0 and ${o.rank-1} but got ${e}`)}),o.rank<=1)return o.clone();let n={x:o},s={perm:e};return o.dtype===\"complex64\"?Ne(()=>{let a=ka(o),i=ci(o);return a=N.runKernel(Mr,{x:a},s),i=N.runKernel(Mr,{x:i},s),t&&(i=yr(i)),Er(a,i)}):N.runKernel(Mr,n,s)}var Wp=T({transpose_:SW});function vW(r,e,t){let o=v(r,\"labels\",\"confusionMatrix\"),n=v(e,\"predictions\",\"confusionMatrix\");$(t==null||t>0&&Number.isInteger(t),()=>`If provided, numClasses must be a positive integer, but got ${t}`),$(o.rank===1,()=>`Expected the rank of labels to be 1, but got ${o.rank}`),$(n.rank===1,()=>`Expected the rank of predictions to be 1, but got ${n.rank}`),$(o.shape[0]===n.shape[0],()=>`Mismatch in the number of examples: ${o.shape[0]} vs. ${n.shape[0]}. Labels and predictions should have the same number of elements.`),$(t>0&&Number.isInteger(t),()=>`numClasses is required to be a positive integer, but got ${t}`);let s=pl(qe(o,\"int32\"),t),a=pl(qe(n,\"int32\"),t),i=Wp(s),p=Xe(i,a);return qe(p,\"int32\")}var bv=T({confusionMatrix_:vW});var br={};Be(br,{assertAndGetBroadcastShape:()=>Je,getBroadcastDims:()=>Iv,getReductionAxes:()=>nf});function Iv(r,e){let t=r.length,o=[];for(let n=0;n1&&a===1&&o.unshift(s)}return o}function nf(r,e){let t=[];for(let o=0;o1)&&t.unshift(s)}return t}function Je(r,e){let t=[],o=Math.max(r.length,e.length);for(let n=0;nRW,fromPixelsAsync:()=>EW,toPixels:()=>$W});function sf(r,e,t){if(eo(r),e!=null&&e.length!==3)throw new Error(\"tensor3d() requires shape to have three numbers\");let o=or(r,t);if(o.length!==3&&o.length!==1)throw new Error(\"tensor3d() requires values to be number[][][] or flat/TypedArray\");if(o.length===1&&e==null)throw new Error(\"tensor3d() requires shape to be provided when `values` are a flat array\");return xr(r,e,o,t)}var su;function wv(r,e=3){if(e>4)throw new Error(\"Cannot construct Tensor with more than 4 channels from pixels.\");if(r==null)throw new Error(\"pixels passed to tf.browser.fromPixels() can not be null\");let t=!1,o=!1,n=!1,s=!1,a=!1,i=!1;if(r.data instanceof Uint8Array)t=!0;else if(typeof ImageData!=\"undefined\"&&r instanceof ImageData)o=!0;else if(typeof HTMLVideoElement!=\"undefined\"&&r instanceof HTMLVideoElement)n=!0;else if(typeof HTMLImageElement!=\"undefined\"&&r instanceof HTMLImageElement)s=!0;else if(r.getContext!=null)a=!0;else if(typeof ImageBitmap!=\"undefined\"&&r instanceof ImageBitmap)i=!0;else throw new Error(`pixels passed to tf.browser.fromPixels() must be either an HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData in browser, or OffscreenCanvas, ImageData in webworker or {data: Uint32Array, width: number, height: number}, but was ${r.constructor.name}`);if(el(Zi,N.backendName)!=null){let d={pixels:r},h={numChannels:e};return N.runKernel(Zi,d,h)}let[u,c]=n?[r.videoWidth,r.videoHeight]:[r.width,r.height],l;if(a)l=r.getContext(\"2d\").getImageData(0,0,u,c).data;else if(o||t)l=r.data;else if(s||n||i){if(su==null)if(typeof document==\"undefined\")if(typeof OffscreenCanvas!=\"undefined\"&&typeof OffscreenCanvasRenderingContext2D!=\"undefined\")su=new OffscreenCanvas(1,1).getContext(\"2d\");else throw new Error(\"Cannot parse input in current context. Reason: OffscreenCanvas Context2D rendering is not supported.\");else su=document.createElement(\"canvas\").getContext(\"2d\",{willReadFrequently:!0});su.canvas.width=u,su.canvas.height=c,su.drawImage(r,0,0,u,c),l=su.getImageData(0,0,u,c).data}let m;if(e===4)m=new Int32Array(l);else{let d=u*c;m=new Int32Array(d*e);for(let h=0;h4||s===2)throw new Error(`toPixels only supports depth of size 1, 3 or 4 but got ${s}`);if(t.dtype!==\"float32\"&&t.dtype!==\"int32\")throw new Error(`Unsupported type for toPixels: ${t.dtype}. Please use float32 or int32 tensors.`);let a=await t.data(),i=t.dtype===\"float32\"?255:1,p=new Uint8ClampedArray(n*o*4);for(let u=0;u1)throw new Error(`Tensor values for a float32 Tensor must be in the range [0 - 1] but encountered ${f}.`)}else if(t.dtype===\"int32\"&&(f<0||f>255))throw new Error(`Tensor values for a int32 Tensor must be in the range [0 - 255] but encountered ${f}.`);s===1?(c[0]=f*i,c[1]=f*i,c[2]=f*i):c[m]=f*i}let l=u*4;p[l+0]=Math.round(c[0]),p[l+1]=Math.round(c[1]),p[l+2]=Math.round(c[2]),p[l+3]=Math.round(c[3])}if(e!=null){e.width=n,e.height=o;let u=e.getContext(\"2d\"),c=new ImageData(p,n,o);u.putImageData(c,0,0)}return t!==r&&t.dispose(),p}var RW=T({fromPixels_:wv});var af={};Be(af,{prepareAndValidate:()=>vv});function vv(r,e){let t=r.shape.length,o=e.shape.length;if(t<1)throw new Error(`tf.gatherND() expects the input to be rank 1 or higher, but the rank was ${t}.`);if(o<1)throw new Error(`tf.gatherND() expects the indices to be rank 1 or higher, but the rank was ${o}.`);if(e.dtype!==\"int32\")throw new Error(`tf.gatherND() expects the indices to be int32 type, but the dtype was ${e.dtype}.`);if(e.shape[o-1]>t)throw new Error(`index innermost dimension length must be <= tensor rank; saw: ${e.shape[o-1]} vs. ${t}`);if(Ve(r.shape)===0)throw new Error(`Requested more than 0 entries, but input is empty. Input shape: ${r.shape}.`);let n=e.shape,s=n[n.length-1],a=1;for(let l=0;ll/u),1].slice(0,s);return[p,a,u,c]}var cl={};Be(cl,{calculateShapes:()=>kv,validateInput:()=>uf,validateUpdateShape:()=>aC});function aC(r,e,t){let o=e.rank>1?e.shape[e.rank-1]:1,n=e.rank>1?e.rank-1:1,s=`Must have updates.shape = indices.shape[:batchDim] + shape[sliceDim:], got updates.shape: ${t.shape}, indices.shape: ${e.shape}, shape: ${r}, sliceDim: ${o}, and batchDim: ${n}.`;if(t.rank1?e.shape[o-1]:1,s=t.length,a=1;for(let l=n;lFW,computeFlatOffset:()=>LW,computeOutShape:()=>PW,getNormalizedAxes:()=>OW,isSliceContinous:()=>MW,maskToAxes:()=>DW,parseSliceParams:()=>BW,sliceInfo:()=>VW,startForAxis:()=>Fv,startIndicesWithElidedDims:()=>$v,stopForAxis:()=>Dv,stopIndicesWithElidedDims:()=>Rv,stridesForAxis:()=>Av,stridesWithElidedDims:()=>Nv});var iC=-2,AW=-1;function FW(r,e,t){let o=r.shape.length;$(o===e.length,()=>`Error in slice${o}D: Length of begin ${e} must match the rank of the array (${o}).`),$(o===t.length,()=>`Error in slice${o}D: Length of size ${t} must match the rank of the array (${o}).`);for(let n=0;n`Error in slice${o}D: begin[${n}] + size[${n}] (${e[n]+t[n]}) would overflow input.shape[${n}] (${r.shape[n]})`)}function DW(r){let e=[],t=0;for(;r>0;)r&1&&e.push(t),r/=2,t++;return e}function PW(r,e,t){let o=[];for(let n=0;n0){let f=e[0],d=t+1;c=$v(a,f,d,o,r),l=Rv(i,f,d,n,r),m=Nv(s,f,d,r)}else for(let f=0;f-1)s[i]=0;else{let p=_v(e,t,i),u=o[p];r&1<-1)s[i]=Number.MAX_SAFE_INTEGER;else{let p=_v(e,t,i),u=o[p];r&1<0?a=Number.MIN_SAFE_INTEGER:a=Number.MAX_SAFE_INTEGER);let p=o[n];return a<0&&(a+=p),a=op(0,a,p-1),a}function Dv(r,e,t,o,n,s){let a=e[n],i=t[n]||1;(r&1<0?a=Number.MAX_SAFE_INTEGER:a=Number.MIN_SAFE_INTEGER);let p=o[n];return a<0&&(a+=p),i>0?a=op(0,a,p):a=op(-1,a,p-1),a}function MW(r,e,t){let o=t.length;for(let n=0;n1){o=n;break}for(let n=o+1;n0||t[n]!==r[n])return!1;return!0}function LW(r,e){let t=r.length>0?r[r.length-1]:1;for(let o=0;o{$(a!==-1,()=>\"slice() does not support negative begin indexing.\")});let s;return t==null?s=new Array(n).fill(-1):typeof t==\"number\"?s=[t,...new Array(n-1).fill(-1)]:t.lengtha>=0?a:($(a===-1,()=>`Negative size values should be exactly -1 but got ${a} for the slice() size at index ${i}.`),r.shape[i]-o[i])),[o,s]}function VW(r,e,t,o,n,s,a,i,p){let u;if(o==null?(u=new Array(e.length),u.fill(1)):u=o,a!=null&&(a&a-1)!==0)throw new Error(\"Multiple ellipses in slice is not allowed.\");let c=!1,l={dims:u.length,numAddAxisAfterEllipsis:0,begin:e.slice(),end:t.slice(),strides:u.slice(),beginMask:n,endMask:s,ellipsisMask:a,newAxisMask:i,shrinkAxisMask:p};for(let C=0;C0?0:-1,m.strides[C]>0?k:k-1];if(w&&m.strides[C]<=0)throw Error(\"only stride 1 allowed on non-range indexing.\");h=h&&m.strides[C]===1;let R=!!(m.beginMask&1<=k)throw Error(`slice index ${m.begin[C]} of dimension ${C} out of bounds.`)}else m.begin[C]=Tv(m.begin[C],0,m.strides[C],k,_,E),m.end[C]=Tv(m.end[C],1,m.strides[C],k,_,E);let O=m.strides[C]===1&&m.begin[C]===0&&m.end[C]===k;f=f&&O,d=d&&(C===0&&m.strides[C]===1||O)}else f=f&&m.strides[C]===1&&R,d=d&&(C===0&&m.strides[C]===1||R);let A,D=!1;if(m.beginValid&&m.endValid?(A=m.end[C]-m.begin[C],D=!0):w?(A=1,D=!0):R&&k>=0&&(m.strides[C]<0?A=-k:A=k,D=!0),D){let O;A===0||A<0!=m.strides[C]<0?O=0:O=Math.trunc(A/m.strides[C])+(A%m.strides[C]!==0?1:0),g.push(O)}else g.push(-1)}for(let C=0;C=0?y.push(g[w]):w===iC&&y.push(1)}return{finalShapeSparse:y.filter((C,w)=>m.finalShapeGatherIndices[w]!==iC),finalShape:y,isIdentity:f,sliceDim0:d,isSimpleSlice:h,begin:m.begin,end:m.end,strides:m.strides}}function zW(r,e){e.beginMask=0,e.endMask=0,e.shrinkAxisMask=0;let t=0;e.beginValid=r.begin!=null,e.endValid=r.end!=null,e.begin=new Array(e.dims),e.end=new Array(e.dims),e.strides=new Array(e.dims),e.finalShapeGatherIndices=[],e.finalShapeGatherIndicesSparse=[],e.inputShapeGatherIndicesSparse=new Array(e.dims);for(let o=0;o0?s[e]:s[e+1&1];{let a=r<0?o+r:r;return as[1]?s[1]:a}}var Pv={};Be(Pv,{Serializable:()=>ll,SerializationMap:()=>Ps,registerClass:()=>$r});var ll=class{getClassName(){return this.constructor.className}static fromConfig(e,t){return new e(t)}},Ps=class{constructor(){this.classNameMap={}}static getMap(){return Ps.instance==null&&(Ps.instance=new Ps),Ps.instance}static register(e){Ps.getMap().classNameMap[e.className]=[e,e.fromConfig]}};function $r(r){$(r.className!=null,()=>\"Class being registered does not have the static className property defined.\"),$(typeof r.className==\"string\",()=>\"className is required to be a string, but got type \"+typeof r.className),$(r.className.length>0,()=>\"Class being registered has an empty-string as its className, which is disallowed.\"),Ps.register(r)}var Bv={};Be(Bv,{TEST_EPSILON_FLOAT16:()=>Ov,createVideoElement:()=>jW,encodeStrings:()=>Lv,expectArrayBuffersEqual:()=>KW,expectArraysClose:()=>UW,expectArraysEqual:()=>HW,expectNumbersClose:()=>Mv,expectPromiseToFail:()=>GW,expectValuesInRange:()=>qW,play:()=>XW,testEpsilon:()=>pf});var WW=.001,Ov=.1;function UW(r,e,t){return t==null&&(t=pf()),uC(r,e,(o,n)=>pC(o,n,t))}function pf(){return N.backend.floatPrecision()===32?WW:Ov}function uC(r,e,t){let o=!0;if((Ut(r)||Ut(e))&&(o=!1),Ut(r)&&Ut(e)&&(o=!0),o){let a=r.constructor.name,i=e.constructor.name;if(a!==i)throw new Error(`Arrays are of different type. Actual: ${a}. Expected: ${i}`)}if(Array.isArray(r)&&Array.isArray(e)){let a=or(r),i=or(e);if(!Or(a,i))throw new Error(`Arrays have different shapes. Actual: [${a}]. Expected: [${i}]`)}let n=Ut(r)?r:on(r),s=Ut(e)?e:on(e);if(n.length!==s.length)throw new Error(`Arrays have different lengths actual: ${n.length} vs expected: ${s.length}.\nActual: ${n}.\nExpected: ${s}.`);for(let a=0;ae.fail(),()=>e()),typeof expect!=\"undefined\"&&expect().nothing()}function HW(r,e){let t=typeof e==\"string\"||typeof e==\"number\"||typeof e==\"boolean\"?[e]:e;return nn(r)||nn(r[0])||nn(e)||nn(e[0])?uC(r,t,(o,n)=>o==n):uC(r,e,(o,n)=>pC(o,n,0))}function Mv(r,e,t){if(t==null&&(t=pf()),!pC(r,e,t))throw new Error(`Numbers differ: actual === ${r}, expected === ${e}`);typeof expect!=\"undefined\"&&expect().nothing()}function pC(r,e,t){return!isFinite(r)&&!isFinite(e)?!0:!(isNaN(r)||isNaN(e)||Math.abs(r-e)>t)}function qW(r,e,t){for(let o=0;ot)throw new Error(`Value out of range:${r[o]} low: ${e}, high: ${t}`)}function KW(r,e){let t=new Float32Array(r),o=new Float32Array(e);if(t.length!==o.length)throw new Error(`Expected ArrayBuffer to be of length ${o.length}, but it was ${t.length}`);for(let n=0;n{e.addEventListener(\"loadeddata\",o=>t(e)),e.load()})}async function XW(r){await r.play(),\"requestVideoFrameCallback\"in r&&await new Promise(e=>{r.requestVideoFrameCallback(e)})}var YW=\"4.0.0\";function QW(r,e){let t=v(r,\"a\",\"add\"),o=v(e,\"b\",\"add\");[t,o]=Re(t,o);let n={a:t,b:o};return N.runKernel(_r,n)}var ge=T({add_:QW});function ZW(r,e){let t=v(r,\"a\",\"floorDiv\"),o=v(e,\"b\",\"floorDiv\");[t,o]=Re(t,o);let n={a:t,b:o};return N.runKernel(vn,n)}var cf=T({floorDiv_:ZW});function JW(r,e){let t=v(r,\"a\",\"div\"),o=v(e,\"b\",\"div\");if([t,o]=Re(t,o),t.dtype===\"int32\"&&o.dtype===\"int32\")return cf(t,o);let n={a:t,b:o},s={};return N.runKernel(Cn,n,s)}var We=T({div_:JW});function eU(r,e){let t=v(r,\"a\",\"mul\"),o=v(e,\"b\",\"mul\");[t,o]=Re(t,o);let n={a:t,b:o};return N.runKernel(ho,n)}var oe=T({mul_:eU});function tU(r){let e=v(r,\"x\",\"abs\");if(e.dtype===\"complex64\"){let t={x:e};return N.runKernel(cp,t)}else{let t={x:e};return N.runKernel(sn,t)}}var Qt=T({abs_:tU});function rU(r){let t={x:v(r,\"x\",\"acos\")};return N.runKernel(Li,t)}var Vv=T({acos_:rU});function oU(r){let t={x:v(r,\"x\",\"acosh\")};return N.runKernel(Bi,t)}var zv=T({acosh_:oU});function nU(r){$(Array.isArray(r),()=>\"The argument passed to tf.addN() must be a list of tensors\"),$(r.length>=1,()=>`Must pass at least one tensor to tf.addN(), but got ${r.length}`);let e=r.map((n,s)=>v(n,`tensors${s}`,\"addN\")),t=e[0];e.forEach(n=>{if(n.dtype!==t.dtype)throw new Error(\"All tensors passed to tf.addN() must have the same dtype\")}),e.forEach(n=>{if(!Or(n.shape,t.shape))throw new Error(\"All tensors passed to tf.addN() must have the same shape\")});let o=e;return N.runKernel(an,o)}var Wv=T({addN_:nU});function sU(r,e=null,t=!1){let n={x:v(r,\"x\",\"all\",\"bool\")},s={axis:e,keepDims:t};return N.runKernel(oa,n,s)}var Uv=T({all_:sU});function aU(r,e=null,t=!1){let n={x:v(r,\"x\",\"any\",\"bool\")},s={axis:e,keepDims:t};return N.runKernel(na,n,s)}var Gv=T({any_:aU});function iU(r,e=0){let o={x:v(r,\"x\",\"argMax\")},n={axis:e};return N.runKernel(un,o,n)}var Hv=T({argMax_:iU});function uU(r,e=0){let o={x:v(r,\"x\",\"argMin\")},n={axis:e};return N.runKernel(ja,o,n)}var qv=T({argMin_:uU});function pU(r){let t={x:v(r,\"x\",\"asin\")};return N.runKernel(Vi,t)}var Kv=T({asin_:pU});function cU(r){let t={x:v(r,\"x\",\"asinh\")};return N.runKernel(zi,t)}var jv=T({asinh_:cU});function lU(r){let t={x:v(r,\"x\",\"atan\")};return N.runKernel(Wi,t)}var Xv=T({atan_:lU});function mU(r,e){let t=v(r,\"a\",\"atan2\"),o=v(e,\"b\",\"atan2\");[t,o]=Re(t,o);let n={a:t,b:o};return N.runKernel(sa,n)}var Yv=T({atan2_:mU});function fU(r){let t={x:v(r,\"x\",\"atanh\")};return N.runKernel(Ui,t)}var Qv=T({atanh_:fU});function dU(r,e,t,o,n=\"NHWC\",s){let a=r[3],i=[...e,a],p=Jv(n);return uu(r,i,t,s,o,null,null,p)}function lC(r,e,t,o,n,s,a=\"channelsLast\"){let[i,p]=lf(e),u;if(a===\"channelsLast\")u=[i,p,r[3],r[3]];else if(a===\"channelsFirst\")u=[i,p,r[1],r[1]];else throw new Error(`Unknown dataFormat ${a}`);return uu(r,u,t,o,n,s,!1,a)}function hU(r,e,t,o,n,s,a=\"NDHWC\"){let[i,p,u]=cC(e),c,l;if(a===\"NDHWC\")l=\"channelsLast\",c=[i,p,u,r[4],r[4]];else if(a===\"NCDHW\")l=\"channelsFirst\",c=[i,p,u,r[1],r[1]];else throw new Error(`Unknown dataFormat ${a}`);return Zv(r,c,t,o,n,!1,l,s)}function uu(r,e,t,o,n,s,a=!1,i=\"channelsLast\"){let[p,u,c,l]=[-1,-1,-1,-1];if(i===\"channelsLast\")[p,u,c,l]=r;else if(i===\"channelsFirst\")[p,l,u,c]=r;else throw new Error(`Unknown dataFormat ${i}`);let[m,f,,d]=e,[h,g]=lf(t),[y,b]=lf(o),C=Up(m,y),w=Up(f,b),{padInfo:k,outHeight:_,outWidth:E}=yU(n,u,c,h,g,C,w,s,i),R=a?d*l:d,A;return i===\"channelsFirst\"?A=[p,R,_,E]:i===\"channelsLast\"&&(A=[p,_,E,R]),{batchSize:p,dataFormat:i,inHeight:u,inWidth:c,inChannels:l,outHeight:_,outWidth:E,outChannels:R,padInfo:k,strideHeight:h,strideWidth:g,filterHeight:m,filterWidth:f,effectiveFilterHeight:C,effectiveFilterWidth:w,dilationHeight:y,dilationWidth:b,inShape:r,outShape:A,filterShape:e}}function Zv(r,e,t,o,n,s=!1,a=\"channelsLast\",i){let[p,u,c,l,m]=[-1,-1,-1,-1,-1];if(a===\"channelsLast\")[p,u,c,l,m]=r;else if(a===\"channelsFirst\")[p,m,u,c,l]=r;else throw new Error(`Unknown dataFormat ${a}`);let[f,d,h,,g]=e,[y,b,C]=cC(t),[w,k,_]=cC(o),E=Up(f,w),R=Up(d,k),A=Up(h,_),{padInfo:D,outDepth:O,outHeight:M,outWidth:L}=bU(n,u,c,l,y,b,C,E,R,A,i),W=s?g*m:g,V;return a===\"channelsFirst\"?V=[p,W,O,M,L]:a===\"channelsLast\"&&(V=[p,O,M,L,W]),{batchSize:p,dataFormat:a,inDepth:u,inHeight:c,inWidth:l,inChannels:m,outDepth:O,outHeight:M,outWidth:L,outChannels:W,padInfo:D,strideDepth:y,strideHeight:b,strideWidth:C,filterDepth:f,filterHeight:d,filterWidth:h,effectiveFilterDepth:E,effectiveFilterHeight:R,effectiveFilterWidth:A,dilationDepth:w,dilationHeight:k,dilationWidth:_,inShape:r,outShape:V,filterShape:e}}function gU(r,e,t,o,n){o==null&&(o=mC(r,e,t));let s=r[0],a=r[1],i=au((s-e+2*o)/t+1,n),p=au((a-e+2*o)/t+1,n);return[i,p]}function xU(r,e,t,o,n,s){n==null&&(n=mC(r,e,o));let a=r[0],i=r[1],p=r[2],u=au((a-e+2*n)/o+1,s),c=au((i-e+2*n)/o+1,s),l=au((p-e+2*n)/o+1,s);return[u,c,l,t]}function mC(r,e,t,o=1){let n=Up(e,o);return Math.floor((r[0]*(t-1)-t+n)/2)}function lf(r){return typeof r==\"number\"?[r,r,r]:r.length===2?[r[0],r[1],1]:r}function cC(r){return typeof r==\"number\"?[r,r,r]:r}function Up(r,e){return e<=1?r:r+(r-1)*(e-1)}function yU(r,e,t,o,n,s,a,i,p){let u,c,l;if(typeof r==\"number\"){u={top:r,bottom:r,left:r,right:r,type:r===0?\"VALID\":\"NUMBER\"};let f=gU([e,t],s,o,r,i);c=f[0],l=f[1]}else if(r===\"same\"){c=Math.ceil(e/o),l=Math.ceil(t/n);let m=Math.max(0,(c-1)*o+s-e),f=Math.max(0,(l-1)*n+a-t),d=Math.floor(m/2),h=m-d,g=Math.floor(f/2),y=f-g;u={top:d,bottom:h,left:g,right:y,type:\"SAME\"}}else if(r===\"valid\")u={top:0,bottom:0,left:0,right:0,type:\"VALID\"},c=Math.ceil((e-s+1)/o),l=Math.ceil((t-a+1)/n);else if(typeof r==\"object\"){let m=p===\"channelsLast\"?r[1][0]:r[2][0],f=p===\"channelsLast\"?r[1][1]:r[2][1],d=p===\"channelsLast\"?r[2][0]:r[3][0],h=p===\"channelsLast\"?r[2][1]:r[3][1];u={top:m,bottom:f,left:d,right:h,type:m===0&&f===0&&d===0&&h===0?\"VALID\":\"EXPLICIT\"},c=au((e-s+m+f)/o+1,i),l=au((t-a+d+h)/n+1,i)}else throw Error(`Unknown padding parameter: ${r}`);return{padInfo:u,outHeight:c,outWidth:l}}function bU(r,e,t,o,n,s,a,i,p,u,c){let l,m,f,d;if(typeof r==\"number\"){l={top:r,bottom:r,left:r,right:r,front:r,back:r,type:r===0?\"VALID\":\"NUMBER\"};let g=xU([e,t,o,1],i,1,n,r,c);m=g[0],f=g[1],d=g[2]}else if(r===\"same\"){m=Math.ceil(e/n),f=Math.ceil(t/s),d=Math.ceil(o/a);let h=(m-1)*n+i-e,g=(f-1)*s+p-t,y=(d-1)*a+u-o,b=Math.floor(h/2),C=h-b,w=Math.floor(g/2),k=g-w,_=Math.floor(y/2),E=y-_;l={top:w,bottom:k,left:_,right:E,front:b,back:C,type:\"SAME\"}}else if(r===\"valid\")l={top:0,bottom:0,left:0,right:0,front:0,back:0,type:\"VALID\"},m=Math.ceil((e-i+1)/n),f=Math.ceil((t-p+1)/s),d=Math.ceil((o-u+1)/a);else throw Error(`Unknown padding parameter: ${r}`);return{padInfo:l,outDepth:m,outHeight:f,outWidth:d}}function au(r,e){if(!e)return Math.trunc(r);switch(e){case\"round\":return Math.round(r);case\"ceil\":return Math.ceil(r);case\"floor\":return Math.floor(r);default:throw new Error(`Unknown roundingMode ${e}`)}}function iu(r){let[e,t,o]=lf(r);return e===1&&t===1&&o===1}function lr(r,e){return iu(r)||iu(e)}function Jv(r){if(r===\"NHWC\")return\"channelsLast\";if(r===\"NCHW\")return\"channelsFirst\";throw new Error(`Unknown dataFormat ${r}`)}function Ot(r,e,t){if(t!=null){if(typeof e==\"string\")throw Error(`Error in ${r}: pad must be an integer when using dimRoundingMode ${t} but got pad ${e}.`);if(typeof e==\"number\")$(ra(e),()=>`Error in ${r}: pad must be an integer when using dimRoundingMode ${t} but got pad ${e}.`);else if(typeof e==\"object\")e.forEach(o=>{o.forEach(n=>{$(ra(n),()=>`Error in ${r}: pad must be an integer when using dimRoundingMode ${t} but got pad ${n}.`)})});else throw Error(`Error in ${r}: Unknown padding parameter: ${e}`)}}function CU(r,e){let o={x:v(r,\"x\",\"reshape\",\"string_or_numeric\")},n={shape:e};return N.runKernel(Ss,o,n)}var z=T({reshape_:CU});function IU(r,e,t,o,n){let s=v(r,\"x\",\"avgPool\",\"float32\"),a=1;$(lr(t,a),()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${t} and dilations '${a}'`);let i=s,p=!1;s.rank===3&&(p=!0,i=z(s,[1,s.shape[0],s.shape[1],s.shape[2]])),$(i.rank===4,()=>`Error in avgPool: x must be rank 4 but got rank ${i.rank}.`),Ot(\"avgPool\",o,n);let u={x:i},c={filterSize:e,strides:t,pad:o,dimRoundingMode:n},l=N.runKernel(pn,u,c);return l=qe(l,s.dtype),p?z(l,[l.shape[1],l.shape[2],l.shape[3]]):l}var mf=T({avgPool_:IU});function wU(r,e,t,o,n,s=\"NDHWC\"){let a=v(r,\"x\",\"avgPool3d\",\"float32\"),i=a,p=!1;a.rank===4&&(p=!0,i=z(a,[1,a.shape[0],a.shape[1],a.shape[2],a.shape[3]])),$(i.rank===5,()=>`Error in avgPool3d: x must be rank 5 but got rank ${i.rank}.`),$(s===\"NDHWC\",()=>`Error in avgPool3d: Only NDHWC is currently supported, but got dataFormat of ${s}`),Ot(\"avgPool3d\",o,n);let u={x:i},c={filterSize:e,strides:t,pad:o,dimRoundingMode:n,dataFormat:s},l=N.runKernel(ip,u,c);return l=qe(l,i.dtype),p?z(l,[l.shape[1],l.shape[2],l.shape[3],l.shape[4]]):l}var ek=T({avgPool3d_:wU});function SU(r,e=0){$(r.length>=1,()=>\"Pass at least one tensor to concat\");let t=Ia(r,\"tensors\",\"concat\",\"string_or_numeric\");if(t[0].dtype===\"complex64\"&&t.forEach(s=>{if(s.dtype!==\"complex64\")throw new Error(`Cannot concatenate complex64 tensors with a tensor\n with dtype ${s.dtype}. `)}),t.length===1)return zr(t[0]);let o=t,n={axis:e};return N.runKernel(gs,o,n)}var gt=T({concat_:SU});function vU(r){let t={x:v(r,\"x\",\"sigmoid\",\"float32\")};return N.runKernel(yo,t)}var Ms=T({sigmoid_:vU});function kU(r,e,t){let o=v(r,\"x\",\"slice\",\"string_or_numeric\");if(o.rank===0)throw new Error(\"Slicing scalar is not possible\");let n={x:o},s={begin:e,size:t};return N.runKernel(qn,n,s)}var Ue=T({slice_:kU});function TU(r){let t={x:v(r,\"x\",\"tanh\",\"float32\")};return N.runKernel(Qn,t)}var ml=T({tanh_:TU});function NU(r,e,t,o,n,s){let a=v(r,\"forgetBias\",\"basicLSTMCell\"),i=v(e,\"lstmKernel\",\"basicLSTMCell\"),p=v(t,\"lstmBias\",\"basicLSTMCell\"),u=v(o,\"data\",\"basicLSTMCell\"),c=v(n,\"c\",\"basicLSTMCell\"),l=v(s,\"h\",\"basicLSTMCell\"),m=gt([u,l],1),f=Xe(m,i),d=ge(f,p),h=d.shape[0],g=d.shape[1]/4,y=[h,g],b=Ue(d,[0,0],y),C=Ue(d,[0,g],y),w=Ue(d,[0,g*2],y),k=Ue(d,[0,g*3],y),_=ge(oe(Ms(b),ml(C)),oe(c,Ms(ge(a,w)))),E=oe(ml(_),Ms(k));return[_,E]}var tk=T({basicLSTMCell_:NU});function _U(r,e,t){let o=v(r,\"x\",\"batchToSpaceND\"),n=e.reduce((i,p)=>i*p);$(o.rank>=1+e.length,()=>`input rank is ${o.rank} but should be > than blockShape.length ${e.length}`),$(t.length===e.length,()=>`crops.length is ${t.length} but should be equal to blockShape.length ${e.length}`),$(o.shape[0]%n===0,()=>`input tensor batch is ${o.shape[0]} but is not divisible by the product of the elements of blockShape ${e.join(\" * \")} === ${n}`);let s={x:o},a={blockShape:e,crops:t};return N.runKernel(hs,s,a)}var ff=T({batchToSpaceND_:_U});function rk(r){let e;return r.rank===0||r.rank===1?e=z(r,[1,1,1,r.size]):r.rank===2?e=z(r,[1,1,r.shape[0],r.shape[1]]):r.rank===3?e=z(r,[1,r.shape[0],r.shape[1],r.shape[2]]):e=r,e}function EU(r,e,t,o,n,s){s==null&&(s=.001);let a=v(r,\"x\",\"batchNorm\"),i=v(e,\"mean\",\"batchNorm\"),p=v(t,\"variance\",\"batchNorm\"),u;n!=null&&(u=v(n,\"scale\",\"batchNorm\"));let c;o!=null&&(c=v(o,\"offset\",\"batchNorm\")),$(i.rank===p.rank,()=>\"Batch normalization gradient requires mean and variance to have equal ranks.\"),$(c==null||i.rank===c.rank,()=>\"Batch normalization gradient requires mean and offset to have equal ranks.\"),$(u==null||i.rank===u.rank,()=>\"Batch normalization gradient requires mean and scale to have equal ranks.\");let m={x:rk(a),scale:u,offset:c,mean:i,variance:p},f={varianceEpsilon:s},d=N.runKernel(kn,m,f);return z(d,a.shape)}var li=T({batchNorm_:EU});function $U(r,e,t,o,n,s){let a=v(r,\"x\",\"batchNorm\"),i=v(e,\"mean\",\"batchNorm\"),p=v(t,\"variance\",\"batchNorm\"),u;n!=null&&(u=v(n,\"scale\",\"batchNorm\"));let c;return o!=null&&(c=v(o,\"offset\",\"batchNorm\")),$(a.rank===2,()=>`Error in batchNorm2D: x must be rank 2 but got rank ${a.rank}.`),$(i.rank===2||i.rank===1,()=>`Error in batchNorm2D: mean must be rank 2 or rank 1 but got rank ${i.rank}.`),$(p.rank===2||p.rank===1,()=>`Error in batchNorm2D: variance must be rank 2 or rank 1 but got rank ${p.rank}.`),u!=null&&$(u.rank===2||u.rank===1,()=>`Error in batchNorm2D: scale must be rank 2 or rank 1 but got rank ${u.rank}.`),c!=null&&$(c.rank===2||c.rank===1,()=>`Error in batchNorm2D: offset must be rank 2 or rank 1 but got rank ${c.rank}.`),li(a,i,p,c,u,s)}var ok=T({batchNorm2d_:$U});function RU(r,e,t,o,n,s){let a=v(r,\"x\",\"batchNorm\"),i=v(e,\"mean\",\"batchNorm\"),p=v(t,\"variance\",\"batchNorm\"),u;n!=null&&(u=v(n,\"scale\",\"batchNorm\"));let c;return o!=null&&(c=v(o,\"offset\",\"batchNorm\")),$(a.rank===3,()=>`Error in batchNorm3D: x must be rank 3 but got rank ${a.rank}.`),$(i.rank===3||i.rank===1,()=>`Error in batchNorm3D: mean must be rank 3 or rank 1 but got rank ${i.rank}.`),$(p.rank===3||p.rank===1,()=>`Error in batchNorm3D: variance must be rank 3 or rank 1 but got rank ${p.rank}.`),u!=null&&$(u.rank===3||u.rank===1,()=>`Error in batchNorm3D: scale must be rank 3 or rank 1 but got rank ${u.rank}.`),c!=null&&$(c.rank===3||c.rank===1,()=>`Error in batchNorm3D: offset must be rank 3 or rank 1 but got rank ${c.rank}.`),li(a,i,p,c,u,s)}var nk=T({batchNorm3d_:RU});function AU(r,e,t,o,n,s){let a=v(r,\"x\",\"batchNorm\"),i=v(e,\"mean\",\"batchNorm\"),p=v(t,\"variance\",\"batchNorm\"),u;n!=null&&(u=v(n,\"scale\",\"batchNorm\"));let c;return o!=null&&(c=v(o,\"offset\",\"batchNorm\")),$(a.rank===4,()=>`Error in batchNorm4D: x must be rank 4 but got rank ${a.rank}.`),$(i.rank===4||i.rank===1,()=>`Error in batchNorm4D: mean must be rank 4 or rank 1 but got rank ${i.rank}.`),$(p.rank===4||p.rank===1,()=>`Error in batchNorm4D: variance must be rank 4 or rank 1 but got rank ${p.rank}.`),u!=null&&$(u.rank===4||u.rank===1,()=>`Error in batchNorm4D: scale must be rank 4 or rank 1 but got rank ${u.rank}.`),c!=null&&$(c.rank===4||c.rank===1,()=>`Error in batchNorm4D: offset must be rank 4 or rank 1 but got rank ${c.rank}.`),li(a,i,p,c,u,s)}var sk=T({batchNorm4d_:AU});function FU(r,e,t){let o=v(r,\"x\",\"bincount\"),n=v(e,\"weights\",\"bincount\");$(o.dtype===\"int32\",()=>`Error in bincount: input dtype must be int32, but got ${o.dtype}`),$(t>=0,()=>`size must be non-negative, but got ${t}.`),$(n.size===o.size||n.size===0,()=>`Error in bincount: weights must have the same size as input or0-length, but got input shape: ${o.shape}, weights shape: ${n.shape}.`);let s={x:o,weights:n},a={size:t};return N.runKernel(up,s,a)}var df=T({bincount_:FU});function DU(r,e){let t=v(r,\"s0\",\"broadcastArgs\",\"int32\"),o=v(e,\"s1\",\"broadcastArgs\",\"int32\");if(t.rank!==1)throw new Error(`broadcastArgs(): first input must be a vector (rank=1). Has rank ${t.rank}`);if(o.rank!==1)throw new Error(`broadcastArgs(): second input must be a vector (rank=1). Has rank ${o.rank}`);let n={s0:t,s1:o};return N.runKernel(pp,n)}var ak=T({broadcastArgs_:DU});function PU(r,e){let t=v(r,\"broadcastTo\",\"x\"),o=t.shape;if(e.some(u=>!(u>0)||u%1!==0))throw new Error(`broadcastTo(): Invalid broadcast shape [${e}].`);if(e.lengtht.rank){let u=t.shape.slice();for(;u.length=0;u--)if(n[u]===e[u])s[u]=1;else if(t.shape[u]!==1)throw new Error(`broadcastTo(): [${o}] cannot be broadcast to [${e}].`);if(s.map((u,c)=>u>1?c:-1).filter(u=>u>=0).length===0)return zr(t);let i={x:t},p={reps:s};return N.runKernel(wo,i,p)}var Ls=T({broadcastTo_:PU});function OU(r){let t={x:v(r,\"x\",\"ceil\",\"float32\")};return N.runKernel(ro,t)}var ik=T({ceil_:OU});function Bs(r,e,t){let o={shape:r,value:e,dtype:t};return N.runKernel(ys,{},o)}function MU(r,e,t){let o=v(r,\"x\",\"clipByValue\");if($(e<=t,()=>`Error in clip: min (${e}) must be less than or equal to max (${t}).`),e===t)return Bs(o.shape,e,o.dtype);let n={x:o},s={clipValueMin:e,clipValueMax:t};return N.runKernel(Ro,n,s)}var uk=T({clipByValue_:MU});function LU(r){return gt(r,0)}var pk=T({concat1d_:LU});function BU(r,e){return gt(r,e)}var ck=T({concat2d_:BU});function VU(r,e){return gt(r,e)}var lk=T({concat3d_:VU});function zU(r,e){return gt(r,e)}var mk=T({concat4d_:zU});function WU(r,e,t,o,n=\"NHWC\",s=[1,1],a){let i=v(r,\"x\",\"conv2d\",\"float32\"),p=v(e,\"filter\",\"conv2d\",\"float32\"),u=i,c=!1;i.rank===3&&(c=!0,u=z(i,[1,i.shape[0],i.shape[1],i.shape[2]])),$(u.rank===4,()=>`Error in conv2d: input must be rank 4, but got rank ${u.rank}.`),$(p.rank===4,()=>`Error in conv2d: filter must be rank 4, but got rank ${p.rank}.`),Ot(\"conv2d\",o,a);let l=n===\"NHWC\"?u.shape[3]:u.shape[1];$(l===p.shape[2],()=>`Error in conv2d: depth of input (${l}) must match input depth for filter ${p.shape[2]}.`),$(lr(t,s),()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${t} and dilations '${s}'`);let m={x:u,filter:p},f={strides:t,pad:o,dataFormat:n,dilations:s,dimRoundingMode:a},d=N.runKernel(ln,m,f);return c?z(d,[d.shape[1],d.shape[2],d.shape[3]]):d}var mi=T({conv2d_:WU});function UU(r,e,t,o,n=\"NWC\",s=1,a){let i=v(r,\"x\",\"conv1d\"),p=v(e,\"filter\",\"conv1d\"),u=i,c=!1;i.rank===2&&(c=!0,u=z(i,[1,i.shape[0],i.shape[1]])),$(u.rank===3,()=>`Error in conv1d: input must be rank 3, but got rank ${u.rank}.`),$(p.rank===3,()=>`Error in conv1d: filter must be rank 3, but got rank ${p.rank}.`),Ot(\"conv1d\",o,a),$(u.shape[2]===p.shape[1],()=>`Error in conv1d: depth of input (${u.shape[2]}) must match input depth for filter ${p.shape[1]}.`),$(lr(t,s),()=>`Error in conv1D: Either stride or dilation must be 1. Got stride ${t} and dilation '${s}'`),$(n===\"NWC\",()=>`Error in conv1d: got dataFormat of ${n} but only NWC is currently supported.`);let l=z(p,[1,p.shape[0],p.shape[1],p.shape[2]]),m=z(u,[u.shape[0],1,u.shape[1],u.shape[2]]),g=mi(m,l,[1,t],o,\"NHWC\",[1,s],a);return c?z(g,[g.shape[2],g.shape[3]]):z(g,[g.shape[0],g.shape[2],g.shape[3]])}var fk=T({conv1d_:UU});function GU(r,e,t,o,n,s=\"NHWC\",a){$(r.length===e.rank,()=>`Length of inShape (${r.length}) and rank of dy (${e.rank}) must match`);let i=r,p=e,u=!1;e.rank===3&&(u=!0,p=z(e,[1,e.shape[0],e.shape[1],e.shape[2]]),i=[1,r[0],r[1],r[2]]),$(i.length===4,()=>`Error in conv2dDerInput: inShape must be length 4, but got length ${i.length}.`),$(p.rank===4,()=>`Error in conv2dDerInput: dy must be rank 4, but got rank ${p.rank}`),$(t.rank===4,()=>`Error in conv2dDerInput: filter must be rank 4, but got rank ${t.rank}`);let c=s===\"NHWC\"?i[3]:i[1],l=s===\"NHWC\"?p.shape[3]:p.shape[1];$(c===t.shape[2],()=>`Error in conv2dDerInput: depth of input (${c}) must match input depth for filter ${t.shape[2]}.`),$(l===t.shape[3],()=>`Error in conv2dDerInput: depth of output (${l}) must match output depth for filter ${t.shape[3]}.`),Ot(\"conv2dDerInput\",n,a);let m={dy:p,filter:t},f={strides:o,pad:n,dataFormat:s,dimRoundingMode:a,inputShape:i},d=N.runKernel(mn,m,f);return u?z(d,[d.shape[1],d.shape[2],d.shape[3]]):d}var hf=T({conv2DBackpropInput_:GU});function HU(r,e,t,o,n,s){let a=v(r,\"x\",\"conv2dTranspose\"),i=v(e,\"filter\",\"conv2dTranspose\");return hf(t,a,i,o,n,\"NHWC\",s)}var dk=T({conv2dTranspose_:HU});function qU(r,e,t,o,n=\"NDHWC\",s=[1,1,1]){let a=v(r,\"x\",\"conv3d\"),i=v(e,\"filter\",\"conv3d\"),p=a,u=!1;a.rank===4&&(u=!0,p=z(a,[1,a.shape[0],a.shape[1],a.shape[2],a.shape[3]])),$(p.rank===5,()=>`Error in conv3d: input must be rank 5, but got rank ${p.rank}.`),$(i.rank===5,()=>`Error in conv3d: filter must be rank 5, but got rank ${i.rank}.`),$(p.shape[4]===i.shape[3],()=>`Error in conv3d: depth of input (${p.shape[4]}) must match input depth for filter ${i.shape[3]}.`),$(lr(t,s),()=>`Error in conv3D: Either strides or dilations must be 1. Got strides ${t} and dilations '${s}'`),$(n===\"NDHWC\",()=>`Error in conv3d: got dataFormat of ${n} but only NDHWC is currently supported.`);let c={x:p,filter:i},l={strides:t,pad:o,dataFormat:n,dilations:s},m=N.runKernel(mp,c,l);return u?z(m,[m.shape[1],m.shape[2],m.shape[3],m.shape[4]]):m}var hk=T({conv3d_:qU});function KU(r,e,t,o,n){$(r.length===e.rank,()=>`Length of inShape (${r.length}) and rank of dy (${e.rank}) must match`);let s=r,a=e,i=!1;e.rank===4&&(i=!0,a=z(e,[1,e.shape[0],e.shape[1],e.shape[2],e.shape[3]]),s=[1,r[0],r[1],r[2],r[3]]);let p=s[4],u=a.shape[4];$(s.length===5,()=>`Error in conv3dDerInput: inShape must be length 5, but got length ${s.length}.`),$(a.rank===5,()=>`Error in conv3dDerInput: dy must be rank 5, but got rank ${a.rank}`),$(t.rank===5,()=>`Error in conv3dDerInput: filter must be rank 5, but got rank ${t.rank}`),$(p===t.shape[3],()=>`Error in conv3dDerInput: depth of input (${p}) must match input depth for filter ${t.shape[3]}.`),$(u===t.shape[4],()=>`Error in conv3dDerInput: depth of output (${u}) must match output depth for filter ${t.shape[4]}.`);let c={dy:a,filter:t},l={pad:n,strides:o,inputShape:s},m=N.runKernel(fp,c,l);return i?z(m,[m.shape[1],m.shape[2],m.shape[3],m.shape[4]]):m}var gk=T({conv3DBackpropInput_:KU});function jU(r,e,t,o,n){let s=v(r,\"x\",\"conv3dTranspose\"),a=v(e,\"filter\",\"conv3dTranspose\");return gk(t,s,a,o,n)}var xk=T({conv3dTranspose_:jU});function XU(r){let t={x:v(r,\"x\",\"cos\",\"float32\")};return N.runKernel(fn,t)}var yk=T({cos_:XU});function YU(r){let t={x:v(r,\"x\",\"cosh\",\"float32\")};return N.runKernel(dn,t)}var bk=T({cosh_:YU});function QU(r,e=0,t=!1,o=!1){let s={x:v(r,\"x\",\"cumprod\")},a={axis:e,exclusive:t,reverse:o};return N.runKernel(hn,s,a)}var Ck=T({cumprod_:QU});function ZU(r,e=0,t=!1,o=!1){let s={x:v(r,\"x\",\"cumsum\")},a={axis:e,exclusive:t,reverse:o};return N.runKernel(gn,s,a)}var Ik=T({cumsum_:ZU});function JU(r,e,t,o=!1){let n=v(r,\"x\",\"denseBincount\"),s=v(e,\"weights\",\"denseBincount\");$(n.dtype===\"int32\",()=>`Error in denseBincount: input dtype must be int32, but got ${n.dtype}`),$(n.rank<=2,()=>`Error in denseBincount: input must be at most rank 2, but got rank ${n.rank}.`),$(t>=0,()=>`size must be non-negative, but got ${t}.`),$(s.size===n.size||s.size===0,()=>`Error in denseBincount: weights must have the same shape as x or 0-length, but got x shape: ${n.shape}, weights shape: ${s.shape}.`);let a={x:n,weights:s},i={size:t,binaryOutput:o};return N.runKernel(dp,a,i)}var wk=T({denseBincount_:JU});function eG(r,e,t=\"NHWC\"){let o=v(r,\"x\",\"depthToSpace\",\"float32\"),n=t===\"NHWC\"?o.shape[1]:o.shape[2],s=t===\"NHWC\"?o.shape[2]:o.shape[3],a=t===\"NHWC\"?o.shape[3]:o.shape[1];$(e>1,()=>`blockSize should be > 1 for depthToSpace, but was: ${e}`),$(n*e>=0,()=>`Negative dimension size caused by overflow when multiplying\n ${n} and ${e} for depthToSpace with input shape\n ${o.shape}`),$(s*e>=0,()=>`Negative dimension size caused by overflow when multiplying\n ${s} and ${e} for depthToSpace with input shape\n ${o.shape}`),$(a%(e*e)===0,()=>`Dimension size must be evenly divisible by ${e*e} but is ${a} for depthToSpace with input shape ${o.shape}`);let i={x:o},p={blockSize:e,dataFormat:t};return N.runKernel(yn,i,p)}var Sk=T({depthToSpace_:eG});function tG(r,e,t,o,n=\"NHWC\",s=[1,1],a){let i=v(r,\"x\",\"depthwiseConv2d\",\"float32\"),p=v(e,\"filter\",\"depthwiseConv2d\",\"float32\"),u=i,c=!1;i.rank===3&&(c=!0,u=z(i,[1,i.shape[0],i.shape[1],i.shape[2]])),$(u.rank===4,()=>`Error in depthwiseConv2d: input must be rank 4, but got rank ${u.rank}.`),$(p.rank===4,()=>`Error in depthwiseConv2d: filter must be rank 4, but got rank ${p.rank}.`);let l=n===\"NHWC\"?u.shape[3]:u.shape[1];$(l===p.shape[2],()=>`Error in depthwiseConv2d: number of input channels (${l}) must match the inChannels dimension in filter ${p.shape[2]}.`),Ot(\"depthwiseConv2d\",o,a);let m={x:u,filter:p},f={strides:t,pad:o,dataFormat:n,dilations:s,dimRoundingMode:a},d=N.runKernel(bn,m,f);return c?z(d,[d.shape[1],d.shape[2],d.shape[3]]):d}var Gp=T({depthwiseConv2d_:tG});function rG(r){let t={x:v(r,\"x\",\"diag\")};return N.runKernel(xp,t)}var vk=T({diag_:rG});function oG(r,e,t,o,n=[1,1],s=\"NHWC\"){let a=v(r,\"x\",\"dilation2d\"),i=v(e,\"filter\",\"dilation2d\");$(a.rank===3||a.rank===4,()=>`Error in dilation2d: input must be rank 3 or 4, but got rank ${a.rank}.`),$(i.rank===3,()=>`Error in dilation2d: filter must be rank 3, but got rank ${i.rank}.`),$(s===\"NHWC\",()=>`Error in dilation2d: Only NHWC is currently supported, but got dataFormat of ${s}`);let p=a,u=!1;a.rank===3&&(p=z(a,[1,a.shape[0],a.shape[1],a.shape[2]]),u=!0);let c={x:p,filter:i},l={strides:t,pad:o,dilations:n},m=N.runKernel(yp,c,l);return u?z(m,[m.shape[1],m.shape[2],m.shape[3]]):m}var kk=T({dilation2d_:oG});function nG(r,e){let t=v(r,\"a\",\"equal\",\"string_or_numeric\"),o=v(e,\"b\",\"equal\",\"string_or_numeric\");[t,o]=Re(t,o),Je(t.shape,o.shape);let n={a:t,b:o};return N.runKernel(oo,n)}var gf=T({equal_:nG});function sG(r,e,t){let o=v(e,\"a\",\"where\"),n=v(t,\"b\",\"where\"),s=v(r,\"condition\",\"where\",\"bool\"),a=Je(Je(s.shape,o.shape),n.shape),i=Ls(s,a),p=Ls(o,a),u=Ls(n,a),c={condition:i,t:p,e:u};return N.runKernel(vs,c)}var os=T({where_:sG});function aG(r){let t={x:v(r,\"x\",\"zerosLike\")};return N.runKernel(Es,t)}var Gt=T({zerosLike_:aG});function iG(r,e){let t=v(r,\"a\",\"div\"),o=v(e,\"b\",\"div\");[t,o]=Re(t,o);let n=We(t,o),s=Gt(n),a=gf(o,s);return os(a,s,n)}var Tk=T({divNoNan_:iG});function uG(r,e){let t=v(r,\"t1\",\"dot\"),o=v(e,\"t2\",\"dot\");$((t.rank===1||t.rank===2)&&(o.rank===1||o.rank===2),()=>`Error in dot: inputs must all be rank 1 or 2, but got ranks ${t.rank} and ${o.rank}.`);let n=t.rank===1?t.size:t.shape[1],s=o.rank===1?o.size:o.shape[0];if($(n===s,()=>`Error in dot: inner dimensions of inputs must match, but got ${n} and ${s}.`),t.rank===1&&o.rank===1){let a=z(t,[1,-1]),i=z(o,[-1,1]),p=Xe(a,i);return z(p,[])}else if(t.rank===1&&o.rank===2){let a=z(t,[1,-1]),i=z(o,[o.shape[0],o.shape[1]]),p=Xe(a,i);return z(p,[p.size])}else if(t.rank===2&&o.rank===1){let a=z(o,[-1,1]),i=Xe(t,a);return z(i,[i.size])}else{let a=z(o,[o.shape[0],o.shape[1]]);return Xe(t,a)}}var Nk=T({dot_:uG});function pG(r,...e){let t=e.map((n,s)=>v(n,`tensors${s}`,\"einsum\")),o={equation:r};return N.runKernel(Xa,t,o)}var _k=T({einsum_:pG});function cG(r){let t={x:v(r,\"x\",\"elu\",\"float32\")};return N.runKernel(In,t)}var xf=T({elu_:cG});function lG(r){let e=v(r,\"x\",\"erf\");$(e.dtype===\"int32\"||e.dtype===\"float32\",()=>\"Input dtype must be `int32` or `float32`.\"),e.dtype===\"int32\"&&(e=qe(e,\"float32\"));let t={x:e};return N.runKernel(Gi,t)}var Ek=T({erf_:lG});function fC(r,e){for(let t=0;tr[s]);return[t,n]}function Ta(r,e){let t=e.map(o=>1);return $k(r,t,e)}function fG(r,e,t){$(fC(e,t),()=>`${r} supports only inner-most axes for now. Got axes ${e} and rank-${t} input.`)}function dG(r,e){if(fC(r,e))return null;let t=[];for(let o=0;ot.push(o)),t}function hG(r){return r.map((e,t)=>[t,e]).sort((e,t)=>e[1]-t[1]).map(e=>e[0])}function gG(r,e){let t=[];for(let o=e-r;o\"Axis must be <= rank of the tensor\");let o={input:t},n={dim:e};return N.runKernel(xs,o,n)}var _a=T({expandDims_:NG});function _G(r){let t={x:v(r,\"x\",\"expm1\")};return N.runKernel(wn,t)}var Fk=T({expm1_:_G});function EG(r,e){let t=v(r,\"x\",\"tile\",\"string_or_numeric\");$(t.rank===e.length,()=>`Error in transpose: rank of input ${t.rank} must match length of reps ${e}.`);let o={x:t},n={reps:e};return N.runKernel(wo,o,n)}var fi=T({tile_:EG});function $G(r,e,t,o=\"float32\"){e==null&&(e=r);let n=ne([r,e],o),s=r<=e?r:e;for(let i=0;i`Error in localResponseNormalization: x must be rank 3 or 4 but got\n rank ${s.rank}.`),$(ra(e),()=>`Error in localResponseNormalization: depthRadius must be an integer but got depthRadius ${e}.`);let a=s,i=!1;s.rank===3&&(i=!0,a=z(s,[1,s.shape[0],s.shape[1],s.shape[2]]));let p={x:a},u={depthRadius:e,bias:t,alpha:o,beta:n},c=N.runKernel(wp,p,u);return i?z(c,[c.shape[1],c.shape[2],c.shape[3]]):c}var Bk=T({localResponseNormalization_:zG});function WG(r){let t={x:v(r,\"x\",\"log\",\"float32\")};return N.runKernel(lo,t)}var Ea=T({log_:WG});function UG(r){let t={x:v(r,\"x\",\"log1p\")};return N.runKernel(Ki,t)}var Sf=T({log1p_:UG});function GG(r){return $(fs(r),()=>\"The f passed in grad(f) must be a function\"),(e,t)=>{let o=v(e,\"x\",\"tf.grad\",\"string_or_numeric\"),n=t!=null?v(t,\"dy\",\"tf.grad\"):null;return N.tidy(()=>{let{value:s,grads:a}=N.gradients(()=>r(o),[o],n);return n!=null&&ht(s.shape,n.shape,\"The shape of dy passed in grad(f)(x, dy) must match the shape returned by f(x)\"),vf(a),a[0]})}}function HG(r){return $(fs(r),()=>\"The f passed in grads(f) must be a function\"),(e,t)=>{$(Array.isArray(e),()=>\"The args passed in grads(f)(args) must be an array of `Tensor`s or `TensorLike`s\");let o=Ia(e,\"args\",\"tf.grads\",\"string_or_numeric\"),n=t!=null?v(t,\"dy\",\"tf.grads\"):null;return N.tidy(()=>{let{value:s,grads:a}=N.gradients(()=>r(...o),o,n);return n!=null&&ht(s.shape,n.shape,\"The shape of dy passed in grads(f)([x1,...], dy) must match the shape returned by f([x1,...])\"),vf(a),a})}}function qG(r){return $(fs(r),()=>\"The f passed in valueAndGrad(f) must be a function\"),(e,t)=>{$(e instanceof ut,()=>\"The x passed in valueAndGrad(f)(x) must be a tensor\"),$(t==null||t instanceof ut,()=>\"The dy passed in valueAndGrad(f)(x, dy) must be a tensor\");let{grads:o,value:n}=N.gradients(()=>r(e),[e],t);return vf(o),{grad:o[0],value:n}}}function KG(r){return $(fs(r),()=>\"The f passed in valueAndGrads(f) must be a function\"),(e,t)=>{$(Array.isArray(e)&&e.every(n=>n instanceof ut),()=>\"The args passed in valueAndGrads(f)(args) must be array of tensors\"),$(t==null||t instanceof ut,()=>\"The dy passed in valueAndGrads(f)(args, dy) must be a tensor\");let o=N.gradients(()=>r(...e),e,t);return t!=null&&ht(o.value.shape,t.shape,\"The shape of dy passed in valueAndGrads(f)([x1,...], dy) must match the shape returned by f([x1,...])\"),vf(o.grads),o}}function dC(r,e){$(fs(r),()=>\"The f passed in variableGrads(f) must be a function\"),$(e==null||Array.isArray(e)&&e.every(u=>u instanceof ba),()=>\"The varList passed in variableGrads(f, varList) must be an array of variables\");let t=e!=null;if(!t){e=[];for(let u in N.registeredVariables)e.push(N.registeredVariables[u])}let o=t?e.filter(u=>!u.trainable):null,n=e.length;e=e.filter(u=>u.trainable),$(e.length>0,()=>`variableGrads() expects at least one of the input variables to be trainable, but none of the ${n} variables is trainable.`);let s=!0,{value:a,grads:i}=N.gradients(r,e,null,s);$(i.some(u=>u!=null),()=>\"Cannot find a connection between any variable and the result of the loss function y=f(x). Please make sure the operations that use variables are inside the function f passed to minimize().\"),$(a.rank===0,()=>`The f passed in variableGrads(f) must return a scalar, but it returned a rank-${a.rank} tensor`);let p={};return e.forEach((u,c)=>{i[c]!=null&&(p[u.name]=i[c])}),o!=null&&o.forEach(u=>p[u.name]=null),{value:a,grads:p}}function Cr(r){return N.customGrad(r)}function vf(r){if(r.filter(t=>t==null).length>0)throw new Error(`Cannot compute gradient of y=f(x) with respect to x. Make sure that\n the f you passed encloses all operations that lead from x to y.`)}function jG(r){let t={x:v(r,\"x\",\"softplus\")};return N.runKernel(Qi,t)}var kf=T({softplus_:jG});function XG(r){let e=v(r,\"x\",\"logSigmoid\");return Cr(o=>({value:yr(kf(yr(o))),gradFunc:a=>oe(a,Ms(yr(o)))}))(e)}var Vk=T({logSigmoid_:XG});function YG(r,e){let t=v(r,\"a\",\"sub\"),o=v(e,\"b\",\"sub\");[t,o]=Re(t,o);let n={a:t,b:o};return N.runKernel(Io,n)}var ke=T({sub_:YG});function QG(r,e=-1){let t=v(r,\"logits\",\"logSoftmax\");if(e===-1&&(e=t.rank-1),e!==t.rank-1)throw Error(`Log Softmax along a non-last dimension is not yet supported. Logits was rank ${t.rank} and axis was ${e}`);return Cr((n,s)=>{let i=Vs(n,e,!0),p=ke(n,i),u=ke(qe(p,\"float32\"),Ea(tt(Bo(p),e,!0)));return s([u]),{value:u,gradFunc:(l,m)=>{let[f]=m,d=!0,h=Bo(f);return ke(l,oe(tt(l,e,d),h))}}})(t)}var zk=T({logSoftmax_:QG});function ZG(r,e=null,t=!1){let o=v(r,\"x\",\"logSumExp\"),n=Ka(e,o.shape),s=Vs(o,n,!0),a=ke(o,s),i=Bo(a),p=tt(i,n),u=Ea(p),c=ge(z(s,u.shape),u);if(t){let l=Ta(c.shape,n);return z(c,l)}return c}var Tf=T({logSumExp_:ZG});function JG(r,e){let t=v(r,\"a\",\"logicalAnd\",\"bool\"),o=v(e,\"b\",\"logicalAnd\",\"bool\");Je(t.shape,o.shape);let n={a:t,b:o};return N.runKernel(_n,n)}var lu=T({logicalAnd_:JG});function e4(r){let t={x:v(r,\"x\",\"logicalNot\",\"bool\")};return N.runKernel(En,t)}var Nf=T({logicalNot_:e4});function t4(r,e){let t=v(r,\"a\",\"logicalOr\",\"bool\"),o=v(e,\"b\",\"logicalOr\",\"bool\");Je(t.shape,o.shape);let n={a:t,b:o};return N.runKernel(ua,n)}var _f=T({logicalOr_:t4});function r4(r,e){let t=v(r,\"a\",\"logicalXor\",\"bool\"),o=v(e,\"b\",\"logicalXor\",\"bool\");return Je(t.shape,o.shape),lu(_f(r,e),Nf(lu(r,e)))}var Wk=T({logicalXor_:r4});var Ef=2147483648;function o4(r,e,t=\"left\"){let o=v(r,\"sortedSequence\",\"searchSorted\"),n=v(e,\"values\",\"searchSorted\"),s=o.shape[o.shape.length-1],a=n.shape[n.shape.length-1],i=z(o,[-1,s]),p=z(n,[-1,a]);if(i.rank<2)throw new Error(\"Sorted input argument must be at least 2-dimensional\");if(i.shape[0]!==p.shape[0])throw new Error(\"Leading dimension of 'sortedSequence' and 'values' must match.\");if(Ve(p.shape)>=Ef)throw new Error(`values tensor size must less than ${Ef}`);if(i.shape[1]>=Ef)throw new Error(`trailing dim_size must less than ${Ef} for int32 output type, was ${i.shape[1]}`);let u={sortedSequence:i,values:p},c={side:t};return N.runKernel(Ep,u,c)}var dl=T({searchSorted_:o4});function Uk(r,e){return dl(r,e,\"left\")}function n4(r,e,t,o,n){let s=v(r,\"x\",\"maxPool\"),a=1,i=s,p=!1;s.rank===3&&(p=!0,i=z(s,[1,s.shape[0],s.shape[1],s.shape[2]])),$(i.rank===4,()=>`Error in maxPool: input must be rank 4 but got rank ${i.rank}.`),$(lr(t,a),()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${t} and dilations '${a}'`),Ot(\"maxPool\",o,n);let u={x:i},c={filterSize:e,strides:t,pad:o,dimRoundingMode:n},l=N.runKernel(Rn,u,c);return p?z(l,[l.shape[1],l.shape[2],l.shape[3]]):l}var $f=T({maxPool_:n4});function s4(r,e=[1,1,1],t,o,n,s=\"NDHWC\"){let a=v(r,\"x\",\"maxPool3d\"),i=a,p=!1;a.rank===4&&(p=!0,i=z(a,[1,a.shape[0],a.shape[1],a.shape[2],a.shape[3]])),$(i.rank===5,()=>`Error in maxPool3d: x must be rank 5 but got rank ${i.rank}.`),$(s===\"NDHWC\",()=>`Error in maxPool3d: Only NDHWC is currently supported, but got dataFormat of ${s}`),Ot(\"maxPool3d\",o,n);let u={x:i},c={filterSize:e,strides:t,pad:o,dimRoundingMode:n,dataFormat:s},l=N.runKernel(Sp,u,c);return p?z(l,[l.shape[1],l.shape[2],l.shape[3],l.shape[4]]):l}var Gk=T({maxPool3d_:s4});function a4(r,e,t,o,n=!1){let a={x:v(r,\"x\",\"maxPoolWithArgmax\")},i={filterSize:e,strides:t,pad:o,includeBatchInIndex:n},p=N.runKernel(vp,a,i);return{result:p[0],indexes:p[1]}}var Hk=T({maxPoolWithArgmax_:a4});function i4(r,e){let t=v(r,\"a\",\"maximum\"),o=v(e,\"b\",\"maximum\");[t,o]=Re(t,o),t.dtype===\"bool\"&&(t=qe(t,\"int32\"),o=qe(o,\"int32\")),Je(t.shape,o.shape);let n={a:t,b:o};return N.runKernel(mo,n)}var Rf=T({maximum_:i4});function u4(r,e=null,t=!1){let n={x:v(r,\"x\",\"mean\")},s={axis:e,keepDims:t};return N.runKernel(An,n,s)}var mu=T({mean_:u4});function Wr(r,e=\"float32\"){if(e===\"complex64\"){let o=Wr(r,\"float32\"),n=Wr(r,\"float32\");return Er(o,n)}let t=ap(Ve(r),e);return N.makeTensor(t,r,e)}function zs(r,e=\"float32\"){if(e===\"complex64\"){let o=zs(r,\"float32\"),n=Wr(r,\"float32\");return Er(o,n)}let t=jc(Ve(r),e);return N.makeTensor(t,r,e)}function qk(r,e,{indexing:t=\"xy\"}={}){if(t!==\"xy\"&&t!==\"ij\")throw new TypeError(`${t} is not a valid third argument to meshgrid`);if(r===void 0)return[];let o=v(r,\"x\",\"meshgrid\",r instanceof ut?r.dtype:\"float32\");if(e===void 0)return[o];let n=v(e,\"y\",\"meshgrid\",e instanceof ut?e.dtype:\"float32\"),s=Ve(o.shape),a=Ve(n.shape);return t===\"xy\"?(o=z(o,[1,-1]),n=z(n,[-1,1]),[Xe(zs([a,1],o.dtype),o),Xe(n,zs([1,s],n.dtype))]):(o=z(o,[-1,1]),n=z(n,[1,-1]),[Xe(o,zs([1,a],o.dtype)),Xe(zs([s,1],n.dtype),n)])}function p4(r,e){let t=v(r,\"a\",\"minimum\"),o=v(e,\"b\",\"minimum\");[t,o]=Re(t,o),t.dtype===\"bool\"&&(t=qe(t,\"int32\"),o=qe(o,\"int32\")),Je(t.shape,o.shape);let n={a:t,b:o};return N.runKernel(fo,n)}var Af=T({minimum_:p4});function c4(r,e,t){$(t===\"reflect\"||t===\"symmetric\",()=>`Invalid mode. Mode must be either reflect or symmetric. Got ${t}.`);let o=v(r,\"x\",\"mirrorPad\");if(o.rank===0)throw new Error(\"mirrorPad(scalar) is not defined. Pass non-scalar to mirrorPad\");$(e.length===o.rank,()=>`Padding doesn't match input. Must be ${o.rank}. Got ${e.length}.`);let n=t===\"reflect\"?1:0;for(let i=0;i\"Invalid number of paddings. Must be length of 2 each.\"),$(e[i][0]>=0&&e[i][0]<=o.shape[i]-n&&e[i][1]>=0&&e[i][1]<=o.shape[i]-n,()=>`Padding in dimension ${i} cannot be greater than or equal to ${o.shape[i]-n} or less than 0 for input of shape ${o.shape}`);let s={paddings:e,mode:t},a={x:o};return N.runKernel(Dn,a,s)}var Kk=T({mirrorPad_:c4});function l4(r,e){let t=v(r,\"a\",\"mod\"),o=v(e,\"b\",\"mod\");[t,o]=Re(t,o);let n={a:t,b:o};return N.runKernel(ji,n)}var jk=T({mod_:l4});function m4(r,e=null,t=!1){r=v(r,\"x\",\"moments\");let o=Ka(e,r.shape),n=mu(r,o,t),s=n.shape;t||(s=Ta(n.shape,o));let a=Zt(ke(qe(r,\"float32\"),z(n,s))),i=mu(a,o,t);return{mean:n,variance:i}}var Xk=T({moments_:m4});function f4(r,e,t,o){let n=v(e,\"data\",\"multiRNNCell\"),s=Ia(t,\"c\",\"multiRNNCell\"),a=Ia(o,\"h\",\"multiRNNCell\"),i=n,p=[];for(let l=0;l2)throw new Error(`Rank of probabilities must be 1 or 2, but is ${a}`);t=t||Math.random();let p={logits:a===1?z(n,[1,-1]):n},u={numSamples:e,seed:t,normalized:o},c=N.runKernel(kp,p,u);return a===1?z(c,[c.size]):c}var Qk=T({multinomial_:d4});function h4(r,e){let t=v(r,\"a\",\"notEqual\",\"string_or_numeric\"),o=v(e,\"b\",\"notEqual\",\"string_or_numeric\");[t,o]=Re(t,o),Je(t.shape,o.shape);let n={a:t,b:o};return N.runKernel(go,n)}var Ff=T({notEqual_:h4});function g4(r){let t={x:v(r,\"x\",\"onesLike\")};return N.runKernel(Cs,t)}var Zk=T({onesLike_:g4});function x4(r,e){let t=v(r,\"v1\",\"outerProduct\"),o=v(e,\"v2\",\"outerProduct\");$(t.rank===1&&o.rank===1,()=>`Error in outerProduct: inputs must be rank 1, but got ranks ${t.rank} and ${o.rank}.`);let n=z(t,[-1,1]),s=z(o,[1,-1]);return Xe(n,s)}var Jk=T({outerProduct_:x4});function y4(r,e,t=0){let o=v(r,\"x\",\"pad\");if(o.rank===0)throw new Error(\"pad(scalar) is not defined. Pass non-scalar to pad\");let n={paddings:e,constantValue:t},s={x:o};return N.runKernel(Ln,s,n)}var Ws=T({pad_:y4});function b4(r,e,t=0){return $(e.length===2,()=>\"Invalid number of paddings. Must be length of 2.\"),Ws(r,[e],t)}var e1=T({pad1d_:b4});function C4(r,e,t=0){return $(e.length===2&&e[0].length===2&&e[1].length===2,()=>\"Invalid number of paddings. Must be length of 2 each.\"),Ws(r,e,t)}var t1=T({pad2d_:C4});function I4(r,e,t=0){return $(e.length===3&&e[0].length===2&&e[1].length===2&&e[2].length===2,()=>\"Invalid number of paddings. Must be length of 2 each.\"),Ws(r,e,t)}var r1=T({pad3d_:I4});function w4(r,e,t=0){return $(e.length===4&&e[0].length===2&&e[1].length===2&&e[2].length===2&&e[3].length===2,()=>\"Invalid number of paddings. Must be length of 2 each.\"),Ws(r,e,t)}var o1=T({pad4d_:w4});function S4(r,e,t){let o=v(r,\"x\",\"spaceToBatchND\");$(o.rank>=1+e.length,()=>`input rank ${o.rank} should be > than [blockShape] ${e.length}`),$(t.length===e.length,()=>`paddings.shape[0] ${t.length} must be equal to [blockShape] ${e.length}`),$(o.shape.reduce((a,i,p)=>p>0&&p<=e.length?a&&(i+t[p-1][0]+t[p-1][1])%e[p-1]===0:a,!0),()=>`input spatial dimensions ${o.shape.slice(1)} with paddings ${t.toString()} must be divisible by blockShapes ${e.toString()}`);let n={x:o},s={blockShape:e,paddings:t};return N.runKernel(ks,n,s)}var Df=T({spaceToBatchND_:S4});function v4(r,e,t,o,n,s,a){n==null&&(n=[1,1]),s==null&&(s=1),o===0&&(o=\"valid\");let i=v(r,\"x\",\"maxPool\"),p=i,u=!1;i.rank===3&&(u=!0,p=z(i,[1,i.shape[0],i.shape[1],i.shape[2]])),$(lr(s,n),()=>`Error in pool: Either strides or dilations must be 1. Got strides ${s} and dilations '${n}'`);let c=lC(p.shape,e,s,n,o),l=[c.dilationHeight,c.dilationWidth],m;o===\"same\"?m=T4([c.filterHeight,c.filterWidth],l):m=[[0,0],[0,0]];let f=l[0]===1&&l[1]===1,[d,h]=k4([c.inHeight,c.inWidth],l,m),g=f?o:\"valid\",y=f?p:Df(p,l,d),C=(t===\"avg\"?()=>mf(y,e,s,g,a):()=>$f(y,e,s,g,a))(),w=f?C:ff(C,l,h);return u?z(w,[w.shape[1],w.shape[2],w.shape[3]]):w}function k4(r,e,t){let o=t.map(c=>c[0]),n=t.map(c=>c[1]),s=r.concat(o,n),a=e.map((c,l)=>(c-s[l]%c)%c),i=n.map((c,l)=>c+a[l]),p=e.map((c,l)=>[o[l],i[l]]),u=e.map((c,l)=>[0,a[l]]);return[p,u]}function T4(r,e){let o=r.map((a,i)=>a+(a-1)*(e[i]-1)).map(a=>a-1),n=o.map(a=>Math.floor(a/2)),s=o.map((a,i)=>a-n[i]);return o.map((a,i)=>[n[i],s[i]])}var n1=T({pool_:v4});function N4(r,e){let t=v(r,\"x\",\"prelu\"),o=v(e,\"alpha\",\"prelu\"),n={x:t,alpha:o};return N.runKernel(Vn,n)}var Pf=T({prelu_:N4});function _4(r,e=null,t=!1){let o=v(r,\"x\",\"prod\");o.dtype===\"bool\"&&(o=qe(o,\"int32\"));let n={x:o},s={axis:e,keepDims:t};return N.runKernel(Ao,n,s)}var s1=T({prod_:_4});function E4(r,e,t,o){let n=r.map((c,l)=>v(c,`tensors${l}`,\"raggedGather\",\"int32\")),s=v(e,\"paramsDenseValues\",\"raggedGather\"),a=v(t,\"indices\",\"raggedGather\",\"int32\"),i={paramsNestedSplits:n,paramsDenseValues:s,indices:a},p={outputRaggedRank:o},u=N.runKernel(Tp,i,p);return{outputNestedSplits:u.slice(0,u.length-1),outputDenseValues:u[u.length-1]}}var a1=T({raggedGather_:E4});function $4(r,e,t){let o=v(r,\"starts\",\"raggedRange\"),n=v(e,\"limits\",\"raggedRange\",o.dtype),s=v(t,\"deltas\",\"raggedRange\",o.dtype),a={starts:o,limits:n,deltas:s},i=N.runKernel(Np,a);return{rtNestedSplits:i[0],rtDenseValues:i[1]}}var i1=T({raggedRange_:$4});function R4(r,e,t,o,n){let s=v(r,\"shape\",\"raggedTensorToTensor\",\"int32\"),a=v(e,\"values\",\"raggedTensorToTensor\"),i=v(t,\"defaultValue\",\"raggedTensorToTensor\",a.dtype),p=o.map((l,m)=>v(l,`tensors${m}`,\"raggedTensorToTensor\",\"int32\")),u={shape:s,values:a,defaultValue:i,rowPartitionTensors:p},c={rowPartitionTypes:n};return N.runKernel(_p,u,c)}var u1=T({raggedTensorToTensor_:R4});function A4(r,e,t){let o=Ve(r),n=null;if(t==null||t===\"float32\")n=new Float32Array(o);else if(t===\"int32\")n=new Int32Array(o);else if(t===\"bool\")n=new Uint8Array(o);else throw new Error(`Unknown data type ${t}`);for(let s=0;s=1||a===0);let i=Math.sqrt(-2*Math.log(a)/a);e=this.mean+this.stdDev*n*i,t=this.mean+this.stdDev*s*i,(!this.truncated||this.isValidTruncated(e))&&(o=!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}},Mf=class{constructor(e,t,o,n){this.alpha=e,this.beta=1/t,this.dtype=o;let s=n||Math.random();this.randu=Bf.alea(s.toString()),this.randn=new du(0,1,o,!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,o,n,s,a;for(;;){do n=this.randn.nextValue(),a=1+this.c*n;while(a<=0);if(a*=a*a,e=n*n,t=1-.331*e*e,o=.5*e+this.d*(1-a+Math.log(a)),s=this.randu(),sthis.dtype==null||this.dtype===\"float32\",this.min=e,this.range=t-e,this.dtype=o,n==null&&(n=Math.random()),typeof n==\"number\"&&(n=n.toString()),!this.canReturnFloat()&&this.range<=1)throw new Error(`The difference between ${e} - ${t} <= 1 and dtype is not float`);this.random=Bf.alea(n)}convertValue(e){return this.canReturnFloat()?e:Math.round(e)}nextValue(){return this.convertValue(this.min+this.range*this.random())}};function B4(r,e,t=1,o=\"float32\",n){if(t==null&&(t=1),o==null&&(o=\"float32\"),o!==\"float32\"&&o!==\"int32\")throw new Error(`Unsupported data type ${o}`);let s=new Mf(e,t,o,n),a=ne(r,o);for(let i=0;i`Error in reverse1D: x must be rank 1 but got rank ${e.rank}.`),vo(e,0)}var E1=T({reverse1d_:K4});function j4(r,e){let t=v(r,\"x\",\"reverse\");return $(t.rank===2,()=>`Error in reverse2D: x must be rank 2 but got rank ${t.rank}.`),vo(t,e)}var $1=T({reverse2d_:j4});function X4(r,e){let t=v(r,\"x\",\"reverse\");return $(t.rank===3,()=>`Error in reverse3D: x must be rank 3 but got rank ${t.rank}.`),vo(t,e)}var R1=T({reverse3d_:X4});function Y4(r,e){let t=v(r,\"x\",\"reverse\");return $(t.rank===4,()=>`Error in reverse4D: x must be rank 4 but got rank ${t.rank}.`),vo(t,e)}var A1=T({reverse4d_:Y4});function Q4(r){let t={x:v(r,\"x\",\"round\")};return N.runKernel(da,t)}var Uf=T({round_:Q4});function Z4(r){let t={x:v(r,\"x\",\"rsqrt\",\"float32\")};return N.runKernel(xo,t)}var F1=T({rsqrt_:Z4});function J4(r){let t={x:v(r,\"x\",\"selu\")};return N.runKernel(Xi,t)}var D1=T({selu_:J4});function eH(r,e,t,o,n,s=[1,1],a=\"NHWC\"){let i=v(r,\"x\",\"separableConv2d\"),p=v(e,\"depthwiseFilter\",\"separableConv2d\"),u=v(t,\"pointwiseFilter\",\"separableConv2d\"),c=i,l=!1;if(i.rank===3&&(l=!0,c=z(i,[1,i.shape[0],i.shape[1],i.shape[2]])),a===\"NCHW\")throw new Error(\"separableConv2d currently does not support dataFormat NCHW; only NHWC is supported\");$(c.rank===4,()=>`Error in separableConv2d: input must be rank 4, but got rank ${c.rank}.`),$(p.rank===4,()=>`Error in separableConv2d: depthwise filter must be rank 4, but got rank ${p.rank}.`),$(u.rank===4,()=>`Error in separableConv2d: pointwise filter must be rank 4, but got rank ${p.rank}.`),$(u.shape[0]===1,()=>`Error in separableConv2d: the first dimension of pointwise filter must be 1, but got ${u.shape[0]}.`),$(u.shape[1]===1,()=>`Error in separableConv2d: the second dimension of pointwise filter must be 1, but got ${u.shape[1]}.`);let m=p.shape[2],f=p.shape[3];$(u.shape[2]===m*f,()=>`Error in separableConv2d: the third dimension of pointwise filter must be ${m*f}, but got ${u.shape[2]}.`);let d=Gp(c,p,o,n,a,s),g=mi(d,u,1,\"valid\",a);return l?z(g,[g.shape[1],g.shape[2],g.shape[3]]):g}var P1=T({separableConv2d_:eH});async function tH(r,e){let t=v(r,\"x\",\"setdiff1d\"),o=v(e,\"y\",\"setdiff1d\");$(t.dtype===o.dtype,()=>`x and y should have the same dtype, but got x (${t.dtype}) and y (${o.dtype}).`),$(t.rank===1,()=>`x should be 1D tensor, but got x (${t.shape}).`),$(o.rank===1,()=>`y should be 1D tensor, but got y (${o.shape}).`);let n=await t.data(),s=await o.data(),a=new Set(s),i=0;for(let c=0;c`slice1d expects a rank-1 tensor, but got a rank-${o.rank} tensor`),Ue(o,[e],[t])}var V1=T({slice1d_:sH});function aH(r,e,t){let o=v(r,\"x\",\"slice2d\");return $(o.rank===2,()=>`slice2d expects a rank-2 tensor, but got a rank-${o.rank} tensor`),Ue(o,e,t)}var z1=T({slice2d_:aH});function iH(r,e,t){let o=v(r,\"x\",\"slice3d\");return $(o.rank===3,()=>`slice3d expects a rank-3 tensor, but got a rank-${o.rank} tensor`),Ue(o,e,t)}var W1=T({slice3d_:iH});function uH(r,e,t){let o=v(r,\"x\",\"slice4d\");return $(o.rank===4,()=>`slice4d expects a rank-4 tensor, but got a rank-${o.rank} tensor`),Ue(o,e,t)}var U1=T({slice4d_:uH});function pH(r,e=-1){let t=v(r,\"logits\",\"softmax\",\"float32\");if(e===-1&&(e=t.rank-1),e!==t.rank-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${t.rank} and dim was ${e}`);let o={logits:t},n={dim:e};return N.runKernel(Xn,o,n)}var G1=T({softmax_:pH});function cH(r){$(r.dtype===\"complex64\",()=>`The dtype for tf.spectral.fft() must be complex64 but got ${r.dtype}.`);let e={input:r};return N.runKernel(bp,e)}var qp=T({fft_:cH});function lH(r){$(r.dtype===\"complex64\",()=>`The dtype for tf.spectral.ifft() must be complex64 but got ${r.dtype}.`);let e={input:r};return N.runKernel(Cp,e)}var hu=T({ifft_:lH});function mH(r){let e=r.shape[r.shape.length-1],t=r.size/e,o;if(e<=2){let n=z(r,[t,e]);o=hu(n)}else{let n=[t,2*(e-1)],s=z(ka(r),[t,e]),a=z(ci(r),[t,e]),i=vo(Ue(s,[0,1],[t,e-2]),1),p=oe(vo(Ue(a,[0,1],[t,e-2]),1),be(-1)),u=gt([s,i],1),c=gt([a,p],1),l=z(Er(u,c),[n[0],n[1]]);o=hu(l)}if(o=ka(o),r.rank===3&&r.shape[0]!==0){let n=o,s=r.shape[0];o=z(o,[s,o.shape[0]/s,o.shape[1]]),n.dispose()}return o}var Gf=T({irfft_:mH});function fH(r,e,t=0){let n={x:v(r,\"x\",\"split\")},s={numOrSizeSplits:e,axis:t};return N.runKernel(Ts,n,s)}var $a=T({split_:fH});function dH(r,e){$(r.dtype===\"float32\",()=>`The dtype for rfft() must be real value but got ${r.dtype}`);let t=r.shape[r.shape.length-1],o=r.size/t,n;if(e!=null&&e0),h=r.shape.map(g=>g);h[r.shape.length-1]=e,n=Ue(r,d,h),t=e}else if(e!=null&&e>t){let d=r.shape.map(h=>h);d[r.shape.length-1]=e-t,n=gt([r,Wr(d)],r.shape.length-1),t=e}else n=r;let s=Gt(n),a=z(Er(n,s),[o,t]),i=qp(a),p=Math.floor(t/2)+1,u=ka(i),c=ci(i),l=$a(u,[p,t-p],u.shape.length-1),m=$a(c,[p,t-p],c.shape.length-1),f=n.shape.slice();return f[n.shape.length-1]=p,z(Er(l[0],m[0]),f)}var Kp=T({rfft_:dH});function hH(r,e){let t=v(r,\"a\",\"squaredDifference\"),o=v(e,\"b\",\"squaredDifference\");[t,o]=Re(t,o),Je(t.shape,o.shape);let n={a:t,b:o},s={};return N.runKernel(Co,n,s)}var Hf=T({squaredDifference_:hH});function gH(r,e){let t=v(r,\"x\",\"squeeze\",\"string_or_numeric\");return z(t,db(t.shape,e).newShape)}var jp=T({squeeze_:gH});function xH(r,e=0){let t=Ia(r,\"tensors\",\"stack\",\"string_or_numeric\");$(t.length>=1,()=>\"Pass at least one tensor to tf.stack\"),t.length>0&&$(e<=t[0].rank,()=>\"Axis must be <= rank of the tensor\");let o=t,n={axis:e};return N.runKernel(Is,o,n)}var Ir=T({stack_:xH});function yH(r,e=0){let o={x:v(r,\"x\",\"step\")},n={alpha:e};return N.runKernel($s,o,n)}var qf=T({step_:yH});function bH(r,e,t,o,n=0,s=0,a=0,i=0,p=0){let c={x:v(r,\"x\",\"stridedSlice\",\"string_or_numeric\")},l={begin:e,end:t,strides:o,beginMask:n,endMask:s,ellipsisMask:a,newAxisMask:i,shrinkAxisMask:p};return N.runKernel(Yn,c,l)}var H1=T({stridedSlice_:bH});function CH(r){let t={x:v(r,\"x\",\"tan\",\"float32\")};return N.runKernel(xa,t)}var q1=T({tan_:CH});function mr(r,e){eo(r);let t=or(r,e);if(t.length!==1)throw new Error(\"tensor1d() requires values to be a flat/TypedArray\");return xr(r,null,t,e)}function gi(r,e,t){if(eo(r),e!=null&&e.length!==2)throw new Error(\"tensor2d() requires shape to have two numbers\");let o=or(r,t);if(o.length!==2&&o.length!==1)throw new Error(\"tensor2d() requires values to be number[][] or flat/TypedArray\");if(o.length===1&&e==null)throw new Error(\"tensor2d() requires shape to be provided when `values` are a flat/TypedArray\");return xr(r,e,o,t)}function K1(r,e,t){if(eo(r),e!=null&&e.length!==4)throw new Error(\"tensor4d() requires shape to have four numbers\");let o=or(r,t);if(o.length!==4&&o.length!==1)throw new Error(\"tensor4d() requires values to be number[][][][] or flat/TypedArray\");if(o.length===1&&e==null)throw new Error(\"tensor4d() requires shape to be provided when `values` are a flat array\");return xr(r,e,o,t)}function j1(r,e,t){if(eo(r),e!=null&&e.length!==5)throw new Error(\"tensor5d() requires shape to have five numbers\");let o=or(r,t);if(o.length!==5&&o.length!==1)throw new Error(\"tensor5d() requires values to be number[][][][][] or flat/TypedArray\");if(o.length===1&&e==null)throw new Error(\"tensor5d() requires shape to be provided when `values` are a flat array\");return xr(r,e,o,t)}function X1(r,e,t){if(eo(r),e!=null&&e.length!==6)throw new Error(\"tensor6d() requires shape to have six numbers\");let o=or(r,t);if(o.length!==6&&o.length!==1)throw new Error(\"tensor6d() requires values to be number[][][][][][] or flat/TypedArray\");if(o.length===1&&e==null)throw new Error(\"tensor6d() requires shape to be provided when `values` are a flat array\");return e=e||o,xr(r,e,o,t)}function IH(r,e=1,t=!0){let o=v(r,\"x\",\"topk\");if(o.rank===0)throw new Error(\"topk() expects the input to be of rank 1 or higher\");let n=o.shape[o.shape.length-1];if(e<0)throw new Error(`'k' passed to topk() must be >= 0 but got ${e}`);if(e>n)throw new Error(`'k' passed to topk() must be <= the last dimension (${n}) but got ${e}`);let s={x:o},a={k:e,sorted:t},[i,p]=N.runKernel(Zn,s,a);return{values:i,indices:p}}var Y1=T({topk_:IH});function wH(r,e=0,t=1,o,n){if(o!=null&&o===\"bool\")throw new Error(\"Unsupported data type $ { dtype }\");let s=new du(e,t,o,!0,n),a=ne(r,o);for(let i=0;i0,()=>\"The input tensor must be at least 1D\");let o={x:t},n={axis:e},[s,a]=N.runKernel($p,o,n);return{values:s,indices:a}}var Z1=T({unique_:SH});function vH(r,e,t){let o=v(r,\"x\",\"unsortedSegmentSum\"),n=v(e,\"segmentIds\",\"unsortedSegmentSum\",\"int32\");$(ra(t),()=>\"numSegments must be of dtype int\");let s={x:o,segmentIds:n},a={numSegments:t};return N.runKernel(Rp,s,a)}var J1=T({unsortedSegmentSum_:vH});function kH(r,e=0){let t=v(r,\"x\",\"unstack\",\"string_or_numeric\");$(e>=-t.shape.length&&e`Axis = ${e} is not in [-${t.shape.length}, ${t.shape.length})`);let o={value:t},n={axis:e};return N.runKernel(_s,o,n)}var ko=T({unstack_:kH});function eT(r,e){return dl(r,e,\"right\")}function tT(r,e=!0,t,o){return N.makeVariable(r,e,t,o)}function Kf(r,e){let t=[];for(let s=0;s0,()=>\"mask cannot be scalar\"),ht(i.slice(s,s+a),n.shape,\"mask's shape must match the first K dimensions of tensor's shape,\");let p=1;for(let h=s;h\"Shape mismatch in v and x\");let p=be(1),u=ke(p,i),c=oe(ke(a,s),u);if(n){$(o!=null,()=>\"When using zeroDebias: true, step is required.\");let l=v(o,\"step\",\"movingAverage\");c=We(c,ke(p,Na(i,l)))}return ge(s,c)}var $H=T({movingAverage_:EH});function RH(r,e,t){let o=v(r,\"indices\",\"scatterND\",\"int32\"),n=v(e,\"updates\",\"scatterND\");uf(n,o,t);let s={indices:o,updates:n},a={shape:t};return N.runKernel(Hn,s,a)}var AH=T({scatterND_:RH});function rT(r,e,t,o){if(r.dtype!==\"int32\")throw new Error(`tf.sparseToDense() expects the indices to be int32 type, but the dtype was ${r.dtype}.`);if(r.rank>2)throw new Error(`sparseIndices should be a scalar, vector, or matrix, but got shape ${r.shape}.`);let n=r.rank>0?r.shape[0]:1,s=r.rank>1?r.shape[1]:1;if(t.length!==s)throw new Error(`outputShape has incorrect number of elements:, ${t.length}, should be: ${s}.`);let a=e.size;if(!(e.rank===0||e.rank===1&&a===n))throw new Error(`sparseValues has incorrect shape ${e.shape}, should be [] or [${n}]`);if(e.dtype!==o.dtype)throw new Error(\"sparseValues.dtype must match defaultValues.dtype\")}function DH(r,e,t,o=0){let n=v(r,\"sparseIndices\",\"sparseToDense\",\"int32\"),s=v(e,\"sparseValues\",\"sparseToDense\",\"string_or_numeric\"),a=v(o,\"defaultValue\",\"sparseToDense\",s.dtype);rT(n,s,t,a);let i={sparseIndices:n,sparseValues:s,defaultValue:a},p={outputShape:t};return N.runKernel(ei,i,p)}var PH=T({sparseToDense_:DH});function OH(r,e){let t=v(e,\"indices\",\"gatherND\",\"int32\"),n={params:v(r,\"x\",\"gatherND\",\"string_or_numeric\"),indices:t};return N.runKernel(Tn,n)}var MH=T({gatherND_:OH});function oT(r,e){if(e==null)return r.shape.slice();if(Or(r.shape,e))return e;if(r.shape.length===e.length){let t=[];for(let o=0;o`x has to be a floating point tensor since it's going to be scaled, but got a ${n.dtype} tensor instead.`),$(e>=0&&e<1,()=>`rate must be a float in the range [0, 1), but got ${e}.`),e===0)return r instanceof ut?n.clone():n;let s=oT(n,t),a=1-e,i=We(bf(ge(zf(s,0,1,\"float32\",o),a)),a);return oe(n,i)}var BH=T({dropout_:LH});function wC(r){return Math.floor(Math.pow(2,Math.ceil(Math.log(r)/Math.log(2))))}function hl(r,e,t){let o=1-r%2,n=new Float32Array(r);for(let s=0;s1,()=>`inTopK() expects the predictions to be of rank 2 or higher, but got ${o.rank}`),$(o.rank-1===n.rank,()=>`predictions rank should be 1 larger than targets rank, but got predictions rank ${o.rank} and targets rank ${n.rank}`),ht(o.shape.slice(0,o.shape.length-1),n.shape,\"predictions's shape should be align with the targets' shape, except the last dimension.\");let s=o.shape[o.shape.length-1];$(t>0&&t<=s,()=>`'k' passed to inTopK() must be > 0 && <= the predictions last dimension (${s}), but got ${t}`);let a=await o.data(),i=await n.data(),[p,u]=[a.length/s,s],c=hb(\"bool\",p);for(let l=0;lg.value-h.value),c[l]=0;for(let h=0;hsT,depthwiseConv2d:()=>uT,matMul:()=>pT});function WH(r,e,t,o,n,s=\"NHWC\",a){let i=r;r.rank===3&&(i=z(r,[1,r.shape[0],r.shape[1],r.shape[2]]));let p=e;p.rank===3&&(p=z(e,[1,e.shape[0],e.shape[1],e.shape[2]])),$(i.rank===4,()=>`Error in conv2dDerFilter: input must be rank 4, but got shape ${i.shape}.`),$(p.rank===4,()=>`Error in conv2dDerFilter: dy must be rank 4, but got shape ${p.shape}.`),$(t.length===4,()=>`Error in conv2dDerFilter: filterShape must be length 4, but got ${t}.`);let u=s===\"NHWC\"?i.shape[3]:i.shape[1],c=s===\"NHWC\"?p.shape[3]:p.shape[1];$(u===t[2],()=>`Error in conv2dDerFilter: depth of input ${u}) must match input depth in filter (${t[2]}.`),$(c===t[3],()=>`Error in conv2dDerFilter: depth of dy (${c}) must match output depth for filter (${t[3]}).`),Ot(\"conv2dDerFilter\",n,a);let l={x:i,dy:p},m={strides:o,pad:n,dataFormat:s,dimRoundingMode:a,filterShape:t};return N.runKernel(lp,l,m)}var nT=T({conv2DBackpropFilter_:WH});function gu(r,e,t){if(t==null||t===\"linear\")return r;if(t===\"relu\")return oe(r,qf(e));throw new Error(`Cannot compute gradient for fused activation ${t}.`)}function xu(r,e){let t=e,o=nf(r.shape,e.shape);return o.length>0&&(t=tt(t,o)),z(t,r.shape)}function yu(r,e,t,o){if(e===\"linear\")return r;if(e===\"relu\")return hi(r);if(e===\"elu\")return xf(r);if(e===\"relu6\")return Wf(r);if(e===\"prelu\")return Pf(r,t);if(e===\"leakyrelu\")return wf(r,o);if(e===\"sigmoid\")return Ms(r);throw new Error(`Unknown fused activation ${e}.`)}var bu=(r,e)=>!(r>0)||e===\"linear\";function UH({x:r,filter:e,strides:t,pad:o,dataFormat:n=\"NHWC\",dilations:s=[1,1],dimRoundingMode:a,bias:i,activation:p=\"linear\",preluActivationWeights:u,leakyreluAlpha:c}){if(p=p||\"linear\",bu(N.state.gradientDepth,p)===!1){$(n===\"NHWC\",()=>`Error in fused conv2d: got dataFormat of ${n} but only NHWC is currently supported for the case of gradient depth is 0 and the activation is not linear.`);let _=mi(r,e,t,o,n,s,a);return i!=null&&(_=ge(_,i)),yu(_,p,u,c)}let l=v(r,\"x\",\"conv2d\",\"float32\"),m=v(e,\"filter\",\"conv2d\",\"float32\"),f=l,d=!1;l.rank===3&&(d=!0,f=z(l,[1,l.shape[0],l.shape[1],l.shape[2]])),$(f.rank===4,()=>`Error in fused conv2d: input must be rank 4, but got rank ${f.rank}.`),$(m.rank===4,()=>`Error in fused conv2d: filter must be rank 4, but got rank ${m.rank}.`),Ot(\"fused conv2d\",o,a);let h=n===\"NHWC\"?f.shape[3]:f.shape[1];$(m.shape[2]===h,()=>`Error in conv2d: depth of input (${h}) must match input depth for filter ${m.shape[2]}.`),$(lr(t,s),()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${t} and dilations '${s}'`);let g=uu(f.shape,m.shape,t,s,o,a),y;i!=null&&(y=v(i,\"bias\",\"fused conv2d\"),[y]=Re(y,l),n===\"NHWC\"?Je(g.outShape,y.shape):($(y.shape.length<=1,()=>`Error in fused conv2d: only supports scalar or 1-D Tensor bias for NCHW format but got the bias of rank-${y.shape.length}.`),$(y.shape.length===0||y.shape[0]===g.outChannels||y.shape[0]===1,()=>`Error in fused conv2d: bias shape (${y.shape}) is not compatible with the number of output channels (${g.outChannels})`)));let b;if(u!=null){let _=u.shape;if($(_.length<=1||_.length===3,()=>`Error in fused conv2d: only supports scalar, 1-D Tensor or 3-D Tensor PReLU activation weights but got a tensor of rank-${_.length}.`),_.length===1)$(_[0]===1||_[0]===g.outChannels,()=>`Error in fused conv2d: PReLU activation weights (${_}) is not compatible with the number of output channels (${g.outChannels}).`);else if(_.length===3)try{Je(_,g.outShape)}catch(E){let R=`Error in fused conv2d: PReLU activation weights (${_}) is not compatible with the output shape of the conv2d (${g.outShape}).`;throw Error(R)}b=v(u,\"prelu weights\",\"fused conv2d\")}let C=(_,E)=>{$(n===\"NHWC\",()=>`Error in gradient of fused conv2D: got dataFormat of ${n} but only NHWC is currently supported.`);let[R,A,D,O]=E,M=gu(_,D,p);$(iu(s),()=>`Error in gradient of fused conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${s}'`);let L=hf(A.shape,M,R,t,o),W=nT(A,M,R.shape,t,o),V=[L,W];if(O!=null){let G=xu(O,M);V.push(G)}return V},w={x:f,filter:m,bias:y,preluActivationWeights:b},k={strides:t,pad:o,dataFormat:n,dilations:s,dimRoundingMode:a,activation:p,leakyreluAlpha:c};return i==null?Cr((E,R,A)=>{let D=N.runKernel(Do,w,k);return A([R,E,D]),d&&(D=z(D,[D.shape[1],D.shape[2],D.shape[3]])),{value:D,gradFunc:C}})(f,m):Cr((E,R,A,D)=>{let O=N.runKernel(Do,w,k);return D([R,E,O,A]),d&&(O=z(O,[O.shape[1],O.shape[2],O.shape[3]])),{value:O,gradFunc:C}})(f,m,y)}var sT=T({fusedConv2d_:UH});function GH(r,e,t,o,n,s=[1,1],a){let i=r;r.rank===3&&(i=z(r,[1,r.shape[0],r.shape[1],r.shape[2]]));let p=e;p.rank===3&&(p=z(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let u={x:i,dy:p},c={strides:o,pad:n,dimRoundingMode:a,dilations:s,filterShape:t};return N.runKernel(hp,u,c)}var aT=T({depthwiseConv2dNativeBackpropFilter_:GH});function HH(r,e,t,o,n,s=[1,1],a){let i=e,p=!1;e.rank===3&&(p=!0,i=z(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let u={dy:i,filter:t},c={strides:o,pad:n,dimRoundingMode:a,dilations:s,inputShape:r},l=N.runKernel(gp,u,c);return p?z(l,[l.shape[1],l.shape[2],l.shape[3]]):l}var iT=T({depthwiseConv2dNativeBackpropInput_:HH});function qH({x:r,filter:e,strides:t,pad:o,dataFormat:n=\"NHWC\",dilations:s=[1,1],dimRoundingMode:a,bias:i,activation:p=\"linear\",preluActivationWeights:u,leakyreluAlpha:c}){if(bu(N.state.gradientDepth,p)===!1){let k=Gp(r,e,t,o,n,s,a);return i!=null&&(k=ge(k,i)),yu(k,p,u,c)}let l=v(r,\"x\",\"depthwiseConv2d\",\"float32\"),m=v(e,\"filter\",\"depthwiseConv2d\",\"float32\"),f=l,d=!1;l.rank===3&&(d=!0,f=z(l,[1,l.shape[0],l.shape[1],l.shape[2]])),$(f.rank===4,()=>`Error in fused depthwiseConv2d: input must be rank 4, but got rank ${f.rank}.`),$(m.rank===4,()=>`Error in fused depthwiseConv2d: filter must be rank 4, but got rank ${m.rank}.`),$(f.shape[3]===m.shape[2],()=>`Error in fused depthwiseConv2d: number of input channels (${f.shape[3]}) must match the inChannels dimension in filter ${m.shape[2]}.`),s==null&&(s=[1,1]),$(lr(t,s),()=>`Error in fused depthwiseConv2d: Either strides or dilations must be 1. Got strides ${t} and dilations '${s}'`),Ot(\"fused depthwiseConv2d\",o,a);let h=uu(f.shape,m.shape,t,s,o,a,!0),g;i!=null&&(g=v(i,\"bias\",\"fused conv2d\"),[g]=Re(g,l),Je(h.outShape,g.shape));let y;u!=null&&(y=v(u,\"prelu weights\",\"fused depthwiseConv2d\"));let b=(k,_)=>{$(iu(s),()=>`Error in gradient of fused depthwiseConv2d: dilation rates greater than 1 are not yet supported. Got dilations '${s}'`);let[E,R,A,D]=_,O=gu(k,A,p),M=iT(R.shape,O,E,t,o,s,a),L=aT(R,O,E.shape,t,o,s,a);if(D!=null){let W=xu(g,O);return[M,L,W]}return[M,L]},C={x:f,filter:m,bias:g,preluActivationWeights:y},w={strides:t,pad:o,dataFormat:n,dilations:s,dimRoundingMode:a,activation:p,leakyreluAlpha:c};return i==null?Cr((_,E,R)=>{let A=N.runKernel(Po,C,w);return R([E,_,A]),d&&(A=z(A,[A.shape[1],A.shape[2],A.shape[3]])),{value:A,gradFunc:b}})(f,m):Cr((_,E,R,A)=>{let D=N.runKernel(Po,C,w);return A([E,_,D,R]),d&&(D=z(D,[D.shape[1],D.shape[2],D.shape[3]])),{value:D,gradFunc:b}})(f,m,g)}var uT=T({fusedDepthwiseConv2d_:qH});function KH({a:r,b:e,transposeA:t=!1,transposeB:o=!1,bias:n,activation:s=\"linear\",preluActivationWeights:a,leakyreluAlpha:i=.2}){if(bu(N.state.gradientDepth,s)===!1){let O=Xe(r,e,t,o);return n!=null&&(O=ge(O,n)),yu(O,s,a,i)}let p=v(r,\"a\",\"fused matMul\"),u=v(e,\"b\",\"fused matMul\");[p,u]=Re(p,u);let c=t?p.shape[p.rank-2]:p.shape[p.rank-1],l=o?u.shape[u.rank-1]:u.shape[u.rank-2],m=t?p.shape[p.rank-1]:p.shape[p.rank-2],f=o?u.shape[u.rank-2]:u.shape[u.rank-1],d=p.shape.slice(0,-2),h=u.shape.slice(0,-2),g=Ve(d),y=Ve(h);$(c===l,()=>`Error in fused matMul: inner shapes (${c}) and (${l}) of Tensors with shapes ${p.shape} and ${u.shape} and transposeA=${t} and transposeB=${o} must match.`);let C=Je(p.shape.slice(0,-2),u.shape.slice(0,-2)).concat([m,f]),w=t?z(p,[g,c,m]):z(p,[g,m,c]),k=o?z(u,[y,f,l]):z(u,[y,l,f]),_;n!=null&&(_=v(n,\"bias\",\"fused matMul\"),[_]=Re(_,p),Je(C,_.shape));let E;a!=null&&(E=v(a,\"prelu weights\",\"fused matMul\"));let R=(O,M)=>{let[L,W,V,G]=M,q=gu(z(O,V.shape),V,s),H,j;if(!t&&!o?(H=Xe(q,W,!1,!0),j=Xe(L,q,!0,!1)):!t&&o?(H=Xe(q,W,!1,!1),j=Xe(q,L,!0,!1)):t&&!o?(H=Xe(W,q,!1,!0),j=Xe(L,q,!1,!1)):(H=Xe(W,q,!0,!0),j=Xe(q,L,!0,!0)),n!=null){let Y=xu(G,q);return[H,j,Y]}else return[H,j]},A={a:w,b:k,bias:_,preluActivationWeights:E},D={transposeA:t,transposeB:o,activation:s,leakyreluAlpha:i};return n==null?Cr((M,L,W)=>{let V=N.runKernel(Fo,A,D);return W([M,L,V]),{value:z(V,C),gradFunc:R}})(w,k):Cr((M,L,W,V)=>{let G=N.runKernel(Fo,A,D);return V([M,L,G,W]),{value:z(G,C),gradFunc:R}})(w,k,_)}var pT=T({fusedMatMul_:KH});function jH(r){return hl(r,.54,.46)}var cT=T({hammingWindow_:jH});function XH(r){return hl(r,.5,.5)}var Xf=T({hannWindow_:XH});function YH(r,e,t,o=!1,n=0){let s=0,a=[];for(;s+e<=r.size;)a.push(Ue(r,s,e)),s+=t;if(o)for(;s`Error in cropAndResize: image must be rank 4,but got rank ${a.rank}.`),$(i.rank===2&&i.shape[1]===4,()=>`Error in cropAndResize: boxes must be have size [${u},4] but had shape ${i.shape}.`),$(p.rank===1&&p.shape[0]===u,()=>`Error in cropAndResize: boxInd must be have size [${u}] but had shape ${i.shape}.`),$(o.length===2,()=>`Error in cropAndResize: cropSize must be of length 2, but got length ${o.length}.`),$(o[0]>=1&&o[1]>=1,()=>`cropSize must be atleast [1,1], but was ${o}`),$(n===\"bilinear\"||n===\"nearest\",()=>`method must be bilinear or nearest, but was ${n}`);let c={image:a,boxes:i,boxInd:p},l={method:n,extrapolationValue:s,cropSize:o};return N.runKernel(xn,c,l)}var mT=T({cropAndResize_:ZH});function JH(r){let e=v(r,\"image\",\"flipLeftRight\",\"float32\");$(e.rank===4,()=>`Error in flipLeftRight: image must be rank 4,but got rank ${e.rank}.`);let t={image:e};return N.runKernel(Sn,t,{})}var fT=T({flipLeftRight_:JH});function eq(r){let e=v(r,\"image\",\"grayscaleToRGB\"),t=e.rank-1,o=e.shape[t];$(e.rank>=2,()=>`Error in grayscaleToRGB: images must be at least rank 2, but got rank ${e.rank}.`),$(o===1,()=>`Error in grayscaleToRGB: last dimension of a grayscale image should be size 1, but got size ${o}.`);let n=new Array(e.rank);return n.fill(1,0,t),n[t]=3,fi(e,n)}var dT=T({grayscaleToRGB_:eq});function tq(r,e,t=0,o=.5){let n=v(r,\"image\",\"rotateWithOffset\",\"float32\");$(n.rank===4,()=>`Error in rotateWithOffset: image must be rank 4,but got rank ${n.rank}.`);let s={image:n},a={radians:e,fillValue:t,center:o};return N.runKernel(es,s,a)}var hT=T({rotateWithOffset_:tq});function Vo(r,e,t,o,n,s){o==null&&(o=.5),n==null&&(n=Number.NEGATIVE_INFINITY),s==null&&(s=0);let a=r.shape[0];return t=Math.min(t,a),$(0<=o&&o<=1,()=>`iouThreshold must be in [0, 1], but was '${o}'`),$(r.rank===2,()=>`boxes must be a 2D tensor, but was of rank '${r.rank}'`),$(r.shape[1]===4,()=>`boxes must have 4 columns, but 2nd dimension was ${r.shape[1]}`),$(e.rank===1,()=>\"scores must be a 1D tensor\"),$(e.shape[0]===a,()=>`scores has incompatible shape with boxes. Expected ${a}, but was ${e.shape[0]}`),$(0<=s&&s<=1,()=>`softNmsSigma must be in [0, 1], but was '${s}'`),{maxOutputSize:t,iouThreshold:o,scoreThreshold:n,softNmsSigma:s}}function rq(r,e,t,o=.5,n=Number.NEGATIVE_INFINITY){let s=v(r,\"boxes\",\"nonMaxSuppression\",\"float32\"),a=v(e,\"scores\",\"nonMaxSuppression\",\"float32\"),i=Vo(s,a,t,o,n);t=i.maxOutputSize,o=i.iouThreshold,n=i.scoreThreshold;let p={maxOutputSize:t,iouThreshold:o,scoreThreshold:n};return N.runKernel(On,{boxes:s,scores:a},p)}var gT=T({nonMaxSuppression_:rq});function xT(r,e,t){let o=oq(r,e,t),n=o<0?-(o+1):o;r.splice(n,0,e)}function oq(r,e,t){return sq(r,e,t||nq)}function nq(r,e){return r>e?1:r>>1);let i=t(e,r[s]);i>0?o=s+1:(n=s,a=!i)}return a?o:-o-1}function Qf(r,e,t,o,n){return vC(r,e,t,o,n,0)}function Zf(r,e,t,o,n,s){return vC(r,e,t,o,n,0,!1,s,!0)}function Jf(r,e,t,o,n,s){return vC(r,e,t,o,n,s,!0)}function vC(r,e,t,o,n,s,a=!1,i=!1,p=!1){let u=[];for(let g=0;gn&&u.push({score:e[g],boxIndex:g,suppressBeginIndex:0});u.sort(yT);let c=s>0?-.5/s:0,l=[],m=[];for(;l.length0;){let g=u.pop(),{score:y,boxIndex:b,suppressBeginIndex:C}=g;if(y=C;--k){let _=aq(r,b,l[k]);if(_>=o){w=!0;break}if(g.score=g.score*iq(o,c,_),g.score<=n)break}g.suppressBeginIndex=l.length,w||(g.score===y?(l.push(b),m.push(g.score)):g.score>n&&xT(u,g,yT))}let f=l.length,d=t-f;i&&d>0&&(l.push(...new Array(d).fill(0)),m.push(...new Array(d).fill(0)));let h={selectedIndices:l};return a&&(h.selectedScores=m),p&&(h.validOutputs=f),h}function aq(r,e,t){let o=r.subarray(e*4,e*4+4),n=r.subarray(t*4,t*4+4),s=Math.min(o[0],o[2]),a=Math.min(o[1],o[3]),i=Math.max(o[0],o[2]),p=Math.max(o[1],o[3]),u=Math.min(n[0],n[2]),c=Math.min(n[1],n[3]),l=Math.max(n[0],n[2]),m=Math.max(n[1],n[3]),f=(i-s)*(p-a),d=(l-u)*(m-c);if(f<=0||d<=0)return 0;let h=Math.max(s,u),g=Math.max(a,c),y=Math.min(i,l),b=Math.min(p,m),C=Math.max(y-h,0)*Math.max(b-g,0);return C/(f+d-C)}function iq(r,e,t){let o=Math.exp(e*t*t);return t<=r?o:0}function yT(r,e){return r.score-e.score||r.score===e.score&&e.boxIndex-r.boxIndex}async function uq(r,e,t,o=.5,n=Number.NEGATIVE_INFINITY){let s=v(r,\"boxes\",\"nonMaxSuppressionAsync\"),a=v(e,\"scores\",\"nonMaxSuppressionAsync\"),i=Vo(s,a,t,o,n);t=i.maxOutputSize,o=i.iouThreshold,n=i.scoreThreshold;let p=await Promise.all([s.data(),a.data()]),u=p[0],c=p[1],{selectedIndices:l}=Qf(u,c,t,o,n);return s!==r&&s.dispose(),a!==e&&a.dispose(),mr(l,\"int32\")}var bT=uq;function pq(r,e,t,o=.5,n=Number.NEGATIVE_INFINITY,s=0){let a=v(r,\"boxes\",\"nonMaxSuppression\"),i=v(e,\"scores\",\"nonMaxSuppression\"),p=Vo(a,i,t,o,n,s);t=p.maxOutputSize,o=p.iouThreshold,n=p.scoreThreshold,s=p.softNmsSigma;let u={boxes:a,scores:i},c={maxOutputSize:t,iouThreshold:o,scoreThreshold:n,softNmsSigma:s},l=N.runKernel(Mn,u,c);return{selectedIndices:l[0],selectedScores:l[1]}}var CT=T({nonMaxSuppressionWithScore_:pq});async function cq(r,e,t,o=.5,n=Number.NEGATIVE_INFINITY,s=0){let a=v(r,\"boxes\",\"nonMaxSuppressionAsync\"),i=v(e,\"scores\",\"nonMaxSuppressionAsync\"),p=Vo(a,i,t,o,n,s);t=p.maxOutputSize,o=p.iouThreshold,n=p.scoreThreshold,s=p.softNmsSigma;let u=await Promise.all([a.data(),i.data()]),c=u[0],l=u[1],{selectedIndices:m,selectedScores:f}=Jf(c,l,t,o,n,s);return a!==r&&a.dispose(),i!==e&&i.dispose(),{selectedIndices:mr(m,\"int32\"),selectedScores:mr(f)}}var IT=cq;function lq(r,e,t,o=.5,n=Number.NEGATIVE_INFINITY,s=!1){let a=v(r,\"boxes\",\"nonMaxSuppression\"),i=v(e,\"scores\",\"nonMaxSuppression\"),p=Vo(a,i,t,o,n,null),u=p.maxOutputSize,c=p.iouThreshold,l=p.scoreThreshold,m={boxes:a,scores:i},f={maxOutputSize:u,iouThreshold:c,scoreThreshold:l,padToMaxOutputSize:s},d=N.runKernel(pa,m,f);return{selectedIndices:d[0],validOutputs:d[1]}}var wT=T({nonMaxSuppressionPadded_:lq});async function mq(r,e,t,o=.5,n=Number.NEGATIVE_INFINITY,s=!1){let a=v(r,\"boxes\",\"nonMaxSuppressionAsync\"),i=v(e,\"scores\",\"nonMaxSuppressionAsync\"),p=Vo(a,i,t,o,n,null),u=p.maxOutputSize,c=p.iouThreshold,l=p.scoreThreshold,[m,f]=await Promise.all([a.data(),i.data()]),{selectedIndices:d,validOutputs:h}=Zf(m,f,u,c,l,s);return a!==r&&a.dispose(),i!==e&&i.dispose(),{selectedIndices:mr(d,\"int32\"),validOutputs:be(h,\"int32\")}}var ST=mq;function fq(r,e,t=!1,o=!1){let n=v(r,\"images\",\"resizeBilinear\");$(n.rank===3||n.rank===4,()=>`Error in resizeBilinear: x must be rank 3 or 4, but got rank ${n.rank}.`),$(e.length===2,()=>`Error in resizeBilinear: new shape must 2D, but got shape ${e}.`),$(o===!1||t===!1,()=>\"Error in resizeBilinear: If halfPixelCenters is true, alignCorners must be false.\");let s=n,a=!1;n.rank===3&&(a=!0,s=z(n,[1,n.shape[0],n.shape[1],n.shape[2]]));let[]=e,i={images:s},p={alignCorners:t,halfPixelCenters:o,size:e},u=N.runKernel(Un,i,p);return a?z(u,[u.shape[1],u.shape[2],u.shape[3]]):u}var vT=T({resizeBilinear_:fq});function dq(r,e,t=!1,o=!1){let n=v(r,\"images\",\"resizeNearestNeighbor\");$(n.rank===3||n.rank===4,()=>`Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank ${n.rank}.`),$(e.length===2,()=>`Error in resizeNearestNeighbor: new shape must 2D, but got shape ${e}.`),$(n.dtype===\"float32\"||n.dtype===\"int32\",()=>\"`images` must have `int32` or `float32` as dtype\"),$(o===!1||t===!1,()=>\"Error in resizeNearestNeighbor: If halfPixelCenters is true, alignCorners must be false.\");let s=n,a=!1;n.rank===3&&(a=!0,s=z(n,[1,n.shape[0],n.shape[1],n.shape[2]]));let[]=e,i={images:s},p={alignCorners:t,halfPixelCenters:o,size:e},u=N.runKernel(Wn,i,p);return a?z(u,[u.shape[1],u.shape[2],u.shape[3]]):u}var kT=T({resizeNearestNeighbor_:dq});function hq(r,e=\"binary\",t=!1,o=.5){let n=v(r,\"image\",\"threshold\"),s=.2989,a=.587,i=.114,p=n.shape[0]*n.shape[1],u=oe(mr([o]),255),c,l,m,f;if($(n.rank===3,()=>`Error in threshold: image must be rank 3,but got rank ${n.rank}.`),$(n.shape[2]===3||n.shape[2]===1,()=>`Error in threshold: image color channel must be equal to 3 or 1but got ${n.shape[2]}.`),$(n.dtype===\"int32\"||n.dtype===\"float32\",()=>`Error in dtype: image dtype must be int32 or float32,but got dtype ${n.dtype}.`),$(e===\"otsu\"||e===\"binary\",()=>`Method must be binary or otsu, but was ${e}`),n.shape[2]===3){[c,l,m]=$a(n,[1,1,1],-1);let g=oe(c,s),y=oe(l,a),b=oe(m,i);f=ge(ge(g,y),b)}else f=r;if(e===\"otsu\"){let g=df(qe(Uf(f),\"int32\"),nr([]),256);u=gq(g,p)}let d=t?Hp(f,u):cu(f,u);return qe(oe(d,255),\"int32\")}function gq(r,e){let t=mr([-1]),o=mr([0]),n=mr([0]),s,a,i,p,u,c;for(let l=0;l`Error in transform: image must be rank 4,but got rank ${a.rank}.`),$(i.rank===2&&(i.shape[0]===a.shape[0]||i.shape[0]===1)&&i.shape[1]===8,()=>\"Error in transform: Input transform should be batch x 8 or 1 x 8\"),$(s==null||s.length===2,()=>`Error in transform: outputShape must be [height, width] or null, but got ${s}.`);let p={image:a,transforms:i},u={interpolation:t,fillMode:o,fillValue:n,outputShape:s};return N.runKernel(Jn,p,u)}var NT=T({transform_:xq});function yq(r,e,t){$(e%1===0,()=>`bandPart(): numLower must be an integer, got ${e}.`),$(t%1===0,()=>`bandPart(): numUpper must be an integer, got ${t}.`);let o=v(r,\"a\",\"bandPart\");$(o.rank>=2,()=>`bandPart(): Rank must be at least 2, got ${o.rank}.`);let n=o.shape,[s,a]=o.shape.slice(-2);if(!(e<=s))throw new Error(`bandPart(): numLower (${e}) must not be greater than the number of rows (${s}).`);if(!(t<=a))throw new Error(`bandPart(): numUpper (${t}) must not be greater than the number of columns (${a}).`);e<0&&(e=s),t<0&&(t=a);let i=z(di(0,s,1,\"int32\"),[-1,1]),p=di(0,a,1,\"int32\"),u=ke(i,p),c=lu(Hp(u,be(+e,\"int32\")),If(u,be(-t,\"int32\"))),l=Wr([s,a],o.dtype);return z(Ir(ko(z(o,[-1,s,a])).map(m=>os(c,m,l))),n)}var _T=T({bandPart_:yq});function bq(r){let e;if(Array.isArray(r)){e=!1,$(r!=null&&r.length>0,()=>\"Gram-Schmidt process: input must not be null, undefined, or empty\");let n=r[0].shape[0];for(let s=1;s`Gram-Schmidt: Non-unique lengths found in the input vectors: (${r[s].shape[0]} vs. ${n})`)}else e=!0,r=$a(r,r.shape[0],0).map(n=>jp(n,[0]));$(r.length<=r[0].shape[0],()=>`Gram-Schmidt: Number of vectors (${r.length}) exceeds number of dimensions (${r[0].shape[0]}).`);let t=[],o=r;for(let n=0;n{let s=o[n];if(n>0)for(let a=0;a=2,()=>`qr() requires input tensor to have a rank >= 2, but got rank ${r.rank}`),r.rank===2)return $T(r,e);{let t=r.shape.slice(0,r.shape.length-2).reduce((p,u)=>p*u),o=ko(z(r,[t,r.shape[r.shape.length-2],r.shape[r.shape.length-1]]),0),n=[],s=[];o.forEach(p=>{let[u,c]=$T(p,e);n.push(u),s.push(c)});let a=z(Ir(n,0),r.shape),i=z(Ir(s,0),r.shape);return[a,i]}}function $T(r,e=!1){return N.tidy(()=>{$(r.shape.length===2,()=>`qr2d() requires a 2D Tensor, but got a ${r.shape.length}D Tensor.`);let t=r.shape[0],o=r.shape[1],n=yf(t),s=zr(r),a=gi([[1]],[1,1]),i=zr(a),p=t>=o?o:t;for(let u=0;u{let f=Ue(s,[u,u],[t-u,1]),d=pu(f),h=Ue(s,[u,u],[1,1]),g=os(cu(h,0),gi([[-1]]),gi([[1]])),y=ke(h,oe(g,d)),b=We(f,y);b.shape[0]===1?i=zr(a):i=gt([a,Ue(b,[1,0],[b.shape[0]-1,b.shape[1]])],0);let C=yr(We(Xe(g,y),d)),w=Ue(s,[u,0],[t-u,o]),k=oe(C,i),_=Wp(i);if(u===0)s=ke(w,Xe(k,Xe(_,w)));else{let A=ke(w,Xe(k,Xe(_,w)));s=gt([Ue(s,[0,0],[u,o]),A],0)}let E=Wp(k),R=Ue(n,[0,u],[t,n.shape[1]-u]);if(u===0)n=ke(R,Xe(Xe(R,i),E));else{let A=ke(R,Xe(Xe(R,i),E));n=gt([Ue(n,[0,0],[t,u]),A],1)}return[i,s,n]}),Ft([c,l,m])}return!e&&t>o&&(n=Ue(n,[0,0],[t,o]),s=Ue(s,[0,0],[o,o])),[n,s]})}var RT=T({qr_:Cq});var Et;(function(r){r[r.NONE=0]=\"NONE\",r[r.MEAN=1]=\"MEAN\",r[r.SUM=2]=\"SUM\",r[r.SUM_BY_NONZERO_WEIGHTS=3]=\"SUM_BY_NONZERO_WEIGHTS\"})(Et||(Et={}));function Iq(r,e,t=Et.SUM_BY_NONZERO_WEIGHTS){let o=v(r,\"losses\",\"computeWeightedLoss\"),n=null;e!=null&&(n=v(e,\"weights\",\"computeWeightedLoss\"));let s=n==null?o:oe(o,n);if(t===Et.NONE)return s;if(t===Et.SUM)return tt(s);if(t===Et.MEAN){if(n==null)return mu(s);{let a=o.size/n.size,i=We(tt(s),tt(n));return a>1?We(i,be(a)):i}}if(t===Et.SUM_BY_NONZERO_WEIGHTS){if(n==null)return We(tt(s),be(o.size));{let a=oe(n,zs(o.shape)),i=qe(tt(Ff(a,be(0))),\"float32\");return We(tt(s),i)}}throw Error(`Unknown reduction: ${t}`)}var sr=T({computeWeightedLoss_:Iq});function wq(r,e,t,o=Et.SUM_BY_NONZERO_WEIGHTS){let n=v(r,\"labels\",\"absoluteDifference\"),s=v(e,\"predictions\",\"absoluteDifference\"),a=null;t!=null&&(a=v(t,\"weights\",\"absoluteDifference\")),ht(n.shape,s.shape,\"Error in absoluteDifference: \");let i=Qt(ke(n,s));return sr(i,a,o)}var AT=T({absoluteDifference_:wq});function Sq(r,e,t,o,n=Et.SUM_BY_NONZERO_WEIGHTS){let s=v(r,\"labels\",\"cosineDistance\"),a=v(e,\"predictions\",\"cosineDistance\"),i=null;o!=null&&(i=v(o,\"weights\",\"cosineDistance\")),ht(s.shape,a.shape,\"Error in cosineDistance: \");let p=be(1),u=ke(p,tt(oe(s,a),t,!0));return sr(u,i,n)}var FT=T({cosineDistance_:Sq});function vq(r,e,t,o=Et.SUM_BY_NONZERO_WEIGHTS){let n=v(r,\"labels\",\"hingeLoss\"),s=v(e,\"predictions\",\"hingeLoss\"),a=null;t!=null&&(a=v(t,\"weights\",\"hingeLoss\")),ht(n.shape,s.shape,\"Error in hingeLoss: \");let i=be(1);n=ke(oe(be(2),n),i);let p=hi(ke(i,oe(n,s)));return sr(p,a,o)}var DT=T({hingeLoss_:vq});function kq(r,e,t,o=1,n=Et.SUM_BY_NONZERO_WEIGHTS){let s=v(r,\"labels\",\"huberLoss\"),a=v(e,\"predictions\",\"huberLoss\"),i=null;t!=null&&(i=v(t,\"weights\",\"huberLoss\")),ht(s.shape,a.shape,\"Error in huberLoss: \");let p=be(o),u=Qt(ke(a,s)),c=Af(u,p),l=ke(u,c),m=ge(oe(be(.5),Zt(c)),oe(p,l));return sr(m,i,n)}var PT=T({huberLoss_:kq});function Tq(r,e,t,o=1e-7,n=Et.SUM_BY_NONZERO_WEIGHTS){let s=v(r,\"labels\",\"logLoss\"),a=v(e,\"predictions\",\"logLoss\"),i=null;t!=null&&(i=v(t,\"weights\",\"logLoss\")),ht(s.shape,a.shape,\"Error in logLoss: \");let p=be(1),u=be(o),c=yr(oe(s,Ea(ge(a,u)))),l=oe(ke(p,s),Ea(ge(ke(p,a),u))),m=ke(c,l);return sr(m,i,n)}var OT=T({logLoss_:Tq});function Nq(r,e,t,o=Et.SUM_BY_NONZERO_WEIGHTS){let n=v(r,\"labels\",\"meanSquaredError\"),s=v(e,\"predictions\",\"meanSquaredError\"),a=null;t!=null&&(a=v(t,\"weights\",\"meanSquaredError\")),ht(n.shape,s.shape,\"Error in meanSquaredError: \");let i=Hf(n,s);return sr(i,a,o)}var MT=T({meanSquaredError_:Nq});function _q(r,e){let t=v(r,\"labels\",\"sigmoidCrossEntropyWithLogits\"),o=v(e,\"logits\",\"sigmoidCrossEntropyWithLogits\");ht(t.shape,o.shape,\"Error in sigmoidCrossEntropyWithLogits: \");let n=hi(o),s=oe(o,t),a=Sf(Bo(yr(Qt(o))));return ge(ke(n,s),a)}function Eq(r,e,t,o=0,n=Et.SUM_BY_NONZERO_WEIGHTS){let s=v(r,\"multiClassLabels\",\"sigmoidCrossEntropy\"),a=v(e,\"logits\",\"sigmoidCrossEntropy\"),i=null;if(t!=null&&(i=v(t,\"weights\",\"sigmoidCrossEntropy\")),ht(s.shape,a.shape,\"Error in sigmoidCrossEntropy: \"),o>0){let u=be(o),c=be(1),l=be(.5);s=ge(oe(s,ke(c,u)),oe(l,u))}let p=_q(s,a);return sr(p,i,n)}var LT=T({sigmoidCrossEntropy_:Eq});function $q(r,e,t=-1){if(t===-1&&(t=e.rank-1),t!==e.rank-1)throw Error(`Softmax cross entropy along a non-last dimension is not yet supported. Labels / logits was rank ${e.rank} and dim was ${t}`);return Cr((n,s,a)=>{let p=Tf(s,[t],!0),u=ke(qe(s,\"float32\"),p);a([n,u]);let c=yr(oe(u,n));return{value:tt(c,[t]),gradFunc:(f,d)=>{let[h,g]=d,y=Ta(f.shape,[t]);return[oe(z(f,y),ke(qe(h,\"float32\"),Bo(g))),oe(z(f,y),ke(Bo(g),qe(h,\"float32\")))]}}})(r,e)}function Rq(r,e,t,o=0,n=Et.SUM_BY_NONZERO_WEIGHTS){let s=v(r,\"onehotLabels\",\"softmaxCrossEntropy\"),a=v(e,\"logits\",\"softmaxCrossEntropy\"),i=null;if(t!=null&&(i=v(t,\"weights\",\"softmaxCrossEntropy\")),ht(s.shape,a.shape,\"Error in softmaxCrossEntropy: \"),o>0){let u=be(o),c=be(1),l=be(s.shape[1]);s=ge(oe(s,ke(c,u)),We(u,l))}let p=$q(s,a);return sr(p,i,n)}var BT=T({softmaxCrossEntropy_:Rq});function Aq(r,e,t,o){let n=v(r,\"indices\",\"sparseFillEmptyRows\",\"int32\"),s=v(e,\"values\",\"sparseFillEmptyRows\"),a=v(t,\"denseShape\",\"sparseFillEmptyRows\",\"int32\"),i=v(o,\"defaultValue\",\"sparseFillEmptyRows\",s.dtype);if(n.rank!==2)throw new Error(`Indices should be Tensor2D but received shape\n ${n.shape}`);if(s.rank!==1)throw new Error(`Values should be Tensor1D but received shape ${s.shape}`);if(a.rank!==1)throw new Error(`Dense shape should be Tensor1D but received shape ${a.shape}`);if(i.rank!==0)throw new Error(`Default value should be a scalar but received shape ${i.shape}`);let p={indices:n,values:s,denseShape:a,defaultValue:i},u=N.runKernel(Qa,p);return{outputIndices:u[0],outputValues:u[1],emptyRowIndicator:u[2],reverseIndexMap:u[3]}}var VT=T({sparseFillEmptyRows_:Aq});function Fq(r,e,t){let o=v(r,\"inputIndices\",\"sparseReshape\",\"int32\"),n=v(e,\"inputShape\",\"sparseReshape\",\"int32\"),s=v(t,\"newShape\",\"sparseReshape\",\"int32\");if(o.rank!==2)throw new Error(`Input indices should be Tensor2D but received shape\n ${o.shape}`);if(n.rank!==1)throw new Error(`Input shape should be Tensor1D but received shape ${n.shape}`);if(s.rank!==1)throw new Error(`New shape should be Tensor1D but received shape ${s.shape}`);let a={inputIndices:o,inputShape:n,newShape:s},i=N.runKernel(ga,a);return{outputIndices:i[0],outputShape:i[1]}}var zT=T({sparseReshape_:Fq});function Dq(r,e,t){let o=v(r,\"data\",\"sparseSegmentMean\"),n=v(e,\"indices\",\"sparseSegmentMean\",\"int32\"),s=v(t,\"segmentIds\",\"sparseSegmentMean\",\"int32\");if(o.rank<1)throw new Error(\"Data should be at least 1 dimensional but received scalar\");if(n.rank!==1)throw new Error(`Indices should be Tensor1D but received shape\n ${n.shape}`);if(s.rank!==1)throw new Error(`Segment ids should be Tensor1D but received shape\n ${s.shape}`);let a={data:o,indices:n,segmentIds:s};return N.runKernel(Za,a)}var WT=T({sparseSegmentMean_:Dq});function Pq(r,e,t){let o=v(r,\"data\",\"sparseSegmentSum\"),n=v(e,\"indices\",\"sparseSegmentSum\",\"int32\"),s=v(t,\"segmentIds\",\"sparseSegmentSum\",\"int32\");if(o.rank<1)throw new Error(\"Data should be at least 1 dimensional but received scalar\");if(n.rank!==1)throw new Error(`Indices should be Tensor1D but received shape\n ${n.shape}`);if(s.rank!==1)throw new Error(`Segment ids should be Tensor1D but received shape\n ${s.shape}`);let a={data:o,indices:n,segmentIds:s};return N.runKernel(Ja,a)}var UT=T({sparseSegmentSum_:Pq});function Oq(r,e,t,o,n,s,a,i){let p=v(r,\"data\",\"stringNGrams\",\"string\");if(p.dtype!==\"string\")throw new Error(\"Data must be of datatype string\");if(p.shape.length!==1)throw new Error(`Data must be a vector, saw: ${p.shape}`);let u=v(e,\"dataSplits\",\"stringNGrams\");if(u.dtype!==\"int32\")throw new Error(\"Data splits must be of datatype int32\");let c={separator:t,nGramWidths:o,leftPad:n,rightPad:s,padWidth:a,preserveShortSequences:i},l={data:p,dataSplits:u},m=N.runKernel(Ns,l,c);return{nGrams:m[0],nGramsSplits:m[1]}}var GT=T({stringNGrams_:Oq});function Mq(r,e,t=!0){let o=v(r,\"input\",\"stringSplit\",\"string\"),n=v(e,\"delimiter\",\"stringSplit\",\"string\");if(o.rank!==1)throw new Error(`Input should be Tensor1D but received shape ${o.shape}`);if(n.rank!==0)throw new Error(`Delimiter should be a scalar but received shape ${n.shape}`);let s={skipEmpty:t},a={input:o,delimiter:n},i=N.runKernel(ri,a,s);return{indices:i[0],values:i[1],shape:i[2]}}var HT=T({stringSplit_:Mq});function Lq(r,e){let t=v(r,\"input\",\"stringToHashBucketFast\",\"string\"),o={numBuckets:e};if(e<=0)throw new Error(\"Number of buckets must be at least 1\");let n={input:t};return N.runKernel(oi,n,o)}var qT=T({stringToHashBucketFast_:Lq});var Bq={fft:qp,ifft:hu,rfft:Kp,irfft:Gf},Vq={hammingWindow:cT,hannWindow:Xf,frame:Yf,stft:lT},zq={flipLeftRight:fT,grayscaleToRGB:dT,resizeNearestNeighbor:kT,resizeBilinear:vT,rotateWithOffset:hT,cropAndResize:mT,nonMaxSuppression:gT,nonMaxSuppressionAsync:bT,nonMaxSuppressionWithScore:CT,nonMaxSuppressionWithScoreAsync:IT,nonMaxSuppressionPadded:wT,nonMaxSuppressionPaddedAsync:ST,threshold:TT,transform:NT},Wq={bandPart:_T,gramSchmidt:ET,qr:RT},Uq={absoluteDifference:AT,computeWeightedLoss:sr,cosineDistance:FT,hingeLoss:DT,huberLoss:PT,logLoss:OT,meanSquaredError:MT,sigmoidCrossEntropy:LT,softmaxCrossEntropy:BT},Gq={sparseFillEmptyRows:VT,sparseReshape:zT,sparseSegmentMean:WT,sparseSegmentSum:UT},Hq={stringNGrams:GT,stringSplit:HT,stringToHashBucketFast:qT};var wr=class extends ll{minimize(e,t=!1,o){let{value:n,grads:s}=this.computeGradients(e,o);if(o!=null){let a=o.map(i=>({name:i.name,tensor:s[i.name]}));this.applyGradients(a)}else this.applyGradients(s);return Ft(s),t?n:(n.dispose(),null)}get iterations(){return this.iterations_==null&&(this.iterations_=0),this.iterations_}incrementIterations(){this.iterations_=this.iterations+1}computeGradients(e,t){return dC(e,t)}dispose(){this.iterations_!=null&&Ft(this.iterations_)}async saveIterations(){return this.iterations_==null&&(this.iterations_=0),{name:\"iter\",tensor:be(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(wr,Symbol.hasInstance,{value:r=>r.minimize!=null&&r.computeGradients!=null&&r.applyGradients!=null});var xi=class extends wr{constructor(e,t,o=null){super(),this.learningRate=e,this.rho=t,this.epsilon=o,this.accumulatedGrads=[],this.accumulatedUpdates=[],o==null&&(this.epsilon=N.backend.epsilon())}applyGradients(e){(Array.isArray(e)?e.map(o=>o.name):Object.keys(e)).forEach((o,n)=>{let s=N.registeredVariables[o],a=!1;this.accumulatedGrads[n]==null&&(this.accumulatedGrads[n]={originalName:`${o}/accum_grad`,variable:Ne(()=>Gt(s).variable(a))}),this.accumulatedUpdates[n]==null&&(this.accumulatedUpdates[n]={originalName:`${o}/accum_var`,variable:Ne(()=>Gt(s).variable(a))});let i=Array.isArray(e)?e[n].tensor:e[o];if(i==null)return;let p=this.accumulatedGrads[n].variable,u=this.accumulatedUpdates[n].variable;Ne(()=>{let c=ge(oe(p,this.rho),oe(Zt(i),1-this.rho)),l=oe(We(Rr(ge(u,this.epsilon)),Rr(ge(p,this.epsilon))),i),m=ge(oe(u,this.rho),oe(Zt(l),1-this.rho));p.assign(c),u.assign(m);let f=ge(oe(l,-this.learningRate),s);s.assign(f)})}),this.incrementIterations()}dispose(){this.accumulatedUpdates!=null&&(Ft(this.accumulatedGrads.map(e=>e.variable)),Ft(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,o=!1;this.accumulatedGrads=e.slice(0,t).map(n=>({originalName:n.name,variable:n.tensor.variable(o)})),this.accumulatedUpdates=e.slice(t,t*2).map(n=>({originalName:n.name,variable:n.tensor.variable(o)}))}getConfig(){return{learningRate:this.learningRate,rho:this.rho,epsilon:this.epsilon}}static fromConfig(e,t){return new e(t.learningRate,t.rho,t.epsilon)}};xi.className=\"Adadelta\";$r(xi);var yi=class extends wr{constructor(e,t=.1){super(),this.learningRate=e,this.initialAccumulatorValue=t,this.accumulatedGrads=[]}applyGradients(e){(Array.isArray(e)?e.map(o=>o.name):Object.keys(e)).forEach((o,n)=>{let s=N.registeredVariables[o];this.accumulatedGrads[n]==null&&(this.accumulatedGrads[n]={originalName:`${o}/accumulator`,variable:Ne(()=>Bs(s.shape,this.initialAccumulatorValue).variable(!1))});let a=Array.isArray(e)?e[n].tensor:e[o];if(a==null)return;let i=this.accumulatedGrads[n].variable;Ne(()=>{let p=ge(i,Zt(a));i.assign(p);let u=ge(oe(We(a,Rr(ge(p,N.backend.epsilon()))),-this.learningRate),s);s.assign(u)})}),this.incrementIterations()}dispose(){this.accumulatedGrads!=null&&Ft(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(o=>({originalName:o.name,variable:o.tensor.variable(t)}))}getConfig(){return{learningRate:this.learningRate,initialAccumulatorValue:this.initialAccumulatorValue}}static fromConfig(e,t){return new e(t.learningRate,t.initialAccumulatorValue)}};yi.className=\"Adagrad\";$r(yi);var bi=class extends wr{constructor(e,t,o,n=null){super(),this.learningRate=e,this.beta1=t,this.beta2=o,this.epsilon=n,this.accumulatedFirstMoment=[],this.accumulatedSecondMoment=[],Ne(()=>{this.accBeta1=be(t).variable(),this.accBeta2=be(o).variable()}),n==null&&(this.epsilon=N.backend.epsilon())}applyGradients(e){let t=Array.isArray(e)?e.map(o=>o.name):Object.keys(e);Ne(()=>{let o=ke(1,this.accBeta1),n=ke(1,this.accBeta2);t.forEach((s,a)=>{let i=N.registeredVariables[s],p=!1;this.accumulatedFirstMoment[a]==null&&(this.accumulatedFirstMoment[a]={originalName:`${s}/m`,variable:Ne(()=>Gt(i).variable(p))}),this.accumulatedSecondMoment[a]==null&&(this.accumulatedSecondMoment[a]={originalName:`${s}/v`,variable:Ne(()=>Gt(i).variable(p))});let u=Array.isArray(e)?e[a].tensor:e[s];if(u==null)return;let c=this.accumulatedFirstMoment[a].variable,l=this.accumulatedSecondMoment[a].variable,m=ge(oe(c,this.beta1),oe(u,1-this.beta1)),f=ge(oe(l,this.beta2),oe(Zt(u),1-this.beta2)),d=We(m,o),h=We(f,n);c.assign(m),l.assign(f);let g=ge(oe(We(d,ge(Rr(h),this.epsilon)),-this.learningRate),i);i.assign(g)}),this.accBeta1.assign(oe(this.accBeta1,this.beta1)),this.accBeta2.assign(oe(this.accBeta2,this.beta2))}),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.accBeta2.dispose(),this.accumulatedFirstMoment!=null&&Ft(this.accumulatedFirstMoment.map(e=>e.variable)),this.accumulatedSecondMoment!=null&&Ft(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),Ne(()=>{this.accBeta1.assign(Na(this.beta1,this.iterations_+1)),this.accBeta2.assign(Na(this.beta2,this.iterations_+1))});let t=e.length/2,o=!1;this.accumulatedFirstMoment=e.slice(0,t).map(n=>({originalName:n.name,variable:n.tensor.variable(o)})),this.accumulatedSecondMoment=e.slice(t,t*2).map(n=>({originalName:n.name,variable:n.tensor.variable(o)}))}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)}};bi.className=\"Adam\";$r(bi);var Ci=class extends wr{constructor(e,t,o,n=null,s=0){super(),this.learningRate=e,this.beta1=t,this.beta2=o,this.epsilon=n,this.decay=s,this.accumulatedFirstMoment=[],this.accumulatedWeightedInfNorm=[],Ne(()=>{this.iteration=be(0).variable(),this.accBeta1=be(t).variable()}),n==null&&(this.epsilon=N.backend.epsilon())}applyGradients(e){let t=Array.isArray(e)?e.map(o=>o.name):Object.keys(e);Ne(()=>{let o=ke(1,this.accBeta1),n=We(-this.learningRate,ge(oe(this.iteration,this.decay),1));t.forEach((s,a)=>{let i=N.registeredVariables[s],p=!1;this.accumulatedFirstMoment[a]==null&&(this.accumulatedFirstMoment[a]={originalName:`${s}/m`,variable:Gt(i).variable(p)}),this.accumulatedWeightedInfNorm[a]==null&&(this.accumulatedWeightedInfNorm[a]={originalName:`${s}/v`,variable:Gt(i).variable(p)});let u=Array.isArray(e)?e[a].tensor:e[s];if(u==null)return;let c=this.accumulatedFirstMoment[a].variable,l=this.accumulatedWeightedInfNorm[a].variable,m=ge(oe(c,this.beta1),oe(u,1-this.beta1)),f=oe(l,this.beta2),d=Qt(u),h=Rf(f,d);c.assign(m),l.assign(h);let g=ge(oe(We(n,o),We(m,ge(h,this.epsilon))),i);i.assign(g)}),this.iteration.assign(ge(this.iteration,1)),this.accBeta1.assign(oe(this.accBeta1,this.beta1))}),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.iteration.dispose(),this.accumulatedFirstMoment!=null&&Ft(this.accumulatedFirstMoment.map(e=>e.variable)),this.accumulatedWeightedInfNorm!=null&&Ft(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)}};Ci.className=\"Adamax\";$r(Ci);var Us=class extends wr{constructor(e){super(),this.learningRate=e,this.setLearningRate(e)}applyGradients(e){(Array.isArray(e)?e.map(o=>o.name):Object.keys(e)).forEach((o,n)=>{let s=Array.isArray(e)?e[n].tensor:e[o];if(s==null)return;let a=N.registeredVariables[o];Ne(()=>{let i=ge(oe(this.c,s),a);a.assign(i)})}),this.incrementIterations()}setLearningRate(e){this.learningRate=e,this.c!=null&&this.c.dispose(),this.c=So(be(-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)}};Us.className=\"SGD\";$r(Us);var Ii=class extends Us{constructor(e,t,o=!1){super(e),this.learningRate=e,this.momentum=t,this.useNesterov=o,this.accumulations=[],this.m=be(this.momentum)}applyGradients(e){(Array.isArray(e)?e.map(o=>o.name):Object.keys(e)).forEach((o,n)=>{let s=N.registeredVariables[o];this.accumulations[n]==null&&(this.accumulations[n]={originalName:`${o}/momentum`,variable:Ne(()=>Gt(s).variable(!1))});let a=this.accumulations[n].variable,i=Array.isArray(e)?e[n].tensor:e[o];i!=null&&Ne(()=>{let p,u=ge(oe(this.m,a),i);this.useNesterov?p=ge(oe(this.c,ge(i,oe(u,this.m))),s):p=ge(oe(this.c,u),s),a.assign(u),s.assign(p)})}),this.incrementIterations()}dispose(){this.m.dispose(),this.accumulations!=null&&Ft(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(o=>({originalName:o.name,variable:o.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)}};Ii.className=\"Momentum\";$r(Ii);var wi=class extends wr{constructor(e,t=.9,o=0,n=null,s=!1){if(super(),this.learningRate=e,this.decay=t,this.momentum=o,this.epsilon=n,this.accumulatedMeanSquares=[],this.accumulatedMoments=[],this.accumulatedMeanGrads=[],this.centered=s,n==null&&(this.epsilon=N.backend.epsilon()),e==null)throw new Error(\"learningRate for RMSPropOptimizer must be defined.\")}applyGradients(e){(Array.isArray(e)?e.map(o=>o.name):Object.keys(e)).forEach((o,n)=>{let s=N.registeredVariables[o],a=!1;this.accumulatedMeanSquares[n]==null&&(this.accumulatedMeanSquares[n]={originalName:`${o}/rms`,variable:Ne(()=>Gt(s).variable(a))}),this.accumulatedMoments[n]==null&&(this.accumulatedMoments[n]={originalName:`${o}/momentum`,variable:Ne(()=>Gt(s).variable(a))}),this.accumulatedMeanGrads[n]==null&&this.centered&&(this.accumulatedMeanGrads[n]={originalName:`${o}/mg`,variable:Ne(()=>Gt(s).variable(a))});let i=Array.isArray(e)?e[n].tensor:e[o];if(i==null)return;let p=this.accumulatedMeanSquares[n].variable,u=this.accumulatedMoments[n].variable;Ne(()=>{let c=ge(oe(p,this.decay),oe(Zt(i),1-this.decay));if(this.centered){let l=this.accumulatedMeanGrads[n].variable,m=ge(oe(l,this.decay),oe(i,1-this.decay)),f=We(oe(i,this.learningRate),Rr(ke(c,ge(Zt(m),this.epsilon)))),d=ge(oe(u,this.momentum),f);p.assign(c),l.assign(m),u.assign(d);let h=ke(s,d);s.assign(h)}else{let l=ge(oe(p,this.decay),oe(Zt(i),1-this.decay)),m=ge(oe(u,this.momentum),We(oe(i,this.learningRate),Rr(ge(l,this.epsilon))));p.assign(l),u.assign(m);let f=ke(s,m);s.assign(f)}})}),this.incrementIterations()}dispose(){this.accumulatedMeanSquares!=null&&Ft(this.accumulatedMeanSquares.map(e=>e.variable)),this.accumulatedMeanGrads!=null&&this.centered&&Ft(this.accumulatedMeanGrads.map(e=>e.variable)),this.accumulatedMoments!=null&&Ft(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,o=!1;this.accumulatedMeanSquares=e.slice(0,t).map(n=>({originalName:n.name,variable:n.tensor.variable(o)})),this.accumulatedMoments=e.slice(t,t*2).map(n=>({originalName:n.name,variable:n.tensor.variable(o)})),this.centered&&(this.accumulatedMeanGrads=e.slice(t*2,t*3).map(n=>({originalName:n.name,variable:n.tensor.variable(o)})))}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)}};wi.className=\"RMSProp\";$r(wi);var ns=class{static sgd(e){return new Us(e)}static momentum(e,t,o=!1){return new Ii(e,t,o)}static rmsprop(e,t=.9,o=0,n=null,s=!1){return new wi(e,t,o,n,s)}static adam(e=.001,t=.9,o=.999,n=null){return new bi(e,t,o,n)}static adadelta(e=.001,t=.95,o=null){return new xi(e,t,o)}static adamax(e=.002,t=.9,o=.999,n=null,s=0){return new Ci(e,t,o,n,s)}static adagrad(e,t=.1){return new yi(e,t)}};var pMe={sgd:ns.sgd,momentum:ns.momentum,adadelta:ns.adadelta,adagrad:ns.adagrad,rmsprop:ns.rmsprop,adamax:ns.adamax,adam:ns.adam};var qq=(()=>typeof requestAnimationFrame!=\"undefined\"?requestAnimationFrame:typeof setImmediate!=\"undefined\"?setImmediate:r=>r())();function kC(){return new Promise(r=>qq(()=>r()))}var I={};Be(I,{ERF_A1:()=>pK,ERF_A2:()=>cK,ERF_A3:()=>lK,ERF_A4:()=>mK,ERF_A5:()=>fK,ERF_P:()=>uK,PARALLELIZE_THRESHOLD:()=>ed,RowPartitionType:()=>Gs,SELU_SCALE:()=>iK,SELU_SCALEALPHA:()=>aK,applyActivation:()=>yu,assertAndGetBroadcastShape:()=>Je,assertAxesAreInnerMostDims:()=>fG,assertParamsConsistent:()=>Kq,assignToTypedArray:()=>bK,axesAreInnerMostDims:()=>fC,calculateShapes:()=>kv,checkEinsumDimSizes:()=>kK,checkPadOnDimRoundingMode:()=>Ot,combineLocations:()=>$k,combineRaggedTensorToTensorShapes:()=>Xq,complexWithEvenIndex:()=>gK,complexWithOddIndex:()=>xK,computeConv2DInfo:()=>uu,computeConv3DInfo:()=>Zv,computeDefaultPad:()=>mC,computeDilation2DInfo:()=>dU,computeOptimalWindowSize:()=>Jq,computeOutAndReduceShapes:()=>mG,computeOutShape:()=>jq,computePool2DInfo:()=>lC,computePool3DInfo:()=>hU,convertConv2DDataFormat:()=>Jv,decodeEinsumEquation:()=>SK,eitherStridesOrDilationsAreOne:()=>lr,expandShapeToKeepDim:()=>Ta,exponent:()=>IK,exponents:()=>CK,fromStringArrayToUint8:()=>qK,fromUint8ToStringArray:()=>HK,getAxesPermutation:()=>dG,getBroadcastDims:()=>Iv,getComplexWithIndex:()=>yK,getEinsumComputePath:()=>TK,getEinsumPermutation:()=>vK,getFusedBiasGradient:()=>xu,getFusedDyActivation:()=>gu,getImageCenter:()=>eK,getInnerMostAxes:()=>gG,getPermuted:()=>rK,getRaggedRank:()=>Qq,getReductionAxes:()=>nf,getReshaped:()=>tK,getReshapedPermuted:()=>oK,getRowPartitionTypesHelper:()=>Yq,getSliceBeginCoords:()=>nK,getSliceSize:()=>sK,getSparseFillEmptyRowsIndicesDenseShapeMismatch:()=>$K,getSparseFillEmptyRowsNegativeIndexErrorMessage:()=>RK,getSparseFillEmptyRowsOutOfRangeIndexErrorMessage:()=>AK,getSparseReshapeEmptyTensorZeroOutputDimErrorMessage:()=>PK,getSparseReshapeInputOutputMismatchErrorMessage:()=>MK,getSparseReshapeInputOutputMultipleErrorMessage:()=>OK,getSparseReshapeMultipleNegativeOneOutputDimErrorMessage:()=>FK,getSparseReshapeNegativeOutputDimErrorMessage:()=>DK,getSparseSegmentReductionIndicesOutOfRangeErrorMessage:()=>zK,getSparseSegmentReductionNegativeSegmentIdsErrorMessage:()=>LK,getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage:()=>BK,getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage:()=>VK,getUndoAxesPermutation:()=>hG,isIdentityPermutation:()=>NK,log:()=>Sz,mergeRealAndImagArrays:()=>dK,prepareAndValidate:()=>vv,prepareSplitSize:()=>EK,segment_util:()=>NC,shouldFuse:()=>bu,slice_util:()=>et,splitRealAndImagArrays:()=>hK,tupleValuesAreOne:()=>iu,upcastType:()=>ct,validateDefaultValueShape:()=>Zq,validateInput:()=>uf,validateUpdateShape:()=>aC,warn:()=>Rs});function Kq(r,e){let t=r[0].length;r.forEach((n,s)=>{$(n.length===t,()=>`Error in concat${t}D: rank of tensors[${s}] must be the same as the rank of the rest (${t})`)}),$(e>=0&&e`Error in concat${t}D: axis must be between 0 and ${t-1}.`);let o=r[0];r.forEach((n,s)=>{for(let a=0;a`Error in concat${t}D: Shape of tensors[${s}] (${n}) does not match the shape of the rest (${o}) along the non-concatenated axis ${s}.`)})}function jq(r,e){let t=r[0].slice();for(let o=1;o=0)if(i>=0){if(i!==s)throw new Error(`rt input.shape and shape=${e} are incompatible: rt input.shape[${n+r}] = ${s} but shape[${n+r}] = ${i}`)}else o[a]=s}return o}function Yq(r){let e={FIRST_DIM_SIZE:Gs.FIRST_DIM_SIZE,VALUE_ROWIDS:Gs.VALUE_ROWIDS,ROW_LENGTHS:Gs.ROW_LENGTHS,ROW_SPLITS:Gs.ROW_SPLITS,ROW_LIMITS:Gs.ROW_LIMITS,ROW_STARTS:Gs.ROW_STARTS},t=[];for(let o of r)if(o in e)t.push(e[o]);else break;return t}function Qq(r){return r.length===0?0:r[0]===Gs.FIRST_DIM_SIZE?r.length-1:r.length}function Zq(r,e){if(r==null||e==null)return;let t=r.length,o=e.length;if(t>=o)throw new Error(`defaultValue.shape=${r} and ragged tensor flatValues.shape=${e}, are incompatible: defaultValue.rank = ${t} must be less than ragged tensor input flatValues.rank = ${o})`);for(let n=0;n=0&&a>=0&&s!==1&&s!==a)throw new Error(`defaultValue.shape=${r}, and ragged tensor input flatValues.shape=${e} are incompatible: defaultValue.shape[${n-r.length}] = ${s} but ragged tensor input.flatValues.shape[${n-r.length}] = ${a}`)}}var ed=30;function Jq(r){return r<=ed?r:sp(r,Math.floor(Math.sqrt(r)))}function eK(r,e,t){let o=t*(typeof r==\"number\"?r:r[0]),n=e*(typeof r==\"number\"?r:r[1]);return[o,n]}function tK(r,e,t,o=!0){let n=[];if(o)n=n.concat(e.slice(0)),n.push(r[0]/t),n=n.concat(r.slice(1));else{n=n.concat(r[0]);let s=e.length;for(let a=0;a=e*2+1||a%2===1?s.push(a):n.push(a);o.push(...n),o.push(0),o.push(...s)}return o}function oK(r,e,t,o=!0){let n=[];o?n.push(r[0]/t):n.push(r[0]*t);for(let s=1;s\",wK=/->/g,KT=\",\",jT=\"...\";function SK(r,e){r=r.replace(/\\s/g,\"\");let t=(r.length-r.replace(wK,\"\").length)/TC.length;if(t<1)throw new Error(\"Equations without an arrow are not supported.\");if(t>1)throw new Error(`Equation must contain exactly one arrow (\"${TC}\").`);let[o,n]=r.split(TC);$(o.indexOf(jT)===-1,()=>`The ellipsis notation (\"${jT}\") is not supported yet.`);let s=o.split(KT),a=s.length;if(e!==a)throw new Error(`Expected ${a} input tensors, received ${e}`);if(a>2)throw new Error(\"Support for more than 2 input tensors is not implemented yet.\");let i=[];for(let m=0;md.indexOf(f)!==-1))throw new Error(`Output subscripts contain the label ${f} not present in the input subscripts.`);i.indexOf(f)===-1&&i.push(f)}for(let m=0;mn!==-1),{permutationIndices:t,expandDims:o}}function kK(r,e,t){let o=new Array(r);for(let n=0;n`Expected dimension ${o[e[n][a]]} at axis ${a} of input shaped ${JSON.stringify(s)}, but got dimension ${s[a]}`)}}function TK(r,e){let t=r,o=[],n=0;r.length===0&&t.push(-1),n=r.length+1;for(let a=0;ae===t)}function _K(r,e){let t=[];for(let o=0;o\"Number of splits must evenly divide the axis.\"),o=new Array(e).fill(r.shape[t]/e);else{let n=e.reduce((a,i)=>(i===-1&&(a+=1),a),0);$(n<=1,()=>\"There should be only one negative value in split array.\");let s=e.indexOf(-1);if(s!==-1){let a=e.reduce((i,p)=>p>0?i+p:i);e[s]=r.shape[t]-a}$(r.shape[t]===e.reduce((a,i)=>a+i),()=>\"The sum of sizes must match the size of the axis dimension.\"),o=e}return o}function $K(r){return`Received SparseTensor with denseShape[0] = 0 but\n indices.shape[0] = ${r}`}function RK(r,e){return`indices(${r}, 0) is invalid: ${e} < 0`}function AK(r,e,t){return`indices(${r}, 0) is invalid: ${e} >= ${t}`}function FK(r,e){return`only one output dimension may be -1, not both ${r} and ${e}`}function DK(r,e){return`size ${r} must be non-negative, not ${e}`}function PK(){return\"reshape cannot infer the missing input size for an empty tensor unless all specified input sizes are non-zero\"}function OK(r,e){let t=Ve(r),o=Ve(e);return`Input to reshape is a SparseTensor with ${t}\n dense values, but the requested shape requires a multiple of ${o}. inputShape=${r} outputShape= ${e}`}function MK(r,e){let t=Ve(r),o=Ve(e);return`Input to reshape is a tensor with ${t} dense values, but the requested shape has ${o}. inputShape=${r} outputShape=${e}`}function LK(){return\"segment ids must be >= 0\"}function BK(){return\"segment ids are not increasing\"}function VK(r,e){return`Segment id ${r} out of range [0, ${e}), possibly because segmentIds input is not sorted.`}function zK(r,e,t){return`Bad: indices[${r}] == ${e} out of range [0, ${t})`}var NC={};Be(NC,{collectGatherOpShapeInfo:()=>GK,computeOutShape:()=>UK,segOpComputeOptimalWindowSize:()=>WK});function WK(r,e){let t=!1,o;for(r<=ed?(o=r,t=!0):o=sp(r,Math.floor(Math.sqrt(r)));!t;)o>e||o===r?t=!0:o=sp(r,o+1);return o}function UK(r,e,t){let o=[],n=r.length;for(let s=0;sn))throw new Error(`Expect batchDims in the range of [-${n}, ${n}], but got ${o}`);if(o<0&&(o+=n),o>s)throw new Error(`batchDims (${o}) must be less than rank(x) (\n ${s}).`);if(tOp(e))}catch(e){throw new Error(`Failed to decode encoded string bytes into utf-8, error: ${e}`)}}function qK(r){return r.map(e=>si(e))}var Bt={};Be(Bt,{nonMaxSuppressionV3Impl:()=>Qf,nonMaxSuppressionV4Impl:()=>Zf,nonMaxSuppressionV5Impl:()=>Jf,whereImpl:()=>Kf});var KK=P();KK.registerFlag(\"KEEP_INTERMEDIATE_TENSORS\",()=>!1,r=>{r&&console.warn(\"Keep intermediate tensors is ON. This will print the values of all intermediate tensors during model inference. Not all models support this mode. For details, check e2e/benchmarks/ model_config.js. This significantly impacts performance.\")});var To;(function(r){r[r.DT_INVALID=0]=\"DT_INVALID\",r[r.DT_FLOAT=1]=\"DT_FLOAT\",r[r.DT_DOUBLE=2]=\"DT_DOUBLE\",r[r.DT_INT32=3]=\"DT_INT32\",r[r.DT_UINT8=4]=\"DT_UINT8\",r[r.DT_INT16=5]=\"DT_INT16\",r[r.DT_INT8=6]=\"DT_INT8\",r[r.DT_STRING=7]=\"DT_STRING\",r[r.DT_COMPLEX64=8]=\"DT_COMPLEX64\",r[r.DT_INT64=9]=\"DT_INT64\",r[r.DT_BOOL=10]=\"DT_BOOL\",r[r.DT_QINT8=11]=\"DT_QINT8\",r[r.DT_QUINT8=12]=\"DT_QUINT8\",r[r.DT_QINT32=13]=\"DT_QINT32\",r[r.DT_BFLOAT16=14]=\"DT_BFLOAT16\",r[r.DT_QINT16=15]=\"DT_QINT16\",r[r.DT_QUINT16=16]=\"DT_QUINT16\",r[r.DT_UINT16=17]=\"DT_UINT16\",r[r.DT_COMPLEX128=18]=\"DT_COMPLEX128\",r[r.DT_HALF=19]=\"DT_HALF\",r[r.DT_RESOURCE=20]=\"DT_RESOURCE\",r[r.DT_VARIANT=21]=\"DT_VARIANT\",r[r.DT_UINT32=22]=\"DT_UINT32\",r[r.DT_UINT64=23]=\"DT_UINT64\",r[r.DT_FLOAT_REF=101]=\"DT_FLOAT_REF\",r[r.DT_DOUBLE_REF=102]=\"DT_DOUBLE_REF\",r[r.DT_INT32_REF=103]=\"DT_INT32_REF\",r[r.DT_UINT8_REF=104]=\"DT_UINT8_REF\",r[r.DT_INT16_REF=105]=\"DT_INT16_REF\",r[r.DT_INT8_REF=106]=\"DT_INT8_REF\",r[r.DT_STRING_REF=107]=\"DT_STRING_REF\",r[r.DT_COMPLEX64_REF=108]=\"DT_COMPLEX64_REF\",r[r.DT_INT64_REF=109]=\"DT_INT64_REF\",r[r.DT_BOOL_REF=110]=\"DT_BOOL_REF\",r[r.DT_QINT8_REF=111]=\"DT_QINT8_REF\",r[r.DT_QUINT8_REF=112]=\"DT_QUINT8_REF\",r[r.DT_QINT32_REF=113]=\"DT_QINT32_REF\",r[r.DT_BFLOAT16_REF=114]=\"DT_BFLOAT16_REF\",r[r.DT_QINT16_REF=115]=\"DT_QINT16_REF\",r[r.DT_QUINT16_REF=116]=\"DT_QUINT16_REF\",r[r.DT_UINT16_REF=117]=\"DT_UINT16_REF\",r[r.DT_COMPLEX128_REF=118]=\"DT_COMPLEX128_REF\",r[r.DT_HALF_REF=119]=\"DT_HALF_REF\",r[r.DT_RESOURCE_REF=120]=\"DT_RESOURCE_REF\",r[r.DT_VARIANT_REF=121]=\"DT_VARIANT_REF\",r[r.DT_UINT32_REF=122]=\"DT_UINT32_REF\",r[r.DT_UINT64_REF=123]=\"DT_UINT64_REF\"})(To||(To={}));var XT;(function(r){let e;(function(t){t[t.LEGACY=0]=\"LEGACY\",t[t.V1=1]=\"V1\",t[t.V2=2]=\"V2\"})(e=r.CheckpointFormatVersion||(r.CheckpointFormatVersion={}))})(XT||(XT={}));var EC={};function XK(r,e){let t={tfOpName:r,category:\"custom\",inputs:[],attrs:[],customExecutor:e};EC[r]=t}function td(r){return EC[r]}function YK(r){delete EC[r]}function S(r,e,t,o,n){let s=e.inputParams[r];if(s&&s.inputIndexStart!==void 0){let i=s.inputIndexStart,p=s.inputIndexEnd===0?void 0:s.inputIndexEnd===void 0?i+1:s.inputIndexEnd;if(s.type===\"tensor\")return Ht(e.inputNames[s.inputIndexStart],t,o,n);if(s.type===\"tensors\")return e.inputNames.slice(i,p).map(m=>Ht(m,t,o,n));let u=Ht(e.inputNames.slice(i)[0],t,o,n),c=u.dataSync();return s.type===\"number\"?c[0]:x.toNestedArray(u.shape,c)}let a=e.attrParams[r];return a&&a.value}function Ht(r,e,t,o){let[n,s]=Sr(r);if(o!=null){let i=o.getHashTableHandleByName(n);if(i!=null)return i}let a=t.currentContextIds.find(i=>!!e[rd(n,i)]);return a!==void 0?e[rd(n,a)][s]:void 0}function YT(r,e,t){return e[rd(r,t.currentContextId)]}function zo(r,e){let[t,o,n]=Sr(r);return[rd(t,e&&e.currentContextId),o,n]}function rd(r,e){return e?`${r}-${e}`:r}function Sr(r){let e=r.split(\":\");if(e.length===1)return[r,0,void 0];let t=e[0],o=e.length===3?e[1]:void 0,n=Number(e[e.length-1]);return[t,n,o]}function gl(r,e,t){let o=S(\"pad\",r,e,t);if(o===\"explicit\"){o=S(\"explicitPaddings\",r,e,t);let n=[[0,0],[0,0],[0,0],[0,0]];for(let s=0;s<4;s++)n[s][0]=o[s*2],n[s][1]=o[s*2+1];return n}return o}function ss(r){return r.kept?r:zr(r)}var $C={};Be($C,{json:()=>QK});var QK=[{tfOpName:\"Add\",category:\"arithmetic\",inputs:[{start:0,name:\"a\",type:\"tensor\"},{start:1,name:\"b\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"AddV2\",category:\"arithmetic\",inputs:[{start:0,name:\"a\",type:\"tensor\"},{start:1,name:\"b\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"AddN\",category:\"arithmetic\",inputs:[{start:0,end:0,name:\"tensors\",type:\"tensors\"}]},{tfOpName:\"BiasAdd\",category:\"arithmetic\",inputs:[{start:0,name:\"a\",type:\"tensor\"},{start:1,name:\"b\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0},{tfName:\"data_format\",name:\"dataFormat\",type:\"string\",notSupported:!0}]},{tfOpName:\"Sub\",category:\"arithmetic\",inputs:[{start:0,name:\"a\",type:\"tensor\"},{start:1,name:\"b\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"RealDiv\",category:\"arithmetic\",inputs:[{start:0,name:\"a\",type:\"tensor\"},{start:1,name:\"b\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Div\",category:\"arithmetic\",inputs:[{start:0,name:\"a\",type:\"tensor\"},{start:1,name:\"b\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"DivNoNan\",category:\"arithmetic\",inputs:[{start:0,name:\"a\",type:\"tensor\"},{start:1,name:\"b\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"FloorDiv\",category:\"arithmetic\",inputs:[{start:0,name:\"a\",type:\"tensor\"},{start:1,name:\"b\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Mul\",category:\"arithmetic\",inputs:[{start:0,name:\"a\",type:\"tensor\"},{start:1,name:\"b\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Maximum\",category:\"arithmetic\",inputs:[{start:0,name:\"a\",type:\"tensor\"},{start:1,name:\"b\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Minimum\",category:\"arithmetic\",inputs:[{start:0,name:\"a\",type:\"tensor\"},{start:1,name:\"b\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Pow\",category:\"arithmetic\",inputs:[{start:0,name:\"a\",type:\"tensor\"},{start:1,name:\"b\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"SquaredDifference\",category:\"arithmetic\",inputs:[{start:0,name:\"a\",type:\"tensor\"},{start:1,name:\"b\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Mod\",category:\"arithmetic\",inputs:[{start:0,name:\"a\",type:\"tensor\"},{start:1,name:\"b\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"FloorMod\",category:\"arithmetic\",inputs:[{start:0,name:\"a\",type:\"tensor\"},{start:1,name:\"b\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]}];var RC={};Be(RC,{json:()=>ZK});var ZK=[{tfOpName:\"Abs\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Acos\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Asin\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Atan\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Atan2\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"y\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Ceil\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"ClipByValue\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"clipValueMin\",type:\"number\"},{start:2,name:\"clipValueMax\",type:\"number\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Complex\",category:\"basic_math\",inputs:[{start:0,name:\"real\",type:\"tensor\"},{start:1,name:\"imag\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"ComplexAbs\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Cos\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Cosh\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Elu\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Exp\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Floor\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Log\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Imag\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0},{tfName:\"Tout\",name:\"outputType\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Neg\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Real\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0},{tfName:\"Tout\",name:\"outputType\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Prelu\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"alpha\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Relu\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Relu6\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Selu\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Sigmoid\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Sin\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Sinh\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Sqrt\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Rsqrt\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Square\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Tan\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Tanh\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Sign\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Round\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Expm1\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Log1p\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Reciprocal\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Softplus\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Asinh\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Acosh\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Atanh\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Erf\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Prod\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"axes\",type:\"number[]\"}],attrs:[{tfName:\"keep_dims\",name:\"keepDims\",type:\"bool\",notSupported:!0},{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"LeakyRelu\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"alpha\",name:\"alpha\",type:\"number\",defaultValue:.2},{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"IsNan\",category:\"basic_math\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]}];var AC={};Be(AC,{json:()=>JK});var JK=[{tfOpName:\"EmptyTensorList\",category:\"control\",inputs:[{start:0,name:\"elementShape\",type:\"shape\"},{start:1,name:\"maxNumElements\",type:\"number\"}],attrs:[{tfName:\"element_dtype\",name:\"elementDType\",type:\"dtype\"}]},{tfOpName:\"LoopCond\",category:\"control\",inputs:[{start:0,name:\"pred\",type:\"tensor\"}]},{tfOpName:\"Switch\",category:\"control\",inputs:[{start:0,name:\"data\",type:\"tensor\"},{start:1,name:\"pred\",type:\"tensor\"}]},{tfOpName:\"Merge\",category:\"control\",inputs:[{start:0,end:0,name:\"tensors\",type:\"tensors\"}]},{tfOpName:\"Enter\",category:\"control\",inputs:[{start:0,name:\"tensor\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0},{tfName:\"frame_name\",name:\"frameName\",type:\"string\"},{tfName:\"is_constant\",name:\"isConstant\",type:\"bool\"}]},{tfOpName:\"Exit\",category:\"control\",inputs:[{start:0,name:\"tensor\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"NextIteration\",category:\"control\",inputs:[{start:0,name:\"tensor\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"TensorArrayV3\",category:\"control\",inputs:[{start:0,name:\"size\",type:\"number\"}],attrs:[{tfName:\"dtype\",name:\"dtype\",type:\"dtype\"},{tfName:\"element_shape\",name:\"elementShape\",type:\"shape\"},{tfName:\"dynamic_size\",name:\"dynamicSize\",type:\"bool\"},{tfName:\"clear_after_read\",name:\"clearAfterRead\",type:\"bool\"},{tfName:\"identical_element_shapes\",name:\"identicalElementShapes\",type:\"bool\"},{tfName:\"tensor_array_name\",name:\"name\",type:\"string\"}]},{tfOpName:\"TensorArrayWriteV3\",category:\"control\",inputs:[{start:0,name:\"tensorArrayId\",type:\"tensor\"},{start:1,name:\"index\",type:\"number\"},{start:2,name:\"tensor\",type:\"tensor\"},{start:3,name:\"flowIn\",type:\"number\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"TensorArrayReadV3\",category:\"control\",inputs:[{start:0,name:\"tensorArrayId\",type:\"tensor\"},{start:1,name:\"index\",type:\"number\"},{start:2,name:\"flowIn\",type:\"number\"}],attrs:[{tfName:\"dtype\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"TensorArrayGatherV3\",category:\"control\",inputs:[{start:0,name:\"tensorArrayId\",type:\"tensor\"},{start:1,name:\"indices\",type:\"number[]\"},{start:2,name:\"flowIn\",type:\"number\"}],attrs:[{tfName:\"dtype\",name:\"dtype\",type:\"dtype\"},{tfName:\"element_shape\",name:\"elementShape\",type:\"shape\"}]},{tfOpName:\"TensorArrayScatterV3\",category:\"control\",inputs:[{start:0,name:\"tensorArrayId\",type:\"tensor\"},{start:1,name:\"indices\",type:\"number[]\"},{start:2,name:\"tensor\",type:\"tensor\"},{start:3,name:\"flowIn\",type:\"number\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\"}]},{tfOpName:\"TensorArrayConcatV3\",category:\"control\",inputs:[{start:0,name:\"tensorArrayId\",type:\"tensor\"},{start:1,name:\"flowIn\",type:\"number\"}],attrs:[{tfName:\"dtype\",name:\"dtype\",type:\"dtype\"},{tfName:\"element_shape_except0\",name:\"elementShapeExcept0\",type:\"shape\",notSupported:!0}]},{tfOpName:\"TensorArraySplitV3\",category:\"control\",inputs:[{start:0,name:\"tensorArrayId\",type:\"tensor\"},{start:1,name:\"tensor\",type:\"tensor\"},{start:2,name:\"lengths\",type:\"number[]\"},{start:3,name:\"flowIn\",type:\"number\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\"}]},{tfOpName:\"TensorArraySizeV3\",category:\"control\",inputs:[{start:0,name:\"tensorArrayId\",type:\"tensor\"},{start:1,name:\"flowIn\",type:\"number\"}]},{tfOpName:\"TensorArrayCloseV3\",category:\"control\",inputs:[{start:0,name:\"tensorArrayId\",type:\"tensor\"}]},{tfOpName:\"StatelessIf\",category:\"control\",inputs:[{start:0,name:\"cond\",type:\"tensor\"},{start:1,end:0,name:\"args\",type:\"tensors\"}],attrs:[{tfName:\"then_branch\",name:\"thenBranch\",type:\"func\"},{tfName:\"else_branch\",name:\"elseBranch\",type:\"func\"}]},{tfOpName:\"If\",category:\"control\",inputs:[{start:0,name:\"cond\",type:\"tensor\"},{start:1,end:0,name:\"args\",type:\"tensors\"}],attrs:[{tfName:\"then_branch\",name:\"thenBranch\",type:\"func\"},{tfName:\"else_branch\",name:\"elseBranch\",type:\"func\"}]},{tfOpName:\"StatelessWhile\",category:\"control\",inputs:[{start:0,end:0,name:\"args\",type:\"tensors\"}],attrs:[{tfName:\"cond\",name:\"cond\",type:\"func\"},{tfName:\"body\",name:\"body\",type:\"func\"}]},{tfOpName:\"While\",category:\"control\",inputs:[{start:0,end:0,name:\"args\",type:\"tensors\"}],attrs:[{tfName:\"cond\",name:\"cond\",type:\"func\"},{tfName:\"body\",name:\"body\",type:\"func\"}]},{tfOpName:\"TensorListScatter\",category:\"control\",inputs:[{start:0,name:\"tensor\",type:\"tensor\"},{start:1,name:\"indices\",type:\"number[]\"},{start:2,name:\"elementShape\",type:\"shape\"}],attrs:[{tfName:\"element_dtype\",name:\"elementDType\",type:\"dtype\"}]},{tfOpName:\"TensorListScatterV2\",category:\"control\",inputs:[{start:0,name:\"tensor\",type:\"tensor\"},{start:1,name:\"indices\",type:\"number[]\"},{start:2,name:\"elementShape\",type:\"shape\"},{start:3,name:\"numElements\",type:\"number\"}],attrs:[{tfName:\"element_dtype\",name:\"elementDType\",type:\"dtype\"}]},{tfOpName:\"TensorListGather\",category:\"control\",inputs:[{start:0,name:\"tensorListId\",type:\"tensor\"},{start:1,name:\"indices\",type:\"number[]\"},{start:2,name:\"elementShape\",type:\"shape\"}],attrs:[{tfName:\"element_dtype\",name:\"elementDType\",type:\"dtype\"}]},{tfOpName:\"TensorListGetItem\",category:\"control\",inputs:[{start:0,name:\"tensorListId\",type:\"tensor\"},{start:1,name:\"index\",type:\"number\"},{start:2,name:\"elementShape\",type:\"shape\"}],attrs:[{tfName:\"element_dtype\",name:\"elementDType\",type:\"dtype\"}]},{tfOpName:\"TensorListSetItem\",category:\"control\",inputs:[{start:0,name:\"tensorListId\",type:\"tensor\"},{start:1,name:\"index\",type:\"number\"},{start:2,name:\"tensor\",type:\"tensor\"}],attrs:[{tfName:\"element_dtype\",name:\"elementDType\",type:\"dtype\"}]},{tfOpName:\"TensorListReserve\",category:\"control\",inputs:[{start:0,name:\"elementShape\",type:\"shape\"},{start:1,name:\"numElements\",type:\"number\"}],attrs:[{tfName:\"element_dtype\",name:\"elementDType\",type:\"dtype\"}]},{tfOpName:\"TensorListFromTensor\",category:\"control\",inputs:[{start:0,name:\"tensor\",type:\"tensor\"},{start:1,name:\"elementShape\",type:\"shape\"}],attrs:[{tfName:\"element_dtype\",name:\"elementDType\",type:\"dtype\"}]},{tfOpName:\"TensorListStack\",category:\"control\",inputs:[{start:0,name:\"tensorListId\",type:\"tensor\"},{start:1,name:\"elementShape\",type:\"shape\"}],attrs:[{tfName:\"element_dtype\",name:\"elementDType\",type:\"dtype\"},{tfName:\"num_elements\",name:\"numElements\",type:\"dtype\"}]},{tfOpName:\"TensorListSplit\",category:\"control\",inputs:[{start:0,name:\"tensor\",type:\"tensor\"},{start:1,name:\"elementShape\",type:\"shape\"},{start:2,name:\"lengths\",type:\"number[]\"}],attrs:[{tfName:\"element_dtype\",name:\"elementDType\",type:\"dtype\"}]},{tfOpName:\"TensorListConcat\",category:\"control\",inputs:[{start:0,name:\"tensorListId\",type:\"tensor\"}],attrs:[{tfName:\"element_shape\",name:\"elementShape\",type:\"shape\"},{tfName:\"element_dtype\",name:\"elementDType\",type:\"dtype\"}]},{tfOpName:\"TensorListConcatV2\",category:\"control\",inputs:[{start:0,name:\"tensorListId\",type:\"tensor\"}],attrs:[{tfName:\"element_shape\",name:\"elementShape\",type:\"shape\"},{tfName:\"element_dtype\",name:\"elementDType\",type:\"dtype\"}]},{tfOpName:\"TensorListPopBack\",category:\"control\",inputs:[{start:0,name:\"tensorListId\",type:\"tensor\"},{start:1,name:\"elementShape\",type:\"shape\"}],attrs:[{tfName:\"element_dtype\",name:\"elementDType\",type:\"dtype\"}]},{tfOpName:\"TensorListPushBack\",category:\"control\",inputs:[{start:0,name:\"tensorListId\",type:\"tensor\"},{start:1,name:\"tensor\",type:\"tensor\"}],attrs:[{tfName:\"element_dtype\",name:\"elementDType\",type:\"dtype\"}]},{tfOpName:\"TensorListLength\",category:\"control\",inputs:[{start:0,name:\"tensorListId\",type:\"tensor\"}]},{tfOpName:\"TensorListResize\",category:\"control\",inputs:[{start:0,name:\"tensorListId\",type:\"tensor\"},{start:1,name:\"size\",type:\"number\"}]}];var FC={};Be(FC,{json:()=>e6});var e6=[{tfOpName:\"AvgPool\",category:\"convolution\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"strides\",name:\"strides\",type:\"number[]\"},{tfName:\"padding\",name:\"pad\",type:\"string\"},{tfName:\"data_format\",name:\"dataFormat\",type:\"string\",notSupported:!0},{tfName:\"ksize\",name:\"kernelSize\",type:\"number[]\"},{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"MaxPool\",category:\"convolution\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"strides\",name:\"strides\",type:\"number[]\"},{tfName:\"padding\",name:\"pad\",type:\"string\"},{tfName:\"data_format\",name:\"dataFormat\",type:\"string\",notSupported:!0},{tfName:\"ksize\",name:\"kernelSize\",type:\"number[]\"},{tfName:\"explicit_paddings\",name:\"explicitPaddings\",type:\"number[]\",defaultValue:[],notSupported:!0},{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"MaxPoolWithArgmax\",category:\"convolution\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"strides\",name:\"strides\",type:\"number[]\"},{tfName:\"padding\",name:\"pad\",type:\"string\"},{tfName:\"ksize\",name:\"kernelSize\",type:\"number[]\"},{tfName:\"include_batch_in_index\",name:\"includeBatchInIndex\",type:\"bool\"},{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"AvgPool3D\",category:\"convolution\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"strides\",name:\"strides\",type:\"number[]\"},{tfName:\"padding\",name:\"pad\",type:\"string\"},{tfName:\"data_format\",name:\"dataFormat\",type:\"string\",notSupported:!0},{tfName:\"ksize\",name:\"kernelSize\",type:\"number[]\"},{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"MaxPool3D\",category:\"convolution\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"strides\",name:\"strides\",type:\"number[]\"},{tfName:\"padding\",name:\"pad\",type:\"string\"},{tfName:\"data_format\",name:\"dataFormat\",type:\"string\",notSupported:!0},{tfName:\"ksize\",name:\"kernelSize\",type:\"number[]\"},{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Conv1D\",category:\"convolution\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"filter\",type:\"tensor\"}],attrs:[{tfName:\"stride\",name:\"stride\",type:\"number\"},{tfName:\"padding\",name:\"pad\",type:\"string\"},{tfName:\"data_format\",name:\"dataFormat\",type:\"string\",defaultValue:\"NWC\"},{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0},{tfName:\"dilation\",name:\"dilation\",type:\"number\",defaultValue:1}]},{tfOpName:\"Conv2D\",category:\"convolution\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"filter\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0},{tfName:\"strides\",name:\"strides\",type:\"number[]\"},{tfName:\"padding\",name:\"pad\",type:\"string\"},{tfName:\"useCudnnOnGpu\",name:\"useCudnnOnGpu\",type:\"bool\"},{tfName:\"data_format\",name:\"dataFormat\",type:\"string\",defaultValue:\"NHWC\"},{tfName:\"explicit_paddings\",name:\"explicitPaddings\",type:\"number[]\",defaultValue:[]},{tfName:\"dilations\",name:\"dilations\",type:\"number[]\"}]},{tfOpName:\"_FusedConv2D\",category:\"convolution\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"filter\",type:\"tensor\"},{start:2,end:0,name:\"args\",type:\"tensors\"}],attrs:[{tfName:\"num_args\",name:\"numArgs\",type:\"number\"},{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0},{tfName:\"strides\",name:\"strides\",type:\"number[]\"},{tfName:\"padding\",name:\"pad\",type:\"string\"},{tfName:\"explicit_paddings\",name:\"explicitPaddings\",type:\"number[]\",defaultValue:[]},{tfName:\"use_cudnn_on_gpu\",name:\"useCudnnOnGpu\",type:\"bool\",defaultValue:!0},{tfName:\"data_format\",name:\"dataFormat\",type:\"string\",defaultValue:\"NHWC\"},{tfName:\"dilations\",name:\"dilations\",type:\"number[]\",defaultValue:[1,1,1,1]},{tfName:\"fused_ops\",name:\"fusedOps\",type:\"string[]\",defaultValue:[]},{tfName:\"epsilon\",name:\"epsilon\",type:\"number\",defaultValue:1e-4},{tfName:\"leakyrelu_alpha\",name:\"leakyreluAlpha\",type:\"number\",defaultValue:.2}]},{tfOpName:\"Conv2DBackpropInput\",category:\"convolution\",inputs:[{start:2,name:\"x\",type:\"tensor\"},{start:1,name:\"filter\",type:\"tensor\"},{start:0,name:\"outputShape\",type:\"number[]\"}],attrs:[{tfName:\"strides\",name:\"strides\",type:\"number[]\"},{tfName:\"padding\",name:\"pad\",type:\"string\"},{tfName:\"data_format\",name:\"dataFormat\",type:\"string\",notSupported:!0},{tfName:\"explicit_paddings\",name:\"explicitPaddings\",type:\"number[]\",defaultValue:[]},{tfName:\"dilations\",name:\"dilations\",type:\"number[]\",notSupported:!0}]},{tfOpName:\"DepthwiseConv2d\",category:\"convolution\",inputs:[{start:0,name:\"input\",type:\"tensor\"},{start:1,name:\"filter\",type:\"tensor\"}],attrs:[{tfName:\"strides\",name:\"strides\",type:\"number[]\"},{tfName:\"padding\",name:\"pad\",type:\"string\"},{tfName:\"data_format\",name:\"dataFormat\",type:\"string\",defaultValue:\"NHWC\"},{tfName:\"explicit_paddings\",name:\"explicitPaddings\",type:\"number[]\",defaultValue:[]},{tfName:\"dilations\",name:\"dilations\",type:\"number[]\"}]},{tfOpName:\"DepthwiseConv2dNative\",category:\"convolution\",inputs:[{start:0,name:\"input\",type:\"tensor\"},{start:1,name:\"filter\",type:\"tensor\"}],attrs:[{tfName:\"strides\",name:\"strides\",type:\"number[]\"},{tfName:\"padding\",name:\"pad\",type:\"string\"},{tfName:\"data_format\",name:\"dataFormat\",type:\"string\",defaultValue:\"NHWC\"},{tfName:\"explicit_paddings\",name:\"explicitPaddings\",type:\"number[]\",defaultValue:[]},{tfName:\"dilations\",name:\"dilations\",type:\"number[]\"}]},{tfOpName:\"FusedDepthwiseConv2dNative\",category:\"convolution\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"filter\",type:\"tensor\"},{start:2,end:0,name:\"args\",type:\"tensors\"}],attrs:[{tfName:\"num_args\",name:\"numArgs\",type:\"number\"},{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0},{tfName:\"strides\",name:\"strides\",type:\"number[]\"},{tfName:\"padding\",name:\"pad\",type:\"string\"},{tfName:\"data_format\",name:\"dataFormat\",type:\"string\",defaultValue:\"NHWC\"},{tfName:\"dilations\",name:\"dilations\",type:\"number[]\",defaultValue:[1,1,1,1]},{tfName:\"fused_ops\",name:\"fusedOps\",type:\"string[]\",defaultValue:[]},{tfName:\"explicit_paddings\",name:\"explicitPaddings\",type:\"number[]\",defaultValue:[]}]},{tfOpName:\"Conv3D\",category:\"convolution\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"filter\",type:\"tensor\"}],attrs:[{tfName:\"strides\",name:\"strides\",type:\"number[]\"},{tfName:\"padding\",name:\"pad\",type:\"string\"},{tfName:\"data_format\",name:\"dataFormat\",type:\"string\",defaultValue:\"NHWC\"},{tfName:\"dilations\",name:\"dilations\",type:\"number[]\"}]},{tfOpName:\"Dilation2D\",category:\"convolution\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"filter\",type:\"tensor\"}],attrs:[{tfName:\"strides\",name:\"strides\",type:\"number[]\"},{tfName:\"rates\",name:\"dilations\",type:\"number[]\"},{tfName:\"padding\",name:\"pad\",type:\"string\"}]}];var DC={};Be(DC,{json:()=>t6});var t6=[{tfOpName:\"Fill\",category:\"creation\",inputs:[{start:0,name:\"shape\",type:\"number[]\"},{start:1,name:\"value\",type:\"number\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\"}]},{tfOpName:\"LinSpace\",category:\"creation\",inputs:[{start:0,name:\"start\",type:\"number\"},{start:1,name:\"stop\",type:\"number\"},{start:2,name:\"num\",type:\"number\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"OneHot\",category:\"creation\",inputs:[{start:0,name:\"indices\",type:\"tensor\"},{start:1,name:\"depth\",type:\"number\"},{start:2,name:\"onValue\",type:\"number\",defaultValue:1},{start:3,name:\"offValue\",type:\"number\",defaultValue:0}],attrs:[{tfName:\"axis\",name:\"axis\",type:\"number\",notSupported:!0},{tfName:\"T\",name:\"dtype\",type:\"dtype\"}]},{tfOpName:\"Ones\",category:\"creation\",inputs:[{start:0,name:\"shape\",type:\"number[]\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\"}]},{tfOpName:\"OnesLike\",category:\"creation\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"dtype\",name:\"dtype\",type:\"dtype\"}]},{tfOpName:\"RandomStandardNormal\",category:\"creation\",inputs:[{start:0,name:\"shape\",type:\"number[]\"}],attrs:[{tfName:\"seed\",name:\"seed\",type:\"number\",defaultValue:0},{tfName:\"seed2\",name:\"seed2\",type:\"number\",defaultValue:0,notSupported:!0},{tfName:\"dtype\",name:\"dtype\",type:\"dtype\"},{tfName:\"T\",name:\"T\",type:\"number\",notSupported:!0}]},{tfOpName:\"RandomUniform\",category:\"creation\",inputs:[{start:0,name:\"shape\",type:\"number[]\"}],attrs:[{tfName:\"minval\",name:\"minval\",type:\"number\",defaultValue:0},{tfName:\"maxval\",name:\"maxval\",type:\"number\",defaultValue:1},{tfName:\"dtype\",name:\"dtype\",type:\"dtype\"},{tfName:\"seed\",name:\"seed\",type:\"number\",defaultValue:0},{tfName:\"seed2\",name:\"seed2\",type:\"number\",defaultValue:0,notSupported:!0},{tfName:\"T\",name:\"T\",type:\"number\",notSupported:!0}]},{tfOpName:\"Range\",category:\"creation\",inputs:[{start:0,name:\"start\",type:\"number\"},{start:1,name:\"stop\",type:\"number\"},{start:2,name:\"step\",type:\"number\",defaultValue:0}],attrs:[{tfName:\"Tidx\",name:\"dtype\",type:\"dtype\"}]},{tfOpName:\"TruncatedNormal\",category:\"creation\",inputs:[{start:0,name:\"shape\",type:\"number[]\"}],attrs:[{tfName:\"means\",name:\"mean\",type:\"number\",defaultValue:0},{tfName:\"stddev\",name:\"stdDev\",type:\"number\",defaultValue:1},{tfName:\"seed\",name:\"seed\",type:\"number\"},{tfName:\"seed2\",name:\"seed2\",type:\"number\",defaultValue:0,notSupported:!0},{tfName:\"dtype\",name:\"dtype\",type:\"dtype\"},{tfName:\"T\",name:\"T\",type:\"number\",notSupported:!0}]},{tfOpName:\"Zeros\",category:\"creation\",inputs:[{start:0,name:\"shape\",type:\"number[]\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\"}]},{tfOpName:\"ZerosLike\",category:\"creation\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\"}]},{tfOpName:\"Multinomial\",category:\"creation\",inputs:[{start:0,name:\"logits\",type:\"tensor\"},{start:1,name:\"numSamples\",type:\"number\"}],attrs:[{tfName:\"seed\",name:\"seed\",type:\"number\"},{tfName:\"seed2\",name:\"seed2\",type:\"number\"},{tfName:\"T\",name:\"dtype\",type:\"dtype\"},{tfName:\"output_dtype\",name:\"output_dtype\",type:\"dtype\"}]}];var PC={};Be(PC,{json:()=>r6});var r6=[{tfOpName:\"NonMaxSuppressionV2\",category:\"dynamic\",inputs:[{start:0,name:\"boxes\",type:\"tensor\"},{start:1,name:\"scores\",type:\"tensor\"},{start:2,name:\"maxOutputSize\",type:\"number\"},{start:3,name:\"iouThreshold\",type:\"number\"}]},{tfOpName:\"NonMaxSuppressionV3\",category:\"dynamic\",inputs:[{start:0,name:\"boxes\",type:\"tensor\"},{start:1,name:\"scores\",type:\"tensor\"},{start:2,name:\"maxOutputSize\",type:\"number\"},{start:3,name:\"iouThreshold\",type:\"number\"},{start:4,name:\"scoreThreshold\",type:\"number\"}]},{tfOpName:\"NonMaxSuppressionV4\",category:\"dynamic\",inputs:[{start:0,name:\"boxes\",type:\"tensor\"},{start:1,name:\"scores\",type:\"tensor\"},{start:2,name:\"maxOutputSize\",type:\"number\"},{start:3,name:\"iouThreshold\",type:\"number\"},{start:4,name:\"scoreThreshold\",type:\"number\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0},{tfName:\"T_threshold\",name:\"threshold\",type:\"dtype\",notSupported:!0},{tfName:\"pad_to_max_output_size\",name:\"padToMaxOutputSize\",type:\"bool\"}]},{tfOpName:\"NonMaxSuppressionV5\",category:\"dynamic\",inputs:[{start:0,name:\"boxes\",type:\"tensor\"},{start:1,name:\"scores\",type:\"tensor\"},{start:2,name:\"maxOutputSize\",type:\"number\"},{start:3,name:\"iouThreshold\",type:\"number\"},{start:4,name:\"scoreThreshold\",type:\"number\"},{start:5,name:\"softNmsSigma\",type:\"number\"}]},{tfOpName:\"Where\",category:\"dynamic\",inputs:[{start:0,name:\"condition\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"ListDiff\",category:\"dynamic\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"y\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]}];var OC={};Be(OC,{json:()=>o6});var o6=[{tfOpName:\"LowerBound\",category:\"evaluation\",inputs:[{start:0,name:\"sortedSequence\",type:\"tensor\"},{start:1,name:\"values\",type:\"tensor\"}]},{tfOpName:\"TopKV2\",category:\"evaluation\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"k\",type:\"number\"}],attrs:[{tfName:\"sorted\",name:\"sorted\",type:\"bool\"}]},{tfOpName:\"UpperBound\",category:\"evaluation\",inputs:[{start:0,name:\"sortedSequence\",type:\"tensor\"},{start:1,name:\"values\",type:\"tensor\"}]},{tfOpName:\"Unique\",category:\"evaluation\",inputs:[{start:0,name:\"x\",type:\"tensor\"}]},{tfOpName:\"UniqueV2\",category:\"evaluation\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"axis\",type:\"number\"}]}];var MC={};Be(MC,{json:()=>n6});var n6=[{tfOpName:\"PlaceholderWithDefault\",category:\"graph\",inputs:[{start:0,name:\"default\",type:\"tensor\"}],attrs:[{tfName:\"shape\",name:\"shape\",type:\"shape\"},{tfName:\"dtype\",name:\"dtype\",type:\"dtype\"}]},{tfOpName:\"Placeholder\",category:\"graph\",attrs:[{tfName:\"shape\",name:\"shape\",type:\"shape\"},{tfName:\"dtype\",name:\"dtype\",type:\"dtype\"}]},{tfOpName:\"Const\",category:\"graph\"},{tfOpName:\"Identity\",category:\"graph\",inputs:[{start:0,name:\"x\",type:\"tensor\"}]},{tfOpName:\"IdentityN\",category:\"graph\",inputs:[{start:0,end:0,name:\"x\",type:\"tensors\"}]},{tfOpName:\"Snapshot\",category:\"graph\",inputs:[{start:0,name:\"x\",type:\"tensor\"}]},{tfOpName:\"Rank\",category:\"graph\",inputs:[{start:0,name:\"x\",type:\"tensor\"}]},{tfOpName:\"Size\",category:\"graph\",inputs:[{start:0,name:\"x\",type:\"tensor\"}]},{tfOpName:\"Shape\",category:\"graph\",inputs:[{start:0,name:\"x\",type:\"tensor\"}]},{tfOpName:\"ShapeN\",category:\"graph\",inputs:[{start:0,end:0,name:\"x\",type:\"tensors\"}]},{tfOpName:\"Print\",category:\"graph\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"data\",type:\"tensors\"}],attrs:[{tfName:\"message\",name:\"message\",type:\"string\"},{tfName:\"first_n\",name:\"firstN\",type:\"number\",notSupported:!0},{tfName:\"summarize\",name:\"summarize\",type:\"number\",defaultValue:3}]},{tfOpName:\"NoOp\",category:\"graph\",inputs:[]},{tfOpName:\"StopGradient\",category:\"graph\",inputs:[{start:0,name:\"x\",type:\"tensor\"}]},{tfOpName:\"FakeQuantWithMinMaxVars\",category:\"graph\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"min\",name:\"min\",type:\"number\"},{tfName:\"max\",name:\"max\",type:\"number\"}]}];var LC={};Be(LC,{json:()=>s6});var s6=[{tfOpName:\"HashTable\",category:\"hash_table\",inputs:[],attrs:[{tfName:\"shared_name\",name:\"sharedName\",type:\"string\"},{tfName:\"use_node_name_sharing\",name:\"useNodeNameSharing\",type:\"bool\"},{tfName:\"key_dtype\",name:\"keyDType\",type:\"dtype\"},{tfName:\"value_dtype\",name:\"valueDType\",type:\"dtype\"}]},{tfOpName:\"HashTableV2\",category:\"hash_table\",inputs:[],attrs:[{tfName:\"shared_name\",name:\"sharedName\",type:\"string\"},{tfName:\"use_node_name_sharing\",name:\"useNodeNameSharing\",type:\"bool\"},{tfName:\"key_dtype\",name:\"keyDType\",type:\"dtype\"},{tfName:\"value_dtype\",name:\"valueDType\",type:\"dtype\"}]},{tfOpName:\"LookupTableImport\",category:\"hash_table\",inputs:[{start:0,name:\"tableHandle\",type:\"tensor\"},{start:1,name:\"keys\",type:\"tensor\"},{start:2,name:\"values\",type:\"tensor\"}],attrs:[{tfName:\"Tin\",name:\"tIn\",type:\"dtype\",notSupported:!0},{tfName:\"Tout\",name:\"tOut\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"LookupTableImportV2\",category:\"hash_table\",inputs:[{start:0,name:\"tableHandle\",type:\"tensor\"},{start:1,name:\"keys\",type:\"tensor\"},{start:2,name:\"values\",type:\"tensor\"}],attrs:[{tfName:\"Tin\",name:\"tIn\",type:\"dtype\",notSupported:!0},{tfName:\"Tout\",name:\"tOut\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"LookupTableFind\",category:\"hash_table\",inputs:[{start:0,name:\"tableHandle\",type:\"tensor\"},{start:1,name:\"keys\",type:\"tensor\"},{start:2,name:\"defaultValue\",type:\"tensor\"}],attrs:[{tfName:\"Tin\",name:\"tIn\",type:\"dtype\",notSupported:!0},{tfName:\"Tout\",name:\"tOut\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"LookupTableFindV2\",category:\"hash_table\",inputs:[{start:0,name:\"tableHandle\",type:\"tensor\"},{start:1,name:\"keys\",type:\"tensor\"},{start:2,name:\"defaultValue\",type:\"tensor\"}],attrs:[{tfName:\"Tin\",name:\"tIn\",type:\"dtype\",notSupported:!0},{tfName:\"Tout\",name:\"tOut\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"LookupTableSize\",category:\"hash_table\",inputs:[{start:0,name:\"tableHandle\",type:\"tensor\"}]},{tfOpName:\"LookupTableSizeV2\",category:\"hash_table\",inputs:[{start:0,name:\"tableHandle\",type:\"tensor\"}]}];var BC={};Be(BC,{json:()=>a6});var a6=[{tfOpName:\"ResizeBilinear\",category:\"image\",inputs:[{start:0,name:\"images\",type:\"tensor\"},{start:1,name:\"size\",type:\"number[]\"}],attrs:[{tfName:\"align_corners\",name:\"alignCorners\",type:\"bool\"},{tfName:\"half_pixel_centers\",name:\"halfPixelCenters\",type:\"bool\"},{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"ResizeNearestNeighbor\",category:\"image\",inputs:[{start:0,name:\"images\",type:\"tensor\"},{start:1,name:\"size\",type:\"number[]\"}],attrs:[{tfName:\"align_corners\",name:\"alignCorners\",type:\"bool\"},{tfName:\"half_pixel_centers\",name:\"halfPixelCenters\",type:\"bool\"},{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"CropAndResize\",category:\"image\",inputs:[{start:0,name:\"image\",type:\"tensor\"},{start:1,name:\"boxes\",type:\"tensor\"},{start:2,name:\"boxInd\",type:\"tensor\"},{start:3,name:\"cropSize\",type:\"number[]\"}],attrs:[{tfName:\"method\",name:\"method\",type:\"string\"},{tfName:\"extrapolation_value\",name:\"extrapolationValue\",type:\"number\"}]},{tfOpName:\"ImageProjectiveTransformV3\",category:\"image\",inputs:[{start:0,name:\"images\",type:\"tensor\"},{start:1,name:\"transforms\",type:\"tensor\"},{start:2,name:\"outputShape\",type:\"number[]\"},{start:3,name:\"fillValue\",type:\"number\"}],attrs:[{tfName:\"interpolation\",name:\"interpolation\",type:\"string\"},{tfName:\"fill_mode\",name:\"fillMode\",type:\"string\"}]}];var VC={};Be(VC,{json:()=>i6});var i6=[{tfOpName:\"Equal\",category:\"logical\",inputs:[{start:0,name:\"a\",type:\"tensor\"},{start:1,name:\"b\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"NotEqual\",category:\"logical\",inputs:[{start:0,name:\"a\",type:\"tensor\"},{start:1,name:\"b\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Greater\",category:\"logical\",inputs:[{start:0,name:\"a\",type:\"tensor\"},{start:1,name:\"b\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"GreaterEqual\",category:\"logical\",inputs:[{start:0,name:\"a\",type:\"tensor\"},{start:1,name:\"b\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Less\",category:\"logical\",inputs:[{start:0,name:\"a\",type:\"tensor\"},{start:1,name:\"b\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"LessEqual\",category:\"logical\",inputs:[{start:0,name:\"a\",type:\"tensor\"},{start:1,name:\"b\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"LogicalAnd\",category:\"logical\",inputs:[{start:0,name:\"a\",type:\"tensor\"},{start:1,name:\"b\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"LogicalNot\",category:\"logical\",inputs:[{start:0,name:\"a\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"LogicalOr\",category:\"logical\",inputs:[{start:0,name:\"a\",type:\"tensor\"},{start:1,name:\"b\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Select\",category:\"logical\",inputs:[{start:0,name:\"condition\",type:\"tensor\"},{start:1,name:\"a\",type:\"tensor\"},{start:2,name:\"b\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"SelectV2\",category:\"logical\",inputs:[{start:0,name:\"condition\",type:\"tensor\"},{start:1,name:\"a\",type:\"tensor\"},{start:2,name:\"b\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]}];var zC={};Be(zC,{json:()=>u6});var u6=[{tfOpName:\"_FusedMatMul\",category:\"matrices\",inputs:[{start:0,name:\"a\",type:\"tensor\"},{start:1,name:\"b\",type:\"tensor\"},{start:2,end:0,name:\"args\",type:\"tensors\"}],attrs:[{tfName:\"num_args\",name:\"numArgs\",type:\"number\"},{tfName:\"fused_ops\",name:\"fusedOps\",type:\"string[]\",defaultValue:[]},{tfName:\"epsilon\",name:\"epsilon\",type:\"number\",defaultValue:1e-4},{tfName:\"transpose_a\",name:\"transposeA\",type:\"bool\",defaultValue:!1},{tfName:\"transpose_b\",name:\"transposeB\",type:\"bool\",defaultValue:!1},{tfName:\"leakyrelu_alpha\",name:\"leakyreluAlpha\",type:\"number\",defaultValue:.2},{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"MatMul\",category:\"matrices\",inputs:[{start:0,name:\"a\",type:\"tensor\"},{start:1,name:\"b\",type:\"tensor\"}],attrs:[{tfName:\"transpose_a\",name:\"transposeA\",type:\"bool\",defaultValue:!1},{tfName:\"transpose_b\",name:\"transposeB\",type:\"bool\",defaultValue:!1},{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"BatchMatMul\",category:\"matrices\",inputs:[{start:0,name:\"a\",type:\"tensor\"},{start:1,name:\"b\",type:\"tensor\"}],attrs:[{tfName:\"adj_x\",name:\"transposeA\",type:\"bool\",defaultValue:!1},{tfName:\"adj_y\",name:\"transposeB\",type:\"bool\",defaultValue:!1},{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"BatchMatMulV2\",category:\"matrices\",inputs:[{start:0,name:\"a\",type:\"tensor\"},{start:1,name:\"b\",type:\"tensor\"}],attrs:[{tfName:\"adj_x\",name:\"transposeA\",type:\"bool\",defaultValue:!1},{tfName:\"adj_y\",name:\"transposeB\",type:\"bool\",defaultValue:!1},{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Transpose\",category:\"matrices\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"perm\",type:\"number[]\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"Einsum\",category:\"matrices\",inputs:[{start:0,end:0,name:\"tensors\",type:\"tensors\"}],attrs:[{tfName:\"equation\",name:\"equation\",type:\"string\"},{tfName:\"N\",name:\"n\",type:\"number\",defaultValue:2},{tfName:\"T\",name:\"dtype\",type:\"dtype\"}]}];var WC={};Be(WC,{json:()=>p6});var p6=[{tfOpName:\"EuclideanNorm\",category:\"normalization\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"axis\",type:\"number[]\"}],attrs:[{tfName:\"keep_dims\",name:\"keepDims\",type:\"bool\",defaultValue:!1}]},{tfOpName:\"FusedBatchNorm\",category:\"normalization\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"scale\",type:\"tensor\"},{start:2,name:\"offset\",type:\"tensor\"},{start:3,name:\"mean\",type:\"tensor\"},{start:4,name:\"variance\",type:\"tensor\"}],attrs:[{tfName:\"epsilon\",name:\"epsilon\",type:\"number\",defaultValue:.001},{tfName:\"data_format\",name:\"dataFormat\",type:\"string\",notSupported:!0}]},{tfOpName:\"FusedBatchNormV2\",category:\"normalization\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"scale\",type:\"tensor\"},{start:2,name:\"offset\",type:\"tensor\"},{start:3,name:\"mean\",type:\"tensor\"},{start:4,name:\"variance\",type:\"tensor\"}],attrs:[{tfName:\"epsilon\",name:\"epsilon\",type:\"number\",defaultValue:.001},{tfName:\"data_format\",name:\"dataFormat\",type:\"string\",notSupported:!0}]},{tfOpName:\"FusedBatchNormV3\",category:\"normalization\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"scale\",type:\"tensor\"},{start:2,name:\"offset\",type:\"tensor\"},{start:3,name:\"mean\",type:\"tensor\"},{start:4,name:\"variance\",type:\"tensor\"}],attrs:[{tfName:\"epsilon\",name:\"epsilon\",type:\"number\",defaultValue:.001},{tfName:\"data_format\",name:\"dataFormat\",type:\"string\",notSupported:!0}]},{tfOpName:\"LRN\",category:\"normalization\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"depth_radius\",name:\"radius\",type:\"number\",defaultValue:5},{tfName:\"bias\",name:\"bias\",type:\"number\",defaultValue:1},{tfName:\"alpha\",name:\"alpha\",type:\"number\",defaultValue:1},{tfName:\"beta\",name:\"beta\",type:\"number\",defaultValue:.5}]},{tfOpName:\"Softmax\",category:\"normalization\",inputs:[{start:0,name:\"x\",type:\"tensor\"}]},{tfOpName:\"LogSoftmax\",category:\"normalization\",inputs:[{start:0,name:\"x\",type:\"tensor\"}]},{tfOpName:\"SparseToDense\",category:\"normalization\",inputs:[{start:0,name:\"sparseIndices\",type:\"tensor\"},{start:1,name:\"outputShape\",type:\"number[]\"},{start:2,name:\"sparseValues\",type:\"tensor\"},{start:3,name:\"defaultValue\",type:\"tensor\"}],attrs:[{tfName:\"validate_indices\",name:\"validateIndices\",type:\"bool\",defaultValue:!0,notSupported:!0}]}];var UC={};Be(UC,{json:()=>c6});var c6=[{tfOpName:\"Bincount\",category:\"reduction\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"size\",type:\"number\"},{start:2,name:\"weights\",type:\"tensor\"}]},{tfOpName:\"DenseBincount\",category:\"reduction\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"size\",type:\"number\"},{start:2,name:\"weights\",type:\"tensor\"}],attrs:[{tfName:\"binary_output\",name:\"binaryOutput\",type:\"bool\"}]},{tfOpName:\"Max\",category:\"reduction\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"axis\",type:\"number[]\"}],attrs:[{tfName:\"keep_dims\",name:\"keepDims\",type:\"bool\"}]},{tfOpName:\"Mean\",category:\"reduction\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"axis\",type:\"number[]\"}],attrs:[{tfName:\"keep_dims\",name:\"keepDims\",type:\"bool\"}]},{tfOpName:\"Min\",category:\"reduction\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"axis\",type:\"number[]\"}],attrs:[{tfName:\"keep_dims\",name:\"keepDims\",type:\"bool\"}]},{tfOpName:\"Sum\",category:\"reduction\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"axis\",type:\"number[]\"}],attrs:[{tfName:\"keep_dims\",name:\"keepDims\",type:\"bool\"}]},{tfOpName:\"All\",category:\"reduction\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"axis\",type:\"number[]\"}],attrs:[{tfName:\"keep_dims\",name:\"keepDims\",type:\"bool\"}]},{tfOpName:\"Any\",category:\"reduction\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"axis\",type:\"number[]\"}],attrs:[{tfName:\"keep_dims\",name:\"keepDims\",type:\"bool\"}]},{tfOpName:\"ArgMax\",category:\"reduction\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"axis\",type:\"number\"}]},{tfOpName:\"ArgMin\",category:\"reduction\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"axis\",type:\"number\"}]},{tfOpName:\"Prod\",category:\"reduction\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"axis\",type:\"number[]\"}],attrs:[{tfName:\"keep_dims\",name:\"keepDims\",type:\"bool\"}]},{tfOpName:\"Cumprod\",category:\"reduction\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"axis\",type:\"number\"}],attrs:[{tfName:\"exclusive\",name:\"exclusive\",type:\"bool\"},{tfName:\"reverse\",name:\"reverse\",type:\"bool\"}]},{tfOpName:\"Cumsum\",category:\"reduction\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"axis\",type:\"number\"}],attrs:[{tfName:\"exclusive\",name:\"exclusive\",type:\"bool\"},{tfName:\"reverse\",name:\"reverse\",type:\"bool\"}]}];var GC={};Be(GC,{json:()=>l6});var l6=[{tfOpName:\"ConcatV2\",category:\"slice_join\",inputs:[{start:0,end:-1,name:\"tensors\",type:\"tensors\"},{start:-1,name:\"axis\",type:\"number\"}],attrs:[{tfName:\"N\",name:\"n\",type:\"number\",defaultValue:2}]},{tfOpName:\"Concat\",category:\"slice_join\",inputs:[{start:1,end:0,name:\"tensors\",type:\"tensors\"},{start:0,name:\"axis\",type:\"number\"}],attrs:[{tfName:\"N\",name:\"n\",type:\"number\",defaultValue:2}]},{tfOpName:\"GatherV2\",category:\"slice_join\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"indices\",type:\"tensor\"},{start:2,name:\"axis\",type:\"number\",defaultValue:0}],attrs:[{tfName:\"batch_dims\",name:\"batchDims\",type:\"number\",defaultValue:0}]},{tfOpName:\"Gather\",category:\"slice_join\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"indices\",type:\"tensor\"}],attrs:[{tfName:\"validate_indices\",name:\"validateIndices\",type:\"bool\",notSupported:!0}]},{tfOpName:\"Reverse\",category:\"slice_join\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"dims\",type:\"bool[]\"}]},{tfOpName:\"ReverseV2\",category:\"slice_join\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"axis\",type:\"number[]\"}]},{tfOpName:\"Slice\",category:\"slice_join\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"begin\",type:\"number[]\"},{start:2,name:\"size\",type:\"number[]\"}]},{tfOpName:\"StridedSlice\",category:\"slice_join\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"begin\",type:\"number[]\"},{start:2,name:\"end\",type:\"number[]\"},{start:3,name:\"strides\",type:\"number[]\"}],attrs:[{tfName:\"begin_mask\",name:\"beginMask\",type:\"number\",defaultValue:0},{tfName:\"end_mask\",name:\"endMask\",type:\"number\",defaultValue:0},{tfName:\"new_axis_mask\",name:\"newAxisMask\",type:\"number\",defaultValue:0},{tfName:\"ellipsis_mask\",name:\"ellipsisMask\",type:\"number\",defaultValue:0},{tfName:\"shrink_axis_mask\",name:\"shrinkAxisMask\",type:\"number\",defaultValue:0}]},{tfOpName:\"Pack\",category:\"slice_join\",inputs:[{start:0,end:0,name:\"tensors\",type:\"tensors\"}],attrs:[{tfName:\"axis\",name:\"axis\",type:\"number\",defaultValue:0}]},{tfOpName:\"Unpack\",category:\"slice_join\",inputs:[{start:0,name:\"tensor\",type:\"tensor\"}],attrs:[{tfName:\"axis\",name:\"axis\",type:\"number\",defaultValue:0},{tfName:\"num\",name:\"num\",type:\"number\",defaultValue:0,notSupported:!0}]},{tfOpName:\"Tile\",category:\"slice_join\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"reps\",type:\"number[]\"}]},{tfOpName:\"Split\",category:\"slice_join\",inputs:[{start:0,name:\"axis\",type:\"number\",defaultValue:0},{start:1,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"num_split\",name:\"numOrSizeSplits\",type:\"number\",defaultValue:1}]},{tfOpName:\"SplitV\",category:\"slice_join\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"numOrSizeSplits\",type:\"number[]\"},{start:2,name:\"axis\",type:\"number\",defaultValue:0}]},{tfOpName:\"ScatterNd\",category:\"slice_join\",inputs:[{start:0,name:\"indices\",type:\"tensor\"},{start:1,name:\"values\",type:\"tensor\"},{start:2,name:\"shape\",type:\"number[]\"}]},{tfOpName:\"GatherNd\",category:\"slice_join\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"indices\",type:\"tensor\"}]},{tfOpName:\"SparseToDense\",category:\"slice_join\",inputs:[{start:0,name:\"sparseIndices\",type:\"tensor\"},{start:1,name:\"outputShape\",type:\"number[]\"},{start:2,name:\"sparseValues\",type:\"tensor\"},{start:3,name:\"defaultValue\",type:\"tensor\"}],attrs:[{tfName:\"validate_indices\",name:\"validateIndices\",type:\"bool\",defaultValue:!1,notSupported:!0}]}];var HC={};Be(HC,{json:()=>m6});var m6=[{tfOpName:\"SparseFillEmptyRows\",category:\"sparse\",inputs:[{start:0,name:\"indices\",type:\"tensor\"},{start:1,name:\"values\",type:\"tensor\"},{start:2,name:\"denseShape\",type:\"tensor\"},{start:3,name:\"defaultValue\",type:\"tensor\"}]},{tfOpName:\"SparseReshape\",category:\"sparse\",inputs:[{start:0,name:\"inputIndices\",type:\"tensor\"},{start:1,name:\"inputShape\",type:\"tensor\"},{start:2,name:\"newShape\",type:\"tensor\"}],attrs:[{tfName:\"T\",name:\"dtype\",type:\"dtype\",notSupported:!0}]},{tfOpName:\"SparseSegmentMean\",category:\"sparse\",inputs:[{start:0,name:\"data\",type:\"tensor\"},{start:1,name:\"indices\",type:\"tensor\"},{start:2,name:\"segmentIds\",type:\"tensor\"}]},{tfOpName:\"SparseSegmentSum\",category:\"sparse\",inputs:[{start:0,name:\"data\",type:\"tensor\"},{start:1,name:\"indices\",type:\"tensor\"},{start:2,name:\"segmentIds\",type:\"tensor\"}]}];var qC={};Be(qC,{json:()=>f6});var f6=[{tfOpName:\"FFT\",category:\"spectral\",inputs:[{start:0,name:\"x\",type:\"tensor\"}]},{tfOpName:\"IFFT\",category:\"spectral\",inputs:[{start:0,name:\"x\",type:\"tensor\"}]},{tfOpName:\"RFFT\",category:\"spectral\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"fft_length\",type:\"number\",notSupported:!0}]},{tfOpName:\"IRFFT\",category:\"spectral\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"fft_length\",type:\"number\",notSupported:!0}]}];var KC={};Be(KC,{json:()=>d6});var d6=[{tfOpName:\"StringNGrams\",category:\"string\",inputs:[{start:0,name:\"data\",type:\"tensor\"},{start:1,name:\"dataSplits\",type:\"tensor\"}],attrs:[{tfName:\"separator\",name:\"separator\",type:\"string\"},{tfName:\"ngram_widths\",name:\"nGramWidths\",type:\"number[]\"},{tfName:\"left_pad\",name:\"leftPad\",type:\"string\"},{tfName:\"right_pad\",name:\"rightPad\",type:\"string\"},{tfName:\"pad_width\",name:\"padWidth\",type:\"number\"},{tfName:\"preserve_short_sequences\",name:\"preserveShortSequences\",type:\"bool\"}],outputs:[\"ngrams\",\"ngrams_splits\"]},{tfOpName:\"StringSplit\",category:\"string\",inputs:[{start:0,name:\"input\",type:\"tensor\"},{start:1,name:\"delimiter\",type:\"tensor\"}],attrs:[{tfName:\"skip_empty\",name:\"skipEmpty\",type:\"bool\"}],outputs:[\"indices\",\"values\",\"shape\"]},{tfOpName:\"StringToHashBucketFast\",category:\"string\",inputs:[{start:0,name:\"input\",type:\"tensor\"}],attrs:[{tfName:\"num_buckets\",name:\"numBuckets\",type:\"number\"}]}];var jC={};Be(jC,{json:()=>h6});var h6=[{tfOpName:\"Cast\",category:\"transformation\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"SrcT\",name:\"sdtype\",type:\"dtype\",notSupported:!0},{tfName:\"DstT\",name:\"dtype\",type:\"dtype\"}]},{tfOpName:\"ExpandDims\",category:\"transformation\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"axis\",type:\"number\"}]},{tfOpName:\"MirrorPad\",category:\"transformation\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"padding\",type:\"number[]\"}],attrs:[{tfName:\"mode\",name:\"mode\",type:\"string\"}]},{tfOpName:\"Pad\",category:\"transformation\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"padding\",type:\"number[]\"}],attrs:[{tfName:\"constant_value\",name:\"constantValue\",type:\"number\",defaultValue:0}]},{tfOpName:\"PadV2\",category:\"transformation\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"padding\",type:\"number[]\"},{start:2,name:\"constantValue\",type:\"number\",defaultValue:0}]},{tfOpName:\"Reshape\",category:\"transformation\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"shape\",type:\"number[]\"}]},{tfOpName:\"Squeeze\",category:\"transformation\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"axis\",tfDeprecatedName:\"squeeze_dims\",name:\"axis\",type:\"number[]\"}]},{tfOpName:\"SpaceToBatchND\",category:\"transformation\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"blockShape\",type:\"number[]\"},{start:2,name:\"paddings\",type:\"number[]\"}]},{tfOpName:\"BatchToSpaceND\",category:\"transformation\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"blockShape\",type:\"number[]\"},{start:2,name:\"crops\",type:\"number[]\"}]},{tfOpName:\"DepthToSpace\",category:\"transformation\",inputs:[{start:0,name:\"x\",type:\"tensor\"}],attrs:[{tfName:\"block_size\",name:\"blockSize\",type:\"number\"},{tfName:\"data_format\",name:\"dataFormat\",type:\"string\"}]},{tfOpName:\"BroadcastTo\",category:\"transformation\",inputs:[{start:0,name:\"x\",type:\"tensor\"},{start:1,name:\"shape\",type:\"number[]\"}],attrs:[]},{tfOpName:\"BroadcastArgs\",category:\"transformation\",inputs:[{start:0,name:\"s0\",type:\"tensor\"},{start:1,name:\"s1\",type:\"tensor\"}],attrs:[]}];var xl=class{constructor(){let e=[$C,RC,AC,FC,DC,PC,OC,MC,LC,BC,VC,zC,WC,UC,GC,HC,qC,KC,jC],t=[].concat(...e.map(o=>o.json));this.opMappers=t.reduce((o,n)=>(o[n.tfOpName]=n,o),{})}static get Instance(){return this._instance||(this._instance=new this)}transformGraph(e,t={}){let o=e.node,n=[],s=[],a=[],i=o.reduce((h,g)=>(h[g.name]=this.mapNode(g),g.op.startsWith(\"Placeholder\")?n.push(h[g.name]):g.op===\"Const\"?s.push(h[g.name]):(g.input==null||g.input.length===0)&&a.push(h[g.name]),h),{}),p=[],u=[],c={},l={};t!=null&&(c=this.mapSignatureEntries(t.inputs),l=this.mapSignatureEntries(t.outputs));let m=Object.keys(i);m.forEach(h=>{let g=i[h];g.inputNames.forEach((y,b)=>{let[C,,w]=zo(y),k=i[C];if(k.outputs!=null){let _=k.outputs.indexOf(w);if(_!==-1){let E=`${C}:${_}`;g.inputNames[b]=E}}g.inputs.push(k),k.children.push(g)})}),Object.keys(l).length===0?m.forEach(h=>{let g=i[h];g.children.length===0&&u.push(g)}):Object.keys(l).forEach(h=>{let[g]=zo(h),y=i[g];y!=null&&(y.signatureKey=l[h],u.push(y))}),Object.keys(c).length>0?Object.keys(c).forEach(h=>{let[g]=zo(h),y=i[g];y&&(y.signatureKey=c[h],p.push(y))}):p=n;let f={};e.library!=null&&e.library.function!=null&&(f=e.library.function.reduce((h,g)=>(h[g.signature.name]=this.mapFunction(g),h),{}));let d={nodes:i,inputs:p,outputs:u,weights:s,placeholders:n,signature:t,functions:f};return a.length>0&&(d.initNodes=a),d}mapSignatureEntries(e){return Object.keys(e||{}).reduce((t,o)=>(t[e[o].name]=o,t),{})}mapNode(e){let t=td(e.op)||this.opMappers[e.op]||{};e.attr==null&&(e.attr={});let o={name:e.name,op:e.op,category:t.category,inputNames:(e.input||[]).map(n=>n.startsWith(\"^\")?n.slice(1):n),inputs:[],children:[],inputParams:{},attrParams:{},rawAttrs:e.attr,outputs:t.outputs};return t.inputs!=null&&(o.inputParams=t.inputs.reduce((n,s)=>(n[s.name]={type:s.type,inputIndexStart:s.start,inputIndexEnd:s.end},n),{})),t.attrs!=null&&(o.attrParams=t.attrs.reduce((n,s)=>{let a=s.type,i;switch(s.type){case\"string\":i=od(e.attr,s.tfName,s.defaultValue),i===void 0&&!!s.tfDeprecatedName&&(i=od(e.attr,s.tfDeprecatedName,s.defaultValue));break;case\"string[]\":i=cd(e.attr,s.tfName,s.defaultValue),i===void 0&&!!s.tfDeprecatedName&&(i=cd(e.attr,s.tfDeprecatedName,s.defaultValue));break;case\"number\":i=sd(e.attr,s.tfName,s.defaultValue||0),i===void 0&&!!s.tfDeprecatedName&&(i=sd(e.attr,s.tfDeprecatedName,s.defaultValue));break;case\"number[]\":i=pd(e.attr,s.tfName,s.defaultValue),i===void 0&&!!s.tfDeprecatedName&&(i=pd(e.attr,s.tfDeprecatedName,s.defaultValue));break;case\"bool\":i=nd(e.attr,s.tfName,s.defaultValue),i===void 0&&!!s.tfDeprecatedName&&(i=nd(e.attr,s.tfDeprecatedName,s.defaultValue));break;case\"bool[]\":i=md(e.attr,s.tfName,s.defaultValue),i===void 0&&!!s.tfDeprecatedName&&(i=md(e.attr,s.tfDeprecatedName,s.defaultValue));break;case\"shape\":i=ud(e.attr,s.tfName,s.defaultValue),i===void 0&&!!s.tfDeprecatedName&&(i=ud(e.attr,s.tfDeprecatedName,s.defaultValue));break;case\"shape[]\":i=ld(e.attr,s.tfName,s.defaultValue),i===void 0&&!!s.tfDeprecatedName&&(i=ld(e.attr,s.tfDeprecatedName,s.defaultValue));break;case\"dtype\":i=ad(e.attr,s.tfName,s.defaultValue),i===void 0&&!!s.tfDeprecatedName&&(i=ad(e.attr,s.tfDeprecatedName,s.defaultValue));break;case\"dtype[]\":i=id(e.attr,s.tfName,s.defaultValue),i===void 0&&!!s.tfDeprecatedName&&(i=id(e.attr,s.tfDeprecatedName,s.defaultValue));break;case\"func\":i=QT(e.attr,s.tfName,s.defaultValue),i===void 0&&!!s.tfDeprecatedName&&(i=QT(e.attr,s.tfDeprecatedName,s.defaultValue));break;case\"tensor\":case\"tensors\":break;default:throw new Error(`Unsupported param type: ${s.type} for op: ${e.op}`)}return n[s.name]={value:i,type:a},n},{})),o}mapFunction(e){let t=e.nodeDef,o=[],n=[],s={};t!=null&&(s=t.reduce((l,m)=>(l[m.name]=this.mapNode(m),m.op===\"Const\"&&n.push(l[m.name]),l),{}));let a=[],i=[];e.signature.inputArg.forEach(l=>{let[m]=zo(l.name),f={name:m,op:\"Placeholder\",inputs:[],inputNames:[],category:\"graph\",inputParams:{},attrParams:{dtype:{value:XC(l.type),type:\"dtype\"}},children:[]};f.signatureKey=l.name,a.push(f),s[m]=f}),Object.keys(s).forEach(l=>{let m=s[l];m.inputNames.forEach((f,d)=>{let[h,,g]=zo(f),y=s[h];if(y.outputs!=null){let b=y.outputs.indexOf(g);if(b!==-1){let C=`${h}:${b}`;m.inputNames[d]=C}}m.inputs.push(y),y.children.push(m)})});let u=e.ret;e.signature.outputArg.forEach(l=>{let[m,f]=zo(u[l.name]),d=s[m];d!=null&&(d.defaultOutput=f,i.push(d))});let c=this.mapArgsToSignature(e);return{nodes:s,inputs:a,outputs:i,weights:n,placeholders:o,signature:c}}mapArgsToSignature(e){return{methodName:e.signature.name,inputs:e.signature.inputArg.reduce((t,o)=>(t[o.name]=this.mapArgToTensorInfo(o),t),{}),outputs:e.signature.outputArg.reduce((t,o)=>(t[o.name]=this.mapArgToTensorInfo(o,e.ret),t),{})}}mapArgToTensorInfo(e,t){let o=e.name;return t!=null&&(o=t[o]),{name:o,dtype:e.type}}};function g6(r){let e=P().global;if(typeof e.atob!=\"undefined\")return e.atob(r);if(typeof Buffer!=\"undefined\")return new Buffer(r,\"base64\").toString();throw new Error(\"Unable to decode base64 in this environment. Missing built-in atob() or Buffer()\")}function ZT(r,e){let t=Array.isArray(r)?String.fromCharCode.apply(null,r):g6(r);return e?t:t.toLowerCase()}function od(r,e,t,o=!1){let n=r[e];return n!=null?ZT(n.s,o):t}function nd(r,e,t){let o=r[e];return o?o.b:t}function sd(r,e,t){let o=r[e]||{},n=o.i!=null?o.i:o.f!=null?o.f:t;return typeof n==\"number\"?n:parseInt(n,10)}function XC(r){switch(typeof r==\"string\"&&(r=To[r]),r){case To.DT_FLOAT:case To.DT_HALF:return\"float32\";case To.DT_INT32:case To.DT_INT64:case To.DT_INT8:case To.DT_UINT8:return\"int32\";case To.DT_BOOL:return\"bool\";case To.DT_DOUBLE:return\"float32\";case To.DT_STRING:return\"string\";default:return null}}function QT(r,e,t){let o=r[e];return o&&o.func?o.func.name:t}function ad(r,e,t){let o=r[e];return o&&o.type?XC(o.type):t}function id(r,e,t){let o=r[e];return o&&o.list&&o.list.type?o.list.type.map(n=>XC(n)):t}function JT(r){if(!r.unknownRank)return r.dim!=null?r.dim.map(e=>typeof e.size==\"number\"?e.size:parseInt(e.size,10)):[]}function ud(r,e,t){let o=r[e];return o&&o.shape?JT(o.shape):t}function pd(r,e,t){let o=r[e];return o?((o.list.f&&o.list.f.length?o.list.f:o.list.i)||[]).map(n=>typeof n==\"number\"?n:parseInt(n,10)):t}function cd(r,e,t,o=!1){let n=r[e];return n&&n.list&&n.list.s?n.list.s.map(s=>ZT(s,o)):t}function ld(r,e,t){let o=r[e];return o&&o.list&&o.list.shape?o.list.shape.map(n=>JT(n)):t}function md(r,e,t){let o=r[e];return o&&o.list&&o.list.b?o.list.b:t}var fd=class{constructor(e,t,o){this.node=e,this.tensorMap=t,this.context=o,this.inputs=[],this.attrs={},this.inputs=e.inputNames.map(n=>this.getInput(n)),e.rawAttrs!=null&&(this.attrs=Object.keys(e.rawAttrs).reduce((n,s)=>(n[s]=this.getAttr(s),n),{}))}getInput(e){return Ht(e,this.tensorMap,this.context)}getAttr(e,t){let o=this.node.rawAttrs[e];if(o.tensor!=null)return Ht(e,this.tensorMap,this.context);if(o.i!=null||o.f!=null)return sd(this.node.rawAttrs,e,t);if(o.s!=null)return od(this.node.rawAttrs,e,t);if(o.b!=null)return nd(this.node.rawAttrs,e,t);if(o.shape!=null)return ud(this.node.rawAttrs,e,t);if(o.type!=null)return ad(this.node.rawAttrs,e,t);if(o.list!=null){if(o.list.i!=null||o.list.f!=null)return pd(this.node.rawAttrs,e,t);if(o.list.s!=null)return cd(this.node.rawAttrs,e,t);if(o.list.shape!=null)return ld(this.node.rawAttrs,e,t);if(o.list.b!=null)return md(this.node.rawAttrs,e,t);if(o.list.type!=null)return id(this.node.rawAttrs,e,t)}return t}};var rt={};Be(rt,{OP_SCOPE_SUFFIX:()=>Ub,abs:()=>Qt,acos:()=>Vv,acosh:()=>zv,add:()=>ge,addN:()=>Wv,all:()=>Uv,any:()=>Gv,argMax:()=>Hv,argMin:()=>qv,asin:()=>Kv,asinh:()=>jv,atan:()=>Xv,atan2:()=>Yv,atanh:()=>Qv,avgPool:()=>mf,avgPool3d:()=>ek,basicLSTMCell:()=>tk,batchNorm:()=>li,batchNorm2d:()=>ok,batchNorm3d:()=>nk,batchNorm4d:()=>sk,batchToSpaceND:()=>ff,bincount:()=>df,booleanMaskAsync:()=>_H,broadcastArgs:()=>ak,broadcastTo:()=>Ls,buffer:()=>ne,cast:()=>qe,ceil:()=>ik,clipByValue:()=>uk,clone:()=>zr,complex:()=>Er,concat:()=>gt,concat1d:()=>pk,concat2d:()=>ck,concat3d:()=>lk,concat4d:()=>mk,conv1d:()=>fk,conv2d:()=>mi,conv2dTranspose:()=>dk,conv3d:()=>hk,conv3dTranspose:()=>xk,cos:()=>yk,cosh:()=>bk,cosineWindow:()=>hl,cumprod:()=>Ck,cumsum:()=>Ik,denseBincount:()=>wk,depthToSpace:()=>Sk,depthwiseConv2d:()=>Gp,diag:()=>vk,dilation2d:()=>kk,div:()=>We,divNoNan:()=>Tk,dot:()=>Nk,dropout:()=>BH,einsum:()=>_k,elu:()=>xf,enclosingPowerOfTwo:()=>wC,equal:()=>gf,erf:()=>Ek,euclideanNorm:()=>Ak,exp:()=>Bo,expandDims:()=>_a,expm1:()=>Fk,eye:()=>yf,fft:()=>qp,fill:()=>Bs,floor:()=>bf,floorDiv:()=>cf,fused:()=>SC,gather:()=>Cf,gatherND:()=>MH,greater:()=>cu,greaterEqual:()=>If,ifft:()=>hu,imag:()=>ci,image:()=>zq,inTopKAsync:()=>zH,irfft:()=>Gf,isFinite:()=>Dk,isInf:()=>Pk,isNaN:()=>Ok,leakyRelu:()=>wf,less:()=>Mk,lessEqual:()=>Hp,linalg:()=>Wq,linspace:()=>Lk,localResponseNormalization:()=>Bk,log:()=>Ea,log1p:()=>Sf,logSigmoid:()=>Vk,logSoftmax:()=>zk,logSumExp:()=>Tf,logicalAnd:()=>lu,logicalNot:()=>Nf,logicalOr:()=>_f,logicalXor:()=>Wk,losses:()=>Uq,lowerBound:()=>Uk,matMul:()=>Xe,max:()=>Vs,maxPool:()=>$f,maxPool3d:()=>Gk,maxPoolWithArgmax:()=>Hk,maximum:()=>Rf,mean:()=>mu,meshgrid:()=>qk,min:()=>fl,minimum:()=>Af,mirrorPad:()=>Kk,mod:()=>jk,moments:()=>Xk,movingAverage:()=>$H,mul:()=>oe,multiRNNCell:()=>Yk,multinomial:()=>Qk,neg:()=>yr,norm:()=>pu,notEqual:()=>Ff,oneHot:()=>pl,ones:()=>zs,onesLike:()=>Zk,op:()=>T,outerProduct:()=>Jk,pad:()=>Ws,pad1d:()=>e1,pad2d:()=>t1,pad3d:()=>r1,pad4d:()=>o1,pool:()=>n1,pow:()=>Na,prelu:()=>Pf,print:()=>ef,prod:()=>s1,raggedGather:()=>a1,raggedRange:()=>i1,raggedTensorToTensor:()=>u1,rand:()=>p1,randomGamma:()=>T1,randomNormal:()=>Vf,randomStandardNormal:()=>N1,randomUniform:()=>zf,range:()=>di,real:()=>ka,reciprocal:()=>_1,relu:()=>hi,relu6:()=>Wf,reshape:()=>z,reverse:()=>vo,reverse1d:()=>E1,reverse2d:()=>$1,reverse3d:()=>R1,reverse4d:()=>A1,rfft:()=>Kp,round:()=>Uf,rsqrt:()=>F1,scalar:()=>be,scatterND:()=>AH,searchSorted:()=>dl,selu:()=>D1,separableConv2d:()=>P1,setdiff1dAsync:()=>O1,sigmoid:()=>Ms,sign:()=>M1,signal:()=>Vq,sin:()=>L1,sinh:()=>B1,slice:()=>Ue,slice1d:()=>V1,slice2d:()=>z1,slice3d:()=>W1,slice4d:()=>U1,softmax:()=>G1,softplus:()=>kf,spaceToBatchND:()=>Df,sparse:()=>Gq,sparseToDense:()=>PH,spectral:()=>Bq,split:()=>$a,sqrt:()=>Rr,square:()=>Zt,squaredDifference:()=>Hf,squeeze:()=>jp,stack:()=>Ir,step:()=>qf,stridedSlice:()=>H1,string:()=>Hq,sub:()=>ke,sum:()=>tt,tan:()=>q1,tanh:()=>ml,tensor:()=>nr,tensor1d:()=>mr,tensor2d:()=>gi,tensor3d:()=>sf,tensor4d:()=>K1,tensor5d:()=>j1,tensor6d:()=>X1,tile:()=>fi,topk:()=>Y1,transpose:()=>Wp,truncatedNormal:()=>Q1,unique:()=>Z1,unsortedSegmentSum:()=>J1,unstack:()=>ko,upperBound:()=>eT,variable:()=>tT,where:()=>os,whereAsync:()=>jf,zeros:()=>Wr,zerosLike:()=>Gt});var eN=(r,e,t,o=rt)=>{switch(r.op){case\"BiasAdd\":case\"AddV2\":case\"Add\":return[o.add(S(\"a\",r,e,t),S(\"b\",r,e,t))];case\"AddN\":return[o.addN(S(\"tensors\",r,e,t))];case\"FloorMod\":case\"Mod\":return[o.mod(S(\"a\",r,e,t),S(\"b\",r,e,t))];case\"Mul\":return[o.mul(S(\"a\",r,e,t),S(\"b\",r,e,t))];case\"RealDiv\":case\"Div\":return[o.div(S(\"a\",r,e,t),S(\"b\",r,e,t))];case\"DivNoNan\":return[o.divNoNan(S(\"a\",r,e,t),S(\"b\",r,e,t))];case\"FloorDiv\":return[o.floorDiv(S(\"a\",r,e,t),S(\"b\",r,e,t))];case\"Sub\":return[o.sub(S(\"a\",r,e,t),S(\"b\",r,e,t))];case\"Minimum\":return[o.minimum(S(\"a\",r,e,t),S(\"b\",r,e,t))];case\"Maximum\":return[o.maximum(S(\"a\",r,e,t),S(\"b\",r,e,t))];case\"Pow\":return[o.pow(S(\"a\",r,e,t),S(\"b\",r,e,t))];case\"SquaredDifference\":return[o.squaredDifference(S(\"a\",r,e,t),S(\"b\",r,e,t))];default:throw TypeError(`Node type ${r.op} is not implemented`)}};var tN=(r,e,t,o=rt)=>{switch(r.op){case\"Abs\":case\"ComplexAbs\":return[o.abs(S(\"x\",r,e,t))];case\"Acos\":return[o.acos(S(\"x\",r,e,t))];case\"Acosh\":return[o.acosh(S(\"x\",r,e,t))];case\"Asin\":return[o.asin(S(\"x\",r,e,t))];case\"Asinh\":return[o.asinh(S(\"x\",r,e,t))];case\"Atan\":return[o.atan(S(\"x\",r,e,t))];case\"Atan2\":return[o.atan2(S(\"x\",r,e,t),S(\"y\",r,e,t))];case\"Atanh\":return[o.atanh(S(\"x\",r,e,t))];case\"Ceil\":return[o.ceil(S(\"x\",r,e,t))];case\"Complex\":return[o.complex(S(\"real\",r,e,t),S(\"imag\",r,e,t))];case\"Cos\":return[o.cos(S(\"x\",r,e,t))];case\"Cosh\":return[o.cosh(S(\"x\",r,e,t))];case\"Elu\":return[o.elu(S(\"x\",r,e,t))];case\"Erf\":return[o.erf(S(\"x\",r,e,t))];case\"Exp\":return[o.exp(S(\"x\",r,e,t))];case\"Expm1\":return[o.expm1(S(\"x\",r,e,t))];case\"Floor\":return[o.floor(S(\"x\",r,e,t))];case\"Log\":return[o.log(S(\"x\",r,e,t))];case\"Log1p\":return[o.log1p(S(\"x\",r,e,t))];case\"Imag\":return[o.imag(S(\"x\",r,e,t))];case\"Neg\":return[o.neg(S(\"x\",r,e,t))];case\"Reciprocal\":return[o.reciprocal(S(\"x\",r,e,t))];case\"Real\":return[o.real(S(\"x\",r,e,t))];case\"Relu\":return[o.relu(S(\"x\",r,e,t))];case\"Round\":return[o.round(S(\"x\",r,e,t))];case\"Selu\":return[o.selu(S(\"x\",r,e,t))];case\"Sigmoid\":return[o.sigmoid(S(\"x\",r,e,t))];case\"Sin\":return[o.sin(S(\"x\",r,e,t))];case\"Sign\":return[o.sign(S(\"x\",r,e,t))];case\"Sinh\":return[o.sinh(S(\"x\",r,e,t))];case\"Softplus\":return[o.softplus(S(\"x\",r,e,t))];case\"Sqrt\":return[o.sqrt(S(\"x\",r,e,t))];case\"Square\":return[o.square(S(\"x\",r,e,t))];case\"Tanh\":return[o.tanh(S(\"x\",r,e,t))];case\"Tan\":return[o.tan(S(\"x\",r,e,t))];case\"ClipByValue\":return[o.clipByValue(S(\"x\",r,e,t),S(\"clipValueMin\",r,e,t),S(\"clipValueMax\",r,e,t))];case\"Relu6\":return[o.relu6(S(\"x\",r,e,t))];case\"Rsqrt\":return[o.rsqrt(Ht(r.inputNames[0],e,t))];case\"Prod\":return[o.prod(S(\"x\",r,e,t),S(\"axes\",r,e,t))];case\"LeakyRelu\":return[o.leakyRelu(S(\"x\",r,e,t),S(\"alpha\",r,e,t))];case\"Prelu\":return[o.prelu(S(\"x\",r,e,t),S(\"alpha\",r,e,t))];case\"IsNan\":return[o.isNaN(Ht(r.inputNames[0],e,t))];default:throw TypeError(`Node type ${r.op} is not implemented`)}};function Ur(r,e,t=\"\"){if(!(typeof r==\"number\"||typeof e==\"number\")){x.assert(r.length===e.length,()=>t+` Shapes ${r} and ${e} must match`);for(let o=0;ot+` Shapes ${r} and ${e} must match`)}}}function rN(r){return!(typeof r==\"number\"||r.some(e=>e<0))}function Xp(r,e,t){let o=dd(r,t),n=!rN(o);if(n&&e.length===0)throw new Error(`Tried to calculate elements of an empty list with non-fully-defined elementShape: ${o}`);if(n&&e.forEach(s=>{o=dd(s.shape,o)}),!rN(o))throw new Error(`Non-fully-defined elementShape: ${o}`);return o}function dd(r,e){if(typeof r==\"number\")return e;if(typeof e==\"number\")return r;if(r.length!==e.length)throw new Error(`Incompatible ranks during merge: ${r} vs. ${e}`);let t=[];for(let o=0;o=0&&s>=0&&n!==s)throw new Error(`Incompatible shape during merge: ${r} vs. ${e}`);t[o]=n>=0?n:s}return t}var hd=class{constructor(e,t,o,n,s,a,i){this.name=e,this.dtype=t,this.maxSize=o,this.elementShape=n,this.identicalElementShapes=s,this.dynamicSize=a,this.clearAfterRead=i,this.tensors=[],this.closed_=!1,this.idTensor=be(0),So(this.idTensor)}get id(){return this.idTensor.id}get closed(){return this.closed_}clearAndClose(e){this.tensors.forEach(t=>{(e==null||!e.has(t.tensor.id))&&t.tensor.dispose()}),this.tensors=[],this.closed_=!0,this.idTensor.dispose()}size(){return this.tensors.length}read(e){if(this.closed_)throw new Error(`TensorArray ${this.name} has already been closed.`);if(e<0||e>=this.size())throw new Error(`Tried to read from index ${e}, but array size is: ${this.size()}`);let t=this.tensors[e];if(t.cleared)throw new Error(`TensorArray ${this.name}: Could not read index ${e} twice because it was cleared after a previous read (perhaps try setting clear_after_read = false?).`);return this.clearAfterRead&&(t.cleared=!0),t.read=!0,t.tensor}readMany(e){return e.map(t=>this.read(t))}write(e,t){if(this.closed_)throw new Error(`TensorArray ${this.name} has already been closed.`);if(e<0||!this.dynamicSize&&e>=this.maxSize)throw new Error(`Tried to write to index ${e}, but array is not resizeable and size is: ${this.maxSize}`);let o=this.tensors[e]||{};if(t.dtype!==this.dtype)throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${e},\n because the value dtype is ${t.dtype}, but TensorArray dtype is ${this.dtype}.`);if(this.size()===0&&(this.elementShape==null||this.elementShape.length===0)&&(this.elementShape=t.shape),Ur(this.elementShape,t.shape,`TensorArray ${this.name}: Could not write to TensorArray index ${e}.`),o.read)throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${e}, because it has already been read.`);if(o.written)throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${e}, because it has already been written.`);o.tensor=t,So(t),o.written=!0,this.tensors[e]=o}writeMany(e,t){if(e.length!==t.length)throw new Error(`TensorArray ${this.name}: could not write multiple tensors,because the index size: ${e.length} is not the same as tensors size: ${t.length}.`);e.forEach((o,n)=>this.write(o,t[n]))}gather(e,t){if(!!t&&t!==this.dtype)throw new Error(`TensorArray dtype is ${this.dtype} but gather requested dtype ${t}`);if(e)e=e.slice(0,this.size());else{e=[];for(let n=0;n=this.maxSize)throw new Error(`Max index must be < array size (${o} vs. ${this.maxSize})`);this.writeMany(e,ko(t,0))}split(e,t){if(t.dtype!==this.dtype)throw new Error(`TensorArray dtype is ${this.dtype} but tensor has dtype ${t.dtype}`);let o=0,n=e.map(p=>(o+=p,o));if(o!==t.shape[0])throw new Error(`Expected sum of lengths to be equal to\n tensor.shape[0], but sum of lengths is\n ${o}, and tensor's shape is: ${t.shape}`);if(!this.dynamicSize&&e.length!==this.maxSize)throw new Error(`TensorArray's size is not equal to the size of lengths (${this.maxSize} vs. ${e.length}), and the TensorArray is not marked as dynamically resizeable`);let s=o===0?0:t.size/o,a=[];Ne(()=>{t=z(t,[1,o,s]);for(let p=0;p{if(o!==s.dtype)throw new Error(`Invalid data types; op elements ${o}, but list elements ${s.dtype}`);Ur(t,s.shape,\"TensorList shape mismatch: \"),So(s)}),this.idTensor=be(0),this.maxNumElements=n,So(this.idTensor)}get id(){return this.idTensor.id}copy(){return new Ra([...this.tensors],this.elementShape,this.elementDtype)}clearAndClose(e){this.tensors.forEach(t=>{(e==null||!e.has(t.id))&&t.dispose()}),this.tensors.length=0,this.idTensor.dispose()}size(){return this.tensors.length}stack(e,t,o=-1){if(t!==this.elementDtype)throw new Error(`Invalid data types; op elements ${t}, but list elements ${this.elementDtype}`);if(o!==-1&&this.tensors.length!==o)throw new Error(`Operation expected a list with ${o} elements but got a list with ${this.tensors.length} elements.`);Ur(e,this.elementShape,\"TensorList shape mismatch: \");let n=Xp(this.elementShape,this.tensors,e);return Ne(()=>{let s=this.tensors.map(a=>z(a,n));return Ir(s,0)})}popBack(e,t){if(t!==this.elementDtype)throw new Error(`Invalid data types; op elements ${t}, but list elements ${this.elementDtype}`);if(this.size()===0)throw new Error(\"Trying to pop from an empty list.\");let o=Xp(this.elementShape,this.tensors,e),n=this.tensors.pop();return n.kept=!1,Ur(n.shape,e,\"TensorList shape mismatch: \"),z(n,o)}pushBack(e){if(e.dtype!==this.elementDtype)throw new Error(`Invalid data types; op elements ${e.dtype}, but list elements ${this.elementDtype}`);if(Ur(e.shape,this.elementShape,\"TensorList shape mismatch: \"),this.maxNumElements===this.size())throw new Error(\"Trying to push element into a full list.\");So(e),this.tensors.push(e)}resize(e){if(e<0)throw new Error(`TensorListResize expects size to be non-negative. Got: ${e}`);if(this.maxNumElements!==-1&&e>this.maxNumElements)throw new Error(`TensorListResize input size ${e} is greater maxNumElement ${this.maxNumElements}.`);let t=new Ra([],this.elementShape,this.elementDtype,this.maxNumElements);t.tensors.length=e;for(let o=0;othis.tensors.length)throw new Error(`Trying to access element ${e} in a list with ${this.tensors.length} elements.`);if(this.tensors[e]==null)throw new Error(`element at index ${e} is null.`);Ur(this.tensors[e].shape,t,\"TensorList shape mismatch: \");let n=Xp(this.elementShape,this.tensors,t);return z(this.tensors[e],n)}setItem(e,t){if(t.dtype!==this.elementDtype)throw new Error(`Invalid data types; op elements ${t.dtype}, but list elements ${this.elementDtype}`);if(e<0||this.maxNumElements!==-1&&e>=this.maxNumElements)throw new Error(`Trying to set element ${e} in a list with max ${this.maxNumElements} elements.`);Ur(this.elementShape,t.shape,\"TensorList shape mismatch: \"),So(t),this.tensors[e]!=null&&(this.tensors[e].kept=!1),this.tensors[e]=t}gather(e,t,o){if(t!==this.elementDtype)throw new Error(`Invalid data types; op elements ${t}, but list elements ${this.elementDtype}`);Ur(this.elementShape,o,\"TensorList shape mismatch: \"),e=e.slice(0,this.size());let n=Xp(this.elementShape,this.tensors,o);return e.length===0?nr([],[0].concat(n)):Ne(()=>{let s=e.map(a=>z(this.tensors[a],n));return Ir(s,0)})}concat(e,t){if(!!e&&e!==this.elementDtype)throw new Error(`TensorList dtype is ${this.elementDtype} but concat requested dtype ${e}`);Ur(this.elementShape,t,\"TensorList shape mismatch: \");let o=Xp(this.elementShape,this.tensors,t);return this.size()===0?nr([],[0].concat(o)):Ne(()=>{let n=this.tensors.map(s=>z(s,o));return gt(n,0)})}};function oN(r,e,t){let o=r.dtype;if(r.shape.length<1)throw new Error(`Tensor must be at least a vector, but saw shape: ${r.shape}`);if(r.dtype!==t)throw new Error(`Invalid data types; op elements ${r.dtype}, but list elements ${t}`);let n=r.shape.slice(1);Ur(n,e,\"TensorList shape mismatch: \");let s=ko(r);return new Ra(s,e,o)}function nN(r,e,t,o){return new Ra([],r,e,o)}function sN(r,e,t,o){if(e.length!==r.shape[0])throw new Error(`Expected len(indices) == tensor.shape[0], but saw: ${e.length} vs. ${r.shape[0]}`);let n=Math.max(...e);if(o!=null&&o!==-1&&n>=o)throw new Error(`Max index must be < array size (${n} vs. ${o})`);let s=new Ra([],t,r.dtype,o),a=ko(r,0);return e.forEach((i,p)=>{s.setItem(i,a[p])}),s}function aN(r,e,t){let o=0,n=e.map(c=>(o+=c,o));if(o!==r.shape[0])throw new Error(`Expected sum of lengths to be equal to\n tensor.shape[0], but sum of lengths is\n ${o}, and tensor's shape is: ${r.shape}`);let s=r.shape.slice(1),a=dd(s,t),i=o===0?0:r.size/o,p=Ne(()=>{let c=[];r=z(r,[1,o,i]);for(let l=0;l{switch(r.op){case\"If\":case\"StatelessIf\":{let o=S(\"thenBranch\",r,e,t),n=S(\"elseBranch\",r,e,t),s=S(\"cond\",r,e,t),a=S(\"args\",r,e,t);return(await s.data())[0]?t.functionMap[o].executeFunctionAsync(a,t.tensorArrayMap,t.tensorListMap):t.functionMap[n].executeFunctionAsync(a,t.tensorArrayMap,t.tensorListMap)}case\"While\":case\"StatelessWhile\":{let o=S(\"body\",r,e,t),n=S(\"cond\",r,e,t),s=S(\"args\",r,e,t),a=await t.functionMap[n].executeFunctionAsync(s,t.tensorArrayMap,t.tensorListMap),i=s.map(c=>c.id),p=await a[0].data();a.forEach(c=>{!c.kept&&i.indexOf(c.id)===-1&&c.dispose()});let u=s;for(;p[0];){let c=u;u=await t.functionMap[o].executeFunctionAsync(u,t.tensorArrayMap,t.tensorListMap);let l=u.map(f=>f.id);c.forEach(f=>{!f.kept&&i.indexOf(f.id)===-1&&l.indexOf(f.id)===-1&&f.dispose()});let m=await t.functionMap[n].executeFunctionAsync(u,t.tensorArrayMap,t.tensorListMap);p=await m[0].data(),m.forEach(f=>{!f.kept&&i.indexOf(f.id)===-1&&l.indexOf(f.id)===-1&&f.dispose()})}return u}case\"LoopCond\":{let o=S(\"pred\",r,e,t);return[ss(o)]}case\"Switch\":{let o=S(\"pred\",r,e,t),n=S(\"data\",r,e,t);return n.kept||(n=ss(n)),(await o.data())[0]?[void 0,n]:[n,void 0]}case\"Merge\":{let o=r.inputNames.find(n=>Ht(n,e,t)!==void 0);if(o){let n=Ht(o,e,t);return[ss(n)]}return}case\"Enter\":{let o=S(\"frameName\",r,e,t),n=S(\"tensor\",r,e,t);return t.enterFrame(o),[ss(n)]}case\"Exit\":{let o=S(\"tensor\",r,e,t);return t.exitFrame(),[ss(o)]}case\"NextIteration\":{let o=S(\"tensor\",r,e,t);return t.nextIteration(),[ss(o)]}case\"TensorArrayV3\":{let o=S(\"size\",r,e,t),n=S(\"dtype\",r,e,t),s=S(\"elementShape\",r,e,t),a=S(\"dynamicSize\",r,e,t),i=S(\"clearAfterRead\",r,e,t),p=S(\"identicalElementShapes\",r,e,t),u=S(\"name\",r,e,t),c=new hd(u,n,o,s,p,a,i);return t.addTensorArray(c),[c.idTensor,be(1)]}case\"TensorArrayWriteV3\":{let o=S(\"tensorArrayId\",r,e,t),n=S(\"index\",r,e,t),s=S(\"tensor\",r,e,t),a=t.getTensorArray(o.id);return a.write(n,s),[a.idTensor]}case\"TensorArrayReadV3\":{let o=S(\"tensorArrayId\",r,e,t),n=S(\"index\",r,e,t);return[t.getTensorArray(o.id).read(n)]}case\"TensorArrayGatherV3\":{let o=S(\"tensorArrayId\",r,e,t),n=S(\"indices\",r,e,t),s=S(\"dtype\",r,e,t);return[t.getTensorArray(o.id).gather(n,s)]}case\"TensorArrayScatterV3\":{let o=S(\"tensorArrayId\",r,e,t),n=S(\"indices\",r,e,t),s=S(\"tensor\",r,e,t),a=t.getTensorArray(o.id);return a.scatter(n,s),[a.idTensor]}case\"TensorArrayConcatV3\":{let o=S(\"tensorArrayId\",r,e,t),n=t.getTensorArray(o.id),s=S(\"dtype\",r,e,t);return[n.concat(s)]}case\"TensorArraySplitV3\":{let o=S(\"tensorArrayId\",r,e,t),n=S(\"tensor\",r,e,t),s=S(\"lengths\",r,e,t),a=t.getTensorArray(o.id);return a.split(s,n),[a.idTensor]}case\"TensorArraySizeV3\":{let o=S(\"tensorArrayId\",r,e,t),n=t.getTensorArray(o.id);return[be(n.size(),\"int32\")]}case\"TensorArrayCloseV3\":{let o=S(\"tensorArrayId\",r,e,t),n=t.getTensorArray(o.id);return n.clearAndClose(),[n.idTensor]}case\"TensorListSetItem\":{let o=S(\"tensorListId\",r,e,t),n=S(\"index\",r,e,t),s=S(\"tensor\",r,e,t),a=t.getTensorList(o.id);return a.setItem(n,s),[a.idTensor]}case\"TensorListGetItem\":{let o=S(\"tensorListId\",r,e,t),n=S(\"index\",r,e,t),s=S(\"elementShape\",r,e,t),a=S(\"elementDType\",r,e,t);return[t.getTensorList(o.id).getItem(n,s,a)]}case\"TensorListScatterV2\":case\"TensorListScatter\":{let o=S(\"indices\",r,e,t),n=S(\"tensor\",r,e,t),s=S(\"elementShape\",r,e,t),a=S(\"numElements\",r,e,t),i=sN(n,o,s,a);return t.addTensorList(i),[i.idTensor]}case\"TensorListReserve\":case\"EmptyTensorList\":{let o=S(\"elementShape\",r,e,t),n=S(\"elementDType\",r,e,t),s;r.op===\"TensorListReserve\"?s=\"numElements\":s=\"maxNumElements\";let a=S(s,r,e,t),i=r.op===\"TensorListReserve\"?-1:a,p=nN(o,n,a,i);return t.addTensorList(p),[p.idTensor]}case\"TensorListGather\":{let o=S(\"tensorListId\",r,e,t),n=S(\"indices\",r,e,t),s=S(\"elementShape\",r,e,t),a=S(\"elementDType\",r,e,t);return[t.getTensorList(o.id).gather(n,a,s)]}case\"TensorListStack\":{let o=S(\"tensorListId\",r,e,t),n=S(\"elementShape\",r,e,t),s=S(\"elementDType\",r,e,t),a=S(\"numElements\",r,e,t);return[t.getTensorList(o.id).stack(n,s,a)]}case\"TensorListFromTensor\":{let o=S(\"tensor\",r,e,t),n=S(\"elementShape\",r,e,t),s=S(\"elementDType\",r,e,t),a=oN(o,n,s);return t.addTensorList(a),[a.idTensor]}case\"TensorListConcat\":case\"TensorListConcatV2\":{let o=S(\"tensorListId\",r,e,t),n=t.getTensorList(o.id),s=S(\"dtype\",r,e,t),a=S(\"elementShape\",r,e,t);return[n.concat(s,a)]}case\"TensorListPushBack\":{let o=S(\"tensorListId\",r,e,t),n=S(\"tensor\",r,e,t),s=t.getTensorList(o.id);return s.pushBack(n),[s.idTensor]}case\"TensorListPopBack\":{let o=S(\"tensorListId\",r,e,t),n=S(\"elementShape\",r,e,t),s=S(\"elementDType\",r,e,t);return[t.getTensorList(o.id).popBack(n,s)]}case\"TensorListSplit\":{let o=S(\"tensor\",r,e,t),n=S(\"elementShape\",r,e,t),s=S(\"lengths\",r,e,t),a=aN(o,s,n);return t.addTensorList(a),[a.idTensor]}case\"TensorListLength\":{let o=S(\"tensorListId\",r,e,t),n=t.getTensorList(o.id);return[be(n.size(),\"int32\")]}case\"TensorListResize\":{let o=S(\"tensorListId\",r,e,t),n=S(\"size\",r,e,t),a=t.getTensorList(o.id).resize(n);return t.addTensorList(a),[a.idTensor]}default:throw TypeError(`Node type ${r.op} is not implemented`)}};function uN(r,e,t){let[o,n]=S(\"fusedOps\",r,e,t),s=o===\"biasadd\",a=!s,i=n===\"prelu\",p=o===\"fusedbatchnorm\",u=S(\"numArgs\",r,e,t);if(s){if(i&&u!==2)throw new Error(\"FusedConv2d and DepthwiseConv2d with BiasAdd and Prelu must have two extra arguments: bias and alpha.\");if(!i&&s&&u!==1)throw new Error(\"FusedConv2d and DepthwiseConv2d with BiasAdd must have one extra argument: bias.\")}if(p)throw new Error(\"FusedConv2d and DepthwiseConv2d with FusedBatchNorm is not supported\");let c=S(\"strides\",r,e,t),l=gl(r,e,t),m=S(\"dataFormat\",r,e,t).toUpperCase(),f=S(\"dilations\",r,e,t),[d,h]=S(\"args\",r,e,t);a&&(h=d,d=void 0);let g=S(\"leakyreluAlpha\",r,e,t);return{stride:c,pad:l,dataFormat:m,dilations:f,biasArg:d,preluArg:h,activationFunc:n,leakyreluAlpha:g}}var pN=(r,e,t,o=rt)=>{switch(r.op){case\"Conv1D\":{let n=S(\"stride\",r,e,t),s=S(\"pad\",r,e,t),a=S(\"dataFormat\",r,e,t).toUpperCase(),i=S(\"dilation\",r,e,t);return[o.conv1d(S(\"x\",r,e,t),S(\"filter\",r,e,t),n,s,a,i)]}case\"Conv2D\":{let n=S(\"strides\",r,e,t),s=gl(r,e,t),a=S(\"dataFormat\",r,e,t).toUpperCase(),i=S(\"dilations\",r,e,t);return[o.conv2d(S(\"x\",r,e,t),S(\"filter\",r,e,t),[n[1],n[2]],s,a,[i[1],i[2]])]}case\"_FusedConv2D\":{let{stride:n,pad:s,dataFormat:a,dilations:i,biasArg:p,preluArg:u,activationFunc:c,leakyreluAlpha:l}=uN(r,e,t);return[o.fused.conv2d({x:S(\"x\",r,e,t),filter:S(\"filter\",r,e,t),strides:[n[1],n[2]],pad:s,dataFormat:a,dilations:[i[1],i[2]],bias:p,activation:c,preluActivationWeights:u,leakyreluAlpha:l})]}case\"FusedDepthwiseConv2dNative\":{let{stride:n,pad:s,dataFormat:a,dilations:i,biasArg:p,preluArg:u,activationFunc:c,leakyreluAlpha:l}=uN(r,e,t);return[o.fused.depthwiseConv2d({x:S(\"x\",r,e,t),filter:S(\"filter\",r,e,t),strides:[n[1],n[2]],pad:s,dataFormat:a,dilations:[i[1],i[2]],bias:p,activation:c,preluActivationWeights:u,leakyreluAlpha:l})]}case\"Conv2DBackpropInput\":case\"Conv2dTranspose\":{let n=S(\"outputShape\",r,e,t),s=S(\"strides\",r,e,t),a=gl(r,e,t);return[o.conv2dTranspose(S(\"x\",r,e,t),S(\"filter\",r,e,t),n,[s[1],s[2]],a)]}case\"DepthwiseConv2dNative\":case\"DepthwiseConv2d\":{let n=S(\"strides\",r,e,t),s=gl(r,e,t),a=S(\"dilations\",r,e,t),i=S(\"dataFormat\",r,e,t).toUpperCase();return[o.depthwiseConv2d(S(\"input\",r,e,t),S(\"filter\",r,e,t),[n[1],n[2]],s,i,[a[1],a[2]])]}case\"Conv3D\":{let n=S(\"strides\",r,e,t),s=S(\"pad\",r,e,t),a=S(\"dataFormat\",r,e,t).toUpperCase(),i=S(\"dilations\",r,e,t);return[o.conv3d(S(\"x\",r,e,t),S(\"filter\",r,e,t),[n[1],n[2],n[3]],s,a,[i[1],i[2],i[3]])]}case\"AvgPool\":{let n=S(\"strides\",r,e,t),s=S(\"pad\",r,e,t),a=S(\"kernelSize\",r,e,t);return[o.avgPool(S(\"x\",r,e,t),[a[1],a[2]],[n[1],n[2]],s)]}case\"MaxPool\":{let n=S(\"strides\",r,e,t),s=S(\"pad\",r,e,t),a=S(\"kernelSize\",r,e,t);return[o.maxPool(S(\"x\",r,e,t),[a[1],a[2]],[n[1],n[2]],s)]}case\"MaxPoolWithArgmax\":{let n=S(\"strides\",r,e,t),s=S(\"pad\",r,e,t),a=S(\"kernelSize\",r,e,t),i=S(\"includeBatchInIndex\",r,e,t),{result:p,indexes:u}=o.maxPoolWithArgmax(S(\"x\",r,e,t),[a[1],a[2]],[n[1],n[2]],s,i);return[p,u]}case\"AvgPool3D\":{let n=S(\"strides\",r,e,t),s=S(\"pad\",r,e,t),a=S(\"kernelSize\",r,e,t);return[o.avgPool3d(S(\"x\",r,e,t),[a[1],a[2],a[3]],[n[1],n[2],n[3]],s)]}case\"MaxPool3D\":{let n=S(\"strides\",r,e,t),s=S(\"pad\",r,e,t),a=S(\"kernelSize\",r,e,t);return[o.maxPool3d(S(\"x\",r,e,t),[a[1],a[2],a[3]],[n[1],n[2],n[3]],s)]}case\"Dilation2D\":{let n=S(\"strides\",r,e,t),s=S(\"pad\",r,e,t),a=S(\"dilations\",r,e,t),i=n[1],p=n[2],u=a[1],c=a[2];return[o.dilation2d(S(\"x\",r,e,t),S(\"filter\",r,e,t),[i,p],s,[u,c],\"NHWC\")]}default:throw TypeError(`Node type ${r.op} is not implemented`)}};var cN=(r,e,t,o=rt)=>{switch(r.op){case\"Fill\":{let n=S(\"shape\",r,e,t),s=S(\"dtype\",r,e,t),a=S(\"value\",r,e,t);return[o.fill(n,a,s)]}case\"LinSpace\":{let n=S(\"start\",r,e,t),s=S(\"stop\",r,e,t),a=S(\"num\",r,e,t);return[o.linspace(n,s,a)]}case\"Multinomial\":{let n=S(\"logits\",r,e,t),s=S(\"numSamples\",r,e,t),a=S(\"seed\",r,e,t);return[o.multinomial(n,s,a)]}case\"OneHot\":{let n=S(\"indices\",r,e,t),s=S(\"depth\",r,e,t),a=S(\"onValue\",r,e,t),i=S(\"offValue\",r,e,t),p=S(\"dtype\",r,e,t);return[o.oneHot(n,s,a,i,p)]}case\"Ones\":return[o.ones(S(\"shape\",r,e,t),S(\"dtype\",r,e,t))];case\"OnesLike\":return[o.onesLike(S(\"x\",r,e,t))];case\"RandomStandardNormal\":return[o.randomStandardNormal(S(\"shape\",r,e,t),S(\"dtype\",r,e,t),S(\"seed\",r,e,t))];case\"RandomUniform\":return[o.randomUniform(S(\"shape\",r,e,t),S(\"minval\",r,e,t),S(\"maxval\",r,e,t),S(\"dtype\",r,e,t))];case\"Range\":{let n=S(\"start\",r,e,t),s=S(\"stop\",r,e,t),a=S(\"step\",r,e,t);return[o.range(n,s,a,S(\"dtype\",r,e,t))]}case\"TruncatedNormal\":{let n=S(\"shape\",r,e,t),s=S(\"mean\",r,e,t),a=S(\"stdDev\",r,e,t),i=S(\"seed\",r,e,t);return[o.truncatedNormal(n,s,a,S(\"dtype\",r,e,t),i)]}case\"Zeros\":return[o.zeros(S(\"shape\",r,e,t),S(\"dtype\",r,e,t))];case\"ZerosLike\":return[o.zerosLike(S(\"x\",r,e,t))];default:throw TypeError(`Node type ${r.op} is not implemented`)}};function YC(r,e,t){let o=S(\"boxes\",r,e,t),n=S(\"scores\",r,e,t),s=S(\"maxOutputSize\",r,e,t),a=S(\"iouThreshold\",r,e,t),i=S(\"scoreThreshold\",r,e,t),p=S(\"softNmsSigma\",r,e,t);return{boxes:o,scores:n,maxOutputSize:s,iouThreshold:a,scoreThreshold:i,softNmsSigma:p}}var lN=async(r,e,t,o,n=rt)=>{switch(r.op){case\"NonMaxSuppressionV5\":{let{boxes:s,scores:a,maxOutputSize:i,iouThreshold:p,scoreThreshold:u,softNmsSigma:c}=YC(r,e,t),l=await n.image.nonMaxSuppressionWithScoreAsync(s,a,i,p,u,c);return[l.selectedIndices,l.selectedScores]}case\"NonMaxSuppressionV4\":{let{boxes:s,scores:a,maxOutputSize:i,iouThreshold:p,scoreThreshold:u}=YC(r,e,t),c=S(\"padToMaxOutputSize\",r,e,t),l=await n.image.nonMaxSuppressionPaddedAsync(s,a,i,p,u,c);return[l.selectedIndices,l.validOutputs]}case\"NonMaxSuppressionV3\":case\"NonMaxSuppressionV2\":{let{boxes:s,scores:a,maxOutputSize:i,iouThreshold:p,scoreThreshold:u}=YC(r,e,t);return[await n.image.nonMaxSuppressionAsync(s,a,i,p,u)]}case\"Where\":{let s=n.cast(S(\"condition\",r,e,t),\"bool\"),a=[await n.whereAsync(s)];return s.dispose(),a}case\"ListDiff\":return n.setdiff1dAsync(S(\"x\",r,e,t),S(\"y\",r,e,t));default:throw TypeError(`Node type ${r.op} is not implemented`)}};var mN=(r,e,t,o=rt)=>{switch(r.op){case\"LowerBound\":{let n=S(\"sortedSequence\",r,e,t),s=S(\"values\",r,e,t);return[o.lowerBound(n,s)]}case\"TopKV2\":{let n=S(\"x\",r,e,t),s=S(\"k\",r,e,t),a=S(\"sorted\",r,e,t),i=o.topk(n,s,a);return[i.values,i.indices]}case\"UpperBound\":{let n=S(\"sortedSequence\",r,e,t),s=S(\"values\",r,e,t);return[o.upperBound(n,s)]}case\"Unique\":{let n=S(\"x\",r,e,t),s=o.unique(n);return[s.values,s.indices]}case\"UniqueV2\":{let n=S(\"x\",r,e,t),s=S(\"axis\",r,e,t),a=o.unique(n,s);return[a.values,a.indices]}default:throw TypeError(`Node type ${r.op} is not implemented`)}};var fN=(r,e,t,o=rt)=>{switch(r.op){case\"Const\":return e[r.name];case\"PlaceholderWithDefault\":let n=S(\"default\",r,e,t);return[Ht(r.name,e,t)||n];case\"Placeholder\":return[Ht(r.name,e,t)];case\"Identity\":case\"StopGradient\":case\"FakeQuantWithMinMaxVars\":{let c=S(\"x\",r,e,t);return[ss(c)]}case\"IdentityN\":return S(\"x\",r,e,t).map(c=>ss(c));case\"Snapshot\":let s=S(\"x\",r,e,t);return[ss(s)];case\"Shape\":return[o.tensor1d(S(\"x\",r,e,t).shape,\"int32\")];case\"ShapeN\":return S(\"x\",r,e,t).map(c=>o.tensor1d(c.shape));case\"Size\":return[o.scalar(S(\"x\",r,e,t).size,\"int32\")];case\"Rank\":return[o.scalar(S(\"x\",r,e,t).rank,\"int32\")];case\"NoOp\":return[o.scalar(1)];case\"Print\":let a=S(\"x\",r,e,t),i=S(\"data\",r,e,t),p=S(\"message\",r,e,t),u=S(\"summarize\",r,e,t);console.warn(\"The graph has a tf.print() operation,usually used for debugging, which slows down performance.\"),console.log(p);for(let c=0;ce.dispose()),this.tensorMap.clear(),this.handle.dispose()}size(){return this.tensorMap.size}tensorSize(){return be(this.size(),\"int32\")}async import(e,t){this.checkKeyAndValueTensor(e,t);let o=await e.data();return this.tensorMap.forEach(n=>n.dispose()),this.tensorMap.clear(),Ne(()=>{let n=ko(t),s=o.length,a=n.length;x.assert(s===a,()=>`The number of elements doesn't match, keys has ${s} elements, the values has ${a} elements.`);for(let i=0;i{let n=[];for(let s=0;s{switch(r.op){case\"HashTable\":case\"HashTableV2\":{let n=o.getHashTableHandleByName(r.name);if(n!=null)return[n];{let s=S(\"keyDType\",r,e,t),a=S(\"valueDType\",r,e,t),i=new gd(s,a);return o.addHashTable(r.name,i),[i.handle]}}case\"LookupTableImport\":case\"LookupTableImportV2\":{let n=S(\"tableHandle\",r,e,t,o),s=S(\"keys\",r,e,t),a=S(\"values\",r,e,t);return[await o.getHashTableById(n.id).import(s,a)]}case\"LookupTableFind\":case\"LookupTableFindV2\":{let n=S(\"tableHandle\",r,e,t,o),s=S(\"keys\",r,e,t),a=S(\"defaultValue\",r,e,t);return[await o.getHashTableById(n.id).find(s,a)]}case\"LookupTableSize\":case\"LookupTableSizeV2\":{let n=S(\"tableHandle\",r,e,t,o);return[o.getHashTableById(n.id).tensorSize()]}default:throw TypeError(`Node type ${r.op} is not implemented`)}};var hN=(r,e,t,o=rt)=>{switch(r.op){case\"ResizeBilinear\":{let n=S(\"images\",r,e,t),s=S(\"size\",r,e,t),a=S(\"alignCorners\",r,e,t),i=S(\"halfPixelCenters\",r,e,t);return[o.image.resizeBilinear(n,[s[0],s[1]],a,i)]}case\"ResizeNearestNeighbor\":{let n=S(\"images\",r,e,t),s=S(\"size\",r,e,t),a=S(\"alignCorners\",r,e,t),i=S(\"halfPixelCenters\",r,e,t);return[o.image.resizeNearestNeighbor(n,[s[0],s[1]],a,i)]}case\"CropAndResize\":{let n=S(\"image\",r,e,t),s=S(\"boxes\",r,e,t),a=S(\"boxInd\",r,e,t),i=S(\"cropSize\",r,e,t),p=S(\"method\",r,e,t),u=S(\"extrapolationValue\",r,e,t);return[o.image.cropAndResize(n,s,a,i,p,u)]}case\"ImageProjectiveTransformV3\":{let n=S(\"images\",r,e,t),s=S(\"transforms\",r,e,t),a=S(\"outputShape\",r,e,t),i=S(\"fillValue\",r,e,t),p=S(\"interpolation\",r,e,t),u=S(\"fillMode\",r,e,t);return[o.image.transform(n,s,p.toLowerCase(),u.toLowerCase(),i,a)]}default:throw TypeError(`Node type ${r.op} is not implemented`)}};var gN=(r,e,t,o=rt)=>{switch(r.op){case\"Equal\":return[o.equal(S(\"a\",r,e,t),S(\"b\",r,e,t))];case\"NotEqual\":return[o.notEqual(S(\"a\",r,e,t),S(\"b\",r,e,t))];case\"Greater\":return[o.greater(S(\"a\",r,e,t),S(\"b\",r,e,t))];case\"GreaterEqual\":return[o.greaterEqual(S(\"a\",r,e,t),S(\"b\",r,e,t))];case\"Less\":return[o.less(S(\"a\",r,e,t),S(\"b\",r,e,t))];case\"LessEqual\":return[o.lessEqual(S(\"a\",r,e,t),S(\"b\",r,e,t))];case\"LogicalAnd\":return[o.logicalAnd(S(\"a\",r,e,t),S(\"b\",r,e,t))];case\"LogicalNot\":return[o.logicalNot(S(\"a\",r,e,t))];case\"LogicalOr\":return[o.logicalOr(S(\"a\",r,e,t),S(\"b\",r,e,t))];case\"Select\":case\"SelectV2\":return[o.where(S(\"condition\",r,e,t),S(\"a\",r,e,t),S(\"b\",r,e,t))];default:throw TypeError(`Node type ${r.op} is not implemented`)}};var xN=(r,e,t,o=rt)=>{switch(r.op){case\"BatchMatMul\":case\"BatchMatMulV2\":case\"MatMul\":return[o.matMul(S(\"a\",r,e,t),S(\"b\",r,e,t),S(\"transposeA\",r,e,t),S(\"transposeB\",r,e,t))];case\"Einsum\":return[o.einsum(S(\"equation\",r,e,t),...S(\"tensors\",r,e,t))];case\"Transpose\":return[o.transpose(S(\"x\",r,e,t),S(\"perm\",r,e,t))];case\"_FusedMatMul\":let[n,s]=S(\"fusedOps\",r,e,t),a=n===\"biasadd\",i=s===\"prelu\",p=S(\"numArgs\",r,e,t),u=S(\"leakyreluAlpha\",r,e,t);if(a){if(i&&p!==2)throw new Error(\"Fused MatMul with BiasAdd and Prelu must have two extra arguments: bias and alpha.\");if(!i&&p!==1)throw new Error(\"Fused MatMul with BiasAdd must have one extra argument: bias.\")}let[c,l]=S(\"args\",r,e,t);return[o.fused.matMul({a:S(\"a\",r,e,t),b:S(\"b\",r,e,t),transposeA:S(\"transposeA\",r,e,t),transposeB:S(\"transposeB\",r,e,t),bias:c,activation:s,preluActivationWeights:l,leakyreluAlpha:u})];default:throw TypeError(`Node type ${r.op} is not implemented`)}};var yN=(r,e,t,o=rt)=>{switch(r.op){case\"EuclideanNorm\":return[o.euclideanNorm(S(\"x\",r,e,t),S(\"axis\",r,e,t),S(\"keepDims\",r,e,t))];case\"FusedBatchNorm\":case\"FusedBatchNormV2\":return[o.batchNorm(S(\"x\",r,e,t),S(\"mean\",r,e,t),S(\"variance\",r,e,t),S(\"offset\",r,e,t),S(\"scale\",r,e,t),S(\"epsilon\",r,e,t))];case\"FusedBatchNormV3\":return[o.batchNorm(S(\"x\",r,e,t),S(\"mean\",r,e,t),S(\"variance\",r,e,t),S(\"offset\",r,e,t),S(\"scale\",r,e,t),S(\"epsilon\",r,e,t))];case\"LRN\":return[o.localResponseNormalization(S(\"x\",r,e,t),S(\"radius\",r,e,t),S(\"bias\",r,e,t),S(\"alpha\",r,e,t),S(\"beta\",r,e,t))];case\"Softmax\":return[o.softmax(S(\"x\",r,e,t))];case\"LogSoftmax\":return[o.logSoftmax(S(\"x\",r,e,t))];case\"SparseToDense\":return[o.sparseToDense(S(\"sparseIndices\",r,e,t),S(\"outputShape\",r,e,t),S(\"sparseValues\",r,e,t),S(\"defaultValue\",r,e,t))];default:throw TypeError(`Node type ${r.op} is not implemented`)}};var bN=(r,e,t,o=rt)=>{switch(r.op){case\"Max\":{let i=S(\"axis\",r,e,t),p=S(\"keepDims\",r,e,t);return[o.max(S(\"x\",r,e,t),i,p)]}case\"Mean\":{let i=S(\"axis\",r,e,t),p=S(\"keepDims\",r,e,t);return[o.mean(S(\"x\",r,e,t),i,p)]}case\"Min\":{let i=S(\"axis\",r,e,t),p=S(\"keepDims\",r,e,t);return[o.min(S(\"x\",r,e,t),i,p)]}case\"Sum\":{let i=S(\"axis\",r,e,t),p=S(\"keepDims\",r,e,t);return[o.sum(S(\"x\",r,e,t),i,p)]}case\"All\":{let i=S(\"axis\",r,e,t),p=S(\"keepDims\",r,e,t);return[o.all(S(\"x\",r,e,t),i,p)]}case\"Any\":{let i=S(\"axis\",r,e,t),p=S(\"keepDims\",r,e,t);return[o.any(S(\"x\",r,e,t),i,p)]}case\"ArgMax\":{let i=S(\"axis\",r,e,t);return[o.argMax(S(\"x\",r,e,t),i)]}case\"ArgMin\":{let i=S(\"axis\",r,e,t);return[o.argMin(S(\"x\",r,e,t),i)]}case\"Prod\":{let i=S(\"axis\",r,e,t),p=S(\"keepDims\",r,e,t);return[o.prod(S(\"x\",r,e,t),i,p)]}case\"Cumprod\":{let i=S(\"axis\",r,e,t),p=S(\"exclusive\",r,e,t),u=S(\"reverse\",r,e,t);return[o.cumprod(S(\"x\",r,e,t),i,p,u)]}case\"Cumsum\":{let i=S(\"axis\",r,e,t),p=S(\"exclusive\",r,e,t),u=S(\"reverse\",r,e,t);return[o.cumsum(S(\"x\",r,e,t),i,p,u)]}case\"Bincount\":let n=S(\"x\",r,e,t),s=S(\"weights\",r,e,t),a=S(\"size\",r,e,t);return[o.bincount(n,s,a)];case\"DenseBincount\":{let i=S(\"x\",r,e,t),p=S(\"weights\",r,e,t),u=S(\"size\",r,e,t),c=S(\"binaryOutput\",r,e,t);return[o.denseBincount(i,p,u,c)]}default:throw TypeError(`Node type ${r.op} is not implemented`)}};var CN=(r,e,t,o=rt)=>{switch(r.op){case\"ConcatV2\":case\"Concat\":{let n=S(\"n\",r,e,t),s=S(\"axis\",r,e,t),a=S(\"tensors\",r,e,t);return a=a.slice(0,n),[o.concat(a,s)]}case\"Gather\":{let n=S(\"x\",r,e,t),s=S(\"indices\",r,e,t);return[o.gather(n,o.cast(s,\"int32\"),0)]}case\"GatherV2\":{let n=S(\"axis\",r,e,t),s=S(\"batchDims\",r,e,t),a=S(\"x\",r,e,t),i=S(\"indices\",r,e,t);return[o.gather(a,o.cast(i,\"int32\"),n,s)]}case\"Reverse\":{let n=S(\"dims\",r,e,t),s=[];for(let i=0;i{let n=S(\"axis\",r,e,t),s=S(\"tensors\",r,e,t),a=s[0].shape,i=o.squeeze(s[0]).shape,p=s.map(u=>{let c=x.arraysEqual(u.shape,a);if(!c&&!x.arraysEqual(o.squeeze(u).shape,i))throw new Error(\"the input tensors shape does not match\");return c?u:o.reshape(u,a)});return[o.stack(p,n)]});case\"Unpack\":{let n=S(\"axis\",r,e,t),s=S(\"tensor\",r,e,t);return o.unstack(s,n)}case\"Tile\":{let n=S(\"reps\",r,e,t);return[o.tile(S(\"x\",r,e,t),n)]}case\"Split\":case\"SplitV\":{let n=S(\"axis\",r,e,t),s=S(\"numOrSizeSplits\",r,e,t),a=S(\"x\",r,e,t);return o.split(a,s,n)}case\"ScatterNd\":{let n=S(\"indices\",r,e,t),s=S(\"values\",r,e,t),a=S(\"shape\",r,e,t);return[o.scatterND(n,s,a)]}case\"GatherNd\":{let n=S(\"x\",r,e,t),s=S(\"indices\",r,e,t);return[o.gatherND(n,s)]}case\"SparseToDense\":{let n=S(\"sparseIndices\",r,e,t),s=S(\"outputShape\",r,e,t),a=S(\"sparseValues\",r,e,t),i=S(\"defaultValue\",r,e,t);return[o.sparseToDense(n,a,s,a.dtype===i.dtype?i:o.cast(i,a.dtype))]}default:throw TypeError(`Node type ${r.op} is not implemented`)}};var IN=(r,e,t,o=rt)=>{switch(r.op){case\"SparseFillEmptyRows\":{let{outputIndices:n,outputValues:s,emptyRowIndicator:a,reverseIndexMap:i}=o.sparse.sparseFillEmptyRows(S(\"indices\",r,e,t),S(\"values\",r,e,t),S(\"denseShape\",r,e,t),S(\"defaultValue\",r,e,t));return[n,s,a,i]}case\"SparseReshape\":{let{outputIndices:n,outputShape:s}=o.sparse.sparseReshape(S(\"inputIndices\",r,e,t),S(\"inputShape\",r,e,t),S(\"newShape\",r,e,t));return[n,s]}case\"SparseSegmentMean\":return[o.sparse.sparseSegmentMean(S(\"data\",r,e,t),S(\"indices\",r,e,t),S(\"segmentIds\",r,e,t))];case\"SparseSegmentSum\":return[o.sparse.sparseSegmentSum(S(\"data\",r,e,t),S(\"indices\",r,e,t),S(\"segmentIds\",r,e,t))];default:throw TypeError(`Node type ${r.op} is not implemented`)}};var wN=(r,e,t,o=rt)=>{switch(r.op){case\"FFT\":return[o.fft(S(\"x\",r,e,t))];case\"IFFT\":return[o.ifft(S(\"x\",r,e,t))];case\"RFFT\":return[o.rfft(S(\"x\",r,e,t))];case\"IRFFT\":return[o.irfft(S(\"x\",r,e,t))];default:throw TypeError(`Node type ${r.op} is not implemented`)}};var SN=(r,e,t,o=rt)=>{switch(r.op){case\"StringNGrams\":{let{nGrams:n,nGramsSplits:s}=o.string.stringNGrams(S(\"data\",r,e,t),S(\"dataSplits\",r,e,t),S(\"separator\",r,e,t),S(\"nGramWidths\",r,e,t),S(\"leftPad\",r,e,t),S(\"rightPad\",r,e,t),S(\"padWidth\",r,e,t),S(\"preserveShortSequences\",r,e,t));return[n,s]}case\"StringSplit\":{let{indices:n,values:s,shape:a}=o.string.stringSplit(S(\"input\",r,e,t),S(\"delimiter\",r,e,t),S(\"skipEmpty\",r,e,t));return[n,s,a]}case\"StringToHashBucketFast\":return[o.string.stringToHashBucketFast(S(\"input\",r,e,t),S(\"numBuckets\",r,e,t))];default:throw TypeError(`Node type ${r.op} is not implemented`)}};var vN=(r,e,t,o=rt)=>{switch(r.op){case\"Cast\":return[o.cast(S(\"x\",r,e,t),S(\"dtype\",r,e,t))];case\"ExpandDims\":{let n=S(\"axis\",r,e,t);return[o.expandDims(S(\"x\",r,e,t),n)]}case\"Squeeze\":{let n=S(\"axis\",r,e,t);return[o.squeeze(S(\"x\",r,e,t),n)]}case\"Reshape\":return[o.reshape(S(\"x\",r,e,t),S(\"shape\",r,e,t))];case\"MirrorPad\":return[o.mirrorPad(S(\"x\",r,e,t),S(\"padding\",r,e,t),S(\"mode\",r,e,t))];case\"PadV2\":case\"Pad\":return[o.pad(S(\"x\",r,e,t),S(\"padding\",r,e,t),S(\"constantValue\",r,e,t))];case\"SpaceToBatchND\":{let n=S(\"blockShape\",r,e,t),s=S(\"paddings\",r,e,t);return[o.spaceToBatchND(S(\"x\",r,e,t),n,s)]}case\"BatchToSpaceND\":{let n=S(\"blockShape\",r,e,t),s=S(\"crops\",r,e,t);return[o.batchToSpaceND(S(\"x\",r,e,t),n,s)]}case\"DepthToSpace\":{let n=S(\"blockSize\",r,e,t),s=S(\"dataFormat\",r,e,t).toUpperCase();return[o.depthToSpace(S(\"x\",r,e,t),n,s)]}case\"BroadcastTo\":return[o.broadcastTo(S(\"x\",r,e,t),S(\"shape\",r,e,t))];case\"BroadcastArgs\":return[o.broadcastArgs(S(\"s0\",r,e,t),S(\"s1\",r,e,t))];default:throw TypeError(`Node type ${r.op} is not implemented`)}};function QC(r,e,t,o,n=Ne){let s=((a,i,p)=>{switch(a.category){case\"arithmetic\":return n(()=>eN(a,i,p));case\"basic_math\":return n(()=>tN(a,i,p));case\"control\":return iN(a,i,p);case\"convolution\":return n(()=>pN(a,i,p));case\"creation\":return n(()=>cN(a,i,p));case\"dynamic\":return lN(a,i,p);case\"evaluation\":return n(()=>mN(a,i,p));case\"image\":return n(()=>hN(a,i,p));case\"graph\":return n(()=>fN(a,i,p));case\"logical\":return n(()=>gN(a,i,p));case\"matrices\":return n(()=>xN(a,i,p));case\"normalization\":return n(()=>yN(a,i,p));case\"reduction\":return n(()=>bN(a,i,p));case\"slice_join\":return n(()=>CN(a,i,p));case\"sparse\":return n(()=>IN(a,i,p));case\"spectral\":return n(()=>wN(a,i,p));case\"string\":return n(()=>SN(a,i,p));case\"transformation\":return n(()=>vN(a,i,p));case\"hash_table\":return dN(a,i,p,o);case\"custom\":let u=td(a.op);if(u&&u.customExecutor)return u.customExecutor(new fd(a,i,p));throw TypeError(`Custom op ${a.op} is not registered.`);default:throw TypeError(`Unknown op '${a.op}'. File an issue at https://github.com/tensorflow/tfjs/issues so we can add it, or register a custom execution with tf.registerOp()`)}})(r,e,t);return x.isPromise(s)?s.then(a=>[].concat(a)):[].concat(s)}var yl=class{constructor(e={},t={},o={},n={}){this.weightMap=e,this.tensorArrayMap=t,this.tensorListMap=o,this.functionMap=n,this.rootContext={id:0,frameName:\"\",iterationId:0},this.contexts=[this.rootContext],this.lastId=0,this.generateCurrentContextIds()}newFrame(e,t){return{id:e,frameName:t,iterationId:0}}set currentContext(e){this.contexts!==e&&(this.contexts=e,this.generateCurrentContextIds())}get currentContext(){return this.contexts}get currentContextId(){return this._currentContextIds[0]}get currentContextIds(){return this._currentContextIds}generateCurrentContextIds(){let e=[];for(let t=0;tt.id===0&&t.iterationId===0?\"\":`${t.frameName}-${t.iterationId}`).join(\"/\"):\"\"}enterFrame(e){this.contexts&&(this.lastId++,this.contexts=this.contexts.slice(),this.contexts.push(this.newFrame(this.lastId,e)),this._currentContextIds.unshift(this.contextIdforContexts(this.contexts)))}exitFrame(){if(this.contexts&&this.contexts.length>1)this.contexts=this.contexts.slice(),this.contexts.splice(-1),this.currentContextIds.shift();else throw new Error(\"Cannot exit frame, the context is empty\")}nextIteration(){if(this.contexts&&this.contexts.length>0){this.contexts=this.contexts.slice(),this.lastId++;let e=Object.assign({},this.contexts[this.contexts.length-1]);e.iterationId+=1,e.id=this.lastId,this.contexts.splice(-1,1,e),this._currentContextIds.splice(0,1,this.contextIdforContexts(this.contexts))}else throw new Error(\"Cannot increase frame iteration, the context is empty\")}getWeight(e){return this.weightMap[e]}addTensorArray(e){this.tensorArrayMap[e.id]=e}getTensorArray(e){return this.tensorArrayMap[e]}addTensorList(e){this.tensorListMap[e.id]=e}getTensorList(e){return this.tensorListMap[e]}dispose(e){for(let t in this.tensorArrayMap)this.tensorArrayMap[t].clearAndClose(e);for(let t in this.tensorListMap)this.tensorListMap[t].clearAndClose(e)}};function ZC(r,e,t,o){let n=new Set,s=[],a=null,i=null,p=new Set,u=Object.keys(r).map(m=>Sr(m)[0]),c=[];o!=null&&(c=o.map(m=>Sr(m.name)[0]));let l=[...e];for(;l.length>0;){let m=l.pop();if((JC(m)||B6(m)||V6(m))&&a==null&&(a=m,i=a.children.map(f=>f.name).filter(f=>n.has(f))),n.add(m.name),t[m.name]==null&&u.indexOf(m.name)===-1&&c.indexOf(m.name)===-1){if(m.inputs.length===0){s.push(m.name);continue}m.inputs.forEach(f=>{p.has(f.name)||(p.add(f.name),l.push(f))})}}return{inputs:r,outputs:e,usedNodes:n,missingInputs:s,dynamicNode:a,syncInputs:i}}function kN(r,e,t){let{usedNodes:o,inputs:n}=t,s=[],a=Object.keys(n).map(c=>Sr(c)[0]).map(c=>r.nodes[c]),i=r.initNodes;a.forEach(c=>{o.has(c.name)&&s.push(c)}),r.weights.forEach(c=>{o.has(c.name)&&s.push(c)}),i!=null&&i.forEach(c=>{o.has(c.name)&&s.push(c)});let p=new Set,u=[];for(;s.length>0;){let c=s.pop();p.add(c.name),e[c.name]||u.push(c),c.children.forEach(l=>{!p.has(l.name)&&o.has(l.name)&&l.inputs.every(m=>p.has(m.name))&&s.push(l)})}return u}var O6=[\"Switch\",\"Merge\",\"Enter\",\"Exit\",\"NextIteration\",\"StatelessIf\",\"StatelessWhile\",\"if\",\"While\"],M6=[\"NonMaxSuppressionV2\",\"NonMaxSuppressionV3\",\"NonMaxSuppressionV5\",\"Where\"],L6=[\"HashTable\",\"HashTableV2\",\"LookupTableImport\",\"LookupTableImportV2\",\"LookupTableFind\",\"LookupTableFindV2\",\"LookupTableSize\",\"LookupTableSizeV2\"];function JC(r){return O6.indexOf(r.op)>=0}function B6(r){return M6.indexOf(r.op)>=0}function V6(r){return L6.indexOf(r.op)>=0}var Cu=class{constructor(e,t){this.graph=e,this.parent=t,this.compiledMap=new Map,this._weightMap={},this.SEPERATOR=\",\",this._functions={},this._functionExecutorMap={},this.intermediateTensors={},this.keepTensorForDebug=!1,this._outputs=e.outputs,this._inputs=e.inputs,this._initNodes=e.initNodes,this._signature=e.signature,this._functions=e.functions,e.functions!=null&&Object.keys(e.functions).forEach(o=>{this._functionExecutorMap[o]=new Cu(e.functions[o],this)})}get weightIds(){return this.parent?this.parent.weightIds:this._weightIds}get functionExecutorMap(){return this.parent?this.parent.functionExecutorMap:this._functionExecutorMap}get weightMap(){return this.parent?this.parent.weightMap:this._weightMap}set weightMap(e){let t=Object.keys(e).map(o=>e[o].map(n=>n.id));this._weightIds=[].concat(...t),this._weightMap=e}set resourceManager(e){this._resourceManager=e}get inputs(){return this._inputs.map(e=>({name:e.name,shape:e.attrParams.shape?e.attrParams.shape.value:void 0,dtype:e.attrParams.dtype?e.attrParams.dtype.value:void 0}))}get outputs(){return this._outputs.map(e=>({name:e.name,shape:e.attrParams.shape?e.attrParams.shape.value:void 0,dtype:e.attrParams.dtype?e.attrParams.dtype.value:void 0}))}get inputNodes(){return this._inputs.map(e=>e.signatureKey||e.name)}get outputNodes(){return this._outputs.map(e=>{let t=e.signatureKey||e.name;return e.defaultOutput?`${t}:${e.defaultOutput}`:t})}get functions(){return Object.keys(this._functions).reduce((e,t)=>(e[t]=this._functions[t].signature,e),{})}getCompilationKey(e,t){let o=e.map(s=>s.name).sort(),n=t.map(s=>s.name).sort();return o.join(this.SEPERATOR)+\"--\"+n.join(this.SEPERATOR)}compile(e,t){let o=ZC(e,t,this.weightMap,this._initNodes),{missingInputs:n,dynamicNode:s,syncInputs:a}=o;if(s!=null)throw new Error(`This execution contains the node '${s.name}', which has the dynamic op '${s.op}'. Please use model.executeAsync() instead. Alternatively, to avoid the dynamic ops, specify the inputs [${a}]`);if(n.length>0){let i=t.map(u=>u.name),p=Object.keys(e);throw new Error(`Cannot compute the outputs [${i}] from the provided inputs [${p}]. Missing the following inputs: [${n}]`)}return kN(this.graph,this.weightMap,o)}execute(e,t){e=this.mapInputs(e);let o=Object.keys(e).sort();this.checkInputs(e),this.checkInputShapeAndType(e),t=this.mapOutputs(t),this.checkOutputs(t);let n=o.map(l=>this.graph.nodes[Sr(l)[0]]),s=t.map(l=>Sr(l)[0]),a=s.map(l=>this.graph.nodes[l]);this.resetIntermediateTensors(),a.length===0&&(a=this._outputs);let i=this.getCompilationKey(n,a),p=this.compiledMap.get(i);p==null&&(p=this.compile(e,a),this.compiledMap.set(i,p));let u={},c={};return Ne(()=>{let l=new yl(this.weightMap,u,c,this.functionExecutorMap),m=Object.assign({},this.weightMap);Object.keys(e).forEach(h=>{let[g,y]=Sr(h),b=[];b[y]=e[h],m[g]=b});let f=this.getFrozenTensorIds(m),d={};for(let h=0;hHt(h,m,l))})}getFrozenTensorIds(e){let t=[].concat.apply([],Object.keys(e).map(o=>e[o]).map(o=>o.map(n=>n.id)));return new Set(t)}checkTensorForDisposal(e,t,o,n,s,a,i){t.category===\"control\"||a.indexOf(e)!==-1||(o[e].forEach(p=>{p!=null&&(i[p.id]=(i[p.id]||0)+t.children.length)}),t.inputs.forEach(p=>{if(p.category!==\"control\"){let u=YT(p.name,o,n);u!=null&&u.forEach(c=>{if(c&&!c.kept&&!s.has(c.id)){let l=i[c.id];if(l===1){if(!this.keepTensorForDebug)c.dispose();else{let[m,f]=zo(t.name,n);this.intermediateTensors[m]?this.intermediateTensors[m][f]=c:(this.intermediateTensors[m]=[],this.intermediateTensors[m][f]=c)}delete i[c.id]}else l!=null&&i[c.id]--}})}}))}async executeAsync(e,t){return this._executeAsync(e,t)}disposeIntermediateTensors(){!this.intermediateTensors||(Object.keys(this.intermediateTensors).forEach(e=>this.intermediateTensors[e].forEach(t=>t.dispose())),this.disposeTensorsMap())}disposeTensorsMap(){!this.tensorsMap||Object.keys(this.tensorsMap).forEach(e=>{this.tensorsMap[e].forEach(o=>{o&&!o.kept&&!o.isDisposed&&!this.keepIds.has(o.id)&&o.dispose()})})}getIntermediateTensors(){return this.tensorsMap}resetIntermediateTensors(){for(let e in this.intermediateTensors)this.intermediateTensors[e].forEach(t=>t.dispose()),delete this.intermediateTensors[e]}async _executeAsync(e,t,o=!1,n={},s={}){o||(e=this.mapInputs(e),this.checkInputs(e),this.checkInputShapeAndType(e),t=this.mapOutputs(t),this.checkOutputs(t));try{this.keepTensorForDebug=P().getBool(\"KEEP_INTERMEDIATE_TENSORS\")}catch(c){console.warn(c.message)}this.resetIntermediateTensors();let a=new yl(this.weightMap,n,s,this.functionExecutorMap);this.tensorsMap=await this.executeWithControlFlow(e,a,t,o);let i=t.map(c=>Ht(c,this.tensorsMap,a)),p=i.map(c=>c.id),u=Object.keys(e).map(c=>e[c].id);return this.keepIds=new Set([...p,...u,...this.weightIds]),this.keepTensorForDebug||this.disposeTensorsMap(),this.parent==null&&a.dispose(this.keepIds),i}async executeFunctionAsync(e,t,o){let n=e.reduce((s,a,i)=>(s[this.inputs[i].name]=a,s),{});return this._executeAsync(n,this.outputNodes,!0,t,o)}async executeWithControlFlow(e,t,o,n){let s=Object.keys(e),a=s.map(C=>this.graph.nodes[Sr(C)[0]]),i=o.map(C=>Sr(C)[0]),p=i.map(C=>this.graph.nodes[C]);p.length===0&&(p=this._outputs);let{usedNodes:u,missingInputs:c,dynamicNode:l,syncInputs:m}=ZC(e,p,this.weightMap,this._initNodes),f=[...a,...this.graph.weights,...this._initNodes||[]].map(C=>({node:C,contexts:t.currentContext})),d=Object.assign({},this.weightMap);Object.keys(e).forEach(C=>{let[w,k]=Sr(C),_=[];_[k]=e[C],d[w]=_});let h={},g=this.getFrozenTensorIds(d),y={};for(;f.length>0;){let C=this.processStack(a,f,t,d,y,g,i,h,u);await Promise.all(C)}l==null&&!n&&console.warn(\"This model execution did not contain any nodes with control flow or dynamic output shapes. You can use model.execute() instead.\");let b=p.filter(C=>!JC(C)&&!Ht(C.name,d,t)).map(C=>C.name);if(b.length>0){let C=\"\";throw l!=null&&(C=`Alternatively, to avoid the dynamic ops, use model.execute() and specify the inputs [${m}]`),new Error(`Cannot compute the outputs [${b}] from the provided inputs [${s}]. Consider providing the following inputs: [${c}]. ${C}`)}return d}processStack(e,t,o,n,s,a,i,p,u){let c=[];for(;t.length>0;){let l=t.pop();o.currentContext=l.contexts;let m=\"\";if(l.node.op===\"Enter\"&&S(\"isConstant\",l.node,n,o)&&([m]=zo(l.node.name,o)),n[l.node.name]==null){let f=QC(l.node,n,o,this._resourceManager);m||([m]=zo(l.node.name,o));let d=o.currentContext;x.isPromise(f)?c.push(f.then(h=>(n[m]=h,o.currentContext=d,this.checkTensorForDisposal(m,l.node,n,o,a,i,p),this.processChildNodes(l.node,t,o,n,s,u),h))):(n[m]=f,this.checkTensorForDisposal(m,l.node,n,o,a,i,p),this.processChildNodes(l.node,t,o,n,s,u))}else this.processChildNodes(l.node,t,o,n,s,u)}return c}processChildNodes(e,t,o,n,s,a){e.children.forEach(i=>{let[p]=zo(i.name,o);s[p]||!a.has(i.name)||(i.op===\"Merge\"?i.inputNames.some(u=>!!Ht(u,n,o))&&(s[p]=!0,t.push({contexts:o.currentContext,node:i})):i.inputNames.every(u=>!!Ht(u,n,o))&&(s[p]=!0,t.push({contexts:o.currentContext,node:i})))})}dispose(){Object.keys(this.weightMap).forEach(e=>this.weightMap[e].forEach(t=>t.dispose()))}checkInputShapeAndType(e){Object.keys(e).forEach(t=>{let o=e[t],[n]=Sr(t),s=this.graph.nodes[n];if(s.attrParams.shape&&s.attrParams.shape.value){let a=s.attrParams.shape.value,i=a.length===o.shape.length&&o.shape.every((p,u)=>a[u]===-1||a[u]===p);x.assert(i,()=>`The shape of dict['${s.name}'] provided in model.execute(dict) must be [${a}], but was [${o.shape}]`)}s.attrParams.dtype&&s.attrParams.dtype.value&&x.assert(o.dtype===s.attrParams.dtype.value,()=>`The dtype of dict['${s.name}'] provided in model.execute(dict) must be ${s.attrParams.dtype.value}, but was ${o.dtype}`)})}mapInputs(e){let t={};for(let o in e)if(this._signature!=null&&this._signature.inputs!=null&&this._signature.inputs[o]!=null){let n=this._signature.inputs[o];t[n.name]=e[o]}else t[o]=e[o];return t}checkInputs(e){let t=Object.keys(e).filter(o=>{let[n]=Sr(o);return this.graph.nodes[n]==null});if(t.length>0)throw new Error(`The dict provided in model.execute(dict) has keys: [${t}] that are not part of graph`)}mapOutputs(e){return e.map(t=>this._signature!=null&&this._signature.outputs!=null&&this._signature.outputs[t]!=null?this._signature.outputs[t].name:t,{})}checkOutputs(e){e.forEach(t=>{let[o]=Sr(t);if(!this.graph.nodes[o])throw new Error(`The output '${t}' is not found in the graph`)})}};var xd=class{constructor(e={},t={}){this.hashTableNameToHandle=e,this.hashTableMap=t}addHashTable(e,t){this.hashTableNameToHandle[e]=t.handle,this.hashTableMap[t.id]=t}getHashTableHandleByName(e){return this.hashTableNameToHandle[e]}getHashTableById(e){return this.hashTableMap[e]}dispose(){for(let e in this.hashTableMap)this.hashTableMap[e].clearAndClose(),delete this.hashTableMap[e];for(let e in this.hashTableNameToHandle)this.hashTableNameToHandle[e].dispose(),delete this.hashTableNameToHandle[e]}};var z6=\"?tfjs-format=file\",W6=\"model.json\",bl=class{constructor(e,t={},o=va){this.modelUrl=e,this.loadOptions=t,this.version=\"n/a\",this.io=o,t==null&&(this.loadOptions={}),this.resourceManager=new xd}get modelVersion(){return this.version}get inputNodes(){return this.executor.inputNodes}get outputNodes(){return this.executor.outputNodes}get inputs(){return this.executor.inputs}get outputs(){return this.executor.outputs}get weights(){return this.executor.weightMap}get metadata(){return this.artifacts.userDefinedMetadata}get modelSignature(){return this.signature}get modelStructuredOutputKeys(){return this.structuredOutputKeys}findIOHandler(){let e=this.modelUrl;if(e.load!=null)this.handler=e;else if(this.loadOptions.requestInit!=null)this.handler=this.io.browserHTTPRequest(e,this.loadOptions);else{let t=this.io.getLoadHandlers(e,this.loadOptions);if(t.length===0)t.push(this.io.browserHTTPRequest(e,this.loadOptions));else if(t.length>1)throw new Error(`Found more than one (${t.length}) load handlers for URL '${[e]}'`);this.handler=t[0]}}load(){if(this.findIOHandler(),this.handler.load==null)throw new Error(\"Cannot proceed with model loading because the IOHandler provided does not have the `load` method implemented.\");let e=this.handler.load();return x.isPromise(e)?e.then(t=>this.loadSync(t)):this.loadSync(e)}loadSync(e){this.artifacts=e;let t=this.artifacts.modelTopology,o=this.artifacts.signature;if(this.artifacts.userDefinedMetadata!=null){let s=this.artifacts.userDefinedMetadata;s.signature!=null&&(o=s.signature),s.structuredOutputKeys!=null&&(this.structuredOutputKeys=s.structuredOutputKeys)}this.signature=o,this.version=`${t.versions.producer}.${t.versions.minConsumer}`;let n=this.io.decodeWeights(this.artifacts.weightData,this.artifacts.weightSpecs);if(this.executor=new Cu(xl.Instance.transformGraph(t,this.signature)),this.executor.weightMap=this.convertTensorMapToTensorsMap(n),this.executor.resourceManager=this.resourceManager,e.modelInitializer!=null&&e.modelInitializer.node!=null){let s=xl.Instance.transformGraph(e.modelInitializer);this.initializer=new Cu(s),this.initializer.weightMap=this.executor.weightMap,this.initializer.resourceManager=this.resourceManager,this.initializerSignature=e.initializerSignature}return!0}async save(e,t){if(typeof e==\"string\"){let o=this.io.getSaveHandlers(e);if(o.length===0)throw new Error(`Cannot find any save handlers for URL '${e}'`);if(o.length>1)throw new Error(`Found more than one (${o.length}) save handlers for URL '${e}'`);e=o[0]}if(e.save==null)throw new Error(\"GraphModel.save() cannot proceed because the IOHandler provided does not have the `save` attribute defined.\");return e.save(this.artifacts)}predict(e,t){let o=this.execute(e,this.outputNodes);if(this.structuredOutputKeys){let n=o instanceof ut?[o]:o,s={};return n.forEach((a,i)=>s[this.structuredOutputKeys[i]]=a),s}return o}normalizeInputs(e){if(!(e instanceof ut)&&!Array.isArray(e)){if(this.signature!=null&&this.signature.inputs!=null)for(let n in this.signature.inputs){let s=this.signature.inputs[n];s.resourceId!=null&&(e[n]=this.resourceIdToCapturedInput[s.resourceId])}return e}e=Array.isArray(e)?e:[e];let t=Object.keys(this.resourceIdToCapturedInput).length;if(e.length+t!==this.inputNodes.length)throw new Error(`Input tensor count mismatch, the graph model has ${this.inputNodes.length-t} non-resource placeholders, while there are ${e.length} input tensors provided.`);let o=0;return this.inputNodes.reduce((n,s)=>{let a=this.signature?this.signature.inputs[s]:null;return a!=null&&a.resourceId!=null?n[s]=this.resourceIdToCapturedInput[a.resourceId]:n[s]=e[o++],n},{})}normalizeOutputs(e){return e=e||this.outputNodes,Array.isArray(e)?e:[e]}executeInitializerGraph(){return this.initializer==null?[]:this.initializerSignature==null?this.initializer.execute({},[]):this.initializer.execute({},Object.keys(this.initializerSignature.outputs))}async executeInitializerGraphAsync(){return this.initializer==null?[]:this.initializerSignature==null?this.initializer.executeAsync({},[]):this.initializer.executeAsync({},Object.keys(this.initializerSignature.outputs))}setResourceIdToCapturedInput(e){if(this.resourceIdToCapturedInput={},this.initializerSignature){let t=Object.keys(this.initializerSignature.outputs);for(let o=0;o1?o:o[0]}async executeAsync(e,t){this.resourceIdToCapturedInput==null&&this.setResourceIdToCapturedInput(await this.executeInitializerGraphAsync()),e=this.normalizeInputs(e),t=this.normalizeOutputs(t);let o=await this.executor.executeAsync(e,t);return o.length>1?o:o[0]}getIntermediateTensors(){return this.executor.getIntermediateTensors()}disposeIntermediateTensors(){this.executor.disposeIntermediateTensors()}convertTensorMapToTensorsMap(e){return Object.keys(e).reduce((t,o)=>(t[o]=[e[o]],t),{})}dispose(){this.executor.dispose(),this.initializer&&(this.initializer.dispose(),this.resourceIdToCapturedInput&&Ft(this.resourceIdToCapturedInput)),this.resourceManager.dispose()}};async function U6(r,e={},t=va){if(r==null)throw new Error(\"modelUrl in loadGraphModel() cannot be null. Please provide a url or an IOHandler that loads the model\");e==null&&(e={}),e.fromTFHub&&typeof r==\"string\"&&(r=H6(r));let o=new bl(r,e,t);return await o.load(),o}function G6(r){if(r==null)throw new Error(\"modelUrl in loadGraphModelSync() cannot be null. Please provide model artifacts or an IOHandler that loads the model\");let e;if(r instanceof Array){let[o,n]=r;if(!o)throw new Error(\"modelJSON must be the first element of the array\");if(!n||!(n instanceof ArrayBuffer))throw new Error(\"An ArrayBuffer of weights must be the second element of the array\");if(!(\"modelTopology\"in o))throw new Error(\"Model JSON is missing 'modelTopology'\");if(!(\"weightsManifest\"in o))throw new Error(\"Model JSON is missing 'weightsManifest'\");let s=va.getWeightSpecs(o.weightsManifest),a=va.getModelArtifactsForJSONSync(o,s,n);e=va.fromMemorySync(a)}else if(\"load\"in r)e=r;else if(\"modelTopology\"in r&&\"weightSpecs\"in r&&\"weightData\"in r)e=va.fromMemorySync(r);else throw new Error(\"Unknown model format\");let t=new bl(e);return t.load(),t}function H6(r){return r.endsWith(\"/\")||(r=r+\"/\"),`${r}${W6}${z6}`}var q6=\"4.0.0\";function K(r,e){Array.isArray(r)||(r=[r]),r.forEach(t=>{t!=null&&x.assert(t.dtype!==\"complex64\",()=>`${e} does not support complex64 tensors in the CPU backend.`)})}var K6=Bt.whereImpl,Si=class extends Jr{constructor(){super(),this.blockSize=48,this.firstUse=!0,this.data=new rn(this,cr())}nextDataId(){return Si.nextDataId++}write(e,t,o){this.firstUse&&(this.firstUse=!1,P().get(\"IS_NODE\")&&I.warn(`\n============================\nHi, looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, visit https://github.com/tensorflow/tfjs-node for more details. \n============================`));let n={id:this.nextDataId()};return this.data.set(n,{values:e,dtype:o,refCount:1}),n}makeTensorInfo(e,t,o){let n;if(t===\"string\"&&o!=null&&o.length>0&&x.isString(o[0])){let s=o.map(a=>x.encodeString(a));n=this.write(s,e,t)}else n=this.write(o,e,t);return{dataId:n,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,o,n,s){this.data.set(e,{values:t,dtype:n,refCount:s})}numDataIds(){return this.data.numDataIds()}async read(e){return this.readSync(e)}readSync(e){let{dtype:t,complexTensorInfos:o}=this.data.get(e);if(t===\"complex64\"){let n=this.readSync(o.real.dataId),s=this.readSync(o.imag.dataId);return I.mergeRealAndImagArrays(n,s)}return this.data.get(e).values}bufferSync(e){let t=this.readSync(e.dataId);if(e.dtype===\"string\")try{let o=t.map(n=>x.decodeString(n));return ne(e.shape,e.dtype,o)}catch(o){throw new Error(\"Failed to decode encoded string bytes into utf-8\")}return ne(e.shape,e.dtype,t)}makeOutput(e,t,o){return cr().makeTensorFromTensorInfo(this.makeTensorInfo(t,o,e),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:o}=this.data.get(e);o!=null&&(this.disposeData(o.real.dataId,!0),this.disposeData(o.imag.dataId,!0)),this.data.delete(e)}return!0}disposeIntermediateTensorInfo(e){this.disposeData(e.dataId)}async time(e){let t=x.now();return e(),{kernelMs:x.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){K([e],\"where\");let t=this.readSync(e.dataId);return K6(e.shape,t)}dispose(){}floatPrecision(){return 32}epsilon(){return super.epsilon()}};Si.nextDataId=0;var Ad={};Be(Ad,{addImpl:()=>rI,bincountImpl:()=>Zp,bincountReduceImpl:()=>yd,castImpl:()=>tI,ceilImpl:()=>oI,concatImpl:()=>Iu,equalImpl:()=>nI,expImpl:()=>aI,expm1Impl:()=>uI,floorImpl:()=>pI,gatherNdImpl:()=>bd,gatherV2Impl:()=>Cd,greaterEqualImpl:()=>lI,greaterImpl:()=>cI,lessEqualImpl:()=>fI,lessImpl:()=>mI,linSpaceImpl:()=>Id,logImpl:()=>dI,maxImpl:()=>wd,maximumImpl:()=>hI,minimumImpl:()=>gI,multiplyImpl:()=>Cl,negImpl:()=>xI,notEqualImpl:()=>yI,prodImpl:()=>bI,raggedGatherImpl:()=>Sd,raggedRangeImpl:()=>vd,raggedTensorToTensorImpl:()=>kd,rangeImpl:()=>Su,rsqrtImpl:()=>CI,scatterImpl:()=>Aa,sigmoidImpl:()=>e2,simpleAbsImpl:()=>eI,sliceImpl:()=>vu,sparseFillEmptyRowsImpl:()=>Td,sparseReshapeImpl:()=>Nd,sparseSegmentReductionImpl:()=>tc,sqrtImpl:()=>o2,squaredDifferenceImpl:()=>wI,stridedSliceImpl:()=>_d,stringNGramsImpl:()=>ku,stringSplitImpl:()=>Tu,stringToHashBucketFastImpl:()=>Nu,subImpl:()=>vI,tileImpl:()=>Ed,topKImpl:()=>$d,transposeImpl:()=>Jp,uniqueImpl:()=>Rd});function eI(r){let e=new Float32Array(r.length);for(let t=0;t{let{x:e}=r.inputs,t=r.backend;K(e,\"abs\");let o=new Float32Array(x.sizeFromShape(e.shape)),n=t.data.get(e.dataId).values;return o=eI(n),t.makeOutput(o,e.shape,e.dtype)},TN={kernelName:sn,backendName:\"cpu\",kernelFunc:j6};function Le(r){return(e,t,o,n,s)=>{let a=I.assertAndGetBroadcastShape(e,t),i=a.length,p=x.computeStrides(a),u=x.sizeFromShape(a),c=x.getTypedArrayFromDType(s,u),l=e.length,m=t.length,f=x.computeStrides(e),d=x.computeStrides(t),h=I.getBroadcastDims(e,a),g=I.getBroadcastDims(t,a);if(h.length+g.length===0)for(let y=0;yC[E]=0);let w=x.locToIndex(C,l,f),k=b.slice(-m);g.forEach(E=>k[E]=0);let _=x.locToIndex(k,m,d);c[y]=r(o[w],n[_])}return[c,a]}}function qt(r){let{inputs:e,backend:t}=r,{real:o,imag:n}=e,s=t.data.get(o.dataId).values,a=t.data.get(n.dataId).values,i=t.makeTensorInfo(o.shape,\"complex64\"),p=t.data.get(i.dataId);return p.complexTensorInfos={real:t.makeTensorInfo(o.shape,\"float32\",s),imag:t.makeTensorInfo(n.shape,\"float32\",a)},i}var NN={kernelName:aa,backendName:\"cpu\",kernelFunc:qt};function Yp(r,e,t=\"float32\"){if(t===\"complex64\"){let n=Yp(r,e,\"float32\"),s=Yp(r,e,\"float32\");return qt({inputs:{real:n,imag:s},backend:r})}let o=x.makeZerosTypedArray(x.sizeFromShape(e),t);return r.makeTensorInfo(e,t,o)}function ar(r){let{inputs:e,backend:t}=r,{x:o}=e;return t.incRef(o.dataId),{dataId:o.dataId,shape:o.shape,dtype:o.dtype}}var _N={kernelName:uo,backendName:\"cpu\",kernelFunc:ar};function Wo(r){let{inputs:e,backend:t}=r,{input:o}=e,n=t.data.get(o.dataId).complexTensorInfos.real,s=t.data.get(n.dataId).values;return t.makeTensorInfo(n.shape,n.dtype,s)}var EN={kernelName:la,backendName:\"cpu\",kernelFunc:Wo};function tI(r,e,t,o){if(o===\"int32\"){let n=Int32Array.from(r);return[e,\"int32\",n]}if(o===\"bool\"){let n=x.toTypedArray([0],t),[s,a]=Le((i,p)=>i!==p?1:0)(e,[],r,n,\"bool\");return[a,\"bool\",s]}throw new Error(`Error in Cast: failed to cast ${t} to ${o}`)}function Uo(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{dtype:s}=o;if(s===\"complex64\"){if(n.dtype===\"complex64\")return ar({inputs:{x:n},backend:t});let c=Yp(t,n.shape,n.dtype),l=Uo({inputs:{x:n},backend:t,attrs:{dtype:\"float32\"}}),m=qt({inputs:{real:l,imag:c},backend:t});return t.disposeIntermediateTensorInfo(c),t.disposeIntermediateTensorInfo(l),m}if(n.dtype===\"complex64\"){let c=Wo({inputs:{input:n},backend:t}),l=Uo({inputs:{x:c},backend:t,attrs:{dtype:s}});return t.disposeIntermediateTensorInfo(c),l}if(!x.hasEncodingLoss(n.dtype,s)){let c=ar({inputs:{x:n},backend:t});return{dataId:c.dataId,shape:c.shape,dtype:s}}let a=t.data.get(n.dataId).values,[i,p,u]=tI(a,n.shape,n.dtype,s);return t.makeTensorInfo(i,p,u)}var $N={kernelName:to,backendName:\"cpu\",kernelFunc:Uo};function Ye(r,e,t,o){return t==null?({inputs:n,backend:s})=>{let{a,b:i}=n,p=s;K([a,i],r);let u=p.data.get(a.dataId).values,c=p.data.get(i.dataId).values,l=a.dtype===\"string\"?I.fromUint8ToStringArray(u):u,m=a.dtype===\"string\"?I.fromUint8ToStringArray(c):c,f=o||a.dtype,[d,h]=e(a.shape,i.shape,l,m,f);return p.makeTensorInfo(h,f,d)}:({inputs:n,backend:s})=>{let{a,b:i}=n,p=s;if(a.dtype===\"complex64\"||i.dtype===\"complex64\"){let u=Uo({inputs:{x:a},backend:p,attrs:{dtype:\"complex64\"}}),c=p.data.get(u.dataId),l=c.complexTensorInfos.real,m=c.complexTensorInfos.imag,f=p.data.get(l.dataId).values,d=p.data.get(m.dataId).values,h=Uo({inputs:{x:i},backend:p,attrs:{dtype:\"complex64\"}}),g=p.data.get(h.dataId),y=g.complexTensorInfos.real,b=g.complexTensorInfos.imag,C=p.data.get(y.dataId).values,w=p.data.get(b.dataId).values,[k,_,E]=t(a.shape,i.shape,f,d,C,w),R=p.makeTensorInfo(E,\"float32\",k),A=p.makeTensorInfo(E,\"float32\",_),D=qt({inputs:{real:R,imag:A},backend:p});return p.disposeIntermediateTensorInfo(u),p.disposeIntermediateTensorInfo(h),p.disposeIntermediateTensorInfo(R),p.disposeIntermediateTensorInfo(A),D}else{let u=p.data.get(a.dataId).values,c=p.data.get(i.dataId).values,l=o||a.dtype,[m,f]=e(a.shape,i.shape,u,c,l);return p.makeTensorInfo(f,l,m)}}}function Qp(r){return(e,t,o,n,s,a)=>{let i=I.assertAndGetBroadcastShape(e,t),p=x.sizeFromShape(i),u=i.length,c=x.computeStrides(i),l=x.getTypedArrayFromDType(\"float32\",p),m=x.getTypedArrayFromDType(\"float32\",p),f=I.getBroadcastDims(e,i),d=I.getBroadcastDims(t,i),h=I.mergeRealAndImagArrays(o,n),g=I.mergeRealAndImagArrays(s,a),y=e.length,b=x.computeStrides(e),C=t.length,w=x.computeStrides(t);if(f.length+d.length===0)for(let k=0;kE[M]=0);let R=x.locToIndex(E,y,b),A=_.slice(-C);d.forEach(M=>A[M]=0);let D=x.locToIndex(A,C,w),O=r(h[R*2],h[R*2+1],g[D*2],g[D*2+1]);l[k]=O.real,m[k]=O.imag}return[l,m,i]}}var rI=Le((r,e)=>r+e),X6=Qp((r,e,t,o)=>({real:r+t,imag:e+o})),Hs=Ye(_r,rI,X6),RN={kernelName:_r,backendName:\"cpu\",kernelFunc:Hs};function Zp(r,e,t,o,n){let s=x.sizeFromShape(o),a=x.makeZerosTypedArray(n,t);for(let i=0;i=n||(s>0?a[p]+=e[i]:a[p]+=1)}return a}function yd(r,e,t,o=!1){let n=r.shape[0],s=r.shape[1],a=ne([n,t],e.dtype);for(let i=0;i=t||(o?a.set(1,i,u):e.size>0?a.set(a.get(i,u)+e.get(i,p),i,u):a.set(a.get(i,u)+1,i,u))}return a}function vr(r){return(e,t,o)=>{let n=x.getTypedArrayFromDType(t,e.length);for(let s=0;s{let{x:a}=o;if(K(a,r),a.dtype===\"string\"||t===\"string\")throw new Error(\"unaryKernelFunc does not support string input/output\");let i=s,p=i.data.get(a.dataId).values,u=x.sizeFromShape(a.shape),c=t||a.dtype,l=x.getArrayFromDType(c,u);for(let m=0;m{let{x:a}=o;if(K(a,r),a.dtype===\"string\"||t===\"string\")throw new Error(\"unaryKernelFunc does not support string input/output\");let i=s,p=i.data.get(a.dataId).values,u=t||a.dtype,c=e(p,u,n);return i.makeTensorInfo(a.shape,u,c)}}var oI=vr(r=>Math.ceil(r)),Y6=Go(ro,oI),AN={kernelName:ro,backendName:\"cpu\",kernelFunc:Y6};function Iu(r,e,t,o){let n=x.getArrayFromDType(t,x.sizeFromShape(e));if(o&&t!==\"string\"){let s=0;r.forEach(a=>{let i=x.sizeFromShape(a.shape);n.set(a.vals,s),s+=i})}else{let s=0;r.forEach(a=>{let i=t===\"string\"?I.fromUint8ToStringArray(a.vals):a.vals,p=0;for(let u=0;ur===e?1:0),sI=Ye(oo,nI,null,\"bool\"),FN={kernelName:oo,backendName:\"cpu\",kernelFunc:sI};var aI=vr(r=>Math.exp(r)),iI=Go(no,aI,\"float32\"),DN={kernelName:no,backendName:\"cpu\",kernelFunc:iI};var uI=vr(r=>Math.expm1(r)),Q6=Go(wn,uI),PN={kernelName:wn,backendName:\"cpu\",kernelFunc:Q6};var pI=vr(r=>Math.floor(r)),Z6=Go(so,pI),ON={kernelName:so,backendName:\"cpu\",kernelFunc:Z6};function bd(r,e,t,o,n,s,a,i,p){let u=ne([o,s],t);for(let c=0;c=p/s)throw new Error(`Invalid indices: ${l} does not index into ${i}`);for(let f=0;fr>e?1:0),J6=Ye(ao,cI,null,\"bool\"),MN={kernelName:ao,backendName:\"cpu\",kernelFunc:J6};var lI=Le((r,e)=>r>=e?1:0),ej=Ye(io,lI,null,\"bool\"),LN={kernelName:io,backendName:\"cpu\",kernelFunc:ej};var mI=Le((r,e)=>rr<=e?1:0),rj=Ye(co,fI,null,\"bool\"),VN={kernelName:co,backendName:\"cpu\",kernelFunc:rj};function Id(r,e,t){let o=(e-r)/(t-1),n=x.makeZerosTypedArray(t,\"float32\");n[0]=r;for(let s=1;sMath.log(r)),oj=Go(lo,dI),zN={kernelName:lo,backendName:\"cpu\",kernelFunc:oj};function wd(r,e,t,o){let n=x.getTypedArrayFromDType(o,x.sizeFromShape(t));for(let s=0;si)&&(i=u)}n[s]=i}return n}var hI=Le((r,e)=>Math.max(r,e)),nj=Ye(mo,hI),WN={kernelName:mo,backendName:\"cpu\",kernelFunc:nj};var gI=Le((r,e)=>Math.min(r,e)),sj=Ye(fo,gI),UN={kernelName:fo,backendName:\"cpu\",kernelFunc:sj};var Cl=Le((r,e)=>r*e),aj=Qp((r,e,t,o)=>({real:r*t-e*o,imag:r*o+e*t})),wu=Ye(ho,Cl,aj),GN={kernelName:ho,backendName:\"cpu\",kernelFunc:wu};function xI(r,e,t){let o=x.createScalarValue(-1,t);return Cl([],e,o,r,t)}function ij(r){let{inputs:e,backend:t}=r,{x:o}=e;K(o,\"neg\");let n=t.data.get(o.dataId).values,[s,a]=xI(n,o.shape,o.dtype);return t.makeTensorInfo(a,o.dtype,s)}var HN={kernelName:Pn,backendName:\"cpu\",kernelFunc:ij};var yI=Le((r,e)=>r!==e?1:0),uj=Ye(go,yI,null,\"bool\"),qN={kernelName:go,backendName:\"cpu\",kernelFunc:uj};function Jp(r,e,t,o,n){let s=e.length,a=x.sizeFromShape(e),i=x.computeStrides(e),p=x.computeStrides(n),u=x.getTypedArrayFromDType(t,x.sizeFromShape(n));for(let c=0;ct.disposeIntermediateTensorInfo(b)),t.makeTensorInfo(y,g,d)}var jN={kernelName:Ao,backendName:\"cpu\",kernelFunc:pj};function cj(r,e,t){r.forEach((o,n)=>{if(o<0||o>=t){let s=x.indexToLoc(n,e.length,x.computeStrides(e)).join(\",\");throw new Error(`indices[${s}] = ${o} is not in [0, ${t})`)}})}function lj(r,e){for(let t=0;tn)throw new Error(\"Ragged splits must not point past values\");for(let s=1;so[s])throw new Error(\"Ragged splits must be sorted in ascending order\")}}function mj(r,e,t,o){let n=[],s=0,a=e.length-1+t.length,i=new Array(a).fill(null).map(()=>[0]);lj(t,o);let p=1;for(let u=0;u=0){let h=i[d],g=h[h.length-1]-f[c];for(let y=c;yn[a]=s)}return e}function XN(r,e){let t=r.slice(0,e);for(;t.length1)throw new Error(\"starts must be a scalar or vector\");if(n.length>1)throw new Error(\"limits must be a scalar or vector\");if(a.length>1)throw new Error(\"deltas must be a scalar or vector\");let i=e.length===0,p=n.length===0,u=a.length===0,c=[];i||c.push(e[0]),p||c.push(n[0]),u||c.push(a[0]);for(let g=1;g0&&by)w=0;else if(w=Math.ceil(Math.abs((b-y)/C)),w>YN)throw new Error(`Requires ((limit - start) / delta) <= ${YN}`);m[g+1]=m[g]+w}let f=m[l],d=x.getArrayFromDType(t,f),h=0;for(let g=0;go&&(o=s)}return o}static getMaxWidthValueRowID(e){let t=e.length;if(t===0)return 0;let o=0,n=e[0],s=0;for(let a=1;a\"Final length of result must be equal to firstDimension.\"),s}calculateOutputIndexRowSplit(e,t,o,n){let s=e.length,a=[];for(let i=0;i0&&a.length!==e[s-1])throw new Error(\"Invalid row split size.\");return a}calculateOutputIndexValueRowID(e,t,o,n){let s=e.length,a=[];if(s===0)return[];let i=0,p=e[0];if(p>=t.length)throw new Error(`Got currentValueRowId=${p}, which is not less than ${t.length}`);let u=t[p];a.push(u);for(let c=1;c=0&&(++i,i=t.length)throw new Error(`Got nextValueRowId=${l} which is not less than ${t.length}`);u=t[l]}a.push(u)}if(a.length!==e.length)throw new Error(\"Invalid row ids.\");return a}calculateOutputIndex(e,t,o,n){let s=this.getRowPartitionTensor(e),a=this.getRowPartitionTypeByDimension(e);switch(a){case Ho.VALUE_ROWIDS:return this.calculateOutputIndexValueRowID(s,t,o,n);case Ho.ROW_SPLITS:if(s.length-1>t.length)throw new Error(`Row partition size is greater than output size: ${s.length-1} > ${t.length}`);return this.calculateOutputIndexRowSplit(s,t,o,n);default:throw new Error(`Unsupported partition type: ${Ho[a]}`)}}getFirstDimensionSize(){let e=this.rowPartitionValues[0];if(this.rowPartitionTypes.length===0)throw new Error(\"No row_partition_types given.\");let t=this.rowPartitionTypes[0];switch(t){case Ho.FIRST_DIM_SIZE:return e[0];case Ho.VALUE_ROWIDS:throw new Error(\"Cannot handle VALUE_ROWIDS in first dimension.\");case Ho.ROW_SPLITS:return this.rowPartitionValuesShapes[0][0]-1;default:throw new Error(`Cannot handle type ${Ho[t]}`)}}compute(){if(this.rowPartitionValues[0].length<=0)throw new Error(\"Invalid first partition input. Tensor requires at least one element.\");let t=this.getFirstDimensionSize(),o=this.calculateOutputSize(t),n=new Array(this.raggedRank+1);n[n.length-1]=1;for(let p=n.length-2;p>=0;--p)n[p]=n[p+1]*o[p+1];let s=ZN(o,!1),a=x.getArrayFromDType(this.valuesDType,x.sizeFromShape(s));if(n[0]*o[0]>0){let p=this.calculateFirstParentOutputIndex(t,n[0],o[0]);for(let u=1;u<=this.raggedRank;++u)p=this.calculateOutputIndex(u-1,p,n[u],o[u]);this.setOutput(this.raggedRank,p,a,s)}return[s,a]}setOutput(e,t,o,n){if(o.length===0)return;let s=this.values,a=o,i=n.slice();i=i.slice(e+1);let p=x.sizeFromShape(i),u=t.length,c=this.defaultValue;if(c.length!==p&&c.length!==1){let d=this.defaultValueShape;Ne(()=>{let h=z(c,d);c=Ls(h,i).dataSync()})}let l=0,m=0,f=0;for(let d=0;d<=u;++d){let h=d=u){let g=o.length;h=Math.floor(g/p)}if(h>f)if(this.defaultValue.length===1)a.subarray(f*p,h*p).fill(this.defaultValue[0]),f=h;else for(;h>f;){let g=a.slice(f*p);QN(g,c,p),++f}h<0?(l=d+1,m=f):(l=d,m=f,f=m+1)}}};function QN(r,e,t){for(let o=0;o= 0`);if(o<-1)throw new Error(`Dimension ${o} must be >= -1`);o=-1}t.push(o)}return t}function kd(r,e,t,o,n,s,a,i,p,u){return new ec(r,e,t,o,n,s,a,i,p,u).compute()}function Su(r,e,t,o){let n=r===e,s=r1;if(n||s||a)return x.makeZerosTypedArray(0,o);let i=Math.abs(Math.ceil((e-r)/t)),p=x.makeZerosTypedArray(i,o);e1/Math.sqrt(r)),gj=Go(xo,CI),JN={kernelName:xo,backendName:\"cpu\",kernelFunc:gj};function Aa(r,e,t,o,n,s,a,i,p,u){let c=[o/n,n],l=r.values,m=e.values;if(o===0)return ne(t,e.dtype);let f=ne(c,e.dtype);typeof p==\"string\"||typeof p==\"number\"?f.values.fill(p):typeof p==\"boolean\"&&f.values.fill(+p);for(let d=0;d=o/n)throw new Error(`Invalid indices: ${h} does not index into ${t}`);for(let y=0;y1/(1+Math.exp(-r))),II=we(yo,r=>1/(1+Math.exp(-r))),t2={kernelName:yo,backendName:\"cpu\",kernelFunc:II};function vu(r,e,t,o,n){let s=et.isSliceContinous(o,e,t),a=x.sizeFromShape(t),i=x.computeStrides(o);if(s){let l=et.computeFlatOffset(e,i);return n===\"string\"?r.slice(l,l+a):r.subarray(l,l+a)}let p=n===\"string\"?I.fromUint8ToStringArray(r):r,u=ne(o,n,p),c=ne(t,n);for(let l=0;ld+e[h]);c.set(u.get(...f),...m)}return n===\"string\"?I.fromStringArrayToUint8(c.values):c.values}function qo(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{begin:s,size:a}=o;K(n,\"slice\");let[i,p]=et.parseSliceParams(n,s,a);et.assertParamsValid(n,i,p);let u=t.data.get(n.dataId).values,c=vu(u,i,p,n.shape,n.dtype);return t.makeTensorInfo(p,n.dtype,c)}var r2={kernelName:qn,backendName:\"cpu\",kernelFunc:qo};function Td(r,e,t,o,n,s,a){let i=e[0],p=s[0],u=new Array(p),c=new Array(i),l=e[1];if(p===0){if(i!==0)throw new Error(I.getSparseFillEmptyRowsIndicesDenseShapeMismatch(i));let g=x.getArrayFromDType(t,0),y=x.getArrayFromDType(n,0);return[g,[0,l],y,u,c]}let m=!0,f=0,d=new Array(p).fill(0);for(let g=0;g=p)throw new Error(I.getSparseFillEmptyRowsOutOfRangeIndexErrorMessage(g,y,p));++d[y],m=m&&y>=f,f=y}let h=!0;for(let g=0;g0&&(d[g]+=d[g-1])}if(h&&m){let g=r,y=o;for(let b=0;b0){f[m-1]=1;for(let g=m-2;g>=0;--g)f[g]=f[g+1]*o[g+1]}let d=[];if(i>0){d[i-1]=1;for(let g=i-2;g>=0;--g)d[g]=d[g+1]*p[g+1]}let h=x.getArrayFromDType(t,a*i);for(let g=0;g0?n[i-1]+1:0;if(l<0)throw new Error(I.getSparseSegmentReductionNegativeSegmentIdsErrorMessage());let m=e.slice();m[0]=l;let f=m.reduce((C,w)=>C*w,1),d=x.getArrayFromDType(t,f);if(i===0)return l>0&&d.fill(a),[d,m];if(l<=0)throw new Error(I.getSparseSegmentReductionNegativeSegmentIdsErrorMessage());let h=0,g=1,y=0,b=n[h];for(;;){let C=0;if(g=C)throw new Error(I.getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage())}if(b<0||b>=l)throw new Error(I.getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage(b,l));b>y&&d.fill(a,y*u,b*u);for(let w=h;w=p[0])throw new Error(I.getSparseSegmentReductionIndicesOutOfRangeErrorMessage(w,o[w],p[0]));for(let _=0;_i)break}return yMath.sqrt(r)),xj=we(bo,r=>Math.sqrt(r)),n2={kernelName:bo,backendName:\"cpu\",kernelFunc:xj};var wI=Le((r,e)=>{let t=r-e;return t*t}),yj=Ye(Co,wI),s2={kernelName:Co,backendName:\"cpu\",kernelFunc:yj};function _d(r,e,t,o){let n=ne(r,e.dtype);for(let s=0;s0?0:i-p),f=0;f+=u*this.leftPad.length;for(let b=0;bb.forEach(C=>h[g++]=C);for(let b=0;b0){y(e[m+l-1]);for(let b=0;b0){let p=t[0];if(p!==0)throw new Error(`First split value must be 0, got ${p}`);for(let u=1;u=p;if(c=c&&t[u]<=o,!c)throw new Error(`Invalid split value ${t[u]}, must be in [${p}, ${o}]`);p=t[u]}if(p!==o)throw new Error(`Last split value must be data size. Expected ${o}, got ${p}`)}let s=n-1,a=x.getArrayFromDType(\"int32\",n);if(o===0||n===0){let p=new Array(o);for(let u=0;u<=s;++u)a[u]=0;return[p,a]}a[0]=0;for(let p=1;p<=s;++p){let u=t[p]-t[p-1],c=0;this.nGramWidths.forEach(l=>{c+=this.getNumNGrams(u,l)}),this.preserveShort&&u>0&&c===0&&(c=1),a[p]=a[p-1]+c}let i=new Array(a[s]);for(let p=0;p{let m=t[p+1]-t[p],f=this.getNumNGrams(m,l);this.createNGrams(e,u,i,c,f,l),c+=f}),this.preserveShort&&c===a[p]){let l=t[p+1]-t[p];if(l===0)continue;let m=l+2*this.padWidth,f=1;this.createNGrams(e,u,i,c,f,m)}}return[i,a]}};function ku(r,e,t,o,n,s,a,i){return new SI(t,o,n,s,a,i).compute(r,e)}function bj(r,e,t,o){if(!r.length)return;if(e.length===0){for(let s=0;sr-e),Cj=Qp((r,e,t,o)=>({real:r-t,imag:e-o})),Il=Ye(Io,vI,Cj),a2={kernelName:Io,backendName:\"cpu\",kernelFunc:Il};function Ed(r,e){let t=new Array(r.rank);for(let n=0;n{let t=e.value-r.value;return t===0?r.index-e.index:t};function i2(r,e,t=0,o=r.length-1){for(;o>t;){if(o-t>600){let i=o-t+1,p=e-t+1,u=Math.log(i),c=.5*Math.exp(2*u/3),l=.5*Math.sqrt(u*c*(i-c)/i)*Math.sign(p-i/2),m=Math.max(t,Math.floor(e-p*c/i+l)),f=Math.min(o,Math.floor(e+(i-p)*c/i+l));i2(r,e,m,f)}let n=r[e],s=t,a=o;for(x.swap(r,t,e),wl(r[o],n)>0&&x.swap(r,t,o);s0;)a=a-1}wl(r[t],n)===0?x.swap(r,t,a):(a=a+1,x.swap(r,a,o)),a<=e&&(t=a+1),e<=a&&(o=a-1)}}function $d(r,e,t,o,n){let s=e[e.length-1],[a,i]=[r.length/s,s],p=x.getTypedArrayFromDType(t,a*o),u=x.getTypedArrayFromDType(\"int32\",a*o);for(let l=0;ld[C]={value:b,index:C}),o{for(let g=0;gnew Si,1);var kI=we(In,r=>r>=0?r:Math.exp(r)-1),u2={kernelName:In,backendName:\"cpu\",kernelFunc:kI};function TI(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{alpha:s}=o;K([n],\"leakyRelu\");let a=x.sizeFromShape(n.shape),i=t.data.get(n.dataId).values,p=x.getTypedArrayFromDType(\"float32\",a);for(let u=0;ur<0?e*r:r);function NI(r){let{inputs:e,backend:t}=r,{x:o,alpha:n}=e;K([o,n],\"prelu\");let s=t.data.get(o.dataId).values,a=t.data.get(n.dataId).values,[i,p]=wj(o.shape,n.shape,s,a,\"float32\");return t.makeTensorInfo(p,\"float32\",i)}var c2={kernelName:Vn,backendName:\"cpu\",kernelFunc:NI};var _I=we(zn,r=>Math.max(0,r)),l2={kernelName:zn,backendName:\"cpu\",kernelFunc:_I};var EI=we(Gn,r=>Math.min(Math.max(0,r),6)),m2={kernelName:Gn,backendName:\"cpu\",kernelFunc:EI};function _u(r,e,t,o,n){if(t===\"linear\")return ar({inputs:{x:e},backend:r});if(t===\"relu\")return _I({inputs:{x:e},backend:r});if(t===\"elu\")return kI({inputs:{x:e},backend:r});if(t===\"relu6\")return EI({inputs:{x:e},backend:r});if(t===\"prelu\")return NI({inputs:{x:e,alpha:o},backend:r});if(t===\"leakyrelu\")return TI({inputs:{x:e},backend:r,attrs:{alpha:n}});if(t===\"sigmoid\")return II({inputs:{x:e},backend:r});throw new Error(`Activation ${t} has not been implemented for the CPU backend.`)}function Oe(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{shape:s}=o,a=x.sizeFromShape(n.shape),i=x.inferFromImplicitShape(s,a),p=x.sizeFromShape(i);x.assert(a===p,()=>`The new shape (${i}) has ${p} elements and the old shape (${n.shape}) has ${a} elements. The new shape and old shape must have the same number of elements.`),t.incRef(n.dataId);let u=t.data.get(n.dataId);if(u.complexTensorInfos!=null){let c=u.complexTensorInfos.real,l=u.complexTensorInfos.imag;c.shape=i,l.shape=i}return{dataId:n.dataId,shape:i,dtype:n.dtype}}var f2={kernelName:Ss,backendName:\"cpu\",kernelFunc:Oe};function $I(r){let{inputs:e,backend:t,attrs:o}=r,{a:n,b:s}=e,{transposeA:a,transposeB:i}=o;K([n,s],\"matMul\");let p=n.shape.length,u=s.shape.length,c=a?n.shape[p-2]:n.shape[p-1],l=i?s.shape[u-1]:s.shape[u-2],m=a?n.shape[p-1]:n.shape[p-2],f=i?s.shape[u-2]:s.shape[u-1],d=n.shape.slice(0,-2),h=s.shape.slice(0,-2),g=x.sizeFromShape(d),y=x.sizeFromShape(h),C=br.assertAndGetBroadcastShape(n.shape.slice(0,-2),s.shape.slice(0,-2)).concat([m,f]);x.assert(c===l,()=>`Error in matMul: inner shapes (${c}) and (${l}) of Tensors with shapes ${n.shape} and ${s.shape} and transposeA=${a} and transposeB=${i} must match.`);let w=a?[g,c,m]:[g,m,c],k=i?[y,f,l]:[y,l,f],_=Oe({inputs:{x:n},backend:t,attrs:{shape:w}}),E=Oe({inputs:{x:s},backend:t,attrs:{shape:k}}),R=a?_.shape[1]:_.shape[2],A=a?_.shape[2]:_.shape[1],D=i?E.shape[1]:E.shape[2],O=Math.max(g,y),M=t.data.get(_.dataId).values,L=t.data.get(E.dataId).values,W=x.computeStrides(_.shape),V=x.computeStrides(E.shape),[G,q,H]=a?[W[0],1,W[1]]:[W[0],W[1],1],[j,Y,Z]=i?[1,V[1],V[0]]:[V[1],1,V[0]],ee=A*D,X=ne([O,A,D],_.dtype),Q=X.values,se=t.blockSize;for(let ie=0;ieMath.acos(r)),g2={kernelName:Li,backendName:\"cpu\",kernelFunc:vj};var kj=we(Bi,r=>Math.acosh(r)),x2={kernelName:Bi,backendName:\"cpu\",kernelFunc:kj};function Tj(r){let{inputs:e,backend:t}=r,o=e;K(e,\"addN\");let n=o.map(i=>t.data.get(i.dataId).values),s=ne(o[0].shape,o[0].dtype),a=s.values;for(let i=0;ib&&(b=k,C=w)}f[g]=C}return u.forEach(g=>t.disposeIntermediateTensorInfo(g)),t.makeTensorInfo(c,\"int32\",f)}var I2={kernelName:un,backendName:\"cpu\",kernelFunc:Ej};function $j(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s}=o;K(n,\"argMin\");let a=x.parseAxisParam(s,n.shape),i=I.getAxesPermutation(a,n.shape.length),p=n,u=[];i!=null&&(p=bt({inputs:{x:n},backend:t,attrs:{perm:i}}),u.push(p),a=I.getInnerMostAxes(a.length,p.shape.length)),a=[a[0]],I.assertAxesAreInnerMostDims(\"argMin\",a,p.shape.length);let[c,l]=I.computeOutAndReduceShapes(p.shape,a),m=x.sizeFromShape(c),f=x.makeZerosTypedArray(m,\"int32\"),d=x.sizeFromShape(l),h=t.data.get(p.dataId).values;for(let g=0;gt.disposeIntermediateTensorInfo(g)),t.makeTensorInfo(c,\"int32\",f)}var w2={kernelName:ja,backendName:\"cpu\",kernelFunc:$j};var Rj=we(Vi,r=>Math.asin(r)),S2={kernelName:Vi,backendName:\"cpu\",kernelFunc:Rj};var Aj=we(zi,r=>Math.asinh(r)),v2={kernelName:zi,backendName:\"cpu\",kernelFunc:Aj};var Fj=we(Wi,r=>Math.atan(r)),k2={kernelName:Wi,backendName:\"cpu\",kernelFunc:Fj};var Dj=Le((r,e)=>Math.atan2(r,e)),Pj=Ye(sa,Dj),T2={kernelName:sa,backendName:\"cpu\",kernelFunc:Pj};var Oj=we(Ui,r=>Math.atanh(r)),N2={kernelName:Ui,backendName:\"cpu\",kernelFunc:Oj};function rc(r,e,t,o,n,s){let a=n.strideHeight,i=n.strideWidth,p=n.dilationHeight,u=n.dilationWidth,c=n.effectiveFilterHeight,l=n.effectiveFilterWidth,m=n.padInfo.top,f=n.padInfo.left,d=s===\"max\"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,h=ne(n.outShape,t),g=h.values,y=n.outShape[1]*n.outShape[2]*n.outShape[3],b=n.outShape[2]*n.outShape[3],C=n.outShape[3];for(let w=0;wq?q=se:s===\"avg\"&&(H+=se,j++)}if(isNaN(q))break}let Y=M+L*C+E;g[Y]=s===\"avg\"?H/j:q}}}return h}function Fd(r,e,t,o,n=!1,s=!1){let a=ne(o.outShape,\"int32\"),i=o.strideHeight,p=o.strideWidth,u=o.dilationHeight,c=o.dilationWidth,l=o.effectiveFilterHeight,m=o.effectiveFilterWidth,f=o.padInfo.top,d=o.padInfo.left,h=ne(e,t,r);for(let g=0;gD&&(D=G,n?O=s?((g*o.inHeight+M)*o.inWidth+W)*o.inChannels+y:(M*o.inWidth+W)*o.inChannels+y:O=L*m+V)}}a.set(O,g,b,_,y)}}return a}function Dd(r,e,t,o,n,s){let a=n.strideDepth,i=n.strideHeight,p=n.strideWidth,u=n.dilationDepth,c=n.dilationHeight,l=n.dilationWidth,m=n.effectiveFilterDepth,f=n.effectiveFilterHeight,d=n.effectiveFilterWidth,h=n.padInfo.front,g=n.padInfo.top,y=n.padInfo.left,b=s===\"max\"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,C=ne(n.outShape,t),w=C.values,k=n.outShape[1]*n.outShape[2]*n.outShape[3]*n.outShape[4],_=n.outShape[2]*n.outShape[3]*n.outShape[4],E=n.outShape[3]*n.outShape[4],R=n.outShape[4];for(let A=0;AIe?Ie=It:s===\"avg\"&&(Se+=It,Ee++),isNaN(Ie))break}if(isNaN(Ie))break}if(isNaN(Ie))break}let Me=de+M;w[Me]=s===\"avg\"?Se/Ee:Ie}}}}return C}function _2(r,e){let t=ne(e.outShape,\"int32\"),o=e.strideDepth,n=e.strideHeight,s=e.strideWidth,a=e.dilationDepth,i=e.dilationHeight,p=e.dilationWidth,u=e.effectiveFilterDepth,c=e.effectiveFilterHeight,l=e.effectiveFilterWidth,m=e.padInfo.front,f=e.padInfo.top,d=e.padInfo.left;for(let h=0;h=L&&(L=Z,W=G*c*l+H*c+Y)}}}t.set(W,h,y,k,A,g)}}}return t}function Mj(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e;K(n,\"avgPool\");let{filterSize:s,strides:a,pad:i,dimRoundingMode:p}=o,u=1;x.assert(I.eitherStridesOrDilationsAreOne(a,u),()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${a} and dilations '${u}'`);let c=I.computePool2DInfo(n.shape,s,a,u,i,p),l;if(c.filterWidth===1&&c.filterHeight===1&&x.arraysEqual(c.inShape,c.outShape))l=ar({inputs:{x:n},backend:t});else{let m=t.data.get(n.dataId).values,f=x.computeStrides(n.shape),d=rc(m,n.shape,n.dtype,f,c,\"avg\");l=t.makeTensorInfo(c.outShape,n.dtype,d.values)}return l}var E2={kernelName:pn,backendName:\"cpu\",kernelFunc:Mj};function Lj(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{filterSize:s,strides:a,pad:i,dimRoundingMode:p,dataFormat:u}=o;K(n,\"avgPool3d\");let c=I.computePool3DInfo(n.shape,s,a,1,i,p,u),l=t.data.get(n.dataId).values,m=Dd(l,n.shape,n.dtype,x.computeStrides(n.shape),c,\"avg\");return t.makeTensorInfo(m.shape,\"float32\",m.values)}var $2={kernelName:ip,backendName:\"cpu\",kernelFunc:Lj};function Bj(r){let{inputs:e,backend:t,attrs:o}=r,{dy:n,input:s}=e,{filterSize:a,strides:i,pad:p,dimRoundingMode:u}=o;K([n,s],\"avgPool3DGrad\");let c=I.computePool3DInfo(s.shape,a,i,1,p,u),l=c.strideDepth,m=c.strideHeight,f=c.strideWidth,d=c.filterDepth,h=c.filterHeight,g=c.filterWidth,y=c.dilationDepth,b=c.dilationHeight,C=c.dilationWidth,w=c.effectiveFilterDepth,k=c.effectiveFilterHeight,_=c.effectiveFilterWidth,E=w-1-c.padInfo.front,R=_-1-c.padInfo.left,A=k-1-c.padInfo.top,D=ne(s.shape,\"float32\"),O=1/(d*h*g),M=t.bufferSync(n);for(let L=0;L=c.outDepth||Math.floor(X)!==X))for(let Q=0;Q=c.outHeight||Math.floor(se)!==se))for(let ie=0;ie<_;ie+=C){let de=(Y+ie)/f;if(de<0||de>=c.outWidth||Math.floor(de)!==de)continue;let Ie=M.get(L,X,se,de,W);Z+=Ie}}}D.set(Z*O,L,V,G,q,W)}return t.makeTensorInfo(D.shape,D.dtype,D.values)}var R2={kernelName:Fm,backendName:\"cpu\",kernelFunc:Bj};function Vj(r){let{inputs:e,backend:t,attrs:o}=r,{dy:n,input:s}=e,a=s;K([n,s],\"avgPoolGrad\");let{filterSize:i,strides:p,pad:u}=o,c=I.computePool2DInfo(a.shape,i,p,1,u),l=c.strideHeight,m=c.strideWidth,f=c.filterHeight,d=c.filterWidth,h=c.dilationHeight,g=c.dilationWidth,y=c.effectiveFilterHeight,b=c.effectiveFilterWidth,C=b-1-c.padInfo.left,w=y-1-c.padInfo.top,k=ne(a.shape,\"float32\"),_=1/(f*d),E=t.data.get(n.dataId).values,R=ne(n.shape,\"float32\",E);for(let A=0;A=c.outHeight||Math.floor(q)!==q))for(let H=0;H=c.outWidth||Math.floor(j)!==j)continue;let Y=R.get(A,q,j,D);V+=Y}}k.set(V*_,A,O,M,D)}return t.makeTensorInfo(k.shape,k.dtype,k.values)}var A2={kernelName:Am,backendName:\"cpu\",kernelFunc:Vj};function zj(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,scale:s,offset:a,mean:i,variance:p}=e;x.assert(i.shape.length===p.shape.length,()=>\"Batch normalization gradient requires mean and variance to have equal ranks.\"),x.assert(a==null||i.shape.length===a.shape.length,()=>\"Batch normalization gradient requires mean and offset to have equal ranks.\"),x.assert(s==null||i.shape.length===s.shape.length,()=>\"Batch normalization gradient requires mean and scale to have equal ranks.\"),K([n,i,p,s,a],\"batchNorm\");let{varianceEpsilon:u}=o;u==null&&(u=.001);let c=t.data.get(n.dataId).values,l=t.data.get(i.dataId).values,m=t.data.get(p.dataId).values,f=s?t.data.get(s.dataId).values:new Float32Array([1]),d=a?t.data.get(a.dataId).values:new Float32Array([0]),h=new Float32Array(c.length),g=d.length,y=f.length,b=m.length,C=l.length,w=0,k=0,_=0,E=0;for(let R=0;R=g&&(w=0),k>=C&&(k=0),_>=y&&(_=0),E>=b&&(E=0);return t.makeTensorInfo(n.shape,n.dtype,h)}var F2={kernelName:kn,backendName:\"cpu\",kernelFunc:zj};function Wj(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{blockShape:s,crops:a}=o;K([n],\"batchToSpaceND\");let i=s.reduce((y,b)=>y*b),p=I.getReshaped(n.shape,s,i),u=I.getPermuted(p.length,s.length),c=I.getReshapedPermuted(n.shape,s,i),l=I.getSliceBeginCoords(a,s.length),m=I.getSliceSize(c,a,s.length),f=Oe({inputs:{x:n},backend:t,attrs:{shape:p}}),d=bt({inputs:{x:f},backend:t,attrs:{perm:u}}),h=Oe({inputs:{x:d},backend:t,attrs:{shape:c}}),g=qo({inputs:{x:h},backend:t,attrs:{begin:l,size:m}});return t.disposeIntermediateTensorInfo(f),t.disposeIntermediateTensorInfo(d),t.disposeIntermediateTensorInfo(h),g}var D2={kernelName:hs,backendName:\"cpu\",kernelFunc:Wj};function Uj(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,weights:s}=e,{size:a}=o,i=t.data.get(n.dataId).values,p=t.data.get(s.dataId).values,u=Zp(i,p,s.dtype,s.shape,a);return t.makeTensorInfo([a],s.dtype,u)}var P2={kernelName:up,backendName:\"cpu\",kernelFunc:Uj};function Gj(r){let{inputs:e,backend:t}=r,{s0:o,s1:n}=e,s=t.data.get(o.dataId).values,a=t.data.get(n.dataId).values,i=I.assertAndGetBroadcastShape(Array.from(s),Array.from(a));return t.makeTensorInfo([i.length],\"int32\",Int32Array.from(i))}var O2={kernelName:pp,backendName:\"cpu\",kernelFunc:Gj};var Hj=we(Ro,(r,e)=>{let t=e;return r>t.clipValueMax?t.clipValueMax:r{let{x:e}=r.inputs,t=r.backend,o=new Float32Array(x.sizeFromShape(e.shape)),n=t.data.get(e.dataId),s=n.complexTensorInfos.real,a=n.complexTensorInfos.imag,i=t.data.get(s.dataId).values,p=t.data.get(a.dataId).values;for(let u=0;uh.shape);I.assertParamsConsistent(a,s);let i=I.computeOutShape(e.map(h=>h.shape),s);if(x.sizeFromShape(i)===0)return t.makeTensorInfo(i,e[0].dtype,[]);let p=e.filter(h=>x.sizeFromShape(h.shape)>0);if(p.length===1)return ar({inputs:{x:p[0]},backend:t});if(p[0].dtype===\"complex64\"){let h=p.map(w=>Wo({inputs:{input:w},backend:t})),g=p.map(w=>qs({inputs:{input:w},backend:t})),y=vi({inputs:h,backend:t,attrs:{axis:s}}),b=vi({inputs:g,backend:t,attrs:{axis:s}}),C=qt({inputs:{real:y,imag:b},backend:t});return h.forEach(w=>t.disposeIntermediateTensorInfo(w)),g.forEach(w=>t.disposeIntermediateTensorInfo(w)),t.disposeIntermediateTensorInfo(y),t.disposeIntermediateTensorInfo(b),C}let u=p.map(h=>{let y=[-1,x.sizeFromShape(h.shape.slice(s))];return Oe({inputs:{x:h},backend:t,attrs:{shape:y}})}),c=u.map(h=>({vals:t.data.get(h.dataId).values,shape:h.shape}));i=I.computeOutShape(u.map(h=>h.shape),1);let l=u[0].shape[0]===1,m=Iu(c,i,e[0].dtype,l),f=I.computeOutShape(p.map(h=>h.shape),s),d=t.makeTensorInfo(f,e[0].dtype,m);return u.forEach(h=>t.disposeIntermediateTensorInfo(h)),d}var V2={kernelName:gs,backendName:\"cpu\",kernelFunc:vi};function RI(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,filter:s}=e,{strides:a,pad:i,dataFormat:p,dilations:u,dimRoundingMode:c}=o;K([n,s],\"conv2d\");let l=I.convertConv2DDataFormat(p),m=I.computeConv2DInfo(n.shape,s.shape,a,u,i,c,!1,l),f=m.filterHeight,d=m.filterWidth,h=m.dilationHeight,g=m.dilationWidth,y=m.padInfo.left,b=m.padInfo.top,C=m.dataFormat===\"channelsLast\",w=new je(m.outShape,n.dtype),k=x.computeStrides(n.shape),_=x.computeStrides(s.shape),E=k[0],R=C?k[1]:k[2],A=C?k[2]:1,D=C?1:k[1],O=w.strides[0],M=C?w.strides[1]:w.strides[2],L=C?w.strides[2]:1,W=C?1:w.strides[1],V=t.data.get(n.dataId).values,G=t.data.get(s.dataId).values,q=w.values;for(let H=0;H=m.inHeight)continue;let ie=Q*_[0],de=j+se*R;for(let Ie=0;Ie=m.inWidth)continue;let pt=ie+Me*_[1],De=de+st*A,ft=pt;for(let at=0;at=u.inDepth)continue;let H=G*A[0],j=O+q*R[1];for(let Y=0;Y=u.inHeight)continue;let se=H+X*A[1],ie=j+Q*R[2];for(let de=0;de=u.inWidth)continue;let st=se+Ee*A[2],pt=ie+Me*u.inChannels,De=st;for(let ft=0;ftMath.cos(r)),K2={kernelName:fn,backendName:\"cpu\",kernelFunc:Zj};var Jj=we(dn,r=>Math.cosh(r)),j2={kernelName:dn,backendName:\"cpu\",kernelFunc:Jj};function eX(r){let{inputs:e,backend:t,attrs:o}=r,{image:n,boxes:s,boxInd:a}=e,{cropSize:i,method:p,extrapolationValue:u}=o,[c,l,m,f]=n.shape,d=s.shape[0],[h,g]=i,y=ne([d,h,g,f],\"float32\"),b=t.data.get(s.dataId).values,C=t.data.get(a.dataId).values,w=t.data.get(n.dataId).values,k=x.computeStrides(n.shape),_=x.computeStrides(y.shape);for(let E=0;E=c)continue;let W=h>1?(O-A)*(l-1)/(h-1):0,V=g>1?(M-D)*(m-1)/(g-1):0;for(let G=0;G1?A*(l-1)+G*W:.5*(A+O)*(l-1);if(q<0||q>l-1){for(let H=0;H1?D*(m-1)+Z*V:.5*(D+M)*(m-1);if(ee<0||ee>m-1){for(let ie=0;ie1?D*(m-1)+H*V:.5*(D+M)*(m-1);if(j<0||j>m-1){for(let ee=0;eey+d-b-1:(y,b)=>y+b;for(let y=0;yy+d-b-1:(y,b)=>y+b;for(let y=0;y`Only NHWC dataFormat supported on CPU for depthToSpace. Got ${a}`);let i=n.shape[0],p=n.shape[1],u=n.shape[2],c=n.shape[3],l=p*s,m=u*s,f=c/(s*s),d=t.data.get(n.dataId).values,h=new Float32Array(i*l*m*f),g=0;for(let y=0;y`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${a} and dilations '${m}'`);let f=I.computeConv2DInfo(n.shape,s.shape,a,m,i,u,!0),{filterHeight:d,filterWidth:h,dilationHeight:g,dilationWidth:y,padInfo:b}=f,C=b.left,w=b.top,k=f.outChannels/f.inChannels,_=new je(f.outShape,n.dtype),E=t.data.get(n.dataId).values,R=t.data.get(s.dataId).values,A=_.values;for(let D=0;D=f.inHeight)continue;let H=G*l[0],j=O+q*c[1];for(let Y=0;Y=f.inWidth)continue;let se=H+X*l[1],ie=j+Q*f.inChannels,de=Z,Ie=se;for(let Se=0;Se{let{x:o,filter:n}=r,{strides:s,pad:a,dilations:i}=t,p=e,u=p.data.get(o.dataId).values,c=o.shape.length,l=p.data.get(n.dataId).values,m=n.shape.length,{batchSize:f,inHeight:d,inWidth:h,inChannels:g,outHeight:y,outWidth:b,padInfo:C,strideHeight:w,strideWidth:k,filterHeight:_,filterWidth:E,dilationHeight:R,dilationWidth:A,outShape:D}=I.computeDilation2DInfo(o.shape,n.shape,s,a,\"NHWC\",i),O=x.sizeFromShape(D),M=D.length,L=x.getArrayFromDType(o.dtype,O);for(let V=0;V=0&&Q=0&&ieZ&&(Z=Se)}}}let ee=x.locToIndex([V,G,H,Y],M,x.computeStrides(D));L[ee]=Z}}}return{dataId:p.write(x.toTypedArray(L,o.dtype),D,o.dtype),shape:D,dtype:o.dtype}}};var s_={kernelName:vb,backendName:\"cpu\",kernelFunc:({inputs:r,backend:e,attrs:t})=>{let{x:o,filter:n,dy:s}=r,{strides:a,pad:i,dilations:p}=t,u=e,c=x.toNestedArray(o.shape,u.data.get(o.dataId).values),l=x.toNestedArray(n.shape,u.data.get(n.dataId).values),{batchSize:m,inHeight:f,inWidth:d,inChannels:h,outHeight:g,outWidth:y,padInfo:b,strideHeight:C,strideWidth:w,filterHeight:k,filterWidth:_,dilationHeight:E,dilationWidth:R,outShape:A}=I.computeDilation2DInfo(o.shape,n.shape,a,i,\"NHWC\",p);x.assert(s.rank===A.length,()=>`Error in ${vb}, dy must have the same rank as output ${A.length}, but got ${s.rank}`);let D=x.toNestedArray(A,u.data.get(s.dataId).values),O=x.makeZerosNestedTypedArray(n.shape,n.dtype);for(let L=0;L=0&&X=0&&sej&&(j=ie,Y=ee,Z=Q)}}}O[Y][Z][H]+=D[L][W][G][H]}}}return{dataId:u.write(x.toTypedArray(O,o.dtype),n.shape,n.dtype),shape:n.shape,dtype:n.dtype}}};var a_={kernelName:Sb,backendName:\"cpu\",kernelFunc:({inputs:r,backend:e,attrs:t})=>{let{x:o,filter:n,dy:s}=r,{strides:a,pad:i,dilations:p}=t,u=e,c=x.toNestedArray(o.shape,u.data.get(o.dataId).values),l=x.toNestedArray(n.shape,u.data.get(n.dataId).values),{batchSize:m,inHeight:f,inWidth:d,inChannels:h,outHeight:g,outWidth:y,padInfo:b,strideHeight:C,strideWidth:w,filterHeight:k,filterWidth:_,dilationHeight:E,dilationWidth:R,outShape:A}=I.computeDilation2DInfo(o.shape,n.shape,a,i,\"NHWC\",p);x.assert(s.rank===A.length,()=>`Error in ${Sb}, dy must have the same rank as output ${A.length}, but got ${s.rank}`);let D=x.toNestedArray(A,u.data.get(s.dataId).values),O=x.makeZerosNestedTypedArray(o.shape,o.dtype);for(let L=0;L=0&&X=0&&sej&&(j=ie,Y=X,Z=se)}}}O[L][Y][Z][H]+=D[L][W][G][H]}}}return{dataId:u.write(x.toTypedArray(O,o.dtype),o.shape,o.dtype),shape:o.shape,dtype:o.dtype}}};function Fa(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s,keepDims:a}=o;K(n,\"sum\");let i;n.dtype===\"bool\"?i=Uo({inputs:{x:n},backend:t,attrs:{dtype:\"int32\"}}):i=ar({inputs:{x:n},backend:t});let p=i.shape.length,u=x.parseAxisParam(s,i.shape),c=I.getAxesPermutation(u,p),l=u,m=i;c!=null&&(m=bt({inputs:{x:i},backend:t,attrs:{perm:c}}),l=I.getInnerMostAxes(l.length,p)),I.assertAxesAreInnerMostDims(\"sum\",l,m.shape.length);let[f,d]=I.computeOutAndReduceShapes(m.shape,l),h=I.upcastType(m.dtype,\"int32\"),g=Yp(t,f,h),y=x.sizeFromShape(d),b=t.data.get(g.dataId).values,C=t.data.get(m.dataId).values;for(let w=0;w=0&&(m=Fa({inputs:{x:m},backend:t,attrs:{axis:u[h]-(a.length-f),keepDims:!1}}),d.push(m)),f--)}for(let h of d)h!==m&&t.disposeIntermediateTensorInfo(h);return m}var u_={kernelName:Xa,backendName:\"cpu\",kernelFunc:uX};function pX(r){let{inputs:e,backend:t}=r,{dy:o,y:n}=e;K([o,n],\"eluGrad\");let s=new Float32Array(x.sizeFromShape(n.shape)),a=t.data.get(n.dataId).values,i=t.data.get(o.dataId).values;for(let p=0;p=1?s[p]=i[p]:s[p]=i[p]*(u+1)}return t.makeTensorInfo(n.shape,\"float32\",s)}var p_={kernelName:Pm,backendName:\"cpu\",kernelFunc:pX};var cX=I.ERF_P,lX=I.ERF_A1,mX=I.ERF_A2,fX=I.ERF_A3,dX=I.ERF_A4,hX=I.ERF_A5,gX=we(Gi,r=>{let e=Math.sign(r),t=Math.abs(r),o=1/(1+cX*t);return e*(1-((((hX*o+dX)*o+fX)*o+mX)*o+lX)*o*Math.exp(-t*t))}),c_={kernelName:Gi,backendName:\"cpu\",kernelFunc:gX};function oc(r){let{inputs:e,backend:t,attrs:o}=r,{input:n}=e,{dim:s}=o,a=n.shape.length,i=n.shape.slice(),p=s;return s<0&&(x.assert(-(a+1)<=s,()=>`Axis must be in the interval [${-(a+1)}, ${a}]`),p=a+s+1),i.splice(p,0,1),Oe({inputs:{x:n},backend:t,attrs:{shape:i}})}var l_={kernelName:xs,backendName:\"cpu\",kernelFunc:oc};var xX=Le((r,e)=>r/e),Sl=Ye(Cn,xX),vl={kernelName:Cn,backendName:\"cpu\",kernelFunc:Sl};function Pd(r,e,t){let o=r.shape,n=o[0],s=o[1],a=t.data.get(r.dataId),i=a.complexTensorInfos.real,p=a.complexTensorInfos.imag,u=[n,s],c=x.sizeFromShape(u),l=x.getTypedArrayFromDType(\"float32\",c),m=x.getTypedArrayFromDType(\"float32\",c);for(let g=0;g{let{image:o}=r,n=t,s=x.getTypedArrayFromDType(o.dtype,x.sizeFromShape(o.shape)),[a,i,p,u]=o.shape,c=n.data.get(o.dataId).values;for(let m=0;m=0&&CMath.floor(r/e)),vX=Ye(vn,SX,null,\"int32\"),h_={kernelName:vn,backendName:\"cpu\",kernelFunc:vX};function kX(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,filter:s,bias:a,preluActivationWeights:i}=e,{strides:p,pad:u,dataFormat:c,dilations:l,dimRoundingMode:m,activation:f,leakyreluAlpha:d}=o,h=RI({inputs:{x:n,filter:s},backend:t,attrs:{strides:p,pad:u,dataFormat:c,dilations:l,dimRoundingMode:m}});if(a){let g=h;if(c===\"NCHW\"&&a.shape.length===1&&a.shape[0]!==1){let y=Oe({inputs:{x:a},backend:t,attrs:{shape:[a.shape[0],1,1]}});h=Hs({inputs:{a:h,b:y},backend:t}),t.disposeIntermediateTensorInfo(y)}else h=Hs({inputs:{a:h,b:a},backend:t});t.disposeIntermediateTensorInfo(g)}if(f){let g=h;if(c===\"NCHW\"&&f===\"prelu\"&&i.shape.length===1&&i.shape[0]!==1){let y=Oe({inputs:{x:i},backend:t,attrs:{shape:[i.shape[0],1,1]}});h=_u(t,h,f,y,d),t.disposeIntermediateTensorInfo(y)}else h=_u(t,h,f,i,d);t.disposeIntermediateTensorInfo(g)}return h}var g_={kernelName:Do,backendName:\"cpu\",kernelFunc:kX};function TX(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,filter:s,bias:a,preluActivationWeights:i}=e,{strides:p,pad:u,dataFormat:c,dilations:l,dimRoundingMode:m,activation:f,leakyreluAlpha:d}=o,h=AI({inputs:{x:n,filter:s},backend:t,attrs:{strides:p,pad:u,dataFormat:c,dilations:l,dimRoundingMode:m}});if(a){let g=h;h=Hs({inputs:{a:h,b:a},backend:t}),t.disposeIntermediateTensorInfo(g)}if(f){let g=h;h=_u(t,h,f,i,d),t.disposeIntermediateTensorInfo(g)}return h}var x_={kernelName:Po,backendName:\"cpu\",kernelFunc:TX};function NX(r){let{inputs:e,backend:t}=r,{params:o,indices:n}=e,s=x.sizeFromShape(o.shape),a=n.shape,i=a[a.length-1],[p,u,c,l]=I.prepareAndValidate(o,n);if(u===0)return t.makeTensorInfo(p,o.dtype,[]);let m=t.data.get(n.dataId).values,f=t.bufferSync(o),d=bd(m,f,o.dtype,u,i,c,l,o.shape,s);return t.makeTensorInfo(p,o.dtype,d.values)}var y_={kernelName:Tn,backendName:\"cpu\",kernelFunc:NX};function _X(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,indices:s}=e,{axis:a,batchDims:i}=o;K([n,s],\"gatherV2\");let p=x.parseAxisParam(a,n.shape)[0],u=t.data.get(s.dataId).values,c=n.shape[p];for(let w=0;w=0,()=>`GatherV2: the index value ${k} is not in [0, ${c-1}]`)}let l=i;i==null&&(l=0);let m=x.sizeFromShape(s.shape),f=I.segment_util.collectGatherOpShapeInfo(n,s,p,l),d=Oe({inputs:{x:n},backend:t,attrs:{shape:[f.batchSize,f.outerSize,f.dimSize,f.sliceSize]}}),h=Oe({inputs:{x:s},backend:t,attrs:{shape:[f.batchSize,m/f.batchSize]}}),g=[f.batchSize,f.outerSize,m/f.batchSize,f.sliceSize],y=t.bufferSync(h),b=t.bufferSync(d),C=Cd(b,y,g);return t.disposeIntermediateTensorInfo(d),t.disposeIntermediateTensorInfo(h),t.makeTensorInfo(f.outputShape,C.dtype,C.values)}var b_={kernelName:bs,backendName:\"cpu\",kernelFunc:_X};function EX(r){let{inputs:e,backend:t}=r,{input:o}=e,n=x.sizeFromShape(o.shape),s=o.shape[o.shape.length-1],a=n/s,i=Oe({inputs:{x:o},backend:t,attrs:{shape:[a,s]}}),p=Pd(i,!0,t),u=Oe({inputs:{x:p},backend:t,attrs:{shape:o.shape}});return t.disposeIntermediateTensorInfo(i),t.disposeIntermediateTensorInfo(p),u}var C_={kernelName:Cp,backendName:\"cpu\",kernelFunc:EX};var $X=we(Hi,r=>Number.isFinite(r)?1:0,\"bool\"),I_={kernelName:Hi,backendName:\"cpu\",kernelFunc:$X};var RX=we(qi,r=>Math.abs(r)===1/0?1:0,\"bool\"),w_={kernelName:qi,backendName:\"cpu\",kernelFunc:RX};var AX=we(ia,r=>Number.isNaN(r)?1:0,\"bool\"),S_={kernelName:ia,backendName:\"cpu\",kernelFunc:AX};function FX(r){let{backend:e,attrs:t}=r,{start:o,stop:n,num:s}=t,a=Id(o,n,s);return e.makeTensorInfo([a.length],\"float32\",a)}var v_={kernelName:Ip,backendName:\"cpu\",kernelFunc:FX};var DX=we(Ki,r=>Math.log1p(r)),k_={kernelName:Ki,backendName:\"cpu\",kernelFunc:DX};var PX=Le((r,e)=>r&&e),OX=Ye(_n,PX,null,\"bool\"),T_={kernelName:_n,backendName:\"cpu\",kernelFunc:OX};var MX=we(En,r=>r?0:1,\"bool\"),N_={kernelName:En,backendName:\"cpu\",kernelFunc:MX};var LX=Le((r,e)=>r||e),BX=Ye(ua,LX,null,\"bool\"),__={kernelName:ua,backendName:\"cpu\",kernelFunc:BX};function VX(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{depthRadius:s,bias:a,alpha:i,beta:p}=o;K(n,\"LRN\");let u=n.shape[3],c=u-1,l=t.data.get(n.dataId).values,m=x.sizeFromShape(n.shape),f=new Float32Array(m);function d(h){let g=h%u,y=h-g+Math.max(0,g-s),b=h-g+Math.min(g+s,c),C=0;for(;y<=b;y++){let w=l[y];C+=w*w}return C}for(let h=0;h`Error in maxPool: Either strides or dilations must be 1. Got strides ${a} and dilations '${u}'`);let c=I.computePool2DInfo(n.shape,s,a,u,i,p),l;if(c.filterWidth===1&&c.filterHeight===1&&x.arraysEqual(c.inShape,c.outShape))l=ar({inputs:{x:n},backend:t});else{let m=t.data.get(n.dataId).values,f=x.computeStrides(n.shape),d=rc(m,n.shape,n.dtype,f,c,\"max\");l=t.makeTensorInfo(c.outShape,n.dtype,d.values)}return l}var A_={kernelName:Rn,backendName:\"cpu\",kernelFunc:WX};function UX(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{filterSize:s,strides:a,pad:i,dimRoundingMode:p,dataFormat:u}=o;K(n,\"maxPool3d\");let c=I.computePool3DInfo(n.shape,s,a,1,i,p,u),l=t.data.get(n.dataId).values,m=Dd(l,n.shape,n.dtype,x.computeStrides(n.shape),c,\"max\");return t.makeTensorInfo(m.shape,\"float32\",m.values)}var F_={kernelName:Sp,backendName:\"cpu\",kernelFunc:UX};function GX(r){let{inputs:e,backend:t,attrs:o}=r,{dy:n,input:s}=e,{filterSize:a,strides:i,pad:p,dimRoundingMode:u}=o;K([n,s],\"maxPool3DGrad\");let c=I.computePool3DInfo(s.shape,a,i,1,p,u),l=t.bufferSync(s),m=_2(l,c),f=c.strideDepth,d=c.strideHeight,h=c.strideWidth,g=c.dilationDepth,y=c.dilationHeight,b=c.dilationWidth,C=c.effectiveFilterDepth,w=c.effectiveFilterHeight,k=c.effectiveFilterWidth,_=C-1-c.padInfo.front,E=k-1-c.padInfo.left,R=w-1-c.padInfo.top,A=ne(s.shape,\"float32\"),D=t.bufferSync(n);for(let O=0;O=c.outDepth||Math.floor(Z)!==Z))for(let ee=0;ee=c.outHeight||Math.floor(X)!==X))for(let Q=0;Q=c.outWidth||Math.floor(se)!==se)continue;let ie=C*w*k-1-m.get(O,Z,X,se,M),de=Y*w*k+ee*k+Q,Ie=ie===de?1:0;if(Ie===0)continue;let Se=D.get(O,Z,X,se,M);j+=Se*Ie}}}A.set(j,O,L,W,V,M)}return t.makeTensorInfo(A.shape,A.dtype,A.values)}var D_={kernelName:Lm,backendName:\"cpu\",kernelFunc:GX};function HX(r){let{inputs:e,backend:t,attrs:o}=r,{dy:n,input:s,output:a}=e,i=s;K([s,a],\"maxPoolGrad\");let{filterSize:p,strides:u,pad:c,dimRoundingMode:l}=o,m=I.computePool2DInfo(i.shape,p,u,1,c,l),f=t.data.get(i.dataId).values,d=ne(m.outShape,i.dtype,Fd(f,i.shape,i.dtype,m).values),h=m.strideHeight,g=m.strideWidth,y=m.dilationHeight,b=m.dilationWidth,C=m.effectiveFilterHeight,w=m.effectiveFilterWidth,k=w-1-m.padInfo.left,_=C-1-m.padInfo.top,E=ne(i.shape,\"float32\"),R=t.data.get(n.dataId).values,A=ne(n.shape,\"float32\",R);for(let D=0;D=m.outHeight||Math.floor(H)!==H))for(let j=0;j=m.outWidth||Math.floor(Y)!==Y)continue;let Z=C*w-1-d.get(D,H,Y,O),ee=q*w+j,X=Z===ee?1:0;if(X===0)continue;let Q=A.get(D,H,Y,O);G+=Q*X}}E.set(G,D,M,L,O)}return t.makeTensorInfo(E.shape,E.dtype,E.values)}var P_={kernelName:Mm,backendName:\"cpu\",kernelFunc:HX};function O_(r,e,t,o,n){let s=x.computeStrides(e),a=rc(r,e,t,s,n,\"max\"),i=Fd(r,e,t,n,!0,o);return[a.values,i.values]}var M_={kernelName:vp,backendName:\"cpu\",kernelFunc:({inputs:r,attrs:e,backend:t})=>{let{x:o}=r,{filterSize:n,strides:s,pad:a,includeBatchInIndex:i}=e,p=t;K(o,\"MaxPoolWithArgmax\");let u=p.data.get(o.dataId).values,c=I.computePool2DInfo(o.shape,n,s,[1,1],a),[l,m]=O_(u,o.shape,o.dtype,i,c),f=p.write(l,c.outShape,o.dtype),d=p.write(m,c.outShape,o.dtype);return[{dataId:f,shape:c.outShape,dtype:o.dtype},{dataId:d,shape:c.outShape,dtype:\"int32\"}]}};function qX(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s,keepDims:a}=o,i=x.parseAxisParam(s,n.shape),u=I.computeOutAndReduceShapes(n.shape,i)[1],c=x.sizeFromShape(u),l=[],m=t.makeTensorInfo([],\"float32\",new Float32Array([c]));l.push(m);let f=Uo({inputs:{x:n},backend:t,attrs:{dtype:\"float32\"}});l.push(f);let d=Sl({inputs:{a:f,b:m},backend:t});l.push(d);let h=Fa({inputs:{x:d},backend:t,attrs:{axis:s,keepDims:a}});return l.forEach(g=>t.disposeIntermediateTensorInfo(g)),h}var L_={kernelName:An,backendName:\"cpu\",kernelFunc:qX};function KX(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s,keepDims:a}=o;K(n,\"min\");let i=x.parseAxisParam(s,n.shape),p=i,u=I.getAxesPermutation(p,n.shape.length),c=n;u!=null&&(c=bt({inputs:{x:n},backend:t,attrs:{perm:u}}),p=I.getInnerMostAxes(p.length,n.shape.length)),I.assertAxesAreInnerMostDims(\"min\",p,c.shape.length);let[l,m]=I.computeOutAndReduceShapes(c.shape,p),f=x.sizeFromShape(m),d=x.makeZerosTypedArray(x.sizeFromShape(l),c.dtype),h=t.data.get(c.dataId).values;for(let y=0;yC[0]+n.shape[w]+C[1]),p=s.map(C=>C[0]),u=s.map((C,w)=>C[0]+n.shape[w]),c=a===\"reflect\"?0:1,l=t.data.get(n.dataId).values,m=n.shape.length,f=x.computeStrides(n.shape),d=x.sizeFromShape(i),h=i.length,g=x.computeStrides(i),y=x.getTypedArrayFromDType(n.dtype,d);for(let C=0;C=u[_]&&(w[_]=(u[_]-1)*2-w[_]+c);w=w.map((_,E)=>_-p[E]);let k=x.locToIndex(w,m,f);y[C]=l[k]}return{dataId:t.write(y,i,n.dtype),shape:i,dtype:n.dtype}}var V_={kernelName:Dn,backendName:\"cpu\",kernelFunc:jX};var XX=Le((r,e)=>{let t=r%e;return r<0&&e<0||r>=0&&e>=0?t:(t+e)%e}),YX=Ye(ji,XX),z_={kernelName:ji,backendName:\"cpu\",kernelFunc:YX};var U_=rp(IC());function PI(r){let{inputs:e,backend:t,attrs:o}=r,{logits:n}=e,{dim:s}=o,a=n.shape.length,i=s;if(i===-1&&(i=a-1),i!==a-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${a} and dim was ${i}`);let p=x.parseAxisParam([i],n.shape),u=DI({inputs:{x:n},backend:t,attrs:{reductionIndices:p,keepDims:!1}}),c=I.expandShapeToKeepDim(u.shape,p),l=Oe({inputs:{x:u},backend:t,attrs:{shape:c}}),m=Il({inputs:{a:n,b:l},backend:t}),f=iI({inputs:{x:m},backend:t}),d=Fa({inputs:{x:f},backend:t,attrs:{axis:p,keepDims:!1}}),h=Oe({inputs:{x:d},backend:t,attrs:{shape:c}}),g=Sl({inputs:{a:f,b:h},backend:t});return t.disposeIntermediateTensorInfo(u),t.disposeIntermediateTensorInfo(l),t.disposeIntermediateTensorInfo(m),t.disposeIntermediateTensorInfo(f),t.disposeIntermediateTensorInfo(d),t.disposeIntermediateTensorInfo(h),g}var W_={kernelName:Xn,backendName:\"cpu\",kernelFunc:PI};function QX(r){let{inputs:e,backend:t,attrs:o}=r,{logits:n}=e,{numSamples:s,seed:a,normalized:i}=o;K(n,\"multinomial\");let p=i?n:PI({inputs:{logits:n},backend:t,attrs:{dim:-1}}),u=p.shape[0],c=p.shape[1],l=t.data.get(p.dataId).values,m=[u,s],f=x.makeZerosTypedArray(x.sizeFromShape(m),\"int32\");for(let d=0;d=0&&l[m]{x.assertShapesMatch(s,c.shape,\"All tensors passed to stack must have matching shapes\"),x.assert(a===c.dtype,()=>\"All tensors passed to stack must have matching dtypes\")});let i=[],p=e.map(c=>{let l=oc({inputs:{input:c},backend:t,attrs:{dim:n}});return i.push(l),l}),u=vi({inputs:p,backend:t,attrs:{axis:n}});return i.forEach(c=>t.disposeIntermediateTensorInfo(c)),u}var Z_={kernelName:Is,backendName:\"cpu\",kernelFunc:OI};function s5(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{paddings:s,constantValue:a}=o;K(n,\"pad\");let i=s.map((b,C)=>b[0]+n.shape[C]+b[1]),p=s.map(b=>b[0]),u=t.data.get(n.dataId).values,c=x.sizeFromShape(n.shape),l=n.shape.length,m=x.computeStrides(n.shape),f=x.sizeFromShape(i),d=i.length,h=x.computeStrides(i),g=x.getTypedArrayFromDType(n.dtype,f);a!==0&&g.fill(a);for(let b=0;b_+p[E]),k=x.locToIndex(w,d,h);g[k]=u[b]}return{dataId:t.write(g,i,n.dtype),shape:i,dtype:n.dtype}}var Od={kernelName:Ln,backendName:\"cpu\",kernelFunc:s5};var a5=Le((r,e)=>Math.pow(r,e)),i5=Ye(Bn,a5),J_={kernelName:Bn,backendName:\"cpu\",kernelFunc:i5};function u5(r){let{inputs:e,backend:t,attrs:o}=r,{paramsNestedSplits:n,paramsDenseValues:s,indices:a}=e,{outputRaggedRank:i}=o,p=n.map(y=>t.data.get(y.dataId).values),u=n.map(y=>y.shape),c=t.data.get(s.dataId).values,l=t.data.get(a.dataId).values,[m,f,d]=Sd(p,u,c,s.shape,s.dtype,l,a.shape,i),h=m.map(y=>t.makeTensorInfo([y.length],\"int32\",y)),g=t.makeTensorInfo(d,s.dtype,f);return h.concat([g])}var eE={kernelName:Tp,backendName:\"cpu\",kernelFunc:u5};function p5(r){let{inputs:e,backend:t}=r,{starts:o,limits:n,deltas:s}=e,a=t.data.get(o.dataId).values,i=t.data.get(n.dataId).values,p=t.data.get(s.dataId).values,[u,c]=vd(a,o.shape,o.dtype,i,n.shape,p,s.shape),l=t.makeTensorInfo([u.length],\"int32\",u),m=t.makeTensorInfo([c.length],o.dtype,c);return[l,m]}var tE={kernelName:Np,backendName:\"cpu\",kernelFunc:p5};function c5(r){let{inputs:e,backend:t,attrs:o}=r,{shape:n,values:s,defaultValue:a,rowPartitionTensors:i}=e,{rowPartitionTypes:p}=o,u=t.data.get(n.dataId).values,c=t.data.get(s.dataId).values,l=t.data.get(a.dataId).values,m=i.map(g=>t.data.get(g.dataId).values),f=i.map(g=>g.shape),[d,h]=kd(u,n.shape,c,s.shape,s.dtype,l,a.shape,m,f,p);return t.makeTensorInfo(d,s.dtype,h)}var rE={kernelName:_p,backendName:\"cpu\",kernelFunc:c5};function l5(r){let{backend:e,attrs:t}=r,{start:o,stop:n,dtype:s,step:a}=t,i=Su(o,n,a,s);return e.makeTensorInfo([i.length],s,i)}var oE={kernelName:ws,backendName:\"cpu\",kernelFunc:l5};var m5=we(ma,r=>1/r),nE={kernelName:ma,backendName:\"cpu\",kernelFunc:m5};function f5(r){let{inputs:e,backend:t,attrs:o}=r,{images:n}=e,{alignCorners:s,halfPixelCenters:a,size:i}=o;K(n,\"resizeBilinear\");let p=x.computeStrides(n.shape),[u,c]=i,[l,m,f,d]=n.shape,h=t.data.get(n.dataId).values,g=new Float32Array(x.sizeFromShape([l,u,c,d])),y=[s&&u>1?m-1:m,s&&c>1?f-1:f],b=[s&&u>1?u-1:u,s&&c>1?c-1:c],C=0,w=y[0]/b[0],k=y[1]/b[1];for(let _=0;_1?u-1:u,a&&f>1?c-1:c],g=[a&&m>1?m-1:m,a&&f>1?f-1:f],y=h[0]/g[0],b=h[1]/g[1],C=t.data.get(s.dataId).values,w=0;for(let k=0;k1?m-1:m,s&&c>1?f-1:f],b=[s&&u>1?u-1:u,s&&c>1?c-1:c],C=y[0]/b[0],w=y[1]/b[1],k=0;for(let _=0;_1?c-1:c,a&&d>1?l-1:l],b=[a&&f>1?f-1:f,a&&d>1?d-1:d],C=y[0]/b[0],w=y[1]/b[1],k=1/C,_=1/w,E=Math.ceil(k)*2+2,R=Math.ceil(_)*2+2;for(let A=0;A=f)continue;let X=D+ee*p[1],Q=ee*C,se=Math.min(c-1,a?Math.round(Q):Math.floor(Q));if(O===se)for(let ie=0;ie=d)continue;let Ie=X+de*p[2],Se=de*w,Ee=Math.min(l-1,a?Math.round(Se):Math.floor(Se));V===Ee&&(Y+=g[Ie+j])}}h[G+j]=Y}}}}return t.makeTensorInfo(n.shape,n.dtype,h)}var uE={kernelName:Bm,backendName:\"cpu\",kernelFunc:g5};function x5(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{dims:s}=o;K(n,\"reverse\");let a=n.shape.length,i=x.parseAxisParam(s,n.shape);if(a===0)return ar({inputs:{x:n},backend:t});let p=new je(n.shape,n.dtype),u=t.bufferSync(n);for(let c=0;cm[f]=n.shape[f]-1-m[f]),p.set(u.get(...m),...l)}return t.makeTensorInfo(p.shape,p.dtype,p.values)}var pE={kernelName:fa,backendName:\"cpu\",kernelFunc:x5};var cE={kernelName:es,backendName:\"cpu\",kernelFunc:({inputs:r,attrs:e,backend:t})=>{let{image:o}=r,{radians:n,fillValue:s,center:a}=e,i=t,p=x.getTypedArrayFromDType(o.dtype,x.sizeFromShape(o.shape)),[u,c,l,m]=o.shape,[f,d]=I.getImageCenter(a,c,l),h=255,g=Math.sin(n),y=Math.cos(n),b=i.data.get(o.dataId).values;for(let w=0;w=0&&W=0&&V{let e=Math.floor(r);return r-e<.5?Math.floor(r):r-e>.5?Math.ceil(r):e%2===0?e:e+1}),lE={kernelName:da,backendName:\"cpu\",kernelFunc:y5};function b5(r){let{inputs:e,backend:t,attrs:o}=r,{indices:n,updates:s}=e,{shape:a}=o,{sliceRank:i,numUpdates:p,sliceSize:u,strides:c,outputSize:l}=I.calculateShapes(s,n,a),m=!0,f=t.bufferSync(n),d=t.bufferSync(s),h=Aa(f,d,a,l,u,p,i,c,0,m);return t.makeTensorInfo(a,h.dtype,h.values)}var mE={kernelName:Hn,backendName:\"cpu\",kernelFunc:b5};function C5(r,e){let t=0,o=r.length,n=0;for(;t1||n.shape.length===1?1:x.sizeFromShape(n.shape.slice(1));for(let d=0;dr>=0?k5*r:v5*(Math.exp(r)-1)),gE={kernelName:Xi,backendName:\"cpu\",kernelFunc:T5};var N5=we(Yi,r=>r<0?-1:r>0?1:0),xE={kernelName:Yi,backendName:\"cpu\",kernelFunc:N5};var _5=we(Kn,r=>Math.sin(r)),yE={kernelName:Kn,backendName:\"cpu\",kernelFunc:_5};var E5=we(ha,r=>Math.sinh(r)),bE={kernelName:ha,backendName:\"cpu\",kernelFunc:E5};var $5=11920928955078125e-23,CE=Math.log($5)+2,R5=we(Qi,r=>{let e=r>-CE,t=rNumber(g)))),t.makeTensorInfo([h.length],o.dtype,new Int32Array(h))]}var SE={kernelName:Qa,backendName:\"cpu\",kernelFunc:F5};function D5(r){let{inputs:e,backend:t}=r,{inputIndices:o,inputShape:n,newShape:s}=e;if(o.shape.length!==2)throw new Error(`Input indices should be a matrix but received shape\n ${o.shape}`);if(n.shape.length!==1)throw new Error(`Input shape should be a vector but received shape\n ${n.shape}`);if(s.shape.length!==1)throw new Error(`Target shape should be a vector but received shape ${s.shape}`);let a=Array.from(t.data.get(n.dataId).values),i=t.data.get(o.dataId).values,p=Array.from(t.data.get(s.dataId).values),[u,c,l]=Nd(i,o.shape,o.dtype,a,p);return[t.makeTensorInfo(c,o.dtype,u),t.makeTensorInfo([l.length],s.dtype,new Int32Array(l))]}var vE={kernelName:ga,backendName:\"cpu\",kernelFunc:D5};function P5(r){let{inputs:e,backend:t}=r,{data:o,indices:n,segmentIds:s}=e;if(o.shape.length<1)throw new Error(\"Data should be at least 1 dimensional but received scalar\");if(n.shape.length!==1)throw new Error(`Indices should be a vector but received shape\n ${n.shape}`);if(s.shape.length!==1)throw new Error(`Segment ids should be a vector but received shape\n ${s.shape}`);if(n.shape[0]!==s.shape[0])throw new Error(\"segmentIds and indices should have same size.\");let a=t.data.get(o.dataId).values,i=t.data.get(n.dataId).values,p=t.data.get(s.dataId).values,[u,c]=tc(a,o.shape,o.dtype,i,p,!0);return t.makeTensorInfo(c,o.dtype,u)}var kE={kernelName:Za,backendName:\"cpu\",kernelFunc:P5};function O5(r){let{inputs:e,backend:t}=r,{data:o,indices:n,segmentIds:s}=e;if(o.shape.length<1)throw new Error(\"Data should be at least 1 dimensional but received scalar\");if(n.shape.length!==1)throw new Error(`Indices should be a vector but received shape\n ${n.shape}`);if(s.shape.length!==1)throw new Error(`Segment ids should be a vector but received shape\n ${s.shape}`);if(n.shape[0]!==s.shape[0])throw new Error(\"segmentIds and indices should have same size.\");let a=t.data.get(o.dataId).values,i=t.data.get(n.dataId).values,p=t.data.get(s.dataId).values,[u,c]=tc(a,o.shape,o.dtype,i,p);return t.makeTensorInfo(c,o.dtype,u)}var TE={kernelName:Ja,backendName:\"cpu\",kernelFunc:O5};function M5(r){let{inputs:e,backend:t,attrs:o}=r,{sparseIndices:n,sparseValues:s,defaultValue:a}=e,{outputShape:i}=o,{sliceRank:p,numUpdates:u,sliceSize:c,strides:l,outputSize:m}=I.calculateShapes(s,n,i),f=!1,d=t.bufferSync(n),h;switch(s.dtype){case\"bool\":{let g=t.bufferSync(s),y=Boolean(t.data.get(a.dataId).values[0]);h=Aa(d,g,i,m,c,u,p,l,y,f);break}case\"float32\":{let g=t.bufferSync(s),y=t.data.get(a.dataId).values[0];h=Aa(d,g,i,m,c,u,p,l,y,f);break}case\"int32\":{let g=t.bufferSync(s),y=t.data.get(a.dataId).values[0];h=Aa(d,g,i,m,c,u,p,l,y,f);break}case\"string\":{let g=t.bufferSync(s),y=x.decodeString(t.data.get(a.dataId).values[0]);h=Aa(d,g,i,m,c,u,p,l,y,f);break}default:throw new Error(`Unsupported type ${s.dtype}`)}return t.makeTensorInfo(i,h.dtype,h.values)}var NE={kernelName:ei,backendName:\"cpu\",kernelFunc:M5};function L5(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{numOrSizeSplits:s,axis:a}=o,i=x.parseAxisParam(a,n.shape)[0],p=I.prepareSplitSize(n,s,i),u=new Array(n.shape.length).fill(0),c=n.shape.slice();return p.map(l=>{let m=[...c];m[i]=l;let f=qo({inputs:{x:n},backend:t,attrs:{begin:u,size:m}});return u[i]+=l,f})}var _E={kernelName:Ts,backendName:\"cpu\",kernelFunc:L5};var EE={kernelName:ti,backendName:\"cpu\",kernelFunc:({inputs:r,backend:e})=>{let{x:t}=r,o=e;K(t,\"square\");let n=o.data.get(t.dataId).values,s=new Float32Array(n.length);for(let i=0;i{let t=e;return isNaN(r)?NaN:r>0?1:t.alpha}),$E={kernelName:$s,backendName:\"cpu\",kernelFunc:B5};function V5(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{begin:s,end:a,strides:i,beginMask:p,endMask:u,ellipsisMask:c,newAxisMask:l,shrinkAxisMask:m}=o;K(n,\"stridedSlice\");let{finalShapeSparse:f,finalShape:d,isIdentity:h,sliceDim0:g,isSimpleSlice:y,begin:b,end:C,strides:w}=et.sliceInfo(n.shape,s,a,i,p,u,c,l,m),k;if(h)k=Oe({inputs:{x:n},backend:t,attrs:{shape:d}});else if(g||y){x.assert(n.shape.length>=1,()=>`Input must have rank at least 1, got: ${n.shape.length}`);let _=et.computeOutShape(b,C,w),E=qo({inputs:{x:n},backend:t,attrs:{begin:b,size:_}});k=Oe({inputs:{x:E},backend:t,attrs:{shape:d}}),t.disposeIntermediateTensorInfo(E)}else{let _=t.bufferSync(n),E=_d(f,_,w,b);k=t.makeTensorInfo(d,E.dtype,E.values)}return k}var RE={kernelName:Yn,backendName:\"cpu\",kernelFunc:V5};function z5(r){let{inputs:e,backend:t,attrs:o}=r,{separator:n,nGramWidths:s,leftPad:a,rightPad:i,padWidth:p,preserveShortSequences:u}=o,{data:c,dataSplits:l}=e,m=t.data.get(c.dataId).values,f=t.data.get(l.dataId).values,[d,h]=ku(m,f,n,s,a,i,p,u);return[t.makeTensorInfo([d.length],\"string\",d),t.makeTensorInfo(l.shape,\"int32\",h)]}var AE={kernelName:Ns,backendName:\"cpu\",kernelFunc:z5};function W5(r){let{inputs:e,backend:t,attrs:o}=r,{skipEmpty:n}=o,{input:s,delimiter:a}=e;if(s.dtype!==\"string\")throw new Error(\"Input must be of datatype string\");if(s.shape.length!==1)throw new Error(`Input must be a vector, got shape: ${s.shape}`);if(a.shape.length!==0)throw new Error(`Delimiter must be a scalar, got shape: ${a.shape}`);let i=t.data.get(s.dataId).values,p=t.data.get(a.dataId).values[0],[u,c,l]=Tu(i,p,n),m=c.length;return[t.makeTensorInfo([m,2],\"int32\",u),t.makeTensorInfo([m],\"string\",c),t.makeTensorInfo([2],\"int32\",new Int32Array(l))]}var FE={kernelName:ri,backendName:\"cpu\",kernelFunc:W5};function U5(r){let{inputs:e,backend:t,attrs:o}=r,{numBuckets:n}=o,{input:s}=e;if(s.dtype!==\"string\")throw new Error(\"Input must be of datatype string\");if(n<=0)throw new Error(\"Number of buckets must be at least 1\");let a=t.data.get(s.dataId).values,i=Nu(a,n);return t.makeTensorInfo(s.shape,\"int32\",i)}var DE={kernelName:oi,backendName:\"cpu\",kernelFunc:U5};var G5=we(xa,r=>Math.tan(r)),PE={kernelName:xa,backendName:\"cpu\",kernelFunc:G5};var H5=we(Qn,r=>Math.tanh(r)),OE={kernelName:Qn,backendName:\"cpu\",kernelFunc:H5};function q5(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{reps:s}=o;K(n,\"tile\");let a=Ed(t.bufferSync(n),s);return t.makeTensorInfo(a.shape,a.dtype,a.values)}var ME={kernelName:wo,backendName:\"cpu\",kernelFunc:q5};function K5(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{k:s,sorted:a}=o;K(n,\"topk\");let i=t.data.get(n.dataId).values,[p,u]=$d(i,n.shape,n.dtype,s,a);return[t.makeTensorInfo(p.shape,p.dtype,p.values),t.makeTensorInfo(u.shape,u.dtype,u.values)]}var LE={kernelName:Zn,backendName:\"cpu\",kernelFunc:K5};function j5(r){let{inputs:e,attrs:t,backend:o}=r,{image:n,transforms:s}=e,{interpolation:a,fillMode:i,fillValue:p,outputShape:u}=t,[c,l,m,f]=n.shape,[d,h]=u!=null?u:[l,m],g=[c,d,h,f],y=x.computeStrides(n.shape),b=y[0],C=y[1],w=y[2],k=x.computeStrides(g),_=k[0],E=k[1],R=k[2],A=x.getTypedArrayFromDType(n.dtype,x.sizeFromShape(g));A.fill(p);let D=o.data.get(n.dataId).values,O=o.data.get(s.dataId).values;for(let L=0;Le-1)if(e<=1)t=0;else{let o=2*e;t-=o*Math.trunc(t/o),t>=e&&(t=o-t-1)}return x.clamp(0,t,e-1)}function Y5(r,e){let t=r;if(t<0)if(e<=1)t=0;else{let o=e-1;t+=e*(Math.trunc(-t/o)+1)}else if(t>e-1)if(e<=1)t=0;else{let o=e-1;t-=e*Math.trunc(t/o)}return x.clamp(0,t,e-1)}function Q5(r,e){return r}function Z5(r,e){return x.clamp(0,r,e-1)}function Nl(r,e,t,o,n,s,a,i,p,u,c){let l=a*o+i*n+p*s+u;return 0<=i&&it.disposeIntermediateTensorInfo(d)),f}var UE={kernelName:Rp,backendName:\"cpu\",kernelFunc:o8};var n8=[h2,TN,g2,x2,RN,y2,b2,C2,I2,w2,S2,v2,k2,T2,N2,E2,$2,R2,A2,d2,F2,D2,P2,O2,$N,AN,M2,NN,L2,V2,z2,W2,U2,G2,H2,q2,K2,j2,X2,Y2,Q2,Z2,J2,e_,t_,r_,o_,n_,s_,a_,u_,u2,p_,FN,c_,DN,l_,PN,m_,f_,d_,ON,h_,g_,x_,y_,b_,MN,LN,_N,C_,B2,I_,w_,S_,p2,BN,VN,v_,zN,k_,T_,N_,__,E_,$_,R_,WN,A_,F_,D_,P_,M_,L_,B_,UN,V_,z_,G_,GN,HN,H_,q_,K_,qN,j_,Q_,Z_,Od,J_,c2,jN,eE,tE,rE,oE,EN,vl,nE,l2,m2,f2,sE,aE,iE,uE,pE,cE,lE,JN,mE,dE,hE,gE,t2,xE,yE,bE,r2,W_,IE,wE,SE,vE,kE,TE,NE,_E,n2,EE,s2,$E,RE,AE,FE,DE,a2,i_,PE,OE,ME,LE,VE,KN,zE,WE,UE,X_];for(let r of n8)ya(r);var ic={};Be(ic,{assertNotComplex:()=>as,bindCanvasToFramebuffer:()=>f8,bindColorTextureToFramebuffer:()=>Rl,bindTextureToProgramUniformSampler:()=>ZI,bindTextureUnit:()=>KE,bindVertexBufferToProgramAttribute:()=>Wd,callAndCheck:()=>me,canBeRepresented:()=>VI,createFragmentShader:()=>WI,createFramebuffer:()=>XI,createProgram:()=>UI,createStaticIndexBuffer:()=>qI,createStaticVertexBuffer:()=>HI,createTexture:()=>KI,createVertexShader:()=>zI,getBatchDim:()=>Pa,getExtensionOrThrow:()=>nc,getFramebufferErrorMessage:()=>jE,getMaxTexturesInShader:()=>tw,getNumChannels:()=>l8,getProgramUniformLocation:()=>QI,getProgramUniformLocationOrThrow:()=>YI,getRowsCols:()=>Oa,getShapeAs3D:()=>ac,getTextureShapeFromLogicalShape:()=>JI,getWebGLDisjointQueryTimerVersion:()=>rw,getWebGLErrorMessage:()=>qE,getWebGLMaxTextureSize:()=>ew,hasExtension:()=>Hr,isCapableOfRenderingToFloatTexture:()=>ow,isDownloadFloatTextureEnabled:()=>nw,isReshapeFree:()=>Ti,isWebGLFenceEnabled:()=>sw,isWebGLVersionEnabled:()=>Gd,linkProgram:()=>GI,logShaderSourceAndInfoLog:()=>zd,resetMaxTextureSize:()=>d8,resetMaxTexturesInShader:()=>h8,unbindColorTextureFromFramebuffer:()=>Ud,unbindTextureUnit:()=>m8,validateFramebuffer:()=>sc,validateProgram:()=>$l,validateTextureSize:()=>jI});var Eu={},Md={alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!0};function MI(r,e){Eu[r]=e}function Gr(r,e){if(!(r in Eu)||e!=null){let o=a8(r,e);if(o!==null)Eu[r]=o;else return console.log(\"Could not get context for WebGL version\",r),null}let t=Eu[r];return t==null||t.isContextLost()?(delete Eu[r],Gr(r)):(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),Eu[r])}function s8(r){if(typeof OffscreenCanvas!=\"undefined\"&&r===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 a8(r,e){if(r!==1&&r!==2)throw new Error(\"Cannot get WebGL rendering context, WebGL is disabled.\");let t=e==null?s8(r):e;return t.addEventListener(\"webglcontextlost\",o=>{o.preventDefault(),delete Eu[r]},!1),P().getBool(\"SOFTWARE_WEBGL_ENABLED\")&&(Md.failIfMajorPerformanceCaveat=!1),r===1?t.getContext(\"webgl\",Md)||t.getContext(\"experimental-webgl\",Md):t.getContext(\"webgl2\",Md)}var ki;(function(r){r[r.DENSE=0]=\"DENSE\",r[r.SHARED_BATCH=1]=\"SHARED_BATCH\"})(ki||(ki={}));var ir;(function(r){r[r.RENDER=0]=\"RENDER\",r[r.UPLOAD=1]=\"UPLOAD\",r[r.PIXELS=2]=\"PIXELS\",r[r.DOWNLOAD=3]=\"DOWNLOAD\"})(ir||(ir={}));var Jt;(function(r){r[r.UNPACKED_FLOAT16=0]=\"UNPACKED_FLOAT16\",r[r.UNPACKED_FLOAT32=1]=\"UNPACKED_FLOAT32\",r[r.PACKED_4X1_UNSIGNED_BYTE=2]=\"PACKED_4X1_UNSIGNED_BYTE\",r[r.PACKED_2X2_FLOAT32=3]=\"PACKED_2X2_FLOAT32\",r[r.PACKED_2X2_FLOAT16=4]=\"PACKED_2X2_FLOAT16\"})(Jt||(Jt={}));function $u(r,e){return[e,r]}function GE(r,e){return r*e}function _l(r){let e=x.sizeFromShape(r),t=Math.ceil(e/4);return x.sizeToSquarishShape(t)}function Ks(r,e){return[Math.max(1,Math.ceil(e/2)),Math.max(1,Math.ceil(r/2))]}function HE(r,e){let[t,o]=Ks(r,e);return t*o*4}function El(r,e){let t=r,o,n,s,a,i,p,u,c,l,m;return P().getNumber(\"WEBGL_VERSION\")===2?(o=t.R32F,n=t.R16F,s=t.RGBA16F,a=t.RGBA32F,i=t.RED,u=4,c=1,l=t.HALF_FLOAT,m=t.FLOAT,p=t.RGBA8):(o=r.RGBA,n=r.RGBA,s=r.RGBA,a=t.RGBA,i=r.RGBA,u=4,c=4,l=e!=null?e.HALF_FLOAT_OES:null,m=r.FLOAT,p=r.RGBA),{internalFormatFloat:o,internalFormatHalfFloat:n,internalFormatPackedHalfFloat:s,internalFormatPackedFloat:a,textureFormatFloat:i,downloadTextureFormat:p,downloadUnpackNumChannels:u,defaultNumChannels:c,textureTypeHalfFloat:l,textureTypeFloat:m}}function me(r,e){let t=e();return P().getBool(\"DEBUG\")&&i8(r),t}function i8(r){let e=r.getError();if(e!==r.NO_ERROR)throw new Error(\"WebGL Error: \"+qE(r,e))}var u8=596e-10,p8=65504;function VI(r){return!!(P().getBool(\"WEBGL_RENDER_FLOAT32_ENABLED\")||r===0||u8r.getExtension(e),'Extension \"'+e+'\" not supported on this browser.')}function zI(r,e){let t=Da(r,()=>r.createShader(r.VERTEX_SHADER),\"Unable to create vertex WebGLShader.\");if(me(r,()=>r.shaderSource(t,e)),me(r,()=>r.compileShader(t)),r.getShaderParameter(t,r.COMPILE_STATUS)===!1)throw console.log(r.getShaderInfoLog(t)),new Error(\"Failed to compile vertex shader.\");return t}function WI(r,e){let t=Da(r,()=>r.createShader(r.FRAGMENT_SHADER),\"Unable to create fragment WebGLShader.\");if(me(r,()=>r.shaderSource(t,e)),me(r,()=>r.compileShader(t)),P().get(\"ENGINE_COMPILE_ONLY\"))return t;if(r.getShaderParameter(t,r.COMPILE_STATUS)===!1)throw zd(e,r.getShaderInfoLog(t)),new Error(\"Failed to compile fragment shader.\");return t}var c8=/ERROR: [0-9]+:([0-9]+):/g;function zd(r,e){let t=c8.exec(e);if(t==null){console.log(`Couldn't parse line number in error: ${e}`),console.log(r);return}let o=+t[1],n=r.split(`\n`),s=n.length.toString().length+2,a=n.map((l,m)=>x.rightPad((m+1).toString(),s)+l),i=0;for(let l=0;lr.createProgram(),\"Unable to create WebGLProgram.\")}function GI(r,e){if(me(r,()=>r.linkProgram(e)),!P().get(\"ENGINE_COMPILE_ONLY\")&&r.getProgramParameter(e,r.LINK_STATUS)===!1)throw console.log(r.getProgramInfoLog(e)),new Error(\"Failed to link vertex and fragment shaders.\")}function $l(r,e){if(me(r,()=>r.validateProgram(e)),r.getProgramParameter(e,r.VALIDATE_STATUS)===!1)throw console.log(r.getProgramInfoLog(e)),new Error(\"Shader program validation failed.\")}function HI(r,e){let t=Da(r,()=>r.createBuffer(),\"Unable to create WebGLBuffer\");return me(r,()=>r.bindBuffer(r.ARRAY_BUFFER,t)),me(r,()=>r.bufferData(r.ARRAY_BUFFER,e,r.STATIC_DRAW)),t}function qI(r,e){let t=Da(r,()=>r.createBuffer(),\"Unable to create WebGLBuffer\");return me(r,()=>r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t)),me(r,()=>r.bufferData(r.ELEMENT_ARRAY_BUFFER,e,r.STATIC_DRAW)),t}function l8(){return P().getNumber(\"WEBGL_VERSION\")===2?1:4}function KI(r){return Da(r,()=>r.createTexture(),\"Unable to create WebGLTexture.\")}function jI(r,e){let t=P().getNumber(\"WEBGL_MAX_TEXTURE_SIZE\");if(r<=0||e<=0){let o=`[${r}x${e}]`;throw new Error(\"Requested texture size \"+o+\" is invalid.\")}if(r>t||e>t){let o=`[${r}x${e}]`,n=`[${t}x${t}]`;throw new Error(\"Requested texture size \"+o+\" greater than WebGL maximum on this browser / GPU \"+n+\".\")}}function XI(r){return Da(r,()=>r.createFramebuffer(),\"Unable to create WebGLFramebuffer.\")}function Wd(r,e,t,o,n,s,a){let i=r.getAttribLocation(e,t);return i===-1?!1:(me(r,()=>r.bindBuffer(r.ARRAY_BUFFER,o)),me(r,()=>r.vertexAttribPointer(i,n,r.FLOAT,!1,s,a)),me(r,()=>r.enableVertexAttribArray(i)),!0)}function KE(r,e,t){XE(r,t),me(r,()=>r.activeTexture(r.TEXTURE0+t)),me(r,()=>r.bindTexture(r.TEXTURE_2D,e))}function m8(r,e){XE(r,e),me(r,()=>r.activeTexture(r.TEXTURE0+e)),me(r,()=>r.bindTexture(r.TEXTURE_2D,null))}function YI(r,e,t){return Da(r,()=>r.getUniformLocation(e,t),'uniform \"'+t+'\" not present in program.')}function QI(r,e,t){return r.getUniformLocation(e,t)}function ZI(r,e,t,o){me(r,()=>KE(r,e,o)),me(r,()=>r.uniform1i(t,o))}function f8(r){me(r,()=>r.bindFramebuffer(r.FRAMEBUFFER,null)),me(r,()=>r.viewport(0,0,r.canvas.width,r.canvas.height)),me(r,()=>r.scissor(0,0,r.canvas.width,r.canvas.height))}function Rl(r,e,t){me(r,()=>r.bindFramebuffer(r.FRAMEBUFFER,t)),me(r,()=>r.framebufferTexture2D(r.FRAMEBUFFER,r.COLOR_ATTACHMENT0,r.TEXTURE_2D,e,0))}function Ud(r,e){me(r,()=>r.bindFramebuffer(r.FRAMEBUFFER,e)),me(r,()=>r.framebufferTexture2D(r.FRAMEBUFFER,r.COLOR_ATTACHMENT0,r.TEXTURE_2D,null,0))}function sc(r){let e=r.checkFramebufferStatus(r.FRAMEBUFFER);if(e!==r.FRAMEBUFFER_COMPLETE)throw new Error(\"Error binding framebuffer: \"+jE(r,e))}function jE(r,e){switch(e){case r.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:return\"FRAMEBUFFER_INCOMPLETE_ATTACHMENT\";case r.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:return\"FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT\";case r.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:return\"FRAMEBUFFER_INCOMPLETE_DIMENSIONS\";case r.FRAMEBUFFER_UNSUPPORTED:return\"FRAMEBUFFER_UNSUPPORTED\";default:return`unknown error ${e}`}}function Da(r,e,t){let o=me(r,()=>e());if(o==null)throw new Error(t);return o}function XE(r,e){let t=r.MAX_COMBINED_TEXTURE_IMAGE_UNITS-1,o=e+r.TEXTURE0;if(ot){let n=`[gl.TEXTURE0, gl.TEXTURE${t}]`;throw new Error(`textureUnit must be in ${n}.`)}}function Pa(r,e=2){return x.sizeFromShape(r.slice(0,r.length-e))}function Oa(r){if(r.length===0)throw Error(\"Cannot get rows and columns of an empty shape array.\");return[r.length>1?r[r.length-2]:1,r[r.length-1]]}function ac(r){let e=[1,1,1];return r.length===0||r.length===1&&r[0]===1||(e=[Pa(r),...Oa(r)]),e}function JI(r,e=!1){let t=P().getNumber(\"WEBGL_MAX_TEXTURE_SIZE\"),o=P().getNumber(\"WEBGL_MAX_SIZE_FOR_NARROW_TEXTURE\");o===1/0&&P().getBool(\"WEBGL_AUTO_SQUARIFY_NARROW_TEXTURE_SHAPE\")&&(o=t/2),e&&(t=t*2,o=o*2,r=r.map((i,p)=>p>=r.length-2?x.nearestLargerEven(r[p]):r[p]),r.length===1&&(r=[2,r[0]])),r.length!==2&&(r=x.squeezeShape(r).newShape);let n=x.sizeFromShape(r),s=null;r.length<=1&&n<=t?s=[1,n]:r.length===2&&r[0]<=t&&r[1]<=t?s=r:r.length===3&&r[0]*r[1]<=t&&r[2]<=t?s=[r[0]*r[1],r[2]]:r.length===3&&r[0]<=t&&r[1]*r[2]<=t?s=[r[0],r[1]*r[2]]:r.length===4&&r[0]*r[1]*r[2]<=t&&r[3]<=t?s=[r[0]*r[1]*r[2],r[3]]:r.length===4&&r[0]<=t&&r[1]*r[2]*r[3]<=t&&(s=[r[0],r[1]*r[2]*r[3]]);let a=s!=null&&Math.max(...s)>o&&Math.min(...s)<=(e?2:1)&&Math.min(...s)>0;if(s==null||a)if(e){let i=Pa(r),p=2,u=2;r.length&&([p,u]=Oa(r)),n=i*(p/2)*(u/2),s=x.sizeToSquarishShape(n).map(c=>c*2)}else s=x.sizeToSquarishShape(n);return s}function Ld(r){return r%2===0}function Ti(r,e){if(r=r.slice(-2),e=e.slice(-2),x.arraysEqual(r,e)||!r.length||!e.length||r[0]===0||r[1]===0||e[0]===0||e[1]===0)return!0;if(r.length!==e.length){let t=r.slice(-1)[0],o=e.slice(-1)[0];if(t===o||Ld(t)&&Ld(o)&&(r[0]===1||e[0]===1))return!0}return r[1]===e[1]&&Ld(r[0])&&Ld(e[0])}var Bd,Vd;function ew(r){if(Bd==null){let e=Gr(r);Bd=e.getParameter(e.MAX_TEXTURE_SIZE)}return Bd}function d8(){Bd=null}function h8(){Vd=null}function tw(r){if(Vd==null){let e=Gr(r);Vd=e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS)}return Math.min(16,Vd)}function rw(r){if(r===0)return 0;let e,t=Gr(r);return Hr(t,\"EXT_disjoint_timer_query_webgl2\")&&r===2?e=2:Hr(t,\"EXT_disjoint_timer_query\")?e=1:e=0,e}function Hr(r,e){return r.getExtension(e)!=null}function Gd(r){try{if(Gr(r)!=null)return!0}catch(e){return console.log(\"Error when getting WebGL context: \",e),!1}return!1}function ow(r){if(r===0)return!1;let e=Gr(r);if(r===1){if(!Hr(e,\"OES_texture_float\"))return!1}else if(!Hr(e,\"EXT_color_buffer_float\"))return!1;return BI(e)}function nw(r){if(r===0)return!1;let e=Gr(r);if(r===1){if(!Hr(e,\"OES_texture_float\")||!Hr(e,\"WEBGL_color_buffer_float\"))return!1}else{if(Hr(e,\"EXT_color_buffer_float\"))return BI(e);let o=\"EXT_color_buffer_half_float\";if(Hr(e,o)){let n=e.getExtension(o);return g8(e,n)}return!1}return BI(e)}function BI(r){let e=El(r),t=r.createTexture();r.bindTexture(r.TEXTURE_2D,t);let o=1,n=1;r.texImage2D(r.TEXTURE_2D,0,e.internalFormatFloat,o,n,0,e.textureFormatFloat,e.textureTypeFloat,null);let s=r.createFramebuffer();r.bindFramebuffer(r.FRAMEBUFFER,s),r.framebufferTexture2D(r.FRAMEBUFFER,r.COLOR_ATTACHMENT0,r.TEXTURE_2D,t,0);let a=r.checkFramebufferStatus(r.FRAMEBUFFER)===r.FRAMEBUFFER_COMPLETE;return r.bindTexture(r.TEXTURE_2D,null),r.bindFramebuffer(r.FRAMEBUFFER,null),r.deleteTexture(t),r.deleteFramebuffer(s),a}function g8(r,e){let t=El(r,e),o=r.createTexture();r.bindTexture(r.TEXTURE_2D,o);let n=1,s=1;r.texImage2D(r.TEXTURE_2D,0,t.internalFormatHalfFloat,n,s,0,t.textureFormatFloat,t.textureTypeHalfFloat,null);let a=r.createFramebuffer();r.bindFramebuffer(r.FRAMEBUFFER,a),r.framebufferTexture2D(r.FRAMEBUFFER,r.COLOR_ATTACHMENT0,r.TEXTURE_2D,o,0);let i=r.checkFramebufferStatus(r.FRAMEBUFFER)===r.FRAMEBUFFER_COMPLETE;return r.bindTexture(r.TEXTURE_2D,null),r.bindFramebuffer(r.FRAMEBUFFER,null),r.deleteTexture(o),r.deleteFramebuffer(a),i}function sw(r){return r!==2?!1:Gr(r).fenceSync!=null}function as(r,e){Array.isArray(r)||(r=[r]),r.forEach(t=>{t!=null&&x.assert(t.dtype!==\"complex64\",()=>`${e} does not support complex64 tensors in the WebGL backend.`)})}var Ce=P();Ce.registerFlag(\"HAS_WEBGL\",()=>Ce.getNumber(\"WEBGL_VERSION\")>0);Ce.registerFlag(\"WEBGL_VERSION\",()=>Gd(2)?2:Gd(1)?1:0);Ce.registerFlag(\"WEBGL_CHECK_NUMERICAL_PROBLEMS\",()=>!1);Ce.registerFlag(\"WEBGL_BUFFER_SUPPORTED\",()=>Ce.get(\"WEBGL_VERSION\")===2);Ce.registerFlag(\"WEBGL_CPU_FORWARD\",()=>!0);Ce.registerFlag(\"WEBGL_FORCE_F16_TEXTURES\",()=>!1);Ce.registerFlag(\"WEBGL_PACK\",()=>Ce.getBool(\"HAS_WEBGL\"));Ce.registerFlag(\"WEBGL_PACK_NORMALIZATION\",()=>Ce.getBool(\"WEBGL_PACK\"));Ce.registerFlag(\"WEBGL_PACK_CLIP\",()=>Ce.getBool(\"WEBGL_PACK\"));Ce.registerFlag(\"WEBGL_PACK_DEPTHWISECONV\",()=>Ce.getBool(\"WEBGL_PACK\"));Ce.registerFlag(\"WEBGL_PACK_BINARY_OPERATIONS\",()=>Ce.getBool(\"WEBGL_PACK\"));Ce.registerFlag(\"WEBGL_PACK_UNARY_OPERATIONS\",()=>Ce.getBool(\"WEBGL_PACK\"));Ce.registerFlag(\"WEBGL_PACK_ARRAY_OPERATIONS\",()=>Ce.getBool(\"WEBGL_PACK\"));Ce.registerFlag(\"WEBGL_PACK_IMAGE_OPERATIONS\",()=>Ce.getBool(\"WEBGL_PACK\"));Ce.registerFlag(\"WEBGL_PACK_REDUCE\",()=>Ce.getBool(\"WEBGL_PACK\"));Ce.registerFlag(\"WEBGL_LAZILY_UNPACK\",()=>Ce.getBool(\"WEBGL_PACK\"));Ce.registerFlag(\"WEBGL_CONV_IM2COL\",()=>Ce.getBool(\"WEBGL_PACK\"));Ce.registerFlag(\"WEBGL_MAX_TEXTURE_SIZE\",()=>ew(Ce.getNumber(\"WEBGL_VERSION\")));Ce.registerFlag(\"WEBGL_MAX_TEXTURES_IN_SHADER\",()=>tw(Ce.getNumber(\"WEBGL_VERSION\")));Ce.registerFlag(\"WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION\",()=>{let r=Ce.getNumber(\"WEBGL_VERSION\");return r===0?0:rw(r)});Ce.registerFlag(\"WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE\",()=>Ce.getNumber(\"WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION\")>0&&!ii.isMobile());Ce.registerFlag(\"WEBGL_RENDER_FLOAT32_CAPABLE\",()=>ow(Ce.getNumber(\"WEBGL_VERSION\")));Ce.registerFlag(\"WEBGL_RENDER_FLOAT32_ENABLED\",()=>Ce.getBool(\"WEBGL_FORCE_F16_TEXTURES\")?!1:Ce.getBool(\"WEBGL_RENDER_FLOAT32_CAPABLE\"));Ce.registerFlag(\"WEBGL_DOWNLOAD_FLOAT_ENABLED\",()=>nw(Ce.getNumber(\"WEBGL_VERSION\")));Ce.registerFlag(\"WEBGL_FENCE_API_ENABLED\",()=>sw(Ce.getNumber(\"WEBGL_VERSION\")));Ce.registerFlag(\"WEBGL_SIZE_UPLOAD_UNIFORM\",()=>Ce.getBool(\"WEBGL_RENDER_FLOAT32_ENABLED\")?4:0);Ce.registerFlag(\"WEBGL_DELETE_TEXTURE_THRESHOLD\",()=>-1,r=>{if(r<0&&r!==-1)throw new Error(`WEBGL_DELETE_TEXTURE_THRESHOLD must be -1 (indicating never delete) or at least 0, but got ${r}.`)});Ce.registerFlag(\"WEBGL_FLUSH_THRESHOLD\",()=>ii.isMobile()?1:-1,r=>{if(r<0&&r!==-1)throw new Error(`WEBGL_FLUSH_THRESHOLD must be -1 (indicating never manual flush) or at least 0, but got ${r}.`)});Ce.registerFlag(\"CPU_HANDOFF_SIZE_THRESHOLD\",()=>128);Ce.registerFlag(\"WEBGL_USE_SHAPES_UNIFORMS\",()=>!1);Ce.registerFlag(\"TOPK_LAST_DIM_CPU_HANDOFF_SIZE_THRESHOLD\",()=>1e5);Ce.registerFlag(\"TOPK_K_CPU_HANDOFF_THRESHOLD\",()=>128);Ce.registerFlag(\"WEBGL_EXP_CONV\",()=>!1);Ce.registerFlag(\"SOFTWARE_WEBGL_ENABLED\",()=>Ce.getBool(\"IS_TEST\"));Ce.registerFlag(\"WEBGL_MAX_SIZE_FOR_NARROW_TEXTURE\",()=>1/0);Ce.registerFlag(\"WEBGL_AUTO_SQUARIFY_NARROW_TEXTURE_SHAPE\",()=>!1);Ce.registerFlag(\"WEBGL2_ISNAN_CUSTOM\",()=>!1);function Ct(){let r,e,t,o,n,s,a,i,p,u;return P().getNumber(\"WEBGL_VERSION\")===2?(r=\"#version 300 es\",e=\"in\",t=\"out\",o=\"in\",n=\"texture\",s=\"outputColor\",a=\"out vec4 outputColor;\",i=P().getBool(\"WEBGL2_ISNAN_CUSTOM\")?`\n bool isnan_custom(float val) {\n uint floatToUint = floatBitsToUint(val);\n return (floatToUint & 0x7fffffffu) > 0x7f800000u;\n }\n\n bvec4 isnan_custom(vec4 val) {\n return bvec4(isnan_custom(val.x),\n isnan_custom(val.y), isnan_custom(val.z), isnan_custom(val.w));\n }\n\n #define isnan(value) isnan_custom(value)\n `:\"\",p=\"\",u=`\n #define round(value) newRound(value)\n int newRound(float value) {\n return int(floor(value + 0.5));\n }\n\n ivec4 newRound(vec4 value) {\n return ivec4(floor(value + vec4(0.5)));\n }\n `):(r=\"\",e=\"attribute\",t=\"varying\",o=\"varying\",n=\"texture2D\",s=\"gl_FragColor\",a=\"\",i=`\n #define isnan(value) isnan_custom(value)\n bool isnan_custom(float val) {\n return (val > 0. || val < 1. || val == 0.) ? false : true;\n }\n bvec4 isnan_custom(vec4 val) {\n return bvec4(isnan(val.x), isnan(val.y), isnan(val.z), isnan(val.w));\n }\n `,p=`\n uniform float INFINITY;\n\n bool isinf(float val) {\n return abs(val) == INFINITY;\n }\n bvec4 isinf(vec4 val) {\n return equal(abs(val), vec4(INFINITY));\n }\n `,u=`\n int round(float value) {\n return int(floor(value + 0.5));\n }\n\n ivec4 round(vec4 value) {\n return ivec4(floor(value + vec4(0.5)));\n }\n `),{version:r,attribute:e,varyingVs:t,varyingFs:o,texture2D:n,output:s,defineOutput:a,defineSpecialNaN:i,defineSpecialInf:p,defineRound:u}}function is(r,e,t=\"index\"){let o=x.computeStrides(e);return o.map((n,s)=>{let a=`int ${r[s]} = ${t} / ${n}`,i=s===o.length-1?`int ${r[s+1]} = ${t} - ${r[s]} * ${n}`:`index -= ${r[s]} * ${n}`;return`${a}; ${i};`}).join(\"\")}function Ru(r,e,t=\"index\"){let o=x.computeStrides(e);return o.map((n,s)=>{let a=`int ${r[s]} = ${t} / outShapeStrides[${s}]`,i=s===o.length-1?`int ${r[s+1]} = ${t} - ${r[s]} * outShapeStrides[${s}]`:`index -= ${r[s]} * outShapeStrides[${s}]`;return`${a}; ${i};`}).join(\"\")}function x8(r,e){let t=r.length,o=r.map(s=>`${e}[${s}]`),n=new Array(t-1);n[t-2]=o[t-1];for(let s=t-3;s>=0;--s)n[s]=`(${n[s+1]} * ${o[s+1]})`;return n}function YE(r,e,t=\"index\"){let o=r.map((s,a)=>a),n=x8(o,e);return n.map((s,a)=>{let i=`int ${r[a]} = ${t} / ${n[a]}`,p=a===n.length-1?`int ${r[a+1]} = ${t} - ${r[a]} * ${n[a]}`:`index -= ${r[a]} * ${n[a]}`;return`${i}; ${p};`}).join(\"\")}function uc(r){let e=x.computeStrides(r).map(t=>t.toString());return`\n int getFlatIndex(ivec3 coords) {\n return coords.x * ${e[0]} + coords.y * ${e[1]} + coords.z;\n }\n`}function pc(){return`\n int getFlatIndex(ivec3 coords) {\n return coords.x * outShapeStrides[0] + coords.y * outShapeStrides[1] + coords.z;\n }\n`}var Hd=`\n const float FLOAT_MAX = 1.70141184e38;\n const float FLOAT_MIN = 1.17549435e-38;\n\n lowp vec4 encode_float(highp float v) {\n if (isnan(v)) {\n return vec4(255, 255, 255, 255);\n }\n\n highp float av = abs(v);\n\n if(av < FLOAT_MIN) {\n return vec4(0.0, 0.0, 0.0, 0.0);\n } else if(v > FLOAT_MAX) {\n return vec4(0.0, 0.0, 128.0, 127.0) / 255.0;\n } else if(v < -FLOAT_MAX) {\n return vec4(0.0, 0.0, 128.0, 255.0) / 255.0;\n }\n\n highp vec4 c = vec4(0,0,0,0);\n\n highp float e = floor(log2(av));\n highp float m = exp2(fract(log2(av))) - 1.0;\n\n c[2] = floor(128.0 * m);\n m -= c[2] / 128.0;\n c[1] = floor(32768.0 * m);\n m -= c[1] / 32768.0;\n c[0] = floor(8388608.0 * m);\n\n highp float ebias = e + 127.0;\n c[3] = floor(ebias / 2.0);\n ebias -= c[3] * 2.0;\n c[2] += floor(ebias) * 128.0;\n\n c[3] += 128.0 * step(0.0, -v);\n\n return c / 255.0;\n }\n`;var{getBroadcastDims:QE}=I;function ZE(r,e,t){let o=[];if(r.forEach(f=>{let d=x.sizeFromShape(f.shapeInfo.logicalShape);if(f.shapeInfo.isUniform?o.push(`uniform float ${f.name}${d>1?`[${d}]`:\"\"};`):(o.push(`uniform sampler2D ${f.name};`),o.push(`uniform int offset${f.name};`)),t.enableShapeUniforms){let{uniformShape:h}=qd(t.packedInputs,f.shapeInfo.logicalShape,f.shapeInfo.texShape);switch(h.length){case 1:o.push(`uniform int ${f.name}Shape;`);break;case 2:o.push(`uniform ivec2 ${f.name}Shape;`);break;case 3:o.push(`uniform ivec3 ${f.name}Shape;`);break;case 4:o.push(`uniform ivec4 ${f.name}Shape;`);break;default:break}o.push(`uniform ivec2 ${f.name}TexShape;`)}}),t.enableShapeUniforms){switch(e.logicalShape.length){case 1:o.push(\"uniform int outShape;\");break;case 2:o.push(\"uniform ivec2 outShape;\"),o.push(\"uniform int outShapeStrides;\");break;case 3:o.push(\"uniform ivec3 outShape;\"),o.push(\"uniform ivec2 outShapeStrides;\");break;case 4:o.push(\"uniform ivec4 outShape;\"),o.push(\"uniform ivec3 outShapeStrides;\");break;default:break}o.push(\"uniform ivec2 outTexShape;\")}t.customUniforms&&t.customUniforms.forEach(f=>{o.push(`uniform ${f.type} ${f.name}${f.arrayIndex?`[${f.arrayIndex}]`:\"\"};`)});let n=o.join(`\n`),s=r.map(f=>y8(f,e,t.packedInputs,t.enableShapeUniforms)).join(`\n`),a=e.texShape,i=Ct(),p=I8(i),u,c,l=v8(i);return e.isPacked?(u=b8(e.logicalShape,a,t.enableShapeUniforms),c=S8(i)):(u=C8(e.logicalShape,a,t.enableShapeUniforms),c=w8(i)),t.packedInputs&&(l+=_8),[l,p,c,n,u,s,t.userCode].join(`\n`)}function lc(r,e=!1){let t=r.shapeInfo.logicalShape;switch(t.length){case 0:return V8(r,e);case 1:return W8(r,e);case 2:return G8(r,e);case 3:return q8(r,e);case 4:return j8(r,e);case 5:return X8(r);case 6:return Y8(r);default:throw new Error(`${t.length}-D input sampling is not yet supported`)}}function JE(r,e){switch(r.shapeInfo.logicalShape.length){case 0:return B8(r);case 1:return z8(r,e);case 2:return U8(r,e);case 3:return H8(r,e);default:return K8(r,e)}}function y8(r,e,t=!1,o){let n=\"\";t?n+=JE(r,o):n+=lc(r,o);let s=r.shapeInfo.logicalShape,a=e.logicalShape;return s.length<=a.length&&(t?n+=Q8(r,e):n+=Z8(r,e)),n}function b8(r,e,t){switch(r.length){case 0:return e$();case 1:return E8(r,e,t);case 2:return M8(r,e,t);case 3:return R8(r,e,t);default:return F8(r,e,t)}}function C8(r,e,t){switch(r.length){case 0:return e$();case 1:return $8(r,e,t);case 2:return L8(r,e,t);case 3:return A8(r,e,t);case 4:return D8(r,e,t);case 5:return P8(r,e);case 6:return O8(r,e);default:throw new Error(`${r.length}-D output sampling is not yet supported`)}}function I8(r){return`\n float sampleTexture(sampler2D textureSampler, vec2 uv) {\n return ${r.texture2D}(textureSampler, uv).r;\n }\n `}function w8(r){return`\n void setOutput(float val) {\n ${r.output} = vec4(val, 0, 0, 0);\n }\n `}function S8(r){return`\n void setOutput(vec4 val) {\n ${r.output} = val;\n }\n `}function v8(r){return`${r.version}\n precision highp float;\n precision highp int;\n precision highp sampler2D;\n ${r.varyingFs} vec2 resultUV;\n ${r.defineOutput}\n const vec2 halfCR = vec2(0.5, 0.5);\n\n struct ivec5\n {\n int x;\n int y;\n int z;\n int w;\n int u;\n };\n\n struct ivec6\n {\n int x;\n int y;\n int z;\n int w;\n int u;\n int v;\n };\n\n uniform float NAN;\n ${r.defineSpecialNaN}\n ${r.defineSpecialInf}\n ${r.defineRound}\n\n int imod(int x, int y) {\n return x - y * (x / y);\n }\n\n int idiv(int a, int b, float sign) {\n int res = a / b;\n int mod = imod(a, b);\n if (sign < 0. && mod != 0) {\n res -= 1;\n }\n return res;\n }\n\n //Based on the work of Dave Hoskins\n //https://www.shadertoy.com/view/4djSRW\n #define HASHSCALE1 443.8975\n float random(float seed){\n vec2 p = resultUV * seed;\n vec3 p3 = fract(vec3(p.xyx) * HASHSCALE1);\n p3 += dot(p3, p3.yzx + 19.19);\n return fract((p3.x + p3.y) * p3.z);\n }\n\n ${k8}\n ${T8}\n ${N8}\n `}var k8=`\nvec2 uvFromFlat(int texNumR, int texNumC, int index) {\n int texR = index / texNumC;\n int texC = index - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n}\nvec2 packedUVfrom1D(int texNumR, int texNumC, int index) {\n int texelIndex = index / 2;\n int texR = texelIndex / texNumC;\n int texC = texelIndex - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n}\n`,T8=`\nvec2 packedUVfrom2D(int texelsInLogicalRow, int texNumR,\n int texNumC, int row, int col) {\n int texelIndex = (row / 2) * texelsInLogicalRow + (col / 2);\n int texR = texelIndex / texNumC;\n int texC = texelIndex - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n}\n`,N8=`\nvec2 packedUVfrom3D(int texNumR, int texNumC,\n int texelsInBatch, int texelsInLogicalRow, int b,\n int row, int col) {\n int index = b * texelsInBatch + (row / 2) * texelsInLogicalRow + (col / 2);\n int texR = index / texNumC;\n int texC = index - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n}\n`,_8=`\n float getChannel(vec4 frag, vec2 innerDims) {\n vec2 modCoord = mod(innerDims, 2.);\n return modCoord.x == 0. ?\n (modCoord.y == 0. ? frag.r : frag.g) :\n (modCoord.y == 0. ? frag.b : frag.a);\n }\n float getChannel(vec4 frag, int dim) {\n float modCoord = mod(float(dim), 2.);\n return modCoord == 0. ? frag.r : frag.g;\n }\n`;function e$(){return`\n int getOutputCoords() {\n return 0;\n }\n `}function E8(r,e,t){let o=[Math.ceil(e[0]/2),Math.ceil(e[1]/2)];return o[0]===1?t?`\n int getOutputCoords() {\n return 2 * int(resultUV.x * ceil(float(outTexShape[1]) / 2.0));\n }\n `:`\n int getOutputCoords() {\n return 2 * int(resultUV.x * ${o[1]}.0);\n }\n `:o[1]===1?t?`\n int getOutputCoords() {\n return 2 * int(resultUV.y * ceil(float(outTexShape[0]) / 2.0));\n }\n `:`\n int getOutputCoords() {\n return 2 * int(resultUV.y * ${o[0]}.0);\n }\n `:t?`\n int getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n return 2 * (resTexRC.x * packedTexShape[1] + resTexRC.y);\n }\n `:`\n int getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${o[0]}, ${o[1]}));\n return 2 * (resTexRC.x * ${o[1]} + resTexRC.y);\n }\n `}function $8(r,e,t){return e[0]===1?t?`\n int getOutputCoords() {\n return int(resultUV.x * float(outTexShape[1]));\n }\n `:`\n int getOutputCoords() {\n return int(resultUV.x * ${e[1]}.0);\n }\n `:e[1]===1?t?`\n int getOutputCoords() {\n return int(resultUV.y * float(outTexShape[0]));\n }\n `:`\n int getOutputCoords() {\n return int(resultUV.y * ${e[0]}.0);\n }\n `:t?`\n int getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(outTexShape[0], outTexShape[1]));\n return resTexRC.x * outTexShape[1] + resTexRC.y;\n }\n `:`\n int getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${e[0]}, ${e[1]}));\n return resTexRC.x * ${e[1]} + resTexRC.y;\n }\n `}function R8(r,e,t){if(t)return`\n ivec3 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n int texelsInLogicalRow = int(ceil(float(outShape[2]) / 2.0));\n int texelsInBatch = texelsInLogicalRow * int(ceil(float(outShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n int index = resTexRC.x * packedTexShape[1] + resTexRC.y;\n\n int b = index / texelsInBatch;\n index -= b * texelsInBatch;\n\n int r = 2 * (index / texelsInLogicalRow);\n int c = imod(index, texelsInLogicalRow) * 2;\n\n return ivec3(b, r, c);\n }\n `;let o=[Math.ceil(e[0]/2),Math.ceil(e[1]/2)],n=Math.ceil(r[2]/2),s=n*Math.ceil(r[1]/2);return`\n ivec3 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${o[0]}, ${o[1]}));\n int index = resTexRC.x * ${o[1]} + resTexRC.y;\n\n int b = index / ${s};\n index -= b * ${s};\n\n int r = 2 * (index / ${n});\n int c = imod(index, ${n}) * 2;\n\n return ivec3(b, r, c);\n }\n `}function A8(r,e,t){if(t)return`\n ivec3 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(outTexShape[0], outTexShape[1]));\n int index = resTexRC.x * outTexShape[1] + resTexRC.y;\n ${Ru([\"r\",\"c\",\"d\"],r)}\n return ivec3(r, c, d);\n }\n`;let o=is([\"r\",\"c\",\"d\"],r);return`\n ivec3 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${e[0]}, ${e[1]}));\n int index = resTexRC.x * ${e[1]} + resTexRC.y;\n ${o}\n return ivec3(r, c, d);\n }\n `}function F8(r,e,t){if(t)return`\n ivec4 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n int index = resTexRC.x * packedTexShape[1] + resTexRC.y;\n\n int texelsInLogicalRow = int(ceil(float(outShape[3]) / 2.0));\n int texelsInBatch = texelsInLogicalRow * int(ceil(float(outShape[2]) / 2.0));\n int texelsInBatchN = texelsInBatch * outShape[1];\n\n int b2 = index / texelsInBatchN;\n index -= b2 * texelsInBatchN;\n\n int b = index / texelsInBatch;\n index -= b * texelsInBatch;\n\n int r = 2 * (index / texelsInLogicalRow);\n int c = imod(index, texelsInLogicalRow) * 2;\n\n return ivec4(b2, b, r, c);\n }\n `;let o=[Math.ceil(e[0]/2),Math.ceil(e[1]/2)],n=Math.ceil(r[r.length-1]/2),s=n*Math.ceil(r[r.length-2]/2),a=s,i=\"\",p=\"b, r, c\";for(let u=2;u=1?c=\"coords = 0;\":c=i.map(b=>`coords.${l[b+u]} = 0;`).join(`\n`);let m=\"\";a<2&&s>0?m=\"coords\":m=r.shapeInfo.logicalShape.map((b,C)=>`coords.${l[C+u]}`).join(\", \");let f=\"return outputValue;\",h=x.sizeFromShape(r.shapeInfo.logicalShape)===1,y=x.sizeFromShape(e.logicalShape)===1;if(s===1&&!h&&!y)f=`\n return vec4(outputValue.xy, outputValue.xy);\n `;else if(h&&!y)a===1?f=`\n return vec4(outputValue.x, outputValue.x, 0., 0.);\n `:f=`\n return vec4(outputValue.x);\n `;else if(i.length){let b=s-2,C=s-1;i.indexOf(b)>-1&&i.indexOf(C)>-1?f=\"return vec4(outputValue.x);\":i.indexOf(b)>-1?f=\"return vec4(outputValue.x, outputValue.y, outputValue.x, outputValue.y);\":i.indexOf(C)>-1&&(f=\"return vec4(outputValue.xx, outputValue.zz);\")}return`\n vec4 ${n}() {\n ${p} coords = getOutputCoords();\n ${c}\n vec4 outputValue = get${o}(${m});\n ${f}\n }\n `}function Z8(r,e){let t=r.name,o=t.charAt(0).toUpperCase()+t.slice(1),n=\"get\"+o+\"AtOutCoords\",s=e.texShape,a=r.shapeInfo.texShape,i=r.shapeInfo.logicalShape.length,p=e.logicalShape.length;if(!r.shapeInfo.isUniform&&i===p&&r.shapeInfo.flatOffset==null&&x.arraysEqual(a,s))return`\n float ${n}() {\n return sampleTexture(${t}, resultUV);\n }\n `;let u=_e(p),c=QE(r.shapeInfo.logicalShape,e.logicalShape),l=p-i,m,f=[\"x\",\"y\",\"z\",\"w\",\"u\",\"v\"];i===0?m=\"\":p<2&&c.length>=1?m=\"coords = 0;\":m=c.map(h=>`coords.${f[h+l]} = 0;`).join(`\n`);let d=\"\";return p<2&&i>0?d=\"coords\":d=r.shapeInfo.logicalShape.map((h,g)=>`coords.${f[g+l]}`).join(\", \"),`\n float ${n}() {\n ${u} coords = getOutputCoords();\n ${m}\n return get${o}(${d});\n }\n `}function _e(r){if(r<=1)return\"int\";if(r===2)return\"ivec2\";if(r===3)return\"ivec3\";if(r===4)return\"ivec4\";if(r===5)return\"ivec5\";if(r===6)return\"ivec6\";throw Error(`GPU for rank ${r} is not yet supported`)}function qd(r,e,t){let{newShape:o,keptDims:n}=x.squeezeShape(e),s=e.length,a=r&&s===3&&e[0]===1,i=a?e.slice(1):o,p=!r&&s>1&&!x.arraysEqual(e,t)&&o.lengthr[t]).join(\", \")}function r$(r,e,t,o){let n=t.map((c,l)=>{let m={logicalShape:c.shape,texShape:c.isUniform?null:c.texData.texShape,isUniform:c.isUniform,isPacked:c.isUniform?!1:c.texData.isPacked,flatOffset:null};return c.texData!=null&&c.texData.slice!=null&&c.texData.slice.flatOffset>0&&(m.flatOffset=c.texData.slice.flatOffset),{name:e.variableNames[l],shapeInfo:m}}),s=n.map(c=>c.shapeInfo),a={logicalShape:o.shape,texShape:o.texData.texShape,isUniform:!1,isPacked:o.texData.isPacked,flatOffset:null},i=ZE(n,a,e),p=WI(r.gl,i),u=r.createProgram(p);return P().get(\"ENGINE_COMPILE_ONLY\")?{program:e,fragmentShader:p,source:i,webGLProgram:u,inShapeInfos:s,outShapeInfo:a,uniformLocations:null,customUniformLocations:null,infLoc:null,nanLoc:null,inShapesLocations:null,inTexShapesLocations:null,outShapeLocation:null,outShapeStridesLocation:null,outTexShapeLocation:null}:Object.assign({program:e,fragmentShader:p,source:i,webGLProgram:u,inShapeInfos:s,outShapeInfo:a},aw(r,e,u))}function aw(r,e,t){let o={},n={},s={},a=[],i,p,u,c=null,l=null;l=r.getUniformLocation(t,\"NAN\",!1),P().getNumber(\"WEBGL_VERSION\")===1&&(c=r.getUniformLocation(t,\"INFINITY\",!1));let m=!1;for(let f=0;f{a[d]=r.getUniformLocation(t,f.name,m)}),{uniformLocations:o,customUniformLocations:a,infLoc:c,nanLoc:l,inShapesLocations:n,inTexShapesLocations:s,outShapeLocation:i,outShapeStridesLocation:u,outTexShapeLocation:p}}function t$(r,e){if(r.length!==e.length)throw Error(`Binary was compiled with ${r.length} inputs, but was executed with ${e.length} inputs`);r.forEach((t,o)=>{let n=t.logicalShape,s=e[o],a=s.shape;if(!x.arraysEqual(n,a))throw Error(`Binary was compiled with different shapes than the current args. Shapes ${n} and ${a} must match`);if(t.isUniform&&s.isUniform)return;let i=t.texShape,p=s.isUniform?null:s.texData.texShape;if(!x.arraysEqual(i,p))throw Error(`Binary was compiled with different texture shapes than the current args. Shape ${i} and ${p} must match`)})}function o$(r,e,t,o,n){e.program.enableShapeUniforms||(t$(e.inShapeInfos,t),t$([e.outShapeInfo],[o]));let s=o.texData.texture,a=o.texData.texShape;o.texData.isPacked?r.setOutputPackedMatrixTexture(s.texture,a[0],a[1]):r.setOutputMatrixTexture(s.texture,a[0],a[1]),r.setProgram(e.webGLProgram),P().getNumber(\"WEBGL_VERSION\")===1&&e.infLoc!==null&&r.gl.uniform1f(e.infLoc,1/0),e.nanLoc!==null&&r.gl.uniform1f(e.nanLoc,NaN),t.forEach((p,u)=>{let c=e.program.variableNames[u],l=e.uniformLocations[c],m=e.uniformLocations[`offset${c}`],f=e.inShapesLocations[`${c}Shape`],d=e.inTexShapesLocations[`${c}TexShape`];if(f){let{uniformShape:h}=qd(e.program.packedInputs,p.shape,p.texData.texShape);switch(h.length){case 1:r.gl.uniform1iv(f,new Int32Array(h));break;case 2:r.gl.uniform2iv(f,new Int32Array(h));break;case 3:r.gl.uniform3iv(f,new Int32Array(h));break;case 4:r.gl.uniform4iv(f,new Int32Array(h));break;default:break}}if(d&&r.gl.uniform2i(d,p.texData.texShape[0],p.texData.texShape[1]),l!=null){if(p.isUniform){if(x.sizeFromShape(p.shape)<2)r.gl.uniform1f(l,p.uniformValues[0]);else{let h=p.uniformValues;h instanceof Float32Array||(h=new Float32Array(h)),r.gl.uniform1fv(l,h)}return}p.texData.slice!=null&&m!=null&&r.gl.uniform1i(m,p.texData.slice.flatOffset),r.setInputMatrixTexture(p.texData.texture.texture,l,u)}});let i=e.outShapeLocation;if(i)switch(o.shape.length){case 1:r.gl.uniform1iv(i,new Int32Array(o.shape));break;case 2:r.gl.uniform2iv(i,new Int32Array(o.shape));break;case 3:r.gl.uniform3iv(i,new Int32Array(o.shape));break;case 4:r.gl.uniform4iv(i,new Int32Array(o.shape));break;default:break}if(e.outShapeStridesLocation){let p=x.computeStrides(o.shape);switch(o.shape.length){case 2:r.gl.uniform1iv(e.outShapeStridesLocation,new Int32Array(p));break;case 3:r.gl.uniform2iv(e.outShapeStridesLocation,new Int32Array(p));break;case 4:r.gl.uniform3iv(e.outShapeStridesLocation,new Int32Array(p));break;default:break}}e.outTexShapeLocation&&r.gl.uniform2i(e.outTexShapeLocation,o.texData.texShape[0],o.texData.texShape[1]),e.program.customUniforms&&n&&e.program.customUniforms.forEach((p,u)=>{let c=e.customUniformLocations[u],l=n[u];if(p.type===\"float\")r.gl.uniform1fv(c,l);else if(p.type===\"vec2\")r.gl.uniform2fv(c,l);else if(p.type===\"vec3\")r.gl.uniform3fv(c,l);else if(p.type===\"vec4\")r.gl.uniform4fv(c,l);else if(p.type===\"int\")r.gl.uniform1iv(c,l);else if(p.type===\"ivec2\")r.gl.uniform2iv(c,l);else if(p.type===\"ivec3\")r.gl.uniform3iv(c,l);else if(p.type===\"ivec4\")r.gl.uniform4iv(c,l);else throw Error(`uniform type ${p.type} is not supported yet.`)}),r.executeProgram()}function n$(r,e,t){let o=\"\";e.concat(t).forEach(a=>{let i=a.texData!=null&&a.texData.slice!=null&&a.texData.slice.flatOffset>0;if(r.enableShapeUniforms&&!a.isUniform){let p=a.texData.texShape,{useSqueezeShape:u,uniformShape:c,keptDims:l}=qd(r.packedInputs,a.shape,p),m=\"\",f=\"\",d=\"\";if(c.length===1&&r.packedInputs){let k=[Math.ceil(p[0]/2),Math.ceil(p[1]/2)];m=`${k[0]>1}_${k[1]>1}`}else if(c.length===2&&!r.packedInputs)f=`${c[0]>1}_${c[1]>1}`;else if(c.length>2&&!r.packedInputs){let k=x.computeStrides(c);d=`${k[0]===p[1]}_${k[k.length-1]===p[1]}`}let h=a.shape.length,g=c.length===2&&x.arraysEqual(a.shape,p),y=x.sizeFromShape(a.shape)===1,b=I.getBroadcastDims(a.shape,t.shape),C=!r.packedInputs&&h===t.shape.length&&x.arraysEqual(p,t.texData.texShape),w=r.packedInputs||c.length>2?\"\":`${p[0]>1}_${p[1]>1}`;o+=`${h}_${C}_${u?l:\"\"}_${c.length}_${y}_${b}_${g}_${m}_${f}_${d}_${w}_${i}`}else{let p=a.isUniform?\"uniform\":a.texData.texShape;o+=`${a.shape}_${p}_${i}`}});let n=r.userCode,s=r.constructor.name;return s+=\"_\"+o+\"_\"+n+`${P().getNumber(\"WEBGL_VERSION\")}`,s}function lt(r){return P().getBool(\"WEBGL_USE_SHAPES_UNIFORMS\")&&r<=4}var Kd=class{constructor(e){this.variableNames=[\"A\"],this.packedInputs=!1,this.packedOutput=!0,this.outPackingScheme=ki.DENSE,this.customUniforms=[{name:\"texShape\",type:\"ivec2\"}];let t=Ct();this.outputShape=e,this.enableShapeUniforms=lt(this.outputShape.length),this.userCode=`\n ivec3 outCoordsFromFlatIndex(int index) {\n ${this.enableShapeUniforms?Ru([\"r\",\"c\",\"d\"],e):is([\"r\",\"c\",\"d\"],e)}\n return ivec3(r, c, d);\n }\n\n void main() {\n ivec2 resTexRC = ivec2(resultUV.yx * vec2(texShape[0], texShape[1]));\n int index = 4 * (resTexRC.x * texShape[1] + resTexRC.y);\n\n vec4 result = vec4(0.);\n\n for (int i=0; i<4; i++) {\n int flatIndex = index + i;\n ivec3 rc = outCoordsFromFlatIndex(flatIndex);\n result[i] = getA(rc.x, rc.y, rc.z);\n }\n\n ${t.output} = result;\n }\n `}};var jd=class{constructor(e){this.variableNames=[\"A\"],this.packedInputs=!0,this.packedOutput=!0,this.outPackingScheme=ki.DENSE,this.customUniforms=[{name:\"texShape\",type:\"ivec2\"}];let t=Ct();this.outputShape=e,this.enableShapeUniforms=lt(this.outputShape.length),this.userCode=`\n ivec3 outCoordsFromFlatIndex(int index) {\n ${this.enableShapeUniforms?Ru([\"r\",\"c\",\"d\"],e):is([\"r\",\"c\",\"d\"],e)}\n return ivec3(r, c, d);\n }\n\n void main() {\n ivec2 resTexRC = ivec2(resultUV.yx * vec2(texShape[0], texShape[1]));\n int index = 4 * (resTexRC.x * texShape[1] + resTexRC.y);\n\n vec4 result = vec4(0.);\n\n for (int i=0; i<4; i++) {\n int flatIndex = index + i;\n ivec3 rc = outCoordsFromFlatIndex(flatIndex);\n result[i] = getChannel(getA(rc.x, rc.y, rc.z), vec2(rc.y, rc.z));\n }\n\n ${t.output} = result;\n }\n `}};var Xd=class{constructor(e){this.variableNames=[\"A\"],this.outTexUsage=ir.DOWNLOAD;let t=Ct();this.outputShape=e,this.userCode=`\n ${Hd}\n\n void main() {\n float x = getAAtOutCoords();\n ${t.output} = encode_float(x);\n }\n `}};var Yd=class{constructor(e){this.variableNames=[\"A\"],this.packedInputs=!0,this.packedOutput=!1,this.outTexUsage=ir.DOWNLOAD;let t=Ct();this.outputShape=e,this.userCode=`\n ${Hd}\n\n void main() {\n ivec3 coords = getOutputCoords();\n float x = getChannel(getAAtOutCoords(), vec2(coords.y, coords.z));\n ${t.output} = encode_float(x);\n }\n `}};var tY={R:0,G:1,B:2,A:3},Al=class{constructor(e,t=!1,o=\"RGBA\"){this.variableNames=[\"A\"],this.customUniforms=[{name:\"texShape\",type:\"ivec2\"}];let n=Ct();this.outputShape=e,this.enableShapeUniforms=lt(this.outputShape.length);let s=\"result\";t&&(s=\"floor(result * 255. + 0.5)\");let a=\"\";for(let i=0;ihw,createBufferFromOutputTexture:()=>yw,createFloat16MatrixTexture:()=>lw,createFloat16PackedMatrixTexture:()=>dw,createFloat32MatrixTexture:()=>cw,createIndexBuffer:()=>pw,createPackedMatrixTexture:()=>fw,createUnsignedBytesMatrixTexture:()=>mw,createVertexBuffer:()=>uw,createVertexShader:()=>iw,downloadByteEncodedFloatMatrixFromOutputTexture:()=>Cw,downloadFloat32MatrixFromBuffer:()=>bw,downloadMatrixFromPackedOutputTexture:()=>ww,downloadPackedMatrixFromBuffer:()=>Iw,getInternalFormatForFloat16MatrixTexture:()=>Jd,getInternalFormatForFloat16PackedMatrixTexture:()=>rh,getInternalFormatForFloat32MatrixTexture:()=>Zd,getInternalFormatForPackedMatrixTexture:()=>th,getInternalFormatForUnsignedBytesMatrixTexture:()=>eh,uploadDenseMatrixToTexture:()=>gw,uploadPixelDataToTexture:()=>xw});function iw(r){let e=Ct(),t=`${e.version}\n precision highp float;\n ${e.attribute} vec3 clipSpacePos;\n ${e.attribute} vec2 uv;\n ${e.varyingVs} vec2 resultUV;\n\n void main() {\n gl_Position = vec4(clipSpacePos, 1);\n resultUV = uv;\n }`;return zI(r,t)}function uw(r){let e=new Float32Array([-1,1,0,0,1,-1,-1,0,0,0,1,1,0,1,1,1,-1,0,1,0]);return HI(r,e)}function pw(r){let e=new Uint16Array([0,1,2,2,1,3]);return qI(r,e)}function Fl(r,e,t,o,n,s){jI(e,t);let a=KI(r),i=r.TEXTURE_2D;return me(r,()=>r.bindTexture(i,a)),me(r,()=>r.texParameteri(i,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE)),me(r,()=>r.texParameteri(i,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE)),me(r,()=>r.texParameteri(i,r.TEXTURE_MIN_FILTER,r.NEAREST)),me(r,()=>r.texParameteri(i,r.TEXTURE_MAG_FILTER,r.NEAREST)),P().getNumber(\"WEBGL_VERSION\")===1?me(r,()=>r.texImage2D(i,0,o,e,t,0,n,s,null)):me(r,()=>r.texStorage2D(i,1,o,e,t)),me(r,()=>r.bindTexture(r.TEXTURE_2D,null)),{texture:a,texShape:[t,e]}}function Zd(r){return r.internalFormatFloat}function cw(r,e,t,o){let[n,s]=$u(e,t);return Fl(r,n,s,Zd(o),o.textureFormatFloat,r.FLOAT)}function Jd(r){return r.internalFormatHalfFloat}function lw(r,e,t,o){let[n,s]=$u(e,t);return Fl(r,n,s,Jd(o),o.textureFormatFloat,o.textureTypeHalfFloat)}function eh(r){return r.downloadTextureFormat}function mw(r,e,t,o){let[n,s]=$u(e,t);return Fl(r,n,s,eh(o),r.RGBA,r.UNSIGNED_BYTE)}function th(r){return r.internalFormatPackedFloat}function fw(r,e,t,o){let[n,s]=Ks(e,t);return Fl(r,n,s,th(o),r.RGBA,r.FLOAT)}function rh(r){return r.internalFormatPackedHalfFloat}function dw(r,e,t,o){let[n,s]=Ks(e,t);return Fl(r,n,s,rh(o),r.RGBA,o.textureTypeHalfFloat)}function hw(r,e,t){return me(r,()=>r.bindBuffer(r.ARRAY_BUFFER,t)),Wd(r,e,\"clipSpacePos\",t,3,20,0)&&Wd(r,e,\"uv\",t,2,20,12)}function gw(r,e,t,o,n,s){me(r,()=>r.bindTexture(r.TEXTURE_2D,e));let a,i,p;n instanceof Uint8Array?(a=new Uint8Array(t*o*4),i=r.UNSIGNED_BYTE,p=r.RGBA):(a=new Float32Array(t*o*4),i=r.FLOAT,p=s.internalFormatPackedFloat),a.set(n),P().getNumber(\"WEBGL_VERSION\")===2?me(r,()=>r.texSubImage2D(r.TEXTURE_2D,0,0,0,t,o,r.RGBA,i,a)):me(r,()=>r.texImage2D(r.TEXTURE_2D,0,p,t,o,0,r.RGBA,i,a)),me(r,()=>r.bindTexture(r.TEXTURE_2D,null))}function xw(r,e,t){me(r,()=>r.bindTexture(r.TEXTURE_2D,e)),t.data instanceof Uint8Array?P().getNumber(\"WEBGL_VERSION\")===2?me(r,()=>r.texSubImage2D(r.TEXTURE_2D,0,0,0,t.width,t.height,r.RGBA,r.UNSIGNED_BYTE,t.data)):me(r,()=>r.texImage2D(r.TEXTURE_2D,0,r.RGBA,t.width,t.height,0,r.RGBA,r.UNSIGNED_BYTE,t.data)):P().getNumber(\"WEBGL_VERSION\")===2?me(r,()=>r.texSubImage2D(r.TEXTURE_2D,0,0,0,r.RGBA,r.UNSIGNED_BYTE,t)):me(r,()=>r.texImage2D(r.TEXTURE_2D,0,r.RGBA,r.RGBA,r.UNSIGNED_BYTE,t)),me(r,()=>r.bindTexture(r.TEXTURE_2D,null))}function yw(r,e,t,o){let n=r.createBuffer();me(r,()=>r.bindBuffer(r.PIXEL_PACK_BUFFER,n));let i=4*4*e*t;return me(r,()=>r.bufferData(r.PIXEL_PACK_BUFFER,i,r.STREAM_READ)),me(r,()=>r.readPixels(0,0,t,e,r.RGBA,r.FLOAT,0)),me(r,()=>r.bindBuffer(r.PIXEL_PACK_BUFFER,null)),n}function bw(r,e,t){let o=r,n=new Float32Array(t);return o.bindBuffer(o.PIXEL_PACK_BUFFER,e),o.getBufferSubData(o.PIXEL_PACK_BUFFER,0,n),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),n}function Cw(r,e,t,o){let[n,s]=$u(e,t),a=4,i=new Uint8Array(GE(e*t,a));return me(r,()=>r.readPixels(0,0,n,s,o.downloadTextureFormat,r.UNSIGNED_BYTE,i)),new Float32Array(i.buffer)}function Iw(r,e,t,o,n,s,a,i){let p=r,u=new Float32Array(HE(s,a));return p.bindBuffer(p.PIXEL_PACK_BUFFER,e),p.getBufferSubData(p.PIXEL_PACK_BUFFER,0,u),p.bindBuffer(p.PIXEL_PACK_BUFFER,null),u}function ww(r,e,t){let o=new Float32Array(e*t*4);return me(r,()=>r.readPixels(0,0,t,e,r.RGBA,r.FLOAT,o)),o}var Fu=class{constructor(e){this.outputTexture=null,this.program=null,this.disposed=!1,this.vertexAttrsAreBound=!1,this.itemsToPoll=[];let t=P().getNumber(\"WEBGL_VERSION\");e!=null?(this.gl=e,MI(t,e)):this.gl=Gr(t);let o=\"WEBGL_color_buffer_float\",n=\"EXT_color_buffer_half_float\";if(this.parallelCompilationExtension=this.gl.getExtension(\"KHR_parallel_shader_compile\"),P().getNumber(\"WEBGL_VERSION\")===1){let s=\"OES_texture_float\",a=\"OES_texture_half_float\";if(this.textureFloatExtension=nc(this.gl,s),Hr(this.gl,a))this.textureHalfFloatExtension=nc(this.gl,a);else if(P().get(\"WEBGL_FORCE_F16_TEXTURES\"))throw new Error(\"GL context does not support half float textures, yet the environment flag WEBGL_FORCE_F16_TEXTURES is set to true.\");if(this.colorBufferFloatExtension=this.gl.getExtension(o),Hr(this.gl,n))this.colorBufferHalfFloatExtension=nc(this.gl,n);else if(P().get(\"WEBGL_FORCE_F16_TEXTURES\"))throw new Error(\"GL context does not support color renderable half floats, yet the environment flag WEBGL_FORCE_F16_TEXTURES is set to true.\")}else if(o=\"EXT_color_buffer_float\",Hr(this.gl,o))this.colorBufferFloatExtension=this.gl.getExtension(o);else if(Hr(this.gl,n))this.colorBufferHalfFloatExtension=this.gl.getExtension(n);else throw new Error(\"GL context does not support color renderable floats\");this.vertexBuffer=uw(this.gl),this.indexBuffer=pw(this.gl),this.framebuffer=XI(this.gl),this.textureConfig=El(this.gl,this.textureHalfFloatExtension)}get debug(){return P().getBool(\"DEBUG\")}dispose(){if(this.disposed)return;this.program!=null&&console.warn(\"Disposing a GPGPUContext that still has a bound WebGLProgram. This is probably a resource leak, delete the program with GPGPUContext.deleteProgram before disposing.\"),this.outputTexture!=null&&console.warn(\"Disposing a GPGPUContext that still has a bound output matrix texture. This is probably a resource leak, delete the output matrix texture with GPGPUContext.deleteMatrixTexture before disposing.\");let e=this.gl;me(e,()=>e.finish()),me(e,()=>e.bindFramebuffer(e.FRAMEBUFFER,null)),me(e,()=>e.deleteFramebuffer(this.framebuffer)),me(e,()=>e.bindBuffer(e.ARRAY_BUFFER,null)),me(e,()=>e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,null)),me(e,()=>e.deleteBuffer(this.indexBuffer)),this.disposed=!0}createFloat32MatrixTexture(e,t){return this.throwIfDisposed(),cw(this.gl,e,t,this.textureConfig)}createFloat16MatrixTexture(e,t){return this.throwIfDisposed(),lw(this.gl,e,t,this.textureConfig)}createUnsignedBytesMatrixTexture(e,t){return this.throwIfDisposed(),mw(this.gl,e,t,this.textureConfig)}uploadPixelDataToTexture(e,t){this.throwIfDisposed(),xw(this.gl,e,t)}uploadDenseMatrixToTexture(e,t,o,n){this.throwIfDisposed(),gw(this.gl,e,t,o,n,this.textureConfig)}createFloat16PackedMatrixTexture(e,t){return this.throwIfDisposed(),dw(this.gl,e,t,this.textureConfig)}createPackedMatrixTexture(e,t){return this.throwIfDisposed(),fw(this.gl,e,t,this.textureConfig)}deleteMatrixTexture(e){this.throwIfDisposed(),this.outputTexture===e&&(Ud(this.gl,this.framebuffer),this.outputTexture=null),me(this.gl,()=>this.gl.deleteTexture(e))}downloadByteEncodedFloatMatrixFromOutputTexture(e,t,o){return this.downloadMatrixDriver(e,()=>Cw(this.gl,t,o,this.textureConfig))}downloadPackedMatrixFromBuffer(e,t,o,n,s,a){return Iw(this.gl,e,t,o,n,s,a,this.textureConfig)}downloadFloat32MatrixFromBuffer(e,t){return bw(this.gl,e,t)}createBufferFromTexture(e,t,o){this.bindTextureToFrameBuffer(e);let n=yw(this.gl,t,o,this.textureConfig);return this.unbindTextureToFrameBuffer(),n}createAndWaitForFence(){let e=this.createFence(this.gl);return this.pollFence(e)}createFence(e){let t,o;if(P().getBool(\"WEBGL_FENCE_API_ENABLED\")){let n=e,s=n.fenceSync(n.SYNC_GPU_COMMANDS_COMPLETE,0);e.flush(),o=()=>{let a=n.clientWaitSync(s,0,0);return a===n.ALREADY_SIGNALED||a===n.CONDITION_SATISFIED},t=s}else P().getNumber(\"WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION\")>0?(t=this.beginQuery(),this.endQuery(),o=()=>this.isQueryAvailable(t,P().getNumber(\"WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION\"))):o=()=>!0;return{query:t,isFencePassed:o}}downloadMatrixFromPackedTexture(e,t,o){return this.downloadMatrixDriver(e,()=>ww(this.gl,t,o))}createProgram(e){this.throwIfDisposed();let t=this.gl;this.vertexShader==null&&(this.vertexShader=iw(t));let o=UI(t);return me(t,()=>t.attachShader(o,this.vertexShader)),me(t,()=>t.attachShader(o,e)),GI(t,o),this.debug&&$l(t,o),this.vertexAttrsAreBound||(this.setProgram(o),this.vertexAttrsAreBound=hw(t,this.program,this.vertexBuffer)),o}deleteProgram(e){this.throwIfDisposed(),e===this.program&&(this.program=null),e!=null&&me(this.gl,()=>this.gl.deleteProgram(e))}setProgram(e){this.throwIfDisposed(),this.program=e,this.program!=null&&this.debug&&$l(this.gl,this.program),me(this.gl,()=>this.gl.useProgram(e))}getUniformLocation(e,t,o=!0){return this.throwIfDisposed(),o?YI(this.gl,e,t):QI(this.gl,e,t)}getAttributeLocation(e,t){return this.throwIfDisposed(),me(this.gl,()=>this.gl.getAttribLocation(e,t))}getUniformLocationNoThrow(e,t){return this.throwIfDisposed(),this.gl.getUniformLocation(e,t)}setInputMatrixTexture(e,t,o){this.throwIfDisposed(),this.throwIfNoProgram(),ZI(this.gl,e,t,o)}setOutputMatrixTexture(e,t,o){this.setOutputMatrixTextureDriver(e,o,t)}setOutputPackedMatrixTexture(e,t,o){this.throwIfDisposed();let[n,s]=Ks(t,o);this.setOutputMatrixTextureDriver(e,n,s)}setOutputMatrixWriteRegion(e,t,o,n){this.setOutputMatrixWriteRegionDriver(o,e,n,t)}setOutputPackedMatrixWriteRegion(e,t,o,n){throw new Error(\"setOutputPackedMatrixWriteRegion not implemented.\")}debugValidate(){this.program!=null&&$l(this.gl,this.program),sc(this.gl)}executeProgram(){this.throwIfDisposed(),this.throwIfNoProgram();let e=this.gl;this.debug&&this.debugValidate(),me(e,()=>e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT,0))}blockUntilAllProgramsCompleted(){this.throwIfDisposed(),me(this.gl,()=>this.gl.finish())}getQueryTimerExtension(){return this.disjointQueryTimerExtension==null&&(this.disjointQueryTimerExtension=nc(this.gl,P().getNumber(\"WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION\")===2?\"EXT_disjoint_timer_query_webgl2\":\"EXT_disjoint_timer_query\")),this.disjointQueryTimerExtension}getQueryTimerExtensionWebGL2(){return this.getQueryTimerExtension()}getQueryTimerExtensionWebGL1(){return this.getQueryTimerExtension()}beginQuery(){if(P().getNumber(\"WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION\")===2){let o=this.gl,n=this.getQueryTimerExtensionWebGL2(),s=o.createQuery();return o.beginQuery(n.TIME_ELAPSED_EXT,s),s}let e=this.getQueryTimerExtensionWebGL1(),t=e.createQueryEXT();return e.beginQueryEXT(e.TIME_ELAPSED_EXT,t),t}endQuery(){if(P().getNumber(\"WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION\")===2){let t=this.gl,o=this.getQueryTimerExtensionWebGL2();t.endQuery(o.TIME_ELAPSED_EXT);return}let e=this.getQueryTimerExtensionWebGL1();e.endQueryEXT(e.TIME_ELAPSED_EXT)}async waitForQueryAndGetTime(e){return await x.repeatedTry(()=>this.disposed||this.isQueryAvailable(e,P().getNumber(\"WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION\"))),this.getQueryTime(e,P().getNumber(\"WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION\"))}getQueryTime(e,t){if(t===0)return null;if(t===2){let o=this.gl;return o.getQueryParameter(e,o.QUERY_RESULT)/1e6}else{let o=this.getQueryTimerExtensionWebGL1();return o.getQueryObjectEXT(e,o.QUERY_RESULT_EXT)/1e6}}isQueryAvailable(e,t){if(t===0)return!0;if(t===2){let o=this.gl,n=this.getQueryTimerExtensionWebGL2(),s=o.getQueryParameter(e,o.QUERY_RESULT_AVAILABLE);return this.disjoint==null&&(this.disjoint=this.gl.getParameter(n.GPU_DISJOINT_EXT)),s&&!this.disjoint}else{let o=this.getQueryTimerExtensionWebGL1(),n=o.getQueryObjectEXT(e,o.QUERY_RESULT_AVAILABLE_EXT);return this.disjoint==null&&(this.disjoint=this.gl.getParameter(o.GPU_DISJOINT_EXT)),n&&!this.disjoint}}pollFence(e){return new Promise(t=>{this.addItemToPoll(()=>e.isFencePassed(),()=>t())})}pollItems(){let e=rY(this.itemsToPoll.map(t=>t.isDoneFn));for(let t=0;t<=e;++t){let{resolveFn:o}=this.itemsToPoll[t];o()}this.itemsToPoll=this.itemsToPoll.slice(e+1)}addItemToPoll(e,t){if(this.itemsToPoll.push({isDoneFn:e,resolveFn:t}),this.itemsToPoll.length>1)return;let o;\"setTimeoutCustom\"in P().platform&&(o=P().platform.setTimeoutCustom.bind(P().platform)),x.repeatedTry(()=>(this.pollItems(),this.itemsToPoll.length===0),()=>0,null,o)}bindTextureToFrameBuffer(e){this.throwIfDisposed(),Rl(this.gl,e,this.framebuffer),this.debug&&sc(this.gl)}unbindTextureToFrameBuffer(){this.outputTexture!=null?(Rl(this.gl,this.outputTexture,this.framebuffer),this.debug&&sc(this.gl)):Ud(this.gl,this.framebuffer)}downloadMatrixDriver(e,t){this.bindTextureToFrameBuffer(e);let o=t();return this.unbindTextureToFrameBuffer(),o}setOutputMatrixTextureDriver(e,t,o){this.throwIfDisposed();let n=this.gl;Rl(n,e,this.framebuffer),this.debug&&sc(n),this.outputTexture=e,me(n,()=>n.viewport(0,0,t,o)),me(n,()=>n.scissor(0,0,t,o))}setOutputMatrixWriteRegionDriver(e,t,o,n){this.throwIfDisposed(),me(this.gl,()=>this.gl.scissor(e,t,o,n))}throwIfDisposed(){if(this.disposed)throw new Error(\"Attempted to use disposed GPGPUContext.\")}throwIfNoProgram(){if(this.program==null)throw new Error(\"No GPU program is currently set.\")}};function rY(r){let e=0;for(;e`${r}.${t}`)}function $t(r,e){return e===1?[r]:vw(r,e)}function j$(r,e){if(r===1)return\"rc\";let t=\"\";for(let o=0;o ${this.enableShapeUniforms?\"outShape\":this.outputShape[0]}`;let t=\"\";for(let o=this.rank-2;o= ${this.enableShapeUniforms?`outShape[${o}]`:this.outputShape[o]}`,o= ${o};\n bool rEdge = rp1 >= ${n};\n `}getOutput(e){let t=this.getSourceCoordsArr(e);return this.rank===1?`getA(rc), (rc + 1 >= ${this.enableShapeUniforms?\"outShape\":this.outputShape[0]} ? 0. : getA(rc + 1)), 0, 0`:`getA(${t[0]}),\n cEdge ? 0. : getA(${t[1]}),\n rEdge ? 0. : getA(${t[2]}),\n rEdge || cEdge ? 0. : getA(${t[3]})`}};var hc=class{constructor(e,t){this.variableNames=[\"A\"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:\"inputShape\",type:\"ivec3\"}],this.outputShape=e,this.enableShapeUniforms=lt(this.outputShape.length);let o=\"\";for(let n=0;n<4;n++){let s=\"thisRC = rc;\";n%2===1&&(s+=\"thisRC.z += 1;\"),n>1&&(s+=\"thisRC.y += 1;\"),o+=`\n ${s}\n ${n>0?\"if(thisRC.y < rows && thisRC.z < cols){\":\"\"}\n int flatIndex = getFlatIndex(thisRC);\n\n ivec3 inputRC = inputCoordsFromReshapedOutCoords(flatIndex);\n vec2 inputRCInnerDims = vec2(float(inputRC.y),float(inputRC.z));\n\n result[${n}] =\n getChannel(getA(inputRC.x, inputRC.y, inputRC.z), inputRCInnerDims);\n ${n>0?\"}\":\"\"}\n `}this.userCode=`\n ${oY(t,this.enableShapeUniforms)}\n ${this.enableShapeUniforms?pc():uc(e)}\n\n void main() {\n ivec3 rc = getOutputCoords();\n\n vec4 result = vec4(0.);\n\n ivec3 thisRC;\n int rows = ${this.enableShapeUniforms?\"outShape[1]\":e[1]};\n int cols = ${this.enableShapeUniforms?\"outShape[2]\":e[2]};\n\n ${o}\n\n setOutput(result);\n }\n `}};function oY(r,e){return`\n ivec3 inputCoordsFromReshapedOutCoords(int index) {\n ${e?YE([\"r\",\"c\",\"d\"],\"inputShape\"):is([\"r\",\"c\",\"d\"],r)}\n return ivec3(r, c, d);\n }\n `}var ih=class{constructor(e){this.gpgpu=e,this.numUsedTextures=0,this.numFreeTextures=0,this._numBytesAllocated=0,this._numBytesFree=0,this.freeTextures={},this.logEnabled=!1,this.usedTextures={}}acquireTexture(e,t,o){let n=Y$(t,o),s=Q$(e,n,o);s in this.freeTextures||(this.freeTextures[s]=[]),s in this.usedTextures||(this.usedTextures[s]=[]);let a=X$(e,n,this.gpgpu.gl,this.gpgpu.textureConfig,o);if(this.freeTextures[s].length>0){this.numFreeTextures--,this.numUsedTextures++,this._numBytesFree-=a,this.log();let p=this.freeTextures[s].shift();return this.usedTextures[s].push(p),p}let i;return n===Jt.PACKED_2X2_FLOAT32?i=this.gpgpu.createPackedMatrixTexture(e[0],e[1]):n===Jt.PACKED_2X2_FLOAT16?i=this.gpgpu.createFloat16PackedMatrixTexture(e[0],e[1]):n===Jt.UNPACKED_FLOAT32?i=this.gpgpu.createFloat32MatrixTexture(e[0],e[1]):n===Jt.UNPACKED_FLOAT16?i=this.gpgpu.createFloat16MatrixTexture(e[0],e[1]):n===Jt.PACKED_4X1_UNSIGNED_BYTE&&(i=this.gpgpu.createUnsignedBytesMatrixTexture(e[0],e[1])),this.usedTextures[s].push(i),this.numUsedTextures++,this._numBytesAllocated+=a,this.log(),i}releaseTexture(e,t,o,n){if(this.freeTextures==null)return;let s=Y$(o,n),a=Q$(t,s,n);a in this.freeTextures||(this.freeTextures[a]=[]);let i=X$(t,s,this.gpgpu.gl,this.gpgpu.textureConfig,n),p=P().get(\"WEBGL_DELETE_TEXTURE_THRESHOLD\");p!==-1&&this._numBytesAllocated>p?(this.gpgpu.deleteMatrixTexture(e.texture),this._numBytesAllocated-=i):(this.freeTextures[a].push(e),this.numFreeTextures++,this._numBytesFree+=i),this.numUsedTextures--;let u=this.usedTextures[a],c=u.indexOf(e);if(c<0)throw new Error(\"Cannot release a texture that was never provided by this texture manager\");u.splice(c,1),this.log()}log(){if(!this.logEnabled)return;let e=this.numFreeTextures+this.numUsedTextures;console.log(\"Free/Used\",`${this.numFreeTextures} / ${this.numUsedTextures}`,`(${e})`);let t=this._numBytesFree/this._numBytesAllocated;console.log(`Bytes allocated: ${this._numBytesAllocated}`),console.log(`Bytes unused: ${this._numBytesFree} (${Math.round(100*t)}%)`)}get numBytesAllocated(){return this._numBytesAllocated}get numBytesFree(){return this._numBytesFree}getNumUsedTextures(){return this.numUsedTextures}getNumFreeTextures(){return this.numFreeTextures}dispose(){if(this.freeTextures!=null){for(let e in this.freeTextures)this.freeTextures[e].forEach(t=>{this.gpgpu.deleteMatrixTexture(t.texture)});for(let e in this.usedTextures)this.usedTextures[e].forEach(t=>{this.gpgpu.deleteMatrixTexture(t.texture)});this.freeTextures=null,this.usedTextures=null,this.numUsedTextures=0,this.numFreeTextures=0,this._numBytesAllocated=0,this._numBytesFree=0}}};function nY(r,e){let t=r;if(e===t.R32F)return 4;if(e===t.R16F)return 2;if(e===t.RGBA32F)return 16;if(e===r.RGBA)return 16;if(e===t.RGBA16F)return 8;if(e===t.RGBA8)return 4;throw new Error(`Unknown internal format ${e}`)}function X$(r,e,t,o,n){let s=sY(e,o),a;if(n){let[p,u]=Ks(r[0],r[1]);a=p*u}else{let[p,u]=$u(r[0],r[1]);a=p*u}let i=nY(t,s);return a*i}function sY(r,e){switch(r){case Jt.PACKED_2X2_FLOAT32:return th(e);case Jt.PACKED_2X2_FLOAT16:return rh(e);case Jt.UNPACKED_FLOAT32:return Zd(e);case Jt.UNPACKED_FLOAT16:return Jd(e);case Jt.PACKED_4X1_UNSIGNED_BYTE:return eh(e);default:throw new Error(`Unknown physical texture type ${r}`)}}function aY(r){return P().getBool(\"WEBGL_RENDER_FLOAT32_ENABLED\")?r?Jt.PACKED_2X2_FLOAT32:Jt.UNPACKED_FLOAT32:r?Jt.PACKED_2X2_FLOAT16:Jt.UNPACKED_FLOAT16}function Y$(r,e){if(r===ir.UPLOAD)return Jt.PACKED_2X2_FLOAT32;if(r===ir.RENDER||r==null)return aY(e);if(r===ir.DOWNLOAD||r===ir.PIXELS)return Jt.PACKED_4X1_UNSIGNED_BYTE;throw new Error(`Unknown logical texture type ${r}`)}function Q$(r,e,t){return`${r[0]}_${r[1]}_${e}_${t}`}var fr=class{constructor(e,t){this.variableNames=[\"A\"],this.outputShape=e,this.enableShapeUniforms=lt(this.outputShape.length),this.userCode=`\n float unaryOperation(float x) {\n ${t}\n }\n\n void main() {\n float x = getAAtOutCoords();\n float y = unaryOperation(x);\n\n setOutput(y);\n }\n `}},Vt=\"if (isnan(x)) return x;\",Z$=\"return x;\",kw=\"return abs(x);\";var J$=\"return (x >= 0.0) ? x : (exp(x) - 1.0);\",eR=Vt+`\n return (x < 0.0) ? 0.0 : x;\n`,tR=Vt+`\n return (x < 0.0) ? 0.0 : min(6.0, x);\n`,Pu=\"return x;\",rR=\"return 1.0 / (1.0 + exp(-1.0 * x));\";var nR=\"return x;\",sR=`\n vec4 result;\n\n result.r = (x.r >= 0.0) ? x.r : (exp(x.r) - 1.0);\n result.g = (x.g >= 0.0) ? x.g : (exp(x.g) - 1.0);\n result.b = (x.b >= 0.0) ? x.b : (exp(x.b) - 1.0);\n result.a = (x.a >= 0.0) ? x.a : (exp(x.a) - 1.0);\n\n return result;\n`,aR=`\n vec4 result = x * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n`,iR=`\n vec4 result = min(x, vec4(6.)) * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n`,uR=\"return 1.0 / (1.0 + exp(-1.0 * x));\",No=class{constructor(e,t){this.variableNames=[\"A\"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e,this.enableShapeUniforms=lt(this.outputShape.length),this.userCode=`\n vec4 unaryOperation(vec4 x) {\n ${t}\n }\n\n void main() {\n vec4 x = getAAtOutCoords();\n vec4 y = unaryOperation(x);\n\n setOutput(y);\n }\n `}};var uh=class{constructor(e){this.variableNames=[\"A\"],this.packedInputs=!0,this.packedOutput=!1,this.outputShape=e,this.enableShapeUniforms=lt(this.outputShape.length);let t=e.length,o=$t(\"rc\",t),n=_e(t),s=j$(t,o),a=o.slice(-2),i=t<=1?\"rc\":`vec2(${a.join(\",\")})`;this.userCode=`\n void main() {\n ${n} rc = getOutputCoords();\n vec4 packedInput = getA(${s});\n\n setOutput(getChannel(packedInput, ${i}));\n }\n `}};var uY=Bt.whereImpl,pY=1e-7,cY=1e-4,ph={};function lY(r){return r in ph||(ph[r]={}),ph[r]}var mY=P().getNumber(\"CPU_HANDOFF_SIZE_THRESHOLD\"),fY=600;function dY(){return P().global.screen==null?1024:P().global.screen.height*P().global.screen.width*window.devicePixelRatio*fY/1024/1024}var Ni=class extends Jr{constructor(e){if(super(),this.pendingRead=new WeakMap,this.pendingDisposal=new WeakSet,this.dataRefCount=new WeakMap,this.numBytesInGPU=0,this.uploadWaitMs=0,this.downloadWaitMs=0,this.lastGlFlushTime=0,this.warnedAboutMemory=!1,this.pendingDeletes=0,this.disposed=!1,!P().getBool(\"HAS_WEBGL\"))throw new Error(\"WebGL is not supported on this device\");let t;if(e!=null){if(e instanceof Fu)t=e;else{let o=Gr(P().getNumber(\"WEBGL_VERSION\"),e);t=new Fu(o)}this.binaryCache={},this.gpgpuCreatedLocally=!1}else{let o=Gr(P().getNumber(\"WEBGL_VERSION\"));t=new Fu(o),this.binaryCache=lY(P().getNumber(\"WEBGL_VERSION\")),this.gpgpuCreatedLocally=!0}this.gpgpu=t,this.canvas=this.gpgpu.gl.canvas,this.textureManager=new ih(this.gpgpu),this.numMBBeforeWarning=dY(),this.texData=new rn(this,cr())}nextDataId(){return Ni.nextDataId++}numDataIds(){return this.texData.numDataIds()-this.pendingDeletes}writeTexture(e,t,o,n,s,a){let i=this.makeTensorInfo(t,o),p=this.texData.get(i.dataId);p.isPacked=!1,p.texture={texture:e,texShape:[n,s]},p.texShape=[n,s];let u=ac(t),c=new Al(u,!1,a),l=this.runWebGLProgram(c,[i],o,[[n,s]]);return l.shape=t,p.texture=null,this.disposeIntermediateTensorInfo(i),l.dataId}write(e,t,o){if((P().getBool(\"WEBGL_CHECK_NUMERICAL_PROBLEMS\")||P().getBool(\"DEBUG\"))&&this.checkNumericalProblems(e),o===\"complex64\"&&e!=null)throw new Error(\"Cannot write to a complex64 dtype. Please use tf.complex(real, imag).\");let n={id:this.nextDataId()};return this.texData.set(n,{shape:t,dtype:o,values:e,usage:ir.UPLOAD,refCount:1}),n}refCount(e){return this.texData.has(e)?this.texData.get(e).refCount:0}incRef(e){let t=this.texData.get(e);t.refCount++}decRef(e){if(this.texData.has(e)){let t=this.texData.get(e);t.refCount--}}move(e,t,o,n,s){if(P().getBool(\"DEBUG\")&&this.checkNumericalProblems(t),n===\"complex64\")throw new Error(\"Cannot write to a complex64 dtype. Please use tf.complex(real, imag).\");this.texData.set(e,{shape:o,dtype:n,values:t,usage:ir.UPLOAD,refCount:s})}disposeIntermediateTensorInfo(e){this.disposeData(e.dataId)}readSync(e){let t=this.texData.get(e),{values:o,dtype:n,complexTensorInfos:s,slice:a,shape:i,isPacked:p}=t;if(a!=null){let m;p?m=new No(i,Pu):m=new fr(i,Pu);let f=this.runWebGLProgram(m,[{dataId:e,shape:i,dtype:n}],n),d=this.readSync(f.dataId);return this.disposeIntermediateTensorInfo(f),d}if(o!=null)return this.convertAndCacheOnCPU(e);if(n===\"string\")return o;let u=this.activeTimers!=null,c;u&&(c=x.now());let l;if(n===\"complex64\"){let m=this.readSync(s.real.dataId),f=this.readSync(s.imag.dataId);l=I.mergeRealAndImagArrays(m,f)}else l=this.getValuesFromTexture(e);return u&&(this.downloadWaitMs+=x.now()-c),this.convertAndCacheOnCPU(e,l)}async read(e){if(this.pendingRead.has(e)){let d=this.pendingRead.get(e);return new Promise(h=>d.push(h))}let t=this.texData.get(e),{values:o,shape:n,slice:s,dtype:a,complexTensorInfos:i,isPacked:p}=t;if(s!=null){let d;p?d=new No(n,Pu):d=new fr(n,Pu);let h=this.runWebGLProgram(d,[{dataId:e,shape:n,dtype:a}],a),g=this.read(h.dataId);return this.disposeIntermediateTensorInfo(h),g}if(o!=null)return this.convertAndCacheOnCPU(e);if(P().getBool(\"DEBUG\")&&!P().getBool(\"WEBGL_DOWNLOAD_FLOAT_ENABLED\")&&P().getNumber(\"WEBGL_VERSION\")===2)throw new Error(\"tensor.data() with WEBGL_DOWNLOAD_FLOAT_ENABLED=false and WEBGL_VERSION=2 not yet supported.\");let u=null,c;if(a!==\"complex64\"&&P().get(\"WEBGL_BUFFER_SUPPORTED\")){c=this.decode(e);let d=this.texData.get(c.dataId);u=this.gpgpu.createBufferFromTexture(d.texture.texture,..._l(n))}this.pendingRead.set(e,[]),a!==\"complex64\"&&await this.gpgpu.createAndWaitForFence();let l;if(a===\"complex64\"){let d=await Promise.all([this.read(i.real.dataId),this.read(i.imag.dataId)]),h=d[0],g=d[1];l=I.mergeRealAndImagArrays(h,g)}else if(u==null)l=this.getValuesFromTexture(e);else{let d=x.sizeFromShape(n);l=this.gpgpu.downloadFloat32MatrixFromBuffer(u,d)}if(c!=null&&this.disposeIntermediateTensorInfo(c),u!=null){let d=this.gpgpu.gl;me(d,()=>d.deleteBuffer(u))}let m=this.convertAndCacheOnCPU(e,l),f=this.pendingRead.get(e);return this.pendingRead.delete(e),f.forEach(d=>d(m)),this.pendingDisposal.has(e)&&(this.pendingDisposal.delete(e),this.disposeData(e)&&cr().removeDataId(e,this),this.pendingDeletes--),m}readToGPU(e,t={}){let o=this.texData.get(e),{values:n,shape:s,slice:a,dtype:i,isPacked:p,texture:u}=o;if(i===\"complex64\")throw new Error(\"Does not support reading texture for complex64 dtype.\");if(a!=null){let f;p?f=new No(s,Pu):f=new fr(s,Pu);let d=this.runWebGLProgram(f,[{dataId:e,shape:s,dtype:i}],i),h=this.readToGPU(d,t);return this.disposeIntermediateTensorInfo(d),h}if(u==null)throw n!=null?new Error(\"Data is not on GPU but on CPU.\"):new Error(\"There is no data on GPU or CPU.\");let c=this.decode(e,t.customTexShape),l=cr().makeTensorFromTensorInfo(c),m=this.texData.get(c.dataId);return Object.assign({tensorRef:l},m.texture)}bufferSync(e){let t=this.readSync(e.dataId);if(e.dtype===\"string\")try{let o=t.map(n=>x.decodeString(n));return ne(e.shape,e.dtype,o)}catch(o){throw new Error(\"Failed to decode encoded string bytes into utf-8\")}return ne(e.shape,e.dtype,t)}checkNumericalProblems(e){if(e!=null)for(let t=0;t0}time(e){let t=this.activeTimers,o=[],n=!1;this.programTimersStack==null?(this.programTimersStack=o,n=!0):this.activeTimers.push(o),this.activeTimers=o,e();let s=x.flatten(this.activeTimers.map(p=>p.query)).filter(p=>p!=null),a=x.flatten(this.activeTimers.map(p=>p.name)).filter(p=>p!=null);this.activeTimers=t,n&&(this.programTimersStack=null);let i={uploadWaitMs:this.uploadWaitMs,downloadWaitMs:this.downloadWaitMs,kernelMs:null,wallMs:null};return(async()=>{if(P().getNumber(\"WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE\")>0){let p=await Promise.all(s);i.kernelMs=x.sum(p),i.getExtraProfileInfo=()=>p.map((u,c)=>({name:a[c],ms:u})).map(u=>`${u.name}: ${u.ms}`).join(\", \")}else i.kernelMs={error:\"WebGL query timers are not supported in this environment.\"};return this.uploadWaitMs=0,this.downloadWaitMs=0,i})()}memory(){return{unreliable:!1,numBytesInGPU:this.numBytesInGPU,numBytesInGPUAllocated:this.textureManager.numBytesAllocated,numBytesInGPUFree:this.textureManager.numBytesFree}}startTimer(){return P().getNumber(\"WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE\")>0?this.gpgpu.beginQuery():{startMs:x.now(),endMs:null}}endTimer(e){return P().getNumber(\"WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE\")>0?(this.gpgpu.endQuery(),e):(e.endMs=x.now(),e)}async getQueryTime(e){if(P().getNumber(\"WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE\")>0)return this.gpgpu.waitForQueryAndGetTime(e);let t=e;return t.endMs-t.startMs}disposeData(e,t=!1){if(this.pendingDisposal.has(e))return!1;if(!this.texData.has(e))return!0;if(t?this.texData.get(e).refCount=0:this.texData.get(e).refCount--,!t&&this.texData.get(e).refCount>0)return!1;if(this.pendingRead.has(e))return this.pendingDisposal.add(e),this.pendingDeletes++,!1;this.releaseGPUData(e);let{complexTensorInfos:o}=this.texData.get(e);return o!=null&&(this.disposeData(o.real.dataId,t),this.disposeData(o.imag.dataId,t)),this.texData.delete(e),!0}releaseGPUData(e){let{texture:t,dtype:o,texShape:n,usage:s,isPacked:a,slice:i}=this.texData.get(e),p=i&&i.origDataId||e,u=this.dataRefCount.get(p);u>1?this.dataRefCount.set(p,u-1):(this.dataRefCount.delete(p),t!=null&&(this.numBytesInGPU-=this.computeBytes(n,o),this.textureManager.releaseTexture(t,n,s,a)));let c=this.texData.get(e);c.texture=null,c.texShape=null,c.isPacked=!1,c.slice=null}getTexture(e){return this.uploadToGPU(e),this.texData.get(e).texture.texture}getDataInfo(e){return this.texData.get(e)}shouldExecuteOnCPU(e,t=mY){return P().getBool(\"WEBGL_CPU_FORWARD\")&&e.every(o=>this.texData.get(o.dataId).texture==null&&x.sizeFromShape(o.shape)0&&x.isString(o[0])){let s=o.map(a=>x.encodeString(a));n=this.write(s,e,t)}else n=this.write(o,e,t);return this.texData.get(n).usage=null,{dataId:n,shape:e,dtype:t}}makeOutput(e,t,o){return cr().makeTensorFromTensorInfo(this.makeTensorInfo(e,t,o),this)}unpackTensor(e){let t=new uh(e.shape);return this.runWebGLProgram(t,[e],e.dtype)}packTensor(e){let t=new ah(e.shape),o=!0;return this.runWebGLProgram(t,[e],e.dtype,null,o)}packedReshape(e,t){let o=[Pa(e.shape),...Oa(e.shape)],n={dtype:e.dtype,shape:o,dataId:e.dataId},s=[Pa(t),...Oa(t)],a=new hc(s,o),i=!0,p=[o],u=this.runWebGLProgram(a,[n],e.dtype,p,i);return{dataId:u.dataId,shape:t,dtype:u.dtype}}decode(e,t){let o=this.texData.get(e),{isPacked:n,shape:s,dtype:a}=o;if(t!=null){let m=x.sizeFromShape(s),f=t[0]*t[1]*4;x.assert(m<=f,()=>\"customTexShape is too small. Row * Column * 4 should be equal or larger than the size of the tensor data.\")}let i=ac(s),p;n?p=new jd(i):p=new Kd(i);let u=!0,c=[t!=null?t:_l(i)],l=this.runWebGLProgram(p,[{shape:i,dtype:a,dataId:e}],a,c,u,t);return{dtype:a,shape:s,dataId:l.dataId}}runWebGLProgram(e,t,o,n,s=!1,a){let i=this.makeTensorInfo(e.outputShape,o),p=this.texData.get(i.dataId);if(e.packedOutput&&(p.isPacked=!0),e.outPackingScheme===ki.DENSE){let y=a!=null?a:_l(e.outputShape);p.texShape=y.map(b=>b*2)}if(e.outTexUsage!=null&&(p.usage=e.outTexUsage),x.sizeFromShape(i.shape)===0)return p.values=x.getTypedArrayFromDType(i.dtype,0),i;let u=[],c=t.map(y=>{if(y.dtype===\"complex64\")throw new Error(\"GPGPUProgram does not support complex64 input. For complex64 dtypes, please separate the program into real and imaginary parts.\");let b=this.texData.get(y.dataId);if(b.texture==null){if(!e.packedInputs&&x.sizeFromShape(y.shape)<=P().getNumber(\"WEBGL_SIZE_UPLOAD_UNIFORM\"))return{shape:y.shape,texData:null,isUniform:!0,uniformValues:b.values};e.packedInputs&&(b.isPacked=!0,b.shape=y.shape)}if(this.uploadToGPU(y.dataId),!!b.isPacked!=!!e.packedInputs)y=b.isPacked?this.unpackTensor(y):this.packTensor(y),u.push(y),b=this.texData.get(y.dataId);else if(b.isPacked&&!Ti(b.shape,y.shape)){let C=y,w=y.shape;y.shape=b.shape,y=this.packedReshape(y,w),u.push(y),b=this.texData.get(y.dataId),C.shape=w}return{shape:y.shape,texData:b,isUniform:!1}});this.uploadToGPU(i.dataId);let l={shape:i.shape,texData:p,isUniform:!1},m=n$(e,c,l),f=this.getAndSaveBinary(m,()=>r$(this.gpgpu,e,c,l)),d=this.activeTimers!=null,h;d&&(h=this.startTimer()),P().get(\"ENGINE_COMPILE_ONLY\")||o$(this.gpgpu,f,c,l,n),u.forEach(y=>this.disposeIntermediateTensorInfo(y)),d&&(h=this.endTimer(h),this.activeTimers.push({name:e.constructor.name,query:this.getQueryTime(h)}));let g=P().get(\"WEBGL_FLUSH_THRESHOLD\");if(g>0){let y=x.now();y-this.lastGlFlushTime>g&&(this.gpgpu.gl.flush(),this.lastGlFlushTime=y)}if(!P().getBool(\"WEBGL_LAZILY_UNPACK\")&&p.isPacked&&s===!1){let y=this.unpackTensor(i);return this.disposeIntermediateTensorInfo(i),y}return i}compileAndRun(e,t,o,n,s=!1){return o=o||t[0].dtype,this.runWebGLProgram(e,t,o,n,s)}getAndSaveBinary(e,t){return e in this.binaryCache||(this.binaryCache[e]=t()),this.binaryCache[e]}getTextureManager(){return this.textureManager}dispose(){this.disposed||(P().getBool(\"IS_TEST\")||Object.keys(this.binaryCache).forEach(t=>{this.gpgpu.deleteProgram(this.binaryCache[t].webGLProgram),delete this.binaryCache[t]}),this.textureManager.dispose(),this.canvas!=null&&typeof HTMLCanvasElement!=\"undefined\"&&this.canvas instanceof HTMLCanvasElement?this.canvas.remove():this.canvas=null,this.gpgpuCreatedLocally&&(this.gpgpu.program=null,this.gpgpu.dispose()),this.disposed=!0)}floatPrecision(){return this.floatPrecisionValue==null&&(this.floatPrecisionValue=Ne(()=>{if(!P().get(\"WEBGL_RENDER_FLOAT32_ENABLED\")){let e=P().getBool(\"DEBUG\");P().set(\"DEBUG\",!1);let t=this.abs(be(1e-8)).dataSync()[0];if(P().set(\"DEBUG\",e),t>0)return 32}return 16})),this.floatPrecisionValue}epsilon(){return this.floatPrecision()===32?pY:cY}uploadToGPU(e){let t=this.texData.get(e),{shape:o,dtype:n,values:s,texture:a,usage:i,isPacked:p}=t;if(a!=null)return;let u=this.activeTimers!=null,c;u&&(c=x.now());let l=t.texShape;if(l==null&&(l=JI(o,p),t.texShape=l),s!=null){let m=ac(o),f,d=l[1],h=l[0],g=s instanceof Uint8Array||s instanceof Uint8ClampedArray;(p||!g)&&([d,h]=Ks(l[0],l[1])),p?f=new Qd(m,g):f=new Al(m,g);let y=g?[h,d]:l,b=this.makeTensorInfo(y,n),C=this.texData.get(b.dataId);g?C.usage=ir.PIXELS:C.usage=ir.UPLOAD,C.texShape=y,this.gpgpu.uploadDenseMatrixToTexture(this.getTexture(b.dataId),d,h,s);let w=[[h,d]],k=!0,_=this.runWebGLProgram(f,[b],n,w,k),E=this.texData.get(_.dataId);t.texShape=E.texShape,t.isPacked=E.isPacked,t.usage=E.usage,P().get(\"ENGINE_COMPILE_ONLY\")?this.disposeData(_.dataId):(t.texture=E.texture,t.values=null,this.texData.delete(_.dataId)),this.disposeIntermediateTensorInfo(b),u&&(this.uploadWaitMs+=x.now()-c)}else{let m=this.acquireTexture(l,i,n,p);t.texture=m}}convertAndCacheOnCPU(e,t){let o=this.texData.get(e),{dtype:n}=o;return this.releaseGPUData(e),t!=null&&(o.values=hY(t,n)),o.values}acquireTexture(e,t,o,n){if(this.numBytesInGPU+=this.computeBytes(e,o),!this.warnedAboutMemory&&this.numBytesInGPU>this.numMBBeforeWarning*1024*1024){let s=(this.numBytesInGPU/1024/1024).toFixed(2);this.warnedAboutMemory=!0,console.warn(`High memory usage in GPU: ${s} MB, most likely due to a memory leak`)}return this.textureManager.acquireTexture(e,t,n)}computeBytes(e,t){return e[0]*e[1]*x.bytesPerElement(t)}checkCompileCompletion(){for(let[,e]of Object.entries(this.binaryCache))this.checkCompletion_(e)}async checkCompileCompletionAsync(){let e=[];if(this.gpgpu.parallelCompilationExtension){for(let[,t]of Object.entries(this.binaryCache))e.push(this.checkCompletionAsync_(t));return Promise.all(e)}else{for(let[,t]of Object.entries(this.binaryCache)){let o=new Promise(n=>{try{this.checkCompletion_(t),n(!0)}catch(s){throw s}});e.push(o)}return Promise.all(e)}}async checkCompletionAsync_(e){return this.gpgpu.gl.getProgramParameter(e.webGLProgram,this.gpgpu.parallelCompilationExtension.COMPLETION_STATUS_KHR)?this.checkCompletion_(e):(await kC(),this.checkCompletionAsync_(e))}checkCompletion_(e){if(this.gpgpu.gl.getProgramParameter(e.webGLProgram,this.gpgpu.gl.LINK_STATUS)===!1)throw console.log(this.gpgpu.gl.getProgramInfoLog(e.webGLProgram)),this.gpgpu.gl.getShaderParameter(e.fragmentShader,this.gpgpu.gl.COMPILE_STATUS)===!1?(zd(e.source,this.gpgpu.gl.getShaderInfoLog(e.fragmentShader)),new Error(\"Failed to compile fragment shader.\")):new Error(\"Failed to link vertex and fragment shaders.\");return!0}getUniformLocations(){for(let[,e]of Object.entries(this.binaryCache)){let{uniformLocations:t,customUniformLocations:o,infLoc:n,nanLoc:s,inShapesLocations:a,inTexShapesLocations:i,outShapeLocation:p,outShapeStridesLocation:u,outTexShapeLocation:c}=aw(this.gpgpu,e.program,e.webGLProgram);e.uniformLocations=t,e.customUniformLocations=o,e.infLoc=n,e.nanLoc=s,e.inShapesLocations=a,e.inTexShapesLocations=i,e.outShapeLocation=p,e.outShapeStridesLocation=u,e.outTexShapeLocation=c}}createTensorFromTexture(e,t,o){let{texture:n,height:s,width:a,channels:i}=e,p=cr().backend;if(!p.gpgpu.gl.isTexture(n))throw new Error(\"The texture is invalid. Also, please make sure the texture and the TFJS WebGL backend are using the same canvas. If you want to use your own custom canvas, you have to create and use the custom TFJS WebGL backend created from the canvas through 'new tf.MathBackendWebGL(customCanvas)'.\");let u=p.writeTexture(n,t,o,s,a,i);return cr().makeTensorFromDataId(u,t,o,p)}};Ni.nextDataId=0;function hY(r,e){if(e===\"float32\"||e===\"complex64\")return r;if(e===\"int32\"||e===\"bool\"){let t=e===\"int32\"?new Int32Array(r.length):new Uint8Array(r.length);for(let o=0;onew Ni,2);var R9e={forceHalfFloat:pR};var gc=`\n if (isnan(a)) return a;\n if (isnan(b)) return b;\n`;var _o=class{constructor(e,t,o){this.variableNames=[\"A\",\"B\"],this.outputShape=I.assertAndGetBroadcastShape(t,o),this.enableShapeUniforms=lt(this.outputShape.length),this.userCode=`\n float binaryOperation(float a, float b) {\n ${e}\n }\n\n void main() {\n float a = getAAtOutCoords();\n float b = getBAtOutCoords();\n setOutput(binaryOperation(a, b));\n }\n `}};var js=`\n result.r = isNaN.r ? NAN : result.r;\n result.g = isNaN.g ? NAN : result.g;\n result.b = isNaN.b ? NAN : result.b;\n result.a = isNaN.a ? NAN : result.a;\n`;var Ko=class{constructor(e,t,o,n=!1){this.variableNames=[\"A\",\"B\"],this.supportsBroadcasting=!0,this.packedInputs=!0,this.packedOutput=!0,this.outputShape=I.assertAndGetBroadcastShape(t,o);let s=this.outputShape.length;this.enableShapeUniforms=lt(s);let a=\"\";if(n)if(s===0||x.sizeFromShape(this.outputShape)===1)a=`\n result.y = 0.;\n result.z = 0.;\n result.w = 0.;\n `;else if(a=`\n ${_e(s)} coords = getOutputCoords();\n `,s===1)this.enableShapeUniforms?a+=`\n result.y = (coords + 1) >= outShape ? 0. : result.y;\n result.z = 0.;\n result.w = 0.;\n `:a+=`\n result.y = (coords + 1) >= ${this.outputShape[0]} ? 0. : result.y;\n result.z = 0.;\n result.w = 0.;\n `;else{let p=$t(\"coords\",s);this.enableShapeUniforms?a+=`\n bool nextRowOutOfBounds =\n (${p[s-2]} + 1) >= outShape[${s} - 2];\n bool nextColOutOfBounds =\n (${p[s-1]} + 1) >= outShape[${s} - 1];\n result.y = nextColOutOfBounds ? 0. : result.y;\n result.z = nextRowOutOfBounds ? 0. : result.z;\n result.w = nextColOutOfBounds || nextRowOutOfBounds ? 0. : result.w;\n `:a+=`\n bool nextRowOutOfBounds =\n (${p[s-2]} + 1) >= ${this.outputShape[s-2]};\n bool nextColOutOfBounds =\n (${p[s-1]} + 1) >= ${this.outputShape[s-1]};\n result.y = nextColOutOfBounds ? 0. : result.y;\n result.z = nextRowOutOfBounds ? 0. : result.z;\n result.w = nextColOutOfBounds || nextRowOutOfBounds ? 0. : result.w;\n `}this.userCode=`\n vec4 binaryOperation(vec4 a, vec4 b) {\n ${e}\n }\n\n void main() {\n vec4 a = getAAtOutCoords();\n vec4 b = getBAtOutCoords();\n\n vec4 result = binaryOperation(a, b);\n ${a}\n\n setOutput(result);\n }\n `}};function Rt(r){let{inputs:e,backend:t}=r,{x:o}=e;return t.incRef(o.dataId),{dataId:o.dataId,shape:o.shape,dtype:o.dtype}}var cR={kernelName:uo,backendName:\"webgl\",kernelFunc:Rt};function Ar(r){let{inputs:e,backend:t}=r,{real:o,imag:n}=e,s=t.makeTensorInfo(o.shape,\"complex64\"),a=t.texData.get(s.dataId),i=Rt({inputs:{x:o},backend:t}),p=Rt({inputs:{x:n},backend:t});return a.complexTensorInfos={real:i,imag:p},s}var lR={kernelName:aa,backendName:\"webgl\",kernelFunc:Ar};var Tw=\"return (a < 0.) ? b * a : a;\",Nw=`\n vec4 aLessThanZero = vec4(lessThan(a, vec4(0.)));\n return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a);\n`;function xY(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{alpha:s}=o,a=t.makeTensorInfo([],\"float32\",x.createScalarValue(s,\"float32\")),i=P().getBool(\"WEBGL_PACK_BINARY_OPERATIONS\")?new Ko(Nw,n.shape,a.shape):new _o(Tw,n.shape,a.shape),p=t.runWebGLProgram(i,[n,a],\"float32\");return t.disposeIntermediateTensorInfo(a),p}var mR={kernelName:Nn,backendName:\"webgl\",kernelFunc:xY};var _w=\"return (a < 0.) ? b * a : a;\",Ew=`\n vec4 aLessThanZero = vec4(lessThan(a, vec4(0.)));\n return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a);\n`;function yY(r){let{inputs:e,backend:t}=r,{x:o,alpha:n}=e,s=P().getBool(\"WEBGL_PACK_BINARY_OPERATIONS\")?new Ko(Ew,o.shape,n.shape):new _o(_w,o.shape,n.shape);return t.runWebGLProgram(s,[o,n],\"float32\")}var fR={kernelName:Vn,backendName:\"webgl\",kernelFunc:yY};var jo=\"if (isnan(x)) return x;\";function he({opSnippet:r,packedOpSnippet:e,cpuKernelImpl:t,dtype:o}){return({inputs:n,backend:s})=>{let{x:a}=n,i=s,p=o||a.dtype;if(i.shouldExecuteOnCPU([a])&&t!=null){let l=i.texData.get(a.dataId),m=t(l.values,p);return i.makeTensorInfo(a.shape,p,m)}let u=P().getBool(\"WEBGL_PACK_UNARY_OPERATIONS\")&&e!=null,c;return u?c=new No(a.shape,e):c=new fr(a.shape,r),i.runWebGLProgram(c,[a],p)}}function ot({opSnippet:r,packedOpSnippet:e,checkOutOfBounds:t=!1,supportsComplex:o=!1,cpuKernelImpl:n,dtype:s}){return({inputs:a,backend:i})=>{let{a:p,b:u}=a,c=i;if(o&&p.dtype===\"complex64\"){let d=c.texData.get(p.dataId),h=c.texData.get(u.dataId),[g,y]=[[d.complexTensorInfos.real,h.complexTensorInfos.real],[d.complexTensorInfos.imag,h.complexTensorInfos.imag]].map(C=>{let[w,k]=C,_={dataId:w.dataId,dtype:w.dtype,shape:p.shape},E={dataId:k.dataId,dtype:k.dtype,shape:u.shape},R=new _o(r,p.shape,u.shape);return c.runWebGLProgram(R,[_,E],ct(w.dtype,k.dtype))}),b=Ar({inputs:{real:g,imag:y},backend:c});return c.disposeIntermediateTensorInfo(g),c.disposeIntermediateTensorInfo(y),b}let l=s||ct(p.dtype,u.dtype);if((p.dtype===\"string\"||u.dtype===\"string\"||c.shouldExecuteOnCPU([p,u]))&&n!=null){let d=c.texData.get(p.dataId).values,h=c.texData.get(u.dataId).values,g=p.dtype===\"string\"?I.fromUint8ToStringArray(d):d,y=p.dtype===\"string\"?I.fromUint8ToStringArray(h):h,[b,C]=n(p.shape,u.shape,g,y,l),w=c.makeTensorInfo(C,l),k=c.texData.get(w.dataId);return k.values=b,w}let m=P().getBool(\"WEBGL_PACK_BINARY_OPERATIONS\")&&e!=null,f;return m?f=new Ko(e,p.shape,u.shape,t):f=new _o(r,p.shape,u.shape),c.runWebGLProgram(f,[p,u],l)}}function Ma(r,e=!1){if(r===\"linear\")return e?nR:Z$;if(r===\"relu\")return e?aR:eR;if(r===\"elu\")return e?sR:J$;if(r===\"relu6\")return e?iR:tR;if(r===\"prelu\")return e?Ew:_w;if(r===\"leakyrelu\")return e?Nw:Tw;if(r===\"sigmoid\")return e?uR:rR;throw new Error(`Activation ${r} has not been implemented for the WebGL backend.`)}var xc=class{constructor(e,t,o,n=!1,s=!1,a=!1,i=null,p=!1,u=!1){this.variableNames=[\"matrixA\",\"matrixB\"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=o,this.enableShapeUniforms=lt(this.outputShape.length);let c=n?e[1]:e[2],l=Math.ceil(c/2),m=n?\"i * 2, rc.y\":\"rc.y, i * 2\",f=s?\"rc.z, i * 2\":\"i * 2, rc.z\",d=n?[\"a.xxyy\",\"a.zzww\"]:[\"a.xxzz\",\"a.yyww\"],h=s?[\"b.xzxz\",\"b.ywyw\"]:[\"b.xyxy\",\"b.zwzw\"],g=\"\",y=\"\";i&&(p?g=`vec4 activation(vec4 a) {\n vec4 b = getPreluActivationWeightsAtOutCoords();\n ${i}\n }`:u?g=`vec4 activation(vec4 a) {\n vec4 b = getLeakyreluAlphaAtOutCoords();\n ${i}\n }`:g=`vec4 activation(vec4 x) {\n ${i}\n }`,y=\"result = activation(result);\");let b=a?\"result += getBiasAtOutCoords();\":\"\";a&&this.variableNames.push(\"bias\"),p&&this.variableNames.push(\"preluActivationWeights\"),u&&this.variableNames.push(\"leakyreluAlpha\");let C=\"rc.x\",w=\"rc.x\";e[0]`The new shape (${p}) has ${u} elements and the old shape (${n.shape}) has ${i} elements. The new shape and old shape must have the same number of elements.`);let c=a.texData.get(n.dataId);return c.isPacked&&!Ti(n.shape,p)&&!(c.texture!==null&&Ti(c.shape,p))?gR(n,p,a):(a.incRef(n.dataId),{dataId:n.dataId,shape:p,dtype:n.dtype})}var xR={kernelName:Ss,backendName:\"webgl\",kernelFunc:J};var Ol=class{constructor(e,t){this.variableNames=[\"x\"];let{windowSize:o,batchSize:n,inSize:s,outSize:a}=e;this.outputShape=[n,a];let i=Math.floor(o/4)*4,p=o%4,u=\"sumValue += dot(values, ones);\";if(t!=null){let l=1/t;u=`sumValue += dot(values * ${x.isInt(l)?l.toPrecision(2):l}, ones);`}let c=\"\";s%o>0&&(c=`\n if (inIdx < 0 || inIdx >= ${s}) {\n return 0.0;\n }\n `),this.userCode=`\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float getValue(int batch, int inIdx) {\n ${c}\n return getX(batch, inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * ${o};\n\n float sumValue = 0.0;\n\n for (int i = 0; i < ${i}; i += 4) {\n int inIdx = inOffset + i;\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n ${u}\n }\n\n int inIdx = inOffset + ${i};\n if (${p===1}) {\n vec4 values = vec4(getValue(batch, inIdx), 0.0, 0.0, 0.0);\n\n ${u}\n } else if (${p===2}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1), 0.0, 0.0);\n\n ${u}\n } else if (${p===3}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2), 0.0);\n\n ${u}\n }\n setOutput(sumValue);\n }\n `}};var ch=class{constructor(e,t){this.variableNames=[\"x\"];let{windowSize:o,batchSize:n,inSize:s,outSize:a}=e;this.outputShape=[n,a];let i=\"0.0\",p=\"\";t===\"prod\"?i=\"1.0\":t===\"min\"?(i=\"1.0 / 1e-20\",p=\"min\"):t===\"max\"&&(i=\"-1.0 / 1e-20\",p=\"max\");let u=`${t}(${t}(${t}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`;t===\"sum\"?u=\"sumValue\":t===\"prod\"?u=\"prodValue\":t===\"all\"?u=\"allValue\":t===\"any\"&&(u=\"anyValue\");let c=Math.floor(o/4)*4,l=o%4,m=`\n if (${t===\"sum\"}) {\n sumValue += dot(values, ones);\n } else if (${t===\"prod\"}) {\n vec2 tmp = vec2(values[0], values[1]) * vec2(values[2], values[3]);\n prodValue *= tmp[0] * tmp[1];\n } else {\n minMaxValue = ${p}(values, minMaxValue);\n if (${t===\"min\"} || ${t===\"max\"}) {\n minMaxValue = ${p}(values, minMaxValue);\n bvec4 isNaN = isnan(values);\n if (isNaN.r || isNaN.g || isNaN.b || isNaN.a) {\n minMaxValue = vec4(NAN);\n }\n }\n }\n `,f=\"vec4\";t===\"all\"?(i=\"1.0\",m=`\n bool reducedAllValue = all(values);\n float floatedReducedAllValue = float(reducedAllValue);\n allValue = float(allValue >= 1.0 && floatedReducedAllValue >= 1.0);\n `,f=\"bvec4\"):t===\"any\"&&(i=\"0.0\",m=`\n bool reducedAnyValue = any(values);\n float floatedReducedAnyValue = float(reducedAnyValue);\n anyValue = float(anyValue >= 1.0 || floatedReducedAnyValue >= 1.0);\n `,f=\"bvec4\");let d=\"\";s%o>0&&(d=`\n if (inIdx < 0 || inIdx >= ${s}) {\n return initializationValue;\n }\n `),this.userCode=`\n const float initializationValue = ${i};\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float getValue(int batch, int inIdx) {\n ${d}\n return getX(batch, inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * ${o};\n\n vec4 minMaxValue = vec4(${i});\n float prodValue = 1.0;\n float sumValue = 0.0;\n float allValue = 1.0;\n float anyValue = 0.0;\n\n for (int i = 0; i < ${c}; i += 4) {\n int inIdx = inOffset + i;\n ${f} values = ${f}(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n ${m}\n }\n\n int inIdx = inOffset + ${c};\n if (${l===1}) {\n ${f} values = ${f}(\n getValue(batch, inIdx),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n ${m}\n } else if (${l===2}) {\n ${f} values = ${f}(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n initializationValue,\n initializationValue\n );\n\n ${m}\n } else if (${l===3}) {\n ${f} values = ${f}(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n initializationValue\n );\n\n ${m}\n }\n setOutput(${u});\n }\n `}};function CY(r){let e=[];for(;e.length===0||e[e.length-1].outSize!==1;){let t=e.length?e[e.length-1].outSize:r[1],o=I.computeOptimalWindowSize(t);e.push({inSize:t,windowSize:o,outSize:Math.ceil(t/o)})}return e}function qr(r,e,t,o){let n=CY(r.shape),s=r;for(let a=0;a6)throw Error(`Transpose for rank ${e} is not yet supported`);let t=[\"resRC.x\",\"resRC.y\",\"resRC.z\",\"resRC.w\",\"resRC.u\",\"resRC.v\"],o=new Array(e);for(let n=0;n6)throw Error(`Packed transpose for rank ${this.rank} is not yet supported.`);let n=_e(this.rank),s=vw(\"rc\",this.rank),a=new Array(this.rank);for(let c=0;c`Error in matMul: inner shapes (${l}) and (${m}) of Tensors with shapes ${r.shape} and ${e.shape} and transposeA=${t} and transposeB=${o} must match.`);let k=t?[y,l,f]:[y,f,l],_=o?[b,d,m]:[b,m,d],E=J({inputs:{x:r},backend:n,attrs:{shape:k}}),R=J({inputs:{x:e},backend:n,attrs:{shape:_}}),A=[E,R],D=Math.max(y,b),O=t?E.shape[1]:E.shape[2],M=s!=null,L=a!=null,W=p===\"leakyrelu\",V=p!=null?Ma(p,!0):null,G=M||L||W||V!=null,q;if((f===1||d===1)&&O>Rw&&G===!1){let j=E,Y=R;t&&(j=xt({inputs:{x:E},backend:n,attrs:{perm:[0,2,1]}}),A.push(j)),o&&(Y=xt({inputs:{x:R},backend:n,attrs:{perm:[0,2,1]}}),A.push(Y));let Z=d!==1,ee=d===1,X=j;Z&&(X=J({inputs:{x:j},backend:n,attrs:{shape:[D,O,1]}}),A.push(X));let Q=d===1?2:1,se=Y;ee&&(se=J({inputs:{x:Y},backend:n,attrs:{shape:[D,1,O]}}),A.push(se));let ie=Pl({inputs:{a:X,b:se},backend:n});q=Ou({inputs:{x:ie},backend:n,attrs:{axis:Q,keepDims:!0}}),A.push(ie)}else{let j=ct(r.dtype,e.dtype),Y=new xc(k,_,[D,f,d],t,o,M,V,L,W),Z=[E,R];if(s!=null&&Z.push(s),L&&Z.push(a),W){let ee=n.makeTensorInfo([],\"float32\",x.createScalarValue(i,\"float32\"));Z.push(ee),A.push(ee)}q=n.runWebGLProgram(Y,Z,j)}let H=J({inputs:{x:q},backend:n,attrs:{shape:w}});A.push(q);for(let j of A)n.disposeIntermediateTensorInfo(j);return H}function wY(r){let{inputs:e,backend:t,attrs:o}=r,{a:n,b:s,bias:a,preluActivationWeights:i}=e,{transposeA:p,transposeB:u,activation:c,leakyreluAlpha:l}=o;return Mu({a:n,b:s,transposeA:p,transposeB:u,backend:t,bias:a,preluActivationWeights:i,leakyreluAlpha:l,activation:c})}var IR={kernelName:Fo,backendName:\"webgl\",kernelFunc:wY};var wR=\"return abs(x);\";function SY(r){let{inputs:e,backend:t}=r,{x:o}=e;if(t.shouldExecuteOnCPU([o])&&o.dtype!==\"complex64\"){let s=t.texData.get(o.dataId),a=nh(s.values);return t.makeTensorInfo(o.shape,o.dtype,a)}let n;return P().getBool(\"WEBGL_PACK_UNARY_OPERATIONS\")?n=new No(o.shape,wR):n=new fr(o.shape,wR),t.runWebGLProgram(n,[o],o.dtype)}var SR={kernelName:sn,backendName:\"webgl\",kernelFunc:SY};var vY=Vt+`\n if (abs(x) > 1.) {\n return NAN;\n }\n return acos(x);\n`,kY=he({opSnippet:vY}),vR={kernelName:Li,backendName:\"webgl\",kernelFunc:kY};var TY=Vt+`\n if (x < 1.0) return NAN;\nreturn log(x + sqrt(x * x - 1.0));`,NY=he({opSnippet:TY}),kR={kernelName:Bi,backendName:\"webgl\",kernelFunc:NY};var TR=\"return a + b;\",_Y=ot({opSnippet:TR,packedOpSnippet:TR,supportsComplex:!0,cpuKernelImpl:s$}),NR={kernelName:_r,backendName:\"webgl\",kernelFunc:_Y};var fh=class{constructor(e,t){this.outputShape=[],this.outputShape=e,this.variableNames=t.map((s,a)=>`T${a}`);let o=[];this.variableNames.forEach(s=>{o.push(`float v${s} = get${s}AtOutCoords();`)});let n=this.variableNames.map(s=>`v${s}`).join(\" + \");this.userCode=`\n void main() {\n ${o.join(`\n `)}\n\n float result = ${n};\n setOutput(result);\n }\n `}};var dh=class{constructor(e,t){this.outputShape=[],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e,this.variableNames=t.map((s,a)=>`T${a}`);let o=[];this.variableNames.forEach(s=>{o.push(`vec4 v${s} = get${s}AtOutCoords();`)});let n=this.variableNames.map(s=>`v${s}`).join(\" + \");this.userCode=`\n void main() {\n ${o.join(`\n `)}\n\n vec4 result = ${n};\n setOutput(result);\n }\n `}};function hh(r){let{inputs:e,backend:t}=r,o=e;if(o.length===1)return Rt({inputs:{x:o[0]},backend:t});if(o.length>P().get(\"WEBGL_MAX_TEXTURES_IN_SHADER\")){let p=Math.floor(o.length/2),u=hh({inputs:o.slice(0,p),backend:t}),c=hh({inputs:o.slice(p),backend:t});return hh({inputs:[u,c],backend:t})}let n=o.map(p=>p.dtype).reduce((p,u)=>ct(p,u)),s=o.map(p=>p.shape),i=P().getBool(\"WEBGL_PACK\")?new dh(o[0].shape,s):new fh(o[0].shape,s);return t.runWebGLProgram(i,o,n)}var _R={kernelName:an,backendName:\"webgl\",kernelFunc:hh};function EY(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s,keepDims:a}=o,i=n.shape.length,p=x.parseAxisParam(s,n.shape),u=p,c=I.getAxesPermutation(u,i),l=n;c!=null&&(l=xt({inputs:{x:n},backend:t,attrs:{perm:c}}),u=I.getInnerMostAxes(u.length,i)),I.assertAxesAreInnerMostDims(\"all\",u,i);let[m,f]=I.computeOutAndReduceShapes(l.shape,u),d=x.sizeFromShape(f),h=J({inputs:{x:l},backend:t,attrs:{shape:[-1,d]}}),g=qr(h,h.dtype,\"all\",t),y;if(a){let b=I.expandShapeToKeepDim(m,p);y=J({inputs:{x:g},backend:t,attrs:{shape:b}})}else y=J({inputs:{x:g},backend:t,attrs:{shape:m}});return t.disposeIntermediateTensorInfo(h),t.disposeIntermediateTensorInfo(g),c!=null&&t.disposeIntermediateTensorInfo(l),y}var ER={kernelName:oa,backendName:\"webgl\",kernelFunc:EY};function $Y(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s,keepDims:a}=o,i=n.shape.length,p=x.parseAxisParam(s,n.shape),u=p,c=I.getAxesPermutation(u,i),l=n;c!=null&&(l=xt({inputs:{x:n},backend:t,attrs:{perm:c}}),u=I.getInnerMostAxes(u.length,i)),I.assertAxesAreInnerMostDims(\"any\",u,i);let[m,f]=I.computeOutAndReduceShapes(l.shape,u),d=x.sizeFromShape(f),h=J({inputs:{x:l},backend:t,attrs:{shape:[-1,d]}}),g=qr(h,h.dtype,\"any\",t),y;if(a){let b=I.expandShapeToKeepDim(m,p);y=J({inputs:{x:g},backend:t,attrs:{shape:b}})}else y=J({inputs:{x:g},backend:t,attrs:{shape:m}});return t.disposeIntermediateTensorInfo(h),t.disposeIntermediateTensorInfo(g),c!=null&&t.disposeIntermediateTensorInfo(l),y}var $R={kernelName:na,backendName:\"webgl\",kernelFunc:$Y};var gh=class{constructor(e,t,o){this.variableNames=[\"A\"];let{windowSize:n,batchSize:s,outSize:a}=e;o||this.variableNames.push(\"bestIndicesA\"),this.outputShape=[s,a];let i=t===\"max\"?\">\":\"<\",p=o?\"inOffset + i;\":\"round(getBestIndicesA(batch, inOffset + i));\";this.userCode=`\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * ${n};\n\n int bestIndex = inOffset;\n float bestValue = getA(batch, bestIndex);\n\n for (int i = 0; i < ${n}; i++) {\n int inIdx = ${p};\n float candidate = getA(batch, inIdx);\n if (candidate ${i} bestValue) {\n bestValue = candidate;\n bestIndex = inIdx;\n }\n }\n setOutput(float(bestIndex));\n }\n `}};var xh=class{constructor(e,t,o,n){this.variableNames=[\"A\"],this.packedInputs=!0,this.packedOutput=!0,x.assert(e.length>2,()=>`Packed arg${o.charAt(0).toUpperCase()+o.slice(1)} supports only inputs with rank above 2.`);let s=e[e.length-1],a=Math.ceil(s/t);this.outputShape=e.slice(0,-1),a>1&&this.outputShape.push(a),n||this.variableNames.push(\"bestIndicesA\");let i=this.outputShape,p=i.length,u=_e(p),c=$t(\"coords\",p),l,m;if(a===1){m=p+1;let R=_e(m);l=`\n ${R} sourceLocR = ${R}(${c.join()}, 0);\n ++${c[p-1]};\n ${R} sourceLocG = ${R}(${c.join()}, 0);\n ++${c[p-2]};\n ${R} sourceLocA = ${R}(${c.join()}, 0);\n --${c[p-1]};\n ${R} sourceLocB = ${R}(${c.join()}, 0);\n --${c[p-2]};`}else m=p,l=`\n ${u} sourceLocR = coords;\n ++${c[p-1]};\n ${u} sourceLocG = coords;\n ++${c[p-2]};\n ${u} sourceLocA = coords;\n --${c[p-1]};\n ${u} sourceLocB = coords;\n --${c[p-2]};`;let f=[\"x\",\"y\",\"z\",\"w\",\"u\",\"v\"].slice(0,m),d=\".\"+f[m-1],h=f.map(R=>\"int \"+R),g=$t(\"sourceLocR\",m-1).concat(\"inIdx.r\"),y=$t(\"sourceLocG\",m-1).concat(\"inIdx.g\"),b=$t(\"sourceLocB\",m-1).concat(\"inIdx.b\"),C=$t(\"sourceLocA\",m-1).concat(\"inIdx.a\"),w=o===\"max\"?\"greaterThan\":\"lessThan\",k=n?\"\":`\n inIdx = round(vec4(getBestIndicesAChannel(${g.join()}),\n getBestIndicesAChannel(${y.join()}),\n getBestIndicesAChannel(${b.join()}),\n getBestIndicesAChannel(${C.join()})));`,_=`vec4(\n getAChannel(${g.join()}),\n hasNextCol ? getAChannel(${y.join()}) : 0.,\n hasNextRow ? getAChannel(${b.join()}) : 0.,\n hasNextRow && hasNextCol ? getAChannel(${C.join()}) : 0.)`,E=n?\"\":`\n float getBestIndicesAChannel(${h.join()}) {\n return getChannel(getBestIndicesA(${f.join()}),\n vec2(${f.slice(-2).join()}));\n }`;this.userCode=`\n float getAChannel(${h.join()}) {\n return getChannel(getA(${f.join()}),\n vec2(${f.slice(-2).join()}));\n }\n ${E}\n void main() {\n ${u} coords = getOutputCoords();\n bool hasNextCol = ${c[p-1]} < ${i[p-1]-1};\n bool hasNextRow = ${c[p-2]} < ${i[p-2]-1};\n ${l}\n ivec4 srcIdx = ivec4(sourceLocR${d}, sourceLocG${d},\n sourceLocB${d}, sourceLocA${d}) * ${t};\n ivec4 inIdx = srcIdx;\n vec4 bestIndex = vec4(inIdx);\n vec4 bestValue = ${_};\n\n for (int i = 0; i < ${t}; i++) {\n inIdx = srcIdx;\n ${k}\n vec4 candidate = ${_};\n bvec4 nan = isnan(candidate);\n bvec4 replace = bvec4(\n vec4(${w}(candidate, bestValue)) * (vec4(1.0) - vec4(nan)));\n\n bestValue = vec4(replace.x ? candidate.x : bestValue.x,\n replace.y ? candidate.y : bestValue.y,\n replace.z ? candidate.z : bestValue.z,\n replace.w ? candidate.w : bestValue.w);\n bestIndex = mix(bestIndex, vec4(inIdx), vec4(replace));\n srcIdx++;\n }\n setOutput(bestIndex);\n }\n `}};function RR(r,e,t,o=null){let n=e.shape[0],s=e.shape[1];o!=null&&(n=o.shape[0],s=o.shape[1]);let a=I.computeOptimalWindowSize(s),i={windowSize:a,inSize:s,batchSize:n,outSize:Math.ceil(s/a)},p=new gh(i,t,o==null),u=[e];o!=null&&u.push(o);let c=r.runWebGLProgram(p,u,\"int32\");if(c.shape[1]===1)return c;let l=RR(r,e,t,c);return r.disposeIntermediateTensorInfo(c),l}function AR(r,e,t,o=null){let n=o!=null?o.shape:e.shape,s=n[n.length-1],a=I.computeOptimalWindowSize(s),i=new xh(n,a,t,o==null),p=o==null?[e]:[e,o],u=r.runWebGLProgram(i,p,\"int32\");if(u.shape.length===e.shape.length){let c=AR(r,e,t,u);return r.disposeIntermediateTensorInfo(u),c}return u}function yh(r,e,t,o){let n=[t];if(I.assertAxesAreInnerMostDims(\"arg\"+o.charAt(0).toUpperCase()+o.slice(1),n,e.shape.length),!P().getBool(\"WEBGL_PACK_REDUCE\")||e.shape.length<=2){let s=[],a=r.texData.get(e.dataId),i=a!==null&&a.isPacked,p=e;i&&(p=r.unpackTensor(e),s.push(p));let[u,c]=I.computeOutAndReduceShapes(p.shape,n),l=x.sizeFromShape(c),m=J({inputs:{x:p},backend:r,attrs:{shape:[-1,l]}});s.push(m);let f=RR(r,m,o);s.push(f);let d=J({inputs:{x:f},backend:r,attrs:{shape:u}});return s.forEach(h=>r.disposeIntermediateTensorInfo(h)),d}return AR(r,e,o)}function RY(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s}=o,a=x.parseAxisParam(s,n.shape),i=I.getAxesPermutation(a,n.shape.length),p=n,u=[];i!=null&&(p=xt({inputs:{x:n},backend:t,attrs:{perm:i}}),u.push(p),a=I.getInnerMostAxes(a.length,p.shape.length)),I.assertAxesAreInnerMostDims(\"argMax\",[a[0]],p.shape.length);let c=yh(t,p,a[0],\"max\");return u.forEach(l=>t.disposeIntermediateTensorInfo(l)),c}var FR={kernelName:un,backendName:\"webgl\",kernelFunc:RY};function AY(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s}=o,a=x.parseAxisParam(s,n.shape),i=I.getAxesPermutation(a,n.shape.length),p=n,u=[];i!=null&&(p=xt({inputs:{x:n},backend:t,attrs:{perm:i}}),u.push(p),a=I.getInnerMostAxes(a.length,p.shape.length)),I.assertAxesAreInnerMostDims(\"argMin\",[a[0]],p.shape.length);let c=yh(t,p,a[0],\"min\");return u.forEach(l=>t.disposeIntermediateTensorInfo(l)),c}var DR={kernelName:ja,backendName:\"webgl\",kernelFunc:AY};var FY=Vt+`\n if (abs(x) > 1.) {\n return NAN;\n }\n return asin(x);\n`,DY=he({opSnippet:FY}),PR={kernelName:Vi,backendName:\"webgl\",kernelFunc:DY};var PY=Vt+\"return log(x + sqrt(x * x + 1.0));\",OY=he({opSnippet:PY}),OR={kernelName:zi,backendName:\"webgl\",kernelFunc:OY};var MY=Vt+`\n return atan(x);\n`,LY=he({opSnippet:MY}),MR={kernelName:Wi,backendName:\"webgl\",kernelFunc:LY};var BY=gc+`\n return atan(a, b);\n`,VY=`\n vec4 result = atan(a, b);\n bvec4 isNaNA = isnan(a);\n bvec4 isNaNB = isnan(b);\n bvec4 isNaN = bvec4(isNaNA.x || isNaNB.x, isNaNA.y || isNaNB.y, isNaNA.z || isNaNB.z, isNaNA.w || isNaNB.w);\n `+js+`\n return result;\n`,zY=ot({opSnippet:BY,packedOpSnippet:VY}),LR={kernelName:sa,backendName:\"webgl\",kernelFunc:zY};var WY=Vt+`\n if ((x < -1.0) || (x > 1.0)) return NAN;\nreturn (log(1.0 + x) - log(1.0 - x)) / 2.0;`,UY=he({opSnippet:WY}),BR={kernelName:Ui,backendName:\"webgl\",kernelFunc:UY};var us=class{constructor(e,t,o,n=!1,s=!1){if(this.variableNames=[\"x\"],t===\"avg\"&&o)throw new Error(\"Cannot compute positions for average pool.\");let a=e.filterWidth,i=e.strideHeight,p=e.strideWidth,u=e.dilationHeight,c=e.dilationWidth,l=e.effectiveFilterHeight,m=e.effectiveFilterWidth,f=e.padInfo.top,d=e.padInfo.left;this.outputShape=e.outShape;let h=t===\"avg\",g=`((batch * ${e.inHeight} + xR) * ${e.inWidth} + xC) * ${e.inChannels} + d`,y=`(xR * ${e.inWidth} + xC) * ${e.inChannels} + d`,b=\"0.0\";if(h||(b=\"-1.0 / 1e-20\"),o){let R=\">=\";this.userCode=`\n const ivec2 strides = ivec2(${i}, ${p});\n const ivec2 pads = ivec2(${f}, ${d});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // max/min x(?, ?, d) to get y(yR, yC, d).\n // ? = to be determined\n float minMaxValue = 0.0;\n float minMaxValueFound = 0.0;\n int minMaxPosition = 0;\n float avgValue = 0.0;\n\n for (int wR = 0; wR < ${l};\n wR += ${u}) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${m};\n wC += ${c}) {\n int xC = xCCorner + wC;\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n float value = getX(batch, xR, xC, d);\n\n // If a min / max value has already been found, use it. If not,\n // use the current value.\n float currMinMaxValue = mix(\n value, minMaxValue, minMaxValueFound);\n if (value ${R} currMinMaxValue) {\n minMaxValue = value;\n minMaxValueFound = 1.0;\n minMaxPosition = ${n?s?g:y:`wR * ${m} + wC`};\n }\n }\n }\n setOutput(float(minMaxPosition));\n }\n `;return}let C=\"max\",w=`${t}(${t}(${t}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`;t===\"avg\"&&(w=\"avgValue / count\");let k=Math.floor(a/4)*4,_=a%4,E=`\n if (${h}) {\n avgValue += dot(values, ones);\n } else {\n minMaxValue = ${C}(values, minMaxValue);\n }\n `;this.userCode=`\n const ivec2 strides = ivec2(${i}, ${p});\n const ivec2 pads = ivec2(${f}, ${d});\n const float initializationValue = ${b};\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float count = 0.0;\n\n float getValue(int batch, int xR, int xC, int d) {\n if (xC < 0 || xC >= ${e.inWidth}) {\n return initializationValue;\n }\n count += 1.0;\n return getX(batch, xR, xC, d);\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // max/min x(?, ?, d) to get y(yR, yC, d).\n // ? = to be determined\n vec4 minMaxValue = vec4(${b});\n float avgValue = 0.0;\n count = 0.0;\n\n for (int wR = 0; wR < ${l};\n wR += ${u}) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${k}; wC += 4) {\n int xC = xCCorner + wC * ${c};\n\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + ${c}, d),\n getValue(batch, xR, xC + 2 * ${c}, d),\n getValue(batch, xR, xC + 3 * ${c}, d)\n );\n\n ${E}\n }\n\n int xC = xCCorner + ${k};\n if (${_===1}) {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n ${E}\n } else if (${_===2}) {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + ${c}, d),\n initializationValue,\n initializationValue\n );\n\n ${E}\n } else if (${_===3}) {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + ${c}, d),\n getValue(batch, xR, xC + 2 * ${c}, d),\n initializationValue\n );\n\n ${E}\n }\n }\n setOutput(${w});\n }\n `}},Ei=class{constructor(e,t,o,n=!1,s=!1){if(this.variableNames=[\"x\"],t===\"avg\"&&o)throw new Error(\"Cannot compute positions for average pool.\");let a=e.filterWidth,i=e.strideDepth,p=e.strideHeight,u=e.strideWidth,c=e.dilationDepth,l=e.dilationHeight,m=e.dilationWidth,f=e.effectiveFilterDepth,d=e.effectiveFilterHeight,h=e.effectiveFilterWidth,g=e.padInfo.front,y=e.padInfo.top,b=e.padInfo.left;this.outputShape=e.outShape;let C=t===\"avg\",w=\"0.0\";if(C||(w=\"-1.0 / 1e-20\"),o){let D=\">=\";this.userCode=`\n const ivec3 strides =\n ivec3(${i}, ${p}, ${u});\n const ivec3 pads = ivec3(${g}, ${y}, ${b});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xDCorner = xCorner.x;\n int xRCorner = xCorner.y;\n int xCCorner = xCorner.z;\n\n // max/min x(?, ?, ?, ch) to get y(yD, yR, yC, ch).\n // ? = to be determined\n float minMaxValue = 0.0;\n float minMaxValueFound = 0.0;\n int minMaxPosition = 0;\n\n for (int wD = 0; wD < ${f};\n wD += ${c}) {\n int xD = xDCorner + wD;\n\n if (xD < 0 || xD >= ${e.inDepth}) {\n continue;\n }\n\n for (int wR = 0; wR < ${d};\n wR += ${l}) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${h};\n wC += ${m}) {\n int xC = xCCorner + wC;\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n float value = getX(batch, xD, xR, xC, ch);\n\n // If a min / max value has already been found, use it. If not,\n // use the current value.\n float currMinMaxValue = mix(\n value, minMaxValue, minMaxValueFound);\n if (value ${D} currMinMaxValue) {\n minMaxValue = value;\n minMaxValueFound = 1.0;\n minMaxPosition = ${n?s?`(((batch * ${e.inDepth} + xD) * ${e.inHeight} + xR) * ${e.inWidth} + xC) * ${e.inChannels} + ch`:`((xD * ${e.inHeight} + xR) * ${e.inWidth} + xC) * ${e.inChannels} + ch`:`wD * ${d} * ${h} +\n wR * ${h} + wC`};\n }\n }\n }\n }\n setOutput(float(minMaxPosition));\n }\n `;return}let k=\"max\",_=`${t}(${t}(${t}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`;t===\"avg\"&&(_=\"avgValue / count\");let E=Math.floor(a/4)*4,R=a%4,A=`\n if (${C}) {\n avgValue += dot(values, ones);\n } else {\n minMaxValue = ${k}(values, minMaxValue);\n }\n `;this.userCode=`\n const ivec3 strides =\n ivec3(${i}, ${p}, ${u});\n const ivec3 pads = ivec3(${g}, ${y}, ${b});\n const float initializationValue = ${w};\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float count = 0.0;\n\n float getValue(int batch, int xD, int xR, int xC, int ch) {\n if (xC < 0 || xC >= ${e.inWidth}) {\n return initializationValue;\n }\n count += 1.0;\n return getX(batch, xD, xR, xC, ch);\n }\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xDCorner = xCorner.x;\n int xRCorner = xCorner.y;\n int xCCorner = xCorner.z;\n\n // max/min x(?, ?, ?, d) to get y(yD, yR, yC, ch).\n // ? = to be determined\n vec4 minMaxValue = vec4(${w});\n float avgValue = 0.0;\n count = 0.0;\n\n for (int wD = 0; wD < ${f};\n wD += ${c}) {\n int xD = xDCorner + wD;\n\n if (xD < 0 || xD >= ${e.inDepth}) {\n continue;\n }\n\n for (int wR = 0; wR < ${d};\n wR += ${l}) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${E}; wC += 4) {\n int xC = xCCorner + wC * ${m};\n\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + ${m}, ch),\n getValue(batch, xD, xR, xC + 2 * ${m}, ch),\n getValue(batch, xD, xR, xC + 3 * ${m}, ch)\n );\n\n ${A}\n }\n\n int xC = xCCorner + ${E};\n if (${R===1}) {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n ${A}\n } else if (${R===2}) {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + ${m}, ch),\n initializationValue,\n initializationValue\n );\n\n ${A}\n } else if (${R===3}) {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + ${m}, ch),\n getValue(batch, xD, xR, xC + 2 * ${m}, ch),\n initializationValue\n );\n\n ${A}\n }\n }\n setOutput(${_});\n }\n }\n `}};function GY(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e;as(n,\"avgPool\");let{filterSize:s,strides:a,pad:i,dimRoundingMode:p}=o,u=1;x.assert(I.eitherStridesOrDilationsAreOne(a,u),()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${a} and dilations '${u}'`);let c=I.computePool2DInfo(n.shape,s,a,u,i,p);if(c.filterWidth===1&&c.filterHeight===1&&x.arraysEqual(c.inShape,c.outShape))return Rt({inputs:{x:n},backend:t});let l=new us(c,\"avg\",!1);return t.runWebGLProgram(l,[n],\"float32\")}var VR={kernelName:pn,backendName:\"webgl\",kernelFunc:GY};function HY(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{filterSize:s,strides:a,pad:i,dimRoundingMode:p,dataFormat:u}=o,c=[1,1,1],l=I.computePool3DInfo(n.shape,s,a,c,i,p,u),m=new Ei(l,\"avg\",!1);return t.runWebGLProgram(m,[n],\"float32\")}var zR={kernelName:ip,backendName:\"webgl\",kernelFunc:HY};var bh=class{constructor(e){this.variableNames=[\"dy\"],this.outputShape=e.inShape;let t=e.filterHeight,o=e.filterWidth,n=e.strideHeight,s=e.strideWidth,a=e.dilationHeight,i=e.dilationWidth,p=e.effectiveFilterHeight,u=e.effectiveFilterWidth,c=p-1-e.padInfo.top,l=u-1-e.padInfo.left,m=1/(t*o);this.userCode=`\n const ivec2 pads = ivec2(${c}, ${l});\n const float avgMultiplier = float(${m});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n\n ivec2 dyRCCorner = coords.yz - pads;\n int dyRCorner = dyRCCorner.x;\n int dyCCorner = dyRCCorner.y;\n\n // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${p};\n wR += ${a}) {\n float dyR = float(dyRCorner + wR) / ${n}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${u};\n wC+= ${i}) {\n float dyC = float(dyCCorner + wC) / ${s}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n\n dotProd += dyValue * avgMultiplier;\n }\n }\n setOutput(dotProd);\n }\n `}},Ch=class{constructor(e){this.variableNames=[\"dy\"],this.outputShape=e.inShape;let t=e.filterDepth,o=e.filterHeight,n=e.filterWidth,s=e.strideDepth,a=e.strideHeight,i=e.strideWidth,p=e.dilationDepth,u=e.dilationHeight,c=e.dilationWidth,l=e.effectiveFilterDepth,m=e.effectiveFilterHeight,f=e.effectiveFilterWidth,d=l-1-e.padInfo.front,h=m-1-e.padInfo.top,g=f-1-e.padInfo.left,y=1/(t*o*n);this.userCode=`\n const ivec3 pads = ivec3(${d}, ${h}, ${g});\n const float avgMultiplier = float(${y});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyDCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n // Convolve dy(?, ?, ?, d) with pos mask(:, :, :, ch) to get\n // dx(xD, xR, xC, ch).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int wD = 0; wD < ${l};\n wD += ${p}) {\n float dyD = float(dyDCorner + wD) / ${s}.0;\n\n if (dyD < 0.0 || dyD >= ${e.outDepth}.0 || fract(dyD) > 0.0) {\n continue;\n }\n int idyD = int(dyD);\n\n for (int wR = 0; wR < ${m};\n wR += ${u}) {\n float dyR = float(dyRCorner + wR) / ${a}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${f};\n wC += ${c}) {\n float dyC = float(dyCCorner + wC) / ${i}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(batch, idyD, idyR, idyC, ch);\n\n dotProd += dyValue * avgMultiplier;\n }\n }\n }\n setOutput(dotProd);\n }\n `}};function qY(r){let{inputs:e,backend:t,attrs:o}=r,{dy:n,input:s}=e,a=s,{filterSize:i,strides:p,pad:u,dimRoundingMode:c}=o,l=[1,1,1],m=I.computePool3DInfo(a.shape,i,p,l,u,c),f=new Ch(m);return t.runWebGLProgram(f,[n],a.dtype)}var WR={kernelName:Fm,backendName:\"webgl\",kernelFunc:qY};function KY(r){let{inputs:e,backend:t,attrs:o}=r,{dy:n,input:s}=e,a=s;as([n,s],\"avgPoolGrad\");let{filterSize:i,strides:p,pad:u}=o,c=I.computePool2DInfo(a.shape,i,p,1,u),l=new bh(c);return t.runWebGLProgram(l,[n],a.dtype)}var UR={kernelName:Am,backendName:\"webgl\",kernelFunc:KY};function jY(r){let{inputs:e,backend:t,attrs:o}=r,{a:n,b:s}=e,{transposeA:a,transposeB:i}=o;return Mu({a:n,b:s,transposeA:a,transposeB:i,backend:t})}var GR={kernelName:cn,backendName:\"webgl\",kernelFunc:jY};var Ih=class{constructor(e,t,o,n,s,a){this.outputShape=[],this.variableNames=[\"x\",\"mean\",\"variance\"],I.assertAndGetBroadcastShape(e,t),I.assertAndGetBroadcastShape(e,o);let i=\"0.0\";n!=null&&(I.assertAndGetBroadcastShape(e,n),this.variableNames.push(\"offset\"),i=\"getOffsetAtOutCoords()\");let p=\"1.0\";s!=null&&(I.assertAndGetBroadcastShape(e,s),this.variableNames.push(\"scale\"),p=\"getScaleAtOutCoords()\"),this.outputShape=e,this.userCode=`\n void main() {\n float x = getXAtOutCoords();\n float mean = getMeanAtOutCoords();\n float variance = getVarianceAtOutCoords();\n float offset = ${i};\n float scale = ${p};\n float inv = scale * inversesqrt(variance + float(${a}));\n setOutput(dot(vec3(x, -mean, offset), vec3(inv, inv, 1)));\n }\n `}};var wh=class{constructor(e,t,o,n,s,a){this.packedInputs=!0,this.packedOutput=!0,this.variableNames=[\"x\",\"mean\",\"variance\"],I.assertAndGetBroadcastShape(e,t),I.assertAndGetBroadcastShape(e,o);let i=\"vec4(0.0)\";n!=null&&(I.assertAndGetBroadcastShape(e,n),this.variableNames.push(\"offset\"),i=\"getOffsetAtOutCoords()\");let p=\"vec4(1.0)\";s!=null&&(I.assertAndGetBroadcastShape(e,s),this.variableNames.push(\"scale\"),p=\"getScaleAtOutCoords()\"),this.outputShape=e,this.userCode=`\n void main() {\n vec4 offset = ${i};\n vec4 scale = ${p};\n\n vec4 x = getXAtOutCoords();\n vec4 mean = getMeanAtOutCoords();\n vec4 variance = getVarianceAtOutCoords();\n\n vec4 inv = scale * inversesqrt(variance + vec4(${a}));\n\n setOutput((x - mean) * inv + offset);\n }\n `}};var XY=({inputs:r,backend:e,attrs:t})=>{let{x:o,mean:n,variance:s,offset:a,scale:i}=r;x.assert(n.shape.length===s.shape.length,()=>\"Batch normalization gradient requires mean and variance to have equal ranks.\"),x.assert(a==null||n.shape.length===a.shape.length,()=>\"Batch normalization gradient requires mean and offset to have equal ranks.\"),x.assert(i==null||n.shape.length===i.shape.length,()=>\"Batch normalization gradient requires mean and scale to have equal ranks.\");let{varianceEpsilon:p}=t;p==null&&(p=.001);let u=[o,n,s],c=null;a!=null&&(c=a.shape,u.push(a));let l=null;i!=null&&(l=i.shape,u.push(i));let m=P().getBool(\"WEBGL_PACK_NORMALIZATION\")?new wh(o.shape,n.shape,s.shape,c,l,p):new Ih(o.shape,n.shape,s.shape,c,l,p);return e.runWebGLProgram(m,u,u[0].dtype)},HR={kernelName:kn,backendName:\"webgl\",kernelFunc:XY};var Sh=class{constructor(e){this.variableNames=[\"source\"],this.outputShape=e,this.rank=e.length;let t=_e(this.rank);this.customUniforms=[{name:\"start\",arrayIndex:this.rank,type:\"int\"}];let o=YY(this.rank),n,s=e.map((a,i)=>`sourceLoc.${Aw[i]} = start[${i}] + coords.${Aw[i]};`);n=`\n ${t} sourceLoc;\n ${t} coords = getOutputCoords();\n ${s.join(`\n`)}\n `,this.userCode=`\n void main() {\n ${n}\n setOutput(getSource(${o}));\n }\n `}},Aw=[\"x\",\"y\",\"z\",\"w\",\"u\",\"v\"];function YY(r){if(r===1)return\"sourceLoc\";if(r<=6)return Aw.slice(0,r).map(e=>\"sourceLoc.\"+e).join(\",\");throw Error(`Slicing for rank ${r} is not yet supported`)}var vh=class{constructor(e){this.variableNames=[\"source\"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e,this.rank=e.length,this.customUniforms=[{name:\"start\",arrayIndex:this.rank,type:\"int\"}];let t=_e(this.rank),o=$t(\"coords\",this.rank),n=$t(\"sourceLoc\",this.rank),s=this.rank===1?\"sourceLoc\":`vec2(${n.slice(-2).join()})`,a=`getChannel(getSource(${n.join()}), ${s})`,i=`\n result.x = ${a};\n if (++${o[this.rank-1]} < ${e[this.rank-1]}) {\n ++${n[this.rank-1]};\n result.y = ${a};\n --${n[this.rank-1]};\n }\n `,p=this.rank===1?\"\":`\n --${o[this.rank-1]};\n if (++${o[this.rank-2]} < ${e[this.rank-2]}) {\n ++${n[this.rank-2]};\n result.z = ${a};\n if (++${o[this.rank-1]} < ${e[this.rank-1]}) {\n ++${n[this.rank-1]};\n result.w = ${a};\n }\n }\n `,u=this.rank<=4?`sourceLoc = coords +\n ${t}(${e.map((c,l)=>`start[${l}]`).join()});`:e.map((c,l)=>`${n[l]} = ${o[l]} + start[${l}];`).join(`\n`);this.userCode=`\n void main() {\n ${t} coords = getOutputCoords();\n ${t} sourceLoc;\n ${u}\n vec4 result = vec4(0.);\n ${i}\n ${p}\n setOutput(result);\n }\n `}};function QY(r,e,t,o){let n=o.texData.get(r.dataId),s=o.makeTensorInfo(t,r.dtype),a=o.texData.get(s.dataId);Object.assign(a,n),a.refCount=1,a.shape=t,a.dtype=r.dtype;let i=et.computeFlatOffset(e,x.computeStrides(r.shape));n.slice&&(i+=n.slice.flatOffset),a.slice={flatOffset:i,origDataId:n.slice&&n.slice.origDataId||r.dataId};let p=o.dataRefCount.get(a.slice.origDataId)||1;return o.dataRefCount.set(a.slice.origDataId,p+1),s}function ps(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{begin:s,size:a}=o,[i,p]=et.parseSliceParams(n,s,a);if(et.assertParamsValid(n,i,p),x.sizeFromShape(p)===0)return t.makeTensorInfo(p,n.dtype,[]);if(t.shouldExecuteOnCPU([n])||n.dtype===\"string\"){let l=t.texData.get(n.dataId),m=O$(l.values,i,p,n.shape,n.dtype);return t.makeTensorInfo(p,n.dtype,m)}let{isPacked:u}=t.texData.get(n.dataId),c=et.isSliceContinous(n.shape,i,p);if(u||!c){let l=P().getBool(\"WEBGL_PACK_ARRAY_OPERATIONS\")?new vh(p):new Sh(p),m=[i];return t.runWebGLProgram(l,[n],n.dtype,m)}return t.uploadToGPU(n.dataId),QY(n,i,p,t)}var qR={kernelName:qn,backendName:\"webgl\",kernelFunc:ps};var ZY=r=>{let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{blockShape:s,crops:a}=o;x.assert(n.shape.length<=4,()=>\"batchToSpaceND for rank > 4 with a WebGL backend not implemented yet\");let i=s.reduce((b,C)=>b*C),p=I.getReshaped(n.shape,s,i),u=I.getPermuted(p.length,s.length),c=I.getReshapedPermuted(n.shape,s,i),l=I.getSliceBeginCoords(a,s.length),m=I.getSliceSize(c,a,s.length),f=[],d=J({inputs:{x:n},backend:t,attrs:{shape:p}}),h=xt({inputs:{x:d},backend:t,attrs:{perm:u}}),g=J({inputs:{x:h},backend:t,attrs:{shape:c}}),y=ps({inputs:{x:g},backend:t,attrs:{begin:l,size:m}});return f.push(d),f.push(h),f.push(g),f.forEach(b=>t.disposeIntermediateTensorInfo(b)),y},KR={kernelName:hs,backendName:\"webgl\",kernelFunc:ZY};function JY(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,weights:s}=e,{size:a}=o,i=t.readSync(n.dataId),p=t.readSync(s.dataId),u=oh(i,p,s.dtype,s.shape,a);return t.makeTensorInfo([a],s.dtype,u)}var jR={kernelName:up,backendName:\"webgl\",kernelFunc:JY};function eQ(r){let{inputs:e,backend:t}=r,{s0:o,s1:n}=e,s=t.readSync(o.dataId),a=t.readSync(n.dataId),i=I.assertAndGetBroadcastShape(Array.from(s),Array.from(a));return t.makeTensorInfo([i.length],\"int32\",Int32Array.from(i))}var XR={kernelName:pp,backendName:\"webgl\",kernelFunc:eQ};var tQ=\"return float(a != b);\",Fw=ot({opSnippet:tQ,cpuKernelImpl:N$,dtype:\"bool\"}),YR={kernelName:go,backendName:\"webgl\",kernelFunc:Fw};function La(r){let{inputs:e,backend:t}=r,{input:o}=e,n=t.texData.get(o.dataId);return Rt({inputs:{x:n.complexTensorInfos.real},backend:t})}var QR={kernelName:la,backendName:\"webgl\",kernelFunc:La};var rQ=\"return float(int(x));\";function ZR(r,e){let t=new fr(r.shape,rQ),o=e.runWebGLProgram(t,[r],\"int32\");return{dataId:o.dataId,shape:o.shape,dtype:o.dtype}}function Dw(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{dtype:s}=o;if(s===\"complex64\"){if(n.dtype===\"complex64\")return Rt({inputs:{x:n},backend:t});let a=Wr(n.shape),i=Dw({inputs:{x:n},backend:t,attrs:{dtype:\"float32\"}}),p=Ar({inputs:{real:i,imag:a},backend:t});return a.dispose(),t.disposeIntermediateTensorInfo(i),p}if(n.dtype===\"complex64\"){let a=La({inputs:{input:n},backend:t}),i=Dw({inputs:{x:a},backend:t,attrs:{dtype:s}});return t.disposeIntermediateTensorInfo(a),i}if(!x.hasEncodingLoss(n.dtype,s)){let a=Rt({inputs:{x:n},backend:t});return{dataId:a.dataId,shape:a.shape,dtype:s}}if(t.shouldExecuteOnCPU([n])){let a=t.texData.get(n.dataId).values,[i,p,u]=i$(a,n.shape,n.dtype,s);return t.makeTensorInfo(i,p,u)}if(s===\"int32\")return ZR(n,t);if(s===\"bool\"){let a=t.makeTensorInfo([],\"bool\",x.getTypedArrayFromDType(\"bool\",1)),p=Fw({inputs:{a:n,b:a},backend:t});return t.disposeIntermediateTensorInfo(a),p}throw new Error(`Error in Cast: failed to cast ${n.dtype} to ${s}`)}var JR={kernelName:to,backendName:\"webgl\",kernelFunc:Dw};var eA=\"return ceil(x);\",oQ=he({opSnippet:eA,packedOpSnippet:eA,cpuKernelImpl:u$}),tA={kernelName:ro,backendName:\"webgl\",kernelFunc:oQ};var kh=class{constructor(e){this.variableNames=[\"A\"],this.customUniforms=[{name:\"minVal\",type:\"float\"},{name:\"maxVal\",type:\"float\"}],this.outputShape=e,this.userCode=`\n\n void main() {\n float value = getAAtOutCoords();\n if (isnan(value)) {\n setOutput(value);\n return;\n }\n\n setOutput(clamp(value, minVal, maxVal));\n }\n `}};var Th=class{constructor(e){this.variableNames=[\"A\"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:\"minVal\",type:\"float\"},{name:\"maxVal\",type:\"float\"}],this.outputShape=e,this.userCode=`\n void main() {\n vec4 value = getAAtOutCoords();\n\n if (any(isnan(value))) {\n setOutput(value);\n return;\n }\n\n setOutput(clamp(value, vec4(minVal), vec4(maxVal)));\n }\n `}};function nQ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{clipValueMin:s,clipValueMax:a}=o,i;P().getBool(\"WEBGL_PACK_CLIP\")?i=new Th(n.shape):i=new kh(n.shape);let p=[[s],[a]];return t.runWebGLProgram(i,[n],n.dtype,p)}var rA={kernelName:Ro,backendName:\"webgl\",kernelFunc:nQ};var Nh=class{constructor(e){this.variableNames=[\"real\",\"imag\"],this.outputShape=e,this.userCode=`\n void main() {\n float re = abs(getRealAtOutCoords());\n float im = abs(getImagAtOutCoords());\n float mx = max(re, im);\n\n // sadly the length function in glsl is not underflow-safe\n // (at least not on Intel GPUs). So the safe solution is\n // to ensure underflow-safety in all cases.\n setOutput(\n mx == 0.0 ? 0.0 : mx * length(vec2(1, min(re, im)/mx))\n );\n }\n `}};function oA(r,e){return{dataId:e.dataId,dtype:e.dtype,shape:r.shape}}function sQ(r){let{inputs:e,backend:t}=r,{x:o}=e,n=t.texData.get(o.dataId),s=new Nh(o.shape),a=[oA(o,n.complexTensorInfos.real),oA(o,n.complexTensorInfos.imag)];return t.runWebGLProgram(s,a,a[0].dtype)}var nA={kernelName:cp,backendName:\"webgl\",kernelFunc:sQ};var _h=class{constructor(e){this.outputShape=[],this.outputShape=I.computeOutShape(e,1),this.variableNames=e.map((a,i)=>`T${i}`);let t=new Array(e.length-1);t[0]=e[0][1];for(let a=1;a`T${g}`);let p=new Array(e.length-1);p[0]=e[0][t];for(let h=1;h= ${p[h-1]}) {\n return getChannel(\n getT${h}(${Eh(i,u,g)}),\n vec2(${Eh(c,u,g)}));\n }`}let f=p.length,d=p[p.length-1];m+=`\n return getChannel(\n getT${f}(${Eh(i,u,d)}),\n vec2(${Eh(c,u,d)}));`,this.userCode=`\n float getValue(${i.map(h=>\"int \"+h)}) {\n ${m}\n }\n\n void main() {\n ${s} coords = getOutputCoords();\n vec4 result = vec4(getValue(${a}), 0., 0., 0.);\n\n ${a[n-1]} = ${a[n-1]} + 1;\n if (${a[n-1]} < ${o[n-1]}) {\n result.g = getValue(${a});\n }\n\n ${a[n-2]} = ${a[n-2]} + 1;\n if (${a[n-2]} < ${o[n-2]}) {\n result.a = getValue(${a});\n }\n\n ${a[n-1]} = ${a[n-1]} - 1;\n if (${a[n-2]} < ${o[n-2]} &&\n ${a[n-1]} < ${o[n-1]}) {\n result.b = getValue(${a});\n }\n setOutput(result);\n }\n `}};function Eh(r,e,t){let o=r.indexOf(e);return r.map((s,a)=>a===o?`${s} - ${t}`:s).join()}function Lu(r){let{inputs:e,backend:t}=r,{input:o}=e,n=t.texData.get(o.dataId);return Rt({inputs:{x:n.complexTensorInfos.imag},backend:t})}var sA={kernelName:Ya,backendName:\"webgl\",kernelFunc:Lu};function yc(r,e,t){let o=r[0].dtype;if(o===\"complex64\"){let l=r.map(g=>La({inputs:{input:g},backend:t})),m=r.map(g=>Lu({inputs:{input:g},backend:t})),f=yc(l,e,t),d=yc(m,e,t),h=Ar({inputs:{real:f,imag:d},backend:t});return l.forEach(g=>t.disposeIntermediateTensorInfo(g)),m.forEach(g=>t.disposeIntermediateTensorInfo(g)),t.disposeIntermediateTensorInfo(f),t.disposeIntermediateTensorInfo(d),h}let n=t.shouldExecuteOnCPU(r);if(o===\"string\"&&(n=!0),n){let l=r.map(b=>{let w=[-1,x.sizeFromShape(b.shape.slice(e))];return J({inputs:{x:b},backend:t,attrs:{shape:w}})}),m=l.map(b=>({vals:t.readSync(b.dataId),shape:b.shape})),f=I.computeOutShape(l.map(b=>b.shape),1),d=l[0].shape[0]===1,h=p$(m,f,o,d),g=I.computeOutShape(r.map(b=>b.shape),e),y=t.makeTensorInfo(g,o,h);return l.forEach(b=>t.disposeIntermediateTensorInfo(b)),y}let s=P().getNumber(\"WEBGL_MAX_TEXTURES_IN_SHADER\");if(r.length>s){let l=[];for(let f=0;f1){let l=new $h(r.map(m=>m.shape),e);return t.runWebGLProgram(l,r,o)}let{tensors2D:a,outShape:i}=aQ(r,e,t),p=new _h(a.map(l=>l.shape)),u=t.runWebGLProgram(p,a,o);a.forEach(l=>t.disposeIntermediateTensorInfo(l));let c=J({inputs:{x:u},attrs:{shape:i},backend:t});return t.disposeIntermediateTensorInfo(u),c}function aQ(r,e,t){let o=I.computeOutShape(r.map(s=>s.shape),e);return{tensors2D:r.map(s=>J({inputs:{x:s},attrs:{shape:[-1,x.sizeFromShape(s.shape.slice(e))]},backend:t})),outShape:o}}function Pw(r){let{inputs:e,backend:t,attrs:o}=r,{axis:n}=o,s=x.parseAxisParam(n,e[0].shape)[0],a=e.map(u=>u.shape);I.assertParamsConsistent(a,s);let i=I.computeOutShape(e.map(u=>u.shape),s);if(x.sizeFromShape(i)===0)return t.makeTensorInfo(i,e[0].dtype,[]);let p=e.filter(u=>x.sizeFromShape(u.shape)>0);return p.length===1?Rt({inputs:{x:p[0]},backend:t}):yc(p,s,t)}var aA={kernelName:gs,backendName:\"webgl\",kernelFunc:Pw};var bc=class{constructor(e,t=!1,o=null,n=!1,s=!1){this.variableNames=[\"x\",\"W\"],this.outputShape=e.outShape;let a=e.padInfo.top,i=e.padInfo.left,p=e.strideHeight,u=e.strideWidth,c=e.dilationHeight,l=e.dilationWidth,m=e.filterHeight,f=e.filterWidth,d=Math.floor(e.inChannels/4)*4,h=e.inChannels%4,g=e.dataFormat===\"channelsLast\",y=g?1:2,b=g?2:3,C=g?3:1,w=\"\",k=\"\";o&&(n?w=`float activation(float a) {\n float b = getPreluActivationWeightsAtOutCoords();\n ${o}\n }`:s?w=`float activation(float a) {\n float b = getLeakyreluAlphaAtOutCoords();\n ${o}\n }`:w=`\n float activation(float x) {\n ${o}\n }\n `,k=\"result = activation(result);\");let _=t?\"result += getBiasAtOutCoords();\":\"\";t&&this.variableNames.push(\"bias\"),n&&this.variableNames.push(\"preluActivationWeights\"),s&&this.variableNames.push(\"leakyreluAlpha\"),this.userCode=`\n ${w}\n\n const ivec2 strides = ivec2(${p}, ${u});\n const ivec2 pads = ivec2(${a}, ${i});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d2 = coords[${C}];\n\n ivec2 xRCCorner =\n ivec2(coords[${y}], coords[${b}]) * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // Convolve x(?, ?, d1) with w(:, :, d1, d2) to get y(yR, yC, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${m}; wR++) {\n int xR = xRCorner + wR * ${c};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${f}; wC++) {\n int xC = xCCorner + wC * ${l};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n for (int d1 = 0; d1 < ${d}; d1 += 4) {\n vec4 wValues = vec4(\n getW(wR, wC, d1, d2),\n getW(wR, wC, d1 + 1, d2),\n getW(wR, wC, d1 + 2, d2),\n getW(wR, wC, d1 + 3, d2)\n );\n\n if (${g}) {\n vec4 xValues = vec4(\n getX(batch, xR, xC, d1),\n getX(batch, xR, xC, d1 + 1),\n getX(batch, xR, xC, d1 + 2),\n getX(batch, xR, xC, d1 + 3)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec4 xValues = vec4(\n getX(batch, d1, xR, xC),\n getX(batch, d1 + 1, xR, xC),\n getX(batch, d1 + 2, xR, xC),\n getX(batch, d1 + 3, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n }\n\n if (${h===1}) {\n\n if (${g}) {\n dotProd +=\n getX(batch, xR, xC, ${d}) *\n getW(wR, wC, ${d}, d2);\n } else {\n dotProd +=\n getX(batch, ${d}, xR, xC) *\n getW(wR, wC, ${d}, d2);\n }\n\n } else if (${h===2}) {\n vec2 wValues = vec2(\n getW(wR, wC, ${d}, d2),\n getW(wR, wC, ${d} + 1, d2)\n );\n\n if (${g}) {\n vec2 xValues = vec2(\n getX(batch, xR, xC, ${d}),\n getX(batch, xR, xC, ${d} + 1)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec2 xValues = vec2(\n getX(batch, ${d}, xR, xC),\n getX(batch, ${d} + 1, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n\n } else if (${h===3}) {\n vec3 wValues = vec3(\n getW(wR, wC, ${d}, d2),\n getW(wR, wC, ${d} + 1, d2),\n getW(wR, wC, ${d} + 2, d2)\n );\n\n if (${g}) {\n vec3 xValues = vec3(\n getX(batch, xR, xC, ${d}),\n getX(batch, xR, xC, ${d} + 1),\n getX(batch, xR, xC, ${d} + 2)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec3 xValues = vec3(\n getX(batch, ${d}, xR, xC),\n getX(batch, ${d} + 1, xR, xC),\n getX(batch, ${d} + 2, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n\n }\n }\n }\n\n float result = dotProd;\n ${_}\n ${k}\n setOutput(result);\n }\n `}},Rh=class{constructor(e){this.variableNames=[\"x\",\"W\"],this.outputShape=e.outShape;let t=e.padInfo.front,o=e.padInfo.top,n=e.padInfo.left,s=e.strideDepth,a=e.strideHeight,i=e.strideWidth,p=e.dilationDepth,u=e.dilationHeight,c=e.dilationWidth,l=e.filterDepth,m=e.filterHeight,f=e.filterWidth,d=Math.floor(e.inChannels/4)*4,h=e.inChannels%4;this.userCode=`\n const ivec3 strides = ivec3(${s}, ${a}, ${i});\n const ivec3 pads = ivec3(${t}, ${o}, ${n});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int d2 = coords.u;\n\n ivec3 xFRCCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xFCorner = xFRCCorner.x;\n int xRCorner = xFRCCorner.y;\n int xCCorner = xFRCCorner.z;\n\n // Convolve x(?, ?, ?, d1) with w(:, :, :, d1, d2) to get\n // y(yF, yR, yC, d2). ? = to be determined. : = across all\n // values in that axis.\n float dotProd = 0.0;\n for (int wF = 0; wF < ${l}; wF++) {\n int xF = xFCorner + wF * ${p};\n\n if (xF < 0 || xF >= ${e.inDepth}) {\n continue;\n }\n\n for (int wR = 0; wR < ${m}; wR++) {\n int xR = xRCorner + wR * ${u};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${f}; wC++) {\n int xC = xCCorner + wC * ${c};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n for (int d1 = 0; d1 < ${d}; d1 += 4) {\n vec4 xValues = vec4(\n getX(batch, xF, xR, xC, d1),\n getX(batch, xF, xR, xC, d1 + 1),\n getX(batch, xF, xR, xC, d1 + 2),\n getX(batch, xF, xR, xC, d1 + 3)\n );\n vec4 wValues = vec4(\n getW(wF, wR, wC, d1, d2),\n getW(wF, wR, wC, d1 + 1, d2),\n getW(wF, wR, wC, d1 + 2, d2),\n getW(wF, wR, wC, d1 + 3, d2)\n );\n\n dotProd += dot(xValues, wValues);\n }\n\n if (${h===1}) {\n dotProd +=\n getX(batch, xF, xR, xC, ${d}) *\n getW(wF, wR, wC, ${d}, d2);\n } else if (${h===2}) {\n vec2 xValues = vec2(\n getX(batch, xF, xR, xC, ${d}),\n getX(batch, xF, xR, xC, ${d} + 1)\n );\n vec2 wValues = vec2(\n getW(wF, wR, wC, ${d}, d2),\n getW(wF, wR, wC, ${d} + 1, d2)\n );\n dotProd += dot(xValues, wValues);\n } else if (${h===3}) {\n vec3 xValues = vec3(\n getX(batch, xF, xR, xC, ${d}),\n getX(batch, xF, xR, xC, ${d} + 1),\n getX(batch, xF, xR, xC, ${d} + 2)\n );\n vec3 wValues = vec3(\n getW(wF, wR, wC, ${d}, d2),\n getW(wF, wR, wC, ${d} + 1, d2),\n getW(wF, wR, wC, ${d} + 2, d2)\n );\n dotProd += dot(xValues, wValues);\n }\n }\n }\n }\n setOutput(dotProd);\n }\n `}};var Cc=class{constructor(e,t=!1,o=null,n=!1,s=!1){this.variableNames=[\"x\",\"W\"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:\"pads\",type:\"ivec2\"},{name:\"strides\",type:\"ivec2\"},{name:\"dilations\",type:\"ivec2\"},{name:\"inDims\",type:\"ivec2\"}],this.outputShape=e.outShape,this.enableShapeUniforms=lt(this.outputShape.length);let a=e.padInfo.left,i=e.strideWidth,p=e.dilationWidth,u=e.filterHeight,c=e.filterWidth,l=c,m=`\n int xR; int xC; int xCOffset;\n vec4 wTexel; vec4 previous; vec4 final;`;for(let g=0;g=0 && xR < inDims[0]) {\n `;for(let g=0;g<(l+1)/2;g++){let y=g*2;if(m+=`\n xC = xCCorner + ${y*p};\n `,i===1){if(y= 0 && xCOffset < inDims[1] && xTexelC${y}Ready == 0) {\n xTexelC${y} = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${y}.zw = vec2(0.0);\n }\n xTexelC${y}Ready = 1;\n }\n `,p===1&&y>0?m+=`\n xC${y} = vec4(xTexelC${y-2}.zw, xTexelC${y}.xy);\n `:m+=`\n xCOffset = xC + 1 - 2;\n\n if (xCOffset >= 0 && xCOffset < inDims[1]) {\n previous = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n previous.zw = vec2(0.0);\n }\n\n xC${y} = vec4(previous.zw, xTexelC${y}.xy);\n } else {\n xC${y} = vec4(0.0, 0.0, xTexelC${y}.xy);\n }\n `):m+=`\n if (xC >= 0 && xC < inDims[1] && xTexelC${y}Ready == 0) {\n xTexelC${y} = getX(batch, xR, xC, d1);\n if (xC + 1 >= inDims[1]) {\n xTexelC${y}.zw = vec2(0.0);\n }\n xTexelC${y}Ready = 1;\n }\n\n xC${y} = xTexelC${y};\n `,y+1= 0 && xCOffset < inDims[1] && xTexelC${y+1}Ready == 0) {\n xTexelC${y+1} = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${y+1}.zw = vec2(0.0);\n }\n xTexelC${y+1}Ready = 1;\n }\n `,p>1?m+=`\n xCOffset -= 2;\n if (xCOffset >= 0 && xCOffset < inDims[1]) {\n previous = getX(batch, xR, xCOffset, d1);\n xC${y+1} = vec4(previous.zw, xTexelC${y+1}.xy);\n } else {\n xC${y+1} = vec4(0.0, 0.0, xTexelC${y+1}.xy);\n }\n `:m+=`\n xC${y+1} = vec4(xTexelC${y}.zw, xTexelC${y+1}.xy);\n `):b===1?m+=`\n xC${y+1} = xTexelC${y};\n `:m+=`\n xCOffset = xC + ${b};\n\n if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${y+1}Ready == 0) {\n xTexelC${y+1} = getX(batch, xR, xCOffset, d1);\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${y+1}.zw = vec2(0.0);\n }\n xTexelC${y+1}Ready = 1;\n }\n\n xC${y+1} = xTexelC${y+1};\n `}}else y= 0 && xCOffset < inDims[1] && xTexelC${y}Ready == 0) {\n xTexelC${y} = getX(batch, xR, xCOffset, d1);\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${y}.zw = vec2(0.0);\n }\n xTexelC${y}Ready = 1;\n }\n\n if(xC + 1 >= 0 && xC + 1 < inDims[1] && xTexelC${y+1}Ready == 0) {\n xTexelC${y+1} = getX(batch, xR, xC + 1, d1);\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xC + 2 >= inDims[1]) {\n xTexelC${y+1}.zw = vec2(0.0);\n }\n xTexelC${y+1}Ready = 1;\n }\n\n xC${y} = vec4(xTexelC${y}.zw, xTexelC${y+1}.zw);\n `,y+1= 0 && xCOffset < inDims[1]) {\n final = getX(batch, xR, xCOffset, d1);\n }\n xC${y+1} = vec4(xTexelC${y+1}.xy, final.xy);\n `)):(m+=`\n if(xC >= 0 && xC < inDims[1] && xTexelC${y}Ready == 0) {\n xTexelC${y} = getX(batch, xR, xC, d1);\n if (xC + 1 >= inDims[1]) {\n xTexelC${y}.zw = vec2(0.0);\n }\n xTexelC${y}Ready = 1;\n }\n\n xCOffset = xC + strides[1];\n if(xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${y+1}Ready == 0) {\n xTexelC${y+1} = getX(batch, xR, xCOffset, d1);\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${y+1}.zw = vec2(0.);\n }\n xTexelC${y+1}Ready = 1;\n }\n\n xC${y} = vec4(\n xTexelC${y}.xy, xTexelC${y+1}.xy);\n `,y+1= 0) {\n // Use custom imod instead mod. On Intel GPU, mod may generate\n // unexpected value.\n // https://github.com/tensorflow/tfjs/issues/5447\n offsetX = imod(blockIndex, outWidth) * stride[1] - pad[1];\n d1 = offsetX + dilation[1] * (imod(pos, itemsPerBlockRow) /\n inChannels);\n\n if(d1 < inputShape[${i}] && d1 >= 0) {\n\n ch = imod(pos, inChannels);\n\n if (${s}) {\n innerDims = vec2(d1, ch);\n result[${c*2+l}] = getChannel(\n getA(rc.x, d0, int(innerDims.x),\n int(innerDims.y)), innerDims);\n } else {\n innerDims = vec2(d0, d1);\n result[${c*2+l}] = getChannel(\n getA(rc.x, ch, int(innerDims.x),\n int(innerDims.y)), innerDims);\n }\n }\n }\n }\n `;this.userCode=`\n void main() {\n ivec3 rc = getOutputCoords();\n\n vec4 result = vec4(0);\n\n int blockIndex, pos, offsetY, d0, offsetX, d1, ch;\n vec2 innerDims;\n\n ${u}\n\n ${n.output} = result;\n }\n `}};function Fh(r,e){let t=r.length;return t>=3?e?[...r.slice(0,-3),r[t-3]*r[t-2],r[t-1]]:[...r.slice(0,-3),r[t-3],r[t-2]*r[t-1]]:!e&&t===1&&r[0]>1?[r[0],1]:null}function Dh({x:r,filter:e,convInfo:t,backend:o,bias:n=null,preluActivationWeights:s=null,leakyreluAlpha:a=0,activation:i=null}){let p=r.shape,u=o.texData.get(r.dataId),c=t.inChannels,l=p[0]*p[1]*p[2],m=t.outChannels,f=t.dataFormat===\"channelsLast\",d=!1,h=!1,g,y=[];if(s!=null){let w=Fh(s.shape,f);w!=null&&(s=J({inputs:{x:s},backend:o,attrs:{shape:w}}),y.push(s))}if(n!=null){let w=Fh(n.shape,f);w!=null&&(n=J({inputs:{x:n},backend:o,attrs:{shape:w}}),y.push(n))}if(!((l===1||m===1)&&c>Rw)&&u.isPacked&&f&&u.texture!=null&&p[2]%2!==0&&x.arraysEqual(u.shape.slice(-3),p.slice(-3))){let w=p[0]*p[1]*(p[2]+1),k={dataId:r.dataId,shape:[1,w,t.inChannels],dtype:r.dtype},_=u.shape;u.shape=u.shape.slice(),u.shape[u.shape.length-2]++,x.assert(Ti(u.shape,k.shape),()=>`packed reshape ${u.shape} to ${k.shape} isn't free`);let E=J({inputs:{x:e},backend:o,attrs:{shape:[1,t.inChannels,t.outChannels]}});y.push(E);let R=Mu({a:k,b:E,backend:o,transposeA:d,transposeB:h,bias:n,activation:i,preluActivationWeights:s,leakyreluAlpha:a}),A=o.texData.get(R.dataId);x.assert(A.isPacked,()=>\"batchMatMul result is expected to be packed\"),u.shape=_,A.shape=t.outShape,g=Rt({inputs:{x:R},backend:o}),g.shape=t.outShape,y.push(R)}else{let w=t.outHeight*t.outWidth,k=J({inputs:{x:r},backend:o,attrs:{shape:f?[t.batchSize,w,t.inChannels]:[t.batchSize,t.inChannels,w]}}),_=J({inputs:{x:e},backend:o,attrs:{shape:[1,t.inChannels,t.outChannels]}}),E=Mu({a:f?k:_,b:f?_:k,transposeA:!f,transposeB:h,backend:o,bias:n,activation:i,preluActivationWeights:s,leakyreluAlpha:a});g=J({inputs:{x:E},backend:o,attrs:{shape:t.outShape}}),y.push(k),y.push(_),y.push(E)}for(let w of y)o.disposeIntermediateTensorInfo(w);return g}function Ph({x:r,filter:e,convInfo:t,backend:o,bias:n=null,preluActivationWeights:s=null,leakyreluAlpha:a=0,activation:i=null}){let{filterWidth:p,filterHeight:u,inChannels:c,outWidth:l,outHeight:m,dataFormat:f}=t,d=f===\"channelsLast\",h=p*u*c,g=m*l,y=[t.batchSize,h,g],b=!0,C=!1,w=[];if(s!=null){let H=Fh(s.shape,d);H!=null&&(s=J({inputs:{x:s},backend:o,attrs:{shape:H}}),w.push(s))}if(n!=null){let H=Fh(n.shape,d);H!=null&&(n=J({inputs:{x:n},backend:o,attrs:{shape:H}}),w.push(n))}let k=J({inputs:{x:e},backend:o,attrs:{shape:[1,h,x.sizeFromShape(e.shape)/h]}});w.push(k);let _=new Ah(y,t),E=[r.shape,[t.padInfo.top,t.padInfo.left],[t.strideHeight,t.strideWidth],[t.dilationHeight,t.dilationWidth],[t.inChannels],[t.filterWidth*t.inChannels],[t.outWidth]],R=o.runWebGLProgram(_,[r],\"float32\",E),A=J({inputs:{x:R},backend:o,attrs:{shape:y}});w.push(R),w.push(A);let D=n!=null,O=s!=null,M=i===\"leakyrelu\",L=i?Ma(i,!0):null,W=new xc(d?A.shape:k.shape,d?k.shape:A.shape,d?[t.batchSize,g,t.outChannels]:[t.batchSize,t.outChannels,g],b,C,D,L,O,M),V=d?[A,k]:[k,A];if(n&&V.push(n),O&&V.push(s),M){let H=o.makeTensorInfo([],\"float32\",x.createScalarValue(a,\"float32\"));V.push(H),w.push(H)}let G=o.runWebGLProgram(W,V,\"float32\"),q=J({inputs:{x:G},backend:o,attrs:{shape:t.outShape}});w.push(G);for(let H of w)o.disposeIntermediateTensorInfo(H);return q}function iQ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,filter:s}=e,{strides:a,pad:i,dataFormat:p,dilations:u,dimRoundingMode:c}=o,l=I.convertConv2DDataFormat(p),m=I.computeConv2DInfo(n.shape,s.shape,a,u,i,c,!1,l),f;if(m.filterHeight===1&&m.filterWidth===1&&m.dilationHeight===1&&m.dilationWidth===1&&m.strideHeight===1&&m.strideWidth===1&&(m.padInfo.type===\"SAME\"||m.padInfo.type===\"VALID\"))f=Dh({x:n,filter:s,convInfo:m,backend:t});else if(m.strideWidth<=2&&l===\"channelsLast\"&&P().getBool(\"WEBGL_EXP_CONV\")){let h=new Cc(m),g=[[m.padInfo.top,m.padInfo.left],[m.strideHeight,m.strideWidth],[m.dilationHeight,m.dilationWidth],[m.inHeight,m.inWidth]];f=t.runWebGLProgram(h,[n,s],\"float32\",g)}else if(P().getBool(\"WEBGL_CONV_IM2COL\"))f=Ph({x:n,filter:s,convInfo:m,backend:t});else{let h=new bc(m);f=t.runWebGLProgram(h,[n,s],\"float32\")}let d=J({inputs:{x:f},backend:t,attrs:{shape:m.outShape}});return t.disposeIntermediateTensorInfo(f),d}var iA={kernelName:ln,backendName:\"webgl\",kernelFunc:iQ};var Oh=class{constructor(e){this.variableNames=[\"x\",\"dy\"],this.outputShape=e.filterShape;let t=e.strideHeight,o=e.strideWidth,n=e.padInfo.top,s=e.padInfo.left,a=e.dataFormat===\"channelsLast\";this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int wR = coords.x;\n int wC = coords.y;\n int d1 = coords.z;\n int d2 = coords.w;\n\n // Convolve x(?, ?, d1) with dy(:, :, d2) to get dw(wR, wC, d1, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int b = 0; b < ${e.batchSize}; b++) {\n for (int yR = 0; yR < ${e.outHeight}; yR++) {\n int xR = wR + yR * ${t} - ${n};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int yC = 0; yC < ${e.outWidth}; yC++) {\n int xC = wC + yC * ${o} - ${s};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n if (${a}) {\n float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);\n } else {\n float dyValue = getDy(b, d2, yR, yC);\n float xValue = getX(b, d1, xR, xC);\n dotProd += (xValue * dyValue);\n }\n\n }\n }\n }\n setOutput(dotProd);\n }\n `}},Mh=class{constructor(e){this.variableNames=[\"dy\",\"W\"],this.outputShape=e.inShape;let t=e.filterHeight,o=e.filterWidth,n=e.strideHeight,s=e.strideWidth,a=e.dataFormat===\"channelsLast\",i=t-1-e.padInfo.top,p=o-1-e.padInfo.left,u=a?1:2,c=a?2:3,l=a?3:1;this.userCode=`\n const ivec2 pads = ivec2(${i}, ${p});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords[${l}];\n\n ivec2 dyCorner = ivec2(coords[${u}], coords[${c}]) - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${t}; wR++) {\n float dyR = float(dyRCorner + wR) / ${n}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = ${t} - 1 - wR;\n\n for (int wC = 0; wC < ${o}; wC++) {\n float dyC = float(dyCCorner + wC) / ${s}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = ${o} - 1 - wC;\n\n for (int d2 = 0; d2 < ${e.outChannels}; d2++) {\n\n if (${a}) {\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n } else {\n float xValue = getDy(batch, d2, idyR, idyC);\n float wValue = getW(wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n }\n\n }\n }\n }\n setOutput(dotProd);\n }\n `}},Lh=class{constructor(e){this.variableNames=[\"x\",\"dy\"],this.outputShape=e.filterShape;let t=e.strideDepth,o=e.strideHeight,n=e.strideWidth,s=e.padInfo.front,a=e.padInfo.top,i=e.padInfo.left;this.userCode=`\n void main() {\n ivec5 coords = getOutputCoords();\n int wF = coords.x;\n int wR = coords.y;\n int wC = coords.z;\n int d1 = coords.w;\n int d2 = coords.u;\n\n float dotProd = 0.0;\n\n for (int b = 0; b < ${e.batchSize}; b++) {\n for (int yF = 0; yF < ${e.outDepth}; yF++) {\n int xF = wF + yF * ${t} - ${s};\n\n if (xF < 0 || xF >= ${e.inDepth}) {\n continue;\n }\n\n for (int yR = 0; yR < ${e.outHeight}; yR++) {\n int xR = wR + yR * ${o} - ${a};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int yC = 0; yC < ${e.outWidth}; yC++) {\n int xC = wC + yC * ${n} - ${i};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n float dyValue = getDy(b, yF, yR, yC, d2);\n float xValue = getX(b, xF, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n }\n setOutput(dotProd);\n }\n `}},Bh=class{constructor(e){this.variableNames=[\"dy\",\"W\"],this.outputShape=e.inShape;let t=e.filterDepth,o=e.filterHeight,n=e.filterWidth,s=e.strideDepth,a=e.strideHeight,i=e.strideWidth,p=t-1-e.padInfo.front,u=o-1-e.padInfo.top,c=n-1-e.padInfo.left;this.userCode=`\n const ivec3 pads = ivec3(${p}, ${u}, ${c});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int d1 = coords.u;\n\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyFCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n float dotProd = 0.0;\n for (int wF = 0; wF < ${t}; wF++) {\n float dyF = float(dyFCorner + wF) / ${s}.0;\n\n if (dyF < 0.0 || dyF >= ${e.outDepth}.0 || fract(dyF) > 0.0) {\n continue;\n }\n int idyF = int(dyF);\n\n int wFPerm = ${t} - 1 - wF;\n\n for (int wR = 0; wR < ${o}; wR++) {\n float dyR = float(dyRCorner + wR) / ${a}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = ${o} - 1 - wR;\n\n for (int wC = 0; wC < ${n}; wC++) {\n float dyC = float(dyCCorner + wC) / ${i}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = ${n} - 1 - wC;\n\n for (int d2 = 0; d2 < ${e.outChannels}; d2++) {\n float xValue = getDy(batch, idyF, idyR, idyC, d2);\n float wValue = getW(wFPerm, wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n }\n }\n }\n }\n setOutput(dotProd);\n }\n `}};function uQ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,dy:s}=e,{strides:a,pad:i,dataFormat:p,dimRoundingMode:u,filterShape:c}=o,l=I.convertConv2DDataFormat(p),m=I.computeConv2DInfo(n.shape,c,a,1,i,u,!1,l),f=new Oh(m);return t.runWebGLProgram(f,[n,s],\"float32\")}var uA={kernelName:lp,backendName:\"webgl\",kernelFunc:uQ};function pQ(r){let{inputs:e,backend:t,attrs:o}=r,{dy:n,filter:s}=e,{inputShape:a,strides:i,pad:p,dataFormat:u,dimRoundingMode:c}=o,l=I.convertConv2DDataFormat(u),m=I.computeConv2DInfo(a,s.shape,i,1,p,c,!1,l),f=new Mh(m);return t.runWebGLProgram(f,[n,s],\"float32\")}var pA={kernelName:mn,backendName:\"webgl\",kernelFunc:pQ};function cQ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,filter:s}=e,{strides:a,pad:i,dilations:p}=o,u=I.computeConv3DInfo(n.shape,s.shape,a,p,i),c=new Rh(u);return t.runWebGLProgram(c,[n,s],\"float32\")}var cA={kernelName:mp,backendName:\"webgl\",kernelFunc:cQ};function lQ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,dy:s}=e,{strides:a,pad:i,filterShape:p}=o,u=I.computeConv3DInfo(n.shape,p,a,1,i),c=new Lh(u);return t.runWebGLProgram(c,[n,s],\"float32\")}var lA={kernelName:Dm,backendName:\"webgl\",kernelFunc:lQ};function mQ(r){let{inputs:e,backend:t,attrs:o}=r,{dy:n,filter:s}=e,{pad:a,strides:i,inputShape:p}=o,u=I.computeConv3DInfo(p,s.shape,i,1,a),c=new Bh(u);return t.runWebGLProgram(c,[n,s],\"float32\")}var mA={kernelName:fp,backendName:\"webgl\",kernelFunc:mQ};var fQ=jo+`\n return cos(x);\n`,dQ=he({opSnippet:fQ}),fA={kernelName:fn,backendName:\"webgl\",kernelFunc:dQ};var hQ=`\n float e2x = exp(-x);\n return (e2x + 1.0 / e2x) / 2.0;\n`,gQ=he({opSnippet:hQ}),dA={kernelName:dn,backendName:\"webgl\",kernelFunc:gQ};var Vh=class{constructor(e,t,o,n,s){this.variableNames=[\"Image\",\"Boxes\",\"BoxInd\"],this.outputShape=[];let[a,i,p,u]=e,[c]=t,[l,m]=o;this.outputShape=[c,l,m,u];let f=n===\"bilinear\"?1:0,[d,h]=[`${i-1}.0`,`${p-1}.0`],[g,y,b]=l>1?[`${(i-1)/(l-1)}`,\"(y2-y1) * height_ratio\",`y1*${d} + float(y)*(height_scale)`]:[\"0.0\",\"0.0\",`0.5 * (y1+y2) * ${d}`],[C,w,k]=m>1?[`${(p-1)/(m-1)}`,\"(x2-x1) * width_ratio\",`x1*${h} + float(x)*(width_scale)`]:[\"0.0\",\"0.0\",`0.5 * (x1+x2) * ${h}`];this.userCode=`\n const float height_ratio = float(${g});\n const float width_ratio = float(${C});\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int y = coords[1];\n int x = coords[2];\n int d = coords[3];\n\n // get box vals\n float y1 = getBoxes(b,0);\n float x1 = getBoxes(b,1);\n float y2 = getBoxes(b,2);\n float x2 = getBoxes(b,3);\n\n // get image in batch index\n int bInd = round(getBoxInd(b));\n if(bInd < 0 || bInd >= ${a}) {\n return;\n }\n\n float height_scale = ${y};\n float width_scale = ${w};\n\n float in_y = ${b};\n if( in_y < 0.0 || in_y > ${d} ) {\n setOutput(float(${s}));\n return;\n }\n float in_x = ${k};\n if( in_x < 0.0 || in_x > ${h} ) {\n setOutput(float(${s}));\n return;\n }\n\n vec2 sourceFracIndexCR = vec2(in_x,in_y);\n if(${f} == 1) {\n // Compute the four integer indices.\n ivec2 sourceFloorCR = ivec2(sourceFracIndexCR);\n ivec2 sourceCeilCR = ivec2(ceil(sourceFracIndexCR));\n\n float topLeft = getImage(b, sourceFloorCR.y, sourceFloorCR.x, d);\n float bottomLeft = getImage(b, sourceCeilCR.y, sourceFloorCR.x, d);\n float topRight = getImage(b, sourceFloorCR.y, sourceCeilCR.x, d);\n float bottomRight = getImage(b, sourceCeilCR.y, sourceCeilCR.x, d);\n\n vec2 fracCR = sourceFracIndexCR - vec2(sourceFloorCR);\n\n float top = topLeft + (topRight - topLeft) * fracCR.x;\n float bottom = bottomLeft + (bottomRight - bottomLeft) * fracCR.x;\n float newValue = top + (bottom - top) * fracCR.y;\n setOutput(newValue);\n } else {\n // Compute the coordinators of nearest neighbor point.\n ivec2 sourceNearestCR = ivec2(floor(\n sourceFracIndexCR + vec2(0.5,0.5)));\n float newValue = getImage(b, sourceNearestCR.y, sourceNearestCR.x, d);\n setOutput(newValue);\n }\n }\n `}};var xQ=r=>{let{inputs:e,backend:t,attrs:o}=r,{image:n,boxes:s,boxInd:a}=e,{cropSize:i,method:p,extrapolationValue:u}=o,c=new Vh(n.shape,s.shape,i,p,u);return t.runWebGLProgram(c,[n,s,a],\"float32\")},hA={kernelName:xn,backendName:\"webgl\",kernelFunc:xQ};var Bu;(function(r){r.Prod=\"*\",r.Sum=\"+\"})(Bu||(Bu={}));var Ml=class{constructor(e,t,o,n){this.op=e,this.outputShape=t,this.variableNames=[\"x\"],this.customUniforms=[{name:\"index\",type:\"float\"}];let s=this.outputShape.length,a=this.op===Bu.Prod?\"1.0\":\"0.0\",i=o?a:`getX(${gA(s,\"coords\",this.op)})`,p=this.outputShape[this.outputShape.length-1],u=\"\",c=\"\";o?(u=n?`end != ${p-1}`:\"end != 0\",c=n?\"end + 1\":\"end - 1\"):(u=n?`end + pow2 < ${p}`:\"end >= pow2\",c=n?\"end + pow2\":\"end - pow2\"),this.userCode=`\n void main() {\n ${_e(s)} coords = getOutputCoords();\n int end = ${xA(s,\"coords\",this.op)};\n float val = ${i};\n int pow2 = int(pow(2.0, index));\n if (${u}) {\n int idx = ${c};\n ${xA(s,\"coords\",this.op)} = idx;\n val ${this.op}= getX(${gA(s,\"coords\",this.op)});\n }\n setOutput(val);\n }\n `}};function gA(r,e,t){if(r===1)return`${e}`;if(r===2)return`${e}.x, ${e}.y`;if(r===3)return`${e}.x, ${e}.y, ${e}.z`;if(r===4)return`${e}.x, ${e}.y, ${e}.z, ${e}.w`;throw new Error(`Cumulative ${t} for rank ${r} is not yet supported`)}function xA(r,e,t){if(r===1)return`${e}`;if(r===2)return`${e}.y`;if(r===3)return`${e}.z`;if(r===4)return`${e}.w`;throw new Error(`Cumulative ${t} for rank ${r} is not yet supported`)}function zh(r,e,t,o,n,s){let a=e.shape.length,i=I.getAxesPermutation([o],a),p=e;i!=null&&(p=xt({inputs:{x:e},backend:t,attrs:{perm:i}}));let u=I.getInnerMostAxes(1,a)[0];if(u!==a-1)throw new Error(`WebGL cumprod shader expects an inner-most axis=${e.shape.length-1} but got axis=${o}`);let c=p.shape[u],l=Rt({inputs:{x:p},backend:t});for(let m=0;m<=Math.ceil(Math.log2(c))-1;m++){let f=new Ml(r,p.shape,!1,s),d=[[m]],h=l;l=t.runWebGLProgram(f,[l],l.dtype,d),t.disposeIntermediateTensorInfo(h)}if(n){let m=new Ml(r,p.shape,n,s),f=l;l=t.runWebGLProgram(m,[l],l.dtype),t.disposeIntermediateTensorInfo(f)}if(i!=null){let m=I.getUndoAxesPermutation(i),f=xt({inputs:{x:l},backend:t,attrs:{perm:m}});return t.disposeIntermediateTensorInfo(l),t.disposeIntermediateTensorInfo(p),f}return l}function yQ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s,exclusive:a,reverse:i}=o;return zh(Bu.Prod,n,t,s,a,i)}var yA={kernelName:hn,backendName:\"webgl\",kernelFunc:yQ};function bQ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s,exclusive:a,reverse:i}=o;return zh(Bu.Sum,n,t,s,a,i)}var bA={kernelName:gn,backendName:\"webgl\",kernelFunc:bQ};function CQ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,weights:s}=e,{size:a,binaryOutput:i}=o;if(n.shape.length===1){let p=t.readSync(n.dataId),u=t.readSync(s.dataId),c=oh(p,u,s.dtype,s.shape,a);return t.makeTensorInfo([a],s.dtype,c)}else if(n.shape.length===2){let p=t.bufferSync(n),u=t.bufferSync(s),c=a$(p,u,a,i);return t.makeTensorInfo(c.shape,s.dtype,c.values)}throw new Error(`Error in denseBincount: input must be at most rank 2, but got rank${n.shape.length}.`)}var CA={kernelName:dp,backendName:\"webgl\",kernelFunc:CQ};var Wh=class{constructor(e,t,o){this.variableNames=[\"x\"],this.outputShape=[],this.outputShape=e,this.blockSize=t,this.dataFormat=o,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int h = ${this.getHeightCoordString()};\n int w = ${this.getWidthCoordString()};\n int d = ${this.getDepthCoordString()};\n\n int in_h = h / ${t};\n int offset_h = imod(h, ${t});\n int in_w = w / ${t};\n int offset_w = imod(w, ${t});\n int offset_d = (offset_h * ${t} + offset_w) *\n ${this.getOutputDepthSize()};\n int in_d = d + offset_d;\n\n float result = ${this.getInputSamplingString()};\n setOutput(result);\n }\n `}getHeightCoordString(){return this.dataFormat===\"NHWC\"?\"coords[1]\":\"coords[2]\"}getWidthCoordString(){return this.dataFormat===\"NHWC\"?\"coords[2]\":\"coords[3]\"}getDepthCoordString(){return this.dataFormat===\"NHWC\"?\"coords[3]\":\"coords[1]\"}getOutputDepthSize(){return this.dataFormat===\"NHWC\"?this.outputShape[3]:this.outputShape[1]}getInputSamplingString(){return this.dataFormat===\"NHWC\"?\"getX(b, in_h, in_w, in_d)\":\"getX(b, in_d, in_h, in_w)\"}};function IQ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{blockSize:s,dataFormat:a}=o,i=n.shape[0],p=a===\"NHWC\"?n.shape[1]:n.shape[2],u=a===\"NHWC\"?n.shape[2]:n.shape[3],c=a===\"NHWC\"?n.shape[3]:n.shape[1],l=p*s,m=u*s,f=c/(s*s),d=a===\"NHWC\"?[i,l,m,f]:[i,f,l,m],h=new Wh(d,s,a);return t.runWebGLProgram(h,[n],n.dtype)}var IA={kernelName:yn,backendName:\"webgl\",kernelFunc:IQ};var Ic=class{constructor(e,t=!1,o=null,n=!1,s=!1){this.variableNames=[\"x\",\"W\"],this.customUniforms=[{name:\"pads\",type:\"ivec2\"},{name:\"strides\",type:\"ivec2\"},{name:\"dilations\",type:\"ivec2\"},{name:\"inDims\",type:\"ivec2\"}],this.outputShape=e.outShape,this.enableShapeUniforms=lt(this.outputShape.length);let a=e.filterHeight,i=e.filterWidth,p=e.outChannels/e.inChannels,u=\"\",c=\"\";o&&(n?u=`float activation(float a) {\n float b = getPreluActivationWeightsAtOutCoords();\n ${o}\n }`:s?u=`float activation(float a) {\n float b = getLeakyreluAlphaAtOutCoords();\n ${o}\n }`:u=`\n float activation(float x) {\n ${o}\n }\n `,c=\"result = activation(result);\");let l=t?\"result += getBiasAtOutCoords();\":\"\";t&&this.variableNames.push(\"bias\"),n&&this.variableNames.push(\"preluActivationWeights\"),s&&this.variableNames.push(\"leakyreluAlpha\"),this.userCode=`\n ${u}\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords.x;\n ivec2 xRCCorner = coords.yz * strides - pads;\n int d2 = coords.w;\n int d1 = d2 / ${p};\n int q = d2 - d1 * ${p};\n\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // Convolve x(?, ?, d1) with w(:, :, d1, q) to get y(yR, yC, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n // TO DO(dsmilkov): Flatten the two for loops and vec4 the operations.\n for (int wR = 0; wR < ${a}; wR++) {\n int xR = xRCorner + wR * dilations[0];\n\n if (xR < 0 || xR >= inDims[0]) {\n continue;\n }\n\n for (int wC = 0; wC < ${i}; wC++) {\n int xC = xCCorner + wC * dilations[1];\n\n if (xC < 0 || xC >= inDims[1]) {\n continue;\n }\n\n float xVal = getX(batch, xR, xC, d1);\n float wVal = getW(wR, wC, d1, q);\n dotProd += xVal * wVal;\n }\n }\n\n float result = dotProd;\n ${l}\n ${c}\n setOutput(result);\n }\n `}};var wc=class{constructor(e,t=!1,o=null,n=!1,s=!1){this.variableNames=[\"x\",\"W\"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:\"pads\",type:\"ivec2\"},{name:\"strides\",type:\"ivec2\"},{name:\"dilations\",type:\"ivec2\"},{name:\"inDims\",type:\"ivec2\"}],this.outputShape=e.outShape,this.enableShapeUniforms=lt(this.outputShape.length);let a=e.outChannels/e.inChannels,i=e.padInfo.left,p=e.strideWidth,u=e.dilationWidth,c=e.filterHeight,l=e.filterWidth,m=l,f=`\n int xR; int xC; int xCOffset;\n vec4 wTexel; vec4 previous; vec4 final;`;for(let y=0;y=0 && xR < inDims[0]) {\n `;for(let y=0;y<(m+1)/2;y++){let b=y*2;if(f+=`\n xC = xCCorner + ${b*u};\n `,p===1){if(b= 0 && xCOffset < inDims[1] && xTexelC${b}Ready == 0) {\n xTexelC${b} = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${b}.zw = vec2(0.0);\n }\n xTexelC${b}Ready = 1;\n }\n `,u===1&&b>0?f+=`\n xC${b} = vec4(xTexelC${b-2}.zw, xTexelC${b}.xy);\n `:f+=`\n xCOffset = xC + 1 - 2;\n\n if (xCOffset >= 0 && xCOffset < inDims[1]) {\n previous = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n previous.zw = vec2(0.0);\n }\n\n xC${b} = vec4(previous.zw, xTexelC${b}.xy);\n } else {\n xC${b} = vec4(0.0, 0.0, xTexelC${b}.xy);\n }\n `):f+=`\n if (xC >= 0 && xC < inDims[1] && xTexelC${b}Ready == 0) {\n xTexelC${b} = getX(batch, xR, xC, d1);\n if (xC + 1 >= inDims[1]) {\n xTexelC${b}.zw = vec2(0.0);\n }\n xTexelC${b}Ready = 1;\n }\n\n xC${b} = xTexelC${b};\n `,b+1= 0 && xCOffset < inDims[1] && xTexelC${b+1}Ready == 0) {\n xTexelC${b+1} = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${b+1}.zw = vec2(0.0);\n }\n xTexelC${b+1}Ready = 1;\n }\n `,u>1?f+=`\n xCOffset -= 2;\n if (xCOffset >= 0 && xCOffset < inDims[1]) {\n previous = getX(batch, xR, xCOffset, d1);\n xC${b+1} = vec4(previous.zw, xTexelC${b+1}.xy);\n } else {\n xC${b+1} = vec4(0.0, 0.0, xTexelC${b+1}.xy);\n }\n `:f+=`\n xC${b+1} = vec4(xTexelC${b}.zw, xTexelC${b+1}.xy);\n `):C===1?f+=`\n xC${b+1} = xTexelC${b};\n `:f+=`\n xCOffset = xC + ${C};\n\n if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${b+1}Ready == 0) {\n xTexelC${b+1} = getX(batch, xR, xCOffset, d1);\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${b+1}.zw = vec2(0.0);\n }\n xTexelC${b+1}Ready = 1;\n }\n\n xC${b+1} = xTexelC${b+1};\n `}}else b= 0 && xCOffset < inDims[1] && xTexelC${b}Ready == 0) {\n xTexelC${b} = getX(batch, xR, xCOffset, d1);\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${b}.zw = vec2(0.0);\n }\n xTexelC${b}Ready = 1;\n }\n\n if(xC + 1 >= 0 && xC + 1 < inDims[1] && xTexelC${b+1}Ready == 0) {\n xTexelC${b+1} = getX(batch, xR, xC + 1, d1);\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xC + 2 >= inDims[1]) {\n xTexelC${b+1}.zw = vec2(0.0);\n }\n xTexelC${b+1}Ready = 1;\n }\n\n xC${b} = vec4(xTexelC${b}.zw, xTexelC${b+1}.zw);\n `,b+1= 0 && xCOffset < inDims[1]) {\n final = getX(batch, xR, xCOffset, d1);\n }\n xC${b+1} = vec4(xTexelC${b+1}.xy, final.xy);\n `)):(f+=`\n if(xC >= 0 && xC < inDims[1] && xTexelC${b}Ready == 0) {\n xTexelC${b} = getX(batch, xR, xC, d1);\n if (xC + 1 >= inDims[1]) {\n xTexelC${b}.zw = vec2(0.0);\n }\n xTexelC${b}Ready = 1;\n }\n\n xCOffset = xC + strides[1];\n if(xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${b+1}Ready == 0) {\n xTexelC${b+1} = getX(batch, xR, xCOffset, d1);\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${b+1}.zw = vec2(0.);\n }\n xTexelC${b+1}Ready = 1;\n }\n\n xC${b} = vec4(\n xTexelC${b}.xy, xTexelC${b+1}.xy);\n `,b+1`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${a} and dilations '${c}'`);let l=I.computeConv2DInfo(n.shape,s.shape,a,c,i,u,!0),m;P().getBool(\"WEBGL_PACK_DEPTHWISECONV\")&&l.strideWidth<=2&&l.outChannels/l.inChannels===1?m=new wc(l):m=new Ic(l);let f=[[l.padInfo.top,l.padInfo.left],[l.strideHeight,l.strideWidth],[l.dilationHeight,l.dilationWidth],[l.inHeight,l.inWidth]];return t.runWebGLProgram(m,[n,s],\"float32\",f)}var wA={kernelName:bn,backendName:\"webgl\",kernelFunc:wQ};var Uh=class{constructor(e){this.variableNames=[\"x\",\"dy\"],this.outputShape=e.filterShape;let t=e.strideHeight,o=e.strideWidth,n=e.padInfo.top,s=e.padInfo.left,a=e.outChannels/e.inChannels;this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int wR = coords.x;\n int wC = coords.y;\n int d1 = coords.z;\n int dm = coords.w;\n int d2 = d1 * ${a} + dm;\n\n float dotProd = 0.0;\n\n // TO DO: Vec4 over the batch size\n for (int b = 0; b < ${e.batchSize}; b++) {\n for (int yR = 0; yR < ${e.outHeight}; yR++) {\n int xR = wR + yR * ${t} - ${n};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int yC = 0; yC < ${e.outWidth}; yC++) {\n int xC = wC + yC * ${o} - ${s};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n setOutput(dotProd);\n }\n `}},Gh=class{constructor(e){this.variableNames=[\"dy\",\"W\"],this.outputShape=e.inShape;let t=e.filterHeight,o=e.filterWidth,n=e.strideHeight,s=e.strideWidth,a=t-1-e.padInfo.top,i=o-1-e.padInfo.left,p=e.outChannels/e.inChannels;this.userCode=`\n const ivec2 pads = ivec2(${a}, ${i});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords[3];\n ivec2 dyCorner = coords.yz - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n float dotProd = 0.0;\n\n for (int wR = 0; wR < ${t}; wR++) {\n float dyR = float(dyRCorner + wR) / ${n}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = ${t} - 1 - wR;\n\n for (int wC = 0; wC < ${o}; wC++) {\n float dyC = float(dyCCorner + wC) / ${s}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = ${o} - 1 - wC;\n\n // TO DO: Vec4 over the channelMul\n for (int dm = 0; dm < ${p}; dm++) {\n int d2 = d1 * ${p} + dm;\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, dm);\n dotProd += xValue * wValue;\n }\n }\n }\n setOutput(dotProd);\n }\n `}};function SQ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,dy:s}=e,{strides:a,dilations:i,pad:p,dimRoundingMode:u,filterShape:c}=o,l=I.computeConv2DInfo(n.shape,c,a,i,p,u,!0),m=new Uh(l);return t.runWebGLProgram(m,[n,s],\"float32\")}var SA={kernelName:hp,backendName:\"webgl\",kernelFunc:SQ};function vQ(r){let{inputs:e,backend:t,attrs:o}=r,{dy:n,filter:s}=e,{strides:a,dilations:i,pad:p,dimRoundingMode:u,inputShape:c}=o,l=I.computeConv2DInfo(c,s.shape,a,i,p,u,!0),m=new Gh(l);return t.runWebGLProgram(m,[n,s],\"float32\")}var vA={kernelName:gp,backendName:\"webgl\",kernelFunc:vQ};var Hh=class{constructor(e){this.variableNames=[\"X\"],this.outputShape=[e,e],this.userCode=`\n void main() {\n ivec2 coords = getOutputCoords();\n float val = coords[0] == coords[1] ? getX(coords[0]) : 0.0;\n setOutput(val);\n }\n `}};function kQ(r){let{inputs:e,backend:t}=r,{x:o}=e,n=[...o.shape,...o.shape],s=x.sizeFromShape(o.shape),a=J({inputs:{x:o},backend:t,attrs:{shape:[s]}}),i=new Hh(s),p=t.runWebGLProgram(i,[a],a.dtype),u=J({inputs:{x:p},backend:t,attrs:{shape:n}});return t.disposeIntermediateTensorInfo(a),t.disposeIntermediateTensorInfo(p),u}var kA={kernelName:xp,backendName:\"webgl\",kernelFunc:kQ};var qh=class{constructor(e){this.variableNames=[\"x\",\"W\"],this.outputShape=e.outShape;let{inHeight:t,inWidth:o,padInfo:n,strideHeight:s,strideWidth:a,filterHeight:i,filterWidth:p,dilationHeight:u,dilationWidth:c}=e,{top:l,left:m}=n;this.userCode=`\n const ivec2 strides = ivec2(${s}, ${a});\n const ivec2 pads = ivec2(${l}, ${m});\n const float neg_infinity = -3.4e38;\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords.x;\n int d1 = coords.w;\n ivec2 outTopLeftCorner =\n coords.yz * strides - pads;\n int hBeg = outTopLeftCorner.x;\n int wBeg = outTopLeftCorner.y;\n\n float curVal = neg_infinity;\n for (int h = 0; h < ${i}; h++) {\n int hIn = hBeg + h * ${u};\n\n if (hIn >= 0 && hIn < ${t}) {\n for (int w = 0; w < ${p}; w++) {\n int wIn = wBeg + w * ${c};\n\n if (wIn >= 0 && wIn < ${o}) {\n float xVal = getX(batch, hIn, wIn, d1);\n float wVal = getW(h, w, d1);\n\n float val = xVal + wVal;\n if (val > curVal) {\n curVal = val;\n }\n }\n }\n }\n }\n\n float result = curVal;\n setOutput(result);\n }\n `}};function TQ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,filter:s}=e,{strides:a,pad:i,dilations:p}=o,u=I.computeDilation2DInfo(n.shape,s.shape,a,i,\"NHWC\",p),c,l=new qh(u);c=t.runWebGLProgram(l,[n,s],\"float32\");let m=J({inputs:{x:c},backend:t,attrs:{shape:u.outShape}});return t.disposeIntermediateTensorInfo(c),m}var TA={kernelName:yp,backendName:\"webgl\",kernelFunc:TQ};function NQ(r){let{inputs:e,backend:t,attrs:o}=r,{equation:n}=o,s=e,{allDims:a,summedDims:i,idDims:p}=I.decodeEinsumEquation(n,s.length);I.checkEinsumDimSizes(a.length,p,s);let{path:u,steps:c}=I.getEinsumComputePath(i,p),l=c.length,m=null,f=a.length,d=[];for(let h=0;h=0&&(m=Ou({inputs:{x:m},backend:t,attrs:{axis:u[h]-(a.length-f),keepDims:!1}}),d.push(m)),f--)}for(let h of d)h!==m&&t.disposeIntermediateTensorInfo(h);return m}var NA={kernelName:Xa,backendName:\"webgl\",kernelFunc:NQ};var _Q=\"return (x >= 0.0) ? x : (exp(x) - 1.0);\",EQ=`\n vec4 result;\n\n result.r = (x.r >= 0.0) ? x.r : (exp(x.r) - 1.0);\n result.g = (x.g >= 0.0) ? x.g : (exp(x.g) - 1.0);\n result.b = (x.b >= 0.0) ? x.b : (exp(x.b) - 1.0);\n result.a = (x.a >= 0.0) ? x.a : (exp(x.a) - 1.0);\n\n return result;\n`,$Q=he({opSnippet:_Q,packedOpSnippet:EQ}),_A={kernelName:In,backendName:\"webgl\",kernelFunc:$Q};var RQ=\"return (b >= 1.0) ? a : a * (b + 1.0);\",AQ=`\n vec4 bGTEZero = vec4(greaterThanEqual(b, vec4(0.)));\n return (bGTEZero * a) + ((vec4(1.0) - bGTEZero) * (a * (b + vec4(1.0))));\n`,FQ=r=>{let{inputs:e,backend:t}=r,{dy:o,y:n}=e,s=P().getBool(\"WEBGL_PACK_BINARY_OPERATIONS\")?new Ko(AQ,o.shape,n.shape):new _o(RQ,o.shape,n.shape);return t.runWebGLProgram(s,[o,n],o.dtype)},EA={kernelName:Pm,backendName:\"webgl\",kernelFunc:FQ};var DQ=`\n return vec4(equal(a, b));\n`,PQ=\"return float(a == b);\",OQ=ot({opSnippet:PQ,packedOpSnippet:DQ,dtype:\"bool\",cpuKernelImpl:c$}),$A={kernelName:oo,backendName:\"webgl\",kernelFunc:OQ};var MQ=`\n // Error function is calculated approximately with elementary function.\n // See \"Handbook of Mathematical Functions with Formulas,\n // Graphs, and Mathematical Tables\", Abramowitz and Stegun.\n float p = ${I.ERF_P};\n float a1 = ${I.ERF_A1};\n float a2 = ${I.ERF_A2};\n float a3 = ${I.ERF_A3};\n float a4 = ${I.ERF_A4};\n float a5 = ${I.ERF_A5};\n\n float sign = sign(x);\n x = abs(x);\n float t = 1.0 / (1.0 + p * x);\n return sign * (1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*exp(-x*x));\n`,LQ=he({opSnippet:MQ}),RA={kernelName:Gi,backendName:\"webgl\",kernelFunc:LQ};var BQ=jo+`\n return exp(x);\n`,VQ=`\n vec4 result = exp(x);\n bvec4 isNaN = isnan(x);\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n`,Ow=he({opSnippet:BQ,packedOpSnippet:VQ,cpuKernelImpl:l$,dtype:\"float32\"}),AA={kernelName:no,backendName:\"webgl\",kernelFunc:Ow};function Kh(r){let{inputs:e,attrs:t,backend:o}=r,{dim:n}=t,{input:s}=e,a=s.shape.length,i=s.shape.slice(),p=n;return n<0&&(x.assert(-(a+1)<=n,()=>`Axis must be in the interval [${-(a+1)}, ${a}]`),p=a+n+1),i.splice(p,0,1),J({inputs:{x:s},backend:o,attrs:{shape:i}})}var FA={kernelName:xs,backendName:\"webgl\",kernelFunc:Kh};var DA=\"return exp(x) - 1.0;\",zQ=he({opSnippet:DA,packedOpSnippet:DA,cpuKernelImpl:m$}),PA={kernelName:wn,backendName:\"webgl\",kernelFunc:zQ};var Ll=class{constructor(e,t,o){this.variableNames=[\"real\",\"imag\"];let n=t[1];this.outputShape=t;let s=o?`2.0 * ${Math.PI}`:`-2.0 * ${Math.PI}`,a=o?`${n}.0`:\"1.0\",i;if(e===\"real\")i=\"return real * expR - imag * expI;\";else if(e===\"imag\")i=\"return real * expI + imag * expR;\";else throw new Error(`FFT component must be either \"real\" or \"imag\", got ${e}.`);this.userCode=`\n const float exponentMultiplier = ${s};\n\n float unaryOpComplex(float real, float expR, float imag, float expI) {\n ${i}\n }\n\n float mulMatDFT(int batch, int index) {\n float indexRatio = float(index) / float(${n});\n float exponentMultiplierTimesIndexRatio =\n exponentMultiplier * indexRatio;\n\n float result = 0.0;\n\n for (int i = 0; i < ${n}; i++) {\n // x = (-2|2 * PI / N) * index * i;\n float x = exponentMultiplierTimesIndexRatio * float(i);\n float expR = cos(x);\n float expI = sin(x);\n float real = getReal(batch, i);\n float imag = getImag(batch, i);\n\n result +=\n unaryOpComplex(real, expR, imag, expI) / ${a};\n }\n\n return result;\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n setOutput(mulMatDFT(coords[0], coords[1]));\n }\n `}};function jh(r,e,t){let o=t.texData.get(r.dataId),n=x.sizeFromShape(r.shape),s=r.shape[r.shape.length-1],a=n/s,i=J({inputs:{x:r},backend:t,attrs:{shape:[a,s]}}),p=i.shape,u=new Ll(\"real\",p,e),c=new Ll(\"imag\",p,e),l=[{dataId:o.complexTensorInfos.real.dataId,dtype:o.complexTensorInfos.real.dtype,shape:p},{dataId:o.complexTensorInfos.imag.dataId,dtype:o.complexTensorInfos.imag.dtype,shape:p}],m=t.runWebGLProgram(u,l,\"float32\"),f=t.runWebGLProgram(c,l,\"float32\"),d=Ar({inputs:{real:m,imag:f},backend:t});t.disposeIntermediateTensorInfo(m),t.disposeIntermediateTensorInfo(f);let h=J({inputs:{x:d},backend:t,attrs:{shape:r.shape}});return t.disposeIntermediateTensorInfo(i),t.disposeIntermediateTensorInfo(d),h}function WQ(r){let{inputs:e,backend:t}=r,{input:o}=e;return jh(o,!1,t)}var OA={kernelName:bp,backendName:\"webgl\",kernelFunc:WQ};var Xh=class{constructor(e,t){this.outputShape=[],this.customUniforms=[{name:\"value\",type:\"float\"}],this.variableNames=[\"x\"],this.outputShape=e,this.userCode=`\n void main() {\n // Input can be obtained from uniform value.\n setOutput(value);\n }\n `}};function Ba(r){let{backend:e,attrs:t}=r,{shape:o,value:n}=t,{dtype:s}=t;if(s=s||x.inferDtype(n),s===\"string\"){let a=x.getArrayFromDType(s,x.sizeFromShape(o));return a.fill(n),e.makeTensorInfo(o,s,a)}else{let a=new Xh(o,n),i=[[n]];return e.runWebGLProgram(a,[],s,i)}}var MA={kernelName:ys,backendName:\"webgl\",kernelFunc:Ba};var Yh=class{constructor(e){this.variableNames=[\"Image\"],this.outputShape=[];let t=e[2];this.outputShape=e,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int x = coords[2];\n\n int coordX = ${t} - x - 1;\n float outputValue;\n if(coordX >= 0 && coordX < ${t}) {\n outputValue = getImage(coords[0], coords[1], coordX, coords[3]);\n } else {\n outputValue = getImage(coords[0], coords[1], coords[2], coords[3]);\n }\n setOutput(outputValue);\n }\n `}};var LA={kernelName:Sn,backendName:\"webgl\",kernelFunc:({inputs:r,backend:e})=>{let{image:t}=r,o=e,n=new Yh(t.shape);return o.runWebGLProgram(n,[t],t.dtype)}};var BA=\"return floor(x);\",UQ=he({opSnippet:BA,packedOpSnippet:BA,cpuKernelImpl:f$}),VA={kernelName:so,backendName:\"webgl\",kernelFunc:UQ};var GQ=`\n float s = sign(a) * sign(b);\n int ia = round(a);\n int ib = round(b);\n if (ib != 0) {\n // Windows (D3D) wants guaranteed non-zero int division at compile-time.\n return float(idiv(ia, ib, s));\n } else {\n return NAN;\n }\n`,HQ=`\n ivec4 ia = round(a);\n ivec4 ib = round(b);\n bvec4 cond = notEqual(ib, ivec4(0));\n ivec4 result = ivec4(0);\n vec4 s = sign(a) * sign(b);\n\n // Windows (D3D) wants guaranteed non-zero int division at compile-time.\n if (cond[0]) {\n result[0] = idiv(ia[0], ib[0], s[0]);\n }\n if (cond[1]) {\n result[1] = idiv(ia[1], ib[1], s[1]);\n }\n if (cond[2]) {\n result[2] = idiv(ia[2], ib[2], s[2]);\n }\n if (cond[3]) {\n result[3] = idiv(ia[3], ib[3], s[3]);\n }\n return vec4(result);\n`,qQ=ot({opSnippet:GQ,packedOpSnippet:HQ,dtype:\"int32\"}),zA={kernelName:vn,backendName:\"webgl\",kernelFunc:qQ};var Qh=class{constructor(e){this.variableNames=[\"A\"];let t=Ct(),[o,n]=e;this.outputShape=e,this.userCode=`\n void main() {\n ivec3 coords = getOutputCoords();\n int texR = coords[0];\n int texC = coords[1];\n int depth = coords[2];\n vec2 uv = (vec2(texC, texR) + halfCR) / vec2(${n}.0, ${o}.0);\n\n vec4 values = ${t.texture2D}(A, uv);\n float value;\n if (depth == 0) {\n value = values.r;\n } else if (depth == 1) {\n value = values.g;\n } else if (depth == 2) {\n value = values.b;\n } else if (depth == 3) {\n value = values.a;\n }\n\n setOutput(floor(value * 255.0 + 0.5));\n }\n `}};var Zh=class{constructor(e){this.variableNames=[\"A\"],this.packedInputs=!1,this.packedOutput=!0;let t=Ct(),[o,n]=e;this.outputShape=e,this.userCode=`\n void main() {\n ivec3 coords = getOutputCoords();\n int texR = coords[0];\n int texC = coords[1];\n int depth = coords[2];\n\n vec4 result = vec4(0.);\n\n for(int row=0; row<=1; row++) {\n for(int col=0; col<=1; col++) {\n texC = coords[1] + row;\n depth = coords[2] + col;\n\n vec2 uv = (vec2(texC, texR) + halfCR) /\n vec2(${n}.0, ${o}.0);\n vec4 values = ${t.texture2D}(A, uv);\n float value;\n if (depth == 0) {\n value = values.r;\n } else if (depth == 1) {\n value = values.g;\n } else if (depth == 2) {\n value = values.b;\n } else if (depth == 3) {\n value = values.a;\n }\n\n result[row * 2 + col] = floor(value * 255.0 + 0.5);\n }\n }\n\n ${t.output} = result;\n }\n `}};var WA={kernelName:Zi,backendName:\"webgl\",kernelFunc:KQ},Sc,Mw=P().getBool(\"CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU\");function KQ(r){let{inputs:e,backend:t,attrs:o}=r,{pixels:n}=e,{numChannels:s}=o,a=typeof HTMLVideoElement!=\"undefined\"&&n instanceof HTMLVideoElement,i=typeof HTMLImageElement!=\"undefined\"&&n instanceof HTMLImageElement,[p,u]=a?[n.videoWidth,n.videoHeight]:[n.width,n.height],c=[u,p],l=[u,p,s];if(i||a){let h=P().getBool(\"CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU\");(Sc==null||h!==Mw)&&(Mw=h,Sc=document.createElement(\"canvas\").getContext(\"2d\",{willReadFrequently:Mw})),Sc.canvas.width=p,Sc.canvas.height=u,Sc.drawImage(n,0,0,p,u),n=Sc.canvas}let m=t.makeTensorInfo(c,\"int32\");t.texData.get(m.dataId).usage=ir.PIXELS,t.gpgpu.uploadPixelDataToTexture(t.getTexture(m.dataId),n);let f=P().getBool(\"WEBGL_PACK\")?new Zh(l):new Qh(l),d=t.runWebGLProgram(f,[m],\"int32\");return t.disposeData(m.dataId),d}function jQ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,filter:s,bias:a,preluActivationWeights:i}=e,{strides:p,pad:u,dataFormat:c,dilations:l,dimRoundingMode:m,activation:f,leakyreluAlpha:d}=o,h=I.convertConv2DDataFormat(c),g=I.computeConv2DInfo(n.shape,s.shape,p,l,u,m,!1,h),y,b=[],C=a!=null,w=i!=null,k=f===\"leakyrelu\",_=()=>{let R=[n,s],A=(D,O)=>{if(O===\"NCHW\"&&D.shape.length===1&&D.shape[0]!==1){let M=J({inputs:{x:D},backend:t,attrs:{shape:[D.shape[0],1,1]}});return b.push(M),M}return D};if(C&&R.push(A(a,c)),w&&R.push(A(i,c)),k){let D=t.makeTensorInfo([],\"float32\",x.createScalarValue(d,\"float32\"));R.push(D),b.push(D)}return R};if(g.filterHeight===1&&g.filterWidth===1&&g.dilationHeight===1&&g.dilationWidth===1&&g.strideHeight===1&&g.strideWidth===1&&(g.padInfo.type===\"SAME\"||g.padInfo.type===\"VALID\"))y=Dh({x:n,filter:s,convInfo:g,backend:t,bias:a,activation:f,preluActivationWeights:i,leakyreluAlpha:d});else if(g.strideWidth<=2&&h===\"channelsLast\"&&P().getBool(\"WEBGL_EXP_CONV\")){let R=f?Ma(f,!0):null,A=new Cc(g,C,R,w,k),D=[[g.padInfo.top,g.padInfo.left],[g.strideHeight,g.strideWidth],[g.dilationHeight,g.dilationWidth],[g.inHeight,g.inWidth]],O=_();y=t.runWebGLProgram(A,O,\"float32\",D)}else if(P().getBool(\"WEBGL_CONV_IM2COL\"))y=Ph({x:n,filter:s,convInfo:g,backend:t,bias:a,activation:f,preluActivationWeights:i,leakyreluAlpha:d});else{let R=f?Ma(f,!1):null,A=new bc(g,C,R,w,k),D=_();y=t.runWebGLProgram(A,D,\"float32\")}let E=J({inputs:{x:y},backend:t,attrs:{shape:g.outShape}});return b.push(y),b.forEach(R=>t.disposeIntermediateTensorInfo(R)),E}var UA={kernelName:Do,backendName:\"webgl\",kernelFunc:jQ};function XQ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,filter:s,bias:a,preluActivationWeights:i}=e,{strides:p,pad:u,dilations:c,dimRoundingMode:l,activation:m,leakyreluAlpha:f}=o,d=[],h=c;h==null&&(h=[1,1]),x.assert(I.eitherStridesOrDilationsAreOne(p,h),()=>`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${p} and dilations '${h}'`);let g=I.computeConv2DInfo(n.shape,s.shape,p,h,u,l,!0),y=P().getBool(\"WEBGL_PACK_DEPTHWISECONV\")&&g.strideWidth<=2&&g.outChannels/g.inChannels===1,b=m?Ma(m,y):null,C=[n,s],w=a!=null,k=i!=null,_=m===\"leakyrelu\";if(w&&C.push(a),k&&C.push(i),_){let D=t.makeTensorInfo([],\"float32\",x.createScalarValue(f,\"float32\"));C.push(D),d.push(D)}let E;y?E=new wc(g,w,b,k,_):E=new Ic(g,w,b,k,_);let R=[[g.padInfo.top,g.padInfo.left],[g.strideHeight,g.strideWidth],[g.dilationHeight,g.dilationWidth],[g.inHeight,g.inWidth]],A=t.runWebGLProgram(E,C,\"float32\",R);return d.forEach(D=>t.disposeIntermediateTensorInfo(D)),A}var GA={kernelName:Po,backendName:\"webgl\",kernelFunc:XQ};var Jh=class{constructor(e,t,o,n){this.sliceDim=e,this.strides=t,this.paramsShape=n,this.variableNames=[\"x\",\"indices\"],this.outputShape=o;let s=_e(o.length),a=`\n int index;`;for(let i=0;i= ${this.paramsShape[i]};\n flattenIndex += index * ${this.strides[i]};`;this.userCode=`\n void main() {\n ${s} coords = getOutputCoords();\n int flattenIndex = 0;\n bool out_of_bounds = false;\n\n ${a}\n\n setOutput(out_of_bounds ? 0.0 : getX(flattenIndex, coords[1]));\n }\n `}};function YQ(r){let{inputs:e,backend:t}=r,{params:o,indices:n}=e,s=n.shape,a=s[s.length-1],i=x.sizeFromShape(o.shape),[p,u,c,l]=I.prepareAndValidate(o,n),m=J({inputs:{x:n},backend:t,attrs:{shape:[u,a]}}),f=J({inputs:{x:o},backend:t,attrs:{shape:[x.sizeFromShape(o.shape)/c,c]}});if(t.shouldExecuteOnCPU([o,n])||o.dtype===\"string\"){let y=t.readSync(n.dataId),b=t.bufferSync(o),C=d$(y,b,o.dtype,u,a,c,l,o.shape,i);return t.makeTensorInfo(p,o.dtype,C.values)}let d=new Jh(a,l,[u,c],o.shape),h=t.runWebGLProgram(d,[f,m],f.dtype),g=J({inputs:{x:h},backend:t,attrs:{shape:p}});return t.disposeIntermediateTensorInfo(m),t.disposeIntermediateTensorInfo(f),t.disposeIntermediateTensorInfo(h),g}var HA={kernelName:Tn,backendName:\"webgl\",kernelFunc:YQ};var eg=class{constructor(e,t){this.variableNames=[\"A\",\"indices\"],this.outputShape=t,this.rank=t.length;let o=_e(this.rank),n=QQ(e,2);this.userCode=`\n void main() {\n ${o} resRC = getOutputCoords();\n int index = int(getIndices(resRC.x, resRC.z));\n float inBounds = (index >= 0) && (index < ${e[2]}) ? 1.0 : 0.0;\n setOutput(inBounds * getA(${n}));\n }\n `}};function QQ(r,e){let t=[\"resRC.x\",\"resRC.y\",\"resRC.z\",\"resRC.w\"],o=[];for(let n=0;n=0,()=>`GatherV2: the index value ${k} is not in [0, ${C-1}]`)}}let u=I.segment_util.collectGatherOpShapeInfo(n,s,p,i),c=x.sizeFromShape(s.shape),l=[],m=J({inputs:{x:n},backend:t,attrs:{shape:[u.batchSize,u.outerSize,u.dimSize,u.sliceSize]}}),f=J({inputs:{x:s},backend:t,attrs:{shape:[u.batchSize,c/u.batchSize]}});l.push(m),l.push(f);let d=[u.batchSize,u.outerSize,c/u.batchSize,u.sliceSize];if(t.shouldExecuteOnCPU([n,s])||n.dtype===\"string\"){let b=t.bufferSync(f),C=t.bufferSync(m),w=h$(C,b,d);return l.forEach(k=>t.disposeIntermediateTensorInfo(k)),t.makeTensorInfo(u.outputShape,w.dtype,w.values)}let h=new eg(m.shape,d),g=t.runWebGLProgram(h,[m,f],m.dtype);l.push(g);let y=J({inputs:{x:g},backend:t,attrs:{shape:u.outputShape}});return l.forEach(b=>t.disposeIntermediateTensorInfo(b)),y}var qA={kernelName:bs,backendName:\"webgl\",kernelFunc:Lw};var ZQ=\"return float(a > b);\",JQ=`\n return vec4(greaterThan(a, b));\n`,e7=ot({opSnippet:ZQ,packedOpSnippet:JQ,cpuKernelImpl:g$,dtype:\"bool\"}),KA={kernelName:ao,backendName:\"webgl\",kernelFunc:e7};var t7=\"return float(a >= b);\",r7=`\n return vec4(greaterThanEqual(a, b));\n`,o7=ot({opSnippet:t7,packedOpSnippet:r7,dtype:\"bool\",cpuKernelImpl:x$}),jA={kernelName:io,backendName:\"webgl\",kernelFunc:o7};function n7(r){let{inputs:e,backend:t}=r,{input:o}=e;return jh(o,!0,t)}var XA={kernelName:Cp,backendName:\"webgl\",kernelFunc:n7};var s7=\"return float(!isnan(x) && !isinf(x));\",a7=he({opSnippet:s7,dtype:\"bool\"}),YA={kernelName:Hi,backendName:\"webgl\",kernelFunc:a7};var i7=\"return float(isinf(x));\",u7=he({opSnippet:i7,dtype:\"bool\"}),QA={kernelName:qi,backendName:\"webgl\",kernelFunc:u7};var p7=\"return float(isnan(x));\",c7=he({opSnippet:p7,dtype:\"bool\"}),ZA={kernelName:ia,backendName:\"webgl\",kernelFunc:c7};var l7=\"return float(a < b);\",m7=`\n return vec4(lessThan(a, b));\n`,f7=ot({opSnippet:l7,packedOpSnippet:m7,cpuKernelImpl:y$,dtype:\"bool\"}),JA={kernelName:po,backendName:\"webgl\",kernelFunc:f7};var d7=\"return float(a <= b);\",h7=`\n return vec4(lessThanEqual(a, b));\n`,g7=ot({opSnippet:d7,packedOpSnippet:h7,cpuKernelImpl:b$,dtype:\"bool\"}),eF={kernelName:co,backendName:\"webgl\",kernelFunc:g7};function x7(r){let{backend:e,attrs:t}=r,{start:o,stop:n,num:s}=t,a=C$(o,n,s);return e.makeTensorInfo([a.length],\"float32\",a)}var tF={kernelName:Ip,backendName:\"webgl\",kernelFunc:x7};var y7=jo+`\n return x < 0.0 ? 0./0. : log(x);\n`,b7=`\n vec4 result = log(x);\n bvec4 isNaN = isnan(x);\n result.r = isNaN.r ? x.r : (x.r < 0.0 ? 0./0. : result.r);\n result.g = isNaN.g ? x.g : (x.g < 0.0 ? 0./0. : result.g);\n result.b = isNaN.b ? x.b : (x.b < 0.0 ? 0./0. : result.b);\n result.a = isNaN.a ? x.a : (x.a < 0.0 ? 0./0. : result.a);\n return result;\n`,C7=he({opSnippet:y7,packedOpSnippet:b7,cpuKernelImpl:I$}),rF={kernelName:lo,backendName:\"webgl\",kernelFunc:C7};var I7=jo+`\n return log(1.0 + x);\n`,w7=he({opSnippet:I7}),oF={kernelName:Ki,backendName:\"webgl\",kernelFunc:w7};var S7=\"return float(a >= 1.0 && b >= 1.0);\",v7=`\n return vec4(\n vec4(greaterThanEqual(a, vec4(1.0))) *\n vec4(greaterThanEqual(b, vec4(1.0))));\n`,k7=ot({opSnippet:S7,packedOpSnippet:v7,dtype:\"bool\"}),nF={kernelName:_n,backendName:\"webgl\",kernelFunc:k7};var T7=\"return float(!(x >= 1.0));\",N7=he({opSnippet:T7}),sF={kernelName:En,backendName:\"webgl\",kernelFunc:N7};var _7=\"return float(a >= 1.0 || b >= 1.0);\",E7=`\n return min(\n vec4(greaterThanEqual(a, vec4(1.0))) +\n vec4(greaterThanEqual(b, vec4(1.0))),\n vec4(1.0));\n`,$7=ot({opSnippet:_7,packedOpSnippet:E7,dtype:\"bool\"}),aF={kernelName:ua,backendName:\"webgl\",kernelFunc:$7};var tg=class{constructor(e,t,o,n,s){this.variableNames=[\"x\"],this.outputShape=[];let a=t,i=e[3]-1;this.outputShape=e;let p,u=`float(${o}) + float(${n}) * sum`;s===.5?p=`inversesqrt(${u})`:s===1?p=`1.0/(${u})`:p=`exp(log(${u}) * float(-${s}));`,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int r = coords[1];\n int c = coords[2];\n int d = coords[3];\n float x = getX(b, r, c, d);\n float sum = 0.0;\n for (int j = -${a}; j <= ${a}; j++) {\n int idx = d + j;\n if (idx >= 0 && idx <= ${i}) {\n float z = getX(b, r, c, idx);\n sum += z * z;\n }\n }\n float val = x * ${p};\n setOutput(val);\n }\n `}};var rg=class{constructor(e,t,o,n,s){this.variableNames=[\"x\"],this.outputShape=[],this.packedInputs=!0,this.packedOutput=!0;let a=t,i=e[3]-1;this.outputShape=e;let p,u=`float(${o}) + float(${n}) * sum`;s===.5?p=`inversesqrt(${u})`:s===1?p=`1.0/(${u})`:p=`exp(log(${u}) * float(-${s}));`,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords.x;\n int r = coords.y;\n int c = coords.z;\n int d = coords.w;\n\n bool hasNextCol = d < ${this.outputShape[3]};\n bool hasNextRow = c < ${this.outputShape[2]};\n\n vec4 sum = vec4(0.);\n vec4 xFragAtOutputCoords = getX(b, r, c, d);\n\n vec4 xAtOutputCoords = vec4(\n getChannel(xFragAtOutputCoords, vec2(c, d)),\n hasNextCol ?\n getChannel(xFragAtOutputCoords, vec2(c, d + 1)) : 0.0,\n hasNextRow ?\n getChannel(xFragAtOutputCoords , vec2(c + 1, d)) : 0.0,\n (hasNextRow && hasNextCol) ?\n getChannel(xFragAtOutputCoords, vec2(c + 1, d + 1)) : 0.0\n );\n\n int firstChannel = d - ${a};\n vec2 cache = vec2(0.);\n if(firstChannel >= 0){\n vec4 firstChannelFrag = getX(b, r, c, firstChannel);\n cache.x = getChannel(firstChannelFrag, vec2(c, firstChannel));\n if(hasNextRow){\n cache.y = getChannel(firstChannelFrag, vec2(c + 1, firstChannel));\n }\n }\n\n ivec2 depth = ivec2(d, d + 1);\n for (int j = - ${a}; j <= ${a}; j++) {\n ivec2 idx = depth + j;\n bvec2 aboveLowerBound = greaterThanEqual(idx, ivec2(0));\n bvec2 belowUpperBound = lessThanEqual(idx, ivec2(${i}));\n\n bool depthInRange = aboveLowerBound.x && belowUpperBound.x;\n bool depthPlusOneInRange = aboveLowerBound.y && belowUpperBound.y;\n\n if(depthInRange || depthPlusOneInRange){\n vec4 z = vec4(0.);\n vec4 xFragAtCurrentDepth;\n z.xz = cache.xy;\n if(depthPlusOneInRange && hasNextCol){\n xFragAtCurrentDepth = idx.y != d ?\n getX(b, r, c, idx.y) : xFragAtOutputCoords;\n z.y = getChannel(xFragAtCurrentDepth, vec2(c, idx.y));\n if(hasNextRow){\n z.w = getChannel(xFragAtCurrentDepth, vec2(c + 1, idx.y));\n }\n }\n cache.xy = z.yw;\n sum += z * z;\n }\n }\n vec4 result = xAtOutputCoords * ${p};\n setOutput(result);\n }\n `}};var R7=r=>{let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{depthRadius:s,bias:a,alpha:i,beta:p}=o,u=P().getBool(\"WEBGL_PACK_NORMALIZATION\")?new rg(n.shape,s,a,i,p):new tg(n.shape,s,a,i,p);return t.runWebGLProgram(u,[n],n.dtype)},iF={kernelName:wp,backendName:\"webgl\",kernelFunc:R7};var og=class{constructor(e,t,o,n,s){this.variableNames=[\"inputImage\",\"outputImage\",\"dy\"],this.outputShape=[],this.outputShape=e,this.depth=e[3],this.depthRadius=t,this.bias=o,this.alpha=n,this.beta=s,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int r = coords[1];\n int c = coords[2];\n\n float result = 0.0;\n for (int d = 0; d < ${this.depth}; ++d) {\n int depthBegin = int(max(0.0, float(d - ${t})));\n int depthEnd = int(min(float(${this.depth}),\n float(d + ${t} + 1)));\n\n const int MIN_DEPTH_BEGIN = 0;\n const int MAX_DEPTH_END = ${this.depth};\n\n float norm = 0.0;\n for (int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k) {\n if (k < depthBegin){\n continue;\n }\n else if (k >= depthBegin && k < depthEnd) {\n norm += getInputImage(b, r, c, k) * getInputImage(b, r, c, k);\n }\n else {\n break;\n }\n }\n\n norm = float(${n}) * norm + float(${o});\n\n for(int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k){\n if (k < depthBegin){\n continue;\n }\n else if (k >= depthBegin && k < depthEnd){\n float dyi = -2.0 * float(${n})\n * float(${s})\n * getInputImage(b ,r ,c, k) * getOutputImage(b, r, c, d)\n / norm;\n if (k == d) {\n dyi += pow(norm, -1.0 * ${s});\n }\n if (k == coords[3]) {\n dyi *= getDy(b, r, c, d);\n result += dyi;\n }\n }\n else {\n break;\n }\n }\n }\n setOutput(result);\n }\n `}};var A7=r=>{let{inputs:e,backend:t,attrs:o}=r,{x:n,y:s,dy:a}=e,{depthRadius:i,bias:p,alpha:u,beta:c}=o,l=new og(n.shape,i,p,u,c);return t.runWebGLProgram(l,[n,s,a],n.dtype)},uF={kernelName:Om,backendName:\"webgl\",kernelFunc:A7};function pF(r,e,t,o){let n=x.sizeFromShape(e),a=x.sizeFromShape(r.shape)/n,i=J({inputs:{x:r},attrs:{shape:[a,n]},backend:o}),p=qr(i,r.dtype,\"max\",o),u=J({inputs:{x:p},attrs:{shape:t},backend:o});return o.disposeIntermediateTensorInfo(i),o.disposeIntermediateTensorInfo(p),u}function Bw(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{reductionIndices:s,keepDims:a}=o,i=n.shape.length,p=x.parseAxisParam(s,n.shape),u=p,c=I.getAxesPermutation(u,i),l=c!=null,m=t.shouldExecuteOnCPU([n]),f=n;if(l){if(m){let C=t.texData.get(f.dataId).values,w=new Array(i);for(let E=0;E`Error in maxPool: Either strides or dilations must be 1. Got strides ${a} and dilations '${u}'`);let c=I.computePool2DInfo(n.shape,s,a,u,i,p);if(c.filterWidth===1&&c.filterHeight===1&&x.arraysEqual(c.inShape,c.outShape))return Rt({inputs:{x:n},backend:t});let l=new us(c,\"max\",!1);return t.runWebGLProgram(l,[n],n.dtype)}var mF={kernelName:Rn,backendName:\"webgl\",kernelFunc:O7};function M7(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{filterSize:s,strides:a,pad:i,dataFormat:p,dimRoundingMode:u}=o,c=[1,1,1],l=I.computePool3DInfo(n.shape,s,a,c,i,u,p),m=new Ei(l,\"max\",!1);return t.runWebGLProgram(m,[n],n.dtype)}var fF={kernelName:Sp,backendName:\"webgl\",kernelFunc:M7};var ng=class{constructor(e){this.variableNames=[\"dy\",\"maxPos\"],this.outputShape=e.inShape;let t=e.strideHeight,o=e.strideWidth,n=e.dilationHeight,s=e.effectiveFilterHeight,a=e.effectiveFilterWidth,i=s-1-e.padInfo.top,p=a-1-e.padInfo.left,u=s*a-1;this.userCode=`\n const ivec2 pads = ivec2(${i}, ${p});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n\n ivec2 dyRCCorner = coords.yz - pads;\n int dyRCorner = dyRCCorner.x;\n int dyCCorner = dyRCCorner.y;\n\n // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${s};\n wR += ${n}) {\n float dyR = float(dyRCorner + wR) / ${t}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${a}; wC++) {\n float dyC = float(dyCCorner + wC) / ${o}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n int maxPosValue = ${u} - int(getMaxPos(b, idyR, idyC, d));\n\n // Get the current value, check it against the value from the\n // position matrix.\n int curPosValue = wR * ${a} + wC;\n float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\n\n dotProd += dyValue * mask;\n }\n }\n setOutput(dotProd);\n }\n `}},sg=class{constructor(e){this.variableNames=[\"dy\",\"maxPos\"],this.outputShape=e.inShape;let t=e.strideDepth,o=e.strideHeight,n=e.strideWidth,s=e.dilationDepth,a=e.dilationHeight,i=e.dilationWidth,p=e.effectiveFilterDepth,u=e.effectiveFilterHeight,c=e.effectiveFilterWidth,l=p-1-e.padInfo.front,m=u-1-e.padInfo.top,f=c-1-e.padInfo.left,d=p*u*c-1;this.userCode=`\n const ivec3 pads = ivec3(${l}, ${m}, ${f});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyDCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n // Convolve dy(?, ?, ?, ch) with pos mask(:, :, :, d) to get\n // dx(xD, xR, xC, ch).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int wD = 0; wD < ${p};\n wD += ${s}) {\n float dyD = float(dyDCorner + wD) / ${t}.0;\n\n if (dyD < 0.0 || dyD >= ${e.outDepth}.0 || fract(dyD) > 0.0) {\n continue;\n }\n int idyD = int(dyD);\n\n for (int wR = 0; wR < ${u};\n wR += ${a}) {\n float dyR = float(dyRCorner + wR) / ${o}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${c};\n wC += ${i}) {\n float dyC = float(dyCCorner + wC) / ${n}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(batch, idyD, idyR, idyC, ch);\n int maxPosValue = ${d} -\n int(getMaxPos(batch, idyD, idyR, idyC, ch));\n\n // Get the current value, check it against the value from the\n // position matrix.\n int curPosValue =\n wD * ${u} * ${c} +\n wR * ${c} + wC;\n float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\n\n dotProd += dyValue * mask;\n }\n }\n }\n setOutput(dotProd);\n }\n `}};function L7(r){let{inputs:e,backend:t,attrs:o}=r,{dy:n,input:s}=e,a=s,{filterSize:i,strides:p,pad:u,dimRoundingMode:c}=o,l=[1,1,1],m=I.computePool3DInfo(a.shape,i,p,l,u,c),f=new Ei(m,\"max\",!0),d=t.runWebGLProgram(f,[a],a.dtype),h=new sg(m),g=t.runWebGLProgram(h,[n,d],a.dtype);return t.disposeIntermediateTensorInfo(d),g}var dF={kernelName:Lm,backendName:\"webgl\",kernelFunc:L7};function B7(r){let{inputs:e,backend:t,attrs:o}=r,{dy:n,input:s,output:a}=e,i=s;as([s,a],\"maxPoolGrad\");let{filterSize:p,strides:u,pad:c,dimRoundingMode:l}=o,m=I.computePool2DInfo(i.shape,p,u,1,c,l),f=!0,d=new us(m,\"max\",f),h=t.runWebGLProgram(d,[i],i.dtype),g=new ng(m),y=t.runWebGLProgram(g,[n,h],i.dtype);return t.disposeIntermediateTensorInfo(h),y}var hF={kernelName:Mm,backendName:\"webgl\",kernelFunc:B7};function gF(r,e,t,o){let n=new us(t,\"max\",!1),s=o.runWebGLProgram(n,[r],\"float32\");n=new us(t,\"max\",!0,!0,e);let a=o.runWebGLProgram(n,[r],\"float32\");return[s,a]}var xF={kernelName:vp,backendName:\"webgl\",kernelFunc:({inputs:r,attrs:e,backend:t})=>{let{x:o}=r,{filterSize:n,strides:s,pad:a,includeBatchInIndex:i}=e,p=t;x.assert(o.shape.length===4,()=>`Error in maxPool: input must be rank 4 but got rank ${o.shape.length}.`);let u=[1,1];x.assert(I.eitherStridesOrDilationsAreOne(s,u),()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${s} and dilations '${u}'`);let c=I.computePool2DInfo(o.shape,n,s,u,a),[l,m]=gF(o,i,c,p);return[l,m]}};function yF(r,e,t,o){let n=x.sizeFromShape(e),a=x.sizeFromShape(r.shape)/n,i=J({inputs:{x:r},attrs:{shape:[a,n]},backend:o}),p=qr(i,\"float32\",\"mean\",o),u=J({inputs:{x:p},attrs:{shape:t},backend:o});return o.disposeIntermediateTensorInfo(i),o.disposeIntermediateTensorInfo(p),u}var bF={kernelName:An,backendName:\"webgl\",kernelFunc:({inputs:r,attrs:e,backend:t})=>{let{x:o}=r,{keepDims:n,axis:s}=e,a=t,i=o.shape.length,p=x.parseAxisParam(s,o.shape),u=p,c=I.getAxesPermutation(u,i),l=c!=null,m=a.shouldExecuteOnCPU([o]),f=[],d=o;if(l){if(m){let w=a.texData.get(d.dataId).values,k=new Array(i);for(let R=0;Rc[0]+e[l]+c[1]);let n=e.length,s=_e(n),a=t.map(c=>c[0]).join(\",\"),i=t.map((c,l)=>c[0]+e[l]).join(\",\"),p=[\"coords[0]\",\"coords[1]\",\"coords[2]\",\"coords[3]\"].slice(0,n),u=o===\"reflect\"?0:1;if(n===1){this.userCode=`\n int start = ${a};\n int end = ${i};\n\n void main() {\n int outC = getOutputCoords();\n if (outC < start) {\n outC = start * 2 - outC - ${u};\n } else if(outC >= end) {\n outC = (end - 1) * 2 - outC + ${u};\n }\n setOutput(getX(outC - start));\n }\n `;return}this.userCode=`\n ${s} start = ${s}(${a});\n ${s} end = ${s}(${i});\n\n void main() {\n ${s} outC = getOutputCoords();\n for (int i = 0; i < ${n}; i++) {\n if (outC[i] < start[i]) {\n outC[i] = start[i] * 2 - outC[i] - ${u};\n } else if(outC[i] >= end[i]) {\n outC[i] = (end[i] - 1) * 2 - outC[i] + ${u};\n }\n }\n ${s} coords = outC - start;\n setOutput(getX(${p}));\n }\n `}};var ig=class{constructor(e,t,o){this.variableNames=[\"x\"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=t.map((d,h)=>d[0]+e[h]+d[1]);let n=e.length,s=_e(n),a=t.map(d=>d[0]).join(\",\"),i=t.map((d,h)=>d[0]+e[h]).join(\",\"),p=$t(\"rc\",n),u=$t(\"source\",n),c=`${p[n-1]} < ${this.outputShape[n-1]}`,l=n===1?\"source\":`vec2(${u.slice(-2).join()})`,m=o===\"reflect\"?0:1,f=\"\";if(n===1){let d=`\n ${s} source = rc;\n if (source < start) {\n source = start * 2 - source - ${m};\n } else if (source >= end) {\n source = (end - 1) * 2 - source + ${m};\n }\n source -= start;\n `;f=`\n ${s} rc = outputLoc;\n ${d}\n result[0] = getChannel(getX(${u.join()}), ${l});\n ${p[n-1]} += 1;\n if(${c}) {\n ${d}\n result[1] = getChannel(getX(${u.join()}), ${l});\n }\n `}else{let d=`\n ${s} source = rc;\n ${s} lt = ${s}(lessThan(source, start));\n ${s} gte = ${s}(greaterThanEqual(source, end));\n ${s} orig = 1 - (lt + gte);\n source = orig * source +\n lt * (start * 2 - source - ${m}) +\n gte * ((end - 1) * 2 - source + ${m});\n source -= start;\n `;f=`\n ${s} rc = outputLoc;\n ${d}\n result[0] = getChannel(getX(${u.join()}), ${l});\n ${p[n-1]} += 1;\n if(${c}) {\n ${d}\n result[1] = getChannel(getX(${u.join()}), ${l});\n }\n rc = outputLoc;\n ${p[n-2]} += 1;\n if(${p[n-2]} < ${this.outputShape[n-2]}) {\n ${d}\n result[2] = getChannel(getX(${u.join()}), ${l});\n ${p[n-1]} += 1;\n if(${c}) {\n ${d}\n result[3] = getChannel(getX(${u.join()}), ${l});\n }\n }\n `}this.userCode=`\n const ${s} start = ${s}(${a});\n const ${s} end = ${s}(${i});\n\n void main() {\n ${s} outputLoc = getOutputCoords();\n vec4 result = vec4(0.);\n ${f}\n setOutput(result);\n }\n `}};var G7=({inputs:r,backend:e,attrs:t})=>{let{x:o}=r,{paddings:n,mode:s}=t,a=P().getBool(\"WEBGL_PACK_ARRAY_OPERATIONS\")?new ig(o.shape,n,s):new ag(o.shape,n,s);return e.runWebGLProgram(a,[o],o.dtype)},wF={kernelName:Dn,backendName:\"webgl\",kernelFunc:G7};var H7=`if (b == 0.0) return NAN;\n return mod(a, b);`,q7=`\n vec4 result = mod(a, b);\n bvec4 isNaN = equal(b, vec4(0.0));\n `+js+`\n return result;\n`,K7=ot({opSnippet:H7,packedOpSnippet:q7}),SF={kernelName:ji,backendName:\"webgl\",kernelFunc:K7};var ug=class{constructor(e,t,o){this.variableNames=[\"probs\"],this.customUniforms=[{name:\"seed\",type:\"float\"}],this.outputShape=[e,o],this.userCode=`\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n\n float r = random(seed);\n float cdf = 0.0;\n\n for (int i = 0; i < ${t-1}; i++) {\n cdf += getProbs(batch, i);\n\n if (r < cdf) {\n setOutput(float(i));\n return;\n }\n }\n\n // If no other event happened, last event happened.\n setOutput(float(${t-1}));\n }\n `}};var j7=`\nif (a == b) {\n return 1.0;\n};\nreturn a / b;`,X7=`\n // vec4 one = vec4(equal(a, b));\n // return one + (vec4(1.0) - one) * a / b;\n vec4 result = a / b;\n if(a.x == b.x) {\n result.x = 1.;\n }\n if(a.y == b.y) {\n result.y = 1.;\n }\n if(a.z == b.z) {\n result.z = 1.;\n }\n if(a.w == b.w) {\n result.w = 1.;\n }\n\n return result;\n`,Vw=ot({opSnippet:j7,packedOpSnippet:X7,checkOutOfBounds:!0}),vF={kernelName:Cn,backendName:\"webgl\",kernelFunc:Vw};var kF=\"return a - b;\",zw=ot({opSnippet:kF,packedOpSnippet:kF,supportsComplex:!0,cpuKernelImpl:G$}),TF={kernelName:Io,backendName:\"webgl\",kernelFunc:zw};function Ww(r){let{inputs:e,backend:t,attrs:o}=r,{logits:n}=e,{dim:s}=o,a=x.parseAxisParam([s],n.shape),i=Bw({inputs:{x:n},backend:t,attrs:{reductionIndices:a,keepDims:!1}}),p=I.expandShapeToKeepDim(i.shape,a),u=J({inputs:{x:i},backend:t,attrs:{shape:p}}),c=zw({inputs:{a:n,b:u},backend:t}),l=Ow({inputs:{x:c},backend:t}),m=Ou({inputs:{x:l},backend:t,attrs:{axis:a,keepDims:!1}}),f=J({inputs:{x:m},backend:t,attrs:{shape:p}}),d=Vw({inputs:{a:l,b:f},backend:t});return t.disposeIntermediateTensorInfo(i),t.disposeIntermediateTensorInfo(u),t.disposeIntermediateTensorInfo(c),t.disposeIntermediateTensorInfo(l),t.disposeIntermediateTensorInfo(m),t.disposeIntermediateTensorInfo(f),d}var NF={kernelName:Xn,backendName:\"webgl\",kernelFunc:Ww};function Y7(r){let{inputs:e,backend:t,attrs:o}=r,{logits:n}=e,{numSamples:s,seed:a,normalized:i}=o,p=i?n:Ww({inputs:{logits:n},backend:t,attrs:{dim:n.shape.length-1}}),u=p.shape[0],c=p.shape[1],l=new ug(u,c,s),m=[[a]],f=t.runWebGLProgram(l,[p],\"int32\",m);return i||t.disposeIntermediateTensorInfo(p),f}var _F={kernelName:kp,backendName:\"webgl\",kernelFunc:Y7};var Q7=Vt+`\n return -x;\n`,Z7=`\n vec4 result = -x;\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n`;function J7(r){let{inputs:e,backend:t}=r,{x:o}=e;if(t.shouldExecuteOnCPU([o])){let s=t.texData.get(o.dataId),[a,i]=T$(s.values,o.shape,o.dtype);return t.makeTensorInfo(i,o.dtype,a)}let n;return P().getBool(\"WEBGL_PACK_UNARY_OPERATIONS\")?n=new No(o.shape,Z7):n=new fr(o.shape,Q7),t.runWebGLProgram(n,[o],o.dtype)}var EF={kernelName:Pn,backendName:\"webgl\",kernelFunc:J7};var eZ=Bt.nonMaxSuppressionV3Impl;function tZ(r){I.warn(\"tf.nonMaxSuppression() in webgl locks the UI thread. Call tf.nonMaxSuppressionAsync() instead\");let{inputs:e,backend:t,attrs:o}=r,{boxes:n,scores:s}=e,{maxOutputSize:a,iouThreshold:i,scoreThreshold:p}=o,u=t.readSync(n.dataId),c=t.readSync(s.dataId),{selectedIndices:l}=eZ(u,c,a,i,p);return t.makeTensorInfo([l.length],\"int32\",new Int32Array(l))}var $F={kernelName:On,backendName:\"webgl\",kernelFunc:tZ};var rZ=Bt.nonMaxSuppressionV4Impl;function oZ(r){I.warn(\"tf.nonMaxSuppression() in webgl locks the UI thread. Call tf.nonMaxSuppressionAsync() instead\");let{inputs:e,backend:t,attrs:o}=r,{boxes:n,scores:s}=e,{maxOutputSize:a,iouThreshold:i,scoreThreshold:p,padToMaxOutputSize:u}=o,c=t.readSync(n.dataId),l=t.readSync(s.dataId),{selectedIndices:m,validOutputs:f}=rZ(c,l,a,i,p,u);return[t.makeTensorInfo([m.length],\"int32\",new Int32Array(m)),t.makeTensorInfo([],\"int32\",new Int32Array([f]))]}var RF={kernelName:pa,backendName:\"webgl\",kernelFunc:oZ};var nZ=Bt.nonMaxSuppressionV5Impl;function sZ(r){I.warn(\"tf.nonMaxSuppression() in webgl locks the UI thread. Call tf.nonMaxSuppressionAsync() instead\");let{inputs:e,backend:t,attrs:o}=r,{boxes:n,scores:s}=e,{maxOutputSize:a,iouThreshold:i,scoreThreshold:p,softNmsSigma:u}=o,c=t.readSync(n.dataId),l=t.readSync(s.dataId),m=a,f=i,d=p,h=u,{selectedIndices:g,selectedScores:y}=nZ(c,l,m,f,d,h);return[t.makeTensorInfo([g.length],\"int32\",new Int32Array(g)),t.makeTensorInfo([y.length],\"float32\",new Float32Array(y))]}var AF={kernelName:Mn,backendName:\"webgl\",kernelFunc:sZ};var pg=class{constructor(e,t,o,n){this.variableNames=[\"indices\"],this.outputShape=[e,t],this.userCode=`\n void main() {\n ivec2 coords = getOutputCoords();\n int index = round(getIndices(coords.x));\n setOutput(mix(float(${n}), float(${o}),\n float(index == coords.y)));\n }\n `}};var aZ=r=>{let{inputs:e,backend:t,attrs:o}=r,{indices:n}=e,{dtype:s,depth:a,onValue:i,offValue:p}=o,u=x.sizeFromShape(n.shape),c=new pg(u,a,i,p),l=J({inputs:{x:n},backend:t,attrs:{shape:[u]}}),m=t.runWebGLProgram(c,[l],s);t.disposeIntermediateTensorInfo(l);let f=[...n.shape,a],d=J({inputs:{x:m},backend:t,attrs:{shape:f}});return t.disposeIntermediateTensorInfo(m),d},FF={kernelName:ca,backendName:\"webgl\",kernelFunc:aZ};function Bl(r){let{inputs:e,backend:t}=r,{x:o}=e;if(o.dtype===\"complex64\"){let n=La({inputs:{input:o},backend:t}),s=Bl({inputs:{x:n},backend:t}),a=Lu({inputs:{input:o},backend:t}),i=Bl({inputs:{x:a},backend:t}),p=Ar({inputs:{real:s,imag:i},backend:t});return t.disposeIntermediateTensorInfo(n),t.disposeIntermediateTensorInfo(s),t.disposeIntermediateTensorInfo(a),t.disposeIntermediateTensorInfo(i),p}else return Ba({attrs:{shape:o.shape,dtype:o.dtype,value:o.dtype===\"string\"?\"\":0},backend:t})}var DF={kernelName:Es,backendName:\"webgl\",kernelFunc:Bl};function PF(r){let{inputs:e,backend:t}=r,{x:o}=e;if(o.dtype===\"string\")throw new Error(\"onesLike is not supported under string dtype\");if(o.dtype===\"complex64\"){let n=La({inputs:{input:o},backend:t}),s=PF({inputs:{x:n},backend:t}),a=Lu({inputs:{input:o},backend:t}),i=Bl({inputs:{x:a},backend:t}),p=Ar({inputs:{real:s,imag:i},backend:t});return t.disposeIntermediateTensorInfo(n),t.disposeIntermediateTensorInfo(s),t.disposeIntermediateTensorInfo(a),t.disposeIntermediateTensorInfo(i),p}else return Ba({attrs:{shape:o.shape,dtype:o.dtype,value:1},backend:t})}var OF={kernelName:Cs,backendName:\"webgl\",kernelFunc:PF};function iZ(r){let{inputs:e,backend:t,attrs:o}=r,{axis:n}=o;if(e.length===1)return Kh({inputs:{input:e[0]},backend:t,attrs:{dim:n}});let s=e[0].shape,a=e[0].dtype;e.forEach(c=>{x.assertShapesMatch(s,c.shape,\"All tensors passed to stack must have matching shapes\"),x.assert(a===c.dtype,()=>\"All tensors passed to stack must have matching dtypes\")});let i=[],p=e.map(c=>{let l=Kh({inputs:{input:c},backend:t,attrs:{dim:n}});return i.push(l),l}),u=Pw({inputs:p,backend:t,attrs:{axis:n}});return i.forEach(c=>t.disposeIntermediateTensorInfo(c)),u}var MF={kernelName:Is,backendName:\"webgl\",kernelFunc:iZ};var cg=class{constructor(e,t,o){this.variableNames=[\"x\"],this.customUniforms=[{name:\"value\",type:\"float\"}],this.outputShape=t.map((u,c)=>u[0]+e[c]+u[1]);let n=e.length,s=_e(n),a=t.map(u=>u[0]).join(\",\"),i=t.map((u,c)=>u[0]+e[c]).join(\",\"),p=[\"coords[0]\",\"coords[1]\",\"coords[2]\",\"coords[3]\"].slice(0,n);if(n===1){this.userCode=`\n int start = ${a};\n int end = ${i};\n\n void main() {\n int outC = getOutputCoords();\n if (outC < start || outC >= end) {\n setOutput(value);\n } else {\n setOutput(getX(outC - start));\n }\n }\n `;return}this.userCode=`\n ${s} start = ${s}(${a});\n ${s} end = ${s}(${i});\n\n void main() {\n ${s} outC = getOutputCoords();\n if (any(lessThan(outC, start)) || any(greaterThanEqual(outC, end))) {\n setOutput(value);\n } else {\n ${s} coords = outC - start;\n setOutput(getX(${p}));\n }\n }\n `}};var lg=class{constructor(e,t,o){this.variableNames=[\"x\"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:\"value\",type:\"float\"}],this.outputShape=t.map((h,g)=>h[0]+e[g]+h[1]);let n=e.length,s=_e(n),a=t.map(h=>h[0]).join(\",\"),i=t.map((h,g)=>h[0]+e[g]).join(\",\"),p=$t(\"rc\",n),u=$t(\"source\",n),c=`${p[n-1]} < ${this.outputShape[n-1]}`,l=n===1?\"source\":`vec2(${u.slice(-2).join()})`,m=[`${s} rc = outputLoc;`,`${p[n-1]} += 1;\n if(${c}) {\n `,n===1?\"\":`}\n rc = outputLoc;\n ${p[n-2]} += 1;\n if(${p[n-2]} < ${this.outputShape[n-2]}) {`,n===1?\"\":` ${p[n-1]} += 1;\n if(${c}) {`],f=n===1?\"rc < start || rc >= end\":\"any(lessThan(rc, start)) || any(greaterThanEqual(rc, end))\",d=\"\";for(let h=0,g=n===1?2:4;h{let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{paddings:s,constantValue:a}=o;if(x.sizeFromShape(n.shape)===0){let u=s.map((c,l)=>c[0]+n.shape[l]+c[1]);return Ba({backend:t,attrs:{shape:u,value:a,dtype:n.dtype}})}let i=P().getBool(\"WEBGL_PACK_ARRAY_OPERATIONS\")?new lg(n.shape,s,a):new cg(n.shape,s,a),p=[[a]];return t.runWebGLProgram(i,[n],n.dtype,p)},LF={kernelName:Ln,backendName:\"webgl\",kernelFunc:Uw};var uZ=`\n if(a < 0.0 && floor(b) < b){\n return NAN;\n }\n if (b == 0.0) {\n return 1.0;\n }\n return (round(mod(b, 2.0)) != 1) ?\n pow(abs(a), b) : sign(a) * pow(abs(a), b);\n`,pZ=`\n // isModRound1 has 1 for components with round(mod(b, 2.0)) == 1, 0 otherwise.\n vec4 isModRound1 = vec4(equal(round(mod(b, 2.0)), ivec4(1)));\n vec4 multiplier = sign(a) * isModRound1 + (vec4(1.0) - isModRound1);\n vec4 result = multiplier * pow(abs(a), b);\n\n // Ensure that a^0 = 1, including 0^0 = 1 as this correspond to TF and JS\n bvec4 isExpZero = equal(b, vec4(0.0));\n result.r = isExpZero.r ? 1.0 : result.r;\n result.g = isExpZero.g ? 1.0 : result.g;\n result.b = isExpZero.b ? 1.0 : result.b;\n result.a = isExpZero.a ? 1.0 : result.a;\n\n bvec4 isNaN1 = lessThan(a, vec4(0.0));\n bvec4 isNaN2 = lessThan(floor(b), b);\n bvec4 isNaN = bvec4(isNaN1.x && isNaN2.x, isNaN1.y && isNaN2.y, isNaN1.z && isNaN2.z, isNaN1.w && isNaN2.w);\n `+js+`\n return result;\n`,cZ=ot({opSnippet:uZ,packedOpSnippet:pZ}),BF={kernelName:Bn,backendName:\"webgl\",kernelFunc:cZ};function lZ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s,keepDims:a}=o,i=n.shape.length,p=[],u=x.parseAxisParam(s,n.shape),c=u,l=I.getAxesPermutation(c,i),m=n;l!=null&&(m=xt({inputs:{x:n},backend:t,attrs:{perm:l}}),c=I.getInnerMostAxes(c.length,i),p.push(m)),I.assertAxesAreInnerMostDims(\"prod\",c,i);let f;if(t.shouldExecuteOnCPU([m])){let d=t.texData.get(m.dataId).values,{outVals:h,outShape:g,outDtype:y}=_$(m.shape,m.dtype,d,c);f=t.makeTensorInfo(g,y,h)}else{let[d,h]=I.computeOutAndReduceShapes(m.shape,c),g=x.sizeFromShape(h),y=J({inputs:{x:m},backend:t,attrs:{shape:[-1,g]}}),b=Ca(n.dtype),C=qr(y,b,\"prod\",t);f=J({inputs:{x:C},backend:t,attrs:{shape:d}}),p.push(y),p.push(C)}if(a){p.push(f);let d=I.expandShapeToKeepDim(f.shape,u);f=J({inputs:{x:f},backend:t,attrs:{shape:d}})}return p.forEach(d=>t.disposeIntermediateTensorInfo(d)),f}var VF={kernelName:Ao,backendName:\"webgl\",kernelFunc:lZ};function mZ(r){let{inputs:e,backend:t,attrs:o}=r,{paramsNestedSplits:n,paramsDenseValues:s,indices:a}=e,{outputRaggedRank:i}=o,p=n.map(y=>t.readSync(y.dataId)),u=n.map(y=>y.shape),c=t.readSync(s.dataId),l=t.readSync(a.dataId),[m,f,d]=E$(p,u,c,s.shape,s.dtype,l,a.shape,i),h=m.map(y=>t.makeTensorInfo([y.length],\"int32\",y)),g=t.makeTensorInfo(d,s.dtype,f);return h.concat([g])}var zF={kernelName:Tp,backendName:\"webgl\",kernelFunc:mZ};function fZ(r){let{inputs:e,backend:t}=r,{starts:o,limits:n,deltas:s}=e,a=t.readSync(o.dataId),i=t.readSync(n.dataId),p=t.readSync(s.dataId),[u,c]=$$(a,o.shape,o.dtype,i,n.shape,p,s.shape),l=t.makeTensorInfo([u.length],\"int32\",u),m=t.makeTensorInfo([c.length],o.dtype,c);return[l,m]}var WF={kernelName:Np,backendName:\"webgl\",kernelFunc:fZ};function dZ(r){let{inputs:e,backend:t,attrs:o}=r,{shape:n,values:s,defaultValue:a,rowPartitionTensors:i}=e,{rowPartitionTypes:p}=o,u=t.readSync(n.dataId),c=t.readSync(s.dataId),l=t.readSync(a.dataId),m=i.map(g=>t.readSync(g.dataId)),f=i.map(g=>g.shape),[d,h]=R$(u,n.shape,c,s.shape,s.dtype,l,a.shape,m,f,p);return t.makeTensorInfo(d,s.dtype,h)}var UF={kernelName:_p,backendName:\"webgl\",kernelFunc:dZ};var Gw=r=>{let{backend:e,attrs:t}=r,{start:o,stop:n,step:s,dtype:a}=t,i=A$(o,n,s,a);return e.makeTensorInfo([i.length],a,i)},GF={kernelName:ws,backendName:\"webgl\",kernelFunc:Gw};var hZ=\"return 1.0 / x;\",gZ=he({opSnippet:hZ}),HF={kernelName:ma,backendName:\"webgl\",kernelFunc:gZ};var xZ=Vt+`\n return (x < 0.0) ? 0.0 : x;\n`,yZ=`\n vec4 result = x * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n`,bZ=he({opSnippet:xZ,packedOpSnippet:yZ}),qF={kernelName:zn,backendName:\"webgl\",kernelFunc:bZ};var CZ=Vt+`\n return (x < 0.0) ? 0.0 : min(6.0, x);\n`,IZ=`\n vec4 result = min(x, vec4(6.)) * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n`,wZ=he({opSnippet:CZ,packedOpSnippet:IZ}),KF={kernelName:Gn,backendName:\"webgl\",kernelFunc:wZ};var mg=class{constructor(e,t,o,n,s){this.variableNames=[\"A\"],this.outputShape=[];let[a,i,p,u]=e;this.outputShape=[a,t,o,u];let c=[n&&t>1?i-1:i,n&&o>1?p-1:p],l=[n&&t>1?t-1:t,n&&o>1?o-1:o],m;s?m=\"(vec2(yRC) + vec2(0.5)) * effectiveInputOverOutputRatioRC - vec2(0.5)\":m=\"vec2(yRC) * effectiveInputOverOutputRatioRC\",this.userCode=`\n const vec2 effectiveInputOverOutputRatioRC = vec2(\n ${c[0]/l[0]},\n ${c[1]/l[1]});\n const vec2 inputShapeRC = vec2(${i}.0, ${p}.0);\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n ivec2 yRC = coords.yz;\n\n // Fractional source index.\n vec2 sourceFracIndexRC = ${m};\n\n // Compute the four integer indices.\n ivec2 sourceFloorRC = ivec2(max(sourceFracIndexRC, vec2(0.0)));\n ivec2 sourceCeilRC = ivec2(\n min(inputShapeRC - 1.0, ceil(sourceFracIndexRC)));\n\n float topLeft = getA(b, sourceFloorRC.x, sourceFloorRC.y, d);\n float bottomLeft = getA(b, sourceCeilRC.x, sourceFloorRC.y, d);\n float topRight = getA(b, sourceFloorRC.x, sourceCeilRC.y, d);\n float bottomRight = getA(b, sourceCeilRC.x, sourceCeilRC.y, d);\n\n vec2 fracRC = sourceFracIndexRC - vec2(sourceFloorRC);\n\n float top = topLeft + (topRight - topLeft) * fracRC.y;\n float bottom = bottomLeft + (bottomRight - bottomLeft) * fracRC.y;\n float newValue = top + (bottom - top) * fracRC.x;\n\n setOutput(newValue);\n }\n `}};var fg=class{constructor(e,t,o,n,s){this.variableNames=[\"A\"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=[];let[a,i,p,u]=e;this.outputShape=[a,t,o,u];let c=[n&&t>1?i-1:i,n&&o>1?p-1:p],l=[n&&t>1?t-1:t,n&&o>1?o-1:o],m;s?m=\"(vec3(yRC) + vec3(0.5)) * effectiveInputOverOutputRatioRC - vec3(0.5)\":m=\"vec3(yRC) * effectiveInputOverOutputRatioRC\",this.userCode=`\n const vec3 effectiveInputOverOutputRatioRC = vec3(\n ${c[0]/l[0]},\n ${c[1]/l[1]},\n ${c[1]/l[1]});\n const vec3 inputShapeRC = vec3(${i}.0, ${p}.0,\n ${p}.0);\n\n float getAValue(int b, int r, int c, int d) {\n return getChannel(getA(b, r, c, d), vec2(c, d));\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n // Calculate values for next column in yRC.z.\n ivec3 yRC = coords.yzz + ivec3(0, 0, 1);\n\n // Fractional source index.\n vec3 sourceFracIndexRC = ${m};\n\n // Compute the four integer indices.\n ivec3 sourceFloorRC = ivec3(max(sourceFracIndexRC, vec3(0.0)));\n ivec3 sourceCeilRC = ivec3(\n min(inputShapeRC - 1.0, ceil(sourceFracIndexRC)));\n\n // Should we calculate next column and row elements in 2x2 packed cell.\n bool hasNextCol = d < ${u-1};\n bool hasNextRow = coords.z < ${o-1};\n\n // In parallel, construct four corners for all four components in\n // packed 2x2 cell.\n vec4 topLeft = vec4(\n getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d),\n hasNextCol ? getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d + 1) : 0.0);\n\n vec4 bottomLeft = vec4(\n getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d),\n hasNextCol ? getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d + 1) : 0.0);\n\n vec4 topRight = vec4(\n getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d),\n hasNextCol ? getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d + 1) : 0.0);\n\n vec4 bottomRight = vec4(\n getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d),\n hasNextCol ? getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d + 1) : 0.0);\n\n vec3 fracRC = sourceFracIndexRC - vec3(sourceFloorRC);\n\n vec4 top = mix(topLeft, topRight, fracRC.yyzz);\n vec4 bottom = mix(bottomLeft, bottomRight, fracRC.yyzz);\n vec4 newValue = mix(top, bottom, fracRC.x);\n\n setOutput(newValue);\n }\n `}};function SZ(r){let{inputs:e,backend:t,attrs:o}=r,{images:n}=e,{alignCorners:s,halfPixelCenters:a,size:i}=o,[p,u]=i,c=P().getBool(\"WEBGL_PACK_IMAGE_OPERATIONS\")?new fg(n.shape,p,u,s,a):new mg(n.shape,p,u,s,a);return t.runWebGLProgram(c,[n],\"float32\")}var jF={kernelName:Un,backendName:\"webgl\",kernelFunc:SZ};var dg=class{constructor(e,t,o){this.variableNames=[\"dy\"],this.outputShape=[],this.outputShape=t;let[,n,s]=t,[,a,i]=e,p=[o&&a>1?n-1:n,o&&i>1?s-1:s],u=[o&&a>1?a-1:a,o&&i>1?i-1:i],c=p[0]/u[0],l=p[1]/u[1],m=1/c,f=1/l,d=Math.ceil(m)*2+2,h=Math.ceil(f)*2+2;this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n int r = coords[1];\n int c = coords[2];\n\n float accumulator = 0.0;\n\n const float heightScale = float(${c});\n const float widthScale = float(${l});\n\n const float invHeightScale = float(${m});\n const float invWidthScale = float(${f});\n\n const int winHeight = int(${d});\n const int winWidth = int(${h});\n\n // Compute bounds for where in dy we will look\n float startRLerp = floor(float(r) * invHeightScale);\n int startDyR = int(startRLerp - float(winHeight / 2));\n\n float startCLerp = floor(float(c) * invWidthScale);\n int startDyC = int(startCLerp - float(winWidth / 2));\n\n // Loop over dy\n for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) {\n int dyR = dyROffset + startDyR;\n\n // Guard against the window exceeding the bounds of dy\n if (dyR < 0 || dyR >= ${a}) {\n continue;\n }\n\n for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n int dyC = dyCOffset + startDyC;\n\n // Guard against the window exceeding the bounds of dy\n if (dyC < 0 || dyC >= ${i}) {\n continue;\n }\n\n float dxR = float(dyR) * heightScale;\n int topDxRIndex = int(floor(dxR));\n int bottomDxRIndex = int(min(ceil(dxR), ${n-1}.0));\n float dxRLerp = dxR - float(topDxRIndex);\n float inverseDxRLerp = 1.0 - dxRLerp;\n\n float dxC = float(dyC) * widthScale;\n int leftDxCIndex = int(floor(dxC));\n int rightDxCIndex = int(min(ceil(dxC), ${s-1}.0));\n float dxCLerp = dxC - float(leftDxCIndex);\n float inverseDxCLerp = 1.0 - dxCLerp;\n\n if (r == topDxRIndex && c == leftDxCIndex) {\n // topLeft\n accumulator +=\n getDy(b, dyR, dyC, d) * inverseDxRLerp * inverseDxCLerp;\n }\n\n if (r == topDxRIndex && c == rightDxCIndex) {\n // topRight\n accumulator += getDy(b, dyR, dyC, d) * inverseDxRLerp * dxCLerp;\n }\n\n if (r == bottomDxRIndex && c == leftDxCIndex) {\n // bottomLeft\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * inverseDxCLerp;\n }\n\n if (r == bottomDxRIndex && c == rightDxCIndex) {\n // bottomRight\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * dxCLerp;\n }\n }\n }\n // End loop over dy\n\n setOutput(accumulator);\n }\n `}};function vZ(r){let{inputs:e,backend:t,attrs:o}=r,{images:n,dy:s}=e,{alignCorners:a}=o,i=new dg(s.shape,n.shape,a);return t.runWebGLProgram(i,[s],s.dtype)}var XF={kernelName:Vm,backendName:\"webgl\",kernelFunc:vZ};var hg=class{constructor(e,t,o,n,s){this.variableNames=[\"A\"],this.outputShape=[];let[a,i,p,u]=e;this.outputShape=[a,t,o,u];let c=[n&&t>1?i-1:i,n&&o>1?p-1:p],l=[n&&t>1?t-1:t,n&&o>1?o-1:o],m=n?\"0.5\":\"0.0\",f;s?f=\"max((vec2(yRC) + vec2(0.5)) * effectiveInputOverOutputRatioRC, vec2(0.0))\":f=\"vec2(yRC) * effectiveInputOverOutputRatioRC\",this.userCode=`\n const vec2 effectiveInputOverOutputRatioRC = vec2(\n ${c[0]/l[0]},\n ${c[1]/l[1]});\n const vec2 inputShapeRC = vec2(${i}.0, ${p}.0);\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n ivec2 yRC = coords.yz;\n\n // Fractional source index.\n vec2 sourceFracIndexRC = ${f};\n\n // Compute the coordinators of nearest neighbor point.\n ivec2 sourceNearestRC = ivec2(\n min(inputShapeRC - 1.0, floor(sourceFracIndexRC + ${m})));\n float newValue = getA(b, sourceNearestRC.x, sourceNearestRC.y, d);\n\n setOutput(newValue);\n }\n `}};var gg=class{constructor(e,t,o,n,s){this.variableNames=[\"A\"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=[];let[a,i,p,u]=e;this.outputShape=[a,t,o,u];let c=[n&&t>1?i-1:i,n&&o>1?p-1:p],l=[n&&t>1?t-1:t,n&&o>1?o-1:o],m=n?\"0.5\":\"0.0\",f;s?f=\"max((vec3(yRC) + vec3(0.5)) * effectiveInputOverOutputRatioRC, vec3(0.0))\":f=\"vec3(yRC) * effectiveInputOverOutputRatioRC\",this.userCode=`\n const vec3 effectiveInputOverOutputRatioRC = vec3(\n ${c[0]/l[0]},\n ${c[1]/l[1]},\n ${c[1]/l[1]});\n const vec3 inputShapeRC = vec3(${i}.0, ${p}.0,\n ${p}.0);\n\n float getAValue(int b, int r, int c, int d) {\n return getChannel(getA(b, r, c, d), vec2(c, d));\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n // Calculate values for next column in yRC.z.\n ivec3 yRC = coords.yzz + ivec3(0, 0, 1);\n\n // Fractional source index.\n vec3 sourceFracIndexRC = ${f};\n\n // Compute the coordinators of nearest neighbor point.\n ivec3 sourceNearestRC = ivec3(\n min(inputShapeRC - 1.0, floor(sourceFracIndexRC + ${m})));\n\n // Should we calculate next column and row elements in 2x2 packed cell.\n bool hasNextCol = d < ${u-1};\n bool hasNextRow = coords.z < ${o-1};\n\n vec4 newValue = vec4(\n getAValue(b, sourceNearestRC.x, sourceNearestRC.y, d),\n hasNextCol ? getAValue(b, sourceNearestRC.x, sourceNearestRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceNearestRC.x, sourceNearestRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceNearestRC.x, sourceNearestRC.z, d + 1) : 0.0);\n\n setOutput(newValue);\n }\n `}};function kZ(r){let{inputs:e,backend:t,attrs:o}=r,{images:n}=e,{alignCorners:s,halfPixelCenters:a,size:i}=o,[p,u]=i,c=P().getBool(\"WEBGL_PACK_IMAGE_OPERATIONS\")?new gg(n.shape,p,u,s,a):new hg(n.shape,p,u,s,a);return t.runWebGLProgram(c,[n],n.dtype)}var YF={kernelName:Wn,backendName:\"webgl\",kernelFunc:kZ};var xg=class{constructor(e,t,o){this.variableNames=[\"dy\"],this.outputShape=[],this.outputShape=t;let[,n,s]=t,[,a,i]=e,p=[o&&a>1?n-1:n,o&&i>1?s-1:s],u=[o&&a>1?a-1:a,o&&i>1?i-1:i],c=p[0]/u[0],l=p[1]/u[1],m=1/c,f=1/l,d=Math.ceil(m)*2+2,h=Math.ceil(f)*2+2;this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n int r = coords[1];\n int c = coords[2];\n\n float accumulator = 0.0;\n\n const float heightScale = float(${c});\n const float widthScale = float(${l});\n\n const float invHeightScale = float(${m});\n const float invWidthScale = float(${f});\n\n const int winHeight = int(${d});\n const int winWidth = int(${h});\n\n // Compute bounds for where in dy we will look\n float startRLerp = floor(float(r) * invHeightScale);\n int startDyR = int(floor(startRLerp - float(winHeight / 2)));\n\n float startCLerp = floor(float(c) * invWidthScale);\n int startDyC = int(floor(startCLerp - float(winWidth / 2)));\n\n // Loop over dy\n for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) {\n int dyR = dyROffset + startDyR;\n\n // Guard against the window exceeding the bounds of dy\n if (dyR < 0 || dyR >= ${a}) {\n continue;\n }\n\n for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n int dyC = dyCOffset + startDyC;\n\n // Guard against the window exceeding the bounds of dy\n if (dyC < 0 || dyC >= ${i}) {\n continue;\n }\n\n float sourceFracRow =\n float(${p[0]}) *\n (float(dyR) / float(${u[0]}));\n\n float sourceFracCol =\n float(${p[1]}) *\n (float(dyC) / float(${u[1]}));\n\n int sourceNearestRow = int(min(\n float(int(${n}) - 1),\n ${o} ? float(round(sourceFracRow)) :\n float(floor(sourceFracRow))));\n\n int sourceNearestCol = int(min(\n float(int(${s}) - 1),\n ${o} ? float(round(sourceFracCol)) :\n float(floor(sourceFracCol))));\n\n if (r == sourceNearestRow && c == sourceNearestCol) {\n accumulator += getDy(b, dyR, dyC, d);\n }\n }\n }\n // End loop over dy\n\n setOutput(accumulator);\n }\n `}};function TZ(r){let{inputs:e,backend:t,attrs:o}=r,{images:n,dy:s}=e,{alignCorners:a}=o,i=new xg(s.shape,n.shape,a);return t.runWebGLProgram(i,[s],s.dtype)}var QF={kernelName:Bm,backendName:\"webgl\",kernelFunc:TZ};var yg=class{constructor(e,t){this.variableNames=[\"x\"];let o=e.length;if(o>4)throw new Error(`WebGL backend: Reverse of rank-${o} tensor is not yet supported`);if(this.outputShape=e,o===1){this.userCode=`\n void main() {\n int coord = getOutputCoords();\n setOutput(getX(${e[0]} - coord - 1));\n }\n `;return}let n=i=>t.indexOf(i)!==-1&&e[i]!==1?`${e[i]} - coords[${i}] - 1`:`coords[${i}]`,s=e.map((i,p)=>n(p)).join(\",\"),a=_e(o);this.userCode=`\n void main() {\n ${a} coords = getOutputCoords();\n setOutput(getX(${s}));\n }\n `}};var bg=class{constructor(e,t){this.variableNames=[\"x\"],this.packedInputs=!0,this.packedOutput=!0;let o=e.length;if(o>4)throw new Error(`WebGL backend: Reverse of rank-${o} tensor is not yet supported`);this.outputShape=e;let n=$t(\"rc\",o),s=`${n[o-1]} + 1 < ${this.outputShape[o-1]}`,a=`${n[o-2]} + 1 < ${this.outputShape[o-2]}`,i=_e(o);o===1?this.userCode=`\n void main(){\n int rc = getOutputCoords();\n vec4 result = vec4(0.);\n result.r = getChannel(getX(${e[0]} - rc - 1),\n ${e[0]} - rc - 1);\n if(${s}){\n result.g = getChannel(getX(${e[0]} - (rc + 1) - 1),\n ${e[0]} - (rc + 1) - 1);\n }\n setOutput(result);\n }\n `:this.userCode=`\n void main() {\n ${i} rc = getOutputCoords();\n vec4 result = vec4(0.);\n result.r = ${p(n.slice())};\n if(${s}){\n result.g = ${u(n.slice())};\n }\n if(${a}) {\n result.b = ${c(n.slice())};\n if(${s}) {\n result.a = ${l(n.slice())};\n }\n }\n setOutput(result);\n }\n `;function p(d){return m(d)}function u(d){return d[o-1]=\"(\"+d[o-1]+\" + 1)\",m(d)}function c(d){return d[o-2]=\"(\"+d[o-2]+\" + 1)\",m(d)}function l(d){return d[o-1]=\"(\"+d[o-1]+\" + 1)\",d[o-2]=\"(\"+d[o-2]+\" + 1)\",m(d)}function m(d){let h=e.map((b,C)=>f(C,d)),g=h.join(\",\"),y=h.slice(-2).join(\",\");return`getChannel(getX(${g}), vec2(${y}))`}function f(d,h){return t.indexOf(d)!==-1&&e[d]!==1?`${e[d]} - ${h[d]} - 1`:`${h[d]}`}}};function NZ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{dims:s}=o,a=n.shape.length,i=x.parseAxisParam(s,n.shape);if(a===0)return Rt({inputs:{x:n},backend:t});let p=P().getBool(\"WEBGL_PACK_ARRAY_OPERATIONS\")?new bg(n.shape,i):new yg(n.shape,i);return t.runWebGLProgram(p,[n],n.dtype)}var ZF={kernelName:fa,backendName:\"webgl\",kernelFunc:NZ};var Cg=class{constructor(e,t){this.variableNames=[\"Image\"],this.outputShape=[],this.customUniforms=[{name:\"params\",type:\"vec4\"}];let o=e[1],n=e[2];this.outputShape=e;let s=\"\";typeof t==\"number\"?s=`float outputValue = ${t.toFixed(2)};`:s=`\n vec3 fill = vec3(${t.join(\",\")});\n float outputValue = fill[coords[3]];`,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int x = coords[2];\n int y = coords[1];\n float coordXFloat = (float(x) - params[0]) * params[3] -\n (float(y) - params[1]) * params[2];\n float coordYFloat = (float(x) - params[0]) * params[2] +\n (float(y) - params[1]) * params[3];\n int coordX = int(round(coordXFloat + params[0]));\n int coordY = int(round(coordYFloat + params[1]));\n ${s}\n if(coordX >= 0 && coordX < ${n} && coordY >= 0 && coordY < ${o}) {\n outputValue = getImage(coords[0], coordY, coordX, coords[3]);\n }\n setOutput(outputValue);\n }\n `}};var JF={kernelName:es,backendName:\"webgl\",kernelFunc:({inputs:r,attrs:e,backend:t})=>{let{image:o}=r,{radians:n,fillValue:s,center:a}=e,i=t,p=new Cg(o.shape,s),[u,c]=I.getImageCenter(a,o.shape[1],o.shape[2]),l=[[u,c,Math.sin(n),Math.cos(n)]];return i.runWebGLProgram(p,[o],o.dtype,l)}};var _Z=`\n // OpenGL ES does not support round function.\n // The algorithm is based on banker's rounding.\n float base = floor(x);\n if ((x - base) < 0.5) {\n return floor(x);\n } else if ((x - base) > 0.5) {\n return ceil(x);\n } else {\n if (mod(base, 2.0) == 0.0) {\n return base;\n } else {\n return base + 1.0;\n }\n }\n`,EZ=he({opSnippet:_Z}),eD={kernelName:da,backendName:\"webgl\",kernelFunc:EZ};var $Z=\"return inversesqrt(x);\",RZ=he({opSnippet:$Z,cpuKernelImpl:F$}),tD={kernelName:xo,backendName:\"webgl\",kernelFunc:RZ};var vc=class{constructor(e,t,o,n,s,a,i=!0){this.variableNames=[\"updates\",\"indices\",\"defaultValue\"],this.outputShape=a;let p=_e(s.length),u=_e(a.length),c=\"\";o===1?c=\"i\":o===2&&(c=\"i, j\");let l=`getIndices(${c})`,m=\"\";n===1?m=\"i\":n===2&&(m=\"i, coords[1]\");let f=`getUpdates(${m})`,d=t>1?\"strides[j]\":\"strides\";this.userCode=`\n ${p} strides = ${p}(${s});\n\n void main() {\n ${u} coords = getOutputCoords();\n float sum = 0.0;\n bool found = false;\n for (int i = 0; i < ${e}; i++) {\n int flattenedIndex = 0;\n for (int j = 0; j < ${t}; j++) {\n int index = round(${l});\n flattenedIndex += index * ${d};\n }\n if (flattenedIndex == coords[0]) {\n sum += ${f};\n found = true;\n }\n }\n setOutput(mix(getDefaultValue(), sum, float(found)));\n }\n `}};function AZ(r){let{inputs:e,backend:t,attrs:o}=r,{indices:n,updates:s}=e,{shape:a}=o,{sliceRank:i,numUpdates:p,sliceSize:u,strides:c,outputSize:l}=I.calculateShapes(s,n,a),m=[l/u,u];if(l===0)return t.makeTensorInfo(a,n.dtype);let f=J({inputs:{x:n},backend:t,attrs:{shape:[p,i]}}),d=J({inputs:{x:s},backend:t,attrs:{shape:[p,u]}}),h=t.makeTensorInfo([],\"float32\",new Float32Array([0])),g=new vc(p,i,f.shape.length,d.shape.length,c,m),y=t.runWebGLProgram(g,[d,f,h],d.dtype),b=J({inputs:{x:y},backend:t,attrs:{shape:a}});return t.disposeIntermediateTensorInfo(f),t.disposeIntermediateTensorInfo(d),t.disposeIntermediateTensorInfo(y),t.disposeIntermediateTensorInfo(h),b}var rD={kernelName:Hn,backendName:\"webgl\",kernelFunc:AZ};var Ig=class{constructor(e,t,o,n){this.variableNames=[\"sortedSequence\",\"values\"],this.customUniforms=[{name:\"numInputs\",type:\"int\"}],this.outputShape=[e,o];let s=\"while (left < right) {\",a=`for (int i = 0; i < ${Math.ceil(Math.log2(t+1))}; ++i) { if (left >= right) break;`,i=P().getNumber(\"WEBGL_VERSION\")===2?s:a,p=n===\"left\"?\"<\":\"<=\";this.userCode=`\n int findBound(int batch, float value) {\n int left = 0;\n int right = numInputs;\n int mid;\n ${i}\n mid = (left + right) / 2;\n if (getSortedSequence(batch, mid) ${p} value) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n return right;\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int valueIndex = coords[1];\n\n float value = getValues(batch, valueIndex);\n\n setOutput(float(findBound(batch, value)));\n }\n `}};function FZ(r){let{inputs:e,backend:t,attrs:o}=r,{sortedSequence:n,values:s}=e,{side:a}=o,i=new Ig(n.shape[0],n.shape[1],s.shape[1],a),p=[[n.shape[1]]];return t.runWebGLProgram(i,[n,s],\"int32\",p)}var oD={kernelName:Ep,backendName:\"webgl\",kernelFunc:FZ};var wg=class{constructor(e,t,o){this.variableNames=[\"c\",\"a\",\"b\"],this.outputShape=t;let n,s;if(o>4)throw Error(`Where for rank ${o} is not yet supported`);if(o===1)s=\"resRC\",n=\"resRC\";else{let i=[\"resRC.x\",\"resRC.y\",\"resRC.z\",\"resRC.w\"],p=[],u=[];for(let c=0;c= 1.0) {\n setOutput(getA(${s}));\n } else {\n setOutput(getB(${s}));\n }\n }\n `}};function DZ(r){let{inputs:e,backend:t}=r,{condition:o,t:n,e:s}=e,a=new wg(o.shape.length,n.shape,n.shape.length);return t.runWebGLProgram(a,[o,n,s],ct(n.dtype,s.dtype))}var nD={kernelName:vs,backendName:\"webgl\",kernelFunc:DZ};var PZ=`\n // Stable and Attracting Fixed Point (0, 1) for Normalized Weights.\n // see: https://arxiv.org/abs/1706.02515\n float scaleAlpha = ${I.SELU_SCALEALPHA};\n float scale = ${I.SELU_SCALE};\n return (x >= 0.0) ? scale * x : scaleAlpha * (exp(x) - 1.0);\n`,OZ=he({opSnippet:PZ}),sD={kernelName:Xi,backendName:\"webgl\",kernelFunc:OZ};var MZ=jo+`\n return 1.0 / (1.0 + exp(-1.0 * x));\n`,LZ=`\n vec4 result = 1.0 / (1.0 + exp(-1.0 * x));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n`,BZ=he({opSnippet:MZ,packedOpSnippet:LZ,cpuKernelImpl:P$}),aD={kernelName:yo,backendName:\"webgl\",kernelFunc:BZ};var VZ=`\n if (isnan(x)) { return 0.0; }\n return sign(x);\n`,zZ=he({opSnippet:VZ}),iD={kernelName:Yi,backendName:\"webgl\",kernelFunc:zZ};var WZ=jo+`\n return sin(x);\n`,UZ=he({opSnippet:WZ}),uD={kernelName:Kn,backendName:\"webgl\",kernelFunc:UZ};var GZ=`\n float e2x = exp(x);\n return (e2x - 1.0 / e2x) / 2.0;\n`,HZ=he({opSnippet:GZ}),pD={kernelName:ha,backendName:\"webgl\",kernelFunc:HZ};var qZ=`\n float epsilon = 1.1920928955078125e-7;\n float threshold = log(epsilon) + 2.0;\n\n bool too_large = x > -threshold;\n bool too_small = x < threshold;\n\n float result;\n float exp_x = exp(x);\n\n if (too_large){\n result = x;\n }\n else if (too_small){\n result = exp_x;\n }\n else{\n result = log(exp_x + 1.0);\n }\n return result;\n`,KZ=he({opSnippet:qZ}),cD={kernelName:Qi,backendName:\"webgl\",kernelFunc:KZ};var jZ=r=>{let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{blockShape:s,paddings:a}=o;x.assert(n.shape.length<=4,()=>\"spaceToBatchND for rank > 4 with a WebGL backend not implemented yet\");let i=s.reduce((y,b)=>y*b),p=[[0,0]];p.push(...a);for(let y=1+s.length;yt.disposeIntermediateTensorInfo(y)),g},lD={kernelName:ks,backendName:\"webgl\",kernelFunc:jZ};function XZ(r){let{inputs:e,backend:t}=r,{indices:o,values:n,denseShape:s,defaultValue:a}=e;if(s.shape.length!==1)throw new Error(`Dense shape must be a vector, saw:\n ${s.shape}`);if(o.shape.length!==2)throw new Error(`Indices must be a matrix, saw:\n ${o.shape}`);if(n.shape.length!==1)throw new Error(`Values must be a vector, saw:\n ${n.shape}`);if(a.shape.length!==0)throw new Error(`Default value must be a scalar, saw:\n ${a.shape}`);let i=t.readSync(o.dataId),p=t.readSync(n.dataId),u=t.readSync(s.dataId),c=t.readSync(a.dataId)[0],[l,m,f,d,h]=M$(i,o.shape,o.dtype,p,n.dtype,u,c);return[t.makeTensorInfo(m,o.dtype,l),t.makeTensorInfo([m[0]],n.dtype,f),t.makeTensorInfo([d.length],\"bool\",new Uint8Array(d.map(g=>Number(g)))),t.makeTensorInfo([h.length],o.dtype,new Int32Array(h))]}var mD={kernelName:Qa,backendName:\"webgl\",kernelFunc:XZ};function YZ(r){let{inputs:e,backend:t}=r,{inputIndices:o,inputShape:n,newShape:s}=e;if(o.shape.length!==2)throw new Error(`Input indices should be a matrix but received shape ${o.shape}`);if(n.shape.length!==1)throw new Error(`Input shape should be a vector but received shape ${n.shape}`);if(s.shape.length!==1)throw new Error(`Target shape should be a vector but received shape ${s.shape}`);let a=Array.from(t.readSync(n.dataId)),i=t.readSync(o.dataId),p=Array.from(t.readSync(s.dataId)),[u,c,l]=L$(i,o.shape,o.dtype,a,p);return[t.makeTensorInfo(c,o.dtype,u),t.makeTensorInfo([l.length],s.dtype,new Int32Array(l))]}var fD={kernelName:ga,backendName:\"webgl\",kernelFunc:YZ};function QZ(r){let{inputs:e,backend:t}=r,{data:o,indices:n,segmentIds:s}=e;if(o.shape.length<1)throw new Error(\"Data should be at least 1 dimensional but received scalar\");if(n.shape.length!==1)throw new Error(`Indices should be a vector but received shape\n ${n.shape}`);if(s.shape.length!==1)throw new Error(`Segment ids should be a vector but received shape\n ${s.shape}`);let a=t.readSync(o.dataId),i=t.readSync(n.dataId),p=t.readSync(s.dataId),[u,c]=sh(a,o.shape,o.dtype,i,p,!0);return t.makeTensorInfo(c,o.dtype,u)}var dD={kernelName:Za,backendName:\"webgl\",kernelFunc:QZ};function ZZ(r){let{inputs:e,backend:t}=r,{data:o,indices:n,segmentIds:s}=e;if(o.shape.length<1)throw new Error(\"Data should be at least 1 dimensional but received scalar\");if(n.shape.length!==1)throw new Error(`Indices should be a vector but received shape\n ${n.shape}`);if(s.shape.length!==1)throw new Error(`Segment ids should be a vector but received shape\n ${s.shape}`);let a=t.readSync(o.dataId),i=t.readSync(n.dataId),p=t.readSync(s.dataId),[u,c]=sh(a,o.shape,o.dtype,i,p);return t.makeTensorInfo(c,o.dtype,u)}var hD={kernelName:Ja,backendName:\"webgl\",kernelFunc:ZZ};function JZ(r){let{inputs:e,backend:t,attrs:o}=r,{sparseIndices:n,sparseValues:s,defaultValue:a}=e,{outputShape:i}=o,{sliceRank:p,numUpdates:u,sliceSize:c,strides:l,outputSize:m}=I.calculateShapes(s,n,i),f=!1;if(s.dtype===\"string\"){let y=t.bufferSync(n),b=t.bufferSync(s),C=x.decodeString(t.readSync(a.dataId)[0]),w=D$(y,b,i,m,c,u,p,l,C,f);return t.makeTensorInfo(i,w.dtype,w.values)}let d=new vc(u,p,n.shape.length,s.shape.length,l,[m,1],f),h=t.runWebGLProgram(d,[s,n,a],s.dtype),g=J({inputs:{x:h},backend:t,attrs:{shape:i}});return t.disposeIntermediateTensorInfo(h),g}var gD={kernelName:ei,backendName:\"webgl\",kernelFunc:JZ};function e9(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{numOrSizeSplits:s,axis:a}=o,i=x.parseAxisParam(a,n.shape)[0],p=I.prepareSplitSize(n,s,i),u=n.shape.length,c=new Array(u).fill(0),l=n.shape.slice();return p.map(m=>{let f=[...l];f[i]=m;let d=ps({inputs:{x:n},backend:t,attrs:{begin:c,size:f}});return c[i]+=m,d})}var xD={kernelName:Ts,backendName:\"webgl\",kernelFunc:e9};var yD=\"return sqrt(x);\",t9=he({opSnippet:yD,packedOpSnippet:yD,cpuKernelImpl:B$}),bD={kernelName:bo,backendName:\"webgl\",kernelFunc:t9};var r9=\"return x * x;\",o9=he({opSnippet:r9}),CD={kernelName:ti,backendName:\"webgl\",kernelFunc:o9};var ID=\"return (a - b) * (a - b);\",n9=ot({opSnippet:ID,packedOpSnippet:ID}),wD={kernelName:Co,backendName:\"webgl\",kernelFunc:n9};function s9({inputs:r,attrs:e,backend:t}){let{x:o}=r,n=Vt+`\n return x > 0.0 ? 1.0 : float(${e.alpha});\n `,s=new fr(o.shape,n);return t.runWebGLProgram(s,[o],o.dtype)}var SD={kernelName:$s,backendName:\"webgl\",kernelFunc:s9};var Sg=class{constructor(e,t,o){this.variableNames=[\"x\"],this.outputShape=o;let n=o.length,s=_e(o.length),a=_e(o.length),i=\"\";if(n===1)i=\"coords * strides + begin\";else{let p=0;i=o.map((u,c)=>(p++,o.length===1?`coords * strides[${c}] + begin[${c}]`:`coords[${p-1}] * strides[${c}] + begin[${c}]`)).join(\",\")}this.userCode=`\n ${s} begin = ${s}(${e});\n ${s} strides = ${s}(${t});\n\n void main() {\n ${a} coords = getOutputCoords();\n setOutput(getX(${i}));\n }\n `}};function a9(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{begin:s,end:a,strides:i,beginMask:p,endMask:u,ellipsisMask:c,newAxisMask:l,shrinkAxisMask:m}=o,{finalShapeSparse:f,finalShape:d,isIdentity:h,sliceDim0:g,isSimpleSlice:y,begin:b,end:C,strides:w}=et.sliceInfo(n.shape,s,a,i,p,u,c,l,m),k;if(h)k=J({inputs:{x:n},backend:t,attrs:{shape:d}});else if(g||y){x.assert(n.shape.length>=1,()=>`Input must have rank at least 1, got: ${n.shape.length}`);let E=et.computeOutShape(b,C,w),R=ps({inputs:{x:n},backend:t,attrs:{begin:b,size:E}});k=J({inputs:{x:R},backend:t,attrs:{shape:d}}),t.disposeIntermediateTensorInfo(R)}else if(t.shouldExecuteOnCPU([n])){let R=t.readSync(n.dataId),A=ne(n.shape,n.dtype,R),D=V$(f,A,w,b);k=t.makeTensorInfo(d,n.dtype,D.values)}else{let R=new Sg(b,w,f);k=t.runWebGLProgram(R,[n],n.dtype)}let _=J({inputs:{x:k},backend:t,attrs:{shape:d}});return t.disposeIntermediateTensorInfo(k),_}var vD={kernelName:Yn,backendName:\"webgl\",kernelFunc:a9};function i9(r){let{inputs:e,backend:t,attrs:o}=r,{separator:n,nGramWidths:s,leftPad:a,rightPad:i,padWidth:p,preserveShortSequences:u}=o,{data:c,dataSplits:l}=e,m=t.readSync(c.dataId),f=t.readSync(l.dataId),[d,h]=z$(m,f,n,s,a,i,p,u);return[t.makeTensorInfo([d.length],\"string\",d),t.makeTensorInfo(l.shape,\"int32\",h)]}var kD={kernelName:Ns,backendName:\"webgl\",kernelFunc:i9};function u9(r){let{inputs:e,backend:t,attrs:o}=r,{skipEmpty:n}=o,{input:s,delimiter:a}=e;if(s.dtype!==\"string\")throw new Error(\"Input must be of datatype string\");if(s.shape.length!==1)throw new Error(`Input must be a vector, got shape: ${s.shape}`);if(a.shape.length!==0)throw new Error(`Delimiter must be a scalar, got shape: ${a.shape}`);let i=t.readSync(s.dataId),p=t.readSync(a.dataId)[0],[u,c,l]=W$(i,p,n),m=c.length;return[t.makeTensorInfo([m,2],\"int32\",u),t.makeTensorInfo([m],\"string\",c),t.makeTensorInfo([2],\"int32\",new Int32Array(l))]}var TD={kernelName:ri,backendName:\"webgl\",kernelFunc:u9};function p9(r){let{inputs:e,backend:t,attrs:o}=r,{numBuckets:n}=o,{input:s}=e;if(s.dtype!==\"string\")throw new Error(\"Input must be of datatype string\");if(n<=0)throw new Error(\"Number of buckets must be at least 1\");let a=t.readSync(s.dataId),i=U$(a,n);return t.makeTensorInfo(s.shape,\"int32\",i)}var ND={kernelName:oi,backendName:\"webgl\",kernelFunc:p9};var c9=\"return tan(x);\",l9=he({opSnippet:c9}),_D={kernelName:xa,backendName:\"webgl\",kernelFunc:l9};var m9=`\n float e2x = exp(-2.0 * abs(x));\n return sign(x) * (1.0 - e2x) / (1.0 + e2x);\n`,f9=he({opSnippet:m9}),ED={kernelName:Qn,backendName:\"webgl\",kernelFunc:f9};var vg=class{constructor(e,t){this.variableNames=[\"A\"];let o=new Array(e.length);for(let a=0;a5)throw Error(`Tile for rank ${e} is not yet supported`);if(e===1)return`imod(resRC, ${r[0]})`;let t=[\"resRC.x\",\"resRC.y\",\"resRC.z\",\"resRC.w\",\"resRC.u\"],o=[];for(let n=0;n5){let p=t.readSync(n.dataId),u=n.dtype===\"string\"?p.map(m=>x.decodeString(m)):p,c=ne(n.shape,n.dtype,u),l=H$(c,s);return t.makeTensorInfo(l.shape,l.dtype,l.values)}let a=new vg(n.shape,s);return t.runWebGLProgram(a,[n],n.dtype)}var $D={kernelName:wo,backendName:\"webgl\",kernelFunc:Hw};var kg=class{constructor(e){this.variableNames=[\"x\",\"indices\"],this.customUniforms=[{name:\"n\",type:\"int\"},{name:\"firstPass\",type:\"int\"},{name:\"negativeInf\",type:\"float\"},{name:\"dir\",type:\"int\"},{name:\"inc\",type:\"int\"}],this.outputShape=e,this.userCode=`\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int elemIdx = coords[1];\n\n // We compare elements pair-wise within a group of size 2 * inc.\n // The comparing rule for each group alternates between ascending\n // and descending. Within each group, we compare each pair at\n // positions i and i+inc. To decide whether an element at position i\n // is x0 or x1, we mod it by 2 * inc, if the result is smaller than\n // inc, it is in the first half of the group, we denote it as x0,\n // otherwise we denote it as x1.\n // For example, as shown in the Bitonic top K paper referenced above,\n // Figure5(a) shows that element[1] is in the\n // second half of the group when group size is 2, but it is in the\n // first half of the group when group size is 4.\n\n bool isFirstInPair = imod(elemIdx, 2 * inc) < inc;\n int i = isFirstInPair ? elemIdx : elemIdx - inc;\n\n int i0 = firstPass == 1 ? i : int(getIndices(batch, i));\n int i1 = firstPass == 1 ? i + inc : int(getIndices(batch, i + inc));\n float x0 = i0 < n ? getX(batch, i0) : negativeInf;\n float x1 = i1 < n ? getX(batch, i1) : negativeInf;\n\n // Denotes which direction indices are in (ascending or descending).\n bool reverse = imod(elemIdx, 2 * dir) >= dir;\n bool isGreater = x0 > x1 || (x0 == x1 && i1 > i0);\n if (reverse == isGreater) { // Elements in opposite order of direction\n int iTemp = i0;\n i0 = i1;\n i1 = iTemp;\n }\n if (isFirstInPair) {\n setOutput(float(i0));\n } else {\n setOutput(float(i1));\n }\n }\n `}},Tg=class{constructor(e){this.variableNames=[\"x\",\"indices\"],this.customUniforms=[{name:\"n\",type:\"int\"},{name:\"firstPass\",type:\"int\"},{name:\"k\",type:\"int\"}],this.outputShape=e,this.userCode=`\n void main() {\n // Takes max of indices (0, k), (1, k + 1), (2, k + 2) ...\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int elemIdx = coords[1];\n\n // The output size is half of the previous size.\n // If the previous sequence is | | | | _ _ _ _ | | | | _ _ _ _ (k=4),\n // we only need to output the indices at positions |, the indices at\n // positions _ can be thrown away, see Figure5(b) After Phase 2\n // (Merge phase) in the Bitonic Top K paper referenced above.\n // For example, the paper shows we only need to output the orange bars.\n // The output sequence should look like this | | | | | | | |.\n // Because the sequence is halved, to map the output index back\n // to the previous sequence to find the corresponding value,\n // we need to double the index. When we double the index,\n // we basically interpolate a position, so 2i looks like\n // | _ | _ | _ | _ | _ | _ | _. We move the | to the first k position\n // of each 2k positions by - elemIdx % k. E.g. for output at\n // index 4,5,6,7, we want to get the corresponding element at\n // original index 8,9,10,11, for output at index 8,9,10,11,\n // we want to get the corresponding element at original index\n // 16,17,18,19, so on and so forth.\n\n int i = elemIdx < k ? elemIdx : (elemIdx * 2 - imod(elemIdx, k));\n int i0 = firstPass == 1 ? i : int(getIndices(batch, i));\n int i1 = firstPass == 1 ? i + k : int(getIndices(batch, i + k));\n\n float x0 = getX(batch, i0);\n float x1 = i1 < n ? getX(batch, i1) : x0;\n\n setOutput(x0 >= x1 ? float(i0) : float(i1));\n }\n `}};function Vu(r,e){e!==null&&r.disposeIntermediateTensorInfo(e)}function RD(r){let e=1;for(;ep){let D=t.readSync(n.dataId),[O,M]=q$(D,u,n.dtype,s,a);return[t.makeTensorInfo(O.shape,O.dtype,O.values),t.makeTensorInfo(M.shape,M.dtype,M.values)]}if(s===0)return u[u.length-1]=0,[t.makeTensorInfo(u,n.dtype,[]),t.makeTensorInfo(u,\"int32\",[])];if(c===1)return[n,Ba({attrs:{shape:u,dtype:\"int32\",value:0},backend:t})];let l=t.texData.get(n.dataId),m=l!==null&&l.isPacked,f=m?t.unpackTensor(n):n,h=x.sizeFromShape(u)/c,g=J({inputs:{x:f},attrs:{shape:[h,c]},backend:t});m&&Vu(t,f);let y=RD(s),b=RD(c),C=null,w=()=>C===null?[g,g]:[g,C],k=(D,O,M)=>{let L=w(),W=new kg(M),G=[[c],[C===null?1:0],[Number.NEGATIVE_INFINITY],[D],[O]],q=C;C=t.runWebGLProgram(W,L,\"int32\",G),Vu(t,q)};for(let D=1;D=1;M/=2)k(O,M,[h,b])}for(let D=b;D>y;D/=2){let O=w(),M=new Tg([h,D/2]),W=[[c],[C===null?1:0],[y]],V=C;C=t.runWebGLProgram(M,O,\"int32\",W),Vu(t,V);let G=y/2,q=G*2;for(let H=G;H>=1;H/=2)k(q,H,C.shape)}let _=C;C=ps({inputs:{x:C},backend:t,attrs:{begin:0,size:[h,s]}}),Vu(t,_);let E=Lw({inputs:{x:g,indices:C},backend:t,attrs:{axis:1,batchDims:1}});Vu(t,g);let R=u.slice(0,-1);R.push(s),_=C,C=J({inputs:{x:C},attrs:{shape:R},backend:t}),Vu(t,_);let A=E;return E=J({inputs:{x:E},attrs:{shape:R},backend:t}),Vu(t,A),[E,C]}var AD={kernelName:Zn,backendName:\"webgl\",kernelFunc:h9};var Ng=class{constructor(e,t,o,n,s,a){this.variableNames=[\"Image\",\"Transforms\"],this.outputShape=a;let i=o===\"nearest\"?1:2,p;switch(n){case\"constant\":p=1;break;case\"reflect\":p=2;break;case\"wrap\":p=3;break;case\"nearest\":p=4;break;default:p=1;break}this.userCode=`\n float mapCoord(float outCoord, float len) {\n float inCoord = outCoord;\n if(${p} == 2) {\n if (inCoord < 0.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz2 = 2.0 * len;\n if (inCoord < sz2) {\n inCoord = sz2 * float(int(float(-inCoord / sz2))) +\n inCoord;\n }\n inCoord = inCoord < -len ? inCoord + sz2 : -inCoord - 1.0;\n }\n } else if (inCoord > len - 1.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz2 = 2.0 * len;\n inCoord -= sz2 * float(int(float(inCoord / sz2)));\n if (inCoord >= len) {\n inCoord = sz2 - inCoord - 1.0;\n }\n }\n }\n return clamp(inCoord, 0.0, len - 1.0);\n } else if (${p} == 3) {\n if (inCoord < 0.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz = len - 1.0;\n inCoord += len * (float(int(float(-inCoord / sz))) + 1.0);\n }\n } else if (inCoord > len - 1.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz = len - 1.0;\n inCoord -= len * float(int(float(inCoord / sz)));\n }\n }\n return clamp(inCoord, 0.0, len - 1.0);\n } else if (${p} == 4) {\n return clamp(outCoord, 0.0, len - 1.0);\n } else {\n return outCoord;\n }\n }\n\n float readWithFillValue(int batch, int coordY, int coordX,\n int channel) {\n float outputValue;\n if (0 <= coordY && coordY < ${e} && 0 <= coordX && coordX < ${t}) {\n outputValue = getImage(batch, coordY, coordX, channel);\n } else {\n outputValue = float(${s});\n }\n return outputValue;\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n float outputValue;\n int batch = coords[0];\n int x = coords[2];\n int y = coords[1];\n int channel = coords[3];\n float xf = float(x);\n float yf = float(y);\n float a1 = getTransforms(batch, 0);\n float a2 = getTransforms(batch, 1);\n float a3 = getTransforms(batch, 2);\n float b1 = getTransforms(batch, 3);\n float b2 = getTransforms(batch, 4);\n float b3 = getTransforms(batch, 5);\n float c1 = getTransforms(batch, 6);\n float c2 = getTransforms(batch, 7);\n float projection = c1 * xf + c2 * yf + 1.0;\n if (projection == 0.0) {\n outputValue = float(${s});\n } else {\n float inX = (a1 * xf + a2 * yf + a3) / projection;\n float inY = (b1 * xf + b2 * yf + b3) / projection;\n float mapX = mapCoord(inX, float(${t}));\n float mapY = mapCoord(inY, float(${e}));\n\n if (${i} == 1) {\n int coordY = int(round(mapY));\n int coordX = int(round(mapX));\n outputValue = readWithFillValue(batch, coordY, coordX,\n channel);\n } else {\n float yFloor = floor(mapY);\n float xFloor = floor(mapX);\n float yCeil = yFloor + 1.0;\n float xCeil = xFloor + 1.0;\n float valueYFloor = (xCeil - mapX) *\n readWithFillValue(batch, int(yFloor), int(xFloor), channel) +\n (mapX - xFloor) *\n readWithFillValue(batch, int(yFloor), int(xCeil), channel);\n float valueYCeil = (xCeil - mapX) *\n readWithFillValue(batch, int(yCeil), int(xFloor), channel) +\n (mapX - xFloor) *\n readWithFillValue(batch, int(yCeil), int(xCeil), channel);\n outputValue = (yCeil - mapY) * valueYFloor +\n (mapY - yFloor) * valueYCeil;\n }\n }\n setOutput(outputValue);\n }\n `}};function g9(r){let{inputs:e,backend:t,attrs:o}=r,{image:n,transforms:s}=e,{interpolation:a,fillMode:i,fillValue:p,outputShape:u}=o,[c,l,m,f]=n.shape,[d,h]=u!=null?u:[l,m],g=[c,d,h,f],y=new Ng(l,m,a,i,p,g);return t.runWebGLProgram(y,[n,s],\"float32\")}var FD={kernelName:Jn,backendName:\"webgl\",kernelFunc:g9};function x9(r){let{inputs:e,attrs:t,backend:o}=r,{axis:n}=t,{x:s}=e;as(s,\"unique\"),console.warn(\"WARNING: \",\"UI might be locked temporarily as data is being downloaded\");let a=o.readSync(s.dataId),{outputValues:i,outputShape:p,indices:u}=K$(a,n,s.shape,s.dtype);return[o.makeTensorInfo(p,s.dtype,i),o.makeTensorInfo([u.length],\"int32\",u)]}var DD={kernelName:$p,backendName:\"webgl\",kernelFunc:x9};function y9(r){let{inputs:e,backend:t,attrs:o}=r,{value:n}=e,{axis:s}=o;s<0&&(s+=n.shape.length);let a=n,i=a.shape.length,p=n.shape[s],u=new Array(i-1),c=0;for(let h=0;ht.disposeIntermediateTensorInfo(h)),d}var PD={kernelName:_s,backendName:\"webgl\",kernelFunc:y9};var _g=class{constructor(e,t){this.variableNames=[\"x\",\"segmentIds\"];let o=e.windowSize,n=e.batchSize,s=e.inSize,a=e.numSegments,i=a*Math.ceil(s/o);this.outputShape=[n,i];let p=\"0.0\",u=\"sumValue\",c=Math.floor(o/4)*4,l=o%4,m=`\n sumValue += dot(values, segFilter);\n `,f=\"\";s%o>0&&(f=`\n if (inIdx < 0 || inIdx >= ${s}) {\n return initializationValue;\n }\n `);let d=\"\";s%o>0&&(d=`\n if (inIdx < 0 || inIdx >= ${s}) {\n return -1.0;\n }\n `),this.userCode=`\n const float initializationValue = ${p};\n\n float getValue(int batch, int inIdx) {\n ${f}\n return getX(batch, inIdx);\n }\n\n float getSegmentIdAtIndex(int inIdx) {\n ${d}\n return getSegmentIds(inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = int(floor(float(outIdx) / float(\n ${a})) * float(${o}));\n int currentSeg = int(mod(float(outIdx), float(${a})));\n\n float sumValue = 0.0;\n\n for (int i = 0; i < ${c}; i += 4) {\n int inIdx = inOffset + i;\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 3)) == currentSeg ? 1 : 0\n );\n\n ${m}\n }\n\n int inIdx = inOffset + ${c};\n if (${l===1}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n int inIdxSeg = int(getSegmentIdAtIndex(inIdx));\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n 0,\n 0,\n 0\n );\n\n ${m}\n } else if (${l===2}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n initializationValue,\n initializationValue\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n 0,\n 0\n );\n\n ${m}\n } else if (${l===3}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n initializationValue\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\n 0\n );\n\n ${m}\n }\n setOutput(${u});\n }\n `}};function b9(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,segmentIds:s}=e,{numSegments:a}=o,i=n.shape.length,p=[],u=0,c=I.getAxesPermutation([u],i),l=n;c!=null&&(l=xt({inputs:{x:n},backend:t,attrs:{perm:c}}),p.push(l),u=I.getInnerMostAxes(1,i)[0]);let m=I.segment_util.computeOutShape(l.shape,u,a),f=x.sizeFromShape([l.shape[u]]),d=J({inputs:{x:l},backend:t,attrs:{shape:[-1,f]}});p.push(d);let h=Ca(n.dtype),g=(w,k,_,E,R)=>{let A=w.shape[0],D=w.shape[1],O=I.segment_util.segOpComputeOptimalWindowSize(D,R),M={windowSize:O,inSize:D,batchSize:A,numSegments:R},L=new _g(M,k),W=t.compileAndRun(L,[w,_],E);if(p.push(W),W.shape[1]===R)return W;let V=Gw({backend:t,attrs:{start:0,stop:R,step:1,dtype:\"float32\"}}),G=Hw({inputs:{x:V},backend:t,attrs:{reps:[D/O]}});return p.push(V),p.push(G),g(W,k,G,E,R)},y=g(d,\"unsortedSegmentSum\",s,h,a),b=J({inputs:{x:y},backend:t,attrs:{shape:m}}),C=b;if(c!=null){p.push(b);let w=I.getUndoAxesPermutation(c);C=xt({inputs:{x:C},backend:t,attrs:{perm:w}})}return p.forEach(w=>t.disposeIntermediateTensorInfo(w)),C}var OD={kernelName:Rp,backendName:\"webgl\",kernelFunc:b9};var C9=[IR,SR,vR,kR,NR,_R,ER,$R,FR,DR,PR,OR,MR,LR,BR,VR,zR,WR,UR,GR,HR,KR,jR,XR,JR,tA,rA,lR,nA,aA,iA,uA,pA,cA,lA,mA,fA,dA,hA,yA,bA,CA,IA,wA,SA,vA,kA,TA,NA,_A,EA,$A,RA,AA,FA,PA,OA,MA,LA,VA,zA,WA,UA,GA,HA,qA,KA,jA,cR,XA,sA,YA,QA,ZA,mR,JA,eF,tF,rF,oF,nF,sF,aF,iF,uF,cF,lF,mF,fF,dF,hF,xF,bF,CF,IF,wF,SF,_F,hR,EF,$F,RF,AF,YR,FF,OF,MF,LF,BF,fR,VF,zF,WF,UF,GF,QR,vF,HF,qF,KF,xR,jF,XF,YF,QF,ZF,JF,eD,tD,rD,oD,nD,sD,aD,iD,uD,pD,qR,NF,cD,lD,mD,fD,dD,hD,gD,xD,bD,CD,wD,SD,vD,kD,TD,ND,TF,bR,_D,ED,$D,AD,FD,CR,DD,PD,OD,DF];for(let r of C9)ya(r);var Ae;(function(r){r[r.float32=0]=\"float32\",r[r.int32=1]=\"int32\",r[r.bool=2]=\"bool\",r[r.string=3]=\"string\",r[r.complex64=4]=\"complex64\"})(Ae||(Ae={}));var $i;(function(r){r[r.linear=0]=\"linear\",r[r.relu=1]=\"relu\",r[r.relu6=2]=\"relu6\",r[r.prelu=3]=\"prelu\",r[r.leakyrelu=4]=\"leakyrelu\",r[r.sigmoid=5]=\"sigmoid\",r[r.elu=6]=\"elu\"})($i||($i={}));var MD;function I9(r){MD=r.wasm.cwrap(Fo,null,[\"number\",\"array\",\"number\",\"number\",\"array\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\"])}function w9(r){let{inputs:e,backend:t,attrs:o}=r,{a:n,b:s,bias:a,preluActivationWeights:i}=e;if(n.dtype!==\"float32\"||s.dtype!==\"float32\")throw new Error(\"_FusedMatMul for non non-float32 tensors not yet supported.\");let{transposeA:p,transposeB:u,activation:c,leakyreluAlpha:l}=o,m=t.dataIdMap.get(n.dataId).id,f=t.dataIdMap.get(s.dataId).id,d=0;if(a!=null){let R=t.dataIdMap.get(a.dataId);if(R.shape.length!==1)throw new Error(`_FusedMatMul only supports rank-1 bias but got rank ${R.shape.length}.`);d=R.id}let h=i==null?0:t.dataIdMap.get(i.dataId).id,g=$i[c];if(g==null)throw new Error(`${c} activation not yet supported for FusedConv2D in the wasm backend.`);let y=p?n.shape[2]:n.shape[1],b=u?s.shape[1]:s.shape[2],C=br.assertAndGetBroadcastShape(n.shape.slice(0,-2),s.shape.slice(0,-2)),w=t.makeOutput([...C,y,b],n.dtype),k=t.dataIdMap.get(w.dataId).id,_=new Uint8Array(new Int32Array(n.shape).buffer),E=new Uint8Array(new Int32Array(s.shape).buffer);return MD(m,_,n.shape.length,f,E,s.shape.length,p,u,g,d,h,l||0,k),w}var LD={kernelName:Fo,backendName:\"wasm\",setupFunc:I9,kernelFunc:w9};function Qe(r,e){let t;function o(s){t=s.wasm.cwrap(r,null,[\"number\",\"number\",\"number\"])}function n(s){let{backend:a,inputs:{x:i}}=s,p=a.dataIdMap.get(i.dataId).id,u=a.makeOutput(i.shape,e||i.dtype),c=a.dataIdMap.get(u.dataId).id;return x.sizeFromShape(u.shape)===0||t(p,Ae[i.dtype],c),u}return{kernelName:r,backendName:\"wasm\",setupFunc:o,kernelFunc:n}}var BD=Qe(sn);function nt(r,e,t){let o;function n(a){o=a.wasm.cwrap(r,null,[\"number\",\"array\",\"number\",\"number\",\"array\",\"number\",\"number\",\"number\"])}function s(a){let{backend:i,inputs:p}=a,{a:u,b:c}=p,l=i.dataIdMap.get(u.dataId).id,m=i.dataIdMap.get(c.dataId).id,f=t!=null?t:u.dtype,d=I.assertAndGetBroadcastShape(u.shape,c.shape),h=i.makeOutput(d,f);if(x.sizeFromShape(d)===0)return h;let g=new Uint8Array(new Int32Array(u.shape).buffer),y=new Uint8Array(new Int32Array(c.shape).buffer),b=i.dataIdMap.get(h.dataId).id;return(()=>o(l,g,u.shape.length,m,y,c.shape.length,Ae[u.dtype],b))(),h}return{kernelName:r,backendName:\"wasm\",setupFunc:n,kernelFunc:s}}var S9=!0,VD=nt(_r,S9);var zD;function v9(r){zD=r.wasm.cwrap(an,null,[\"array\",\"number\",\"number\",\"number\"])}function k9(r){let{inputs:e,backend:t}=r,o=t.makeOutput(e[0].shape,e[0].dtype);if(x.sizeFromShape(o.shape)===0)return o;let n=e.map(i=>t.dataIdMap.get(i.dataId).id),s=new Uint8Array(new Int32Array(n).buffer),a=t.dataIdMap.get(o.dataId).id;return zD(s,n.length,Ae[o.dtype],a),o}var WD={kernelName:an,backendName:\"wasm\",setupFunc:v9,kernelFunc:k9};function zu(r){let{inputs:{x:e},backend:t}=r;if(e.dtype===\"string\")return nr(t.readSync(e.dataId),e.shape,e.dtype);let o=t.makeOutput(e.shape,e.dtype),n=t.typedArrayFromHeap(e);return t.typedArrayFromHeap(o).set(n),o}var UD={kernelName:uo,backendName:\"wasm\",kernelFunc:zu};var GD;function T9(r){GD=r.wasm.cwrap(Mr,null,[\"number\",\"array\",\"number\",\"number\",\"number\",\"array\",\"number\"])}function Eo(r){let{inputs:e,backend:t,attrs:o}=r,[n,s]=_9(e.x.shape,o.perm),a=!0;for(let d=0;d=n&&(s===-1||o[s]>o[a])&&(s=a);o[s]=n}return[t,o]}var HD={kernelName:Mr,backendName:\"wasm\",kernelFunc:Eo,setupFunc:T9};function kr(r,e,t){let o=r.shape,n=r.shape.length,s=x.parseAxisParam(e,o),a=s,i=I.getAxesPermutation(a,n),p=null,u=!1;if(i!=null){let c=new Array(n);for(let f=0;f`new shape: ${a}, old shape: ${o.shape}. New shape and old shape must have the same number of elements.`),r.backend.incRef(o.dataId),{dataId:o.dataId,shape:a,dtype:o.dtype}}var eP={kernelName:Ss,backendName:\"wasm\",kernelFunc:Mt};var tP;function M9(r){tP=r.wasm.cwrap(cn,null,[\"number\",\"array\",\"number\",\"number\",\"array\",\"number\",\"number\",\"number\",\"number\"])}function L9(r){let{inputs:e,backend:t,attrs:o}=r,{a:n,b:s}=e,{transposeA:a,transposeB:i}=o;if(n.dtype!==\"float32\"||s.dtype!==\"float32\")throw new Error(\"BatchMatMul for non non-float32 tensors not yet supported.\");let p=n.shape.length,u=s.shape.length,c=a?n.shape[p-2]:n.shape[p-1],l=i?s.shape[u-1]:s.shape[u-2],m=a?n.shape[p-1]:n.shape[p-2],f=i?s.shape[u-2]:s.shape[u-1],d=n.shape.slice(0,-2),h=s.shape.slice(0,-2),g=x.sizeFromShape(d),y=x.sizeFromShape(h),C=br.assertAndGetBroadcastShape(n.shape.slice(0,-2),s.shape.slice(0,-2)).concat([m,f]);x.assert(c===l,()=>`Error in matMul: inner shapes (${c}) and (${l}) of Tensors with shapes ${n.shape} and ${s.shape} and transposeA=${a} and transposeB=${i} must match.`);let w=a?[g,c,m]:[g,m,c],k=i?[y,f,l]:[y,l,f],_=Mt({inputs:{x:n},backend:t,attrs:{shape:w}}),E=Mt({inputs:{x:s},backend:t,attrs:{shape:k}}),R=t.dataIdMap.get(_.dataId).id,A=t.dataIdMap.get(E.dataId).id,D=a?_.shape[2]:_.shape[1],O=i?E.shape[1]:E.shape[2],M=Math.max(g,y),L=t.makeOutput([M,D,O],_.dtype),W=t.dataIdMap.get(L.dataId).id,V=new Uint8Array(new Int32Array(_.shape).buffer),G=new Uint8Array(new Int32Array(E.shape).buffer);return tP(R,V,_.shape.length,A,G,E.shape.length,a,i,W),t.disposeData(_.dataId),t.disposeData(E.dataId),L.shape=C,L}var rP={kernelName:cn,backendName:\"wasm\",setupFunc:M9,kernelFunc:L9};function Xo(r){let{inputs:{x:e},attrs:{begin:t,size:o},backend:n}=r,[s,a]=et.parseSliceParams(e,t,o),i=et.isSliceContinous(e.shape,s,a),p=n.readSync(e.dataId),u=n.makeOutput(a,e.dtype),c=x.computeStrides(e.shape),l=n.dataIdMap.get(u.dataId);if(i){let d=et.computeFlatOffset(s,c);return e.dtype===\"string\"?l.stringBytes=p.slice(d,d+x.sizeFromShape(a)):n.typedArrayFromHeap(u).set(p.subarray(d,d+x.sizeFromShape(a))),u}if(e.dtype===\"string\"){let d=vu(p,s,a,e.shape,e.dtype);return l.stringBytes=d,u}let m=n.typedArrayFromHeap(u),f=e.shape.length;if(f===2)B9(p,c[0],m,s,a);else if(f===3)V9(p,c[0],c[1],m,s,a);else if(f===4)z9(p,c[0],c[1],c[2],m,s,a);else{let d=vu(p,s,a,e.shape,e.dtype);m.set(d)}return u}function B9(r,e,t,o,n){let s=0,a=o[0],i=o[1],p=a+n[0];for(let u=a;uy*b),p=I.getReshaped(n.shape,s,i),u=I.getPermuted(p.length,s.length),c=I.getReshapedPermuted(n.shape,s,i),l=I.getSliceBeginCoords(a,s.length),m=I.getSliceSize(c,a,s.length),f=Mt({inputs:{x:n},backend:t,attrs:{shape:p}}),d=Eo({inputs:{x:f},backend:t,attrs:{perm:u}}),h=Mt({inputs:{x:d},backend:t,attrs:{shape:c}}),g=Xo({inputs:{x:h},backend:t,attrs:{begin:l,size:m}});return t.disposeData(f.dataId),t.disposeData(d.dataId),t.disposeData(f.dataId),g}var nP={kernelName:hs,backendName:\"wasm\",kernelFunc:W9};function cs(r){let{inputs:{x:e},attrs:{dtype:t},backend:o}=r,n=o.makeOutput(e.shape,t),s=o.typedArrayFromHeap(e);return o.typedArrayFromHeap(n).set(s),n}var sP={kernelName:to,backendName:\"wasm\",kernelFunc:cs};var aP=Qe(ro);var iP;function U9(r){iP=r.wasm.cwrap(Ro,null,[\"number\",\"number\",\"number\",\"number\"])}function G9(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{clipValueMin:s,clipValueMax:a}=o,i=t.dataIdMap.get(n.dataId).id,p=t.makeOutput(n.shape,n.dtype),u=t.dataIdMap.get(p.dataId).id;return iP(i,s,a,u),p}var uP={kernelName:Ro,backendName:\"wasm\",setupFunc:U9,kernelFunc:G9};function qw(r){let{inputs:e,backend:t}=r,o=x.parseAxisParam(r.attrs.axis,e[0].shape)[0],n=e.map(f=>f.shape);I.assertParamsConsistent(n,o);let s=I.computeOutShape(e.map(f=>f.shape),o),a=e.filter(f=>x.sizeFromShape(f.shape)>0);if(a.length===1)return zu({inputs:{x:a[0]},backend:t});let i=t.makeOutput(s,e[0].dtype);if(x.sizeFromShape(s)===0)return i;if(a[0].dtype===\"string\"){let f=a.map(C=>{let k=[-1,x.sizeFromShape(C.shape.slice(o))];return Mt({inputs:{x:C},backend:t,attrs:{shape:k}})}),d=f.map(C=>({vals:t.readSync(C.dataId),shape:C.shape}));s=I.computeOutShape(f.map(C=>C.shape),1);let h=f[0].shape[0]===1,g=Iu(d,s,e[0].dtype,h),y=I.computeOutShape(a.map(C=>C.shape),o);i.shape=y;let b=t.dataIdMap.get(i.dataId);return b.stringBytes=I.fromStringArrayToUint8(g),f.forEach(C=>t.disposeData(C.dataId)),i}let p=x.sizeFromShape(a[0].shape.slice(0,o)),u=0,c=a.map(f=>{let d=x.sizeFromShape(f.shape.slice(o));return u+=d,d}),l=a.map(f=>t.typedArrayFromHeap(f)),m=t.typedArrayFromHeap(i);for(let f=0;f`cumprod does not support ${n.dtype} tensors in the WASM backend`);let u=I.getAxesPermutation([s],p),c=n;u!==null&&(c=Eo({inputs:{x:n},attrs:{perm:u},backend:t}));let l=I.getInnerMostAxes(1,p)[0];I.assertAxesAreInnerMostDims(\"cumprod\",[l],p);let m=t.makeOutput(c.shape,c.dtype),f=c.shape[l],d=t.dataIdMap.get(c.dataId).id,h=t.dataIdMap.get(m.dataId).id;yP(d,a?1:0,i?1:0,f,h,Ae[n.dtype]);let g=m;if(u!==null){let y=I.getUndoAxesPermutation(u);g=Eo({inputs:{x:m},attrs:{perm:y},backend:t}),t.disposeData(c.dataId),t.disposeData(m.dataId)}return g}var bP={kernelName:hn,backendName:\"wasm\",setupFunc:Q9,kernelFunc:Z9};var CP;function J9(r){CP=r.wasm.cwrap(gn,null,[\"number\",\"number\",\"number\",\"number\",\"number\",\"number\"])}function eJ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s,exclusive:a,reverse:i}=o,p=n.shape.length;x.assert(n.dtype===\"float32\"||n.dtype===\"int32\",()=>`cumsum does not support ${n.dtype} tensors in the WASM backend`);let u=I.getAxesPermutation([s],p),c=n;u!==null&&(c=Eo({inputs:{x:n},attrs:{perm:u},backend:t}));let l=I.getInnerMostAxes(1,p)[0];I.assertAxesAreInnerMostDims(\"cumsum\",[l],p);let m=t.makeOutput(c.shape,c.dtype),f=c.shape[l],d=t.dataIdMap.get(c.dataId).id,h=t.dataIdMap.get(m.dataId).id;CP(d,a?1:0,i?1:0,f,h,Ae[n.dtype]);let g=m;if(u!==null){let y=I.getUndoAxesPermutation(u);g=Eo({inputs:{x:m},attrs:{perm:y},backend:t}),t.disposeData(c.dataId),t.disposeData(m.dataId)}return g}var IP={kernelName:gn,backendName:\"wasm\",setupFunc:J9,kernelFunc:eJ};var wP;function tJ(r){wP=r.wasm.cwrap(yn,null,[\"number\",\"number\",\"number\",\"array\",\"number\",\"array\",\"array\",\"number\",\"number\"])}function rJ(r){let{backend:e,inputs:t,attrs:o}=r,{x:n}=t,{blockSize:s,dataFormat:a}=o,i=n.shape[0],p=a===\"NHWC\"?n.shape[1]:n.shape[2],u=a===\"NHWC\"?n.shape[2]:n.shape[3],c=a===\"NHWC\"?n.shape[3]:n.shape[1],l=p*s,m=u*s,f=c/(s*s),d=a===\"NHWC\"?[i,l,m,f]:[i,f,l,m],h=e.makeOutput(d,\"float32\"),y=e.dataIdMap.get(n.dataId).id,b=new Uint8Array(new Int32Array(x.computeStrides(n.shape)).buffer),C=new Uint8Array(new Int32Array(d).buffer),w=new Uint8Array(new Int32Array(x.computeStrides(d)).buffer),k=e.dataIdMap.get(h.dataId).id;return wP(y,s,a===\"NHWC\"?1:0,b,n.shape.length-1,C,w,d.length,k),h}var SP={kernelName:yn,backendName:\"wasm\",setupFunc:tJ,kernelFunc:rJ};var vP;function oJ(r){vP=r.wasm.cwrap(bn,null,[\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\"])}function nJ(r){let{inputs:e,attrs:t,backend:o}=r,{x:n,filter:s}=e,a=o.dataIdMap.get(n.dataId).id,i=o.dataIdMap.get(s.dataId).id,{strides:p,dilations:u,pad:c,dimRoundingMode:l}=t,m=u==null?[1,1]:u,f=I.computeConv2DInfo(n.shape,s.shape,p,m,c,l,!0),d=f.filterHeight,h=f.filterWidth,g=f.padInfo.top,y=f.padInfo.right,b=f.padInfo.bottom,C=f.padInfo.left,w=f.dilationHeight,k=f.dilationWidth,_=f.strideHeight,E=f.strideWidth,R=f.inChannels,A=f.outChannels,D=f.padInfo.type===\"SAME\"?1:0;if(f.dataFormat!==\"channelsLast\")throw new Error(`wasm backend DepthwiseConv2dNative does not support dataFormat:'${f.dataFormat}'. Please use 'channelsLast'.`);let O=o.makeOutput(f.outShape,\"float32\"),M=o.dataIdMap.get(O.dataId).id;return vP(a,n.shape[0],n.shape[1],n.shape[2],i,d,h,g,y,b,C,D,w,k,_,E,R,A,M),O}var kP={kernelName:bn,backendName:\"wasm\",setupFunc:oJ,kernelFunc:nJ};var TP=Qe(In);var sJ=!1,NP=nt(oo,sJ,\"bool\");var _P=Qe(no,\"float32\");function Eg(r){let{inputs:e,attrs:t,backend:o}=r,{input:n}=e,{dim:s}=t,a=n.shape.length,i=n.shape.slice(),p=s;return s<0&&(x.assert(-(a+1)<=s,()=>`Axis must be in the interval [${-(a+1)}, ${a}]`),p=a+s+1),i.splice(p,0,1),Mt({inputs:{x:n},backend:o,attrs:{shape:i}})}var EP={kernelName:xs,backendName:\"wasm\",kernelFunc:Eg};function jw(r){let{attrs:{shape:e,value:t,dtype:o},backend:n}=r,s=n.makeOutput(e,o);return n.typedArrayFromHeap(s).fill(t),s}var $P={kernelName:ys,backendName:\"wasm\",kernelFunc:jw};var RP;function aJ(r){RP=r.wasm.cwrap(Sn,null,[\"number\",\"number\",\"number\",\"number\",\"number\",\"number\"])}function iJ(r){let{inputs:e,backend:t}=r,{image:o}=e,n=t.makeOutput(o.shape,o.dtype),s=t.dataIdMap.get(o.dataId).id,a=t.dataIdMap.get(n.dataId).id,[i,p,u,c]=o.shape;return RP(s,i,p,u,c,a),n}var AP={kernelName:Sn,backendName:\"wasm\",kernelFunc:iJ,setupFunc:aJ};var FP=Qe(so);var uJ=!1,DP=nt(vn,uJ);var PP;function pJ(r){PP=r.wasm.cwrap(kn,null,[\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\"])}function cJ(r){let{backend:e,inputs:t,attrs:o}=r,{varianceEpsilon:n}=o,{x:s,mean:a,variance:i,offset:p,scale:u}=t,c=e.dataIdMap.get(s.dataId).id,l=e.dataIdMap.get(a.dataId).id,m=e.dataIdMap.get(i.dataId).id,f=p!=null?e.dataIdMap.get(p.dataId).id:0,d=u!=null?e.dataIdMap.get(u.dataId).id:0,h=e.makeOutput(s.shape,s.dtype);if(x.sizeFromShape(s.shape)===0)return h;let g=e.dataIdMap.get(h.dataId).id;return PP(c,l,m,f,d,n,g),h}var OP={kernelName:kn,backendName:\"wasm\",setupFunc:pJ,kernelFunc:cJ};var MP;function lJ(r){MP=r.wasm.cwrap(Do,null,[\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\"])}function mJ(r){let{inputs:e,attrs:t,backend:o}=r,{x:n,filter:s,bias:a,preluActivationWeights:i}=e,{strides:p,pad:u,dilations:c,dataFormat:l,dimRoundingMode:m,activation:f,leakyreluAlpha:d}=t,h=I.computeConv2DInfo(n.shape,s.shape,p,c,u,m),g=$i[f];if(g==null)throw new Error(`${f} activation not yet supported for FusedConv2D in the wasm backend.`);let y=o.dataIdMap.get(n.dataId).id,b=o.dataIdMap.get(s.dataId).id,C=h.outChannels,w=0;if(a!=null){let X=o.dataIdMap.get(a.dataId);if(X.shape.length!==1)throw new Error(`FusedConv2D only supports rank-1 bias but got rank ${X.shape.length}.`);if(X.shape[0]!==C)throw new Error(`FusedConv2D bias shape (${X.shape}) does not match the number of output channels (${C})`);w=X.id}let k=h.filterHeight,_=h.filterWidth,E=h.padInfo.top,R=h.padInfo.right,A=h.padInfo.bottom,D=h.padInfo.left,O=h.dilationHeight,M=h.dilationWidth,L=h.strideHeight,W=h.strideWidth,V=h.inChannels,G=h.padInfo.type===\"SAME\"?1:0,q=h.batchSize,H=h.inHeight,j=h.inWidth;if(l!==\"NHWC\")throw new Error(`wasm backend FusedConv2D does not support dataFormat:'${l}'. Please use 'NHWC'.`);let Y=o.makeOutput(h.outShape,\"float32\"),Z=o.dataIdMap.get(Y.dataId).id,ee=i==null?0:o.dataIdMap.get(i.dataId).id;return MP(y,q,H,j,b,k,_,w,E,R,A,D,G,O,M,L,W,V,C,g,ee,d||0,Z),Y}var LP={kernelName:Do,backendName:\"wasm\",setupFunc:lJ,kernelFunc:mJ};var BP;function fJ(r){BP=r.wasm.cwrap(Po,null,[\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\"])}function dJ(r){let{inputs:e,attrs:t,backend:o}=r,{x:n,filter:s,bias:a,preluActivationWeights:i}=e,{strides:p,pad:u,dilations:c,dataFormat:l,dimRoundingMode:m,activation:f,leakyreluAlpha:d}=t,h=I.computeConv2DInfo(n.shape,s.shape,p,c,u,m,!0),g=$i[f];if(g==null)throw new Error(`${f} activation not yet supported for FusedDepthwiseConv2D in the wasm backend.`);let y=o.dataIdMap.get(n.dataId).id,b=o.dataIdMap.get(s.dataId).id,C=h.outChannels,w=0;if(a!=null){let X=o.dataIdMap.get(a.dataId);if(X.shape.length!==1)throw new Error(`FusedDepthwiseConv2D only supports rank-1 bias but got rank ${X.shape.length}.`);if(X.shape[0]!==C)throw new Error(`FusedDepthwiseConv2D bias shape (${X.shape}) does not match the number of output channels (${C})`);w=X.id}let k=h.filterHeight,_=h.filterWidth,E=h.padInfo.top,R=h.padInfo.right,A=h.padInfo.bottom,D=h.padInfo.left,O=h.dilationHeight,M=h.dilationWidth,L=h.strideHeight,W=h.strideWidth,V=h.inChannels,G=h.padInfo.type===\"SAME\"?1:0,q=h.batchSize,H=h.inHeight,j=h.inWidth;if(l!==\"NHWC\")throw new Error(`wasm backend FusedDepthwiseConv2D does not support dataFormat:'${l}'. Please use 'NHWC'.`);let Y=o.makeOutput(h.outShape,\"float32\"),Z=o.dataIdMap.get(Y.dataId).id,ee=i==null?0:o.dataIdMap.get(i.dataId).id;return BP(y,q,H,j,b,k,_,w,E,R,A,D,G,O,M,L,W,V,C,g,ee,d||0,Z),Y}var VP={kernelName:Po,backendName:\"wasm\",setupFunc:fJ,kernelFunc:dJ};var zP;function hJ(r){zP=r.wasm.cwrap(Tn,null,[\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"array\",\"number\"])}function gJ(r){let{backend:e,inputs:t}=r,{params:o,indices:n}=t,[s,a,i,p]=af.prepareAndValidate(o,n),u=e.makeOutput(s,o.dtype);if(a===0)return u;let c=n.shape,l=c[c.length-1],f=e.dataIdMap.get(o.dataId).id,h=e.dataIdMap.get(n.dataId).id,g=new Uint8Array(new Int32Array(p).buffer),y=e.dataIdMap.get(u.dataId).id;return zP(f,Ae[o.dtype],h,a,l,i,g,y),u}var WP={kernelName:Tn,backendName:\"wasm\",setupFunc:hJ,kernelFunc:gJ};var UP;function xJ(r){UP=r.wasm.cwrap(\"Gather\",null,[\"number\",\"number\",\"array\",\"number\",\"number\",\"number\",\"array\",\"number\"])}function yJ(r){let{backend:e,inputs:t,attrs:o}=r,{x:n,indices:s}=t,{axis:a,batchDims:i}=o,p=x.parseAxisParam(a,n.shape)[0],u=e.readSync(s.dataId),c=n.shape[p];for(let A=0;A=0,()=>`GatherV2: the index value ${D} is not in [0, ${c-1}]`)}let l=I.segment_util.collectGatherOpShapeInfo(n,s,p,i),m=Mt({inputs:{x:n},attrs:{shape:[l.batchSize,l.outerSize,l.dimSize,l.sliceSize]},backend:e}),f=x.sizeFromShape(s.shape),d=Mt({inputs:{x:s},attrs:{shape:[l.batchSize,f/l.batchSize]},backend:e}),h=[l.batchSize,l.outerSize,f/l.batchSize,l.sliceSize],g=e.makeOutput(h,n.dtype);if(x.sizeFromShape(n.shape)===0)return g;let y=m.shape.length-1,C=e.dataIdMap.get(m.dataId).id,k=e.dataIdMap.get(d.dataId).id,_=e.dataIdMap.get(g.dataId).id,E=new Uint8Array(new Int32Array(x.computeStrides(m.shape)).buffer),R=new Uint8Array(new Int32Array(x.computeStrides(h)).buffer);return UP(C,Ae[n.dtype],E,y,k,l.batchSize,R,_),e.disposeData(m.dataId),e.disposeData(d.dataId),g.shape=l.outputShape,g}var GP={kernelName:bs,backendName:\"wasm\",setupFunc:xJ,kernelFunc:yJ};var bJ=!1,HP=nt(ao,bJ,\"bool\");var CJ=!1,qP=nt(io,CJ,\"bool\");var KP;function IJ(r){KP=r.wasm.cwrap(Nn,null,[\"number\",\"number\",\"number\",\"number\"])}function wJ(r){let{inputs:{x:e},attrs:{alpha:t},backend:o}=r,n=o.dataIdMap.get(e.dataId).id,s=o.makeOutput(e.shape,\"float32\");if(x.sizeFromShape(e.shape)!==0){let a=o.dataIdMap.get(s.dataId).id;KP(n,Ae[e.dtype],t,a)}return s}var jP={kernelName:Nn,backendName:\"wasm\",setupFunc:IJ,kernelFunc:wJ};var SJ=!1,XP=nt(po,SJ,\"bool\");var vJ=!1,YP=nt(co,vJ,\"bool\");var QP=Qe(lo);var kJ=!1,ZP=nt(_n,kJ,\"bool\");var JP=Qe(En);var TJ=!1,eO=nt(ua,TJ,\"bool\");var NJ=!1,tO=nt(g0,NJ,\"bool\");var rO;function _J(r){rO=r.wasm.cwrap($n,null,[\"number\",\"number\",\"number\",\"number\"])}function EJ(r){let{backend:e,inputs:t,attrs:o}=r,{reductionIndices:n,keepDims:s}=o,{x:a}=t,p=e.dataIdMap.get(a.dataId).id,u=a,{transposed:c,axes:l,originalAxes:m,inputWasTransposed:f}=kr(a,n,e);if(f){let C=e.dataIdMap.get(c.dataId).id;u=c,p=C}let d=u.shape.length;I.assertAxesAreInnerMostDims(\"max\",l,d);let[h,g]=I.computeOutAndReduceShapes(u.shape,l),y=x.sizeFromShape(g),b=e.makeOutput(h,a.dtype);if(x.sizeFromShape(u.shape)!==0){let C=e.dataIdMap.get(b.dataId).id;rO(p,Ae[a.dtype],y,C)}if(f&&e.disposeData(c.dataId),s){let C=I.expandShapeToKeepDim(b.shape,m);b.shape=C}return b}var oO={kernelName:$n,backendName:\"wasm\",setupFunc:_J,kernelFunc:EJ};var $J=!1,nO=nt(mo,$J);var sO;function RJ(r){sO=r.wasm.cwrap(Rn,null,[\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\"])}function AJ(r){let{inputs:e,attrs:t,backend:o}=r,n=e.x,s=o.dataIdMap.get(n.dataId).id;x.assert(n.dtype===\"float32\",()=>`Error in MaxPool: only float32 input is supported. Got ${n.dtype}.`);let{filterSize:a,strides:i,pad:p,dimRoundingMode:u}=t,c=I.computePool2DInfo(n.shape,a,i,1,p,u),l=c.filterHeight,m=c.filterWidth,f=c.padInfo.top,d=c.padInfo.right,h=c.padInfo.bottom,g=c.padInfo.left,y=c.dilationHeight,b=c.dilationWidth,C=c.strideHeight,w=c.strideWidth,k=c.inChannels,_=c.outChannels;if(c.dataFormat!==\"channelsLast\")throw new Error(`wasm backend does not support dataFormat:'${c.dataFormat}'. Please use 'channelsLast'.`);let E=o.makeOutput(c.outShape,\"float32\"),R=o.dataIdMap.get(E.dataId).id;return sO(s,n.shape[0],n.shape[1],n.shape[2],l,m,f,d,h,g,y,b,C,w,k,_,R),E}var aO={kernelName:Rn,backendName:\"wasm\",setupFunc:RJ,kernelFunc:AJ};var iO;function FJ(r){iO=r.wasm.cwrap(An,null,[\"number, number, number\"])}function DJ(r){let{backend:e,inputs:t,attrs:o}=r,{axis:n,keepDims:s}=o,{x:a}=t,i=e.dataIdMap.get(a.dataId).id,p=i,u=a,{transposed:c,axes:l,originalAxes:m,inputWasTransposed:f}=kr(a,n,e),d=l;if(f){let w=e.dataIdMap.get(c.dataId).id;w!==i&&(u=c,p=w,d=I.getInnerMostAxes(d.length,u.shape.length))}I.assertAxesAreInnerMostDims(\"mean\",d,u.shape.length);let[h,g]=I.computeOutAndReduceShapes(u.shape,d),y=x.sizeFromShape(g),b=u;u.dtype!==\"float32\"&&(b=cs({backend:e,inputs:{x:u},attrs:{dtype:\"float32\"}}),p=e.dataIdMap.get(b.dataId).id);let C=e.makeOutput(h,\"float32\");if(x.sizeFromShape(u.shape)!==0){let w=e.dataIdMap.get(C.dataId).id;iO(p,y,w)}if(f&&e.disposeData(c.dataId),s){let w=I.expandShapeToKeepDim(C.shape,m);C.shape=w}return u.dtype!==\"float32\"&&e.disposeData(b.dataId),C}var uO={kernelName:An,backendName:\"wasm\",setupFunc:FJ,kernelFunc:DJ};var pO;function PJ(r){pO=r.wasm.cwrap(Fn,null,[\"number\",\"number\",\"number\",\"number\"])}function OJ(r){let{backend:e,inputs:t,attrs:o}=r,{axis:n,keepDims:s}=o,{x:a}=t,i=e.dataIdMap.get(a.dataId).id,p=i,u=a,{transposed:c,axes:l,originalAxes:m,inputWasTransposed:f}=kr(a,n,e);if(f){let C=e.dataIdMap.get(c.dataId).id;C!==i&&(u=c,p=C)}let d=u.shape.length;I.assertAxesAreInnerMostDims(\"min\",l,d);let[h,g]=I.computeOutAndReduceShapes(u.shape,l),y=x.sizeFromShape(g),b=e.makeOutput(h,u.dtype);if(x.sizeFromShape(u.shape)!==0){let C=e.dataIdMap.get(b.dataId).id;pO(p,Ae[a.dtype],y,C)}if(f&&e.disposeData(c.dataId),s){let C=I.expandShapeToKeepDim(b.shape,m);b.shape=C}return b}var cO={kernelName:Fn,backendName:\"wasm\",setupFunc:PJ,kernelFunc:OJ};var MJ=!1,lO=nt(fo,MJ);var Xw;(function(r){r[r.reflect=0]=\"reflect\",r[r.symmetric=1]=\"symmetric\"})(Xw||(Xw={}));var mO;function LJ(r){mO=r.wasm.cwrap(Dn,null,[\"number\",\"array\",\"number\",\"number\",\"array\",\"array\",\"number\",\"number\"])}function BJ(r){let{inputs:{x:e},backend:t,attrs:{paddings:o,mode:n}}=r,s=o.map((d,h)=>d[0]+e.shape[h]+d[1]),a=t.dataIdMap.get(e.dataId).id,i=t.makeOutput(s,e.dtype),p=t.dataIdMap.get(i.dataId).id,u=new Uint8Array(new Int32Array(e.shape).buffer),c=o.map(d=>d[0]),l=o.map(d=>d[1]),m=new Uint8Array(new Int32Array(c).buffer),f=new Uint8Array(new Int32Array(l).buffer);return mO(a,u,e.shape.length,Ae[e.dtype],m,f,Xw[n],p),i}var fO={kernelName:Dn,backendName:\"wasm\",kernelFunc:BJ,setupFunc:LJ};var VJ=!0,dO=nt(ho,VJ);var hO=Qe(Pn);function kc(r,e){let t=new Int32Array(r.wasm.HEAPU8.buffer,e,4),o=t[0],n=t[1],s=t[2],a=t[3];return r.wasm._free(e),{pSelectedIndices:o,selectedSize:n,pSelectedScores:s,pValidOutputs:a}}var gO;function zJ(r){gO=r.wasm.cwrap(On,\"number\",[\"number\",\"number\",\"number\",\"number\",\"number\"])}function WJ(r){let{backend:e,inputs:t,attrs:o}=r,{iouThreshold:n,maxOutputSize:s,scoreThreshold:a}=o,{boxes:i,scores:p}=t,u=e.dataIdMap.get(i.dataId).id,c=e.dataIdMap.get(p.dataId).id,l=gO(u,c,s,n,a),{pSelectedIndices:m,selectedSize:f,pSelectedScores:d,pValidOutputs:h}=kc(e,l);return e.wasm._free(d),e.wasm._free(h),e.makeOutput([f],\"int32\",m)}var xO={kernelName:On,backendName:\"wasm\",setupFunc:zJ,kernelFunc:WJ};var yO;function UJ(r){yO=r.wasm.cwrap(pa,\"number\",[\"number\",\"number\",\"number\",\"number\",\"number\",\"bool\"])}function GJ(r){let{backend:e,inputs:t,attrs:o}=r,{iouThreshold:n,maxOutputSize:s,scoreThreshold:a,padToMaxOutputSize:i}=o,{boxes:p,scores:u}=t,c=e.dataIdMap.get(p.dataId).id,l=e.dataIdMap.get(u.dataId).id,m=yO(c,l,s,n,a,i),{pSelectedIndices:f,selectedSize:d,pSelectedScores:h,pValidOutputs:g}=kc(e,m);e.wasm._free(h);let y=e.makeOutput([d],\"int32\",f),b=e.makeOutput([],\"int32\",g);return[y,b]}var bO={kernelName:pa,backendName:\"wasm\",setupFunc:UJ,kernelFunc:GJ};var CO;function HJ(r){CO=r.wasm.cwrap(Mn,\"number\",[\"number\",\"number\",\"number\",\"number\",\"number\",\"number\"])}function qJ(r){let{backend:e,inputs:t,attrs:o}=r,{iouThreshold:n,maxOutputSize:s,scoreThreshold:a,softNmsSigma:i}=o,{boxes:p,scores:u}=t,c=e.dataIdMap.get(p.dataId).id,l=e.dataIdMap.get(u.dataId).id,m=CO(c,l,s,n,a,i),{pSelectedIndices:f,selectedSize:d,pSelectedScores:h,pValidOutputs:g}=kc(e,m);e.wasm._free(g);let y=e.makeOutput([d],\"int32\",f),b=e.makeOutput([d],\"float32\",h);return[y,b]}var IO={kernelName:Mn,backendName:\"wasm\",setupFunc:HJ,kernelFunc:qJ};var KJ=!1,wO=nt(go,KJ,\"bool\");var SO;function jJ(r){SO=r.wasm.cwrap(ca,null,[\"number\",\"number\",\"number\",\"number\",\"number\"])}function XJ(r){let{inputs:e,backend:t,attrs:o}=r,{indices:n}=e,{dtype:s,depth:a,onValue:i,offValue:p}=o,u=t.makeOutput([...n.shape,a],s),c=t.dataIdMap.get(u.dataId).id,m=t.dataIdMap.get(n.dataId).id;return SO(m,a,i,p,c),u}var vO={kernelName:ca,backendName:\"wasm\",setupFunc:jJ,kernelFunc:XJ};function YJ(r){let{inputs:{x:e},backend:t}=r,o=t.makeOutput(e.shape,e.dtype);return t.typedArrayFromHeap(o).fill(1),o}var kO={kernelName:Cs,backendName:\"wasm\",kernelFunc:YJ};function QJ(r){let{inputs:e,backend:t,attrs:o}=r,{axis:n}=o;if(e.length===1)return Eg({inputs:{input:e[0]},backend:t,attrs:{dim:n}});let s=e[0].shape,a=e[0].dtype;e.forEach(c=>{x.assertShapesMatch(s,c.shape,\"All tensors passed to stack must have matching shapes\"),x.assert(a===c.dtype,()=>\"All tensors passed to stack must have matching dtypes\")});let i=[],p=e.map(c=>{let l=Eg({inputs:{input:c},backend:t,attrs:{dim:n}});return i.push(l),l}),u=qw({inputs:p,backend:t,attrs:{axis:n}});return i.forEach(c=>t.disposeData(c.dataId)),u}var TO={kernelName:Is,backendName:\"wasm\",kernelFunc:QJ};var NO;function ZJ(r){NO=r.wasm.cwrap(Ln,null,[\"number\",\"array\",\"number\",\"number\",\"array\",\"array\",\"number\",\"number\"])}function JJ(r){let{inputs:{x:e},backend:t,attrs:{paddings:o,constantValue:n}}=r,s=o.map((h,g)=>h[0]+e.shape[g]+h[1]);if(x.sizeFromShape(e.shape)===0)return jw({backend:t,attrs:{shape:s,value:n,dtype:e.dtype}});let a=t.dataIdMap.get(e.dataId).id,i=t.makeOutput(s,e.dtype),u=t.dataIdMap.get(i.dataId).id,c=new Uint8Array(new Int32Array(e.shape).buffer),l=o.map(h=>h[0]),m=o.map(h=>h[1]),f=new Uint8Array(new Int32Array(l).buffer),d=new Uint8Array(new Int32Array(m).buffer);return NO(a,c,e.shape.length,Ae[e.dtype],f,d,n,u),i}var $g={kernelName:Ln,backendName:\"wasm\",kernelFunc:JJ,setupFunc:ZJ};var eee=!1,_O=nt(Bn,eee);var EO;function tee(r){EO=r.wasm.cwrap(Vn,null,[\"number\",\"number\",\"number\"])}function ree(r){let{inputs:e,backend:t}=r,{x:o,alpha:n}=e,s=t.dataIdMap.get(o.dataId).id,a=t.dataIdMap.get(n.dataId).id,i=s,p=o,u=p;p.dtype!==\"float32\"&&(u=cs({backend:t,inputs:{x:o},attrs:{dtype:\"float32\"}}),i=t.dataIdMap.get(u.dataId).id);let c=t.makeOutput(o.shape,\"float32\"),l=t.dataIdMap.get(c.dataId).id;return EO(i,a,l),p.dtype!==\"float32\"&&t.disposeData(u.dataId),c}var $O={kernelName:Vn,backendName:\"wasm\",setupFunc:tee,kernelFunc:ree};var RO;function oee(r){RO=r.wasm.cwrap(Ao,null,[\"number\",\"number\",\"number\",\"number\"])}function nee(r){let{backend:e,inputs:t,attrs:o}=r,{axis:n,keepDims:s}=o,{x:a}=t,i=e.dataIdMap.get(a.dataId).id,p=i,u=a,{transposed:c,axes:l,originalAxes:m,inputWasTransposed:f}=kr(a,n,e),d=l;if(f){let C=e.dataIdMap.get(c.dataId).id;C!==i&&(u=c,p=C,d=I.getInnerMostAxes(d.length,u.shape.length))}I.assertAxesAreInnerMostDims(\"prod\",d,u.shape.length);let[h,g]=I.computeOutAndReduceShapes(u.shape,d),y=x.sizeFromShape(g),b=e.makeOutput(h,u.dtype);if(x.sizeFromShape(u.shape)!==0){let C=e.dataIdMap.get(b.dataId).id;RO(p,y,Ae[b.dtype],C)}if(f&&e.disposeData(c.dataId),s){let C=I.expandShapeToKeepDim(b.shape,m);b.shape=C}return b}var AO={kernelName:Ao,backendName:\"wasm\",setupFunc:oee,kernelFunc:nee};var see=r=>{let{backend:e,attrs:t}=r,{start:o,stop:n,step:s,dtype:a}=t,i=Su(o,n,s,a),p=e.makeOutput([i.length],a);return e.typedArrayFromHeap(p).set(i),p},FO={kernelName:ws,backendName:\"wasm\",kernelFunc:see};var aee=!0,DO=nt(Cn,aee);var PO=Qe(zn);var OO=Qe(Gn);var MO;function iee(r){MO=r.wasm.cwrap(Un,null,[\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\"])}function uee(r){let{backend:e,inputs:t,attrs:o}=r,{images:n}=t,{alignCorners:s,halfPixelCenters:a,size:i}=o,[p,u]=i,[c,l,m,f]=n.shape,d=[c,p,u,f],h=e.dataIdMap.get(n.dataId),g;h.dtype!==\"float32\"&&(g=cs({backend:e,inputs:{x:n},attrs:{dtype:\"float32\"}}),h=e.dataIdMap.get(g.dataId));let y=h.id,b=e.makeOutput(d,\"float32\");if(x.sizeFromShape(n.shape)===0)return b;let C=e.dataIdMap.get(b.dataId).id;return MO(y,c,l,m,f,p,u,s?1:0,a?1:0,C),g!=null&&e.disposeData(g.dataId),b}var LO={kernelName:Un,backendName:\"wasm\",setupFunc:iee,kernelFunc:uee};var BO;function pee(r){BO=r.wasm.cwrap(Wn,null,[\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\"])}function cee(r){let{backend:e,inputs:t,attrs:o}=r,{images:n}=t,{alignCorners:s,halfPixelCenters:a,size:i}=o,[p,u]=i,[c,l,m,f]=n.shape,d=[c,p,u,f],h=e.makeOutput(d,\"float32\");if(x.sizeFromShape(n.shape)===0)return h;let g=e.dataIdMap.get(n.dataId),y;g.dtype!==\"float32\"&&(y=cs({backend:e,inputs:{x:n},attrs:{dtype:\"float32\"}}),g=e.dataIdMap.get(y.dataId));let b=g.id,C=e.dataIdMap.get(h.dataId).id;return BO(b,c,l,m,f,p,u,s?1:0,a?1:0,C),y!=null&&e.disposeData(y.dataId),h}var VO={kernelName:Wn,backendName:\"wasm\",setupFunc:pee,kernelFunc:cee};var zO;function lee(r){zO=r.wasm.cwrap(fa,null,[\"number\",\"array\",\"number\",\"array\",\"number\",\"number\"])}function mee(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{dims:s}=o,a=x.parseAxisParam(s,n.shape);if(n.shape.length===0)return zu({inputs:{x:n},backend:t});let i=t.makeOutput(n.shape,n.dtype),p=t.dataIdMap.get(n.dataId).id,u=t.dataIdMap.get(i.dataId).id,c=new Uint8Array(new Int32Array(a).buffer),l=new Uint8Array(new Int32Array(n.shape).buffer);zO(p,c,a.length,l,n.shape.length,u);let m=Mt({inputs:{x:i},attrs:{shape:n.shape},backend:t});return t.disposeData(i.dataId),m}var WO={kernelName:fa,backendName:\"wasm\",kernelFunc:mee,setupFunc:lee};var UO;function fee(r){UO=r.wasm.cwrap(es,null,[\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"array\",\"number\",\"number\"])}function dee(r){let{inputs:e,backend:t,attrs:o}=r,{image:n}=e,{radians:s,fillValue:a,center:i}=o,p=t.makeOutput(n.shape,n.dtype),u=t.dataIdMap.get(n.dataId).id,c=t.dataIdMap.get(p.dataId).id,[l,m,f,d]=n.shape,[h,g]=I.getImageCenter(i,m,f),y=a===0,b=255,C=typeof a==\"number\"?[a,a,a,y?0:b]:[...a,b],w=new Uint8Array(new Int32Array(C).buffer);return UO(u,l,m,f,d,s,h,g,w,C.length,c),p}var GO={kernelName:es,backendName:\"wasm\",kernelFunc:dee,setupFunc:fee};var HO=Qe(da);var qO=Qe(xo);var KO;function hee(r){KO=r.wasm.cwrap(Hn,null,[\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"array\",\"number\",\"number\"])}function gee(r){let{backend:e,inputs:t,attrs:o}=r,{indices:n,updates:s}=t,{shape:a}=o,i=e.makeOutput(a,s.dtype);if(x.sizeFromShape(a)===0)return i;let{sliceRank:p,numUpdates:u,sliceSize:c,strides:l,outputSize:m}=cl.calculateShapes(s,n,a),d=e.dataIdMap.get(n.dataId).id,g=e.dataIdMap.get(s.dataId).id,y=new Uint8Array(new Int32Array(l).buffer),b=e.dataIdMap.get(i.dataId).id;return KO(d,g,Ae[s.dtype],p,u,c,y,m,b),i}var jO={kernelName:Hn,backendName:\"wasm\",setupFunc:hee,kernelFunc:gee};var XO;function xee(r){XO=r.wasm.cwrap(\"SelectV2\",null,[\"number\",\"number\",\"number\",\"number\",\"number\"])}function yee(r){let{inputs:e,backend:t}=r,{condition:o,t:n,e:s}=e,a=t.dataIdMap.get(o.dataId).id,i=t.dataIdMap.get(n.dataId).id,p=t.dataIdMap.get(s.dataId).id,u=t.makeOutput(n.shape,n.dtype),c=t.dataIdMap.get(u.dataId).id,l=o.shape.length,m=n.shape.length,f=l===0||l>1||m===1?1:x.sizeFromShape(n.shape.slice(1));return XO(a,i,p,f,c),u}var YO={kernelName:vs,backendName:\"wasm\",kernelFunc:yee,setupFunc:xee};var QO;function bee(r){QO=r.wasm.cwrap(yo,null,[\"number\",\"number\"])}function Cee(r){let{backend:e,inputs:{x:t}}=r,o=e.dataIdMap.get(t.dataId).id,n=e.makeOutput(t.shape,t.dtype),s=e.dataIdMap.get(n.dataId).id;return x.sizeFromShape(n.shape)===0||QO(o,s),n}var ZO={kernelName:\"Sigmoid\",backendName:\"wasm\",setupFunc:bee,kernelFunc:Cee};var JO=Qe(Kn);var e3;function Iee(r){e3=r.wasm.cwrap(Xn,null,[\"number\",\"number\",\"number\",\"number\"])}function wee(r){let{backend:e,inputs:{logits:t},attrs:{dim:o}}=r,n=e.dataIdMap.get(t.dataId).id,s=e.makeOutput(t.shape,t.dtype),a=e.dataIdMap.get(s.dataId).id,i=t.shape[o],p=x.sizeFromShape(t.shape)/i;return x.sizeFromShape(s.shape)===0||e3(n,a,i,p),s}var t3={kernelName:Xn,backendName:\"wasm\",setupFunc:Iee,kernelFunc:wee};function See(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{blockShape:s,paddings:a}=o,i=x.sizeFromShape(s),p=[[0,0]];p.push(...a);for(let _=1+s.length;_0?p+1:0;if(c<0)throw new Error(I.getSparseSegmentReductionNegativeSegmentIdsErrorMessage());let l=n.shape.slice();l[0]=c;let m=t.dataIdMap.get(n.dataId).id,f=t.dataIdMap.get(s.dataId).id,d=t.dataIdMap.get(a.dataId).id,h=t.makeOutput(l,n.dtype),g=t.dataIdMap.get(h.dataId).id,y=t.makeOutput([4],\"int32\"),b=t.dataIdMap.get(y.dataId).id;i3(m,Ae[n.dtype],n.shape[0],f,d,g,b,e,0);let C=t.readSync(y.dataId),w;switch(C[0]){case 0:{w=I.getSparseSegmentReductionNegativeSegmentIdsErrorMessage();break}case 1:{w=I.getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage();break}case 2:w=I.getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage(C[1],C[2]);break;case 3:w=I.getSparseSegmentReductionIndicesOutOfRangeErrorMessage(C[1],C[2],C[3]);break;default:w=\"\"}if(t.disposeData(y.dataId),w)throw t.disposeData(h.dataId),new Error(w);return h}function _ee(r){return Ag(r,!0)}var u3={kernelName:Za,backendName:\"wasm\",setupFunc:Rg,kernelFunc:_ee};function Eee(r){return Ag(r,!1)}var p3={kernelName:Ja,backendName:\"wasm\",setupFunc:Rg,kernelFunc:Eee};function $ee(r){let{inputs:e,attrs:t,backend:o}=r,{x:n}=e,{numOrSizeSplits:s,axis:a}=t,i=x.parseAxisParam(a,n.shape)[0],p=I.prepareSplitSize(n,s,i),u=new Array(n.shape.length).fill(0),c=n.shape.slice();return p.map(l=>{let m=[...c];m[i]=l;let f=Xo({inputs:{x:n},attrs:{begin:u,size:m},backend:o});return u[i]+=l,f})}var c3={kernelName:Ts,backendName:\"wasm\",kernelFunc:$ee};var l3=Qe(bo);var m3=Qe(ti);var Ree=!0,f3=nt(Co,Ree);var d3;function Aee(r){d3=r.wasm.cwrap($s,null,[\"number\",\"number\",\"number\",\"number\"])}function Fee(r){let{backend:e,inputs:t,attrs:o}=r,{alpha:n}=o,{x:s}=t,a=e.dataIdMap.get(s.dataId).id,i=e.makeOutput(s.shape,s.dtype),p=e.dataIdMap.get(i.dataId).id;return d3(a,n,Ae[s.dtype],p),i}var h3={kernelName:$s,backendName:\"wasm\",setupFunc:Aee,kernelFunc:Fee};var g3;function Dee(r){g3=r.wasm.cwrap(Yn,null,[\"number\",\"array\",\"number\",\"array\",\"array\",\"array\",\"array\",\"array\",\"number\",\"number\"])}function Pee(r){let{backend:e,inputs:t,attrs:o}=r,{x:n}=t,{begin:s,end:a,strides:i,beginMask:p,endMask:u,ellipsisMask:c,newAxisMask:l,shrinkAxisMask:m}=o,{finalShapeSparse:f,finalShape:d,isIdentity:h,sliceDim0:g,isSimpleSlice:y,begin:b,end:C,strides:w}=et.sliceInfo(n.shape,s,a,i,p,u,c,l,m),k;if(h)k=Mt({inputs:{x:n},backend:e,attrs:{shape:d}});else if(g||y){x.assert(n.shape.length>=1,()=>`Input must have rank at least 1, got: ${n.shape.length}`);let _=et.computeOutShape(b,C,w),E=Xo({inputs:{x:n},backend:e,attrs:{begin:b,size:_}});k=Mt({inputs:{x:E},backend:e,attrs:{shape:d}}),e.disposeData(E.dataId)}else{let _=e.makeOutput(f,\"float32\"),E=e.dataIdMap.get(n.dataId).id,R=new Uint8Array(new Int32Array(x.computeStrides(n.shape)).buffer),A=new Uint8Array(new Int32Array(b).buffer),D=new Uint8Array(new Int32Array(C).buffer),O=new Uint8Array(new Int32Array(w).buffer),M=new Uint8Array(new Int32Array(f).buffer),L=new Uint8Array(new Int32Array(x.computeStrides(f)).buffer),W=e.dataIdMap.get(_.dataId).id;g3(E,R,n.shape.length,A,D,O,M,L,f.length,W),k=Mt({inputs:{x:_},backend:e,attrs:{shape:d}}),e.disposeData(_.dataId)}return k}var x3={kernelName:Yn,backendName:\"wasm\",setupFunc:Dee,kernelFunc:Pee};function Oee(r){let{backend:e,inputs:t,attrs:o}=r,{data:n,dataSplits:s}=t,{separator:a,nGramWidths:i,leftPad:p,rightPad:u,padWidth:c,preserveShortSequences:l}=o,m=e.readSync(n.dataId),f=e.readSync(s.dataId),[d,h]=ku(m,f,a,i,p,u,c,l),g=e.makeOutput([d.length],\"string\"),y=e.dataIdMap.get(g.dataId);y.stringBytes=d;let b=e.makeOutput(s.shape,\"int32\");return e.typedArrayFromHeap(b).set(h),[g,b]}var y3={kernelName:Ns,backendName:\"wasm\",kernelFunc:Oee};function Mee(r){let{backend:e,inputs:t,attrs:o}=r,{input:n,delimiter:s}=t,{skipEmpty:a}=o,i=e.readSync(n.dataId),p=e.readSync(s.dataId),[u,c,l]=Tu(i,p[0],a),m=c.length,f=e.makeOutput([m,2],\"int32\");e.typedArrayFromHeap(f).set(u);let h=e.makeOutput([m],\"string\"),g=e.dataIdMap.get(h.dataId);g.stringBytes=c;let y=e.makeOutput([2],\"int32\");return e.typedArrayFromHeap(y).set(l),[f,h,y]}var b3={kernelName:ri,backendName:\"wasm\",kernelFunc:Mee};function Lee(r){let{backend:e,inputs:t,attrs:o}=r,{input:n}=t,{numBuckets:s}=o,a=e.readSync(n.dataId),i=Nu(a,s),p=e.makeOutput(n.shape,\"int32\");return e.typedArrayFromHeap(p).set(i),p}var C3={kernelName:oi,backendName:\"wasm\",kernelFunc:Lee};var Bee=!0,I3=nt(Io,Bee);var w3;function Vee(r){w3=r.wasm.cwrap(jn,null,[\"number\",\"number\",\"number\",\"number\"])}function zee(r){let{backend:e,inputs:t,attrs:o}=r,{axis:n,keepDims:s}=o,{x:a}=t,i=e.dataIdMap.get(a.dataId).id,p=i,u=a,{transposed:c,axes:l,originalAxes:m,inputWasTransposed:f}=kr(a,n,e),d=l;if(f){let C=e.dataIdMap.get(c.dataId).id;C!==i&&(u=c,p=C,d=I.getInnerMostAxes(d.length,u.shape.length))}I.assertAxesAreInnerMostDims(\"sum\",d,u.shape.length);let[h,g]=I.computeOutAndReduceShapes(u.shape,d),y=x.sizeFromShape(g),b=e.makeOutput(h,u.dtype);if(x.sizeFromShape(u.shape)!==0){let C=e.dataIdMap.get(b.dataId).id;w3(p,y,Ae[b.dtype],C)}if(f&&e.disposeData(c.dataId),s){let C=I.expandShapeToKeepDim(b.shape,m);b.shape=C}return b}var S3={kernelName:jn,backendName:\"wasm\",setupFunc:Vee,kernelFunc:zee};var v3=Qe(xa);var k3=Qe(Qn);var T3;function Wee(r){T3=r.wasm.cwrap(wo,null,[\"number\",\"array\",\"number\",\"array\",\"number\",\"number\"])}function Uee(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,s=t.dataIdMap.get(n.dataId).id,{reps:a}=o,i=new Array(n.shape.length);for(let m=0;m{let{x:o}=r,{k:n,sorted:s}=t,a=e.dataIdMap.get(o.dataId).id,i=new Uint8Array(new Int32Array(o.shape).buffer),p=o.shape.slice();p[p.length-1]=n;let u=e.makeOutput(p,o.dtype),c=e.dataIdMap.get(u.dataId).id,l=e.makeOutput(p,\"int32\"),m=e.dataIdMap.get(l.dataId).id;return _3(a,i,o.shape.length,Ae[o.dtype],n,s,c,m),[u,l]},E3={kernelName:Zn,backendName:\"wasm\",setupFunc:Gee,kernelFunc:Hee};var $3;function qee(r){$3=r.wasm.cwrap(Jn,null,[\"number\",\"number\",\"bool\",\"number\",\"number\",\"number\",\"number\",\"number\",\"number\",\"array\",\"number\",\"array\",\"number\",\"number\",\"number\",\"number\",\"number\"])}function Kee(r){let{backend:e,inputs:t,attrs:o}=r,{image:n,transforms:s}=t,{interpolation:a,fillMode:i,fillValue:p,outputShape:u}=o,[c,l,m,f]=n.shape,[d,h]=u!=null?u:[l,m],g=[c,d,h,f],y=new Uint8Array(new Int32Array(x.computeStrides(n.shape)).buffer),b=new Uint8Array(new Int32Array(x.computeStrides(g)).buffer),C=e.makeOutput(g,n.dtype),w=e.dataIdMap.get(C.dataId).id,_=e.dataIdMap.get(n.dataId).id,R=e.dataIdMap.get(s.dataId).id,A=a===\"nearest\"?1:2,D;switch(i){case\"constant\":D=1;break;case\"reflect\":D=2;break;case\"wrap\":D=3;break;case\"nearest\":D=4;break;default:D=1;break}return $3(_,R,s.shape[0]>1,c,d,h,f,m,l,y,n.shape.length-1,b,g.length-1,A,D,p,w),C}var R3={kernelName:Jn,backendName:\"wasm\",setupFunc:qee,kernelFunc:Kee};function jee(r){let{inputs:e,backend:t,attrs:o}=r,{value:n}=e,{axis:s}=o;s<0&&(s+=n.shape.length);let a=n.shape[s],i=n.shape.length,p=new Array(i-1),u=0;for(let f=0;f({dataId:f,dtype:d,shape:p}))}var A3={kernelName:_s,backendName:\"wasm\",kernelFunc:jee};function Xee(r){let{inputs:{x:e},backend:t}=r,o=t.makeOutput(e.shape,e.dtype);return t.typedArrayFromHeap(o).fill(0),o}var F3={kernelName:Es,backendName:\"wasm\",kernelFunc:Xee};var Yee=[LD,BD,VD,WD,KD,XD,QD,JD,rP,nP,sP,aP,uP,pP,lP,fP,dP,hP,xP,bP,IP,SP,kP,TP,NP,_P,EP,$P,AP,FP,DP,OP,LP,VP,WP,GP,HP,qP,UD,jP,XP,YP,QP,ZP,JP,eO,tO,oO,nO,aO,uO,cO,lO,fO,dO,hO,xO,bO,IO,wO,vO,kO,TO,$g,_O,$O,AO,FO,DO,PO,OO,eP,LO,VO,WO,GO,HO,qO,jO,YO,ZO,JO,oP,t3,r3,n3,a3,u3,p3,c3,l3,m3,f3,h3,x3,y3,b3,C3,I3,S3,v3,k3,N3,E3,R3,HD,A3,F3];for(let r of Yee)ya(r);var Yw=P();Yw.registerFlag(\"WASM_HAS_SIMD_SUPPORT\",async()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,9,1,7,0,65,0,253,15,26,11]))}catch(r){return!1}});Yw.registerFlag(\"WASM_HAS_MULTITHREAD_SUPPORT\",async()=>{if(Yw.get(\"IS_NODE\"))return!1;try{return new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch(r){return!1}});var oS=rp(M3()),U3=rp(B3()),nS=rp(V3());var z3=oS.default||oS,Qee=nS.default||nS,Gl=class extends Jr{constructor(e){super(),this.wasm=e,this.dataIdNextNumber=1,this.wasm.tfjs.initWithThreadsCount(H3),rS=this.wasm.tfjs.getThreadsCount(),this.dataIdMap=new rn(this,cr())}write(e,t,o){let n={id:this.dataIdNextNumber++};return this.move(n,e,t,o,1),n}numDataIds(){return this.dataIdMap.numDataIds()}async time(e){let t=x.now();return e(),{kernelMs:x.now()-t}}move(e,t,o,n,s){let a=this.dataIdNextNumber++;if(n===\"string\"){let c=t;this.dataIdMap.set(e,{id:a,stringBytes:c,shape:o,dtype:n,memoryOffset:null,refCount:s});return}let i=x.sizeFromShape(o),p=i*x.bytesPerElement(n),u=this.wasm._malloc(p);this.dataIdMap.set(e,{id:a,memoryOffset:u,shape:o,dtype:n,refCount:s}),this.wasm.tfjs.registerTensor(a,i,u),t!=null&&this.wasm.HEAPU8.set(new Uint8Array(t.buffer,t.byteOffset,p),u)}async read(e){return this.readSync(e)}readSync(e,t,o){let{memoryOffset:n,dtype:s,shape:a,stringBytes:i}=this.dataIdMap.get(e);if(s===\"string\")return(t==null||t===0)&&(o==null||o>=i.length)?i:i.slice(t,o);t=t||0,o=o||x.sizeFromShape(a);let p=x.bytesPerElement(s),u=this.wasm.HEAPU8.slice(n+t*p,n+o*p);return Jee(u.buffer,s)}disposeData(e,t=!1){if(this.dataIdMap.has(e)){let o=this.dataIdMap.get(e);if(o.refCount--,!t&&o.refCount>0)return!1;this.wasm._free(o.memoryOffset),this.wasm.tfjs.disposeData(o.id),this.dataIdMap.delete(e)}return!0}refCount(e){return this.dataIdMap.has(e)?this.dataIdMap.get(e).refCount:0}incRef(e){let t=this.dataIdMap.get(e);t!=null&&t.refCount++}floatPrecision(){return 32}getMemoryOffset(e){return this.dataIdMap.get(e).memoryOffset}dispose(){this.wasm.tfjs.dispose(),\"PThread\"in this.wasm&&this.wasm.PThread.terminateAllThreads(),this.wasm=null}memory(){return{unreliable:!1}}makeOutput(e,t,o){let n;if(o==null)n=this.write(null,e,t);else{let s=this.dataIdNextNumber++;n={id:s},this.dataIdMap.set(n,{id:s,memoryOffset:o,shape:e,dtype:t,refCount:1});let a=x.sizeFromShape(e);this.wasm.tfjs.registerTensor(s,a,o)}return{dataId:n,shape:e,dtype:t}}typedArrayFromHeap({shape:e,dtype:t,dataId:o}){let n=this.wasm.HEAPU8.buffer,{memoryOffset:s}=this.dataIdMap.get(o),a=x.sizeFromShape(e);switch(t){case\"float32\":return new Float32Array(n,s,a);case\"int32\":return new Int32Array(n,s,a);case\"bool\":return new Uint8Array(n,s,a);default:throw new Error(`Unknown dtype ${t}`)}}};function Zee(r){return(e,t)=>(x.fetch(r,{credentials:\"same-origin\"}).then(o=>{o.ok||e.env.a(`failed to load wasm binary file at '${r}'`),o.arrayBuffer().then(n=>{WebAssembly.instantiate(n,e).then(s=>{t(s.instance,s.module)})})}),{})}function W3(r,e,t){if(Pg!=null)return Pg;let o=\"tfjs-backend-wasm.wasm\";return r&&e?o=\"tfjs-backend-wasm-threaded-simd.wasm\":r&&(o=\"tfjs-backend-wasm-simd.wasm\"),Wl!=null&&Wl[o]!=null?Wl[o]:t+o}async function G3(){let[r,e]=await Promise.all([P().getAsync(\"WASM_HAS_SIMD_SUPPORT\"),P().getAsync(\"WASM_HAS_MULTITHREAD_SUPPORT\")]);return new Promise((t,o)=>{let n={};n.locateFile=(i,p)=>{if(i.endsWith(\".worker.js\")){let u=U3.wasmWorkerContents.replace(/\\n/g,\"\\\\n\"),c=new Blob([u],{type:\"application/javascript\"});return URL.createObjectURL(c)}return i.endsWith(\".wasm\")?W3(r,e,zl!=null?zl:p):p+i},sS&&(n.instantiateWasm=Zee(W3(r,e,zl!=null?zl:\"\")));let s=!1;n.onAbort=()=>{if(s||Ul)return;Ul=!0,o({message:\"Make sure the server can serve the `.wasm` file relative to the bundled js file. For more details see https://github.com/tensorflow/tfjs/blob/master/tfjs-backend-wasm/README.md#using-bundlers\"})};let a;e&&r&&Pg==null?(n.mainScriptUrlOrBlob=new Blob([\"var WasmBackendModuleThreadedSimd = \"+z3.toString()],{type:\"text/javascript\"}),a=z3(n)):a=Qee(n),a.then(i=>{s=!0,Ul=!1;let p=null;i.tfjs={init:i.cwrap(\"init\",null,[]),initWithThreadsCount:i.cwrap(\"init_with_threads_count\",null,[\"number\"]),getThreadsCount:i.cwrap(\"get_threads_count\",\"number\",[]),registerTensor:i.cwrap(\"register_tensor\",null,[\"number\",\"number\",\"number\"]),disposeData:i.cwrap(\"dispose_data\",p,[\"number\"]),dispose:i.cwrap(\"dispose\",p,[])},t({wasm:i})}).catch(o)})}function Jee(r,e){switch(e){case\"float32\":return new Float32Array(r);case\"int32\":return new Int32Array(r);case\"bool\":return new Uint8Array(r);default:throw new Error(`Unknown dtype ${e}`)}}var ete=[\"tfjs-backend-wasm.wasm\",\"tfjs-backend-wasm-simd.wasm\",\"tfjs-backend-wasm-threaded-simd.wasm\"],Pg=null,zl=null,Wl={},Ul=!1,sS=!1;function tte(r,e=!1){if(sC(\"setWasmPath has been deprecated in favor of setWasmPaths and will be removed in a future release.\"),Ul)throw new Error(\"The WASM backend was already initialized. Make sure you call `setWasmPath()` before you call `tf.setBackend()` or `tf.ready()`\");Pg=r,sS=e}function rte(r,e=!1){if(Ul)throw new Error(\"The WASM backend was already initialized. Make sure you call `setWasmPaths()` before you call `tf.setBackend()` or `tf.ready()`\");if(typeof r==\"string\")zl=r;else{Wl=r;let t=ete.filter(o=>Wl[o]==null);if(t.length>0)throw new Error(`There were no entries found for the following binaries: ${t.join(\",\")}. Please either call setWasmPaths with a map providing a path for each binary, or with a string indicating the directory where all the binaries can be found.`)}sS=e}var H3=-1,rS=-1;function ote(r){H3=r}function nte(){if(rS===-1)throw new Error(\"WASM backend not initialized.\");return rS}var ste=\"4.0.0\";var ate=2;pi(\"wasm\",async()=>{let{wasm:r}=await G3();return new Gl(r)},ate);var Va=P();Va.registerFlag(\"WEBGPU_DEFERRED_SUBMIT_BATCH_SIZE\",()=>15);Va.registerFlag(\"WEBGPU_CPU_FORWARD\",()=>!0);Va.registerFlag(\"WEBGPU_MATMUL_PROGRAM_TYPE\",()=>-1);Va.registerFlag(\"WEBGPU_USE_NAIVE_CONV2D_TRANSPOSE\",()=>!1);Va.registerFlag(\"WEBGPU_USE_LOW_POWER_GPU\",()=>!1);Va.registerFlag(\"WEBGPU_CPU_HANDOFF_SIZE_THRESHOLD\",()=>1e3);Va.registerFlag(\"WEBGPU_USE_PROFILE_TOOL\",()=>!1);Va.registerFlag(\"WEBGPU_IMPORT_EXTERNAL_TEXTURE\",()=>!0);Va.registerFlag(\"WEBGPU_USE_NAIVE_CONV2D_DEBUG\",()=>!1);var Og=class{constructor(e){e&&(this.vendor=e.vendor)}isIntel(){return this.vendor===\"intel\"}};var Mg=class{constructor(e){this.device=e,this.numUsedBuffers=0,this.numFreeBuffers=0,this.freeBuffers=new Map,this.usedBuffers=new Map,this.numBytesUsed=0,this.numBytesAllocated=0}acquireUploadBuffer(e,t){return this.acquireBuffer(e,t,!0)}acquireBuffer(e,t,o=!1){let n=q3(e,t);if(this.freeBuffers.has(n)||this.freeBuffers.set(n,[]),this.usedBuffers.has(n)||this.usedBuffers.set(n,[]),this.numBytesUsed+=e,this.numUsedBuffers++,this.freeBuffers.get(n).length>0){this.numFreeBuffers--;let a=this.freeBuffers.get(n).shift();return this.usedBuffers.get(n).push(a),a}this.numBytesAllocated+=e;let s=this.device.createBuffer({size:e,usage:t,mappedAtCreation:o});return this.usedBuffers.get(n).push(s),s}releaseBuffer(e,t,o){if(this.freeBuffers.size===0)return;let n=q3(t,o);this.freeBuffers.has(n)||this.freeBuffers.set(n,[]),this.freeBuffers.get(n).push(e),this.numFreeBuffers++,this.numUsedBuffers--;let s=this.usedBuffers.get(n),a=s.indexOf(e);if(a<0)throw new Error(\"Cannot release a buffer that was never provided by this buffer manager\");s.splice(a,1),this.numBytesUsed-=t}releaseUploadBuffer(e,t,o){e.mapAsync(GPUMapMode.WRITE).then(()=>{this.releaseBuffer(e,t,o)},n=>{})}getNumUsedBuffers(){return this.numUsedBuffers}getNumFreeBuffers(){return this.numFreeBuffers}dispose(){this.freeBuffers.forEach((e,t)=>{e.forEach(o=>{o.destroy()})}),this.usedBuffers.forEach((e,t)=>{e.forEach(o=>{o.destroy()})}),this.freeBuffers=new Map,this.usedBuffers=new Map,this.numUsedBuffers=0,this.numFreeBuffers=0,this.numBytesUsed=0,this.numBytesAllocated=0}};function q3(r,e){return`${r}_${e}`}var Lg=class{constructor(e){this.device=e,this.numUsedTextures=0,this.numFreeTextures=0,this.freeTextures=new Map,this.usedTextures=new Map,this.numBytesUsed=0,this.numBytesAllocated=0}acquireTexture(e,t,o,n){let s=j3(o),a=e*t*s,i=K3(e,t,o,n);if(this.freeTextures.has(i)||this.freeTextures.set(i,[]),this.usedTextures.has(i)||this.usedTextures.set(i,[]),this.numBytesUsed+=a,this.numUsedTextures++,this.freeTextures.get(i).length>0){this.numFreeTextures--;let u=this.freeTextures.get(i).shift();return this.usedTextures.get(i).push(u),u}this.numBytesAllocated+=a;let p=this.device.createTexture({size:[e,t],format:o,usage:n});return this.usedTextures.get(i).push(p),p}releaseTexture(e,t,o,n,s){if(this.freeTextures.size===0)return;let a=K3(t,o,n,s);this.freeTextures.has(a)||this.freeTextures.set(a,[]),this.freeTextures.get(a).push(e),this.numFreeTextures++,this.numUsedTextures--;let i=this.usedTextures.get(a),p=i.indexOf(e);if(p<0)throw new Error(\"Cannot release a texture that was never provided by this texture manager\");i.splice(p,1);let u=j3(n),c=t*o*u;this.numBytesUsed-=c}getNumUsedTextures(){return this.numUsedTextures}getNumFreeTextures(){return this.numFreeTextures}dispose(){this.freeTextures.forEach((e,t)=>{e.forEach(o=>{o.destroy()})}),this.usedTextures.forEach((e,t)=>{e.forEach(o=>{o.destroy()})}),this.freeTextures=new Map,this.usedTextures=new Map,this.numUsedTextures=0,this.numFreeTextures=0,this.numBytesUsed=0,this.numBytesAllocated=0}};function K3(r,e,t,o){return`${r}_${e}_${t}_${o}`}function j3(r){if(r===\"rgba8unorm\")return 16;throw new Error(`${r} is not supported!`)}function X3(r,e){if(Math.max(...r)>3)throw new Error(\"Cannot symbolically compute strides for rank > 4 tensor.\");let t=r.length,o=r.map(s=>`${e}[${s}]`),n=new Array(t-1);n[t-2]=o[t-1];for(let s=t-3;s>=0;--s)n[s]=`(${n[s+1]} * ${o[s+1]})`;return n}var Z3=(r,e,t,o)=>{let n={dtype:o.dtype,shape:o.shape},s=ite(t,n,e),a=r.createShaderModule({code:s,label:e.constructor.name});return r.createComputePipeline({compute:{module:a,entryPoint:\"_start\"},label:e.constructor.name,layout:\"auto\"})};function At(r){if(r<=1)return\"i32\";if(r===2)return\"vec2\";if(r===3)return\"vec3\";if(r===4)return\"vec4\";if(r===5)return\"vec5\";if(r===6)return\"vec6\";throw Error(`GPU for rank ${r} is not yet supported`)}function Yo(r){if(r===0)return\"x\";if(r===1)return\"y\";if(r===2)return\"z\";if(r===3)return\"w\";if(r===4)return\"u\";if(r===5)return\"v\";throw Error(`Index ${r} is not yet supported`)}function ue(...r){let e;switch(r.length){case 0:e=`\n ${Ri()}\n fn _start(@builtin(local_invocation_id) LocalId : vec3,\n @builtin(global_invocation_id) GlobalId : vec3,\n @builtin(num_workgroups) NumWorkgroups : vec3) {\n localId = LocalId;\n globalId = GlobalId;\n numWorkgroups = NumWorkgroups;\n main();\n }\n\n fn main()\n `;break;case 1:e=`\n ${Ri()}\n fn _start(@builtin(local_invocation_id) LocalId : vec3,\n @builtin(global_invocation_id) GlobalId : vec3,\n @builtin(num_workgroups) NumWorkgroups : vec3) {\n localId = LocalId;\n globalId = GlobalId;\n numWorkgroups = NumWorkgroups;\n main(getGlobalIndex());\n }\n\n fn main(${r[0]} : i32)\n `;break;default:throw Error(\"Unreachable\")}return e}function Ri(){return`\n @compute @workgroup_size(workGroupSizeX, workGroupSizeY, workGroupSizeZ)\n`}function ite(r,e,t){let o=[];if(o.push(`\n const workGroupSizeX = ${t.workGroupSize[0]}u;\n const workGroupSizeY = ${t.workGroupSize[1]}u;\n const workGroupSizeZ = ${t.workGroupSize[2]}u;\n\n var localId: vec3;\n var globalId: vec3;\n var numWorkgroups: vec3;\n\n // Only used when the y/z dimension of workgroup size is 1.\n fn getGlobalIndex() -> i32 {\n ${eM(t)?\" return i32(globalId.x);\":` let localInvocationIndex = localId.z * workGroupSizeX * workGroupSizeY +\n localId.y * workGroupSizeX + localId.x;\n let workGroupID = (globalId - localId)/vec3(\n workGroupSizeX, workGroupSizeY, workGroupSizeZ);\n\n return i32((workGroupID.z * numWorkgroups.x * numWorkgroups.y +\n workGroupID.y * numWorkgroups.x + workGroupID.x) *\n (workGroupSizeX * workGroupSizeY * workGroupSizeZ) +\n localInvocationIndex);\n `}\n }\n `),t.isFromPixels)return o.push(`\n struct Uniform {\n size : i32,\n numChannels : i32,\n outShapeStrides : vec2,\n };\n\n @group(0) @binding(0) var result: array<${Tc(e.dtype,t.isVec4)}>;\n @group(0) @binding(2) var uniforms: Uniform;\n `),[Y3,o.join(`\n`),Q3(e.shape),t.getUserCode()].join(`\n`);let n=\"struct Uniforms { NAN : f32, \";t.variableNames.forEach((m,f)=>{let d=At(r[f].shape.length);n+=`${m.charAt(0).toLowerCase()+m.slice(1)}Shape : ${d}, `});let s=At(e.shape.length);n+=`outShape : ${s}, `;let a=e.shape.length-1,i=At(a);n+=`\n outShapeStrides: ${i}, `,t.size&&(n+=\"size : i32, \"),t.uniforms&&(n+=t.uniforms),n+=\"};\",n=dte(n),o.push(n),t.atomic?o.push(`\n @group(0) @binding(0) var result: array>;\n `):o.push(`\n @group(0) @binding(0) var result: array<${Tc(e.dtype,t.isVec4)}>;\n `),t.variableNames.forEach((m,f)=>{o.push(`\n @group(0) @binding(${1+f}) var ${m}: array<${t.variableTypes?t.variableTypes[f]:Tc(r[f].dtype,t.isVec4)}>;\n `)}),n!==\"\"&&o.push(`\n @group(0) @binding(${1+t.variableNames.length}) var uniforms: Uniforms;\n `);let p=lte(e.shape,t.dispatchLayout),u=[Y3,o.join(`\n`),Q3(e.shape),p,mte(e.shape.length)];t.atomic||u.push(fte(e.shape,e.dtype,t.isVec4));let c=r.map((m,f)=>cte(m,e.shape,t.variableTypes?t.variableTypes[f]===\"vec4\":t.isVec4,t.dispatchLayout.x.length===e.shape.length)).join(`\n`);return u.push(c),u.push(t.getUserCode()),u.join(`\n`)}function J3(r,e,t,o){let n=r.shaderKey;if(r.isFromPixels)return n;let s=t.map(c=>c.dtype).concat(o.dtype),a=t.map(c=>I.getBroadcastDims(c.shape,o.shape)),i=t.map(c=>x.arraysEqual(c.shape,o.shape)).join(\"_\"),p=a.map(c=>c.join(\"_\")).join(\";\"),u=eM(r)?\"flatDispatch\":\"\";return n+=\"_\"+(r.workGroupSize?r.workGroupSize.join(\",\"):\"\")+e.map(c=>c.length).join(\",\")+s.join(\",\")+r.variableNames.join(\",\")+p+i+u,n}var Y3=`\n struct vec5 {x: i32, y: i32, z: i32, w: i32, u: i32};\n struct vec6 {x: i32, y: i32, z: i32, w: i32, u: i32, v: i32};\n\n // Checks whether coordinates lie within the bounds of the shape.\n fn coordsInBounds2D(coord : vec2, shape : vec2) -> bool {\n return all(coord >= vec2(0)) && all(coord < shape);\n }\n fn coordsInBounds3D(coord : vec3, shape : vec3) -> bool {\n return all(coord >= vec3(0)) && all(coord < shape);\n }\n fn coordsInBounds4D(coord : vec4, shape : vec4) -> bool {\n return all(coord >= vec4(0)) && all(coord < shape);\n }\n\n fn getIndexFromCoords1D(coord : i32, shape : i32) -> i32 {\n return coord;\n }\n fn getIndexFromCoords2D(coords : vec2, shape : vec2) -> i32 {\n return dot(coords, vec2(shape.y, 1));\n }\n fn getIndexFromCoords3D(coords : vec3, shape : vec3) -> i32 {\n return dot(coords, vec3(shape.y * shape.z, shape.z, 1));\n }\n fn getIndexFromCoords4D(coords : vec4, shape : vec4) -> i32 {\n return dot(coords, vec4(\n shape.y * shape.z * shape.w, shape.z * shape.w, shape.w, 1));\n }\n fn getIndexFromCoords5D(coords : vec5, shape : vec5) -> i32 {\n let shapeStrides: vec5 = vec5(shape.y * shape.z * shape.w * shape.u, shape.z * shape.w * shape.u, shape.w * shape.u, shape.u, 1);\n return coords.x*shapeStrides.x + coords.y*shapeStrides.y + coords.z*shapeStrides.z + coords.w*shapeStrides.w + coords.u*shapeStrides.u;\n }\n fn getIndexFromCoords6D(coords : vec6, shape : vec6) -> i32 {\n let shapeStrides: vec6 = vec6(shape.y * shape.z * shape.w * shape.u * shape.v, shape.z * shape.w * shape.u * shape.v, shape.w * shape.u * shape.v, shape.u * shape.v, shape.v, 1);\n return coords.x*shapeStrides.x + coords.y*shapeStrides.y + coords.z*shapeStrides.z + coords.w*shapeStrides.w + coords.u*shapeStrides.u + coords.v*shapeStrides.v;\n }\n\n fn idiv(a: i32, b: i32, sign: f32) -> i32 {\n var res: i32 = a / b;\n let modulo: i32 = a % b;\n if (sign < 0. && modulo != 0) {\n res = res - 1;\n }\n return res;\n }\n\n // NaN defination in IEEE 754-1985 is :\n // - sign = either 0 or 1.\n // - biased exponent = all 1 bits.\n // - fraction = anything except all 0 bits (since all 0 bits represents infinity).\n // https://en.wikipedia.org/wiki/IEEE_754-1985#Representation_of_non-numbers\n fn isnan(val: f32) -> bool {\n let floatToUint: u32 = bitcast(val);\n return (floatToUint & 0x7fffffffu) > 0x7f800000u;\n }\n fn isnanVec4(val : vec4) -> vec4 {\n return vec4(isnan(val[0]), isnan(val[1]), isnan(val[2]), isnan(val[3]));\n }\n`;function Q3(r){let e=r.length;if(e<=1)return\"fn getCoordsFromIndex(index : i32) -> i32 { return index; }\";let t=x.computeStrides(r),o=At(e),n=[];for(let a=0;a vec2 {\n let d0 = index / uniforms.outShapeStrides; let d1 = index - d0 * uniforms.outShapeStrides;\n return vec2(d0, d1);\n }`;let s;return s=\"var index2 = index;\"+t.map((a,i)=>{let p=`let ${n[i]} = index2 / uniforms.outShapeStrides.${Yo(i)}`,u=i===t.length-1?`let ${n[i+1]} = index2 - ${n[i]} * uniforms.outShapeStrides.${Yo(i)}`:`index2 = index2 - ${n[i]} * uniforms.outShapeStrides.${Yo(i)}`;return`${p}; ${u};`}).join(\"\"),`\n fn getCoordsFromIndex(index : i32) -> ${o} {\n ${s}\n return ${o}(${n.join(\",\")});\n }\n `}function ute(r,e){let t=r.name,o=r.shape.length,n=At(o),s=\"get\"+t.charAt(0).toUpperCase()+t.slice(1),a=[\"d0\",\"d1\",\"d2\",\"d3\",\"d4\",\"d5\"].slice(0,o),i=a.map(c=>`${c} : i32`).join(\", \");if(o<1)return e?`\n fn ${s}() -> vec4 {\n return vec4(${t}[0]);\n }\n `:`\n fn ${s}() ->f32 {\n return f32(${t}[0]);\n }\n `;let p=`uniforms.${t.charAt(0).toLowerCase()+t.slice(1)}Shape`,u=`${o}D`;return o===0&&(u=\"1D\"),e?`\n fn ${s}(${i}) -> vec4 {\n return vec4(${t}[getIndexFromCoords${u}(${n}(${a.join(\",\")}),\n ${p}) / 4]);\n }\n `:`\n fn ${s}(${i}) -> f32 {\n return f32(${t}[getIndexFromCoords${u}(${n}(${a.join(\",\")}),\n ${p})]);\n }\n `}function pte(r,e,t,o){let n=r.name,s=n.charAt(0).toUpperCase()+n.slice(1),a=\"get\"+s+\"ByOutput\",i=r.shape.length,p=e.length,u=At(p);if(x.arraysEqual(r.shape,e)&&o)return t?`\n fn ${a}Index(globalIndex : i32) -> vec4 {\n return vec4(${n}[globalIndex]);\n }\n\n fn ${a}Coords(coords : ${u}) -> vec4 {\n return vec4(${n}[${p>1?\"getOutputIndexFromCoords(coords)\":\"coords\"} / 4]);\n }\n `:`\n fn ${a}Index(globalIndex : i32) -> f32 {\n return f32(${n}[globalIndex]);\n }\n\n fn ${a}Coords(coords : ${u}) -> f32 {\n return f32(${n}[${p>1?\"getOutputIndexFromCoords(coords)\":\"coords\"}]);\n }\n `;let c=I.getBroadcastDims(r.shape,e),l=p-i,m=\"\";if(i===0)return t?`\n fn ${a}Index(globalIndex : i32) -> vec4 {\n return get${s}();\n }\n\n fn ${a}Coords(coords : ${u}) -> vec4 {\n return get${s}();\n }\n `:`\n fn ${a}Index(globalIndex : i32) -> f32{\n return get${s}();\n }\n\n fn ${a}Coords(coords : ${u}) -> f32{\n return get${s}();\n }\n `;p<2&&c.length>=1?m=\"coords = 0;\":m=c.map(g=>`coords.${Yo(g+l)} = 0;`).join(`\n`);let f=\"\";if(p<2&&i>0)f=\"coords\";else if(p>1){let g=At(i),y=r.shape.map((b,C)=>`coords.${Yo(C+l)}`).join(\", \");f=`${g}(${y})`}else f=\"coords\";let d=`uniforms.${n.charAt(0).toLowerCase()+n.slice(1)}Shape`,h=`${i}D`;return t?`\n fn ${a}Index(globalIndex : i32) -> vec4 {\n var coords = getCoordsFromIndex(globalIndex);\n ${m}\n return ${n}[getIndexFromCoords${h}(${f}, ${d}) / 4];\n }\n\n fn ${a}Coords(coordsIn : ${u}) -> vec4 {\n var coords = coordsIn;\n ${m}\n return ${n}[getIndexFromCoords${h}(${f}, ${d}) / 4];\n }\n `:`\n fn ${a}Index(globalIndex : i32) -> f32 {\n var coords = getCoordsFromIndex(globalIndex);\n ${m}\n return f32(${n}[getIndexFromCoords${h}(${f}, ${d})]);\n }\n\n fn ${a}Coords(coordsIn : ${u}) -> f32 {\n var coords = coordsIn;\n ${m}\n return f32(${n}[getIndexFromCoords${h}(${f}, ${d})]);\n }\n`}function cte(r,e,t,o){let n=ute(r,t);return r.shape.length<=e.length&&(n+=pte(r,e,t,o)),n}function lte(r,e){let{x:t,y:o=[],z:n=[]}=e,s=r.length,a=t.length+o.length+n.length;if(a!==s)return\"\";if(t.length===s)return`fn getOutputCoords() -> ${At(s)}{\n let globalIndex = getGlobalIndex();\n return getCoordsFromIndex(globalIndex);\n }\n `;let i=\"\",p=[t,o,n];for(let m=0;m ${c} {\n ${i}\n`;return u.length===0?l+=`return ${c}(0); }`:l+=`return ${c}(${u.join(\",\")}); }`,l}function mte(r){let e=\"\";switch(r){case 0:case 1:e+=`\n fn getOutputIndexFromCoords(coords : i32) -> i32 {\n return coords;\n }\n `;break;case 2:e+=`\n fn getOutputIndexFromCoords(coords : vec2) -> i32 {\n return dot(coords, vec2(uniforms.outShapeStrides, 1));\n }\n `;break;case 3:e+=`\n fn getOutputIndexFromCoords(coords : vec3) -> i32 {\n return dot(coords, vec3(uniforms.outShapeStrides.x, uniforms.outShapeStrides.y, 1));\n }\n `;break;case 4:e+=`\n fn getOutputIndexFromCoords(coords : vec4) -> i32 {\n return dot(coords, vec4(\n uniforms.outShapeStrides.x, uniforms.outShapeStrides.y, uniforms.outShapeStrides.z, 1));\n }\n `;break;case 5:e+=`\n fn getOutputIndexFromCoords(coords : vec5) -> i32 {\n return coords.x * uniforms.outShapeStrides.x +\n coords.y * uniforms.outShapeStrides.y +\n coords.z * uniforms.outShapeStrides.z +\n coords.w * uniforms.outShapeStrides.w +\n coords.u;\n }\n `;break;case 6:e+=`\n fn getOutputIndexFromCoords(coords : vec6) -> i32 {\n return coords.x * uniforms.outShapeStrides.x +\n coords.y * uniforms.outShapeStrides.y +\n coords.z * uniforms.outShapeStrides.z +\n coords.w * uniforms.outShapeStrides.w +\n coords.u * uniforms.outShapeStrides.u +\n coords.v;\n }\n `;break;default:x.assert(!1,()=>`Unsupported ${r}D shape`);break}return e}function eM(r){return r.dispatch[1]===1&&r.dispatch[2]===1}function Tc(r,e){return r===\"float32\"?e?\"vec4\":\"f32\":r===\"int32\"||r===\"bool\"?e?\"vec4\":\"i32\":r}function fte(r,e,t){let o=r.length,n=Tc(e,t),s;if(t?s=`fn setOutputAtIndex(flatIndex : i32, value : vec4) {\n result[flatIndex] = ${n}(value);\n }\n fn setOutputAtIndexI32(flatIndex : i32, value : vec4) {\n result[flatIndex] = ${n}(value);\n }`:s=`fn setOutputAtIndex(flatIndex : i32, value : f32) {\n result[flatIndex] = ${n}(value);\n }\n fn setOutputAtIndexI32(flatIndex : i32, value : i32) {\n result[flatIndex] = ${n}(value);\n }`,o>=2){let a=[\"d0\",\"d1\",\"d2\",\"d3\",\"d4\",\"d5\"].slice(0,o),i=At(o);t?s+=`\n fn setOutputAtCoords(${a.map(p=>`${p} : i32`).join(\", \")}, value : vec4) {\n let flatIndex = getOutputIndexFromCoords(${i}(${a.join(\", \")}));\n setOutputAtIndex(flatIndex / 4, value);\n }\n fn setOutputAtCoordsI32(${a.map(p=>`${p} : i32`).join(\", \")}, value : vec4) {\n let flatIndex = getOutputIndexFromCoords(${i}(${a.join(\", \")}));\n setOutputAtIndexI32(flatIndex / 4, value);\n }\n `:s+=`\n fn setOutputAtCoords(${a.map(p=>`${p} : i32`).join(\", \")}, value : f32) {\n let flatIndex = getOutputIndexFromCoords(${i}(${a.join(\", \")}));\n setOutputAtIndex(flatIndex, value);\n }\n fn setOutputAtCoordsI32(${a.map(p=>`${p} : i32`).join(\", \")}, value : i32) {\n let flatIndex = getOutputIndexFromCoords(${i}(${a.join(\", \")}));\n setOutputAtIndexI32(flatIndex, value);\n }\n `}return s}function dte(r){let e=/(\\w+)\\s*:\\s*vec(5|6)/g;r=r.replace(e,o=>\"@align(16) \"+o);let t=/vec(5|6)\\s*,\\s*(\\w+)/g;return r=r.replace(t,(o,n,s)=>`vec${n}, @align(16) ${s}`),r}var pS={};Be(pS,{ArrayBufferToTypedArray:()=>uS,GPUBytesPerElement:()=>iS,MatMulProgramType:()=>Qo,computeDispatch:()=>ae,computeWorkGroupInfoForMatMul:()=>aS,computeWorkGroupSizeForConv2d:()=>Hl,computeWorkPerThreadForConv2d:()=>ql,flatDispatchLayout:()=>fe,isWebGPUSupported:()=>Kl,tilesFitEvenlyIntoShape:()=>gte});var Wu=r=>{let e=1;for(let t=0;tt%r[o]===0)}function ae(r,e,t=[1,1,1],o=[1,1,1]){let[n,s,a]=[Math.ceil(Wu(r.x.map(i=>e[i]))/(t[0]*o[0])),r.y?Math.ceil(Wu(r.y.map(i=>e[i]))/(t[1]*o[1])):1,r.z?Math.ceil(Wu(r.z.map(i=>e[i]))/(t[2]*o[2])):1];return[n,s,a]}function aS(r,e,t,o=!1){let n=[8,8,1],s=[4,4,1];return o||(r<=8&&(s[1]=1),e<=16&&t<=16&&(n[0]=4)),{workGroupSize:n,elementsPerThread:s}}function Hl(r,e,t=!1){if(t)return[8,8,1];let o=Wu(r.x.map(s=>e[s])),n=Wu(r.y.map(s=>e[s]));return o<=4?[4,16,1]:n<=4?[16,4,1]:[16,16,1]}function ql(r,e,t=!1){if(t)return[4,4,1];let o=Wu(r.x.map(s=>e[s])),n=Wu(r.y.map(s=>e[s]));return o<=4?[1,2,1]:n<=4?[2,1,1]:[2,2,1]}function fe(r){return{x:r.map((e,t)=>t)}}function iS(r){if(r===\"float32\"||r===\"int32\"||r===\"bool\"||r===\"string\")return 4;if(r===\"complex64\")return 8;throw new Error(`Unknown dtype ${r}`)}function uS(r,e){if(e===\"float32\")return new Float32Array(r);if(e===\"int32\")return new Int32Array(r);if(e===\"bool\"||e===\"string\")return Uint8Array.from(new Int32Array(r));throw new Error(`Unknown dtype ${e}`)}function Kl(){return(typeof window!=\"undefined\"||typeof WorkerGlobalScope!=\"undefined\")&&!!navigator.gpu}var Qo;(function(r){r[r.MatMulReduceProgram=0]=\"MatMulReduceProgram\",r[r.MatMulSplitKProgram=1]=\"MatMulSplitKProgram\",r[r.MatMulSmallOutputSizeProgram=2]=\"MatMulSmallOutputSizeProgram\",r[r.MatMulPackedProgram=3]=\"MatMulPackedProgram\",r[r.MatMulMax=4]=\"MatMulMax\"})(Qo||(Qo={}));var xte=P().getNumber(\"WEBGPU_CPU_HANDOFF_SIZE_THRESHOLD\"),yte=(r,e)=>{let t=r.limits.maxComputeWorkgroupsPerDimension,o=e.dispatchLayout,n=e.dispatch;if(n.every(a=>a<=t))return n;x.assert(n[0]>t&&o.y===void 0&&o.z===void 0,()=>\"Dispatch size exceeds WebGPU limits in Y or Z dimension.\");let s=Math.ceil(Math.sqrt(n[0]));return s>t?(s=Math.ceil(Math.cbrt(n[0])),x.assert(s<=t,()=>\"Total dispatch size exceeds WebGPU maximum.\"),[s,s,s]):[s,s,1]},Ai=class extends Jr{constructor(e,t){if(super(),this.commandQueueOwnedIds=new WeakSet,this.dispatchNumberInEncoder=0,this.disposed=!1,this.downloadWaitMs=0,this.tensorDataPendingDisposal=[],this.stagingPendingDisposal=[],this.uniformPendingDisposal=[],this.uploadWaitMs=0,!Kl())throw new Error(\"WebGPU is not supported on this device\");this.pipelineCache={},this.device=e,this.queue=e.queue,this.currentCommandEncoder=null,this.currentComputePass=null,this.supportTimeQuery=e.features.has(\"timestamp-query\"),this.adapterInfo=new Og(t),this.bufferManager=new Mg(this.device),this.textureManager=new Lg(this.device),this.tensorMap=new rn(this,cr()),this.supportTimeQuery&&(this.querySet=this.device.createQuerySet({type:\"timestamp\",count:2})),P().getBool(\"WEBGPU_USE_PROFILE_TOOL\")&&(this.dummyCanvas=document.createElement(\"canvas\"),this.dummyCanvas.width=1,this.dummyCanvas.height=1,this.dummyContext=this.dummyCanvas.getContext(\"webgpu\"),this.dummyContext.configure({device:e,format:\"bgra8unorm\"}),document.body.appendChild(this.dummyCanvas))}nextDataId(){return Ai.nextDataId++}floatPrecision(){return 32}defaultGpuBufferUsage(){return GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST}disposeData(e,t=!1){if(this.tensorDataPendingDisposal.indexOf(e)>=0)return!1;if(!this.tensorMap.has(e))return!0;let o=this.tensorMap.get(e);if(this.decRef(e),!t&&o.refCount>0)return!1;if(this.commandQueueOwnedIds.has(e))return this.tensorDataPendingDisposal.push(e),!1;let{complexTensorInfos:n}=this.tensorMap.get(e);return n!=null&&(this.disposeData(n.real.dataId,t),this.disposeData(n.imag.dataId,t)),this.releaseResource(e),this.tensorMap.delete(e),!0}memory(){return{numBytesInGPU:this.bufferManager.numBytesUsed,numBytesAllocatedInGPU:this.bufferManager.numBytesAllocated,unreliable:!1}}releaseResource(e){let t=this.tensorMap.get(e);if(!(!t||!t.resourceInfo)){if(\"texture\"in t.resourceInfo){let o=t.resourceInfo;o.texture instanceof GPUTexture&&this.textureManager.releaseTexture(o.texture,o.width,o.height,o.format,o.usage),o.texture=null}else{let o=t.resourceInfo;this.bufferManager.releaseBuffer(o.buffer,o.size,o.usage),o.buffer=null}t.resourceInfo=null}}refCount(e){return this.tensorMap.has(e)?this.tensorMap.get(e).refCount:0}incRef(e){let t=this.tensorMap.get(e);t.refCount++}decRef(e){if(this.tensorMap.has(e)){let t=this.tensorMap.get(e);t.refCount--}}write(e,t,o){if(o===\"complex64\"&&e!=null)throw new Error(\"Cannot write to a complex64 dtype. Please use tf.complex(real, imag).\");let n={id:this.nextDataId()};return this.tensorMap.set(n,{dtype:o,shape:t,values:e,refCount:1}),n}move(e,t,o,n,s){if(n===\"complex64\")throw new Error(\"Cannot write to a complex64 dtype. Please use tf.complex(real, imag).\");this.tensorMap.set(e,{dtype:n,shape:o,values:t,refCount:s})}submitQueue(){this.ensureComputePassEnded(),this.queue.submit([this.currentCommandEncoder.finish()]),this.currentCommandEncoder=null,this.dispatchNumberInEncoder=0,this.commandQueueOwnedIds=new WeakSet,this.tensorDataPendingDisposal.forEach(e=>{this.releaseResource(e),this.tensorMap.delete(e)}),this.uniformPendingDisposal.forEach(e=>this.bufferManager.releaseBuffer(e.buffer,e.size,e.usage)),this.stagingPendingDisposal.forEach(e=>this.bufferManager.releaseUploadBuffer(e.buffer,e.size,e.usage)),this.tensorDataPendingDisposal=[],this.uniformPendingDisposal=[],this.stagingPendingDisposal=[]}ensureCommandEncoderReady(){this.currentCommandEncoder||(this.currentCommandEncoder=this.device.createCommandEncoder())}ensureComputePassEnded(){this.currentComputePass&&(this.currentComputePass.end(),this.currentComputePass=null)}getComputePass(){return this.currentComputePass||(this.currentComputePass=this.currentCommandEncoder.beginComputePass()),this.currentComputePass}async getBufferData(e,t){let o=this.bufferManager.acquireBuffer(t,GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ);this.ensureCommandEncoderReady(),this.ensureComputePassEnded(),this.currentCommandEncoder.copyBufferToBuffer(e,0,o,0,t),this.submitQueue(),await o.mapAsync(GPUMapMode.READ);let n=o.getMappedRange().slice(0);return o.unmap(),o!=null&&this.bufferManager.releaseBuffer(o,t,GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ),P().getBool(\"WEBGPU_USE_PROFILE_TOOL\")&&(x.assert(this.dummyContext!==void 0,()=>\"Fail to get context for profiling tool\"),this.dummyContext.getCurrentTexture()),n}convertAndCacheOnCPU(e,t){let o=this.tensorMap.get(e);return this.releaseResource(e),o.values=t,o.values}readSync(e){let t=this.tensorMap.get(e),{values:o}=t;if(o==null)throw new Error(\"WebGPU readSync is only available for CPU-resident tensors.\");return o}async read(e){if(!this.tensorMap.has(e))throw new Error(`Tensor ${e} was not registered!`);let t=this.tensorMap.get(e),{values:o}=t;if(o!=null)return this.convertAndCacheOnCPU(e,o);let n;if(t.dtype===\"complex64\"){let s=await Promise.all([this.read(t.complexTensorInfos.real.dataId),this.read(t.complexTensorInfos.imag.dataId)]),a=s[0],i=s[1];n=I.mergeRealAndImagArrays(a,i)}else{let s=t.resourceInfo,a=await this.getBufferData(s.buffer,s.size);n=uS(a,t.dtype)}return this.convertAndCacheOnCPU(e,n),n}readToGPU(e){let t=this.tensorMap.get(e),{values:o,dtype:n,shape:s,resourceInfo:a}=t;if(n===\"complex64\")throw new Error(\"Does not support reading buffer for complex64 dtype.\");if(a==null)throw o!=null?new Error(\"Data is not on GPU but on CPU.\"):new Error(\"There is no data on GPU or CPU.\");let i=a.size,p=this.bufferManager.acquireBuffer(i,a.usage);this.ensureCommandEncoderReady(),this.ensureComputePassEnded(),this.currentCommandEncoder.copyBufferToBuffer(a.buffer,0,p,0,i),this.submitQueue();let u=this.makeTensorInfo(s,n),c=cr().makeTensorFromTensorInfo(u),l=this.tensorMap.get(u.dataId);return l.resourceInfo={size:i,usage:this.defaultGpuBufferUsage(),buffer:p},{tensorRef:c,buffer:p,bufSize:i}}bufferSync(e){let t=this.readSync(e.dataId);if(e.dtype===\"string\")try{let o=t.map(n=>x.decodeString(n));return ne(e.shape,e.dtype,o)}catch(o){throw new Error(\"Failed to decode encoded string bytes into utf-8\")}return ne(e.shape,e.dtype,t)}async time(e){this.supportTimeQuery||console.warn(\"This device doesn't support timestamp-query extension. Start Chrome browser with flag --disable-dawn-features=disallow_unsafe_apis then try again. Otherwise, zero will be shown for the kernel time when profiling mode is enabled. Using performance.now is not workable for webgpu since it doesn't support synchronous data read from GPU.\");let t=this.activeTimers,o=[],n=!1;this.programTimersStack==null?(this.programTimersStack=o,n=!0):this.activeTimers.push(o),this.activeTimers=o,e();let s=x.flatten(this.activeTimers.map(u=>u.query)).filter(u=>u!=null),a=x.flatten(this.activeTimers.map(u=>u.name)).filter(u=>u!=null);this.activeTimers=t,n&&(this.programTimersStack=null);let i={uploadWaitMs:this.uploadWaitMs,downloadWaitMs:this.downloadWaitMs,kernelMs:null,wallMs:null},p=await Promise.all(s);return i.kernelMs=x.sum(p),i.getExtraProfileInfo=()=>p.map((u,c)=>({name:a[c],ms:u})).map(u=>`${u.name}: ${u.ms}`).join(\", \"),this.uploadWaitMs=0,this.downloadWaitMs=0,i}makeTensorInfo(e,t,o){return t===\"string\"&&o!=null&&o.length>0&&x.isString(o[0])&&(o=o.map(s=>x.encodeString(s))),{dataId:this.write(o,e,t),shape:e,dtype:t}}tensorToBinding(e){if(!e)return null;let t=this.tensorMap.get(e.dataId);if(\"texture\"in t.resourceInfo){let n=t.resourceInfo;return n.texture instanceof GPUExternalTexture?n.texture:n.texture.createView()}let o=t.resourceInfo;return{offset:0,size:o.size,buffer:o.buffer}}async getQueryTime(e){return this.supportTimeQuery?this.getTimeFromQuerySet(e):0}uploadToGPU(e){let t=this.tensorMap.get(e);if(t.resourceInfo)return;let o=iS(t.dtype)*x.sizeFromShape(t.shape),n=this.bufferManager.acquireBuffer(o,this.defaultGpuBufferUsage());if(t.resourceInfo={size:o,usage:this.defaultGpuBufferUsage(),buffer:n},t.values){let s=this.bufferManager.acquireUploadBuffer(o,GPUBufferUsage.MAP_WRITE|GPUBufferUsage.COPY_SRC),a=s.getMappedRange();t.dtype===\"int32\"||t.dtype===\"bool\"?new Int32Array(a).set(t.values):new Float32Array(a).set(t.values),s.unmap(),this.ensureCommandEncoderReady(),this.ensureComputePassEnded(),this.currentCommandEncoder.copyBufferToBuffer(s,0,n,0,o);let i={size:o,usage:GPUBufferUsage.MAP_WRITE|GPUBufferUsage.COPY_SRC,buffer:s};this.stagingPendingDisposal.push(i)}}makeUniforms(e){let t=0,o=0,n=[];e.forEach(p=>{p.data.length===0&&(p.data=[1]);let u;switch(p.data.length){case 1:u=4;break;case 2:u=8;break;case 3:u=16;break;case 4:u=16;break;case 5:u=16;break;case 6:u=16;break;default:x.assert(!1,()=>`Unsupported ${p.data.length}D shape`)}(o===5||o===6)&&(u=16),t=Math.ceil(t/u)*u,o=p.data.length,n.push(t),t+=p.data.length*4});let s=new ArrayBuffer(t);e.forEach((p,u)=>{let c=n[u];p.type===\"int32\"?new Int32Array(s,c,p.data.length).set(p.data):p.type===\"uint32\"?new Uint32Array(s,c,p.data.length).set(p.data):new Float32Array(s,c,p.data.length).set(p.data)});let a=this.bufferManager.acquireBuffer(t,GPUBufferUsage.COPY_DST|GPUBufferUsage.UNIFORM);this.queue.writeBuffer(a,0,s,0,t);let i={size:t,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.UNIFORM,buffer:a};return this.uniformPendingDisposal.push(i),{offset:0,size:t,buffer:a}}runWebGPUProgram(e,t,o,n,s){if(s||(s=this.makeTensorInfo(e.outputShape,o)),x.sizeFromShape(s.shape)===0)return this.tensorMap.get(s.dataId).values=x.getTypedArrayFromDType(s.dtype,0),s;this.uploadToGPU(s.dataId),e.dispatch=yte(this.device,e);let a=[],i=[];if(!e.isFromPixels){a.push({type:\"float32\",data:[NaN]}),i=t.concat(s).map(y=>y.shape);let h=\"int32\";i.map(y=>{a.push({type:h,data:y})});let g=x.computeStrides(s.shape);if(a.push({type:h,data:g}),e.size){let y=x.sizeFromShape(e.outputShape);a.push({type:h,data:[e.isVec4?y/4:y]})}}let p=t.map((h,g)=>{if(h.dtype===\"complex64\")throw new Error(\"GPGPUProgram does not support complex64 input. For complex64 dtypes, please separate the program into real and imaginary parts.\");return this.uploadToGPU(h.dataId),{dtype:this.tensorMap.get(h.dataId).dtype,shape:h.shape,name:e.variableNames[g]}}),u=J3(e,i,p,s),c;u in this.pipelineCache?c=this.pipelineCache[u]:(c=Z3(this.device,e,p,s),this.pipelineCache[u]=c),n&&(a=[...a,...n]);let l=[this.tensorToBinding(s),...t.map(h=>this.tensorToBinding(h)),this.makeUniforms(a)],m=this.device.createBindGroup({layout:c.getBindGroupLayout(0),entries:l.map((h,g)=>({binding:g,resource:h}))});this.ensureCommandEncoderReady();let f=this.getComputePass(),d=this.activeTimers!=null;return d&&this.supportTimeQuery&&f.writeTimestamp(this.querySet,0),f.setPipeline(c),f.setBindGroup(0,m),f.dispatchWorkgroups(e.dispatch[0],e.dispatch[1],e.dispatch[2]),d&&this.supportTimeQuery&&f.writeTimestamp(this.querySet,1),this.dispatchNumberInEncoder++,t.forEach(h=>{this.commandQueueOwnedIds.add(h.dataId)}),this.commandQueueOwnedIds.add(s.dataId),P().get(\"WEBGPU_DEFERRED_SUBMIT_BATCH_SIZE\")<=this.dispatchNumberInEncoder&&this.submitQueue(),d&&this.activeTimers.push({name:e.constructor.name,query:this.getQueryTime(this.querySet)}),s}async getTimeFromQuerySet(e){let t=this.bufferManager.acquireBuffer(16,GPUBufferUsage.COPY_SRC|GPUBufferUsage.QUERY_RESOLVE),o=this.bufferManager.acquireBuffer(16,GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST);this.ensureCommandEncoderReady(),this.ensureComputePassEnded(),this.currentCommandEncoder.resolveQuerySet(e,0,2,t,0),this.currentCommandEncoder.copyBufferToBuffer(t,0,o,0,16),this.submitQueue(),await o.mapAsync(GPUMapMode.READ);let n=new BigUint64Array(o.getMappedRange()),s=Number(n[1]-n[0]);return o.unmap(),this.bufferManager.releaseBuffer(o,16,GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST),this.bufferManager.releaseBuffer(t,16,GPUBufferUsage.COPY_SRC|GPUBufferUsage.QUERY_RESOLVE),s/1e6}shouldExecuteOnCPU(e,t=xte){return P().getBool(\"WEBGPU_CPU_FORWARD\")&&e.every(o=>this.tensorMap.get(o.dataId).resourceInfo==null&&x.sizeFromShape(o.shape){P().set(\"CHECK_COMPUTATION_FOR_ERRORS\",!1);let r={powerPreference:P().get(\"WEBGPU_USE_LOW_POWER_GPU\")?\"low-power\":\"high-performance\"},e=await navigator.gpu.requestAdapter(r),t=e.limits,o={},n=e.features.has(\"timestamp-query\");o.requiredLimits={maxComputeWorkgroupStorageSize:t.maxComputeWorkgroupStorageSize,maxComputeWorkgroupsPerDimension:t.maxComputeWorkgroupsPerDimension,maxStorageBufferBindingSize:t.maxStorageBufferBindingSize},n&&(o.requiredFeatures=[\"timestamp-query\"]);let s=await e.requestDevice(o),a=await e.requestAdapterInfo();return new Ai(s,a)},3);var ye;(function(r){r[r.MUL=0]=\"MUL\",r[r.ADD=1]=\"ADD\",r[r.ATAN2=2]=\"ATAN2\",r[r.SUB=3]=\"SUB\",r[r.DIV=4]=\"DIV\",r[r.EQUAL=5]=\"EQUAL\",r[r.GREATER=6]=\"GREATER\",r[r.GREATER_EQUAL=7]=\"GREATER_EQUAL\",r[r.LESS=8]=\"LESS\",r[r.LESS_EQUAL=9]=\"LESS_EQUAL\",r[r.LOGICAL_AND=10]=\"LOGICAL_AND\",r[r.NOT_EQUAL=11]=\"NOT_EQUAL\",r[r.SQUARED_DIFFERENCE=12]=\"SQUARED_DIFFERENCE\",r[r.INT_DIV=13]=\"INT_DIV\",r[r.POW=14]=\"POW\",r[r.PRELU=15]=\"PRELU\",r[r.MAX=16]=\"MAX\",r[r.MIN=17]=\"MIN\",r[r.COMPLEX_MULTIPLY_REAL=18]=\"COMPLEX_MULTIPLY_REAL\",r[r.COMPLEX_MULTIPLY_IMAG=19]=\"COMPLEX_MULTIPLY_IMAG\"})(ye||(ye={}));var bte=`\n if (isnan(a)) { return a; }\n if (isnan(b)) { return b; }\n `,tM=`\n if (isNaN.r) {\n resultTemp.r = valueForNaN;\n }\n if (isNaN.g) {\n resultTemp.g = valueForNaN;\n }\n if (isNaN.b) {\n resultTemp.b = valueForNaN;\n }\n if (isNaN.a) {\n resultTemp.a = valueForNaN;\n }\n `,rM=`\n let isNaN = isnanVec4(a) | isnanVec4(b);\n ${tM}\n `,Cte=\"return a + b;\",Ite=\"return areal * breal - aimag * bimag;\",wte=\"return areal * bimag + aimag * breal;\",Ste=\"return a / b;\",vte=\"return a * b;\",kte=\"return (a - b) * (a - b);\",Tte=\"return a - b;\",Nte=\"return f32(a == b);\",_te=\"return vec4(a == b);\",Ete=\"return f32(a > b);\",$te=\"return vec4(a > b);\",Rte=\"return f32(a >= b);\",Ate=\"return vec4(a >= b);\",Fte=\"return f32(a < b);\",Dte=\"return vec4(a < b);\",Pte=\"return f32(a <= b);\",Ote=\"return vec4(a <= b);\",Mte=\"return f32(f32(a) >= 1.0 && f32(b) >= 1.0);\",Lte=`return (vec4(a >= vec4(1.0)) *\n vec4(b >= vec4(1.0)));`,Bte=`\n let s = sign(a) * sign(b);\n let ia = i32(round(a));\n let ib = i32(round(b));\n return f32(idiv(ia, ib, s));\n `,Vte=`\n let ia = vec4(round(a));\n let ib = vec4(round(b));\n let cond = ib != vec4(0);\n var resultTemp = vec4(0);\n let s = sign(a) * sign(b);\n\n // Windows (D3D) wants guaranteed non-zero int division at compile-time.\n if (cond[0]) {\n resultTemp[0] = idiv(ia[0], ib[0], s[0]);\n }\n if (cond[1]) {\n resultTemp[1] = idiv(ia[1], ib[1], s[1]);\n }\n if (cond[2]) {\n resultTemp[2] = idiv(ia[2], ib[2], s[2]);\n }\n if (cond[3]) {\n resultTemp[3] = idiv(ia[3], ib[3], s[3]);\n }\n return vec4(resultTemp);\n `,zte=`\n if (isnan(a) || isnan(b)) {\n return 1.0;\n }\n return f32(a != b);\n`,Wte=`\n var resultTemp = vec4(a != b);\n let valueForNaN = 1.0;\n ${rM}\n\n return resultTemp;\n`,Ute=`\n if(a < 0.0 && floor(b) < b) {\n return uniforms.NAN;\n }\n if (b == 0.0) {\n return 1.0;\n }\n if (round(abs(b) % 2.0) != 1.0) {\n return pow(abs(a), b);\n }\n return sign(a) * pow(abs(a), b);\n `,Gte=`\n let isModRound1Bool = vec4(round(abs(b) % vec4(2.0))) == vec4(1);\n let isModRound1 = vec4(isModRound1Bool);\n let multiplier = sign(a) * isModRound1 + (vec4(1.0) - isModRound1);\n var resultTemp = multiplier * pow(abs(a), b);\n\n // Ensure that a^0 = 1, including 0^0 = 1 as this correspond to TF and JS\n let isExpZero = b == vec4(0.0);\n if (isExpZero.r) {\n resultTemp.r = 1.0;\n }\n if (isExpZero.g) {\n resultTemp.g = 1.0;\n }\n if (isExpZero.b) {\n resultTemp.b = 1.0;\n }\n if (isExpZero.a) {\n resultTemp.a = 1.0;\n }\n let isNaN = (a < vec4(0.0)) & (floor(b) < b);\n let valueForNaN = uniforms.NAN;\n ${tM}\n return resultTemp;\n `,Hte=\"if (a < 0.0) { return b * a; } return a;\",qte=`\n let aLessThanZero = vec4(a < vec4(0.0));\n return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a);\n `;function cS(r,e,t=\"uniforms.NAN\"){let o=e?rM:bte;return e?`\n let valueForNaN = ${t};\n var resultTemp = vec4(${r}(a, b));\n `+o+`\n return resultTemp;\n `:o+`\n return ${r}(a, b);\n `}function Nc(r,e){switch(r){case ye.MUL:return vte;case ye.ADD:return Cte;case ye.ATAN2:return cS(\"atan2\",e);case ye.SUB:return Tte;case ye.DIV:return Ste;case ye.EQUAL:return e?_te:Nte;case ye.GREATER:return e?$te:Ete;case ye.GREATER_EQUAL:return e?Ate:Rte;case ye.LESS:return e?Dte:Fte;case ye.LESS_EQUAL:return e?Ote:Pte;case ye.LOGICAL_AND:return e?Lte:Mte;case ye.NOT_EQUAL:return e?Wte:zte;case ye.SQUARED_DIFFERENCE:return kte;case ye.INT_DIV:return e?Vte:Bte;case ye.PRELU:return e?qte:Hte;case ye.MAX:return cS(\"max\",e);case ye.MIN:return cS(\"min\",e);case ye.POW:return e?Gte:Ute;case ye.COMPLEX_MULTIPLY_REAL:return Ite;case ye.COMPLEX_MULTIPLY_IMAG:return wte;default:throw new Error(`BinaryType ${r} is not implemented!`)}}var pe;(function(r){r[r.ABS=0]=\"ABS\",r[r.CEIL=1]=\"CEIL\",r[r.COS=2]=\"COS\",r[r.COSH=3]=\"COSH\",r[r.ELU=4]=\"ELU\",r[r.EXP=5]=\"EXP\",r[r.EXPM1=6]=\"EXPM1\",r[r.FLOOR=7]=\"FLOOR\",r[r.IS_NAN=8]=\"IS_NAN\",r[r.LINEAR=9]=\"LINEAR\",r[r.LOG=10]=\"LOG\",r[r.LOGICAL_NOT=11]=\"LOGICAL_NOT\",r[r.NEG=12]=\"NEG\",r[r.RELU=13]=\"RELU\",r[r.RELU6=14]=\"RELU6\",r[r.LEAKYRELU=15]=\"LEAKYRELU\",r[r.RECIPROCAL=16]=\"RECIPROCAL\",r[r.RSQRT=17]=\"RSQRT\",r[r.SIN=18]=\"SIN\",r[r.SINH=19]=\"SINH\",r[r.SIGMOID=20]=\"SIGMOID\",r[r.SQRT=21]=\"SQRT\",r[r.SQUARE=22]=\"SQUARE\",r[r.TANH=23]=\"TANH\",r[r.TO_INT=24]=\"TO_INT\"})(pe||(pe={}));var Kte=\"return abs(a);\",jte=\"return ceil(a);\",Xte=\"return cos(a);\",Yte=`\n let e2x = exp(-a);\n return (e2x + 1.0 / e2x) / 2.0;\n`,Qte=\"return exp(a) - 1.0;\",Zte=\"if (a >= 0.0) { return a; } return (exp(a) - 1.0);\",Jte=`\n var resFloat = exp(a) - vec4(1.0);\n if (a.r >= 0.0) {\n resFloat.r = a.r;\n }\n if (a.g >= 0.0) {\n resFloat.g = a.g;\n }\n if (a.b >= 0.0) {\n resFloat.b = a.b;\n }\n if (a.a >= 0.0) {\n resFloat.a = a.a;\n }\n return resFloat;\n`,ere=\"return exp(a);\",tre=\"return floor(a);\",rre=\"return f32(isnan(a));\",ore=\"return a;\",nre=`if (a < 0.0) { return uniforms.NAN; }\n return log(a);`,sre=\"return f32(!(a >= 1.0));\",are=\"return -a;\",ire=\"if (a < 0.0) { return uniforms.alpha * a; } return a;\",ure=`\n let aLessThanZero = vec4(a < vec4(0.0));\n return (aLessThanZero * (uniforms.alpha * a)) + ((vec4(1.0) - aLessThanZero) * a);\n`,pre=\"return 1.0 / a;\",cre=\"return select(a, 0.0, a < 0.0);\",lre=\"return clamp(a, 0.0, 6.0);\",mre=\"return clamp(a, vec4(0.0, 0.0, 0.0, 0.0), vec4(6.0, 6.0, 6.0, 6.0));\",fre=`\n return select(a, vec4(0.0), a < vec4(0.0));\n`,dre=\"return 1.0/sqrt(a);\",hre=\"return 1.0 / (1.0 + exp(-1.0 * a));\",gre=\"return sin(a);\",xre=`\n let e2x = exp(a);\n return (e2x - 1.0 / e2x) / 2.0;\n`,yre=\"return sqrt(a);\",bre=\"return a * a;\",Cre=`\n let e2x = exp(-2.0 * abs(a));\n return sign(a) * (1.0 - e2x) / (1.0 + e2x);\n`,Ire=\"return f32(i32((a)));\";function za(r,e){switch(r){case pe.ABS:return Kte;case pe.COS:return Xte;case pe.COSH:return Yte;case pe.CEIL:return jte;case pe.ELU:return e?Jte:Zte;case pe.EXP:return ere;case pe.EXPM1:return Qte;case pe.FLOOR:return tre;case pe.IS_NAN:return rre;case pe.LINEAR:return ore;case pe.LOG:return nre;case pe.LOGICAL_NOT:return sre;case pe.NEG:return are;case pe.LEAKYRELU:return e?ure:ire;case pe.RECIPROCAL:return pre;case pe.RELU:return e?fre:cre;case pe.RELU6:return e?mre:lre;case pe.RSQRT:return dre;case pe.SIGMOID:return hre;case pe.SIN:return gre;case pe.SINH:return xre;case pe.SQRT:return yre;case pe.SQUARE:return bre;case pe.TANH:return Cre;case pe.TO_INT:return Ire;default:throw new Error(`BinaryType ${r} is not implemented!`)}}var vt=r=>{switch(r){case 1:return\"f32\";case 2:return\"vec2\";case 3:return\"vec3\";case 4:return\"vec4\";default:throw new Error(`${r}-component is not supported.`)}};function ur(r,e=!1,t=!1,o=3){if(r===null)return\"\";let n=\"\";if(r===\"linear\")n=za(pe.LINEAR);else if(r===\"relu\")n=za(pe.RELU,t);else if(r===\"elu\")n=za(pe.ELU,t);else if(r===\"relu6\")n=za(pe.RELU6,t);else if(r===\"prelu\")n=Nc(ye.PRELU,t);else if(r===\"sigmoid\")n=za(pe.SIGMOID,t);else if(r===\"leakyrelu\")n=za(pe.LEAKYRELU,t);else throw new Error(`Activation ${r} has not been implemented for the WebGPU backend.`);let a=vt(t?4:1),i=\"\";return e?i=`\n fn activation(a : ${a}, coords : vec${o}) -> ${a} {\n let b = getPreluActivationWeightsByOutputCoords(coords);\n ${n}\n }`:i=`\n fn activation(a : ${a}, coords : vec${o}) -> ${a} {\n ${n}\n }`,i}function Kr(r,e){return`\n ${r?\"value = value + getBiasByOutputCoords(coords);\":\"\"}\n ${e?\"value = activation(value, coords);\":\"\"}\n `}function lS(r,e,t,o,n=!1,s=!1,a=!1,i=1){x.assert(t&&i===1||!t,()=>`transposeA ${t} is not compatible with component size ${i}`);let p=`\n let batch = ${r?\"0\":\"batchIn\"};\n ${t?\"value = getA(batch, col, row);\":\"value = getA(batch, row, col);\"}\n\n `,u=o?\"value = getB(batch, col, row);\":\"value = getB(batch, row, col);\";return`\n fn mm_readA(batchIn: i32, row: i32, colIn: i32) -> ${vt(i)} {\n var value = ${vt(i)}(0.0);\n let col = colIn * ${i};\n ${n&&a?p:`\n ${t?\"if(row < uniforms.dimAOuter && col < uniforms.dimInner)\":\"if(row < uniforms.aShape[1] && col < uniforms.aShape[2])\"}\n {\n ${p}\n }\n `}\n return value;\n }\n\n fn mm_readB(batchIn: i32, row: i32, colIn: i32) -> ${vt(i)} {\n let col = colIn * ${i};\n let batch = ${e?\"0\":\"batchIn\"};\n var value = ${vt(i)}(0.0);\n ${u}\n return value;\n }\n `}function jl(r,e,t,o,n,s,a=!1,i=!1,p=!1,u=1){return`\n ${lS(t,o,n,s,a,i,p,u)}\n fn mm_write(batch: i32, row: i32, colIn: i32, valueIn: ${vt(u)}) {\n let col = colIn * ${u};\n ${a&&i?\"\":\"if (row < uniforms.dimAOuter && col < uniforms.dimBOuter)\"}\n {\n var value = valueIn;\n let coords = vec3(batch, row, col);\n ${Kr(r,e)}\n setOutputAtCoords(coords[0], coords[1], coords[2], value);\n }\n }\n `}var wre=r=>r?`\n mm_Asub[inputRow][inputCol] = mm_readA(batch,\n kStart + inputRow,\n globalRowStart / InnerElementSize + inputCol);\n `:`\n mm_Asub[inputRow][inputCol] = mm_readA(batch,\n globalRow + innerRow,\n kStart / InnerElementSize + inputCol);\n `,Sre=(r,e)=>r?`\n let ACached0 = mm_Asub[k * InnerElementSize][localRow];\n let ACached1 = mm_Asub[k * InnerElementSize + 1][localRow];\n let ACached2 = mm_Asub[k * InnerElementSize + 2][localRow];\n ${e===3?\"\":\"let ACached3 = mm_Asub[k * InnerElementSize + 3][localRow];\"}\n for (var i = 0; i < RowPerThread; i = i + 1) {\n acc[i] = BCached0 * ACached0[i] + acc[i];\n acc[i] = BCached1 * ACached1[i] + acc[i];\n acc[i] = BCached2 * ACached2[i] + acc[i];\n ${e===3?\"\":\"acc[i] = BCached3 * ACached3[i] + acc[i];\"}\n }`:`\n for (var i = 0; i < RowPerThread; i = i + 1) {\n let ACached = mm_Asub[tileRow + i][k];\n acc[i] = BCached0 * ACached.x + acc[i];\n acc[i] = BCached1 * ACached.y + acc[i];\n acc[i] = BCached2 * ACached.z + acc[i];\n ${e===3?\"\":\"acc[i] = BCached3 * ACached.w + acc[i];\"}\n }`;function Uu(r,e,t=!1,o=32,n=!1,s=32,a=!1){let i=e[1]*r[1],p=e[0]*r[0],u=t?i:o,c=t?o:i,l=u/e[0],m=o/e[1];return x.assert((t&&l===4&&r[1]===4||!t&&(l===3||l===4))&&u%e[0]===0&&o%e[1]===0&&r[0]===4,()=>`If transposeA ${t} is true, innerElementSize ${l} and workPerThread[1] ${r[1]} must be 4.\n Otherwise, innerElementSize ${l} must be 3 or 4.\n tileAWidth ${u} must be divisible by workGroupSize[0]${e[0]}. tileInner ${o} must be divisible by workGroupSize[1] ${e[1]}. ColPerThread ${r[0]} must be 4.`),`\n var mm_Asub : array, ${u/l}>, ${c}>;\n var mm_Bsub : array, ${p/r[0]}>, ${o}>;\n\n const RowPerThread = ${r[1]};\n const ColPerThread = ${r[0]};\n const InnerElementSize = ${l};\n const TileInner = ${o};\n\n @compute @workgroup_size(workGroupSizeX, workGroupSizeY, workGroupSizeZ)\n fn _start(@builtin(local_invocation_id) LocalId : vec3,\n @builtin(global_invocation_id) GlobalId : vec3,\n @builtin(num_workgroups) NumWorkgroups: vec3,\n @builtin(workgroup_id) workgroupId: vec3) {\n localId = LocalId;\n globalId = GlobalId;\n numWorkgroups = NumWorkgroups;\n\n let localRow = i32(localId.y);\n let tileRow = ${a?\"0\":\"localRow * RowPerThread\"};\n let tileCol = i32(localId.x);\n\n let globalRow = ${a?\"0\":\"i32(globalId.y) * RowPerThread\"};\n let globalCol = i32(globalId.x);\n let batch = ${n?\"0\":\"i32(globalId.z)\"};\n let globalRowStart = i32(workgroupId.y) * ${i};\n\n let numTiles = ${n?`${Math.ceil(s/o)}`:\"(uniforms.dimInner - 1) / TileInner + 1\"};\n var kStart = ${n?`i32(globalId.z) * ${s}`:\"0\"};\n\n var acc: array, RowPerThread>;\n\n // Loop over shared dimension.\n let tileRowB = localRow * ${m};\n for (var t = 0; t < numTiles; t = t + 1) {\n // Load one tile of A into local memory.\n for (var innerRow = 0; innerRow < RowPerThread; innerRow = innerRow + 1) {\n let inputRow = tileRow + innerRow;\n let inputCol = tileCol;\n ${wre(t)}\n }\n\n // Load one tile of B into local memory.\n for (var innerRow = 0; innerRow < ${m}; innerRow = innerRow + 1) {\n let inputRow = tileRowB + innerRow;\n let inputCol = tileCol;\n mm_Bsub[inputRow][inputCol] = mm_readB(batch, kStart + inputRow, globalCol);\n }\n kStart = kStart + TileInner;\n workgroupBarrier();\n\n // Compute acc values for a single thread.\n for (var k = 0; k < TileInner / InnerElementSize; k = k + 1) {\n let BCached0 = mm_Bsub[k * InnerElementSize][tileCol];\n let BCached1 = mm_Bsub[k * InnerElementSize + 1][tileCol];\n let BCached2 = mm_Bsub[k * InnerElementSize + 2][tileCol];\n ${l===3?\"\":\"let BCached3 = mm_Bsub[k * InnerElementSize + 3][tileCol];\"}\n\n ${Sre(t,l)}\n }\n\n workgroupBarrier();\n }\n\n for (var innerRow = 0; innerRow < RowPerThread; innerRow = innerRow + 1) {\n mm_write(batch, globalRow + innerRow, globalCol, acc[innerRow]);\n }\n }`}var oM=r=>r?`\n mm_Asub[inputRow][inputCol] = mm_readA(batch,\n kStart + inputRow,\n globalRowStart + inputCol);\n `:`\n mm_Asub[inputRow][inputCol] = mm_readA(batch,\n globalRowStart + inputRow,\n kStart + inputCol);\n `,vre=r=>r?\"let ACached = mm_Asub[k][tileRow + innerRow];\":\"let ACached = mm_Asub[tileRow + innerRow][k];\";function Gu(r,e,t=!1,o=32,n=!1,s=32,a=!1){let i=r[1]*e[1],p=r[0]*e[0],u=t?i:o,c=t?o:i;x.assert(c%e[1]===0&&u%e[0]===0&&o%e[1]===0,()=>`tileAHight ${c} must be divisible by workGroupSize[1]${e[1]}, tileAWidth ${u} must be divisible by workGroupSize[0]${e[0]}, tileInner ${o} must be divisible by workGroupSize[1]${e[1]}`);let l=c/e[1],m=u/e[0],f=o/e[1],d=a?`\n let localRow = i32(localId.y);\n let localCol = i32(localId.x);\n let globalRowStart = i32(workgroupId.y) * ${i};\n let globalColStart = i32(workgroupId.x) * ${p};\n\n // Loop over shared dimension.\n for (var t = 0; t < numTiles; t = t + 1) {\n // Load one tile of A into local memory.\n for (var inputRow = localRow; inputRow < ${c}; inputRow = inputRow + ${e[1]}) {\n for (var inputCol = localCol; inputCol < ${u}; inputCol = inputCol + ${e[0]}) {\n ${oM(t)}\n }\n }\n // Load one tile of B into local memory.\n for (var inputRow = localRow; inputRow < ${o}; inputRow = inputRow + ${e[1]}) {\n for (var inputCol = localCol; inputCol < ${p}; inputCol = inputCol + ${e[0]}) {\n mm_Bsub[inputRow][inputCol] = mm_readB(batch,\n kStart + inputRow,\n globalColStart + inputCol);\n }\n }\n kStart = kStart + TileInner;\n workgroupBarrier();\n\n // Compute acc values for a single thread.\n var BCached : array;\n for (var k = 0; k < TileInner; k = k + 1) {\n for (var inner = 0; inner < ColPerThread; inner = inner + 1) {\n BCached[inner] = mm_Bsub[k][localCol + inner * ${e[0]}];\n }\n for (var innerRow = 0; innerRow < RowPerThread; innerRow = innerRow + 1) {\n let ACached = ${t?`mm_Asub[k][localRow + innerRow * ${e[1]}];`:`mm_Asub[localRow + innerRow * ${e[1]}][k];`}\n for (var innerCol = 0; innerCol < ColPerThread; innerCol = innerCol + 1) {\n acc[innerRow][innerCol] = acc[innerRow][innerCol] +\n ACached * BCached[innerCol];\n }\n }\n }\n workgroupBarrier();\n }\n for (var innerRow = 0; innerRow < RowPerThread; innerRow = innerRow + 1) {\n let gRow = globalRowStart + localRow + innerRow * ${e[1]};\n for (var innerCol = 0; innerCol < ColPerThread; innerCol = innerCol + 1) {\n let gCol = globalColStart + localCol + innerCol * ${e[0]};\n mm_write(batch, gRow, gCol, acc[innerRow][innerCol]);\n }\n }\n `:`\n let tileRow = i32(localId.y) * RowPerThread;\n let tileCol = i32(localId.x) * ColPerThread;\n\n let globalRow = i32(globalId.y) * RowPerThread;\n let globalCol = i32(globalId.x) * ColPerThread;\n let globalRowStart = i32(workgroupId.y) * ${i};\n\n let tileRowA = i32(localId.y) * ${l};\n let tileColA = i32(localId.x) * ${m};\n let tileRowB = i32(localId.y) * ${f};\n // Loop over shared dimension.\n for (var t = 0; t < numTiles; t = t + 1) {\n // Load one tile of A into local memory.\n for (var innerRow = 0; innerRow < ${l}; innerRow = innerRow + 1) {\n for (var innerCol = 0; innerCol < ${m}; innerCol = innerCol + 1) {\n let inputRow = tileRowA + innerRow;\n let inputCol = tileColA + innerCol;\n ${oM(t)}\n }\n }\n\n // Load one tile of B into local memory.\n for (var innerRow = 0; innerRow < ${f}; innerRow = innerRow + 1) {\n for (var innerCol = 0; innerCol < ColPerThread; innerCol = innerCol + 1) {\n let inputRow = tileRowB + innerRow;\n let inputCol = tileCol + innerCol;\n mm_Bsub[inputRow][inputCol] = mm_readB(batch,\n kStart + inputRow,\n globalCol + innerCol);\n }\n }\n kStart = kStart + TileInner;\n workgroupBarrier();\n\n // Compute acc values for a single thread.\n var BCached : array;\n for (var k = 0; k < TileInner; k = k + 1) {\n for (var inner = 0; inner < ColPerThread; inner = inner + 1) {\n BCached[inner] = mm_Bsub[k][tileCol + inner];\n }\n\n for (var innerRow = 0; innerRow < RowPerThread; innerRow = innerRow + 1) {\n ${vre(t)}\n for (var innerCol = 0; innerCol < ColPerThread; innerCol = innerCol + 1) {\n acc[innerRow][innerCol] = acc[innerRow][innerCol] + ACached * BCached[innerCol];\n }\n }\n }\n\n workgroupBarrier();\n }\n\n for (var innerRow = 0; innerRow < RowPerThread; innerRow = innerRow + 1) {\n for (var innerCol = 0; innerCol < ColPerThread; innerCol = innerCol + 1) {\n mm_write(batch, globalRow + innerRow, globalCol + innerCol,\n acc[innerRow][innerCol]);\n }\n }\n `;return`\n var mm_Asub : array, ${c}>;\n var mm_Bsub : array, ${o}>;\n const RowPerThread = ${r[1]};\n const ColPerThread = ${r[0]};\n const TileInner = ${o};\n\n @compute @workgroup_size(workGroupSizeX, workGroupSizeY, workGroupSizeZ)\n fn _start(@builtin(local_invocation_id) LocalId : vec3,\n @builtin(global_invocation_id) GlobalId : vec3,\n @builtin(num_workgroups) NumWorkgroups: vec3,\n @builtin(workgroup_id) workgroupId: vec3) {\n localId = LocalId;\n globalId = GlobalId;\n numWorkgroups = NumWorkgroups;\n\n let batch = ${n?\"0\":\"i32(globalId.z)\"};\n let numTiles = ${n?`${Math.ceil(s/o)}`:\"(uniforms.dimInner - 1) / TileInner + 1\"};\n var kStart = ${n?`i32(globalId.z) * ${s}`:\"0\"};\n\n var acc : array, RowPerThread>;\n\n // Without this initialization strange values show up in acc.\n for (var innerRow = 0; innerRow < RowPerThread; innerRow = innerRow + 1) {\n for (var innerCol = 0; innerCol < ColPerThread; innerCol = innerCol + 1) {\n acc[innerRow][innerCol] = 0.0;\n }\n }\n ${d}\n }\n `}var kre=r=>r?`\n mm_readA(batch, colA, globalRow),\n mm_readA(batch, colA + 1, globalRow),\n mm_readA(batch, colA + 2, globalRow),\n mm_readA(batch, colA + 3, globalRow)\n `:`\n mm_readA(batch, globalRow, colA),\n mm_readA(batch, globalRow, colA + 1),\n mm_readA(batch, globalRow, colA + 2),\n mm_readA(batch, globalRow, colA + 3)\n `;function Tre(r,e=!1){return x.assert(r[1]===1&&r[2]===1,()=>`A linear work group size is required. But got ${r}.`),`\n const TileSize = ${r[0]*4};\n var mm_Asub : array, ${r[0]}>;\n\n ${ue()} {\n let tileCol = i32(localId.x);\n let globalCol = i32(globalId.x);\n let globalRow = i32(globalId.y);\n\n let numTiles = (uniforms.dimInner - 1) / TileSize + 1;\n let batch = i32(globalId.z);\n // Without this initialization strange values show up in acc.\n var acc = 0.0;\n\n // Loop over shared dimension.\n for (var t = 0; t < numTiles; t = t + 1) {\n // Load one tile of A into local memory.\n let colA = t * TileSize + tileCol * 4;\n mm_Asub[tileCol] = vec4(${kre(e)});\n workgroupBarrier();\n\n // Compute acc values for a single thread.\n for (var k = 0; k < TileSize / 4; k = k + 1) {\n let rowB = t * TileSize + k * 4;\n let BCached = vec4(mm_readB(batch, rowB, globalCol),\n mm_readB(batch, rowB + 1, globalCol),\n mm_readB(batch, rowB + 2, globalCol),\n mm_readB(batch, rowB + 3, globalCol));\n\n let ACached = mm_Asub[k];\n acc = acc + dot(ACached, BCached);\n }\n\n workgroupBarrier();\n }\n\n mm_write(batch, globalRow, globalCol, acc);\n }\n `}var Bg=class{constructor(e,t,o,n,s=!1,a=!1,i=null,p=null,u=null,c=!1){this.variableNames=[\"A\",\"B\"],this.uniforms=\"dimAOuter : i32, dimBOuter : i32, dimInner : i32,\",this.outputShape=t,this.dispatchLayout={x:[2],y:[1],z:[0]};let l=s?e[1]:e[2];if(this.isVec4=(l%4===0&&!s||t[1]%4===0&&s)&&t[2]%4===0&&!a,this.isVectorA=t[1]===1&&!s,!this.isVec4&&this.isVectorA)this.elementsPerThread=[1,1,1],this.workGroupSize=[32,1,1];else{let d=aS(t[1],l,t[2],s);this.workGroupSize=d.workGroupSize,this.elementsPerThread=d.elementsPerThread}this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize,this.elementsPerThread);let m=i!=null,f=u!=null;m&&this.variableNames.push(\"bias\"),f&&this.variableNames.push(\"preluActivationWeights\"),this.sequentialAccessByThreads=c,this.transposeA=s,this.transposeB=a,this.addBias=m,this.activation=p,this.hasPreluActivationWeights=f,this.batchAEqualOne=o,this.batchBEqualOne=n,[this.fitAOuter,this.fitBOuter,this.fitInner]=this.getShapeFit(t[1],t[2],l),this.shaderKey=`matMulPacked_${this.elementsPerThread}_${s}_${a}_${this.activation}_${this.fitAOuter}_${this.fitBOuter}_${this.fitInner}_${this.isVec4}_${this.isVectorA}_${this.batchAEqualOne}_${this.batchBEqualOne}_${this.sequentialAccessByThreads}`}getShapeFit(e,t,o){let n=this.workGroupSize[1]*this.elementsPerThread[1],s=this.workGroupSize[0]*this.elementsPerThread[0];!this.isVec4&&this.isVectorA?this.tileInner=this.workGroupSize[0]*4:this.tileInner=s;let a=e%n===0,i=t%s===0,p=o%this.tileInner===0;return[a,i,p]}getUserCode(){return`\n ${ur(this.activation,this.hasPreluActivationWeights,this.isVec4)}\n ${jl(this.addBias,this.activation,this.batchAEqualOne,this.batchBEqualOne,!1,this.transposeB,this.fitAOuter,this.fitBOuter,this.fitInner,this.isVec4?4:1)}\n ${this.isVec4?Uu(this.elementsPerThread,this.workGroupSize,this.transposeA,this.tileInner,!1,null,this.isVectorA):this.isVectorA?Tre(this.workGroupSize,this.transposeA):Gu(this.elementsPerThread,this.workGroupSize,this.transposeA,this.tileInner,!1,null,this.sequentialAccessByThreads)}\n `}};function Nre(){return`\n var sumValues : array;\n ${ue()} {\n let coords = getOutputCoords();\n let batch = coords[0];\n let row = coords[1];\n let col = coords[2];\n var sum = 0.0;\n let Length = uniforms.dimInner;\n for (var k = i32(localId.x); k < Length; k = k + i32(workGroupSizeX)) {\n let dataA = mm_readA(batch, row, k);\n let dataB = mm_readB(batch, k, col);\n sum = sum + dataA * dataB;\n }\n sumValues[localId.x] = sum;\n workgroupBarrier();\n\n for(var currentSize = workGroupSizeX / 2u; currentSize > 1u;\n currentSize = currentSize / 2u) {\n if (localId.x < currentSize)\n {\n sumValues[localId.x] = sumValues[localId.x] + sumValues[localId.x + currentSize];\n }\n workgroupBarrier();\n }\n\n if (localId.x == 0u) {\n sum = sumValues[0] + sumValues[1];\n mm_write(batch, row, col, sum);\n }\n }\n `}var Vg=class{constructor(e,t,o,n=!1,s=!1,a=null,i=null,p=null){this.variableNames=[\"A\",\"B\"],this.uniforms=\"dimAOuter : i32, dimBOuter : i32, dimInner : i32,\",this.workGroupSize=[256,1,1],this.outputShape=e,this.dispatchLayout={x:[],y:[1,2],z:[0]},this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize);let u=a!=null,c=p!=null;u&&this.variableNames.push(\"bias\"),c&&this.variableNames.push(\"preluActivationWeights\"),this.transposeA=n,this.transposeB=s,this.addBias=u,this.activation=i,this.hasPreluActivationWeights=c,this.batchAEqualOne=t,this.batchBEqualOne=o,this.shaderKey=`matMulReduce_${this.activation}_${n}_${s}_${this.batchAEqualOne}_${this.batchBEqualOne}`}getUserCode(){return`\n ${ur(this.activation,this.hasPreluActivationWeights)}\n ${jl(this.addBias,this.activation,this.batchAEqualOne,this.batchBEqualOne,this.transposeA,this.transposeB)}\n ${Nre()}\n `}};function _re(r){let e=r[1],t=r[0],o=e>t?e:t;return`\n var mm_Asub : array, ${e}>;\n var mm_Bsub : array, ${o}>;\n\n // If the output size is small for matrix multiplication, avoid to use vec4\n // and handle some elements per thread to optimally utilize the ALU.\n // Read data from global memory to registers firstly, then store them into\n // shared memory, so it is instruction-Level parallelism for arithmetic\n // operations and others handle IO operations between barrier api, makes ALU\n // and load/store units work simultaneously, could improves the performance.\n ${ue()} {\n let tileRow = i32(localId.y);\n let tileCol = i32(localId.x);\n let globalRow = i32(globalId.y);\n let globalCol = i32(globalId.x);\n let batch = i32(globalId.z);\n\n // uniforms.dimInner should be greater than 0.\n let numTiles = (uniforms.dimInner - 1) / ${o} + 1;\n var acc = 0.0;\n\n var globalColA = tileCol;\n var globalRowB = 0;\n var regA = mm_readA(batch, globalRow, globalColA);\n var regB0 = mm_readB(batch, globalRowB + 2 * tileRow, globalCol);\n var regB1 = mm_readB(batch, globalRowB + 2 * tileRow + 1, globalCol);\n globalColA = globalColA + ${o};\n globalRowB = globalRowB + ${o};\n\n for (var t = 0; t < numTiles; t = t + 1) {\n mm_Asub[tileRow][tileCol] = regA;\n mm_Bsub[2 * tileRow][tileCol] = regB0;\n mm_Bsub[2 * tileRow + 1][tileCol] = regB1;\n\n workgroupBarrier();\n\n regA = mm_readA(batch, globalRow, globalColA);\n regB0 = mm_readB(batch, globalRowB + 2 * tileRow, globalCol);\n regB1 = mm_readB(batch, globalRowB + 2 * tileRow + 1, globalCol);\n globalColA = globalColA + ${o};\n globalRowB = globalRowB + ${o};\n\n for (var k = 0; k < ${o}; k = k + 1) {\n acc = acc + mm_Asub[tileRow][k] * mm_Bsub[k][tileCol];\n }\n workgroupBarrier();\n }\n\n mm_write(batch, globalRow, globalCol, acc);\n }\n `}var zg=class{constructor(e,t,o,n=!1,s=!1,a=null,i=null,p=null){this.variableNames=[\"A\",\"B\"],this.uniforms=\"dimAOuter : i32, dimBOuter : i32, dimInner : i32,\",this.workGroupSize=[16,8,1],this.outputShape=o,this.dispatchLayout={x:[2],y:[1],z:[0]},this.dispatch=[Math.ceil(o[2]/this.workGroupSize[0]),Math.ceil(o[1]/this.workGroupSize[1]),o[0]];let u=a!=null;u&&this.variableNames.push(\"bias\");let c=p!=null;c&&this.variableNames.push(\"preluActivationWeights\"),this.transposeA=n,this.transposeB=s,this.addBias=u,this.activation=i,this.hasPreluActivationWeights=c,this.batchAEqualOne=e[0]===1,this.batchBEqualOne=t[0]===1,this.shaderKey=`matMulSmallOutputSize_${this.activation}_${n}_${s}_${this.batchAEqualOne}_${this.batchBEqualOne}`}getUserCode(){return`\n ${ur(this.activation,this.hasPreluActivationWeights)}\n ${jl(this.addBias,this.activation,this.batchAEqualOne,this.batchBEqualOne,this.transposeA,this.transposeB)}\n ${_re(this.workGroupSize)}\n `}};var Wg=class{constructor(e,t,o,n,s=!1,a=!1){this.variableNames=[\"A\",\"B\"],this.uniforms=\"dimAOuter : i32, dimBOuter : i32, dimInner : i32,\",this.workGroupSize=[8,8,1],this.atomic=!0,this.isVec4=!1,this.splitedDimInner=128,x.assert(e[0]===1,()=>\"MatMulSplitKProgram only supports batch = 1.\"),this.outputShape=e,this.dispatchLayout={x:[2],y:[1],z:[0,3]},this.isVec4=(s&&this.outputShape[1]%4===0||!s&&t%4===0)&&this.outputShape[2]%4===0,this.elementsPerThread=[4,4,this.splitedDimInner],this.isVec4||(this.outputShape[1]<16&&(this.elementsPerThread[1]=1),this.outputShape[2]<16&&(this.elementsPerThread[0]=1)),this.dispatch=ae(this.dispatchLayout,[this.outputShape[0],this.outputShape[1],this.outputShape[2],t],this.workGroupSize,this.elementsPerThread),this.transposeA=s,this.transposeB=a,this.batchAEqualOne=o,this.batchBEqualOne=n,this.shaderKey=`matMulSplitK_${s}_${a}_${o}_${n}_${this.elementsPerThread}_${this.isVec4}`}getUserCode(){let e=n=>`\n for (var i = 0; i < ${n}; i = i + 1)\n {\n var oldValue = atomicLoad(&(result[flatIndex + i]));\n var exchanged = false;\n for (; !exchanged;) {\n let newValueF32 = bitcast(oldValue) + ${n>1?\"value[i]\":\"value\"};\n let newValue = bitcast(newValueF32);\n let res = atomicCompareExchangeWeak(&(result[flatIndex + i]), oldValue, newValue);\n oldValue = res.old_value;\n exchanged = res.exchanged;\n }\n }\n `,t=this.isVec4?4:1;return`\n ${lS(this.batchAEqualOne,this.batchBEqualOne,!1,this.transposeB,!1,!1,!1,t)}\n fn mm_write(batch: i32, row : i32, colIn : i32, value : ${vt(t)}) {\n let col = colIn * ${t};\n if (row < uniforms.dimAOuter && col < uniforms.dimBOuter) {\n let coords = vec3(batch, row, col);\n let flatIndex = getOutputIndexFromCoords(coords);\n // The problem is that we should initialize output to zero before using.\n // Otherwise, the original value will be added to the result.\n ${e(t)}\n }\n }\n ${this.isVec4?Uu(this.elementsPerThread,this.workGroupSize,this.transposeA,32,!0,this.splitedDimInner):Gu(this.elementsPerThread,this.workGroupSize,this.transposeA,32,!0,this.splitedDimInner)}\n `}},Ug=class{constructor(e,t=null,o=null,n=null){this.uniforms=\"\",this.variableNames=[\"x\"],this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=e,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.addBias=t!=null,this.hasPreluActivationWeights=n!=null,this.activation=o,this.addBias&&this.variableNames.push(\"bias\"),this.hasPreluActivationWeights&&this.variableNames.push(\"preluActivationWeights\"),this.shaderKey=`biasActivation_${o}`}getUserCode(){return`\n ${ur(this.activation,this.hasPreluActivationWeights)}\n ${ue(\"index\")} {\n if (index < uniforms.size) {\n let coords = getCoordsFromIndex(index);\n var value = getXByOutputIndex(index);\n ${Kr(this.addBias,this.activation)}\n setOutputAtIndex(index, value);\n }\n }\n `}};var Gg=class{constructor(e){this.variableNames=[],this.outputShape=[],this.uniforms=\"value : f32,\",this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=e,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey=\"fill\"}getUserCode(){return`\n ${ue(\"index\")} {\n if (index < uniforms.size) {\n setOutputAtIndex(index, uniforms.value);\n }\n }\n `}};function $o(r){let{backend:e,attrs:t}=r,{shape:o,value:n}=t,{dtype:s}=t;if(s=s||x.inferDtype(n),s===\"string\"){let a=x.getArrayFromDType(s,x.sizeFromShape(o));return a.fill(n),e.makeTensorInfo(o,s,a)}else{let a=new Gg(o),i=[{type:\"float32\",data:[n]}];return e.runWebGPUProgram(a,[],s,i)}}var nM={kernelName:ys,backendName:\"webgpu\",kernelFunc:$o};function xe(r){let{inputs:e,attrs:t}=r,{x:o}=e,{shape:n}=t,s=x.sizeFromShape(o.shape),a=x.inferFromImplicitShape(n,s),i=x.sizeFromShape(a);return x.assert(s===i,()=>`The new shape (${a}) has ${i} elements and the old shape (${o.shape}) has ${s} elements. The new shape and old shape must have the same number of elements.`),r.backend.incRef(o.dataId),{dataId:o.dataId,shape:a,dtype:o.dtype}}var sM={kernelName:Ss,backendName:\"webgpu\",kernelFunc:xe};function _c({a:r,b:e,transposeA:t,transposeB:o,backend:n,bias:s=null,preluActivationWeights:a=null,leakyreluAlpha:i=0,activation:p=null}){let u=r.shape.length,c=e.shape.length,l=t?r.shape[u-2]:r.shape[u-1],m=o?e.shape[c-1]:e.shape[c-2],f=t?r.shape[u-1]:r.shape[u-2],d=o?e.shape[c-2]:e.shape[c-1],h=r.shape.slice(0,-2),g=e.shape.slice(0,-2),y=x.sizeFromShape(h),b=x.sizeFromShape(g),w=br.assertAndGetBroadcastShape(r.shape.slice(0,-2),e.shape.slice(0,-2)).concat([f,d]);x.assert(l===m,()=>`Error in matMul: inner shapes (${l}) and (${m}) of Tensors with shapes ${r.shape} and ${e.shape} and transposeA=${t} and transposeB=${o} must match.`);let k=t?[y,l,f]:[y,f,l],_=o?[b,d,m]:[b,m,d],E=xe({inputs:{x:r},backend:n,attrs:{shape:k}}),R=xe({inputs:{x:e},backend:n,attrs:{shape:_}}),A=[E,R],D=Math.max(y,b),O=y===1,M=b===1,L=[E,R],W=[{type:\"int32\",data:[f]},{type:\"int32\",data:[d]},{type:\"int32\",data:[l]}],V,G,q=[D,f,d],H=P().get(\"WEBGPU_MATMUL_PROGRAM_TYPE\");switch(H<0&&(f*d<=128?H=Qo.MatMulReduceProgram:D===1&&f<=128&&d<=48&&m>=2e3?H=Qo.MatMulSplitKProgram:f<=16&&(d<=512||m>=2*d)||d<=16&&(f<=512||l>=2*f)?H=Qo.MatMulSmallOutputSizeProgram:H=Qo.MatMulPackedProgram),H){case Qo.MatMulReduceProgram:V=new Vg(q,O,M,t,o,s,p,a);break;case Qo.MatMulSplitKProgram:{if(G=$o({backend:n,attrs:{shape:q,value:0,dtype:r.dtype}}),V=new Wg(q,m,O,M,t,o),s||p){G=n.runWebGPUProgram(V,L,r.dtype,W,G);let Z=new Ug(G.shape,s,p,a),ee=null,X=[G];s&&X.push(s),a&&X.push(a),p===\"leakyrelu\"&&(ee=[{type:\"float32\",data:[i]}],Z.uniforms+=\" alpha : f32,\");let Q=n.runWebGPUProgram(Z,X,G.dtype,ee);A.push(G);let se=xe({inputs:{x:Q},backend:n,attrs:{shape:w}});A.push(Q);for(let ie of A)n.disposeData(ie.dataId);return se}break}case Qo.MatMulSmallOutputSizeProgram:V=new zg(k,_,q,t,o,s,p,a);break;case Qo.MatMulPackedProgram:let Y=n.adapterInfo.isIntel();V=new Bg(k,q,O,M,t,o,s,p,a,Y);break;default:throw new Error(`Unsupported MatMulProgramType ${H}.`)}s&&L.push(s),a&&L.push(a),p===\"leakyrelu\"&&(W.push({type:\"float32\",data:[i]}),V.uniforms+=\" alpha : f32,\"),G=n.runWebGPUProgram(V,L,r.dtype,W,G);let j=xe({inputs:{x:G},backend:n,attrs:{shape:w}});A.push(G);for(let Y of A)n.disposeData(Y.dataId);return j}function Ere(r){let{inputs:e,backend:t,attrs:o}=r,{a:n,b:s,bias:a,preluActivationWeights:i}=e,{transposeA:p,transposeB:u,activation:c,leakyreluAlpha:l}=o;return _c({a:n,b:s,transposeA:p,transposeB:u,backend:t,bias:a,preluActivationWeights:i,leakyreluAlpha:l,activation:c})}var aM={kernelName:Fo,backendName:\"webgpu\",kernelFunc:Ere};var Xl=class{constructor(e,t,o){this.variableNames=[\"AReal\",\"AImag\",\"BReal\",\"BImag\"],this.workGroupSize=[128,1,1],this.size=!0,this.outputShape=I.assertAndGetBroadcastShape(t,o),this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey=`binaryOpComplex_${e}`,this.op=e}getUserCode(){return`\n fn binaryOpComplex(\n areal : f32, aimag : f32, breal : f32, bimag : f32) -> f32 {\n ${Nc(this.op,!1)}\n }\n\n ${ue(\"index\")} {\n if(index < uniforms.size) {\n let areal = getARealByOutputIndex(index);\n let aimag = getAImagByOutputIndex(index);\n let breal = getBRealByOutputIndex(index);\n let bimag = getBImagByOutputIndex(index);\n setOutputAtIndex(index, binaryOpComplex(areal, aimag, breal, bimag));\n }\n }\n `}};var Hu=class{constructor(e,t,o){this.size=!0,this.variableNames=[\"A\",\"B\"],this.outputShape=I.assertAndGetBroadcastShape(t,o),this.dispatchLayout=fe(this.outputShape),this.op=e,this.useSharedMemoryWithA=t.length<=1&&o.length>1&&t[0]<128,this.useSharedMemoryWithB=o.length<=1&&t.length>1&&o[0]<128,this.useSharedMemoryWithA||this.useSharedMemoryWithB?(this.isVec4=!1,this.lastDimensionSize=this.useSharedMemoryWithB?o[0]:t[0],this.shaderKey=`binary_${this.type}_${e}_${this.lastDimensionSize}_${this.useSharedMemoryWithB}`,this.type=\"shared\",this.workGroupSize=[256,1,1],this.workPerThread=1):(x.arraysEqual(t,o)&&x.sizeFromShape(t)%4===0?(this.isVec4=!0,this.type=\"vec4\",this.workPerThread=4):(this.isVec4=!1,this.type=\"plain\",this.workPerThread=1),this.shaderKey=`binary_${this.type}_${e}`,this.workGroupSize=[128,1,1]),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize,[this.workPerThread,1,1])}getUserCode(){let e,t=this.isVec4?\"vec4\":\"f32\",o=`\n fn binaryOperation(a : ${t}, b : ${t}) -> ${t} {\n ${Nc(this.op,this.isVec4)}\n };\n `;if(this.type===\"shared\"){let n=this.lastDimensionSize>1?`coords[${this.outputShape.length-1}]`:\"0\",s=this.useSharedMemoryWithB?`let a = getAByOutputIndex(index);\n let b = sharedBuf[${n}];`:`let a = sharedBuf[${n}];\n let b = getBByOutputIndex(index);`;e=`\n ${o}\n var sharedBuf : array;\n ${ue(\"index\")} {\n // Fill in the shared memory buffer.\n let localIndex = i32(localId.x);\n if(localIndex < ${this.lastDimensionSize}) {\n sharedBuf[localIndex] = f32(${this.useSharedMemoryWithB?\"B\":\"A\"}[localIndex]);\n }\n workgroupBarrier();\n\n if(index < uniforms.size) {\n let coords = getCoordsFromIndex(index);\n ${s}\n setOutputAtIndex(index, binaryOperation(a, b));\n }\n }\n `}else e=`\n ${o}\n ${ue(\"index\")} {\n if (index < uniforms.size) {\n let a = getAByOutputIndex(index);\n let b = getBByOutputIndex(index);\n setOutputAtIndex(index, binaryOperation(a, b));\n }\n }\n `;return e}};function Lt(r){let{inputs:e}=r,{x:t}=e;return r.backend.incRef(t.dataId),{dataId:t.dataId,shape:t.shape,dtype:t.dtype}}var iM={kernelName:uo,backendName:\"webgpu\",kernelFunc:Lt};function ls(r){let{inputs:e,backend:t}=r,{real:o,imag:n}=e,s=t.makeTensorInfo(o.shape,\"complex64\"),a=t.tensorMap.get(s.dataId),i=Lt({inputs:{x:o},backend:t}),p=Lt({inputs:{x:n},backend:t});return a.complexTensorInfos={real:i,imag:p},s}var uM={kernelName:aa,backendName:\"webgpu\",kernelFunc:ls};var Zo=class{constructor(e,t){this.variableNames=[\"A\"],this.size=!0;let o=128;this.workGroupSize=[o,1,1],this.outputShape=e,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.op=t,this.shaderKey=`unary_${t}`}getUserCode(){return`\n fn unaryOperation(a : f32) -> f32 {\n ${za(this.op,!1)}\n }\n ${ue(\"index\")} {\n if (index < uniforms.size) {\n let a = getAByOutputIndex(index);\n setOutputAtIndex(index, unaryOperation(a));\n }\n }\n `}};function Ge({opType:r,cpuKernelImpl:e,dtype:t}){return({inputs:o,backend:n})=>{let{x:s}=o,a=n,i=t||s.dtype;if(a.shouldExecuteOnCPU([s])&&e!=null){let u=a.tensorMap.get(s.dataId),c=e(u.values,i);return a.makeTensorInfo(s.shape,i,c)}let p=new Zo(s.shape,r);return a.runWebGPUProgram(p,[s],i)}}function it({opType:r,cpuKernelImpl:e,supportsComplex:t=!1,dtype:o}){return({inputs:n,backend:s})=>{let{a,b:i}=n,p=s;if(t&&a.dtype===\"complex64\"){let l=p.tensorMap.get(a.dataId),m=p.tensorMap.get(i.dataId),f,d;if(r!==ye.MUL)[f,d]=[[l.complexTensorInfos.real,m.complexTensorInfos.real],[l.complexTensorInfos.imag,m.complexTensorInfos.imag]].map(g=>{let[y,b]=g,C={dataId:y.dataId,dtype:y.dtype,shape:a.shape},w={dataId:b.dataId,dtype:b.dtype,shape:i.shape},k=new Hu(r,a.shape,i.shape);return p.runWebGPUProgram(k,[C,w],ct(y.dtype,b.dtype))});else{let g=new Xl(ye.COMPLEX_MULTIPLY_REAL,a.shape,i.shape),y=new Xl(ye.COMPLEX_MULTIPLY_IMAG,a.shape,i.shape),b=[{dataId:l.complexTensorInfos.real.dataId,dtype:l.complexTensorInfos.real.dtype,shape:a.shape},{dataId:l.complexTensorInfos.imag.dataId,dtype:l.complexTensorInfos.imag.dtype,shape:a.shape},{dataId:m.complexTensorInfos.real.dataId,dtype:m.complexTensorInfos.real.dtype,shape:i.shape},{dataId:m.complexTensorInfos.imag.dataId,dtype:m.complexTensorInfos.imag.dtype,shape:i.shape}];f=p.runWebGPUProgram(g,b,\"float32\"),d=p.runWebGPUProgram(y,b,\"float32\")}let h=ls({inputs:{real:f,imag:d},backend:p});return p.disposeData(f.dataId),p.disposeData(d.dataId),h}let u=o||ct(a.dtype,i.dtype);if((a.dtype===\"string\"||i.dtype===\"string\"||p.shouldExecuteOnCPU([a,i]))&&e!=null){let l=p.tensorMap.get(a.dataId).values,m=p.tensorMap.get(i.dataId).values,f=a.dtype===\"string\"?I.fromUint8ToStringArray(l):l,d=a.dtype===\"string\"?I.fromUint8ToStringArray(m):m,[h,g]=e(a.shape,i.shape,f,d,u);return p.makeTensorInfo(g,u,h)}let c=new Hu(r,a.shape,i.shape);return p.runWebGPUProgram(c,[a,i],u)}}var FS={};Be(FS,{addImpl:()=>dS,bincountImpl:()=>lM,bincountReduceImpl:()=>mM,castImpl:()=>fS,ceilImpl:()=>hS,concatImpl:()=>fM,equalImpl:()=>gS,expImpl:()=>xS,expm1Impl:()=>yS,floorImpl:()=>bS,gatherNdImpl:()=>dM,gatherV2Impl:()=>hM,greaterEqualImpl:()=>IS,greaterImpl:()=>CS,lessEqualImpl:()=>SS,lessImpl:()=>wS,linSpaceImpl:()=>gM,logImpl:()=>vS,maxImpl:()=>xM,maximumImpl:()=>kS,minimumImpl:()=>TS,multiplyImpl:()=>Ql,negImpl:()=>yM,notEqualImpl:()=>NS,prodImpl:()=>bM,raggedGatherImpl:()=>IM,raggedTensorToTensorImpl:()=>vM,rangeImpl:()=>kM,rsqrtImpl:()=>ES,scatterImpl:()=>TM,sigmoidImpl:()=>NM,simpleAbsImpl:()=>pM,sliceImpl:()=>_M,sparseFillEmptyRowsImpl:()=>EM,sparseReshapeImpl:()=>$M,sparseSegmentReductionImpl:()=>RM,sqrtImpl:()=>AM,squaredDifferenceImpl:()=>$S,stridedSliceImpl:()=>FM,stringNGramsImpl:()=>DM,stringSplitImpl:()=>PM,stringToHashBucketFastImpl:()=>OM,subImpl:()=>AS,tileImpl:()=>MM,topKImpl:()=>BM,transposeImpl:()=>_S,uniqueImpl:()=>VM});function Xs(r,e){Array.isArray(r)||(r=[r]),r.forEach(t=>{t!=null&&x.assert(t.dtype!==\"complex64\",()=>`${e} does not support complex64 tensors in the CPU backend.`)})}function pM(r){let e=new Float32Array(r.length);for(let t=0;t{let a=I.assertAndGetBroadcastShape(e,t),i=a.length,p=x.computeStrides(a),u=x.sizeFromShape(a),c=x.getTypedArrayFromDType(s,u),l=e.length,m=t.length,f=x.computeStrides(e),d=x.computeStrides(t),h=I.getBroadcastDims(e,a),g=I.getBroadcastDims(t,a);if(h.length+g.length===0)for(let y=0;yC[E]=0);let w=x.locToIndex(C,l,f),k=b.slice(-m);g.forEach(E=>k[E]=0);let _=x.locToIndex(k,m,d);c[y]=r(o[w],n[_])}return[c,a]}}function Ec(r){let{inputs:e,backend:t}=r,{real:o,imag:n}=e,s=t.data.get(o.dataId).values,a=t.data.get(n.dataId).values,i=t.makeTensorInfo(o.shape,\"complex64\"),p=t.data.get(i.dataId);return p.complexTensorInfos={real:t.makeTensorInfo(o.shape,\"float32\",s),imag:t.makeTensorInfo(n.shape,\"float32\",a)},i}function Hg(r,e,t=\"float32\"){if(t===\"complex64\"){let n=Hg(r,e,\"float32\"),s=Hg(r,e,\"float32\");return Ec({inputs:{real:n,imag:s},backend:r})}let o=x.makeZerosTypedArray(x.sizeFromShape(e),t);return r.makeTensorInfo(e,t,o)}function mS(r){let{inputs:e,backend:t}=r,{x:o}=e;return t.incRef(o.dataId),{dataId:o.dataId,shape:o.shape,dtype:o.dtype}}function cM(r){let{inputs:e,backend:t}=r,{input:o}=e,n=t.data.get(o.dataId).complexTensorInfos.real,s=t.data.get(n.dataId).values;return t.makeTensorInfo(n.shape,n.dtype,s)}function fS(r,e,t,o){if(o===\"int32\"){let n=Int32Array.from(r);return[e,\"int32\",n]}if(o===\"bool\"){let n=x.toTypedArray([0],t),[s,a]=kt((i,p)=>i!==p?1:0)(e,[],r,n,\"bool\");return[a,\"bool\",s]}throw new Error(`Error in Cast: failed to cast ${t} to ${o}`)}function Yl(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{dtype:s}=o;if(s===\"complex64\"){if(n.dtype===\"complex64\")return mS({inputs:{x:n},backend:t});let c=Hg(t,n.shape,n.dtype),l=Yl({inputs:{x:n},backend:t,attrs:{dtype:\"float32\"}}),m=Ec({inputs:{real:l,imag:c},backend:t});return t.disposeIntermediateTensorInfo(c),t.disposeIntermediateTensorInfo(l),m}if(n.dtype===\"complex64\"){let c=cM({inputs:{input:n},backend:t}),l=Yl({inputs:{x:c},backend:t,attrs:{dtype:s}});return t.disposeIntermediateTensorInfo(c),l}if(!x.hasEncodingLoss(n.dtype,s)){let c=mS({inputs:{x:n},backend:t});return{dataId:c.dataId,shape:c.shape,dtype:s}}let a=t.data.get(n.dataId).values,[i,p,u]=fS(a,n.shape,n.dtype,s);return t.makeTensorInfo(i,p,u)}function Dt(r,e,t,o){return t==null?({inputs:n,backend:s})=>{let{a,b:i}=n,p=s;Xs([a,i],r);let u=p.data.get(a.dataId).values,c=p.data.get(i.dataId).values,l=a.dtype===\"string\"?I.fromUint8ToStringArray(u):u,m=a.dtype===\"string\"?I.fromUint8ToStringArray(c):c,f=o||a.dtype,[d,h]=e(a.shape,i.shape,l,m,f);return p.makeTensorInfo(h,f,d)}:({inputs:n,backend:s})=>{let{a,b:i}=n,p=s;if(a.dtype===\"complex64\"||i.dtype===\"complex64\"){let u=Yl({inputs:{x:a},backend:p,attrs:{dtype:\"complex64\"}}),c=p.data.get(u.dataId),l=c.complexTensorInfos.real,m=c.complexTensorInfos.imag,f=p.data.get(l.dataId).values,d=p.data.get(m.dataId).values,h=Yl({inputs:{x:i},backend:p,attrs:{dtype:\"complex64\"}}),g=p.data.get(h.dataId),y=g.complexTensorInfos.real,b=g.complexTensorInfos.imag,C=p.data.get(y.dataId).values,w=p.data.get(b.dataId).values,[k,_,E]=t(a.shape,i.shape,f,d,C,w),R=p.makeTensorInfo(E,\"float32\",k),A=p.makeTensorInfo(E,\"float32\",_),D=Ec({inputs:{real:R,imag:A},backend:p});return p.disposeIntermediateTensorInfo(u),p.disposeIntermediateTensorInfo(h),p.disposeIntermediateTensorInfo(R),p.disposeIntermediateTensorInfo(A),D}else{let u=p.data.get(a.dataId).values,c=p.data.get(i.dataId).values,l=o||a.dtype,[m,f]=e(a.shape,i.shape,u,c,l);return p.makeTensorInfo(f,l,m)}}}function $c(r){return(e,t,o,n,s,a)=>{let i=I.assertAndGetBroadcastShape(e,t),p=x.sizeFromShape(i),u=i.length,c=x.computeStrides(i),l=x.getTypedArrayFromDType(\"float32\",p),m=x.getTypedArrayFromDType(\"float32\",p),f=I.getBroadcastDims(e,i),d=I.getBroadcastDims(t,i),h=I.mergeRealAndImagArrays(o,n),g=I.mergeRealAndImagArrays(s,a),y=e.length,b=x.computeStrides(e),C=t.length,w=x.computeStrides(t);if(f.length+d.length===0)for(let k=0;kE[M]=0);let R=x.locToIndex(E,y,b),A=_.slice(-C);d.forEach(M=>A[M]=0);let D=x.locToIndex(A,C,w),O=r(h[R*2],h[R*2+1],g[D*2],g[D*2+1]);l[k]=O.real,m[k]=O.imag}return[l,m,i]}}var dS=kt((r,e)=>r+e),$re=$c((r,e,t,o)=>({real:r+t,imag:e+o})),LTt=Dt(_r,dS,$re);function lM(r,e,t,o,n){let s=x.sizeFromShape(o),a=x.makeZerosTypedArray(n,t);for(let i=0;i=n||(s>0?a[p]+=e[i]:a[p]+=1)}return a}function mM(r,e,t,o=!1){let n=r.shape[0],s=r.shape[1],a=ne([n,t],e.dtype);for(let i=0;i=t||(o?a.set(1,i,u):e.size>0?a.set(a.get(i,u)+e.get(i,p),i,u):a.set(a.get(i,u)+1,i,u))}return a}function Tr(r){return(e,t,o)=>{let n=x.getTypedArrayFromDType(t,e.length);for(let s=0;s{let{x:a}=o;if(Xs(a,r),a.dtype===\"string\"||t===\"string\")throw new Error(\"unaryKernelFunc does not support string input/output\");let i=s,p=i.data.get(a.dataId).values,u=x.sizeFromShape(a.shape),c=t||a.dtype,l=x.getArrayFromDType(c,u);for(let m=0;m{let{x:a}=o;if(Xs(a,r),a.dtype===\"string\"||t===\"string\")throw new Error(\"unaryKernelFunc does not support string input/output\");let i=s,p=i.data.get(a.dataId).values,u=t||a.dtype,c=e(p,u,n);return i.makeTensorInfo(a.shape,u,c)}}var hS=Tr(r=>Math.ceil(r)),YTt=Jo(ro,hS);function fM(r,e,t,o){let n=x.getArrayFromDType(t,x.sizeFromShape(e));if(o&&t!==\"string\"){let s=0;r.forEach(a=>{let i=x.sizeFromShape(a.shape);n.set(a.vals,s),s+=i})}else{let s=0;r.forEach(a=>{let i=t===\"string\"?I.fromUint8ToStringArray(a.vals):a.vals,p=0;for(let u=0;ur===e?1:0),oNt=Dt(oo,gS,null,\"bool\");var xS=Tr(r=>Math.exp(r)),uNt=Jo(no,xS,\"float32\");var yS=Tr(r=>Math.expm1(r)),fNt=Jo(wn,yS);var bS=Tr(r=>Math.floor(r)),yNt=Jo(so,bS);function dM(r,e,t,o,n,s,a,i,p){let u=ne([o,s],t);for(let c=0;c=p/s)throw new Error(`Invalid indices: ${l} does not index into ${i}`);for(let f=0;fr>e?1:0),NNt=Dt(ao,CS,null,\"bool\");var IS=kt((r,e)=>r>=e?1:0),ANt=Dt(io,IS,null,\"bool\");var wS=kt((r,e)=>rr<=e?1:0),WNt=Dt(co,SS,null,\"bool\");function gM(r,e,t){let o=(e-r)/(t-1),n=x.makeZerosTypedArray(t,\"float32\");n[0]=r;for(let s=1;sMath.log(r)),XNt=Jo(lo,vS);function xM(r,e,t,o){let n=x.getTypedArrayFromDType(o,x.sizeFromShape(t));for(let s=0;si)&&(i=u)}n[s]=i}return n}var kS=kt((r,e)=>Math.max(r,e)),r2t=Dt(mo,kS);var TS=kt((r,e)=>Math.min(r,e)),i2t=Dt(fo,TS);var Ql=kt((r,e)=>r*e),Rre=$c((r,e,t,o)=>({real:r*t-e*o,imag:r*o+e*t})),m2t=Dt(ho,Ql,Rre);function yM(r,e,t){let o=x.createScalarValue(-1,t);return Ql([],e,o,r,t)}var NS=kt((r,e)=>r!==e?1:0),I2t=Dt(go,NS,null,\"bool\");function _S(r,e,t,o,n){let s=e.length,a=x.sizeFromShape(e),i=x.computeStrides(e),p=x.computeStrides(n),u=x.getTypedArrayFromDType(t,x.sizeFromShape(n));for(let c=0;c{if(o<0||o>=t){let s=x.indexToLoc(n,e.length,x.computeStrides(e)).join(\",\");throw new Error(`indices[${s}] = ${o} is not in [0, ${t})`)}})}function Fre(r,e){for(let t=0;tn)throw new Error(\"Ragged splits must not point past values\");for(let s=1;so[s])throw new Error(\"Ragged splits must be sorted in ascending order\")}}function Dre(r,e,t,o){let n=[],s=0,a=e.length-1+t.length,i=new Array(a).fill(null).map(()=>[0]);Fre(t,o);let p=1;for(let u=0;u=0){let h=i[d],g=h[h.length-1]-f[c];for(let y=c;yn[a]=s)}return e}function CM(r,e){let t=r.slice(0,e);for(;t.lengtho&&(o=s)}return o}static getMaxWidthValueRowID(e){let t=e.length;if(t===0)return 0;let o=0,n=e[0],s=0;for(let a=1;a\"Final length of result must be equal to firstDimension.\"),s}calculateOutputIndexRowSplit(e,t,o,n){let s=e.length,a=[];for(let i=0;i0&&a.length!==e[s-1])throw new Error(\"Invalid row split size.\");return a}calculateOutputIndexValueRowID(e,t,o,n){let s=e.length,a=[];if(s===0)return[];let i=0,p=e[0];if(p>=t.length)throw new Error(`Got currentValueRowId=${p}, which is not less than ${t.length}`);let u=t[p];a.push(u);for(let c=1;c=0&&(++i,i=t.length)throw new Error(`Got nextValueRowId=${l} which is not less than ${t.length}`);u=t[l]}a.push(u)}if(a.length!==e.length)throw new Error(\"Invalid row ids.\");return a}calculateOutputIndex(e,t,o,n){let s=this.getRowPartitionTensor(e),a=this.getRowPartitionTypeByDimension(e);switch(a){case en.VALUE_ROWIDS:return this.calculateOutputIndexValueRowID(s,t,o,n);case en.ROW_SPLITS:if(s.length-1>t.length)throw new Error(`Row partition size is greater than output size: ${s.length-1} > ${t.length}`);return this.calculateOutputIndexRowSplit(s,t,o,n);default:throw new Error(`Unsupported partition type: ${en[a]}`)}}getFirstDimensionSize(){let e=this.rowPartitionValues[0];if(this.rowPartitionTypes.length===0)throw new Error(\"No row_partition_types given.\");let t=this.rowPartitionTypes[0];switch(t){case en.FIRST_DIM_SIZE:return e[0];case en.VALUE_ROWIDS:throw new Error(\"Cannot handle VALUE_ROWIDS in first dimension.\");case en.ROW_SPLITS:return this.rowPartitionValuesShapes[0][0]-1;default:throw new Error(`Cannot handle type ${en[t]}`)}}compute(){if(this.rowPartitionValues[0].length<=0)throw new Error(\"Invalid first partition input. Tensor requires at least one element.\");let t=this.getFirstDimensionSize(),o=this.calculateOutputSize(t),n=new Array(this.raggedRank+1);n[n.length-1]=1;for(let p=n.length-2;p>=0;--p)n[p]=n[p+1]*o[p+1];let s=SM(o,!1),a=x.getArrayFromDType(this.valuesDType,x.sizeFromShape(s));if(n[0]*o[0]>0){let p=this.calculateFirstParentOutputIndex(t,n[0],o[0]);for(let u=1;u<=this.raggedRank;++u)p=this.calculateOutputIndex(u-1,p,n[u],o[u]);this.setOutput(this.raggedRank,p,a,s)}return[s,a]}setOutput(e,t,o,n){if(o.length===0)return;let s=this.values,a=o,i=n.slice();i=i.slice(e+1);let p=x.sizeFromShape(i),u=t.length,c=this.defaultValue;if(c.length!==p&&c.length!==1){let d=this.defaultValueShape;Ne(()=>{let h=z(c,d);c=Ls(h,i).dataSync()})}let l=0,m=0,f=0;for(let d=0;d<=u;++d){let h=d=u){let g=o.length;h=Math.floor(g/p)}if(h>f)if(this.defaultValue.length===1)a.subarray(f*p,h*p).fill(this.defaultValue[0]),f=h;else for(;h>f;){let g=a.slice(f*p);wM(g,c,p),++f}h<0?(l=d+1,m=f):(l=d,m=f,f=m+1)}}};function wM(r,e,t){for(let o=0;o= 0`);if(o<-1)throw new Error(`Dimension ${o} must be >= -1`);o=-1}t.push(o)}return t}function vM(r,e,t,o,n,s,a,i,p,u){return new Rc(r,e,t,o,n,s,a,i,p,u).compute()}function kM(r,e,t,o){let n=r===e,s=r1;if(n||s||a)return x.makeZerosTypedArray(0,o);let i=Math.abs(Math.ceil((e-r)/t)),p=x.makeZerosTypedArray(i,o);e1/Math.sqrt(r)),U2t=Jo(xo,ES);function TM(r,e,t,o,n,s,a,i,p,u){let c=[o/n,n],l=r.values,m=e.values;if(o===0)return ne(t,e.dtype);let f=ne(c,e.dtype);typeof p==\"string\"||typeof p==\"number\"?f.values.fill(p):typeof p==\"boolean\"&&f.values.fill(+p);for(let d=0;d=o/n)throw new Error(`Invalid indices: ${h} does not index into ${t}`);for(let y=0;y1/(1+Math.exp(-r))),Y2t=qg(yo,r=>1/(1+Math.exp(-r)));function _M(r,e,t,o,n){let s=et.isSliceContinous(o,e,t),a=x.sizeFromShape(t),i=x.computeStrides(o);if(s){let l=et.computeFlatOffset(e,i);return n===\"string\"?r.slice(l,l+a):r.subarray(l,l+a)}let p=n===\"string\"?I.fromUint8ToStringArray(r):r,u=ne(o,n,p),c=ne(t,n);for(let l=0;ld+e[h]);c.set(u.get(...f),...m)}return n===\"string\"?I.fromStringArrayToUint8(c.values):c.values}function EM(r,e,t,o,n,s,a){let i=e[0],p=s[0],u=new Array(p),c=new Array(i),l=e[1];if(p===0){if(i!==0)throw new Error(I.getSparseFillEmptyRowsIndicesDenseShapeMismatch(i));let g=x.getArrayFromDType(t,0),y=x.getArrayFromDType(n,0);return[g,[0,l],y,u,c]}let m=!0,f=0,d=new Array(p).fill(0);for(let g=0;g=p)throw new Error(I.getSparseFillEmptyRowsOutOfRangeIndexErrorMessage(g,y,p));++d[y],m=m&&y>=f,f=y}let h=!0;for(let g=0;g0&&(d[g]+=d[g-1])}if(h&&m){let g=r,y=o;for(let b=0;b0){f[m-1]=1;for(let g=m-2;g>=0;--g)f[g]=f[g+1]*o[g+1]}let d=[];if(i>0){d[i-1]=1;for(let g=i-2;g>=0;--g)d[g]=d[g+1]*p[g+1]}let h=x.getArrayFromDType(t,a*i);for(let g=0;g0?n[i-1]+1:0;if(l<0)throw new Error(I.getSparseSegmentReductionNegativeSegmentIdsErrorMessage());let m=e.slice();m[0]=l;let f=m.reduce((C,w)=>C*w,1),d=x.getArrayFromDType(t,f);if(i===0)return l>0&&d.fill(a),[d,m];if(l<=0)throw new Error(I.getSparseSegmentReductionNegativeSegmentIdsErrorMessage());let h=0,g=1,y=0,b=n[h];for(;;){let C=0;if(g=C)throw new Error(I.getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage())}if(b<0||b>=l)throw new Error(I.getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage(b,l));b>y&&d.fill(a,y*u,b*u);for(let w=h;w=p[0])throw new Error(I.getSparseSegmentReductionIndicesOutOfRangeErrorMessage(w,o[w],p[0]));for(let _=0;_i)break}return yMath.sqrt(r)),c_t=qg(bo,r=>Math.sqrt(r));var $S=kt((r,e)=>{let t=r-e;return t*t}),h_t=Dt(Co,$S);function FM(r,e,t,o){let n=ne(r,e.dtype);for(let s=0;s0?0:i-p),f=0;f+=u*this.leftPad.length;for(let b=0;bb.forEach(C=>h[g++]=C);for(let b=0;b0){y(e[m+l-1]);for(let b=0;b0){let p=t[0];if(p!==0)throw new Error(`First split value must be 0, got ${p}`);for(let u=1;u=p;if(c=c&&t[u]<=o,!c)throw new Error(`Invalid split value ${t[u]}, must be in [${p}, ${o}]`);p=t[u]}if(p!==o)throw new Error(`Last split value must be data size. Expected ${o}, got ${p}`)}let s=n-1,a=x.getArrayFromDType(\"int32\",n);if(o===0||n===0){let p=new Array(o);for(let u=0;u<=s;++u)a[u]=0;return[p,a]}a[0]=0;for(let p=1;p<=s;++p){let u=t[p]-t[p-1],c=0;this.nGramWidths.forEach(l=>{c+=this.getNumNGrams(u,l)}),this.preserveShort&&u>0&&c===0&&(c=1),a[p]=a[p-1]+c}let i=new Array(a[s]);for(let p=0;p{let m=t[p+1]-t[p],f=this.getNumNGrams(m,l);this.createNGrams(e,u,i,c,f,l),c+=f}),this.preserveShort&&c===a[p]){let l=t[p+1]-t[p];if(l===0)continue;let m=l+2*this.padWidth,f=1;this.createNGrams(e,u,i,c,f,m)}}return[i,a]}};function DM(r,e,t,o,n,s,a,i){return new RS(t,o,n,s,a,i).compute(r,e)}function Lre(r,e,t,o){if(!r.length)return;if(e.length===0){for(let s=0;sr-e),Bre=$c((r,e,t,o)=>({real:r-t,imag:e-o})),__t=Dt(Io,AS,Bre);function MM(r,e){let t=new Array(r.rank);for(let n=0;n{let t=e.value-r.value;return t===0?r.index-e.index:t};function LM(r,e,t=0,o=r.length-1){for(;o>t;){if(o-t>600){let i=o-t+1,p=e-t+1,u=Math.log(i),c=.5*Math.exp(2*u/3),l=.5*Math.sqrt(u*c*(i-c)/i)*Math.sign(p-i/2),m=Math.max(t,Math.floor(e-p*c/i+l)),f=Math.min(o,Math.floor(e+(i-p)*c/i+l));LM(r,e,m,f)}let n=r[e],s=t,a=o;for(x.swap(r,t,e),Zl(r[o],n)>0&&x.swap(r,t,o);s0;)a=a-1}Zl(r[t],n)===0?x.swap(r,t,a):(a=a+1,x.swap(r,a,o)),a<=e&&(t=a+1),e<=a&&(o=a-1)}}function BM(r,e,t,o,n){let s=e[e.length-1],[a,i]=[r.length/s,s],p=x.getTypedArrayFromDType(t,a*o),u=x.getTypedArrayFromDType(\"int32\",a*o);for(let l=0;ld[C]={value:b,index:C}),o{for(let g=0;g`T${o}`),this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize,[this.workPerThread,1,1]),this.shaderKey=\"addN\"}getUserCode(){let e=[];this.variableNames.forEach(n=>{e.push(`let v${n} = get${n}ByOutputCoords(coords);`)});let t=this.variableNames.map(n=>`v${n}`).join(\" + \");return`\n ${ue(\"index\")} {\n for (var i = 0; i < ${this.workPerThread}; i = i + 1) {\n let flatIndex = index * ${this.workPerThread} + i;\n if (flatIndex < uniforms.size) {\n let coords = getCoordsFromIndex(flatIndex);\n ${e.join(`\n `)}\n setOutputAtIndex(flatIndex, ${t});\n }\n }\n }\n `}};function Wre(r){let{inputs:e,backend:t}=r,o=e;if(o.length===1)return Lt({inputs:{x:o[0]},backend:t});let n=o.map(i=>i.dtype).reduce((i,p)=>ct(i,p)),s=o.map(i=>i.shape),a=new Kg(s);return t.runWebGPUProgram(a,o,n)}var wL={kernelName:an,backendName:\"webgpu\",kernelFunc:Wre};var Ac=class{constructor(e,t,o){this.workGroupSize=[64,1,1],this.variableNames=[\"x\"],this.uniforms=\"infinityValue : f32,\",this.size=!0;let n=[t];this.op=o===\"min\"?\"<\":\">\";let[s,a]=I.computeOutAndReduceShapes(e,n);this.outputShape=s.length===0?[1]:s,this.dispatchLayout=fe(this.outputShape),x.sizeFromShape(a)<32||x.sizeFromShape(s)>1e3?(this.type=\"plain\",this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize)):(this.type=\"shared\",this.dispatch=ae(this.dispatchLayout,this.outputShape,[1,1,1])),this.inputShape=e,this.shaderKey=`argMinMax_${this.op}_${this.type}`}getUserCode(){let e=()=>this.inputShape.length===1?\"uniforms.xShape\":`uniforms.xShape.${Yo(this.inputShape.length-1)}`,t=()=>{let o=\"\";if(this.outputShape.length===1)this.inputShape.length!==1&&(o+=\"outputCoords,\");else for(let n=0;n u32 {\n return ((a - 1u) / b + 1u);\n }\n\n ${`\n var xBestIndices : array;\n var xBestValues : array;\n `}\n\n ${ue(\"index\")} {\n let outputIndex = index / i32(workGroupSizeX);\n let reduceLength = ${e()};\n\n var bestIndex = i32(localId.x);\n var bestValue = uniforms.infinityValue;\n let outputCoords = getCoordsFromIndex(outputIndex);\n for (var k = i32(localId.x); k < reduceLength && outputIndex < uniforms.size;\n k = k + i32(workGroupSizeX)) {\n let candidate = getX(${t()} k);\n if (!isnan(candidate) && candidate ${this.op} bestValue) {\n bestValue = candidate;\n bestIndex = k;\n }\n }\n xBestValues[localId.x] = bestValue;\n xBestIndices[localId.x] = bestIndex;\n workgroupBarrier();\n\n var reduceSize = min(u32(reduceLength), workGroupSizeX);\n for (var currentSize = reduceSize / 2u; reduceSize > 1u;\n currentSize = reduceSize / 2u) {\n let interval = DIV_CEIL(reduceSize, 2u);\n if (localId.x < currentSize) {\n let candidate = xBestValues[localId.x + interval];\n if (candidate ${this.op} bestValue) {\n bestValue = candidate;\n xBestValues[localId.x] = bestValue;\n xBestIndices[localId.x] = xBestIndices[localId.x + interval];\n }\n }\n reduceSize = interval;\n workgroupBarrier();\n }\n\n if (localId.x == 0u && outputIndex < uniforms.size) {\n setOutputAtIndexI32(outputIndex, xBestIndices[localId.x]);\n }\n }\n `:`\n ${ue(\"index\")} {\n if (index < uniforms.size) {\n let outputCoords = getCoordsFromIndex(index);\n var bestIndex = 0;\n var bestValue = getX(${t()} 0);\n let reduceLength = ${e()};\n for (var i = 1; i < reduceLength; i++) {\n let candidate = getX(${t()} i);\n if (candidate ${this.op} bestValue) {\n bestValue = candidate;\n bestIndex = i;\n }\n }\n setOutputAtIndexI32(index, bestIndex);\n }\n }\n `}};var jg=class{constructor(e,t){this.variableNames=[\"A\"],this.workGroupSize=[16,16,1];let o=new Array(e.length);for(let n=0;n tile : array, ${this.workGroupSize[0]}>;\n ${Ri()}\n fn _start(@builtin(local_invocation_id) localId : vec3,\n @builtin(workgroup_id) workgroupId : vec3) {\n var x = i32(workgroupId.x) * TILE_DIM + i32(localId.x);\n var y = i32(workgroupId.y) * TILE_DIM + i32(localId.y);\n let width = uniforms.outShape[0];\n let height = uniforms.outShape[1];\n if (x < width && y < height) {\n tile[localId.y][localId.x] = A[y * width + x];\n }\n workgroupBarrier();\n\n x = i32(workgroupId.y) * TILE_DIM + i32(localId.x);\n y = i32(workgroupId.x) * TILE_DIM + i32(localId.y);\n if (x < height && y < width) {\n setOutputAtIndex((y * height + x), tile[localId.x]\n [localId.y]);\n }\n }\n `}};var Xg=class{constructor(e,t){this.variableNames=[\"A\"],this.workPerThread=1,this.workGroupSize=[64,1,1],this.size=!0;let o=new Array(e.length);for(let n=0;n6)throw Error(`Transpose for rank ${e} is not yet supported`);let t=new Array(e);for(let o=0;ot.disposeData(f.dataId)),m}var vL={kernelName:un,backendName:\"webgpu\",kernelFunc:Gre};function Hre(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s}=o,a=x.parseAxisParam(s,n.shape),i=I.getAxesPermutation(a,n.shape.length),p=n,u=[];i!=null&&(p=Nr({inputs:{x:n},backend:t,attrs:{perm:i}}),u.push(p),a=I.getInnerMostAxes(a.length,p.shape.length)),I.assertAxesAreInnerMostDims(\"argMin\",[a[0]],p.shape.length);let c=new Ac(p.shape,a[0],\"min\"),l=[{type:\"float32\",data:[Number.POSITIVE_INFINITY]}],m=t.runWebGPUProgram(c,[p],\"int32\",l);return u.forEach(f=>t.disposeData(f.dataId)),m}var kL={kernelName:ja,backendName:\"webgpu\",kernelFunc:Hre};var qre=it({opType:ye.ATAN2}),TL={kernelName:sa,backendName:\"webgpu\",kernelFunc:qre};var Jl=class{constructor(e,t){this.variableNames=[\"x\"],this.uniforms=\"stride : vec2, pad : vec2, dilation : vec2, convDims : vec2, filterDims : vec2,\",this.workGroupSize=[128,1,1],this.size=!0,this.outputShape=e.outShape,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey=`pool2D_${t}`,this.poolType=t}getUserCode(){let e=\"resultValue = max(value, resultValue);\";this.poolType===\"avg\"&&(e=\"resultValue = resultValue + value; count = count + 1.0;\");let t=\"resultValue\";return this.poolType===\"avg\"&&(t=\"resultValue / count\"),`\n ${ue(\"index\")} {\n if (index < uniforms.size) {\n let coords = getCoordsFromIndex(index);\n let batch = coords[0];\n let xRCCorner = vec2(coords.yz) * uniforms.stride - uniforms.pad;\n let xRCorner = xRCCorner.x;\n let xCCorner = xRCCorner.y;\n\n var resultValue = ${this.poolType===\"avg\"?\"0.0\":\"-1.0 / pow(10.0, -20.0)\"};\n var count = 0.0;\n\n for (var wR = 0; wR < uniforms.filterDims.x; wR = wR + uniforms.dilation.x) {\n let xR = xRCorner + wR;\n\n if (xR < 0 || xR >= uniforms.convDims.x) {\n continue;\n }\n\n for (var wC = 0; wC < uniforms.filterDims.y; wC = wC + uniforms.dilation.y) {\n let xC = xCCorner + wC;\n if (xC < 0 || xC >= uniforms.convDims.y) {\n continue;\n }\n\n let value = getX(batch, xR, xC, coords[3]);\n ${e}\n }\n }\n\n setOutputAtIndex(index, ${t});\n }\n }\n `}};var Yg=class{constructor(e){this.variableNames=[\"x\"],this.uniforms=\"stride : vec2,\",this.workGroupSize=[256,1,1],this.size=!0,this.outputShape=e.outShape,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey=\"poolWithFilterSizeEqualsOne\"}getUserCode(){return`\n ${ue(\"index\")} {\n if (index < uniforms.size) {\n let coords = getCoordsFromIndex(index);\n let batch = coords[0];\n let d = coords[3];\n\n let xRCCorner = coords.yz * uniforms.stride;\n let xRCorner = xRCCorner.x;\n let xCCorner = xRCCorner.y;\n\n let value = getX(batch, xRCorner, xCCorner, d);\n setOutputAtIndex(index, value);\n }\n }\n `}};var Qg=class{constructor(e,t){this.workGroupSize=[64,1,1],this.variableNames=[\"x\"],this.uniforms=\"reduceSize : i32,\",this.size=!0,this.inputShape=[e.batchSize,e.inSize];let[o]=I.computeOutAndReduceShapes(this.inputShape,[1]);this.outputShape=o.length===0?[1]:o,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,[1,1,1]),this.reduceType=t,this.shaderKey=`reduce_${t}`}getUserCode(){let e=\"\",t=\"0.0\";this.reduceType===\"min\"||this.reduceType===\"max\"?(e=`\n if (isnan(candidate)) {\n bestValue = uniforms.NAN;\n } else if (!isnan(bestValue) && candidate ${this.reduceType===\"min\"?\"<\":\">\"} bestValue)\n { bestValue = candidate; }`,t=\"f32(x[offset])\"):this.reduceType===\"sum\"||this.reduceType===\"mean\"?e=\" bestValue = bestValue + candidate; \":this.reduceType===\"prod\"&&(e=\" bestValue = bestValue * candidate; \",t=\"1.0\");let o=this.reduceType===\"mean\"?\"setOutputAtIndex(outputIndex, bestValue / f32(uniforms.reduceSize));\":\"setOutputAtIndex(outputIndex, bestValue);\";return`\n fn DIV_CEIL(a : u32, b : u32) -> u32 {\n return ((a - 1u) / b + 1u);\n }\n\n ${`\n var xBestValues : array;\n `}\n fn getOffset(outputIndex : i32) -> i32 {\n let outputCoords = getCoordsFromIndex(outputIndex);\n let offset = ${this.outputShape.length===1?\"outputCoords\":\"outputCoords[0]\"} * uniforms.reduceSize;\n return offset;\n }\n ${ue(\"index\")} {\n let outputIndex = index / i32(workGroupSizeX);\n let offset = getOffset(outputIndex);\n var bestValue = ${t};\n let Length = uniforms.reduceSize;\n let WorkPerThread = DIV_CEIL(u32(Length), workGroupSizeX);\n for (var k = i32(localId.x); k < Length && outputIndex < uniforms.size;\n k = k + i32(workGroupSizeX)) {\n let candidate = f32(x[offset + k]);\n ${e}\n }\n xBestValues[localId.x] = bestValue;\n workgroupBarrier();\n\n var reduceSize = min(u32(Length), workGroupSizeX);\n for (var currentSize = reduceSize / 2u; reduceSize > 1u;\n currentSize = reduceSize / 2u) {\n let interval = DIV_CEIL(reduceSize, 2u);\n if (localId.x < currentSize) {\n let candidate = xBestValues[localId.x + interval];\n ${e}\n xBestValues[localId.x] = bestValue;\n }\n reduceSize = interval;\n workgroupBarrier();\n }\n\n if (localId.x == 0u && outputIndex < uniforms.size) {\n ${o}\n }\n }\n `}};function Ys(r,e,t,o,n){let s=r.shape.length,a=[],i=x.parseAxisParam(e,r.shape),p=i,u=I.getAxesPermutation(p,s),c=r;u!=null&&(c=Nr({inputs:{x:r},attrs:{perm:u},backend:n}),p=I.getInnerMostAxes(p.length,s),a.push(c)),I.assertAxesAreInnerMostDims(o,p,s);let[l,m]=I.computeOutAndReduceShapes(c.shape,p),f=l;t&&(f=I.expandShapeToKeepDim(l,i));let d;if((o===\"max\"||o===\"prod\")&&n.shouldExecuteOnCPU([c])){let h=n.tensorMap.get(c.dataId).values;switch(o){case\"max\":let g=rL(h,x.sizeFromShape(m),f,r.dtype);d=n.makeTensorInfo(f,r.dtype,g);break;case\"prod\":let{outVals:y,outShape:b,outDtype:C}=uL(c.shape,c.dtype,h,p);d=n.makeTensorInfo(b,C,y);break;default:throw new Error(`${o} CPU implementation is not yet supported.`)}}else{let h=x.sizeFromShape(m),y=x.sizeFromShape(c.shape)/h,b={windowSize:h,inSize:h,batchSize:y,outSize:1},C=o===\"mean\"?\"float32\":Ca(r.dtype),w=[{type:\"int32\",data:[h]}],k=new Qg(b,o),_=n.runWebGPUProgram(k,[c],C,w);a.push(_),d=xe({inputs:{x:_},attrs:{shape:f},backend:n})}return a.forEach(h=>n.disposeData(h.dataId)),d}function em(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{reductionIndices:s,keepDims:a}=o;return Ys(n,s,a,\"max\",t)}var NL={kernelName:$n,backendName:\"webgpu\",kernelFunc:em};function DS(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{keepDims:s,axis:a}=o;return Ys(n,a,s,\"mean\",t)}var _L={kernelName:An,backendName:\"webgpu\",kernelFunc:DS};function Zg(r,e,t,o){if(e.filterWidth===1&&e.filterHeight===1&&x.arraysEqual(e.inShape,e.outShape))return Lt({inputs:{x:r},backend:o});if(e.filterWidth===e.inWidth&&e.filterHeight===e.inHeight&&e.batchSize===1&&e.padInfo.type===\"VALID\"){let a=r.shape.length,i=xe({inputs:{x:r},backend:o,attrs:{shape:[r.shape[a-3]*r.shape[a-2],r.shape[a-1]]}}),p;t===\"avg\"?p=DS({inputs:{x:i},backend:o,attrs:{axis:0,keepDims:!1}}):(x.assert(t===\"max\",()=>`Invalid pool type ${t}`),p=em({inputs:{x:i},backend:o,attrs:{reductionIndices:0,keepDims:!1}}));let u=xe({inputs:{x:p},backend:o,attrs:{shape:e.outShape}});return o.disposeData(i.dataId),o.disposeData(p.dataId),u}let n,s=[{type:\"int32\",data:[e.strideHeight,e.strideWidth]}];return e.filterHeight===1&&e.filterWidth===1?n=new Yg(e):(t===\"avg\"?n=new Jl(e,\"avg\"):(x.assert(t===\"max\",()=>`Invalid pool type ${t}`),n=new Jl(e,\"max\")),s.push({type:\"int32\",data:[e.padInfo.top,e.padInfo.left]},{type:\"int32\",data:[e.dilationHeight,e.dilationWidth]},{type:\"int32\",data:[e.inHeight,e.inWidth]},{type:\"int32\",data:[e.effectiveFilterHeight,e.effectiveFilterWidth]})),o.runWebGPUProgram(n,[r],r.dtype,s)}function Kre(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{filterSize:s,strides:a,pad:i,dimRoundingMode:p}=o,u=1,c=I.computePool2DInfo(n.shape,s,a,u,i,p);return Zg(n,c,\"avg\",t)}var EL={kernelName:pn,backendName:\"webgpu\",kernelFunc:Kre};function jre(r){let{inputs:e,backend:t,attrs:o}=r,{a:n,b:s}=e,{transposeA:a,transposeB:i}=o;return _c({a:n,b:s,transposeA:a,transposeB:i,backend:t})}var $L={kernelName:cn,backendName:\"webgpu\",kernelFunc:jre};var Jg=class{constructor(e,t){this.variableNames=[\"source\"],this.workPerThread=1,this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=t,this.rank=t.length,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize,[this.workPerThread,1,1]),this.start=e,this.uniforms=`start : ${At(e.length)}, `,this.shaderKey=\"slice\"}getUserCode(){let e=At(this.rank),t=Xre(this.rank),o;return this.start.length===1?o=this.outputShape.map((s,a)=>\"sourceLoc = uniforms.start + coords;\"):o=this.outputShape.map((s,a)=>`sourceLoc.${PS[a]} = uniforms.start.${Yo(a)} + coords.${PS[a]};`),`\n ${ue(\"index\")} {\n if (index < uniforms.size) {\n var sourceLoc : ${e};\n let coords = getCoordsFromIndex(index);\n ${o.join(`\n`)}\n setOutputAtIndex(index, getSource(${t}));\n }\n }\n `}},PS=[\"x\",\"y\",\"z\",\"w\",\"u\",\"v\"];function Xre(r){if(r===1)return\"sourceLoc\";if(r<=6)return PS.slice(0,r).map(e=>`sourceLoc.${e}`).join(\",\");throw Error(`Slicing for rank ${r} is not yet supported`)}function ms(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{begin:s,size:a}=o,[i,p]=et.parseSliceParams(n,s,a);if(et.assertParamsValid(n,i,p),t.shouldExecuteOnCPU([n])||n.dtype===\"string\"){let l=t.tensorMap.get(n.dataId),m=fL(l.values,i,p,n.shape,n.dtype);return t.makeTensorInfo(p,n.dtype,m)}if(x.sizeFromShape(p)===0)return t.makeTensorInfo(p,n.dtype,[]);let u=new Jg(i,p),c=[{type:\"int32\",data:i}];return t.runWebGPUProgram(u,[n],n.dtype,c)}var RL={kernelName:qn,backendName:\"webgpu\",kernelFunc:ms};var Yre=r=>{let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{blockShape:s,crops:a}=o;x.assert(n.shape.length<=4,()=>\"batchToSpaceND for rank > 4 with a WebGPU backend not implemented yet\");let i=s.reduce((b,C)=>b*C),p=I.getReshaped(n.shape,s,i),u=I.getPermuted(p.length,s.length),c=I.getReshapedPermuted(n.shape,s,i),l=I.getSliceBeginCoords(a,s.length),m=I.getSliceSize(c,a,s.length),f=[],d=xe({inputs:{x:n},backend:t,attrs:{shape:p}}),h=Nr({inputs:{x:d},backend:t,attrs:{perm:u}}),g=xe({inputs:{x:h},backend:t,attrs:{shape:c}}),y=ms({inputs:{x:g},backend:t,attrs:{begin:l,size:m}});return f.push(d),f.push(h),f.push(g),f.forEach(b=>t.disposeData(b.dataId)),y},AL={kernelName:hs,backendName:\"webgpu\",kernelFunc:Yre};var OS=it({opType:ye.NOT_EQUAL,dtype:\"bool\",cpuKernelImpl:iL}),FL={kernelName:go,backendName:\"webgpu\",kernelFunc:OS};function Wa(r){let{inputs:e,backend:t}=r,{input:o}=e,n=t.tensorMap.get(o.dataId);return Lt({inputs:{x:n.complexTensorInfos.real},backend:t})}var DL={kernelName:la,backendName:\"webgpu\",kernelFunc:Wa};function PL(r,e){let t=new Zo(r.shape,pe.TO_INT),o=e.runWebGPUProgram(t,[r],\"int32\");return{dataId:o.dataId,shape:o.shape,dtype:o.dtype}}function MS(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{dtype:s}=o;if(s===\"complex64\"){if(n.dtype===\"complex64\")return Lt({inputs:{x:n},backend:t});let a=Wr(n.shape),i=MS({inputs:{x:n},backend:t,attrs:{dtype:\"float32\"}}),p=ls({inputs:{real:i,imag:a},backend:t});return a.dispose(),t.disposeData(i.dataId),p}if(n.dtype===\"complex64\"){let a=Wa({inputs:{input:n},backend:t}),i=MS({inputs:{x:a},backend:t,attrs:{dtype:s}});return t.disposeData(a.dataId),i}if(!x.hasEncodingLoss(n.dtype,s)){let a=Lt({inputs:{x:n},backend:t});return{dataId:a.dataId,shape:a.shape,dtype:s}}if(t.shouldExecuteOnCPU([n])){let a=t.tensorMap.get(n.dataId).values,[i,p,u]=WM(a,n.shape,n.dtype,s);return t.makeTensorInfo(i,p,u)}if(s===\"int32\")return PL(n,t);if(s===\"bool\"){let a=t.makeTensorInfo([],\"bool\",x.getTypedArrayFromDType(\"bool\",1)),p=OS({inputs:{a:n,b:a},backend:t});return t.disposeData(a.dataId),p}throw new Error(`Error in Cast: failed to cast ${n.dtype} to ${s}`)}var OL={kernelName:to,backendName:\"webgpu\",kernelFunc:MS};var Qre=Ge({opType:pe.CEIL,cpuKernelImpl:UM}),ML={kernelName:ro,backendName:\"webgpu\",kernelFunc:Qre};var ex=class{constructor(e){this.variableNames=[\"A\"],this.uniforms=\"minVal : f32, maxVal : f32,\",this.workPerThread=4,this.workGroupSize=[64,1,1],this.isVec4=!0,this.size=!0,this.outputShape=e,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize,[this.workPerThread,1,1]),this.shaderKey=\"clipVec4\"}getUserCode(){return`\n ${ue(\"index\")} {\n if(index < uniforms.size) {\n let value = getAByOutputIndex(index);\n var clampedValue : vec4;\n for (var i = 0; i < 4; i = i + 1) {\n if (isnan(value[i])) {\n clampedValue[i] = value[i];\n } else {\n clampedValue[i] = clamp(value[i], uniforms.minVal, uniforms.maxVal);\n }\n }\n\n setOutputAtIndex(index, clampedValue);\n }\n }\n `}};var tx=class{constructor(e){this.variableNames=[\"A\"],this.uniforms=\"minVal : f32, maxVal : f32,\",this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=e,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey=\"clip\"}getUserCode(){return`\n ${ue(\"index\")} {\n if(index < uniforms.size) {\n let value = getAByOutputIndex(index);\n if (isnan(value)) {\n setOutputAtIndex(index, value);\n return;\n }\n setOutputAtIndex(index, clamp(value, uniforms.minVal, uniforms.maxVal));\n }\n }\n `}};function Zre(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{clipValueMin:s,clipValueMax:a}=o,i,p=[{type:\"float32\",data:[s]},{type:\"float32\",data:[a]}];return x.sizeFromShape(n.shape)%4===0?i=new ex(n.shape):i=new tx(n.shape),t.runWebGPUProgram(i,[n],n.dtype,p)}var LL={kernelName:Ro,backendName:\"webgpu\",kernelFunc:Zre};var rx=class{constructor(e){this.uniforms=\"\",this.workPerThread=1,this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=I.computeOutShape(e,1),this.variableNames=e.map((t,o)=>`T${o}`),this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize,[this.workPerThread,1,1]),this.offsetLength=e.length-1;for(let t=0;t0){e.push(\"if (yC < uniforms.offset0){ setOutputAtCoords(coords.x, coords.y, getT0(yR, yC)); }\");for(let s=1;sWa({inputs:{input:C},backend:t})),h=r.map(C=>qu({inputs:{input:C},backend:t})),g=Fc(d,e,t),y=Fc(h,e,t),b=ls({inputs:{real:g,imag:y},backend:t});return d.forEach(C=>t.disposeData(C.dataId)),h.forEach(C=>t.disposeData(C.dataId)),t.disposeData(g.dataId),t.disposeData(y.dataId),b}let n=t.shouldExecuteOnCPU(r);if(o===\"string\"&&(n=!0),n){let d=r.map(k=>{let E=[-1,x.sizeFromShape(k.shape.slice(e))];return xe({inputs:{x:k},backend:t,attrs:{shape:E}})}),h=d.map(k=>({vals:t.readSync(k.dataId),shape:k.shape})),g=I.computeOutShape(d.map(k=>k.shape),1),y=d[0].shape[0]===1,b=GM(h,g,o,y),C=I.computeOutShape(r.map(k=>k.shape),e),w=t.makeTensorInfo(C,o,b);return d.forEach(k=>t.disposeData(k.dataId)),w}let s=t.device.limits.maxStorageBuffersPerShaderStage-1;if(r.length>s){let d=[];for(let g=0;gd.shape),u=new rx(p),c=[],l=new Array(p.length-1);if(l.length>0){l[0]=p[0][1],c.push({type:\"int32\",data:[l[0]]});for(let d=1;dt.disposeData(d.dataId));let f=xe({inputs:{x:m},backend:t,attrs:{shape:i}});return t.disposeData(m.dataId),f}function Jre(r,e,t){let o=I.computeOutShape(r.map(s=>s.shape),e);return{tensors2D:r.map(s=>xe({inputs:{x:s},backend:t,attrs:{shape:[x.sizeFromShape(s.shape.slice(0,e)),x.sizeFromShape(s.shape.slice(e))]}})),outShape:o}}function LS(r){let{inputs:e,backend:t,attrs:o}=r,{axis:n}=o,s=x.parseAxisParam(n,e[0].shape)[0],a=e.map(u=>u.shape);I.assertParamsConsistent(a,s);let i=I.computeOutShape(e.map(u=>u.shape),s);if(x.sizeFromShape(i)===0)return t.makeTensorInfo(i,e[0].dtype,[]);let p=e.filter(u=>x.sizeFromShape(u.shape)>0);return p.length===1?Lt({inputs:{x:p[0]},backend:t}):Fc(p,s,t)}var VL={kernelName:gs,backendName:\"webgpu\",kernelFunc:LS};function eoe(r,e,t,o,n=!1,s=null,a=!1,i=4,p=4,u=4){let c=A=>{switch(A){case 1:return\"resData = x[xIndex];\";case 3:return\"resData = vec3(x[xIndex], x[xIndex + 1], x[xIndex + 2]);\";case 4:return\"resData = x[xIndex / 4];\";default:throw new Error(`innerElementSize ${A} is not supported.`)}},l=A=>{switch(A){case 1:return\"return W[row * uniforms.wShape[3] + colIn];\";case 4:return\"return W[row * uniforms.wShape[3] / 4 + colIn];\";default:throw new Error(`innerElementSize ${A} is not supported.`)}},m=r?`\n let coord = vec4(batch, xRow, xCol, xCh);\n `:`\n let coord = vec4(batch, xCh, xRow, xCol);\n `,f=r?`\n let coords = vec4(\n batch,\n row / outWidth,\n row % outWidth,\n col);\n `:`\n let coords = vec4(\n batch,\n row,\n col / outWidth,\n col % outWidth);\n `,d=r?\"uniforms.xShape[1]\":\"uniforms.xShape[2]\",h=r?\"uniforms.xShape[2]\":\"uniforms.xShape[3]\",g=r?\"row\":\"col\",y=r?\"col\":\"row\",b=`\n let inChannels = uniforms.wShape[2];\n let outWidth = ${r?\"uniforms.outShape[2]\":\"uniforms.outShape[3]\"};\n let outRow = ${g} / outWidth;\n let outCol = ${g} % outWidth;\n\n let WRow = ${y} / (uniforms.filterDims[1] * inChannels);\n let WCol = ${y} / inChannels % uniforms.filterDims[1];\n let xRow = outRow * uniforms.stride[0] + uniforms.dilation[0] * WRow - uniforms.pad[0];\n let xCol = outCol * uniforms.stride[1] + uniforms.dilation[1] * WCol - uniforms.pad[1];\n let xCh = ${y} % inChannels;\n var resData = ${vt(i)}(0.0);\n // The bounds checking is always needed since we use it to pad zero for\n // the 'same' padding type.\n if (xRow >= 0 && xRow < ${d} && xCol >= 0 && xCol < ${h}) {\n ${m}\n let xIndex = getIndexFromCoords4D(coord, uniforms.xShape);\n ${c(i)}\n }\n return resData;`,C=r?e&&o?`\n let col = colIn * ${i};\n ${b}`:`\n let col = colIn * ${i};\n if (row < uniforms.dimAOuter && col < uniforms.dimInner) {\n ${b}\n }\n return ${vt(i)}(0.0);`:o&&t?`\n let col = colIn * ${i};\n ${b}`:`\n let col = colIn * ${i};\n if (row < uniforms.dimInner && col < uniforms.dimBOuter) {\n ${b}\n }\n return ${vt(i)}(0.0);`,w=`${l(p)}`,k=vt(u),_=r?vt(i):vt(p),E=r?vt(p):vt(i);return`\n ${ur(s,a,u===4,4)}\n fn mm_readA(batch: i32, row : i32, colIn : i32) -> ${_} {\n ${r?C:w}\n }\n\n fn mm_readB(batch: i32, row : i32, colIn : i32) -> ${E} {\n ${r?w:C}\n }\n\n fn mm_write(batch: i32, row : i32, colIn : i32, valueIn : ${k}) {\n let col = colIn * ${u};\n if (row < uniforms.dimAOuter && col < uniforms.dimBOuter)\n {\n var value = valueIn;\n let outWidth = ${r?\"uniforms.outShape[2]\":\"uniforms.outShape[3]\"};\n ${f}\n ${Kr(n,s)}\n setOutputAtCoords(coords[0], coords[1], coords[2], coords[3], value);\n }\n }`}var ox=class{constructor(e,t,o,n,s=!1,a=null,i=!1,p=!1){this.variableNames=[\"x\",\"W\"],this.uniforms=\"filterDims : vec2, pad : vec2, stride : vec2, dilation : vec2, dimAOuter : i32, dimBOuter : i32, dimInner : i32,\",this.outputShape=e.outShape,this.isChannelsLast=e.dataFormat===\"channelsLast\",this.isVec4=((e.inChannels%4===0||e.inChannels%3===0)&&this.isChannelsLast||e.outWidth%4===0&&!this.isChannelsLast)&&e.outChannels%4===0,this.dispatchLayout=this.isChannelsLast?{x:[3],y:[1,2],z:[0]}:{x:[2,3],y:[1],z:[0]},this.workGroupSize=Hl(this.dispatchLayout,this.outputShape,this.isVec4),this.elementsPerThread=ql(this.dispatchLayout,this.outputShape,this.isVec4),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize,this.elementsPerThread),this.isVec4?(this.isChannelsLast&&e.inChannels%4!==0?(this.innerElementSize=3,this.variableTypes=[\"f32\",\"vec4\"]):(this.innerElementSize=4,this.variableTypes=[\"vec4\",\"vec4\"]),s&&(this.variableNames.push(\"bias\"),this.variableTypes.push(\"vec4\")),i&&(this.variableNames.push(\"preluActivationWeights\"),this.variableTypes.push(\"vec4\"))):(this.innerElementSize=this.elementsPerThread[0],s&&this.variableNames.push(\"bias\"),i&&this.variableNames.push(\"preluActivationWeights\")),this.sequentialAccessByThreads=p,this.addBias=s,this.activation=a,this.hasPreluActivationWeights=i,this.tileAOuter=this.workGroupSize[1]*this.elementsPerThread[1],this.tileBOuter=this.workGroupSize[0]*this.elementsPerThread[0],this.tileInner=Math.max(this.workGroupSize[0]*this.innerElementSize,this.workGroupSize[1]),this.fitAOuter=t%this.tileAOuter===0,this.fitBOuter=o%this.tileBOuter===0,this.fitInner=n%this.tileInner===0,this.shaderKey=`conv2DMM_${this.elementsPerThread}_${this.activation}}_${this.fitAOuter}_${this.fitBOuter}_${this.fitInner}_${this.isVec4}_${this.innerElementSize}_${this.isChannelsLast}_${this.sequentialAccessByThreads}`}getUserCode(){let e=this.isVec4?Uu(this.elementsPerThread,this.workGroupSize,!this.isChannelsLast,this.tileInner):Gu(this.elementsPerThread,this.workGroupSize,!this.isChannelsLast,this.tileInner,!1,null,this.sequentialAccessByThreads),t=this.isVec4?[this.innerElementSize,4,4]:[1,1,1];return`\n ${eoe(this.isChannelsLast,this.fitAOuter,this.fitBOuter,this.fitInner,this.addBias,this.activation,this.hasPreluActivationWeights,t[0],t[1],t[2])}\n ${e}\n `}};var nx=class{constructor(e,t=!1,o=null,n=!1){this.variableNames=[\"x\",\"W\"],this.uniforms=\"filterDims: vec2, pad: vec2, stride: vec2, dilation: vec2,\",this.workGroupSize=[4,4,8],this.outputShape=e.outShape,this.isChannelsLast=e.dataFormat===\"channelsLast\",this.dispatchLayout=this.isChannelsLast?{x:[2],y:[1],z:[0,3]}:{x:[3],y:[2],z:[0,1]},this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.addBias=t,this.activation=o,this.hasPreluActivationWeights=n,t&&this.variableNames.push(\"bias\"),n&&this.variableNames.push(\"preluActivationWeights\"),this.shaderKey=`conv2dnaive_${this.activation}_${this.isChannelsLast}`}getUserCode(){return`\n ${ur(this.activation,this.hasPreluActivationWeights,!1,4)}\n fn readInp(batch : i32, row : i32, col : i32, chan : i32) -> f32{\n let coords = vec4(batch, row, col, chan);\n if (coordsInBounds4D(coords, uniforms.xShape)) {\n return getX(batch, row, col, chan);\n } else {\n return 0.0;\n }\n }\n fn readFilt(row : i32, col : i32, xChannel : i32, outChannel : i32) -> f32{\n let coords = vec4(row, col, xChannel, outChannel);\n if(coordsInBounds4D(coords, uniforms.wShape)) {\n return getW(row, col, xChannel, outChannel);\n } else {\n return 0.0;\n }\n }\n fn writeResult(batch : i32, row : i32, col : i32, chan : i32, valueIn : f32) {\n let coords = ${this.isChannelsLast?\"vec4(batch, row, col, chan);\":\"vec4(batch, chan, row, col);\"}\n if (coordsInBounds4D(coords, uniforms.outShape)) {\n var value = valueIn;\n ${Kr(this.addBias,this.activation)}\n setOutputAtCoords(coords.x, coords.y, coords.z, coords.w, value);\n }\n }\n ${ue(\"index\")} {\n let coords = getOutputCoords();\n let batch = coords[0];\n let outChannel = ${this.isChannelsLast?\"coords[3];\":\"coords[1];\"}\n let outRow = ${this.isChannelsLast?\"coords[1];\":\"coords[2];\"}\n let outCol = ${this.isChannelsLast?\"coords[2];\":\"coords[3];\"}\n var acc : f32 = 0.0;\n for (var row = 0; row < uniforms.filterDims[0]; row = row + 1) {\n for (var col = 0; col < uniforms.filterDims[1]; col = col + 1) {\n let xRow = outRow * uniforms.stride[0] + uniforms.dilation[0] * row - uniforms.pad[0];\n let xCol = outCol * uniforms.stride[1] + uniforms.dilation[1] * col - uniforms.pad[1];\n for (var xChannel = 0; xChannel < ${this.isChannelsLast?\"uniforms.xShape[3];\":\"uniforms.xShape[1];\"} xChannel = xChannel + 1) {\n ${this.isChannelsLast?\"let v = readInp(batch, xRow, xCol, xChannel);\":\"let v = readInp(batch, xChannel, xRow, xCol);\"}\n let f = readFilt(row, col, xChannel, outChannel);\n acc = acc + v * f;\n }\n }\n }\n writeResult(batch, outRow, outCol, outChannel, acc);\n }\n `}};function zL(r,e){let t=r.length;return t>=3?e?[...r.slice(0,-3),r[t-3]*r[t-2],r[t-1]]:[...r.slice(0,-3),r[t-3],r[t-2]*r[t-1]]:!e&&t===1&&r[0]>1?[r[0],1]:null}function toe({x:r,filter:e,convInfo:t,backend:o,bias:n=null,preluActivationWeights:s=null,leakyreluAlpha:a=0,activation:i=null}){let p=t.dataFormat===\"channelsLast\",u=!p,c=!1,l=p&&t.filterHeight===t.inHeight&&t.filterWidth===t.inWidth&&t.padInfo.type===\"VALID\",m=[],f,d;if(l){let y=t.inHeight*t.inWidth*t.inChannels;f=xe({inputs:{x:r},backend:o,attrs:{shape:[1,t.batchSize,y]}}),d=xe({inputs:{x:e},backend:o,attrs:{shape:[1,y,t.outChannels]}})}else f=xe({inputs:{x:r},backend:o,attrs:{shape:p?[t.batchSize,t.inHeight*t.inWidth,t.inChannels]:[t.batchSize,t.inChannels,t.inHeight*t.inWidth]}}),d=xe({inputs:{x:e},backend:o,attrs:{shape:[1,t.inChannels,t.outChannels]}});if(m.push(f),m.push(d),s!=null){let y=zL(s.shape,p);y!=null&&(s=xe({inputs:{x:s},backend:o,attrs:{shape:y}}),m.push(s))}if(n!=null){let y=zL(n.shape,p);y!=null&&(n=xe({inputs:{x:n},backend:o,attrs:{shape:y}}),m.push(n))}let h=_c({a:p?f:d,b:p?d:f,transposeA:u,transposeB:c,backend:o,bias:n,activation:i,preluActivationWeights:s,leakyreluAlpha:a}),g=xe({inputs:{x:h},backend:o,attrs:{shape:t.outShape}});m.push(h);for(let y of m)o.disposeData(y.dataId);return g}function sx({x:r,filter:e,convInfo:t,backend:o,bias:n=null,preluActivationWeights:s=null,leakyreluAlpha:a=0,activation:i=null}){let p=n!=null,u=s!=null,c=t.dataFormat===\"channelsLast\",l=c&&t.filterHeight===t.inHeight&&t.filterWidth===t.inWidth&&t.padInfo.type===\"VALID\",m=P().getBool(\"WEBGPU_USE_NAIVE_CONV2D_DEBUG\");if(!m&&(l||t.filterHeight===1&&t.filterWidth===1&&t.dilationHeight===1&&t.dilationWidth===1&&t.strideHeight===1&&t.strideWidth===1&&(t.padInfo.type===\"SAME\"||t.padInfo.type===\"VALID\")))return toe({x:r,filter:e,convInfo:t,backend:o,bias:n,activation:i,preluActivationWeights:s,leakyreluAlpha:a});let f,d=[t.padInfo.top,t.padInfo.left],h=[{type:\"int32\",data:[t.filterHeight,t.filterWidth]},{type:\"int32\",data:[...d]},{type:\"int32\",data:[t.strideHeight,t.strideWidth]},{type:\"int32\",data:[t.dilationHeight,t.dilationWidth]}];if(m)f=new nx(t,p,i,u);else{let C=c?t.outHeight*t.outWidth:t.outChannels,w=c?t.outChannels:t.outHeight*t.outWidth,k=t.filterHeight*t.filterWidth*t.inChannels;h.push({type:\"int32\",data:[C]},{type:\"int32\",data:[w]},{type:\"int32\",data:[k]});let _=o.adapterInfo.isIntel();f=new ox(t,C,w,k,p,i,u,_)}let g=[],y=[r,e];p&&(!c&&n.shape.length===1&&(n=xe({inputs:{x:n},backend:o,attrs:{shape:[n.shape[0],1,1]}}),g.push(n)),y.push(n)),u&&(!c&&s.shape.length===1&&(s=xe({inputs:{x:s},backend:o,attrs:{shape:[s.shape[0],1,1]}}),g.push(s)),y.push(s)),i===\"leakyrelu\"&&(h.push({type:\"float32\",data:[a]}),f.uniforms+=\" alpha : f32,\");let b=o.runWebGPUProgram(f,y,r.dtype,h);for(let C of g)o.disposeData(C.dataId);return b}function roe(r){let{inputs:e,attrs:t,backend:o}=r,{x:n,filter:s}=e,{strides:a,pad:i,dataFormat:p,dilations:u,dimRoundingMode:c}=t,l=I.convertConv2DDataFormat(p),m=I.computeConv2DInfo(n.shape,s.shape,a,u,i,c,!1,l);return sx({x:n,filter:s,convInfo:m,backend:o})}var WL={kernelName:ln,backendName:\"webgpu\",kernelFunc:roe};function ooe(r=4){let e=s=>{switch(s){case 1:return\"return W[getIndexFromCoords4D(coord, uniforms.wShape)];\";case 4:return`\n let coord1 = vec4(coordX, coordY, col + 1, rowInner);\n let coord2 = vec4(coordX, coordY, col + 2, rowInner);\n let coord3 = vec4(coordX, coordY, col + 3, rowInner);\n let v0 = W[getIndexFromCoords4D(coord, uniforms.wShape)];\n let v1 = W[getIndexFromCoords4D(coord1, uniforms.wShape)];\n let v2 = W[getIndexFromCoords4D(coord2, uniforms.wShape)];\n let v3 = W[getIndexFromCoords4D(coord3, uniforms.wShape)];\n return vec4(v0, v1, v2, v3);\n `;default:throw new Error(`innerElementSize ${s} is not supported.`)}},o=`if (row < uniforms.dimAOuter && col < uniforms.dimInner) {\n ${`\n let outRow = row / uniforms.outShape[2];\n let outCol = row % uniforms.outShape[2];\n\n let WRow = col / (uniforms.filterDims[1] * uniforms.outBackprop[3]);\n let WCol = col / uniforms.outBackprop[3] % uniforms.filterDims[1];\n let xR = f32(outRow - uniforms.pads[0] + WRow) / f32(uniforms.stride[0]);\n let xC = f32(outCol - uniforms.pads[1] + WCol) / f32(uniforms.stride[1]);\n if (xR < 0.0 || xR >= f32(uniforms.outBackprop[1]) || fract(xR) > 0.0) {\n return ${vt(r)}(0.0);\n }\n if (xC < 0.0 || xC >= f32(uniforms.outBackprop[2]) || fract(xC) > 0.0) {\n return ${vt(r)}(0.0);\n }\n let coord = vec4(\n batch,\n i32(xR),\n i32(xC),\n col % uniforms.outBackprop[3]);\n return x[getIndexFromCoords4D(coord, uniforms.xShape)/${r}];`}\n }\n return ${vt(r)}(0.0);`;return`\n fn mm_readA(batch: i32, row : i32, colIn : i32) -> ${vt(r)} {\n let col = colIn * ${r};\n ${o}\n }\n\n fn mm_readB(batch: i32, row : i32, colIn : i32) -> ${vt(r)} {\n let col = colIn * ${r};\n let coordX = uniforms.filterDims.x - 1 -\n row / (uniforms.filterDims[1] * uniforms.outBackprop[3]);\n let coordY = uniforms.filterDims.y - 1 -\n (row / uniforms.outBackprop[3]) % uniforms.filterDims[1];\n if (row < uniforms.dimInner && col < uniforms.dimBOuter &&\n coordX >= 0 && coordY >= 0) {\n let rowInner = row % uniforms.outBackprop[3];\n let coord = vec4(coordX, coordY, col, rowInner);\n ${e(r)}\n }\n return ${vt(r)}(0.0);\n }\n\n fn mm_write(batch: i32, row : i32, colIn : i32, valueInput : ${vt(r)}) {\n let col = colIn * ${r};\n if (row < uniforms.dimAOuter && (col + ${r-1}) < uniforms.dimBOuter) {\n var value = valueInput;\n let outCoord = vec4(\n batch,\n row / uniforms.outShape[2],\n row % uniforms.outShape[2],\n col);\n result[getIndexFromCoords4D(outCoord, uniforms.outShape)/${r}] = value;\n }\n }`}var ax=class{constructor(e){this.variableNames=[\"x\",\"W\"],this.uniforms=\"filterDims : vec2, pads : vec2, stride : vec2, outBackprop : vec4, dimAOuter : i32, dimBOuter : i32, dimInner : i32,\",this.outputShape=e.inShape,x.assert(e.dataFormat===\"channelsLast\",()=>\"TODO: NCHW is unimplemented\"),this.isVec4=e.inChannels%4===0&&e.outChannels%4===0,this.dispatchLayout={x:[3],y:[1,2],z:[0]},this.workGroupSize=Hl(this.dispatchLayout,this.outputShape,this.isVec4),this.elementsPerThread=ql(this.dispatchLayout,this.outputShape,this.isVec4),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize,this.elementsPerThread),this.isVec4&&(this.variableTypes=[\"vec4\",\"f32\"]),this.shaderKey=`conv2DDerInputMM_${this.isVec4}_${this.elementsPerThread}`}getUserCode(){let e=this.isVec4?Uu(this.elementsPerThread,this.workGroupSize):Gu(this.elementsPerThread,this.workGroupSize);return`\n ${ooe(this.isVec4?4:1)}\n ${e}\n `}};var ix=class{constructor(e){this.variableNames=[\"dy\",\"W\"],this.uniforms=\"filterDims : vec2, pads : vec2, stride : vec2, outBackprop : vec4,\",this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=e.inShape,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.isChannelsLast=e.dataFormat===\"channelsLast\",this.shaderKey=`conv2DDerInput_${this.isChannelsLast}`}getUserCode(){let e=this.isChannelsLast?1:2,t=this.isChannelsLast?2:3,o=this.isChannelsLast?3:1;return`\n ${ue(\"index\")} {\n if(index < uniforms.size) {\n let coords = getCoordsFromIndex(index);\n let batch = coords[0];\n let d1 = coords[${o}];\n\n let dyCorner = vec2(coords[${e}], coords[${t}]) - uniforms.pads;\n let dyRCorner = dyCorner.x;\n let dyCCorner = dyCorner.y;\n\n // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1).\n // ? = to be determined. : = across all values in that axis.\n var dotProd = 0.0;\n for (var wR = 0; wR < uniforms.filterDims.x; wR = wR + 1) {\n let dyR = (f32(dyRCorner) + f32(wR)) / f32(uniforms.stride.x);\n let wRPerm = uniforms.filterDims.x - 1 - wR;\n if (dyR < 0.0 || dyR >= f32(uniforms.outBackprop[1]) || fract(dyR) > 0.0 ||\n wRPerm < 0) {\n continue;\n }\n let idyR = i32(dyR);\n\n for (var wC = 0; wC < uniforms.filterDims.y; wC = wC + 1) {\n let dyC = (f32(dyCCorner) + f32(wC)) / f32(uniforms.stride.y);\n let wCPerm = uniforms.filterDims.y - 1 - wC;\n if (dyC < 0.0 || dyC >= f32(uniforms.outBackprop[2]) ||\n fract(dyC) > 0.0 || wCPerm < 0) {\n continue;\n }\n let idyC = i32(dyC);\n\n for (var d2 = 0; d2 < uniforms.outBackprop[3]; d2 = d2 + 1) {\n if (${this.isChannelsLast}) {\n let xValue = getDy(batch, idyR, idyC, d2);\n let wValue = getW(wRPerm, wCPerm, d1, d2);\n dotProd = dotProd + xValue * wValue;\n } else {\n let xValue = getDy(batch, d2, idyR, idyC);\n let wValue = getW(wRPerm, wCPerm, d1, d2);\n dotProd = dotProd + xValue * wValue;\n }\n\n }\n }\n }\n setOutputAtIndex(index, dotProd);\n }\n }\n `}};function noe(r){let{inputs:e,backend:t,attrs:o}=r,{dy:n,filter:s}=e,{inputShape:a,strides:i,pad:p,dataFormat:u,dimRoundingMode:c}=o,l=I.convertConv2DDataFormat(u),m=I.computeConv2DInfo(a,s.shape,i,1,p,c,!1,l),f=[{type:\"int32\",data:[m.filterHeight,m.filterWidth]},{type:\"int32\",data:[m.filterHeight-1-m.padInfo.top,m.filterWidth-1-m.padInfo.left]},{type:\"int32\",data:[m.strideHeight,m.strideWidth]},{type:\"int32\",data:[m.batchSize,m.outHeight,m.outWidth,m.outChannels]}],d;if(P().getBool(\"WEBGPU_USE_NAIVE_CONV2D_TRANSPOSE\")||m.filterHeight<=2&&m.filterWidth<=2&&m.outChannels<=16&&m.inChannels===1)d=new ix(m);else{d=new ax(m);let h=m.inHeight*m.inWidth,g=m.inChannels,y=m.filterHeight*m.filterWidth*m.outChannels;f.push({type:\"uint32\",data:[h]},{type:\"uint32\",data:[g]},{type:\"uint32\",data:[y]})}return t.runWebGPUProgram(d,[n,s],\"float32\",f)}var UL={kernelName:mn,backendName:\"webgpu\",kernelFunc:noe};var soe=Ge({opType:pe.COS}),GL={kernelName:fn,backendName:\"webgpu\",kernelFunc:soe};var aoe=Ge({opType:pe.COSH}),HL={kernelName:dn,backendName:\"webgpu\",kernelFunc:aoe};var ux=class{constructor(e,t,o,n){this.variableNames=[\"Image\",\"Boxes\",\"BoxInd\"],this.uniforms=\"extrapolationValue : f32,\",this.workGroupSize=[64,1,1],this.size=!0;let[s]=t;this.outputShape=[s,o[0],o[1],e],this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.methodId=n===\"bilinear\"?1:0,this.cropHeightBiggerThan1=this.outputShape[1]>1,this.cropWidthBiggerThan1=this.outputShape[2]>1,this.shaderKey=`cropAndResize_${this.methodId}_${this.cropHeightBiggerThan1}_${this.cropWidthBiggerThan1}`}getUserCode(){let[e,t]=[\"f32(uniforms.imageShape[1] - 1)\",\"f32(uniforms.imageShape[2] - 1)\"],[o,n,s]=this.cropHeightBiggerThan1?[`(${e} / f32(uniforms.outShape[1] - 1))`,\"(y2-y1) * height_ratio\",`y1*${e} + f32(y)*(height_scale)`]:[\"0.0\",\"0.0\",`0.5 * (y1+y2) * ${e}`],[a,i,p]=this.cropWidthBiggerThan1?[`(${t} / f32(uniforms.outShape[2] - 1))`,\"(x2-x1) * width_ratio\",`x1*${t} + f32(x)*(width_scale)`]:[\"0.0\",\"0.0\",`0.5 * (x1+x2) * ${t}`];return`\n ${ue(\"index\")} {\n if (index < uniforms.size) {\n let coords = getCoordsFromIndex(index);\n let height_ratio = f32(${o});\n let width_ratio = f32(${a});\n let b = coords[0];\n let y = coords[1];\n let x = coords[2];\n let d = coords[3];\n // get box vals\n let y1 = getBoxes(b, 0);\n let x1 = getBoxes(b, 1);\n let y2 = getBoxes(b, 2);\n let x2 = getBoxes(b, 3);\n // get image in batch index\n let bInd = i32(round(getBoxInd(b)));\n if(bInd < 0 || bInd >= uniforms.outShape[0]) {\n return;\n }\n let height_scale = ${n};\n let width_scale = ${i};\n let in_y = ${s};\n if( in_y < 0.0 || in_y > ${e} ) {\n setOutputAtIndex(index, uniforms.extrapolationValue);\n return;\n }\n let in_x = ${p};\n if( in_x < 0.0 || in_x > ${t} ) {\n setOutputAtIndex(index, uniforms.extrapolationValue);\n return;\n }\n let sourceFracIndexCR = vec2(in_x,in_y);\n if(${this.methodId} == 1) {\n // Compute the four integer indices.\n let sourceFloorCR = vec2(sourceFracIndexCR);\n let sourceCeilCR = vec2(ceil(sourceFracIndexCR));\n let topLeft = getImage(bInd, sourceFloorCR.y, sourceFloorCR.x, d);\n let bottomLeft = getImage(bInd, sourceCeilCR.y, sourceFloorCR.x, d);\n let topRight = getImage(bInd, sourceFloorCR.y, sourceCeilCR.x, d);\n let bottomRight = getImage(bInd, sourceCeilCR.y, sourceCeilCR.x, d);\n let fracCR = sourceFracIndexCR - vec2(sourceFloorCR);\n let top = topLeft + (topRight - topLeft) * fracCR.x;\n let bottom = bottomLeft + (bottomRight - bottomLeft) * fracCR.x;\n let newValue = top + (bottom - top) * fracCR.y;\n setOutputAtIndex(index, newValue);\n } else {\n // Compute the coordinators of nearest neighbor point.\n let sourceNearestCR = vec2(floor(\n sourceFracIndexCR + vec2(0.5,0.5)));\n let newValue = getImage(\n bInd, sourceNearestCR.y, sourceNearestCR.x, d);\n setOutputAtIndex(index, newValue);\n }\n }\n }\n `}};var ioe=r=>{let{inputs:e,backend:t,attrs:o}=r,{image:n,boxes:s,boxInd:a}=e,{cropSize:i,method:p,extrapolationValue:u}=o,c=new ux(n.shape[3],s.shape,i,p),l=[{type:\"float32\",data:[u]}];return t.runWebGPUProgram(c,[n,s,a],\"float32\",l)},qL={kernelName:xn,backendName:\"webgpu\",kernelFunc:ioe};var Ku;(function(r){r.Prod=\"*\",r.Sum=\"+\"})(Ku||(Ku={}));var tm=class{constructor(e,t,o,n){this.variableNames=[\"x\"],this.uniforms=\"index : f32,\",this.size=!0;let s=128;this.workGroupSize=[s,1,1],this.outputShape=t,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.exclusive=o,this.reverse=n,this.op=e,this.shaderKey=`cum_${this.op}_${this.exclusive}_${this.reverse}`}getUserCode(){let e=this.outputShape.length,t=this.op===Ku.Prod?\"1.0\":\"0.0\",o=this.exclusive?t:`getX(${KL(e,\"coords\",this.op)})`,n=this.outputShape[this.outputShape.length-1],s=\"\",a=\"\";return this.exclusive?(s=this.reverse?`end != ${n-1}`:\"end != 0\",a=this.reverse?\"end + 1\":\"end - 1\"):(s=this.reverse?`end + pow2 < ${n}`:\"end >= pow2\",a=this.reverse?\"end + pow2\":\"end - pow2\"),`\n ${ue(\"index\")} {\n if (index < uniforms.size) {\n var coords = getCoordsFromIndex(index);\n\n let end = ${jL(e,\"coords\",this.op)};\n var val = ${o};\n let pow2 = i32(pow(2.0, uniforms.index));\n if (${s}) {\n let idx = ${a};\n ${jL(e,\"coords\",this.op)} = idx;\n val ${this.op}= getX(${KL(e,\"coords\",this.op)});\n }\n setOutputAtIndex(index, val);\n }\n }\n `}};function KL(r,e,t){if(r===1)return`${e}`;if(r===2)return`${e}.x, ${e}.y`;if(r===3)return`${e}.x, ${e}.y, ${e}.z`;if(r===4)return`${e}.x, ${e}.y, ${e}.z, ${e}.w`;throw Error(`Cumulative ${t} for rank ${r} is not yet supported`)}function jL(r,e,t){if(r===1)return`${e}`;if(r===2)return`${e}.y`;if(r===3)return`${e}.z`;if(r===4)return`${e}.w`;throw Error(`Cumulative ${t} for rank ${r} is not yet supported`)}function px(r,e,t,o,n,s){let a=e.shape.length,i=I.getAxesPermutation([o],a),p=e;i!=null&&(p=Nr({inputs:{x:e},backend:t,attrs:{perm:i}}));let u=I.getInnerMostAxes(1,a)[0];if(u!==a-1)throw new Error(`WebGPU cumprod shader expects an inner-most axis=${e.shape.length-1} but got axis=${o}`);let c=p.shape[u],l=Lt({inputs:{x:p},backend:t});for(let m=0;m<=Math.ceil(Math.log2(c))-1;m++){let f=new tm(r,p.shape,!1,s),d=l,h=[{type:\"float32\",data:[m]}];l=t.runWebGPUProgram(f,[l],l.dtype,h),t.disposeData(d.dataId)}if(n){let m=new tm(r,p.shape,n,s),f=l,d=[{type:\"float32\",data:[0]}];l=t.runWebGPUProgram(m,[l],l.dtype,d),t.disposeData(f.dataId)}if(i!=null){let m=I.getUndoAxesPermutation(i),f=Nr({inputs:{x:l},backend:t,attrs:{perm:m}});return t.disposeData(l.dataId),t.disposeData(p.dataId),f}return l}function uoe(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s,exclusive:a,reverse:i}=o;return px(Ku.Prod,n,t,s,a,i)}var XL={kernelName:hn,backendName:\"webgpu\",kernelFunc:uoe};function poe(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s,exclusive:a,reverse:i}=o;return px(Ku.Sum,n,t,s,a,i)}var YL={kernelName:gn,backendName:\"webgpu\",kernelFunc:poe};var cx=class{constructor(e,t){this.variableNames=[\"x\"],this.workGroupSize=[64,1,1],this.size=!0,this.uniforms=\"blockSize : i32,\",this.outputShape=e,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey=`depthToSpace_${t}`,this.dataFormat=t}getUserCode(){return`\n ${ue(\"index\")} {\n if (index < uniforms.size) {\n let coords = getCoordsFromIndex(index);\n let b = coords[0];\n let h = ${this.getHeightCoordString()};\n let w = ${this.getWidthCoordString()};\n let d = ${this.getDepthCoordString()};\n\n let in_h = h / uniforms.blockSize;\n let offset_h = h % uniforms.blockSize;\n let in_w = w / uniforms.blockSize;\n let offset_w = w % uniforms.blockSize;\n let offset_d = (offset_h * uniforms.blockSize + offset_w) *\n ${this.getOutputDepthSize()};\n let in_d = d + offset_d;\n\n let rlt = ${this.getInputSamplingString()};\n setOutputAtIndex(index, rlt);\n }\n }`}getHeightCoordString(){return this.dataFormat===\"NHWC\"?\"coords[1]\":\"coords[2]\"}getWidthCoordString(){return this.dataFormat===\"NHWC\"?\"coords[2]\":\"coords[3]\"}getDepthCoordString(){return this.dataFormat===\"NHWC\"?\"coords[3]\":\"coords[1]\"}getOutputDepthSize(){return this.dataFormat===\"NHWC\"?\"uniforms.outShape[3]\":\"uniforms.outShape[1]\"}getInputSamplingString(){return this.dataFormat===\"NHWC\"?\"getX(b, in_h, in_w, in_d)\":\"getX(b, in_d, in_h, in_w)\"}};function coe(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{blockSize:s,dataFormat:a}=o,i=n.shape[0],p=a===\"NHWC\"?n.shape[1]:n.shape[2],u=a===\"NHWC\"?n.shape[2]:n.shape[3],c=a===\"NHWC\"?n.shape[3]:n.shape[1],l=p*s,m=u*s,f=c/(s*s),d=a===\"NHWC\"?[i,l,m,f]:[i,f,l,m],h=[{type:\"int32\",data:[s]}],g=new cx(d,a);return t.runWebGPUProgram(g,[n],n.dtype,h)}var QL={kernelName:yn,backendName:\"webgpu\",kernelFunc:coe};var lx=class{constructor(e,t,o,n=!1,s=null,a=!1){this.variableNames=[\"x\",\"W\"],this.uniforms=\"pad : vec2, inDims : vec2,\",this.workGroupSize=[16,16,1],this.outputShape=e,this.dispatchLayout={x:[3],y:[2],z:[0,1]},this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),n&&this.variableNames.push(\"bias\"),a&&this.variableNames.push(\"preluActivationWeights\"),this.addBias=n,this.activation=s,this.hasPreluActivation=a,this.filterHeight=t,this.filterWidth=o,this.shaderKey=`depthwiseNCHW_${this.activation}_${this.filterHeight}_${this.filterWidth}`}getUserCode(){let e=this.filterWidth*this.filterHeight,t=this.workGroupSize[0]*this.workGroupSize[1]*this.workGroupSize[2],o=this.workGroupSize[1]+this.filterHeight-1,n=this.workGroupSize[0]+this.filterWidth-1;return`\n ${ur(this.activation,this.hasPreluActivation,!1,4)}\n\n var mm_Asub : array, ${o}>;\n var mm_Bsub : array, ${this.filterHeight}>;\n fn readX(batch : i32, channel : i32, row : i32, col : i32) -> f32 {\n var value = 0.0;\n if (row >=0 && row < uniforms.inDims[0] && col >=0 && col < uniforms.inDims[1])\n {\n value = getX(batch, channel, row, col);\n }\n return value;\n }\n\n ${Ri()}\n fn _start(@builtin(local_invocation_id) LocalId : vec3,\n @builtin(global_invocation_id) GlobalId : vec3,\n @builtin(local_invocation_index) LocalIndex: u32,\n @builtin(num_workgroups) NumWorkgroups: vec3) {\n localId = LocalId;\n globalId = GlobalId;\n let localIndex = i32(LocalIndex);\n numWorkgroups = NumWorkgroups;\n let coords = getOutputCoords();\n let batch = coords[0];\n let xRCCorner = vec2(coords.zw) - uniforms.pad;\n let channelMul = uniforms.wShape[3];\n let d1 = coords[1] / channelMul;\n let q = coords[1] % channelMul;\n\n let inputRowStart = xRCCorner.x;\n let inputColStart = xRCCorner.y;\n\n let localRow = i32(localId.y);\n let localCol = i32(localId.x);\n\n // Load one tile of X into local memory.\n for (var inputRow = localRow; inputRow < ${o}; inputRow = inputRow + ${this.workGroupSize[1]}) {\n for (var inputCol = localCol; inputCol < ${n}; inputCol = inputCol + ${this.workGroupSize[0]}) {\n let rowOffset = inputRow - localRow;\n let colOffset = inputCol - localCol;\n mm_Asub[inputRow][inputCol] = readX(batch, d1, inputRowStart + rowOffset, inputColStart + colOffset);\n }\n }\n\n // Load one tile of W into local memory.\n var wIndex = localIndex;\n ${e, inDims : vec2,\",this.workGroupSize=[4,4,4],this.workPerThread=4,this.isVec4=!0,this.outputShape=e.outShape,this.dispatchLayout={x:[3],y:[2],z:[0,1]},this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize,[4,this.workPerThread,1]),x.assert(e.dataFormat===\"channelsLast\",()=>\"TODO: NCHW is unimplemented\"),t&&this.variableNames.push(\"bias\"),n&&this.variableNames.push(\"preluActivationWeights\"),this.convInfo=e,this.addBias=t,this.activation=o,this.hasPreluActivation=n,this.shaderKey=`depthwiseVec4_${o}_${this.convInfo.filterHeight}_${this.convInfo.filterWidth}_${this.convInfo.strideHeight}_${this.convInfo.strideWidth}_${this.workPerThread}`}getUserCode(){let e=(this.workPerThread-1)*this.convInfo.strideWidth+this.convInfo.filterWidth;return`\n ${ur(this.activation,this.hasPreluActivation,!0,4)}\n fn readX(batch : i32, row : i32, col : i32, channel : i32) -> vec4 {\n var value = vec4(0.0);\n if (col >=0 && col < uniforms.inDims[1]) {\n value = getX(batch, row, col, channel);\n }\n return value;\n }\n\n const strideHeight = ${this.convInfo.strideHeight};\n const strideWidth = ${this.convInfo.strideWidth};\n ${Ri()}\n fn _start(@builtin(global_invocation_id) globalId: vec3) {\n let batch = i32(globalId.z) / uniforms.outShape[1];\n let r = i32(globalId.z) % uniforms.outShape[1];\n let c = i32(globalId.y) * ${this.workPerThread};\n let d1 = i32(globalId.x) * 4;\n let xRCCorner = vec2(r, c) * vec2(strideHeight, strideWidth) - uniforms.pad;\n\n let xRCorner = xRCCorner.x;\n let xCCorner = xRCCorner.y;\n var xVals : array, ${e}>;\n var dotProd : array, ${this.workPerThread}>;\n for (var i = 0; i < ${this.workPerThread}; i++) {\n dotProd[i] = vec4(0.0);\n }\n\n // Use constant instead of uniform can give better performance.\n for (var wR = 0; wR < ${this.convInfo.filterHeight}; wR = wR + 1) {\n let xR = xRCorner + wR;\n if (xR >=0 && xR < uniforms.inDims[0]) {\n for (var i = 0; i < ${e}; i++) {\n xVals[i] = readX(batch, xR, xCCorner + i, d1);\n }\n for (var wC = 0; wC < ${this.convInfo.filterWidth}; wC = wC + 1) {\n let wValue = getW(wR, wC, d1, 0);\n for (var i = 0; i < ${this.workPerThread}; i++) {\n dotProd[i] = fma(xVals[i * strideWidth + wC], wValue, dotProd[i]);\n }\n }\n }\n }\n\n for (var i = 0; i < ${this.workPerThread}; i = i + 1) {\n let coords = vec4(batch, r, c + i, d1);\n if (coordsInBounds4D(coords, uniforms.outShape)) {\n var value = dotProd[i];\n ${Kr(this.addBias,this.activation)}\n setOutputAtCoords(coords[0], coords[1], coords[2], coords[3], value);\n }\n }\n }\n `}};var Pc=class{constructor(e,t=!1,o=null,n=!1){this.variableNames=[\"x\",\"W\"],this.uniforms=`pad : vec2, inDims : vec2, filterHeight : i32,\n filterWidth : i32, stride : vec2, dilation : vec2,`,this.workGroupSize=[256,1,1],this.outputShape=e.outShape,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.isChannelsLast=e.dataFormat===\"channelsLast\",t&&this.variableNames.push(\"bias\"),n&&this.variableNames.push(\"preluActivationWeights\"),this.convInfo=e,this.addBias=t,this.activation=o,this.hasPreluActivation=n,this.shaderKey=`depthwise_${this.activation}_${this.isChannelsLast}`}getUserCode(){let e=this.isChannelsLast?\"getX(batch, xR, xC, d1);\":\"getX(batch, d1, xR, xC);\";return`\n ${ur(this.activation,this.hasPreluActivation,!1,4)}\n\n ${ue()} {\n let coords = getOutputCoords();\n let batch = coords[0];\n let xRCCorner = vec2(coords.${this.isChannelsLast?\"yz\":\"zw\"}) * uniforms.stride - uniforms.pad;\n let d2 = coords[${this.isChannelsLast?3:1}];\n let channelMul = uniforms.wShape[3];\n let d1 = d2 / channelMul;\n let q = d2 % channelMul;\n\n let inputRowStart = xRCCorner.x;\n let inputColStart = xRCCorner.y;\n let inputRowEnd = inputRowStart + uniforms.filterHeight *\n uniforms.dilation[0];\n let inputColEnd = inputColStart + uniforms.filterWidth *\n uniforms.dilation[1];\n\n // Convolve x(?, ?, d1)|x(d1, ?, ?) with w(:, :, d1, q) to get\n // y(yR, yC, d2)|y(d2, yR, yC). ? = to be determined. : = across all\n // values in that axis. x(?, ?, d1) and y(yR, yC, d2) is for NHWC.\n // x(d1, ?, ?) and y(d2, yR, yC) is for NCHW.\n var value = 0.0;\n\n // Extract if checking out of for loop for performance.\n if (inputRowStart >= 0 && inputColStart >= 0 &&\n inputRowEnd < uniforms.inDims[0] &&\n inputColEnd < uniforms.inDims[1]) {\n for (var wR = 0; wR < uniforms.filterHeight; wR = wR + 1) {\n let xR = inputRowStart + wR * uniforms.dilation[0];\n\n for (var wC = 0; wC < uniforms.filterWidth; wC = wC + 1) {\n let xC = inputColStart + wC * uniforms.dilation[1];\n\n let xVal = ${e};\n let wVal = getW(wR, wC, d1, q);\n value = value + xVal * wVal;\n }\n }\n } else {\n for (var wR = 0; wR < uniforms.filterHeight; wR = wR + 1) {\n let xR = inputRowStart + wR * uniforms.dilation[0];\n\n if (xR < 0 || xR >= uniforms.inDims[0]) {\n continue;\n }\n\n for (var wC = 0; wC < uniforms.filterWidth; wC = wC + 1) {\n let xC = inputColStart + wC * uniforms.dilation[1];\n\n if (xC < 0 || xC >= uniforms.inDims[1]) {\n continue;\n }\n\n let xVal = ${e};\n let wVal = getW(wR, wC, d1, q);\n value = value + xVal * wVal;\n }\n }\n }\n ${Kr(this.addBias,this.activation)}\n if (coordsInBounds4D(coords, uniforms.outShape)) {\n setOutputAtCoords(coords[0], coords[1], coords[2], coords[3], value);\n }\n }\n `}};function loe(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,filter:s}=e,{strides:a,pad:i,dataFormat:p,dilations:u,dimRoundingMode:c}=o,l=I.convertConv2DDataFormat(p),m=u;m==null&&(m=[1,1]);let f=I.computeConv2DInfo(n.shape,s.shape,a,m,i,c,!0,l),d=[{type:\"int32\",data:[f.padInfo.top,f.padInfo.left]},{type:\"int32\",data:[f.inHeight,f.inWidth]}],h=f.dataFormat===\"channelsLast\",g;return!h&&f.inHeight>16&&f.inWidth>16&&f.strideHeight===1&&f.strideWidth===1&&f.dilationWidth===1&&f.dilationHeight===1&&f.inChannels===f.outChannels?g=new lx(f.outShape,f.filterHeight,f.filterWidth):h&&f.inHeight>4&&f.inWidth>4&&f.strideWidth<=2&&f.inChannels===f.outChannels&&f.dilationHeight===1&&f.dilationWidth===1&&f.inChannels%4===0?g=new Dc(f):(g=new Pc(f),d.push({type:\"int32\",data:[f.filterHeight]},{type:\"int32\",data:[f.filterWidth]},{type:\"int32\",data:[f.strideHeight,f.strideWidth]},{type:\"int32\",data:[f.dilationHeight,f.dilationWidth]})),t.runWebGPUProgram(g,[n,s],n.dtype,d)}var ZL={kernelName:bn,backendName:\"webgpu\",kernelFunc:loe};var BS=it({opType:ye.MUL,cpuKernelImpl:sL,supportsComplex:!0}),JL={kernelName:ho,backendName:\"webgpu\",kernelFunc:BS};function rm(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s,keepDims:a}=o;return Ys(n,s,a,\"sum\",t)}var eB={kernelName:jn,backendName:\"webgpu\",kernelFunc:rm};function moe(r){let{inputs:e,backend:t,attrs:o}=r,{equation:n}=o,s=e,{allDims:a,summedDims:i,idDims:p}=I.decodeEinsumEquation(n,s.length);I.checkEinsumDimSizes(a.length,p,s);let{path:u,steps:c}=I.getEinsumComputePath(i,p),l=c.length,m=null,f=a.length,d=[];for(let h=0;h=0&&(m=rm({inputs:{x:m},backend:t,attrs:{axis:u[h]-(a.length-f),keepDims:!1}}),d.push(m)),f--)}for(let h of d)h!==m&&t.disposeData(h.dataId);return m}var tB={kernelName:Xa,backendName:\"webgpu\",kernelFunc:moe};var foe=Ge({opType:pe.ELU}),rB={kernelName:In,backendName:\"webgpu\",kernelFunc:foe};var doe=it({opType:ye.EQUAL,dtype:\"bool\",cpuKernelImpl:HM}),oB={kernelName:oo,backendName:\"webgpu\",kernelFunc:doe};var VS=Ge({opType:pe.EXP,cpuKernelImpl:qM,dtype:\"float32\"}),nB={kernelName:no,backendName:\"webgpu\",kernelFunc:VS};function mx(r){let{inputs:e,attrs:t,backend:o}=r,{dim:n}=t,{input:s}=e,a=s.shape.length,i=s.shape.slice(),p=n;return n<0&&(x.assert(-(a+1)<=n,()=>`Axis must be in the interval [${-(a+1)}, ${a}]`),p=a+n+1),i.splice(p,0,1),xe({inputs:{x:s},backend:o,attrs:{shape:i}})}var sB={kernelName:xs,backendName:\"webgpu\",kernelFunc:mx};var hoe=Ge({opType:pe.EXPM1,cpuKernelImpl:KM}),aB={kernelName:wn,backendName:\"webgpu\",kernelFunc:hoe};var fx=class{constructor(e){this.outputShape=[],this.variableNames=[\"x\"],this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=e,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey=\"flipLeftRight\"}getUserCode(){return`\n ${ue(\"index\")} {\n if (index < uniforms.size) {\n let coords = getCoordsFromIndex(index);\n let coordX = uniforms.xShape[2] - coords[2] - 1;\n let outputValue = getX(coords[0], coords[1], coordX, coords[3]);\n setOutputAtIndex(index, outputValue);\n }\n }\n `}};var iB={kernelName:Sn,backendName:\"webgpu\",kernelFunc:({inputs:r,backend:e})=>{let{image:t}=r,o=e,n=new fx(t.shape);return o.runWebGPUProgram(n,[t],t.dtype)}};var goe=Ge({opType:pe.FLOOR,cpuKernelImpl:jM}),uB={kernelName:so,backendName:\"webgpu\",kernelFunc:goe};var xoe=it({opType:ye.INT_DIV,dtype:\"int32\"}),pB={kernelName:vn,backendName:\"webgpu\",kernelFunc:xoe};var dx=class{constructor(e,t,o=!1){this.isFromPixels=!0,this.outputShape=[0],this.variableNames=[],this.workGroupSize=[256,1,1],this.outputShape=e,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize,[t,1,1]),this.importVideo=o,this.shaderKey=`fromPixels_${this.importVideo}`}getUserCode(){let e=this.importVideo?\"textureLoad(src, vec2(coords.yx));\":\"textureLoad(src, vec2(coords.yx), 0)\";return`\n @binding(1) @group(0) var src: ${this.importVideo?\"texture_external\":\"texture_2d\"};\n ${ue(\"index\")} {\n let flatIndex = index * uniforms.numChannels;\n if (flatIndex < uniforms.size) {\n let coords = getCoordsFromIndex(flatIndex);\n let values = ${e};\n for (var i = 0; i < uniforms.numChannels; i = i + 1) {\n result[flatIndex + i] = i32(floor(255.0 * values[i]));\n }\n }\n }\n `}};var cB={kernelName:Zi,backendName:\"webgpu\",kernelFunc:yoe},Oc,zS=P().getBool(\"CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU\"),hx=new Map;function yoe(r){let{inputs:e,backend:t,attrs:o}=r,{pixels:n}=e,{numChannels:s}=o;if(n==null)throw new Error(\"pixels passed to tf.browser.fromPixels() can not be null\");let a=typeof HTMLVideoElement!=\"undefined\"&&n instanceof HTMLVideoElement,i=typeof HTMLImageElement!=\"undefined\"&&n instanceof HTMLImageElement,p=typeof HTMLCanvasElement!=\"undefined\"&&n instanceof HTMLCanvasElement||typeof OffscreenCanvas!=\"undefined\"&&n instanceof OffscreenCanvas,u=typeof ImageBitmap!=\"undefined\"&&n instanceof ImageBitmap,[c,l]=a?[n.videoWidth,n.videoHeight]:[n.width,n.height],m=[l,c,s],f=!1,d=a||i;if(u||p||d){let b;if(f){let D=n;if(!hx.has(D)||hx.get(D).expired){let O={source:D};hx.set(D,t.device.importExternalTexture(O))}b={width:c,height:l,format:null,usage:null,texture:hx.get(D)}}else{if(d){let L=P().getBool(\"CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU\");(Oc==null||L!==zS)&&(zS=L,Oc=document.createElement(\"canvas\").getContext(\"2d\",{willReadFrequently:zS})),Oc.canvas.width=c,Oc.canvas.height=l,Oc.drawImage(n,0,0,c,l),n=Oc.canvas}let D=GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING,O=\"rgba8unorm\",M=t.textureManager.acquireTexture(m[1],m[0],O,D);t.queue.copyExternalImageToTexture({source:n},{texture:M},[m[1],m[0]]),b={width:c,height:l,format:O,usage:D,texture:M}}let C=x.sizeFromShape(m),w=x.computeStrides(m),k=new dx(m,s,f),_=[{type:\"uint32\",data:[C]},{type:\"uint32\",data:[s]},{type:\"uint32\",data:[...w]}],E=t.makeTensorInfo([l,c],\"int32\"),R=t.tensorMap.get(E.dataId);R.resourceInfo=b;let A=t.runWebGPUProgram(k,[E],\"int32\",_);return t.disposeData(E.dataId),A}let h=n.data,g=h;if(s!=null&&s!==4){g=new Uint8Array(n.width*n.height*s);let b=h.length,C=0;for(let w=0;w(xValue, -meanValue, offsetValue), vec3(inv, inv, 1.0)));\n }\n }\n `}};var lB={kernelName:kn,backendName:\"webgpu\",kernelFunc:({inputs:r,attrs:e,backend:t})=>{let{x:o,scale:n,offset:s,mean:a,variance:i}=r,{varianceEpsilon:p}=e,u=t,c=[o,a,i],l=null;s!=null&&(l=s.shape,c.push(s));let m=null;n!=null&&(m=n.shape,c.push(n));let f=new gx(o.shape,a.shape,i.shape,l,m),d=[{type:\"float32\",data:[p]}];return u.runWebGPUProgram(f,c,o.dtype,d)}};function boe(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,filter:s,bias:a,preluActivationWeights:i}=e,{strides:p,pad:u,dataFormat:c,dilations:l,dimRoundingMode:m,activation:f,leakyreluAlpha:d}=o,h=I.convertConv2DDataFormat(c),g=I.computeConv2DInfo(n.shape,s.shape,p,l,u,m,!1,h);return sx({x:n,filter:s,convInfo:g,backend:t,bias:a,preluActivationWeights:i,leakyreluAlpha:d,activation:f})}var mB={kernelName:Do,backendName:\"webgpu\",kernelFunc:boe};function Coe(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,filter:s,bias:a,preluActivationWeights:i}=e,{strides:p,pad:u,dilations:c,dimRoundingMode:l,activation:m,leakyreluAlpha:f}=o,d=c;d==null&&(d=[1,1]),x.assert(I.eitherStridesOrDilationsAreOne(p,d),()=>`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${p} and dilations '${d}'`);let h=I.computeConv2DInfo(n.shape,s.shape,p,d,u,l,!0),g=[n,s],y=a!=null,b=i!=null;y&&g.push(a),b&&g.push(i);let C=[{type:\"int32\",data:[h.padInfo.top,h.padInfo.left]},{type:\"int32\",data:[h.inHeight,h.inWidth]}],w;return h.inHeight>4&&h.inWidth>4&&h.strideWidth<=2&&h.inChannels===h.outChannels&&h.dilationHeight===1&&h.dilationWidth===1&&h.inChannels%4===0?w=new Dc(h,y,m,b):(w=new Pc(h,y,m,b),C.push({type:\"int32\",data:[h.filterHeight]},{type:\"int32\",data:[h.filterWidth]},{type:\"int32\",data:[h.strideHeight,h.strideWidth]},{type:\"int32\",data:[h.dilationHeight,h.dilationWidth]})),m===\"leakyrelu\"&&(C.push({type:\"float32\",data:[f]}),w.uniforms+=\" alpha : f32,\"),t.runWebGPUProgram(w,g,\"float32\",C)}var fB={kernelName:Po,backendName:\"webgpu\",kernelFunc:Coe};var xx=class{constructor(e,t){this.variableNames=[\"A\",\"indices\"],this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=t,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey=`gathernd_${e}`,this.sliceDim=e,this.uniforms=`sliceDim : i32, strides : ${At(e)},`}getUserCode(){let e;return this.sliceDim>1?e=\"uniforms.strides[j]\":e=\"uniforms.strides\",`\n ${ue(\"index\")} {\n if (index < uniforms.size) {\n let coords = getCoordsFromIndex(index);\n var flattenIndex = 0;\n for (var j = 0; j < uniforms.sliceDim; j = j + 1) {\n let indexTemp = i32(round(getIndices(coords[0], j)));\n let strideNum = ${e};\n flattenIndex = flattenIndex + indexTemp * strideNum;\n }\n\n setOutputAtIndex(index, getA(flattenIndex, coords[1]));\n }\n }\n `}};function Ioe(r){let{inputs:e,backend:t}=r,{params:o,indices:n}=e,s=n.shape,a=s[s.length-1],i=x.sizeFromShape(o.shape),[p,u,c,l]=I.prepareAndValidate(o,n),m=xe({inputs:{x:n},backend:t,attrs:{shape:[u,a]}}),f=xe({inputs:{x:o},backend:t,attrs:{shape:[x.sizeFromShape(o.shape)/c,c]}});if(t.shouldExecuteOnCPU([o,n])||o.dtype===\"string\"){let b=t.readSync(n.dataId),C=t.bufferSync(o),w=XM(b,C,o.dtype,u,a,c,l,o.shape,i);return t.makeTensorInfo(p,o.dtype,w.values)}let d=new xx(a,[u,c]),h=[{type:\"int32\",data:[a]},{type:\"int32\",data:l}],g=t.runWebGPUProgram(d,[f,m],f.dtype,h),y=xe({inputs:{x:g},backend:t,attrs:{shape:p}});return t.disposeData(m.dataId),t.disposeData(f.dataId),t.disposeData(g.dataId),y}var dB={kernelName:Tn,backendName:\"webgpu\",kernelFunc:Ioe};var yx=class{constructor(e,t){this.variableNames=[\"A\",\"indices\"],this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=e.slice(),this.aShape=e,this.outputShape=t,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey=\"gather\"}getUserCode(){let e=woe(this.aShape);return`\n ${ue(\"index\")} {\n if (index < uniforms.size) {\n let resRC = getCoordsFromIndex(index);\n let indexZ = i32(getIndices(resRC.x, resRC.z));\n let inBounds = select(0.0, 1.0, indexZ >= 0 && indexZ < uniforms.aShape[2]);\n setOutputAtIndex(index, inBounds * getA(${e}));\n }\n }\n `}};function woe(r){let e=[\"resRC.x\",\"resRC.y\",\"resRC.z\",\"resRC.w\"],t=[];for(let o=0;ot.disposeData(A.dataId)),t.makeTensorInfo(u.outputShape,R.dtype,R.values)}let h=new yx(m.shape,d),g=t.runWebGPUProgram(h,[m,f],m.dtype);l.push(g);let y=xe({inputs:{x:g},backend:t,attrs:{shape:u.outputShape}});return l.forEach(b=>t.disposeData(b.dataId)),y}var hB={kernelName:bs,backendName:\"webgpu\",kernelFunc:WS};var Soe=it({opType:ye.GREATER,cpuKernelImpl:ZM,dtype:\"bool\"}),gB={kernelName:ao,backendName:\"webgpu\",kernelFunc:Soe};var voe=it({opType:ye.GREATER_EQUAL,dtype:\"bool\",cpuKernelImpl:QM}),xB={kernelName:io,backendName:\"webgpu\",kernelFunc:voe};var koe=Ge({opType:pe.IS_NAN,dtype:\"bool\"}),yB={kernelName:ia,backendName:\"webgpu\",kernelFunc:koe};function Toe(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{alpha:s}=o,a=[{type:\"float32\",data:[s]}],i=new Zo(n.shape,pe.LEAKYRELU);return i.uniforms=\"alpha : f32,\",t.runWebGPUProgram(i,[n],\"float32\",a)}var bB={kernelName:Nn,backendName:\"webgpu\",kernelFunc:Toe};var Noe=it({opType:ye.LESS,dtype:\"bool\",cpuKernelImpl:eL}),CB={kernelName:po,backendName:\"webgpu\",kernelFunc:Noe};var _oe=it({opType:ye.LESS_EQUAL,dtype:\"bool\",cpuKernelImpl:JM}),IB={kernelName:co,backendName:\"webgpu\",kernelFunc:_oe};var Eoe=Ge({opType:pe.LOG,cpuKernelImpl:tL}),wB={kernelName:lo,backendName:\"webgpu\",kernelFunc:Eoe};var $oe=it({opType:ye.LOGICAL_AND,dtype:\"bool\"}),SB={kernelName:_n,backendName:\"webgpu\",kernelFunc:$oe};var Roe=Ge({opType:pe.LOGICAL_NOT}),vB={kernelName:En,backendName:\"webgpu\",kernelFunc:Roe};var Aoe=it({opType:ye.MAX,cpuKernelImpl:oL}),kB={kernelName:mo,backendName:\"webgpu\",kernelFunc:Aoe};function Foe(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{filterSize:s,strides:a,pad:i,dimRoundingMode:p}=o,u=1,c=I.computePool2DInfo(n.shape,s,a,u,i,p);return Zg(n,c,\"max\",t)}var TB={kernelName:Rn,backendName:\"webgpu\",kernelFunc:Foe};function Doe(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s,keepDims:a}=o;return Ys(n,s,a,\"min\",t)}var NB={kernelName:Fn,backendName:\"webgpu\",kernelFunc:Doe};var Poe=it({opType:ye.MIN,cpuKernelImpl:nL}),_B={kernelName:fo,backendName:\"webgpu\",kernelFunc:Poe};var bx=class{constructor(e,t,o){this.uniforms=\"\",this.variableNames=[\"x\"],this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=t.map((n,s)=>n[0]+e[s]+n[1]),this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.xShape=e,t.map((n,s)=>{this.uniforms+=` pad${s} : vec2,`}),this.offset=o===\"reflect\"?0:1,this.shaderKey=`mirrorPad_${o}`}getUserCode(){let e=this.xShape.length,t=this.xShape.map((u,c)=>`uniforms.pad${c}[0]`).join(\",\"),o=this.xShape.map((u,c)=>`uniforms.pad${c}[0] + uniforms.xShape${e>1?`[${c}]`:\"\"}`).join(\",\"),n=e===1?\"start\":\"start[i]\",s=e===1?\"end\":\"end[i]\",a=e===1?\"outC\":\"outC[i]\",i=At(e),p=e>1?[\"coords[0]\",\"coords[1]\",\"coords[2]\",\"coords[3]\"].slice(0,e):\"coords\";return`\n ${ue(\"index\")} {\n if (index < uniforms.size) {\n let start = ${i}(${t});\n let end = ${i}(${o});\n var outC = getCoordsFromIndex(index);\n for (var i = 0; i < ${e}; i = i + 1) {\n if (${a} < ${n}) {\n ${a} = ${n} * 2 - ${a} - ${this.offset};\n } else if(${a} >= ${s}) {\n ${a} = (${s} - 1) * 2 - ${a} + ${this.offset};\n }\n }\n let coords = outC - start;\n setOutputAtIndex(index, getX(${p}));\n }\n }\n `}};var EB={kernelName:Dn,backendName:\"webgpu\",kernelFunc:({inputs:r,attrs:e,backend:t})=>{let{x:o}=r,{paddings:n,mode:s}=e,a=t,i=n.map(c=>({type:\"int32\",data:[c[0],c[1]]})),p=new bx(o.shape,n,s);return a.runWebGPUProgram(p,[o],o.dtype,i)}};function Ooe(r){let{inputs:e,backend:t}=r,{x:o}=e;if(t.shouldExecuteOnCPU([o])){let s=t.tensorMap.get(o.dataId),[a,i]=aL(s.values,o.shape,o.dtype);return t.makeTensorInfo(i,o.dtype,a)}let n=new Zo(o.shape,pe.NEG);return t.runWebGPUProgram(n,[o],o.dtype)}var $B={kernelName:Pn,backendName:\"webgpu\",kernelFunc:Ooe};function Moe(r){console.warn(\"tf.nonMaxSuppression() in webgpu locks the UI thread. Call tf.nonMaxSuppressionAsync() instead\");let{inputs:e,backend:t,attrs:o}=r,{boxes:n,scores:s}=e,{maxOutputSize:a,iouThreshold:i,scoreThreshold:p}=o,u=t.readSync(n.dataId),c=t.readSync(s.dataId),{selectedIndices:l}=Bt.nonMaxSuppressionV3Impl(u,c,a,i,p);return t.makeTensorInfo([l.length],\"int32\",new Int32Array(l))}var RB={kernelName:On,backendName:\"webgpu\",kernelFunc:Moe};function Loe(r){console.warn(\"tf.nonMaxSuppression() in webgpu locks the UI thread. Call tf.nonMaxSuppressionAsync() instead\");let{inputs:e,backend:t,attrs:o}=r,{boxes:n,scores:s}=e,{maxOutputSize:a,iouThreshold:i,scoreThreshold:p,softNmsSigma:u}=o,c=t.readSync(n.dataId),l=t.readSync(s.dataId),m=a,f=i,d=p,h=u,{selectedIndices:g,selectedScores:y}=Bt.nonMaxSuppressionV5Impl(c,l,m,f,d,h);return[t.makeTensorInfo([g.length],\"int32\",new Int32Array(g)),t.makeTensorInfo([y.length],\"float32\",new Float32Array(y))]}var AB={kernelName:Mn,backendName:\"webgpu\",kernelFunc:Loe};function om(r){let{inputs:e,backend:t}=r,{x:o}=e;if(o.dtype===\"complex64\"){let n=Wa({inputs:{input:o},backend:t}),s=om({inputs:{x:n},backend:t}),a=qu({inputs:{input:o},backend:t}),i=om({inputs:{x:a},backend:t}),p=ls({inputs:{real:s,imag:i},backend:t});return t.disposeData(n.dataId),t.disposeData(s.dataId),t.disposeData(a.dataId),t.disposeData(i.dataId),p}else return $o({attrs:{shape:o.shape,dtype:o.dtype,value:o.dtype===\"string\"?\"\":0},backend:t})}var FB={kernelName:Es,backendName:\"webgpu\",kernelFunc:om};function DB(r){let{inputs:e,backend:t}=r,{x:o}=e;if(o.dtype===\"string\")throw new Error(\"onesLike is not supported under string dtype\");if(o.dtype===\"complex64\"){let n=Wa({inputs:{input:o},backend:t}),s=DB({inputs:{x:n},backend:t}),a=qu({inputs:{input:o},backend:t}),i=om({inputs:{x:a},backend:t}),p=ls({inputs:{real:s,imag:i},backend:t});return t.disposeData(n.dataId),t.disposeData(s.dataId),t.disposeData(a.dataId),t.disposeData(i.dataId),p}else return $o({attrs:{shape:o.shape,dtype:o.dtype,value:1},backend:t})}var PB={kernelName:Cs,backendName:\"webgpu\",kernelFunc:DB};function Boe(r){let{inputs:e,backend:t,attrs:o}=r,{axis:n}=o;if(e.length===1)return mx({inputs:{input:e[0]},backend:t,attrs:{dim:n}});let s=e[0].shape,a=e[0].dtype;e.forEach(c=>{x.assertShapesMatch(s,c.shape,\"All tensors passed to stack must have matching shapes\"),x.assert(a===c.dtype,()=>\"All tensors passed to stack must have matching dtypes\")});let i=[],p=e.map(c=>{let l=mx({inputs:{input:c},backend:t,attrs:{dim:n}});return i.push(l),l}),u=LS({inputs:p,backend:t,attrs:{axis:n}});return i.forEach(c=>t.disposeData(c.dataId)),u}var OB={kernelName:Is,backendName:\"webgpu\",kernelFunc:Boe};var Cx=class{constructor(e,t){this.variableNames=[\"x\"],this.uniforms=\"constantValue : f32,\",this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=t.map((o,n)=>o[0]+e[n]+o[1]),this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),t.map((o,n)=>{this.uniforms+=` pad${n} : vec2,`}),this.xShape=e,this.shaderKey=\"pad\"}getUserCode(){let e=this.xShape.length,t=At(e),o=this.xShape.map((l,m)=>`uniforms.pad${m}[0]`).join(\",\"),n=this.xShape.map((l,m)=>`uniforms.pad${m}[0] + uniforms.xShape${e>1?`[${m}]`:\"\"}`).join(\",\"),s=e>1?`${t}(${o})`:`${o}`,a=e>1?`${t}(${n})`:`${n}`,i=e>1?\"any(outC < start)\":\"outC < start\",p=e>1?\"any(outC >= end)\":\"outC >= end\",u=e>1?[\"coords[0]\",\"coords[1]\",\"coords[2]\",\"coords[3]\"].slice(0,e):\"coords\";return`\n ${ue(\"index\")} {\n if (index < uniforms.size) {\n let start = ${s};\n let end = ${a};\n let outC = getCoordsFromIndex(index);\n\n if (${i} || ${p}) {\n setOutputAtIndex(index, uniforms.constantValue);\n } else {\n let coords = outC - start;\n setOutputAtIndex(index, getX(${u}));\n }\n }\n }\n `}};var US=r=>{let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{paddings:s,constantValue:a}=o;if(s.every(u=>x.arraysEqual(u,[0,0])))return Lt({inputs:{x:n},backend:t});if(x.sizeFromShape(n.shape)===0){let u=s.map((c,l)=>c[0]+n.shape[l]+c[1]);return $o({backend:t,attrs:{shape:u,value:a,dtype:n.dtype}})}let i=[{type:\"float32\",data:[a]}];s.map(u=>i.push({type:\"int32\",data:[u[0],u[1]]}));let p=new Cx(n.shape,s);return t.runWebGPUProgram(p,[n],n.dtype,i)},MB={kernelName:Ln,backendName:\"webgpu\",kernelFunc:US};var Voe=it({opType:ye.POW}),LB={kernelName:Bn,backendName:\"webgpu\",kernelFunc:Voe};function zoe(r){let{inputs:e,backend:t}=r,{x:o,alpha:n}=e,s=new Hu(ye.PRELU,o.shape,n.shape);return t.runWebGPUProgram(s,[o,n],\"float32\")}var BB={kernelName:Vn,backendName:\"webgpu\",kernelFunc:zoe};function Woe(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s,keepDims:a}=o;return Ys(n,s,a,\"prod\",t)}var VB={kernelName:Ao,backendName:\"webgpu\",kernelFunc:Woe};var Uoe=r=>{let{backend:e,attrs:t}=r,{start:o,stop:n,step:s,dtype:a}=t,i=pL(o,n,s,a);return e.makeTensorInfo([i.length],a,i)},zB={kernelName:ws,backendName:\"webgpu\",kernelFunc:Uoe};var GS=it({opType:ye.DIV}),WB={kernelName:Cn,backendName:\"webgpu\",kernelFunc:GS};var Goe=Ge({opType:pe.RECIPROCAL}),UB={kernelName:ma,backendName:\"webgpu\",kernelFunc:Goe};var Hoe=Ge({opType:pe.RELU}),GB={kernelName:zn,backendName:\"webgpu\",kernelFunc:Hoe};var qoe=Ge({opType:pe.RELU6}),HB={kernelName:Gn,backendName:\"webgpu\",kernelFunc:qoe};var Ix=class{constructor(e,t,o){this.variableNames=[\"x\"],this.uniforms=\"adjustHeightWidth : vec2, halfPixelCenters : f32,\",this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=[e[0],t,o,e[3]],this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey=\"resizeBilinear\"}getUserCode(){return`\n ${ue(\"index\")} {\n if (index < uniforms.size) {\n let coords = getCoordsFromIndex(index);\n let b = coords[0];\n let d = coords[3];\n let rc = coords.yz;\n\n let effectiveInSize = vec2(\n f32(uniforms.xShape.y) - uniforms.adjustHeightWidth[0],\n f32(uniforms.xShape.z) - uniforms.adjustHeightWidth[1]);\n\n let effectiveOutSize = vec2(\n f32(uniforms.outShape.y) - uniforms.adjustHeightWidth[0],\n f32(uniforms.outShape.z) - uniforms.adjustHeightWidth[1]);\n\n let effectiveInputOverOutputRatioRC =\n effectiveInSize / effectiveOutSize;\n\n // Fractional source index\n let sourceFracIndexRC =\n (vec2(rc) + vec2(uniforms.halfPixelCenters)) *\n effectiveInputOverOutputRatioRC - vec2(uniforms.halfPixelCenters);\n\n // Compute the four integer indices.\n let sourceFloorRC = vec2(sourceFracIndexRC);\n let sourceCeilRC = vec2(\n min(vec2(uniforms.xShape.yz) - vec2(1.0), ceil(sourceFracIndexRC)));\n\n let topLeft = getX(b, sourceFloorRC.x, sourceFloorRC.y, d);\n let bottomLeft = getX(b, sourceCeilRC.x, sourceFloorRC.y, d);\n let topRight = getX(b, sourceFloorRC.x, sourceCeilRC.y, d);\n let bottomRight = getX(b, sourceCeilRC.x, sourceCeilRC.y, d);\n\n let fracRC = sourceFracIndexRC - vec2(sourceFloorRC);\n\n let top = topLeft + (topRight - topLeft) * fracRC.y;\n let bottom = bottomLeft + (bottomRight - bottomLeft) * fracRC.y;\n let newValue = top + (bottom - top) * fracRC.x;\n\n setOutputAtIndex(index, newValue);\n }\n }\n `}};function Koe(r){let{inputs:e,backend:t,attrs:o}=r,{images:n}=e,{alignCorners:s,size:a,halfPixelCenters:i}=o,[p,u]=a,c=s&&p>1?1:0,l=s&&u>1?1:0,f=[{type:\"float32\",data:[c,l]},{type:\"float32\",data:[i?.5:0]}],d=new Ix(n.shape,p,u);return t.runWebGPUProgram(d,[n],\"float32\",f)}var qB={kernelName:Un,backendName:\"webgpu\",kernelFunc:Koe};var wx=class{constructor(e,t,o,n){this.variableNames=[\"x\"],this.uniforms=\"adjustHeightWidth : vec2, roundBase : f32,\",this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=[e[0],t,o,e[3]],this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.halfPixelCenters=n,this.shaderKey=`resizeNearest_${n}`}getUserCode(){let e;return this.halfPixelCenters?e=\"max((vec2(rc) + vec2(0.5)) * effectiveInputOverOutputRatioRC, vec2(0.0))\":e=\"vec2(rc) * effectiveInputOverOutputRatioRC\",`\n ${ue(\"index\")} {\n if (index < uniforms.size) {\n let coords = getCoordsFromIndex(index);\n let b = coords[0];\n let d = coords[3];\n let rc = coords.yz;\n\n let effectiveInSize = vec2(\n f32(uniforms.xShape.y) - uniforms.adjustHeightWidth[0],\n f32(uniforms.xShape.z) - uniforms.adjustHeightWidth[1]);\n\n let effectiveOutSize = vec2(\n f32(uniforms.outShape.y) - uniforms.adjustHeightWidth[0],\n f32(uniforms.outShape.z) - uniforms.adjustHeightWidth[1]);\n\n let effectiveInputOverOutputRatioRC =\n effectiveInSize / effectiveOutSize;\n\n // Fractional source index\n let sourceFracIndexRC = ${e};\n\n // Compute the coordinators of nearest neighbor point.\n let inputShapeRC = vec2(f32(uniforms.xShape.y), f32(uniforms.xShape.z));\n let sourceNearestRC = vec2(\n min(inputShapeRC - 1.0, floor(sourceFracIndexRC + uniforms.roundBase)));\n let newValue = getX(b, sourceNearestRC.x, sourceNearestRC.y, d);\n\n setOutputAtIndex(index, newValue);\n }\n }\n `}};function joe(r){let{inputs:e,backend:t,attrs:o}=r,{images:n}=e,{alignCorners:s,halfPixelCenters:a,size:i}=o,[p,u]=i,c=s&&p>1?1:0,l=s&&u>1?1:0,f=[{type:\"float32\",data:[c,l]},{type:\"float32\",data:[s?.5:0]}],d=new wx(n.shape,p,u,a);return t.runWebGPUProgram(d,[n],n.dtype,f)}var KB={kernelName:Wn,backendName:\"webgpu\",kernelFunc:joe};var Sx=class{constructor(e,t){this.outputShape=[],this.variableNames=[\"x\"],this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=e,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.uniforms=`centerX : f32, centerY : f32, sinRadians : f32,\n cosRadians : f32,`,this.shaderKey=\"rotate\",this.outputShape=e,typeof t==\"number\"?(this.uniforms+=\" fillValue : f32,\",this.fillSnippet=\"var outputValue = uniforms.fillValue;\",this.shaderKey+=\"_float\"):(this.uniforms+=\" fillValue : vec3,\",this.fillSnippet=\"var outputValue = uniforms.fillValue[coords[3]];\",this.shaderKey+=\"_vec3\")}getUserCode(){return`\n ${ue(\"index\")} {\n if (index < uniforms.size) {\n let coords = getCoordsFromIndex(index);\n let coordXFloat = (f32(coords[2]) - uniforms.centerX) *\n uniforms.cosRadians - (f32(coords[1]) - uniforms.centerY) *\n uniforms.sinRadians;\n let coordYFloat = (f32(coords[2]) - uniforms.centerX) *\n uniforms.sinRadians + (f32(coords[1]) - uniforms.centerY) *\n uniforms.cosRadians;\n let coordX = i32(round(coordXFloat + uniforms.centerX));\n let coordY = i32(round(coordYFloat + uniforms.centerY));\n ${this.fillSnippet}\n if(coordX >= 0 && coordX < uniforms.xShape[2] && coordY >= 0 &&\n coordY < uniforms.xShape[1]) {\n outputValue = getX(coords[0], coordY, coordX, coords[3]);\n }\n setOutputAtIndex(index, outputValue);\n }\n }\n `}};var jB={kernelName:es,backendName:\"webgpu\",kernelFunc:({inputs:r,attrs:e,backend:t})=>{let{image:o}=r,{radians:n,fillValue:s,center:a}=e,i=t,p=new Sx(o.shape,s),[u,c]=I.getImageCenter(a,o.shape[1],o.shape[2]),l=[{type:\"float32\",data:[u]},{type:\"float32\",data:[c]},{type:\"float32\",data:[Math.sin(n)]},{type:\"float32\",data:[Math.cos(n)]}];return typeof s==\"number\"?l.push({type:\"float32\",data:[Number.parseFloat(s.toFixed(2))]}):l.push({type:\"float32\",data:s}),i.runWebGPUProgram(p,[o],o.dtype,l)}};var Xoe=Ge({opType:pe.RSQRT,cpuKernelImpl:cL}),XB={kernelName:xo,backendName:\"webgpu\",kernelFunc:Xoe};var Fi=class{constructor(e,t,o,n,s,a,i,p=!0){this.variableNames=[\"updates\",\"indices\"],this.workGroupSize=[64,1,1],this.atomic=!0,this.outputShape=a,this.type=i,this.sumDupeIndices=p,this.dispatchLayout=fe(e),this.dispatch=ae(this.dispatchLayout,e,this.workGroupSize),this.sliceDimGreaterThanOne=t>1,this.shaderKey=`scatter_${o}_${n}_${this.sliceDimGreaterThanOne}_${i}_${p}`;let u=At(s.length);this.uniforms=`sliceDim : i32, strides: ${u}, size: i32,`,this.updatesRank=n,this.indicesRank=o}getUserCode(){let e=\"\";this.indicesRank===1?e=\"coords[0]\":this.indicesRank===2&&(e=\"coords[0], j\");let t=`getIndices(${e})`,o=this.sliceDimGreaterThanOne?\"uniforms.strides[j]\":\"uniforms.strides\",n=\"\",s=\"\";this.dispatchLayout.x.length===1?(n=\"flattenedIndex\",s=`\n fn getUpdatesCoordsFromFlatIndex(index : i32) -> i32 {\n return index;\n }\n `):this.dispatchLayout.x.length===2&&(n=\"vec2(flattenedIndex, coords[1])\",s=`\n fn getUpdatesCoordsFromFlatIndex(index : i32) -> vec2 {\n // N.B. |updates| could be a scalar tensor, conceptually representing a\n // 2D tensor with all values equal to that. By design, its size must be\n // the same as |outShape[1]| in one dimension, and |indicesShape[0]|\n // gives the other.\n let sliceSize = uniforms.outShape[1];\n let d0 = index / sliceSize;\n let d1 = index - d0 * sliceSize;\n return vec2(d0, d1);\n }\n `);let i=`getUpdates(${Array.from({length:this.updatesRank},(c,l)=>`coords[${l}]`).join(\", \")})`,p=(c,l)=>{let m=`atomicAdd(${c}, bitcast(${l}))`;this.type===\"float32\"&&(m=`\n {\n var oldBits = 0;\n var newBits = bitcast(${l});\n loop {\n let info = atomicCompareExchangeWeak(${c}, oldBits, newBits);\n if (info.exchanged) {\n break;\n }\n oldBits = info.old_value;\n let oldValue = bitcast(oldBits);\n let newValue = oldValue + (${l});\n newBits = bitcast(newValue);\n }\n }\n `);let f=`atomicStore(${c}, bitcast(${l}));`;return this.sumDupeIndices?m:f};return`\n ${s}\n\n ${ue(\"index\")} {\n if (index < uniforms.size) {\n let coords = getUpdatesCoordsFromFlatIndex(index);\n var flattenedIndex = 0;\n for (var j = 0; j < uniforms.sliceDim; j = j + 1) {\n let indexInside = i32(round(${t}));\n flattenedIndex = flattenedIndex + indexInside * ${o};\n }\n let updateValue =\n ${Tc(this.type,!1)}(${i});\n let flatIndex = getOutputIndexFromCoords(${n});\n\n ${p(\"&result[flatIndex]\",\"updateValue\")};\n }\n }`}};function Yoe(r){let{inputs:e,backend:t,attrs:o}=r,{indices:n,updates:s}=e,{shape:a}=o,{sliceRank:i,numUpdates:p,sliceSize:u,strides:c,outputSize:l}=I.calculateShapes(s,n,a),m=[l/u,u];if(l===0)return t.makeTensorInfo(a,n.dtype);let f=xe({inputs:{x:n},backend:t,attrs:{shape:[p,i]}}),d=xe({inputs:{x:s},backend:t,attrs:{shape:[p,u]}}),h=d.dtype,g=$o({backend:t,attrs:{shape:m,value:0,dtype:h}}),y=x.sizeFromShape(d.shape),b=[{type:\"int32\",data:[i]},{type:\"int32\",data:c},{type:\"int32\",data:[y]}],C=new Fi(d.shape,i,f.shape.length,d.shape.length,c,m,h),w=t.runWebGPUProgram(C,[d,f],h,b,g),k=xe({inputs:{x:w},backend:t,attrs:{shape:a}});return t.disposeData(f.dataId),t.disposeData(d.dataId),t.disposeData(w.dataId),k}var YB={kernelName:Hn,backendName:\"webgpu\",kernelFunc:Yoe};var vx=class{constructor(e,t,o){this.variableNames=[\"c\",\"a\",\"b\"],this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=t,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.cRank=e,this.rank=o,this.shaderKey=\"select\"}getUserCode(){let e,t;if(this.rank>4)throw Error(`Where for rank ${this.rank} is not yet supported`);if(this.rank===1)t=\"resRC\",e=\"resRC\";else{let n=[\"resRC.x\",\"resRC.y\",\"resRC.z\",\"resRC.w\"],s=[],a=[];for(let i=0;i= 1.0) {\n setOutputAtIndex(index, getA(${t}));\n } else {\n setOutputAtIndex(index, getB(${t}));\n }\n }\n }\n `}};function Qoe(r){let{inputs:e,backend:t}=r,{condition:o,t:n,e:s}=e,a=new vx(o.shape.length,n.shape,n.shape.length);return t.runWebGPUProgram(a,[o,n,s],ct(n.dtype,s.dtype))}var QB={kernelName:vs,backendName:\"webgpu\",kernelFunc:Qoe};var Zoe=Ge({opType:pe.SIGMOID}),ZB={kernelName:yo,backendName:\"webgpu\",kernelFunc:Zoe};var Joe=Ge({opType:pe.SIN}),JB={kernelName:Kn,backendName:\"webgpu\",kernelFunc:Joe};var ene=Ge({opType:pe.SINH}),eV={kernelName:ha,backendName:\"webgpu\",kernelFunc:ene};var HS=it({opType:ye.SUB,cpuKernelImpl:gL,supportsComplex:!0}),tV={kernelName:Io,backendName:\"webgpu\",kernelFunc:HS};function tne(r){let{inputs:e,backend:t,attrs:o}=r,{logits:n}=e,{dim:s}=o,a=x.parseAxisParam([s],n.shape),i=em({inputs:{x:n},backend:t,attrs:{reductionIndices:a,keepDims:!1}}),p=I.expandShapeToKeepDim(i.shape,a),u=xe({inputs:{x:i},backend:t,attrs:{shape:p}}),c=HS({inputs:{a:n,b:u},backend:t}),l=VS({inputs:{x:c},backend:t}),m=rm({inputs:{x:l},backend:t,attrs:{axis:a,keepDims:!1}}),f=xe({inputs:{x:m},backend:t,attrs:{shape:p}}),d=GS({inputs:{a:l,b:f},backend:t});return t.disposeData(i.dataId),t.disposeData(u.dataId),t.disposeData(c.dataId),t.disposeData(l.dataId),t.disposeData(m.dataId),t.disposeData(f.dataId),d}var rV={kernelName:Xn,backendName:\"webgpu\",kernelFunc:tne};var rne=r=>{let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{blockShape:s,paddings:a}=o;x.assert(n.shape.length<=4,()=>\"spaceToBatchND for rank > 4 with a WebGPU backend not implemented yet\");let i=s.reduce((y,b)=>y*b),p=[[0,0]];p.push(...a);for(let y=1+s.length;yt.disposeData(y.dataId)),g},oV={kernelName:ks,backendName:\"webgpu\",kernelFunc:rne};var kx=class{constructor(e,t){this.variableNames=[\"A\"],this.workGroupSize=[64,1,1],this.size=!0;let o=new Array(e.length);for(let n=0;n=5)throw Error(`Tile for rank ${r} is not yet supported`);if(r===1)return`(resRC % ${e}aShape)`;let t=[\"resRC.x\",\"resRC.y\",\"resRC.z\",\"resRC.w\"],o=[];for(let n=0;n=5){let p=t.readSync(n.dataId),u=n.dtype===\"string\"?p.map(m=>x.decodeString(m)):p,c=ne(n.shape,n.dtype,u),l=xL(c,s);return t.makeTensorInfo(l.shape,l.dtype,l.values)}let a=new kx(n.shape,s);return t.runWebGPUProgram(a,[n],n.dtype)}var nV={kernelName:wo,backendName:\"webgpu\",kernelFunc:qS};function nne(r){let{inputs:e,backend:t,attrs:o}=r,{sparseIndices:n,sparseValues:s,defaultValue:a}=e,{outputShape:i}=o,{sliceRank:p,numUpdates:u,sliceSize:c,strides:l,outputSize:m}=I.calculateShapes(s,n,i),f=!1;if(s.dtype===\"string\"){let R=t.bufferSync(n),A=t.bufferSync(s),D=x.decodeString(t.readSync(a.dataId)[0]),O=lL(R,A,i,m,c,u,p,l,D,f);return t.makeTensorInfo(i,O.dtype,O.values)}let d=[m/c,c],h=xe({inputs:{x:n},backend:t,attrs:{shape:[u,p]}}),g=s.shape.length?xe({inputs:{x:s},backend:t,attrs:{shape:[u,c]}}):Lt({inputs:{x:s},backend:t}),y=g.dtype,b=t.makeTensorInfo([],y,x.makeZerosTypedArray(1,y)),C=xe({inputs:{x:a},backend:t,attrs:{shape:Array(d.length).fill(1)}}),w=qS({inputs:{x:C},backend:t,attrs:{reps:d}}),k=x.sizeFromShape([u,c]),_=[{type:\"int32\",data:[p]},{type:\"int32\",data:l},{type:\"int32\",data:[k]}];switch(u){case 0:break;case 1:{let R=new Fi([u,c],p,h.shape.length,g.shape.length,l,d,y,f);t.runWebGPUProgram(R,[g,h],y,_,w)}break;default:{let R=new Fi([u,c],p,h.shape.length,b.shape.length,l,d,y,f);t.runWebGPUProgram(R,[b,h],y,_,w)}{let R=new Fi([u,c],p,h.shape.length,g.shape.length,l,d,y);t.runWebGPUProgram(R,[g,h],y,_,w)}}let E=xe({inputs:{x:w},backend:t,attrs:{shape:i}});return t.disposeData(h.dataId),t.disposeData(g.dataId),t.disposeData(C.dataId),t.disposeData(b.dataId),t.disposeData(w.dataId),E}var sV={kernelName:ei,backendName:\"webgpu\",kernelFunc:nne};function sne(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{numOrSizeSplits:s,axis:a}=o,i=x.parseAxisParam(a,n.shape)[0],p=I.prepareSplitSize(n,s,i),u=n.shape.length,c=new Array(u).fill(0),l=n.shape.slice();return p.map(m=>{let f=[...l];f[i]=m;let d=ms({inputs:{x:n},backend:t,attrs:{begin:c,size:f}});return c[i]+=m,d})}var aV={kernelName:Ts,backendName:\"webgpu\",kernelFunc:sne};var ane=Ge({opType:pe.SQRT}),iV={kernelName:bo,backendName:\"webgpu\",kernelFunc:ane};var uV={kernelName:ti,backendName:\"webgpu\",kernelFunc:({inputs:r,backend:e})=>{let{x:t}=r,o=e,n=new Zo(t.shape,pe.SQUARE);return o.runWebGPUProgram(n,[t],t.dtype)}};var ine=it({opType:ye.SQUARED_DIFFERENCE}),pV={kernelName:Co,backendName:\"webgpu\",kernelFunc:ine};var Tx=class{constructor(e){this.variableNames=[\"x\"],this.workPerThread=1,this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=e,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize,[this.workPerThread,1,1]);let t=At(this.outputShape.length);this.uniforms=`begin : ${t}, strides : ${t}, `,this.shaderKey=\"stridedSlice\"}getUserCode(){let e=this.outputShape.length,t=\"\";if(e===1)t=\"coords * uniforms.strides + uniforms.begin\";else{let n=0;t=this.outputShape.map((s,a)=>(n++,this.outputShape.length===1?`coords * uniforms.strides[${a}] + uniforms.begin[${a}]`:`coords[${n-1}] * uniforms.strides[${a}] + uniforms.begin[${a}]`)).join(\",\")}return`\n ${ue(\"index\")} {\n if (index < uniforms.size) {\n let coords = getCoordsFromIndex(index);\n setOutputAtIndex(index, getX(${t}));\n }\n }\n `}};function une(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{begin:s,end:a,strides:i,beginMask:p,endMask:u,ellipsisMask:c,newAxisMask:l,shrinkAxisMask:m}=o,{finalShapeSparse:f,finalShape:d,isIdentity:h,sliceDim0:g,isSimpleSlice:y,begin:b,end:C,strides:w}=et.sliceInfo(n.shape,s,a,i,p,u,c,l,m),k;if(h)k=xe({inputs:{x:n},backend:t,attrs:{shape:d}});else if(g||y){x.assert(n.shape.length>=1,()=>`Input must have rank at least 1, got: ${n.shape.length}`);let _=et.computeOutShape(b,C,w),E=ms({inputs:{x:n},backend:t,attrs:{begin:b,size:_}});k=xe({inputs:{x:E},backend:t,attrs:{shape:d}}),t.disposeData(E.dataId)}else if(t.shouldExecuteOnCPU([n])){let E=t.readSync(n.dataId),R=ne(n.shape,n.dtype,E),A=dL(f,R,w,b);k=t.makeTensorInfo(d,n.dtype,A.values)}else{let E=new Tx(f),R=[{type:\"int32\",data:b},{type:\"int32\",data:w}],A=t.runWebGPUProgram(E,[n],n.dtype,R);k=xe({inputs:{x:A},backend:t,attrs:{shape:d}}),t.disposeData(A.dataId)}return k}var cV={kernelName:Yn,backendName:\"webgpu\",kernelFunc:une};function pne(r){let{inputs:e,backend:t,attrs:o}=r,{separator:n,nGramWidths:s,leftPad:a,rightPad:i,padWidth:p,preserveShortSequences:u}=o,{data:c,dataSplits:l}=e,m=t.readSync(c.dataId),f=t.readSync(l.dataId),[d,h]=hL(m,f,n,s,a,i,p,u);return[t.makeTensorInfo([d.length],\"string\",d),t.makeTensorInfo(l.shape,\"int32\",h)]}var lV={kernelName:Ns,backendName:\"webgpu\",kernelFunc:pne};var cne=Ge({opType:pe.TANH}),mV={kernelName:Qn,backendName:\"webgpu\",kernelFunc:cne};var Nx=class{constructor(e){this.variableNames=[\"x\",\"indices\"],this.workGroupSize=[256,1,1],this.size=!0,this.outputShape=e,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.uniforms=`inputSize : i32, firstPass : i32, negativeInf : f32,\n dir : i32, inc : i32,`,this.shaderKey=\"swap\"}getUserCode(){return`\n ${ue(\"index\")} {\n if (index < uniforms.size) {\n let outC = getCoordsFromIndex(index);\n let batch = outC[0];\n let elemIdx = outC[1];\n // We compare elements pair-wise within a group of size 2 * inc.\n // The comparing rule for each group alternates between ascending\n // and descending. Within each group, we compare each pair at\n // positions i and i+inc. To decide whether an element at position i\n // is x0 or x1, we mod it by 2 * inc, if the result is smaller than\n // inc, it is in the first half of the group, we denote it as x0,\n // otherwise we denote it as x1.\n // For example, as shown in the Bitonic top K paper referenced\n // above, Figure5(a) shows that element[1] is in the second half of\n // the group when group size is 2, but it is in the first half of\n // the group when group size is 4.\n let isFirstInPair = elemIdx % (2 * uniforms.inc) < uniforms.inc;\n var i = 0;\n if (isFirstInPair) {\n i = elemIdx;\n } else {\n i = elemIdx - uniforms.inc;\n }\n\n var i0 = 0;\n if (uniforms.firstPass == 1) {\n i0 = i;\n } else {\n i0 = i32(getIndices(batch, i));\n }\n\n var i1 = 0;\n if (uniforms.firstPass == 1) {\n i1 = i + uniforms.inc;\n } else {\n i1 = i32(getIndices(batch, i + uniforms.inc));\n }\n\n var x0 = f32(0.0);\n var x1 = f32(0.0);\n if (i0 < uniforms.inputSize) {\n x0 = getX(batch, i0);\n } else {\n x0 = uniforms.negativeInf;\n }\n if (i1 < uniforms.inputSize) {\n x1 = getX(batch, i1);\n } else {\n x1 = uniforms.negativeInf;\n }\n\n let reverse = elemIdx % (2 * uniforms.dir) >= uniforms.dir;\n let isGreater = x0 > x1 || (x0 == x1 && i1 > i0);\n if (reverse == isGreater) {\n // Elements in opposite order of direction\n let iTemp = i0;\n i0 = i1;\n i1 = iTemp;\n }\n if (isFirstInPair) {\n setOutputAtIndex(index, f32(i0));\n } else {\n setOutputAtIndex(index, f32(i1));\n }\n }\n }\n `}},_x=class{constructor(e){this.variableNames=[\"x\",\"indices\"],this.workGroupSize=[256,1,1],this.size=!0,this.outputShape=e,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.uniforms=\"inputSize : i32, firstPass : i32, k : i32,\",this.shaderKey=\"merge\"}getUserCode(){return`\n ${ue(\"index\")} {\n if (index < uniforms.size) {\n let outC = getCoordsFromIndex(index);\n let batch = outC[0];\n let elemIdx = outC[1];\n // The output size is half of the previous size.\n // If the previous sequence is | | | | _ _ _ _ | | | | _ _ _ _\n // (k=4), we only need to output the indices at positions |, the\n // indices at positions _ can be thrown away, see Figure5(b) After\n // Phase 2 (Merge phase) in the Bitonic Top K paper referenced\n // above.\n // For example, the paper shows we only need to output the orange\n // bars. The output sequence should look like this | | | | | | | |.\n // Because the sequence is halved, to map the output index back to\n // the previous sequence to find the corresponding value, we need\n // to double the index. When we double the index, we basically\n // interpolate a position, so 2i looks like\n // | _ | _ | _ | _ | _ | _ | _. We move the | to the first k\n // position of each 2k positions by - elemIdx % k. E.g. for output\n // at index 4,5,6,7, we want to get the corresponding element at\n // original index 8,9,10,11, for output at index 8,9,10,11,\n // we want to get the corresponding element at original index\n // 16,17,18,19, so on and so forth.\n\n var i = 0;\n if (elemIdx < uniforms.k) {\n i = elemIdx;\n } else {\n i = elemIdx * 2 - elemIdx % uniforms.k;\n }\n var i0 = 0;\n if (uniforms.firstPass == 1) {\n i0 = i;\n } else {\n i0 = i32(getIndices(batch, i));\n }\n var i1 = 0;\n if (uniforms.firstPass == 1) {\n i1 = i + uniforms.k;\n } else {\n i1 = i32(getIndices(batch, i + uniforms.k));\n }\n\n let x0 = getX(batch, i0);\n var x1 = f32(0.0);\n if (i1 < uniforms.inputSize) {\n x1 = getX(batch, i1);\n } else {\n x1 = x0;\n }\n\n if (x0 >= x1) {\n setOutputAtIndex(index, f32(i0));\n } else {\n setOutputAtIndex(index, f32(i1));\n }\n }\n }\n `}};function Mc(r,e){e!==null&&r.disposeData(e.dataId)}function fV(r){let e=1;for(;ed===null?[l,l]:[l,d],g=(k,_,E)=>{let R=h(),A=new Nx(E),O=[{type:\"int32\",data:[p]},{type:\"int32\",data:[d===null?1:0]},{type:\"float32\",data:[Number.NEGATIVE_INFINITY]},{type:\"int32\",data:[k]},{type:\"int32\",data:[_]}],M=d;d=t.runWebGPUProgram(A,R,\"int32\",O),Mc(t,M)};for(let k=1;k=1;E/=2)g(_,E,[c,f])}for(let k=f;k>m;k/=2){let _=h(),E=new _x([c,k/2]),A=[{type:\"int32\",data:[p]},{type:\"int32\",data:[d===null?1:0]},{type:\"int32\",data:[m]}],D=d;d=t.runWebGPUProgram(E,_,\"int32\",A),Mc(t,D);let O=m/2,M=O*2;for(let L=O;L>=1;L/=2)g(M,L,d.shape)}let y=d;d=ms({inputs:{x:d},backend:t,attrs:{begin:0,size:[c,s]}}),Mc(t,y);let b=WS({inputs:{x:l,indices:d},backend:t,attrs:{axis:1,batchDims:1}});Mc(t,l);let C=i.slice(0,-1);C.push(s),y=d,d=xe({inputs:{x:d},attrs:{shape:C},backend:t}),Mc(t,y);let w=b;return b=xe({inputs:{x:b},attrs:{shape:C},backend:t}),Mc(t,w),[b,d]}var dV={kernelName:Zn,backendName:\"webgpu\",kernelFunc:lne};var Ex=class{constructor(e){this.variableNames=[\"Image\",\"Transforms\"],this.uniforms=\"interpolationModeId : i32, fillModeId : i32, fillValue : f32,\",this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=e,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey=\"transform\"}getUserCode(){return`\n fn mapCoord(outCoord : f32, len : f32) -> f32{\n var inCoord = outCoord;\n if(uniforms.fillModeId == 2) {\n if (inCoord < 0.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n let sz2 = 2.0 * len;\n if (inCoord < sz2) {\n inCoord = sz2 * f32(i32(f32(-inCoord / sz2))) +\n inCoord;\n }\n if (inCoord < -len) {\n inCoord = inCoord + sz2;\n } else {\n inCoord = -inCoord - 1.0;\n }\n }\n } else if (inCoord > len - 1.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n let sz2 = 2.0 * len;\n inCoord = inCoord - sz2 * f32(i32(f32(inCoord / sz2)));\n if (inCoord >= len) {\n inCoord = sz2 - inCoord - 1.0;\n }\n }\n }\n return clamp(inCoord, 0.0, len - 1.0);\n } else if (uniforms.fillModeId == 3) {\n if (inCoord < 0.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n let sz = len - 1.0;\n inCoord = inCoord + len * (f32(i32(f32(-inCoord / sz))) + 1.0);\n }\n } else if (inCoord > len - 1.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n let sz = len - 1.0;\n inCoord = inCoord - len * f32(i32(f32(inCoord / sz)));\n }\n }\n return clamp(inCoord, 0.0, len - 1.0);\n } else if (uniforms.fillModeId == 4) {\n return clamp(outCoord, 0.0, len - 1.0);\n }\n return outCoord;\n }\n fn readWithFillValue(batch : i32, coordY : i32, coordX : i32,\n channel : i32) -> f32 {\n var outputValue : f32;\n if (0 <= coordY && coordY < uniforms.imageShape[1] && 0 <= coordX && coordX < uniforms.imageShape[2]) {\n outputValue = getImage(batch, coordY, coordX, channel);\n } else {\n outputValue = uniforms.fillValue;\n }\n return outputValue;\n }\n\n ${ue(\"index\")} {\n if (index < uniforms.size) {\n let coords = getCoordsFromIndex(index);\n var outputValue : f32;\n let batch = coords[0];\n let x = coords[2];\n let y = coords[1];\n let channel = coords[3];\n let xf = f32(x);\n let yf = f32(y);\n let a1 = getTransforms(batch, 0);\n let a2 = getTransforms(batch, 1);\n let a3 = getTransforms(batch, 2);\n let b1 = getTransforms(batch, 3);\n let b2 = getTransforms(batch, 4);\n let b3 = getTransforms(batch, 5);\n let c1 = getTransforms(batch, 6);\n let c2 = getTransforms(batch, 7);\n let projection = c1 * xf + c2 * yf + 1.0;\n if (projection == 0.0) {\n outputValue = uniforms.fillValue;\n } else {\n let inX = (a1 * xf + a2 * yf + a3) / projection;\n let inY = (b1 * xf + b2 * yf + b3) / projection;\n let mapX = mapCoord(inX, f32(uniforms.imageShape[2]));\n let mapY = mapCoord(inY, f32(uniforms.imageShape[1]));\n\n if (uniforms.interpolationModeId == 1) {\n let coordY = i32(round(mapY));\n let coordX = i32(round(mapX));\n outputValue = readWithFillValue(batch, coordY, coordX,\n channel);\n } else {\n let yFloor = floor(mapY);\n let xFloor = floor(mapX);\n let yCeil = yFloor + 1.0;\n let xCeil = xFloor + 1.0;\n let valueYFloor = (xCeil - mapX) *\n readWithFillValue(batch, i32(yFloor), i32(xFloor), channel) +\n (mapX - xFloor) *\n readWithFillValue(batch, i32(yFloor), i32(xCeil), channel);\n let valueYCeil = (xCeil - mapX) *\n readWithFillValue(batch, i32(yCeil), i32(xFloor), channel) +\n (mapX - xFloor) *\n readWithFillValue(batch, i32(yCeil), i32(xCeil), channel);\n outputValue = (yCeil - mapY) * valueYFloor +\n (mapY - yFloor) * valueYCeil;\n }\n }\n setOutputAtIndex(index, outputValue);\n }\n }\n `}};function mne(r){let{inputs:e,backend:t,attrs:o}=r,{image:n,transforms:s}=e,{interpolation:a,fillMode:i,fillValue:p,outputShape:u}=o,[c,l,m,f]=n.shape,[d,h]=u!=null?u:[l,m],g=[c,d,h,f],y=new Ex(g),b=a===\"nearest\"?1:2,C;switch(i){case\"constant\":C=1;break;case\"reflect\":C=2;break;case\"wrap\":C=3;break;case\"nearest\":C=4;break;default:C=1;break}let w=[{type:\"int32\",data:[b]},{type:\"int32\",data:[C]},{type:\"float32\",data:[p]}];return t.runWebGPUProgram(y,[n,s],\"float32\",w)}var hV={kernelName:Jn,backendName:\"webgpu\",kernelFunc:mne};function fne(r){let{inputs:e,backend:t,attrs:o}=r,{value:n}=e,{axis:s}=o;s<0&&(s+=n.shape.length);let a=n,i=a.shape.length,p=n.shape[s],u=new Array(i-1),c=0;for(let h=0;ht.disposeData(h.dataId)),d}var gV={kernelName:_s,backendName:\"webgpu\",kernelFunc:fne};var dne=[aM,CL,IL,wL,vL,kL,TL,EL,$L,AL,OL,ML,LL,uM,VL,WL,UL,GL,HL,qL,XL,YL,QL,ZL,tB,rB,oB,nB,sB,aB,nM,iB,cB,uB,pB,lB,mB,fB,dB,hB,gB,xB,iM,BL,yB,bB,CB,IB,wB,SB,vB,NL,kB,TB,_L,NB,_B,EB,JL,$B,RB,AB,FL,PB,OB,MB,LB,BB,VB,zB,DL,WB,UB,GB,HB,sM,qB,KB,jB,XB,YB,QB,ZB,JB,eV,RL,cV,lV,rV,oV,sV,aV,iV,uV,pV,tV,eB,mV,nV,dV,hV,SL,gV,FB];for(let r of dne)ya(r);var xV=\"4.0.0\",hne=\"4.0.0\",gne=\"4.0.0\",xne=\"4.0.0\",yne=\"4.0.0\",bne=\"0.0.1-alpha.14\",Cne={tfjs:xV,\"tfjs-core\":xV,\"tfjs-converter\":hne,\"tfjs-backend-cpu\":gne,\"tfjs-backend-webgl\":xne,\"tfjs-backend-wasm\":yne,\"tfjs-backend-webgpu\":bne};export{sn as Abs,Li as Acos,Bi as Acosh,xi as AdadeltaOptimizer,yi as AdagradOptimizer,bi as AdamOptimizer,Ci as AdamaxOptimizer,_r as Add,an as AddN,oa as All,na as Any,un as ArgMax,ja as ArgMin,Vi as Asin,zi as Asinh,Wi as Atan,sa as Atan2,Ui as Atanh,pn as AvgPool,ip as AvgPool3D,Fm as AvgPool3DGrad,Am as AvgPoolGrad,Gl as BackendWasm,cn as BatchMatMul,hs as BatchToSpaceND,up as Bincount,pp as BroadcastArgs,Tne as BroadcastTo,to as Cast,ro as Ceil,Ro as ClipByValue,aa as Complex,cp as ComplexAbs,gs as Concat,ln as Conv2D,lp as Conv2DBackpropFilter,mn as Conv2DBackpropInput,mp as Conv3D,Dm as Conv3DBackpropFilterV2,fp as Conv3DBackpropInputV2,fn as Cos,dn as Cosh,xn as CropAndResize,hn as Cumprod,gn as Cumsum,rn as DataStorage,dp as DenseBincount,yn as DepthToSpace,bn as DepthwiseConv2dNative,hp as DepthwiseConv2dNativeBackpropFilter,gp as DepthwiseConv2dNativeBackpropInput,xp as Diag,yp as Dilation2D,vb as Dilation2DBackpropFilter,Sb as Dilation2DBackpropInput,Cb as ENV,Xa as Einsum,In as Elu,Pm as EluGrad,Qc as Environment,oo as Equal,Gi as Erf,no as Exp,xs as ExpandDims,wn as Expm1,bp as FFT,ys as Fill,Sn as FlipLeftRight,so as Floor,vn as FloorDiv,Zi as FromPixels,kn as FusedBatchNorm,Do as FusedConv2D,Po as FusedDepthwiseConv2D,Fu as GPGPUContext,Tn as GatherNd,bs as GatherV2,bl as GraphModel,ao as Greater,io as GreaterEqual,Cp as IFFT,uo as Identity,Ya as Imag,Hi as IsFinite,qi as IsInf,ia as IsNan,Jr as KernelBackend,wp as LRN,Om as LRNGrad,Nn as LeakyRelu,po as Less,co as LessEqual,Ip as LinSpace,lo as Log,Ki as Log1p,Nne as LogSoftmax,_n as LogicalAnd,En as LogicalNot,ua as LogicalOr,g0 as LogicalXor,_ne as LowerBound,Si as MathBackendCPU,Ni as MathBackendWebGL,$n as Max,Rn as MaxPool,Sp as MaxPool3D,Lm as MaxPool3DGrad,Mm as MaxPoolGrad,vp as MaxPoolWithArgmax,mo as Maximum,An as Mean,Fn as Min,fo as Minimum,Dn as MirrorPad,ji as Mod,Ii as MomentumOptimizer,kp as Multinomial,ho as Multiply,Pn as Neg,On as NonMaxSuppressionV3,pa as NonMaxSuppressionV4,Mn as NonMaxSuppressionV5,go as NotEqual,Ub as OP_SCOPE_SUFFIX,ca as OneHot,Cs as OnesLike,wr as Optimizer,ns as OptimizerConstructors,Is as Pack,Ln as PadV2,Ene as Pool,Bn as Pow,Vn as Prelu,Ao as Prod,wi as RMSPropOptimizer,Tp as RaggedGather,Np as RaggedRange,_p as RaggedTensorToTensor,ws as Range,Fb as Rank,la as Real,Cn as RealDiv,ma as Reciprocal,Et as Reduction,zn as Relu,Gn as Relu6,Ss as Reshape,Un as ResizeBilinear,Vm as ResizeBilinearGrad,Wn as ResizeNearestNeighbor,Bm as ResizeNearestNeighborGrad,fa as Reverse,es as RotateWithOffset,da as Round,xo as Rsqrt,Us as SGDOptimizer,Hn as ScatterNd,Ep as SearchSorted,vs as Select,Xi as Selu,yo as Sigmoid,Yi as Sign,Kn as Sin,ha as Sinh,qn as Slice,Xn as Softmax,Qi as Softplus,ks as SpaceToBatchND,Qa as SparseFillEmptyRows,ga as SparseReshape,Za as SparseSegmentMean,Ja as SparseSegmentSum,ei as SparseToDense,Ts as SplitV,bo as Sqrt,ti as Square,Co as SquaredDifference,$s as Step,Yn as StridedSlice,Ns as StringNGrams,ri as StringSplit,oi as StringToHashBucketFast,Io as Sub,jn as Sum,xa as Tan,Qn as Tanh,ut as Tensor,je as TensorBuffer,wo as Tile,Zn as TopK,Jn as Transform,Mr as Transpose,$p as Unique,_s as Unpack,Rp as UnsortedSegmentSum,$ne as UpperBound,ba as Variable,Ai as WebGPUBackend,Es as ZerosLike,Fo as _FusedMatMul,Qt as abs,Vv as acos,zv as acosh,ge as add,Wv as addN,Uv as all,Gv as any,Hv as argMax,qv as argMin,Kv as asin,jv as asinh,Xv as atan,Yv as atan2,Qv as atanh,mf as avgPool,ek as avgPool3d,Bie as backend,I as backend_util,tk as basicLSTMCell,li as batchNorm,ok as batchNorm2d,nk as batchNorm3d,sk as batchNorm4d,ff as batchToSpaceND,df as bincount,_H as booleanMaskAsync,ak as broadcastArgs,Ls as broadcastTo,br as broadcast_util,Sv as browser,ne as buffer,qe as cast,ik as ceil,uk as clipByValue,zr as clone,Er as complex,gt as concat,pk as concat1d,ck as concat2d,lk as concat3d,mk as concat4d,fk as conv1d,mi as conv2d,dk as conv2dTranspose,hk as conv3d,xk as conv3dTranspose,Lne as copyRegisteredKernels,yk as cos,bk as cosh,hl as cosineWindow,Ck as cumprod,Ik as cumsum,Cr as customGrad,wk as denseBincount,sC as deprecationWarn,Sk as depthToSpace,Gp as depthwiseConv2d,YK as deregisterOp,ii as device_util,vk as diag,kk as dilation2d,_ie as disableDeprecationWarnings,Ft as dispose,Eie as disposeVariables,We as div,Tk as divNoNan,Nk as dot,BH as dropout,_k as einsum,xf as elu,Nie as enableDebugMode,Tie as enableProdMode,wC as enclosingPowerOfTwo,cr as engine,P as env,gf as equal,Ek as erf,Ak as euclideanNorm,Bo as exp,_a as expandDims,Fk as expm1,yf as eye,qp as fft,Bs as fill,Mie as findBackend,Lie as findBackendFactory,bf as floor,cf as floorDiv,pR as forceHalfFloat,SC as fused,Cf as gather,MH as gatherND,af as gather_util,Pie as getBackend,kb as getGradient,el as getKernel,zm as getKernelsForBackend,nte as getThreadsCount,Sw as gpgpu_util,GG as grad,HG as grads,cu as greater,If as greaterEqual,hu as ifft,ci as imag,zq as image,zH as inTopKAsync,va as io,Gf as irfft,Dk as isFinite,Pk as isInf,Ok as isNaN,So as keep,Bt as kernel_impls,wf as leakyRelu,Mk as less,Hp as lessEqual,Wq as linalg,Lk as linspace,U6 as loadGraphModel,G6 as loadGraphModelSync,Bk as localResponseNormalization,Ea as log,Sf as log1p,Vk as logSigmoid,zk as logSoftmax,Tf as logSumExp,lu as logicalAnd,Nf as logicalNot,_f as logicalOr,Wk as logicalXor,Uq as losses,Uk as lowerBound,Xe as matMul,Cv as math,Vs as max,$f as maxPool,Gk as maxPool3d,Hk as maxPoolWithArgmax,Rf as maximum,mu as mean,$ie as memory,qk as meshgrid,fl as min,Af as minimum,Kk as mirrorPad,jk as mod,Xk as moments,$H as movingAverage,oe as mul,Yk as multiRNNCell,Qk as multinomial,yr as neg,kC as nextFrame,pu as norm,Ff as notEqual,pl as oneHot,zs as ones,Zk as onesLike,T as op,Jk as outerProduct,Ws as pad,e1 as pad1d,t1 as pad2d,r1 as pad3d,o1 as pad4d,n1 as pool,Na as pow,Pf as prelu,ef as print,s1 as prod,Rie as profile,a1 as raggedGather,i1 as raggedRange,u1 as raggedTensorToTensor,p1 as rand,T1 as randomGamma,Vf as randomNormal,N1 as randomStandardNormal,zf as randomUniform,di as range,Die as ready,ka as real,_1 as reciprocal,pi as registerBackend,Pne as registerGradient,ya as registerKernel,XK as registerOp,hi as relu,Wf as relu6,Oie as removeBackend,z as reshape,vo as reverse,E1 as reverse1d,$1 as reverse2d,R1 as reverse3d,A1 as reverse4d,Kp as rfft,Uf as round,F1 as rsqrt,be as scalar,AH as scatterND,cl as scatter_util,dl as searchSorted,D1 as selu,P1 as separableConv2d,Pv as serialization,Fie as setBackend,Vie as setPlatform,ote as setThreadsCount,tte as setWasmPath,rte as setWasmPaths,MI as setWebGLContext,O1 as setdiff1dAsync,Ad as shared,Ms as sigmoid,M1 as sign,Vq as signal,L1 as sin,B1 as sinh,Ue as slice,V1 as slice1d,z1 as slice2d,W1 as slice3d,U1 as slice4d,et as slice_util,G1 as softmax,kf as softplus,Df as spaceToBatchND,Gq as sparse,PH as sparseToDense,Bq as spectral,$a as split,Rr as sqrt,Zt as square,Hf as squaredDifference,jp as squeeze,Ir as stack,qf as step,H1 as stridedSlice,Hq as string,ke as sub,tt as sum,Ca as sumOutType,q1 as tan,ml as tanh,nr as tensor,mr as tensor1d,gi as tensor2d,sf as tensor3d,K1 as tensor4d,j1 as tensor5d,X1 as tensor6d,z0 as tensor_util,Bv as test_util,Ne as tidy,fi as tile,Aie as time,Y1 as topk,pMe as train,Wp as transpose,Q1 as truncatedNormal,Z1 as unique,Mne as unregisterGradient,One as unregisterKernel,J1 as unsortedSegmentSum,ko as unstack,ct as upcastType,eT as upperBound,x as util,qG as valueAndGrad,KG as valueAndGrads,tT as variable,dC as variableGrads,Cne as version,q6 as version_converter,YW as version_core,Ij as version_cpu,ste as version_wasm,gY as version_webgl,R9e as webgl,ic as webgl_util,pS as webgpu_util,os as where,jf as whereAsync,Wr as zeros,Gt as zerosLike};\n", "import type { Config } from '../exports';\n\n/**\n * Simple helper functions used accross codebase\n */\n\n// helper function: wrapper around console output\nexport function log(...msg): void {\n const dt = new Date();\n const ts = `${dt.getHours().toString().padStart(2, '0')}:${dt.getMinutes().toString().padStart(2, '0')}:${dt.getSeconds().toString().padStart(2, '0')}.${dt.getMilliseconds().toString().padStart(3, '0')}`;\n if (msg) console.log(ts, 'Human:', ...msg); // eslint-disable-line no-console\n}\n\n// helper function: join two paths\nexport function join(folder: string, file: string): string {\n const separator = folder.endsWith('/') ? '' : '/';\n const skipJoin = file.startsWith('.') || file.startsWith('/') || file.startsWith('http:') || file.startsWith('https:') || file.startsWith('file:');\n const path = skipJoin ? `${file}` : `${folder}${separator}${file}`;\n if (!path.toLocaleLowerCase().includes('.json')) throw new Error(`modelpath error: expecting json file: ${path}`);\n return path;\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: checks current config validity\nexport function validate(defaults: Partial, config: Partial, parent = 'config', msgs: { reason: string, where: string, expected?: string }[] = []) {\n for (const key of Object.keys(config)) {\n if (typeof config[key] === 'object') {\n validate(defaults[key], config[key], key, msgs);\n } else {\n const defined = defaults && (typeof defaults[key] !== 'undefined');\n if (!defined) msgs.push({ reason: 'unknown property', where: `${parent}.${key} = ${config[key]}` });\n const same = defaults && typeof defaults[key] === typeof config[key];\n if (defined && !same) msgs.push({ reason: 'property type mismatch', where: `${parent}.${key} = ${config[key]}`, expected: typeof defaults[key] });\n }\n // ok = ok && defined && same;\n }\n if (config.debug && parent === 'config' && msgs.length > 0) log('invalid configuration', msgs);\n return msgs;\n}\n\n// helper function: perform deep merge of multiple objects so it allows full inheritance with overrides\nexport function mergeDeep(...objects) {\n const isObject = (obj) => obj && typeof obj === 'object';\n return objects.reduce((prev, obj) => {\n Object.keys(obj || {}).forEach((key) => {\n const pVal = prev[key];\n const oVal = obj[key];\n if (Array.isArray(pVal) && Array.isArray(oVal)) prev[key] = pVal.concat(...oVal);\n else if (isObject(pVal) && isObject(oVal)) prev[key] = mergeDeep(pVal, oVal);\n else prev[key] = oVal;\n });\n return prev;\n }, {});\n}\n\n// helper function: return min and max from input array\nexport const minmax = (data: number[]) => data.reduce((acc: number[], val) => {\n acc[0] = (acc[0] === undefined || val < acc[0]) ? val : acc[0];\n acc[1] = (acc[1] === undefined || val > acc[1]) ? val : acc[1];\n return acc;\n}, []);\n\n// helper function: async wait\nexport async function wait(time: number) {\n const waiting = new Promise((resolve) => { setTimeout(() => resolve(true), time); });\n await waiting;\n}\n", "/* eslint-disable no-multi-spaces */\n\n/** Possible TensorFlow backends */\nexport type BackendEnum = '' | 'cpu' | 'wasm' | 'webgl' | 'humangl' | 'tensorflow' | 'webgpu';\n\n/** Possible values for `human.warmup` */\nexport type WarmupEnum = '' | 'none' | 'face' | 'full' | 'body';\n\n/** Possible segmentation model behavior */\nexport type SegmentationEnum = 'default' | 'alpha' | 'foreground' | 'state'\n\n/** Generic config type inherited by all module types */\nexport interface GenericConfig {\n /** is module enabled? */\n enabled: boolean,\n /** path to model json file (relative to `modelBasePath` */\n modelPath: string,\n /** how many max frames to go without re-running model if cached results are acceptable\n * for two-phase models such as face and hand caching applies to bounding boxes detection only */\n skipFrames: number,\n /** how many max milliseconds to go without re-running model if cached results are acceptable\n * for two-phase models such as face and hand caching applies to bounding boxes detection only */\n skipTime: number,\n}\n\n/** Detector part of face configuration */\nexport interface FaceDetectorConfig extends GenericConfig {\n /** is face rotation correction performed after detecting face?\n * used to correctly analyze faces under high angles\n */\n rotation: boolean,\n /** maximum number of detected faces */\n maxDetected: number,\n /** minimum confidence for a detected face before results are discarded */\n minConfidence: number,\n /** minimum overlap between two detected faces before one is discarded */\n iouThreshold: number,\n /** should child models perform on masked image of a face */\n mask: boolean,\n /** should face detection return processed and cropped face tensor that can with an external model for addtional processing?\n * if enabled it must be manually deallocated to avoid memory leak */\n return: boolean,\n}\n\n/** Mesh part of face configuration */\nexport interface FaceMeshConfig extends GenericConfig {\n /** Keep detected faces that cannot be verified using facemesh */\n keepInvalid: boolean\n}\n\n/** Iris part of face configuration */\nexport interface FaceIrisConfig extends GenericConfig {}\n\n/** Attention part of face configuration */\nexport interface FaceAttentionConfig extends GenericConfig {}\n\n/** Description or face embedding part of face configuration\n * - also used by age and gender detection\n */\nexport interface FaceDescriptionConfig extends GenericConfig {\n /** minimum confidence for a detected face before results are discarded */\n minConfidence: number,\n}\n\n/** Emotion part of face configuration */\nexport interface FaceEmotionConfig extends GenericConfig {\n /** minimum confidence for a detected face before results are discarded */\n minConfidence: number,\n}\n\n/** Anti-spoofing part of face configuration */\nexport interface FaceAntiSpoofConfig extends GenericConfig {}\n\n/** Liveness part of face configuration */\nexport interface FaceLivenessConfig extends GenericConfig {}\n\n/** Gear part of face configuration */\nexport interface FaceGearConfig extends GenericConfig {\n /** minimum confidence for a detected race before results are discarded */\n minConfidence: number,\n}\n\n/** Configures all face-specific options: face detection, mesh analysis, age, gender, emotion detection and face description */\nexport interface FaceConfig extends GenericConfig {\n detector: Partial,\n mesh: Partial,\n attention: Partial,\n iris: Partial,\n description: Partial,\n emotion: Partial,\n antispoof: Partial,\n liveness: Partial,\n gear: Partial,\n}\n\n/** Configures all body detection specific options */\nexport interface BodyConfig extends GenericConfig {\n /** maximum number of detected bodies */\n maxDetected: number,\n /** minimum confidence for a detected body before results are discarded */\n minConfidence: number,\n /* experimental\n /** experimental: detector used for body model before actual analysis\n detector?: {\n /** experimental: enable body detector before body landmarks\n enabled: boolean,\n /** experimental: path to optional body detector model json file\n modelPath: string,\n /** experimental: minimum confidence for a detected body before results are discarded\n minConfidence: number,\n /** experimental: minimum overlap between two detected bodies before one is discarded\n iouThreshold: number\n },\n */\n}\n\n/** Configures all hand detection specific options */\nexport interface HandConfig extends GenericConfig {\n /** should hand rotation correction be performed after hand detection? */\n rotation: boolean,\n /** minimum confidence for a detected hand before results are discarded */\n minConfidence: number,\n /** minimum overlap between two detected hands before one is discarded */\n iouThreshold: number,\n /** maximum number of detected hands */\n maxDetected: number,\n /** should hand landmarks be detected or just return detected hand box */\n landmarks: boolean,\n detector: {\n /** path to hand detector model json */\n modelPath?: string,\n },\n skeleton: {\n /** path to hand skeleton model json */\n modelPath?: string,\n },\n}\n\n/** Configures all object detection specific options */\nexport interface ObjectConfig extends GenericConfig {\n /** minimum confidence for a detected objects before results are discarded */\n minConfidence: number,\n /** minimum overlap between two detected objects before one is discarded */\n iouThreshold: number,\n /** maximum number of detected objects */\n maxDetected: number,\n}\n\n/** Configures all body segmentation module\n * removes background from input containing person\n * if segmentation is enabled it will run as preprocessing task before any other model\n * alternatively leave it disabled and use it on-demand using human.segmentation method which can\n * remove background or replace it with user-provided background\n*/\nexport interface SegmentationConfig extends GenericConfig {\n /** downsample ratio, adjust to reflect approximately how much of input is taken by body */\n ratio: number,\n /** possible rvm segmentation mode */\n mode: SegmentationEnum,\n}\n\n/** Run input through image filters before inference\n * - available only in Browser environments\n * - image filters run with near-zero latency as they are executed on the GPU using WebGL\n*/\nexport interface FilterConfig {\n /** are image filters enabled? */\n enabled: boolean,\n /** perform image histogram equalization\n * - equalization is performed on input as a whole and detected face before its passed for further analysis\n */\n equalization: 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 /** apply auto-brighness */\n autoBrightness: 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\n/** Controlls gesture detection */\nexport interface GestureConfig {\n /** is gesture detection enabled? */\n enabled: boolean,\n}\n/**\n * Configuration interface definition for **Human** library\n * Contains all configurable parameters\n * Defaults: [config](https://github.com/vladmandic/human/blob/main/src/config.ts#L262)\n */\nexport interface Config {\n /** Backend used for TFJS operations\n * valid build-in backends are:\n * - Browser: `cpu`, `wasm`, `webgl`, `humangl`, `webgpu`\n * - NodeJS: `cpu`, `wasm`, `tensorflow`\n * default: `webgl` for browser and `tensorflow` for nodejs\n */\n backend: BackendEnum,\n\n /** Path to *.wasm files if backend is set to `wasm`\n *\n * default: auto-detects to link to CDN `jsdelivr` when running in browser\n */\n wasmPath: string,\n\n /** Force WASM loader to use platform fetch\n *\n * default: false\n */\n wasmPlatformFetch: boolean,\n\n /** Print debug statements to console\n *\n * default: `true`\n */\n debug: boolean,\n\n /** Perform model loading and inference concurrently or sequentially\n *\n * default: `true`\n */\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 * - used by `webgl`, `humangl` and `webgpu` backends\n *\n * default: `full`\n */\n warmup: WarmupEnum,\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 * default: `../models/` for browsers and `file://models/` for nodejs\n */\n modelBasePath: string,\n\n /** Cache models in IndexDB on first sucessfull load\n * default: true if indexdb is available (browsers), false if its not (nodejs)\n */\n cacheModels: boolean,\n\n /** Validate kernel ops used in model during model load\n * default: true\n * any errors will be printed on console but will be treated as non-fatal\n */\n validateModels: boolean,\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 * default: 0.7\n */\n cacheSensitivity: number;\n\n /** Explicit flags passed to initialize TFJS */\n flags: Record,\n\n /** Software Kernels\n * Registers software kernel ops running on CPU when accelerated version of kernel is not found in the current backend\n */\n softwareKernels: boolean,\n\n /** Perform immediate garbage collection on deallocated tensors instead of caching them */\n deallocate: boolean;\n\n /** Internal Variable */\n skipAllowed: boolean;\n\n /** Filter config {@link FilterConfig} */\n filter: Partial,\n\n /** Gesture config {@link GestureConfig} */\n gesture: Partial;\n\n /** Face config {@link FaceConfig} */\n face: Partial,\n\n /** Body config {@link BodyConfig} */\n body: Partial,\n\n /** Hand config {@link HandConfig} */\n hand: Partial,\n\n /** Object config {@link ObjectConfig} */\n object: Partial,\n\n /** Segmentation config {@link SegmentationConfig} */\n segmentation: Partial,\n}\n\n/** - [See all default Config values...](https://github.com/vladmandic/human/blob/main/src/config.ts#L262) */\nconst config: Config = {\n backend: '',\n modelBasePath: '',\n cacheModels: true,\n validateModels: true,\n wasmPath: '',\n wasmPlatformFetch: false,\n debug: false,\n async: true,\n warmup: 'full',\n cacheSensitivity: 0.70,\n skipAllowed: false,\n deallocate: false,\n flags: {},\n softwareKernels: false,\n filter: {\n enabled: true,\n equalization: false,\n width: 0,\n height: 0,\n flip: false,\n return: true,\n autoBrightness: true,\n brightness: 0,\n contrast: 0,\n sharpness: 0,\n blur: 0,\n saturation: 0,\n hue: 0,\n negative: false,\n sepia: false,\n vintage: false,\n kodachrome: false,\n technicolor: false,\n polaroid: false,\n pixelate: 0,\n },\n gesture: {\n enabled: true,\n },\n face: {\n enabled: true,\n detector: {\n modelPath: 'blazeface.json',\n rotation: true,\n maxDetected: 1,\n skipFrames: 99,\n skipTime: 2500,\n minConfidence: 0.2,\n iouThreshold: 0.1,\n mask: false,\n return: false,\n },\n mesh: {\n enabled: true,\n modelPath: 'facemesh.json',\n keepInvalid: false,\n },\n attention: {\n enabled: false,\n modelPath: 'facemesh-attention.json',\n },\n iris: {\n enabled: true,\n modelPath: 'iris.json',\n },\n emotion: {\n enabled: true,\n minConfidence: 0.1,\n skipFrames: 99,\n skipTime: 1500,\n modelPath: 'emotion.json',\n },\n description: {\n enabled: true,\n modelPath: 'faceres.json',\n skipFrames: 99,\n skipTime: 3000,\n minConfidence: 0.1,\n },\n antispoof: {\n enabled: false,\n skipFrames: 99,\n skipTime: 4000,\n modelPath: 'antispoof.json',\n },\n liveness: {\n enabled: false,\n skipFrames: 99,\n skipTime: 4000,\n modelPath: 'liveness.json',\n },\n },\n body: {\n enabled: true,\n modelPath: 'movenet-lightning.json',\n maxDetected: -1,\n minConfidence: 0.3,\n skipFrames: 1,\n skipTime: 200,\n },\n hand: {\n enabled: true,\n rotation: true,\n skipFrames: 99,\n skipTime: 1000,\n minConfidence: 0.50,\n iouThreshold: 0.2,\n maxDetected: -1,\n landmarks: true,\n detector: {\n modelPath: 'handtrack.json',\n },\n skeleton: {\n modelPath: 'handlandmark-full.json',\n },\n },\n object: {\n enabled: false,\n modelPath: 'centernet.json',\n minConfidence: 0.2,\n iouThreshold: 0.4,\n maxDetected: 10,\n skipFrames: 99,\n skipTime: 2000,\n },\n segmentation: {\n enabled: false,\n modelPath: 'rvm.json',\n ratio: 0.5,\n mode: 'default',\n },\n};\n\nexport { config as defaults };\n", "export const vertexIdentity = `\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`;\n\nexport const fragmentIdentity = `\n precision highp float;\n varying vec2 vUv;\n uniform sampler2D texture;\n void main(void) {\n gl_FragColor = texture2D(texture, vUv);\n }\n`;\n\nexport const colorMatrixWithAlpha = `\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`;\n\nexport const colorMatrixWithoutAlpha = `\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`;\n\nexport const pixelate = `\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`;\n\nexport const blur = `\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`;\n\nexport const convolution = `\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`;\n", "/**\n * Image Filters in WebGL algoritm implementation\n * Based on: [WebGLImageFilter](https://github.com/phoboslab/WebGLImageFilter)\n */\n\n/* eslint-disable func-names */\n\nimport * as shaders from './imagefxshaders';\nimport { canvas } from './image';\nimport { log } from '../util/util';\n\nconst collect = (source, prefix: string, 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\nclass GLProgram {\n uniform = {};\n attribute = {};\n gl: WebGLRenderingContext;\n id: WebGLProgram;\n\n constructor(gl, vertexSource, fragmentSource) {\n this.gl = gl;\n const vertexShader = this.compile(vertexSource, this.gl.VERTEX_SHADER);\n const fragmentShader = this.compile(fragmentSource, this.gl.FRAGMENT_SHADER);\n this.id = this.gl.createProgram() as WebGLProgram;\n if (!vertexShader || !fragmentShader) return;\n if (!this.id) {\n log('filter: could not create webgl program');\n return;\n }\n this.gl.attachShader(this.id, vertexShader);\n this.gl.attachShader(this.id, fragmentShader);\n this.gl.linkProgram(this.id);\n if (!this.gl.getProgramParameter(this.id, this.gl.LINK_STATUS)) {\n log(`filter: gl link failed: ${this.gl.getProgramInfoLog(this.id) || 'unknown'}`);\n return;\n }\n this.gl.useProgram(this.id);\n collect(vertexSource, 'attribute', this.attribute); // Collect attributes\n for (const a in this.attribute) this.attribute[a] = this.gl.getAttribLocation(this.id, a);\n collect(vertexSource, 'uniform', this.uniform); // Collect uniforms\n collect(fragmentSource, 'uniform', this.uniform);\n for (const u in this.uniform) this.uniform[u] = this.gl.getUniformLocation(this.id, u);\n }\n\n compile = (source, type): WebGLShader | null => {\n const shader = this.gl.createShader(type);\n if (!shader) {\n log('filter: could not create shader');\n return null;\n }\n this.gl.shaderSource(shader, source);\n this.gl.compileShader(shader);\n if (!this.gl.getShaderParameter(shader, this.gl.COMPILE_STATUS)) {\n log(`filter: gl compile failed: ${this.gl.getShaderInfoLog(shader) || 'unknown'}`);\n return null;\n }\n return shader;\n };\n}\n\n// function that is instantiated as class so it has private this members\n/**\n * @class GLImageFilter\n * @property {function} reset reset current filter chain\n * @property {function} add add specified filter to filter chain\n * @property {function} apply execute filter chain and draw result\n * @property {function} draw just draw input to result\n */\n\nexport function GLImageFilter() {\n let drawCount = 0;\n let sourceTexture: WebGLTexture | null = null;\n let lastInChain = false;\n let currentFramebufferIndex = -1;\n let tempFramebuffers: [null, null] | [{ fbo: WebGLFramebuffer | null, texture: WebGLTexture | null }] = [null, null];\n let filterChain: Record[] = [];\n let vertexBuffer: WebGLBuffer | null = null;\n let currentProgram: GLProgram | null = null;\n const fxcanvas = canvas(100, 100) as HTMLCanvasElement;\n const shaderProgramCache = { }; // key is the shader program source, value is the compiled program\n const DRAW = { INTERMEDIATE: 1 };\n const gl = fxcanvas.getContext('webgl') as WebGLRenderingContext;\n if (!gl) {\n log('filter: cannot get webgl context');\n return;\n }\n // @ts-ignore used for sanity checks outside of imagefx\n this.gl = gl;\n\n function resize(width, height) {\n if (width === fxcanvas.width && height === fxcanvas.height) return; // Same width/height? Nothing to do here\n fxcanvas.width = width;\n fxcanvas.height = height;\n if (!vertexBuffer) { // Create the context if we don't have it yet\n 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]); // Create the vertex buffer for the two triangles [x, y, u, v] * 6\n vertexBuffer = gl.createBuffer();\n 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, fxcanvas.width, fxcanvas.height);\n tempFramebuffers = [null, null]; // Delete old temp framebuffers\n }\n\n function createFramebufferTexture(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 function getTempFramebuffer(index): { fbo: WebGLFramebuffer | null, texture: WebGLTexture | null } {\n tempFramebuffers[index] = tempFramebuffers[index] || createFramebufferTexture(fxcanvas.width, fxcanvas.height);\n return tempFramebuffers[index] as { fbo: WebGLFramebuffer, texture: WebGLTexture };\n }\n\n function draw(flags = 0) {\n if (!currentProgram) return;\n let source: WebGLTexture | null = null;\n let target: WebGLFramebuffer | null = null;\n let flipY = false;\n if (drawCount === 0) source = sourceTexture; // First draw call - use the source texture\n else source = getTempFramebuffer(currentFramebufferIndex).texture || null; // All following draw calls use the temp buffer last drawn to\n drawCount++;\n if (lastInChain && !(flags & DRAW.INTERMEDIATE)) { // Last filter in our chain - draw directly to the WebGL Canvas. We may also have to flip the image vertically now\n target = null;\n flipY = drawCount % 2 === 0;\n } else {\n currentFramebufferIndex = (currentFramebufferIndex + 1) % 2;\n target = getTempFramebuffer(currentFramebufferIndex).fbo || null; // Intermediate draw call - get a temp buffer to draw to\n }\n gl.bindTexture(gl.TEXTURE_2D, source); // Bind the source and target and draw the two triangles\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 function compileShader(fragmentSource): GLProgram | null {\n if (shaderProgramCache[fragmentSource]) {\n currentProgram = shaderProgramCache[fragmentSource];\n gl.useProgram((currentProgram ? currentProgram.id : null) || null);\n return currentProgram;\n }\n currentProgram = new GLProgram(gl, shaders.vertexIdentity, fragmentSource);\n if (!currentProgram) {\n log('filter: could not get webgl program');\n return null;\n }\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 const filter = {\n colorMatrix: (matrix: number[]) => { // general color matrix filter\n const m = new Float32Array(matrix);\n m[4] /= 255;\n m[9] /= 255;\n m[14] /= 255;\n m[19] /= 255;\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) // Can we ignore the alpha value? Makes things a bit faster.\n ? shaders.colorMatrixWithoutAlpha\n : shaders.colorMatrixWithAlpha;\n const program = compileShader(shader);\n if (!program) return;\n gl.uniform1fv(program.uniform['m'], m);\n draw();\n },\n\n brightness: (brightness: number) => {\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 saturation: (amount: number) => {\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 desaturate: () => {\n filter.saturation(-1);\n },\n\n contrast: (amount: number) => {\n const v = (amount || 0) + 1;\n const o = -128 * (v - 1);\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 negative: () => {\n filter.contrast(-2);\n },\n\n hue: (rotation: number) => {\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 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 desaturateLuminance: () => {\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 sepia: () => {\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 brownie: () => {\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 vintagePinhole: () => {\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 kodachrome: () => {\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 technicolor: () => {\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 polaroid: () => {\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 shiftToBGR: () => {\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 convolution: (matrix: number[]) => { // general convolution Filter\n const m = new Float32Array(matrix);\n const pixelSizeX = 1 / fxcanvas.width;\n const pixelSizeY = 1 / fxcanvas.height;\n const program = compileShader(shaders.convolution);\n if (!program) return;\n gl.uniform1fv(program.uniform['m'], m);\n gl.uniform2f(program.uniform['px'], pixelSizeX, pixelSizeY);\n draw();\n },\n\n detectEdges: () => {\n // @ts-ignore this\n filter.convolution.call(this, [\n 0, 1, 0,\n 1, -4, 1,\n 0, 1, 0,\n ]);\n },\n\n sobelX: () => {\n // @ts-ignore this\n filter.convolution.call(this, [\n -1, 0, 1,\n -2, 0, 2,\n -1, 0, 1,\n ]);\n },\n\n sobelY: () => {\n // @ts-ignore this\n filter.convolution.call(this, [\n -1, -2, -1,\n 0, 0, 0,\n 1, 2, 1,\n ]);\n },\n\n sharpen: (amount) => {\n const a = amount || 1;\n // @ts-ignore this\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 emboss: (size: number) => {\n const s = size || 1;\n // @ts-ignore this\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 blur: (size: number) => {\n const blurSizeX = (size / 7) / fxcanvas.width;\n const blurSizeY = (size / 7) / fxcanvas.height;\n const program = compileShader(shaders.blur);\n if (!program) return;\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 pixelate: (size: number) => {\n const blurSizeX = (size) / fxcanvas.width;\n const blurSizeY = (size) / fxcanvas.height;\n const program = compileShader(shaders.pixelate);\n if (!program) return;\n gl.uniform2f(program.uniform['size'], blurSizeX, blurSizeY);\n draw();\n },\n };\n\n // @ts-ignore this\n this.add = function (name) {\n const args = Array.prototype.slice.call(arguments, 1); // eslint-disable-line prefer-rest-params\n const func = filter[name];\n filterChain.push({ func, args });\n };\n\n // @ts-ignore this\n this.reset = function () {\n filterChain = [];\n };\n\n // @ts-ignore this\n this.get = function () {\n return filterChain;\n };\n\n // @ts-ignore this\n this.apply = function (image) {\n resize(image.width, image.height);\n drawCount = 0;\n if (!sourceTexture) sourceTexture = gl.createTexture(); // Create the texture for the input image if we haven't yet\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 for (let i = 0; i < filterChain.length; i++) {\n lastInChain = (i === filterChain.length - 1);\n const f = filterChain[i];\n // @ts-ignore function assigment\n f.func.apply(this, f.args || []);\n }\n return fxcanvas;\n };\n\n // @ts-ignore this\n this.draw = function (image) {\n this.add('brightness', 0);\n return this.apply(image);\n };\n}\n", "/**\n * Image enhancements\n */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport type { Tensor } from '../exports';\n\nexport async function histogramEqualization(inputImage: Tensor): Promise {\n const squeeze = inputImage.shape.length === 4 ? tf.squeeze(inputImage) : inputImage;\n const rgb = tf.split(squeeze, 3, 2);\n const min: Tensor[] = [tf.min(rgb[0]), tf.min(rgb[1]), tf.min(rgb[2])]; // minimum pixel value per channel T[]\n const max: Tensor[] = [tf.max(rgb[0]), tf.max(rgb[1]), tf.max(rgb[2])]; // maximum pixel value per channel T[]\n // const absMin = await Promise.all(min.map((channel) => channel.data())); // minimum pixel value per channel A[]\n // const minValue = Math.min(absMax[0][0], absMin[1][0], absMin[2][0]);\n const absMax = await Promise.all(max.map((channel) => channel.data())); // maximum pixel value per channel A[]\n const maxValue = Math.max(absMax[0][0], absMax[1][0], absMax[2][0]);\n const maxRange = maxValue > 1 ? 255 : 1;\n const factor = maxRange / maxValue;\n let final: Tensor;\n if (factor > 1) {\n const sub = [tf.sub(rgb[0], min[0]), tf.sub(rgb[1], min[1]), tf.sub(rgb[2], min[2])]; // channels offset by min values\n const range = [tf.sub(max[0], min[0]), tf.sub(max[1], min[1]), tf.sub(max[2], min[2])]; // channel ranges\n // const fact = [tf.div(maxRange, absMax[0]), tf.div(maxRange, absMax[1]), tf.div(maxRange, absMax[1])]; // factors between\n const enh = [tf.mul(sub[0], factor), tf.mul(sub[1], factor), tf.mul(sub[2], factor)];\n const stack = tf.stack([enh[0], enh[1], enh[2]], 2);\n final = tf.reshape(stack, [1, squeeze.shape[0] || 0, squeeze.shape[1] || 0, 3]);\n tf.dispose([...sub, ...range, ...enh]);\n } else {\n final = tf.expandDims(squeeze, 0);\n }\n tf.dispose([...rgb, ...min, ...max, rgb, squeeze, inputImage]);\n return final;\n}\n", "/**\n * Image Processing algorithm implementation\n */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport * as fxImage from './imagefx';\nimport type { Input, AnyCanvas, Config } from '../exports';\nimport type { Tensor, Tensor3D, Tensor4D } from '../tfjs/types';\nimport { env } from '../util/env';\nimport { log } from '../util/util';\nimport * as enhance from './enhance';\n\nconst maxSize = 3840;\n// internal temp canvases\nlet inCanvas: AnyCanvas | null = null; // use global variable to avoid recreating canvas on each frame\nlet outCanvas: AnyCanvas | null = null; // use global variable to avoid recreating canvas on each frame\nlet tmpCanvas: AnyCanvas | null = null; // use global variable to avoid recreating canvas on each frame\n// @ts-ignore // imagefx is js module that should be converted to a class\nlet fx: fxImage.GLImageFilter | null; // instance of imagefx\n\nconst last: { inputSum: number, cacheDiff: number, sumMethod: number, inputTensor: undefined | Tensor } = {\n inputSum: 0,\n cacheDiff: 1,\n sumMethod: 0,\n inputTensor: undefined,\n};\n\nexport function reset() {\n last.inputSum = 0;\n last.cacheDiff = 1;\n last.sumMethod = 0;\n last.inputTensor = undefined;\n}\n\nexport function canvas(width: number, height: number): AnyCanvas {\n let c: AnyCanvas;\n if (env.browser) { // browser defines canvas object\n if (env.worker) { // if runing in web worker use OffscreenCanvas\n if (typeof OffscreenCanvas === 'undefined') throw new Error('canvas error: attempted to run in web worker but OffscreenCanvas is not supported');\n c = new OffscreenCanvas(width, height);\n } else { // otherwise use DOM canvas\n if (typeof document === 'undefined') throw new Error('canvas error: attempted to run in browser but DOM is not defined');\n c = document.createElement('canvas');\n c.width = width;\n c.height = height;\n }\n } else { // if not running in browser, there is no \"default\" canvas object, so we need monkey patch or fail\n // @ts-ignore // env.canvas is an external monkey-patch\n if (typeof env.Canvas !== 'undefined') c = new env.Canvas(width, height);\n else if (typeof globalThis.Canvas !== 'undefined') c = new globalThis.Canvas(width, height);\n // else throw new Error('canvas error: attempted to use canvas in nodejs without canvas support installed');\n }\n // @ts-ignore its either defined or we already threw an error\n return c;\n}\n\n// helper function to copy canvas from input to output\nexport function copy(input: AnyCanvas, output?: AnyCanvas) {\n const outputCanvas = output || canvas(input.width, input.height);\n const ctx = outputCanvas.getContext('2d') as CanvasRenderingContext2D;\n ctx.drawImage(input, 0, 0);\n return outputCanvas;\n}\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 async function process(input: Input, config: Config, getTensor: boolean = true): Promise<{ tensor: Tensor4D | null, canvas: AnyCanvas | null }> {\n if (!input) {\n // throw new Error('input is missing');\n if (config.debug) log('input error: input is missing');\n return { tensor: null, canvas: null }; // video may become temporarily unavailable due to onresize\n }\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 env.Canvas !== 'undefined' && input instanceof env.Canvas)\n && !(typeof globalThis.Canvas !== 'undefined' && input instanceof globalThis.Canvas)\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('input error: type is not recognized');\n }\n if (input instanceof tf.Tensor) { // if input is tensor use as-is without filters but correct shape as needed\n let tensor: Tensor | null = null;\n if (input['isDisposedInternal']) throw new Error('input error: attempted to use tensor but it is disposed');\n if (!(input as Tensor).shape) throw new Error('input error: attempted to use tensor without a shape');\n if ((input as Tensor).shape.length === 3) { // [height, width, 3 || 4]\n if ((input as Tensor).shape[2] === 3) { // [height, width, 3] so add batch\n tensor = tf.expandDims(input, 0);\n } else if ((input as Tensor).shape[2] === 4) { // [height, width, 4] so strip alpha and add batch\n const rgb = tf.slice3d(input as Tensor3D, [0, 0, 0], [-1, -1, 3]);\n tensor = tf.expandDims(rgb, 0);\n tf.dispose(rgb);\n }\n } else if ((input as Tensor).shape.length === 4) { // [1, width, height, 3 || 4]\n if ((input as Tensor).shape[3] === 3) { // [1, width, height, 3] just clone\n tensor = tf.clone(input);\n } else if ((input as Tensor).shape[3] === 4) { // [1, width, height, 4] so strip alpha\n tensor = tf.slice4d(input as Tensor4D, [0, 0, 0, 0], [-1, -1, -1, 3]);\n }\n }\n // at the end shape must be [1, height, width, 3]\n if (tensor == null || tensor.shape.length !== 4 || tensor.shape[0] !== 1 || tensor.shape[3] !== 3) throw new Error(`input error: attempted to use tensor with unrecognized shape: ${((input as Tensor).shape).toString()}`);\n if ((tensor).dtype === 'int32') {\n const cast = tf.cast(tensor, 'float32');\n tf.dispose(tensor);\n tensor = cast;\n }\n return { tensor: tensor as Tensor4D, canvas: (config.filter.return ? outCanvas : null) };\n }\n // check if resizing will be needed\n if (typeof input['readyState'] !== 'undefined' && (input as HTMLMediaElement).readyState <= 2) {\n if (config.debug) log('input stream is not ready');\n return { tensor: null, canvas: inCanvas }; // video may become temporarily unavailable due to onresize\n }\n const originalWidth: number = input['naturalWidth'] || input['videoWidth'] || input['width'] || (input['shape'] && (input['shape'][1] > 0));\n const originalHeight: number = input['naturalHeight'] || input['videoHeight'] || input['height'] || (input['shape'] && (input['shape'][2] > 0));\n if (!originalWidth || !originalHeight) {\n if (config.debug) log('cannot determine input dimensions');\n return { tensor: null, canvas: inCanvas }; // video may become temporarily unavailable due to onresize\n }\n let targetWidth: number = originalWidth;\n let targetHeight: number = originalHeight;\n if (targetWidth > maxSize) {\n targetWidth = maxSize;\n targetHeight = Math.trunc(targetWidth * originalHeight / originalWidth);\n }\n if (targetHeight > maxSize) {\n targetHeight = maxSize;\n targetWidth = Math.trunc(targetHeight * originalWidth / originalHeight);\n }\n\n // create our canvas and resize it if needed\n if ((config.filter?.width || 0) > 0) targetWidth = config.filter.width as number;\n else if ((config.filter?.height || 0) > 0) targetWidth = originalWidth * ((config.filter.height || 0) / originalHeight);\n if ((config.filter.height || 0) > 0) targetHeight = config.filter.height as number;\n else if ((config.filter.width || 0) > 0) targetHeight = originalHeight * ((config.filter.width || 0) / originalWidth);\n if (!targetWidth || !targetHeight) throw new Error('input error: cannot determine dimension');\n if (!inCanvas || (inCanvas.width !== targetWidth) || (inCanvas.height !== targetHeight)) inCanvas = canvas(targetWidth, targetHeight);\n\n // draw input to our canvas\n const inCtx = inCanvas.getContext('2d') as CanvasRenderingContext2D;\n if ((typeof ImageData !== 'undefined') && (input instanceof ImageData)) {\n inCtx.putImageData(input, 0, 0);\n } else {\n if (config.filter.flip && typeof inCtx.translate !== 'undefined') {\n inCtx.translate(originalWidth, 0);\n inCtx.scale(-1, 1);\n inCtx.drawImage(input as AnyCanvas, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas.width, inCanvas.height);\n inCtx.setTransform(1, 0, 0, 1, 0, 0); // resets transforms to defaults\n } else {\n inCtx.drawImage(input as AnyCanvas, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas.width, inCanvas.height);\n }\n }\n\n if (!outCanvas || (inCanvas.width !== outCanvas.width) || (inCanvas.height !== outCanvas.height)) outCanvas = canvas(inCanvas.width, inCanvas.height); // init output canvas\n\n // imagefx transforms using gl from input canvas to output canvas\n if (config.filter.enabled && env.webgl.supported) {\n if (!fx) fx = env.browser ? new fxImage.GLImageFilter() : null; // && (typeof document !== 'undefined')\n env.filter = !!fx;\n if (!fx?.add) {\n if (config.debug) log('input process error: cannot initialize filters');\n env.webgl.supported = false;\n config.filter.enabled = false;\n copy(inCanvas, outCanvas); // filter failed to initialize\n // return { tensor: null, canvas: inCanvas };\n } else {\n fx.reset();\n if (config.filter.brightness !== 0) fx.add('brightness', config.filter.brightness);\n if (config.filter.contrast !== 0) fx.add('contrast', config.filter.contrast);\n if (config.filter.sharpness !== 0) fx.add('sharpen', config.filter.sharpness);\n if (config.filter.blur !== 0) fx.add('blur', config.filter.blur);\n if (config.filter.saturation !== 0) fx.add('saturation', config.filter.saturation);\n if (config.filter.hue !== 0) fx.add('hue', config.filter.hue);\n if (config.filter.negative) fx.add('negative');\n if (config.filter.sepia) fx.add('sepia');\n if (config.filter.vintage) fx.add('brownie');\n if (config.filter.sepia) fx.add('sepia');\n if (config.filter.kodachrome) fx.add('kodachrome');\n if (config.filter.technicolor) fx.add('technicolor');\n if (config.filter.polaroid) fx.add('polaroid');\n if (config.filter.pixelate !== 0) fx.add('pixelate', config.filter.pixelate);\n if (fx.get()?.length > 1) outCanvas = fx.apply(inCanvas);\n else outCanvas = fx.draw(inCanvas);\n }\n } else {\n copy(inCanvas, outCanvas); // if no filters applied, output canvas is input canvas\n if (fx) fx = null;\n env.filter = !!fx;\n }\n\n if (!getTensor) return { tensor: null, canvas: outCanvas }; // just canvas was requested\n if (!outCanvas) throw new Error('canvas error: cannot create output');\n\n // create tensor from image unless input was a tensor already\n let pixels;\n let depth = 3;\n if ((typeof ImageData !== 'undefined' && input instanceof ImageData) || ((input as ImageData).data && (input as ImageData).width && (input as ImageData).height)) { // if input is imagedata, just use it\n if (env.browser && tf.browser) {\n pixels = tf.browser ? tf.browser.fromPixels(input as ImageData) : null;\n } else {\n depth = (input as ImageData).data.length / (input as ImageData).height / (input as ImageData).width;\n // const arr = Uint8Array.from(input['data']);\n const arr = new Uint8Array((input as ImageData).data.buffer);\n pixels = tf.tensor(arr, [(input as ImageData).height, (input as ImageData).width, depth], 'int32');\n }\n } else {\n if (!tmpCanvas || (outCanvas.width !== tmpCanvas.width) || (outCanvas.height !== tmpCanvas.height)) tmpCanvas = canvas(outCanvas.width, outCanvas.height); // init output canvas\n if (tf.browser && env.browser) {\n if (config.backend === 'webgl' || config.backend === 'humangl' || config.backend === 'webgpu') {\n pixels = tf.browser.fromPixels(outCanvas as HTMLCanvasElement); // safe to reuse since both backend and context are gl based\n } else {\n tmpCanvas = copy(outCanvas); // cannot use output canvas as it already has gl context so we do a silly one more canvas\n pixels = tf.browser.fromPixels(tmpCanvas as HTMLCanvasElement);\n }\n } else {\n const tempCanvas = copy(outCanvas); // cannot use output canvas as it already has gl context so we do a silly one more canvas\n const tempCtx = tempCanvas.getContext('2d') as CanvasRenderingContext2D;\n const tempData = tempCtx.getImageData(0, 0, targetWidth, targetHeight);\n depth = tempData.data.length / targetWidth / targetHeight;\n const arr = new Uint8Array(tempData.data.buffer);\n pixels = tf.tensor(arr, [targetWidth, targetHeight, depth]);\n }\n }\n if (depth === 4) { // rgba to rgb\n const rgb = tf.slice3d(pixels, [0, 0, 0], [-1, -1, 3]); // strip alpha channel\n tf.dispose(pixels);\n pixels = rgb;\n }\n if (!pixels) throw new Error('input error: cannot create tensor');\n const casted: Tensor = tf.cast(pixels, 'float32');\n const tensor: Tensor = config.filter.equalization ? await enhance.histogramEqualization(casted) : tf.expandDims(casted, 0);\n tf.dispose([pixels, casted]);\n\n if (config.filter.autoBrightness) {\n const max = tf.max(tensor);\n const maxVal = await max.data();\n config.filter.brightness = maxVal[0] > 1 ? (1 - maxVal[0] / 255) : (1 - maxVal[0]);\n tf.dispose(max);\n }\n\n return { tensor: tensor as Tensor4D, canvas: (config.filter.return ? outCanvas : null) };\n}\n\n/*\nconst checksum = async (input: Tensor): Promise => { // use tf sum or js based sum loop depending on which is faster\n const resizeFact = 48;\n const reduced: Tensor = tf.image.resizeBilinear(input, [Math.trunc((input.shape[1] || 1) / resizeFact), Math.trunc((input.shape[2] || 1) / resizeFact)]);\n const tfSum = async (): Promise => {\n const sumT = tf.sum(reduced);\n const sum0 = await sumT.data();\n tf.dispose(sumT);\n return sum0[0];\n };\n const jsSum = async (): Promise => {\n const reducedData = await reduced.data(); // raw image rgb array\n let sum0 = 0;\n for (let i = 0; i < reducedData.length / 3; i++) sum0 += reducedData[3 * i + 2]; // look only at green value of each pixel\n return sum0;\n };\n if (last.sumMethod === 0) {\n const t0 = now();\n await jsSum();\n const t1 = now();\n await tfSum();\n const t2 = now();\n last.sumMethod = t1 - t0 < t2 - t1 ? 1 : 2;\n }\n const res = last.sumMethod === 1 ? await jsSum() : await tfSum();\n tf.dispose(reduced);\n return res;\n};\n*/\n\nexport async function skip(config: Partial, input: Tensor) {\n let skipFrame = false;\n if (config.cacheSensitivity === 0 || !input.shape || input.shape.length !== 4 || input.shape[1] > 3840 || input.shape[2] > 2160) return skipFrame; // cache disabled or input is invalid or too large for cache analysis\n\n /*\n const checkSum = await checksum(input);\n const diff = 100 * (Math.max(checkSum, last.inputSum) / Math.min(checkSum, last.inputSum) - 1);\n last.inputSum = checkSum;\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 let skipFrame = diff < Math.max(config.cacheSensitivity, last.cacheDiff);\n // if difference is above 10x threshold, don't use last value to force reset cache for significant change of scenes or images\n last.cacheDiff = diff > 10 * config.cacheSensitivity ? 0 : diff;\n skipFrame = skipFrame && (last.cacheDiff > 0); // if no cached diff value then force no skip\n */\n\n if (!last.inputTensor) {\n last.inputTensor = tf.clone(input);\n } else if (last.inputTensor.shape[1] !== input.shape[1] || last.inputTensor.shape[2] !== input.shape[2]) { // input resolution changed\n tf.dispose(last.inputTensor);\n last.inputTensor = tf.clone(input);\n } else {\n const t: Record = {};\n t.diff = tf.sub(input, last.inputTensor);\n t.squared = tf.mul(t.diff, t.diff);\n t.sum = tf.sum(t.squared);\n const diffSum = await t.sum.data();\n const diffRelative = diffSum[0] / (input.shape[1] || 1) / (input.shape[2] || 1) / 255 / 3; // squared difference relative to input resolution and averaged per channel\n tf.dispose([last.inputTensor, t.diff, t.squared, t.sum]);\n last.inputTensor = tf.clone(input);\n skipFrame = diffRelative <= (config.cacheSensitivity || 0);\n }\n return skipFrame;\n}\n\nexport async function compare(config: Partial, input1: Tensor, input2: Tensor): Promise {\n const t: Record = {};\n if (!input1 || !input2 || input1.shape.length !== 4 || input1.shape.length !== input2.shape.length) {\n if (!config.debug) log('invalid input tensor or tensor shapes do not match:', input1.shape, input2.shape);\n return 0;\n }\n if (input1.shape[0] !== 1 || input2.shape[0] !== 1 || input1.shape[3] !== 3 || input2.shape[3] !== 3) {\n if (!config.debug) log('input tensors must be of shape [1, height, width, 3]:', input1.shape, input2.shape);\n return 0;\n }\n t.input1 = tf.clone(input1);\n t.input2 = (input1.shape[1] !== input2.shape[1] || input1.shape[2] !== input2.shape[2]) ? tf.image.resizeBilinear(input2 as Tensor3D, [input1.shape[1], input1.shape[2]]) : tf.clone(input2);\n t.diff = tf.sub(t.input1, t.input2);\n t.squared = tf.mul(t.diff, t.diff);\n t.sum = tf.sum(t.squared);\n const diffSum = await t.sum.data();\n const diffRelative = diffSum[0] / (input1.shape[1] || 1) / (input1.shape[2] || 1) / 255 / 3;\n tf.dispose([t.input1, t.input2, t.diff, t.squared, t.sum]);\n return diffRelative;\n}\n", "import * as tf from 'dist/tfjs.esm.js';\nimport * as image from '../image/image';\n\n/** Env class that holds detected capabilities */\nexport class Env {\n /** Running in Browser */\n browser: boolean;\n /** Running in NodeJS */\n node: boolean;\n /** Running in WebWorker thread */\n worker: boolean;\n /** Detected platform */\n platform: string = '';\n /** Detected agent */\n agent: string = '';\n /** List of supported backends */\n backends: string[] = [];\n /** Has any work been performed so far */\n initial: boolean;\n /** Are image filters supported? */\n filter: boolean | undefined;\n /** TFJS instance details */\n tfjs: {\n version: undefined | string,\n };\n /** Is offscreenCanvas supported? */\n offscreen: undefined | boolean;\n /** Are performance counter instant values or additive */\n perfadd: boolean = false;\n /** If using tfjs-node get version of underlying tensorflow shared library and if gpu acceleration is enabled */\n tensorflow: {\n version: undefined | string,\n gpu: undefined | boolean,\n } = {\n version: undefined,\n gpu: undefined,\n };\n /** WASM detected capabilities */\n wasm: {\n supported: undefined | boolean,\n backend: undefined | boolean,\n simd: undefined | boolean,\n multithread: undefined | boolean,\n } = {\n supported: undefined,\n backend: undefined,\n simd: undefined,\n multithread: undefined,\n };\n /** WebGL detected capabilities */\n webgl: {\n supported: undefined | boolean,\n backend: undefined | boolean,\n version: undefined | string,\n renderer: undefined | string,\n shader: undefined | string,\n vendor: undefined | string,\n } = {\n supported: undefined,\n backend: undefined,\n version: undefined,\n renderer: undefined,\n shader: undefined,\n vendor: undefined,\n };\n /** WebGPU detected capabilities */\n webgpu: {\n supported: undefined | boolean,\n backend: undefined | boolean,\n adapter: undefined | GPUAdapterInfo,\n } = {\n supported: undefined,\n backend: undefined,\n adapter: undefined,\n };\n /** CPU info */\n cpu: {\n model: undefined | string,\n flags: string[],\n } = {\n model: undefined,\n flags: [],\n };\n /** List of supported kernels for current backend */\n kernels: string[] = [];\n /** MonkeyPatch for Canvas */\n Canvas: undefined;\n /** MonkeyPatch for Image */\n Image: undefined;\n /** MonkeyPatch for ImageData */\n ImageData: undefined;\n\n constructor() {\n this.browser = typeof navigator !== 'undefined';\n this.node = (typeof process !== 'undefined') && (typeof process.versions !== 'undefined') && (typeof process.versions.node !== 'undefined');\n this.tfjs = { version: tf.version['tfjs-core'] };\n this.offscreen = typeof OffscreenCanvas !== 'undefined';\n this.initial = true;\n\n // @ts-ignore WorkerGlobalScope evaluated in browser only\n this.worker = this.browser && this.offscreen ? (typeof WorkerGlobalScope !== 'undefined') : undefined;\n if (typeof navigator !== 'undefined') { // TBD replace with navigator.userAgentData once in mainline\n const raw = navigator.userAgent.match(/\\(([^()]+)\\)/g);\n if (raw?.[0]) {\n const platformMatch = raw[0].match(/\\(([^()]+)\\)/g);\n this.platform = (platformMatch?.[0]) ? platformMatch[0].replace(/\\(|\\)/g, '') : '';\n this.agent = navigator.userAgent.replace(raw[0], '');\n if (this.platform[1]) this.agent = this.agent.replace(raw[1], '');\n this.agent = this.agent.replace(/ /g, ' ');\n }\n } else if (typeof process !== 'undefined') {\n this.platform = `${process.platform} ${process.arch}`;\n this.agent = `NodeJS ${process.version}`;\n }\n }\n\n /** update backend information */\n async updateBackend() {\n // analyze backends\n this.backends = Object.keys(tf.engine().registryFactory);\n try { // backend may not be initialized\n this.tensorflow = {\n version: (tf.backend()['binding'] ? tf.backend()['binding'].TF_Version : undefined),\n gpu: (tf.backend()['binding'] ? tf.backend()['binding'].isUsingGpuDevice() : undefined),\n };\n } catch { /**/ }\n this.wasm.supported = typeof WebAssembly !== 'undefined';\n this.wasm.backend = this.backends.includes('wasm');\n if (this.wasm.supported && this.wasm.backend) {\n this.wasm.simd = await tf.env().getAsync('WASM_HAS_SIMD_SUPPORT') as boolean;\n this.wasm.multithread = await tf.env().getAsync('WASM_HAS_MULTITHREAD_SUPPORT') as boolean;\n }\n const c = image.canvas(100, 100);\n const gl = c ? c.getContext('webgl2') as WebGL2RenderingContext : undefined; // causes too many gl contexts\n this.webgl.supported = typeof gl !== 'undefined';\n this.webgl.backend = this.backends.includes('webgl');\n if (this.webgl.supported && this.webgl.backend && gl) {\n this.webgl.version = gl.getParameter(gl.VERSION);\n this.webgl.vendor = gl.getParameter(gl.VENDOR);\n this.webgl.renderer = gl.getParameter(gl.RENDERER);\n this.webgl.shader = gl.getParameter(gl.SHADING_LANGUAGE_VERSION);\n }\n this.webgpu.supported = this.browser && typeof navigator.gpu !== 'undefined';\n this.webgpu.backend = this.backends.includes('webgpu');\n try {\n if (this.webgpu.supported) {\n const adapter = await navigator.gpu.requestAdapter();\n this.webgpu.adapter = await adapter?.requestAdapterInfo();\n }\n } catch {\n this.webgpu.supported = false;\n }\n try {\n this.kernels = tf.getKernelsForBackend(tf.getBackend()).map((kernel) => kernel.kernelName.toLowerCase());\n } catch { /**/ }\n }\n\n /** update cpu information */\n updateCPU() {\n const cpu = { model: '', flags: [] };\n if (this.node && this.platform.startsWith('linux')) {\n /*\n const fs = require('fs');\n try {\n const data = fs.readFileSync('/proc/cpuinfo').toString();\n for (const line of data.split('\\n')) {\n if (line.startsWith('model name')) cpu.model = line.match(/:(.*)/g)[0].replace(':', '').trim();\n if (line.startsWith('flags')) cpu.flags = line.match(/:(.*)/g)[0].replace(':', '').trim().split(' ').sort();\n }\n } catch { }\n */\n }\n if (!this.cpu) Object.defineProperty(this, 'cpu', { value: cpu });\n else this.cpu = cpu;\n }\n}\n\nexport const env = new Env();\n", "import { log } from './util';\n\n// const log = (...msg) => console.log('webcam', ...msg); // eslint-disable-line no-console\n\n/** WebCam configuration */\nexport interface WebCamConfig {\n /**\n * element can be:\n * - string which indicates dom element id\n * - actual HTMLVideo dom element\n * - undefined in which case a new HTMLVideoElement will be created\n */\n element: string | HTMLVideoElement | undefined,\n /** print messages on console */\n debug: boolean,\n /** use front or back camera */\n mode: 'front' | 'back',\n /** camera crop mode */\n crop: boolean,\n /** desired webcam width */\n width: number,\n /** desired webcam height */\n height: number,\n /** deviceId of the video device to use */\n id?: string,\n}\n\nexport class WebCam { // eslint-disable-line @typescript-eslint/no-extraneous-class\n /** current webcam configuration */\n config: WebCamConfig;\n /** instance of dom element associated with webcam stream */\n element: HTMLVideoElement | undefined;\n /** active webcam stream */\n stream: MediaStream | undefined;\n /** enumerated video devices */\n devices: MediaDeviceInfo[] = [];\n\n constructor() {\n this.config = {\n element: undefined,\n debug: true,\n mode: 'front',\n crop: false,\n width: 0,\n height: 0,\n };\n }\n\n /** get active webcam stream track */\n public get track(): MediaStreamTrack | undefined {\n if (!this.stream) return undefined;\n return this.stream.getVideoTracks()[0];\n }\n\n /** get webcam capabilities */\n public get capabilities(): MediaTrackCapabilities | undefined {\n if (!this.track) return undefined;\n return this.track.getCapabilities ? this.track.getCapabilities() : undefined;\n }\n\n /** get webcam constraints */\n public get constraints(): MediaTrackConstraints | undefined {\n if (!this.track) return undefined;\n return this.track.getConstraints ? this.track.getConstraints() : undefined;\n }\n\n /** get webcam settings */\n public get settings(): MediaTrackSettings | undefined {\n if (!this.stream) return undefined;\n const track: MediaStreamTrack = this.stream.getVideoTracks()[0];\n return track.getSettings ? track.getSettings() : undefined;\n }\n\n /** get webcam label */\n public get label(): string {\n if (!this.track) return '';\n return this.track.label;\n }\n\n /** is webcam paused */\n public get paused(): boolean {\n return this.element?.paused || false;\n }\n\n /** webcam current width */\n public get width(): number {\n return this.element?.videoWidth || 0;\n }\n\n /** webcam current height */\n public get height(): number {\n return this.element?.videoHeight || 0;\n }\n\n public enumerate = async (): Promise => {\n try {\n const devices = await navigator.mediaDevices.enumerateDevices();\n this.devices = devices.filter((device) => device.kind === 'videoinput');\n } catch {\n this.devices = [];\n }\n return this.devices;\n };\n\n /** start method initializizes webcam stream and associates it with a dom video element */\n public start = async (webcamConfig?: Partial): Promise => {\n // set config\n if (webcamConfig?.debug) this.config.debug = webcamConfig?.debug;\n if (webcamConfig?.crop) this.config.crop = webcamConfig?.crop;\n if (webcamConfig?.mode) this.config.mode = webcamConfig?.mode;\n if (webcamConfig?.width) this.config.width = webcamConfig?.width;\n if (webcamConfig?.height) this.config.height = webcamConfig?.height;\n if (webcamConfig?.id) this.config.id = webcamConfig?.id;\n\n // use or create dom element\n if (webcamConfig?.element) {\n if (typeof webcamConfig.element === 'string') {\n const el = document.getElementById(webcamConfig.element);\n if (el && el instanceof HTMLVideoElement) {\n this.element = el;\n } else {\n if (this.config.debug) log('webcam', 'cannot get dom element', webcamConfig.element);\n return;\n }\n } else if (webcamConfig.element instanceof HTMLVideoElement) {\n this.element = webcamConfig.element;\n } else {\n if (this.config.debug) log('webcam', 'unknown dom element', webcamConfig.element);\n return;\n }\n } else {\n this.element = document.createElement('video');\n }\n\n // set constraints to use\n const requestedConstraints: MediaStreamConstraints = {\n audio: false,\n video: {\n facingMode: this.config.mode === 'front' ? 'user' : 'environment',\n // @ts-ignore // resizeMode is still not defined in tslib\n resizeMode: this.config.crop ? 'crop-and-scale' : 'none',\n width: { ideal: this.config.width > 0 ? this.config.width : window.innerWidth },\n height: { ideal: this.config.height > 0 ? this.config.height : window.innerHeight },\n },\n };\n if (this.config.id) (requestedConstraints.video as MediaTrackConstraintSet).deviceId = this.config.id;\n\n // set default event listeners\n this.element.addEventListener('play', () => { if (this.config.debug) log('webcam', 'play'); });\n this.element.addEventListener('pause', () => { if (this.config.debug) log('webcam', 'pause'); });\n this.element.addEventListener('click', async () => { // pause when clicked on screen and resume on next click\n if (!this.element || !this.stream) return;\n if (this.element.paused) await this.element.play();\n else this.element.pause();\n });\n\n // get webcam and set it to run in dom element\n if (!navigator?.mediaDevices) {\n if (this.config.debug) log('webcam', 'no devices');\n return;\n }\n try {\n this.stream = await navigator.mediaDevices.getUserMedia(requestedConstraints); // get stream that satisfies constraints\n } catch (err) {\n log('webcam', err);\n return;\n }\n if (!this.stream) {\n if (this.config.debug) log('webcam', 'no stream');\n return;\n }\n this.element.srcObject = this.stream; // assign it to dom element\n const ready = new Promise((resolve) => { // wait until stream is ready\n if (!this.element) resolve(false);\n else this.element.onloadeddata = () => resolve(true);\n });\n await ready;\n await this.element.play(); // start playing\n\n if (this.config.debug) {\n log('webcam', {\n width: this.width,\n height: this.height,\n label: this.label,\n stream: this.stream,\n track: this.track,\n settings: this.settings,\n constraints: this.constraints,\n capabilities: this.capabilities,\n });\n }\n };\n\n /** pause webcam video method */\n public pause = (): void => {\n if (this.element) this.element.pause();\n };\n\n /** play webcam video method */\n public play = async (): Promise => {\n if (this.element) await this.element.play();\n };\n\n /** stop method stops active webcam stream track and disconnects webcam */\n public stop = (): void => {\n if (this.config.debug) log('webcam', 'stop');\n if (this.track) this.track.stop();\n };\n}\n", "import * as tf from 'dist/tfjs.esm.js';\nimport { log, join } from '../util/util';\nimport type { GraphModel } from './types';\nimport type { Config } from '../config';\nimport * as modelsDefs from '../../models/models.json';\n\nconst options = {\n cacheModels: true,\n cacheSupported: true,\n verbose: true,\n debug: false,\n modelBasePath: '',\n};\n\nexport interface ModelInfo {\n name: string,\n inCache: boolean,\n sizeDesired: number,\n sizeFromManifest: number,\n sizeLoadedWeights: number,\n url: string,\n}\n\nexport const modelStats: Record = {};\n\nasync function httpHandler(url: string, init?: RequestInit): Promise {\n if (options.debug) log('load model fetch:', url, init);\n return fetch(url, init);\n}\n\nexport function setModelLoadOptions(config: Config) {\n options.cacheModels = config.cacheModels;\n options.verbose = config.debug;\n options.modelBasePath = config.modelBasePath;\n}\n\nexport async function loadModel(modelPath: string | undefined): Promise {\n let modelUrl = join(options.modelBasePath, modelPath || '');\n if (!modelUrl.toLowerCase().endsWith('.json')) modelUrl += '.json';\n const modelPathSegments = modelUrl.includes('/') ? modelUrl.split('/') : modelUrl.split('\\\\');\n const shortModelName = modelPathSegments[modelPathSegments.length - 1].replace('.json', '');\n const cachedModelName = 'indexeddb://' + shortModelName; // generate short model name for cache\n modelStats[shortModelName] = {\n name: shortModelName,\n sizeFromManifest: 0,\n sizeLoadedWeights: 0,\n sizeDesired: modelsDefs[shortModelName],\n inCache: false,\n url: '',\n };\n options.cacheSupported = (typeof indexedDB !== 'undefined'); // check if localStorage and indexedb are available\n let cachedModels = {};\n try {\n cachedModels = (options.cacheSupported && options.cacheModels) ? await tf.io.listModels() : {}; // list all models already in cache // this fails for webview although localStorage is defined\n } catch {\n options.cacheSupported = false;\n }\n modelStats[shortModelName].inCache = (options.cacheSupported && options.cacheModels) && Object.keys(cachedModels).includes(cachedModelName); // is model found in cache\n modelStats[shortModelName].url = modelStats[shortModelName].inCache ? cachedModelName : modelUrl;\n const tfLoadOptions = typeof fetch === 'undefined' ? {} : { fetchFunc: (url: string, init?: RequestInit) => httpHandler(url, init) };\n let model: GraphModel = new tf.GraphModel(modelStats[shortModelName].url, tfLoadOptions) as unknown as GraphModel; // create model prototype and decide if load from cache or from original modelurl\n let loaded = false;\n try {\n // @ts-ignore private function\n model.findIOHandler(); // decide how to actually load a model\n if (options.debug) log('model load handler:', model['handler']);\n } catch (err) {\n log('error finding model i/o handler:', modelUrl, err);\n }\n try {\n // @ts-ignore private property\n const artifacts = await model.handler?.load() || null; // load manifest\n modelStats[shortModelName].sizeFromManifest = artifacts?.weightData?.byteLength || 0;\n if (artifacts) model.loadSync(artifacts); // load weights\n else model = await tf.loadGraphModel(modelStats[shortModelName].inCache ? cachedModelName : modelUrl, tfLoadOptions) as unknown as GraphModel;\n // @ts-ignore private property\n modelStats[shortModelName].sizeLoadedWeights = model.artifacts?.weightData?.byteLength || 0;\n if (options.verbose) log('load:', { model: shortModelName, url: model['modelUrl'], bytes: modelStats[shortModelName].sizeLoadedWeights });\n loaded = true;\n } catch (err) {\n log('error loading model:', modelUrl, err);\n }\n if (loaded && options.cacheModels && options.cacheSupported && !modelStats[shortModelName].inCache) { // save model to cache\n try {\n const saveResult = await model.save(cachedModelName);\n if (options.debug) log('model saved:', cachedModelName, saveResult);\n } catch (err) {\n log('error saving model:', modelUrl, err);\n }\n }\n return model;\n}\n", "/** TFJS custom backend registration */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport type { Human } from '../human';\nimport { log } from '../util/util';\nimport * as image from '../image/image';\nimport type { AnyCanvas } from '../exports';\n\nexport const config = {\n name: 'humangl',\n priority: 999,\n canvas: null as null | AnyCanvas,\n gl: null as null | WebGL2RenderingContext,\n extensions: [] as string[] | null,\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, // default=true\n desynchronized: true, // default=undefined\n },\n};\n\nfunction extensions(): void {\n /*\n https://www.khronos.org/registry/webgl/extensions/\n https://webglreport.com/?v=2\n */\n const gl = config.gl;\n if (!gl) return;\n config.extensions = gl.getSupportedExtensions();\n // gl.getExtension('KHR_parallel_shader_compile');\n}\n\n/**\n * Registers custom WebGL2 backend to be used by Human library\n *\n * @returns void\n */\nexport function register(instance: Human): void {\n // force backend reload if gl context is not valid\n if (instance.config.backend !== 'humangl') return;\n if ((config.name in tf.engine().registry) && !config?.gl?.getParameter(config.gl.VERSION)) {\n log('humangl error: backend invalid context');\n instance.models.reset();\n /*\n log('resetting humangl backend');\n await tf.removeBackend(config.name);\n await register(instance); // re-register\n */\n }\n if (!tf.findBackend(config.name)) {\n try {\n config.canvas = image.canvas(100, 100);\n } catch (err) {\n log('humangl error: cannot create canvas:', err);\n return;\n }\n try {\n config.gl = config.canvas.getContext('webgl2', config.webGLattr) as WebGL2RenderingContext;\n if (!config.gl) {\n log('humangl error: cannot get webgl context');\n return;\n }\n const glv2 = config.gl.getParameter(config.gl.VERSION).includes('2.0');\n if (!glv2) {\n log('backend override: using fallback webgl backend as webgl 2.0 is not detected');\n instance.config.backend = 'webgl';\n return;\n }\n if (config.canvas) {\n config.canvas.addEventListener('webglcontextlost', (e) => {\n log('humangl error:', e.type);\n log('possible browser memory leak using webgl or conflict with multiple backend registrations');\n instance.emit('error');\n throw new Error('backend error: webgl context lost');\n });\n config.canvas.addEventListener('webglcontextrestored', (e) => {\n log('humangl error: context restored:', e);\n });\n config.canvas.addEventListener('webglcontextcreationerror', (e) => {\n log('humangl error: context create:', e);\n });\n }\n } catch (err) {\n log('humangl error: cannot get webgl context:', err);\n return;\n }\n try {\n tf.setWebGLContext(2, config.gl);\n } catch (err) {\n log('humangl error: cannot set webgl context:', err);\n return;\n }\n try {\n const ctx = new tf.GPGPUContext(config.gl);\n // @ts-ignore uncompatible kernelMs timing info\n tf.registerBackend(config.name, () => new tf.MathBackendWebGL(ctx), config.priority);\n } catch (err) {\n log('humangl 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('humangl error: cannot update webgl backend registration:', err);\n return;\n }\n try {\n // @ts-ignore private property\n if (tf.env().flagRegistry.WEBGL_VERSION) tf.env().set('WEBGL_VERSION', 2);\n } catch (err) {\n log('humangl error: cannot set WebGL backend flags:', err);\n return;\n }\n extensions();\n const backend = tf.backend();\n const current = typeof backend['gpgpu'] !== 'undefined' ? backend['getGPGPUContext']().gl : null;\n if (current) {\n if (instance.config.debug) log('humangl backend registered:', { webgl: current.getParameter(current.VERSION) as string, renderer: current.getParameter(current.RENDERER) as string });\n } else {\n log('humangl error: no current gl context:', current, config.gl);\n }\n }\n}\n", "import * as tf from 'dist/tfjs.esm.js';\nimport type { Tensor } from './types';\n\nexport const constants: Record = {\n tf255: 255.0,\n tf1: 1.0,\n tf2: 2.0,\n tf05: 0.5,\n tf127: 127.5,\n rgb: [0.2989, 0.5870, 0.1140],\n};\n\nexport function init() {\n constants.tf255 = tf.scalar(255.0, 'float32');\n constants.tf1 = tf.scalar(1.0, 'float32');\n constants.tf2 = tf.scalar(2.0, 'float32');\n constants.tf05 = tf.scalar(0.5, 'float32');\n constants.tf127 = tf.scalar(127.5, 'float32');\n constants.rgb = tf.tensor1d([0.2989, 0.5870, 0.1140], 'float32'); // factors for red/green/blue colors when converting to grayscale\n}\n", "/** TFJS backend initialization and customization */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport type { Human, Config, BackendEnum } from '../human';\nimport { log, now } from '../util/util';\nimport { env } from '../util/env';\nimport * as humangl from './humangl';\nimport * as constants from './constants';\nimport type { TensorInfo } from './types';\n\nexport async function getBestBackend(): Promise {\n await env.updateBackend(); // update env on backend init\n if (!env.browser) return 'tensorflow';\n if (env.webgpu.supported && env.webgpu.backend) return 'webgpu';\n if (env.webgl.supported && env.webgl.backend) return 'webgl';\n if (env.wasm.supported && env.wasm.backend) return 'wasm';\n return 'cpu';\n}\n\nfunction registerCustomOps(config: Config) {\n const newKernels: string[] = [];\n if (!env.kernels.includes('mod')) {\n const kernelMod = {\n kernelName: 'Mod',\n backendName: tf.getBackend(),\n kernelFunc: (op) => tf.tidy(() => tf.sub(op.inputs.a, tf.mul(tf.div(op.inputs.a, op.inputs.b), op.inputs.b))),\n };\n tf.registerKernel(kernelMod);\n env.kernels.push('mod');\n newKernels.push('mod');\n }\n if (!env.kernels.includes('floormod')) {\n const kernelFloorMod = {\n kernelName: 'FloorMod',\n backendName: tf.getBackend(),\n kernelFunc: (op) => tf.tidy(() => tf.add(tf.mul(tf.floorDiv(op.inputs.a, op.inputs.b), op.inputs.b), tf.mod(op.inputs.a, op.inputs.b))),\n };\n tf.registerKernel(kernelFloorMod);\n env.kernels.push('floormod');\n newKernels.push('floormod');\n }\n /*\n if (!env.kernels.includes('atan2') && config.softwareKernels) {\n const kernelAtan2 = {\n kernelName: 'Atan2',\n backendName: tf.getBackend(),\n kernelFunc: (op) => tf.tidy(() => {\n const backend = tf.getBackend();\n tf.setBackend('cpu');\n const t = tf.atan2(op.inputs.a, op.inputs.b);\n tf.setBackend(backend);\n return t;\n }),\n };\n if (config.debug) log('registered kernel:', 'atan2');\n log('registered kernel:', 'atan2');\n tf.registerKernel(kernelAtan2);\n env.kernels.push('atan2');\n newKernels.push('atan2');\n }\n */\n if (!env.kernels.includes('rotatewithoffset') && config.softwareKernels) {\n const kernelRotateWithOffset = {\n kernelName: 'RotateWithOffset',\n backendName: tf.getBackend(),\n kernelFunc: (op) => tf.tidy(() => {\n const backend = tf.getBackend();\n tf.setBackend('cpu'); // eslint-disable-line @typescript-eslint/no-floating-promises\n const t = tf.image.rotateWithOffset(op.inputs.image, op.attrs.radians, op.attrs.fillValue, op.attrs.center);\n tf.setBackend(backend); // eslint-disable-line @typescript-eslint/no-floating-promises\n return t;\n }),\n };\n tf.registerKernel(kernelRotateWithOffset);\n env.kernels.push('rotatewithoffset');\n newKernels.push('rotatewithoffset');\n }\n if ((newKernels.length > 0) && config.debug) log('registered kernels:', newKernels);\n}\n\nlet defaultFlags: Record = {};\n\nexport async function check(instance: Human, force = false) {\n instance.state = 'backend';\n if (instance.config.backend?.length === 0) instance.config.backend = await getBestBackend();\n if (force || env.initial || (instance.config.backend && (instance.config.backend.length > 0) && (tf.getBackend() !== instance.config.backend))) {\n const timeStamp = now();\n\n if (instance.config.backend && instance.config.backend.length > 0) {\n // detect web worker\n // @ts-ignore ignore missing type for WorkerGlobalScope as that is the point\n if (typeof window === 'undefined' && typeof WorkerGlobalScope !== 'undefined' && instance.config.debug) {\n if (instance.config.debug) log('running inside web worker');\n }\n\n // force browser vs node backend\n if (env.browser && instance.config.backend === 'tensorflow') {\n if (instance.config.debug) log('override: backend set to tensorflow while running in browser');\n instance.config.backend = 'webgl';\n }\n if (env.node && (instance.config.backend === 'webgl' || instance.config.backend === 'humangl')) {\n if (instance.config.debug) log(`override: backend set to ${instance.config.backend} while running in nodejs`);\n instance.config.backend = 'tensorflow';\n }\n\n // handle webgpu\n if (env.browser && instance.config.backend === 'webgpu') {\n if (typeof navigator === 'undefined' || typeof navigator.gpu === 'undefined') {\n log('override: backend set to webgpu but browser does not support webgpu');\n instance.config.backend = 'webgl';\n } else {\n const adapter = await navigator.gpu.requestAdapter();\n if (instance.config.debug) log('enumerated webgpu adapter:', adapter);\n if (!adapter) {\n log('override: backend set to webgpu but browser reports no available gpu');\n instance.config.backend = 'webgl';\n } else {\n // @ts-ignore requestAdapterInfo is not in tslib\n const adapterInfo = 'requestAdapterInfo' in adapter ? await adapter.requestAdapterInfo() : undefined;\n // if (adapter.features) adapter.features.forEach((feature) => log('webgpu features:', feature));\n log('webgpu adapter info:', adapterInfo);\n }\n }\n }\n\n // check available backends\n let available = Object.keys(tf.engine().registryFactory as Record);\n if (instance.config.backend === 'humangl' && !available.includes('humangl')) {\n humangl.register(instance);\n available = Object.keys(tf.engine().registryFactory as Record);\n }\n if (instance.config.debug) log('available backends:', available);\n\n if (!available.includes(instance.config.backend)) {\n log(`error: backend ${instance.config.backend} not found in registry`);\n instance.config.backend = env.node ? 'tensorflow' : 'webgl';\n if (instance.config.debug) log(`override: setting backend ${instance.config.backend}`);\n }\n\n if (instance.config.debug) log('setting backend:', [instance.config.backend]);\n\n // customize wasm\n if (instance.config.backend === 'wasm') {\n // @ts-ignore private property\n if (tf.env().flagRegistry.CANVAS2D_WILL_READ_FREQUENTLY) tf.env().set('CANVAS2D_WILL_READ_FREQUENTLY', true);\n if (instance.config.debug) log('wasm path:', instance.config.wasmPath);\n if (typeof tf.setWasmPaths !== 'undefined') tf.setWasmPaths(instance.config.wasmPath, instance.config.wasmPlatformFetch);\n else throw new Error('backend error: attempting to use wasm backend but wasm path is not set');\n let mt = false;\n let simd = false;\n try {\n mt = await tf.env().getAsync('WASM_HAS_MULTITHREAD_SUPPORT') as boolean;\n simd = await tf.env().getAsync('WASM_HAS_SIMD_SUPPORT') as boolean;\n if (instance.config.debug) log(`wasm execution: ${simd ? 'simd' : 'no simd'} ${mt ? 'multithreaded' : 'singlethreaded'}`);\n if (instance.config.debug && !simd) log('warning: wasm simd support is not enabled');\n } catch {\n log('wasm detection failed');\n }\n }\n\n try {\n await tf.setBackend(instance.config.backend);\n await tf.ready();\n } catch (err) {\n log('error: cannot set backend:', instance.config.backend, err);\n return false;\n }\n // @ts-ignore private property\n if (instance.config.debug) defaultFlags = JSON.parse(JSON.stringify(tf.env().flags));\n }\n\n // customize humangl\n if (tf.getBackend() === 'humangl' || tf.getBackend() === 'webgl') {\n // @ts-ignore private property\n if (tf.env().flagRegistry.WEBGL_USE_SHAPES_UNIFORMS) tf.env().set('WEBGL_USE_SHAPES_UNIFORMS', true); // default=false \n // @ts-ignore private property\n if (tf.env().flagRegistry.WEBGL_EXP_CONV) tf.env().set('WEBGL_EXP_CONV', true); // default=false \n // if (tf.env().flagRegistry['WEBGL_PACK_DEPTHWISECONV']) tf.env().set('WEBGL_PACK_DEPTHWISECONV', false); // default=true \n // if (tf.env().flagRegistry.USE_SETTIMEOUTCUSTOM) tf.env().set('USE_SETTIMEOUTCUSTOM', true); // default=false \n // if (tf.env().flagRegistry.CPU_HANDOFF_SIZE_THRESHOLD) tf.env().set('CPU_HANDOFF_SIZE_THRESHOLD', 1024); // default=1000\n // if (tf.env().flagRegistry['WEBGL_FORCE_F16_TEXTURES'] && !instance.config.object.enabled) tf.env().set('WEBGL_FORCE_F16_TEXTURES', true); // safe to use 16bit precision\n if (instance.config.debug && typeof instance.config.deallocate !== 'undefined' && instance.config.deallocate) { // hidden param\n log('changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:', true);\n tf.env().set('WEBGL_DELETE_TEXTURE_THRESHOLD', 0);\n }\n }\n\n // customize webgpu\n if (tf.getBackend() === 'webgpu') {\n // if (tf.env().flagRegistry['WEBGPU_CPU_HANDOFF_SIZE_THRESHOLD']) tf.env().set('WEBGPU_CPU_HANDOFF_SIZE_THRESHOLD', 512);\n // if (tf.env().flagRegistry['WEBGPU_DEFERRED_SUBMIT_BATCH_SIZE']) tf.env().set('WEBGPU_DEFERRED_SUBMIT_BATCH_SIZE', 0);\n // if (tf.env().flagRegistry['WEBGPU_CPU_FORWARD']) tf.env().set('WEBGPU_CPU_FORWARD', true);\n }\n\n if (instance.config.debug) {\n // @ts-ignore private property\n const newFlags = tf.env().flags;\n const updatedFlags = {};\n for (const key of Object.keys(newFlags)) {\n if (defaultFlags[key] === newFlags[key]) continue;\n updatedFlags[key] = newFlags[key];\n }\n if (instance.config.debug && Object.keys(updatedFlags).length > 0) log('backend:', tf.getBackend(), 'flags:', updatedFlags);\n }\n\n if (instance.config.flags && Object.keys(instance.config.flags).length > 0) {\n if (instance.config.debug) log('flags:', instance.config['flags']);\n for (const [key, val] of Object.entries(instance.config.flags)) {\n tf.env().set(key, val as number | boolean);\n }\n }\n\n tf.enableProdMode();\n constants.init();\n instance.performance.initBackend = Math.trunc(now() - timeStamp);\n instance.config.backend = tf.getBackend() as BackendEnum;\n await env.updateBackend(); // update env on backend init\n registerCustomOps(instance.config);\n // await env.updateBackend(); // update env on backend init\n env.initial = false;\n }\n return true;\n}\n\n// register fake missing tfjs ops\nexport function fakeOps(kernelNames: string[], config) {\n // if (config.debug) log('registerKernel:', kernelNames);\n for (const kernelName of kernelNames) {\n const kernelConfig = {\n kernelName,\n backendName: config.backend,\n kernelFunc: (param): TensorInfo => {\n if (config.debug) log('kernelFunc', kernelName, config.backend, param);\n return param?.inputs?.info as TensorInfo;\n },\n // setupFunc: () => { if (config.debug) log('kernelFunc', kernelName, config.backend); },\n // disposeFunc: () => { if (config.debug) log('kernelFunc', kernelName, config.backend); },\n };\n tf.registerKernel(kernelConfig);\n }\n env.kernels = tf.getKernelsForBackend(tf.getBackend()).map((kernel) => kernel.kernelName.toLowerCase()); // re-scan registered ops\n}\n", "/**\n * Module that implements helper draw functions, exposed as human.draw\n */\n\nimport { mergeDeep, now } from '../util/util';\nimport { env } from '../util/env';\nimport { getCanvasContext, rect } from './primitives';\nimport { options } from './options';\nimport { face } from './face';\nimport { body } from './body';\nimport { hand } from './hand';\nimport { object } from './object';\nimport { gesture } from './gesture';\nimport { defaultLabels } from './labels';\nimport type { Result, PersonResult } from '../result';\nimport type { AnyCanvas, DrawOptions } from '../exports';\n\nlet drawTime = 0;\n\nexport { options } from './options';\nexport { face } from './face';\nexport { body } from './body';\nexport { hand } from './hand';\nexport { object } from './object';\nexport { gesture } from './gesture';\n\n/** draw combined person results instead of individual detection result objects */\nexport function person(inCanvas: AnyCanvas, result: PersonResult[], drawOptions?: Partial) {\n const localOptions: DrawOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas) as CanvasRenderingContext2D;\n if (!ctx) return;\n ctx.lineJoin = 'round';\n ctx.font = localOptions.font;\n\n for (let i = 0; i < result.length; i++) {\n if (localOptions.drawBoxes) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n rect(ctx, result[i].box[0], result[i].box[1], result[i].box[2], result[i].box[3], localOptions);\n if (localOptions.drawLabels) {\n const label = `person #${i}`;\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(label, result[i].box[0] + 3, 1 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(label, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n ctx.stroke();\n }\n }\n}\n\n/** draw processed canvas */\nexport function canvas(input: AnyCanvas | HTMLImageElement | HTMLVideoElement, output: AnyCanvas) {\n if (!input || !output) return;\n const ctx = getCanvasContext(output) as CanvasRenderingContext2D;\n if (!ctx) return;\n ctx.drawImage(input, 0, 0);\n}\n\n/** meta-function that performs draw for: canvas, face, body, hand */\nexport async function all(inCanvas: AnyCanvas, result: Result, drawOptions?: Partial) {\n if (!result?.performance || !inCanvas) return null;\n const timeStamp = now();\n const localOptions = mergeDeep(options, drawOptions);\n const promise = Promise.all([\n face(inCanvas, result.face, localOptions),\n body(inCanvas, result.body, localOptions),\n hand(inCanvas, result.hand, localOptions),\n object(inCanvas, result.object, localOptions),\n gesture(inCanvas, result.gesture, localOptions), // gestures do not have buffering\n // person(inCanvas, result.persons, localOptions); // already included above\n ]);\n drawTime = env.perfadd ? drawTime + Math.round(now() - timeStamp) : Math.round(now() - timeStamp);\n result.performance.draw = drawTime;\n return promise;\n}\n\n/** sets default label templates for face/body/hand/object/gestures */\nexport function init() {\n options.faceLabels = defaultLabels.face;\n options.bodyLabels = defaultLabels.body;\n options.bodyPartLabels = defaultLabels.bodyPart;\n options.handLabels = defaultLabels.hand;\n options.fingerLabels = defaultLabels.finger;\n options.objectLabels = defaultLabels.object;\n options.gestureLabels = defaultLabels.gesture;\n}\n", "import { log } from '../util/util';\nimport type { AnyCanvas } from '../exports';\nimport type { Point } from '../result';\nimport type { DrawOptions } from './options';\n\nexport const getCanvasContext = (input: AnyCanvas) => {\n if (!input) log('draw error: invalid canvas');\n else if (!input.getContext) log('draw error: canvas context not defined');\n else {\n const ctx = input.getContext('2d');\n if (!ctx) log('draw error: cannot get canvas context');\n else return ctx;\n }\n return null;\n};\n\nexport const rad2deg = (theta: number) => Math.round((theta * 180) / Math.PI);\n\nexport const replace = (str: string, source: string, target: string | number) => str.replace(source, typeof target === 'number' ? target.toFixed(1) : target);\n\nexport const colorDepth = (z: number | undefined, opt: DrawOptions): string => { // performance optimization needed\n if (!opt.useDepth || typeof z === 'undefined') return opt.color;\n const rgb = Uint8ClampedArray.from([127 + (2 * z), 127 - (2 * z), 255]);\n return `rgba(${rgb[0]}, ${rgb[1]}, ${rgb[2]}, ${opt.alpha})`;\n};\n\nexport function labels(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, str: string, startX: number, startY: number, localOptions: DrawOptions) {\n const line: string[] = str.replace(/\\[.*\\]/g, '').split('\\n').map((l) => l.trim()); // remove unmatched templates and split into array\n const x = Math.max(0, startX);\n for (let i = line.length - 1; i >= 0; i--) {\n const y = i * localOptions.lineHeight + startY;\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(line[i], x + 5, y + 16);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(line[i], x + 4, y + 15);\n }\n}\n\nexport function point(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, x: number, y: number, z: number | undefined, localOptions: DrawOptions) {\n ctx.fillStyle = colorDepth(z, localOptions);\n ctx.beginPath();\n ctx.arc(x, y, localOptions.pointSize, 0, 2 * Math.PI);\n ctx.fill();\n}\n\nexport function rect(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, x: number, y: number, width: number, height: number, localOptions: DrawOptions) {\n ctx.beginPath();\n ctx.lineWidth = localOptions.lineWidth;\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.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\nexport function lines(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, points: Point[], localOptions: DrawOptions) {\n if (points.length < 2) return;\n ctx.beginPath();\n ctx.moveTo(points[0][0], points[0][1]);\n for (const pt of points) {\n ctx.strokeStyle = colorDepth(pt[2] || 0, localOptions);\n ctx.lineTo(Math.trunc(pt[0]), Math.trunc(pt[1]));\n }\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.closePath();\n ctx.fill();\n }\n}\n\nexport function curves(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, points: Point[], localOptions: DrawOptions) {\n if (points.length < 2) return;\n ctx.lineWidth = localOptions.lineWidth;\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 function arrow(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, from: Point, to: Point, radius = 5) {\n let angle;\n let x;\n let y;\n ctx.beginPath();\n ctx.moveTo(from[0], from[1]);\n ctx.lineTo(to[0], to[1]);\n angle = Math.atan2(to[1] - from[1], to[0] - from[0]);\n x = radius * Math.cos(angle) + to[0];\n y = radius * Math.sin(angle) + to[1];\n ctx.moveTo(x, y);\n angle += (1.0 / 3.0) * (2 * Math.PI);\n x = radius * Math.cos(angle) + to[0];\n y = radius * Math.sin(angle) + to[1];\n ctx.lineTo(x, y);\n angle += (1.0 / 3.0) * (2 * Math.PI);\n x = radius * Math.cos(angle) + to[0];\n y = radius * Math.sin(angle) + to[1];\n ctx.lineTo(x, y);\n ctx.closePath();\n ctx.stroke();\n ctx.fill();\n}\n", "/** Draw Options\n * - Accessed via `human.draw.options` or provided per each draw method as the drawOptions optional parameter\n */\n\nexport interface DrawOptions {\n /** draw line color */\n color: string,\n /** alpha value used for lines */\n alpha: number,\n /** label color */\n labelColor: string,\n /** label shadow color */\n shadowColor: string,\n /** label font */\n font: string,\n /** line spacing between labels */\n lineHeight: number,\n /** line width for drawn lines */\n lineWidth: number,\n /** size of drawn points */\n pointSize: number,\n /** draw rounded boxes by n pixels */\n roundRect: number,\n /** should points be drawn? */\n drawPoints: boolean,\n /** should labels be drawn? */\n drawLabels: boolean,\n /** should face attention keypoints be highlighted */\n drawAttention: boolean;\n /** should detected gestures be drawn? */\n drawGestures: boolean,\n /** should draw boxes around detection results? */\n drawBoxes: boolean,\n /** should draw polygons from detection points? */\n drawPolygons: boolean,\n /** should draw gaze arrows? */\n drawGaze: boolean,\n /** should fill polygons? */\n fillPolygons: boolean,\n /** use z-coordinate when available */\n useDepth: boolean,\n /** should lines be curved? */\n useCurves: boolean,\n /** string template for face labels */\n faceLabels: string,\n /** string template for body labels */\n bodyLabels: string,\n /** string template for body part labels */\n bodyPartLabels: string,\n /** string template for hand labels */\n handLabels: string,\n /** string template for hand labels */\n fingerLabels: string,\n /** string template for object labels */\n objectLabels: string,\n /** string template for gesture labels */\n gestureLabels: string,\n}\n\n/** currently set draw options {@link DrawOptions} */\nexport const options: DrawOptions = {\n color: 'rgba(173, 216, 230, 0.6)' as string, // 'lightblue' with light alpha channel\n labelColor: 'rgba(173, 216, 230, 1)' as string, // 'lightblue' with dark alpha channel\n shadowColor: 'black' as string,\n alpha: 0.5 as number,\n font: 'small-caps 16px \"Segoe UI\"' as string,\n lineHeight: 18 as number,\n lineWidth: 4 as number,\n pointSize: 2 as number,\n roundRect: 8 as number,\n drawPoints: false as boolean,\n drawLabels: true as boolean,\n drawBoxes: true as boolean,\n drawAttention: true as boolean,\n drawGestures: true as boolean,\n drawPolygons: true as boolean,\n drawGaze: true as boolean,\n fillPolygons: false as boolean,\n useDepth: true as boolean,\n useCurves: false as boolean,\n faceLabels: '' as string,\n bodyLabels: '' as string,\n bodyPartLabels: '' as string,\n objectLabels: '' as string,\n handLabels: '' as string,\n fingerLabels: '' as string,\n gestureLabels: '' as string,\n};\n", "/**\n * BlazeFace, FaceMesh & Iris model implementation\n * See `facemesh.ts` for entry point\n */\n\nexport const meshAnnotations: Record = {\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], // 11\n // lipsLowerOuter: [146, 91, 181, 84, 17, 314, 405, 321, 375, 291], // 10\n // lipsUpperInner: [78, 191, 80, 81, 82, 13, 312, 311, 310, 415, 308], // 11\n // lipsLowerInner: [78, 95, 88, 178, 87, 14, 317, 402, 318, 324, 308], // 11\n lipsUpperOuter: [185, 40, 39, 37, 0, 267, 269, 270, 409],\n lipsLowerOuter: [61, 146, 91, 181, 84, 17, 314, 405, 321, 375, 291],\n lipsUpperInner: [191, 80, 81, 82, 13, 312, 311, 310, 415],\n lipsLowerInner: [78, 95, 88, 178, 87, 14, 317, 402, 318, 324, 308],\n lipsLowerSemiOuter: [76, 77, 90, 180, 85, 16, 315, 404, 320, 307, 306],\n lipsUpperSemiOuter: [184, 74, 73, 72, 11, 302, 303, 304, 408],\n lipsLowerSemiInner: [62, 96, 89, 179, 86, 15, 316, 403, 319, 325, 292],\n lipsUpperSemiInner: [183, 42, 41, 38, 12, 268, 271, 272, 407],\n rightEyeUpper0: [246, 161, 160, 159, 158, 157, 173], // 7\n rightEyeLower0: [33, 7, 163, 144, 145, 153, 154, 155, 133], // 9\n rightEyeUpper1: [247, 30, 29, 27, 28, 56, 190], // 7\n rightEyeLower1: [130, 25, 110, 24, 23, 22, 26, 112, 243], // 9\n rightEyeUpper2: [113, 225, 224, 223, 222, 221, 189], // 7\n rightEyeLower2: [226, 31, 228, 229, 230, 231, 232, 233, 244], // 9\n rightEyeLower3: [143, 111, 117, 118, 119, 120, 121, 128, 245], // 9\n rightEyebrowUpper: [156, 70, 63, 105, 66, 107, 55, 193], // 8\n rightEyebrowLower: [35, 124, 46, 53, 52, 65], // 6\n rightEyeIris: [473, 474, 475, 476, 477], // 5\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 meshLandmarks: Record = {\n count: 468,\n mouth: 13,\n symmetryLine: [13, meshAnnotations.midwayBetweenEyes[0]],\n};\n\nexport const blazeFaceLandmarks: Record = {\n leftEye: 0,\n rightEye: 1,\n nose: 2,\n mouth: 3,\n leftEar: 4,\n rightEar: 5,\n symmetryLine: [3, 2],\n};\n\nexport const irisIndices: { key: string, indices: number[] }[] = [ // A mapping from facemesh model keypoints to iris model keypoints.\n { key: 'EyeUpper0', indices: [9, 10, 11, 12, 13, 14, 15] }, // 7 x 3d\n { key: 'EyeUpper1', indices: [25, 26, 27, 28, 29, 30, 31] }, // 7 x 3d\n { key: 'EyeUpper2', indices: [41, 42, 43, 44, 45, 46, 47] }, // 7 x 3d\n { key: 'EyeLower0', indices: [0, 1, 2, 3, 4, 5, 6, 7, 8] }, // 7 x 3d\n { key: 'EyeLower1', indices: [16, 17, 18, 19, 20, 21, 22, 23, 24] }, // 9 x 3d\n { key: 'EyeLower2', indices: [32, 33, 34, 35, 36, 37, 38, 39, 40] }, // 9 x 3d\n { key: 'EyeLower3', indices: [54, 55, 56, 57, 58, 59, 60, 61, 62] }, // 9 x 3d\n { key: 'EyebrowUpper', indices: [63, 64, 65, 66, 67, 68, 69, 70] }, // 8 x 3d\n { key: 'EyebrowLower', indices: [48, 49, 50, 51, 52, 53] }, // 6 x 3d\n];\n\nexport const UV468: [number, number][] = [\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: number[] = [\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: number[] = [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: number[] = [\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: number[] = [0, 4, 1, 2, 4, 3, 4, 5, 6];\n\nexport const VTX68: number[] = [\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: number[] = [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: number[] = [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\n// https://github.com/tensorflow/tfjs-models/blob/master/face-landmarks-detection/src/constants.ts\n// https://github.com/google/mediapipe/mediapipe/python/solutions/face_mesh_connections.py\n\ntype PairArray = [number, number][];\n\nfunction connectionsToIndices(connections: PairArray) {\n const indices = connections.map((connection) => connection[0]);\n indices.push(connections[connections.length - 1][1]);\n return indices;\n}\n\nexport const pairsLips: PairArray = [\n [61, 146], [146, 91], [91, 181], [181, 84], [84, 17], [17, 314], [314, 405], [405, 321], [321, 375], [375, 291], [61, 185], [185, 40], [40, 39], [39, 37], [37, 0], [0, 267], [267, 269], [269, 270], [270, 409], [409, 291],\n [78, 95], [95, 88], [88, 178], [178, 87], [87, 14], [14, 317], [317, 402], [402, 318], [318, 324], [324, 308], [78, 191], [191, 80], [80, 81], [81, 82], [82, 13], [13, 312], [312, 311], [311, 310], [310, 415], [415, 308],\n];\n\nexport const pairsLeftEye: PairArray = [[263, 249], [249, 390], [390, 373], [373, 374], [374, 380], [380, 381], [381, 382], [382, 362], [263, 466], [466, 388], [388, 387], [387, 386], [386, 385], [385, 384], [384, 398], [398, 362]];\n\nexport const pairsLeftEyebrow: PairArray = [[276, 283], [283, 282], [282, 295], [295, 285], [300, 293], [293, 334], [334, 296], [296, 336]];\n\nexport const pairsLeftIris: PairArray = [[474, 475], [475, 476], [476, 477], [477, 474]];\n\nexport const pairsRightEye: PairArray = [[33, 7], [7, 163], [163, 144], [144, 145], [145, 153], [153, 154], [154, 155], [155, 133], [33, 246], [246, 161], [161, 160], [160, 159], [159, 158], [158, 157], [157, 173], [173, 133]];\n\nexport const pairsRightEyebrow: PairArray = [[46, 53], [53, 52], [52, 65], [65, 55], [70, 63], [63, 105], [105, 66], [66, 107]];\n\nexport const pairsRightIris: PairArray = [[469, 470], [470, 471], [471, 472], [472, 469]];\n\nexport const pairsFaceContour: PairArray = [\n [10, 338], [338, 297], [297, 332], [332, 284], [284, 251], [251, 389],\n [389, 356], [356, 454], [454, 323], [323, 361], [361, 288], [288, 397],\n [397, 365], [365, 379], [379, 378], [378, 400], [400, 377], [377, 152],\n [152, 148], [148, 176], [176, 149], [149, 150], [150, 136], [136, 172],\n [172, 58], [58, 132], [132, 93], [93, 234], [234, 127], [127, 162],\n [162, 21], [21, 54], [54, 103], [103, 67], [67, 109], [109, 10],\n];\n\nexport const contourKeypoints = {\n lips: connectionsToIndices(pairsLips),\n leftEye: connectionsToIndices(pairsLeftEye),\n leftEyebrow: connectionsToIndices(pairsLeftEyebrow),\n leftIris: connectionsToIndices(pairsLeftIris),\n rightEye: connectionsToIndices(pairsRightEye),\n rightEyebrow: connectionsToIndices(pairsRightEyebrow),\n rightIris: connectionsToIndices(pairsRightIris),\n faceOval: connectionsToIndices(pairsFaceContour),\n};\n\nexport const pairsFaceMesh: PairArray = [\n [127, 34], [34, 139], [139, 127], [11, 0], [0, 37], [37, 11],\n [232, 231], [231, 120], [120, 232], [72, 37], [37, 39], [39, 72],\n [128, 121], [121, 47], [47, 128], [232, 121], [121, 128], [128, 232],\n [104, 69], [69, 67], [67, 104], [175, 171], [171, 148], [148, 175],\n [118, 50], [50, 101], [101, 118], [73, 39], [39, 40], [40, 73],\n [9, 151], [151, 108], [108, 9], [48, 115], [115, 131], [131, 48],\n [194, 204], [204, 211], [211, 194], [74, 40], [40, 185], [185, 74],\n [80, 42], [42, 183], [183, 80], [40, 92], [92, 186], [186, 40],\n [230, 229], [229, 118], [118, 230], [202, 212], [212, 214], [214, 202],\n [83, 18], [18, 17], [17, 83], [76, 61], [61, 146], [146, 76],\n [160, 29], [29, 30], [30, 160], [56, 157], [157, 173], [173, 56],\n [106, 204], [204, 194], [194, 106], [135, 214], [214, 192], [192, 135],\n [203, 165], [165, 98], [98, 203], [21, 71], [71, 68], [68, 21],\n [51, 45], [45, 4], [4, 51], [144, 24], [24, 23], [23, 144],\n [77, 146], [146, 91], [91, 77], [205, 50], [50, 187], [187, 205],\n [201, 200], [200, 18], [18, 201], [91, 106], [106, 182], [182, 91],\n [90, 91], [91, 181], [181, 90], [85, 84], [84, 17], [17, 85],\n [206, 203], [203, 36], [36, 206], [148, 171], [171, 140], [140, 148],\n [92, 40], [40, 39], [39, 92], [193, 189], [189, 244], [244, 193],\n [159, 158], [158, 28], [28, 159], [247, 246], [246, 161], [161, 247],\n [236, 3], [3, 196], [196, 236], [54, 68], [68, 104], [104, 54],\n [193, 168], [168, 8], [8, 193], [117, 228], [228, 31], [31, 117],\n [189, 193], [193, 55], [55, 189], [98, 97], [97, 99], [99, 98],\n [126, 47], [47, 100], [100, 126], [166, 79], [79, 218], [218, 166],\n [155, 154], [154, 26], [26, 155], [209, 49], [49, 131], [131, 209],\n [135, 136], [136, 150], [150, 135], [47, 126], [126, 217], [217, 47],\n [223, 52], [52, 53], [53, 223], [45, 51], [51, 134], [134, 45],\n [211, 170], [170, 140], [140, 211], [67, 69], [69, 108], [108, 67],\n [43, 106], [106, 91], [91, 43], [230, 119], [119, 120], [120, 230],\n [226, 130], [130, 247], [247, 226], [63, 53], [53, 52], [52, 63],\n [238, 20], [20, 242], [242, 238], [46, 70], [70, 156], [156, 46],\n [78, 62], [62, 96], [96, 78], [46, 53], [53, 63], [63, 46],\n [143, 34], [34, 227], [227, 143], [123, 117], [117, 111], [111, 123],\n [44, 125], [125, 19], [19, 44], [236, 134], [134, 51], [51, 236],\n [216, 206], [206, 205], [205, 216], [154, 153], [153, 22], [22, 154],\n [39, 37], [37, 167], [167, 39], [200, 201], [201, 208], [208, 200],\n [36, 142], [142, 100], [100, 36], [57, 212], [212, 202], [202, 57],\n [20, 60], [60, 99], [99, 20], [28, 158], [158, 157], [157, 28],\n [35, 226], [226, 113], [113, 35], [160, 159], [159, 27], [27, 160],\n [204, 202], [202, 210], [210, 204], [113, 225], [225, 46], [46, 113],\n [43, 202], [202, 204], [204, 43], [62, 76], [76, 77], [77, 62],\n [137, 123], [123, 116], [116, 137], [41, 38], [38, 72], [72, 41],\n [203, 129], [129, 142], [142, 203], [64, 98], [98, 240], [240, 64],\n [49, 102], [102, 64], [64, 49], [41, 73], [73, 74], [74, 41],\n [212, 216], [216, 207], [207, 212], [42, 74], [74, 184], [184, 42],\n [169, 170], [170, 211], [211, 169], [170, 149], [149, 176], [176, 170],\n [105, 66], [66, 69], [69, 105], [122, 6], [6, 168], [168, 122],\n [123, 147], [147, 187], [187, 123], [96, 77], [77, 90], [90, 96],\n [65, 55], [55, 107], [107, 65], [89, 90], [90, 180], [180, 89],\n [101, 100], [100, 120], [120, 101], [63, 105], [105, 104], [104, 63],\n [93, 137], [137, 227], [227, 93], [15, 86], [86, 85], [85, 15],\n [129, 102], [102, 49], [49, 129], [14, 87], [87, 86], [86, 14],\n [55, 8], [8, 9], [9, 55], [100, 47], [47, 121], [121, 100],\n [145, 23], [23, 22], [22, 145], [88, 89], [89, 179], [179, 88],\n [6, 122], [122, 196], [196, 6], [88, 95], [95, 96], [96, 88],\n [138, 172], [172, 136], [136, 138], [215, 58], [58, 172], [172, 215],\n [115, 48], [48, 219], [219, 115], [42, 80], [80, 81], [81, 42],\n [195, 3], [3, 51], [51, 195], [43, 146], [146, 61], [61, 43],\n [171, 175], [175, 199], [199, 171], [81, 82], [82, 38], [38, 81],\n [53, 46], [46, 225], [225, 53], [144, 163], [163, 110], [110, 144],\n [52, 65], [65, 66], [66, 52], [229, 228], [228, 117], [117, 229],\n [34, 127], [127, 234], [234, 34], [107, 108], [108, 69], [69, 107],\n [109, 108], [108, 151], [151, 109], [48, 64], [64, 235], [235, 48],\n [62, 78], [78, 191], [191, 62], [129, 209], [209, 126], [126, 129],\n [111, 35], [35, 143], [143, 111], [117, 123], [123, 50], [50, 117],\n [222, 65], [65, 52], [52, 222], [19, 125], [125, 141], [141, 19],\n [221, 55], [55, 65], [65, 221], [3, 195], [195, 197], [197, 3],\n [25, 7], [7, 33], [33, 25], [220, 237], [237, 44], [44, 220],\n [70, 71], [71, 139], [139, 70], [122, 193], [193, 245], [245, 122],\n [247, 130], [130, 33], [33, 247], [71, 21], [21, 162], [162, 71],\n [170, 169], [169, 150], [150, 170], [188, 174], [174, 196], [196, 188],\n [216, 186], [186, 92], [92, 216], [2, 97], [97, 167], [167, 2],\n [141, 125], [125, 241], [241, 141], [164, 167], [167, 37], [37, 164],\n [72, 38], [38, 12], [12, 72], [38, 82], [82, 13], [13, 38],\n [63, 68], [68, 71], [71, 63], [226, 35], [35, 111], [111, 226],\n [101, 50], [50, 205], [205, 101], [206, 92], [92, 165], [165, 206],\n [209, 198], [198, 217], [217, 209], [165, 167], [167, 97], [97, 165],\n [220, 115], [115, 218], [218, 220], [133, 112], [112, 243], [243, 133],\n [239, 238], [238, 241], [241, 239], [214, 135], [135, 169], [169, 214],\n [190, 173], [173, 133], [133, 190], [171, 208], [208, 32], [32, 171],\n [125, 44], [44, 237], [237, 125], [86, 87], [87, 178], [178, 86],\n [85, 86], [86, 179], [179, 85], [84, 85], [85, 180], [180, 84],\n [83, 84], [84, 181], [181, 83], [201, 83], [83, 182], [182, 201],\n [137, 93], [93, 132], [132, 137], [76, 62], [62, 183], [183, 76],\n [61, 76], [76, 184], [184, 61], [57, 61], [61, 185], [185, 57],\n [212, 57], [57, 186], [186, 212], [214, 207], [207, 187], [187, 214],\n [34, 143], [143, 156], [156, 34], [79, 239], [239, 237], [237, 79],\n [123, 137], [137, 177], [177, 123], [44, 1], [1, 4], [4, 44],\n [201, 194], [194, 32], [32, 201], [64, 102], [102, 129], [129, 64],\n [213, 215], [215, 138], [138, 213], [59, 166], [166, 219], [219, 59],\n [242, 99], [99, 97], [97, 242], [2, 94], [94, 141], [141, 2],\n [75, 59], [59, 235], [235, 75], [24, 110], [110, 228], [228, 24],\n [25, 130], [130, 226], [226, 25], [23, 24], [24, 229], [229, 23],\n [22, 23], [23, 230], [230, 22], [26, 22], [22, 231], [231, 26],\n [112, 26], [26, 232], [232, 112], [189, 190], [190, 243], [243, 189],\n [221, 56], [56, 190], [190, 221], [28, 56], [56, 221], [221, 28],\n [27, 28], [28, 222], [222, 27], [29, 27], [27, 223], [223, 29],\n [30, 29], [29, 224], [224, 30], [247, 30], [30, 225], [225, 247],\n [238, 79], [79, 20], [20, 238], [166, 59], [59, 75], [75, 166],\n [60, 75], [75, 240], [240, 60], [147, 177], [177, 215], [215, 147],\n [20, 79], [79, 166], [166, 20], [187, 147], [147, 213], [213, 187],\n [112, 233], [233, 244], [244, 112], [233, 128], [128, 245], [245, 233],\n [128, 114], [114, 188], [188, 128], [114, 217], [217, 174], [174, 114],\n [131, 115], [115, 220], [220, 131], [217, 198], [198, 236], [236, 217],\n [198, 131], [131, 134], [134, 198], [177, 132], [132, 58], [58, 177],\n [143, 35], [35, 124], [124, 143], [110, 163], [163, 7], [7, 110],\n [228, 110], [110, 25], [25, 228], [356, 389], [389, 368], [368, 356],\n [11, 302], [302, 267], [267, 11], [452, 350], [350, 349], [349, 452],\n [302, 303], [303, 269], [269, 302], [357, 343], [343, 277], [277, 357],\n [452, 453], [453, 357], [357, 452], [333, 332], [332, 297], [297, 333],\n [175, 152], [152, 377], [377, 175], [347, 348], [348, 330], [330, 347],\n [303, 304], [304, 270], [270, 303], [9, 336], [336, 337], [337, 9],\n [278, 279], [279, 360], [360, 278], [418, 262], [262, 431], [431, 418],\n [304, 408], [408, 409], [409, 304], [310, 415], [415, 407], [407, 310],\n [270, 409], [409, 410], [410, 270], [450, 348], [348, 347], [347, 450],\n [422, 430], [430, 434], [434, 422], [313, 314], [314, 17], [17, 313],\n [306, 307], [307, 375], [375, 306], [387, 388], [388, 260], [260, 387],\n [286, 414], [414, 398], [398, 286], [335, 406], [406, 418], [418, 335],\n [364, 367], [367, 416], [416, 364], [423, 358], [358, 327], [327, 423],\n [251, 284], [284, 298], [298, 251], [281, 5], [5, 4], [4, 281],\n [373, 374], [374, 253], [253, 373], [307, 320], [320, 321], [321, 307],\n [425, 427], [427, 411], [411, 425], [421, 313], [313, 18], [18, 421],\n [321, 405], [405, 406], [406, 321], [320, 404], [404, 405], [405, 320],\n [315, 16], [16, 17], [17, 315], [426, 425], [425, 266], [266, 426],\n [377, 400], [400, 369], [369, 377], [322, 391], [391, 269], [269, 322],\n [417, 465], [465, 464], [464, 417], [386, 257], [257, 258], [258, 386],\n [466, 260], [260, 388], [388, 466], [456, 399], [399, 419], [419, 456],\n [284, 332], [332, 333], [333, 284], [417, 285], [285, 8], [8, 417],\n [346, 340], [340, 261], [261, 346], [413, 441], [441, 285], [285, 413],\n [327, 460], [460, 328], [328, 327], [355, 371], [371, 329], [329, 355],\n [392, 439], [439, 438], [438, 392], [382, 341], [341, 256], [256, 382],\n [429, 420], [420, 360], [360, 429], [364, 394], [394, 379], [379, 364],\n [277, 343], [343, 437], [437, 277], [443, 444], [444, 283], [283, 443],\n [275, 440], [440, 363], [363, 275], [431, 262], [262, 369], [369, 431],\n [297, 338], [338, 337], [337, 297], [273, 375], [375, 321], [321, 273],\n [450, 451], [451, 349], [349, 450], [446, 342], [342, 467], [467, 446],\n [293, 334], [334, 282], [282, 293], [458, 461], [461, 462], [462, 458],\n [276, 353], [353, 383], [383, 276], [308, 324], [324, 325], [325, 308],\n [276, 300], [300, 293], [293, 276], [372, 345], [345, 447], [447, 372],\n [352, 345], [345, 340], [340, 352], [274, 1], [1, 19], [19, 274],\n [456, 248], [248, 281], [281, 456], [436, 427], [427, 425], [425, 436],\n [381, 256], [256, 252], [252, 381], [269, 391], [391, 393], [393, 269],\n [200, 199], [199, 428], [428, 200], [266, 330], [330, 329], [329, 266],\n [287, 273], [273, 422], [422, 287], [250, 462], [462, 328], [328, 250],\n [258, 286], [286, 384], [384, 258], [265, 353], [353, 342], [342, 265],\n [387, 259], [259, 257], [257, 387], [424, 431], [431, 430], [430, 424],\n [342, 353], [353, 276], [276, 342], [273, 335], [335, 424], [424, 273],\n [292, 325], [325, 307], [307, 292], [366, 447], [447, 345], [345, 366],\n [271, 303], [303, 302], [302, 271], [423, 266], [266, 371], [371, 423],\n [294, 455], [455, 460], [460, 294], [279, 278], [278, 294], [294, 279],\n [271, 272], [272, 304], [304, 271], [432, 434], [434, 427], [427, 432],\n [272, 407], [407, 408], [408, 272], [394, 430], [430, 431], [431, 394],\n [395, 369], [369, 400], [400, 395], [334, 333], [333, 299], [299, 334],\n [351, 417], [417, 168], [168, 351], [352, 280], [280, 411], [411, 352],\n [325, 319], [319, 320], [320, 325], [295, 296], [296, 336], [336, 295],\n [319, 403], [403, 404], [404, 319], [330, 348], [348, 349], [349, 330],\n [293, 298], [298, 333], [333, 293], [323, 454], [454, 447], [447, 323],\n [15, 16], [16, 315], [315, 15], [358, 429], [429, 279], [279, 358],\n [14, 15], [15, 316], [316, 14], [285, 336], [336, 9], [9, 285],\n [329, 349], [349, 350], [350, 329], [374, 380], [380, 252], [252, 374],\n [318, 402], [402, 403], [403, 318], [6, 197], [197, 419], [419, 6],\n [318, 319], [319, 325], [325, 318], [367, 364], [364, 365], [365, 367],\n [435, 367], [367, 397], [397, 435], [344, 438], [438, 439], [439, 344],\n [272, 271], [271, 311], [311, 272], [195, 5], [5, 281], [281, 195],\n [273, 287], [287, 291], [291, 273], [396, 428], [428, 199], [199, 396],\n [311, 271], [271, 268], [268, 311], [283, 444], [444, 445], [445, 283],\n [373, 254], [254, 339], [339, 373], [282, 334], [334, 296], [296, 282],\n [449, 347], [347, 346], [346, 449], [264, 447], [447, 454], [454, 264],\n [336, 296], [296, 299], [299, 336], [338, 10], [10, 151], [151, 338],\n [278, 439], [439, 455], [455, 278], [292, 407], [407, 415], [415, 292],\n [358, 371], [371, 355], [355, 358], [340, 345], [345, 372], [372, 340],\n [346, 347], [347, 280], [280, 346], [442, 443], [443, 282], [282, 442],\n [19, 94], [94, 370], [370, 19], [441, 442], [442, 295], [295, 441],\n [248, 419], [419, 197], [197, 248], [263, 255], [255, 359], [359, 263],\n [440, 275], [275, 274], [274, 440], [300, 383], [383, 368], [368, 300],\n [351, 412], [412, 465], [465, 351], [263, 467], [467, 466], [466, 263],\n [301, 368], [368, 389], [389, 301], [395, 378], [378, 379], [379, 395],\n [412, 351], [351, 419], [419, 412], [436, 426], [426, 322], [322, 436],\n [2, 164], [164, 393], [393, 2], [370, 462], [462, 461], [461, 370],\n [164, 0], [0, 267], [267, 164], [302, 11], [11, 12], [12, 302],\n [268, 12], [12, 13], [13, 268], [293, 300], [300, 301], [301, 293],\n [446, 261], [261, 340], [340, 446], [330, 266], [266, 425], [425, 330],\n [426, 423], [423, 391], [391, 426], [429, 355], [355, 437], [437, 429],\n [391, 327], [327, 326], [326, 391], [440, 457], [457, 438], [438, 440],\n [341, 382], [382, 362], [362, 341], [459, 457], [457, 461], [461, 459],\n [434, 430], [430, 394], [394, 434], [414, 463], [463, 362], [362, 414],\n [396, 369], [369, 262], [262, 396], [354, 461], [461, 457], [457, 354],\n [316, 403], [403, 402], [402, 316], [315, 404], [404, 403], [403, 315],\n [314, 405], [405, 404], [404, 314], [313, 406], [406, 405], [405, 313],\n [421, 418], [418, 406], [406, 421], [366, 401], [401, 361], [361, 366],\n [306, 408], [408, 407], [407, 306], [291, 409], [409, 408], [408, 291],\n [287, 410], [410, 409], [409, 287], [432, 436], [436, 410], [410, 432],\n [434, 416], [416, 411], [411, 434], [264, 368], [368, 383], [383, 264],\n [309, 438], [438, 457], [457, 309], [352, 376], [376, 401], [401, 352],\n [274, 275], [275, 4], [4, 274], [421, 428], [428, 262], [262, 421],\n [294, 327], [327, 358], [358, 294], [433, 416], [416, 367], [367, 433],\n [289, 455], [455, 439], [439, 289], [462, 370], [370, 326], [326, 462],\n [2, 326], [326, 370], [370, 2], [305, 460], [460, 455], [455, 305],\n [254, 449], [449, 448], [448, 254], [255, 261], [261, 446], [446, 255],\n [253, 450], [450, 449], [449, 253], [252, 451], [451, 450], [450, 252],\n [256, 452], [452, 451], [451, 256], [341, 453], [453, 452], [452, 341],\n [413, 464], [464, 463], [463, 413], [441, 413], [413, 414], [414, 441],\n [258, 442], [442, 441], [441, 258], [257, 443], [443, 442], [442, 257],\n [259, 444], [444, 443], [443, 259], [260, 445], [445, 444], [444, 260],\n [467, 342], [342, 445], [445, 467], [459, 458], [458, 250], [250, 459],\n [289, 392], [392, 290], [290, 289], [290, 328], [328, 460], [460, 290],\n [376, 433], [433, 435], [435, 376], [250, 290], [290, 392], [392, 250],\n [411, 416], [416, 433], [433, 411], [341, 463], [463, 464], [464, 341],\n [453, 464], [464, 465], [465, 453], [357, 465], [465, 412], [412, 357],\n [343, 412], [412, 399], [399, 343], [360, 363], [363, 440], [440, 360],\n [437, 399], [399, 456], [456, 437], [420, 456], [456, 363], [363, 420],\n [401, 435], [435, 288], [288, 401], [372, 383], [383, 353], [353, 372],\n [339, 255], [255, 249], [249, 339], [448, 261], [261, 255], [255, 448],\n [133, 243], [243, 190], [190, 133], [133, 155], [155, 112], [112, 133],\n [33, 246], [246, 247], [247, 33], [33, 130], [130, 25], [25, 33],\n [398, 384], [384, 286], [286, 398], [362, 398], [398, 414], [414, 362],\n [362, 463], [463, 341], [341, 362], [263, 359], [359, 467], [467, 263],\n [263, 249], [249, 255], [255, 263], [466, 467], [467, 260], [260, 466],\n [75, 60], [60, 166], [166, 75], [238, 239], [239, 79], [79, 238],\n [162, 127], [127, 139], [139, 162], [72, 11], [11, 37], [37, 72],\n [121, 232], [232, 120], [120, 121], [73, 72], [72, 39], [39, 73],\n [114, 128], [128, 47], [47, 114], [233, 232], [232, 128], [128, 233],\n [103, 104], [104, 67], [67, 103], [152, 175], [175, 148], [148, 152],\n [119, 118], [118, 101], [101, 119], [74, 73], [73, 40], [40, 74],\n [107, 9], [9, 108], [108, 107], [49, 48], [48, 131], [131, 49],\n [32, 194], [194, 211], [211, 32], [184, 74], [74, 185], [185, 184],\n [191, 80], [80, 183], [183, 191], [185, 40], [40, 186], [186, 185],\n [119, 230], [230, 118], [118, 119], [210, 202], [202, 214], [214, 210],\n [84, 83], [83, 17], [17, 84], [77, 76], [76, 146], [146, 77],\n [161, 160], [160, 30], [30, 161], [190, 56], [56, 173], [173, 190],\n [182, 106], [106, 194], [194, 182], [138, 135], [135, 192], [192, 138],\n [129, 203], [203, 98], [98, 129], [54, 21], [21, 68], [68, 54],\n [5, 51], [51, 4], [4, 5], [145, 144], [144, 23], [23, 145],\n [90, 77], [77, 91], [91, 90], [207, 205], [205, 187], [187, 207],\n [83, 201], [201, 18], [18, 83], [181, 91], [91, 182], [182, 181],\n [180, 90], [90, 181], [181, 180], [16, 85], [85, 17], [17, 16],\n [205, 206], [206, 36], [36, 205], [176, 148], [148, 140], [140, 176],\n [165, 92], [92, 39], [39, 165], [245, 193], [193, 244], [244, 245],\n [27, 159], [159, 28], [28, 27], [30, 247], [247, 161], [161, 30],\n [174, 236], [236, 196], [196, 174], [103, 54], [54, 104], [104, 103],\n [55, 193], [193, 8], [8, 55], [111, 117], [117, 31], [31, 111],\n [221, 189], [189, 55], [55, 221], [240, 98], [98, 99], [99, 240],\n [142, 126], [126, 100], [100, 142], [219, 166], [166, 218], [218, 219],\n [112, 155], [155, 26], [26, 112], [198, 209], [209, 131], [131, 198],\n [169, 135], [135, 150], [150, 169], [114, 47], [47, 217], [217, 114],\n [224, 223], [223, 53], [53, 224], [220, 45], [45, 134], [134, 220],\n [32, 211], [211, 140], [140, 32], [109, 67], [67, 108], [108, 109],\n [146, 43], [43, 91], [91, 146], [231, 230], [230, 120], [120, 231],\n [113, 226], [226, 247], [247, 113], [105, 63], [63, 52], [52, 105],\n [241, 238], [238, 242], [242, 241], [124, 46], [46, 156], [156, 124],\n [95, 78], [78, 96], [96, 95], [70, 46], [46, 63], [63, 70],\n [116, 143], [143, 227], [227, 116], [116, 123], [123, 111], [111, 116],\n [1, 44], [44, 19], [19, 1], [3, 236], [236, 51], [51, 3],\n [207, 216], [216, 205], [205, 207], [26, 154], [154, 22], [22, 26],\n [165, 39], [39, 167], [167, 165], [199, 200], [200, 208], [208, 199],\n [101, 36], [36, 100], [100, 101], [43, 57], [57, 202], [202, 43],\n [242, 20], [20, 99], [99, 242], [56, 28], [28, 157], [157, 56],\n [124, 35], [35, 113], [113, 124], [29, 160], [160, 27], [27, 29],\n [211, 204], [204, 210], [210, 211], [124, 113], [113, 46], [46, 124],\n [106, 43], [43, 204], [204, 106], [96, 62], [62, 77], [77, 96],\n [227, 137], [137, 116], [116, 227], [73, 41], [41, 72], [72, 73],\n [36, 203], [203, 142], [142, 36], [235, 64], [64, 240], [240, 235],\n [48, 49], [49, 64], [64, 48], [42, 41], [41, 74], [74, 42],\n [214, 212], [212, 207], [207, 214], [183, 42], [42, 184], [184, 183],\n [210, 169], [169, 211], [211, 210], [140, 170], [170, 176], [176, 140],\n [104, 105], [105, 69], [69, 104], [193, 122], [122, 168], [168, 193],\n [50, 123], [123, 187], [187, 50], [89, 96], [96, 90], [90, 89],\n [66, 65], [65, 107], [107, 66], [179, 89], [89, 180], [180, 179],\n [119, 101], [101, 120], [120, 119], [68, 63], [63, 104], [104, 68],\n [234, 93], [93, 227], [227, 234], [16, 15], [15, 85], [85, 16],\n [209, 129], [129, 49], [49, 209], [15, 14], [14, 86], [86, 15],\n [107, 55], [55, 9], [9, 107], [120, 100], [100, 121], [121, 120],\n [153, 145], [145, 22], [22, 153], [178, 88], [88, 179], [179, 178],\n [197, 6], [6, 196], [196, 197], [89, 88], [88, 96], [96, 89],\n [135, 138], [138, 136], [136, 135], [138, 215], [215, 172], [172, 138],\n [218, 115], [115, 219], [219, 218], [41, 42], [42, 81], [81, 41],\n [5, 195], [195, 51], [51, 5], [57, 43], [43, 61], [61, 57],\n [208, 171], [171, 199], [199, 208], [41, 81], [81, 38], [38, 41],\n [224, 53], [53, 225], [225, 224], [24, 144], [144, 110], [110, 24],\n [105, 52], [52, 66], [66, 105], [118, 229], [229, 117], [117, 118],\n [227, 34], [34, 234], [234, 227], [66, 107], [107, 69], [69, 66],\n [10, 109], [109, 151], [151, 10], [219, 48], [48, 235], [235, 219],\n [183, 62], [62, 191], [191, 183], [142, 129], [129, 126], [126, 142],\n [116, 111], [111, 143], [143, 116], [118, 117], [117, 50], [50, 118],\n [223, 222], [222, 52], [52, 223], [94, 19], [19, 141], [141, 94],\n [222, 221], [221, 65], [65, 222], [196, 3], [3, 197], [197, 196],\n [45, 220], [220, 44], [44, 45], [156, 70], [70, 139], [139, 156],\n [188, 122], [122, 245], [245, 188], [139, 71], [71, 162], [162, 139],\n [149, 170], [170, 150], [150, 149], [122, 188], [188, 196], [196, 122],\n [206, 216], [216, 92], [92, 206], [164, 2], [2, 167], [167, 164],\n [242, 141], [141, 241], [241, 242], [0, 164], [164, 37], [37, 0],\n [11, 72], [72, 12], [12, 11], [12, 38], [38, 13], [13, 12],\n [70, 63], [63, 71], [71, 70], [31, 226], [226, 111], [111, 31],\n [36, 101], [101, 205], [205, 36], [203, 206], [206, 165], [165, 203],\n [126, 209], [209, 217], [217, 126], [98, 165], [165, 97], [97, 98],\n [237, 220], [220, 218], [218, 237], [237, 239], [239, 241], [241, 237],\n [210, 214], [214, 169], [169, 210], [140, 171], [171, 32], [32, 140],\n [241, 125], [125, 237], [237, 241], [179, 86], [86, 178], [178, 179],\n [180, 85], [85, 179], [179, 180], [181, 84], [84, 180], [180, 181],\n [182, 83], [83, 181], [181, 182], [194, 201], [201, 182], [182, 194],\n [177, 137], [137, 132], [132, 177], [184, 76], [76, 183], [183, 184],\n [185, 61], [61, 184], [184, 185], [186, 57], [57, 185], [185, 186],\n [216, 212], [212, 186], [186, 216], [192, 214], [214, 187], [187, 192],\n [139, 34], [34, 156], [156, 139], [218, 79], [79, 237], [237, 218],\n [147, 123], [123, 177], [177, 147], [45, 44], [44, 4], [4, 45],\n [208, 201], [201, 32], [32, 208], [98, 64], [64, 129], [129, 98],\n [192, 213], [213, 138], [138, 192], [235, 59], [59, 219], [219, 235],\n [141, 242], [242, 97], [97, 141], [97, 2], [2, 141], [141, 97],\n [240, 75], [75, 235], [235, 240], [229, 24], [24, 228], [228, 229],\n [31, 25], [25, 226], [226, 31], [230, 23], [23, 229], [229, 230],\n [231, 22], [22, 230], [230, 231], [232, 26], [26, 231], [231, 232],\n [233, 112], [112, 232], [232, 233], [244, 189], [189, 243], [243, 244],\n [189, 221], [221, 190], [190, 189], [222, 28], [28, 221], [221, 222],\n [223, 27], [27, 222], [222, 223], [224, 29], [29, 223], [223, 224],\n [225, 30], [30, 224], [224, 225], [113, 247], [247, 225], [225, 113],\n [99, 60], [60, 240], [240, 99], [213, 147], [147, 215], [215, 213],\n [60, 20], [20, 166], [166, 60], [192, 187], [187, 213], [213, 192],\n [243, 112], [112, 244], [244, 243], [244, 233], [233, 245], [245, 244],\n [245, 128], [128, 188], [188, 245], [188, 114], [114, 174], [174, 188],\n [134, 131], [131, 220], [220, 134], [174, 217], [217, 236], [236, 174],\n [236, 198], [198, 134], [134, 236], [215, 177], [177, 58], [58, 215],\n [156, 143], [143, 124], [124, 156], [25, 110], [110, 7], [7, 25],\n [31, 228], [228, 25], [25, 31], [264, 356], [356, 368], [368, 264],\n [0, 11], [11, 267], [267, 0], [451, 452], [452, 349], [349, 451],\n [267, 302], [302, 269], [269, 267], [350, 357], [357, 277], [277, 350],\n [350, 452], [452, 357], [357, 350], [299, 333], [333, 297], [297, 299],\n [396, 175], [175, 377], [377, 396], [280, 347], [347, 330], [330, 280],\n [269, 303], [303, 270], [270, 269], [151, 9], [9, 337], [337, 151],\n [344, 278], [278, 360], [360, 344], [424, 418], [418, 431], [431, 424],\n [270, 304], [304, 409], [409, 270], [272, 310], [310, 407], [407, 272],\n [322, 270], [270, 410], [410, 322], [449, 450], [450, 347], [347, 449],\n [432, 422], [422, 434], [434, 432], [18, 313], [313, 17], [17, 18],\n [291, 306], [306, 375], [375, 291], [259, 387], [387, 260], [260, 259],\n [424, 335], [335, 418], [418, 424], [434, 364], [364, 416], [416, 434],\n [391, 423], [423, 327], [327, 391], [301, 251], [251, 298], [298, 301],\n [275, 281], [281, 4], [4, 275], [254, 373], [373, 253], [253, 254],\n [375, 307], [307, 321], [321, 375], [280, 425], [425, 411], [411, 280],\n [200, 421], [421, 18], [18, 200], [335, 321], [321, 406], [406, 335],\n [321, 320], [320, 405], [405, 321], [314, 315], [315, 17], [17, 314],\n [423, 426], [426, 266], [266, 423], [396, 377], [377, 369], [369, 396],\n [270, 322], [322, 269], [269, 270], [413, 417], [417, 464], [464, 413],\n [385, 386], [386, 258], [258, 385], [248, 456], [456, 419], [419, 248],\n [298, 284], [284, 333], [333, 298], [168, 417], [417, 8], [8, 168],\n [448, 346], [346, 261], [261, 448], [417, 413], [413, 285], [285, 417],\n [326, 327], [327, 328], [328, 326], [277, 355], [355, 329], [329, 277],\n [309, 392], [392, 438], [438, 309], [381, 382], [382, 256], [256, 381],\n [279, 429], [429, 360], [360, 279], [365, 364], [364, 379], [379, 365],\n [355, 277], [277, 437], [437, 355], [282, 443], [443, 283], [283, 282],\n [281, 275], [275, 363], [363, 281], [395, 431], [431, 369], [369, 395],\n [299, 297], [297, 337], [337, 299], [335, 273], [273, 321], [321, 335],\n [348, 450], [450, 349], [349, 348], [359, 446], [446, 467], [467, 359],\n [283, 293], [293, 282], [282, 283], [250, 458], [458, 462], [462, 250],\n [300, 276], [276, 383], [383, 300], [292, 308], [308, 325], [325, 292],\n [283, 276], [276, 293], [293, 283], [264, 372], [372, 447], [447, 264],\n [346, 352], [352, 340], [340, 346], [354, 274], [274, 19], [19, 354],\n [363, 456], [456, 281], [281, 363], [426, 436], [436, 425], [425, 426],\n [380, 381], [381, 252], [252, 380], [267, 269], [269, 393], [393, 267],\n [421, 200], [200, 428], [428, 421], [371, 266], [266, 329], [329, 371],\n [432, 287], [287, 422], [422, 432], [290, 250], [250, 328], [328, 290],\n [385, 258], [258, 384], [384, 385], [446, 265], [265, 342], [342, 446],\n [386, 387], [387, 257], [257, 386], [422, 424], [424, 430], [430, 422],\n [445, 342], [342, 276], [276, 445], [422, 273], [273, 424], [424, 422],\n [306, 292], [292, 307], [307, 306], [352, 366], [366, 345], [345, 352],\n [268, 271], [271, 302], [302, 268], [358, 423], [423, 371], [371, 358],\n [327, 294], [294, 460], [460, 327], [331, 279], [279, 294], [294, 331],\n [303, 271], [271, 304], [304, 303], [436, 432], [432, 427], [427, 436],\n [304, 272], [272, 408], [408, 304], [395, 394], [394, 431], [431, 395],\n [378, 395], [395, 400], [400, 378], [296, 334], [334, 299], [299, 296],\n [6, 351], [351, 168], [168, 6], [376, 352], [352, 411], [411, 376],\n [307, 325], [325, 320], [320, 307], [285, 295], [295, 336], [336, 285],\n [320, 319], [319, 404], [404, 320], [329, 330], [330, 349], [349, 329],\n [334, 293], [293, 333], [333, 334], [366, 323], [323, 447], [447, 366],\n [316, 15], [15, 315], [315, 316], [331, 358], [358, 279], [279, 331],\n [317, 14], [14, 316], [316, 317], [8, 285], [285, 9], [9, 8],\n [277, 329], [329, 350], [350, 277], [253, 374], [374, 252], [252, 253],\n [319, 318], [318, 403], [403, 319], [351, 6], [6, 419], [419, 351],\n [324, 318], [318, 325], [325, 324], [397, 367], [367, 365], [365, 397],\n [288, 435], [435, 397], [397, 288], [278, 344], [344, 439], [439, 278],\n [310, 272], [272, 311], [311, 310], [248, 195], [195, 281], [281, 248],\n [375, 273], [273, 291], [291, 375], [175, 396], [396, 199], [199, 175],\n [312, 311], [311, 268], [268, 312], [276, 283], [283, 445], [445, 276],\n [390, 373], [373, 339], [339, 390], [295, 282], [282, 296], [296, 295],\n [448, 449], [449, 346], [346, 448], [356, 264], [264, 454], [454, 356],\n [337, 336], [336, 299], [299, 337], [337, 338], [338, 151], [151, 337],\n [294, 278], [278, 455], [455, 294], [308, 292], [292, 415], [415, 308],\n [429, 358], [358, 355], [355, 429], [265, 340], [340, 372], [372, 265],\n [352, 346], [346, 280], [280, 352], [295, 442], [442, 282], [282, 295],\n [354, 19], [19, 370], [370, 354], [285, 441], [441, 295], [295, 285],\n [195, 248], [248, 197], [197, 195], [457, 440], [440, 274], [274, 457],\n [301, 300], [300, 368], [368, 301], [417, 351], [351, 465], [465, 417],\n [251, 301], [301, 389], [389, 251], [394, 395], [395, 379], [379, 394],\n [399, 412], [412, 419], [419, 399], [410, 436], [436, 322], [322, 410],\n [326, 2], [2, 393], [393, 326], [354, 370], [370, 461], [461, 354],\n [393, 164], [164, 267], [267, 393], [268, 302], [302, 12], [12, 268],\n [312, 268], [268, 13], [13, 312], [298, 293], [293, 301], [301, 298],\n [265, 446], [446, 340], [340, 265], [280, 330], [330, 425], [425, 280],\n [322, 426], [426, 391], [391, 322], [420, 429], [429, 437], [437, 420],\n [393, 391], [391, 326], [326, 393], [344, 440], [440, 438], [438, 344],\n [458, 459], [459, 461], [461, 458], [364, 434], [434, 394], [394, 364],\n [428, 396], [396, 262], [262, 428], [274, 354], [354, 457], [457, 274],\n [317, 316], [316, 402], [402, 317], [316, 315], [315, 403], [403, 316],\n [315, 314], [314, 404], [404, 315], [314, 313], [313, 405], [405, 314],\n [313, 421], [421, 406], [406, 313], [323, 366], [366, 361], [361, 323],\n [292, 306], [306, 407], [407, 292], [306, 291], [291, 408], [408, 306],\n [291, 287], [287, 409], [409, 291], [287, 432], [432, 410], [410, 287],\n [427, 434], [434, 411], [411, 427], [372, 264], [264, 383], [383, 372],\n [459, 309], [309, 457], [457, 459], [366, 352], [352, 401], [401, 366],\n [1, 274], [274, 4], [4, 1], [418, 421], [421, 262], [262, 418],\n [331, 294], [294, 358], [358, 331], [435, 433], [433, 367], [367, 435],\n [392, 289], [289, 439], [439, 392], [328, 462], [462, 326], [326, 328],\n [94, 2], [2, 370], [370, 94], [289, 305], [305, 455], [455, 289],\n [339, 254], [254, 448], [448, 339], [359, 255], [255, 446], [446, 359],\n [254, 253], [253, 449], [449, 254], [253, 252], [252, 450], [450, 253],\n [252, 256], [256, 451], [451, 252], [256, 341], [341, 452], [452, 256],\n [414, 413], [413, 463], [463, 414], [286, 441], [441, 414], [414, 286],\n [286, 258], [258, 441], [441, 286], [258, 257], [257, 442], [442, 258],\n [257, 259], [259, 443], [443, 257], [259, 260], [260, 444], [444, 259],\n [260, 467], [467, 445], [445, 260], [309, 459], [459, 250], [250, 309],\n [305, 289], [289, 290], [290, 305], [305, 290], [290, 460], [460, 305],\n [401, 376], [376, 435], [435, 401], [309, 250], [250, 392], [392, 309],\n [376, 411], [411, 433], [433, 376], [453, 341], [341, 464], [464, 453],\n [357, 453], [453, 465], [465, 357], [343, 357], [357, 412], [412, 343],\n [437, 343], [343, 399], [399, 437], [344, 360], [360, 440], [440, 344],\n [420, 437], [437, 456], [456, 420], [360, 420], [420, 363], [363, 360],\n [361, 401], [401, 288], [288, 361], [265, 372], [372, 353], [353, 265],\n [390, 339], [339, 249], [249, 390], [339, 448], [448, 255], [255, 339],\n];\n", "// @tensorflow/tfjs-models/face-landmark-detection/src/constants.ts\n// https://github.com/google/mediapipe/mediapipe/python/solutions/face_mesh_connections.py\n\ntype PairArray = [number, number][];\n\nconst LIPS_CONNECTIONS: PairArray = [\n [61, 146], [146, 91], [91, 181], [181, 84], [84, 17], [17, 314], [314, 405], [405, 321], [321, 375], [375, 291], [61, 185], [185, 40], [40, 39], [39, 37], [37, 0], [0, 267], [267, 269], [269, 270], [270, 409], [409, 291],\n [78, 95], [95, 88], [88, 178], [178, 87], [87, 14], [14, 317], [317, 402], [402, 318], [318, 324], [324, 308], [78, 191], [191, 80], [80, 81], [81, 82], [82, 13], [13, 312], [312, 311], [311, 310], [310, 415], [415, 308],\n];\n\nconst LEFT_EYE_CONNECTIONS: PairArray = [[263, 249], [249, 390], [390, 373], [373, 374], [374, 380], [380, 381], [381, 382], [382, 362], [263, 466], [466, 388], [388, 387], [387, 386], [386, 385], [385, 384], [384, 398], [398, 362]];\n\nconst LEFT_EYEBROW_CONNECTIONS: PairArray = [[276, 283], [283, 282], [282, 295], [295, 285], [300, 293], [293, 334], [334, 296], [296, 336]];\n\nconst LEFT_IRIS_CONNECTIONS: PairArray = [[474, 475], [475, 476], [476, 477], [477, 474]];\n\nconst RIGHT_EYE_CONNECTIONS: PairArray = [[33, 7], [7, 163], [163, 144], [144, 145], [145, 153], [153, 154], [154, 155], [155, 133], [33, 246], [246, 161], [161, 160], [160, 159], [159, 158], [158, 157], [157, 173], [173, 133]];\n\nconst RIGHT_EYEBROW_CONNECTIONS: PairArray = [[46, 53], [53, 52], [52, 65], [65, 55], [70, 63], [63, 105], [105, 66], [66, 107]];\n\nconst RIGHT_IRIS_CONNECTIONS: PairArray = [[469, 470], [470, 471], [471, 472], [472, 469]];\n\nconst FACE_OVAL_CONNECTIONS: PairArray = [\n [10, 338], [338, 297], [297, 332], [332, 284], [284, 251], [251, 389], [389, 356], [356, 454], [454, 323], [323, 361], [361, 288], [288, 397], [397, 365], [365, 379], [379, 378], [378, 400], [400, 377], [377, 152],\n [152, 148], [148, 176], [176, 149], [149, 150], [150, 136], [136, 172], [172, 58], [58, 132], [132, 93], [93, 234], [234, 127], [127, 162], [162, 21], [21, 54], [54, 103], [103, 67], [67, 109], [109, 10],\n];\n\nexport const MEDIAPIPE_FACE_MESH_CONNECTED_KEYPOINTS_PAIRS: PairArray = [\n [127, 34], [34, 139], [139, 127], [11, 0], [0, 37], [37, 11], [232, 231], [231, 120], [120, 232], [72, 37], [37, 39], [39, 72], [128, 121], [121, 47], [47, 128], [232, 121], [121, 128], [128, 232],\n [104, 69], [69, 67], [67, 104], [175, 171], [171, 148], [148, 175], [118, 50], [50, 101], [101, 118], [73, 39], [39, 40], [40, 73], [9, 151], [151, 108], [108, 9], [48, 115], [115, 131], [131, 48],\n [194, 204], [204, 211], [211, 194], [74, 40], [40, 185], [185, 74], [80, 42], [42, 183], [183, 80], [40, 92], [92, 186], [186, 40], [230, 229], [229, 118], [118, 230], [202, 212], [212, 214], [214, 202],\n [83, 18], [18, 17], [17, 83], [76, 61], [61, 146], [146, 76], [160, 29], [29, 30], [30, 160], [56, 157], [157, 173], [173, 56], [106, 204], [204, 194], [194, 106], [135, 214], [214, 192], [192, 135],\n [203, 165], [165, 98], [98, 203], [21, 71], [71, 68], [68, 21], [51, 45], [45, 4], [4, 51], [144, 24], [24, 23], [23, 144], [77, 146], [146, 91], [91, 77], [205, 50], [50, 187], [187, 205],\n [201, 200], [200, 18], [18, 201], [91, 106], [106, 182], [182, 91], [90, 91], [91, 181], [181, 90], [85, 84], [84, 17], [17, 85], [206, 203], [203, 36], [36, 206], [148, 171], [171, 140], [140, 148],\n [92, 40], [40, 39], [39, 92], [193, 189], [189, 244], [244, 193], [159, 158], [158, 28], [28, 159], [247, 246], [246, 161], [161, 247], [236, 3], [3, 196], [196, 236], [54, 68], [68, 104], [104, 54],\n [193, 168], [168, 8], [8, 193], [117, 228], [228, 31], [31, 117], [189, 193], [193, 55], [55, 189], [98, 97], [97, 99], [99, 98], [126, 47], [47, 100], [100, 126], [166, 79], [79, 218], [218, 166],\n [155, 154], [154, 26], [26, 155], [209, 49], [49, 131], [131, 209], [135, 136], [136, 150], [150, 135], [47, 126], [126, 217], [217, 47], [223, 52], [52, 53], [53, 223], [45, 51], [51, 134], [134, 45],\n [211, 170], [170, 140], [140, 211], [67, 69], [69, 108], [108, 67], [43, 106], [106, 91], [91, 43], [230, 119], [119, 120], [120, 230], [226, 130], [130, 247], [247, 226], [63, 53], [53, 52], [52, 63],\n [238, 20], [20, 242], [242, 238], [46, 70], [70, 156], [156, 46], [78, 62], [62, 96], [96, 78], [46, 53], [53, 63], [63, 46], [143, 34], [34, 227], [227, 143], [123, 117], [117, 111], [111, 123],\n [44, 125], [125, 19], [19, 44], [236, 134], [134, 51], [51, 236], [216, 206], [206, 205], [205, 216], [154, 153], [153, 22], [22, 154], [39, 37], [37, 167], [167, 39], [200, 201], [201, 208], [208, 200],\n [36, 142], [142, 100], [100, 36], [57, 212], [212, 202], [202, 57], [20, 60], [60, 99], [99, 20], [28, 158], [158, 157], [157, 28], [35, 226], [226, 113], [113, 35], [160, 159], [159, 27], [27, 160],\n [204, 202], [202, 210], [210, 204], [113, 225], [225, 46], [46, 113], [43, 202], [202, 204], [204, 43], [62, 76], [76, 77], [77, 62], [137, 123], [123, 116], [116, 137], [41, 38], [38, 72], [72, 41],\n [203, 129], [129, 142], [142, 203], [64, 98], [98, 240], [240, 64], [49, 102], [102, 64], [64, 49], [41, 73], [73, 74], [74, 41], [212, 216], [216, 207], [207, 212], [42, 74], [74, 184], [184, 42],\n [169, 170], [170, 211], [211, 169], [170, 149], [149, 176], [176, 170], [105, 66], [66, 69], [69, 105], [122, 6], [6, 168], [168, 122], [123, 147], [147, 187], [187, 123], [96, 77], [77, 90], [90, 96],\n [65, 55], [55, 107], [107, 65], [89, 90], [90, 180], [180, 89], [101, 100], [100, 120], [120, 101], [63, 105], [105, 104], [104, 63], [93, 137], [137, 227], [227, 93], [15, 86], [86, 85], [85, 15],\n [129, 102], [102, 49], [49, 129], [14, 87], [87, 86], [86, 14], [55, 8], [8, 9], [9, 55], [100, 47], [47, 121], [121, 100], [145, 23], [23, 22], [22, 145], [88, 89], [89, 179], [179, 88],\n [6, 122], [122, 196], [196, 6], [88, 95], [95, 96], [96, 88], [138, 172], [172, 136], [136, 138], [215, 58], [58, 172], [172, 215], [115, 48], [48, 219], [219, 115], [42, 80], [80, 81], [81, 42],\n [195, 3], [3, 51], [51, 195], [43, 146], [146, 61], [61, 43], [171, 175], [175, 199], [199, 171], [81, 82], [82, 38], [38, 81], [53, 46], [46, 225], [225, 53], [144, 163], [163, 110], [110, 144],\n [52, 65], [65, 66], [66, 52], [229, 228], [228, 117], [117, 229], [34, 127], [127, 234], [234, 34], [107, 108], [108, 69], [69, 107], [109, 108], [108, 151], [151, 109], [48, 64], [64, 235], [235, 48],\n [62, 78], [78, 191], [191, 62], [129, 209], [209, 126], [126, 129], [111, 35], [35, 143], [143, 111], [117, 123], [123, 50], [50, 117], [222, 65], [65, 52], [52, 222], [19, 125], [125, 141], [141, 19],\n [221, 55], [55, 65], [65, 221], [3, 195], [195, 197], [197, 3], [25, 7], [7, 33], [33, 25], [220, 237], [237, 44], [44, 220], [70, 71], [71, 139], [139, 70], [122, 193], [193, 245], [245, 122],\n [247, 130], [130, 33], [33, 247], [71, 21], [21, 162], [162, 71], [170, 169], [169, 150], [150, 170], [188, 174], [174, 196], [196, 188], [216, 186], [186, 92], [92, 216], [2, 97], [97, 167], [167, 2],\n [141, 125], [125, 241], [241, 141], [164, 167], [167, 37], [37, 164], [72, 38], [38, 12], [12, 72], [38, 82], [82, 13], [13, 38], [63, 68], [68, 71], [71, 63], [226, 35], [35, 111], [111, 226],\n [101, 50], [50, 205], [205, 101], [206, 92], [92, 165], [165, 206], [209, 198], [198, 217], [217, 209], [165, 167], [167, 97], [97, 165], [220, 115], [115, 218], [218, 220], [133, 112], [112, 243], [243, 133],\n [239, 238], [238, 241], [241, 239], [214, 135], [135, 169], [169, 214], [190, 173], [173, 133], [133, 190], [171, 208], [208, 32], [32, 171], [125, 44], [44, 237], [237, 125], [86, 87], [87, 178], [178, 86],\n [85, 86], [86, 179], [179, 85], [84, 85], [85, 180], [180, 84], [83, 84], [84, 181], [181, 83], [201, 83], [83, 182], [182, 201], [137, 93], [93, 132], [132, 137], [76, 62], [62, 183], [183, 76],\n [61, 76], [76, 184], [184, 61], [57, 61], [61, 185], [185, 57], [212, 57], [57, 186], [186, 212], [214, 207], [207, 187], [187, 214], [34, 143], [143, 156], [156, 34], [79, 239], [239, 237], [237, 79],\n [123, 137], [137, 177], [177, 123], [44, 1], [1, 4], [4, 44], [201, 194], [194, 32], [32, 201], [64, 102], [102, 129], [129, 64], [213, 215], [215, 138], [138, 213], [59, 166], [166, 219], [219, 59],\n [242, 99], [99, 97], [97, 242], [2, 94], [94, 141], [141, 2], [75, 59], [59, 235], [235, 75], [24, 110], [110, 228], [228, 24], [25, 130], [130, 226], [226, 25], [23, 24], [24, 229], [229, 23],\n [22, 23], [23, 230], [230, 22], [26, 22], [22, 231], [231, 26], [112, 26], [26, 232], [232, 112], [189, 190], [190, 243], [243, 189], [221, 56], [56, 190], [190, 221], [28, 56], [56, 221], [221, 28],\n [27, 28], [28, 222], [222, 27], [29, 27], [27, 223], [223, 29], [30, 29], [29, 224], [224, 30], [247, 30], [30, 225], [225, 247], [238, 79], [79, 20], [20, 238], [166, 59], [59, 75], [75, 166],\n [60, 75], [75, 240], [240, 60], [147, 177], [177, 215], [215, 147], [20, 79], [79, 166], [166, 20], [187, 147], [147, 213], [213, 187], [112, 233], [233, 244], [244, 112], [233, 128], [128, 245], [245, 233],\n [128, 114], [114, 188], [188, 128], [114, 217], [217, 174], [174, 114], [131, 115], [115, 220], [220, 131], [217, 198], [198, 236], [236, 217], [198, 131], [131, 134], [134, 198], [177, 132], [132, 58], [58, 177],\n [143, 35], [35, 124], [124, 143], [110, 163], [163, 7], [7, 110], [228, 110], [110, 25], [25, 228], [356, 389], [389, 368], [368, 356], [11, 302], [302, 267], [267, 11], [452, 350], [350, 349], [349, 452],\n [302, 303], [303, 269], [269, 302], [357, 343], [343, 277], [277, 357], [452, 453], [453, 357], [357, 452], [333, 332], [332, 297], [297, 333], [175, 152], [152, 377], [377, 175], [347, 348], [348, 330], [330, 347],\n [303, 304], [304, 270], [270, 303], [9, 336], [336, 337], [337, 9], [278, 279], [279, 360], [360, 278], [418, 262], [262, 431], [431, 418], [304, 408], [408, 409], [409, 304], [310, 415], [415, 407], [407, 310],\n [270, 409], [409, 410], [410, 270], [450, 348], [348, 347], [347, 450], [422, 430], [430, 434], [434, 422], [313, 314], [314, 17], [17, 313], [306, 307], [307, 375], [375, 306], [387, 388], [388, 260], [260, 387],\n [286, 414], [414, 398], [398, 286], [335, 406], [406, 418], [418, 335], [364, 367], [367, 416], [416, 364], [423, 358], [358, 327], [327, 423], [251, 284], [284, 298], [298, 251], [281, 5], [5, 4], [4, 281],\n [373, 374], [374, 253], [253, 373], [307, 320], [320, 321], [321, 307], [425, 427], [427, 411], [411, 425], [421, 313], [313, 18], [18, 421], [321, 405], [405, 406], [406, 321], [320, 404], [404, 405], [405, 320],\n [315, 16], [16, 17], [17, 315], [426, 425], [425, 266], [266, 426], [377, 400], [400, 369], [369, 377], [322, 391], [391, 269], [269, 322], [417, 465], [465, 464], [464, 417], [386, 257], [257, 258], [258, 386],\n [466, 260], [260, 388], [388, 466], [456, 399], [399, 419], [419, 456], [284, 332], [332, 333], [333, 284], [417, 285], [285, 8], [8, 417], [346, 340], [340, 261], [261, 346], [413, 441], [441, 285], [285, 413],\n [327, 460], [460, 328], [328, 327], [355, 371], [371, 329], [329, 355], [392, 439], [439, 438], [438, 392], [382, 341], [341, 256], [256, 382], [429, 420], [420, 360], [360, 429], [364, 394], [394, 379], [379, 364],\n [277, 343], [343, 437], [437, 277], [443, 444], [444, 283], [283, 443], [275, 440], [440, 363], [363, 275], [431, 262], [262, 369], [369, 431], [297, 338], [338, 337], [337, 297], [273, 375], [375, 321], [321, 273],\n [450, 451], [451, 349], [349, 450], [446, 342], [342, 467], [467, 446], [293, 334], [334, 282], [282, 293], [458, 461], [461, 462], [462, 458], [276, 353], [353, 383], [383, 276], [308, 324], [324, 325], [325, 308],\n [276, 300], [300, 293], [293, 276], [372, 345], [345, 447], [447, 372], [352, 345], [345, 340], [340, 352], [274, 1], [1, 19], [19, 274], [456, 248], [248, 281], [281, 456], [436, 427], [427, 425], [425, 436],\n [381, 256], [256, 252], [252, 381], [269, 391], [391, 393], [393, 269], [200, 199], [199, 428], [428, 200], [266, 330], [330, 329], [329, 266], [287, 273], [273, 422], [422, 287], [250, 462], [462, 328], [328, 250],\n [258, 286], [286, 384], [384, 258], [265, 353], [353, 342], [342, 265], [387, 259], [259, 257], [257, 387], [424, 431], [431, 430], [430, 424], [342, 353], [353, 276], [276, 342], [273, 335], [335, 424], [424, 273],\n [292, 325], [325, 307], [307, 292], [366, 447], [447, 345], [345, 366], [271, 303], [303, 302], [302, 271], [423, 266], [266, 371], [371, 423], [294, 455], [455, 460], [460, 294], [279, 278], [278, 294], [294, 279],\n [271, 272], [272, 304], [304, 271], [432, 434], [434, 427], [427, 432], [272, 407], [407, 408], [408, 272], [394, 430], [430, 431], [431, 394], [395, 369], [369, 400], [400, 395], [334, 333], [333, 299], [299, 334],\n [351, 417], [417, 168], [168, 351], [352, 280], [280, 411], [411, 352], [325, 319], [319, 320], [320, 325], [295, 296], [296, 336], [336, 295], [319, 403], [403, 404], [404, 319], [330, 348], [348, 349], [349, 330],\n [293, 298], [298, 333], [333, 293], [323, 454], [454, 447], [447, 323], [15, 16], [16, 315], [315, 15], [358, 429], [429, 279], [279, 358], [14, 15], [15, 316], [316, 14], [285, 336], [336, 9], [9, 285],\n [329, 349], [349, 350], [350, 329], [374, 380], [380, 252], [252, 374], [318, 402], [402, 403], [403, 318], [6, 197], [197, 419], [419, 6], [318, 319], [319, 325], [325, 318], [367, 364], [364, 365], [365, 367],\n [435, 367], [367, 397], [397, 435], [344, 438], [438, 439], [439, 344], [272, 271], [271, 311], [311, 272], [195, 5], [5, 281], [281, 195], [273, 287], [287, 291], [291, 273], [396, 428], [428, 199], [199, 396],\n [311, 271], [271, 268], [268, 311], [283, 444], [444, 445], [445, 283], [373, 254], [254, 339], [339, 373], [282, 334], [334, 296], [296, 282], [449, 347], [347, 346], [346, 449], [264, 447], [447, 454], [454, 264],\n [336, 296], [296, 299], [299, 336], [338, 10], [10, 151], [151, 338], [278, 439], [439, 455], [455, 278], [292, 407], [407, 415], [415, 292], [358, 371], [371, 355], [355, 358], [340, 345], [345, 372], [372, 340],\n [346, 347], [347, 280], [280, 346], [442, 443], [443, 282], [282, 442], [19, 94], [94, 370], [370, 19], [441, 442], [442, 295], [295, 441], [248, 419], [419, 197], [197, 248], [263, 255], [255, 359], [359, 263],\n [440, 275], [275, 274], [274, 440], [300, 383], [383, 368], [368, 300], [351, 412], [412, 465], [465, 351], [263, 467], [467, 466], [466, 263], [301, 368], [368, 389], [389, 301], [395, 378], [378, 379], [379, 395],\n [412, 351], [351, 419], [419, 412], [436, 426], [426, 322], [322, 436], [2, 164], [164, 393], [393, 2], [370, 462], [462, 461], [461, 370], [164, 0], [0, 267], [267, 164], [302, 11], [11, 12], [12, 302],\n [268, 12], [12, 13], [13, 268], [293, 300], [300, 301], [301, 293], [446, 261], [261, 340], [340, 446], [330, 266], [266, 425], [425, 330], [426, 423], [423, 391], [391, 426], [429, 355], [355, 437], [437, 429],\n [391, 327], [327, 326], [326, 391], [440, 457], [457, 438], [438, 440], [341, 382], [382, 362], [362, 341], [459, 457], [457, 461], [461, 459], [434, 430], [430, 394], [394, 434], [414, 463], [463, 362], [362, 414],\n [396, 369], [369, 262], [262, 396], [354, 461], [461, 457], [457, 354], [316, 403], [403, 402], [402, 316], [315, 404], [404, 403], [403, 315], [314, 405], [405, 404], [404, 314], [313, 406], [406, 405], [405, 313],\n [421, 418], [418, 406], [406, 421], [366, 401], [401, 361], [361, 366], [306, 408], [408, 407], [407, 306], [291, 409], [409, 408], [408, 291], [287, 410], [410, 409], [409, 287], [432, 436], [436, 410], [410, 432],\n [434, 416], [416, 411], [411, 434], [264, 368], [368, 383], [383, 264], [309, 438], [438, 457], [457, 309], [352, 376], [376, 401], [401, 352], [274, 275], [275, 4], [4, 274], [421, 428], [428, 262], [262, 421],\n [294, 327], [327, 358], [358, 294], [433, 416], [416, 367], [367, 433], [289, 455], [455, 439], [439, 289], [462, 370], [370, 326], [326, 462], [2, 326], [326, 370], [370, 2], [305, 460], [460, 455], [455, 305],\n [254, 449], [449, 448], [448, 254], [255, 261], [261, 446], [446, 255], [253, 450], [450, 449], [449, 253], [252, 451], [451, 450], [450, 252], [256, 452], [452, 451], [451, 256], [341, 453], [453, 452], [452, 341],\n [413, 464], [464, 463], [463, 413], [441, 413], [413, 414], [414, 441], [258, 442], [442, 441], [441, 258], [257, 443], [443, 442], [442, 257], [259, 444], [444, 443], [443, 259], [260, 445], [445, 444], [444, 260],\n [467, 342], [342, 445], [445, 467], [459, 458], [458, 250], [250, 459], [289, 392], [392, 290], [290, 289], [290, 328], [328, 460], [460, 290], [376, 433], [433, 435], [435, 376], [250, 290], [290, 392], [392, 250],\n [411, 416], [416, 433], [433, 411], [341, 463], [463, 464], [464, 341], [453, 464], [464, 465], [465, 453], [357, 465], [465, 412], [412, 357], [343, 412], [412, 399], [399, 343], [360, 363], [363, 440], [440, 360],\n [437, 399], [399, 456], [456, 437], [420, 456], [456, 363], [363, 420], [401, 435], [435, 288], [288, 401], [372, 383], [383, 353], [353, 372], [339, 255], [255, 249], [249, 339], [448, 261], [261, 255], [255, 448],\n [133, 243], [243, 190], [190, 133], [133, 155], [155, 112], [112, 133], [33, 246], [246, 247], [247, 33], [33, 130], [130, 25], [25, 33], [398, 384], [384, 286], [286, 398], [362, 398], [398, 414], [414, 362],\n [362, 463], [463, 341], [341, 362], [263, 359], [359, 467], [467, 263], [263, 249], [249, 255], [255, 263], [466, 467], [467, 260], [260, 466], [75, 60], [60, 166], [166, 75], [238, 239], [239, 79], [79, 238],\n [162, 127], [127, 139], [139, 162], [72, 11], [11, 37], [37, 72], [121, 232], [232, 120], [120, 121], [73, 72], [72, 39], [39, 73], [114, 128], [128, 47], [47, 114], [233, 232], [232, 128], [128, 233],\n [103, 104], [104, 67], [67, 103], [152, 175], [175, 148], [148, 152], [119, 118], [118, 101], [101, 119], [74, 73], [73, 40], [40, 74], [107, 9], [9, 108], [108, 107], [49, 48], [48, 131], [131, 49],\n [32, 194], [194, 211], [211, 32], [184, 74], [74, 185], [185, 184], [191, 80], [80, 183], [183, 191], [185, 40], [40, 186], [186, 185], [119, 230], [230, 118], [118, 119], [210, 202], [202, 214], [214, 210],\n [84, 83], [83, 17], [17, 84], [77, 76], [76, 146], [146, 77], [161, 160], [160, 30], [30, 161], [190, 56], [56, 173], [173, 190], [182, 106], [106, 194], [194, 182], [138, 135], [135, 192], [192, 138],\n [129, 203], [203, 98], [98, 129], [54, 21], [21, 68], [68, 54], [5, 51], [51, 4], [4, 5], [145, 144], [144, 23], [23, 145], [90, 77], [77, 91], [91, 90], [207, 205], [205, 187], [187, 207],\n [83, 201], [201, 18], [18, 83], [181, 91], [91, 182], [182, 181], [180, 90], [90, 181], [181, 180], [16, 85], [85, 17], [17, 16], [205, 206], [206, 36], [36, 205], [176, 148], [148, 140], [140, 176],\n [165, 92], [92, 39], [39, 165], [245, 193], [193, 244], [244, 245], [27, 159], [159, 28], [28, 27], [30, 247], [247, 161], [161, 30], [174, 236], [236, 196], [196, 174], [103, 54], [54, 104], [104, 103],\n [55, 193], [193, 8], [8, 55], [111, 117], [117, 31], [31, 111], [221, 189], [189, 55], [55, 221], [240, 98], [98, 99], [99, 240], [142, 126], [126, 100], [100, 142], [219, 166], [166, 218], [218, 219],\n [112, 155], [155, 26], [26, 112], [198, 209], [209, 131], [131, 198], [169, 135], [135, 150], [150, 169], [114, 47], [47, 217], [217, 114], [224, 223], [223, 53], [53, 224], [220, 45], [45, 134], [134, 220],\n [32, 211], [211, 140], [140, 32], [109, 67], [67, 108], [108, 109], [146, 43], [43, 91], [91, 146], [231, 230], [230, 120], [120, 231], [113, 226], [226, 247], [247, 113], [105, 63], [63, 52], [52, 105],\n [241, 238], [238, 242], [242, 241], [124, 46], [46, 156], [156, 124], [95, 78], [78, 96], [96, 95], [70, 46], [46, 63], [63, 70], [116, 143], [143, 227], [227, 116], [116, 123], [123, 111], [111, 116],\n [1, 44], [44, 19], [19, 1], [3, 236], [236, 51], [51, 3], [207, 216], [216, 205], [205, 207], [26, 154], [154, 22], [22, 26], [165, 39], [39, 167], [167, 165], [199, 200], [200, 208], [208, 199],\n [101, 36], [36, 100], [100, 101], [43, 57], [57, 202], [202, 43], [242, 20], [20, 99], [99, 242], [56, 28], [28, 157], [157, 56], [124, 35], [35, 113], [113, 124], [29, 160], [160, 27], [27, 29],\n [211, 204], [204, 210], [210, 211], [124, 113], [113, 46], [46, 124], [106, 43], [43, 204], [204, 106], [96, 62], [62, 77], [77, 96], [227, 137], [137, 116], [116, 227], [73, 41], [41, 72], [72, 73],\n [36, 203], [203, 142], [142, 36], [235, 64], [64, 240], [240, 235], [48, 49], [49, 64], [64, 48], [42, 41], [41, 74], [74, 42], [214, 212], [212, 207], [207, 214], [183, 42], [42, 184], [184, 183],\n [210, 169], [169, 211], [211, 210], [140, 170], [170, 176], [176, 140], [104, 105], [105, 69], [69, 104], [193, 122], [122, 168], [168, 193], [50, 123], [123, 187], [187, 50], [89, 96], [96, 90], [90, 89],\n [66, 65], [65, 107], [107, 66], [179, 89], [89, 180], [180, 179], [119, 101], [101, 120], [120, 119], [68, 63], [63, 104], [104, 68], [234, 93], [93, 227], [227, 234], [16, 15], [15, 85], [85, 16],\n [209, 129], [129, 49], [49, 209], [15, 14], [14, 86], [86, 15], [107, 55], [55, 9], [9, 107], [120, 100], [100, 121], [121, 120], [153, 145], [145, 22], [22, 153], [178, 88], [88, 179], [179, 178],\n [197, 6], [6, 196], [196, 197], [89, 88], [88, 96], [96, 89], [135, 138], [138, 136], [136, 135], [138, 215], [215, 172], [172, 138], [218, 115], [115, 219], [219, 218], [41, 42], [42, 81], [81, 41],\n [5, 195], [195, 51], [51, 5], [57, 43], [43, 61], [61, 57], [208, 171], [171, 199], [199, 208], [41, 81], [81, 38], [38, 41], [224, 53], [53, 225], [225, 224], [24, 144], [144, 110], [110, 24],\n [105, 52], [52, 66], [66, 105], [118, 229], [229, 117], [117, 118], [227, 34], [34, 234], [234, 227], [66, 107], [107, 69], [69, 66], [10, 109], [109, 151], [151, 10], [219, 48], [48, 235], [235, 219],\n [183, 62], [62, 191], [191, 183], [142, 129], [129, 126], [126, 142], [116, 111], [111, 143], [143, 116], [118, 117], [117, 50], [50, 118], [223, 222], [222, 52], [52, 223], [94, 19], [19, 141], [141, 94],\n [222, 221], [221, 65], [65, 222], [196, 3], [3, 197], [197, 196], [45, 220], [220, 44], [44, 45], [156, 70], [70, 139], [139, 156], [188, 122], [122, 245], [245, 188], [139, 71], [71, 162], [162, 139],\n [149, 170], [170, 150], [150, 149], [122, 188], [188, 196], [196, 122], [206, 216], [216, 92], [92, 206], [164, 2], [2, 167], [167, 164], [242, 141], [141, 241], [241, 242], [0, 164], [164, 37], [37, 0],\n [11, 72], [72, 12], [12, 11], [12, 38], [38, 13], [13, 12], [70, 63], [63, 71], [71, 70], [31, 226], [226, 111], [111, 31], [36, 101], [101, 205], [205, 36], [203, 206], [206, 165], [165, 203],\n [126, 209], [209, 217], [217, 126], [98, 165], [165, 97], [97, 98], [237, 220], [220, 218], [218, 237], [237, 239], [239, 241], [241, 237], [210, 214], [214, 169], [169, 210], [140, 171], [171, 32], [32, 140],\n [241, 125], [125, 237], [237, 241], [179, 86], [86, 178], [178, 179], [180, 85], [85, 179], [179, 180], [181, 84], [84, 180], [180, 181], [182, 83], [83, 181], [181, 182], [194, 201], [201, 182], [182, 194],\n [177, 137], [137, 132], [132, 177], [184, 76], [76, 183], [183, 184], [185, 61], [61, 184], [184, 185], [186, 57], [57, 185], [185, 186], [216, 212], [212, 186], [186, 216], [192, 214], [214, 187], [187, 192],\n [139, 34], [34, 156], [156, 139], [218, 79], [79, 237], [237, 218], [147, 123], [123, 177], [177, 147], [45, 44], [44, 4], [4, 45], [208, 201], [201, 32], [32, 208], [98, 64], [64, 129], [129, 98],\n [192, 213], [213, 138], [138, 192], [235, 59], [59, 219], [219, 235], [141, 242], [242, 97], [97, 141], [97, 2], [2, 141], [141, 97], [240, 75], [75, 235], [235, 240], [229, 24], [24, 228], [228, 229],\n [31, 25], [25, 226], [226, 31], [230, 23], [23, 229], [229, 230], [231, 22], [22, 230], [230, 231], [232, 26], [26, 231], [231, 232], [233, 112], [112, 232], [232, 233], [244, 189], [189, 243], [243, 244],\n [189, 221], [221, 190], [190, 189], [222, 28], [28, 221], [221, 222], [223, 27], [27, 222], [222, 223], [224, 29], [29, 223], [223, 224], [225, 30], [30, 224], [224, 225], [113, 247], [247, 225], [225, 113],\n [99, 60], [60, 240], [240, 99], [213, 147], [147, 215], [215, 213], [60, 20], [20, 166], [166, 60], [192, 187], [187, 213], [213, 192], [243, 112], [112, 244], [244, 243], [244, 233], [233, 245], [245, 244],\n [245, 128], [128, 188], [188, 245], [188, 114], [114, 174], [174, 188], [134, 131], [131, 220], [220, 134], [174, 217], [217, 236], [236, 174], [236, 198], [198, 134], [134, 236], [215, 177], [177, 58], [58, 215],\n [156, 143], [143, 124], [124, 156], [25, 110], [110, 7], [7, 25], [31, 228], [228, 25], [25, 31], [264, 356], [356, 368], [368, 264], [0, 11], [11, 267], [267, 0], [451, 452], [452, 349], [349, 451],\n [267, 302], [302, 269], [269, 267], [350, 357], [357, 277], [277, 350], [350, 452], [452, 357], [357, 350], [299, 333], [333, 297], [297, 299], [396, 175], [175, 377], [377, 396], [280, 347], [347, 330], [330, 280],\n [269, 303], [303, 270], [270, 269], [151, 9], [9, 337], [337, 151], [344, 278], [278, 360], [360, 344], [424, 418], [418, 431], [431, 424], [270, 304], [304, 409], [409, 270], [272, 310], [310, 407], [407, 272],\n [322, 270], [270, 410], [410, 322], [449, 450], [450, 347], [347, 449], [432, 422], [422, 434], [434, 432], [18, 313], [313, 17], [17, 18], [291, 306], [306, 375], [375, 291], [259, 387], [387, 260], [260, 259],\n [424, 335], [335, 418], [418, 424], [434, 364], [364, 416], [416, 434], [391, 423], [423, 327], [327, 391], [301, 251], [251, 298], [298, 301], [275, 281], [281, 4], [4, 275], [254, 373], [373, 253], [253, 254],\n [375, 307], [307, 321], [321, 375], [280, 425], [425, 411], [411, 280], [200, 421], [421, 18], [18, 200], [335, 321], [321, 406], [406, 335], [321, 320], [320, 405], [405, 321], [314, 315], [315, 17], [17, 314],\n [423, 426], [426, 266], [266, 423], [396, 377], [377, 369], [369, 396], [270, 322], [322, 269], [269, 270], [413, 417], [417, 464], [464, 413], [385, 386], [386, 258], [258, 385], [248, 456], [456, 419], [419, 248],\n [298, 284], [284, 333], [333, 298], [168, 417], [417, 8], [8, 168], [448, 346], [346, 261], [261, 448], [417, 413], [413, 285], [285, 417], [326, 327], [327, 328], [328, 326], [277, 355], [355, 329], [329, 277],\n [309, 392], [392, 438], [438, 309], [381, 382], [382, 256], [256, 381], [279, 429], [429, 360], [360, 279], [365, 364], [364, 379], [379, 365], [355, 277], [277, 437], [437, 355], [282, 443], [443, 283], [283, 282],\n [281, 275], [275, 363], [363, 281], [395, 431], [431, 369], [369, 395], [299, 297], [297, 337], [337, 299], [335, 273], [273, 321], [321, 335], [348, 450], [450, 349], [349, 348], [359, 446], [446, 467], [467, 359],\n [283, 293], [293, 282], [282, 283], [250, 458], [458, 462], [462, 250], [300, 276], [276, 383], [383, 300], [292, 308], [308, 325], [325, 292], [283, 276], [276, 293], [293, 283], [264, 372], [372, 447], [447, 264],\n [346, 352], [352, 340], [340, 346], [354, 274], [274, 19], [19, 354], [363, 456], [456, 281], [281, 363], [426, 436], [436, 425], [425, 426], [380, 381], [381, 252], [252, 380], [267, 269], [269, 393], [393, 267],\n [421, 200], [200, 428], [428, 421], [371, 266], [266, 329], [329, 371], [432, 287], [287, 422], [422, 432], [290, 250], [250, 328], [328, 290], [385, 258], [258, 384], [384, 385], [446, 265], [265, 342], [342, 446],\n [386, 387], [387, 257], [257, 386], [422, 424], [424, 430], [430, 422], [445, 342], [342, 276], [276, 445], [422, 273], [273, 424], [424, 422], [306, 292], [292, 307], [307, 306], [352, 366], [366, 345], [345, 352],\n [268, 271], [271, 302], [302, 268], [358, 423], [423, 371], [371, 358], [327, 294], [294, 460], [460, 327], [331, 279], [279, 294], [294, 331], [303, 271], [271, 304], [304, 303], [436, 432], [432, 427], [427, 436],\n [304, 272], [272, 408], [408, 304], [395, 394], [394, 431], [431, 395], [378, 395], [395, 400], [400, 378], [296, 334], [334, 299], [299, 296], [6, 351], [351, 168], [168, 6], [376, 352], [352, 411], [411, 376],\n [307, 325], [325, 320], [320, 307], [285, 295], [295, 336], [336, 285], [320, 319], [319, 404], [404, 320], [329, 330], [330, 349], [349, 329], [334, 293], [293, 333], [333, 334], [366, 323], [323, 447], [447, 366],\n [316, 15], [15, 315], [315, 316], [331, 358], [358, 279], [279, 331], [317, 14], [14, 316], [316, 317], [8, 285], [285, 9], [9, 8], [277, 329], [329, 350], [350, 277], [253, 374], [374, 252], [252, 253],\n [319, 318], [318, 403], [403, 319], [351, 6], [6, 419], [419, 351], [324, 318], [318, 325], [325, 324], [397, 367], [367, 365], [365, 397], [288, 435], [435, 397], [397, 288], [278, 344], [344, 439], [439, 278],\n [310, 272], [272, 311], [311, 310], [248, 195], [195, 281], [281, 248], [375, 273], [273, 291], [291, 375], [175, 396], [396, 199], [199, 175], [312, 311], [311, 268], [268, 312], [276, 283], [283, 445], [445, 276],\n [390, 373], [373, 339], [339, 390], [295, 282], [282, 296], [296, 295], [448, 449], [449, 346], [346, 448], [356, 264], [264, 454], [454, 356], [337, 336], [336, 299], [299, 337], [337, 338], [338, 151], [151, 337],\n [294, 278], [278, 455], [455, 294], [308, 292], [292, 415], [415, 308], [429, 358], [358, 355], [355, 429], [265, 340], [340, 372], [372, 265], [352, 346], [346, 280], [280, 352], [295, 442], [442, 282], [282, 295],\n [354, 19], [19, 370], [370, 354], [285, 441], [441, 295], [295, 285], [195, 248], [248, 197], [197, 195], [457, 440], [440, 274], [274, 457], [301, 300], [300, 368], [368, 301], [417, 351], [351, 465], [465, 417],\n [251, 301], [301, 389], [389, 251], [394, 395], [395, 379], [379, 394], [399, 412], [412, 419], [419, 399], [410, 436], [436, 322], [322, 410], [326, 2], [2, 393], [393, 326], [354, 370], [370, 461], [461, 354],\n [393, 164], [164, 267], [267, 393], [268, 302], [302, 12], [12, 268], [312, 268], [268, 13], [13, 312], [298, 293], [293, 301], [301, 298], [265, 446], [446, 340], [340, 265], [280, 330], [330, 425], [425, 280],\n [322, 426], [426, 391], [391, 322], [420, 429], [429, 437], [437, 420], [393, 391], [391, 326], [326, 393], [344, 440], [440, 438], [438, 344], [458, 459], [459, 461], [461, 458], [364, 434], [434, 394], [394, 364],\n [428, 396], [396, 262], [262, 428], [274, 354], [354, 457], [457, 274], [317, 316], [316, 402], [402, 317], [316, 315], [315, 403], [403, 316], [315, 314], [314, 404], [404, 315], [314, 313], [313, 405], [405, 314],\n [313, 421], [421, 406], [406, 313], [323, 366], [366, 361], [361, 323], [292, 306], [306, 407], [407, 292], [306, 291], [291, 408], [408, 306], [291, 287], [287, 409], [409, 291], [287, 432], [432, 410], [410, 287],\n [427, 434], [434, 411], [411, 427], [372, 264], [264, 383], [383, 372], [459, 309], [309, 457], [457, 459], [366, 352], [352, 401], [401, 366], [1, 274], [274, 4], [4, 1], [418, 421], [421, 262], [262, 418],\n [331, 294], [294, 358], [358, 331], [435, 433], [433, 367], [367, 435], [392, 289], [289, 439], [439, 392], [328, 462], [462, 326], [326, 328], [94, 2], [2, 370], [370, 94], [289, 305], [305, 455], [455, 289],\n [339, 254], [254, 448], [448, 339], [359, 255], [255, 446], [446, 359], [254, 253], [253, 449], [449, 254], [253, 252], [252, 450], [450, 253], [252, 256], [256, 451], [451, 252], [256, 341], [341, 452], [452, 256],\n [414, 413], [413, 463], [463, 414], [286, 441], [441, 414], [414, 286], [286, 258], [258, 441], [441, 286], [258, 257], [257, 442], [442, 258], [257, 259], [259, 443], [443, 257], [259, 260], [260, 444], [444, 259],\n [260, 467], [467, 445], [445, 260], [309, 459], [459, 250], [250, 309], [305, 289], [289, 290], [290, 305], [305, 290], [290, 460], [460, 305], [401, 376], [376, 435], [435, 401], [309, 250], [250, 392], [392, 309],\n [376, 411], [411, 433], [433, 376], [453, 341], [341, 464], [464, 453], [357, 453], [453, 465], [465, 357], [343, 357], [357, 412], [412, 343], [437, 343], [343, 399], [399, 437], [344, 360], [360, 440], [440, 344],\n [420, 437], [437, 456], [456, 420], [360, 420], [420, 363], [363, 360], [361, 401], [401, 288], [288, 361], [265, 372], [372, 353], [353, 265], [390, 339], [339, 249], [249, 390], [339, 448], [448, 255], [255, 339],\n];\n\nfunction connectionsToIndices(connections: PairArray) {\n const indices = connections.map((connection) => connection[0]);\n indices.push(connections[connections.length - 1][1]);\n return indices;\n}\n\nexport const MEDIAPIPE_FACE_MESH_KEYPOINTS_BY_CONTOUR = {\n lips: connectionsToIndices(LIPS_CONNECTIONS),\n leftEye: connectionsToIndices(LEFT_EYE_CONNECTIONS),\n leftEyebrow: connectionsToIndices(LEFT_EYEBROW_CONNECTIONS),\n leftIris: connectionsToIndices(LEFT_IRIS_CONNECTIONS),\n rightEye: connectionsToIndices(RIGHT_EYE_CONNECTIONS),\n rightEyebrow: connectionsToIndices(RIGHT_EYEBROW_CONNECTIONS),\n rightIris: connectionsToIndices(RIGHT_IRIS_CONNECTIONS),\n faceOval: connectionsToIndices(FACE_OVAL_CONNECTIONS),\n};\n\nconst indexLabelPairs: [number, string][] = Object.entries(MEDIAPIPE_FACE_MESH_KEYPOINTS_BY_CONTOUR)\n .map(([label, indices]) => indices.map((index) => [index, label] as [number, string]))\n .flat();\n\nexport const MEDIAPIPE_FACE_MESH_KEYPOINTS = new Map(indexLabelPairs);\n\ntype AssignAverage = number[];\nexport interface LandmarksRefinementConfig {\n indexesMapping: number[]; // Maps indexes of the given set of landmarks to indexes of the resulting set of landmarks. Should be non empty and contain the same amount of indexes as landmarks in the corresponding input\n zRefinement: 'none'|'copy'|AssignAverage; // Z refinement instructions.\n}\n\nexport const LANDMARKS_REFINEMENT_LIPS_CONFIG = [\n 61, 146, 91, 181, 84, 17, 314, 405, 321, 375, 291, // Lower outer.\n 185, 40, 39, 37, 0, 267, 269, 270, 409, // Upper outer(excluding corners).\n 78, 95, 88, 178, 87, 14, 317, 402, 318, 324, 308, // Lower inner.\n 191, 80, 81, 82, 13, 312, 311, 310, 415, // Upper inner(excluding corners).\n 76, 77, 90, 180, 85, 16, 315, 404, 320, 307, 306, // Lower semi - outer.\n 184, 74, 73, 72, 11, 302, 303, 304, 408, // Upper semi - outer(excluding corners).\n 62, 96, 89, 179, 86, 15, 316, 403, 319, 325, 292, // Lower semi - inner.\n 183, 42, 41, 38, 12, 268, 271, 272, 407, // Upper semi - inner(excluding corners).\n];\n\nexport const LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG = [\n 33, 7, 163, 144, 145, 153, 154, 155, 133, // Lower contour.\n 246, 161, 160, 159, 158, 157, 173, // upper contour (excluding corners).\n 130, 25, 110, 24, 23, 22, 26, 112, 243, // Halo x2 lower contour.\n 247, 30, 29, 27, 28, 56, 190, // Halo x2 upper contour (excluding corners).\n 226, 31, 228, 229, 230, 231, 232, 233, 244, // Halo x3 lower contour.\n 113, 225, 224, 223, 222, 221, 189, // Halo x3 upper contour (excluding corners).\n 35, 124, 46, 53, 52, 65, // Halo x4 upper contour (no lower because of mesh structure) or eyebrow inner contour.\n 143, 111, 117, 118, 119, 120, 121, 128, 245, // Halo x5 lower contour.\n 156, 70, 63, 105, 66, 107, 55, 193, // Halo x5 upper contour (excluding corners) or eyebrow outer contour.\n];\n\nexport const LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG = [\n 263, 249, 390, 373, 374, 380, 381, 382, 362, // Lower contour.\n 466, 388, 387, 386, 385, 384, 398, // Upper contour (excluding corners).\n 359, 255, 339, 254, 253, 252, 256, 341, 463, // Halo x2 lower contour.\n 467, 260, 259, 257, 258, 286, 414, // Halo x2 upper contour (excluding corners).\n 446, 261, 448, 449, 450, 451, 452, 453, 464, // Halo x3 lower contour.\n 342, 445, 444, 443, 442, 441, 413, // Halo x3 upper contour (excluding corners).\n 265, 353, 276, 283, 282, 295, // Halo x4 upper contour (no lower because of mesh structure) or/ eyebrow inner contour.\n 372, 340, 346, 347, 348, 349, 350, 357, 465, // Halo x5 lower contour.\n 383, 300, 293, 334, 296, 336, 285, 417, // Halo x5 upper contour (excluding corners) or eyebrow outer contour.\n];\n\nexport const LANDMARKS_REFINEMENT_LEFT_IRIS_CONFIG = [\n 468, // Center.\n 469, // Iris right edge.\n 470, // Iris top edge.\n 471, // Iris left edge.\n 472, // Iris bottom edge.\n];\n/*\nzRefinement: [\n 33, 7, 163, 144, 145, 153, 154, 155, 133, // Lower contour.\n 246, 161, 160, 159, 158, 157, 173, // Upper contour (excluding corners).\n];\n*/\n\nexport const LANDMARKS_REFINEMENT_RIGHT_IRIS_CONFIG = [\n 473, // Center.\n 474, // Iris right edge.\n 475, // Iris top edge.\n 476, // Iris left edge.\n 477, // Iris bottom edge.\n];\n/*\nzRefinement: [\n 263, 249, 390, 373, 374, 380, 381, 382, 362, // Lower contour.\n 466, 388, 387, 386, 385, 384, 398, // Upper contour (excluding corners).\n];\n*/\n", "import { TRI468 as triangulation } from '../face/facemeshcoords';\nimport { mergeDeep } from '../util/util';\nimport { getCanvasContext, rad2deg, rect, point, lines, arrow, labels, replace } from './primitives';\nimport { options } from './options';\nimport * as facemeshConstants from '../face/constants';\nimport type { FaceResult } from '../result';\nimport type { AnyCanvas, DrawOptions } from '../exports';\n\nlet localOptions: DrawOptions;\n\nfunction drawLabels(f: FaceResult, ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D) {\n if (!localOptions.drawLabels || (localOptions.faceLabels?.length === 0)) return;\n let l = localOptions.faceLabels.slice();\n if (f.score) l = replace(l, '[score]', 100 * f.score);\n if (f.gender) l = replace(l, '[gender]', f.gender);\n if (f.genderScore) l = replace(l, '[genderScore]', 100 * f.genderScore);\n if (f.age) l = replace(l, '[age]', f.age);\n if (f.distance) l = replace(l, '[distance]', 100 * f.distance);\n if (f.real) l = replace(l, '[real]', 100 * f.real);\n if (f.live) l = replace(l, '[live]', 100 * f.live);\n if (f.emotion && f.emotion.length > 0) {\n const emotion = f.emotion.map((a) => `${Math.trunc(100 * a.score)}% ${a.emotion}`);\n if (emotion.length > 3) emotion.length = 3;\n l = replace(l, '[emotions]', emotion.join(' '));\n }\n if (f.rotation?.angle?.roll) l = replace(l, '[roll]', rad2deg(f.rotation.angle.roll));\n if (f.rotation?.angle?.yaw) l = replace(l, '[yaw]', rad2deg(f.rotation.angle.yaw));\n if (f.rotation?.angle?.pitch) l = replace(l, '[pitch]', rad2deg(f.rotation.angle.pitch));\n if (f.rotation?.gaze?.bearing) l = replace(l, '[gaze]', rad2deg(f.rotation.gaze.bearing));\n labels(ctx, l, f.box[0], f.box[1], localOptions);\n}\n\nfunction drawIrisElipse(f: FaceResult, ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D) {\n // iris: array[center, left, top, right, bottom]\n if (f.annotations?.leftEyeIris && f.annotations?.leftEyeIris[0]) {\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?.rightEyeIris && f.annotations?.rightEyeIris[0]) {\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\nfunction drawGazeSpheres(f: FaceResult, ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D) {\n if (localOptions.drawGaze && f.rotation?.angle && typeof Path2D !== 'undefined') {\n ctx.strokeStyle = 'pink';\n const valX = (f.box[0] + f.box[2] / 2) - (f.box[3] * rad2deg(f.rotation.angle.yaw) / 90);\n const valY = (f.box[1] + f.box[3] / 2) + (f.box[2] * rad2deg(f.rotation.angle.pitch) / 90);\n const pathV = new Path2D(`\n M ${f.box[0] + f.box[2] / 2} ${f.box[1]}\n C\n ${valX} ${f.box[1]},\n ${valX} ${f.box[1] + f.box[3]},\n ${f.box[0] + f.box[2] / 2} ${f.box[1] + f.box[3]}\n `);\n const pathH = new Path2D(`\n M ${f.box[0]} ${f.box[1] + f.box[3] / 2}\n C \n ${f.box[0]} ${valY},\n ${f.box[0] + f.box[2]} ${valY},\n ${f.box[0] + f.box[2]} ${f.box[1] + f.box[3] / 2}\n `);\n ctx.stroke(pathH);\n ctx.stroke(pathV);\n }\n}\n\nfunction drawGazeArrows(f: FaceResult, ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D) {\n if (localOptions.drawGaze && f.rotation?.gaze.strength && f.rotation.gaze.bearing && f.annotations.leftEyeIris && f.annotations.rightEyeIris && f.annotations.leftEyeIris[0] && f.annotations.rightEyeIris[0]) {\n ctx.strokeStyle = 'pink';\n ctx.fillStyle = 'pink';\n const leftGaze = [\n f.annotations.leftEyeIris[0][0] + (Math.sin(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[3]),\n f.annotations.leftEyeIris[0][1] + (Math.cos(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[2]),\n ];\n arrow(ctx, [f.annotations.leftEyeIris[0][0], f.annotations.leftEyeIris[0][1]], [leftGaze[0], leftGaze[1]], 4);\n const rightGaze = [\n f.annotations.rightEyeIris[0][0] + (Math.sin(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[3]),\n f.annotations.rightEyeIris[0][1] + (Math.cos(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[2]),\n ];\n arrow(ctx, [f.annotations.rightEyeIris[0][0], f.annotations.rightEyeIris[0][1]], [rightGaze[0], rightGaze[1]], 4);\n }\n}\n\nfunction drawFacePolygons(f: FaceResult, ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D) {\n if (localOptions.drawPolygons && f.mesh.length >= 468) {\n ctx.lineWidth = 1;\n for (let i = 0; i < triangulation.length / 3; i++) {\n const points = [triangulation[i * 3 + 0], triangulation[i * 3 + 1], triangulation[i * 3 + 2]].map((index) => f.mesh[index]);\n lines(ctx, points, localOptions);\n }\n drawIrisElipse(f, ctx);\n }\n /*\n if (localOptions.drawPolygons && f.contours.length > 1) {\n ctx.lineWidth = 5;\n lines(ctx, f.contours, opt);\n }\n ctx.lineWidth = 1;\n */\n}\n\nfunction drawFacePoints(f: FaceResult, ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D) {\n if (localOptions.drawPoints && f.mesh.length >= 468) {\n for (let i = 0; i < f.mesh.length; i++) {\n point(ctx, f.mesh[i][0], f.mesh[i][1], f.mesh[i][2], localOptions);\n if (localOptions.drawAttention) {\n if (facemeshConstants.LANDMARKS_REFINEMENT_LIPS_CONFIG.includes(i)) point(ctx, f.mesh[i][0], f.mesh[i][1], (f.mesh[i][2] as number) + 127, localOptions);\n if (facemeshConstants.LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG.includes(i)) point(ctx, f.mesh[i][0], f.mesh[i][1], (f.mesh[i][2] as number) - 127, localOptions);\n if (facemeshConstants.LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG.includes(i)) point(ctx, f.mesh[i][0], f.mesh[i][1], (f.mesh[i][2] as number) - 127, localOptions);\n }\n }\n }\n}\n\nfunction drawFaceBoxes(f: FaceResult, ctx) {\n if (localOptions.drawBoxes) {\n rect(ctx, f.box[0], f.box[1], f.box[2], f.box[3], localOptions);\n }\n}\n\n/** draw detected faces */\nexport function face(inCanvas: AnyCanvas, result: FaceResult[], drawOptions?: Partial) {\n localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas) as CanvasRenderingContext2D;\n if (!ctx) return;\n ctx.font = localOptions.font;\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n for (const f of result) {\n drawFaceBoxes(f, ctx);\n drawLabels(f, ctx);\n if (f.mesh && f.mesh.length > 0) {\n drawFacePoints(f, ctx);\n drawFacePolygons(f, ctx);\n drawGazeSpheres(f, ctx);\n drawGazeArrows(f, ctx);\n }\n }\n}\n", "import { mergeDeep } from '../util/util';\nimport { getCanvasContext, rect, point, curves, colorDepth, replace, labels } from './primitives';\nimport { options } from './options';\nimport type { BodyResult } from '../result';\nimport type { AnyCanvas, DrawOptions } from '../exports';\n\n/** draw detected bodies */\nexport function body(inCanvas: AnyCanvas, result: BodyResult[], drawOptions?: Partial) {\n const localOptions: DrawOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas) as CanvasRenderingContext2D;\n if (!ctx) return;\n ctx.lineJoin = 'round';\n for (let i = 0; i < result.length; i++) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n ctx.lineWidth = localOptions.lineWidth;\n ctx.font = localOptions.font;\n if (localOptions.drawBoxes && result[i].box && result[i].box.length === 4) {\n rect(ctx, result[i].box[0], result[i].box[1], result[i].box[2], result[i].box[3], localOptions);\n if (localOptions.drawLabels && (localOptions.bodyLabels?.length > 0)) {\n let l = localOptions.bodyLabels.slice();\n l = replace(l, '[score]', 100 * result[i].score);\n labels(ctx, l, result[i].box[0], result[i].box[1], localOptions);\n }\n }\n if (localOptions.drawPoints && result[i].keypoints) {\n for (let pt = 0; pt < result[i].keypoints.length; pt++) {\n if (!result[i].keypoints[pt].score || (result[i].keypoints[pt].score === 0)) continue;\n ctx.fillStyle = colorDepth(result[i].keypoints[pt].position[2], localOptions);\n point(ctx, result[i].keypoints[pt].position[0], result[i].keypoints[pt].position[1], 0, localOptions);\n }\n }\n if (localOptions.drawLabels && (localOptions.bodyPartLabels?.length > 0) && result[i].keypoints) {\n ctx.font = localOptions.font;\n for (const pt of result[i].keypoints) {\n if (!pt.score || (pt.score === 0)) continue;\n let l = localOptions.bodyPartLabels.slice();\n l = replace(l, '[label]', pt.part);\n l = replace(l, '[score]', 100 * pt.score);\n labels(ctx, l, pt.position[0], pt.position[1], localOptions);\n }\n }\n if (localOptions.drawPolygons && result[i].keypoints && result[i].annotations) {\n for (const part of Object.values(result[i].annotations)) {\n for (const connected of part) curves(ctx, connected, localOptions);\n }\n }\n }\n}\n", "import { mergeDeep } from '../util/util';\nimport { getCanvasContext, rect, point, colorDepth, replace, labels } from './primitives';\nimport { options } from './options';\nimport type { HandResult } from '../result';\nimport type { AnyCanvas, DrawOptions, Point } from '../exports';\n\n/** draw detected hands */\nexport function hand(inCanvas: AnyCanvas, result: HandResult[], drawOptions?: Partial) {\n const localOptions: DrawOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas) as CanvasRenderingContext2D;\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 rect(ctx, h.box[0], h.box[1], h.box[2], h.box[3], localOptions);\n if (localOptions.drawLabels && (localOptions.handLabels?.length > 0)) {\n let l = localOptions.handLabels.slice();\n l = replace(l, '[label]', h.label);\n l = replace(l, '[score]', 100 * h.score);\n labels(ctx, l, h.box[0], h.box[1], localOptions);\n }\n ctx.stroke();\n }\n if (localOptions.drawPoints) {\n if (h.keypoints && h.keypoints.length > 0) {\n for (const pt of h.keypoints) {\n ctx.fillStyle = colorDepth(pt[2], localOptions);\n point(ctx, pt[0], pt[1], 0, localOptions);\n }\n }\n }\n if (localOptions.drawLabels && h.annotations && (localOptions.fingerLabels?.length > 0)) {\n for (const [part, pt] of Object.entries(h.annotations)) {\n let l = localOptions.fingerLabels.slice();\n l = replace(l, '[label]', part);\n labels(ctx, l, pt[pt.length - 1][0], pt[pt.length - 1][1], localOptions);\n }\n }\n if (localOptions.drawPolygons && h.annotations) {\n const addHandLine = (part: Point[]) => {\n if (!part || part.length === 0 || !part[0]) return;\n for (let i = 0; i < part.length; i++) {\n ctx.beginPath();\n const z = part[i][2] || 0;\n ctx.strokeStyle = colorDepth(i * z, localOptions);\n ctx.moveTo(part[i > 0 ? i - 1 : 0][0], part[i > 0 ? i - 1 : 0][1]);\n ctx.lineTo(part[i][0], part[i][1]);\n ctx.stroke();\n }\n };\n ctx.lineWidth = localOptions.lineWidth;\n addHandLine(h.annotations.index);\n addHandLine(h.annotations.middle);\n addHandLine(h.annotations.ring);\n addHandLine(h.annotations.pinky);\n addHandLine(h.annotations.thumb);\n // addPart(h.annotations.palm);\n }\n }\n}\n", "import { mergeDeep } from '../util/util';\nimport { getCanvasContext, rect, replace, labels } from './primitives';\nimport { options } from './options';\nimport type { ObjectResult } from '../result';\nimport type { AnyCanvas, DrawOptions } from '../exports';\n\n/** draw detected objects */\nexport function object(inCanvas: AnyCanvas, result: ObjectResult[], drawOptions?: Partial) {\n const localOptions: DrawOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas) as CanvasRenderingContext2D;\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 rect(ctx, h.box[0], h.box[1], h.box[2], h.box[3], localOptions);\n if (localOptions.drawLabels && (localOptions.objectLabels?.length > 0)) {\n let l = localOptions.objectLabels.slice();\n l = replace(l, '[label]', h.label);\n l = replace(l, '[score]', 100 * h.score);\n labels(ctx, l, h.box[0], h.box[1], localOptions);\n }\n ctx.stroke();\n }\n }\n}\n", "import { mergeDeep } from '../util/util';\nimport { getCanvasContext, replace, labels } from './primitives';\nimport { options } from './options';\nimport type { GestureResult } from '../result';\nimport type { AnyCanvas, DrawOptions } from '../exports';\n\n/** draw detected gestures */\nexport function gesture(inCanvas: AnyCanvas, result: GestureResult[], drawOptions?: Partial) {\n const localOptions: DrawOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (localOptions.drawGestures && (localOptions.gestureLabels?.length > 0)) {\n const ctx = getCanvasContext(inCanvas) as CanvasRenderingContext2D;\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 const [where, what] = Object.entries(result[j]);\n if ((what.length > 1) && ((what[1] as string).length > 0)) {\n const who = where[1] as number > 0 ? `#${where[1]}` : '';\n let l = localOptions.gestureLabels.slice();\n l = replace(l, '[where]', where[0]);\n l = replace(l, '[who]', who);\n l = replace(l, '[what]', what[1]);\n labels(ctx, l, 8, 2 + (i * localOptions.lineHeight), localOptions);\n i += 1;\n }\n }\n }\n}\n", "export const defaultLabels = {\n face: `face\n confidence: [score]%\n [gender] [genderScore]%\n age: [age] years\n distance: [distance]cm\n real: [real]%\n live: [live]%\n [emotions]\n roll: [roll]\u00B0 yaw:[yaw]\u00B0 pitch:[pitch]\u00B0\n gaze: [gaze]\u00B0`,\n body: 'body [score]%',\n bodyPart: '[label] [score]%',\n object: '[label] [score]%',\n hand: '[label] [score]%',\n finger: '[label]',\n gesture: '[where] [who]: [what]',\n};\n", "/* eslint-disable no-multi-spaces */\n\nexport const kpt: string[] = [\n 'nose', // 0\n 'leftEyeInside', // 1\n 'leftEye', // 2\n 'leftEyeOutside', // 3\n 'rightEyeInside', // 4\n 'rightEye', // 5\n 'rightEyeOutside', // 6\n 'leftEar', // 7\n 'rightEar', // 8\n 'leftMouth', // 9\n 'rightMouth', // 10\n 'leftShoulder', // 11\n 'rightShoulder', // 12\n 'leftElbow', // 13\n 'rightElbow', // 14\n 'leftWrist', // 15\n 'rightWrist', // 16\n 'leftPinky', // 17\n 'rightPinky', // 18\n 'leftIndex', // 19\n 'rightIndex', // 20\n 'leftThumb', // 21\n 'rightThumb', // 22\n 'leftHip', // 23\n 'rightHip', // 24\n 'leftKnee', // 25\n 'rightKnee', // 26\n 'leftAnkle', // 27\n 'rightAnkle', // 28\n 'leftHeel', // 29\n 'rightHeel', // 30\n 'leftFoot', // 31\n 'rightFoot', // 32\n 'bodyCenter', // 33\n 'bodyTop', // 34\n 'leftPalm', // 35 // z-coord not ok\n 'leftHand', // 36 // similar to wrist but z-coord not ok\n 'rightPalm', // 37 // z-coord not ok\n 'rightHand', // 38 // similar to wrist but z-coord not ok\n];\n\nexport const connected: Record = {\n shoulders: ['leftShoulder', 'rightShoulder'],\n hips: ['rightHip', 'leftHip'],\n mouth: ['leftMouth', 'rightMouth'],\n leftLegUpper: ['leftHip', 'leftKnee'],\n leftLegLower: ['leftKnee', 'leftAnkle'],\n leftFoot: ['leftAnkle', 'leftHeel', 'leftFoot'],\n leftTorso: ['leftShoulder', 'leftHip'],\n leftArmUpper: ['leftShoulder', 'leftElbow'],\n leftArmLower: ['leftElbow', 'leftWrist'],\n leftHand: ['leftWrist', 'leftPalm'],\n leftHandPinky: ['leftPalm', 'leftPinky'],\n leftHandIndex: ['leftPalm', 'leftIndex'],\n leftHandThumb: ['leftPalm', 'leftThumb'],\n leftEyeOutline: ['leftEyeInside', 'leftEyeOutside'],\n rightLegUpper: ['rightHip', 'rightKnee'],\n rightLegLower: ['rightKnee', 'rightAnkle'],\n rightFoot: ['rightAnkle', 'rightHeel', 'rightFoot'],\n rightTorso: ['rightShoulder', 'rightHip'],\n rightArmUpper: ['rightShoulder', 'rightElbow'],\n rightArmLower: ['rightElbow', 'rightWrist'],\n rightHand: ['rightWrist', 'rightPalm'],\n rightHandPinky: ['rightPalm', 'rightPinky'],\n rightHandIndex: ['rightPalm', 'rightIndex'],\n rightHandThumb: ['rightPalm', 'rightThumb'],\n rightEyeOutline: ['rightEyeInside', 'rightEyeOutside'],\n};\n", "import * as tf from 'dist/tfjs.esm.js';\nimport { log } from '../util/util';\nimport { env } from '../util/env';\nimport { loadModel } from '../tfjs/load';\nimport type { Box } from '../result';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor, Tensor1D, Tensor2D } from '../tfjs/types';\n\nexport interface DetectedBox { box: Box, boxRaw: Box, score: number }\n\nlet model: GraphModel | null;\nlet inputSize = 224;\nlet anchorTensor: { x, y };\nconst numLayers = 5;\nconst strides = [8, 16, 32, 32, 32];\n\nexport function createAnchors() {\n const anchors: { x: number, y: number }[] = [];\n let layerId = 0;\n while (layerId < numLayers) {\n let anchorCount = 0;\n let lastSameStrideLayer = layerId;\n while (lastSameStrideLayer < strides.length && strides[lastSameStrideLayer] === strides[layerId]) {\n anchorCount += 2;\n lastSameStrideLayer++;\n }\n const stride = strides[layerId];\n const featureMapHeight = Math.ceil(inputSize / stride);\n const featureMapWidth = Math.ceil(inputSize / stride);\n for (let y = 0; y < featureMapHeight; ++y) {\n for (let x = 0; x < featureMapWidth; ++x) {\n for (let anchorId = 0; anchorId < anchorCount; ++anchorId) {\n anchors.push({ x: (x + 0.5) / featureMapWidth, y: (y + 0.5) / featureMapHeight });\n }\n }\n }\n layerId = lastSameStrideLayer;\n }\n anchorTensor = { x: tf.tensor1d(anchors.map((a) => a.x)), y: tf.tensor1d(anchors.map((a) => a.y)) };\n}\n\nexport async function loadDetector(config: Config): Promise {\n if (env.initial) model = null;\n if (!model && config.body['detector'] && config.body['detector'].modelPath || '') {\n model = await loadModel(config.body['detector'].modelPath);\n const inputs = model?.['executor'] ? Object.values(model.modelSignature['inputs']) : undefined;\n inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;\n } else if (config.debug && model) log('cached model:', model['modelUrl']);\n createAnchors();\n return model as GraphModel;\n}\n\nconst cropFactor = [5.0, 5.0];\nexport function decodeBoxes(boxesTensor, anchor) {\n return tf.tidy(() => {\n const split = tf.split(boxesTensor, 12, 1); // first 4 are box data [x,y,w,h] and 4 are keypoints data [x,y] for total of 12\n let xCenter = tf.squeeze(split[0]);\n let yCenter = tf.squeeze(split[1]);\n let width = tf.squeeze(split[2]);\n let height = tf.squeeze(split[3]);\n xCenter = tf.add(tf.div(xCenter, inputSize), anchor.x);\n yCenter = tf.add(tf.div(yCenter, inputSize), anchor.y);\n width = tf.mul(tf.div(width, inputSize), cropFactor[0]);\n height = tf.mul(tf.div(height, inputSize), cropFactor[1]);\n const xMin = tf.sub(xCenter, tf.div(width, 2));\n const yMin = tf.sub(yCenter, tf.div(height, 2));\n const xMax = tf.add(xMin, width);\n const yMax = tf.add(yMin, height);\n const boxes = tf.stack([xMin, yMin, xMax, yMax], 1);\n return boxes;\n });\n}\n\nasync function decodeResults(boxesTensor: Tensor, logitsTensor: Tensor, config: Config, outputSize: [number, number]): Promise {\n const detectedBoxes: DetectedBox[] = [];\n const t: Record = {};\n t.boxes = decodeBoxes(boxesTensor, anchorTensor);\n t.scores = tf.sigmoid(logitsTensor);\n t.nms = await tf.image.nonMaxSuppressionAsync(t.boxes as Tensor2D, t.scores as Tensor1D, 1, config.body['detector']?.minConfidence || 0.1, config.body['detector']?.iouThreshold || 0.1);\n const nms = await t.nms.data();\n const scores = await t.scores.data();\n const boxes = await t.boxes.array();\n for (const i of Array.from(nms)) {\n const score = scores[i];\n const boxRaw: Box = boxes[i];\n const box: Box = [Math.round(boxRaw[0] * outputSize[0]), Math.round(boxRaw[1] * outputSize[1]), Math.round(boxRaw[2] * outputSize[0]), Math.round(boxRaw[3] * outputSize[1])];\n const detectedBox: DetectedBox = { score, boxRaw, box };\n detectedBoxes.push(detectedBox);\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return detectedBoxes;\n}\n\nexport async function detectBoxes(input: Tensor, config: Config, outputSize: [number, number]) {\n const t: Record = {};\n t.res = model?.execute(input, ['Identity']) as Tensor; //\n t.logitsRaw = tf.slice(t.res, [0, 0, 0], [1, -1, 1]);\n t.boxesRaw = tf.slice(t.res, [0, 0, 1], [1, -1, -1]);\n t.logits = tf.squeeze(t.logitsRaw);\n t.boxes = tf.squeeze(t.boxesRaw);\n const boxes = await decodeResults(t.boxes, t.logits, config, outputSize);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return boxes;\n}\n", "import type { Point, Box } from '../result';\n\nexport function calc(keypoints: Point[], outputSize: [number, number] = [1, 1]) {\n const coords = [keypoints.map((pt) => pt[0]), keypoints.map((pt) => pt[1])]; // all x/y coords\n const min = [Math.min(...coords[0]), Math.min(...coords[1])];\n const max = [Math.max(...coords[0]), Math.max(...coords[1])];\n const box: Box = [min[0], min[1], max[0] - min[0], max[1] - min[1]];\n const boxRaw: Box = [box[0] / outputSize[0], box[1] / outputSize[1], box[2] / outputSize[0], box[3] / outputSize[1]];\n return { box, boxRaw };\n}\n\nexport function square(keypoints: Point[], outputSize: [number, number] = [1, 1]) {\n const coords = [keypoints.map((pt) => pt[0]), keypoints.map((pt) => pt[1])]; // all x/y coords\n const min = [Math.min(...coords[0]), Math.min(...coords[1])];\n const max = [Math.max(...coords[0]), Math.max(...coords[1])];\n const center = [(min[0] + max[0]) / 2, (min[1] + max[1]) / 2]; // find center x and y coord of all fingers\n const dist = Math.max(center[0] - min[0], center[1] - min[1], -center[0] + max[0], -center[1] + max[1]); // largest distance from center in any direction\n const box: Box = [Math.trunc(center[0] - dist), Math.trunc(center[1] - dist), Math.trunc(2 * dist), Math.trunc(2 * dist)];\n const boxRaw: Box = [box[0] / outputSize[0], box[1] / outputSize[1], box[2] / outputSize[0], box[3] / outputSize[1]];\n return { box, boxRaw };\n}\n\nexport function scale(box: Box, scaleFact: number) {\n const dist = [box[2] * scaleFact, box[3] * scaleFact];\n const newBox: Box = [\n box[0] - (dist[0] - box[2]) / 2,\n box[1] - (dist[1] - box[3]) / 2,\n dist[0],\n dist[1],\n ];\n return newBox;\n}\n\nexport function crop(box: Box) { // [y1, x1, y2, x2] clamped to 0..1\n const yxBox: Box = [Math.max(0, box[1]), Math.max(0, box[0]), Math.min(1, box[3] + box[1]), Math.min(1, box[2] + box[0])];\n return yxBox;\n}\n", "/**\n * BlazePose model implementation\n */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { constants } from '../tfjs/constants';\nimport { log, now } from '../util/util';\nimport type { BodyKeypoint, BodyResult, BodyLandmark, Box, Point, BodyAnnotation } from '../result';\nimport type { GraphModel, Tensor, Tensor4D } from '../tfjs/types';\nimport type { Config } from '../config';\nimport * as coords from './blazeposecoords';\nimport { loadDetector, detectBoxes, DetectedBox } from './blazeposedetector';\nimport * as box from '../util/box';\nimport { env } from '../util/env';\n\n// const models: [GraphModel | null, GraphModel | null] = [null, null];\nlet model: GraphModel | null;\nlet inputSize = 256;\nlet skipped = Number.MAX_SAFE_INTEGER;\nconst outputNodes: { detector: string[], landmarks: string[] } = {\n landmarks: ['ld_3d', 'activation_segmentation', 'activation_heatmap', 'world_3d', 'output_poseflag'],\n detector: [],\n};\n\nconst cache: BodyResult[] = [];\nlet padding: [number, number][] = [[0, 0], [0, 0], [0, 0], [0, 0]];\nlet lastTime = 0;\n\nconst sigmoid = (x) => (1 - (1 / (1 + Math.exp(x))));\n\nexport const loadDetect = (config: Config): Promise => loadDetector(config);\n\nexport async function loadPose(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) {\n model = await loadModel(config.body.modelPath);\n const inputs = model?.['executor'] ? Object.values(model.modelSignature['inputs']) : undefined;\n inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;\n } else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nfunction prepareImage(input: Tensor4D, size: number, cropBox?: Box): Tensor {\n const t: Record = {};\n if (!input?.shape?.[1] || !input?.shape?.[2]) return input;\n let final: Tensor;\n if (cropBox) {\n t.cropped = tf.image.cropAndResize(input, [cropBox], [0], [input.shape[1], input.shape[2]]); // if we have cached box use it to crop input\n }\n if (input.shape[1] !== input.shape[2]) { // only pad if width different than height\n const height: [number, number] = [\n input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0,\n input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0,\n ];\n const width: [number, number] = [\n input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0,\n input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0,\n ];\n padding = [\n [0, 0], // dont touch batch\n height, // height before&after\n width, // width before&after\n [0, 0], // dont touch rbg\n ];\n t.pad = tf.pad(t.cropped || input, padding); // use cropped box if it exists\n t.resize = tf.image.resizeBilinear(t.pad as Tensor4D, [size, size]);\n final = tf.div(t.resize, constants.tf255);\n } else if (input.shape[1] !== size) { // if input needs resizing\n t.resize = tf.image.resizeBilinear(t.cropped as Tensor4D || input, [size, size]);\n final = tf.div(t.resize, constants.tf255);\n } else { // if input is already in a correct resolution just normalize it\n final = tf.div(t.cropped || input, constants.tf255);\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return final;\n}\n\nfunction rescaleKeypoints(keypoints: BodyKeypoint[], outputSize: [number, number], cropBox?: Box): BodyKeypoint[] {\n for (const kpt of keypoints) { // first rescale due to padding\n kpt.position = [\n Math.trunc(kpt.position[0] * (outputSize[0] + padding[2][0] + padding[2][1]) / outputSize[0] - padding[2][0]),\n Math.trunc(kpt.position[1] * (outputSize[1] + padding[1][0] + padding[1][1]) / outputSize[1] - padding[1][0]),\n kpt.position[2] as number,\n ];\n kpt.positionRaw = [kpt.position[0] / outputSize[0], kpt.position[1] / outputSize[1], 2 * (kpt.position[2] as number) / (outputSize[0] + outputSize[1])];\n }\n if (cropBox) { // second rescale due to cropping\n const width = cropBox[2] - cropBox[0];\n const height = cropBox[3] - cropBox[1];\n for (const kpt of keypoints) {\n kpt.positionRaw = [\n kpt.positionRaw[0] / height + cropBox[1], // correct offset due to crop\n kpt.positionRaw[1] / width + cropBox[0], // correct offset due to crop\n kpt.positionRaw[2] as number,\n ];\n kpt.position = [\n Math.trunc(kpt.positionRaw[0] * outputSize[0]),\n Math.trunc(kpt.positionRaw[1] * outputSize[1]),\n kpt.positionRaw[2] as number,\n ];\n }\n }\n return keypoints;\n}\n\nfunction fixKeypoints(keypoints: BodyKeypoint[]) {\n // palm z-coord is incorrect around near-zero so we approximate it\n const leftPalm = keypoints.find((k) => k.part === 'leftPalm') as BodyKeypoint;\n const leftWrist = keypoints.find((k) => k.part === 'leftWrist') as BodyKeypoint;\n const leftIndex = keypoints.find((k) => k.part === 'leftIndex') as BodyKeypoint;\n leftPalm.position[2] = ((leftWrist.position[2] || 0) + (leftIndex.position[2] || 0)) / 2;\n const rightPalm = keypoints.find((k) => k.part === 'rightPalm') as BodyKeypoint;\n const rightWrist = keypoints.find((k) => k.part === 'rightWrist') as BodyKeypoint;\n const rightIndex = keypoints.find((k) => k.part === 'rightIndex') as BodyKeypoint;\n rightPalm.position[2] = ((rightWrist.position[2] || 0) + (rightIndex.position[2] || 0)) / 2;\n}\n\nasync function detectLandmarks(input: Tensor, config: Config, outputSize: [number, number]): Promise {\n /**\n * t.ld: 39 keypoints [x,y,z,score,presence] normalized to input size\n * t.segmentation:\n * t.heatmap:\n * t.world: 39 keypoints [x,y,z] normalized to -1..1\n * t.poseflag: body score\n */\n if (!model?.['executor']) return null;\n const t: Record = {};\n [t.ld/* 1,195(39*5) */, t.segmentation/* 1,256,256,1 */, t.heatmap/* 1,64,64,39 */, t.world/* 1,117(39*3) */, t.poseflag/* 1,1 */] = model?.execute(input, outputNodes.landmarks) as Tensor[]; // run model\n const poseScore = (await t.poseflag.data())[0];\n const points = await t.ld.data();\n const distances = await t.world.data();\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor])); // dont need tensors after this\n const keypointsRelative: BodyKeypoint[] = [];\n const depth = 5; // each points has x,y,z,visibility,presence\n for (let i = 0; i < points.length / depth; i++) {\n const score = sigmoid(points[depth * i + 3]);\n const presence = sigmoid(points[depth * i + 4]);\n const adjScore = Math.trunc(100 * score * presence * poseScore) / 100;\n const positionRaw: Point = [points[depth * i + 0] / inputSize, points[depth * i + 1] / inputSize, points[depth * i + 2] + 0];\n const position: Point = [Math.trunc(outputSize[0] * positionRaw[0]), Math.trunc(outputSize[1] * positionRaw[1]), positionRaw[2] as number];\n const distance: Point = [distances[depth * i + 0], distances[depth * i + 1], distances[depth * i + 2] + 0];\n keypointsRelative.push({ part: coords.kpt[i] as BodyLandmark, positionRaw, position, distance, score: adjScore });\n }\n if (poseScore < (config.body.minConfidence || 0)) return null;\n fixKeypoints(keypointsRelative);\n const keypoints: BodyKeypoint[] = rescaleKeypoints(keypointsRelative, outputSize); // keypoints were relative to input image which is padded\n const kpts = keypoints.map((k) => k.position);\n const boxes = box.calc(kpts, [outputSize[0], outputSize[1]]); // now find boxes based on rescaled keypoints\n const annotations: Record = {} as Record;\n for (const [name, indexes] of Object.entries(coords.connected)) {\n const pt: Point[][] = [];\n for (let i = 0; i < indexes.length - 1; i++) {\n const pt0 = keypoints.find((kpt) => kpt.part === indexes[i]);\n const pt1 = keypoints.find((kpt) => kpt.part === indexes[i + 1]);\n if (pt0 && pt1) pt.push([pt0.position, pt1.position]);\n }\n annotations[name] = pt;\n }\n const body = { id: 0, score: Math.trunc(100 * poseScore) / 100, box: boxes.box, boxRaw: boxes.boxRaw, keypoints, annotations };\n return body;\n}\n\nexport async function predict(input: Tensor4D, config: Config): Promise {\n const outputSize: [number, number] = [input.shape[2] || 0, input.shape[1] || 0];\n const skipTime = (config.body.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.body.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && cache !== null) {\n skipped++;\n } else {\n let boxes: DetectedBox[] = [];\n if (config.body?.['detector']?.['enabled']) {\n const preparedImage = prepareImage(input, 224);\n boxes = await detectBoxes(preparedImage, config, outputSize);\n tf.dispose(preparedImage);\n } else {\n boxes = [{ box: [0, 0, 0, 0] as Box, boxRaw: [0, 0, 1, 1], score: 0 }]; // running without detector\n }\n for (let i = 0; i < boxes.length; i++) {\n const preparedBox = prepareImage(input, 256, boxes[i]?.boxRaw); // padded and resized\n cache.length = 0;\n const bodyResult = await detectLandmarks(preparedBox, config, outputSize);\n tf.dispose(preparedBox);\n if (!bodyResult) continue;\n bodyResult.id = i;\n // bodyResult.score = 0; // TBD\n cache.push(bodyResult);\n }\n /*\n cropBox = [0, 0, 1, 1]; // reset crop coordinates\n if (cache?.boxRaw && config.skipAllowed) {\n const cx = (2.0 * cache.boxRaw[0] + cache.boxRaw[2]) / 2;\n const cy = (2.0 * cache.boxRaw[1] + cache.boxRaw[3]) / 2;\n let size = cache.boxRaw[2] > cache.boxRaw[3] ? cache.boxRaw[2] : cache.boxRaw[3];\n size = (size * 1.0) / 2; // enlarge and half it\n if (cx > 0.1 && cx < 0.9 && cy > 0.1 && cy < 0.9 && size > 0.1) { // only update if box is sane\n const y = 0; // cy - size;\n const x = cx - size;\n cropBox = [y, x, y + 1, x + 1]; // [y0,x0,y1,x1] used for cropping but width/height are not yet implemented so we only reposition image to center of body\n }\n }\n */\n lastTime = now();\n skipped = 0;\n }\n return cache;\n}\n", "/**\n * CoCo Labels used by object detection implementations\n */\nexport const labels = [\n { class: 1, label: 'person' },\n { class: 2, label: 'bicycle' },\n { class: 3, label: 'car' },\n { class: 4, label: 'motorcycle' },\n { class: 5, label: 'airplane' },\n { class: 6, label: 'bus' },\n { class: 7, label: 'train' },\n { class: 8, label: 'truck' },\n { class: 9, label: 'boat' },\n { class: 10, label: 'traffic light' },\n { class: 11, label: 'fire hydrant' },\n { class: 12, label: 'stop sign' },\n { class: 13, label: 'parking meter' },\n { class: 14, label: 'bench' },\n { class: 15, label: 'bird' },\n { class: 16, label: 'cat' },\n { class: 17, label: 'dog' },\n { class: 18, label: 'horse' },\n { class: 19, label: 'sheep' },\n { class: 20, label: 'cow' },\n { class: 21, label: 'elephant' },\n { class: 22, label: 'bear' },\n { class: 23, label: 'zebra' },\n { class: 24, label: 'giraffe' },\n { class: 25, label: 'backpack' },\n { class: 26, label: 'umbrella' },\n { class: 27, label: 'handbag' },\n { class: 28, label: 'tie' },\n { class: 29, label: 'suitcase' },\n { class: 30, label: 'frisbee' },\n { class: 31, label: 'skis' },\n { class: 32, label: 'snowboard' },\n { class: 33, label: 'sports ball' },\n { class: 34, label: 'kite' },\n { class: 35, label: 'baseball bat' },\n { class: 36, label: 'baseball glove' },\n { class: 37, label: 'skateboard' },\n { class: 38, label: 'surfboard' },\n { class: 39, label: 'tennis racket' },\n { class: 40, label: 'bottle' },\n { class: 41, label: 'wine glass' },\n { class: 42, label: 'cup' },\n { class: 43, label: 'fork' },\n { class: 44, label: 'knife' },\n { class: 45, label: 'spoon' },\n { class: 46, label: 'bowl' },\n { class: 47, label: 'banana' },\n { class: 48, label: 'apple' },\n { class: 49, label: 'sandwich' },\n { class: 50, label: 'orange' },\n { class: 51, label: 'broccoli' },\n { class: 52, label: 'carrot' },\n { class: 53, label: 'hot dog' },\n { class: 54, label: 'pizza' },\n { class: 55, label: 'donut' },\n { class: 56, label: 'cake' },\n { class: 57, label: 'chair' },\n { class: 58, label: 'couch' },\n { class: 59, label: 'potted plant' },\n { class: 60, label: 'bed' },\n { class: 61, label: 'dining table' },\n { class: 62, label: 'toilet' },\n { class: 63, label: 'tv' },\n { class: 64, label: 'laptop' },\n { class: 65, label: 'mouse' },\n { class: 66, label: 'remote' },\n { class: 67, label: 'keyboard' },\n { class: 68, label: 'cell phone' },\n { class: 69, label: 'microwave' },\n { class: 70, label: 'oven' },\n { class: 71, label: 'toaster' },\n { class: 72, label: 'sink' },\n { class: 73, label: 'refrigerator' },\n { class: 74, label: 'book' },\n { class: 75, label: 'clock' },\n { class: 76, label: 'vase' },\n { class: 77, label: 'scissors' },\n { class: 78, label: 'teddy bear' },\n { class: 79, label: 'hair drier' },\n { class: 80, label: 'toothbrush' },\n];\n", "/**\n * CenterNet object detection model implementation\n *\n * Based on: [**MB3-CenterNet**](https://github.com/610265158/mobilenetv3_centernet)\n */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport { log, now } from '../util/util';\nimport { loadModel } from '../tfjs/load';\nimport { labels } from './labels';\nimport type { ObjectResult, ObjectType, Box } from '../result';\nimport type { GraphModel, Tensor, Tensor1D, Tensor2D, Tensor4D } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nlet inputSize = 0;\nlet last: ObjectResult[] = [];\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) {\n // fakeOps(['floormod'], config);\n model = await loadModel(config.object.modelPath);\n const inputs = model?.['executor'] ? Object.values(model.modelSignature['inputs']) : undefined;\n inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;\n } else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nasync function process(res: Tensor | null, outputShape: [number, number], config: Config) {\n if (!res) return [];\n const t: Record = {};\n const results: ObjectResult[] = [];\n const detections = await res.array() as number[][][];\n t.squeeze = tf.squeeze(res);\n const arr = tf.split(t.squeeze, 6, 1); // x1, y1, x2, y2, score, class\n t.stack = tf.stack([arr[1], arr[0], arr[3], arr[2]], 1); // reorder dims as tf.nms expects y, x\n t.boxes = tf.squeeze(t.stack);\n t.scores = tf.squeeze(arr[4]);\n t.classes = tf.squeeze(arr[5]);\n tf.dispose([res, ...arr]);\n t.nms = await tf.image.nonMaxSuppressionAsync(t.boxes as Tensor2D, t.scores as Tensor1D, config.object.maxDetected || 0, config.object.iouThreshold, (config.object.minConfidence || 0));\n const nms = await t.nms.data();\n let i = 0;\n for (const id of Array.from(nms)) {\n const score = Math.trunc(100 * detections[0][id][4]) / 100;\n const classVal = detections[0][id][5];\n if (Number.isNaN(classVal)) continue;\n const label = labels[classVal].label as ObjectType;\n const [x, y] = [\n detections[0][id][0] / inputSize,\n detections[0][id][1] / inputSize,\n ];\n const boxRaw: Box = [\n x,\n y,\n detections[0][id][2] / inputSize - x,\n detections[0][id][3] / inputSize - y,\n ];\n const box: 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({ id: i++, score, class: classVal, label, box, boxRaw });\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return results;\n}\n\nexport async function predict(input: Tensor4D, config: Config): Promise {\n if (!model?.['executor']) return [];\n const skipTime = (config.object.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.object.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && (last.length > 0)) {\n skipped++;\n return last;\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const outputSize = [input.shape[2] || 0, input.shape[1] || 0] as [number, number];\n const resize = tf.image.resizeBilinear(input, [inputSize, inputSize]);\n const objectT = config.object.enabled ? model?.execute(resize, ['tower_0/detections']) as Tensor : null;\n lastTime = now();\n tf.dispose(resize);\n\n const obj = await process(objectT, outputSize, config);\n last = obj;\n\n resolve(obj);\n });\n}\n", "export const kpt: string[] = [\n 'head',\n 'neck',\n 'rightShoulder',\n 'rightElbow',\n 'rightWrist',\n 'chest',\n 'leftShoulder',\n 'leftElbow',\n 'leftWrist',\n 'bodyCenter',\n 'rightHip',\n 'rightKnee',\n 'rightAnkle',\n 'leftHip',\n 'leftKnee',\n 'leftAnkle',\n];\n\nexport const connected: Record = {\n leftLeg: ['leftHip', 'leftKnee', 'leftAnkle'],\n rightLeg: ['rightHip', 'rightKnee', 'rightAnkle'],\n torso: ['leftShoulder', 'rightShoulder', 'rightHip', 'leftHip', 'leftShoulder'],\n leftArm: ['leftShoulder', 'leftElbow', 'leftWrist'],\n rightArm: ['rightShoulder', 'rightElbow', 'rightWrist'],\n head: [],\n};\n", "/**\n * EfficientPose model implementation\n *\n * Based on: [**EfficientPose**](https://github.com/daniegr/EfficientPose)\n */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport { log, now } from '../util/util';\nimport { loadModel } from '../tfjs/load';\nimport * as coords from './efficientposecoords';\nimport { constants } from '../tfjs/constants';\nimport type { BodyResult, Point, BodyLandmark, BodyAnnotation } from '../result';\nimport type { GraphModel, Tensor4D } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nlet lastTime = 0;\nconst cache: BodyResult = { id: 0, keypoints: [], box: [0, 0, 0, 0], boxRaw: [0, 0, 0, 0], score: 0, annotations: {} as Record };\n\n// const keypoints: Array = [];\n// let box: Box = [0, 0, 0, 0];\n// let boxRaw: Box = [0, 0, 0, 0];\n// let score = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.body.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\n// performs argmax and max functions on a 2d tensor\nasync function max2d(inputs, minScore): Promise<[number, number, number]> {\n const [width, height] = inputs.shape;\n const reshaped = tf.reshape(inputs, [height * width]); // combine all data\n const max = tf.max(reshaped, 0);\n const newScore: number = (await max.data())[0]; // get highest score\n if (newScore > minScore) { // skip coordinate calculation is score is too low\n const coordinates = tf.argMax(reshaped, 0);\n const mod = tf.mod(coordinates, width);\n const x = (await mod.data())[0];\n const div = tf.div(coordinates, width);\n const y: number = (await div.data())[0];\n tf.dispose([reshaped, max, coordinates, mod, div]);\n return [x, y, newScore];\n }\n tf.dispose([reshaped, max]);\n return [0, 0, newScore];\n}\n\nexport async function predict(image: Tensor4D, config: Config): Promise {\n if (!model?.['executor'] || !model?.inputs[0].shape) return [];\n const skipTime = (config.body.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.body.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && Object.keys(cache.keypoints).length > 0) {\n skipped++;\n return [cache];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const tensor = tf.tidy(() => {\n const resize = tf.image.resizeBilinear(image, [model?.inputs[0].shape?.[2] || 0, model?.inputs[0].shape?.[1] || 0], false);\n const enhance = tf.mul(resize, constants.tf2);\n const norm = tf.sub(enhance, constants.tf1);\n return norm;\n });\n let resT;\n if (config.body.enabled) resT = model?.execute(tensor);\n lastTime = now();\n tf.dispose(tensor);\n\n if (resT) {\n cache.keypoints.length = 0;\n const squeeze = tf.squeeze(resT);\n tf.dispose(resT);\n // body parts are basically just a stack of 2d tensors\n const stack = tf.unstack(squeeze, 2);\n tf.dispose(squeeze);\n\n // process each unstacked tensor as a separate body part\n for (let id = 0; id < stack.length; id++) {\n // actual processing to get coordinates and score\n const [x, y, partScore] = await max2d(stack[id], config.body.minConfidence);\n if (partScore > (config.body.minConfidence || 0)) {\n cache.keypoints.push({\n score: Math.round(100 * partScore) / 100,\n part: coords.kpt[id] as BodyLandmark,\n positionRaw: [ // normalized to 0..1\n // @ts-ignore model is not undefined here\n x / model.inputs[0].shape[2], y / model.inputs[0].shape[1],\n ],\n position: [ // normalized to input image size\n // @ts-ignore model is not undefined here\n Math.round(image.shape[2] * x / model.inputs[0].shape[2]), Math.round(image.shape[1] * y / model.inputs[0].shape[1]),\n ],\n });\n }\n }\n stack.forEach((s) => tf.dispose(s));\n }\n cache.score = cache.keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);\n const x = cache.keypoints.map((a) => a.position[0]);\n const y = cache.keypoints.map((a) => a.position[1]);\n cache.box = [\n Math.min(...x),\n Math.min(...y),\n Math.max(...x) - Math.min(...x),\n Math.max(...y) - Math.min(...y),\n ];\n const xRaw = cache.keypoints.map((a) => a.positionRaw[0]);\n const yRaw = cache.keypoints.map((a) => a.positionRaw[1]);\n cache.boxRaw = [\n Math.min(...xRaw),\n Math.min(...yRaw),\n Math.max(...xRaw) - Math.min(...xRaw),\n Math.max(...yRaw) - Math.min(...yRaw),\n ];\n for (const [name, indexes] of Object.entries(coords.connected)) {\n const pt: Point[][] = [];\n for (let i = 0; i < indexes.length - 1; i++) {\n const pt0 = cache.keypoints.find((kpt) => kpt.part === indexes[i]);\n const pt1 = cache.keypoints.find((kpt) => kpt.part === indexes[i + 1]);\n if (pt0 && pt1 && pt0.score > (config.body.minConfidence || 0) && pt1.score > (config.body.minConfidence || 0)) pt.push([pt0.position, pt1.position]);\n }\n cache.annotations[name] = pt;\n }\n resolve([cache]);\n });\n}\n", "/**\n * BlazeFace, FaceMesh & Iris model implementation\n * See `facemesh.ts` for entry point\n */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport * as coords from './facemeshcoords';\nimport { constants } from '../tfjs/constants';\nimport type { Box, Point } from '../result';\nimport { env } from '../util/env';\n\nexport const createBox = (startEndTensor) => ({ startPoint: tf.slice(startEndTensor, [0, 0], [-1, 2]), endPoint: tf.slice(startEndTensor, [0, 2], [-1, 2]) });\n\nexport const disposeBox = (t) => tf.dispose([t.startPoint, t.endPoint]);\n\nexport const getBoxSize = (box): [number, number] => [Math.abs(box.endPoint[0] - box.startPoint[0]), Math.abs(box.endPoint[1] - box.startPoint[1])];\n\nexport const getBoxCenter = (box): [number, number, number] => [box.startPoint[0] + (box.endPoint[0] - box.startPoint[0]) / 2, box.startPoint[1] + (box.endPoint[1] - box.startPoint[1]) / 2, 1];\n\nexport const clampBox = (box, input): Box => (box ? [\n Math.trunc(Math.max(0, box.startPoint[0])),\n Math.trunc(Math.max(0, box.startPoint[1])),\n Math.trunc(Math.min((input.shape[2] || 0), box.endPoint[0]) - Math.max(0, box.startPoint[0])),\n Math.trunc(Math.min((input.shape[1] || 0), box.endPoint[1]) - Math.max(0, box.startPoint[1])),\n] : [0, 0, 0, 0]);\n\nexport const getRawBox = (box, input): Box => (box ? [\n box.startPoint[0] / (input.shape[2] || 0),\n box.startPoint[1] / (input.shape[1] || 0),\n (box.endPoint[0] - box.startPoint[0]) / (input.shape[2] || 0),\n (box.endPoint[1] - box.startPoint[1]) / (input.shape[1] || 0),\n] : [0, 0, 0, 0]);\n\nexport const scaleBoxCoordinates = (box, factor) => {\n const startPoint: Point = [box.startPoint[0] * factor[0], box.startPoint[1] * factor[1]];\n const endPoint: Point = [box.endPoint[0] * factor[0], box.endPoint[1] * factor[1]];\n return { startPoint, endPoint, landmarks: box.landmarks, confidence: box.confidence };\n};\n\nexport const cutAndResize = (box, image, cropSize) => {\n const h = image.shape[1];\n const w = image.shape[2];\n const cutBox = [box.startPoint[1] / h, box.startPoint[0] / w, box.endPoint[1] / h, box.endPoint[0] / w];\n const crop = tf.image.cropAndResize(image, [cutBox], [0], cropSize);\n const norm = tf.div(crop, constants.tf255);\n tf.dispose(crop);\n return norm;\n};\n\nexport const enlargeBox = (box, factor) => {\n const center = getBoxCenter(box);\n const size = getBoxSize(box);\n const halfSize: [number, number] = [factor * size[0] / 2, factor * size[1] / 2];\n return { startPoint: [center[0] - halfSize[0], center[1] - halfSize[1]] as Point, endPoint: [center[0] + halfSize[0], center[1] + halfSize[1]] as Point, landmarks: box.landmarks, confidence: box.confidence };\n};\n\nexport const squarifyBox = (box) => {\n const centers = getBoxCenter(box);\n const size = getBoxSize(box);\n const halfSize = Math.max(...size) / 2;\n return { startPoint: [Math.round(centers[0] - halfSize), Math.round(centers[1] - halfSize)] as Point, endPoint: [Math.round(centers[0] + halfSize), Math.round(centers[1] + halfSize)] as Point, landmarks: box.landmarks, confidence: box.confidence };\n};\n\nexport const calculateLandmarksBoundingBox = (landmarks) => {\n const x = landmarks.map((d) => d[0]);\n const y = landmarks.map((d) => d[1]);\n return { startPoint: [Math.min(...x), Math.min(...y)] as Point, endPoint: [Math.max(...x), Math.max(...y)] as Point, landmarks };\n};\n\nexport const fixedRotationMatrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]];\n\nexport const normalizeRadians = (angle: number) => angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI));\n\nexport const computeRotation = (point1, point2) => normalizeRadians(Math.PI / 2 - Math.atan2(-(point2[1] - point1[1]), point2[0] - point1[0]));\n\nexport const radToDegrees = (rad) => rad * 180 / Math.PI;\n\nexport const buildTranslationMatrix = (x, y) => [[1, 0, x], [0, 1, y], [0, 0, 1]];\n\nexport const dot = (v1: number[], v2: number[]) => {\n let product = 0;\n for (let i = 0; i < v1.length; i++) product += v1[i] * v2[i];\n return product;\n};\n\nexport const getColumnFrom2DArr = (arr, columnIndex) => {\n const column: number[] = [];\n for (let i = 0; i < arr.length; i++) column.push(arr[i][columnIndex]);\n return column;\n};\n\nexport const multiplyTransformMatrices = (mat1, mat2) => {\n const product: number[][] = [];\n const size = mat1.length;\n for (let row = 0; row < size; row++) {\n product.push([]);\n for (let col = 0; col < size; col++) product[row].push(dot(mat1[row], getColumnFrom2DArr(mat2, col)));\n }\n return product;\n};\n\nexport const 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 const 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 = [-dot(rotationComponent[0], translationComponent), -dot(rotationComponent[1], translationComponent)];\n return [rotationComponent[0].concat(invertedTranslation[0]), rotationComponent[1].concat(invertedTranslation[1]), [0, 0, 1]];\n};\n\nexport const rotatePoint = (homogeneousCoordinate, rotationMatrix) => [dot(homogeneousCoordinate, rotationMatrix[0]), dot(homogeneousCoordinate, rotationMatrix[1])];\n\nexport const xyDistanceBetweenPoints = (a, b) => Math.sqrt(((a[0] - b[0]) ** 2) + ((a[1] - b[1]) ** 2));\n\nexport function generateAnchors(inputSize: number) {\n const spec = inputSize === 192\n ? { strides: [4], anchors: [1] } // facemesh-detector\n : { strides: [inputSize / 16, inputSize / 8], anchors: [2, 6] }; // blazeface\n const anchors: [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++) anchors.push([anchorX, anchorY]);\n }\n }\n }\n return anchors;\n}\n\nexport function transformRawCoords(coordsRaw, box, angle, rotationMatrix, inputSize) {\n const boxSize = getBoxSize(box);\n const coordsScaled = coordsRaw.map((coord) => ([ // scaled around zero-point\n (boxSize[0] / inputSize) * (coord[0] - (inputSize / 2)),\n (boxSize[1] / inputSize) * (coord[1] - (inputSize / 2)),\n (coord[2] || 0),\n ]));\n const largeAngle = angle && (angle !== 0) && (Math.abs(angle) > 0.2);\n const coordsRotationMatrix = largeAngle ? buildRotationMatrix(angle, [0, 0]) : fixedRotationMatrix;\n const coordsRotated = largeAngle ? coordsScaled.map((coord) => ([...rotatePoint(coord, coordsRotationMatrix), coord[2]])) : coordsScaled;\n const inverseRotationMatrix = largeAngle ? invertTransformMatrix(rotationMatrix) : fixedRotationMatrix;\n const boxCenter = getBoxCenter(box);\n const offsets = [dot(boxCenter, inverseRotationMatrix[0]), dot(boxCenter, inverseRotationMatrix[1])];\n return coordsRotated.map((coord) => ([\n Math.trunc(coord[0] + offsets[0]),\n Math.trunc(coord[1] + offsets[1]),\n Math.trunc(coord[2] || 0),\n ]));\n}\n\nexport function correctFaceRotation(rotate, box, input, inputSize) {\n const symmetryLine = (box.landmarks.length >= coords.meshLandmarks.count)\n ? coords.meshLandmarks.symmetryLine\n : coords.blazeFaceLandmarks.symmetryLine;\n let angle = 0; // default\n let rotationMatrix = fixedRotationMatrix; // default\n let face; // default\n\n if (rotate && env.kernels.includes('rotatewithoffset')) {\n angle = computeRotation(box.landmarks[symmetryLine[0]], box.landmarks[symmetryLine[1]]);\n const largeAngle = angle && (angle !== 0) && (Math.abs(angle) > 0.2);\n if (largeAngle) { // perform rotation only if angle is sufficiently high\n const center: Point = getBoxCenter(box);\n const centerRaw: Point = [center[0] / input.shape[2], center[1] / input.shape[1]];\n const rotated = tf.image.rotateWithOffset(input, angle, 0, [centerRaw[0], centerRaw[1]]);\n rotationMatrix = buildRotationMatrix(-angle, center);\n face = cutAndResize(box, rotated, [inputSize, inputSize]);\n tf.dispose(rotated);\n } else {\n face = cutAndResize(box, input, [inputSize, inputSize]);\n }\n } else {\n face = cutAndResize(box, input, [inputSize, inputSize]);\n }\n return [angle, rotationMatrix, face];\n}\n\nexport const findFaceCenter = (mesh) => {\n const x = mesh.map((m) => m[0]);\n const y = mesh.map((m) => m[1]);\n // weighted center\n /*\n const sum = (arr: number[]) => arr.reduce((prev, curr) => prev + curr, 0);\n return [sum(x) / mesh.length, sum(y) / mesh.length];\n */\n // absolute center\n return [Math.min(...x) + (Math.max(...x) - Math.min(...x)) / 2, Math.min(...y) + (Math.max(...y) - Math.min(...y)) / 2];\n};\n\nexport const calculateFaceBox = (mesh, previousBox) => {\n const center = findFaceCenter(mesh);\n const boxSize = getBoxSize(previousBox);\n const calculatedBox = {\n startPoint: [center[0] - boxSize[0] / 2, center[1] - boxSize[1] / 2] as Point,\n endPoint: [center[0] + boxSize[0] / 2, center[1] + boxSize[1] / 2] as Point,\n };\n return calculatedBox;\n};\n", "/**\n * BlazeFace, FaceMesh & Iris model implementation\n * See `facemesh.ts` for entry point\n */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport { log } from '../util/util';\nimport * as util from './facemeshutil';\nimport { loadModel } from '../tfjs/load';\nimport { constants } from '../tfjs/constants';\nimport type { Config } from '../config';\nimport type { Tensor, GraphModel, Tensor1D, Tensor2D, Tensor4D } from '../tfjs/types';\nimport { env } from '../util/env';\nimport type { Point } from '../result';\n\nconst keypointsCount = 6;\nconst faceBoxScaleFactor = 1.4;\nlet model: GraphModel | null;\nlet anchors: Tensor | null = null;\nlet inputSize = 0;\nlet inputSizeT: Tensor | null = null;\n\ninterface DetectBox { startPoint: Point, endPoint: Point, landmarks: Point[], confidence: number }\n\nexport const size = () => inputSize;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.detector?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n inputSize = (model['executor'] && model.inputs[0].shape) ? model.inputs[0].shape[2] : 256;\n inputSizeT = tf.scalar(inputSize, 'int32') as Tensor;\n anchors = tf.tensor2d(util.generateAnchors(inputSize)) as Tensor;\n return model;\n}\n\nfunction decodeBoxes(boxOutputs: Tensor) {\n if (!anchors || !inputSizeT) return tf.zeros([0, 0]);\n const t: Record = {};\n t.boxStarts = tf.slice(boxOutputs, [0, 1], [-1, 2]);\n t.centers = tf.add(t.boxStarts, anchors);\n t.boxSizes = tf.slice(boxOutputs, [0, 3], [-1, 2]);\n t.boxSizesNormalized = tf.div(t.boxSizes, inputSizeT);\n t.centersNormalized = tf.div(t.centers, inputSizeT);\n t.halfBoxSize = tf.div(t.boxSizesNormalized, constants.tf2);\n t.starts = tf.sub(t.centersNormalized, t.halfBoxSize);\n t.ends = tf.add(t.centersNormalized, t.halfBoxSize);\n t.startNormalized = tf.mul(t.starts, inputSizeT);\n t.endNormalized = tf.mul(t.ends, inputSizeT);\n const boxes = tf.concat2d([t.startNormalized as Tensor2D, t.endNormalized as Tensor2D], 1);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return boxes;\n}\n\nexport async function getBoxes(inputImage: Tensor4D, config: Config) {\n // sanity check on input\n if ((!inputImage) || (inputImage['isDisposedInternal']) || (inputImage.shape.length !== 4) || (inputImage.shape[1] < 1) || (inputImage.shape[2] < 1)) return [];\n const t: Record = {};\n t.resized = tf.image.resizeBilinear(inputImage, [inputSize, inputSize]);\n t.div = tf.div(t.resized, constants.tf127);\n t.normalized = tf.sub(t.div, constants.tf05);\n const res = model?.execute(t.normalized) as Tensor[];\n if (Array.isArray(res) && res.length > 2) { // pinto converted model?\n const sorted = res.sort((a, b) => a.size - b.size);\n t.concat384 = tf.concat([sorted[0], sorted[2]], 2); // dim: 384, 1 + 16\n t.concat512 = tf.concat([sorted[1], sorted[3]], 2); // dim: 512, 1 + 16\n t.concat = tf.concat([t.concat512, t.concat384], 1);\n t.batch = tf.squeeze(t.concat, [0]);\n } else if (Array.isArray(res)) { // new facemesh-detection tfhub model\n t.batch = tf.squeeze(res[0]);\n } else { // original blazeface tfhub model\n t.batch = tf.squeeze(res);\n }\n tf.dispose(res);\n t.boxes = decodeBoxes(t.batch);\n t.logits = tf.slice(t.batch, [0, 0], [-1, 1]);\n t.sigmoid = tf.sigmoid(t.logits);\n t.scores = tf.squeeze(t.sigmoid);\n t.nms = await tf.image.nonMaxSuppressionAsync(t.boxes as Tensor2D, t.scores as Tensor1D, (config.face.detector?.maxDetected || 0), (config.face.detector?.iouThreshold || 0), (config.face.detector?.minConfidence || 0));\n const nms = await t.nms.array() as number[];\n const boxes: DetectBox[] = [];\n const scores = await t.scores.data();\n for (let i = 0; i < nms.length; i++) {\n const confidence = scores[nms[i]];\n if (confidence > (config.face.detector?.minConfidence || 0)) {\n const b: Record = {};\n b.bbox = tf.slice(t.boxes, [nms[i], 0], [1, -1]);\n b.slice = tf.slice(t.batch, [nms[i], keypointsCount - 1], [1, -1]);\n b.squeeze = tf.squeeze(b.slice);\n b.landmarks = tf.reshape(b.squeeze, [keypointsCount, -1]);\n const points = await b.bbox.data();\n const rawBox = {\n startPoint: [points[0], points[1]] as Point,\n endPoint: [points[2], points[3]] as Point,\n landmarks: (await b.landmarks.array()) as Point[],\n confidence,\n };\n const scaledBox = util.scaleBoxCoordinates(rawBox, [(inputImage.shape[2] || 0) / inputSize, (inputImage.shape[1] || 0) / inputSize]);\n const enlargedBox = util.enlargeBox(scaledBox, config.face['scale'] || faceBoxScaleFactor);\n const squaredBox = util.squarifyBox(enlargedBox);\n boxes.push(squaredBox);\n Object.keys(b).forEach((tensor) => tf.dispose(b[tensor]));\n }\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return boxes;\n}\n", "import * as tf from 'dist/tfjs.esm.js';\nimport * as coords from './facemeshcoords';\nimport * as util from './facemeshutil';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport { env } from '../util/env';\nimport { log } from '../util/util';\nimport { loadModel } from '../tfjs/load';\nimport type { Config } from '../config';\nimport type { Point } from '../result';\n\nlet model: GraphModel | null;\nlet inputSize = 0;\n\nconst irisEnlarge = 2.3;\n\nconst leftOutline = coords.meshAnnotations.leftEyeLower0;\nconst rightOutline = coords.meshAnnotations.rightEyeLower0;\n\nconst eyeLandmarks = {\n leftBounds: [leftOutline[0], leftOutline[leftOutline.length - 1]],\n rightBounds: [rightOutline[0], rightOutline[rightOutline.length - 1]],\n};\n\nconst irisLandmarks = {\n upperCenter: 3,\n lowerCenter: 4,\n index: 71,\n numCoordinates: 76,\n};\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.iris?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n inputSize = (model?.['executor'] && model.inputs?.[0].shape) ? model.inputs[0].shape[2] : 0;\n if (inputSize === -1) inputSize = 64;\n return model;\n}\n\n// Replace the raw coordinates returned by facemesh with refined iris model coordinates and update the z coordinate to be an average of the original and the new.\nexport function replaceIrisCoords(rawCoords, newCoords, prefix, keys) {\n for (let i = 0; i < coords.irisIndices.length; i++) {\n const { key, indices } = coords.irisIndices[i];\n const originalIndices = coords.meshAnnotations[`${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],\n newCoords[index][1],\n (newCoords[index][2] + rawCoords[originalIndices[j]][2]) / 2,\n ];\n }\n }\n }\n}\n\nexport const 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.\nexport const getEyeBox = (rawCoords, face, eyeInnerCornerIndex, eyeOuterCornerIndex, meshSize, flip = false) => {\n const box = util.squarifyBox(util.enlargeBox(util.calculateLandmarksBoundingBox([rawCoords[eyeInnerCornerIndex], rawCoords[eyeOuterCornerIndex]]), irisEnlarge));\n const boxSize = util.getBoxSize(box);\n let crop = tf.image.cropAndResize(face, [[\n box.startPoint[1] / meshSize,\n box.startPoint[0] / meshSize, box.endPoint[1] / meshSize,\n box.endPoint[0] / meshSize,\n ]], [0], [inputSize, inputSize]);\n if (flip && env.kernels.includes('flipleftright')) {\n const flipped = tf.image.flipLeftRight(crop); // flipLeftRight is not defined for tfjs-node\n tf.dispose(crop);\n crop = flipped;\n }\n return { box, boxSize, crop };\n};\n\n// Given a cropped image of an eye, returns the coordinates of the contours surrounding the eye and the iris.\nexport const getEyeCoords = (eyeData, eyeBox, eyeBoxSize, flip = false) => {\n const eyeRawCoords: Point[] = [];\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 / inputSize)) : (x / inputSize)) * eyeBoxSize[0] + eyeBox.startPoint[0],\n (y / inputSize) * 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.\nexport const getAdjustedIrisCoords = (rawCoords, irisCoords, direction) => {\n const upperCenterZ = rawCoords[coords.meshAnnotations[`${direction}EyeUpper0`][irisLandmarks.upperCenter]][2];\n const lowerCenterZ = rawCoords[coords.meshAnnotations[`${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\nexport async function augmentIris(rawCoords, face, meshSize) {\n if (!model?.['executor']) return rawCoords;\n const { box: leftEyeBox, boxSize: leftEyeBoxSize, crop: leftEyeCrop } = getEyeBox(rawCoords, face, eyeLandmarks.leftBounds[0], eyeLandmarks.leftBounds[1], meshSize, true);\n const { box: rightEyeBox, boxSize: rightEyeBoxSize, crop: rightEyeCrop } = getEyeBox(rawCoords, face, eyeLandmarks.rightBounds[0], eyeLandmarks.rightBounds[1], meshSize, true);\n const combined = tf.concat([leftEyeCrop, rightEyeCrop]);\n tf.dispose(leftEyeCrop);\n tf.dispose(rightEyeCrop);\n const eyePredictions = model.execute(combined) as Tensor;\n tf.dispose(combined);\n const eyePredictionsData = await eyePredictions.data();\n tf.dispose(eyePredictions);\n const leftEyeData = eyePredictionsData.slice(0, irisLandmarks.numCoordinates * 3);\n const { rawCoords: leftEyeRawCoords, iris: leftIrisRawCoords } = getEyeCoords(leftEyeData, leftEyeBox, leftEyeBoxSize, true);\n const rightEyeData = eyePredictionsData.slice(irisLandmarks.numCoordinates * 3);\n const { rawCoords: rightEyeRawCoords, iris: rightIrisRawCoords } = getEyeCoords(rightEyeData, rightEyeBox, rightEyeBoxSize, false);\n const leftToRightEyeDepthDifference = getLeftToRightEyeDepthDifference(rawCoords);\n if (Math.abs(leftToRightEyeDepthDifference) < 30) { // User is looking straight ahead.\n replaceIrisCoords(rawCoords, leftEyeRawCoords, 'left', null);\n replaceIrisCoords(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 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 replaceIrisCoords(rawCoords, leftEyeRawCoords, 'left', ['EyeUpper0', 'EyeLower0']);\n } else { // User is looking towards the left.\n replaceIrisCoords(rawCoords, rightEyeRawCoords, 'right', ['EyeUpper0', 'EyeLower0']);\n }\n const adjustedLeftIrisCoords = getAdjustedIrisCoords(rawCoords, leftIrisRawCoords, 'left');\n const adjustedRightIrisCoords = getAdjustedIrisCoords(rawCoords, rightIrisRawCoords, 'right');\n const newCoords = rawCoords.concat(adjustedLeftIrisCoords).concat(adjustedRightIrisCoords);\n return newCoords;\n}\n", "import * as constants from './constants';\nimport type { Tensor } from '../tfjs/types';\n\nexport async function augment(rawCoords, results: Tensor[]) {\n const t: Record = { // all attention models produce 2d results so it needs to be later augmented with correct z-coords\n // mesh: results[0], // already have it in rawCoords // output_mesh_identity\n // flag: results[1], // already processed in parent // conv_faceflag\n lips: await results.filter((r) => r.size === 160)?.[0]?.data() as Float32Array, // 80 x 2d = 160 // output_lips\n irisL: await results.filter((r) => r.size === 10)?.[0]?.data() as Float32Array, // 5 x 2d = 10 // output_right_iris\n eyeL: await results.filter((r) => r.size === 142)?.[0]?.data() as Float32Array, // 71 x 2d = 142 // output_right_eye\n irisR: await results.filter((r) => r.size === 10)?.[1]?.data() as Float32Array, // 5 x 2d = 10 // output_left_iris\n eyeR: await results.filter((r) => r.size === 142)?.[1]?.data() as Float32Array, // 71 x 2d = 142// output_left_eye\n };\n for (const val of Object.values(t)) {\n if (!val) return rawCoords; // could not find tensor\n }\n\n // augment iris: adds additional 5 keypoints per eye\n const irisLDepth = constants.LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG.reduce((prev, curr) => prev += rawCoords[curr][2], 0) / constants.LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG.length; // get average z-coord for iris\n for (let i = 0; i < t.irisL.length / 2; i++) rawCoords.push([t.irisL[2 * i + 0], t.irisL[2 * i + 1], irisLDepth]);\n const irisRDepth = constants.LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG.reduce((prev, curr) => prev += rawCoords[curr][2], 0) / constants.LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG.length; // get average z-coord for iris\n for (let i = 0; i < t.irisR.length / 2; i++) rawCoords.push([t.irisR[2 * i + 0], t.irisR[2 * i + 1], irisRDepth]);\n\n // augment eyes: replaces eye keypoints based on heuristic mapping\n for (let i = 0; i < t.eyeL.length / 2; i++) rawCoords[constants.LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG[i]] = [t.eyeL[2 * i + 0], t.eyeL[2 * i + 1], rawCoords[constants.LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG[i]][2]];\n for (let i = 0; i < t.eyeR.length / 2; i++) rawCoords[constants.LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG[i]] = [t.eyeR[2 * i + 0], t.eyeR[2 * i + 1], rawCoords[constants.LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG[i]][2]];\n\n // augment lips: replaces eye keypoints based on heuristic mapping\n for (let i = 0; i < t.lips.length / 2; i++) rawCoords[constants.LANDMARKS_REFINEMENT_LIPS_CONFIG[i]] = [t.lips[2 * i + 0], t.lips[2 * i + 1], rawCoords[constants.LANDMARKS_REFINEMENT_LIPS_CONFIG[i]][2]];\n\n return rawCoords;\n}\n", "/**\n * BlazeFace, FaceMesh & Iris model implementation\n *\n * Based on:\n * - [**MediaPipe BlazeFace**](https://drive.google.com/file/d/1f39lSzU5Oq-j_OXgS67KfN5wNsoeAZ4V/view)\n * - Facial Spacial Geometry: [**MediaPipe FaceMesh**](https://drive.google.com/file/d/1VFC_wIpw4O7xBOiTgUldl79d9LA-LsnA/view)\n * - Eye Iris Details: [**MediaPipe Iris**](https://drive.google.com/file/d/1bsWbokp9AklH2ANjCfmjqEzzxO1CNbMu/view)\n */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport { log, now } from '../util/util';\nimport { loadModel } from '../tfjs/load';\nimport * as blazeface from './blazeface';\nimport * as util from './facemeshutil';\nimport * as coords from './facemeshcoords';\nimport * as iris from './iris';\nimport * as attention from './attention';\nimport { histogramEqualization } from '../image/enhance';\nimport { env } from '../util/env';\nimport type { GraphModel, Tensor, Tensor4D } from '../tfjs/types';\nimport type { FaceResult, FaceLandmark, Point } from '../result';\nimport type { Config } from '../config';\n\ninterface DetectBox { startPoint: Point, endPoint: Point, landmarks: Point[], confidence: number }\n\nconst cache = {\n boxes: [] as DetectBox[],\n skipped: Number.MAX_SAFE_INTEGER,\n timestamp: 0,\n};\n\nlet model: GraphModel | null = null;\nlet inputSize = 0;\n\nexport async function predict(input: Tensor4D, config: Config): Promise {\n if (!model?.['executor']) return [];\n // reset cached boxes\n const skipTime = (config.face.detector?.skipTime || 0) > (now() - cache.timestamp);\n const skipFrame = cache.skipped < (config.face.detector?.skipFrames || 0);\n if (!config.skipAllowed || !skipTime || !skipFrame || cache.boxes.length === 0) {\n cache.boxes = await blazeface.getBoxes(input, config); // get results from blazeface detector\n cache.timestamp = now();\n cache.skipped = 0;\n } else {\n cache.skipped++;\n }\n const faces: FaceResult[] = [];\n const newCache: DetectBox[] = [];\n let id = 0;\n const size = inputSize;\n for (let i = 0; i < cache.boxes.length; i++) {\n const box = cache.boxes[i];\n let angle = 0;\n let rotationMatrix;\n const face: FaceResult = { // init face result\n id: id++,\n mesh: [],\n meshRaw: [],\n box: [0, 0, 0, 0],\n boxRaw: [0, 0, 0, 0],\n score: 0,\n boxScore: 0,\n faceScore: 0,\n // contoursRaw: [],\n // contours: [],\n annotations: {} as Record,\n };\n\n // optional rotation correction based on detector data only if mesh is disabled otherwise perform it later when we have more accurate mesh data. if no rotation correction this function performs crop\n [angle, rotationMatrix, face.tensor] = util.correctFaceRotation(config.face.detector?.rotation, box, input, config.face.mesh?.enabled ? inputSize : blazeface.size());\n if (config.filter.equalization) {\n const equilized = face.tensor ? await histogramEqualization(face.tensor) : undefined;\n tf.dispose(face.tensor);\n if (equilized) face.tensor = equilized;\n }\n face.boxScore = Math.round(100 * box.confidence) / 100;\n if (!config.face.mesh?.enabled) { // mesh not enabled, return resuts from detector only\n face.box = util.clampBox(box, input);\n face.boxRaw = util.getRawBox(box, input);\n face.score = face.boxScore;\n face.mesh = box.landmarks.map((pt) => [\n ((box.startPoint[0] + box.endPoint[0])) / 2 + ((box.endPoint[0] + box.startPoint[0]) * pt[0] / blazeface.size()),\n ((box.startPoint[1] + box.endPoint[1])) / 2 + ((box.endPoint[1] + box.startPoint[1]) * pt[1] / blazeface.size()),\n ]);\n face.meshRaw = face.mesh.map((pt) => [pt[0] / (input.shape[2] || 0), pt[1] / (input.shape[1] || 0), (pt[2] || 0) / size]);\n for (const key of Object.keys(coords.blazeFaceLandmarks)) {\n face.annotations[key] = [face.mesh[coords.blazeFaceLandmarks[key] as number]]; // add annotations\n }\n } else if (!model) { // mesh enabled, but not loaded\n if (config.debug) log('face mesh detection requested, but model is not loaded');\n } else { // mesh enabled\n if (config.face.attention?.enabled && !env.kernels.includes('atan2')) {\n config.face.attention.enabled = false;\n tf.dispose(face.tensor);\n return faces;\n }\n const results = model.execute(face.tensor as Tensor) as Tensor[];\n const confidenceT = results.find((t) => t.shape[t.shape.length - 1] === 1) as Tensor;\n const faceConfidence = await confidenceT.data();\n face.faceScore = Math.round(100 * faceConfidence[0]) / 100;\n if (face.faceScore < (config.face.detector?.minConfidence || 1)) { // low confidence in detected mesh\n box.confidence = face.faceScore; // reset confidence of cached box\n if (config.face.mesh.keepInvalid) {\n face.box = util.clampBox(box, input);\n face.boxRaw = util.getRawBox(box, input);\n face.score = face.boxScore;\n face.mesh = box.landmarks.map((pt) => [\n ((box.startPoint[0] + box.endPoint[0])) / 2 + ((box.endPoint[0] + box.startPoint[0]) * pt[0] / blazeface.size()),\n ((box.startPoint[1] + box.endPoint[1])) / 2 + ((box.endPoint[1] + box.startPoint[1]) * pt[1] / blazeface.size()),\n ]);\n face.meshRaw = face.mesh.map((pt) => [pt[0] / (input.shape[2] || 1), pt[1] / (input.shape[1] || 1), (pt[2] || 0) / size]);\n for (const key of Object.keys(coords.blazeFaceLandmarks)) {\n face.annotations[key] = [face.mesh[coords.blazeFaceLandmarks[key] as number]]; // add annotations\n }\n }\n } else {\n const meshT = results.find((t) => t.shape[t.shape.length - 1] === 1404) as Tensor;\n const coordsReshaped = tf.reshape(meshT, [-1, 3]);\n let rawCoords = await coordsReshaped.array();\n tf.dispose(coordsReshaped);\n if (config.face.attention?.enabled) {\n rawCoords = await attention.augment(rawCoords, results); // augment iris results using attention model results\n } else if (config.face.iris?.enabled) {\n rawCoords = await iris.augmentIris(rawCoords, face.tensor, inputSize); // run iris model and augment results\n }\n face.mesh = util.transformRawCoords(rawCoords, box, angle, rotationMatrix, inputSize); // get processed mesh\n face.meshRaw = face.mesh.map((pt) => [pt[0] / (input.shape[2] || 0), pt[1] / (input.shape[1] || 0), (pt[2] || 0) / size]);\n for (const key of Object.keys(coords.meshAnnotations)) face.annotations[key] = coords.meshAnnotations[key].map((index) => face.mesh[index]); // add annotations\n face.score = face.faceScore;\n const calculatedBox = { ...util.calculateFaceBox(face.mesh, box), confidence: box.confidence, landmarks: box.landmarks };\n face.box = util.clampBox(calculatedBox, input);\n face.boxRaw = util.getRawBox(calculatedBox, input);\n /*\n const contoursT = results.find((t) => t.shape[t.shape.length - 1] === 266) as Tensor;\n const contoursData = contoursT && await contoursT.data(); // 133 x 2d points\n face.contoursRaw = [];\n for (let j = 0; j < contoursData.length / 2; j++) face.contoursRaw.push([contoursData[2 * j + 0] / inputSize, contoursData[2 * j + 1] / inputSize]);\n face.contours = face.contoursRaw.map((c) => [Math.trunc((input.shape[2] || 1) * c[0]), Math.trunc((input.shape[1] || 1) * c[1])]);\n */\n newCache.push(calculatedBox);\n }\n tf.dispose(results);\n }\n if (face.score > (config.face.detector?.minConfidence || 1)) faces.push(face);\n else tf.dispose(face.tensor);\n }\n cache.boxes = newCache; // reset cache\n return faces;\n}\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (config.face.attention?.enabled && model?.['signature']) {\n if (Object.keys(model?.['signature']?.outputs || {}).length < 6) model = null;\n }\n if (!model) {\n if (config.face.attention?.enabled) model = await loadModel(config.face.attention.modelPath);\n else model = await loadModel(config.face.mesh?.modelPath);\n } else if (config.debug) {\n log('cached model:', model['modelUrl']);\n }\n inputSize = (model['executor'] && model?.inputs?.[0].shape) ? model?.inputs?.[0].shape[2] : 256;\n return model;\n}\n\nexport const triangulation = coords.TRI468;\nexport const uvmap = coords.UV468;\n", "/**\n * Emotion model implementation\n *\n * [**Oarriaga**](https://github.com/oarriaga/face_classification)\n */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport type { Emotion } from '../result';\nimport { log, now } from '../util/util';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor, Tensor4D } from '../tfjs/types';\nimport { loadModel } from '../tfjs/load';\nimport { env } from '../util/env';\nimport { constants } from '../tfjs/constants';\n\nconst annotations = ['angry', 'disgust', 'fear', 'happy', 'sad', 'surprise', 'neutral'];\nlet model: GraphModel | null;\nconst last: { score: number, emotion: Emotion }[][] = [];\nlet lastCount = 0;\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.emotion?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(image: Tensor4D, config: Config, idx: number, count: number): Promise<{ score: number, emotion: Emotion }[]> {\n if (!model) return [];\n const skipFrame = skipped < (config.face.emotion?.skipFrames || 0);\n const skipTime = (config.face.emotion?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipTime && 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 obj: { score: number, emotion: Emotion }[] = [];\n if (config.face.emotion?.enabled) {\n const t: Record = {};\n const inputSize = model?.inputs[0].shape ? model.inputs[0].shape[2] : 0;\n t.resize = tf.image.resizeBilinear(image, [inputSize, inputSize], false);\n // const box = [[0.15, 0.15, 0.85, 0.85]]; // empyrical values for top, left, bottom, right\n // const resize = tf.image.cropAndResize(image, box, [0], [inputSize, inputSize]);\n // [t.red, t.green, t.blue] = tf.split(t.resize, 3, 3);\n // weighted rgb to grayscale: https://www.mathworks.com/help/matlab/ref/rgb2gray.html\n // t.redNorm = tf.mul(t.red, rgb[0]);\n // t.greenNorm = tf.mul(t.green, rgb[1]);\n // t.blueNorm = tf.mul(t.blue, rgb[2]);\n // t.grayscale = tf.addN([t.redNorm, t.greenNorm, t.blueNorm]);\n t.channels = tf.mul(t.resize, constants.rgb);\n t.grayscale = tf.sum(t.channels, 3, true);\n t.grayscaleSub = tf.sub(t.grayscale, constants.tf05);\n t.grayscaleMul = tf.mul(t.grayscaleSub, constants.tf2);\n t.emotion = model?.execute(t.grayscaleMul) as Tensor; // result is already in range 0..1, no need for additional activation\n lastTime = now();\n const data = await t.emotion.data();\n for (let i = 0; i < data.length; i++) {\n if (data[i] > (config.face.emotion.minConfidence || 0)) obj.push({ score: Math.min(0.99, Math.trunc(100 * data[i]) / 100), emotion: annotations[i] as Emotion });\n }\n obj.sort((a, b) => b.score - a.score);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n }\n last[idx] = obj;\n lastCount = count;\n resolve(obj);\n });\n}\n", "/**\n * FaceRes model implementation\n *\n * Returns Age, Gender, Descriptor\n * Implements Face similarity function\n *\n * Based on: [**HSE-FaceRes**](https://github.com/HSE-asavchenko/HSE_FaceRec_tf)\n */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport { log, now } from '../util/util';\nimport { env } from '../util/env';\nimport { loadModel } from '../tfjs/load';\nimport { constants } from '../tfjs/constants';\nimport type { Tensor, GraphModel, Tensor4D, Tensor1D } from '../tfjs/types';\nimport type { Config } from '../config';\nimport type { Gender, Race } from '../result';\n\nexport interface FaceRes { age: number, gender: Gender, genderScore: number, descriptor: number[], race?: { score: number, race: Race }[] }\n\nlet model: GraphModel | null;\nconst last: FaceRes[] = [];\n\nlet lastTime = 0;\nlet lastCount = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.description?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport function enhance(input): Tensor {\n const tensor = (input.image || input.tensor || input) as Tensor4D; // input received from detector is already normalized to 0..1, input is also assumed to be straightened\n if (!model?.inputs[0].shape) return tensor; // model has no shape so no point continuing\n const crop: Tensor = tf.image.resizeBilinear(tensor, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n const norm: Tensor = tf.mul(crop, constants.tf255);\n tf.dispose(crop);\n return norm;\n /*\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 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 // 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\nexport async function predict(image: Tensor4D, config: Config, idx: number, count: number): Promise {\n const obj: FaceRes = {\n age: 0 as number,\n gender: 'unknown' as Gender,\n genderScore: 0 as number,\n descriptor: [] as number[],\n };\n if (!model?.['executor']) return obj;\n const skipFrame = skipped < (config.face.description?.skipFrames || 0);\n const skipTime = (config.face.description?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipFrame && skipTime && (lastCount === count) && (last?.[idx]?.age > 0) && (last?.[idx]?.genderScore > 0)) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n if (config.face.description?.enabled) {\n const enhanced = enhance(image);\n const resT = model?.execute(enhanced) as Tensor[];\n lastTime = now();\n tf.dispose(enhanced);\n const genderT = resT.find((t) => t.shape[1] === 1) as Tensor;\n const gender = await genderT.data();\n const confidence = Math.trunc(200 * Math.abs((gender[0] - 0.5))) / 100;\n if (confidence > (config.face.description.minConfidence || 0)) {\n obj.gender = gender[0] <= 0.5 ? 'female' : 'male';\n obj.genderScore = Math.min(0.99, confidence);\n }\n const argmax = tf.argMax(resT.find((t) => t.shape[1] === 100) as Tensor1D, 1);\n const ageIdx: number = (await argmax.data())[0];\n tf.dispose(argmax);\n const ageT = resT.find((t) => t.shape[1] === 100) as Tensor;\n const all = await ageT.data();\n obj.age = Math.round(all[ageIdx - 1] > all[ageIdx + 1] ? 10 * ageIdx - 100 * all[ageIdx - 1] : 10 * ageIdx + 100 * all[ageIdx + 1]) / 10;\n\n if (Number.isNaN(gender[0]) || Number.isNaN(all[0])) log('faceres error:', { model, result: resT });\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 const descriptor = desc ? await desc.data() : [] as number[];\n obj.descriptor = Array.from(descriptor);\n resT.forEach((t) => tf.dispose(t));\n }\n last[idx] = obj;\n lastCount = count;\n resolve(obj);\n });\n}\n", "import type { Tensor } from '../tfjs/types';\nimport type { FaceResult } from '../result';\n// import * as tf from 'dist/tfjs.esm.js';\nimport { meshAnnotations } from './facemeshcoords';\n\nconst expandFact = 0.1;\nconst alpha = 0.5;\n\n// point inclusion in polygon based on https://wrf.ecse.rpi.edu/Research/Short_Notes/pnpoly.html\nfunction insidePoly(x: number, y: number, polygon: { x: number, y: number }[]): boolean {\n let inside = false;\n let j = polygon.length - 1;\n for (let i = 0; i < polygon.length; j = i++) {\n if (((polygon[i].y > y) !== (polygon[j].y > y)) && (x < (polygon[j].x - polygon[i].x) * (y - polygon[i].y) / (polygon[j].y - polygon[i].y) + polygon[i].x)) inside = !inside;\n }\n return inside;\n}\n\nexport async function mask(face: FaceResult): Promise {\n if (!face.tensor) return face.tensor;\n if (!face.mesh || face.mesh.length < 100) return face.tensor;\n const width = face.tensor.shape[2] || 0;\n const height = face.tensor.shape[1] || 0;\n const buffer = await face.tensor.buffer();\n let silhouette: { x: number, y: number }[] = [];\n for (const pt of meshAnnotations.silhouette) silhouette.push({ x: (face.mesh[pt][0] - face.box[0]) / face.box[2], y: (face.mesh[pt][1] - face.box[1]) / face.box[3] }); // add all silhouette points scaled to local box\n if (expandFact && expandFact > 0) silhouette = silhouette.map((pt) => ({ x: pt.x > 0.5 ? pt.x + expandFact : pt.x - expandFact, y: pt.y > 0.5 ? pt.y + expandFact : pt.y - expandFact })); // expand silhouette\n for (let x = 0; x < width; x++) {\n for (let y = 0; y < height; y++) {\n const inside = insidePoly(x / width, y / width, silhouette);\n if (!inside) {\n buffer.set(alpha * buffer.get(0, y, x, 0), 0, y, x, 0);\n buffer.set(alpha * buffer.get(0, y, x, 1), 0, y, x, 1);\n buffer.set(alpha * buffer.get(0, y, x, 2), 0, y, x, 2);\n }\n }\n }\n const output = buffer.toTensor();\n // tf.dispose(buffer);\n return output;\n}\n", "/**\n * Anti-spoofing model implementation\n */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport { log, now } from '../util/util';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor, Tensor4D } from '../tfjs/types';\nimport { loadModel } from '../tfjs/load';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nconst cached: number[] = [];\nlet skipped = Number.MAX_SAFE_INTEGER;\nlet lastCount = 0;\nlet lastTime = 0;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.antispoof?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(image: Tensor4D, config: Config, idx: number, count: number): Promise {\n if (!model?.['executor']) return 0;\n const skipTime = (config.face.antispoof?.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.face.antispoof?.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && cached[idx]) {\n skipped++;\n return cached[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const resize = tf.image.resizeBilinear(image, [model?.inputs[0].shape ? model.inputs[0].shape[2] : 0, model?.inputs[0].shape ? model.inputs[0].shape[1] : 0], false);\n const res = model?.execute(resize) as Tensor;\n const num = (await res.data())[0];\n cached[idx] = Math.round(100 * num) / 100;\n lastCount = count;\n lastTime = now();\n tf.dispose([resize, res]);\n resolve(cached[idx]);\n });\n}\n", "/**\n * Anti-spoofing model implementation\n */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport { log, now } from '../util/util';\nimport { loadModel } from '../tfjs/load';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor, Tensor4D } from '../tfjs/types';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nconst cached: number[] = [];\nlet skipped = Number.MAX_SAFE_INTEGER;\nlet lastCount = 0;\nlet lastTime = 0;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.liveness?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(image: Tensor4D, config: Config, idx: number, count: number): Promise {\n if (!model?.['executor']) return 0;\n const skipTime = (config.face.liveness?.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.face.liveness?.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && cached[idx]) {\n skipped++;\n return cached[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const resize = tf.image.resizeBilinear(image, [model?.inputs[0].shape ? model.inputs[0].shape[2] : 0, model?.inputs[0].shape ? model.inputs[0].shape[1] : 0], false);\n const res = model?.execute(resize) as Tensor;\n const num = (await res.data())[0];\n cached[idx] = Math.round(100 * num) / 100;\n lastCount = count;\n lastTime = now();\n tf.dispose([resize, res]);\n resolve(cached[idx]);\n });\n}\n", "/**\n * GEAR [gender/emotion/age/race] model implementation\n *\n * Based on: [**GEAR Predictor**](https://github.com/Udolf15/GEAR-Predictor)\n */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport { log, now } from '../util/util';\nimport { loadModel } from '../tfjs/load';\nimport type { Gender, Race } from '../result';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor, Tensor4D } from '../tfjs/types';\nimport { env } from '../util/env';\n\nexport interface GearType { age: number, gender: Gender, genderScore: number, race: { score: number, race: Race }[] }\nlet model: GraphModel | null;\nconst last: GearType[] = [];\nconst raceNames = ['white', 'black', 'asian', 'indian', 'other'];\nconst ageWeights = [15, 23, 28, 35.5, 45.5, 55.5, 65];\nlet lastCount = 0;\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config) {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.gear?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(image: Tensor4D, config: Config, idx: number, count: number): Promise {\n if (!model) return { age: 0, gender: 'unknown', genderScore: 0, race: [] };\n const skipFrame = skipped < (config.face.gear?.skipFrames || 0);\n const skipTime = (config.face.gear?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && last[idx]) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n if (!model?.inputs[0].shape) return;\n const t: Record = {};\n // t.resize = tf.image.resizeBilinear(image, [model?.inputs[0].shape[2], model?.inputs[0].shape[1]], false);\n const box = [[0.0, 0.10, 0.90, 0.90]]; // empyrical values for top, left, bottom, right\n t.resize = tf.image.cropAndResize(image, box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n const obj: GearType = { age: 0, gender: 'unknown', genderScore: 0, race: [] };\n if (config.face.gear?.enabled) [t.age, t.gender, t.race] = model.execute(t.resize, ['age_output', 'gender_output', 'race_output']) as Tensor[];\n const gender = await t.gender.data();\n obj.gender = gender[0] > gender[1] ? 'male' : 'female';\n obj.genderScore = Math.round(100 * (gender[0] > gender[1] ? gender[0] : gender[1])) / 100;\n const race = await t.race.data();\n for (let i = 0; i < race.length; i++) {\n if (race[i] > (config.face.gear?.minConfidence || 0.2)) obj.race.push({ score: Math.round(100 * race[i]) / 100, race: raceNames[i] as Race });\n }\n obj.race.sort((a, b) => b.score - a.score);\n // {0: 'Below20', 1: '21-25', 2: '26-30', 3: '31-40',4: '41-50', 5: '51-60', 6: 'Above60'}\n const ageDistribution = Array.from(await t.age.data());\n const ageSorted = ageDistribution.map((a, i) => [ageWeights[i], a]).sort((a, b) => b[1] - a[1]);\n let age = ageSorted[0][0]; // pick best starting point\n for (let i = 1; i < ageSorted.length; i++) age += ageSorted[i][1] * (ageSorted[i][0] - age); // adjust with each other choice by weight\n obj.age = Math.round(10 * age) / 10;\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n last[idx] = obj;\n lastCount = count;\n lastTime = now();\n resolve(obj);\n });\n}\n", "/**\n * Age model implementation\n *\n * Based on: [**SSR-Net**](https://github.com/shamangary/SSR-Net)\n */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport { log, now } from '../util/util';\nimport { loadModel } from '../tfjs/load';\nimport { env } from '../util/env';\nimport { constants } from '../tfjs/constants';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor, Tensor4D } from '../tfjs/types';\n\nlet model: GraphModel | null;\nconst last: { age: number }[] = [];\nlet lastCount = 0;\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config) {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face['ssrnet'].modelPathAge);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(image: Tensor4D, config: Config, idx: number, count: number): Promise<{ age: number }> {\n if (!model) return { age: 0 };\n const skipFrame = skipped < (config.face['ssrnet']?.skipFrames || 0);\n const skipTime = (config.face['ssrnet']?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipFrame && skipTime && (lastCount === count) && last[idx]?.age && (last[idx]?.age > 0)) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n if (!model?.inputs || !model.inputs[0] || !model.inputs[0].shape) return;\n const t: Record = {};\n t.resize = tf.image.resizeBilinear(image, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n t.enhance = tf.mul(t.resize, constants.tf255);\n const obj = { age: 0 };\n if (config.face['ssrnet']?.enabled) t.age = model.execute(t.enhance) as Tensor;\n if (t.age) {\n const data = await t.age.data();\n obj.age = Math.trunc(10 * data[0]) / 10;\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n last[idx] = obj;\n lastCount = count;\n lastTime = now();\n resolve(obj);\n });\n}\n", "/**\n * Gender model implementation\n *\n * Based on: [**SSR-Net**](https://github.com/shamangary/SSR-Net)\n */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport { log, now } from '../util/util';\nimport { loadModel } from '../tfjs/load';\nimport { constants } from '../tfjs/constants';\nimport type { Gender } from '../result';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor, Tensor4D } from '../tfjs/types';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nconst last: { gender: Gender, genderScore: number }[] = [];\nlet lastCount = 0;\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\n// tuning values\nconst rgb = [0.2989, 0.5870, 0.1140]; // factors for red/green/blue colors when converting to grayscale\n\nexport async function load(config: Config) {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face['ssrnet']?.modelPathGender);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(image: Tensor4D, config: Config, idx, count): Promise<{ gender: Gender, genderScore: number }> {\n if (!model) return { gender: 'unknown', genderScore: 0 };\n const skipFrame = skipped < (config.face['ssrnet']?.skipFrames || 0);\n const skipTime = (config.face['ssrnet']?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipFrame && skipTime && (lastCount === count) && last[idx]?.gender && (last[idx]?.genderScore > 0)) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n if (!model?.inputs[0].shape) return;\n const t: Record = {};\n t.resize = tf.image.resizeBilinear(image, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n t.enhance = tf.tidy(() => {\n const [red, green, blue] = tf.split(t.resize, 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 normalize = tf.mul(tf.sub(grayscale, constants.tf05), 2); // range grayscale:-1..1\n return normalize;\n });\n const obj: { gender: Gender, genderScore: number } = { gender: 'unknown', genderScore: 0 };\n if (config.face['ssrnet']?.enabled) t.gender = model.execute(t.enhance) as Tensor;\n const data = await t.gender.data();\n obj.gender = data[0] > data[1] ? 'female' : 'male'; // returns two values 0..1, bigger one is prediction\n obj.genderScore = data[0] > data[1] ? (Math.trunc(100 * data[0]) / 100) : (Math.trunc(100 * data[1]) / 100);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n last[idx] = obj;\n lastCount = count;\n lastTime = now();\n resolve(obj);\n });\n}\n", "/**\n * MobileFaceNet model implementation\n *\n * Based on: [**BecauseofAI MobileFace**](https://github.com/becauseofAI/MobileFace)\n *\n * Obsolete and replaced by `faceres` that performs age/gender/descriptor analysis\n */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport { log, now } from '../util/util';\nimport { loadModel } from '../tfjs/load';\nimport type { Tensor, Tensor4D, GraphModel } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nconst last: number[][] = [];\nlet lastCount = 0;\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face['mobilefacenet']?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\n/*\n// convert to black&white to avoid colorization impact\nconst 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\nconst [red, green, blue] = tf.split(crop, 3, 3);\nconst redNorm = tf.mul(red, rgb[0]);\nconst greenNorm = tf.mul(green, rgb[1]);\nconst blueNorm = tf.mul(blue, rgb[2]);\nconst grayscale = tf.addN([redNorm, greenNorm, blueNorm]);\nconst merge = tf.stack([grayscale, grayscale, grayscale], 3).squeeze(4);\n\n// optional increase image contrast\n// or do it per-channel so mean is done on each channel\n// or do it based on histogram\nconst mean = merge.mean();\nconst factor = 5;\nconst contrast = merge.sub(mean).mul(factor).add(mean);\n*/\n\nexport async function predict(input: Tensor4D, config: Config, idx, count): Promise {\n if (!model?.['executor']) return [];\n const skipFrame = skipped < (config.face['mobilefacenet']?.skipFrames || 0);\n const skipTime = (config.face['mobilefacenet']?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && last[idx]) {\n skipped++;\n return last[idx];\n }\n return new Promise(async (resolve) => {\n let data: number[] = [];\n if (config.face['mobilefacenet']?.enabled && model?.inputs[0].shape) {\n const t: Record = {};\n t.crop = tf.image.resizeBilinear(input, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false); // just resize to fit the embedding model\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 // t.crop = tf.image.cropAndResize(input, box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n t.data = model.execute(t.crop) as Tensor;\n /*\n // optional normalize outputs with l2 normalization\n const scaled = tf.tidy(() => {\n const l2 = res.norm('euclidean');\n const scale = res.div(l2);\n return scale;\n });\n\n // optional reduce feature vector complexity\n const reshape = tf.reshape(res, [128, 2]); // split 256 vectors into 128 x 2\n const reduce = reshape.logSumExp(1); // reduce 2nd dimension by calculating logSumExp on it\n */\n const output = await t.data.data();\n data = Array.from(output); // convert typed array to simple array\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n }\n last[idx] = data;\n lastCount = count;\n lastTime = now();\n resolve(data);\n });\n}\n", "/**\n * InsightFace model implementation\n *\n * Based on: [**DeepInsight InsightFace**](https://github.com/deepinsight/insightface)\n *\n * Alternative face embedding detection\n */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport { log, now } from '../util/util';\nimport { loadModel } from '../tfjs/load';\nimport type { Tensor, Tensor4D, GraphModel } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nconst last: number[][] = [];\nlet lastCount = 0;\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face['insightface'].modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(input: Tensor4D, config: Config, idx, count): Promise {\n if (!model?.['executor']) return [];\n const skipFrame = skipped < (config.face['insightface']?.skipFrames || 0);\n const skipTime = (config.face['insightface']?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && last[idx]) {\n skipped++;\n return last[idx];\n }\n return new Promise(async (resolve) => {\n let data: number[] = [];\n if (config.face['insightface']?.enabled && model?.inputs[0].shape) {\n const t: Record = {};\n t.crop = tf.image.resizeBilinear(input, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false); // just resize to fit the embedding model\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 // t.crop = tf.image.cropAndResize(input, box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n t.data = model.execute(t.crop) as Tensor;\n const output = await t.data.data();\n data = Array.from(output); // convert typed array to simple array\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n }\n last[idx] = data;\n lastCount = count;\n lastTime = now();\n resolve(data);\n });\n}\n", "import type { Point, FaceResult } from '../result';\n\ntype Vector = [number, number, number];\n\nconst calculateGaze = (face: FaceResult): { bearing: number, strength: number } => {\n const radians = (pt1: Point, pt2: Point) => Math.atan2(pt1[1] - pt2[1], pt1[0] - pt2[0]); // function to calculate angle between any two points\n if (!face.annotations.rightEyeIris || !face.annotations.leftEyeIris) return { bearing: 0, strength: 0 };\n\n const offsetIris = [0, -0.1]; // iris center may not align with average of eye extremes\n const eyeRatio = 1; // factor to normalize changes x vs y\n\n const left = (face.mesh[33][2] || 0) > (face.mesh[263][2] || 0); // pick left or right eye depending which one is closer bazed on outsize point z axis\n const irisCenter = left ? face.mesh[473] : face.mesh[468];\n const eyeCenter = left // eye center is average of extreme points on x axis for both x and y, ignoring y extreme points as eyelids naturally open/close more when gazing up/down so relative point is less precise\n ? [(face.mesh[133][0] + face.mesh[33][0]) / 2, (face.mesh[133][1] + face.mesh[33][1]) / 2]\n : [(face.mesh[263][0] + face.mesh[362][0]) / 2, (face.mesh[263][1] + face.mesh[362][1]) / 2];\n const eyeSize = left // eye size is difference between extreme points for both x and y, used to normalize & squarify eye dimensions\n ? [face.mesh[133][0] - face.mesh[33][0], face.mesh[23][1] - face.mesh[27][1]]\n : [face.mesh[263][0] - face.mesh[362][0], face.mesh[253][1] - face.mesh[257][1]];\n const eyeDiff: Point = [ // x distance between extreme point and center point normalized with eye size\n (eyeCenter[0] - irisCenter[0]) / eyeSize[0] - offsetIris[0],\n eyeRatio * (irisCenter[1] - eyeCenter[1]) / eyeSize[1] - offsetIris[1],\n ];\n let strength = Math.sqrt((eyeDiff[0] * eyeDiff[0]) + (eyeDiff[1] * eyeDiff[1])); // vector length is a diagonal between two differences\n strength = Math.min(strength, face.boxRaw[2] / 2, face.boxRaw[3] / 2); // limit strength to half of box size to avoid clipping due to low precision\n const bearing = (radians([0, 0], eyeDiff) + (Math.PI / 2)) % Math.PI; // using eyeDiff instead eyeCenter/irisCenter combo due to manual adjustments and rotate clockwise 90degrees\n return { bearing, strength };\n};\n\nexport const calculateFaceAngle = (face: FaceResult, imageSize: [number, number]): {\n angle: { pitch: number, yaw: number, roll: number },\n matrix: [number, number, number, number, number, number, number, number, number],\n gaze: { bearing: number, strength: number },\n} => {\n // const degrees = (theta) => Math.abs(((theta * 180) / Math.PI) % 360);\n const normalize = (v: Vector): Vector => { // 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: Vector, b: Vector): Vector => { // 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: Vector, b: Vector): Vector => { // 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: number[]): { pitch: number, yaw: number, roll: number } => {\n const [r00, _r01, _r02, r10, r11, r12, r20, r21, r22] = r; // eslint-disable-line @typescript-eslint/no-unused-vars\n let thetaX: number;\n let thetaY: number;\n let thetaZ: number;\n if (r10 < 1) { // YZX calculation\n if (r10 > -1) {\n thetaZ = Math.asin(r10);\n thetaY = Math.atan2(-r20, r00);\n thetaX = Math.atan2(-r12, r11);\n } else {\n thetaZ = -Math.PI / 2;\n thetaY = -Math.atan2(r21, r22);\n thetaX = 0;\n }\n } else {\n thetaZ = Math.PI / 2;\n thetaY = Math.atan2(r21, r22);\n thetaX = 0;\n }\n if (Number.isNaN(thetaX)) thetaX = 0;\n if (Number.isNaN(thetaY)) thetaY = 0;\n if (Number.isNaN(thetaZ)) thetaZ = 0;\n return { pitch: 2 * -thetaX, yaw: 2 * -thetaY, roll: 2 * -thetaZ };\n };\n\n /*\n const meshToEulerAngle = (mesh) => { // simple Euler angle calculation based existing 3D mesh\n const radians = (a1, a2, b1, b2) => Math.atan2(b2 - a2, b1 - a1);\n return { // 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: 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 // pitch is face move up/down\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 // yaw is face turn 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 // roll is face lean left/right\n };\n };\n */\n\n // initialize gaze and mesh\n const mesh = face.meshRaw;\n if (!mesh || mesh.length < 300) return { angle: { pitch: 0, yaw: 0, roll: 0 }, matrix: [1, 0, 0, 0, 1, 0, 0, 0, 1], gaze: { bearing: 0, strength: 0 } };\n\n const size = Math.max(face.boxRaw[2] * imageSize[0], face.boxRaw[3] * imageSize[1]) / 1.5;\n // top, bottom, left, right\n const pts: Point[] = [mesh[10], mesh[152], mesh[234], mesh[454]].map((pt) => [pt[0] * imageSize[0] / size, pt[1] * imageSize[1] / size, pt[2]] as Point); // make the xyz coordinates proportional, independent of the image/box size\n\n const yAxis = normalize(subVectors(pts[1] as Vector, pts[0] as Vector));\n let xAxis = normalize(subVectors(pts[3] as Vector, pts[2] as Vector));\n const zAxis = normalize(crossVectors(xAxis, yAxis));\n // adjust xAxis to make sure that all axes are perpendicular to each other\n xAxis = crossVectors(yAxis, zAxis);\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 xAxis[0], xAxis[1], xAxis[2],\n yAxis[0], yAxis[1], yAxis[2],\n zAxis[0], zAxis[1], zAxis[2],\n ];\n const angle = rotationMatrixToEulerAngle(matrix);\n // const angle = meshToEulerAngle(mesh);\n\n // we have iris keypoints so we can calculate gaze direction\n const gaze = mesh.length === 478 ? calculateGaze(face) : { bearing: 0, strength: 0 };\n\n return { angle, matrix, gaze };\n};\n", "import type { FaceResult } from '../result';\n\nexport function calculateCameraDistance(face: FaceResult, width: number): number {\n // iris points are [center, left, top, right, bottom]\n // average size of human iris is 11.7mm - fairly constant for all ages/genders/races\n const f = face?.annotations;\n if (!f) return 0;\n // get size of left and right iris in pixels, pick larger one as its likely to be more accurate and normalize to 0..1 range instead of pixels\n const irisSize = Math.max(Math.abs(f.leftEyeIris[3][0] - f.leftEyeIris[1][0]), Math.abs(f.rightEyeIris[3][0] - f.rightEyeIris[1][0])) / width;\n // distance of eye from camera in meters\n const cameraDistance = Math.round(1.17 / irisSize) / 100;\n return cameraDistance;\n}\n\nexport function calculateEyesDistance(face: FaceResult, width: number): number {\n // average distance between eyes is 65mm - fairly constant for typical adult male, but varies otherwise\n const f = face?.annotations;\n if (!f) return 0;\n // get size of left and right iris in pixels, pick larger one as its likely to be more accurate and normalize to 0..1 range instead of pixels\n const irisSize = Math.max(Math.abs(f.leftEyeIris[3][0] - f.leftEyeIris[1][0]), Math.abs(f.rightEyeIris[3][0] - f.rightEyeIris[1][0])) / width;\n // pixel x and y distance of centers of left and right iris, you can use edges instead\n const irisDistanceXY = [f.leftEyeIris[0][0] - f.rightEyeIris[0][0], f.leftEyeIris[0][1] - f.rightEyeIris[0][1]];\n // absolute distance bewtween eyes in 0..1 range to account for head pitch (we can ignore yaw)\n const irisDistance = Math.sqrt((irisDistanceXY[0] * irisDistanceXY[0]) + (irisDistanceXY[1] * irisDistanceXY[1])) / width;\n // distance between eyes in meters\n const eyesDistance = Math.round(1.17 * irisDistance / irisSize) / 100;\n return eyesDistance;\n}\n", "/**\n * Face algorithm implementation\n * Uses FaceMesh, Emotion and FaceRes models to create a unified pipeline\n */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport { log, now } from '../util/util';\nimport { env } from '../util/env';\nimport * as facemesh from './facemesh';\nimport * as emotion from '../gear/emotion';\nimport * as faceres from './faceres';\nimport * as mask from './mask';\nimport * as antispoof from './antispoof';\nimport * as liveness from './liveness';\nimport * as gear from '../gear/gear';\nimport * as ssrnetAge from '../gear/ssrnet-age';\nimport * as ssrnetGender from '../gear/ssrnet-gender';\nimport * as mobilefacenet from './mobilefacenet';\nimport * as insightface from './insightface';\nimport type { FaceResult, Emotion, Gender, Race } from '../result';\nimport type { Tensor4D } from '../tfjs/types';\nimport type { Human } from '../human';\nimport { calculateFaceAngle } from './angles';\nimport { calculateCameraDistance } from './anthropometry';\n\ninterface DescRes { age: number, gender: Gender, genderScore: number, descriptor: number[], race?: { score: number, race: Race }[] }\n\nexport const detectFace = async (instance: Human /* instance of human */, input: Tensor4D): Promise => {\n // run facemesh, includes blazeface and iris\n let timeStamp: number = now();\n let ageRes: { age: number } | Promise<{ age: number }> | null;\n let gearRes: gear.GearType | Promise | null;\n let genderRes: { gender: string, genderScore: number } | Promise<{ gender: string, genderScore: number }> | null;\n let emotionRes: { score: number, emotion: Emotion }[] | Promise<{ score: number, emotion: Emotion }[]>;\n let mobilefacenetRes: number[] | Promise | null;\n let insightfaceRes: number[] | Promise | null;\n let antispoofRes: number | Promise | null;\n let livenessRes: number | Promise | null;\n let descRes: DescRes | Promise | null;\n\n const faceRes: FaceResult[] = [];\n instance.state = 'run:face';\n\n const faces: FaceResult[] = await facemesh.predict(input, instance.config);\n instance.performance.face = env.perfadd ? (instance.performance.face || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n if (!input.shape || input.shape.length !== 4) return [];\n if (!faces) return [];\n // for (const face of faces) {\n for (let i = 0; i < faces.length; i++) {\n instance.analyze('Get Face');\n\n // is something went wrong, skip the face\n // @ts-ignore possibly undefied\n if (!faces[i].tensor || faces[i].tensor.isDisposedInternal) {\n log('Face object is disposed:', faces[i].tensor);\n continue;\n }\n\n // optional face mask\n if (instance.config.face.detector?.mask) {\n const masked = await mask.mask(faces[i]);\n tf.dispose(faces[i].tensor);\n if (masked) faces[i].tensor = masked;\n }\n\n // calculate face angles\n const rotation = faces[i].mesh && (faces[i].mesh.length > 200) ? calculateFaceAngle(faces[i], [input.shape[2], input.shape[1]]) : null;\n\n // run emotion, inherits face from blazeface\n instance.analyze('Start Emotion:');\n if (instance.config.async) {\n emotionRes = instance.config.face.emotion?.enabled ? emotion.predict(faces[i].tensor as Tensor4D || tf.tensor([]), instance.config, i, faces.length) : [];\n } else {\n instance.state = 'run:emotion';\n timeStamp = now();\n emotionRes = instance.config.face.emotion?.enabled ? await emotion.predict(faces[i].tensor as Tensor4D || tf.tensor([]), instance.config, i, faces.length) : [];\n instance.performance.emotion = env.perfadd ? (instance.performance.emotion || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n instance.analyze('End Emotion:');\n\n // run antispoof, inherits face from blazeface\n instance.analyze('Start AntiSpoof:');\n if (instance.config.async) {\n antispoofRes = instance.config.face.antispoof?.enabled ? antispoof.predict(faces[i].tensor as Tensor4D || tf.tensor([]), instance.config, i, faces.length) : 0;\n } else {\n instance.state = 'run:antispoof';\n timeStamp = now();\n antispoofRes = instance.config.face.antispoof?.enabled ? await antispoof.predict(faces[i].tensor as Tensor4D || tf.tensor([]), instance.config, i, faces.length) : 0;\n instance.performance.antispoof = env.perfadd ? (instance.performance.antispoof || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n instance.analyze('End AntiSpoof:');\n\n // run liveness, inherits face from blazeface\n instance.analyze('Start Liveness:');\n if (instance.config.async) {\n livenessRes = instance.config.face.liveness?.enabled ? liveness.predict(faces[i].tensor as Tensor4D || tf.tensor([]), instance.config, i, faces.length) : 0;\n } else {\n instance.state = 'run:liveness';\n timeStamp = now();\n livenessRes = instance.config.face.liveness?.enabled ? await liveness.predict(faces[i].tensor as Tensor4D || tf.tensor([]), instance.config, i, faces.length) : 0;\n instance.performance.liveness = env.perfadd ? (instance.performance.antispoof || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n instance.analyze('End Liveness:');\n\n // run gear, inherits face from blazeface\n instance.analyze('Start GEAR:');\n if (instance.config.async) {\n gearRes = instance.config.face.gear?.enabled ? gear.predict(faces[i].tensor as Tensor4D || tf.tensor([]), instance.config, i, faces.length) : null;\n } else {\n instance.state = 'run:gear';\n timeStamp = now();\n gearRes = instance.config.face.gear?.enabled ? await gear.predict(faces[i].tensor as Tensor4D || tf.tensor([]), instance.config, i, faces.length) : null;\n instance.performance.gear = Math.trunc(now() - timeStamp);\n }\n instance.analyze('End GEAR:');\n\n // run gear, inherits face from blazeface\n instance.analyze('Start SSRNet:');\n if (instance.config.async) {\n ageRes = instance.config.face['ssrnet']?.enabled ? ssrnetAge.predict(faces[i].tensor as Tensor4D || tf.tensor([]), instance.config, i, faces.length) : null;\n genderRes = instance.config.face['ssrnet']?.enabled ? ssrnetGender.predict(faces[i].tensor as Tensor4D || tf.tensor([]), instance.config, i, faces.length) : null;\n } else {\n instance.state = 'run:ssrnet';\n timeStamp = now();\n ageRes = instance.config.face['ssrnet']?.enabled ? await ssrnetAge.predict(faces[i].tensor as Tensor4D || tf.tensor([]), instance.config, i, faces.length) : null;\n genderRes = instance.config.face['ssrnet']?.enabled ? await ssrnetGender.predict(faces[i].tensor as Tensor4D || tf.tensor([]), instance.config, i, faces.length) : null;\n instance.performance.ssrnet = Math.trunc(now() - timeStamp);\n }\n instance.analyze('End SSRNet:');\n\n // run mobilefacenet alternative, inherits face from blazeface\n instance.analyze('Start MobileFaceNet:');\n if (instance.config.async) {\n mobilefacenetRes = instance.config.face['mobilefacenet']?.enabled ? mobilefacenet.predict(faces[i].tensor as Tensor4D || tf.tensor([]), instance.config, i, faces.length) : null;\n } else {\n instance.state = 'run:mobilefacenet';\n timeStamp = now();\n mobilefacenetRes = instance.config.face['mobilefacenet']?.enabled ? await mobilefacenet.predict(faces[i].tensor as Tensor4D || tf.tensor([]), instance.config, i, faces.length) : null;\n instance.performance.mobilefacenet = Math.trunc(now() - timeStamp);\n }\n instance.analyze('End MobileFaceNet:');\n\n // run insightface alternative, inherits face from blazeface\n instance.analyze('Start InsightFace:');\n if (instance.config.async) {\n insightfaceRes = instance.config.face['insightface']?.enabled ? insightface.predict(faces[i].tensor as Tensor4D || tf.tensor([]), instance.config, i, faces.length) : null;\n } else {\n instance.state = 'run:mobilefacenet';\n timeStamp = now();\n insightfaceRes = instance.config.face['insightface']?.enabled ? await insightface.predict(faces[i].tensor as Tensor4D || tf.tensor([]), instance.config, i, faces.length) : null;\n instance.performance.mobilefacenet = Math.trunc(now() - timeStamp);\n }\n instance.analyze('End InsightFace:');\n\n // run faceres, inherits face from blazeface\n instance.analyze('Start Description:');\n if (instance.config.async) {\n descRes = faceres.predict(faces[i].tensor as Tensor4D || tf.tensor([]), instance.config, i, faces.length);\n } else {\n instance.state = 'run:description';\n timeStamp = now();\n descRes = await faceres.predict(faces[i].tensor as Tensor4D || tf.tensor([]), instance.config, i, faces.length);\n instance.performance.description = env.perfadd ? (instance.performance.description || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n instance.analyze('End Description:');\n\n // if async wait for results\n if (instance.config.async) {\n [ageRes, genderRes, emotionRes, mobilefacenetRes, insightfaceRes, descRes, gearRes, antispoofRes, livenessRes] = await Promise.all([ageRes, genderRes, emotionRes, mobilefacenetRes, insightfaceRes, descRes, gearRes, antispoofRes, livenessRes]);\n }\n instance.analyze('Finish Face:');\n\n if (instance.config.face['ssrnet']?.enabled && ageRes && genderRes) { // override age/gender if ssrnet model is used\n descRes = {\n ...(descRes as DescRes),\n age: (ageRes as { age: number}).age,\n gender: (genderRes as { gender: Gender, genderScore: number }).gender,\n genderScore: (genderRes as { gender: Gender, genderScore: number }).genderScore,\n };\n }\n if (instance.config.face.gear?.enabled && gearRes) { // override age/gender/race if gear model is used\n descRes = {\n ...(descRes as DescRes),\n age: (gearRes as gear.GearType).age,\n gender: (gearRes as gear.GearType).gender,\n genderScore: (gearRes as gear.GearType).genderScore,\n race: (gearRes as gear.GearType).race,\n };\n }\n if (instance.config.face['mobilefacenet']?.enabled && mobilefacenetRes) { // override descriptor if mobilefacenet model is used\n (descRes as DescRes).descriptor = mobilefacenetRes as number[];\n }\n\n if (instance.config.face['insightface']?.enabled && insightfaceRes) { // override descriptor if insightface model is used\n (descRes as DescRes).descriptor = insightfaceRes as number[];\n }\n\n const irisSize = instance.config.face.iris?.enabled ? calculateCameraDistance(faces[i], input.shape[2]) : 0;\n\n // optionally return tensor\n const tensor = instance.config.face.detector?.return ? tf.squeeze(faces[i].tensor as Tensor4D) : null;\n // dispose original face tensor\n tf.dispose(faces[i].tensor);\n // delete temp face image\n if (faces[i].tensor) delete faces[i].tensor;\n // combine results\n const res: FaceResult = {\n ...faces[i],\n id: i,\n };\n if ((descRes as DescRes).age) res.age = (descRes as DescRes).age;\n if ((descRes as DescRes).gender) res.gender = (descRes as DescRes).gender;\n if ((descRes as DescRes).genderScore) res.genderScore = (descRes as DescRes).genderScore;\n if ((descRes as DescRes).descriptor) res.embedding = (descRes as DescRes).descriptor;\n if ((descRes as DescRes).race) res.race = (descRes as DescRes).race as { score: number, race: Race }[];\n if (emotionRes) res.emotion = emotionRes as { score: number, emotion: Emotion }[];\n if (antispoofRes) res.real = antispoofRes as number;\n if (livenessRes) res.live = livenessRes as number;\n if (irisSize > 0) res.distance = irisSize;\n if (rotation) res.rotation = rotation;\n if (tensor) res.tensor = tensor;\n faceRes.push(res);\n instance.analyze('End Face');\n }\n instance.analyze('End FaceMesh:');\n if (instance.config.async) {\n if (instance.performance.face) delete instance.performance.face;\n if (instance.performance.age) delete instance.performance.age;\n if (instance.performance.gender) delete instance.performance.gender;\n if (instance.performance.emotion) delete instance.performance.emotion;\n }\n return faceRes;\n};\n", "/**\n * FingerPose algorithm implementation\n * See `fingerpose.ts` for entry point\n */\n\nexport const Finger = {\n thumb: 0,\n index: 1,\n middle: 2,\n ring: 3,\n pinky: 4,\n all: [0, 1, 2, 3, 4], // just for convenience\n nameMapping: { 0: 'thumb', 1: 'index', 2: 'middle', 3: 'ring', 4: 'pinky' },\n // Describes mapping of joints based on the 21 points returned by handpose.\n // [0] Palm\n // [1-4] Thumb\n // [5-8] Index\n // [9-12] Middle\n // [13-16] Ring\n // [17-20] Pinky\n pointsMapping: {\n 0: [[0, 1], [1, 2], [2, 3], [3, 4]],\n 1: [[0, 5], [5, 6], [6, 7], [7, 8]],\n 2: [[0, 9], [9, 10], [10, 11], [11, 12]],\n 3: [[0, 13], [13, 14], [14, 15], [15, 16]],\n 4: [[0, 17], [17, 18], [18, 19], [19, 20]],\n },\n getName: (value) => Finger.nameMapping[value],\n getPoints: (value) => Finger.pointsMapping[value],\n};\n\nexport const FingerCurl = {\n none: 0,\n half: 1,\n full: 2,\n nameMapping: { 0: 'none', 1: 'half', 2: 'full' },\n getName: (value) => FingerCurl.nameMapping[value],\n};\n\nexport const FingerDirection = {\n verticalUp: 0,\n verticalDown: 1,\n horizontalLeft: 2,\n horizontalRight: 3,\n diagonalUpRight: 4,\n diagonalUpLeft: 5,\n diagonalDownRight: 6,\n diagonalDownLeft: 7,\n nameMapping: { 0: 'verticalUp', 1: 'verticalDown', 2: 'horizontalLeft', 3: 'horizontalRight', 4: 'diagonalUpRight', 5: 'diagonalUpLeft', 6: 'diagonalDownRight', 7: 'diagonalDownLeft' },\n getName: (value) => FingerDirection.nameMapping[value],\n};\n\nexport class FingerGesture {\n name;\n curls;\n directions;\n weights;\n weightsRelative;\n\n constructor(name) {\n // name (should be unique)\n this.name = name;\n this.curls = {};\n this.directions = {};\n this.weights = [1.0, 1.0, 1.0, 1.0, 1.0];\n this.weightsRelative = [1.0, 1.0, 1.0, 1.0, 1.0];\n }\n\n curl(finger, curl, confidence) {\n if (typeof this.curls[finger] === 'undefined') this.curls[finger] = [];\n this.curls[finger].push([curl, confidence]);\n }\n\n direction(finger, position, confidence) {\n if (!this.directions[finger]) this.directions[finger] = [];\n this.directions[finger].push([position, confidence]);\n }\n\n weight(finger, weight) {\n this.weights[finger] = weight;\n // recalculate relative weights\n const total = this.weights.reduce((a, b) => a + b, 0);\n this.weightsRelative = this.weights.map((el) => el * 5 / total);\n }\n\n matchAgainst(detectedCurls, detectedDirections) {\n let confidence = 0.0;\n // look at the detected curl of each finger and compare with\n // the expected curl of this finger inside current gesture\n for (const fingerIdx in detectedCurls) {\n const detectedCurl = detectedCurls[fingerIdx];\n const expectedCurls = this.curls[fingerIdx];\n if (typeof expectedCurls === 'undefined') {\n // no curl description available for this finger\n // add default confidence of \"1\"\n confidence += this.weightsRelative[fingerIdx];\n continue;\n }\n // compare to each possible curl of this specific finger\n for (const [expectedCurl, score] of expectedCurls) {\n if (detectedCurl === expectedCurl) {\n confidence += score * this.weightsRelative[fingerIdx];\n break;\n }\n }\n }\n // same for detected direction of each finger\n for (const fingerIdx in detectedDirections) {\n const detectedDirection = detectedDirections[fingerIdx];\n const expectedDirections = this.directions[fingerIdx];\n if (typeof expectedDirections === 'undefined') {\n // no direction description available for this finger\n // add default confidence of \"1\"\n confidence += this.weightsRelative[fingerIdx];\n continue;\n }\n // compare to each possible direction of this specific finger\n for (const [expectedDirection, score] of expectedDirections) {\n if (detectedDirection === expectedDirection) {\n confidence += score * this.weightsRelative[fingerIdx];\n break;\n }\n }\n }\n return confidence / 10;\n }\n}\n", "/**\n * FingerPose algorithm implementation\n * See `fingerpose.ts` for entry point\n */\n\nimport { Finger, FingerCurl, FingerDirection, FingerGesture } from './fingerdef';\n\nexport const { thumb, index, middle, ring, pinky } = Finger;\nexport const { none, half, full } = FingerCurl;\nexport const { verticalUp, verticalDown, horizontalLeft, horizontalRight, diagonalUpRight, diagonalUpLeft, diagonalDownRight, diagonalDownLeft } = FingerDirection;\n\n// describe thumbs up gesture \uD83D\uDC4D\nconst ThumbsUp = new FingerGesture('thumbs up');\nThumbsUp.curl(thumb, none, 1.0);\nThumbsUp.direction(thumb, verticalUp, 1.0);\nThumbsUp.direction(thumb, diagonalUpLeft, 0.25);\nThumbsUp.direction(thumb, diagonalUpRight, 0.25);\nfor (const finger of [Finger.index, Finger.middle, Finger.ring, Finger.pinky]) {\n ThumbsUp.curl(finger, full, 1.0);\n ThumbsUp.direction(finger, horizontalLeft, 1.0);\n ThumbsUp.direction(finger, horizontalRight, 1.0);\n}\n\n// describe Victory gesture \u270C\uFE0F\nconst Victory = new FingerGesture('victory');\nVictory.curl(thumb, half, 0.5);\nVictory.curl(thumb, none, 0.5);\nVictory.direction(thumb, verticalUp, 1.0);\nVictory.direction(thumb, diagonalUpLeft, 1.0);\nVictory.curl(index, none, 1.0);\nVictory.direction(index, verticalUp, 0.75);\nVictory.direction(index, diagonalUpLeft, 1.0);\nVictory.curl(middle, none, 1.0);\nVictory.direction(middle, verticalUp, 1.0);\nVictory.direction(middle, diagonalUpLeft, 0.75);\nVictory.curl(ring, full, 1.0);\nVictory.direction(ring, verticalUp, 0.2);\nVictory.direction(ring, diagonalUpLeft, 1.0);\nVictory.direction(ring, horizontalLeft, 0.2);\nVictory.curl(pinky, full, 1.0);\nVictory.direction(pinky, verticalUp, 0.2);\nVictory.direction(pinky, diagonalUpLeft, 1.0);\nVictory.direction(pinky, horizontalLeft, 0.2);\nVictory.weight(index, 2);\nVictory.weight(middle, 2);\n\n// describe Point gesture \u270C\uFE0F\nconst Point = new FingerGesture('point');\nPoint.curl(thumb, full, 1.0);\nPoint.curl(index, none, 0.5);\nPoint.curl(middle, full, 0.5);\nPoint.curl(ring, full, 0.5);\nPoint.curl(pinky, full, 0.5);\nPoint.weight(index, 2);\nPoint.weight(middle, 2);\n\n// describe Point gesture \u270C\uFE0F\nconst MiddleFinger = new FingerGesture('middle finger');\nMiddleFinger.curl(thumb, none, 1.0);\nMiddleFinger.curl(index, full, 0.5);\nMiddleFinger.curl(middle, full, 0.5);\nMiddleFinger.curl(ring, full, 0.5);\nMiddleFinger.curl(pinky, full, 0.5);\nMiddleFinger.weight(index, 2);\nMiddleFinger.weight(middle, 2);\n\n// describe Open Palm gesture \u270C\uFE0F\nconst OpenPalm = new FingerGesture('open palm');\nOpenPalm.curl(thumb, none, 0.75);\nOpenPalm.curl(index, none, 0.75);\nOpenPalm.curl(middle, none, 0.75);\nOpenPalm.curl(ring, none, 0.75);\nOpenPalm.curl(pinky, none, 0.75);\n\nexport default [ThumbsUp, Victory, Point, MiddleFinger, OpenPalm];\n", "/**\n * FingerPose algorithm implementation constants\n *\n * Based on: [**FingerPose***](https://github.com/andypotato/fingerpose)\n */\n\n/* eslint-disable camelcase */\n\nimport { Finger, FingerCurl, FingerDirection } from './fingerdef';\nimport Gestures from '../hand/fingergesture';\n\nconst minConfidence = 0.7;\nconst options = {\n // curl estimation\n HALF_CURL_START_LIMIT: 60.0,\n NO_CURL_START_LIMIT: 130.0,\n // direction estimation\n DISTANCE_VOTE_POWER: 1.1,\n SINGLE_ANGLE_VOTE_POWER: 0.9,\n TOTAL_ANGLE_VOTE_POWER: 1.6,\n};\n\nfunction calculateSlope(point1x, point1y, point2x, point2y) {\n const value = (point1y - point2y) / (point1x - point2x);\n let slope = Math.atan(value) * 180 / Math.PI;\n if (slope <= 0) slope = -slope;\n else if (slope > 0) slope = 180 - slope;\n return slope;\n}\n\n// point1, point2 are 2d or 3d point arrays (xy[z])\n// returns either a single scalar (2d) or array of two slopes (3d)\nfunction getSlopes(point1, point2) {\n if (!point1 || !point2) return [0, 0];\n const slopeXY = calculateSlope(point1[0], point1[1], point2[0], point2[1]);\n if (point1.length === 2) return slopeXY;\n const slopeYZ = calculateSlope(point1[1], point1[2], point2[1], point2[2]);\n return [slopeXY, slopeYZ];\n}\n\nfunction angleOrientationAt(angle, weightageAt = 1.0) {\n let isVertical = 0;\n let isDiagonal = 0;\n let isHorizontal = 0;\n if (angle >= 75.0 && angle <= 105.0) isVertical = 1 * weightageAt;\n else if (angle >= 25.0 && angle <= 155.0) isDiagonal = 1 * weightageAt;\n else isHorizontal = 1 * weightageAt;\n return [isVertical, isDiagonal, isHorizontal];\n}\n\nfunction estimateFingerCurl(startPoint, midPoint, endPoint) {\n const start_mid_x_dist = startPoint[0] - midPoint[0];\n const start_end_x_dist = startPoint[0] - endPoint[0];\n const mid_end_x_dist = midPoint[0] - endPoint[0];\n const start_mid_y_dist = startPoint[1] - midPoint[1];\n const start_end_y_dist = startPoint[1] - endPoint[1];\n const mid_end_y_dist = midPoint[1] - endPoint[1];\n const start_mid_z_dist = startPoint[2] - midPoint[2];\n const start_end_z_dist = startPoint[2] - endPoint[2];\n const mid_end_z_dist = midPoint[2] - endPoint[2];\n const start_mid_dist = Math.sqrt(start_mid_x_dist * start_mid_x_dist + start_mid_y_dist * start_mid_y_dist + start_mid_z_dist * start_mid_z_dist);\n const start_end_dist = Math.sqrt(start_end_x_dist * start_end_x_dist + start_end_y_dist * start_end_y_dist + start_end_z_dist * start_end_z_dist);\n const mid_end_dist = Math.sqrt(mid_end_x_dist * mid_end_x_dist + mid_end_y_dist * mid_end_y_dist + mid_end_z_dist * mid_end_z_dist);\n let cos_in = (mid_end_dist * mid_end_dist + start_mid_dist * start_mid_dist - start_end_dist * start_end_dist) / (2 * mid_end_dist * start_mid_dist);\n if (cos_in > 1.0) cos_in = 1.0;\n else if (cos_in < -1.0) cos_in = -1.0;\n let angleOfCurve = Math.acos(cos_in);\n angleOfCurve = (57.2958 * angleOfCurve) % 180;\n let fingerCurl;\n if (angleOfCurve > options.NO_CURL_START_LIMIT) fingerCurl = FingerCurl.none;\n else if (angleOfCurve > options.HALF_CURL_START_LIMIT) fingerCurl = FingerCurl.half;\n else fingerCurl = FingerCurl.full;\n return fingerCurl;\n}\n\nfunction estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x) {\n let estimatedDirection;\n if (max_dist_x === Math.abs(start_end_x_dist)) {\n if (start_end_x_dist > 0) estimatedDirection = FingerDirection.horizontalLeft;\n else estimatedDirection = FingerDirection.horizontalRight;\n } else if (max_dist_x === Math.abs(start_mid_x_dist)) {\n if (start_mid_x_dist > 0) estimatedDirection = FingerDirection.horizontalLeft;\n else estimatedDirection = FingerDirection.horizontalRight;\n } else {\n if (mid_end_x_dist > 0) estimatedDirection = FingerDirection.horizontalLeft;\n else estimatedDirection = FingerDirection.horizontalRight;\n }\n return estimatedDirection;\n}\n\nfunction estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y) {\n let estimatedDirection;\n if (max_dist_y === Math.abs(start_end_y_dist)) {\n if (start_end_y_dist < 0) estimatedDirection = FingerDirection.verticalDown;\n else estimatedDirection = FingerDirection.verticalUp;\n } else if (max_dist_y === Math.abs(start_mid_y_dist)) {\n if (start_mid_y_dist < 0) estimatedDirection = FingerDirection.verticalDown;\n else estimatedDirection = FingerDirection.verticalUp;\n } else {\n if (mid_end_y_dist < 0) estimatedDirection = FingerDirection.verticalDown;\n else estimatedDirection = FingerDirection.verticalUp;\n }\n return estimatedDirection;\n}\n\nfunction estimateDiagonalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y, start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x) {\n let estimatedDirection;\n const reqd_vertical_direction = estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y);\n const reqd_horizontal_direction = estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x);\n if (reqd_vertical_direction === FingerDirection.verticalUp) {\n if (reqd_horizontal_direction === FingerDirection.horizontalLeft) estimatedDirection = FingerDirection.diagonalUpLeft;\n else estimatedDirection = FingerDirection.diagonalUpRight;\n } else {\n if (reqd_horizontal_direction === FingerDirection.horizontalLeft) estimatedDirection = FingerDirection.diagonalDownLeft;\n else estimatedDirection = FingerDirection.diagonalDownRight;\n }\n return estimatedDirection;\n}\n\nfunction calculateFingerDirection(startPoint, midPoint, endPoint, fingerSlopes) {\n const start_mid_x_dist = startPoint[0] - midPoint[0];\n const start_end_x_dist = startPoint[0] - endPoint[0];\n const mid_end_x_dist = midPoint[0] - endPoint[0];\n const start_mid_y_dist = startPoint[1] - midPoint[1];\n const start_end_y_dist = startPoint[1] - endPoint[1];\n const mid_end_y_dist = midPoint[1] - endPoint[1];\n const max_dist_x = Math.max(Math.abs(start_mid_x_dist), Math.abs(start_end_x_dist), Math.abs(mid_end_x_dist));\n const max_dist_y = Math.max(Math.abs(start_mid_y_dist), Math.abs(start_end_y_dist), Math.abs(mid_end_y_dist));\n let voteVertical = 0.0;\n let voteDiagonal = 0.0;\n let voteHorizontal = 0.0;\n const start_end_x_y_dist_ratio = max_dist_y / (max_dist_x + 0.00001);\n if (start_end_x_y_dist_ratio > 1.5) voteVertical += options.DISTANCE_VOTE_POWER;\n else if (start_end_x_y_dist_ratio > 0.66) voteDiagonal += options.DISTANCE_VOTE_POWER;\n else voteHorizontal += options.DISTANCE_VOTE_POWER;\n const start_mid_dist = Math.sqrt(start_mid_x_dist * start_mid_x_dist + start_mid_y_dist * start_mid_y_dist);\n const start_end_dist = Math.sqrt(start_end_x_dist * start_end_x_dist + start_end_y_dist * start_end_y_dist);\n const mid_end_dist = Math.sqrt(mid_end_x_dist * mid_end_x_dist + mid_end_y_dist * mid_end_y_dist);\n const max_dist = Math.max(start_mid_dist, start_end_dist, mid_end_dist);\n let calc_start_point_x = startPoint[0];\n let calc_start_point_y = startPoint[1];\n let calc_end_point_x = endPoint[0];\n let calc_end_point_y = endPoint[1];\n if (max_dist === start_mid_dist) {\n calc_end_point_x = endPoint[0];\n calc_end_point_y = endPoint[1];\n } else if (max_dist === mid_end_dist) {\n calc_start_point_x = midPoint[0];\n calc_start_point_y = midPoint[1];\n }\n const calcStartPoint = [calc_start_point_x, calc_start_point_y];\n const calcEndPoint = [calc_end_point_x, calc_end_point_y];\n const totalAngle = getSlopes(calcStartPoint, calcEndPoint);\n const votes = angleOrientationAt(totalAngle, options.TOTAL_ANGLE_VOTE_POWER);\n voteVertical += votes[0];\n voteDiagonal += votes[1];\n voteHorizontal += votes[2];\n for (const fingerSlope of fingerSlopes) {\n const fingerVotes = angleOrientationAt(fingerSlope, options.SINGLE_ANGLE_VOTE_POWER);\n voteVertical += fingerVotes[0];\n voteDiagonal += fingerVotes[1];\n voteHorizontal += fingerVotes[2];\n }\n // in case of tie, highest preference goes to Vertical,\n // followed by horizontal and then diagonal\n let estimatedDirection;\n if (voteVertical === Math.max(voteVertical, voteDiagonal, voteHorizontal)) {\n estimatedDirection = estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y);\n } else if (voteHorizontal === Math.max(voteDiagonal, voteHorizontal)) {\n estimatedDirection = estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x);\n } else {\n estimatedDirection = estimateDiagonalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y, start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x);\n }\n return estimatedDirection;\n}\n\nfunction estimate(landmarks) {\n // step 1: calculate slopes\n const slopesXY: number[][] = [];\n const slopesYZ: number[][] = [];\n const fingerCurls: number[] = [];\n const fingerDirections: number[] = [];\n if (!landmarks) return { curls: fingerCurls, directions: fingerDirections };\n\n // step 1: calculate slopes\n for (const finger of Finger.all) {\n const points = Finger.getPoints(finger);\n const slopeAtXY: number[] = [];\n const slopeAtYZ: number[] = [];\n for (const point of points) {\n const point1 = landmarks[point[0]];\n const point2 = landmarks[point[1]];\n // calculate single slope\n const slopes = getSlopes(point1, point2);\n const slopeXY = slopes[0];\n const slopeYZ = slopes[1];\n slopeAtXY.push(slopeXY);\n slopeAtYZ.push(slopeYZ);\n }\n slopesXY.push(slopeAtXY);\n slopesYZ.push(slopeAtYZ);\n }\n\n // step 2: calculate orientations\n for (const finger of Finger.all) {\n // start finger predictions from palm - except for thumb\n const pointIndexAt = (finger === Finger.thumb) ? 1 : 0;\n const fingerPointsAt = Finger.getPoints(finger);\n const startPoint = landmarks[fingerPointsAt[pointIndexAt][0]];\n const midPoint = landmarks[fingerPointsAt[pointIndexAt + 1][1]];\n const endPoint = landmarks[fingerPointsAt[3][1]];\n // check if finger is curled\n const fingerCurled = estimateFingerCurl(startPoint, midPoint, endPoint);\n const fingerPosition = calculateFingerDirection(startPoint, midPoint, endPoint, slopesXY[finger].slice(pointIndexAt));\n fingerCurls[finger] = fingerCurled;\n fingerDirections[finger] = fingerPosition;\n }\n return { curls: fingerCurls, directions: fingerDirections };\n}\n\nexport function analyze(keypoints) { // get estimations of curl / direction for each finger\n if (!keypoints || keypoints.length === 0) return null;\n const estimatorRes = estimate(keypoints);\n const landmarks = {};\n for (const fingerIdx of Finger.all) {\n landmarks[Finger.getName(fingerIdx)] = {\n curl: FingerCurl.getName(estimatorRes.curls[fingerIdx]),\n direction: FingerDirection.getName(estimatorRes.directions[fingerIdx]),\n };\n }\n return landmarks;\n}\n\nexport function match(keypoints) { // compare gesture description to each known gesture\n const poses: { name: string, confidence: number }[] = [];\n if (!keypoints || keypoints.length === 0) return poses;\n const estimatorRes = estimate(keypoints);\n for (const gesture of Gestures) {\n const confidence = gesture.matchAgainst(estimatorRes.curls, estimatorRes.directions);\n if (confidence >= minConfidence) poses.push({ name: gesture.name, confidence });\n }\n return poses;\n}\n", "/**\n * Gesture detection algorithm\n */\n\nimport type { GestureResult, BodyResult, FaceResult, HandResult, Point } from '../result';\nimport * as fingerPose from '../hand/fingerpose';\n\n/** face gesture type */\nexport type FaceGesture =\n `facing ${'left' | 'center' | 'right'}`\n | `blink ${'left' | 'right'} eye`\n | `mouth ${number}% open`\n | `head ${'up' | 'down'}`;\n\n/** iris gesture type */\nexport type IrisGesture =\n 'facing center'\n | `looking ${'left' | 'right' | 'up' | 'down'}`\n | 'looking center';\n\n/** body gesture type */\nexport type BodyGesture =\n `leaning ${'left' | 'right'}`\n | `raise ${'left' | 'right'} hand`\n | 'i give up';\n\n/** hand gesture type */\nexport type HandGesture =\n `${'thumb' | 'index' | 'middle' | 'ring' | 'pinky'} forward`\n | `${'thumb' | 'index' | 'middle' | 'ring' | 'pinky'} up`\n | 'victory'\n | 'thumbs up';\n\nexport const body = (res: BodyResult[]): GestureResult[] => {\n if (!res) return [];\n const gestures: { body: number, gesture: BodyGesture }[] = [];\n for (let i = 0; i < res.length; i++) {\n // raising hands\n const leftWrist = res[i].keypoints.find((a) => (a.part === 'leftWrist'));\n const rightWrist = res[i].keypoints.find((a) => (a.part === 'rightWrist'));\n const nose = res[i].keypoints.find((a) => (a.part === 'nose'));\n if (nose && leftWrist && rightWrist && (leftWrist.position[1] < nose.position[1]) && (rightWrist.position[1] < nose.position[1])) gestures.push({ body: i, gesture: 'i give up' });\n else if (nose && leftWrist && (leftWrist.position[1] < nose.position[1])) gestures.push({ body: i, gesture: 'raise left hand' });\n else if (nose && rightWrist && (rightWrist.position[1] < nose.position[1])) 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 && Math.abs(leftShoulder.positionRaw[1] - rightShoulder.positionRaw[1]) > 0.1) {\n gestures.push({ body: i, gesture: `leaning ${(leftShoulder.position[1] > rightShoulder.position[1]) ? 'left' : 'right'}` });\n }\n }\n return gestures;\n};\n\nexport const face = (res: FaceResult[]): GestureResult[] => {\n if (!res) return [];\n const gestures: { face: number, gesture: FaceGesture }[] = [];\n for (let i = 0; i < res.length; i++) {\n if (res[i].mesh && res[i].mesh.length > 450) {\n const zDiff = (res[i].mesh[33][2] || 0) - (res[i].mesh[263][2] || 0);\n const xDiff = res[i].mesh[33][0] - res[i].mesh[263][0];\n if (Math.abs(zDiff / xDiff) <= 0.15) gestures.push({ face: i, gesture: 'facing center' });\n else gestures.push({ face: i, gesture: `facing ${zDiff < 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] || 0;\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: FaceResult[]): GestureResult[] => {\n if (!res) return [];\n const gestures: { iris: number, gesture: IrisGesture }[] = [];\n for (let i = 0; i < res.length; i++) {\n if (!res[i].annotations?.leftEyeIris?.[0] || !res[i].annotations?.rightEyeIris?.[0]) 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 leftIrisCenterX = Math.abs(res[i].mesh[263][0] - res[i].annotations.leftEyeIris[0][0]) / res[i].box[2];\n const rightIrisCenterX = Math.abs(res[i].mesh[33][0] - res[i].annotations.rightEyeIris[0][0]) / res[i].box[2];\n if (leftIrisCenterX > 0.06 || rightIrisCenterX > 0.06) center = false;\n if (leftIrisCenterX > rightIrisCenterX) { // check eye with bigger offset\n if (leftIrisCenterX > 0.05) gestures.push({ iris: i, gesture: 'looking right' });\n } else {\n if (rightIrisCenterX > 0.05) gestures.push({ iris: i, gesture: 'looking left' });\n }\n\n const rightIrisCenterY = Math.abs(res[i].mesh[145][1] - res[i].annotations.rightEyeIris[0][1]) / res[i].box[3];\n const leftIrisCenterY = Math.abs(res[i].mesh[374][1] - res[i].annotations.leftEyeIris[0][1]) / res[i].box[3];\n if (leftIrisCenterY < 0.01 || rightIrisCenterY < 0.01 || leftIrisCenterY > 0.022 || rightIrisCenterY > 0.022) center = false;\n if (leftIrisCenterY < 0.01 || rightIrisCenterY < 0.01) gestures.push({ iris: i, gesture: 'looking down' });\n if (leftIrisCenterY > 0.022 || rightIrisCenterY > 0.022) gestures.push({ iris: i, gesture: 'looking up' });\n\n // still center;\n if (center) gestures.push({ iris: i, gesture: 'looking center' });\n }\n return gestures;\n};\n\nexport const hand = (res: HandResult[]): GestureResult[] => {\n if (!res) return [];\n const gestures: { hand: number, gesture: HandGesture }[] = [];\n for (let i = 0; i < res.length; i++) {\n const fingers: { name: string, position: Point }[] = [];\n if (res[i].annotations) {\n for (const [finger, pos] of Object.entries(res[i].annotations)) {\n if (finger !== 'palmBase' && Array.isArray(pos) && pos[0]) fingers.push({ name: finger.toLowerCase(), position: pos[0] }); // get tip of each finger\n }\n }\n if (fingers && fingers.length > 0) {\n const closest = fingers.reduce((best, a) => ((best.position[2] || 0) < (a.position[2] || 0) ? best : a));\n gestures.push({ hand: i, gesture: `${closest.name} forward` as HandGesture });\n const highest = fingers.reduce((best, a) => (best.position[1] < a.position[1] ? best : a));\n gestures.push({ hand: i, gesture: `${highest.name} up` as HandGesture });\n }\n if (res[i].keypoints) {\n const poses = fingerPose.match(res[i].keypoints);\n for (const pose of poses) gestures.push({ hand: i, gesture: pose.name as HandGesture });\n }\n }\n return gestures;\n};\n", "import * as tf from 'dist/tfjs.esm.js';\nimport type { Point } from '../result';\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]] as Point;\n const endPoint = [box.endPoint[0] * factor[0], box.endPoint[1] * factor[1]] as Point;\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]] as Point;\n const endPoint = [center[0] + newHalfSize[0], center[1] + newHalfSize[1]] as Point;\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] as Point;\n const endPoint = [centers[0] + halfSize, centers[1] + halfSize] as Point;\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]] as Point;\n const endPoint = [box.endPoint[0] + shiftVector[0], box.endPoint[1] + shiftVector[1]] as Point;\n return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n\nexport 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: number[] = [];\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: number[][] = [];\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", "/**\n * HandPose model implementation constants\n * See `handpose.ts` for entry point\n */\n\nexport const anchors = [\n { x: 0.015625, y: 0.015625 },\n { x: 0.015625, y: 0.015625 },\n { x: 0.046875, y: 0.015625 },\n { x: 0.046875, y: 0.015625 },\n { x: 0.078125, y: 0.015625 },\n { x: 0.078125, y: 0.015625 },\n { x: 0.109375, y: 0.015625 },\n { x: 0.109375, y: 0.015625 },\n { x: 0.140625, y: 0.015625 },\n { x: 0.140625, y: 0.015625 },\n { x: 0.171875, y: 0.015625 },\n { x: 0.171875, y: 0.015625 },\n { x: 0.203125, y: 0.015625 },\n { x: 0.203125, y: 0.015625 },\n { x: 0.234375, y: 0.015625 },\n { x: 0.234375, y: 0.015625 },\n { x: 0.265625, y: 0.015625 },\n { x: 0.265625, y: 0.015625 },\n { x: 0.296875, y: 0.015625 },\n { x: 0.296875, y: 0.015625 },\n { x: 0.328125, y: 0.015625 },\n { x: 0.328125, y: 0.015625 },\n { x: 0.359375, y: 0.015625 },\n { x: 0.359375, y: 0.015625 },\n { x: 0.390625, y: 0.015625 },\n { x: 0.390625, y: 0.015625 },\n { x: 0.421875, y: 0.015625 },\n { x: 0.421875, y: 0.015625 },\n { x: 0.453125, y: 0.015625 },\n { x: 0.453125, y: 0.015625 },\n { x: 0.484375, y: 0.015625 },\n { x: 0.484375, y: 0.015625 },\n { x: 0.515625, y: 0.015625 },\n { x: 0.515625, y: 0.015625 },\n { x: 0.546875, y: 0.015625 },\n { x: 0.546875, y: 0.015625 },\n { x: 0.578125, y: 0.015625 },\n { x: 0.578125, y: 0.015625 },\n { x: 0.609375, y: 0.015625 },\n { x: 0.609375, y: 0.015625 },\n { x: 0.640625, y: 0.015625 },\n { x: 0.640625, y: 0.015625 },\n { x: 0.671875, y: 0.015625 },\n { x: 0.671875, y: 0.015625 },\n { x: 0.703125, y: 0.015625 },\n { x: 0.703125, y: 0.015625 },\n { x: 0.734375, y: 0.015625 },\n { x: 0.734375, y: 0.015625 },\n { x: 0.765625, y: 0.015625 },\n { x: 0.765625, y: 0.015625 },\n { x: 0.796875, y: 0.015625 },\n { x: 0.796875, y: 0.015625 },\n { x: 0.828125, y: 0.015625 },\n { x: 0.828125, y: 0.015625 },\n { x: 0.859375, y: 0.015625 },\n { x: 0.859375, y: 0.015625 },\n { x: 0.890625, y: 0.015625 },\n { x: 0.890625, y: 0.015625 },\n { x: 0.921875, y: 0.015625 },\n { x: 0.921875, y: 0.015625 },\n { x: 0.953125, y: 0.015625 },\n { x: 0.953125, y: 0.015625 },\n { x: 0.984375, y: 0.015625 },\n { x: 0.984375, y: 0.015625 },\n { x: 0.015625, y: 0.046875 },\n { x: 0.015625, y: 0.046875 },\n { x: 0.046875, y: 0.046875 },\n { x: 0.046875, y: 0.046875 },\n { x: 0.078125, y: 0.046875 },\n { x: 0.078125, y: 0.046875 },\n { x: 0.109375, y: 0.046875 },\n { x: 0.109375, y: 0.046875 },\n { x: 0.140625, y: 0.046875 },\n { x: 0.140625, y: 0.046875 },\n { x: 0.171875, y: 0.046875 },\n { x: 0.171875, y: 0.046875 },\n { x: 0.203125, y: 0.046875 },\n { x: 0.203125, y: 0.046875 },\n { x: 0.234375, y: 0.046875 },\n { x: 0.234375, y: 0.046875 },\n { x: 0.265625, y: 0.046875 },\n { x: 0.265625, y: 0.046875 },\n { x: 0.296875, y: 0.046875 },\n { x: 0.296875, y: 0.046875 },\n { x: 0.328125, y: 0.046875 },\n { x: 0.328125, y: 0.046875 },\n { x: 0.359375, y: 0.046875 },\n { x: 0.359375, y: 0.046875 },\n { x: 0.390625, y: 0.046875 },\n { x: 0.390625, y: 0.046875 },\n { x: 0.421875, y: 0.046875 },\n { x: 0.421875, y: 0.046875 },\n { x: 0.453125, y: 0.046875 },\n { x: 0.453125, y: 0.046875 },\n { x: 0.484375, y: 0.046875 },\n { x: 0.484375, y: 0.046875 },\n { x: 0.515625, y: 0.046875 },\n { x: 0.515625, y: 0.046875 },\n { x: 0.546875, y: 0.046875 },\n { x: 0.546875, y: 0.046875 },\n { x: 0.578125, y: 0.046875 },\n { x: 0.578125, y: 0.046875 },\n { x: 0.609375, y: 0.046875 },\n { x: 0.609375, y: 0.046875 },\n { x: 0.640625, y: 0.046875 },\n { x: 0.640625, y: 0.046875 },\n { x: 0.671875, y: 0.046875 },\n { x: 0.671875, y: 0.046875 },\n { x: 0.703125, y: 0.046875 },\n { x: 0.703125, y: 0.046875 },\n { x: 0.734375, y: 0.046875 },\n { x: 0.734375, y: 0.046875 },\n { x: 0.765625, y: 0.046875 },\n { x: 0.765625, y: 0.046875 },\n { x: 0.796875, y: 0.046875 },\n { x: 0.796875, y: 0.046875 },\n { x: 0.828125, y: 0.046875 },\n { x: 0.828125, y: 0.046875 },\n { x: 0.859375, y: 0.046875 },\n { x: 0.859375, y: 0.046875 },\n { x: 0.890625, y: 0.046875 },\n { x: 0.890625, y: 0.046875 },\n { x: 0.921875, y: 0.046875 },\n { x: 0.921875, y: 0.046875 },\n { x: 0.953125, y: 0.046875 },\n { x: 0.953125, y: 0.046875 },\n { x: 0.984375, y: 0.046875 },\n { x: 0.984375, y: 0.046875 },\n { x: 0.015625, y: 0.078125 },\n { x: 0.015625, y: 0.078125 },\n { x: 0.046875, y: 0.078125 },\n { x: 0.046875, y: 0.078125 },\n { x: 0.078125, y: 0.078125 },\n { x: 0.078125, y: 0.078125 },\n { x: 0.109375, y: 0.078125 },\n { x: 0.109375, y: 0.078125 },\n { x: 0.140625, y: 0.078125 },\n { x: 0.140625, y: 0.078125 },\n { x: 0.171875, y: 0.078125 },\n { x: 0.171875, y: 0.078125 },\n { x: 0.203125, y: 0.078125 },\n { x: 0.203125, y: 0.078125 },\n { x: 0.234375, y: 0.078125 },\n { x: 0.234375, y: 0.078125 },\n { x: 0.265625, y: 0.078125 },\n { x: 0.265625, y: 0.078125 },\n { x: 0.296875, y: 0.078125 },\n { x: 0.296875, y: 0.078125 },\n { x: 0.328125, y: 0.078125 },\n { x: 0.328125, y: 0.078125 },\n { x: 0.359375, y: 0.078125 },\n { x: 0.359375, y: 0.078125 },\n { x: 0.390625, y: 0.078125 },\n { x: 0.390625, y: 0.078125 },\n { x: 0.421875, y: 0.078125 },\n { x: 0.421875, y: 0.078125 },\n { x: 0.453125, y: 0.078125 },\n { x: 0.453125, y: 0.078125 },\n { x: 0.484375, y: 0.078125 },\n { x: 0.484375, y: 0.078125 },\n { x: 0.515625, y: 0.078125 },\n { x: 0.515625, y: 0.078125 },\n { x: 0.546875, y: 0.078125 },\n { x: 0.546875, y: 0.078125 },\n { x: 0.578125, y: 0.078125 },\n { x: 0.578125, y: 0.078125 },\n { x: 0.609375, y: 0.078125 },\n { x: 0.609375, y: 0.078125 },\n { x: 0.640625, y: 0.078125 },\n { x: 0.640625, y: 0.078125 },\n { x: 0.671875, y: 0.078125 },\n { x: 0.671875, y: 0.078125 },\n { x: 0.703125, y: 0.078125 },\n { x: 0.703125, y: 0.078125 },\n { x: 0.734375, y: 0.078125 },\n { x: 0.734375, y: 0.078125 },\n { x: 0.765625, y: 0.078125 },\n { x: 0.765625, y: 0.078125 },\n { x: 0.796875, y: 0.078125 },\n { x: 0.796875, y: 0.078125 },\n { x: 0.828125, y: 0.078125 },\n { x: 0.828125, y: 0.078125 },\n { x: 0.859375, y: 0.078125 },\n { x: 0.859375, y: 0.078125 },\n { x: 0.890625, y: 0.078125 },\n { x: 0.890625, y: 0.078125 },\n { x: 0.921875, y: 0.078125 },\n { x: 0.921875, y: 0.078125 },\n { x: 0.953125, y: 0.078125 },\n { x: 0.953125, y: 0.078125 },\n { x: 0.984375, y: 0.078125 },\n { x: 0.984375, y: 0.078125 },\n { x: 0.015625, y: 0.109375 },\n { x: 0.015625, y: 0.109375 },\n { x: 0.046875, y: 0.109375 },\n { x: 0.046875, y: 0.109375 },\n { x: 0.078125, y: 0.109375 },\n { x: 0.078125, y: 0.109375 },\n { x: 0.109375, y: 0.109375 },\n { x: 0.109375, y: 0.109375 },\n { x: 0.140625, y: 0.109375 },\n { x: 0.140625, y: 0.109375 },\n { x: 0.171875, y: 0.109375 },\n { x: 0.171875, y: 0.109375 },\n { x: 0.203125, y: 0.109375 },\n { x: 0.203125, y: 0.109375 },\n { x: 0.234375, y: 0.109375 },\n { x: 0.234375, y: 0.109375 },\n { x: 0.265625, y: 0.109375 },\n { x: 0.265625, y: 0.109375 },\n { x: 0.296875, y: 0.109375 },\n { x: 0.296875, y: 0.109375 },\n { x: 0.328125, y: 0.109375 },\n { x: 0.328125, y: 0.109375 },\n { x: 0.359375, y: 0.109375 },\n { x: 0.359375, y: 0.109375 },\n { x: 0.390625, y: 0.109375 },\n { x: 0.390625, y: 0.109375 },\n { x: 0.421875, y: 0.109375 },\n { x: 0.421875, y: 0.109375 },\n { x: 0.453125, y: 0.109375 },\n { x: 0.453125, y: 0.109375 },\n { x: 0.484375, y: 0.109375 },\n { x: 0.484375, y: 0.109375 },\n { x: 0.515625, y: 0.109375 },\n { x: 0.515625, y: 0.109375 },\n { x: 0.546875, y: 0.109375 },\n { x: 0.546875, y: 0.109375 },\n { x: 0.578125, y: 0.109375 },\n { x: 0.578125, y: 0.109375 },\n { x: 0.609375, y: 0.109375 },\n { x: 0.609375, y: 0.109375 },\n { x: 0.640625, y: 0.109375 },\n { x: 0.640625, y: 0.109375 },\n { x: 0.671875, y: 0.109375 },\n { x: 0.671875, y: 0.109375 },\n { x: 0.703125, y: 0.109375 },\n { x: 0.703125, y: 0.109375 },\n { x: 0.734375, y: 0.109375 },\n { x: 0.734375, y: 0.109375 },\n { x: 0.765625, y: 0.109375 },\n { x: 0.765625, y: 0.109375 },\n { x: 0.796875, y: 0.109375 },\n { x: 0.796875, y: 0.109375 },\n { x: 0.828125, y: 0.109375 },\n { x: 0.828125, y: 0.109375 },\n { x: 0.859375, y: 0.109375 },\n { x: 0.859375, y: 0.109375 },\n { x: 0.890625, y: 0.109375 },\n { x: 0.890625, y: 0.109375 },\n { x: 0.921875, y: 0.109375 },\n { x: 0.921875, y: 0.109375 },\n { x: 0.953125, y: 0.109375 },\n { x: 0.953125, y: 0.109375 },\n { x: 0.984375, y: 0.109375 },\n { x: 0.984375, y: 0.109375 },\n { x: 0.015625, y: 0.140625 },\n { x: 0.015625, y: 0.140625 },\n { x: 0.046875, y: 0.140625 },\n { x: 0.046875, y: 0.140625 },\n { x: 0.078125, y: 0.140625 },\n { x: 0.078125, y: 0.140625 },\n { x: 0.109375, y: 0.140625 },\n { x: 0.109375, y: 0.140625 },\n { x: 0.140625, y: 0.140625 },\n { x: 0.140625, y: 0.140625 },\n { x: 0.171875, y: 0.140625 },\n { x: 0.171875, y: 0.140625 },\n { x: 0.203125, y: 0.140625 },\n { x: 0.203125, y: 0.140625 },\n { x: 0.234375, y: 0.140625 },\n { x: 0.234375, y: 0.140625 },\n { x: 0.265625, y: 0.140625 },\n { x: 0.265625, y: 0.140625 },\n { x: 0.296875, y: 0.140625 },\n { x: 0.296875, y: 0.140625 },\n { x: 0.328125, y: 0.140625 },\n { x: 0.328125, y: 0.140625 },\n { x: 0.359375, y: 0.140625 },\n { x: 0.359375, y: 0.140625 },\n { x: 0.390625, y: 0.140625 },\n { x: 0.390625, y: 0.140625 },\n { x: 0.421875, y: 0.140625 },\n { x: 0.421875, y: 0.140625 },\n { x: 0.453125, y: 0.140625 },\n { x: 0.453125, y: 0.140625 },\n { x: 0.484375, y: 0.140625 },\n { x: 0.484375, y: 0.140625 },\n { x: 0.515625, y: 0.140625 },\n { x: 0.515625, y: 0.140625 },\n { x: 0.546875, y: 0.140625 },\n { x: 0.546875, y: 0.140625 },\n { x: 0.578125, y: 0.140625 },\n { x: 0.578125, y: 0.140625 },\n { x: 0.609375, y: 0.140625 },\n { x: 0.609375, y: 0.140625 },\n { x: 0.640625, y: 0.140625 },\n { x: 0.640625, y: 0.140625 },\n { x: 0.671875, y: 0.140625 },\n { x: 0.671875, y: 0.140625 },\n { x: 0.703125, y: 0.140625 },\n { x: 0.703125, y: 0.140625 },\n { x: 0.734375, y: 0.140625 },\n { x: 0.734375, y: 0.140625 },\n { x: 0.765625, y: 0.140625 },\n { x: 0.765625, y: 0.140625 },\n { x: 0.796875, y: 0.140625 },\n { x: 0.796875, y: 0.140625 },\n { x: 0.828125, y: 0.140625 },\n { x: 0.828125, y: 0.140625 },\n { x: 0.859375, y: 0.140625 },\n { x: 0.859375, y: 0.140625 },\n { x: 0.890625, y: 0.140625 },\n { x: 0.890625, y: 0.140625 },\n { x: 0.921875, y: 0.140625 },\n { x: 0.921875, y: 0.140625 },\n { x: 0.953125, y: 0.140625 },\n { x: 0.953125, y: 0.140625 },\n { x: 0.984375, y: 0.140625 },\n { x: 0.984375, y: 0.140625 },\n { x: 0.015625, y: 0.171875 },\n { x: 0.015625, y: 0.171875 },\n { x: 0.046875, y: 0.171875 },\n { x: 0.046875, y: 0.171875 },\n { x: 0.078125, y: 0.171875 },\n { x: 0.078125, y: 0.171875 },\n { x: 0.109375, y: 0.171875 },\n { x: 0.109375, y: 0.171875 },\n { x: 0.140625, y: 0.171875 },\n { x: 0.140625, y: 0.171875 },\n { x: 0.171875, y: 0.171875 },\n { x: 0.171875, y: 0.171875 },\n { x: 0.203125, y: 0.171875 },\n { x: 0.203125, y: 0.171875 },\n { x: 0.234375, y: 0.171875 },\n { x: 0.234375, y: 0.171875 },\n { x: 0.265625, y: 0.171875 },\n { x: 0.265625, y: 0.171875 },\n { x: 0.296875, y: 0.171875 },\n { x: 0.296875, y: 0.171875 },\n { x: 0.328125, y: 0.171875 },\n { x: 0.328125, y: 0.171875 },\n { x: 0.359375, y: 0.171875 },\n { x: 0.359375, y: 0.171875 },\n { x: 0.390625, y: 0.171875 },\n { x: 0.390625, y: 0.171875 },\n { x: 0.421875, y: 0.171875 },\n { x: 0.421875, y: 0.171875 },\n { x: 0.453125, y: 0.171875 },\n { x: 0.453125, y: 0.171875 },\n { x: 0.484375, y: 0.171875 },\n { x: 0.484375, y: 0.171875 },\n { x: 0.515625, y: 0.171875 },\n { x: 0.515625, y: 0.171875 },\n { x: 0.546875, y: 0.171875 },\n { x: 0.546875, y: 0.171875 },\n { x: 0.578125, y: 0.171875 },\n { x: 0.578125, y: 0.171875 },\n { x: 0.609375, y: 0.171875 },\n { x: 0.609375, y: 0.171875 },\n { x: 0.640625, y: 0.171875 },\n { x: 0.640625, y: 0.171875 },\n { x: 0.671875, y: 0.171875 },\n { x: 0.671875, y: 0.171875 },\n { x: 0.703125, y: 0.171875 },\n { x: 0.703125, y: 0.171875 },\n { x: 0.734375, y: 0.171875 },\n { x: 0.734375, y: 0.171875 },\n { x: 0.765625, y: 0.171875 },\n { x: 0.765625, y: 0.171875 },\n { x: 0.796875, y: 0.171875 },\n { x: 0.796875, y: 0.171875 },\n { x: 0.828125, y: 0.171875 },\n { x: 0.828125, y: 0.171875 },\n { x: 0.859375, y: 0.171875 },\n { x: 0.859375, y: 0.171875 },\n { x: 0.890625, y: 0.171875 },\n { x: 0.890625, y: 0.171875 },\n { x: 0.921875, y: 0.171875 },\n { x: 0.921875, y: 0.171875 },\n { x: 0.953125, y: 0.171875 },\n { x: 0.953125, y: 0.171875 },\n { x: 0.984375, y: 0.171875 },\n { x: 0.984375, y: 0.171875 },\n { x: 0.015625, y: 0.203125 },\n { x: 0.015625, y: 0.203125 },\n { x: 0.046875, y: 0.203125 },\n { x: 0.046875, y: 0.203125 },\n { x: 0.078125, y: 0.203125 },\n { x: 0.078125, y: 0.203125 },\n { x: 0.109375, y: 0.203125 },\n { x: 0.109375, y: 0.203125 },\n { x: 0.140625, y: 0.203125 },\n { x: 0.140625, y: 0.203125 },\n { x: 0.171875, y: 0.203125 },\n { x: 0.171875, y: 0.203125 },\n { x: 0.203125, y: 0.203125 },\n { x: 0.203125, y: 0.203125 },\n { x: 0.234375, y: 0.203125 },\n { x: 0.234375, y: 0.203125 },\n { x: 0.265625, y: 0.203125 },\n { x: 0.265625, y: 0.203125 },\n { x: 0.296875, y: 0.203125 },\n { x: 0.296875, y: 0.203125 },\n { x: 0.328125, y: 0.203125 },\n { x: 0.328125, y: 0.203125 },\n { x: 0.359375, y: 0.203125 },\n { x: 0.359375, y: 0.203125 },\n { x: 0.390625, y: 0.203125 },\n { x: 0.390625, y: 0.203125 },\n { x: 0.421875, y: 0.203125 },\n { x: 0.421875, y: 0.203125 },\n { x: 0.453125, y: 0.203125 },\n { x: 0.453125, y: 0.203125 },\n { x: 0.484375, y: 0.203125 },\n { x: 0.484375, y: 0.203125 },\n { x: 0.515625, y: 0.203125 },\n { x: 0.515625, y: 0.203125 },\n { x: 0.546875, y: 0.203125 },\n { x: 0.546875, y: 0.203125 },\n { x: 0.578125, y: 0.203125 },\n { x: 0.578125, y: 0.203125 },\n { x: 0.609375, y: 0.203125 },\n { x: 0.609375, y: 0.203125 },\n { x: 0.640625, y: 0.203125 },\n { x: 0.640625, y: 0.203125 },\n { x: 0.671875, y: 0.203125 },\n { x: 0.671875, y: 0.203125 },\n { x: 0.703125, y: 0.203125 },\n { x: 0.703125, y: 0.203125 },\n { x: 0.734375, y: 0.203125 },\n { x: 0.734375, y: 0.203125 },\n { x: 0.765625, y: 0.203125 },\n { x: 0.765625, y: 0.203125 },\n { x: 0.796875, y: 0.203125 },\n { x: 0.796875, y: 0.203125 },\n { x: 0.828125, y: 0.203125 },\n { x: 0.828125, y: 0.203125 },\n { x: 0.859375, y: 0.203125 },\n { x: 0.859375, y: 0.203125 },\n { x: 0.890625, y: 0.203125 },\n { x: 0.890625, y: 0.203125 },\n { x: 0.921875, y: 0.203125 },\n { x: 0.921875, y: 0.203125 },\n { x: 0.953125, y: 0.203125 },\n { x: 0.953125, y: 0.203125 },\n { x: 0.984375, y: 0.203125 },\n { x: 0.984375, y: 0.203125 },\n { x: 0.015625, y: 0.234375 },\n { x: 0.015625, y: 0.234375 },\n { x: 0.046875, y: 0.234375 },\n { x: 0.046875, y: 0.234375 },\n { x: 0.078125, y: 0.234375 },\n { x: 0.078125, y: 0.234375 },\n { x: 0.109375, y: 0.234375 },\n { x: 0.109375, y: 0.234375 },\n { x: 0.140625, y: 0.234375 },\n { x: 0.140625, y: 0.234375 },\n { x: 0.171875, y: 0.234375 },\n { x: 0.171875, y: 0.234375 },\n { x: 0.203125, y: 0.234375 },\n { x: 0.203125, y: 0.234375 },\n { x: 0.234375, y: 0.234375 },\n { x: 0.234375, y: 0.234375 },\n { x: 0.265625, y: 0.234375 },\n { x: 0.265625, y: 0.234375 },\n { x: 0.296875, y: 0.234375 },\n { x: 0.296875, y: 0.234375 },\n { x: 0.328125, y: 0.234375 },\n { x: 0.328125, y: 0.234375 },\n { x: 0.359375, y: 0.234375 },\n { x: 0.359375, y: 0.234375 },\n { x: 0.390625, y: 0.234375 },\n { x: 0.390625, y: 0.234375 },\n { x: 0.421875, y: 0.234375 },\n { x: 0.421875, y: 0.234375 },\n { x: 0.453125, y: 0.234375 },\n { x: 0.453125, y: 0.234375 },\n { x: 0.484375, y: 0.234375 },\n { x: 0.484375, y: 0.234375 },\n { x: 0.515625, y: 0.234375 },\n { x: 0.515625, y: 0.234375 },\n { x: 0.546875, y: 0.234375 },\n { x: 0.546875, y: 0.234375 },\n { x: 0.578125, y: 0.234375 },\n { x: 0.578125, y: 0.234375 },\n { x: 0.609375, y: 0.234375 },\n { x: 0.609375, y: 0.234375 },\n { x: 0.640625, y: 0.234375 },\n { x: 0.640625, y: 0.234375 },\n { x: 0.671875, y: 0.234375 },\n { x: 0.671875, y: 0.234375 },\n { x: 0.703125, y: 0.234375 },\n { x: 0.703125, y: 0.234375 },\n { x: 0.734375, y: 0.234375 },\n { x: 0.734375, y: 0.234375 },\n { x: 0.765625, y: 0.234375 },\n { x: 0.765625, y: 0.234375 },\n { x: 0.796875, y: 0.234375 },\n { x: 0.796875, y: 0.234375 },\n { x: 0.828125, y: 0.234375 },\n { x: 0.828125, y: 0.234375 },\n { x: 0.859375, y: 0.234375 },\n { x: 0.859375, y: 0.234375 },\n { x: 0.890625, y: 0.234375 },\n { x: 0.890625, y: 0.234375 },\n { x: 0.921875, y: 0.234375 },\n { x: 0.921875, y: 0.234375 },\n { x: 0.953125, y: 0.234375 },\n { x: 0.953125, y: 0.234375 },\n { x: 0.984375, y: 0.234375 },\n { x: 0.984375, y: 0.234375 },\n { x: 0.015625, y: 0.265625 },\n { x: 0.015625, y: 0.265625 },\n { x: 0.046875, y: 0.265625 },\n { x: 0.046875, y: 0.265625 },\n { x: 0.078125, y: 0.265625 },\n { x: 0.078125, y: 0.265625 },\n { x: 0.109375, y: 0.265625 },\n { x: 0.109375, y: 0.265625 },\n { x: 0.140625, y: 0.265625 },\n { x: 0.140625, y: 0.265625 },\n { x: 0.171875, y: 0.265625 },\n { x: 0.171875, y: 0.265625 },\n { x: 0.203125, y: 0.265625 },\n { x: 0.203125, y: 0.265625 },\n { x: 0.234375, y: 0.265625 },\n { x: 0.234375, y: 0.265625 },\n { x: 0.265625, y: 0.265625 },\n { x: 0.265625, y: 0.265625 },\n { x: 0.296875, y: 0.265625 },\n { x: 0.296875, y: 0.265625 },\n { x: 0.328125, y: 0.265625 },\n { x: 0.328125, y: 0.265625 },\n { x: 0.359375, y: 0.265625 },\n { x: 0.359375, y: 0.265625 },\n { x: 0.390625, y: 0.265625 },\n { x: 0.390625, y: 0.265625 },\n { x: 0.421875, y: 0.265625 },\n { x: 0.421875, y: 0.265625 },\n { x: 0.453125, y: 0.265625 },\n { x: 0.453125, y: 0.265625 },\n { x: 0.484375, y: 0.265625 },\n { x: 0.484375, y: 0.265625 },\n { x: 0.515625, y: 0.265625 },\n { x: 0.515625, y: 0.265625 },\n { x: 0.546875, y: 0.265625 },\n { x: 0.546875, y: 0.265625 },\n { x: 0.578125, y: 0.265625 },\n { x: 0.578125, y: 0.265625 },\n { x: 0.609375, y: 0.265625 },\n { x: 0.609375, y: 0.265625 },\n { x: 0.640625, y: 0.265625 },\n { x: 0.640625, y: 0.265625 },\n { x: 0.671875, y: 0.265625 },\n { x: 0.671875, y: 0.265625 },\n { x: 0.703125, y: 0.265625 },\n { x: 0.703125, y: 0.265625 },\n { x: 0.734375, y: 0.265625 },\n { x: 0.734375, y: 0.265625 },\n { x: 0.765625, y: 0.265625 },\n { x: 0.765625, y: 0.265625 },\n { x: 0.796875, y: 0.265625 },\n { x: 0.796875, y: 0.265625 },\n { x: 0.828125, y: 0.265625 },\n { x: 0.828125, y: 0.265625 },\n { x: 0.859375, y: 0.265625 },\n { x: 0.859375, y: 0.265625 },\n { x: 0.890625, y: 0.265625 },\n { x: 0.890625, y: 0.265625 },\n { x: 0.921875, y: 0.265625 },\n { x: 0.921875, y: 0.265625 },\n { x: 0.953125, y: 0.265625 },\n { x: 0.953125, y: 0.265625 },\n { x: 0.984375, y: 0.265625 },\n { x: 0.984375, y: 0.265625 },\n { x: 0.015625, y: 0.296875 },\n { x: 0.015625, y: 0.296875 },\n { x: 0.046875, y: 0.296875 },\n { x: 0.046875, y: 0.296875 },\n { x: 0.078125, y: 0.296875 },\n { x: 0.078125, y: 0.296875 },\n { x: 0.109375, y: 0.296875 },\n { x: 0.109375, y: 0.296875 },\n { x: 0.140625, y: 0.296875 },\n { x: 0.140625, y: 0.296875 },\n { x: 0.171875, y: 0.296875 },\n { x: 0.171875, y: 0.296875 },\n { x: 0.203125, y: 0.296875 },\n { x: 0.203125, y: 0.296875 },\n { x: 0.234375, y: 0.296875 },\n { x: 0.234375, y: 0.296875 },\n { x: 0.265625, y: 0.296875 },\n { x: 0.265625, y: 0.296875 },\n { x: 0.296875, y: 0.296875 },\n { x: 0.296875, y: 0.296875 },\n { x: 0.328125, y: 0.296875 },\n { x: 0.328125, y: 0.296875 },\n { x: 0.359375, y: 0.296875 },\n { x: 0.359375, y: 0.296875 },\n { x: 0.390625, y: 0.296875 },\n { x: 0.390625, y: 0.296875 },\n { x: 0.421875, y: 0.296875 },\n { x: 0.421875, y: 0.296875 },\n { x: 0.453125, y: 0.296875 },\n { x: 0.453125, y: 0.296875 },\n { x: 0.484375, y: 0.296875 },\n { x: 0.484375, y: 0.296875 },\n { x: 0.515625, y: 0.296875 },\n { x: 0.515625, y: 0.296875 },\n { x: 0.546875, y: 0.296875 },\n { x: 0.546875, y: 0.296875 },\n { x: 0.578125, y: 0.296875 },\n { x: 0.578125, y: 0.296875 },\n { x: 0.609375, y: 0.296875 },\n { x: 0.609375, y: 0.296875 },\n { x: 0.640625, y: 0.296875 },\n { x: 0.640625, y: 0.296875 },\n { x: 0.671875, y: 0.296875 },\n { x: 0.671875, y: 0.296875 },\n { x: 0.703125, y: 0.296875 },\n { x: 0.703125, y: 0.296875 },\n { x: 0.734375, y: 0.296875 },\n { x: 0.734375, y: 0.296875 },\n { x: 0.765625, y: 0.296875 },\n { x: 0.765625, y: 0.296875 },\n { x: 0.796875, y: 0.296875 },\n { x: 0.796875, y: 0.296875 },\n { x: 0.828125, y: 0.296875 },\n { x: 0.828125, y: 0.296875 },\n { x: 0.859375, y: 0.296875 },\n { x: 0.859375, y: 0.296875 },\n { x: 0.890625, y: 0.296875 },\n { x: 0.890625, y: 0.296875 },\n { x: 0.921875, y: 0.296875 },\n { x: 0.921875, y: 0.296875 },\n { x: 0.953125, y: 0.296875 },\n { x: 0.953125, y: 0.296875 },\n { x: 0.984375, y: 0.296875 },\n { x: 0.984375, y: 0.296875 },\n { x: 0.015625, y: 0.328125 },\n { x: 0.015625, y: 0.328125 },\n { x: 0.046875, y: 0.328125 },\n { x: 0.046875, y: 0.328125 },\n { x: 0.078125, y: 0.328125 },\n { x: 0.078125, y: 0.328125 },\n { x: 0.109375, y: 0.328125 },\n { x: 0.109375, y: 0.328125 },\n { x: 0.140625, y: 0.328125 },\n { x: 0.140625, y: 0.328125 },\n { x: 0.171875, y: 0.328125 },\n { x: 0.171875, y: 0.328125 },\n { x: 0.203125, y: 0.328125 },\n { x: 0.203125, y: 0.328125 },\n { x: 0.234375, y: 0.328125 },\n { x: 0.234375, y: 0.328125 },\n { x: 0.265625, y: 0.328125 },\n { x: 0.265625, y: 0.328125 },\n { x: 0.296875, y: 0.328125 },\n { x: 0.296875, y: 0.328125 },\n { x: 0.328125, y: 0.328125 },\n { x: 0.328125, y: 0.328125 },\n { x: 0.359375, y: 0.328125 },\n { x: 0.359375, y: 0.328125 },\n { x: 0.390625, y: 0.328125 },\n { x: 0.390625, y: 0.328125 },\n { x: 0.421875, y: 0.328125 },\n { x: 0.421875, y: 0.328125 },\n { x: 0.453125, y: 0.328125 },\n { x: 0.453125, y: 0.328125 },\n { x: 0.484375, y: 0.328125 },\n { x: 0.484375, y: 0.328125 },\n { x: 0.515625, y: 0.328125 },\n { x: 0.515625, y: 0.328125 },\n { x: 0.546875, y: 0.328125 },\n { x: 0.546875, y: 0.328125 },\n { x: 0.578125, y: 0.328125 },\n { x: 0.578125, y: 0.328125 },\n { x: 0.609375, y: 0.328125 },\n { x: 0.609375, y: 0.328125 },\n { x: 0.640625, y: 0.328125 },\n { x: 0.640625, y: 0.328125 },\n { x: 0.671875, y: 0.328125 },\n { x: 0.671875, y: 0.328125 },\n { x: 0.703125, y: 0.328125 },\n { x: 0.703125, y: 0.328125 },\n { x: 0.734375, y: 0.328125 },\n { x: 0.734375, y: 0.328125 },\n { x: 0.765625, y: 0.328125 },\n { x: 0.765625, y: 0.328125 },\n { x: 0.796875, y: 0.328125 },\n { x: 0.796875, y: 0.328125 },\n { x: 0.828125, y: 0.328125 },\n { x: 0.828125, y: 0.328125 },\n { x: 0.859375, y: 0.328125 },\n { x: 0.859375, y: 0.328125 },\n { x: 0.890625, y: 0.328125 },\n { x: 0.890625, y: 0.328125 },\n { x: 0.921875, y: 0.328125 },\n { x: 0.921875, y: 0.328125 },\n { x: 0.953125, y: 0.328125 },\n { x: 0.953125, y: 0.328125 },\n { x: 0.984375, y: 0.328125 },\n { x: 0.984375, y: 0.328125 },\n { x: 0.015625, y: 0.359375 },\n { x: 0.015625, y: 0.359375 },\n { x: 0.046875, y: 0.359375 },\n { x: 0.046875, y: 0.359375 },\n { x: 0.078125, y: 0.359375 },\n { x: 0.078125, y: 0.359375 },\n { x: 0.109375, y: 0.359375 },\n { x: 0.109375, y: 0.359375 },\n { x: 0.140625, y: 0.359375 },\n { x: 0.140625, y: 0.359375 },\n { x: 0.171875, y: 0.359375 },\n { x: 0.171875, y: 0.359375 },\n { x: 0.203125, y: 0.359375 },\n { x: 0.203125, y: 0.359375 },\n { x: 0.234375, y: 0.359375 },\n { x: 0.234375, y: 0.359375 },\n { x: 0.265625, y: 0.359375 },\n { x: 0.265625, y: 0.359375 },\n { x: 0.296875, y: 0.359375 },\n { x: 0.296875, y: 0.359375 },\n { x: 0.328125, y: 0.359375 },\n { x: 0.328125, y: 0.359375 },\n { x: 0.359375, y: 0.359375 },\n { x: 0.359375, y: 0.359375 },\n { x: 0.390625, y: 0.359375 },\n { x: 0.390625, y: 0.359375 },\n { x: 0.421875, y: 0.359375 },\n { x: 0.421875, y: 0.359375 },\n { x: 0.453125, y: 0.359375 },\n { x: 0.453125, y: 0.359375 },\n { x: 0.484375, y: 0.359375 },\n { x: 0.484375, y: 0.359375 },\n { x: 0.515625, y: 0.359375 },\n { x: 0.515625, y: 0.359375 },\n { x: 0.546875, y: 0.359375 },\n { x: 0.546875, y: 0.359375 },\n { x: 0.578125, y: 0.359375 },\n { x: 0.578125, y: 0.359375 },\n { x: 0.609375, y: 0.359375 },\n { x: 0.609375, y: 0.359375 },\n { x: 0.640625, y: 0.359375 },\n { x: 0.640625, y: 0.359375 },\n { x: 0.671875, y: 0.359375 },\n { x: 0.671875, y: 0.359375 },\n { x: 0.703125, y: 0.359375 },\n { x: 0.703125, y: 0.359375 },\n { x: 0.734375, y: 0.359375 },\n { x: 0.734375, y: 0.359375 },\n { x: 0.765625, y: 0.359375 },\n { x: 0.765625, y: 0.359375 },\n { x: 0.796875, y: 0.359375 },\n { x: 0.796875, y: 0.359375 },\n { x: 0.828125, y: 0.359375 },\n { x: 0.828125, y: 0.359375 },\n { x: 0.859375, y: 0.359375 },\n { x: 0.859375, y: 0.359375 },\n { x: 0.890625, y: 0.359375 },\n { x: 0.890625, y: 0.359375 },\n { x: 0.921875, y: 0.359375 },\n { x: 0.921875, y: 0.359375 },\n { x: 0.953125, y: 0.359375 },\n { x: 0.953125, y: 0.359375 },\n { x: 0.984375, y: 0.359375 },\n { x: 0.984375, y: 0.359375 },\n { x: 0.015625, y: 0.390625 },\n { x: 0.015625, y: 0.390625 },\n { x: 0.046875, y: 0.390625 },\n { x: 0.046875, y: 0.390625 },\n { x: 0.078125, y: 0.390625 },\n { x: 0.078125, y: 0.390625 },\n { x: 0.109375, y: 0.390625 },\n { x: 0.109375, y: 0.390625 },\n { x: 0.140625, y: 0.390625 },\n { x: 0.140625, y: 0.390625 },\n { x: 0.171875, y: 0.390625 },\n { x: 0.171875, y: 0.390625 },\n { x: 0.203125, y: 0.390625 },\n { x: 0.203125, y: 0.390625 },\n { x: 0.234375, y: 0.390625 },\n { x: 0.234375, y: 0.390625 },\n { x: 0.265625, y: 0.390625 },\n { x: 0.265625, y: 0.390625 },\n { x: 0.296875, y: 0.390625 },\n { x: 0.296875, y: 0.390625 },\n { x: 0.328125, y: 0.390625 },\n { x: 0.328125, y: 0.390625 },\n { x: 0.359375, y: 0.390625 },\n { x: 0.359375, y: 0.390625 },\n { x: 0.390625, y: 0.390625 },\n { x: 0.390625, y: 0.390625 },\n { x: 0.421875, y: 0.390625 },\n { x: 0.421875, y: 0.390625 },\n { x: 0.453125, y: 0.390625 },\n { x: 0.453125, y: 0.390625 },\n { x: 0.484375, y: 0.390625 },\n { x: 0.484375, y: 0.390625 },\n { x: 0.515625, y: 0.390625 },\n { x: 0.515625, y: 0.390625 },\n { x: 0.546875, y: 0.390625 },\n { x: 0.546875, y: 0.390625 },\n { x: 0.578125, y: 0.390625 },\n { x: 0.578125, y: 0.390625 },\n { x: 0.609375, y: 0.390625 },\n { x: 0.609375, y: 0.390625 },\n { x: 0.640625, y: 0.390625 },\n { x: 0.640625, y: 0.390625 },\n { x: 0.671875, y: 0.390625 },\n { x: 0.671875, y: 0.390625 },\n { x: 0.703125, y: 0.390625 },\n { x: 0.703125, y: 0.390625 },\n { x: 0.734375, y: 0.390625 },\n { x: 0.734375, y: 0.390625 },\n { x: 0.765625, y: 0.390625 },\n { x: 0.765625, y: 0.390625 },\n { x: 0.796875, y: 0.390625 },\n { x: 0.796875, y: 0.390625 },\n { x: 0.828125, y: 0.390625 },\n { x: 0.828125, y: 0.390625 },\n { x: 0.859375, y: 0.390625 },\n { x: 0.859375, y: 0.390625 },\n { x: 0.890625, y: 0.390625 },\n { x: 0.890625, y: 0.390625 },\n { x: 0.921875, y: 0.390625 },\n { x: 0.921875, y: 0.390625 },\n { x: 0.953125, y: 0.390625 },\n { x: 0.953125, y: 0.390625 },\n { x: 0.984375, y: 0.390625 },\n { x: 0.984375, y: 0.390625 },\n { x: 0.015625, y: 0.421875 },\n { x: 0.015625, y: 0.421875 },\n { x: 0.046875, y: 0.421875 },\n { x: 0.046875, y: 0.421875 },\n { x: 0.078125, y: 0.421875 },\n { x: 0.078125, y: 0.421875 },\n { x: 0.109375, y: 0.421875 },\n { x: 0.109375, y: 0.421875 },\n { x: 0.140625, y: 0.421875 },\n { x: 0.140625, y: 0.421875 },\n { x: 0.171875, y: 0.421875 },\n { x: 0.171875, y: 0.421875 },\n { x: 0.203125, y: 0.421875 },\n { x: 0.203125, y: 0.421875 },\n { x: 0.234375, y: 0.421875 },\n { x: 0.234375, y: 0.421875 },\n { x: 0.265625, y: 0.421875 },\n { x: 0.265625, y: 0.421875 },\n { x: 0.296875, y: 0.421875 },\n { x: 0.296875, y: 0.421875 },\n { x: 0.328125, y: 0.421875 },\n { x: 0.328125, y: 0.421875 },\n { x: 0.359375, y: 0.421875 },\n { x: 0.359375, y: 0.421875 },\n { x: 0.390625, y: 0.421875 },\n { x: 0.390625, y: 0.421875 },\n { x: 0.421875, y: 0.421875 },\n { x: 0.421875, y: 0.421875 },\n { x: 0.453125, y: 0.421875 },\n { x: 0.453125, y: 0.421875 },\n { x: 0.484375, y: 0.421875 },\n { x: 0.484375, y: 0.421875 },\n { x: 0.515625, y: 0.421875 },\n { x: 0.515625, y: 0.421875 },\n { x: 0.546875, y: 0.421875 },\n { x: 0.546875, y: 0.421875 },\n { x: 0.578125, y: 0.421875 },\n { x: 0.578125, y: 0.421875 },\n { x: 0.609375, y: 0.421875 },\n { x: 0.609375, y: 0.421875 },\n { x: 0.640625, y: 0.421875 },\n { x: 0.640625, y: 0.421875 },\n { x: 0.671875, y: 0.421875 },\n { x: 0.671875, y: 0.421875 },\n { x: 0.703125, y: 0.421875 },\n { x: 0.703125, y: 0.421875 },\n { x: 0.734375, y: 0.421875 },\n { x: 0.734375, y: 0.421875 },\n { x: 0.765625, y: 0.421875 },\n { x: 0.765625, y: 0.421875 },\n { x: 0.796875, y: 0.421875 },\n { x: 0.796875, y: 0.421875 },\n { x: 0.828125, y: 0.421875 },\n { x: 0.828125, y: 0.421875 },\n { x: 0.859375, y: 0.421875 },\n { x: 0.859375, y: 0.421875 },\n { x: 0.890625, y: 0.421875 },\n { x: 0.890625, y: 0.421875 },\n { x: 0.921875, y: 0.421875 },\n { x: 0.921875, y: 0.421875 },\n { x: 0.953125, y: 0.421875 },\n { x: 0.953125, y: 0.421875 },\n { x: 0.984375, y: 0.421875 },\n { x: 0.984375, y: 0.421875 },\n { x: 0.015625, y: 0.453125 },\n { x: 0.015625, y: 0.453125 },\n { x: 0.046875, y: 0.453125 },\n { x: 0.046875, y: 0.453125 },\n { x: 0.078125, y: 0.453125 },\n { x: 0.078125, y: 0.453125 },\n { x: 0.109375, y: 0.453125 },\n { x: 0.109375, y: 0.453125 },\n { x: 0.140625, y: 0.453125 },\n { x: 0.140625, y: 0.453125 },\n { x: 0.171875, y: 0.453125 },\n { x: 0.171875, y: 0.453125 },\n { x: 0.203125, y: 0.453125 },\n { x: 0.203125, y: 0.453125 },\n { x: 0.234375, y: 0.453125 },\n { x: 0.234375, y: 0.453125 },\n { x: 0.265625, y: 0.453125 },\n { x: 0.265625, y: 0.453125 },\n { x: 0.296875, y: 0.453125 },\n { x: 0.296875, y: 0.453125 },\n { x: 0.328125, y: 0.453125 },\n { x: 0.328125, y: 0.453125 },\n { x: 0.359375, y: 0.453125 },\n { x: 0.359375, y: 0.453125 },\n { x: 0.390625, y: 0.453125 },\n { x: 0.390625, y: 0.453125 },\n { x: 0.421875, y: 0.453125 },\n { x: 0.421875, y: 0.453125 },\n { x: 0.453125, y: 0.453125 },\n { x: 0.453125, y: 0.453125 },\n { x: 0.484375, y: 0.453125 },\n { x: 0.484375, y: 0.453125 },\n { x: 0.515625, y: 0.453125 },\n { x: 0.515625, y: 0.453125 },\n { x: 0.546875, y: 0.453125 },\n { x: 0.546875, y: 0.453125 },\n { x: 0.578125, y: 0.453125 },\n { x: 0.578125, y: 0.453125 },\n { x: 0.609375, y: 0.453125 },\n { x: 0.609375, y: 0.453125 },\n { x: 0.640625, y: 0.453125 },\n { x: 0.640625, y: 0.453125 },\n { x: 0.671875, y: 0.453125 },\n { x: 0.671875, y: 0.453125 },\n { x: 0.703125, y: 0.453125 },\n { x: 0.703125, y: 0.453125 },\n { x: 0.734375, y: 0.453125 },\n { x: 0.734375, y: 0.453125 },\n { x: 0.765625, y: 0.453125 },\n { x: 0.765625, y: 0.453125 },\n { x: 0.796875, y: 0.453125 },\n { x: 0.796875, y: 0.453125 },\n { x: 0.828125, y: 0.453125 },\n { x: 0.828125, y: 0.453125 },\n { x: 0.859375, y: 0.453125 },\n { x: 0.859375, y: 0.453125 },\n { x: 0.890625, y: 0.453125 },\n { x: 0.890625, y: 0.453125 },\n { x: 0.921875, y: 0.453125 },\n { x: 0.921875, y: 0.453125 },\n { x: 0.953125, y: 0.453125 },\n { x: 0.953125, y: 0.453125 },\n { x: 0.984375, y: 0.453125 },\n { x: 0.984375, y: 0.453125 },\n { x: 0.015625, y: 0.484375 },\n { x: 0.015625, y: 0.484375 },\n { x: 0.046875, y: 0.484375 },\n { x: 0.046875, y: 0.484375 },\n { x: 0.078125, y: 0.484375 },\n { x: 0.078125, y: 0.484375 },\n { x: 0.109375, y: 0.484375 },\n { x: 0.109375, y: 0.484375 },\n { x: 0.140625, y: 0.484375 },\n { x: 0.140625, y: 0.484375 },\n { x: 0.171875, y: 0.484375 },\n { x: 0.171875, y: 0.484375 },\n { x: 0.203125, y: 0.484375 },\n { x: 0.203125, y: 0.484375 },\n { x: 0.234375, y: 0.484375 },\n { x: 0.234375, y: 0.484375 },\n { x: 0.265625, y: 0.484375 },\n { x: 0.265625, y: 0.484375 },\n { x: 0.296875, y: 0.484375 },\n { x: 0.296875, y: 0.484375 },\n { x: 0.328125, y: 0.484375 },\n { x: 0.328125, y: 0.484375 },\n { x: 0.359375, y: 0.484375 },\n { x: 0.359375, y: 0.484375 },\n { x: 0.390625, y: 0.484375 },\n { x: 0.390625, y: 0.484375 },\n { x: 0.421875, y: 0.484375 },\n { x: 0.421875, y: 0.484375 },\n { x: 0.453125, y: 0.484375 },\n { x: 0.453125, y: 0.484375 },\n { x: 0.484375, y: 0.484375 },\n { x: 0.484375, y: 0.484375 },\n { x: 0.515625, y: 0.484375 },\n { x: 0.515625, y: 0.484375 },\n { x: 0.546875, y: 0.484375 },\n { x: 0.546875, y: 0.484375 },\n { x: 0.578125, y: 0.484375 },\n { x: 0.578125, y: 0.484375 },\n { x: 0.609375, y: 0.484375 },\n { x: 0.609375, y: 0.484375 },\n { x: 0.640625, y: 0.484375 },\n { x: 0.640625, y: 0.484375 },\n { x: 0.671875, y: 0.484375 },\n { x: 0.671875, y: 0.484375 },\n { x: 0.703125, y: 0.484375 },\n { x: 0.703125, y: 0.484375 },\n { x: 0.734375, y: 0.484375 },\n { x: 0.734375, y: 0.484375 },\n { x: 0.765625, y: 0.484375 },\n { x: 0.765625, y: 0.484375 },\n { x: 0.796875, y: 0.484375 },\n { x: 0.796875, y: 0.484375 },\n { x: 0.828125, y: 0.484375 },\n { x: 0.828125, y: 0.484375 },\n { x: 0.859375, y: 0.484375 },\n { x: 0.859375, y: 0.484375 },\n { x: 0.890625, y: 0.484375 },\n { x: 0.890625, y: 0.484375 },\n { x: 0.921875, y: 0.484375 },\n { x: 0.921875, y: 0.484375 },\n { x: 0.953125, y: 0.484375 },\n { x: 0.953125, y: 0.484375 },\n { x: 0.984375, y: 0.484375 },\n { x: 0.984375, y: 0.484375 },\n { x: 0.015625, y: 0.515625 },\n { x: 0.015625, y: 0.515625 },\n { x: 0.046875, y: 0.515625 },\n { x: 0.046875, y: 0.515625 },\n { x: 0.078125, y: 0.515625 },\n { x: 0.078125, y: 0.515625 },\n { x: 0.109375, y: 0.515625 },\n { x: 0.109375, y: 0.515625 },\n { x: 0.140625, y: 0.515625 },\n { x: 0.140625, y: 0.515625 },\n { x: 0.171875, y: 0.515625 },\n { x: 0.171875, y: 0.515625 },\n { x: 0.203125, y: 0.515625 },\n { x: 0.203125, y: 0.515625 },\n { x: 0.234375, y: 0.515625 },\n { x: 0.234375, y: 0.515625 },\n { x: 0.265625, y: 0.515625 },\n { x: 0.265625, y: 0.515625 },\n { x: 0.296875, y: 0.515625 },\n { x: 0.296875, y: 0.515625 },\n { x: 0.328125, y: 0.515625 },\n { x: 0.328125, y: 0.515625 },\n { x: 0.359375, y: 0.515625 },\n { x: 0.359375, y: 0.515625 },\n { x: 0.390625, y: 0.515625 },\n { x: 0.390625, y: 0.515625 },\n { x: 0.421875, y: 0.515625 },\n { x: 0.421875, y: 0.515625 },\n { x: 0.453125, y: 0.515625 },\n { x: 0.453125, y: 0.515625 },\n { x: 0.484375, y: 0.515625 },\n { x: 0.484375, y: 0.515625 },\n { x: 0.515625, y: 0.515625 },\n { x: 0.515625, y: 0.515625 },\n { x: 0.546875, y: 0.515625 },\n { x: 0.546875, y: 0.515625 },\n { x: 0.578125, y: 0.515625 },\n { x: 0.578125, y: 0.515625 },\n { x: 0.609375, y: 0.515625 },\n { x: 0.609375, y: 0.515625 },\n { x: 0.640625, y: 0.515625 },\n { x: 0.640625, y: 0.515625 },\n { x: 0.671875, y: 0.515625 },\n { x: 0.671875, y: 0.515625 },\n { x: 0.703125, y: 0.515625 },\n { x: 0.703125, y: 0.515625 },\n { x: 0.734375, y: 0.515625 },\n { x: 0.734375, y: 0.515625 },\n { x: 0.765625, y: 0.515625 },\n { x: 0.765625, y: 0.515625 },\n { x: 0.796875, y: 0.515625 },\n { x: 0.796875, y: 0.515625 },\n { x: 0.828125, y: 0.515625 },\n { x: 0.828125, y: 0.515625 },\n { x: 0.859375, y: 0.515625 },\n { x: 0.859375, y: 0.515625 },\n { x: 0.890625, y: 0.515625 },\n { x: 0.890625, y: 0.515625 },\n { x: 0.921875, y: 0.515625 },\n { x: 0.921875, y: 0.515625 },\n { x: 0.953125, y: 0.515625 },\n { x: 0.953125, y: 0.515625 },\n { x: 0.984375, y: 0.515625 },\n { x: 0.984375, y: 0.515625 },\n { x: 0.015625, y: 0.546875 },\n { x: 0.015625, y: 0.546875 },\n { x: 0.046875, y: 0.546875 },\n { x: 0.046875, y: 0.546875 },\n { x: 0.078125, y: 0.546875 },\n { x: 0.078125, y: 0.546875 },\n { x: 0.109375, y: 0.546875 },\n { x: 0.109375, y: 0.546875 },\n { x: 0.140625, y: 0.546875 },\n { x: 0.140625, y: 0.546875 },\n { x: 0.171875, y: 0.546875 },\n { x: 0.171875, y: 0.546875 },\n { x: 0.203125, y: 0.546875 },\n { x: 0.203125, y: 0.546875 },\n { x: 0.234375, y: 0.546875 },\n { x: 0.234375, y: 0.546875 },\n { x: 0.265625, y: 0.546875 },\n { x: 0.265625, y: 0.546875 },\n { x: 0.296875, y: 0.546875 },\n { x: 0.296875, y: 0.546875 },\n { x: 0.328125, y: 0.546875 },\n { x: 0.328125, y: 0.546875 },\n { x: 0.359375, y: 0.546875 },\n { x: 0.359375, y: 0.546875 },\n { x: 0.390625, y: 0.546875 },\n { x: 0.390625, y: 0.546875 },\n { x: 0.421875, y: 0.546875 },\n { x: 0.421875, y: 0.546875 },\n { x: 0.453125, y: 0.546875 },\n { x: 0.453125, y: 0.546875 },\n { x: 0.484375, y: 0.546875 },\n { x: 0.484375, y: 0.546875 },\n { x: 0.515625, y: 0.546875 },\n { x: 0.515625, y: 0.546875 },\n { x: 0.546875, y: 0.546875 },\n { x: 0.546875, y: 0.546875 },\n { x: 0.578125, y: 0.546875 },\n { x: 0.578125, y: 0.546875 },\n { x: 0.609375, y: 0.546875 },\n { x: 0.609375, y: 0.546875 },\n { x: 0.640625, y: 0.546875 },\n { x: 0.640625, y: 0.546875 },\n { x: 0.671875, y: 0.546875 },\n { x: 0.671875, y: 0.546875 },\n { x: 0.703125, y: 0.546875 },\n { x: 0.703125, y: 0.546875 },\n { x: 0.734375, y: 0.546875 },\n { x: 0.734375, y: 0.546875 },\n { x: 0.765625, y: 0.546875 },\n { x: 0.765625, y: 0.546875 },\n { x: 0.796875, y: 0.546875 },\n { x: 0.796875, y: 0.546875 },\n { x: 0.828125, y: 0.546875 },\n { x: 0.828125, y: 0.546875 },\n { x: 0.859375, y: 0.546875 },\n { x: 0.859375, y: 0.546875 },\n { x: 0.890625, y: 0.546875 },\n { x: 0.890625, y: 0.546875 },\n { x: 0.921875, y: 0.546875 },\n { x: 0.921875, y: 0.546875 },\n { x: 0.953125, y: 0.546875 },\n { x: 0.953125, y: 0.546875 },\n { x: 0.984375, y: 0.546875 },\n { x: 0.984375, y: 0.546875 },\n { x: 0.015625, y: 0.578125 },\n { x: 0.015625, y: 0.578125 },\n { x: 0.046875, y: 0.578125 },\n { x: 0.046875, y: 0.578125 },\n { x: 0.078125, y: 0.578125 },\n { x: 0.078125, y: 0.578125 },\n { x: 0.109375, y: 0.578125 },\n { x: 0.109375, y: 0.578125 },\n { x: 0.140625, y: 0.578125 },\n { x: 0.140625, y: 0.578125 },\n { x: 0.171875, y: 0.578125 },\n { x: 0.171875, y: 0.578125 },\n { x: 0.203125, y: 0.578125 },\n { x: 0.203125, y: 0.578125 },\n { x: 0.234375, y: 0.578125 },\n { x: 0.234375, y: 0.578125 },\n { x: 0.265625, y: 0.578125 },\n { x: 0.265625, y: 0.578125 },\n { x: 0.296875, y: 0.578125 },\n { x: 0.296875, y: 0.578125 },\n { x: 0.328125, y: 0.578125 },\n { x: 0.328125, y: 0.578125 },\n { x: 0.359375, y: 0.578125 },\n { x: 0.359375, y: 0.578125 },\n { x: 0.390625, y: 0.578125 },\n { x: 0.390625, y: 0.578125 },\n { x: 0.421875, y: 0.578125 },\n { x: 0.421875, y: 0.578125 },\n { x: 0.453125, y: 0.578125 },\n { x: 0.453125, y: 0.578125 },\n { x: 0.484375, y: 0.578125 },\n { x: 0.484375, y: 0.578125 },\n { x: 0.515625, y: 0.578125 },\n { x: 0.515625, y: 0.578125 },\n { x: 0.546875, y: 0.578125 },\n { x: 0.546875, y: 0.578125 },\n { x: 0.578125, y: 0.578125 },\n { x: 0.578125, y: 0.578125 },\n { x: 0.609375, y: 0.578125 },\n { x: 0.609375, y: 0.578125 },\n { x: 0.640625, y: 0.578125 },\n { x: 0.640625, y: 0.578125 },\n { x: 0.671875, y: 0.578125 },\n { x: 0.671875, y: 0.578125 },\n { x: 0.703125, y: 0.578125 },\n { x: 0.703125, y: 0.578125 },\n { x: 0.734375, y: 0.578125 },\n { x: 0.734375, y: 0.578125 },\n { x: 0.765625, y: 0.578125 },\n { x: 0.765625, y: 0.578125 },\n { x: 0.796875, y: 0.578125 },\n { x: 0.796875, y: 0.578125 },\n { x: 0.828125, y: 0.578125 },\n { x: 0.828125, y: 0.578125 },\n { x: 0.859375, y: 0.578125 },\n { x: 0.859375, y: 0.578125 },\n { x: 0.890625, y: 0.578125 },\n { x: 0.890625, y: 0.578125 },\n { x: 0.921875, y: 0.578125 },\n { x: 0.921875, y: 0.578125 },\n { x: 0.953125, y: 0.578125 },\n { x: 0.953125, y: 0.578125 },\n { x: 0.984375, y: 0.578125 },\n { x: 0.984375, y: 0.578125 },\n { x: 0.015625, y: 0.609375 },\n { x: 0.015625, y: 0.609375 },\n { x: 0.046875, y: 0.609375 },\n { x: 0.046875, y: 0.609375 },\n { x: 0.078125, y: 0.609375 },\n { x: 0.078125, y: 0.609375 },\n { x: 0.109375, y: 0.609375 },\n { x: 0.109375, y: 0.609375 },\n { x: 0.140625, y: 0.609375 },\n { x: 0.140625, y: 0.609375 },\n { x: 0.171875, y: 0.609375 },\n { x: 0.171875, y: 0.609375 },\n { x: 0.203125, y: 0.609375 },\n { x: 0.203125, y: 0.609375 },\n { x: 0.234375, y: 0.609375 },\n { x: 0.234375, y: 0.609375 },\n { x: 0.265625, y: 0.609375 },\n { x: 0.265625, y: 0.609375 },\n { x: 0.296875, y: 0.609375 },\n { x: 0.296875, y: 0.609375 },\n { x: 0.328125, y: 0.609375 },\n { x: 0.328125, y: 0.609375 },\n { x: 0.359375, y: 0.609375 },\n { x: 0.359375, y: 0.609375 },\n { x: 0.390625, y: 0.609375 },\n { x: 0.390625, y: 0.609375 },\n { x: 0.421875, y: 0.609375 },\n { x: 0.421875, y: 0.609375 },\n { x: 0.453125, y: 0.609375 },\n { x: 0.453125, y: 0.609375 },\n { x: 0.484375, y: 0.609375 },\n { x: 0.484375, y: 0.609375 },\n { x: 0.515625, y: 0.609375 },\n { x: 0.515625, y: 0.609375 },\n { x: 0.546875, y: 0.609375 },\n { x: 0.546875, y: 0.609375 },\n { x: 0.578125, y: 0.609375 },\n { x: 0.578125, y: 0.609375 },\n { x: 0.609375, y: 0.609375 },\n { x: 0.609375, y: 0.609375 },\n { x: 0.640625, y: 0.609375 },\n { x: 0.640625, y: 0.609375 },\n { x: 0.671875, y: 0.609375 },\n { x: 0.671875, y: 0.609375 },\n { x: 0.703125, y: 0.609375 },\n { x: 0.703125, y: 0.609375 },\n { x: 0.734375, y: 0.609375 },\n { x: 0.734375, y: 0.609375 },\n { x: 0.765625, y: 0.609375 },\n { x: 0.765625, y: 0.609375 },\n { x: 0.796875, y: 0.609375 },\n { x: 0.796875, y: 0.609375 },\n { x: 0.828125, y: 0.609375 },\n { x: 0.828125, y: 0.609375 },\n { x: 0.859375, y: 0.609375 },\n { x: 0.859375, y: 0.609375 },\n { x: 0.890625, y: 0.609375 },\n { x: 0.890625, y: 0.609375 },\n { x: 0.921875, y: 0.609375 },\n { x: 0.921875, y: 0.609375 },\n { x: 0.953125, y: 0.609375 },\n { x: 0.953125, y: 0.609375 },\n { x: 0.984375, y: 0.609375 },\n { x: 0.984375, y: 0.609375 },\n { x: 0.015625, y: 0.640625 },\n { x: 0.015625, y: 0.640625 },\n { x: 0.046875, y: 0.640625 },\n { x: 0.046875, y: 0.640625 },\n { x: 0.078125, y: 0.640625 },\n { x: 0.078125, y: 0.640625 },\n { x: 0.109375, y: 0.640625 },\n { x: 0.109375, y: 0.640625 },\n { x: 0.140625, y: 0.640625 },\n { x: 0.140625, y: 0.640625 },\n { x: 0.171875, y: 0.640625 },\n { x: 0.171875, y: 0.640625 },\n { x: 0.203125, y: 0.640625 },\n { x: 0.203125, y: 0.640625 },\n { x: 0.234375, y: 0.640625 },\n { x: 0.234375, y: 0.640625 },\n { x: 0.265625, y: 0.640625 },\n { x: 0.265625, y: 0.640625 },\n { x: 0.296875, y: 0.640625 },\n { x: 0.296875, y: 0.640625 },\n { x: 0.328125, y: 0.640625 },\n { x: 0.328125, y: 0.640625 },\n { x: 0.359375, y: 0.640625 },\n { x: 0.359375, y: 0.640625 },\n { x: 0.390625, y: 0.640625 },\n { x: 0.390625, y: 0.640625 },\n { x: 0.421875, y: 0.640625 },\n { x: 0.421875, y: 0.640625 },\n { x: 0.453125, y: 0.640625 },\n { x: 0.453125, y: 0.640625 },\n { x: 0.484375, y: 0.640625 },\n { x: 0.484375, y: 0.640625 },\n { x: 0.515625, y: 0.640625 },\n { x: 0.515625, y: 0.640625 },\n { x: 0.546875, y: 0.640625 },\n { x: 0.546875, y: 0.640625 },\n { x: 0.578125, y: 0.640625 },\n { x: 0.578125, y: 0.640625 },\n { x: 0.609375, y: 0.640625 },\n { x: 0.609375, y: 0.640625 },\n { x: 0.640625, y: 0.640625 },\n { x: 0.640625, y: 0.640625 },\n { x: 0.671875, y: 0.640625 },\n { x: 0.671875, y: 0.640625 },\n { x: 0.703125, y: 0.640625 },\n { x: 0.703125, y: 0.640625 },\n { x: 0.734375, y: 0.640625 },\n { x: 0.734375, y: 0.640625 },\n { x: 0.765625, y: 0.640625 },\n { x: 0.765625, y: 0.640625 },\n { x: 0.796875, y: 0.640625 },\n { x: 0.796875, y: 0.640625 },\n { x: 0.828125, y: 0.640625 },\n { x: 0.828125, y: 0.640625 },\n { x: 0.859375, y: 0.640625 },\n { x: 0.859375, y: 0.640625 },\n { x: 0.890625, y: 0.640625 },\n { x: 0.890625, y: 0.640625 },\n { x: 0.921875, y: 0.640625 },\n { x: 0.921875, y: 0.640625 },\n { x: 0.953125, y: 0.640625 },\n { x: 0.953125, y: 0.640625 },\n { x: 0.984375, y: 0.640625 },\n { x: 0.984375, y: 0.640625 },\n { x: 0.015625, y: 0.671875 },\n { x: 0.015625, y: 0.671875 },\n { x: 0.046875, y: 0.671875 },\n { x: 0.046875, y: 0.671875 },\n { x: 0.078125, y: 0.671875 },\n { x: 0.078125, y: 0.671875 },\n { x: 0.109375, y: 0.671875 },\n { x: 0.109375, y: 0.671875 },\n { x: 0.140625, y: 0.671875 },\n { x: 0.140625, y: 0.671875 },\n { x: 0.171875, y: 0.671875 },\n { x: 0.171875, y: 0.671875 },\n { x: 0.203125, y: 0.671875 },\n { x: 0.203125, y: 0.671875 },\n { x: 0.234375, y: 0.671875 },\n { x: 0.234375, y: 0.671875 },\n { x: 0.265625, y: 0.671875 },\n { x: 0.265625, y: 0.671875 },\n { x: 0.296875, y: 0.671875 },\n { x: 0.296875, y: 0.671875 },\n { x: 0.328125, y: 0.671875 },\n { x: 0.328125, y: 0.671875 },\n { x: 0.359375, y: 0.671875 },\n { x: 0.359375, y: 0.671875 },\n { x: 0.390625, y: 0.671875 },\n { x: 0.390625, y: 0.671875 },\n { x: 0.421875, y: 0.671875 },\n { x: 0.421875, y: 0.671875 },\n { x: 0.453125, y: 0.671875 },\n { x: 0.453125, y: 0.671875 },\n { x: 0.484375, y: 0.671875 },\n { x: 0.484375, y: 0.671875 },\n { x: 0.515625, y: 0.671875 },\n { x: 0.515625, y: 0.671875 },\n { x: 0.546875, y: 0.671875 },\n { x: 0.546875, y: 0.671875 },\n { x: 0.578125, y: 0.671875 },\n { x: 0.578125, y: 0.671875 },\n { x: 0.609375, y: 0.671875 },\n { x: 0.609375, y: 0.671875 },\n { x: 0.640625, y: 0.671875 },\n { x: 0.640625, y: 0.671875 },\n { x: 0.671875, y: 0.671875 },\n { x: 0.671875, y: 0.671875 },\n { x: 0.703125, y: 0.671875 },\n { x: 0.703125, y: 0.671875 },\n { x: 0.734375, y: 0.671875 },\n { x: 0.734375, y: 0.671875 },\n { x: 0.765625, y: 0.671875 },\n { x: 0.765625, y: 0.671875 },\n { x: 0.796875, y: 0.671875 },\n { x: 0.796875, y: 0.671875 },\n { x: 0.828125, y: 0.671875 },\n { x: 0.828125, y: 0.671875 },\n { x: 0.859375, y: 0.671875 },\n { x: 0.859375, y: 0.671875 },\n { x: 0.890625, y: 0.671875 },\n { x: 0.890625, y: 0.671875 },\n { x: 0.921875, y: 0.671875 },\n { x: 0.921875, y: 0.671875 },\n { x: 0.953125, y: 0.671875 },\n { x: 0.953125, y: 0.671875 },\n { x: 0.984375, y: 0.671875 },\n { x: 0.984375, y: 0.671875 },\n { x: 0.015625, y: 0.703125 },\n { x: 0.015625, y: 0.703125 },\n { x: 0.046875, y: 0.703125 },\n { x: 0.046875, y: 0.703125 },\n { x: 0.078125, y: 0.703125 },\n { x: 0.078125, y: 0.703125 },\n { x: 0.109375, y: 0.703125 },\n { x: 0.109375, y: 0.703125 },\n { x: 0.140625, y: 0.703125 },\n { x: 0.140625, y: 0.703125 },\n { x: 0.171875, y: 0.703125 },\n { x: 0.171875, y: 0.703125 },\n { x: 0.203125, y: 0.703125 },\n { x: 0.203125, y: 0.703125 },\n { x: 0.234375, y: 0.703125 },\n { x: 0.234375, y: 0.703125 },\n { x: 0.265625, y: 0.703125 },\n { x: 0.265625, y: 0.703125 },\n { x: 0.296875, y: 0.703125 },\n { x: 0.296875, y: 0.703125 },\n { x: 0.328125, y: 0.703125 },\n { x: 0.328125, y: 0.703125 },\n { x: 0.359375, y: 0.703125 },\n { x: 0.359375, y: 0.703125 },\n { x: 0.390625, y: 0.703125 },\n { x: 0.390625, y: 0.703125 },\n { x: 0.421875, y: 0.703125 },\n { x: 0.421875, y: 0.703125 },\n { x: 0.453125, y: 0.703125 },\n { x: 0.453125, y: 0.703125 },\n { x: 0.484375, y: 0.703125 },\n { x: 0.484375, y: 0.703125 },\n { x: 0.515625, y: 0.703125 },\n { x: 0.515625, y: 0.703125 },\n { x: 0.546875, y: 0.703125 },\n { x: 0.546875, y: 0.703125 },\n { x: 0.578125, y: 0.703125 },\n { x: 0.578125, y: 0.703125 },\n { x: 0.609375, y: 0.703125 },\n { x: 0.609375, y: 0.703125 },\n { x: 0.640625, y: 0.703125 },\n { x: 0.640625, y: 0.703125 },\n { x: 0.671875, y: 0.703125 },\n { x: 0.671875, y: 0.703125 },\n { x: 0.703125, y: 0.703125 },\n { x: 0.703125, y: 0.703125 },\n { x: 0.734375, y: 0.703125 },\n { x: 0.734375, y: 0.703125 },\n { x: 0.765625, y: 0.703125 },\n { x: 0.765625, y: 0.703125 },\n { x: 0.796875, y: 0.703125 },\n { x: 0.796875, y: 0.703125 },\n { x: 0.828125, y: 0.703125 },\n { x: 0.828125, y: 0.703125 },\n { x: 0.859375, y: 0.703125 },\n { x: 0.859375, y: 0.703125 },\n { x: 0.890625, y: 0.703125 },\n { x: 0.890625, y: 0.703125 },\n { x: 0.921875, y: 0.703125 },\n { x: 0.921875, y: 0.703125 },\n { x: 0.953125, y: 0.703125 },\n { x: 0.953125, y: 0.703125 },\n { x: 0.984375, y: 0.703125 },\n { x: 0.984375, y: 0.703125 },\n { x: 0.015625, y: 0.734375 },\n { x: 0.015625, y: 0.734375 },\n { x: 0.046875, y: 0.734375 },\n { x: 0.046875, y: 0.734375 },\n { x: 0.078125, y: 0.734375 },\n { x: 0.078125, y: 0.734375 },\n { x: 0.109375, y: 0.734375 },\n { x: 0.109375, y: 0.734375 },\n { x: 0.140625, y: 0.734375 },\n { x: 0.140625, y: 0.734375 },\n { x: 0.171875, y: 0.734375 },\n { x: 0.171875, y: 0.734375 },\n { x: 0.203125, y: 0.734375 },\n { x: 0.203125, y: 0.734375 },\n { x: 0.234375, y: 0.734375 },\n { x: 0.234375, y: 0.734375 },\n { x: 0.265625, y: 0.734375 },\n { x: 0.265625, y: 0.734375 },\n { x: 0.296875, y: 0.734375 },\n { x: 0.296875, y: 0.734375 },\n { x: 0.328125, y: 0.734375 },\n { x: 0.328125, y: 0.734375 },\n { x: 0.359375, y: 0.734375 },\n { x: 0.359375, y: 0.734375 },\n { x: 0.390625, y: 0.734375 },\n { x: 0.390625, y: 0.734375 },\n { x: 0.421875, y: 0.734375 },\n { x: 0.421875, y: 0.734375 },\n { x: 0.453125, y: 0.734375 },\n { x: 0.453125, y: 0.734375 },\n { x: 0.484375, y: 0.734375 },\n { x: 0.484375, y: 0.734375 },\n { x: 0.515625, y: 0.734375 },\n { x: 0.515625, y: 0.734375 },\n { x: 0.546875, y: 0.734375 },\n { x: 0.546875, y: 0.734375 },\n { x: 0.578125, y: 0.734375 },\n { x: 0.578125, y: 0.734375 },\n { x: 0.609375, y: 0.734375 },\n { x: 0.609375, y: 0.734375 },\n { x: 0.640625, y: 0.734375 },\n { x: 0.640625, y: 0.734375 },\n { x: 0.671875, y: 0.734375 },\n { x: 0.671875, y: 0.734375 },\n { x: 0.703125, y: 0.734375 },\n { x: 0.703125, y: 0.734375 },\n { x: 0.734375, y: 0.734375 },\n { x: 0.734375, y: 0.734375 },\n { x: 0.765625, y: 0.734375 },\n { x: 0.765625, y: 0.734375 },\n { x: 0.796875, y: 0.734375 },\n { x: 0.796875, y: 0.734375 },\n { x: 0.828125, y: 0.734375 },\n { x: 0.828125, y: 0.734375 },\n { x: 0.859375, y: 0.734375 },\n { x: 0.859375, y: 0.734375 },\n { x: 0.890625, y: 0.734375 },\n { x: 0.890625, y: 0.734375 },\n { x: 0.921875, y: 0.734375 },\n { x: 0.921875, y: 0.734375 },\n { x: 0.953125, y: 0.734375 },\n { x: 0.953125, y: 0.734375 },\n { x: 0.984375, y: 0.734375 },\n { x: 0.984375, y: 0.734375 },\n { x: 0.015625, y: 0.765625 },\n { x: 0.015625, y: 0.765625 },\n { x: 0.046875, y: 0.765625 },\n { x: 0.046875, y: 0.765625 },\n { x: 0.078125, y: 0.765625 },\n { x: 0.078125, y: 0.765625 },\n { x: 0.109375, y: 0.765625 },\n { x: 0.109375, y: 0.765625 },\n { x: 0.140625, y: 0.765625 },\n { x: 0.140625, y: 0.765625 },\n { x: 0.171875, y: 0.765625 },\n { x: 0.171875, y: 0.765625 },\n { x: 0.203125, y: 0.765625 },\n { x: 0.203125, y: 0.765625 },\n { x: 0.234375, y: 0.765625 },\n { x: 0.234375, y: 0.765625 },\n { x: 0.265625, y: 0.765625 },\n { x: 0.265625, y: 0.765625 },\n { x: 0.296875, y: 0.765625 },\n { x: 0.296875, y: 0.765625 },\n { x: 0.328125, y: 0.765625 },\n { x: 0.328125, y: 0.765625 },\n { x: 0.359375, y: 0.765625 },\n { x: 0.359375, y: 0.765625 },\n { x: 0.390625, y: 0.765625 },\n { x: 0.390625, y: 0.765625 },\n { x: 0.421875, y: 0.765625 },\n { x: 0.421875, y: 0.765625 },\n { x: 0.453125, y: 0.765625 },\n { x: 0.453125, y: 0.765625 },\n { x: 0.484375, y: 0.765625 },\n { x: 0.484375, y: 0.765625 },\n { x: 0.515625, y: 0.765625 },\n { x: 0.515625, y: 0.765625 },\n { x: 0.546875, y: 0.765625 },\n { x: 0.546875, y: 0.765625 },\n { x: 0.578125, y: 0.765625 },\n { x: 0.578125, y: 0.765625 },\n { x: 0.609375, y: 0.765625 },\n { x: 0.609375, y: 0.765625 },\n { x: 0.640625, y: 0.765625 },\n { x: 0.640625, y: 0.765625 },\n { x: 0.671875, y: 0.765625 },\n { x: 0.671875, y: 0.765625 },\n { x: 0.703125, y: 0.765625 },\n { x: 0.703125, y: 0.765625 },\n { x: 0.734375, y: 0.765625 },\n { x: 0.734375, y: 0.765625 },\n { x: 0.765625, y: 0.765625 },\n { x: 0.765625, y: 0.765625 },\n { x: 0.796875, y: 0.765625 },\n { x: 0.796875, y: 0.765625 },\n { x: 0.828125, y: 0.765625 },\n { x: 0.828125, y: 0.765625 },\n { x: 0.859375, y: 0.765625 },\n { x: 0.859375, y: 0.765625 },\n { x: 0.890625, y: 0.765625 },\n { x: 0.890625, y: 0.765625 },\n { x: 0.921875, y: 0.765625 },\n { x: 0.921875, y: 0.765625 },\n { x: 0.953125, y: 0.765625 },\n { x: 0.953125, y: 0.765625 },\n { x: 0.984375, y: 0.765625 },\n { x: 0.984375, y: 0.765625 },\n { x: 0.015625, y: 0.796875 },\n { x: 0.015625, y: 0.796875 },\n { x: 0.046875, y: 0.796875 },\n { x: 0.046875, y: 0.796875 },\n { x: 0.078125, y: 0.796875 },\n { x: 0.078125, y: 0.796875 },\n { x: 0.109375, y: 0.796875 },\n { x: 0.109375, y: 0.796875 },\n { x: 0.140625, y: 0.796875 },\n { x: 0.140625, y: 0.796875 },\n { x: 0.171875, y: 0.796875 },\n { x: 0.171875, y: 0.796875 },\n { x: 0.203125, y: 0.796875 },\n { x: 0.203125, y: 0.796875 },\n { x: 0.234375, y: 0.796875 },\n { x: 0.234375, y: 0.796875 },\n { x: 0.265625, y: 0.796875 },\n { x: 0.265625, y: 0.796875 },\n { x: 0.296875, y: 0.796875 },\n { x: 0.296875, y: 0.796875 },\n { x: 0.328125, y: 0.796875 },\n { x: 0.328125, y: 0.796875 },\n { x: 0.359375, y: 0.796875 },\n { x: 0.359375, y: 0.796875 },\n { x: 0.390625, y: 0.796875 },\n { x: 0.390625, y: 0.796875 },\n { x: 0.421875, y: 0.796875 },\n { x: 0.421875, y: 0.796875 },\n { x: 0.453125, y: 0.796875 },\n { x: 0.453125, y: 0.796875 },\n { x: 0.484375, y: 0.796875 },\n { x: 0.484375, y: 0.796875 },\n { x: 0.515625, y: 0.796875 },\n { x: 0.515625, y: 0.796875 },\n { x: 0.546875, y: 0.796875 },\n { x: 0.546875, y: 0.796875 },\n { x: 0.578125, y: 0.796875 },\n { x: 0.578125, y: 0.796875 },\n { x: 0.609375, y: 0.796875 },\n { x: 0.609375, y: 0.796875 },\n { x: 0.640625, y: 0.796875 },\n { x: 0.640625, y: 0.796875 },\n { x: 0.671875, y: 0.796875 },\n { x: 0.671875, y: 0.796875 },\n { x: 0.703125, y: 0.796875 },\n { x: 0.703125, y: 0.796875 },\n { x: 0.734375, y: 0.796875 },\n { x: 0.734375, y: 0.796875 },\n { x: 0.765625, y: 0.796875 },\n { x: 0.765625, y: 0.796875 },\n { x: 0.796875, y: 0.796875 },\n { x: 0.796875, y: 0.796875 },\n { x: 0.828125, y: 0.796875 },\n { x: 0.828125, y: 0.796875 },\n { x: 0.859375, y: 0.796875 },\n { x: 0.859375, y: 0.796875 },\n { x: 0.890625, y: 0.796875 },\n { x: 0.890625, y: 0.796875 },\n { x: 0.921875, y: 0.796875 },\n { x: 0.921875, y: 0.796875 },\n { x: 0.953125, y: 0.796875 },\n { x: 0.953125, y: 0.796875 },\n { x: 0.984375, y: 0.796875 },\n { x: 0.984375, y: 0.796875 },\n { x: 0.015625, y: 0.828125 },\n { x: 0.015625, y: 0.828125 },\n { x: 0.046875, y: 0.828125 },\n { x: 0.046875, y: 0.828125 },\n { x: 0.078125, y: 0.828125 },\n { x: 0.078125, y: 0.828125 },\n { x: 0.109375, y: 0.828125 },\n { x: 0.109375, y: 0.828125 },\n { x: 0.140625, y: 0.828125 },\n { x: 0.140625, y: 0.828125 },\n { x: 0.171875, y: 0.828125 },\n { x: 0.171875, y: 0.828125 },\n { x: 0.203125, y: 0.828125 },\n { x: 0.203125, y: 0.828125 },\n { x: 0.234375, y: 0.828125 },\n { x: 0.234375, y: 0.828125 },\n { x: 0.265625, y: 0.828125 },\n { x: 0.265625, y: 0.828125 },\n { x: 0.296875, y: 0.828125 },\n { x: 0.296875, y: 0.828125 },\n { x: 0.328125, y: 0.828125 },\n { x: 0.328125, y: 0.828125 },\n { x: 0.359375, y: 0.828125 },\n { x: 0.359375, y: 0.828125 },\n { x: 0.390625, y: 0.828125 },\n { x: 0.390625, y: 0.828125 },\n { x: 0.421875, y: 0.828125 },\n { x: 0.421875, y: 0.828125 },\n { x: 0.453125, y: 0.828125 },\n { x: 0.453125, y: 0.828125 },\n { x: 0.484375, y: 0.828125 },\n { x: 0.484375, y: 0.828125 },\n { x: 0.515625, y: 0.828125 },\n { x: 0.515625, y: 0.828125 },\n { x: 0.546875, y: 0.828125 },\n { x: 0.546875, y: 0.828125 },\n { x: 0.578125, y: 0.828125 },\n { x: 0.578125, y: 0.828125 },\n { x: 0.609375, y: 0.828125 },\n { x: 0.609375, y: 0.828125 },\n { x: 0.640625, y: 0.828125 },\n { x: 0.640625, y: 0.828125 },\n { x: 0.671875, y: 0.828125 },\n { x: 0.671875, y: 0.828125 },\n { x: 0.703125, y: 0.828125 },\n { x: 0.703125, y: 0.828125 },\n { x: 0.734375, y: 0.828125 },\n { x: 0.734375, y: 0.828125 },\n { x: 0.765625, y: 0.828125 },\n { x: 0.765625, y: 0.828125 },\n { x: 0.796875, y: 0.828125 },\n { x: 0.796875, y: 0.828125 },\n { x: 0.828125, y: 0.828125 },\n { x: 0.828125, y: 0.828125 },\n { x: 0.859375, y: 0.828125 },\n { x: 0.859375, y: 0.828125 },\n { x: 0.890625, y: 0.828125 },\n { x: 0.890625, y: 0.828125 },\n { x: 0.921875, y: 0.828125 },\n { x: 0.921875, y: 0.828125 },\n { x: 0.953125, y: 0.828125 },\n { x: 0.953125, y: 0.828125 },\n { x: 0.984375, y: 0.828125 },\n { x: 0.984375, y: 0.828125 },\n { x: 0.015625, y: 0.859375 },\n { x: 0.015625, y: 0.859375 },\n { x: 0.046875, y: 0.859375 },\n { x: 0.046875, y: 0.859375 },\n { x: 0.078125, y: 0.859375 },\n { x: 0.078125, y: 0.859375 },\n { x: 0.109375, y: 0.859375 },\n { x: 0.109375, y: 0.859375 },\n { x: 0.140625, y: 0.859375 },\n { x: 0.140625, y: 0.859375 },\n { x: 0.171875, y: 0.859375 },\n { x: 0.171875, y: 0.859375 },\n { x: 0.203125, y: 0.859375 },\n { x: 0.203125, y: 0.859375 },\n { x: 0.234375, y: 0.859375 },\n { x: 0.234375, y: 0.859375 },\n { x: 0.265625, y: 0.859375 },\n { x: 0.265625, y: 0.859375 },\n { x: 0.296875, y: 0.859375 },\n { x: 0.296875, y: 0.859375 },\n { x: 0.328125, y: 0.859375 },\n { x: 0.328125, y: 0.859375 },\n { x: 0.359375, y: 0.859375 },\n { x: 0.359375, y: 0.859375 },\n { x: 0.390625, y: 0.859375 },\n { x: 0.390625, y: 0.859375 },\n { x: 0.421875, y: 0.859375 },\n { x: 0.421875, y: 0.859375 },\n { x: 0.453125, y: 0.859375 },\n { x: 0.453125, y: 0.859375 },\n { x: 0.484375, y: 0.859375 },\n { x: 0.484375, y: 0.859375 },\n { x: 0.515625, y: 0.859375 },\n { x: 0.515625, y: 0.859375 },\n { x: 0.546875, y: 0.859375 },\n { x: 0.546875, y: 0.859375 },\n { x: 0.578125, y: 0.859375 },\n { x: 0.578125, y: 0.859375 },\n { x: 0.609375, y: 0.859375 },\n { x: 0.609375, y: 0.859375 },\n { x: 0.640625, y: 0.859375 },\n { x: 0.640625, y: 0.859375 },\n { x: 0.671875, y: 0.859375 },\n { x: 0.671875, y: 0.859375 },\n { x: 0.703125, y: 0.859375 },\n { x: 0.703125, y: 0.859375 },\n { x: 0.734375, y: 0.859375 },\n { x: 0.734375, y: 0.859375 },\n { x: 0.765625, y: 0.859375 },\n { x: 0.765625, y: 0.859375 },\n { x: 0.796875, y: 0.859375 },\n { x: 0.796875, y: 0.859375 },\n { x: 0.828125, y: 0.859375 },\n { x: 0.828125, y: 0.859375 },\n { x: 0.859375, y: 0.859375 },\n { x: 0.859375, y: 0.859375 },\n { x: 0.890625, y: 0.859375 },\n { x: 0.890625, y: 0.859375 },\n { x: 0.921875, y: 0.859375 },\n { x: 0.921875, y: 0.859375 },\n { x: 0.953125, y: 0.859375 },\n { x: 0.953125, y: 0.859375 },\n { x: 0.984375, y: 0.859375 },\n { x: 0.984375, y: 0.859375 },\n { x: 0.015625, y: 0.890625 },\n { x: 0.015625, y: 0.890625 },\n { x: 0.046875, y: 0.890625 },\n { x: 0.046875, y: 0.890625 },\n { x: 0.078125, y: 0.890625 },\n { x: 0.078125, y: 0.890625 },\n { x: 0.109375, y: 0.890625 },\n { x: 0.109375, y: 0.890625 },\n { x: 0.140625, y: 0.890625 },\n { x: 0.140625, y: 0.890625 },\n { x: 0.171875, y: 0.890625 },\n { x: 0.171875, y: 0.890625 },\n { x: 0.203125, y: 0.890625 },\n { x: 0.203125, y: 0.890625 },\n { x: 0.234375, y: 0.890625 },\n { x: 0.234375, y: 0.890625 },\n { x: 0.265625, y: 0.890625 },\n { x: 0.265625, y: 0.890625 },\n { x: 0.296875, y: 0.890625 },\n { x: 0.296875, y: 0.890625 },\n { x: 0.328125, y: 0.890625 },\n { x: 0.328125, y: 0.890625 },\n { x: 0.359375, y: 0.890625 },\n { x: 0.359375, y: 0.890625 },\n { x: 0.390625, y: 0.890625 },\n { x: 0.390625, y: 0.890625 },\n { x: 0.421875, y: 0.890625 },\n { x: 0.421875, y: 0.890625 },\n { x: 0.453125, y: 0.890625 },\n { x: 0.453125, y: 0.890625 },\n { x: 0.484375, y: 0.890625 },\n { x: 0.484375, y: 0.890625 },\n { x: 0.515625, y: 0.890625 },\n { x: 0.515625, y: 0.890625 },\n { x: 0.546875, y: 0.890625 },\n { x: 0.546875, y: 0.890625 },\n { x: 0.578125, y: 0.890625 },\n { x: 0.578125, y: 0.890625 },\n { x: 0.609375, y: 0.890625 },\n { x: 0.609375, y: 0.890625 },\n { x: 0.640625, y: 0.890625 },\n { x: 0.640625, y: 0.890625 },\n { x: 0.671875, y: 0.890625 },\n { x: 0.671875, y: 0.890625 },\n { x: 0.703125, y: 0.890625 },\n { x: 0.703125, y: 0.890625 },\n { x: 0.734375, y: 0.890625 },\n { x: 0.734375, y: 0.890625 },\n { x: 0.765625, y: 0.890625 },\n { x: 0.765625, y: 0.890625 },\n { x: 0.796875, y: 0.890625 },\n { x: 0.796875, y: 0.890625 },\n { x: 0.828125, y: 0.890625 },\n { x: 0.828125, y: 0.890625 },\n { x: 0.859375, y: 0.890625 },\n { x: 0.859375, y: 0.890625 },\n { x: 0.890625, y: 0.890625 },\n { x: 0.890625, y: 0.890625 },\n { x: 0.921875, y: 0.890625 },\n { x: 0.921875, y: 0.890625 },\n { x: 0.953125, y: 0.890625 },\n { x: 0.953125, y: 0.890625 },\n { x: 0.984375, y: 0.890625 },\n { x: 0.984375, y: 0.890625 },\n { x: 0.015625, y: 0.921875 },\n { x: 0.015625, y: 0.921875 },\n { x: 0.046875, y: 0.921875 },\n { x: 0.046875, y: 0.921875 },\n { x: 0.078125, y: 0.921875 },\n { x: 0.078125, y: 0.921875 },\n { x: 0.109375, y: 0.921875 },\n { x: 0.109375, y: 0.921875 },\n { x: 0.140625, y: 0.921875 },\n { x: 0.140625, y: 0.921875 },\n { x: 0.171875, y: 0.921875 },\n { x: 0.171875, y: 0.921875 },\n { x: 0.203125, y: 0.921875 },\n { x: 0.203125, y: 0.921875 },\n { x: 0.234375, y: 0.921875 },\n { x: 0.234375, y: 0.921875 },\n { x: 0.265625, y: 0.921875 },\n { x: 0.265625, y: 0.921875 },\n { x: 0.296875, y: 0.921875 },\n { x: 0.296875, y: 0.921875 },\n { x: 0.328125, y: 0.921875 },\n { x: 0.328125, y: 0.921875 },\n { x: 0.359375, y: 0.921875 },\n { x: 0.359375, y: 0.921875 },\n { x: 0.390625, y: 0.921875 },\n { x: 0.390625, y: 0.921875 },\n { x: 0.421875, y: 0.921875 },\n { x: 0.421875, y: 0.921875 },\n { x: 0.453125, y: 0.921875 },\n { x: 0.453125, y: 0.921875 },\n { x: 0.484375, y: 0.921875 },\n { x: 0.484375, y: 0.921875 },\n { x: 0.515625, y: 0.921875 },\n { x: 0.515625, y: 0.921875 },\n { x: 0.546875, y: 0.921875 },\n { x: 0.546875, y: 0.921875 },\n { x: 0.578125, y: 0.921875 },\n { x: 0.578125, y: 0.921875 },\n { x: 0.609375, y: 0.921875 },\n { x: 0.609375, y: 0.921875 },\n { x: 0.640625, y: 0.921875 },\n { x: 0.640625, y: 0.921875 },\n { x: 0.671875, y: 0.921875 },\n { x: 0.671875, y: 0.921875 },\n { x: 0.703125, y: 0.921875 },\n { x: 0.703125, y: 0.921875 },\n { x: 0.734375, y: 0.921875 },\n { x: 0.734375, y: 0.921875 },\n { x: 0.765625, y: 0.921875 },\n { x: 0.765625, y: 0.921875 },\n { x: 0.796875, y: 0.921875 },\n { x: 0.796875, y: 0.921875 },\n { x: 0.828125, y: 0.921875 },\n { x: 0.828125, y: 0.921875 },\n { x: 0.859375, y: 0.921875 },\n { x: 0.859375, y: 0.921875 },\n { x: 0.890625, y: 0.921875 },\n { x: 0.890625, y: 0.921875 },\n { x: 0.921875, y: 0.921875 },\n { x: 0.921875, y: 0.921875 },\n { x: 0.953125, y: 0.921875 },\n { x: 0.953125, y: 0.921875 },\n { x: 0.984375, y: 0.921875 },\n { x: 0.984375, y: 0.921875 },\n { x: 0.015625, y: 0.953125 },\n { x: 0.015625, y: 0.953125 },\n { x: 0.046875, y: 0.953125 },\n { x: 0.046875, y: 0.953125 },\n { x: 0.078125, y: 0.953125 },\n { x: 0.078125, y: 0.953125 },\n { x: 0.109375, y: 0.953125 },\n { x: 0.109375, y: 0.953125 },\n { x: 0.140625, y: 0.953125 },\n { x: 0.140625, y: 0.953125 },\n { x: 0.171875, y: 0.953125 },\n { x: 0.171875, y: 0.953125 },\n { x: 0.203125, y: 0.953125 },\n { x: 0.203125, y: 0.953125 },\n { x: 0.234375, y: 0.953125 },\n { x: 0.234375, y: 0.953125 },\n { x: 0.265625, y: 0.953125 },\n { x: 0.265625, y: 0.953125 },\n { x: 0.296875, y: 0.953125 },\n { x: 0.296875, y: 0.953125 },\n { x: 0.328125, y: 0.953125 },\n { x: 0.328125, y: 0.953125 },\n { x: 0.359375, y: 0.953125 },\n { x: 0.359375, y: 0.953125 },\n { x: 0.390625, y: 0.953125 },\n { x: 0.390625, y: 0.953125 },\n { x: 0.421875, y: 0.953125 },\n { x: 0.421875, y: 0.953125 },\n { x: 0.453125, y: 0.953125 },\n { x: 0.453125, y: 0.953125 },\n { x: 0.484375, y: 0.953125 },\n { x: 0.484375, y: 0.953125 },\n { x: 0.515625, y: 0.953125 },\n { x: 0.515625, y: 0.953125 },\n { x: 0.546875, y: 0.953125 },\n { x: 0.546875, y: 0.953125 },\n { x: 0.578125, y: 0.953125 },\n { x: 0.578125, y: 0.953125 },\n { x: 0.609375, y: 0.953125 },\n { x: 0.609375, y: 0.953125 },\n { x: 0.640625, y: 0.953125 },\n { x: 0.640625, y: 0.953125 },\n { x: 0.671875, y: 0.953125 },\n { x: 0.671875, y: 0.953125 },\n { x: 0.703125, y: 0.953125 },\n { x: 0.703125, y: 0.953125 },\n { x: 0.734375, y: 0.953125 },\n { x: 0.734375, y: 0.953125 },\n { x: 0.765625, y: 0.953125 },\n { x: 0.765625, y: 0.953125 },\n { x: 0.796875, y: 0.953125 },\n { x: 0.796875, y: 0.953125 },\n { x: 0.828125, y: 0.953125 },\n { x: 0.828125, y: 0.953125 },\n { x: 0.859375, y: 0.953125 },\n { x: 0.859375, y: 0.953125 },\n { x: 0.890625, y: 0.953125 },\n { x: 0.890625, y: 0.953125 },\n { x: 0.921875, y: 0.953125 },\n { x: 0.921875, y: 0.953125 },\n { x: 0.953125, y: 0.953125 },\n { x: 0.953125, y: 0.953125 },\n { x: 0.984375, y: 0.953125 },\n { x: 0.984375, y: 0.953125 },\n { x: 0.015625, y: 0.984375 },\n { x: 0.015625, y: 0.984375 },\n { x: 0.046875, y: 0.984375 },\n { x: 0.046875, y: 0.984375 },\n { x: 0.078125, y: 0.984375 },\n { x: 0.078125, y: 0.984375 },\n { x: 0.109375, y: 0.984375 },\n { x: 0.109375, y: 0.984375 },\n { x: 0.140625, y: 0.984375 },\n { x: 0.140625, y: 0.984375 },\n { x: 0.171875, y: 0.984375 },\n { x: 0.171875, y: 0.984375 },\n { x: 0.203125, y: 0.984375 },\n { x: 0.203125, y: 0.984375 },\n { x: 0.234375, y: 0.984375 },\n { x: 0.234375, y: 0.984375 },\n { x: 0.265625, y: 0.984375 },\n { x: 0.265625, y: 0.984375 },\n { x: 0.296875, y: 0.984375 },\n { x: 0.296875, y: 0.984375 },\n { x: 0.328125, y: 0.984375 },\n { x: 0.328125, y: 0.984375 },\n { x: 0.359375, y: 0.984375 },\n { x: 0.359375, y: 0.984375 },\n { x: 0.390625, y: 0.984375 },\n { x: 0.390625, y: 0.984375 },\n { x: 0.421875, y: 0.984375 },\n { x: 0.421875, y: 0.984375 },\n { x: 0.453125, y: 0.984375 },\n { x: 0.453125, y: 0.984375 },\n { x: 0.484375, y: 0.984375 },\n { x: 0.484375, y: 0.984375 },\n { x: 0.515625, y: 0.984375 },\n { x: 0.515625, y: 0.984375 },\n { x: 0.546875, y: 0.984375 },\n { x: 0.546875, y: 0.984375 },\n { x: 0.578125, y: 0.984375 },\n { x: 0.578125, y: 0.984375 },\n { x: 0.609375, y: 0.984375 },\n { x: 0.609375, y: 0.984375 },\n { x: 0.640625, y: 0.984375 },\n { x: 0.640625, y: 0.984375 },\n { x: 0.671875, y: 0.984375 },\n { x: 0.671875, y: 0.984375 },\n { x: 0.703125, y: 0.984375 },\n { x: 0.703125, y: 0.984375 },\n { x: 0.734375, y: 0.984375 },\n { x: 0.734375, y: 0.984375 },\n { x: 0.765625, y: 0.984375 },\n { x: 0.765625, y: 0.984375 },\n { x: 0.796875, y: 0.984375 },\n { x: 0.796875, y: 0.984375 },\n { x: 0.828125, y: 0.984375 },\n { x: 0.828125, y: 0.984375 },\n { x: 0.859375, y: 0.984375 },\n { x: 0.859375, y: 0.984375 },\n { x: 0.890625, y: 0.984375 },\n { x: 0.890625, y: 0.984375 },\n { x: 0.921875, y: 0.984375 },\n { x: 0.921875, y: 0.984375 },\n { x: 0.953125, y: 0.984375 },\n { x: 0.953125, y: 0.984375 },\n { x: 0.984375, y: 0.984375 },\n { x: 0.984375, y: 0.984375 },\n { x: 0.03125, y: 0.03125 },\n { x: 0.03125, y: 0.03125 },\n { x: 0.09375, y: 0.03125 },\n { x: 0.09375, y: 0.03125 },\n { x: 0.15625, y: 0.03125 },\n { x: 0.15625, y: 0.03125 },\n { x: 0.21875, y: 0.03125 },\n { x: 0.21875, y: 0.03125 },\n { x: 0.28125, y: 0.03125 },\n { x: 0.28125, y: 0.03125 },\n { x: 0.34375, y: 0.03125 },\n { x: 0.34375, y: 0.03125 },\n { x: 0.40625, y: 0.03125 },\n { x: 0.40625, y: 0.03125 },\n { x: 0.46875, y: 0.03125 },\n { x: 0.46875, y: 0.03125 },\n { x: 0.53125, y: 0.03125 },\n { x: 0.53125, y: 0.03125 },\n { x: 0.59375, y: 0.03125 },\n { x: 0.59375, y: 0.03125 },\n { x: 0.65625, y: 0.03125 },\n { x: 0.65625, y: 0.03125 },\n { x: 0.71875, y: 0.03125 },\n { x: 0.71875, y: 0.03125 },\n { x: 0.78125, y: 0.03125 },\n { x: 0.78125, y: 0.03125 },\n { x: 0.84375, y: 0.03125 },\n { x: 0.84375, y: 0.03125 },\n { x: 0.90625, y: 0.03125 },\n { x: 0.90625, y: 0.03125 },\n { x: 0.96875, y: 0.03125 },\n { x: 0.96875, y: 0.03125 },\n { x: 0.03125, y: 0.09375 },\n { x: 0.03125, y: 0.09375 },\n { x: 0.09375, y: 0.09375 },\n { x: 0.09375, y: 0.09375 },\n { x: 0.15625, y: 0.09375 },\n { x: 0.15625, y: 0.09375 },\n { x: 0.21875, y: 0.09375 },\n { x: 0.21875, y: 0.09375 },\n { x: 0.28125, y: 0.09375 },\n { x: 0.28125, y: 0.09375 },\n { x: 0.34375, y: 0.09375 },\n { x: 0.34375, y: 0.09375 },\n { x: 0.40625, y: 0.09375 },\n { x: 0.40625, y: 0.09375 },\n { x: 0.46875, y: 0.09375 },\n { x: 0.46875, y: 0.09375 },\n { x: 0.53125, y: 0.09375 },\n { x: 0.53125, y: 0.09375 },\n { x: 0.59375, y: 0.09375 },\n { x: 0.59375, y: 0.09375 },\n { x: 0.65625, y: 0.09375 },\n { x: 0.65625, y: 0.09375 },\n { x: 0.71875, y: 0.09375 },\n { x: 0.71875, y: 0.09375 },\n { x: 0.78125, y: 0.09375 },\n { x: 0.78125, y: 0.09375 },\n { x: 0.84375, y: 0.09375 },\n { x: 0.84375, y: 0.09375 },\n { x: 0.90625, y: 0.09375 },\n { x: 0.90625, y: 0.09375 },\n { x: 0.96875, y: 0.09375 },\n { x: 0.96875, y: 0.09375 },\n { x: 0.03125, y: 0.15625 },\n { x: 0.03125, y: 0.15625 },\n { x: 0.09375, y: 0.15625 },\n { x: 0.09375, y: 0.15625 },\n { x: 0.15625, y: 0.15625 },\n { x: 0.15625, y: 0.15625 },\n { x: 0.21875, y: 0.15625 },\n { x: 0.21875, y: 0.15625 },\n { x: 0.28125, y: 0.15625 },\n { x: 0.28125, y: 0.15625 },\n { x: 0.34375, y: 0.15625 },\n { x: 0.34375, y: 0.15625 },\n { x: 0.40625, y: 0.15625 },\n { x: 0.40625, y: 0.15625 },\n { x: 0.46875, y: 0.15625 },\n { x: 0.46875, y: 0.15625 },\n { x: 0.53125, y: 0.15625 },\n { x: 0.53125, y: 0.15625 },\n { x: 0.59375, y: 0.15625 },\n { x: 0.59375, y: 0.15625 },\n { x: 0.65625, y: 0.15625 },\n { x: 0.65625, y: 0.15625 },\n { x: 0.71875, y: 0.15625 },\n { x: 0.71875, y: 0.15625 },\n { x: 0.78125, y: 0.15625 },\n { x: 0.78125, y: 0.15625 },\n { x: 0.84375, y: 0.15625 },\n { x: 0.84375, y: 0.15625 },\n { x: 0.90625, y: 0.15625 },\n { x: 0.90625, y: 0.15625 },\n { x: 0.96875, y: 0.15625 },\n { x: 0.96875, y: 0.15625 },\n { x: 0.03125, y: 0.21875 },\n { x: 0.03125, y: 0.21875 },\n { x: 0.09375, y: 0.21875 },\n { x: 0.09375, y: 0.21875 },\n { x: 0.15625, y: 0.21875 },\n { x: 0.15625, y: 0.21875 },\n { x: 0.21875, y: 0.21875 },\n { x: 0.21875, y: 0.21875 },\n { x: 0.28125, y: 0.21875 },\n { x: 0.28125, y: 0.21875 },\n { x: 0.34375, y: 0.21875 },\n { x: 0.34375, y: 0.21875 },\n { x: 0.40625, y: 0.21875 },\n { x: 0.40625, y: 0.21875 },\n { x: 0.46875, y: 0.21875 },\n { x: 0.46875, y: 0.21875 },\n { x: 0.53125, y: 0.21875 },\n { x: 0.53125, y: 0.21875 },\n { x: 0.59375, y: 0.21875 },\n { x: 0.59375, y: 0.21875 },\n { x: 0.65625, y: 0.21875 },\n { x: 0.65625, y: 0.21875 },\n { x: 0.71875, y: 0.21875 },\n { x: 0.71875, y: 0.21875 },\n { x: 0.78125, y: 0.21875 },\n { x: 0.78125, y: 0.21875 },\n { x: 0.84375, y: 0.21875 },\n { x: 0.84375, y: 0.21875 },\n { x: 0.90625, y: 0.21875 },\n { x: 0.90625, y: 0.21875 },\n { x: 0.96875, y: 0.21875 },\n { x: 0.96875, y: 0.21875 },\n { x: 0.03125, y: 0.28125 },\n { x: 0.03125, y: 0.28125 },\n { x: 0.09375, y: 0.28125 },\n { x: 0.09375, y: 0.28125 },\n { x: 0.15625, y: 0.28125 },\n { x: 0.15625, y: 0.28125 },\n { x: 0.21875, y: 0.28125 },\n { x: 0.21875, y: 0.28125 },\n { x: 0.28125, y: 0.28125 },\n { x: 0.28125, y: 0.28125 },\n { x: 0.34375, y: 0.28125 },\n { x: 0.34375, y: 0.28125 },\n { x: 0.40625, y: 0.28125 },\n { x: 0.40625, y: 0.28125 },\n { x: 0.46875, y: 0.28125 },\n { x: 0.46875, y: 0.28125 },\n { x: 0.53125, y: 0.28125 },\n { x: 0.53125, y: 0.28125 },\n { x: 0.59375, y: 0.28125 },\n { x: 0.59375, y: 0.28125 },\n { x: 0.65625, y: 0.28125 },\n { x: 0.65625, y: 0.28125 },\n { x: 0.71875, y: 0.28125 },\n { x: 0.71875, y: 0.28125 },\n { x: 0.78125, y: 0.28125 },\n { x: 0.78125, y: 0.28125 },\n { x: 0.84375, y: 0.28125 },\n { x: 0.84375, y: 0.28125 },\n { x: 0.90625, y: 0.28125 },\n { x: 0.90625, y: 0.28125 },\n { x: 0.96875, y: 0.28125 },\n { x: 0.96875, y: 0.28125 },\n { x: 0.03125, y: 0.34375 },\n { x: 0.03125, y: 0.34375 },\n { x: 0.09375, y: 0.34375 },\n { x: 0.09375, y: 0.34375 },\n { x: 0.15625, y: 0.34375 },\n { x: 0.15625, y: 0.34375 },\n { x: 0.21875, y: 0.34375 },\n { x: 0.21875, y: 0.34375 },\n { x: 0.28125, y: 0.34375 },\n { x: 0.28125, y: 0.34375 },\n { x: 0.34375, y: 0.34375 },\n { x: 0.34375, y: 0.34375 },\n { x: 0.40625, y: 0.34375 },\n { x: 0.40625, y: 0.34375 },\n { x: 0.46875, y: 0.34375 },\n { x: 0.46875, y: 0.34375 },\n { x: 0.53125, y: 0.34375 },\n { x: 0.53125, y: 0.34375 },\n { x: 0.59375, y: 0.34375 },\n { x: 0.59375, y: 0.34375 },\n { x: 0.65625, y: 0.34375 },\n { x: 0.65625, y: 0.34375 },\n { x: 0.71875, y: 0.34375 },\n { x: 0.71875, y: 0.34375 },\n { x: 0.78125, y: 0.34375 },\n { x: 0.78125, y: 0.34375 },\n { x: 0.84375, y: 0.34375 },\n { x: 0.84375, y: 0.34375 },\n { x: 0.90625, y: 0.34375 },\n { x: 0.90625, y: 0.34375 },\n { x: 0.96875, y: 0.34375 },\n { x: 0.96875, y: 0.34375 },\n { x: 0.03125, y: 0.40625 },\n { x: 0.03125, y: 0.40625 },\n { x: 0.09375, y: 0.40625 },\n { x: 0.09375, y: 0.40625 },\n { x: 0.15625, y: 0.40625 },\n { x: 0.15625, y: 0.40625 },\n { x: 0.21875, y: 0.40625 },\n { x: 0.21875, y: 0.40625 },\n { x: 0.28125, y: 0.40625 },\n { x: 0.28125, y: 0.40625 },\n { x: 0.34375, y: 0.40625 },\n { x: 0.34375, y: 0.40625 },\n { x: 0.40625, y: 0.40625 },\n { x: 0.40625, y: 0.40625 },\n { x: 0.46875, y: 0.40625 },\n { x: 0.46875, y: 0.40625 },\n { x: 0.53125, y: 0.40625 },\n { x: 0.53125, y: 0.40625 },\n { x: 0.59375, y: 0.40625 },\n { x: 0.59375, y: 0.40625 },\n { x: 0.65625, y: 0.40625 },\n { x: 0.65625, y: 0.40625 },\n { x: 0.71875, y: 0.40625 },\n { x: 0.71875, y: 0.40625 },\n { x: 0.78125, y: 0.40625 },\n { x: 0.78125, y: 0.40625 },\n { x: 0.84375, y: 0.40625 },\n { x: 0.84375, y: 0.40625 },\n { x: 0.90625, y: 0.40625 },\n { x: 0.90625, y: 0.40625 },\n { x: 0.96875, y: 0.40625 },\n { x: 0.96875, y: 0.40625 },\n { x: 0.03125, y: 0.46875 },\n { x: 0.03125, y: 0.46875 },\n { x: 0.09375, y: 0.46875 },\n { x: 0.09375, y: 0.46875 },\n { x: 0.15625, y: 0.46875 },\n { x: 0.15625, y: 0.46875 },\n { x: 0.21875, y: 0.46875 },\n { x: 0.21875, y: 0.46875 },\n { x: 0.28125, y: 0.46875 },\n { x: 0.28125, y: 0.46875 },\n { x: 0.34375, y: 0.46875 },\n { x: 0.34375, y: 0.46875 },\n { x: 0.40625, y: 0.46875 },\n { x: 0.40625, y: 0.46875 },\n { x: 0.46875, y: 0.46875 },\n { x: 0.46875, y: 0.46875 },\n { x: 0.53125, y: 0.46875 },\n { x: 0.53125, y: 0.46875 },\n { x: 0.59375, y: 0.46875 },\n { x: 0.59375, y: 0.46875 },\n { x: 0.65625, y: 0.46875 },\n { x: 0.65625, y: 0.46875 },\n { x: 0.71875, y: 0.46875 },\n { x: 0.71875, y: 0.46875 },\n { x: 0.78125, y: 0.46875 },\n { x: 0.78125, y: 0.46875 },\n { x: 0.84375, y: 0.46875 },\n { x: 0.84375, y: 0.46875 },\n { x: 0.90625, y: 0.46875 },\n { x: 0.90625, y: 0.46875 },\n { x: 0.96875, y: 0.46875 },\n { x: 0.96875, y: 0.46875 },\n { x: 0.03125, y: 0.53125 },\n { x: 0.03125, y: 0.53125 },\n { x: 0.09375, y: 0.53125 },\n { x: 0.09375, y: 0.53125 },\n { x: 0.15625, y: 0.53125 },\n { x: 0.15625, y: 0.53125 },\n { x: 0.21875, y: 0.53125 },\n { x: 0.21875, y: 0.53125 },\n { x: 0.28125, y: 0.53125 },\n { x: 0.28125, y: 0.53125 },\n { x: 0.34375, y: 0.53125 },\n { x: 0.34375, y: 0.53125 },\n { x: 0.40625, y: 0.53125 },\n { x: 0.40625, y: 0.53125 },\n { x: 0.46875, y: 0.53125 },\n { x: 0.46875, y: 0.53125 },\n { x: 0.53125, y: 0.53125 },\n { x: 0.53125, y: 0.53125 },\n { x: 0.59375, y: 0.53125 },\n { x: 0.59375, y: 0.53125 },\n { x: 0.65625, y: 0.53125 },\n { x: 0.65625, y: 0.53125 },\n { x: 0.71875, y: 0.53125 },\n { x: 0.71875, y: 0.53125 },\n { x: 0.78125, y: 0.53125 },\n { x: 0.78125, y: 0.53125 },\n { x: 0.84375, y: 0.53125 },\n { x: 0.84375, y: 0.53125 },\n { x: 0.90625, y: 0.53125 },\n { x: 0.90625, y: 0.53125 },\n { x: 0.96875, y: 0.53125 },\n { x: 0.96875, y: 0.53125 },\n { x: 0.03125, y: 0.59375 },\n { x: 0.03125, y: 0.59375 },\n { x: 0.09375, y: 0.59375 },\n { x: 0.09375, y: 0.59375 },\n { x: 0.15625, y: 0.59375 },\n { x: 0.15625, y: 0.59375 },\n { x: 0.21875, y: 0.59375 },\n { x: 0.21875, y: 0.59375 },\n { x: 0.28125, y: 0.59375 },\n { x: 0.28125, y: 0.59375 },\n { x: 0.34375, y: 0.59375 },\n { x: 0.34375, y: 0.59375 },\n { x: 0.40625, y: 0.59375 },\n { x: 0.40625, y: 0.59375 },\n { x: 0.46875, y: 0.59375 },\n { x: 0.46875, y: 0.59375 },\n { x: 0.53125, y: 0.59375 },\n { x: 0.53125, y: 0.59375 },\n { x: 0.59375, y: 0.59375 },\n { x: 0.59375, y: 0.59375 },\n { x: 0.65625, y: 0.59375 },\n { x: 0.65625, y: 0.59375 },\n { x: 0.71875, y: 0.59375 },\n { x: 0.71875, y: 0.59375 },\n { x: 0.78125, y: 0.59375 },\n { x: 0.78125, y: 0.59375 },\n { x: 0.84375, y: 0.59375 },\n { x: 0.84375, y: 0.59375 },\n { x: 0.90625, y: 0.59375 },\n { x: 0.90625, y: 0.59375 },\n { x: 0.96875, y: 0.59375 },\n { x: 0.96875, y: 0.59375 },\n { x: 0.03125, y: 0.65625 },\n { x: 0.03125, y: 0.65625 },\n { x: 0.09375, y: 0.65625 },\n { x: 0.09375, y: 0.65625 },\n { x: 0.15625, y: 0.65625 },\n { x: 0.15625, y: 0.65625 },\n { x: 0.21875, y: 0.65625 },\n { x: 0.21875, y: 0.65625 },\n { x: 0.28125, y: 0.65625 },\n { x: 0.28125, y: 0.65625 },\n { x: 0.34375, y: 0.65625 },\n { x: 0.34375, y: 0.65625 },\n { x: 0.40625, y: 0.65625 },\n { x: 0.40625, y: 0.65625 },\n { x: 0.46875, y: 0.65625 },\n { x: 0.46875, y: 0.65625 },\n { x: 0.53125, y: 0.65625 },\n { x: 0.53125, y: 0.65625 },\n { x: 0.59375, y: 0.65625 },\n { x: 0.59375, y: 0.65625 },\n { x: 0.65625, y: 0.65625 },\n { x: 0.65625, y: 0.65625 },\n { x: 0.71875, y: 0.65625 },\n { x: 0.71875, y: 0.65625 },\n { x: 0.78125, y: 0.65625 },\n { x: 0.78125, y: 0.65625 },\n { x: 0.84375, y: 0.65625 },\n { x: 0.84375, y: 0.65625 },\n { x: 0.90625, y: 0.65625 },\n { x: 0.90625, y: 0.65625 },\n { x: 0.96875, y: 0.65625 },\n { x: 0.96875, y: 0.65625 },\n { x: 0.03125, y: 0.71875 },\n { x: 0.03125, y: 0.71875 },\n { x: 0.09375, y: 0.71875 },\n { x: 0.09375, y: 0.71875 },\n { x: 0.15625, y: 0.71875 },\n { x: 0.15625, y: 0.71875 },\n { x: 0.21875, y: 0.71875 },\n { x: 0.21875, y: 0.71875 },\n { x: 0.28125, y: 0.71875 },\n { x: 0.28125, y: 0.71875 },\n { x: 0.34375, y: 0.71875 },\n { x: 0.34375, y: 0.71875 },\n { x: 0.40625, y: 0.71875 },\n { x: 0.40625, y: 0.71875 },\n { x: 0.46875, y: 0.71875 },\n { x: 0.46875, y: 0.71875 },\n { x: 0.53125, y: 0.71875 },\n { x: 0.53125, y: 0.71875 },\n { x: 0.59375, y: 0.71875 },\n { x: 0.59375, y: 0.71875 },\n { x: 0.65625, y: 0.71875 },\n { x: 0.65625, y: 0.71875 },\n { x: 0.71875, y: 0.71875 },\n { x: 0.71875, y: 0.71875 },\n { x: 0.78125, y: 0.71875 },\n { x: 0.78125, y: 0.71875 },\n { x: 0.84375, y: 0.71875 },\n { x: 0.84375, y: 0.71875 },\n { x: 0.90625, y: 0.71875 },\n { x: 0.90625, y: 0.71875 },\n { x: 0.96875, y: 0.71875 },\n { x: 0.96875, y: 0.71875 },\n { x: 0.03125, y: 0.78125 },\n { x: 0.03125, y: 0.78125 },\n { x: 0.09375, y: 0.78125 },\n { x: 0.09375, y: 0.78125 },\n { x: 0.15625, y: 0.78125 },\n { x: 0.15625, y: 0.78125 },\n { x: 0.21875, y: 0.78125 },\n { x: 0.21875, y: 0.78125 },\n { x: 0.28125, y: 0.78125 },\n { x: 0.28125, y: 0.78125 },\n { x: 0.34375, y: 0.78125 },\n { x: 0.34375, y: 0.78125 },\n { x: 0.40625, y: 0.78125 },\n { x: 0.40625, y: 0.78125 },\n { x: 0.46875, y: 0.78125 },\n { x: 0.46875, y: 0.78125 },\n { x: 0.53125, y: 0.78125 },\n { x: 0.53125, y: 0.78125 },\n { x: 0.59375, y: 0.78125 },\n { x: 0.59375, y: 0.78125 },\n { x: 0.65625, y: 0.78125 },\n { x: 0.65625, y: 0.78125 },\n { x: 0.71875, y: 0.78125 },\n { x: 0.71875, y: 0.78125 },\n { x: 0.78125, y: 0.78125 },\n { x: 0.78125, y: 0.78125 },\n { x: 0.84375, y: 0.78125 },\n { x: 0.84375, y: 0.78125 },\n { x: 0.90625, y: 0.78125 },\n { x: 0.90625, y: 0.78125 },\n { x: 0.96875, y: 0.78125 },\n { x: 0.96875, y: 0.78125 },\n { x: 0.03125, y: 0.84375 },\n { x: 0.03125, y: 0.84375 },\n { x: 0.09375, y: 0.84375 },\n { x: 0.09375, y: 0.84375 },\n { x: 0.15625, y: 0.84375 },\n { x: 0.15625, y: 0.84375 },\n { x: 0.21875, y: 0.84375 },\n { x: 0.21875, y: 0.84375 },\n { x: 0.28125, y: 0.84375 },\n { x: 0.28125, y: 0.84375 },\n { x: 0.34375, y: 0.84375 },\n { x: 0.34375, y: 0.84375 },\n { x: 0.40625, y: 0.84375 },\n { x: 0.40625, y: 0.84375 },\n { x: 0.46875, y: 0.84375 },\n { x: 0.46875, y: 0.84375 },\n { x: 0.53125, y: 0.84375 },\n { x: 0.53125, y: 0.84375 },\n { x: 0.59375, y: 0.84375 },\n { x: 0.59375, y: 0.84375 },\n { x: 0.65625, y: 0.84375 },\n { x: 0.65625, y: 0.84375 },\n { x: 0.71875, y: 0.84375 },\n { x: 0.71875, y: 0.84375 },\n { x: 0.78125, y: 0.84375 },\n { x: 0.78125, y: 0.84375 },\n { x: 0.84375, y: 0.84375 },\n { x: 0.84375, y: 0.84375 },\n { x: 0.90625, y: 0.84375 },\n { x: 0.90625, y: 0.84375 },\n { x: 0.96875, y: 0.84375 },\n { x: 0.96875, y: 0.84375 },\n { x: 0.03125, y: 0.90625 },\n { x: 0.03125, y: 0.90625 },\n { x: 0.09375, y: 0.90625 },\n { x: 0.09375, y: 0.90625 },\n { x: 0.15625, y: 0.90625 },\n { x: 0.15625, y: 0.90625 },\n { x: 0.21875, y: 0.90625 },\n { x: 0.21875, y: 0.90625 },\n { x: 0.28125, y: 0.90625 },\n { x: 0.28125, y: 0.90625 },\n { x: 0.34375, y: 0.90625 },\n { x: 0.34375, y: 0.90625 },\n { x: 0.40625, y: 0.90625 },\n { x: 0.40625, y: 0.90625 },\n { x: 0.46875, y: 0.90625 },\n { x: 0.46875, y: 0.90625 },\n { x: 0.53125, y: 0.90625 },\n { x: 0.53125, y: 0.90625 },\n { x: 0.59375, y: 0.90625 },\n { x: 0.59375, y: 0.90625 },\n { x: 0.65625, y: 0.90625 },\n { x: 0.65625, y: 0.90625 },\n { x: 0.71875, y: 0.90625 },\n { x: 0.71875, y: 0.90625 },\n { x: 0.78125, y: 0.90625 },\n { x: 0.78125, y: 0.90625 },\n { x: 0.84375, y: 0.90625 },\n { x: 0.84375, y: 0.90625 },\n { x: 0.90625, y: 0.90625 },\n { x: 0.90625, y: 0.90625 },\n { x: 0.96875, y: 0.90625 },\n { x: 0.96875, y: 0.90625 },\n { x: 0.03125, y: 0.96875 },\n { x: 0.03125, y: 0.96875 },\n { x: 0.09375, y: 0.96875 },\n { x: 0.09375, y: 0.96875 },\n { x: 0.15625, y: 0.96875 },\n { x: 0.15625, y: 0.96875 },\n { x: 0.21875, y: 0.96875 },\n { x: 0.21875, y: 0.96875 },\n { x: 0.28125, y: 0.96875 },\n { x: 0.28125, y: 0.96875 },\n { x: 0.34375, y: 0.96875 },\n { x: 0.34375, y: 0.96875 },\n { x: 0.40625, y: 0.96875 },\n { x: 0.40625, y: 0.96875 },\n { x: 0.46875, y: 0.96875 },\n { x: 0.46875, y: 0.96875 },\n { x: 0.53125, y: 0.96875 },\n { x: 0.53125, y: 0.96875 },\n { x: 0.59375, y: 0.96875 },\n { x: 0.59375, y: 0.96875 },\n { x: 0.65625, y: 0.96875 },\n { x: 0.65625, y: 0.96875 },\n { x: 0.71875, y: 0.96875 },\n { x: 0.71875, y: 0.96875 },\n { x: 0.78125, y: 0.96875 },\n { x: 0.78125, y: 0.96875 },\n { x: 0.84375, y: 0.96875 },\n { x: 0.84375, y: 0.96875 },\n { x: 0.90625, y: 0.96875 },\n { x: 0.90625, y: 0.96875 },\n { x: 0.96875, y: 0.96875 },\n { x: 0.96875, y: 0.96875 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n];\n", "/**\n * HandPose model implementation\n * See `handpose.ts` for entry point\n */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport * as util from './handposeutil';\nimport * as anchors from './handposeanchors';\nimport { constants } from '../tfjs/constants';\nimport type { Tensor, Tensor1D, Tensor2D, Tensor4D, GraphModel } from '../tfjs/types';\nimport type { Point } from '../result';\nimport type { Config } from '../config';\n\nexport class HandDetector {\n model: GraphModel;\n anchors: number[][];\n anchorsTensor: Tensor;\n inputSize: number;\n inputSizeTensor: Tensor;\n doubleInputSizeTensor: Tensor;\n\n constructor(model: GraphModel) {\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] || 0;\n this.inputSizeTensor = tf.tensor1d([this.inputSize, this.inputSize]);\n this.doubleInputSizeTensor = tf.tensor1d([this.inputSize * 2, this.inputSize * 2]);\n }\n\n normalizeBoxes(boxes) {\n const t: Record = {};\n t.boxOffsets = tf.slice(boxes, [0, 0], [-1, 2]);\n t.boxSizes = tf.slice(boxes, [0, 2], [-1, 2]);\n t.div = tf.div(t.boxOffsets, this.inputSizeTensor);\n t.boxCenterPoints = tf.add(t.div, this.anchorsTensor);\n t.halfBoxSizes = tf.div(t.boxSizes, this.doubleInputSizeTensor);\n t.sub = tf.sub(t.boxCenterPoints, t.halfBoxSizes);\n t.startPoints = tf.mul(t.sub, this.inputSizeTensor);\n t.add = tf.add(t.boxCenterPoints, t.halfBoxSizes);\n t.endPoints = tf.mul(t.add, this.inputSizeTensor);\n const res = tf.concat2d([t.startPoints as Tensor2D, t.endPoints as Tensor2D], 1);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return res as Tensor;\n }\n\n normalizeLandmarks(rawPalmLandmarks, index: number): Tensor {\n const t: Record = {};\n t.reshape = tf.reshape(rawPalmLandmarks, [-1, 7, 2]);\n t.div = tf.div(t.reshape, this.inputSizeTensor);\n t.landmarks = tf.add(t.div, this.anchors[index] ? this.anchors[index] : 0);\n const res = tf.mul(t.landmarks, this.inputSizeTensor);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return res;\n }\n\n async predict(input: Tensor4D, config: Config): Promise<{ startPoint: Point; endPoint: Point, palmLandmarks: Point[]; confidence: number }[]> {\n const t: Record = {};\n t.resize = tf.image.resizeBilinear(input, [this.inputSize, this.inputSize]);\n t.div = tf.div(t.resize, constants.tf127);\n t.image = tf.sub(t.div, constants.tf1);\n t.batched = this.model.execute(t.image) as Tensor;\n t.predictions = tf.squeeze(t.batched);\n t.slice = tf.slice(t.predictions, [0, 0], [-1, 1]);\n t.sigmoid = tf.sigmoid(t.slice);\n t.scores = tf.squeeze(t.sigmoid);\n const scores = await t.scores.data();\n t.boxes = tf.slice(t.predictions, [0, 1], [-1, 4]);\n t.norm = this.normalizeBoxes(t.boxes);\n // box detection is flaky so we look for 3x boxes than we need results\n t.nms = await tf.image.nonMaxSuppressionAsync(t.norm as Tensor2D, t.scores as Tensor1D, 3 * (config.hand?.maxDetected || 1), config.hand.iouThreshold, config.hand.minConfidence);\n const nms = await t.nms.array() as number[];\n const hands: { startPoint: Point; endPoint: Point; palmLandmarks: Point[]; confidence: number }[] = [];\n for (const index of nms) {\n const p: Record = {};\n p.box = tf.slice(t.norm, [index, 0], [1, -1]);\n p.slice = tf.slice(t.predictions, [index, 5], [1, 14]);\n p.norm = this.normalizeLandmarks(p.slice, index);\n p.palmLandmarks = tf.reshape(p.norm, [-1, 2]);\n const box = await p.box.data();\n const startPoint = box.slice(0, 2) as unknown as Point;\n const endPoint = box.slice(2, 4) as unknown as Point;\n const palmLandmarks = await p.palmLandmarks.array();\n const hand = { startPoint, endPoint, palmLandmarks, confidence: scores[index] };\n const scaled = util.scaleBoxCoordinates(hand, [(input.shape[2] || 1) / this.inputSize, (input.shape[1] || 0) / this.inputSize]);\n hands.push(scaled);\n Object.keys(p).forEach((tensor) => tf.dispose(p[tensor]));\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return hands;\n }\n}\n", "/**\n * HandPose model implementation\n * See `handpose.ts` for entry point\n */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport * as util from './handposeutil';\nimport type * as detector from './handposedetector';\nimport { constants } from '../tfjs/constants';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport { env } from '../util/env';\nimport { now } from '../util/util';\nimport type { Point } from '../result';\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;\nlet lastTime = 0;\n\nexport class HandPipeline {\n handDetector: detector.HandDetector;\n handPoseModel: GraphModel;\n inputSize: number;\n storedBoxes: ({ startPoint: Point; endPoint: Point; palmLandmarks: Point[]; confidence: number } | null)[];\n skipped: number;\n detectedHands: number;\n\n constructor(handDetector, handPoseModel) {\n this.handDetector = handDetector;\n this.handPoseModel = handPoseModel;\n this.inputSize = this.handPoseModel?.inputs?.[0].shape?.[2] || 0;\n this.storedBoxes = [];\n this.skipped = Number.MAX_SAFE_INTEGER;\n this.detectedHands = 0;\n }\n\n calculateLandmarksBoundingBox(landmarks) { // eslint-disable-line class-methods-use-this\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 util.enlargeBox(util.squarifyBox(boxAroundPalm), palmBoxEnlargeFactor);\n }\n\n getBoxForHandLandmarks(landmarks) {\n const boundingBox = this.calculateLandmarksBoundingBox(landmarks);\n const boxAroundHand = util.enlargeBox(util.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 = util.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 = [...util.getBoxCenter(box2), 1];\n const originalBoxCenter = [\n util.dot(boxCenter, inverseRotationMatrix[0]),\n util.dot(boxCenter, inverseRotationMatrix[1]),\n ];\n return coordsRotated.map((coord) => [\n Math.trunc(coord[0] + originalBoxCenter[0]),\n Math.trunc(coord[1] + originalBoxCenter[1]),\n Math.trunc(coord[2]),\n ]);\n }\n\n async estimateHands(image, config) {\n let useFreshBox = false;\n\n // run new detector every skipFrames\n let boxes;\n const skipTime = (config.hand.skipTime || 0) > (now() - lastTime);\n const skipFrame = this.skipped < (config.hand.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame) {\n boxes = await this.handDetector.predict(image, config);\n this.skipped = 0;\n }\n if (config.skipAllowed) 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: { landmarks: Point[], confidence: number, boxConfidence: number, fingerConfidence: number, box: { topLeft: Point, bottomRight: Point } }[] = [];\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 = util.getBoxCenter(currentBox);\n const palmCenterNormalized: [number, number] = [palmCenter[0] / image.shape[2], palmCenter[1] / image.shape[1]];\n const rotatedImage = config.hand.rotation && env.kernels.includes('rotatewithoffset') ? 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 = util.cutBoxFromImageAndResize(newBox, rotatedImage, [this.inputSize, this.inputSize]);\n const handImage = tf.div(croppedInput, constants.tf255);\n tf.dispose(croppedInput);\n tf.dispose(rotatedImage);\n const [confidenceT, keypoints] = this.handPoseModel.execute(handImage) as Tensor[];\n lastTime = now();\n tf.dispose(handImage);\n const confidence = (await confidenceT.data())[0];\n tf.dispose(confidenceT);\n if (confidence >= config.hand.minConfidence / 4) {\n const keypointsReshaped = tf.reshape(keypoints, [-1, 3]);\n const rawCoords = await keypointsReshaped.array();\n tf.dispose(keypoints);\n tf.dispose(keypointsReshaped);\n const coords = this.transformRawCoords(rawCoords, newBox, angle, rotationMatrix);\n const nextBoundingBox = this.getBoxForHandLandmarks(coords);\n this.storedBoxes[i] = { ...nextBoundingBox, confidence };\n const result = {\n landmarks: coords,\n confidence,\n boxConfidence: currentBox.confidence,\n fingerConfidence: confidence,\n box: { topLeft: nextBoundingBox.startPoint, bottomRight: nextBoundingBox.endPoint },\n };\n hands.push(result);\n } else {\n this.storedBoxes[i] = null;\n }\n tf.dispose(keypoints);\n } else {\n // const enlarged = box.enlargeBox(box.squarifyBox(box.shiftBox(currentBox, HAND_BOX_SHIFT_VECTOR)), handBoxEnlargeFactor);\n const enlarged = util.enlargeBox(util.squarifyBox(currentBox), handBoxEnlargeFactor);\n const result = {\n confidence: currentBox.confidence,\n boxConfidence: currentBox.confidence,\n fingerConfidence: 0,\n box: { topLeft: enlarged.startPoint, bottomRight: enlarged.endPoint },\n landmarks: [],\n };\n hands.push(result);\n }\n }\n this.storedBoxes = this.storedBoxes.filter((a) => a !== null);\n this.detectedHands = hands.length;\n if (hands.length > config.hand.maxDetected) hands.length = config.hand.maxDetected;\n return hands;\n }\n}\n", "/**\n * HandPose model implementation\n *\n * Based on: [**MediaPipe HandPose**](https://drive.google.com/file/d/1sv4sSb9BSNVZhLzxXJ0jBv9DqD-4jnAz/view)\n */\n\nimport { log } from '../util/util';\nimport * as handdetector from './handposedetector';\nimport * as handpipeline from './handposepipeline';\nimport * as fingerPose from './fingerpose';\nimport { loadModel } from '../tfjs/load';\nimport type { HandResult, Box, Point } from '../result';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nconst meshAnnotations = {\n thumb: [1, 2, 3, 4],\n index: [5, 6, 7, 8],\n middle: [9, 10, 11, 12],\n ring: [13, 14, 15, 16],\n pinky: [17, 18, 19, 20],\n palm: [0],\n};\n\nlet handDetectorModel: GraphModel | null;\nlet handPoseModel: GraphModel | null;\nlet handPipeline: handpipeline.HandPipeline;\n\nexport async function predict(input: Tensor, config: Config): Promise {\n const predictions = await handPipeline.estimateHands(input, config);\n if (!predictions) return [];\n const hands: HandResult[] = [];\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 keypoints = predictions[i].landmarks as unknown as Point[];\n let box: Box = [Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, 0, 0]; // maximums so conditionals work\n let boxRaw: Box = [0, 0, 0, 0];\n if (keypoints && keypoints.length > 0) { // if we have landmarks, calculate box based on landmarks\n for (const pt of keypoints) {\n if (pt[0] < box[0]) box[0] = pt[0];\n if (pt[1] < box[1]) box[1] = pt[1];\n if (pt[0] > box[2]) box[2] = pt[0];\n if (pt[1] > box[3]) box[3] = pt[1];\n }\n box[2] -= box[0];\n box[3] -= box[1];\n boxRaw = [box[0] / (input.shape[2] || 0), box[1] / (input.shape[1] || 0), box[2] / (input.shape[2] || 0), box[3] / (input.shape[1] || 0)];\n } else { // otherwise use box from prediction\n box = predictions[i].box ? [\n Math.trunc(Math.max(0, predictions[i].box.topLeft[0])),\n Math.trunc(Math.max(0, predictions[i].box.topLeft[1])),\n Math.trunc(Math.min((input.shape[2] || 0), predictions[i].box.bottomRight[0]) - Math.max(0, predictions[i].box.topLeft[0])),\n Math.trunc(Math.min((input.shape[1] || 0), predictions[i].box.bottomRight[1]) - Math.max(0, predictions[i].box.topLeft[1])),\n ] : [0, 0, 0, 0];\n boxRaw = [\n (predictions[i].box.topLeft[0]) / (input.shape[2] || 0),\n (predictions[i].box.topLeft[1]) / (input.shape[1] || 0),\n (predictions[i].box.bottomRight[0] - predictions[i].box.topLeft[0]) / (input.shape[2] || 0),\n (predictions[i].box.bottomRight[1] - predictions[i].box.topLeft[1]) / (input.shape[1] || 0),\n ];\n }\n const landmarks = fingerPose.analyze(keypoints);\n hands.push({\n id: i,\n score: Math.round(100 * predictions[i].confidence) / 100,\n boxScore: Math.round(100 * predictions[i].boxConfidence) / 100,\n fingerScore: Math.round(100 * predictions[i].fingerConfidence) / 100,\n label: 'hand',\n box,\n boxRaw,\n keypoints,\n annotations: annotations as HandResult['annotations'],\n landmarks: landmarks as HandResult['landmarks'],\n });\n }\n return hands;\n}\n\nexport async function load(config: Config): Promise<[GraphModel | null, GraphModel | null]> {\n if (env.initial) {\n handDetectorModel = null;\n handPoseModel = null;\n }\n if (!handDetectorModel || !handPoseModel) {\n [handDetectorModel, handPoseModel] = await Promise.all([\n config.hand.enabled ? loadModel(config.hand.detector?.modelPath) : null,\n config.hand.landmarks ? loadModel(config.hand.skeleton?.modelPath) : null,\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 = handDetectorModel ? new handdetector.HandDetector(handDetectorModel) : undefined;\n if (handDetector && handPoseModel) handPipeline = new handpipeline.HandPipeline(handDetector, handPoseModel);\n return [handDetectorModel, handPoseModel];\n}\n", "/**\n * HandTrack model implementation\n *\n * Based on:\n * - Hand Detection & Skeleton: [**MediaPipe HandPose**](https://drive.google.com/file/d/1sv4sSb9BSNVZhLzxXJ0jBv9DqD-4jnAz/view)\n * - Hand Tracking: [**HandTracking**](https://github.com/victordibia/handtracking)\n */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport { log, now } from '../util/util';\nimport * as box from '../util/box';\nimport { loadModel } from '../tfjs/load';\nimport type { HandResult, HandType, Box, Point } from '../result';\nimport type { GraphModel, Tensor, Tensor1D, Tensor2D, Tensor4D } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\nimport * as fingerPose from './fingerpose';\nimport { fakeOps } from '../tfjs/backend';\nimport { constants } from '../tfjs/constants';\n\nconst models: [GraphModel | null, GraphModel | null] = [null, null];\nconst modelOutputNodes = ['StatefulPartitionedCall/Postprocessor/Slice', 'StatefulPartitionedCall/Postprocessor/ExpandDims_1'];\n\nconst inputSize = [[0, 0], [0, 0]];\n\nconst classes = ['hand', 'fist', 'pinch', 'point', 'face', 'tip', 'pinchtip'];\nconst faceIndex = 4;\n\nconst boxExpandFact = 1.6;\nconst maxDetectorResolution = 512;\nconst detectorExpandFact = 1.4;\n\nlet skipped = Number.MAX_SAFE_INTEGER;\nlet lastTime = 0;\nlet outputSize: [number, number] = [0, 0];\n\ninterface HandDetectResult {\n id: number,\n score: number,\n box: Box,\n boxRaw: Box,\n label: HandType,\n}\n\nconst cache: {\n boxes: HandDetectResult[],\n hands: HandResult[];\n} = {\n boxes: [],\n hands: [],\n};\n\nconst fingerMap = {\n /*\n thumb: [0, 1, 2, 3, 4],\n index: [0, 5, 6, 7, 8],\n middle: [0, 9, 10, 11, 12],\n ring: [0, 13, 14, 15, 16],\n pinky: [0, 17, 18, 19, 20],\n palm: [0],\n */\n thumb: [1, 2, 3, 4],\n index: [5, 6, 7, 8],\n middle: [9, 10, 11, 12],\n ring: [13, 14, 15, 16],\n pinky: [17, 18, 19, 20],\n base: [0],\n palm: [0, 17, 13, 9, 5, 1, 0],\n};\n\nexport async function loadDetect(config: Config): Promise {\n // HandTrack Model: Original: TFJS Port: \n if (env.initial) models[0] = null;\n if (!models[0]) {\n // handtrack model has some kernel ops defined in model but those are never referenced and non-existent in tfjs\n // ideally need to prune the model itself\n fakeOps(['tensorlistreserve', 'enter', 'tensorlistfromtensor', 'merge', 'loopcond', 'switch', 'exit', 'tensorliststack', 'nextiteration', 'tensorlistsetitem', 'tensorlistgetitem', 'reciprocal', 'shape', 'split', 'where'], config);\n models[0] = await loadModel(config.hand.detector?.modelPath);\n const inputs = models[0]['executor'] ? Object.values(models[0].modelSignature['inputs']) : undefined;\n inputSize[0][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;\n inputSize[0][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;\n } else if (config.debug) log('cached model:', models[0]['modelUrl']);\n return models[0];\n}\n\nexport async function loadSkeleton(config: Config): Promise {\n if (env.initial) models[1] = null;\n if (!models[1]) {\n models[1] = await loadModel(config.hand.skeleton?.modelPath);\n const inputs = models[1]['executor'] ? Object.values(models[1].modelSignature['inputs']) : undefined;\n inputSize[1][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;\n inputSize[1][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;\n } else if (config.debug) log('cached model:', models[1]['modelUrl']);\n return models[1];\n}\n\nexport async function load(config: Config): Promise<[GraphModel | null, GraphModel | null]> {\n if (!models[0]) await loadDetect(config);\n if (!models[1]) await loadSkeleton(config);\n return models;\n}\n\nasync function detectHands(input: Tensor4D, config: Config): Promise {\n const hands: HandDetectResult[] = [];\n if (!input || !models[0]) return hands;\n const t: Record = {};\n const ratio = (input.shape[2] || 1) / (input.shape[1] || 1);\n const height = Math.min(Math.round((input.shape[1] || 0) / 8) * 8, maxDetectorResolution); // use dynamic input size but cap at 512\n const width = Math.round(height * ratio / 8) * 8;\n t.resize = tf.image.resizeBilinear(input, [height, width]); // todo: resize with padding\n t.cast = tf.cast(t.resize, 'int32');\n [t.rawScores, t.rawBoxes] = await models[0].executeAsync(t.cast, modelOutputNodes) as Tensor[];\n t.boxes = tf.squeeze(t.rawBoxes, [0, 2]);\n t.scores = tf.squeeze(t.rawScores, [0]);\n const classScores: Tensor[] = tf.unstack(t.scores, 1); // unstack scores based on classes\n tf.dispose(classScores[faceIndex]);\n classScores.splice(faceIndex, 1); // remove faces\n t.filtered = tf.stack(classScores, 1); // restack\n tf.dispose(classScores);\n // t.filtered = t.scores;\n t.max = tf.max(t.filtered, 1); // max overall score\n t.argmax = tf.argMax(t.filtered, 1); // class index of max overall score\n let id = 0;\n t.nms = await tf.image.nonMaxSuppressionAsync(t.boxes as Tensor2D, t.max as Tensor1D, (config.hand.maxDetected || 0) + 1, config.hand.iouThreshold || 0, config.hand.minConfidence || 1);\n const nms = await t.nms.data();\n const scores = await t.max.data();\n const classNum = await t.argmax.data();\n for (const nmsIndex of Array.from(nms)) { // generates results for each class\n const boxSlice = tf.slice(t.boxes, nmsIndex, 1);\n const boxYX = await boxSlice.data();\n tf.dispose(boxSlice);\n const boxData: Box = [boxYX[1], boxYX[0], boxYX[3] - boxYX[1], boxYX[2] - boxYX[0]]; // yx box reshaped to standard box\n const boxRaw: Box = box.scale(boxData, detectorExpandFact);\n const boxFull: Box = [Math.trunc(boxData[0] * outputSize[0]), Math.trunc(boxData[1] * outputSize[1]), Math.trunc(boxData[2] * outputSize[0]), Math.trunc(boxData[3] * outputSize[1])];\n const score = scores[nmsIndex];\n const label = classes[classNum[nmsIndex]] as HandType;\n const hand: HandDetectResult = { id: id++, score, box: boxFull, boxRaw, label };\n hands.push(hand);\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n hands.sort((a, b) => b.score - a.score);\n if (hands.length > (config.hand.maxDetected || 1)) hands.length = (config.hand.maxDetected || 1);\n return hands;\n}\n\nasync function detectFingers(input: Tensor4D, h: HandDetectResult, config: Config): Promise {\n const hand: HandResult = { // initial values inherited from hand detect\n id: h.id,\n score: Math.round(100 * h.score) / 100,\n boxScore: Math.round(100 * h.score) / 100,\n fingerScore: 0,\n box: h.box,\n boxRaw: h.boxRaw,\n label: h.label,\n keypoints: [],\n landmarks: {} as HandResult['landmarks'],\n annotations: {} as HandResult['annotations'],\n };\n if (input && models[1] && config.hand.landmarks && h.score > (config.hand.minConfidence || 0)) {\n const t: Record = {};\n const boxCrop = [h.boxRaw[1], h.boxRaw[0], h.boxRaw[3] + h.boxRaw[1], h.boxRaw[2] + h.boxRaw[0]] as Box;\n t.crop = tf.image.cropAndResize(input, [boxCrop], [0], [inputSize[1][0], inputSize[1][1]], 'bilinear');\n t.div = tf.div(t.crop, constants.tf255);\n [t.score, t.keypoints] = models[1].execute(t.div, ['Identity_1', 'Identity']) as Tensor[];\n const rawScore = (await t.score.data())[0];\n const score = (100 - Math.trunc(100 / (1 + Math.exp(rawScore)))) / 100; // reverse sigmoid value\n if (score >= (config.hand.minConfidence || 0)) {\n hand.fingerScore = score;\n t.reshaped = tf.reshape(t.keypoints, [-1, 3]);\n const coordsData: Point[] = await t.reshaped.array() as Point[];\n const coordsRaw: Point[] = coordsData.map((kpt) => [kpt[0] / inputSize[1][1], kpt[1] / inputSize[1][0], (kpt[2] || 0)]);\n const coordsNorm: Point[] = coordsRaw.map((kpt) => [kpt[0] * h.boxRaw[2], kpt[1] * h.boxRaw[3], (kpt[2] || 0)]);\n hand.keypoints = (coordsNorm).map((kpt) => [outputSize[0] * (kpt[0] + h.boxRaw[0]), outputSize[1] * (kpt[1] + h.boxRaw[1]), (kpt[2] || 0)]);\n hand.landmarks = fingerPose.analyze(hand.keypoints) as HandResult['landmarks']; // calculate finger gestures\n for (const key of Object.keys(fingerMap)) { // map keypoints to per-finger annotations\n hand.annotations[key] = fingerMap[key].map((index: number) => (hand.landmarks && hand.keypoints[index] ? hand.keypoints[index] : null));\n }\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n }\n return hand;\n}\n\nexport async function predict(input: Tensor4D, config: Config): Promise {\n if (!models[0]?.['executor'] || !models[1]?.['executor'] || !models[0].inputs[0].shape || !models[1].inputs[0].shape) return []; // something is wrong with the model\n outputSize = [input.shape[2] || 0, input.shape[1] || 0];\n skipped++; // increment skip frames\n const skipTime = (config.hand.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.hand.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame) {\n return cache.hands; // return cached results without running anything\n }\n return new Promise(async (resolve) => {\n const skipTimeExtended = 3 * (config.hand.skipTime || 0) > (now() - lastTime);\n const skipFrameExtended = skipped < 3 * (config.hand.skipFrames || 0);\n if (config.skipAllowed && cache.hands.length === config.hand.maxDetected) { // we have all detected hands so we're definitely skipping\n cache.hands = await Promise.all(cache.boxes.map((handBox) => detectFingers(input, handBox, config)));\n } else if (config.skipAllowed && skipTimeExtended && skipFrameExtended && cache.hands.length > 0) { // we have some cached results: maybe not enough but anyhow continue for bit longer\n cache.hands = await Promise.all(cache.boxes.map((handBox) => detectFingers(input, handBox, config)));\n } else { // finally rerun detector\n cache.boxes = await detectHands(input, config);\n lastTime = now();\n cache.hands = await Promise.all(cache.boxes.map((handBox) => detectFingers(input, handBox, config)));\n skipped = 0;\n }\n\n const oldCache = [...cache.boxes];\n cache.boxes.length = 0; // reset cache\n if (config.cacheSensitivity > 0) {\n for (let i = 0; i < cache.hands.length; i++) {\n const boxKpt = box.square(cache.hands[i].keypoints, outputSize);\n if (boxKpt.box[2] / (input.shape[2] || 1) > 0.05 && boxKpt.box[3] / (input.shape[1] || 1) > 0.05 && cache.hands[i].fingerScore && cache.hands[i].fingerScore > (config.hand.minConfidence || 0)) {\n const boxScale = box.scale(boxKpt.box, boxExpandFact);\n const boxScaleRaw = box.scale(boxKpt.boxRaw, boxExpandFact);\n // const boxCrop = box.crop(boxScaleRaw);\n cache.boxes.push({ ...oldCache[i], box: boxScale, boxRaw: boxScaleRaw });\n }\n }\n }\n for (let i = 0; i < cache.hands.length; i++) { // replace detected boxes with calculated boxes in final output\n const bbox = box.calc(cache.hands[i].keypoints, outputSize);\n cache.hands[i].box = bbox.box;\n cache.hands[i].boxRaw = bbox.boxRaw;\n }\n resolve(cache.hands);\n });\n}\n", "/**\n * Type definitions for Human result object\n */\n\nimport type { Tensor } from './tfjs/types';\nimport type { FaceGesture, BodyGesture, HandGesture, IrisGesture } from './gesture/gesture';\nimport type { AnyCanvas } from './exports';\n\n/** generic box as [x, y, width, height] */\nexport type Box = [number, number, number, number];\n/** generic point as [x, y, z?] */\nexport type Point = [number, number, number?];\n\nexport type Emotion = 'angry' | 'disgust' | 'fear' | 'happy' | 'sad' | 'surprise' | 'neutral';\nexport type Gender = 'male' | 'female' | 'unknown';\nexport type Race = 'white' | 'black' | 'asian' | 'indian' | 'other';\nexport type FaceLandmark = 'leftEye' | 'rightEye' | 'nose' | 'mouth' | 'leftEar' | 'rightEar' | 'symmetryLine' | 'silhouette'\n | 'lipsUpperOuter' | 'lipsLowerOuter' | 'lipsUpperInner' | 'lipsLowerInner'\n | 'rightEyeUpper0' | 'rightEyeLower0' | 'rightEyeUpper1' | 'rightEyeLower1' | 'rightEyeUpper2' | 'rightEyeLower2' | 'rightEyeLower3' | 'rightEyebrowUpper' | 'rightEyebrowLower' | 'rightEyeIris'\n | 'leftEyeUpper0' | 'leftEyeLower0' | 'leftEyeUpper1' | 'leftEyeLower1' | 'leftEyeUpper2' | 'leftEyeLower2' | 'leftEyeLower3' | 'leftEyebrowUpper' | 'leftEyebrowLower' | 'leftEyeIris'\n | 'midwayBetweenEyes' | 'noseTip' | 'noseBottom' | 'noseRightCorner' | 'noseLeftCorner' | 'rightCheek' | 'leftCheek';\n\n/** Face results\n * - Combined results of face detector, face mesh, age, gender, emotion, embedding, iris models\n * - Some values may be null if specific model is not enabled\n */\nexport interface FaceResult {\n /** face id */\n id: number\n /** overall face score */\n score: number,\n /** detection score */\n boxScore: number,\n /** mesh score */\n faceScore: number,\n /** detected face box */\n box: Box,\n /** detected face box normalized to 0..1 */\n boxRaw: Box,\n /** detected face mesh */\n mesh: Point[]\n /** detected face mesh normalized to 0..1 */\n meshRaw: Point[],\n /** face contours as array of 2d points normalized to 0..1 */\n // contoursRaw: Array<[number, number]>,\n /** face contours as array of 2d points */\n // contours: Array<[number, number]>,\n /** mesh keypoints combined into annotated results */\n annotations: Record,\n /** detected age */\n age?: number,\n /** detected gender */\n gender?: Gender,\n /** gender detection score */\n genderScore?: number,\n /** detected emotions */\n emotion?: { score: number, emotion: Emotion }[],\n /** detected race */\n race?: { score: number, race: Race }[],\n /** face descriptor */\n embedding?: number[],\n /** face distance from camera */\n distance?: number,\n /** face anti-spoofing result confidence */\n real?: number,\n /** face liveness result confidence */\n live?: number,\n /** face rotation details */\n rotation?: {\n angle: { roll: number, yaw: number, pitch: number },\n matrix: [number, number, number, number, number, number, number, number, number],\n gaze: { bearing: number, strength: number },\n } | null,\n /** detected face as tensor that can be used in further pipelines */\n tensor?: Tensor,\n}\n\nexport type BodyLandmarkPoseNet = 'nose' | 'leftEye' | 'rightEye' | 'leftEar' | 'rightEar' | 'leftShoulder' | 'rightShoulder' | 'leftElbow' | 'rightElbow' | 'leftWrist' | 'rightWrist' | 'leftHip' | 'rightHip' | 'leftKnee' | 'rightKnee' | 'leftAnkle' | 'rightAnkle';\nexport type BodyLandmarkMoveNet = 'nose' | 'leftEye' | 'rightEye' | 'leftEar' | 'rightEar' | 'leftShoulder' | 'rightShoulder' | 'leftElbow' | 'rightElbow' | 'leftWrist' | 'rightWrist' | 'leftHip' | 'rightHip' | 'leftKnee' | 'rightKnee' | 'leftAnkle' | 'rightAnkle';\nexport type BodyLandmarkEfficientNet = 'head' | 'neck' | 'rightShoulder' | 'rightElbow' | 'rightWrist' | 'chest' | 'leftShoulder' | 'leftElbow' | 'leftWrist' | 'bodyCenter' | 'rightHip' | 'rightKnee' | 'rightAnkle' | 'leftHip' | 'leftKnee' | 'leftAnkle';\nexport type BodyLandmarkBlazePose = 'nose' | 'leftEyeInside' | 'leftEye' | 'leftEyeOutside' | 'rightEyeInside' | 'rightEye' | 'rightEyeOutside' | 'leftEar' | 'rightEar' | 'leftMouth' | 'rightMouth' | 'leftShoulder' | 'rightShoulder'\n | 'leftElbow' | 'rightElbow' | 'leftWrist' | 'rightWrist' | 'leftPinky' | 'rightPinky' | 'leftIndex' | 'rightIndex' | 'leftThumb' | 'rightThumb' | 'leftHip' | 'rightHip' | 'leftKnee' | 'rightKnee' | 'leftAnkle' | 'rightAnkle'\n | 'leftHeel' | 'rightHeel' | 'leftFoot' | 'rightFoot' | 'bodyCenter' | 'bodyTop' | 'leftPalm' | 'leftHand' | 'rightPalm' | 'rightHand';\nexport type BodyLandmark = BodyLandmarkPoseNet | BodyLandmarkMoveNet | BodyLandmarkEfficientNet | BodyLandmarkBlazePose;\nexport type BodyAnnotationBlazePose = 'leftLeg' | 'rightLeg' | 'torso' | 'leftArm' | 'rightArm' | 'leftEye' | 'rightEye' | 'mouth';\nexport type BodyAnnotationEfficientPose = 'leftLeg' | 'rightLeg' | 'torso' | 'leftArm' | 'rightArm' | 'head';\nexport type BodyAnnotation = BodyAnnotationBlazePose | BodyAnnotationEfficientPose;\n\n/** Body Result keypoints */\nexport interface BodyKeypoint {\n /** body part name */\n part: BodyLandmark,\n /** body part position */\n position: Point,\n /** body part position normalized to 0..1 */\n positionRaw: Point,\n /** body part position relative to body center in meters */\n distance?: Point,\n /** body part detection score */\n score: number,\n}\n\n/** Body results */\nexport interface BodyResult {\n /** body id */\n id: number,\n /** body detection score */\n score: number,\n /** detected body box */\n box: Box,\n /** detected body box normalized to 0..1 */\n boxRaw: Box,\n /** detected body keypoints */\n keypoints: BodyKeypoint[]\n /** detected body keypoints combined into annotated parts */\n annotations: Record,\n}\n\nexport type HandType = 'hand' | 'fist' | 'pinch' | 'point' | 'face' | 'tip' | 'pinchtip';\nexport type Finger = 'index' | 'middle' | 'pinky' | 'ring' | 'thumb' | 'palm';\nexport type FingerCurl = 'none' | 'half' | 'full';\nexport type FingerDirection = 'verticalUp' | 'verticalDown' | 'horizontalLeft' | 'horizontalRight' | 'diagonalUpRight' | 'diagonalUpLeft' | 'diagonalDownRight' | 'diagonalDownLeft';\n\n/** Hand results */\nexport interface HandResult {\n /** hand id */\n id: number,\n /** hand overal score */\n score: number,\n /** hand detection score */\n boxScore: number,\n /** hand skelton score */\n fingerScore: number,\n /** detected hand box */\n box: Box,\n /** detected hand box normalized to 0..1 */\n boxRaw: Box,\n /** detected hand keypoints */\n keypoints: Point[],\n /** detected hand class */\n label: HandType,\n /** detected hand keypoints combined into annotated parts */\n annotations: Record,\n /** detected hand parts annotated with part gestures */\n landmarks: Record,\n}\n\nexport type ObjectType = 'person' | 'bicycle' | 'car' | 'motorcycle' | 'airplane' | 'bus' | 'train' | 'truck' | 'boat' | 'traffic light' | 'fire hydrant' | 'stop sign' | 'parking meter'\n | 'bench' | 'bird' | 'cat' | 'dog' | 'horse' | 'sheep' | 'cow' | 'elephant' | 'bear' | 'zebra' | 'giraffe' | 'backpack' | 'umbrella' | 'handbag' | 'tie' | 'suitcase' | 'frisbee'\n | 'skis' | 'snowboard' | 'sports ball' | 'kite' | 'baseball bat' | 'baseball glove' | 'skateboard' | 'surfboard' | 'tennis racket' | 'bottle' | 'wine glass' | 'cup' | 'fork'\n | 'knife' | 'spoon' | 'bowl' | 'banana' | 'apple' | 'sandwich' | 'orange' | 'broccoli' | 'carrot' | 'hot dog' | 'pizza' | 'donut' | 'cake' | 'chair' | 'couch' | 'potted plant'\n | 'bed' | 'dining table' | 'toilet' | 'tv' | 'laptop' | 'mouse' | 'remote' | 'keyboard' | 'cell phone' | 'microwave' | 'oven' | 'toaster' | 'sink' | 'refrigerator' | 'book'\n | 'clock' | 'vase' | 'scissors' | 'teddy bear' | 'hair drier' | 'toothbrush';\n\n/** Object results */\nexport interface ObjectResult {\n /** object id */\n id: number,\n /** object detection score */\n score: number,\n /** detected object class id */\n class: number,\n /** detected object class name */\n label: ObjectType,\n /** detected object box */\n box: Box,\n /** detected object box normalized to 0..1 */\n boxRaw: Box,\n}\n\n/** Gesture combined results\n * Each result has:\n * - part: part name and number where gesture was detected: `face`, `iris`, `body`, `hand`\n * - gesture: gesture detected\n */\nexport type GestureResult =\n { 'face': number, gesture: FaceGesture }\n | { 'iris': number, gesture: IrisGesture }\n | { 'body': number, gesture: BodyGesture }\n | { 'hand': number, gesture: HandGesture }\n\n/** Person getter\n* - Triggers combining all individual results into a virtual person object\n*/\nexport interface PersonResult {\n /** person id */\n id: number,\n /** face result that belongs to this person */\n face: FaceResult,\n /** body result that belongs to this person */\n body: BodyResult | null,\n /** left and right hand results that belong to this person */\n hands: { left: HandResult | null, right: HandResult | null },\n /** detected gestures specific to this person */\n gestures: GestureResult[],\n /** box that defines the person */\n box: Box,\n /** box that defines the person normalized to 0..1 */\n boxRaw?: Box,\n}\n\n/**\n * Result interface definition for **Human** library\n *\n * Contains all possible detection results\n */\nexport interface Result {\n /** {@link FaceResult}: detection & analysis results */\n face: FaceResult[],\n /** {@link BodyResult}: detection & analysis results */\n body: BodyResult[],\n /** {@link HandResult}: detection & analysis results */\n hand: HandResult[],\n /** {@link GestureResult}: detection & analysis results */\n gesture: GestureResult[],\n /** {@link ObjectResult}: detection & analysis results */\n object: ObjectResult[]\n /** global performance object with timing values for each operation */\n performance: Record,\n /** optional processed canvas that can be used to draw input on screen */\n canvas?: AnyCanvas | null,\n /** timestamp of detection representing the milliseconds elapsed since the UNIX epoch */\n readonly timestamp: number,\n /** getter property that returns unified persons object */\n persons: PersonResult[],\n /** Last known error message */\n error: string | null;\n /** Resolution width */\n width: number,\n /** Resolution height */\n height: number,\n}\n\nexport const empty = (error: string | null = null): Result => ({ face: [], body: [], hand: [], gesture: [], object: [], persons: [], performance: {}, timestamp: 0, width: 0, height: 0, error });\n", "export const kpt: string[] = [ // used to create part labels\n 'nose',\n 'leftEye',\n 'rightEye',\n 'leftEar',\n 'rightEar',\n 'leftShoulder',\n 'rightShoulder',\n 'leftElbow',\n 'rightElbow',\n 'leftWrist',\n 'rightWrist',\n 'leftHip',\n 'rightHip',\n 'leftKnee',\n 'rightKnee',\n 'leftAnkle',\n 'rightAnkle',\n];\n\nexport const horizontal: string[][] = [ // used to fix left vs right\n ['leftEye', 'rightEye'],\n ['leftEar', 'rightEar'],\n ['leftShoulder', 'rightShoulder'],\n ['leftElbow', 'rightElbow'],\n ['leftWrist', 'rightWrist'],\n ['leftHip', 'rightHip'],\n ['leftKnee', 'rightKnee'],\n ['leftAnkle', 'rightAnkle'],\n];\n\nexport const vertical: string[][] = [ // used to remove unlikely keypoint positions\n ['leftKnee', 'leftShoulder'],\n ['rightKnee', 'rightShoulder'],\n ['leftAnkle', 'leftKnee'],\n ['rightAnkle', 'rightKnee'],\n];\n\nexport const relative: string[][][] = [ // used to match relative body parts\n [['leftHip', 'rightHip'], ['leftShoulder', 'rightShoulder']],\n [['leftElbow', 'rightElbow'], ['leftShoulder', 'rightShoulder']],\n];\n\nexport const connected: Record = { // used to create body outline in annotations\n leftLeg: ['leftHip', 'leftKnee', 'leftAnkle'],\n rightLeg: ['rightHip', 'rightKnee', 'rightAnkle'],\n torso: ['leftShoulder', 'rightShoulder', 'rightHip', 'leftHip', 'leftShoulder'],\n leftArm: ['leftShoulder', 'leftElbow', 'leftWrist'],\n rightArm: ['rightShoulder', 'rightElbow', 'rightWrist'],\n head: [],\n};\n", "/**\n * Results interpolation for smoothening of video detection results inbetween detected frames\n */\n\nimport { Result, FaceResult, BodyResult, HandResult, ObjectResult, PersonResult, Box, Point, BodyLandmark, BodyAnnotation, empty } from '../result';\nimport type { Config } from '../config';\n\nimport * as moveNetCoords from '../body/movenetcoords';\nimport * as blazePoseCoords from '../body/blazeposecoords';\nimport * as efficientPoseCoords from '../body/efficientposecoords';\nimport { now } from './util';\nimport { env } from './env';\n\nconst bufferedResult: Result = empty();\nlet interpolateTime = 0;\n\nexport function calc(newResult: Result, config: Config): Result {\n const t0 = now();\n if (!newResult) return empty();\n // each record is only updated using deep clone when number of detected record changes, otherwise it will converge by itself\n // otherwise bufferedResult is a shallow clone of result plus updated local calculated values\n // thus mixing by-reference and by-value assignments to minimize memory operations\n\n const elapsed = Date.now() - newResult.timestamp;\n\n /* curve fitted: buffer = 8 - ln(delay)\n interpolation formula: current = ((buffer - 1) * previous + live) / buffer\n - at 50ms delay buffer = ~4.1 => 28% towards live data\n - at 250ms delay buffer = ~2.5 => 40% towards live data\n - at 500ms delay buffer = ~1.8 => 55% towards live data\n - at 750ms delay buffer = ~1.4 => 71% towards live data\n - at 1sec delay buffer = 1 which means live data is used\n */\n const bufferedFactor = elapsed < 1000 ? 8 - Math.log(elapsed + 1) : 1;\n\n if (newResult.canvas) bufferedResult.canvas = newResult.canvas;\n if (newResult.error) bufferedResult.error = newResult.error;\n\n // interpolate body results\n if (!bufferedResult.body || (newResult.body.length !== bufferedResult.body.length)) {\n bufferedResult.body = JSON.parse(JSON.stringify(newResult.body)) as BodyResult[]; // deep clone once\n } else {\n for (let i = 0; i < newResult.body.length; i++) {\n const box = newResult.body[i].box // update box\n .map((newBoxCoord, j) => ((bufferedFactor - 1) * bufferedResult.body[i].box[j] + newBoxCoord) / bufferedFactor) as Box;\n const boxRaw = newResult.body[i].boxRaw // update boxRaw\n .map((newBoxCoord, j) => ((bufferedFactor - 1) * bufferedResult.body[i].boxRaw[j] + newBoxCoord) / bufferedFactor) as Box;\n const keypoints = (newResult.body[i].keypoints // update keypoints\n .map((newKpt, j) => ({\n score: newKpt.score,\n part: newKpt.part,\n position: [\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].position[0] || 0) + (newKpt.position[0] || 0)) / bufferedFactor : newKpt.position[0],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].position[1] || 0) + (newKpt.position[1] || 0)) / bufferedFactor : newKpt.position[1],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].position[2] || 0) + (newKpt.position[2] || 0)) / bufferedFactor : newKpt.position[2],\n ],\n positionRaw: [\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].positionRaw[0] || 0) + (newKpt.positionRaw[0] || 0)) / bufferedFactor : newKpt.positionRaw[0],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].positionRaw[1] || 0) + (newKpt.positionRaw[1] || 0)) / bufferedFactor : newKpt.positionRaw[1],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].positionRaw[2] || 0) + (newKpt.positionRaw[2] || 0)) / bufferedFactor : newKpt.positionRaw[2],\n ],\n distance: [\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].distance?.[0] || 0) + (newKpt.distance?.[0] || 0)) / bufferedFactor : newKpt.distance?.[0],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].distance?.[1] || 0) + (newKpt.distance?.[1] || 0)) / bufferedFactor : newKpt.distance?.[1],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].distance?.[2] || 0) + (newKpt.distance?.[2] || 0)) / bufferedFactor : newKpt.distance?.[2],\n ],\n }))) as { score: number, part: BodyLandmark, position: [number, number, number?], positionRaw: [number, number, number?] }[];\n\n const annotations: Record = {} as Record; // recreate annotations\n let coords = { connected: {} };\n if (config.body.modelPath?.includes('efficientpose')) coords = efficientPoseCoords;\n else if (config.body.modelPath?.includes('blazepose')) coords = blazePoseCoords;\n else if (config.body.modelPath?.includes('movenet')) coords = moveNetCoords;\n for (const [name, indexes] of Object.entries(coords.connected as Record)) {\n const pt: Point[][] = [];\n for (let j = 0; j < indexes.length - 1; j++) {\n const pt0 = keypoints.find((kp) => kp.part === indexes[j]);\n const pt1 = keypoints.find((kp) => kp.part === indexes[j + 1]);\n // if (pt0 && pt1 && pt0.score > (config.body.minConfidence || 0) && pt1.score > (config.body.minConfidence || 0)) pt.push([pt0.position, pt1.position]);\n if (pt0 && pt1) pt.push([pt0.position, pt1.position]);\n }\n annotations[name] = pt;\n }\n bufferedResult.body[i] = { ...newResult.body[i], box, boxRaw, keypoints, annotations }; // shallow clone plus updated values\n }\n }\n\n // interpolate hand results\n if (!bufferedResult.hand || (newResult.hand.length !== bufferedResult.hand.length)) {\n bufferedResult.hand = JSON.parse(JSON.stringify(newResult.hand)); // deep clone once\n } else {\n for (let i = 0; i < newResult.hand.length; i++) {\n const box = (newResult.hand[i].box// update box\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i].box[j] + b) / bufferedFactor)) as Box;\n const boxRaw = (newResult.hand[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i].boxRaw[j] + b) / bufferedFactor)) as Box;\n if (bufferedResult.hand[i].keypoints.length !== newResult.hand[i].keypoints.length) bufferedResult.hand[i].keypoints = newResult.hand[i].keypoints; // reset keypoints as previous frame did not have them\n const keypoints = newResult.hand[i].keypoints && newResult.hand[i].keypoints.length > 0 ? newResult.hand[i].keypoints // update landmarks\n .map((landmark, j) => landmark\n .map((coord, k) => (((bufferedFactor - 1) * (bufferedResult.hand[i].keypoints[j][k] || 1) + (coord || 0)) / bufferedFactor)) as Point)\n : [];\n let annotations = {};\n if (Object.keys(bufferedResult.hand[i].annotations).length !== Object.keys(newResult.hand[i].annotations).length) {\n bufferedResult.hand[i].annotations = newResult.hand[i].annotations; // reset annotations as previous frame did not have them\n annotations = bufferedResult.hand[i].annotations;\n } else if (newResult.hand[i].annotations) {\n for (const key of Object.keys(newResult.hand[i].annotations)) { // update annotations\n annotations[key] = newResult.hand[i]?.annotations?.[key]?.[0]\n ? newResult.hand[i].annotations[key]\n .map((val, j: number) => val\n .map((coord: number, k: number) => ((bufferedFactor - 1) * bufferedResult.hand[i].annotations[key][j][k] + coord) / bufferedFactor))\n : null;\n }\n }\n bufferedResult.hand[i] = { ...newResult.hand[i], box, boxRaw, keypoints, annotations: annotations as HandResult['annotations'] }; // shallow clone plus updated values\n }\n }\n\n // interpolate face results\n if (!bufferedResult.face || (newResult.face.length !== bufferedResult.face.length)) {\n bufferedResult.face = JSON.parse(JSON.stringify(newResult.face)) as FaceResult[]; // deep clone once\n } else {\n for (let i = 0; i < newResult.face.length; i++) {\n const box = (newResult.face[i].box // update box\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i].box[j] + b) / bufferedFactor)) as Box;\n const boxRaw = (newResult.face[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i].boxRaw[j] + b) / bufferedFactor)) as Box;\n if (newResult.face[i].rotation) {\n const rotation: {\n matrix: [number, number, number, number, number, number, number, number, number],\n angle: { roll: number, yaw: number, pitch: number },\n gaze: { bearing: number, strength: number }\n } = { matrix: [0, 0, 0, 0, 0, 0, 0, 0, 0], angle: { roll: 0, yaw: 0, pitch: 0 }, gaze: { bearing: 0, strength: 0 } };\n rotation.matrix = newResult.face[i].rotation?.matrix as [number, number, number, number, number, number, number, number, number];\n rotation.angle = {\n roll: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.angle?.roll || 0) + (newResult.face[i].rotation?.angle?.roll || 0)) / bufferedFactor,\n yaw: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.angle?.yaw || 0) + (newResult.face[i].rotation?.angle?.yaw || 0)) / bufferedFactor,\n pitch: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.angle?.pitch || 0) + (newResult.face[i].rotation?.angle?.pitch || 0)) / bufferedFactor,\n };\n rotation.gaze = {\n // not fully correct due projection on circle, also causes wrap-around draw on jump from negative to positive\n bearing: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.gaze.bearing || 0) + (newResult.face[i].rotation?.gaze.bearing || 0)) / bufferedFactor,\n strength: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.gaze.strength || 0) + (newResult.face[i].rotation?.gaze.strength || 0)) / bufferedFactor,\n };\n bufferedResult.face[i] = { ...newResult.face[i], rotation, box, boxRaw }; // shallow clone plus updated values\n } else {\n bufferedResult.face[i] = { ...newResult.face[i], box, boxRaw }; // shallow clone plus updated values\n }\n }\n }\n\n // interpolate object detection results\n if (!bufferedResult.object || (newResult.object.length !== bufferedResult.object.length)) {\n bufferedResult.object = JSON.parse(JSON.stringify(newResult.object)) as ObjectResult[]; // deep clone once\n } else {\n for (let i = 0; i < newResult.object.length; i++) {\n const box = (newResult.object[i].box // update box\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i].box[j] + b) / bufferedFactor)) as Box;\n const boxRaw = (newResult.object[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i].boxRaw[j] + b) / bufferedFactor)) as Box;\n bufferedResult.object[i] = { ...newResult.object[i], box, boxRaw }; // shallow clone plus updated values\n }\n }\n\n // interpolate person results\n if (newResult.persons) {\n const newPersons = newResult.persons; // trigger getter function\n if (!bufferedResult.persons || (newPersons.length !== bufferedResult.persons.length)) {\n bufferedResult.persons = JSON.parse(JSON.stringify(newPersons)) as PersonResult[];\n } else {\n for (let i = 0; i < newPersons.length; i++) { // update person box, we don't update the rest as it's updated as reference anyhow\n bufferedResult.persons[i].box = (newPersons[i].box\n .map((box, j) => ((bufferedFactor - 1) * bufferedResult.persons[i].box[j] + box) / bufferedFactor)) as Box;\n }\n }\n }\n\n // copy latest gestures without interpolation\n if (newResult.gesture) bufferedResult.gesture = newResult.gesture;\n\n // copy resolution info\n bufferedResult.width = newResult.width;\n bufferedResult.height = newResult.height;\n\n // append interpolation performance data\n const t1 = now();\n interpolateTime = env.perfadd ? interpolateTime + Math.round(t1 - t0) : Math.round(t1 - t0);\n if (newResult.performance) bufferedResult.performance = { ...newResult.performance, interpolate: interpolateTime };\n\n return bufferedResult;\n}\n", "/**\n * Image segmentation for body detection model\n *\n * Based on:\n * - [**MediaPipe Meet**](https://drive.google.com/file/d/1lnP1bRi9CSqQQXUHa13159vLELYDgDu0/preview)\n */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport { log } from '../util/util';\nimport { loadModel } from '../tfjs/load';\nimport { constants } from '../tfjs/constants';\nimport type { GraphModel, Tensor, Tensor4D } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nlet model: GraphModel;\n\nexport async function load(config: Config): Promise {\n if (!model || env.initial) model = await loadModel(config.segmentation.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(input: Tensor4D, config: Config): Promise {\n if (!model) model = await load(config);\n if (!model?.['executor'] || !model?.inputs?.[0].shape) return null; // something is wrong with the model\n const t: Record = {};\n t.resize = tf.image.resizeBilinear(input, [model.inputs[0].shape ? model.inputs[0].shape[1] : 0, model.inputs[0].shape ? model.inputs[0].shape[2] : 0], false);\n t.norm = tf.div(t.resize, constants.tf255);\n t.res = model.execute(t.norm) as Tensor;\n t.squeeze = tf.squeeze(t.res, [0]);\n // t.softmax = tf.softmax(t.squeeze); // model meet has two channels for fg and bg\n [t.bgRaw, t.fgRaw] = tf.unstack(t.squeeze, 2);\n // t.bg = tf.softmax(t.bgRaw); // we can ignore bg channel\n t.fg = tf.softmax(t.fgRaw);\n t.mul = tf.mul(t.fg, constants.tf255);\n t.expand = tf.expandDims(t.mul, 2);\n t.output = tf.image.resizeBilinear(t.expand as Tensor4D, [input.shape[1] || 0, input.shape[2] || 0]);\n let rgba: Tensor;\n switch (config.segmentation.mode || 'default') {\n case 'default':\n t.input = tf.squeeze(input);\n t.concat = tf.concat([t.input, t.output], -1);\n rgba = tf.cast(t.concat, 'int32'); // combined original with alpha\n break;\n case 'alpha':\n rgba = tf.cast(t.output, 'int32'); // just get alpha value from model\n break;\n default:\n rgba = tf.tensor(0);\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return rgba;\n}\n", "/** Face descriptor type as number array */\nexport type Descriptor = number[]\nexport type MatchOptions = { order?: number, threshold?: number, multiplier?: number, min?: number, max?: number } | undefined;\n\n/** Calculates distance between two descriptors\n * @param options - calculation options\n * - order - algorithm to use\n * Euclidean distance if `order` is 2 (default), Minkowski distance algorithm of nth order if `order` is higher than 2\n * - multiplier - by how much to enhance difference analysis in range of 1..100\n * default is 20 which normalizes results to similarity above 0.5 can be considered a match\n */\nexport function distance(descriptor1: Descriptor, descriptor2: Descriptor, options: MatchOptions = { order: 2, multiplier: 25 }) {\n // general minkowski distance, euclidean distance is limited case where order is 2\n if (!descriptor1 || !descriptor1) return Number.MAX_SAFE_INTEGER;\n let sum = 0;\n for (let i = 0; i < descriptor1.length; i++) {\n const diff = (!options.order || options.order === 2) ? (descriptor1[i] - descriptor2[i]) : (Math.abs(descriptor1[i] - descriptor2[i]));\n sum += (!options.order || options.order === 2) ? (diff * diff) : (diff ** options.order);\n }\n return (options.multiplier || 20) * sum;\n}\n\n// invert distance to similarity, normalize to given range and clamp\nconst normalizeDistance = (dist, order, min, max) => {\n if (dist === 0) return 1; // short circuit for identical inputs\n const root = order === 2 ? Math.sqrt(dist) : dist ** (1 / order); // take root of distance\n const norm = (1 - (root / 100) - min) / (max - min); // normalize to range\n const clamp = Math.max(Math.min(norm, 1), 0); // clamp to 0..1\n return clamp;\n};\n\n/** Calculates normalized similarity between two face descriptors based on their `distance`\n * @param options - calculation options\n * - order - algorithm to use\n * Euclidean distance if `order` is 2 (default), Minkowski distance algorithm of nth order if `order` is higher than 2\n * - multiplier - by how much to enhance difference analysis in range of 1..100\n * default is 20 which normalizes results to similarity above 0.5 can be considered a match\n * - min - normalize similarity result to a given range\n * - max - normalzie similarity resutl to a given range\n * default is 0.2...0.8\n * Returns similarity between two face descriptors normalized to 0..1 range where 0 is no similarity and 1 is perfect similarity\n */\nexport function similarity(descriptor1: Descriptor, descriptor2: Descriptor, options: MatchOptions = { order: 2, multiplier: 25, min: 0.2, max: 0.8 }) {\n const dist = distance(descriptor1, descriptor2, options);\n return normalizeDistance(dist, options.order || 2, options.min || 0, options.max || 1);\n}\n\n/** Matches given descriptor to a closest entry in array of descriptors\n * @param descriptor - face descriptor\n * @param descriptors - array of face descriptors to commpare given descriptor to\n * @param options - see `similarity` method for options description\n * Returns\n * - `index` index array index where best match was found or -1 if no matches\n * - `distance` calculated `distance` of given descriptor to the best match\n * - `similarity` calculated normalized `similarity` of given descriptor to the best match\n*/\nexport function find(descriptor: Descriptor, descriptors: Descriptor[], options: MatchOptions = { order: 2, multiplier: 25, threshold: 0, min: 0.2, max: 0.8 }) {\n if (!Array.isArray(descriptor) || !Array.isArray(descriptors) || descriptor.length < 64 || descriptors.length === 0) { // validate input\n return { index: -1, distance: Number.POSITIVE_INFINITY, similarity: 0 };\n }\n let lowestDistance = Number.MAX_SAFE_INTEGER;\n let index = -1;\n for (let i = 0; i < descriptors.length; i++) {\n const res = descriptors[i].length === descriptor.length ? distance(descriptor, descriptors[i], options) : Number.MAX_SAFE_INTEGER;\n if (res < lowestDistance) {\n lowestDistance = res;\n index = i;\n }\n if (lowestDistance < (options.threshold || 0)) break;\n }\n const normalizedSimilarity = normalizeDistance(lowestDistance, options.order || 2, options.min || 0, options.max || 1);\n return { index, distance: lowestDistance, similarity: normalizedSimilarity };\n}\n", "/**\n * Loader and Validator for all models used by Human\n */\n\nimport { env } from './util/env';\nimport { log } from './util/util';\nimport * as antispoof from './face/antispoof';\nimport * as blazeface from './face/blazeface';\nimport * as blazepose from './body/blazepose';\nimport * as centernet from './object/centernet';\nimport * as efficientpose from './body/efficientpose';\nimport * as emotion from './gear/emotion';\nimport * as facemesh from './face/facemesh';\nimport * as faceres from './face/faceres';\nimport * as gear from './gear/gear';\nimport * as handpose from './hand/handpose';\nimport * as handtrack from './hand/handtrack';\nimport * as insightface from './face/insightface';\nimport * as iris from './face/iris';\nimport * as liveness from './face/liveness';\nimport * as meet from './segmentation/meet';\nimport * as mobilefacenet from './face/mobilefacenet';\nimport * as movenet from './body/movenet';\nimport * as nanodet from './object/nanodet';\nimport * as posenet from './body/posenet';\nimport * as rvm from './segmentation/rvm';\nimport * as selfie from './segmentation/selfie';\nimport * as ssrnetAge from './gear/ssrnet-age';\nimport * as ssrnetGender from './gear/ssrnet-gender';\nimport { modelStats, ModelInfo } from './tfjs/load';\nimport type { GraphModel } from './tfjs/types';\nimport type { Human } from './human';\n\nexport interface KernelOps { name: string, url: string, missing: string[], ops: string[] }\n\nexport function validateModel(instance: Human | null, model: GraphModel | null, name: string): KernelOps | null {\n if (!model) return null;\n if (!instance?.config?.validateModels) return null;\n const simpleOps = ['const', 'placeholder', 'noop', 'pad', 'squeeze', 'add', 'sub', 'mul', 'div'];\n const ignoreOps = ['biasadd', 'fusedbatchnormv3', 'matmul', 'switch', 'shape', 'merge', 'split', 'broadcastto'];\n const ops: string[] = [];\n const missing: string[] = [];\n interface Op { name: string, category: string, op: string }\n const url = model['modelUrl'] as string;\n const executor = model['executor'];\n if (executor?.graph?.nodes) {\n for (const kernel of Object.values(executor.graph.nodes)) {\n const op = (kernel as Op).op.toLowerCase();\n if (!ops.includes(op)) ops.push(op);\n }\n } else {\n if (!executor && instance.config.debug) {\n log('model not loaded', name);\n }\n }\n for (const op of ops) {\n if (!simpleOps.includes(op) // exclude simple ops\n && !ignoreOps.includes(op) // exclude specific ops\n && !instance.env.kernels.includes(op) // check actual kernel ops\n && !instance.env.kernels.includes(op.replace('_', '')) // check variation without _\n && !instance.env.kernels.includes(op.replace('native', '')) // check standard variation\n && !instance.env.kernels.includes(op.replace('v2', ''))) { // check non-versioned variation\n missing.push(op);\n }\n }\n if (instance.config.debug && missing.length > 0) log('model validation failed:', name, missing);\n return missing.length > 0 ? { name, missing, ops, url } : null;\n}\n\n/** structure that holds global stats for currently loaded models */\nexport interface ModelStats {\n numLoadedModels: number,\n numDefinedModels: number,\n percentageLoaded: number,\n totalSizeFromManifest: number,\n totalSizeWeights: number,\n totalSizeLoading: number,\n modelStats: ModelInfo[],\n}\n\n/** Models class used by Human\n * - models: record of all GraphModels\n * - list: returns list of configured models with their stats\n * - loaded: returns array of loaded models\n * - reset: unloads all models\n * - validate: checks loaded models for valid kernel ops vs current backend\n * - stats: live detailed model stats that can be checked during model load phase\n */\nexport class Models {\n instance: Human;\n models: Record;\n\n constructor(currentInstance: Human) {\n this.models = {};\n this.instance = currentInstance;\n }\n\n stats(): ModelStats {\n let totalSizeFromManifest = 0;\n let totalSizeWeights = 0;\n let totalSizeLoading = 0;\n for (const m of Object.values(modelStats)) {\n totalSizeFromManifest += m.sizeFromManifest;\n totalSizeWeights += m.sizeLoadedWeights;\n totalSizeLoading += m.sizeDesired;\n }\n const percentageLoaded = totalSizeLoading > 0 ? totalSizeWeights / totalSizeLoading : 0;\n return {\n numLoadedModels: Object.values(modelStats).length,\n numDefinedModels: Object.keys(this.models).length,\n percentageLoaded,\n totalSizeFromManifest,\n totalSizeWeights,\n totalSizeLoading,\n modelStats: Object.values(modelStats),\n };\n }\n\n reset(): void {\n for (const model of Object.keys(this.models)) this.models[model] = null;\n }\n\n async load(): Promise {\n if (env.initial) this.reset();\n const m: Record> = {};\n // face main models\n m.blazeface = (this.instance.config.face.enabled && !this.models.blazeface) ? blazeface.load(this.instance.config) : null;\n m.antispoof = (this.instance.config.face.enabled && this.instance.config.face.antispoof?.enabled && !this.models.antispoof) ? antispoof.load(this.instance.config) : null;\n m.liveness = (this.instance.config.face.enabled && this.instance.config.face.liveness?.enabled && !this.models.liveness) ? liveness.load(this.instance.config) : null;\n m.faceres = (this.instance.config.face.enabled && this.instance.config.face.description?.enabled && !this.models.faceres) ? faceres.load(this.instance.config) : null;\n m.emotion = (this.instance.config.face.enabled && this.instance.config.face.emotion?.enabled && !this.models.emotion) ? emotion.load(this.instance.config) : null;\n m.iris = (this.instance.config.face.enabled && this.instance.config.face.iris?.enabled && !this.instance.config.face.attention?.enabled && !this.models.iris) ? iris.load(this.instance.config) : null;\n m.facemesh = (this.instance.config.face.enabled && this.instance.config.face.mesh?.enabled && (!this.models.facemesh)) ? facemesh.load(this.instance.config) : null;\n // face alternatives\n m.gear = (this.instance.config.face.enabled && this.instance.config.face['gear']?.enabled && !this.models.gear) ? gear.load(this.instance.config) : null;\n m.ssrnetage = (this.instance.config.face.enabled && this.instance.config.face['ssrnet']?.enabled && !this.models.ssrnetage) ? ssrnetAge.load(this.instance.config) : null;\n m.ssrnetgender = (this.instance.config.face.enabled && this.instance.config.face['ssrnet']?.enabled && !this.models.ssrnetgender) ? ssrnetGender.load(this.instance.config) : null;\n m.mobilefacenet = (this.instance.config.face.enabled && this.instance.config.face['mobilefacenet']?.enabled && !this.models.mobilefacenet) ? mobilefacenet.load(this.instance.config) : null;\n m.insightface = (this.instance.config.face.enabled && this.instance.config.face['insightface']?.enabled && !this.models.insightface) ? insightface.load(this.instance.config) : null;\n // body alterinatives\n m.blazepose = (this.instance.config.body.enabled && !this.models.blazepose && this.instance.config.body.modelPath?.includes('blazepose')) ? blazepose.loadPose(this.instance.config) : null;\n m.blazeposedetect = (this.instance.config.body.enabled && !this.models.blazeposedetect && this.instance.config.body['detector'] && this.instance.config.body['detector'].modelPath) ? blazepose.loadDetect(this.instance.config) : null;\n m.efficientpose = (this.instance.config.body.enabled && !this.models.efficientpose && this.instance.config.body.modelPath?.includes('efficientpose')) ? efficientpose.load(this.instance.config) : null;\n m.movenet = (this.instance.config.body.enabled && !this.models.movenet && this.instance.config.body.modelPath?.includes('movenet')) ? movenet.load(this.instance.config) : null;\n m.posenet = (this.instance.config.body.enabled && !this.models.posenet && this.instance.config.body.modelPath?.includes('posenet')) ? posenet.load(this.instance.config) : null;\n // hand alternatives\n m.handtrack = (this.instance.config.hand.enabled && !this.models.handtrack && this.instance.config.hand.detector?.modelPath?.includes('handtrack')) ? handtrack.loadDetect(this.instance.config) : null;\n m.handskeleton = (this.instance.config.hand.enabled && this.instance.config.hand.landmarks && !this.models.handskeleton && this.instance.config.hand.detector?.modelPath?.includes('handtrack')) ? handtrack.loadSkeleton(this.instance.config) : null;\n if (this.instance.config.hand.detector?.modelPath?.includes('handdetect')) [m.handpose, m.handskeleton] = (!this.models.handpose) ? await handpose.load(this.instance.config) : [null, null];\n // object detection alternatives\n m.centernet = (this.instance.config.object.enabled && !this.models.centernet && this.instance.config.object.modelPath?.includes('centernet')) ? centernet.load(this.instance.config) : null;\n m.nanodet = (this.instance.config.object.enabled && !this.models.nanodet && this.instance.config.object.modelPath?.includes('nanodet')) ? nanodet.load(this.instance.config) : null;\n // segmentation alternatives\n m.selfie = (this.instance.config.segmentation.enabled && !this.models.selfie && this.instance.config.segmentation.modelPath?.includes('selfie')) ? selfie.load(this.instance.config) : null;\n m.meet = (this.instance.config.segmentation.enabled && !this.models.meet && this.instance.config.segmentation.modelPath?.includes('meet')) ? meet.load(this.instance.config) : null;\n m.rvm = (this.instance.config.segmentation.enabled && !this.models.rvm && this.instance.config.segmentation.modelPath?.includes('rvm')) ? rvm.load(this.instance.config) : null;\n\n // models are loaded in parallel asynchronously so lets wait until they are actually loaded\n await Promise.all([...Object.values(m)]);\n for (const model of Object.keys(m)) this.models[model] = m[model] as GraphModel || this.models[model] || null; // only update actually loaded models\n }\n\n list() {\n const models = Object.keys(this.models).map((model) => ({ name: model, loaded: (this.models[model] !== null), size: 0, url: this.models[model] ? this.models[model]?.['modelUrl'] : null }));\n for (const m of models) {\n const stats = Object.keys(modelStats).find((s) => s.startsWith(m.name));\n if (!stats) continue;\n m.size = modelStats[stats].sizeLoadedWeights;\n m.url = modelStats[stats].url;\n }\n return models;\n }\n\n loaded() {\n const list = this.list();\n const loaded = list.filter((model) => model.loaded).map((model) => model.name);\n return loaded;\n }\n\n validate(): { name: string, missing: string[] }[] {\n const missing: KernelOps[] = [];\n for (const defined of Object.keys(this.models)) {\n const model: GraphModel | null = this.models[defined as keyof Models];\n if (!model) continue;\n const res = validateModel(this.instance, model, defined);\n if (res) missing.push(res);\n }\n return missing;\n }\n}\n", "import * as tf from 'dist/tfjs.esm.js';\nimport type { BodyKeypoint, BodyResult } from '../result';\nimport * as box from '../util/box';\nimport * as coords from './movenetcoords';\nimport type { Tensor, Tensor3D } from '../tfjs/types';\n\nconst maxJitter = 0.005; // default allowed jitter is within 0.5%\n\nconst cache: {\n keypoints: BodyKeypoint[],\n padding: [number, number][];\n} = {\n keypoints: [],\n padding: [[0, 0], [0, 0], [0, 0], [0, 0]],\n};\n\nexport function bodyParts(body: BodyResult) { // model sometimes mixes up left vs right keypoints so we fix them\n for (const pair of coords.horizontal) { // fix body parts left vs right\n const left = body.keypoints.findIndex((kp) => kp.part === pair[0]);\n const right = body.keypoints.findIndex((kp) => kp.part === pair[1]);\n if (body.keypoints[left] && body.keypoints[right]) {\n if (body.keypoints[left].position[0] < body.keypoints[right].position[0]) {\n const tmp = body.keypoints[left];\n body.keypoints[left] = body.keypoints[right];\n body.keypoints[right] = tmp;\n }\n }\n }\n for (const pair of coords.vertical) { // remove body parts with improbable vertical position\n const lower = body.keypoints.findIndex((kp) => (kp && kp.part === pair[0]));\n const higher = body.keypoints.findIndex((kp) => (kp && kp.part === pair[1]));\n if (body.keypoints[lower] && body.keypoints[higher]) {\n if (body.keypoints[lower].position[1] < body.keypoints[higher].position[1]) {\n body.keypoints.splice(lower, 1);\n }\n }\n }\n for (const [pair, compare] of coords.relative) { // rearrange body parts according to their relative position\n const left = body.keypoints.findIndex((kp) => (kp && kp.part === pair[0]));\n const right = body.keypoints.findIndex((kp) => (kp && kp.part === pair[1]));\n const leftTo = body.keypoints.findIndex((kp) => (kp && kp.part === compare[0]));\n const rightTo = body.keypoints.findIndex((kp) => (kp && kp.part === compare[1]));\n if (!body.keypoints[leftTo] || !body.keypoints[rightTo]) continue; // only if we have both compare points\n const distanceLeft = body.keypoints[left] ? [\n Math.abs(body.keypoints[leftTo].position[0] - body.keypoints[left].position[0]),\n Math.abs(body.keypoints[rightTo].position[0] - body.keypoints[left].position[0]),\n ] : [0, 0];\n const distanceRight = body.keypoints[right] ? [\n Math.abs(body.keypoints[rightTo].position[0] - body.keypoints[right].position[0]),\n Math.abs(body.keypoints[leftTo].position[0] - body.keypoints[right].position[0]),\n ] : [0, 0];\n if (distanceLeft[0] > distanceLeft[1] || distanceRight[0] > distanceRight[1]) { // should flip keypoints\n const tmp = body.keypoints[left];\n body.keypoints[left] = body.keypoints[right];\n body.keypoints[right] = tmp;\n }\n }\n}\n\nexport function jitter(keypoints: BodyKeypoint[]): BodyKeypoint[] {\n for (let i = 0; i < keypoints.length; i++) {\n if (keypoints[i] && cache.keypoints[i]) {\n const diff = [Math.abs(keypoints[i].positionRaw[0] - cache.keypoints[i].positionRaw[0]), Math.abs(keypoints[i].positionRaw[1] - cache.keypoints[i].positionRaw[1])];\n if (diff[0] < maxJitter && diff[1] < maxJitter) {\n keypoints[i] = cache.keypoints[i]; // below jitter so replace keypoint\n } else {\n cache.keypoints[i] = keypoints[i]; // above jitter so update cache\n }\n } else {\n cache.keypoints[i] = keypoints[i]; // cache for keypoint doesnt exist so create it here\n }\n }\n return keypoints;\n}\n\nexport function padInput(input: Tensor, inputSize: number): Tensor {\n const t: Record = {};\n if (!input?.shape?.[1] || !input?.shape?.[2]) return input;\n cache.padding = [\n [0, 0], // dont touch batch\n [input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0, input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0], // height before&after\n [input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0, input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0], // width before&after\n [0, 0], // dont touch rbg\n ];\n t.pad = tf.pad(input, cache.padding);\n t.resize = tf.image.resizeBilinear(t.pad as Tensor3D, [inputSize, inputSize]);\n const final = tf.cast(t.resize, 'int32');\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return final;\n}\n\nexport function rescaleBody(body: BodyResult, outputSize: [number, number]): BodyResult {\n body.keypoints = body.keypoints.filter((kpt) => kpt?.position); // filter invalid keypoints\n for (const kpt of body.keypoints) {\n kpt.position = [\n kpt.position[0] * (outputSize[0] + cache.padding[2][0] + cache.padding[2][1]) / outputSize[0] - cache.padding[2][0],\n kpt.position[1] * (outputSize[1] + cache.padding[1][0] + cache.padding[1][1]) / outputSize[1] - cache.padding[1][0],\n ];\n kpt.positionRaw = [\n kpt.position[0] / outputSize[0], kpt.position[1] / outputSize[1],\n ];\n }\n const rescaledBoxes = box.calc(body.keypoints.map((pt) => pt.position), outputSize);\n body.box = rescaledBoxes.box;\n body.boxRaw = rescaledBoxes.boxRaw;\n return body;\n}\n", "/**\n * MoveNet model implementation\n *\n * Based on: [**MoveNet**](https://blog.tensorflow.org/2021/05/next-generation-pose-detection-with-movenet-and-tensorflowjs.html)\n */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport { log, now } from '../util/util';\nimport * as box from '../util/box';\nimport * as coords from './movenetcoords';\nimport * as fix from './movenetfix';\nimport { loadModel } from '../tfjs/load';\nimport type { BodyKeypoint, BodyResult, BodyLandmark, BodyAnnotation, Box, Point } from '../result';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { fakeOps } from '../tfjs/backend';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nlet inputSize = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n// const boxExpandFact = 1.5; // increase to 150%\n\nconst cache: {\n boxes: Box[], // unused\n bodies: BodyResult[];\n last: number,\n} = {\n boxes: [],\n bodies: [],\n last: 0,\n};\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) {\n fakeOps(['size'], config);\n model = await loadModel(config.body.modelPath);\n } else if (config.debug) log('cached model:', model['modelUrl']);\n inputSize = (model?.['executor'] && model?.inputs?.[0].shape) ? model.inputs[0].shape[2] : 0;\n if (inputSize < 64) inputSize = 256;\n return model;\n}\n\nfunction parseSinglePose(res, config, image) {\n const kpt = res[0][0];\n const keypoints: BodyKeypoint[] = [];\n let score = 0;\n for (let id = 0; id < kpt.length; id++) {\n score = kpt[id][2];\n if (score > config.body.minConfidence) {\n const positionRaw: Point = [kpt[id][1], kpt[id][0]];\n keypoints.push({\n score: Math.round(100 * score) / 100,\n part: coords.kpt[id] as BodyLandmark,\n positionRaw,\n position: [ // normalized to input image size\n Math.round((image.shape[2] || 0) * positionRaw[0]),\n Math.round((image.shape[1] || 0) * positionRaw[1]),\n ],\n });\n }\n }\n score = keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);\n const bodies: BodyResult[] = [];\n const newBox = box.calc(keypoints.map((pt) => pt.position), [image.shape[2], image.shape[1]]);\n const annotations: Record = {};\n for (const [name, indexes] of Object.entries(coords.connected)) {\n const pt: Point[][] = [];\n for (let i = 0; i < indexes.length - 1; i++) {\n const pt0 = keypoints.find((kp) => kp.part === indexes[i]);\n const pt1 = keypoints.find((kp) => kp.part === indexes[i + 1]);\n if (pt0 && pt1 && pt0.score > (config.body.minConfidence || 0) && pt1.score > (config.body.minConfidence || 0)) pt.push([pt0.position, pt1.position]);\n }\n annotations[name] = pt;\n }\n const body: BodyResult = { id: 0, score, box: newBox.box, boxRaw: newBox.boxRaw, keypoints, annotations };\n fix.bodyParts(body);\n bodies.push(body);\n return bodies;\n}\n\nfunction parseMultiPose(res, config, image) {\n const bodies: BodyResult[] = [];\n for (let id = 0; id < res[0].length; id++) {\n const kpt = res[0][id];\n const totalScore = Math.round(100 * kpt[51 + 4]) / 100;\n if (totalScore > config.body.minConfidence) {\n const keypoints: BodyKeypoint[] = [];\n for (let i = 0; i < 17; i++) {\n const score = kpt[3 * i + 2];\n if (score > config.body.minConfidence) {\n const positionRaw: Point = [kpt[3 * i + 1], kpt[3 * i + 0]];\n keypoints.push({\n part: coords.kpt[i] as BodyLandmark,\n score: Math.round(100 * score) / 100,\n positionRaw,\n position: [Math.round((image.shape[2] || 0) * positionRaw[0]), Math.round((image.shape[1] || 0) * positionRaw[1])],\n });\n }\n }\n const newBox = box.calc(keypoints.map((pt) => pt.position), [image.shape[2], image.shape[1]]);\n // movenet-multipose has built-in box details\n // const boxRaw: Box = [kpt[51 + 1], kpt[51 + 0], kpt[51 + 3] - kpt[51 + 1], kpt[51 + 2] - kpt[51 + 0]];\n // const box: Box = [Math.trunc(boxRaw[0] * (image.shape[2] || 0)), Math.trunc(boxRaw[1] * (image.shape[1] || 0)), Math.trunc(boxRaw[2] * (image.shape[2] || 0)), Math.trunc(boxRaw[3] * (image.shape[1] || 0))];\n const annotations: Record = {} as Record;\n for (const [name, indexes] of Object.entries(coords.connected)) {\n const pt: Point[][] = [];\n for (let i = 0; i < indexes.length - 1; i++) {\n const pt0 = keypoints.find((kp) => kp.part === indexes[i]);\n const pt1 = keypoints.find((kp) => kp.part === indexes[i + 1]);\n if (pt0 && pt1 && pt0.score > (config.body.minConfidence || 0) && pt1.score > (config.body.minConfidence || 0)) pt.push([pt0.position, pt1.position]);\n }\n annotations[name] = pt;\n }\n const body: BodyResult = { id, score: totalScore, box: newBox.box, boxRaw: newBox.boxRaw, keypoints: [...keypoints], annotations };\n fix.bodyParts(body);\n bodies.push(body);\n }\n }\n bodies.sort((a, b) => b.score - a.score);\n if (bodies.length > config.body.maxDetected) bodies.length = config.body.maxDetected;\n return bodies;\n}\n\nexport async function predict(input: Tensor, config: Config): Promise {\n if (!model?.['executor'] || !model?.inputs?.[0].shape) return []; // something is wrong with the model\n if (!config.skipAllowed) cache.boxes.length = 0; // allowed to use cache or not\n skipped++; // increment skip frames\n const skipTime = (config.body.skipTime || 0) > (now() - cache.last);\n const skipFrame = skipped < (config.body.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame) {\n return cache.bodies; // return cached results without running anything\n }\n return new Promise(async (resolve) => {\n const t: Record = {};\n skipped = 0;\n // run detection on squared input and cached boxes\n /*\n cache.bodies = []; // reset bodies result\n if (cache.boxes.length >= (config.body.maxDetected || 0)) { // if we have enough cached boxes run detection using cache\n for (let i = 0; i < cache.boxes.length; i++) { // run detection based on cached boxes\n t.crop = tf.image.cropAndResize(input, [cache.boxes[i]], [0], [inputSize, inputSize], 'bilinear');\n t.cast = tf.cast(t.crop, 'int32');\n // t.input = prepareImage(input);\n t.res = model?.execute(t.cast) as Tensor;\n const res = await t.res.array();\n const newBodies = (t.res.shape[2] === 17) ? await parseSinglePose(res, config, input, cache.boxes[i]) : await parseMultiPose(res, config, input, cache.boxes[i]);\n cache.bodies = cache.bodies.concat(newBodies);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n }\n }\n if (cache.bodies.length !== config.body.maxDetected) { // did not find enough bodies based on cached boxes so run detection on full frame\n t.input = prepareImage(input);\n t.res = model?.execute(t.input) as Tensor;\n const res = await t.res.array();\n cache.bodies = (t.res.shape[2] === 17) ? await parseSinglePose(res, config, input, [0, 0, 1, 1]) : await parseMultiPose(res, config, input, [0, 0, 1, 1]);\n for (const body of cache.bodies) rescaleBody(body, [input.shape[2] || 1, input.shape[1] || 1]);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n }\n cache.boxes.length = 0; // reset cache\n for (let i = 0; i < cache.bodies.length; i++) {\n if (cache.bodies[i].keypoints.length > (coords.kpt.length / 2)) { // only update cache if we detected at least half keypoints\n const scaledBox = box.scale(cache.bodies[i].boxRaw, boxExpandFact);\n const cropBox = box.crop(scaledBox);\n cache.boxes.push(cropBox);\n }\n }\n */\n\n // run detection on squared input and no cached boxes\n t.input = fix.padInput(input, inputSize);\n t.res = model?.execute(t.input) as Tensor;\n cache.last = now();\n const res = await t.res.array();\n cache.bodies = (t.res.shape[2] === 17)\n ? parseSinglePose(res, config, input)\n : parseMultiPose(res, config, input);\n for (const body of cache.bodies) {\n fix.rescaleBody(body, [input.shape[2] || 1, input.shape[1] || 1]);\n fix.jitter(body.keypoints);\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n\n resolve(cache.bodies);\n });\n}\n", "/**\n * NanoDet object detection model implementation\n *\n * Based on: [**NanoDet**](https://github.com/RangiLyu/nanodet)\n */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport { log, now } from '../util/util';\nimport { loadModel } from '../tfjs/load';\nimport { constants } from '../tfjs/constants';\nimport { labels } from './labels';\nimport type { ObjectResult, ObjectType, Box } from '../result';\nimport type { GraphModel, Tensor, Tensor2D, Tensor4D } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nlet model: GraphModel;\nlet last: ObjectResult[] = [];\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\nlet inputSize = 0;\n\nconst scaleBox = 2.5; // increase box size\n\nexport async function load(config: Config): Promise {\n if (!model || env.initial) {\n model = await loadModel(config.object.modelPath);\n const inputs = model?.['executor'] ? Object.values(model.modelSignature['inputs']) : undefined;\n inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 416;\n } else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nasync function process(res: Tensor[], outputShape: [number, number], config: Config) {\n let id = 0;\n let results: ObjectResult[] = [];\n const size = inputSize;\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 const baseSize = strideSize * 13; // 13x13=169, 26x26=676, 52x52=2704\n // find boxes and scores output depending on stride\n const scoresT = tf.squeeze(res.find((a) => (a.shape[1] === (baseSize ** 2) && (a.shape[2] || 0) === labels.length)) as Tensor2D);\n const scores = await scoresT.array(); // optionally use exponential scores or just as-is\n const featuresT = tf.squeeze(res.find((a) => (a.shape[1] === (baseSize ** 2) && (a.shape[2] || 0) < labels.length)) as Tensor2D);\n const boxesMaxT = tf.reshape(featuresT, [-1, 4, (featuresT.shape?.[1] || 0) / 4]); // reshape [output] to [4, output / 4] where number is number of different features inside each stride\n const boxIdxT = tf.argMax(boxesMaxT, 2); // what we need is indexes of features with highest scores, not values itself\n const boxIdx = await boxIdxT.array(); // what we need is indexes of features with highest scores, not values itself\n for (let i = 0; i < scoresT.shape[0]; i++) { // total strides (x * y matrix)\n for (let j = 0; j < (scoresT.shape?.[1] || 0); j++) { // one score for each class\n const score = scores[i][j]; // get score for current position\n if (score > (config.object.minConfidence || 0) && 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: number) => a * (baseSize / strideSize / (size))); // 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: Box = [x, y, w, h]; // results normalized to range 0..1\n boxRaw = boxRaw.map((a) => Math.max(0, Math.min(a, 1))) as Box; // 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 as ObjectType,\n // center: [Math.trunc(outputShape[0] * cx), Math.trunc(outputShape[1] * cy)],\n // centerRaw: [cx, cy],\n box: box.map((a) => Math.trunc(a)) as Box,\n boxRaw,\n };\n results.push(result);\n }\n }\n }\n tf.dispose([scoresT, featuresT, boxesMaxT, boxIdxT]);\n }\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: number[] = [];\n if (nmsBoxes && nmsBoxes.length > 0) {\n const nms = await tf.image.nonMaxSuppressionAsync(nmsBoxes, nmsScores, config.object.maxDetected || 0, config.object.iouThreshold, config.object.minConfidence);\n nmsIdx = Array.from(await nms.data());\n tf.dispose(nms);\n }\n\n // filter & sort results\n results = results\n .filter((_val, idx) => nmsIdx.includes(idx))\n .sort((a, b) => (b.score - a.score));\n\n return results;\n}\n\nexport async function predict(image: Tensor4D, config: Config): Promise {\n if (!model?.['executor']) return [];\n const skipTime = (config.object.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.object.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && (last.length > 0)) {\n skipped++;\n return last;\n }\n skipped = 0;\n if (!env.kernels.includes('mod') || !env.kernels.includes('sparsetodense')) return last;\n return new Promise(async (resolve) => {\n const outputSize = [image.shape[2] || 0, image.shape[1] || 0];\n const resizeT = tf.image.resizeBilinear(image, [inputSize, inputSize], false);\n const normT = tf.div(resizeT, constants.tf255);\n const transposeT = tf.transpose(normT, [0, 3, 1, 2]);\n\n let objectT;\n if (config.object.enabled) objectT = model.execute(transposeT);\n lastTime = now();\n\n const obj = await process(objectT as Tensor[], outputSize as [number, number], config);\n last = obj;\n tf.dispose([resizeT, normT, transposeT, ...objectT]);\n resolve(obj);\n });\n}\n", "/**\n * PoseNet body detection model implementation constants\n * See `posenet.ts` for entry point\n */\n\nimport type { Point, BodyResult, BodyAnnotation, BodyLandmark } from '../result';\n\nexport 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\nexport function eitherPointDoesntMeetConfidence(a: number, b: number, minConfidence: number) {\n return (a < minConfidence || b < minConfidence);\n}\n\nexport function getAdjacentKeyPoints(keypoints, minConfidence: number) {\n return connectedPartIndices.reduce((result, [leftJoint, rightJoint]) => {\n if (eitherPointDoesntMeetConfidence(keypoints[leftJoint].score, keypoints[rightJoint].score, minConfidence)) {\n return result;\n }\n result.push([keypoints[leftJoint], keypoints[rightJoint]]);\n return result;\n }, []);\n}\n\nexport function getBoundingBox(keypoints): [number, number, number, number] {\n const coord = keypoints.reduce(({ maxX, maxY, minX, minY }, { position: { x, y } }) => ({\n maxX: Math.max(maxX, x),\n maxY: Math.max(maxY, y),\n minX: Math.min(minX, x),\n minY: Math.min(minY, y),\n }), {\n maxX: Number.NEGATIVE_INFINITY,\n maxY: Number.NEGATIVE_INFINITY,\n minX: Number.POSITIVE_INFINITY,\n minY: Number.POSITIVE_INFINITY,\n });\n return [coord.minX, coord.minY, coord.maxX - coord.minX, coord.maxY - coord.minY];\n}\n\nexport function scalePoses(poses, [height, width], [inputResolutionHeight, inputResolutionWidth]): BodyResult[] {\n const scaleY = height / inputResolutionHeight;\n const scaleX = width / inputResolutionWidth;\n const scalePose = (pose, i): BodyResult => ({\n id: i,\n score: pose.score,\n boxRaw: [pose.box[0] / inputResolutionWidth, pose.box[1] / inputResolutionHeight, pose.box[2] / inputResolutionWidth, pose.box[3] / inputResolutionHeight],\n box: [Math.trunc(pose.box[0] * scaleX), Math.trunc(pose.box[1] * scaleY), Math.trunc(pose.box[2] * scaleX), Math.trunc(pose.box[3] * scaleY)],\n keypoints: pose.keypoints.map(({ score, part, position }) => ({\n score: score as number,\n part: part as BodyLandmark,\n position: [Math.trunc(position.x * scaleX), Math.trunc(position.y * scaleY)] as Point,\n positionRaw: [position.x / inputResolutionHeight, position.y / inputResolutionHeight] as Point,\n })),\n annotations: {} as Record,\n });\n const scaledPoses = poses.map((pose, i) => scalePose(pose, i));\n return scaledPoses;\n}\n\n// algorithm based on Coursera Lecture from Algorithms, Part 1: https://www.coursera.org/learn/algorithms-part1/lecture/ZjoSM/heapsort\nexport class MaxHeap {\n priorityQueue: unknown[]; // don't touch\n numberOfElements: number;\n getElementValue: unknown; // function call\n\n constructor(maxSize, getElementValue) {\n this.priorityQueue = new Array(maxSize);\n this.numberOfElements = -1;\n this.getElementValue = getElementValue;\n }\n\n enqueue(x) {\n this.priorityQueue[++this.numberOfElements] = x;\n this.swim(this.numberOfElements);\n }\n\n dequeue() {\n const max = this.priorityQueue[0];\n this.exchange(0, this.numberOfElements--);\n this.sink(0);\n this.priorityQueue[this.numberOfElements + 1] = null;\n return max;\n }\n\n empty() { return this.numberOfElements === -1; }\n\n size() { return this.numberOfElements + 1; }\n\n all() { return this.priorityQueue.slice(0, this.numberOfElements + 1); }\n\n max() { return this.priorityQueue[0]; }\n\n swim(k) {\n while (k > 0 && this.less(Math.floor(k / 2), k)) {\n this.exchange(k, Math.floor(k / 2));\n k = Math.floor(k / 2);\n }\n }\n\n sink(k) {\n while (2 * k <= this.numberOfElements) {\n let j = 2 * k;\n if (j < this.numberOfElements && this.less(j, j + 1)) j++;\n if (!this.less(k, j)) break;\n this.exchange(k, j);\n k = j;\n }\n }\n\n getValueAt(i) {\n // @ts-ignore getter is of unknown type\n return this.getElementValue(this.priorityQueue[i]);\n }\n\n less(i, j) {\n return this.getValueAt(i) < this.getValueAt(j);\n }\n\n exchange(i, j) {\n const t = this.priorityQueue[i];\n this.priorityQueue[i] = this.priorityQueue[j];\n this.priorityQueue[j] = t;\n }\n}\n\nexport function getOffsetPoint(y, x, keypoint: number, offsets) {\n return {\n y: offsets.get(y, x, keypoint),\n x: offsets.get(y, x, keypoint + count),\n };\n}\n\nexport function getImageCoords(part, outputStride: number, 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: { x: number, y: number }, b: { x: number, y: number }) {\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", "/**\n * PoseNet body detection model implementation\n *\n * Based on: [**PoseNet**](https://medium.com/tensorflow/real-time-human-pose-estimation-in-the-browser-with-tensorflow-js-7dd0bc881cd5)\n */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport { log } from '../util/util';\nimport { loadModel } from '../tfjs/load';\nimport type { BodyResult, BodyLandmark, Box } from '../result';\nimport type { Tensor, GraphModel, Tensor4D } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\nimport * as utils from './posenetutils';\n\nlet model: GraphModel;\nconst poseNetOutputs = ['MobilenetV1/offset_2/BiasAdd'/* offsets */, 'MobilenetV1/heatmap_2/BiasAdd'/* heatmapScores */, 'MobilenetV1/displacement_fwd_2/BiasAdd'/* displacementFwd */, 'MobilenetV1/displacement_bwd_2/BiasAdd'/* displacementBwd */];\nconst localMaximumRadius = 1;\nconst outputStride = 16;\nconst squaredNmsRadius = 50 ** 2;\n\nfunction traverse(edgeId: number, 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: utils.partNames[targetId], score };\n}\n\nexport function decodePose(root, scores, offsets, displacementsFwd, displacementsBwd) {\n const tuples = utils.poseChain.map(([parentJoinName, childJoinName]) => ([utils.partIds[parentJoinName], utils.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: utils.partNames[root.part.id] as BodyLandmark,\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: number, heatmapY: number, heatmapX: number, scores) {\n const [height, width]: [number, number] = 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: { keypoints, box: Box, score: number }[] = [];\n const queue = buildPartWithScoreQueue(minConfidence, scores);\n // Generate at most maxDetected object instances per image in decreasing root part score order.\n while (poses.length < maxDetected && !queue.empty()) {\n // The top element in the queue is the next root candidate.\n const root = queue.dequeue();\n // Part-based non-maximum suppression: We reject a root candidate if it is within a disk of `nmsRadius` pixels from the corresponding part of a previously detected instance.\n // @ts-ignore this one is tree walk\n const rootImageCoords = utils.getImageCoords(root.part, outputStride, offsets);\n // @ts-ignore this one is tree walk\n if (withinRadius(poses, rootImageCoords, root.part.id)) continue;\n // Else start a new detection instance at the position of the root.\n let keypoints = decodePose(root, scores, offsets, displacementsFwd, displacementsBwd);\n keypoints = keypoints.filter((a) => a.score > minConfidence);\n const score = getInstanceScore(poses, keypoints);\n const box = utils.getBoundingBox(keypoints);\n if (score > minConfidence) poses.push({ keypoints, box, score: Math.round(100 * score) / 100 });\n }\n return poses;\n}\n\nexport async function predict(input: Tensor4D, config: Config): Promise {\n /** posenet is mostly obsolete\n * caching is not implemented\n */\n if (!model?.['executor']) return [];\n const res = tf.tidy(() => {\n if (!model.inputs[0].shape) return [];\n const resized = tf.image.resizeBilinear(input, [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n const normalized = tf.sub(tf.div(tf.cast(resized, 'float32'), 127.5), 1.0);\n const results: Tensor[] = model.execute(normalized, poseNetOutputs) as Tensor[];\n const results3d = results.map((y) => tf.squeeze(y, [0]));\n results3d[1] = tf.sigmoid(results3d[1]); // apply sigmoid on scores\n return results3d;\n });\n\n const buffers = await Promise.all(res.map((tensor: Tensor) => tensor.buffer()));\n for (const t of res) tf.dispose(t);\n\n const decoded = decode(buffers[0], buffers[1], buffers[2], buffers[3], config.body.maxDetected, config.body.minConfidence);\n if (!model.inputs[0].shape) return [];\n const scaled = utils.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: Config): Promise {\n if (!model || env.initial) model = await loadModel(config.body.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n", "/**\n * Image segmentation for body detection model\n *\n * Based on:\n * - [**Robust Video Matting**](https://github.com/PeterL1n/RobustVideoMatting)\n */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport { log } from '../util/util';\nimport { loadModel } from '../tfjs/load';\nimport { constants } from '../tfjs/constants';\nimport type { GraphModel, Tensor, Tensor4D } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nlet model: GraphModel;\n\n// internal state varaibles\nconst outputNodes = ['fgr', 'pha', 'r1o', 'r2o', 'r3o', 'r4o'];\nconst t: Record = {}; // contains input tensor and recurrent states\nlet ratio = 0;\n\nfunction init(config: Config) {\n tf.dispose([t.r1i, t.r2i, t.r3i, t.r4i, t.downsample_ratio]);\n t.r1i = tf.tensor(0.0);\n t.r2i = tf.tensor(0.0);\n t.r3i = tf.tensor(0.0);\n t.r4i = tf.tensor(0.0);\n ratio = config.segmentation.ratio || 0.5;\n t.downsample_ratio = tf.tensor(ratio); // initialize downsample ratio\n}\n\nexport async function load(config: Config): Promise {\n if (!model || env.initial) model = await loadModel(config.segmentation.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n init(config);\n return model;\n}\n\nconst normalize = (r: Tensor): Tensor => tf.tidy(() => {\n const squeeze = tf.squeeze(r, ([0]));\n const mul = tf.mul(squeeze, constants.tf255);\n const cast = tf.cast(mul, 'int32');\n return cast;\n});\n\nfunction getRGBA(fgr: Tensor | null, pha: Tensor | null): Tensor { // gets rgba // either fgr or pha must be present\n const rgb = fgr\n ? normalize(fgr) // normalize and use value\n : tf.fill([pha!.shape[1] || 0, pha!.shape[2] || 0, 3], 255, 'int32'); // eslint-disable-line @typescript-eslint/no-non-null-assertion\n const a = pha\n ? normalize(pha) // normalize and use value\n : tf.fill([fgr!.shape[1] || 0, fgr!.shape[2] || 0, 1], 255, 'int32'); // eslint-disable-line @typescript-eslint/no-non-null-assertion\n const rgba = tf.concat([rgb, a], -1);\n tf.dispose([rgb, a]);\n return rgba;\n}\n\nfunction getState(state: Tensor): Tensor { // gets internal recurrent states\n return tf.tidy(() => {\n const r: Record = {};\n r.unstack = tf.unstack(state, -1);\n r.concat = tf.concat(r.unstack, 1);\n r.split = tf.split(r.concat, 4, 1);\n r.stack = tf.concat(r.split, 2);\n r.squeeze = tf.squeeze(r.stack, [0]);\n r.expand = tf.expandDims(r.squeeze, -1);\n r.add = tf.add(r.expand, 1);\n r.mul = tf.mul(r.add, 127.5);\n r.cast = tf.cast(r.mul, 'int32');\n r.tile = tf.tile(r.cast, [1, 1, 3]);\n r.alpha = tf.fill([(r.tile as Tensor).shape[0] || 0, (r.tile as Tensor).shape[1] || 0, 1], 255, 'int32'); // eslint-disable-line @typescript-eslint/no-unnecessary-type-assertion\n return tf.concat([r.tile, r.alpha], -1);\n });\n}\n\nexport async function predict(input: Tensor4D, config: Config): Promise {\n if (!model) model = await load(config);\n if (!model?.['executor']) return null;\n // const expand = tf.expandDims(input, 0);\n t.src = tf.div(input, 255);\n if (ratio !== config.segmentation.ratio) init(config); // reinitialize recurrent states if requested downsample ratio changed\n const [fgr, pha, r1o, r2o, r3o, r4o] = await model.executeAsync(t, outputNodes) as Tensor[]; // execute model\n let rgba: Tensor;\n switch (config.segmentation.mode || 'default') {\n case 'default':\n rgba = getRGBA(fgr, pha);\n break;\n case 'alpha':\n rgba = getRGBA(null, pha);\n break;\n case 'foreground':\n rgba = getRGBA(fgr, null);\n break;\n case 'state':\n rgba = getState(r1o); // can view any internal recurrent state r10, r20, r3o, r4o\n break;\n default:\n rgba = tf.tensor(0);\n }\n tf.dispose([t.src, fgr, pha, t.r1i, t.r2i, t.r3i, t.r4i]);\n [t.r1i, t.r2i, t.r3i, t.r4i] = [r1o, r2o, r3o, r4o]; // update recurrent states\n return rgba;\n}\n", "/**\n * Image segmentation for body detection model\n *\n * Based on:\n * - [**MediaPipe Selfie**](https://drive.google.com/file/d/1dCfozqknMa068vVsO2j_1FgZkW_e3VWv/preview)\n */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport { log } from '../util/util';\nimport { loadModel } from '../tfjs/load';\nimport { constants } from '../tfjs/constants';\nimport type { GraphModel, Tensor, Tensor4D } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nlet model: GraphModel;\n\nexport async function load(config: Config): Promise {\n if (!model || env.initial) model = await loadModel(config.segmentation.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(input: Tensor4D, config: Config): Promise {\n if (!model) model = await load(config);\n if (!model?.['executor'] || !model?.inputs?.[0].shape) return null; // something is wrong with the model\n const t: Record = {};\n t.resize = tf.image.resizeBilinear(input, [model.inputs[0].shape ? model.inputs[0].shape[1] : 0, model.inputs[0].shape ? model.inputs[0].shape[2] : 0], false);\n t.norm = tf.div(t.resize, constants.tf255);\n t.res = model.execute(t.norm) as Tensor;\n t.squeeze = tf.squeeze(t.res, [0]); // meet.shape:[1,256,256,1], selfie.shape:[1,144,256,2]\n t.alpha = tf.image.resizeBilinear(t.squeeze as Tensor4D, [input.shape[1] || 0, input.shape[2] || 0]); // model selfie has a single channel that we can use directly\n t.mul = tf.mul(t.alpha, constants.tf255);\n let rgba: Tensor;\n switch (config.segmentation.mode || 'default') {\n case 'default':\n t.input = tf.squeeze(input);\n t.concat = tf.concat([t.input, t.mul], -1);\n rgba = tf.cast(t.concat, 'int32'); // combined original with alpha\n break;\n case 'alpha':\n rgba = tf.cast(t.mul, 'int32'); // just get alpha value from model\n break;\n default:\n rgba = tf.tensor(0);\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return rgba;\n}\n", "/**\n * Analyze detection Results and sort&combine them into per-person view\n */\n\nimport type { FaceResult, BodyResult, HandResult, GestureResult, PersonResult, Box } from '../result';\n\nexport function join(faces: FaceResult[], bodies: BodyResult[], hands: HandResult[], gestures: GestureResult[], shape: number[] | undefined): PersonResult[] {\n let id = 0;\n const persons: PersonResult[] = [];\n for (const face of faces) { // person is defined primarily by face and then we append other objects as found\n const person: PersonResult = { id: id++, face, body: null, hands: { left: null, right: null }, gestures: [], box: [0, 0, 0, 0] };\n for (const body of bodies) {\n if (face.box[0] > body.box[0] // x within body\n && face.box[0] < body.box[0] + body.box[2]\n && face.box[1] + face.box[3] > body.box[1] // y within body\n && face.box[1] + face.box[3] < body.box[1] + body.box[3]) {\n person.body = body;\n }\n }\n if (person.body) { // only try to join hands if body is found\n for (const hand of hands) {\n if (hand.box[0] + hand.box[2] > person.body.box[0] // x within body for left hand\n && hand.box[0] + hand.box[2] < person.body.box[0] + person.body.box[2]\n && hand.box[1] + hand.box[3] > person.body.box[1] // x within body for left hand\n && hand.box[1] + hand.box[3] < person.body.box[1] + person.body.box[3]) {\n if (person.hands) person.hands.left = hand;\n }\n if (hand.box[0] < person.body.box[0] + person.body.box[2] // x within body for right hand\n && hand.box[0] > person.body.box[0]\n && hand.box[1] + hand.box[3] > person.body.box[1] // x within body for right hand\n && hand.box[1] + hand.box[3] < person.body.box[1] + person.body.box[3]) {\n if (person.hands) person.hands.right = hand;\n }\n }\n }\n for (const gesture of gestures) { // append all gestures according to ids\n if (gesture['face'] !== undefined && gesture['face'] === face.id) person.gestures.push(gesture);\n else if (gesture['iris'] !== undefined && gesture['iris'] === face.id) person.gestures.push(gesture);\n else if (gesture['body'] !== undefined && gesture['body'] === person.body?.id) person.gestures.push(gesture);\n else if (gesture['hand'] !== undefined && gesture['hand'] === person.hands.left?.id) person.gestures.push(gesture);\n else if (gesture['hand'] !== undefined && gesture['hand'] === person.hands.right?.id) person.gestures.push(gesture);\n }\n\n // create new overarching box from all boxes belonging to person\n const x: number[] = [];\n const y: number[] = [];\n const extractXY = (box: Box | undefined) => { // extract all [x, y] coordinates from boxes [x, y, width, height]\n if (box && box.length === 4) {\n x.push(box[0], box[0] + box[2]);\n y.push(box[1], box[1] + box[3]);\n }\n };\n extractXY(person.face.box);\n extractXY(person.body?.box);\n extractXY(person.hands.left?.box);\n extractXY(person.hands.right?.box);\n const minX = Math.min(...x);\n const minY = Math.min(...y);\n person.box = [minX, minY, Math.max(...x) - minX, Math.max(...y) - minY]; // create new overarching box\n\n // shape is known so we calculate boxRaw as well\n if (shape?.[1] && shape?.[2]) person.boxRaw = [person.box[0] / shape[2], person.box[1] / shape[1], person.box[2] / shape[2], person.box[3] / shape[1]];\n\n persons.push(person);\n }\n return persons;\n}\n", "/**\n * Embedded sample images used during warmup in dataURL format\n */\n\n// data:image/jpeg;base64,\nexport const face = `\n/9j/4AAQSkZJRgABAQEAYABgAAD/4QBoRXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUA\nAAABAAAARgEoAAMAAAABAAIAAAExAAIAAAARAAAATgAAAAAAAABgAAAAAQAAAGAAAAABcGFpbnQu\nbmV0IDQuMi4xMwAA/9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxob\nIxwWFiAsICMmJykqKRkfLTAtKDAlKCko/9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgo\nKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo/8AAEQgBAAEAAwEhAAIRAQMRAf/E\nAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAE\nEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZH\nSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1\ntre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEB\nAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXET\nIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFla\nY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG\nx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A+qaKACigApGOKAML\nXp8xlF5A7V4X8RtYs7PzfNImnx8sa8Kp9z3q2tEgp6angWs62ZZ5CTGoJ6DArGNz5p+UrID6EUrF\nPUlW1EuN0XNW7PQ2L5j3JnoKXN0KijqNP0eYoqXBdgPuuo+ZPeupisWn2Jd4+0r924XgsQOCff3/\nAJ1FzRKxDqGii6m3siiQ8F1XGfXI6YNWLfRbiRQMkcZI9fpTDluT2/h6Qy8gDPbtmtG38JeY480Z\n5zSLUTZg8M28YwYxjAArXtdPt402qgHbpSaLWhma3o0Uqk7Nx9DWLaaVblgPs6qRyds2M/gRSQp9\nzZOni2iWS2hlQ+kjYz9OMGrdjq89vIPPVhj+8M/lQyDq9P1WOYBlMZz1AOD+VdDaTiReOKulK0jO\ntHmi0WDTlr0TyxRVhT8tJjIX+9SUxHXUV553BRQAVBcPhSBTSuxPY86+IGti0s5I7dsORy9fM3i6\n8e8mfDO5P90ZrWWiJicNPpZZtxV/xrW0jQt4DOv6Vk2dEEdTY6BHuB25rpbPSo0QARjP0qTRI17W\nwA/hFaMWmoQMgflQXYsDS142rU9tpqqenfNA7GgtihxkdKuRW6qMY/GkDZY8sY4Ap4hXbyB+VArk\nEtuH4wPyrk/EGkOm+a3jw3suRQLc5i38SX9hJ9nnY+XnBUdPyNdFY6pa3KkkAE9l6f8AfJ/pSJT6\nGhDmI+Zb4ZRycdv6ium0nUhKFydrelTsNnS2829RnrVgV6NKXNG55lWPLIM81Op+WrZkRMfmNNzT\nA7GivPO4KKAEY4XNYWt3vkwPg4OK0giJdjw/xrqhm87Zs8tc7pX5A+leSajf6aHYJ50kn4AZpTep\nrBWRm2Vobm4BXfyehPFdnpmnBFUY5rI2SN63tlToK0YI+KZpFF+3QdavwoKTLtoW0Toaswpk5pCb\nLCxipAhoIuP2dKevHXoaYDylRyxhlwRQI4nxVoCXWZI1GfpXGtbSWjYPGP73+NIGupt6TqMsLruZ\nih4xnP5V09mQ+JLd8gn0xSYJnVaVdkook69K34zuUGunDS3Rx4qOzHVIp4rrOMY3NJQI7GivPO8K\nKAILt9kZrz3xlebYiu8KCCWb0XvW0NFch6ysfO3jLVjfXLIn+pQkKorl7WxNxIPl71g2dUUdpo+l\npBGvHPet23iC8ihFosrxirkHQUFo0IF4FXI1O726CpKLacCrMJoJLYHAPpTwucHpSRJJ5e4AZI9x\nUqpxzVpCuOC8cUpQUMRnXttuB4rjNdsYyeVwfXpmpGmcvcQyafMCFJjPY10eg34BUg4DcZP8jUO4\nHaRq3lLNF+IHet7R7jz7c56rwa2wz9+xhiVeFy/T1PFegeaNPWigDsc0ZrzzvDNIaAM7VpNqdegr\nxL4l6kywyRhseZ19lrdfAZL4jxYg3Fw20d63tJsdrDI5rm3Z3R0R0Mce1eKnQYAplIkWrMJ45oZS\nNO3PHbNXIyfpSGWowSOasxLUiZdjFSqtNEMkUemKlAGKsRJjAppFAiORMjmsTVrNZEO4cfSoZSOD\n1eJ7WXBUzQZ+7nkfSo7e2Ei+ZaMzxntjBX2NSU1Y6/wxqojiEFzkA8KTXYaUoWRyv3W5rSjpNHPX\n+BmpSg8V6J5gUUAdhRXnneFFAGHrTfu5PpXzj8S70/aZtxzztXFbv4DKHxHI+H4GZiz9zxXXW8G3\nGBXMjvLRXAx0oPGPSmMVeOnWrMTYpFI0bcg1fh54xmgovRcD3qxETSIZcRvzp+/BpEkqsBUqsM9K\nq4Em4Gkxk0yRGXrVW6i8yFhkg+tJjRxGsWrxllkUMh9eK5uMz6bcebbnfG33kPcVkay2OntPKuo0\nnhXI67c8qa7Lw3c+adjcEDGK1paSRhVV4s6A0or0jyRRQ1AHX0V553hRQBz+vNtt5z3xXzX8Qbdm\nuic5YnOMdK3l8JnTXvlbwpYl+WySOgrp5YfLOOB9O1c62O7qQkc+9RsKChFPWp4DluOlSykaNruH\nArUgHShFNF2NT1qxGO3NBmyxGcE1N2560CFzjrUysO9JAPDDjFOVuKoQuSRTWouBkazbCa3cd8cV\nwF7IISQccHBzUSWpV9C3o1x5b5GAjdQD1rs9DjC3kckbEhqKfxIzn8LOupRXqnkPccBSkUAzraK8\n87wooA5rxMSI3HqK8B8bQl9Q8sffY5b/AAraXwkUviNrw9pH2W1ViMMRTdRjw4HpWNtDti9TPc4P\nFQs2M5qdyyMHLcfjV63HTAoBGtap0wK0YxigpsuRDtVhVYd6GQydVwwIqdRnqKCR23I5pCMUW6gD\nYNKuetAEise9KTxQBWuFyhrznxNZkXjFeN3I+tTIZg2OqmzmxNF0PO3vXp/g2+hukVl4zyPanTXv\nJmVR+60dpThXpnlPceopWFAbnV0V553hSGgRynjC5FujOey14Ssp1HxNmTnc+a3kvcIpv37HoEYQ\nQmMdVHSsnVbYJF5jVk0dsNzlruVIsl2wKxbjWrVHILjg1CRbZJb+ILHPzyhfStODWLQgFJFYd+el\nUJM27HUIXxhga1Y5lLVLKLkMnoauxnPPrSEx7ShF+Y/n2qrc6xBbhizDAqkK1zJuvG9nbg8ZA681\nly/Ei052RO3uKAsZlx8QGd8xxvt9Aa1NH8dK7AXMcip64zigdkdrZX8F7EJLdwwNXMkrz1qRMRly\nCK4TxmpidWI49felPYSOMmi80NIoOV6qRzXYeA5SskYPfirpfEjGr8LPWVHyD6U4CvQPL3ZItOYc\nUDOoNFeed4Uhpks4H4iE/Z5MeleMeGULeLgjds10S+BGdL+Jc9OSBU2Huc5Nc74yvUtrcDBrJnZF\n63PJdXvLy/lKWw46bvQVz82jXhkLO5Y+9ZlsYthcRnbIjY9R3q3awTRkEM3WmJI6C0ea3dGRsr1x\nXY6TqW9FLHnjrUs0izpLK5DDjofSta3ckH09KRUkZuuTvFGdvPauE1Y3U6Mqbssf/rUxHPTaJPK2\nZmJPbBqzY6DCZh5xJC9s9aBJHU6dpemJjfEmfetJtI0+VPkUr/unFOxdiextHs33W07YHQHk11mk\nXb3KbZ1xIvcd6LEyWho4Nct41sTPYb16ipexCPPZN+wYGCvH1rrPAEJmvkPoc1VL4kZVvgZ6yFwK\ncBXoHkkqinFaVyzo80GuE7WJRQSziPiGdthK5HQV4x4J/wBI8WPIewNdEvgRNL42emO/yj1UHNef\neNpRczbC+I17DvWT2OqJxc0sMK4TCisy41q0hfEkqj8aixdwTXNOlwvmqD9anS9tXH7uVG+hosO4\n/wC0oOhrR0+6G4YNIEzsNEuCxAPNdjZruA4xxUmjINSjURksOlcbqFykbnjFA1sYGoassaknCqO5\nrl7rxhGm7yBnBxuJq0rkSlYpw+NLlsfd5P8AerVsvHEqSBHwPVgcgVpyMyVXU3rXxcHYETAk+hru\n/DWti6ZSTyOKzZqndHaxvvUGq2rQ+dYyqR24qWI8dvbr7LqDxyDAzXpvw6FvIxePGSM06Xxoyr/A\nzviKFHNegeX1J41zUhXioGbuaSuM6wpCaBHG/EcA6HN/exxXjXw2jL67cv8A3Qa6H8CFR+NnoWpO\nI4XI44rxLxrqjQzSEsQM1gdSPM9U1uR1YbmWIdXHf2rmpIb67YS28UrRlsLI3c/jW0VZGUpO5pW1\njfLNOjahawzwReYI5cjzMkDavHJ5/SrVv9uhtPtVxCPLBwzxnlT9KGghLU3tKvvPjHzbl7EGuisJ\nGRxWLOg7nRXJEbDjmvSNK+aFSfSoZr0KutRkphc4NcRrdkVjL9aVio7Hk3iqS8ubhrWzUlsZY9kG\ncZNc5D4aee5MclzJIFTzHAO0MfatqSOWu7bFS1srDUZEis0vIZoUxPvfcC+4/dx2xjr712XiTwXb\nWmlQ6hol3cRhoFd4rlg3zY5wR0GelavQwjq7GD4etdVvSnk2wAB+9v8A8mvcfA2kXiRo0/UdcDis\nZnTTulqeoWqbUAJqWUb42X1FZlnjfjSwlGrr5S/eNdD4RkvLAAQ4yRyaUZcruVKl7TQ9I0G+mnzH\nckFwM8VuIK7ac3KF2eXiKapz5UWYxipNtMyNejNch0jSar3cjR27uoyQCRVRWom9DxTx54gu5fMi\nlbKdMVjfCZPNlv5v9rFbVHpYqjGzbOn8SzFI9o715L4u0r7arYzk+lYdTqSujy7U/C0u4vHk+WwO\nxuh9q3J9dgvbdVukMV1EwbDDgn04rZMwlHoZ+orZ6hfQ3RWVnQYCgZAq+8U0ln5NtBsV2yxYcfgK\nJtW0CnB31LlroVwJ1nQLGDjeP7w+lb0dsFxjrWB0tHS6NuWPJ6A16ToUm63T3Gallr4S7cxiTjrX\nPaxaF7dlVeSMUhxZ5jd+H7qCa4eF3DSE5x3zXN3Wk6jbyeaiFWUY6ZyPStYS5SalPmVipFbX0E4c\nW0alvmPHJrag0rVvEE6LdljGpG2NRtQD+tW5XMI0uU9M8NeFo9PiQhecDIIrtrOMIoG3H4VlJm9t\nC6CB06VPGM1IHLeItGS6uw+ORT7e3jsbQvj7gzUNam0JaWE+HN7NqOqX80n3FO1RXo8YzXdS+BHk\n4z+KyzGPapcU2YIv7qQtiuaxvcaWqG4O6FwfSrS1JbPnrxoxkv7qIfejcitj4V2f2exumI+8+aKn\nxHTT+G5d8Txlm4rjLxMsQwzWT3OiK0Mm6sEkVsAcjFc1d+FEmlGwEDPQVopaEuOpr6f4ZWNAu3tW\nvHpAj5ZQcUFIWaDjGMVUMQ3cVDBmvbhY7QAV2nh+T/R1yeKhlrY31+b61FcQK6nIoJMi401WblRi\nqr6PCw5UYq9y+YgOgWzNkRrx3xWjp+nx2v3FQcelAbmko9anQ4GBUNisPHWr1qMrQhS2K11HvmYV\nhamcxSRZ5xRIqluS/DKAQQXZxyXrvo2FdlL4EeZjH+/ZbjNSZpswLNBrE1Gt7VE4ODVIlnh/j61F\nj4lmeTGyUbq6LwdEqWbeX0YbhSqfEddP4Bddj4JIrhL5d8h7VjI6oLQqKNzelWre3yc4/ClFjaL6\nwqBxxUUxwCKu5BmXRA6c+9ZjP83FSBoQuPs4BrsNBlUW659KmRrDY6G1lyQtW3Hy0lqQ1qVJnAbm\noy3b9KYJCqRj3o4zRctIlhjLHmpSuOBRbQOpLGpPFaES7UqkZzKN1KsEc87/AHUUmvPLTVGv72aQ\nk7WJwKmRrQ3ud74Ltilgz4++2a6iNDXdS0gjyMU71my7GpqTbxSbMki3SViajTTHqkSeR/GeyZmg\nnQHkEE1S+F+oPPavBL96I4/Cia1udVF+4dVrkW+Fq8+v4tjMDWUkdVJ6WM0cNV+F+MVmjUcZgqnP\n1qpNNnkcVRLiZtxIS1UzzIF7mghlxUZpVQdq6nTVdAoAOKzkbQWhvwM6gMM1twOJYx3NOJE11Kt1\nH1/pVVlwBkk+9NocXoOQ45FPj+fkUJFF2NSB700v/hTEty5ZpkjvVyUgcCq6GM9zC14/8Se6GcZQ\n1574Xs5WkI2HBPHFQ1dm1KSSZ7Rotn9l0+KPHIHNacae1dy0Vjxaj5ptlhVp+2s2CJ9ppCKzuWNx\nzSFc1SYrHNeNdIGpaYw25ZeRXmvheyk0jVpEdcLJ0q3ZxNKTa0O3vQHg/DNcHrsJDmsmjspnNzNt\nfFIJ24GazOhC+azDmgZIOOKBsp3J2qSaZodubq58yQ4QAnmhGT3NO18pb7BORmu205LfYpyKVkWp\nOxr5gKYWoIZWgfGfloFq1qTPLubnGO1RPtxg4P0oBAkY/hBz6VNDDkZ6AU0W2WSdqkdKr9ZOaGSj\nVtcLHmnOcgmmYvcz7mBLy3MbdD1q9ouiRK6bUAVeelOC1InPlidSsWMDFOCEdq3uefykqrinYqGy\nrFvApMVka2DAowKAsMkRXQqwyDXn/iWyitNQ3qPl6itIvRoF8RXinW4tQ6HI6GuW8SIVBPalc6qe\n5x9x97r3qruwTjrWZ0ksZ9TUmcDNAmZ9/wAoao63rR0+w22MLPtAzt6mghmfofiB76LdJBJBIp5D\nd/oa7bSdWLIPnpDi9TM8TeKdas51XTbIyxd3J/pXS+E/EFxqNoFu7do5OmD60maHWrnZyDRkn/69\nMlEyOR0xntVoNx+FUgYjPxg4FLCuWDZyKQr2RoRnP0qO+nEFpJITgAUzLqZnhu6+0rknOTXpOmwJ\nFbrt5yMmnHYyr6Oxb2ijaKLnPYMClwKQWK3n0hn+lachHOJ9pNNN0apQFzsY10a4v4hXQh0xpieQ\nMA1XLZNjhK80cT8OdV+3Wl3A7ZZJCw+hrR1qLcjZ/CsbnfHRnFXseHJArOYYbrUs1uPhYbuatqFP\nByfSkMq3UIINYkto+87Tx6GkSxfsDbflGD7CtTw/pk4nzITtPIFMFudsukh4Rxz71paTpKwP5jcn\n0qTRy0NORMDgVCqewoJTJgAoxjntTiTu7fWmFxAcnn1q3EPl+X8KZMi4gKqB1Peob/Tv7Us5bfeU\nyOoq4R5nYxqT5I8xieH9J1DTbvyJELRg8ODwa9Ms5mSFV9BWiptbnNVrKdmif7Q1KLg96XIZc5Is\npNL5pqeUrmMtZs0jzV08phchaY00zH1p2ZNxjS1g+LdJOt6U9ssmxjyGp2urDjLlaZzng/wUPDqz\nTSTmWeTrjpVjVk3Rvjr2rnqQ5dDvo1XUd2cTqSNk9OKxXGCeKxZ1DAxHTr2q5C/y8GokUhsz54qu\nuCxzSQjQ0+FZblR2ro4bZYiMVQ0dBb7Qi5x0qzuG5QOh71LYErDufpSeWrHnimIXbjkUjLkH1Hem\ngGxryc+tXI19KYmWegq9YLiLJ7mtqS945cS7QsWehqxA9dEjz4krPSxyZqbFFhGxUm6smjRM55Lk\nHvSvNxXTY57kLT+9MNwKdhXGm5FIbkU7Bca1wMEVhaiuQcVhXWiZ14R6tHGanGBI2OtYkqEHjgVy\ns9ErEeo6UBsHipKEZs5qpPdRxcbhx70NCSuybTNWihc5brW9Fq6vjMnFSdEIdDRi8RRKygZbHFbu\nm6nb3RA3gMegNJhOm0jbXGOoxTuCc1Rz3FyoGKawz9KaAVcZqeMgCmIkB4FaUTbYwB6V00Fuzixb\n0SFMuDU8Mlbs4UPeXHeiOXkUrDuXYnyKk3cVk0ap6HMxxketSMhrcwRC0dMMZFMQ3yzSeVQAeUaz\n9Vj8uPd271nVV4m+GdpnHX67pCeKyLtBtNcR6xlk9RVeWTb3qRnO6trgttyIfm71z7ai8j7/AJmN\nDNqUVa5Yi1AnjynHuBV+11YJhWWXcP8AZNSzqgmaEerSsf3NtIQP4mGKtRavdRgMIpVI9KjU0a7n\nR6T43uYQI7qN2Tpkqciu503VVuQGAYZHQjFVc4alPlZrpKGAznpTwxOc9+lWjIlUACnM4XApiLNk\nnmvnsK0NvpXZRVonmYqV52GsmanhXitTmFkSiJTSAvwrxUxXIrJ7miOfjf1pzNWxkRlqYWpgJupu\n6gQbuahvIxPA6eo4pNXVioS5WmefakGhndH4INZs5DJXA10PaTurmLO21uKpSZqGMoXGnRzBiyjd\n9Kx5rcQS428fSkjanLoaOliHGZFB56VswW+mtPufcBsGOAfmxz+tFkd8HpoaUx09FAtFY8DO71qb\nSms/Nb7RbecG6AEjFLS5c78t+p0djpVs9wsyQiJAdyr1rW+zqjErzSe559Sbk9S3C+MA1bjbgE1S\nMSXzMVG0vNUI2tPKrAuCMnrVzNd0PhR49W/O2xrHmp4TxVMzQshpIzzQBehqesnuaI5VGzT2bitz\nFEbNTC1ADS1JupgG6l3UAc14s04yR/aYRll+8BXCtLncDXFWjys9TCz5oW7GddH5qqNzWDOgQnC8\nVSuo1kHzAGkPYopEY2+RWxV23Vzj5G/Kg3jWaNazhZuqNXS6TaKhB2c0jR1nJWOlhOxRxU4YkCgx\nY0OQatQyDbyaaFYe8uF4NY3iC9ltbVGj43NTIL3h7WzMihjzXVQXYYDdW9Cf2WcOJpfaRZ3g9KsQ\nmupnCLIabGeaAL0LcVY3cVmzRHIxtUhetzEjZqjLUAIWpN1ArhupwagAfDKQ3Q1594v0c2bm6tx+\n5Y8j+6ayrR5onThp8s7dzkZjuqAAmuBnqC7c0iwgtzSA0rWzjfGRW3ZadDu4AoNYo2rfS4v7orSh\n05UA2r0pDbsTm29KRottBNyJ0wpJ9KhD7f6U0ikNWffIFBz60zVUW52ow4UcUN6EPcx44WsbgOmd\nua7TT5Bd24KHnFKnLlZFSN4koluLdueRWvp14swweG9DXoxldHlTjYtzGoo25qzEvwtUxas2jRPQ\n5CNqkLVsYoYzUzdQA3dSFqBBmnqaBhuqhriCXTpVIzxUz+Fl03aSPI9QTypW2/dz0qKNw3SvOPZR\nMqin8VLKRcs3O4Cuk0w/MDjt1NBtHY6O2IIHY1pxgFaETIRwMkjtVSUEk4570MlFW5bap6dKzWm8\n1tqH8aY+hp2FvGoGayNevVt7/ap4xzUvYjqTLtvLPcvJxSaVcyWsxTnFZlnT2t15xHmCtOBYwQy4\nB9q7cPO+jPPxFO2qLEj5HWo42+aus4HpoX4W4FTF+KlotbHII9SFuK0MUNZqiLUDE3UbqBBupwag\nBc1DefPbyD/ZND2KjujyPWlKzuPesRZjHJXms9lMuw3StjnmphKDSLTJ7OfE3JrpbO4GQc9qlnRA\n3LO82k5NbFvdADkjBoCSHyXIIIzgVQvdRigT7wzjgUzO1jHknlvG7qnp61etYFQDIpCZoqVijzXn\n3iC8EmsOuaCGb/heR/s0ijkVv6fbxy3QMg5xmsnuX0Ldzut3+UYTPWk+2GJSe+M1pFtamcldalmx\n1eO4XaThhWnC+TXqR2PHqL3maUJ4qRjxSEjj42qXdxVmaGs1MJoATfSbqBAG5p6mgAzTJTmNvpQU\ntzzHXY83D/U1zF5FhjgV5r3Pa6FMsV5HWnLe7RhqBRdmTwagN2d2K2rPU1C5LAnPrUs6Iysbdrq6\nf3gK0BrUKj/WClY05iM6xLOcQAj3NT29uznfKSzHuadzNu7NSBFjHNSm5VO9IRnajqoWMhTzXFtA\nbvUfMduSeg702Qz0rS7FbTToQFwzjJqaGTFyfK5PQViyzUuFmuIdgGABya5u/vTaN5cnUHFUmLoZ\nzyskwlgJweSK6zQdUEwVJeGr0aUrxPLxEfe0OrhPAqVjxWhznGRtUwatDK4jNxURbmkAm6jNABup\n6tQAFqhupNtu59qUnZFwV5JHnWsHdIx96w5lz15rzT2uhRmt85xWbcxMnUGmZlB0bdxmrNvFIcfM\n350mWjbs7YkDJY/jW5ZWW4jikWkdNp9mqYJFaJdEHHakUULu/VB1rLn1Ld/FgetMGYd/qWSQmSa0\n/AemS32pfa7piLeLkg9z6UmQtz0W7uQ2cZx0A9BVzR7cAea6j2rPqX0L99KRat5A6Dk1wOoKZ52a\nYfMORTYRLujiGWEq6/NWza2yKQVHNdOHerRy4laJo6TTnbbtb8KuM3Fdh5z3OJjbmpt3FaMxAtUZ\nagBN1GaQBzTwaAAms3VbjERUGsa07RsdeFpuUuY4jUjljWTKK4j02RE4IpJYFk6imQkVl0xWarsO\nmAEcUi0bNnZBR0rWtoguMCkUi21wI161mXuocEKaYXMS4u+pY/hVCSWSY4HT0pEmlouiSahdpEBl\nmOceleiwWcNjClvHgJH97Hc1EmVFFi3Czy7mwIl/WtJbjP7uLgd/apQ2VNVvtsBhiPzdK5S4nAuR\nnqOCaTGi9pcytPlU+XpmumtWII44rah8ZjiNIXRuWeNvvViQ/LXpJWPJbu7nCRvVkNxVsxBmqJmo\nEPiXca0YLMuOlJsuKuPlsSi5IrNuG8s4HWs5VEkbwoOTKsk+FJY4rC1K53k1xTk5O7PSpwVNWRzt\n4cms+WpKICtSLTETQj5q0YeBSGiys23pUguGxQMq3E59ayrm4x3yaAKiRtO2WPHcmhruKFxFajzZ\nScA44qRHoXhuMaLpxaUg6hcDLMf4F9KlhuDeXGASIl+8azZslYma68y48m1+7nFW5rtbRNhb5z1p\niMKbUg0zuW4A4rPgb7VdKXOMmpA7HRbMS7nUYiUda0lkQOBngVrS+JGdbWLRt2bAx5BqeQ/LXpnj\nPQ4GJ+ashuK0MhWaoWcA0AaOmASMK7jRNPWYBmHyiuepO2x10qfcv6vYxCzYqoGK4HVYVTJrmb5l\nc6oaM5TUJ8EgGsG4kLNUHT0M64OaqMMikSRsuKbnFMRLG3zVehOaGNE445NNlnVFpDMu6uie9Vo1\n8z5mOAOST2pDK91cNN+5tsrH3PrW54a06KxT7fdrlh/q1Pc+tJ6IUdZGvHPLezMcnBOWbsPap5r3\nylFtbdT1xUWNWzU0/Zbwlgfmx8zGsHWtRHmMqE59aAMyNifvHPc1f0gtPdqkY5JosJHeNci2tktY\neuPnNY+oXWZEVJNrZ9aun8SIq/CzodHuriIokhDIR1ronbKZr0o6o8ipoz//2Q==`;\n\n// data:image/jpeg;base64,\nexport const body = `\n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\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAa2p1UYo5adbz+xbxMlvqJ1OqjDHLXree0ejmzNrWm953tPmTPWbWneZ7yoy5YhjrXXTjH8s75N\nmtkyxt0VZM2/m175N1V03yTKubMLXVXybeYLLX2VXy7eam+b0bOg4VquJW+rry4/O9uyZOq3UjVm\n9r25axMzPaIdvhns1kzbZddM0p5Y47z8/R2+HcF03Doi1a8+Xzvbv+TotJnjDXkt+K8ODHp8cY8N\nIpSO0RCwF2YAAAAAAAAACvUZYw6fJkntWN3k8dfHz2vLucdz8mkjFE9bz1+UOZosX1UzPm0nqI/W\nMYo9FlcPNklfFGeH/NshLGun+Cz6PtHZtVZWlRLS+jxPkRpIn7rdoupHTdA5s6SI+7H6Mfo+32Y2\n+To3neSIiZ7A0IjPXpXLePlMotGW3272t85datKzHZjbTVnsDj+FG/2Y/RlGP4R+jo20u7H6N1Ql\no+H8I/REY957R+jpfReiK6eOYHLtj2tttH6KrY/6Y/R2c+kjeJiFVtLG24hxpw7/AHY/RRkw9O37\nO99Hrt1YX0tfOBLjcGp4XF8c+u8fs9c4dcVcGemSI61nd3IneN1orQAAAAAAAAAAAAABFqxes1tE\nTE9JiUgPKcX4RbRXnNgiZwWnrH4XPi28PdXpW9JraImsxtMS8pxXhF9DecuGJtgmf+1TWW2N/la1\nL7N7T5e3Vy6W3hsYcvLbqzbO9jvvCzvDR0+XeO7crO6FmGSvRThy/RtVXJ92elvk2rRvDUzU7pl4\nizsd2J3jeBpcNz+Lg5LT7+Pp+Xk3W7js5eAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs0NTrN96Yp6edkW8Wzm6+LNTq4pvTHO9vOfRoWtt\n1mes95YWvs1s2fZldddOczLPLn2ju0MmebT3YZc2/mpm3qqllN1drsbZIhr3yzvtHf4AsvlYYseb\nV5Yx4KTe0+UQ6nDvZ3UazbJqd8OKeu33peq0eh0+hxcmnxxWPOfOfm0mP+steT/ji8N9mKY9suum\nL37+HHaPm9DSlaVitKxWsdohI0Y22gAgAAAAAAAAAABXnyRhw3yT92Nwef4xm8bVzET0rPJH5d12\n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\nAOZE/OsPS29nuH27YrV+VpeV9pdPXhOtw49NG9Mld55+vXcTPd42I47qo7xSfyWV9oM8d8VJ/VxM\nd8l46xWF9cV7en6o/qLfxp2I9ob+eCv/AHMo9op89P8A/wBORGmyT5R+qfo2X8P7n9Q/jTsx7RR5\n6ef+4/8AuHftg/8A6cWcOSO9J/WEbWr3pY7Efzp2Lcfv5YK/9zWy8d1E/ZpSv5Oba1/+Hb9lc+LP\nbFt87I7E/wAabWbiurvEx4nL/pjZzc2bJkn372t85ZXx55/BX85lucC0vPxnTxlnnjm32mOiZqUu\nLJ2p4TwnVavNWaYbRTfre0bQ99pcH0bT0xb78vmtiIiNojaErMwAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAHnfarF7umzRHaZrLjYrdIen9ocPi8JyTt1xzF4eUw23rCm3R4r6bMy\nwt6kdTaWLdjswmNoZontsCm0K5XWjopnuDC0dGpqG5bs08/daKV672MjbSaif6oh6Z5f2LtvptRX\n0tEvUN3Jfo8f7cYve0eX4zV7B5z20xc/C8eSPuZIRficfXlcPaG7ino08HWIbePpLF2NuiyOyrHK\n3fZFSwuovHVfaVF4QK5YWTM9UT0EKry6Ps1Tn4zjn8NZn9nOtLseydObiWW34cf918fWfk+PYANn\nKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq1WKM+ly4p+/WYeBxTNd6zG0xO0\nvobw3FcP0bi2em20Tbmj5Srr418V9sa2Z7qKyzi07MXUylhaU7yjqhLCeiq3ddaFNxFYW7NLNG8t\nzya+WO6Va9J7FW66mvwidnrXiPY3Ny8RyUn71Jj9Ht3RPjk19HK9pMHj8D1ER3rHN+jqqtTjjNps\nuOe16zAifXzfTz7kNyndpYazS9qT0mszDdoxrsi6m8LazMq6zDOsq1ZEyrt1WWlXaUCqyq0rbKbi\nFdp6PReyFd8uqv8ACsfy83aXrPZHHto89/xX2/SP/dpj6y8vx6EBq5gAAAAAAAAAAAAAAAAAAAAA\n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\nNO67NbkhzNVnmInqzaOZrL93JyZeV0M1++7S02jvxDWxhxx033tPpC8Z6rrezWjmZyazJG2/u03h\n2vFibTHoqvamiwVwY+nLGzV0+SZ1Mx8G0/45tOhzJ5lXMc3UVXRdlF1HP+iYsDPLPPy49/tz1+Te\npSIr0ho6ak5Ms5J8o2q6NImOrHV7XX488ypzTtHXo0s9t6zG7c1G1qz6ubeZiZ3UatXJG3yauSO7\ncvMTEx5tPLb3prPRMVr0HB8vicNxf0+7+kt+LOJwTJyY/Bnz3tH93X36N58cWvq6LSyiyndMSlC7\nmZcymLJiwLosmJVRLKLAtiU7q4lMSCzc3YxJuDMRuAlKAEgAAAlAkAAAAAABKAEgAAAAAJAAAAAA\nAAAAAAAEgAAAAAAAAAAAAAkAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAhIAAACAAAASgAAAAAAEAAAA\nhGzJAImGMwzQDDZjNVuyNgUTVhNGxysZqDVmiu1G5NN2M4waM0+DCaN2cbGcQNGaMZq3JxMJxA1J\nqx2bU4kU09slorWNwa20z02RXHbJbl26QvtFovbHWkxEdJt5y2MOHlr2U1W3jx+1hiw8vSO63lmI\nXRTaEWmtY6snRHO1VpmJ+DjavpSZl2s8b7y4HFcnh0n0gha5ebJN55KRM2mdoiPN6fh+kpwXh0Wy\nRHj5Otp/s5Ps1p62y31+em9aTMYt/OfVfxTiPjZ52naI7fBrI5t66xz5+a1rW7yx0eSL6iZjtEOX\nqNbSletom3lENjh2fbHzbbWt3iVozruc+5ztWubf4M4ybpQ2Oboyrva0Vjza8WdDR4OkXt3n9ldX\nkaePP9VtYqctYhdvt5oivTeCZ2YOxXk6ubqMfV0b9mrljfqlFcq88k7z2U5axeItDa1OPessuC8P\nya7XRWYnwqdbT/ZMilvIu4dpslNdixXja8Y5tt85djZdbDWnGOesRtXFtuw6T27No5Kx2OrKYQlC\nExKJgBnEpiyvdlEgsizKLKollFgWxLKJVRLKJBbEp3VxLKJBnuMWQJEbpBIAAAJAAAABIAAAAAAA\nlAJAAAAAAAAAAAAAASAAAAAAAAAAAAAJAAAABAJABAlAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAA\nAAABAJQAAAAgAABAAI2EoBGyJhkgGPKxmqxAKpownHC+YRMdN5BrTj67R3bOn01o7p01Iv71u89o\n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\n2Q==`;\n", "/**\n * Warmup algorithm that uses embedded images to exercise loaded models for faster future inference\n */\n\nimport * as tf from 'dist/tfjs.esm.js';\nimport { log, now, mergeDeep } from './util/util';\nimport * as sample from './sample';\nimport * as image from './image/image';\nimport * as backend from './tfjs/backend';\nimport { env } from './util/env';\nimport { empty, Result } from './result';\nimport type { Config } from './config';\nimport type { Human } from './human';\nimport type { Tensor, DataType } from './tfjs/types';\n\nasync function warmupBitmap(instance: Human): Promise {\n const b64toBlob = (base64: string, type = 'application/octet-stream') => fetch(`data:${type};base64,${base64}`).then((res) => res.blob());\n let blob: Blob | null;\n let res: Result | undefined;\n switch (instance.config.warmup) {\n case 'face': blob = await b64toBlob(sample.face); break;\n case 'body':\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 instance.detect(bitmap, instance.config);\n bitmap.close();\n }\n return res;\n}\n\nasync function warmupCanvas(instance: Human): Promise {\n return new Promise((resolve) => {\n let src: string;\n // let size = 0;\n switch (instance.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 = '';\n }\n // src = encodeURI('../assets/human-sample-upper.jpg');\n let img: HTMLImageElement;\n if (typeof Image !== 'undefined') img = new Image();\n // @ts-ignore env.image is an external monkey-patch\n else if (env.Image) img = new env.Image();\n else return;\n img.onload = async () => {\n const canvas = image.canvas(img.naturalWidth, img.naturalHeight);\n if (!canvas) {\n log('Warmup: Canvas not found');\n resolve(undefined);\n } else {\n const ctx = canvas.getContext('2d') as CanvasRenderingContext2D;\n if (ctx) ctx.drawImage(img, 0, 0);\n // const data = ctx?.getImageData(0, 0, canvas.height, canvas.width);\n const tensor = await instance.image(canvas, true);\n const res = tensor.tensor ? await instance.detect(tensor.tensor, instance.config) : undefined;\n resolve(res);\n }\n };\n if (src) img.src = src;\n else resolve(undefined);\n });\n}\n\nasync function warmupNode(instance: Human): Promise {\n const atob = (str: string) => Buffer.from(str, 'base64');\n let img;\n if (instance.config.warmup === 'face') img = atob(sample.face);\n else img = atob(sample.body);\n let res: Result;\n if (('node' in tf) && (tf.getBackend() === 'tensorflow')) {\n // @ts-ignore\n const data: Tensor = tf['node'].decodeJpeg(img); // eslint-disable-line import/namespace\n const expanded: Tensor = tf.expandDims(data, 0);\n instance.tf.dispose(data);\n // log('Input:', expanded);\n res = await instance.detect(expanded, instance.config);\n instance.tf.dispose(expanded);\n } else {\n if (instance.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 instance.detect(input, instance.config);\n */\n }\n // @ts-ignore\n return res;\n}\n\nasync function runInference(instance: Human) {\n let res: Result | undefined;\n if (typeof createImageBitmap === 'function') res = await warmupBitmap(instance);\n else if (typeof Image !== 'undefined' || env.Canvas !== undefined) res = await warmupCanvas(instance);\n else res = await warmupNode(instance);\n return res;\n}\n\n/** Runs pre-compile on all loaded models */\nexport async function runCompile(instance: Human) {\n // @ts-ignore private property\n if (!tf.env().flagRegistry.ENGINE_COMPILE_ONLY) return; // tfjs does not support compile-only inference\n const backendType = tf.getBackend();\n const webGLBackend = tf.backend();\n if ((backendType !== 'webgl' && backendType !== 'humangl') || !webGLBackend?.['checkCompileCompletion']) {\n // log('compile pass: skip');\n return;\n }\n tf.env().set('ENGINE_COMPILE_ONLY', true);\n const numTensorsStart = tf.engine().state.numTensors;\n const compiledModels: string[] = [];\n for (const [modelName, model] of Object.entries(instance.models).filter(([key, val]) => (key !== null && val !== null))) {\n const shape = (model?.modelSignature && model?.inputs?.[0]?.shape) ? [...model.inputs[0].shape] : [1, 64, 64, 3];\n const dtype: DataType = (model?.modelSignature && model?.inputs?.[0]?.dtype) ? model.inputs[0].dtype : 'float32';\n for (let dim = 0; dim < shape.length; dim++) {\n if (shape[dim] === -1) shape[dim] = dim === 0 ? 1 : 64; // override batch number and any dynamic dimensions\n }\n const tensor = tf.zeros(shape, dtype);\n try {\n const res = model.execute(tensor);\n compiledModels.push(modelName);\n if (Array.isArray(res)) res.forEach((t) => tf.dispose(t));\n else tf.dispose(res);\n } catch {\n if (instance.config.debug) log('compile fail model:', modelName);\n }\n tf.dispose(tensor);\n }\n const kernels = await webGLBackend['checkCompileCompletionAsync']();\n webGLBackend['getUniformLocations']();\n if (instance.config.debug) log('compile pass:', { models: compiledModels, kernels: kernels.length });\n tf.env().set('ENGINE_COMPILE_ONLY', false);\n const numTensorsEnd = tf.engine().state.numTensors;\n if ((numTensorsEnd - numTensorsStart) > 0) log('tensor leak:', numTensorsEnd - numTensorsStart);\n}\n\n/** Warmup method pre-initializes all configured models for faster inference\n * - can take significant time on startup\n * - only used in browser environments for `webgl` and `humangl` backends\n * @param userConfig?: Config\n*/\nexport async function warmup(instance: Human, userConfig?: Partial): Promise {\n await backend.check(instance, false);\n const t0 = now();\n instance.state = 'warmup';\n if (userConfig) instance.config = mergeDeep(instance.config, userConfig) as Config;\n if (!instance.config.warmup || instance.config.warmup.length === 0 || instance.config.warmup === 'none') {\n return empty();\n }\n return new Promise(async (resolve) => {\n await instance.models.load();\n await runCompile(instance);\n const res = await runInference(instance);\n const t1 = now();\n if (instance.config.debug) log('warmup', instance.config.warmup, Math.round(t1 - t0), 'ms');\n instance.emit('warmup');\n resolve(res);\n });\n}\n", "/**\n * Human main module\n * @default Human Library\n * @summary \n * @author \n * @copyright \n * @license MIT\n */\n\n// module imports\nimport * as tf from 'dist/tfjs.esm.js';\nimport { log, now, mergeDeep, validate } from './util/util';\nimport { defaults } from './config';\nimport { env, Env } from './util/env';\nimport { WebCam } from './util/webcam';\nimport { setModelLoadOptions } from './tfjs/load';\nimport * as app from '../package.json';\nimport * as backend from './tfjs/backend';\nimport * as draw from './draw/draw';\nimport * as blazepose from './body/blazepose';\nimport * as centernet from './object/centernet';\nimport * as efficientpose from './body/efficientpose';\nimport * as face from './face/face';\nimport * as facemesh from './face/facemesh';\nimport * as gesture from './gesture/gesture';\nimport * as handpose from './hand/handpose';\nimport * as handtrack from './hand/handtrack';\nimport * as image from './image/image';\nimport * as interpolate from './util/interpolate';\nimport * as meet from './segmentation/meet';\nimport * as match from './face/match';\nimport * as models from './models';\nimport * as movenet from './body/movenet';\nimport * as nanodet from './object/nanodet';\nimport * as persons from './util/persons';\nimport * as posenet from './body/posenet';\nimport * as rvm from './segmentation/rvm';\nimport * as selfie from './segmentation/selfie';\nimport * as warmups from './warmup';\n\n// type definitions\nimport { Input, Config, Result, FaceResult, HandResult, BodyResult, ObjectResult, GestureResult, AnyCanvas, empty } from './exports';\nimport type { Tensor, Tensor4D } from './tfjs/types';\n// type exports\nexport * from './exports';\n\n/** **Human** library main class\n *\n * All methods and properties are available only as members of Human class\n *\n * - Configuration object definition: {@link Config}\n * - Results object definition: {@link Result}\n * - Possible inputs: {@link Input}\n *\n * @param userConfig - {@link Config}\n * @returns instance of {@link Human}\n */\nexport class Human {\n /** Current version of Human library in *semver* format */\n version: string;\n\n /** Current configuration\n * - Defaults: [config](https://github.com/vladmandic/human/blob/main/src/config.ts#L262)\n */\n config: Config;\n\n /** Last known result of detect run\n * - Can be accessed anytime after initial detection\n */\n result: Result;\n\n /** Current state of Human library\n * - Can be polled to determine operations that are currently executed\n * - Progresses through: 'config', 'check', 'backend', 'load', 'run:', 'idle'\n */\n state: string;\n\n /** currenty processed image tensor and canvas */\n process: { tensor: Tensor | null, canvas: AnyCanvas | null };\n\n /** Instance of TensorFlow/JS used by Human\n * - Can be embedded or externally provided\n * [TFJS API](https://js.tensorflow.org/api/latest/)\n */\n tf;\n\n /** Object containing environment information used for diagnostics */\n env: Env = env;\n\n /** Draw helper classes that can draw detected objects on canvas using specified draw\n * - canvas: draws input to canvas\n * - options: are global settings for all draw operations, can be overriden for each draw method {@link DrawOptions}\n * - face, body, hand, gesture, object, person: draws detected results as overlays on canvas\n */\n // draw: { canvas: typeof draw.canvas, face: typeof draw.face, body: typeof draw.body, hand: typeof draw.hand, gesture: typeof draw.gesture, object: typeof draw.object, person: typeof draw.person, all: typeof draw.all, options: DrawOptions };\n draw: typeof draw = draw;\n\n /** Face Matching\n * - similarity: compare two face descriptors and return similarity index\n * - distance: compare two face descriptors and return raw calculated differences\n * - find: compare face descriptor to array of face descriptors and return best match\n */\n match: typeof match = match;\n\n /** Currently loaded models\n * @internal\n * {@link models#Models}\n */\n models: models.Models;\n\n /** Container for events dispatched by Human\n * Possible events:\n * - `create`: triggered when Human object is instantiated\n * - `load`: triggered when models are loaded (explicitly or on-demand)\n * - `image`: triggered when input image is processed\n * - `result`: triggered when detection is complete\n * - `warmup`: triggered when warmup is complete\n * - `error`: triggered on some errors\n */\n events: EventTarget | undefined;\n /** Reference face triangualtion array of 468 points, used for triangle references between points */\n faceTriangulation: number[];\n /** Refernce UV map of 468 values, used for 3D mapping of the face mesh */\n faceUVMap: [number, number][];\n /** Performance object that contains values for all recently performed operations */\n performance: Record; // perf members are dynamically defined as needed\n #numTensors: number;\n #analyzeMemoryLeaks: boolean;\n #checkSanity: boolean;\n // definition end\n\n /** Constructor for **Human** library that is futher used for all operations\n * @param userConfig - user configuration object {@link Config}\n */\n constructor(userConfig?: Partial) {\n /*\n defaults.wasmPath = tf.version['tfjs-core'].includes('-') // custom build or official build\n ? 'https://vladmandic.github.io/tfjs/dist/'\n : `https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${tf.version_core}/dist/`;\n */\n const tfVersion = (tf.version.tfjs || tf.version_core).replace(/-(.*)/, '');\n defaults.wasmPath = `https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${tfVersion}/dist/`;\n defaults.modelBasePath = env.browser ? '../models/' : 'file://models/';\n this.version = app.version; // expose version property on instance of class\n Object.defineProperty(this, 'version', { value: app.version }); // expose version property directly on class itself\n this.config = JSON.parse(JSON.stringify(defaults));\n Object.seal(this.config);\n this.config.cacheModels = typeof indexedDB !== 'undefined';\n if (userConfig) this.config = mergeDeep(this.config, userConfig);\n setModelLoadOptions(this.config);\n this.tf = tf;\n this.state = 'idle';\n this.#numTensors = 0;\n this.#analyzeMemoryLeaks = false;\n this.#checkSanity = false;\n this.performance = {};\n this.events = (typeof EventTarget !== 'undefined') ? new EventTarget() : undefined;\n // object that contains all initialized models\n this.models = new models.Models(this);\n // reexport draw methods\n draw.init();\n this.result = empty();\n // export access to image processing\n this.process = { tensor: null, canvas: null };\n // export raw access to underlying models\n this.faceTriangulation = facemesh.triangulation;\n this.faceUVMap = facemesh.uvmap;\n // init model validation\n models.validateModel(this, null, '');\n // include platform info\n this.emit('create');\n if (this.config.debug || this.env.browser) log(`version: ${this.version}`);\n if (this.config.debug) log(`tfjs version: ${this.tf.version['tfjs-core']}`);\n const envTemp = JSON.parse(JSON.stringify(this.env));\n delete envTemp.kernels;\n delete envTemp.initial;\n delete envTemp.perfadd;\n if (this.config.debug) log('environment:', envTemp);\n }\n\n /** internal function to measure tensor leaks */\n analyze = (...msg: string[]) => {\n if (!this.#analyzeMemoryLeaks) return;\n const currentTensors = this.tf.engine().state.numTensors;\n const previousTensors = this.#numTensors;\n this.#numTensors = currentTensors;\n const leaked = currentTensors - previousTensors;\n if (leaked !== 0) log(...msg, leaked);\n };\n\n /** internal function for quick sanity check on inputs @hidden */\n #sanity = (input: Input): null | string => {\n if (!this.#checkSanity) return null;\n if (!input) return 'input is not defined';\n if (this.env.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 /** Reset configuration to default values */\n reset(): void {\n const currentBackend = this.config.backend; // save backend;\n this.config = JSON.parse(JSON.stringify(defaults));\n this.config.backend = currentBackend;\n image.reset();\n env.initial = true;\n }\n\n /** Validate current configuration schema */\n validate(userConfig?: Partial) {\n const msgs = validate(defaults, userConfig || this.config);\n if (msgs.length === 0) this.config = mergeDeep(this.config, userConfig) as Config;\n return msgs;\n }\n\n /** Utility wrapper for performance.now() */\n now(): number { // eslint-disable-line class-methods-use-this\n return now();\n }\n\n /** Process input as return canvas and tensor\n *\n * @param input - any input {@link Input}\n * @param getTensor - should image processing also return tensor or just canvas\n * Returns object with `tensor` and `canvas`\n */\n image(input: Input, getTensor: boolean = false) {\n return image.process(input, this.config, getTensor);\n }\n\n /** Segmentation method takes any input and returns RGBA tensor\n * Note: Segmentation is not triggered as part of detect process\n *\n * @param input - {@link Input}\n * Returns tensor which contains image data in RGBA format\n */\n async segmentation(input: Input, userConfig?: Partial): Promise {\n if (userConfig) this.config = mergeDeep(this.config, userConfig) as Config;\n if (!this.config.segmentation.enabled) return null;\n const processed = await image.process(input, this.config);\n if (!processed.tensor) return null;\n let tensor: Tensor | null = null;\n if (this.config.segmentation.modelPath?.includes('rvm')) tensor = await rvm.predict(processed.tensor, this.config);\n if (this.config.segmentation.modelPath?.includes('meet')) tensor = await meet.predict(processed.tensor, this.config);\n if (this.config.segmentation.modelPath?.includes('selfie')) tensor = await selfie.predict(processed.tensor, this.config);\n tf.dispose(processed.tensor);\n return tensor;\n }\n\n /** Compare two input tensors for pixel similarity\n * - use `human.image` to process any valid input and get a tensor that can be used for compare\n * - when passing manually generated tensors:\n * - both input tensors must be in format [1, height, width, 3]\n * - if resolution of tensors does not match, second tensor will be resized to match resolution of the first tensor\n * - return value is pixel similarity score normalized by input resolution and rgb channels\n */\n compare(firstImageTensor: Tensor, secondImageTensor: Tensor): Promise {\n return image.compare(this.config, firstImageTensor, secondImageTensor);\n }\n\n /** Explicit backend initialization\n * - Normally done implicitly during initial load phase\n * - Call to explictly register and initialize TFJS backend without any other operations\n * - Use when changing backend during runtime\n */\n async init(): Promise {\n await backend.check(this, true);\n await this.tf.ready();\n image.reset();\n }\n\n /** WebCam helper methods\n *\n */\n public webcam = new WebCam();\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 * @param userConfig - {@link Config}\n */\n async load(userConfig?: Partial): Promise {\n this.state = 'load';\n const timeStamp = now();\n const count = Object.values(this.models).filter((model) => model).length;\n if (userConfig) this.config = mergeDeep(this.config, userConfig) as Config;\n\n if (this.env.initial) { // print version info on first run and check for correct backend setup\n if (!await backend.check(this, false)) log('error: backend check failed');\n await tf.ready();\n if (this.env.browser) {\n if (this.config.debug) log('configuration:', this.config);\n if (this.config.debug) log('tf flags:', this.tf.ENV.flags);\n }\n }\n\n await this.models.load(); // actually loads models\n if (this.env.initial && this.config.debug) log('tf engine state:', this.tf.engine().state.numBytes, 'bytes', this.tf.engine().state.numTensors, 'tensors'); // print memory stats on first run\n this.env.initial = false;\n\n const loaded = Object.values(this.models).filter((model) => model).length;\n if (loaded !== count) { // number of loaded models changed\n this.models.validate(); // validate kernel ops used by model against current backend\n this.emit('load');\n }\n\n const current = Math.trunc(now() - timeStamp);\n if (current > (this.performance.loadModels || 0)) this.performance.loadModels = this.env.perfadd ? (this.performance.loadModels || 0) + current : current;\n }\n\n /** emit event */\n emit = (event: string) => {\n if (this.events?.dispatchEvent) this.events.dispatchEvent(new Event(event));\n };\n\n /** Runs interpolation using last known result and returns smoothened result\n * Interpolation is based on time since last known result so can be called independently\n *\n * @param result - {@link Result} optional use specific result set to run interpolation on\n * @returns result - {@link Result}\n */\n next(result: Result = this.result): Result {\n return interpolate.calc(result, this.config);\n }\n\n /** Warmup method pre-initializes all configured models for faster inference\n * - can take significant time on startup\n * - only used for `webgl` and `humangl` backends\n * @param userConfig - {@link Config}\n * @returns result - {@link Result}\n */\n async warmup(userConfig?: Partial) {\n const t0 = now();\n const res = await warmups.warmup(this, userConfig);\n const t1 = now();\n this.performance.warmup = Math.trunc(t1 - t0);\n return res;\n }\n\n /** Run detect with tensorflow profiling\n * - result object will contain total exeuction time information for top-20 kernels\n * - actual detection object can be accessed via `human.result`\n */\n async profile(input: Input, userConfig?: Partial): Promise<{ kernel: string, time: number, perc: number }[]> {\n // @ts-ignore profile wraps method return values\n const profile = await this.tf.profile(() => this.detect(input, userConfig));\n const kernels: Record = {};\n let total = 0;\n for (const kernel of profile.kernels) { // sum kernel time values per kernel\n const ms = Number(kernel.kernelTimeMs) || 0;\n if (kernels[kernel.name]) kernels[kernel.name] += ms;\n else kernels[kernel.name] = ms;\n total += ms;\n }\n const kernelArr: { kernel: string, time: number, perc: number }[] = [];\n Object.entries(kernels).forEach((key) => kernelArr.push({ kernel: key[0], time: key[1] as unknown as number, perc: 0 })); // convert to array\n for (const kernel of kernelArr) {\n kernel.perc = Math.round(1000 * kernel.time / total) / 1000;\n kernel.time = Math.round(1000 * kernel.time) / 1000;\n }\n kernelArr.sort((a, b) => b.time - a.time); // sort\n kernelArr.length = 20; // crop\n return kernelArr;\n }\n\n /** Main detection method\n * - Analyze configuration: {@link Config}\n * - Pre-process input: {@link Input}\n * - Run inference for all configured models\n * - Process and return result: {@link Result}\n *\n * @param input - {@link Input}\n * @param userConfig - {@link Config}\n * @returns result - {@link Result}\n */\n async detect(input: Input, userConfig?: Partial): Promise {\n // detection happens inside a promise\n this.state = 'detect';\n return new Promise(async (resolve) => {\n this.state = 'config';\n let timeStamp;\n\n // update configuration\n this.config = mergeDeep(this.config, userConfig) as Config;\n\n // sanity checks\n this.state = 'check';\n const error = this.#sanity(input);\n if (error) {\n log(error, input);\n this.emit('error');\n resolve(empty(error));\n }\n\n const timeStart = now();\n\n // load models if enabled\n await this.load();\n\n timeStamp = now();\n this.state = 'image';\n const img = await image.process(input, this.config) as { canvas: AnyCanvas, tensor: Tensor4D };\n this.process = img;\n this.performance.inputProcess = this.env.perfadd ? (this.performance.inputProcess || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n this.analyze('Get Image:');\n\n if (!img.tensor) {\n if (this.config.debug) log('could not convert input to tensor');\n this.emit('error');\n resolve(empty('could not convert input to tensor'));\n return;\n }\n this.emit('image');\n\n timeStamp = now();\n this.config.skipAllowed = await image.skip(this.config, img.tensor);\n this.config.filter.autoBrightness = (this.config.filter.autoBrightness || false) && this.config.skipAllowed; // disable autoBrightness on scene change\n if (!this.performance.totalFrames) this.performance.totalFrames = 0;\n if (!this.performance.cachedFrames) this.performance.cachedFrames = 0;\n (this.performance.totalFrames)++;\n if (this.config.skipAllowed) this.performance.cachedFrames++;\n this.performance.cacheCheck = this.env.perfadd ? (this.performance.cacheCheck || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n this.analyze('Check Changed:');\n\n // prepare where to store model results\n // keep them with weak typing as it can be promise or not\n let faceRes: FaceResult[] | Promise | never[] = [];\n let bodyRes: BodyResult[] | Promise | never[] = [];\n let handRes: HandResult[] | Promise | never[] = [];\n let objectRes: ObjectResult[] | Promise | never[] = [];\n\n // run face detection followed by all models that rely on face bounding box: face mesh, age, gender, emotion\n this.state = 'detect:face';\n if (this.config.async) {\n faceRes = this.config.face.enabled ? face.detectFace(this, img.tensor) : [];\n if (this.performance.face) delete this.performance.face;\n } else {\n timeStamp = now();\n faceRes = this.config.face.enabled ? await face.detectFace(this, img.tensor) : [];\n this.performance.face = this.env.perfadd ? (this.performance.face || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n\n if (this.config.async && (this.config.body.maxDetected === -1 || this.config.hand.maxDetected === -1)) faceRes = await faceRes; // need face result for auto-detect number of hands or bodies\n\n // run body: can be posenet, blazepose, efficientpose, movenet\n this.analyze('Start Body:');\n this.state = 'detect:body';\n const bodyConfig = this.config.body.maxDetected === -1 ? mergeDeep(this.config, { body: { maxDetected: this.config.face.enabled ? 1 * (faceRes as FaceResult[]).length : 1 } }) : this.config; // autodetect number of bodies\n if (this.config.async) {\n if (this.config.body.modelPath?.includes('posenet')) bodyRes = this.config.body.enabled ? posenet.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('blazepose')) bodyRes = this.config.body.enabled ? blazepose.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('efficientpose')) bodyRes = this.config.body.enabled ? efficientpose.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('movenet')) bodyRes = this.config.body.enabled ? movenet.predict(img.tensor, bodyConfig) : [];\n if (this.performance.body) delete this.performance.body;\n } else {\n timeStamp = now();\n if (this.config.body.modelPath?.includes('posenet')) bodyRes = this.config.body.enabled ? await posenet.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('blazepose')) bodyRes = this.config.body.enabled ? await blazepose.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('efficientpose')) bodyRes = this.config.body.enabled ? await efficientpose.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('movenet')) bodyRes = this.config.body.enabled ? await movenet.predict(img.tensor, bodyConfig) : [];\n this.performance.body = this.env.perfadd ? (this.performance.body || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n this.analyze('End Body:');\n\n // run handpose\n this.analyze('Start Hand:');\n this.state = 'detect:hand';\n const handConfig = this.config.hand.maxDetected === -1 ? mergeDeep(this.config, { hand: { maxDetected: this.config.face.enabled ? 2 * (faceRes as FaceResult[]).length : 1 } }) : this.config; // autodetect number of hands\n if (this.config.async) {\n if (this.config.hand.detector?.modelPath?.includes('handdetect')) handRes = this.config.hand.enabled ? handpose.predict(img.tensor, handConfig) : [];\n else if (this.config.hand.detector?.modelPath?.includes('handtrack')) handRes = this.config.hand.enabled ? handtrack.predict(img.tensor, handConfig) : [];\n if (this.performance.hand) delete this.performance.hand;\n } else {\n timeStamp = now();\n if (this.config.hand.detector?.modelPath?.includes('handdetect')) handRes = this.config.hand.enabled ? await handpose.predict(img.tensor, handConfig) : [];\n else if (this.config.hand.detector?.modelPath?.includes('handtrack')) handRes = this.config.hand.enabled ? await handtrack.predict(img.tensor, handConfig) : [];\n this.performance.hand = this.env.perfadd ? (this.performance.hand || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n this.analyze('End Hand:');\n\n // run object detection\n this.analyze('Start Object:');\n this.state = 'detect:object';\n if (this.config.async) {\n if (this.config.object.modelPath?.includes('nanodet')) objectRes = this.config.object.enabled ? nanodet.predict(img.tensor, this.config) : [];\n else if (this.config.object.modelPath?.includes('centernet')) objectRes = this.config.object.enabled ? centernet.predict(img.tensor, this.config) : [];\n if (this.performance.object) delete this.performance.object;\n } else {\n timeStamp = now();\n if (this.config.object.modelPath?.includes('nanodet')) objectRes = this.config.object.enabled ? await nanodet.predict(img.tensor, this.config) : [];\n else if (this.config.object.modelPath?.includes('centernet')) objectRes = this.config.object.enabled ? await centernet.predict(img.tensor, this.config) : [];\n this.performance.object = this.env.perfadd ? (this.performance.object || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n this.analyze('End Object:');\n\n // if async wait for results\n this.state = 'detect:await';\n if (this.config.async) [faceRes, bodyRes, handRes, objectRes] = await Promise.all([faceRes, bodyRes, handRes, objectRes]);\n\n // run gesture analysis last\n this.state = 'detect:gesture';\n let gestureRes: GestureResult[] = [];\n if (this.config.gesture.enabled) {\n timeStamp = now();\n gestureRes = [...gesture.face(faceRes as FaceResult[]), ...gesture.body(bodyRes as BodyResult[]), ...gesture.hand(handRes as HandResult[]), ...gesture.iris(faceRes as FaceResult[])];\n if (!this.config.async) this.performance.gesture = this.env.perfadd ? (this.performance.gesture || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n else if (this.performance.gesture) delete this.performance.gesture;\n }\n\n this.performance.total = this.env.perfadd ? (this.performance.total || 0) + Math.trunc(now() - timeStart) : Math.trunc(now() - timeStart);\n const shape = this.process.tensor?.shape || [0, 0, 0, 0];\n this.result = {\n face: faceRes as FaceResult[],\n body: bodyRes as BodyResult[],\n hand: handRes as HandResult[],\n gesture: gestureRes,\n object: objectRes as ObjectResult[],\n performance: this.performance,\n canvas: this.process.canvas,\n timestamp: Date.now(),\n error: null,\n width: shape[2],\n height: shape[1],\n get persons() { return persons.join(faceRes as FaceResult[], bodyRes as BodyResult[], handRes as HandResult[], gestureRes, shape); },\n };\n\n // finally dispose input tensor\n tf.dispose(img.tensor);\n\n // log('Result:', result);\n this.emit('detect');\n this.state = 'idle';\n resolve(this.result);\n });\n }\n\n /** Helper function\n * @param ms - sleep time in miliseconds\n */\n async sleep(ms: number): Promise { // eslint-disable-line class-methods-use-this\n return new Promise((resolve) => { setTimeout(resolve, ms); });\n }\n\n /** internal structure that keeps track of processed videos @hidden */\n #loops: Record = {};\n /** Continously detect video frames\n * @param element - HTMLVideoElement input\n * @param run - boolean run continously or stop if already running, default true\n * @param delay - number delay detection between frames for number of miliseconds, default 0\n */\n async video(element: HTMLVideoElement, run: boolean = true, delay: number = 0) {\n if (run) {\n if (!this.#loops[element.id]) {\n if (this.config.debug) log('video start', element.id);\n this.#loops[element.id] = true;\n }\n if (!element.paused && this.#loops[element.id] && (element.readyState >= 2)) await this.detect(element);\n if (delay > 0) await this.sleep(delay);\n if (this.#loops[element.id]) requestAnimationFrame(() => this.video(element, run, delay));\n } else {\n if (this.config.debug) log('video stop', element.id);\n this.#loops[element.id] = false;\n }\n }\n}\n\n/** Class Human as default export */\n/* eslint no-restricted-exports: [\"off\", { \"restrictedNamedExports\": [\"default\"] }] */\nexport { Human as default, match, draw, models };\n"], + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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BAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,iBAAiB,iBAAiB;AAAA,EACnC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,gBAAgB;AAAA,EACnC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,iBAAiB,iBAAiB;AAAA,EACnC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,m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BAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,m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AA,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;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,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AA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;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO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C7DO,IAAMK,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,IAAMC,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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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", + "names": ["t", "config", "match", "gl", "index", "x", "v", "size", "rgb", "fx", "process", "config", "_a", "_c", "tensor", "rgb", "t", "gl", "el", "_a", "init", "config", "_a", "_c", "_d", "model", "config", "gl", "_a", "config", "op", "t", "_a", "mt", "canvas", "init", "options", "z", "rgb", "localOptions", "x", "cx", "xc", "yc", "to", "options", "x", "connectionsToIndices", "index", "_a", "_c", "_d", "_e", "_f", "_g", "_h", "_i", "emotion", "index", "inCanvas", "options", "inCanvas", "_a", "localOptions", "options", "connected", "inCanvas", "_a", "localOptions", "options", "z", "inCanvas", "_a", "localOptions", "options", "inCanvas", "_a", "localOptions", "options", "inCanvas", "localOptions", "options", "canvas", "init", "anchors", "x", "config", "outputSize", "_a", "t", "outputSize", "model", "inputSize", "x", "config", "size", "_a", "t", "outputSize", "kpt", "distance", "annotations", "body", "_c", "labels", "model", "inputSize", "last", "lastTime", "skipped", "config", "process", "t", "id", "labels", "x", "predict", "outputSize", "connected", "kpt", "model", "lastTime", "cache", "skipped", "load", "config", "x", "predict", "_a", "enhance", "id", "y", "kpt", "connected", "size", "x", "x", "v1", "v2", "size", "inputSize", "anchors", "face", "x", "model", "inputSize", "load", "config", "_a", "decodeBoxes", "t", "_c", "_d", "model", "inputSize", "load", "config", "_a", "index", "face", "x", "z", "_a", "_c", "_d", "_e", "_f", "_g", "_h", "_i", "_j", "t", "cache", "model", "inputSize", "predict", "config", "_a", "_c", "_d", "_e", "_f", "_g", "_h", "_i", "_j", "id", "size", "face", "t", "index", "load", "model", "last", "lastTime", "skipped", "load", "config", "_a", "predict", "count", "t", "inputSize", "model", "last", "lastTime", "lastCount", "skipped", "load", "config", "_a", "predict", "count", "_c", "_d", "t", "gender", "all", "x", "face", "model", "skipped", "lastCount", "lastTime", "load", "config", "_a", "predict", "count", "model", "cached", "skipped", "lastCount", "lastTime", "load", "config", "_a", "predict", "count", "model", "last", "lastCount", "lastTime", "skipped", "load", "config", "_a", "predict", "count", "_b", "t", "gender", "age", "model", "last", "lastCount", "lastTime", "skipped", "load", "config", "predict", "count", "_a", "_c", "_d", "t", "model", "last", "lastCount", "lastTime", "skipped", "load", "config", "_a", "predict", "count", "_c", "_d", "t", "normalize", "model", "last", "lastCount", "lastTime", "skipped", "load", "config", "_a", "predict", "count", "t", "model", "last", "lastCount", "lastTime", "skipped", "load", "config", "predict", "count", "_a", "t", "face", "normalize", "v", "x", "z", "size", "face", "_a", "_c", "_d", "_e", "_f", "_g", "_h", "_i", "_j", "_k", "_l", "_n", "_o", "_p", "_q", "_r", "_s", "_u", "_v", "_w", "predict", "el", "options", "point", "point2", "gesture", "body", "face", "iris", "_a", "_c", "_d", "hand", "getBoxSize", "getBoxCenter", "scaleBoxCoordinates", "enlargeBox", "size", "squarifyBox", "normalizeRadians", "computeRotation", "buildTranslationMatrix", "x", "dot", "v1", "v2", "getColumnFrom2DArr", "multiplyTransformMatrices", "size", "buildRotationMatrix", "invertTransformMatrix", "rotatePoint", "anchors", "model", "_a", "_c", "_d", "anchors", "t", "index", "config", "hand", "scaleBoxCoordinates", "lastTime", "handPoseModel", "_a", "_c", "xs", "ys", "rotatePoint", "enlargeBox", "squarifyBox", "getBoxSize", "buildRotationMatrix", "invertTransformMatrix", "getBoxCenter", "dot", "config", "computeRotation", "meshAnnotations", "predict", "config", "annotations", "index", "load", "_a", "models", "inputSize", "skipped", "lastTime", "cache", "loadDetect", "config", "_a", "config", "models", "t", "ratio", "id", "hand", "inputSize", "kpt", "index", "predict", "_a", "skipped", "lastTime", "cache", "connected", "kpt", "calc", "config", "_a", "_c", "_d", "_e", "_f", "_g", "_h", "_i", "_j", "_k", "_l", "_n", "_o", "_p", "_q", "_r", "_s", "_u", "_v", "_w", "_b", "annotations", "kp", "t1", "model", "load", "config", "predict", "_a", "t", "options", "clamp", "index", "models_exports", "cache", "body", "kp", "compare", "inputSize", "_a", "t", "outputSize", "kpt", "model", "inputSize", "skipped", "cache", "load", "config", "_a", "kpt", "id", "annotations", "connected", "kp", "body", "predict", "t", "model", "last", "lastTime", "skipped", "inputSize", "load", "config", "process", "_a", "id", "size", "labels", "cx", "x", "predict", "outputSize", "x", "maxSize", "t", "outputStride", "x1", "y2", "x2", "dx", "model", "point", "height", "width", "minConfidence", "x", "_a", "predict", "config", "t", "load", "model", "outputNodes", "init", "config", "load", "rgb", "predict", "model", "load", "config", "predict", "_a", "t", "model", "_a", "op", "_c", "_d", "_e", "_f", "_g", "_h", "_i", "_j", "_k", "_l", "_n", "_o", "_p", "_q", "_r", "_s", "_u", "_v", "_w", "_x", "_z", "_A", "load", "loadDetect", "models", "join", "_a", "_c", "_d", "_e", "_f", "id", "face", "person", "body", "hand", "gesture", "x", "face", "body", "res", "face", "body", "canvas", "atob", "_a", "_c", "_d", "model", "t", "t1", "_a", "init", "process", "_c", "predict", "count", "model", "calc", "t1", "ms", "_d", "_e", "_f", "_g", "_h", "_i", "_j", "_k", "_l", "_n", "_o", "_p", "_q", "_r", "_s", "_u", "face", "body", "hand", "iris", "join"] +} diff --git a/dist/human.js b/dist/human.js new file mode 100644 index 00000000..bad22056 --- /dev/null +++ b/dist/human.js @@ -0,0 +1,7916 @@ +/* + Human + homepage: + author: ' +*/ + +"use strict";var Human=(()=>{var nc=Object.defineProperty;var sS=Object.getOwnPropertyDescriptor;var iS=Object.getOwnPropertyNames;var oS=Object.prototype.hasOwnProperty;var lS=(e,t,a)=>t in e?nc(e,t,{enumerable:!0,configurable:!0,writable:!0,value:a}):e[t]=a;var Gs=(e=>typeof require!="undefined"?require:typeof Proxy!="undefined"?new Proxy(e,{get:(t,a)=>(typeof require!="undefined"?require:t)[a]}):e)(function(e){if(typeof require!="undefined")return require.apply(this,arguments);throw new Error('Dynamic require of "'+e+'" is not supported')});var hr=(e,t)=>{for(var a in t)nc(e,a,{get:t[a],enumerable:!0})},uS=(e,t,a,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of iS(t))!oS.call(e,r)&&r!==a&&nc(e,r,{get:()=>t[r],enumerable:!(n=sS(t,r))||n.enumerable});return e};var dS=e=>uS(nc({},"__esModule",{value:!0}),e);var le=(e,t,a)=>(lS(e,typeof t!="symbol"?t+"":t,a),a),G5=(e,t,a)=>{if(!t.has(e))throw TypeError("Cannot "+a)};var Gn=(e,t,a)=>(G5(e,t,"read from private field"),a?a.call(e):t.get(e)),Go=(e,t,a)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,a)},$u=(e,t,a,n)=>(G5(e,t,"write to private field"),n?n.call(e,a):t.set(e,a),a);var C0e={};hr(C0e,{Env:()=>xp,Human:()=>S5,default:()=>S5,defaults:()=>yo,draw:()=>i0,empty:()=>or,env:()=>ne,match:()=>_0,models:()=>I5});var Ve={};hr(Ve,{Abs:()=>gl,Acos:()=>yd,Acosh:()=>Ad,AdadeltaOptimizer:()=>Eh,AdagradOptimizer:()=>Rh,AdamOptimizer:()=>Mh,AdamaxOptimizer:()=>$h,Add:()=>vr,AddN:()=>hi,All:()=>yl,Any:()=>Al,ArgMax:()=>fi,ArgMin:()=>xd,Asin:()=>bd,Asinh:()=>vd,Atan:()=>wd,Atan2:()=>xl,Atanh:()=>kd,AvgPool:()=>mi,AvgPool3D:()=>Gc,AvgPool3DGrad:()=>H1,AvgPoolGrad:()=>j1,BackendWasm:()=>_v,BatchMatMul:()=>gi,BatchToSpaceND:()=>bl,Bincount:()=>Uc,BroadcastArgs:()=>jc,BroadcastTo:()=>eT,Cast:()=>yi,Ceil:()=>Qr,ClipByValue:()=>es,Complex:()=>Id,ComplexAbs:()=>Hc,Concat:()=>vl,Conv2D:()=>Ai,Conv2DBackpropFilter:()=>qc,Conv2DBackpropInput:()=>xi,Conv3D:()=>Xc,Conv3DBackpropFilterV2:()=>q1,Conv3DBackpropInputV2:()=>Kc,Cos:()=>bi,Cosh:()=>vi,CropAndResize:()=>Ii,Cumprod:()=>wi,Cumsum:()=>ki,DataStorage:()=>md,DenseBincount:()=>Zc,DepthToSpace:()=>Si,DepthwiseConv2dNative:()=>Ti,DepthwiseConv2dNativeBackpropFilter:()=>Yc,DepthwiseConv2dNativeBackpropInput:()=>Jc,Diag:()=>Qc,Dilation2D:()=>eh,Dilation2DBackpropFilter:()=>Gm,Dilation2DBackpropInput:()=>Vm,ENV:()=>G1,Einsum:()=>Sd,Elu:()=>Ni,EluGrad:()=>X1,Environment:()=>IA,Equal:()=>ts,Erf:()=>Td,Exp:()=>as,ExpandDims:()=>wl,Expm1:()=>Ei,FFT:()=>th,Fill:()=>kl,FlipLeftRight:()=>Ri,Floor:()=>ns,FloorDiv:()=>Mi,FromPixels:()=>Yu,FusedBatchNorm:()=>$i,FusedConv2D:()=>jr,FusedDepthwiseConv2D:()=>Hr,GPGPUContext:()=>el,GatherNd:()=>_i,GatherV2:()=>Il,GraphModel:()=>op,Greater:()=>rs,GreaterEqual:()=>ss,IFFT:()=>ah,Identity:()=>Fi,Imag:()=>Cd,IsFinite:()=>Nd,IsInf:()=>Ed,IsNan:()=>Sl,KernelBackend:()=>fl,LRN:()=>rh,LRNGrad:()=>K1,LeakyRelu:()=>Pi,Less:()=>is,LessEqual:()=>os,LinSpace:()=>nh,Log:()=>ls,Log1p:()=>Rd,LogSoftmax:()=>tT,LogicalAnd:()=>Oi,LogicalNot:()=>Di,LogicalOr:()=>Tl,LogicalXor:()=>TA,LowerBound:()=>aT,MathBackendCPU:()=>Ph,MathBackendWebGL:()=>nu,Max:()=>zi,MaxPool:()=>Li,MaxPool3D:()=>sh,MaxPool3DGrad:()=>Y1,MaxPoolGrad:()=>Z1,MaxPoolWithArgmax:()=>ih,Maximum:()=>us,Mean:()=>Bi,Min:()=>Wi,Minimum:()=>ds,MirrorPad:()=>Vi,Mod:()=>Md,MomentumOptimizer:()=>_h,Multinomial:()=>oh,Multiply:()=>ps,Neg:()=>Cl,NonMaxSuppressionV3:()=>Gi,NonMaxSuppressionV4:()=>Nl,NonMaxSuppressionV5:()=>Ui,NotEqual:()=>cs,OP_SCOPE_SUFFIX:()=>a2,OneHot:()=>Rl,OnesLike:()=>El,Optimizer:()=>vs,OptimizerConstructors:()=>Or,Pack:()=>Ml,PadV2:()=>ji,Pool:()=>nT,Pow:()=>Hi,Prelu:()=>qi,Prod:()=>Xi,RMSPropOptimizer:()=>Fh,RaggedGather:()=>lh,RaggedRange:()=>uh,RaggedTensorToTensor:()=>dh,Range:()=>$l,Rank:()=>Hm,Real:()=>$d,RealDiv:()=>Ci,Reciprocal:()=>_l,Reduction:()=>xa,Relu:()=>Ki,Relu6:()=>Ji,Reshape:()=>Fl,ResizeBilinear:()=>Yi,ResizeBilinearGrad:()=>Q1,ResizeNearestNeighbor:()=>Zi,ResizeNearestNeighborGrad:()=>J1,Reverse:()=>Pl,RotateWithOffset:()=>lo,Round:()=>Ol,Rsqrt:()=>hs,SGDOptimizer:()=>ip,ScatterNd:()=>Qi,SearchSorted:()=>ph,Select:()=>Dl,Selu:()=>_d,Sigmoid:()=>fs,Sign:()=>Fd,Sin:()=>eo,Sinh:()=>Ll,Slice:()=>zl,Softmax:()=>ao,Softplus:()=>Pd,SpaceToBatchND:()=>Bl,SparseFillEmptyRows:()=>Od,SparseReshape:()=>Vl,SparseSegmentMean:()=>Dd,SparseSegmentSum:()=>zd,SparseToDense:()=>Ld,SplitV:()=>Wl,Sqrt:()=>ms,Square:()=>Bd,SquaredDifference:()=>gs,Step:()=>oo,StridedSlice:()=>no,StringNGrams:()=>Gl,StringSplit:()=>Wd,StringToHashBucketFast:()=>Vd,Sub:()=>ys,Sum:()=>to,Tan:()=>Ul,Tanh:()=>ro,Tensor:()=>dt,TensorBuffer:()=>Mt,Tile:()=>As,TopK:()=>so,Transform:()=>io,Transpose:()=>yr,Unique:()=>ch,Unpack:()=>jl,UnsortedSegmentSum:()=>hh,UpperBound:()=>rT,Variable:()=>ed,WebGPUBackend:()=>Uh,ZerosLike:()=>Hl,_FusedMatMul:()=>Ur,abs:()=>Ha,acos:()=>gx,acosh:()=>yx,add:()=>xe,addN:()=>mh,all:()=>Ax,any:()=>xx,argMax:()=>ar,argMin:()=>bx,asin:()=>vx,asinh:()=>wx,atan:()=>kx,atan2:()=>Ix,atanh:()=>Sx,avgPool:()=>w2,avgPool3d:()=>Ex,backend:()=>tr,backend_util:()=>T,basicLSTMCell:()=>Rx,batchNorm:()=>Qd,batchNorm2d:()=>Mx,batchNorm3d:()=>$x,batchNorm4d:()=>_x,batchToSpaceND:()=>k2,bincount:()=>I2,booleanMaskAsync:()=>p4,broadcastArgs:()=>Fx,broadcastTo:()=>ei,broadcast_util:()=>po,browser:()=>wr,buffer:()=>ve,cast:()=>Ue,ceil:()=>Px,clipByValue:()=>Ox,clone:()=>wa,complex:()=>xr,concat:()=>at,concat1d:()=>Dx,concat2d:()=>ql,concat3d:()=>zx,concat4d:()=>Lx,conv1d:()=>Bx,conv2d:()=>ep,conv2dTranspose:()=>Vx,conv3d:()=>Gx,conv3dTranspose:()=>Ux,copyRegisteredKernels:()=>uT,cos:()=>jx,cosh:()=>Hx,cosineWindow:()=>Ih,cumprod:()=>qx,cumsum:()=>Xx,customGrad:()=>Qn,denseBincount:()=>Kx,deprecationWarn:()=>d2,depthToSpace:()=>Zx,depthwiseConv2d:()=>gh,deregisterOp:()=>qF,device_util:()=>Hd,diag:()=>Yx,dilation2d:()=>Jx,disableDeprecationWarnings:()=>DC,dispose:()=>Y,disposeVariables:()=>zC,div:()=>fe,divNoNan:()=>Qx,dot:()=>eb,dropout:()=>g4,einsum:()=>tb,elu:()=>T2,enableDebugMode:()=>OC,enableProdMode:()=>u2,enclosingPowerOfTwo:()=>e3,engine:()=>kt,env:()=>V,equal:()=>S2,erf:()=>ab,euclideanNorm:()=>sb,exp:()=>Xr,expandDims:()=>Gt,expm1:()=>ib,eye:()=>N2,fft:()=>wh,fill:()=>nr,findBackend:()=>p2,findBackendFactory:()=>GC,floor:()=>E2,floorDiv:()=>Yd,forceHalfFloat:()=>Q6,fused:()=>t3,gather:()=>R2,gatherND:()=>m4,gather_util:()=>f2,getBackend:()=>ia,getGradient:()=>Um,getKernel:()=>kc,getKernelsForBackend:()=>Zn,getThreadsCount:()=>ere,gpgpu_util:()=>M6,grad:()=>yR,grads:()=>AR,greater:()=>np,greaterEqual:()=>M2,ifft:()=>id,imag:()=>Zd,image:()=>me,inTopKAsync:()=>y4,io:()=>Hn,irfft:()=>Z2,isFinite:()=>ob,isInf:()=>lb,isNaN:()=>ub,keep:()=>qn,kernel_impls:()=>Tn,leakyRelu:()=>$2,less:()=>db,lessEqual:()=>yh,linalg:()=>S4,linspace:()=>pb,loadGraphModel:()=>i3,loadGraphModelSync:()=>ZP,localResponseNormalization:()=>cb,log:()=>il,log1p:()=>_2,logSigmoid:()=>fb,logSoftmax:()=>mb,logSumExp:()=>P2,logicalAnd:()=>rd,logicalNot:()=>O2,logicalOr:()=>D2,logicalXor:()=>gb,losses:()=>T4,lowerBound:()=>yb,matMul:()=>st,math:()=>JA,max:()=>pa,maxPool:()=>z2,maxPool3d:()=>Ab,maxPoolWithArgmax:()=>xb,maximum:()=>L2,mean:()=>sd,memory:()=>LC,meshgrid:()=>bb,min:()=>qr,minimum:()=>B2,mirrorPad:()=>vb,mod:()=>Xl,moments:()=>wb,movingAverage:()=>c4,mul:()=>ae,multiRNNCell:()=>kb,multinomial:()=>Ib,neg:()=>Xn,nextFrame:()=>E4,norm:()=>ap,notEqual:()=>W2,oneHot:()=>Tc,ones:()=>Br,onesLike:()=>Sb,op:()=>D,outerProduct:()=>Tb,pad:()=>rr,pad1d:()=>Cb,pad2d:()=>Nb,pad3d:()=>Eb,pad4d:()=>Rb,pool:()=>Mb,pow:()=>sl,prelu:()=>G2,print:()=>i2,prod:()=>$b,profile:()=>BC,raggedGather:()=>_b,raggedRange:()=>Fb,raggedTensorToTensor:()=>Pb,rand:()=>Ob,randomGamma:()=>Db,randomNormal:()=>H2,randomStandardNormal:()=>zb,randomUniform:()=>q2,range:()=>ol,ready:()=>Kd,real:()=>rl,reciprocal:()=>Lb,registerBackend:()=>uo,registerGradient:()=>iT,registerKernel:()=>hn,registerOp:()=>HF,relu:()=>rp,relu6:()=>X2,removeBackend:()=>VC,reshape:()=>J,reverse:()=>Kr,reverse1d:()=>Bb,reverse2d:()=>Wb,reverse3d:()=>Vb,reverse4d:()=>Gb,rfft:()=>kh,round:()=>K2,rsqrt:()=>Ub,scalar:()=>Fe,scatterND:()=>h4,scatter_util:()=>m2,searchSorted:()=>xh,selu:()=>jb,separableConv2d:()=>Hb,serialization:()=>px,setBackend:()=>Xd,setPlatform:()=>UC,setThreadsCount:()=>Qne,setWasmPath:()=>Jne,setWasmPaths:()=>Gh,setWebGLContext:()=>Dh,setdiff1dAsync:()=>qb,shared:()=>o3,sigmoid:()=>Da,sign:()=>Xb,signal:()=>I4,sin:()=>Kb,sinh:()=>Zb,slice:()=>_e,slice1d:()=>Yb,slice2d:()=>Jb,slice3d:()=>sp,slice4d:()=>bh,slice_util:()=>At,softmax:()=>vh,softplus:()=>F2,spaceToBatchND:()=>V2,sparse:()=>C4,sparseToDense:()=>f4,spectral:()=>k4,split:()=>ka,sqrt:()=>Jn,square:()=>In,squaredDifference:()=>Y2,squeeze:()=>$e,stack:()=>sa,step:()=>J2,stridedSlice:()=>Qb,string:()=>N4,sub:()=>he,sum:()=>tt,sumOutType:()=>jd,tan:()=>e4,tanh:()=>Nc,tensor:()=>ze,tensor1d:()=>Ut,tensor2d:()=>Kn,tensor3d:()=>h2,tensor4d:()=>t4,tensor5d:()=>a4,tensor6d:()=>n4,tensor_util:()=>RA,test_util:()=>hx,tidy:()=>Ee,tile:()=>Vr,time:()=>WC,topk:()=>r4,train:()=>G_,transpose:()=>si,truncatedNormal:()=>s4,unique:()=>i4,unregisterGradient:()=>lT,unregisterKernel:()=>oT,unsortedSegmentSum:()=>o4,unstack:()=>Ta,upcastType:()=>ra,upperBound:()=>l4,util:()=>v,valueAndGrad:()=>xR,valueAndGrads:()=>bR,variable:()=>u4,variableGrads:()=>hb,version:()=>Ap,version_converter:()=>JP,version_core:()=>b2,version_cpu:()=>sD,version_wasm:()=>tre,version_webgl:()=>jU,webgl:()=>HU,webgl_util:()=>t6,webgpu_util:()=>Ov,where:()=>ii,whereAsync:()=>Q2,zeros:()=>pn,zerosLike:()=>Xa});var pS=Object.create,L1=Object.defineProperty,cS=Object.getOwnPropertyDescriptor,hS=Object.getOwnPropertyNames,fS=Object.getPrototypeOf,mS=Object.prototype.hasOwnProperty,pA=(e=>typeof Gs!="undefined"?Gs:typeof Proxy!="undefined"?new Proxy(e,{get:(t,a)=>(typeof Gs!="undefined"?Gs:t)[a]}):e)(function(e){if(typeof Gs!="undefined")return Gs.apply(this,arguments);throw new Error('Dynamic require of "'+e+'" is not supported')}),jt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),He=(e,t)=>{for(var a in t)L1(e,a,{get:t[a],enumerable:!0})},gS=(e,t,a,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of hS(t))!mS.call(e,r)&&r!==a&&L1(e,r,{get:()=>t[r],enumerable:!(n=cS(t,r))||n.enumerable});return e},hl=(e,t,a)=>(a=e!=null?pS(fS(e)):{},gS(t||!e||!e.__esModule?L1(a,"default",{value:e,enumerable:!0}):a,e)),yS=jt((e,t)=>{t.exports=n;var a=null;try{a=new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0,1,13,2,96,0,1,127,96,4,127,127,127,127,1,127,3,7,6,0,1,1,1,1,1,6,6,1,127,1,65,0,11,7,50,6,3,109,117,108,0,1,5,100,105,118,95,115,0,2,5,100,105,118,95,117,0,3,5,114,101,109,95,115,0,4,5,114,101,109,95,117,0,5,8,103,101,116,95,104,105,103,104,0,0,10,191,1,6,4,0,35,0,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,126,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,127,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,128,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,129,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,130,34,4,66,32,135,167,36,0,32,4,167,11])),{}).exports}catch(I){}function n(I,E,O){this.low=I|0,this.high=E|0,this.unsigned=!!O}n.prototype.__isLong__,Object.defineProperty(n.prototype,"__isLong__",{value:!0});function r(I){return(I&&I.__isLong__)===!0}n.isLong=r;var s={},i={};function o(I,E){var O,L,B;return E?(I>>>=0,(B=0<=I&&I<256)&&(L=i[I],L)?L:(O=u(I,(I|0)<0?-1:0,!0),B&&(i[I]=O),O)):(I|=0,(B=-128<=I&&I<128)&&(L=s[I],L)?L:(O=u(I,I<0?-1:0,!1),B&&(s[I]=O),O))}n.fromInt=o;function l(I,E){if(isNaN(I))return E?b:x;if(E){if(I<0)return b;if(I>=g)return _}else{if(I<=-y)return $;if(I+1>=y)return N}return I<0?l(-I,E).neg():u(I%m|0,I/m|0,E)}n.fromNumber=l;function u(I,E,O){return new n(I,E,O)}n.fromBits=u;var d=Math.pow;function c(I,E,O){if(I.length===0)throw Error("empty string");if(I==="NaN"||I==="Infinity"||I==="+Infinity"||I==="-Infinity")return x;if(typeof E=="number"?(O=E,E=!1):E=!!E,O=O||10,O<2||360)throw Error("interior hyphen");if(L===0)return c(I.substring(1),E,O).neg();for(var B=l(d(O,8)),G=x,j=0;j>>0:this.low},M.toNumber=function(){return this.unsigned?(this.high>>>0)*m+(this.low>>>0):this.high*m+(this.low>>>0)},M.toString=function(I){if(I=I||10,I<2||36>>0,W=H.toString(I);if(G=U,G.isZero())return W+j;for(;W.length<6;)W="0"+W;j=""+W+j}},M.getHighBits=function(){return this.high},M.getHighBitsUnsigned=function(){return this.high>>>0},M.getLowBits=function(){return this.low},M.getLowBitsUnsigned=function(){return this.low>>>0},M.getNumBitsAbs=function(){if(this.isNegative())return this.eq($)?64:this.neg().getNumBitsAbs();for(var I=this.high!=0?this.high:this.low,E=31;E>0&&(I&1<=0},M.isOdd=function(){return(this.low&1)===1},M.isEven=function(){return(this.low&1)===0},M.equals=function(I){return r(I)||(I=p(I)),this.unsigned!==I.unsigned&&this.high>>>31===1&&I.high>>>31===1?!1:this.high===I.high&&this.low===I.low},M.eq=M.equals,M.notEquals=function(I){return!this.eq(I)},M.neq=M.notEquals,M.ne=M.notEquals,M.lessThan=function(I){return this.comp(I)<0},M.lt=M.lessThan,M.lessThanOrEqual=function(I){return this.comp(I)<=0},M.lte=M.lessThanOrEqual,M.le=M.lessThanOrEqual,M.greaterThan=function(I){return this.comp(I)>0},M.gt=M.greaterThan,M.greaterThanOrEqual=function(I){return this.comp(I)>=0},M.gte=M.greaterThanOrEqual,M.ge=M.greaterThanOrEqual,M.compare=function(I){if(r(I)||(I=p(I)),this.eq(I))return 0;var E=this.isNegative(),O=I.isNegative();return E&&!O?-1:!E&&O?1:this.unsigned?I.high>>>0>this.high>>>0||I.high===this.high&&I.low>>>0>this.low>>>0?-1:1:this.sub(I).isNegative()?-1:1},M.comp=M.compare,M.negate=function(){return!this.unsigned&&this.eq($)?$:this.not().add(w)},M.neg=M.negate,M.add=function(I){r(I)||(I=p(I));var E=this.high>>>16,O=this.high&65535,L=this.low>>>16,B=this.low&65535,G=I.high>>>16,j=I.high&65535,U=I.low>>>16,H=I.low&65535,W=0,Q=0,Z=0,re=0;return re+=B+H,Z+=re>>>16,re&=65535,Z+=L+U,Q+=Z>>>16,Z&=65535,Q+=O+j,W+=Q>>>16,Q&=65535,W+=E+G,W&=65535,u(Z<<16|re,W<<16|Q,this.unsigned)},M.subtract=function(I){return r(I)||(I=p(I)),this.add(I.neg())},M.sub=M.subtract,M.multiply=function(I){if(this.isZero())return x;if(r(I)||(I=p(I)),a){var E=a.mul(this.low,this.high,I.low,I.high);return u(E,a.get_high(),this.unsigned)}if(I.isZero())return x;if(this.eq($))return I.isOdd()?$:x;if(I.eq($))return this.isOdd()?$:x;if(this.isNegative())return I.isNegative()?this.neg().mul(I.neg()):this.neg().mul(I).neg();if(I.isNegative())return this.mul(I.neg()).neg();if(this.lt(A)&&I.lt(A))return l(this.toNumber()*I.toNumber(),this.unsigned);var O=this.high>>>16,L=this.high&65535,B=this.low>>>16,G=this.low&65535,j=I.high>>>16,U=I.high&65535,H=I.low>>>16,W=I.low&65535,Q=0,Z=0,re=0,ee=0;return ee+=G*W,re+=ee>>>16,ee&=65535,re+=B*W,Z+=re>>>16,re&=65535,re+=G*H,Z+=re>>>16,re&=65535,Z+=L*W,Q+=Z>>>16,Z&=65535,Z+=B*H,Q+=Z>>>16,Z&=65535,Z+=G*U,Q+=Z>>>16,Z&=65535,Q+=O*W+L*H+B*U+G*j,Q&=65535,u(re<<16|ee,Q<<16|Z,this.unsigned)},M.mul=M.multiply,M.divide=function(I){if(r(I)||(I=p(I)),I.isZero())throw Error("division by zero");if(a){if(!this.unsigned&&this.high===-2147483648&&I.low===-1&&I.high===-1)return this;var E=(this.unsigned?a.div_u:a.div_s)(this.low,this.high,I.low,I.high);return u(E,a.get_high(),this.unsigned)}if(this.isZero())return this.unsigned?b:x;var O,L,B;if(this.unsigned){if(I.unsigned||(I=I.toUnsigned()),I.gt(this))return b;if(I.gt(this.shru(1)))return S;B=b}else{if(this.eq($)){if(I.eq(w)||I.eq(C))return $;if(I.eq($))return w;var G=this.shr(1);return O=G.div(I).shl(1),O.eq(x)?I.isNegative()?w:C:(L=this.sub(I.mul(O)),B=O.add(L.div(I)),B)}else if(I.eq($))return this.unsigned?b:x;if(this.isNegative())return I.isNegative()?this.neg().div(I.neg()):this.neg().div(I).neg();if(I.isNegative())return this.div(I.neg()).neg();B=x}for(L=this;L.gte(I);){O=Math.max(1,Math.floor(L.toNumber()/I.toNumber()));for(var j=Math.ceil(Math.log(O)/Math.LN2),U=j<=48?1:d(2,j-48),H=l(O),W=H.mul(I);W.isNegative()||W.gt(L);)O-=U,H=l(O,this.unsigned),W=H.mul(I);H.isZero()&&(H=w),B=B.add(H),L=L.sub(W)}return B},M.div=M.divide,M.modulo=function(I){if(r(I)||(I=p(I)),a){var E=(this.unsigned?a.rem_u:a.rem_s)(this.low,this.high,I.low,I.high);return u(E,a.get_high(),this.unsigned)}return this.sub(this.div(I).mul(I))},M.mod=M.modulo,M.rem=M.modulo,M.not=function(){return u(~this.low,~this.high,this.unsigned)},M.and=function(I){return r(I)||(I=p(I)),u(this.low&I.low,this.high&I.high,this.unsigned)},M.or=function(I){return r(I)||(I=p(I)),u(this.low|I.low,this.high|I.high,this.unsigned)},M.xor=function(I){return r(I)||(I=p(I)),u(this.low^I.low,this.high^I.high,this.unsigned)},M.shiftLeft=function(I){return r(I)&&(I=I.toInt()),(I&=63)===0?this:I<32?u(this.low<>>32-I,this.unsigned):u(0,this.low<>>I|this.high<<32-I,this.high>>I,this.unsigned):u(this.high>>I-32,this.high>=0?0:-1,this.unsigned)},M.shr=M.shiftRight,M.shiftRightUnsigned=function(I){if(r(I)&&(I=I.toInt()),I&=63,I===0)return this;var E=this.high;if(I<32){var O=this.low;return u(O>>>I|E<<32-I,E>>>I,this.unsigned)}else return I===32?u(E,0,this.unsigned):u(E>>>I-32,0,this.unsigned)},M.shru=M.shiftRightUnsigned,M.shr_u=M.shiftRightUnsigned,M.toSigned=function(){return this.unsigned?u(this.low,this.high,!1):this},M.toUnsigned=function(){return this.unsigned?this:u(this.low,this.high,!0)},M.toBytes=function(I){return I?this.toBytesLE():this.toBytesBE()},M.toBytesLE=function(){var I=this.high,E=this.low;return[E&255,E>>>8&255,E>>>16&255,E>>>24,I&255,I>>>8&255,I>>>16&255,I>>>24]},M.toBytesBE=function(){var I=this.high,E=this.low;return[I>>>24,I>>>16&255,I>>>8&255,I&255,E>>>24,E>>>16&255,E>>>8&255,E&255]},n.fromBytes=function(I,E,O){return O?n.fromBytesLE(I,E):n.fromBytesBE(I,E)},n.fromBytesLE=function(I,E){return new n(I[0]|I[1]<<8|I[2]<<16|I[3]<<24,I[4]|I[5]<<8|I[6]<<16|I[7]<<24,E)},n.fromBytesBE=function(I,E){return new n(I[4]<<24|I[5]<<16|I[6]<<8|I[7],I[0]<<24|I[1]<<16|I[2]<<8|I[3],E)}}),AS=jt(()=>{}),xS=jt(()=>{}),bS=jt((e,t)=>{(function(a,n,r){function s(u){var d=this,c=l();d.next=function(){var p=2091639*d.s0+d.c*23283064365386963e-26;return d.s0=d.s1,d.s1=d.s2,d.s2=p-(d.c=p|0)},d.c=1,d.s0=c(" "),d.s1=c(" "),d.s2=c(" "),d.s0-=c(u),d.s0<0&&(d.s0+=1),d.s1-=c(u),d.s1<0&&(d.s1+=1),d.s2-=c(u),d.s2<0&&(d.s2+=1),c=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 c=new s(u),p=d&&d.state,h=c.next;return h.int32=function(){return c.next()*4294967296|0},h.double=function(){return h()+(h()*2097152|0)*11102230246251565e-32},h.quick=h,p&&(typeof p=="object"&&i(p,c),h.state=function(){return i(c,{})}),h}function l(){var u=4022871197,d=function(c){c=String(c);for(var p=0;p>>0,h-=u,h*=u,u=h>>>0,h-=u,u+=h*4294967296}return(u>>>0)*23283064365386963e-26};return d}n&&n.exports?n.exports=o:r&&r.amd?r(function(){return o}):this.alea=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),vS=jt((e,t)=>{(function(a,n,r){function s(l){var u=this,d="";u.x=0,u.y=0,u.z=0,u.w=0,u.next=function(){var p=u.x^u.x<<11;return u.x=u.y,u.y=u.z,u.z=u.w,u.w^=u.w>>>19^p^p>>>8},l===(l|0)?u.x=l:d+=l;for(var c=0;c>>0)/4294967296};return p.double=function(){do var h=d.next()>>>11,f=(d.next()>>>0)/4294967296,m=(h+f)/(1<<21);while(m===0);return m},p.int32=d.next,p.quick=p,c&&(typeof c=="object"&&i(c,d),p.state=function(){return i(d,{})}),p}n&&n.exports?n.exports=o:r&&r.amd?r(function(){return o}):this.xor128=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),wS=jt((e,t)=>{(function(a,n,r){function s(l){var u=this,d="";u.next=function(){var p=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^(p^p<<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 c=0;c>>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),c=u&&u.state,p=function(){return(d.next()>>>0)/4294967296};return p.double=function(){do var h=d.next()>>>11,f=(d.next()>>>0)/4294967296,m=(h+f)/(1<<21);while(m===0);return m},p.int32=d.next,p.quick=p,c&&(typeof c=="object"&&i(c,d),p.state=function(){return i(d,{})}),p}n&&n.exports?n.exports=o:r&&r.amd?r(function(){return o}):this.xorwow=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),kS=jt((e,t)=>{(function(a,n,r){function s(l){var u=this;u.next=function(){var c=u.x,p=u.i,h,f,m;return h=c[p],h^=h>>>7,f=h^h<<24,h=c[p+1&7],f^=h^h>>>10,h=c[p+3&7],f^=h^h>>>3,h=c[p+4&7],f^=h^h<<7,h=c[p+7&7],h=h^h<<13,f^=h^h<<9,c[p]=f,u.i=p+1&7,f};function d(c,p){var h,f,m=[];if(p===(p|0))f=m[0]=p;else for(p=""+p,h=0;h0;--h)c.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),c=u&&u.state,p=function(){return(d.next()>>>0)/4294967296};return p.double=function(){do var h=d.next()>>>11,f=(d.next()>>>0)/4294967296,m=(h+f)/(1<<21);while(m===0);return m},p.int32=d.next,p.quick=p,c&&(c.x&&i(c,d),p.state=function(){return i(d,{})}),p}n&&n.exports?n.exports=o:r&&r.amd?r(function(){return o}):this.xorshift7=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),IS=jt((e,t)=>{(function(a,n,r){function s(l){var u=this;u.next=function(){var c=u.w,p=u.X,h=u.i,f,m;return u.w=c=c+1640531527|0,m=p[h+34&127],f=p[h=h+1&127],m^=m<<13,f^=f<<17,m^=m>>>15,f^=f>>>12,m=p[h]=m^f,u.i=h,m+(c^c>>>16)|0};function d(c,p){var h,f,m,g,y,A=[],x=128;for(p===(p|0)?(f=p,p=null):(p=p+"\0",f=0,x=Math.max(x,p.length)),m=0,g=-32;g>>15,f^=f<<4,f^=f>>>13,g>=0&&(y=y+1640531527|0,h=A[g&127]^=f+y,m=h==0?m+1:0);for(m>=128&&(A[(p&&p.length||0)&127]=-1),m=127,g=4*128;g>0;--g)f=A[m+34&127],h=A[m=m+1&127],f^=f<<13,h^=h<<17,f^=f>>>15,h^=h>>>12,A[m]=f^h;c.w=y,c.X=A,c.i=m}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),c=u&&u.state,p=function(){return(d.next()>>>0)/4294967296};return p.double=function(){do var h=d.next()>>>11,f=(d.next()>>>0)/4294967296,m=(h+f)/(1<<21);while(m===0);return m},p.int32=d.next,p.quick=p,c&&(c.X&&i(c,d),p.state=function(){return i(d,{})}),p}n&&n.exports?n.exports=o:r&&r.amd?r(function(){return o}):this.xor4096=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),SS=jt((e,t)=>{(function(a,n,r){function s(l){var u=this,d="";u.next=function(){var p=u.b,h=u.c,f=u.d,m=u.a;return p=p<<25^p>>>7^h,h=h-f|0,f=f<<24^f>>>8^m,m=m-p|0,u.b=p=p<<20^p>>>12^h,u.c=h=h-f|0,u.d=f<<16^h>>>16^m,u.a=m-p|0},u.a=0,u.b=0,u.c=-1640531527,u.d=1367130551,l===Math.floor(l)?(u.a=l/4294967296|0,u.b=l|0):d+=l;for(var c=0;c>>0)/4294967296};return p.double=function(){do var h=d.next()>>>11,f=(d.next()>>>0)/4294967296,m=(h+f)/(1<<21);while(m===0);return m},p.int32=d.next,p.quick=p,c&&(typeof c=="object"&&i(c,d),p.state=function(){return i(d,{})}),p}n&&n.exports?n.exports=o:r&&r.amd?r(function(){return o}):this.tychei=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),TS=jt(()=>{}),CS=jt((e,t)=>{(function(a,n,r){var s=256,i=6,o=52,l="random",u=r.pow(s,i),d=r.pow(2,o),c=d*2,p=s-1,h;function f(w,S,C){var N=[];S=S==!0?{entropy:!0}:S||{};var _=A(y(S.entropy?[w,b(n)]:w==null?x():w,3),N),$=new m(N),M=function(){for(var I=$.g(i),E=u,O=0;I=c;)I/=2,E/=2,O>>>=1;return(I+O)/E};return M.int32=function(){return $.g(4)|0},M.quick=function(){return $.g(4)/4294967296},M.double=M,A(b($.S),n),(S.pass||C||function(I,E,O,L){return L&&(L.S&&g(L,$),I.state=function(){return g($,{})}),O?(r[l]=I,E):I})(M,_,"global"in S?S.global:this==r,S.state)}function m(w){var S,C=w.length,N=this,_=0,$=N.i=N.j=0,M=N.S=[];for(C||(w=[C++]);_{var a=bS(),n=vS(),r=wS(),s=kS(),i=IS(),o=SS(),l=CS();l.alea=a,l.xor128=n,l.xorwow=r,l.xorshift7=s,l.xor4096=i,l.tychei=o,t.exports=l}),bc=jt(()=>{}),hA=jt(()=>{}),NS=jt(()=>{}),ES=jt(()=>{}),RS=jt(()=>{}),MS=jt((e,t)=>{var a=(()=>{var n=typeof document!="undefined"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename!="undefined"&&(n=n||__filename),function(r){r=r||{};function s(){return oe.buffer!=je&&ut(oe.buffer),ct}function i(){return oe.buffer!=je&&ut(oe.buffer),Va}function o(){return oe.buffer!=je&&ut(oe.buffer),Pt}function l(){return oe.buffer!=je&&ut(oe.buffer),ta}function u(){return oe.buffer!=je&&ut(oe.buffer),$a}function d(){return oe.buffer!=je&&ut(oe.buffer),rn}function c(){return oe.buffer!=je&&ut(oe.buffer),_a}var p=typeof r!="undefined"?r:{},h,f;p.ready=new Promise(function(P,q){h=P,f=q});var m;typeof process!="undefined"&&process.listeners&&(m={uncaughtException:process.listeners("uncaughtException"),unhandledRejection:process.listeners("unhandledRejection")});var g=Object.assign({},p),y=[],A="./this.program",x=(P,q)=>{throw q},b=typeof window=="object",w=typeof importScripts=="function",S=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string",C=p.ENVIRONMENT_IS_PTHREAD||!1,N="";function _(P){return p.locateFile?p.locateFile(P,N):N+P}var $,M,I,E;function O(P){P instanceof Ws||H("exiting due to exception: "+P)}if(S){w?N=bc().dirname(N)+"/":N=__dirname+"/";var L,B;typeof pA=="function"&&(L=hA(),B=bc()),$=(q,se)=>(q=B.normalize(q),L.readFileSync(q,se?void 0:"utf8")),I=q=>{var se=$(q,!0);return se.buffer||(se=new Uint8Array(se)),se},M=(q,se,ue)=>{q=B.normalize(q),L.readFile(q,function(Te,Je){Te?ue(Te):se(Je.buffer)})},process.argv.length>1&&(A=process.argv[1].replace(/\\/g,"/")),y=process.argv.slice(2),process.on("uncaughtException",function(q){if(!(q instanceof Ws))throw q}),process.on("unhandledRejection",function(q){throw q}),x=(q,se)=>{if(xn())throw process.exitCode=q,se;O(se),process.exit(q)},p.inspect=function(){return"[Emscripten Module object]"};let P;try{P=NS()}catch(q){throw console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?'),q}global.Worker=P.Worker}else(b||w)&&(w?N=self.location.href:typeof document!="undefined"&&document.currentScript&&(N=document.currentScript.src),typeof n!="undefined"&&n&&(N=n),N.indexOf("blob:")!==0?N=N.substr(0,N.replace(/[?#].*/,"").lastIndexOf("/")+1):N="",S||($=P=>{var q=new XMLHttpRequest;return q.open("GET",P,!1),q.send(null),q.responseText},w&&(I=P=>{var q=new XMLHttpRequest;return q.open("GET",P,!1),q.responseType="arraybuffer",q.send(null),new Uint8Array(q.response)}),M=(P,q,se)=>{var ue=new XMLHttpRequest;ue.open("GET",P,!0),ue.responseType="arraybuffer",ue.onload=()=>{if(ue.status==200||ue.status==0&&ue.response){q(ue.response);return}se()},ue.onerror=se,ue.send(null)}),E=P=>document.title=P);S&&typeof performance=="undefined"&&(global.performance=ES().performance);var G=console.log.bind(console),j=console.warn.bind(console);S&&(G=P=>L.writeSync(1,P+` +`),j=P=>L.writeSync(2,P+` +`));var U=p.print||G,H=p.printErr||j;Object.assign(p,g),g=null,p.arguments&&(y=p.arguments),p.thisProgram&&(A=p.thisProgram),p.quit&&(x=p.quit);var W=4,Q=Atomics.load,Z=Atomics.store,re=Atomics.compareExchange,ee;p.wasmBinary&&(ee=p.wasmBinary);var pe=p.noExitRuntime||!0;typeof WebAssembly!="object"&&Oo("no native wasm support detected");var oe,ye,we=!1,Ne;function Ge(P,q){P||Oo(q)}var Xe=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):void 0;function nt(P,q,se){for(var ue=q+se,Te=q;P[Te]&&!(Te>=ue);)++Te;if(Te-q>16&&P.buffer&&Xe)return Xe.decode(P.buffer instanceof SharedArrayBuffer?P.slice(q,Te):P.subarray(q,Te));for(var Je="";q>10,56320|on&1023)}}return Je}function lt(P,q){return P?nt(i(),P,q):""}function et(P,q,se,ue){if(!(ue>0))return 0;for(var Te=se,Je=se+ue-1,Pe=0;Pe=55296&&Le<=57343){var Dt=P.charCodeAt(++Pe);Le=65536+((Le&1023)<<10)|Dt&1023}if(Le<=127){if(se>=Je)break;q[se++]=Le}else if(Le<=2047){if(se+1>=Je)break;q[se++]=192|Le>>6,q[se++]=128|Le&63}else if(Le<=65535){if(se+2>=Je)break;q[se++]=224|Le>>12,q[se++]=128|Le>>6&63,q[se++]=128|Le&63}else{if(se+3>=Je)break;q[se++]=240|Le>>18,q[se++]=128|Le>>12&63,q[se++]=128|Le>>6&63,q[se++]=128|Le&63}}return q[se]=0,se-Te}function rt(P,q,se){return et(P,i(),q,se)}var je,ct,Va,Pt,nn,ta,$a,rn,_a;C&&(je=p.buffer);function ut(P){je=P,p.HEAP8=ct=new Int8Array(P),p.HEAP16=Pt=new Int16Array(P),p.HEAP32=ta=new Int32Array(P),p.HEAPU8=Va=new Uint8Array(P),p.HEAPU16=nn=new Uint16Array(P),p.HEAPU32=$a=new Uint32Array(P),p.HEAPF32=rn=new Float32Array(P),p.HEAPF64=_a=new Float64Array(P)}var Fa=p.INITIAL_MEMORY||16777216;if(C)oe=p.wasmMemory,je=p.buffer;else if(p.wasmMemory)oe=p.wasmMemory;else if(oe=new WebAssembly.Memory({initial:Fa/65536,maximum:32768,shared:!0}),!(oe.buffer instanceof SharedArrayBuffer))throw H("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"),S&&console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)"),Error("bad memory");oe&&(je=oe.buffer),Fa=je.byteLength,ut(je);var Ga,ur=[],_o=[],Vn=[],ku=!1;function xn(){return pe}function Fo(){if(p.preRun)for(typeof p.preRun=="function"&&(p.preRun=[p.preRun]);p.preRun.length;)U0(p.preRun.shift());Cu(ur)}function qt(){ku=!0,!C&&Cu(_o)}function Mp(){if(!C){if(p.postRun)for(typeof p.postRun=="function"&&(p.postRun=[p.postRun]);p.postRun.length;)T5(p.postRun.shift());Cu(Vn)}}function U0(P){ur.unshift(P)}function j0(P){_o.unshift(P)}function T5(P){Vn.unshift(P)}var _r=0,Po=null,dr=null;function C5(P){_r++,p.monitorRunDependencies&&p.monitorRunDependencies(_r)}function N5(P){if(_r--,p.monitorRunDependencies&&p.monitorRunDependencies(_r),_r==0&&(Po!==null&&(clearInterval(Po),Po=null),dr)){var q=dr;dr=null,q()}}function Oo(P){C?postMessage({cmd:"onAbort",arg:P}):p.onAbort&&p.onAbort(P),P="Aborted("+P+")",H(P),we=!0,Ne=1,P+=". Build with -sASSERTIONS for more info.";var q=new WebAssembly.RuntimeError(P);throw f(q),q}var H0="data:application/octet-stream;base64,";function $p(P){return P.startsWith(H0)}function Iu(P){return P.startsWith("file://")}var ya;ya="tfjs-backend-wasm-threaded-simd.wasm",$p(ya)||(ya=_(ya));function _p(P){try{if(P==ya&&ee)return new Uint8Array(ee);if(I)return I(P);throw"both async and sync fetching of the wasm failed"}catch(q){Oo(q)}}function q0(){if(!ee&&(b||w)){if(typeof fetch=="function"&&!Iu(ya))return fetch(ya,{credentials:"same-origin"}).then(function(P){if(!P.ok)throw"failed to load wasm binary file at '"+ya+"'";return P.arrayBuffer()}).catch(function(){return _p(ya)});if(M)return new Promise(function(P,q){M(ya,function(se){P(new Uint8Array(se))},q)})}return Promise.resolve().then(function(){return _p(ya)})}function X0(){var P={env:jp,wasi_snapshot_preview1:jp};function q(Pe,Le){var Dt=Pe.exports;if(p.asm=Dt,rf(p.asm._emscripten_tls_init),Ga=p.asm.__indirect_function_table,j0(p.asm.__wasm_call_ctors),ye=Le,!C){var on=De.unusedWorkers.length;De.unusedWorkers.forEach(function(cr){De.loadWasmModuleToWorker(cr,function(){--on||N5("wasm-instantiate")})})}}C||C5("wasm-instantiate");function se(Pe){q(Pe.instance,Pe.module)}function ue(Pe){return q0().then(function(Le){return WebAssembly.instantiate(Le,P)}).then(function(Le){return Le}).then(Pe,function(Le){H("failed to asynchronously prepare wasm: "+Le),Oo(Le)})}function Te(){return!ee&&typeof WebAssembly.instantiateStreaming=="function"&&!$p(ya)&&!Iu(ya)&&!S&&typeof fetch=="function"?fetch(ya,{credentials:"same-origin"}).then(function(Pe){var Le=WebAssembly.instantiateStreaming(Pe,P);return Le.then(se,function(Dt){return H("wasm streaming compile failed: "+Dt),H("falling back to ArrayBuffer instantiation"),ue(se)})}):ue(se)}if(p.instantiateWasm)try{var Je=p.instantiateWasm(P,q);return Je}catch(Pe){H("Module.instantiateWasm callback failed with error: "+Pe),f(Pe)}return Te().catch(f),{}}var K0,E5,Z0={};function Ws(P){this.name="ExitStatus",this.message="Program terminated with exit("+P+")",this.status=P}function Y0(P){var q=De.pthreads[P];delete De.pthreads[P],q.terminate(),Cm(P),De.runningWorkers.splice(De.runningWorkers.indexOf(q),1),q.pthread_ptr=0}function J0(P){var q=De.pthreads[P];q.postMessage({cmd:"cancel"})}function Su(P){var q=De.pthreads[P];Ge(q),De.returnWorkerToPool(q)}function Fp(P){var q=De.getNewWorker();if(!q)return 6;De.runningWorkers.push(q),De.pthreads[P.pthread_ptr]=q,q.pthread_ptr=P.pthread_ptr;var se={cmd:"run",start_routine:P.startRoutine,arg:P.arg,pthread_ptr:P.pthread_ptr};return q.runPthread=()=>{se.time=performance.now(),q.postMessage(se,P.transferList)},q.loaded&&(q.runPthread(),delete q.runPthread),0}var Pp={varargs:void 0,get:function(){Pp.varargs+=4;var P=l()[Pp.varargs-4>>2];return P},getStr:function(P){var q=lt(P);return q}};function Tu(P){if(C)return Fr(1,1,P);Ne=P,xn()||(De.terminateAllThreads(),p.onExit&&p.onExit(P),we=!0),x(P,new Ws(P))}function R5(P,q){if(Ne=P,!q&&C)throw Dp(P),"unwind";Tu(P)}var Op=R5;function Q0(P){if(P instanceof Ws||P=="unwind")return Ne;x(1,P)}var De={unusedWorkers:[],runningWorkers:[],tlsInitFunctions:[],pthreads:{},init:function(){C?De.initWorker():De.initMainThread()},initMainThread:function(){for(var P=8;P--;)De.allocateUnusedWorker()},initWorker:function(){pe=!1},setExitStatus:function(P){Ne=P},terminateAllThreads:function(){for(var P of Object.values(De.pthreads))De.returnWorkerToPool(P);for(var P of De.unusedWorkers)P.terminate();De.unusedWorkers=[]},returnWorkerToPool:function(P){var q=P.pthread_ptr;delete De.pthreads[q],De.unusedWorkers.push(P),De.runningWorkers.splice(De.runningWorkers.indexOf(P),1),P.pthread_ptr=0,Cm(q)},receiveObjectTransfer:function(P){},threadInitTLS:function(){De.tlsInitFunctions.forEach(P=>P())},loadWasmModuleToWorker:function(P,q){P.onmessage=se=>{var ue=se.data,Te=ue.cmd;if(P.pthread_ptr&&(De.currentProxiedOperationCallerThread=P.pthread_ptr),ue.targetThread&&ue.targetThread!=Yp()){var Je=De.pthreads[ue.targetThread];Je?Je.postMessage(ue,ue.transferList):H('Internal error! Worker sent a message "'+Te+'" to target pthread '+ue.targetThread+", but that thread no longer exists!"),De.currentProxiedOperationCallerThread=void 0;return}Te==="processProxyingQueue"?Nu(ue.queue):Te==="spawnThread"?Fp(ue):Te==="cleanupThread"?Su(ue.thread):Te==="killThread"?Y0(ue.thread):Te==="cancelThread"?J0(ue.thread):Te==="loaded"?(P.loaded=!0,q&&q(P),P.runPthread&&(P.runPthread(),delete P.runPthread)):Te==="print"?U("Thread "+ue.threadId+": "+ue.text):Te==="printErr"?H("Thread "+ue.threadId+": "+ue.text):Te==="alert"?alert("Thread "+ue.threadId+": "+ue.text):ue.target==="setimmediate"?P.postMessage(ue):Te==="onAbort"?p.onAbort&&p.onAbort(ue.arg):Te&&H("worker sent an unknown command "+Te),De.currentProxiedOperationCallerThread=void 0},P.onerror=se=>{var ue="worker sent an error!";throw H(ue+" "+se.filename+":"+se.lineno+": "+se.message),se},S&&(P.on("message",function(se){P.onmessage({data:se})}),P.on("error",function(se){P.onerror(se)}),P.on("detachedExit",function(){})),P.postMessage({cmd:"load",urlOrBlob:p.mainScriptUrlOrBlob||n,wasmMemory:oe,wasmModule:ye})},allocateUnusedWorker:function(){var P=_("tfjs-backend-wasm-threaded-simd.worker.js");De.unusedWorkers.push(new Worker(P))},getNewWorker:function(){return De.unusedWorkers.length==0&&(De.allocateUnusedWorker(),De.loadWasmModuleToWorker(De.unusedWorkers[0])),De.unusedWorkers.pop()}};p.PThread=De;function Cu(P){for(;P.length>0;)P.shift()(p)}function ef(P){var q=Nm(),se=P();return Jp(q),se}function M5(P){return P}function $5(P){var q=/\b_Z[\w\d_]+/g;return P.replace(q,function(se){var ue=se;return se===ue?se:ue+" ["+se+"]"})}function tf(){var P=Yp(),q=l()[P+44>>2],se=l()[P+48>>2],ue=q-se;L5(q,ue),Jp(q)}p.establishStackSpace=tf;function Dp(P){if(C)return Fr(2,0,P);try{Op(P)}catch(q){Q0(q)}}var Do=[];function af(P){var q=Do[P];return q||(P>=Do.length&&(Do.length=P+1),Do[P]=q=Ga.get(P)),q}function nf(P,q){var se=af(P)(q);xn()?De.setExitStatus(se):z5(se)}p.invokeEntryPoint=nf;function _5(){var P=new Error;if(!P.stack){try{throw new Error}catch(q){P=q}if(!P.stack)return"(no stack trace available)"}return P.stack.toString()}function rf(P){De.tlsInitFunctions.push(P)}function sf(P,q){s().set(P,q)}function of(P){P5(P,!w,1,!b),De.threadInitTLS()}function lf(P){C?postMessage({cmd:"cleanupThread",thread:P}):Su(P)}function zp(P,q,se,ue){return C?Fr(3,1,P,q,se,ue):Lp(P,q,se,ue)}function Lp(P,q,se,ue){if(typeof SharedArrayBuffer=="undefined")return H("Current environment does not support SharedArrayBuffer, pthreads are not available!"),6;var Te=[],Je=0;if(C&&(Te.length===0||Je))return zp(P,q,se,ue);if(Je)return Je;var Pe={startRoutine:se,pthread_ptr:P,arg:ue,transferList:Te};return C?(Pe.cmd="spawnThread",postMessage(Pe,Te),0):Fp(Pe)}function uf(){return 2097152}var df=!0;function pf(){return df}function Nu(P){Atomics.store(l(),P>>2,1),Yp()&&D5(P),Atomics.compareExchange(l(),P>>2,1,0)}p.executeNotifiedProxyingQueue=Nu;function cf(P,q,se,ue){if(P==q)setTimeout(()=>Nu(ue));else if(C)postMessage({targetThread:P,cmd:"processProxyingQueue",queue:ue});else{var Te=De.pthreads[P];if(!Te)return;Te.postMessage({cmd:"processProxyingQueue",queue:ue})}return 1}function hf(P,q,se){return-1}function ff(){Oo("")}function Vs(P){Vs.shown||(Vs.shown={}),Vs.shown[P]||(Vs.shown[P]=1,S&&(P="warning: "+P),H(P))}function mf(){S||w||Vs("Blocking on the main thread is very dangerous, see https://emscripten.org/docs/porting/pthreads.html#blocking-on-the-main-browser-thread")}function gf(){return Date.now()}function Bp(){return 2147483648}function yf(){return Bp()}var zo;S?zo=()=>{var P=process.hrtime();return P[0]*1e3+P[1]/1e6}:C?zo=()=>performance.now()-p.__performance_now_clock_drift:zo=()=>performance.now();function Af(P,q,se){i().copyWithin(P,q,q+se)}function xf(){return S?RS().cpus().length:navigator.hardwareConcurrency}function Fr(P,q){var se=arguments.length-2,ue=arguments;return ef(()=>{for(var Te=se,Je=Qp(Te*8),Pe=Je>>3,Le=0;Le>3,Te=0;Te>>16),ut(oe.buffer),1}catch(q){}}function wf(P){var q=i().length;if(P=P>>>0,P<=q)return!1;var se=Bp();if(P>se)return!1;let ue=(Dt,on)=>Dt+(on-Dt%on)%on;for(var Te=1;Te<=4;Te*=2){var Je=q*(1+.2/Te);Je=Math.min(Je,P+100663296);var Pe=Math.min(se,ue(Math.max(P,Je),65536)),Le=vf(Pe);if(Le)return!0}return!1}function kf(){throw"unwind"}function Wp(P){return C?Fr(4,1,P):52}function Vp(P,q,se,ue,Te){return C?Fr(5,1,P,q,se,ue,Te):70}var If=[null,[],[]];function Sf(P,q){var se=If[P];q===0||q===10?((P===1?U:H)(nt(se,0)),se.length=0):se.push(q)}function Gp(P,q,se,ue){if(C)return Fr(6,1,P,q,se,ue);for(var Te=0,Je=0;Je>2],Le=u()[q+4>>2];q+=8;for(var Dt=0;Dt>2]=Te,0}function Up(P){var q=p["_"+P];return q}function Tf(P,q,se,ue,Te){var Je={string:ln=>{var Vo=0;if(ln!=null&&ln!==0){var V5=(ln.length<<2)+1;Vo=Qp(V5),rt(ln,Vo,V5)}return Vo},array:ln=>{var Vo=Qp(ln.length);return sf(ln,Vo),Vo}};function Pe(ln){return q==="string"?lt(ln):q==="boolean"?Boolean(ln):ln}var Le=Up(P),Dt=[],on=0;if(ue)for(var cr=0;crPe==="number"||Pe==="boolean"),Je=q!=="string";return Je&&Te&&!ue?Up(P):function(){return Tf(P,q,se,arguments,ue)}}De.init();var Nf=[null,Tu,Dp,zp,Wp,Vp,Gp],jp={__emscripten_init_main_thread_js:of,__emscripten_thread_cleanup:lf,__pthread_create_js:Lp,_emscripten_default_pthread_stack_size:uf,_emscripten_get_now_is_monotonic:pf,_emscripten_notify_task_queue:cf,_emscripten_set_offscreencanvas_size:hf,abort:ff,emscripten_check_blocking_allowed:mf,emscripten_date_now:gf,emscripten_get_heap_max:yf,emscripten_get_now:zo,emscripten_memcpy_big:Af,emscripten_num_logical_cores:xf,emscripten_receive_on_main_thread_js:bf,emscripten_resize_heap:wf,emscripten_unwind_to_js_event_loop:kf,exit:Op,fd_close:Wp,fd_seek:Vp,fd_write:Gp,memory:oe||p.wasmMemory},F5=X0(),Ef=p.___wasm_call_ctors=function(){return(Ef=p.___wasm_call_ctors=p.asm.__wasm_call_ctors).apply(null,arguments)},Rf=p._init=function(){return(Rf=p._init=p.asm.init).apply(null,arguments)},Mf=p._init_with_threads_count=function(){return(Mf=p._init_with_threads_count=p.asm.init_with_threads_count).apply(null,arguments)},$f=p._get_threads_count=function(){return($f=p._get_threads_count=p.asm.get_threads_count).apply(null,arguments)},_f=p._register_tensor=function(){return(_f=p._register_tensor=p.asm.register_tensor).apply(null,arguments)},Ff=p._dispose_data=function(){return(Ff=p._dispose_data=p.asm.dispose_data).apply(null,arguments)},Pf=p._dispose=function(){return(Pf=p._dispose=p.asm.dispose).apply(null,arguments)},Of=p._Abs=function(){return(Of=p._Abs=p.asm.Abs).apply(null,arguments)},Df=p._Add=function(){return(Df=p._Add=p.asm.Add).apply(null,arguments)},zf=p._AddN=function(){return(zf=p._AddN=p.asm.AddN).apply(null,arguments)},Lf=p._All=function(){return(Lf=p._All=p.asm.All).apply(null,arguments)},Bf=p._Any=function(){return(Bf=p._Any=p.asm.Any).apply(null,arguments)},Wf=p._ArgMax=function(){return(Wf=p._ArgMax=p.asm.ArgMax).apply(null,arguments)},Vf=p._AvgPool=function(){return(Vf=p._AvgPool=p.asm.AvgPool).apply(null,arguments)},Gf=p._BatchMatMul=function(){return(Gf=p._BatchMatMul=p.asm.BatchMatMul).apply(null,arguments)},Uf=p._Ceil=function(){return(Uf=p._Ceil=p.asm.Ceil).apply(null,arguments)},jf=p._ClipByValue=function(){return(jf=p._ClipByValue=p.asm.ClipByValue).apply(null,arguments)},Hf=p._Conv2D=function(){return(Hf=p._Conv2D=p.asm.Conv2D).apply(null,arguments)},qf=p._Conv2DBackpropInput=function(){return(qf=p._Conv2DBackpropInput=p.asm.Conv2DBackpropInput).apply(null,arguments)},Xf=p._Cos=function(){return(Xf=p._Cos=p.asm.Cos).apply(null,arguments)},Kf=p._Cosh=function(){return(Kf=p._Cosh=p.asm.Cosh).apply(null,arguments)},Zf=p._CropAndResize=function(){return(Zf=p._CropAndResize=p.asm.CropAndResize).apply(null,arguments)},Yf=p._Cumprod=function(){return(Yf=p._Cumprod=p.asm.Cumprod).apply(null,arguments)},Jf=p._Cumsum=function(){return(Jf=p._Cumsum=p.asm.Cumsum).apply(null,arguments)},Qf=p._DepthToSpace=function(){return(Qf=p._DepthToSpace=p.asm.DepthToSpace).apply(null,arguments)},em=p._DepthwiseConv2dNative=function(){return(em=p._DepthwiseConv2dNative=p.asm.DepthwiseConv2dNative).apply(null,arguments)},tm=p._Elu=function(){return(tm=p._Elu=p.asm.Elu).apply(null,arguments)},am=p._Equal=function(){return(am=p._Equal=p.asm.Equal).apply(null,arguments)},nm=p._Exp=function(){return(nm=p._Exp=p.asm.Exp).apply(null,arguments)},rm=p._FlipLeftRight=function(){return(rm=p._FlipLeftRight=p.asm.FlipLeftRight).apply(null,arguments)},sm=p._Floor=function(){return(sm=p._Floor=p.asm.Floor).apply(null,arguments)},im=p._FloorDiv=function(){return(im=p._FloorDiv=p.asm.FloorDiv).apply(null,arguments)},om=p._FusedBatchNorm=function(){return(om=p._FusedBatchNorm=p.asm.FusedBatchNorm).apply(null,arguments)},lm=p._FusedConv2D=function(){return(lm=p._FusedConv2D=p.asm.FusedConv2D).apply(null,arguments)},um=p._FusedDepthwiseConv2D=function(){return(um=p._FusedDepthwiseConv2D=p.asm.FusedDepthwiseConv2D).apply(null,arguments)},dm=p._Gather=function(){return(dm=p._Gather=p.asm.Gather).apply(null,arguments)},pm=p._GatherNd=function(){return(pm=p._GatherNd=p.asm.GatherNd).apply(null,arguments)},cm=p._Greater=function(){return(cm=p._Greater=p.asm.Greater).apply(null,arguments)},hm=p._GreaterEqual=function(){return(hm=p._GreaterEqual=p.asm.GreaterEqual).apply(null,arguments)},fm=p._LeakyRelu=function(){return(fm=p._LeakyRelu=p.asm.LeakyRelu).apply(null,arguments)},mm=p._Less=function(){return(mm=p._Less=p.asm.Less).apply(null,arguments)},gm=p._LessEqual=function(){return(gm=p._LessEqual=p.asm.LessEqual).apply(null,arguments)},ym=p._Log=function(){return(ym=p._Log=p.asm.Log).apply(null,arguments)},Am=p._LogicalAnd=function(){return(Am=p._LogicalAnd=p.asm.LogicalAnd).apply(null,arguments)},xm=p._LogicalNot=function(){return(xm=p._LogicalNot=p.asm.LogicalNot).apply(null,arguments)},bm=p._LogicalOr=function(){return(bm=p._LogicalOr=p.asm.LogicalOr).apply(null,arguments)},vm=p._LogicalXor=function(){return(vm=p._LogicalXor=p.asm.LogicalXor).apply(null,arguments)},wm=p._Max=function(){return(wm=p._Max=p.asm.Max).apply(null,arguments)},Hp=p._MaxPool=function(){return(Hp=p._MaxPool=p.asm.MaxPool).apply(null,arguments)},qp=p._Maximum=function(){return(qp=p._Maximum=p.asm.Maximum).apply(null,arguments)},Ru=p._Mean=function(){return(Ru=p._Mean=p.asm.Mean).apply(null,arguments)},km=p._Min=function(){return(km=p._Min=p.asm.Min).apply(null,arguments)},Im=p._Minimum=function(){return(Im=p._Minimum=p.asm.Minimum).apply(null,arguments)},Lo=p._MirrorPad=function(){return(Lo=p._MirrorPad=p.asm.MirrorPad).apply(null,arguments)},Xp=p._Multiply=function(){return(Xp=p._Multiply=p.asm.Multiply).apply(null,arguments)},Bo=p._Neg=function(){return(Bo=p._Neg=p.asm.Neg).apply(null,arguments)},Wo=p._NonMaxSuppressionV3=function(){return(Wo=p._NonMaxSuppressionV3=p.asm.NonMaxSuppressionV3).apply(null,arguments)},Sm=p._NonMaxSuppressionV4=function(){return(Sm=p._NonMaxSuppressionV4=p.asm.NonMaxSuppressionV4).apply(null,arguments)},X=p._NonMaxSuppressionV5=function(){return(X=p._NonMaxSuppressionV5=p.asm.NonMaxSuppressionV5).apply(null,arguments)},ie=p._NotEqual=function(){return(ie=p._NotEqual=p.asm.NotEqual).apply(null,arguments)},ke=p._OneHot=function(){return(ke=p._OneHot=p.asm.OneHot).apply(null,arguments)},Ze=p._PadV2=function(){return(Ze=p._PadV2=p.asm.PadV2).apply(null,arguments)},xt=p._Pow=function(){return(xt=p._Pow=p.asm.Pow).apply(null,arguments)},bt=p._Prelu=function(){return(bt=p._Prelu=p.asm.Prelu).apply(null,arguments)},Ke=p._Prod=function(){return(Ke=p._Prod=p.asm.Prod).apply(null,arguments)},qe=p._RealDiv=function(){return(qe=p._RealDiv=p.asm.RealDiv).apply(null,arguments)},Ot=p._Relu=function(){return(Ot=p._Relu=p.asm.Relu).apply(null,arguments)},sn=p._Relu6=function(){return(sn=p._Relu6=p.asm.Relu6).apply(null,arguments)},pr=p._ResizeBilinear=function(){return(pr=p._ResizeBilinear=p.asm.ResizeBilinear).apply(null,arguments)},Kp=p._ResizeNearestNeighbor=function(){return(Kp=p._ResizeNearestNeighbor=p.asm.ResizeNearestNeighbor).apply(null,arguments)},Mu=p._Reverse=function(){return(Mu=p._Reverse=p.asm.Reverse).apply(null,arguments)},Tm=p._RotateWithOffset=function(){return(Tm=p._RotateWithOffset=p.asm.RotateWithOffset).apply(null,arguments)},Pa=p._Round=function(){return(Pa=p._Round=p.asm.Round).apply(null,arguments)},Pr=p._Rsqrt=function(){return(Pr=p._Rsqrt=p.asm.Rsqrt).apply(null,arguments)},Zp=p._ScatterNd=function(){return(Zp=p._ScatterNd=p.asm.ScatterNd).apply(null,arguments)},TI=p._SelectV2=function(){return(TI=p._SelectV2=p.asm.SelectV2).apply(null,arguments)},CI=p._Sigmoid=function(){return(CI=p._Sigmoid=p.asm.Sigmoid).apply(null,arguments)},NI=p._Sin=function(){return(NI=p._Sin=p.asm.Sin).apply(null,arguments)},EI=p._Softmax=function(){return(EI=p._Softmax=p.asm.Softmax).apply(null,arguments)},RI=p._SparseFillEmptyRows=function(){return(RI=p._SparseFillEmptyRows=p.asm.SparseFillEmptyRows).apply(null,arguments)},MI=p._SparseReshape=function(){return(MI=p._SparseReshape=p.asm.SparseReshape).apply(null,arguments)},$I=p._SparseSegmentReduction=function(){return($I=p._SparseSegmentReduction=p.asm.SparseSegmentReduction).apply(null,arguments)},_I=p._Sqrt=function(){return(_I=p._Sqrt=p.asm.Sqrt).apply(null,arguments)},FI=p._Square=function(){return(FI=p._Square=p.asm.Square).apply(null,arguments)},PI=p._SquaredDifference=function(){return(PI=p._SquaredDifference=p.asm.SquaredDifference).apply(null,arguments)},OI=p._Step=function(){return(OI=p._Step=p.asm.Step).apply(null,arguments)},DI=p._StridedSlice=function(){return(DI=p._StridedSlice=p.asm.StridedSlice).apply(null,arguments)},zI=p._Sub=function(){return(zI=p._Sub=p.asm.Sub).apply(null,arguments)},LI=p._Sum=function(){return(LI=p._Sum=p.asm.Sum).apply(null,arguments)},BI=p._Tan=function(){return(BI=p._Tan=p.asm.Tan).apply(null,arguments)},WI=p._Tanh=function(){return(WI=p._Tanh=p.asm.Tanh).apply(null,arguments)},VI=p._Tile=function(){return(VI=p._Tile=p.asm.Tile).apply(null,arguments)},GI=p._TopK=function(){return(GI=p._TopK=p.asm.TopK).apply(null,arguments)},UI=p._Transform=function(){return(UI=p._Transform=p.asm.Transform).apply(null,arguments)},jI=p._Transpose=function(){return(jI=p._Transpose=p.asm.Transpose).apply(null,arguments)},HI=p.__FusedMatMul=function(){return(HI=p.__FusedMatMul=p.asm._FusedMatMul).apply(null,arguments)},qI=p._malloc=function(){return(qI=p._malloc=p.asm.malloc).apply(null,arguments)},XI=p._free=function(){return(XI=p._free=p.asm.free).apply(null,arguments)},KI=p.__emscripten_tls_init=function(){return(KI=p.__emscripten_tls_init=p.asm._emscripten_tls_init).apply(null,arguments)},Yp=p._pthread_self=function(){return(Yp=p._pthread_self=p.asm.pthread_self).apply(null,arguments)},ZI=p.___errno_location=function(){return(ZI=p.___errno_location=p.asm.__errno_location).apply(null,arguments)},P5=p.__emscripten_thread_init=function(){return(P5=p.__emscripten_thread_init=p.asm._emscripten_thread_init).apply(null,arguments)},YI=p.__emscripten_thread_crashed=function(){return(YI=p.__emscripten_thread_crashed=p.asm._emscripten_thread_crashed).apply(null,arguments)},JI=p._emscripten_main_thread_process_queued_calls=function(){return(JI=p._emscripten_main_thread_process_queued_calls=p.asm.emscripten_main_thread_process_queued_calls).apply(null,arguments)},QI=p._emscripten_main_browser_thread_id=function(){return(QI=p._emscripten_main_browser_thread_id=p.asm.emscripten_main_browser_thread_id).apply(null,arguments)},O5=p._emscripten_run_in_main_runtime_thread_js=function(){return(O5=p._emscripten_run_in_main_runtime_thread_js=p.asm.emscripten_run_in_main_runtime_thread_js).apply(null,arguments)},eS=p._emscripten_dispatch_to_thread_=function(){return(eS=p._emscripten_dispatch_to_thread_=p.asm.emscripten_dispatch_to_thread_).apply(null,arguments)},D5=p.__emscripten_proxy_execute_task_queue=function(){return(D5=p.__emscripten_proxy_execute_task_queue=p.asm._emscripten_proxy_execute_task_queue).apply(null,arguments)},Cm=p.__emscripten_thread_free_data=function(){return(Cm=p.__emscripten_thread_free_data=p.asm._emscripten_thread_free_data).apply(null,arguments)},z5=p.__emscripten_thread_exit=function(){return(z5=p.__emscripten_thread_exit=p.asm._emscripten_thread_exit).apply(null,arguments)},L5=p._emscripten_stack_set_limits=function(){return(L5=p._emscripten_stack_set_limits=p.asm.emscripten_stack_set_limits).apply(null,arguments)},Nm=p.stackSave=function(){return(Nm=p.stackSave=p.asm.stackSave).apply(null,arguments)},Jp=p.stackRestore=function(){return(Jp=p.stackRestore=p.asm.stackRestore).apply(null,arguments)},Qp=p.stackAlloc=function(){return(Qp=p.stackAlloc=p.asm.stackAlloc).apply(null,arguments)},tS=p.dynCall_iijjiiii=function(){return(tS=p.dynCall_iijjiiii=p.asm.dynCall_iijjiiii).apply(null,arguments)},aS=p.dynCall_jiji=function(){return(aS=p.dynCall_jiji=p.asm.dynCall_jiji).apply(null,arguments)};p.keepRuntimeAlive=xn,p.wasmMemory=oe,p.cwrap=Cf,p.ExitStatus=Ws,p.PThread=De;var ec;dr=function P(){ec||B5(),ec||(dr=P)};function B5(P){if(P=P||y,_r>0)return;if(C){h(p),qt(),postMessage({cmd:"loaded"});return}if(Fo(),_r>0)return;function q(){ec||(ec=!0,p.calledRun=!0,!we&&(qt(),h(p),p.onRuntimeInitialized&&p.onRuntimeInitialized(),Mp()))}p.setStatus?(p.setStatus("Running..."),setTimeout(function(){setTimeout(function(){p.setStatus("")},1),q()},1)):q()}if(p.preInit)for(typeof p.preInit=="function"&&(p.preInit=[p.preInit]);p.preInit.length>0;)p.preInit.pop()();B5();var tc;m&&(tc={uncaughtException:process.listeners("uncaughtException").filter(function(P){return!m.uncaughtException.indexOf(P)>-1}),unhandledRejection:process.listeners("unhandledRejection").filter(function(P){return!m.unhandledRejection.indexOf(P)>-1})});var ac;if(typeof WasmBackendModule!="undefined")ac=WasmBackendModule;else if(typeof r!="undefined")ac=r;else throw new Error("Could not find wasm module in post.js");if(tc){var nS=ac._dispose;ac._dispose=function(){nS(),tc.uncaughtException.forEach(function(P){process.removeListener("uncaughtException",P)}),tc.unhandledRejection.forEach(function(P){process.removeListener("unhandledRejection",P)})}}return r.ready}})();typeof e=="object"&&typeof t=="object"?t.exports=a:typeof define=="function"&&define.amd?define([],function(){return a}):typeof e=="object"&&(e.WasmBackendModuleThreadedSimd=a)}),$S=jt((e,t)=>{t.exports.wasmWorkerContents=`"use strict";var Module={};var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";if(ENVIRONMENT_IS_NODE){var nodeWorkerThreads=require("worker_threads");var parentPort=nodeWorkerThreads.parentPort;parentPort.on("message",data=>onmessage({data:data}));var fs=require("fs");Object.assign(global,{self:global,require:require,Module:Module,location:{href:__filename},Worker:nodeWorkerThreads.Worker,importScripts:function(f){(0,eval)(fs.readFileSync(f,"utf8"))},postMessage:function(msg){parentPort.postMessage(msg)},performance:global.performance||{now:function(){return Date.now()}}})}var initializedJS=false;var pendingNotifiedProxyingQueues=[];function threadPrintErr(){var text=Array.prototype.slice.call(arguments).join(" ");if(ENVIRONMENT_IS_NODE){fs.writeSync(2,text+" +");return}console.error(text)}function threadAlert(){var text=Array.prototype.slice.call(arguments).join(" ");postMessage({cmd:"alert",text:text,threadId:Module["_pthread_self"]()})}var err=threadPrintErr;self.alert=threadAlert;Module["instantiateWasm"]=(info,receiveInstance)=>{var instance=new WebAssembly.Instance(Module["wasmModule"],info);receiveInstance(instance);Module["wasmModule"]=null;return instance.exports};self.onunhandledrejection=e=>{throw e.reason??e};self.onmessage=e=>{try{if(e.data.cmd==="load"){Module["wasmModule"]=e.data.wasmModule;Module["wasmMemory"]=e.data.wasmMemory;Module["buffer"]=Module["wasmMemory"].buffer;Module["ENVIRONMENT_IS_PTHREAD"]=true;if(typeof e.data.urlOrBlob=="string"){importScripts(e.data.urlOrBlob)}else{var objectUrl=URL.createObjectURL(e.data.urlOrBlob);importScripts(objectUrl);URL.revokeObjectURL(objectUrl)}WasmBackendModuleThreadedSimd(Module).then(function(instance){Module=instance})}else if(e.data.cmd==="run"){Module["__performance_now_clock_drift"]=performance.now()-e.data.time;Module["__emscripten_thread_init"](e.data.pthread_ptr,0,0,1);Module["establishStackSpace"]();Module["PThread"].receiveObjectTransfer(e.data);Module["PThread"].threadInitTLS();if(!initializedJS){pendingNotifiedProxyingQueues.forEach(queue=>{Module["executeNotifiedProxyingQueue"](queue)});pendingNotifiedProxyingQueues=[];initializedJS=true}try{Module["invokeEntryPoint"](e.data.start_routine,e.data.arg)}catch(ex){if(ex!="unwind"){if(ex instanceof Module["ExitStatus"]){if(Module["keepRuntimeAlive"]()){}else{Module["__emscripten_thread_exit"](ex.status)}}else{throw ex}}}}else if(e.data.cmd==="cancel"){if(Module["_pthread_self"]()){Module["__emscripten_thread_exit"](-1)}}else if(e.data.target==="setimmediate"){}else if(e.data.cmd==="processProxyingQueue"){if(initializedJS){Module["executeNotifiedProxyingQueue"](e.data.queue)}else{pendingNotifiedProxyingQueues.push(e.data.queue)}}else if(e.data.cmd){err("worker.js received unknown command "+e.data.cmd);err(e.data)}}catch(ex){if(Module["__emscripten_thread_crashed"]){Module["__emscripten_thread_crashed"]()}throw ex}};`}),_S=jt((e,t)=>{var a=(()=>{var n=typeof document!="undefined"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename!="undefined"&&(n=n||__filename),function(r){r=r||{};var s=typeof r!="undefined"?r:{},i,o;s.ready=new Promise(function(X,ie){i=X,o=ie});var l;typeof process!="undefined"&&process.listeners&&(l={uncaughtException:process.listeners("uncaughtException"),unhandledRejection:process.listeners("unhandledRejection")});var u=Object.assign({},s),d=[],c="./this.program",p=(X,ie)=>{throw ie},h=typeof window=="object",f=typeof importScripts=="function",m=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string",g="";function y(X){return s.locateFile?s.locateFile(X,g):g+X}var A,x,b,w;function S(X){X instanceof Po||$("exiting due to exception: "+X)}if(m){f?g=bc().dirname(g)+"/":g=__dirname+"/";var C,N;typeof pA=="function"&&(C=hA(),N=bc()),A=(X,ie)=>(X=N.normalize(X),C.readFileSync(X,ie?void 0:"utf8")),b=X=>{var ie=A(X,!0);return ie.buffer||(ie=new Uint8Array(ie)),ie},x=(X,ie,ke)=>{X=N.normalize(X),C.readFile(X,function(Ze,xt){Ze?ke(Ze):ie(xt.buffer)})},process.argv.length>1&&(c=process.argv[1].replace(/\\/g,"/")),d=process.argv.slice(2),process.on("uncaughtException",function(X){if(!(X instanceof Po))throw X}),process.on("unhandledRejection",function(X){throw X}),p=(X,ie)=>{if(Va())throw process.exitCode=X,ie;S(ie),process.exit(X)},s.inspect=function(){return"[Emscripten Module object]"}}else(h||f)&&(f?g=self.location.href:typeof document!="undefined"&&document.currentScript&&(g=document.currentScript.src),n&&(g=n),g.indexOf("blob:")!==0?g=g.substr(0,g.replace(/[?#].*/,"").lastIndexOf("/")+1):g="",A=X=>{var ie=new XMLHttpRequest;return ie.open("GET",X,!1),ie.send(null),ie.responseText},f&&(b=X=>{var ie=new XMLHttpRequest;return ie.open("GET",X,!1),ie.responseType="arraybuffer",ie.send(null),new Uint8Array(ie.response)}),x=(X,ie,ke)=>{var Ze=new XMLHttpRequest;Ze.open("GET",X,!0),Ze.responseType="arraybuffer",Ze.onload=()=>{if(Ze.status==200||Ze.status==0&&Ze.response){ie(Ze.response);return}ke()},Ze.onerror=ke,Ze.send(null)},w=X=>document.title=X);var _=s.print||console.log.bind(console),$=s.printErr||console.warn.bind(console);Object.assign(s,u),u=null,s.arguments&&(d=s.arguments),s.thisProgram&&(c=s.thisProgram),s.quit&&(p=s.quit);var M=4,I;s.wasmBinary&&(I=s.wasmBinary);var E=s.noExitRuntime||!0;typeof WebAssembly!="object"&&Vn("no native wasm support detected");var O,L=!1,B;function G(X,ie){X||Vn(ie)}var j=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):void 0;function U(X,ie,ke){for(var Ze=ie+ke,xt=ie;X[xt]&&!(xt>=Ze);)++xt;if(xt-ie>16&&X.buffer&&j)return j.decode(X.subarray(ie,xt));for(var bt="";ie>10,56320|sn&1023)}}return bt}function H(X,ie){return X?U(ee,X,ie):""}function W(X,ie,ke,Ze){if(!(Ze>0))return 0;for(var xt=ke,bt=ke+Ze-1,Ke=0;Ke=55296&&qe<=57343){var Ot=X.charCodeAt(++Ke);qe=65536+((qe&1023)<<10)|Ot&1023}if(qe<=127){if(ke>=bt)break;ie[ke++]=qe}else if(qe<=2047){if(ke+1>=bt)break;ie[ke++]=192|qe>>6,ie[ke++]=128|qe&63}else if(qe<=65535){if(ke+2>=bt)break;ie[ke++]=224|qe>>12,ie[ke++]=128|qe>>6&63,ie[ke++]=128|qe&63}else{if(ke+3>=bt)break;ie[ke++]=240|qe>>18,ie[ke++]=128|qe>>12&63,ie[ke++]=128|qe>>6&63,ie[ke++]=128|qe&63}}return ie[ke]=0,ke-xt}function Q(X,ie,ke){return W(X,ee,ie,ke)}var Z,re,ee,pe,oe,ye,we,Ne,Ge;function Xe(X){Z=X,s.HEAP8=re=new Int8Array(X),s.HEAP16=pe=new Int16Array(X),s.HEAP32=ye=new Int32Array(X),s.HEAPU8=ee=new Uint8Array(X),s.HEAPU16=oe=new Uint16Array(X),s.HEAPU32=we=new Uint32Array(X),s.HEAPF32=Ne=new Float32Array(X),s.HEAPF64=Ge=new Float64Array(X)}var nt=s.INITIAL_MEMORY||16777216,lt,et=[],rt=[],je=[],ct=!1;function Va(){return E}function Pt(){if(s.preRun)for(typeof s.preRun=="function"&&(s.preRun=[s.preRun]);s.preRun.length;)$a(s.preRun.shift());dr(et)}function nn(){ct=!0,dr(rt)}function ta(){if(s.postRun)for(typeof s.postRun=="function"&&(s.postRun=[s.postRun]);s.postRun.length;)_a(s.postRun.shift());dr(je)}function $a(X){et.unshift(X)}function rn(X){rt.unshift(X)}function _a(X){je.unshift(X)}var ut=0,Fa=null,Ga=null;function ur(X){ut++,s.monitorRunDependencies&&s.monitorRunDependencies(ut)}function _o(X){if(ut--,s.monitorRunDependencies&&s.monitorRunDependencies(ut),ut==0&&(Fa!==null&&(clearInterval(Fa),Fa=null),Ga)){var ie=Ga;Ga=null,ie()}}function Vn(X){s.onAbort&&s.onAbort(X),X="Aborted("+X+")",$(X),L=!0,B=1,X+=". Build with -sASSERTIONS for more info.";var ie=new WebAssembly.RuntimeError(X);throw o(ie),ie}var ku="data:application/octet-stream;base64,";function xn(X){return X.startsWith(ku)}function Fo(X){return X.startsWith("file://")}var qt;qt="tfjs-backend-wasm.wasm",xn(qt)||(qt=y(qt));function Mp(X){try{if(X==qt&&I)return new Uint8Array(I);if(b)return b(X);throw"both async and sync fetching of the wasm failed"}catch(ie){Vn(ie)}}function U0(){if(!I&&(h||f)){if(typeof fetch=="function"&&!Fo(qt))return fetch(qt,{credentials:"same-origin"}).then(function(X){if(!X.ok)throw"failed to load wasm binary file at '"+qt+"'";return X.arrayBuffer()}).catch(function(){return Mp(qt)});if(x)return new Promise(function(X,ie){x(qt,function(ke){X(new Uint8Array(ke))},ie)})}return Promise.resolve().then(function(){return Mp(qt)})}function j0(){var X={env:Tu,wasi_snapshot_preview1:Tu};function ie(Ke,qe){var Ot=Ke.exports;s.asm=Ot,O=s.asm.memory,Xe(O.buffer),lt=s.asm.__indirect_function_table,rn(s.asm.__wasm_call_ctors),_o("wasm-instantiate")}ur("wasm-instantiate");function ke(Ke){ie(Ke.instance)}function Ze(Ke){return U0().then(function(qe){return WebAssembly.instantiate(qe,X)}).then(function(qe){return qe}).then(Ke,function(qe){$("failed to asynchronously prepare wasm: "+qe),Vn(qe)})}function xt(){return!I&&typeof WebAssembly.instantiateStreaming=="function"&&!xn(qt)&&!Fo(qt)&&!m&&typeof fetch=="function"?fetch(qt,{credentials:"same-origin"}).then(function(Ke){var qe=WebAssembly.instantiateStreaming(Ke,X);return qe.then(ke,function(Ot){return $("wasm streaming compile failed: "+Ot),$("falling back to ArrayBuffer instantiation"),Ze(ke)})}):Ze(ke)}if(s.instantiateWasm)try{var bt=s.instantiateWasm(X,ie);return bt}catch(Ke){$("Module.instantiateWasm callback failed with error: "+Ke),o(Ke)}return xt().catch(o),{}}var T5,_r;function Po(X){this.name="ExitStatus",this.message="Program terminated with exit("+X+")",this.status=X}function dr(X){for(;X.length>0;)X.shift()(s)}function C5(X){return X}function N5(X){var ie=/\b_Z[\w\d_]+/g;return X.replace(ie,function(ke){var Ze=ke;return ke===Ze?ke:Ze+" ["+ke+"]"})}function Oo(){var X=new Error;if(!X.stack){try{throw new Error}catch(ie){X=ie}if(!X.stack)return"(no stack trace available)"}return X.stack.toString()}function H0(X,ie){re.set(X,ie)}function $p(){Vn("")}function Iu(){return 2147483648}function ya(){return Iu()}function _p(X,ie,ke){ee.copyWithin(X,ie,ie+ke)}function q0(X){try{return O.grow(X-Z.byteLength+65535>>>16),Xe(O.buffer),1}catch(ie){}}function X0(X){var ie=ee.length;X=X>>>0;var ke=Iu();if(X>ke)return!1;let Ze=(Ot,sn)=>Ot+(sn-Ot%sn)%sn;for(var xt=1;xt<=4;xt*=2){var bt=ie*(1+.2/xt);bt=Math.min(bt,X+100663296);var Ke=Math.min(ke,Ze(Math.max(X,bt),65536)),qe=q0(Ke);if(qe)return!0}return!1}var K0={varargs:void 0,get:function(){K0.varargs+=4;var X=ye[K0.varargs-4>>2];return X},getStr:function(X){var ie=H(X);return ie}};function E5(X){return 52}function Z0(X,ie,ke,Ze,xt){return 70}var Ws=[null,[],[]];function Y0(X,ie){var ke=Ws[X];ie===0||ie===10?((X===1?_:$)(U(ke,0)),ke.length=0):ke.push(ie)}function J0(X,ie,ke,Ze){for(var xt=0,bt=0;bt>2],qe=we[ie+4>>2];ie+=8;for(var Ot=0;Ot>2]=xt,0}function Su(X){var ie=s["_"+X];return ie}function Fp(X,ie,ke,Ze,xt){var bt={string:Pa=>{var Pr=0;if(Pa!=null&&Pa!==0){var Zp=(Pa.length<<2)+1;Pr=Ru(Zp),Q(Pa,Pr,Zp)}return Pr},array:Pa=>{var Pr=Ru(Pa.length);return H0(Pa,Pr),Pr}};function Ke(Pa){return ie==="string"?H(Pa):ie==="boolean"?Boolean(Pa):Pa}var qe=Su(X),Ot=[],sn=0;if(Ze)for(var pr=0;prKe==="number"||Ke==="boolean"),bt=ie!=="string";return bt&&xt&&!Ze?Su(X):function(){return Fp(X,ie,ke,arguments,Ze)}}var Tu={abort:$p,emscripten_get_heap_max:ya,emscripten_memcpy_big:_p,emscripten_resize_heap:X0,fd_close:E5,fd_seek:Z0,fd_write:J0},R5=j0(),Op=s.___wasm_call_ctors=function(){return(Op=s.___wasm_call_ctors=s.asm.__wasm_call_ctors).apply(null,arguments)},Q0=s._init=function(){return(Q0=s._init=s.asm.init).apply(null,arguments)},De=s._init_with_threads_count=function(){return(De=s._init_with_threads_count=s.asm.init_with_threads_count).apply(null,arguments)},Cu=s._get_threads_count=function(){return(Cu=s._get_threads_count=s.asm.get_threads_count).apply(null,arguments)},ef=s._register_tensor=function(){return(ef=s._register_tensor=s.asm.register_tensor).apply(null,arguments)},M5=s._dispose_data=function(){return(M5=s._dispose_data=s.asm.dispose_data).apply(null,arguments)},$5=s._dispose=function(){return($5=s._dispose=s.asm.dispose).apply(null,arguments)},tf=s._Abs=function(){return(tf=s._Abs=s.asm.Abs).apply(null,arguments)},Dp=s._Add=function(){return(Dp=s._Add=s.asm.Add).apply(null,arguments)},Do=s._AddN=function(){return(Do=s._AddN=s.asm.AddN).apply(null,arguments)},af=s._All=function(){return(af=s._All=s.asm.All).apply(null,arguments)},nf=s._Any=function(){return(nf=s._Any=s.asm.Any).apply(null,arguments)},_5=s._ArgMax=function(){return(_5=s._ArgMax=s.asm.ArgMax).apply(null,arguments)},rf=s._AvgPool=function(){return(rf=s._AvgPool=s.asm.AvgPool).apply(null,arguments)},sf=s._BatchMatMul=function(){return(sf=s._BatchMatMul=s.asm.BatchMatMul).apply(null,arguments)},of=s._Ceil=function(){return(of=s._Ceil=s.asm.Ceil).apply(null,arguments)},lf=s._ClipByValue=function(){return(lf=s._ClipByValue=s.asm.ClipByValue).apply(null,arguments)},zp=s._Conv2D=function(){return(zp=s._Conv2D=s.asm.Conv2D).apply(null,arguments)},Lp=s._Conv2DBackpropInput=function(){return(Lp=s._Conv2DBackpropInput=s.asm.Conv2DBackpropInput).apply(null,arguments)},uf=s._Cos=function(){return(uf=s._Cos=s.asm.Cos).apply(null,arguments)},df=s._Cosh=function(){return(df=s._Cosh=s.asm.Cosh).apply(null,arguments)},pf=s._CropAndResize=function(){return(pf=s._CropAndResize=s.asm.CropAndResize).apply(null,arguments)},Nu=s._Cumprod=function(){return(Nu=s._Cumprod=s.asm.Cumprod).apply(null,arguments)},cf=s._Cumsum=function(){return(cf=s._Cumsum=s.asm.Cumsum).apply(null,arguments)},hf=s._DepthToSpace=function(){return(hf=s._DepthToSpace=s.asm.DepthToSpace).apply(null,arguments)},ff=s._DepthwiseConv2dNative=function(){return(ff=s._DepthwiseConv2dNative=s.asm.DepthwiseConv2dNative).apply(null,arguments)},Vs=s._Elu=function(){return(Vs=s._Elu=s.asm.Elu).apply(null,arguments)},mf=s._Equal=function(){return(mf=s._Equal=s.asm.Equal).apply(null,arguments)},gf=s._Exp=function(){return(gf=s._Exp=s.asm.Exp).apply(null,arguments)},Bp=s._FlipLeftRight=function(){return(Bp=s._FlipLeftRight=s.asm.FlipLeftRight).apply(null,arguments)},yf=s._Floor=function(){return(yf=s._Floor=s.asm.Floor).apply(null,arguments)},zo=s._FloorDiv=function(){return(zo=s._FloorDiv=s.asm.FloorDiv).apply(null,arguments)},Af=s._FusedBatchNorm=function(){return(Af=s._FusedBatchNorm=s.asm.FusedBatchNorm).apply(null,arguments)},xf=s._FusedConv2D=function(){return(xf=s._FusedConv2D=s.asm.FusedConv2D).apply(null,arguments)},Fr=s._FusedDepthwiseConv2D=function(){return(Fr=s._FusedDepthwiseConv2D=s.asm.FusedDepthwiseConv2D).apply(null,arguments)},Eu=s._Gather=function(){return(Eu=s._Gather=s.asm.Gather).apply(null,arguments)},bf=s._GatherNd=function(){return(bf=s._GatherNd=s.asm.GatherNd).apply(null,arguments)},vf=s._Greater=function(){return(vf=s._Greater=s.asm.Greater).apply(null,arguments)},wf=s._GreaterEqual=function(){return(wf=s._GreaterEqual=s.asm.GreaterEqual).apply(null,arguments)},kf=s._LeakyRelu=function(){return(kf=s._LeakyRelu=s.asm.LeakyRelu).apply(null,arguments)},Wp=s._Less=function(){return(Wp=s._Less=s.asm.Less).apply(null,arguments)},Vp=s._LessEqual=function(){return(Vp=s._LessEqual=s.asm.LessEqual).apply(null,arguments)},If=s._Log=function(){return(If=s._Log=s.asm.Log).apply(null,arguments)},Sf=s._LogicalAnd=function(){return(Sf=s._LogicalAnd=s.asm.LogicalAnd).apply(null,arguments)},Gp=s._LogicalNot=function(){return(Gp=s._LogicalNot=s.asm.LogicalNot).apply(null,arguments)},Up=s._LogicalOr=function(){return(Up=s._LogicalOr=s.asm.LogicalOr).apply(null,arguments)},Tf=s._LogicalXor=function(){return(Tf=s._LogicalXor=s.asm.LogicalXor).apply(null,arguments)},Cf=s._Max=function(){return(Cf=s._Max=s.asm.Max).apply(null,arguments)},Nf=s._MaxPool=function(){return(Nf=s._MaxPool=s.asm.MaxPool).apply(null,arguments)},jp=s._Maximum=function(){return(jp=s._Maximum=s.asm.Maximum).apply(null,arguments)},F5=s._Mean=function(){return(F5=s._Mean=s.asm.Mean).apply(null,arguments)},Ef=s._Min=function(){return(Ef=s._Min=s.asm.Min).apply(null,arguments)},Rf=s._Minimum=function(){return(Rf=s._Minimum=s.asm.Minimum).apply(null,arguments)},Mf=s._MirrorPad=function(){return(Mf=s._MirrorPad=s.asm.MirrorPad).apply(null,arguments)},$f=s._Multiply=function(){return($f=s._Multiply=s.asm.Multiply).apply(null,arguments)},_f=s._Neg=function(){return(_f=s._Neg=s.asm.Neg).apply(null,arguments)},Ff=s._NonMaxSuppressionV3=function(){return(Ff=s._NonMaxSuppressionV3=s.asm.NonMaxSuppressionV3).apply(null,arguments)},Pf=s._NonMaxSuppressionV4=function(){return(Pf=s._NonMaxSuppressionV4=s.asm.NonMaxSuppressionV4).apply(null,arguments)},Of=s._NonMaxSuppressionV5=function(){return(Of=s._NonMaxSuppressionV5=s.asm.NonMaxSuppressionV5).apply(null,arguments)},Df=s._NotEqual=function(){return(Df=s._NotEqual=s.asm.NotEqual).apply(null,arguments)},zf=s._OneHot=function(){return(zf=s._OneHot=s.asm.OneHot).apply(null,arguments)},Lf=s._PadV2=function(){return(Lf=s._PadV2=s.asm.PadV2).apply(null,arguments)},Bf=s._Pow=function(){return(Bf=s._Pow=s.asm.Pow).apply(null,arguments)},Wf=s._Prelu=function(){return(Wf=s._Prelu=s.asm.Prelu).apply(null,arguments)},Vf=s._Prod=function(){return(Vf=s._Prod=s.asm.Prod).apply(null,arguments)},Gf=s._RealDiv=function(){return(Gf=s._RealDiv=s.asm.RealDiv).apply(null,arguments)},Uf=s._Relu=function(){return(Uf=s._Relu=s.asm.Relu).apply(null,arguments)},jf=s._Relu6=function(){return(jf=s._Relu6=s.asm.Relu6).apply(null,arguments)},Hf=s._ResizeBilinear=function(){return(Hf=s._ResizeBilinear=s.asm.ResizeBilinear).apply(null,arguments)},qf=s._ResizeNearestNeighbor=function(){return(qf=s._ResizeNearestNeighbor=s.asm.ResizeNearestNeighbor).apply(null,arguments)},Xf=s._Reverse=function(){return(Xf=s._Reverse=s.asm.Reverse).apply(null,arguments)},Kf=s._RotateWithOffset=function(){return(Kf=s._RotateWithOffset=s.asm.RotateWithOffset).apply(null,arguments)},Zf=s._Round=function(){return(Zf=s._Round=s.asm.Round).apply(null,arguments)},Yf=s._Rsqrt=function(){return(Yf=s._Rsqrt=s.asm.Rsqrt).apply(null,arguments)},Jf=s._ScatterNd=function(){return(Jf=s._ScatterNd=s.asm.ScatterNd).apply(null,arguments)},Qf=s._SelectV2=function(){return(Qf=s._SelectV2=s.asm.SelectV2).apply(null,arguments)},em=s._Sigmoid=function(){return(em=s._Sigmoid=s.asm.Sigmoid).apply(null,arguments)},tm=s._Sin=function(){return(tm=s._Sin=s.asm.Sin).apply(null,arguments)},am=s._Softmax=function(){return(am=s._Softmax=s.asm.Softmax).apply(null,arguments)},nm=s._SparseFillEmptyRows=function(){return(nm=s._SparseFillEmptyRows=s.asm.SparseFillEmptyRows).apply(null,arguments)},rm=s._SparseReshape=function(){return(rm=s._SparseReshape=s.asm.SparseReshape).apply(null,arguments)},sm=s._SparseSegmentReduction=function(){return(sm=s._SparseSegmentReduction=s.asm.SparseSegmentReduction).apply(null,arguments)},im=s._Sqrt=function(){return(im=s._Sqrt=s.asm.Sqrt).apply(null,arguments)},om=s._Square=function(){return(om=s._Square=s.asm.Square).apply(null,arguments)},lm=s._SquaredDifference=function(){return(lm=s._SquaredDifference=s.asm.SquaredDifference).apply(null,arguments)},um=s._Step=function(){return(um=s._Step=s.asm.Step).apply(null,arguments)},dm=s._StridedSlice=function(){return(dm=s._StridedSlice=s.asm.StridedSlice).apply(null,arguments)},pm=s._Sub=function(){return(pm=s._Sub=s.asm.Sub).apply(null,arguments)},cm=s._Sum=function(){return(cm=s._Sum=s.asm.Sum).apply(null,arguments)},hm=s._Tan=function(){return(hm=s._Tan=s.asm.Tan).apply(null,arguments)},fm=s._Tanh=function(){return(fm=s._Tanh=s.asm.Tanh).apply(null,arguments)},mm=s._Tile=function(){return(mm=s._Tile=s.asm.Tile).apply(null,arguments)},gm=s._TopK=function(){return(gm=s._TopK=s.asm.TopK).apply(null,arguments)},ym=s._Transform=function(){return(ym=s._Transform=s.asm.Transform).apply(null,arguments)},Am=s._Transpose=function(){return(Am=s._Transpose=s.asm.Transpose).apply(null,arguments)},xm=s.__FusedMatMul=function(){return(xm=s.__FusedMatMul=s.asm._FusedMatMul).apply(null,arguments)},bm=s._malloc=function(){return(bm=s._malloc=s.asm.malloc).apply(null,arguments)},vm=s._free=function(){return(vm=s._free=s.asm.free).apply(null,arguments)},wm=s.___errno_location=function(){return(wm=s.___errno_location=s.asm.__errno_location).apply(null,arguments)},Hp=s.stackSave=function(){return(Hp=s.stackSave=s.asm.stackSave).apply(null,arguments)},qp=s.stackRestore=function(){return(qp=s.stackRestore=s.asm.stackRestore).apply(null,arguments)},Ru=s.stackAlloc=function(){return(Ru=s.stackAlloc=s.asm.stackAlloc).apply(null,arguments)},km=s.dynCall_iijjiiii=function(){return(km=s.dynCall_iijjiiii=s.asm.dynCall_iijjiiii).apply(null,arguments)},Im=s.dynCall_jiji=function(){return(Im=s.dynCall_jiji=s.asm.dynCall_jiji).apply(null,arguments)};s.cwrap=Pp;var Lo;Ga=function X(){Lo||Xp(),Lo||(Ga=X)};function Xp(X){if(X=X||d,ut>0||(Pt(),ut>0))return;function ie(){Lo||(Lo=!0,s.calledRun=!0,!L&&(nn(),i(s),s.onRuntimeInitialized&&s.onRuntimeInitialized(),ta()))}s.setStatus?(s.setStatus("Running..."),setTimeout(function(){setTimeout(function(){s.setStatus("")},1),ie()},1)):ie()}if(s.preInit)for(typeof s.preInit=="function"&&(s.preInit=[s.preInit]);s.preInit.length>0;)s.preInit.pop()();Xp();var Bo;l&&(Bo={uncaughtException:process.listeners("uncaughtException").filter(function(X){return!l.uncaughtException.indexOf(X)>-1}),unhandledRejection:process.listeners("unhandledRejection").filter(function(X){return!l.unhandledRejection.indexOf(X)>-1})});var Wo;if(typeof r!="undefined")Wo=r;else if(typeof WasmBackendModuleThreadedSimd!="undefined")Wo=WasmBackendModuleThreadedSimd;else throw new Error("Could not find wasm module in post.js");if(Bo){var Sm=Wo._dispose;Wo._dispose=function(){Sm(),Bo.uncaughtException.forEach(function(X){process.removeListener("uncaughtException",X)}),Bo.unhandledRejection.forEach(function(X){process.removeListener("unhandledRejection",X)})}}return r.ready}})();typeof e=="object"&&typeof t=="object"?t.exports=a:typeof define=="function"&&define.amd?define([],function(){return a}):typeof e=="object"&&(e.WasmBackendModule=a)}),md=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}},fl=class{refCount(e){return Ua("refCount")}incRef(e){return Ua("incRef")}timerAvailable(){return!0}time(e){return Ua("time")}read(e){return Ua("read")}readSync(e){return Ua("readSync")}readToGPU(e,t){return Ua("readToGPU")}numDataIds(){return Ua("numDataIds")}disposeData(e,t){return Ua("disposeData")}write(e,t,a){return Ua("write")}move(e,t,a,n,r){return Ua("move")}createTensorFromTexture(e,t,a){return Ua("createTensorFromTexture")}memory(){return Ua("memory")}floatPrecision(){return Ua("floatPrecision")}epsilon(){return this.floatPrecision()===32?1e-7:1e-4}dispose(){return Ua("dispose")}};function Ua(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 fA(e){let t=e.length,a=0;for(;t>0;)a=Math.random()*t|0,t--,vc(e,t,a)}function FS(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 a=e.length,n=0;for(;a>0;)n=Math.random()*a|0,a--,vc(e,a,n),vc(t,a,n)}function Zu(e,t,a){return Math.max(e,Math.min(t,a))}function PS(e){return e%2===0?e:e+1}function vc(e,t,a){let n=e[t];e[t]=e[a],e[a]=n}function OS(e){let t=0;for(let a=0;aa+` Shapes ${e} and ${t} must match`)}function ci(e){F(e!=null,()=>"The input to the tensor constructor must be a non-null value.")}function ai(e,t=[],a=!1){if(t==null&&(t=[]),Array.isArray(e)||da(e)&&!a)for(let n=0;n0,a,n){return new Promise((r,s)=>{let i=0,o=()=>{if(e()){r();return}i++;let l=t(i);if(a!=null&&i>=a){s();return}n!=null?n(o,l):setTimeout(o,l)};o()})}function US(e,t){let a=1,n=-1;for(let s=0;s=0)a*=e[s];else if(e[s]===-1){if(n!==-1)throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${n} and dim ${s}`);n=s}else if(e[s]<0)throw Error(`Shapes can not be < 0. Found ${e[s]} at dim ${s}`);if(n===-1){if(t>0&&t!==a)throw Error(`Size(${t}) must match the product of shape ${e}`);return e}if(a===0)throw Error(`Cannot infer the missing size in [${e}] when there are 0 elements`);if(t%a!==0)throw Error(`The implicit shape can't be a fractional number. Got ${t} / ${a}`);let r=e.slice();return r[n]=t/a,r}function gd(e,t){let a=t.length;return e=e==null?t.map((n,r)=>r):[].concat(e),F(e.every(n=>n>=-a&&n`All values in axis param must be in range [-${a}, ${a}) but got axis ${e}`),F(e.every(n=>tl(n)),()=>`All values in axis param must be integers but got axis ${e}`),e.map(n=>n<0?a+n:n)}function mA(e,t){let a=[],n=[],r=t!=null&&Array.isArray(t)&&t.length===0,s=t==null||r?null:gd(t,e).sort(),i=0;for(let o=0;oo)&&e[o]===1&&(a.push(e[o]),n.push(o)),s[i]<=o&&i++}e[o]!==1&&(a.push(e[o]),n.push(o))}return{newShape:a,keptDims:n}}function gA(e,t){let a=null;if(e==null||e==="float32")a=new Float32Array(t);else if(e==="int32")a=new Int32Array(t);else if(e==="bool")a=new Uint8Array(t);else throw new Error(`Unknown data type ${e}`);return a}function yA(e,t){let a=null;if(e==null||e==="float32")a=new Float32Array(t);else if(e==="int32")a=new Int32Array(t);else if(e==="bool")a=new Uint8Array(t);else if(e==="string")a=new Array(t);else throw new Error(`Unknown data type ${e}`);return a}function AA(e,t){for(let a=0;at+=a.length),t}function zr(e){return typeof e=="string"||e instanceof String}function vA(e){return typeof e=="boolean"}function wA(e){return typeof e=="number"}function Wc(e){return Array.isArray(e)?Wc(e[0]):e instanceof Float32Array?"float32":e instanceof Int32Array||e instanceof Uint8Array||e instanceof Uint8ClampedArray?"int32":wA(e)?"float32":zr(e)?"string":vA(e)?"bool":"float32"}function Gr(e){return!!(e&&e.constructor&&e.call&&e.apply)}function wc(e,t){for(let a=t;a=0;--n)a[n]=a[n+1]*e[n+1];return a}function kA(e,t,a,n=!1){let r=new Array;if(t.length===1){let s=t[0]*(n?2:1);for(let i=0;il*u)*(n?2:1);for(let l=0;lr*s)*(a?2:1);if(n===0)return[];if(n!==t.length)throw new Error(`[${e}] does not match the input size ${t.length}${a?" for a complex tensor":""}.`);return kA(0,e,t,a)}function B1(e,t){let a=Vc(e,t);for(let n=0;nn*r,1);if(t==null||t==="float32")return Yo(e,new Float32Array(a));if(t==="int32")return Yo(e,new Int32Array(a));if(t==="bool")return Yo(e,new Uint8Array(a));throw new Error(`Unknown data type ${t}`)}function W1(e){e.forEach(t=>{F(Number.isInteger(t)&&t>=0,()=>`Tensor must have a shape comprised of positive integers but got shape [${e}].`)})}function qS(e,t,a){if(t===0)return 0;if(t===1)return e[0];let n=e[e.length-1];for(let r=0;r{let[a,n]=t.split(":");this.urlFlags[a]=YS(a,n)})}};function KS(e){let t={};return e.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g,(a,...n)=>(ZS(t,n[0],n[1]),n.join("="))),t}function ZS(e,t,a){e[decodeURIComponent(t)]=decodeURIComponent(a||"")}function YS(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 V(){return G1}var G1=null;function JS(e){G1=e}var Rm;function SA(){if(Rm==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");Rm=e}return Rm}function QS(){let e=SA();return e._tfGlobals==null&&(e._tfGlobals=new Map),e._tfGlobals}function U1(e,t){let a=QS();if(a.has(e))return a.get(e);{let n=t();return a.set(e,n),a.get(e)}}var gl="Abs",yd="Acos",Ad="Acosh",vr="Add",hi="AddN",yl="All",Al="Any",fi="ArgMax",xd="ArgMin",bd="Asin",vd="Asinh",wd="Atan",kd="Atanh",xl="Atan2",mi="AvgPool",j1="AvgPoolGrad",Gc="AvgPool3D",H1="AvgPool3DGrad",gi="BatchMatMul",bl="BatchToSpaceND",Uc="Bincount",eT="BroadcastTo",jc="BroadcastArgs",yi="Cast",Qr="Ceil",es="ClipByValue",Id="Complex",Hc="ComplexAbs",vl="Concat",Ai="Conv2D",qc="Conv2DBackpropFilter",xi="Conv2DBackpropInput",Xc="Conv3D",q1="Conv3DBackpropFilterV2",Kc="Conv3DBackpropInputV2",bi="Cos",vi="Cosh",wi="Cumprod",ki="Cumsum",Ii="CropAndResize",Zc="DenseBincount",Si="DepthToSpace",Ti="DepthwiseConv2dNative",Yc="DepthwiseConv2dNativeBackpropFilter",Jc="DepthwiseConv2dNativeBackpropInput",Qc="Diag",eh="Dilation2D",Vm="Dilation2DBackpropInput",Gm="Dilation2DBackpropFilter",Ci="RealDiv",Sd="Einsum",Ni="Elu",X1="EluGrad",Td="Erf",ts="Equal",as="Exp",wl="ExpandDims",Ei="Expm1",th="FFT",kl="Fill",Ri="FlipLeftRight",ns="Floor",Mi="FloorDiv",$i="FusedBatchNorm",Il="GatherV2",_i="GatherNd",rs="Greater",ss="GreaterEqual",Fi="Identity",ah="IFFT",Cd="Imag",Nd="IsFinite",Ed="IsInf",Sl="IsNan",Pi="LeakyRelu",is="Less",os="LessEqual",nh="LinSpace",ls="Log",Rd="Log1p",Oi="LogicalAnd",Di="LogicalNot",Tl="LogicalOr",TA="LogicalXor",tT="LogSoftmax",aT="LowerBound",rh="LRN",K1="LRNGrad",zi="Max",us="Maximum",Li="MaxPool",Z1="MaxPoolGrad",sh="MaxPool3D",Y1="MaxPool3DGrad",ih="MaxPoolWithArgmax",Bi="Mean",Wi="Min",ds="Minimum",Vi="MirrorPad",Md="Mod",oh="Multinomial",ps="Multiply",Cl="Neg",cs="NotEqual",Gi="NonMaxSuppressionV3",Nl="NonMaxSuppressionV4",Ui="NonMaxSuppressionV5",El="OnesLike",Rl="OneHot",Ml="Pack",ji="PadV2",nT="Pool",Hi="Pow",qi="Prelu",Xi="Prod",lh="RaggedGather",uh="RaggedRange",dh="RaggedTensorToTensor",$l="Range",$d="Real",_l="Reciprocal",Ki="Relu",Fl="Reshape",Zi="ResizeNearestNeighbor",J1="ResizeNearestNeighborGrad",Yi="ResizeBilinear",Q1="ResizeBilinearGrad",Ji="Relu6",Pl="Reverse",Ol="Round",hs="Rsqrt",Qi="ScatterNd",ph="SearchSorted",Dl="Select",_d="Selu",zl="Slice",eo="Sin",Ll="Sinh",Fd="Sign",fs="Sigmoid",Pd="Softplus",ms="Sqrt",to="Sum",Bl="SpaceToBatchND",Wl="SplitV",ao="Softmax",Od="SparseFillEmptyRows",Vl="SparseReshape",Dd="SparseSegmentMean",zd="SparseSegmentSum",Ld="SparseToDense",gs="SquaredDifference",Bd="Square",no="StridedSlice",Gl="StringNGrams",Wd="StringSplit",Vd="StringToHashBucketFast",ys="Sub",Ul="Tan",ro="Tanh",As="Tile",so="TopK",io="Transform",yr="Transpose",ch="Unique",jl="Unpack",hh="UnsortedSegmentSum",rT="UpperBound",Hl="ZerosLike",oo="Step",Yu="FromPixels",lo="RotateWithOffset",Ur="_FusedMatMul",jr="FusedConv2D",Hr="FusedDepthwiseConv2D";function Dr(...e){V().getBool("IS_TEST")||V().getBool("PROD")||console.warn(...e)}function sT(...e){V().getBool("IS_TEST")||V().getBool("PROD")||console.log(...e)}var al=U1("kernelRegistry",()=>new Map),Ju=U1("gradRegistry",()=>new Map);function kc(e,t){let a=e2(e,t);return al.get(a)}function Um(e){return Ju.get(e)}function Zn(e){let t=al.entries(),a=[];for(;;){let{done:n,value:r}=t.next();if(n)break;let[s,i]=r,[o]=s.split("_");o===e&&a.push(i)}return a}function hn(e){let{kernelName:t,backendName:a}=e,n=e2(t,a);al.has(n)&&Dr(`The kernel '${t}' for backend '${a}' is already registered`),al.set(n,e)}function iT(e){let{kernelName:t}=e;Ju.has(t)&&V().getBool("DEBUG")&&Dr(`Overriding the gradient for '${t}'`),Ju.set(t,e)}function oT(e,t){let a=e2(e,t);if(!al.has(a))throw new Error(`The kernel '${e}' for backend '${t}' is not registered`);al.delete(a)}function lT(e){if(!Ju.has(e))throw new Error(`The gradient '${e}' for backend is not registered`);Ju.delete(e)}function uT(e,t){Zn(e).forEach(a=>{let n=Object.assign({},a,{backendName:t});hn(n)})}function e2(e,t){return`${t}_${e}`}var v={};He(v,{arraysEqual:()=>Jr,assert:()=>F,assertNonNegativeIntegerDimensions:()=>W1,assertNonNull:()=>ci,assertShapesMatch:()=>Sa,bytesFromStringArray:()=>bA,bytesPerElement:()=>Wm,checkConversionForErrors:()=>AA,clamp:()=>Zu,computeStrides:()=>ml,createScalarValue:()=>mT,createShuffledIndices:()=>VS,decodeString:()=>Ic,distSquared:()=>zS,encodeString:()=>Ud,fetch:()=>yT,fingerPrint64:()=>fT,flatten:()=>ai,getArrayFromDType:()=>yA,getTypedArrayFromDType:()=>gA,hasEncodingLoss:()=>jS,hexToLong:()=>Gd,indexToLoc:()=>XS,inferDtype:()=>Wc,inferFromImplicitShape:()=>US,isBoolean:()=>vA,isFunction:()=>Gr,isInt:()=>tl,isNumber:()=>wA,isPromise:()=>V1,isScalarShape:()=>LS,isString:()=>zr,isTypedArray:()=>da,isValidDtype:()=>xA,locToIndex:()=>qS,makeOnesTypedArray:()=>B1,makeZerosNestedTypedArray:()=>HS,makeZerosTypedArray:()=>Vc,nearestDivisor:()=>wc,nearestLargerEven:()=>PS,now:()=>Qu,parseAxisParam:()=>gd,randUniform:()=>DS,repeatedTry:()=>GS,rightPad:()=>Hu,shuffle:()=>fA,shuffleCombo:()=>FS,sizeFromShape:()=>yt,sizeToSquarishShape:()=>WS,squeezeShape:()=>mA,sum:()=>OS,swap:()=>vc,tanh:()=>BS,toNestedArray:()=>Yo,toTypedArray:()=>fh});var j5=hl(yS()),Xs=j5.default||j5;function Gd(e){return Xs.fromString(e,!0,16)}var CA=Gd("c3a5c85c97cb3127"),Hs=Gd("b492b66fbe98f273"),Aa=Gd("9ae16a3b2f90404f");function jm(e){return e.xor(e.shru(47))}function NA(e,t,a){let n=e.slice(t,t+a);return Xs.fromBytes(Array.from(n),!0,!0)}function ht(e,t){return NA(e,t,8)}function H5(e,t){return NA(e,t,4)}function Xt(e,t){return t===0?e:e.shru(t).or(e.shl(64-t))}function Wr(e,t,a=Gd("9ddfea08eb382d69")){let n=e.xor(t).mul(a);n=n.xor(n.shru(47));let r=t.xor(n).mul(a);return r=r.xor(r.shru(47)),r=r.mul(a),r}function dT(e,t,a,n,r,s){r=r.add(e),s=Xt(s.add(r).add(n),21);let i=r;return r=r.add(t),r=r.add(a),s=s.add(Xt(r,44)),[r.add(n),s.add(i)]}function rc(e,t,a,n){return dT(ht(e,t),ht(e,t+8),ht(e,t+16),ht(e,t+24),a,n)}function pT(e,t=e.length){if(t>=8){let a=Aa.add(t*2),n=ht(e,0).add(Aa),r=ht(e,t-8),s=Xt(r,37).mul(a).add(n),i=Xt(n,25).add(r).mul(a);return Wr(s,i,a)}if(t>=4){let a=Aa.add(t*2),n=H5(e,0);return Wr(n.shl(3).add(t),H5(e,t-4),a)}if(t>0){let a=e[0],n=e[t>>1],r=e[t-1],s=a+(n<<8),i=t+(r<<2);return jm(Aa.mul(s).xor(CA.mul(i))).mul(Aa)}return Aa}function cT(e,t=e.length){let a=Aa.add(t*2),n=ht(e,0).mul(Hs),r=ht(e,8),s=ht(e,t-8).mul(a),i=ht(e,t-16).mul(Aa);return Wr(Xt(n.add(r),43).add(Xt(s,30)).add(i),n.add(Xt(r.add(Aa),18)).add(s),a)}function hT(e,t=e.length){let a=Aa.add(t*2),n=ht(e,0).mul(Aa),r=ht(e,8),s=ht(e,t-8).mul(a),i=ht(e,t-16).mul(Aa),o=Xt(n.add(r),43).add(Xt(s,30)).add(i),l=Wr(o,n.add(Xt(r.add(Aa),18)).add(s),a),u=ht(e,16).mul(a),d=ht(e,24),c=o.add(ht(e,t-32)).mul(a),p=l.add(ht(e,t-24)).mul(a);return Wr(Xt(u.add(d),43).add(Xt(c,30)).add(p),u.add(Xt(d.add(n),18)).add(c),a)}function fT(e,t=e.length){let a=Xs.fromNumber(81,!0);if(t<=32)return t<=16?pT(e,t):cT(e,t);if(t<=64)return hT(e,t);let n=a,r=a.mul(Hs).add(113),s=jm(r.mul(Aa).add(113)).mul(Aa),i=[Xs.UZERO,Xs.UZERO],o=[Xs.UZERO,Xs.UZERO];n=n.mul(Aa).add(ht(e,0));let l=0,u=(t-1>>6)*64,d=u+(t-1&63)-63;do n=Xt(n.add(r).add(i[0]).add(ht(e,l+8)),37).mul(Hs),r=Xt(r.add(i[1]).add(ht(e,l+48)),42).mul(Hs),n=n.xor(o[1]),r=r.add(i[0]).add(ht(e,l+40)),s=Xt(s.add(o[0]),33).mul(Hs),i=rc(e,l,i[1].mul(Hs),n.add(o[0])),o=rc(e,l+32,s.add(o[1]),r.add(ht(e,l+16))),[s,n]=[n,s],l+=64;while(l!==u);let c=Hs.add(s.and(255).shl(1));return l=d,o[0]=o[0].add(t-1&63),i[0]=i[0].add(o[0]),o[0]=o[0].add(i[0]),n=Xt(n.add(r).add(i[0]).add(ht(e,l+8)),37).mul(c),r=Xt(r.add(i[1]).add(ht(e,l+48)),42).mul(c),n=n.xor(o[1].mul(9)),r=r.add(i[0].mul(9).add(ht(e,l+40))),s=Xt(s.add(o[0]),33).mul(c),i=rc(e,l,i[1].mul(c),n.add(o[0])),o=rc(e,l+32,s.add(o[1]),r.add(ht(e,l+16))),[s,n]=[n,s],Wr(Wr(i[0],o[0],c).add(jm(r).mul(CA)).add(s),Wr(i[1],o[1],c).add(n),c)}function mT(e,t){return t==="string"?Ud(e):fh([e],t)}function gT(e,t){return e instanceof Float32Array&&t==="float32"||e instanceof Int32Array&&t==="int32"||e instanceof Uint8Array&&t==="bool"}function fh(e,t){if(t==="string")throw new Error("Cannot convert a string[] to a TypedArray");if(Array.isArray(e)&&(e=ai(e)),V().getBool("DEBUG")&&AA(e,t),gT(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 a=new Uint8Array(e.length);for(let n=0;n{n=a()},s,i=Qu();if(this.backendTimer.timerAvailable())s=this.backendTimer.time(r);else{r();for(let o of n)o.dataSync();s=Promise.resolve({kernelMs:Qu()-i})}if(V().getBool("CHECK_COMPUTATION_FOR_ERRORS"))for(let o=0;o{xT(u,l.dtype,e)})}return{kernelName:e,outputs:n,inputs:t,timeMs:s.then(o=>o.kernelMs),extraInfo:s.then(o=>o.getExtraProfileInfo!=null?o.getExtraProfileInfo():"")}}logKernelProfile(e){let{kernelName:t,outputs:a,timeMs:n,inputs:r,extraInfo:s}=e;a.forEach(i=>{Promise.all([i.data(),n,s]).then(o=>{this.logger.logKernelProfile(t,i,o[0],o[1],r,o[2])})})}};function xT(e,t,a){if(t!=="float32")return!1;for(let n=0;n0?f:""} `}}console.log(`%c${o} %c${i} %c${l}D ${d} %c${u} %c${c} %c${s}`,"font-weight:bold","color:red","color:blue","color: orange","color: green","color: steelblue")}};function vT(e,t,a){let n={},r={};for(let l=0;ln[m.id]=!0),h=!0,r[u.id]=!0;break}if(h)break}}let s={};s[a.id]=!0;let i={};for(let l=e.length-1;l>=0;l--){let u=e[l],d=u.inputs;for(let c=0;c=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=a(()=>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(!Jr(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 c=e[d.id];e[d.id]=n(c,u),c.dispose()}}}}var q5=20,_u=3,Mm=7;function kT(e,t,a,n){let r=ml(t),s=IT(e,t,a,r),i=t.length,o=pc(e,t,a,r,s),l=["Tensor"];return n&&(l.push(` dtype: ${a}`),l.push(` rank: ${i}`),l.push(` shape: [${t}]`),l.push(" values:")),l.push(o.map(u=>" "+u).join(` +`)),l.join(` +`)}function IT(e,t,a,n){let r=yt(t),s=n[n.length-1],i=new Array(s).fill(0),o=t.length,l=a==="complex64"?Ou(e):e;if(o>1)for(let u=0;uq5){let m=_u*i,g=Array.from(e.slice(0,m)),y=Array.from(e.slice((o-_u)*i,o*i));return a==="complex64"&&(g=Ou(g),y=Ou(y)),["["+g.map((A,x)=>Pu(A,r[x],a)).join(", ")+", ..., "+y.map((A,x)=>Pu(A,r[o-_u+x],a)).join(", ")+"]"]}return["["+(a==="complex64"?Ou(e):Array.from(e)).map((m,g)=>Pu(m,r[g],a)).join(", ")+"]"]}let u=t.slice(1),d=n.slice(1),c=n[0]*i,p=[];if(o>q5){for(let m=0;m<_u;m++){let g=m*c,y=g+c;p.push(...pc(e.slice(g,y),u,a,d,r,!1))}p.push("...");for(let m=o-_u;m`Length of values '${n}' 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=a||yA(t,this.size),this.strides=ml(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 a=this.locToIndex(t);this.values[a]=e}get(...e){e.length===0&&(e=[0]);let t=0;for(let n of e){if(n<0||n>=this.shape[t]){let r=`Requested out of range element at ${e}. Buffer shape=${this.shape}`;throw new Error(r)}t++}let a=e[e.length-1];for(let n=0;nIc(a))}catch(a){throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().")}}return e}dataToGPU(e){return this.throwIfDisposed(),On().readToGPU(this.dataId,e)}dataSync(){this.throwIfDisposed();let e=On().readSync(this.dataId);if(this.dtype==="string")try{return e.map(t=>Ic(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 On().read(this.dataId);return this.dtype==="string"?e:new Uint8Array(e.buffer)}dispose(){this.isDisposed||(On().disposeTensor(this),this.isDisposedInternal=!0)}get isDisposed(){return this.isDisposedInternal}throwIfDisposed(){if(this.isDisposed)throw new Error("Tensor is disposed.")}print(e=!1){return Xo.print(this,e)}clone(){return this.throwIfDisposed(),Xo.clone(this)}toString(e=!1){let t=this.dataSync();return kT(t,this.shape,this.dtype,e)}cast(e){return this.throwIfDisposed(),Xo.cast(this,e)}variable(e=!0,t,a){return this.throwIfDisposed(),On().makeVariable(this,e,t,a)}};Object.defineProperty(dt,Symbol.hasInstance,{value:e=>!!e&&e.data!=null&&e.dataSync!=null&&e.throwIfDisposed!=null});function ET(){return U1("Tensor",()=>dt)}ET();var ed=class extends dt{constructor(e,t,a,n){super(e.shape,e.dtype,e.dataId,n),this.trainable=t,this.name=a}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(!Jr(e.shape,this.shape))throw new Error(`shape of the new value (${e.shape}) and previous value (${this.shape}) must match`);On().disposeTensor(this),this.dataId=e.dataId,On().incRef(this,null)}dispose(){On().disposeVariable(this),this.isDisposedInternal=!0}};Object.defineProperty(ed,Symbol.hasInstance,{value:e=>e instanceof dt&&e.assign!=null&&e.assign instanceof Function});var RA={};He(RA,{assertTypesMatch:()=>MA,getTensorsInContainer:()=>t2,isTensorInList:()=>MT,makeTypesMatch:()=>It});var Hm;(function(e){e.R0="R0",e.R1="R1",e.R2="R2",e.R3="R3",e.R4="R4",e.R5="R5",e.R6="R6"})(Hm||(Hm={}));var qm;(function(e){e.float32="float32",e.int32="int32",e.bool="int32",e.complex64="complex64"})(qm||(qm={}));var Xm;(function(e){e.float32="float32",e.int32="int32",e.bool="bool",e.complex64="complex64"})(Xm||(Xm={}));var Km;(function(e){e.float32="float32",e.int32="float32",e.bool="float32",e.complex64="complex64"})(Km||(Km={}));var Zm;(function(e){e.float32="complex64",e.int32="complex64",e.bool="complex64",e.complex64="complex64"})(Zm||(Zm={}));var RT={float32:Km,int32:qm,bool:Xm,complex64:Zm};function ra(e,t){if(e==="string"||t==="string"){if(e==="string"&&t==="string")return"string";throw new Error(`Can not upcast ${e} with ${t}`)}return RT[e][t]}function jd(e){return ra(e,"int32")}function It(e,t){if(e.dtype===t.dtype)return[e,t];let a=ra(e.dtype,t.dtype);return[e.cast(a),t.cast(a)]}function MA(e,t){F(e.dtype===t.dtype,()=>`The dtypes of the first(${e.dtype}) and second(${t.dtype}) input must match`)}function MT(e,t){return t.some(a=>a.id===e.id)}function t2(e){let t=[];return $A(e,t,new Set),t}function $A(e,t,a){if(e==null)return;if(e instanceof dt){t.push(e);return}if(!$T(e))return;let n=e;for(let r in n){let s=n[r];a.has(s)||(a.add(s),$A(s,t,a))}}function $T(e){return Array.isArray(e)||typeof e=="object"}function $m(e){return e.kernelName!=null}var X5=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()}},td=class{constructor(e){this.ENV=e,this.registry={},this.registryFactory={},this.pendingBackendInitId=0,this.state=new X5}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){Zn(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 a=t.factory();if(a&&!(a instanceof fl)&&typeof a.then=="function"){let n=++this.pendingBackendInitId,r=a.then(s=>n(nthis.registryFactory[t].priority-this.registryFactory[e].priority)}initializeBackendsAndReturnBest(){let e=this.getSortedBackends();for(let t=0;tthis.startScope(a),()=>this.endScope(n),()=>(n=t(),n instanceof Promise&&console.error("Cannot return a Promise inside of tidy."),n))}scopedRun(e,t,a){e();try{let n=a();return t(),n}catch(n){throw t(),n}}nextTensorId(){return td.nextTensorId++}nextVariableId(){return td.nextVariableId++}clone(e){let t=z.runKernel(Fi,{x:e}),a={x:e},n=s=>({x:()=>{let i="float32",o={x:s},l={dtype:i};return z.runKernel(yi,o,l)}}),r=[];return this.addTapeNode(this.state.activeScope.name,a,[t],n,r,{}),t}runKernel(e,t,a){if(this.backendName==null&&this.backend,kc(e,this.backendName)==null)throw new Error(`Kernel '${e}' not registered for backend '${this.backendName}'`);return this.runKernelFunc({kernelName:e,inputs:t,attrs:a})}shouldCheckForMemLeaks(){return this.ENV.getBool("IS_TEST")}checkKernelForMemLeak(e,t,a){let n=this.backend.numDataIds(),r=0;a.forEach(o=>{r+=o.dtype==="complex64"?3:1});let s=this.state.numDataMovesStack[this.state.numDataMovesStack.length-1],i=n-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,a=[],n=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=$m(e)?e.kernelName:this.state.activeScope!=null?this.state.activeScope.name:"";if($m(e)){let{kernelName:h,inputs:f,attrs:m}=e;this.backendName==null&&this.backend;let g=kc(h,this.backendName);F(g!=null,()=>`Cannot find registered kernel '${h}' for backend '${this.backendName}'`),i=()=>{let y=this.backend.numDataIds();o=g.kernelFunc({inputs:f,attrs:m,backend:this.backend});let A=Array.isArray(o)?o:[o];this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(h,y,A);let x=A.map(b=>b.rank!=null?b:this.makeTensorFromTensorInfo(b));if(n){let b=this.getTensorsForGradient(h,f,x);a=this.saveTensorsForBackwardMode(b)}return x}}else{let{forwardFunc:h}=e,f=m=>{!n||(a=m.map(g=>this.keep(this.clone(g))))};i=()=>{let m=this.backend.numDataIds();o=this.tidy(()=>h(this.backend,f));let g=Array.isArray(o)?o:[o];return this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(l,m,g),g}}let{inputs:u,attrs:d}=e,c=$m(e)?null:e.backwardsFunc,p;return this.scopedRun(()=>this.state.kernelDepth++,()=>this.state.kernelDepth--,()=>{!this.ENV.getBool("DEBUG")&&!this.state.profiling?t=i():(p=this.profiler.profileKernel(l,u,()=>i()),this.ENV.getBool("DEBUG")&&this.profiler.logKernelProfile(p),t=p.outputs)}),n&&this.addTapeNode(l,u,t,c,a,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:p.timeMs,extraInfo:p.extraInfo}),Array.isArray(o)?t:t[0]}saveTensorsForBackwardMode(e){return e.map(t=>this.keep(this.clone(t)))}getTensorsForGradient(e,t,a){let n=Um(e);if(n!=null){let r=n.inputsToSave||[],s=n.outputsToSave||[],i;n.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=a.filter((l,u)=>s[u]);return i.concat(o)}return[]}makeTensor(e,t,a,n){if(e==null)throw new Error("Values passed to engine.makeTensor() are null");a=a||"float32",n=n||this.backend;let r=e;a==="string"&&zr(e[0])&&(r=e.map(o=>Ud(o)));let s=n.write(r,t,a),i=new dt(t,a,s,this.nextTensorId());if(this.trackTensor(i,n),a==="string"){let o=this.state.tensorInfo.get(s),l=bA(r);this.state.numBytes+=l-o.bytes,o.bytes=l}return i}makeTensorFromDataId(e,t,a,n){a=a||"float32";let r={dataId:e,shape:t,dtype:a};return this.makeTensorFromTensorInfo(r,n)}makeTensorFromTensorInfo(e,t){let{dataId:a,shape:n,dtype:r}=e,s=new dt(n,r,a,this.nextTensorId());return this.trackTensor(s,t),s}makeVariable(e,t=!0,a,n){a=a||this.nextVariableId().toString(),n!=null&&n!==e.dtype&&(e=e.cast(n));let r=new ed(e,t,a,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 a=0;e.dtype!=="complex64"&&e.dtype!=="string"&&(a=e.size*Wm(e.dtype)),this.state.numBytes+=a,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:a})),e instanceof ed||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 a=e.size*Wm(e.dtype);this.state.numBytes-=a}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,a=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(n=>n.totalBytesSnapshot)),this.state.activeProfile.newBytes=this.state.numBytes-t,this.state.activeProfile.newTensors=this.state.numTensors-a;for(let n of this.state.activeProfile.kernels)n.kernelTimeMs=await n.kernelTimeMs,n.extraInfo=await n.extraInfo;return this.state.activeProfile}isTapeOn(){return this.state.gradientDepth>0&&this.state.kernelDepth===0}addTapeNode(e,t,a,n,r,s){let i={id:this.state.nextTapeNodeId++,kernelName:e,inputs:t,outputs:a,saved:r},o=Um(e);o!=null&&(n=o.gradFunc),n!=null&&(i.gradient=l=>(l=l.map((u,d)=>{if(u==null){let c=a[d],p=Vc(c.size,c.dtype);return this.makeTensor(p,c.shape,c.dtype)}return u}),n(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=t2(e),a=new Set(t.map(r=>r.id));for(let r=0;r{!r.kept&&r.scopeId===n.id&&this.track(r)})}gradients(e,t,a,n=!1){if(F(t.length>0,()=>"gradients() received an empty list of xs."),a!=null&&a.dtype!=="float32")throw new Error(`dy must have 'float32' dtype, but has '${a.dtype}'`);let r=this.scopedRun(()=>this.startTape(),()=>this.endTape(),()=>this.tidy("forward",e));F(r instanceof dt,()=>"The result y returned by f() must be a tensor.");let s=vT(this.state.activeTape,t,r);if(!n&&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]=a==null?_T(r.shape):a,wT(i,s,l=>this.tidy(l),FT);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(Gr(e),()=>"The f passed in customGrad(f) must be a function."),(...t)=>{F(t.every(i=>i instanceof dt),()=>"The args passed in customGrad(f)(x1, x2,...) must all be tensors");let a,n={};t.forEach((i,o)=>{n[o]=i});let r=(i,o)=>(a=e(...t,o),F(a.value instanceof dt,()=>"The function f passed in customGrad(f) must return an object where `obj.value` is a tensor"),F(Gr(a.gradFunc),()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function."),a.value),s=(i,o)=>{let l=a.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(c=>c instanceof dt),()=>"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((c,p)=>{d[p]=()=>c}),d};return this.runKernelFunc({forwardFunc:r,backwardsFunc:s,inputs:n})}}readSync(e){return this.state.tensorInfo.get(e).backend.readSync(e)}read(e){return this.state.tensorInfo.get(e).backend.read(e)}readToGPU(e,t){return this.state.tensorInfo.get(e).backend.readToGPU(e,t)}async time(e){let t=Qu(),a=await this.backend.time(e);return a.wallMs=Qu()-t,a}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 X5;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}};td.nextTensorId=0;td.nextVariableId=0;function _T(e){let t=B1(yt(e),"float32");return z.makeTensor(t,e,"float32")}function _A(){let e=SA();if(e._tfengine==null){let t=new IA(e);e._tfengine=new td(t)}return JS(e._tfengine.ENV),TT(()=>e._tfengine),e._tfengine}var z=_A();function FT(e,t){let a={a:e,b:t};return z.runKernel(vr,a)}var Hd={};He(Hd,{isBrowser:()=>FA,isMobile:()=>DT,mockIsMobile:()=>OT});function PT(){return typeof navigator!="undefined"&&navigator!=null}var Ym;function OT(e){Ym=e}function DT(e){if(Ym!==void 0)return Ym;if(e||PT()){if(e||(e=navigator),e.product==="ReactNative")return!0;let t=e.userAgent||e.vendor||(typeof window!="undefined"?window.opera:"");if(!t){let a=e;return a.userAgentData&&a.userAgentData.mobile}return/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(t)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(t.substr(0,4))}return!1}function FA(){return typeof window!="undefined"&&window.document!=null||typeof WorkerGlobalScope!="undefined"}var Ka=V();Ka.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.")});Ka.registerFlag("IS_BROWSER",()=>FA());Ka.registerFlag("IS_NODE",()=>typeof process!="undefined"&&typeof process.versions!="undefined"&&typeof process.versions.node!="undefined");Ka.registerFlag("IS_CHROME",()=>typeof navigator!="undefined"&&navigator!=null&&navigator.userAgent!=null&&/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor));Ka.registerFlag("PROD",()=>!1);Ka.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY",()=>Ka.getBool("DEBUG"));Ka.registerFlag("DEPRECATION_WARNINGS_ENABLED",()=>!0);Ka.registerFlag("IS_TEST",()=>!1);Ka.registerFlag("CHECK_COMPUTATION_FOR_ERRORS",()=>!0);Ka.registerFlag("WRAP_TO_IMAGEBITMAP",()=>!1);Ka.registerFlag("ENGINE_COMPILE_ONLY",()=>!1);Ka.registerFlag("CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU",()=>!1);Ka.registerFlag("USE_SETTIMEOUTCUSTOM",()=>!1);function Yn(e,t){let a=e;if(da(e))return t==="string"?[]:[e.length];if(typeof e=="object"&&"texture"in e){let r=e.channels||"RGBA";return[e.height,e.width*r.length]}if(!Array.isArray(e))return[];let n=[];for(;Array.isArray(a)||da(a)&&t!=="string";)n.push(a.length),a=a[0];return Array.isArray(e)&&V().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")&&PA(e,n,[]),n}function PA(e,t,a){if(a=a||[],!Array.isArray(e)&&!da(e)){F(t.length===0,()=>`Element arr[${a.join("][")}] is a primitive, but should be an array/TypedArray of ${t[0]} elements`);return}F(t.length>0,()=>`Element arr[${a.join("][")}] should be a primitive, but is an array of ${e.length} elements`),F(e.length===t[0],()=>`Element arr[${a.join("][")}] should have ${t[0]} elements, but has ${e.length} elements`);let n=t.slice(1);for(let r=0;r=0&&(r=n),K5(n,r,t,a),e==null||!da(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 '${a}' must be a Tensor or TensorLike, but got '${o}'`)}let s=Yn(e,r);!da(e)&&!Array.isArray(e)&&(e=[e]);let i=r!=="string"?fh(e,r):ai(e,[],!0);return z.makeTensor(i,s,r)}function ad(e,t,a,n="numeric"){if(!Array.isArray(e))throw new Error(`Argument ${t} passed to ${a} must be a \`Tensor[]\` or \`TensorLike[]\``);return e.map((r,s)=>R(r,`${t}[${s}]`,a,n))}var a2="__op";function D(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 a=t[0],n=e[a];a.endsWith("_")&&(a=a.substring(0,a.length-1)),a=a+a2;let r=(...s)=>{z.startScope(a);try{let i=n(...s);return V1(i)&&console.error("Cannot return a Promise inside of tidy."),z.endScope(i),i}catch(i){throw z.endScope(null),i}};return Object.defineProperty(r,"name",{value:a,configurable:!0}),r}function zT(e,t){let a=R(e,"real","complex"),n=R(t,"imag","complex");Sa(a.shape,n.shape,`real and imag shapes, ${a.shape} and ${n.shape}, must match in call to tf.complex().`);let r={real:a,imag:n};return z.runKernel(Id,r)}var xr=D({complex_:zT});function xs(e,t,a,n){if(n==null&&(n=Wc(e)),n==="complex64")throw new Error("Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).");if(typeof e=="object"&&"texture"in e){if(n!=="float32"&&n!=="int32")throw new Error(`Creating tensor from texture only supports 'float32'|'int32' dtype, while the dtype is ${n}.`);return e.channels=e.channels||"RGBA",z.backend.createTensorFromTexture(e,t||a,n)}if(!da(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){W1(t);let r=yt(t),s=yt(a);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 (${a}) does not match the provided shape (${t}). `)}}return!da(e)&&!Array.isArray(e)&&(e=[e]),t=t||a,e=n!=="string"?fh(e,n):ai(e,[],!0),z.makeTensor(e,t,n)}function ze(e,t,a){let n=Yn(e,a);return xs(e,t,n,a)}var Jm={float32:4,float16:2,int32:4,uint16:2,uint8:1,bool:1,complex64:8},Sc=4;async function LT(e,t){let a=[],n=[],r=Array.isArray(e)?e.map(i=>i.name):Object.keys(e);for(let i=0;i{let p=await l.bytes(),h=p.reduce((g,y)=>g+y.length,0)+Sc*p.length,f=new Uint8Array(h),m=0;for(let g=0;g{if(t+=s.byteLength,a.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 n=new Uint8Array(t),r=0;return a.forEach(s=>{n.set(new Uint8Array(s.buffer),r),r+=s.byteLength}),n.buffer}var n2=typeof Buffer!="undefined"&&(typeof Blob=="undefined"||typeof atob=="undefined"||typeof btoa=="undefined");function Z5(e){return n2?Buffer.byteLength(e):new Blob([e]).size}function WT(e){if(n2)return Buffer.from(e).toString("base64");let t=new Uint8Array(e),a="";for(let n=0,r=t.length;n{t+=r.byteLength});let a=new Uint8Array(t),n=0;return e.forEach(r=>{a.set(new Uint8Array(r),n),n+=r.byteLength}),a.buffer}function Y5(e){let t="/";for(e=e.trim();e.endsWith(t);)e=e.slice(0,e.length-1);let a=e.split(t);return a[a.length-1]}function DA(e,t){let a={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,weightsManifest:t};return e.signature!=null&&(a.signature=e.signature),e.userDefinedMetadata!=null&&(a.userDefinedMetadata=e.userDefinedMetadata),e.modelInitializer!=null&&(a.modelInitializer=e.modelInitializer),e.initializerSignature!=null&&(a.initializerSignature=e.initializerSignature),e.trainingConfig!=null&&(a.trainingConfig=e.trainingConfig),a}function zA(e,t,a){let n={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy};if(e.trainingConfig!=null&&(n.trainingConfig=e.trainingConfig),e.weightsManifest!=null){if(!t)throw new Error("modelJSON has weightsManifest but weightSpecs is null");if(!a)throw new Error("modelJSON has weightsManifest but weightData is null");n.weightSpecs=t,n.weightData=a}return e.signature!=null&&(n.signature=e.signature),e.userDefinedMetadata!=null&&(n.userDefinedMetadata=e.userDefinedMetadata),e.modelInitializer!=null&&(n.modelInitializer=e.modelInitializer),e.initializerSignature!=null&&(n.initializerSignature=e.initializerSignature),n}async function s2(e,t){let a,n;return e.weightsManifest!=null&&([a,n]=await t(e.weightsManifest)),zA(e,a,n)}function qd(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:Z5(JSON.stringify(e.modelTopology)),weightSpecsBytes:e.weightSpecs==null?0:Z5(JSON.stringify(e.weightSpecs)),weightDataBytes:e.weightData==null?0:e.weightData.byteLength}}function LA(e){let t=[];for(let a of e)t.push(...a.weights);return t}function GT(){let e=a=>{let n=a<<13,r=0;for(;(n&8388608)===0;)r-=8388608,n<<=1;return n&=-8388609,r+=947912704,n|r},t=new Uint32Array(2048);t[0]=0;for(let a=1;a<1024;a++)t[a]=e(a);for(let a=1024;a<2048;a++)t[a]=939524096+(a-1024<<13);return t}function UT(){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 jT(){let e=new Uint32Array(64);for(let t=0;t<64;t++)e[t]=1024;return e[0]=e[32]=0,e}function HT(){let e=GT(),t=UT(),a=jT();return n=>{let r=new ArrayBuffer(4*n.length),s=new Uint32Array(r);for(let i=0;i>10]+(o&1023)]+t[o>>10];s[i]=l}return new Float32Array(r)}}var Et=class{constructor(){this.saveRouters=[],this.loadRouters=[]}static getInstance(){return Et.instance==null&&(Et.instance=new Et),Et.instance}static registerSaveRouter(e){Et.getInstance().saveRouters.push(e)}static registerLoadRouter(e){Et.getInstance().loadRouters.push(e)}static getSaveHandlers(e){return Et.getHandlers(e,"save")}static getLoadHandlers(e,t){return Et.getHandlers(e,"load",t)}static getHandlers(e,t,a){let n=[];return(t==="load"?Et.getInstance().loadRouters:Et.getInstance().saveRouters).forEach(r=>{let s=r(e,a);s!==null&&n.push(s)}),n}},qT=e=>Et.registerSaveRouter(e),XT=e=>Et.registerLoadRouter(e),KT=e=>Et.getSaveHandlers(e),ZT=(e,t)=>Et.getLoadHandlers(e,t),Qm="tensorflowjs",e1=1,Ys="models_store",Lr="model_info_store";function BA(){if(!V().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 t1(e){let t=e.result;t.createObjectStore(Ys,{keyPath:"modelPath"}),t.createObjectStore(Lr,{keyPath:"modelPath"})}var ni=class{constructor(e){if(this.indexedDB=BA(),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((a,n)=>{let r=this.indexedDB.open(Qm,e1);r.onupgradeneeded=()=>t1(r),r.onsuccess=()=>{let s=r.result;if(t==null){let i=s.transaction(Ys,"readonly"),o=i.objectStore(Ys).get(this.modelPath);o.onsuccess=()=>{if(o.result==null)return s.close(),n(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`));a(o.result.modelArtifacts)},o.onerror=l=>(s.close(),n(o.error)),i.oncomplete=()=>s.close()}else{let i=qd(t),o=s.transaction(Lr,"readwrite"),l=o.objectStore(Lr),u=l.put({modelPath:this.modelPath,modelArtifactsInfo:i}),d;u.onsuccess=()=>{d=s.transaction(Ys,"readwrite");let c=d.objectStore(Ys).put({modelPath:this.modelPath,modelArtifacts:t,modelArtifactsInfo:i});c.onsuccess=()=>a({modelArtifactsInfo:i}),c.onerror=p=>{l=o.objectStore(Lr);let h=l.delete(this.modelPath);h.onsuccess=()=>(s.close(),n(c.error)),h.onerror=f=>(s.close(),n(c.error))}},u.onerror=c=>(s.close(),n(u.error)),o.oncomplete=()=>{d==null?s.close():d.oncomplete=()=>s.close()}}},r.onerror=s=>n(r.error)})}};ni.URL_SCHEME="indexeddb://";var WA=e=>V().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(ni.URL_SCHEME)?YT(e.slice(ni.URL_SCHEME.length)):null;Et.registerSaveRouter(WA);Et.registerLoadRouter(WA);function YT(e){return new ni(e)}function JT(e){return e.startsWith(ni.URL_SCHEME)?e.slice(ni.URL_SCHEME.length):e}var QT=class{constructor(){this.indexedDB=BA()}async listModels(){return new Promise((e,t)=>{let a=this.indexedDB.open(Qm,e1);a.onupgradeneeded=()=>t1(a),a.onsuccess=()=>{let n=a.result,r=n.transaction(Lr,"readonly"),s=r.objectStore(Lr).getAll();s.onsuccess=()=>{let i={};for(let o of s.result)i[o.modelPath]=o.modelArtifactsInfo;e(i)},s.onerror=i=>(n.close(),t(s.error)),r.oncomplete=()=>n.close()},a.onerror=n=>t(a.error)})}async removeModel(e){return e=JT(e),new Promise((t,a)=>{let n=this.indexedDB.open(Qm,e1);n.onupgradeneeded=()=>t1(n),n.onsuccess=()=>{let r=n.result,s=r.transaction(Lr,"readwrite"),i=s.objectStore(Lr),o=i.get(e),l;o.onsuccess=()=>{if(o.result==null)return r.close(),a(new Error(`Cannot find model with path '${e}' in IndexedDB.`));{let u=i.delete(e),d=()=>{l=r.transaction(Ys,"readwrite");let c=l.objectStore(Ys).delete(e);c.onsuccess=()=>t(o.result.modelArtifactsInfo),c.onerror=p=>a(o.error)};u.onsuccess=d,u.onerror=c=>(d(),r.close(),a(o.error))}},o.onerror=u=>(r.close(),a(o.error)),s.oncomplete=()=>{l==null?r.close():l.oncomplete=()=>r.close()}},n.onerror=r=>a(n.error)})}},mr="/",Ko="tensorflowjs_models",VA="info",eC="model_topology",tC="weight_specs",aC="weight_data",nC="model_metadata";function GA(e){return{info:[Ko,e,VA].join(mr),topology:[Ko,e,eC].join(mr),weightSpecs:[Ko,e,tC].join(mr),weightData:[Ko,e,aC].join(mr),modelMetadata:[Ko,e,nC].join(mr)}}function UA(e){for(let t of Object.values(e))window.localStorage.removeItem(t)}function rC(e){let t=e.split(mr);if(t.length<3)throw new Error(`Invalid key format: ${e}`);return t.slice(1,t.length-1).join(mr)}function sC(e){return e.startsWith(ri.URL_SCHEME)?e.slice(ri.URL_SCHEME.length):e}var ri=class{constructor(e){if(!V().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=GA(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),a=JSON.stringify(e.weightSpecs),n=qd(e);try{this.LS.setItem(this.keys.info,JSON.stringify(n)),this.LS.setItem(this.keys.topology,t),this.LS.setItem(this.keys.weightSpecs,a),this.LS.setItem(this.keys.weightData,WT(e.weightData));let r={format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,signature:e.signature!=null?e.signature:void 0,userDefinedMetadata:e.userDefinedMetadata!=null?e.userDefinedMetadata:void 0,modelInitializer:e.modelInitializer!=null?e.modelInitializer:void 0,initializerSignature:e.initializerSignature!=null?e.initializerSignature:void 0,trainingConfig:e.trainingConfig!=null?e.trainingConfig:void 0};return this.LS.setItem(this.keys.modelMetadata,JSON.stringify(r)),{modelArtifactsInfo:n}}catch(r){throw UA(this.keys),new Error(`Failed to save model '${this.modelPath}' to local storage: size quota being exceeded is a possible cause of this failure: modelTopologyBytes=${n.modelTopologyBytes}, weightSpecsBytes=${n.weightSpecsBytes}, weightDataBytes=${n.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={},a=JSON.parse(this.LS.getItem(this.keys.topology));if(a==null)throw new Error(`In local storage, the topology of model '${this.modelPath}' is missing.`);t.modelTopology=a;let n=JSON.parse(this.LS.getItem(this.keys.weightSpecs));if(n==null)throw new Error(`In local storage, the weight specs of model '${this.modelPath}' are missing.`);t.weightSpecs=n;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),i.initializerSignature!=null&&(t.initializerSignature=i.initializerSignature),i.trainingConfig!=null&&(t.trainingConfig=i.trainingConfig)}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=VT(s),t}};ri.URL_SCHEME="localstorage://";var jA=e=>V().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(ri.URL_SCHEME)?iC(e.slice(ri.URL_SCHEME.length)):null;Et.registerSaveRouter(jA);Et.registerLoadRouter(jA);function iC(e){return new ri(e)}var oC=class{constructor(){F(V().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=Ko+mr,a=mr+VA;for(let n=0;n"scheme must not be undefined or null."),e.endsWith(Jo)&&(e=e.slice(0,e.indexOf(Jo))),F(e.length>0,()=>"scheme must not be an empty string.");let a=Oa.getInstance();F(a.managers[e]==null,()=>`A model store manager is already registered for scheme '${e}'.`),a.managers[e]=t}static getManager(e){let t=Oa.getInstance().managers[e];if(t==null)throw new Error(`Cannot find model manager for scheme '${e}'`);return t}static getSchemes(){return Object.keys(Oa.getInstance().managers)}};function cc(e){if(e.indexOf(Jo)===-1)throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${Oa.getSchemes().join(",")}`);return{scheme:e.split(Jo)[0],path:e.split(Jo)[1]}}async function HA(e,t,a=!1){F(e!==t,()=>`Old path and new path are the same: '${e}'`);let n=Et.getLoadHandlers(e);F(n.length>0,()=>`Copying failed because no load handler is found for source URL ${e}.`),F(n.length<2,()=>`Copying failed because more than one (${n.length}) load handlers for source URL ${e}.`);let r=n[0],s=Et.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 (${n.length}) save handlers for destination URL ${t}.`);let i=s[0],o=cc(e).scheme,l=cc(e).path,u=o===cc(e).scheme,d=await r.load();a&&u&&await Oa.getManager(o).removeModel(l);let c=await i.save(d);return a&&!u&&await Oa.getManager(o).removeModel(l),c.modelArtifactsInfo}async function lC(){let e=Oa.getSchemes(),t={};for(let a of e){let n=await Oa.getManager(a).listModels();for(let r in n){let s=a+Jo+r;t[s]=n[r]}}return t}async function uC(e){let t=cc(e);return Oa.getManager(t.scheme).removeModel(t.path)}async function dC(e,t){return HA(e,t,!1)}async function pC(e,t){return HA(e,t,!0)}var cC=class{constructor(){this.messageName="setTimeoutCustom",this.functionRefs=[],this.handledMessageCount=0,this.hasEventListener=!1}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)}setTimeoutCustom(e,t){if(typeof window=="undefined"||!V().getBool("USE_SETTIMEOUTCUSTOM")){setTimeout(e,t);return}this.functionRefs.push(e),setTimeout(()=>{window.postMessage({name:this.messageName,index:this.functionRefs.length-1},"*")},t),this.hasEventListener||(this.hasEventListener=!0,window.addEventListener("message",a=>{if(a.source===window&&a.data.name===this.messageName){a.stopPropagation();let n=this.functionRefs[a.data.index];n(),this.handledMessageCount++,this.handledMessageCount===this.functionRefs.length&&(this.functionRefs=[],this.handledMessageCount=0)}},!0))}};if(V().get("IS_BROWSER")){V().setPlatform("browser",new cC);try{Oa.registerManager(ri.URL_SCHEME,new oC)}catch(e){}try{Oa.registerManager(ni.URL_SCHEME,new QT)}catch(e){}}var hC={importFetch:()=>AS()},_m,fC=class{constructor(){this.util=xS(),this.textEncoder=new this.util.TextEncoder}fetch(e,t){return V().global.fetch!=null?V().global.fetch(e,t):(_m==null&&(_m=hC.importFetch()),_m(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)}};V().get("IS_NODE")&&!V().get("IS_BROWSER")&&V().setPlatform("node",new fC);function ve(e,t="float32",a){return t=t||"float32",W1(e),new Mt(e,t,a)}function mC(e,t){let a=R(e,"x","cast");if(!xA(t))throw new Error(`Failed to cast to unknown dtype ${t}`);if(t==="string"&&a.dtype!=="string"||t!=="string"&&a.dtype==="string")throw new Error("Only strings can be casted to strings");let n={x:a},r={dtype:t};return z.runKernel(yi,n,r)}var Ue=D({cast_:mC});function gC(e){let t={x:R(e,"x","clone","string_or_numeric")};return z.runKernel(Fi,t)}var wa=D({clone_:gC});function i2(e,t=!1){console.log(e.toString(t))}_A();var yC={buffer:ve,cast:Ue,clone:wa,print:i2};CT(yC);var Hn={};He(Hn,{browserFiles:()=>IC,browserHTTPRequest:()=>EC,concatenateArrayBuffers:()=>r2,copyModel:()=>dC,decodeWeights:()=>OA,encodeWeights:()=>LT,fromMemory:()=>MC,fromMemorySync:()=>YA,getLoadHandlers:()=>ZT,getModelArtifactsForJSON:()=>s2,getModelArtifactsForJSONSync:()=>zA,getModelArtifactsInfoForJSON:()=>qd,getSaveHandlers:()=>KT,getWeightSpecs:()=>LA,http:()=>l2,isHTTPScheme:()=>a1,listModels:()=>lC,loadWeights:()=>SC,moveModel:()=>pC,registerLoadRouter:()=>XT,registerSaveRouter:()=>qT,removeModel:()=>uC,weightsLoaderFactory:()=>XA,withSaveHandler:()=>$C,withSaveHandlerSync:()=>_C});var AC="model",xC=".json",bC=".weights.bin";function J5(e){return new Promise(t=>setTimeout(t)).then(e)}var nl=class{constructor(e){if(!V().getBool("IS_BROWSER"))throw new Error("browserDownloads() cannot proceed because the current environment is not a browser.");e.startsWith(nl.URL_SCHEME)&&(e=e.slice(nl.URL_SCHEME.length)),(e==null||e.length===0)&&(e=AC),this.modelJsonFileName=e+xC,this.weightDataFileName=e+bC}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 a=[{paths:["./"+this.weightDataFileName],weights:e.weightSpecs}],n=DA(e,a),r=window.URL.createObjectURL(new Blob([JSON.stringify(n)],{type:"application/json"})),s=this.modelJsonAnchor==null?document.createElement("a"):this.modelJsonAnchor;if(s.download=this.modelJsonFileName,s.href=r,await J5(()=>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 J5(()=>i.dispatchEvent(new MouseEvent("click")))}return{modelArtifactsInfo:qd(e)}}}};nl.URL_SCHEME="downloads://";var vC=class{constructor(e){if(e==null||e.length<1)throw new Error(`When calling browserFiles, at least 1 file is required, but received ${e}`);this.jsonFile=e[0],this.weightsFiles=e.slice(1)}async load(){return new Promise((e,t)=>{let a=new FileReader;a.onload=n=>{let r=JSON.parse(n.target.result),s=r.modelTopology;if(s==null){t(new Error(`modelTopology field is missing from file ${this.jsonFile.name}`));return}if(r.weightsManifest==null){t(new Error(`weightManifest field is missing from file ${this.jsonFile.name}`));return}if(this.weightsFiles.length===0){e({modelTopology:s});return}let i=s2(r,o=>this.loadWeights(o));e(i)},a.onerror=n=>t(`Failed to read model topology and weights manifest JSON from file '${this.jsonFile.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`),a.readAsText(this.jsonFile)})}loadWeights(e){let t=[],a=[];for(let s of e)t.push(...s.weights),a.push(...s.paths);let n=this.checkManifestAndWeightFiles(e),r=a.map(s=>this.loadWeightsFile(s,n[s]));return Promise.all(r).then(s=>[t,r2(s)])}loadWeightsFile(e,t){return new Promise((a,n)=>{let r=new FileReader;r.onload=s=>{let i=s.target.result;a(i)},r.onerror=s=>n(`Failed to weights data from file of path '${e}'.`),r.readAsArrayBuffer(t)})}checkManifestAndWeightFiles(e){let t=[],a=this.weightsFiles.map(r=>Y5(r.name)),n={};for(let r of e)r.paths.forEach(s=>{let i=Y5(s);if(t.indexOf(i)!==-1)throw new Error(`Duplicate file basename found in weights manifest: '${i}'`);if(t.push(i),a.indexOf(i)===-1)throw new Error(`Weight file with basename '${i}' is not provided.`);n[s]=this.weightsFiles[a.indexOf(i)]});if(t.length!==this.weightsFiles.length)throw new Error(`Mismatch in the number of files in weights manifest (${t.length}) and the number of weight files provided (${this.weightsFiles.length}).`);return n}},wC=e=>V().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(nl.URL_SCHEME)?kC(e.slice(nl.URL_SCHEME.length)):null;Et.registerSaveRouter(wC);function kC(e="model"){return new nl(e)}function IC(e){return new vC(e)}function Q5(e,t,a,n){i(e),a=a==null?0:a,n=n==null?1:n,o(a,n);let r=0,s=l=>(l.then(u=>{let d=a+ ++r/e.length*(n-a);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 qA(e,t){t==null&&(t={});let a=t.fetchFunc==null?V().platform.fetch:t.fetchFunc,n=e.map(u=>a(u,t.requestInit,{isBinary:!0})),r=0,s=.5,i=(t.onProgress==null?await Promise.all(n):await Q5(n,t.onProgress,r,s)).map(u=>u.arrayBuffer()),o=.5,l=1;return t.onProgress==null?await Promise.all(i):await Q5(i,t.onProgress,o,l)}async function SC(e,t="",a,n){return XA(r=>qA(r,{requestInit:n}))(e,t,a)}function XA(e){return async(t,a="",n)=>{let r=t.map(()=>!1),s={},i=n!=null?n.map(()=>!1):[],o=[];if(t.forEach((h,f)=>{let m=0;h.weights.forEach(g=>{let y="quantization"in g?g.quantization.dtype:g.dtype,A=Jm[y]*yt(g.shape),x=()=>{r[f]=!0,s[f]==null&&(s[f]=[]),s[f].push({manifestEntry:g,groupOffset:m,sizeBytes:A})};n!=null?n.forEach((b,w)=>{b===g.name&&(x(),i[w]=!0)}):x(),o.push(g.name),m+=A})}),!i.every(h=>h)){let h=n.filter((f,m)=>!i[m]);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,f,m)=>(f&&h.push(m),h),[]),u=[];l.forEach(h=>{t[h].paths.forEach(f=>{let m=a+(a.endsWith("/")?"":"/")+f;u.push(m)})});let d=await e(u),c={},p=0;return l.forEach(h=>{let f=t[h].paths.length,m=0;for(let x=0;x{let b=g.slice(x.groupOffset,x.groupOffset+x.sizeBytes),w=OA(b,[x.manifestEntry]);for(let S in w)c[S]=w[S]}),p+=f}),c}}var TC="application/octet-stream",CC="application/json",o2=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=V().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 a=[{paths:["./model.weights.bin"],weights:e.weightSpecs}],n=DA(e,a);t.body.append("model.json",new Blob([JSON.stringify(n)],{type:CC}),"model.json"),e.weightData!=null&&t.body.append("model.weights.bin",new Blob([e.weightData],{type:TC}),"model.weights.bin");let r=await this.fetch(this.path,t);if(r.ok)return{modelArtifactsInfo:qd(e),responses:[r]};throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${r.status}.`)}async load(){let e=await this.fetch(this.path,this.requestInit);if(!e.ok)throw new Error(`Request to ${this.path} failed with status code ${e.status}. Please verify this URL points to the model JSON of the model to load.`);let t;try{t=await e.json()}catch(r){let s=`Failed to parse model JSON of response from ${this.path}.`;throw this.path.endsWith(".pb")?s+=" 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.":s+=" Please make sure the server is serving valid JSON for this request.",new Error(s)}let a=t.modelTopology,n=t.weightsManifest;if(a==null&&n==null)throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`);return s2(t,r=>this.loadWeights(r))}async loadWeights(e){let t=Array.isArray(this.path)?this.path[1]:this.path,[a,n]=NC(t),r=this.weightPathPrefix||a,s=LA(e),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+n);this.weightUrlConverter&&i.push(...await Promise.all(o));let l=await qA(i,{requestInit:this.requestInit,fetchFunc:this.fetch,onProgress:this.onProgress});return[s,r2(l)]}};o2.URL_SCHEME_REGEX=/^https?:\/\//;function NC(e){let t=e.lastIndexOf("/"),a=e.lastIndexOf("?"),n=e.substring(0,t),r=a>t?e.substring(a):"";return[n+"/",r]}function a1(e){return e.match(o2.URL_SCHEME_REGEX)!=null}var KA=(e,t)=>{if(typeof fetch=="undefined"&&(t==null||t.fetchFunc==null))return null;{let a=!0;if(Array.isArray(e)?a=e.every(n=>a1(n)):a=a1(e),a)return l2(e,t)}return null};Et.registerSaveRouter(KA);Et.registerLoadRouter(KA);function l2(e,t){return new o2(e,t)}function EC(e,t){return l2(e,t)}var Fm=class{constructor(e){this.modelArtifacts=e}load(){return this.modelArtifacts}},ZA=class{constructor(e){this.saveHandler=e}save(e){return this.saveHandler(e)}},RC=class{constructor(e){e.load&&(this.load=()=>Promise.resolve(e.load())),e.save&&(this.save=t=>Promise.resolve(e.save(t)))}};function MC(e,t,a,n){let r=arguments;return new RC(YA(...r))}function YA(e,t,a,n){return arguments.length===1?e.modelTopology!=null||e.weightSpecs!=null?new Fm(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 Fm({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 Fm({modelTopology:e,weightSpecs:t,weightData:a,trainingConfig:n}))}function $C(e){return new ZA(e)}function _C(e){return new ZA(e)}var JA={};He(JA,{confusionMatrix:()=>ZC});function FC(e,t,a=!1,n=!1){let r=R(e,"a","matMul"),s=R(t,"b","matMul");[r,s]=It(r,s);let i={a:r,b:s},o={transposeA:a,transposeB:n};return z.runKernel(gi,i,o)}var st=D({matMul_:FC});function PC(e,t,a=1,n=0,r="int32"){if(t<2)throw new Error(`Error in oneHot: depth must be >=2, but it is ${t}`);let s={indices:R(e,"indices","oneHot","int32")},i={dtype:r,depth:t,onValue:a,offValue:n};return z.runKernel(Rl,s,i)}var Tc=D({oneHot_:PC});function u2(){V().set("PROD",!0)}function OC(){V().set("DEBUG",!0)}function DC(){V().set("DEPRECATION_WARNINGS_ENABLED",!1),console.warn("TensorFlow.js deprecation warnings have been disabled.")}function d2(e){V().getBool("DEPRECATION_WARNINGS_ENABLED")&&console.warn(e+" You can disable deprecation warnings with tf.disableDeprecationWarnings().")}NT(d2);function zC(){z.disposeVariables()}function kt(){return z}function LC(){return z.memory()}function BC(e){return z.profile(e)}function Ee(e,t){return z.tidy(e,t)}function Y(e){t2(e).forEach(t=>t.dispose())}function qn(e){return z.keep(e)}function WC(e){return z.time(e)}function Xd(e){return z.setBackend(e)}function Kd(){return z.ready()}function ia(){return z.backendName}function VC(e){z.removeBackend(e)}function p2(e){return z.findBackend(e)}function GC(e){return z.findBackendFactory(e)}function uo(e,t,a=1){return z.registerBackend(e,t,a)}function tr(){return z.backend}function UC(e,t){V().setPlatform(e,t)}function jC(e){let t={input:R(e,"input","imag")};return z.runKernel(Cd,t)}var Zd=D({imag_:jC});function HC(e){let t={x:R(e,"x","neg")};return z.runKernel(Cl,t)}var Xn=D({neg_:HC});function qC(e){let t={input:R(e,"input","real")};return z.runKernel($d,t)}var rl=D({real_:qC});function XC(e,t,a){let n=R(e,"x","transpose");if(t==null&&(t=n.shape.map((i,o)=>o).reverse()),F(n.rank===t.length,()=>`Error in transpose: rank of input ${n.rank} must match length of perm ${t}.`),t.forEach(i=>{F(i>=0&&i`All entries in 'perm' must be between 0 and ${n.rank-1} but got ${t}`)}),n.rank<=1)return n.clone();let r={x:n},s={perm:t};return n.dtype==="complex64"?Ee(()=>{let i=rl(n),o=Zd(n);return i=z.runKernel(yr,{x:i},s),o=z.runKernel(yr,{x:o},s),a&&(o=Xn(o)),xr(i,o)}):z.runKernel(yr,r,s)}var si=D({transpose_:XC});function KC(e,t,a){let n=R(e,"labels","confusionMatrix"),r=R(t,"predictions","confusionMatrix");F(a==null||a>0&&Number.isInteger(a),()=>`If provided, numClasses must be a positive integer, but got ${a}`),F(n.rank===1,()=>`Expected the rank of labels to be 1, but got ${n.rank}`),F(r.rank===1,()=>`Expected the rank of predictions to be 1, but got ${r.rank}`),F(n.shape[0]===r.shape[0],()=>`Mismatch in the number of examples: ${n.shape[0]} vs. ${r.shape[0]}. Labels and predictions should have the same number of elements.`),F(a>0&&Number.isInteger(a),()=>`numClasses is required to be a positive integer, but got ${a}`);let s=Tc(Ue(n,"int32"),a),i=Tc(Ue(r,"int32"),a),o=si(s),l=st(o,i);return Ue(l,"int32")}var ZC=D({confusionMatrix_:KC}),po={};He(po,{assertAndGetBroadcastShape:()=>zt,getBroadcastDims:()=>QA,getReductionAxes:()=>c2});function QA(e,t){let a=e.length,n=[];for(let r=0;r1&&i===1&&n.unshift(s)}return n}function c2(e,t){let a=[];for(let n=0;n1)&&a.unshift(s)}return a}function zt(e,t){let a=[],n=Math.max(e.length,t.length);for(let r=0;rnN,fromPixelsAsync:()=>tN,toPixels:()=>aN});function h2(e,t,a){if(ci(e),t!=null&&t.length!==3)throw new Error("tensor3d() requires shape to have three numbers");let n=Yn(e,a);if(n.length!==3&&n.length!==1)throw new Error("tensor3d() requires values to be number[][][] or flat/TypedArray");if(n.length===1&&t==null)throw new Error("tensor3d() requires shape to be provided when `values` are a flat array");return xs(e,t,n,a)}var Us;function ex(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 a=!1,n=!1,r=!1,s=!1,i=!1,o=!1;if(e.data instanceof Uint8Array)a=!0;else if(typeof ImageData!="undefined"&&e instanceof ImageData)n=!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(kc(Yu,z.backendName)!=null){let p={pixels:e},h={numChannels:t};return z.runKernel(Yu,p,h)}let[l,u]=r?[e.videoWidth,e.videoHeight]:[e.width,e.height],d;if(i)d=e.getContext("2d").getImageData(0,0,l,u).data;else if(n||a)d=e.data;else if(s||r||o){if(Us==null)if(typeof document=="undefined")if(typeof OffscreenCanvas!="undefined"&&typeof OffscreenCanvasRenderingContext2D!="undefined")Us=new OffscreenCanvas(1,1).getContext("2d");else throw new Error("Cannot parse input in current context. Reason: OffscreenCanvas Context2D rendering is not supported.");else Us=document.createElement("canvas").getContext("2d",{willReadFrequently:!0});Us.canvas.width=l,Us.canvas.height=u,Us.drawImage(e,0,0,l,u),d=Us.getImageData(0,0,l,u).data}let c;if(t===4)c=new Int32Array(d);else{let p=l*u;c=new Int32Array(p*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(a.dtype!=="float32"&&a.dtype!=="int32")throw new Error(`Unsupported type for toPixels: ${a.dtype}. Please use float32 or int32 tensors.`);let i=await a.data(),o=a.dtype==="float32"?255:1,l=new Uint8ClampedArray(r*n*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(a.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[p]=h*o}let c=u*4;l[c+0]=Math.round(d[0]),l[c+1]=Math.round(d[1]),l[c+2]=Math.round(d[2]),l[c+3]=Math.round(d[3])}if(t!=null){t.width=r,t.height=n;let u=t.getContext("2d"),d=new ImageData(l,r,n);u.putImageData(d,0,0)}return a!==e&&a.dispose(),l}var nN=D({fromPixels_:ex}),f2={};He(f2,{prepareAndValidate:()=>tx});function tx(e,t){let a=e.shape.length,n=t.shape.length;if(a<1)throw new Error(`tf.gatherND() expects the input to be rank 1 or higher, but the rank was ${a}.`);if(n<1)throw new Error(`tf.gatherND() expects the indices to be rank 1 or higher, but the rank was ${n}.`);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[n-1]>a)throw new Error(`index innermost dimension length must be <= tensor rank; saw: ${t.shape[n-1]} vs. ${a}`);if(yt(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 c=0;cc/u),1].slice(0,s);return[l,i,u,d]}var m2={};He(m2,{calculateShapes:()=>ax,validateInput:()=>y2,validateUpdateShape:()=>g2});function g2(e,t,a){let n=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: ${a.shape}, indices.shape: ${t.shape}, shape: ${e}, sliceDim: ${n}, and batchDim: ${r}.`;if(a.rank1?t.shape[n-1]:1,s=a.length,i=1;for(let c=r;csN,computeFlatOffset:()=>dN,computeOutShape:()=>oN,getNormalizedAxes:()=>lN,isSliceContinous:()=>uN,maskToAxes:()=>iN,parseSliceParams:()=>pN,sliceInfo:()=>cN,startForAxis:()=>ux,startIndicesWithElidedDims:()=>ix,stopForAxis:()=>dx,stopIndicesWithElidedDims:()=>ox,stridesForAxis:()=>lx,stridesWithElidedDims:()=>nx});var n1=-2,rN=-1;function sN(e,t,a){let n=e.shape.length;F(n===t.length,()=>`Error in slice${n}D: Length of begin ${t} must match the rank of the array (${n}).`),F(n===a.length,()=>`Error in slice${n}D: Length of size ${a} must match the rank of the array (${n}).`);for(let r=0;r`Error in slice${n}D: begin[${r}] + size[${r}] (${t[r]+a[r]}) would overflow input.shape[${r}] (${e.shape[r]})`)}function iN(e){let t=[],a=0;for(;e>0;)e&1&&t.push(a),e/=2,a++;return t}function oN(e,t,a){let n=[];for(let r=0;r0){let h=t[0],f=a+1;d=ix(i,h,f,n,e),c=ox(o,h,f,r,e),p=nx(s,h,f,e)}else for(let h=0;h-1)s[o]=0;else{let l=rx(t,a,o),u=n[l];e&1<-1)s[o]=Number.MAX_SAFE_INTEGER;else{let l=rx(t,a,o),u=n[l];e&1<0?i=Number.MIN_SAFE_INTEGER:i=Number.MAX_SAFE_INTEGER);let l=n[r];return i<0&&(i+=l),i=Zu(0,i,l-1),i}function dx(e,t,a,n,r,s){let i=t[r],o=a[r]||1;(e&1<0?i=Number.MAX_SAFE_INTEGER:i=Number.MIN_SAFE_INTEGER);let l=n[r];return i<0&&(i+=l),o>0?i=Zu(0,i,l):i=Zu(-1,i,l-1),i}function uN(e,t,a){let n=a.length;for(let r=0;r1){n=r;break}for(let r=n+1;r0||a[r]!==e[r])return!1;return!0}function dN(e,t){let a=e.length>0?e[e.length-1]:1;for(let n=0;n{F(i!==-1,()=>"slice() does not support negative begin indexing.")});let s;return a==null?s=new Array(r).fill(-1):typeof a=="number"?s=[a,...new Array(r-1).fill(-1)]:a.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]-n[o])),[n,s]}function cN(e,t,a,n,r,s,i,o,l){let u;if(n==null?(u=new Array(t.length),u.fill(1)):u=n,i!=null&&(i&i-1)!==0)throw new Error("Multiple ellipses in slice is not allowed.");let d=!1,c={dims:u.length,numAddAxisAfterEllipsis:0,begin:t.slice(),end:a.slice(),strides:u.slice(),beginMask:r,endMask:s,ellipsisMask:i,newAxisMask:o,shrinkAxisMask:l};for(let A=0;A0?0:-1,p.strides[A]>0?b:b-1];if(x&&p.strides[A]<=0)throw Error("only stride 1 allowed on non-range indexing.");m=m&&p.strides[A]===1;let C=!!(p.beginMask&1<=b)throw Error(`slice index ${p.begin[A]} of dimension ${A} out of bounds.`)}else p.begin[A]=ey(p.begin[A],0,p.strides[A],b,w,S),p.end[A]=ey(p.end[A],1,p.strides[A],b,w,S);let $=p.strides[A]===1&&p.begin[A]===0&&p.end[A]===b;h=h&&$,f=f&&(A===0&&p.strides[A]===1||$)}else h=h&&p.strides[A]===1&&C,f=f&&(A===0&&p.strides[A]===1||C);let N,_=!1;if(p.beginValid&&p.endValid?(N=p.end[A]-p.begin[A],_=!0):x?(N=1,_=!0):C&&b>=0&&(p.strides[A]<0?N=-b:N=b,_=!0),_){let $;N===0||N<0!=p.strides[A]<0?$=0:$=Math.trunc(N/p.strides[A])+(N%p.strides[A]!==0?1:0),g.push($)}else g.push(-1)}for(let A=0;A=0?y.push(g[x]):x===n1&&y.push(1)}return{finalShapeSparse:y.filter((A,x)=>p.finalShapeGatherIndices[x]!==n1),finalShape:y,isIdentity:h,sliceDim0:f,isSimpleSlice:m,begin:p.begin,end:p.end,strides:p.strides}}function hN(e,t){t.beginMask=0,t.endMask=0,t.shrinkAxisMask=0;let a=0;t.beginValid=e.begin!=null,t.endValid=e.end!=null,t.begin=new Array(t.dims),t.end=new Array(t.dims),t.strides=new Array(t.dims),t.finalShapeGatherIndices=[],t.finalShapeGatherIndicesSparse=[],t.inputShapeGatherIndicesSparse=new Array(t.dims);for(let n=0;n0?s[t]:s[t+1&1];{let i=e<0?n+e:e;return is[1]?s[1]:i}}var px={};He(px,{Serializable:()=>cx,SerializationMap:()=>Ks,registerClass:()=>bs});var cx=class{getClassName(){return this.constructor.className}static fromConfig(e,t){return new e(t)}},Ks=class{constructor(){this.classNameMap={}}static getMap(){return Ks.instance==null&&(Ks.instance=new Ks),Ks.instance}static register(e){Ks.getMap().classNameMap[e.className]=[e,e.fromConfig]}};function bs(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."),Ks.register(e)}var hx={};He(hx,{TEST_EPSILON_FLOAT16:()=>fx,createVideoElement:()=>vN,encodeStrings:()=>mx,expectArrayBuffersEqual:()=>bN,expectArraysClose:()=>mN,expectArraysEqual:()=>yN,expectNumbersClose:()=>AN,expectPromiseToFail:()=>gN,expectValuesInRange:()=>xN,play:()=>wN,testEpsilon:()=>A2});var fN=.001,fx=.1;function mN(e,t,a){return a==null&&(a=A2()),r1(e,t,(n,r)=>x2(n,r,a))}function A2(){return z.backend.floatPrecision()===32?fN:fx}function r1(e,t,a){let n=!0;if((da(e)||da(t))&&(n=!1),da(e)&&da(t)&&(n=!0),n){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=Yn(e),o=Yn(t);if(!Jr(i,o))throw new Error(`Arrays have different shapes. Actual: [${i}]. Expected: [${o}]`)}let r=da(e)?e:ai(e),s=da(t)?t:ai(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()),typeof expect!="undefined"&&expect().nothing()}function yN(e,t){let a=typeof t=="string"||typeof t=="number"||typeof t=="boolean"?[t]:t;return zr(e)||zr(e[0])||zr(t)||zr(t[0])?r1(e,a,(n,r)=>n==r):r1(e,t,(n,r)=>x2(n,r,0))}function AN(e,t,a){if(a==null&&(a=A2()),!x2(e,t,a))throw new Error(`Numbers differ: actual === ${e}, expected === ${t}`);typeof expect!="undefined"&&expect().nothing()}function x2(e,t,a){return!isFinite(e)&&!isFinite(t)?!0:!(isNaN(e)||isNaN(t)||Math.abs(e-t)>a)}function xN(e,t,a){for(let n=0;na)throw new Error(`Value out of range:${e[n]} low: ${t}, high: ${a}`)}function bN(e,t){let a=new Float32Array(e),n=new Float32Array(t);if(a.length!==n.length)throw new Error(`Expected ArrayBuffer to be of length ${n.length}, but it was ${a.length}`);for(let r=0;r{t.addEventListener("loadeddata",n=>a(t)),t.load()})}async function wN(e){await e.play(),"requestVideoFrameCallback"in e&&await new Promise(t=>{e.requestVideoFrameCallback(t)})}var b2="4.0.0";function kN(e,t){let a=R(e,"a","add"),n=R(t,"b","add");[a,n]=It(a,n);let r={a,b:n};return z.runKernel(vr,r)}var xe=D({add_:kN});function IN(e,t){let a=R(e,"a","floorDiv"),n=R(t,"b","floorDiv");[a,n]=It(a,n);let r={a,b:n};return z.runKernel(Mi,r)}var Yd=D({floorDiv_:IN});function SN(e,t){let a=R(e,"a","div"),n=R(t,"b","div");if([a,n]=It(a,n),a.dtype==="int32"&&n.dtype==="int32")return Yd(a,n);let r={a,b:n},s={};return z.runKernel(Ci,r,s)}var fe=D({div_:SN});function TN(e,t){let a=R(e,"a","mul"),n=R(t,"b","mul");[a,n]=It(a,n);let r={a,b:n};return z.runKernel(ps,r)}var ae=D({mul_:TN});function CN(e){let t=R(e,"x","abs");if(t.dtype==="complex64"){let a={x:t};return z.runKernel(Hc,a)}else{let a={x:t};return z.runKernel(gl,a)}}var Ha=D({abs_:CN});function NN(e){let t={x:R(e,"x","acos")};return z.runKernel(yd,t)}var gx=D({acos_:NN});function EN(e){let t={x:R(e,"x","acosh")};return z.runKernel(Ad,t)}var yx=D({acosh_:EN});function RN(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)=>R(r,`tensors${s}`,"addN")),a=t[0];t.forEach(r=>{if(r.dtype!==a.dtype)throw new Error("All tensors passed to tf.addN() must have the same dtype")}),t.forEach(r=>{if(!Jr(r.shape,a.shape))throw new Error("All tensors passed to tf.addN() must have the same shape")});let n=t;return z.runKernel(hi,n)}var mh=D({addN_:RN});function MN(e,t=null,a=!1){let n={x:R(e,"x","all","bool")},r={axis:t,keepDims:a};return z.runKernel(yl,n,r)}var Ax=D({all_:MN});function $N(e,t=null,a=!1){let n={x:R(e,"x","any","bool")},r={axis:t,keepDims:a};return z.runKernel(Al,n,r)}var xx=D({any_:$N});function _N(e,t=0){let a={x:R(e,"x","argMax")},n={axis:t};return z.runKernel(fi,a,n)}var ar=D({argMax_:_N});function FN(e,t=0){let a={x:R(e,"x","argMin")},n={axis:t};return z.runKernel(xd,a,n)}var bx=D({argMin_:FN});function PN(e){let t={x:R(e,"x","asin")};return z.runKernel(bd,t)}var vx=D({asin_:PN});function ON(e){let t={x:R(e,"x","asinh")};return z.runKernel(vd,t)}var wx=D({asinh_:ON});function DN(e){let t={x:R(e,"x","atan")};return z.runKernel(wd,t)}var kx=D({atan_:DN});function zN(e,t){let a=R(e,"a","atan2"),n=R(t,"b","atan2");[a,n]=It(a,n);let r={a,b:n};return z.runKernel(xl,r)}var Ix=D({atan2_:zN});function LN(e){let t={x:R(e,"x","atanh")};return z.runKernel(kd,t)}var Sx=D({atanh_:LN});function BN(e,t,a,n,r="NHWC",s){let i=e[3],o=[...t,i],l=Nx(r);return Jd(e,o,a,s,n,null,null,l)}function Tx(e,t,a,n,r,s,i="channelsLast"){let[o,l]=Cc(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 Jd(e,u,a,n,r,s,!1,i)}function WN(e,t,a,n,r,s,i="NDHWC"){let[o,l,u]=s1(t),d,c;if(i==="NDHWC")c="channelsLast",d=[o,l,u,e[4],e[4]];else if(i==="NCDHW")c="channelsFirst",d=[o,l,u,e[1],e[1]];else throw new Error(`Unknown dataFormat ${i}`);return Cx(e,d,a,n,r,!1,c,s)}function Jd(e,t,a,n,r,s,i=!1,o="channelsLast"){let[l,u,d,c]=[-1,-1,-1,-1];if(o==="channelsLast")[l,u,d,c]=e;else if(o==="channelsFirst")[l,c,u,d]=e;else throw new Error(`Unknown dataFormat ${o}`);let[p,h,,f]=t,[m,g]=Cc(a),[y,A]=Cc(n),x=Qo(p,y),b=Qo(h,A),{padInfo:w,outHeight:S,outWidth:C}=UN(r,u,d,m,g,x,b,s,o),N=i?f*c:f,_;return o==="channelsFirst"?_=[l,N,S,C]:o==="channelsLast"&&(_=[l,S,C,N]),{batchSize:l,dataFormat:o,inHeight:u,inWidth:d,inChannels:c,outHeight:S,outWidth:C,outChannels:N,padInfo:w,strideHeight:m,strideWidth:g,filterHeight:p,filterWidth:h,effectiveFilterHeight:x,effectiveFilterWidth:b,dilationHeight:y,dilationWidth:A,inShape:e,outShape:_,filterShape:t}}function Cx(e,t,a,n,r,s=!1,i="channelsLast",o){let[l,u,d,c,p]=[-1,-1,-1,-1,-1];if(i==="channelsLast")[l,u,d,c,p]=e;else if(i==="channelsFirst")[l,p,u,d,c]=e;else throw new Error(`Unknown dataFormat ${i}`);let[h,f,m,,g]=t,[y,A,x]=s1(a),[b,w,S]=s1(n),C=Qo(h,b),N=Qo(f,w),_=Qo(m,S),{padInfo:$,outDepth:M,outHeight:I,outWidth:E}=jN(r,u,d,c,y,A,x,C,N,_,o),O=s?g*p:g,L;return i==="channelsFirst"?L=[l,O,M,I,E]:i==="channelsLast"&&(L=[l,M,I,E,O]),{batchSize:l,dataFormat:i,inDepth:u,inHeight:d,inWidth:c,inChannels:p,outDepth:M,outHeight:I,outWidth:E,outChannels:O,padInfo:$,strideDepth:y,strideHeight:A,strideWidth:x,filterDepth:h,filterHeight:f,filterWidth:m,effectiveFilterDepth:C,effectiveFilterHeight:N,effectiveFilterWidth:_,dilationDepth:b,dilationHeight:w,dilationWidth:S,inShape:e,outShape:L,filterShape:t}}function VN(e,t,a,n,r){n==null&&(n=v2(e,t,a));let s=e[0],i=e[1],o=Qs((s-t+2*n)/a+1,r),l=Qs((i-t+2*n)/a+1,r);return[o,l]}function GN(e,t,a,n,r,s){r==null&&(r=v2(e,t,n));let i=e[0],o=e[1],l=e[2],u=Qs((i-t+2*r)/n+1,s),d=Qs((o-t+2*r)/n+1,s),c=Qs((l-t+2*r)/n+1,s);return[u,d,c,a]}function v2(e,t,a,n=1){let r=Qo(t,n);return Math.floor((e[0]*(a-1)-a+r)/2)}function Cc(e){return typeof e=="number"?[e,e,e]:e.length===2?[e[0],e[1],1]:e}function s1(e){return typeof e=="number"?[e,e,e]:e}function Qo(e,t){return t<=1?e:e+(e-1)*(t-1)}function UN(e,t,a,n,r,s,i,o,l){let u,d,c;if(typeof e=="number"){u={top:e,bottom:e,left:e,right:e,type:e===0?"VALID":"NUMBER"};let p=VN([t,a],s,n,e,o);d=p[0],c=p[1]}else if(e==="same"){d=Math.ceil(t/n),c=Math.ceil(a/r);let p=Math.max(0,(d-1)*n+s-t),h=Math.max(0,(c-1)*r+i-a),f=Math.floor(p/2),m=p-f,g=Math.floor(h/2),y=h-g;u={top:f,bottom:m,left:g,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)/n),c=Math.ceil((a-i+1)/r);else if(typeof e=="object"){let p=l==="channelsLast"?e[1][0]:e[2][0],h=l==="channelsLast"?e[1][1]:e[2][1],f=l==="channelsLast"?e[2][0]:e[3][0],m=l==="channelsLast"?e[2][1]:e[3][1];u={top:p,bottom:h,left:f,right:m,type:p===0&&h===0&&f===0&&m===0?"VALID":"EXPLICIT"},d=Qs((t-s+p+h)/n+1,o),c=Qs((a-i+f+m)/r+1,o)}else throw Error(`Unknown padding parameter: ${e}`);return{padInfo:u,outHeight:d,outWidth:c}}function jN(e,t,a,n,r,s,i,o,l,u,d){let c,p,h,f;if(typeof e=="number"){c={top:e,bottom:e,left:e,right:e,front:e,back:e,type:e===0?"VALID":"NUMBER"};let m=GN([t,a,n,1],o,1,r,e,d);p=m[0],h=m[1],f=m[2]}else if(e==="same"){p=Math.ceil(t/r),h=Math.ceil(a/s),f=Math.ceil(n/i);let m=(p-1)*r+o-t,g=(h-1)*s+l-a,y=(f-1)*i+u-n,A=Math.floor(m/2),x=m-A,b=Math.floor(g/2),w=g-b,S=Math.floor(y/2),C=y-S;c={top:b,bottom:w,left:S,right:C,front:A,back:x,type:"SAME"}}else if(e==="valid")c={top:0,bottom:0,left:0,right:0,front:0,back:0,type:"VALID"},p=Math.ceil((t-o+1)/r),h=Math.ceil((a-l+1)/s),f=Math.ceil((n-u+1)/i);else throw Error(`Unknown padding parameter: ${e}`);return{padInfo:c,outDepth:p,outHeight:h,outWidth:f}}function Qs(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 nd(e){let[t,a,n]=Cc(e);return t===1&&a===1&&n===1}function kr(e,t){return nd(e)||nd(t)}function Nx(e){if(e==="NHWC")return"channelsLast";if(e==="NCHW")return"channelsFirst";throw new Error(`Unknown dataFormat ${e}`)}function Sn(e,t,a){if(a!=null){if(typeof t=="string")throw Error(`Error in ${e}: pad must be an integer when using dimRoundingMode ${a} but got pad ${t}.`);if(typeof t=="number")F(tl(t),()=>`Error in ${e}: pad must be an integer when using dimRoundingMode ${a} but got pad ${t}.`);else if(typeof t=="object")t.forEach(n=>{n.forEach(r=>{F(tl(r),()=>`Error in ${e}: pad must be an integer when using dimRoundingMode ${a} but got pad ${r}.`)})});else throw Error(`Error in ${e}: Unknown padding parameter: ${t}`)}}function HN(e,t){let a={x:R(e,"x","reshape","string_or_numeric")},n={shape:t};return z.runKernel(Fl,a,n)}var J=D({reshape_:HN});function qN(e,t,a,n,r){let s=R(e,"x","avgPool","float32"),i=1;F(kr(a,i),()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${a} and dilations '${i}'`);let o=s,l=!1;s.rank===3&&(l=!0,o=J(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}.`),Sn("avgPool",n,r);let u={x:o},d={filterSize:t,strides:a,pad:n,dimRoundingMode:r},c=z.runKernel(mi,u,d);return c=Ue(c,s.dtype),l?J(c,[c.shape[1],c.shape[2],c.shape[3]]):c}var w2=D({avgPool_:qN});function XN(e,t,a,n,r,s="NDHWC"){let i=R(e,"x","avgPool3d","float32"),o=i,l=!1;i.rank===4&&(l=!0,o=J(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}`),Sn("avgPool3d",n,r);let u={x:o},d={filterSize:t,strides:a,pad:n,dimRoundingMode:r,dataFormat:s},c=z.runKernel(Gc,u,d);return c=Ue(c,o.dtype),l?J(c,[c.shape[1],c.shape[2],c.shape[3],c.shape[4]]):c}var Ex=D({avgPool3d_:XN});function KN(e,t=0){F(e.length>=1,()=>"Pass at least one tensor to concat");let a=ad(e,"tensors","concat","string_or_numeric");if(a[0].dtype==="complex64"&&a.forEach(s=>{if(s.dtype!=="complex64")throw new Error(`Cannot concatenate complex64 tensors with a tensor + with dtype ${s.dtype}. `)}),a.length===1)return wa(a[0]);let n=a,r={axis:t};return z.runKernel(vl,n,r)}var at=D({concat_:KN});function ZN(e){let t={x:R(e,"x","sigmoid","float32")};return z.runKernel(fs,t)}var Da=D({sigmoid_:ZN});function YN(e,t,a){let n=R(e,"x","slice","string_or_numeric");if(n.rank===0)throw new Error("Slicing scalar is not possible");let r={x:n},s={begin:t,size:a};return z.runKernel(zl,r,s)}var _e=D({slice_:YN});function JN(e){let t={x:R(e,"x","tanh","float32")};return z.runKernel(ro,t)}var Nc=D({tanh_:JN});function QN(e,t,a,n,r,s){let i=R(e,"forgetBias","basicLSTMCell"),o=R(t,"lstmKernel","basicLSTMCell"),l=R(a,"lstmBias","basicLSTMCell"),u=R(n,"data","basicLSTMCell"),d=R(r,"c","basicLSTMCell"),c=R(s,"h","basicLSTMCell"),p=at([u,c],1),h=st(p,o),f=xe(h,l),m=f.shape[0],g=f.shape[1]/4,y=[m,g],A=_e(f,[0,0],y),x=_e(f,[0,g],y),b=_e(f,[0,g*2],y),w=_e(f,[0,g*3],y),S=xe(ae(Da(A),Nc(x)),ae(d,Da(xe(i,b)))),C=ae(Nc(S),Da(w));return[S,C]}var Rx=D({basicLSTMCell_:QN});function eE(e,t,a){let n=R(e,"x","batchToSpaceND"),r=t.reduce((o,l)=>o*l);F(n.rank>=1+t.length,()=>`input rank is ${n.rank} but should be > than blockShape.length ${t.length}`),F(a.length===t.length,()=>`crops.length is ${a.length} but should be equal to blockShape.length ${t.length}`),F(n.shape[0]%r===0,()=>`input tensor batch is ${n.shape[0]} but is not divisible by the product of the elements of blockShape ${t.join(" * ")} === ${r}`);let s={x:n},i={blockShape:t,crops:a};return z.runKernel(bl,s,i)}var k2=D({batchToSpaceND_:eE});function tE(e){let t;return e.rank===0||e.rank===1?t=J(e,[1,1,1,e.size]):e.rank===2?t=J(e,[1,1,e.shape[0],e.shape[1]]):e.rank===3?t=J(e,[1,e.shape[0],e.shape[1],e.shape[2]]):t=e,t}function aE(e,t,a,n,r,s){s==null&&(s=.001);let i=R(e,"x","batchNorm"),o=R(t,"mean","batchNorm"),l=R(a,"variance","batchNorm"),u;r!=null&&(u=R(r,"scale","batchNorm"));let d;n!=null&&(d=R(n,"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 c={x:tE(i),scale:u,offset:d,mean:o,variance:l},p={varianceEpsilon:s},h=z.runKernel($i,c,p);return J(h,i.shape)}var Qd=D({batchNorm_:aE});function nE(e,t,a,n,r,s){let i=R(e,"x","batchNorm"),o=R(t,"mean","batchNorm"),l=R(a,"variance","batchNorm"),u;r!=null&&(u=R(r,"scale","batchNorm"));let d;return n!=null&&(d=R(n,"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}.`),Qd(i,o,l,d,u,s)}var Mx=D({batchNorm2d_:nE});function rE(e,t,a,n,r,s){let i=R(e,"x","batchNorm"),o=R(t,"mean","batchNorm"),l=R(a,"variance","batchNorm"),u;r!=null&&(u=R(r,"scale","batchNorm"));let d;return n!=null&&(d=R(n,"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}.`),Qd(i,o,l,d,u,s)}var $x=D({batchNorm3d_:rE});function sE(e,t,a,n,r,s){let i=R(e,"x","batchNorm"),o=R(t,"mean","batchNorm"),l=R(a,"variance","batchNorm"),u;r!=null&&(u=R(r,"scale","batchNorm"));let d;return n!=null&&(d=R(n,"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}.`),Qd(i,o,l,d,u,s)}var _x=D({batchNorm4d_:sE});function iE(e,t,a){let n=R(e,"x","bincount"),r=R(t,"weights","bincount");F(n.dtype==="int32",()=>`Error in bincount: input dtype must be int32, but got ${n.dtype}`),F(a>=0,()=>`size must be non-negative, but got ${a}.`),F(r.size===n.size||r.size===0,()=>`Error in bincount: weights must have the same size as input or0-length, but got input shape: ${n.shape}, weights shape: ${r.shape}.`);let s={x:n,weights:r},i={size:a};return z.runKernel(Uc,s,i)}var I2=D({bincount_:iE});function oE(e,t){let a=R(e,"s0","broadcastArgs","int32"),n=R(t,"s1","broadcastArgs","int32");if(a.rank!==1)throw new Error(`broadcastArgs(): first input must be a vector (rank=1). Has rank ${a.rank}`);if(n.rank!==1)throw new Error(`broadcastArgs(): second input must be a vector (rank=1). Has rank ${n.rank}`);let r={s0:a,s1:n};return z.runKernel(jc,r)}var Fx=D({broadcastArgs_:oE});function lE(e,t){let a=R(e,"broadcastTo","x"),n=a.shape;if(t.some(l=>!(l>0)||l%1!==0))throw new Error(`broadcastTo(): Invalid broadcast shape [${t}].`);if(t.lengtha.rank){let l=a.shape.slice();for(;l.length=0;l--)if(r[l]===t[l])s[l]=1;else if(a.shape[l]!==1)throw new Error(`broadcastTo(): [${n}] cannot be broadcast to [${t}].`);if(s.map((l,u)=>l>1?u:-1).filter(l=>l>=0).length===0)return wa(a);let i={x:a},o={reps:s};return z.runKernel(As,i,o)}var ei=D({broadcastTo_:lE});function uE(e){let t={x:R(e,"x","ceil","float32")};return z.runKernel(Qr,t)}var Px=D({ceil_:uE});function nr(e,t,a){let n={shape:e,value:t,dtype:a};return z.runKernel(kl,{},n)}function dE(e,t,a){let n=R(e,"x","clipByValue");if(F(t<=a,()=>`Error in clip: min (${t}) must be less than or equal to max (${a}).`),t===a)return nr(n.shape,t,n.dtype);let r={x:n},s={clipValueMin:t,clipValueMax:a};return z.runKernel(es,r,s)}var Ox=D({clipByValue_:dE});function pE(e){return at(e,0)}var Dx=D({concat1d_:pE});function cE(e,t){return at(e,t)}var ql=D({concat2d_:cE});function hE(e,t){return at(e,t)}var zx=D({concat3d_:hE});function fE(e,t){return at(e,t)}var Lx=D({concat4d_:fE});function mE(e,t,a,n,r="NHWC",s=[1,1],i){let o=R(e,"x","conv2d","float32"),l=R(t,"filter","conv2d","float32"),u=o,d=!1;o.rank===3&&(d=!0,u=J(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}.`),Sn("conv2d",n,i);let c=r==="NHWC"?u.shape[3]:u.shape[1];F(c===l.shape[2],()=>`Error in conv2d: depth of input (${c}) must match input depth for filter ${l.shape[2]}.`),F(kr(a,s),()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${a} and dilations '${s}'`);let p={x:u,filter:l},h={strides:a,pad:n,dataFormat:r,dilations:s,dimRoundingMode:i},f=z.runKernel(Ai,p,h);return d?J(f,[f.shape[1],f.shape[2],f.shape[3]]):f}var ep=D({conv2d_:mE});function gE(e,t,a,n,r="NWC",s=1,i){let o=R(e,"x","conv1d"),l=R(t,"filter","conv1d"),u=o,d=!1;o.rank===2&&(d=!0,u=J(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}.`),Sn("conv1d",n,i),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(kr(a,s),()=>`Error in conv1D: Either stride or dilation must be 1. Got stride ${a} and dilation '${s}'`),F(r==="NWC",()=>`Error in conv1d: got dataFormat of ${r} but only NWC is currently supported.`);let c=J(l,[1,l.shape[0],l.shape[1],l.shape[2]]),p=J(u,[u.shape[0],1,u.shape[1],u.shape[2]]),h=ep(p,c,[1,a],n,"NHWC",[1,s],i);return d?J(h,[h.shape[2],h.shape[3]]):J(h,[h.shape[0],h.shape[2],h.shape[3]])}var Bx=D({conv1d_:gE});function yE(e,t,a,n,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=J(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(a.rank===4,()=>`Error in conv2dDerInput: filter must be rank 4, but got rank ${a.rank}`);let d=s==="NHWC"?o[3]:o[1],c=s==="NHWC"?l.shape[3]:l.shape[1];F(d===a.shape[2],()=>`Error in conv2dDerInput: depth of input (${d}) must match input depth for filter ${a.shape[2]}.`),F(c===a.shape[3],()=>`Error in conv2dDerInput: depth of output (${c}) must match output depth for filter ${a.shape[3]}.`),Sn("conv2dDerInput",r,i);let p={dy:l,filter:a},h={strides:n,pad:r,dataFormat:s,dimRoundingMode:i,inputShape:o},f=z.runKernel(xi,p,h);return u?J(f,[f.shape[1],f.shape[2],f.shape[3]]):f}var Wx=D({conv2DBackpropInput_:yE});function AE(e,t,a,n,r,s){let i=R(e,"x","conv2dTranspose"),o=R(t,"filter","conv2dTranspose");return Wx(a,i,o,n,r,"NHWC",s)}var Vx=D({conv2dTranspose_:AE});function xE(e,t,a,n,r="NDHWC",s=[1,1,1]){let i=R(e,"x","conv3d"),o=R(t,"filter","conv3d"),l=i,u=!1;i.rank===4&&(u=!0,l=J(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(kr(a,s),()=>`Error in conv3D: Either strides or dilations must be 1. Got strides ${a} 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},c={strides:a,pad:n,dataFormat:r,dilations:s},p=z.runKernel(Xc,d,c);return u?J(p,[p.shape[1],p.shape[2],p.shape[3],p.shape[4]]):p}var Gx=D({conv3d_:xE});function bE(e,t,a,n,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=J(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(a.rank===5,()=>`Error in conv3dDerInput: filter must be rank 5, but got rank ${a.rank}`),F(l===a.shape[3],()=>`Error in conv3dDerInput: depth of input (${l}) must match input depth for filter ${a.shape[3]}.`),F(u===a.shape[4],()=>`Error in conv3dDerInput: depth of output (${u}) must match output depth for filter ${a.shape[4]}.`);let d={dy:i,filter:a},c={pad:r,strides:n,inputShape:s},p=z.runKernel(Kc,d,c);return o?J(p,[p.shape[1],p.shape[2],p.shape[3],p.shape[4]]):p}var vE=D({conv3DBackpropInput_:bE});function wE(e,t,a,n,r){let s=R(e,"x","conv3dTranspose"),i=R(t,"filter","conv3dTranspose");return vE(a,s,i,n,r)}var Ux=D({conv3dTranspose_:wE});function kE(e){let t={x:R(e,"x","cos","float32")};return z.runKernel(bi,t)}var jx=D({cos_:kE});function IE(e){let t={x:R(e,"x","cosh","float32")};return z.runKernel(vi,t)}var Hx=D({cosh_:IE});function SE(e,t=0,a=!1,n=!1){let r={x:R(e,"x","cumprod")},s={axis:t,exclusive:a,reverse:n};return z.runKernel(wi,r,s)}var qx=D({cumprod_:SE});function TE(e,t=0,a=!1,n=!1){let r={x:R(e,"x","cumsum")},s={axis:t,exclusive:a,reverse:n};return z.runKernel(ki,r,s)}var Xx=D({cumsum_:TE});function CE(e,t,a,n=!1){let r=R(e,"x","denseBincount"),s=R(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(a>=0,()=>`size must be non-negative, but got ${a}.`),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:a,binaryOutput:n};return z.runKernel(Zc,i,o)}var Kx=D({denseBincount_:CE});function NE(e,t,a="NHWC"){let n=R(e,"x","depthToSpace","float32"),r=a==="NHWC"?n.shape[1]:n.shape[2],s=a==="NHWC"?n.shape[2]:n.shape[3],i=a==="NHWC"?n.shape[3]:n.shape[1];F(t>1,()=>`blockSize should be > 1 for depthToSpace, but was: ${t}`),F(r*t>=0,()=>`Negative dimension size caused by overflow when multiplying + ${r} and ${t} for depthToSpace with input shape + ${n.shape}`),F(s*t>=0,()=>`Negative dimension size caused by overflow when multiplying + ${s} and ${t} for depthToSpace with input shape + ${n.shape}`),F(i%(t*t)===0,()=>`Dimension size must be evenly divisible by ${t*t} but is ${i} for depthToSpace with input shape ${n.shape}`);let o={x:n},l={blockSize:t,dataFormat:a};return z.runKernel(Si,o,l)}var Zx=D({depthToSpace_:NE});function EE(e,t,a,n,r="NHWC",s=[1,1],i){let o=R(e,"x","depthwiseConv2d","float32"),l=R(t,"filter","depthwiseConv2d","float32"),u=o,d=!1;o.rank===3&&(d=!0,u=J(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}.`);let c=r==="NHWC"?u.shape[3]:u.shape[1];F(c===l.shape[2],()=>`Error in depthwiseConv2d: number of input channels (${c}) must match the inChannels dimension in filter ${l.shape[2]}.`),Sn("depthwiseConv2d",n,i);let p={x:u,filter:l},h={strides:a,pad:n,dataFormat:r,dilations:s,dimRoundingMode:i},f=z.runKernel(Ti,p,h);return d?J(f,[f.shape[1],f.shape[2],f.shape[3]]):f}var gh=D({depthwiseConv2d_:EE});function RE(e){let t={x:R(e,"x","diag")};return z.runKernel(Qc,t)}var Yx=D({diag_:RE});function ME(e,t,a,n,r=[1,1],s="NHWC"){let i=R(e,"x","dilation2d"),o=R(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=J(i,[1,i.shape[0],i.shape[1],i.shape[2]]),u=!0);let d={x:l,filter:o},c={strides:a,pad:n,dilations:r},p=z.runKernel(eh,d,c);return u?J(p,[p.shape[1],p.shape[2],p.shape[3]]):p}var Jx=D({dilation2d_:ME});function $E(e,t){let a=R(e,"a","equal","string_or_numeric"),n=R(t,"b","equal","string_or_numeric");[a,n]=It(a,n),zt(a.shape,n.shape);let r={a,b:n};return z.runKernel(ts,r)}var S2=D({equal_:$E});function _E(e,t,a){let n=R(t,"a","where"),r=R(a,"b","where"),s=R(e,"condition","where","bool"),i=zt(zt(s.shape,n.shape),r.shape),o=ei(s,i),l=ei(n,i),u=ei(r,i),d={condition:o,t:l,e:u};return z.runKernel(Dl,d)}var ii=D({where_:_E});function FE(e){let t={x:R(e,"x","zerosLike")};return z.runKernel(Hl,t)}var Xa=D({zerosLike_:FE});function PE(e,t){let a=R(e,"a","div"),n=R(t,"b","div");[a,n]=It(a,n);let r=fe(a,n),s=Xa(r),i=S2(n,s);return ii(i,s,r)}var Qx=D({divNoNan_:PE});function OE(e,t){let a=R(e,"t1","dot"),n=R(t,"t2","dot");F((a.rank===1||a.rank===2)&&(n.rank===1||n.rank===2),()=>`Error in dot: inputs must all be rank 1 or 2, but got ranks ${a.rank} and ${n.rank}.`);let r=a.rank===1?a.size:a.shape[1],s=n.rank===1?n.size:n.shape[0];if(F(r===s,()=>`Error in dot: inner dimensions of inputs must match, but got ${r} and ${s}.`),a.rank===1&&n.rank===1){let i=J(a,[1,-1]),o=J(n,[-1,1]),l=st(i,o);return J(l,[])}else if(a.rank===1&&n.rank===2){let i=J(a,[1,-1]),o=J(n,[n.shape[0],n.shape[1]]),l=st(i,o);return J(l,[l.size])}else if(a.rank===2&&n.rank===1){let i=J(n,[-1,1]),o=st(a,i);return J(o,[o.size])}else{let i=J(n,[n.shape[0],n.shape[1]]);return st(a,i)}}var eb=D({dot_:OE});function DE(e,...t){let a=t.map((r,s)=>R(r,`tensors${s}`,"einsum")),n={equation:e};return z.runKernel(Sd,a,n)}var tb=D({einsum_:DE});function zE(e){let t={x:R(e,"x","elu","float32")};return z.runKernel(Ni,t)}var T2=D({elu_:zE});function LE(e){let t=R(e,"x","erf");F(t.dtype==="int32"||t.dtype==="float32",()=>"Input dtype must be `int32` or `float32`."),t.dtype==="int32"&&(t=Ue(t,"float32"));let a={x:t};return z.runKernel(Td,a)}var ab=D({erf_:LE});function C2(e,t){for(let a=0;ae[s]);return[a,r]}function tp(e,t){let a=t.map(n=>1);return nb(e,a,t)}function WE(e,t,a){F(C2(t,a),()=>`${e} supports only inner-most axes for now. Got axes ${t} and rank-${a} input.`)}function VE(e,t){if(C2(e,t))return null;let a=[];for(let n=0;na.push(n)),a}function GE(e){return e.map((t,a)=>[a,t]).sort((t,a)=>t[1]-a[1]).map(t=>t[0])}function UE(e,t){let a=[];for(let n=t-e;n"Axis must be <= rank of the tensor");let n={input:a},r={dim:t};return z.runKernel(wl,n,r)}var Gt=D({expandDims_:eR});function tR(e){let t={x:R(e,"x","expm1")};return z.runKernel(Ei,t)}var ib=D({expm1_:tR});function aR(e,t){let a=R(e,"x","tile","string_or_numeric");F(a.rank===t.length,()=>`Error in transpose: rank of input ${a.rank} must match length of reps ${t}.`);let n={x:a},r={reps:t};return z.runKernel(As,n,r)}var Vr=D({tile_:aR});function nR(e,t,a,n="float32"){t==null&&(t=e);let r=ve([e,t],n),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(tl(t),()=>`Error in localResponseNormalization: depthRadius must be an integer but got depthRadius ${t}.`);let i=s,o=!1;s.rank===3&&(o=!0,i=J(s,[1,s.shape[0],s.shape[1],s.shape[2]]));let l={x:i},u={depthRadius:t,bias:a,alpha:n,beta:r},d=z.runKernel(rh,l,u);return o?J(d,[d.shape[1],d.shape[2],d.shape[3]]):d}var cb=D({localResponseNormalization_:fR});function mR(e){let t={x:R(e,"x","log","float32")};return z.runKernel(ls,t)}var il=D({log_:mR});function gR(e){let t={x:R(e,"x","log1p")};return z.runKernel(Rd,t)}var _2=D({log1p_:gR});function yR(e){return F(Gr(e),()=>"The f passed in grad(f) must be a function"),(t,a)=>{let n=R(t,"x","tf.grad","string_or_numeric"),r=a!=null?R(a,"dy","tf.grad"):null;return z.tidy(()=>{let{value:s,grads:i}=z.gradients(()=>e(n),[n],r);return r!=null&&Sa(s.shape,r.shape,"The shape of dy passed in grad(f)(x, dy) must match the shape returned by f(x)"),Ah(i),i[0]})}}function AR(e){return F(Gr(e),()=>"The f passed in grads(f) must be a function"),(t,a)=>{F(Array.isArray(t),()=>"The args passed in grads(f)(args) must be an array of `Tensor`s or `TensorLike`s");let n=ad(t,"args","tf.grads","string_or_numeric"),r=a!=null?R(a,"dy","tf.grads"):null;return z.tidy(()=>{let{value:s,grads:i}=z.gradients(()=>e(...n),n,r);return r!=null&&Sa(s.shape,r.shape,"The shape of dy passed in grads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),Ah(i),i})}}function xR(e){return F(Gr(e),()=>"The f passed in valueAndGrad(f) must be a function"),(t,a)=>{F(t instanceof dt,()=>"The x passed in valueAndGrad(f)(x) must be a tensor"),F(a==null||a instanceof dt,()=>"The dy passed in valueAndGrad(f)(x, dy) must be a tensor");let{grads:n,value:r}=z.gradients(()=>e(t),[t],a);return Ah(n),{grad:n[0],value:r}}}function bR(e){return F(Gr(e),()=>"The f passed in valueAndGrads(f) must be a function"),(t,a)=>{F(Array.isArray(t)&&t.every(r=>r instanceof dt),()=>"The args passed in valueAndGrads(f)(args) must be array of tensors"),F(a==null||a instanceof dt,()=>"The dy passed in valueAndGrads(f)(args, dy) must be a tensor");let n=z.gradients(()=>e(...t),t,a);return a!=null&&Sa(n.value.shape,a.shape,"The shape of dy passed in valueAndGrads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),Ah(n.grads),n}}function hb(e,t){F(Gr(e),()=>"The f passed in variableGrads(f) must be a function"),F(t==null||Array.isArray(t)&&t.every(u=>u instanceof ed),()=>"The varList passed in variableGrads(f, varList) must be an array of variables");let a=t!=null;if(!a){t=[];for(let u in z.registeredVariables)t.push(z.registeredVariables[u])}let n=a?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}=z.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])}),n!=null&&n.forEach(u=>l[u.name]=null),{value:i,grads:l}}function Qn(e){return z.customGrad(e)}function Ah(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 vR(e){let t={x:R(e,"x","softplus")};return z.runKernel(Pd,t)}var F2=D({softplus_:vR});function wR(e){let t=R(e,"x","logSigmoid");return Qn(a=>({value:Xn(F2(Xn(a))),gradFunc:n=>ae(n,Da(Xn(a)))}))(t)}var fb=D({logSigmoid_:wR});function kR(e,t){let a=R(e,"a","sub"),n=R(t,"b","sub");[a,n]=It(a,n);let r={a,b:n};return z.runKernel(ys,r)}var he=D({sub_:kR});function IR(e,t=-1){let a=R(e,"logits","logSoftmax");if(t===-1&&(t=a.rank-1),t!==a.rank-1)throw Error(`Log Softmax along a non-last dimension is not yet supported. Logits was rank ${a.rank} and axis was ${t}`);return Qn((n,r)=>{let s=pa(n,t,!0),i=he(n,s),o=he(Ue(i,"float32"),il(tt(Xr(i),t,!0)));return r([o]),{value:o,gradFunc:(l,u)=>{let[d]=u,c=!0,p=Xr(d);return he(l,ae(tt(l,t,c),p))}}})(a)}var mb=D({logSoftmax_:IR});function SR(e,t=null,a=!1){let n=R(e,"x","logSumExp"),r=gd(t,n.shape),s=pa(n,r,!0),i=he(n,s),o=Xr(i),l=tt(o,r),u=il(l),d=xe(J(s,u.shape),u);if(a){let c=tp(d.shape,r);return J(d,c)}return d}var P2=D({logSumExp_:SR});function TR(e,t){let a=R(e,"a","logicalAnd","bool"),n=R(t,"b","logicalAnd","bool");zt(a.shape,n.shape);let r={a,b:n};return z.runKernel(Oi,r)}var rd=D({logicalAnd_:TR});function CR(e){let t={x:R(e,"x","logicalNot","bool")};return z.runKernel(Di,t)}var O2=D({logicalNot_:CR});function NR(e,t){let a=R(e,"a","logicalOr","bool"),n=R(t,"b","logicalOr","bool");zt(a.shape,n.shape);let r={a,b:n};return z.runKernel(Tl,r)}var D2=D({logicalOr_:NR});function ER(e,t){let a=R(e,"a","logicalXor","bool"),n=R(t,"b","logicalXor","bool");return zt(a.shape,n.shape),rd(D2(e,t),O2(rd(e,t)))}var gb=D({logicalXor_:ER}),sc=2147483648;function RR(e,t,a="left"){let n=R(e,"sortedSequence","searchSorted"),r=R(t,"values","searchSorted"),s=n.shape[n.shape.length-1],i=r.shape[r.shape.length-1],o=J(n,[-1,s]),l=J(r,[-1,i]);if(o.rank<2)throw new Error("Sorted input argument must be at least 2-dimensional");if(o.shape[0]!==l.shape[0])throw new Error("Leading dimension of 'sortedSequence' and 'values' must match.");if(yt(l.shape)>=sc)throw new Error(`values tensor size must less than ${sc}`);if(o.shape[1]>=sc)throw new Error(`trailing dim_size must less than ${sc} for int32 output type, was ${o.shape[1]}`);let u={sortedSequence:o,values:l},d={side:a};return z.runKernel(ph,u,d)}var xh=D({searchSorted_:RR});function yb(e,t){return xh(e,t,"left")}function MR(e,t,a,n,r){let s=R(e,"x","maxPool"),i=1,o=s,l=!1;s.rank===3&&(l=!0,o=J(s,[1,s.shape[0],s.shape[1],s.shape[2]])),F(o.rank===4,()=>`Error in maxPool: input must be rank 4 but got rank ${o.rank}.`),F(kr(a,i),()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${a} and dilations '${i}'`),Sn("maxPool",n,r);let u={x:o},d={filterSize:t,strides:a,pad:n,dimRoundingMode:r},c=z.runKernel(Li,u,d);return l?J(c,[c.shape[1],c.shape[2],c.shape[3]]):c}var z2=D({maxPool_:MR});function $R(e,t=[1,1,1],a,n,r,s="NDHWC"){let i=R(e,"x","maxPool3d"),o=i,l=!1;i.rank===4&&(l=!0,o=J(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}`),Sn("maxPool3d",n,r);let u={x:o},d={filterSize:t,strides:a,pad:n,dimRoundingMode:r,dataFormat:s},c=z.runKernel(sh,u,d);return l?J(c,[c.shape[1],c.shape[2],c.shape[3],c.shape[4]]):c}var Ab=D({maxPool3d_:$R});function _R(e,t,a,n,r=!1){let s={x:R(e,"x","maxPoolWithArgmax")},i={filterSize:t,strides:a,pad:n,includeBatchInIndex:r},o=z.runKernel(ih,s,i);return{result:o[0],indexes:o[1]}}var xb=D({maxPoolWithArgmax_:_R});function FR(e,t){let a=R(e,"a","maximum"),n=R(t,"b","maximum");[a,n]=It(a,n),a.dtype==="bool"&&(a=Ue(a,"int32"),n=Ue(n,"int32")),zt(a.shape,n.shape);let r={a,b:n};return z.runKernel(us,r)}var L2=D({maximum_:FR});function PR(e,t=null,a=!1){let n={x:R(e,"x","mean")},r={axis:t,keepDims:a};return z.runKernel(Bi,n,r)}var sd=D({mean_:PR});function pn(e,t="float32"){if(t==="complex64"){let n=pn(e,"float32"),r=pn(e,"float32");return xr(n,r)}let a=Vc(yt(e),t);return z.makeTensor(a,e,t)}function Br(e,t="float32"){if(t==="complex64"){let n=Br(e,"float32"),r=pn(e,"float32");return xr(n,r)}let a=B1(yt(e),t);return z.makeTensor(a,e,t)}function bb(e,t,{indexing:a="xy"}={}){if(a!=="xy"&&a!=="ij")throw new TypeError(`${a} is not a valid third argument to meshgrid`);if(e===void 0)return[];let n=R(e,"x","meshgrid",e instanceof dt?e.dtype:"float32");if(t===void 0)return[n];let r=R(t,"y","meshgrid",t instanceof dt?t.dtype:"float32"),s=yt(n.shape),i=yt(r.shape);return a==="xy"?(n=J(n,[1,-1]),r=J(r,[-1,1]),[st(Br([i,1],n.dtype),n),st(r,Br([1,s],r.dtype))]):(n=J(n,[-1,1]),r=J(r,[1,-1]),[st(n,Br([1,i],n.dtype)),st(Br([s,1],r.dtype),r)])}function OR(e,t){let a=R(e,"a","minimum"),n=R(t,"b","minimum");[a,n]=It(a,n),a.dtype==="bool"&&(a=Ue(a,"int32"),n=Ue(n,"int32")),zt(a.shape,n.shape);let r={a,b:n};return z.runKernel(ds,r)}var B2=D({minimum_:OR});function DR(e,t,a){F(a==="reflect"||a==="symmetric",()=>`Invalid mode. Mode must be either reflect or symmetric. Got ${a}.`);let n=R(e,"x","mirrorPad");if(n.rank===0)throw new Error("mirrorPad(scalar) is not defined. Pass non-scalar to mirrorPad");F(t.length===n.rank,()=>`Padding doesn't match input. Must be ${n.rank}. Got ${t.length}.`);let r=a==="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]<=n.shape[o]-r&&t[o][1]>=0&&t[o][1]<=n.shape[o]-r,()=>`Padding in dimension ${o} cannot be greater than or equal to ${n.shape[o]-r} or less than 0 for input of shape ${n.shape}`);let s={paddings:t,mode:a},i={x:n};return z.runKernel(Vi,i,s)}var vb=D({mirrorPad_:DR});function zR(e,t){let a=R(e,"a","mod"),n=R(t,"b","mod");[a,n]=It(a,n);let r={a,b:n};return z.runKernel(Md,r)}var Xl=D({mod_:zR});function LR(e,t=null,a=!1){e=R(e,"x","moments");let n=gd(t,e.shape),r=sd(e,n,a),s=r.shape;a||(s=tp(r.shape,n));let i=In(he(Ue(e,"float32"),J(r,s))),o=sd(i,n,a);return{mean:r,variance:o}}var wb=D({moments_:LR});function BR(e,t,a,n){let r=R(t,"data","multiRNNCell"),s=ad(a,"c","multiRNNCell"),i=ad(n,"h","multiRNNCell"),o=r,l=[];for(let c=0;c2)throw new Error(`Rank of probabilities must be 1 or 2, but is ${i}`);a=a||Math.random();let o={logits:i===1?J(r,[1,-1]):r},l={numSamples:t,seed:a,normalized:n},u=z.runKernel(oh,o,l);return i===1?J(u,[u.size]):u}var Ib=D({multinomial_:WR});function VR(e,t){let a=R(e,"a","notEqual","string_or_numeric"),n=R(t,"b","notEqual","string_or_numeric");[a,n]=It(a,n),zt(a.shape,n.shape);let r={a,b:n};return z.runKernel(cs,r)}var W2=D({notEqual_:VR});function GR(e){let t={x:R(e,"x","onesLike")};return z.runKernel(El,t)}var Sb=D({onesLike_:GR});function UR(e,t){let a=R(e,"v1","outerProduct"),n=R(t,"v2","outerProduct");F(a.rank===1&&n.rank===1,()=>`Error in outerProduct: inputs must be rank 1, but got ranks ${a.rank} and ${n.rank}.`);let r=J(a,[-1,1]),s=J(n,[1,-1]);return st(r,s)}var Tb=D({outerProduct_:UR});function jR(e,t,a=0){let n=R(e,"x","pad");if(n.rank===0)throw new Error("pad(scalar) is not defined. Pass non-scalar to pad");let r={paddings:t,constantValue:a},s={x:n};return z.runKernel(ji,s,r)}var rr=D({pad_:jR});function HR(e,t,a=0){return F(t.length===2,()=>"Invalid number of paddings. Must be length of 2."),rr(e,[t],a)}var Cb=D({pad1d_:HR});function qR(e,t,a=0){return F(t.length===2&&t[0].length===2&&t[1].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),rr(e,t,a)}var Nb=D({pad2d_:qR});function XR(e,t,a=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."),rr(e,t,a)}var Eb=D({pad3d_:XR});function KR(e,t,a=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."),rr(e,t,a)}var Rb=D({pad4d_:KR});function ZR(e,t,a){let n=R(e,"x","spaceToBatchND");F(n.rank>=1+t.length,()=>`input rank ${n.rank} should be > than [blockShape] ${t.length}`),F(a.length===t.length,()=>`paddings.shape[0] ${a.length} must be equal to [blockShape] ${t.length}`),F(n.shape.reduce((i,o,l)=>l>0&&l<=t.length?i&&(o+a[l-1][0]+a[l-1][1])%t[l-1]===0:i,!0),()=>`input spatial dimensions ${n.shape.slice(1)} with paddings ${a.toString()} must be divisible by blockShapes ${t.toString()}`);let r={x:n},s={blockShape:t,paddings:a};return z.runKernel(Bl,r,s)}var V2=D({spaceToBatchND_:ZR});function YR(e,t,a,n,r,s,i){r==null&&(r=[1,1]),s==null&&(s=1),n===0&&(n="valid");let o=R(e,"x","maxPool"),l=o,u=!1;o.rank===3&&(u=!0,l=J(o,[1,o.shape[0],o.shape[1],o.shape[2]])),F(kr(s,r),()=>`Error in pool: Either strides or dilations must be 1. Got strides ${s} and dilations '${r}'`);let d=Tx(l.shape,t,s,r,n),c=[d.dilationHeight,d.dilationWidth],p;n==="same"?p=QR([d.filterHeight,d.filterWidth],c):p=[[0,0],[0,0]];let h=c[0]===1&&c[1]===1,[f,m]=JR([d.inHeight,d.inWidth],c,p),g=h?n:"valid",y=h?l:V2(l,c,f),A=(a==="avg"?()=>w2(y,t,s,g,i):()=>z2(y,t,s,g,i))(),x=h?A:k2(A,c,m);return u?J(x,[x.shape[1],x.shape[2],x.shape[3]]):x}function JR(e,t,a){let n=a.map(d=>d[0]),r=a.map(d=>d[1]),s=e.concat(n,r),i=t.map((d,c)=>(d-s[c]%d)%d),o=r.map((d,c)=>d+i[c]),l=t.map((d,c)=>[n[c],o[c]]),u=t.map((d,c)=>[0,i[c]]);return[l,u]}function QR(e,t){let a=e.map((s,i)=>s+(s-1)*(t[i]-1)).map(s=>s-1),n=a.map(s=>Math.floor(s/2)),r=a.map((s,i)=>s-n[i]);return a.map((s,i)=>[n[i],r[i]])}var Mb=D({pool_:YR});function eM(e,t){let a=R(e,"x","prelu"),n=R(t,"alpha","prelu"),r={x:a,alpha:n};return z.runKernel(qi,r)}var G2=D({prelu_:eM});function tM(e,t=null,a=!1){let n=R(e,"x","prod");n.dtype==="bool"&&(n=Ue(n,"int32"));let r={x:n},s={axis:t,keepDims:a};return z.runKernel(Xi,r,s)}var $b=D({prod_:tM});function aM(e,t,a,n){let r=e.map((d,c)=>R(d,`tensors${c}`,"raggedGather","int32")),s=R(t,"paramsDenseValues","raggedGather"),i=R(a,"indices","raggedGather","int32"),o={paramsNestedSplits:r,paramsDenseValues:s,indices:i},l={outputRaggedRank:n},u=z.runKernel(lh,o,l);return{outputNestedSplits:u.slice(0,u.length-1),outputDenseValues:u[u.length-1]}}var _b=D({raggedGather_:aM});function nM(e,t,a){let n=R(e,"starts","raggedRange"),r=R(t,"limits","raggedRange",n.dtype),s=R(a,"deltas","raggedRange",n.dtype),i={starts:n,limits:r,deltas:s},o=z.runKernel(uh,i);return{rtNestedSplits:o[0],rtDenseValues:o[1]}}var Fb=D({raggedRange_:nM});function rM(e,t,a,n,r){let s=R(e,"shape","raggedTensorToTensor","int32"),i=R(t,"values","raggedTensorToTensor"),o=R(a,"defaultValue","raggedTensorToTensor",i.dtype),l=n.map((c,p)=>R(c,`tensors${p}`,"raggedTensorToTensor","int32")),u={shape:s,values:i,defaultValue:o,rowPartitionTensors:l},d={rowPartitionTypes:r};return z.runKernel(dh,u,d)}var Pb=D({raggedTensorToTensor_:rM});function sM(e,t,a){let n=yt(e),r=null;if(a==null||a==="float32")r=new Float32Array(n);else if(a==="int32")r=new Int32Array(n);else if(a==="bool")r=new Uint8Array(n);else throw new Error(`Unknown data type ${a}`);for(let s=0;s=1||s===0);let i=Math.sqrt(-2*Math.log(s)/s);e=this.mean+this.stdDev*n*i,t=this.mean+this.stdDev*r*i,(!this.truncated||this.isValidTruncated(e))&&(a=!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}},iM=class{constructor(e,t,a,n){this.alpha=e,this.beta=1/t,this.dtype=a;let r=n||Math.random();this.randu=U2.alea(r.toString()),this.randn=new j2(0,1,a,!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,a,n,r,s;for(;;){do n=this.randn.nextValue(),s=1+this.c*n;while(s<=0);if(s*=s*s,e=n*n,t=1-.331*e*e,a=.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=a,n==null&&(n=Math.random()),typeof n=="number"&&(n=n.toString()),!this.canReturnFloat()&&this.range<=1)throw new Error(`The difference between ${e} - ${t} <= 1 and dtype is not float`);this.random=U2.alea(n)}convertValue(e){return this.canReturnFloat()?e:Math.round(e)}nextValue(){return this.convertValue(this.min+this.range*this.random())}};function lM(e,t,a=1,n="float32",r){if(a==null&&(a=1),n==null&&(n="float32"),n!=="float32"&&n!=="int32")throw new Error(`Unsupported data type ${n}`);let s=new iM(t,a,n,r),i=ve(e,n);for(let o=0;o`Error in reverse1D: x must be rank 1 but got rank ${t.rank}.`),Kr(t,0)}var Bb=D({reverse1d_:gM});function yM(e,t){let a=R(e,"x","reverse");return F(a.rank===2,()=>`Error in reverse2D: x must be rank 2 but got rank ${a.rank}.`),Kr(a,t)}var Wb=D({reverse2d_:yM});function AM(e,t){let a=R(e,"x","reverse");return F(a.rank===3,()=>`Error in reverse3D: x must be rank 3 but got rank ${a.rank}.`),Kr(a,t)}var Vb=D({reverse3d_:AM});function xM(e,t){let a=R(e,"x","reverse");return F(a.rank===4,()=>`Error in reverse4D: x must be rank 4 but got rank ${a.rank}.`),Kr(a,t)}var Gb=D({reverse4d_:xM});function bM(e){let t={x:R(e,"x","round")};return z.runKernel(Ol,t)}var K2=D({round_:bM});function vM(e){let t={x:R(e,"x","rsqrt","float32")};return z.runKernel(hs,t)}var Ub=D({rsqrt_:vM});function wM(e){let t={x:R(e,"x","selu")};return z.runKernel(_d,t)}var jb=D({selu_:wM});function kM(e,t,a,n,r,s=[1,1],i="NHWC"){let o=R(e,"x","separableConv2d"),l=R(t,"depthwiseFilter","separableConv2d"),u=R(a,"pointwiseFilter","separableConv2d"),d=o,c=!1;if(o.rank===3&&(c=!0,d=J(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 p=l.shape[2],h=l.shape[3];F(u.shape[2]===p*h,()=>`Error in separableConv2d: the third dimension of pointwise filter must be ${p*h}, but got ${u.shape[2]}.`);let f=gh(d,l,n,r,i,s),m=ep(f,u,1,"valid",i);return c?J(m,[m.shape[1],m.shape[2],m.shape[3]]):m}var Hb=D({separableConv2d_:kM});async function IM(e,t){let a=R(e,"x","setdiff1d"),n=R(t,"y","setdiff1d");F(a.dtype===n.dtype,()=>`x and y should have the same dtype, but got x (${a.dtype}) and y (${n.dtype}).`),F(a.rank===1,()=>`x should be 1D tensor, but got x (${a.shape}).`),F(n.rank===1,()=>`y should be 1D tensor, but got y (${n.shape}).`);let r=await a.data(),s=await n.data(),i=new Set(s),o=0;for(let d=0;d`slice1d expects a rank-1 tensor, but got a rank-${n.rank} tensor`),_e(n,[t],[a])}var Yb=D({slice1d_:NM});function EM(e,t,a){let n=R(e,"x","slice2d");return F(n.rank===2,()=>`slice2d expects a rank-2 tensor, but got a rank-${n.rank} tensor`),_e(n,t,a)}var Jb=D({slice2d_:EM});function RM(e,t,a){let n=R(e,"x","slice3d");return F(n.rank===3,()=>`slice3d expects a rank-3 tensor, but got a rank-${n.rank} tensor`),_e(n,t,a)}var sp=D({slice3d_:RM});function MM(e,t,a){let n=R(e,"x","slice4d");return F(n.rank===4,()=>`slice4d expects a rank-4 tensor, but got a rank-${n.rank} tensor`),_e(n,t,a)}var bh=D({slice4d_:MM});function $M(e,t=-1){let a=R(e,"logits","softmax","float32");if(t===-1&&(t=a.rank-1),t!==a.rank-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${a.rank} and dim was ${t}`);let n={logits:a},r={dim:t};return z.runKernel(ao,n,r)}var vh=D({softmax_:$M});function _M(e){F(e.dtype==="complex64",()=>`The dtype for tf.spectral.fft() must be complex64 but got ${e.dtype}.`);let t={input:e};return z.runKernel(th,t)}var wh=D({fft_:_M});function FM(e){F(e.dtype==="complex64",()=>`The dtype for tf.spectral.ifft() must be complex64 but got ${e.dtype}.`);let t={input:e};return z.runKernel(ah,t)}var id=D({ifft_:FM});function PM(e){let t=e.shape[e.shape.length-1],a=e.size/t,n;if(t<=2){let r=J(e,[a,t]);n=id(r)}else{let r=[a,2*(t-1)],s=J(rl(e),[a,t]),i=J(Zd(e),[a,t]),o=Kr(_e(s,[0,1],[a,t-2]),1),l=ae(Kr(_e(i,[0,1],[a,t-2]),1),Fe(-1)),u=at([s,o],1),d=at([i,l],1),c=J(xr(u,d),[r[0],r[1]]);n=id(c)}if(n=rl(n),e.rank===3&&e.shape[0]!==0){let r=n,s=e.shape[0];n=J(n,[s,n.shape[0]/s,n.shape[1]]),r.dispose()}return n}var Z2=D({irfft_:PM});function OM(e,t,a=0){let n={x:R(e,"x","split")},r={numOrSizeSplits:t,axis:a};return z.runKernel(Wl,n,r)}var ka=D({split_:OM});function DM(e,t){F(e.dtype==="float32",()=>`The dtype for rfft() must be real value but got ${e.dtype}`);let a=e.shape[e.shape.length-1],n=e.size/a,r;if(t!=null&&t0),m=e.shape.map(g=>g);m[e.shape.length-1]=t,r=_e(e,f,m),a=t}else if(t!=null&&t>a){let f=e.shape.map(m=>m);f[e.shape.length-1]=t-a,r=at([e,pn(f)],e.shape.length-1),a=t}else r=e;let s=Xa(r),i=J(xr(r,s),[n,a]),o=wh(i),l=Math.floor(a/2)+1,u=rl(o),d=Zd(o),c=ka(u,[l,a-l],u.shape.length-1),p=ka(d,[l,a-l],d.shape.length-1),h=r.shape.slice();return h[r.shape.length-1]=l,J(xr(c[0],p[0]),h)}var kh=D({rfft_:DM});function zM(e,t){let a=R(e,"a","squaredDifference"),n=R(t,"b","squaredDifference");[a,n]=It(a,n),zt(a.shape,n.shape);let r={a,b:n},s={};return z.runKernel(gs,r,s)}var Y2=D({squaredDifference_:zM});function LM(e,t){let a=R(e,"x","squeeze","string_or_numeric");return J(a,mA(a.shape,t).newShape)}var $e=D({squeeze_:LM});function BM(e,t=0){let a=ad(e,"tensors","stack","string_or_numeric");F(a.length>=1,()=>"Pass at least one tensor to tf.stack"),a.length>0&&F(t<=a[0].rank,()=>"Axis must be <= rank of the tensor");let n=a,r={axis:t};return z.runKernel(Ml,n,r)}var sa=D({stack_:BM});function WM(e,t=0){let a={x:R(e,"x","step")},n={alpha:t};return z.runKernel(oo,a,n)}var J2=D({step_:WM});function VM(e,t,a,n,r=0,s=0,i=0,o=0,l=0){let u={x:R(e,"x","stridedSlice","string_or_numeric")},d={begin:t,end:a,strides:n,beginMask:r,endMask:s,ellipsisMask:i,newAxisMask:o,shrinkAxisMask:l};return z.runKernel(no,u,d)}var Qb=D({stridedSlice_:VM});function GM(e){let t={x:R(e,"x","tan","float32")};return z.runKernel(Ul,t)}var e4=D({tan_:GM});function Ut(e,t){ci(e);let a=Yn(e,t);if(a.length!==1)throw new Error("tensor1d() requires values to be a flat/TypedArray");return xs(e,null,a,t)}function Kn(e,t,a){if(ci(e),t!=null&&t.length!==2)throw new Error("tensor2d() requires shape to have two numbers");let n=Yn(e,a);if(n.length!==2&&n.length!==1)throw new Error("tensor2d() requires values to be number[][] or flat/TypedArray");if(n.length===1&&t==null)throw new Error("tensor2d() requires shape to be provided when `values` are a flat/TypedArray");return xs(e,t,n,a)}function t4(e,t,a){if(ci(e),t!=null&&t.length!==4)throw new Error("tensor4d() requires shape to have four numbers");let n=Yn(e,a);if(n.length!==4&&n.length!==1)throw new Error("tensor4d() requires values to be number[][][][] or flat/TypedArray");if(n.length===1&&t==null)throw new Error("tensor4d() requires shape to be provided when `values` are a flat array");return xs(e,t,n,a)}function a4(e,t,a){if(ci(e),t!=null&&t.length!==5)throw new Error("tensor5d() requires shape to have five numbers");let n=Yn(e,a);if(n.length!==5&&n.length!==1)throw new Error("tensor5d() requires values to be number[][][][][] or flat/TypedArray");if(n.length===1&&t==null)throw new Error("tensor5d() requires shape to be provided when `values` are a flat array");return xs(e,t,n,a)}function n4(e,t,a){if(ci(e),t!=null&&t.length!==6)throw new Error("tensor6d() requires shape to have six numbers");let n=Yn(e,a);if(n.length!==6&&n.length!==1)throw new Error("tensor6d() requires values to be number[][][][][][] or flat/TypedArray");if(n.length===1&&t==null)throw new Error("tensor6d() requires shape to be provided when `values` are a flat array");return t=t||n,xs(e,t,n,a)}function UM(e,t=1,a=!0){let n=R(e,"x","topk");if(n.rank===0)throw new Error("topk() expects the input to be of rank 1 or higher");let r=n.shape[n.shape.length-1];if(t<0)throw new Error(`'k' passed to topk() must be >= 0 but got ${t}`);if(t>r)throw new Error(`'k' passed to topk() must be <= the last dimension (${r}) but got ${t}`);let s={x:n},i={k:t,sorted:a},[o,l]=z.runKernel(so,s,i);return{values:o,indices:l}}var r4=D({topk_:UM});function jM(e,t=0,a=1,n,r){if(n!=null&&n==="bool")throw new Error("Unsupported data type $ { dtype }");let s=new j2(t,a,n,!0,r),i=ve(e,n);for(let o=0;o0,()=>"The input tensor must be at least 1D");let n={x:a},r={axis:t},[s,i]=z.runKernel(ch,n,r);return{values:s,indices:i}}var i4=D({unique_:HM});function qM(e,t,a){let n=R(e,"x","unsortedSegmentSum"),r=R(t,"segmentIds","unsortedSegmentSum","int32");F(tl(a),()=>"numSegments must be of dtype int");let s={x:n,segmentIds:r},i={numSegments:a};return z.runKernel(hh,s,i)}var o4=D({unsortedSegmentSum_:qM});function XM(e,t=0){let a=R(e,"x","unstack","string_or_numeric");F(t>=-a.shape.length&&t`Axis = ${t} is not in [-${a.shape.length}, ${a.shape.length})`);let n={value:a},r={axis:t};return z.runKernel(jl,n,r)}var Ta=D({unstack_:XM});function l4(e,t){return xh(e,t,"right")}function u4(e,t=!0,a,n){return z.makeVariable(e,t,a,n)}function d4(e,t){let a=[];for(let s=0;s0,()=>"mask cannot be scalar"),Sa(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 m=s;m"Shape mismatch in v and x");let l=Fe(1),u=he(l,o),d=ae(he(i,s),u);if(r){F(n!=null,()=>"When using zeroDebias: true, step is required.");let c=R(n,"step","movingAverage");d=fe(d,he(l,sl(o,c)))}return xe(s,d)}var c4=D({movingAverage_:YM});function JM(e,t,a){let n=R(e,"indices","scatterND","int32"),r=R(t,"updates","scatterND");y2(r,n,a);let s={indices:n,updates:r},i={shape:a};return z.runKernel(Qi,s,i)}var h4=D({scatterND_:JM});function QM(e,t,a,n){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(a.length!==s)throw new Error(`outputShape has incorrect number of elements:, ${a.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!==n.dtype)throw new Error("sparseValues.dtype must match defaultValues.dtype")}function e$(e,t,a,n=0){let r=R(e,"sparseIndices","sparseToDense","int32"),s=R(t,"sparseValues","sparseToDense","string_or_numeric"),i=R(n,"defaultValue","sparseToDense",s.dtype);QM(r,s,a,i);let o={sparseIndices:r,sparseValues:s,defaultValue:i},l={outputShape:a};return z.runKernel(Ld,o,l)}var f4=D({sparseToDense_:e$});function t$(e,t){let a=R(t,"indices","gatherND","int32"),n={params:R(e,"x","gatherND","string_or_numeric"),indices:a};return z.runKernel(_i,n)}var m4=D({gatherND_:t$});function a$(e,t){if(t==null)return e.shape.slice();if(Jr(e.shape,t))return t;if(e.shape.length===t.length){let a=[];for(let n=0;n`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 dt?r.clone():r;let s=a$(r,a),i=1-t,o=fe(E2(xe(q2(s,0,1,"float32",n),i)),i);return ae(r,o)}var g4=D({dropout_:n$});function e3(e){return Math.floor(Math.pow(2,Math.ceil(Math.log(e)/Math.log(2))))}function Ih(e,t,a){let n=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 ${n.rank}`),F(n.rank-1===r.rank,()=>`predictions rank should be 1 larger than targets rank, but got predictions rank ${n.rank} and targets rank ${r.rank}`),Sa(n.shape.slice(0,n.shape.length-1),r.shape,"predictions's shape should be align with the targets' shape, except the last dimension.");let s=n.shape[n.shape.length-1];F(a>0&&a<=s,()=>`'k' passed to inTopK() must be > 0 && <= the predictions last dimension (${s}), but got ${a}`);let i=await n.data(),o=await r.data(),[l,u]=[i.length/s,s],d=gA("bool",l);for(let c=0;cg.value-m.value),d[c]=0;for(let m=0;ml$,depthwiseConv2d:()=>f$,matMul:()=>g$});function s$(e,t,a,n,r,s="NHWC",i){let o=e;e.rank===3&&(o=J(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let l=t;l.rank===3&&(l=J(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(a.length===4,()=>`Error in conv2dDerFilter: filterShape must be length 4, but got ${a}.`);let u=s==="NHWC"?o.shape[3]:o.shape[1],d=s==="NHWC"?l.shape[3]:l.shape[1];F(u===a[2],()=>`Error in conv2dDerFilter: depth of input ${u}) must match input depth in filter (${a[2]}.`),F(d===a[3],()=>`Error in conv2dDerFilter: depth of dy (${d}) must match output depth for filter (${a[3]}).`),Sn("conv2dDerFilter",r,i);let c={x:o,dy:l},p={strides:n,pad:r,dataFormat:s,dimRoundingMode:i,filterShape:a};return z.runKernel(qc,c,p)}var i$=D({conv2DBackpropFilter_:s$});function Sh(e,t,a){if(a==null||a==="linear")return e;if(a==="relu")return ae(e,J2(t));throw new Error(`Cannot compute gradient for fused activation ${a}.`)}function Th(e,t){let a=t,n=c2(e.shape,t.shape);return n.length>0&&(a=tt(a,n)),J(a,e.shape)}function Ch(e,t,a,n){if(t==="linear")return e;if(t==="relu")return rp(e);if(t==="elu")return T2(e);if(t==="relu6")return X2(e);if(t==="prelu")return G2(e,a);if(t==="leakyrelu")return $2(e,n);if(t==="sigmoid")return Da(e);throw new Error(`Unknown fused activation ${t}.`)}var Nh=(e,t)=>!(e>0)||t==="linear";function o$({x:e,filter:t,strides:a,pad:n,dataFormat:r="NHWC",dilations:s=[1,1],dimRoundingMode:i,bias:o,activation:l="linear",preluActivationWeights:u,leakyreluAlpha:d}){if(l=l||"linear",Nh(z.state.gradientDepth,l)===!1){F(r==="NHWC",()=>`Error in fused conv2d: got dataFormat of ${r} but only NHWC is currently supported for the case of gradient depth is 0 and the activation is not linear.`);let S=ep(e,t,a,n,r,s,i);return o!=null&&(S=xe(S,o)),Ch(S,l,u,d)}let c=R(e,"x","conv2d","float32"),p=R(t,"filter","conv2d","float32"),h=c,f=!1;c.rank===3&&(f=!0,h=J(c,[1,c.shape[0],c.shape[1],c.shape[2]])),F(h.rank===4,()=>`Error in fused conv2d: input must be rank 4, but got rank ${h.rank}.`),F(p.rank===4,()=>`Error in fused conv2d: filter must be rank 4, but got rank ${p.rank}.`),Sn("fused conv2d",n,i);let m=r==="NHWC"?h.shape[3]:h.shape[1];F(p.shape[2]===m,()=>`Error in conv2d: depth of input (${m}) must match input depth for filter ${p.shape[2]}.`),F(kr(a,s),()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${a} and dilations '${s}'`);let g=Jd(h.shape,p.shape,a,s,n,i),y;o!=null&&(y=R(o,"bias","fused conv2d"),[y]=It(y,c),r==="NHWC"?zt(g.outShape,y.shape):(F(y.shape.length<=1,()=>`Error in fused conv2d: only supports scalar or 1-D Tensor bias for NCHW format but got the bias of rank-${y.shape.length}.`),F(y.shape.length===0||y.shape[0]===g.outChannels||y.shape[0]===1,()=>`Error in fused conv2d: bias shape (${y.shape}) is not compatible with the number of output channels (${g.outChannels})`)));let A;if(u!=null){let S=u.shape;if(F(S.length<=1||S.length===3,()=>`Error in fused conv2d: only supports scalar, 1-D Tensor or 3-D Tensor PReLU activation weights but got a tensor of rank-${S.length}.`),S.length===1)F(S[0]===1||S[0]===g.outChannels,()=>`Error in fused conv2d: PReLU activation weights (${S}) is not compatible with the number of output channels (${g.outChannels}).`);else if(S.length===3)try{zt(S,g.outShape)}catch(C){let N=`Error in fused conv2d: PReLU activation weights (${S}) is not compatible with the output shape of the conv2d (${g.outShape}).`;throw Error(N)}A=R(u,"prelu weights","fused conv2d")}let x=(S,C)=>{F(r==="NHWC",()=>`Error in gradient of fused conv2D: got dataFormat of ${r} but only NHWC is currently supported.`);let[N,_,$,M]=C,I=Sh(S,$,l);F(nd(s),()=>`Error in gradient of fused conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${s}'`);let E=Wx(_.shape,I,N,a,n),O=i$(_,I,N.shape,a,n),L=[E,O];if(M!=null){let B=Th(M,I);L.push(B)}return L},b={x:h,filter:p,bias:y,preluActivationWeights:A},w={strides:a,pad:n,dataFormat:r,dilations:s,dimRoundingMode:i,activation:l,leakyreluAlpha:d};return o==null?Qn((S,C,N)=>{let _=z.runKernel(jr,b,w);return N([C,S,_]),f&&(_=J(_,[_.shape[1],_.shape[2],_.shape[3]])),{value:_,gradFunc:x}})(h,p):Qn((S,C,N,_)=>{let $=z.runKernel(jr,b,w);return _([C,S,$,N]),f&&($=J($,[$.shape[1],$.shape[2],$.shape[3]])),{value:$,gradFunc:x}})(h,p,y)}var l$=D({fusedConv2d_:o$});function u$(e,t,a,n,r,s=[1,1],i){let o=e;e.rank===3&&(o=J(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let l=t;l.rank===3&&(l=J(t,[1,t.shape[0],t.shape[1],t.shape[2]]));let u={x:o,dy:l},d={strides:n,pad:r,dimRoundingMode:i,dilations:s,filterShape:a};return z.runKernel(Yc,u,d)}var d$=D({depthwiseConv2dNativeBackpropFilter_:u$});function p$(e,t,a,n,r,s=[1,1],i){let o=t,l=!1;t.rank===3&&(l=!0,o=J(t,[1,t.shape[0],t.shape[1],t.shape[2]]));let u={dy:o,filter:a},d={strides:n,pad:r,dimRoundingMode:i,dilations:s,inputShape:e},c=z.runKernel(Jc,u,d);return l?J(c,[c.shape[1],c.shape[2],c.shape[3]]):c}var c$=D({depthwiseConv2dNativeBackpropInput_:p$});function h$({x:e,filter:t,strides:a,pad:n,dataFormat:r="NHWC",dilations:s=[1,1],dimRoundingMode:i,bias:o,activation:l="linear",preluActivationWeights:u,leakyreluAlpha:d}){if(Nh(z.state.gradientDepth,l)===!1){let w=gh(e,t,a,n,r,s,i);return o!=null&&(w=xe(w,o)),Ch(w,l,u,d)}let c=R(e,"x","depthwiseConv2d","float32"),p=R(t,"filter","depthwiseConv2d","float32"),h=c,f=!1;c.rank===3&&(f=!0,h=J(c,[1,c.shape[0],c.shape[1],c.shape[2]])),F(h.rank===4,()=>`Error in fused depthwiseConv2d: input must be rank 4, but got rank ${h.rank}.`),F(p.rank===4,()=>`Error in fused depthwiseConv2d: filter must be rank 4, but got rank ${p.rank}.`),F(h.shape[3]===p.shape[2],()=>`Error in fused depthwiseConv2d: number of input channels (${h.shape[3]}) must match the inChannels dimension in filter ${p.shape[2]}.`),s==null&&(s=[1,1]),F(kr(a,s),()=>`Error in fused depthwiseConv2d: Either strides or dilations must be 1. Got strides ${a} and dilations '${s}'`),Sn("fused depthwiseConv2d",n,i);let m=Jd(h.shape,p.shape,a,s,n,i,!0),g;o!=null&&(g=R(o,"bias","fused conv2d"),[g]=It(g,c),zt(m.outShape,g.shape));let y;u!=null&&(y=R(u,"prelu weights","fused depthwiseConv2d"));let A=(w,S)=>{F(nd(s),()=>`Error in gradient of fused depthwiseConv2d: dilation rates greater than 1 are not yet supported. Got dilations '${s}'`);let[C,N,_,$]=S,M=Sh(w,_,l),I=c$(N.shape,M,C,a,n,s,i),E=d$(N,M,C.shape,a,n,s,i);if($!=null){let O=Th(g,M);return[I,E,O]}return[I,E]},x={x:h,filter:p,bias:g,preluActivationWeights:y},b={strides:a,pad:n,dataFormat:r,dilations:s,dimRoundingMode:i,activation:l,leakyreluAlpha:d};return o==null?Qn((w,S,C)=>{let N=z.runKernel(Hr,x,b);return C([S,w,N]),f&&(N=J(N,[N.shape[1],N.shape[2],N.shape[3]])),{value:N,gradFunc:A}})(h,p):Qn((w,S,C,N)=>{let _=z.runKernel(Hr,x,b);return N([S,w,_,C]),f&&(_=J(_,[_.shape[1],_.shape[2],_.shape[3]])),{value:_,gradFunc:A}})(h,p,g)}var f$=D({fusedDepthwiseConv2d_:h$});function m$({a:e,b:t,transposeA:a=!1,transposeB:n=!1,bias:r,activation:s="linear",preluActivationWeights:i,leakyreluAlpha:o=.2}){if(Nh(z.state.gradientDepth,s)===!1){let $=st(e,t,a,n);return r!=null&&($=xe($,r)),Ch($,s,i,o)}let l=R(e,"a","fused matMul"),u=R(t,"b","fused matMul");[l,u]=It(l,u);let d=a?l.shape[l.rank-2]:l.shape[l.rank-1],c=n?u.shape[u.rank-1]:u.shape[u.rank-2],p=a?l.shape[l.rank-1]:l.shape[l.rank-2],h=n?u.shape[u.rank-2]:u.shape[u.rank-1],f=l.shape.slice(0,-2),m=u.shape.slice(0,-2),g=yt(f),y=yt(m);F(d===c,()=>`Error in fused matMul: inner shapes (${d}) and (${c}) of Tensors with shapes ${l.shape} and ${u.shape} and transposeA=${a} and transposeB=${n} must match.`);let A=zt(l.shape.slice(0,-2),u.shape.slice(0,-2)).concat([p,h]),x=a?J(l,[g,d,p]):J(l,[g,p,d]),b=n?J(u,[y,h,c]):J(u,[y,c,h]),w;r!=null&&(w=R(r,"bias","fused matMul"),[w]=It(w,l),zt(A,w.shape));let S;i!=null&&(S=R(i,"prelu weights","fused matMul"));let C=($,M)=>{let[I,E,O,L]=M,B=Sh(J($,O.shape),O,s),G,j;if(!a&&!n?(G=st(B,E,!1,!0),j=st(I,B,!0,!1)):!a&&n?(G=st(B,E,!1,!1),j=st(B,I,!0,!1)):a&&!n?(G=st(E,B,!1,!0),j=st(I,B,!1,!1)):(G=st(E,B,!0,!0),j=st(B,I,!0,!0)),r!=null){let U=Th(L,B);return[G,j,U]}else return[G,j]},N={a:x,b,bias:w,preluActivationWeights:S},_={transposeA:a,transposeB:n,activation:s,leakyreluAlpha:o};return r==null?Qn(($,M,I)=>{let E=z.runKernel(Ur,N,_);return I([$,M,E]),{value:J(E,A),gradFunc:C}})(x,b):Qn(($,M,I,E)=>{let O=z.runKernel(Ur,N,_);return E([$,M,O,I]),{value:J(O,A),gradFunc:C}})(x,b,w)}var g$=D({fusedMatMul_:m$});function y$(e){return Ih(e,.54,.46)}var A$=D({hammingWindow_:y$});function x$(e){return Ih(e,.5,.5)}var A4=D({hannWindow_:x$});function b$(e,t,a,n=!1,r=0){let s=0,i=[];for(;s+t<=e.size;)i.push(_e(e,s,t)),s+=a;if(n)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(n.length===2,()=>`Error in cropAndResize: cropSize must be of length 2, but got length ${n.length}.`),F(n[0]>=1&&n[1]>=1,()=>`cropSize must be atleast [1,1], but was ${n}`),F(r==="bilinear"||r==="nearest",()=>`method must be bilinear or nearest, but was ${r}`);let d={image:i,boxes:o,boxInd:l},c={method:r,extrapolationValue:s,cropSize:n};return z.runKernel(Ii,d,c)}var I$=D({cropAndResize_:k$});function S$(e){let t=R(e,"image","flipLeftRight","float32");F(t.rank===4,()=>`Error in flipLeftRight: image must be rank 4,but got rank ${t.rank}.`);let a={image:t};return z.runKernel(Ri,a,{})}var T$=D({flipLeftRight_:S$});function C$(e){let t=R(e,"image","grayscaleToRGB"),a=t.rank-1,n=t.shape[a];F(t.rank>=2,()=>`Error in grayscaleToRGB: images must be at least rank 2, but got rank ${t.rank}.`),F(n===1,()=>`Error in grayscaleToRGB: last dimension of a grayscale image should be size 1, but got size ${n}.`);let r=new Array(t.rank);return r.fill(1,0,a),r[a]=3,Vr(t,r)}var N$=D({grayscaleToRGB_:C$});function E$(e,t,a=0,n=.5){let r=R(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:a,center:n};return z.runKernel(lo,s,i)}var R$=D({rotateWithOffset_:E$});function Kl(e,t,a,n,r,s){n==null&&(n=.5),r==null&&(r=Number.NEGATIVE_INFINITY),s==null&&(s=0);let i=e.shape[0];return a=Math.min(a,i),F(0<=n&&n<=1,()=>`iouThreshold must be in [0, 1], but was '${n}'`),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:a,iouThreshold:n,scoreThreshold:r,softNmsSigma:s}}function M$(e,t,a,n=.5,r=Number.NEGATIVE_INFINITY){let s=R(e,"boxes","nonMaxSuppression","float32"),i=R(t,"scores","nonMaxSuppression","float32"),o=Kl(s,i,a,n,r);a=o.maxOutputSize,n=o.iouThreshold,r=o.scoreThreshold;let l={maxOutputSize:a,iouThreshold:n,scoreThreshold:r};return z.runKernel(Gi,{boxes:s,scores:i},l)}var $$=D({nonMaxSuppression_:M$});function _$(e,t,a){let n=F$(e,t,a),r=n<0?-(n+1):n;e.splice(r,0,t)}function F$(e,t,a){return O$(e,t,a||P$)}function P$(e,t){return e>t?1:e>>1);let o=a(t,e[s]);o>0?n=s+1:(r=s,i=!o)}return i?n:-n-1}function b4(e,t,a,n,r){return a3(e,t,a,n,r,0)}function v4(e,t,a,n,r,s){return a3(e,t,a,n,r,0,!1,s,!0)}function w4(e,t,a,n,r,s){return a3(e,t,a,n,r,s,!0)}function a3(e,t,a,n,r,s,i=!1,o=!1,l=!1){let u=[];for(let g=0;gr&&u.push({score:t[g],boxIndex:g,suppressBeginIndex:0});u.sort(ty);let d=s>0?-.5/s:0,c=[],p=[];for(;c.length0;){let g=u.pop(),{score:y,boxIndex:A,suppressBeginIndex:x}=g;if(y=x;--w){let S=D$(e,A,c[w]);if(S>=n){b=!0;break}if(g.score=g.score*z$(n,d,S),g.score<=r)break}g.suppressBeginIndex=c.length,b||(g.score===y?(c.push(A),p.push(g.score)):g.score>r&&_$(u,g,ty))}let h=c.length,f=a-h;o&&f>0&&(c.push(...new Array(f).fill(0)),p.push(...new Array(f).fill(0)));let m={selectedIndices:c};return i&&(m.selectedScores=p),l&&(m.validOutputs=h),m}function D$(e,t,a){let n=e.subarray(t*4,t*4+4),r=e.subarray(a*4,a*4+4),s=Math.min(n[0],n[2]),i=Math.min(n[1],n[3]),o=Math.max(n[0],n[2]),l=Math.max(n[1],n[3]),u=Math.min(r[0],r[2]),d=Math.min(r[1],r[3]),c=Math.max(r[0],r[2]),p=Math.max(r[1],r[3]),h=(o-s)*(l-i),f=(c-u)*(p-d);if(h<=0||f<=0)return 0;let m=Math.max(s,u),g=Math.max(i,d),y=Math.min(o,c),A=Math.min(l,p),x=Math.max(y-m,0)*Math.max(A-g,0);return x/(h+f-x)}function z$(e,t,a){let n=Math.exp(t*a*a);return a<=e?n:0}function ty(e,t){return e.score-t.score||e.score===t.score&&t.boxIndex-e.boxIndex}async function L$(e,t,a,n=.5,r=Number.NEGATIVE_INFINITY){let s=R(e,"boxes","nonMaxSuppressionAsync"),i=R(t,"scores","nonMaxSuppressionAsync"),o=Kl(s,i,a,n,r);a=o.maxOutputSize,n=o.iouThreshold,r=o.scoreThreshold;let l=await Promise.all([s.data(),i.data()]),u=l[0],d=l[1],{selectedIndices:c}=b4(u,d,a,n,r);return s!==e&&s.dispose(),i!==t&&i.dispose(),Ut(c,"int32")}var B$=L$;function W$(e,t,a,n=.5,r=Number.NEGATIVE_INFINITY,s=0){let i=R(e,"boxes","nonMaxSuppression"),o=R(t,"scores","nonMaxSuppression"),l=Kl(i,o,a,n,r,s);a=l.maxOutputSize,n=l.iouThreshold,r=l.scoreThreshold,s=l.softNmsSigma;let u={boxes:i,scores:o},d={maxOutputSize:a,iouThreshold:n,scoreThreshold:r,softNmsSigma:s},c=z.runKernel(Ui,u,d);return{selectedIndices:c[0],selectedScores:c[1]}}var V$=D({nonMaxSuppressionWithScore_:W$});async function G$(e,t,a,n=.5,r=Number.NEGATIVE_INFINITY,s=0){let i=R(e,"boxes","nonMaxSuppressionAsync"),o=R(t,"scores","nonMaxSuppressionAsync"),l=Kl(i,o,a,n,r,s);a=l.maxOutputSize,n=l.iouThreshold,r=l.scoreThreshold,s=l.softNmsSigma;let u=await Promise.all([i.data(),o.data()]),d=u[0],c=u[1],{selectedIndices:p,selectedScores:h}=w4(d,c,a,n,r,s);return i!==e&&i.dispose(),o!==t&&o.dispose(),{selectedIndices:Ut(p,"int32"),selectedScores:Ut(h)}}var U$=G$;function j$(e,t,a,n=.5,r=Number.NEGATIVE_INFINITY,s=!1){let i=R(e,"boxes","nonMaxSuppression"),o=R(t,"scores","nonMaxSuppression"),l=Kl(i,o,a,n,r,null),u=l.maxOutputSize,d=l.iouThreshold,c=l.scoreThreshold,p={boxes:i,scores:o},h={maxOutputSize:u,iouThreshold:d,scoreThreshold:c,padToMaxOutputSize:s},f=z.runKernel(Nl,p,h);return{selectedIndices:f[0],validOutputs:f[1]}}var H$=D({nonMaxSuppressionPadded_:j$});async function q$(e,t,a,n=.5,r=Number.NEGATIVE_INFINITY,s=!1){let i=R(e,"boxes","nonMaxSuppressionAsync"),o=R(t,"scores","nonMaxSuppressionAsync"),l=Kl(i,o,a,n,r,null),u=l.maxOutputSize,d=l.iouThreshold,c=l.scoreThreshold,[p,h]=await Promise.all([i.data(),o.data()]),{selectedIndices:f,validOutputs:m}=v4(p,h,u,d,c,s);return i!==e&&i.dispose(),o!==t&&o.dispose(),{selectedIndices:Ut(f,"int32"),validOutputs:Fe(m,"int32")}}var X$=q$;function K$(e,t,a=!1,n=!1){let r=R(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(n===!1||a===!1,()=>"Error in resizeBilinear: If halfPixelCenters is true, alignCorners must be false.");let s=r,i=!1;r.rank===3&&(i=!0,s=J(r,[1,r.shape[0],r.shape[1],r.shape[2]]));let[]=t,o={images:s},l={alignCorners:a,halfPixelCenters:n,size:t},u=z.runKernel(Yi,o,l);return i?J(u,[u.shape[1],u.shape[2],u.shape[3]]):u}var Z$=D({resizeBilinear_:K$});function Y$(e,t,a=!1,n=!1){let r=R(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(n===!1||a===!1,()=>"Error in resizeNearestNeighbor: If halfPixelCenters is true, alignCorners must be false.");let s=r,i=!1;r.rank===3&&(i=!0,s=J(r,[1,r.shape[0],r.shape[1],r.shape[2]]));let[]=t,o={images:s},l={alignCorners:a,halfPixelCenters:n,size:t},u=z.runKernel(Zi,o,l);return i?J(u,[u.shape[1],u.shape[2],u.shape[3]]):u}var J$=D({resizeNearestNeighbor_:Y$});function Q$(e,t="binary",a=!1,n=.5){let r=R(e,"image","threshold"),s=.2989,i=.587,o=.114,l=r.shape[0]*r.shape[1],u=ae(Ut([n]),255),d,c,p,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,c,p]=ka(r,[1,1,1],-1);let m=ae(d,s),g=ae(c,i),y=ae(p,o);h=xe(xe(m,g),y)}else h=e;if(t==="otsu"){let m=I2(Ue(K2(h),"int32"),ze([]),256);u=e_(m,l)}let f=a?yh(h,u):np(h,u);return Ue(ae(f,255),"int32")}function e_(e,t){let a=Ut([-1]),n=Ut([0]),r=Ut([0]),s,i,o,l,u,d;for(let c=0;c`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:a,fillMode:n,fillValue:r,outputShape:s};return z.runKernel(io,l,u)}var n_=D({transform_:a_});function r_(e,t,a){F(t%1===0,()=>`bandPart(): numLower must be an integer, got ${t}.`),F(a%1===0,()=>`bandPart(): numUpper must be an integer, got ${a}.`);let n=R(e,"a","bandPart");F(n.rank>=2,()=>`bandPart(): Rank must be at least 2, got ${n.rank}.`);let r=n.shape,[s,i]=n.shape.slice(-2);if(!(t<=s))throw new Error(`bandPart(): numLower (${t}) must not be greater than the number of rows (${s}).`);if(!(a<=i))throw new Error(`bandPart(): numUpper (${a}) must not be greater than the number of columns (${i}).`);t<0&&(t=s),a<0&&(a=i);let o=J(ol(0,s,1,"int32"),[-1,1]),l=ol(0,i,1,"int32"),u=he(o,l),d=rd(yh(u,Fe(+t,"int32")),M2(u,Fe(-a,"int32"))),c=pn([s,i],n.dtype);return J(sa(Ta(J(n,[-1,s,i])).map(p=>ii(d,p,c))),r)}var s_=D({bandPart_:r_});function i_(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=ka(e,e.shape[0],0).map(r=>$e(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 a=[],n=e;for(let r=0;r{let s=n[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 ay(e,t);{let a=e.shape.slice(0,e.shape.length-2).reduce((l,u)=>l*u),n=Ta(J(e,[a,e.shape[e.shape.length-2],e.shape[e.shape.length-1]]),0),r=[],s=[];n.forEach(l=>{let[u,d]=ay(l,t);r.push(u),s.push(d)});let i=J(sa(r,0),e.shape),o=J(sa(s,0),e.shape);return[i,o]}}function ay(e,t=!1){return z.tidy(()=>{F(e.shape.length===2,()=>`qr2d() requires a 2D Tensor, but got a ${e.shape.length}D Tensor.`);let a=e.shape[0],n=e.shape[1],r=N2(a),s=wa(e),i=Kn([[1]],[1,1]),o=wa(i),l=a>=n?n:a;for(let u=0;u{let h=_e(s,[u,u],[a-u,1]),f=ap(h),m=_e(s,[u,u],[1,1]),g=ii(np(m,0),Kn([[-1]]),Kn([[1]])),y=he(m,ae(g,f)),A=fe(h,y);A.shape[0]===1?o=wa(i):o=at([i,_e(A,[1,0],[A.shape[0]-1,A.shape[1]])],0);let x=Xn(fe(st(g,y),f)),b=_e(s,[u,0],[a-u,n]),w=ae(x,o),S=si(o);if(u===0)s=he(b,st(w,st(S,b)));else{let _=he(b,st(w,st(S,b)));s=at([_e(s,[0,0],[u,n]),_],0)}let C=si(w),N=_e(r,[0,u],[a,r.shape[1]-u]);if(u===0)r=he(N,st(st(N,o),C));else{let _=he(N,st(st(N,o),C));r=at([_e(r,[0,0],[a,u]),_],1)}return[o,s,r]}),Y([d,c,p])}return!t&&a>n&&(r=_e(r,[0,0],[a,n]),s=_e(s,[0,0],[n,n])),[r,s]})}var u_=D({qr_:l_}),xa;(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"})(xa||(xa={}));function d_(e,t,a=xa.SUM_BY_NONZERO_WEIGHTS){let n=R(e,"losses","computeWeightedLoss"),r=null;t!=null&&(r=R(t,"weights","computeWeightedLoss"));let s=r==null?n:ae(n,r);if(a===xa.NONE)return s;if(a===xa.SUM)return tt(s);if(a===xa.MEAN){if(r==null)return sd(s);{let i=n.size/r.size,o=fe(tt(s),tt(r));return i>1?fe(o,Fe(i)):o}}if(a===xa.SUM_BY_NONZERO_WEIGHTS){if(r==null)return fe(tt(s),Fe(n.size));{let i=ae(r,Br(n.shape)),o=Ue(tt(W2(i,Fe(0))),"float32");return fe(tt(s),o)}}throw Error(`Unknown reduction: ${a}`)}var Ir=D({computeWeightedLoss_:d_});function p_(e,t,a,n=xa.SUM_BY_NONZERO_WEIGHTS){let r=R(e,"labels","absoluteDifference"),s=R(t,"predictions","absoluteDifference"),i=null;a!=null&&(i=R(a,"weights","absoluteDifference")),Sa(r.shape,s.shape,"Error in absoluteDifference: ");let o=Ha(he(r,s));return Ir(o,i,n)}var c_=D({absoluteDifference_:p_});function h_(e,t,a,n,r=xa.SUM_BY_NONZERO_WEIGHTS){let s=R(e,"labels","cosineDistance"),i=R(t,"predictions","cosineDistance"),o=null;n!=null&&(o=R(n,"weights","cosineDistance")),Sa(s.shape,i.shape,"Error in cosineDistance: ");let l=Fe(1),u=he(l,tt(ae(s,i),a,!0));return Ir(u,o,r)}var f_=D({cosineDistance_:h_});function m_(e,t,a,n=xa.SUM_BY_NONZERO_WEIGHTS){let r=R(e,"labels","hingeLoss"),s=R(t,"predictions","hingeLoss"),i=null;a!=null&&(i=R(a,"weights","hingeLoss")),Sa(r.shape,s.shape,"Error in hingeLoss: ");let o=Fe(1);r=he(ae(Fe(2),r),o);let l=rp(he(o,ae(r,s)));return Ir(l,i,n)}var g_=D({hingeLoss_:m_});function y_(e,t,a,n=1,r=xa.SUM_BY_NONZERO_WEIGHTS){let s=R(e,"labels","huberLoss"),i=R(t,"predictions","huberLoss"),o=null;a!=null&&(o=R(a,"weights","huberLoss")),Sa(s.shape,i.shape,"Error in huberLoss: ");let l=Fe(n),u=Ha(he(i,s)),d=B2(u,l),c=he(u,d),p=xe(ae(Fe(.5),In(d)),ae(l,c));return Ir(p,o,r)}var A_=D({huberLoss_:y_});function x_(e,t,a,n=1e-7,r=xa.SUM_BY_NONZERO_WEIGHTS){let s=R(e,"labels","logLoss"),i=R(t,"predictions","logLoss"),o=null;a!=null&&(o=R(a,"weights","logLoss")),Sa(s.shape,i.shape,"Error in logLoss: ");let l=Fe(1),u=Fe(n),d=Xn(ae(s,il(xe(i,u)))),c=ae(he(l,s),il(xe(he(l,i),u))),p=he(d,c);return Ir(p,o,r)}var b_=D({logLoss_:x_});function v_(e,t,a,n=xa.SUM_BY_NONZERO_WEIGHTS){let r=R(e,"labels","meanSquaredError"),s=R(t,"predictions","meanSquaredError"),i=null;a!=null&&(i=R(a,"weights","meanSquaredError")),Sa(r.shape,s.shape,"Error in meanSquaredError: ");let o=Y2(r,s);return Ir(o,i,n)}var w_=D({meanSquaredError_:v_});function k_(e,t){let a=R(e,"labels","sigmoidCrossEntropyWithLogits"),n=R(t,"logits","sigmoidCrossEntropyWithLogits");Sa(a.shape,n.shape,"Error in sigmoidCrossEntropyWithLogits: ");let r=rp(n),s=ae(n,a),i=_2(Xr(Xn(Ha(n))));return xe(he(r,s),i)}function I_(e,t,a,n=0,r=xa.SUM_BY_NONZERO_WEIGHTS){let s=R(e,"multiClassLabels","sigmoidCrossEntropy"),i=R(t,"logits","sigmoidCrossEntropy"),o=null;if(a!=null&&(o=R(a,"weights","sigmoidCrossEntropy")),Sa(s.shape,i.shape,"Error in sigmoidCrossEntropy: "),n>0){let u=Fe(n),d=Fe(1),c=Fe(.5);s=xe(ae(s,he(d,u)),ae(c,u))}let l=k_(s,i);return Ir(l,o,r)}var S_=D({sigmoidCrossEntropy_:I_});function T_(e,t,a=-1){if(a===-1&&(a=t.rank-1),a!==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 ${a}`);return Qn((n,r,s)=>{let i=P2(r,[a],!0),o=he(Ue(r,"float32"),i);s([n,o]);let l=Xn(ae(o,n));return{value:tt(l,[a]),gradFunc:(u,d)=>{let[c,p]=d,h=tp(u.shape,[a]);return[ae(J(u,h),he(Ue(c,"float32"),Xr(p))),ae(J(u,h),he(Xr(p),Ue(c,"float32")))]}}})(e,t)}function C_(e,t,a,n=0,r=xa.SUM_BY_NONZERO_WEIGHTS){let s=R(e,"onehotLabels","softmaxCrossEntropy"),i=R(t,"logits","softmaxCrossEntropy"),o=null;if(a!=null&&(o=R(a,"weights","softmaxCrossEntropy")),Sa(s.shape,i.shape,"Error in softmaxCrossEntropy: "),n>0){let u=Fe(n),d=Fe(1),c=Fe(s.shape[1]);s=xe(ae(s,he(d,u)),fe(u,c))}let l=T_(s,i);return Ir(l,o,r)}var N_=D({softmaxCrossEntropy_:C_});function E_(e,t,a,n){let r=R(e,"indices","sparseFillEmptyRows","int32"),s=R(t,"values","sparseFillEmptyRows"),i=R(a,"denseShape","sparseFillEmptyRows","int32"),o=R(n,"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=z.runKernel(Od,l);return{outputIndices:u[0],outputValues:u[1],emptyRowIndicator:u[2],reverseIndexMap:u[3]}}var R_=D({sparseFillEmptyRows_:E_});function M_(e,t,a){let n=R(e,"inputIndices","sparseReshape","int32"),r=R(t,"inputShape","sparseReshape","int32"),s=R(a,"newShape","sparseReshape","int32");if(n.rank!==2)throw new Error(`Input indices should be Tensor2D but received shape + ${n.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:n,inputShape:r,newShape:s},o=z.runKernel(Vl,i);return{outputIndices:o[0],outputShape:o[1]}}var $_=D({sparseReshape_:M_});function __(e,t,a){let n=R(e,"data","sparseSegmentMean"),r=R(t,"indices","sparseSegmentMean","int32"),s=R(a,"segmentIds","sparseSegmentMean","int32");if(n.rank<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(r.rank!==1)throw new Error(`Indices should be Tensor1D but received shape + ${r.shape}`);if(s.rank!==1)throw new Error(`Segment ids should be Tensor1D but received shape + ${s.shape}`);let i={data:n,indices:r,segmentIds:s};return z.runKernel(Dd,i)}var F_=D({sparseSegmentMean_:__});function P_(e,t,a){let n=R(e,"data","sparseSegmentSum"),r=R(t,"indices","sparseSegmentSum","int32"),s=R(a,"segmentIds","sparseSegmentSum","int32");if(n.rank<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(r.rank!==1)throw new Error(`Indices should be Tensor1D but received shape + ${r.shape}`);if(s.rank!==1)throw new Error(`Segment ids should be Tensor1D but received shape + ${s.shape}`);let i={data:n,indices:r,segmentIds:s};return z.runKernel(zd,i)}var O_=D({sparseSegmentSum_:P_});function D_(e,t,a,n,r,s,i,o){let l=R(e,"data","stringNGrams","string");if(l.dtype!=="string")throw new Error("Data must be of datatype string");if(l.shape.length!==1)throw new Error(`Data must be a vector, saw: ${l.shape}`);let u=R(t,"dataSplits","stringNGrams");if(u.dtype!=="int32")throw new Error("Data splits must be of datatype int32");let d={separator:a,nGramWidths:n,leftPad:r,rightPad:s,padWidth:i,preserveShortSequences:o},c={data:l,dataSplits:u},p=z.runKernel(Gl,c,d);return{nGrams:p[0],nGramsSplits:p[1]}}var z_=D({stringNGrams_:D_});function L_(e,t,a=!0){let n=R(e,"input","stringSplit","string"),r=R(t,"delimiter","stringSplit","string");if(n.rank!==1)throw new Error(`Input should be Tensor1D but received shape ${n.shape}`);if(r.rank!==0)throw new Error(`Delimiter should be a scalar but received shape ${r.shape}`);let s={skipEmpty:a},i={input:n,delimiter:r},o=z.runKernel(Wd,i,s);return{indices:o[0],values:o[1],shape:o[2]}}var B_=D({stringSplit_:L_});function W_(e,t){let a=R(e,"input","stringToHashBucketFast","string"),n={numBuckets:t};if(t<=0)throw new Error("Number of buckets must be at least 1");let r={input:a};return z.runKernel(Vd,r,n)}var V_=D({stringToHashBucketFast_:W_}),k4={fft:wh,ifft:id,rfft:kh,irfft:Z2},I4={hammingWindow:A$,hannWindow:A4,frame:x4,stft:w$},me={flipLeftRight:T$,grayscaleToRGB:N$,resizeNearestNeighbor:J$,resizeBilinear:Z$,rotateWithOffset:R$,cropAndResize:I$,nonMaxSuppression:$$,nonMaxSuppressionAsync:B$,nonMaxSuppressionWithScore:V$,nonMaxSuppressionWithScoreAsync:U$,nonMaxSuppressionPadded:H$,nonMaxSuppressionPaddedAsync:X$,threshold:t_,transform:n_},S4={bandPart:s_,gramSchmidt:o_,qr:u_},T4={absoluteDifference:c_,computeWeightedLoss:Ir,cosineDistance:f_,hingeLoss:g_,huberLoss:A_,logLoss:b_,meanSquaredError:w_,sigmoidCrossEntropy:S_,softmaxCrossEntropy:N_},C4={sparseFillEmptyRows:R_,sparseReshape:$_,sparseSegmentMean:F_,sparseSegmentSum:O_},N4={stringNGrams:z_,stringSplit:B_,stringToHashBucketFast:V_},vs=class extends cx{minimize(e,t=!1,a){let{value:n,grads:r}=this.computeGradients(e,a);if(a!=null){let s=a.map(i=>({name:i.name,tensor:r[i.name]}));this.applyGradients(s)}else this.applyGradients(r);return Y(r),t?n:(n.dispose(),null)}get iterations(){return this.iterations_==null&&(this.iterations_=0),this.iterations_}incrementIterations(){this.iterations_=this.iterations+1}computeGradients(e,t){return hb(e,t)}dispose(){this.iterations_!=null&&Y(this.iterations_)}async saveIterations(){return this.iterations_==null&&(this.iterations_=0),{name:"iter",tensor:Fe(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(vs,Symbol.hasInstance,{value:e=>e.minimize!=null&&e.computeGradients!=null&&e.applyGradients!=null});var Eh=class extends vs{constructor(e,t,a=null){super(),this.learningRate=e,this.rho=t,this.epsilon=a,this.accumulatedGrads=[],this.accumulatedUpdates=[],a==null&&(this.epsilon=z.backend.epsilon())}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,a)=>{let n=z.registeredVariables[t],r=!1;this.accumulatedGrads[a]==null&&(this.accumulatedGrads[a]={originalName:`${t}/accum_grad`,variable:Ee(()=>Xa(n).variable(r))}),this.accumulatedUpdates[a]==null&&(this.accumulatedUpdates[a]={originalName:`${t}/accum_var`,variable:Ee(()=>Xa(n).variable(r))});let s=Array.isArray(e)?e[a].tensor:e[t];if(s==null)return;let i=this.accumulatedGrads[a].variable,o=this.accumulatedUpdates[a].variable;Ee(()=>{let l=xe(ae(i,this.rho),ae(In(s),1-this.rho)),u=ae(fe(Jn(xe(o,this.epsilon)),Jn(xe(i,this.epsilon))),s),d=xe(ae(o,this.rho),ae(In(u),1-this.rho));i.assign(l),o.assign(d);let c=xe(ae(u,-this.learningRate),n);n.assign(c)})}),this.incrementIterations()}dispose(){this.accumulatedUpdates!=null&&(Y(this.accumulatedGrads.map(e=>e.variable)),Y(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,a=!1;this.accumulatedGrads=e.slice(0,t).map(n=>({originalName:n.name,variable:n.tensor.variable(a)})),this.accumulatedUpdates=e.slice(t,t*2).map(n=>({originalName:n.name,variable:n.tensor.variable(a)}))}getConfig(){return{learningRate:this.learningRate,rho:this.rho,epsilon:this.epsilon}}static fromConfig(e,t){return new e(t.learningRate,t.rho,t.epsilon)}};Eh.className="Adadelta";bs(Eh);var Rh=class extends vs{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,a)=>{let n=z.registeredVariables[t];this.accumulatedGrads[a]==null&&(this.accumulatedGrads[a]={originalName:`${t}/accumulator`,variable:Ee(()=>nr(n.shape,this.initialAccumulatorValue).variable(!1))});let r=Array.isArray(e)?e[a].tensor:e[t];if(r==null)return;let s=this.accumulatedGrads[a].variable;Ee(()=>{let i=xe(s,In(r));s.assign(i);let o=xe(ae(fe(r,Jn(xe(i,z.backend.epsilon()))),-this.learningRate),n);n.assign(o)})}),this.incrementIterations()}dispose(){this.accumulatedGrads!=null&&Y(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(a=>({originalName:a.name,variable:a.tensor.variable(t)}))}getConfig(){return{learningRate:this.learningRate,initialAccumulatorValue:this.initialAccumulatorValue}}static fromConfig(e,t){return new e(t.learningRate,t.initialAccumulatorValue)}};Rh.className="Adagrad";bs(Rh);var Mh=class extends vs{constructor(e,t,a,n=null){super(),this.learningRate=e,this.beta1=t,this.beta2=a,this.epsilon=n,this.accumulatedFirstMoment=[],this.accumulatedSecondMoment=[],Ee(()=>{this.accBeta1=Fe(t).variable(),this.accBeta2=Fe(a).variable()}),n==null&&(this.epsilon=z.backend.epsilon())}applyGradients(e){let t=Array.isArray(e)?e.map(a=>a.name):Object.keys(e);Ee(()=>{let a=he(1,this.accBeta1),n=he(1,this.accBeta2);t.forEach((r,s)=>{let i=z.registeredVariables[r],o=!1;this.accumulatedFirstMoment[s]==null&&(this.accumulatedFirstMoment[s]={originalName:`${r}/m`,variable:Ee(()=>Xa(i).variable(o))}),this.accumulatedSecondMoment[s]==null&&(this.accumulatedSecondMoment[s]={originalName:`${r}/v`,variable:Ee(()=>Xa(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,c=xe(ae(u,this.beta1),ae(l,1-this.beta1)),p=xe(ae(d,this.beta2),ae(In(l),1-this.beta2)),h=fe(c,a),f=fe(p,n);u.assign(c),d.assign(p);let m=xe(ae(fe(h,xe(Jn(f),this.epsilon)),-this.learningRate),i);i.assign(m)}),this.accBeta1.assign(ae(this.accBeta1,this.beta1)),this.accBeta2.assign(ae(this.accBeta2,this.beta2))}),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.accBeta2.dispose(),this.accumulatedFirstMoment!=null&&Y(this.accumulatedFirstMoment.map(e=>e.variable)),this.accumulatedSecondMoment!=null&&Y(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),Ee(()=>{this.accBeta1.assign(sl(this.beta1,this.iterations_+1)),this.accBeta2.assign(sl(this.beta2,this.iterations_+1))});let t=e.length/2,a=!1;this.accumulatedFirstMoment=e.slice(0,t).map(n=>({originalName:n.name,variable:n.tensor.variable(a)})),this.accumulatedSecondMoment=e.slice(t,t*2).map(n=>({originalName:n.name,variable:n.tensor.variable(a)}))}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)}};Mh.className="Adam";bs(Mh);var $h=class extends vs{constructor(e,t,a,n=null,r=0){super(),this.learningRate=e,this.beta1=t,this.beta2=a,this.epsilon=n,this.decay=r,this.accumulatedFirstMoment=[],this.accumulatedWeightedInfNorm=[],Ee(()=>{this.iteration=Fe(0).variable(),this.accBeta1=Fe(t).variable()}),n==null&&(this.epsilon=z.backend.epsilon())}applyGradients(e){let t=Array.isArray(e)?e.map(a=>a.name):Object.keys(e);Ee(()=>{let a=he(1,this.accBeta1),n=fe(-this.learningRate,xe(ae(this.iteration,this.decay),1));t.forEach((r,s)=>{let i=z.registeredVariables[r],o=!1;this.accumulatedFirstMoment[s]==null&&(this.accumulatedFirstMoment[s]={originalName:`${r}/m`,variable:Xa(i).variable(o)}),this.accumulatedWeightedInfNorm[s]==null&&(this.accumulatedWeightedInfNorm[s]={originalName:`${r}/v`,variable:Xa(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,c=xe(ae(u,this.beta1),ae(l,1-this.beta1)),p=ae(d,this.beta2),h=Ha(l),f=L2(p,h);u.assign(c),d.assign(f);let m=xe(ae(fe(n,a),fe(c,xe(f,this.epsilon))),i);i.assign(m)}),this.iteration.assign(xe(this.iteration,1)),this.accBeta1.assign(ae(this.accBeta1,this.beta1))}),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.iteration.dispose(),this.accumulatedFirstMoment!=null&&Y(this.accumulatedFirstMoment.map(e=>e.variable)),this.accumulatedWeightedInfNorm!=null&&Y(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)}};$h.className="Adamax";bs($h);var ip=class extends vs{constructor(e){super(),this.learningRate=e,this.setLearningRate(e)}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,a)=>{let n=Array.isArray(e)?e[a].tensor:e[t];if(n==null)return;let r=z.registeredVariables[t];Ee(()=>{let s=xe(ae(this.c,n),r);r.assign(s)})}),this.incrementIterations()}setLearningRate(e){this.learningRate=e,this.c!=null&&this.c.dispose(),this.c=qn(Fe(-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)}};ip.className="SGD";bs(ip);var _h=class extends ip{constructor(e,t,a=!1){super(e),this.learningRate=e,this.momentum=t,this.useNesterov=a,this.accumulations=[],this.m=Fe(this.momentum)}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,a)=>{let n=z.registeredVariables[t];this.accumulations[a]==null&&(this.accumulations[a]={originalName:`${t}/momentum`,variable:Ee(()=>Xa(n).variable(!1))});let r=this.accumulations[a].variable,s=Array.isArray(e)?e[a].tensor:e[t];s!=null&&Ee(()=>{let i,o=xe(ae(this.m,r),s);this.useNesterov?i=xe(ae(this.c,xe(s,ae(o,this.m))),n):i=xe(ae(this.c,o),n),r.assign(o),n.assign(i)})}),this.incrementIterations()}dispose(){this.m.dispose(),this.accumulations!=null&&Y(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(a=>({originalName:a.name,variable:a.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)}};_h.className="Momentum";bs(_h);var Fh=class extends vs{constructor(e,t=.9,a=0,n=null,r=!1){if(super(),this.learningRate=e,this.decay=t,this.momentum=a,this.epsilon=n,this.accumulatedMeanSquares=[],this.accumulatedMoments=[],this.accumulatedMeanGrads=[],this.centered=r,n==null&&(this.epsilon=z.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,a)=>{let n=z.registeredVariables[t],r=!1;this.accumulatedMeanSquares[a]==null&&(this.accumulatedMeanSquares[a]={originalName:`${t}/rms`,variable:Ee(()=>Xa(n).variable(r))}),this.accumulatedMoments[a]==null&&(this.accumulatedMoments[a]={originalName:`${t}/momentum`,variable:Ee(()=>Xa(n).variable(r))}),this.accumulatedMeanGrads[a]==null&&this.centered&&(this.accumulatedMeanGrads[a]={originalName:`${t}/mg`,variable:Ee(()=>Xa(n).variable(r))});let s=Array.isArray(e)?e[a].tensor:e[t];if(s==null)return;let i=this.accumulatedMeanSquares[a].variable,o=this.accumulatedMoments[a].variable;Ee(()=>{let l=xe(ae(i,this.decay),ae(In(s),1-this.decay));if(this.centered){let u=this.accumulatedMeanGrads[a].variable,d=xe(ae(u,this.decay),ae(s,1-this.decay)),c=fe(ae(s,this.learningRate),Jn(he(l,xe(In(d),this.epsilon)))),p=xe(ae(o,this.momentum),c);i.assign(l),u.assign(d),o.assign(p);let h=he(n,p);n.assign(h)}else{let u=xe(ae(i,this.decay),ae(In(s),1-this.decay)),d=xe(ae(o,this.momentum),fe(ae(s,this.learningRate),Jn(xe(u,this.epsilon))));i.assign(u),o.assign(d);let c=he(n,d);n.assign(c)}})}),this.incrementIterations()}dispose(){this.accumulatedMeanSquares!=null&&Y(this.accumulatedMeanSquares.map(e=>e.variable)),this.accumulatedMeanGrads!=null&&this.centered&&Y(this.accumulatedMeanGrads.map(e=>e.variable)),this.accumulatedMoments!=null&&Y(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,a=!1;this.accumulatedMeanSquares=e.slice(0,t).map(n=>({originalName:n.name,variable:n.tensor.variable(a)})),this.accumulatedMoments=e.slice(t,t*2).map(n=>({originalName:n.name,variable:n.tensor.variable(a)})),this.centered&&(this.accumulatedMeanGrads=e.slice(t*2,t*3).map(n=>({originalName:n.name,variable:n.tensor.variable(a)})))}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)}};Fh.className="RMSProp";bs(Fh);var Or=class{static sgd(e){return new ip(e)}static momentum(e,t,a=!1){return new _h(e,t,a)}static rmsprop(e,t=.9,a=0,n=null,r=!1){return new Fh(e,t,a,n,r)}static adam(e=.001,t=.9,a=.999,n=null){return new Mh(e,t,a,n)}static adadelta(e=.001,t=.95,a=null){return new Eh(e,t,a)}static adamax(e=.002,t=.9,a=.999,n=null,r=0){return new $h(e,t,a,n,r)}static adagrad(e,t=.1){return new Rh(e,t)}},G_={sgd:Or.sgd,momentum:Or.momentum,adadelta:Or.adadelta,adagrad:Or.adagrad,rmsprop:Or.rmsprop,adamax:Or.adamax,adam:Or.adam},U_=(()=>typeof requestAnimationFrame!="undefined"?requestAnimationFrame:typeof setImmediate!="undefined"?setImmediate:e=>e())();function E4(){return new Promise(e=>U_(()=>e()))}var T={};He(T,{ERF_A1:()=>oF,ERF_A2:()=>lF,ERF_A3:()=>uF,ERF_A4:()=>dF,ERF_A5:()=>pF,ERF_P:()=>iF,PARALLELIZE_THRESHOLD:()=>n3,RowPartitionType:()=>Un,SELU_SCALE:()=>sF,SELU_SCALEALPHA:()=>rF,applyActivation:()=>Ch,assertAndGetBroadcastShape:()=>zt,assertAxesAreInnerMostDims:()=>WE,assertParamsConsistent:()=>j_,assignToTypedArray:()=>yF,axesAreInnerMostDims:()=>C2,calculateShapes:()=>ax,checkEinsumDimSizes:()=>kF,checkPadOnDimRoundingMode:()=>Sn,combineLocations:()=>nb,combineRaggedTensorToTensorShapes:()=>q_,complexWithEvenIndex:()=>fF,complexWithOddIndex:()=>mF,computeConv2DInfo:()=>Jd,computeConv3DInfo:()=>Cx,computeDefaultPad:()=>v2,computeDilation2DInfo:()=>BN,computeOptimalWindowSize:()=>Y_,computeOutAndReduceShapes:()=>BE,computeOutShape:()=>H_,computePool2DInfo:()=>Tx,computePool3DInfo:()=>WN,convertConv2DDataFormat:()=>Nx,decodeEinsumEquation:()=>vF,eitherStridesOrDilationsAreOne:()=>kr,expandShapeToKeepDim:()=>tp,exponent:()=>xF,exponents:()=>AF,fromStringArrayToUint8:()=>UF,fromUint8ToStringArray:()=>GF,getAxesPermutation:()=>VE,getBroadcastDims:()=>QA,getComplexWithIndex:()=>gF,getEinsumComputePath:()=>IF,getEinsumPermutation:()=>wF,getFusedBiasGradient:()=>Th,getFusedDyActivation:()=>Sh,getImageCenter:()=>J_,getInnerMostAxes:()=>UE,getPermuted:()=>eF,getRaggedRank:()=>K_,getReductionAxes:()=>c2,getReshaped:()=>Q_,getReshapedPermuted:()=>tF,getRowPartitionTypesHelper:()=>X_,getSliceBeginCoords:()=>aF,getSliceSize:()=>nF,getSparseFillEmptyRowsIndicesDenseShapeMismatch:()=>NF,getSparseFillEmptyRowsNegativeIndexErrorMessage:()=>EF,getSparseFillEmptyRowsOutOfRangeIndexErrorMessage:()=>RF,getSparseReshapeEmptyTensorZeroOutputDimErrorMessage:()=>_F,getSparseReshapeInputOutputMismatchErrorMessage:()=>PF,getSparseReshapeInputOutputMultipleErrorMessage:()=>FF,getSparseReshapeMultipleNegativeOneOutputDimErrorMessage:()=>MF,getSparseReshapeNegativeOutputDimErrorMessage:()=>$F,getSparseSegmentReductionIndicesOutOfRangeErrorMessage:()=>LF,getSparseSegmentReductionNegativeSegmentIdsErrorMessage:()=>OF,getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage:()=>DF,getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage:()=>zF,getUndoAxesPermutation:()=>GE,isIdentityPermutation:()=>SF,log:()=>sT,mergeRealAndImagArrays:()=>cF,prepareAndValidate:()=>tx,prepareSplitSize:()=>CF,segment_util:()=>R4,shouldFuse:()=>Nh,slice_util:()=>At,splitRealAndImagArrays:()=>hF,tupleValuesAreOne:()=>nd,upcastType:()=>ra,validateDefaultValueShape:()=>Z_,validateInput:()=>y2,validateUpdateShape:()=>g2,warn:()=>Dr});function j_(e,t){let a=e[0].length;e.forEach((r,s)=>{F(r.length===a,()=>`Error in concat${a}D: rank of tensors[${s}] must be the same as the rank of the rest (${a})`)}),F(t>=0&&t`Error in concat${a}D: axis must be between 0 and ${a-1}.`);let n=e[0];e.forEach((r,s)=>{for(let i=0;i`Error in concat${a}D: Shape of tensors[${s}] (${r}) does not match the shape of the rest (${n}) along the non-concatenated axis ${s}.`)})}function H_(e,t){let a=e[0].slice();for(let n=1;n=0)if(o>=0){if(o!==s)throw new Error(`rt input.shape and shape=${t} are incompatible: rt input.shape[${r+e}] = ${s} but shape[${r+e}] = ${o}`)}else n[i]=s}return n}function X_(e){let t={FIRST_DIM_SIZE:Un.FIRST_DIM_SIZE,VALUE_ROWIDS:Un.VALUE_ROWIDS,ROW_LENGTHS:Un.ROW_LENGTHS,ROW_SPLITS:Un.ROW_SPLITS,ROW_LIMITS:Un.ROW_LIMITS,ROW_STARTS:Un.ROW_STARTS},a=[];for(let n of e)if(n in t)a.push(t[n]);else break;return a}function K_(e){return e.length===0?0:e[0]===Un.FIRST_DIM_SIZE?e.length-1:e.length}function Z_(e,t){if(e==null||t==null)return;let a=e.length,n=t.length;if(a>=n)throw new Error(`defaultValue.shape=${e} and ragged tensor flatValues.shape=${t}, are incompatible: defaultValue.rank = ${a} must be less than ragged tensor input flatValues.rank = ${n})`);for(let r=0;r=0&&i>=0&&s!==1&&s!==i)throw new Error(`defaultValue.shape=${e}, and ragged tensor input flatValues.shape=${t} are incompatible: defaultValue.shape[${r-e.length}] = ${s} but ragged tensor input.flatValues.shape[${r-e.length}] = ${i}`)}}var n3=30;function Y_(e){return e<=n3?e:wc(e,Math.floor(Math.sqrt(e)))}function J_(e,t,a){let n=a*(typeof e=="number"?e:e[0]),r=t*(typeof e=="number"?e:e[1]);return[n,r]}function Q_(e,t,a,n=!0){let r=[];if(n)r=r.concat(t.slice(0)),r.push(e[0]/a),r=r.concat(e.slice(1));else{r=r.concat(e[0]);let s=t.length;for(let i=0;i=t*2+1||i%2===1?s.push(i):r.push(i);n.push(...r),n.push(0),n.push(...s)}return n}function tF(e,t,a,n=!0){let r=[];n?r.push(e[0]/a):r.push(e[0]*a);for(let s=1;s/g,ny=",",ry="...";function vF(e,t){e=e.replace(/\s/g,"");let a=(e.length-e.replace(bF,"").length)/Pm.length;if(a<1)throw new Error("Equations without an arrow are not supported.");if(a>1)throw new Error(`Equation must contain exactly one arrow ("${Pm}").`);let[n,r]=e.split(Pm);F(n.indexOf(ry)===-1,()=>`The ellipsis notation ("${ry}") is not supported yet.`);let s=n.split(ny),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 p=0;pf.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 p=0;pr!==-1),{permutationIndices:a,expandDims:n}}function kF(e,t,a){let n=new Array(e);for(let r=0;r`Expected dimension ${n[t[r][i]]} at axis ${i} of input shaped ${JSON.stringify(s)}, but got dimension ${s[i]}`)}}function IF(e,t){let a=e,n=[],r=0;e.length===0&&a.push(-1),r=e.length+1;for(let i=0;it===a)}function TF(e,t){let a=[];for(let n=0;n"Number of splits must evenly divide the axis."),n=new Array(t).fill(e.shape[a]/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[a]-i}F(e.shape[a]===t.reduce((i,o)=>i+o),()=>"The sum of sizes must match the size of the axis dimension."),n=t}return n}function NF(e){return`Received SparseTensor with denseShape[0] = 0 but + indices.shape[0] = ${e}`}function EF(e,t){return`indices(${e}, 0) is invalid: ${t} < 0`}function RF(e,t,a){return`indices(${e}, 0) is invalid: ${t} >= ${a}`}function MF(e,t){return`only one output dimension may be -1, not both ${e} and ${t}`}function $F(e,t){return`size ${e} must be non-negative, not ${t}`}function _F(){return"reshape cannot infer the missing input size for an empty tensor unless all specified input sizes are non-zero"}function FF(e,t){let a=yt(e),n=yt(t);return`Input to reshape is a SparseTensor with ${a} + dense values, but the requested shape requires a multiple of ${n}. inputShape=${e} outputShape= ${t}`}function PF(e,t){let a=yt(e),n=yt(t);return`Input to reshape is a tensor with ${a} dense values, but the requested shape has ${n}. inputShape=${e} outputShape=${t}`}function OF(){return"segment ids must be >= 0"}function DF(){return"segment ids are not increasing"}function zF(e,t){return`Segment id ${e} out of range [0, ${t}), possibly because segmentIds input is not sorted.`}function LF(e,t,a){return`Bad: indices[${e}] == ${t} out of range [0, ${a})`}var R4={};He(R4,{collectGatherOpShapeInfo:()=>VF,computeOutShape:()=>WF,segOpComputeOptimalWindowSize:()=>BF});function BF(e,t){let a=!1,n;for(e<=n3?(n=e,a=!0):n=wc(e,Math.floor(Math.sqrt(e)));!a;)n>t||n===e?a=!0:n=wc(e,n+1);return n}function WF(e,t,a){let n=[],r=e.length;for(let s=0;sr))throw new Error(`Expect batchDims in the range of [-${r}, ${r}], but got ${n}`);if(n<0&&(n+=r),n>s)throw new Error(`batchDims (${n}) must be less than rank(x) ( + ${s}).`);if(aIc(t))}catch(t){throw new Error(`Failed to decode encoded string bytes into utf-8, error: ${t}`)}}function UF(e){return e.map(t=>Ud(t))}var Tn={};He(Tn,{nonMaxSuppressionV3Impl:()=>b4,nonMaxSuppressionV4Impl:()=>v4,nonMaxSuppressionV5Impl:()=>w4,whereImpl:()=>d4});var jF=V();jF.registerFlag("KEEP_INTERMEDIATE_TENSORS",()=>!1,e=>{e&&console.warn("Keep intermediate tensors is ON. This will print the values of all intermediate tensors during model inference. Not all models support this mode. For details, check e2e/benchmarks/ model_config.js. This significantly impacts performance.")});var wn;(function(e){e[e.DT_INVALID=0]="DT_INVALID",e[e.DT_FLOAT=1]="DT_FLOAT",e[e.DT_DOUBLE=2]="DT_DOUBLE",e[e.DT_INT32=3]="DT_INT32",e[e.DT_UINT8=4]="DT_UINT8",e[e.DT_INT16=5]="DT_INT16",e[e.DT_INT8=6]="DT_INT8",e[e.DT_STRING=7]="DT_STRING",e[e.DT_COMPLEX64=8]="DT_COMPLEX64",e[e.DT_INT64=9]="DT_INT64",e[e.DT_BOOL=10]="DT_BOOL",e[e.DT_QINT8=11]="DT_QINT8",e[e.DT_QUINT8=12]="DT_QUINT8",e[e.DT_QINT32=13]="DT_QINT32",e[e.DT_BFLOAT16=14]="DT_BFLOAT16",e[e.DT_QINT16=15]="DT_QINT16",e[e.DT_QUINT16=16]="DT_QUINT16",e[e.DT_UINT16=17]="DT_UINT16",e[e.DT_COMPLEX128=18]="DT_COMPLEX128",e[e.DT_HALF=19]="DT_HALF",e[e.DT_RESOURCE=20]="DT_RESOURCE",e[e.DT_VARIANT=21]="DT_VARIANT",e[e.DT_UINT32=22]="DT_UINT32",e[e.DT_UINT64=23]="DT_UINT64",e[e.DT_FLOAT_REF=101]="DT_FLOAT_REF",e[e.DT_DOUBLE_REF=102]="DT_DOUBLE_REF",e[e.DT_INT32_REF=103]="DT_INT32_REF",e[e.DT_UINT8_REF=104]="DT_UINT8_REF",e[e.DT_INT16_REF=105]="DT_INT16_REF",e[e.DT_INT8_REF=106]="DT_INT8_REF",e[e.DT_STRING_REF=107]="DT_STRING_REF",e[e.DT_COMPLEX64_REF=108]="DT_COMPLEX64_REF",e[e.DT_INT64_REF=109]="DT_INT64_REF",e[e.DT_BOOL_REF=110]="DT_BOOL_REF",e[e.DT_QINT8_REF=111]="DT_QINT8_REF",e[e.DT_QUINT8_REF=112]="DT_QUINT8_REF",e[e.DT_QINT32_REF=113]="DT_QINT32_REF",e[e.DT_BFLOAT16_REF=114]="DT_BFLOAT16_REF",e[e.DT_QINT16_REF=115]="DT_QINT16_REF",e[e.DT_QUINT16_REF=116]="DT_QUINT16_REF",e[e.DT_UINT16_REF=117]="DT_UINT16_REF",e[e.DT_COMPLEX128_REF=118]="DT_COMPLEX128_REF",e[e.DT_HALF_REF=119]="DT_HALF_REF",e[e.DT_RESOURCE_REF=120]="DT_RESOURCE_REF",e[e.DT_VARIANT_REF=121]="DT_VARIANT_REF",e[e.DT_UINT32_REF=122]="DT_UINT32_REF",e[e.DT_UINT64_REF=123]="DT_UINT64_REF"})(wn||(wn={}));var sy;(function(e){let t;(function(a){a[a.LEGACY=0]="LEGACY",a[a.V1=1]="V1",a[a.V2=2]="V2"})(t=e.CheckpointFormatVersion||(e.CheckpointFormatVersion={}))})(sy||(sy={}));var r3={};function HF(e,t){let a={tfOpName:e,category:"custom",inputs:[],attrs:[],customExecutor:t};r3[e]=a}function M4(e){return r3[e]}function qF(e){delete r3[e]}function k(e,t,a,n,r){let s=t.inputParams[e];if(s&&s.inputIndexStart!==void 0){let o=s.inputIndexStart,l=s.inputIndexEnd===0?void 0:s.inputIndexEnd===void 0?o+1:s.inputIndexEnd;if(s.type==="tensor")return ba(t.inputNames[s.inputIndexStart],a,n,r);if(s.type==="tensors")return t.inputNames.slice(o,l).map(c=>ba(c,a,n,r));let u=ba(t.inputNames.slice(o)[0],a,n,r),d=u.dataSync();return s.type==="number"?d[0]:v.toNestedArray(u.shape,d)}let i=t.attrParams[e];return i&&i.value}function ba(e,t,a,n){let[r,s]=ja(e);if(n!=null){let o=n.getHashTableHandleByName(r);if(o!=null)return o}let i=a.currentContextIds.find(o=>!!t[Ec(r,o)]);return i!==void 0?t[Ec(r,i)][s]:void 0}function XF(e,t,a){return t[Ec(e,a.currentContextId)]}function jn(e,t){let[a,n,r]=ja(e);return[Ec(a,t&&t.currentContextId),n,r]}function Ec(e,t){return t?`${e}-${t}`:e}function ja(e){let t=e.split(":");if(t.length===1)return[e,0,void 0];let a=t[0],n=t.length===3?t[1]:void 0,r=Number(t[t.length-1]);return[a,r,n]}function hc(e,t,a){let n=k("pad",e,t,a);if(n==="explicit"){n=k("explicitPaddings",e,t,a);let r=[[0,0],[0,0],[0,0],[0,0]];for(let s=0;s<4;s++)r[s][0]=n[s*2],r[s][1]=n[s*2+1];return r}return n}function fr(e){return e.kept?e:wa(e)}var $4={};He($4,{json:()=>KF});var KF=[{tfOpName:"Add",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"AddV2",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"AddN",category:"arithmetic",inputs:[{start:0,end:0,name:"tensors",type:"tensors"}]},{tfOpName:"BiasAdd",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0}]},{tfOpName:"Sub",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"RealDiv",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Div",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"DivNoNan",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"FloorDiv",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Mul",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Maximum",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Minimum",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Pow",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"SquaredDifference",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Mod",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"FloorMod",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]}],_4={};He(_4,{json:()=>ZF});var ZF=[{tfOpName:"Abs",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Acos",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Asin",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Atan",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Atan2",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"y",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Ceil",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"ClipByValue",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"clipValueMin",type:"number"},{start:2,name:"clipValueMax",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Complex",category:"basic_math",inputs:[{start:0,name:"real",type:"tensor"},{start:1,name:"imag",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"ComplexAbs",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Cos",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Cosh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Elu",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Exp",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Floor",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Log",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Imag",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"Tout",name:"outputType",type:"dtype",notSupported:!0}]},{tfOpName:"Neg",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Real",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"Tout",name:"outputType",type:"dtype",notSupported:!0}]},{tfOpName:"Prelu",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"alpha",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Relu",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Relu6",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Selu",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Sigmoid",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Sin",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Sinh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Sqrt",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Rsqrt",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Square",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Tan",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Tanh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Sign",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Round",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Expm1",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Log1p",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Reciprocal",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Softplus",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Asinh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Acosh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Atanh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Erf",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Prod",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axes",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool",notSupported:!0},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"LeakyRelu",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"alpha",name:"alpha",type:"number",defaultValue:.2},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"IsNan",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]}],F4={};He(F4,{json:()=>YF});var YF=[{tfOpName:"EmptyTensorList",category:"control",inputs:[{start:0,name:"elementShape",type:"shape"},{start:1,name:"maxNumElements",type:"number"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"LoopCond",category:"control",inputs:[{start:0,name:"pred",type:"tensor"}]},{tfOpName:"Switch",category:"control",inputs:[{start:0,name:"data",type:"tensor"},{start:1,name:"pred",type:"tensor"}]},{tfOpName:"Merge",category:"control",inputs:[{start:0,end:0,name:"tensors",type:"tensors"}]},{tfOpName:"Enter",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"frame_name",name:"frameName",type:"string"},{tfName:"is_constant",name:"isConstant",type:"bool"}]},{tfOpName:"Exit",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"NextIteration",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"TensorArrayV3",category:"control",inputs:[{start:0,name:"size",type:"number"}],attrs:[{tfName:"dtype",name:"dtype",type:"dtype"},{tfName:"element_shape",name:"elementShape",type:"shape"},{tfName:"dynamic_size",name:"dynamicSize",type:"bool"},{tfName:"clear_after_read",name:"clearAfterRead",type:"bool"},{tfName:"identical_element_shapes",name:"identicalElementShapes",type:"bool"},{tfName:"tensor_array_name",name:"name",type:"string"}]},{tfOpName:"TensorArrayWriteV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"index",type:"number"},{start:2,name:"tensor",type:"tensor"},{start:3,name:"flowIn",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"TensorArrayReadV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"index",type:"number"},{start:2,name:"flowIn",type:"number"}],attrs:[{tfName:"dtype",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"TensorArrayGatherV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"indices",type:"number[]"},{start:2,name:"flowIn",type:"number"}],attrs:[{tfName:"dtype",name:"dtype",type:"dtype"},{tfName:"element_shape",name:"elementShape",type:"shape"}]},{tfOpName:"TensorArrayScatterV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"indices",type:"number[]"},{start:2,name:"tensor",type:"tensor"},{start:3,name:"flowIn",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"TensorArrayConcatV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"flowIn",type:"number"}],attrs:[{tfName:"dtype",name:"dtype",type:"dtype"},{tfName:"element_shape_except0",name:"elementShapeExcept0",type:"shape",notSupported:!0}]},{tfOpName:"TensorArraySplitV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"tensor",type:"tensor"},{start:2,name:"lengths",type:"number[]"},{start:3,name:"flowIn",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"TensorArraySizeV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"flowIn",type:"number"}]},{tfOpName:"TensorArrayCloseV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"}]},{tfOpName:"StatelessIf",category:"control",inputs:[{start:0,name:"cond",type:"tensor"},{start:1,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"then_branch",name:"thenBranch",type:"func"},{tfName:"else_branch",name:"elseBranch",type:"func"}]},{tfOpName:"If",category:"control",inputs:[{start:0,name:"cond",type:"tensor"},{start:1,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"then_branch",name:"thenBranch",type:"func"},{tfName:"else_branch",name:"elseBranch",type:"func"}]},{tfOpName:"StatelessWhile",category:"control",inputs:[{start:0,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"cond",name:"cond",type:"func"},{tfName:"body",name:"body",type:"func"}]},{tfOpName:"While",category:"control",inputs:[{start:0,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"cond",name:"cond",type:"func"},{tfName:"body",name:"body",type:"func"}]},{tfOpName:"TensorListScatter",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"},{start:1,name:"indices",type:"number[]"},{start:2,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListScatterV2",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"},{start:1,name:"indices",type:"number[]"},{start:2,name:"elementShape",type:"shape"},{start:3,name:"numElements",type:"number"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListGather",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"indices",type:"number[]"},{start:2,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListGetItem",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"index",type:"number"},{start:2,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListSetItem",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"index",type:"number"},{start:2,name:"tensor",type:"tensor"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListReserve",category:"control",inputs:[{start:0,name:"elementShape",type:"shape"},{start:1,name:"numElements",type:"number"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListFromTensor",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"},{start:1,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListStack",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"},{tfName:"num_elements",name:"numElements",type:"dtype"}]},{tfOpName:"TensorListSplit",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"},{start:1,name:"elementShape",type:"shape"},{start:2,name:"lengths",type:"number[]"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListConcat",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"}],attrs:[{tfName:"element_shape",name:"elementShape",type:"shape"},{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListConcatV2",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"}],attrs:[{tfName:"element_shape",name:"elementShape",type:"shape"},{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListPopBack",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListPushBack",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"tensor",type:"tensor"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListLength",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"}]},{tfOpName:"TensorListResize",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"size",type:"number"}]}],P4={};He(P4,{json:()=>JF});var JF=[{tfOpName:"AvgPool",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0},{tfName:"ksize",name:"kernelSize",type:"number[]"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"MaxPool",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0},{tfName:"ksize",name:"kernelSize",type:"number[]"},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[],notSupported:!0},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"MaxPoolWithArgmax",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"ksize",name:"kernelSize",type:"number[]"},{tfName:"include_batch_in_index",name:"includeBatchInIndex",type:"bool"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"AvgPool3D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0},{tfName:"ksize",name:"kernelSize",type:"number[]"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"MaxPool3D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0},{tfName:"ksize",name:"kernelSize",type:"number[]"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Conv1D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"stride",name:"stride",type:"number"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NWC"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"dilation",name:"dilation",type:"number",defaultValue:1}]},{tfOpName:"Conv2D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"useCudnnOnGpu",name:"useCudnnOnGpu",type:"bool"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]},{tfName:"dilations",name:"dilations",type:"number[]"}]},{tfOpName:"_FusedConv2D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"},{start:2,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"num_args",name:"numArgs",type:"number"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]},{tfName:"use_cudnn_on_gpu",name:"useCudnnOnGpu",type:"bool",defaultValue:!0},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"dilations",name:"dilations",type:"number[]",defaultValue:[1,1,1,1]},{tfName:"fused_ops",name:"fusedOps",type:"string[]",defaultValue:[]},{tfName:"epsilon",name:"epsilon",type:"number",defaultValue:1e-4},{tfName:"leakyrelu_alpha",name:"leakyreluAlpha",type:"number",defaultValue:.2}]},{tfOpName:"Conv2DBackpropInput",category:"convolution",inputs:[{start:2,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"},{start:0,name:"outputShape",type:"number[]"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]},{tfName:"dilations",name:"dilations",type:"number[]",notSupported:!0}]},{tfOpName:"DepthwiseConv2d",category:"convolution",inputs:[{start:0,name:"input",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]},{tfName:"dilations",name:"dilations",type:"number[]"}]},{tfOpName:"DepthwiseConv2dNative",category:"convolution",inputs:[{start:0,name:"input",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]},{tfName:"dilations",name:"dilations",type:"number[]"}]},{tfOpName:"FusedDepthwiseConv2dNative",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"},{start:2,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"num_args",name:"numArgs",type:"number"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"dilations",name:"dilations",type:"number[]",defaultValue:[1,1,1,1]},{tfName:"fused_ops",name:"fusedOps",type:"string[]",defaultValue:[]},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]}]},{tfOpName:"Conv3D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"dilations",name:"dilations",type:"number[]"}]},{tfOpName:"Dilation2D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"rates",name:"dilations",type:"number[]"},{tfName:"padding",name:"pad",type:"string"}]}],O4={};He(O4,{json:()=>QF});var QF=[{tfOpName:"Fill",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"},{start:1,name:"value",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"LinSpace",category:"creation",inputs:[{start:0,name:"start",type:"number"},{start:1,name:"stop",type:"number"},{start:2,name:"num",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"OneHot",category:"creation",inputs:[{start:0,name:"indices",type:"tensor"},{start:1,name:"depth",type:"number"},{start:2,name:"onValue",type:"number",defaultValue:1},{start:3,name:"offValue",type:"number",defaultValue:0}],attrs:[{tfName:"axis",name:"axis",type:"number",notSupported:!0},{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"Ones",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"OnesLike",category:"creation",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"dtype",name:"dtype",type:"dtype"}]},{tfOpName:"RandomStandardNormal",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"}],attrs:[{tfName:"seed",name:"seed",type:"number",defaultValue:0},{tfName:"seed2",name:"seed2",type:"number",defaultValue:0,notSupported:!0},{tfName:"dtype",name:"dtype",type:"dtype"},{tfName:"T",name:"T",type:"number",notSupported:!0}]},{tfOpName:"RandomUniform",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"}],attrs:[{tfName:"minval",name:"minval",type:"number",defaultValue:0},{tfName:"maxval",name:"maxval",type:"number",defaultValue:1},{tfName:"dtype",name:"dtype",type:"dtype"},{tfName:"seed",name:"seed",type:"number",defaultValue:0},{tfName:"seed2",name:"seed2",type:"number",defaultValue:0,notSupported:!0},{tfName:"T",name:"T",type:"number",notSupported:!0}]},{tfOpName:"Range",category:"creation",inputs:[{start:0,name:"start",type:"number"},{start:1,name:"stop",type:"number"},{start:2,name:"step",type:"number",defaultValue:0}],attrs:[{tfName:"Tidx",name:"dtype",type:"dtype"}]},{tfOpName:"TruncatedNormal",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"}],attrs:[{tfName:"means",name:"mean",type:"number",defaultValue:0},{tfName:"stddev",name:"stdDev",type:"number",defaultValue:1},{tfName:"seed",name:"seed",type:"number"},{tfName:"seed2",name:"seed2",type:"number",defaultValue:0,notSupported:!0},{tfName:"dtype",name:"dtype",type:"dtype"},{tfName:"T",name:"T",type:"number",notSupported:!0}]},{tfOpName:"Zeros",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"ZerosLike",category:"creation",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"Multinomial",category:"creation",inputs:[{start:0,name:"logits",type:"tensor"},{start:1,name:"numSamples",type:"number"}],attrs:[{tfName:"seed",name:"seed",type:"number"},{tfName:"seed2",name:"seed2",type:"number"},{tfName:"T",name:"dtype",type:"dtype"},{tfName:"output_dtype",name:"output_dtype",type:"dtype"}]}],D4={};He(D4,{json:()=>eP});var eP=[{tfOpName:"NonMaxSuppressionV2",category:"dynamic",inputs:[{start:0,name:"boxes",type:"tensor"},{start:1,name:"scores",type:"tensor"},{start:2,name:"maxOutputSize",type:"number"},{start:3,name:"iouThreshold",type:"number"}]},{tfOpName:"NonMaxSuppressionV3",category:"dynamic",inputs:[{start:0,name:"boxes",type:"tensor"},{start:1,name:"scores",type:"tensor"},{start:2,name:"maxOutputSize",type:"number"},{start:3,name:"iouThreshold",type:"number"},{start:4,name:"scoreThreshold",type:"number"}]},{tfOpName:"NonMaxSuppressionV4",category:"dynamic",inputs:[{start:0,name:"boxes",type:"tensor"},{start:1,name:"scores",type:"tensor"},{start:2,name:"maxOutputSize",type:"number"},{start:3,name:"iouThreshold",type:"number"},{start:4,name:"scoreThreshold",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"T_threshold",name:"threshold",type:"dtype",notSupported:!0},{tfName:"pad_to_max_output_size",name:"padToMaxOutputSize",type:"bool"}]},{tfOpName:"NonMaxSuppressionV5",category:"dynamic",inputs:[{start:0,name:"boxes",type:"tensor"},{start:1,name:"scores",type:"tensor"},{start:2,name:"maxOutputSize",type:"number"},{start:3,name:"iouThreshold",type:"number"},{start:4,name:"scoreThreshold",type:"number"},{start:5,name:"softNmsSigma",type:"number"}]},{tfOpName:"Where",category:"dynamic",inputs:[{start:0,name:"condition",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"ListDiff",category:"dynamic",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"y",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]}],z4={};He(z4,{json:()=>tP});var tP=[{tfOpName:"LowerBound",category:"evaluation",inputs:[{start:0,name:"sortedSequence",type:"tensor"},{start:1,name:"values",type:"tensor"}]},{tfOpName:"TopKV2",category:"evaluation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"k",type:"number"}],attrs:[{tfName:"sorted",name:"sorted",type:"bool"}]},{tfOpName:"UpperBound",category:"evaluation",inputs:[{start:0,name:"sortedSequence",type:"tensor"},{start:1,name:"values",type:"tensor"}]},{tfOpName:"Unique",category:"evaluation",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"UniqueV2",category:"evaluation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number"}]}],L4={};He(L4,{json:()=>aP});var aP=[{tfOpName:"PlaceholderWithDefault",category:"graph",inputs:[{start:0,name:"default",type:"tensor"}],attrs:[{tfName:"shape",name:"shape",type:"shape"},{tfName:"dtype",name:"dtype",type:"dtype"}]},{tfOpName:"Placeholder",category:"graph",attrs:[{tfName:"shape",name:"shape",type:"shape"},{tfName:"dtype",name:"dtype",type:"dtype"}]},{tfOpName:"Const",category:"graph"},{tfOpName:"Identity",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"IdentityN",category:"graph",inputs:[{start:0,end:0,name:"x",type:"tensors"}]},{tfOpName:"Snapshot",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"Rank",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"Size",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"Shape",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"ShapeN",category:"graph",inputs:[{start:0,end:0,name:"x",type:"tensors"}]},{tfOpName:"Print",category:"graph",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"data",type:"tensors"}],attrs:[{tfName:"message",name:"message",type:"string"},{tfName:"first_n",name:"firstN",type:"number",notSupported:!0},{tfName:"summarize",name:"summarize",type:"number",defaultValue:3}]},{tfOpName:"NoOp",category:"graph",inputs:[]},{tfOpName:"StopGradient",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"FakeQuantWithMinMaxVars",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"min",name:"min",type:"number"},{tfName:"max",name:"max",type:"number"}]}],B4={};He(B4,{json:()=>nP});var nP=[{tfOpName:"HashTable",category:"hash_table",inputs:[],attrs:[{tfName:"shared_name",name:"sharedName",type:"string"},{tfName:"use_node_name_sharing",name:"useNodeNameSharing",type:"bool"},{tfName:"key_dtype",name:"keyDType",type:"dtype"},{tfName:"value_dtype",name:"valueDType",type:"dtype"}]},{tfOpName:"HashTableV2",category:"hash_table",inputs:[],attrs:[{tfName:"shared_name",name:"sharedName",type:"string"},{tfName:"use_node_name_sharing",name:"useNodeNameSharing",type:"bool"},{tfName:"key_dtype",name:"keyDType",type:"dtype"},{tfName:"value_dtype",name:"valueDType",type:"dtype"}]},{tfOpName:"LookupTableImport",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"},{start:1,name:"keys",type:"tensor"},{start:2,name:"values",type:"tensor"}],attrs:[{tfName:"Tin",name:"tIn",type:"dtype",notSupported:!0},{tfName:"Tout",name:"tOut",type:"dtype",notSupported:!0}]},{tfOpName:"LookupTableImportV2",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"},{start:1,name:"keys",type:"tensor"},{start:2,name:"values",type:"tensor"}],attrs:[{tfName:"Tin",name:"tIn",type:"dtype",notSupported:!0},{tfName:"Tout",name:"tOut",type:"dtype",notSupported:!0}]},{tfOpName:"LookupTableFind",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"},{start:1,name:"keys",type:"tensor"},{start:2,name:"defaultValue",type:"tensor"}],attrs:[{tfName:"Tin",name:"tIn",type:"dtype",notSupported:!0},{tfName:"Tout",name:"tOut",type:"dtype",notSupported:!0}]},{tfOpName:"LookupTableFindV2",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"},{start:1,name:"keys",type:"tensor"},{start:2,name:"defaultValue",type:"tensor"}],attrs:[{tfName:"Tin",name:"tIn",type:"dtype",notSupported:!0},{tfName:"Tout",name:"tOut",type:"dtype",notSupported:!0}]},{tfOpName:"LookupTableSize",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"}]},{tfOpName:"LookupTableSizeV2",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"}]}],W4={};He(W4,{json:()=>rP});var rP=[{tfOpName:"ResizeBilinear",category:"image",inputs:[{start:0,name:"images",type:"tensor"},{start:1,name:"size",type:"number[]"}],attrs:[{tfName:"align_corners",name:"alignCorners",type:"bool"},{tfName:"half_pixel_centers",name:"halfPixelCenters",type:"bool"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"ResizeNearestNeighbor",category:"image",inputs:[{start:0,name:"images",type:"tensor"},{start:1,name:"size",type:"number[]"}],attrs:[{tfName:"align_corners",name:"alignCorners",type:"bool"},{tfName:"half_pixel_centers",name:"halfPixelCenters",type:"bool"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"CropAndResize",category:"image",inputs:[{start:0,name:"image",type:"tensor"},{start:1,name:"boxes",type:"tensor"},{start:2,name:"boxInd",type:"tensor"},{start:3,name:"cropSize",type:"number[]"}],attrs:[{tfName:"method",name:"method",type:"string"},{tfName:"extrapolation_value",name:"extrapolationValue",type:"number"}]},{tfOpName:"ImageProjectiveTransformV3",category:"image",inputs:[{start:0,name:"images",type:"tensor"},{start:1,name:"transforms",type:"tensor"},{start:2,name:"outputShape",type:"number[]"},{start:3,name:"fillValue",type:"number"}],attrs:[{tfName:"interpolation",name:"interpolation",type:"string"},{tfName:"fill_mode",name:"fillMode",type:"string"}]}],V4={};He(V4,{json:()=>sP});var sP=[{tfOpName:"Equal",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"NotEqual",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Greater",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"GreaterEqual",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Less",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"LessEqual",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"LogicalAnd",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"LogicalNot",category:"logical",inputs:[{start:0,name:"a",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"LogicalOr",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Select",category:"logical",inputs:[{start:0,name:"condition",type:"tensor"},{start:1,name:"a",type:"tensor"},{start:2,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"SelectV2",category:"logical",inputs:[{start:0,name:"condition",type:"tensor"},{start:1,name:"a",type:"tensor"},{start:2,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]}],G4={};He(G4,{json:()=>iP});var iP=[{tfOpName:"_FusedMatMul",category:"matrices",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"},{start:2,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"num_args",name:"numArgs",type:"number"},{tfName:"fused_ops",name:"fusedOps",type:"string[]",defaultValue:[]},{tfName:"epsilon",name:"epsilon",type:"number",defaultValue:1e-4},{tfName:"transpose_a",name:"transposeA",type:"bool",defaultValue:!1},{tfName:"transpose_b",name:"transposeB",type:"bool",defaultValue:!1},{tfName:"leakyrelu_alpha",name:"leakyreluAlpha",type:"number",defaultValue:.2},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"MatMul",category:"matrices",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"transpose_a",name:"transposeA",type:"bool",defaultValue:!1},{tfName:"transpose_b",name:"transposeB",type:"bool",defaultValue:!1},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"BatchMatMul",category:"matrices",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"adj_x",name:"transposeA",type:"bool",defaultValue:!1},{tfName:"adj_y",name:"transposeB",type:"bool",defaultValue:!1},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"BatchMatMulV2",category:"matrices",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"adj_x",name:"transposeA",type:"bool",defaultValue:!1},{tfName:"adj_y",name:"transposeB",type:"bool",defaultValue:!1},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Transpose",category:"matrices",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"perm",type:"number[]"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Einsum",category:"matrices",inputs:[{start:0,end:0,name:"tensors",type:"tensors"}],attrs:[{tfName:"equation",name:"equation",type:"string"},{tfName:"N",name:"n",type:"number",defaultValue:2},{tfName:"T",name:"dtype",type:"dtype"}]}],U4={};He(U4,{json:()=>oP});var oP=[{tfOpName:"EuclideanNorm",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool",defaultValue:!1}]},{tfOpName:"FusedBatchNorm",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"scale",type:"tensor"},{start:2,name:"offset",type:"tensor"},{start:3,name:"mean",type:"tensor"},{start:4,name:"variance",type:"tensor"}],attrs:[{tfName:"epsilon",name:"epsilon",type:"number",defaultValue:.001},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0}]},{tfOpName:"FusedBatchNormV2",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"scale",type:"tensor"},{start:2,name:"offset",type:"tensor"},{start:3,name:"mean",type:"tensor"},{start:4,name:"variance",type:"tensor"}],attrs:[{tfName:"epsilon",name:"epsilon",type:"number",defaultValue:.001},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0}]},{tfOpName:"FusedBatchNormV3",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"scale",type:"tensor"},{start:2,name:"offset",type:"tensor"},{start:3,name:"mean",type:"tensor"},{start:4,name:"variance",type:"tensor"}],attrs:[{tfName:"epsilon",name:"epsilon",type:"number",defaultValue:.001},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0}]},{tfOpName:"LRN",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"depth_radius",name:"radius",type:"number",defaultValue:5},{tfName:"bias",name:"bias",type:"number",defaultValue:1},{tfName:"alpha",name:"alpha",type:"number",defaultValue:1},{tfName:"beta",name:"beta",type:"number",defaultValue:.5}]},{tfOpName:"Softmax",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"LogSoftmax",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"SparseToDense",category:"normalization",inputs:[{start:0,name:"sparseIndices",type:"tensor"},{start:1,name:"outputShape",type:"number[]"},{start:2,name:"sparseValues",type:"tensor"},{start:3,name:"defaultValue",type:"tensor"}],attrs:[{tfName:"validate_indices",name:"validateIndices",type:"bool",defaultValue:!0,notSupported:!0}]}],j4={};He(j4,{json:()=>lP});var lP=[{tfOpName:"Bincount",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"size",type:"number"},{start:2,name:"weights",type:"tensor"}]},{tfOpName:"DenseBincount",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"size",type:"number"},{start:2,name:"weights",type:"tensor"}],attrs:[{tfName:"binary_output",name:"binaryOutput",type:"bool"}]},{tfOpName:"Max",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"Mean",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"Min",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"Sum",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"All",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"Any",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"ArgMax",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number"}]},{tfOpName:"ArgMin",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number"}]},{tfOpName:"Prod",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"Cumprod",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number"}],attrs:[{tfName:"exclusive",name:"exclusive",type:"bool"},{tfName:"reverse",name:"reverse",type:"bool"}]},{tfOpName:"Cumsum",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number"}],attrs:[{tfName:"exclusive",name:"exclusive",type:"bool"},{tfName:"reverse",name:"reverse",type:"bool"}]}],H4={};He(H4,{json:()=>uP});var uP=[{tfOpName:"ConcatV2",category:"slice_join",inputs:[{start:0,end:-1,name:"tensors",type:"tensors"},{start:-1,name:"axis",type:"number"}],attrs:[{tfName:"N",name:"n",type:"number",defaultValue:2}]},{tfOpName:"Concat",category:"slice_join",inputs:[{start:1,end:0,name:"tensors",type:"tensors"},{start:0,name:"axis",type:"number"}],attrs:[{tfName:"N",name:"n",type:"number",defaultValue:2}]},{tfOpName:"GatherV2",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"indices",type:"tensor"},{start:2,name:"axis",type:"number",defaultValue:0}],attrs:[{tfName:"batch_dims",name:"batchDims",type:"number",defaultValue:0}]},{tfOpName:"Gather",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"indices",type:"tensor"}],attrs:[{tfName:"validate_indices",name:"validateIndices",type:"bool",notSupported:!0}]},{tfOpName:"Reverse",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"dims",type:"bool[]"}]},{tfOpName:"ReverseV2",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}]},{tfOpName:"Slice",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"begin",type:"number[]"},{start:2,name:"size",type:"number[]"}]},{tfOpName:"StridedSlice",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"begin",type:"number[]"},{start:2,name:"end",type:"number[]"},{start:3,name:"strides",type:"number[]"}],attrs:[{tfName:"begin_mask",name:"beginMask",type:"number",defaultValue:0},{tfName:"end_mask",name:"endMask",type:"number",defaultValue:0},{tfName:"new_axis_mask",name:"newAxisMask",type:"number",defaultValue:0},{tfName:"ellipsis_mask",name:"ellipsisMask",type:"number",defaultValue:0},{tfName:"shrink_axis_mask",name:"shrinkAxisMask",type:"number",defaultValue:0}]},{tfOpName:"Pack",category:"slice_join",inputs:[{start:0,end:0,name:"tensors",type:"tensors"}],attrs:[{tfName:"axis",name:"axis",type:"number",defaultValue:0}]},{tfOpName:"Unpack",category:"slice_join",inputs:[{start:0,name:"tensor",type:"tensor"}],attrs:[{tfName:"axis",name:"axis",type:"number",defaultValue:0},{tfName:"num",name:"num",type:"number",defaultValue:0,notSupported:!0}]},{tfOpName:"Tile",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"reps",type:"number[]"}]},{tfOpName:"Split",category:"slice_join",inputs:[{start:0,name:"axis",type:"number",defaultValue:0},{start:1,name:"x",type:"tensor"}],attrs:[{tfName:"num_split",name:"numOrSizeSplits",type:"number",defaultValue:1}]},{tfOpName:"SplitV",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"numOrSizeSplits",type:"number[]"},{start:2,name:"axis",type:"number",defaultValue:0}]},{tfOpName:"ScatterNd",category:"slice_join",inputs:[{start:0,name:"indices",type:"tensor"},{start:1,name:"values",type:"tensor"},{start:2,name:"shape",type:"number[]"}]},{tfOpName:"GatherNd",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"indices",type:"tensor"}]},{tfOpName:"SparseToDense",category:"slice_join",inputs:[{start:0,name:"sparseIndices",type:"tensor"},{start:1,name:"outputShape",type:"number[]"},{start:2,name:"sparseValues",type:"tensor"},{start:3,name:"defaultValue",type:"tensor"}],attrs:[{tfName:"validate_indices",name:"validateIndices",type:"bool",defaultValue:!1,notSupported:!0}]}],q4={};He(q4,{json:()=>dP});var dP=[{tfOpName:"SparseFillEmptyRows",category:"sparse",inputs:[{start:0,name:"indices",type:"tensor"},{start:1,name:"values",type:"tensor"},{start:2,name:"denseShape",type:"tensor"},{start:3,name:"defaultValue",type:"tensor"}]},{tfOpName:"SparseReshape",category:"sparse",inputs:[{start:0,name:"inputIndices",type:"tensor"},{start:1,name:"inputShape",type:"tensor"},{start:2,name:"newShape",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"SparseSegmentMean",category:"sparse",inputs:[{start:0,name:"data",type:"tensor"},{start:1,name:"indices",type:"tensor"},{start:2,name:"segmentIds",type:"tensor"}]},{tfOpName:"SparseSegmentSum",category:"sparse",inputs:[{start:0,name:"data",type:"tensor"},{start:1,name:"indices",type:"tensor"},{start:2,name:"segmentIds",type:"tensor"}]}],X4={};He(X4,{json:()=>pP});var pP=[{tfOpName:"FFT",category:"spectral",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"IFFT",category:"spectral",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"RFFT",category:"spectral",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"fft_length",type:"number",notSupported:!0}]},{tfOpName:"IRFFT",category:"spectral",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"fft_length",type:"number",notSupported:!0}]}],K4={};He(K4,{json:()=>cP});var cP=[{tfOpName:"StringNGrams",category:"string",inputs:[{start:0,name:"data",type:"tensor"},{start:1,name:"dataSplits",type:"tensor"}],attrs:[{tfName:"separator",name:"separator",type:"string"},{tfName:"ngram_widths",name:"nGramWidths",type:"number[]"},{tfName:"left_pad",name:"leftPad",type:"string"},{tfName:"right_pad",name:"rightPad",type:"string"},{tfName:"pad_width",name:"padWidth",type:"number"},{tfName:"preserve_short_sequences",name:"preserveShortSequences",type:"bool"}],outputs:["ngrams","ngrams_splits"]},{tfOpName:"StringSplit",category:"string",inputs:[{start:0,name:"input",type:"tensor"},{start:1,name:"delimiter",type:"tensor"}],attrs:[{tfName:"skip_empty",name:"skipEmpty",type:"bool"}],outputs:["indices","values","shape"]},{tfOpName:"StringToHashBucketFast",category:"string",inputs:[{start:0,name:"input",type:"tensor"}],attrs:[{tfName:"num_buckets",name:"numBuckets",type:"number"}]}],Z4={};He(Z4,{json:()=>hP});var hP=[{tfOpName:"Cast",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"SrcT",name:"sdtype",type:"dtype",notSupported:!0},{tfName:"DstT",name:"dtype",type:"dtype"}]},{tfOpName:"ExpandDims",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number"}]},{tfOpName:"MirrorPad",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"padding",type:"number[]"}],attrs:[{tfName:"mode",name:"mode",type:"string"}]},{tfOpName:"Pad",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"padding",type:"number[]"}],attrs:[{tfName:"constant_value",name:"constantValue",type:"number",defaultValue:0}]},{tfOpName:"PadV2",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"padding",type:"number[]"},{start:2,name:"constantValue",type:"number",defaultValue:0}]},{tfOpName:"Reshape",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"shape",type:"number[]"}]},{tfOpName:"Squeeze",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"axis",tfDeprecatedName:"squeeze_dims",name:"axis",type:"number[]"}]},{tfOpName:"SpaceToBatchND",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"blockShape",type:"number[]"},{start:2,name:"paddings",type:"number[]"}]},{tfOpName:"BatchToSpaceND",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"blockShape",type:"number[]"},{start:2,name:"crops",type:"number[]"}]},{tfOpName:"DepthToSpace",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"block_size",name:"blockSize",type:"number"},{tfName:"data_format",name:"dataFormat",type:"string"}]},{tfOpName:"BroadcastTo",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"shape",type:"number[]"}],attrs:[]},{tfOpName:"BroadcastArgs",category:"transformation",inputs:[{start:0,name:"s0",type:"tensor"},{start:1,name:"s1",type:"tensor"}],attrs:[]}],iy=class{constructor(){let e=[$4,_4,F4,P4,O4,D4,z4,L4,B4,W4,V4,G4,U4,j4,H4,q4,X4,K4,Z4],t=[].concat(...e.map(a=>a.json));this.opMappers=t.reduce((a,n)=>(a[n.tfOpName]=n,a),{})}static get Instance(){return this._instance||(this._instance=new this)}transformGraph(e,t={}){let a=e.node,n=[],r=[],s=[],i=a.reduce((f,m)=>(f[m.name]=this.mapNode(m),m.op.startsWith("Placeholder")?n.push(f[m.name]):m.op==="Const"?r.push(f[m.name]):(m.input==null||m.input.length===0)&&s.push(f[m.name]),f),{}),o=[],l=[],u={},d={};t!=null&&(u=this.mapSignatureEntries(t.inputs),d=this.mapSignatureEntries(t.outputs));let c=Object.keys(i);c.forEach(f=>{let m=i[f];m.inputNames.forEach((g,y)=>{let[A,,x]=jn(g),b=i[A];if(b.outputs!=null){let w=b.outputs.indexOf(x);if(w!==-1){let S=`${A}:${w}`;m.inputNames[y]=S}}m.inputs.push(b),b.children.push(m)})}),Object.keys(d).length===0?c.forEach(f=>{let m=i[f];m.children.length===0&&l.push(m)}):Object.keys(d).forEach(f=>{let[m]=jn(f),g=i[m];g!=null&&(g.signatureKey=d[f],l.push(g))}),Object.keys(u).length>0?Object.keys(u).forEach(f=>{let[m]=jn(f),g=i[m];g&&(g.signatureKey=u[f],o.push(g))}):o=n;let p={};e.library!=null&&e.library.function!=null&&(p=e.library.function.reduce((f,m)=>(f[m.signature.name]=this.mapFunction(m),f),{}));let h={nodes:i,inputs:o,outputs:l,weights:r,placeholders:n,signature:t,functions:p};return s.length>0&&(h.initNodes=s),h}mapSignatureEntries(e){return Object.keys(e||{}).reduce((t,a)=>(t[e[a].name]=a,t),{})}mapNode(e){let t=M4(e.op)||this.opMappers[e.op]||{};e.attr==null&&(e.attr={});let a={name:e.name,op:e.op,category:t.category,inputNames:(e.input||[]).map(n=>n.startsWith("^")?n.slice(1):n),inputs:[],children:[],inputParams:{},attrParams:{},rawAttrs:e.attr,outputs:t.outputs};return t.inputs!=null&&(a.inputParams=t.inputs.reduce((n,r)=>(n[r.name]={type:r.type,inputIndexStart:r.start,inputIndexEnd:r.end},n),{})),t.attrs!=null&&(a.attrParams=t.attrs.reduce((n,r)=>{let s=r.type,i;switch(r.type){case"string":i=i1(e.attr,r.tfName,r.defaultValue),i===void 0&&!!r.tfDeprecatedName&&(i=i1(e.attr,r.tfDeprecatedName,r.defaultValue));break;case"string[]":i=h1(e.attr,r.tfName,r.defaultValue),i===void 0&&!!r.tfDeprecatedName&&(i=h1(e.attr,r.tfDeprecatedName,r.defaultValue));break;case"number":i=l1(e.attr,r.tfName,r.defaultValue||0),i===void 0&&!!r.tfDeprecatedName&&(i=l1(e.attr,r.tfDeprecatedName,r.defaultValue));break;case"number[]":i=c1(e.attr,r.tfName,r.defaultValue),i===void 0&&!!r.tfDeprecatedName&&(i=c1(e.attr,r.tfDeprecatedName,r.defaultValue));break;case"bool":i=o1(e.attr,r.tfName,r.defaultValue),i===void 0&&!!r.tfDeprecatedName&&(i=o1(e.attr,r.tfDeprecatedName,r.defaultValue));break;case"bool[]":i=m1(e.attr,r.tfName,r.defaultValue),i===void 0&&!!r.tfDeprecatedName&&(i=m1(e.attr,r.tfDeprecatedName,r.defaultValue));break;case"shape":i=p1(e.attr,r.tfName,r.defaultValue),i===void 0&&!!r.tfDeprecatedName&&(i=p1(e.attr,r.tfDeprecatedName,r.defaultValue));break;case"shape[]":i=f1(e.attr,r.tfName,r.defaultValue),i===void 0&&!!r.tfDeprecatedName&&(i=f1(e.attr,r.tfDeprecatedName,r.defaultValue));break;case"dtype":i=u1(e.attr,r.tfName,r.defaultValue),i===void 0&&!!r.tfDeprecatedName&&(i=u1(e.attr,r.tfDeprecatedName,r.defaultValue));break;case"dtype[]":i=d1(e.attr,r.tfName,r.defaultValue),i===void 0&&!!r.tfDeprecatedName&&(i=d1(e.attr,r.tfDeprecatedName,r.defaultValue));break;case"func":i=oy(e.attr,r.tfName,r.defaultValue),i===void 0&&!!r.tfDeprecatedName&&(i=oy(e.attr,r.tfDeprecatedName,r.defaultValue));break;case"tensor":case"tensors":break;default:throw new Error(`Unsupported param type: ${r.type} for op: ${e.op}`)}return n[r.name]={value:i,type:s},n},{})),a}mapFunction(e){let t=e.nodeDef,a=[],n=[],r={};t!=null&&(r=t.reduce((u,d)=>(u[d.name]=this.mapNode(d),d.op==="Const"&&n.push(u[d.name]),u),{}));let s=[],i=[];e.signature.inputArg.forEach(u=>{let[d]=jn(u.name),c={name:d,op:"Placeholder",inputs:[],inputNames:[],category:"graph",inputParams:{},attrParams:{dtype:{value:s3(u.type),type:"dtype"}},children:[]};c.signatureKey=u.name,s.push(c),r[d]=c}),Object.keys(r).forEach(u=>{let d=r[u];d.inputNames.forEach((c,p)=>{let[h,,f]=jn(c),m=r[h];if(m.outputs!=null){let g=m.outputs.indexOf(f);if(g!==-1){let y=`${h}:${g}`;d.inputNames[p]=y}}d.inputs.push(m),m.children.push(d)})});let o=e.ret;e.signature.outputArg.forEach(u=>{let[d,c]=jn(o[u.name]),p=r[d];p!=null&&(p.defaultOutput=c,i.push(p))});let l=this.mapArgsToSignature(e);return{nodes:r,inputs:s,outputs:i,weights:n,placeholders:a,signature:l}}mapArgsToSignature(e){return{methodName:e.signature.name,inputs:e.signature.inputArg.reduce((t,a)=>(t[a.name]=this.mapArgToTensorInfo(a),t),{}),outputs:e.signature.outputArg.reduce((t,a)=>(t[a.name]=this.mapArgToTensorInfo(a,e.ret),t),{})}}mapArgToTensorInfo(e,t){let a=e.name;return t!=null&&(a=t[a]),{name:a,dtype:e.type}}};function fP(e){let t=V().global;if(typeof t.atob!="undefined")return t.atob(e);if(typeof Buffer!="undefined")return new Buffer(e,"base64").toString();throw new Error("Unable to decode base64 in this environment. Missing built-in atob() or Buffer()")}function Y4(e,t){let a=Array.isArray(e)?String.fromCharCode.apply(null,e):fP(e);return t?a:a.toLowerCase()}function i1(e,t,a,n=!1){let r=e[t];return r!=null?Y4(r.s,n):a}function o1(e,t,a){let n=e[t];return n?n.b:a}function l1(e,t,a){let n=e[t]||{},r=n.i!=null?n.i:n.f!=null?n.f:a;return typeof r=="number"?r:parseInt(r,10)}function s3(e){switch(typeof e=="string"&&(e=wn[e]),e){case wn.DT_FLOAT:case wn.DT_HALF:return"float32";case wn.DT_INT32:case wn.DT_INT64:case wn.DT_INT8:case wn.DT_UINT8:return"int32";case wn.DT_BOOL:return"bool";case wn.DT_DOUBLE:return"float32";case wn.DT_STRING:return"string";default:return null}}function oy(e,t,a){let n=e[t];return n&&n.func?n.func.name:a}function u1(e,t,a){let n=e[t];return n&&n.type?s3(n.type):a}function d1(e,t,a){let n=e[t];return n&&n.list&&n.list.type?n.list.type.map(r=>s3(r)):a}function J4(e){if(!e.unknownRank)return e.dim!=null?e.dim.map(t=>typeof t.size=="number"?t.size:parseInt(t.size,10)):[]}function p1(e,t,a){let n=e[t];return n&&n.shape?J4(n.shape):a}function c1(e,t,a){let n=e[t];return n?((n.list.f&&n.list.f.length?n.list.f:n.list.i)||[]).map(r=>typeof r=="number"?r:parseInt(r,10)):a}function h1(e,t,a,n=!1){let r=e[t];return r&&r.list&&r.list.s?r.list.s.map(s=>Y4(s,n)):a}function f1(e,t,a){let n=e[t];return n&&n.list&&n.list.shape?n.list.shape.map(r=>J4(r)):a}function m1(e,t,a){let n=e[t];return n&&n.list&&n.list.b?n.list.b:a}var mP=class{constructor(e,t,a){this.node=e,this.tensorMap=t,this.context=a,this.inputs=[],this.attrs={},this.inputs=e.inputNames.map(n=>this.getInput(n)),e.rawAttrs!=null&&(this.attrs=Object.keys(e.rawAttrs).reduce((n,r)=>(n[r]=this.getAttr(r),n),{}))}getInput(e){return ba(e,this.tensorMap,this.context)}getAttr(e,t){let a=this.node.rawAttrs[e];if(a.tensor!=null)return ba(e,this.tensorMap,this.context);if(a.i!=null||a.f!=null)return l1(this.node.rawAttrs,e,t);if(a.s!=null)return i1(this.node.rawAttrs,e,t);if(a.b!=null)return o1(this.node.rawAttrs,e,t);if(a.shape!=null)return p1(this.node.rawAttrs,e,t);if(a.type!=null)return u1(this.node.rawAttrs,e,t);if(a.list!=null){if(a.list.i!=null||a.list.f!=null)return c1(this.node.rawAttrs,e,t);if(a.list.s!=null)return h1(this.node.rawAttrs,e,t);if(a.list.shape!=null)return f1(this.node.rawAttrs,e,t);if(a.list.b!=null)return m1(this.node.rawAttrs,e,t);if(a.list.type!=null)return d1(this.node.rawAttrs,e,t)}return t}},oa={};He(oa,{OP_SCOPE_SUFFIX:()=>a2,abs:()=>Ha,acos:()=>gx,acosh:()=>yx,add:()=>xe,addN:()=>mh,all:()=>Ax,any:()=>xx,argMax:()=>ar,argMin:()=>bx,asin:()=>vx,asinh:()=>wx,atan:()=>kx,atan2:()=>Ix,atanh:()=>Sx,avgPool:()=>w2,avgPool3d:()=>Ex,basicLSTMCell:()=>Rx,batchNorm:()=>Qd,batchNorm2d:()=>Mx,batchNorm3d:()=>$x,batchNorm4d:()=>_x,batchToSpaceND:()=>k2,bincount:()=>I2,booleanMaskAsync:()=>p4,broadcastArgs:()=>Fx,broadcastTo:()=>ei,buffer:()=>ve,cast:()=>Ue,ceil:()=>Px,clipByValue:()=>Ox,clone:()=>wa,complex:()=>xr,concat:()=>at,concat1d:()=>Dx,concat2d:()=>ql,concat3d:()=>zx,concat4d:()=>Lx,conv1d:()=>Bx,conv2d:()=>ep,conv2dTranspose:()=>Vx,conv3d:()=>Gx,conv3dTranspose:()=>Ux,cos:()=>jx,cosh:()=>Hx,cosineWindow:()=>Ih,cumprod:()=>qx,cumsum:()=>Xx,denseBincount:()=>Kx,depthToSpace:()=>Zx,depthwiseConv2d:()=>gh,diag:()=>Yx,dilation2d:()=>Jx,div:()=>fe,divNoNan:()=>Qx,dot:()=>eb,dropout:()=>g4,einsum:()=>tb,elu:()=>T2,enclosingPowerOfTwo:()=>e3,equal:()=>S2,erf:()=>ab,euclideanNorm:()=>sb,exp:()=>Xr,expandDims:()=>Gt,expm1:()=>ib,eye:()=>N2,fft:()=>wh,fill:()=>nr,floor:()=>E2,floorDiv:()=>Yd,fused:()=>t3,gather:()=>R2,gatherND:()=>m4,greater:()=>np,greaterEqual:()=>M2,ifft:()=>id,imag:()=>Zd,image:()=>me,inTopKAsync:()=>y4,irfft:()=>Z2,isFinite:()=>ob,isInf:()=>lb,isNaN:()=>ub,leakyRelu:()=>$2,less:()=>db,lessEqual:()=>yh,linalg:()=>S4,linspace:()=>pb,localResponseNormalization:()=>cb,log:()=>il,log1p:()=>_2,logSigmoid:()=>fb,logSoftmax:()=>mb,logSumExp:()=>P2,logicalAnd:()=>rd,logicalNot:()=>O2,logicalOr:()=>D2,logicalXor:()=>gb,losses:()=>T4,lowerBound:()=>yb,matMul:()=>st,max:()=>pa,maxPool:()=>z2,maxPool3d:()=>Ab,maxPoolWithArgmax:()=>xb,maximum:()=>L2,mean:()=>sd,meshgrid:()=>bb,min:()=>qr,minimum:()=>B2,mirrorPad:()=>vb,mod:()=>Xl,moments:()=>wb,movingAverage:()=>c4,mul:()=>ae,multiRNNCell:()=>kb,multinomial:()=>Ib,neg:()=>Xn,norm:()=>ap,notEqual:()=>W2,oneHot:()=>Tc,ones:()=>Br,onesLike:()=>Sb,op:()=>D,outerProduct:()=>Tb,pad:()=>rr,pad1d:()=>Cb,pad2d:()=>Nb,pad3d:()=>Eb,pad4d:()=>Rb,pool:()=>Mb,pow:()=>sl,prelu:()=>G2,print:()=>i2,prod:()=>$b,raggedGather:()=>_b,raggedRange:()=>Fb,raggedTensorToTensor:()=>Pb,rand:()=>Ob,randomGamma:()=>Db,randomNormal:()=>H2,randomStandardNormal:()=>zb,randomUniform:()=>q2,range:()=>ol,real:()=>rl,reciprocal:()=>Lb,relu:()=>rp,relu6:()=>X2,reshape:()=>J,reverse:()=>Kr,reverse1d:()=>Bb,reverse2d:()=>Wb,reverse3d:()=>Vb,reverse4d:()=>Gb,rfft:()=>kh,round:()=>K2,rsqrt:()=>Ub,scalar:()=>Fe,scatterND:()=>h4,searchSorted:()=>xh,selu:()=>jb,separableConv2d:()=>Hb,setdiff1dAsync:()=>qb,sigmoid:()=>Da,sign:()=>Xb,signal:()=>I4,sin:()=>Kb,sinh:()=>Zb,slice:()=>_e,slice1d:()=>Yb,slice2d:()=>Jb,slice3d:()=>sp,slice4d:()=>bh,softmax:()=>vh,softplus:()=>F2,spaceToBatchND:()=>V2,sparse:()=>C4,sparseToDense:()=>f4,spectral:()=>k4,split:()=>ka,sqrt:()=>Jn,square:()=>In,squaredDifference:()=>Y2,squeeze:()=>$e,stack:()=>sa,step:()=>J2,stridedSlice:()=>Qb,string:()=>N4,sub:()=>he,sum:()=>tt,tan:()=>e4,tanh:()=>Nc,tensor:()=>ze,tensor1d:()=>Ut,tensor2d:()=>Kn,tensor3d:()=>h2,tensor4d:()=>t4,tensor5d:()=>a4,tensor6d:()=>n4,tile:()=>Vr,topk:()=>r4,transpose:()=>si,truncatedNormal:()=>s4,unique:()=>i4,unsortedSegmentSum:()=>o4,unstack:()=>Ta,upperBound:()=>l4,variable:()=>u4,where:()=>ii,whereAsync:()=>Q2,zeros:()=>pn,zerosLike:()=>Xa});var gP=(e,t,a,n=oa)=>{switch(e.op){case"BiasAdd":case"AddV2":case"Add":return[n.add(k("a",e,t,a),k("b",e,t,a))];case"AddN":return[n.addN(k("tensors",e,t,a))];case"FloorMod":case"Mod":return[n.mod(k("a",e,t,a),k("b",e,t,a))];case"Mul":return[n.mul(k("a",e,t,a),k("b",e,t,a))];case"RealDiv":case"Div":return[n.div(k("a",e,t,a),k("b",e,t,a))];case"DivNoNan":return[n.divNoNan(k("a",e,t,a),k("b",e,t,a))];case"FloorDiv":return[n.floorDiv(k("a",e,t,a),k("b",e,t,a))];case"Sub":return[n.sub(k("a",e,t,a),k("b",e,t,a))];case"Minimum":return[n.minimum(k("a",e,t,a),k("b",e,t,a))];case"Maximum":return[n.maximum(k("a",e,t,a),k("b",e,t,a))];case"Pow":return[n.pow(k("a",e,t,a),k("b",e,t,a))];case"SquaredDifference":return[n.squaredDifference(k("a",e,t,a),k("b",e,t,a))];default:throw TypeError(`Node type ${e.op} is not implemented`)}},yP=(e,t,a,n=oa)=>{switch(e.op){case"Abs":case"ComplexAbs":return[n.abs(k("x",e,t,a))];case"Acos":return[n.acos(k("x",e,t,a))];case"Acosh":return[n.acosh(k("x",e,t,a))];case"Asin":return[n.asin(k("x",e,t,a))];case"Asinh":return[n.asinh(k("x",e,t,a))];case"Atan":return[n.atan(k("x",e,t,a))];case"Atan2":return[n.atan2(k("x",e,t,a),k("y",e,t,a))];case"Atanh":return[n.atanh(k("x",e,t,a))];case"Ceil":return[n.ceil(k("x",e,t,a))];case"Complex":return[n.complex(k("real",e,t,a),k("imag",e,t,a))];case"Cos":return[n.cos(k("x",e,t,a))];case"Cosh":return[n.cosh(k("x",e,t,a))];case"Elu":return[n.elu(k("x",e,t,a))];case"Erf":return[n.erf(k("x",e,t,a))];case"Exp":return[n.exp(k("x",e,t,a))];case"Expm1":return[n.expm1(k("x",e,t,a))];case"Floor":return[n.floor(k("x",e,t,a))];case"Log":return[n.log(k("x",e,t,a))];case"Log1p":return[n.log1p(k("x",e,t,a))];case"Imag":return[n.imag(k("x",e,t,a))];case"Neg":return[n.neg(k("x",e,t,a))];case"Reciprocal":return[n.reciprocal(k("x",e,t,a))];case"Real":return[n.real(k("x",e,t,a))];case"Relu":return[n.relu(k("x",e,t,a))];case"Round":return[n.round(k("x",e,t,a))];case"Selu":return[n.selu(k("x",e,t,a))];case"Sigmoid":return[n.sigmoid(k("x",e,t,a))];case"Sin":return[n.sin(k("x",e,t,a))];case"Sign":return[n.sign(k("x",e,t,a))];case"Sinh":return[n.sinh(k("x",e,t,a))];case"Softplus":return[n.softplus(k("x",e,t,a))];case"Sqrt":return[n.sqrt(k("x",e,t,a))];case"Square":return[n.square(k("x",e,t,a))];case"Tanh":return[n.tanh(k("x",e,t,a))];case"Tan":return[n.tan(k("x",e,t,a))];case"ClipByValue":return[n.clipByValue(k("x",e,t,a),k("clipValueMin",e,t,a),k("clipValueMax",e,t,a))];case"Relu6":return[n.relu6(k("x",e,t,a))];case"Rsqrt":return[n.rsqrt(ba(e.inputNames[0],t,a))];case"Prod":return[n.prod(k("x",e,t,a),k("axes",e,t,a))];case"LeakyRelu":return[n.leakyRelu(k("x",e,t,a),k("alpha",e,t,a))];case"Prelu":return[n.prelu(k("x",e,t,a),k("alpha",e,t,a))];case"IsNan":return[n.isNaN(ba(e.inputNames[0],t,a))];default:throw TypeError(`Node type ${e.op} is not implemented`)}};function kn(e,t,a=""){if(!(typeof e=="number"||typeof t=="number")){v.assert(e.length===t.length,()=>a+` Shapes ${e} and ${t} must match`);for(let n=0;na+` Shapes ${e} and ${t} must match`)}}}function ly(e){return!(typeof e=="number"||e.some(t=>t<0))}function Fu(e,t,a){let n=g1(e,a),r=!ly(n);if(r&&t.length===0)throw new Error(`Tried to calculate elements of an empty list with non-fully-defined elementShape: ${n}`);if(r&&t.forEach(s=>{n=g1(s.shape,n)}),!ly(n))throw new Error(`Non-fully-defined elementShape: ${n}`);return n}function g1(e,t){if(typeof e=="number")return t;if(typeof t=="number")return e;if(e.length!==t.length)throw new Error(`Incompatible ranks during merge: ${e} vs. ${t}`);let a=[];for(let n=0;n=0&&s>=0&&r!==s)throw new Error(`Incompatible shape during merge: ${e} vs. ${t}`);a[n]=r>=0?r:s}return a}var AP=class{constructor(e,t,a,n,r,s,i){this.name=e,this.dtype=t,this.maxSize=a,this.elementShape=n,this.identicalElementShapes=r,this.dynamicSize=s,this.clearAfterRead=i,this.tensors=[],this.closed_=!1,this.idTensor=Fe(0),qn(this.idTensor)}get id(){return this.idTensor.id}get closed(){return this.closed_}clearAndClose(e){this.tensors.forEach(t=>{(e==null||!e.has(t.tensor.id))&&t.tensor.dispose()}),this.tensors=[],this.closed_=!0,this.idTensor.dispose()}size(){return this.tensors.length}read(e){if(this.closed_)throw new Error(`TensorArray ${this.name} has already been closed.`);if(e<0||e>=this.size())throw new Error(`Tried to read from index ${e}, but array size is: ${this.size()}`);let t=this.tensors[e];if(t.cleared)throw new Error(`TensorArray ${this.name}: Could not read index ${e} twice because it was cleared after a previous read (perhaps try setting clear_after_read = false?).`);return this.clearAfterRead&&(t.cleared=!0),t.read=!0,t.tensor}readMany(e){return e.map(t=>this.read(t))}write(e,t){if(this.closed_)throw new Error(`TensorArray ${this.name} has already been closed.`);if(e<0||!this.dynamicSize&&e>=this.maxSize)throw new Error(`Tried to write to index ${e}, but array is not resizeable and size is: ${this.maxSize}`);let a=this.tensors[e]||{};if(t.dtype!==this.dtype)throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${e}, + because the value dtype is ${t.dtype}, but TensorArray dtype is ${this.dtype}.`);if(this.size()===0&&(this.elementShape==null||this.elementShape.length===0)&&(this.elementShape=t.shape),kn(this.elementShape,t.shape,`TensorArray ${this.name}: Could not write to TensorArray index ${e}.`),a.read)throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${e}, because it has already been read.`);if(a.written)throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${e}, because it has already been written.`);a.tensor=t,qn(t),a.written=!0,this.tensors[e]=a}writeMany(e,t){if(e.length!==t.length)throw new Error(`TensorArray ${this.name}: could not write multiple tensors,because the index size: ${e.length} is not the same as tensors size: ${t.length}.`);e.forEach((a,n)=>this.write(a,t[n]))}gather(e,t){if(!!t&&t!==this.dtype)throw new Error(`TensorArray dtype is ${this.dtype} but gather requested dtype ${t}`);if(e)e=e.slice(0,this.size());else{e=[];for(let n=0;n=this.maxSize)throw new Error(`Max index must be < array size (${a} vs. ${this.maxSize})`);this.writeMany(e,Ta(t,0))}split(e,t){if(t.dtype!==this.dtype)throw new Error(`TensorArray dtype is ${this.dtype} but tensor has dtype ${t.dtype}`);let a=0,n=e.map(o=>(a+=o,a));if(a!==t.shape[0])throw new Error(`Expected sum of lengths to be equal to + tensor.shape[0], but sum of lengths is + ${a}, and tensor's shape is: ${t.shape}`);if(!this.dynamicSize&&e.length!==this.maxSize)throw new Error(`TensorArray's size is not equal to the size of lengths (${this.maxSize} vs. ${e.length}), and the TensorArray is not marked as dynamically resizeable`);let r=a===0?0:t.size/a,s=[];Ee(()=>{t=J(t,[1,a,r]);for(let o=0;o{if(a!==r.dtype)throw new Error(`Invalid data types; op elements ${a}, but list elements ${r.dtype}`);kn(t,r.shape,"TensorList shape mismatch: "),qn(r)}),this.idTensor=Fe(0),this.maxNumElements=n,qn(this.idTensor)}get id(){return this.idTensor.id}copy(){return new ll([...this.tensors],this.elementShape,this.elementDtype)}clearAndClose(e){this.tensors.forEach(t=>{(e==null||!e.has(t.id))&&t.dispose()}),this.tensors.length=0,this.idTensor.dispose()}size(){return this.tensors.length}stack(e,t,a=-1){if(t!==this.elementDtype)throw new Error(`Invalid data types; op elements ${t}, but list elements ${this.elementDtype}`);if(a!==-1&&this.tensors.length!==a)throw new Error(`Operation expected a list with ${a} elements but got a list with ${this.tensors.length} elements.`);kn(e,this.elementShape,"TensorList shape mismatch: ");let n=Fu(this.elementShape,this.tensors,e);return Ee(()=>{let r=this.tensors.map(s=>J(s,n));return sa(r,0)})}popBack(e,t){if(t!==this.elementDtype)throw new Error(`Invalid data types; op elements ${t}, but list elements ${this.elementDtype}`);if(this.size()===0)throw new Error("Trying to pop from an empty list.");let a=Fu(this.elementShape,this.tensors,e),n=this.tensors.pop();return n.kept=!1,kn(n.shape,e,"TensorList shape mismatch: "),J(n,a)}pushBack(e){if(e.dtype!==this.elementDtype)throw new Error(`Invalid data types; op elements ${e.dtype}, but list elements ${this.elementDtype}`);if(kn(e.shape,this.elementShape,"TensorList shape mismatch: "),this.maxNumElements===this.size())throw new Error("Trying to push element into a full list.");qn(e),this.tensors.push(e)}resize(e){if(e<0)throw new Error(`TensorListResize expects size to be non-negative. Got: ${e}`);if(this.maxNumElements!==-1&&e>this.maxNumElements)throw new Error(`TensorListResize input size ${e} is greater maxNumElement ${this.maxNumElements}.`);let t=new ll([],this.elementShape,this.elementDtype,this.maxNumElements);t.tensors.length=e;for(let a=0;athis.tensors.length)throw new Error(`Trying to access element ${e} in a list with ${this.tensors.length} elements.`);if(this.tensors[e]==null)throw new Error(`element at index ${e} is null.`);kn(this.tensors[e].shape,t,"TensorList shape mismatch: ");let n=Fu(this.elementShape,this.tensors,t);return J(this.tensors[e],n)}setItem(e,t){if(t.dtype!==this.elementDtype)throw new Error(`Invalid data types; op elements ${t.dtype}, but list elements ${this.elementDtype}`);if(e<0||this.maxNumElements!==-1&&e>=this.maxNumElements)throw new Error(`Trying to set element ${e} in a list with max ${this.maxNumElements} elements.`);kn(this.elementShape,t.shape,"TensorList shape mismatch: "),qn(t),this.tensors[e]!=null&&(this.tensors[e].kept=!1),this.tensors[e]=t}gather(e,t,a){if(t!==this.elementDtype)throw new Error(`Invalid data types; op elements ${t}, but list elements ${this.elementDtype}`);kn(this.elementShape,a,"TensorList shape mismatch: "),e=e.slice(0,this.size());let n=Fu(this.elementShape,this.tensors,a);return e.length===0?ze([],[0].concat(n)):Ee(()=>{let r=e.map(s=>J(this.tensors[s],n));return sa(r,0)})}concat(e,t){if(!!e&&e!==this.elementDtype)throw new Error(`TensorList dtype is ${this.elementDtype} but concat requested dtype ${e}`);kn(this.elementShape,t,"TensorList shape mismatch: ");let a=Fu(this.elementShape,this.tensors,t);return this.size()===0?ze([],[0].concat(a)):Ee(()=>{let n=this.tensors.map(r=>J(r,a));return at(n,0)})}};function xP(e,t,a){let n=e.dtype;if(e.shape.length<1)throw new Error(`Tensor must be at least a vector, but saw shape: ${e.shape}`);if(e.dtype!==a)throw new Error(`Invalid data types; op elements ${e.dtype}, but list elements ${a}`);let r=e.shape.slice(1);kn(r,t,"TensorList shape mismatch: ");let s=Ta(e);return new ll(s,t,n)}function bP(e,t,a,n){return new ll([],e,t,n)}function vP(e,t,a,n){if(t.length!==e.shape[0])throw new Error(`Expected len(indices) == tensor.shape[0], but saw: ${t.length} vs. ${e.shape[0]}`);let r=Math.max(...t);if(n!=null&&n!==-1&&r>=n)throw new Error(`Max index must be < array size (${r} vs. ${n})`);let s=new ll([],a,e.dtype,n),i=Ta(e,0);return t.forEach((o,l)=>{s.setItem(o,i[l])}),s}function wP(e,t,a){let n=0,r=t.map(d=>(n+=d,n));if(n!==e.shape[0])throw new Error(`Expected sum of lengths to be equal to + tensor.shape[0], but sum of lengths is + ${n}, and tensor's shape is: ${e.shape}`);let s=e.shape.slice(1),i=g1(s,a),o=n===0?0:e.size/n,l=Ee(()=>{let d=[];e=J(e,[1,n,o]);for(let c=0;c{switch(e.op){case"If":case"StatelessIf":{let n=k("thenBranch",e,t,a),r=k("elseBranch",e,t,a),s=k("cond",e,t,a),i=k("args",e,t,a);return(await s.data())[0]?a.functionMap[n].executeFunctionAsync(i,a.tensorArrayMap,a.tensorListMap):a.functionMap[r].executeFunctionAsync(i,a.tensorArrayMap,a.tensorListMap)}case"While":case"StatelessWhile":{let n=k("body",e,t,a),r=k("cond",e,t,a),s=k("args",e,t,a),i=await a.functionMap[r].executeFunctionAsync(s,a.tensorArrayMap,a.tensorListMap),o=s.map(d=>d.id),l=await i[0].data();i.forEach(d=>{!d.kept&&o.indexOf(d.id)===-1&&d.dispose()});let u=s;for(;l[0];){let d=u;u=await a.functionMap[n].executeFunctionAsync(u,a.tensorArrayMap,a.tensorListMap);let c=u.map(h=>h.id);d.forEach(h=>{!h.kept&&o.indexOf(h.id)===-1&&c.indexOf(h.id)===-1&&h.dispose()});let p=await a.functionMap[r].executeFunctionAsync(u,a.tensorArrayMap,a.tensorListMap);l=await p[0].data(),p.forEach(h=>{!h.kept&&o.indexOf(h.id)===-1&&c.indexOf(h.id)===-1&&h.dispose()})}return u}case"LoopCond":{let n=k("pred",e,t,a);return[fr(n)]}case"Switch":{let n=k("pred",e,t,a),r=k("data",e,t,a);return r.kept||(r=fr(r)),(await n.data())[0]?[void 0,r]:[r,void 0]}case"Merge":{let n=e.inputNames.find(r=>ba(r,t,a)!==void 0);if(n){let r=ba(n,t,a);return[fr(r)]}return}case"Enter":{let n=k("frameName",e,t,a),r=k("tensor",e,t,a);return a.enterFrame(n),[fr(r)]}case"Exit":{let n=k("tensor",e,t,a);return a.exitFrame(),[fr(n)]}case"NextIteration":{let n=k("tensor",e,t,a);return a.nextIteration(),[fr(n)]}case"TensorArrayV3":{let n=k("size",e,t,a),r=k("dtype",e,t,a),s=k("elementShape",e,t,a),i=k("dynamicSize",e,t,a),o=k("clearAfterRead",e,t,a),l=k("identicalElementShapes",e,t,a),u=k("name",e,t,a),d=new AP(u,r,n,s,l,i,o);return a.addTensorArray(d),[d.idTensor,Fe(1)]}case"TensorArrayWriteV3":{let n=k("tensorArrayId",e,t,a),r=k("index",e,t,a),s=k("tensor",e,t,a),i=a.getTensorArray(n.id);return i.write(r,s),[i.idTensor]}case"TensorArrayReadV3":{let n=k("tensorArrayId",e,t,a),r=k("index",e,t,a);return[a.getTensorArray(n.id).read(r)]}case"TensorArrayGatherV3":{let n=k("tensorArrayId",e,t,a),r=k("indices",e,t,a),s=k("dtype",e,t,a);return[a.getTensorArray(n.id).gather(r,s)]}case"TensorArrayScatterV3":{let n=k("tensorArrayId",e,t,a),r=k("indices",e,t,a),s=k("tensor",e,t,a),i=a.getTensorArray(n.id);return i.scatter(r,s),[i.idTensor]}case"TensorArrayConcatV3":{let n=k("tensorArrayId",e,t,a),r=a.getTensorArray(n.id),s=k("dtype",e,t,a);return[r.concat(s)]}case"TensorArraySplitV3":{let n=k("tensorArrayId",e,t,a),r=k("tensor",e,t,a),s=k("lengths",e,t,a),i=a.getTensorArray(n.id);return i.split(s,r),[i.idTensor]}case"TensorArraySizeV3":{let n=k("tensorArrayId",e,t,a),r=a.getTensorArray(n.id);return[Fe(r.size(),"int32")]}case"TensorArrayCloseV3":{let n=k("tensorArrayId",e,t,a),r=a.getTensorArray(n.id);return r.clearAndClose(),[r.idTensor]}case"TensorListSetItem":{let n=k("tensorListId",e,t,a),r=k("index",e,t,a),s=k("tensor",e,t,a),i=a.getTensorList(n.id);return i.setItem(r,s),[i.idTensor]}case"TensorListGetItem":{let n=k("tensorListId",e,t,a),r=k("index",e,t,a),s=k("elementShape",e,t,a),i=k("elementDType",e,t,a);return[a.getTensorList(n.id).getItem(r,s,i)]}case"TensorListScatterV2":case"TensorListScatter":{let n=k("indices",e,t,a),r=k("tensor",e,t,a),s=k("elementShape",e,t,a),i=k("numElements",e,t,a),o=vP(r,n,s,i);return a.addTensorList(o),[o.idTensor]}case"TensorListReserve":case"EmptyTensorList":{let n=k("elementShape",e,t,a),r=k("elementDType",e,t,a),s;e.op==="TensorListReserve"?s="numElements":s="maxNumElements";let i=k(s,e,t,a),o=e.op==="TensorListReserve"?-1:i,l=bP(n,r,i,o);return a.addTensorList(l),[l.idTensor]}case"TensorListGather":{let n=k("tensorListId",e,t,a),r=k("indices",e,t,a),s=k("elementShape",e,t,a),i=k("elementDType",e,t,a);return[a.getTensorList(n.id).gather(r,i,s)]}case"TensorListStack":{let n=k("tensorListId",e,t,a),r=k("elementShape",e,t,a),s=k("elementDType",e,t,a),i=k("numElements",e,t,a);return[a.getTensorList(n.id).stack(r,s,i)]}case"TensorListFromTensor":{let n=k("tensor",e,t,a),r=k("elementShape",e,t,a),s=k("elementDType",e,t,a),i=xP(n,r,s);return a.addTensorList(i),[i.idTensor]}case"TensorListConcat":case"TensorListConcatV2":{let n=k("tensorListId",e,t,a),r=a.getTensorList(n.id),s=k("dtype",e,t,a),i=k("elementShape",e,t,a);return[r.concat(s,i)]}case"TensorListPushBack":{let n=k("tensorListId",e,t,a),r=k("tensor",e,t,a),s=a.getTensorList(n.id);return s.pushBack(r),[s.idTensor]}case"TensorListPopBack":{let n=k("tensorListId",e,t,a),r=k("elementShape",e,t,a),s=k("elementDType",e,t,a);return[a.getTensorList(n.id).popBack(r,s)]}case"TensorListSplit":{let n=k("tensor",e,t,a),r=k("elementShape",e,t,a),s=k("lengths",e,t,a),i=wP(n,s,r);return a.addTensorList(i),[i.idTensor]}case"TensorListLength":{let n=k("tensorListId",e,t,a),r=a.getTensorList(n.id);return[Fe(r.size(),"int32")]}case"TensorListResize":{let n=k("tensorListId",e,t,a),r=k("size",e,t,a),s=a.getTensorList(n.id).resize(r);return a.addTensorList(s),[s.idTensor]}default:throw TypeError(`Node type ${e.op} is not implemented`)}};function uy(e,t,a){let[n,r]=k("fusedOps",e,t,a),s=n==="biasadd",i=!s,o=r==="prelu",l=n==="fusedbatchnorm",u=k("numArgs",e,t,a);if(s){if(o&&u!==2)throw new Error("FusedConv2d and DepthwiseConv2d with BiasAdd and Prelu must have two extra arguments: bias and alpha.");if(!o&&s&&u!==1)throw new Error("FusedConv2d and DepthwiseConv2d with BiasAdd must have one extra argument: bias.")}if(l)throw new Error("FusedConv2d and DepthwiseConv2d with FusedBatchNorm is not supported");let d=k("strides",e,t,a),c=hc(e,t,a),p=k("dataFormat",e,t,a).toUpperCase(),h=k("dilations",e,t,a),[f,m]=k("args",e,t,a);i&&(m=f,f=void 0);let g=k("leakyreluAlpha",e,t,a);return{stride:d,pad:c,dataFormat:p,dilations:h,biasArg:f,preluArg:m,activationFunc:r,leakyreluAlpha:g}}var IP=(e,t,a,n=oa)=>{switch(e.op){case"Conv1D":{let r=k("stride",e,t,a),s=k("pad",e,t,a),i=k("dataFormat",e,t,a).toUpperCase(),o=k("dilation",e,t,a);return[n.conv1d(k("x",e,t,a),k("filter",e,t,a),r,s,i,o)]}case"Conv2D":{let r=k("strides",e,t,a),s=hc(e,t,a),i=k("dataFormat",e,t,a).toUpperCase(),o=k("dilations",e,t,a);return[n.conv2d(k("x",e,t,a),k("filter",e,t,a),[r[1],r[2]],s,i,[o[1],o[2]])]}case"_FusedConv2D":{let{stride:r,pad:s,dataFormat:i,dilations:o,biasArg:l,preluArg:u,activationFunc:d,leakyreluAlpha:c}=uy(e,t,a);return[n.fused.conv2d({x:k("x",e,t,a),filter:k("filter",e,t,a),strides:[r[1],r[2]],pad:s,dataFormat:i,dilations:[o[1],o[2]],bias:l,activation:d,preluActivationWeights:u,leakyreluAlpha:c})]}case"FusedDepthwiseConv2dNative":{let{stride:r,pad:s,dataFormat:i,dilations:o,biasArg:l,preluArg:u,activationFunc:d,leakyreluAlpha:c}=uy(e,t,a);return[n.fused.depthwiseConv2d({x:k("x",e,t,a),filter:k("filter",e,t,a),strides:[r[1],r[2]],pad:s,dataFormat:i,dilations:[o[1],o[2]],bias:l,activation:d,preluActivationWeights:u,leakyreluAlpha:c})]}case"Conv2DBackpropInput":case"Conv2dTranspose":{let r=k("outputShape",e,t,a),s=k("strides",e,t,a),i=hc(e,t,a);return[n.conv2dTranspose(k("x",e,t,a),k("filter",e,t,a),r,[s[1],s[2]],i)]}case"DepthwiseConv2dNative":case"DepthwiseConv2d":{let r=k("strides",e,t,a),s=hc(e,t,a),i=k("dilations",e,t,a),o=k("dataFormat",e,t,a).toUpperCase();return[n.depthwiseConv2d(k("input",e,t,a),k("filter",e,t,a),[r[1],r[2]],s,o,[i[1],i[2]])]}case"Conv3D":{let r=k("strides",e,t,a),s=k("pad",e,t,a),i=k("dataFormat",e,t,a).toUpperCase(),o=k("dilations",e,t,a);return[n.conv3d(k("x",e,t,a),k("filter",e,t,a),[r[1],r[2],r[3]],s,i,[o[1],o[2],o[3]])]}case"AvgPool":{let r=k("strides",e,t,a),s=k("pad",e,t,a),i=k("kernelSize",e,t,a);return[n.avgPool(k("x",e,t,a),[i[1],i[2]],[r[1],r[2]],s)]}case"MaxPool":{let r=k("strides",e,t,a),s=k("pad",e,t,a),i=k("kernelSize",e,t,a);return[n.maxPool(k("x",e,t,a),[i[1],i[2]],[r[1],r[2]],s)]}case"MaxPoolWithArgmax":{let r=k("strides",e,t,a),s=k("pad",e,t,a),i=k("kernelSize",e,t,a),o=k("includeBatchInIndex",e,t,a),{result:l,indexes:u}=n.maxPoolWithArgmax(k("x",e,t,a),[i[1],i[2]],[r[1],r[2]],s,o);return[l,u]}case"AvgPool3D":{let r=k("strides",e,t,a),s=k("pad",e,t,a),i=k("kernelSize",e,t,a);return[n.avgPool3d(k("x",e,t,a),[i[1],i[2],i[3]],[r[1],r[2],r[3]],s)]}case"MaxPool3D":{let r=k("strides",e,t,a),s=k("pad",e,t,a),i=k("kernelSize",e,t,a);return[n.maxPool3d(k("x",e,t,a),[i[1],i[2],i[3]],[r[1],r[2],r[3]],s)]}case"Dilation2D":{let r=k("strides",e,t,a),s=k("pad",e,t,a),i=k("dilations",e,t,a),o=r[1],l=r[2],u=i[1],d=i[2];return[n.dilation2d(k("x",e,t,a),k("filter",e,t,a),[o,l],s,[u,d],"NHWC")]}default:throw TypeError(`Node type ${e.op} is not implemented`)}},SP=(e,t,a,n=oa)=>{switch(e.op){case"Fill":{let r=k("shape",e,t,a),s=k("dtype",e,t,a),i=k("value",e,t,a);return[n.fill(r,i,s)]}case"LinSpace":{let r=k("start",e,t,a),s=k("stop",e,t,a),i=k("num",e,t,a);return[n.linspace(r,s,i)]}case"Multinomial":{let r=k("logits",e,t,a),s=k("numSamples",e,t,a),i=k("seed",e,t,a);return[n.multinomial(r,s,i)]}case"OneHot":{let r=k("indices",e,t,a),s=k("depth",e,t,a),i=k("onValue",e,t,a),o=k("offValue",e,t,a),l=k("dtype",e,t,a);return[n.oneHot(r,s,i,o,l)]}case"Ones":return[n.ones(k("shape",e,t,a),k("dtype",e,t,a))];case"OnesLike":return[n.onesLike(k("x",e,t,a))];case"RandomStandardNormal":return[n.randomStandardNormal(k("shape",e,t,a),k("dtype",e,t,a),k("seed",e,t,a))];case"RandomUniform":return[n.randomUniform(k("shape",e,t,a),k("minval",e,t,a),k("maxval",e,t,a),k("dtype",e,t,a))];case"Range":{let r=k("start",e,t,a),s=k("stop",e,t,a),i=k("step",e,t,a);return[n.range(r,s,i,k("dtype",e,t,a))]}case"TruncatedNormal":{let r=k("shape",e,t,a),s=k("mean",e,t,a),i=k("stdDev",e,t,a),o=k("seed",e,t,a);return[n.truncatedNormal(r,s,i,k("dtype",e,t,a),o)]}case"Zeros":return[n.zeros(k("shape",e,t,a),k("dtype",e,t,a))];case"ZerosLike":return[n.zerosLike(k("x",e,t,a))];default:throw TypeError(`Node type ${e.op} is not implemented`)}};function Om(e,t,a){let n=k("boxes",e,t,a),r=k("scores",e,t,a),s=k("maxOutputSize",e,t,a),i=k("iouThreshold",e,t,a),o=k("scoreThreshold",e,t,a),l=k("softNmsSigma",e,t,a);return{boxes:n,scores:r,maxOutputSize:s,iouThreshold:i,scoreThreshold:o,softNmsSigma:l}}var TP=async(e,t,a,n,r=oa)=>{switch(e.op){case"NonMaxSuppressionV5":{let{boxes:s,scores:i,maxOutputSize:o,iouThreshold:l,scoreThreshold:u,softNmsSigma:d}=Om(e,t,a),c=await r.image.nonMaxSuppressionWithScoreAsync(s,i,o,l,u,d);return[c.selectedIndices,c.selectedScores]}case"NonMaxSuppressionV4":{let{boxes:s,scores:i,maxOutputSize:o,iouThreshold:l,scoreThreshold:u}=Om(e,t,a),d=k("padToMaxOutputSize",e,t,a),c=await r.image.nonMaxSuppressionPaddedAsync(s,i,o,l,u,d);return[c.selectedIndices,c.validOutputs]}case"NonMaxSuppressionV3":case"NonMaxSuppressionV2":{let{boxes:s,scores:i,maxOutputSize:o,iouThreshold:l,scoreThreshold:u}=Om(e,t,a);return[await r.image.nonMaxSuppressionAsync(s,i,o,l,u)]}case"Where":{let s=r.cast(k("condition",e,t,a),"bool"),i=[await r.whereAsync(s)];return s.dispose(),i}case"ListDiff":return r.setdiff1dAsync(k("x",e,t,a),k("y",e,t,a));default:throw TypeError(`Node type ${e.op} is not implemented`)}},CP=(e,t,a,n=oa)=>{switch(e.op){case"LowerBound":{let r=k("sortedSequence",e,t,a),s=k("values",e,t,a);return[n.lowerBound(r,s)]}case"TopKV2":{let r=k("x",e,t,a),s=k("k",e,t,a),i=k("sorted",e,t,a),o=n.topk(r,s,i);return[o.values,o.indices]}case"UpperBound":{let r=k("sortedSequence",e,t,a),s=k("values",e,t,a);return[n.upperBound(r,s)]}case"Unique":{let r=k("x",e,t,a),s=n.unique(r);return[s.values,s.indices]}case"UniqueV2":{let r=k("x",e,t,a),s=k("axis",e,t,a),i=n.unique(r,s);return[i.values,i.indices]}default:throw TypeError(`Node type ${e.op} is not implemented`)}},NP=(e,t,a,n=oa)=>{switch(e.op){case"Const":return t[e.name];case"PlaceholderWithDefault":let r=k("default",e,t,a);return[ba(e.name,t,a)||r];case"Placeholder":return[ba(e.name,t,a)];case"Identity":case"StopGradient":case"FakeQuantWithMinMaxVars":{let d=k("x",e,t,a);return[fr(d)]}case"IdentityN":return k("x",e,t,a).map(d=>fr(d));case"Snapshot":let s=k("x",e,t,a);return[fr(s)];case"Shape":return[n.tensor1d(k("x",e,t,a).shape,"int32")];case"ShapeN":return k("x",e,t,a).map(d=>n.tensor1d(d.shape));case"Size":return[n.scalar(k("x",e,t,a).size,"int32")];case"Rank":return[n.scalar(k("x",e,t,a).rank,"int32")];case"NoOp":return[n.scalar(1)];case"Print":let i=k("x",e,t,a),o=k("data",e,t,a),l=k("message",e,t,a),u=k("summarize",e,t,a);console.warn("The graph has a tf.print() operation,usually used for debugging, which slows down performance."),console.log(l);for(let d=0;de.dispose()),this.tensorMap.clear(),this.handle.dispose()}size(){return this.tensorMap.size}tensorSize(){return Fe(this.size(),"int32")}async import(e,t){this.checkKeyAndValueTensor(e,t);let a=await e.data();return this.tensorMap.forEach(n=>n.dispose()),this.tensorMap.clear(),Ee(()=>{let n=Ta(t),r=a.length,s=n.length;v.assert(r===s,()=>`The number of elements doesn't match, keys has ${r} elements, the values has ${s} elements.`);for(let i=0;i{let n=[];for(let r=0;r{switch(e.op){case"HashTable":case"HashTableV2":{let r=n.getHashTableHandleByName(e.name);if(r!=null)return[r];{let s=k("keyDType",e,t,a),i=k("valueDType",e,t,a),o=new EP(s,i);return n.addHashTable(e.name,o),[o.handle]}}case"LookupTableImport":case"LookupTableImportV2":{let r=k("tableHandle",e,t,a,n),s=k("keys",e,t,a),i=k("values",e,t,a);return[await n.getHashTableById(r.id).import(s,i)]}case"LookupTableFind":case"LookupTableFindV2":{let r=k("tableHandle",e,t,a,n),s=k("keys",e,t,a),i=k("defaultValue",e,t,a);return[await n.getHashTableById(r.id).find(s,i)]}case"LookupTableSize":case"LookupTableSizeV2":{let r=k("tableHandle",e,t,a,n);return[n.getHashTableById(r.id).tensorSize()]}default:throw TypeError(`Node type ${e.op} is not implemented`)}},MP=(e,t,a,n=oa)=>{switch(e.op){case"ResizeBilinear":{let r=k("images",e,t,a),s=k("size",e,t,a),i=k("alignCorners",e,t,a),o=k("halfPixelCenters",e,t,a);return[n.image.resizeBilinear(r,[s[0],s[1]],i,o)]}case"ResizeNearestNeighbor":{let r=k("images",e,t,a),s=k("size",e,t,a),i=k("alignCorners",e,t,a),o=k("halfPixelCenters",e,t,a);return[n.image.resizeNearestNeighbor(r,[s[0],s[1]],i,o)]}case"CropAndResize":{let r=k("image",e,t,a),s=k("boxes",e,t,a),i=k("boxInd",e,t,a),o=k("cropSize",e,t,a),l=k("method",e,t,a),u=k("extrapolationValue",e,t,a);return[n.image.cropAndResize(r,s,i,o,l,u)]}case"ImageProjectiveTransformV3":{let r=k("images",e,t,a),s=k("transforms",e,t,a),i=k("outputShape",e,t,a),o=k("fillValue",e,t,a),l=k("interpolation",e,t,a),u=k("fillMode",e,t,a);return[n.image.transform(r,s,l.toLowerCase(),u.toLowerCase(),o,i)]}default:throw TypeError(`Node type ${e.op} is not implemented`)}},$P=(e,t,a,n=oa)=>{switch(e.op){case"Equal":return[n.equal(k("a",e,t,a),k("b",e,t,a))];case"NotEqual":return[n.notEqual(k("a",e,t,a),k("b",e,t,a))];case"Greater":return[n.greater(k("a",e,t,a),k("b",e,t,a))];case"GreaterEqual":return[n.greaterEqual(k("a",e,t,a),k("b",e,t,a))];case"Less":return[n.less(k("a",e,t,a),k("b",e,t,a))];case"LessEqual":return[n.lessEqual(k("a",e,t,a),k("b",e,t,a))];case"LogicalAnd":return[n.logicalAnd(k("a",e,t,a),k("b",e,t,a))];case"LogicalNot":return[n.logicalNot(k("a",e,t,a))];case"LogicalOr":return[n.logicalOr(k("a",e,t,a),k("b",e,t,a))];case"Select":case"SelectV2":return[n.where(k("condition",e,t,a),k("a",e,t,a),k("b",e,t,a))];default:throw TypeError(`Node type ${e.op} is not implemented`)}},_P=(e,t,a,n=oa)=>{switch(e.op){case"BatchMatMul":case"BatchMatMulV2":case"MatMul":return[n.matMul(k("a",e,t,a),k("b",e,t,a),k("transposeA",e,t,a),k("transposeB",e,t,a))];case"Einsum":return[n.einsum(k("equation",e,t,a),...k("tensors",e,t,a))];case"Transpose":return[n.transpose(k("x",e,t,a),k("perm",e,t,a))];case"_FusedMatMul":let[r,s]=k("fusedOps",e,t,a),i=r==="biasadd",o=s==="prelu",l=k("numArgs",e,t,a),u=k("leakyreluAlpha",e,t,a);if(i){if(o&&l!==2)throw new Error("Fused MatMul with BiasAdd and Prelu must have two extra arguments: bias and alpha.");if(!o&&l!==1)throw new Error("Fused MatMul with BiasAdd must have one extra argument: bias.")}let[d,c]=k("args",e,t,a);return[n.fused.matMul({a:k("a",e,t,a),b:k("b",e,t,a),transposeA:k("transposeA",e,t,a),transposeB:k("transposeB",e,t,a),bias:d,activation:s,preluActivationWeights:c,leakyreluAlpha:u})];default:throw TypeError(`Node type ${e.op} is not implemented`)}},FP=(e,t,a,n=oa)=>{switch(e.op){case"EuclideanNorm":return[n.euclideanNorm(k("x",e,t,a),k("axis",e,t,a),k("keepDims",e,t,a))];case"FusedBatchNorm":case"FusedBatchNormV2":return[n.batchNorm(k("x",e,t,a),k("mean",e,t,a),k("variance",e,t,a),k("offset",e,t,a),k("scale",e,t,a),k("epsilon",e,t,a))];case"FusedBatchNormV3":return[n.batchNorm(k("x",e,t,a),k("mean",e,t,a),k("variance",e,t,a),k("offset",e,t,a),k("scale",e,t,a),k("epsilon",e,t,a))];case"LRN":return[n.localResponseNormalization(k("x",e,t,a),k("radius",e,t,a),k("bias",e,t,a),k("alpha",e,t,a),k("beta",e,t,a))];case"Softmax":return[n.softmax(k("x",e,t,a))];case"LogSoftmax":return[n.logSoftmax(k("x",e,t,a))];case"SparseToDense":return[n.sparseToDense(k("sparseIndices",e,t,a),k("outputShape",e,t,a),k("sparseValues",e,t,a),k("defaultValue",e,t,a))];default:throw TypeError(`Node type ${e.op} is not implemented`)}},PP=(e,t,a,n=oa)=>{switch(e.op){case"Max":{let o=k("axis",e,t,a),l=k("keepDims",e,t,a);return[n.max(k("x",e,t,a),o,l)]}case"Mean":{let o=k("axis",e,t,a),l=k("keepDims",e,t,a);return[n.mean(k("x",e,t,a),o,l)]}case"Min":{let o=k("axis",e,t,a),l=k("keepDims",e,t,a);return[n.min(k("x",e,t,a),o,l)]}case"Sum":{let o=k("axis",e,t,a),l=k("keepDims",e,t,a);return[n.sum(k("x",e,t,a),o,l)]}case"All":{let o=k("axis",e,t,a),l=k("keepDims",e,t,a);return[n.all(k("x",e,t,a),o,l)]}case"Any":{let o=k("axis",e,t,a),l=k("keepDims",e,t,a);return[n.any(k("x",e,t,a),o,l)]}case"ArgMax":{let o=k("axis",e,t,a);return[n.argMax(k("x",e,t,a),o)]}case"ArgMin":{let o=k("axis",e,t,a);return[n.argMin(k("x",e,t,a),o)]}case"Prod":{let o=k("axis",e,t,a),l=k("keepDims",e,t,a);return[n.prod(k("x",e,t,a),o,l)]}case"Cumprod":{let o=k("axis",e,t,a),l=k("exclusive",e,t,a),u=k("reverse",e,t,a);return[n.cumprod(k("x",e,t,a),o,l,u)]}case"Cumsum":{let o=k("axis",e,t,a),l=k("exclusive",e,t,a),u=k("reverse",e,t,a);return[n.cumsum(k("x",e,t,a),o,l,u)]}case"Bincount":let r=k("x",e,t,a),s=k("weights",e,t,a),i=k("size",e,t,a);return[n.bincount(r,s,i)];case"DenseBincount":{let o=k("x",e,t,a),l=k("weights",e,t,a),u=k("size",e,t,a),d=k("binaryOutput",e,t,a);return[n.denseBincount(o,l,u,d)]}default:throw TypeError(`Node type ${e.op} is not implemented`)}},OP=(e,t,a,n=oa)=>{switch(e.op){case"ConcatV2":case"Concat":{let r=k("n",e,t,a),s=k("axis",e,t,a),i=k("tensors",e,t,a);return i=i.slice(0,r),[n.concat(i,s)]}case"Gather":{let r=k("x",e,t,a),s=k("indices",e,t,a);return[n.gather(r,n.cast(s,"int32"),0)]}case"GatherV2":{let r=k("axis",e,t,a),s=k("batchDims",e,t,a),i=k("x",e,t,a),o=k("indices",e,t,a);return[n.gather(i,n.cast(o,"int32"),r,s)]}case"Reverse":{let r=k("dims",e,t,a),s=[];for(let o=0;o{let r=k("axis",e,t,a),s=k("tensors",e,t,a),i=s[0].shape,o=n.squeeze(s[0]).shape,l=s.map(u=>{let d=v.arraysEqual(u.shape,i);if(!d&&!v.arraysEqual(n.squeeze(u).shape,o))throw new Error("the input tensors shape does not match");return d?u:n.reshape(u,i)});return[n.stack(l,r)]});case"Unpack":{let r=k("axis",e,t,a),s=k("tensor",e,t,a);return n.unstack(s,r)}case"Tile":{let r=k("reps",e,t,a);return[n.tile(k("x",e,t,a),r)]}case"Split":case"SplitV":{let r=k("axis",e,t,a),s=k("numOrSizeSplits",e,t,a),i=k("x",e,t,a);return n.split(i,s,r)}case"ScatterNd":{let r=k("indices",e,t,a),s=k("values",e,t,a),i=k("shape",e,t,a);return[n.scatterND(r,s,i)]}case"GatherNd":{let r=k("x",e,t,a),s=k("indices",e,t,a);return[n.gatherND(r,s)]}case"SparseToDense":{let r=k("sparseIndices",e,t,a),s=k("outputShape",e,t,a),i=k("sparseValues",e,t,a),o=k("defaultValue",e,t,a);return[n.sparseToDense(r,i,s,i.dtype===o.dtype?o:n.cast(o,i.dtype))]}default:throw TypeError(`Node type ${e.op} is not implemented`)}},DP=(e,t,a,n=oa)=>{switch(e.op){case"SparseFillEmptyRows":{let{outputIndices:r,outputValues:s,emptyRowIndicator:i,reverseIndexMap:o}=n.sparse.sparseFillEmptyRows(k("indices",e,t,a),k("values",e,t,a),k("denseShape",e,t,a),k("defaultValue",e,t,a));return[r,s,i,o]}case"SparseReshape":{let{outputIndices:r,outputShape:s}=n.sparse.sparseReshape(k("inputIndices",e,t,a),k("inputShape",e,t,a),k("newShape",e,t,a));return[r,s]}case"SparseSegmentMean":return[n.sparse.sparseSegmentMean(k("data",e,t,a),k("indices",e,t,a),k("segmentIds",e,t,a))];case"SparseSegmentSum":return[n.sparse.sparseSegmentSum(k("data",e,t,a),k("indices",e,t,a),k("segmentIds",e,t,a))];default:throw TypeError(`Node type ${e.op} is not implemented`)}},zP=(e,t,a,n=oa)=>{switch(e.op){case"FFT":return[n.fft(k("x",e,t,a))];case"IFFT":return[n.ifft(k("x",e,t,a))];case"RFFT":return[n.rfft(k("x",e,t,a))];case"IRFFT":return[n.irfft(k("x",e,t,a))];default:throw TypeError(`Node type ${e.op} is not implemented`)}},LP=(e,t,a,n=oa)=>{switch(e.op){case"StringNGrams":{let{nGrams:r,nGramsSplits:s}=n.string.stringNGrams(k("data",e,t,a),k("dataSplits",e,t,a),k("separator",e,t,a),k("nGramWidths",e,t,a),k("leftPad",e,t,a),k("rightPad",e,t,a),k("padWidth",e,t,a),k("preserveShortSequences",e,t,a));return[r,s]}case"StringSplit":{let{indices:r,values:s,shape:i}=n.string.stringSplit(k("input",e,t,a),k("delimiter",e,t,a),k("skipEmpty",e,t,a));return[r,s,i]}case"StringToHashBucketFast":return[n.string.stringToHashBucketFast(k("input",e,t,a),k("numBuckets",e,t,a))];default:throw TypeError(`Node type ${e.op} is not implemented`)}},BP=(e,t,a,n=oa)=>{switch(e.op){case"Cast":return[n.cast(k("x",e,t,a),k("dtype",e,t,a))];case"ExpandDims":{let r=k("axis",e,t,a);return[n.expandDims(k("x",e,t,a),r)]}case"Squeeze":{let r=k("axis",e,t,a);return[n.squeeze(k("x",e,t,a),r)]}case"Reshape":return[n.reshape(k("x",e,t,a),k("shape",e,t,a))];case"MirrorPad":return[n.mirrorPad(k("x",e,t,a),k("padding",e,t,a),k("mode",e,t,a))];case"PadV2":case"Pad":return[n.pad(k("x",e,t,a),k("padding",e,t,a),k("constantValue",e,t,a))];case"SpaceToBatchND":{let r=k("blockShape",e,t,a),s=k("paddings",e,t,a);return[n.spaceToBatchND(k("x",e,t,a),r,s)]}case"BatchToSpaceND":{let r=k("blockShape",e,t,a),s=k("crops",e,t,a);return[n.batchToSpaceND(k("x",e,t,a),r,s)]}case"DepthToSpace":{let r=k("blockSize",e,t,a),s=k("dataFormat",e,t,a).toUpperCase();return[n.depthToSpace(k("x",e,t,a),r,s)]}case"BroadcastTo":return[n.broadcastTo(k("x",e,t,a),k("shape",e,t,a))];case"BroadcastArgs":return[n.broadcastArgs(k("s0",e,t,a),k("s1",e,t,a))];default:throw TypeError(`Node type ${e.op} is not implemented`)}};function dy(e,t,a,n,r=Ee){let s=((i,o,l)=>{switch(i.category){case"arithmetic":return r(()=>gP(i,o,l));case"basic_math":return r(()=>yP(i,o,l));case"control":return kP(i,o,l);case"convolution":return r(()=>IP(i,o,l));case"creation":return r(()=>SP(i,o,l));case"dynamic":return TP(i,o,l);case"evaluation":return r(()=>CP(i,o,l));case"image":return r(()=>MP(i,o,l));case"graph":return r(()=>NP(i,o,l));case"logical":return r(()=>$P(i,o,l));case"matrices":return r(()=>_P(i,o,l));case"normalization":return r(()=>FP(i,o,l));case"reduction":return r(()=>PP(i,o,l));case"slice_join":return r(()=>OP(i,o,l));case"sparse":return r(()=>DP(i,o,l));case"spectral":return r(()=>zP(i,o,l));case"string":return r(()=>LP(i,o,l));case"transformation":return r(()=>BP(i,o,l));case"hash_table":return RP(i,o,l,n);case"custom":let u=M4(i.op);if(u&&u.customExecutor)return u.customExecutor(new mP(i,o,l));throw TypeError(`Custom op ${i.op} is not registered.`);default:throw TypeError(`Unknown op '${i.op}'. File an issue at https://github.com/tensorflow/tfjs/issues so we can add it, or register a custom execution with tf.registerOp()`)}})(e,t,a);return v.isPromise(s)?s.then(i=>[].concat(i)):[].concat(s)}var py=class{constructor(e={},t={},a={},n={}){this.weightMap=e,this.tensorArrayMap=t,this.tensorListMap=a,this.functionMap=n,this.rootContext={id:0,frameName:"",iterationId:0},this.contexts=[this.rootContext],this.lastId=0,this.generateCurrentContextIds()}newFrame(e,t){return{id:e,frameName:t,iterationId:0}}set currentContext(e){this.contexts!==e&&(this.contexts=e,this.generateCurrentContextIds())}get currentContext(){return this.contexts}get currentContextId(){return this._currentContextIds[0]}get currentContextIds(){return this._currentContextIds}generateCurrentContextIds(){let e=[];for(let t=0;tt.id===0&&t.iterationId===0?"":`${t.frameName}-${t.iterationId}`).join("/"):""}enterFrame(e){this.contexts&&(this.lastId++,this.contexts=this.contexts.slice(),this.contexts.push(this.newFrame(this.lastId,e)),this._currentContextIds.unshift(this.contextIdforContexts(this.contexts)))}exitFrame(){if(this.contexts&&this.contexts.length>1)this.contexts=this.contexts.slice(),this.contexts.splice(-1),this.currentContextIds.shift();else throw new Error("Cannot exit frame, the context is empty")}nextIteration(){if(this.contexts&&this.contexts.length>0){this.contexts=this.contexts.slice(),this.lastId++;let e=Object.assign({},this.contexts[this.contexts.length-1]);e.iterationId+=1,e.id=this.lastId,this.contexts.splice(-1,1,e),this._currentContextIds.splice(0,1,this.contextIdforContexts(this.contexts))}else throw new Error("Cannot increase frame iteration, the context is empty")}getWeight(e){return this.weightMap[e]}addTensorArray(e){this.tensorArrayMap[e.id]=e}getTensorArray(e){return this.tensorArrayMap[e]}addTensorList(e){this.tensorListMap[e.id]=e}getTensorList(e){return this.tensorListMap[e]}dispose(e){for(let t in this.tensorArrayMap)this.tensorArrayMap[t].clearAndClose(e);for(let t in this.tensorListMap)this.tensorListMap[t].clearAndClose(e)}};function cy(e,t,a,n){let r=new Set,s=[],i=null,o=null,l=new Set,u=Object.keys(e).map(p=>ja(p)[0]),d=[];n!=null&&(d=n.map(p=>ja(p.name)[0]));let c=[...t];for(;c.length>0;){let p=c.pop();if((Q4(p)||jP(p)||HP(p))&&i==null&&(i=p,o=i.children.map(h=>h.name).filter(h=>r.has(h))),r.add(p.name),a[p.name]==null&&u.indexOf(p.name)===-1&&d.indexOf(p.name)===-1){if(p.inputs.length===0){s.push(p.name);continue}p.inputs.forEach(h=>{l.has(h.name)||(l.add(h.name),c.push(h))})}}return{inputs:e,outputs:t,usedNodes:r,missingInputs:s,dynamicNode:i,syncInputs:o}}function WP(e,t,a){let{usedNodes:n,inputs:r}=a,s=[],i=Object.keys(r).map(d=>ja(d)[0]).map(d=>e.nodes[d]),o=e.initNodes;i.forEach(d=>{n.has(d.name)&&s.push(d)}),e.weights.forEach(d=>{n.has(d.name)&&s.push(d)}),o!=null&&o.forEach(d=>{n.has(d.name)&&s.push(d)});let l=new Set,u=[];for(;s.length>0;){let d=s.pop();l.add(d.name),t[d.name]||u.push(d),d.children.forEach(c=>{!l.has(c.name)&&n.has(c.name)&&c.inputs.every(p=>l.has(p.name))&&s.push(c)})}return u}var VP=["Switch","Merge","Enter","Exit","NextIteration","StatelessIf","StatelessWhile","if","While"],GP=["NonMaxSuppressionV2","NonMaxSuppressionV3","NonMaxSuppressionV5","Where"],UP=["HashTable","HashTableV2","LookupTableImport","LookupTableImportV2","LookupTableFind","LookupTableFindV2","LookupTableSize","LookupTableSizeV2"];function Q4(e){return VP.indexOf(e.op)>=0}function jP(e){return GP.indexOf(e.op)>=0}function HP(e){return UP.indexOf(e.op)>=0}var y1=class{constructor(e,t){this.graph=e,this.parent=t,this.compiledMap=new Map,this._weightMap={},this.SEPERATOR=",",this._functions={},this._functionExecutorMap={},this.intermediateTensors={},this.keepTensorForDebug=!1,this._outputs=e.outputs,this._inputs=e.inputs,this._initNodes=e.initNodes,this._signature=e.signature,this._functions=e.functions,e.functions!=null&&Object.keys(e.functions).forEach(a=>{this._functionExecutorMap[a]=new y1(e.functions[a],this)})}get weightIds(){return this.parent?this.parent.weightIds:this._weightIds}get functionExecutorMap(){return this.parent?this.parent.functionExecutorMap:this._functionExecutorMap}get weightMap(){return this.parent?this.parent.weightMap:this._weightMap}set weightMap(e){let t=Object.keys(e).map(a=>e[a].map(n=>n.id));this._weightIds=[].concat(...t),this._weightMap=e}set resourceManager(e){this._resourceManager=e}get inputs(){return this._inputs.map(e=>({name:e.name,shape:e.attrParams.shape?e.attrParams.shape.value:void 0,dtype:e.attrParams.dtype?e.attrParams.dtype.value:void 0}))}get outputs(){return this._outputs.map(e=>({name:e.name,shape:e.attrParams.shape?e.attrParams.shape.value:void 0,dtype:e.attrParams.dtype?e.attrParams.dtype.value:void 0}))}get inputNodes(){return this._inputs.map(e=>e.signatureKey||e.name)}get outputNodes(){return this._outputs.map(e=>{let t=e.signatureKey||e.name;return e.defaultOutput?`${t}:${e.defaultOutput}`:t})}get functions(){return Object.keys(this._functions).reduce((e,t)=>(e[t]=this._functions[t].signature,e),{})}getCompilationKey(e,t){let a=e.map(r=>r.name).sort(),n=t.map(r=>r.name).sort();return a.join(this.SEPERATOR)+"--"+n.join(this.SEPERATOR)}compile(e,t){let a=cy(e,t,this.weightMap,this._initNodes),{missingInputs:n,dynamicNode:r,syncInputs:s}=a;if(r!=null)throw new Error(`This execution contains the node '${r.name}', which has the dynamic op '${r.op}'. Please use model.executeAsync() instead. Alternatively, to avoid the dynamic ops, specify the inputs [${s}]`);if(n.length>0){let i=t.map(l=>l.name),o=Object.keys(e);throw new Error(`Cannot compute the outputs [${i}] from the provided inputs [${o}]. Missing the following inputs: [${n}]`)}return WP(this.graph,this.weightMap,a)}execute(e,t){e=this.mapInputs(e);let a=Object.keys(e).sort();this.checkInputs(e),this.checkInputShapeAndType(e),t=this.mapOutputs(t),this.checkOutputs(t);let n=a.map(d=>this.graph.nodes[ja(d)[0]]),r=t.map(d=>ja(d)[0]),s=r.map(d=>this.graph.nodes[d]);this.resetIntermediateTensors(),s.length===0&&(s=this._outputs);let i=this.getCompilationKey(n,s),o=this.compiledMap.get(i);o==null&&(o=this.compile(e,s),this.compiledMap.set(i,o));let l={},u={};return Ee(()=>{let d=new py(this.weightMap,l,u,this.functionExecutorMap),c=Object.assign({},this.weightMap);Object.keys(e).forEach(f=>{let[m,g]=ja(f),y=[];y[g]=e[f],c[m]=y});let p=this.getFrozenTensorIds(c),h={};for(let f=0;fba(f,c,d))})}getFrozenTensorIds(e){let t=[].concat.apply([],Object.keys(e).map(a=>e[a]).map(a=>a.map(n=>n.id)));return new Set(t)}checkTensorForDisposal(e,t,a,n,r,s,i){t.category==="control"||s.indexOf(e)!==-1||(a[e].forEach(o=>{o!=null&&(i[o.id]=(i[o.id]||0)+t.children.length)}),t.inputs.forEach(o=>{if(o.category!=="control"){let l=XF(o.name,a,n);l!=null&&l.forEach(u=>{if(u&&!u.kept&&!r.has(u.id)){let d=i[u.id];if(d===1){if(!this.keepTensorForDebug)u.dispose();else{let[c,p]=jn(t.name,n);this.intermediateTensors[c]?this.intermediateTensors[c][p]=u:(this.intermediateTensors[c]=[],this.intermediateTensors[c][p]=u)}delete i[u.id]}else d!=null&&i[u.id]--}})}}))}async executeAsync(e,t){return this._executeAsync(e,t)}disposeIntermediateTensors(){!this.intermediateTensors||(Object.keys(this.intermediateTensors).forEach(e=>this.intermediateTensors[e].forEach(t=>t.dispose())),this.disposeTensorsMap())}disposeTensorsMap(){!this.tensorsMap||Object.keys(this.tensorsMap).forEach(e=>{this.tensorsMap[e].forEach(t=>{t&&!t.kept&&!t.isDisposed&&!this.keepIds.has(t.id)&&t.dispose()})})}getIntermediateTensors(){return this.tensorsMap}resetIntermediateTensors(){for(let e in this.intermediateTensors)this.intermediateTensors[e].forEach(t=>t.dispose()),delete this.intermediateTensors[e]}async _executeAsync(e,t,a=!1,n={},r={}){a||(e=this.mapInputs(e),this.checkInputs(e),this.checkInputShapeAndType(e),t=this.mapOutputs(t),this.checkOutputs(t));try{this.keepTensorForDebug=V().getBool("KEEP_INTERMEDIATE_TENSORS")}catch(u){console.warn(u.message)}this.resetIntermediateTensors();let s=new py(this.weightMap,n,r,this.functionExecutorMap);this.tensorsMap=await this.executeWithControlFlow(e,s,t,a);let i=t.map(u=>ba(u,this.tensorsMap,s)),o=i.map(u=>u.id),l=Object.keys(e).map(u=>e[u].id);return this.keepIds=new Set([...o,...l,...this.weightIds]),this.keepTensorForDebug||this.disposeTensorsMap(),this.parent==null&&s.dispose(this.keepIds),i}async executeFunctionAsync(e,t,a){let n=e.reduce((r,s,i)=>(r[this.inputs[i].name]=s,r),{});return this._executeAsync(n,this.outputNodes,!0,t,a)}async executeWithControlFlow(e,t,a,n){let r=Object.keys(e),s=r.map(A=>this.graph.nodes[ja(A)[0]]),i=a.map(A=>ja(A)[0]),o=i.map(A=>this.graph.nodes[A]);o.length===0&&(o=this._outputs);let{usedNodes:l,missingInputs:u,dynamicNode:d,syncInputs:c}=cy(e,o,this.weightMap,this._initNodes),p=[...s,...this.graph.weights,...this._initNodes||[]].map(A=>({node:A,contexts:t.currentContext})),h=Object.assign({},this.weightMap);Object.keys(e).forEach(A=>{let[x,b]=ja(A),w=[];w[b]=e[A],h[x]=w});let f={},m=this.getFrozenTensorIds(h),g={};for(;p.length>0;){let A=this.processStack(s,p,t,h,g,m,i,f,l);await Promise.all(A)}d==null&&!n&&console.warn("This model execution did not contain any nodes with control flow or dynamic output shapes. You can use model.execute() instead.");let y=o.filter(A=>!Q4(A)&&!ba(A.name,h,t)).map(A=>A.name);if(y.length>0){let A="";throw d!=null&&(A=`Alternatively, to avoid the dynamic ops, use model.execute() and specify the inputs [${c}]`),new Error(`Cannot compute the outputs [${y}] from the provided inputs [${r}]. Consider providing the following inputs: [${u}]. ${A}`)}return h}processStack(e,t,a,n,r,s,i,o,l){let u=[];for(;t.length>0;){let d=t.pop();a.currentContext=d.contexts;let c="";if(d.node.op==="Enter"&&k("isConstant",d.node,n,a)&&([c]=jn(d.node.name,a)),n[d.node.name]==null){let p=dy(d.node,n,a,this._resourceManager);c||([c]=jn(d.node.name,a));let h=a.currentContext;v.isPromise(p)?u.push(p.then(f=>(n[c]=f,a.currentContext=h,this.checkTensorForDisposal(c,d.node,n,a,s,i,o),this.processChildNodes(d.node,t,a,n,r,l),f))):(n[c]=p,this.checkTensorForDisposal(c,d.node,n,a,s,i,o),this.processChildNodes(d.node,t,a,n,r,l))}else this.processChildNodes(d.node,t,a,n,r,l)}return u}processChildNodes(e,t,a,n,r,s){e.children.forEach(i=>{let[o]=jn(i.name,a);r[o]||!s.has(i.name)||(i.op==="Merge"?i.inputNames.some(l=>!!ba(l,n,a))&&(r[o]=!0,t.push({contexts:a.currentContext,node:i})):i.inputNames.every(l=>!!ba(l,n,a))&&(r[o]=!0,t.push({contexts:a.currentContext,node:i})))})}dispose(){Object.keys(this.weightMap).forEach(e=>this.weightMap[e].forEach(t=>t.dispose()))}checkInputShapeAndType(e){Object.keys(e).forEach(t=>{let a=e[t],[n]=ja(t),r=this.graph.nodes[n];if(r.attrParams.shape&&r.attrParams.shape.value){let s=r.attrParams.shape.value,i=s.length===a.shape.length&&a.shape.every((o,l)=>s[l]===-1||s[l]===o);v.assert(i,()=>`The shape of dict['${r.name}'] provided in model.execute(dict) must be [${s}], but was [${a.shape}]`)}r.attrParams.dtype&&r.attrParams.dtype.value&&v.assert(a.dtype===r.attrParams.dtype.value,()=>`The dtype of dict['${r.name}'] provided in model.execute(dict) must be ${r.attrParams.dtype.value}, but was ${a.dtype}`)})}mapInputs(e){let t={};for(let a in e)if(this._signature!=null&&this._signature.inputs!=null&&this._signature.inputs[a]!=null){let n=this._signature.inputs[a];t[n.name]=e[a]}else t[a]=e[a];return t}checkInputs(e){let t=Object.keys(e).filter(a=>{let[n]=ja(a);return this.graph.nodes[n]==null});if(t.length>0)throw new Error(`The dict provided in model.execute(dict) has keys: [${t}] that are not part of graph`)}mapOutputs(e){return e.map(t=>this._signature!=null&&this._signature.outputs!=null&&this._signature.outputs[t]!=null?this._signature.outputs[t].name:t,{})}checkOutputs(e){e.forEach(t=>{let[a]=ja(t);if(!this.graph.nodes[a])throw new Error(`The output '${t}' is not found in the graph`)})}},qP=class{constructor(e={},t={}){this.hashTableNameToHandle=e,this.hashTableMap=t}addHashTable(e,t){this.hashTableNameToHandle[e]=t.handle,this.hashTableMap[t.id]=t}getHashTableHandleByName(e){return this.hashTableNameToHandle[e]}getHashTableById(e){return this.hashTableMap[e]}dispose(){for(let e in this.hashTableMap)this.hashTableMap[e].clearAndClose(),delete this.hashTableMap[e];for(let e in this.hashTableNameToHandle)this.hashTableNameToHandle[e].dispose(),delete this.hashTableNameToHandle[e]}},XP="?tfjs-format=file",KP="model.json",op=class{constructor(e,t={},a=Hn){this.modelUrl=e,this.loadOptions=t,this.version="n/a",this.io=a,t==null&&(this.loadOptions={}),this.resourceManager=new qP}get modelVersion(){return this.version}get inputNodes(){return this.executor.inputNodes}get outputNodes(){return this.executor.outputNodes}get inputs(){return this.executor.inputs}get outputs(){return this.executor.outputs}get weights(){return this.executor.weightMap}get metadata(){return this.artifacts.userDefinedMetadata}get modelSignature(){return this.signature}get modelStructuredOutputKeys(){return this.structuredOutputKeys}findIOHandler(){let e=this.modelUrl;if(e.load!=null)this.handler=e;else if(this.loadOptions.requestInit!=null)this.handler=this.io.browserHTTPRequest(e,this.loadOptions);else{let t=this.io.getLoadHandlers(e,this.loadOptions);if(t.length===0)t.push(this.io.browserHTTPRequest(e,this.loadOptions));else if(t.length>1)throw new Error(`Found more than one (${t.length}) load handlers for URL '${[e]}'`);this.handler=t[0]}}load(){if(this.findIOHandler(),this.handler.load==null)throw new Error("Cannot proceed with model loading because the IOHandler provided does not have the `load` method implemented.");let e=this.handler.load();return v.isPromise(e)?e.then(t=>this.loadSync(t)):this.loadSync(e)}loadSync(e){this.artifacts=e;let t=this.artifacts.modelTopology,a=this.artifacts.signature;if(this.artifacts.userDefinedMetadata!=null){let r=this.artifacts.userDefinedMetadata;r.signature!=null&&(a=r.signature),r.structuredOutputKeys!=null&&(this.structuredOutputKeys=r.structuredOutputKeys)}this.signature=a,this.version=`${t.versions.producer}.${t.versions.minConsumer}`;let n=this.io.decodeWeights(this.artifacts.weightData,this.artifacts.weightSpecs);if(this.executor=new y1(iy.Instance.transformGraph(t,this.signature)),this.executor.weightMap=this.convertTensorMapToTensorsMap(n),this.executor.resourceManager=this.resourceManager,e.modelInitializer!=null&&e.modelInitializer.node!=null){let r=iy.Instance.transformGraph(e.modelInitializer);this.initializer=new y1(r),this.initializer.weightMap=this.executor.weightMap,this.initializer.resourceManager=this.resourceManager,this.initializerSignature=e.initializerSignature}return!0}async save(e,t){if(typeof e=="string"){let a=this.io.getSaveHandlers(e);if(a.length===0)throw new Error(`Cannot find any save handlers for URL '${e}'`);if(a.length>1)throw new Error(`Found more than one (${a.length}) save handlers for URL '${e}'`);e=a[0]}if(e.save==null)throw new Error("GraphModel.save() cannot proceed because the IOHandler provided does not have the `save` attribute defined.");return e.save(this.artifacts)}predict(e,t){let a=this.execute(e,this.outputNodes);if(this.structuredOutputKeys){let n=a instanceof dt?[a]:a,r={};return n.forEach((s,i)=>r[this.structuredOutputKeys[i]]=s),r}return a}normalizeInputs(e){if(!(e instanceof dt)&&!Array.isArray(e)){if(this.signature!=null&&this.signature.inputs!=null)for(let n in this.signature.inputs){let r=this.signature.inputs[n];r.resourceId!=null&&(e[n]=this.resourceIdToCapturedInput[r.resourceId])}return e}e=Array.isArray(e)?e:[e];let t=Object.keys(this.resourceIdToCapturedInput).length;if(e.length+t!==this.inputNodes.length)throw new Error(`Input tensor count mismatch, the graph model has ${this.inputNodes.length-t} non-resource placeholders, while there are ${e.length} input tensors provided.`);let a=0;return this.inputNodes.reduce((n,r)=>{let s=this.signature?this.signature.inputs[r]:null;return s!=null&&s.resourceId!=null?n[r]=this.resourceIdToCapturedInput[s.resourceId]:n[r]=e[a++],n},{})}normalizeOutputs(e){return e=e||this.outputNodes,Array.isArray(e)?e:[e]}executeInitializerGraph(){return this.initializer==null?[]:this.initializerSignature==null?this.initializer.execute({},[]):this.initializer.execute({},Object.keys(this.initializerSignature.outputs))}async executeInitializerGraphAsync(){return this.initializer==null?[]:this.initializerSignature==null?this.initializer.executeAsync({},[]):this.initializer.executeAsync({},Object.keys(this.initializerSignature.outputs))}setResourceIdToCapturedInput(e){if(this.resourceIdToCapturedInput={},this.initializerSignature){let t=Object.keys(this.initializerSignature.outputs);for(let a=0;a1?a:a[0]}async executeAsync(e,t){this.resourceIdToCapturedInput==null&&this.setResourceIdToCapturedInput(await this.executeInitializerGraphAsync()),e=this.normalizeInputs(e),t=this.normalizeOutputs(t);let a=await this.executor.executeAsync(e,t);return a.length>1?a:a[0]}getIntermediateTensors(){return this.executor.getIntermediateTensors()}disposeIntermediateTensors(){this.executor.disposeIntermediateTensors()}convertTensorMapToTensorsMap(e){return Object.keys(e).reduce((t,a)=>(t[a]=[e[a]],t),{})}dispose(){this.executor.dispose(),this.initializer&&(this.initializer.dispose(),this.resourceIdToCapturedInput&&Y(this.resourceIdToCapturedInput)),this.resourceManager.dispose()}};async function i3(e,t={},a=Hn){if(e==null)throw new Error("modelUrl in loadGraphModel() cannot be null. Please provide a url or an IOHandler that loads the model");t==null&&(t={}),t.fromTFHub&&typeof e=="string"&&(e=YP(e));let n=new op(e,t,a);return await n.load(),n}function ZP(e){if(e==null)throw new Error("modelUrl in loadGraphModelSync() cannot be null. Please provide model artifacts or an IOHandler that loads the model");let t;if(e instanceof Array){let[n,r]=e;if(!n)throw new Error("modelJSON must be the first element of the array");if(!r||!(r instanceof ArrayBuffer))throw new Error("An ArrayBuffer of weights must be the second element of the array");if(!("modelTopology"in n))throw new Error("Model JSON is missing 'modelTopology'");if(!("weightsManifest"in n))throw new Error("Model JSON is missing 'weightsManifest'");let s=Hn.getWeightSpecs(n.weightsManifest),i=Hn.getModelArtifactsForJSONSync(n,s,r);t=Hn.fromMemorySync(i)}else if("load"in e)t=e;else if("modelTopology"in e&&"weightSpecs"in e&&"weightData"in e)t=Hn.fromMemorySync(e);else throw new Error("Unknown model format");let a=new op(t);return a.load(),a}function YP(e){return e.endsWith("/")||(e=e+"/"),`${e}${KP}${XP}`}var JP="4.0.0";function Ae(e,t){Array.isArray(e)||(e=[e]),e.forEach(a=>{a!=null&&v.assert(a.dtype!=="complex64",()=>`${t} does not support complex64 tensors in the CPU backend.`)})}var QP=Tn.whereImpl,Ph=class extends fl{constructor(){super(),this.blockSize=48,this.firstUse=!0,this.data=new md(this,kt())}nextDataId(){return Ph.nextDataId++}write(e,t,a){this.firstUse&&(this.firstUse=!1,V().get("IS_NODE")&&T.warn(` +============================ +Hi, looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, visit https://github.com/tensorflow/tfjs-node for more details. +============================`));let n={id:this.nextDataId()};return this.data.set(n,{values:e,dtype:a,refCount:1}),n}makeTensorInfo(e,t,a){let n;if(t==="string"&&a!=null&&a.length>0&&v.isString(a[0])){let r=a.map(s=>v.encodeString(s));n=this.write(r,e,t)}else n=this.write(a,e,t);return{dataId:n,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,a,n,r){this.data.set(e,{values:t,dtype:n,refCount:r})}numDataIds(){return this.data.numDataIds()}async read(e){return this.readSync(e)}readSync(e){let{dtype:t,complexTensorInfos:a}=this.data.get(e);if(t==="complex64"){let n=this.readSync(a.real.dataId),r=this.readSync(a.imag.dataId);return T.mergeRealAndImagArrays(n,r)}return this.data.get(e).values}bufferSync(e){let t=this.readSync(e.dataId);if(e.dtype==="string")try{let a=t.map(n=>v.decodeString(n));return ve(e.shape,e.dtype,a)}catch(a){throw new Error("Failed to decode encoded string bytes into utf-8")}return ve(e.shape,e.dtype,t)}makeOutput(e,t,a){return kt().makeTensorFromTensorInfo(this.makeTensorInfo(t,a,e),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:a}=this.data.get(e);a!=null&&(this.disposeData(a.real.dataId,!0),this.disposeData(a.imag.dataId,!0)),this.data.delete(e)}return!0}disposeIntermediateTensorInfo(e){this.disposeData(e.dataId)}async time(e){let t=v.now();return e(),{kernelMs:v.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){Ae([e],"where");let t=this.readSync(e.dataId);return QP(e.shape,t)}dispose(){}floatPrecision(){return 32}epsilon(){return super.epsilon()}};Ph.nextDataId=0;var o3={};He(o3,{addImpl:()=>a7,bincountImpl:()=>u3,bincountReduceImpl:()=>n7,castImpl:()=>t7,ceilImpl:()=>r7,concatImpl:()=>d3,equalImpl:()=>s7,expImpl:()=>o7,expm1Impl:()=>u7,floorImpl:()=>d7,gatherNdImpl:()=>p7,gatherV2Impl:()=>c7,greaterEqualImpl:()=>f7,greaterImpl:()=>h7,lessEqualImpl:()=>g7,lessImpl:()=>m7,linSpaceImpl:()=>y7,logImpl:()=>A7,maxImpl:()=>x7,maximumImpl:()=>b7,minimumImpl:()=>v7,multiplyImpl:()=>p3,negImpl:()=>w7,notEqualImpl:()=>k7,prodImpl:()=>I7,raggedGatherImpl:()=>S7,raggedRangeImpl:()=>T7,raggedTensorToTensorImpl:()=>C7,rangeImpl:()=>h3,rsqrtImpl:()=>N7,scatterImpl:()=>Zo,sigmoidImpl:()=>qO,simpleAbsImpl:()=>e7,sliceImpl:()=>Mc,sparseFillEmptyRowsImpl:()=>R7,sparseReshapeImpl:()=>M7,sparseSegmentReductionImpl:()=>f3,sqrtImpl:()=>ZO,squaredDifferenceImpl:()=>$7,stridedSliceImpl:()=>_7,stringNGramsImpl:()=>m3,stringSplitImpl:()=>g3,stringToHashBucketFastImpl:()=>y3,subImpl:()=>F7,tileImpl:()=>P7,topKImpl:()=>D7,transposeImpl:()=>c3,uniqueImpl:()=>z7});function e7(e){let t=new Float32Array(e.length);for(let a=0;a{let{x:t}=e.inputs,a=e.backend;Ae(t,"abs");let n=new Float32Array(v.sizeFromShape(t.shape)),r=a.data.get(t.dataId).values;return n=e7(r),a.makeOutput(n,t.shape,t.dtype)},tO={kernelName:gl,backendName:"cpu",kernelFunc:eO};function Lt(e){return(t,a,n,r,s)=>{let i=T.assertAndGetBroadcastShape(t,a),o=i.length,l=v.computeStrides(i),u=v.sizeFromShape(i),d=v.getTypedArrayFromDType(s,u),c=t.length,p=a.length,h=v.computeStrides(t),f=v.computeStrides(a),m=T.getBroadcastDims(t,i),g=T.getBroadcastDims(a,i);if(m.length+g.length===0)for(let y=0;yx[C]=0);let b=v.locToIndex(x,c,h),w=A.slice(-p);g.forEach(C=>w[C]=0);let S=v.locToIndex(w,p,f);d[y]=e(n[b],r[S])}return[d,i]}}function qa(e){let{inputs:t,backend:a}=e,{real:n,imag:r}=t,s=a.data.get(n.dataId).values,i=a.data.get(r.dataId).values,o=a.makeTensorInfo(n.shape,"complex64"),l=a.data.get(o.dataId);return l.complexTensorInfos={real:a.makeTensorInfo(n.shape,"float32",s),imag:a.makeTensorInfo(r.shape,"float32",i)},o}var aO={kernelName:Id,backendName:"cpu",kernelFunc:qa};function Rc(e,t,a="float32"){if(a==="complex64"){let r=Rc(e,t,"float32"),s=Rc(e,t,"float32");return qa({inputs:{real:r,imag:s},backend:e})}let n=v.makeZerosTypedArray(v.sizeFromShape(t),a);return e.makeTensorInfo(t,a,n)}function er(e){let{inputs:t,backend:a}=e,{x:n}=t;return a.incRef(n.dataId),{dataId:n.dataId,shape:n.shape,dtype:n.dtype}}var nO={kernelName:Fi,backendName:"cpu",kernelFunc:er};function oi(e){let{inputs:t,backend:a}=e,{input:n}=t,r=a.data.get(n.dataId).complexTensorInfos.real,s=a.data.get(r.dataId).values;return a.makeTensorInfo(r.shape,r.dtype,s)}var rO={kernelName:$d,backendName:"cpu",kernelFunc:oi};function t7(e,t,a,n){if(n==="int32"){let r=Int32Array.from(e);return[t,"int32",r]}if(n==="bool"){let r=v.toTypedArray([0],a),[s,i]=Lt((o,l)=>o!==l?1:0)(t,[],e,r,"bool");return[i,"bool",s]}throw new Error(`Error in Cast: failed to cast ${a} to ${n}`)}function Zr(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{dtype:s}=n;if(s==="complex64"){if(r.dtype==="complex64")return er({inputs:{x:r},backend:a});let d=Rc(a,r.shape,r.dtype),c=Zr({inputs:{x:r},backend:a,attrs:{dtype:"float32"}}),p=qa({inputs:{real:c,imag:d},backend:a});return a.disposeIntermediateTensorInfo(d),a.disposeIntermediateTensorInfo(c),p}if(r.dtype==="complex64"){let d=oi({inputs:{input:r},backend:a}),c=Zr({inputs:{x:d},backend:a,attrs:{dtype:s}});return a.disposeIntermediateTensorInfo(d),c}if(!v.hasEncodingLoss(r.dtype,s)){let d=er({inputs:{x:r},backend:a});return{dataId:d.dataId,shape:d.shape,dtype:s}}let i=a.data.get(r.dataId).values,[o,l,u]=t7(i,r.shape,r.dtype,s);return a.makeTensorInfo(o,l,u)}var sO={kernelName:yi,backendName:"cpu",kernelFunc:Zr};function Kt(e,t,a,n){return a==null?({inputs:r,backend:s})=>{let{a:i,b:o}=r,l=s;Ae([i,o],e);let u=l.data.get(i.dataId).values,d=l.data.get(o.dataId).values,c=i.dtype==="string"?T.fromUint8ToStringArray(u):u,p=i.dtype==="string"?T.fromUint8ToStringArray(d):d,h=n||i.dtype,[f,m]=t(i.shape,o.shape,c,p,h);return l.makeTensorInfo(m,h,f)}:({inputs:r,backend:s})=>{let{a:i,b:o}=r,l=s;if(i.dtype==="complex64"||o.dtype==="complex64"){let u=Zr({inputs:{x:i},backend:l,attrs:{dtype:"complex64"}}),d=l.data.get(u.dataId),c=d.complexTensorInfos.real,p=d.complexTensorInfos.imag,h=l.data.get(c.dataId).values,f=l.data.get(p.dataId).values,m=Zr({inputs:{x:o},backend:l,attrs:{dtype:"complex64"}}),g=l.data.get(m.dataId),y=g.complexTensorInfos.real,A=g.complexTensorInfos.imag,x=l.data.get(y.dataId).values,b=l.data.get(A.dataId).values,[w,S,C]=a(i.shape,o.shape,h,f,x,b),N=l.makeTensorInfo(C,"float32",w),_=l.makeTensorInfo(C,"float32",S),$=qa({inputs:{real:N,imag:_},backend:l});return l.disposeIntermediateTensorInfo(u),l.disposeIntermediateTensorInfo(m),l.disposeIntermediateTensorInfo(N),l.disposeIntermediateTensorInfo(_),$}else{let u=l.data.get(i.dataId).values,d=l.data.get(o.dataId).values,c=n||i.dtype,[p,h]=t(i.shape,o.shape,u,d,c);return l.makeTensorInfo(h,c,p)}}}function l3(e){return(t,a,n,r,s,i)=>{let o=T.assertAndGetBroadcastShape(t,a),l=v.sizeFromShape(o),u=o.length,d=v.computeStrides(o),c=v.getTypedArrayFromDType("float32",l),p=v.getTypedArrayFromDType("float32",l),h=T.getBroadcastDims(t,o),f=T.getBroadcastDims(a,o),m=T.mergeRealAndImagArrays(n,r),g=T.mergeRealAndImagArrays(s,i),y=t.length,A=v.computeStrides(t),x=a.length,b=v.computeStrides(a);if(h.length+f.length===0)for(let w=0;wC[I]=0);let N=v.locToIndex(C,y,A),_=S.slice(-x);f.forEach(I=>_[I]=0);let $=v.locToIndex(_,x,b),M=e(m[N*2],m[N*2+1],g[$*2],g[$*2+1]);c[w]=M.real,p[w]=M.imag}return[c,p,o]}}var a7=Lt((e,t)=>e+t),iO=l3((e,t,a,n)=>({real:e+a,imag:t+n})),ul=Kt(vr,a7,iO),oO={kernelName:vr,backendName:"cpu",kernelFunc:ul};function u3(e,t,a,n,r){let s=v.sizeFromShape(n),i=v.makeZerosTypedArray(r,a);for(let o=0;o=r||(s>0?i[l]+=t[o]:i[l]+=1)}return i}function n7(e,t,a,n=!1){let r=e.shape[0],s=e.shape[1],i=ve([r,a],t.dtype);for(let o=0;o=a||(n?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 ws(e){return(t,a,n)=>{let r=v.getTypedArrayFromDType(a,t.length);for(let s=0;s{let{x:i}=n;if(Ae(i,e),i.dtype==="string"||a==="string")throw new Error("unaryKernelFunc does not support string input/output");let o=s,l=o.data.get(i.dataId).values,u=v.sizeFromShape(i.shape),d=a||i.dtype,c=v.getArrayFromDType(d,u);for(let p=0;p{let{x:i}=n;if(Ae(i,e),i.dtype==="string"||a==="string")throw new Error("unaryKernelFunc does not support string input/output");let o=s,l=o.data.get(i.dataId).values,u=a||i.dtype,d=t(l,u,r);return o.makeTensorInfo(i.shape,u,d)}}var r7=ws(e=>Math.ceil(e)),lO=Zl(Qr,r7),uO={kernelName:Qr,backendName:"cpu",kernelFunc:lO};function d3(e,t,a,n){let r=v.getArrayFromDType(a,v.sizeFromShape(t));if(n&&a!=="string"){let s=0;e.forEach(i=>{let o=v.sizeFromShape(i.shape);r.set(i.vals,s),s+=o})}else{let s=0;e.forEach(i=>{let o=a==="string"?T.fromUint8ToStringArray(i.vals):i.vals,l=0;for(let u=0;ue===t?1:0),i7=Kt(ts,s7,null,"bool"),dO={kernelName:ts,backendName:"cpu",kernelFunc:i7},o7=ws(e=>Math.exp(e)),l7=Zl(as,o7,"float32"),pO={kernelName:as,backendName:"cpu",kernelFunc:l7},u7=ws(e=>Math.expm1(e)),cO=Zl(Ei,u7),hO={kernelName:Ei,backendName:"cpu",kernelFunc:cO},d7=ws(e=>Math.floor(e)),fO=Zl(ns,d7),mO={kernelName:ns,backendName:"cpu",kernelFunc:fO};function p7(e,t,a,n,r,s,i,o,l){let u=ve([n,s],a);for(let d=0;d=l/s)throw new Error(`Invalid indices: ${c} does not index into ${o}`);for(let h=0;he>t?1:0),gO=Kt(rs,h7,null,"bool"),yO={kernelName:rs,backendName:"cpu",kernelFunc:gO},f7=Lt((e,t)=>e>=t?1:0),AO=Kt(ss,f7,null,"bool"),xO={kernelName:ss,backendName:"cpu",kernelFunc:AO},m7=Lt((e,t)=>ee<=t?1:0),wO=Kt(os,g7,null,"bool"),kO={kernelName:os,backendName:"cpu",kernelFunc:wO};function y7(e,t,a){let n=(t-e)/(a-1),r=v.makeZerosTypedArray(a,"float32");r[0]=e;for(let s=1;sMath.log(e)),IO=Zl(ls,A7),SO={kernelName:ls,backendName:"cpu",kernelFunc:IO};function x7(e,t,a,n){let r=v.getTypedArrayFromDType(n,v.sizeFromShape(a));for(let s=0;so)&&(o=u)}r[s]=o}return r}var b7=Lt((e,t)=>Math.max(e,t)),TO=Kt(us,b7),CO={kernelName:us,backendName:"cpu",kernelFunc:TO},v7=Lt((e,t)=>Math.min(e,t)),NO=Kt(ds,v7),EO={kernelName:ds,backendName:"cpu",kernelFunc:NO},p3=Lt((e,t)=>e*t),RO=l3((e,t,a,n)=>({real:e*a-t*n,imag:e*n+t*a})),Oh=Kt(ps,p3,RO),MO={kernelName:ps,backendName:"cpu",kernelFunc:Oh};function w7(e,t,a){let n=v.createScalarValue(-1,a);return p3([],t,n,e,a)}function $O(e){let{inputs:t,backend:a}=e,{x:n}=t;Ae(n,"neg");let r=a.data.get(n.dataId).values,[s,i]=w7(r,n.shape,n.dtype);return a.makeTensorInfo(i,n.dtype,s)}var _O={kernelName:Cl,backendName:"cpu",kernelFunc:$O},k7=Lt((e,t)=>e!==t?1:0),FO=Kt(cs,k7,null,"bool"),PO={kernelName:cs,backendName:"cpu",kernelFunc:FO};function c3(e,t,a,n,r){let s=t.length,i=v.sizeFromShape(t),o=v.computeStrides(t),l=v.computeStrides(r),u=v.getTypedArrayFromDType(a,v.sizeFromShape(r));for(let d=0;da.disposeIntermediateTensorInfo(A)),a.makeTensorInfo(y,g,f)}var zO={kernelName:Xi,backendName:"cpu",kernelFunc:DO};function LO(e,t,a){e.forEach((n,r)=>{if(n<0||n>=a){let s=v.indexToLoc(r,t.length,v.computeStrides(t)).join(",");throw new Error(`indices[${s}] = ${n} is not in [0, ${a})`)}})}function BO(e,t){for(let a=0;ar)throw new Error("Ragged splits must not point past values");for(let s=1;sn[s])throw new Error("Ragged splits must be sorted in ascending order")}}function WO(e,t,a,n){let r=[],s=0,i=t.length-1+a.length,o=new Array(i).fill(null).map(()=>[0]);BO(a,n);let l=1;for(let u=0;u=0){let m=o[f],g=m[m.length-1]-h[d];for(let y=d;yr[i]=s)}return t}function hy(e,t){let a=e.slice(0,t);for(;a.length1)throw new Error("starts must be a scalar or vector");if(r.length>1)throw new Error("limits must be a scalar or vector");if(i.length>1)throw new Error("deltas must be a scalar or vector");let o=t.length===0,l=r.length===0,u=i.length===0,d=[];o||d.push(t[0]),l||d.push(r[0]),u||d.push(i[0]);for(let g=1;g0&&Ay)b=0;else if(b=Math.ceil(Math.abs((A-y)/x)),b>fy)throw new Error(`Requires ((limit - start) / delta) <= ${fy}`);p[g+1]=p[g]+b}let h=p[c],f=v.getArrayFromDType(a,h),m=0;for(let g=0;ga&&(a=r)}return a}static getMaxWidthValueRowID(e){let t=e.length;if(t===0)return 0;let a=0,n=e[0],r=0;for(let s=1;s"Final length of result must be equal to firstDimension."),r}calculateOutputIndexRowSplit(e,t,a,n){let r=e.length,s=[];for(let i=0;i0&&s.length!==e[r-1])throw new Error("Invalid row split size.");return s}calculateOutputIndexValueRowID(e,t,a,n){let r=e.length,s=[];if(r===0)return[];let i=0,o=e[0];if(o>=t.length)throw new Error(`Got currentValueRowId=${o}, which is not less than ${t.length}`);let l=t[o];s.push(l);for(let u=1;u=0&&(++i,i=t.length)throw new Error(`Got nextValueRowId=${d} which is not less than ${t.length}`);l=t[d]}s.push(l)}if(s.length!==e.length)throw new Error("Invalid row ids.");return s}calculateOutputIndex(e,t,a,n){let r=this.getRowPartitionTensor(e),s=this.getRowPartitionTypeByDimension(e);switch(s){case bn.VALUE_ROWIDS:return this.calculateOutputIndexValueRowID(r,t,a,n);case bn.ROW_SPLITS:if(r.length-1>t.length)throw new Error(`Row partition size is greater than output size: ${r.length-1} > ${t.length}`);return this.calculateOutputIndexRowSplit(r,t,a,n);default:throw new Error(`Unsupported partition type: ${bn[s]}`)}}getFirstDimensionSize(){let e=this.rowPartitionValues[0];if(this.rowPartitionTypes.length===0)throw new Error("No row_partition_types given.");let t=this.rowPartitionTypes[0];switch(t){case bn.FIRST_DIM_SIZE:return e[0];case bn.VALUE_ROWIDS:throw new Error("Cannot handle VALUE_ROWIDS in first dimension.");case bn.ROW_SPLITS:return this.rowPartitionValuesShapes[0][0]-1;default:throw new Error(`Cannot handle type ${bn[t]}`)}}compute(){if(this.rowPartitionValues[0].length<=0)throw new Error("Invalid first partition input. Tensor requires at least one element.");let e=this.getFirstDimensionSize(),t=this.calculateOutputSize(e),a=new Array(this.raggedRank+1);a[a.length-1]=1;for(let s=a.length-2;s>=0;--s)a[s]=a[s+1]*t[s+1];let n=gy(t,!1),r=v.getArrayFromDType(this.valuesDType,v.sizeFromShape(n));if(a[0]*t[0]>0){let s=this.calculateFirstParentOutputIndex(e,a[0],t[0]);for(let i=1;i<=this.raggedRank;++i)s=this.calculateOutputIndex(i-1,s,a[i],t[i]);this.setOutput(this.raggedRank,s,r,n)}return[n,r]}setOutput(e,t,a,n){if(a.length===0)return;let r=this.values,s=a,i=n.slice();i=i.slice(e+1);let o=v.sizeFromShape(i),l=t.length,u=this.defaultValue;if(u.length!==o&&u.length!==1){let h=this.defaultValueShape;Ee(()=>{let f=J(u,h);u=ei(f,i).dataSync()})}let d=0,c=0,p=0;for(let h=0;h<=l;++h){let f=h=l){let m=a.length;f=Math.floor(m/o)}if(f>p)if(this.defaultValue.length===1)s.subarray(p*o,f*o).fill(this.defaultValue[0]),p=f;else for(;f>p;){let m=s.slice(p*o);my(m,u,o),++p}f<0?(d=h+1,c=p):(d=h,c=p,p=c+1)}}};function my(e,t,a){for(let n=0;n= 0`);if(n<-1)throw new Error(`Dimension ${n} must be >= -1`);n=-1}a.push(n)}return a}function C7(e,t,a,n,r,s,i,o,l,u){return new A1(e,t,a,n,r,s,i,o,l,u).compute()}function h3(e,t,a,n){let r=e===t,s=e1;if(r||s||i)return v.makeZerosTypedArray(0,n);let o=Math.abs(Math.ceil((t-e)/a)),l=v.makeZerosTypedArray(o,n);t1/Math.sqrt(e)),jO=Zl(hs,N7),HO={kernelName:hs,backendName:"cpu",kernelFunc:jO};function Zo(e,t,a,n,r,s,i,o,l,u){let d=[n/r,r],c=e.values,p=t.values;if(n===0)return ve(a,t.dtype);let h=ve(d,t.dtype);typeof l=="string"||typeof l=="number"?h.values.fill(l):typeof l=="boolean"&&h.values.fill(+l);for(let f=0;f=n/r)throw new Error(`Invalid indices: ${m} does not index into ${a}`);for(let y=0;y1/(1+Math.exp(-e))),E7=it(fs,e=>1/(1+Math.exp(-e))),XO={kernelName:fs,backendName:"cpu",kernelFunc:E7};function Mc(e,t,a,n,r){let s=At.isSliceContinous(n,t,a),i=v.sizeFromShape(a),o=v.computeStrides(n);if(s){let c=At.computeFlatOffset(t,o);return r==="string"?e.slice(c,c+i):e.subarray(c,c+i)}let l=r==="string"?T.fromUint8ToStringArray(e):e,u=ve(n,r,l),d=ve(a,r);for(let c=0;cf+t[m]);d.set(u.get(...h),...p)}return r==="string"?T.fromStringArrayToUint8(d.values):d.values}function li(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{begin:s,size:i}=n;Ae(r,"slice");let[o,l]=At.parseSliceParams(r,s,i);At.assertParamsValid(r,o,l);let u=a.data.get(r.dataId).values,d=Mc(u,o,l,r.shape,r.dtype);return a.makeTensorInfo(l,r.dtype,d)}var KO={kernelName:zl,backendName:"cpu",kernelFunc:li};function R7(e,t,a,n,r,s,i){let o=t[0],l=s[0],u=new Array(l),d=new Array(o),c=t[1];if(l===0){if(o!==0)throw new Error(T.getSparseFillEmptyRowsIndicesDenseShapeMismatch(o));let g=v.getArrayFromDType(a,0),y=v.getArrayFromDType(r,0);return[g,[0,c],y,u,d]}let p=!0,h=0,f=new Array(l).fill(0);for(let g=0;g=l)throw new Error(T.getSparseFillEmptyRowsOutOfRangeIndexErrorMessage(g,y,l));++f[y],p=p&&y>=h,h=y}let m=!0;for(let g=0;g0&&(f[g]+=f[g-1])}if(m&&p){let g=e,y=n;for(let A=0;A0){p[c-1]=1;for(let m=c-2;m>=0;--m)p[m]=p[m+1]*n[m+1]}let h=[];if(o>0){h[o-1]=1;for(let m=o-2;m>=0;--m)h[m]=h[m+1]*l[m+1]}let f=v.getArrayFromDType(a,i*o);for(let m=0;m0?r[o-1]+1:0;if(d<0)throw new Error(T.getSparseSegmentReductionNegativeSegmentIdsErrorMessage());let c=t.slice();c[0]=d;let p=c.reduce((A,x)=>A*x,1),h=v.getArrayFromDType(a,p);if(o===0)return d>0&&h.fill(i),[h,c];if(d<=0)throw new Error(T.getSparseSegmentReductionNegativeSegmentIdsErrorMessage());let f=0,m=1,g=0,y=r[f];for(;;){let A=0;if(m=A)throw new Error(T.getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage())}if(y<0||y>=d)throw new Error(T.getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage(y,d));y>g&&h.fill(i,g*u,y*u);for(let x=f;x=l[0])throw new Error(T.getSparseSegmentReductionIndicesOutOfRangeErrorMessage(x,n[x],l[0]));for(let w=0;wo)break}return gMath.sqrt(e)),YO=it(ms,e=>Math.sqrt(e)),JO={kernelName:ms,backendName:"cpu",kernelFunc:YO},$7=Lt((e,t)=>{let a=e-t;return a*a}),QO=Kt(gs,$7),eD={kernelName:gs,backendName:"cpu",kernelFunc:QO};function _7(e,t,a,n){let r=ve(e,t.dtype);for(let s=0;s0?0:i-o),p=0;p+=l*this.leftPad.length;for(let y=0;yy.forEach(A=>f[m++]=A);for(let y=0;y0){g(e[c+d-1]);for(let y=0;y0){let o=t[0];if(o!==0)throw new Error(`First split value must be 0, got ${o}`);for(let l=1;l=o;if(u=u&&t[l]<=a,!u)throw new Error(`Invalid split value ${t[l]}, must be in [${o}, ${a}]`);o=t[l]}if(o!==a)throw new Error(`Last split value must be data size. Expected ${a}, got ${o}`)}let r=n-1,s=v.getArrayFromDType("int32",n);if(a===0||n===0){let o=new Array(a);for(let l=0;l<=r;++l)s[l]=0;return[o,s]}s[0]=0;for(let o=1;o<=r;++o){let l=t[o]-t[o-1],u=0;this.nGramWidths.forEach(d=>{u+=this.getNumNGrams(l,d)}),this.preserveShort&&l>0&&u===0&&(u=1),s[o]=s[o-1]+u}let i=new Array(s[r]);for(let o=0;o{let c=t[o+1]-t[o],p=this.getNumNGrams(c,d);this.createNGrams(e,l,i,u,p,d),u+=p}),this.preserveShort&&u===s[o]){let d=t[o+1]-t[o];if(d===0)continue;let c=d+2*this.padWidth,p=1;this.createNGrams(e,l,i,u,p,c)}}return[i,s]}};function m3(e,t,a,n,r,s,i,o){return new tD(a,n,r,s,i,o).compute(e,t)}function aD(e,t,a,n){if(!e.length)return;if(t.length===0){for(let s=0;se-t),nD=l3((e,t,a,n)=>({real:e-a,imag:t-n})),A3=Kt(ys,F7,nD),rD={kernelName:ys,backendName:"cpu",kernelFunc:A3};function P7(e,t){let a=new Array(e.rank);for(let r=0;r{let a=t.value-e.value;return a===0?e.index-t.index:a};function O7(e,t,a=0,n=e.length-1){for(;n>a;){if(n-a>600){let o=n-a+1,l=t-a+1,u=Math.log(o),d=.5*Math.exp(2*u/3),c=.5*Math.sqrt(u*d*(o-d)/o)*Math.sign(l-o/2),p=Math.max(a,Math.floor(t-l*d/o+c)),h=Math.min(n,Math.floor(t+(o-l)*d/o+c));O7(e,t,p,h)}let r=e[t],s=a,i=n;for(v.swap(e,a,t),Du(e[n],r)>0&&v.swap(e,a,n);s0;)i=i-1}Du(e[a],r)===0?v.swap(e,a,i):(i=i+1,v.swap(e,i,n)),i<=t&&(a=i+1),t<=i&&(n=i-1)}}function D7(e,t,a,n,r){let s=t[t.length-1],[i,o]=[e.length/s,s],l=v.getTypedArrayFromDType(a,i*n),u=v.getTypedArrayFromDType("int32",i*n);for(let c=0;cf[x]={value:A,index:x}),n{for(let g=0;gnew Ph,1);var L7=it(Ni,e=>e>=0?e:Math.exp(e)-1),iD={kernelName:Ni,backendName:"cpu",kernelFunc:L7};function B7(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{alpha:s}=n;Ae([r],"leakyRelu");let i=v.sizeFromShape(r.shape),o=a.data.get(r.dataId).values,l=v.getTypedArrayFromDType("float32",i);for(let u=0;ue<0?t*e:e);function W7(e){let{inputs:t,backend:a}=e,{x:n,alpha:r}=t;Ae([n,r],"prelu");let s=a.data.get(n.dataId).values,i=a.data.get(r.dataId).values,[o,l]=lD(n.shape,r.shape,s,i,"float32");return a.makeTensorInfo(l,"float32",o)}var uD={kernelName:qi,backendName:"cpu",kernelFunc:W7},V7=it(Ki,e=>Math.max(0,e)),dD={kernelName:Ki,backendName:"cpu",kernelFunc:V7},G7=it(Ji,e=>Math.min(Math.max(0,e),6)),pD={kernelName:Ji,backendName:"cpu",kernelFunc:G7};function $c(e,t,a,n,r){if(a==="linear")return er({inputs:{x:t},backend:e});if(a==="relu")return V7({inputs:{x:t},backend:e});if(a==="elu")return L7({inputs:{x:t},backend:e});if(a==="relu6")return G7({inputs:{x:t},backend:e});if(a==="prelu")return W7({inputs:{x:t,alpha:n},backend:e});if(a==="leakyrelu")return B7({inputs:{x:t},backend:e,attrs:{alpha:r}});if(a==="sigmoid")return E7({inputs:{x:t},backend:e});throw new Error(`Activation ${a} has not been implemented for the CPU backend.`)}function ft(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{shape:s}=n,i=v.sizeFromShape(r.shape),o=v.inferFromImplicitShape(s,i),l=v.sizeFromShape(o);v.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.`),a.incRef(r.dataId);let u=a.data.get(r.dataId);if(u.complexTensorInfos!=null){let d=u.complexTensorInfos.real,c=u.complexTensorInfos.imag;d.shape=o,c.shape=o}return{dataId:r.dataId,shape:o,dtype:r.dtype}}var cD={kernelName:Fl,backendName:"cpu",kernelFunc:ft};function U7(e){let{inputs:t,backend:a,attrs:n}=e,{a:r,b:s}=t,{transposeA:i,transposeB:o}=n;Ae([r,s],"matMul");let l=r.shape.length,u=s.shape.length,d=i?r.shape[l-2]:r.shape[l-1],c=o?s.shape[u-1]:s.shape[u-2],p=i?r.shape[l-1]:r.shape[l-2],h=o?s.shape[u-2]:s.shape[u-1],f=r.shape.slice(0,-2),m=s.shape.slice(0,-2),g=v.sizeFromShape(f),y=v.sizeFromShape(m),A=po.assertAndGetBroadcastShape(r.shape.slice(0,-2),s.shape.slice(0,-2)).concat([p,h]);v.assert(d===c,()=>`Error in matMul: inner shapes (${d}) and (${c}) of Tensors with shapes ${r.shape} and ${s.shape} and transposeA=${i} and transposeB=${o} must match.`);let x=i?[g,d,p]:[g,p,d],b=o?[y,h,c]:[y,c,h],w=ft({inputs:{x:r},backend:a,attrs:{shape:x}}),S=ft({inputs:{x:s},backend:a,attrs:{shape:b}}),C=i?w.shape[1]:w.shape[2],N=i?w.shape[2]:w.shape[1],_=o?S.shape[1]:S.shape[2],$=Math.max(g,y),M=a.data.get(w.dataId).values,I=a.data.get(S.dataId).values,E=v.computeStrides(w.shape),O=v.computeStrides(S.shape),[L,B,G]=i?[E[0],1,E[1]]:[E[0],E[1],1],[j,U,H]=o?[1,O[1],O[0]]:[O[1],1,O[0]],W=N*_,Q=ve([$,N,_],w.dtype),Z=Q.values,re=a.blockSize;for(let ee=0;ee<$;ee++)for(let pe=0;peMath.acos(e)),yD={kernelName:yd,backendName:"cpu",kernelFunc:gD},AD=it(Ad,e=>Math.acosh(e)),xD={kernelName:Ad,backendName:"cpu",kernelFunc:AD};function bD(e){let{inputs:t,backend:a}=e,n=t;Ae(t,"addN");let r=n.map(o=>a.data.get(o.dataId).values),s=ve(n[0].shape,n[0].dtype),i=s.values;for(let o=0;oA&&(A=w,x=b)}h[g]=x}return u.forEach(g=>a.disposeIntermediateTensorInfo(g)),a.makeTensorInfo(d,"int32",h)}var CD={kernelName:fi,backendName:"cpu",kernelFunc:TD};function ND(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{axis:s}=n;Ae(r,"argMin");let i=v.parseAxisParam(s,r.shape),o=T.getAxesPermutation(i,r.shape.length),l=r,u=[];o!=null&&(l=La({inputs:{x:r},backend:a,attrs:{perm:o}}),u.push(l),i=T.getInnerMostAxes(i.length,l.shape.length)),i=[i[0]],T.assertAxesAreInnerMostDims("argMin",i,l.shape.length);let[d,c]=T.computeOutAndReduceShapes(l.shape,i),p=v.sizeFromShape(d),h=v.makeZerosTypedArray(p,"int32"),f=v.sizeFromShape(c),m=a.data.get(l.dataId).values;for(let g=0;ga.disposeIntermediateTensorInfo(g)),a.makeTensorInfo(d,"int32",h)}var ED={kernelName:xd,backendName:"cpu",kernelFunc:ND},RD=it(bd,e=>Math.asin(e)),MD={kernelName:bd,backendName:"cpu",kernelFunc:RD},$D=it(vd,e=>Math.asinh(e)),_D={kernelName:vd,backendName:"cpu",kernelFunc:$D},FD=it(wd,e=>Math.atan(e)),PD={kernelName:wd,backendName:"cpu",kernelFunc:FD},OD=Lt((e,t)=>Math.atan2(e,t)),DD=Kt(xl,OD),zD={kernelName:xl,backendName:"cpu",kernelFunc:DD},LD=it(kd,e=>Math.atanh(e)),BD={kernelName:kd,backendName:"cpu",kernelFunc:LD};function x3(e,t,a,n,r,s){let i=r.strideHeight,o=r.strideWidth,l=r.dilationHeight,u=r.dilationWidth,d=r.effectiveFilterHeight,c=r.effectiveFilterWidth,p=r.padInfo.top,h=r.padInfo.left,f=s==="max"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,m=ve(r.outShape,a),g=m.values,y=r.outShape[1]*r.outShape[2]*r.outShape[3],A=r.outShape[2]*r.outShape[3],x=r.outShape[3];for(let b=0;bG?G=ee:s==="avg"&&(j+=ee,U++)}if(isNaN(G))break}let H=I+E*x+C;g[H]=s==="avg"?j/U:G}}}return m}function j7(e,t,a,n,r=!1,s=!1){let i=ve(n.outShape,"int32"),o=n.strideHeight,l=n.strideWidth,u=n.dilationHeight,d=n.dilationWidth,c=n.effectiveFilterHeight,p=n.effectiveFilterWidth,h=n.padInfo.top,f=n.padInfo.left,m=ve(t,a,e);for(let g=0;g$&&($=B,r?M=s?((g*n.inHeight+I)*n.inWidth+O)*n.inChannels+y:(I*n.inWidth+O)*n.inChannels+y:M=E*p+L)}}i.set(M,g,A,S,y)}}return i}function H7(e,t,a,n,r,s){let i=r.strideDepth,o=r.strideHeight,l=r.strideWidth,u=r.dilationDepth,d=r.dilationHeight,c=r.dilationWidth,p=r.effectiveFilterDepth,h=r.effectiveFilterHeight,f=r.effectiveFilterWidth,m=r.padInfo.front,g=r.padInfo.top,y=r.padInfo.left,A=s==="max"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,x=ve(r.outShape,a),b=x.values,w=r.outShape[1]*r.outShape[2]*r.outShape[3]*r.outShape[4],S=r.outShape[2]*r.outShape[3]*r.outShape[4],C=r.outShape[3]*r.outShape[4],N=r.outShape[4];for(let _=0;_ye?ye=ct:s==="avg"&&(we+=ct,Ne++),isNaN(ye))break}if(isNaN(ye))break}if(isNaN(ye))break}let Ge=oe+I;b[Ge]=s==="avg"?we/Ne:ye}}}}return x}function WD(e,t){let a=ve(t.outShape,"int32"),n=t.strideDepth,r=t.strideHeight,s=t.strideWidth,i=t.dilationDepth,o=t.dilationHeight,l=t.dilationWidth,u=t.effectiveFilterDepth,d=t.effectiveFilterHeight,c=t.effectiveFilterWidth,p=t.padInfo.front,h=t.padInfo.top,f=t.padInfo.left;for(let m=0;m=E&&(E=W,O=B*d*c+j*d+H)}}}a.set(O,m,y,w,_,g)}}}return a}function VD(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t;Ae(r,"avgPool");let{filterSize:s,strides:i,pad:o,dimRoundingMode:l}=n,u=1;v.assert(T.eitherStridesOrDilationsAreOne(i,u),()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${i} and dilations '${u}'`);let d=T.computePool2DInfo(r.shape,s,i,u,o,l),c;if(d.filterWidth===1&&d.filterHeight===1&&v.arraysEqual(d.inShape,d.outShape))c=er({inputs:{x:r},backend:a});else{let p=a.data.get(r.dataId).values,h=v.computeStrides(r.shape),f=x3(p,r.shape,r.dtype,h,d,"avg");c=a.makeTensorInfo(d.outShape,r.dtype,f.values)}return c}var GD={kernelName:mi,backendName:"cpu",kernelFunc:VD};function UD(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{filterSize:s,strides:i,pad:o,dimRoundingMode:l,dataFormat:u}=n;Ae(r,"avgPool3d");let d=T.computePool3DInfo(r.shape,s,i,1,o,l,u),c=a.data.get(r.dataId).values,p=H7(c,r.shape,r.dtype,v.computeStrides(r.shape),d,"avg");return a.makeTensorInfo(p.shape,"float32",p.values)}var jD={kernelName:Gc,backendName:"cpu",kernelFunc:UD};function HD(e){let{inputs:t,backend:a,attrs:n}=e,{dy:r,input:s}=t,{filterSize:i,strides:o,pad:l,dimRoundingMode:u}=n;Ae([r,s],"avgPool3DGrad");let d=T.computePool3DInfo(s.shape,i,o,1,l,u),c=d.strideDepth,p=d.strideHeight,h=d.strideWidth,f=d.filterDepth,m=d.filterHeight,g=d.filterWidth,y=d.dilationDepth,A=d.dilationHeight,x=d.dilationWidth,b=d.effectiveFilterDepth,w=d.effectiveFilterHeight,S=d.effectiveFilterWidth,C=b-1-d.padInfo.front,N=S-1-d.padInfo.left,_=w-1-d.padInfo.top,$=ve(s.shape,"float32"),M=1/(f*m*g),I=a.bufferSync(r);for(let E=0;E=d.outDepth||Math.floor(Z)!==Z))for(let re=0;re=d.outHeight||Math.floor(ee)!==ee))for(let pe=0;pe=d.outWidth||Math.floor(oe)!==oe)continue;let ye=I.get(E,Z,ee,oe,O);W+=ye}}}$.set(W*M,E,L,B,G,O)}return a.makeTensorInfo($.shape,$.dtype,$.values)}var qD={kernelName:H1,backendName:"cpu",kernelFunc:HD};function XD(e){let{inputs:t,backend:a,attrs:n}=e,{dy:r,input:s}=t,i=s;Ae([r,s],"avgPoolGrad");let{filterSize:o,strides:l,pad:u}=n,d=T.computePool2DInfo(i.shape,o,l,1,u),c=d.strideHeight,p=d.strideWidth,h=d.filterHeight,f=d.filterWidth,m=d.dilationHeight,g=d.dilationWidth,y=d.effectiveFilterHeight,A=d.effectiveFilterWidth,x=A-1-d.padInfo.left,b=y-1-d.padInfo.top,w=ve(i.shape,"float32"),S=1/(h*f),C=a.data.get(r.dataId).values,N=ve(r.shape,"float32",C);for(let _=0;_=d.outHeight||Math.floor(G)!==G))for(let j=0;j=d.outWidth||Math.floor(U)!==U)continue;let H=N.get(_,G,U,$);L+=H}}w.set(L*S,_,M,I,$)}return a.makeTensorInfo(w.shape,w.dtype,w.values)}var KD={kernelName:j1,backendName:"cpu",kernelFunc:XD};function ZD(e){let{inputs:t,backend:a,attrs:n}=e,{x:r,scale:s,offset:i,mean:o,variance:l}=t;v.assert(o.shape.length===l.shape.length,()=>"Batch normalization gradient requires mean and variance to have equal ranks."),v.assert(i==null||o.shape.length===i.shape.length,()=>"Batch normalization gradient requires mean and offset to have equal ranks."),v.assert(s==null||o.shape.length===s.shape.length,()=>"Batch normalization gradient requires mean and scale to have equal ranks."),Ae([r,o,l,s,i],"batchNorm");let{varianceEpsilon:u}=n;u==null&&(u=.001);let d=a.data.get(r.dataId).values,c=a.data.get(o.dataId).values,p=a.data.get(l.dataId).values,h=s?a.data.get(s.dataId).values:new Float32Array([1]),f=i?a.data.get(i.dataId).values:new Float32Array([0]),m=new Float32Array(d.length),g=f.length,y=h.length,A=p.length,x=c.length,b=0,w=0,S=0,C=0;for(let N=0;N=g&&(b=0),w>=x&&(w=0),S>=y&&(S=0),C>=A&&(C=0);return a.makeTensorInfo(r.shape,r.dtype,m)}var YD={kernelName:$i,backendName:"cpu",kernelFunc:ZD};function JD(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{blockShape:s,crops:i}=n;Ae([r],"batchToSpaceND");let o=s.reduce((y,A)=>y*A),l=T.getReshaped(r.shape,s,o),u=T.getPermuted(l.length,s.length),d=T.getReshapedPermuted(r.shape,s,o),c=T.getSliceBeginCoords(i,s.length),p=T.getSliceSize(d,i,s.length),h=ft({inputs:{x:r},backend:a,attrs:{shape:l}}),f=La({inputs:{x:h},backend:a,attrs:{perm:u}}),m=ft({inputs:{x:f},backend:a,attrs:{shape:d}}),g=li({inputs:{x:m},backend:a,attrs:{begin:c,size:p}});return a.disposeIntermediateTensorInfo(h),a.disposeIntermediateTensorInfo(f),a.disposeIntermediateTensorInfo(m),g}var QD={kernelName:bl,backendName:"cpu",kernelFunc:JD};function ez(e){let{inputs:t,backend:a,attrs:n}=e,{x:r,weights:s}=t,{size:i}=n,o=a.data.get(r.dataId).values,l=a.data.get(s.dataId).values,u=u3(o,l,s.dtype,s.shape,i);return a.makeTensorInfo([i],s.dtype,u)}var tz={kernelName:Uc,backendName:"cpu",kernelFunc:ez};function az(e){let{inputs:t,backend:a}=e,{s0:n,s1:r}=t,s=a.data.get(n.dataId).values,i=a.data.get(r.dataId).values,o=T.assertAndGetBroadcastShape(Array.from(s),Array.from(i));return a.makeTensorInfo([o.length],"int32",Int32Array.from(o))}var nz={kernelName:jc,backendName:"cpu",kernelFunc:az},rz=it(es,(e,t)=>{let a=t;return e>a.clipValueMax?a.clipValueMax:e{let{x:t}=e.inputs,a=e.backend,n=new Float32Array(v.sizeFromShape(t.shape)),r=a.data.get(t.dataId),s=r.complexTensorInfos.real,i=r.complexTensorInfos.imag,o=a.data.get(s.dataId).values,l=a.data.get(i.dataId).values;for(let u=0;um.shape);T.assertParamsConsistent(i,s);let o=T.computeOutShape(t.map(m=>m.shape),s);if(v.sizeFromShape(o)===0)return a.makeTensorInfo(o,t[0].dtype,[]);let l=t.filter(m=>v.sizeFromShape(m.shape)>0);if(l.length===1)return er({inputs:{x:l[0]},backend:a});if(l[0].dtype==="complex64"){let m=l.map(b=>oi({inputs:{input:b},backend:a})),g=l.map(b=>dl({inputs:{input:b},backend:a})),y=pl({inputs:m,backend:a,attrs:{axis:s}}),A=pl({inputs:g,backend:a,attrs:{axis:s}}),x=qa({inputs:{real:y,imag:A},backend:a});return m.forEach(b=>a.disposeIntermediateTensorInfo(b)),g.forEach(b=>a.disposeIntermediateTensorInfo(b)),a.disposeIntermediateTensorInfo(y),a.disposeIntermediateTensorInfo(A),x}let u=l.map(m=>{let g=[-1,v.sizeFromShape(m.shape.slice(s))];return ft({inputs:{x:m},backend:a,attrs:{shape:g}})}),d=u.map(m=>({vals:a.data.get(m.dataId).values,shape:m.shape}));o=T.computeOutShape(u.map(m=>m.shape),1);let c=u[0].shape[0]===1,p=d3(d,o,t[0].dtype,c),h=T.computeOutShape(l.map(m=>m.shape),s),f=a.makeTensorInfo(h,t[0].dtype,p);return u.forEach(m=>a.disposeIntermediateTensorInfo(m)),f}var uz={kernelName:vl,backendName:"cpu",kernelFunc:pl};function q7(e){let{inputs:t,backend:a,attrs:n}=e,{x:r,filter:s}=t,{strides:i,pad:o,dataFormat:l,dilations:u,dimRoundingMode:d}=n;Ae([r,s],"conv2d");let c=T.convertConv2DDataFormat(l),p=T.computeConv2DInfo(r.shape,s.shape,i,u,o,d,!1,c),h=p.filterHeight,f=p.filterWidth,m=p.dilationHeight,g=p.dilationWidth,y=p.padInfo.left,A=p.padInfo.top,x=p.dataFormat==="channelsLast",b=new Mt(p.outShape,r.dtype),w=v.computeStrides(r.shape),S=v.computeStrides(s.shape),C=w[0],N=x?w[1]:w[2],_=x?w[2]:1,$=x?1:w[1],M=b.strides[0],I=x?b.strides[1]:b.strides[2],E=x?b.strides[2]:1,O=x?1:b.strides[1],L=a.data.get(r.dataId).values,B=a.data.get(s.dataId).values,G=b.values;for(let j=0;j=p.inHeight)continue;let pe=re*S[0],oe=U+ee*N;for(let ye=0;ye=p.inWidth)continue;let nt=pe+Ge*S[1],lt=oe+Xe*_,et=nt;for(let rt=0;rt=u.inDepth)continue;let j=B*_[0],U=M+G*N[1];for(let H=0;H=u.inHeight)continue;let ee=j+Z*_[1],pe=U+re*N[2];for(let oe=0;oe=u.inWidth)continue;let Xe=ee+Ne*_[2],nt=pe+Ge*u.inChannels,lt=Xe;for(let et=0;etMath.cos(e)),wz={kernelName:bi,backendName:"cpu",kernelFunc:vz},kz=it(vi,e=>Math.cosh(e)),Iz={kernelName:vi,backendName:"cpu",kernelFunc:kz};function Sz(e){let{inputs:t,backend:a,attrs:n}=e,{image:r,boxes:s,boxInd:i}=t,{cropSize:o,method:l,extrapolationValue:u}=n,[d,c,p,h]=r.shape,f=s.shape[0],[m,g]=o,y=ve([f,m,g,h],"float32"),A=a.data.get(s.dataId).values,x=a.data.get(i.dataId).values,b=a.data.get(r.dataId).values,w=v.computeStrides(r.shape),S=v.computeStrides(y.shape);for(let C=0;C=d)continue;let O=m>1?(M-_)*(c-1)/(m-1):0,L=g>1?(I-$)*(p-1)/(g-1):0;for(let B=0;B1?_*(c-1)+B*O:.5*(_+M)*(c-1);if(G<0||G>c-1){for(let j=0;j1?$*(p-1)+W*L:.5*($+I)*(p-1);if(Q<0||Q>p-1){for(let pe=0;pe1?$*(p-1)+j*L:.5*($+I)*(p-1);if(U<0||U>p-1){for(let Q=0;Qy+f-A-1:(y,A)=>y+A;for(let y=0;yy+f-A-1:(y,A)=>y+A;for(let y=0;y`Only NHWC dataFormat supported on CPU for depthToSpace. Got ${i}`);let o=r.shape[0],l=r.shape[1],u=r.shape[2],d=r.shape[3],c=l*s,p=u*s,h=d/(s*s),f=a.data.get(r.dataId).values,m=new Float32Array(o*c*p*h),g=0;for(let y=0;y`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${i} and dilations '${p}'`);let h=T.computeConv2DInfo(r.shape,s.shape,i,p,o,u,!0),{filterHeight:f,filterWidth:m,dilationHeight:g,dilationWidth:y,padInfo:A}=h,x=A.left,b=A.top,w=h.outChannels/h.inChannels,S=new Mt(h.outShape,r.dtype),C=a.data.get(r.dataId).values,N=a.data.get(s.dataId).values,_=S.values;for(let $=0;$=h.inHeight)continue;let j=B*c[0],U=M+G*d[1];for(let H=0;H=h.inWidth)continue;let ee=j+Z*c[1],pe=U+re*h.inChannels,oe=W,ye=ee;for(let we=0;we{let{x:n,filter:r}=e,{strides:s,pad:i,dilations:o}=a,l=t,u=l.data.get(n.dataId).values,d=n.shape.length,c=l.data.get(r.dataId).values,p=r.shape.length,{batchSize:h,inHeight:f,inWidth:m,inChannels:g,outHeight:y,outWidth:A,padInfo:x,strideHeight:b,strideWidth:w,filterHeight:S,filterWidth:C,dilationHeight:N,dilationWidth:_,outShape:$}=T.computeDilation2DInfo(n.shape,r.shape,s,i,"NHWC",o),M=v.sizeFromShape($),I=$.length,E=v.getArrayFromDType(n.dtype,M);for(let O=0;O=0&&Z=0&&eeH&&(H=ye)}}}let W=v.locToIndex([O,L,G,U],I,v.computeStrides($));E[W]=H}}}return{dataId:l.write(v.toTypedArray(E,n.dtype),$,n.dtype),shape:$,dtype:n.dtype}}},Gz={kernelName:Gm,backendName:"cpu",kernelFunc:({inputs:e,backend:t,attrs:a})=>{let{x:n,filter:r,dy:s}=e,{strides:i,pad:o,dilations:l}=a,u=t,d=v.toNestedArray(n.shape,u.data.get(n.dataId).values),c=v.toNestedArray(r.shape,u.data.get(r.dataId).values),{batchSize:p,inHeight:h,inWidth:f,inChannels:m,outHeight:g,outWidth:y,padInfo:A,strideHeight:x,strideWidth:b,filterHeight:w,filterWidth:S,dilationHeight:C,dilationWidth:N,outShape:_}=T.computeDilation2DInfo(n.shape,r.shape,i,o,"NHWC",l);v.assert(s.rank===_.length,()=>`Error in ${Gm}, dy must have the same rank as output ${_.length}, but got ${s.rank}`);let $=v.toNestedArray(_,u.data.get(s.dataId).values),M=v.makeZerosNestedTypedArray(r.shape,r.dtype);for(let I=0;I=0&&Q=0&&rej&&(j=ee,U=W,H=Z)}}}M[U][H][G]+=$[I][E][L][G]}}}return{dataId:u.write(v.toTypedArray(M,n.dtype),r.shape,r.dtype),shape:r.shape,dtype:r.dtype}}},Uz={kernelName:Vm,backendName:"cpu",kernelFunc:({inputs:e,backend:t,attrs:a})=>{let{x:n,filter:r,dy:s}=e,{strides:i,pad:o,dilations:l}=a,u=t,d=v.toNestedArray(n.shape,u.data.get(n.dataId).values),c=v.toNestedArray(r.shape,u.data.get(r.dataId).values),{batchSize:p,inHeight:h,inWidth:f,inChannels:m,outHeight:g,outWidth:y,padInfo:A,strideHeight:x,strideWidth:b,filterHeight:w,filterWidth:S,dilationHeight:C,dilationWidth:N,outShape:_}=T.computeDilation2DInfo(n.shape,r.shape,i,o,"NHWC",l);v.assert(s.rank===_.length,()=>`Error in ${Vm}, dy must have the same rank as output ${_.length}, but got ${s.rank}`);let $=v.toNestedArray(_,u.data.get(s.dataId).values),M=v.makeZerosNestedTypedArray(n.shape,n.dtype);for(let I=0;I=0&&Q=0&&rej&&(j=ee,U=Q,H=re)}}}M[I][U][H][G]+=$[I][E][L][G]}}}return{dataId:u.write(v.toTypedArray(M,n.dtype),n.shape,n.dtype),shape:n.shape,dtype:n.dtype}}};function lp(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{axis:s,keepDims:i}=n;Ae(r,"sum");let o;r.dtype==="bool"?o=Zr({inputs:{x:r},backend:a,attrs:{dtype:"int32"}}):o=er({inputs:{x:r},backend:a});let l=o.shape.length,u=v.parseAxisParam(s,o.shape),d=T.getAxesPermutation(u,l),c=u,p=o;d!=null&&(p=La({inputs:{x:o},backend:a,attrs:{perm:d}}),c=T.getInnerMostAxes(c.length,l)),T.assertAxesAreInnerMostDims("sum",c,p.shape.length);let[h,f]=T.computeOutAndReduceShapes(p.shape,c),m=T.upcastType(p.dtype,"int32"),g=Rc(a,h,m),y=v.sizeFromShape(f),A=a.data.get(g.dataId).values,x=a.data.get(p.dataId).values;for(let b=0;b=0&&(p=lp({inputs:{x:p},backend:a,attrs:{axis:u[m]-(i.length-h),keepDims:!1}}),f.push(p)),h--)}for(let m of f)m!==p&&a.disposeIntermediateTensorInfo(m);return p}var qz={kernelName:Sd,backendName:"cpu",kernelFunc:Hz};function Xz(e){let{inputs:t,backend:a}=e,{dy:n,y:r}=t;Ae([n,r],"eluGrad");let s=new Float32Array(v.sizeFromShape(r.shape)),i=a.data.get(r.dataId).values,o=a.data.get(n.dataId).values;for(let l=0;l=1?s[l]=o[l]:s[l]=o[l]*(u+1)}return a.makeTensorInfo(r.shape,"float32",s)}var Kz={kernelName:X1,backendName:"cpu",kernelFunc:Xz},Zz=T.ERF_P,Yz=T.ERF_A1,Jz=T.ERF_A2,Qz=T.ERF_A3,eL=T.ERF_A4,tL=T.ERF_A5,aL=it(Td,e=>{let t=Math.sign(e),a=Math.abs(e),n=1/(1+Zz*a);return t*(1-((((tL*n+eL)*n+Qz)*n+Jz)*n+Yz)*n*Math.exp(-a*a))}),nL={kernelName:Td,backendName:"cpu",kernelFunc:aL};function _c(e){let{inputs:t,backend:a,attrs:n}=e,{input:r}=t,{dim:s}=n,i=r.shape.length,o=r.shape.slice(),l=s;return s<0&&(v.assert(-(i+1)<=s,()=>`Axis must be in the interval [${-(i+1)}, ${i}]`),l=i+s+1),o.splice(l,0,1),ft({inputs:{x:r},backend:a,attrs:{shape:o}})}var rL={kernelName:wl,backendName:"cpu",kernelFunc:_c},sL=Lt((e,t)=>e/t),b3=Kt(Ci,sL),x1={kernelName:Ci,backendName:"cpu",kernelFunc:b3};function K7(e,t,a){let n=e.shape,r=n[0],s=n[1],i=a.data.get(e.dataId),o=i.complexTensorInfos.real,l=i.complexTensorInfos.imag,u=[r,s],d=v.sizeFromShape(u),c=v.getTypedArrayFromDType("float32",d),p=v.getTypedArrayFromDType("float32",d);for(let g=0;g{let{image:n}=e,r=a,s=v.getTypedArrayFromDType(n.dtype,v.sizeFromShape(n.shape)),[i,o,l,u]=n.shape,d=r.data.get(n.dataId).values;for(let c=0;c=0&&AMath.floor(e/t)),mL=Kt(Mi,fL,null,"int32"),gL={kernelName:Mi,backendName:"cpu",kernelFunc:mL};function yL(e){let{inputs:t,backend:a,attrs:n}=e,{x:r,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:u,dataFormat:d,dilations:c,dimRoundingMode:p,activation:h,leakyreluAlpha:f}=n,m=q7({inputs:{x:r,filter:s},backend:a,attrs:{strides:l,pad:u,dataFormat:d,dilations:c,dimRoundingMode:p}});if(i){let g=m;if(d==="NCHW"&&i.shape.length===1&&i.shape[0]!==1){let y=ft({inputs:{x:i},backend:a,attrs:{shape:[i.shape[0],1,1]}});m=ul({inputs:{a:m,b:y},backend:a}),a.disposeIntermediateTensorInfo(y)}else m=ul({inputs:{a:m,b:i},backend:a});a.disposeIntermediateTensorInfo(g)}if(h){let g=m;if(d==="NCHW"&&h==="prelu"&&o.shape.length===1&&o.shape[0]!==1){let y=ft({inputs:{x:o},backend:a,attrs:{shape:[o.shape[0],1,1]}});m=$c(a,m,h,y,f),a.disposeIntermediateTensorInfo(y)}else m=$c(a,m,h,o,f);a.disposeIntermediateTensorInfo(g)}return m}var AL={kernelName:jr,backendName:"cpu",kernelFunc:yL};function xL(e){let{inputs:t,backend:a,attrs:n}=e,{x:r,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:u,dataFormat:d,dilations:c,dimRoundingMode:p,activation:h,leakyreluAlpha:f}=n,m=X7({inputs:{x:r,filter:s},backend:a,attrs:{strides:l,pad:u,dataFormat:d,dilations:c,dimRoundingMode:p}});if(i){let g=m;m=ul({inputs:{a:m,b:i},backend:a}),a.disposeIntermediateTensorInfo(g)}if(h){let g=m;m=$c(a,m,h,o,f),a.disposeIntermediateTensorInfo(g)}return m}var bL={kernelName:Hr,backendName:"cpu",kernelFunc:xL};function vL(e){let{inputs:t,backend:a}=e,{params:n,indices:r}=t,s=v.sizeFromShape(n.shape),i=r.shape,o=i[i.length-1],[l,u,d,c]=T.prepareAndValidate(n,r);if(u===0)return a.makeTensorInfo(l,n.dtype,[]);let p=a.data.get(r.dataId).values,h=a.bufferSync(n),f=p7(p,h,n.dtype,u,o,d,c,n.shape,s);return a.makeTensorInfo(l,n.dtype,f.values)}var wL={kernelName:_i,backendName:"cpu",kernelFunc:vL};function kL(e){let{inputs:t,backend:a,attrs:n}=e,{x:r,indices:s}=t,{axis:i,batchDims:o}=n;Ae([r,s],"gatherV2");let l=v.parseAxisParam(i,r.shape)[0],u=a.data.get(s.dataId).values,d=r.shape[l];for(let b=0;b=0,()=>`GatherV2: the index value ${w} is not in [0, ${d-1}]`)}let c=o;o==null&&(c=0);let p=v.sizeFromShape(s.shape),h=T.segment_util.collectGatherOpShapeInfo(r,s,l,c),f=ft({inputs:{x:r},backend:a,attrs:{shape:[h.batchSize,h.outerSize,h.dimSize,h.sliceSize]}}),m=ft({inputs:{x:s},backend:a,attrs:{shape:[h.batchSize,p/h.batchSize]}}),g=[h.batchSize,h.outerSize,p/h.batchSize,h.sliceSize],y=a.bufferSync(m),A=a.bufferSync(f),x=c7(A,y,g);return a.disposeIntermediateTensorInfo(f),a.disposeIntermediateTensorInfo(m),a.makeTensorInfo(h.outputShape,x.dtype,x.values)}var IL={kernelName:Il,backendName:"cpu",kernelFunc:kL};function SL(e){let{inputs:t,backend:a}=e,{input:n}=t,r=v.sizeFromShape(n.shape),s=n.shape[n.shape.length-1],i=r/s,o=ft({inputs:{x:n},backend:a,attrs:{shape:[i,s]}}),l=K7(o,!0,a),u=ft({inputs:{x:l},backend:a,attrs:{shape:n.shape}});return a.disposeIntermediateTensorInfo(o),a.disposeIntermediateTensorInfo(l),u}var TL={kernelName:ah,backendName:"cpu",kernelFunc:SL},CL=it(Nd,e=>Number.isFinite(e)?1:0,"bool"),NL={kernelName:Nd,backendName:"cpu",kernelFunc:CL},EL=it(Ed,e=>Math.abs(e)===1/0?1:0,"bool"),RL={kernelName:Ed,backendName:"cpu",kernelFunc:EL},ML=it(Sl,e=>Number.isNaN(e)?1:0,"bool"),$L={kernelName:Sl,backendName:"cpu",kernelFunc:ML};function _L(e){let{backend:t,attrs:a}=e,{start:n,stop:r,num:s}=a,i=y7(n,r,s);return t.makeTensorInfo([i.length],"float32",i)}var FL={kernelName:nh,backendName:"cpu",kernelFunc:_L},PL=it(Rd,e=>Math.log1p(e)),OL={kernelName:Rd,backendName:"cpu",kernelFunc:PL},DL=Lt((e,t)=>e&&t),zL=Kt(Oi,DL,null,"bool"),LL={kernelName:Oi,backendName:"cpu",kernelFunc:zL},BL=it(Di,e=>e?0:1,"bool"),WL={kernelName:Di,backendName:"cpu",kernelFunc:BL},VL=Lt((e,t)=>e||t),GL=Kt(Tl,VL,null,"bool"),UL={kernelName:Tl,backendName:"cpu",kernelFunc:GL};function jL(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{depthRadius:s,bias:i,alpha:o,beta:l}=n;Ae(r,"LRN");let u=r.shape[3],d=u-1,c=a.data.get(r.dataId).values,p=v.sizeFromShape(r.shape),h=new Float32Array(p);function f(m){let g=m%u,y=m-g+Math.max(0,g-s),A=m-g+Math.min(g+s,d),x=0;for(;y<=A;y++){let b=c[y];x+=b*b}return x}for(let m=0;m`Error in maxPool: Either strides or dilations must be 1. Got strides ${i} and dilations '${u}'`);let d=T.computePool2DInfo(r.shape,s,i,u,o,l),c;if(d.filterWidth===1&&d.filterHeight===1&&v.arraysEqual(d.inShape,d.outShape))c=er({inputs:{x:r},backend:a});else{let p=a.data.get(r.dataId).values,h=v.computeStrides(r.shape),f=x3(p,r.shape,r.dtype,h,d,"max");c=a.makeTensorInfo(d.outShape,r.dtype,f.values)}return c}var YL={kernelName:Li,backendName:"cpu",kernelFunc:ZL};function JL(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{filterSize:s,strides:i,pad:o,dimRoundingMode:l,dataFormat:u}=n;Ae(r,"maxPool3d");let d=T.computePool3DInfo(r.shape,s,i,1,o,l,u),c=a.data.get(r.dataId).values,p=H7(c,r.shape,r.dtype,v.computeStrides(r.shape),d,"max");return a.makeTensorInfo(p.shape,"float32",p.values)}var QL={kernelName:sh,backendName:"cpu",kernelFunc:JL};function eB(e){let{inputs:t,backend:a,attrs:n}=e,{dy:r,input:s}=t,{filterSize:i,strides:o,pad:l,dimRoundingMode:u}=n;Ae([r,s],"maxPool3DGrad");let d=T.computePool3DInfo(s.shape,i,o,1,l,u),c=a.bufferSync(s),p=WD(c,d),h=d.strideDepth,f=d.strideHeight,m=d.strideWidth,g=d.dilationDepth,y=d.dilationHeight,A=d.dilationWidth,x=d.effectiveFilterDepth,b=d.effectiveFilterHeight,w=d.effectiveFilterWidth,S=x-1-d.padInfo.front,C=w-1-d.padInfo.left,N=b-1-d.padInfo.top,_=ve(s.shape,"float32"),$=a.bufferSync(r);for(let M=0;M=d.outDepth||Math.floor(W)!==W))for(let Q=0;Q=d.outHeight||Math.floor(Z)!==Z))for(let re=0;re=d.outWidth||Math.floor(ee)!==ee)continue;let pe=x*b*w-1-p.get(M,W,Z,ee,I),oe=H*b*w+Q*w+re,ye=pe===oe?1:0;if(ye===0)continue;let we=$.get(M,W,Z,ee,I);U+=we*ye}}}_.set(U,M,E,O,L,I)}return a.makeTensorInfo(_.shape,_.dtype,_.values)}var tB={kernelName:Y1,backendName:"cpu",kernelFunc:eB};function aB(e){let{inputs:t,backend:a,attrs:n}=e,{dy:r,input:s,output:i}=t,o=s;Ae([s,i],"maxPoolGrad");let{filterSize:l,strides:u,pad:d,dimRoundingMode:c}=n,p=T.computePool2DInfo(o.shape,l,u,1,d,c),h=a.data.get(o.dataId).values,f=ve(p.outShape,o.dtype,j7(h,o.shape,o.dtype,p).values),m=p.strideHeight,g=p.strideWidth,y=p.dilationHeight,A=p.dilationWidth,x=p.effectiveFilterHeight,b=p.effectiveFilterWidth,w=b-1-p.padInfo.left,S=x-1-p.padInfo.top,C=ve(o.shape,"float32"),N=a.data.get(r.dataId).values,_=ve(r.shape,"float32",N);for(let $=0;$=p.outHeight||Math.floor(j)!==j))for(let U=0;U=p.outWidth||Math.floor(H)!==H)continue;let W=x*b-1-f.get($,j,H,M),Q=G*b+U,Z=W===Q?1:0;if(Z===0)continue;let re=_.get($,j,H,M);B+=re*Z}}C.set(B,$,I,E,M)}return a.makeTensorInfo(C.shape,C.dtype,C.values)}var nB={kernelName:Z1,backendName:"cpu",kernelFunc:aB};function rB(e,t,a,n,r){let s=v.computeStrides(t),i=x3(e,t,a,s,r,"max"),o=j7(e,t,a,r,!0,n);return[i.values,o.values]}var sB={kernelName:ih,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:a})=>{let{x:n}=e,{filterSize:r,strides:s,pad:i,includeBatchInIndex:o}=t,l=a;Ae(n,"MaxPoolWithArgmax");let u=l.data.get(n.dataId).values,d=T.computePool2DInfo(n.shape,r,s,[1,1],i),[c,p]=rB(u,n.shape,n.dtype,o,d),h=l.write(c,d.outShape,n.dtype),f=l.write(p,d.outShape,n.dtype);return[{dataId:h,shape:d.outShape,dtype:n.dtype},{dataId:f,shape:d.outShape,dtype:"int32"}]}};function iB(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{axis:s,keepDims:i}=n,o=v.parseAxisParam(s,r.shape),l=T.computeOutAndReduceShapes(r.shape,o)[1],u=v.sizeFromShape(l),d=[],c=a.makeTensorInfo([],"float32",new Float32Array([u]));d.push(c);let p=Zr({inputs:{x:r},backend:a,attrs:{dtype:"float32"}});d.push(p);let h=b3({inputs:{a:p,b:c},backend:a});d.push(h);let f=lp({inputs:{x:h},backend:a,attrs:{axis:s,keepDims:i}});return d.forEach(m=>a.disposeIntermediateTensorInfo(m)),f}var oB={kernelName:Bi,backendName:"cpu",kernelFunc:iB};function lB(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{axis:s,keepDims:i}=n;Ae(r,"min");let o=v.parseAxisParam(s,r.shape),l=o,u=T.getAxesPermutation(l,r.shape.length),d=r;u!=null&&(d=La({inputs:{x:r},backend:a,attrs:{perm:u}}),l=T.getInnerMostAxes(l.length,r.shape.length)),T.assertAxesAreInnerMostDims("min",l,d.shape.length);let[c,p]=T.computeOutAndReduceShapes(d.shape,l),h=v.sizeFromShape(p),f=v.makeZerosTypedArray(v.sizeFromShape(c),d.dtype),m=a.data.get(d.dataId).values;for(let y=0;yA[0]+r.shape[x]+A[1]),l=s.map(A=>A[0]),u=s.map((A,x)=>A[0]+r.shape[x]),d=i==="reflect"?0:1,c=a.data.get(r.dataId).values,p=r.shape.length,h=v.computeStrides(r.shape),f=v.sizeFromShape(o),m=o.length,g=v.computeStrides(o),y=v.getTypedArrayFromDType(r.dtype,f);for(let A=0;A=u[w]&&(x[w]=(u[w]-1)*2-x[w]+d);x=x.map((w,S)=>w-l[S]);let b=v.locToIndex(x,p,h);y[A]=c[b]}return{dataId:a.write(y,o,r.dtype),shape:o,dtype:r.dtype}}var pB={kernelName:Vi,backendName:"cpu",kernelFunc:dB},cB=Lt((e,t)=>{let a=e%t;return e<0&&t<0||e>=0&&t>=0?a:(a+t)%t}),hB=Kt(Md,cB),fB={kernelName:Md,backendName:"cpu",kernelFunc:hB},mB=hl(cA());function Y7(e){let{inputs:t,backend:a,attrs:n}=e,{logits:r}=t,{dim:s}=n,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=v.parseAxisParam([o],r.shape),u=Z7({inputs:{x:r},backend:a,attrs:{reductionIndices:l,keepDims:!1}}),d=T.expandShapeToKeepDim(u.shape,l),c=ft({inputs:{x:u},backend:a,attrs:{shape:d}}),p=A3({inputs:{a:r,b:c},backend:a}),h=l7({inputs:{x:p},backend:a}),f=lp({inputs:{x:h},backend:a,attrs:{axis:l,keepDims:!1}}),m=ft({inputs:{x:f},backend:a,attrs:{shape:d}}),g=b3({inputs:{a:h,b:m},backend:a});return a.disposeIntermediateTensorInfo(u),a.disposeIntermediateTensorInfo(c),a.disposeIntermediateTensorInfo(p),a.disposeIntermediateTensorInfo(h),a.disposeIntermediateTensorInfo(f),a.disposeIntermediateTensorInfo(m),g}var gB={kernelName:ao,backendName:"cpu",kernelFunc:Y7};function yB(e){let{inputs:t,backend:a,attrs:n}=e,{logits:r}=t,{numSamples:s,seed:i,normalized:o}=n;Ae(r,"multinomial");let l=o?r:Y7({inputs:{logits:r},backend:a,attrs:{dim:-1}}),u=l.shape[0],d=l.shape[1],c=a.data.get(l.dataId).values,p=[u,s],h=v.makeZerosTypedArray(v.sizeFromShape(p),"int32");for(let f=0;f=0&&c[p]{v.assertShapesMatch(s,d.shape,"All tensors passed to stack must have matching shapes"),v.assert(i===d.dtype,()=>"All tensors passed to stack must have matching dtypes")});let o=[],l=t.map(d=>{let c=_c({inputs:{input:d},backend:a,attrs:{dim:r}});return o.push(c),c}),u=pl({inputs:l,backend:a,attrs:{axis:r}});return o.forEach(d=>a.disposeIntermediateTensorInfo(d)),u}var $B={kernelName:Ml,backendName:"cpu",kernelFunc:Q7};function _B(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{paddings:s,constantValue:i}=n;Ae(r,"pad");let o=s.map((y,A)=>y[0]+r.shape[A]+y[1]),l=s.map(y=>y[0]),u=a.data.get(r.dataId).values,d=v.sizeFromShape(r.shape),c=r.shape.length,p=v.computeStrides(r.shape),h=v.sizeFromShape(o),f=o.length,m=v.computeStrides(o),g=v.getTypedArrayFromDType(r.dtype,h);i!==0&&g.fill(i);for(let y=0;yb+l[w]),x=v.locToIndex(A,f,m);g[x]=u[y]}return{dataId:a.write(g,o,r.dtype),shape:o,dtype:r.dtype}}var e6={kernelName:ji,backendName:"cpu",kernelFunc:_B},FB=Lt((e,t)=>Math.pow(e,t)),PB=Kt(Hi,FB),OB={kernelName:Hi,backendName:"cpu",kernelFunc:PB};function DB(e){let{inputs:t,backend:a,attrs:n}=e,{paramsNestedSplits:r,paramsDenseValues:s,indices:i}=t,{outputRaggedRank:o}=n,l=r.map(y=>a.data.get(y.dataId).values),u=r.map(y=>y.shape),d=a.data.get(s.dataId).values,c=a.data.get(i.dataId).values,[p,h,f]=S7(l,u,d,s.shape,s.dtype,c,i.shape,o),m=p.map(y=>a.makeTensorInfo([y.length],"int32",y)),g=a.makeTensorInfo(f,s.dtype,h);return m.concat([g])}var zB={kernelName:lh,backendName:"cpu",kernelFunc:DB};function LB(e){let{inputs:t,backend:a}=e,{starts:n,limits:r,deltas:s}=t,i=a.data.get(n.dataId).values,o=a.data.get(r.dataId).values,l=a.data.get(s.dataId).values,[u,d]=T7(i,n.shape,n.dtype,o,r.shape,l,s.shape),c=a.makeTensorInfo([u.length],"int32",u),p=a.makeTensorInfo([d.length],n.dtype,d);return[c,p]}var BB={kernelName:uh,backendName:"cpu",kernelFunc:LB};function WB(e){let{inputs:t,backend:a,attrs:n}=e,{shape:r,values:s,defaultValue:i,rowPartitionTensors:o}=t,{rowPartitionTypes:l}=n,u=a.data.get(r.dataId).values,d=a.data.get(s.dataId).values,c=a.data.get(i.dataId).values,p=o.map(g=>a.data.get(g.dataId).values),h=o.map(g=>g.shape),[f,m]=C7(u,r.shape,d,s.shape,s.dtype,c,i.shape,p,h,l);return a.makeTensorInfo(f,s.dtype,m)}var VB={kernelName:dh,backendName:"cpu",kernelFunc:WB};function GB(e){let{backend:t,attrs:a}=e,{start:n,stop:r,dtype:s,step:i}=a,o=h3(n,r,i,s);return t.makeTensorInfo([o.length],s,o)}var UB={kernelName:$l,backendName:"cpu",kernelFunc:GB},jB=it(_l,e=>1/e),HB={kernelName:_l,backendName:"cpu",kernelFunc:jB};function qB(e){let{inputs:t,backend:a,attrs:n}=e,{images:r}=t,{alignCorners:s,halfPixelCenters:i,size:o}=n;Ae(r,"resizeBilinear");let l=v.computeStrides(r.shape),[u,d]=o,[c,p,h,f]=r.shape,m=a.data.get(r.dataId).values,g=new Float32Array(v.sizeFromShape([c,u,d,f])),y=[s&&u>1?p-1:p,s&&d>1?h-1:h],A=[s&&u>1?u-1:u,s&&d>1?d-1:d],x=0,b=y[0]/A[0],w=y[1]/A[1];for(let S=0;S1?u-1:u,i&&h>1?d-1:d],g=[i&&p>1?p-1:p,i&&h>1?h-1:h],y=m[0]/g[0],A=m[1]/g[1],x=a.data.get(s.dataId).values,b=0;for(let w=0;w1?p-1:p,s&&d>1?h-1:h],A=[s&&u>1?u-1:u,s&&d>1?d-1:d],x=y[0]/A[0],b=y[1]/A[1],w=0;for(let S=0;S1?d-1:d,i&&f>1?c-1:c],A=[i&&h>1?h-1:h,i&&f>1?f-1:f],x=y[0]/A[0],b=y[1]/A[1],w=1/x,S=1/b,C=Math.ceil(w)*2+2,N=Math.ceil(S)*2+2;for(let _=0;_=h)continue;let Z=$+Q*l[1],re=Q*x,ee=Math.min(d-1,i?Math.round(re):Math.floor(re));if(M===ee)for(let pe=0;pe=f)continue;let ye=Z+oe*l[2],we=oe*b,Ne=Math.min(c-1,i?Math.round(we):Math.floor(we));L===Ne&&(H+=g[ye+U])}}m[B+U]=H}}}}return a.makeTensorInfo(r.shape,r.dtype,m)}var eW={kernelName:J1,backendName:"cpu",kernelFunc:QB};function tW(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{dims:s}=n;Ae(r,"reverse");let i=r.shape.length,o=v.parseAxisParam(s,r.shape);if(i===0)return er({inputs:{x:r},backend:a});let l=new Mt(r.shape,r.dtype),u=a.bufferSync(r);for(let d=0;dp[h]=r.shape[h]-1-p[h]),l.set(u.get(...p),...c)}return a.makeTensorInfo(l.shape,l.dtype,l.values)}var aW={kernelName:Pl,backendName:"cpu",kernelFunc:tW},nW={kernelName:lo,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:a})=>{let{image:n}=e,{radians:r,fillValue:s,center:i}=t,o=a,l=v.getTypedArrayFromDType(n.dtype,v.sizeFromShape(n.shape)),[u,d,c,p]=n.shape,[h,f]=T.getImageCenter(i,d,c),m=255,g=Math.sin(r),y=Math.cos(r),A=o.data.get(n.dataId).values;for(let x=0;x=0&&E=0&&O{let t=Math.floor(e);return e-t<.5?Math.floor(e):e-t>.5?Math.ceil(e):t%2===0?t:t+1}),sW={kernelName:Ol,backendName:"cpu",kernelFunc:rW};function iW(e){let{inputs:t,backend:a,attrs:n}=e,{indices:r,updates:s}=t,{shape:i}=n,{sliceRank:o,numUpdates:l,sliceSize:u,strides:d,outputSize:c}=T.calculateShapes(s,r,i),p=!0,h=a.bufferSync(r),f=a.bufferSync(s),m=Zo(h,f,i,c,u,l,o,d,0,p);return a.makeTensorInfo(i,m.dtype,m.values)}var oW={kernelName:Qi,backendName:"cpu",kernelFunc:iW};function lW(e,t){let a=0,n=e.length,r=0;for(;a1||r.shape.length===1?1:v.sizeFromShape(r.shape.slice(1));for(let f=0;fe>=0?gW*e:mW*(Math.exp(e)-1)),AW={kernelName:_d,backendName:"cpu",kernelFunc:yW},xW=it(Fd,e=>e<0?-1:e>0?1:0),bW={kernelName:Fd,backendName:"cpu",kernelFunc:xW},vW=it(eo,e=>Math.sin(e)),wW={kernelName:eo,backendName:"cpu",kernelFunc:vW},kW=it(Ll,e=>Math.sinh(e)),IW={kernelName:Ll,backendName:"cpu",kernelFunc:kW},SW=11920928955078125e-23,yy=Math.log(SW)+2,TW=it(Pd,e=>{let t=e>-yy,a=eNumber(g)))),a.makeTensorInfo([m.length],n.dtype,new Int32Array(m))]}var MW={kernelName:Od,backendName:"cpu",kernelFunc:RW};function $W(e){let{inputs:t,backend:a}=e,{inputIndices:n,inputShape:r,newShape:s}=t;if(n.shape.length!==2)throw new Error(`Input indices should be a matrix but received shape + ${n.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(a.data.get(r.dataId).values),o=a.data.get(n.dataId).values,l=Array.from(a.data.get(s.dataId).values),[u,d,c]=M7(o,n.shape,n.dtype,i,l);return[a.makeTensorInfo(d,n.dtype,u),a.makeTensorInfo([c.length],s.dtype,new Int32Array(c))]}var _W={kernelName:Vl,backendName:"cpu",kernelFunc:$W};function FW(e){let{inputs:t,backend:a}=e,{data:n,indices:r,segmentIds:s}=t;if(n.shape.length<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(r.shape.length!==1)throw new Error(`Indices should be a vector but received shape + ${r.shape}`);if(s.shape.length!==1)throw new Error(`Segment ids should be a vector but received shape + ${s.shape}`);if(r.shape[0]!==s.shape[0])throw new Error("segmentIds and indices should have same size.");let i=a.data.get(n.dataId).values,o=a.data.get(r.dataId).values,l=a.data.get(s.dataId).values,[u,d]=f3(i,n.shape,n.dtype,o,l,!0);return a.makeTensorInfo(d,n.dtype,u)}var PW={kernelName:Dd,backendName:"cpu",kernelFunc:FW};function OW(e){let{inputs:t,backend:a}=e,{data:n,indices:r,segmentIds:s}=t;if(n.shape.length<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(r.shape.length!==1)throw new Error(`Indices should be a vector but received shape + ${r.shape}`);if(s.shape.length!==1)throw new Error(`Segment ids should be a vector but received shape + ${s.shape}`);if(r.shape[0]!==s.shape[0])throw new Error("segmentIds and indices should have same size.");let i=a.data.get(n.dataId).values,o=a.data.get(r.dataId).values,l=a.data.get(s.dataId).values,[u,d]=f3(i,n.shape,n.dtype,o,l);return a.makeTensorInfo(d,n.dtype,u)}var DW={kernelName:zd,backendName:"cpu",kernelFunc:OW};function zW(e){let{inputs:t,backend:a,attrs:n}=e,{sparseIndices:r,sparseValues:s,defaultValue:i}=t,{outputShape:o}=n,{sliceRank:l,numUpdates:u,sliceSize:d,strides:c,outputSize:p}=T.calculateShapes(s,r,o),h=!1,f=a.bufferSync(r),m;switch(s.dtype){case"bool":{let g=a.bufferSync(s),y=Boolean(a.data.get(i.dataId).values[0]);m=Zo(f,g,o,p,d,u,l,c,y,h);break}case"float32":{let g=a.bufferSync(s),y=a.data.get(i.dataId).values[0];m=Zo(f,g,o,p,d,u,l,c,y,h);break}case"int32":{let g=a.bufferSync(s),y=a.data.get(i.dataId).values[0];m=Zo(f,g,o,p,d,u,l,c,y,h);break}case"string":{let g=a.bufferSync(s),y=v.decodeString(a.data.get(i.dataId).values[0]);m=Zo(f,g,o,p,d,u,l,c,y,h);break}default:throw new Error(`Unsupported type ${s.dtype}`)}return a.makeTensorInfo(o,m.dtype,m.values)}var LW={kernelName:Ld,backendName:"cpu",kernelFunc:zW};function BW(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{numOrSizeSplits:s,axis:i}=n,o=v.parseAxisParam(i,r.shape)[0],l=T.prepareSplitSize(r,s,o),u=new Array(r.shape.length).fill(0),d=r.shape.slice();return l.map(c=>{let p=[...d];p[o]=c;let h=li({inputs:{x:r},backend:a,attrs:{begin:u,size:p}});return u[o]+=c,h})}var WW={kernelName:Wl,backendName:"cpu",kernelFunc:BW},VW={kernelName:Bd,backendName:"cpu",kernelFunc:({inputs:e,backend:t})=>{let{x:a}=e,n=t;Ae(a,"square");let r=n.data.get(a.dataId).values,s=new Float32Array(r.length);for(let i=0;i{let a=t;return isNaN(e)?NaN:e>0?1:a.alpha}),UW={kernelName:oo,backendName:"cpu",kernelFunc:GW};function jW(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{begin:s,end:i,strides:o,beginMask:l,endMask:u,ellipsisMask:d,newAxisMask:c,shrinkAxisMask:p}=n;Ae(r,"stridedSlice");let{finalShapeSparse:h,finalShape:f,isIdentity:m,sliceDim0:g,isSimpleSlice:y,begin:A,end:x,strides:b}=At.sliceInfo(r.shape,s,i,o,l,u,d,c,p),w;if(m)w=ft({inputs:{x:r},backend:a,attrs:{shape:f}});else if(g||y){v.assert(r.shape.length>=1,()=>`Input must have rank at least 1, got: ${r.shape.length}`);let S=At.computeOutShape(A,x,b),C=li({inputs:{x:r},backend:a,attrs:{begin:A,size:S}});w=ft({inputs:{x:C},backend:a,attrs:{shape:f}}),a.disposeIntermediateTensorInfo(C)}else{let S=a.bufferSync(r),C=_7(h,S,b,A);w=a.makeTensorInfo(f,C.dtype,C.values)}return w}var HW={kernelName:no,backendName:"cpu",kernelFunc:jW};function qW(e){let{inputs:t,backend:a,attrs:n}=e,{separator:r,nGramWidths:s,leftPad:i,rightPad:o,padWidth:l,preserveShortSequences:u}=n,{data:d,dataSplits:c}=t,p=a.data.get(d.dataId).values,h=a.data.get(c.dataId).values,[f,m]=m3(p,h,r,s,i,o,l,u);return[a.makeTensorInfo([f.length],"string",f),a.makeTensorInfo(c.shape,"int32",m)]}var XW={kernelName:Gl,backendName:"cpu",kernelFunc:qW};function KW(e){let{inputs:t,backend:a,attrs:n}=e,{skipEmpty:r}=n,{input:s,delimiter:i}=t;if(s.dtype!=="string")throw new Error("Input must be of datatype string");if(s.shape.length!==1)throw new Error(`Input must be a vector, got shape: ${s.shape}`);if(i.shape.length!==0)throw new Error(`Delimiter must be a scalar, got shape: ${i.shape}`);let o=a.data.get(s.dataId).values,l=a.data.get(i.dataId).values[0],[u,d,c]=g3(o,l,r),p=d.length;return[a.makeTensorInfo([p,2],"int32",u),a.makeTensorInfo([p],"string",d),a.makeTensorInfo([2],"int32",new Int32Array(c))]}var ZW={kernelName:Wd,backendName:"cpu",kernelFunc:KW};function YW(e){let{inputs:t,backend:a,attrs:n}=e,{numBuckets:r}=n,{input:s}=t;if(s.dtype!=="string")throw new Error("Input must be of datatype string");if(r<=0)throw new Error("Number of buckets must be at least 1");let i=a.data.get(s.dataId).values,o=y3(i,r);return a.makeTensorInfo(s.shape,"int32",o)}var JW={kernelName:Vd,backendName:"cpu",kernelFunc:YW},QW=it(Ul,e=>Math.tan(e)),eV={kernelName:Ul,backendName:"cpu",kernelFunc:QW},tV=it(ro,e=>Math.tanh(e)),aV={kernelName:ro,backendName:"cpu",kernelFunc:tV};function nV(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{reps:s}=n;Ae(r,"tile");let i=P7(a.bufferSync(r),s);return a.makeTensorInfo(i.shape,i.dtype,i.values)}var rV={kernelName:As,backendName:"cpu",kernelFunc:nV};function sV(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{k:s,sorted:i}=n;Ae(r,"topk");let o=a.data.get(r.dataId).values,[l,u]=D7(o,r.shape,r.dtype,s,i);return[a.makeTensorInfo(l.shape,l.dtype,l.values),a.makeTensorInfo(u.shape,u.dtype,u.values)]}var iV={kernelName:so,backendName:"cpu",kernelFunc:sV};function oV(e){let{inputs:t,attrs:a,backend:n}=e,{image:r,transforms:s}=t,{interpolation:i,fillMode:o,fillValue:l,outputShape:u}=a,[d,c,p,h]=r.shape,[f,m]=u!=null?u:[c,p],g=[d,f,m,h],y=v.computeStrides(r.shape),A=y[0],x=y[1],b=y[2],w=v.computeStrides(g),S=w[0],C=w[1],N=w[2],_=v.getTypedArrayFromDType(r.dtype,v.sizeFromShape(g));_.fill(l);let $=n.data.get(r.dataId).values,M=n.data.get(s.dataId).values;for(let I=0;It-1)if(t<=1)a=0;else{let n=2*t;a-=n*Math.trunc(a/n),a>=t&&(a=n-a-1)}return v.clamp(0,a,t-1)}function dV(e,t){let a=e;if(a<0)if(t<=1)a=0;else{let n=t-1;a+=t*(Math.trunc(-a/n)+1)}else if(a>t-1)if(t<=1)a=0;else{let n=t-1;a-=t*Math.trunc(a/n)}return v.clamp(0,a,t-1)}function pV(e,t){return e}function cV(e,t){return v.clamp(0,e,t-1)}function zu(e,t,a,n,r,s,i,o,l,u,d){let c=i*n+o*r+l*s+u;return 0<=o&&oa.disposeIntermediateTensorInfo(f)),h}var bV={kernelName:hh,backendName:"cpu",kernelFunc:xV},vV=[mD,tO,yD,xD,oO,vD,kD,SD,CD,ED,MD,_D,PD,zD,BD,GD,jD,qD,KD,hD,YD,QD,tz,nz,sO,uO,sz,aO,oz,uz,dz,cz,fz,gz,Az,bz,wz,Iz,Tz,Nz,Rz,$z,Fz,Pz,Dz,Lz,Wz,Vz,Gz,Uz,qz,iD,Kz,dO,nL,pO,rL,hO,dL,pL,hL,mO,gL,AL,bL,wL,IL,yO,xO,nO,TL,lz,NL,RL,$L,oD,vO,kO,FL,SO,OL,LL,WL,UL,HL,XL,KL,CO,YL,QL,tB,nB,sB,oB,uB,EO,pB,fB,AB,MO,_O,vB,IB,CB,PO,EB,MB,$B,e6,OB,uD,zO,zB,BB,VB,UB,rO,x1,HB,dD,pD,cD,XB,ZB,JB,eW,aW,nW,sW,HO,oW,cW,fW,AW,XO,bW,wW,IW,KO,gB,CW,EW,MW,_W,PW,DW,LW,WW,JO,VW,eD,UW,HW,XW,ZW,JW,rD,jz,eV,aV,rV,iV,lV,OO,gV,AV,bV,RB];for(let e of vV)hn(e);var t6={};He(t6,{assertNotComplex:()=>Jl,bindCanvasToFramebuffer:()=>$V,bindColorTextureToFramebuffer:()=>mc,bindTextureToProgramUniformSampler:()=>g6,bindTextureUnit:()=>h6,bindVertexBufferToProgramAttribute:()=>v1,callAndCheck:()=>ce,canBeRepresented:()=>a6,createFragmentShader:()=>s6,createFramebuffer:()=>c6,createProgram:()=>i6,createStaticIndexBuffer:()=>u6,createStaticVertexBuffer:()=>l6,createTexture:()=>d6,createVertexShader:()=>r6,getBatchDim:()=>ui,getExtensionOrThrow:()=>Lu,getFramebufferErrorMessage:()=>y6,getMaxTexturesInShader:()=>v6,getNumChannels:()=>RV,getProgramUniformLocation:()=>m6,getProgramUniformLocationOrThrow:()=>f6,getRowsCols:()=>di,getShapeAs3D:()=>Wu,getTextureShapeFromLogicalShape:()=>x6,getWebGLDisjointQueryTimerVersion:()=>w6,getWebGLErrorMessage:()=>n6,getWebGLMaxTextureSize:()=>b6,hasExtension:()=>dn,isCapableOfRenderingToFloatTexture:()=>k6,isDownloadFloatTextureEnabled:()=>I6,isReshapeFree:()=>ld,isWebGLFenceEnabled:()=>S6,isWebGLVersionEnabled:()=>k1,linkProgram:()=>o6,logShaderSourceAndInfoLog:()=>k3,resetMaxTextureSize:()=>_V,resetMaxTexturesInShader:()=>FV,unbindColorTextureFromFramebuffer:()=>w1,unbindTextureUnit:()=>MV,validateFramebuffer:()=>Bu,validateProgram:()=>fc,validateTextureSize:()=>p6});var Zs={},ic={alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!0};function Dh(e,t){Zs[e]=t}function Dn(e,t){if(!(e in Zs)||t!=null){let n=kV(e,t);if(n!==null)Zs[e]=n;else return console.log("Could not get context for WebGL version",e),null}let a=Zs[e];return a==null||a.isContextLost()?(delete Zs[e],Dn(e)):(a.disable(a.DEPTH_TEST),a.disable(a.STENCIL_TEST),a.disable(a.BLEND),a.disable(a.DITHER),a.disable(a.POLYGON_OFFSET_FILL),a.disable(a.SAMPLE_COVERAGE),a.enable(a.SCISSOR_TEST),a.enable(a.CULL_FACE),a.cullFace(a.BACK),Zs[e])}function wV(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 kV(e,t){if(e!==1&&e!==2)throw new Error("Cannot get WebGL rendering context, WebGL is disabled.");let a=t==null?wV(e):t;return a.addEventListener("webglcontextlost",n=>{n.preventDefault(),delete Zs[e]},!1),V().getBool("SOFTWARE_WEBGL_ENABLED")&&(ic.failIfMajorPerformanceCaveat=!1),e===1?a.getContext("webgl",ic)||a.getContext("experimental-webgl",ic):a.getContext("webgl2",ic)}var od;(function(e){e[e.DENSE=0]="DENSE",e[e.SHARED_BATCH=1]="SHARED_BATCH"})(od||(od={}));var un;(function(e){e[e.RENDER=0]="RENDER",e[e.UPLOAD=1]="UPLOAD",e[e.PIXELS=2]="PIXELS",e[e.DOWNLOAD=3]="DOWNLOAD"})(un||(un={}));var aa;(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"})(aa||(aa={}));function up(e,t){return[t,e]}function IV(e,t){return e*t}function oc(e){let t=v.sizeFromShape(e),a=Math.ceil(t/4);return v.sizeToSquarishShape(a)}function Yl(e,t){return[Math.max(1,Math.ceil(t/2)),Math.max(1,Math.ceil(e/2))]}function SV(e,t){let[a,n]=Yl(e,t);return a*n*4}function w3(e,t){let a=e,n,r,s,i,o,l,u,d,c,p;return V().getNumber("WEBGL_VERSION")===2?(n=a.R32F,r=a.R16F,s=a.RGBA16F,i=a.RGBA32F,o=a.RED,u=4,d=1,c=a.HALF_FLOAT,p=a.FLOAT,l=a.RGBA8):(n=e.RGBA,r=e.RGBA,s=e.RGBA,i=a.RGBA,o=e.RGBA,u=4,d=4,c=t!=null?t.HALF_FLOAT_OES:null,p=e.FLOAT,l=e.RGBA),{internalFormatFloat:n,internalFormatHalfFloat:r,internalFormatPackedHalfFloat:s,internalFormatPackedFloat:i,textureFormatFloat:o,downloadTextureFormat:l,downloadUnpackNumChannels:u,defaultNumChannels:d,textureTypeHalfFloat:c,textureTypeFloat:p}}function ce(e,t){let a=t();return V().getBool("DEBUG")&&TV(e),a}function TV(e){let t=e.getError();if(t!==e.NO_ERROR)throw new Error("WebGL Error: "+n6(e,t))}var CV=596e-10,NV=65504;function a6(e){return!!(V().getBool("WEBGL_RENDER_FLOAT32_ENABLED")||e===0||CVe.getExtension(t),'Extension "'+t+'" not supported on this browser.')}function r6(e,t){let a=Sr(e,()=>e.createShader(e.VERTEX_SHADER),"Unable to create vertex WebGLShader.");if(ce(e,()=>e.shaderSource(a,t)),ce(e,()=>e.compileShader(a)),e.getShaderParameter(a,e.COMPILE_STATUS)===!1)throw console.log(e.getShaderInfoLog(a)),new Error("Failed to compile vertex shader.");return a}function s6(e,t){let a=Sr(e,()=>e.createShader(e.FRAGMENT_SHADER),"Unable to create fragment WebGLShader.");if(ce(e,()=>e.shaderSource(a,t)),ce(e,()=>e.compileShader(a)),V().get("ENGINE_COMPILE_ONLY"))return a;if(e.getShaderParameter(a,e.COMPILE_STATUS)===!1)throw k3(t,e.getShaderInfoLog(a)),new Error("Failed to compile fragment shader.");return a}var EV=/ERROR: [0-9]+:([0-9]+):/g;function k3(e,t){let a=EV.exec(t);if(a==null){console.log(`Couldn't parse line number in error: ${t}`),console.log(e);return}let n=+a[1],r=e.split(` +`),s=r.length.toString().length+2,i=r.map((c,p)=>v.rightPad((p+1).toString(),s)+c),o=0;for(let c=0;ce.createProgram(),"Unable to create WebGLProgram.")}function o6(e,t){if(ce(e,()=>e.linkProgram(t)),!V().get("ENGINE_COMPILE_ONLY")&&e.getProgramParameter(t,e.LINK_STATUS)===!1)throw console.log(e.getProgramInfoLog(t)),new Error("Failed to link vertex and fragment shaders.")}function fc(e,t){if(ce(e,()=>e.validateProgram(t)),e.getProgramParameter(t,e.VALIDATE_STATUS)===!1)throw console.log(e.getProgramInfoLog(t)),new Error("Shader program validation failed.")}function l6(e,t){let a=Sr(e,()=>e.createBuffer(),"Unable to create WebGLBuffer");return ce(e,()=>e.bindBuffer(e.ARRAY_BUFFER,a)),ce(e,()=>e.bufferData(e.ARRAY_BUFFER,t,e.STATIC_DRAW)),a}function u6(e,t){let a=Sr(e,()=>e.createBuffer(),"Unable to create WebGLBuffer");return ce(e,()=>e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,a)),ce(e,()=>e.bufferData(e.ELEMENT_ARRAY_BUFFER,t,e.STATIC_DRAW)),a}function RV(){return V().getNumber("WEBGL_VERSION")===2?1:4}function d6(e){return Sr(e,()=>e.createTexture(),"Unable to create WebGLTexture.")}function p6(e,t){let a=V().getNumber("WEBGL_MAX_TEXTURE_SIZE");if(e<=0||t<=0){let n=`[${e}x${t}]`;throw new Error("Requested texture size "+n+" is invalid.")}if(e>a||t>a){let n=`[${e}x${t}]`,r=`[${a}x${a}]`;throw new Error("Requested texture size "+n+" greater than WebGL maximum on this browser / GPU "+r+".")}}function c6(e){return Sr(e,()=>e.createFramebuffer(),"Unable to create WebGLFramebuffer.")}function v1(e,t,a,n,r,s,i){let o=e.getAttribLocation(t,a);return o===-1?!1:(ce(e,()=>e.bindBuffer(e.ARRAY_BUFFER,n)),ce(e,()=>e.vertexAttribPointer(o,r,e.FLOAT,!1,s,i)),ce(e,()=>e.enableVertexAttribArray(o)),!0)}function h6(e,t,a){A6(e,a),ce(e,()=>e.activeTexture(e.TEXTURE0+a)),ce(e,()=>e.bindTexture(e.TEXTURE_2D,t))}function MV(e,t){A6(e,t),ce(e,()=>e.activeTexture(e.TEXTURE0+t)),ce(e,()=>e.bindTexture(e.TEXTURE_2D,null))}function f6(e,t,a){return Sr(e,()=>e.getUniformLocation(t,a),'uniform "'+a+'" not present in program.')}function m6(e,t,a){return e.getUniformLocation(t,a)}function g6(e,t,a,n){ce(e,()=>h6(e,t,n)),ce(e,()=>e.uniform1i(a,n))}function $V(e){ce(e,()=>e.bindFramebuffer(e.FRAMEBUFFER,null)),ce(e,()=>e.viewport(0,0,e.canvas.width,e.canvas.height)),ce(e,()=>e.scissor(0,0,e.canvas.width,e.canvas.height))}function mc(e,t,a){ce(e,()=>e.bindFramebuffer(e.FRAMEBUFFER,a)),ce(e,()=>e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t,0))}function w1(e,t){ce(e,()=>e.bindFramebuffer(e.FRAMEBUFFER,t)),ce(e,()=>e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,null,0))}function Bu(e){let t=e.checkFramebufferStatus(e.FRAMEBUFFER);if(t!==e.FRAMEBUFFER_COMPLETE)throw new Error("Error binding framebuffer: "+y6(e,t))}function y6(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 Sr(e,t,a){let n=ce(e,()=>t());if(n==null)throw new Error(a);return n}function A6(e,t){let a=e.MAX_COMBINED_TEXTURE_IMAGE_UNITS-1,n=t+e.TEXTURE0;if(na){let r=`[gl.TEXTURE0, gl.TEXTURE${a}]`;throw new Error(`textureUnit must be in ${r}.`)}}function ui(e,t=2){return v.sizeFromShape(e.slice(0,e.length-t))}function di(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 Wu(e){let t=[1,1,1];return e.length===0||e.length===1&&e[0]===1||(t=[ui(e),...di(e)]),t}function x6(e,t=!1){let a=V().getNumber("WEBGL_MAX_TEXTURE_SIZE"),n=V().getNumber("WEBGL_MAX_SIZE_FOR_NARROW_TEXTURE");n===1/0&&V().getBool("WEBGL_AUTO_SQUARIFY_NARROW_TEXTURE_SHAPE")&&(n=a/2),t&&(a=a*2,n=n*2,e=e.map((o,l)=>l>=e.length-2?v.nearestLargerEven(e[l]):e[l]),e.length===1&&(e=[2,e[0]])),e.length!==2&&(e=v.squeezeShape(e).newShape);let r=v.sizeFromShape(e),s=null;e.length<=1&&r<=a?s=[1,r]:e.length===2&&e[0]<=a&&e[1]<=a?s=e:e.length===3&&e[0]*e[1]<=a&&e[2]<=a?s=[e[0]*e[1],e[2]]:e.length===3&&e[0]<=a&&e[1]*e[2]<=a?s=[e[0],e[1]*e[2]]:e.length===4&&e[0]*e[1]*e[2]<=a&&e[3]<=a?s=[e[0]*e[1]*e[2],e[3]]:e.length===4&&e[0]<=a&&e[1]*e[2]*e[3]<=a&&(s=[e[0],e[1]*e[2]*e[3]]);let i=s!=null&&Math.max(...s)>n&&Math.min(...s)<=(t?2:1)&&Math.min(...s)>0;if(s==null||i)if(t){let o=ui(e),l=2,u=2;e.length&&([l,u]=di(e)),r=o*(l/2)*(u/2),s=v.sizeToSquarishShape(r).map(d=>d*2)}else s=v.sizeToSquarishShape(r);return s}function lc(e){return e%2===0}function ld(e,t){if(e=e.slice(-2),t=t.slice(-2),v.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 a=e.slice(-1)[0],n=t.slice(-1)[0];if(a===n||lc(a)&&lc(n)&&(e[0]===1||t[0]===1))return!0}return e[1]===t[1]&&lc(e[0])&&lc(t[0])}var gc,yc;function b6(e){if(gc==null){let t=Dn(e);gc=t.getParameter(t.MAX_TEXTURE_SIZE)}return gc}function _V(){gc=null}function FV(){yc=null}function v6(e){if(yc==null){let t=Dn(e);yc=t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS)}return Math.min(16,yc)}function w6(e){if(e===0)return 0;let t,a=Dn(e);return dn(a,"EXT_disjoint_timer_query_webgl2")&&e===2?t=2:dn(a,"EXT_disjoint_timer_query")?t=1:t=0,t}function dn(e,t){return e.getExtension(t)!=null}function k1(e){try{if(Dn(e)!=null)return!0}catch(t){return console.log("Error when getting WebGL context: ",t),!1}return!1}function k6(e){if(e===0)return!1;let t=Dn(e);if(e===1){if(!dn(t,"OES_texture_float"))return!1}else if(!dn(t,"EXT_color_buffer_float"))return!1;return I1(t)}function I6(e){if(e===0)return!1;let t=Dn(e);if(e===1){if(!dn(t,"OES_texture_float")||!dn(t,"WEBGL_color_buffer_float"))return!1}else{if(dn(t,"EXT_color_buffer_float"))return I1(t);let a="EXT_color_buffer_half_float";if(dn(t,a)){let n=t.getExtension(a);return PV(t,n)}return!1}return I1(t)}function I1(e){let t=w3(e),a=e.createTexture();e.bindTexture(e.TEXTURE_2D,a);let n=1,r=1;e.texImage2D(e.TEXTURE_2D,0,t.internalFormatFloat,n,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,a,0);let i=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindTexture(e.TEXTURE_2D,null),e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteTexture(a),e.deleteFramebuffer(s),i}function PV(e,t){let a=w3(e,t),n=e.createTexture();e.bindTexture(e.TEXTURE_2D,n);let r=1,s=1;e.texImage2D(e.TEXTURE_2D,0,a.internalFormatHalfFloat,r,s,0,a.textureFormatFloat,a.textureTypeHalfFloat,null);let i=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,i),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,n,0);let o=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindTexture(e.TEXTURE_2D,null),e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteTexture(n),e.deleteFramebuffer(i),o}function S6(e){return e!==2?!1:Dn(e).fenceSync!=null}function Jl(e,t){Array.isArray(e)||(e=[e]),e.forEach(a=>{a!=null&&v.assert(a.dtype!=="complex64",()=>`${t} does not support complex64 tensors in the WebGL backend.`)})}var be=V();be.registerFlag("HAS_WEBGL",()=>be.getNumber("WEBGL_VERSION")>0);be.registerFlag("WEBGL_VERSION",()=>k1(2)?2:k1(1)?1:0);be.registerFlag("WEBGL_CHECK_NUMERICAL_PROBLEMS",()=>!1);be.registerFlag("WEBGL_BUFFER_SUPPORTED",()=>be.get("WEBGL_VERSION")===2);be.registerFlag("WEBGL_CPU_FORWARD",()=>!0);be.registerFlag("WEBGL_FORCE_F16_TEXTURES",()=>!1);be.registerFlag("WEBGL_PACK",()=>be.getBool("HAS_WEBGL"));be.registerFlag("WEBGL_PACK_NORMALIZATION",()=>be.getBool("WEBGL_PACK"));be.registerFlag("WEBGL_PACK_CLIP",()=>be.getBool("WEBGL_PACK"));be.registerFlag("WEBGL_PACK_DEPTHWISECONV",()=>be.getBool("WEBGL_PACK"));be.registerFlag("WEBGL_PACK_BINARY_OPERATIONS",()=>be.getBool("WEBGL_PACK"));be.registerFlag("WEBGL_PACK_UNARY_OPERATIONS",()=>be.getBool("WEBGL_PACK"));be.registerFlag("WEBGL_PACK_ARRAY_OPERATIONS",()=>be.getBool("WEBGL_PACK"));be.registerFlag("WEBGL_PACK_IMAGE_OPERATIONS",()=>be.getBool("WEBGL_PACK"));be.registerFlag("WEBGL_PACK_REDUCE",()=>be.getBool("WEBGL_PACK"));be.registerFlag("WEBGL_LAZILY_UNPACK",()=>be.getBool("WEBGL_PACK"));be.registerFlag("WEBGL_CONV_IM2COL",()=>be.getBool("WEBGL_PACK"));be.registerFlag("WEBGL_MAX_TEXTURE_SIZE",()=>b6(be.getNumber("WEBGL_VERSION")));be.registerFlag("WEBGL_MAX_TEXTURES_IN_SHADER",()=>v6(be.getNumber("WEBGL_VERSION")));be.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION",()=>{let e=be.getNumber("WEBGL_VERSION");return e===0?0:w6(e)});be.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE",()=>be.getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0&&!Hd.isMobile());be.registerFlag("WEBGL_RENDER_FLOAT32_CAPABLE",()=>k6(be.getNumber("WEBGL_VERSION")));be.registerFlag("WEBGL_RENDER_FLOAT32_ENABLED",()=>be.getBool("WEBGL_FORCE_F16_TEXTURES")?!1:be.getBool("WEBGL_RENDER_FLOAT32_CAPABLE"));be.registerFlag("WEBGL_DOWNLOAD_FLOAT_ENABLED",()=>I6(be.getNumber("WEBGL_VERSION")));be.registerFlag("WEBGL_FENCE_API_ENABLED",()=>S6(be.getNumber("WEBGL_VERSION")));be.registerFlag("WEBGL_SIZE_UPLOAD_UNIFORM",()=>be.getBool("WEBGL_RENDER_FLOAT32_ENABLED")?4:0);be.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}.`)});be.registerFlag("WEBGL_FLUSH_THRESHOLD",()=>Hd.isMobile()?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}.`)});be.registerFlag("CPU_HANDOFF_SIZE_THRESHOLD",()=>128);be.registerFlag("WEBGL_USE_SHAPES_UNIFORMS",()=>!1);be.registerFlag("TOPK_LAST_DIM_CPU_HANDOFF_SIZE_THRESHOLD",()=>1e5);be.registerFlag("TOPK_K_CPU_HANDOFF_THRESHOLD",()=>128);be.registerFlag("WEBGL_EXP_CONV",()=>!1);be.registerFlag("SOFTWARE_WEBGL_ENABLED",()=>be.getBool("IS_TEST"));be.registerFlag("WEBGL_MAX_SIZE_FOR_NARROW_TEXTURE",()=>1/0);be.registerFlag("WEBGL_AUTO_SQUARIFY_NARROW_TEXTURE_SHAPE",()=>!1);be.registerFlag("WEBGL2_ISNAN_CUSTOM",()=>!1);function Ca(){let e,t,a,n,r,s,i,o,l,u;return V().getNumber("WEBGL_VERSION")===2?(e="#version 300 es",t="in",a="out",n="in",r="texture",s="outputColor",i="out vec4 outputColor;",o=V().getBool("WEBGL2_ISNAN_CUSTOM")?` + bool isnan_custom(float val) { + uint floatToUint = floatBitsToUint(val); + return (floatToUint & 0x7fffffffu) > 0x7f800000u; + } + + bvec4 isnan_custom(vec4 val) { + return bvec4(isnan_custom(val.x), + isnan_custom(val.y), isnan_custom(val.z), isnan_custom(val.w)); + } + + #define isnan(value) isnan_custom(value) + `:"",l="",u=` + #define round(value) newRound(value) + int newRound(float value) { + return int(floor(value + 0.5)); + } + + ivec4 newRound(vec4 value) { + return ivec4(floor(value + vec4(0.5))); + } + `):(e="",t="attribute",a="varying",n="varying",r="texture2D",s="gl_FragColor",i="",o=` + #define isnan(value) isnan_custom(value) + bool isnan_custom(float val) { + return (val > 0. || val < 1. || val == 0.) ? false : true; + } + bvec4 isnan_custom(vec4 val) { + return bvec4(isnan(val.x), isnan(val.y), isnan(val.z), isnan(val.w)); + } + `,l=` + uniform float INFINITY; + + bool isinf(float val) { + return abs(val) == INFINITY; + } + bvec4 isinf(vec4 val) { + return equal(abs(val), vec4(INFINITY)); + } + `,u=` + int round(float value) { + return int(floor(value + 0.5)); + } + + ivec4 round(vec4 value) { + return ivec4(floor(value + vec4(0.5))); + } + `),{version:e,attribute:t,varyingVs:a,varyingFs:n,texture2D:r,output:s,defineOutput:i,defineSpecialNaN:o,defineSpecialInf:l,defineRound:u}}function co(e,t,a="index"){let n=v.computeStrides(t);return n.map((r,s)=>{let i=`int ${e[s]} = ${a} / ${r}`,o=s===n.length-1?`int ${e[s+1]} = ${a} - ${e[s]} * ${r}`:`index -= ${e[s]} * ${r}`;return`${i}; ${o};`}).join("")}function zh(e,t,a="index"){let n=v.computeStrides(t);return n.map((r,s)=>{let i=`int ${e[s]} = ${a} / outShapeStrides[${s}]`,o=s===n.length-1?`int ${e[s+1]} = ${a} - ${e[s]} * outShapeStrides[${s}]`:`index -= ${e[s]} * outShapeStrides[${s}]`;return`${i}; ${o};`}).join("")}function OV(e,t){let a=e.length,n=e.map(s=>`${t}[${s}]`),r=new Array(a-1);r[a-2]=n[a-1];for(let s=a-3;s>=0;--s)r[s]=`(${r[s+1]} * ${n[s+1]})`;return r}function DV(e,t,a="index"){let n=e.map((s,i)=>i),r=OV(n,t);return r.map((s,i)=>{let o=`int ${e[i]} = ${a} / ${r[i]}`,l=i===r.length-1?`int ${e[i+1]} = ${a} - ${e[i]} * ${r[i]}`:`index -= ${e[i]} * ${r[i]}`;return`${o}; ${l};`}).join("")}function I3(e){let t=v.computeStrides(e).map(a=>a.toString());return` + int getFlatIndex(ivec3 coords) { + return coords.x * ${t[0]} + coords.y * ${t[1]} + coords.z; + } +`}function S3(){return` + int getFlatIndex(ivec3 coords) { + return coords.x * outShapeStrides[0] + coords.y * outShapeStrides[1] + coords.z; + } +`}var T6=` + const float FLOAT_MAX = 1.70141184e38; + const float FLOAT_MIN = 1.17549435e-38; + + lowp vec4 encode_float(highp float v) { + if (isnan(v)) { + return vec4(255, 255, 255, 255); + } + + highp float av = abs(v); + + if(av < FLOAT_MIN) { + return vec4(0.0, 0.0, 0.0, 0.0); + } else if(v > FLOAT_MAX) { + return vec4(0.0, 0.0, 128.0, 127.0) / 255.0; + } else if(v < -FLOAT_MAX) { + return vec4(0.0, 0.0, 128.0, 255.0) / 255.0; + } + + highp vec4 c = vec4(0,0,0,0); + + highp float e = floor(log2(av)); + highp float m = exp2(fract(log2(av))) - 1.0; + + c[2] = floor(128.0 * m); + m -= c[2] / 128.0; + c[1] = floor(32768.0 * m); + m -= c[1] / 32768.0; + c[0] = floor(8388608.0 * m); + + highp float ebias = e + 127.0; + c[3] = floor(ebias / 2.0); + ebias -= c[3] * 2.0; + c[2] += floor(ebias) * 128.0; + + c[3] += 128.0 * step(0.0, -v); + + return c / 255.0; + } +`,{getBroadcastDims:C6}=T;function zV(e,t,a){let n=[];if(e.forEach(p=>{let h=v.sizeFromShape(p.shapeInfo.logicalShape);if(p.shapeInfo.isUniform?n.push(`uniform float ${p.name}${h>1?`[${h}]`:""};`):(n.push(`uniform sampler2D ${p.name};`),n.push(`uniform int offset${p.name};`)),a.enableShapeUniforms){let{uniformShape:f}=T3(a.packedInputs,p.shapeInfo.logicalShape,p.shapeInfo.texShape);switch(f.length){case 1:n.push(`uniform int ${p.name}Shape;`);break;case 2:n.push(`uniform ivec2 ${p.name}Shape;`);break;case 3:n.push(`uniform ivec3 ${p.name}Shape;`);break;case 4:n.push(`uniform ivec4 ${p.name}Shape;`);break;default:break}n.push(`uniform ivec2 ${p.name}TexShape;`)}}),a.enableShapeUniforms){switch(t.logicalShape.length){case 1:n.push("uniform int outShape;");break;case 2:n.push("uniform ivec2 outShape;"),n.push("uniform int outShapeStrides;");break;case 3:n.push("uniform ivec3 outShape;"),n.push("uniform ivec2 outShapeStrides;");break;case 4:n.push("uniform ivec4 outShape;"),n.push("uniform ivec3 outShapeStrides;");break;default:break}n.push("uniform ivec2 outTexShape;")}a.customUniforms&&a.customUniforms.forEach(p=>{n.push(`uniform ${p.type} ${p.name}${p.arrayIndex?`[${p.arrayIndex}]`:""};`)});let r=n.join(` +`),s=e.map(p=>LV(p,t,a.packedInputs,a.enableShapeUniforms)).join(` +`),i=t.texShape,o=Ca(),l=VV(o),u,d,c=jV(o);return t.isPacked?(u=BV(t.logicalShape,i,a.enableShapeUniforms),d=UV(o)):(u=WV(t.logicalShape,i,a.enableShapeUniforms),d=GV(o)),a.packedInputs&&(c+=KV),[c,l,d,r,u,s,a.userCode].join(` +`)}function Ql(e,t=!1){let a=e.shapeInfo.logicalShape;switch(a.length){case 0:return oG(e,t);case 1:return uG(e,t);case 2:return pG(e,t);case 3:return hG(e,t);case 4:return mG(e,t);case 5:return gG(e);case 6:return yG(e);default:throw new Error(`${a.length}-D input sampling is not yet supported`)}}function N6(e,t){switch(e.shapeInfo.logicalShape.length){case 0:return iG(e);case 1:return lG(e,t);case 2:return dG(e,t);case 3:return cG(e,t);default:return fG(e,t)}}function LV(e,t,a=!1,n){let r="";a?r+=N6(e,n):r+=Ql(e,n);let s=e.shapeInfo.logicalShape,i=t.logicalShape;return s.length<=i.length&&(a?r+=AG(e,t):r+=xG(e,t)),r}function BV(e,t,a){switch(e.length){case 0:return E6();case 1:return ZV(e,t,a);case 2:return rG(e,t,a);case 3:return JV(e,t,a);default:return eG(e,t,a)}}function WV(e,t,a){switch(e.length){case 0:return E6();case 1:return YV(e,t,a);case 2:return sG(e,t,a);case 3:return QV(e,t,a);case 4:return tG(e,t,a);case 5:return aG(e,t);case 6:return nG(e,t);default:throw new Error(`${e.length}-D output sampling is not yet supported`)}}function VV(e){return` + float sampleTexture(sampler2D textureSampler, vec2 uv) { + return ${e.texture2D}(textureSampler, uv).r; + } + `}function GV(e){return` + void setOutput(float val) { + ${e.output} = vec4(val, 0, 0, 0); + } + `}function UV(e){return` + void setOutput(vec4 val) { + ${e.output} = val; + } + `}function jV(e){return`${e.version} + precision highp float; + precision highp int; + precision highp sampler2D; + ${e.varyingFs} vec2 resultUV; + ${e.defineOutput} + const vec2 halfCR = vec2(0.5, 0.5); + + struct ivec5 + { + int x; + int y; + int z; + int w; + int u; + }; + + struct ivec6 + { + int x; + int y; + int z; + int w; + int u; + int v; + }; + + uniform float NAN; + ${e.defineSpecialNaN} + ${e.defineSpecialInf} + ${e.defineRound} + + int imod(int x, int y) { + return x - y * (x / y); + } + + int idiv(int a, int b, float sign) { + int res = a / b; + int mod = imod(a, b); + if (sign < 0. && mod != 0) { + res -= 1; + } + return res; + } + + //Based on the work of Dave Hoskins + //https://www.shadertoy.com/view/4djSRW + #define HASHSCALE1 443.8975 + float random(float seed){ + vec2 p = resultUV * seed; + vec3 p3 = fract(vec3(p.xyx) * HASHSCALE1); + p3 += dot(p3, p3.yzx + 19.19); + return fract((p3.x + p3.y) * p3.z); + } + + ${HV} + ${qV} + ${XV} + `}var HV=` +vec2 uvFromFlat(int texNumR, int texNumC, int index) { + int texR = index / texNumC; + int texC = index - texR * texNumC; + return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR); +} +vec2 packedUVfrom1D(int texNumR, int texNumC, int index) { + int texelIndex = index / 2; + int texR = texelIndex / texNumC; + int texC = texelIndex - texR * texNumC; + return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR); +} +`,qV=` +vec2 packedUVfrom2D(int texelsInLogicalRow, int texNumR, + int texNumC, int row, int col) { + int texelIndex = (row / 2) * texelsInLogicalRow + (col / 2); + int texR = texelIndex / texNumC; + int texC = texelIndex - texR * texNumC; + return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR); +} +`,XV=` +vec2 packedUVfrom3D(int texNumR, int texNumC, + int texelsInBatch, int texelsInLogicalRow, int b, + int row, int col) { + int index = b * texelsInBatch + (row / 2) * texelsInLogicalRow + (col / 2); + int texR = index / texNumC; + int texC = index - texR * texNumC; + return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR); +} +`,KV=` + float getChannel(vec4 frag, vec2 innerDims) { + vec2 modCoord = mod(innerDims, 2.); + return modCoord.x == 0. ? + (modCoord.y == 0. ? frag.r : frag.g) : + (modCoord.y == 0. ? frag.b : frag.a); + } + float getChannel(vec4 frag, int dim) { + float modCoord = mod(float(dim), 2.); + return modCoord == 0. ? frag.r : frag.g; + } +`;function E6(){return` + int getOutputCoords() { + return 0; + } + `}function ZV(e,t,a){let n=[Math.ceil(t[0]/2),Math.ceil(t[1]/2)];return n[0]===1?a?` + int getOutputCoords() { + return 2 * int(resultUV.x * ceil(float(outTexShape[1]) / 2.0)); + } + `:` + int getOutputCoords() { + return 2 * int(resultUV.x * ${n[1]}.0); + } + `:n[1]===1?a?` + int getOutputCoords() { + return 2 * int(resultUV.y * ceil(float(outTexShape[0]) / 2.0)); + } + `:` + int getOutputCoords() { + return 2 * int(resultUV.y * ${n[0]}.0); + } + `:a?` + int getOutputCoords() { + ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0)); + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(packedTexShape[0], packedTexShape[1])); + return 2 * (resTexRC.x * packedTexShape[1] + resTexRC.y); + } + `:` + int getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${n[0]}, ${n[1]})); + return 2 * (resTexRC.x * ${n[1]} + resTexRC.y); + } + `}function YV(e,t,a){return t[0]===1?a?` + int getOutputCoords() { + return int(resultUV.x * float(outTexShape[1])); + } + `:` + int getOutputCoords() { + return int(resultUV.x * ${t[1]}.0); + } + `:t[1]===1?a?` + int getOutputCoords() { + return int(resultUV.y * float(outTexShape[0])); + } + `:` + int getOutputCoords() { + return int(resultUV.y * ${t[0]}.0); + } + `:a?` + int getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(outTexShape[0], outTexShape[1])); + return resTexRC.x * outTexShape[1] + resTexRC.y; + } + `:` + int getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${t[0]}, ${t[1]})); + return resTexRC.x * ${t[1]} + resTexRC.y; + } + `}function JV(e,t,a){if(a)return` + ivec3 getOutputCoords() { + ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0)); + int texelsInLogicalRow = int(ceil(float(outShape[2]) / 2.0)); + int texelsInBatch = texelsInLogicalRow * int(ceil(float(outShape[1]) / 2.0)); + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(packedTexShape[0], packedTexShape[1])); + int index = resTexRC.x * packedTexShape[1] + resTexRC.y; + + int b = index / texelsInBatch; + index -= b * texelsInBatch; + + int r = 2 * (index / texelsInLogicalRow); + int c = imod(index, texelsInLogicalRow) * 2; + + return ivec3(b, r, c); + } + `;let n=[Math.ceil(t[0]/2),Math.ceil(t[1]/2)],r=Math.ceil(e[2]/2),s=r*Math.ceil(e[1]/2);return` + ivec3 getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${n[0]}, ${n[1]})); + int index = resTexRC.x * ${n[1]} + resTexRC.y; + + int b = index / ${s}; + index -= b * ${s}; + + int r = 2 * (index / ${r}); + int c = imod(index, ${r}) * 2; + + return ivec3(b, r, c); + } + `}function QV(e,t,a){if(a)return` + ivec3 getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(outTexShape[0], outTexShape[1])); + int index = resTexRC.x * outTexShape[1] + resTexRC.y; + ${zh(["r","c","d"],e)} + return ivec3(r, c, d); + } +`;let n=co(["r","c","d"],e);return` + ivec3 getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${t[0]}, ${t[1]})); + int index = resTexRC.x * ${t[1]} + resTexRC.y; + ${n} + return ivec3(r, c, d); + } + `}function eG(e,t,a){if(a)return` + ivec4 getOutputCoords() { + ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0)); + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(packedTexShape[0], packedTexShape[1])); + int index = resTexRC.x * packedTexShape[1] + resTexRC.y; + + int texelsInLogicalRow = int(ceil(float(outShape[3]) / 2.0)); + int texelsInBatch = texelsInLogicalRow * int(ceil(float(outShape[2]) / 2.0)); + int texelsInBatchN = texelsInBatch * outShape[1]; + + int b2 = index / texelsInBatchN; + index -= b2 * texelsInBatchN; + + int b = index / texelsInBatch; + index -= b * texelsInBatch; + + int r = 2 * (index / texelsInLogicalRow); + int c = imod(index, texelsInLogicalRow) * 2; + + return ivec4(b2, b, r, c); + } + `;let n=[Math.ceil(t[0]/2),Math.ceil(t[1]/2)],r=Math.ceil(e[e.length-1]/2),s=r*Math.ceil(e[e.length-2]/2),i=s,o="",l="b, r, c";for(let u=2;u=1?d="coords = 0;":d=o.map(g=>`coords.${c[g+u]} = 0;`).join(` +`);let p="";i<2&&s>0?p="coords":p=e.shapeInfo.logicalShape.map((g,y)=>`coords.${c[y+u]}`).join(", ");let h="return outputValue;",f=v.sizeFromShape(e.shapeInfo.logicalShape)===1,m=v.sizeFromShape(t.logicalShape)===1;if(s===1&&!f&&!m)h=` + return vec4(outputValue.xy, outputValue.xy); + `;else if(f&&!m)i===1?h=` + return vec4(outputValue.x, outputValue.x, 0., 0.); + `:h=` + return vec4(outputValue.x); + `;else if(o.length){let g=s-2,y=s-1;o.indexOf(g)>-1&&o.indexOf(y)>-1?h="return vec4(outputValue.x);":o.indexOf(g)>-1?h="return vec4(outputValue.x, outputValue.y, outputValue.x, outputValue.y);":o.indexOf(y)>-1&&(h="return vec4(outputValue.xx, outputValue.zz);")}return` + vec4 ${r}() { + ${l} coords = getOutputCoords(); + ${d} + vec4 outputValue = get${n}(${p}); + ${h} + } + `}function xG(e,t){let a=e.name,n=a.charAt(0).toUpperCase()+a.slice(1),r="get"+n+"AtOutCoords",s=t.texShape,i=e.shapeInfo.texShape,o=e.shapeInfo.logicalShape.length,l=t.logicalShape.length;if(!e.shapeInfo.isUniform&&o===l&&e.shapeInfo.flatOffset==null&&v.arraysEqual(i,s))return` + float ${r}() { + return sampleTexture(${a}, resultUV); + } + `;let u=mt(l),d=C6(e.shapeInfo.logicalShape,t.logicalShape),c=l-o,p,h=["x","y","z","w","u","v"];o===0?p="":l<2&&d.length>=1?p="coords = 0;":p=d.map(m=>`coords.${h[m+c]} = 0;`).join(` +`);let f="";return l<2&&o>0?f="coords":f=e.shapeInfo.logicalShape.map((m,g)=>`coords.${h[g+c]}`).join(", "),` + float ${r}() { + ${u} coords = getOutputCoords(); + ${p} + return get${n}(${f}); + } + `}function mt(e){if(e<=1)return"int";if(e===2)return"ivec2";if(e===3)return"ivec3";if(e===4)return"ivec4";if(e===5)return"ivec5";if(e===6)return"ivec6";throw Error(`GPU for rank ${e} is not yet supported`)}function T3(e,t,a){let{newShape:n,keptDims:r}=v.squeezeShape(t),s=t.length,i=e&&s===3&&t[0]===1,o=i?t.slice(1):n,l=!e&&s>1&&!v.arraysEqual(t,a)&&n.lengthe[a]).join(", ")}function bG(e,t,a,n){let r=a.map((d,c)=>{let p={logicalShape:d.shape,texShape:d.isUniform?null:d.texData.texShape,isUniform:d.isUniform,isPacked:d.isUniform?!1:d.texData.isPacked,flatOffset:null};return d.texData!=null&&d.texData.slice!=null&&d.texData.slice.flatOffset>0&&(p.flatOffset=d.texData.slice.flatOffset),{name:t.variableNames[c],shapeInfo:p}}),s=r.map(d=>d.shapeInfo),i={logicalShape:n.shape,texShape:n.texData.texShape,isUniform:!1,isPacked:n.texData.isPacked,flatOffset:null},o=zV(r,i,t),l=s6(e.gl,o),u=e.createProgram(l);return V().get("ENGINE_COMPILE_ONLY")?{program:t,fragmentShader:l,source:o,webGLProgram:u,inShapeInfos:s,outShapeInfo:i,uniformLocations:null,customUniformLocations:null,infLoc:null,nanLoc:null,inShapesLocations:null,inTexShapesLocations:null,outShapeLocation:null,outShapeStridesLocation:null,outTexShapeLocation:null}:Object.assign({program:t,fragmentShader:l,source:o,webGLProgram:u,inShapeInfos:s,outShapeInfo:i},R6(e,t,u))}function R6(e,t,a){let n={},r={},s={},i=[],o,l,u,d=null,c=null;c=e.getUniformLocation(a,"NAN",!1),V().getNumber("WEBGL_VERSION")===1&&(d=e.getUniformLocation(a,"INFINITY",!1));let p=!1;for(let h=0;h{i[f]=e.getUniformLocation(a,h.name,p)}),{uniformLocations:n,customUniformLocations:i,infLoc:d,nanLoc:c,inShapesLocations:r,inTexShapesLocations:s,outShapeLocation:o,outShapeStridesLocation:u,outTexShapeLocation:l}}function xy(e,t){if(e.length!==t.length)throw Error(`Binary was compiled with ${e.length} inputs, but was executed with ${t.length} inputs`);e.forEach((a,n)=>{let r=a.logicalShape,s=t[n],i=s.shape;if(!v.arraysEqual(r,i))throw Error(`Binary was compiled with different shapes than the current args. Shapes ${r} and ${i} must match`);if(a.isUniform&&s.isUniform)return;let o=a.texShape,l=s.isUniform?null:s.texData.texShape;if(!v.arraysEqual(o,l))throw Error(`Binary was compiled with different texture shapes than the current args. Shape ${o} and ${l} must match`)})}function vG(e,t,a,n,r){t.program.enableShapeUniforms||(xy(t.inShapeInfos,a),xy([t.outShapeInfo],[n]));let s=n.texData.texture,i=n.texData.texShape;n.texData.isPacked?e.setOutputPackedMatrixTexture(s.texture,i[0],i[1]):e.setOutputMatrixTexture(s.texture,i[0],i[1]),e.setProgram(t.webGLProgram),V().getNumber("WEBGL_VERSION")===1&&t.infLoc!==null&&e.gl.uniform1f(t.infLoc,1/0),t.nanLoc!==null&&e.gl.uniform1f(t.nanLoc,NaN),a.forEach((l,u)=>{let d=t.program.variableNames[u],c=t.uniformLocations[d],p=t.uniformLocations[`offset${d}`],h=t.inShapesLocations[`${d}Shape`],f=t.inTexShapesLocations[`${d}TexShape`];if(h){let{uniformShape:m}=T3(t.program.packedInputs,l.shape,l.texData.texShape);switch(m.length){case 1:e.gl.uniform1iv(h,new Int32Array(m));break;case 2:e.gl.uniform2iv(h,new Int32Array(m));break;case 3:e.gl.uniform3iv(h,new Int32Array(m));break;case 4:e.gl.uniform4iv(h,new Int32Array(m));break;default:break}}if(f&&e.gl.uniform2i(f,l.texData.texShape[0],l.texData.texShape[1]),c!=null){if(l.isUniform){if(v.sizeFromShape(l.shape)<2)e.gl.uniform1f(c,l.uniformValues[0]);else{let m=l.uniformValues;m instanceof Float32Array||(m=new Float32Array(m)),e.gl.uniform1fv(c,m)}return}l.texData.slice!=null&&p!=null&&e.gl.uniform1i(p,l.texData.slice.flatOffset),e.setInputMatrixTexture(l.texData.texture.texture,c,u)}});let o=t.outShapeLocation;if(o)switch(n.shape.length){case 1:e.gl.uniform1iv(o,new Int32Array(n.shape));break;case 2:e.gl.uniform2iv(o,new Int32Array(n.shape));break;case 3:e.gl.uniform3iv(o,new Int32Array(n.shape));break;case 4:e.gl.uniform4iv(o,new Int32Array(n.shape));break;default:break}if(t.outShapeStridesLocation){let l=v.computeStrides(n.shape);switch(n.shape.length){case 2:e.gl.uniform1iv(t.outShapeStridesLocation,new Int32Array(l));break;case 3:e.gl.uniform2iv(t.outShapeStridesLocation,new Int32Array(l));break;case 4:e.gl.uniform3iv(t.outShapeStridesLocation,new Int32Array(l));break;default:break}}t.outTexShapeLocation&&e.gl.uniform2i(t.outTexShapeLocation,n.texData.texShape[0],n.texData.texShape[1]),t.program.customUniforms&&r&&t.program.customUniforms.forEach((l,u)=>{let d=t.customUniformLocations[u],c=r[u];if(l.type==="float")e.gl.uniform1fv(d,c);else if(l.type==="vec2")e.gl.uniform2fv(d,c);else if(l.type==="vec3")e.gl.uniform3fv(d,c);else if(l.type==="vec4")e.gl.uniform4fv(d,c);else if(l.type==="int")e.gl.uniform1iv(d,c);else if(l.type==="ivec2")e.gl.uniform2iv(d,c);else if(l.type==="ivec3")e.gl.uniform3iv(d,c);else if(l.type==="ivec4")e.gl.uniform4iv(d,c);else throw Error(`uniform type ${l.type} is not supported yet.`)}),e.executeProgram()}function wG(e,t,a){let n="";t.concat(a).forEach(i=>{let o=i.texData!=null&&i.texData.slice!=null&&i.texData.slice.flatOffset>0;if(e.enableShapeUniforms&&!i.isUniform){let l=i.texData.texShape,{useSqueezeShape:u,uniformShape:d,keptDims:c}=T3(e.packedInputs,i.shape,l),p="",h="",f="";if(d.length===1&&e.packedInputs){let w=[Math.ceil(l[0]/2),Math.ceil(l[1]/2)];p=`${w[0]>1}_${w[1]>1}`}else if(d.length===2&&!e.packedInputs)h=`${d[0]>1}_${d[1]>1}`;else if(d.length>2&&!e.packedInputs){let w=v.computeStrides(d);f=`${w[0]===l[1]}_${w[w.length-1]===l[1]}`}let m=i.shape.length,g=d.length===2&&v.arraysEqual(i.shape,l),y=v.sizeFromShape(i.shape)===1,A=T.getBroadcastDims(i.shape,a.shape),x=!e.packedInputs&&m===a.shape.length&&v.arraysEqual(l,a.texData.texShape),b=e.packedInputs||d.length>2?"":`${l[0]>1}_${l[1]>1}`;n+=`${m}_${x}_${u?c:""}_${d.length}_${y}_${A}_${g}_${p}_${h}_${f}_${b}_${o}`}else{let l=i.isUniform?"uniform":i.texData.texShape;n+=`${i.shape}_${l}_${o}`}});let r=e.userCode,s=e.constructor.name;return s+="_"+n+"_"+r+`${V().getNumber("WEBGL_VERSION")}`,s}function Na(e){return V().getBool("WEBGL_USE_SHAPES_UNIFORMS")&&e<=4}var kG=class{constructor(e){this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0,this.outPackingScheme=od.DENSE,this.customUniforms=[{name:"texShape",type:"ivec2"}];let t=Ca();this.outputShape=e,this.enableShapeUniforms=Na(this.outputShape.length),this.userCode=` + ivec3 outCoordsFromFlatIndex(int index) { + ${this.enableShapeUniforms?zh(["r","c","d"],e):co(["r","c","d"],e)} + return ivec3(r, c, d); + } + + void main() { + ivec2 resTexRC = ivec2(resultUV.yx * vec2(texShape[0], texShape[1])); + int index = 4 * (resTexRC.x * texShape[1] + resTexRC.y); + + vec4 result = vec4(0.); + + for (int i=0; i<4; i++) { + int flatIndex = index + i; + ivec3 rc = outCoordsFromFlatIndex(flatIndex); + result[i] = getA(rc.x, rc.y, rc.z); + } + + ${t.output} = result; + } + `}},IG=class{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outPackingScheme=od.DENSE,this.customUniforms=[{name:"texShape",type:"ivec2"}];let t=Ca();this.outputShape=e,this.enableShapeUniforms=Na(this.outputShape.length),this.userCode=` + ivec3 outCoordsFromFlatIndex(int index) { + ${this.enableShapeUniforms?zh(["r","c","d"],e):co(["r","c","d"],e)} + return ivec3(r, c, d); + } + + void main() { + ivec2 resTexRC = ivec2(resultUV.yx * vec2(texShape[0], texShape[1])); + int index = 4 * (resTexRC.x * texShape[1] + resTexRC.y); + + vec4 result = vec4(0.); + + for (int i=0; i<4; i++) { + int flatIndex = index + i; + ivec3 rc = outCoordsFromFlatIndex(flatIndex); + result[i] = getChannel(getA(rc.x, rc.y, rc.z), vec2(rc.y, rc.z)); + } + + ${t.output} = result; + } + `}},SG=class{constructor(e){this.variableNames=["A"],this.outTexUsage=un.DOWNLOAD;let t=Ca();this.outputShape=e,this.userCode=` + ${T6} + + void main() { + float x = getAAtOutCoords(); + ${t.output} = encode_float(x); + } + `}},TG=class{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!1,this.outTexUsage=un.DOWNLOAD;let t=Ca();this.outputShape=e,this.userCode=` + ${T6} + + void main() { + ivec3 coords = getOutputCoords(); + float x = getChannel(getAAtOutCoords(), vec2(coords.y, coords.z)); + ${t.output} = encode_float(x); + } + `}},CG={R:0,G:1,B:2,A:3},by=class{constructor(e,t=!1,a="RGBA"){this.variableNames=["A"],this.customUniforms=[{name:"texShape",type:"ivec2"}];let n=Ca();this.outputShape=e,this.enableShapeUniforms=Na(this.outputShape.length);let r="result";t&&(r="floor(result * 255. + 0.5)");let s="";for(let i=0;iB6,createBufferFromOutputTexture:()=>G6,createFloat16MatrixTexture:()=>O6,createFloat16PackedMatrixTexture:()=>L6,createFloat32MatrixTexture:()=>P6,createIndexBuffer:()=>F6,createPackedMatrixTexture:()=>z6,createUnsignedBytesMatrixTexture:()=>D6,createVertexBuffer:()=>_6,createVertexShader:()=>$6,downloadByteEncodedFloatMatrixFromOutputTexture:()=>j6,downloadFloat32MatrixFromBuffer:()=>U6,downloadMatrixFromPackedOutputTexture:()=>q6,downloadPackedMatrixFromBuffer:()=>H6,getInternalFormatForFloat16MatrixTexture:()=>N3,getInternalFormatForFloat16PackedMatrixTexture:()=>M3,getInternalFormatForFloat32MatrixTexture:()=>C3,getInternalFormatForPackedMatrixTexture:()=>R3,getInternalFormatForUnsignedBytesMatrixTexture:()=>E3,uploadDenseMatrixToTexture:()=>W6,uploadPixelDataToTexture:()=>V6});function $6(e){let t=Ca(),a=`${t.version} + precision highp float; + ${t.attribute} vec3 clipSpacePos; + ${t.attribute} vec2 uv; + ${t.varyingVs} vec2 resultUV; + + void main() { + gl_Position = vec4(clipSpacePos, 1); + resultUV = uv; + }`;return r6(e,a)}function _6(e){let t=new Float32Array([-1,1,0,0,1,-1,-1,0,0,0,1,1,0,1,1,1,-1,0,1,0]);return l6(e,t)}function F6(e){let t=new Uint16Array([0,1,2,2,1,3]);return u6(e,t)}function dp(e,t,a,n,r,s){p6(t,a);let i=d6(e),o=e.TEXTURE_2D;return ce(e,()=>e.bindTexture(o,i)),ce(e,()=>e.texParameteri(o,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE)),ce(e,()=>e.texParameteri(o,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),ce(e,()=>e.texParameteri(o,e.TEXTURE_MIN_FILTER,e.NEAREST)),ce(e,()=>e.texParameteri(o,e.TEXTURE_MAG_FILTER,e.NEAREST)),V().getNumber("WEBGL_VERSION")===1?ce(e,()=>e.texImage2D(o,0,n,t,a,0,r,s,null)):ce(e,()=>e.texStorage2D(o,1,n,t,a)),ce(e,()=>e.bindTexture(e.TEXTURE_2D,null)),{texture:i,texShape:[a,t]}}function C3(e){return e.internalFormatFloat}function P6(e,t,a,n){let[r,s]=up(t,a);return dp(e,r,s,C3(n),n.textureFormatFloat,e.FLOAT)}function N3(e){return e.internalFormatHalfFloat}function O6(e,t,a,n){let[r,s]=up(t,a);return dp(e,r,s,N3(n),n.textureFormatFloat,n.textureTypeHalfFloat)}function E3(e){return e.downloadTextureFormat}function D6(e,t,a,n){let[r,s]=up(t,a);return dp(e,r,s,E3(n),e.RGBA,e.UNSIGNED_BYTE)}function R3(e){return e.internalFormatPackedFloat}function z6(e,t,a,n){let[r,s]=Yl(t,a);return dp(e,r,s,R3(n),e.RGBA,e.FLOAT)}function M3(e){return e.internalFormatPackedHalfFloat}function L6(e,t,a,n){let[r,s]=Yl(t,a);return dp(e,r,s,M3(n),e.RGBA,n.textureTypeHalfFloat)}function B6(e,t,a){return ce(e,()=>e.bindBuffer(e.ARRAY_BUFFER,a)),v1(e,t,"clipSpacePos",a,3,20,0)&&v1(e,t,"uv",a,2,20,12)}function W6(e,t,a,n,r,s){ce(e,()=>e.bindTexture(e.TEXTURE_2D,t));let i,o,l;r instanceof Uint8Array?(i=new Uint8Array(a*n*4),o=e.UNSIGNED_BYTE,l=e.RGBA):(i=new Float32Array(a*n*4),o=e.FLOAT,l=s.internalFormatPackedFloat),i.set(r),V().getNumber("WEBGL_VERSION")===2?ce(e,()=>e.texSubImage2D(e.TEXTURE_2D,0,0,0,a,n,e.RGBA,o,i)):ce(e,()=>e.texImage2D(e.TEXTURE_2D,0,l,a,n,0,e.RGBA,o,i)),ce(e,()=>e.bindTexture(e.TEXTURE_2D,null))}function V6(e,t,a){ce(e,()=>e.bindTexture(e.TEXTURE_2D,t)),a.data instanceof Uint8Array?V().getNumber("WEBGL_VERSION")===2?ce(e,()=>e.texSubImage2D(e.TEXTURE_2D,0,0,0,a.width,a.height,e.RGBA,e.UNSIGNED_BYTE,a.data)):ce(e,()=>e.texImage2D(e.TEXTURE_2D,0,e.RGBA,a.width,a.height,0,e.RGBA,e.UNSIGNED_BYTE,a.data)):V().getNumber("WEBGL_VERSION")===2?ce(e,()=>e.texSubImage2D(e.TEXTURE_2D,0,0,0,e.RGBA,e.UNSIGNED_BYTE,a)):ce(e,()=>e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,a)),ce(e,()=>e.bindTexture(e.TEXTURE_2D,null))}function G6(e,t,a,n){let r=e.createBuffer();ce(e,()=>e.bindBuffer(e.PIXEL_PACK_BUFFER,r));let s=4*4*t*a;return ce(e,()=>e.bufferData(e.PIXEL_PACK_BUFFER,s,e.STREAM_READ)),ce(e,()=>e.readPixels(0,0,a,t,e.RGBA,e.FLOAT,0)),ce(e,()=>e.bindBuffer(e.PIXEL_PACK_BUFFER,null)),r}function U6(e,t,a){let n=e,r=new Float32Array(a);return n.bindBuffer(n.PIXEL_PACK_BUFFER,t),n.getBufferSubData(n.PIXEL_PACK_BUFFER,0,r),n.bindBuffer(n.PIXEL_PACK_BUFFER,null),r}function j6(e,t,a,n){let[r,s]=up(t,a),i=4,o=new Uint8Array(IV(t*a,i));return ce(e,()=>e.readPixels(0,0,r,s,n.downloadTextureFormat,e.UNSIGNED_BYTE,o)),new Float32Array(o.buffer)}function H6(e,t,a,n,r,s,i,o){let l=e,u=new Float32Array(SV(s,i));return l.bindBuffer(l.PIXEL_PACK_BUFFER,t),l.getBufferSubData(l.PIXEL_PACK_BUFFER,0,u),l.bindBuffer(l.PIXEL_PACK_BUFFER,null),u}function q6(e,t,a){let n=new Float32Array(t*a*4);return ce(e,()=>e.readPixels(0,0,a,t,e.RGBA,e.FLOAT,n)),n}var el=class{constructor(e){this.outputTexture=null,this.program=null,this.disposed=!1,this.vertexAttrsAreBound=!1,this.itemsToPoll=[];let t=V().getNumber("WEBGL_VERSION");e!=null?(this.gl=e,Dh(t,e)):this.gl=Dn(t);let a="WEBGL_color_buffer_float",n="EXT_color_buffer_half_float";if(this.parallelCompilationExtension=this.gl.getExtension("KHR_parallel_shader_compile"),V().getNumber("WEBGL_VERSION")===1){let r="OES_texture_float",s="OES_texture_half_float";if(this.textureFloatExtension=Lu(this.gl,r),dn(this.gl,s))this.textureHalfFloatExtension=Lu(this.gl,s);else if(V().get("WEBGL_FORCE_F16_TEXTURES"))throw new Error("GL context does not support half float textures, yet the environment flag WEBGL_FORCE_F16_TEXTURES is set to true.");if(this.colorBufferFloatExtension=this.gl.getExtension(a),dn(this.gl,n))this.colorBufferHalfFloatExtension=Lu(this.gl,n);else if(V().get("WEBGL_FORCE_F16_TEXTURES"))throw new Error("GL context does not support color renderable half floats, yet the environment flag WEBGL_FORCE_F16_TEXTURES is set to true.")}else if(a="EXT_color_buffer_float",dn(this.gl,a))this.colorBufferFloatExtension=this.gl.getExtension(a);else if(dn(this.gl,n))this.colorBufferHalfFloatExtension=this.gl.getExtension(n);else throw new Error("GL context does not support color renderable floats");this.vertexBuffer=_6(this.gl),this.indexBuffer=F6(this.gl),this.framebuffer=c6(this.gl),this.textureConfig=w3(this.gl,this.textureHalfFloatExtension)}get debug(){return V().getBool("DEBUG")}dispose(){if(this.disposed)return;this.program!=null&&console.warn("Disposing a GPGPUContext that still has a bound WebGLProgram. This is probably a resource leak, delete the program with GPGPUContext.deleteProgram before disposing."),this.outputTexture!=null&&console.warn("Disposing a GPGPUContext that still has a bound output matrix texture. This is probably a resource leak, delete the output matrix texture with GPGPUContext.deleteMatrixTexture before disposing.");let e=this.gl;ce(e,()=>e.finish()),ce(e,()=>e.bindFramebuffer(e.FRAMEBUFFER,null)),ce(e,()=>e.deleteFramebuffer(this.framebuffer)),ce(e,()=>e.bindBuffer(e.ARRAY_BUFFER,null)),ce(e,()=>e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,null)),ce(e,()=>e.deleteBuffer(this.indexBuffer)),this.disposed=!0}createFloat32MatrixTexture(e,t){return this.throwIfDisposed(),P6(this.gl,e,t,this.textureConfig)}createFloat16MatrixTexture(e,t){return this.throwIfDisposed(),O6(this.gl,e,t,this.textureConfig)}createUnsignedBytesMatrixTexture(e,t){return this.throwIfDisposed(),D6(this.gl,e,t,this.textureConfig)}uploadPixelDataToTexture(e,t){this.throwIfDisposed(),V6(this.gl,e,t)}uploadDenseMatrixToTexture(e,t,a,n){this.throwIfDisposed(),W6(this.gl,e,t,a,n,this.textureConfig)}createFloat16PackedMatrixTexture(e,t){return this.throwIfDisposed(),L6(this.gl,e,t,this.textureConfig)}createPackedMatrixTexture(e,t){return this.throwIfDisposed(),z6(this.gl,e,t,this.textureConfig)}deleteMatrixTexture(e){this.throwIfDisposed(),this.outputTexture===e&&(w1(this.gl,this.framebuffer),this.outputTexture=null),ce(this.gl,()=>this.gl.deleteTexture(e))}downloadByteEncodedFloatMatrixFromOutputTexture(e,t,a){return this.downloadMatrixDriver(e,()=>j6(this.gl,t,a,this.textureConfig))}downloadPackedMatrixFromBuffer(e,t,a,n,r,s){return H6(this.gl,e,t,a,n,r,s,this.textureConfig)}downloadFloat32MatrixFromBuffer(e,t){return U6(this.gl,e,t)}createBufferFromTexture(e,t,a){this.bindTextureToFrameBuffer(e);let n=G6(this.gl,t,a,this.textureConfig);return this.unbindTextureToFrameBuffer(),n}createAndWaitForFence(){let e=this.createFence(this.gl);return this.pollFence(e)}createFence(e){let t,a;if(V().getBool("WEBGL_FENCE_API_ENABLED")){let n=e,r=n.fenceSync(n.SYNC_GPU_COMMANDS_COMPLETE,0);e.flush(),a=()=>{let s=n.clientWaitSync(r,0,0);return s===n.ALREADY_SIGNALED||s===n.CONDITION_SATISFIED},t=r}else V().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0?(t=this.beginQuery(),this.endQuery(),a=()=>this.isQueryAvailable(t,V().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION"))):a=()=>!0;return{query:t,isFencePassed:a}}downloadMatrixFromPackedTexture(e,t,a){return this.downloadMatrixDriver(e,()=>q6(this.gl,t,a))}createProgram(e){this.throwIfDisposed();let t=this.gl;this.vertexShader==null&&(this.vertexShader=$6(t));let a=i6(t);return ce(t,()=>t.attachShader(a,this.vertexShader)),ce(t,()=>t.attachShader(a,e)),o6(t,a),this.debug&&fc(t,a),this.vertexAttrsAreBound||(this.setProgram(a),this.vertexAttrsAreBound=B6(t,this.program,this.vertexBuffer)),a}deleteProgram(e){this.throwIfDisposed(),e===this.program&&(this.program=null),e!=null&&ce(this.gl,()=>this.gl.deleteProgram(e))}setProgram(e){this.throwIfDisposed(),this.program=e,this.program!=null&&this.debug&&fc(this.gl,this.program),ce(this.gl,()=>this.gl.useProgram(e))}getUniformLocation(e,t,a=!0){return this.throwIfDisposed(),a?f6(this.gl,e,t):m6(this.gl,e,t)}getAttributeLocation(e,t){return this.throwIfDisposed(),ce(this.gl,()=>this.gl.getAttribLocation(e,t))}getUniformLocationNoThrow(e,t){return this.throwIfDisposed(),this.gl.getUniformLocation(e,t)}setInputMatrixTexture(e,t,a){this.throwIfDisposed(),this.throwIfNoProgram(),g6(this.gl,e,t,a)}setOutputMatrixTexture(e,t,a){this.setOutputMatrixTextureDriver(e,a,t)}setOutputPackedMatrixTexture(e,t,a){this.throwIfDisposed();let[n,r]=Yl(t,a);this.setOutputMatrixTextureDriver(e,n,r)}setOutputMatrixWriteRegion(e,t,a,n){this.setOutputMatrixWriteRegionDriver(a,e,n,t)}setOutputPackedMatrixWriteRegion(e,t,a,n){throw new Error("setOutputPackedMatrixWriteRegion not implemented.")}debugValidate(){this.program!=null&&fc(this.gl,this.program),Bu(this.gl)}executeProgram(){this.throwIfDisposed(),this.throwIfNoProgram();let e=this.gl;this.debug&&this.debugValidate(),ce(e,()=>e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT,0))}blockUntilAllProgramsCompleted(){this.throwIfDisposed(),ce(this.gl,()=>this.gl.finish())}getQueryTimerExtension(){return this.disjointQueryTimerExtension==null&&(this.disjointQueryTimerExtension=Lu(this.gl,V().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")===2?"EXT_disjoint_timer_query_webgl2":"EXT_disjoint_timer_query")),this.disjointQueryTimerExtension}getQueryTimerExtensionWebGL2(){return this.getQueryTimerExtension()}getQueryTimerExtensionWebGL1(){return this.getQueryTimerExtension()}beginQuery(){if(V().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")===2){let a=this.gl,n=this.getQueryTimerExtensionWebGL2(),r=a.createQuery();return a.beginQuery(n.TIME_ELAPSED_EXT,r),r}let e=this.getQueryTimerExtensionWebGL1(),t=e.createQueryEXT();return e.beginQueryEXT(e.TIME_ELAPSED_EXT,t),t}endQuery(){if(V().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")===2){let t=this.gl,a=this.getQueryTimerExtensionWebGL2();t.endQuery(a.TIME_ELAPSED_EXT);return}let e=this.getQueryTimerExtensionWebGL1();e.endQueryEXT(e.TIME_ELAPSED_EXT)}async waitForQueryAndGetTime(e){return await v.repeatedTry(()=>this.disposed||this.isQueryAvailable(e,V().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION"))),this.getQueryTime(e,V().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION"))}getQueryTime(e,t){if(t===0)return null;if(t===2){let a=this.gl;return a.getQueryParameter(e,a.QUERY_RESULT)/1e6}else{let a=this.getQueryTimerExtensionWebGL1();return a.getQueryObjectEXT(e,a.QUERY_RESULT_EXT)/1e6}}isQueryAvailable(e,t){if(t===0)return!0;if(t===2){let a=this.gl,n=this.getQueryTimerExtensionWebGL2(),r=a.getQueryParameter(e,a.QUERY_RESULT_AVAILABLE);return this.disjoint==null&&(this.disjoint=this.gl.getParameter(n.GPU_DISJOINT_EXT)),r&&!this.disjoint}else{let a=this.getQueryTimerExtensionWebGL1(),n=a.getQueryObjectEXT(e,a.QUERY_RESULT_AVAILABLE_EXT);return this.disjoint==null&&(this.disjoint=this.gl.getParameter(a.GPU_DISJOINT_EXT)),n&&!this.disjoint}}pollFence(e){return new Promise(t=>{this.addItemToPoll(()=>e.isFencePassed(),()=>t())})}pollItems(){let e=EG(this.itemsToPoll.map(t=>t.isDoneFn));for(let t=0;t<=e;++t){let{resolveFn:a}=this.itemsToPoll[t];a()}this.itemsToPoll=this.itemsToPoll.slice(e+1)}addItemToPoll(e,t){if(this.itemsToPoll.push({isDoneFn:e,resolveFn:t}),this.itemsToPoll.length>1)return;let a;"setTimeoutCustom"in V().platform&&(a=V().platform.setTimeoutCustom.bind(V().platform)),v.repeatedTry(()=>(this.pollItems(),this.itemsToPoll.length===0),()=>0,null,a)}bindTextureToFrameBuffer(e){this.throwIfDisposed(),mc(this.gl,e,this.framebuffer),this.debug&&Bu(this.gl)}unbindTextureToFrameBuffer(){this.outputTexture!=null?(mc(this.gl,this.outputTexture,this.framebuffer),this.debug&&Bu(this.gl)):w1(this.gl,this.framebuffer)}downloadMatrixDriver(e,t){this.bindTextureToFrameBuffer(e);let a=t();return this.unbindTextureToFrameBuffer(),a}setOutputMatrixTextureDriver(e,t,a){this.throwIfDisposed();let n=this.gl;mc(n,e,this.framebuffer),this.debug&&Bu(n),this.outputTexture=e,ce(n,()=>n.viewport(0,0,t,a)),ce(n,()=>n.scissor(0,0,t,a))}setOutputMatrixWriteRegionDriver(e,t,a,n){this.throwIfDisposed(),ce(this.gl,()=>this.gl.scissor(e,t,a,n))}throwIfDisposed(){if(this.disposed)throw new Error("Attempted to use disposed GPGPUContext.")}throwIfNoProgram(){if(this.program==null)throw new Error("No GPU program is currently set.")}};function EG(e){let t=0;for(;t`${e}.${a}`)}function va(e,t){return t===1?[e]:Y6(e,t)}function xU(e,t){if(e===1)return"rc";let a="";for(let n=0;n ${this.enableShapeUniforms?"outShape":this.outputShape[0]}`;let t="";for(let a=this.rank-2;a= ${this.enableShapeUniforms?`outShape[${a}]`:this.outputShape[a]}`,a= ${a}; + bool rEdge = rp1 >= ${n}; + `}getOutput(e){let t=this.getSourceCoordsArr(e);return this.rank===1?`getA(rc), (rc + 1 >= ${this.enableShapeUniforms?"outShape":this.outputShape[0]} ? 0. : getA(rc + 1)), 0, 0`:`getA(${t[0]}), + cEdge ? 0. : getA(${t[1]}), + rEdge ? 0. : getA(${t[2]}), + rEdge || cEdge ? 0. : getA(${t[3]})`}},J6=class{constructor(e,t){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"inputShape",type:"ivec3"}],this.outputShape=e,this.enableShapeUniforms=Na(this.outputShape.length);let a="";for(let n=0;n<4;n++){let r="thisRC = rc;";n%2===1&&(r+="thisRC.z += 1;"),n>1&&(r+="thisRC.y += 1;"),a+=` + ${r} + ${n>0?"if(thisRC.y < rows && thisRC.z < cols){":""} + int flatIndex = getFlatIndex(thisRC); + + ivec3 inputRC = inputCoordsFromReshapedOutCoords(flatIndex); + vec2 inputRCInnerDims = vec2(float(inputRC.y),float(inputRC.z)); + + result[${n}] = + getChannel(getA(inputRC.x, inputRC.y, inputRC.z), inputRCInnerDims); + ${n>0?"}":""} + `}this.userCode=` + ${vU(t,this.enableShapeUniforms)} + ${this.enableShapeUniforms?S3():I3(e)} + + void main() { + ivec3 rc = getOutputCoords(); + + vec4 result = vec4(0.); + + ivec3 thisRC; + int rows = ${this.enableShapeUniforms?"outShape[1]":e[1]}; + int cols = ${this.enableShapeUniforms?"outShape[2]":e[2]}; + + ${a} + + setOutput(result); + } + `}};function vU(e,t){return` + ivec3 inputCoordsFromReshapedOutCoords(int index) { + ${t?DV(["r","c","d"],"inputShape"):co(["r","c","d"],e)} + return ivec3(r, c, d); + } + `}var wU=class{constructor(e){this.gpgpu=e,this.numUsedTextures=0,this.numFreeTextures=0,this._numBytesAllocated=0,this._numBytesFree=0,this.freeTextures={},this.logEnabled=!1,this.usedTextures={}}acquireTexture(e,t,a){let n=wy(t,a),r=ky(e,n,a);r in this.freeTextures||(this.freeTextures[r]=[]),r in this.usedTextures||(this.usedTextures[r]=[]);let s=vy(e,n,this.gpgpu.gl,this.gpgpu.textureConfig,a);if(this.freeTextures[r].length>0){this.numFreeTextures--,this.numUsedTextures++,this._numBytesFree-=s,this.log();let o=this.freeTextures[r].shift();return this.usedTextures[r].push(o),o}let i;return n===aa.PACKED_2X2_FLOAT32?i=this.gpgpu.createPackedMatrixTexture(e[0],e[1]):n===aa.PACKED_2X2_FLOAT16?i=this.gpgpu.createFloat16PackedMatrixTexture(e[0],e[1]):n===aa.UNPACKED_FLOAT32?i=this.gpgpu.createFloat32MatrixTexture(e[0],e[1]):n===aa.UNPACKED_FLOAT16?i=this.gpgpu.createFloat16MatrixTexture(e[0],e[1]):n===aa.PACKED_4X1_UNSIGNED_BYTE&&(i=this.gpgpu.createUnsignedBytesMatrixTexture(e[0],e[1])),this.usedTextures[r].push(i),this.numUsedTextures++,this._numBytesAllocated+=s,this.log(),i}releaseTexture(e,t,a,n){if(this.freeTextures==null)return;let r=wy(a,n),s=ky(t,r,n);s in this.freeTextures||(this.freeTextures[s]=[]);let i=vy(t,r,this.gpgpu.gl,this.gpgpu.textureConfig,n),o=V().get("WEBGL_DELETE_TEXTURE_THRESHOLD");o!==-1&&this._numBytesAllocated>o?(this.gpgpu.deleteMatrixTexture(e.texture),this._numBytesAllocated-=i):(this.freeTextures[s].push(e),this.numFreeTextures++,this._numBytesFree+=i),this.numUsedTextures--;let l=this.usedTextures[s],u=l.indexOf(e);if(u<0)throw new Error("Cannot release a texture that was never provided by this texture manager");l.splice(u,1),this.log()}log(){if(!this.logEnabled)return;let e=this.numFreeTextures+this.numUsedTextures;console.log("Free/Used",`${this.numFreeTextures} / ${this.numUsedTextures}`,`(${e})`);let t=this._numBytesFree/this._numBytesAllocated;console.log(`Bytes allocated: ${this._numBytesAllocated}`),console.log(`Bytes unused: ${this._numBytesFree} (${Math.round(100*t)}%)`)}get numBytesAllocated(){return this._numBytesAllocated}get numBytesFree(){return this._numBytesFree}getNumUsedTextures(){return this.numUsedTextures}getNumFreeTextures(){return this.numFreeTextures}dispose(){if(this.freeTextures!=null){for(let e in this.freeTextures)this.freeTextures[e].forEach(t=>{this.gpgpu.deleteMatrixTexture(t.texture)});for(let e in this.usedTextures)this.usedTextures[e].forEach(t=>{this.gpgpu.deleteMatrixTexture(t.texture)});this.freeTextures=null,this.usedTextures=null,this.numUsedTextures=0,this.numFreeTextures=0,this._numBytesAllocated=0,this._numBytesFree=0}}};function kU(e,t){let a=e;if(t===a.R32F)return 4;if(t===a.R16F)return 2;if(t===a.RGBA32F||t===e.RGBA)return 16;if(t===a.RGBA16F)return 8;if(t===a.RGBA8)return 4;throw new Error(`Unknown internal format ${t}`)}function vy(e,t,a,n,r){let s=IU(t,n),i;if(r){let[l,u]=Yl(e[0],e[1]);i=l*u}else{let[l,u]=up(e[0],e[1]);i=l*u}let o=kU(a,s);return i*o}function IU(e,t){switch(e){case aa.PACKED_2X2_FLOAT32:return R3(t);case aa.PACKED_2X2_FLOAT16:return M3(t);case aa.UNPACKED_FLOAT32:return C3(t);case aa.UNPACKED_FLOAT16:return N3(t);case aa.PACKED_4X1_UNSIGNED_BYTE:return E3(t);default:throw new Error(`Unknown physical texture type ${e}`)}}function SU(e){return V().getBool("WEBGL_RENDER_FLOAT32_ENABLED")?e?aa.PACKED_2X2_FLOAT32:aa.UNPACKED_FLOAT32:e?aa.PACKED_2X2_FLOAT16:aa.UNPACKED_FLOAT16}function wy(e,t){if(e===un.UPLOAD)return aa.PACKED_2X2_FLOAT32;if(e===un.RENDER||e==null)return SU(t);if(e===un.DOWNLOAD||e===un.PIXELS)return aa.PACKED_4X1_UNSIGNED_BYTE;throw new Error(`Unknown logical texture type ${e}`)}function ky(e,t,a){return`${e[0]}_${e[1]}_${t}_${a}`}var gr=class{constructor(e,t){this.variableNames=["A"],this.outputShape=e,this.enableShapeUniforms=Na(this.outputShape.length),this.userCode=` + float unaryOperation(float x) { + ${t} + } + + void main() { + float x = getAAtOutCoords(); + float y = unaryOperation(x); + + setOutput(y); + } + `}},Cn="if (isnan(x)) return x;",TU="return x;",Iy="return abs(x);",CU="return (x >= 0.0) ? x : (exp(x) - 1.0);",NU=Cn+` + return (x < 0.0) ? 0.0 : x; +`,EU=Cn+` + return (x < 0.0) ? 0.0 : min(6.0, x); +`,Uo="return x;",RU="return 1.0 / (1.0 + exp(-1.0 * x));",MU="return x;",$U=` + vec4 result; + + result.r = (x.r >= 0.0) ? x.r : (exp(x.r) - 1.0); + result.g = (x.g >= 0.0) ? x.g : (exp(x.g) - 1.0); + result.b = (x.b >= 0.0) ? x.b : (exp(x.b) - 1.0); + result.a = (x.a >= 0.0) ? x.a : (exp(x.a) - 1.0); + + return result; +`,_U=` + vec4 result = x * vec4(greaterThanEqual(x, vec4(0.0))); + bvec4 isNaN = isnan(x); + + result.r = isNaN.r ? x.r : result.r; + result.g = isNaN.g ? x.g : result.g; + result.b = isNaN.b ? x.b : result.b; + result.a = isNaN.a ? x.a : result.a; + + return result; +`,FU=` + vec4 result = min(x, vec4(6.)) * vec4(greaterThanEqual(x, vec4(0.0))); + bvec4 isNaN = isnan(x); + + result.r = isNaN.r ? x.r : result.r; + result.g = isNaN.g ? x.g : result.g; + result.b = isNaN.b ? x.b : result.b; + result.a = isNaN.a ? x.a : result.a; + + return result; +`,PU="return 1.0 / (1.0 + exp(-1.0 * x));",Js=class{constructor(e,t){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e,this.enableShapeUniforms=Na(this.outputShape.length),this.userCode=` + vec4 unaryOperation(vec4 x) { + ${t} + } + + void main() { + vec4 x = getAAtOutCoords(); + vec4 y = unaryOperation(x); + + setOutput(y); + } + `}},OU=class{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!1,this.outputShape=e,this.enableShapeUniforms=Na(this.outputShape.length);let t=e.length,a=va("rc",t),n=mt(t),r=xU(t,a),s=a.slice(-2),i=t<=1?"rc":`vec2(${s.join(",")})`;this.userCode=` + void main() { + ${n} rc = getOutputCoords(); + vec4 packedInput = getA(${r}); + + setOutput(getChannel(packedInput, ${i})); + } + `}},DU=Tn.whereImpl,zU=1e-7,LU=1e-4,Dm={};function BU(e){return e in Dm||(Dm[e]={}),Dm[e]}var WU=V().getNumber("CPU_HANDOFF_SIZE_THRESHOLD"),VU=600;function GU(){return V().global.screen==null?1024:V().global.screen.height*V().global.screen.width*window.devicePixelRatio*VU/1024/1024}var nu=class extends fl{constructor(e){if(super(),this.pendingRead=new WeakMap,this.pendingDisposal=new WeakSet,this.dataRefCount=new WeakMap,this.numBytesInGPU=0,this.uploadWaitMs=0,this.downloadWaitMs=0,this.lastGlFlushTime=0,this.warnedAboutMemory=!1,this.pendingDeletes=0,this.disposed=!1,!V().getBool("HAS_WEBGL"))throw new Error("WebGL is not supported on this device");let t;if(e!=null){if(e instanceof el)t=e;else{let a=Dn(V().getNumber("WEBGL_VERSION"),e);t=new el(a)}this.binaryCache={},this.gpgpuCreatedLocally=!1}else{let a=Dn(V().getNumber("WEBGL_VERSION"));t=new el(a),this.binaryCache=BU(V().getNumber("WEBGL_VERSION")),this.gpgpuCreatedLocally=!0}this.gpgpu=t,this.canvas=this.gpgpu.gl.canvas,this.textureManager=new wU(this.gpgpu),this.numMBBeforeWarning=GU(),this.texData=new md(this,kt())}nextDataId(){return nu.nextDataId++}numDataIds(){return this.texData.numDataIds()-this.pendingDeletes}writeTexture(e,t,a,n,r,s){let i=this.makeTensorInfo(t,a),o=this.texData.get(i.dataId);o.isPacked=!1,o.texture={texture:e,texShape:[n,r]},o.texShape=[n,r];let l=Wu(t),u=new by(l,!1,s),d=this.runWebGLProgram(u,[i],a,[[n,r]]);return d.shape=t,o.texture=null,this.disposeIntermediateTensorInfo(i),d.dataId}write(e,t,a){if((V().getBool("WEBGL_CHECK_NUMERICAL_PROBLEMS")||V().getBool("DEBUG"))&&this.checkNumericalProblems(e),a==="complex64"&&e!=null)throw new Error("Cannot write to a complex64 dtype. Please use tf.complex(real, imag).");let n={id:this.nextDataId()};return this.texData.set(n,{shape:t,dtype:a,values:e,usage:un.UPLOAD,refCount:1}),n}refCount(e){return this.texData.has(e)?this.texData.get(e).refCount:0}incRef(e){let t=this.texData.get(e);t.refCount++}decRef(e){if(this.texData.has(e)){let t=this.texData.get(e);t.refCount--}}move(e,t,a,n,r){if(V().getBool("DEBUG")&&this.checkNumericalProblems(t),n==="complex64")throw new Error("Cannot write to a complex64 dtype. Please use tf.complex(real, imag).");this.texData.set(e,{shape:a,dtype:n,values:t,usage:un.UPLOAD,refCount:r})}disposeIntermediateTensorInfo(e){this.disposeData(e.dataId)}readSync(e){let t=this.texData.get(e),{values:a,dtype:n,complexTensorInfos:r,slice:s,shape:i,isPacked:o}=t;if(s!=null){let c;o?c=new Js(i,Uo):c=new gr(i,Uo);let p=this.runWebGLProgram(c,[{dataId:e,shape:i,dtype:n}],n),h=this.readSync(p.dataId);return this.disposeIntermediateTensorInfo(p),h}if(a!=null)return this.convertAndCacheOnCPU(e);if(n==="string")return a;let l=this.activeTimers!=null,u;l&&(u=v.now());let d;if(n==="complex64"){let c=this.readSync(r.real.dataId),p=this.readSync(r.imag.dataId);d=T.mergeRealAndImagArrays(c,p)}else d=this.getValuesFromTexture(e);return l&&(this.downloadWaitMs+=v.now()-u),this.convertAndCacheOnCPU(e,d)}async read(e){if(this.pendingRead.has(e)){let h=this.pendingRead.get(e);return new Promise(f=>h.push(f))}let t=this.texData.get(e),{values:a,shape:n,slice:r,dtype:s,complexTensorInfos:i,isPacked:o}=t;if(r!=null){let h;o?h=new Js(n,Uo):h=new gr(n,Uo);let f=this.runWebGLProgram(h,[{dataId:e,shape:n,dtype:s}],s),m=this.read(f.dataId);return this.disposeIntermediateTensorInfo(f),m}if(a!=null)return this.convertAndCacheOnCPU(e);if(V().getBool("DEBUG")&&!V().getBool("WEBGL_DOWNLOAD_FLOAT_ENABLED")&&V().getNumber("WEBGL_VERSION")===2)throw new Error("tensor.data() with WEBGL_DOWNLOAD_FLOAT_ENABLED=false and WEBGL_VERSION=2 not yet supported.");let l=null,u;if(s!=="complex64"&&V().get("WEBGL_BUFFER_SUPPORTED")){u=this.decode(e);let h=this.texData.get(u.dataId);l=this.gpgpu.createBufferFromTexture(h.texture.texture,...oc(n))}this.pendingRead.set(e,[]),s!=="complex64"&&await this.gpgpu.createAndWaitForFence();let d;if(s==="complex64"){let h=await Promise.all([this.read(i.real.dataId),this.read(i.imag.dataId)]),f=h[0],m=h[1];d=T.mergeRealAndImagArrays(f,m)}else if(l==null)d=this.getValuesFromTexture(e);else{let h=v.sizeFromShape(n);d=this.gpgpu.downloadFloat32MatrixFromBuffer(l,h)}if(u!=null&&this.disposeIntermediateTensorInfo(u),l!=null){let h=this.gpgpu.gl;ce(h,()=>h.deleteBuffer(l))}let c=this.convertAndCacheOnCPU(e,d),p=this.pendingRead.get(e);return this.pendingRead.delete(e),p.forEach(h=>h(c)),this.pendingDisposal.has(e)&&(this.pendingDisposal.delete(e),this.disposeData(e)&&kt().removeDataId(e,this),this.pendingDeletes--),c}readToGPU(e,t={}){let a=this.texData.get(e),{values:n,shape:r,slice:s,dtype:i,isPacked:o,texture:l}=a;if(i==="complex64")throw new Error("Does not support reading texture for complex64 dtype.");if(s!=null){let p;o?p=new Js(r,Uo):p=new gr(r,Uo);let h=this.runWebGLProgram(p,[{dataId:e,shape:r,dtype:i}],i),f=this.readToGPU(h,t);return this.disposeIntermediateTensorInfo(h),f}if(l==null)throw n!=null?new Error("Data is not on GPU but on CPU."):new Error("There is no data on GPU or CPU.");let u=this.decode(e,t.customTexShape),d=kt().makeTensorFromTensorInfo(u),c=this.texData.get(u.dataId);return Object.assign({tensorRef:d},c.texture)}bufferSync(e){let t=this.readSync(e.dataId);if(e.dtype==="string")try{let a=t.map(n=>v.decodeString(n));return ve(e.shape,e.dtype,a)}catch(a){throw new Error("Failed to decode encoded string bytes into utf-8")}return ve(e.shape,e.dtype,t)}checkNumericalProblems(e){if(e!=null)for(let t=0;t0}time(e){let t=this.activeTimers,a=[],n=!1;this.programTimersStack==null?(this.programTimersStack=a,n=!0):this.activeTimers.push(a),this.activeTimers=a,e();let r=v.flatten(this.activeTimers.map(o=>o.query)).filter(o=>o!=null),s=v.flatten(this.activeTimers.map(o=>o.name)).filter(o=>o!=null);this.activeTimers=t,n&&(this.programTimersStack=null);let i={uploadWaitMs:this.uploadWaitMs,downloadWaitMs:this.downloadWaitMs,kernelMs:null,wallMs:null};return(async()=>{if(V().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0){let o=await Promise.all(r);i.kernelMs=v.sum(o),i.getExtraProfileInfo=()=>o.map((l,u)=>({name:s[u],ms:l})).map(l=>`${l.name}: ${l.ms}`).join(", ")}else i.kernelMs={error:"WebGL query timers are not supported in this environment."};return this.uploadWaitMs=0,this.downloadWaitMs=0,i})()}memory(){return{unreliable:!1,numBytesInGPU:this.numBytesInGPU,numBytesInGPUAllocated:this.textureManager.numBytesAllocated,numBytesInGPUFree:this.textureManager.numBytesFree}}startTimer(){return V().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0?this.gpgpu.beginQuery():{startMs:v.now(),endMs:null}}endTimer(e){return V().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0?(this.gpgpu.endQuery(),e):(e.endMs=v.now(),e)}async getQueryTime(e){if(V().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0)return this.gpgpu.waitForQueryAndGetTime(e);let t=e;return t.endMs-t.startMs}disposeData(e,t=!1){if(this.pendingDisposal.has(e))return!1;if(!this.texData.has(e))return!0;if(t?this.texData.get(e).refCount=0:this.texData.get(e).refCount--,!t&&this.texData.get(e).refCount>0)return!1;if(this.pendingRead.has(e))return this.pendingDisposal.add(e),this.pendingDeletes++,!1;this.releaseGPUData(e);let{complexTensorInfos:a}=this.texData.get(e);return a!=null&&(this.disposeData(a.real.dataId,t),this.disposeData(a.imag.dataId,t)),this.texData.delete(e),!0}releaseGPUData(e){let{texture:t,dtype:a,texShape:n,usage:r,isPacked:s,slice:i}=this.texData.get(e),o=i&&i.origDataId||e,l=this.dataRefCount.get(o);l>1?this.dataRefCount.set(o,l-1):(this.dataRefCount.delete(o),t!=null&&(this.numBytesInGPU-=this.computeBytes(n,a),this.textureManager.releaseTexture(t,n,r,s)));let u=this.texData.get(e);u.texture=null,u.texShape=null,u.isPacked=!1,u.slice=null}getTexture(e){return this.uploadToGPU(e),this.texData.get(e).texture.texture}getDataInfo(e){return this.texData.get(e)}shouldExecuteOnCPU(e,t=WU){return V().getBool("WEBGL_CPU_FORWARD")&&e.every(a=>this.texData.get(a.dataId).texture==null&&v.sizeFromShape(a.shape)0&&v.isString(a[0])){let r=a.map(s=>v.encodeString(s));n=this.write(r,e,t)}else n=this.write(a,e,t);return this.texData.get(n).usage=null,{dataId:n,shape:e,dtype:t}}makeOutput(e,t,a){return kt().makeTensorFromTensorInfo(this.makeTensorInfo(e,t,a),this)}unpackTensor(e){let t=new OU(e.shape);return this.runWebGLProgram(t,[e],e.dtype)}packTensor(e){let t=new bU(e.shape),a=!0;return this.runWebGLProgram(t,[e],e.dtype,null,a)}packedReshape(e,t){let a=[ui(e.shape),...di(e.shape)],n={dtype:e.dtype,shape:a,dataId:e.dataId},r=[ui(t),...di(t)],s=new J6(r,a),i=!0,o=[a],l=this.runWebGLProgram(s,[n],e.dtype,o,i);return{dataId:l.dataId,shape:t,dtype:l.dtype}}decode(e,t){let a=this.texData.get(e),{isPacked:n,shape:r,dtype:s}=a;if(t!=null){let c=v.sizeFromShape(r),p=t[0]*t[1]*4;v.assert(c<=p,()=>"customTexShape is too small. Row * Column * 4 should be equal or larger than the size of the tensor data.")}let i=Wu(r),o;n?o=new IG(i):o=new kG(i);let l=!0,u=[t!=null?t:oc(i)],d=this.runWebGLProgram(o,[{shape:i,dtype:s,dataId:e}],s,u,l,t);return{dtype:s,shape:r,dataId:d.dataId}}runWebGLProgram(e,t,a,n,r=!1,s){let i=this.makeTensorInfo(e.outputShape,a),o=this.texData.get(i.dataId);if(e.packedOutput&&(o.isPacked=!0),e.outPackingScheme===od.DENSE){let g=s!=null?s:oc(e.outputShape);o.texShape=g.map(y=>y*2)}if(e.outTexUsage!=null&&(o.usage=e.outTexUsage),v.sizeFromShape(i.shape)===0)return o.values=v.getTypedArrayFromDType(i.dtype,0),i;let l=[],u=t.map(g=>{if(g.dtype==="complex64")throw new Error("GPGPUProgram does not support complex64 input. For complex64 dtypes, please separate the program into real and imaginary parts.");let y=this.texData.get(g.dataId);if(y.texture==null){if(!e.packedInputs&&v.sizeFromShape(g.shape)<=V().getNumber("WEBGL_SIZE_UPLOAD_UNIFORM"))return{shape:g.shape,texData:null,isUniform:!0,uniformValues:y.values};e.packedInputs&&(y.isPacked=!0,y.shape=g.shape)}if(this.uploadToGPU(g.dataId),!!y.isPacked!=!!e.packedInputs)g=y.isPacked?this.unpackTensor(g):this.packTensor(g),l.push(g),y=this.texData.get(g.dataId);else if(y.isPacked&&!ld(y.shape,g.shape)){let A=g,x=g.shape;g.shape=y.shape,g=this.packedReshape(g,x),l.push(g),y=this.texData.get(g.dataId),A.shape=x}return{shape:g.shape,texData:y,isUniform:!1}});this.uploadToGPU(i.dataId);let d={shape:i.shape,texData:o,isUniform:!1},c=wG(e,u,d),p=this.getAndSaveBinary(c,()=>bG(this.gpgpu,e,u,d)),h=this.activeTimers!=null,f;h&&(f=this.startTimer()),V().get("ENGINE_COMPILE_ONLY")||vG(this.gpgpu,p,u,d,n),l.forEach(g=>this.disposeIntermediateTensorInfo(g)),h&&(f=this.endTimer(f),this.activeTimers.push({name:e.constructor.name,query:this.getQueryTime(f)}));let m=V().get("WEBGL_FLUSH_THRESHOLD");if(m>0){let g=v.now();g-this.lastGlFlushTime>m&&(this.gpgpu.gl.flush(),this.lastGlFlushTime=g)}if(!V().getBool("WEBGL_LAZILY_UNPACK")&&o.isPacked&&r===!1){let g=this.unpackTensor(i);return this.disposeIntermediateTensorInfo(i),g}return i}compileAndRun(e,t,a,n,r=!1){return a=a||t[0].dtype,this.runWebGLProgram(e,t,a,n,r)}getAndSaveBinary(e,t){return e in this.binaryCache||(this.binaryCache[e]=t()),this.binaryCache[e]}getTextureManager(){return this.textureManager}dispose(){this.disposed||(V().getBool("IS_TEST")||Object.keys(this.binaryCache).forEach(e=>{this.gpgpu.deleteProgram(this.binaryCache[e].webGLProgram),delete this.binaryCache[e]}),this.textureManager.dispose(),this.canvas!=null&&typeof HTMLCanvasElement!="undefined"&&this.canvas instanceof HTMLCanvasElement?this.canvas.remove():this.canvas=null,this.gpgpuCreatedLocally&&(this.gpgpu.program=null,this.gpgpu.dispose()),this.disposed=!0)}floatPrecision(){return this.floatPrecisionValue==null&&(this.floatPrecisionValue=Ee(()=>{if(!V().get("WEBGL_RENDER_FLOAT32_ENABLED")){let e=V().getBool("DEBUG");V().set("DEBUG",!1);let t=this.abs(Fe(1e-8)).dataSync()[0];if(V().set("DEBUG",e),t>0)return 32}return 16})),this.floatPrecisionValue}epsilon(){return this.floatPrecision()===32?zU:LU}uploadToGPU(e){let t=this.texData.get(e),{shape:a,dtype:n,values:r,texture:s,usage:i,isPacked:o}=t;if(s!=null)return;let l=this.activeTimers!=null,u;l&&(u=v.now());let d=t.texShape;if(d==null&&(d=x6(a,o),t.texShape=d),r!=null){let c=Wu(a),p,h=d[1],f=d[0],m=r instanceof Uint8Array||r instanceof Uint8ClampedArray;(o||!m)&&([h,f]=Yl(d[0],d[1])),o?p=new NG(c,m):p=new by(c,m);let g=m?[f,h]:d,y=this.makeTensorInfo(g,n),A=this.texData.get(y.dataId);m?A.usage=un.PIXELS:A.usage=un.UPLOAD,A.texShape=g,this.gpgpu.uploadDenseMatrixToTexture(this.getTexture(y.dataId),h,f,r);let x=[[f,h]],b=!0,w=this.runWebGLProgram(p,[y],n,x,b),S=this.texData.get(w.dataId);t.texShape=S.texShape,t.isPacked=S.isPacked,t.usage=S.usage,V().get("ENGINE_COMPILE_ONLY")?this.disposeData(w.dataId):(t.texture=S.texture,t.values=null,this.texData.delete(w.dataId)),this.disposeIntermediateTensorInfo(y),l&&(this.uploadWaitMs+=v.now()-u)}else{let c=this.acquireTexture(d,i,n,o);t.texture=c}}convertAndCacheOnCPU(e,t){let a=this.texData.get(e),{dtype:n}=a;return this.releaseGPUData(e),t!=null&&(a.values=UU(t,n)),a.values}acquireTexture(e,t,a,n){if(this.numBytesInGPU+=this.computeBytes(e,a),!this.warnedAboutMemory&&this.numBytesInGPU>this.numMBBeforeWarning*1024*1024){let r=(this.numBytesInGPU/1024/1024).toFixed(2);this.warnedAboutMemory=!0,console.warn(`High memory usage in GPU: ${r} MB, most likely due to a memory leak`)}return this.textureManager.acquireTexture(e,t,n)}computeBytes(e,t){return e[0]*e[1]*v.bytesPerElement(t)}checkCompileCompletion(){for(let[,e]of Object.entries(this.binaryCache))this.checkCompletion_(e)}async checkCompileCompletionAsync(){let e=[];if(this.gpgpu.parallelCompilationExtension){for(let[,t]of Object.entries(this.binaryCache))e.push(this.checkCompletionAsync_(t));return Promise.all(e)}else{for(let[,t]of Object.entries(this.binaryCache)){let a=new Promise(n=>{try{this.checkCompletion_(t),n(!0)}catch(r){throw r}});e.push(a)}return Promise.all(e)}}async checkCompletionAsync_(e){return this.gpgpu.gl.getProgramParameter(e.webGLProgram,this.gpgpu.parallelCompilationExtension.COMPLETION_STATUS_KHR)?this.checkCompletion_(e):(await E4(),this.checkCompletionAsync_(e))}checkCompletion_(e){if(this.gpgpu.gl.getProgramParameter(e.webGLProgram,this.gpgpu.gl.LINK_STATUS)===!1)throw console.log(this.gpgpu.gl.getProgramInfoLog(e.webGLProgram)),this.gpgpu.gl.getShaderParameter(e.fragmentShader,this.gpgpu.gl.COMPILE_STATUS)===!1?(k3(e.source,this.gpgpu.gl.getShaderInfoLog(e.fragmentShader)),new Error("Failed to compile fragment shader.")):new Error("Failed to link vertex and fragment shaders.");return!0}getUniformLocations(){for(let[,e]of Object.entries(this.binaryCache)){let{uniformLocations:t,customUniformLocations:a,infLoc:n,nanLoc:r,inShapesLocations:s,inTexShapesLocations:i,outShapeLocation:o,outShapeStridesLocation:l,outTexShapeLocation:u}=R6(this.gpgpu,e.program,e.webGLProgram);e.uniformLocations=t,e.customUniformLocations=a,e.infLoc=n,e.nanLoc=r,e.inShapesLocations=s,e.inTexShapesLocations=i,e.outShapeLocation=o,e.outShapeStridesLocation=l,e.outTexShapeLocation=u}}createTensorFromTexture(e,t,a){let{texture:n,height:r,width:s,channels:i}=e,o=kt().backend;if(!o.gpgpu.gl.isTexture(n))throw new Error("The texture is invalid. Also, please make sure the texture and the TFJS WebGL backend are using the same canvas. If you want to use your own custom canvas, you have to create and use the custom TFJS WebGL backend created from the canvas through 'new tf.MathBackendWebGL(customCanvas)'.");let l=o.writeTexture(n,t,a,r,s,i);return kt().makeTensorFromDataId(l,t,a,o)}};nu.nextDataId=0;function UU(e,t){if(t==="float32"||t==="complex64")return e;if(t==="int32"||t==="bool"){let a=t==="int32"?new Int32Array(e.length):new Uint8Array(e.length);for(let n=0;nnew nu,2);var HU={forceHalfFloat:Q6},_3=` + if (isnan(a)) return a; + if (isnan(b)) return b; +`,cl=class{constructor(e,t,a){this.variableNames=["A","B"],this.outputShape=T.assertAndGetBroadcastShape(t,a),this.enableShapeUniforms=Na(this.outputShape.length),this.userCode=` + float binaryOperation(float a, float b) { + ${e} + } + + void main() { + float a = getAAtOutCoords(); + float b = getBAtOutCoords(); + setOutput(binaryOperation(a, b)); + } + `}},pp=` + result.r = isNaN.r ? NAN : result.r; + result.g = isNaN.g ? NAN : result.g; + result.b = isNaN.b ? NAN : result.b; + result.a = isNaN.a ? NAN : result.a; +`,cp=class{constructor(e,t,a,n=!1){this.variableNames=["A","B"],this.supportsBroadcasting=!0,this.packedInputs=!0,this.packedOutput=!0,this.outputShape=T.assertAndGetBroadcastShape(t,a);let r=this.outputShape.length;this.enableShapeUniforms=Na(r);let s="";if(n)if(r===0||v.sizeFromShape(this.outputShape)===1)s=` + result.y = 0.; + result.z = 0.; + result.w = 0.; + `;else if(s=` + ${mt(r)} coords = getOutputCoords(); + `,r===1)this.enableShapeUniforms?s+=` + result.y = (coords + 1) >= outShape ? 0. : result.y; + result.z = 0.; + result.w = 0.; + `:s+=` + result.y = (coords + 1) >= ${this.outputShape[0]} ? 0. : result.y; + result.z = 0.; + result.w = 0.; + `;else{let i=va("coords",r);this.enableShapeUniforms?s+=` + bool nextRowOutOfBounds = + (${i[r-2]} + 1) >= outShape[${r} - 2]; + bool nextColOutOfBounds = + (${i[r-1]} + 1) >= outShape[${r} - 1]; + result.y = nextColOutOfBounds ? 0. : result.y; + result.z = nextRowOutOfBounds ? 0. : result.z; + result.w = nextColOutOfBounds || nextRowOutOfBounds ? 0. : result.w; + `:s+=` + bool nextRowOutOfBounds = + (${i[r-2]} + 1) >= ${this.outputShape[r-2]}; + bool nextColOutOfBounds = + (${i[r-1]} + 1) >= ${this.outputShape[r-1]}; + result.y = nextColOutOfBounds ? 0. : result.y; + result.z = nextRowOutOfBounds ? 0. : result.z; + result.w = nextColOutOfBounds || nextRowOutOfBounds ? 0. : result.w; + `}this.userCode=` + vec4 binaryOperation(vec4 a, vec4 b) { + ${e} + } + + void main() { + vec4 a = getAAtOutCoords(); + vec4 b = getBAtOutCoords(); + + vec4 result = binaryOperation(a, b); + ${s} + + setOutput(result); + } + `}};function Za(e){let{inputs:t,backend:a}=e,{x:n}=t;return a.incRef(n.dataId),{dataId:n.dataId,shape:n.shape,dtype:n.dtype}}var qU={kernelName:Fi,backendName:"webgl",kernelFunc:Za};function ks(e){let{inputs:t,backend:a}=e,{real:n,imag:r}=t,s=a.makeTensorInfo(n.shape,"complex64"),i=a.texData.get(s.dataId),o=Za({inputs:{x:n},backend:a}),l=Za({inputs:{x:r},backend:a});return i.complexTensorInfos={real:o,imag:l},s}var XU={kernelName:Id,backendName:"webgl",kernelFunc:ks},e8="return (a < 0.) ? b * a : a;",t8=` + vec4 aLessThanZero = vec4(lessThan(a, vec4(0.))); + return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a); +`;function KU(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{alpha:s}=n,i=a.makeTensorInfo([],"float32",v.createScalarValue(s,"float32")),o=V().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new cp(t8,r.shape,i.shape):new cl(e8,r.shape,i.shape),l=a.runWebGLProgram(o,[r,i],"float32");return a.disposeIntermediateTensorInfo(i),l}var ZU={kernelName:Pi,backendName:"webgl",kernelFunc:KU},a8="return (a < 0.) ? b * a : a;",n8=` + vec4 aLessThanZero = vec4(lessThan(a, vec4(0.))); + return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a); +`;function YU(e){let{inputs:t,backend:a}=e,{x:n,alpha:r}=t,s=V().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new cp(n8,n.shape,r.shape):new cl(a8,n.shape,r.shape);return a.runWebGLProgram(s,[n,r],"float32")}var JU={kernelName:qi,backendName:"webgl",kernelFunc:YU},ru="if (isnan(x)) return x;";function Qe({opSnippet:e,packedOpSnippet:t,cpuKernelImpl:a,dtype:n}){return({inputs:r,backend:s})=>{let{x:i}=r,o=s,l=n||i.dtype;if(o.shouldExecuteOnCPU([i])&&a!=null){let c=o.texData.get(i.dataId),p=a(c.values,l);return o.makeTensorInfo(i.shape,l,p)}let u=V().getBool("WEBGL_PACK_UNARY_OPERATIONS")&&t!=null,d;return u?d=new Js(i.shape,t):d=new gr(i.shape,e),o.runWebGLProgram(d,[i],l)}}function la({opSnippet:e,packedOpSnippet:t,checkOutOfBounds:a=!1,supportsComplex:n=!1,cpuKernelImpl:r,dtype:s}){return({inputs:i,backend:o})=>{let{a:l,b:u}=i,d=o;if(n&&l.dtype==="complex64"){let f=d.texData.get(l.dataId),m=d.texData.get(u.dataId),[g,y]=[[f.complexTensorInfos.real,m.complexTensorInfos.real],[f.complexTensorInfos.imag,m.complexTensorInfos.imag]].map(x=>{let[b,w]=x,S={dataId:b.dataId,dtype:b.dtype,shape:l.shape},C={dataId:w.dataId,dtype:w.dtype,shape:u.shape},N=new cl(e,l.shape,u.shape);return d.runWebGLProgram(N,[S,C],ra(b.dtype,w.dtype))}),A=ks({inputs:{real:g,imag:y},backend:d});return d.disposeIntermediateTensorInfo(g),d.disposeIntermediateTensorInfo(y),A}let c=s||ra(l.dtype,u.dtype);if((l.dtype==="string"||u.dtype==="string"||d.shouldExecuteOnCPU([l,u]))&&r!=null){let f=d.texData.get(l.dataId).values,m=d.texData.get(u.dataId).values,g=l.dtype==="string"?T.fromUint8ToStringArray(f):f,y=l.dtype==="string"?T.fromUint8ToStringArray(m):m,[A,x]=r(l.shape,u.shape,g,y,c),b=d.makeTensorInfo(x,c),w=d.texData.get(b.dataId);return w.values=A,b}let p=V().getBool("WEBGL_PACK_BINARY_OPERATIONS")&&t!=null,h;return p?h=new cp(t,l.shape,u.shape,a):h=new cl(e,l.shape,u.shape),d.runWebGLProgram(h,[l,u],c)}}function ud(e,t=!1){if(e==="linear")return t?MU:TU;if(e==="relu")return t?_U:NU;if(e==="elu")return t?$U:CU;if(e==="relu6")return t?FU:EU;if(e==="prelu")return t?n8:a8;if(e==="leakyrelu")return t?t8:e8;if(e==="sigmoid")return t?PU:RU;throw new Error(`Activation ${e} has not been implemented for the WebGL backend.`)}var r8=class{constructor(e,t,a,n=!1,r=!1,s=!1,i=null,o=!1,l=!1){this.variableNames=["matrixA","matrixB"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=a,this.enableShapeUniforms=Na(this.outputShape.length);let u=n?e[1]:e[2],d=Math.ceil(u/2),c=n?"i * 2, rc.y":"rc.y, i * 2",p=r?"rc.z, i * 2":"i * 2, rc.z",h=n?["a.xxyy","a.zzww"]:["a.xxzz","a.yyww"],f=r?["b.xzxz","b.ywyw"]:["b.xyxy","b.zwzw"],m="",g="";i&&(o?m=`vec4 activation(vec4 a) { + vec4 b = getPreluActivationWeightsAtOutCoords(); + ${i} + }`:l?m=`vec4 activation(vec4 a) { + vec4 b = getLeakyreluAlphaAtOutCoords(); + ${i} + }`:m=`vec4 activation(vec4 x) { + ${i} + }`,g="result = activation(result);");let y=s?"result += getBiasAtOutCoords();":"";s&&this.variableNames.push("bias"),o&&this.variableNames.push("preluActivationWeights"),l&&this.variableNames.push("leakyreluAlpha");let A="rc.x",x="rc.x";e[0]`The new shape (${l}) has ${u} elements and the old shape (${r.shape}) has ${o} elements. The new shape and old shape must have the same number of elements.`);let d=i.texData.get(r.dataId);return d.isPacked&&!ld(r.shape,l)&&!(d.texture!==null&&ld(d.shape,l))?ej(r,l,i):(i.incRef(r.dataId),{dataId:r.dataId,shape:l,dtype:r.dtype})}var tj={kernelName:Fl,backendName:"webgl",kernelFunc:de},Ny=class{constructor(e,t){this.variableNames=["x"];let{windowSize:a,batchSize:n,inSize:r,outSize:s}=e;this.outputShape=[n,s];let i=Math.floor(a/4)*4,o=a%4,l="sumValue += dot(values, ones);";if(t!=null){let d=1/t;l=`sumValue += dot(values * ${v.isInt(d)?d.toPrecision(2):d}, ones);`}let u="";r%a>0&&(u=` + if (inIdx < 0 || inIdx >= ${r}) { + return 0.0; + } + `),this.userCode=` + const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0); + + float getValue(int batch, int inIdx) { + ${u} + return getX(batch, inIdx); + } + + void main() { + ivec2 coords = getOutputCoords(); + int batch = coords[0]; + int outIdx = coords[1]; + int inOffset = outIdx * ${a}; + + float sumValue = 0.0; + + for (int i = 0; i < ${i}; i += 4) { + int inIdx = inOffset + i; + vec4 values = vec4( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + getValue(batch, inIdx + 2), + getValue(batch, inIdx + 3) + ); + + ${l} + } + + int inIdx = inOffset + ${i}; + if (${o===1}) { + vec4 values = vec4(getValue(batch, inIdx), 0.0, 0.0, 0.0); + + ${l} + } else if (${o===2}) { + vec4 values = vec4( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), 0.0, 0.0); + + ${l} + } else if (${o===3}) { + vec4 values = vec4( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + getValue(batch, inIdx + 2), 0.0); + + ${l} + } + setOutput(sumValue); + } + `}},aj=class{constructor(e,t){this.variableNames=["x"];let{windowSize:a,batchSize:n,inSize:r,outSize:s}=e;this.outputShape=[n,s];let i="0.0",o="";t==="prod"?i="1.0":t==="min"?(i="1.0 / 1e-20",o="min"):t==="max"&&(i="-1.0 / 1e-20",o="max");let l=`${t}(${t}(${t}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`;t==="sum"?l="sumValue":t==="prod"?l="prodValue":t==="all"?l="allValue":t==="any"&&(l="anyValue");let u=Math.floor(a/4)*4,d=a%4,c=` + if (${t==="sum"}) { + sumValue += dot(values, ones); + } else if (${t==="prod"}) { + vec2 tmp = vec2(values[0], values[1]) * vec2(values[2], values[3]); + prodValue *= tmp[0] * tmp[1]; + } else { + minMaxValue = ${o}(values, minMaxValue); + if (${t==="min"} || ${t==="max"}) { + minMaxValue = ${o}(values, minMaxValue); + bvec4 isNaN = isnan(values); + if (isNaN.r || isNaN.g || isNaN.b || isNaN.a) { + minMaxValue = vec4(NAN); + } + } + } + `,p="vec4";t==="all"?(i="1.0",c=` + bool reducedAllValue = all(values); + float floatedReducedAllValue = float(reducedAllValue); + allValue = float(allValue >= 1.0 && floatedReducedAllValue >= 1.0); + `,p="bvec4"):t==="any"&&(i="0.0",c=` + bool reducedAnyValue = any(values); + float floatedReducedAnyValue = float(reducedAnyValue); + anyValue = float(anyValue >= 1.0 || floatedReducedAnyValue >= 1.0); + `,p="bvec4");let h="";r%a>0&&(h=` + if (inIdx < 0 || inIdx >= ${r}) { + return initializationValue; + } + `),this.userCode=` + const float initializationValue = ${i}; + const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0); + + float getValue(int batch, int inIdx) { + ${h} + return getX(batch, inIdx); + } + + void main() { + ivec2 coords = getOutputCoords(); + int batch = coords[0]; + int outIdx = coords[1]; + int inOffset = outIdx * ${a}; + + vec4 minMaxValue = vec4(${i}); + float prodValue = 1.0; + float sumValue = 0.0; + float allValue = 1.0; + float anyValue = 0.0; + + for (int i = 0; i < ${u}; i += 4) { + int inIdx = inOffset + i; + ${p} values = ${p}( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + getValue(batch, inIdx + 2), + getValue(batch, inIdx + 3) + ); + + ${c} + } + + int inIdx = inOffset + ${u}; + if (${d===1}) { + ${p} values = ${p}( + getValue(batch, inIdx), + initializationValue, + initializationValue, + initializationValue + ); + + ${c} + } else if (${d===2}) { + ${p} values = ${p}( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + initializationValue, + initializationValue + ); + + ${c} + } else if (${d===3}) { + ${p} values = ${p}( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + getValue(batch, inIdx + 2), + initializationValue + ); + + ${c} + } + setOutput(${l}); + } + `}};function nj(e){let t=[];for(;t.length===0||t[t.length-1].outSize!==1;){let a=t.length?t[t.length-1].outSize:e[1],n=T.computeOptimalWindowSize(a);t.push({inSize:a,windowSize:n,outSize:Math.ceil(a/n)})}return t}function fo(e,t,a,n){let r=nj(e.shape),s=e;for(let i=0;i6)throw Error(`Transpose for rank ${t} is not yet supported`);let a=["resRC.x","resRC.y","resRC.z","resRC.w","resRC.u","resRC.v"],n=new Array(t);for(let r=0;r6)throw Error(`Packed transpose for rank ${this.rank} is not yet supported.`);let n=mt(this.rank),r=Y6("rc",this.rank),s=new Array(this.rank);for(let u=0;u`Error in matMul: inner shapes (${c}) and (${p}) of Tensors with shapes ${e.shape} and ${t.shape} and transposeA=${a} and transposeB=${n} must match.`);let b=a?[y,c,h]:[y,h,c],w=n?[A,f,p]:[A,p,f],S=de({inputs:{x:e},backend:r,attrs:{shape:b}}),C=de({inputs:{x:t},backend:r,attrs:{shape:w}}),N=[S,C],_=Math.max(y,A),$=a?S.shape[1]:S.shape[2],M=s!=null,I=i!=null,E=l==="leakyrelu",O=l!=null?ud(l,!0):null,L=M||I||E||O!=null,B;if((h===1||f===1)&&$>s8&&L===!1){let j=S,U=C;a&&(j=Ia({inputs:{x:S},backend:r,attrs:{perm:[0,2,1]}}),N.push(j)),n&&(U=Ia({inputs:{x:C},backend:r,attrs:{perm:[0,2,1]}}),N.push(U));let H=f!==1,W=f===1,Q=j;H&&(Q=de({inputs:{x:j},backend:r,attrs:{shape:[_,$,1]}}),N.push(Q));let Z=f===1?2:1,re=U;W&&(re=de({inputs:{x:U},backend:r,attrs:{shape:[_,1,$]}}),N.push(re));let ee=F3({inputs:{a:Q,b:re},backend:r});B=Bh({inputs:{x:ee},backend:r,attrs:{axis:Z,keepDims:!0}}),N.push(ee)}else{let j=ra(e.dtype,t.dtype),U=new r8(b,w,[_,h,f],a,n,M,O,I,E),H=[S,C];if(s!=null&&H.push(s),I&&H.push(i),E){let W=r.makeTensorInfo([],"float32",v.createScalarValue(o,"float32"));H.push(W),N.push(W)}B=r.runWebGLProgram(U,H,j)}let G=de({inputs:{x:B},backend:r,attrs:{shape:x}});N.push(B);for(let j of N)r.disposeIntermediateTensorInfo(j);return G}function dj(e){let{inputs:t,backend:a,attrs:n}=e,{a:r,b:s,bias:i,preluActivationWeights:o}=t,{transposeA:l,transposeB:u,activation:d,leakyreluAlpha:c}=n;return Pc({a:r,b:s,transposeA:l,transposeB:u,backend:a,bias:i,preluActivationWeights:o,leakyreluAlpha:c,activation:d})}var pj={kernelName:Ur,backendName:"webgl",kernelFunc:dj},Ey="return abs(x);";function cj(e){let{inputs:t,backend:a}=e,{x:n}=t;if(a.shouldExecuteOnCPU([n])&&n.dtype!=="complex64"){let s=a.texData.get(n.dataId),i=K6(s.values);return a.makeTensorInfo(n.shape,n.dtype,i)}let r;return V().getBool("WEBGL_PACK_UNARY_OPERATIONS")?r=new Js(n.shape,Ey):r=new gr(n.shape,Ey),a.runWebGLProgram(r,[n],n.dtype)}var hj={kernelName:gl,backendName:"webgl",kernelFunc:cj},fj=Cn+` + if (abs(x) > 1.) { + return NAN; + } + return acos(x); +`,mj=Qe({opSnippet:fj}),gj={kernelName:yd,backendName:"webgl",kernelFunc:mj},yj=Cn+` + if (x < 1.0) return NAN; +return log(x + sqrt(x * x - 1.0));`,Aj=Qe({opSnippet:yj}),xj={kernelName:Ad,backendName:"webgl",kernelFunc:Aj},Ry="return a + b;",bj=la({opSnippet:Ry,packedOpSnippet:Ry,supportsComplex:!0,cpuKernelImpl:RG}),vj={kernelName:vr,backendName:"webgl",kernelFunc:bj},wj=class{constructor(e,t){this.outputShape=[],this.outputShape=e,this.variableNames=t.map((r,s)=>`T${s}`);let a=[];this.variableNames.forEach(r=>{a.push(`float v${r} = get${r}AtOutCoords();`)});let n=this.variableNames.map(r=>`v${r}`).join(" + ");this.userCode=` + void main() { + ${a.join(` + `)} + + float result = ${n}; + setOutput(result); + } + `}},kj=class{constructor(e,t){this.outputShape=[],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e,this.variableNames=t.map((r,s)=>`T${s}`);let a=[];this.variableNames.forEach(r=>{a.push(`vec4 v${r} = get${r}AtOutCoords();`)});let n=this.variableNames.map(r=>`v${r}`).join(" + ");this.userCode=` + void main() { + ${a.join(` + `)} + + vec4 result = ${n}; + setOutput(result); + } + `}};function Ac(e){let{inputs:t,backend:a}=e,n=t;if(n.length===1)return Za({inputs:{x:n[0]},backend:a});if(n.length>V().get("WEBGL_MAX_TEXTURES_IN_SHADER")){let o=Math.floor(n.length/2),l=Ac({inputs:n.slice(0,o),backend:a}),u=Ac({inputs:n.slice(o),backend:a});return Ac({inputs:[l,u],backend:a})}let r=n.map(o=>o.dtype).reduce((o,l)=>ra(o,l)),s=n.map(o=>o.shape),i=V().getBool("WEBGL_PACK")?new kj(n[0].shape,s):new wj(n[0].shape,s);return a.runWebGLProgram(i,n,r)}var Ij={kernelName:hi,backendName:"webgl",kernelFunc:Ac};function Sj(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{axis:s,keepDims:i}=n,o=r.shape.length,l=v.parseAxisParam(s,r.shape),u=l,d=T.getAxesPermutation(u,o),c=r;d!=null&&(c=Ia({inputs:{x:r},backend:a,attrs:{perm:d}}),u=T.getInnerMostAxes(u.length,o)),T.assertAxesAreInnerMostDims("all",u,o);let[p,h]=T.computeOutAndReduceShapes(c.shape,u),f=v.sizeFromShape(h),m=de({inputs:{x:c},backend:a,attrs:{shape:[-1,f]}}),g=fo(m,m.dtype,"all",a),y;if(i){let A=T.expandShapeToKeepDim(p,l);y=de({inputs:{x:g},backend:a,attrs:{shape:A}})}else y=de({inputs:{x:g},backend:a,attrs:{shape:p}});return a.disposeIntermediateTensorInfo(m),a.disposeIntermediateTensorInfo(g),d!=null&&a.disposeIntermediateTensorInfo(c),y}var Tj={kernelName:yl,backendName:"webgl",kernelFunc:Sj};function Cj(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{axis:s,keepDims:i}=n,o=r.shape.length,l=v.parseAxisParam(s,r.shape),u=l,d=T.getAxesPermutation(u,o),c=r;d!=null&&(c=Ia({inputs:{x:r},backend:a,attrs:{perm:d}}),u=T.getInnerMostAxes(u.length,o)),T.assertAxesAreInnerMostDims("any",u,o);let[p,h]=T.computeOutAndReduceShapes(c.shape,u),f=v.sizeFromShape(h),m=de({inputs:{x:c},backend:a,attrs:{shape:[-1,f]}}),g=fo(m,m.dtype,"any",a),y;if(i){let A=T.expandShapeToKeepDim(p,l);y=de({inputs:{x:g},backend:a,attrs:{shape:A}})}else y=de({inputs:{x:g},backend:a,attrs:{shape:p}});return a.disposeIntermediateTensorInfo(m),a.disposeIntermediateTensorInfo(g),d!=null&&a.disposeIntermediateTensorInfo(c),y}var Nj={kernelName:Al,backendName:"webgl",kernelFunc:Cj},Ej=class{constructor(e,t,a){this.variableNames=["A"];let{windowSize:n,batchSize:r,outSize:s}=e;a||this.variableNames.push("bestIndicesA"),this.outputShape=[r,s];let i=t==="max"?">":"<",o=a?"inOffset + i;":"round(getBestIndicesA(batch, inOffset + i));";this.userCode=` + void main() { + ivec2 coords = getOutputCoords(); + int batch = coords[0]; + int outIdx = coords[1]; + int inOffset = outIdx * ${n}; + + int bestIndex = inOffset; + float bestValue = getA(batch, bestIndex); + + for (int i = 0; i < ${n}; i++) { + int inIdx = ${o}; + float candidate = getA(batch, inIdx); + if (candidate ${i} bestValue) { + bestValue = candidate; + bestIndex = inIdx; + } + } + setOutput(float(bestIndex)); + } + `}},Rj=class{constructor(e,t,a,n){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,v.assert(e.length>2,()=>`Packed arg${a.charAt(0).toUpperCase()+a.slice(1)} supports only inputs with rank above 2.`);let r=e[e.length-1],s=Math.ceil(r/t);this.outputShape=e.slice(0,-1),s>1&&this.outputShape.push(s),n||this.variableNames.push("bestIndicesA");let i=this.outputShape,o=i.length,l=mt(o),u=va("coords",o),d,c;if(s===1){c=o+1;let C=mt(c);d=` + ${C} sourceLocR = ${C}(${u.join()}, 0); + ++${u[o-1]}; + ${C} sourceLocG = ${C}(${u.join()}, 0); + ++${u[o-2]}; + ${C} sourceLocA = ${C}(${u.join()}, 0); + --${u[o-1]}; + ${C} sourceLocB = ${C}(${u.join()}, 0); + --${u[o-2]};`}else c=o,d=` + ${l} sourceLocR = coords; + ++${u[o-1]}; + ${l} sourceLocG = coords; + ++${u[o-2]}; + ${l} sourceLocA = coords; + --${u[o-1]}; + ${l} sourceLocB = coords; + --${u[o-2]};`;let p=["x","y","z","w","u","v"].slice(0,c),h="."+p[c-1],f=p.map(C=>"int "+C),m=va("sourceLocR",c-1).concat("inIdx.r"),g=va("sourceLocG",c-1).concat("inIdx.g"),y=va("sourceLocB",c-1).concat("inIdx.b"),A=va("sourceLocA",c-1).concat("inIdx.a"),x=a==="max"?"greaterThan":"lessThan",b=n?"":` + inIdx = round(vec4(getBestIndicesAChannel(${m.join()}), + getBestIndicesAChannel(${g.join()}), + getBestIndicesAChannel(${y.join()}), + getBestIndicesAChannel(${A.join()})));`,w=`vec4( + getAChannel(${m.join()}), + hasNextCol ? getAChannel(${g.join()}) : 0., + hasNextRow ? getAChannel(${y.join()}) : 0., + hasNextRow && hasNextCol ? getAChannel(${A.join()}) : 0.)`,S=n?"":` + float getBestIndicesAChannel(${f.join()}) { + return getChannel(getBestIndicesA(${p.join()}), + vec2(${p.slice(-2).join()})); + }`;this.userCode=` + float getAChannel(${f.join()}) { + return getChannel(getA(${p.join()}), + vec2(${p.slice(-2).join()})); + } + ${S} + void main() { + ${l} coords = getOutputCoords(); + bool hasNextCol = ${u[o-1]} < ${i[o-1]-1}; + bool hasNextRow = ${u[o-2]} < ${i[o-2]-1}; + ${d} + ivec4 srcIdx = ivec4(sourceLocR${h}, sourceLocG${h}, + sourceLocB${h}, sourceLocA${h}) * ${t}; + ivec4 inIdx = srcIdx; + vec4 bestIndex = vec4(inIdx); + vec4 bestValue = ${w}; + + for (int i = 0; i < ${t}; i++) { + inIdx = srcIdx; + ${b} + vec4 candidate = ${w}; + bvec4 nan = isnan(candidate); + bvec4 replace = bvec4( + vec4(${x}(candidate, bestValue)) * (vec4(1.0) - vec4(nan))); + + bestValue = vec4(replace.x ? candidate.x : bestValue.x, + replace.y ? candidate.y : bestValue.y, + replace.z ? candidate.z : bestValue.z, + replace.w ? candidate.w : bestValue.w); + bestIndex = mix(bestIndex, vec4(inIdx), vec4(replace)); + srcIdx++; + } + setOutput(bestIndex); + } + `}};function i8(e,t,a,n=null){let r=t.shape[0],s=t.shape[1];n!=null&&(r=n.shape[0],s=n.shape[1]);let i=T.computeOptimalWindowSize(s),o={windowSize:i,inSize:s,batchSize:r,outSize:Math.ceil(s/i)},l=new Ej(o,a,n==null),u=[t];n!=null&&u.push(n);let d=e.runWebGLProgram(l,u,"int32");if(d.shape[1]===1)return d;let c=i8(e,t,a,d);return e.disposeIntermediateTensorInfo(d),c}function o8(e,t,a,n=null){let r=n!=null?n.shape:t.shape,s=r[r.length-1],i=T.computeOptimalWindowSize(s),o=new Rj(r,i,a,n==null),l=n==null?[t]:[t,n],u=e.runWebGLProgram(o,l,"int32");if(u.shape.length===t.shape.length){let d=o8(e,t,a,u);return e.disposeIntermediateTensorInfo(u),d}return u}function l8(e,t,a,n){let r=[a];if(T.assertAxesAreInnerMostDims("arg"+n.charAt(0).toUpperCase()+n.slice(1),r,t.shape.length),!V().getBool("WEBGL_PACK_REDUCE")||t.shape.length<=2){let s=[],i=e.texData.get(t.dataId),o=i!==null&&i.isPacked,l=t;o&&(l=e.unpackTensor(t),s.push(l));let[u,d]=T.computeOutAndReduceShapes(l.shape,r),c=v.sizeFromShape(d),p=de({inputs:{x:l},backend:e,attrs:{shape:[-1,c]}});s.push(p);let h=i8(e,p,n);s.push(h);let f=de({inputs:{x:h},backend:e,attrs:{shape:u}});return s.forEach(m=>e.disposeIntermediateTensorInfo(m)),f}return o8(e,t,n)}function Mj(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{axis:s}=n,i=v.parseAxisParam(s,r.shape),o=T.getAxesPermutation(i,r.shape.length),l=r,u=[];o!=null&&(l=Ia({inputs:{x:r},backend:a,attrs:{perm:o}}),u.push(l),i=T.getInnerMostAxes(i.length,l.shape.length)),T.assertAxesAreInnerMostDims("argMax",[i[0]],l.shape.length);let d=l8(a,l,i[0],"max");return u.forEach(c=>a.disposeIntermediateTensorInfo(c)),d}var $j={kernelName:fi,backendName:"webgl",kernelFunc:Mj};function _j(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{axis:s}=n,i=v.parseAxisParam(s,r.shape),o=T.getAxesPermutation(i,r.shape.length),l=r,u=[];o!=null&&(l=Ia({inputs:{x:r},backend:a,attrs:{perm:o}}),u.push(l),i=T.getInnerMostAxes(i.length,l.shape.length)),T.assertAxesAreInnerMostDims("argMin",[i[0]],l.shape.length);let d=l8(a,l,i[0],"min");return u.forEach(c=>a.disposeIntermediateTensorInfo(c)),d}var Fj={kernelName:xd,backendName:"webgl",kernelFunc:_j},Pj=Cn+` + if (abs(x) > 1.) { + return NAN; + } + return asin(x); +`,Oj=Qe({opSnippet:Pj}),Dj={kernelName:bd,backendName:"webgl",kernelFunc:Oj},zj=Cn+"return log(x + sqrt(x * x + 1.0));",Lj=Qe({opSnippet:zj}),Bj={kernelName:vd,backendName:"webgl",kernelFunc:Lj},Wj=Cn+` + return atan(x); +`,Vj=Qe({opSnippet:Wj}),Gj={kernelName:wd,backendName:"webgl",kernelFunc:Vj},Uj=_3+` + return atan(a, b); +`,jj=` + vec4 result = atan(a, b); + bvec4 isNaNA = isnan(a); + bvec4 isNaNB = isnan(b); + bvec4 isNaN = bvec4(isNaNA.x || isNaNB.x, isNaNA.y || isNaNB.y, isNaNA.z || isNaNB.z, isNaNA.w || isNaNB.w); + `+pp+` + return result; +`,Hj=la({opSnippet:Uj,packedOpSnippet:jj}),qj={kernelName:xl,backendName:"webgl",kernelFunc:Hj},Xj=Cn+` + if ((x < -1.0) || (x > 1.0)) return NAN; +return (log(1.0 + x) - log(1.0 - x)) / 2.0;`,Kj=Qe({opSnippet:Xj}),Zj={kernelName:kd,backendName:"webgl",kernelFunc:Kj},dd=class{constructor(e,t,a,n=!1,r=!1){if(this.variableNames=["x"],t==="avg"&&a)throw new Error("Cannot compute positions for average pool.");let s=e.filterWidth,i=e.strideHeight,o=e.strideWidth,l=e.dilationHeight,u=e.dilationWidth,d=e.effectiveFilterHeight,c=e.effectiveFilterWidth,p=e.padInfo.top,h=e.padInfo.left;this.outputShape=e.outShape;let f=t==="avg",m=`((batch * ${e.inHeight} + xR) * ${e.inWidth} + xC) * ${e.inChannels} + d`,g=`(xR * ${e.inWidth} + xC) * ${e.inChannels} + d`,y="0.0";if(f||(y="-1.0 / 1e-20"),a){let C=">=";this.userCode=` + const ivec2 strides = ivec2(${i}, ${o}); + const ivec2 pads = ivec2(${p}, ${h}); + + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords[0]; + int d = coords[3]; + + ivec2 xRCCorner = coords.yz * strides - pads; + int xRCorner = xRCCorner.x; + int xCCorner = xRCCorner.y; + + // max/min x(?, ?, d) to get y(yR, yC, d). + // ? = to be determined + float minMaxValue = 0.0; + float minMaxValueFound = 0.0; + int minMaxPosition = 0; + float avgValue = 0.0; + + for (int wR = 0; wR < ${d}; + wR += ${l}) { + int xR = xRCorner + wR; + + if (xR < 0 || xR >= ${e.inHeight}) { + continue; + } + + for (int wC = 0; wC < ${c}; + wC += ${u}) { + int xC = xCCorner + wC; + + if (xC < 0 || xC >= ${e.inWidth}) { + continue; + } + + float value = getX(batch, xR, xC, d); + + // If a min / max value has already been found, use it. If not, + // use the current value. + float currMinMaxValue = mix( + value, minMaxValue, minMaxValueFound); + if (value ${C} currMinMaxValue) { + minMaxValue = value; + minMaxValueFound = 1.0; + minMaxPosition = ${n?r?m:g:`wR * ${c} + wC`}; + } + } + } + setOutput(float(minMaxPosition)); + } + `;return}let A="max",x=`${t}(${t}(${t}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`;t==="avg"&&(x="avgValue / count");let b=Math.floor(s/4)*4,w=s%4,S=` + if (${f}) { + avgValue += dot(values, ones); + } else { + minMaxValue = ${A}(values, minMaxValue); + } + `;this.userCode=` + const ivec2 strides = ivec2(${i}, ${o}); + const ivec2 pads = ivec2(${p}, ${h}); + const float initializationValue = ${y}; + const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0); + + float count = 0.0; + + float getValue(int batch, int xR, int xC, int d) { + if (xC < 0 || xC >= ${e.inWidth}) { + return initializationValue; + } + count += 1.0; + return getX(batch, xR, xC, d); + } + + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords[0]; + int d = coords[3]; + + ivec2 xRCCorner = coords.yz * strides - pads; + int xRCorner = xRCCorner.x; + int xCCorner = xRCCorner.y; + + // max/min x(?, ?, d) to get y(yR, yC, d). + // ? = to be determined + vec4 minMaxValue = vec4(${y}); + float avgValue = 0.0; + count = 0.0; + + for (int wR = 0; wR < ${d}; + wR += ${l}) { + int xR = xRCorner + wR; + + if (xR < 0 || xR >= ${e.inHeight}) { + continue; + } + + for (int wC = 0; wC < ${b}; wC += 4) { + int xC = xCCorner + wC * ${u}; + + vec4 values = vec4( + getValue(batch, xR, xC, d), + getValue(batch, xR, xC + ${u}, d), + getValue(batch, xR, xC + 2 * ${u}, d), + getValue(batch, xR, xC + 3 * ${u}, d) + ); + + ${S} + } + + int xC = xCCorner + ${b}; + if (${w===1}) { + vec4 values = vec4( + getValue(batch, xR, xC, d), + initializationValue, + initializationValue, + initializationValue + ); + + ${S} + } else if (${w===2}) { + vec4 values = vec4( + getValue(batch, xR, xC, d), + getValue(batch, xR, xC + ${u}, d), + initializationValue, + initializationValue + ); + + ${S} + } else if (${w===3}) { + vec4 values = vec4( + getValue(batch, xR, xC, d), + getValue(batch, xR, xC + ${u}, d), + getValue(batch, xR, xC + 2 * ${u}, d), + initializationValue + ); + + ${S} + } + } + setOutput(${x}); + } + `}},P3=class{constructor(e,t,a,n=!1,r=!1){if(this.variableNames=["x"],t==="avg"&&a)throw new Error("Cannot compute positions for average pool.");let s=e.filterWidth,i=e.strideDepth,o=e.strideHeight,l=e.strideWidth,u=e.dilationDepth,d=e.dilationHeight,c=e.dilationWidth,p=e.effectiveFilterDepth,h=e.effectiveFilterHeight,f=e.effectiveFilterWidth,m=e.padInfo.front,g=e.padInfo.top,y=e.padInfo.left;this.outputShape=e.outShape;let A=t==="avg",x="0.0";if(A||(x="-1.0 / 1e-20"),a){let _=">=";this.userCode=` + const ivec3 strides = + ivec3(${i}, ${o}, ${l}); + const ivec3 pads = ivec3(${m}, ${g}, ${y}); + + void main() { + ivec5 coords = getOutputCoords(); + int batch = coords.x; + int ch = coords.u; + + ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads; + int xDCorner = xCorner.x; + int xRCorner = xCorner.y; + int xCCorner = xCorner.z; + + // max/min x(?, ?, ?, ch) to get y(yD, yR, yC, ch). + // ? = to be determined + float minMaxValue = 0.0; + float minMaxValueFound = 0.0; + int minMaxPosition = 0; + + for (int wD = 0; wD < ${p}; + wD += ${u}) { + int xD = xDCorner + wD; + + if (xD < 0 || xD >= ${e.inDepth}) { + continue; + } + + for (int wR = 0; wR < ${h}; + wR += ${d}) { + int xR = xRCorner + wR; + + if (xR < 0 || xR >= ${e.inHeight}) { + continue; + } + + for (int wC = 0; wC < ${f}; + wC += ${c}) { + int xC = xCCorner + wC; + + if (xC < 0 || xC >= ${e.inWidth}) { + continue; + } + + float value = getX(batch, xD, xR, xC, ch); + + // If a min / max value has already been found, use it. If not, + // use the current value. + float currMinMaxValue = mix( + value, minMaxValue, minMaxValueFound); + if (value ${_} currMinMaxValue) { + minMaxValue = value; + minMaxValueFound = 1.0; + minMaxPosition = ${n?r?`(((batch * ${e.inDepth} + xD) * ${e.inHeight} + xR) * ${e.inWidth} + xC) * ${e.inChannels} + ch`:`((xD * ${e.inHeight} + xR) * ${e.inWidth} + xC) * ${e.inChannels} + ch`:`wD * ${h} * ${f} + + wR * ${f} + wC`}; + } + } + } + } + setOutput(float(minMaxPosition)); + } + `;return}let b="max",w=`${t}(${t}(${t}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`;t==="avg"&&(w="avgValue / count");let S=Math.floor(s/4)*4,C=s%4,N=` + if (${A}) { + avgValue += dot(values, ones); + } else { + minMaxValue = ${b}(values, minMaxValue); + } + `;this.userCode=` + const ivec3 strides = + ivec3(${i}, ${o}, ${l}); + const ivec3 pads = ivec3(${m}, ${g}, ${y}); + const float initializationValue = ${x}; + const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0); + + float count = 0.0; + + float getValue(int batch, int xD, int xR, int xC, int ch) { + if (xC < 0 || xC >= ${e.inWidth}) { + return initializationValue; + } + count += 1.0; + return getX(batch, xD, xR, xC, ch); + } + + void main() { + ivec5 coords = getOutputCoords(); + int batch = coords.x; + int ch = coords.u; + + ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads; + int xDCorner = xCorner.x; + int xRCorner = xCorner.y; + int xCCorner = xCorner.z; + + // max/min x(?, ?, ?, d) to get y(yD, yR, yC, ch). + // ? = to be determined + vec4 minMaxValue = vec4(${x}); + float avgValue = 0.0; + count = 0.0; + + for (int wD = 0; wD < ${p}; + wD += ${u}) { + int xD = xDCorner + wD; + + if (xD < 0 || xD >= ${e.inDepth}) { + continue; + } + + for (int wR = 0; wR < ${h}; + wR += ${d}) { + int xR = xRCorner + wR; + + if (xR < 0 || xR >= ${e.inHeight}) { + continue; + } + + for (int wC = 0; wC < ${S}; wC += 4) { + int xC = xCCorner + wC * ${c}; + + vec4 values = vec4( + getValue(batch, xD, xR, xC, ch), + getValue(batch, xD, xR, xC + ${c}, ch), + getValue(batch, xD, xR, xC + 2 * ${c}, ch), + getValue(batch, xD, xR, xC + 3 * ${c}, ch) + ); + + ${N} + } + + int xC = xCCorner + ${S}; + if (${C===1}) { + vec4 values = vec4( + getValue(batch, xD, xR, xC, ch), + initializationValue, + initializationValue, + initializationValue + ); + + ${N} + } else if (${C===2}) { + vec4 values = vec4( + getValue(batch, xD, xR, xC, ch), + getValue(batch, xD, xR, xC + ${c}, ch), + initializationValue, + initializationValue + ); + + ${N} + } else if (${C===3}) { + vec4 values = vec4( + getValue(batch, xD, xR, xC, ch), + getValue(batch, xD, xR, xC + ${c}, ch), + getValue(batch, xD, xR, xC + 2 * ${c}, ch), + initializationValue + ); + + ${N} + } + } + setOutput(${w}); + } + } + `}};function Yj(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t;Jl(r,"avgPool");let{filterSize:s,strides:i,pad:o,dimRoundingMode:l}=n,u=1;v.assert(T.eitherStridesOrDilationsAreOne(i,u),()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${i} and dilations '${u}'`);let d=T.computePool2DInfo(r.shape,s,i,u,o,l);if(d.filterWidth===1&&d.filterHeight===1&&v.arraysEqual(d.inShape,d.outShape))return Za({inputs:{x:r},backend:a});let c=new dd(d,"avg",!1);return a.runWebGLProgram(c,[r],"float32")}var Jj={kernelName:mi,backendName:"webgl",kernelFunc:Yj};function Qj(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{filterSize:s,strides:i,pad:o,dimRoundingMode:l,dataFormat:u}=n,d=[1,1,1],c=T.computePool3DInfo(r.shape,s,i,d,o,l,u),p=new P3(c,"avg",!1);return a.runWebGLProgram(p,[r],"float32")}var eH={kernelName:Gc,backendName:"webgl",kernelFunc:Qj},tH=class{constructor(e){this.variableNames=["dy"],this.outputShape=e.inShape;let t=e.filterHeight,a=e.filterWidth,n=e.strideHeight,r=e.strideWidth,s=e.dilationHeight,i=e.dilationWidth,o=e.effectiveFilterHeight,l=e.effectiveFilterWidth,u=o-1-e.padInfo.top,d=l-1-e.padInfo.left,c=1/(t*a);this.userCode=` + const ivec2 pads = ivec2(${u}, ${d}); + const float avgMultiplier = float(${c}); + + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + + ivec2 dyRCCorner = coords.yz - pads; + int dyRCorner = dyRCCorner.x; + int dyCCorner = dyRCCorner.y; + + // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + for (int wR = 0; wR < ${o}; + wR += ${s}) { + float dyR = float(dyRCorner + wR) / ${n}.0; + + if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) { + continue; + } + int idyR = int(dyR); + + for (int wC = 0; wC < ${l}; + wC+= ${i}) { + float dyC = float(dyCCorner + wC) / ${r}.0; + + if (dyC < 0.0 || dyC >= ${e.outWidth}.0 || + fract(dyC) > 0.0) { + continue; + } + int idyC = int(dyC); + + float dyValue = getDy(b, idyR, idyC, d); + + dotProd += dyValue * avgMultiplier; + } + } + setOutput(dotProd); + } + `}},aH=class{constructor(e){this.variableNames=["dy"],this.outputShape=e.inShape;let t=e.filterDepth,a=e.filterHeight,n=e.filterWidth,r=e.strideDepth,s=e.strideHeight,i=e.strideWidth,o=e.dilationDepth,l=e.dilationHeight,u=e.dilationWidth,d=e.effectiveFilterDepth,c=e.effectiveFilterHeight,p=e.effectiveFilterWidth,h=d-1-e.padInfo.front,f=c-1-e.padInfo.top,m=p-1-e.padInfo.left,g=1/(t*a*n);this.userCode=` + const ivec3 pads = ivec3(${h}, ${f}, ${m}); + const float avgMultiplier = float(${g}); + + void main() { + ivec5 coords = getOutputCoords(); + int batch = coords.x; + int ch = coords.u; + + ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads; + int dyDCorner = dyCorner.x; + int dyRCorner = dyCorner.y; + int dyCCorner = dyCorner.z; + + // Convolve dy(?, ?, ?, d) with pos mask(:, :, :, ch) to get + // dx(xD, xR, xC, ch). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + + for (int wD = 0; wD < ${d}; + wD += ${o}) { + float dyD = float(dyDCorner + wD) / ${r}.0; + + if (dyD < 0.0 || dyD >= ${e.outDepth}.0 || fract(dyD) > 0.0) { + continue; + } + int idyD = int(dyD); + + for (int wR = 0; wR < ${c}; + wR += ${l}) { + float dyR = float(dyRCorner + wR) / ${s}.0; + + if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || + fract(dyR) > 0.0) { + continue; + } + int idyR = int(dyR); + + for (int wC = 0; wC < ${p}; + wC += ${u}) { + float dyC = float(dyCCorner + wC) / ${i}.0; + + if (dyC < 0.0 || dyC >= ${e.outWidth}.0 || + fract(dyC) > 0.0) { + continue; + } + int idyC = int(dyC); + + float dyValue = getDy(batch, idyD, idyR, idyC, ch); + + dotProd += dyValue * avgMultiplier; + } + } + } + setOutput(dotProd); + } + `}};function nH(e){let{inputs:t,backend:a,attrs:n}=e,{dy:r,input:s}=t,i=s,{filterSize:o,strides:l,pad:u,dimRoundingMode:d}=n,c=[1,1,1],p=T.computePool3DInfo(i.shape,o,l,c,u,d),h=new aH(p);return a.runWebGLProgram(h,[r],i.dtype)}var rH={kernelName:H1,backendName:"webgl",kernelFunc:nH};function sH(e){let{inputs:t,backend:a,attrs:n}=e,{dy:r,input:s}=t,i=s;Jl([r,s],"avgPoolGrad");let{filterSize:o,strides:l,pad:u}=n,d=T.computePool2DInfo(i.shape,o,l,1,u),c=new tH(d);return a.runWebGLProgram(c,[r],i.dtype)}var iH={kernelName:j1,backendName:"webgl",kernelFunc:sH};function oH(e){let{inputs:t,backend:a,attrs:n}=e,{a:r,b:s}=t,{transposeA:i,transposeB:o}=n;return Pc({a:r,b:s,transposeA:i,transposeB:o,backend:a})}var lH={kernelName:gi,backendName:"webgl",kernelFunc:oH},uH=class{constructor(e,t,a,n,r,s){this.outputShape=[],this.variableNames=["x","mean","variance"],T.assertAndGetBroadcastShape(e,t),T.assertAndGetBroadcastShape(e,a);let i="0.0";n!=null&&(T.assertAndGetBroadcastShape(e,n),this.variableNames.push("offset"),i="getOffsetAtOutCoords()");let o="1.0";r!=null&&(T.assertAndGetBroadcastShape(e,r),this.variableNames.push("scale"),o="getScaleAtOutCoords()"),this.outputShape=e,this.userCode=` + void main() { + float x = getXAtOutCoords(); + float mean = getMeanAtOutCoords(); + float variance = getVarianceAtOutCoords(); + float offset = ${i}; + float scale = ${o}; + float inv = scale * inversesqrt(variance + float(${s})); + setOutput(dot(vec3(x, -mean, offset), vec3(inv, inv, 1))); + } + `}},dH=class{constructor(e,t,a,n,r,s){this.packedInputs=!0,this.packedOutput=!0,this.variableNames=["x","mean","variance"],T.assertAndGetBroadcastShape(e,t),T.assertAndGetBroadcastShape(e,a);let i="vec4(0.0)";n!=null&&(T.assertAndGetBroadcastShape(e,n),this.variableNames.push("offset"),i="getOffsetAtOutCoords()");let o="vec4(1.0)";r!=null&&(T.assertAndGetBroadcastShape(e,r),this.variableNames.push("scale"),o="getScaleAtOutCoords()"),this.outputShape=e,this.userCode=` + void main() { + vec4 offset = ${i}; + vec4 scale = ${o}; + + vec4 x = getXAtOutCoords(); + vec4 mean = getMeanAtOutCoords(); + vec4 variance = getVarianceAtOutCoords(); + + vec4 inv = scale * inversesqrt(variance + vec4(${s})); + + setOutput((x - mean) * inv + offset); + } + `}},pH=({inputs:e,backend:t,attrs:a})=>{let{x:n,mean:r,variance:s,offset:i,scale:o}=e;v.assert(r.shape.length===s.shape.length,()=>"Batch normalization gradient requires mean and variance to have equal ranks."),v.assert(i==null||r.shape.length===i.shape.length,()=>"Batch normalization gradient requires mean and offset to have equal ranks."),v.assert(o==null||r.shape.length===o.shape.length,()=>"Batch normalization gradient requires mean and scale to have equal ranks.");let{varianceEpsilon:l}=a;l==null&&(l=.001);let u=[n,r,s],d=null;i!=null&&(d=i.shape,u.push(i));let c=null;o!=null&&(c=o.shape,u.push(o));let p=V().getBool("WEBGL_PACK_NORMALIZATION")?new dH(n.shape,r.shape,s.shape,d,c,l):new uH(n.shape,r.shape,s.shape,d,c,l);return t.runWebGLProgram(p,u,u[0].dtype)},cH={kernelName:$i,backendName:"webgl",kernelFunc:pH},hH=class{constructor(e){this.variableNames=["source"],this.outputShape=e,this.rank=e.length;let t=mt(this.rank);this.customUniforms=[{name:"start",arrayIndex:this.rank,type:"int"}];let a=fH(this.rank),n,r=e.map((s,i)=>`sourceLoc.${S1[i]} = start[${i}] + coords.${S1[i]};`);n=` + ${t} sourceLoc; + ${t} coords = getOutputCoords(); + ${r.join(` +`)} + `,this.userCode=` + void main() { + ${n} + setOutput(getSource(${a})); + } + `}},S1=["x","y","z","w","u","v"];function fH(e){if(e===1)return"sourceLoc";if(e<=6)return S1.slice(0,e).map(t=>"sourceLoc."+t).join(",");throw Error(`Slicing for rank ${e} is not yet supported`)}var mH=class{constructor(e){this.variableNames=["source"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e,this.rank=e.length,this.customUniforms=[{name:"start",arrayIndex:this.rank,type:"int"}];let t=mt(this.rank),a=va("coords",this.rank),n=va("sourceLoc",this.rank),r=this.rank===1?"sourceLoc":`vec2(${n.slice(-2).join()})`,s=`getChannel(getSource(${n.join()}), ${r})`,i=` + result.x = ${s}; + if (++${a[this.rank-1]} < ${e[this.rank-1]}) { + ++${n[this.rank-1]}; + result.y = ${s}; + --${n[this.rank-1]}; + } + `,o=this.rank===1?"":` + --${a[this.rank-1]}; + if (++${a[this.rank-2]} < ${e[this.rank-2]}) { + ++${n[this.rank-2]}; + result.z = ${s}; + if (++${a[this.rank-1]} < ${e[this.rank-1]}) { + ++${n[this.rank-1]}; + result.w = ${s}; + } + } + `,l=this.rank<=4?`sourceLoc = coords + + ${t}(${e.map((u,d)=>`start[${d}]`).join()});`:e.map((u,d)=>`${n[d]} = ${a[d]} + start[${d}];`).join(` +`);this.userCode=` + void main() { + ${t} coords = getOutputCoords(); + ${t} sourceLoc; + ${l} + vec4 result = vec4(0.); + ${i} + ${o} + setOutput(result); + } + `}};function gH(e,t,a,n){let r=n.texData.get(e.dataId),s=n.makeTensorInfo(a,e.dtype),i=n.texData.get(s.dataId);Object.assign(i,r),i.refCount=1,i.shape=a,i.dtype=e.dtype;let o=At.computeFlatOffset(t,v.computeStrides(e.shape));r.slice&&(o+=r.slice.flatOffset),i.slice={flatOffset:o,origDataId:r.slice&&r.slice.origDataId||e.dataId};let l=n.dataRefCount.get(i.slice.origDataId)||1;return n.dataRefCount.set(i.slice.origDataId,l+1),s}function su(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{begin:s,size:i}=n,[o,l]=At.parseSliceParams(r,s,i);if(At.assertParamsValid(r,o,l),v.sizeFromShape(l)===0)return a.makeTensorInfo(l,r.dtype,[]);if(a.shouldExecuteOnCPU([r])||r.dtype==="string"){let c=a.texData.get(r.dataId),p=oU(c.values,o,l,r.shape,r.dtype);return a.makeTensorInfo(l,r.dtype,p)}let{isPacked:u}=a.texData.get(r.dataId),d=At.isSliceContinous(r.shape,o,l);if(u||!d){let c=V().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new mH(l):new hH(l),p=[o];return a.runWebGLProgram(c,[r],r.dtype,p)}return a.uploadToGPU(r.dataId),gH(r,o,l,a)}var yH={kernelName:zl,backendName:"webgl",kernelFunc:su},AH=e=>{let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{blockShape:s,crops:i}=n;v.assert(r.shape.length<=4,()=>"batchToSpaceND for rank > 4 with a WebGL backend not implemented yet");let o=s.reduce((A,x)=>A*x),l=T.getReshaped(r.shape,s,o),u=T.getPermuted(l.length,s.length),d=T.getReshapedPermuted(r.shape,s,o),c=T.getSliceBeginCoords(i,s.length),p=T.getSliceSize(d,i,s.length),h=[],f=de({inputs:{x:r},backend:a,attrs:{shape:l}}),m=Ia({inputs:{x:f},backend:a,attrs:{perm:u}}),g=de({inputs:{x:m},backend:a,attrs:{shape:d}}),y=su({inputs:{x:g},backend:a,attrs:{begin:c,size:p}});return h.push(f),h.push(m),h.push(g),h.forEach(A=>a.disposeIntermediateTensorInfo(A)),y},xH={kernelName:bl,backendName:"webgl",kernelFunc:AH};function bH(e){let{inputs:t,backend:a,attrs:n}=e,{x:r,weights:s}=t,{size:i}=n,o=a.readSync(r.dataId),l=a.readSync(s.dataId),u=X6(o,l,s.dtype,s.shape,i);return a.makeTensorInfo([i],s.dtype,u)}var vH={kernelName:Uc,backendName:"webgl",kernelFunc:bH};function wH(e){let{inputs:t,backend:a}=e,{s0:n,s1:r}=t,s=a.readSync(n.dataId),i=a.readSync(r.dataId),o=T.assertAndGetBroadcastShape(Array.from(s),Array.from(i));return a.makeTensorInfo([o.length],"int32",Int32Array.from(o))}var kH={kernelName:jc,backendName:"webgl",kernelFunc:wH},IH="return float(a != b);",u8=la({opSnippet:IH,cpuKernelImpl:JG,dtype:"bool"}),SH={kernelName:cs,backendName:"webgl",kernelFunc:u8};function hp(e){let{inputs:t,backend:a}=e,{input:n}=t,r=a.texData.get(n.dataId);return Za({inputs:{x:r.complexTensorInfos.real},backend:a})}var TH={kernelName:$d,backendName:"webgl",kernelFunc:hp},CH="return float(int(x));";function NH(e,t){let a=new gr(e.shape,CH),n=t.runWebGLProgram(a,[e],"int32");return{dataId:n.dataId,shape:n.shape,dtype:n.dtype}}function T1(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{dtype:s}=n;if(s==="complex64"){if(r.dtype==="complex64")return Za({inputs:{x:r},backend:a});let i=pn(r.shape),o=T1({inputs:{x:r},backend:a,attrs:{dtype:"float32"}}),l=ks({inputs:{real:o,imag:i},backend:a});return i.dispose(),a.disposeIntermediateTensorInfo(o),l}if(r.dtype==="complex64"){let i=hp({inputs:{input:r},backend:a}),o=T1({inputs:{x:i},backend:a,attrs:{dtype:s}});return a.disposeIntermediateTensorInfo(i),o}if(!v.hasEncodingLoss(r.dtype,s)){let i=Za({inputs:{x:r},backend:a});return{dataId:i.dataId,shape:i.shape,dtype:s}}if(a.shouldExecuteOnCPU([r])){let i=a.texData.get(r.dataId).values,[o,l,u]=$G(i,r.shape,r.dtype,s);return a.makeTensorInfo(o,l,u)}if(s==="int32")return NH(r,a);if(s==="bool"){let i=a.makeTensorInfo([],"bool",v.getTypedArrayFromDType("bool",1)),o=u8({inputs:{a:r,b:i},backend:a});return a.disposeIntermediateTensorInfo(i),o}throw new Error(`Error in Cast: failed to cast ${r.dtype} to ${s}`)}var EH={kernelName:yi,backendName:"webgl",kernelFunc:T1},My="return ceil(x);",RH=Qe({opSnippet:My,packedOpSnippet:My,cpuKernelImpl:_G}),MH={kernelName:Qr,backendName:"webgl",kernelFunc:RH},$H=class{constructor(e){this.variableNames=["A"],this.customUniforms=[{name:"minVal",type:"float"},{name:"maxVal",type:"float"}],this.outputShape=e,this.userCode=` + + void main() { + float value = getAAtOutCoords(); + if (isnan(value)) { + setOutput(value); + return; + } + + setOutput(clamp(value, minVal, maxVal)); + } + `}},_H=class{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"minVal",type:"float"},{name:"maxVal",type:"float"}],this.outputShape=e,this.userCode=` + void main() { + vec4 value = getAAtOutCoords(); + + if (any(isnan(value))) { + setOutput(value); + return; + } + + setOutput(clamp(value, vec4(minVal), vec4(maxVal))); + } + `}};function FH(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{clipValueMin:s,clipValueMax:i}=n,o;V().getBool("WEBGL_PACK_CLIP")?o=new _H(r.shape):o=new $H(r.shape);let l=[[s],[i]];return a.runWebGLProgram(o,[r],r.dtype,l)}var PH={kernelName:es,backendName:"webgl",kernelFunc:FH},OH=class{constructor(e){this.variableNames=["real","imag"],this.outputShape=e,this.userCode=` + void main() { + float re = abs(getRealAtOutCoords()); + float im = abs(getImagAtOutCoords()); + float mx = max(re, im); + + // sadly the length function in glsl is not underflow-safe + // (at least not on Intel GPUs). So the safe solution is + // to ensure underflow-safety in all cases. + setOutput( + mx == 0.0 ? 0.0 : mx * length(vec2(1, min(re, im)/mx)) + ); + } + `}};function $y(e,t){return{dataId:t.dataId,dtype:t.dtype,shape:e.shape}}function DH(e){let{inputs:t,backend:a}=e,{x:n}=t,r=a.texData.get(n.dataId),s=new OH(n.shape),i=[$y(n,r.complexTensorInfos.real),$y(n,r.complexTensorInfos.imag)];return a.runWebGLProgram(s,i,i[0].dtype)}var zH={kernelName:Hc,backendName:"webgl",kernelFunc:DH},LH=class{constructor(e){this.outputShape=[],this.outputShape=T.computeOutShape(e,1),this.variableNames=e.map((s,i)=>`T${i}`);let t=new Array(e.length-1);t[0]=e[0][1];for(let s=1;s`T${m}`);let o=new Array(e.length-1);o[0]=e[0][t];for(let f=1;f= ${o[f-1]}) { + return getChannel( + getT${f}(${uc(i,l,m)}), + vec2(${uc(u,l,m)})); + }`}let p=o.length,h=o[o.length-1];c+=` + return getChannel( + getT${p}(${uc(i,l,h)}), + vec2(${uc(u,l,h)}));`,this.userCode=` + float getValue(${i.map(f=>"int "+f)}) { + ${c} + } + + void main() { + ${r} coords = getOutputCoords(); + vec4 result = vec4(getValue(${s}), 0., 0., 0.); + + ${s[n-1]} = ${s[n-1]} + 1; + if (${s[n-1]} < ${a[n-1]}) { + result.g = getValue(${s}); + } + + ${s[n-2]} = ${s[n-2]} + 1; + if (${s[n-2]} < ${a[n-2]}) { + result.a = getValue(${s}); + } + + ${s[n-1]} = ${s[n-1]} - 1; + if (${s[n-2]} < ${a[n-2]} && + ${s[n-1]} < ${a[n-1]}) { + result.b = getValue(${s}); + } + setOutput(result); + } + `}};function uc(e,t,a){let n=e.indexOf(t);return e.map((r,s)=>s===n?`${r} - ${a}`:r).join()}function Wh(e){let{inputs:t,backend:a}=e,{input:n}=t,r=a.texData.get(n.dataId);return Za({inputs:{x:r.complexTensorInfos.imag},backend:a})}var WH={kernelName:Cd,backendName:"webgl",kernelFunc:Wh};function Vu(e,t,a){let n=e[0].dtype;if(n==="complex64"){let c=e.map(g=>hp({inputs:{input:g},backend:a})),p=e.map(g=>Wh({inputs:{input:g},backend:a})),h=Vu(c,t,a),f=Vu(p,t,a),m=ks({inputs:{real:h,imag:f},backend:a});return c.forEach(g=>a.disposeIntermediateTensorInfo(g)),p.forEach(g=>a.disposeIntermediateTensorInfo(g)),a.disposeIntermediateTensorInfo(h),a.disposeIntermediateTensorInfo(f),m}let r=a.shouldExecuteOnCPU(e);if(n==="string"&&(r=!0),r){let c=e.map(A=>{let x=[-1,v.sizeFromShape(A.shape.slice(t))];return de({inputs:{x:A},backend:a,attrs:{shape:x}})}),p=c.map(A=>({vals:a.readSync(A.dataId),shape:A.shape})),h=T.computeOutShape(c.map(A=>A.shape),1),f=c[0].shape[0]===1,m=FG(p,h,n,f),g=T.computeOutShape(e.map(A=>A.shape),t),y=a.makeTensorInfo(g,n,m);return c.forEach(A=>a.disposeIntermediateTensorInfo(A)),y}let s=V().getNumber("WEBGL_MAX_TEXTURES_IN_SHADER");if(e.length>s){let c=[];for(let h=0;h1){let c=new BH(e.map(p=>p.shape),t);return a.runWebGLProgram(c,e,n)}let{tensors2D:i,outShape:o}=VH(e,t,a),l=new LH(i.map(c=>c.shape)),u=a.runWebGLProgram(l,i,n);i.forEach(c=>a.disposeIntermediateTensorInfo(c));let d=de({inputs:{x:u},attrs:{shape:o},backend:a});return a.disposeIntermediateTensorInfo(u),d}function VH(e,t,a){let n=T.computeOutShape(e.map(r=>r.shape),t);return{tensors2D:e.map(r=>de({inputs:{x:r},attrs:{shape:[-1,v.sizeFromShape(r.shape.slice(t))]},backend:a})),outShape:n}}function d8(e){let{inputs:t,backend:a,attrs:n}=e,{axis:r}=n,s=v.parseAxisParam(r,t[0].shape)[0],i=t.map(u=>u.shape);T.assertParamsConsistent(i,s);let o=T.computeOutShape(t.map(u=>u.shape),s);if(v.sizeFromShape(o)===0)return a.makeTensorInfo(o,t[0].dtype,[]);let l=t.filter(u=>v.sizeFromShape(u.shape)>0);return l.length===1?Za({inputs:{x:l[0]},backend:a}):Vu(l,s,a)}var GH={kernelName:vl,backendName:"webgl",kernelFunc:d8},p8=class{constructor(e,t=!1,a=null,n=!1,r=!1){this.variableNames=["x","W"],this.outputShape=e.outShape;let s=e.padInfo.top,i=e.padInfo.left,o=e.strideHeight,l=e.strideWidth,u=e.dilationHeight,d=e.dilationWidth,c=e.filterHeight,p=e.filterWidth,h=Math.floor(e.inChannels/4)*4,f=e.inChannels%4,m=e.dataFormat==="channelsLast",g=m?1:2,y=m?2:3,A=m?3:1,x="",b="";a&&(n?x=`float activation(float a) { + float b = getPreluActivationWeightsAtOutCoords(); + ${a} + }`:r?x=`float activation(float a) { + float b = getLeakyreluAlphaAtOutCoords(); + ${a} + }`:x=` + float activation(float x) { + ${a} + } + `,b="result = activation(result);");let w=t?"result += getBiasAtOutCoords();":"";t&&this.variableNames.push("bias"),n&&this.variableNames.push("preluActivationWeights"),r&&this.variableNames.push("leakyreluAlpha"),this.userCode=` + ${x} + + const ivec2 strides = ivec2(${o}, ${l}); + const ivec2 pads = ivec2(${s}, ${i}); + + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords[0]; + int d2 = coords[${A}]; + + ivec2 xRCCorner = + ivec2(coords[${g}], coords[${y}]) * strides - pads; + int xRCorner = xRCCorner.x; + int xCCorner = xRCCorner.y; + + // Convolve x(?, ?, d1) with w(:, :, d1, d2) to get y(yR, yC, d2). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + for (int wR = 0; wR < ${c}; wR++) { + int xR = xRCorner + wR * ${u}; + + if (xR < 0 || xR >= ${e.inHeight}) { + continue; + } + + for (int wC = 0; wC < ${p}; wC++) { + int xC = xCCorner + wC * ${d}; + + if (xC < 0 || xC >= ${e.inWidth}) { + continue; + } + + for (int d1 = 0; d1 < ${h}; d1 += 4) { + vec4 wValues = vec4( + getW(wR, wC, d1, d2), + getW(wR, wC, d1 + 1, d2), + getW(wR, wC, d1 + 2, d2), + getW(wR, wC, d1 + 3, d2) + ); + + if (${m}) { + vec4 xValues = vec4( + getX(batch, xR, xC, d1), + getX(batch, xR, xC, d1 + 1), + getX(batch, xR, xC, d1 + 2), + getX(batch, xR, xC, d1 + 3) + ); + dotProd += dot(xValues, wValues); + } else { + vec4 xValues = vec4( + getX(batch, d1, xR, xC), + getX(batch, d1 + 1, xR, xC), + getX(batch, d1 + 2, xR, xC), + getX(batch, d1 + 3, xR, xC) + ); + dotProd += dot(xValues, wValues); + } + } + + if (${f===1}) { + + if (${m}) { + dotProd += + getX(batch, xR, xC, ${h}) * + getW(wR, wC, ${h}, d2); + } else { + dotProd += + getX(batch, ${h}, xR, xC) * + getW(wR, wC, ${h}, d2); + } + + } else if (${f===2}) { + vec2 wValues = vec2( + getW(wR, wC, ${h}, d2), + getW(wR, wC, ${h} + 1, d2) + ); + + if (${m}) { + vec2 xValues = vec2( + getX(batch, xR, xC, ${h}), + getX(batch, xR, xC, ${h} + 1) + ); + dotProd += dot(xValues, wValues); + } else { + vec2 xValues = vec2( + getX(batch, ${h}, xR, xC), + getX(batch, ${h} + 1, xR, xC) + ); + dotProd += dot(xValues, wValues); + } + + } else if (${f===3}) { + vec3 wValues = vec3( + getW(wR, wC, ${h}, d2), + getW(wR, wC, ${h} + 1, d2), + getW(wR, wC, ${h} + 2, d2) + ); + + if (${m}) { + vec3 xValues = vec3( + getX(batch, xR, xC, ${h}), + getX(batch, xR, xC, ${h} + 1), + getX(batch, xR, xC, ${h} + 2) + ); + dotProd += dot(xValues, wValues); + } else { + vec3 xValues = vec3( + getX(batch, ${h}, xR, xC), + getX(batch, ${h} + 1, xR, xC), + getX(batch, ${h} + 2, xR, xC) + ); + dotProd += dot(xValues, wValues); + } + + } + } + } + + float result = dotProd; + ${w} + ${b} + setOutput(result); + } + `}},UH=class{constructor(e){this.variableNames=["x","W"],this.outputShape=e.outShape;let t=e.padInfo.front,a=e.padInfo.top,n=e.padInfo.left,r=e.strideDepth,s=e.strideHeight,i=e.strideWidth,o=e.dilationDepth,l=e.dilationHeight,u=e.dilationWidth,d=e.filterDepth,c=e.filterHeight,p=e.filterWidth,h=Math.floor(e.inChannels/4)*4,f=e.inChannels%4;this.userCode=` + const ivec3 strides = ivec3(${r}, ${s}, ${i}); + const ivec3 pads = ivec3(${t}, ${a}, ${n}); + + void main() { + ivec5 coords = getOutputCoords(); + int batch = coords.x; + int d2 = coords.u; + + ivec3 xFRCCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads; + int xFCorner = xFRCCorner.x; + int xRCorner = xFRCCorner.y; + int xCCorner = xFRCCorner.z; + + // Convolve x(?, ?, ?, d1) with w(:, :, :, d1, d2) to get + // y(yF, yR, yC, d2). ? = to be determined. : = across all + // values in that axis. + float dotProd = 0.0; + for (int wF = 0; wF < ${d}; wF++) { + int xF = xFCorner + wF * ${o}; + + if (xF < 0 || xF >= ${e.inDepth}) { + continue; + } + + for (int wR = 0; wR < ${c}; wR++) { + int xR = xRCorner + wR * ${l}; + + if (xR < 0 || xR >= ${e.inHeight}) { + continue; + } + + for (int wC = 0; wC < ${p}; wC++) { + int xC = xCCorner + wC * ${u}; + + if (xC < 0 || xC >= ${e.inWidth}) { + continue; + } + + for (int d1 = 0; d1 < ${h}; d1 += 4) { + vec4 xValues = vec4( + getX(batch, xF, xR, xC, d1), + getX(batch, xF, xR, xC, d1 + 1), + getX(batch, xF, xR, xC, d1 + 2), + getX(batch, xF, xR, xC, d1 + 3) + ); + vec4 wValues = vec4( + getW(wF, wR, wC, d1, d2), + getW(wF, wR, wC, d1 + 1, d2), + getW(wF, wR, wC, d1 + 2, d2), + getW(wF, wR, wC, d1 + 3, d2) + ); + + dotProd += dot(xValues, wValues); + } + + if (${f===1}) { + dotProd += + getX(batch, xF, xR, xC, ${h}) * + getW(wF, wR, wC, ${h}, d2); + } else if (${f===2}) { + vec2 xValues = vec2( + getX(batch, xF, xR, xC, ${h}), + getX(batch, xF, xR, xC, ${h} + 1) + ); + vec2 wValues = vec2( + getW(wF, wR, wC, ${h}, d2), + getW(wF, wR, wC, ${h} + 1, d2) + ); + dotProd += dot(xValues, wValues); + } else if (${f===3}) { + vec3 xValues = vec3( + getX(batch, xF, xR, xC, ${h}), + getX(batch, xF, xR, xC, ${h} + 1), + getX(batch, xF, xR, xC, ${h} + 2) + ); + vec3 wValues = vec3( + getW(wF, wR, wC, ${h}, d2), + getW(wF, wR, wC, ${h} + 1, d2), + getW(wF, wR, wC, ${h} + 2, d2) + ); + dotProd += dot(xValues, wValues); + } + } + } + } + setOutput(dotProd); + } + `}},c8=class{constructor(e,t=!1,a=null,n=!1,r=!1){this.variableNames=["x","W"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"pads",type:"ivec2"},{name:"strides",type:"ivec2"},{name:"dilations",type:"ivec2"},{name:"inDims",type:"ivec2"}],this.outputShape=e.outShape,this.enableShapeUniforms=Na(this.outputShape.length);let s=e.padInfo.left,i=e.strideWidth,o=e.dilationWidth,l=e.filterHeight,u=e.filterWidth,d=u,c=` + int xR; int xC; int xCOffset; + vec4 wTexel; vec4 previous; vec4 final;`;for(let m=0;m=0 && xR < inDims[0]) { + `;for(let m=0;m<(d+1)/2;m++){let g=m*2;if(c+=` + xC = xCCorner + ${g*o}; + `,i===1){if(g= 0 && xCOffset < inDims[1] && xTexelC${g}Ready == 0) { + xTexelC${g} = getX(batch, xR, xCOffset, d1); + + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xCOffset + 1 >= inDims[1]) { + xTexelC${g}.zw = vec2(0.0); + } + xTexelC${g}Ready = 1; + } + `,o===1&&g>0?c+=` + xC${g} = vec4(xTexelC${g-2}.zw, xTexelC${g}.xy); + `:c+=` + xCOffset = xC + 1 - 2; + + if (xCOffset >= 0 && xCOffset < inDims[1]) { + previous = getX(batch, xR, xCOffset, d1); + + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xCOffset + 1 >= inDims[1]) { + previous.zw = vec2(0.0); + } + + xC${g} = vec4(previous.zw, xTexelC${g}.xy); + } else { + xC${g} = vec4(0.0, 0.0, xTexelC${g}.xy); + } + `):c+=` + if (xC >= 0 && xC < inDims[1] && xTexelC${g}Ready == 0) { + xTexelC${g} = getX(batch, xR, xC, d1); + if (xC + 1 >= inDims[1]) { + xTexelC${g}.zw = vec2(0.0); + } + xTexelC${g}Ready = 1; + } + + xC${g} = xTexelC${g}; + `,g+1= 0 && xCOffset < inDims[1] && xTexelC${g+1}Ready == 0) { + xTexelC${g+1} = getX(batch, xR, xCOffset, d1); + + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xCOffset + 1 >= inDims[1]) { + xTexelC${g+1}.zw = vec2(0.0); + } + xTexelC${g+1}Ready = 1; + } + `,o>1?c+=` + xCOffset -= 2; + if (xCOffset >= 0 && xCOffset < inDims[1]) { + previous = getX(batch, xR, xCOffset, d1); + xC${g+1} = vec4(previous.zw, xTexelC${g+1}.xy); + } else { + xC${g+1} = vec4(0.0, 0.0, xTexelC${g+1}.xy); + } + `:c+=` + xC${g+1} = vec4(xTexelC${g}.zw, xTexelC${g+1}.xy); + `):y===1?c+=` + xC${g+1} = xTexelC${g}; + `:c+=` + xCOffset = xC + ${y}; + + if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${g+1}Ready == 0) { + xTexelC${g+1} = getX(batch, xR, xCOffset, d1); + if (xCOffset + 1 >= inDims[1]) { + xTexelC${g+1}.zw = vec2(0.0); + } + xTexelC${g+1}Ready = 1; + } + + xC${g+1} = xTexelC${g+1}; + `}}else g= 0 && xCOffset < inDims[1] && xTexelC${g}Ready == 0) { + xTexelC${g} = getX(batch, xR, xCOffset, d1); + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xCOffset + 1 >= inDims[1]) { + xTexelC${g}.zw = vec2(0.0); + } + xTexelC${g}Ready = 1; + } + + if(xC + 1 >= 0 && xC + 1 < inDims[1] && xTexelC${g+1}Ready == 0) { + xTexelC${g+1} = getX(batch, xR, xC + 1, d1); + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xC + 2 >= inDims[1]) { + xTexelC${g+1}.zw = vec2(0.0); + } + xTexelC${g+1}Ready = 1; + } + + xC${g} = vec4(xTexelC${g}.zw, xTexelC${g+1}.zw); + `,g+1= 0 && xCOffset < inDims[1]) { + final = getX(batch, xR, xCOffset, d1); + } + xC${g+1} = vec4(xTexelC${g+1}.xy, final.xy); + `)):(c+=` + if(xC >= 0 && xC < inDims[1] && xTexelC${g}Ready == 0) { + xTexelC${g} = getX(batch, xR, xC, d1); + if (xC + 1 >= inDims[1]) { + xTexelC${g}.zw = vec2(0.0); + } + xTexelC${g}Ready = 1; + } + + xCOffset = xC + strides[1]; + if(xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${g+1}Ready == 0) { + xTexelC${g+1} = getX(batch, xR, xCOffset, d1); + if (xCOffset + 1 >= inDims[1]) { + xTexelC${g+1}.zw = vec2(0.); + } + xTexelC${g+1}Ready = 1; + } + + xC${g} = vec4( + xTexelC${g}.xy, xTexelC${g+1}.xy); + `,g+1= 0) { + // Use custom imod instead mod. On Intel GPU, mod may generate + // unexpected value. + // https://github.com/tensorflow/tfjs/issues/5447 + offsetX = imod(blockIndex, outWidth) * stride[1] - pad[1]; + d1 = offsetX + dilation[1] * (imod(pos, itemsPerBlockRow) / + inChannels); + + if(d1 < inputShape[${i}] && d1 >= 0) { + + ch = imod(pos, inChannels); + + if (${r}) { + innerDims = vec2(d1, ch); + result[${u*2+d}] = getChannel( + getA(rc.x, d0, int(innerDims.x), + int(innerDims.y)), innerDims); + } else { + innerDims = vec2(d0, d1); + result[${u*2+d}] = getChannel( + getA(rc.x, ch, int(innerDims.x), + int(innerDims.y)), innerDims); + } + } + } + } + `;this.userCode=` + void main() { + ivec3 rc = getOutputCoords(); + + vec4 result = vec4(0); + + int blockIndex, pos, offsetY, d0, offsetX, d1, ch; + vec2 innerDims; + + ${l} + + ${n.output} = result; + } + `}};function Oc(e,t){let a=e.length;return a>=3?t?[...e.slice(0,-3),e[a-3]*e[a-2],e[a-1]]:[...e.slice(0,-3),e[a-3],e[a-2]*e[a-1]]:!t&&a===1&&e[0]>1?[e[0],1]:null}function h8({x:e,filter:t,convInfo:a,backend:n,bias:r=null,preluActivationWeights:s=null,leakyreluAlpha:i=0,activation:o=null}){let l=e.shape,u=n.texData.get(e.dataId),d=a.inChannels,c=l[0]*l[1]*l[2],p=a.outChannels,h=a.dataFormat==="channelsLast",f=!1,m=!1,g,y=[];if(s!=null){let A=Oc(s.shape,h);A!=null&&(s=de({inputs:{x:s},backend:n,attrs:{shape:A}}),y.push(s))}if(r!=null){let A=Oc(r.shape,h);A!=null&&(r=de({inputs:{x:r},backend:n,attrs:{shape:A}}),y.push(r))}if(!((c===1||p===1)&&d>s8)&&u.isPacked&&h&&u.texture!=null&&l[2]%2!==0&&v.arraysEqual(u.shape.slice(-3),l.slice(-3))){let A=l[0]*l[1]*(l[2]+1),x={dataId:e.dataId,shape:[1,A,a.inChannels],dtype:e.dtype},b=u.shape;u.shape=u.shape.slice(),u.shape[u.shape.length-2]++,v.assert(ld(u.shape,x.shape),()=>`packed reshape ${u.shape} to ${x.shape} isn't free`);let w=de({inputs:{x:t},backend:n,attrs:{shape:[1,a.inChannels,a.outChannels]}});y.push(w);let S=Pc({a:x,b:w,backend:n,transposeA:f,transposeB:m,bias:r,activation:o,preluActivationWeights:s,leakyreluAlpha:i}),C=n.texData.get(S.dataId);v.assert(C.isPacked,()=>"batchMatMul result is expected to be packed"),u.shape=b,C.shape=a.outShape,g=Za({inputs:{x:S},backend:n}),g.shape=a.outShape,y.push(S)}else{let A=a.outHeight*a.outWidth,x=de({inputs:{x:e},backend:n,attrs:{shape:h?[a.batchSize,A,a.inChannels]:[a.batchSize,a.inChannels,A]}}),b=de({inputs:{x:t},backend:n,attrs:{shape:[1,a.inChannels,a.outChannels]}}),w=Pc({a:h?x:b,b:h?b:x,transposeA:!h,transposeB:m,backend:n,bias:r,activation:o,preluActivationWeights:s,leakyreluAlpha:i});g=de({inputs:{x:w},backend:n,attrs:{shape:a.outShape}}),y.push(x),y.push(b),y.push(w)}for(let A of y)n.disposeIntermediateTensorInfo(A);return g}function f8({x:e,filter:t,convInfo:a,backend:n,bias:r=null,preluActivationWeights:s=null,leakyreluAlpha:i=0,activation:o=null}){let{filterWidth:l,filterHeight:u,inChannels:d,outWidth:c,outHeight:p,dataFormat:h}=a,f=h==="channelsLast",m=l*u*d,g=p*c,y=[a.batchSize,m,g],A=!0,x=!1,b=[];if(s!=null){let j=Oc(s.shape,f);j!=null&&(s=de({inputs:{x:s},backend:n,attrs:{shape:j}}),b.push(s))}if(r!=null){let j=Oc(r.shape,f);j!=null&&(r=de({inputs:{x:r},backend:n,attrs:{shape:j}}),b.push(r))}let w=de({inputs:{x:t},backend:n,attrs:{shape:[1,m,v.sizeFromShape(t.shape)/m]}});b.push(w);let S=new jH(y,a),C=[e.shape,[a.padInfo.top,a.padInfo.left],[a.strideHeight,a.strideWidth],[a.dilationHeight,a.dilationWidth],[a.inChannels],[a.filterWidth*a.inChannels],[a.outWidth]],N=n.runWebGLProgram(S,[e],"float32",C),_=de({inputs:{x:N},backend:n,attrs:{shape:y}});b.push(N),b.push(_);let $=r!=null,M=s!=null,I=o==="leakyrelu",E=o?ud(o,!0):null,O=new r8(f?_.shape:w.shape,f?w.shape:_.shape,f?[a.batchSize,g,a.outChannels]:[a.batchSize,a.outChannels,g],A,x,$,E,M,I),L=f?[_,w]:[w,_];if(r&&L.push(r),M&&L.push(s),I){let j=n.makeTensorInfo([],"float32",v.createScalarValue(i,"float32"));L.push(j),b.push(j)}let B=n.runWebGLProgram(O,L,"float32"),G=de({inputs:{x:B},backend:n,attrs:{shape:a.outShape}});b.push(B);for(let j of b)n.disposeIntermediateTensorInfo(j);return G}function HH(e){let{inputs:t,backend:a,attrs:n}=e,{x:r,filter:s}=t,{strides:i,pad:o,dataFormat:l,dilations:u,dimRoundingMode:d}=n,c=T.convertConv2DDataFormat(l),p=T.computeConv2DInfo(r.shape,s.shape,i,u,o,d,!1,c),h;if(p.filterHeight===1&&p.filterWidth===1&&p.dilationHeight===1&&p.dilationWidth===1&&p.strideHeight===1&&p.strideWidth===1&&(p.padInfo.type==="SAME"||p.padInfo.type==="VALID"))h=h8({x:r,filter:s,convInfo:p,backend:a});else if(p.strideWidth<=2&&c==="channelsLast"&&V().getBool("WEBGL_EXP_CONV")){let m=new c8(p),g=[[p.padInfo.top,p.padInfo.left],[p.strideHeight,p.strideWidth],[p.dilationHeight,p.dilationWidth],[p.inHeight,p.inWidth]];h=a.runWebGLProgram(m,[r,s],"float32",g)}else if(V().getBool("WEBGL_CONV_IM2COL"))h=f8({x:r,filter:s,convInfo:p,backend:a});else{let m=new p8(p);h=a.runWebGLProgram(m,[r,s],"float32")}let f=de({inputs:{x:h},backend:a,attrs:{shape:p.outShape}});return a.disposeIntermediateTensorInfo(h),f}var qH={kernelName:Ai,backendName:"webgl",kernelFunc:HH},XH=class{constructor(e){this.variableNames=["x","dy"],this.outputShape=e.filterShape;let t=e.strideHeight,a=e.strideWidth,n=e.padInfo.top,r=e.padInfo.left,s=e.dataFormat==="channelsLast";this.userCode=` + void main() { + ivec4 coords = getOutputCoords(); + int wR = coords.x; + int wC = coords.y; + int d1 = coords.z; + int d2 = coords.w; + + // Convolve x(?, ?, d1) with dy(:, :, d2) to get dw(wR, wC, d1, d2). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + + for (int b = 0; b < ${e.batchSize}; b++) { + for (int yR = 0; yR < ${e.outHeight}; yR++) { + int xR = wR + yR * ${t} - ${n}; + + if (xR < 0 || xR >= ${e.inHeight}) { + continue; + } + + for (int yC = 0; yC < ${e.outWidth}; yC++) { + int xC = wC + yC * ${a} - ${r}; + + if (xC < 0 || xC >= ${e.inWidth}) { + continue; + } + + if (${s}) { + float dyValue = getDy(b, yR, yC, d2); + float xValue = getX(b, xR, xC, d1); + dotProd += (xValue * dyValue); + } else { + float dyValue = getDy(b, d2, yR, yC); + float xValue = getX(b, d1, xR, xC); + dotProd += (xValue * dyValue); + } + + } + } + } + setOutput(dotProd); + } + `}},KH=class{constructor(e){this.variableNames=["dy","W"],this.outputShape=e.inShape;let t=e.filterHeight,a=e.filterWidth,n=e.strideHeight,r=e.strideWidth,s=e.dataFormat==="channelsLast",i=t-1-e.padInfo.top,o=a-1-e.padInfo.left,l=s?1:2,u=s?2:3,d=s?3:1;this.userCode=` + const ivec2 pads = ivec2(${i}, ${o}); + + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords[0]; + int d1 = coords[${d}]; + + ivec2 dyCorner = ivec2(coords[${l}], coords[${u}]) - pads; + int dyRCorner = dyCorner.x; + int dyCCorner = dyCorner.y; + + // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + for (int wR = 0; wR < ${t}; wR++) { + float dyR = float(dyRCorner + wR) / ${n}.0; + + if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) { + continue; + } + int idyR = int(dyR); + + int wRPerm = ${t} - 1 - wR; + + for (int wC = 0; wC < ${a}; wC++) { + float dyC = float(dyCCorner + wC) / ${r}.0; + + if (dyC < 0.0 || dyC >= ${e.outWidth}.0 || + fract(dyC) > 0.0) { + continue; + } + int idyC = int(dyC); + + int wCPerm = ${a} - 1 - wC; + + for (int d2 = 0; d2 < ${e.outChannels}; d2++) { + + if (${s}) { + float xValue = getDy(batch, idyR, idyC, d2); + float wValue = getW(wRPerm, wCPerm, d1, d2); + dotProd += xValue * wValue; + } else { + float xValue = getDy(batch, d2, idyR, idyC); + float wValue = getW(wRPerm, wCPerm, d1, d2); + dotProd += xValue * wValue; + } + + } + } + } + setOutput(dotProd); + } + `}},ZH=class{constructor(e){this.variableNames=["x","dy"],this.outputShape=e.filterShape;let t=e.strideDepth,a=e.strideHeight,n=e.strideWidth,r=e.padInfo.front,s=e.padInfo.top,i=e.padInfo.left;this.userCode=` + void main() { + ivec5 coords = getOutputCoords(); + int wF = coords.x; + int wR = coords.y; + int wC = coords.z; + int d1 = coords.w; + int d2 = coords.u; + + float dotProd = 0.0; + + for (int b = 0; b < ${e.batchSize}; b++) { + for (int yF = 0; yF < ${e.outDepth}; yF++) { + int xF = wF + yF * ${t} - ${r}; + + if (xF < 0 || xF >= ${e.inDepth}) { + continue; + } + + for (int yR = 0; yR < ${e.outHeight}; yR++) { + int xR = wR + yR * ${a} - ${s}; + + if (xR < 0 || xR >= ${e.inHeight}) { + continue; + } + + for (int yC = 0; yC < ${e.outWidth}; yC++) { + int xC = wC + yC * ${n} - ${i}; + + if (xC < 0 || xC >= ${e.inWidth}) { + continue; + } + + float dyValue = getDy(b, yF, yR, yC, d2); + float xValue = getX(b, xF, xR, xC, d1); + dotProd += (xValue * dyValue); + } + } + } + } + setOutput(dotProd); + } + `}},YH=class{constructor(e){this.variableNames=["dy","W"],this.outputShape=e.inShape;let t=e.filterDepth,a=e.filterHeight,n=e.filterWidth,r=e.strideDepth,s=e.strideHeight,i=e.strideWidth,o=t-1-e.padInfo.front,l=a-1-e.padInfo.top,u=n-1-e.padInfo.left;this.userCode=` + const ivec3 pads = ivec3(${o}, ${l}, ${u}); + + void main() { + ivec5 coords = getOutputCoords(); + int batch = coords.x; + int d1 = coords.u; + + + ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads; + int dyFCorner = dyCorner.x; + int dyRCorner = dyCorner.y; + int dyCCorner = dyCorner.z; + + float dotProd = 0.0; + for (int wF = 0; wF < ${t}; wF++) { + float dyF = float(dyFCorner + wF) / ${r}.0; + + if (dyF < 0.0 || dyF >= ${e.outDepth}.0 || fract(dyF) > 0.0) { + continue; + } + int idyF = int(dyF); + + int wFPerm = ${t} - 1 - wF; + + for (int wR = 0; wR < ${a}; wR++) { + float dyR = float(dyRCorner + wR) / ${s}.0; + + if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || + fract(dyR) > 0.0) { + continue; + } + int idyR = int(dyR); + + int wRPerm = ${a} - 1 - wR; + + for (int wC = 0; wC < ${n}; wC++) { + float dyC = float(dyCCorner + wC) / ${i}.0; + + if (dyC < 0.0 || dyC >= ${e.outWidth}.0 || + fract(dyC) > 0.0) { + continue; + } + int idyC = int(dyC); + + int wCPerm = ${n} - 1 - wC; + + for (int d2 = 0; d2 < ${e.outChannels}; d2++) { + float xValue = getDy(batch, idyF, idyR, idyC, d2); + float wValue = getW(wFPerm, wRPerm, wCPerm, d1, d2); + dotProd += xValue * wValue; + } + } + } + } + setOutput(dotProd); + } + `}};function JH(e){let{inputs:t,backend:a,attrs:n}=e,{x:r,dy:s}=t,{strides:i,pad:o,dataFormat:l,dimRoundingMode:u,filterShape:d}=n,c=T.convertConv2DDataFormat(l),p=T.computeConv2DInfo(r.shape,d,i,1,o,u,!1,c),h=new XH(p);return a.runWebGLProgram(h,[r,s],"float32")}var QH={kernelName:qc,backendName:"webgl",kernelFunc:JH};function eq(e){let{inputs:t,backend:a,attrs:n}=e,{dy:r,filter:s}=t,{inputShape:i,strides:o,pad:l,dataFormat:u,dimRoundingMode:d}=n,c=T.convertConv2DDataFormat(u),p=T.computeConv2DInfo(i,s.shape,o,1,l,d,!1,c),h=new KH(p);return a.runWebGLProgram(h,[r,s],"float32")}var tq={kernelName:xi,backendName:"webgl",kernelFunc:eq};function aq(e){let{inputs:t,backend:a,attrs:n}=e,{x:r,filter:s}=t,{strides:i,pad:o,dilations:l}=n,u=T.computeConv3DInfo(r.shape,s.shape,i,l,o),d=new UH(u);return a.runWebGLProgram(d,[r,s],"float32")}var nq={kernelName:Xc,backendName:"webgl",kernelFunc:aq};function rq(e){let{inputs:t,backend:a,attrs:n}=e,{x:r,dy:s}=t,{strides:i,pad:o,filterShape:l}=n,u=T.computeConv3DInfo(r.shape,l,i,1,o),d=new ZH(u);return a.runWebGLProgram(d,[r,s],"float32")}var sq={kernelName:q1,backendName:"webgl",kernelFunc:rq};function iq(e){let{inputs:t,backend:a,attrs:n}=e,{dy:r,filter:s}=t,{pad:i,strides:o,inputShape:l}=n,u=T.computeConv3DInfo(l,s.shape,o,1,i),d=new YH(u);return a.runWebGLProgram(d,[r,s],"float32")}var oq={kernelName:Kc,backendName:"webgl",kernelFunc:iq},lq=ru+` + return cos(x); +`,uq=Qe({opSnippet:lq}),dq={kernelName:bi,backendName:"webgl",kernelFunc:uq},pq=` + float e2x = exp(-x); + return (e2x + 1.0 / e2x) / 2.0; +`,cq=Qe({opSnippet:pq}),hq={kernelName:vi,backendName:"webgl",kernelFunc:cq},fq=class{constructor(e,t,a,n,r){this.variableNames=["Image","Boxes","BoxInd"],this.outputShape=[];let[s,i,o,l]=e,[u]=t,[d,c]=a;this.outputShape=[u,d,c,l];let p=n==="bilinear"?1:0,[h,f]=[`${i-1}.0`,`${o-1}.0`],[m,g,y]=d>1?[`${(i-1)/(d-1)}`,"(y2-y1) * height_ratio",`y1*${h} + float(y)*(height_scale)`]:["0.0","0.0",`0.5 * (y1+y2) * ${h}`],[A,x,b]=c>1?[`${(o-1)/(c-1)}`,"(x2-x1) * width_ratio",`x1*${f} + float(x)*(width_scale)`]:["0.0","0.0",`0.5 * (x1+x2) * ${f}`];this.userCode=` + const float height_ratio = float(${m}); + const float width_ratio = float(${A}); + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int y = coords[1]; + int x = coords[2]; + int d = coords[3]; + + // get box vals + float y1 = getBoxes(b,0); + float x1 = getBoxes(b,1); + float y2 = getBoxes(b,2); + float x2 = getBoxes(b,3); + + // get image in batch index + int bInd = round(getBoxInd(b)); + if(bInd < 0 || bInd >= ${s}) { + return; + } + + float height_scale = ${g}; + float width_scale = ${x}; + + float in_y = ${y}; + if( in_y < 0.0 || in_y > ${h} ) { + setOutput(float(${r})); + return; + } + float in_x = ${b}; + if( in_x < 0.0 || in_x > ${f} ) { + setOutput(float(${r})); + return; + } + + vec2 sourceFracIndexCR = vec2(in_x,in_y); + if(${p} == 1) { + // Compute the four integer indices. + ivec2 sourceFloorCR = ivec2(sourceFracIndexCR); + ivec2 sourceCeilCR = ivec2(ceil(sourceFracIndexCR)); + + float topLeft = getImage(b, sourceFloorCR.y, sourceFloorCR.x, d); + float bottomLeft = getImage(b, sourceCeilCR.y, sourceFloorCR.x, d); + float topRight = getImage(b, sourceFloorCR.y, sourceCeilCR.x, d); + float bottomRight = getImage(b, sourceCeilCR.y, sourceCeilCR.x, d); + + vec2 fracCR = sourceFracIndexCR - vec2(sourceFloorCR); + + float top = topLeft + (topRight - topLeft) * fracCR.x; + float bottom = bottomLeft + (bottomRight - bottomLeft) * fracCR.x; + float newValue = top + (bottom - top) * fracCR.y; + setOutput(newValue); + } else { + // Compute the coordinators of nearest neighbor point. + ivec2 sourceNearestCR = ivec2(floor( + sourceFracIndexCR + vec2(0.5,0.5))); + float newValue = getImage(b, sourceNearestCR.y, sourceNearestCR.x, d); + setOutput(newValue); + } + } + `}},mq=e=>{let{inputs:t,backend:a,attrs:n}=e,{image:r,boxes:s,boxInd:i}=t,{cropSize:o,method:l,extrapolationValue:u}=n,d=new fq(r.shape,s.shape,o,l,u);return a.runWebGLProgram(d,[r,s,i],"float32")},gq={kernelName:Ii,backendName:"webgl",kernelFunc:mq},pd;(function(e){e.Prod="*",e.Sum="+"})(pd||(pd={}));var _y=class{constructor(e,t,a,n){this.op=e,this.outputShape=t,this.variableNames=["x"],this.customUniforms=[{name:"index",type:"float"}];let r=this.outputShape.length,s=this.op===pd.Prod?"1.0":"0.0",i=a?s:`getX(${Fy(r,"coords",this.op)})`,o=this.outputShape[this.outputShape.length-1],l="",u="";a?(l=n?`end != ${o-1}`:"end != 0",u=n?"end + 1":"end - 1"):(l=n?`end + pow2 < ${o}`:"end >= pow2",u=n?"end + pow2":"end - pow2"),this.userCode=` + void main() { + ${mt(r)} coords = getOutputCoords(); + int end = ${Py(r,"coords",this.op)}; + float val = ${i}; + int pow2 = int(pow(2.0, index)); + if (${l}) { + int idx = ${u}; + ${Py(r,"coords",this.op)} = idx; + val ${this.op}= getX(${Fy(r,"coords",this.op)}); + } + setOutput(val); + } + `}};function Fy(e,t,a){if(e===1)return`${t}`;if(e===2)return`${t}.x, ${t}.y`;if(e===3)return`${t}.x, ${t}.y, ${t}.z`;if(e===4)return`${t}.x, ${t}.y, ${t}.z, ${t}.w`;throw new Error(`Cumulative ${a} for rank ${e} is not yet supported`)}function Py(e,t,a){if(e===1)return`${t}`;if(e===2)return`${t}.y`;if(e===3)return`${t}.z`;if(e===4)return`${t}.w`;throw new Error(`Cumulative ${a} for rank ${e} is not yet supported`)}function m8(e,t,a,n,r,s){let i=t.shape.length,o=T.getAxesPermutation([n],i),l=t;o!=null&&(l=Ia({inputs:{x:t},backend:a,attrs:{perm:o}}));let u=T.getInnerMostAxes(1,i)[0];if(u!==i-1)throw new Error(`WebGL cumprod shader expects an inner-most axis=${t.shape.length-1} but got axis=${n}`);let d=l.shape[u],c=Za({inputs:{x:l},backend:a});for(let p=0;p<=Math.ceil(Math.log2(d))-1;p++){let h=new _y(e,l.shape,!1,s),f=[[p]],m=c;c=a.runWebGLProgram(h,[c],c.dtype,f),a.disposeIntermediateTensorInfo(m)}if(r){let p=new _y(e,l.shape,r,s),h=c;c=a.runWebGLProgram(p,[c],c.dtype),a.disposeIntermediateTensorInfo(h)}if(o!=null){let p=T.getUndoAxesPermutation(o),h=Ia({inputs:{x:c},backend:a,attrs:{perm:p}});return a.disposeIntermediateTensorInfo(c),a.disposeIntermediateTensorInfo(l),h}return c}function yq(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{axis:s,exclusive:i,reverse:o}=n;return m8(pd.Prod,r,a,s,i,o)}var Aq={kernelName:wi,backendName:"webgl",kernelFunc:yq};function xq(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{axis:s,exclusive:i,reverse:o}=n;return m8(pd.Sum,r,a,s,i,o)}var bq={kernelName:ki,backendName:"webgl",kernelFunc:xq};function vq(e){let{inputs:t,backend:a,attrs:n}=e,{x:r,weights:s}=t,{size:i,binaryOutput:o}=n;if(r.shape.length===1){let l=a.readSync(r.dataId),u=a.readSync(s.dataId),d=X6(l,u,s.dtype,s.shape,i);return a.makeTensorInfo([i],s.dtype,d)}else if(r.shape.length===2){let l=a.bufferSync(r),u=a.bufferSync(s),d=MG(l,u,i,o);return a.makeTensorInfo(d.shape,s.dtype,d.values)}throw new Error(`Error in denseBincount: input must be at most rank 2, but got rank${r.shape.length}.`)}var wq={kernelName:Zc,backendName:"webgl",kernelFunc:vq},kq=class{constructor(e,t,a){this.variableNames=["x"],this.outputShape=[],this.outputShape=e,this.blockSize=t,this.dataFormat=a,this.userCode=` + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int h = ${this.getHeightCoordString()}; + int w = ${this.getWidthCoordString()}; + int d = ${this.getDepthCoordString()}; + + int in_h = h / ${t}; + int offset_h = imod(h, ${t}); + int in_w = w / ${t}; + int offset_w = imod(w, ${t}); + int offset_d = (offset_h * ${t} + offset_w) * + ${this.getOutputDepthSize()}; + int in_d = d + offset_d; + + float result = ${this.getInputSamplingString()}; + setOutput(result); + } + `}getHeightCoordString(){return this.dataFormat==="NHWC"?"coords[1]":"coords[2]"}getWidthCoordString(){return this.dataFormat==="NHWC"?"coords[2]":"coords[3]"}getDepthCoordString(){return this.dataFormat==="NHWC"?"coords[3]":"coords[1]"}getOutputDepthSize(){return this.dataFormat==="NHWC"?this.outputShape[3]:this.outputShape[1]}getInputSamplingString(){return this.dataFormat==="NHWC"?"getX(b, in_h, in_w, in_d)":"getX(b, in_d, in_h, in_w)"}};function Iq(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{blockSize:s,dataFormat:i}=n,o=r.shape[0],l=i==="NHWC"?r.shape[1]:r.shape[2],u=i==="NHWC"?r.shape[2]:r.shape[3],d=i==="NHWC"?r.shape[3]:r.shape[1],c=l*s,p=u*s,h=d/(s*s),f=i==="NHWC"?[o,c,p,h]:[o,h,c,p],m=new kq(f,s,i);return a.runWebGLProgram(m,[r],r.dtype)}var Sq={kernelName:Si,backendName:"webgl",kernelFunc:Iq},g8=class{constructor(e,t=!1,a=null,n=!1,r=!1){this.variableNames=["x","W"],this.customUniforms=[{name:"pads",type:"ivec2"},{name:"strides",type:"ivec2"},{name:"dilations",type:"ivec2"},{name:"inDims",type:"ivec2"}],this.outputShape=e.outShape,this.enableShapeUniforms=Na(this.outputShape.length);let s=e.filterHeight,i=e.filterWidth,o=e.outChannels/e.inChannels,l="",u="";a&&(n?l=`float activation(float a) { + float b = getPreluActivationWeightsAtOutCoords(); + ${a} + }`:r?l=`float activation(float a) { + float b = getLeakyreluAlphaAtOutCoords(); + ${a} + }`:l=` + float activation(float x) { + ${a} + } + `,u="result = activation(result);");let d=t?"result += getBiasAtOutCoords();":"";t&&this.variableNames.push("bias"),n&&this.variableNames.push("preluActivationWeights"),r&&this.variableNames.push("leakyreluAlpha"),this.userCode=` + ${l} + + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords.x; + ivec2 xRCCorner = coords.yz * strides - pads; + int d2 = coords.w; + int d1 = d2 / ${o}; + int q = d2 - d1 * ${o}; + + int xRCorner = xRCCorner.x; + int xCCorner = xRCCorner.y; + + // Convolve x(?, ?, d1) with w(:, :, d1, q) to get y(yR, yC, d2). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + // TO DO(dsmilkov): Flatten the two for loops and vec4 the operations. + for (int wR = 0; wR < ${s}; wR++) { + int xR = xRCorner + wR * dilations[0]; + + if (xR < 0 || xR >= inDims[0]) { + continue; + } + + for (int wC = 0; wC < ${i}; wC++) { + int xC = xCCorner + wC * dilations[1]; + + if (xC < 0 || xC >= inDims[1]) { + continue; + } + + float xVal = getX(batch, xR, xC, d1); + float wVal = getW(wR, wC, d1, q); + dotProd += xVal * wVal; + } + } + + float result = dotProd; + ${d} + ${u} + setOutput(result); + } + `}},y8=class{constructor(e,t=!1,a=null,n=!1,r=!1){this.variableNames=["x","W"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"pads",type:"ivec2"},{name:"strides",type:"ivec2"},{name:"dilations",type:"ivec2"},{name:"inDims",type:"ivec2"}],this.outputShape=e.outShape,this.enableShapeUniforms=Na(this.outputShape.length);let s=e.outChannels/e.inChannels,i=e.padInfo.left,o=e.strideWidth,l=e.dilationWidth,u=e.filterHeight,d=e.filterWidth,c=d,p=` + int xR; int xC; int xCOffset; + vec4 wTexel; vec4 previous; vec4 final;`;for(let g=0;g=0 && xR < inDims[0]) { + `;for(let g=0;g<(c+1)/2;g++){let y=g*2;if(p+=` + xC = xCCorner + ${y*l}; + `,o===1){if(y= 0 && xCOffset < inDims[1] && xTexelC${y}Ready == 0) { + xTexelC${y} = getX(batch, xR, xCOffset, d1); + + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xCOffset + 1 >= inDims[1]) { + xTexelC${y}.zw = vec2(0.0); + } + xTexelC${y}Ready = 1; + } + `,l===1&&y>0?p+=` + xC${y} = vec4(xTexelC${y-2}.zw, xTexelC${y}.xy); + `:p+=` + xCOffset = xC + 1 - 2; + + if (xCOffset >= 0 && xCOffset < inDims[1]) { + previous = getX(batch, xR, xCOffset, d1); + + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xCOffset + 1 >= inDims[1]) { + previous.zw = vec2(0.0); + } + + xC${y} = vec4(previous.zw, xTexelC${y}.xy); + } else { + xC${y} = vec4(0.0, 0.0, xTexelC${y}.xy); + } + `):p+=` + if (xC >= 0 && xC < inDims[1] && xTexelC${y}Ready == 0) { + xTexelC${y} = getX(batch, xR, xC, d1); + if (xC + 1 >= inDims[1]) { + xTexelC${y}.zw = vec2(0.0); + } + xTexelC${y}Ready = 1; + } + + xC${y} = xTexelC${y}; + `,y+1= 0 && xCOffset < inDims[1] && xTexelC${y+1}Ready == 0) { + xTexelC${y+1} = getX(batch, xR, xCOffset, d1); + + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xCOffset + 1 >= inDims[1]) { + xTexelC${y+1}.zw = vec2(0.0); + } + xTexelC${y+1}Ready = 1; + } + `,l>1?p+=` + xCOffset -= 2; + if (xCOffset >= 0 && xCOffset < inDims[1]) { + previous = getX(batch, xR, xCOffset, d1); + xC${y+1} = vec4(previous.zw, xTexelC${y+1}.xy); + } else { + xC${y+1} = vec4(0.0, 0.0, xTexelC${y+1}.xy); + } + `:p+=` + xC${y+1} = vec4(xTexelC${y}.zw, xTexelC${y+1}.xy); + `):A===1?p+=` + xC${y+1} = xTexelC${y}; + `:p+=` + xCOffset = xC + ${A}; + + if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${y+1}Ready == 0) { + xTexelC${y+1} = getX(batch, xR, xCOffset, d1); + if (xCOffset + 1 >= inDims[1]) { + xTexelC${y+1}.zw = vec2(0.0); + } + xTexelC${y+1}Ready = 1; + } + + xC${y+1} = xTexelC${y+1}; + `}}else y= 0 && xCOffset < inDims[1] && xTexelC${y}Ready == 0) { + xTexelC${y} = getX(batch, xR, xCOffset, d1); + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xCOffset + 1 >= inDims[1]) { + xTexelC${y}.zw = vec2(0.0); + } + xTexelC${y}Ready = 1; + } + + if(xC + 1 >= 0 && xC + 1 < inDims[1] && xTexelC${y+1}Ready == 0) { + xTexelC${y+1} = getX(batch, xR, xC + 1, d1); + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xC + 2 >= inDims[1]) { + xTexelC${y+1}.zw = vec2(0.0); + } + xTexelC${y+1}Ready = 1; + } + + xC${y} = vec4(xTexelC${y}.zw, xTexelC${y+1}.zw); + `,y+1= 0 && xCOffset < inDims[1]) { + final = getX(batch, xR, xCOffset, d1); + } + xC${y+1} = vec4(xTexelC${y+1}.xy, final.xy); + `)):(p+=` + if(xC >= 0 && xC < inDims[1] && xTexelC${y}Ready == 0) { + xTexelC${y} = getX(batch, xR, xC, d1); + if (xC + 1 >= inDims[1]) { + xTexelC${y}.zw = vec2(0.0); + } + xTexelC${y}Ready = 1; + } + + xCOffset = xC + strides[1]; + if(xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${y+1}Ready == 0) { + xTexelC${y+1} = getX(batch, xR, xCOffset, d1); + if (xCOffset + 1 >= inDims[1]) { + xTexelC${y+1}.zw = vec2(0.); + } + xTexelC${y+1}Ready = 1; + } + + xC${y} = vec4( + xTexelC${y}.xy, xTexelC${y+1}.xy); + `,y+1`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${i} and dilations '${d}'`);let c=T.computeConv2DInfo(r.shape,s.shape,i,d,o,u,!0),p;V().getBool("WEBGL_PACK_DEPTHWISECONV")&&c.strideWidth<=2&&c.outChannels/c.inChannels===1?p=new y8(c):p=new g8(c);let h=[[c.padInfo.top,c.padInfo.left],[c.strideHeight,c.strideWidth],[c.dilationHeight,c.dilationWidth],[c.inHeight,c.inWidth]];return a.runWebGLProgram(p,[r,s],"float32",h)}var Cq={kernelName:Ti,backendName:"webgl",kernelFunc:Tq},Nq=class{constructor(e){this.variableNames=["x","dy"],this.outputShape=e.filterShape;let t=e.strideHeight,a=e.strideWidth,n=e.padInfo.top,r=e.padInfo.left,s=e.outChannels/e.inChannels;this.userCode=` + void main() { + ivec4 coords = getOutputCoords(); + int wR = coords.x; + int wC = coords.y; + int d1 = coords.z; + int dm = coords.w; + int d2 = d1 * ${s} + dm; + + float dotProd = 0.0; + + // TO DO: Vec4 over the batch size + for (int b = 0; b < ${e.batchSize}; b++) { + for (int yR = 0; yR < ${e.outHeight}; yR++) { + int xR = wR + yR * ${t} - ${n}; + + if (xR < 0 || xR >= ${e.inHeight}) { + continue; + } + + for (int yC = 0; yC < ${e.outWidth}; yC++) { + int xC = wC + yC * ${a} - ${r}; + + if (xC < 0 || xC >= ${e.inWidth}) { + continue; + } + + float dyValue = getDy(b, yR, yC, d2); + float xValue = getX(b, xR, xC, d1); + dotProd += (xValue * dyValue); + } + } + } + setOutput(dotProd); + } + `}},Eq=class{constructor(e){this.variableNames=["dy","W"],this.outputShape=e.inShape;let t=e.filterHeight,a=e.filterWidth,n=e.strideHeight,r=e.strideWidth,s=t-1-e.padInfo.top,i=a-1-e.padInfo.left,o=e.outChannels/e.inChannels;this.userCode=` + const ivec2 pads = ivec2(${s}, ${i}); + + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords[0]; + int d1 = coords[3]; + ivec2 dyCorner = coords.yz - pads; + int dyRCorner = dyCorner.x; + int dyCCorner = dyCorner.y; + + float dotProd = 0.0; + + for (int wR = 0; wR < ${t}; wR++) { + float dyR = float(dyRCorner + wR) / ${n}.0; + + if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) { + continue; + } + int idyR = int(dyR); + + int wRPerm = ${t} - 1 - wR; + + for (int wC = 0; wC < ${a}; wC++) { + float dyC = float(dyCCorner + wC) / ${r}.0; + + if (dyC < 0.0 || dyC >= ${e.outWidth}.0 || + fract(dyC) > 0.0) { + continue; + } + int idyC = int(dyC); + + int wCPerm = ${a} - 1 - wC; + + // TO DO: Vec4 over the channelMul + for (int dm = 0; dm < ${o}; dm++) { + int d2 = d1 * ${o} + dm; + float xValue = getDy(batch, idyR, idyC, d2); + float wValue = getW(wRPerm, wCPerm, d1, dm); + dotProd += xValue * wValue; + } + } + } + setOutput(dotProd); + } + `}};function Rq(e){let{inputs:t,backend:a,attrs:n}=e,{x:r,dy:s}=t,{strides:i,dilations:o,pad:l,dimRoundingMode:u,filterShape:d}=n,c=T.computeConv2DInfo(r.shape,d,i,o,l,u,!0),p=new Nq(c);return a.runWebGLProgram(p,[r,s],"float32")}var Mq={kernelName:Yc,backendName:"webgl",kernelFunc:Rq};function $q(e){let{inputs:t,backend:a,attrs:n}=e,{dy:r,filter:s}=t,{strides:i,dilations:o,pad:l,dimRoundingMode:u,inputShape:d}=n,c=T.computeConv2DInfo(d,s.shape,i,o,l,u,!0),p=new Eq(c);return a.runWebGLProgram(p,[r,s],"float32")}var _q={kernelName:Jc,backendName:"webgl",kernelFunc:$q},Fq=class{constructor(e){this.variableNames=["X"],this.outputShape=[e,e],this.userCode=` + void main() { + ivec2 coords = getOutputCoords(); + float val = coords[0] == coords[1] ? getX(coords[0]) : 0.0; + setOutput(val); + } + `}};function Pq(e){let{inputs:t,backend:a}=e,{x:n}=t,r=[...n.shape,...n.shape],s=v.sizeFromShape(n.shape),i=de({inputs:{x:n},backend:a,attrs:{shape:[s]}}),o=new Fq(s),l=a.runWebGLProgram(o,[i],i.dtype),u=de({inputs:{x:l},backend:a,attrs:{shape:r}});return a.disposeIntermediateTensorInfo(i),a.disposeIntermediateTensorInfo(l),u}var Oq={kernelName:Qc,backendName:"webgl",kernelFunc:Pq},Dq=class{constructor(e){this.variableNames=["x","W"],this.outputShape=e.outShape;let{inHeight:t,inWidth:a,padInfo:n,strideHeight:r,strideWidth:s,filterHeight:i,filterWidth:o,dilationHeight:l,dilationWidth:u}=e,{top:d,left:c}=n;this.userCode=` + const ivec2 strides = ivec2(${r}, ${s}); + const ivec2 pads = ivec2(${d}, ${c}); + const float neg_infinity = -3.4e38; + + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords.x; + int d1 = coords.w; + ivec2 outTopLeftCorner = + coords.yz * strides - pads; + int hBeg = outTopLeftCorner.x; + int wBeg = outTopLeftCorner.y; + + float curVal = neg_infinity; + for (int h = 0; h < ${i}; h++) { + int hIn = hBeg + h * ${l}; + + if (hIn >= 0 && hIn < ${t}) { + for (int w = 0; w < ${o}; w++) { + int wIn = wBeg + w * ${u}; + + if (wIn >= 0 && wIn < ${a}) { + float xVal = getX(batch, hIn, wIn, d1); + float wVal = getW(h, w, d1); + + float val = xVal + wVal; + if (val > curVal) { + curVal = val; + } + } + } + } + } + + float result = curVal; + setOutput(result); + } + `}};function zq(e){let{inputs:t,backend:a,attrs:n}=e,{x:r,filter:s}=t,{strides:i,pad:o,dilations:l}=n,u=T.computeDilation2DInfo(r.shape,s.shape,i,o,"NHWC",l),d,c=new Dq(u);d=a.runWebGLProgram(c,[r,s],"float32");let p=de({inputs:{x:d},backend:a,attrs:{shape:u.outShape}});return a.disposeIntermediateTensorInfo(d),p}var Lq={kernelName:eh,backendName:"webgl",kernelFunc:zq};function Bq(e){let{inputs:t,backend:a,attrs:n}=e,{equation:r}=n,s=t,{allDims:i,summedDims:o,idDims:l}=T.decodeEinsumEquation(r,s.length);T.checkEinsumDimSizes(i.length,l,s);let{path:u,steps:d}=T.getEinsumComputePath(o,l),c=d.length,p=null,h=i.length,f=[];for(let m=0;m=0&&(p=Bh({inputs:{x:p},backend:a,attrs:{axis:u[m]-(i.length-h),keepDims:!1}}),f.push(p)),h--)}for(let m of f)m!==p&&a.disposeIntermediateTensorInfo(m);return p}var Wq={kernelName:Sd,backendName:"webgl",kernelFunc:Bq},Vq="return (x >= 0.0) ? x : (exp(x) - 1.0);",Gq=` + vec4 result; + + result.r = (x.r >= 0.0) ? x.r : (exp(x.r) - 1.0); + result.g = (x.g >= 0.0) ? x.g : (exp(x.g) - 1.0); + result.b = (x.b >= 0.0) ? x.b : (exp(x.b) - 1.0); + result.a = (x.a >= 0.0) ? x.a : (exp(x.a) - 1.0); + + return result; +`,Uq=Qe({opSnippet:Vq,packedOpSnippet:Gq}),jq={kernelName:Ni,backendName:"webgl",kernelFunc:Uq},Hq="return (b >= 1.0) ? a : a * (b + 1.0);",qq=` + vec4 bGTEZero = vec4(greaterThanEqual(b, vec4(0.))); + return (bGTEZero * a) + ((vec4(1.0) - bGTEZero) * (a * (b + vec4(1.0)))); +`,Xq=e=>{let{inputs:t,backend:a}=e,{dy:n,y:r}=t,s=V().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new cp(qq,n.shape,r.shape):new cl(Hq,n.shape,r.shape);return a.runWebGLProgram(s,[n,r],n.dtype)},Kq={kernelName:X1,backendName:"webgl",kernelFunc:Xq},Zq=` + return vec4(equal(a, b)); +`,Yq="return float(a == b);",Jq=la({opSnippet:Yq,packedOpSnippet:Zq,dtype:"bool",cpuKernelImpl:PG}),Qq={kernelName:ts,backendName:"webgl",kernelFunc:Jq},eX=` + // Error function is calculated approximately with elementary function. + // See "Handbook of Mathematical Functions with Formulas, + // Graphs, and Mathematical Tables", Abramowitz and Stegun. + float p = ${T.ERF_P}; + float a1 = ${T.ERF_A1}; + float a2 = ${T.ERF_A2}; + float a3 = ${T.ERF_A3}; + float a4 = ${T.ERF_A4}; + float a5 = ${T.ERF_A5}; + + float sign = sign(x); + x = abs(x); + float t = 1.0 / (1.0 + p * x); + return sign * (1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*exp(-x*x)); +`,tX=Qe({opSnippet:eX}),aX={kernelName:Td,backendName:"webgl",kernelFunc:tX},nX=ru+` + return exp(x); +`,rX=` + vec4 result = exp(x); + bvec4 isNaN = isnan(x); + result.r = isNaN.r ? x.r : result.r; + result.g = isNaN.g ? x.g : result.g; + result.b = isNaN.b ? x.b : result.b; + result.a = isNaN.a ? x.a : result.a; + + return result; +`,A8=Qe({opSnippet:nX,packedOpSnippet:rX,cpuKernelImpl:OG,dtype:"float32"}),sX={kernelName:as,backendName:"webgl",kernelFunc:A8};function C1(e){let{inputs:t,attrs:a,backend:n}=e,{dim:r}=a,{input:s}=t,i=s.shape.length,o=s.shape.slice(),l=r;return r<0&&(v.assert(-(i+1)<=r,()=>`Axis must be in the interval [${-(i+1)}, ${i}]`),l=i+r+1),o.splice(l,0,1),de({inputs:{x:s},backend:n,attrs:{shape:o}})}var iX={kernelName:wl,backendName:"webgl",kernelFunc:C1},Oy="return exp(x) - 1.0;",oX=Qe({opSnippet:Oy,packedOpSnippet:Oy,cpuKernelImpl:DG}),lX={kernelName:Ei,backendName:"webgl",kernelFunc:oX},Dy=class{constructor(e,t,a){this.variableNames=["real","imag"];let n=t[1];this.outputShape=t;let r=a?`2.0 * ${Math.PI}`:`-2.0 * ${Math.PI}`,s=a?`${n}.0`:"1.0",i;if(e==="real")i="return real * expR - imag * expI;";else if(e==="imag")i="return real * expI + imag * expR;";else throw new Error(`FFT component must be either "real" or "imag", got ${e}.`);this.userCode=` + const float exponentMultiplier = ${r}; + + float unaryOpComplex(float real, float expR, float imag, float expI) { + ${i} + } + + float mulMatDFT(int batch, int index) { + float indexRatio = float(index) / float(${n}); + float exponentMultiplierTimesIndexRatio = + exponentMultiplier * indexRatio; + + float result = 0.0; + + for (int i = 0; i < ${n}; i++) { + // x = (-2|2 * PI / N) * index * i; + float x = exponentMultiplierTimesIndexRatio * float(i); + float expR = cos(x); + float expI = sin(x); + float real = getReal(batch, i); + float imag = getImag(batch, i); + + result += + unaryOpComplex(real, expR, imag, expI) / ${s}; + } + + return result; + } + + void main() { + ivec2 coords = getOutputCoords(); + setOutput(mulMatDFT(coords[0], coords[1])); + } + `}};function x8(e,t,a){let n=a.texData.get(e.dataId),r=v.sizeFromShape(e.shape),s=e.shape[e.shape.length-1],i=r/s,o=de({inputs:{x:e},backend:a,attrs:{shape:[i,s]}}),l=o.shape,u=new Dy("real",l,t),d=new Dy("imag",l,t),c=[{dataId:n.complexTensorInfos.real.dataId,dtype:n.complexTensorInfos.real.dtype,shape:l},{dataId:n.complexTensorInfos.imag.dataId,dtype:n.complexTensorInfos.imag.dtype,shape:l}],p=a.runWebGLProgram(u,c,"float32"),h=a.runWebGLProgram(d,c,"float32"),f=ks({inputs:{real:p,imag:h},backend:a});a.disposeIntermediateTensorInfo(p),a.disposeIntermediateTensorInfo(h);let m=de({inputs:{x:f},backend:a,attrs:{shape:e.shape}});return a.disposeIntermediateTensorInfo(o),a.disposeIntermediateTensorInfo(f),m}function uX(e){let{inputs:t,backend:a}=e,{input:n}=t;return x8(n,!1,a)}var dX={kernelName:th,backendName:"webgl",kernelFunc:uX},pX=class{constructor(e,t){this.outputShape=[],this.customUniforms=[{name:"value",type:"float"}],this.variableNames=["x"],this.outputShape=e,this.userCode=` + void main() { + // Input can be obtained from uniform value. + setOutput(value); + } + `}};function fp(e){let{backend:t,attrs:a}=e,{shape:n,value:r}=a,{dtype:s}=a;if(s=s||v.inferDtype(r),s==="string"){let i=v.getArrayFromDType(s,v.sizeFromShape(n));return i.fill(r),t.makeTensorInfo(n,s,i)}else{let i=new pX(n,r),o=[[r]];return t.runWebGLProgram(i,[],s,o)}}var cX={kernelName:kl,backendName:"webgl",kernelFunc:fp},hX=class{constructor(e){this.variableNames=["Image"],this.outputShape=[];let t=e[2];this.outputShape=e,this.userCode=` + void main() { + ivec4 coords = getOutputCoords(); + int x = coords[2]; + + int coordX = ${t} - x - 1; + float outputValue; + if(coordX >= 0 && coordX < ${t}) { + outputValue = getImage(coords[0], coords[1], coordX, coords[3]); + } else { + outputValue = getImage(coords[0], coords[1], coords[2], coords[3]); + } + setOutput(outputValue); + } + `}},fX={kernelName:Ri,backendName:"webgl",kernelFunc:({inputs:e,backend:t})=>{let{image:a}=e,n=t,r=new hX(a.shape);return n.runWebGLProgram(r,[a],a.dtype)}},zy="return floor(x);",mX=Qe({opSnippet:zy,packedOpSnippet:zy,cpuKernelImpl:zG}),gX={kernelName:ns,backendName:"webgl",kernelFunc:mX},yX=` + float s = sign(a) * sign(b); + int ia = round(a); + int ib = round(b); + if (ib != 0) { + // Windows (D3D) wants guaranteed non-zero int division at compile-time. + return float(idiv(ia, ib, s)); + } else { + return NAN; + } +`,AX=` + ivec4 ia = round(a); + ivec4 ib = round(b); + bvec4 cond = notEqual(ib, ivec4(0)); + ivec4 result = ivec4(0); + vec4 s = sign(a) * sign(b); + + // Windows (D3D) wants guaranteed non-zero int division at compile-time. + if (cond[0]) { + result[0] = idiv(ia[0], ib[0], s[0]); + } + if (cond[1]) { + result[1] = idiv(ia[1], ib[1], s[1]); + } + if (cond[2]) { + result[2] = idiv(ia[2], ib[2], s[2]); + } + if (cond[3]) { + result[3] = idiv(ia[3], ib[3], s[3]); + } + return vec4(result); +`,xX=la({opSnippet:yX,packedOpSnippet:AX,dtype:"int32"}),bX={kernelName:Mi,backendName:"webgl",kernelFunc:xX},vX=class{constructor(e){this.variableNames=["A"];let t=Ca(),[a,n]=e;this.outputShape=e,this.userCode=` + void main() { + ivec3 coords = getOutputCoords(); + int texR = coords[0]; + int texC = coords[1]; + int depth = coords[2]; + vec2 uv = (vec2(texC, texR) + halfCR) / vec2(${n}.0, ${a}.0); + + vec4 values = ${t.texture2D}(A, uv); + float value; + if (depth == 0) { + value = values.r; + } else if (depth == 1) { + value = values.g; + } else if (depth == 2) { + value = values.b; + } else if (depth == 3) { + value = values.a; + } + + setOutput(floor(value * 255.0 + 0.5)); + } + `}},wX=class{constructor(e){this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0;let t=Ca(),[a,n]=e;this.outputShape=e,this.userCode=` + void main() { + ivec3 coords = getOutputCoords(); + int texR = coords[0]; + int texC = coords[1]; + int depth = coords[2]; + + vec4 result = vec4(0.); + + for(int row=0; row<=1; row++) { + for(int col=0; col<=1; col++) { + texC = coords[1] + row; + depth = coords[2] + col; + + vec2 uv = (vec2(texC, texR) + halfCR) / + vec2(${n}.0, ${a}.0); + vec4 values = ${t.texture2D}(A, uv); + float value; + if (depth == 0) { + value = values.r; + } else if (depth == 1) { + value = values.g; + } else if (depth == 2) { + value = values.b; + } else if (depth == 3) { + value = values.a; + } + + result[row * 2 + col] = floor(value * 255.0 + 0.5); + } + } + + ${t.output} = result; + } + `}},kX={kernelName:Yu,backendName:"webgl",kernelFunc:IX},jo,zm=V().getBool("CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU");function IX(e){let{inputs:t,backend:a,attrs:n}=e,{pixels:r}=t,{numChannels:s}=n,i=typeof HTMLVideoElement!="undefined"&&r instanceof HTMLVideoElement,o=typeof HTMLImageElement!="undefined"&&r instanceof HTMLImageElement,[l,u]=i?[r.videoWidth,r.videoHeight]:[r.width,r.height],d=[u,l],c=[u,l,s];if(o||i){let m=V().getBool("CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU");(jo==null||m!==zm)&&(zm=m,jo=document.createElement("canvas").getContext("2d",{willReadFrequently:zm})),jo.canvas.width=l,jo.canvas.height=u,jo.drawImage(r,0,0,l,u),r=jo.canvas}let p=a.makeTensorInfo(d,"int32");a.texData.get(p.dataId).usage=un.PIXELS,a.gpgpu.uploadPixelDataToTexture(a.getTexture(p.dataId),r);let h=V().getBool("WEBGL_PACK")?new wX(c):new vX(c),f=a.runWebGLProgram(h,[p],"int32");return a.disposeData(p.dataId),f}function SX(e){let{inputs:t,backend:a,attrs:n}=e,{x:r,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:u,dataFormat:d,dilations:c,dimRoundingMode:p,activation:h,leakyreluAlpha:f}=n,m=T.convertConv2DDataFormat(d),g=T.computeConv2DInfo(r.shape,s.shape,l,c,u,p,!1,m),y,A=[],x=i!=null,b=o!=null,w=h==="leakyrelu",S=()=>{let N=[r,s],_=($,M)=>{if(M==="NCHW"&&$.shape.length===1&&$.shape[0]!==1){let I=de({inputs:{x:$},backend:a,attrs:{shape:[$.shape[0],1,1]}});return A.push(I),I}return $};if(x&&N.push(_(i,d)),b&&N.push(_(o,d)),w){let $=a.makeTensorInfo([],"float32",v.createScalarValue(f,"float32"));N.push($),A.push($)}return N};if(g.filterHeight===1&&g.filterWidth===1&&g.dilationHeight===1&&g.dilationWidth===1&&g.strideHeight===1&&g.strideWidth===1&&(g.padInfo.type==="SAME"||g.padInfo.type==="VALID"))y=h8({x:r,filter:s,convInfo:g,backend:a,bias:i,activation:h,preluActivationWeights:o,leakyreluAlpha:f});else if(g.strideWidth<=2&&m==="channelsLast"&&V().getBool("WEBGL_EXP_CONV")){let N=h?ud(h,!0):null,_=new c8(g,x,N,b,w),$=[[g.padInfo.top,g.padInfo.left],[g.strideHeight,g.strideWidth],[g.dilationHeight,g.dilationWidth],[g.inHeight,g.inWidth]],M=S();y=a.runWebGLProgram(_,M,"float32",$)}else if(V().getBool("WEBGL_CONV_IM2COL"))y=f8({x:r,filter:s,convInfo:g,backend:a,bias:i,activation:h,preluActivationWeights:o,leakyreluAlpha:f});else{let N=h?ud(h,!1):null,_=new p8(g,x,N,b,w),$=S();y=a.runWebGLProgram(_,$,"float32")}let C=de({inputs:{x:y},backend:a,attrs:{shape:g.outShape}});return A.push(y),A.forEach(N=>a.disposeIntermediateTensorInfo(N)),C}var TX={kernelName:jr,backendName:"webgl",kernelFunc:SX};function CX(e){let{inputs:t,backend:a,attrs:n}=e,{x:r,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:u,dilations:d,dimRoundingMode:c,activation:p,leakyreluAlpha:h}=n,f=[],m=d;m==null&&(m=[1,1]),v.assert(T.eitherStridesOrDilationsAreOne(l,m),()=>`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${l} and dilations '${m}'`);let g=T.computeConv2DInfo(r.shape,s.shape,l,m,u,c,!0),y=V().getBool("WEBGL_PACK_DEPTHWISECONV")&&g.strideWidth<=2&&g.outChannels/g.inChannels===1,A=p?ud(p,y):null,x=[r,s],b=i!=null,w=o!=null,S=p==="leakyrelu";if(b&&x.push(i),w&&x.push(o),S){let $=a.makeTensorInfo([],"float32",v.createScalarValue(h,"float32"));x.push($),f.push($)}let C;y?C=new y8(g,b,A,w,S):C=new g8(g,b,A,w,S);let N=[[g.padInfo.top,g.padInfo.left],[g.strideHeight,g.strideWidth],[g.dilationHeight,g.dilationWidth],[g.inHeight,g.inWidth]],_=a.runWebGLProgram(C,x,"float32",N);return f.forEach($=>a.disposeIntermediateTensorInfo($)),_}var NX={kernelName:Hr,backendName:"webgl",kernelFunc:CX},EX=class{constructor(e,t,a,n){this.sliceDim=e,this.strides=t,this.paramsShape=n,this.variableNames=["x","indices"],this.outputShape=a;let r=mt(a.length),s=` + int index;`;for(let i=0;i= ${this.paramsShape[i]}; + flattenIndex += index * ${this.strides[i]};`;this.userCode=` + void main() { + ${r} coords = getOutputCoords(); + int flattenIndex = 0; + bool out_of_bounds = false; + + ${s} + + setOutput(out_of_bounds ? 0.0 : getX(flattenIndex, coords[1])); + } + `}};function RX(e){let{inputs:t,backend:a}=e,{params:n,indices:r}=t,s=r.shape,i=s[s.length-1],o=v.sizeFromShape(n.shape),[l,u,d,c]=T.prepareAndValidate(n,r),p=de({inputs:{x:r},backend:a,attrs:{shape:[u,i]}}),h=de({inputs:{x:n},backend:a,attrs:{shape:[v.sizeFromShape(n.shape)/d,d]}});if(a.shouldExecuteOnCPU([n,r])||n.dtype==="string"){let y=a.readSync(r.dataId),A=a.bufferSync(n),x=LG(y,A,n.dtype,u,i,d,c,n.shape,o);return a.makeTensorInfo(l,n.dtype,x.values)}let f=new EX(i,c,[u,d],n.shape),m=a.runWebGLProgram(f,[h,p],h.dtype),g=de({inputs:{x:m},backend:a,attrs:{shape:l}});return a.disposeIntermediateTensorInfo(p),a.disposeIntermediateTensorInfo(h),a.disposeIntermediateTensorInfo(m),g}var MX={kernelName:_i,backendName:"webgl",kernelFunc:RX},$X=class{constructor(e,t){this.variableNames=["A","indices"],this.outputShape=t,this.rank=t.length;let a=mt(this.rank),n=_X(e,2);this.userCode=` + void main() { + ${a} resRC = getOutputCoords(); + int index = int(getIndices(resRC.x, resRC.z)); + float inBounds = (index >= 0) && (index < ${e[2]}) ? 1.0 : 0.0; + setOutput(inBounds * getA(${n})); + } + `}};function _X(e,t){let a=["resRC.x","resRC.y","resRC.z","resRC.w"],n=[];for(let r=0;r=0,()=>`GatherV2: the index value ${w} is not in [0, ${x-1}]`)}}let u=T.segment_util.collectGatherOpShapeInfo(r,s,l,o),d=v.sizeFromShape(s.shape),c=[],p=de({inputs:{x:r},backend:a,attrs:{shape:[u.batchSize,u.outerSize,u.dimSize,u.sliceSize]}}),h=de({inputs:{x:s},backend:a,attrs:{shape:[u.batchSize,d/u.batchSize]}});c.push(p),c.push(h);let f=[u.batchSize,u.outerSize,d/u.batchSize,u.sliceSize];if(a.shouldExecuteOnCPU([r,s])||r.dtype==="string"){let A=a.bufferSync(h),x=a.bufferSync(p),b=BG(x,A,f);return c.forEach(w=>a.disposeIntermediateTensorInfo(w)),a.makeTensorInfo(u.outputShape,b.dtype,b.values)}let m=new $X(p.shape,f),g=a.runWebGLProgram(m,[p,h],p.dtype);c.push(g);let y=de({inputs:{x:g},backend:a,attrs:{shape:u.outputShape}});return c.forEach(A=>a.disposeIntermediateTensorInfo(A)),y}var FX={kernelName:Il,backendName:"webgl",kernelFunc:b8},PX="return float(a > b);",OX=` + return vec4(greaterThan(a, b)); +`,DX=la({opSnippet:PX,packedOpSnippet:OX,cpuKernelImpl:WG,dtype:"bool"}),zX={kernelName:rs,backendName:"webgl",kernelFunc:DX},LX="return float(a >= b);",BX=` + return vec4(greaterThanEqual(a, b)); +`,WX=la({opSnippet:LX,packedOpSnippet:BX,dtype:"bool",cpuKernelImpl:VG}),VX={kernelName:ss,backendName:"webgl",kernelFunc:WX};function GX(e){let{inputs:t,backend:a}=e,{input:n}=t;return x8(n,!0,a)}var UX={kernelName:ah,backendName:"webgl",kernelFunc:GX},jX="return float(!isnan(x) && !isinf(x));",HX=Qe({opSnippet:jX,dtype:"bool"}),qX={kernelName:Nd,backendName:"webgl",kernelFunc:HX},XX="return float(isinf(x));",KX=Qe({opSnippet:XX,dtype:"bool"}),ZX={kernelName:Ed,backendName:"webgl",kernelFunc:KX},YX="return float(isnan(x));",JX=Qe({opSnippet:YX,dtype:"bool"}),QX={kernelName:Sl,backendName:"webgl",kernelFunc:JX},eK="return float(a < b);",tK=` + return vec4(lessThan(a, b)); +`,aK=la({opSnippet:eK,packedOpSnippet:tK,cpuKernelImpl:GG,dtype:"bool"}),nK={kernelName:is,backendName:"webgl",kernelFunc:aK},rK="return float(a <= b);",sK=` + return vec4(lessThanEqual(a, b)); +`,iK=la({opSnippet:rK,packedOpSnippet:sK,cpuKernelImpl:UG,dtype:"bool"}),oK={kernelName:os,backendName:"webgl",kernelFunc:iK};function lK(e){let{backend:t,attrs:a}=e,{start:n,stop:r,num:s}=a,i=jG(n,r,s);return t.makeTensorInfo([i.length],"float32",i)}var uK={kernelName:nh,backendName:"webgl",kernelFunc:lK},dK=ru+` + return x < 0.0 ? 0./0. : log(x); +`,pK=` + vec4 result = log(x); + bvec4 isNaN = isnan(x); + result.r = isNaN.r ? x.r : (x.r < 0.0 ? 0./0. : result.r); + result.g = isNaN.g ? x.g : (x.g < 0.0 ? 0./0. : result.g); + result.b = isNaN.b ? x.b : (x.b < 0.0 ? 0./0. : result.b); + result.a = isNaN.a ? x.a : (x.a < 0.0 ? 0./0. : result.a); + return result; +`,cK=Qe({opSnippet:dK,packedOpSnippet:pK,cpuKernelImpl:HG}),hK={kernelName:ls,backendName:"webgl",kernelFunc:cK},fK=ru+` + return log(1.0 + x); +`,mK=Qe({opSnippet:fK}),gK={kernelName:Rd,backendName:"webgl",kernelFunc:mK},yK="return float(a >= 1.0 && b >= 1.0);",AK=` + return vec4( + vec4(greaterThanEqual(a, vec4(1.0))) * + vec4(greaterThanEqual(b, vec4(1.0)))); +`,xK=la({opSnippet:yK,packedOpSnippet:AK,dtype:"bool"}),bK={kernelName:Oi,backendName:"webgl",kernelFunc:xK},vK="return float(!(x >= 1.0));",wK=Qe({opSnippet:vK}),kK={kernelName:Di,backendName:"webgl",kernelFunc:wK},IK="return float(a >= 1.0 || b >= 1.0);",SK=` + return min( + vec4(greaterThanEqual(a, vec4(1.0))) + + vec4(greaterThanEqual(b, vec4(1.0))), + vec4(1.0)); +`,TK=la({opSnippet:IK,packedOpSnippet:SK,dtype:"bool"}),CK={kernelName:Tl,backendName:"webgl",kernelFunc:TK},NK=class{constructor(e,t,a,n,r){this.variableNames=["x"],this.outputShape=[];let s=t,i=e[3]-1;this.outputShape=e;let o,l=`float(${a}) + float(${n}) * sum`;r===.5?o=`inversesqrt(${l})`:r===1?o=`1.0/(${l})`:o=`exp(log(${l}) * float(-${r}));`,this.userCode=` + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int r = coords[1]; + int c = coords[2]; + int d = coords[3]; + float x = getX(b, r, c, d); + float sum = 0.0; + for (int j = -${s}; j <= ${s}; j++) { + int idx = d + j; + if (idx >= 0 && idx <= ${i}) { + float z = getX(b, r, c, idx); + sum += z * z; + } + } + float val = x * ${o}; + setOutput(val); + } + `}},EK=class{constructor(e,t,a,n,r){this.variableNames=["x"],this.outputShape=[],this.packedInputs=!0,this.packedOutput=!0;let s=t,i=e[3]-1;this.outputShape=e;let o,l=`float(${a}) + float(${n}) * sum`;r===.5?o=`inversesqrt(${l})`:r===1?o=`1.0/(${l})`:o=`exp(log(${l}) * float(-${r}));`,this.userCode=` + void main() { + ivec4 coords = getOutputCoords(); + int b = coords.x; + int r = coords.y; + int c = coords.z; + int d = coords.w; + + bool hasNextCol = d < ${this.outputShape[3]}; + bool hasNextRow = c < ${this.outputShape[2]}; + + vec4 sum = vec4(0.); + vec4 xFragAtOutputCoords = getX(b, r, c, d); + + vec4 xAtOutputCoords = vec4( + getChannel(xFragAtOutputCoords, vec2(c, d)), + hasNextCol ? + getChannel(xFragAtOutputCoords, vec2(c, d + 1)) : 0.0, + hasNextRow ? + getChannel(xFragAtOutputCoords , vec2(c + 1, d)) : 0.0, + (hasNextRow && hasNextCol) ? + getChannel(xFragAtOutputCoords, vec2(c + 1, d + 1)) : 0.0 + ); + + int firstChannel = d - ${s}; + vec2 cache = vec2(0.); + if(firstChannel >= 0){ + vec4 firstChannelFrag = getX(b, r, c, firstChannel); + cache.x = getChannel(firstChannelFrag, vec2(c, firstChannel)); + if(hasNextRow){ + cache.y = getChannel(firstChannelFrag, vec2(c + 1, firstChannel)); + } + } + + ivec2 depth = ivec2(d, d + 1); + for (int j = - ${s}; j <= ${s}; j++) { + ivec2 idx = depth + j; + bvec2 aboveLowerBound = greaterThanEqual(idx, ivec2(0)); + bvec2 belowUpperBound = lessThanEqual(idx, ivec2(${i})); + + bool depthInRange = aboveLowerBound.x && belowUpperBound.x; + bool depthPlusOneInRange = aboveLowerBound.y && belowUpperBound.y; + + if(depthInRange || depthPlusOneInRange){ + vec4 z = vec4(0.); + vec4 xFragAtCurrentDepth; + z.xz = cache.xy; + if(depthPlusOneInRange && hasNextCol){ + xFragAtCurrentDepth = idx.y != d ? + getX(b, r, c, idx.y) : xFragAtOutputCoords; + z.y = getChannel(xFragAtCurrentDepth, vec2(c, idx.y)); + if(hasNextRow){ + z.w = getChannel(xFragAtCurrentDepth, vec2(c + 1, idx.y)); + } + } + cache.xy = z.yw; + sum += z * z; + } + } + vec4 result = xAtOutputCoords * ${o}; + setOutput(result); + } + `}},RK=e=>{let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{depthRadius:s,bias:i,alpha:o,beta:l}=n,u=V().getBool("WEBGL_PACK_NORMALIZATION")?new EK(r.shape,s,i,o,l):new NK(r.shape,s,i,o,l);return a.runWebGLProgram(u,[r],r.dtype)},MK={kernelName:rh,backendName:"webgl",kernelFunc:RK},$K=class{constructor(e,t,a,n,r){this.variableNames=["inputImage","outputImage","dy"],this.outputShape=[],this.outputShape=e,this.depth=e[3],this.depthRadius=t,this.bias=a,this.alpha=n,this.beta=r,this.userCode=` + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int r = coords[1]; + int c = coords[2]; + + float result = 0.0; + for (int d = 0; d < ${this.depth}; ++d) { + int depthBegin = int(max(0.0, float(d - ${t}))); + int depthEnd = int(min(float(${this.depth}), + float(d + ${t} + 1))); + + const int MIN_DEPTH_BEGIN = 0; + const int MAX_DEPTH_END = ${this.depth}; + + float norm = 0.0; + for (int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k) { + if (k < depthBegin){ + continue; + } + else if (k >= depthBegin && k < depthEnd) { + norm += getInputImage(b, r, c, k) * getInputImage(b, r, c, k); + } + else { + break; + } + } + + norm = float(${n}) * norm + float(${a}); + + for(int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k){ + if (k < depthBegin){ + continue; + } + else if (k >= depthBegin && k < depthEnd){ + float dyi = -2.0 * float(${n}) + * float(${r}) + * getInputImage(b ,r ,c, k) * getOutputImage(b, r, c, d) + / norm; + if (k == d) { + dyi += pow(norm, -1.0 * ${r}); + } + if (k == coords[3]) { + dyi *= getDy(b, r, c, d); + result += dyi; + } + } + else { + break; + } + } + } + setOutput(result); + } + `}},_K=e=>{let{inputs:t,backend:a,attrs:n}=e,{x:r,y:s,dy:i}=t,{depthRadius:o,bias:l,alpha:u,beta:d}=n,c=new $K(r.shape,o,l,u,d);return a.runWebGLProgram(c,[r,s,i],r.dtype)},FK={kernelName:K1,backendName:"webgl",kernelFunc:_K};function PK(e,t,a,n){let r=v.sizeFromShape(t),s=v.sizeFromShape(e.shape)/r,i=de({inputs:{x:e},attrs:{shape:[s,r]},backend:n}),o=fo(i,e.dtype,"max",n),l=de({inputs:{x:o},attrs:{shape:a},backend:n});return n.disposeIntermediateTensorInfo(i),n.disposeIntermediateTensorInfo(o),l}function v8(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{reductionIndices:s,keepDims:i}=n,o=r.shape.length,l=v.parseAxisParam(s,r.shape),u=l,d=T.getAxesPermutation(u,o),c=d!=null,p=a.shouldExecuteOnCPU([r]),h=r;if(c){if(p){let A=a.texData.get(h.dataId).values,x=new Array(o);for(let S=0;S`Error in maxPool: Either strides or dilations must be 1. Got strides ${i} and dilations '${u}'`);let d=T.computePool2DInfo(r.shape,s,i,u,o,l);if(d.filterWidth===1&&d.filterHeight===1&&v.arraysEqual(d.inShape,d.outShape))return Za({inputs:{x:r},backend:a});let c=new dd(d,"max",!1);return a.runWebGLProgram(c,[r],r.dtype)}var VK={kernelName:Li,backendName:"webgl",kernelFunc:WK};function GK(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{filterSize:s,strides:i,pad:o,dataFormat:l,dimRoundingMode:u}=n,d=[1,1,1],c=T.computePool3DInfo(r.shape,s,i,d,o,u,l),p=new P3(c,"max",!1);return a.runWebGLProgram(p,[r],r.dtype)}var UK={kernelName:sh,backendName:"webgl",kernelFunc:GK},jK=class{constructor(e){this.variableNames=["dy","maxPos"],this.outputShape=e.inShape;let t=e.strideHeight,a=e.strideWidth,n=e.dilationHeight,r=e.effectiveFilterHeight,s=e.effectiveFilterWidth,i=r-1-e.padInfo.top,o=s-1-e.padInfo.left,l=r*s-1;this.userCode=` + const ivec2 pads = ivec2(${i}, ${o}); + + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + + ivec2 dyRCCorner = coords.yz - pads; + int dyRCorner = dyRCCorner.x; + int dyCCorner = dyRCCorner.y; + + // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + for (int wR = 0; wR < ${r}; + wR += ${n}) { + float dyR = float(dyRCorner + wR) / ${t}.0; + + if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) { + continue; + } + int idyR = int(dyR); + + for (int wC = 0; wC < ${s}; wC++) { + float dyC = float(dyCCorner + wC) / ${a}.0; + + if (dyC < 0.0 || dyC >= ${e.outWidth}.0 || + fract(dyC) > 0.0) { + continue; + } + int idyC = int(dyC); + + float dyValue = getDy(b, idyR, idyC, d); + int maxPosValue = ${l} - int(getMaxPos(b, idyR, idyC, d)); + + // Get the current value, check it against the value from the + // position matrix. + int curPosValue = wR * ${s} + wC; + float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0); + + dotProd += dyValue * mask; + } + } + setOutput(dotProd); + } + `}},HK=class{constructor(e){this.variableNames=["dy","maxPos"],this.outputShape=e.inShape;let t=e.strideDepth,a=e.strideHeight,n=e.strideWidth,r=e.dilationDepth,s=e.dilationHeight,i=e.dilationWidth,o=e.effectiveFilterDepth,l=e.effectiveFilterHeight,u=e.effectiveFilterWidth,d=o-1-e.padInfo.front,c=l-1-e.padInfo.top,p=u-1-e.padInfo.left,h=o*l*u-1;this.userCode=` + const ivec3 pads = ivec3(${d}, ${c}, ${p}); + + void main() { + ivec5 coords = getOutputCoords(); + int batch = coords.x; + int ch = coords.u; + + ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads; + int dyDCorner = dyCorner.x; + int dyRCorner = dyCorner.y; + int dyCCorner = dyCorner.z; + + // Convolve dy(?, ?, ?, ch) with pos mask(:, :, :, d) to get + // dx(xD, xR, xC, ch). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + + for (int wD = 0; wD < ${o}; + wD += ${r}) { + float dyD = float(dyDCorner + wD) / ${t}.0; + + if (dyD < 0.0 || dyD >= ${e.outDepth}.0 || fract(dyD) > 0.0) { + continue; + } + int idyD = int(dyD); + + for (int wR = 0; wR < ${l}; + wR += ${s}) { + float dyR = float(dyRCorner + wR) / ${a}.0; + + if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || + fract(dyR) > 0.0) { + continue; + } + int idyR = int(dyR); + + for (int wC = 0; wC < ${u}; + wC += ${i}) { + float dyC = float(dyCCorner + wC) / ${n}.0; + + if (dyC < 0.0 || dyC >= ${e.outWidth}.0 || + fract(dyC) > 0.0) { + continue; + } + int idyC = int(dyC); + + float dyValue = getDy(batch, idyD, idyR, idyC, ch); + int maxPosValue = ${h} - + int(getMaxPos(batch, idyD, idyR, idyC, ch)); + + // Get the current value, check it against the value from the + // position matrix. + int curPosValue = + wD * ${l} * ${u} + + wR * ${u} + wC; + float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0); + + dotProd += dyValue * mask; + } + } + } + setOutput(dotProd); + } + `}};function qK(e){let{inputs:t,backend:a,attrs:n}=e,{dy:r,input:s}=t,i=s,{filterSize:o,strides:l,pad:u,dimRoundingMode:d}=n,c=[1,1,1],p=T.computePool3DInfo(i.shape,o,l,c,u,d),h=new P3(p,"max",!0),f=a.runWebGLProgram(h,[i],i.dtype),m=new HK(p),g=a.runWebGLProgram(m,[r,f],i.dtype);return a.disposeIntermediateTensorInfo(f),g}var XK={kernelName:Y1,backendName:"webgl",kernelFunc:qK};function KK(e){let{inputs:t,backend:a,attrs:n}=e,{dy:r,input:s,output:i}=t,o=s;Jl([s,i],"maxPoolGrad");let{filterSize:l,strides:u,pad:d,dimRoundingMode:c}=n,p=T.computePool2DInfo(o.shape,l,u,1,d,c),h=!0,f=new dd(p,"max",h),m=a.runWebGLProgram(f,[o],o.dtype),g=new jK(p),y=a.runWebGLProgram(g,[r,m],o.dtype);return a.disposeIntermediateTensorInfo(m),y}var ZK={kernelName:Z1,backendName:"webgl",kernelFunc:KK};function YK(e,t,a,n){let r=new dd(a,"max",!1),s=n.runWebGLProgram(r,[e],"float32");r=new dd(a,"max",!0,!0,t);let i=n.runWebGLProgram(r,[e],"float32");return[s,i]}var JK={kernelName:ih,backendName:"webgl",kernelFunc:({inputs:e,attrs:t,backend:a})=>{let{x:n}=e,{filterSize:r,strides:s,pad:i,includeBatchInIndex:o}=t,l=a;v.assert(n.shape.length===4,()=>`Error in maxPool: input must be rank 4 but got rank ${n.shape.length}.`);let u=[1,1];v.assert(T.eitherStridesOrDilationsAreOne(s,u),()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${s} and dilations '${u}'`);let d=T.computePool2DInfo(n.shape,r,s,u,i),[c,p]=YK(n,o,d,l);return[c,p]}};function QK(e,t,a,n){let r=v.sizeFromShape(t),s=v.sizeFromShape(e.shape)/r,i=de({inputs:{x:e},attrs:{shape:[s,r]},backend:n}),o=fo(i,"float32","mean",n),l=de({inputs:{x:o},attrs:{shape:a},backend:n});return n.disposeIntermediateTensorInfo(i),n.disposeIntermediateTensorInfo(o),l}var eZ={kernelName:Bi,backendName:"webgl",kernelFunc:({inputs:e,attrs:t,backend:a})=>{let{x:n}=e,{keepDims:r,axis:s}=t,i=a,o=n.shape.length,l=v.parseAxisParam(s,n.shape),u=l,d=T.getAxesPermutation(u,o),c=d!=null,p=i.shouldExecuteOnCPU([n]),h=[],f=n;if(c){if(p){let x=i.texData.get(f.dataId).values,b=new Array(o);for(let C=0;Cu[0]+e[d]+u[1]);let n=e.length,r=mt(n),s=t.map(u=>u[0]).join(","),i=t.map((u,d)=>u[0]+e[d]).join(","),o=["coords[0]","coords[1]","coords[2]","coords[3]"].slice(0,n),l=a==="reflect"?0:1;if(n===1){this.userCode=` + int start = ${s}; + int end = ${i}; + + void main() { + int outC = getOutputCoords(); + if (outC < start) { + outC = start * 2 - outC - ${l}; + } else if(outC >= end) { + outC = (end - 1) * 2 - outC + ${l}; + } + setOutput(getX(outC - start)); + } + `;return}this.userCode=` + ${r} start = ${r}(${s}); + ${r} end = ${r}(${i}); + + void main() { + ${r} outC = getOutputCoords(); + for (int i = 0; i < ${n}; i++) { + if (outC[i] < start[i]) { + outC[i] = start[i] * 2 - outC[i] - ${l}; + } else if(outC[i] >= end[i]) { + outC[i] = (end[i] - 1) * 2 - outC[i] + ${l}; + } + } + ${r} coords = outC - start; + setOutput(getX(${o})); + } + `}},lZ=class{constructor(e,t,a){this.variableNames=["x"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=t.map((h,f)=>h[0]+e[f]+h[1]);let n=e.length,r=mt(n),s=t.map(h=>h[0]).join(","),i=t.map((h,f)=>h[0]+e[f]).join(","),o=va("rc",n),l=va("source",n),u=`${o[n-1]} < ${this.outputShape[n-1]}`,d=n===1?"source":`vec2(${l.slice(-2).join()})`,c=a==="reflect"?0:1,p="";if(n===1){let h=` + ${r} source = rc; + if (source < start) { + source = start * 2 - source - ${c}; + } else if (source >= end) { + source = (end - 1) * 2 - source + ${c}; + } + source -= start; + `;p=` + ${r} rc = outputLoc; + ${h} + result[0] = getChannel(getX(${l.join()}), ${d}); + ${o[n-1]} += 1; + if(${u}) { + ${h} + result[1] = getChannel(getX(${l.join()}), ${d}); + } + `}else{let h=` + ${r} source = rc; + ${r} lt = ${r}(lessThan(source, start)); + ${r} gte = ${r}(greaterThanEqual(source, end)); + ${r} orig = 1 - (lt + gte); + source = orig * source + + lt * (start * 2 - source - ${c}) + + gte * ((end - 1) * 2 - source + ${c}); + source -= start; + `;p=` + ${r} rc = outputLoc; + ${h} + result[0] = getChannel(getX(${l.join()}), ${d}); + ${o[n-1]} += 1; + if(${u}) { + ${h} + result[1] = getChannel(getX(${l.join()}), ${d}); + } + rc = outputLoc; + ${o[n-2]} += 1; + if(${o[n-2]} < ${this.outputShape[n-2]}) { + ${h} + result[2] = getChannel(getX(${l.join()}), ${d}); + ${o[n-1]} += 1; + if(${u}) { + ${h} + result[3] = getChannel(getX(${l.join()}), ${d}); + } + } + `}this.userCode=` + const ${r} start = ${r}(${s}); + const ${r} end = ${r}(${i}); + + void main() { + ${r} outputLoc = getOutputCoords(); + vec4 result = vec4(0.); + ${p} + setOutput(result); + } + `}},uZ=({inputs:e,backend:t,attrs:a})=>{let{x:n}=e,{paddings:r,mode:s}=a,i=V().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new lZ(n.shape,r,s):new oZ(n.shape,r,s);return t.runWebGLProgram(i,[n],n.dtype)},dZ={kernelName:Vi,backendName:"webgl",kernelFunc:uZ},pZ=`if (b == 0.0) return NAN; + return mod(a, b);`,cZ=` + vec4 result = mod(a, b); + bvec4 isNaN = equal(b, vec4(0.0)); + `+pp+` + return result; +`,hZ=la({opSnippet:pZ,packedOpSnippet:cZ}),fZ={kernelName:Md,backendName:"webgl",kernelFunc:hZ},mZ=class{constructor(e,t,a){this.variableNames=["probs"],this.customUniforms=[{name:"seed",type:"float"}],this.outputShape=[e,a],this.userCode=` + void main() { + ivec2 coords = getOutputCoords(); + int batch = coords[0]; + + float r = random(seed); + float cdf = 0.0; + + for (int i = 0; i < ${t-1}; i++) { + cdf += getProbs(batch, i); + + if (r < cdf) { + setOutput(float(i)); + return; + } + } + + // If no other event happened, last event happened. + setOutput(float(${t-1})); + } + `}},gZ=` +if (a == b) { + return 1.0; +}; +return a / b;`,yZ=` + // vec4 one = vec4(equal(a, b)); + // return one + (vec4(1.0) - one) * a / b; + vec4 result = a / b; + if(a.x == b.x) { + result.x = 1.; + } + if(a.y == b.y) { + result.y = 1.; + } + if(a.z == b.z) { + result.z = 1.; + } + if(a.w == b.w) { + result.w = 1.; + } + + return result; +`,w8=la({opSnippet:gZ,packedOpSnippet:yZ,checkOutOfBounds:!0}),AZ={kernelName:Ci,backendName:"webgl",kernelFunc:w8},Ly="return a - b;",k8=la({opSnippet:Ly,packedOpSnippet:Ly,supportsComplex:!0,cpuKernelImpl:mU}),xZ={kernelName:ys,backendName:"webgl",kernelFunc:k8};function I8(e){let{inputs:t,backend:a,attrs:n}=e,{logits:r}=t,{dim:s}=n,i=v.parseAxisParam([s],r.shape),o=v8({inputs:{x:r},backend:a,attrs:{reductionIndices:i,keepDims:!1}}),l=T.expandShapeToKeepDim(o.shape,i),u=de({inputs:{x:o},backend:a,attrs:{shape:l}}),d=k8({inputs:{a:r,b:u},backend:a}),c=A8({inputs:{x:d},backend:a}),p=Bh({inputs:{x:c},backend:a,attrs:{axis:i,keepDims:!1}}),h=de({inputs:{x:p},backend:a,attrs:{shape:l}}),f=w8({inputs:{a:c,b:h},backend:a});return a.disposeIntermediateTensorInfo(o),a.disposeIntermediateTensorInfo(u),a.disposeIntermediateTensorInfo(d),a.disposeIntermediateTensorInfo(c),a.disposeIntermediateTensorInfo(p),a.disposeIntermediateTensorInfo(h),f}var bZ={kernelName:ao,backendName:"webgl",kernelFunc:I8};function vZ(e){let{inputs:t,backend:a,attrs:n}=e,{logits:r}=t,{numSamples:s,seed:i,normalized:o}=n,l=o?r:I8({inputs:{logits:r},backend:a,attrs:{dim:r.shape.length-1}}),u=l.shape[0],d=l.shape[1],c=new mZ(u,d,s),p=[[i]],h=a.runWebGLProgram(c,[l],"int32",p);return o||a.disposeIntermediateTensorInfo(l),h}var wZ={kernelName:oh,backendName:"webgl",kernelFunc:vZ},kZ=Cn+` + return -x; +`,IZ=` + vec4 result = -x; + bvec4 isNaN = isnan(x); + + result.r = isNaN.r ? x.r : result.r; + result.g = isNaN.g ? x.g : result.g; + result.b = isNaN.b ? x.b : result.b; + result.a = isNaN.a ? x.a : result.a; + + return result; +`;function SZ(e){let{inputs:t,backend:a}=e,{x:n}=t;if(a.shouldExecuteOnCPU([n])){let s=a.texData.get(n.dataId),[i,o]=YG(s.values,n.shape,n.dtype);return a.makeTensorInfo(o,n.dtype,i)}let r;return V().getBool("WEBGL_PACK_UNARY_OPERATIONS")?r=new Js(n.shape,IZ):r=new gr(n.shape,kZ),a.runWebGLProgram(r,[n],n.dtype)}var TZ={kernelName:Cl,backendName:"webgl",kernelFunc:SZ},CZ=Tn.nonMaxSuppressionV3Impl;function NZ(e){T.warn("tf.nonMaxSuppression() in webgl locks the UI thread. Call tf.nonMaxSuppressionAsync() instead");let{inputs:t,backend:a,attrs:n}=e,{boxes:r,scores:s}=t,{maxOutputSize:i,iouThreshold:o,scoreThreshold:l}=n,u=a.readSync(r.dataId),d=a.readSync(s.dataId),{selectedIndices:c}=CZ(u,d,i,o,l);return a.makeTensorInfo([c.length],"int32",new Int32Array(c))}var EZ={kernelName:Gi,backendName:"webgl",kernelFunc:NZ},RZ=Tn.nonMaxSuppressionV4Impl;function MZ(e){T.warn("tf.nonMaxSuppression() in webgl locks the UI thread. Call tf.nonMaxSuppressionAsync() instead");let{inputs:t,backend:a,attrs:n}=e,{boxes:r,scores:s}=t,{maxOutputSize:i,iouThreshold:o,scoreThreshold:l,padToMaxOutputSize:u}=n,d=a.readSync(r.dataId),c=a.readSync(s.dataId),{selectedIndices:p,validOutputs:h}=RZ(d,c,i,o,l,u);return[a.makeTensorInfo([p.length],"int32",new Int32Array(p)),a.makeTensorInfo([],"int32",new Int32Array([h]))]}var $Z={kernelName:Nl,backendName:"webgl",kernelFunc:MZ},_Z=Tn.nonMaxSuppressionV5Impl;function FZ(e){T.warn("tf.nonMaxSuppression() in webgl locks the UI thread. Call tf.nonMaxSuppressionAsync() instead");let{inputs:t,backend:a,attrs:n}=e,{boxes:r,scores:s}=t,{maxOutputSize:i,iouThreshold:o,scoreThreshold:l,softNmsSigma:u}=n,d=a.readSync(r.dataId),c=a.readSync(s.dataId),p=i,h=o,f=l,m=u,{selectedIndices:g,selectedScores:y}=_Z(d,c,p,h,f,m);return[a.makeTensorInfo([g.length],"int32",new Int32Array(g)),a.makeTensorInfo([y.length],"float32",new Float32Array(y))]}var PZ={kernelName:Ui,backendName:"webgl",kernelFunc:FZ},OZ=class{constructor(e,t,a,n){this.variableNames=["indices"],this.outputShape=[e,t],this.userCode=` + void main() { + ivec2 coords = getOutputCoords(); + int index = round(getIndices(coords.x)); + setOutput(mix(float(${n}), float(${a}), + float(index == coords.y))); + } + `}},DZ=e=>{let{inputs:t,backend:a,attrs:n}=e,{indices:r}=t,{dtype:s,depth:i,onValue:o,offValue:l}=n,u=v.sizeFromShape(r.shape),d=new OZ(u,i,o,l),c=de({inputs:{x:r},backend:a,attrs:{shape:[u]}}),p=a.runWebGLProgram(d,[c],s);a.disposeIntermediateTensorInfo(c);let h=[...r.shape,i],f=de({inputs:{x:p},backend:a,attrs:{shape:h}});return a.disposeIntermediateTensorInfo(p),f},zZ={kernelName:Rl,backendName:"webgl",kernelFunc:DZ};function Dc(e){let{inputs:t,backend:a}=e,{x:n}=t;if(n.dtype==="complex64"){let r=hp({inputs:{input:n},backend:a}),s=Dc({inputs:{x:r},backend:a}),i=Wh({inputs:{input:n},backend:a}),o=Dc({inputs:{x:i},backend:a}),l=ks({inputs:{real:s,imag:o},backend:a});return a.disposeIntermediateTensorInfo(r),a.disposeIntermediateTensorInfo(s),a.disposeIntermediateTensorInfo(i),a.disposeIntermediateTensorInfo(o),l}else return fp({attrs:{shape:n.shape,dtype:n.dtype,value:n.dtype==="string"?"":0},backend:a})}var LZ={kernelName:Hl,backendName:"webgl",kernelFunc:Dc};function S8(e){let{inputs:t,backend:a}=e,{x:n}=t;if(n.dtype==="string")throw new Error("onesLike is not supported under string dtype");if(n.dtype==="complex64"){let r=hp({inputs:{input:n},backend:a}),s=S8({inputs:{x:r},backend:a}),i=Wh({inputs:{input:n},backend:a}),o=Dc({inputs:{x:i},backend:a}),l=ks({inputs:{real:s,imag:o},backend:a});return a.disposeIntermediateTensorInfo(r),a.disposeIntermediateTensorInfo(s),a.disposeIntermediateTensorInfo(i),a.disposeIntermediateTensorInfo(o),l}else return fp({attrs:{shape:n.shape,dtype:n.dtype,value:1},backend:a})}var BZ={kernelName:El,backendName:"webgl",kernelFunc:S8};function WZ(e){let{inputs:t,backend:a,attrs:n}=e,{axis:r}=n;if(t.length===1)return C1({inputs:{input:t[0]},backend:a,attrs:{dim:r}});let s=t[0].shape,i=t[0].dtype;t.forEach(d=>{v.assertShapesMatch(s,d.shape,"All tensors passed to stack must have matching shapes"),v.assert(i===d.dtype,()=>"All tensors passed to stack must have matching dtypes")});let o=[],l=t.map(d=>{let c=C1({inputs:{input:d},backend:a,attrs:{dim:r}});return o.push(c),c}),u=d8({inputs:l,backend:a,attrs:{axis:r}});return o.forEach(d=>a.disposeIntermediateTensorInfo(d)),u}var VZ={kernelName:Ml,backendName:"webgl",kernelFunc:WZ},GZ=class{constructor(e,t,a){this.variableNames=["x"],this.customUniforms=[{name:"value",type:"float"}],this.outputShape=t.map((l,u)=>l[0]+e[u]+l[1]);let n=e.length,r=mt(n),s=t.map(l=>l[0]).join(","),i=t.map((l,u)=>l[0]+e[u]).join(","),o=["coords[0]","coords[1]","coords[2]","coords[3]"].slice(0,n);if(n===1){this.userCode=` + int start = ${s}; + int end = ${i}; + + void main() { + int outC = getOutputCoords(); + if (outC < start || outC >= end) { + setOutput(value); + } else { + setOutput(getX(outC - start)); + } + } + `;return}this.userCode=` + ${r} start = ${r}(${s}); + ${r} end = ${r}(${i}); + + void main() { + ${r} outC = getOutputCoords(); + if (any(lessThan(outC, start)) || any(greaterThanEqual(outC, end))) { + setOutput(value); + } else { + ${r} coords = outC - start; + setOutput(getX(${o})); + } + } + `}},UZ=class{constructor(e,t,a){this.variableNames=["x"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"value",type:"float"}],this.outputShape=t.map((f,m)=>f[0]+e[m]+f[1]);let n=e.length,r=mt(n),s=t.map(f=>f[0]).join(","),i=t.map((f,m)=>f[0]+e[m]).join(","),o=va("rc",n),l=va("source",n),u=`${o[n-1]} < ${this.outputShape[n-1]}`,d=n===1?"source":`vec2(${l.slice(-2).join()})`,c=[`${r} rc = outputLoc;`,`${o[n-1]} += 1; + if(${u}) { + `,n===1?"":`} + rc = outputLoc; + ${o[n-2]} += 1; + if(${o[n-2]} < ${this.outputShape[n-2]}) {`,n===1?"":` ${o[n-1]} += 1; + if(${u}) {`],p=n===1?"rc < start || rc >= end":"any(lessThan(rc, start)) || any(greaterThanEqual(rc, end))",h="";for(let f=0,m=n===1?2:4;f{let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{paddings:s,constantValue:i}=n;if(v.sizeFromShape(r.shape)===0){let u=s.map((d,c)=>d[0]+r.shape[c]+d[1]);return fp({backend:a,attrs:{shape:u,value:i,dtype:r.dtype}})}let o=V().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new UZ(r.shape,s,i):new GZ(r.shape,s,i),l=[[i]];return a.runWebGLProgram(o,[r],r.dtype,l)},jZ={kernelName:ji,backendName:"webgl",kernelFunc:T8},HZ=` + if(a < 0.0 && floor(b) < b){ + return NAN; + } + if (b == 0.0) { + return 1.0; + } + return (round(mod(b, 2.0)) != 1) ? + pow(abs(a), b) : sign(a) * pow(abs(a), b); +`,qZ=` + // isModRound1 has 1 for components with round(mod(b, 2.0)) == 1, 0 otherwise. + vec4 isModRound1 = vec4(equal(round(mod(b, 2.0)), ivec4(1))); + vec4 multiplier = sign(a) * isModRound1 + (vec4(1.0) - isModRound1); + vec4 result = multiplier * pow(abs(a), b); + + // Ensure that a^0 = 1, including 0^0 = 1 as this correspond to TF and JS + bvec4 isExpZero = equal(b, vec4(0.0)); + result.r = isExpZero.r ? 1.0 : result.r; + result.g = isExpZero.g ? 1.0 : result.g; + result.b = isExpZero.b ? 1.0 : result.b; + result.a = isExpZero.a ? 1.0 : result.a; + + bvec4 isNaN1 = lessThan(a, vec4(0.0)); + bvec4 isNaN2 = lessThan(floor(b), b); + bvec4 isNaN = bvec4(isNaN1.x && isNaN2.x, isNaN1.y && isNaN2.y, isNaN1.z && isNaN2.z, isNaN1.w && isNaN2.w); + `+pp+` + return result; +`,XZ=la({opSnippet:HZ,packedOpSnippet:qZ}),KZ={kernelName:Hi,backendName:"webgl",kernelFunc:XZ};function ZZ(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{axis:s,keepDims:i}=n,o=r.shape.length,l=[],u=v.parseAxisParam(s,r.shape),d=u,c=T.getAxesPermutation(d,o),p=r;c!=null&&(p=Ia({inputs:{x:r},backend:a,attrs:{perm:c}}),d=T.getInnerMostAxes(d.length,o),l.push(p)),T.assertAxesAreInnerMostDims("prod",d,o);let h;if(a.shouldExecuteOnCPU([p])){let f=a.texData.get(p.dataId).values,{outVals:m,outShape:g,outDtype:y}=QG(p.shape,p.dtype,f,d);h=a.makeTensorInfo(g,y,m)}else{let[f,m]=T.computeOutAndReduceShapes(p.shape,d),g=v.sizeFromShape(m),y=de({inputs:{x:p},backend:a,attrs:{shape:[-1,g]}}),A=jd(r.dtype),x=fo(y,A,"prod",a);h=de({inputs:{x},backend:a,attrs:{shape:f}}),l.push(y),l.push(x)}if(i){l.push(h);let f=T.expandShapeToKeepDim(h.shape,u);h=de({inputs:{x:h},backend:a,attrs:{shape:f}})}return l.forEach(f=>a.disposeIntermediateTensorInfo(f)),h}var YZ={kernelName:Xi,backendName:"webgl",kernelFunc:ZZ};function JZ(e){let{inputs:t,backend:a,attrs:n}=e,{paramsNestedSplits:r,paramsDenseValues:s,indices:i}=t,{outputRaggedRank:o}=n,l=r.map(y=>a.readSync(y.dataId)),u=r.map(y=>y.shape),d=a.readSync(s.dataId),c=a.readSync(i.dataId),[p,h,f]=eU(l,u,d,s.shape,s.dtype,c,i.shape,o),m=p.map(y=>a.makeTensorInfo([y.length],"int32",y)),g=a.makeTensorInfo(f,s.dtype,h);return m.concat([g])}var QZ={kernelName:lh,backendName:"webgl",kernelFunc:JZ};function eY(e){let{inputs:t,backend:a}=e,{starts:n,limits:r,deltas:s}=t,i=a.readSync(n.dataId),o=a.readSync(r.dataId),l=a.readSync(s.dataId),[u,d]=tU(i,n.shape,n.dtype,o,r.shape,l,s.shape),c=a.makeTensorInfo([u.length],"int32",u),p=a.makeTensorInfo([d.length],n.dtype,d);return[c,p]}var tY={kernelName:uh,backendName:"webgl",kernelFunc:eY};function aY(e){let{inputs:t,backend:a,attrs:n}=e,{shape:r,values:s,defaultValue:i,rowPartitionTensors:o}=t,{rowPartitionTypes:l}=n,u=a.readSync(r.dataId),d=a.readSync(s.dataId),c=a.readSync(i.dataId),p=o.map(g=>a.readSync(g.dataId)),h=o.map(g=>g.shape),[f,m]=aU(u,r.shape,d,s.shape,s.dtype,c,i.shape,p,h,l);return a.makeTensorInfo(f,s.dtype,m)}var nY={kernelName:dh,backendName:"webgl",kernelFunc:aY},C8=e=>{let{backend:t,attrs:a}=e,{start:n,stop:r,step:s,dtype:i}=a,o=nU(n,r,s,i);return t.makeTensorInfo([o.length],i,o)},rY={kernelName:$l,backendName:"webgl",kernelFunc:C8},sY="return 1.0 / x;",iY=Qe({opSnippet:sY}),oY={kernelName:_l,backendName:"webgl",kernelFunc:iY},lY=Cn+` + return (x < 0.0) ? 0.0 : x; +`,uY=` + vec4 result = x * vec4(greaterThanEqual(x, vec4(0.0))); + bvec4 isNaN = isnan(x); + + result.r = isNaN.r ? x.r : result.r; + result.g = isNaN.g ? x.g : result.g; + result.b = isNaN.b ? x.b : result.b; + result.a = isNaN.a ? x.a : result.a; + + return result; +`,dY=Qe({opSnippet:lY,packedOpSnippet:uY}),pY={kernelName:Ki,backendName:"webgl",kernelFunc:dY},cY=Cn+` + return (x < 0.0) ? 0.0 : min(6.0, x); +`,hY=` + vec4 result = min(x, vec4(6.)) * vec4(greaterThanEqual(x, vec4(0.0))); + bvec4 isNaN = isnan(x); + + result.r = isNaN.r ? x.r : result.r; + result.g = isNaN.g ? x.g : result.g; + result.b = isNaN.b ? x.b : result.b; + result.a = isNaN.a ? x.a : result.a; + + return result; +`,fY=Qe({opSnippet:cY,packedOpSnippet:hY}),mY={kernelName:Ji,backendName:"webgl",kernelFunc:fY},gY=class{constructor(e,t,a,n,r){this.variableNames=["A"],this.outputShape=[];let[s,i,o,l]=e;this.outputShape=[s,t,a,l];let u=[n&&t>1?i-1:i,n&&a>1?o-1:o],d=[n&&t>1?t-1:t,n&&a>1?a-1:a],c;r?c="(vec2(yRC) + vec2(0.5)) * effectiveInputOverOutputRatioRC - vec2(0.5)":c="vec2(yRC) * effectiveInputOverOutputRatioRC",this.userCode=` + const vec2 effectiveInputOverOutputRatioRC = vec2( + ${u[0]/d[0]}, + ${u[1]/d[1]}); + const vec2 inputShapeRC = vec2(${i}.0, ${o}.0); + + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + ivec2 yRC = coords.yz; + + // Fractional source index. + vec2 sourceFracIndexRC = ${c}; + + // Compute the four integer indices. + ivec2 sourceFloorRC = ivec2(max(sourceFracIndexRC, vec2(0.0))); + ivec2 sourceCeilRC = ivec2( + min(inputShapeRC - 1.0, ceil(sourceFracIndexRC))); + + float topLeft = getA(b, sourceFloorRC.x, sourceFloorRC.y, d); + float bottomLeft = getA(b, sourceCeilRC.x, sourceFloorRC.y, d); + float topRight = getA(b, sourceFloorRC.x, sourceCeilRC.y, d); + float bottomRight = getA(b, sourceCeilRC.x, sourceCeilRC.y, d); + + vec2 fracRC = sourceFracIndexRC - vec2(sourceFloorRC); + + float top = topLeft + (topRight - topLeft) * fracRC.y; + float bottom = bottomLeft + (bottomRight - bottomLeft) * fracRC.y; + float newValue = top + (bottom - top) * fracRC.x; + + setOutput(newValue); + } + `}},yY=class{constructor(e,t,a,n,r){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=[];let[s,i,o,l]=e;this.outputShape=[s,t,a,l];let u=[n&&t>1?i-1:i,n&&a>1?o-1:o],d=[n&&t>1?t-1:t,n&&a>1?a-1:a],c;r?c="(vec3(yRC) + vec3(0.5)) * effectiveInputOverOutputRatioRC - vec3(0.5)":c="vec3(yRC) * effectiveInputOverOutputRatioRC",this.userCode=` + const vec3 effectiveInputOverOutputRatioRC = vec3( + ${u[0]/d[0]}, + ${u[1]/d[1]}, + ${u[1]/d[1]}); + const vec3 inputShapeRC = vec3(${i}.0, ${o}.0, + ${o}.0); + + float getAValue(int b, int r, int c, int d) { + return getChannel(getA(b, r, c, d), vec2(c, d)); + } + + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + // Calculate values for next column in yRC.z. + ivec3 yRC = coords.yzz + ivec3(0, 0, 1); + + // Fractional source index. + vec3 sourceFracIndexRC = ${c}; + + // Compute the four integer indices. + ivec3 sourceFloorRC = ivec3(max(sourceFracIndexRC, vec3(0.0))); + ivec3 sourceCeilRC = ivec3( + min(inputShapeRC - 1.0, ceil(sourceFracIndexRC))); + + // Should we calculate next column and row elements in 2x2 packed cell. + bool hasNextCol = d < ${l-1}; + bool hasNextRow = coords.z < ${a-1}; + + // In parallel, construct four corners for all four components in + // packed 2x2 cell. + vec4 topLeft = vec4( + getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d), + hasNextCol ? getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d + 1) + : 0.0, + hasNextRow ? getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d) + : 0.0, + (hasNextRow && hasNextCol) ? + getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d + 1) : 0.0); + + vec4 bottomLeft = vec4( + getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d), + hasNextCol ? getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d + 1) + : 0.0, + hasNextRow ? getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d) + : 0.0, + (hasNextRow && hasNextCol) ? + getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d + 1) : 0.0); + + vec4 topRight = vec4( + getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d), + hasNextCol ? getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d + 1) + : 0.0, + hasNextRow ? getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d) + : 0.0, + (hasNextRow && hasNextCol) ? + getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d + 1) : 0.0); + + vec4 bottomRight = vec4( + getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d), + hasNextCol ? getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d + 1) + : 0.0, + hasNextRow ? getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d) + : 0.0, + (hasNextRow && hasNextCol) ? + getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d + 1) : 0.0); + + vec3 fracRC = sourceFracIndexRC - vec3(sourceFloorRC); + + vec4 top = mix(topLeft, topRight, fracRC.yyzz); + vec4 bottom = mix(bottomLeft, bottomRight, fracRC.yyzz); + vec4 newValue = mix(top, bottom, fracRC.x); + + setOutput(newValue); + } + `}};function AY(e){let{inputs:t,backend:a,attrs:n}=e,{images:r}=t,{alignCorners:s,halfPixelCenters:i,size:o}=n,[l,u]=o,d=V().getBool("WEBGL_PACK_IMAGE_OPERATIONS")?new yY(r.shape,l,u,s,i):new gY(r.shape,l,u,s,i);return a.runWebGLProgram(d,[r],"float32")}var xY={kernelName:Yi,backendName:"webgl",kernelFunc:AY},bY=class{constructor(e,t,a){this.variableNames=["dy"],this.outputShape=[],this.outputShape=t;let[,n,r]=t,[,s,i]=e,o=[a&&s>1?n-1:n,a&&i>1?r-1:r],l=[a&&s>1?s-1:s,a&&i>1?i-1:i],u=o[0]/l[0],d=o[1]/l[1],c=1/u,p=1/d,h=Math.ceil(c)*2+2,f=Math.ceil(p)*2+2;this.userCode=` + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + int r = coords[1]; + int c = coords[2]; + + float accumulator = 0.0; + + const float heightScale = float(${u}); + const float widthScale = float(${d}); + + const float invHeightScale = float(${c}); + const float invWidthScale = float(${p}); + + const int winHeight = int(${h}); + const int winWidth = int(${f}); + + // Compute bounds for where in dy we will look + float startRLerp = floor(float(r) * invHeightScale); + int startDyR = int(startRLerp - float(winHeight / 2)); + + float startCLerp = floor(float(c) * invWidthScale); + int startDyC = int(startCLerp - float(winWidth / 2)); + + // Loop over dy + for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) { + int dyR = dyROffset + startDyR; + + // Guard against the window exceeding the bounds of dy + if (dyR < 0 || dyR >= ${s}) { + continue; + } + + for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) { + int dyC = dyCOffset + startDyC; + + // Guard against the window exceeding the bounds of dy + if (dyC < 0 || dyC >= ${i}) { + continue; + } + + float dxR = float(dyR) * heightScale; + int topDxRIndex = int(floor(dxR)); + int bottomDxRIndex = int(min(ceil(dxR), ${n-1}.0)); + float dxRLerp = dxR - float(topDxRIndex); + float inverseDxRLerp = 1.0 - dxRLerp; + + float dxC = float(dyC) * widthScale; + int leftDxCIndex = int(floor(dxC)); + int rightDxCIndex = int(min(ceil(dxC), ${r-1}.0)); + float dxCLerp = dxC - float(leftDxCIndex); + float inverseDxCLerp = 1.0 - dxCLerp; + + if (r == topDxRIndex && c == leftDxCIndex) { + // topLeft + accumulator += + getDy(b, dyR, dyC, d) * inverseDxRLerp * inverseDxCLerp; + } + + if (r == topDxRIndex && c == rightDxCIndex) { + // topRight + accumulator += getDy(b, dyR, dyC, d) * inverseDxRLerp * dxCLerp; + } + + if (r == bottomDxRIndex && c == leftDxCIndex) { + // bottomLeft + accumulator += getDy(b, dyR, dyC, d) * dxRLerp * inverseDxCLerp; + } + + if (r == bottomDxRIndex && c == rightDxCIndex) { + // bottomRight + accumulator += getDy(b, dyR, dyC, d) * dxRLerp * dxCLerp; + } + } + } + // End loop over dy + + setOutput(accumulator); + } + `}};function vY(e){let{inputs:t,backend:a,attrs:n}=e,{images:r,dy:s}=t,{alignCorners:i}=n,o=new bY(s.shape,r.shape,i);return a.runWebGLProgram(o,[s],s.dtype)}var wY={kernelName:Q1,backendName:"webgl",kernelFunc:vY},kY=class{constructor(e,t,a,n,r){this.variableNames=["A"],this.outputShape=[];let[s,i,o,l]=e;this.outputShape=[s,t,a,l];let u=[n&&t>1?i-1:i,n&&a>1?o-1:o],d=[n&&t>1?t-1:t,n&&a>1?a-1:a],c=n?"0.5":"0.0",p;r?p="max((vec2(yRC) + vec2(0.5)) * effectiveInputOverOutputRatioRC, vec2(0.0))":p="vec2(yRC) * effectiveInputOverOutputRatioRC",this.userCode=` + const vec2 effectiveInputOverOutputRatioRC = vec2( + ${u[0]/d[0]}, + ${u[1]/d[1]}); + const vec2 inputShapeRC = vec2(${i}.0, ${o}.0); + + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + ivec2 yRC = coords.yz; + + // Fractional source index. + vec2 sourceFracIndexRC = ${p}; + + // Compute the coordinators of nearest neighbor point. + ivec2 sourceNearestRC = ivec2( + min(inputShapeRC - 1.0, floor(sourceFracIndexRC + ${c}))); + float newValue = getA(b, sourceNearestRC.x, sourceNearestRC.y, d); + + setOutput(newValue); + } + `}},IY=class{constructor(e,t,a,n,r){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=[];let[s,i,o,l]=e;this.outputShape=[s,t,a,l];let u=[n&&t>1?i-1:i,n&&a>1?o-1:o],d=[n&&t>1?t-1:t,n&&a>1?a-1:a],c=n?"0.5":"0.0",p;r?p="max((vec3(yRC) + vec3(0.5)) * effectiveInputOverOutputRatioRC, vec3(0.0))":p="vec3(yRC) * effectiveInputOverOutputRatioRC",this.userCode=` + const vec3 effectiveInputOverOutputRatioRC = vec3( + ${u[0]/d[0]}, + ${u[1]/d[1]}, + ${u[1]/d[1]}); + const vec3 inputShapeRC = vec3(${i}.0, ${o}.0, + ${o}.0); + + float getAValue(int b, int r, int c, int d) { + return getChannel(getA(b, r, c, d), vec2(c, d)); + } + + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + // Calculate values for next column in yRC.z. + ivec3 yRC = coords.yzz + ivec3(0, 0, 1); + + // Fractional source index. + vec3 sourceFracIndexRC = ${p}; + + // Compute the coordinators of nearest neighbor point. + ivec3 sourceNearestRC = ivec3( + min(inputShapeRC - 1.0, floor(sourceFracIndexRC + ${c}))); + + // Should we calculate next column and row elements in 2x2 packed cell. + bool hasNextCol = d < ${l-1}; + bool hasNextRow = coords.z < ${a-1}; + + vec4 newValue = vec4( + getAValue(b, sourceNearestRC.x, sourceNearestRC.y, d), + hasNextCol ? getAValue(b, sourceNearestRC.x, sourceNearestRC.y, d + 1) + : 0.0, + hasNextRow ? getAValue(b, sourceNearestRC.x, sourceNearestRC.z, d) + : 0.0, + (hasNextRow && hasNextCol) ? + getAValue(b, sourceNearestRC.x, sourceNearestRC.z, d + 1) : 0.0); + + setOutput(newValue); + } + `}};function SY(e){let{inputs:t,backend:a,attrs:n}=e,{images:r}=t,{alignCorners:s,halfPixelCenters:i,size:o}=n,[l,u]=o,d=V().getBool("WEBGL_PACK_IMAGE_OPERATIONS")?new IY(r.shape,l,u,s,i):new kY(r.shape,l,u,s,i);return a.runWebGLProgram(d,[r],r.dtype)}var TY={kernelName:Zi,backendName:"webgl",kernelFunc:SY},CY=class{constructor(e,t,a){this.variableNames=["dy"],this.outputShape=[],this.outputShape=t;let[,n,r]=t,[,s,i]=e,o=[a&&s>1?n-1:n,a&&i>1?r-1:r],l=[a&&s>1?s-1:s,a&&i>1?i-1:i],u=o[0]/l[0],d=o[1]/l[1],c=1/u,p=1/d,h=Math.ceil(c)*2+2,f=Math.ceil(p)*2+2;this.userCode=` + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + int r = coords[1]; + int c = coords[2]; + + float accumulator = 0.0; + + const float heightScale = float(${u}); + const float widthScale = float(${d}); + + const float invHeightScale = float(${c}); + const float invWidthScale = float(${p}); + + const int winHeight = int(${h}); + const int winWidth = int(${f}); + + // Compute bounds for where in dy we will look + float startRLerp = floor(float(r) * invHeightScale); + int startDyR = int(floor(startRLerp - float(winHeight / 2))); + + float startCLerp = floor(float(c) * invWidthScale); + int startDyC = int(floor(startCLerp - float(winWidth / 2))); + + // Loop over dy + for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) { + int dyR = dyROffset + startDyR; + + // Guard against the window exceeding the bounds of dy + if (dyR < 0 || dyR >= ${s}) { + continue; + } + + for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) { + int dyC = dyCOffset + startDyC; + + // Guard against the window exceeding the bounds of dy + if (dyC < 0 || dyC >= ${i}) { + continue; + } + + float sourceFracRow = + float(${o[0]}) * + (float(dyR) / float(${l[0]})); + + float sourceFracCol = + float(${o[1]}) * + (float(dyC) / float(${l[1]})); + + int sourceNearestRow = int(min( + float(int(${n}) - 1), + ${a} ? float(round(sourceFracRow)) : + float(floor(sourceFracRow)))); + + int sourceNearestCol = int(min( + float(int(${r}) - 1), + ${a} ? float(round(sourceFracCol)) : + float(floor(sourceFracCol)))); + + if (r == sourceNearestRow && c == sourceNearestCol) { + accumulator += getDy(b, dyR, dyC, d); + } + } + } + // End loop over dy + + setOutput(accumulator); + } + `}};function NY(e){let{inputs:t,backend:a,attrs:n}=e,{images:r,dy:s}=t,{alignCorners:i}=n,o=new CY(s.shape,r.shape,i);return a.runWebGLProgram(o,[s],s.dtype)}var EY={kernelName:J1,backendName:"webgl",kernelFunc:NY},RY=class{constructor(e,t){this.variableNames=["x"];let a=e.length;if(a>4)throw new Error(`WebGL backend: Reverse of rank-${a} tensor is not yet supported`);if(this.outputShape=e,a===1){this.userCode=` + void main() { + int coord = getOutputCoords(); + setOutput(getX(${e[0]} - coord - 1)); + } + `;return}let n=i=>t.indexOf(i)!==-1&&e[i]!==1?`${e[i]} - coords[${i}] - 1`:`coords[${i}]`,r=e.map((i,o)=>n(o)).join(","),s=mt(a);this.userCode=` + void main() { + ${s} coords = getOutputCoords(); + setOutput(getX(${r})); + } + `}},MY=class{constructor(e,t){this.variableNames=["x"],this.packedInputs=!0,this.packedOutput=!0;let a=e.length;if(a>4)throw new Error(`WebGL backend: Reverse of rank-${a} tensor is not yet supported`);this.outputShape=e;let n=va("rc",a),r=`${n[a-1]} + 1 < ${this.outputShape[a-1]}`,s=`${n[a-2]} + 1 < ${this.outputShape[a-2]}`,i=mt(a);a===1?this.userCode=` + void main(){ + int rc = getOutputCoords(); + vec4 result = vec4(0.); + result.r = getChannel(getX(${e[0]} - rc - 1), + ${e[0]} - rc - 1); + if(${r}){ + result.g = getChannel(getX(${e[0]} - (rc + 1) - 1), + ${e[0]} - (rc + 1) - 1); + } + setOutput(result); + } + `:this.userCode=` + void main() { + ${i} rc = getOutputCoords(); + vec4 result = vec4(0.); + result.r = ${o(n.slice())}; + if(${r}){ + result.g = ${l(n.slice())}; + } + if(${s}) { + result.b = ${u(n.slice())}; + if(${r}) { + result.a = ${d(n.slice())}; + } + } + setOutput(result); + } + `;function o(h){return c(h)}function l(h){return h[a-1]="("+h[a-1]+" + 1)",c(h)}function u(h){return h[a-2]="("+h[a-2]+" + 1)",c(h)}function d(h){return h[a-1]="("+h[a-1]+" + 1)",h[a-2]="("+h[a-2]+" + 1)",c(h)}function c(h){let f=e.map((y,A)=>p(A,h)),m=f.join(","),g=f.slice(-2).join(",");return`getChannel(getX(${m}), vec2(${g}))`}function p(h,f){return t.indexOf(h)!==-1&&e[h]!==1?`${e[h]} - ${f[h]} - 1`:`${f[h]}`}}};function $Y(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{dims:s}=n,i=r.shape.length,o=v.parseAxisParam(s,r.shape);if(i===0)return Za({inputs:{x:r},backend:a});let l=V().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new MY(r.shape,o):new RY(r.shape,o);return a.runWebGLProgram(l,[r],r.dtype)}var _Y={kernelName:Pl,backendName:"webgl",kernelFunc:$Y},FY=class{constructor(e,t){this.variableNames=["Image"],this.outputShape=[],this.customUniforms=[{name:"params",type:"vec4"}];let a=e[1],n=e[2];this.outputShape=e;let r="";typeof t=="number"?r=`float outputValue = ${t.toFixed(2)};`:r=` + vec3 fill = vec3(${t.join(",")}); + float outputValue = fill[coords[3]];`,this.userCode=` + void main() { + ivec4 coords = getOutputCoords(); + int x = coords[2]; + int y = coords[1]; + float coordXFloat = (float(x) - params[0]) * params[3] - + (float(y) - params[1]) * params[2]; + float coordYFloat = (float(x) - params[0]) * params[2] + + (float(y) - params[1]) * params[3]; + int coordX = int(round(coordXFloat + params[0])); + int coordY = int(round(coordYFloat + params[1])); + ${r} + if(coordX >= 0 && coordX < ${n} && coordY >= 0 && coordY < ${a}) { + outputValue = getImage(coords[0], coordY, coordX, coords[3]); + } + setOutput(outputValue); + } + `}},PY={kernelName:lo,backendName:"webgl",kernelFunc:({inputs:e,attrs:t,backend:a})=>{let{image:n}=e,{radians:r,fillValue:s,center:i}=t,o=a,l=new FY(n.shape,s),[u,d]=T.getImageCenter(i,n.shape[1],n.shape[2]),c=[[u,d,Math.sin(r),Math.cos(r)]];return o.runWebGLProgram(l,[n],n.dtype,c)}},OY=` + // OpenGL ES does not support round function. + // The algorithm is based on banker's rounding. + float base = floor(x); + if ((x - base) < 0.5) { + return floor(x); + } else if ((x - base) > 0.5) { + return ceil(x); + } else { + if (mod(base, 2.0) == 0.0) { + return base; + } else { + return base + 1.0; + } + } +`,DY=Qe({opSnippet:OY}),zY={kernelName:Ol,backendName:"webgl",kernelFunc:DY},LY="return inversesqrt(x);",BY=Qe({opSnippet:LY,cpuKernelImpl:rU}),WY={kernelName:hs,backendName:"webgl",kernelFunc:BY},N8=class{constructor(e,t,a,n,r,s,i=!0){this.variableNames=["updates","indices","defaultValue"],this.outputShape=s;let o=mt(r.length),l=mt(s.length),u="";a===1?u="i":a===2&&(u="i, j");let d=`getIndices(${u})`,c="";n===1?c="i":n===2&&(c="i, coords[1]");let p=`getUpdates(${c})`,h=t>1?"strides[j]":"strides";this.userCode=` + ${o} strides = ${o}(${r}); + + void main() { + ${l} coords = getOutputCoords(); + float sum = 0.0; + bool found = false; + for (int i = 0; i < ${e}; i++) { + int flattenedIndex = 0; + for (int j = 0; j < ${t}; j++) { + int index = round(${d}); + flattenedIndex += index * ${h}; + } + if (flattenedIndex == coords[0]) { + sum += ${p}; + found = true; + } + } + setOutput(mix(getDefaultValue(), sum, float(found))); + } + `}};function VY(e){let{inputs:t,backend:a,attrs:n}=e,{indices:r,updates:s}=t,{shape:i}=n,{sliceRank:o,numUpdates:l,sliceSize:u,strides:d,outputSize:c}=T.calculateShapes(s,r,i),p=[c/u,u];if(c===0)return a.makeTensorInfo(i,r.dtype);let h=de({inputs:{x:r},backend:a,attrs:{shape:[l,o]}}),f=de({inputs:{x:s},backend:a,attrs:{shape:[l,u]}}),m=a.makeTensorInfo([],"float32",new Float32Array([0])),g=new N8(l,o,h.shape.length,f.shape.length,d,p),y=a.runWebGLProgram(g,[f,h,m],f.dtype),A=de({inputs:{x:y},backend:a,attrs:{shape:i}});return a.disposeIntermediateTensorInfo(h),a.disposeIntermediateTensorInfo(f),a.disposeIntermediateTensorInfo(y),a.disposeIntermediateTensorInfo(m),A}var GY={kernelName:Qi,backendName:"webgl",kernelFunc:VY},UY=class{constructor(e,t,a,n){this.variableNames=["sortedSequence","values"],this.customUniforms=[{name:"numInputs",type:"int"}],this.outputShape=[e,a];let r="while (left < right) {",s=`for (int i = 0; i < ${Math.ceil(Math.log2(t+1))}; ++i) { if (left >= right) break;`,i=V().getNumber("WEBGL_VERSION")===2?r:s,o=n==="left"?"<":"<=";this.userCode=` + int findBound(int batch, float value) { + int left = 0; + int right = numInputs; + int mid; + ${i} + mid = (left + right) / 2; + if (getSortedSequence(batch, mid) ${o} value) { + left = mid + 1; + } else { + right = mid; + } + } + return right; + } + + void main() { + ivec2 coords = getOutputCoords(); + int batch = coords[0]; + int valueIndex = coords[1]; + + float value = getValues(batch, valueIndex); + + setOutput(float(findBound(batch, value))); + } + `}};function jY(e){let{inputs:t,backend:a,attrs:n}=e,{sortedSequence:r,values:s}=t,{side:i}=n,o=new UY(r.shape[0],r.shape[1],s.shape[1],i),l=[[r.shape[1]]];return a.runWebGLProgram(o,[r,s],"int32",l)}var HY={kernelName:ph,backendName:"webgl",kernelFunc:jY},qY=class{constructor(e,t,a){this.variableNames=["c","a","b"],this.outputShape=t;let n,r;if(a>4)throw Error(`Where for rank ${a} is not yet supported`);if(a===1)r="resRC",n="resRC";else{let i=["resRC.x","resRC.y","resRC.z","resRC.w"],o=[],l=[];for(let u=0;u= 1.0) { + setOutput(getA(${r})); + } else { + setOutput(getB(${r})); + } + } + `}};function XY(e){let{inputs:t,backend:a}=e,{condition:n,t:r,e:s}=t,i=new qY(n.shape.length,r.shape,r.shape.length);return a.runWebGLProgram(i,[n,r,s],ra(r.dtype,s.dtype))}var KY={kernelName:Dl,backendName:"webgl",kernelFunc:XY},ZY=` + // Stable and Attracting Fixed Point (0, 1) for Normalized Weights. + // see: https://arxiv.org/abs/1706.02515 + float scaleAlpha = ${T.SELU_SCALEALPHA}; + float scale = ${T.SELU_SCALE}; + return (x >= 0.0) ? scale * x : scaleAlpha * (exp(x) - 1.0); +`,YY=Qe({opSnippet:ZY}),JY={kernelName:_d,backendName:"webgl",kernelFunc:YY},QY=ru+` + return 1.0 / (1.0 + exp(-1.0 * x)); +`,eJ=` + vec4 result = 1.0 / (1.0 + exp(-1.0 * x)); + bvec4 isNaN = isnan(x); + + result.r = isNaN.r ? x.r : result.r; + result.g = isNaN.g ? x.g : result.g; + result.b = isNaN.b ? x.b : result.b; + result.a = isNaN.a ? x.a : result.a; + + return result; +`,tJ=Qe({opSnippet:QY,packedOpSnippet:eJ,cpuKernelImpl:iU}),aJ={kernelName:fs,backendName:"webgl",kernelFunc:tJ},nJ=` + if (isnan(x)) { return 0.0; } + return sign(x); +`,rJ=Qe({opSnippet:nJ}),sJ={kernelName:Fd,backendName:"webgl",kernelFunc:rJ},iJ=ru+` + return sin(x); +`,oJ=Qe({opSnippet:iJ}),lJ={kernelName:eo,backendName:"webgl",kernelFunc:oJ},uJ=` + float e2x = exp(x); + return (e2x - 1.0 / e2x) / 2.0; +`,dJ=Qe({opSnippet:uJ}),pJ={kernelName:Ll,backendName:"webgl",kernelFunc:dJ},cJ=` + float epsilon = 1.1920928955078125e-7; + float threshold = log(epsilon) + 2.0; + + bool too_large = x > -threshold; + bool too_small = x < threshold; + + float result; + float exp_x = exp(x); + + if (too_large){ + result = x; + } + else if (too_small){ + result = exp_x; + } + else{ + result = log(exp_x + 1.0); + } + return result; +`,hJ=Qe({opSnippet:cJ}),fJ={kernelName:Pd,backendName:"webgl",kernelFunc:hJ},mJ=e=>{let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{blockShape:s,paddings:i}=n;v.assert(r.shape.length<=4,()=>"spaceToBatchND for rank > 4 with a WebGL backend not implemented yet");let o=s.reduce((y,A)=>y*A),l=[[0,0]];l.push(...i);for(let y=1+s.length;ya.disposeIntermediateTensorInfo(y)),g},gJ={kernelName:Bl,backendName:"webgl",kernelFunc:mJ};function yJ(e){let{inputs:t,backend:a}=e,{indices:n,values:r,denseShape:s,defaultValue:i}=t;if(s.shape.length!==1)throw new Error(`Dense shape must be a vector, saw: + ${s.shape}`);if(n.shape.length!==2)throw new Error(`Indices must be a matrix, saw: + ${n.shape}`);if(r.shape.length!==1)throw new Error(`Values must be a vector, saw: + ${r.shape}`);if(i.shape.length!==0)throw new Error(`Default value must be a scalar, saw: + ${i.shape}`);let o=a.readSync(n.dataId),l=a.readSync(r.dataId),u=a.readSync(s.dataId),d=a.readSync(i.dataId)[0],[c,p,h,f,m]=lU(o,n.shape,n.dtype,l,r.dtype,u,d);return[a.makeTensorInfo(p,n.dtype,c),a.makeTensorInfo([p[0]],r.dtype,h),a.makeTensorInfo([f.length],"bool",new Uint8Array(f.map(g=>Number(g)))),a.makeTensorInfo([m.length],n.dtype,new Int32Array(m))]}var AJ={kernelName:Od,backendName:"webgl",kernelFunc:yJ};function xJ(e){let{inputs:t,backend:a}=e,{inputIndices:n,inputShape:r,newShape:s}=t;if(n.shape.length!==2)throw new Error(`Input indices should be a matrix but received shape ${n.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(a.readSync(r.dataId)),o=a.readSync(n.dataId),l=Array.from(a.readSync(s.dataId)),[u,d,c]=uU(o,n.shape,n.dtype,i,l);return[a.makeTensorInfo(d,n.dtype,u),a.makeTensorInfo([c.length],s.dtype,new Int32Array(c))]}var bJ={kernelName:Vl,backendName:"webgl",kernelFunc:xJ};function vJ(e){let{inputs:t,backend:a}=e,{data:n,indices:r,segmentIds:s}=t;if(n.shape.length<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(r.shape.length!==1)throw new Error(`Indices should be a vector but received shape + ${r.shape}`);if(s.shape.length!==1)throw new Error(`Segment ids should be a vector but received shape + ${s.shape}`);let i=a.readSync(n.dataId),o=a.readSync(r.dataId),l=a.readSync(s.dataId),[u,d]=Z6(i,n.shape,n.dtype,o,l,!0);return a.makeTensorInfo(d,n.dtype,u)}var wJ={kernelName:Dd,backendName:"webgl",kernelFunc:vJ};function kJ(e){let{inputs:t,backend:a}=e,{data:n,indices:r,segmentIds:s}=t;if(n.shape.length<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(r.shape.length!==1)throw new Error(`Indices should be a vector but received shape + ${r.shape}`);if(s.shape.length!==1)throw new Error(`Segment ids should be a vector but received shape + ${s.shape}`);let i=a.readSync(n.dataId),o=a.readSync(r.dataId),l=a.readSync(s.dataId),[u,d]=Z6(i,n.shape,n.dtype,o,l);return a.makeTensorInfo(d,n.dtype,u)}var IJ={kernelName:zd,backendName:"webgl",kernelFunc:kJ};function SJ(e){let{inputs:t,backend:a,attrs:n}=e,{sparseIndices:r,sparseValues:s,defaultValue:i}=t,{outputShape:o}=n,{sliceRank:l,numUpdates:u,sliceSize:d,strides:c,outputSize:p}=T.calculateShapes(s,r,o),h=!1;if(s.dtype==="string"){let y=a.bufferSync(r),A=a.bufferSync(s),x=v.decodeString(a.readSync(i.dataId)[0]),b=sU(y,A,o,p,d,u,l,c,x,h);return a.makeTensorInfo(o,b.dtype,b.values)}let f=new N8(u,l,r.shape.length,s.shape.length,c,[p,1],h),m=a.runWebGLProgram(f,[s,r,i],s.dtype),g=de({inputs:{x:m},backend:a,attrs:{shape:o}});return a.disposeIntermediateTensorInfo(m),g}var TJ={kernelName:Ld,backendName:"webgl",kernelFunc:SJ};function CJ(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{numOrSizeSplits:s,axis:i}=n,o=v.parseAxisParam(i,r.shape)[0],l=T.prepareSplitSize(r,s,o),u=r.shape.length,d=new Array(u).fill(0),c=r.shape.slice();return l.map(p=>{let h=[...c];h[o]=p;let f=su({inputs:{x:r},backend:a,attrs:{begin:d,size:h}});return d[o]+=p,f})}var NJ={kernelName:Wl,backendName:"webgl",kernelFunc:CJ},By="return sqrt(x);",EJ=Qe({opSnippet:By,packedOpSnippet:By,cpuKernelImpl:dU}),RJ={kernelName:ms,backendName:"webgl",kernelFunc:EJ},MJ="return x * x;",$J=Qe({opSnippet:MJ}),_J={kernelName:Bd,backendName:"webgl",kernelFunc:$J},Wy="return (a - b) * (a - b);",FJ=la({opSnippet:Wy,packedOpSnippet:Wy}),PJ={kernelName:gs,backendName:"webgl",kernelFunc:FJ};function OJ({inputs:e,attrs:t,backend:a}){let{x:n}=e,r=Cn+` + return x > 0.0 ? 1.0 : float(${t.alpha}); + `,s=new gr(n.shape,r);return a.runWebGLProgram(s,[n],n.dtype)}var DJ={kernelName:oo,backendName:"webgl",kernelFunc:OJ},zJ=class{constructor(e,t,a){this.variableNames=["x"],this.outputShape=a;let n=a.length,r=mt(a.length),s=mt(a.length),i="";if(n===1)i="coords * strides + begin";else{let o=0;i=a.map((l,u)=>(o++,a.length===1?`coords * strides[${u}] + begin[${u}]`:`coords[${o-1}] * strides[${u}] + begin[${u}]`)).join(",")}this.userCode=` + ${r} begin = ${r}(${e}); + ${r} strides = ${r}(${t}); + + void main() { + ${s} coords = getOutputCoords(); + setOutput(getX(${i})); + } + `}};function LJ(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{begin:s,end:i,strides:o,beginMask:l,endMask:u,ellipsisMask:d,newAxisMask:c,shrinkAxisMask:p}=n,{finalShapeSparse:h,finalShape:f,isIdentity:m,sliceDim0:g,isSimpleSlice:y,begin:A,end:x,strides:b}=At.sliceInfo(r.shape,s,i,o,l,u,d,c,p),w;if(m)w=de({inputs:{x:r},backend:a,attrs:{shape:f}});else if(g||y){v.assert(r.shape.length>=1,()=>`Input must have rank at least 1, got: ${r.shape.length}`);let C=At.computeOutShape(A,x,b),N=su({inputs:{x:r},backend:a,attrs:{begin:A,size:C}});w=de({inputs:{x:N},backend:a,attrs:{shape:f}}),a.disposeIntermediateTensorInfo(N)}else if(a.shouldExecuteOnCPU([r])){let C=a.readSync(r.dataId),N=ve(r.shape,r.dtype,C),_=pU(h,N,b,A);w=a.makeTensorInfo(f,r.dtype,_.values)}else{let C=new zJ(A,b,h);w=a.runWebGLProgram(C,[r],r.dtype)}let S=de({inputs:{x:w},backend:a,attrs:{shape:f}});return a.disposeIntermediateTensorInfo(w),S}var BJ={kernelName:no,backendName:"webgl",kernelFunc:LJ};function WJ(e){let{inputs:t,backend:a,attrs:n}=e,{separator:r,nGramWidths:s,leftPad:i,rightPad:o,padWidth:l,preserveShortSequences:u}=n,{data:d,dataSplits:c}=t,p=a.readSync(d.dataId),h=a.readSync(c.dataId),[f,m]=cU(p,h,r,s,i,o,l,u);return[a.makeTensorInfo([f.length],"string",f),a.makeTensorInfo(c.shape,"int32",m)]}var VJ={kernelName:Gl,backendName:"webgl",kernelFunc:WJ};function GJ(e){let{inputs:t,backend:a,attrs:n}=e,{skipEmpty:r}=n,{input:s,delimiter:i}=t;if(s.dtype!=="string")throw new Error("Input must be of datatype string");if(s.shape.length!==1)throw new Error(`Input must be a vector, got shape: ${s.shape}`);if(i.shape.length!==0)throw new Error(`Delimiter must be a scalar, got shape: ${i.shape}`);let o=a.readSync(s.dataId),l=a.readSync(i.dataId)[0],[u,d,c]=hU(o,l,r),p=d.length;return[a.makeTensorInfo([p,2],"int32",u),a.makeTensorInfo([p],"string",d),a.makeTensorInfo([2],"int32",new Int32Array(c))]}var UJ={kernelName:Wd,backendName:"webgl",kernelFunc:GJ};function jJ(e){let{inputs:t,backend:a,attrs:n}=e,{numBuckets:r}=n,{input:s}=t;if(s.dtype!=="string")throw new Error("Input must be of datatype string");if(r<=0)throw new Error("Number of buckets must be at least 1");let i=a.readSync(s.dataId),o=fU(i,r);return a.makeTensorInfo(s.shape,"int32",o)}var HJ={kernelName:Vd,backendName:"webgl",kernelFunc:jJ},qJ="return tan(x);",XJ=Qe({opSnippet:qJ}),KJ={kernelName:Ul,backendName:"webgl",kernelFunc:XJ},ZJ=` + float e2x = exp(-2.0 * abs(x)); + return sign(x) * (1.0 - e2x) / (1.0 + e2x); +`,YJ=Qe({opSnippet:ZJ}),JJ={kernelName:ro,backendName:"webgl",kernelFunc:YJ},QJ=class{constructor(e,t){this.variableNames=["A"];let a=new Array(e.length);for(let s=0;s5)throw Error(`Tile for rank ${t} is not yet supported`);if(t===1)return`imod(resRC, ${e[0]})`;let a=["resRC.x","resRC.y","resRC.z","resRC.w","resRC.u"],n=[];for(let r=0;r5){let o=a.readSync(r.dataId),l=r.dtype==="string"?o.map(c=>v.decodeString(c)):o,u=ve(r.shape,r.dtype,l),d=gU(u,s);return a.makeTensorInfo(d.shape,d.dtype,d.values)}let i=new QJ(r.shape,s);return a.runWebGLProgram(i,[r],r.dtype)}var tQ={kernelName:As,backendName:"webgl",kernelFunc:E8},aQ=class{constructor(e){this.variableNames=["x","indices"],this.customUniforms=[{name:"n",type:"int"},{name:"firstPass",type:"int"},{name:"negativeInf",type:"float"},{name:"dir",type:"int"},{name:"inc",type:"int"}],this.outputShape=e,this.userCode=` + void main() { + ivec2 coords = getOutputCoords(); + int batch = coords[0]; + int elemIdx = coords[1]; + + // We compare elements pair-wise within a group of size 2 * inc. + // The comparing rule for each group alternates between ascending + // and descending. Within each group, we compare each pair at + // positions i and i+inc. To decide whether an element at position i + // is x0 or x1, we mod it by 2 * inc, if the result is smaller than + // inc, it is in the first half of the group, we denote it as x0, + // otherwise we denote it as x1. + // For example, as shown in the Bitonic top K paper referenced above, + // Figure5(a) shows that element[1] is in the + // second half of the group when group size is 2, but it is in the + // first half of the group when group size is 4. + + bool isFirstInPair = imod(elemIdx, 2 * inc) < inc; + int i = isFirstInPair ? elemIdx : elemIdx - inc; + + int i0 = firstPass == 1 ? i : int(getIndices(batch, i)); + int i1 = firstPass == 1 ? i + inc : int(getIndices(batch, i + inc)); + float x0 = i0 < n ? getX(batch, i0) : negativeInf; + float x1 = i1 < n ? getX(batch, i1) : negativeInf; + + // Denotes which direction indices are in (ascending or descending). + bool reverse = imod(elemIdx, 2 * dir) >= dir; + bool isGreater = x0 > x1 || (x0 == x1 && i1 > i0); + if (reverse == isGreater) { // Elements in opposite order of direction + int iTemp = i0; + i0 = i1; + i1 = iTemp; + } + if (isFirstInPair) { + setOutput(float(i0)); + } else { + setOutput(float(i1)); + } + } + `}},nQ=class{constructor(e){this.variableNames=["x","indices"],this.customUniforms=[{name:"n",type:"int"},{name:"firstPass",type:"int"},{name:"k",type:"int"}],this.outputShape=e,this.userCode=` + void main() { + // Takes max of indices (0, k), (1, k + 1), (2, k + 2) ... + ivec2 coords = getOutputCoords(); + int batch = coords[0]; + int elemIdx = coords[1]; + + // The output size is half of the previous size. + // If the previous sequence is | | | | _ _ _ _ | | | | _ _ _ _ (k=4), + // we only need to output the indices at positions |, the indices at + // positions _ can be thrown away, see Figure5(b) After Phase 2 + // (Merge phase) in the Bitonic Top K paper referenced above. + // For example, the paper shows we only need to output the orange bars. + // The output sequence should look like this | | | | | | | |. + // Because the sequence is halved, to map the output index back + // to the previous sequence to find the corresponding value, + // we need to double the index. When we double the index, + // we basically interpolate a position, so 2i looks like + // | _ | _ | _ | _ | _ | _ | _. We move the | to the first k position + // of each 2k positions by - elemIdx % k. E.g. for output at + // index 4,5,6,7, we want to get the corresponding element at + // original index 8,9,10,11, for output at index 8,9,10,11, + // we want to get the corresponding element at original index + // 16,17,18,19, so on and so forth. + + int i = elemIdx < k ? elemIdx : (elemIdx * 2 - imod(elemIdx, k)); + int i0 = firstPass == 1 ? i : int(getIndices(batch, i)); + int i1 = firstPass == 1 ? i + k : int(getIndices(batch, i + k)); + + float x0 = getX(batch, i0); + float x1 = i1 < n ? getX(batch, i1) : x0; + + setOutput(x0 >= x1 ? float(i0) : float(i1)); + } + `}};function js(e,t){t!==null&&e.disposeIntermediateTensorInfo(t)}function Vy(e){let t=1;for(;tl){let _=a.readSync(r.dataId),[$,M]=yU(_,u,r.dtype,s,i);return[a.makeTensorInfo($.shape,$.dtype,$.values),a.makeTensorInfo(M.shape,M.dtype,M.values)]}if(s===0)return u[u.length-1]=0,[a.makeTensorInfo(u,r.dtype,[]),a.makeTensorInfo(u,"int32",[])];if(d===1)return[r,fp({attrs:{shape:u,dtype:"int32",value:0},backend:a})];let c=a.texData.get(r.dataId),p=c!==null&&c.isPacked,h=p?a.unpackTensor(r):r,f=v.sizeFromShape(u)/d,m=de({inputs:{x:h},attrs:{shape:[f,d]},backend:a});p&&js(a,h);let g=Vy(s),y=Vy(d),A=null,x=()=>A===null?[m,m]:[m,A],b=(_,$,M)=>{let I=x(),E=new aQ(M),O=[[d],[A===null?1:0],[Number.NEGATIVE_INFINITY],[_],[$]],L=A;A=a.runWebGLProgram(E,I,"int32",O),js(a,L)};for(let _=1;_=1;M/=2)b($,M,[f,y])}for(let _=y;_>g;_/=2){let $=x(),M=new nQ([f,_/2]),I=[[d],[A===null?1:0],[g]],E=A;A=a.runWebGLProgram(M,$,"int32",I),js(a,E);let O=g/2,L=O*2;for(let B=O;B>=1;B/=2)b(L,B,A.shape)}let w=A;A=su({inputs:{x:A},backend:a,attrs:{begin:0,size:[f,s]}}),js(a,w);let S=b8({inputs:{x:m,indices:A},backend:a,attrs:{axis:1,batchDims:1}});js(a,m);let C=u.slice(0,-1);C.push(s),w=A,A=de({inputs:{x:A},attrs:{shape:C},backend:a}),js(a,w);let N=S;return S=de({inputs:{x:S},attrs:{shape:C},backend:a}),js(a,N),[S,A]}var sQ={kernelName:so,backendName:"webgl",kernelFunc:rQ},iQ=class{constructor(e,t,a,n,r,s){this.variableNames=["Image","Transforms"],this.outputShape=s;let i=a==="nearest"?1:2,o;switch(n){case"constant":o=1;break;case"reflect":o=2;break;case"wrap":o=3;break;case"nearest":o=4;break;default:o=1;break}this.userCode=` + float mapCoord(float outCoord, float len) { + float inCoord = outCoord; + if(${o} == 2) { + if (inCoord < 0.0) { + if (len <= 1.0) { + inCoord = 0.0; + } else { + float sz2 = 2.0 * len; + if (inCoord < sz2) { + inCoord = sz2 * float(int(float(-inCoord / sz2))) + + inCoord; + } + inCoord = inCoord < -len ? inCoord + sz2 : -inCoord - 1.0; + } + } else if (inCoord > len - 1.0) { + if (len <= 1.0) { + inCoord = 0.0; + } else { + float sz2 = 2.0 * len; + inCoord -= sz2 * float(int(float(inCoord / sz2))); + if (inCoord >= len) { + inCoord = sz2 - inCoord - 1.0; + } + } + } + return clamp(inCoord, 0.0, len - 1.0); + } else if (${o} == 3) { + if (inCoord < 0.0) { + if (len <= 1.0) { + inCoord = 0.0; + } else { + float sz = len - 1.0; + inCoord += len * (float(int(float(-inCoord / sz))) + 1.0); + } + } else if (inCoord > len - 1.0) { + if (len <= 1.0) { + inCoord = 0.0; + } else { + float sz = len - 1.0; + inCoord -= len * float(int(float(inCoord / sz))); + } + } + return clamp(inCoord, 0.0, len - 1.0); + } else if (${o} == 4) { + return clamp(outCoord, 0.0, len - 1.0); + } else { + return outCoord; + } + } + + float readWithFillValue(int batch, int coordY, int coordX, + int channel) { + float outputValue; + if (0 <= coordY && coordY < ${e} && 0 <= coordX && coordX < ${t}) { + outputValue = getImage(batch, coordY, coordX, channel); + } else { + outputValue = float(${r}); + } + return outputValue; + } + + void main() { + ivec4 coords = getOutputCoords(); + float outputValue; + int batch = coords[0]; + int x = coords[2]; + int y = coords[1]; + int channel = coords[3]; + float xf = float(x); + float yf = float(y); + float a1 = getTransforms(batch, 0); + float a2 = getTransforms(batch, 1); + float a3 = getTransforms(batch, 2); + float b1 = getTransforms(batch, 3); + float b2 = getTransforms(batch, 4); + float b3 = getTransforms(batch, 5); + float c1 = getTransforms(batch, 6); + float c2 = getTransforms(batch, 7); + float projection = c1 * xf + c2 * yf + 1.0; + if (projection == 0.0) { + outputValue = float(${r}); + } else { + float inX = (a1 * xf + a2 * yf + a3) / projection; + float inY = (b1 * xf + b2 * yf + b3) / projection; + float mapX = mapCoord(inX, float(${t})); + float mapY = mapCoord(inY, float(${e})); + + if (${i} == 1) { + int coordY = int(round(mapY)); + int coordX = int(round(mapX)); + outputValue = readWithFillValue(batch, coordY, coordX, + channel); + } else { + float yFloor = floor(mapY); + float xFloor = floor(mapX); + float yCeil = yFloor + 1.0; + float xCeil = xFloor + 1.0; + float valueYFloor = (xCeil - mapX) * + readWithFillValue(batch, int(yFloor), int(xFloor), channel) + + (mapX - xFloor) * + readWithFillValue(batch, int(yFloor), int(xCeil), channel); + float valueYCeil = (xCeil - mapX) * + readWithFillValue(batch, int(yCeil), int(xFloor), channel) + + (mapX - xFloor) * + readWithFillValue(batch, int(yCeil), int(xCeil), channel); + outputValue = (yCeil - mapY) * valueYFloor + + (mapY - yFloor) * valueYCeil; + } + } + setOutput(outputValue); + } + `}};function oQ(e){let{inputs:t,backend:a,attrs:n}=e,{image:r,transforms:s}=t,{interpolation:i,fillMode:o,fillValue:l,outputShape:u}=n,[d,c,p,h]=r.shape,[f,m]=u!=null?u:[c,p],g=[d,f,m,h],y=new iQ(c,p,i,o,l,g);return a.runWebGLProgram(y,[r,s],"float32")}var lQ={kernelName:io,backendName:"webgl",kernelFunc:oQ};function uQ(e){let{inputs:t,attrs:a,backend:n}=e,{axis:r}=a,{x:s}=t;Jl(s,"unique"),console.warn("WARNING: ","UI might be locked temporarily as data is being downloaded");let i=n.readSync(s.dataId),{outputValues:o,outputShape:l,indices:u}=AU(i,r,s.shape,s.dtype);return[n.makeTensorInfo(l,s.dtype,o),n.makeTensorInfo([u.length],"int32",u)]}var dQ={kernelName:ch,backendName:"webgl",kernelFunc:uQ};function pQ(e){let{inputs:t,backend:a,attrs:n}=e,{value:r}=t,{axis:s}=n;s<0&&(s+=r.shape.length);let i=r,o=i.shape.length,l=r.shape[s],u=new Array(o-1),d=0;for(let m=0;ma.disposeIntermediateTensorInfo(m)),f}var cQ={kernelName:jl,backendName:"webgl",kernelFunc:pQ},hQ=class{constructor(e,t){this.variableNames=["x","segmentIds"];let a=e.windowSize,n=e.batchSize,r=e.inSize,s=e.numSegments,i=s*Math.ceil(r/a);this.outputShape=[n,i];let o="0.0",l="sumValue",u=Math.floor(a/4)*4,d=a%4,c=` + sumValue += dot(values, segFilter); + `,p="";r%a>0&&(p=` + if (inIdx < 0 || inIdx >= ${r}) { + return initializationValue; + } + `);let h="";r%a>0&&(h=` + if (inIdx < 0 || inIdx >= ${r}) { + return -1.0; + } + `),this.userCode=` + const float initializationValue = ${o}; + + float getValue(int batch, int inIdx) { + ${p} + return getX(batch, inIdx); + } + + float getSegmentIdAtIndex(int inIdx) { + ${h} + return getSegmentIds(inIdx); + } + + void main() { + ivec2 coords = getOutputCoords(); + int batch = coords[0]; + int outIdx = coords[1]; + int inOffset = int(floor(float(outIdx) / float( + ${s})) * float(${a})); + int currentSeg = int(mod(float(outIdx), float(${s}))); + + float sumValue = 0.0; + + for (int i = 0; i < ${u}; i += 4) { + int inIdx = inOffset + i; + vec4 values = vec4( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + getValue(batch, inIdx + 2), + getValue(batch, inIdx + 3) + ); + + vec4 segFilter = vec4( + int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0, + int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0, + int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0, + int(getSegmentIdAtIndex(inIdx + 3)) == currentSeg ? 1 : 0 + ); + + ${c} + } + + int inIdx = inOffset + ${u}; + if (${d===1}) { + vec4 values = vec4( + getValue(batch, inIdx), + initializationValue, + initializationValue, + initializationValue + ); + + int inIdxSeg = int(getSegmentIdAtIndex(inIdx)); + + vec4 segFilter = vec4( + int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0, + 0, + 0, + 0 + ); + + ${c} + } else if (${d===2}) { + vec4 values = vec4( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + initializationValue, + initializationValue + ); + + vec4 segFilter = vec4( + int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0, + int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0, + 0, + 0 + ); + + ${c} + } else if (${d===3}) { + vec4 values = vec4( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + getValue(batch, inIdx + 2), + initializationValue + ); + + vec4 segFilter = vec4( + int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0, + int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0, + int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0, + 0 + ); + + ${c} + } + setOutput(${l}); + } + `}};function fQ(e){let{inputs:t,backend:a,attrs:n}=e,{x:r,segmentIds:s}=t,{numSegments:i}=n,o=r.shape.length,l=[],u=0,d=T.getAxesPermutation([u],o),c=r;d!=null&&(c=Ia({inputs:{x:r},backend:a,attrs:{perm:d}}),l.push(c),u=T.getInnerMostAxes(1,o)[0]);let p=T.segment_util.computeOutShape(c.shape,u,i),h=v.sizeFromShape([c.shape[u]]),f=de({inputs:{x:c},backend:a,attrs:{shape:[-1,h]}});l.push(f);let m=jd(r.dtype),g=(b,w,S,C,N)=>{let _=b.shape[0],$=b.shape[1],M=T.segment_util.segOpComputeOptimalWindowSize($,N),I={windowSize:M,inSize:$,batchSize:_,numSegments:N},E=new hQ(I,w),O=a.compileAndRun(E,[b,S],C);if(l.push(O),O.shape[1]===N)return O;let L=C8({backend:a,attrs:{start:0,stop:N,step:1,dtype:"float32"}}),B=E8({inputs:{x:L},backend:a,attrs:{reps:[$/M]}});return l.push(L),l.push(B),g(O,w,B,C,N)},y=g(f,"unsortedSegmentSum",s,m,i),A=de({inputs:{x:y},backend:a,attrs:{shape:p}}),x=A;if(d!=null){l.push(A);let b=T.getUndoAxesPermutation(d);x=Ia({inputs:{x},backend:a,attrs:{perm:b}})}return l.forEach(b=>a.disposeIntermediateTensorInfo(b)),x}var mQ={kernelName:hh,backendName:"webgl",kernelFunc:fQ},gQ=[pj,hj,gj,xj,vj,Ij,Tj,Nj,$j,Fj,Dj,Bj,Gj,qj,Zj,Jj,eH,rH,iH,lH,cH,xH,vH,kH,EH,MH,PH,XU,zH,GH,qH,QH,tq,nq,sq,oq,dq,hq,gq,Aq,bq,wq,Sq,Cq,Mq,_q,Oq,Lq,Wq,jq,Kq,Qq,aX,sX,iX,lX,dX,cX,fX,gX,bX,kX,TX,NX,MX,FX,zX,VX,qU,UX,WH,qX,ZX,QX,ZU,nK,oK,uK,hK,gK,bK,kK,CK,MK,FK,OK,BK,VK,UK,XK,ZK,JK,eZ,aZ,iZ,dZ,fZ,wZ,QU,TZ,EZ,$Z,PZ,SH,zZ,BZ,VZ,jZ,KZ,JU,YZ,QZ,tY,nY,rY,TH,AZ,oY,pY,mY,tj,xY,wY,TY,EY,_Y,PY,zY,WY,GY,HY,KY,JY,aJ,sJ,lJ,pJ,yH,bZ,fJ,gJ,AJ,bJ,wJ,IJ,TJ,NJ,RJ,_J,PJ,DJ,BJ,VJ,UJ,HJ,xZ,lj,KJ,JJ,tQ,sQ,lQ,uj,dQ,cQ,mQ,LZ];for(let e of gQ)hn(e);var St;(function(e){e[e.float32=0]="float32",e[e.int32=1]="int32",e[e.bool=2]="bool",e[e.string=3]="string",e[e.complex64=4]="complex64"})(St||(St={}));var cd;(function(e){e[e.linear=0]="linear",e[e.relu=1]="relu",e[e.relu6=2]="relu6",e[e.prelu=3]="prelu",e[e.leakyrelu=4]="leakyrelu",e[e.sigmoid=5]="sigmoid",e[e.elu=6]="elu"})(cd||(cd={}));var R8;function yQ(e){R8=e.wasm.cwrap(Ur,null,["number","array","number","number","array","number","number","number","number","number","number","number","number"])}function AQ(e){let{inputs:t,backend:a,attrs:n}=e,{a:r,b:s,bias:i,preluActivationWeights:o}=t;if(r.dtype!=="float32"||s.dtype!=="float32")throw new Error("_FusedMatMul for non non-float32 tensors not yet supported.");let{transposeA:l,transposeB:u,activation:d,leakyreluAlpha:c}=n,p=a.dataIdMap.get(r.dataId).id,h=a.dataIdMap.get(s.dataId).id,f=0;if(i!=null){let N=a.dataIdMap.get(i.dataId);if(N.shape.length!==1)throw new Error(`_FusedMatMul only supports rank-1 bias but got rank ${N.shape.length}.`);f=N.id}let m=o==null?0:a.dataIdMap.get(o.dataId).id,g=cd[d];if(g==null)throw new Error(`${d} activation not yet supported for FusedConv2D in the wasm backend.`);let y=l?r.shape[2]:r.shape[1],A=u?s.shape[1]:s.shape[2],x=po.assertAndGetBroadcastShape(r.shape.slice(0,-2),s.shape.slice(0,-2)),b=a.makeOutput([...x,y,A],r.dtype),w=a.dataIdMap.get(b.dataId).id,S=new Uint8Array(new Int32Array(r.shape).buffer),C=new Uint8Array(new Int32Array(s.shape).buffer);return R8(p,S,r.shape.length,h,C,s.shape.length,l,u,g,f,m,c||0,w),b}var xQ={kernelName:Ur,backendName:"wasm",setupFunc:yQ,kernelFunc:AQ};function Zt(e,t){let a;function n(s){a=s.wasm.cwrap(e,null,["number","number","number"])}function r(s){let{backend:i,inputs:{x:o}}=s,l=i.dataIdMap.get(o.dataId).id,u=i.makeOutput(o.shape,t||o.dtype),d=i.dataIdMap.get(u.dataId).id;return v.sizeFromShape(u.shape)===0||a(l,St[o.dtype],d),u}return{kernelName:e,backendName:"wasm",setupFunc:n,kernelFunc:r}}var bQ=Zt(gl);function ua(e,t,a){let n;function r(i){n=i.wasm.cwrap(e,null,["number","array","number","number","array","number","number","number"])}function s(i){let{backend:o,inputs:l}=i,{a:u,b:d}=l,c=o.dataIdMap.get(u.dataId).id,p=o.dataIdMap.get(d.dataId).id,h=a!=null?a:u.dtype,f=T.assertAndGetBroadcastShape(u.shape,d.shape),m=o.makeOutput(f,h);if(v.sizeFromShape(f)===0)return m;let g=new Uint8Array(new Int32Array(u.shape).buffer),y=new Uint8Array(new Int32Array(d.shape).buffer),A=o.dataIdMap.get(m.dataId).id;return n(c,g,u.shape.length,p,y,d.shape.length,St[u.dtype],A),m}return{kernelName:e,backendName:"wasm",setupFunc:r,kernelFunc:s}}var vQ=!0,wQ=ua(vr,vQ),M8;function kQ(e){M8=e.wasm.cwrap(hi,null,["array","number","number","number"])}function IQ(e){let{inputs:t,backend:a}=e,n=a.makeOutput(t[0].shape,t[0].dtype);if(v.sizeFromShape(n.shape)===0)return n;let r=t.map(o=>a.dataIdMap.get(o.dataId).id),s=new Uint8Array(new Int32Array(r).buffer),i=a.dataIdMap.get(n.dataId).id;return M8(s,r.length,St[n.dtype],i),n}var SQ={kernelName:hi,backendName:"wasm",setupFunc:kQ,kernelFunc:IQ};function Vh(e){let{inputs:{x:t},backend:a}=e;if(t.dtype==="string")return ze(a.readSync(t.dataId),t.shape,t.dtype);let n=a.makeOutput(t.shape,t.dtype),r=a.typedArrayFromHeap(t);return a.typedArrayFromHeap(n).set(r),n}var TQ={kernelName:Fi,backendName:"wasm",kernelFunc:Vh},$8;function CQ(e){$8=e.wasm.cwrap(yr,null,["number","array","number","number","number","array","number"])}function Yr(e){let{inputs:t,backend:a,attrs:n}=e,[r,s]=EQ(t.x.shape,n.perm),i=!0;for(let f=0;f=r&&(s===-1||n[s]>n[i])&&(s=i);n[s]=r}return[a,n]}var RQ={kernelName:yr,backendName:"wasm",kernelFunc:Yr,setupFunc:CQ};function Is(e,t,a){let n=e.shape,r=e.shape.length,s=v.parseAxisParam(t,n),i=s,o=T.getAxesPermutation(i,r),l=null,u=!1;if(o!=null){let d=new Array(r);for(let p=0;p`new shape: ${i}, old shape: ${n.shape}. New shape and old shape must have the same number of elements.`),e.backend.incRef(n.dataId),{dataId:n.dataId,shape:i,dtype:n.dtype}}var GQ={kernelName:Fl,backendName:"wasm",kernelFunc:za},D8;function UQ(e){D8=e.wasm.cwrap(gi,null,["number","array","number","number","array","number","number","number","number"])}function jQ(e){let{inputs:t,backend:a,attrs:n}=e,{a:r,b:s}=t,{transposeA:i,transposeB:o}=n;if(r.dtype!=="float32"||s.dtype!=="float32")throw new Error("BatchMatMul for non non-float32 tensors not yet supported.");let l=r.shape.length,u=s.shape.length,d=i?r.shape[l-2]:r.shape[l-1],c=o?s.shape[u-1]:s.shape[u-2],p=i?r.shape[l-1]:r.shape[l-2],h=o?s.shape[u-2]:s.shape[u-1],f=r.shape.slice(0,-2),m=s.shape.slice(0,-2),g=v.sizeFromShape(f),y=v.sizeFromShape(m),A=po.assertAndGetBroadcastShape(r.shape.slice(0,-2),s.shape.slice(0,-2)).concat([p,h]);v.assert(d===c,()=>`Error in matMul: inner shapes (${d}) and (${c}) of Tensors with shapes ${r.shape} and ${s.shape} and transposeA=${i} and transposeB=${o} must match.`);let x=i?[g,d,p]:[g,p,d],b=o?[y,h,c]:[y,c,h],w=za({inputs:{x:r},backend:a,attrs:{shape:x}}),S=za({inputs:{x:s},backend:a,attrs:{shape:b}}),C=a.dataIdMap.get(w.dataId).id,N=a.dataIdMap.get(S.dataId).id,_=i?w.shape[2]:w.shape[1],$=o?S.shape[1]:S.shape[2],M=Math.max(g,y),I=a.makeOutput([M,_,$],w.dtype),E=a.dataIdMap.get(I.dataId).id,O=new Uint8Array(new Int32Array(w.shape).buffer),L=new Uint8Array(new Int32Array(S.shape).buffer);return D8(C,O,w.shape.length,N,L,S.shape.length,i,o,E),a.disposeData(w.dataId),a.disposeData(S.dataId),I.shape=A,I}var HQ={kernelName:gi,backendName:"wasm",setupFunc:UQ,kernelFunc:jQ};function pi(e){let{inputs:{x:t},attrs:{begin:a,size:n},backend:r}=e,[s,i]=At.parseSliceParams(t,a,n),o=At.isSliceContinous(t.shape,s,i),l=r.readSync(t.dataId),u=r.makeOutput(i,t.dtype),d=v.computeStrides(t.shape),c=r.dataIdMap.get(u.dataId);if(o){let f=At.computeFlatOffset(s,d);return t.dtype==="string"?c.stringBytes=l.slice(f,f+v.sizeFromShape(i)):r.typedArrayFromHeap(u).set(l.subarray(f,f+v.sizeFromShape(i))),u}if(t.dtype==="string"){let f=Mc(l,s,i,t.shape,t.dtype);return c.stringBytes=f,u}let p=r.typedArrayFromHeap(u),h=t.shape.length;if(h===2)qQ(l,d[0],p,s,i);else if(h===3)XQ(l,d[0],d[1],p,s,i);else if(h===4)KQ(l,d[0],d[1],d[2],p,s,i);else{let f=Mc(l,s,i,t.shape,t.dtype);p.set(f)}return u}function qQ(e,t,a,n,r){let s=0,i=n[0],o=n[1],l=i+r[0];for(let u=i;uy*A),l=T.getReshaped(r.shape,s,o),u=T.getPermuted(l.length,s.length),d=T.getReshapedPermuted(r.shape,s,o),c=T.getSliceBeginCoords(i,s.length),p=T.getSliceSize(d,i,s.length),h=za({inputs:{x:r},backend:a,attrs:{shape:l}}),f=Yr({inputs:{x:h},backend:a,attrs:{perm:u}}),m=za({inputs:{x:f},backend:a,attrs:{shape:d}}),g=pi({inputs:{x:m},backend:a,attrs:{begin:c,size:p}});return a.disposeData(h.dataId),a.disposeData(f.dataId),a.disposeData(h.dataId),g}var JQ={kernelName:bl,backendName:"wasm",kernelFunc:YQ};function iu(e){let{inputs:{x:t},attrs:{dtype:a},backend:n}=e,r=n.makeOutput(t.shape,a),s=n.typedArrayFromHeap(t);return n.typedArrayFromHeap(r).set(s),r}var QQ={kernelName:yi,backendName:"wasm",kernelFunc:iu},eee=Zt(Qr),z8;function tee(e){z8=e.wasm.cwrap(es,null,["number","number","number","number"])}function aee(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{clipValueMin:s,clipValueMax:i}=n,o=a.dataIdMap.get(r.dataId).id,l=a.makeOutput(r.shape,r.dtype),u=a.dataIdMap.get(l.dataId).id;return z8(o,s,i,u),l}var nee={kernelName:es,backendName:"wasm",setupFunc:tee,kernelFunc:aee};function L8(e){let{inputs:t,backend:a}=e,n=v.parseAxisParam(e.attrs.axis,t[0].shape)[0],r=t.map(h=>h.shape);T.assertParamsConsistent(r,n);let s=T.computeOutShape(t.map(h=>h.shape),n),i=t.filter(h=>v.sizeFromShape(h.shape)>0);if(i.length===1)return Vh({inputs:{x:i[0]},backend:a});let o=a.makeOutput(s,t[0].dtype);if(v.sizeFromShape(s)===0)return o;if(i[0].dtype==="string"){let h=i.map(x=>{let b=[-1,v.sizeFromShape(x.shape.slice(n))];return za({inputs:{x},backend:a,attrs:{shape:b}})}),f=h.map(x=>({vals:a.readSync(x.dataId),shape:x.shape}));s=T.computeOutShape(h.map(x=>x.shape),1);let m=h[0].shape[0]===1,g=d3(f,s,t[0].dtype,m),y=T.computeOutShape(i.map(x=>x.shape),n);o.shape=y;let A=a.dataIdMap.get(o.dataId);return A.stringBytes=T.fromStringArrayToUint8(g),h.forEach(x=>a.disposeData(x.dataId)),o}let l=v.sizeFromShape(i[0].shape.slice(0,n)),u=0,d=i.map(h=>{let f=v.sizeFromShape(h.shape.slice(n));return u+=f,f}),c=i.map(h=>a.typedArrayFromHeap(h)),p=a.typedArrayFromHeap(o);for(let h=0;h`cumprod does not support ${r.dtype} tensors in the WASM backend`);let u=T.getAxesPermutation([s],l),d=r;u!==null&&(d=Yr({inputs:{x:r},attrs:{perm:u},backend:a}));let c=T.getInnerMostAxes(1,l)[0];T.assertAxesAreInnerMostDims("cumprod",[c],l);let p=a.makeOutput(d.shape,d.dtype),h=d.shape[c],f=a.dataIdMap.get(d.dataId).id,m=a.dataIdMap.get(p.dataId).id;G8(f,i?1:0,o?1:0,h,m,St[r.dtype]);let g=p;if(u!==null){let y=T.getUndoAxesPermutation(u);g=Yr({inputs:{x:p},attrs:{perm:y},backend:a}),a.disposeData(d.dataId),a.disposeData(p.dataId)}return g}var Aee={kernelName:wi,backendName:"wasm",setupFunc:gee,kernelFunc:yee},U8;function xee(e){U8=e.wasm.cwrap(ki,null,["number","number","number","number","number","number"])}function bee(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{axis:s,exclusive:i,reverse:o}=n,l=r.shape.length;v.assert(r.dtype==="float32"||r.dtype==="int32",()=>`cumsum does not support ${r.dtype} tensors in the WASM backend`);let u=T.getAxesPermutation([s],l),d=r;u!==null&&(d=Yr({inputs:{x:r},attrs:{perm:u},backend:a}));let c=T.getInnerMostAxes(1,l)[0];T.assertAxesAreInnerMostDims("cumsum",[c],l);let p=a.makeOutput(d.shape,d.dtype),h=d.shape[c],f=a.dataIdMap.get(d.dataId).id,m=a.dataIdMap.get(p.dataId).id;U8(f,i?1:0,o?1:0,h,m,St[r.dtype]);let g=p;if(u!==null){let y=T.getUndoAxesPermutation(u);g=Yr({inputs:{x:p},attrs:{perm:y},backend:a}),a.disposeData(d.dataId),a.disposeData(p.dataId)}return g}var vee={kernelName:ki,backendName:"wasm",setupFunc:xee,kernelFunc:bee},j8;function wee(e){j8=e.wasm.cwrap(Si,null,["number","number","number","array","number","array","array","number","number"])}function kee(e){let{backend:t,inputs:a,attrs:n}=e,{x:r}=a,{blockSize:s,dataFormat:i}=n,o=r.shape[0],l=i==="NHWC"?r.shape[1]:r.shape[2],u=i==="NHWC"?r.shape[2]:r.shape[3],d=i==="NHWC"?r.shape[3]:r.shape[1],c=l*s,p=u*s,h=d/(s*s),f=i==="NHWC"?[o,c,p,h]:[o,h,c,p],m=t.makeOutput(f,"float32"),g=t.dataIdMap.get(r.dataId).id,y=new Uint8Array(new Int32Array(v.computeStrides(r.shape)).buffer),A=new Uint8Array(new Int32Array(f).buffer),x=new Uint8Array(new Int32Array(v.computeStrides(f)).buffer),b=t.dataIdMap.get(m.dataId).id;return j8(g,s,i==="NHWC"?1:0,y,r.shape.length-1,A,x,f.length,b),m}var Iee={kernelName:Si,backendName:"wasm",setupFunc:wee,kernelFunc:kee},H8;function See(e){H8=e.wasm.cwrap(Ti,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function Tee(e){let{inputs:t,attrs:a,backend:n}=e,{x:r,filter:s}=t,i=n.dataIdMap.get(r.dataId).id,o=n.dataIdMap.get(s.dataId).id,{strides:l,dilations:u,pad:d,dimRoundingMode:c}=a,p=u==null?[1,1]:u,h=T.computeConv2DInfo(r.shape,s.shape,l,p,d,c,!0),f=h.filterHeight,m=h.filterWidth,g=h.padInfo.top,y=h.padInfo.right,A=h.padInfo.bottom,x=h.padInfo.left,b=h.dilationHeight,w=h.dilationWidth,S=h.strideHeight,C=h.strideWidth,N=h.inChannels,_=h.outChannels,$=h.padInfo.type==="SAME"?1:0;if(h.dataFormat!=="channelsLast")throw new Error(`wasm backend DepthwiseConv2dNative does not support dataFormat:'${h.dataFormat}'. Please use 'channelsLast'.`);let M=n.makeOutput(h.outShape,"float32"),I=n.dataIdMap.get(M.dataId).id;return H8(i,r.shape[0],r.shape[1],r.shape[2],o,f,m,g,y,A,x,$,b,w,S,C,N,_,I),M}var Cee={kernelName:Ti,backendName:"wasm",setupFunc:See,kernelFunc:Tee},Nee=Zt(Ni),Eee=!1,Ree=ua(ts,Eee,"bool"),Mee=Zt(as,"float32");function E1(e){let{inputs:t,attrs:a,backend:n}=e,{input:r}=t,{dim:s}=a,i=r.shape.length,o=r.shape.slice(),l=s;return s<0&&(v.assert(-(i+1)<=s,()=>`Axis must be in the interval [${-(i+1)}, ${i}]`),l=i+s+1),o.splice(l,0,1),za({inputs:{x:r},backend:n,attrs:{shape:o}})}var $ee={kernelName:wl,backendName:"wasm",kernelFunc:E1};function q8(e){let{attrs:{shape:t,value:a,dtype:n},backend:r}=e,s=r.makeOutput(t,n);return r.typedArrayFromHeap(s).fill(a),s}var _ee={kernelName:kl,backendName:"wasm",kernelFunc:q8},X8;function Fee(e){X8=e.wasm.cwrap(Ri,null,["number","number","number","number","number","number"])}function Pee(e){let{inputs:t,backend:a}=e,{image:n}=t,r=a.makeOutput(n.shape,n.dtype),s=a.dataIdMap.get(n.dataId).id,i=a.dataIdMap.get(r.dataId).id,[o,l,u,d]=n.shape;return X8(s,o,l,u,d,i),r}var Oee={kernelName:Ri,backendName:"wasm",kernelFunc:Pee,setupFunc:Fee},Dee=Zt(ns),zee=!1,Lee=ua(Mi,zee),K8;function Bee(e){K8=e.wasm.cwrap($i,null,["number","number","number","number","number","number","number"])}function Wee(e){let{backend:t,inputs:a,attrs:n}=e,{varianceEpsilon:r}=n,{x:s,mean:i,variance:o,offset:l,scale:u}=a,d=t.dataIdMap.get(s.dataId).id,c=t.dataIdMap.get(i.dataId).id,p=t.dataIdMap.get(o.dataId).id,h=l!=null?t.dataIdMap.get(l.dataId).id:0,f=u!=null?t.dataIdMap.get(u.dataId).id:0,m=t.makeOutput(s.shape,s.dtype);if(v.sizeFromShape(s.shape)===0)return m;let g=t.dataIdMap.get(m.dataId).id;return K8(d,c,p,h,f,r,g),m}var Vee={kernelName:$i,backendName:"wasm",setupFunc:Bee,kernelFunc:Wee},Z8;function Gee(e){Z8=e.wasm.cwrap(jr,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function Uee(e){let{inputs:t,attrs:a,backend:n}=e,{x:r,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:u,dilations:d,dataFormat:c,dimRoundingMode:p,activation:h,leakyreluAlpha:f}=a,m=T.computeConv2DInfo(r.shape,s.shape,l,d,u,p),g=cd[h];if(g==null)throw new Error(`${h} activation not yet supported for FusedConv2D in the wasm backend.`);let y=n.dataIdMap.get(r.dataId).id,A=n.dataIdMap.get(s.dataId).id,x=m.outChannels,b=0;if(i!=null){let Z=n.dataIdMap.get(i.dataId);if(Z.shape.length!==1)throw new Error(`FusedConv2D only supports rank-1 bias but got rank ${Z.shape.length}.`);if(Z.shape[0]!==x)throw new Error(`FusedConv2D bias shape (${Z.shape}) does not match the number of output channels (${x})`);b=Z.id}let w=m.filterHeight,S=m.filterWidth,C=m.padInfo.top,N=m.padInfo.right,_=m.padInfo.bottom,$=m.padInfo.left,M=m.dilationHeight,I=m.dilationWidth,E=m.strideHeight,O=m.strideWidth,L=m.inChannels,B=m.padInfo.type==="SAME"?1:0,G=m.batchSize,j=m.inHeight,U=m.inWidth;if(c!=="NHWC")throw new Error(`wasm backend FusedConv2D does not support dataFormat:'${c}'. Please use 'NHWC'.`);let H=n.makeOutput(m.outShape,"float32"),W=n.dataIdMap.get(H.dataId).id,Q=o==null?0:n.dataIdMap.get(o.dataId).id;return Z8(y,G,j,U,A,w,S,b,C,N,_,$,B,M,I,E,O,L,x,g,Q,f||0,W),H}var jee={kernelName:jr,backendName:"wasm",setupFunc:Gee,kernelFunc:Uee},Y8;function Hee(e){Y8=e.wasm.cwrap(Hr,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function qee(e){let{inputs:t,attrs:a,backend:n}=e,{x:r,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:u,dilations:d,dataFormat:c,dimRoundingMode:p,activation:h,leakyreluAlpha:f}=a,m=T.computeConv2DInfo(r.shape,s.shape,l,d,u,p,!0),g=cd[h];if(g==null)throw new Error(`${h} activation not yet supported for FusedDepthwiseConv2D in the wasm backend.`);let y=n.dataIdMap.get(r.dataId).id,A=n.dataIdMap.get(s.dataId).id,x=m.outChannels,b=0;if(i!=null){let Z=n.dataIdMap.get(i.dataId);if(Z.shape.length!==1)throw new Error(`FusedDepthwiseConv2D only supports rank-1 bias but got rank ${Z.shape.length}.`);if(Z.shape[0]!==x)throw new Error(`FusedDepthwiseConv2D bias shape (${Z.shape}) does not match the number of output channels (${x})`);b=Z.id}let w=m.filterHeight,S=m.filterWidth,C=m.padInfo.top,N=m.padInfo.right,_=m.padInfo.bottom,$=m.padInfo.left,M=m.dilationHeight,I=m.dilationWidth,E=m.strideHeight,O=m.strideWidth,L=m.inChannels,B=m.padInfo.type==="SAME"?1:0,G=m.batchSize,j=m.inHeight,U=m.inWidth;if(c!=="NHWC")throw new Error(`wasm backend FusedDepthwiseConv2D does not support dataFormat:'${c}'. Please use 'NHWC'.`);let H=n.makeOutput(m.outShape,"float32"),W=n.dataIdMap.get(H.dataId).id,Q=o==null?0:n.dataIdMap.get(o.dataId).id;return Y8(y,G,j,U,A,w,S,b,C,N,_,$,B,M,I,E,O,L,x,g,Q,f||0,W),H}var Xee={kernelName:Hr,backendName:"wasm",setupFunc:Hee,kernelFunc:qee},J8;function Kee(e){J8=e.wasm.cwrap(_i,null,["number","number","number","number","number","number","array","number"])}function Zee(e){let{backend:t,inputs:a}=e,{params:n,indices:r}=a,[s,i,o,l]=f2.prepareAndValidate(n,r),u=t.makeOutput(s,n.dtype);if(i===0)return u;let d=r.shape,c=d[d.length-1],p=t.dataIdMap.get(n.dataId).id,h=t.dataIdMap.get(r.dataId).id,f=new Uint8Array(new Int32Array(l).buffer),m=t.dataIdMap.get(u.dataId).id;return J8(p,St[n.dtype],h,i,c,o,f,m),u}var Yee={kernelName:_i,backendName:"wasm",setupFunc:Kee,kernelFunc:Zee},Q8;function Jee(e){Q8=e.wasm.cwrap("Gather",null,["number","number","array","number","number","number","array","number"])}function Qee(e){let{backend:t,inputs:a,attrs:n}=e,{x:r,indices:s}=a,{axis:i,batchDims:o}=n,l=v.parseAxisParam(i,r.shape)[0],u=t.readSync(s.dataId),d=r.shape[l];for(let C=0;C=0,()=>`GatherV2: the index value ${N} is not in [0, ${d-1}]`)}let c=T.segment_util.collectGatherOpShapeInfo(r,s,l,o),p=za({inputs:{x:r},attrs:{shape:[c.batchSize,c.outerSize,c.dimSize,c.sliceSize]},backend:t}),h=v.sizeFromShape(s.shape),f=za({inputs:{x:s},attrs:{shape:[c.batchSize,h/c.batchSize]},backend:t}),m=[c.batchSize,c.outerSize,h/c.batchSize,c.sliceSize],g=t.makeOutput(m,r.dtype);if(v.sizeFromShape(r.shape)===0)return g;let y=p.shape.length-1,A=t.dataIdMap.get(p.dataId).id,x=t.dataIdMap.get(f.dataId).id,b=t.dataIdMap.get(g.dataId).id,w=new Uint8Array(new Int32Array(v.computeStrides(p.shape)).buffer),S=new Uint8Array(new Int32Array(v.computeStrides(m)).buffer);return Q8(A,St[r.dtype],w,y,x,c.batchSize,S,b),t.disposeData(p.dataId),t.disposeData(f.dataId),g.shape=c.outputShape,g}var ete={kernelName:Il,backendName:"wasm",setupFunc:Jee,kernelFunc:Qee},tte=!1,ate=ua(rs,tte,"bool"),nte=!1,rte=ua(ss,nte,"bool"),ev;function ste(e){ev=e.wasm.cwrap(Pi,null,["number","number","number","number"])}function ite(e){let{inputs:{x:t},attrs:{alpha:a},backend:n}=e,r=n.dataIdMap.get(t.dataId).id,s=n.makeOutput(t.shape,"float32");if(v.sizeFromShape(t.shape)!==0){let i=n.dataIdMap.get(s.dataId).id;ev(r,St[t.dtype],a,i)}return s}var ote={kernelName:Pi,backendName:"wasm",setupFunc:ste,kernelFunc:ite},lte=!1,ute=ua(is,lte,"bool"),dte=!1,pte=ua(os,dte,"bool"),cte=Zt(ls),hte=!1,fte=ua(Oi,hte,"bool"),mte=Zt(Di),gte=!1,yte=ua(Tl,gte,"bool"),Ate=!1,xte=ua(TA,Ate,"bool"),tv;function bte(e){tv=e.wasm.cwrap(zi,null,["number","number","number","number"])}function vte(e){let{backend:t,inputs:a,attrs:n}=e,{reductionIndices:r,keepDims:s}=n,{x:i}=a,o=t.dataIdMap.get(i.dataId).id,l=i,{transposed:u,axes:d,originalAxes:c,inputWasTransposed:p}=Is(i,r,t);if(p){let A=t.dataIdMap.get(u.dataId).id;l=u,o=A}let h=l.shape.length;T.assertAxesAreInnerMostDims("max",d,h);let[f,m]=T.computeOutAndReduceShapes(l.shape,d),g=v.sizeFromShape(m),y=t.makeOutput(f,i.dtype);if(v.sizeFromShape(l.shape)!==0){let A=t.dataIdMap.get(y.dataId).id;tv(o,St[i.dtype],g,A)}if(p&&t.disposeData(u.dataId),s){let A=T.expandShapeToKeepDim(y.shape,c);y.shape=A}return y}var wte={kernelName:zi,backendName:"wasm",setupFunc:bte,kernelFunc:vte},kte=!1,Ite=ua(us,kte),av;function Ste(e){av=e.wasm.cwrap(Li,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function Tte(e){let{inputs:t,attrs:a,backend:n}=e,r=t.x,s=n.dataIdMap.get(r.dataId).id;v.assert(r.dtype==="float32",()=>`Error in MaxPool: only float32 input is supported. Got ${r.dtype}.`);let{filterSize:i,strides:o,pad:l,dimRoundingMode:u}=a,d=T.computePool2DInfo(r.shape,i,o,1,l,u),c=d.filterHeight,p=d.filterWidth,h=d.padInfo.top,f=d.padInfo.right,m=d.padInfo.bottom,g=d.padInfo.left,y=d.dilationHeight,A=d.dilationWidth,x=d.strideHeight,b=d.strideWidth,w=d.inChannels,S=d.outChannels;if(d.dataFormat!=="channelsLast")throw new Error(`wasm backend does not support dataFormat:'${d.dataFormat}'. Please use 'channelsLast'.`);let C=n.makeOutput(d.outShape,"float32"),N=n.dataIdMap.get(C.dataId).id;return av(s,r.shape[0],r.shape[1],r.shape[2],c,p,h,f,m,g,y,A,x,b,w,S,N),C}var Cte={kernelName:Li,backendName:"wasm",setupFunc:Ste,kernelFunc:Tte},nv;function Nte(e){nv=e.wasm.cwrap(Bi,null,["number, number, number"])}function Ete(e){let{backend:t,inputs:a,attrs:n}=e,{axis:r,keepDims:s}=n,{x:i}=a,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:d,axes:c,originalAxes:p,inputWasTransposed:h}=Is(i,r,t),f=c;if(h){let b=t.dataIdMap.get(d.dataId).id;b!==o&&(u=d,l=b,f=T.getInnerMostAxes(f.length,u.shape.length))}T.assertAxesAreInnerMostDims("mean",f,u.shape.length);let[m,g]=T.computeOutAndReduceShapes(u.shape,f),y=v.sizeFromShape(g),A=u;u.dtype!=="float32"&&(A=iu({backend:t,inputs:{x:u},attrs:{dtype:"float32"}}),l=t.dataIdMap.get(A.dataId).id);let x=t.makeOutput(m,"float32");if(v.sizeFromShape(u.shape)!==0){let b=t.dataIdMap.get(x.dataId).id;nv(l,y,b)}if(h&&t.disposeData(d.dataId),s){let b=T.expandShapeToKeepDim(x.shape,p);x.shape=b}return u.dtype!=="float32"&&t.disposeData(A.dataId),x}var Rte={kernelName:Bi,backendName:"wasm",setupFunc:Nte,kernelFunc:Ete},rv;function Mte(e){rv=e.wasm.cwrap(Wi,null,["number","number","number","number"])}function $te(e){let{backend:t,inputs:a,attrs:n}=e,{axis:r,keepDims:s}=n,{x:i}=a,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:d,axes:c,originalAxes:p,inputWasTransposed:h}=Is(i,r,t);if(h){let x=t.dataIdMap.get(d.dataId).id;x!==o&&(u=d,l=x)}let f=u.shape.length;T.assertAxesAreInnerMostDims("min",c,f);let[m,g]=T.computeOutAndReduceShapes(u.shape,c),y=v.sizeFromShape(g),A=t.makeOutput(m,u.dtype);if(v.sizeFromShape(u.shape)!==0){let x=t.dataIdMap.get(A.dataId).id;rv(l,St[i.dtype],y,x)}if(h&&t.disposeData(d.dataId),s){let x=T.expandShapeToKeepDim(A.shape,p);A.shape=x}return A}var _te={kernelName:Wi,backendName:"wasm",setupFunc:Mte,kernelFunc:$te},Fte=!1,Pte=ua(ds,Fte),R1;(function(e){e[e.reflect=0]="reflect",e[e.symmetric=1]="symmetric"})(R1||(R1={}));var sv;function Ote(e){sv=e.wasm.cwrap(Vi,null,["number","array","number","number","array","array","number","number"])}function Dte(e){let{inputs:{x:t},backend:a,attrs:{paddings:n,mode:r}}=e,s=n.map((f,m)=>f[0]+t.shape[m]+f[1]),i=a.dataIdMap.get(t.dataId).id,o=a.makeOutput(s,t.dtype),l=a.dataIdMap.get(o.dataId).id,u=new Uint8Array(new Int32Array(t.shape).buffer),d=n.map(f=>f[0]),c=n.map(f=>f[1]),p=new Uint8Array(new Int32Array(d).buffer),h=new Uint8Array(new Int32Array(c).buffer);return sv(i,u,t.shape.length,St[t.dtype],p,h,R1[r],l),o}var zte={kernelName:Vi,backendName:"wasm",kernelFunc:Dte,setupFunc:Ote},Lte=!0,Bte=ua(ps,Lte),Wte=Zt(Cl);function O3(e,t){let a=new Int32Array(e.wasm.HEAPU8.buffer,t,4),n=a[0],r=a[1],s=a[2],i=a[3];return e.wasm._free(t),{pSelectedIndices:n,selectedSize:r,pSelectedScores:s,pValidOutputs:i}}var iv;function Vte(e){iv=e.wasm.cwrap(Gi,"number",["number","number","number","number","number"])}function Gte(e){let{backend:t,inputs:a,attrs:n}=e,{iouThreshold:r,maxOutputSize:s,scoreThreshold:i}=n,{boxes:o,scores:l}=a,u=t.dataIdMap.get(o.dataId).id,d=t.dataIdMap.get(l.dataId).id,c=iv(u,d,s,r,i),{pSelectedIndices:p,selectedSize:h,pSelectedScores:f,pValidOutputs:m}=O3(t,c);return t.wasm._free(f),t.wasm._free(m),t.makeOutput([h],"int32",p)}var Ute={kernelName:Gi,backendName:"wasm",setupFunc:Vte,kernelFunc:Gte},ov;function jte(e){ov=e.wasm.cwrap(Nl,"number",["number","number","number","number","number","bool"])}function Hte(e){let{backend:t,inputs:a,attrs:n}=e,{iouThreshold:r,maxOutputSize:s,scoreThreshold:i,padToMaxOutputSize:o}=n,{boxes:l,scores:u}=a,d=t.dataIdMap.get(l.dataId).id,c=t.dataIdMap.get(u.dataId).id,p=ov(d,c,s,r,i,o),{pSelectedIndices:h,selectedSize:f,pSelectedScores:m,pValidOutputs:g}=O3(t,p);t.wasm._free(m);let y=t.makeOutput([f],"int32",h),A=t.makeOutput([],"int32",g);return[y,A]}var qte={kernelName:Nl,backendName:"wasm",setupFunc:jte,kernelFunc:Hte},lv;function Xte(e){lv=e.wasm.cwrap(Ui,"number",["number","number","number","number","number","number"])}function Kte(e){let{backend:t,inputs:a,attrs:n}=e,{iouThreshold:r,maxOutputSize:s,scoreThreshold:i,softNmsSigma:o}=n,{boxes:l,scores:u}=a,d=t.dataIdMap.get(l.dataId).id,c=t.dataIdMap.get(u.dataId).id,p=lv(d,c,s,r,i,o),{pSelectedIndices:h,selectedSize:f,pSelectedScores:m,pValidOutputs:g}=O3(t,p);t.wasm._free(g);let y=t.makeOutput([f],"int32",h),A=t.makeOutput([f],"float32",m);return[y,A]}var Zte={kernelName:Ui,backendName:"wasm",setupFunc:Xte,kernelFunc:Kte},Yte=!1,Jte=ua(cs,Yte,"bool"),uv;function Qte(e){uv=e.wasm.cwrap(Rl,null,["number","number","number","number","number"])}function eae(e){let{inputs:t,backend:a,attrs:n}=e,{indices:r}=t,{dtype:s,depth:i,onValue:o,offValue:l}=n,u=a.makeOutput([...r.shape,i],s),d=a.dataIdMap.get(u.dataId).id,c=a.dataIdMap.get(r.dataId).id;return uv(c,i,o,l,d),u}var tae={kernelName:Rl,backendName:"wasm",setupFunc:Qte,kernelFunc:eae};function aae(e){let{inputs:{x:t},backend:a}=e,n=a.makeOutput(t.shape,t.dtype);return a.typedArrayFromHeap(n).fill(1),n}var nae={kernelName:El,backendName:"wasm",kernelFunc:aae};function rae(e){let{inputs:t,backend:a,attrs:n}=e,{axis:r}=n;if(t.length===1)return E1({inputs:{input:t[0]},backend:a,attrs:{dim:r}});let s=t[0].shape,i=t[0].dtype;t.forEach(d=>{v.assertShapesMatch(s,d.shape,"All tensors passed to stack must have matching shapes"),v.assert(i===d.dtype,()=>"All tensors passed to stack must have matching dtypes")});let o=[],l=t.map(d=>{let c=E1({inputs:{input:d},backend:a,attrs:{dim:r}});return o.push(c),c}),u=L8({inputs:l,backend:a,attrs:{axis:r}});return o.forEach(d=>a.disposeData(d.dataId)),u}var sae={kernelName:Ml,backendName:"wasm",kernelFunc:rae},dv;function iae(e){dv=e.wasm.cwrap(ji,null,["number","array","number","number","array","array","number","number"])}function oae(e){let{inputs:{x:t},backend:a,attrs:{paddings:n,constantValue:r}}=e,s=n.map((f,m)=>f[0]+t.shape[m]+f[1]);if(v.sizeFromShape(t.shape)===0)return q8({backend:a,attrs:{shape:s,value:r,dtype:t.dtype}});let i=a.dataIdMap.get(t.dataId).id,o=a.makeOutput(s,t.dtype),l=a.dataIdMap.get(o.dataId).id,u=new Uint8Array(new Int32Array(t.shape).buffer),d=n.map(f=>f[0]),c=n.map(f=>f[1]),p=new Uint8Array(new Int32Array(d).buffer),h=new Uint8Array(new Int32Array(c).buffer);return dv(i,u,t.shape.length,St[t.dtype],p,h,r,l),o}var pv={kernelName:ji,backendName:"wasm",kernelFunc:oae,setupFunc:iae},lae=!1,uae=ua(Hi,lae),cv;function dae(e){cv=e.wasm.cwrap(qi,null,["number","number","number"])}function pae(e){let{inputs:t,backend:a}=e,{x:n,alpha:r}=t,s=a.dataIdMap.get(n.dataId).id,i=a.dataIdMap.get(r.dataId).id,o=s,l=n,u=l;l.dtype!=="float32"&&(u=iu({backend:a,inputs:{x:n},attrs:{dtype:"float32"}}),o=a.dataIdMap.get(u.dataId).id);let d=a.makeOutput(n.shape,"float32"),c=a.dataIdMap.get(d.dataId).id;return cv(o,i,c),l.dtype!=="float32"&&a.disposeData(u.dataId),d}var cae={kernelName:qi,backendName:"wasm",setupFunc:dae,kernelFunc:pae},hv;function hae(e){hv=e.wasm.cwrap(Xi,null,["number","number","number","number"])}function fae(e){let{backend:t,inputs:a,attrs:n}=e,{axis:r,keepDims:s}=n,{x:i}=a,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:d,axes:c,originalAxes:p,inputWasTransposed:h}=Is(i,r,t),f=c;if(h){let x=t.dataIdMap.get(d.dataId).id;x!==o&&(u=d,l=x,f=T.getInnerMostAxes(f.length,u.shape.length))}T.assertAxesAreInnerMostDims("prod",f,u.shape.length);let[m,g]=T.computeOutAndReduceShapes(u.shape,f),y=v.sizeFromShape(g),A=t.makeOutput(m,u.dtype);if(v.sizeFromShape(u.shape)!==0){let x=t.dataIdMap.get(A.dataId).id;hv(l,y,St[A.dtype],x)}if(h&&t.disposeData(d.dataId),s){let x=T.expandShapeToKeepDim(A.shape,p);A.shape=x}return A}var mae={kernelName:Xi,backendName:"wasm",setupFunc:hae,kernelFunc:fae},gae=e=>{let{backend:t,attrs:a}=e,{start:n,stop:r,step:s,dtype:i}=a,o=h3(n,r,s,i),l=t.makeOutput([o.length],i);return t.typedArrayFromHeap(l).set(o),l},yae={kernelName:$l,backendName:"wasm",kernelFunc:gae},Aae=!0,xae=ua(Ci,Aae),bae=Zt(Ki),vae=Zt(Ji),fv;function wae(e){fv=e.wasm.cwrap(Yi,null,["number","number","number","number","number","number","number","number","number","number"])}function kae(e){let{backend:t,inputs:a,attrs:n}=e,{images:r}=a,{alignCorners:s,halfPixelCenters:i,size:o}=n,[l,u]=o,[d,c,p,h]=r.shape,f=[d,l,u,h],m=t.dataIdMap.get(r.dataId),g;m.dtype!=="float32"&&(g=iu({backend:t,inputs:{x:r},attrs:{dtype:"float32"}}),m=t.dataIdMap.get(g.dataId));let y=m.id,A=t.makeOutput(f,"float32");if(v.sizeFromShape(r.shape)===0)return A;let x=t.dataIdMap.get(A.dataId).id;return fv(y,d,c,p,h,l,u,s?1:0,i?1:0,x),g!=null&&t.disposeData(g.dataId),A}var Iae={kernelName:Yi,backendName:"wasm",setupFunc:wae,kernelFunc:kae},mv;function Sae(e){mv=e.wasm.cwrap(Zi,null,["number","number","number","number","number","number","number","number","number","number"])}function Tae(e){let{backend:t,inputs:a,attrs:n}=e,{images:r}=a,{alignCorners:s,halfPixelCenters:i,size:o}=n,[l,u]=o,[d,c,p,h]=r.shape,f=[d,l,u,h],m=t.makeOutput(f,"float32");if(v.sizeFromShape(r.shape)===0)return m;let g=t.dataIdMap.get(r.dataId),y;g.dtype!=="float32"&&(y=iu({backend:t,inputs:{x:r},attrs:{dtype:"float32"}}),g=t.dataIdMap.get(y.dataId));let A=g.id,x=t.dataIdMap.get(m.dataId).id;return mv(A,d,c,p,h,l,u,s?1:0,i?1:0,x),y!=null&&t.disposeData(y.dataId),m}var Cae={kernelName:Zi,backendName:"wasm",setupFunc:Sae,kernelFunc:Tae},gv;function Nae(e){gv=e.wasm.cwrap(Pl,null,["number","array","number","array","number","number"])}function Eae(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{dims:s}=n,i=v.parseAxisParam(s,r.shape);if(r.shape.length===0)return Vh({inputs:{x:r},backend:a});let o=a.makeOutput(r.shape,r.dtype),l=a.dataIdMap.get(r.dataId).id,u=a.dataIdMap.get(o.dataId).id,d=new Uint8Array(new Int32Array(i).buffer),c=new Uint8Array(new Int32Array(r.shape).buffer);gv(l,d,i.length,c,r.shape.length,u);let p=za({inputs:{x:o},attrs:{shape:r.shape},backend:a});return a.disposeData(o.dataId),p}var Rae={kernelName:Pl,backendName:"wasm",kernelFunc:Eae,setupFunc:Nae},yv;function Mae(e){yv=e.wasm.cwrap(lo,null,["number","number","number","number","number","number","number","number","array","number","number"])}function $ae(e){let{inputs:t,backend:a,attrs:n}=e,{image:r}=t,{radians:s,fillValue:i,center:o}=n,l=a.makeOutput(r.shape,r.dtype),u=a.dataIdMap.get(r.dataId).id,d=a.dataIdMap.get(l.dataId).id,[c,p,h,f]=r.shape,[m,g]=T.getImageCenter(o,p,h),y=i===0,A=255,x=typeof i=="number"?[i,i,i,y?0:A]:[...i,A],b=new Uint8Array(new Int32Array(x).buffer);return yv(u,c,p,h,f,s,m,g,b,x.length,d),l}var _ae={kernelName:lo,backendName:"wasm",kernelFunc:$ae,setupFunc:Mae},Fae=Zt(Ol),Pae=Zt(hs),Av;function Oae(e){Av=e.wasm.cwrap(Qi,null,["number","number","number","number","number","number","array","number","number"])}function Dae(e){let{backend:t,inputs:a,attrs:n}=e,{indices:r,updates:s}=a,{shape:i}=n,o=t.makeOutput(i,s.dtype);if(v.sizeFromShape(i)===0)return o;let{sliceRank:l,numUpdates:u,sliceSize:d,strides:c,outputSize:p}=m2.calculateShapes(s,r,i),h=t.dataIdMap.get(r.dataId).id,f=t.dataIdMap.get(s.dataId).id,m=new Uint8Array(new Int32Array(c).buffer),g=t.dataIdMap.get(o.dataId).id;return Av(h,f,St[s.dtype],l,u,d,m,p,g),o}var zae={kernelName:Qi,backendName:"wasm",setupFunc:Oae,kernelFunc:Dae},xv;function Lae(e){xv=e.wasm.cwrap("SelectV2",null,["number","number","number","number","number"])}function Bae(e){let{inputs:t,backend:a}=e,{condition:n,t:r,e:s}=t,i=a.dataIdMap.get(n.dataId).id,o=a.dataIdMap.get(r.dataId).id,l=a.dataIdMap.get(s.dataId).id,u=a.makeOutput(r.shape,r.dtype),d=a.dataIdMap.get(u.dataId).id,c=n.shape.length,p=r.shape.length,h=c===0||c>1||p===1?1:v.sizeFromShape(r.shape.slice(1));return xv(i,o,l,h,d),u}var Wae={kernelName:Dl,backendName:"wasm",kernelFunc:Bae,setupFunc:Lae},bv;function Vae(e){bv=e.wasm.cwrap(fs,null,["number","number"])}function Gae(e){let{backend:t,inputs:{x:a}}=e,n=t.dataIdMap.get(a.dataId).id,r=t.makeOutput(a.shape,a.dtype),s=t.dataIdMap.get(r.dataId).id;return v.sizeFromShape(r.shape)===0||bv(n,s),r}var Uae={kernelName:"Sigmoid",backendName:"wasm",setupFunc:Vae,kernelFunc:Gae},jae=Zt(eo),vv;function Hae(e){vv=e.wasm.cwrap(ao,null,["number","number","number","number"])}function qae(e){let{backend:t,inputs:{logits:a},attrs:{dim:n}}=e,r=t.dataIdMap.get(a.dataId).id,s=t.makeOutput(a.shape,a.dtype),i=t.dataIdMap.get(s.dataId).id,o=a.shape[n],l=v.sizeFromShape(a.shape)/o;return v.sizeFromShape(s.shape)===0||vv(r,i,o,l),s}var Xae={kernelName:ao,backendName:"wasm",setupFunc:Hae,kernelFunc:qae};function Kae(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{blockShape:s,paddings:i}=n,o=v.sizeFromShape(s),l=[[0,0]];l.push(...i);for(let g=1+s.length;g0?l+1:0;if(u<0)throw new Error(T.getSparseSegmentReductionNegativeSegmentIdsErrorMessage());let d=r.shape.slice();d[0]=u;let c=a.dataIdMap.get(r.dataId).id,p=a.dataIdMap.get(s.dataId).id,h=a.dataIdMap.get(i.dataId).id,f=a.makeOutput(d,r.dtype),m=a.dataIdMap.get(f.dataId).id,g=a.makeOutput([4],"int32"),y=a.dataIdMap.get(g.dataId).id;Iv(c,St[r.dtype],r.shape[0],p,h,m,y,t,0);let A=a.readSync(g.dataId),x;switch(A[0]){case 0:{x=T.getSparseSegmentReductionNegativeSegmentIdsErrorMessage();break}case 1:{x=T.getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage();break}case 2:x=T.getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage(A[1],A[2]);break;case 3:x=T.getSparseSegmentReductionIndicesOutOfRangeErrorMessage(A[1],A[2],A[3]);break;default:x=""}if(a.disposeData(g.dataId),x)throw a.disposeData(f.dataId),new Error(x);return f}function nne(e){return Tv(e,!0)}var rne={kernelName:Dd,backendName:"wasm",setupFunc:Sv,kernelFunc:nne};function sne(e){return Tv(e,!1)}var ine={kernelName:zd,backendName:"wasm",setupFunc:Sv,kernelFunc:sne};function one(e){let{inputs:t,attrs:a,backend:n}=e,{x:r}=t,{numOrSizeSplits:s,axis:i}=a,o=v.parseAxisParam(i,r.shape)[0],l=T.prepareSplitSize(r,s,o),u=new Array(r.shape.length).fill(0),d=r.shape.slice();return l.map(c=>{let p=[...d];p[o]=c;let h=pi({inputs:{x:r},attrs:{begin:u,size:p},backend:n});return u[o]+=c,h})}var lne={kernelName:Wl,backendName:"wasm",kernelFunc:one},une=Zt(ms),dne=Zt(Bd),pne=!0,cne=ua(gs,pne),Cv;function hne(e){Cv=e.wasm.cwrap(oo,null,["number","number","number","number"])}function fne(e){let{backend:t,inputs:a,attrs:n}=e,{alpha:r}=n,{x:s}=a,i=t.dataIdMap.get(s.dataId).id,o=t.makeOutput(s.shape,s.dtype),l=t.dataIdMap.get(o.dataId).id;return Cv(i,r,St[s.dtype],l),o}var mne={kernelName:oo,backendName:"wasm",setupFunc:hne,kernelFunc:fne},Nv;function gne(e){Nv=e.wasm.cwrap(no,null,["number","array","number","array","array","array","array","array","number","number"])}function yne(e){let{backend:t,inputs:a,attrs:n}=e,{x:r}=a,{begin:s,end:i,strides:o,beginMask:l,endMask:u,ellipsisMask:d,newAxisMask:c,shrinkAxisMask:p}=n,{finalShapeSparse:h,finalShape:f,isIdentity:m,sliceDim0:g,isSimpleSlice:y,begin:A,end:x,strides:b}=At.sliceInfo(r.shape,s,i,o,l,u,d,c,p),w;if(m)w=za({inputs:{x:r},backend:t,attrs:{shape:f}});else if(g||y){v.assert(r.shape.length>=1,()=>`Input must have rank at least 1, got: ${r.shape.length}`);let S=At.computeOutShape(A,x,b),C=pi({inputs:{x:r},backend:t,attrs:{begin:A,size:S}});w=za({inputs:{x:C},backend:t,attrs:{shape:f}}),t.disposeData(C.dataId)}else{let S=t.makeOutput(h,"float32"),C=t.dataIdMap.get(r.dataId).id,N=new Uint8Array(new Int32Array(v.computeStrides(r.shape)).buffer),_=new Uint8Array(new Int32Array(A).buffer),$=new Uint8Array(new Int32Array(x).buffer),M=new Uint8Array(new Int32Array(b).buffer),I=new Uint8Array(new Int32Array(h).buffer),E=new Uint8Array(new Int32Array(v.computeStrides(h)).buffer),O=t.dataIdMap.get(S.dataId).id;Nv(C,N,r.shape.length,_,$,M,I,E,h.length,O),w=za({inputs:{x:S},backend:t,attrs:{shape:f}}),t.disposeData(S.dataId)}return w}var Ane={kernelName:no,backendName:"wasm",setupFunc:gne,kernelFunc:yne};function xne(e){let{backend:t,inputs:a,attrs:n}=e,{data:r,dataSplits:s}=a,{separator:i,nGramWidths:o,leftPad:l,rightPad:u,padWidth:d,preserveShortSequences:c}=n,p=t.readSync(r.dataId),h=t.readSync(s.dataId),[f,m]=m3(p,h,i,o,l,u,d,c),g=t.makeOutput([f.length],"string"),y=t.dataIdMap.get(g.dataId);y.stringBytes=f;let A=t.makeOutput(s.shape,"int32");return t.typedArrayFromHeap(A).set(m),[g,A]}var bne={kernelName:Gl,backendName:"wasm",kernelFunc:xne};function vne(e){let{backend:t,inputs:a,attrs:n}=e,{input:r,delimiter:s}=a,{skipEmpty:i}=n,o=t.readSync(r.dataId),l=t.readSync(s.dataId),[u,d,c]=g3(o,l[0],i),p=d.length,h=t.makeOutput([p,2],"int32");t.typedArrayFromHeap(h).set(u);let f=t.makeOutput([p],"string"),m=t.dataIdMap.get(f.dataId);m.stringBytes=d;let g=t.makeOutput([2],"int32");return t.typedArrayFromHeap(g).set(c),[h,f,g]}var wne={kernelName:Wd,backendName:"wasm",kernelFunc:vne};function kne(e){let{backend:t,inputs:a,attrs:n}=e,{input:r}=a,{numBuckets:s}=n,i=t.readSync(r.dataId),o=y3(i,s),l=t.makeOutput(r.shape,"int32");return t.typedArrayFromHeap(l).set(o),l}var Ine={kernelName:Vd,backendName:"wasm",kernelFunc:kne},Sne=!0,Tne=ua(ys,Sne),Ev;function Cne(e){Ev=e.wasm.cwrap(to,null,["number","number","number","number"])}function Nne(e){let{backend:t,inputs:a,attrs:n}=e,{axis:r,keepDims:s}=n,{x:i}=a,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:d,axes:c,originalAxes:p,inputWasTransposed:h}=Is(i,r,t),f=c;if(h){let x=t.dataIdMap.get(d.dataId).id;x!==o&&(u=d,l=x,f=T.getInnerMostAxes(f.length,u.shape.length))}T.assertAxesAreInnerMostDims("sum",f,u.shape.length);let[m,g]=T.computeOutAndReduceShapes(u.shape,f),y=v.sizeFromShape(g),A=t.makeOutput(m,u.dtype);if(v.sizeFromShape(u.shape)!==0){let x=t.dataIdMap.get(A.dataId).id;Ev(l,y,St[A.dtype],x)}if(h&&t.disposeData(d.dataId),s){let x=T.expandShapeToKeepDim(A.shape,p);A.shape=x}return A}var Ene={kernelName:to,backendName:"wasm",setupFunc:Cne,kernelFunc:Nne},Rne=Zt(Ul),Mne=Zt(ro),Rv;function $ne(e){Rv=e.wasm.cwrap(As,null,["number","array","number","array","number","number"])}function _ne(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,s=a.dataIdMap.get(r.dataId).id,{reps:i}=n,o=new Array(r.shape.length);for(let p=0;p{let{x:n}=e,{k:r,sorted:s}=a,i=t.dataIdMap.get(n.dataId).id,o=new Uint8Array(new Int32Array(n.shape).buffer),l=n.shape.slice();l[l.length-1]=r;let u=t.makeOutput(l,n.dtype),d=t.dataIdMap.get(u.dataId).id,c=t.makeOutput(l,"int32"),p=t.dataIdMap.get(c.dataId).id;return Mv(i,o,n.shape.length,St[n.dtype],r,s,d,p),[u,c]},Dne={kernelName:so,backendName:"wasm",setupFunc:Pne,kernelFunc:One},$v;function zne(e){$v=e.wasm.cwrap(io,null,["number","number","bool","number","number","number","number","number","number","array","number","array","number","number","number","number","number"])}function Lne(e){let{backend:t,inputs:a,attrs:n}=e,{image:r,transforms:s}=a,{interpolation:i,fillMode:o,fillValue:l,outputShape:u}=n,[d,c,p,h]=r.shape,[f,m]=u!=null?u:[c,p],g=[d,f,m,h],y=new Uint8Array(new Int32Array(v.computeStrides(r.shape)).buffer),A=new Uint8Array(new Int32Array(v.computeStrides(g)).buffer),x=t.makeOutput(g,r.dtype),b=t.dataIdMap.get(x.dataId).id,w=t.dataIdMap.get(r.dataId).id,S=t.dataIdMap.get(s.dataId).id,C=i==="nearest"?1:2,N;switch(o){case"constant":N=1;break;case"reflect":N=2;break;case"wrap":N=3;break;case"nearest":N=4;break;default:N=1;break}return $v(w,S,s.shape[0]>1,d,f,m,h,p,c,y,r.shape.length-1,A,g.length-1,C,N,l,b),x}var Bne={kernelName:io,backendName:"wasm",setupFunc:zne,kernelFunc:Lne};function Wne(e){let{inputs:t,backend:a,attrs:n}=e,{value:r}=t,{axis:s}=n;s<0&&(s+=r.shape.length);let i=r.shape[s],o=r.shape.length,l=new Array(o-1),u=0;for(let h=0;h({dataId:h,dtype:f,shape:l}))}var Vne={kernelName:jl,backendName:"wasm",kernelFunc:Wne};function Gne(e){let{inputs:{x:t},backend:a}=e,n=a.makeOutput(t.shape,t.dtype);return a.typedArrayFromHeap(n).fill(0),n}var Une={kernelName:Hl,backendName:"wasm",kernelFunc:Gne},jne=[xQ,bQ,wQ,SQ,_Q,OQ,LQ,VQ,HQ,JQ,QQ,eee,nee,ree,oee,dee,pee,cee,mee,Aee,vee,Iee,Cee,Nee,Ree,Mee,$ee,_ee,Oee,Dee,Lee,Vee,jee,Xee,Yee,ete,ate,rte,TQ,ote,ute,pte,cte,fte,mte,yte,xte,wte,Ite,Cte,Rte,_te,Pte,zte,Bte,Wte,Ute,qte,Zte,Jte,tae,nae,sae,pv,uae,cae,mae,yae,xae,bae,vae,GQ,Iae,Cae,Rae,_ae,Fae,Pae,zae,Wae,Uae,jae,ZQ,Xae,Zae,Qae,ane,rne,ine,lne,une,dne,cne,mne,Ane,bne,wne,Ine,Tne,Ene,Rne,Mne,Fne,Dne,Bne,RQ,Vne,Une];for(let e of jne)hn(e);var M1=V();M1.registerFlag("WASM_HAS_SIMD_SUPPORT",async()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,9,1,7,0,65,0,253,15,26,11]))}catch(e){return!1}});M1.registerFlag("WASM_HAS_MULTITHREAD_SUPPORT",async()=>{if(M1.get("IS_NODE"))return!1;try{return new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch(e){return!1}});var Gy=hl(MS()),Hne=hl($S()),Uy=hl(_S()),jy=Gy.default||Gy,qne=Uy.default||Uy,_v=class extends fl{constructor(e){super(),this.wasm=e,this.dataIdNextNumber=1,this.wasm.tfjs.initWithThreadsCount(Fv),$1=this.wasm.tfjs.getThreadsCount(),this.dataIdMap=new md(this,kt())}write(e,t,a){let n={id:this.dataIdNextNumber++};return this.move(n,e,t,a,1),n}numDataIds(){return this.dataIdMap.numDataIds()}async time(e){let t=v.now();return e(),{kernelMs:v.now()-t}}move(e,t,a,n,r){let s=this.dataIdNextNumber++;if(n==="string"){let u=t;this.dataIdMap.set(e,{id:s,stringBytes:u,shape:a,dtype:n,memoryOffset:null,refCount:r});return}let i=v.sizeFromShape(a),o=i*v.bytesPerElement(n),l=this.wasm._malloc(o);this.dataIdMap.set(e,{id:s,memoryOffset:l,shape:a,dtype:n,refCount:r}),this.wasm.tfjs.registerTensor(s,i,l),t!=null&&this.wasm.HEAPU8.set(new Uint8Array(t.buffer,t.byteOffset,o),l)}async read(e){return this.readSync(e)}readSync(e,t,a){let{memoryOffset:n,dtype:r,shape:s,stringBytes:i}=this.dataIdMap.get(e);if(r==="string")return(t==null||t===0)&&(a==null||a>=i.length)?i:i.slice(t,a);t=t||0,a=a||v.sizeFromShape(s);let o=v.bytesPerElement(r),l=this.wasm.HEAPU8.slice(n+t*o,n+a*o);return Zne(l.buffer,r)}disposeData(e,t=!1){if(this.dataIdMap.has(e)){let a=this.dataIdMap.get(e);if(a.refCount--,!t&&a.refCount>0)return!1;this.wasm._free(a.memoryOffset),this.wasm.tfjs.disposeData(a.id),this.dataIdMap.delete(e)}return!0}refCount(e){return this.dataIdMap.has(e)?this.dataIdMap.get(e).refCount:0}incRef(e){let t=this.dataIdMap.get(e);t!=null&&t.refCount++}floatPrecision(){return 32}getMemoryOffset(e){return this.dataIdMap.get(e).memoryOffset}dispose(){this.wasm.tfjs.dispose(),"PThread"in this.wasm&&this.wasm.PThread.terminateAllThreads(),this.wasm=null}memory(){return{unreliable:!1}}makeOutput(e,t,a){let n;if(a==null)n=this.write(null,e,t);else{let r=this.dataIdNextNumber++;n={id:r},this.dataIdMap.set(n,{id:r,memoryOffset:a,shape:e,dtype:t,refCount:1});let s=v.sizeFromShape(e);this.wasm.tfjs.registerTensor(r,s,a)}return{dataId:n,shape:e,dtype:t}}typedArrayFromHeap({shape:e,dtype:t,dataId:a}){let n=this.wasm.HEAPU8.buffer,{memoryOffset:r}=this.dataIdMap.get(a),s=v.sizeFromShape(e);switch(t){case"float32":return new Float32Array(n,r,s);case"int32":return new Int32Array(n,r,s);case"bool":return new Uint8Array(n,r,s);default:throw new Error(`Unknown dtype ${t}`)}}};function Xne(e){return(t,a)=>(v.fetch(e,{credentials:"same-origin"}).then(n=>{n.ok||t.env.a(`failed to load wasm binary file at '${e}'`),n.arrayBuffer().then(r=>{WebAssembly.instantiate(r,t).then(s=>{a(s.instance,s.module)})})}),{})}function Hy(e,t,a){if(zc!=null)return zc;let n="tfjs-backend-wasm.wasm";return e&&t?n="tfjs-backend-wasm-threaded-simd.wasm":e&&(n="tfjs-backend-wasm-simd.wasm"),qu!=null&&qu[n]!=null?qu[n]:a+n}async function Kne(){let[e,t]=await Promise.all([V().getAsync("WASM_HAS_SIMD_SUPPORT"),V().getAsync("WASM_HAS_MULTITHREAD_SUPPORT")]);return new Promise((a,n)=>{let r={};r.locateFile=(o,l)=>{if(o.endsWith(".worker.js")){let u=Hne.wasmWorkerContents.replace(/\n/g,"\\n"),d=new Blob([u],{type:"application/javascript"});return URL.createObjectURL(d)}return o.endsWith(".wasm")?Hy(e,t,Gu!=null?Gu:l):l+o},D3&&(r.instantiateWasm=Xne(Hy(e,t,Gu!=null?Gu:"")));let s=!1;r.onAbort=()=>{s||Xu||(Xu=!0,n({message:"Make sure the server can serve the `.wasm` file relative to the bundled js file. For more details see https://github.com/tensorflow/tfjs/blob/master/tfjs-backend-wasm/README.md#using-bundlers"}))};let i;t&&e&&zc==null?(r.mainScriptUrlOrBlob=new Blob(["var WasmBackendModuleThreadedSimd = "+jy.toString()],{type:"text/javascript"}),i=jy(r)):i=qne(r),i.then(o=>{s=!0,Xu=!1;let l=null;o.tfjs={init:o.cwrap("init",null,[]),initWithThreadsCount:o.cwrap("init_with_threads_count",null,["number"]),getThreadsCount:o.cwrap("get_threads_count","number",[]),registerTensor:o.cwrap("register_tensor",null,["number","number","number"]),disposeData:o.cwrap("dispose_data",l,["number"]),dispose:o.cwrap("dispose",l,[])},a({wasm:o})}).catch(n)})}function Zne(e,t){switch(t){case"float32":return new Float32Array(e);case"int32":return new Int32Array(e);case"bool":return new Uint8Array(e);default:throw new Error(`Unknown dtype ${t}`)}}var Yne=["tfjs-backend-wasm.wasm","tfjs-backend-wasm-simd.wasm","tfjs-backend-wasm-threaded-simd.wasm"],zc=null,Gu=null,qu={},Xu=!1,D3=!1;function Jne(e,t=!1){if(d2("setWasmPath has been deprecated in favor of setWasmPaths and will be removed in a future release."),Xu)throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPath()` before you call `tf.setBackend()` or `tf.ready()`");zc=e,D3=t}function Gh(e,t=!1){if(Xu)throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPaths()` before you call `tf.setBackend()` or `tf.ready()`");if(typeof e=="string")Gu=e;else{qu=e;let a=Yne.filter(n=>qu[n]==null);if(a.length>0)throw new Error(`There were no entries found for the following binaries: ${a.join(",")}. Please either call setWasmPaths with a map providing a path for each binary, or with a string indicating the directory where all the binaries can be found.`)}D3=t}var Fv=-1,$1=-1;function Qne(e){Fv=e}function ere(){if($1===-1)throw new Error("WASM backend not initialized.");return $1}var tre="4.0.0",are=2;uo("wasm",async()=>{let{wasm:e}=await Kne();return new _v(e)},are);var Tr=V();Tr.registerFlag("WEBGPU_DEFERRED_SUBMIT_BATCH_SIZE",()=>15);Tr.registerFlag("WEBGPU_CPU_FORWARD",()=>!0);Tr.registerFlag("WEBGPU_MATMUL_PROGRAM_TYPE",()=>-1);Tr.registerFlag("WEBGPU_USE_NAIVE_CONV2D_TRANSPOSE",()=>!1);Tr.registerFlag("WEBGPU_USE_LOW_POWER_GPU",()=>!1);Tr.registerFlag("WEBGPU_CPU_HANDOFF_SIZE_THRESHOLD",()=>1e3);Tr.registerFlag("WEBGPU_USE_PROFILE_TOOL",()=>!1);Tr.registerFlag("WEBGPU_IMPORT_EXTERNAL_TEXTURE",()=>!0);Tr.registerFlag("WEBGPU_USE_NAIVE_CONV2D_DEBUG",()=>!1);var nre=class{constructor(e){e&&(this.vendor=e.vendor)}isIntel(){return this.vendor==="intel"}},rre=class{constructor(e){this.device=e,this.numUsedBuffers=0,this.numFreeBuffers=0,this.freeBuffers=new Map,this.usedBuffers=new Map,this.numBytesUsed=0,this.numBytesAllocated=0}acquireUploadBuffer(e,t){return this.acquireBuffer(e,t,!0)}acquireBuffer(e,t,a=!1){let n=qy(e,t);if(this.freeBuffers.has(n)||this.freeBuffers.set(n,[]),this.usedBuffers.has(n)||this.usedBuffers.set(n,[]),this.numBytesUsed+=e,this.numUsedBuffers++,this.freeBuffers.get(n).length>0){this.numFreeBuffers--;let s=this.freeBuffers.get(n).shift();return this.usedBuffers.get(n).push(s),s}this.numBytesAllocated+=e;let r=this.device.createBuffer({size:e,usage:t,mappedAtCreation:a});return this.usedBuffers.get(n).push(r),r}releaseBuffer(e,t,a){if(this.freeBuffers.size===0)return;let n=qy(t,a);this.freeBuffers.has(n)||this.freeBuffers.set(n,[]),this.freeBuffers.get(n).push(e),this.numFreeBuffers++,this.numUsedBuffers--;let r=this.usedBuffers.get(n),s=r.indexOf(e);if(s<0)throw new Error("Cannot release a buffer that was never provided by this buffer manager");r.splice(s,1),this.numBytesUsed-=t}releaseUploadBuffer(e,t,a){e.mapAsync(GPUMapMode.WRITE).then(()=>{this.releaseBuffer(e,t,a)},n=>{})}getNumUsedBuffers(){return this.numUsedBuffers}getNumFreeBuffers(){return this.numFreeBuffers}dispose(){this.freeBuffers.forEach((e,t)=>{e.forEach(a=>{a.destroy()})}),this.usedBuffers.forEach((e,t)=>{e.forEach(a=>{a.destroy()})}),this.freeBuffers=new Map,this.usedBuffers=new Map,this.numUsedBuffers=0,this.numFreeBuffers=0,this.numBytesUsed=0,this.numBytesAllocated=0}};function qy(e,t){return`${e}_${t}`}var sre=class{constructor(e){this.device=e,this.numUsedTextures=0,this.numFreeTextures=0,this.freeTextures=new Map,this.usedTextures=new Map,this.numBytesUsed=0,this.numBytesAllocated=0}acquireTexture(e,t,a,n){let r=Ky(a),s=e*t*r,i=Xy(e,t,a,n);if(this.freeTextures.has(i)||this.freeTextures.set(i,[]),this.usedTextures.has(i)||this.usedTextures.set(i,[]),this.numBytesUsed+=s,this.numUsedTextures++,this.freeTextures.get(i).length>0){this.numFreeTextures--;let l=this.freeTextures.get(i).shift();return this.usedTextures.get(i).push(l),l}this.numBytesAllocated+=s;let o=this.device.createTexture({size:[e,t],format:a,usage:n});return this.usedTextures.get(i).push(o),o}releaseTexture(e,t,a,n,r){if(this.freeTextures.size===0)return;let s=Xy(t,a,n,r);this.freeTextures.has(s)||this.freeTextures.set(s,[]),this.freeTextures.get(s).push(e),this.numFreeTextures++,this.numUsedTextures--;let i=this.usedTextures.get(s),o=i.indexOf(e);if(o<0)throw new Error("Cannot release a texture that was never provided by this texture manager");i.splice(o,1);let l=Ky(n),u=t*a*l;this.numBytesUsed-=u}getNumUsedTextures(){return this.numUsedTextures}getNumFreeTextures(){return this.numFreeTextures}dispose(){this.freeTextures.forEach((e,t)=>{e.forEach(a=>{a.destroy()})}),this.usedTextures.forEach((e,t)=>{e.forEach(a=>{a.destroy()})}),this.freeTextures=new Map,this.usedTextures=new Map,this.numUsedTextures=0,this.numFreeTextures=0,this.numBytesUsed=0,this.numBytesAllocated=0}};function Xy(e,t,a,n){return`${e}_${t}_${a}_${n}`}function Ky(e){if(e==="rgba8unorm")return 16;throw new Error(`${e} is not supported!`)}function ire(e,t){if(Math.max(...e)>3)throw new Error("Cannot symbolically compute strides for rank > 4 tensor.");let a=e.length,n=e.map(s=>`${t}[${s}]`),r=new Array(a-1);r[a-2]=n[a-1];for(let s=a-3;s>=0;--s)r[s]=`(${r[s+1]} * ${n[s+1]})`;return r}var ore=(e,t,a,n)=>{let r={dtype:n.dtype,shape:n.shape},s=lre(a,r,t),i=e.createShaderModule({code:s,label:t.constructor.name});return e.createComputePipeline({compute:{module:i,entryPoint:"_start"},label:t.constructor.name,layout:"auto"})};function na(e){if(e<=1)return"i32";if(e===2)return"vec2";if(e===3)return"vec3";if(e===4)return"vec4";if(e===5)return"vec5";if(e===6)return"vec6";throw Error(`GPU for rank ${e} is not yet supported`)}function Ar(e){if(e===0)return"x";if(e===1)return"y";if(e===2)return"z";if(e===3)return"w";if(e===4)return"u";if(e===5)return"v";throw Error(`Index ${e} is not yet supported`)}function We(...e){let t;switch(e.length){case 0:t=` + ${hd()} + fn _start(@builtin(local_invocation_id) LocalId : vec3, + @builtin(global_invocation_id) GlobalId : vec3, + @builtin(num_workgroups) NumWorkgroups : vec3) { + localId = LocalId; + globalId = GlobalId; + numWorkgroups = NumWorkgroups; + main(); + } + + fn main() + `;break;case 1:t=` + ${hd()} + fn _start(@builtin(local_invocation_id) LocalId : vec3, + @builtin(global_invocation_id) GlobalId : vec3, + @builtin(num_workgroups) NumWorkgroups : vec3) { + localId = LocalId; + globalId = GlobalId; + numWorkgroups = NumWorkgroups; + main(getGlobalIndex()); + } + + fn main(${e[0]} : i32) + `;break;default:throw Error("Unreachable")}return t}function hd(){return` + @compute @workgroup_size(workGroupSizeX, workGroupSizeY, workGroupSizeZ) +`}function lre(e,t,a){let n=[];if(n.push(` + const workGroupSizeX = ${a.workGroupSize[0]}u; + const workGroupSizeY = ${a.workGroupSize[1]}u; + const workGroupSizeZ = ${a.workGroupSize[2]}u; + + var localId: vec3; + var globalId: vec3; + var numWorkgroups: vec3; + + // Only used when the y/z dimension of workgroup size is 1. + fn getGlobalIndex() -> i32 { + ${Pv(a)?" return i32(globalId.x);":` let localInvocationIndex = localId.z * workGroupSizeX * workGroupSizeY + + localId.y * workGroupSizeX + localId.x; + let workGroupID = (globalId - localId)/vec3( + workGroupSizeX, workGroupSizeY, workGroupSizeZ); + + return i32((workGroupID.z * numWorkgroups.x * numWorkgroups.y + + workGroupID.y * numWorkgroups.x + workGroupID.x) * + (workGroupSizeX * workGroupSizeY * workGroupSizeZ) + + localInvocationIndex); + `} + } + `),a.isFromPixels)return n.push(` + struct Uniform { + size : i32, + numChannels : i32, + outShapeStrides : vec2, + }; + + @group(0) @binding(0) var result: array<${Ku(t.dtype,a.isVec4)}>; + @group(0) @binding(2) var uniforms: Uniform; + `),[Zy,n.join(` +`),Yy(t.shape),a.getUserCode()].join(` +`);let r="struct Uniforms { NAN : f32, ";a.variableNames.forEach((c,p)=>{let h=na(e[p].shape.length);r+=`${c.charAt(0).toLowerCase()+c.slice(1)}Shape : ${h}, `});let s=na(t.shape.length);r+=`outShape : ${s}, `;let i=t.shape.length-1,o=na(i);r+=` + outShapeStrides: ${o}, `,a.size&&(r+="size : i32, "),a.uniforms&&(r+=a.uniforms),r+="};",r=gre(r),n.push(r),a.atomic?n.push(` + @group(0) @binding(0) var result: array>; + `):n.push(` + @group(0) @binding(0) var result: array<${Ku(t.dtype,a.isVec4)}>; + `),a.variableNames.forEach((c,p)=>{n.push(` + @group(0) @binding(${1+p}) var ${c}: array<${a.variableTypes?a.variableTypes[p]:Ku(e[p].dtype,a.isVec4)}>; + `)}),r!==""&&n.push(` + @group(0) @binding(${1+a.variableNames.length}) var uniforms: Uniforms; + `);let l=hre(t.shape,a.dispatchLayout),u=[Zy,n.join(` +`),Yy(t.shape),l,fre(t.shape.length)];a.atomic||u.push(mre(t.shape,t.dtype,a.isVec4));let d=e.map((c,p)=>cre(c,t.shape,a.variableTypes?a.variableTypes[p]==="vec4":a.isVec4,a.dispatchLayout.x.length===t.shape.length)).join(` +`);return u.push(d),u.push(a.getUserCode()),u.join(` +`)}function ure(e,t,a,n){let r=e.shaderKey;if(e.isFromPixels)return r;let s=a.map(d=>d.dtype).concat(n.dtype),i=a.map(d=>T.getBroadcastDims(d.shape,n.shape)),o=a.map(d=>v.arraysEqual(d.shape,n.shape)).join("_"),l=i.map(d=>d.join("_")).join(";"),u=Pv(e)?"flatDispatch":"";return r+="_"+(e.workGroupSize?e.workGroupSize.join(","):"")+t.map(d=>d.length).join(",")+s.join(",")+e.variableNames.join(",")+l+o+u,r}var Zy=` + struct vec5 {x: i32, y: i32, z: i32, w: i32, u: i32}; + struct vec6 {x: i32, y: i32, z: i32, w: i32, u: i32, v: i32}; + + // Checks whether coordinates lie within the bounds of the shape. + fn coordsInBounds2D(coord : vec2, shape : vec2) -> bool { + return all(coord >= vec2(0)) && all(coord < shape); + } + fn coordsInBounds3D(coord : vec3, shape : vec3) -> bool { + return all(coord >= vec3(0)) && all(coord < shape); + } + fn coordsInBounds4D(coord : vec4, shape : vec4) -> bool { + return all(coord >= vec4(0)) && all(coord < shape); + } + + fn getIndexFromCoords1D(coord : i32, shape : i32) -> i32 { + return coord; + } + fn getIndexFromCoords2D(coords : vec2, shape : vec2) -> i32 { + return dot(coords, vec2(shape.y, 1)); + } + fn getIndexFromCoords3D(coords : vec3, shape : vec3) -> i32 { + return dot(coords, vec3(shape.y * shape.z, shape.z, 1)); + } + fn getIndexFromCoords4D(coords : vec4, shape : vec4) -> i32 { + return dot(coords, vec4( + shape.y * shape.z * shape.w, shape.z * shape.w, shape.w, 1)); + } + fn getIndexFromCoords5D(coords : vec5, shape : vec5) -> i32 { + let shapeStrides: vec5 = vec5(shape.y * shape.z * shape.w * shape.u, shape.z * shape.w * shape.u, shape.w * shape.u, shape.u, 1); + return coords.x*shapeStrides.x + coords.y*shapeStrides.y + coords.z*shapeStrides.z + coords.w*shapeStrides.w + coords.u*shapeStrides.u; + } + fn getIndexFromCoords6D(coords : vec6, shape : vec6) -> i32 { + let shapeStrides: vec6 = vec6(shape.y * shape.z * shape.w * shape.u * shape.v, shape.z * shape.w * shape.u * shape.v, shape.w * shape.u * shape.v, shape.u * shape.v, shape.v, 1); + return coords.x*shapeStrides.x + coords.y*shapeStrides.y + coords.z*shapeStrides.z + coords.w*shapeStrides.w + coords.u*shapeStrides.u + coords.v*shapeStrides.v; + } + + fn idiv(a: i32, b: i32, sign: f32) -> i32 { + var res: i32 = a / b; + let modulo: i32 = a % b; + if (sign < 0. && modulo != 0) { + res = res - 1; + } + return res; + } + + // NaN defination in IEEE 754-1985 is : + // - sign = either 0 or 1. + // - biased exponent = all 1 bits. + // - fraction = anything except all 0 bits (since all 0 bits represents infinity). + // https://en.wikipedia.org/wiki/IEEE_754-1985#Representation_of_non-numbers + fn isnan(val: f32) -> bool { + let floatToUint: u32 = bitcast(val); + return (floatToUint & 0x7fffffffu) > 0x7f800000u; + } + fn isnanVec4(val : vec4) -> vec4 { + return vec4(isnan(val[0]), isnan(val[1]), isnan(val[2]), isnan(val[3])); + } +`;function Yy(e){let t=e.length;if(t<=1)return"fn getCoordsFromIndex(index : i32) -> i32 { return index; }";let a=v.computeStrides(e),n=na(t),r=[];for(let i=0;i vec2 { + let d0 = index / uniforms.outShapeStrides; let d1 = index - d0 * uniforms.outShapeStrides; + return vec2(d0, d1); + }`;let s;return s="var index2 = index;"+a.map((i,o)=>{let l=`let ${r[o]} = index2 / uniforms.outShapeStrides.${Ar(o)}`,u=o===a.length-1?`let ${r[o+1]} = index2 - ${r[o]} * uniforms.outShapeStrides.${Ar(o)}`:`index2 = index2 - ${r[o]} * uniforms.outShapeStrides.${Ar(o)}`;return`${l}; ${u};`}).join(""),` + fn getCoordsFromIndex(index : i32) -> ${n} { + ${s} + return ${n}(${r.join(",")}); + } + `}function dre(e,t){let a=e.name,n=e.shape.length,r=na(n),s="get"+a.charAt(0).toUpperCase()+a.slice(1),i=["d0","d1","d2","d3","d4","d5"].slice(0,n),o=i.map(d=>`${d} : i32`).join(", ");if(n<1)return t?` + fn ${s}() -> vec4 { + return vec4(${a}[0]); + } + `:` + fn ${s}() ->f32 { + return f32(${a}[0]); + } + `;let l=`uniforms.${a.charAt(0).toLowerCase()+a.slice(1)}Shape`,u=`${n}D`;return n===0&&(u="1D"),t?` + fn ${s}(${o}) -> vec4 { + return vec4(${a}[getIndexFromCoords${u}(${r}(${i.join(",")}), + ${l}) / 4]); + } + `:` + fn ${s}(${o}) -> f32 { + return f32(${a}[getIndexFromCoords${u}(${r}(${i.join(",")}), + ${l})]); + } + `}function pre(e,t,a,n){let r=e.name,s=r.charAt(0).toUpperCase()+r.slice(1),i="get"+s+"ByOutput",o=e.shape.length,l=t.length,u=na(l);if(v.arraysEqual(e.shape,t)&&n)return a?` + fn ${i}Index(globalIndex : i32) -> vec4 { + return vec4(${r}[globalIndex]); + } + + fn ${i}Coords(coords : ${u}) -> vec4 { + return vec4(${r}[${l>1?"getOutputIndexFromCoords(coords)":"coords"} / 4]); + } + `:` + fn ${i}Index(globalIndex : i32) -> f32 { + return f32(${r}[globalIndex]); + } + + fn ${i}Coords(coords : ${u}) -> f32 { + return f32(${r}[${l>1?"getOutputIndexFromCoords(coords)":"coords"}]); + } + `;let d=T.getBroadcastDims(e.shape,t),c=l-o,p="";if(o===0)return a?` + fn ${i}Index(globalIndex : i32) -> vec4 { + return get${s}(); + } + + fn ${i}Coords(coords : ${u}) -> vec4 { + return get${s}(); + } + `:` + fn ${i}Index(globalIndex : i32) -> f32{ + return get${s}(); + } + + fn ${i}Coords(coords : ${u}) -> f32{ + return get${s}(); + } + `;l<2&&d.length>=1?p="coords = 0;":p=d.map(g=>`coords.${Ar(g+c)} = 0;`).join(` +`);let h="";if(l<2&&o>0)h="coords";else if(l>1){let g=na(o),y=e.shape.map((A,x)=>`coords.${Ar(x+c)}`).join(", ");h=`${g}(${y})`}else h="coords";let f=`uniforms.${r.charAt(0).toLowerCase()+r.slice(1)}Shape`,m=`${o}D`;return a?` + fn ${i}Index(globalIndex : i32) -> vec4 { + var coords = getCoordsFromIndex(globalIndex); + ${p} + return ${r}[getIndexFromCoords${m}(${h}, ${f}) / 4]; + } + + fn ${i}Coords(coordsIn : ${u}) -> vec4 { + var coords = coordsIn; + ${p} + return ${r}[getIndexFromCoords${m}(${h}, ${f}) / 4]; + } + `:` + fn ${i}Index(globalIndex : i32) -> f32 { + var coords = getCoordsFromIndex(globalIndex); + ${p} + return f32(${r}[getIndexFromCoords${m}(${h}, ${f})]); + } + + fn ${i}Coords(coordsIn : ${u}) -> f32 { + var coords = coordsIn; + ${p} + return f32(${r}[getIndexFromCoords${m}(${h}, ${f})]); + } +`}function cre(e,t,a,n){let r=dre(e,a);return e.shape.length<=t.length&&(r+=pre(e,t,a,n)),r}function hre(e,t){let{x:a,y:n=[],z:r=[]}=t,s=e.length,i=a.length+n.length+r.length;if(i!==s)return"";if(a.length===s)return`fn getOutputCoords() -> ${na(s)}{ + let globalIndex = getGlobalIndex(); + return getCoordsFromIndex(globalIndex); + } + `;let o="",l=[a,n,r];for(let p=0;p ${d} { + ${o} +`;return u.length===0?c+=`return ${d}(0); }`:c+=`return ${d}(${u.join(",")}); }`,c}function fre(e){let t="";switch(e){case 0:case 1:t+=` + fn getOutputIndexFromCoords(coords : i32) -> i32 { + return coords; + } + `;break;case 2:t+=` + fn getOutputIndexFromCoords(coords : vec2) -> i32 { + return dot(coords, vec2(uniforms.outShapeStrides, 1)); + } + `;break;case 3:t+=` + fn getOutputIndexFromCoords(coords : vec3) -> i32 { + return dot(coords, vec3(uniforms.outShapeStrides.x, uniforms.outShapeStrides.y, 1)); + } + `;break;case 4:t+=` + fn getOutputIndexFromCoords(coords : vec4) -> i32 { + return dot(coords, vec4( + uniforms.outShapeStrides.x, uniforms.outShapeStrides.y, uniforms.outShapeStrides.z, 1)); + } + `;break;case 5:t+=` + fn getOutputIndexFromCoords(coords : vec5) -> i32 { + return coords.x * uniforms.outShapeStrides.x + + coords.y * uniforms.outShapeStrides.y + + coords.z * uniforms.outShapeStrides.z + + coords.w * uniforms.outShapeStrides.w + + coords.u; + } + `;break;case 6:t+=` + fn getOutputIndexFromCoords(coords : vec6) -> i32 { + return coords.x * uniforms.outShapeStrides.x + + coords.y * uniforms.outShapeStrides.y + + coords.z * uniforms.outShapeStrides.z + + coords.w * uniforms.outShapeStrides.w + + coords.u * uniforms.outShapeStrides.u + + coords.v; + } + `;break;default:v.assert(!1,()=>`Unsupported ${e}D shape`);break}return t}function Pv(e){return e.dispatch[1]===1&&e.dispatch[2]===1}function Ku(e,t){return e==="float32"?t?"vec4":"f32":e==="int32"||e==="bool"?t?"vec4":"i32":e}function mre(e,t,a){let n=e.length,r=Ku(t,a),s;if(a?s=`fn setOutputAtIndex(flatIndex : i32, value : vec4) { + result[flatIndex] = ${r}(value); + } + fn setOutputAtIndexI32(flatIndex : i32, value : vec4) { + result[flatIndex] = ${r}(value); + }`:s=`fn setOutputAtIndex(flatIndex : i32, value : f32) { + result[flatIndex] = ${r}(value); + } + fn setOutputAtIndexI32(flatIndex : i32, value : i32) { + result[flatIndex] = ${r}(value); + }`,n>=2){let i=["d0","d1","d2","d3","d4","d5"].slice(0,n),o=na(n);a?s+=` + fn setOutputAtCoords(${i.map(l=>`${l} : i32`).join(", ")}, value : vec4) { + let flatIndex = getOutputIndexFromCoords(${o}(${i.join(", ")})); + setOutputAtIndex(flatIndex / 4, value); + } + fn setOutputAtCoordsI32(${i.map(l=>`${l} : i32`).join(", ")}, value : vec4) { + let flatIndex = getOutputIndexFromCoords(${o}(${i.join(", ")})); + setOutputAtIndexI32(flatIndex / 4, value); + } + `:s+=` + fn setOutputAtCoords(${i.map(l=>`${l} : i32`).join(", ")}, value : f32) { + let flatIndex = getOutputIndexFromCoords(${o}(${i.join(", ")})); + setOutputAtIndex(flatIndex, value); + } + fn setOutputAtCoordsI32(${i.map(l=>`${l} : i32`).join(", ")}, value : i32) { + let flatIndex = getOutputIndexFromCoords(${o}(${i.join(", ")})); + setOutputAtIndexI32(flatIndex, value); + } + `}return s}function gre(e){let t=/(\w+)\s*:\s*vec(5|6)/g;e=e.replace(t,n=>"@align(16) "+n);let a=/vec(5|6)\s*,\s*(\w+)/g;return e=e.replace(a,(n,r,s)=>`vec${r}, @align(16) ${s}`),e}var Ov={};He(Ov,{ArrayBufferToTypedArray:()=>Lv,GPUBytesPerElement:()=>zv,MatMulProgramType:()=>Pn,computeDispatch:()=>Me,computeWorkGroupInfoForMatMul:()=>Dv,computeWorkGroupSizeForConv2d:()=>z3,computeWorkPerThreadForConv2d:()=>L3,flatDispatchLayout:()=>Ye,isWebGPUSupported:()=>B3,tilesFitEvenlyIntoShape:()=>yre});var ti=e=>{let t=1;for(let a=0;aa%e[n]===0)}function Me(e,t,a=[1,1,1],n=[1,1,1]){let[r,s,i]=[Math.ceil(ti(e.x.map(o=>t[o]))/(a[0]*n[0])),e.y?Math.ceil(ti(e.y.map(o=>t[o]))/(a[1]*n[1])):1,e.z?Math.ceil(ti(e.z.map(o=>t[o]))/(a[2]*n[2])):1];return[r,s,i]}function Dv(e,t,a,n=!1){let r=[8,8,1],s=[4,4,1];return n||(e<=8&&(s[1]=1),t<=16&&a<=16&&(r[0]=4)),{workGroupSize:r,elementsPerThread:s}}function z3(e,t,a=!1){if(a)return[8,8,1];let n=ti(e.x.map(s=>t[s])),r=ti(e.y.map(s=>t[s]));return n<=4?[4,16,1]:r<=4?[16,4,1]:[16,16,1]}function L3(e,t,a=!1){if(a)return[4,4,1];let n=ti(e.x.map(s=>t[s])),r=ti(e.y.map(s=>t[s]));return n<=4?[1,2,1]:r<=4?[2,1,1]:[2,2,1]}function Ye(e){return{x:e.map((t,a)=>a)}}function zv(e){if(e==="float32"||e==="int32"||e==="bool"||e==="string")return 4;if(e==="complex64")return 8;throw new Error(`Unknown dtype ${e}`)}function Lv(e,t){if(t==="float32")return new Float32Array(e);if(t==="int32")return new Int32Array(e);if(t==="bool"||t==="string")return Uint8Array.from(new Int32Array(e));throw new Error(`Unknown dtype ${t}`)}function B3(){return(typeof window!="undefined"||typeof WorkerGlobalScope!="undefined")&&!!navigator.gpu}var Pn;(function(e){e[e.MatMulReduceProgram=0]="MatMulReduceProgram",e[e.MatMulSplitKProgram=1]="MatMulSplitKProgram",e[e.MatMulSmallOutputSizeProgram=2]="MatMulSmallOutputSizeProgram",e[e.MatMulPackedProgram=3]="MatMulPackedProgram",e[e.MatMulMax=4]="MatMulMax"})(Pn||(Pn={}));var Are=V().getNumber("WEBGPU_CPU_HANDOFF_SIZE_THRESHOLD"),xre=(e,t)=>{let a=e.limits.maxComputeWorkgroupsPerDimension,n=t.dispatchLayout,r=t.dispatch;if(r.every(i=>i<=a))return r;v.assert(r[0]>a&&n.y===void 0&&n.z===void 0,()=>"Dispatch size exceeds WebGPU limits in Y or Z dimension.");let s=Math.ceil(Math.sqrt(r[0]));return s>a?(s=Math.ceil(Math.cbrt(r[0])),v.assert(s<=a,()=>"Total dispatch size exceeds WebGPU maximum."),[s,s,s]):[s,s,1]},Uh=class extends fl{constructor(e,t){if(super(),this.commandQueueOwnedIds=new WeakSet,this.dispatchNumberInEncoder=0,this.disposed=!1,this.downloadWaitMs=0,this.tensorDataPendingDisposal=[],this.stagingPendingDisposal=[],this.uniformPendingDisposal=[],this.uploadWaitMs=0,!B3())throw new Error("WebGPU is not supported on this device");this.pipelineCache={},this.device=e,this.queue=e.queue,this.currentCommandEncoder=null,this.currentComputePass=null,this.supportTimeQuery=e.features.has("timestamp-query"),this.adapterInfo=new nre(t),this.bufferManager=new rre(this.device),this.textureManager=new sre(this.device),this.tensorMap=new md(this,kt()),this.supportTimeQuery&&(this.querySet=this.device.createQuerySet({type:"timestamp",count:2})),V().getBool("WEBGPU_USE_PROFILE_TOOL")&&(this.dummyCanvas=document.createElement("canvas"),this.dummyCanvas.width=1,this.dummyCanvas.height=1,this.dummyContext=this.dummyCanvas.getContext("webgpu"),this.dummyContext.configure({device:e,format:"bgra8unorm"}),document.body.appendChild(this.dummyCanvas))}nextDataId(){return Uh.nextDataId++}floatPrecision(){return 32}defaultGpuBufferUsage(){return GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST}disposeData(e,t=!1){if(this.tensorDataPendingDisposal.indexOf(e)>=0)return!1;if(!this.tensorMap.has(e))return!0;let a=this.tensorMap.get(e);if(this.decRef(e),!t&&a.refCount>0)return!1;if(this.commandQueueOwnedIds.has(e))return this.tensorDataPendingDisposal.push(e),!1;let{complexTensorInfos:n}=this.tensorMap.get(e);return n!=null&&(this.disposeData(n.real.dataId,t),this.disposeData(n.imag.dataId,t)),this.releaseResource(e),this.tensorMap.delete(e),!0}memory(){return{numBytesInGPU:this.bufferManager.numBytesUsed,numBytesAllocatedInGPU:this.bufferManager.numBytesAllocated,unreliable:!1}}releaseResource(e){let t=this.tensorMap.get(e);if(!(!t||!t.resourceInfo)){if("texture"in t.resourceInfo){let a=t.resourceInfo;a.texture instanceof GPUTexture&&this.textureManager.releaseTexture(a.texture,a.width,a.height,a.format,a.usage),a.texture=null}else{let a=t.resourceInfo;this.bufferManager.releaseBuffer(a.buffer,a.size,a.usage),a.buffer=null}t.resourceInfo=null}}refCount(e){return this.tensorMap.has(e)?this.tensorMap.get(e).refCount:0}incRef(e){let t=this.tensorMap.get(e);t.refCount++}decRef(e){if(this.tensorMap.has(e)){let t=this.tensorMap.get(e);t.refCount--}}write(e,t,a){if(a==="complex64"&&e!=null)throw new Error("Cannot write to a complex64 dtype. Please use tf.complex(real, imag).");let n={id:this.nextDataId()};return this.tensorMap.set(n,{dtype:a,shape:t,values:e,refCount:1}),n}move(e,t,a,n,r){if(n==="complex64")throw new Error("Cannot write to a complex64 dtype. Please use tf.complex(real, imag).");this.tensorMap.set(e,{dtype:n,shape:a,values:t,refCount:r})}submitQueue(){this.ensureComputePassEnded(),this.queue.submit([this.currentCommandEncoder.finish()]),this.currentCommandEncoder=null,this.dispatchNumberInEncoder=0,this.commandQueueOwnedIds=new WeakSet,this.tensorDataPendingDisposal.forEach(e=>{this.releaseResource(e),this.tensorMap.delete(e)}),this.uniformPendingDisposal.forEach(e=>this.bufferManager.releaseBuffer(e.buffer,e.size,e.usage)),this.stagingPendingDisposal.forEach(e=>this.bufferManager.releaseUploadBuffer(e.buffer,e.size,e.usage)),this.tensorDataPendingDisposal=[],this.uniformPendingDisposal=[],this.stagingPendingDisposal=[]}ensureCommandEncoderReady(){this.currentCommandEncoder||(this.currentCommandEncoder=this.device.createCommandEncoder())}ensureComputePassEnded(){this.currentComputePass&&(this.currentComputePass.end(),this.currentComputePass=null)}getComputePass(){return this.currentComputePass||(this.currentComputePass=this.currentCommandEncoder.beginComputePass()),this.currentComputePass}async getBufferData(e,t){let a=this.bufferManager.acquireBuffer(t,GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ);this.ensureCommandEncoderReady(),this.ensureComputePassEnded(),this.currentCommandEncoder.copyBufferToBuffer(e,0,a,0,t),this.submitQueue(),await a.mapAsync(GPUMapMode.READ);let n=a.getMappedRange().slice(0);return a.unmap(),a!=null&&this.bufferManager.releaseBuffer(a,t,GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ),V().getBool("WEBGPU_USE_PROFILE_TOOL")&&(v.assert(this.dummyContext!==void 0,()=>"Fail to get context for profiling tool"),this.dummyContext.getCurrentTexture()),n}convertAndCacheOnCPU(e,t){let a=this.tensorMap.get(e);return this.releaseResource(e),a.values=t,a.values}readSync(e){let t=this.tensorMap.get(e),{values:a}=t;if(a==null)throw new Error("WebGPU readSync is only available for CPU-resident tensors.");return a}async read(e){if(!this.tensorMap.has(e))throw new Error(`Tensor ${e} was not registered!`);let t=this.tensorMap.get(e),{values:a}=t;if(a!=null)return this.convertAndCacheOnCPU(e,a);let n;if(t.dtype==="complex64"){let r=await Promise.all([this.read(t.complexTensorInfos.real.dataId),this.read(t.complexTensorInfos.imag.dataId)]),s=r[0],i=r[1];n=T.mergeRealAndImagArrays(s,i)}else{let r=t.resourceInfo,s=await this.getBufferData(r.buffer,r.size);n=Lv(s,t.dtype)}return this.convertAndCacheOnCPU(e,n),n}readToGPU(e){let t=this.tensorMap.get(e),{values:a,dtype:n,shape:r,resourceInfo:s}=t;if(n==="complex64")throw new Error("Does not support reading buffer for complex64 dtype.");if(s==null)throw a!=null?new Error("Data is not on GPU but on CPU."):new Error("There is no data on GPU or CPU.");let i=s.size,o=this.bufferManager.acquireBuffer(i,s.usage);this.ensureCommandEncoderReady(),this.ensureComputePassEnded(),this.currentCommandEncoder.copyBufferToBuffer(s.buffer,0,o,0,i),this.submitQueue();let l=this.makeTensorInfo(r,n),u=kt().makeTensorFromTensorInfo(l),d=this.tensorMap.get(l.dataId);return d.resourceInfo={size:i,usage:this.defaultGpuBufferUsage(),buffer:o},{tensorRef:u,buffer:o,bufSize:i}}bufferSync(e){let t=this.readSync(e.dataId);if(e.dtype==="string")try{let a=t.map(n=>v.decodeString(n));return ve(e.shape,e.dtype,a)}catch(a){throw new Error("Failed to decode encoded string bytes into utf-8")}return ve(e.shape,e.dtype,t)}async time(e){this.supportTimeQuery||console.warn("This device doesn't support timestamp-query extension. Start Chrome browser with flag --disable-dawn-features=disallow_unsafe_apis then try again. Otherwise, zero will be shown for the kernel time when profiling mode is enabled. Using performance.now is not workable for webgpu since it doesn't support synchronous data read from GPU.");let t=this.activeTimers,a=[],n=!1;this.programTimersStack==null?(this.programTimersStack=a,n=!0):this.activeTimers.push(a),this.activeTimers=a,e();let r=v.flatten(this.activeTimers.map(l=>l.query)).filter(l=>l!=null),s=v.flatten(this.activeTimers.map(l=>l.name)).filter(l=>l!=null);this.activeTimers=t,n&&(this.programTimersStack=null);let i={uploadWaitMs:this.uploadWaitMs,downloadWaitMs:this.downloadWaitMs,kernelMs:null,wallMs:null},o=await Promise.all(r);return i.kernelMs=v.sum(o),i.getExtraProfileInfo=()=>o.map((l,u)=>({name:s[u],ms:l})).map(l=>`${l.name}: ${l.ms}`).join(", "),this.uploadWaitMs=0,this.downloadWaitMs=0,i}makeTensorInfo(e,t,a){return t==="string"&&a!=null&&a.length>0&&v.isString(a[0])&&(a=a.map(n=>v.encodeString(n))),{dataId:this.write(a,e,t),shape:e,dtype:t}}tensorToBinding(e){if(!e)return null;let t=this.tensorMap.get(e.dataId);if("texture"in t.resourceInfo){let n=t.resourceInfo;return n.texture instanceof GPUExternalTexture?n.texture:n.texture.createView()}let a=t.resourceInfo;return{offset:0,size:a.size,buffer:a.buffer}}async getQueryTime(e){return this.supportTimeQuery?this.getTimeFromQuerySet(e):0}uploadToGPU(e){let t=this.tensorMap.get(e);if(t.resourceInfo)return;let a=zv(t.dtype)*v.sizeFromShape(t.shape),n=this.bufferManager.acquireBuffer(a,this.defaultGpuBufferUsage());if(t.resourceInfo={size:a,usage:this.defaultGpuBufferUsage(),buffer:n},t.values){let r=this.bufferManager.acquireUploadBuffer(a,GPUBufferUsage.MAP_WRITE|GPUBufferUsage.COPY_SRC),s=r.getMappedRange();t.dtype==="int32"||t.dtype==="bool"?new Int32Array(s).set(t.values):new Float32Array(s).set(t.values),r.unmap(),this.ensureCommandEncoderReady(),this.ensureComputePassEnded(),this.currentCommandEncoder.copyBufferToBuffer(r,0,n,0,a);let i={size:a,usage:GPUBufferUsage.MAP_WRITE|GPUBufferUsage.COPY_SRC,buffer:r};this.stagingPendingDisposal.push(i)}}makeUniforms(e){let t=0,a=0,n=[];e.forEach(o=>{o.data.length===0&&(o.data=[1]);let l;switch(o.data.length){case 1:l=4;break;case 2:l=8;break;case 3:l=16;break;case 4:l=16;break;case 5:l=16;break;case 6:l=16;break;default:v.assert(!1,()=>`Unsupported ${o.data.length}D shape`)}(a===5||a===6)&&(l=16),t=Math.ceil(t/l)*l,a=o.data.length,n.push(t),t+=o.data.length*4});let r=new ArrayBuffer(t);e.forEach((o,l)=>{let u=n[l];o.type==="int32"?new Int32Array(r,u,o.data.length).set(o.data):o.type==="uint32"?new Uint32Array(r,u,o.data.length).set(o.data):new Float32Array(r,u,o.data.length).set(o.data)});let s=this.bufferManager.acquireBuffer(t,GPUBufferUsage.COPY_DST|GPUBufferUsage.UNIFORM);this.queue.writeBuffer(s,0,r,0,t);let i={size:t,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.UNIFORM,buffer:s};return this.uniformPendingDisposal.push(i),{offset:0,size:t,buffer:s}}runWebGPUProgram(e,t,a,n,r){if(r||(r=this.makeTensorInfo(e.outputShape,a)),v.sizeFromShape(r.shape)===0)return this.tensorMap.get(r.dataId).values=v.getTypedArrayFromDType(r.dtype,0),r;this.uploadToGPU(r.dataId),e.dispatch=xre(this.device,e);let s=[],i=[];if(!e.isFromPixels){s.push({type:"float32",data:[NaN]}),i=t.concat(r).map(g=>g.shape);let f="int32";i.map(g=>{s.push({type:f,data:g})});let m=v.computeStrides(r.shape);if(s.push({type:f,data:m}),e.size){let g=v.sizeFromShape(e.outputShape);s.push({type:f,data:[e.isVec4?g/4:g]})}}let o=t.map((f,m)=>{if(f.dtype==="complex64")throw new Error("GPGPUProgram does not support complex64 input. For complex64 dtypes, please separate the program into real and imaginary parts.");return this.uploadToGPU(f.dataId),{dtype:this.tensorMap.get(f.dataId).dtype,shape:f.shape,name:e.variableNames[m]}}),l=ure(e,i,o,r),u;l in this.pipelineCache?u=this.pipelineCache[l]:(u=ore(this.device,e,o,r),this.pipelineCache[l]=u),n&&(s=[...s,...n]);let d=[this.tensorToBinding(r),...t.map(f=>this.tensorToBinding(f)),this.makeUniforms(s)],c=this.device.createBindGroup({layout:u.getBindGroupLayout(0),entries:d.map((f,m)=>({binding:m,resource:f}))});this.ensureCommandEncoderReady();let p=this.getComputePass(),h=this.activeTimers!=null;return h&&this.supportTimeQuery&&p.writeTimestamp(this.querySet,0),p.setPipeline(u),p.setBindGroup(0,c),p.dispatchWorkgroups(e.dispatch[0],e.dispatch[1],e.dispatch[2]),h&&this.supportTimeQuery&&p.writeTimestamp(this.querySet,1),this.dispatchNumberInEncoder++,t.forEach(f=>{this.commandQueueOwnedIds.add(f.dataId)}),this.commandQueueOwnedIds.add(r.dataId),V().get("WEBGPU_DEFERRED_SUBMIT_BATCH_SIZE")<=this.dispatchNumberInEncoder&&this.submitQueue(),h&&this.activeTimers.push({name:e.constructor.name,query:this.getQueryTime(this.querySet)}),r}async getTimeFromQuerySet(e){let t=this.bufferManager.acquireBuffer(16,GPUBufferUsage.COPY_SRC|GPUBufferUsage.QUERY_RESOLVE),a=this.bufferManager.acquireBuffer(16,GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST);this.ensureCommandEncoderReady(),this.ensureComputePassEnded(),this.currentCommandEncoder.resolveQuerySet(e,0,2,t,0),this.currentCommandEncoder.copyBufferToBuffer(t,0,a,0,16),this.submitQueue(),await a.mapAsync(GPUMapMode.READ);let n=new BigUint64Array(a.getMappedRange()),r=Number(n[1]-n[0]);return a.unmap(),this.bufferManager.releaseBuffer(a,16,GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST),this.bufferManager.releaseBuffer(t,16,GPUBufferUsage.COPY_SRC|GPUBufferUsage.QUERY_RESOLVE),r/1e6}shouldExecuteOnCPU(e,t=Are){return V().getBool("WEBGPU_CPU_FORWARD")&&e.every(a=>this.tensorMap.get(a.dataId).resourceInfo==null&&v.sizeFromShape(a.shape){V().set("CHECK_COMPUTATION_FOR_ERRORS",!1);let e={powerPreference:V().get("WEBGPU_USE_LOW_POWER_GPU")?"low-power":"high-performance"},t=await navigator.gpu.requestAdapter(e),a=t.limits,n={},r=t.features.has("timestamp-query");n.requiredLimits={maxComputeWorkgroupStorageSize:a.maxComputeWorkgroupStorageSize,maxComputeWorkgroupsPerDimension:a.maxComputeWorkgroupsPerDimension,maxStorageBufferBindingSize:a.maxStorageBufferBindingSize},r&&(n.requiredFeatures=["timestamp-query"]);let s=await t.requestDevice(n),i=await t.requestAdapterInfo();return new Uh(s,i)},3);var Be;(function(e){e[e.MUL=0]="MUL",e[e.ADD=1]="ADD",e[e.ATAN2=2]="ATAN2",e[e.SUB=3]="SUB",e[e.DIV=4]="DIV",e[e.EQUAL=5]="EQUAL",e[e.GREATER=6]="GREATER",e[e.GREATER_EQUAL=7]="GREATER_EQUAL",e[e.LESS=8]="LESS",e[e.LESS_EQUAL=9]="LESS_EQUAL",e[e.LOGICAL_AND=10]="LOGICAL_AND",e[e.NOT_EQUAL=11]="NOT_EQUAL",e[e.SQUARED_DIFFERENCE=12]="SQUARED_DIFFERENCE",e[e.INT_DIV=13]="INT_DIV",e[e.POW=14]="POW",e[e.PRELU=15]="PRELU",e[e.MAX=16]="MAX",e[e.MIN=17]="MIN",e[e.COMPLEX_MULTIPLY_REAL=18]="COMPLEX_MULTIPLY_REAL",e[e.COMPLEX_MULTIPLY_IMAG=19]="COMPLEX_MULTIPLY_IMAG"})(Be||(Be={}));var bre=` + if (isnan(a)) { return a; } + if (isnan(b)) { return b; } + `,Bv=` + if (isNaN.r) { + resultTemp.r = valueForNaN; + } + if (isNaN.g) { + resultTemp.g = valueForNaN; + } + if (isNaN.b) { + resultTemp.b = valueForNaN; + } + if (isNaN.a) { + resultTemp.a = valueForNaN; + } + `,Wv=` + let isNaN = isnanVec4(a) | isnanVec4(b); + ${Bv} + `,vre="return a + b;",wre="return areal * breal - aimag * bimag;",kre="return areal * bimag + aimag * breal;",Ire="return a / b;",Sre="return a * b;",Tre="return (a - b) * (a - b);",Cre="return a - b;",Nre="return f32(a == b);",Ere="return vec4(a == b);",Rre="return f32(a > b);",Mre="return vec4(a > b);",$re="return f32(a >= b);",_re="return vec4(a >= b);",Fre="return f32(a < b);",Pre="return vec4(a < b);",Ore="return f32(a <= b);",Dre="return vec4(a <= b);",zre="return f32(f32(a) >= 1.0 && f32(b) >= 1.0);",Lre=`return (vec4(a >= vec4(1.0)) * + vec4(b >= vec4(1.0)));`,Bre=` + let s = sign(a) * sign(b); + let ia = i32(round(a)); + let ib = i32(round(b)); + return f32(idiv(ia, ib, s)); + `,Wre=` + let ia = vec4(round(a)); + let ib = vec4(round(b)); + let cond = ib != vec4(0); + var resultTemp = vec4(0); + let s = sign(a) * sign(b); + + // Windows (D3D) wants guaranteed non-zero int division at compile-time. + if (cond[0]) { + resultTemp[0] = idiv(ia[0], ib[0], s[0]); + } + if (cond[1]) { + resultTemp[1] = idiv(ia[1], ib[1], s[1]); + } + if (cond[2]) { + resultTemp[2] = idiv(ia[2], ib[2], s[2]); + } + if (cond[3]) { + resultTemp[3] = idiv(ia[3], ib[3], s[3]); + } + return vec4(resultTemp); + `,Vre=` + if (isnan(a) || isnan(b)) { + return 1.0; + } + return f32(a != b); +`,Gre=` + var resultTemp = vec4(a != b); + let valueForNaN = 1.0; + ${Wv} + + return resultTemp; +`,Ure=` + if(a < 0.0 && floor(b) < b) { + return uniforms.NAN; + } + if (b == 0.0) { + return 1.0; + } + if (round(abs(b) % 2.0) != 1.0) { + return pow(abs(a), b); + } + return sign(a) * pow(abs(a), b); + `,jre=` + let isModRound1Bool = vec4(round(abs(b) % vec4(2.0))) == vec4(1); + let isModRound1 = vec4(isModRound1Bool); + let multiplier = sign(a) * isModRound1 + (vec4(1.0) - isModRound1); + var resultTemp = multiplier * pow(abs(a), b); + + // Ensure that a^0 = 1, including 0^0 = 1 as this correspond to TF and JS + let isExpZero = b == vec4(0.0); + if (isExpZero.r) { + resultTemp.r = 1.0; + } + if (isExpZero.g) { + resultTemp.g = 1.0; + } + if (isExpZero.b) { + resultTemp.b = 1.0; + } + if (isExpZero.a) { + resultTemp.a = 1.0; + } + let isNaN = (a < vec4(0.0)) & (floor(b) < b); + let valueForNaN = uniforms.NAN; + ${Bv} + return resultTemp; + `,Hre="if (a < 0.0) { return b * a; } return a;",qre=` + let aLessThanZero = vec4(a < vec4(0.0)); + return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a); + `;function Lm(e,t,a="uniforms.NAN"){let n=t?Wv:bre;return t?` + let valueForNaN = ${a}; + var resultTemp = vec4(${e}(a, b)); + `+n+` + return resultTemp; + `:n+` + return ${e}(a, b); + `}function W3(e,t){switch(e){case Be.MUL:return Sre;case Be.ADD:return vre;case Be.ATAN2:return Lm("atan2",t);case Be.SUB:return Cre;case Be.DIV:return Ire;case Be.EQUAL:return t?Ere:Nre;case Be.GREATER:return t?Mre:Rre;case Be.GREATER_EQUAL:return t?_re:$re;case Be.LESS:return t?Pre:Fre;case Be.LESS_EQUAL:return t?Dre:Ore;case Be.LOGICAL_AND:return t?Lre:zre;case Be.NOT_EQUAL:return t?Gre:Vre;case Be.SQUARED_DIFFERENCE:return Tre;case Be.INT_DIV:return t?Wre:Bre;case Be.PRELU:return t?qre:Hre;case Be.MAX:return Lm("max",t);case Be.MIN:return Lm("min",t);case Be.POW:return t?jre:Ure;case Be.COMPLEX_MULTIPLY_REAL:return wre;case Be.COMPLEX_MULTIPLY_IMAG:return kre;default:throw new Error(`BinaryType ${e} is not implemented!`)}}var Se;(function(e){e[e.ABS=0]="ABS",e[e.CEIL=1]="CEIL",e[e.COS=2]="COS",e[e.COSH=3]="COSH",e[e.ELU=4]="ELU",e[e.EXP=5]="EXP",e[e.EXPM1=6]="EXPM1",e[e.FLOOR=7]="FLOOR",e[e.IS_NAN=8]="IS_NAN",e[e.LINEAR=9]="LINEAR",e[e.LOG=10]="LOG",e[e.LOGICAL_NOT=11]="LOGICAL_NOT",e[e.NEG=12]="NEG",e[e.RELU=13]="RELU",e[e.RELU6=14]="RELU6",e[e.LEAKYRELU=15]="LEAKYRELU",e[e.RECIPROCAL=16]="RECIPROCAL",e[e.RSQRT=17]="RSQRT",e[e.SIN=18]="SIN",e[e.SINH=19]="SINH",e[e.SIGMOID=20]="SIGMOID",e[e.SQRT=21]="SQRT",e[e.SQUARE=22]="SQUARE",e[e.TANH=23]="TANH",e[e.TO_INT=24]="TO_INT"})(Se||(Se={}));var Xre="return abs(a);",Kre="return ceil(a);",Zre="return cos(a);",Yre=` + let e2x = exp(-a); + return (e2x + 1.0 / e2x) / 2.0; +`,Jre="return exp(a) - 1.0;",Qre="if (a >= 0.0) { return a; } return (exp(a) - 1.0);",ese=` + var resFloat = exp(a) - vec4(1.0); + if (a.r >= 0.0) { + resFloat.r = a.r; + } + if (a.g >= 0.0) { + resFloat.g = a.g; + } + if (a.b >= 0.0) { + resFloat.b = a.b; + } + if (a.a >= 0.0) { + resFloat.a = a.a; + } + return resFloat; +`,tse="return exp(a);",ase="return floor(a);",nse="return f32(isnan(a));",rse="return a;",sse=`if (a < 0.0) { return uniforms.NAN; } + return log(a);`,ise="return f32(!(a >= 1.0));",ose="return -a;",lse="if (a < 0.0) { return uniforms.alpha * a; } return a;",use=` + let aLessThanZero = vec4(a < vec4(0.0)); + return (aLessThanZero * (uniforms.alpha * a)) + ((vec4(1.0) - aLessThanZero) * a); +`,dse="return 1.0 / a;",pse="return select(a, 0.0, a < 0.0);",cse="return clamp(a, 0.0, 6.0);",hse="return clamp(a, vec4(0.0, 0.0, 0.0, 0.0), vec4(6.0, 6.0, 6.0, 6.0));",fse=` + return select(a, vec4(0.0), a < vec4(0.0)); +`,mse="return 1.0/sqrt(a);",gse="return 1.0 / (1.0 + exp(-1.0 * a));",yse="return sin(a);",Ase=` + let e2x = exp(a); + return (e2x - 1.0 / e2x) / 2.0; +`,xse="return sqrt(a);",bse="return a * a;",vse=` + let e2x = exp(-2.0 * abs(a)); + return sign(a) * (1.0 - e2x) / (1.0 + e2x); +`,wse="return f32(i32((a)));";function qs(e,t){switch(e){case Se.ABS:return Xre;case Se.COS:return Zre;case Se.COSH:return Yre;case Se.CEIL:return Kre;case Se.ELU:return t?ese:Qre;case Se.EXP:return tse;case Se.EXPM1:return Jre;case Se.FLOOR:return ase;case Se.IS_NAN:return nse;case Se.LINEAR:return rse;case Se.LOG:return sse;case Se.LOGICAL_NOT:return ise;case Se.NEG:return ose;case Se.LEAKYRELU:return t?use:lse;case Se.RECIPROCAL:return dse;case Se.RELU:return t?fse:pse;case Se.RELU6:return t?hse:cse;case Se.RSQRT:return mse;case Se.SIGMOID:return gse;case Se.SIN:return yse;case Se.SINH:return Ase;case Se.SQRT:return xse;case Se.SQUARE:return bse;case Se.TANH:return vse;case Se.TO_INT:return wse;default:throw new Error(`BinaryType ${e} is not implemented!`)}}var Rt=e=>{switch(e){case 1:return"f32";case 2:return"vec2";case 3:return"vec3";case 4:return"vec4";default:throw new Error(`${e}-component is not supported.`)}};function Cr(e,t=!1,a=!1,n=3){if(e===null)return"";let r="";if(e==="linear")r=qs(Se.LINEAR);else if(e==="relu")r=qs(Se.RELU,a);else if(e==="elu")r=qs(Se.ELU,a);else if(e==="relu6")r=qs(Se.RELU6,a);else if(e==="prelu")r=W3(Be.PRELU,a);else if(e==="sigmoid")r=qs(Se.SIGMOID,a);else if(e==="leakyrelu")r=qs(Se.LEAKYRELU,a);else throw new Error(`Activation ${e} has not been implemented for the WebGPU backend.`);let s=Rt(a?4:1),i="";return t?i=` + fn activation(a : ${s}, coords : vec${n}) -> ${s} { + let b = getPreluActivationWeightsByOutputCoords(coords); + ${r} + }`:i=` + fn activation(a : ${s}, coords : vec${n}) -> ${s} { + ${r} + }`,i}function mo(e,t){return` + ${e?"value = value + getBiasByOutputCoords(coords);":""} + ${t?"value = activation(value, coords);":""} + `}function Vv(e,t,a,n,r=!1,s=!1,i=!1,o=1){v.assert(a&&o===1||!a,()=>`transposeA ${a} is not compatible with component size ${o}`);let l=` + let batch = ${e?"0":"batchIn"}; + ${a?"value = getA(batch, col, row);":"value = getA(batch, row, col);"} + + `,u=n?"value = getB(batch, col, row);":"value = getB(batch, row, col);";return` + fn mm_readA(batchIn: i32, row: i32, colIn: i32) -> ${Rt(o)} { + var value = ${Rt(o)}(0.0); + let col = colIn * ${o}; + ${r&&i?l:` + ${a?"if(row < uniforms.dimAOuter && col < uniforms.dimInner)":"if(row < uniforms.aShape[1] && col < uniforms.aShape[2])"} + { + ${l} + } + `} + return value; + } + + fn mm_readB(batchIn: i32, row: i32, colIn: i32) -> ${Rt(o)} { + let col = colIn * ${o}; + let batch = ${t?"0":"batchIn"}; + var value = ${Rt(o)}(0.0); + ${u} + return value; + } + `}function V3(e,t,a,n,r,s,i=!1,o=!1,l=!1,u=1){return` + ${Vv(a,n,r,s,i,o,l,u)} + fn mm_write(batch: i32, row: i32, colIn: i32, valueIn: ${Rt(u)}) { + let col = colIn * ${u}; + ${i&&o?"":"if (row < uniforms.dimAOuter && col < uniforms.dimBOuter)"} + { + var value = valueIn; + let coords = vec3(batch, row, col); + ${mo(e,t)} + setOutputAtCoords(coords[0], coords[1], coords[2], value); + } + } + `}var kse=e=>e?` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + kStart + inputRow, + globalRowStart / InnerElementSize + inputCol); + `:` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + globalRow + innerRow, + kStart / InnerElementSize + inputCol); + `,Ise=(e,t)=>e?` + let ACached0 = mm_Asub[k * InnerElementSize][localRow]; + let ACached1 = mm_Asub[k * InnerElementSize + 1][localRow]; + let ACached2 = mm_Asub[k * InnerElementSize + 2][localRow]; + ${t===3?"":"let ACached3 = mm_Asub[k * InnerElementSize + 3][localRow];"} + for (var i = 0; i < RowPerThread; i = i + 1) { + acc[i] = BCached0 * ACached0[i] + acc[i]; + acc[i] = BCached1 * ACached1[i] + acc[i]; + acc[i] = BCached2 * ACached2[i] + acc[i]; + ${t===3?"":"acc[i] = BCached3 * ACached3[i] + acc[i];"} + }`:` + for (var i = 0; i < RowPerThread; i = i + 1) { + let ACached = mm_Asub[tileRow + i][k]; + acc[i] = BCached0 * ACached.x + acc[i]; + acc[i] = BCached1 * ACached.y + acc[i]; + acc[i] = BCached2 * ACached.z + acc[i]; + ${t===3?"":"acc[i] = BCached3 * ACached.w + acc[i];"} + }`;function jh(e,t,a=!1,n=32,r=!1,s=32,i=!1){let o=t[1]*e[1],l=t[0]*e[0],u=a?o:n,d=a?n:o,c=u/t[0],p=n/t[1];return v.assert((a&&c===4&&e[1]===4||!a&&(c===3||c===4))&&u%t[0]===0&&n%t[1]===0&&e[0]===4,()=>`If transposeA ${a} is true, innerElementSize ${c} and workPerThread[1] ${e[1]} must be 4. + Otherwise, innerElementSize ${c} must be 3 or 4. + tileAWidth ${u} must be divisible by workGroupSize[0]${t[0]}. tileInner ${n} must be divisible by workGroupSize[1] ${t[1]}. ColPerThread ${e[0]} must be 4.`),` + var mm_Asub : array, ${u/c}>, ${d}>; + var mm_Bsub : array, ${l/e[0]}>, ${n}>; + + const RowPerThread = ${e[1]}; + const ColPerThread = ${e[0]}; + const InnerElementSize = ${c}; + const TileInner = ${n}; + + @compute @workgroup_size(workGroupSizeX, workGroupSizeY, workGroupSizeZ) + fn _start(@builtin(local_invocation_id) LocalId : vec3, + @builtin(global_invocation_id) GlobalId : vec3, + @builtin(num_workgroups) NumWorkgroups: vec3, + @builtin(workgroup_id) workgroupId: vec3) { + localId = LocalId; + globalId = GlobalId; + numWorkgroups = NumWorkgroups; + + let localRow = i32(localId.y); + let tileRow = ${i?"0":"localRow * RowPerThread"}; + let tileCol = i32(localId.x); + + let globalRow = ${i?"0":"i32(globalId.y) * RowPerThread"}; + let globalCol = i32(globalId.x); + let batch = ${r?"0":"i32(globalId.z)"}; + let globalRowStart = i32(workgroupId.y) * ${o}; + + let numTiles = ${r?`${Math.ceil(s/n)}`:"(uniforms.dimInner - 1) / TileInner + 1"}; + var kStart = ${r?`i32(globalId.z) * ${s}`:"0"}; + + var acc: array, RowPerThread>; + + // Loop over shared dimension. + let tileRowB = localRow * ${p}; + for (var t = 0; t < numTiles; t = t + 1) { + // Load one tile of A into local memory. + for (var innerRow = 0; innerRow < RowPerThread; innerRow = innerRow + 1) { + let inputRow = tileRow + innerRow; + let inputCol = tileCol; + ${kse(a)} + } + + // Load one tile of B into local memory. + for (var innerRow = 0; innerRow < ${p}; innerRow = innerRow + 1) { + let inputRow = tileRowB + innerRow; + let inputCol = tileCol; + mm_Bsub[inputRow][inputCol] = mm_readB(batch, kStart + inputRow, globalCol); + } + kStart = kStart + TileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + for (var k = 0; k < TileInner / InnerElementSize; k = k + 1) { + let BCached0 = mm_Bsub[k * InnerElementSize][tileCol]; + let BCached1 = mm_Bsub[k * InnerElementSize + 1][tileCol]; + let BCached2 = mm_Bsub[k * InnerElementSize + 2][tileCol]; + ${c===3?"":"let BCached3 = mm_Bsub[k * InnerElementSize + 3][tileCol];"} + + ${Ise(a,c)} + } + + workgroupBarrier(); + } + + for (var innerRow = 0; innerRow < RowPerThread; innerRow = innerRow + 1) { + mm_write(batch, globalRow + innerRow, globalCol, acc[innerRow]); + } + }`}var Jy=e=>e?` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + kStart + inputRow, + globalRowStart + inputCol); + `:` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + globalRowStart + inputRow, + kStart + inputCol); + `,Sse=e=>e?"let ACached = mm_Asub[k][tileRow + innerRow];":"let ACached = mm_Asub[tileRow + innerRow][k];";function Hh(e,t,a=!1,n=32,r=!1,s=32,i=!1){let o=e[1]*t[1],l=e[0]*t[0],u=a?o:n,d=a?n:o;v.assert(d%t[1]===0&&u%t[0]===0&&n%t[1]===0,()=>`tileAHight ${d} must be divisible by workGroupSize[1]${t[1]}, tileAWidth ${u} must be divisible by workGroupSize[0]${t[0]}, tileInner ${n} must be divisible by workGroupSize[1]${t[1]}`);let c=d/t[1],p=u/t[0],h=n/t[1],f=i?` + let localRow = i32(localId.y); + let localCol = i32(localId.x); + let globalRowStart = i32(workgroupId.y) * ${o}; + let globalColStart = i32(workgroupId.x) * ${l}; + + // Loop over shared dimension. + for (var t = 0; t < numTiles; t = t + 1) { + // Load one tile of A into local memory. + for (var inputRow = localRow; inputRow < ${d}; inputRow = inputRow + ${t[1]}) { + for (var inputCol = localCol; inputCol < ${u}; inputCol = inputCol + ${t[0]}) { + ${Jy(a)} + } + } + // Load one tile of B into local memory. + for (var inputRow = localRow; inputRow < ${n}; inputRow = inputRow + ${t[1]}) { + for (var inputCol = localCol; inputCol < ${l}; inputCol = inputCol + ${t[0]}) { + mm_Bsub[inputRow][inputCol] = mm_readB(batch, + kStart + inputRow, + globalColStart + inputCol); + } + } + kStart = kStart + TileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + var BCached : array; + for (var k = 0; k < TileInner; k = k + 1) { + for (var inner = 0; inner < ColPerThread; inner = inner + 1) { + BCached[inner] = mm_Bsub[k][localCol + inner * ${t[0]}]; + } + for (var innerRow = 0; innerRow < RowPerThread; innerRow = innerRow + 1) { + let ACached = ${a?`mm_Asub[k][localRow + innerRow * ${t[1]}];`:`mm_Asub[localRow + innerRow * ${t[1]}][k];`} + for (var innerCol = 0; innerCol < ColPerThread; innerCol = innerCol + 1) { + acc[innerRow][innerCol] = acc[innerRow][innerCol] + + ACached * BCached[innerCol]; + } + } + } + workgroupBarrier(); + } + for (var innerRow = 0; innerRow < RowPerThread; innerRow = innerRow + 1) { + let gRow = globalRowStart + localRow + innerRow * ${t[1]}; + for (var innerCol = 0; innerCol < ColPerThread; innerCol = innerCol + 1) { + let gCol = globalColStart + localCol + innerCol * ${t[0]}; + mm_write(batch, gRow, gCol, acc[innerRow][innerCol]); + } + } + `:` + let tileRow = i32(localId.y) * RowPerThread; + let tileCol = i32(localId.x) * ColPerThread; + + let globalRow = i32(globalId.y) * RowPerThread; + let globalCol = i32(globalId.x) * ColPerThread; + let globalRowStart = i32(workgroupId.y) * ${o}; + + let tileRowA = i32(localId.y) * ${c}; + let tileColA = i32(localId.x) * ${p}; + let tileRowB = i32(localId.y) * ${h}; + // Loop over shared dimension. + for (var t = 0; t < numTiles; t = t + 1) { + // Load one tile of A into local memory. + for (var innerRow = 0; innerRow < ${c}; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < ${p}; innerCol = innerCol + 1) { + let inputRow = tileRowA + innerRow; + let inputCol = tileColA + innerCol; + ${Jy(a)} + } + } + + // Load one tile of B into local memory. + for (var innerRow = 0; innerRow < ${h}; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < ColPerThread; innerCol = innerCol + 1) { + let inputRow = tileRowB + innerRow; + let inputCol = tileCol + innerCol; + mm_Bsub[inputRow][inputCol] = mm_readB(batch, + kStart + inputRow, + globalCol + innerCol); + } + } + kStart = kStart + TileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + var BCached : array; + for (var k = 0; k < TileInner; k = k + 1) { + for (var inner = 0; inner < ColPerThread; inner = inner + 1) { + BCached[inner] = mm_Bsub[k][tileCol + inner]; + } + + for (var innerRow = 0; innerRow < RowPerThread; innerRow = innerRow + 1) { + ${Sse(a)} + for (var innerCol = 0; innerCol < ColPerThread; innerCol = innerCol + 1) { + acc[innerRow][innerCol] = acc[innerRow][innerCol] + ACached * BCached[innerCol]; + } + } + } + + workgroupBarrier(); + } + + for (var innerRow = 0; innerRow < RowPerThread; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < ColPerThread; innerCol = innerCol + 1) { + mm_write(batch, globalRow + innerRow, globalCol + innerCol, + acc[innerRow][innerCol]); + } + } + `;return` + var mm_Asub : array, ${d}>; + var mm_Bsub : array, ${n}>; + const RowPerThread = ${e[1]}; + const ColPerThread = ${e[0]}; + const TileInner = ${n}; + + @compute @workgroup_size(workGroupSizeX, workGroupSizeY, workGroupSizeZ) + fn _start(@builtin(local_invocation_id) LocalId : vec3, + @builtin(global_invocation_id) GlobalId : vec3, + @builtin(num_workgroups) NumWorkgroups: vec3, + @builtin(workgroup_id) workgroupId: vec3) { + localId = LocalId; + globalId = GlobalId; + numWorkgroups = NumWorkgroups; + + let batch = ${r?"0":"i32(globalId.z)"}; + let numTiles = ${r?`${Math.ceil(s/n)}`:"(uniforms.dimInner - 1) / TileInner + 1"}; + var kStart = ${r?`i32(globalId.z) * ${s}`:"0"}; + + var acc : array, RowPerThread>; + + // Without this initialization strange values show up in acc. + for (var innerRow = 0; innerRow < RowPerThread; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < ColPerThread; innerCol = innerCol + 1) { + acc[innerRow][innerCol] = 0.0; + } + } + ${f} + } + `}var Tse=e=>e?` + mm_readA(batch, colA, globalRow), + mm_readA(batch, colA + 1, globalRow), + mm_readA(batch, colA + 2, globalRow), + mm_readA(batch, colA + 3, globalRow) + `:` + mm_readA(batch, globalRow, colA), + mm_readA(batch, globalRow, colA + 1), + mm_readA(batch, globalRow, colA + 2), + mm_readA(batch, globalRow, colA + 3) + `;function Cse(e,t=!1){return v.assert(e[1]===1&&e[2]===1,()=>`A linear work group size is required. But got ${e}.`),` + const TileSize = ${e[0]*4}; + var mm_Asub : array, ${e[0]}>; + + ${We()} { + let tileCol = i32(localId.x); + let globalCol = i32(globalId.x); + let globalRow = i32(globalId.y); + + let numTiles = (uniforms.dimInner - 1) / TileSize + 1; + let batch = i32(globalId.z); + // Without this initialization strange values show up in acc. + var acc = 0.0; + + // Loop over shared dimension. + for (var t = 0; t < numTiles; t = t + 1) { + // Load one tile of A into local memory. + let colA = t * TileSize + tileCol * 4; + mm_Asub[tileCol] = vec4(${Tse(t)}); + workgroupBarrier(); + + // Compute acc values for a single thread. + for (var k = 0; k < TileSize / 4; k = k + 1) { + let rowB = t * TileSize + k * 4; + let BCached = vec4(mm_readB(batch, rowB, globalCol), + mm_readB(batch, rowB + 1, globalCol), + mm_readB(batch, rowB + 2, globalCol), + mm_readB(batch, rowB + 3, globalCol)); + + let ACached = mm_Asub[k]; + acc = acc + dot(ACached, BCached); + } + + workgroupBarrier(); + } + + mm_write(batch, globalRow, globalCol, acc); + } + `}var Nse=class{constructor(e,t,a,n,r=!1,s=!1,i=null,o=null,l=null,u=!1){this.variableNames=["A","B"],this.uniforms="dimAOuter : i32, dimBOuter : i32, dimInner : i32,",this.outputShape=t,this.dispatchLayout={x:[2],y:[1],z:[0]};let d=r?e[1]:e[2];if(this.isVec4=(d%4===0&&!r||t[1]%4===0&&r)&&t[2]%4===0&&!s,this.isVectorA=t[1]===1&&!r,!this.isVec4&&this.isVectorA)this.elementsPerThread=[1,1,1],this.workGroupSize=[32,1,1];else{let h=Dv(t[1],d,t[2],r);this.workGroupSize=h.workGroupSize,this.elementsPerThread=h.elementsPerThread}this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize,this.elementsPerThread);let c=i!=null,p=l!=null;c&&this.variableNames.push("bias"),p&&this.variableNames.push("preluActivationWeights"),this.sequentialAccessByThreads=u,this.transposeA=r,this.transposeB=s,this.addBias=c,this.activation=o,this.hasPreluActivationWeights=p,this.batchAEqualOne=a,this.batchBEqualOne=n,[this.fitAOuter,this.fitBOuter,this.fitInner]=this.getShapeFit(t[1],t[2],d),this.shaderKey=`matMulPacked_${this.elementsPerThread}_${r}_${s}_${this.activation}_${this.fitAOuter}_${this.fitBOuter}_${this.fitInner}_${this.isVec4}_${this.isVectorA}_${this.batchAEqualOne}_${this.batchBEqualOne}_${this.sequentialAccessByThreads}`}getShapeFit(e,t,a){let n=this.workGroupSize[1]*this.elementsPerThread[1],r=this.workGroupSize[0]*this.elementsPerThread[0];!this.isVec4&&this.isVectorA?this.tileInner=this.workGroupSize[0]*4:this.tileInner=r;let s=e%n===0,i=t%r===0,o=a%this.tileInner===0;return[s,i,o]}getUserCode(){return` + ${Cr(this.activation,this.hasPreluActivationWeights,this.isVec4)} + ${V3(this.addBias,this.activation,this.batchAEqualOne,this.batchBEqualOne,!1,this.transposeB,this.fitAOuter,this.fitBOuter,this.fitInner,this.isVec4?4:1)} + ${this.isVec4?jh(this.elementsPerThread,this.workGroupSize,this.transposeA,this.tileInner,!1,null,this.isVectorA):this.isVectorA?Cse(this.workGroupSize,this.transposeA):Hh(this.elementsPerThread,this.workGroupSize,this.transposeA,this.tileInner,!1,null,this.sequentialAccessByThreads)} + `}};function Ese(){return` + var sumValues : array; + ${We()} { + let coords = getOutputCoords(); + let batch = coords[0]; + let row = coords[1]; + let col = coords[2]; + var sum = 0.0; + let Length = uniforms.dimInner; + for (var k = i32(localId.x); k < Length; k = k + i32(workGroupSizeX)) { + let dataA = mm_readA(batch, row, k); + let dataB = mm_readB(batch, k, col); + sum = sum + dataA * dataB; + } + sumValues[localId.x] = sum; + workgroupBarrier(); + + for(var currentSize = workGroupSizeX / 2u; currentSize > 1u; + currentSize = currentSize / 2u) { + if (localId.x < currentSize) + { + sumValues[localId.x] = sumValues[localId.x] + sumValues[localId.x + currentSize]; + } + workgroupBarrier(); + } + + if (localId.x == 0u) { + sum = sumValues[0] + sumValues[1]; + mm_write(batch, row, col, sum); + } + } + `}var Rse=class{constructor(e,t,a,n=!1,r=!1,s=null,i=null,o=null){this.variableNames=["A","B"],this.uniforms="dimAOuter : i32, dimBOuter : i32, dimInner : i32,",this.workGroupSize=[256,1,1],this.outputShape=e,this.dispatchLayout={x:[],y:[1,2],z:[0]},this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize);let l=s!=null,u=o!=null;l&&this.variableNames.push("bias"),u&&this.variableNames.push("preluActivationWeights"),this.transposeA=n,this.transposeB=r,this.addBias=l,this.activation=i,this.hasPreluActivationWeights=u,this.batchAEqualOne=t,this.batchBEqualOne=a,this.shaderKey=`matMulReduce_${this.activation}_${n}_${r}_${this.batchAEqualOne}_${this.batchBEqualOne}`}getUserCode(){return` + ${Cr(this.activation,this.hasPreluActivationWeights)} + ${V3(this.addBias,this.activation,this.batchAEqualOne,this.batchBEqualOne,this.transposeA,this.transposeB)} + ${Ese()} + `}};function Mse(e){let t=e[1],a=e[0],n=t>a?t:a;return` + var mm_Asub : array, ${t}>; + var mm_Bsub : array, ${n}>; + + // If the output size is small for matrix multiplication, avoid to use vec4 + // and handle some elements per thread to optimally utilize the ALU. + // Read data from global memory to registers firstly, then store them into + // shared memory, so it is instruction-Level parallelism for arithmetic + // operations and others handle IO operations between barrier api, makes ALU + // and load/store units work simultaneously, could improves the performance. + ${We()} { + let tileRow = i32(localId.y); + let tileCol = i32(localId.x); + let globalRow = i32(globalId.y); + let globalCol = i32(globalId.x); + let batch = i32(globalId.z); + + // uniforms.dimInner should be greater than 0. + let numTiles = (uniforms.dimInner - 1) / ${n} + 1; + var acc = 0.0; + + var globalColA = tileCol; + var globalRowB = 0; + var regA = mm_readA(batch, globalRow, globalColA); + var regB0 = mm_readB(batch, globalRowB + 2 * tileRow, globalCol); + var regB1 = mm_readB(batch, globalRowB + 2 * tileRow + 1, globalCol); + globalColA = globalColA + ${n}; + globalRowB = globalRowB + ${n}; + + for (var t = 0; t < numTiles; t = t + 1) { + mm_Asub[tileRow][tileCol] = regA; + mm_Bsub[2 * tileRow][tileCol] = regB0; + mm_Bsub[2 * tileRow + 1][tileCol] = regB1; + + workgroupBarrier(); + + regA = mm_readA(batch, globalRow, globalColA); + regB0 = mm_readB(batch, globalRowB + 2 * tileRow, globalCol); + regB1 = mm_readB(batch, globalRowB + 2 * tileRow + 1, globalCol); + globalColA = globalColA + ${n}; + globalRowB = globalRowB + ${n}; + + for (var k = 0; k < ${n}; k = k + 1) { + acc = acc + mm_Asub[tileRow][k] * mm_Bsub[k][tileCol]; + } + workgroupBarrier(); + } + + mm_write(batch, globalRow, globalCol, acc); + } + `}var $se=class{constructor(e,t,a,n=!1,r=!1,s=null,i=null,o=null){this.variableNames=["A","B"],this.uniforms="dimAOuter : i32, dimBOuter : i32, dimInner : i32,",this.workGroupSize=[16,8,1],this.outputShape=a,this.dispatchLayout={x:[2],y:[1],z:[0]},this.dispatch=[Math.ceil(a[2]/this.workGroupSize[0]),Math.ceil(a[1]/this.workGroupSize[1]),a[0]];let l=s!=null;l&&this.variableNames.push("bias");let u=o!=null;u&&this.variableNames.push("preluActivationWeights"),this.transposeA=n,this.transposeB=r,this.addBias=l,this.activation=i,this.hasPreluActivationWeights=u,this.batchAEqualOne=e[0]===1,this.batchBEqualOne=t[0]===1,this.shaderKey=`matMulSmallOutputSize_${this.activation}_${n}_${r}_${this.batchAEqualOne}_${this.batchBEqualOne}`}getUserCode(){return` + ${Cr(this.activation,this.hasPreluActivationWeights)} + ${V3(this.addBias,this.activation,this.batchAEqualOne,this.batchBEqualOne,this.transposeA,this.transposeB)} + ${Mse(this.workGroupSize)} + `}},_se=class{constructor(e,t,a,n,r=!1,s=!1){this.variableNames=["A","B"],this.uniforms="dimAOuter : i32, dimBOuter : i32, dimInner : i32,",this.workGroupSize=[8,8,1],this.atomic=!0,this.isVec4=!1,this.splitedDimInner=128,v.assert(e[0]===1,()=>"MatMulSplitKProgram only supports batch = 1."),this.outputShape=e,this.dispatchLayout={x:[2],y:[1],z:[0,3]},this.isVec4=(r&&this.outputShape[1]%4===0||!r&&t%4===0)&&this.outputShape[2]%4===0,this.elementsPerThread=[4,4,this.splitedDimInner],this.isVec4||(this.outputShape[1]<16&&(this.elementsPerThread[1]=1),this.outputShape[2]<16&&(this.elementsPerThread[0]=1)),this.dispatch=Me(this.dispatchLayout,[this.outputShape[0],this.outputShape[1],this.outputShape[2],t],this.workGroupSize,this.elementsPerThread),this.transposeA=r,this.transposeB=s,this.batchAEqualOne=a,this.batchBEqualOne=n,this.shaderKey=`matMulSplitK_${r}_${s}_${a}_${n}_${this.elementsPerThread}_${this.isVec4}`}getUserCode(){let e=a=>` + for (var i = 0; i < ${a}; i = i + 1) + { + var oldValue = atomicLoad(&(result[flatIndex + i])); + var exchanged = false; + for (; !exchanged;) { + let newValueF32 = bitcast(oldValue) + ${a>1?"value[i]":"value"}; + let newValue = bitcast(newValueF32); + let res = atomicCompareExchangeWeak(&(result[flatIndex + i]), oldValue, newValue); + oldValue = res.old_value; + exchanged = res.exchanged; + } + } + `,t=this.isVec4?4:1;return` + ${Vv(this.batchAEqualOne,this.batchBEqualOne,!1,this.transposeB,!1,!1,!1,t)} + fn mm_write(batch: i32, row : i32, colIn : i32, value : ${Rt(t)}) { + let col = colIn * ${t}; + if (row < uniforms.dimAOuter && col < uniforms.dimBOuter) { + let coords = vec3(batch, row, col); + let flatIndex = getOutputIndexFromCoords(coords); + // The problem is that we should initialize output to zero before using. + // Otherwise, the original value will be added to the result. + ${e(t)} + } + } + ${this.isVec4?jh(this.elementsPerThread,this.workGroupSize,this.transposeA,32,!0,this.splitedDimInner):Hh(this.elementsPerThread,this.workGroupSize,this.transposeA,32,!0,this.splitedDimInner)} + `}},Fse=class{constructor(e,t=null,a=null,n=null){this.uniforms="",this.variableNames=["x"],this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=e,this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize),this.addBias=t!=null,this.hasPreluActivationWeights=n!=null,this.activation=a,this.addBias&&this.variableNames.push("bias"),this.hasPreluActivationWeights&&this.variableNames.push("preluActivationWeights"),this.shaderKey=`biasActivation_${a}`}getUserCode(){return` + ${Cr(this.activation,this.hasPreluActivationWeights)} + ${We("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + var value = getXByOutputIndex(index); + ${mo(this.addBias,this.activation)} + setOutputAtIndex(index, value); + } + } + `}},Pse=class{constructor(e){this.variableNames=[],this.outputShape=[],this.uniforms="value : f32,",this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=e,this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey="fill"}getUserCode(){return` + ${We("index")} { + if (index < uniforms.size) { + setOutputAtIndex(index, uniforms.value); + } + } + `}};function go(e){let{backend:t,attrs:a}=e,{shape:n,value:r}=a,{dtype:s}=a;if(s=s||v.inferDtype(r),s==="string"){let i=v.getArrayFromDType(s,v.sizeFromShape(n));return i.fill(r),t.makeTensorInfo(n,s,i)}else{let i=new Pse(n),o=[{type:"float32",data:[r]}];return t.runWebGPUProgram(i,[],s,o)}}var Ose={kernelName:kl,backendName:"webgpu",kernelFunc:go};function Re(e){let{inputs:t,attrs:a}=e,{x:n}=t,{shape:r}=a,s=v.sizeFromShape(n.shape),i=v.inferFromImplicitShape(r,s),o=v.sizeFromShape(i);return v.assert(s===o,()=>`The new shape (${i}) has ${o} elements and the old shape (${n.shape}) has ${s} elements. The new shape and old shape must have the same number of elements.`),e.backend.incRef(n.dataId),{dataId:n.dataId,shape:i,dtype:n.dtype}}var Dse={kernelName:Fl,backendName:"webgpu",kernelFunc:Re};function G3({a:e,b:t,transposeA:a,transposeB:n,backend:r,bias:s=null,preluActivationWeights:i=null,leakyreluAlpha:o=0,activation:l=null}){let u=e.shape.length,d=t.shape.length,c=a?e.shape[u-2]:e.shape[u-1],p=n?t.shape[d-1]:t.shape[d-2],h=a?e.shape[u-1]:e.shape[u-2],f=n?t.shape[d-2]:t.shape[d-1],m=e.shape.slice(0,-2),g=t.shape.slice(0,-2),y=v.sizeFromShape(m),A=v.sizeFromShape(g),x=po.assertAndGetBroadcastShape(e.shape.slice(0,-2),t.shape.slice(0,-2)).concat([h,f]);v.assert(c===p,()=>`Error in matMul: inner shapes (${c}) and (${p}) of Tensors with shapes ${e.shape} and ${t.shape} and transposeA=${a} and transposeB=${n} must match.`);let b=a?[y,c,h]:[y,h,c],w=n?[A,f,p]:[A,p,f],S=Re({inputs:{x:e},backend:r,attrs:{shape:b}}),C=Re({inputs:{x:t},backend:r,attrs:{shape:w}}),N=[S,C],_=Math.max(y,A),$=y===1,M=A===1,I=[S,C],E=[{type:"int32",data:[h]},{type:"int32",data:[f]},{type:"int32",data:[c]}],O,L,B=[_,h,f],G=V().get("WEBGPU_MATMUL_PROGRAM_TYPE");switch(G<0&&(h*f<=128?G=Pn.MatMulReduceProgram:_===1&&h<=128&&f<=48&&p>=2e3?G=Pn.MatMulSplitKProgram:h<=16&&(f<=512||p>=2*f)||f<=16&&(h<=512||c>=2*h)?G=Pn.MatMulSmallOutputSizeProgram:G=Pn.MatMulPackedProgram),G){case Pn.MatMulReduceProgram:O=new Rse(B,$,M,a,n,s,l,i);break;case Pn.MatMulSplitKProgram:{if(L=go({backend:r,attrs:{shape:B,value:0,dtype:e.dtype}}),O=new _se(B,p,$,M,a,n),s||l){L=r.runWebGPUProgram(O,I,e.dtype,E,L);let H=new Fse(L.shape,s,l,i),W=null,Q=[L];s&&Q.push(s),i&&Q.push(i),l==="leakyrelu"&&(W=[{type:"float32",data:[o]}],H.uniforms+=" alpha : f32,");let Z=r.runWebGPUProgram(H,Q,L.dtype,W);N.push(L);let re=Re({inputs:{x:Z},backend:r,attrs:{shape:x}});N.push(Z);for(let ee of N)r.disposeData(ee.dataId);return re}break}case Pn.MatMulSmallOutputSizeProgram:O=new $se(b,w,B,a,n,s,l,i);break;case Pn.MatMulPackedProgram:let U=r.adapterInfo.isIntel();O=new Nse(b,B,$,M,a,n,s,l,i,U);break;default:throw new Error(`Unsupported MatMulProgramType ${G}.`)}s&&I.push(s),i&&I.push(i),l==="leakyrelu"&&(E.push({type:"float32",data:[o]}),O.uniforms+=" alpha : f32,"),L=r.runWebGPUProgram(O,I,e.dtype,E,L);let j=Re({inputs:{x:L},backend:r,attrs:{shape:x}});N.push(L);for(let U of N)r.disposeData(U.dataId);return j}function zse(e){let{inputs:t,backend:a,attrs:n}=e,{a:r,b:s,bias:i,preluActivationWeights:o}=t,{transposeA:l,transposeB:u,activation:d,leakyreluAlpha:c}=n;return G3({a:r,b:s,transposeA:l,transposeB:u,backend:a,bias:i,preluActivationWeights:o,leakyreluAlpha:c,activation:d})}var Lse={kernelName:Ur,backendName:"webgpu",kernelFunc:zse},Qy=class{constructor(e,t,a){this.variableNames=["AReal","AImag","BReal","BImag"],this.workGroupSize=[128,1,1],this.size=!0,this.outputShape=T.assertAndGetBroadcastShape(t,a),this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey=`binaryOpComplex_${e}`,this.op=e}getUserCode(){return` + fn binaryOpComplex( + areal : f32, aimag : f32, breal : f32, bimag : f32) -> f32 { + ${W3(this.op,!1)} + } + + ${We("index")} { + if(index < uniforms.size) { + let areal = getARealByOutputIndex(index); + let aimag = getAImagByOutputIndex(index); + let breal = getBRealByOutputIndex(index); + let bimag = getBImagByOutputIndex(index); + setOutputAtIndex(index, binaryOpComplex(areal, aimag, breal, bimag)); + } + } + `}},_1=class{constructor(e,t,a){this.size=!0,this.variableNames=["A","B"],this.outputShape=T.assertAndGetBroadcastShape(t,a),this.dispatchLayout=Ye(this.outputShape),this.op=e,this.useSharedMemoryWithA=t.length<=1&&a.length>1&&t[0]<128,this.useSharedMemoryWithB=a.length<=1&&t.length>1&&a[0]<128,this.useSharedMemoryWithA||this.useSharedMemoryWithB?(this.isVec4=!1,this.lastDimensionSize=this.useSharedMemoryWithB?a[0]:t[0],this.shaderKey=`binary_${this.type}_${e}_${this.lastDimensionSize}_${this.useSharedMemoryWithB}`,this.type="shared",this.workGroupSize=[256,1,1],this.workPerThread=1):(v.arraysEqual(t,a)&&v.sizeFromShape(t)%4===0?(this.isVec4=!0,this.type="vec4",this.workPerThread=4):(this.isVec4=!1,this.type="plain",this.workPerThread=1),this.shaderKey=`binary_${this.type}_${e}`,this.workGroupSize=[128,1,1]),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize,[this.workPerThread,1,1])}getUserCode(){let e,t=this.isVec4?"vec4":"f32",a=` + fn binaryOperation(a : ${t}, b : ${t}) -> ${t} { + ${W3(this.op,this.isVec4)} + }; + `;if(this.type==="shared"){let n=this.lastDimensionSize>1?`coords[${this.outputShape.length-1}]`:"0",r=this.useSharedMemoryWithB?`let a = getAByOutputIndex(index); + let b = sharedBuf[${n}];`:`let a = sharedBuf[${n}]; + let b = getBByOutputIndex(index);`;e=` + ${a} + var sharedBuf : array; + ${We("index")} { + // Fill in the shared memory buffer. + let localIndex = i32(localId.x); + if(localIndex < ${this.lastDimensionSize}) { + sharedBuf[localIndex] = f32(${this.useSharedMemoryWithB?"B":"A"}[localIndex]); + } + workgroupBarrier(); + + if(index < uniforms.size) { + let coords = getCoordsFromIndex(index); + ${r} + setOutputAtIndex(index, binaryOperation(a, b)); + } + } + `}else e=` + ${a} + ${We("index")} { + if (index < uniforms.size) { + let a = getAByOutputIndex(index); + let b = getBByOutputIndex(index); + setOutputAtIndex(index, binaryOperation(a, b)); + } + } + `;return e}};function cn(e){let{inputs:t}=e,{x:a}=t;return e.backend.incRef(a.dataId),{dataId:a.dataId,shape:a.shape,dtype:a.dtype}}var Bse={kernelName:Fi,backendName:"webgpu",kernelFunc:cn};function ou(e){let{inputs:t,backend:a}=e,{real:n,imag:r}=t,s=a.makeTensorInfo(n.shape,"complex64"),i=a.tensorMap.get(s.dataId),o=cn({inputs:{x:n},backend:a}),l=cn({inputs:{x:r},backend:a});return i.complexTensorInfos={real:o,imag:l},s}var Wse={kernelName:Id,backendName:"webgpu",kernelFunc:ou},mp=class{constructor(e,t){this.variableNames=["A"],this.size=!0;let a=128;this.workGroupSize=[a,1,1],this.outputShape=e,this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize),this.op=t,this.shaderKey=`unary_${t}`}getUserCode(){return` + fn unaryOperation(a : f32) -> f32 { + ${qs(this.op,!1)} + } + ${We("index")} { + if (index < uniforms.size) { + let a = getAByOutputIndex(index); + setOutputAtIndex(index, unaryOperation(a)); + } + } + `}};function Ht({opType:e,cpuKernelImpl:t,dtype:a}){return({inputs:n,backend:r})=>{let{x:s}=n,i=r,o=a||s.dtype;if(i.shouldExecuteOnCPU([s])&&t!=null){let u=i.tensorMap.get(s.dataId),d=t(u.values,o);return i.makeTensorInfo(s.shape,o,d)}let l=new mp(s.shape,e);return i.runWebGPUProgram(l,[s],o)}}function ca({opType:e,cpuKernelImpl:t,supportsComplex:a=!1,dtype:n}){return({inputs:r,backend:s})=>{let{a:i,b:o}=r,l=s;if(a&&i.dtype==="complex64"){let c=l.tensorMap.get(i.dataId),p=l.tensorMap.get(o.dataId),h,f;if(e!==Be.MUL)[h,f]=[[c.complexTensorInfos.real,p.complexTensorInfos.real],[c.complexTensorInfos.imag,p.complexTensorInfos.imag]].map(g=>{let[y,A]=g,x={dataId:y.dataId,dtype:y.dtype,shape:i.shape},b={dataId:A.dataId,dtype:A.dtype,shape:o.shape},w=new _1(e,i.shape,o.shape);return l.runWebGPUProgram(w,[x,b],ra(y.dtype,A.dtype))});else{let g=new Qy(Be.COMPLEX_MULTIPLY_REAL,i.shape,o.shape),y=new Qy(Be.COMPLEX_MULTIPLY_IMAG,i.shape,o.shape),A=[{dataId:c.complexTensorInfos.real.dataId,dtype:c.complexTensorInfos.real.dtype,shape:i.shape},{dataId:c.complexTensorInfos.imag.dataId,dtype:c.complexTensorInfos.imag.dtype,shape:i.shape},{dataId:p.complexTensorInfos.real.dataId,dtype:p.complexTensorInfos.real.dtype,shape:o.shape},{dataId:p.complexTensorInfos.imag.dataId,dtype:p.complexTensorInfos.imag.dtype,shape:o.shape}];h=l.runWebGPUProgram(g,A,"float32"),f=l.runWebGPUProgram(y,A,"float32")}let m=ou({inputs:{real:h,imag:f},backend:l});return l.disposeData(h.dataId),l.disposeData(f.dataId),m}let u=n||ra(i.dtype,o.dtype);if((i.dtype==="string"||o.dtype==="string"||l.shouldExecuteOnCPU([i,o]))&&t!=null){let c=l.tensorMap.get(i.dataId).values,p=l.tensorMap.get(o.dataId).values,h=i.dtype==="string"?T.fromUint8ToStringArray(c):c,f=i.dtype==="string"?T.fromUint8ToStringArray(p):p,[m,g]=t(i.shape,o.shape,h,f,u);return l.makeTensorInfo(g,u,m)}let d=new _1(e,i.shape,o.shape);return l.runWebGPUProgram(d,[i,o],u)}}var Gv={};He(Gv,{addImpl:()=>jv,bincountImpl:()=>jse,bincountReduceImpl:()=>Hse,castImpl:()=>Uv,ceilImpl:()=>qv,concatImpl:()=>qse,equalImpl:()=>Xv,expImpl:()=>Kv,expm1Impl:()=>Zv,floorImpl:()=>Yv,gatherNdImpl:()=>Xse,gatherV2Impl:()=>Kse,greaterEqualImpl:()=>Qv,greaterImpl:()=>Jv,lessEqualImpl:()=>t9,lessImpl:()=>e9,linSpaceImpl:()=>Zse,logImpl:()=>a9,maxImpl:()=>Yse,maximumImpl:()=>n9,minimumImpl:()=>r9,multiplyImpl:()=>q3,negImpl:()=>Qse,notEqualImpl:()=>s9,prodImpl:()=>tie,raggedGatherImpl:()=>lie,raggedTensorToTensorImpl:()=>uie,rangeImpl:()=>die,rsqrtImpl:()=>i9,scatterImpl:()=>pie,sigmoidImpl:()=>cie,simpleAbsImpl:()=>Vse,sliceImpl:()=>hie,sparseFillEmptyRowsImpl:()=>fie,sparseReshapeImpl:()=>mie,sparseSegmentReductionImpl:()=>gie,sqrtImpl:()=>yie,squaredDifferenceImpl:()=>o9,stridedSliceImpl:()=>Aie,stringNGramsImpl:()=>bie,stringSplitImpl:()=>wie,stringToHashBucketFastImpl:()=>kie,subImpl:()=>l9,tileImpl:()=>Sie,topKImpl:()=>Tie,transposeImpl:()=>eie,uniqueImpl:()=>Cie});function U3(e,t){Array.isArray(e)||(e=[e]),e.forEach(a=>{a!=null&&v.assert(a.dtype!=="complex64",()=>`${t} does not support complex64 tensors in the CPU backend.`)})}function Vse(e){let t=new Float32Array(e.length);for(let a=0;a{let i=T.assertAndGetBroadcastShape(t,a),o=i.length,l=v.computeStrides(i),u=v.sizeFromShape(i),d=v.getTypedArrayFromDType(s,u),c=t.length,p=a.length,h=v.computeStrides(t),f=v.computeStrides(a),m=T.getBroadcastDims(t,i),g=T.getBroadcastDims(a,i);if(m.length+g.length===0)for(let y=0;yx[C]=0);let b=v.locToIndex(x,c,h),w=A.slice(-p);g.forEach(C=>w[C]=0);let S=v.locToIndex(w,p,f);d[y]=e(n[b],r[S])}return[d,i]}}function j3(e){let{inputs:t,backend:a}=e,{real:n,imag:r}=t,s=a.data.get(n.dataId).values,i=a.data.get(r.dataId).values,o=a.makeTensorInfo(n.shape,"complex64"),l=a.data.get(o.dataId);return l.complexTensorInfos={real:a.makeTensorInfo(n.shape,"float32",s),imag:a.makeTensorInfo(r.shape,"float32",i)},o}function F1(e,t,a="float32"){if(a==="complex64"){let r=F1(e,t,"float32"),s=F1(e,t,"float32");return j3({inputs:{real:r,imag:s},backend:e})}let n=v.makeZerosTypedArray(v.sizeFromShape(t),a);return e.makeTensorInfo(t,a,n)}function eA(e){let{inputs:t,backend:a}=e,{x:n}=t;return a.incRef(n.dataId),{dataId:n.dataId,shape:n.shape,dtype:n.dtype}}function Gse(e){let{inputs:t,backend:a}=e,{input:n}=t,r=a.data.get(n.dataId).complexTensorInfos.real,s=a.data.get(r.dataId).values;return a.makeTensorInfo(r.shape,r.dtype,s)}function Uv(e,t,a,n){if(n==="int32"){let r=Int32Array.from(e);return[t,"int32",r]}if(n==="bool"){let r=v.toTypedArray([0],a),[s,i]=fn((o,l)=>o!==l?1:0)(t,[],e,r,"bool");return[i,"bool",s]}throw new Error(`Error in Cast: failed to cast ${a} to ${n}`)}function Lc(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{dtype:s}=n;if(s==="complex64"){if(r.dtype==="complex64")return eA({inputs:{x:r},backend:a});let d=F1(a,r.shape,r.dtype),c=Lc({inputs:{x:r},backend:a,attrs:{dtype:"float32"}}),p=j3({inputs:{real:c,imag:d},backend:a});return a.disposeIntermediateTensorInfo(d),a.disposeIntermediateTensorInfo(c),p}if(r.dtype==="complex64"){let d=Gse({inputs:{input:r},backend:a}),c=Lc({inputs:{x:d},backend:a,attrs:{dtype:s}});return a.disposeIntermediateTensorInfo(d),c}if(!v.hasEncodingLoss(r.dtype,s)){let d=eA({inputs:{x:r},backend:a});return{dataId:d.dataId,shape:d.shape,dtype:s}}let i=a.data.get(r.dataId).values,[o,l,u]=Uv(i,r.shape,r.dtype,s);return a.makeTensorInfo(o,l,u)}function Nn(e,t,a,n){return a==null?({inputs:r,backend:s})=>{let{a:i,b:o}=r,l=s;U3([i,o],e);let u=l.data.get(i.dataId).values,d=l.data.get(o.dataId).values,c=i.dtype==="string"?T.fromUint8ToStringArray(u):u,p=i.dtype==="string"?T.fromUint8ToStringArray(d):d,h=n||i.dtype,[f,m]=t(i.shape,o.shape,c,p,h);return l.makeTensorInfo(m,h,f)}:({inputs:r,backend:s})=>{let{a:i,b:o}=r,l=s;if(i.dtype==="complex64"||o.dtype==="complex64"){let u=Lc({inputs:{x:i},backend:l,attrs:{dtype:"complex64"}}),d=l.data.get(u.dataId),c=d.complexTensorInfos.real,p=d.complexTensorInfos.imag,h=l.data.get(c.dataId).values,f=l.data.get(p.dataId).values,m=Lc({inputs:{x:o},backend:l,attrs:{dtype:"complex64"}}),g=l.data.get(m.dataId),y=g.complexTensorInfos.real,A=g.complexTensorInfos.imag,x=l.data.get(y.dataId).values,b=l.data.get(A.dataId).values,[w,S,C]=a(i.shape,o.shape,h,f,x,b),N=l.makeTensorInfo(C,"float32",w),_=l.makeTensorInfo(C,"float32",S),$=j3({inputs:{real:N,imag:_},backend:l});return l.disposeIntermediateTensorInfo(u),l.disposeIntermediateTensorInfo(m),l.disposeIntermediateTensorInfo(N),l.disposeIntermediateTensorInfo(_),$}else{let u=l.data.get(i.dataId).values,d=l.data.get(o.dataId).values,c=n||i.dtype,[p,h]=t(i.shape,o.shape,u,d,c);return l.makeTensorInfo(h,c,p)}}}function H3(e){return(t,a,n,r,s,i)=>{let o=T.assertAndGetBroadcastShape(t,a),l=v.sizeFromShape(o),u=o.length,d=v.computeStrides(o),c=v.getTypedArrayFromDType("float32",l),p=v.getTypedArrayFromDType("float32",l),h=T.getBroadcastDims(t,o),f=T.getBroadcastDims(a,o),m=T.mergeRealAndImagArrays(n,r),g=T.mergeRealAndImagArrays(s,i),y=t.length,A=v.computeStrides(t),x=a.length,b=v.computeStrides(a);if(h.length+f.length===0)for(let w=0;wC[I]=0);let N=v.locToIndex(C,y,A),_=S.slice(-x);f.forEach(I=>_[I]=0);let $=v.locToIndex(_,x,b),M=e(m[N*2],m[N*2+1],g[$*2],g[$*2+1]);c[w]=M.real,p[w]=M.imag}return[c,p,o]}}var jv=fn((e,t)=>e+t),Use=H3((e,t,a,n)=>({real:e+a,imag:t+n})),E0e=Nn(vr,jv,Use);function jse(e,t,a,n,r){let s=v.sizeFromShape(n),i=v.makeZerosTypedArray(r,a);for(let o=0;o=r||(s>0?i[l]+=t[o]:i[l]+=1)}return i}function Hse(e,t,a,n=!1){let r=e.shape[0],s=e.shape[1],i=ve([r,a],t.dtype);for(let o=0;o=a||(n?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 Ss(e){return(t,a,n)=>{let r=v.getTypedArrayFromDType(a,t.length);for(let s=0;s{let{x:i}=n;if(U3(i,e),i.dtype==="string"||a==="string")throw new Error("unaryKernelFunc does not support string input/output");let o=s,l=o.data.get(i.dataId).values,u=v.sizeFromShape(i.shape),d=a||i.dtype,c=v.getArrayFromDType(d,u);for(let p=0;p{let{x:i}=n;if(U3(i,e),i.dtype==="string"||a==="string")throw new Error("unaryKernelFunc does not support string input/output");let o=s,l=o.data.get(i.dataId).values,u=a||i.dtype,d=t(l,u,r);return o.makeTensorInfo(i.shape,u,d)}}var qv=Ss(e=>Math.ceil(e)),R0e=lu(Qr,qv);function qse(e,t,a,n){let r=v.getArrayFromDType(a,v.sizeFromShape(t));if(n&&a!=="string"){let s=0;e.forEach(i=>{let o=v.sizeFromShape(i.shape);r.set(i.vals,s),s+=o})}else{let s=0;e.forEach(i=>{let o=a==="string"?T.fromUint8ToStringArray(i.vals):i.vals,l=0;for(let u=0;ue===t?1:0),M0e=Nn(ts,Xv,null,"bool"),Kv=Ss(e=>Math.exp(e)),$0e=lu(as,Kv,"float32"),Zv=Ss(e=>Math.expm1(e)),_0e=lu(Ei,Zv),Yv=Ss(e=>Math.floor(e)),F0e=lu(ns,Yv);function Xse(e,t,a,n,r,s,i,o,l){let u=ve([n,s],a);for(let d=0;d=l/s)throw new Error(`Invalid indices: ${c} does not index into ${o}`);for(let h=0;he>t?1:0),P0e=Nn(rs,Jv,null,"bool"),Qv=fn((e,t)=>e>=t?1:0),O0e=Nn(ss,Qv,null,"bool"),e9=fn((e,t)=>ee<=t?1:0),z0e=Nn(os,t9,null,"bool");function Zse(e,t,a){let n=(t-e)/(a-1),r=v.makeZerosTypedArray(a,"float32");r[0]=e;for(let s=1;sMath.log(e)),L0e=lu(ls,a9);function Yse(e,t,a,n){let r=v.getTypedArrayFromDType(n,v.sizeFromShape(a));for(let s=0;so)&&(o=u)}r[s]=o}return r}var n9=fn((e,t)=>Math.max(e,t)),B0e=Nn(us,n9),r9=fn((e,t)=>Math.min(e,t)),W0e=Nn(ds,r9),q3=fn((e,t)=>e*t),Jse=H3((e,t,a,n)=>({real:e*a-t*n,imag:e*n+t*a})),V0e=Nn(ps,q3,Jse);function Qse(e,t,a){let n=v.createScalarValue(-1,a);return q3([],t,n,e,a)}var s9=fn((e,t)=>e!==t?1:0),G0e=Nn(cs,s9,null,"bool");function eie(e,t,a,n,r){let s=t.length,i=v.sizeFromShape(t),o=v.computeStrides(t),l=v.computeStrides(r),u=v.getTypedArrayFromDType(a,v.sizeFromShape(r));for(let d=0;d{if(n<0||n>=a){let s=v.indexToLoc(r,t.length,v.computeStrides(t)).join(",");throw new Error(`indices[${s}] = ${n} is not in [0, ${a})`)}})}function nie(e,t){for(let a=0;ar)throw new Error("Ragged splits must not point past values");for(let s=1;sn[s])throw new Error("Ragged splits must be sorted in ascending order")}}function rie(e,t,a,n){let r=[],s=0,i=t.length-1+a.length,o=new Array(i).fill(null).map(()=>[0]);nie(a,n);let l=1;for(let u=0;u=0){let m=o[f],g=m[m.length-1]-h[d];for(let y=d;yr[i]=s)}return t}function tA(e,t){let a=e.slice(0,t);for(;a.lengtha&&(a=r)}return a}static getMaxWidthValueRowID(e){let t=e.length;if(t===0)return 0;let a=0,n=e[0],r=0;for(let s=1;s"Final length of result must be equal to firstDimension."),r}calculateOutputIndexRowSplit(e,t,a,n){let r=e.length,s=[];for(let i=0;i0&&s.length!==e[r-1])throw new Error("Invalid row split size.");return s}calculateOutputIndexValueRowID(e,t,a,n){let r=e.length,s=[];if(r===0)return[];let i=0,o=e[0];if(o>=t.length)throw new Error(`Got currentValueRowId=${o}, which is not less than ${t.length}`);let l=t[o];s.push(l);for(let u=1;u=0&&(++i,i=t.length)throw new Error(`Got nextValueRowId=${d} which is not less than ${t.length}`);l=t[d]}s.push(l)}if(s.length!==e.length)throw new Error("Invalid row ids.");return s}calculateOutputIndex(e,t,a,n){let r=this.getRowPartitionTensor(e),s=this.getRowPartitionTypeByDimension(e);switch(s){case vn.VALUE_ROWIDS:return this.calculateOutputIndexValueRowID(r,t,a,n);case vn.ROW_SPLITS:if(r.length-1>t.length)throw new Error(`Row partition size is greater than output size: ${r.length-1} > ${t.length}`);return this.calculateOutputIndexRowSplit(r,t,a,n);default:throw new Error(`Unsupported partition type: ${vn[s]}`)}}getFirstDimensionSize(){let e=this.rowPartitionValues[0];if(this.rowPartitionTypes.length===0)throw new Error("No row_partition_types given.");let t=this.rowPartitionTypes[0];switch(t){case vn.FIRST_DIM_SIZE:return e[0];case vn.VALUE_ROWIDS:throw new Error("Cannot handle VALUE_ROWIDS in first dimension.");case vn.ROW_SPLITS:return this.rowPartitionValuesShapes[0][0]-1;default:throw new Error(`Cannot handle type ${vn[t]}`)}}compute(){if(this.rowPartitionValues[0].length<=0)throw new Error("Invalid first partition input. Tensor requires at least one element.");let e=this.getFirstDimensionSize(),t=this.calculateOutputSize(e),a=new Array(this.raggedRank+1);a[a.length-1]=1;for(let s=a.length-2;s>=0;--s)a[s]=a[s+1]*t[s+1];let n=nA(t,!1),r=v.getArrayFromDType(this.valuesDType,v.sizeFromShape(n));if(a[0]*t[0]>0){let s=this.calculateFirstParentOutputIndex(e,a[0],t[0]);for(let i=1;i<=this.raggedRank;++i)s=this.calculateOutputIndex(i-1,s,a[i],t[i]);this.setOutput(this.raggedRank,s,r,n)}return[n,r]}setOutput(e,t,a,n){if(a.length===0)return;let r=this.values,s=a,i=n.slice();i=i.slice(e+1);let o=v.sizeFromShape(i),l=t.length,u=this.defaultValue;if(u.length!==o&&u.length!==1){let h=this.defaultValueShape;Ee(()=>{let f=J(u,h);u=ei(f,i).dataSync()})}let d=0,c=0,p=0;for(let h=0;h<=l;++h){let f=h=l){let m=a.length;f=Math.floor(m/o)}if(f>p)if(this.defaultValue.length===1)s.subarray(p*o,f*o).fill(this.defaultValue[0]),p=f;else for(;f>p;){let m=s.slice(p*o);aA(m,u,o),++p}f<0?(d=h+1,c=p):(d=h,c=p,p=c+1)}}};function aA(e,t,a){for(let n=0;n= 0`);if(n<-1)throw new Error(`Dimension ${n} must be >= -1`);n=-1}a.push(n)}return a}function uie(e,t,a,n,r,s,i,o,l,u){return new P1(e,t,a,n,r,s,i,o,l,u).compute()}function die(e,t,a,n){let r=e===t,s=e1;if(r||s||i)return v.makeZerosTypedArray(0,n);let o=Math.abs(Math.ceil((t-e)/a)),l=v.makeZerosTypedArray(o,n);t1/Math.sqrt(e)),U0e=lu(hs,i9);function pie(e,t,a,n,r,s,i,o,l,u){let d=[n/r,r],c=e.values,p=t.values;if(n===0)return ve(a,t.dtype);let h=ve(d,t.dtype);typeof l=="string"||typeof l=="number"?h.values.fill(l):typeof l=="boolean"&&h.values.fill(+l);for(let f=0;f=n/r)throw new Error(`Invalid indices: ${m} does not index into ${a}`);for(let y=0;y1/(1+Math.exp(-e))),j0e=Hv(fs,e=>1/(1+Math.exp(-e)));function hie(e,t,a,n,r){let s=At.isSliceContinous(n,t,a),i=v.sizeFromShape(a),o=v.computeStrides(n);if(s){let c=At.computeFlatOffset(t,o);return r==="string"?e.slice(c,c+i):e.subarray(c,c+i)}let l=r==="string"?T.fromUint8ToStringArray(e):e,u=ve(n,r,l),d=ve(a,r);for(let c=0;cf+t[m]);d.set(u.get(...h),...p)}return r==="string"?T.fromStringArrayToUint8(d.values):d.values}function fie(e,t,a,n,r,s,i){let o=t[0],l=s[0],u=new Array(l),d=new Array(o),c=t[1];if(l===0){if(o!==0)throw new Error(T.getSparseFillEmptyRowsIndicesDenseShapeMismatch(o));let g=v.getArrayFromDType(a,0),y=v.getArrayFromDType(r,0);return[g,[0,c],y,u,d]}let p=!0,h=0,f=new Array(l).fill(0);for(let g=0;g=l)throw new Error(T.getSparseFillEmptyRowsOutOfRangeIndexErrorMessage(g,y,l));++f[y],p=p&&y>=h,h=y}let m=!0;for(let g=0;g0&&(f[g]+=f[g-1])}if(m&&p){let g=e,y=n;for(let A=0;A0){p[c-1]=1;for(let m=c-2;m>=0;--m)p[m]=p[m+1]*n[m+1]}let h=[];if(o>0){h[o-1]=1;for(let m=o-2;m>=0;--m)h[m]=h[m+1]*l[m+1]}let f=v.getArrayFromDType(a,i*o);for(let m=0;m0?r[o-1]+1:0;if(d<0)throw new Error(T.getSparseSegmentReductionNegativeSegmentIdsErrorMessage());let c=t.slice();c[0]=d;let p=c.reduce((A,x)=>A*x,1),h=v.getArrayFromDType(a,p);if(o===0)return d>0&&h.fill(i),[h,c];if(d<=0)throw new Error(T.getSparseSegmentReductionNegativeSegmentIdsErrorMessage());let f=0,m=1,g=0,y=r[f];for(;;){let A=0;if(m=A)throw new Error(T.getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage())}if(y<0||y>=d)throw new Error(T.getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage(y,d));y>g&&h.fill(i,g*u,y*u);for(let x=f;x=l[0])throw new Error(T.getSparseSegmentReductionIndicesOutOfRangeErrorMessage(x,n[x],l[0]));for(let w=0;wo)break}return gMath.sqrt(e)),H0e=Hv(ms,e=>Math.sqrt(e)),o9=fn((e,t)=>{let a=e-t;return a*a}),q0e=Nn(gs,o9);function Aie(e,t,a,n){let r=ve(e,t.dtype);for(let s=0;s0?0:i-o),p=0;p+=l*this.leftPad.length;for(let y=0;yy.forEach(A=>f[m++]=A);for(let y=0;y0){g(e[c+d-1]);for(let y=0;y0){let o=t[0];if(o!==0)throw new Error(`First split value must be 0, got ${o}`);for(let l=1;l=o;if(u=u&&t[l]<=a,!u)throw new Error(`Invalid split value ${t[l]}, must be in [${o}, ${a}]`);o=t[l]}if(o!==a)throw new Error(`Last split value must be data size. Expected ${a}, got ${o}`)}let r=n-1,s=v.getArrayFromDType("int32",n);if(a===0||n===0){let o=new Array(a);for(let l=0;l<=r;++l)s[l]=0;return[o,s]}s[0]=0;for(let o=1;o<=r;++o){let l=t[o]-t[o-1],u=0;this.nGramWidths.forEach(d=>{u+=this.getNumNGrams(l,d)}),this.preserveShort&&l>0&&u===0&&(u=1),s[o]=s[o-1]+u}let i=new Array(s[r]);for(let o=0;o{let c=t[o+1]-t[o],p=this.getNumNGrams(c,d);this.createNGrams(e,l,i,u,p,d),u+=p}),this.preserveShort&&u===s[o]){let d=t[o+1]-t[o];if(d===0)continue;let c=d+2*this.padWidth,p=1;this.createNGrams(e,l,i,u,p,c)}}return[i,s]}};function bie(e,t,a,n,r,s,i,o){return new xie(a,n,r,s,i,o).compute(e,t)}function vie(e,t,a,n){if(!e.length)return;if(t.length===0){for(let s=0;se-t),Iie=H3((e,t,a,n)=>({real:e-a,imag:t-n})),X0e=Nn(ys,l9,Iie);function Sie(e,t){let a=new Array(e.rank);for(let r=0;r{let a=t.value-e.value;return a===0?e.index-t.index:a};function u9(e,t,a=0,n=e.length-1){for(;n>a;){if(n-a>600){let o=n-a+1,l=t-a+1,u=Math.log(o),d=.5*Math.exp(2*u/3),c=.5*Math.sqrt(u*d*(o-d)/o)*Math.sign(l-o/2),p=Math.max(a,Math.floor(t-l*d/o+c)),h=Math.min(n,Math.floor(t+(o-l)*d/o+c));u9(e,t,p,h)}let r=e[t],s=a,i=n;for(v.swap(e,a,t),Uu(e[n],r)>0&&v.swap(e,a,n);s0;)i=i-1}Uu(e[a],r)===0?v.swap(e,a,i):(i=i+1,v.swap(e,i,n)),i<=t&&(a=i+1),t<=i&&(n=i-1)}}function Tie(e,t,a,n,r){let s=t[t.length-1],[i,o]=[e.length/s,s],l=v.getTypedArrayFromDType(a,i*n),u=v.getTypedArrayFromDType("int32",i*n);for(let c=0;cf[x]={value:A,index:x}),n{for(let g=0;g`T${a}`),this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize,[this.workPerThread,1,1]),this.shaderKey="addN"}getUserCode(){let e=[];this.variableNames.forEach(a=>{e.push(`let v${a} = get${a}ByOutputCoords(coords);`)});let t=this.variableNames.map(a=>`v${a}`).join(" + ");return` + ${We("index")} { + for (var i = 0; i < ${this.workPerThread}; i = i + 1) { + let flatIndex = index * ${this.workPerThread} + i; + if (flatIndex < uniforms.size) { + let coords = getCoordsFromIndex(flatIndex); + ${e.join(` + `)} + setOutputAtIndex(flatIndex, ${t}); + } + } + } + `}};function coe(e){let{inputs:t,backend:a}=e,n=t;if(n.length===1)return cn({inputs:{x:n[0]},backend:a});let r=n.map(o=>o.dtype).reduce((o,l)=>ra(o,l)),s=n.map(o=>o.shape),i=new poe(s);return a.runWebGPUProgram(i,n,r)}var hoe={kernelName:hi,backendName:"webgpu",kernelFunc:coe},d9=class{constructor(e,t,a){this.workGroupSize=[64,1,1],this.variableNames=["x"],this.uniforms="infinityValue : f32,",this.size=!0;let n=[t];this.op=a==="min"?"<":">";let[r,s]=T.computeOutAndReduceShapes(e,n);this.outputShape=r.length===0?[1]:r,this.dispatchLayout=Ye(this.outputShape),v.sizeFromShape(s)<32||v.sizeFromShape(r)>1e3?(this.type="plain",this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize)):(this.type="shared",this.dispatch=Me(this.dispatchLayout,this.outputShape,[1,1,1])),this.inputShape=e,this.shaderKey=`argMinMax_${this.op}_${this.type}`}getUserCode(){let e=()=>this.inputShape.length===1?"uniforms.xShape":`uniforms.xShape.${Ar(this.inputShape.length-1)}`,t=()=>{let a="";if(this.outputShape.length===1)this.inputShape.length!==1&&(a+="outputCoords,");else for(let n=0;n u32 { + return ((a - 1u) / b + 1u); + } + + ${` + var xBestIndices : array; + var xBestValues : array; + `} + + ${We("index")} { + let outputIndex = index / i32(workGroupSizeX); + let reduceLength = ${e()}; + + var bestIndex = i32(localId.x); + var bestValue = uniforms.infinityValue; + let outputCoords = getCoordsFromIndex(outputIndex); + for (var k = i32(localId.x); k < reduceLength && outputIndex < uniforms.size; + k = k + i32(workGroupSizeX)) { + let candidate = getX(${t()} k); + if (!isnan(candidate) && candidate ${this.op} bestValue) { + bestValue = candidate; + bestIndex = k; + } + } + xBestValues[localId.x] = bestValue; + xBestIndices[localId.x] = bestIndex; + workgroupBarrier(); + + var reduceSize = min(u32(reduceLength), workGroupSizeX); + for (var currentSize = reduceSize / 2u; reduceSize > 1u; + currentSize = reduceSize / 2u) { + let interval = DIV_CEIL(reduceSize, 2u); + if (localId.x < currentSize) { + let candidate = xBestValues[localId.x + interval]; + if (candidate ${this.op} bestValue) { + bestValue = candidate; + xBestValues[localId.x] = bestValue; + xBestIndices[localId.x] = xBestIndices[localId.x + interval]; + } + } + reduceSize = interval; + workgroupBarrier(); + } + + if (localId.x == 0u && outputIndex < uniforms.size) { + setOutputAtIndexI32(outputIndex, xBestIndices[localId.x]); + } + } + `:` + ${We("index")} { + if (index < uniforms.size) { + let outputCoords = getCoordsFromIndex(index); + var bestIndex = 0; + var bestValue = getX(${t()} 0); + let reduceLength = ${e()}; + for (var i = 1; i < reduceLength; i++) { + let candidate = getX(${t()} i); + if (candidate ${this.op} bestValue) { + bestValue = candidate; + bestIndex = i; + } + } + setOutputAtIndexI32(index, bestIndex); + } + } + `}},foe=class{constructor(e,t){this.variableNames=["A"],this.workGroupSize=[16,16,1];let a=new Array(e.length);for(let n=0;n tile : array, ${this.workGroupSize[0]}>; + ${hd()} + fn _start(@builtin(local_invocation_id) localId : vec3, + @builtin(workgroup_id) workgroupId : vec3) { + var x = i32(workgroupId.x) * TILE_DIM + i32(localId.x); + var y = i32(workgroupId.y) * TILE_DIM + i32(localId.y); + let width = uniforms.outShape[0]; + let height = uniforms.outShape[1]; + if (x < width && y < height) { + tile[localId.y][localId.x] = A[y * width + x]; + } + workgroupBarrier(); + + x = i32(workgroupId.y) * TILE_DIM + i32(localId.x); + y = i32(workgroupId.x) * TILE_DIM + i32(localId.y); + if (x < height && y < width) { + setOutputAtIndex((y * height + x), tile[localId.x] + [localId.y]); + } + } + `}},moe=class{constructor(e,t){this.variableNames=["A"],this.workPerThread=1,this.workGroupSize=[64,1,1],this.size=!0;let a=new Array(e.length);for(let n=0;n6)throw Error(`Transpose for rank ${t} is not yet supported`);let a=new Array(t);for(let n=0;na.disposeData(h.dataId)),p}var xoe={kernelName:fi,backendName:"webgpu",kernelFunc:Aoe};function boe(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{axis:s}=n,i=v.parseAxisParam(s,r.shape),o=T.getAxesPermutation(i,r.shape.length),l=r,u=[];o!=null&&(l=br({inputs:{x:r},backend:a,attrs:{perm:o}}),u.push(l),i=T.getInnerMostAxes(i.length,l.shape.length)),T.assertAxesAreInnerMostDims("argMin",[i[0]],l.shape.length);let d=new d9(l.shape,i[0],"min"),c=[{type:"float32",data:[Number.POSITIVE_INFINITY]}],p=a.runWebGPUProgram(d,[l],"int32",c);return u.forEach(h=>a.disposeData(h.dataId)),p}var voe={kernelName:xd,backendName:"webgpu",kernelFunc:boe},woe=ca({opType:Be.ATAN2}),koe={kernelName:xl,backendName:"webgpu",kernelFunc:woe},rA=class{constructor(e,t){this.variableNames=["x"],this.uniforms="stride : vec2, pad : vec2, dilation : vec2, convDims : vec2, filterDims : vec2,",this.workGroupSize=[128,1,1],this.size=!0,this.outputShape=e.outShape,this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey=`pool2D_${t}`,this.poolType=t}getUserCode(){let e="resultValue = max(value, resultValue);";this.poolType==="avg"&&(e="resultValue = resultValue + value; count = count + 1.0;");let t="resultValue";return this.poolType==="avg"&&(t="resultValue / count"),` + ${We("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + let batch = coords[0]; + let xRCCorner = vec2(coords.yz) * uniforms.stride - uniforms.pad; + let xRCorner = xRCCorner.x; + let xCCorner = xRCCorner.y; + + var resultValue = ${this.poolType==="avg"?"0.0":"-1.0 / pow(10.0, -20.0)"}; + var count = 0.0; + + for (var wR = 0; wR < uniforms.filterDims.x; wR = wR + uniforms.dilation.x) { + let xR = xRCorner + wR; + + if (xR < 0 || xR >= uniforms.convDims.x) { + continue; + } + + for (var wC = 0; wC < uniforms.filterDims.y; wC = wC + uniforms.dilation.y) { + let xC = xCCorner + wC; + if (xC < 0 || xC >= uniforms.convDims.y) { + continue; + } + + let value = getX(batch, xR, xC, coords[3]); + ${e} + } + } + + setOutputAtIndex(index, ${t}); + } + } + `}},Ioe=class{constructor(e){this.variableNames=["x"],this.uniforms="stride : vec2,",this.workGroupSize=[256,1,1],this.size=!0,this.outputShape=e.outShape,this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey="poolWithFilterSizeEqualsOne"}getUserCode(){return` + ${We("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + let batch = coords[0]; + let d = coords[3]; + + let xRCCorner = coords.yz * uniforms.stride; + let xRCorner = xRCCorner.x; + let xCCorner = xRCCorner.y; + + let value = getX(batch, xRCorner, xCCorner, d); + setOutputAtIndex(index, value); + } + } + `}},Soe=class{constructor(e,t){this.workGroupSize=[64,1,1],this.variableNames=["x"],this.uniforms="reduceSize : i32,",this.size=!0,this.inputShape=[e.batchSize,e.inSize];let[a]=T.computeOutAndReduceShapes(this.inputShape,[1]);this.outputShape=a.length===0?[1]:a,this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,[1,1,1]),this.reduceType=t,this.shaderKey=`reduce_${t}`}getUserCode(){let e="",t="0.0";this.reduceType==="min"||this.reduceType==="max"?(e=` + if (isnan(candidate)) { + bestValue = uniforms.NAN; + } else if (!isnan(bestValue) && candidate ${this.reduceType==="min"?"<":">"} bestValue) + { bestValue = candidate; }`,t="f32(x[offset])"):this.reduceType==="sum"||this.reduceType==="mean"?e=" bestValue = bestValue + candidate; ":this.reduceType==="prod"&&(e=" bestValue = bestValue * candidate; ",t="1.0");let a=this.reduceType==="mean"?"setOutputAtIndex(outputIndex, bestValue / f32(uniforms.reduceSize));":"setOutputAtIndex(outputIndex, bestValue);";return` + fn DIV_CEIL(a : u32, b : u32) -> u32 { + return ((a - 1u) / b + 1u); + } + + ${` + var xBestValues : array; + `} + fn getOffset(outputIndex : i32) -> i32 { + let outputCoords = getCoordsFromIndex(outputIndex); + let offset = ${this.outputShape.length===1?"outputCoords":"outputCoords[0]"} * uniforms.reduceSize; + return offset; + } + ${We("index")} { + let outputIndex = index / i32(workGroupSizeX); + let offset = getOffset(outputIndex); + var bestValue = ${t}; + let Length = uniforms.reduceSize; + let WorkPerThread = DIV_CEIL(u32(Length), workGroupSizeX); + for (var k = i32(localId.x); k < Length && outputIndex < uniforms.size; + k = k + i32(workGroupSizeX)) { + let candidate = f32(x[offset + k]); + ${e} + } + xBestValues[localId.x] = bestValue; + workgroupBarrier(); + + var reduceSize = min(u32(Length), workGroupSizeX); + for (var currentSize = reduceSize / 2u; reduceSize > 1u; + currentSize = reduceSize / 2u) { + let interval = DIV_CEIL(reduceSize, 2u); + if (localId.x < currentSize) { + let candidate = xBestValues[localId.x + interval]; + ${e} + xBestValues[localId.x] = bestValue; + } + reduceSize = interval; + workgroupBarrier(); + } + + if (localId.x == 0u && outputIndex < uniforms.size) { + ${a} + } + } + `}};function gp(e,t,a,n,r){let s=e.shape.length,i=[],o=v.parseAxisParam(t,e.shape),l=o,u=T.getAxesPermutation(l,s),d=e;u!=null&&(d=br({inputs:{x:e},attrs:{perm:u},backend:r}),l=T.getInnerMostAxes(l.length,s),i.push(d)),T.assertAxesAreInnerMostDims(n,l,s);let[c,p]=T.computeOutAndReduceShapes(d.shape,l),h=c;a&&(h=T.expandShapeToKeepDim(c,o));let f;if((n==="max"||n==="prod")&&r.shouldExecuteOnCPU([d])){let m=r.tensorMap.get(d.dataId).values;switch(n){case"max":let g=Gie(m,v.sizeFromShape(p),h,e.dtype);f=r.makeTensorInfo(h,e.dtype,g);break;case"prod":let{outVals:y,outShape:A,outDtype:x}=Kie(d.shape,d.dtype,m,l);f=r.makeTensorInfo(A,x,y);break;default:throw new Error(`${n} CPU implementation is not yet supported.`)}}else{let m=v.sizeFromShape(p),g=v.sizeFromShape(d.shape)/m,y={windowSize:m,inSize:m,batchSize:g,outSize:1},A=n==="mean"?"float32":jd(e.dtype),x=[{type:"int32",data:[m]}],b=new Soe(y,n),w=r.runWebGPUProgram(b,[d],A,x);i.push(w),f=Re({inputs:{x:w},attrs:{shape:h},backend:r})}return i.forEach(m=>r.disposeData(m.dataId)),f}function X3(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{reductionIndices:s,keepDims:i}=n;return gp(r,s,i,"max",a)}var Toe={kernelName:zi,backendName:"webgpu",kernelFunc:X3};function p9(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{keepDims:s,axis:i}=n;return gp(r,i,s,"mean",a)}var Coe={kernelName:Bi,backendName:"webgpu",kernelFunc:p9};function c9(e,t,a,n){if(t.filterWidth===1&&t.filterHeight===1&&v.arraysEqual(t.inShape,t.outShape))return cn({inputs:{x:e},backend:n});if(t.filterWidth===t.inWidth&&t.filterHeight===t.inHeight&&t.batchSize===1&&t.padInfo.type==="VALID"){let i=e.shape.length,o=Re({inputs:{x:e},backend:n,attrs:{shape:[e.shape[i-3]*e.shape[i-2],e.shape[i-1]]}}),l;a==="avg"?l=p9({inputs:{x:o},backend:n,attrs:{axis:0,keepDims:!1}}):(v.assert(a==="max",()=>`Invalid pool type ${a}`),l=X3({inputs:{x:o},backend:n,attrs:{reductionIndices:0,keepDims:!1}}));let u=Re({inputs:{x:l},backend:n,attrs:{shape:t.outShape}});return n.disposeData(o.dataId),n.disposeData(l.dataId),u}let r,s=[{type:"int32",data:[t.strideHeight,t.strideWidth]}];return t.filterHeight===1&&t.filterWidth===1?r=new Ioe(t):(a==="avg"?r=new rA(t,"avg"):(v.assert(a==="max",()=>`Invalid pool type ${a}`),r=new rA(t,"max")),s.push({type:"int32",data:[t.padInfo.top,t.padInfo.left]},{type:"int32",data:[t.dilationHeight,t.dilationWidth]},{type:"int32",data:[t.inHeight,t.inWidth]},{type:"int32",data:[t.effectiveFilterHeight,t.effectiveFilterWidth]})),n.runWebGPUProgram(r,[e],e.dtype,s)}function Noe(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{filterSize:s,strides:i,pad:o,dimRoundingMode:l}=n,u=1,d=T.computePool2DInfo(r.shape,s,i,u,o,l);return c9(r,d,"avg",a)}var Eoe={kernelName:mi,backendName:"webgpu",kernelFunc:Noe};function Roe(e){let{inputs:t,backend:a,attrs:n}=e,{a:r,b:s}=t,{transposeA:i,transposeB:o}=n;return G3({a:r,b:s,transposeA:i,transposeB:o,backend:a})}var Moe={kernelName:gi,backendName:"webgpu",kernelFunc:Roe},$oe=class{constructor(e,t){this.variableNames=["source"],this.workPerThread=1,this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=t,this.rank=t.length,this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize,[this.workPerThread,1,1]),this.start=e,this.uniforms=`start : ${na(e.length)}, `,this.shaderKey="slice"}getUserCode(){let e=na(this.rank),t=_oe(this.rank),a;return this.start.length===1?a=this.outputShape.map((n,r)=>"sourceLoc = uniforms.start + coords;"):a=this.outputShape.map((n,r)=>`sourceLoc.${O1[r]} = uniforms.start.${Ar(r)} + coords.${O1[r]};`),` + ${We("index")} { + if (index < uniforms.size) { + var sourceLoc : ${e}; + let coords = getCoordsFromIndex(index); + ${a.join(` +`)} + setOutputAtIndex(index, getSource(${t})); + } + } + `}},O1=["x","y","z","w","u","v"];function _oe(e){if(e===1)return"sourceLoc";if(e<=6)return O1.slice(0,e).map(t=>`sourceLoc.${t}`).join(",");throw Error(`Slicing for rank ${e} is not yet supported`)}function uu(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{begin:s,size:i}=n,[o,l]=At.parseSliceParams(r,s,i);if(At.assertParamsValid(r,o,l),a.shouldExecuteOnCPU([r])||r.dtype==="string"){let c=a.tensorMap.get(r.dataId),p=eoe(c.values,o,l,r.shape,r.dtype);return a.makeTensorInfo(l,r.dtype,p)}if(v.sizeFromShape(l)===0)return a.makeTensorInfo(l,r.dtype,[]);let u=new $oe(o,l),d=[{type:"int32",data:o}];return a.runWebGPUProgram(u,[r],r.dtype,d)}var Foe={kernelName:zl,backendName:"webgpu",kernelFunc:uu},Poe=e=>{let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{blockShape:s,crops:i}=n;v.assert(r.shape.length<=4,()=>"batchToSpaceND for rank > 4 with a WebGPU backend not implemented yet");let o=s.reduce((A,x)=>A*x),l=T.getReshaped(r.shape,s,o),u=T.getPermuted(l.length,s.length),d=T.getReshapedPermuted(r.shape,s,o),c=T.getSliceBeginCoords(i,s.length),p=T.getSliceSize(d,i,s.length),h=[],f=Re({inputs:{x:r},backend:a,attrs:{shape:l}}),m=br({inputs:{x:f},backend:a,attrs:{perm:u}}),g=Re({inputs:{x:m},backend:a,attrs:{shape:d}}),y=uu({inputs:{x:g},backend:a,attrs:{begin:c,size:p}});return h.push(f),h.push(m),h.push(g),h.forEach(A=>a.disposeData(A.dataId)),y},Ooe={kernelName:bl,backendName:"webgpu",kernelFunc:Poe},h9=ca({opType:Be.NOT_EQUAL,dtype:"bool",cpuKernelImpl:Xie}),Doe={kernelName:cs,backendName:"webgpu",kernelFunc:h9};function yp(e){let{inputs:t,backend:a}=e,{input:n}=t,r=a.tensorMap.get(n.dataId);return cn({inputs:{x:r.complexTensorInfos.real},backend:a})}var zoe={kernelName:$d,backendName:"webgpu",kernelFunc:yp};function Loe(e,t){let a=new mp(e.shape,Se.TO_INT),n=t.runWebGPUProgram(a,[e],"int32");return{dataId:n.dataId,shape:n.shape,dtype:n.dtype}}function D1(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{dtype:s}=n;if(s==="complex64"){if(r.dtype==="complex64")return cn({inputs:{x:r},backend:a});let i=pn(r.shape),o=D1({inputs:{x:r},backend:a,attrs:{dtype:"float32"}}),l=ou({inputs:{real:o,imag:i},backend:a});return i.dispose(),a.disposeData(o.dataId),l}if(r.dtype==="complex64"){let i=yp({inputs:{input:r},backend:a}),o=D1({inputs:{x:i},backend:a,attrs:{dtype:s}});return a.disposeData(i.dataId),o}if(!v.hasEncodingLoss(r.dtype,s)){let i=cn({inputs:{x:r},backend:a});return{dataId:i.dataId,shape:i.shape,dtype:s}}if(a.shouldExecuteOnCPU([r])){let i=a.tensorMap.get(r.dataId).values,[o,l,u]=Eie(i,r.shape,r.dtype,s);return a.makeTensorInfo(o,l,u)}if(s==="int32")return Loe(r,a);if(s==="bool"){let i=a.makeTensorInfo([],"bool",v.getTypedArrayFromDType("bool",1)),o=h9({inputs:{a:r,b:i},backend:a});return a.disposeData(i.dataId),o}throw new Error(`Error in Cast: failed to cast ${r.dtype} to ${s}`)}var Boe={kernelName:yi,backendName:"webgpu",kernelFunc:D1},Woe=Ht({opType:Se.CEIL,cpuKernelImpl:Rie}),Voe={kernelName:Qr,backendName:"webgpu",kernelFunc:Woe},Goe=class{constructor(e){this.variableNames=["A"],this.uniforms="minVal : f32, maxVal : f32,",this.workPerThread=4,this.workGroupSize=[64,1,1],this.isVec4=!0,this.size=!0,this.outputShape=e,this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize,[this.workPerThread,1,1]),this.shaderKey="clipVec4"}getUserCode(){return` + ${We("index")} { + if(index < uniforms.size) { + let value = getAByOutputIndex(index); + var clampedValue : vec4; + for (var i = 0; i < 4; i = i + 1) { + if (isnan(value[i])) { + clampedValue[i] = value[i]; + } else { + clampedValue[i] = clamp(value[i], uniforms.minVal, uniforms.maxVal); + } + } + + setOutputAtIndex(index, clampedValue); + } + } + `}},Uoe=class{constructor(e){this.variableNames=["A"],this.uniforms="minVal : f32, maxVal : f32,",this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=e,this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey="clip"}getUserCode(){return` + ${We("index")} { + if(index < uniforms.size) { + let value = getAByOutputIndex(index); + if (isnan(value)) { + setOutputAtIndex(index, value); + return; + } + setOutputAtIndex(index, clamp(value, uniforms.minVal, uniforms.maxVal)); + } + } + `}};function joe(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{clipValueMin:s,clipValueMax:i}=n,o,l=[{type:"float32",data:[s]},{type:"float32",data:[i]}];return v.sizeFromShape(r.shape)%4===0?o=new Goe(r.shape):o=new Uoe(r.shape),a.runWebGPUProgram(o,[r],r.dtype,l)}var Hoe={kernelName:es,backendName:"webgpu",kernelFunc:joe},qoe=class{constructor(e){this.uniforms="",this.workPerThread=1,this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=T.computeOutShape(e,1),this.variableNames=e.map((t,a)=>`T${a}`),this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize,[this.workPerThread,1,1]),this.offsetLength=e.length-1;for(let t=0;t0){e.push("if (yC < uniforms.offset0){ setOutputAtCoords(coords.x, coords.y, getT0(yR, yC)); }");for(let n=1;nyp({inputs:{input:x},backend:a})),m=e.map(x=>qh({inputs:{input:x},backend:a})),g=ju(f,t,a),y=ju(m,t,a),A=ou({inputs:{real:g,imag:y},backend:a});return f.forEach(x=>a.disposeData(x.dataId)),m.forEach(x=>a.disposeData(x.dataId)),a.disposeData(g.dataId),a.disposeData(y.dataId),A}let r=a.shouldExecuteOnCPU(e);if(n==="string"&&(r=!0),r){let f=e.map(w=>{let S=[-1,v.sizeFromShape(w.shape.slice(t))];return Re({inputs:{x:w},backend:a,attrs:{shape:S}})}),m=f.map(w=>({vals:a.readSync(w.dataId),shape:w.shape})),g=T.computeOutShape(f.map(w=>w.shape),1),y=f[0].shape[0]===1,A=Mie(m,g,n,y),x=T.computeOutShape(e.map(w=>w.shape),t),b=a.makeTensorInfo(x,n,A);return f.forEach(w=>a.disposeData(w.dataId)),b}let s=a.device.limits.maxStorageBuffersPerShaderStage-1;if(e.length>s){let f=[];for(let g=0;gf.shape),u=new qoe(l),d=[],c=new Array(l.length-1);if(c.length>0){c[0]=l[0][1],d.push({type:"int32",data:[c[0]]});for(let f=1;fa.disposeData(f.dataId));let h=Re({inputs:{x:p},backend:a,attrs:{shape:o}});return a.disposeData(p.dataId),h}function Koe(e,t,a){let n=T.computeOutShape(e.map(r=>r.shape),t);return{tensors2D:e.map(r=>Re({inputs:{x:r},backend:a,attrs:{shape:[v.sizeFromShape(r.shape.slice(0,t)),v.sizeFromShape(r.shape.slice(t))]}})),outShape:n}}function f9(e){let{inputs:t,backend:a,attrs:n}=e,{axis:r}=n,s=v.parseAxisParam(r,t[0].shape)[0],i=t.map(u=>u.shape);T.assertParamsConsistent(i,s);let o=T.computeOutShape(t.map(u=>u.shape),s);if(v.sizeFromShape(o)===0)return a.makeTensorInfo(o,t[0].dtype,[]);let l=t.filter(u=>v.sizeFromShape(u.shape)>0);return l.length===1?cn({inputs:{x:l[0]},backend:a}):ju(l,s,a)}var Zoe={kernelName:vl,backendName:"webgpu",kernelFunc:f9};function Yoe(e,t,a,n,r=!1,s=null,i=!1,o=4,l=4,u=4){let d=N=>{switch(N){case 1:return"resData = x[xIndex];";case 3:return"resData = vec3(x[xIndex], x[xIndex + 1], x[xIndex + 2]);";case 4:return"resData = x[xIndex / 4];";default:throw new Error(`innerElementSize ${N} is not supported.`)}},c=N=>{switch(N){case 1:return"return W[row * uniforms.wShape[3] + colIn];";case 4:return"return W[row * uniforms.wShape[3] / 4 + colIn];";default:throw new Error(`innerElementSize ${N} is not supported.`)}},p=e?` + let coord = vec4(batch, xRow, xCol, xCh); + `:` + let coord = vec4(batch, xCh, xRow, xCol); + `,h=e?` + let coords = vec4( + batch, + row / outWidth, + row % outWidth, + col); + `:` + let coords = vec4( + batch, + row, + col / outWidth, + col % outWidth); + `,f=e?"uniforms.xShape[1]":"uniforms.xShape[2]",m=e?"uniforms.xShape[2]":"uniforms.xShape[3]",g=e?"row":"col",y=e?"col":"row",A=` + let inChannels = uniforms.wShape[2]; + let outWidth = ${e?"uniforms.outShape[2]":"uniforms.outShape[3]"}; + let outRow = ${g} / outWidth; + let outCol = ${g} % outWidth; + + let WRow = ${y} / (uniforms.filterDims[1] * inChannels); + let WCol = ${y} / inChannels % uniforms.filterDims[1]; + let xRow = outRow * uniforms.stride[0] + uniforms.dilation[0] * WRow - uniforms.pad[0]; + let xCol = outCol * uniforms.stride[1] + uniforms.dilation[1] * WCol - uniforms.pad[1]; + let xCh = ${y} % inChannels; + var resData = ${Rt(o)}(0.0); + // The bounds checking is always needed since we use it to pad zero for + // the 'same' padding type. + if (xRow >= 0 && xRow < ${f} && xCol >= 0 && xCol < ${m}) { + ${p} + let xIndex = getIndexFromCoords4D(coord, uniforms.xShape); + ${d(o)} + } + return resData;`,x=e?t&&n?` + let col = colIn * ${o}; + ${A}`:` + let col = colIn * ${o}; + if (row < uniforms.dimAOuter && col < uniforms.dimInner) { + ${A} + } + return ${Rt(o)}(0.0);`:n&&a?` + let col = colIn * ${o}; + ${A}`:` + let col = colIn * ${o}; + if (row < uniforms.dimInner && col < uniforms.dimBOuter) { + ${A} + } + return ${Rt(o)}(0.0);`,b=`${c(l)}`,w=Rt(u),S=Rt(e?o:l),C=Rt(e?l:o);return` + ${Cr(s,i,u===4,4)} + fn mm_readA(batch: i32, row : i32, colIn : i32) -> ${S} { + ${e?x:b} + } + + fn mm_readB(batch: i32, row : i32, colIn : i32) -> ${C} { + ${e?b:x} + } + + fn mm_write(batch: i32, row : i32, colIn : i32, valueIn : ${w}) { + let col = colIn * ${u}; + if (row < uniforms.dimAOuter && col < uniforms.dimBOuter) + { + var value = valueIn; + let outWidth = ${e?"uniforms.outShape[2]":"uniforms.outShape[3]"}; + ${h} + ${mo(r,s)} + setOutputAtCoords(coords[0], coords[1], coords[2], coords[3], value); + } + }`}var Joe=class{constructor(e,t,a,n,r=!1,s=null,i=!1,o=!1){this.variableNames=["x","W"],this.uniforms="filterDims : vec2, pad : vec2, stride : vec2, dilation : vec2, dimAOuter : i32, dimBOuter : i32, dimInner : i32,",this.outputShape=e.outShape,this.isChannelsLast=e.dataFormat==="channelsLast",this.isVec4=((e.inChannels%4===0||e.inChannels%3===0)&&this.isChannelsLast||e.outWidth%4===0&&!this.isChannelsLast)&&e.outChannels%4===0,this.dispatchLayout=this.isChannelsLast?{x:[3],y:[1,2],z:[0]}:{x:[2,3],y:[1],z:[0]},this.workGroupSize=z3(this.dispatchLayout,this.outputShape,this.isVec4),this.elementsPerThread=L3(this.dispatchLayout,this.outputShape,this.isVec4),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize,this.elementsPerThread),this.isVec4?(this.isChannelsLast&&e.inChannels%4!==0?(this.innerElementSize=3,this.variableTypes=["f32","vec4"]):(this.innerElementSize=4,this.variableTypes=["vec4","vec4"]),r&&(this.variableNames.push("bias"),this.variableTypes.push("vec4")),i&&(this.variableNames.push("preluActivationWeights"),this.variableTypes.push("vec4"))):(this.innerElementSize=this.elementsPerThread[0],r&&this.variableNames.push("bias"),i&&this.variableNames.push("preluActivationWeights")),this.sequentialAccessByThreads=o,this.addBias=r,this.activation=s,this.hasPreluActivationWeights=i,this.tileAOuter=this.workGroupSize[1]*this.elementsPerThread[1],this.tileBOuter=this.workGroupSize[0]*this.elementsPerThread[0],this.tileInner=Math.max(this.workGroupSize[0]*this.innerElementSize,this.workGroupSize[1]),this.fitAOuter=t%this.tileAOuter===0,this.fitBOuter=a%this.tileBOuter===0,this.fitInner=n%this.tileInner===0,this.shaderKey=`conv2DMM_${this.elementsPerThread}_${this.activation}}_${this.fitAOuter}_${this.fitBOuter}_${this.fitInner}_${this.isVec4}_${this.innerElementSize}_${this.isChannelsLast}_${this.sequentialAccessByThreads}`}getUserCode(){let e=this.isVec4?jh(this.elementsPerThread,this.workGroupSize,!this.isChannelsLast,this.tileInner):Hh(this.elementsPerThread,this.workGroupSize,!this.isChannelsLast,this.tileInner,!1,null,this.sequentialAccessByThreads),t=this.isVec4?[this.innerElementSize,4,4]:[1,1,1];return` + ${Yoe(this.isChannelsLast,this.fitAOuter,this.fitBOuter,this.fitInner,this.addBias,this.activation,this.hasPreluActivationWeights,t[0],t[1],t[2])} + ${e} + `}},Qoe=class{constructor(e,t=!1,a=null,n=!1){this.variableNames=["x","W"],this.uniforms="filterDims: vec2, pad: vec2, stride: vec2, dilation: vec2,",this.workGroupSize=[4,4,8],this.outputShape=e.outShape,this.isChannelsLast=e.dataFormat==="channelsLast",this.dispatchLayout=this.isChannelsLast?{x:[2],y:[1],z:[0,3]}:{x:[3],y:[2],z:[0,1]},this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize),this.addBias=t,this.activation=a,this.hasPreluActivationWeights=n,t&&this.variableNames.push("bias"),n&&this.variableNames.push("preluActivationWeights"),this.shaderKey=`conv2dnaive_${this.activation}_${this.isChannelsLast}`}getUserCode(){return` + ${Cr(this.activation,this.hasPreluActivationWeights,!1,4)} + fn readInp(batch : i32, row : i32, col : i32, chan : i32) -> f32{ + let coords = vec4(batch, row, col, chan); + if (coordsInBounds4D(coords, uniforms.xShape)) { + return getX(batch, row, col, chan); + } else { + return 0.0; + } + } + fn readFilt(row : i32, col : i32, xChannel : i32, outChannel : i32) -> f32{ + let coords = vec4(row, col, xChannel, outChannel); + if(coordsInBounds4D(coords, uniforms.wShape)) { + return getW(row, col, xChannel, outChannel); + } else { + return 0.0; + } + } + fn writeResult(batch : i32, row : i32, col : i32, chan : i32, valueIn : f32) { + let coords = ${this.isChannelsLast?"vec4(batch, row, col, chan);":"vec4(batch, chan, row, col);"} + if (coordsInBounds4D(coords, uniforms.outShape)) { + var value = valueIn; + ${mo(this.addBias,this.activation)} + setOutputAtCoords(coords.x, coords.y, coords.z, coords.w, value); + } + } + ${We("index")} { + let coords = getOutputCoords(); + let batch = coords[0]; + let outChannel = ${this.isChannelsLast?"coords[3];":"coords[1];"} + let outRow = ${this.isChannelsLast?"coords[1];":"coords[2];"} + let outCol = ${this.isChannelsLast?"coords[2];":"coords[3];"} + var acc : f32 = 0.0; + for (var row = 0; row < uniforms.filterDims[0]; row = row + 1) { + for (var col = 0; col < uniforms.filterDims[1]; col = col + 1) { + let xRow = outRow * uniforms.stride[0] + uniforms.dilation[0] * row - uniforms.pad[0]; + let xCol = outCol * uniforms.stride[1] + uniforms.dilation[1] * col - uniforms.pad[1]; + for (var xChannel = 0; xChannel < ${this.isChannelsLast?"uniforms.xShape[3];":"uniforms.xShape[1];"} xChannel = xChannel + 1) { + ${this.isChannelsLast?"let v = readInp(batch, xRow, xCol, xChannel);":"let v = readInp(batch, xChannel, xRow, xCol);"} + let f = readFilt(row, col, xChannel, outChannel); + acc = acc + v * f; + } + } + } + writeResult(batch, outRow, outCol, outChannel, acc); + } + `}};function sA(e,t){let a=e.length;return a>=3?t?[...e.slice(0,-3),e[a-3]*e[a-2],e[a-1]]:[...e.slice(0,-3),e[a-3],e[a-2]*e[a-1]]:!t&&a===1&&e[0]>1?[e[0],1]:null}function ele({x:e,filter:t,convInfo:a,backend:n,bias:r=null,preluActivationWeights:s=null,leakyreluAlpha:i=0,activation:o=null}){let l=a.dataFormat==="channelsLast",u=!l,d=!1,c=l&&a.filterHeight===a.inHeight&&a.filterWidth===a.inWidth&&a.padInfo.type==="VALID",p=[],h,f;if(c){let y=a.inHeight*a.inWidth*a.inChannels;h=Re({inputs:{x:e},backend:n,attrs:{shape:[1,a.batchSize,y]}}),f=Re({inputs:{x:t},backend:n,attrs:{shape:[1,y,a.outChannels]}})}else h=Re({inputs:{x:e},backend:n,attrs:{shape:l?[a.batchSize,a.inHeight*a.inWidth,a.inChannels]:[a.batchSize,a.inChannels,a.inHeight*a.inWidth]}}),f=Re({inputs:{x:t},backend:n,attrs:{shape:[1,a.inChannels,a.outChannels]}});if(p.push(h),p.push(f),s!=null){let y=sA(s.shape,l);y!=null&&(s=Re({inputs:{x:s},backend:n,attrs:{shape:y}}),p.push(s))}if(r!=null){let y=sA(r.shape,l);y!=null&&(r=Re({inputs:{x:r},backend:n,attrs:{shape:y}}),p.push(r))}let m=G3({a:l?h:f,b:l?f:h,transposeA:u,transposeB:d,backend:n,bias:r,activation:o,preluActivationWeights:s,leakyreluAlpha:i}),g=Re({inputs:{x:m},backend:n,attrs:{shape:a.outShape}});p.push(m);for(let y of p)n.disposeData(y.dataId);return g}function m9({x:e,filter:t,convInfo:a,backend:n,bias:r=null,preluActivationWeights:s=null,leakyreluAlpha:i=0,activation:o=null}){let l=r!=null,u=s!=null,d=a.dataFormat==="channelsLast",c=d&&a.filterHeight===a.inHeight&&a.filterWidth===a.inWidth&&a.padInfo.type==="VALID",p=V().getBool("WEBGPU_USE_NAIVE_CONV2D_DEBUG");if(!p&&(c||a.filterHeight===1&&a.filterWidth===1&&a.dilationHeight===1&&a.dilationWidth===1&&a.strideHeight===1&&a.strideWidth===1&&(a.padInfo.type==="SAME"||a.padInfo.type==="VALID")))return ele({x:e,filter:t,convInfo:a,backend:n,bias:r,activation:o,preluActivationWeights:s,leakyreluAlpha:i});let h,f=[a.padInfo.top,a.padInfo.left],m=[{type:"int32",data:[a.filterHeight,a.filterWidth]},{type:"int32",data:[...f]},{type:"int32",data:[a.strideHeight,a.strideWidth]},{type:"int32",data:[a.dilationHeight,a.dilationWidth]}];if(p)h=new Qoe(a,l,o,u);else{let x=d?a.outHeight*a.outWidth:a.outChannels,b=d?a.outChannels:a.outHeight*a.outWidth,w=a.filterHeight*a.filterWidth*a.inChannels;m.push({type:"int32",data:[x]},{type:"int32",data:[b]},{type:"int32",data:[w]});let S=n.adapterInfo.isIntel();h=new Joe(a,x,b,w,l,o,u,S)}let g=[],y=[e,t];l&&(!d&&r.shape.length===1&&(r=Re({inputs:{x:r},backend:n,attrs:{shape:[r.shape[0],1,1]}}),g.push(r)),y.push(r)),u&&(!d&&s.shape.length===1&&(s=Re({inputs:{x:s},backend:n,attrs:{shape:[s.shape[0],1,1]}}),g.push(s)),y.push(s)),o==="leakyrelu"&&(m.push({type:"float32",data:[i]}),h.uniforms+=" alpha : f32,");let A=n.runWebGPUProgram(h,y,e.dtype,m);for(let x of g)n.disposeData(x.dataId);return A}function tle(e){let{inputs:t,attrs:a,backend:n}=e,{x:r,filter:s}=t,{strides:i,pad:o,dataFormat:l,dilations:u,dimRoundingMode:d}=a,c=T.convertConv2DDataFormat(l),p=T.computeConv2DInfo(r.shape,s.shape,i,u,o,d,!1,c);return m9({x:r,filter:s,convInfo:p,backend:n})}var ale={kernelName:Ai,backendName:"webgpu",kernelFunc:tle};function nle(e=4){let t=n=>{switch(n){case 1:return"return W[getIndexFromCoords4D(coord, uniforms.wShape)];";case 4:return` + let coord1 = vec4(coordX, coordY, col + 1, rowInner); + let coord2 = vec4(coordX, coordY, col + 2, rowInner); + let coord3 = vec4(coordX, coordY, col + 3, rowInner); + let v0 = W[getIndexFromCoords4D(coord, uniforms.wShape)]; + let v1 = W[getIndexFromCoords4D(coord1, uniforms.wShape)]; + let v2 = W[getIndexFromCoords4D(coord2, uniforms.wShape)]; + let v3 = W[getIndexFromCoords4D(coord3, uniforms.wShape)]; + return vec4(v0, v1, v2, v3); + `;default:throw new Error(`innerElementSize ${n} is not supported.`)}},a=`if (row < uniforms.dimAOuter && col < uniforms.dimInner) { + ${` + let outRow = row / uniforms.outShape[2]; + let outCol = row % uniforms.outShape[2]; + + let WRow = col / (uniforms.filterDims[1] * uniforms.outBackprop[3]); + let WCol = col / uniforms.outBackprop[3] % uniforms.filterDims[1]; + let xR = f32(outRow - uniforms.pads[0] + WRow) / f32(uniforms.stride[0]); + let xC = f32(outCol - uniforms.pads[1] + WCol) / f32(uniforms.stride[1]); + if (xR < 0.0 || xR >= f32(uniforms.outBackprop[1]) || fract(xR) > 0.0) { + return ${Rt(e)}(0.0); + } + if (xC < 0.0 || xC >= f32(uniforms.outBackprop[2]) || fract(xC) > 0.0) { + return ${Rt(e)}(0.0); + } + let coord = vec4( + batch, + i32(xR), + i32(xC), + col % uniforms.outBackprop[3]); + return x[getIndexFromCoords4D(coord, uniforms.xShape)/${e}];`} + } + return ${Rt(e)}(0.0);`;return` + fn mm_readA(batch: i32, row : i32, colIn : i32) -> ${Rt(e)} { + let col = colIn * ${e}; + ${a} + } + + fn mm_readB(batch: i32, row : i32, colIn : i32) -> ${Rt(e)} { + let col = colIn * ${e}; + let coordX = uniforms.filterDims.x - 1 - + row / (uniforms.filterDims[1] * uniforms.outBackprop[3]); + let coordY = uniforms.filterDims.y - 1 - + (row / uniforms.outBackprop[3]) % uniforms.filterDims[1]; + if (row < uniforms.dimInner && col < uniforms.dimBOuter && + coordX >= 0 && coordY >= 0) { + let rowInner = row % uniforms.outBackprop[3]; + let coord = vec4(coordX, coordY, col, rowInner); + ${t(e)} + } + return ${Rt(e)}(0.0); + } + + fn mm_write(batch: i32, row : i32, colIn : i32, valueInput : ${Rt(e)}) { + let col = colIn * ${e}; + if (row < uniforms.dimAOuter && (col + ${e-1}) < uniforms.dimBOuter) { + var value = valueInput; + let outCoord = vec4( + batch, + row / uniforms.outShape[2], + row % uniforms.outShape[2], + col); + result[getIndexFromCoords4D(outCoord, uniforms.outShape)/${e}] = value; + } + }`}var rle=class{constructor(e){this.variableNames=["x","W"],this.uniforms="filterDims : vec2, pads : vec2, stride : vec2, outBackprop : vec4, dimAOuter : i32, dimBOuter : i32, dimInner : i32,",this.outputShape=e.inShape,v.assert(e.dataFormat==="channelsLast",()=>"TODO: NCHW is unimplemented"),this.isVec4=e.inChannels%4===0&&e.outChannels%4===0,this.dispatchLayout={x:[3],y:[1,2],z:[0]},this.workGroupSize=z3(this.dispatchLayout,this.outputShape,this.isVec4),this.elementsPerThread=L3(this.dispatchLayout,this.outputShape,this.isVec4),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize,this.elementsPerThread),this.isVec4&&(this.variableTypes=["vec4","f32"]),this.shaderKey=`conv2DDerInputMM_${this.isVec4}_${this.elementsPerThread}`}getUserCode(){let e=this.isVec4?jh(this.elementsPerThread,this.workGroupSize):Hh(this.elementsPerThread,this.workGroupSize);return` + ${nle(this.isVec4?4:1)} + ${e} + `}},sle=class{constructor(e){this.variableNames=["dy","W"],this.uniforms="filterDims : vec2, pads : vec2, stride : vec2, outBackprop : vec4,",this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=e.inShape,this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize),this.isChannelsLast=e.dataFormat==="channelsLast",this.shaderKey=`conv2DDerInput_${this.isChannelsLast}`}getUserCode(){let e=this.isChannelsLast?1:2,t=this.isChannelsLast?2:3,a=this.isChannelsLast?3:1;return` + ${We("index")} { + if(index < uniforms.size) { + let coords = getCoordsFromIndex(index); + let batch = coords[0]; + let d1 = coords[${a}]; + + let dyCorner = vec2(coords[${e}], coords[${t}]) - uniforms.pads; + let dyRCorner = dyCorner.x; + let dyCCorner = dyCorner.y; + + // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1). + // ? = to be determined. : = across all values in that axis. + var dotProd = 0.0; + for (var wR = 0; wR < uniforms.filterDims.x; wR = wR + 1) { + let dyR = (f32(dyRCorner) + f32(wR)) / f32(uniforms.stride.x); + let wRPerm = uniforms.filterDims.x - 1 - wR; + if (dyR < 0.0 || dyR >= f32(uniforms.outBackprop[1]) || fract(dyR) > 0.0 || + wRPerm < 0) { + continue; + } + let idyR = i32(dyR); + + for (var wC = 0; wC < uniforms.filterDims.y; wC = wC + 1) { + let dyC = (f32(dyCCorner) + f32(wC)) / f32(uniforms.stride.y); + let wCPerm = uniforms.filterDims.y - 1 - wC; + if (dyC < 0.0 || dyC >= f32(uniforms.outBackprop[2]) || + fract(dyC) > 0.0 || wCPerm < 0) { + continue; + } + let idyC = i32(dyC); + + for (var d2 = 0; d2 < uniforms.outBackprop[3]; d2 = d2 + 1) { + if (${this.isChannelsLast}) { + let xValue = getDy(batch, idyR, idyC, d2); + let wValue = getW(wRPerm, wCPerm, d1, d2); + dotProd = dotProd + xValue * wValue; + } else { + let xValue = getDy(batch, d2, idyR, idyC); + let wValue = getW(wRPerm, wCPerm, d1, d2); + dotProd = dotProd + xValue * wValue; + } + + } + } + } + setOutputAtIndex(index, dotProd); + } + } + `}};function ile(e){let{inputs:t,backend:a,attrs:n}=e,{dy:r,filter:s}=t,{inputShape:i,strides:o,pad:l,dataFormat:u,dimRoundingMode:d}=n,c=T.convertConv2DDataFormat(u),p=T.computeConv2DInfo(i,s.shape,o,1,l,d,!1,c),h=[{type:"int32",data:[p.filterHeight,p.filterWidth]},{type:"int32",data:[p.filterHeight-1-p.padInfo.top,p.filterWidth-1-p.padInfo.left]},{type:"int32",data:[p.strideHeight,p.strideWidth]},{type:"int32",data:[p.batchSize,p.outHeight,p.outWidth,p.outChannels]}],f;if(V().getBool("WEBGPU_USE_NAIVE_CONV2D_TRANSPOSE")||p.filterHeight<=2&&p.filterWidth<=2&&p.outChannels<=16&&p.inChannels===1)f=new sle(p);else{f=new rle(p);let m=p.inHeight*p.inWidth,g=p.inChannels,y=p.filterHeight*p.filterWidth*p.outChannels;h.push({type:"uint32",data:[m]},{type:"uint32",data:[g]},{type:"uint32",data:[y]})}return a.runWebGPUProgram(f,[r,s],"float32",h)}var ole={kernelName:xi,backendName:"webgpu",kernelFunc:ile},lle=Ht({opType:Se.COS}),ule={kernelName:bi,backendName:"webgpu",kernelFunc:lle},dle=Ht({opType:Se.COSH}),ple={kernelName:vi,backendName:"webgpu",kernelFunc:dle},cle=class{constructor(e,t,a,n){this.variableNames=["Image","Boxes","BoxInd"],this.uniforms="extrapolationValue : f32,",this.workGroupSize=[64,1,1],this.size=!0;let[r]=t;this.outputShape=[r,a[0],a[1],e],this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize),this.methodId=n==="bilinear"?1:0,this.cropHeightBiggerThan1=this.outputShape[1]>1,this.cropWidthBiggerThan1=this.outputShape[2]>1,this.shaderKey=`cropAndResize_${this.methodId}_${this.cropHeightBiggerThan1}_${this.cropWidthBiggerThan1}`}getUserCode(){let[e,t]=["f32(uniforms.imageShape[1] - 1)","f32(uniforms.imageShape[2] - 1)"],[a,n,r]=this.cropHeightBiggerThan1?[`(${e} / f32(uniforms.outShape[1] - 1))`,"(y2-y1) * height_ratio",`y1*${e} + f32(y)*(height_scale)`]:["0.0","0.0",`0.5 * (y1+y2) * ${e}`],[s,i,o]=this.cropWidthBiggerThan1?[`(${t} / f32(uniforms.outShape[2] - 1))`,"(x2-x1) * width_ratio",`x1*${t} + f32(x)*(width_scale)`]:["0.0","0.0",`0.5 * (x1+x2) * ${t}`];return` + ${We("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + let height_ratio = f32(${a}); + let width_ratio = f32(${s}); + let b = coords[0]; + let y = coords[1]; + let x = coords[2]; + let d = coords[3]; + // get box vals + let y1 = getBoxes(b, 0); + let x1 = getBoxes(b, 1); + let y2 = getBoxes(b, 2); + let x2 = getBoxes(b, 3); + // get image in batch index + let bInd = i32(round(getBoxInd(b))); + if(bInd < 0 || bInd >= uniforms.outShape[0]) { + return; + } + let height_scale = ${n}; + let width_scale = ${i}; + let in_y = ${r}; + if( in_y < 0.0 || in_y > ${e} ) { + setOutputAtIndex(index, uniforms.extrapolationValue); + return; + } + let in_x = ${o}; + if( in_x < 0.0 || in_x > ${t} ) { + setOutputAtIndex(index, uniforms.extrapolationValue); + return; + } + let sourceFracIndexCR = vec2(in_x,in_y); + if(${this.methodId} == 1) { + // Compute the four integer indices. + let sourceFloorCR = vec2(sourceFracIndexCR); + let sourceCeilCR = vec2(ceil(sourceFracIndexCR)); + let topLeft = getImage(bInd, sourceFloorCR.y, sourceFloorCR.x, d); + let bottomLeft = getImage(bInd, sourceCeilCR.y, sourceFloorCR.x, d); + let topRight = getImage(bInd, sourceFloorCR.y, sourceCeilCR.x, d); + let bottomRight = getImage(bInd, sourceCeilCR.y, sourceCeilCR.x, d); + let fracCR = sourceFracIndexCR - vec2(sourceFloorCR); + let top = topLeft + (topRight - topLeft) * fracCR.x; + let bottom = bottomLeft + (bottomRight - bottomLeft) * fracCR.x; + let newValue = top + (bottom - top) * fracCR.y; + setOutputAtIndex(index, newValue); + } else { + // Compute the coordinators of nearest neighbor point. + let sourceNearestCR = vec2(floor( + sourceFracIndexCR + vec2(0.5,0.5))); + let newValue = getImage( + bInd, sourceNearestCR.y, sourceNearestCR.x, d); + setOutputAtIndex(index, newValue); + } + } + } + `}},hle=e=>{let{inputs:t,backend:a,attrs:n}=e,{image:r,boxes:s,boxInd:i}=t,{cropSize:o,method:l,extrapolationValue:u}=n,d=new cle(r.shape[3],s.shape,o,l),c=[{type:"float32",data:[u]}];return a.runWebGPUProgram(d,[r,s,i],"float32",c)},fle={kernelName:Ii,backendName:"webgpu",kernelFunc:hle},fd;(function(e){e.Prod="*",e.Sum="+"})(fd||(fd={}));var iA=class{constructor(e,t,a,n){this.variableNames=["x"],this.uniforms="index : f32,",this.size=!0;let r=128;this.workGroupSize=[r,1,1],this.outputShape=t,this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize),this.exclusive=a,this.reverse=n,this.op=e,this.shaderKey=`cum_${this.op}_${this.exclusive}_${this.reverse}`}getUserCode(){let e=this.outputShape.length,t=this.op===fd.Prod?"1.0":"0.0",a=this.exclusive?t:`getX(${oA(e,"coords",this.op)})`,n=this.outputShape[this.outputShape.length-1],r="",s="";return this.exclusive?(r=this.reverse?`end != ${n-1}`:"end != 0",s=this.reverse?"end + 1":"end - 1"):(r=this.reverse?`end + pow2 < ${n}`:"end >= pow2",s=this.reverse?"end + pow2":"end - pow2"),` + ${We("index")} { + if (index < uniforms.size) { + var coords = getCoordsFromIndex(index); + + let end = ${lA(e,"coords",this.op)}; + var val = ${a}; + let pow2 = i32(pow(2.0, uniforms.index)); + if (${r}) { + let idx = ${s}; + ${lA(e,"coords",this.op)} = idx; + val ${this.op}= getX(${oA(e,"coords",this.op)}); + } + setOutputAtIndex(index, val); + } + } + `}};function oA(e,t,a){if(e===1)return`${t}`;if(e===2)return`${t}.x, ${t}.y`;if(e===3)return`${t}.x, ${t}.y, ${t}.z`;if(e===4)return`${t}.x, ${t}.y, ${t}.z, ${t}.w`;throw Error(`Cumulative ${a} for rank ${e} is not yet supported`)}function lA(e,t,a){if(e===1)return`${t}`;if(e===2)return`${t}.y`;if(e===3)return`${t}.z`;if(e===4)return`${t}.w`;throw Error(`Cumulative ${a} for rank ${e} is not yet supported`)}function g9(e,t,a,n,r,s){let i=t.shape.length,o=T.getAxesPermutation([n],i),l=t;o!=null&&(l=br({inputs:{x:t},backend:a,attrs:{perm:o}}));let u=T.getInnerMostAxes(1,i)[0];if(u!==i-1)throw new Error(`WebGPU cumprod shader expects an inner-most axis=${t.shape.length-1} but got axis=${n}`);let d=l.shape[u],c=cn({inputs:{x:l},backend:a});for(let p=0;p<=Math.ceil(Math.log2(d))-1;p++){let h=new iA(e,l.shape,!1,s),f=c,m=[{type:"float32",data:[p]}];c=a.runWebGPUProgram(h,[c],c.dtype,m),a.disposeData(f.dataId)}if(r){let p=new iA(e,l.shape,r,s),h=c,f=[{type:"float32",data:[0]}];c=a.runWebGPUProgram(p,[c],c.dtype,f),a.disposeData(h.dataId)}if(o!=null){let p=T.getUndoAxesPermutation(o),h=br({inputs:{x:c},backend:a,attrs:{perm:p}});return a.disposeData(c.dataId),a.disposeData(l.dataId),h}return c}function mle(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{axis:s,exclusive:i,reverse:o}=n;return g9(fd.Prod,r,a,s,i,o)}var gle={kernelName:wi,backendName:"webgpu",kernelFunc:mle};function yle(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{axis:s,exclusive:i,reverse:o}=n;return g9(fd.Sum,r,a,s,i,o)}var Ale={kernelName:ki,backendName:"webgpu",kernelFunc:yle},xle=class{constructor(e,t){this.variableNames=["x"],this.workGroupSize=[64,1,1],this.size=!0,this.uniforms="blockSize : i32,",this.outputShape=e,this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey=`depthToSpace_${t}`,this.dataFormat=t}getUserCode(){return` + ${We("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + let b = coords[0]; + let h = ${this.getHeightCoordString()}; + let w = ${this.getWidthCoordString()}; + let d = ${this.getDepthCoordString()}; + + let in_h = h / uniforms.blockSize; + let offset_h = h % uniforms.blockSize; + let in_w = w / uniforms.blockSize; + let offset_w = w % uniforms.blockSize; + let offset_d = (offset_h * uniforms.blockSize + offset_w) * + ${this.getOutputDepthSize()}; + let in_d = d + offset_d; + + let rlt = ${this.getInputSamplingString()}; + setOutputAtIndex(index, rlt); + } + }`}getHeightCoordString(){return this.dataFormat==="NHWC"?"coords[1]":"coords[2]"}getWidthCoordString(){return this.dataFormat==="NHWC"?"coords[2]":"coords[3]"}getDepthCoordString(){return this.dataFormat==="NHWC"?"coords[3]":"coords[1]"}getOutputDepthSize(){return this.dataFormat==="NHWC"?"uniforms.outShape[3]":"uniforms.outShape[1]"}getInputSamplingString(){return this.dataFormat==="NHWC"?"getX(b, in_h, in_w, in_d)":"getX(b, in_d, in_h, in_w)"}};function ble(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{blockSize:s,dataFormat:i}=n,o=r.shape[0],l=i==="NHWC"?r.shape[1]:r.shape[2],u=i==="NHWC"?r.shape[2]:r.shape[3],d=i==="NHWC"?r.shape[3]:r.shape[1],c=l*s,p=u*s,h=d/(s*s),f=i==="NHWC"?[o,c,p,h]:[o,h,c,p],m=[{type:"int32",data:[s]}],g=new xle(f,i);return a.runWebGPUProgram(g,[r],r.dtype,m)}var vle={kernelName:Si,backendName:"webgpu",kernelFunc:ble},wle=class{constructor(e,t,a,n=!1,r=null,s=!1){this.variableNames=["x","W"],this.uniforms="pad : vec2, inDims : vec2,",this.workGroupSize=[16,16,1],this.outputShape=e,this.dispatchLayout={x:[3],y:[2],z:[0,1]},this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize),n&&this.variableNames.push("bias"),s&&this.variableNames.push("preluActivationWeights"),this.addBias=n,this.activation=r,this.hasPreluActivation=s,this.filterHeight=t,this.filterWidth=a,this.shaderKey=`depthwiseNCHW_${this.activation}_${this.filterHeight}_${this.filterWidth}`}getUserCode(){let e=this.filterWidth*this.filterHeight,t=this.workGroupSize[0]*this.workGroupSize[1]*this.workGroupSize[2],a=this.workGroupSize[1]+this.filterHeight-1,n=this.workGroupSize[0]+this.filterWidth-1;return` + ${Cr(this.activation,this.hasPreluActivation,!1,4)} + + var mm_Asub : array, ${a}>; + var mm_Bsub : array, ${this.filterHeight}>; + fn readX(batch : i32, channel : i32, row : i32, col : i32) -> f32 { + var value = 0.0; + if (row >=0 && row < uniforms.inDims[0] && col >=0 && col < uniforms.inDims[1]) + { + value = getX(batch, channel, row, col); + } + return value; + } + + ${hd()} + fn _start(@builtin(local_invocation_id) LocalId : vec3, + @builtin(global_invocation_id) GlobalId : vec3, + @builtin(local_invocation_index) LocalIndex: u32, + @builtin(num_workgroups) NumWorkgroups: vec3) { + localId = LocalId; + globalId = GlobalId; + let localIndex = i32(LocalIndex); + numWorkgroups = NumWorkgroups; + let coords = getOutputCoords(); + let batch = coords[0]; + let xRCCorner = vec2(coords.zw) - uniforms.pad; + let channelMul = uniforms.wShape[3]; + let d1 = coords[1] / channelMul; + let q = coords[1] % channelMul; + + let inputRowStart = xRCCorner.x; + let inputColStart = xRCCorner.y; + + let localRow = i32(localId.y); + let localCol = i32(localId.x); + + // Load one tile of X into local memory. + for (var inputRow = localRow; inputRow < ${a}; inputRow = inputRow + ${this.workGroupSize[1]}) { + for (var inputCol = localCol; inputCol < ${n}; inputCol = inputCol + ${this.workGroupSize[0]}) { + let rowOffset = inputRow - localRow; + let colOffset = inputCol - localCol; + mm_Asub[inputRow][inputCol] = readX(batch, d1, inputRowStart + rowOffset, inputColStart + colOffset); + } + } + + // Load one tile of W into local memory. + var wIndex = localIndex; + ${e, inDims : vec2,",this.workGroupSize=[4,4,4],this.workPerThread=4,this.isVec4=!0,this.outputShape=e.outShape,this.dispatchLayout={x:[3],y:[2],z:[0,1]},this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize,[4,this.workPerThread,1]),v.assert(e.dataFormat==="channelsLast",()=>"TODO: NCHW is unimplemented"),t&&this.variableNames.push("bias"),n&&this.variableNames.push("preluActivationWeights"),this.convInfo=e,this.addBias=t,this.activation=a,this.hasPreluActivation=n,this.shaderKey=`depthwiseVec4_${a}_${this.convInfo.filterHeight}_${this.convInfo.filterWidth}_${this.convInfo.strideHeight}_${this.convInfo.strideWidth}_${this.workPerThread}`}getUserCode(){let e=(this.workPerThread-1)*this.convInfo.strideWidth+this.convInfo.filterWidth;return` + ${Cr(this.activation,this.hasPreluActivation,!0,4)} + fn readX(batch : i32, row : i32, col : i32, channel : i32) -> vec4 { + var value = vec4(0.0); + if (col >=0 && col < uniforms.inDims[1]) { + value = getX(batch, row, col, channel); + } + return value; + } + + const strideHeight = ${this.convInfo.strideHeight}; + const strideWidth = ${this.convInfo.strideWidth}; + ${hd()} + fn _start(@builtin(global_invocation_id) globalId: vec3) { + let batch = i32(globalId.z) / uniforms.outShape[1]; + let r = i32(globalId.z) % uniforms.outShape[1]; + let c = i32(globalId.y) * ${this.workPerThread}; + let d1 = i32(globalId.x) * 4; + let xRCCorner = vec2(r, c) * vec2(strideHeight, strideWidth) - uniforms.pad; + + let xRCorner = xRCCorner.x; + let xCCorner = xRCCorner.y; + var xVals : array, ${e}>; + var dotProd : array, ${this.workPerThread}>; + for (var i = 0; i < ${this.workPerThread}; i++) { + dotProd[i] = vec4(0.0); + } + + // Use constant instead of uniform can give better performance. + for (var wR = 0; wR < ${this.convInfo.filterHeight}; wR = wR + 1) { + let xR = xRCorner + wR; + if (xR >=0 && xR < uniforms.inDims[0]) { + for (var i = 0; i < ${e}; i++) { + xVals[i] = readX(batch, xR, xCCorner + i, d1); + } + for (var wC = 0; wC < ${this.convInfo.filterWidth}; wC = wC + 1) { + let wValue = getW(wR, wC, d1, 0); + for (var i = 0; i < ${this.workPerThread}; i++) { + dotProd[i] = fma(xVals[i * strideWidth + wC], wValue, dotProd[i]); + } + } + } + } + + for (var i = 0; i < ${this.workPerThread}; i = i + 1) { + let coords = vec4(batch, r, c + i, d1); + if (coordsInBounds4D(coords, uniforms.outShape)) { + var value = dotProd[i]; + ${mo(this.addBias,this.activation)} + setOutputAtCoords(coords[0], coords[1], coords[2], coords[3], value); + } + } + } + `}},A9=class{constructor(e,t=!1,a=null,n=!1){this.variableNames=["x","W"],this.uniforms=`pad : vec2, inDims : vec2, filterHeight : i32, + filterWidth : i32, stride : vec2, dilation : vec2,`,this.workGroupSize=[256,1,1],this.outputShape=e.outShape,this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize),this.isChannelsLast=e.dataFormat==="channelsLast",t&&this.variableNames.push("bias"),n&&this.variableNames.push("preluActivationWeights"),this.convInfo=e,this.addBias=t,this.activation=a,this.hasPreluActivation=n,this.shaderKey=`depthwise_${this.activation}_${this.isChannelsLast}`}getUserCode(){let e=this.isChannelsLast?"getX(batch, xR, xC, d1);":"getX(batch, d1, xR, xC);";return` + ${Cr(this.activation,this.hasPreluActivation,!1,4)} + + ${We()} { + let coords = getOutputCoords(); + let batch = coords[0]; + let xRCCorner = vec2(coords.${this.isChannelsLast?"yz":"zw"}) * uniforms.stride - uniforms.pad; + let d2 = coords[${this.isChannelsLast?3:1}]; + let channelMul = uniforms.wShape[3]; + let d1 = d2 / channelMul; + let q = d2 % channelMul; + + let inputRowStart = xRCCorner.x; + let inputColStart = xRCCorner.y; + let inputRowEnd = inputRowStart + uniforms.filterHeight * + uniforms.dilation[0]; + let inputColEnd = inputColStart + uniforms.filterWidth * + uniforms.dilation[1]; + + // Convolve x(?, ?, d1)|x(d1, ?, ?) with w(:, :, d1, q) to get + // y(yR, yC, d2)|y(d2, yR, yC). ? = to be determined. : = across all + // values in that axis. x(?, ?, d1) and y(yR, yC, d2) is for NHWC. + // x(d1, ?, ?) and y(d2, yR, yC) is for NCHW. + var value = 0.0; + + // Extract if checking out of for loop for performance. + if (inputRowStart >= 0 && inputColStart >= 0 && + inputRowEnd < uniforms.inDims[0] && + inputColEnd < uniforms.inDims[1]) { + for (var wR = 0; wR < uniforms.filterHeight; wR = wR + 1) { + let xR = inputRowStart + wR * uniforms.dilation[0]; + + for (var wC = 0; wC < uniforms.filterWidth; wC = wC + 1) { + let xC = inputColStart + wC * uniforms.dilation[1]; + + let xVal = ${e}; + let wVal = getW(wR, wC, d1, q); + value = value + xVal * wVal; + } + } + } else { + for (var wR = 0; wR < uniforms.filterHeight; wR = wR + 1) { + let xR = inputRowStart + wR * uniforms.dilation[0]; + + if (xR < 0 || xR >= uniforms.inDims[0]) { + continue; + } + + for (var wC = 0; wC < uniforms.filterWidth; wC = wC + 1) { + let xC = inputColStart + wC * uniforms.dilation[1]; + + if (xC < 0 || xC >= uniforms.inDims[1]) { + continue; + } + + let xVal = ${e}; + let wVal = getW(wR, wC, d1, q); + value = value + xVal * wVal; + } + } + } + ${mo(this.addBias,this.activation)} + if (coordsInBounds4D(coords, uniforms.outShape)) { + setOutputAtCoords(coords[0], coords[1], coords[2], coords[3], value); + } + } + `}};function kle(e){let{inputs:t,backend:a,attrs:n}=e,{x:r,filter:s}=t,{strides:i,pad:o,dataFormat:l,dilations:u,dimRoundingMode:d}=n,c=T.convertConv2DDataFormat(l),p=u;p==null&&(p=[1,1]);let h=T.computeConv2DInfo(r.shape,s.shape,i,p,o,d,!0,c),f=[{type:"int32",data:[h.padInfo.top,h.padInfo.left]},{type:"int32",data:[h.inHeight,h.inWidth]}],m=h.dataFormat==="channelsLast",g;return!m&&h.inHeight>16&&h.inWidth>16&&h.strideHeight===1&&h.strideWidth===1&&h.dilationWidth===1&&h.dilationHeight===1&&h.inChannels===h.outChannels?g=new wle(h.outShape,h.filterHeight,h.filterWidth):m&&h.inHeight>4&&h.inWidth>4&&h.strideWidth<=2&&h.inChannels===h.outChannels&&h.dilationHeight===1&&h.dilationWidth===1&&h.inChannels%4===0?g=new y9(h):(g=new A9(h),f.push({type:"int32",data:[h.filterHeight]},{type:"int32",data:[h.filterWidth]},{type:"int32",data:[h.strideHeight,h.strideWidth]},{type:"int32",data:[h.dilationHeight,h.dilationWidth]})),a.runWebGPUProgram(g,[r,s],r.dtype,f)}var Ile={kernelName:Ti,backendName:"webgpu",kernelFunc:kle},x9=ca({opType:Be.MUL,cpuKernelImpl:Hie,supportsComplex:!0}),Sle={kernelName:ps,backendName:"webgpu",kernelFunc:x9};function K3(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{axis:s,keepDims:i}=n;return gp(r,s,i,"sum",a)}var Tle={kernelName:to,backendName:"webgpu",kernelFunc:K3};function Cle(e){let{inputs:t,backend:a,attrs:n}=e,{equation:r}=n,s=t,{allDims:i,summedDims:o,idDims:l}=T.decodeEinsumEquation(r,s.length);T.checkEinsumDimSizes(i.length,l,s);let{path:u,steps:d}=T.getEinsumComputePath(o,l),c=d.length,p=null,h=i.length,f=[];for(let m=0;m=0&&(p=K3({inputs:{x:p},backend:a,attrs:{axis:u[m]-(i.length-h),keepDims:!1}}),f.push(p)),h--)}for(let m of f)m!==p&&a.disposeData(m.dataId);return p}var Nle={kernelName:Sd,backendName:"webgpu",kernelFunc:Cle},Ele=Ht({opType:Se.ELU}),Rle={kernelName:Ni,backendName:"webgpu",kernelFunc:Ele},Mle=ca({opType:Be.EQUAL,dtype:"bool",cpuKernelImpl:$ie}),$le={kernelName:ts,backendName:"webgpu",kernelFunc:Mle},b9=Ht({opType:Se.EXP,cpuKernelImpl:_ie,dtype:"float32"}),_le={kernelName:as,backendName:"webgpu",kernelFunc:b9};function z1(e){let{inputs:t,attrs:a,backend:n}=e,{dim:r}=a,{input:s}=t,i=s.shape.length,o=s.shape.slice(),l=r;return r<0&&(v.assert(-(i+1)<=r,()=>`Axis must be in the interval [${-(i+1)}, ${i}]`),l=i+r+1),o.splice(l,0,1),Re({inputs:{x:s},backend:n,attrs:{shape:o}})}var Fle={kernelName:wl,backendName:"webgpu",kernelFunc:z1},Ple=Ht({opType:Se.EXPM1,cpuKernelImpl:Fie}),Ole={kernelName:Ei,backendName:"webgpu",kernelFunc:Ple},Dle=class{constructor(e){this.outputShape=[],this.variableNames=["x"],this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=e,this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey="flipLeftRight"}getUserCode(){return` + ${We("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + let coordX = uniforms.xShape[2] - coords[2] - 1; + let outputValue = getX(coords[0], coords[1], coordX, coords[3]); + setOutputAtIndex(index, outputValue); + } + } + `}},zle={kernelName:Ri,backendName:"webgpu",kernelFunc:({inputs:e,backend:t})=>{let{image:a}=e,n=t,r=new Dle(a.shape);return n.runWebGPUProgram(r,[a],a.dtype)}},Lle=Ht({opType:Se.FLOOR,cpuKernelImpl:Pie}),Ble={kernelName:ns,backendName:"webgpu",kernelFunc:Lle},Wle=ca({opType:Be.INT_DIV,dtype:"int32"}),Vle={kernelName:Mi,backendName:"webgpu",kernelFunc:Wle},Gle=class{constructor(e,t,a=!1){this.isFromPixels=!0,this.outputShape=[0],this.variableNames=[],this.workGroupSize=[256,1,1],this.outputShape=e,this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize,[t,1,1]),this.importVideo=a,this.shaderKey=`fromPixels_${this.importVideo}`}getUserCode(){let e=this.importVideo?"textureLoad(src, vec2(coords.yx));":"textureLoad(src, vec2(coords.yx), 0)";return` + @binding(1) @group(0) var src: ${this.importVideo?"texture_external":"texture_2d"}; + ${We("index")} { + let flatIndex = index * uniforms.numChannels; + if (flatIndex < uniforms.size) { + let coords = getCoordsFromIndex(flatIndex); + let values = ${e}; + for (var i = 0; i < uniforms.numChannels; i = i + 1) { + result[flatIndex + i] = i32(floor(255.0 * values[i])); + } + } + } + `}},Ule={kernelName:Yu,backendName:"webgpu",kernelFunc:jle},Ho,Bm=V().getBool("CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU"),dc=new Map;function jle(e){let{inputs:t,backend:a,attrs:n}=e,{pixels:r}=t,{numChannels:s}=n;if(r==null)throw new Error("pixels passed to tf.browser.fromPixels() can not be null");let i=typeof HTMLVideoElement!="undefined"&&r instanceof HTMLVideoElement,o=typeof HTMLImageElement!="undefined"&&r instanceof HTMLImageElement,l=typeof HTMLCanvasElement!="undefined"&&r instanceof HTMLCanvasElement||typeof OffscreenCanvas!="undefined"&&r instanceof OffscreenCanvas,u=typeof ImageBitmap!="undefined"&&r instanceof ImageBitmap,[d,c]=i?[r.videoWidth,r.videoHeight]:[r.width,r.height],p=[c,d,s],h=!1,f=i||o;if(u||l||f){let A;if(h){let $=r;if(!dc.has($)||dc.get($).expired){let M={source:$};dc.set($,a.device.importExternalTexture(M))}A={width:d,height:c,format:null,usage:null,texture:dc.get($)}}else{if(f){let E=V().getBool("CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU");(Ho==null||E!==Bm)&&(Bm=E,Ho=document.createElement("canvas").getContext("2d",{willReadFrequently:Bm})),Ho.canvas.width=d,Ho.canvas.height=c,Ho.drawImage(r,0,0,d,c),r=Ho.canvas}let $=GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING,M="rgba8unorm",I=a.textureManager.acquireTexture(p[1],p[0],M,$);a.queue.copyExternalImageToTexture({source:r},{texture:I},[p[1],p[0]]),A={width:d,height:c,format:M,usage:$,texture:I}}let x=v.sizeFromShape(p),b=v.computeStrides(p),w=new Gle(p,s,h),S=[{type:"uint32",data:[x]},{type:"uint32",data:[s]},{type:"uint32",data:[...b]}],C=a.makeTensorInfo([c,d],"int32"),N=a.tensorMap.get(C.dataId);N.resourceInfo=A;let _=a.runWebGPUProgram(w,[C],"int32",S);return a.disposeData(C.dataId),_}let m=r.data,g=m;if(s!=null&&s!==4){g=new Uint8Array(r.width*r.height*s);let A=m.length,x=0;for(let b=0;b(xValue, -meanValue, offsetValue), vec3(inv, inv, 1.0))); + } + } + `}},qle={kernelName:$i,backendName:"webgpu",kernelFunc:({inputs:e,attrs:t,backend:a})=>{let{x:n,scale:r,offset:s,mean:i,variance:o}=e,{varianceEpsilon:l}=t,u=a,d=[n,i,o],c=null;s!=null&&(c=s.shape,d.push(s));let p=null;r!=null&&(p=r.shape,d.push(r));let h=new Hle(n.shape,i.shape,o.shape,c,p),f=[{type:"float32",data:[l]}];return u.runWebGPUProgram(h,d,n.dtype,f)}};function Xle(e){let{inputs:t,backend:a,attrs:n}=e,{x:r,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:u,dataFormat:d,dilations:c,dimRoundingMode:p,activation:h,leakyreluAlpha:f}=n,m=T.convertConv2DDataFormat(d),g=T.computeConv2DInfo(r.shape,s.shape,l,c,u,p,!1,m);return m9({x:r,filter:s,convInfo:g,backend:a,bias:i,preluActivationWeights:o,leakyreluAlpha:f,activation:h})}var Kle={kernelName:jr,backendName:"webgpu",kernelFunc:Xle};function Zle(e){let{inputs:t,backend:a,attrs:n}=e,{x:r,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:u,dilations:d,dimRoundingMode:c,activation:p,leakyreluAlpha:h}=n,f=d;f==null&&(f=[1,1]),v.assert(T.eitherStridesOrDilationsAreOne(l,f),()=>`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${l} and dilations '${f}'`);let m=T.computeConv2DInfo(r.shape,s.shape,l,f,u,c,!0),g=[r,s],y=i!=null,A=o!=null;y&&g.push(i),A&&g.push(o);let x=[{type:"int32",data:[m.padInfo.top,m.padInfo.left]},{type:"int32",data:[m.inHeight,m.inWidth]}],b;return m.inHeight>4&&m.inWidth>4&&m.strideWidth<=2&&m.inChannels===m.outChannels&&m.dilationHeight===1&&m.dilationWidth===1&&m.inChannels%4===0?b=new y9(m,y,p,A):(b=new A9(m,y,p,A),x.push({type:"int32",data:[m.filterHeight]},{type:"int32",data:[m.filterWidth]},{type:"int32",data:[m.strideHeight,m.strideWidth]},{type:"int32",data:[m.dilationHeight,m.dilationWidth]})),p==="leakyrelu"&&(x.push({type:"float32",data:[h]}),b.uniforms+=" alpha : f32,"),a.runWebGPUProgram(b,g,"float32",x)}var Yle={kernelName:Hr,backendName:"webgpu",kernelFunc:Zle},Jle=class{constructor(e,t){this.variableNames=["A","indices"],this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=t,this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey=`gathernd_${e}`,this.sliceDim=e,this.uniforms=`sliceDim : i32, strides : ${na(e)},`}getUserCode(){let e;return this.sliceDim>1?e="uniforms.strides[j]":e="uniforms.strides",` + ${We("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + var flattenIndex = 0; + for (var j = 0; j < uniforms.sliceDim; j = j + 1) { + let indexTemp = i32(round(getIndices(coords[0], j))); + let strideNum = ${e}; + flattenIndex = flattenIndex + indexTemp * strideNum; + } + + setOutputAtIndex(index, getA(flattenIndex, coords[1])); + } + } + `}};function Qle(e){let{inputs:t,backend:a}=e,{params:n,indices:r}=t,s=r.shape,i=s[s.length-1],o=v.sizeFromShape(n.shape),[l,u,d,c]=T.prepareAndValidate(n,r),p=Re({inputs:{x:r},backend:a,attrs:{shape:[u,i]}}),h=Re({inputs:{x:n},backend:a,attrs:{shape:[v.sizeFromShape(n.shape)/d,d]}});if(a.shouldExecuteOnCPU([n,r])||n.dtype==="string"){let A=a.readSync(r.dataId),x=a.bufferSync(n),b=Oie(A,x,n.dtype,u,i,d,c,n.shape,o);return a.makeTensorInfo(l,n.dtype,b.values)}let f=new Jle(i,[u,d]),m=[{type:"int32",data:[i]},{type:"int32",data:c}],g=a.runWebGPUProgram(f,[h,p],h.dtype,m),y=Re({inputs:{x:g},backend:a,attrs:{shape:l}});return a.disposeData(p.dataId),a.disposeData(h.dataId),a.disposeData(g.dataId),y}var eue={kernelName:_i,backendName:"webgpu",kernelFunc:Qle},tue=class{constructor(e,t){this.variableNames=["A","indices"],this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=e.slice(),this.aShape=e,this.outputShape=t,this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey="gather"}getUserCode(){let e=aue(this.aShape);return` + ${We("index")} { + if (index < uniforms.size) { + let resRC = getCoordsFromIndex(index); + let indexZ = i32(getIndices(resRC.x, resRC.z)); + let inBounds = select(0.0, 1.0, indexZ >= 0 && indexZ < uniforms.aShape[2]); + setOutputAtIndex(index, inBounds * getA(${e})); + } + } + `}};function aue(e){let t=["resRC.x","resRC.y","resRC.z","resRC.w"],a=[];for(let n=0;na.disposeData(C.dataId)),a.makeTensorInfo(u.outputShape,S.dtype,S.values)}let m=new tue(p.shape,f),g=a.runWebGPUProgram(m,[p,h],p.dtype);c.push(g);let y=Re({inputs:{x:g},backend:a,attrs:{shape:u.outputShape}});return c.forEach(A=>a.disposeData(A.dataId)),y}var nue={kernelName:Il,backendName:"webgpu",kernelFunc:v9},rue=ca({opType:Be.GREATER,cpuKernelImpl:Lie,dtype:"bool"}),sue={kernelName:rs,backendName:"webgpu",kernelFunc:rue},iue=ca({opType:Be.GREATER_EQUAL,dtype:"bool",cpuKernelImpl:zie}),oue={kernelName:ss,backendName:"webgpu",kernelFunc:iue},lue=Ht({opType:Se.IS_NAN,dtype:"bool"}),uue={kernelName:Sl,backendName:"webgpu",kernelFunc:lue};function due(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{alpha:s}=n,i=[{type:"float32",data:[s]}],o=new mp(r.shape,Se.LEAKYRELU);return o.uniforms="alpha : f32,",a.runWebGPUProgram(o,[r],"float32",i)}var pue={kernelName:Pi,backendName:"webgpu",kernelFunc:due},cue=ca({opType:Be.LESS,dtype:"bool",cpuKernelImpl:Wie}),hue={kernelName:is,backendName:"webgpu",kernelFunc:cue},fue=ca({opType:Be.LESS_EQUAL,dtype:"bool",cpuKernelImpl:Bie}),mue={kernelName:os,backendName:"webgpu",kernelFunc:fue},gue=Ht({opType:Se.LOG,cpuKernelImpl:Vie}),yue={kernelName:ls,backendName:"webgpu",kernelFunc:gue},Aue=ca({opType:Be.LOGICAL_AND,dtype:"bool"}),xue={kernelName:Oi,backendName:"webgpu",kernelFunc:Aue},bue=Ht({opType:Se.LOGICAL_NOT}),vue={kernelName:Di,backendName:"webgpu",kernelFunc:bue},wue=ca({opType:Be.MAX,cpuKernelImpl:Uie}),kue={kernelName:us,backendName:"webgpu",kernelFunc:wue};function Iue(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{filterSize:s,strides:i,pad:o,dimRoundingMode:l}=n,u=1,d=T.computePool2DInfo(r.shape,s,i,u,o,l);return c9(r,d,"max",a)}var Sue={kernelName:Li,backendName:"webgpu",kernelFunc:Iue};function Tue(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{axis:s,keepDims:i}=n;return gp(r,s,i,"min",a)}var Cue={kernelName:Wi,backendName:"webgpu",kernelFunc:Tue},Nue=ca({opType:Be.MIN,cpuKernelImpl:jie}),Eue={kernelName:ds,backendName:"webgpu",kernelFunc:Nue},Rue=class{constructor(e,t,a){this.uniforms="",this.variableNames=["x"],this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=t.map((n,r)=>n[0]+e[r]+n[1]),this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize),this.xShape=e,t.map((n,r)=>{this.uniforms+=` pad${r} : vec2,`}),this.offset=a==="reflect"?0:1,this.shaderKey=`mirrorPad_${a}`}getUserCode(){let e=this.xShape.length,t=this.xShape.map((l,u)=>`uniforms.pad${u}[0]`).join(","),a=this.xShape.map((l,u)=>`uniforms.pad${u}[0] + uniforms.xShape${e>1?`[${u}]`:""}`).join(","),n=e===1?"start":"start[i]",r=e===1?"end":"end[i]",s=e===1?"outC":"outC[i]",i=na(e),o=e>1?["coords[0]","coords[1]","coords[2]","coords[3]"].slice(0,e):"coords";return` + ${We("index")} { + if (index < uniforms.size) { + let start = ${i}(${t}); + let end = ${i}(${a}); + var outC = getCoordsFromIndex(index); + for (var i = 0; i < ${e}; i = i + 1) { + if (${s} < ${n}) { + ${s} = ${n} * 2 - ${s} - ${this.offset}; + } else if(${s} >= ${r}) { + ${s} = (${r} - 1) * 2 - ${s} + ${this.offset}; + } + } + let coords = outC - start; + setOutputAtIndex(index, getX(${o})); + } + } + `}},Mue={kernelName:Vi,backendName:"webgpu",kernelFunc:({inputs:e,attrs:t,backend:a})=>{let{x:n}=e,{paddings:r,mode:s}=t,i=a,o=r.map(u=>({type:"int32",data:[u[0],u[1]]})),l=new Rue(n.shape,r,s);return i.runWebGPUProgram(l,[n],n.dtype,o)}};function $ue(e){let{inputs:t,backend:a}=e,{x:n}=t;if(a.shouldExecuteOnCPU([n])){let s=a.tensorMap.get(n.dataId),[i,o]=qie(s.values,n.shape,n.dtype);return a.makeTensorInfo(o,n.dtype,i)}let r=new mp(n.shape,Se.NEG);return a.runWebGPUProgram(r,[n],n.dtype)}var _ue={kernelName:Cl,backendName:"webgpu",kernelFunc:$ue};function Fue(e){console.warn("tf.nonMaxSuppression() in webgpu locks the UI thread. Call tf.nonMaxSuppressionAsync() instead");let{inputs:t,backend:a,attrs:n}=e,{boxes:r,scores:s}=t,{maxOutputSize:i,iouThreshold:o,scoreThreshold:l}=n,u=a.readSync(r.dataId),d=a.readSync(s.dataId),{selectedIndices:c}=Tn.nonMaxSuppressionV3Impl(u,d,i,o,l);return a.makeTensorInfo([c.length],"int32",new Int32Array(c))}var Pue={kernelName:Gi,backendName:"webgpu",kernelFunc:Fue};function Oue(e){console.warn("tf.nonMaxSuppression() in webgpu locks the UI thread. Call tf.nonMaxSuppressionAsync() instead");let{inputs:t,backend:a,attrs:n}=e,{boxes:r,scores:s}=t,{maxOutputSize:i,iouThreshold:o,scoreThreshold:l,softNmsSigma:u}=n,d=a.readSync(r.dataId),c=a.readSync(s.dataId),p=i,h=o,f=l,m=u,{selectedIndices:g,selectedScores:y}=Tn.nonMaxSuppressionV5Impl(d,c,p,h,f,m);return[a.makeTensorInfo([g.length],"int32",new Int32Array(g)),a.makeTensorInfo([y.length],"float32",new Float32Array(y))]}var Due={kernelName:Ui,backendName:"webgpu",kernelFunc:Oue};function Bc(e){let{inputs:t,backend:a}=e,{x:n}=t;if(n.dtype==="complex64"){let r=yp({inputs:{input:n},backend:a}),s=Bc({inputs:{x:r},backend:a}),i=qh({inputs:{input:n},backend:a}),o=Bc({inputs:{x:i},backend:a}),l=ou({inputs:{real:s,imag:o},backend:a});return a.disposeData(r.dataId),a.disposeData(s.dataId),a.disposeData(i.dataId),a.disposeData(o.dataId),l}else return go({attrs:{shape:n.shape,dtype:n.dtype,value:n.dtype==="string"?"":0},backend:a})}var zue={kernelName:Hl,backendName:"webgpu",kernelFunc:Bc};function w9(e){let{inputs:t,backend:a}=e,{x:n}=t;if(n.dtype==="string")throw new Error("onesLike is not supported under string dtype");if(n.dtype==="complex64"){let r=yp({inputs:{input:n},backend:a}),s=w9({inputs:{x:r},backend:a}),i=qh({inputs:{input:n},backend:a}),o=Bc({inputs:{x:i},backend:a}),l=ou({inputs:{real:s,imag:o},backend:a});return a.disposeData(r.dataId),a.disposeData(s.dataId),a.disposeData(i.dataId),a.disposeData(o.dataId),l}else return go({attrs:{shape:n.shape,dtype:n.dtype,value:1},backend:a})}var Lue={kernelName:El,backendName:"webgpu",kernelFunc:w9};function Bue(e){let{inputs:t,backend:a,attrs:n}=e,{axis:r}=n;if(t.length===1)return z1({inputs:{input:t[0]},backend:a,attrs:{dim:r}});let s=t[0].shape,i=t[0].dtype;t.forEach(d=>{v.assertShapesMatch(s,d.shape,"All tensors passed to stack must have matching shapes"),v.assert(i===d.dtype,()=>"All tensors passed to stack must have matching dtypes")});let o=[],l=t.map(d=>{let c=z1({inputs:{input:d},backend:a,attrs:{dim:r}});return o.push(c),c}),u=f9({inputs:l,backend:a,attrs:{axis:r}});return o.forEach(d=>a.disposeData(d.dataId)),u}var Wue={kernelName:Ml,backendName:"webgpu",kernelFunc:Bue},Vue=class{constructor(e,t){this.variableNames=["x"],this.uniforms="constantValue : f32,",this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=t.map((a,n)=>a[0]+e[n]+a[1]),this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize),t.map((a,n)=>{this.uniforms+=` pad${n} : vec2,`}),this.xShape=e,this.shaderKey="pad"}getUserCode(){let e=this.xShape.length,t=na(e),a=this.xShape.map((u,d)=>`uniforms.pad${d}[0]`).join(","),n=this.xShape.map((u,d)=>`uniforms.pad${d}[0] + uniforms.xShape${e>1?`[${d}]`:""}`).join(","),r=e>1?`${t}(${a})`:`${a}`,s=e>1?`${t}(${n})`:`${n}`,i=e>1?"any(outC < start)":"outC < start",o=e>1?"any(outC >= end)":"outC >= end",l=e>1?["coords[0]","coords[1]","coords[2]","coords[3]"].slice(0,e):"coords";return` + ${We("index")} { + if (index < uniforms.size) { + let start = ${r}; + let end = ${s}; + let outC = getCoordsFromIndex(index); + + if (${i} || ${o}) { + setOutputAtIndex(index, uniforms.constantValue); + } else { + let coords = outC - start; + setOutputAtIndex(index, getX(${l})); + } + } + } + `}},k9=e=>{let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{paddings:s,constantValue:i}=n;if(s.every(u=>v.arraysEqual(u,[0,0])))return cn({inputs:{x:r},backend:a});if(v.sizeFromShape(r.shape)===0){let u=s.map((d,c)=>d[0]+r.shape[c]+d[1]);return go({backend:a,attrs:{shape:u,value:i,dtype:r.dtype}})}let o=[{type:"float32",data:[i]}];s.map(u=>o.push({type:"int32",data:[u[0],u[1]]}));let l=new Vue(r.shape,s);return a.runWebGPUProgram(l,[r],r.dtype,o)},Gue={kernelName:ji,backendName:"webgpu",kernelFunc:k9},Uue=ca({opType:Be.POW}),jue={kernelName:Hi,backendName:"webgpu",kernelFunc:Uue};function Hue(e){let{inputs:t,backend:a}=e,{x:n,alpha:r}=t,s=new _1(Be.PRELU,n.shape,r.shape);return a.runWebGPUProgram(s,[n,r],"float32")}var que={kernelName:qi,backendName:"webgpu",kernelFunc:Hue};function Xue(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{axis:s,keepDims:i}=n;return gp(r,s,i,"prod",a)}var Kue={kernelName:Xi,backendName:"webgpu",kernelFunc:Xue},Zue=e=>{let{backend:t,attrs:a}=e,{start:n,stop:r,step:s,dtype:i}=a,o=Zie(n,r,s,i);return t.makeTensorInfo([o.length],i,o)},Yue={kernelName:$l,backendName:"webgpu",kernelFunc:Zue},I9=ca({opType:Be.DIV}),Jue={kernelName:Ci,backendName:"webgpu",kernelFunc:I9},Que=Ht({opType:Se.RECIPROCAL}),ede={kernelName:_l,backendName:"webgpu",kernelFunc:Que},tde=Ht({opType:Se.RELU}),ade={kernelName:Ki,backendName:"webgpu",kernelFunc:tde},nde=Ht({opType:Se.RELU6}),rde={kernelName:Ji,backendName:"webgpu",kernelFunc:nde},sde=class{constructor(e,t,a){this.variableNames=["x"],this.uniforms="adjustHeightWidth : vec2, halfPixelCenters : f32,",this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=[e[0],t,a,e[3]],this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey="resizeBilinear"}getUserCode(){return` + ${We("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + let b = coords[0]; + let d = coords[3]; + let rc = coords.yz; + + let effectiveInSize = vec2( + f32(uniforms.xShape.y) - uniforms.adjustHeightWidth[0], + f32(uniforms.xShape.z) - uniforms.adjustHeightWidth[1]); + + let effectiveOutSize = vec2( + f32(uniforms.outShape.y) - uniforms.adjustHeightWidth[0], + f32(uniforms.outShape.z) - uniforms.adjustHeightWidth[1]); + + let effectiveInputOverOutputRatioRC = + effectiveInSize / effectiveOutSize; + + // Fractional source index + let sourceFracIndexRC = + (vec2(rc) + vec2(uniforms.halfPixelCenters)) * + effectiveInputOverOutputRatioRC - vec2(uniforms.halfPixelCenters); + + // Compute the four integer indices. + let sourceFloorRC = vec2(sourceFracIndexRC); + let sourceCeilRC = vec2( + min(vec2(uniforms.xShape.yz) - vec2(1.0), ceil(sourceFracIndexRC))); + + let topLeft = getX(b, sourceFloorRC.x, sourceFloorRC.y, d); + let bottomLeft = getX(b, sourceCeilRC.x, sourceFloorRC.y, d); + let topRight = getX(b, sourceFloorRC.x, sourceCeilRC.y, d); + let bottomRight = getX(b, sourceCeilRC.x, sourceCeilRC.y, d); + + let fracRC = sourceFracIndexRC - vec2(sourceFloorRC); + + let top = topLeft + (topRight - topLeft) * fracRC.y; + let bottom = bottomLeft + (bottomRight - bottomLeft) * fracRC.y; + let newValue = top + (bottom - top) * fracRC.x; + + setOutputAtIndex(index, newValue); + } + } + `}};function ide(e){let{inputs:t,backend:a,attrs:n}=e,{images:r}=t,{alignCorners:s,size:i,halfPixelCenters:o}=n,[l,u]=i,d=s&&l>1?1:0,c=s&&u>1?1:0,p=[{type:"float32",data:[d,c]},{type:"float32",data:[o?.5:0]}],h=new sde(r.shape,l,u);return a.runWebGPUProgram(h,[r],"float32",p)}var ode={kernelName:Yi,backendName:"webgpu",kernelFunc:ide},lde=class{constructor(e,t,a,n){this.variableNames=["x"],this.uniforms="adjustHeightWidth : vec2, roundBase : f32,",this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=[e[0],t,a,e[3]],this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize),this.halfPixelCenters=n,this.shaderKey=`resizeNearest_${n}`}getUserCode(){let e;return this.halfPixelCenters?e="max((vec2(rc) + vec2(0.5)) * effectiveInputOverOutputRatioRC, vec2(0.0))":e="vec2(rc) * effectiveInputOverOutputRatioRC",` + ${We("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + let b = coords[0]; + let d = coords[3]; + let rc = coords.yz; + + let effectiveInSize = vec2( + f32(uniforms.xShape.y) - uniforms.adjustHeightWidth[0], + f32(uniforms.xShape.z) - uniforms.adjustHeightWidth[1]); + + let effectiveOutSize = vec2( + f32(uniforms.outShape.y) - uniforms.adjustHeightWidth[0], + f32(uniforms.outShape.z) - uniforms.adjustHeightWidth[1]); + + let effectiveInputOverOutputRatioRC = + effectiveInSize / effectiveOutSize; + + // Fractional source index + let sourceFracIndexRC = ${e}; + + // Compute the coordinators of nearest neighbor point. + let inputShapeRC = vec2(f32(uniforms.xShape.y), f32(uniforms.xShape.z)); + let sourceNearestRC = vec2( + min(inputShapeRC - 1.0, floor(sourceFracIndexRC + uniforms.roundBase))); + let newValue = getX(b, sourceNearestRC.x, sourceNearestRC.y, d); + + setOutputAtIndex(index, newValue); + } + } + `}};function ude(e){let{inputs:t,backend:a,attrs:n}=e,{images:r}=t,{alignCorners:s,halfPixelCenters:i,size:o}=n,[l,u]=o,d=s&&l>1?1:0,c=s&&u>1?1:0,p=[{type:"float32",data:[d,c]},{type:"float32",data:[s?.5:0]}],h=new lde(r.shape,l,u,i);return a.runWebGPUProgram(h,[r],r.dtype,p)}var dde={kernelName:Zi,backendName:"webgpu",kernelFunc:ude},pde=class{constructor(e,t){this.outputShape=[],this.variableNames=["x"],this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=e,this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize),this.uniforms=`centerX : f32, centerY : f32, sinRadians : f32, + cosRadians : f32,`,this.shaderKey="rotate",this.outputShape=e,typeof t=="number"?(this.uniforms+=" fillValue : f32,",this.fillSnippet="var outputValue = uniforms.fillValue;",this.shaderKey+="_float"):(this.uniforms+=" fillValue : vec3,",this.fillSnippet="var outputValue = uniforms.fillValue[coords[3]];",this.shaderKey+="_vec3")}getUserCode(){return` + ${We("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + let coordXFloat = (f32(coords[2]) - uniforms.centerX) * + uniforms.cosRadians - (f32(coords[1]) - uniforms.centerY) * + uniforms.sinRadians; + let coordYFloat = (f32(coords[2]) - uniforms.centerX) * + uniforms.sinRadians + (f32(coords[1]) - uniforms.centerY) * + uniforms.cosRadians; + let coordX = i32(round(coordXFloat + uniforms.centerX)); + let coordY = i32(round(coordYFloat + uniforms.centerY)); + ${this.fillSnippet} + if(coordX >= 0 && coordX < uniforms.xShape[2] && coordY >= 0 && + coordY < uniforms.xShape[1]) { + outputValue = getX(coords[0], coordY, coordX, coords[3]); + } + setOutputAtIndex(index, outputValue); + } + } + `}},cde={kernelName:lo,backendName:"webgpu",kernelFunc:({inputs:e,attrs:t,backend:a})=>{let{image:n}=e,{radians:r,fillValue:s,center:i}=t,o=a,l=new pde(n.shape,s),[u,d]=T.getImageCenter(i,n.shape[1],n.shape[2]),c=[{type:"float32",data:[u]},{type:"float32",data:[d]},{type:"float32",data:[Math.sin(r)]},{type:"float32",data:[Math.cos(r)]}];return typeof s=="number"?c.push({type:"float32",data:[Number.parseFloat(s.toFixed(2))]}):c.push({type:"float32",data:s}),o.runWebGPUProgram(l,[n],n.dtype,c)}},hde=Ht({opType:Se.RSQRT,cpuKernelImpl:Yie}),fde={kernelName:hs,backendName:"webgpu",kernelFunc:hde},xc=class{constructor(e,t,a,n,r,s,i,o=!0){this.variableNames=["updates","indices"],this.workGroupSize=[64,1,1],this.atomic=!0,this.outputShape=s,this.type=i,this.sumDupeIndices=o,this.dispatchLayout=Ye(e),this.dispatch=Me(this.dispatchLayout,e,this.workGroupSize),this.sliceDimGreaterThanOne=t>1,this.shaderKey=`scatter_${a}_${n}_${this.sliceDimGreaterThanOne}_${i}_${o}`;let l=na(r.length);this.uniforms=`sliceDim : i32, strides: ${l}, size: i32,`,this.updatesRank=n,this.indicesRank=a}getUserCode(){let e="";this.indicesRank===1?e="coords[0]":this.indicesRank===2&&(e="coords[0], j");let t=`getIndices(${e})`,a=this.sliceDimGreaterThanOne?"uniforms.strides[j]":"uniforms.strides",n="",r="";this.dispatchLayout.x.length===1?(n="flattenedIndex",r=` + fn getUpdatesCoordsFromFlatIndex(index : i32) -> i32 { + return index; + } + `):this.dispatchLayout.x.length===2&&(n="vec2(flattenedIndex, coords[1])",r=` + fn getUpdatesCoordsFromFlatIndex(index : i32) -> vec2 { + // N.B. |updates| could be a scalar tensor, conceptually representing a + // 2D tensor with all values equal to that. By design, its size must be + // the same as |outShape[1]| in one dimension, and |indicesShape[0]| + // gives the other. + let sliceSize = uniforms.outShape[1]; + let d0 = index / sliceSize; + let d1 = index - d0 * sliceSize; + return vec2(d0, d1); + } + `);let s=`getUpdates(${Array.from({length:this.updatesRank},(o,l)=>`coords[${l}]`).join(", ")})`,i=(o,l)=>{let u=`atomicAdd(${o}, bitcast(${l}))`;this.type==="float32"&&(u=` + { + var oldBits = 0; + var newBits = bitcast(${l}); + loop { + let info = atomicCompareExchangeWeak(${o}, oldBits, newBits); + if (info.exchanged) { + break; + } + oldBits = info.old_value; + let oldValue = bitcast(oldBits); + let newValue = oldValue + (${l}); + newBits = bitcast(newValue); + } + } + `);let d=`atomicStore(${o}, bitcast(${l}));`;return this.sumDupeIndices?u:d};return` + ${r} + + ${We("index")} { + if (index < uniforms.size) { + let coords = getUpdatesCoordsFromFlatIndex(index); + var flattenedIndex = 0; + for (var j = 0; j < uniforms.sliceDim; j = j + 1) { + let indexInside = i32(round(${t})); + flattenedIndex = flattenedIndex + indexInside * ${a}; + } + let updateValue = + ${Ku(this.type,!1)}(${s}); + let flatIndex = getOutputIndexFromCoords(${n}); + + ${i("&result[flatIndex]","updateValue")}; + } + }`}};function mde(e){let{inputs:t,backend:a,attrs:n}=e,{indices:r,updates:s}=t,{shape:i}=n,{sliceRank:o,numUpdates:l,sliceSize:u,strides:d,outputSize:c}=T.calculateShapes(s,r,i),p=[c/u,u];if(c===0)return a.makeTensorInfo(i,r.dtype);let h=Re({inputs:{x:r},backend:a,attrs:{shape:[l,o]}}),f=Re({inputs:{x:s},backend:a,attrs:{shape:[l,u]}}),m=f.dtype,g=go({backend:a,attrs:{shape:p,value:0,dtype:m}}),y=v.sizeFromShape(f.shape),A=[{type:"int32",data:[o]},{type:"int32",data:d},{type:"int32",data:[y]}],x=new xc(f.shape,o,h.shape.length,f.shape.length,d,p,m),b=a.runWebGPUProgram(x,[f,h],m,A,g),w=Re({inputs:{x:b},backend:a,attrs:{shape:i}});return a.disposeData(h.dataId),a.disposeData(f.dataId),a.disposeData(b.dataId),w}var gde={kernelName:Qi,backendName:"webgpu",kernelFunc:mde},yde=class{constructor(e,t,a){this.variableNames=["c","a","b"],this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=t,this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize),this.cRank=e,this.rank=a,this.shaderKey="select"}getUserCode(){let e,t;if(this.rank>4)throw Error(`Where for rank ${this.rank} is not yet supported`);if(this.rank===1)t="resRC",e="resRC";else{let a=["resRC.x","resRC.y","resRC.z","resRC.w"],n=[],r=[];for(let s=0;s= 1.0) { + setOutputAtIndex(index, getA(${t})); + } else { + setOutputAtIndex(index, getB(${t})); + } + } + } + `}};function Ade(e){let{inputs:t,backend:a}=e,{condition:n,t:r,e:s}=t,i=new yde(n.shape.length,r.shape,r.shape.length);return a.runWebGPUProgram(i,[n,r,s],ra(r.dtype,s.dtype))}var xde={kernelName:Dl,backendName:"webgpu",kernelFunc:Ade},bde=Ht({opType:Se.SIGMOID}),vde={kernelName:fs,backendName:"webgpu",kernelFunc:bde},wde=Ht({opType:Se.SIN}),kde={kernelName:eo,backendName:"webgpu",kernelFunc:wde},Ide=Ht({opType:Se.SINH}),Sde={kernelName:Ll,backendName:"webgpu",kernelFunc:Ide},S9=ca({opType:Be.SUB,cpuKernelImpl:noe,supportsComplex:!0}),Tde={kernelName:ys,backendName:"webgpu",kernelFunc:S9};function Cde(e){let{inputs:t,backend:a,attrs:n}=e,{logits:r}=t,{dim:s}=n,i=v.parseAxisParam([s],r.shape),o=X3({inputs:{x:r},backend:a,attrs:{reductionIndices:i,keepDims:!1}}),l=T.expandShapeToKeepDim(o.shape,i),u=Re({inputs:{x:o},backend:a,attrs:{shape:l}}),d=S9({inputs:{a:r,b:u},backend:a}),c=b9({inputs:{x:d},backend:a}),p=K3({inputs:{x:c},backend:a,attrs:{axis:i,keepDims:!1}}),h=Re({inputs:{x:p},backend:a,attrs:{shape:l}}),f=I9({inputs:{a:c,b:h},backend:a});return a.disposeData(o.dataId),a.disposeData(u.dataId),a.disposeData(d.dataId),a.disposeData(c.dataId),a.disposeData(p.dataId),a.disposeData(h.dataId),f}var Nde={kernelName:ao,backendName:"webgpu",kernelFunc:Cde},Ede=e=>{let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{blockShape:s,paddings:i}=n;v.assert(r.shape.length<=4,()=>"spaceToBatchND for rank > 4 with a WebGPU backend not implemented yet");let o=s.reduce((y,A)=>y*A),l=[[0,0]];l.push(...i);for(let y=1+s.length;ya.disposeData(y.dataId)),g},Rde={kernelName:Bl,backendName:"webgpu",kernelFunc:Ede},Mde=class{constructor(e,t){this.variableNames=["A"],this.workGroupSize=[64,1,1],this.size=!0;let a=new Array(e.length);for(let n=0;n=5)throw Error(`Tile for rank ${e} is not yet supported`);if(e===1)return`(resRC % ${t}aShape)`;let a=["resRC.x","resRC.y","resRC.z","resRC.w"],n=[];for(let r=0;r=5){let o=a.readSync(r.dataId),l=r.dtype==="string"?o.map(c=>v.decodeString(c)):o,u=ve(r.shape,r.dtype,l),d=roe(u,s);return a.makeTensorInfo(d.shape,d.dtype,d.values)}let i=new Mde(r.shape,s);return a.runWebGPUProgram(i,[r],r.dtype)}var _de={kernelName:As,backendName:"webgpu",kernelFunc:T9};function Fde(e){let{inputs:t,backend:a,attrs:n}=e,{sparseIndices:r,sparseValues:s,defaultValue:i}=t,{outputShape:o}=n,{sliceRank:l,numUpdates:u,sliceSize:d,strides:c,outputSize:p}=T.calculateShapes(s,r,o),h=!1;if(s.dtype==="string"){let N=a.bufferSync(r),_=a.bufferSync(s),$=v.decodeString(a.readSync(i.dataId)[0]),M=Jie(N,_,o,p,d,u,l,c,$,h);return a.makeTensorInfo(o,M.dtype,M.values)}let f=[p/d,d],m=Re({inputs:{x:r},backend:a,attrs:{shape:[u,l]}}),g=s.shape.length?Re({inputs:{x:s},backend:a,attrs:{shape:[u,d]}}):cn({inputs:{x:s},backend:a}),y=g.dtype,A=a.makeTensorInfo([],y,v.makeZerosTypedArray(1,y)),x=Re({inputs:{x:i},backend:a,attrs:{shape:Array(f.length).fill(1)}}),b=T9({inputs:{x},backend:a,attrs:{reps:f}}),w=v.sizeFromShape([u,d]),S=[{type:"int32",data:[l]},{type:"int32",data:c},{type:"int32",data:[w]}];switch(u){case 0:break;case 1:{let N=new xc([u,d],l,m.shape.length,g.shape.length,c,f,y,h);a.runWebGPUProgram(N,[g,m],y,S,b)}break;default:{let N=new xc([u,d],l,m.shape.length,A.shape.length,c,f,y,h);a.runWebGPUProgram(N,[A,m],y,S,b)}{let N=new xc([u,d],l,m.shape.length,g.shape.length,c,f,y);a.runWebGPUProgram(N,[g,m],y,S,b)}}let C=Re({inputs:{x:b},backend:a,attrs:{shape:o}});return a.disposeData(m.dataId),a.disposeData(g.dataId),a.disposeData(x.dataId),a.disposeData(A.dataId),a.disposeData(b.dataId),C}var Pde={kernelName:Ld,backendName:"webgpu",kernelFunc:Fde};function Ode(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{numOrSizeSplits:s,axis:i}=n,o=v.parseAxisParam(i,r.shape)[0],l=T.prepareSplitSize(r,s,o),u=r.shape.length,d=new Array(u).fill(0),c=r.shape.slice();return l.map(p=>{let h=[...c];h[o]=p;let f=uu({inputs:{x:r},backend:a,attrs:{begin:d,size:h}});return d[o]+=p,f})}var Dde={kernelName:Wl,backendName:"webgpu",kernelFunc:Ode},zde=Ht({opType:Se.SQRT}),Lde={kernelName:ms,backendName:"webgpu",kernelFunc:zde},Bde={kernelName:Bd,backendName:"webgpu",kernelFunc:({inputs:e,backend:t})=>{let{x:a}=e,n=t,r=new mp(a.shape,Se.SQUARE);return n.runWebGPUProgram(r,[a],a.dtype)}},Wde=ca({opType:Be.SQUARED_DIFFERENCE}),Vde={kernelName:gs,backendName:"webgpu",kernelFunc:Wde},Gde=class{constructor(e){this.variableNames=["x"],this.workPerThread=1,this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=e,this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize,[this.workPerThread,1,1]);let t=na(this.outputShape.length);this.uniforms=`begin : ${t}, strides : ${t}, `,this.shaderKey="stridedSlice"}getUserCode(){let e=this.outputShape.length,t="";if(e===1)t="coords * uniforms.strides + uniforms.begin";else{let a=0;t=this.outputShape.map((n,r)=>(a++,this.outputShape.length===1?`coords * uniforms.strides[${r}] + uniforms.begin[${r}]`:`coords[${a-1}] * uniforms.strides[${r}] + uniforms.begin[${r}]`)).join(",")}return` + ${We("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + setOutputAtIndex(index, getX(${t})); + } + } + `}};function Ude(e){let{inputs:t,backend:a,attrs:n}=e,{x:r}=t,{begin:s,end:i,strides:o,beginMask:l,endMask:u,ellipsisMask:d,newAxisMask:c,shrinkAxisMask:p}=n,{finalShapeSparse:h,finalShape:f,isIdentity:m,sliceDim0:g,isSimpleSlice:y,begin:A,end:x,strides:b}=At.sliceInfo(r.shape,s,i,o,l,u,d,c,p),w;if(m)w=Re({inputs:{x:r},backend:a,attrs:{shape:f}});else if(g||y){v.assert(r.shape.length>=1,()=>`Input must have rank at least 1, got: ${r.shape.length}`);let S=At.computeOutShape(A,x,b),C=uu({inputs:{x:r},backend:a,attrs:{begin:A,size:S}});w=Re({inputs:{x:C},backend:a,attrs:{shape:f}}),a.disposeData(C.dataId)}else if(a.shouldExecuteOnCPU([r])){let S=a.readSync(r.dataId),C=ve(r.shape,r.dtype,S),N=toe(h,C,b,A);w=a.makeTensorInfo(f,r.dtype,N.values)}else{let S=new Gde(h),C=[{type:"int32",data:A},{type:"int32",data:b}],N=a.runWebGPUProgram(S,[r],r.dtype,C);w=Re({inputs:{x:N},backend:a,attrs:{shape:f}}),a.disposeData(N.dataId)}return w}var jde={kernelName:no,backendName:"webgpu",kernelFunc:Ude};function Hde(e){let{inputs:t,backend:a,attrs:n}=e,{separator:r,nGramWidths:s,leftPad:i,rightPad:o,padWidth:l,preserveShortSequences:u}=n,{data:d,dataSplits:c}=t,p=a.readSync(d.dataId),h=a.readSync(c.dataId),[f,m]=aoe(p,h,r,s,i,o,l,u);return[a.makeTensorInfo([f.length],"string",f),a.makeTensorInfo(c.shape,"int32",m)]}var qde={kernelName:Gl,backendName:"webgpu",kernelFunc:Hde},Xde=Ht({opType:Se.TANH}),Kde={kernelName:ro,backendName:"webgpu",kernelFunc:Xde},Zde=class{constructor(e){this.variableNames=["x","indices"],this.workGroupSize=[256,1,1],this.size=!0,this.outputShape=e,this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize),this.uniforms=`inputSize : i32, firstPass : i32, negativeInf : f32, + dir : i32, inc : i32,`,this.shaderKey="swap"}getUserCode(){return` + ${We("index")} { + if (index < uniforms.size) { + let outC = getCoordsFromIndex(index); + let batch = outC[0]; + let elemIdx = outC[1]; + // We compare elements pair-wise within a group of size 2 * inc. + // The comparing rule for each group alternates between ascending + // and descending. Within each group, we compare each pair at + // positions i and i+inc. To decide whether an element at position i + // is x0 or x1, we mod it by 2 * inc, if the result is smaller than + // inc, it is in the first half of the group, we denote it as x0, + // otherwise we denote it as x1. + // For example, as shown in the Bitonic top K paper referenced + // above, Figure5(a) shows that element[1] is in the second half of + // the group when group size is 2, but it is in the first half of + // the group when group size is 4. + let isFirstInPair = elemIdx % (2 * uniforms.inc) < uniforms.inc; + var i = 0; + if (isFirstInPair) { + i = elemIdx; + } else { + i = elemIdx - uniforms.inc; + } + + var i0 = 0; + if (uniforms.firstPass == 1) { + i0 = i; + } else { + i0 = i32(getIndices(batch, i)); + } + + var i1 = 0; + if (uniforms.firstPass == 1) { + i1 = i + uniforms.inc; + } else { + i1 = i32(getIndices(batch, i + uniforms.inc)); + } + + var x0 = f32(0.0); + var x1 = f32(0.0); + if (i0 < uniforms.inputSize) { + x0 = getX(batch, i0); + } else { + x0 = uniforms.negativeInf; + } + if (i1 < uniforms.inputSize) { + x1 = getX(batch, i1); + } else { + x1 = uniforms.negativeInf; + } + + let reverse = elemIdx % (2 * uniforms.dir) >= uniforms.dir; + let isGreater = x0 > x1 || (x0 == x1 && i1 > i0); + if (reverse == isGreater) { + // Elements in opposite order of direction + let iTemp = i0; + i0 = i1; + i1 = iTemp; + } + if (isFirstInPair) { + setOutputAtIndex(index, f32(i0)); + } else { + setOutputAtIndex(index, f32(i1)); + } + } + } + `}},Yde=class{constructor(e){this.variableNames=["x","indices"],this.workGroupSize=[256,1,1],this.size=!0,this.outputShape=e,this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize),this.uniforms="inputSize : i32, firstPass : i32, k : i32,",this.shaderKey="merge"}getUserCode(){return` + ${We("index")} { + if (index < uniforms.size) { + let outC = getCoordsFromIndex(index); + let batch = outC[0]; + let elemIdx = outC[1]; + // The output size is half of the previous size. + // If the previous sequence is | | | | _ _ _ _ | | | | _ _ _ _ + // (k=4), we only need to output the indices at positions |, the + // indices at positions _ can be thrown away, see Figure5(b) After + // Phase 2 (Merge phase) in the Bitonic Top K paper referenced + // above. + // For example, the paper shows we only need to output the orange + // bars. The output sequence should look like this | | | | | | | |. + // Because the sequence is halved, to map the output index back to + // the previous sequence to find the corresponding value, we need + // to double the index. When we double the index, we basically + // interpolate a position, so 2i looks like + // | _ | _ | _ | _ | _ | _ | _. We move the | to the first k + // position of each 2k positions by - elemIdx % k. E.g. for output + // at index 4,5,6,7, we want to get the corresponding element at + // original index 8,9,10,11, for output at index 8,9,10,11, + // we want to get the corresponding element at original index + // 16,17,18,19, so on and so forth. + + var i = 0; + if (elemIdx < uniforms.k) { + i = elemIdx; + } else { + i = elemIdx * 2 - elemIdx % uniforms.k; + } + var i0 = 0; + if (uniforms.firstPass == 1) { + i0 = i; + } else { + i0 = i32(getIndices(batch, i)); + } + var i1 = 0; + if (uniforms.firstPass == 1) { + i1 = i + uniforms.k; + } else { + i1 = i32(getIndices(batch, i + uniforms.k)); + } + + let x0 = getX(batch, i0); + var x1 = f32(0.0); + if (i1 < uniforms.inputSize) { + x1 = getX(batch, i1); + } else { + x1 = x0; + } + + if (x0 >= x1) { + setOutputAtIndex(index, f32(i0)); + } else { + setOutputAtIndex(index, f32(i1)); + } + } + } + `}};function qo(e,t){t!==null&&e.disposeData(t.dataId)}function uA(e){let t=1;for(;th===null?[d,d]:[d,h],m=(b,w,S)=>{let C=f(),N=new Zde(S),_=[{type:"int32",data:[l]},{type:"int32",data:[h===null?1:0]},{type:"float32",data:[Number.NEGATIVE_INFINITY]},{type:"int32",data:[b]},{type:"int32",data:[w]}],$=h;h=a.runWebGPUProgram(N,C,"int32",_),qo(a,$)};for(let b=1;b=1;S/=2)m(w,S,[u,p])}for(let b=p;b>c;b/=2){let w=f(),S=new Yde([u,b/2]),C=[{type:"int32",data:[l]},{type:"int32",data:[h===null?1:0]},{type:"int32",data:[c]}],N=h;h=a.runWebGPUProgram(S,w,"int32",C),qo(a,N);let _=c/2,$=_*2;for(let M=_;M>=1;M/=2)m($,M,h.shape)}let g=h;h=uu({inputs:{x:h},backend:a,attrs:{begin:0,size:[u,s]}}),qo(a,g);let y=v9({inputs:{x:d,indices:h},backend:a,attrs:{axis:1,batchDims:1}});qo(a,d);let A=o.slice(0,-1);A.push(s),g=h,h=Re({inputs:{x:h},attrs:{shape:A},backend:a}),qo(a,g);let x=y;return y=Re({inputs:{x:y},attrs:{shape:A},backend:a}),qo(a,x),[y,h]}var Qde={kernelName:so,backendName:"webgpu",kernelFunc:Jde},epe=class{constructor(e){this.variableNames=["Image","Transforms"],this.uniforms="interpolationModeId : i32, fillModeId : i32, fillValue : f32,",this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=e,this.dispatchLayout=Ye(this.outputShape),this.dispatch=Me(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey="transform"}getUserCode(){return` + fn mapCoord(outCoord : f32, len : f32) -> f32{ + var inCoord = outCoord; + if(uniforms.fillModeId == 2) { + if (inCoord < 0.0) { + if (len <= 1.0) { + inCoord = 0.0; + } else { + let sz2 = 2.0 * len; + if (inCoord < sz2) { + inCoord = sz2 * f32(i32(f32(-inCoord / sz2))) + + inCoord; + } + if (inCoord < -len) { + inCoord = inCoord + sz2; + } else { + inCoord = -inCoord - 1.0; + } + } + } else if (inCoord > len - 1.0) { + if (len <= 1.0) { + inCoord = 0.0; + } else { + let sz2 = 2.0 * len; + inCoord = inCoord - sz2 * f32(i32(f32(inCoord / sz2))); + if (inCoord >= len) { + inCoord = sz2 - inCoord - 1.0; + } + } + } + return clamp(inCoord, 0.0, len - 1.0); + } else if (uniforms.fillModeId == 3) { + if (inCoord < 0.0) { + if (len <= 1.0) { + inCoord = 0.0; + } else { + let sz = len - 1.0; + inCoord = inCoord + len * (f32(i32(f32(-inCoord / sz))) + 1.0); + } + } else if (inCoord > len - 1.0) { + if (len <= 1.0) { + inCoord = 0.0; + } else { + let sz = len - 1.0; + inCoord = inCoord - len * f32(i32(f32(inCoord / sz))); + } + } + return clamp(inCoord, 0.0, len - 1.0); + } else if (uniforms.fillModeId == 4) { + return clamp(outCoord, 0.0, len - 1.0); + } + return outCoord; + } + fn readWithFillValue(batch : i32, coordY : i32, coordX : i32, + channel : i32) -> f32 { + var outputValue : f32; + if (0 <= coordY && coordY < uniforms.imageShape[1] && 0 <= coordX && coordX < uniforms.imageShape[2]) { + outputValue = getImage(batch, coordY, coordX, channel); + } else { + outputValue = uniforms.fillValue; + } + return outputValue; + } + + ${We("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + var outputValue : f32; + let batch = coords[0]; + let x = coords[2]; + let y = coords[1]; + let channel = coords[3]; + let xf = f32(x); + let yf = f32(y); + let a1 = getTransforms(batch, 0); + let a2 = getTransforms(batch, 1); + let a3 = getTransforms(batch, 2); + let b1 = getTransforms(batch, 3); + let b2 = getTransforms(batch, 4); + let b3 = getTransforms(batch, 5); + let c1 = getTransforms(batch, 6); + let c2 = getTransforms(batch, 7); + let projection = c1 * xf + c2 * yf + 1.0; + if (projection == 0.0) { + outputValue = uniforms.fillValue; + } else { + let inX = (a1 * xf + a2 * yf + a3) / projection; + let inY = (b1 * xf + b2 * yf + b3) / projection; + let mapX = mapCoord(inX, f32(uniforms.imageShape[2])); + let mapY = mapCoord(inY, f32(uniforms.imageShape[1])); + + if (uniforms.interpolationModeId == 1) { + let coordY = i32(round(mapY)); + let coordX = i32(round(mapX)); + outputValue = readWithFillValue(batch, coordY, coordX, + channel); + } else { + let yFloor = floor(mapY); + let xFloor = floor(mapX); + let yCeil = yFloor + 1.0; + let xCeil = xFloor + 1.0; + let valueYFloor = (xCeil - mapX) * + readWithFillValue(batch, i32(yFloor), i32(xFloor), channel) + + (mapX - xFloor) * + readWithFillValue(batch, i32(yFloor), i32(xCeil), channel); + let valueYCeil = (xCeil - mapX) * + readWithFillValue(batch, i32(yCeil), i32(xFloor), channel) + + (mapX - xFloor) * + readWithFillValue(batch, i32(yCeil), i32(xCeil), channel); + outputValue = (yCeil - mapY) * valueYFloor + + (mapY - yFloor) * valueYCeil; + } + } + setOutputAtIndex(index, outputValue); + } + } + `}};function tpe(e){let{inputs:t,backend:a,attrs:n}=e,{image:r,transforms:s}=t,{interpolation:i,fillMode:o,fillValue:l,outputShape:u}=n,[d,c,p,h]=r.shape,[f,m]=u!=null?u:[c,p],g=[d,f,m,h],y=new epe(g),A=i==="nearest"?1:2,x;switch(o){case"constant":x=1;break;case"reflect":x=2;break;case"wrap":x=3;break;case"nearest":x=4;break;default:x=1;break}let b=[{type:"int32",data:[A]},{type:"int32",data:[x]},{type:"float32",data:[l]}];return a.runWebGPUProgram(y,[r,s],"float32",b)}var ape={kernelName:io,backendName:"webgpu",kernelFunc:tpe};function npe(e){let{inputs:t,backend:a,attrs:n}=e,{value:r}=t,{axis:s}=n;s<0&&(s+=r.shape.length);let i=r,o=i.shape.length,l=r.shape[s],u=new Array(o-1),d=0;for(let m=0;ma.disposeData(m.dataId)),f}var rpe={kernelName:jl,backendName:"webgpu",kernelFunc:npe},spe=[Lse,loe,doe,hoe,xoe,voe,koe,Eoe,Moe,Ooe,Boe,Voe,Hoe,Wse,Zoe,ale,ole,ule,ple,fle,gle,Ale,vle,Ile,Nle,Rle,$le,_le,Fle,Ole,Ose,zle,Ule,Ble,Vle,qle,Kle,Yle,eue,nue,sue,oue,Bse,Xoe,uue,pue,hue,mue,yue,xue,vue,Toe,kue,Sue,Coe,Cue,Eue,Mue,Sle,_ue,Pue,Due,Doe,Lue,Wue,Gue,jue,que,Kue,Yue,zoe,Jue,ede,ade,rde,Dse,ode,dde,cde,fde,gde,xde,vde,kde,Sde,Foe,jde,qde,Nde,Rde,Pde,Dde,Lde,Bde,Vde,Tde,Tle,Kde,_de,Qde,ape,yoe,rpe,zue];for(let e of spe)hn(e);var dA="4.0.0",ipe="4.0.0",ope="4.0.0",lpe="4.0.0",upe="4.0.0",dpe="0.0.1-alpha.14",Ap={tfjs:dA,"tfjs-core":dA,"tfjs-converter":ipe,"tfjs-backend-cpu":ope,"tfjs-backend-webgl":lpe,"tfjs-backend-wasm":upe,"tfjs-backend-webgpu":dpe};function K(...e){let t=new Date,a=`${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(a,"Human:",...e)}function C9(e,t){let a=e.endsWith("/")?"":"/",r=t.startsWith(".")||t.startsWith("/")||t.startsWith("http:")||t.startsWith("https:")||t.startsWith("file:")?`${t}`:`${e}${a}${t}`;if(!r.toLocaleLowerCase().includes(".json"))throw new Error(`modelpath error: expecting json file: ${r}`);return r}var te=()=>typeof performance!="undefined"?performance.now():parseInt((Number(process.hrtime.bigint())/1e3/1e3).toString());function Z3(e,t,a="config",n=[]){for(let r of Object.keys(t))if(typeof t[r]=="object")Z3(e[r],t[r],r,n);else{let s=e&&typeof e[r]!="undefined";s||n.push({reason:"unknown property",where:`${a}.${r} = ${t[r]}`});let i=e&&typeof e[r]==typeof t[r];s&&!i&&n.push({reason:"property type mismatch",where:`${a}.${r} = ${t[r]}`,expected:typeof e[r]})}return t.debug&&a==="config"&&n.length>0&&K("invalid configuration",n),n}function Tt(...e){let t=a=>a&&typeof a=="object";return e.reduce((a,n)=>(Object.keys(n||{}).forEach(r=>{let s=a[r],i=n[r];Array.isArray(s)&&Array.isArray(i)?a[r]=s.concat(...i):t(s)&&t(i)?a[r]=Tt(s,i):a[r]=i}),a),{})}var yo={backend:"",modelBasePath:"",cacheModels:!0,validateModels:!0,wasmPath:"",wasmPlatformFetch:!1,debug:!1,async:!0,warmup:"full",cacheSensitivity:.7,skipAllowed:!1,deallocate:!1,flags:{},softwareKernels:!1,filter:{enabled:!0,equalization:!1,width:0,height:0,flip:!1,return:!0,autoBrightness:!0,brightness:0,contrast:0,sharpness:0,blur:0,saturation:0,hue:0,negative:!1,sepia:!1,vintage:!1,kodachrome:!1,technicolor:!1,polaroid:!1,pixelate:0},gesture:{enabled:!0},face:{enabled:!0,detector:{modelPath:"blazeface.json",rotation:!0,maxDetected:1,skipFrames:99,skipTime:2500,minConfidence:.2,iouThreshold:.1,mask:!1,return:!1},mesh:{enabled:!0,modelPath:"facemesh.json",keepInvalid:!1},attention:{enabled:!1,modelPath:"facemesh-attention.json"},iris:{enabled:!0,modelPath:"iris.json"},emotion:{enabled:!0,minConfidence:.1,skipFrames:99,skipTime:1500,modelPath:"emotion.json"},description:{enabled:!0,modelPath:"faceres.json",skipFrames:99,skipTime:3e3,minConfidence:.1},antispoof:{enabled:!1,skipFrames:99,skipTime:4e3,modelPath:"antispoof.json"},liveness:{enabled:!1,skipFrames:99,skipTime:4e3,modelPath:"liveness.json"}},body:{enabled:!0,modelPath:"movenet-lightning.json",maxDetected:-1,minConfidence:.3,skipFrames:1,skipTime:200},hand:{enabled:!0,rotation:!0,skipFrames:99,skipTime:1e3,minConfidence:.5,iouThreshold:.2,maxDetected:-1,landmarks:!0,detector:{modelPath:"handtrack.json"},skeleton:{modelPath:"handlandmark-full.json"}},object:{enabled:!1,modelPath:"centernet.json",minConfidence:.2,iouThreshold:.4,maxDetected:10,skipFrames:99,skipTime:2e3},segmentation:{enabled:!1,modelPath:"rvm.json",ratio:.5,mode:"default"}};var N9=` + 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.); + } +`;var E9=` + 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]; + } +`,R9=` + 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; + } +`,M9=` + 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); + } +`,$9=` + 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; + } +`,_9=` + 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); // top left + vec4 c12 = texture2D(texture, vec2(vUv.x, vUv.y - px.y)); // top center + vec4 c13 = texture2D(texture, vec2(vUv.x + px.x, vUv.y - px.y)); // top right + vec4 c21 = texture2D(texture, vec2(vUv.x - px.x, vUv.y) ); // mid left + vec4 c22 = texture2D(texture, vUv); // mid center + vec4 c23 = texture2D(texture, vec2(vUv.x + px.x, vUv.y) ); // mid right + vec4 c31 = texture2D(texture, vec2(vUv.x - px.x, vUv.y + px.y) ); // bottom left + vec4 c32 = texture2D(texture, vec2(vUv.x, vUv.y + px.y) ); // bottom center + vec4 c33 = texture2D(texture, vUv + px ); // bottom right + 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; + } +`;var Y3=(e,t,a)=>{let n=new RegExp("\\b"+t+" \\w+ (\\w+)","ig");e.replace(n,(r,s)=>(a[s]=0,r))},J3=class{constructor(t,a,n){le(this,"uniform",{});le(this,"attribute",{});le(this,"gl");le(this,"id");le(this,"compile",(t,a)=>{let n=this.gl.createShader(a);return n?(this.gl.shaderSource(n,t),this.gl.compileShader(n),this.gl.getShaderParameter(n,this.gl.COMPILE_STATUS)?n:(K(`filter: gl compile failed: ${this.gl.getShaderInfoLog(n)||"unknown"}`),null)):(K("filter: could not create shader"),null)});this.gl=t;let r=this.compile(a,this.gl.VERTEX_SHADER),s=this.compile(n,this.gl.FRAGMENT_SHADER);if(this.id=this.gl.createProgram(),!(!r||!s)){if(!this.id){K("filter: could not create webgl program");return}if(this.gl.attachShader(this.id,r),this.gl.attachShader(this.id,s),this.gl.linkProgram(this.id),!this.gl.getProgramParameter(this.id,this.gl.LINK_STATUS)){K(`filter: gl link failed: ${this.gl.getProgramInfoLog(this.id)||"unknown"}`);return}this.gl.useProgram(this.id),Y3(a,"attribute",this.attribute);for(let i in this.attribute)this.attribute[i]=this.gl.getAttribLocation(this.id,i);Y3(a,"uniform",this.uniform),Y3(n,"uniform",this.uniform);for(let i in this.uniform)this.uniform[i]=this.gl.getUniformLocation(this.id,i)}}};function F9(){let e=0,t=null,a=!1,n=-1,r=[null,null],s=[],i=null,o=null,l=En(100,100),u={},d={INTERMEDIATE:1},c=l.getContext("webgl");if(!c){K("filter: cannot get webgl context");return}this.gl=c;function p(A,x){if(!(A===l.width&&x===l.height)){if(l.width=A,l.height=x,!i){let b=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]);i=c.createBuffer(),c.bindBuffer(c.ARRAY_BUFFER,i),c.bufferData(c.ARRAY_BUFFER,b,c.STATIC_DRAW),c.pixelStorei(c.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0)}c.viewport(0,0,l.width,l.height),r=[null,null]}}function h(A,x){let b=c.createFramebuffer();c.bindFramebuffer(c.FRAMEBUFFER,b);let w=c.createRenderbuffer();c.bindRenderbuffer(c.RENDERBUFFER,w);let S=c.createTexture();return c.bindTexture(c.TEXTURE_2D,S),c.texImage2D(c.TEXTURE_2D,0,c.RGBA,A,x,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,S,0),c.bindTexture(c.TEXTURE_2D,null),c.bindFramebuffer(c.FRAMEBUFFER,null),{fbo:b,texture:S}}function f(A){return r[A]=r[A]||h(l.width,l.height),r[A]}function m(A=0){if(!o)return;let x=null,b=null,w=!1;e===0?x=t:x=f(n).texture||null,e++,a&&!(A&d.INTERMEDIATE)?(b=null,w=e%2===0):(n=(n+1)%2,b=f(n).fbo||null),c.bindTexture(c.TEXTURE_2D,x),c.bindFramebuffer(c.FRAMEBUFFER,b),c.uniform1f(o.uniform.flipY,w?-1:1),c.drawArrays(c.TRIANGLES,0,6)}function g(A){if(u[A])return o=u[A],c.useProgram((o?o.id:null)||null),o;if(o=new J3(c,N9,A),!o)return K("filter: could not get webgl program"),null;let x=Float32Array.BYTES_PER_ELEMENT,b=4*x;return c.enableVertexAttribArray(o.attribute.pos),c.vertexAttribPointer(o.attribute.pos,2,c.FLOAT,!1,b,0*x),c.enableVertexAttribArray(o.attribute.uv),c.vertexAttribPointer(o.attribute.uv,2,c.FLOAT,!1,b,2*x),u[A]=o,o}let y={colorMatrix:A=>{let x=new Float32Array(A);x[4]/=255,x[9]/=255,x[14]/=255,x[19]/=255;let b=x[18]===1&&x[3]===0&&x[8]===0&&x[13]===0&&x[15]===0&&x[16]===0&&x[17]===0&&x[19]===0?R9:E9,w=g(b);!w||(c.uniform1fv(w.uniform.m,x),m())},brightness:A=>{let x=(A||0)+1;y.colorMatrix([x,0,0,0,0,0,x,0,0,0,0,0,x,0,0,0,0,0,1,0])},saturation:A=>{let x=(A||0)*2/3+1,b=(x-1)*-.5;y.colorMatrix([x,b,b,0,0,b,x,b,0,0,b,b,x,0,0,0,0,0,1,0])},desaturate:()=>{y.saturation(-1)},contrast:A=>{let x=(A||0)+1,b=-128*(x-1);y.colorMatrix([x,0,0,0,b,0,x,0,0,b,0,0,x,0,b,0,0,0,1,0])},negative:()=>{y.contrast(-2)},hue:A=>{A=(A||0)/180*Math.PI;let x=Math.cos(A),b=Math.sin(A),w=.213,S=.715,C=.072;y.colorMatrix([w+x*(1-w)+b*-w,S+x*-S+b*-S,C+x*-C+b*(1-C),0,0,w+x*-w+b*.143,S+x*(1-S)+b*.14,C+x*-C+b*-.283,0,0,w+x*-w+b*-(1-w),S+x*-S+b*S,C+x*(1-C)+b*C,0,0,0,0,0,1,0])},desaturateLuminance:()=>{y.colorMatrix([.2764723,.929708,.0938197,0,-37.1,.2764723,.929708,.0938197,0,-37.1,.2764723,.929708,.0938197,0,-37.1,0,0,0,1,0])},sepia:()=>{y.colorMatrix([.393,.7689999,.18899999,0,0,.349,.6859999,.16799999,0,0,.272,.5339999,.13099999,0,0,0,0,0,1,0])},brownie:()=>{y.colorMatrix([.5997023498159715,.34553243048391263,-.2708298674538042,0,47.43192855600873,-.037703249837783157,.8609577587992641,.15059552388459913,0,-36.96841498319127,.24113635128153335,-.07441037908422492,.44972182064877153,0,-7.562075277591283,0,0,0,1,0])},vintagePinhole:()=>{y.colorMatrix([.6279345635605994,.3202183420819367,-.03965408211312453,0,9.651285835294123,.02578397704808868,.6441188644374771,.03259127616149294,0,7.462829176470591,.0466055556782719,-.0851232987247891,.5241648018700465,0,5.159190588235296,0,0,0,1,0])},kodachrome:()=>{y.colorMatrix([1.1285582396593525,-.3967382283601348,-.03992559172921793,0,63.72958762196502,-.16404339962244616,1.0835251566291304,-.05498805115633132,0,24.732407896706203,-.16786010706155763,-.5603416277695248,1.6014850761964943,0,35.62982807460946,0,0,0,1,0])},technicolor:()=>{y.colorMatrix([1.9125277891456083,-.8545344976951645,-.09155508482755585,0,11.793603434377337,-.3087833385928097,1.7658908555458428,-.10601743074722245,0,-70.35205161461398,-.231103377548616,-.7501899197440212,1.847597816108189,0,30.950940869491138,0,0,0,1,0])},polaroid:()=>{y.colorMatrix([1.438,-.062,-.062,0,0,-.122,1.378,-.122,0,0,-.016,-.016,1.483,0,0,0,0,0,1,0])},shiftToBGR:()=>{y.colorMatrix([0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0])},convolution:A=>{let x=new Float32Array(A),b=1/l.width,w=1/l.height,S=g(_9);!S||(c.uniform1fv(S.uniform.m,x),c.uniform2f(S.uniform.px,b,w),m())},detectEdges:()=>{y.convolution.call(this,[0,1,0,1,-4,1,0,1,0])},sobelX:()=>{y.convolution.call(this,[-1,0,1,-2,0,2,-1,0,1])},sobelY:()=>{y.convolution.call(this,[-1,-2,-1,0,0,0,1,2,1])},sharpen:A=>{let x=A||1;y.convolution.call(this,[0,-1*x,0,-1*x,1+4*x,-1*x,0,-1*x,0])},emboss:A=>{let x=A||1;y.convolution.call(this,[-2*x,-1*x,0,-1*x,1,1*x,0,1*x,2*x])},blur:A=>{let x=A/7/l.width,b=A/7/l.height,w=g($9);!w||(c.uniform2f(w.uniform.px,0,b),m(d.INTERMEDIATE),c.uniform2f(w.uniform.px,x,0),m())},pixelate:A=>{let x=A/l.width,b=A/l.height,w=g(M9);!w||(c.uniform2f(w.uniform.size,x,b),m())}};this.add=function(A){let x=Array.prototype.slice.call(arguments,1),b=y[A];s.push({func:b,args:x})},this.reset=function(){s=[]},this.get=function(){return s},this.apply=function(A){p(A.width,A.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,A);for(let x=0;xd.data())),i=Math.max(s[0][0],s[1][0],s[2][0]),l=(i>1?255:1)/i,u;if(l>1){let d=[he(a[0],n[0]),he(a[1],n[1]),he(a[2],n[2])],c=[he(r[0],n[0]),he(r[1],n[1]),he(r[2],n[2])],p=[ae(d[0],l),ae(d[1],l),ae(d[2],l)],h=sa([p[0],p[1],p[2]],2);u=J(h,[1,t.shape[0]||0,t.shape[1]||0,3]),Y([...d,...c,...p])}else u=Gt(t,0);return Y([...a,...n,...r,a,t,e]),u}var Kh=3840,Yt=null,Jt=null,du=null,gt,mn={inputSum:0,cacheDiff:1,sumMethod:0,inputTensor:void 0};function Q3(){mn.inputSum=0,mn.cacheDiff=1,mn.sumMethod=0,mn.inputTensor=void 0}function En(e,t){let a;if(ne.browser)if(ne.worker){if(typeof OffscreenCanvas=="undefined")throw new Error("canvas error: attempted to run in web worker but OffscreenCanvas is not supported");a=new OffscreenCanvas(e,t)}else{if(typeof document=="undefined")throw new Error("canvas error: attempted to run in browser but DOM is not defined");a=document.createElement("canvas"),a.width=e,a.height=t}else typeof ne.Canvas!="undefined"?a=new ne.Canvas(e,t):typeof globalThis.Canvas!="undefined"&&(a=new globalThis.Canvas(e,t));return a}function Zh(e,t){let a=t||En(e.width,e.height);return a.getContext("2d").drawImage(e,0,0),a}async function Yh(e,t,a=!0){var p,h,f;if(!e)return t.debug&&K("input error: input is missing"),{tensor:null,canvas:null};if(!(e instanceof dt)&&!(typeof Image!="undefined"&&e instanceof Image)&&!(typeof ne.Canvas!="undefined"&&e instanceof ne.Canvas)&&!(typeof globalThis.Canvas!="undefined"&&e instanceof globalThis.Canvas)&&!(typeof ImageData!="undefined"&&e instanceof ImageData)&&!(typeof ImageBitmap!="undefined"&&e instanceof ImageBitmap)&&!(typeof HTMLImageElement!="undefined"&&e instanceof HTMLImageElement)&&!(typeof HTMLMediaElement!="undefined"&&e instanceof HTMLMediaElement)&&!(typeof HTMLVideoElement!="undefined"&&e instanceof HTMLVideoElement)&&!(typeof HTMLCanvasElement!="undefined"&&e instanceof HTMLCanvasElement)&&!(typeof OffscreenCanvas!="undefined"&&e instanceof OffscreenCanvas))throw new Error("input error: type is not recognized");if(e instanceof dt){let m=null;if(e.isDisposedInternal)throw new Error("input error: attempted to use tensor but it is disposed");if(!e.shape)throw new Error("input error: attempted to use tensor without a shape");if(e.shape.length===3){if(e.shape[2]===3)m=Gt(e,0);else if(e.shape[2]===4){let g=sp(e,[0,0,0],[-1,-1,3]);m=Gt(g,0),Y(g)}}else e.shape.length===4&&(e.shape[3]===3?m=wa(e):e.shape[3]===4&&(m=bh(e,[0,0,0,0],[-1,-1,-1,3])));if(m==null||m.shape.length!==4||m.shape[0]!==1||m.shape[3]!==3)throw new Error(`input error: attempted to use tensor with unrecognized shape: ${e.shape.toString()}`);if(m.dtype==="int32"){let g=Ue(m,"float32");Y(m),m=g}return{tensor:m,canvas:t.filter.return?Jt:null}}if(typeof e.readyState!="undefined"&&e.readyState<=2)return t.debug&&K("input stream is not ready"),{tensor:null,canvas:Yt};let n=e.naturalWidth||e.videoWidth||e.width||e.shape&&e.shape[1]>0,r=e.naturalHeight||e.videoHeight||e.height||e.shape&&e.shape[2]>0;if(!n||!r)return t.debug&&K("cannot determine input dimensions"),{tensor:null,canvas:Yt};let s=n,i=r;if(s>Kh&&(s=Kh,i=Math.trunc(s*r/n)),i>Kh&&(i=Kh,s=Math.trunc(i*n/r)),(((p=t.filter)==null?void 0:p.width)||0)>0?s=t.filter.width:(((h=t.filter)==null?void 0:h.height)||0)>0&&(s=n*((t.filter.height||0)/r)),(t.filter.height||0)>0?i=t.filter.height:(t.filter.width||0)>0&&(i=r*((t.filter.width||0)/n)),!s||!i)throw new Error("input error: cannot determine dimension");(!Yt||Yt.width!==s||Yt.height!==i)&&(Yt=En(s,i));let o=Yt.getContext("2d");if(typeof ImageData!="undefined"&&e instanceof ImageData?o.putImageData(e,0,0):t.filter.flip&&typeof o.translate!="undefined"?(o.translate(n,0),o.scale(-1,1),o.drawImage(e,0,0,n,r,0,0,Yt.width,Yt.height),o.setTransform(1,0,0,1,0,0)):o.drawImage(e,0,0,n,r,0,0,Yt.width,Yt.height),(!Jt||Yt.width!==Jt.width||Yt.height!==Jt.height)&&(Jt=En(Yt.width,Yt.height)),t.filter.enabled&&ne.webgl.supported?(gt||(gt=ne.browser?new F9:null),ne.filter=!!gt,gt!=null&>.add?(gt.reset(),t.filter.brightness!==0&>.add("brightness",t.filter.brightness),t.filter.contrast!==0&>.add("contrast",t.filter.contrast),t.filter.sharpness!==0&>.add("sharpen",t.filter.sharpness),t.filter.blur!==0&>.add("blur",t.filter.blur),t.filter.saturation!==0&>.add("saturation",t.filter.saturation),t.filter.hue!==0&>.add("hue",t.filter.hue),t.filter.negative&>.add("negative"),t.filter.sepia&>.add("sepia"),t.filter.vintage&>.add("brownie"),t.filter.sepia&>.add("sepia"),t.filter.kodachrome&>.add("kodachrome"),t.filter.technicolor&>.add("technicolor"),t.filter.polaroid&>.add("polaroid"),t.filter.pixelate!==0&>.add("pixelate",t.filter.pixelate),((f=gt.get())==null?void 0:f.length)>1?Jt=gt.apply(Yt):Jt=gt.draw(Yt)):(t.debug&&K("input process error: cannot initialize filters"),ne.webgl.supported=!1,t.filter.enabled=!1,Zh(Yt,Jt))):(Zh(Yt,Jt),gt&&(gt=null),ne.filter=!!gt),!a)return{tensor:null,canvas:Jt};if(!Jt)throw new Error("canvas error: cannot create output");let l,u=3;if(typeof ImageData!="undefined"&&e instanceof ImageData||e.data&&e.width&&e.height)if(ne.browser&&wr)l=wr?wr.fromPixels(e):null;else{u=e.data.length/e.height/e.width;let m=new Uint8Array(e.data.buffer);l=ze(m,[e.height,e.width,u],"int32")}else if((!du||Jt.width!==du.width||Jt.height!==du.height)&&(du=En(Jt.width,Jt.height)),wr&&ne.browser)t.backend==="webgl"||t.backend==="humangl"||t.backend==="webgpu"?l=wr.fromPixels(Jt):(du=Zh(Jt),l=wr.fromPixels(du));else{let y=Zh(Jt).getContext("2d").getImageData(0,0,s,i);u=y.data.length/s/i;let A=new Uint8Array(y.data.buffer);l=ze(A,[s,i,u])}if(u===4){let m=sp(l,[0,0,0],[-1,-1,3]);Y(l),l=m}if(!l)throw new Error("input error: cannot create tensor");let d=Ue(l,"float32"),c=t.filter.equalization?await Xh(d):Gt(d,0);if(Y([l,d]),t.filter.autoBrightness){let m=pa(c),g=await m.data();t.filter.brightness=g[0]>1?1-g[0]/255:1-g[0],Y(m)}return{tensor:c,canvas:t.filter.return?Jt:null}}async function P9(e,t){let a=!1;if(e.cacheSensitivity===0||!t.shape||t.shape.length!==4||t.shape[1]>3840||t.shape[2]>2160)return a;if(!mn.inputTensor)mn.inputTensor=wa(t);else if(mn.inputTensor.shape[1]!==t.shape[1]||mn.inputTensor.shape[2]!==t.shape[2])Y(mn.inputTensor),mn.inputTensor=wa(t);else{let n={};n.diff=he(t,mn.inputTensor),n.squared=ae(n.diff,n.diff),n.sum=tt(n.squared);let s=(await n.sum.data())[0]/(t.shape[1]||1)/(t.shape[2]||1)/255/3;Y([mn.inputTensor,n.diff,n.squared,n.sum]),mn.inputTensor=wa(t),a=s<=(e.cacheSensitivity||0)}return a}async function O9(e,t,a){let n={};if(!t||!a||t.shape.length!==4||t.shape.length!==a.shape.length)return e.debug||K("invalid input tensor or tensor shapes do not match:",t.shape,a.shape),0;if(t.shape[0]!==1||a.shape[0]!==1||t.shape[3]!==3||a.shape[3]!==3)return e.debug||K("input tensors must be of shape [1, height, width, 3]:",t.shape,a.shape),0;n.input1=wa(t),n.input2=t.shape[1]!==a.shape[1]||t.shape[2]!==a.shape[2]?me.resizeBilinear(a,[t.shape[1],t.shape[2]]):wa(a),n.diff=he(n.input1,n.input2),n.squared=ae(n.diff,n.diff),n.sum=tt(n.squared);let s=(await n.sum.data())[0]/(t.shape[1]||1)/(t.shape[2]||1)/255/3;return Y([n.input1,n.input2,n.diff,n.squared,n.sum]),s}var xp=class{constructor(){le(this,"browser");le(this,"node");le(this,"worker");le(this,"platform","");le(this,"agent","");le(this,"backends",[]);le(this,"initial");le(this,"filter");le(this,"tfjs");le(this,"offscreen");le(this,"perfadd",!1);le(this,"tensorflow",{version:void 0,gpu:void 0});le(this,"wasm",{supported:void 0,backend:void 0,simd:void 0,multithread:void 0});le(this,"webgl",{supported:void 0,backend:void 0,version:void 0,renderer:void 0,shader:void 0,vendor:void 0});le(this,"webgpu",{supported:void 0,backend:void 0,adapter:void 0});le(this,"cpu",{model:void 0,flags:[]});le(this,"kernels",[]);le(this,"Canvas");le(this,"Image");le(this,"ImageData");if(this.browser=typeof navigator!="undefined",this.node=typeof process!="undefined"&&typeof process.versions!="undefined"&&typeof process.versions.node!="undefined",this.tfjs={version:Ap["tfjs-core"]},this.offscreen=typeof OffscreenCanvas!="undefined",this.initial=!0,this.worker=this.browser&&this.offscreen?typeof WorkerGlobalScope!="undefined":void 0,typeof navigator!="undefined"){let t=navigator.userAgent.match(/\(([^()]+)\)/g);if(t!=null&&t[0]){let a=t[0].match(/\(([^()]+)\)/g);this.platform=a!=null&&a[0]?a[0].replace(/\(|\)/g,""):"",this.agent=navigator.userAgent.replace(t[0],""),this.platform[1]&&(this.agent=this.agent.replace(t[1],"")),this.agent=this.agent.replace(/ /g," ")}}else typeof process!="undefined"&&(this.platform=`${process.platform} ${process.arch}`,this.agent=`NodeJS ${process.version}`)}async updateBackend(){this.backends=Object.keys(kt().registryFactory);try{this.tensorflow={version:tr().binding?tr().binding.TF_Version:void 0,gpu:tr().binding?tr().binding.isUsingGpuDevice():void 0}}catch(n){}this.wasm.supported=typeof WebAssembly!="undefined",this.wasm.backend=this.backends.includes("wasm"),this.wasm.supported&&this.wasm.backend&&(this.wasm.simd=await V().getAsync("WASM_HAS_SIMD_SUPPORT"),this.wasm.multithread=await V().getAsync("WASM_HAS_MULTITHREAD_SUPPORT"));let t=En(100,100),a=t?t.getContext("webgl2"):void 0;this.webgl.supported=typeof a!="undefined",this.webgl.backend=this.backends.includes("webgl"),this.webgl.supported&&this.webgl.backend&&a&&(this.webgl.version=a.getParameter(a.VERSION),this.webgl.vendor=a.getParameter(a.VENDOR),this.webgl.renderer=a.getParameter(a.RENDERER),this.webgl.shader=a.getParameter(a.SHADING_LANGUAGE_VERSION)),this.webgpu.supported=this.browser&&typeof navigator.gpu!="undefined",this.webgpu.backend=this.backends.includes("webgpu");try{if(this.webgpu.supported){let n=await navigator.gpu.requestAdapter();this.webgpu.adapter=await(n==null?void 0:n.requestAdapterInfo())}}catch(n){this.webgpu.supported=!1}try{this.kernels=Zn(ia()).map(n=>n.kernelName.toLowerCase())}catch(n){}}updateCPU(){let t={model:"",flags:[]};this.node&&this.platform.startsWith("linux"),this.cpu?this.cpu=t:Object.defineProperty(this,"cpu",{value:t})}},ne=new xp;var Qh=class{constructor(){le(this,"config");le(this,"element");le(this,"stream");le(this,"devices",[]);le(this,"enumerate",async()=>{try{let t=await navigator.mediaDevices.enumerateDevices();this.devices=t.filter(a=>a.kind==="videoinput")}catch(t){this.devices=[]}return this.devices});le(this,"start",async t=>{if(t!=null&&t.debug&&(this.config.debug=t==null?void 0:t.debug),t!=null&&t.crop&&(this.config.crop=t==null?void 0:t.crop),t!=null&&t.mode&&(this.config.mode=t==null?void 0:t.mode),t!=null&&t.width&&(this.config.width=t==null?void 0:t.width),t!=null&&t.height&&(this.config.height=t==null?void 0:t.height),t!=null&&t.id&&(this.config.id=t==null?void 0:t.id),t!=null&&t.element)if(typeof t.element=="string"){let r=document.getElementById(t.element);if(r&&r instanceof HTMLVideoElement)this.element=r;else{this.config.debug&&K("webcam","cannot get dom element",t.element);return}}else if(t.element instanceof HTMLVideoElement)this.element=t.element;else{this.config.debug&&K("webcam","unknown dom element",t.element);return}else this.element=document.createElement("video");let a={audio:!1,video:{facingMode:this.config.mode==="front"?"user":"environment",resizeMode:this.config.crop?"crop-and-scale":"none",width:{ideal:this.config.width>0?this.config.width:window.innerWidth},height:{ideal:this.config.height>0?this.config.height:window.innerHeight}}};if(this.config.id&&(a.video.deviceId=this.config.id),this.element.addEventListener("play",()=>{this.config.debug&&K("webcam","play")}),this.element.addEventListener("pause",()=>{this.config.debug&&K("webcam","pause")}),this.element.addEventListener("click",async()=>{!this.element||!this.stream||(this.element.paused?await this.element.play():this.element.pause())}),!(navigator!=null&&navigator.mediaDevices)){this.config.debug&&K("webcam","no devices");return}try{this.stream=await navigator.mediaDevices.getUserMedia(a)}catch(r){K("webcam",r);return}if(!this.stream){this.config.debug&&K("webcam","no stream");return}this.element.srcObject=this.stream,await new Promise(r=>{this.element?this.element.onloadeddata=()=>r(!0):r(!1)}),await this.element.play(),this.config.debug&&K("webcam",{width:this.width,height:this.height,label:this.label,stream:this.stream,track:this.track,settings:this.settings,constraints:this.constraints,capabilities:this.capabilities})});le(this,"pause",()=>{this.element&&this.element.pause()});le(this,"play",async()=>{this.element&&await this.element.play()});le(this,"stop",()=>{this.config.debug&&K("webcam","stop"),this.track&&this.track.stop()});this.config={element:void 0,debug:!0,mode:"front",crop:!1,width:0,height:0}}get track(){if(!!this.stream)return this.stream.getVideoTracks()[0]}get capabilities(){if(!!this.track)return this.track.getCapabilities?this.track.getCapabilities():void 0}get constraints(){if(!!this.track)return this.track.getConstraints?this.track.getConstraints():void 0}get settings(){if(!this.stream)return;let t=this.stream.getVideoTracks()[0];return t.getSettings?t.getSettings():void 0}get label(){return this.track?this.track.label:""}get paused(){var t;return((t=this.element)==null?void 0:t.paused)||!1}get width(){var t;return((t=this.element)==null?void 0:t.videoWidth)||0}get height(){var t;return((t=this.element)==null?void 0:t.videoHeight)||0}};var eg={};hr(eg,{age:()=>Tpe,"anti-spoofing":()=>sce,antispoof:()=>fpe,blazeface:()=>mpe,"blazeface-back":()=>Cpe,"blazeface-front":()=>Npe,"blazepose-detect":()=>rce,"blazepose-detector2d":()=>Epe,"blazepose-detector3d":()=>Rpe,"blazepose-full":()=>Mpe,"blazepose-heavy":()=>$pe,"blazepose-lite":()=>_pe,centernet:()=>gpe,default:()=>Ace,efficientpose:()=>Fpe,"efficientpose-i-lite":()=>ice,"efficientpose-ii-lite":()=>oce,"efficientpose-iv":()=>lce,emotion:()=>ype,faceboxes:()=>Ppe,facemesh:()=>Ape,"facemesh-attention":()=>Dpe,"facemesh-attention-alt":()=>Ope,"facemesh-detection-full":()=>zpe,"facemesh-detection-short":()=>Lpe,"facemesh-orig":()=>Bpe,faceres:()=>xpe,"faceres-deep":()=>Wpe,gear:()=>Vpe,gender:()=>Upe,"gender-ssrnet-imdb":()=>Gpe,handdetect:()=>jpe,"handlandmark-full":()=>bpe,"handlandmark-lite":()=>Hpe,"handlandmark-sparse":()=>qpe,handskeleton:()=>Xpe,handtrack:()=>vpe,"insightface-efficientnet-b0":()=>uce,"insightface-ghostnet-strides1":()=>dce,"insightface-ghostnet-strides2":()=>pce,"insightface-mobilenet-emore":()=>cce,"insightface-mobilenet-swish":()=>hce,iris:()=>wpe,liveness:()=>kpe,meet:()=>Kpe,mobileface:()=>Zpe,mobilefacenet:()=>Ype,models:()=>Ipe,"movenet-lightning":()=>Spe,"movenet-multipose":()=>Jpe,"movenet-thunder":()=>Qpe,nanodet:()=>ece,"nanodet-e":()=>fce,"nanodet-g":()=>mce,"nanodet-m":()=>gce,"nanodet-t":()=>yce,posenet:()=>tce,rvm:()=>ace,selfie:()=>nce});var fpe=853098,mpe=538928,gpe=4030290,ype=820516,Ape=1477958,xpe=6978814,bpe=5431368,vpe=2964837,wpe=2599092,kpe=592976,Ipe=0,Spe=4650216,Tpe=161240,Cpe=538928,Npe=402048,Epe=7499400,Rpe=5928856,Mpe=6338290,$pe=27501554,_pe=2725490,Fpe=5651240,Ppe=2013002,Ope=2387598,Dpe=2382414,zpe=1026192,Lpe=201268,Bpe=2955780,Wpe=13957620,Vpe=1498916,Gpe=161236,Upe=201808,jpe=3515612,Hpe=2023432,qpe=5286322,Xpe=5502280,Kpe=372228,Zpe=2183192,Ype=5171976,Jpe=9448838,Qpe=12477112,ece=7574558,tce=5032780,ace=3739355,nce=212886,rce=5928804,sce=853098,ice=2269064,oce=5651240,lce=25643252,uce=13013224,dce=8093408,pce=8049584,cce=6938536,hce=12168584,fce=12319156,mce=7574558,gce=1887474,yce=5294216,Ace={antispoof:fpe,blazeface:mpe,centernet:gpe,emotion:ype,facemesh:Ape,faceres:xpe,"handlandmark-full":bpe,handtrack:vpe,iris:wpe,liveness:kpe,models:Ipe,"movenet-lightning":Spe,age:Tpe,"blazeface-back":Cpe,"blazeface-front":Npe,"blazepose-detector2d":Epe,"blazepose-detector3d":Rpe,"blazepose-full":Mpe,"blazepose-heavy":$pe,"blazepose-lite":_pe,efficientpose:Fpe,faceboxes:Ppe,"facemesh-attention-alt":Ope,"facemesh-attention":Dpe,"facemesh-detection-full":zpe,"facemesh-detection-short":Lpe,"facemesh-orig":Bpe,"faceres-deep":Wpe,gear:Vpe,"gender-ssrnet-imdb":Gpe,gender:Upe,handdetect:jpe,"handlandmark-lite":Hpe,"handlandmark-sparse":qpe,handskeleton:Xpe,meet:Kpe,mobileface:Zpe,mobilefacenet:Ype,"movenet-multipose":Jpe,"movenet-thunder":Qpe,nanodet:ece,posenet:tce,rvm:ace,selfie:nce,"blazepose-detect":rce,"anti-spoofing":sce,"efficientpose-i-lite":ice,"efficientpose-ii-lite":oce,"efficientpose-iv":lce,"insightface-efficientnet-b0":uce,"insightface-ghostnet-strides1":dce,"insightface-ghostnet-strides2":pce,"insightface-mobilenet-emore":cce,"insightface-mobilenet-swish":hce,"nanodet-e":fce,"nanodet-g":mce,"nanodet-m":gce,"nanodet-t":yce};var Ea={cacheModels:!0,cacheSupported:!0,verbose:!0,debug:!1,modelBasePath:""},ha={};async function xce(e,t){return Ea.debug&&K("load model fetch:",e,t),fetch(e,t)}function D9(e){Ea.cacheModels=e.cacheModels,Ea.verbose=e.debug,Ea.modelBasePath=e.modelBasePath}async function Ce(e){var u,d,c,p;let t=C9(Ea.modelBasePath,e||"");t.toLowerCase().endsWith(".json")||(t+=".json");let a=t.includes("/")?t.split("/"):t.split("\\"),n=a[a.length-1].replace(".json",""),r="indexeddb://"+n;ha[n]={name:n,sizeFromManifest:0,sizeLoadedWeights:0,sizeDesired:eg[n],inCache:!1,url:""},Ea.cacheSupported=typeof indexedDB!="undefined";let s={};try{s=Ea.cacheSupported&&Ea.cacheModels?await Hn.listModels():{}}catch(h){Ea.cacheSupported=!1}ha[n].inCache=Ea.cacheSupported&&Ea.cacheModels&&Object.keys(s).includes(r),ha[n].url=ha[n].inCache?r:t;let i=typeof fetch=="undefined"?{}:{fetchFunc:(h,f)=>xce(h,f)},o=new op(ha[n].url,i),l=!1;try{o.findIOHandler(),Ea.debug&&K("model load handler:",o.handler)}catch(h){K("error finding model i/o handler:",t,h)}try{let h=await((u=o.handler)==null?void 0:u.load())||null;ha[n].sizeFromManifest=((d=h==null?void 0:h.weightData)==null?void 0:d.byteLength)||0,h?o.loadSync(h):o=await i3(ha[n].inCache?r:t,i),ha[n].sizeLoadedWeights=((p=(c=o.artifacts)==null?void 0:c.weightData)==null?void 0:p.byteLength)||0,Ea.verbose&&K("load:",{model:n,url:o.modelUrl,bytes:ha[n].sizeLoadedWeights}),l=!0}catch(h){K("error loading model:",t,h)}if(l&&Ea.cacheModels&&Ea.cacheSupported&&!ha[n].inCache)try{let h=await o.save(r);Ea.debug&&K("model saved:",r,h)}catch(h){K("error saving model:",t,h)}return o}var tg="3.0.0";var vt={name:"humangl",priority:999,canvas:null,gl:null,extensions:[],webGLattr:{alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!1,desynchronized:!0}};function wce(){let e=vt.gl;!e||(vt.extensions=e.getSupportedExtensions())}function z9(e){var t;if(e.config.backend==="humangl"&&(vt.name in kt().registry&&!((t=vt==null?void 0:vt.gl)!=null&&t.getParameter(vt.gl.VERSION))&&(K("humangl error: backend invalid context"),e.models.reset()),!p2(vt.name))){try{vt.canvas=En(100,100)}catch(r){K("humangl error: cannot create canvas:",r);return}try{if(vt.gl=vt.canvas.getContext("webgl2",vt.webGLattr),!vt.gl){K("humangl error: cannot get webgl context");return}if(!vt.gl.getParameter(vt.gl.VERSION).includes("2.0")){K("backend override: using fallback webgl backend as webgl 2.0 is not detected"),e.config.backend="webgl";return}vt.canvas&&(vt.canvas.addEventListener("webglcontextlost",s=>{throw K("humangl error:",s.type),K("possible browser memory leak using webgl or conflict with multiple backend registrations"),e.emit("error"),new Error("backend error: webgl context lost")}),vt.canvas.addEventListener("webglcontextrestored",s=>{K("humangl error: context restored:",s)}),vt.canvas.addEventListener("webglcontextcreationerror",s=>{K("humangl error: context create:",s)}))}catch(r){K("humangl error: cannot get webgl context:",r);return}try{Dh(2,vt.gl)}catch(r){K("humangl error: cannot set webgl context:",r);return}try{let r=new el(vt.gl);uo(vt.name,()=>new nu(r),vt.priority)}catch(r){K("humangl error: cannot register webgl backend:",r);return}try{Zn("webgl").forEach(s=>{let i={...s,backendName:vt.name};hn(i)})}catch(r){K("humangl error: cannot update webgl backend registration:",r);return}try{V().flagRegistry.WEBGL_VERSION&&V().set("WEBGL_VERSION",2)}catch(r){K("humangl error: cannot set WebGL backend flags:",r);return}wce();let a=tr(),n=typeof a.gpgpu!="undefined"?a.getGPGPUContext().gl:null;n?e.config.debug&&K("humangl backend registered:",{webgl:n.getParameter(n.VERSION),renderer:n.getParameter(n.RENDERER)}):K("humangl error: no current gl context:",n,vt.gl)}}var Oe={tf255:255,tf1:1,tf2:2,tf05:.5,tf127:127.5,rgb:[.2989,.587,.114]};function L9(){Oe.tf255=Fe(255,"float32"),Oe.tf1=Fe(1,"float32"),Oe.tf2=Fe(2,"float32"),Oe.tf05=Fe(.5,"float32"),Oe.tf127=Fe(127.5,"float32"),Oe.rgb=Ut([.2989,.587,.114],"float32")}async function Sce(){return await ne.updateBackend(),ne.browser?ne.webgpu.supported&&ne.webgpu.backend?"webgpu":ne.webgl.supported&&ne.webgl.backend?"webgl":ne.wasm.supported&&ne.wasm.backend?"wasm":"cpu":"tensorflow"}function Tce(e){let t=[];if(!ne.kernels.includes("mod")){let a={kernelName:"Mod",backendName:ia(),kernelFunc:n=>Ee(()=>he(n.inputs.a,ae(fe(n.inputs.a,n.inputs.b),n.inputs.b)))};hn(a),ne.kernels.push("mod"),t.push("mod")}if(!ne.kernels.includes("floormod")){let a={kernelName:"FloorMod",backendName:ia(),kernelFunc:n=>Ee(()=>xe(ae(Yd(n.inputs.a,n.inputs.b),n.inputs.b),Xl(n.inputs.a,n.inputs.b)))};hn(a),ne.kernels.push("floormod"),t.push("floormod")}if(!ne.kernels.includes("rotatewithoffset")&&e.softwareKernels){let a={kernelName:"RotateWithOffset",backendName:ia(),kernelFunc:n=>Ee(()=>{let r=ia();Xd("cpu");let s=me.rotateWithOffset(n.inputs.image,n.attrs.radians,n.attrs.fillValue,n.attrs.center);return Xd(r),s})};hn(a),ne.kernels.push("rotatewithoffset"),t.push("rotatewithoffset")}t.length>0&&e.debug&&K("registered kernels:",t)}var B9={};async function bp(e,t=!1){var a;if(e.state="backend",((a=e.config.backend)==null?void 0:a.length)===0&&(e.config.backend=await Sce()),t||ne.initial||e.config.backend&&e.config.backend.length>0&&ia()!==e.config.backend){let n=te();if(e.config.backend&&e.config.backend.length>0){if(typeof window=="undefined"&&typeof WorkerGlobalScope!="undefined"&&e.config.debug&&e.config.debug&&K("running inside web worker"),ne.browser&&e.config.backend==="tensorflow"&&(e.config.debug&&K("override: backend set to tensorflow while running in browser"),e.config.backend="webgl"),ne.node&&(e.config.backend==="webgl"||e.config.backend==="humangl")&&(e.config.debug&&K(`override: backend set to ${e.config.backend} while running in nodejs`),e.config.backend="tensorflow"),ne.browser&&e.config.backend==="webgpu")if(typeof navigator=="undefined"||typeof navigator.gpu=="undefined")K("override: backend set to webgpu but browser does not support webgpu"),e.config.backend="webgl";else{let s=await navigator.gpu.requestAdapter();if(e.config.debug&&K("enumerated webgpu adapter:",s),!s)K("override: backend set to webgpu but browser reports no available gpu"),e.config.backend="webgl";else{let i="requestAdapterInfo"in s?await s.requestAdapterInfo():void 0;K("webgpu adapter info:",i)}}let r=Object.keys(kt().registryFactory);if(e.config.backend==="humangl"&&!r.includes("humangl")&&(z9(e),r=Object.keys(kt().registryFactory)),e.config.debug&&K("available backends:",r),r.includes(e.config.backend)||(K(`error: backend ${e.config.backend} not found in registry`),e.config.backend=ne.node?"tensorflow":"webgl",e.config.debug&&K(`override: setting backend ${e.config.backend}`)),e.config.debug&&K("setting backend:",[e.config.backend]),e.config.backend==="wasm"){if(V().flagRegistry.CANVAS2D_WILL_READ_FREQUENTLY&&V().set("CANVAS2D_WILL_READ_FREQUENTLY",!0),e.config.debug&&K("wasm path:",e.config.wasmPath),typeof Gh!="undefined")Gh(e.config.wasmPath,e.config.wasmPlatformFetch);else throw new Error("backend error: attempting to use wasm backend but wasm path is not set");let s=!1,i=!1;try{s=await V().getAsync("WASM_HAS_MULTITHREAD_SUPPORT"),i=await V().getAsync("WASM_HAS_SIMD_SUPPORT"),e.config.debug&&K(`wasm execution: ${i?"simd":"no simd"} ${s?"multithreaded":"singlethreaded"}`),e.config.debug&&!i&&K("warning: wasm simd support is not enabled")}catch(o){K("wasm detection failed")}}try{await Xd(e.config.backend),await Kd()}catch(s){return K("error: cannot set backend:",e.config.backend,s),!1}e.config.debug&&(B9=JSON.parse(JSON.stringify(V().flags)))}if((ia()==="humangl"||ia()==="webgl")&&(V().flagRegistry.WEBGL_USE_SHAPES_UNIFORMS&&V().set("WEBGL_USE_SHAPES_UNIFORMS",!0),V().flagRegistry.WEBGL_EXP_CONV&&V().set("WEBGL_EXP_CONV",!0),e.config.debug&&typeof e.config.deallocate!="undefined"&&e.config.deallocate&&(K("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",!0),V().set("WEBGL_DELETE_TEXTURE_THRESHOLD",0))),ia(),e.config.debug){let r=V().flags,s={};for(let i of Object.keys(r))B9[i]!==r[i]&&(s[i]=r[i]);e.config.debug&&Object.keys(s).length>0&&K("backend:",ia(),"flags:",s)}if(e.config.flags&&Object.keys(e.config.flags).length>0){e.config.debug&&K("flags:",e.config.flags);for(let[r,s]of Object.entries(e.config.flags))V().set(r,s)}u2(),L9(),e.performance.initBackend=Math.trunc(te()-n),e.config.backend=ia(),await ne.updateBackend(),Tce(e.config),ne.initial=!1}return!0}function e0(e,t){for(let a of e){let n={kernelName:a,backendName:t.backend,kernelFunc:r=>{var s;return t.debug&&K("kernelFunc",a,t.backend,r),(s=r==null?void 0:r.inputs)==null?void 0:s.info}};hn(n)}ne.kernels=Zn(ia()).map(a=>a.kernelName.toLowerCase())}var i0={};hr(i0,{all:()=>nhe,body:()=>a0,canvas:()=>ahe,face:()=>t0,gesture:()=>s0,hand:()=>n0,init:()=>lg,object:()=>r0,options:()=>$t,person:()=>the});var gn=e=>{if(!e)K("draw error: invalid canvas");else if(!e.getContext)K("draw error: canvas context not defined");else{let t=e.getContext("2d");if(!t)K("draw error: cannot get canvas context");else return t}return null},Ao=e=>Math.round(e*180/Math.PI),pt=(e,t,a)=>e.replace(t,typeof a=="number"?a.toFixed(1):a),xo=(e,t)=>{if(!t.useDepth||typeof e=="undefined")return t.color;let a=Uint8ClampedArray.from([127+2*e,127-2*e,255]);return`rgba(${a[0]}, ${a[1]}, ${a[2]}, ${t.alpha})`};function Rn(e,t,a,n,r){let s=t.replace(/\[.*\]/g,"").split(` +`).map(o=>o.trim()),i=Math.max(0,a);for(let o=s.length-1;o>=0;o--){let l=o*r.lineHeight+n;r.shadowColor&&r.shadowColor!==""&&(e.fillStyle=r.shadowColor,e.fillText(s[o],i+5,l+16)),e.fillStyle=r.labelColor,e.fillText(s[o],i+4,l+15)}}function Nr(e,t,a,n,r){e.fillStyle=xo(n,r),e.beginPath(),e.arc(t,a,r.pointSize,0,2*Math.PI),e.fill()}function sr(e,t,a,n,r,s){if(e.beginPath(),e.lineWidth=s.lineWidth,s.useCurves){let i=(t+t+n)/2,o=(a+a+r)/2;e.ellipse(i,o,n/2,r/2,0,0,2*Math.PI)}else e.moveTo(t+s.roundRect,a),e.lineTo(t+n-s.roundRect,a),e.quadraticCurveTo(t+n,a,t+n,a+s.roundRect),e.lineTo(t+n,a+r-s.roundRect),e.quadraticCurveTo(t+n,a+r,t+n-s.roundRect,a+r),e.lineTo(t+s.roundRect,a+r),e.quadraticCurveTo(t,a+r,t,a+r-s.roundRect),e.lineTo(t,a+s.roundRect),e.quadraticCurveTo(t,a,t+s.roundRect,a),e.closePath();e.stroke()}function ag(e,t,a){if(!(t.length<2)){e.beginPath(),e.moveTo(t[0][0],t[0][1]);for(let n of t)e.strokeStyle=xo(n[2]||0,a),e.lineTo(Math.trunc(n[0]),Math.trunc(n[1]));e.stroke(),a.fillPolygons&&(e.closePath(),e.fill())}}function V9(e,t,a){if(!(t.length<2)){if(e.lineWidth=a.lineWidth,!a.useCurves||t.length<=2){ag(e,t,a);return}e.moveTo(t[0][0],t[0][1]);for(let n=0;nvp[e]),J2e=Nce.map(e=>vp[e]),Q2e=Ece.map(e=>vp[e]);function Ts(e){let t=e.map(a=>a[0]);return t.push(e[e.length-1][1]),t}var Rce=[[61,146],[146,91],[91,181],[181,84],[84,17],[17,314],[314,405],[405,321],[321,375],[375,291],[61,185],[185,40],[40,39],[39,37],[37,0],[0,267],[267,269],[269,270],[270,409],[409,291],[78,95],[95,88],[88,178],[178,87],[87,14],[14,317],[317,402],[402,318],[318,324],[324,308],[78,191],[191,80],[80,81],[81,82],[82,13],[13,312],[312,311],[311,310],[310,415],[415,308]],Mce=[[263,249],[249,390],[390,373],[373,374],[374,380],[380,381],[381,382],[382,362],[263,466],[466,388],[388,387],[387,386],[386,385],[385,384],[384,398],[398,362]],$ce=[[276,283],[283,282],[282,295],[295,285],[300,293],[293,334],[334,296],[296,336]],_ce=[[474,475],[475,476],[476,477],[477,474]],Fce=[[33,7],[7,163],[163,144],[144,145],[145,153],[153,154],[154,155],[155,133],[33,246],[246,161],[161,160],[160,159],[159,158],[158,157],[157,173],[173,133]],Pce=[[46,53],[53,52],[52,65],[65,55],[70,63],[63,105],[105,66],[66,107]],Oce=[[469,470],[470,471],[471,472],[472,469]],Dce=[[10,338],[338,297],[297,332],[332,284],[284,251],[251,389],[389,356],[356,454],[454,323],[323,361],[361,288],[288,397],[397,365],[365,379],[379,378],[378,400],[400,377],[377,152],[152,148],[148,176],[176,149],[149,150],[150,136],[136,172],[172,58],[58,132],[132,93],[93,234],[234,127],[127,162],[162,21],[21,54],[54,103],[103,67],[67,109],[109,10]],e3e={lips:Ts(Rce),leftEye:Ts(Mce),leftEyebrow:Ts($ce),leftIris:Ts(_ce),rightEye:Ts(Fce),rightEyebrow:Ts(Pce),rightIris:Ts(Oce),faceOval:Ts(Dce)};var zce=[[61,146],[146,91],[91,181],[181,84],[84,17],[17,314],[314,405],[405,321],[321,375],[375,291],[61,185],[185,40],[40,39],[39,37],[37,0],[0,267],[267,269],[269,270],[270,409],[409,291],[78,95],[95,88],[88,178],[178,87],[87,14],[14,317],[317,402],[402,318],[318,324],[324,308],[78,191],[191,80],[80,81],[81,82],[82,13],[13,312],[312,311],[311,310],[310,415],[415,308]],Lce=[[263,249],[249,390],[390,373],[373,374],[374,380],[380,381],[381,382],[382,362],[263,466],[466,388],[388,387],[387,386],[386,385],[385,384],[384,398],[398,362]],Bce=[[276,283],[283,282],[282,295],[295,285],[300,293],[293,334],[334,296],[296,336]],Wce=[[474,475],[475,476],[476,477],[477,474]],Vce=[[33,7],[7,163],[163,144],[144,145],[145,153],[153,154],[154,155],[155,133],[33,246],[246,161],[161,160],[160,159],[159,158],[158,157],[157,173],[173,133]],Gce=[[46,53],[53,52],[52,65],[65,55],[70,63],[63,105],[105,66],[66,107]],Uce=[[469,470],[470,471],[471,472],[472,469]],jce=[[10,338],[338,297],[297,332],[332,284],[284,251],[251,389],[389,356],[356,454],[454,323],[323,361],[361,288],[288,397],[397,365],[365,379],[379,378],[378,400],[400,377],[377,152],[152,148],[148,176],[176,149],[149,150],[150,136],[136,172],[172,58],[58,132],[132,93],[93,234],[234,127],[127,162],[162,21],[21,54],[54,103],[103,67],[67,109],[109,10]];function Cs(e){let t=e.map(a=>a[0]);return t.push(e[e.length-1][1]),t}var Hce={lips:Cs(zce),leftEye:Cs(Lce),leftEyebrow:Cs(Bce),leftIris:Cs(Wce),rightEye:Cs(Vce),rightEyebrow:Cs(Gce),rightIris:Cs(Uce),faceOval:Cs(jce)},qce=Object.entries(Hce).map(([e,t])=>t.map(a=>[a,e])).flat(),t3e=new Map(qce),wp=[61,146,91,181,84,17,314,405,321,375,291,185,40,39,37,0,267,269,270,409,78,95,88,178,87,14,317,402,318,324,308,191,80,81,82,13,312,311,310,415,76,77,90,180,85,16,315,404,320,307,306,184,74,73,72,11,302,303,304,408,62,96,89,179,86,15,316,403,319,325,292,183,42,41,38,12,268,271,272,407],wo=[33,7,163,144,145,153,154,155,133,246,161,160,159,158,157,173,130,25,110,24,23,22,26,112,243,247,30,29,27,28,56,190,226,31,228,229,230,231,232,233,244,113,225,224,223,222,221,189,35,124,46,53,52,65,143,111,117,118,119,120,121,128,245,156,70,63,105,66,107,55,193],ko=[263,249,390,373,374,380,381,382,362,466,388,387,386,385,384,398,359,255,339,254,253,252,256,341,463,467,260,259,257,258,286,414,446,261,448,449,450,451,452,453,464,342,445,444,443,442,441,413,265,353,276,283,282,295,372,340,346,347,348,349,350,357,465,383,300,293,334,296,336,285,417];var ot;function Xce(e,t){var n,r,s,i,o,l,u,d,c;if(!ot.drawLabels||((n=ot.faceLabels)==null?void 0:n.length)===0)return;let a=ot.faceLabels.slice();if(e.score&&(a=pt(a,"[score]",100*e.score)),e.gender&&(a=pt(a,"[gender]",e.gender)),e.genderScore&&(a=pt(a,"[genderScore]",100*e.genderScore)),e.age&&(a=pt(a,"[age]",e.age)),e.distance&&(a=pt(a,"[distance]",100*e.distance)),e.real&&(a=pt(a,"[real]",100*e.real)),e.live&&(a=pt(a,"[live]",100*e.live)),e.emotion&&e.emotion.length>0){let p=e.emotion.map(h=>`${Math.trunc(100*h.score)}% ${h.emotion}`);p.length>3&&(p.length=3),a=pt(a,"[emotions]",p.join(" "))}(s=(r=e.rotation)==null?void 0:r.angle)!=null&&s.roll&&(a=pt(a,"[roll]",Ao(e.rotation.angle.roll))),(o=(i=e.rotation)==null?void 0:i.angle)!=null&&o.yaw&&(a=pt(a,"[yaw]",Ao(e.rotation.angle.yaw))),(u=(l=e.rotation)==null?void 0:l.angle)!=null&&u.pitch&&(a=pt(a,"[pitch]",Ao(e.rotation.angle.pitch))),(c=(d=e.rotation)==null?void 0:d.gaze)!=null&&c.bearing&&(a=pt(a,"[gaze]",Ao(e.rotation.gaze.bearing))),Rn(t,a,e.box[0],e.box[1],ot)}function Kce(e,t){var a,n,r,s;if(((a=e.annotations)==null?void 0:a.leftEyeIris)&&((n=e.annotations)==null?void 0:n.leftEyeIris[0])){t.strokeStyle=ot.useDepth?"rgba(255, 200, 255, 0.3)":ot.color,t.beginPath();let i=Math.abs(e.annotations.leftEyeIris[3][0]-e.annotations.leftEyeIris[1][0])/2,o=Math.abs(e.annotations.leftEyeIris[4][1]-e.annotations.leftEyeIris[2][1])/2;t.ellipse(e.annotations.leftEyeIris[0][0],e.annotations.leftEyeIris[0][1],i,o,0,0,2*Math.PI),t.stroke(),ot.fillPolygons&&(t.fillStyle=ot.useDepth?"rgba(255, 255, 200, 0.3)":ot.color,t.fill())}if(((r=e.annotations)==null?void 0:r.rightEyeIris)&&((s=e.annotations)==null?void 0:s.rightEyeIris[0])){t.strokeStyle=ot.useDepth?"rgba(255, 200, 255, 0.3)":ot.color,t.beginPath();let i=Math.abs(e.annotations.rightEyeIris[3][0]-e.annotations.rightEyeIris[1][0])/2,o=Math.abs(e.annotations.rightEyeIris[4][1]-e.annotations.rightEyeIris[2][1])/2;t.ellipse(e.annotations.rightEyeIris[0][0],e.annotations.rightEyeIris[0][1],i,o,0,0,2*Math.PI),t.stroke(),ot.fillPolygons&&(t.fillStyle=ot.useDepth?"rgba(255, 255, 200, 0.3)":ot.color,t.fill())}}function Zce(e,t){var a;if(ot.drawGaze&&((a=e.rotation)==null?void 0:a.angle)&&typeof Path2D!="undefined"){t.strokeStyle="pink";let n=e.box[0]+e.box[2]/2-e.box[3]*Ao(e.rotation.angle.yaw)/90,r=e.box[1]+e.box[3]/2+e.box[2]*Ao(e.rotation.angle.pitch)/90,s=new Path2D(` + M ${e.box[0]+e.box[2]/2} ${e.box[1]} + C + ${n} ${e.box[1]}, + ${n} ${e.box[1]+e.box[3]}, + ${e.box[0]+e.box[2]/2} ${e.box[1]+e.box[3]} + `),i=new Path2D(` + M ${e.box[0]} ${e.box[1]+e.box[3]/2} + C + ${e.box[0]} ${r}, + ${e.box[0]+e.box[2]} ${r}, + ${e.box[0]+e.box[2]} ${e.box[1]+e.box[3]/2} + `);t.stroke(i),t.stroke(s)}}function Yce(e,t){var a;if(ot.drawGaze&&((a=e.rotation)==null?void 0:a.gaze.strength)&&e.rotation.gaze.bearing&&e.annotations.leftEyeIris&&e.annotations.rightEyeIris&&e.annotations.leftEyeIris[0]&&e.annotations.rightEyeIris[0]){t.strokeStyle="pink",t.fillStyle="pink";let n=[e.annotations.leftEyeIris[0][0]+Math.sin(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[3],e.annotations.leftEyeIris[0][1]+Math.cos(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[2]];ng(t,[e.annotations.leftEyeIris[0][0],e.annotations.leftEyeIris[0][1]],[n[0],n[1]],4);let r=[e.annotations.rightEyeIris[0][0]+Math.sin(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[3],e.annotations.rightEyeIris[0][1]+Math.cos(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[2]];ng(t,[e.annotations.rightEyeIris[0][0],e.annotations.rightEyeIris[0][1]],[r[0],r[1]],4)}}function Jce(e,t){if(ot.drawPolygons&&e.mesh.length>=468){t.lineWidth=1;for(let a=0;ae.mesh[r]);ag(t,n,ot)}Kce(e,t)}}function Qce(e,t){if(ot.drawPoints&&e.mesh.length>=468)for(let a=0;a0&&(Qce(r,n),Jce(r,n),Zce(r,n),Yce(r,n))}}function a0(e,t,a){var s,i;let n=Tt($t,a);if(!t||!e)return;let r=gn(e);if(!!r){r.lineJoin="round";for(let o=0;o0)){let l=n.bodyLabels.slice();l=pt(l,"[score]",100*t[o].score),Rn(r,l,t[o].box[0],t[o].box[1],n)}if(n.drawPoints&&t[o].keypoints)for(let l=0;l0&&t[o].keypoints){r.font=n.font;for(let l of t[o].keypoints){if(!l.score||l.score===0)continue;let u=n.bodyPartLabels.slice();u=pt(u,"[label]",l.part),u=pt(u,"[score]",100*l.score),Rn(r,u,l.position[0],l.position[1],n)}}if(n.drawPolygons&&t[o].keypoints&&t[o].annotations)for(let l of Object.values(t[o].annotations))for(let u of l)V9(r,u,n)}}}function n0(e,t,a){var s,i;let n=Tt($t,a);if(!t||!e)return;let r=gn(e);if(!!r){r.lineJoin="round",r.font=n.font;for(let o of t){if(n.drawBoxes){if(r.strokeStyle=n.color,r.fillStyle=n.color,sr(r,o.box[0],o.box[1],o.box[2],o.box[3],n),n.drawLabels&&((s=n.handLabels)==null?void 0:s.length)>0){let l=n.handLabels.slice();l=pt(l,"[label]",o.label),l=pt(l,"[score]",100*o.score),Rn(r,l,o.box[0],o.box[1],n)}r.stroke()}if(n.drawPoints&&o.keypoints&&o.keypoints.length>0)for(let l of o.keypoints)r.fillStyle=xo(l[2],n),Nr(r,l[0],l[1],0,n);if(n.drawLabels&&o.annotations&&((i=n.fingerLabels)==null?void 0:i.length)>0)for(let[l,u]of Object.entries(o.annotations)){let d=n.fingerLabels.slice();d=pt(d,"[label]",l),Rn(r,d,u[u.length-1][0],u[u.length-1][1],n)}if(n.drawPolygons&&o.annotations){let l=u=>{if(!(!u||u.length===0||!u[0]))for(let d=0;d0?d-1:0][0],u[d>0?d-1:0][1]),r.lineTo(u[d][0],u[d][1]),r.stroke()}};r.lineWidth=n.lineWidth,l(o.annotations.index),l(o.annotations.middle),l(o.annotations.ring),l(o.annotations.pinky),l(o.annotations.thumb)}}}}function r0(e,t,a){var s;let n=Tt($t,a);if(!t||!e)return;let r=gn(e);if(!!r){r.lineJoin="round",r.font=n.font;for(let i of t)if(n.drawBoxes){if(r.strokeStyle=n.color,r.fillStyle=n.color,sr(r,i.box[0],i.box[1],i.box[2],i.box[3],n),n.drawLabels&&((s=n.objectLabels)==null?void 0:s.length)>0){let o=n.objectLabels.slice();o=pt(o,"[label]",i.label),o=pt(o,"[score]",100*i.score),Rn(r,o,i.box[0],i.box[1],n)}r.stroke()}}}function s0(e,t,a){var r;let n=Tt($t,a);if(!(!t||!e)&&n.drawGestures&&((r=n.gestureLabels)==null?void 0:r.length)>0){let s=gn(e);if(!s)return;s.font=n.font,s.fillStyle=n.color;let i=1;for(let o=0;o1&&u[1].length>0){let d=l[1]>0?`#${l[1]}`:"",c=n.gestureLabels.slice();c=pt(c,"[where]",l[0]),c=pt(c,"[who]",d),c=pt(c,"[what]",u[1]),Rn(s,c,8,2+i*n.lineHeight,n),i+=1}}}}var Ns={face:`face + confidence: [score]% + [gender] [genderScore]% + age: [age] years + distance: [distance]cm + real: [real]% + live: [live]% + [emotions] + roll: [roll]\xB0 yaw:[yaw]\xB0 pitch:[pitch]\xB0 + gaze: [gaze]\xB0`,body:"body [score]%",bodyPart:"[label] [score]%",object:"[label] [score]%",hand:"[label] [score]%",finger:"[label]",gesture:"[where] [who]: [what]"};var og=0;function the(e,t,a){let n=Tt($t,a);if(!t||!e)return;let r=gn(e);if(!!r){r.lineJoin="round",r.font=n.font;for(let s=0;sdg,kpt:()=>ug});var ug=["nose","leftEyeInside","leftEye","leftEyeOutside","rightEyeInside","rightEye","rightEyeOutside","leftEar","rightEar","leftMouth","rightMouth","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftPinky","rightPinky","leftIndex","rightIndex","leftThumb","rightThumb","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle","leftHeel","rightHeel","leftFoot","rightFoot","bodyCenter","bodyTop","leftPalm","leftHand","rightPalm","rightHand"],dg={shoulders:["leftShoulder","rightShoulder"],hips:["rightHip","leftHip"],mouth:["leftMouth","rightMouth"],leftLegUpper:["leftHip","leftKnee"],leftLegLower:["leftKnee","leftAnkle"],leftFoot:["leftAnkle","leftHeel","leftFoot"],leftTorso:["leftShoulder","leftHip"],leftArmUpper:["leftShoulder","leftElbow"],leftArmLower:["leftElbow","leftWrist"],leftHand:["leftWrist","leftPalm"],leftHandPinky:["leftPalm","leftPinky"],leftHandIndex:["leftPalm","leftIndex"],leftHandThumb:["leftPalm","leftThumb"],leftEyeOutline:["leftEyeInside","leftEyeOutside"],rightLegUpper:["rightHip","rightKnee"],rightLegLower:["rightKnee","rightAnkle"],rightFoot:["rightAnkle","rightHeel","rightFoot"],rightTorso:["rightShoulder","rightHip"],rightArmUpper:["rightShoulder","rightElbow"],rightArmLower:["rightElbow","rightWrist"],rightHand:["rightWrist","rightPalm"],rightHandPinky:["rightPalm","rightPinky"],rightHandIndex:["rightPalm","rightIndex"],rightHandThumb:["rightPalm","rightThumb"],rightEyeOutline:["rightEyeInside","rightEyeOutside"]};var yn,Io=224,j9,rhe=5,l0=[8,16,32,32,32];function she(){let e=[],t=0;for(;ta.x)),y:Ut(e.map(a=>a.y))}}async function H9(e){if(ne.initial&&(yn=null),!yn&&e.body.detector&&e.body.detector.modelPath){yn=await Ce(e.body.detector.modelPath);let t=yn!=null&&yn.executor?Object.values(yn.modelSignature.inputs):void 0;Io=Array.isArray(t)?parseInt(t[0].tensorShape.dim[1].size):0}else e.debug&&yn&&K("cached model:",yn.modelUrl);return she(),yn}var U9=[5,5];function ihe(e,t){return Ee(()=>{let a=ka(e,12,1),n=$e(a[0]),r=$e(a[1]),s=$e(a[2]),i=$e(a[3]);n=xe(fe(n,Io),t.x),r=xe(fe(r,Io),t.y),s=ae(fe(s,Io),U9[0]),i=ae(fe(i,Io),U9[1]);let o=he(n,fe(s,2)),l=he(r,fe(i,2)),u=xe(o,s),d=xe(l,i);return sa([o,l,u,d],1)})}async function ohe(e,t,a,n){var u,d;let r=[],s={};s.boxes=ihe(e,j9),s.scores=Da(t),s.nms=await me.nonMaxSuppressionAsync(s.boxes,s.scores,1,((u=a.body.detector)==null?void 0:u.minConfidence)||.1,((d=a.body.detector)==null?void 0:d.iouThreshold)||.1);let i=await s.nms.data(),o=await s.scores.data(),l=await s.boxes.array();for(let c of Array.from(i)){let p=o[c],h=l[c],f=[Math.round(h[0]*n[0]),Math.round(h[1]*n[1]),Math.round(h[2]*n[0]),Math.round(h[3]*n[1])],m={score:p,boxRaw:h,box:f};r.push(m)}return Object.keys(s).forEach(c=>Y(s[c])),r}async function q9(e,t,a){let n={};n.res=yn==null?void 0:yn.execute(e,["Identity"]),n.logitsRaw=_e(n.res,[0,0,0],[1,-1,1]),n.boxesRaw=_e(n.res,[0,0,1],[1,-1,-1]),n.logits=$e(n.logitsRaw),n.boxes=$e(n.boxesRaw);let r=await ohe(n.boxes,n.logits,t,a);return Object.keys(n).forEach(s=>Y(n[s])),r}function Er(e,t=[1,1]){let a=[e.map(o=>o[0]),e.map(o=>o[1])],n=[Math.min(...a[0]),Math.min(...a[1])],r=[Math.max(...a[0]),Math.max(...a[1])],s=[n[0],n[1],r[0]-n[0],r[1]-n[1]],i=[s[0]/t[0],s[1]/t[1],s[2]/t[0],s[3]/t[1]];return{box:s,boxRaw:i}}function X9(e,t=[1,1]){let a=[e.map(u=>u[0]),e.map(u=>u[1])],n=[Math.min(...a[0]),Math.min(...a[1])],r=[Math.max(...a[0]),Math.max(...a[1])],s=[(n[0]+r[0])/2,(n[1]+r[1])/2],i=Math.max(s[0]-n[0],s[1]-n[1],-s[0]+r[0],-s[1]+r[1]),o=[Math.trunc(s[0]-i),Math.trunc(s[1]-i),Math.trunc(2*i),Math.trunc(2*i)],l=[o[0]/t[0],o[1]/t[1],o[2]/t[0],o[3]/t[1]];return{box:o,boxRaw:l}}function u0(e,t){let a=[e[2]*t,e[3]*t];return[e[0]-(a[0]-e[2])/2,e[1]-(a[1]-e[3])/2,a[0],a[1]]}var Ba,cg=256,pg=Number.MAX_SAFE_INTEGER,lhe={landmarks:["ld_3d","activation_segmentation","activation_heatmap","world_3d","output_poseflag"],detector:[]},p0=[],Es=[[0,0],[0,0],[0,0],[0,0]],K9=0,Z9=e=>1-1/(1+Math.exp(e)),J9=e=>H9(e);async function Q9(e){if(ne.initial&&(Ba=null),Ba)e.debug&&K("cached model:",Ba.modelUrl);else{Ba=await Ce(e.body.modelPath);let t=Ba!=null&&Ba.executor?Object.values(Ba.modelSignature.inputs):void 0;cg=Array.isArray(t)?parseInt(t[0].tensorShape.dim[1].size):0}return Ba}function Y9(e,t,a){var s,i;let n={};if(!((s=e==null?void 0:e.shape)!=null&&s[1])||!((i=e==null?void 0:e.shape)!=null&&i[2]))return e;let r;if(a&&(n.cropped=me.cropAndResize(e,[a],[0],[e.shape[1],e.shape[2]])),e.shape[1]!==e.shape[2]){let o=[e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0,e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0],l=[e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0,e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0];Es=[[0,0],o,l,[0,0]],n.pad=rr(n.cropped||e,Es),n.resize=me.resizeBilinear(n.pad,[t,t]),r=fe(n.resize,Oe.tf255)}else e.shape[1]!==t?(n.resize=me.resizeBilinear(n.cropped||e,[t,t]),r=fe(n.resize,Oe.tf255)):r=fe(n.cropped||e,Oe.tf255);return Object.keys(n).forEach(o=>Y(n[o])),r}function uhe(e,t,a){for(let n of e)n.position=[Math.trunc(n.position[0]*(t[0]+Es[2][0]+Es[2][1])/t[0]-Es[2][0]),Math.trunc(n.position[1]*(t[1]+Es[1][0]+Es[1][1])/t[1]-Es[1][0]),n.position[2]],n.positionRaw=[n.position[0]/t[0],n.position[1]/t[1],2*n.position[2]/(t[0]+t[1])];if(a){let n=a[2]-a[0],r=a[3]-a[1];for(let s of e)s.positionRaw=[s.positionRaw[0]/r+a[1],s.positionRaw[1]/n+a[0],s.positionRaw[2]],s.position=[Math.trunc(s.positionRaw[0]*t[0]),Math.trunc(s.positionRaw[1]*t[1]),s.positionRaw[2]]}return e}function dhe(e){let t=e.find(o=>o.part==="leftPalm"),a=e.find(o=>o.part==="leftWrist"),n=e.find(o=>o.part==="leftIndex");t.position[2]=((a.position[2]||0)+(n.position[2]||0))/2;let r=e.find(o=>o.part==="rightPalm"),s=e.find(o=>o.part==="rightWrist"),i=e.find(o=>o.part==="rightIndex");r.position[2]=((s.position[2]||0)+(i.position[2]||0))/2}async function phe(e,t,a){if(!(Ba!=null&&Ba.executor))return null;let n={};[n.ld,n.segmentation,n.heatmap,n.world,n.poseflag]=Ba==null?void 0:Ba.execute(e,lhe.landmarks);let r=(await n.poseflag.data())[0],s=await n.ld.data(),i=await n.world.data();Object.keys(n).forEach(f=>Y(n[f]));let o=[],l=5;for(let f=0;ff.position),c=Er(d,[a[0],a[1]]),p={};for(let[f,m]of Object.entries(dg)){let g=[];for(let y=0;yb.part===m[y]),x=u.find(b=>b.part===m[y+1]);A&&x&&g.push([A.position,x.position])}p[f]=g}return{id:0,score:Math.trunc(100*r)/100,box:c.box,boxRaw:c.boxRaw,keypoints:u,annotations:p}}async function hg(e,t){var s,i,o;let a=[e.shape[2]||0,e.shape[1]||0],n=(t.body.skipTime||0)>te()-K9,r=pg<(t.body.skipFrames||0);if(t.skipAllowed&&n&&r&&p0!==null)pg++;else{let l=[];if((i=(s=t.body)==null?void 0:s.detector)!=null&&i.enabled){let u=Y9(e,224);l=await q9(u,t,a),Y(u)}else l=[{box:[0,0,0,0],boxRaw:[0,0,1,1],score:0}];for(let u=0;uY(n[u])),r}async function gg(e,t){if(!(Wa!=null&&Wa.executor))return[];let a=(t.object.skipTime||0)>te()-tw,n=mg<(t.object.skipFrames||0);return t.skipAllowed&&a&&n&&fg.length>0?(mg++,fg):(mg=0,new Promise(async r=>{let s=[e.shape[2]||0,e.shape[1]||0],i=me.resizeBilinear(e,[So,So]),o=t.object.enabled?Wa==null?void 0:Wa.execute(i,["tower_0/detections"]):null;tw=te(),Y(i);let l=await che(o,s,t);fg=l,r(l)}))}var c0={};hr(c0,{connected:()=>Ag,kpt:()=>yg});var yg=["head","neck","rightShoulder","rightElbow","rightWrist","chest","leftShoulder","leftElbow","leftWrist","bodyCenter","rightHip","rightKnee","rightAnkle","leftHip","leftKnee","leftAnkle"],Ag={leftLeg:["leftHip","leftKnee","leftAnkle"],rightLeg:["rightHip","rightKnee","rightAnkle"],torso:["leftShoulder","rightShoulder","rightHip","leftHip","leftShoulder"],leftArm:["leftShoulder","leftElbow","leftWrist"],rightArm:["rightShoulder","rightElbow","rightWrist"],head:[]};var Ct,rw=0,Ra={id:0,keypoints:[],box:[0,0,0,0],boxRaw:[0,0,0,0],score:0,annotations:{}},xg=Number.MAX_SAFE_INTEGER;async function sw(e){return ne.initial&&(Ct=null),Ct?e.debug&&K("cached model:",Ct.modelUrl):Ct=await Ce(e.body.modelPath),Ct}async function hhe(e,t){let[a,n]=e.shape,r=J(e,[n*a]),s=pa(r,0),i=(await s.data())[0];if(i>t){let o=ar(r,0),l=Xl(o,a),u=(await l.data())[0],d=fe(o,a),c=(await d.data())[0];return Y([r,s,o,l,d]),[u,c,i]}return Y([r,s]),[0,0,i]}async function bg(e,t){if(!(Ct!=null&&Ct.executor)||!(Ct!=null&&Ct.inputs[0].shape))return[];let a=(t.body.skipTime||0)>te()-rw,n=xg<(t.body.skipFrames||0);return t.skipAllowed&&a&&n&&Object.keys(Ra.keypoints).length>0?(xg++,[Ra]):(xg=0,new Promise(async r=>{let s=Ee(()=>{var f,m;let c=me.resizeBilinear(e,[((f=Ct==null?void 0:Ct.inputs[0].shape)==null?void 0:f[2])||0,((m=Ct==null?void 0:Ct.inputs[0].shape)==null?void 0:m[1])||0],!1),p=ae(c,Oe.tf2);return he(p,Oe.tf1)}),i;if(t.body.enabled&&(i=Ct==null?void 0:Ct.execute(s)),rw=te(),Y(s),i){Ra.keypoints.length=0;let c=$e(i);Y(i);let p=Ta(c,2);Y(c);for(let h=0;h(t.body.minConfidence||0)&&Ra.keypoints.push({score:Math.round(100*g)/100,part:yg[h],positionRaw:[f/Ct.inputs[0].shape[2],m/Ct.inputs[0].shape[1]],position:[Math.round(e.shape[2]*f/Ct.inputs[0].shape[2]),Math.round(e.shape[1]*m/Ct.inputs[0].shape[1])]})}p.forEach(h=>Y(h))}Ra.score=Ra.keypoints.reduce((c,p)=>p.score>c?p.score:c,0);let o=Ra.keypoints.map(c=>c.position[0]),l=Ra.keypoints.map(c=>c.position[1]);Ra.box=[Math.min(...o),Math.min(...l),Math.max(...o)-Math.min(...o),Math.max(...l)-Math.min(...l)];let u=Ra.keypoints.map(c=>c.positionRaw[0]),d=Ra.keypoints.map(c=>c.positionRaw[1]);Ra.boxRaw=[Math.min(...u),Math.min(...d),Math.max(...u)-Math.min(...u),Math.max(...d)-Math.min(...d)];for(let[c,p]of Object.entries(Ag)){let h=[];for(let f=0;fy.part===p[f]),g=Ra.keypoints.find(y=>y.part===p[f+1]);m&&g&&m.score>(t.body.minConfidence||0)&&g.score>(t.body.minConfidence||0)&&h.push([m.position,g.position])}Ra.annotations[c]=h}r([Ra])}))}var cu=e=>[Math.abs(e.endPoint[0]-e.startPoint[0]),Math.abs(e.endPoint[1]-e.startPoint[1])],h0=e=>[e.startPoint[0]+(e.endPoint[0]-e.startPoint[0])/2,e.startPoint[1]+(e.endPoint[1]-e.startPoint[1])/2,1],f0=(e,t)=>e?[Math.trunc(Math.max(0,e.startPoint[0])),Math.trunc(Math.max(0,e.startPoint[1])),Math.trunc(Math.min(t.shape[2]||0,e.endPoint[0])-Math.max(0,e.startPoint[0])),Math.trunc(Math.min(t.shape[1]||0,e.endPoint[1])-Math.max(0,e.startPoint[1]))]:[0,0,0,0],m0=(e,t)=>e?[e.startPoint[0]/(t.shape[2]||0),e.startPoint[1]/(t.shape[1]||0),(e.endPoint[0]-e.startPoint[0])/(t.shape[2]||0),(e.endPoint[1]-e.startPoint[1])/(t.shape[1]||0)]:[0,0,0,0],uw=(e,t)=>{let a=[e.startPoint[0]*t[0],e.startPoint[1]*t[1]],n=[e.endPoint[0]*t[0],e.endPoint[1]*t[1]];return{startPoint:a,endPoint:n,landmarks:e.landmarks,confidence:e.confidence}},vg=(e,t,a)=>{let n=t.shape[1],r=t.shape[2],s=[e.startPoint[1]/n,e.startPoint[0]/r,e.endPoint[1]/n,e.endPoint[0]/r],i=me.cropAndResize(t,[s],[0],a),o=fe(i,Oe.tf255);return Y(i),o},g0=(e,t)=>{let a=h0(e),n=cu(e),r=[t*n[0]/2,t*n[1]/2];return{startPoint:[a[0]-r[0],a[1]-r[1]],endPoint:[a[0]+r[0],a[1]+r[1]],landmarks:e.landmarks,confidence:e.confidence}},y0=e=>{let t=h0(e),a=cu(e),n=Math.max(...a)/2;return{startPoint:[Math.round(t[0]-n),Math.round(t[1]-n)],endPoint:[Math.round(t[0]+n),Math.round(t[1]+n)],landmarks:e.landmarks,confidence:e.confidence}},dw=e=>{let t=e.map(n=>n[0]),a=e.map(n=>n[1]);return{startPoint:[Math.min(...t),Math.min(...a)],endPoint:[Math.max(...t),Math.max(...a)],landmarks:e}},wg=[[1,0,0],[0,1,0],[0,0,1]],fhe=e=>e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI)),mhe=(e,t)=>fhe(Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]));var ow=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]],To=(e,t)=>{let a=0;for(let n=0;n{let a=[];for(let n=0;n{let a=[],n=e.length;for(let r=0;r{let a=Math.cos(e),n=Math.sin(e),r=[[a,-n,0],[n,a,0],[0,0,1]],s=ow(t[0],t[1]),i=lw(s,r),o=ow(-t[0],-t[1]);return lw(i,o)},yhe=e=>{let t=[[e[0][0],e[1][0]],[e[0][1],e[1][1]]],a=[e[0][2],e[1][2]],n=[-To(t[0],a),-To(t[1],a)];return[t[0].concat(n[0]),t[1].concat(n[1]),[0,0,1]]},Ahe=(e,t)=>[To(e,t[0]),To(e,t[1])];function cw(e){let t=e===192?{strides:[4],anchors:[1]}:{strides:[e/16,e/8],anchors:[2,6]},a=[];for(let n=0;n[s[0]/r*(h[0]-r/2),s[1]/r*(h[1]-r/2),h[2]||0]),o=a&&a!==0&&Math.abs(a)>.2,l=o?pw(a,[0,0]):wg,u=o?i.map(h=>[...Ahe(h,l),h[2]]):i,d=o?yhe(n):wg,c=h0(t),p=[To(c,d[0]),To(c,d[1])];return u.map(h=>[Math.trunc(h[0]+p[0]),Math.trunc(h[1]+p[1]),Math.trunc(h[2]||0)])}function fw(e,t,a,n){let r=t.landmarks.length>=rg.count?rg.symmetryLine:bo.symmetryLine,s=0,i=wg,o;if(e&&ne.kernels.includes("rotatewithoffset"))if(s=mhe(t.landmarks[r[0]],t.landmarks[r[1]]),s&&s!==0&&Math.abs(s)>.2){let u=h0(t),d=[u[0]/a.shape[2],u[1]/a.shape[1]],c=me.rotateWithOffset(a,s,0,[d[0],d[1]]);i=pw(-s,u),o=vg(t,c,[n,n]),Y(c)}else o=vg(t,a,[n,n]);else o=vg(t,a,[n,n]);return[s,i,o]}var xhe=e=>{let t=e.map(n=>n[0]),a=e.map(n=>n[1]);return[Math.min(...t)+(Math.max(...t)-Math.min(...t))/2,Math.min(...a)+(Math.max(...a)-Math.min(...a))/2]},mw=(e,t)=>{let a=xhe(e),n=cu(t);return{startPoint:[a[0]-n[0]/2,a[1]-n[1]/2],endPoint:[a[0]+n[0]/2,a[1]+n[1]/2]}};var gw=6,bhe=1.4,zn,Ig=null,Rs=0,hu=null,fu=()=>Rs;async function yw(e){var t;return ne.initial&&(zn=null),zn?e.debug&&K("cached model:",zn.modelUrl):zn=await Ce((t=e.face.detector)==null?void 0:t.modelPath),Rs=zn.executor&&zn.inputs[0].shape?zn.inputs[0].shape[2]:256,hu=Fe(Rs,"int32"),Ig=Kn(cw(Rs)),zn}function vhe(e){if(!Ig||!hu)return pn([0,0]);let t={};t.boxStarts=_e(e,[0,1],[-1,2]),t.centers=xe(t.boxStarts,Ig),t.boxSizes=_e(e,[0,3],[-1,2]),t.boxSizesNormalized=fe(t.boxSizes,hu),t.centersNormalized=fe(t.centers,hu),t.halfBoxSize=fe(t.boxSizesNormalized,Oe.tf2),t.starts=he(t.centersNormalized,t.halfBoxSize),t.ends=xe(t.centersNormalized,t.halfBoxSize),t.startNormalized=ae(t.starts,hu),t.endNormalized=ae(t.ends,hu);let a=ql([t.startNormalized,t.endNormalized],1);return Object.keys(t).forEach(n=>Y(t[n])),a}async function Aw(e,t){var o,l,u,d;if(!e||e.isDisposedInternal||e.shape.length!==4||e.shape[1]<1||e.shape[2]<1)return[];let a={};a.resized=me.resizeBilinear(e,[Rs,Rs]),a.div=fe(a.resized,Oe.tf127),a.normalized=he(a.div,Oe.tf05);let n=zn==null?void 0:zn.execute(a.normalized);if(Array.isArray(n)&&n.length>2){let c=n.sort((p,h)=>p.size-h.size);a.concat384=at([c[0],c[2]],2),a.concat512=at([c[1],c[3]],2),a.concat=at([a.concat512,a.concat384],1),a.batch=$e(a.concat,[0])}else Array.isArray(n)?a.batch=$e(n[0]):a.batch=$e(n);Y(n),a.boxes=vhe(a.batch),a.logits=_e(a.batch,[0,0],[-1,1]),a.sigmoid=Da(a.logits),a.scores=$e(a.sigmoid),a.nms=await me.nonMaxSuppressionAsync(a.boxes,a.scores,((o=t.face.detector)==null?void 0:o.maxDetected)||0,((l=t.face.detector)==null?void 0:l.iouThreshold)||0,((u=t.face.detector)==null?void 0:u.minConfidence)||0);let r=await a.nms.array(),s=[],i=await a.scores.data();for(let c=0;c(((d=t.face.detector)==null?void 0:d.minConfidence)||0)){let h={};h.bbox=_e(a.boxes,[r[c],0],[1,-1]),h.slice=_e(a.batch,[r[c],gw-1],[1,-1]),h.squeeze=$e(h.slice),h.landmarks=J(h.squeeze,[gw,-1]);let f=await h.bbox.data(),m={startPoint:[f[0],f[1]],endPoint:[f[2],f[3]],landmarks:await h.landmarks.array(),confidence:p},g=uw(m,[(e.shape[2]||0)/Rs,(e.shape[1]||0)/Rs]),y=g0(g,t.face.scale||bhe),A=y0(y);s.push(A),Object.keys(h).forEach(x=>Y(h[x]))}}return Object.keys(a).forEach(c=>Y(a[c])),s}var Ya,Ms=0,whe=2.3,Sg=Mn.leftEyeLower0,Tg=Mn.rightEyeLower0,mu={leftBounds:[Sg[0],Sg[Sg.length-1]],rightBounds:[Tg[0],Tg[Tg.length-1]]},gu={upperCenter:3,lowerCenter:4,index:71,numCoordinates:76};async function kw(e){var t,a;return ne.initial&&(Ya=null),Ya?e.debug&&K("cached model:",Ya.modelUrl):Ya=await Ce((t=e.face.iris)==null?void 0:t.modelPath),Ms=(Ya==null?void 0:Ya.executor)&&((a=Ya.inputs)==null?void 0:a[0].shape)?Ya.inputs[0].shape[2]:0,Ms===-1&&(Ms=64),Ya}function A0(e,t,a,n){for(let r=0;r{let t=e[mu.leftBounds[0]][2],a=e[mu.rightBounds[0]][2];return t-a},bw=(e,t,a,n,r,s=!1)=>{let i=y0(g0(dw([e[a],e[n]]),whe)),o=cu(i),l=me.cropAndResize(t,[[i.startPoint[1]/r,i.startPoint[0]/r,i.endPoint[1]/r,i.endPoint[0]/r]],[0],[Ms,Ms]);if(s&&ne.kernels.includes("flipleftright")){let u=me.flipLeftRight(l);Y(l),l=u}return{box:i,boxSize:o,crop:l}},vw=(e,t,a,n=!1)=>{let r=[];for(let s=0;s{let n=e[Mn[`${a}EyeUpper0`][gu.upperCenter]][2],r=e[Mn[`${a}EyeLower0`][gu.lowerCenter]][2],s=(n+r)/2;return t.map((i,o)=>{let l=s;return o===2?l=n:o===4&&(l=r),[i[0],i[1],l]})};async function Iw(e,t,a){if(!(Ya!=null&&Ya.executor))return e;let{box:n,boxSize:r,crop:s}=bw(e,t,mu.leftBounds[0],mu.leftBounds[1],a,!0),{box:i,boxSize:o,crop:l}=bw(e,t,mu.rightBounds[0],mu.rightBounds[1],a,!0),u=at([s,l]);Y(s),Y(l);let d=Ya.execute(u);Y(u);let c=await d.data();Y(d);let p=c.slice(0,gu.numCoordinates*3),{rawCoords:h,iris:f}=vw(p,n,r,!0),m=c.slice(gu.numCoordinates*3),{rawCoords:g,iris:y}=vw(m,i,o,!1),A=khe(e);Math.abs(A)<30?(A0(e,h,"left",null),A0(e,g,"right",null)):A<1?A0(e,h,"left",["EyeUpper0","EyeLower0"]):A0(e,g,"right",["EyeUpper0","EyeLower0"]);let x=ww(e,f,"left"),b=ww(e,y,"right");return e.concat(x).concat(b)}async function Tw(e,t){var s,i,o,l,u,d,c,p,h,f;let a={lips:await((i=(s=t.filter(m=>m.size===160))==null?void 0:s[0])==null?void 0:i.data()),irisL:await((l=(o=t.filter(m=>m.size===10))==null?void 0:o[0])==null?void 0:l.data()),eyeL:await((d=(u=t.filter(m=>m.size===142))==null?void 0:u[0])==null?void 0:d.data()),irisR:await((p=(c=t.filter(m=>m.size===10))==null?void 0:c[1])==null?void 0:p.data()),eyeR:await((f=(h=t.filter(m=>m.size===142))==null?void 0:h[1])==null?void 0:f.data())};for(let m of Object.values(a))if(!m)return e;let n=wo.reduce((m,g)=>m+=e[g][2],0)/wo.length;for(let m=0;mm+=e[g][2],0)/ko.length;for(let m=0;mte()-ir.timestamp,n=ir.skipped<(((u=t.face.detector)==null?void 0:u.skipFrames)||0);!t.skipAllowed||!a||!n||ir.boxes.length===0?(ir.boxes=await Aw(e,t),ir.timestamp=te(),ir.skipped=0):ir.skipped++;let r=[],s=[],i=0,o=kp;for(let A=0;A$.shape[$.shape.length-1]===1).data();if(S.faceScore=Math.round(100*_[0])/100,S.faceScore<(((f=t.face.detector)==null?void 0:f.minConfidence)||1)){if(x.confidence=S.faceScore,t.face.mesh.keepInvalid){S.box=f0(x,e),S.boxRaw=m0(x,e),S.score=S.boxScore,S.mesh=x.landmarks.map($=>[(x.startPoint[0]+x.endPoint[0])/2+(x.endPoint[0]+x.startPoint[0])*$[0]/fu(),(x.startPoint[1]+x.endPoint[1])/2+(x.endPoint[1]+x.startPoint[1])*$[1]/fu()]),S.meshRaw=S.mesh.map($=>[$[0]/(e.shape[2]||1),$[1]/(e.shape[1]||1),($[2]||0)/o]);for(let $ of Object.keys(bo))S.annotations[$]=[S.mesh[bo[$]]]}}else{let $=C.find(O=>O.shape[O.shape.length-1]===1404),M=J($,[-1,3]),I=await M.array();Y(M),(m=t.face.attention)!=null&&m.enabled?I=await Tw(I,C):(g=t.face.iris)!=null&&g.enabled&&(I=await Iw(I,S.tensor,kp)),S.mesh=hw(I,x,b,w,kp),S.meshRaw=S.mesh.map(O=>[O[0]/(e.shape[2]||0),O[1]/(e.shape[1]||0),(O[2]||0)/o]);for(let O of Object.keys(Mn))S.annotations[O]=Mn[O].map(L=>S.mesh[L]);S.score=S.faceScore;let E={...mw(S.mesh,x),confidence:x.confidence,landmarks:x.landmarks};S.box=f0(E,e),S.boxRaw=m0(E,e),s.push(E)}Y(C)}else{S.box=f0(x,e),S.boxRaw=m0(x,e),S.score=S.boxScore,S.mesh=x.landmarks.map(C=>[(x.startPoint[0]+x.endPoint[0])/2+(x.endPoint[0]+x.startPoint[0])*C[0]/fu(),(x.startPoint[1]+x.endPoint[1])/2+(x.endPoint[1]+x.startPoint[1])*C[1]/fu()]),S.meshRaw=S.mesh.map(C=>[C[0]/(e.shape[2]||0),C[1]/(e.shape[1]||0),(C[2]||0)/o]);for(let C of Object.keys(bo))S.annotations[C]=[S.mesh[bo[C]]]}S.score>(((y=t.face.detector)==null?void 0:y.minConfidence)||1)?r.push(S):Y(S.tensor)}return ir.boxes=s,r}async function Nw(e){var t,a,n,r,s,i;return ne.initial&&(wt=null),((t=e.face.attention)==null?void 0:t.enabled)&&(wt==null?void 0:wt.signature)&&Object.keys(((a=wt==null?void 0:wt.signature)==null?void 0:a.outputs)||{}).length<6&&(wt=null),wt?e.debug&&K("cached model:",wt.modelUrl):(n=e.face.attention)!=null&&n.enabled?wt=await Ce(e.face.attention.modelPath):wt=await Ce((r=e.face.mesh)==null?void 0:r.modelPath),kp=wt.executor&&((s=wt==null?void 0:wt.inputs)==null?void 0:s[0].shape)?(i=wt==null?void 0:wt.inputs)==null?void 0:i[0].shape[2]:256,wt}var Ew=vo,Rw=vp;var She=["angry","disgust","fear","happy","sad","surprise","neutral"],An,x0=[],Mw=0,$w=0,Ng=Number.MAX_SAFE_INTEGER;async function _w(e){var t;return ne.initial&&(An=null),An?e.debug&&K("cached model:",An.modelUrl):An=await Ce((t=e.face.emotion)==null?void 0:t.modelPath),An}async function Eg(e,t,a,n){var i,o;if(!An)return[];let r=Ng<(((i=t.face.emotion)==null?void 0:i.skipFrames)||0),s=(((o=t.face.emotion)==null?void 0:o.skipTime)||0)>te()-$w;return t.skipAllowed&&s&&r&&Mw===n&&x0[a]&&x0[a].length>0?(Ng++,x0[a]):(Ng=0,new Promise(async l=>{var d;let u=[];if((d=t.face.emotion)!=null&&d.enabled){let c={},p=An!=null&&An.inputs[0].shape?An.inputs[0].shape[2]:0;c.resize=me.resizeBilinear(e,[p,p],!1),c.channels=ae(c.resize,Oe.rgb),c.grayscale=tt(c.channels,3,!0),c.grayscaleSub=he(c.grayscale,Oe.tf05),c.grayscaleMul=ae(c.grayscaleSub,Oe.tf2),c.emotion=An==null?void 0:An.execute(c.grayscaleMul),$w=te();let h=await c.emotion.data();for(let f=0;f(t.face.emotion.minConfidence||0)&&u.push({score:Math.min(.99,Math.trunc(100*h[f])/100),emotion:She[f]});u.sort((f,m)=>m.score-f.score),Object.keys(c).forEach(f=>Y(c[f]))}x0[a]=u,Mw=n,l(u)}))}var fa,$s=[],Pw=0,Ow=0,Rg=Number.MAX_SAFE_INTEGER;async function Dw(e){var t;return ne.initial&&(fa=null),fa?e.debug&&K("cached model:",fa.modelUrl):fa=await Ce((t=e.face.description)==null?void 0:t.modelPath),fa}function The(e){let t=e.image||e.tensor||e;if(!(fa!=null&&fa.inputs[0].shape))return t;let a=me.resizeBilinear(t,[fa.inputs[0].shape[2],fa.inputs[0].shape[1]],!1),n=ae(a,Oe.tf255);return Y(a),n}async function Mg(e,t,a,n){var o,l,u,d;let r={age:0,gender:"unknown",genderScore:0,descriptor:[]};if(!(fa!=null&&fa.executor))return r;let s=Rg<(((o=t.face.description)==null?void 0:o.skipFrames)||0),i=(((l=t.face.description)==null?void 0:l.skipTime)||0)>te()-Pw;return t.skipAllowed&&s&&i&&Ow===n&&((u=$s==null?void 0:$s[a])==null?void 0:u.age)>0&&((d=$s==null?void 0:$s[a])==null?void 0:d.genderScore)>0?(Rg++,$s[a]):(Rg=0,new Promise(async c=>{var p;if((p=t.face.description)!=null&&p.enabled){let h=The(e),f=fa==null?void 0:fa.execute(h);Pw=te(),Y(h);let g=await f.find(N=>N.shape[1]===1).data(),y=Math.trunc(200*Math.abs(g[0]-.5))/100;y>(t.face.description.minConfidence||0)&&(r.gender=g[0]<=.5?"female":"male",r.genderScore=Math.min(.99,y));let A=ar(f.find(N=>N.shape[1]===100),1),x=(await A.data())[0];Y(A);let w=await f.find(N=>N.shape[1]===100).data();r.age=Math.round(w[x-1]>w[x+1]?10*x-100*w[x-1]:10*x+100*w[x+1])/10,(Number.isNaN(g[0])||Number.isNaN(w[0]))&&K("faceres error:",{model:fa,result:f});let S=f.find(N=>N.shape[1]===1024),C=S?await S.data():[];r.descriptor=Array.from(C),f.forEach(N=>Y(N))}$s[a]=r,Ow=n,c(r)}))}var yu=.1,$g=.5;function Che(e,t,a){let n=!1,r=a.length-1;for(let s=0;st!=a[r].y>t&&e<(a[r].x-a[s].x)*(t-a[s].y)/(a[r].y-a[s].y)+a[s].x&&(n=!n);return n}async function Lw(e){if(!e.tensor||!e.mesh||e.mesh.length<100)return e.tensor;let t=e.tensor.shape[2]||0,a=e.tensor.shape[1]||0,n=await e.tensor.buffer(),r=[];for(let i of Mn.silhouette)r.push({x:(e.mesh[i][0]-e.box[0])/e.box[2],y:(e.mesh[i][1]-e.box[1])/e.box[3]});yu&&yu>0&&(r=r.map(i=>({x:i.x>.5?i.x+yu:i.x-yu,y:i.y>.5?i.y+yu:i.y-yu})));for(let i=0;ite()-Ww,s=_g<(((o=t.face.antispoof)==null?void 0:o.skipFrames)||0);return t.skipAllowed&&r&&s&&Bw===n&&b0[a]?(_g++,b0[a]):(_g=0,new Promise(async l=>{let u=me.resizeBilinear(e,[Qt!=null&&Qt.inputs[0].shape?Qt.inputs[0].shape[2]:0,Qt!=null&&Qt.inputs[0].shape?Qt.inputs[0].shape[1]:0],!1),d=Qt==null?void 0:Qt.execute(u),c=(await d.data())[0];b0[a]=Math.round(100*c)/100,Bw=n,Ww=te(),Y([u,d]),l(b0[a])}))}var ea,v0=[],Pg=Number.MAX_SAFE_INTEGER,Uw=0,jw=0;async function Hw(e){var t;return ne.initial&&(ea=null),ea?e.debug&&K("cached model:",ea.modelUrl):ea=await Ce((t=e.face.liveness)==null?void 0:t.modelPath),ea}async function Og(e,t,a,n){var i,o;if(!(ea!=null&&ea.executor))return 0;let r=(((i=t.face.liveness)==null?void 0:i.skipTime)||0)>te()-jw,s=Pg<(((o=t.face.liveness)==null?void 0:o.skipFrames)||0);return t.skipAllowed&&r&&s&&Uw===n&&v0[a]?(Pg++,v0[a]):(Pg=0,new Promise(async l=>{let u=me.resizeBilinear(e,[ea!=null&&ea.inputs[0].shape?ea.inputs[0].shape[2]:0,ea!=null&&ea.inputs[0].shape?ea.inputs[0].shape[1]:0],!1),d=ea==null?void 0:ea.execute(u),c=(await d.data())[0];v0[a]=Math.round(100*c)/100,Uw=n,jw=te(),Y([u,d]),l(v0[a])}))}var $n,Dg=[],Ehe=["white","black","asian","indian","other"],Rhe=[15,23,28,35.5,45.5,55.5,65],Xw=0,Kw=0,zg=Number.MAX_SAFE_INTEGER;async function Zw(e){var t;return ne.initial&&($n=null),$n?e.debug&&K("cached model:",$n.modelUrl):$n=await Ce((t=e.face.gear)==null?void 0:t.modelPath),$n}async function Lg(e,t,a,n){var i,o;if(!$n)return{age:0,gender:"unknown",genderScore:0,race:[]};let r=zg<(((i=t.face.gear)==null?void 0:i.skipFrames)||0),s=(((o=t.face.gear)==null?void 0:o.skipTime)||0)>te()-Kw;return t.skipAllowed&&s&&r&&Xw===n&&Dg[a]?(zg++,Dg[a]):(zg=0,new Promise(async l=>{var y,A;if(!($n!=null&&$n.inputs[0].shape))return;let u={},d=[[0,.1,.9,.9]];u.resize=me.cropAndResize(e,d,[0],[$n.inputs[0].shape[2],$n.inputs[0].shape[1]]);let c={age:0,gender:"unknown",genderScore:0,race:[]};(y=t.face.gear)!=null&&y.enabled&&([u.age,u.gender,u.race]=$n.execute(u.resize,["age_output","gender_output","race_output"]));let p=await u.gender.data();c.gender=p[0]>p[1]?"male":"female",c.genderScore=Math.round(100*(p[0]>p[1]?p[0]:p[1]))/100;let h=await u.race.data();for(let x=0;x(((A=t.face.gear)==null?void 0:A.minConfidence)||.2)&&c.race.push({score:Math.round(100*h[x])/100,race:Ehe[x]});c.race.sort((x,b)=>b.score-x.score);let m=Array.from(await u.age.data()).map((x,b)=>[Rhe[b],x]).sort((x,b)=>b[1]-x[1]),g=m[0][0];for(let x=1;xY(u[x])),Dg[a]=c,Xw=n,Kw=te(),l(c)}))}var Ja,w0=[],Jw=0,Qw=0,Bg=Number.MAX_SAFE_INTEGER;async function ek(e){return ne.initial&&(Ja=null),Ja?e.debug&&K("cached model:",Ja.modelUrl):Ja=await Ce(e.face.ssrnet.modelPathAge),Ja}async function Wg(e,t,a,n){var i,o,l,u;if(!Ja)return{age:0};let r=Bg<(((i=t.face.ssrnet)==null?void 0:i.skipFrames)||0),s=(((o=t.face.ssrnet)==null?void 0:o.skipTime)||0)>te()-Qw;return t.skipAllowed&&r&&s&&Jw===n&&((l=w0[a])==null?void 0:l.age)&&((u=w0[a])==null?void 0:u.age)>0?(Bg++,w0[a]):(Bg=0,new Promise(async d=>{var h;if(!(Ja!=null&&Ja.inputs)||!Ja.inputs[0]||!Ja.inputs[0].shape)return;let c={};c.resize=me.resizeBilinear(e,[Ja.inputs[0].shape[2],Ja.inputs[0].shape[1]],!1),c.enhance=ae(c.resize,Oe.tf255);let p={age:0};if((h=t.face.ssrnet)!=null&&h.enabled&&(c.age=Ja.execute(c.enhance)),c.age){let f=await c.age.data();p.age=Math.trunc(10*f[0])/10}Object.keys(c).forEach(f=>Y(c[f])),w0[a]=p,Jw=n,Qw=te(),d(p)}))}var _n,k0=[],ak=0,nk=0,Vg=Number.MAX_SAFE_INTEGER,Gg=[.2989,.587,.114];async function rk(e){var t;return ne.initial&&(_n=null),_n?e.debug&&K("cached model:",_n.modelUrl):_n=await Ce((t=e.face.ssrnet)==null?void 0:t.modelPathGender),_n}async function Ug(e,t,a,n){var i,o,l,u;if(!_n)return{gender:"unknown",genderScore:0};let r=Vg<(((i=t.face.ssrnet)==null?void 0:i.skipFrames)||0),s=(((o=t.face.ssrnet)==null?void 0:o.skipTime)||0)>te()-nk;return t.skipAllowed&&r&&s&&ak===n&&((l=k0[a])==null?void 0:l.gender)&&((u=k0[a])==null?void 0:u.genderScore)>0?(Vg++,k0[a]):(Vg=0,new Promise(async d=>{var f;if(!(_n!=null&&_n.inputs[0].shape))return;let c={};c.resize=me.resizeBilinear(e,[_n.inputs[0].shape[2],_n.inputs[0].shape[1]],!1),c.enhance=Ee(()=>{let[m,g,y]=ka(c.resize,3,3),A=ae(m,Gg[0]),x=ae(g,Gg[1]),b=ae(y,Gg[2]),w=mh([A,x,b]);return ae(he(w,Oe.tf05),2)});let p={gender:"unknown",genderScore:0};(f=t.face.ssrnet)!=null&&f.enabled&&(c.gender=_n.execute(c.enhance));let h=await c.gender.data();p.gender=h[0]>h[1]?"female":"male",p.genderScore=h[0]>h[1]?Math.trunc(100*h[0])/100:Math.trunc(100*h[1])/100,Object.keys(c).forEach(m=>Y(c[m])),k0[a]=p,ak=n,nk=te(),d(p)}))}var Qa,jg=[],ik=0,ok=0,lk=Number.MAX_SAFE_INTEGER;async function uk(e){var t;return ne.initial&&(Qa=null),Qa?e.debug&&K("cached model:",Qa.modelUrl):Qa=await Ce((t=e.face.mobilefacenet)==null?void 0:t.modelPath),Qa}async function Hg(e,t,a,n){var i,o;if(!(Qa!=null&&Qa.executor))return[];let r=lk<(((i=t.face.mobilefacenet)==null?void 0:i.skipFrames)||0),s=(((o=t.face.mobilefacenet)==null?void 0:o.skipTime)||0)>te()-ok;return t.skipAllowed&&s&&r&&ik===n&&jg[a]?(lk++,jg[a]):new Promise(async l=>{var d;let u=[];if(((d=t.face.mobilefacenet)==null?void 0:d.enabled)&&(Qa==null?void 0:Qa.inputs[0].shape)){let c={};c.crop=me.resizeBilinear(e,[Qa.inputs[0].shape[2],Qa.inputs[0].shape[1]],!1),c.data=Qa.execute(c.crop);let p=await c.data.data();u=Array.from(p),Object.keys(c).forEach(h=>Y(c[h]))}jg[a]=u,ik=n,ok=te(),l(u)})}var en,qg=[],pk=0,ck=0,hk=Number.MAX_SAFE_INTEGER;async function fk(e){return ne.initial&&(en=null),en?e.debug&&K("cached model:",en.modelUrl):en=await Ce(e.face.insightface.modelPath),en}async function Xg(e,t,a,n){var i,o;if(!(en!=null&&en.executor))return[];let r=hk<(((i=t.face.insightface)==null?void 0:i.skipFrames)||0),s=(((o=t.face.insightface)==null?void 0:o.skipTime)||0)>te()-ck;return t.skipAllowed&&s&&r&&pk===n&&qg[a]?(hk++,qg[a]):new Promise(async l=>{var d;let u=[];if(((d=t.face.insightface)==null?void 0:d.enabled)&&(en==null?void 0:en.inputs[0].shape)){let c={};c.crop=me.resizeBilinear(e,[en.inputs[0].shape[2],en.inputs[0].shape[1]],!1),c.data=en.execute(c.crop);let p=await c.data.data();u=Array.from(p),Object.keys(c).forEach(h=>Y(c[h]))}qg[a]=u,pk=n,ck=te(),l(u)})}var Mhe=e=>{let t=(c,p)=>Math.atan2(c[1]-p[1],c[0]-p[0]);if(!e.annotations.rightEyeIris||!e.annotations.leftEyeIris)return{bearing:0,strength:0};let a=[0,-.1],n=1,r=(e.mesh[33][2]||0)>(e.mesh[263][2]||0),s=r?e.mesh[473]:e.mesh[468],i=r?[(e.mesh[133][0]+e.mesh[33][0])/2,(e.mesh[133][1]+e.mesh[33][1])/2]:[(e.mesh[263][0]+e.mesh[362][0])/2,(e.mesh[263][1]+e.mesh[362][1])/2],o=r?[e.mesh[133][0]-e.mesh[33][0],e.mesh[23][1]-e.mesh[27][1]]:[e.mesh[263][0]-e.mesh[362][0],e.mesh[253][1]-e.mesh[257][1]],l=[(i[0]-s[0])/o[0]-a[0],n*(s[1]-i[1])/o[1]-a[1]],u=Math.sqrt(l[0]*l[0]+l[1]*l[1]);return u=Math.min(u,e.boxRaw[2]/2,e.boxRaw[3]/2),{bearing:(t([0,0],l)+Math.PI/2)%Math.PI,strength:u}},gk=(e,t)=>{let a=m=>{let g=Math.sqrt(m[0]*m[0]+m[1]*m[1]+m[2]*m[2]);return m[0]/=g,m[1]/=g,m[2]/=g,m},n=(m,g)=>{let y=m[0]-g[0],A=m[1]-g[1],x=m[2]-g[2];return[y,A,x]},r=(m,g)=>{let y=m[1]*g[2]-m[2]*g[1],A=m[2]*g[0]-m[0]*g[2],x=m[0]*g[1]-m[1]*g[0];return[y,A,x]},s=m=>{let[g,y,A,x,b,w,S,C,N]=m,_,$,M;return x<1?x>-1?(M=Math.asin(x),$=Math.atan2(-S,g),_=Math.atan2(-w,b)):(M=-Math.PI/2,$=-Math.atan2(C,N),_=0):(M=Math.PI/2,$=Math.atan2(C,N),_=0),Number.isNaN(_)&&(_=0),Number.isNaN($)&&($=0),Number.isNaN(M)&&(M=0),{pitch:2*-_,yaw:2*-$,roll:2*-M}},i=e.meshRaw;if(!i||i.length<300)return{angle:{pitch:0,yaw:0,roll:0},matrix:[1,0,0,0,1,0,0,0,1],gaze:{bearing:0,strength:0}};let o=Math.max(e.boxRaw[2]*t[0],e.boxRaw[3]*t[1])/1.5,l=[i[10],i[152],i[234],i[454]].map(m=>[m[0]*t[0]/o,m[1]*t[1]/o,m[2]]),u=a(n(l[1],l[0])),d=a(n(l[3],l[2])),c=a(r(d,u));d=r(u,c);let p=[d[0],d[1],d[2],u[0],u[1],u[2],c[0],c[1],c[2]],h=s(p),f=i.length===478?Mhe(e):{bearing:0,strength:0};return{angle:h,matrix:p,gaze:f}};function yk(e,t){let a=e==null?void 0:e.annotations;if(!a)return 0;let n=Math.max(Math.abs(a.leftEyeIris[3][0]-a.leftEyeIris[1][0]),Math.abs(a.rightEyeIris[3][0]-a.rightEyeIris[1][0]))/t;return Math.round(1.17/n)/100}var Kg=async(e,t)=>{var f,m,g,y,A,x,b,w,S,C,N,_,$,M,I,E,O,L,B,G,j,U,H;let a=te(),n,r,s,i,o,l,u,d,c,p=[];e.state="run:face";let h=await Cw(t,e.config);if(e.performance.face=ne.perfadd?(e.performance.face||0)+Math.trunc(te()-a):Math.trunc(te()-a),!t.shape||t.shape.length!==4)return[];if(!h)return[];for(let W=0;W200?gk(h[W],[t.shape[2],t.shape[1]]):null;e.analyze("Start Emotion:"),e.config.async?i=(m=e.config.face.emotion)!=null&&m.enabled?Eg(h[W].tensor||ze([]),e.config,W,h.length):[]:(e.state="run:emotion",a=te(),i=(g=e.config.face.emotion)!=null&&g.enabled?await Eg(h[W].tensor||ze([]),e.config,W,h.length):[],e.performance.emotion=ne.perfadd?(e.performance.emotion||0)+Math.trunc(te()-a):Math.trunc(te()-a)),e.analyze("End Emotion:"),e.analyze("Start AntiSpoof:"),e.config.async?u=(y=e.config.face.antispoof)!=null&&y.enabled?Fg(h[W].tensor||ze([]),e.config,W,h.length):0:(e.state="run:antispoof",a=te(),u=(A=e.config.face.antispoof)!=null&&A.enabled?await Fg(h[W].tensor||ze([]),e.config,W,h.length):0,e.performance.antispoof=ne.perfadd?(e.performance.antispoof||0)+Math.trunc(te()-a):Math.trunc(te()-a)),e.analyze("End AntiSpoof:"),e.analyze("Start Liveness:"),e.config.async?d=(x=e.config.face.liveness)!=null&&x.enabled?Og(h[W].tensor||ze([]),e.config,W,h.length):0:(e.state="run:liveness",a=te(),d=(b=e.config.face.liveness)!=null&&b.enabled?await Og(h[W].tensor||ze([]),e.config,W,h.length):0,e.performance.liveness=ne.perfadd?(e.performance.antispoof||0)+Math.trunc(te()-a):Math.trunc(te()-a)),e.analyze("End Liveness:"),e.analyze("Start GEAR:"),e.config.async?r=(w=e.config.face.gear)!=null&&w.enabled?Lg(h[W].tensor||ze([]),e.config,W,h.length):null:(e.state="run:gear",a=te(),r=(S=e.config.face.gear)!=null&&S.enabled?await Lg(h[W].tensor||ze([]),e.config,W,h.length):null,e.performance.gear=Math.trunc(te()-a)),e.analyze("End GEAR:"),e.analyze("Start SSRNet:"),e.config.async?(n=(C=e.config.face.ssrnet)!=null&&C.enabled?Wg(h[W].tensor||ze([]),e.config,W,h.length):null,s=(N=e.config.face.ssrnet)!=null&&N.enabled?Ug(h[W].tensor||ze([]),e.config,W,h.length):null):(e.state="run:ssrnet",a=te(),n=(_=e.config.face.ssrnet)!=null&&_.enabled?await Wg(h[W].tensor||ze([]),e.config,W,h.length):null,s=($=e.config.face.ssrnet)!=null&&$.enabled?await Ug(h[W].tensor||ze([]),e.config,W,h.length):null,e.performance.ssrnet=Math.trunc(te()-a)),e.analyze("End SSRNet:"),e.analyze("Start MobileFaceNet:"),e.config.async?o=(M=e.config.face.mobilefacenet)!=null&&M.enabled?Hg(h[W].tensor||ze([]),e.config,W,h.length):null:(e.state="run:mobilefacenet",a=te(),o=(I=e.config.face.mobilefacenet)!=null&&I.enabled?await Hg(h[W].tensor||ze([]),e.config,W,h.length):null,e.performance.mobilefacenet=Math.trunc(te()-a)),e.analyze("End MobileFaceNet:"),e.analyze("Start InsightFace:"),e.config.async?l=(E=e.config.face.insightface)!=null&&E.enabled?Xg(h[W].tensor||ze([]),e.config,W,h.length):null:(e.state="run:mobilefacenet",a=te(),l=(O=e.config.face.insightface)!=null&&O.enabled?await Xg(h[W].tensor||ze([]),e.config,W,h.length):null,e.performance.mobilefacenet=Math.trunc(te()-a)),e.analyze("End InsightFace:"),e.analyze("Start Description:"),e.config.async?c=Mg(h[W].tensor||ze([]),e.config,W,h.length):(e.state="run:description",a=te(),c=await Mg(h[W].tensor||ze([]),e.config,W,h.length),e.performance.description=ne.perfadd?(e.performance.description||0)+Math.trunc(te()-a):Math.trunc(te()-a)),e.analyze("End Description:"),e.config.async&&([n,s,i,o,l,c,r,u,d]=await Promise.all([n,s,i,o,l,c,r,u,d])),e.analyze("Finish Face:"),((L=e.config.face.ssrnet)==null?void 0:L.enabled)&&n&&s&&(c={...c,age:n.age,gender:s.gender,genderScore:s.genderScore}),((B=e.config.face.gear)==null?void 0:B.enabled)&&r&&(c={...c,age:r.age,gender:r.gender,genderScore:r.genderScore,race:r.race}),((G=e.config.face.mobilefacenet)==null?void 0:G.enabled)&&o&&(c.descriptor=o),((j=e.config.face.insightface)==null?void 0:j.enabled)&&l&&(c.descriptor=l);let Z=(U=e.config.face.iris)!=null&&U.enabled?yk(h[W],t.shape[2]):0,re=(H=e.config.face.detector)!=null&&H.return?$e(h[W].tensor):null;Y(h[W].tensor),h[W].tensor&&delete h[W].tensor;let ee={...h[W],id:W};c.age&&(ee.age=c.age),c.gender&&(ee.gender=c.gender),c.genderScore&&(ee.genderScore=c.genderScore),c.descriptor&&(ee.embedding=c.descriptor),c.race&&(ee.race=c.race),i&&(ee.emotion=i),u&&(ee.real=u),d&&(ee.live=d),Z>0&&(ee.distance=Z),Q&&(ee.rotation=Q),re&&(ee.tensor=re),p.push(ee),e.analyze("End Face")}return e.analyze("End FaceMesh:"),e.config.async&&(e.performance.face&&delete e.performance.face,e.performance.age&&delete e.performance.age,e.performance.gender&&delete e.performance.gender,e.performance.emotion&&delete e.performance.emotion),p};var Ma={thumb:0,index:1,middle:2,ring:3,pinky:4,all:[0,1,2,3,4],nameMapping:{0:"thumb",1:"index",2:"middle",3:"ring",4:"pinky"},pointsMapping:{0:[[0,1],[1,2],[2,3],[3,4]],1:[[0,5],[5,6],[6,7],[7,8]],2:[[0,9],[9,10],[10,11],[11,12]],3:[[0,13],[13,14],[14,15],[15,16]],4:[[0,17],[17,18],[18,19],[19,20]]},getName:e=>Ma.nameMapping[e],getPoints:e=>Ma.pointsMapping[e]},Fs={none:0,half:1,full:2,nameMapping:{0:"none",1:"half",2:"full"},getName:e=>Fs.nameMapping[e]},Nt={verticalUp:0,verticalDown:1,horizontalLeft:2,horizontalRight:3,diagonalUpRight:4,diagonalUpLeft:5,diagonalDownRight:6,diagonalDownLeft:7,nameMapping:{0:"verticalUp",1:"verticalDown",2:"horizontalLeft",3:"horizontalRight",4:"diagonalUpRight",5:"diagonalUpLeft",6:"diagonalDownRight",7:"diagonalDownLeft"},getName:e=>Nt.nameMapping[e]},_s=class{constructor(t){le(this,"name");le(this,"curls");le(this,"directions");le(this,"weights");le(this,"weightsRelative");this.name=t,this.curls={},this.directions={},this.weights=[1,1,1,1,1],this.weightsRelative=[1,1,1,1,1]}curl(t,a,n){typeof this.curls[t]=="undefined"&&(this.curls[t]=[]),this.curls[t].push([a,n])}direction(t,a,n){this.directions[t]||(this.directions[t]=[]),this.directions[t].push([a,n])}weight(t,a){this.weights[t]=a;let n=this.weights.reduce((r,s)=>r+s,0);this.weightsRelative=this.weights.map(r=>r*5/n)}matchAgainst(t,a){let n=0;for(let r in t){let s=t[r],i=this.curls[r];if(typeof i=="undefined"){n+=this.weightsRelative[r];continue}for(let[o,l]of i)if(s===o){n+=l*this.weightsRelative[r];break}}for(let r in a){let s=a[r],i=this.directions[r];if(typeof i=="undefined"){n+=this.weightsRelative[r];continue}for(let[o,l]of i)if(s===o){n+=l*this.weightsRelative[r];break}}return n/10}};var{thumb:Ln,index:Rr,middle:Mr,ring:Co,pinky:No}=Ma,{none:Bn,half:_he,full:Wn}=Fs,{verticalUp:Au,verticalDown:s5e,horizontalLeft:Zg,horizontalRight:Fhe,diagonalUpRight:Phe,diagonalUpLeft:xu,diagonalDownRight:i5e,diagonalDownLeft:o5e}=Nt,Ps=new _s("thumbs up");Ps.curl(Ln,Bn,1);Ps.direction(Ln,Au,1);Ps.direction(Ln,xu,.25);Ps.direction(Ln,Phe,.25);for(let e of[Ma.index,Ma.middle,Ma.ring,Ma.pinky])Ps.curl(e,Wn,1),Ps.direction(e,Zg,1),Ps.direction(e,Fhe,1);var Bt=new _s("victory");Bt.curl(Ln,_he,.5);Bt.curl(Ln,Bn,.5);Bt.direction(Ln,Au,1);Bt.direction(Ln,xu,1);Bt.curl(Rr,Bn,1);Bt.direction(Rr,Au,.75);Bt.direction(Rr,xu,1);Bt.curl(Mr,Bn,1);Bt.direction(Mr,Au,1);Bt.direction(Mr,xu,.75);Bt.curl(Co,Wn,1);Bt.direction(Co,Au,.2);Bt.direction(Co,xu,1);Bt.direction(Co,Zg,.2);Bt.curl(No,Wn,1);Bt.direction(No,Au,.2);Bt.direction(No,xu,1);Bt.direction(No,Zg,.2);Bt.weight(Rr,2);Bt.weight(Mr,2);var Os=new _s("point");Os.curl(Ln,Wn,1);Os.curl(Rr,Bn,.5);Os.curl(Mr,Wn,.5);Os.curl(Co,Wn,.5);Os.curl(No,Wn,.5);Os.weight(Rr,2);Os.weight(Mr,2);var Ds=new _s("middle finger");Ds.curl(Ln,Bn,1);Ds.curl(Rr,Wn,.5);Ds.curl(Mr,Wn,.5);Ds.curl(Co,Wn,.5);Ds.curl(No,Wn,.5);Ds.weight(Rr,2);Ds.weight(Mr,2);var bu=new _s("open palm");bu.curl(Ln,Bn,.75);bu.curl(Rr,Bn,.75);bu.curl(Mr,Bn,.75);bu.curl(Co,Bn,.75);bu.curl(No,Bn,.75);var Ak=[Ps,Bt,Os,Ds,bu];var Ohe=.7,Eo={HALF_CURL_START_LIMIT:60,NO_CURL_START_LIMIT:130,DISTANCE_VOTE_POWER:1.1,SINGLE_ANGLE_VOTE_POWER:.9,TOTAL_ANGLE_VOTE_POWER:1.6};function xk(e,t,a,n){let r=(t-n)/(e-a),s=Math.atan(r)*180/Math.PI;return s<=0?s=-s:s>0&&(s=180-s),s}function vk(e,t){if(!e||!t)return[0,0];let a=xk(e[0],e[1],t[0],t[1]);if(e.length===2)return a;let n=xk(e[1],e[2],t[1],t[2]);return[a,n]}function bk(e,t=1){let a=0,n=0,r=0;return e>=75&&e<=105?a=1*t:e>=25&&e<=155?n=1*t:r=1*t,[a,n,r]}function Dhe(e,t,a){let n=e[0]-t[0],r=e[0]-a[0],s=t[0]-a[0],i=e[1]-t[1],o=e[1]-a[1],l=t[1]-a[1],u=e[2]-t[2],d=e[2]-a[2],c=t[2]-a[2],p=Math.sqrt(n*n+i*i+u*u),h=Math.sqrt(r*r+o*o+d*d),f=Math.sqrt(s*s+l*l+c*c),m=(f*f+p*p-h*h)/(2*f*p);m>1?m=1:m<-1&&(m=-1);let g=Math.acos(m);g=57.2958*g%180;let y;return g>Eo.NO_CURL_START_LIMIT?y=Fs.none:g>Eo.HALF_CURL_START_LIMIT?y=Fs.half:y=Fs.full,y}function wk(e,t,a,n){let r;return n===Math.abs(e)?e>0?r=Nt.horizontalLeft:r=Nt.horizontalRight:n===Math.abs(t)?t>0?r=Nt.horizontalLeft:r=Nt.horizontalRight:a>0?r=Nt.horizontalLeft:r=Nt.horizontalRight,r}function kk(e,t,a,n){let r;return n===Math.abs(e)?e<0?r=Nt.verticalDown:r=Nt.verticalUp:n===Math.abs(t)?t<0?r=Nt.verticalDown:r=Nt.verticalUp:a<0?r=Nt.verticalDown:r=Nt.verticalUp,r}function zhe(e,t,a,n,r,s,i,o){let l,u=kk(e,t,a,n),d=wk(r,s,i,o);return u===Nt.verticalUp?d===Nt.horizontalLeft?l=Nt.diagonalUpLeft:l=Nt.diagonalUpRight:d===Nt.horizontalLeft?l=Nt.diagonalDownLeft:l=Nt.diagonalDownRight,l}function Lhe(e,t,a,n){let r=e[0]-t[0],s=e[0]-a[0],i=t[0]-a[0],o=e[1]-t[1],l=e[1]-a[1],u=t[1]-a[1],d=Math.max(Math.abs(r),Math.abs(s),Math.abs(i)),c=Math.max(Math.abs(o),Math.abs(l),Math.abs(u)),p=0,h=0,f=0,m=c/(d+1e-5);m>1.5?p+=Eo.DISTANCE_VOTE_POWER:m>.66?h+=Eo.DISTANCE_VOTE_POWER:f+=Eo.DISTANCE_VOTE_POWER;let g=Math.sqrt(r*r+o*o),y=Math.sqrt(s*s+l*l),A=Math.sqrt(i*i+u*u),x=Math.max(g,y,A),b=e[0],w=e[1],S=a[0],C=a[1];x===g?(S=a[0],C=a[1]):x===A&&(b=t[0],w=t[1]);let $=vk([b,w],[S,C]),M=bk($,Eo.TOTAL_ANGLE_VOTE_POWER);p+=M[0],h+=M[1],f+=M[2];for(let E of n){let O=bk(E,Eo.SINGLE_ANGLE_VOTE_POWER);p+=O[0],h+=O[1],f+=O[2]}let I;return p===Math.max(p,h,f)?I=kk(l,o,u,c):f===Math.max(h,f)?I=wk(s,r,i,d):I=zhe(l,o,u,c,s,r,i,d),I}function Ik(e){let t=[],a=[],n=[],r=[];if(!e)return{curls:n,directions:r};for(let s of Ma.all){let i=Ma.getPoints(s),o=[],l=[];for(let u of i){let d=e[u[0]],c=e[u[1]],p=vk(d,c),h=p[0],f=p[1];o.push(h),l.push(f)}t.push(o),a.push(l)}for(let s of Ma.all){let i=s===Ma.thumb?1:0,o=Ma.getPoints(s),l=e[o[i][0]],u=e[o[i+1][1]],d=e[o[3][1]],c=Dhe(l,u,d),p=Lhe(l,u,d,t[s].slice(i));n[s]=c,r[s]=p}return{curls:n,directions:r}}function I0(e){if(!e||e.length===0)return null;let t=Ik(e),a={};for(let n of Ma.all)a[Ma.getName(n)]={curl:Fs.getName(t.curls[n]),direction:Nt.getName(t.directions[n])};return a}function Sk(e){let t=[];if(!e||e.length===0)return t;let a=Ik(e);for(let n of Ak){let r=n.matchAgainst(a.curls,a.directions);r>=Ohe&&t.push({name:n.name,confidence:r})}return t}var Tk=e=>{if(!e)return[];let t=[];for(let a=0;al.part==="leftWrist"),r=e[a].keypoints.find(l=>l.part==="rightWrist"),s=e[a].keypoints.find(l=>l.part==="nose");s&&n&&r&&n.position[1]l.part==="leftShoulder"),o=e[a].keypoints.find(l=>l.part==="rightShoulder");i&&o&&Math.abs(i.positionRaw[1]-o.positionRaw[1])>.1&&t.push({body:a,gesture:`leaning ${i.position[1]>o.position[1]?"left":"right"}`})}return t},Ck=e=>{if(!e)return[];let t=[];for(let a=0;a450){let n=(e[a].mesh[33][2]||0)-(e[a].mesh[263][2]||0),r=e[a].mesh[33][0]-e[a].mesh[263][0];Math.abs(n/r)<=.15?t.push({face:a,gesture:"facing center"}):t.push({face:a,gesture:`facing ${n<0?"left":"right"}`}),Math.abs(e[a].mesh[374][1]-e[a].mesh[386][1])/Math.abs(e[a].mesh[443][1]-e[a].mesh[450][1])<.2&&t.push({face:a,gesture:"blink left eye"}),Math.abs(e[a].mesh[145][1]-e[a].mesh[159][1])/Math.abs(e[a].mesh[223][1]-e[a].mesh[230][1])<.2&&t.push({face:a,gesture:"blink right eye"});let o=Math.min(100,500*Math.abs(e[a].mesh[13][1]-e[a].mesh[14][1])/Math.abs(e[a].mesh[10][1]-e[a].mesh[152][1]));o>10&&t.push({face:a,gesture:`mouth ${Math.trunc(o)}% open`});let l=e[a].mesh[152][2]||0;Math.abs(l)>10&&t.push({face:a,gesture:`head ${l<0?"up":"down"}`})}return t},Nk=e=>{var a,n,r,s;if(!e)return[];let t=[];for(let i=0;i.06||g>.06)&&(h=!1),m>g?m>.05&&t.push({iris:i,gesture:"looking right"}):g>.05&&t.push({iris:i,gesture:"looking left"});let y=Math.abs(e[i].mesh[145][1]-e[i].annotations.rightEyeIris[0][1])/e[i].box[3],A=Math.abs(e[i].mesh[374][1]-e[i].annotations.leftEyeIris[0][1])/e[i].box[3];(A<.01||y<.01||A>.022||y>.022)&&(h=!1),(A<.01||y<.01)&&t.push({iris:i,gesture:"looking down"}),(A>.022||y>.022)&&t.push({iris:i,gesture:"looking up"}),h&&t.push({iris:i,gesture:"looking center"})}return t},Ek=e=>{if(!e)return[];let t=[];for(let a=0;a0){let r=n.reduce((i,o)=>(i.position[2]||0)<(o.position[2]||0)?i:o);t.push({hand:a,gesture:`${r.name} forward`});let s=n.reduce((i,o)=>i.position[1][s[0]*t[0],s[1]*t[1]]);return{startPoint:a,endPoint:n,palmLandmarks:r,confidence:e.confidence}}function T0(e,t=1.5){let a=Ip(e),n=S0(e),r=[t*n[0]/2,t*n[1]/2],s=[a[0]-r[0],a[1]-r[1]],i=[a[0]+r[0],a[1]+r[1]];return{startPoint:s,endPoint:i,palmLandmarks:e.palmLandmarks}}function C0(e){let t=Ip(e),a=S0(e),r=Math.max(...a)/2,s=[t[0]-r,t[1]-r],i=[t[0]+r,t[1]+r];return{startPoint:s,endPoint:i,palmLandmarks:e.palmLandmarks}}function Whe(e){return e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI))}function Fk(e,t){let a=Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]);return Whe(a)}var Rk=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]];function zs(e,t){let a=0;for(let n=0;n[i.x,i.y]),this.anchorsTensor=Kn(this.anchors),this.inputSize=((s=(r=(n=(a=this==null?void 0:this.model)==null?void 0:a.inputs)==null?void 0:n[0])==null?void 0:r.shape)==null?void 0:s[2])||0,this.inputSizeTensor=Ut([this.inputSize,this.inputSize]),this.doubleInputSizeTensor=Ut([this.inputSize*2,this.inputSize*2])}normalizeBoxes(t){let a={};a.boxOffsets=_e(t,[0,0],[-1,2]),a.boxSizes=_e(t,[0,2],[-1,2]),a.div=fe(a.boxOffsets,this.inputSizeTensor),a.boxCenterPoints=xe(a.div,this.anchorsTensor),a.halfBoxSizes=fe(a.boxSizes,this.doubleInputSizeTensor),a.sub=he(a.boxCenterPoints,a.halfBoxSizes),a.startPoints=ae(a.sub,this.inputSizeTensor),a.add=xe(a.boxCenterPoints,a.halfBoxSizes),a.endPoints=ae(a.add,this.inputSizeTensor);let n=ql([a.startPoints,a.endPoints],1);return Object.keys(a).forEach(r=>Y(a[r])),n}normalizeLandmarks(t,a){let n={};n.reshape=J(t,[-1,7,2]),n.div=fe(n.reshape,this.inputSizeTensor),n.landmarks=xe(n.div,this.anchors[a]?this.anchors[a]:0);let r=ae(n.landmarks,this.inputSizeTensor);return Object.keys(n).forEach(s=>Y(n[s])),r}async predict(t,a){var o;let n={};n.resize=me.resizeBilinear(t,[this.inputSize,this.inputSize]),n.div=fe(n.resize,Oe.tf127),n.image=he(n.div,Oe.tf1),n.batched=this.model.execute(n.image),n.predictions=$e(n.batched),n.slice=_e(n.predictions,[0,0],[-1,1]),n.sigmoid=Da(n.slice),n.scores=$e(n.sigmoid);let r=await n.scores.data();n.boxes=_e(n.predictions,[0,1],[-1,4]),n.norm=this.normalizeBoxes(n.boxes),n.nms=await me.nonMaxSuppressionAsync(n.norm,n.scores,3*(((o=a.hand)==null?void 0:o.maxDetected)||1),a.hand.iouThreshold,a.hand.minConfidence);let s=await n.nms.array(),i=[];for(let l of s){let u={};u.box=_e(n.norm,[l,0],[1,-1]),u.slice=_e(n.predictions,[l,5],[1,14]),u.norm=this.normalizeLandmarks(u.slice,l),u.palmLandmarks=J(u.norm,[-1,2]);let d=await u.box.data(),c=d.slice(0,2),p=d.slice(2,4),h=await u.palmLandmarks.array(),f={startPoint:c,endPoint:p,palmLandmarks:h,confidence:r[l]},m=_k(f,[(t.shape[2]||1)/this.inputSize,(t.shape[1]||0)/this.inputSize]);i.push(m),Object.keys(u).forEach(g=>Y(u[g]))}return Object.keys(n).forEach(l=>Y(n[l])),i}};var jhe=5,zk=1.65,Lk=[0,5,9,13,17,1,2],Hhe=0,qhe=2,Bk=0,E0=class{constructor(t,a){le(this,"handDetector");le(this,"handPoseModel");le(this,"inputSize");le(this,"storedBoxes");le(this,"skipped");le(this,"detectedHands");var n,r,s;this.handDetector=t,this.handPoseModel=a,this.inputSize=((s=(r=(n=this.handPoseModel)==null?void 0:n.inputs)==null?void 0:r[0].shape)==null?void 0:s[2])||0,this.storedBoxes=[],this.skipped=Number.MAX_SAFE_INTEGER,this.detectedHands=0}calculateLandmarksBoundingBox(t){let a=t.map(i=>i[0]),n=t.map(i=>i[1]),r=[Math.min(...a),Math.min(...n)],s=[Math.max(...a),Math.max(...n)];return{startPoint:r,endPoint:s}}getBoxForPalmLandmarks(t,a){let n=t.map(s=>Qg([...s,1],a)),r=this.calculateLandmarksBoundingBox(n);return T0(C0(r),jhe)}getBoxForHandLandmarks(t){let a=this.calculateLandmarksBoundingBox(t),n=T0(C0(a),zk);n.palmLandmarks=[];for(let r=0;r[i[0]*(h[0]-this.inputSize/2),i[1]*(h[1]-this.inputSize/2),i[2]*h[2]]),l=Jg(n,[0,0]),u=o.map(h=>[...Qg(h,l),h[2]]),d=Pk(r),c=[...Ip(a),1],p=[zs(c,d[0]),zs(c,d[1])];return u.map(h=>[Math.trunc(h[0]+p[0]),Math.trunc(h[1]+p[1]),Math.trunc(h[2])])}async estimateHands(t,a){let n=!1,r,s=(a.hand.skipTime||0)>te()-Bk,i=this.skipped<(a.hand.skipFrames||0);a.skipAllowed&&s&&i&&(r=await this.handDetector.predict(t,a),this.skipped=0),a.skipAllowed&&this.skipped++,r&&r.length>0&&(r.length!==this.detectedHands&&this.detectedHands!==a.hand.maxDetected||!a.hand.landmarks)&&(this.detectedHands=0,this.storedBoxes=[...r],this.storedBoxes.length>0&&(n=!0));let o=[];for(let l=0;l=a.hand.minConfidence/4){let w=J(x,[-1,3]),S=await w.array();Y(x),Y(w);let C=this.transformRawCoords(S,m,d,f),N=this.getBoxForHandLandmarks(C);this.storedBoxes[l]={...N,confidence:b};let _={landmarks:C,confidence:b,boxConfidence:u.confidence,fingerConfidence:b,box:{topLeft:N.startPoint,bottomRight:N.endPoint}};o.push(_)}else this.storedBoxes[l]=null;Y(x)}else{let d=T0(C0(u),zk),c={confidence:u.confidence,boxConfidence:u.confidence,fingerConfidence:0,box:{topLeft:d.startPoint,bottomRight:d.endPoint},landmarks:[]};o.push(c)}}return this.storedBoxes=this.storedBoxes.filter(l=>l!==null),this.detectedHands=o.length,o.length>a.hand.maxDetected&&(o.length=a.hand.maxDetected),o}};var Wk={thumb:[1,2,3,4],index:[5,6,7,8],middle:[9,10,11,12],ring:[13,14,15,16],pinky:[17,18,19,20],palm:[0]},Ro,Mo,Vk;async function e5(e,t){let a=await Vk.estimateHands(e,t);if(!a)return[];let n=[];for(let r=0;ra[r].landmarks[c]);let i=a[r].landmarks,o=[Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER,0,0],l=[0,0,0,0];if(i&&i.length>0){for(let d of i)d[0]o[2]&&(o[2]=d[0]),d[1]>o[3]&&(o[3]=d[1]);o[2]-=o[0],o[3]-=o[1],l=[o[0]/(e.shape[2]||0),o[1]/(e.shape[1]||0),o[2]/(e.shape[2]||0),o[3]/(e.shape[1]||0)]}else o=a[r].box?[Math.trunc(Math.max(0,a[r].box.topLeft[0])),Math.trunc(Math.max(0,a[r].box.topLeft[1])),Math.trunc(Math.min(e.shape[2]||0,a[r].box.bottomRight[0])-Math.max(0,a[r].box.topLeft[0])),Math.trunc(Math.min(e.shape[1]||0,a[r].box.bottomRight[1])-Math.max(0,a[r].box.topLeft[1]))]:[0,0,0,0],l=[a[r].box.topLeft[0]/(e.shape[2]||0),a[r].box.topLeft[1]/(e.shape[1]||0),(a[r].box.bottomRight[0]-a[r].box.topLeft[0])/(e.shape[2]||0),(a[r].box.bottomRight[1]-a[r].box.topLeft[1])/(e.shape[1]||0)];let u=I0(i);n.push({id:r,score:Math.round(100*a[r].confidence)/100,boxScore:Math.round(100*a[r].boxConfidence)/100,fingerScore:Math.round(100*a[r].fingerConfidence)/100,label:"hand",box:o,boxRaw:l,keypoints:i,annotations:s,landmarks:u})}return n}async function Gk(e){var a,n;ne.initial&&(Ro=null,Mo=null),!Ro||!Mo?[Ro,Mo]=await Promise.all([e.hand.enabled?Ce((a=e.hand.detector)==null?void 0:a.modelPath):null,e.hand.landmarks?Ce((n=e.hand.skeleton)==null?void 0:n.modelPath):null]):(e.debug&&K("cached model:",Ro.modelUrl),e.debug&&K("cached model:",Mo.modelUrl));let t=Ro?new N0(Ro):void 0;return t&&Mo&&(Vk=new E0(t,Mo)),[Ro,Mo]}var Ft=[null,null],Khe=["StatefulPartitionedCall/Postprocessor/Slice","StatefulPartitionedCall/Postprocessor/ExpandDims_1"],Ls=[[0,0],[0,0]],Zhe=["hand","fist","pinch","point","face","tip","pinchtip"],jk=4,Hk=1.6,Yhe=512,Jhe=1.4,R0=Number.MAX_SAFE_INTEGER,t5=0,$r=[0,0],_t={boxes:[],hands:[]},qk={thumb:[1,2,3,4],index:[5,6,7,8],middle:[9,10,11,12],ring:[13,14,15,16],pinky:[17,18,19,20],base:[0],palm:[0,17,13,9,5,1,0]};async function Xk(e){var t;if(ne.initial&&(Ft[0]=null),Ft[0])e.debug&&K("cached model:",Ft[0].modelUrl);else{e0(["tensorlistreserve","enter","tensorlistfromtensor","merge","loopcond","switch","exit","tensorliststack","nextiteration","tensorlistsetitem","tensorlistgetitem","reciprocal","shape","split","where"],e),Ft[0]=await Ce((t=e.hand.detector)==null?void 0:t.modelPath);let a=Ft[0].executor?Object.values(Ft[0].modelSignature.inputs):void 0;Ls[0][0]=Array.isArray(a)?parseInt(a[0].tensorShape.dim[1].size):0,Ls[0][1]=Array.isArray(a)?parseInt(a[0].tensorShape.dim[2].size):0}return Ft[0]}async function Kk(e){var t;if(ne.initial&&(Ft[1]=null),Ft[1])e.debug&&K("cached model:",Ft[1].modelUrl);else{Ft[1]=await Ce((t=e.hand.skeleton)==null?void 0:t.modelPath);let a=Ft[1].executor?Object.values(Ft[1].modelSignature.inputs):void 0;Ls[1][0]=Array.isArray(a)?parseInt(a[0].tensorShape.dim[1].size):0,Ls[1][1]=Array.isArray(a)?parseInt(a[0].tensorShape.dim[2].size):0}return Ft[1]}async function Qhe(e,t){let a=[];if(!e||!Ft[0])return a;let n={},r=(e.shape[2]||1)/(e.shape[1]||1),s=Math.min(Math.round((e.shape[1]||0)/8)*8,Yhe),i=Math.round(s*r/8)*8;n.resize=me.resizeBilinear(e,[s,i]),n.cast=Ue(n.resize,"int32"),[n.rawScores,n.rawBoxes]=await Ft[0].executeAsync(n.cast,Khe),n.boxes=$e(n.rawBoxes,[0,2]),n.scores=$e(n.rawScores,[0]);let o=Ta(n.scores,1);Y(o[jk]),o.splice(jk,1),n.filtered=sa(o,1),Y(o),n.max=pa(n.filtered,1),n.argmax=ar(n.filtered,1);let l=0;n.nms=await me.nonMaxSuppressionAsync(n.boxes,n.max,(t.hand.maxDetected||0)+1,t.hand.iouThreshold||0,t.hand.minConfidence||1);let u=await n.nms.data(),d=await n.max.data(),c=await n.argmax.data();for(let p of Array.from(u)){let h=_e(n.boxes,p,1),f=await h.data();Y(h);let m=[f[1],f[0],f[3]-f[1],f[2]-f[0]],g=u0(m,Jhe),y=[Math.trunc(m[0]*$r[0]),Math.trunc(m[1]*$r[1]),Math.trunc(m[2]*$r[0]),Math.trunc(m[3]*$r[1])],A=d[p],x=Zhe[c[p]],b={id:l++,score:A,box:y,boxRaw:g,label:x};a.push(b)}return Object.keys(n).forEach(p=>Y(n[p])),a.sort((p,h)=>h.score-p.score),a.length>(t.hand.maxDetected||1)&&(a.length=t.hand.maxDetected||1),a}async function a5(e,t,a){let n={id:t.id,score:Math.round(100*t.score)/100,boxScore:Math.round(100*t.score)/100,fingerScore:0,box:t.box,boxRaw:t.boxRaw,label:t.label,keypoints:[],landmarks:{},annotations:{}};if(e&&Ft[1]&&a.hand.landmarks&&t.score>(a.hand.minConfidence||0)){let r={},s=[t.boxRaw[1],t.boxRaw[0],t.boxRaw[3]+t.boxRaw[1],t.boxRaw[2]+t.boxRaw[0]];r.crop=me.cropAndResize(e,[s],[0],[Ls[1][0],Ls[1][1]],"bilinear"),r.div=fe(r.crop,Oe.tf255),[r.score,r.keypoints]=Ft[1].execute(r.div,["Identity_1","Identity"]);let i=(await r.score.data())[0],o=(100-Math.trunc(100/(1+Math.exp(i))))/100;if(o>=(a.hand.minConfidence||0)){n.fingerScore=o,r.reshaped=J(r.keypoints,[-1,3]);let d=(await r.reshaped.array()).map(c=>[c[0]/Ls[1][1],c[1]/Ls[1][0],c[2]||0]).map(c=>[c[0]*t.boxRaw[2],c[1]*t.boxRaw[3],c[2]||0]);n.keypoints=d.map(c=>[$r[0]*(c[0]+t.boxRaw[0]),$r[1]*(c[1]+t.boxRaw[1]),c[2]||0]),n.landmarks=I0(n.keypoints);for(let c of Object.keys(qk))n.annotations[c]=qk[c].map(p=>n.landmarks&&n.keypoints[p]?n.keypoints[p]:null)}Object.keys(r).forEach(l=>Y(r[l]))}return n}async function n5(e,t){var r,s;if(!((r=Ft[0])!=null&&r.executor)||!((s=Ft[1])!=null&&s.executor)||!Ft[0].inputs[0].shape||!Ft[1].inputs[0].shape)return[];$r=[e.shape[2]||0,e.shape[1]||0],R0++;let a=(t.hand.skipTime||0)>te()-t5,n=R0<(t.hand.skipFrames||0);return t.skipAllowed&&a&&n?_t.hands:new Promise(async i=>{let o=3*(t.hand.skipTime||0)>te()-t5,l=R0<3*(t.hand.skipFrames||0);t.skipAllowed&&_t.hands.length===t.hand.maxDetected?_t.hands=await Promise.all(_t.boxes.map(d=>a5(e,d,t))):t.skipAllowed&&o&&l&&_t.hands.length>0?_t.hands=await Promise.all(_t.boxes.map(d=>a5(e,d,t))):(_t.boxes=await Qhe(e,t),t5=te(),_t.hands=await Promise.all(_t.boxes.map(d=>a5(e,d,t))),R0=0);let u=[..._t.boxes];if(_t.boxes.length=0,t.cacheSensitivity>0)for(let d=0;d<_t.hands.length;d++){let c=X9(_t.hands[d].keypoints,$r);if(c.box[2]/(e.shape[2]||1)>.05&&c.box[3]/(e.shape[1]||1)>.05&&_t.hands[d].fingerScore&&_t.hands[d].fingerScore>(t.hand.minConfidence||0)){let p=u0(c.box,Hk),h=u0(c.boxRaw,Hk);_t.boxes.push({...u[d],box:p,boxRaw:h})}}for(let d=0;d<_t.hands.length;d++){let c=Er(_t.hands[d].keypoints,$r);_t.hands[d].box=c.box,_t.hands[d].boxRaw=c.boxRaw}i(_t.hands)})}var or=(e=null)=>({face:[],body:[],hand:[],gesture:[],object:[],persons:[],performance:{},timestamp:0,width:0,height:0,error:e});var Sp={};hr(Sp,{connected:()=>$0,horizontal:()=>r5,kpt:()=>M0,relative:()=>i5,vertical:()=>s5});var M0=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],r5=[["leftEye","rightEye"],["leftEar","rightEar"],["leftShoulder","rightShoulder"],["leftElbow","rightElbow"],["leftWrist","rightWrist"],["leftHip","rightHip"],["leftKnee","rightKnee"],["leftAnkle","rightAnkle"]],s5=[["leftKnee","leftShoulder"],["rightKnee","rightShoulder"],["leftAnkle","leftKnee"],["rightAnkle","rightKnee"]],i5=[[["leftHip","rightHip"],["leftShoulder","rightShoulder"]],[["leftElbow","rightElbow"],["leftShoulder","rightShoulder"]]],$0={leftLeg:["leftHip","leftKnee","leftAnkle"],rightLeg:["rightHip","rightKnee","rightAnkle"],torso:["leftShoulder","rightShoulder","rightHip","leftHip","leftShoulder"],leftArm:["leftShoulder","leftElbow","leftWrist"],rightArm:["rightShoulder","rightElbow","rightWrist"],head:[]};var ge=or(),o5=0;function Yk(e,t){var i,o,l,u,d,c,p,h,f,m,g,y,A,x,b,w,S,C,N,_,$,M,I;let a=te();if(!e)return or();let n=Date.now()-e.timestamp,r=n<1e3?8-Math.log(n+1):1;if(e.canvas&&(ge.canvas=e.canvas),e.error&&(ge.error=e.error),!ge.body||e.body.length!==ge.body.length)ge.body=JSON.parse(JSON.stringify(e.body));else for(let E=0;E((r-1)*ge.body[E].box[H]+U)/r),L=e.body[E].boxRaw.map((U,H)=>((r-1)*ge.body[E].boxRaw[H]+U)/r),B=e.body[E].keypoints.map((U,H)=>{var W,Q,Z,re,ee,pe,oe,ye,we;return{score:U.score,part:U.part,position:[ge.body[E].keypoints[H]?((r-1)*(ge.body[E].keypoints[H].position[0]||0)+(U.position[0]||0))/r:U.position[0],ge.body[E].keypoints[H]?((r-1)*(ge.body[E].keypoints[H].position[1]||0)+(U.position[1]||0))/r:U.position[1],ge.body[E].keypoints[H]?((r-1)*(ge.body[E].keypoints[H].position[2]||0)+(U.position[2]||0))/r:U.position[2]],positionRaw:[ge.body[E].keypoints[H]?((r-1)*(ge.body[E].keypoints[H].positionRaw[0]||0)+(U.positionRaw[0]||0))/r:U.positionRaw[0],ge.body[E].keypoints[H]?((r-1)*(ge.body[E].keypoints[H].positionRaw[1]||0)+(U.positionRaw[1]||0))/r:U.positionRaw[1],ge.body[E].keypoints[H]?((r-1)*(ge.body[E].keypoints[H].positionRaw[2]||0)+(U.positionRaw[2]||0))/r:U.positionRaw[2]],distance:[ge.body[E].keypoints[H]?((r-1)*(((W=ge.body[E].keypoints[H].distance)==null?void 0:W[0])||0)+(((Q=U.distance)==null?void 0:Q[0])||0))/r:(Z=U.distance)==null?void 0:Z[0],ge.body[E].keypoints[H]?((r-1)*(((re=ge.body[E].keypoints[H].distance)==null?void 0:re[1])||0)+(((ee=U.distance)==null?void 0:ee[1])||0))/r:(pe=U.distance)==null?void 0:pe[1],ge.body[E].keypoints[H]?((r-1)*(((oe=ge.body[E].keypoints[H].distance)==null?void 0:oe[2])||0)+(((ye=U.distance)==null?void 0:ye[2])||0))/r:(we=U.distance)==null?void 0:we[2]]}}),G={},j={connected:{}};(i=t.body.modelPath)!=null&&i.includes("efficientpose")?j=c0:(o=t.body.modelPath)!=null&&o.includes("blazepose")?j=o0:(l=t.body.modelPath)!=null&&l.includes("movenet")&&(j=Sp);for(let[U,H]of Object.entries(j.connected)){let W=[];for(let Q=0;Qee.part===H[Q]),re=B.find(ee=>ee.part===H[Q+1]);Z&&re&&W.push([Z.position,re.position])}G[U]=W}ge.body[E]={...e.body[E],box:O,boxRaw:L,keypoints:B,annotations:G}}if(!ge.hand||e.hand.length!==ge.hand.length)ge.hand=JSON.parse(JSON.stringify(e.hand));else for(let E=0;E((r-1)*ge.hand[E].box[U]+j)/r),L=e.hand[E].boxRaw.map((j,U)=>((r-1)*ge.hand[E].boxRaw[U]+j)/r);ge.hand[E].keypoints.length!==e.hand[E].keypoints.length&&(ge.hand[E].keypoints=e.hand[E].keypoints);let B=e.hand[E].keypoints&&e.hand[E].keypoints.length>0?e.hand[E].keypoints.map((j,U)=>j.map((H,W)=>((r-1)*(ge.hand[E].keypoints[U][W]||1)+(H||0))/r)):[],G={};if(Object.keys(ge.hand[E].annotations).length!==Object.keys(e.hand[E].annotations).length)ge.hand[E].annotations=e.hand[E].annotations,G=ge.hand[E].annotations;else if(e.hand[E].annotations)for(let j of Object.keys(e.hand[E].annotations))G[j]=(c=(d=(u=e.hand[E])==null?void 0:u.annotations)==null?void 0:d[j])!=null&&c[0]?e.hand[E].annotations[j].map((U,H)=>U.map((W,Q)=>((r-1)*ge.hand[E].annotations[j][H][Q]+W)/r)):null;ge.hand[E]={...e.hand[E],box:O,boxRaw:L,keypoints:B,annotations:G}}if(!ge.face||e.face.length!==ge.face.length)ge.face=JSON.parse(JSON.stringify(e.face));else for(let E=0;E((r-1)*ge.face[E].box[G]+B)/r),L=e.face[E].boxRaw.map((B,G)=>((r-1)*ge.face[E].boxRaw[G]+B)/r);if(e.face[E].rotation){let B={matrix:[0,0,0,0,0,0,0,0,0],angle:{roll:0,yaw:0,pitch:0},gaze:{bearing:0,strength:0}};B.matrix=(p=e.face[E].rotation)==null?void 0:p.matrix,B.angle={roll:((r-1)*(((f=(h=ge.face[E].rotation)==null?void 0:h.angle)==null?void 0:f.roll)||0)+(((g=(m=e.face[E].rotation)==null?void 0:m.angle)==null?void 0:g.roll)||0))/r,yaw:((r-1)*(((A=(y=ge.face[E].rotation)==null?void 0:y.angle)==null?void 0:A.yaw)||0)+(((b=(x=e.face[E].rotation)==null?void 0:x.angle)==null?void 0:b.yaw)||0))/r,pitch:((r-1)*(((S=(w=ge.face[E].rotation)==null?void 0:w.angle)==null?void 0:S.pitch)||0)+(((N=(C=e.face[E].rotation)==null?void 0:C.angle)==null?void 0:N.pitch)||0))/r},B.gaze={bearing:((r-1)*(((_=ge.face[E].rotation)==null?void 0:_.gaze.bearing)||0)+((($=e.face[E].rotation)==null?void 0:$.gaze.bearing)||0))/r,strength:((r-1)*(((M=ge.face[E].rotation)==null?void 0:M.gaze.strength)||0)+(((I=e.face[E].rotation)==null?void 0:I.gaze.strength)||0))/r},ge.face[E]={...e.face[E],rotation:B,box:O,boxRaw:L}}else ge.face[E]={...e.face[E],box:O,boxRaw:L}}if(!ge.object||e.object.length!==ge.object.length)ge.object=JSON.parse(JSON.stringify(e.object));else for(let E=0;E((r-1)*ge.object[E].box[G]+B)/r),L=e.object[E].boxRaw.map((B,G)=>((r-1)*ge.object[E].boxRaw[G]+B)/r);ge.object[E]={...e.object[E],box:O,boxRaw:L}}if(e.persons){let E=e.persons;if(!ge.persons||E.length!==ge.persons.length)ge.persons=JSON.parse(JSON.stringify(E));else for(let O=0;O((r-1)*ge.persons[O].box[B]+L)/r)}e.gesture&&(ge.gesture=e.gesture),ge.width=e.width,ge.height=e.height;let s=te();return o5=ne.perfadd?o5+Math.round(s-a):Math.round(s-a),e.performance&&(ge.performance={...e.performance,interpolate:o5}),ge}var ma;async function l5(e){return!ma||ne.initial?ma=await Ce(e.segmentation.modelPath):e.debug&&K("cached model:",ma.modelUrl),ma}async function Jk(e,t){var r;if(ma||(ma=await l5(t)),!(ma!=null&&ma.executor)||!((r=ma==null?void 0:ma.inputs)!=null&&r[0].shape))return null;let a={};a.resize=me.resizeBilinear(e,[ma.inputs[0].shape?ma.inputs[0].shape[1]:0,ma.inputs[0].shape?ma.inputs[0].shape[2]:0],!1),a.norm=fe(a.resize,Oe.tf255),a.res=ma.execute(a.norm),a.squeeze=$e(a.res,[0]),[a.bgRaw,a.fgRaw]=Ta(a.squeeze,2),a.fg=vh(a.fgRaw),a.mul=ae(a.fg,Oe.tf255),a.expand=Gt(a.mul,2),a.output=me.resizeBilinear(a.expand,[e.shape[1]||0,e.shape[2]||0]);let n;switch(t.segmentation.mode||"default"){case"default":a.input=$e(e),a.concat=at([a.input,a.output],-1),n=Ue(a.concat,"int32");break;case"alpha":n=Ue(a.output,"int32");break;default:n=ze(0)}return Object.keys(a).forEach(s=>Y(a[s])),n}var _0={};hr(_0,{distance:()=>u5,find:()=>a0e,similarity:()=>t0e});function u5(e,t,a={order:2,multiplier:25}){if(!e||!e)return Number.MAX_SAFE_INTEGER;let n=0;for(let r=0;r{if(e===0)return 1;let s=(1-(t===2?Math.sqrt(e):e**(1/t))/100-a)/(n-a);return Math.max(Math.min(s,1),0)};function t0e(e,t,a={order:2,multiplier:25,min:.2,max:.8}){let n=u5(e,t,a);return eI(n,a.order||2,a.min||0,a.max||1)}function a0e(e,t,a={order:2,multiplier:25,threshold:0,min:.2,max:.8}){if(!Array.isArray(e)||!Array.isArray(t)||e.length<64||t.length===0)return{index:-1,distance:Number.POSITIVE_INFINITY,similarity:0};let n=Number.MAX_SAFE_INTEGER,r=-1;for(let i=0;iNp,validateModel:()=>B0});var tI=.005,tn={keypoints:[],padding:[[0,0],[0,0],[0,0],[0,0]]};function d5(e){for(let t of r5){let a=e.keypoints.findIndex(r=>r.part===t[0]),n=e.keypoints.findIndex(r=>r.part===t[1]);if(e.keypoints[a]&&e.keypoints[n]&&e.keypoints[a].position[0]r&&r.part===t[0]),n=e.keypoints.findIndex(r=>r&&r.part===t[1]);e.keypoints[a]&&e.keypoints[n]&&e.keypoints[a].position[1]u&&u.part===t[0]),r=e.keypoints.findIndex(u=>u&&u.part===t[1]),s=e.keypoints.findIndex(u=>u&&u.part===a[0]),i=e.keypoints.findIndex(u=>u&&u.part===a[1]);if(!e.keypoints[s]||!e.keypoints[i])continue;let o=e.keypoints[n]?[Math.abs(e.keypoints[s].position[0]-e.keypoints[n].position[0]),Math.abs(e.keypoints[i].position[0]-e.keypoints[n].position[0])]:[0,0],l=e.keypoints[r]?[Math.abs(e.keypoints[i].position[0]-e.keypoints[r].position[0]),Math.abs(e.keypoints[s].position[0]-e.keypoints[r].position[0])]:[0,0];if(o[0]>o[1]||l[0]>l[1]){let u=e.keypoints[n];e.keypoints[n]=e.keypoints[r],e.keypoints[r]=u}}}function aI(e){for(let t=0;te.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0,e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0],[e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0,e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0],[0,0]],a.pad=rr(e,tn.padding),a.resize=me.resizeBilinear(a.pad,[t,t]);let n=Ue(a.resize,"int32");return Object.keys(a).forEach(i=>Y(a[i])),n}function rI(e,t){e.keypoints=e.keypoints.filter(n=>n==null?void 0:n.position);for(let n of e.keypoints)n.position=[n.position[0]*(t[0]+tn.padding[2][0]+tn.padding[2][1])/t[0]-tn.padding[2][0],n.position[1]*(t[1]+tn.padding[1][0]+tn.padding[1][1])/t[1]-tn.padding[1][0]],n.positionRaw=[n.position[0]/t[0],n.position[1]/t[1]];let a=Er(e.keypoints.map(n=>n.position),t);return e.box=a.box,e.boxRaw=a.boxRaw,e}var Wt,F0=0,p5=Number.MAX_SAFE_INTEGER,$o={boxes:[],bodies:[],last:0};async function sI(e){var t;return ne.initial&&(Wt=null),Wt?e.debug&&K("cached model:",Wt.modelUrl):(e0(["size"],e),Wt=await Ce(e.body.modelPath)),F0=(Wt==null?void 0:Wt.executor)&&((t=Wt==null?void 0:Wt.inputs)==null?void 0:t[0].shape)?Wt.inputs[0].shape[2]:0,F0<64&&(F0=256),Wt}function r0e(e,t,a){let n=e[0][0],r=[],s=0;for(let d=0;dt.body.minConfidence){let c=[n[d][1],n[d][0]];r.push({score:Math.round(100*s)/100,part:M0[d],positionRaw:c,position:[Math.round((a.shape[2]||0)*c[0]),Math.round((a.shape[1]||0)*c[1])]})}s=r.reduce((d,c)=>c.score>d?c.score:d,0);let i=[],o=Er(r.map(d=>d.position),[a.shape[2],a.shape[1]]),l={};for(let[d,c]of Object.entries($0)){let p=[];for(let h=0;hg.part===c[h]),m=r.find(g=>g.part===c[h+1]);f&&m&&f.score>(t.body.minConfidence||0)&&m.score>(t.body.minConfidence||0)&&p.push([f.position,m.position])}l[d]=p}let u={id:0,score:s,box:o.box,boxRaw:o.boxRaw,keypoints:r,annotations:l};return d5(u),i.push(u),i}function s0e(e,t,a){let n=[];for(let r=0;rt.body.minConfidence){let o=[];for(let c=0;c<17;c++){let p=s[3*c+2];if(p>t.body.minConfidence){let h=[s[3*c+1],s[3*c+0]];o.push({part:M0[c],score:Math.round(100*p)/100,positionRaw:h,position:[Math.round((a.shape[2]||0)*h[0]),Math.round((a.shape[1]||0)*h[1])]})}}let l=Er(o.map(c=>c.position),[a.shape[2],a.shape[1]]),u={};for(let[c,p]of Object.entries($0)){let h=[];for(let f=0;fy.part===p[f]),g=o.find(y=>y.part===p[f+1]);m&&g&&m.score>(t.body.minConfidence||0)&&g.score>(t.body.minConfidence||0)&&h.push([m.position,g.position])}u[c]=h}let d={id:r,score:i,box:l.box,boxRaw:l.boxRaw,keypoints:[...o],annotations:u};d5(d),n.push(d)}}return n.sort((r,s)=>s.score-r.score),n.length>t.body.maxDetected&&(n.length=t.body.maxDetected),n}async function c5(e,t){var r;if(!(Wt!=null&&Wt.executor)||!((r=Wt==null?void 0:Wt.inputs)!=null&&r[0].shape))return[];t.skipAllowed||($o.boxes.length=0),p5++;let a=(t.body.skipTime||0)>te()-$o.last,n=p5<(t.body.skipFrames||0);return t.skipAllowed&&a&&n?$o.bodies:new Promise(async s=>{let i={};p5=0,i.input=nI(e,F0),i.res=Wt==null?void 0:Wt.execute(i.input),$o.last=te();let o=await i.res.array();$o.bodies=i.res.shape[2]===17?r0e(o,t,e):s0e(o,t,e);for(let l of $o.bodies)rI(l,[e.shape[2]||1,e.shape[1]||1]),aI(l.keypoints);Object.keys(i).forEach(l=>Y(i[l])),s($o.bodies)})}var Fn,P0=[],oI=0,h5=Number.MAX_SAFE_INTEGER,D0=0,O0=2.5;async function lI(e){if(!Fn||ne.initial){Fn=await Ce(e.object.modelPath);let t=Fn!=null&&Fn.executor?Object.values(Fn.modelSignature.inputs):void 0;D0=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):416}else e.debug&&K("cached model:",Fn.modelUrl);return Fn}async function i0e(e,t,a){var u,d;let n=0,r=[],s=D0;for(let c of[1,2,4]){let p=c*13,h=$e(e.find(x=>x.shape[1]===p**2&&(x.shape[2]||0)===pu.length)),f=await h.array(),m=$e(e.find(x=>x.shape[1]===p**2&&(x.shape[2]||0)(a.object.minConfidence||0)&&b!==61){let S=(.5+Math.trunc(x%p))/p,C=(.5+Math.trunc(x/p))/p,N=A[x].map(B=>B*(p/c/s)),[_,$]=[S-O0/c*N[0],C-O0/c*N[1]],[M,I]=[S+O0/c*N[2]-_,C+O0/c*N[3]-$],E=[_,$,M,I];E=E.map(B=>Math.max(0,Math.min(B,1)));let O=[E[0]*t[0],E[1]*t[1],E[2]*t[0],E[3]*t[1]],L={id:n++,score:Math.round(100*w)/100,class:b+1,label:pu[b].label,box:O.map(B=>Math.trunc(B)),boxRaw:E};r.push(L)}}Y([h,m,g,y])}let i=r.map(c=>[c.boxRaw[1],c.boxRaw[0],c.boxRaw[3],c.boxRaw[2]]),o=r.map(c=>c.score),l=[];if(i&&i.length>0){let c=await me.nonMaxSuppressionAsync(i,o,a.object.maxDetected||0,a.object.iouThreshold,a.object.minConfidence);l=Array.from(await c.data()),Y(c)}return r=r.filter((c,p)=>l.includes(p)).sort((c,p)=>p.score-c.score),r}async function f5(e,t){if(!(Fn!=null&&Fn.executor))return[];let a=(t.object.skipTime||0)>te()-oI,n=h5<(t.object.skipFrames||0);return t.skipAllowed&&a&&n&&P0.length>0?(h5++,P0):(h5=0,!ne.kernels.includes("mod")||!ne.kernels.includes("sparsetodense")?P0:new Promise(async r=>{let s=[e.shape[2]||0,e.shape[1]||0],i=me.resizeBilinear(e,[D0,D0],!1),o=fe(i,Oe.tf255),l=si(o,[0,3,1,2]),u;t.object.enabled&&(u=Fn.execute(l)),oI=te();let d=await i0e(u,s,t);P0=d,Y([i,o,l,...u]),r(d)}))}var Cp=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],o0e=Cp.length,Tp=Cp.reduce((e,t,a)=>(e[t]=a,e),{}),l0e=[["leftHip","leftShoulder"],["leftElbow","leftShoulder"],["leftElbow","leftWrist"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["rightHip","rightShoulder"],["rightElbow","rightShoulder"],["rightElbow","rightWrist"],["rightHip","rightKnee"],["rightKnee","rightAnkle"],["leftShoulder","rightShoulder"],["leftHip","rightHip"]],J5e=l0e.map(([e,t])=>[Tp[e],Tp[t]]),dI=[["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 pI(e){let t=e.reduce(({maxX:a,maxY:n,minX:r,minY:s},{position:{x:i,y:o}})=>({maxX:Math.max(a,i),maxY:Math.max(n,o),minX:Math.min(r,i),minY:Math.min(s,o)}),{maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY,minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY});return[t.minX,t.minY,t.maxX-t.minX,t.maxY-t.minY]}function cI(e,[t,a],[n,r]){let s=t/n,i=a/r,o=(u,d)=>({id:d,score:u.score,boxRaw:[u.box[0]/r,u.box[1]/n,u.box[2]/r,u.box[3]/n],box:[Math.trunc(u.box[0]*i),Math.trunc(u.box[1]*s),Math.trunc(u.box[2]*i),Math.trunc(u.box[3]*s)],keypoints:u.keypoints.map(({score:c,part:p,position:h})=>({score:c,part:p,position:[Math.trunc(h.x*i),Math.trunc(h.y*s)],positionRaw:[h.x/n,h.y/n]})),annotations:{}});return e.map((u,d)=>o(u,d))}var z0=class{constructor(t,a){le(this,"priorityQueue");le(this,"numberOfElements");le(this,"getElementValue");this.priorityQueue=new Array(t),this.numberOfElements=-1,this.getElementValue=a}enqueue(t){this.priorityQueue[++this.numberOfElements]=t,this.swim(this.numberOfElements)}dequeue(){let t=this.priorityQueue[0];return this.exchange(0,this.numberOfElements--),this.sink(0),this.priorityQueue[this.numberOfElements+1]=null,t}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(t){for(;t>0&&this.less(Math.floor(t/2),t);)this.exchange(t,Math.floor(t/2)),t=Math.floor(t/2)}sink(t){for(;2*t<=this.numberOfElements;){let a=2*t;if(aa?a:e}function hI(e,t,a,n){let r=a-e,s=n-t;return r*r+s*s}function A5(e,t){return{x:e.x+t.x,y:e.y+t.y}}var an,d0e=["MobilenetV1/offset_2/BiasAdd","MobilenetV1/heatmap_2/BiasAdd","MobilenetV1/displacement_fwd_2/BiasAdd","MobilenetV1/displacement_bwd_2/BiasAdd"],L0=1,vu=16,p0e=50**2;function fI(e,t,a,n,r,s,i=2){let o=y=>({y:s.get(y.y,y.x,e),x:s.get(y.y,y.x,s.shape[2]/2+e)}),l=(y,A,x)=>({y:y5(Math.round(y.y/vu),0,A-1),x:y5(Math.round(y.x/vu),0,x-1)}),[u,d]=n.shape,c=l(t.position,u,d),p=o(c),f=A5(t.position,p);for(let y=0;y[Tp[p],Tp[h]]),i=s.map(([,p])=>p),o=s.map(([p])=>p),l=t.shape[2],u=i.length,d=new Array(l),c=g5(e.part,vu,a);d[e.part.id]={score:e.score,part:Cp[e.part.id],position:c};for(let p=u-1;p>=0;--p){let h=i[p],f=o[p];d[h]&&!d[f]&&(d[f]=fI(p,d[h],f,t,a,r))}for(let p=0;pt){o=!1;break}if(!o)break}return o}function f0e(e,t){let[a,n,r]=t.shape,s=new z0(a*n*r,({score:i})=>i);for(let i=0;i{var i;let s=(i=r[n])==null?void 0:i.position;return s?hI(a,t,s.y,s.x)<=p0e:!1})}function m0e(e,t){return t.reduce((n,{position:r,score:s},i)=>(mI(e,r,i)||(n+=s),n),0)/t.length}function g0e(e,t,a,n,r,s){let i=[],o=f0e(s,t);for(;i.lengthh.score>s);let c=m0e(i,d),p=pI(d);c>s&&i.push({keypoints:d,box:p,score:Math.round(100*c)/100})}return i}async function x5(e,t){if(!(an!=null&&an.executor))return[];let a=Ee(()=>{if(!an.inputs[0].shape)return[];let i=me.resizeBilinear(e,[an.inputs[0].shape[2],an.inputs[0].shape[1]]),o=he(fe(Ue(i,"float32"),127.5),1),u=an.execute(o,d0e).map(d=>$e(d,[0]));return u[1]=Da(u[1]),u}),n=await Promise.all(a.map(i=>i.buffer()));for(let i of a)Y(i);let r=g0e(n[0],n[1],n[2],n[3],t.body.maxDetected,t.body.minConfidence);return an.inputs[0].shape?cI(r,[e.shape[1],e.shape[2]],[an.inputs[0].shape[2],an.inputs[0].shape[1]]):[]}async function gI(e){return!an||ne.initial?an=await Ce(e.body.modelPath):e.debug&&K("cached model:",an.modelUrl),an}var lr,y0e=["fgr","pha","r1o","r2o","r3o","r4o"],Vt={},v5=0;function xI(e){Y([Vt.r1i,Vt.r2i,Vt.r3i,Vt.r4i,Vt.downsample_ratio]),Vt.r1i=ze(0),Vt.r2i=ze(0),Vt.r3i=ze(0),Vt.r4i=ze(0),v5=e.segmentation.ratio||.5,Vt.downsample_ratio=ze(v5)}async function w5(e){return!lr||ne.initial?lr=await Ce(e.segmentation.modelPath):e.debug&&K("cached model:",lr.modelUrl),xI(e),lr}var AI=e=>Ee(()=>{let t=$e(e,[0]),a=ae(t,Oe.tf255);return Ue(a,"int32")});function b5(e,t){let a=e?AI(e):nr([t.shape[1]||0,t.shape[2]||0,3],255,"int32"),n=t?AI(t):nr([e.shape[1]||0,e.shape[2]||0,1],255,"int32"),r=at([a,n],-1);return Y([a,n]),r}function A0e(e){return Ee(()=>{let t={};return t.unstack=Ta(e,-1),t.concat=at(t.unstack,1),t.split=ka(t.concat,4,1),t.stack=at(t.split,2),t.squeeze=$e(t.stack,[0]),t.expand=Gt(t.squeeze,-1),t.add=xe(t.expand,1),t.mul=ae(t.add,127.5),t.cast=Ue(t.mul,"int32"),t.tile=Vr(t.cast,[1,1,3]),t.alpha=nr([t.tile.shape[0]||0,t.tile.shape[1]||0,1],255,"int32"),at([t.tile,t.alpha],-1)})}async function bI(e,t){if(lr||(lr=await w5(t)),!(lr!=null&&lr.executor))return null;Vt.src=fe(e,255),v5!==t.segmentation.ratio&&xI(t);let[a,n,r,s,i,o]=await lr.executeAsync(Vt,y0e),l;switch(t.segmentation.mode||"default"){case"default":l=b5(a,n);break;case"alpha":l=b5(null,n);break;case"foreground":l=b5(a,null);break;case"state":l=A0e(r);break;default:l=ze(0)}return Y([Vt.src,a,n,Vt.r1i,Vt.r2i,Vt.r3i,Vt.r4i]),[Vt.r1i,Vt.r2i,Vt.r3i,Vt.r4i]=[r,s,i,o],l}var ga;async function k5(e){return!ga||ne.initial?ga=await Ce(e.segmentation.modelPath):e.debug&&K("cached model:",ga.modelUrl),ga}async function wI(e,t){var r;if(ga||(ga=await k5(t)),!(ga!=null&&ga.executor)||!((r=ga==null?void 0:ga.inputs)!=null&&r[0].shape))return null;let a={};a.resize=me.resizeBilinear(e,[ga.inputs[0].shape?ga.inputs[0].shape[1]:0,ga.inputs[0].shape?ga.inputs[0].shape[2]:0],!1),a.norm=fe(a.resize,Oe.tf255),a.res=ga.execute(a.norm),a.squeeze=$e(a.res,[0]),a.alpha=me.resizeBilinear(a.squeeze,[e.shape[1]||0,e.shape[2]||0]),a.mul=ae(a.alpha,Oe.tf255);let n;switch(t.segmentation.mode||"default"){case"default":a.input=$e(e),a.concat=at([a.input,a.mul],-1),n=Ue(a.concat,"int32");break;case"alpha":n=Ue(a.mul,"int32");break;default:n=ze(0)}return Object.keys(a).forEach(s=>Y(a[s])),n}function B0(e,t,a){var u,d;if(!t||!((u=e==null?void 0:e.config)!=null&&u.validateModels))return null;let n=["const","placeholder","noop","pad","squeeze","add","sub","mul","div"],r=["biasadd","fusedbatchnormv3","matmul","switch","shape","merge","split","broadcastto"],s=[],i=[],o=t.modelUrl,l=t.executor;if((d=l==null?void 0:l.graph)!=null&&d.nodes)for(let c of Object.values(l.graph.nodes)){let p=c.op.toLowerCase();s.includes(p)||s.push(p)}else!l&&e.config.debug&&K("model not loaded",a);for(let c of s)!n.includes(c)&&!r.includes(c)&&!e.env.kernels.includes(c)&&!e.env.kernels.includes(c.replace("_",""))&&!e.env.kernels.includes(c.replace("native",""))&&!e.env.kernels.includes(c.replace("v2",""))&&i.push(c);return e.config.debug&&i.length>0&&K("model validation failed:",a,i),i.length>0?{name:a,missing:i,ops:s,url:o}:null}var Np=class{constructor(t){le(this,"instance");le(this,"models");this.models={},this.instance=t}stats(){let t=0,a=0,n=0;for(let s of Object.values(ha))t+=s.sizeFromManifest,a+=s.sizeLoadedWeights,n+=s.sizeDesired;let r=n>0?a/n:0;return{numLoadedModels:Object.values(ha).length,numDefinedModels:Object.keys(this.models).length,percentageLoaded:r,totalSizeFromManifest:t,totalSizeWeights:a,totalSizeLoading:n,modelStats:Object.values(ha)}}reset(){for(let t of Object.keys(this.models))this.models[t]=null}async load(){var a,n,r,s,i,o,l,u,d,c,p,h,f,m,g,y,A,x,b,w,S,C,N,_,$,M,I;ne.initial&&this.reset();let t={};t.blazeface=this.instance.config.face.enabled&&!this.models.blazeface?yw(this.instance.config):null,t.antispoof=this.instance.config.face.enabled&&((a=this.instance.config.face.antispoof)==null?void 0:a.enabled)&&!this.models.antispoof?Vw(this.instance.config):null,t.liveness=this.instance.config.face.enabled&&((n=this.instance.config.face.liveness)==null?void 0:n.enabled)&&!this.models.liveness?Hw(this.instance.config):null,t.faceres=this.instance.config.face.enabled&&((r=this.instance.config.face.description)==null?void 0:r.enabled)&&!this.models.faceres?Dw(this.instance.config):null,t.emotion=this.instance.config.face.enabled&&((s=this.instance.config.face.emotion)==null?void 0:s.enabled)&&!this.models.emotion?_w(this.instance.config):null,t.iris=this.instance.config.face.enabled&&((i=this.instance.config.face.iris)==null?void 0:i.enabled)&&!((o=this.instance.config.face.attention)!=null&&o.enabled)&&!this.models.iris?kw(this.instance.config):null,t.facemesh=this.instance.config.face.enabled&&((l=this.instance.config.face.mesh)==null?void 0:l.enabled)&&!this.models.facemesh?Nw(this.instance.config):null,t.gear=this.instance.config.face.enabled&&((u=this.instance.config.face.gear)==null?void 0:u.enabled)&&!this.models.gear?Zw(this.instance.config):null,t.ssrnetage=this.instance.config.face.enabled&&((d=this.instance.config.face.ssrnet)==null?void 0:d.enabled)&&!this.models.ssrnetage?ek(this.instance.config):null,t.ssrnetgender=this.instance.config.face.enabled&&((c=this.instance.config.face.ssrnet)==null?void 0:c.enabled)&&!this.models.ssrnetgender?rk(this.instance.config):null,t.mobilefacenet=this.instance.config.face.enabled&&((p=this.instance.config.face.mobilefacenet)==null?void 0:p.enabled)&&!this.models.mobilefacenet?uk(this.instance.config):null,t.insightface=this.instance.config.face.enabled&&((h=this.instance.config.face.insightface)==null?void 0:h.enabled)&&!this.models.insightface?fk(this.instance.config):null,t.blazepose=this.instance.config.body.enabled&&!this.models.blazepose&&((f=this.instance.config.body.modelPath)==null?void 0:f.includes("blazepose"))?Q9(this.instance.config):null,t.blazeposedetect=this.instance.config.body.enabled&&!this.models.blazeposedetect&&this.instance.config.body.detector&&this.instance.config.body.detector.modelPath?J9(this.instance.config):null,t.efficientpose=this.instance.config.body.enabled&&!this.models.efficientpose&&((m=this.instance.config.body.modelPath)==null?void 0:m.includes("efficientpose"))?sw(this.instance.config):null,t.movenet=this.instance.config.body.enabled&&!this.models.movenet&&((g=this.instance.config.body.modelPath)==null?void 0:g.includes("movenet"))?sI(this.instance.config):null,t.posenet=this.instance.config.body.enabled&&!this.models.posenet&&((y=this.instance.config.body.modelPath)==null?void 0:y.includes("posenet"))?gI(this.instance.config):null,t.handtrack=this.instance.config.hand.enabled&&!this.models.handtrack&&((x=(A=this.instance.config.hand.detector)==null?void 0:A.modelPath)==null?void 0:x.includes("handtrack"))?Xk(this.instance.config):null,t.handskeleton=this.instance.config.hand.enabled&&this.instance.config.hand.landmarks&&!this.models.handskeleton&&((w=(b=this.instance.config.hand.detector)==null?void 0:b.modelPath)==null?void 0:w.includes("handtrack"))?Kk(this.instance.config):null,(C=(S=this.instance.config.hand.detector)==null?void 0:S.modelPath)!=null&&C.includes("handdetect")&&([t.handpose,t.handskeleton]=this.models.handpose?[null,null]:await Gk(this.instance.config)),t.centernet=this.instance.config.object.enabled&&!this.models.centernet&&((N=this.instance.config.object.modelPath)==null?void 0:N.includes("centernet"))?aw(this.instance.config):null,t.nanodet=this.instance.config.object.enabled&&!this.models.nanodet&&((_=this.instance.config.object.modelPath)==null?void 0:_.includes("nanodet"))?lI(this.instance.config):null,t.selfie=this.instance.config.segmentation.enabled&&!this.models.selfie&&(($=this.instance.config.segmentation.modelPath)==null?void 0:$.includes("selfie"))?k5(this.instance.config):null,t.meet=this.instance.config.segmentation.enabled&&!this.models.meet&&((M=this.instance.config.segmentation.modelPath)==null?void 0:M.includes("meet"))?l5(this.instance.config):null,t.rvm=this.instance.config.segmentation.enabled&&!this.models.rvm&&((I=this.instance.config.segmentation.modelPath)==null?void 0:I.includes("rvm"))?w5(this.instance.config):null,await Promise.all([...Object.values(t)]);for(let E of Object.keys(t))this.models[E]=t[E]||this.models[E]||null}list(){let t=Object.keys(this.models).map(a=>{var n;return{name:a,loaded:this.models[a]!==null,size:0,url:this.models[a]?(n=this.models[a])==null?void 0:n.modelUrl:null}});for(let a of t){let n=Object.keys(ha).find(r=>r.startsWith(a.name));!n||(a.size=ha[n].sizeLoadedWeights,a.url=ha[n].url)}return t}loaded(){return this.list().filter(n=>n.loaded).map(n=>n.name)}validate(){let t=[];for(let a of Object.keys(this.models)){let n=this.models[a];if(!n)continue;let r=B0(this.instance,n,a);r&&t.push(r)}return t}};function II(e,t,a,n,r){var o,l,u,d,c,p;let s=0,i=[];for(let h of e){let f={id:s++,face:h,body:null,hands:{left:null,right:null},gestures:[],box:[0,0,0,0]};for(let b of t)h.box[0]>b.box[0]&&h.box[0]b.box[1]&&h.box[1]+h.box[3]f.body.box[0]&&b.box[0]+b.box[2]f.body.box[1]&&b.box[1]+b.box[3]f.body.box[0]&&b.box[1]+b.box[3]>f.body.box[1]&&b.box[1]+b.box[3]{b&&b.length===4&&(m.push(b[0],b[0]+b[2]),g.push(b[1],b[1]+b[3]))};y(f.face.box),y((d=f.body)==null?void 0:d.box),y((c=f.hands.left)==null?void 0:c.box),y((p=f.hands.right)==null?void 0:p.box);let A=Math.min(...m),x=Math.min(...g);f.box=[A,x,Math.max(...m)-A,Math.max(...g)-x],(r==null?void 0:r[1])&&(r==null?void 0:r[2])&&(f.boxRaw=[f.box[0]/r[2],f.box[1]/r[1],f.box[2]/r[2],f.box[3]/r[1]]),i.push(f)}return i}var W0=` +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`,V0=` +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 +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAa2p1UYo5adbz+xbxMlvqJ1OqjDHLXree0ejmzNrWm953tPmTPWbWneZ7yoy5YhjrXXTjH8s75N +mtkyxt0VZM2/m175N1V03yTKubMLXVXybeYLLX2VXy7eam+b0bOg4VquJW+rry4/O9uyZOq3UjVm +9r25axMzPaIdvhns1kzbZddM0p5Y47z8/R2+HcF03Doi1a8+Xzvbv+TotJnjDXkt+K8ODHp8cY8N +IpSO0RCwF2YAAAAAAAAACvUZYw6fJkntWN3k8dfHz2vLucdz8mkjFE9bz1+UOZosX1UzPm0nqI/W +MYo9FlcPNklfFGeH/NshLGun+Cz6PtHZtVZWlRLS+jxPkRpIn7rdoupHTdA5s6SI+7H6Mfo+32Y2 ++To3neSIiZ7A0IjPXpXLePlMotGW3272t85datKzHZjbTVnsDj+FG/2Y/RlGP4R+jo20u7H6N1Ql +o+H8I/REY957R+jpfReiK6eOYHLtj2tttH6KrY/6Y/R2c+kjeJiFVtLG24hxpw7/AHY/RRkw9O37 +O99Hrt1YX0tfOBLjcGp4XF8c+u8fs9c4dcVcGemSI61nd3IneN1orQAAAAAAAAAAAAABFqxes1tE +TE9JiUgPKcX4RbRXnNgiZwWnrH4XPi28PdXpW9JraImsxtMS8pxXhF9DecuGJtgmf+1TWW2N/la1 +L7N7T5e3Vy6W3hsYcvLbqzbO9jvvCzvDR0+XeO7crO6FmGSvRThy/RtVXJ92elvk2rRvDUzU7pl4 +izsd2J3jeBpcNz+Lg5LT7+Pp+Xk3W7js5eAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs0NTrN96Yp6edkW8Wzm6+LNTq4pvTHO9vOfRoWtt +1mes95YWvs1s2fZldddOczLPLn2ju0MmebT3YZc2/mpm3qqllN1drsbZIhr3yzvtHf4AsvlYYseb +V5Yx4KTe0+UQ6nDvZ3UazbJqd8OKeu33peq0eh0+hxcmnxxWPOfOfm0mP+steT/ji8N9mKY9suum +L37+HHaPm9DSlaVitKxWsdohI0Y22gAgAAAAAAAAAABXnyRhw3yT92Nwef4xm8bVzET0rPJH5d12 +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 +NO67NbkhzNVnmInqzaOZrL93JyZeV0M1++7S02jvxDWxhxx033tPpC8Z6rrezWjmZyazJG2/u03h +2vFibTHoqvamiwVwY+nLGzV0+SZ1Mx8G0/45tOhzJ5lXMc3UVXRdlF1HP+iYsDPLPPy49/tz1+Te +pSIr0ho6ak5Ms5J8o2q6NImOrHV7XX488ypzTtHXo0s9t6zG7c1G1qz6ubeZiZ3UatXJG3yauSO7 +cvMTEx5tPLb3prPRMVr0HB8vicNxf0+7+kt+LOJwTJyY/Bnz3tH93X36N58cWvq6LSyiyndMSlC7 +mZcymLJiwLosmJVRLKLAtiU7q4lMSCzc3YxJuDMRuAlKAEgAAAlAkAAAAAABKAEgAAAAAJAAAAAA +AAAAAAAEgAAAAAAAAAAAAAkAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAhIAAACAAAASgAAAAAAEAAAA +hGzJAImGMwzQDDZjNVuyNgUTVhNGxysZqDVmiu1G5NN2M4waM0+DCaN2cbGcQNGaMZq3JxMJxA1J +qx2bU4kU09slorWNwa20z02RXHbJbl26QvtFovbHWkxEdJt5y2MOHlr2U1W3jx+1hiw8vSO63lmI +XRTaEWmtY6snRHO1VpmJ+DjavpSZl2s8b7y4HFcnh0n0gha5ebJN55KRM2mdoiPN6fh+kpwXh0Wy +RHj5Otp/s5Ps1p62y31+em9aTMYt/OfVfxTiPjZ52naI7fBrI5t66xz5+a1rW7yx0eSL6iZjtEOX +qNbSletom3lENjh2fbHzbbWt3iVozruc+5ztWubf4M4ybpQ2Oboyrva0Vjza8WdDR4OkXt3n9ldX +kaePP9VtYqctYhdvt5oivTeCZ2YOxXk6ubqMfV0b9mrljfqlFcq88k7z2U5axeItDa1OPessuC8P +ya7XRWYnwqdbT/ZMilvIu4dpslNdixXja8Y5tt85djZdbDWnGOesRtXFtuw6T27No5Kx2OrKYQlC +ExKJgBnEpiyvdlEgsizKLKollFgWxLKJVRLKJBbEp3VxLKJBnuMWQJEbpBIAAAJAAAABIAAAAAAA +lAJAAAAAAAAAAAAAASAAAAAAAAAAAAAJAAAABAJABAlAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAA +AAABAJQAAAAgAABAAI2EoBGyJhkgGPKxmqxAKpownHC+YRMdN5BrTj67R3bOn01o7p01Iv71u89o +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 +2Q==`;async function v0e(e){let t=(r,s="application/octet-stream")=>fetch(`data:${s};base64,${r}`).then(i=>i.blob()),a,n;switch(e.config.warmup){case"face":a=await t(W0);break;case"body":case"full":a=await t(V0);break;default:a=null}if(a){let r=await createImageBitmap(a);n=await e.detect(r,e.config),r.close()}return n}async function w0e(e){return new Promise(t=>{let a;switch(e.config.warmup){case"face":a="data:image/jpeg;base64,"+W0;break;case"full":case"body":a="data:image/jpeg;base64,"+V0;break;default:a=""}let n;if(typeof Image!="undefined")n=new Image;else if(ne.Image)n=new ne.Image;else return;n.onload=async()=>{let r=En(n.naturalWidth,n.naturalHeight);if(!r)K("Warmup: Canvas not found"),t(void 0);else{let s=r.getContext("2d");s&&s.drawImage(n,0,0);let i=await e.image(r,!0),o=i.tensor?await e.detect(i.tensor,e.config):void 0;t(o)}},a?n.src=a:t(void 0)})}async function k0e(e){let t=r=>Buffer.from(r,"base64"),a;e.config.warmup==="face"?a=t(W0):a=t(V0);let n;if("node"in Ve&&ia()==="tensorflow"){let r=(void 0).decodeJpeg(a),s=Gt(r,0);e.tf.dispose(r),n=await e.detect(s,e.config),e.tf.dispose(s)}else e.config.debug&&K("Warmup tfjs-node not loaded");return n}async function I0e(e){let t;return typeof createImageBitmap=="function"?t=await v0e(e):typeof Image!="undefined"||ne.Canvas!==void 0?t=await w0e(e):t=await k0e(e),t}async function S0e(e){var o,l,u,d;if(!V().flagRegistry.ENGINE_COMPILE_ONLY)return;let t=ia(),a=tr();if(t!=="webgl"&&t!=="humangl"||!(a!=null&&a.checkCompileCompletion))return;V().set("ENGINE_COMPILE_ONLY",!0);let n=kt().state.numTensors,r=[];for(let[c,p]of Object.entries(e.models).filter(([h,f])=>h!==null&&f!==null)){let h=(p==null?void 0:p.modelSignature)&&((l=(o=p==null?void 0:p.inputs)==null?void 0:o[0])==null?void 0:l.shape)?[...p.inputs[0].shape]:[1,64,64,3],f=(p==null?void 0:p.modelSignature)&&((d=(u=p==null?void 0:p.inputs)==null?void 0:u[0])==null?void 0:d.dtype)?p.inputs[0].dtype:"float32";for(let g=0;gY(y)):Y(g)}catch(g){e.config.debug&&K("compile fail model:",c)}Y(m)}let s=await a.checkCompileCompletionAsync();a.getUniformLocations(),e.config.debug&&K("compile pass:",{models:r,kernels:s.length}),V().set("ENGINE_COMPILE_ONLY",!1);let i=kt().state.numTensors;i-n>0&&K("tensor leak:",i-n)}async function SI(e,t){await bp(e,!1);let a=te();return e.state="warmup",t&&(e.config=Tt(e.config,t)),!e.config.warmup||e.config.warmup.length===0||e.config.warmup==="none"?or():new Promise(async n=>{await e.models.load(),await S0e(e);let r=await I0e(e),s=te();e.config.debug&&K("warmup",e.config.warmup,Math.round(s-a),"ms"),e.emit("warmup"),n(r)})}var wu,Ep,Rp,G0,Bs,S5=class{constructor(t){le(this,"version");le(this,"config");le(this,"result");le(this,"state");le(this,"process");le(this,"tf");le(this,"env",ne);le(this,"draw",i0);le(this,"match",_0);le(this,"models");le(this,"events");le(this,"faceTriangulation");le(this,"faceUVMap");le(this,"performance");Go(this,wu,void 0);Go(this,Ep,void 0);Go(this,Rp,void 0);le(this,"analyze",(...t)=>{if(!Gn(this,Ep))return;let a=this.tf.engine().state.numTensors,n=Gn(this,wu);$u(this,wu,a);let r=a-n;r!==0&&K(...t,r)});Go(this,G0,t=>{if(!Gn(this,Rp))return null;if(!t)return"input is not defined";if(this.env.node&&!(t instanceof dt))return"input must be a tensor";try{this.tf.getBackend()}catch(a){return"backend not loaded"}return null});le(this,"webcam",new Qh);le(this,"emit",t=>{var a;(a=this.events)!=null&&a.dispatchEvent&&this.events.dispatchEvent(new Event(t))});Go(this,Bs,{});let a=(Ap.tfjs||b2).replace(/-(.*)/,"");yo.wasmPath=`https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${a}/dist/`,yo.modelBasePath=ne.browser?"../models/":"file://models/",this.version=tg,Object.defineProperty(this,"version",{value:tg}),this.config=JSON.parse(JSON.stringify(yo)),Object.seal(this.config),this.config.cacheModels=typeof indexedDB!="undefined",t&&(this.config=Tt(this.config,t)),D9(this.config),this.tf=Ve,this.state="idle",$u(this,wu,0),$u(this,Ep,!1),$u(this,Rp,!1),this.performance={},this.events=typeof EventTarget!="undefined"?new EventTarget:void 0,this.models=new Np(this),lg(),this.result=or(),this.process={tensor:null,canvas:null},this.faceTriangulation=Ew,this.faceUVMap=Rw,B0(this,null,""),this.emit("create"),(this.config.debug||this.env.browser)&&K(`version: ${this.version}`),this.config.debug&&K(`tfjs version: ${this.tf.version["tfjs-core"]}`);let n=JSON.parse(JSON.stringify(this.env));delete n.kernels,delete n.initial,delete n.perfadd,this.config.debug&&K("environment:",n)}reset(){let t=this.config.backend;this.config=JSON.parse(JSON.stringify(yo)),this.config.backend=t,Q3(),ne.initial=!0}validate(t){let a=Z3(yo,t||this.config);return a.length===0&&(this.config=Tt(this.config,t)),a}now(){return te()}image(t,a=!1){return Yh(t,this.config,a)}async segmentation(t,a){var s,i,o;if(a&&(this.config=Tt(this.config,a)),!this.config.segmentation.enabled)return null;let n=await Yh(t,this.config);if(!n.tensor)return null;let r=null;return(s=this.config.segmentation.modelPath)!=null&&s.includes("rvm")&&(r=await bI(n.tensor,this.config)),(i=this.config.segmentation.modelPath)!=null&&i.includes("meet")&&(r=await Jk(n.tensor,this.config)),(o=this.config.segmentation.modelPath)!=null&&o.includes("selfie")&&(r=await wI(n.tensor,this.config)),Y(n.tensor),r}compare(t,a){return O9(this.config,t,a)}async init(){await bp(this,!0),await this.tf.ready(),Q3()}async load(t){this.state="load";let a=te(),n=Object.values(this.models).filter(i=>i).length;t&&(this.config=Tt(this.config,t)),this.env.initial&&(await bp(this,!1)||K("error: backend check failed"),await Kd(),this.env.browser&&(this.config.debug&&K("configuration:",this.config),this.config.debug&&K("tf flags:",this.tf.ENV.flags))),await this.models.load(),this.env.initial&&this.config.debug&&K("tf engine state:",this.tf.engine().state.numBytes,"bytes",this.tf.engine().state.numTensors,"tensors"),this.env.initial=!1,Object.values(this.models).filter(i=>i).length!==n&&(this.models.validate(),this.emit("load"));let s=Math.trunc(te()-a);s>(this.performance.loadModels||0)&&(this.performance.loadModels=this.env.perfadd?(this.performance.loadModels||0)+s:s)}next(t=this.result){return Yk(t,this.config)}async warmup(t){let a=te(),n=await SI(this,t),r=te();return this.performance.warmup=Math.trunc(r-a),n}async profile(t,a){let n=await this.tf.profile(()=>this.detect(t,a)),r={},s=0;for(let o of n.kernels){let l=Number(o.kernelTimeMs)||0;r[o.name]?r[o.name]+=l:r[o.name]=l,s+=l}let i=[];Object.entries(r).forEach(o=>i.push({kernel:o[0],time:o[1],perc:0}));for(let o of i)o.perc=Math.round(1e3*o.time/s)/1e3,o.time=Math.round(1e3*o.time)/1e3;return i.sort((o,l)=>l.time-o.time),i.length=20,i}async detect(t,a){return this.state="detect",new Promise(async n=>{var g,y,A,x,b,w,S,C,N,_,$,M,I,E,O,L,B,G,j,U,H;this.state="config";let r;this.config=Tt(this.config,a),this.state="check";let s=Gn(this,G0).call(this,t);s&&(K(s,t),this.emit("error"),n(or(s)));let i=te();await this.load(),r=te(),this.state="image";let o=await Yh(t,this.config);if(this.process=o,this.performance.inputProcess=this.env.perfadd?(this.performance.inputProcess||0)+Math.trunc(te()-r):Math.trunc(te()-r),this.analyze("Get Image:"),!o.tensor){this.config.debug&&K("could not convert input to tensor"),this.emit("error"),n(or("could not convert input to tensor"));return}this.emit("image"),r=te(),this.config.skipAllowed=await P9(this.config,o.tensor),this.config.filter.autoBrightness=(this.config.filter.autoBrightness||!1)&&this.config.skipAllowed,this.performance.totalFrames||(this.performance.totalFrames=0),this.performance.cachedFrames||(this.performance.cachedFrames=0),this.performance.totalFrames++,this.config.skipAllowed&&this.performance.cachedFrames++,this.performance.cacheCheck=this.env.perfadd?(this.performance.cacheCheck||0)+Math.trunc(te()-r):Math.trunc(te()-r),this.analyze("Check Changed:");let l=[],u=[],d=[],c=[];this.state="detect:face",this.config.async?(l=this.config.face.enabled?Kg(this,o.tensor):[],this.performance.face&&delete this.performance.face):(r=te(),l=this.config.face.enabled?await Kg(this,o.tensor):[],this.performance.face=this.env.perfadd?(this.performance.face||0)+Math.trunc(te()-r):Math.trunc(te()-r)),this.config.async&&(this.config.body.maxDetected===-1||this.config.hand.maxDetected===-1)&&(l=await l),this.analyze("Start Body:"),this.state="detect:body";let p=this.config.body.maxDetected===-1?Tt(this.config,{body:{maxDetected:this.config.face.enabled?1*l.length:1}}):this.config;this.config.async?((g=this.config.body.modelPath)!=null&&g.includes("posenet")?u=this.config.body.enabled?x5(o.tensor,p):[]:(y=this.config.body.modelPath)!=null&&y.includes("blazepose")?u=this.config.body.enabled?hg(o.tensor,p):[]:(A=this.config.body.modelPath)!=null&&A.includes("efficientpose")?u=this.config.body.enabled?bg(o.tensor,p):[]:(x=this.config.body.modelPath)!=null&&x.includes("movenet")&&(u=this.config.body.enabled?c5(o.tensor,p):[]),this.performance.body&&delete this.performance.body):(r=te(),(b=this.config.body.modelPath)!=null&&b.includes("posenet")?u=this.config.body.enabled?await x5(o.tensor,p):[]:(w=this.config.body.modelPath)!=null&&w.includes("blazepose")?u=this.config.body.enabled?await hg(o.tensor,p):[]:(S=this.config.body.modelPath)!=null&&S.includes("efficientpose")?u=this.config.body.enabled?await bg(o.tensor,p):[]:(C=this.config.body.modelPath)!=null&&C.includes("movenet")&&(u=this.config.body.enabled?await c5(o.tensor,p):[]),this.performance.body=this.env.perfadd?(this.performance.body||0)+Math.trunc(te()-r):Math.trunc(te()-r)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.state="detect:hand";let h=this.config.hand.maxDetected===-1?Tt(this.config,{hand:{maxDetected:this.config.face.enabled?2*l.length:1}}):this.config;this.config.async?((_=(N=this.config.hand.detector)==null?void 0:N.modelPath)!=null&&_.includes("handdetect")?d=this.config.hand.enabled?e5(o.tensor,h):[]:(M=($=this.config.hand.detector)==null?void 0:$.modelPath)!=null&&M.includes("handtrack")&&(d=this.config.hand.enabled?n5(o.tensor,h):[]),this.performance.hand&&delete this.performance.hand):(r=te(),(E=(I=this.config.hand.detector)==null?void 0:I.modelPath)!=null&&E.includes("handdetect")?d=this.config.hand.enabled?await e5(o.tensor,h):[]:(L=(O=this.config.hand.detector)==null?void 0:O.modelPath)!=null&&L.includes("handtrack")&&(d=this.config.hand.enabled?await n5(o.tensor,h):[]),this.performance.hand=this.env.perfadd?(this.performance.hand||0)+Math.trunc(te()-r):Math.trunc(te()-r)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.state="detect:object",this.config.async?((B=this.config.object.modelPath)!=null&&B.includes("nanodet")?c=this.config.object.enabled?f5(o.tensor,this.config):[]:(G=this.config.object.modelPath)!=null&&G.includes("centernet")&&(c=this.config.object.enabled?gg(o.tensor,this.config):[]),this.performance.object&&delete this.performance.object):(r=te(),(j=this.config.object.modelPath)!=null&&j.includes("nanodet")?c=this.config.object.enabled?await f5(o.tensor,this.config):[]:(U=this.config.object.modelPath)!=null&&U.includes("centernet")&&(c=this.config.object.enabled?await gg(o.tensor,this.config):[]),this.performance.object=this.env.perfadd?(this.performance.object||0)+Math.trunc(te()-r):Math.trunc(te()-r)),this.analyze("End Object:"),this.state="detect:await",this.config.async&&([l,u,d,c]=await Promise.all([l,u,d,c])),this.state="detect:gesture";let f=[];this.config.gesture.enabled&&(r=te(),f=[...Ck(l),...Tk(u),...Ek(d),...Nk(l)],this.config.async?this.performance.gesture&&delete this.performance.gesture:this.performance.gesture=this.env.perfadd?(this.performance.gesture||0)+Math.trunc(te()-r):Math.trunc(te()-r)),this.performance.total=this.env.perfadd?(this.performance.total||0)+Math.trunc(te()-i):Math.trunc(te()-i);let m=((H=this.process.tensor)==null?void 0:H.shape)||[0,0,0,0];this.result={face:l,body:u,hand:d,gesture:f,object:c,performance:this.performance,canvas:this.process.canvas,timestamp:Date.now(),error:null,width:m[2],height:m[1],get persons(){return II(l,u,d,f,m)}},Y(o.tensor),this.emit("detect"),this.state="idle",n(this.result)})}async sleep(t){return new Promise(a=>{setTimeout(a,t)})}async video(t,a=!0,n=0){a?(Gn(this,Bs)[t.id]||(this.config.debug&&K("video start",t.id),Gn(this,Bs)[t.id]=!0),!t.paused&&Gn(this,Bs)[t.id]&&t.readyState>=2&&await this.detect(t),n>0&&await this.sleep(n),Gn(this,Bs)[t.id]&&requestAnimationFrame(()=>this.video(t,a,n))):(this.config.debug&&K("video stop",t.id),Gn(this,Bs)[t.id]=!1)}};wu=new WeakMap,Ep=new WeakMap,Rp=new WeakMap,G0=new WeakMap,Bs=new WeakMap;return dS(C0e);})(); diff --git a/dist/human.node-gpu.d.ts b/dist/human.node-gpu.d.ts new file mode 100644 index 00000000..f94037de --- /dev/null +++ b/dist/human.node-gpu.d.ts @@ -0,0 +1 @@ +export * from '../types/human'; \ No newline at end of file diff --git a/dist/human.node-gpu.js b/dist/human.node-gpu.js new file mode 100644 index 00000000..e7a749ef --- /dev/null +++ b/dist/human.node-gpu.js @@ -0,0 +1,840 @@ +/* + Human + homepage: + author: ' +*/ + +"use strict";var zo=Object.create;var P2=Object.defineProperty;var So=Object.getOwnPropertyDescriptor;var jo=Object.getOwnPropertyNames;var No=Object.getPrototypeOf,Io=Object.prototype.hasOwnProperty;var Oo=(e,t,n)=>t in e?P2(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var Lo=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),we=(e,t)=>{for(var n in t)P2(e,n,{get:t[n],enumerable:!0})},R1=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of jo(t))!Io.call(e,r)&&r!==n&&P2(e,r,{get:()=>t[r],enumerable:!(o=So(t,r))||o.enumerable});return e};var V=(e,t,n)=>(n=e!=null?zo(No(e)):{},R1(t||!e||!e.__esModule?P2(n,"default",{value:e,enumerable:!0}):n,e)),Co=e=>R1(P2({},"__esModule",{value:!0}),e);var k=(e,t,n)=>(Oo(e,typeof t!="symbol"?t+"":t,n),n),M1=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)};var fe=(e,t,n)=>(M1(e,t,"read from private field"),n?n.call(e):t.get(e)),i2=(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)},k2=(e,t,n,o)=>(M1(e,t,"write to private field"),o?o.call(e,n):t.set(e,n),n);var H=Lo((y4,Vt)=>{"use strict";var Ht=Object.defineProperty,Wo=Object.getOwnPropertyDescriptor,Do=Object.getOwnPropertyNames,Fo=Object.prototype.hasOwnProperty,Bo=(e,t)=>{for(var n in t)Ht(e,n,{get:t[n],enumerable:!0})},Bt=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Do(t))!Fo.call(e,r)&&r!==n&&Ht(e,r,{get:()=>t[r],enumerable:!(o=Wo(t,r))||o.enumerable});return e},Ho=(e,t,n)=>(Bt(e,t,"default"),n&&Bt(n,t,"default")),Go=e=>Bt(Ht({},"__esModule",{value:!0}),e),Gt={};Bo(Gt,{version:()=>Yo});Vt.exports=Go(Gt);Ho(Gt,require("@tensorflow/tfjs-node-gpu"),Vt.exports);var P1="4.0.0",Vo="4.0.0",Zo="4.0.0",Xo="4.0.0",qo="4.0.0",Uo="0.0.1-alpha.14",Yo={tfjs:P1,"tfjs-core":P1,"tfjs-converter":Vo,"tfjs-backend-cpu":Zo,"tfjs-backend-webgl":Xo,"tfjs-backend-wasm":qo,"tfjs-backend-webgpu":Uo}});var d4={};we(d4,{Env:()=>w2,Human:()=>b1,default:()=>b1,defaults:()=>qe,draw:()=>Q2,empty:()=>ue,env:()=>v,match:()=>zt,models:()=>h1});module.exports=Co(d4);var Ae=V(H());function u(...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)}function k1(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(`modelpath error: expecting json file: ${r}`);return r}var g=()=>typeof performance!="undefined"?performance.now():parseInt((Number(process.hrtime.bigint())/1e3/1e3).toString());function Zt(e,t,n="config",o=[]){for(let r of Object.keys(t))if(typeof t[r]=="object")Zt(e[r],t[r],r,o);else{let s=e&&typeof e[r]!="undefined";s||o.push({reason:"unknown property",where:`${n}.${r} = ${t[r]}`});let A=e&&typeof e[r]==typeof t[r];s&&!A&&o.push({reason:"property type mismatch",where:`${n}.${r} = ${t[r]}`,expected:typeof e[r]})}return t.debug&&n==="config"&&o.length>0&&u("invalid configuration",o),o}function A0(...e){let t=n=>n&&typeof n=="object";return e.reduce((n,o)=>(Object.keys(o||{}).forEach(r=>{let s=n[r],A=o[r];Array.isArray(s)&&Array.isArray(A)?n[r]=s.concat(...A):t(s)&&t(A)?n[r]=A0(s,A):n[r]=A}),n),{})}var qe={backend:"",modelBasePath:"",cacheModels:!0,validateModels:!0,wasmPath:"",wasmPlatformFetch:!1,debug:!1,async:!0,warmup:"full",cacheSensitivity:.7,skipAllowed:!1,deallocate:!1,flags:{},softwareKernels:!1,filter:{enabled:!0,equalization:!1,width:0,height:0,flip:!1,return:!0,autoBrightness:!0,brightness:0,contrast:0,sharpness:0,blur:0,saturation:0,hue:0,negative:!1,sepia:!1,vintage:!1,kodachrome:!1,technicolor:!1,polaroid:!1,pixelate:0},gesture:{enabled:!0},face:{enabled:!0,detector:{modelPath:"blazeface.json",rotation:!0,maxDetected:1,skipFrames:99,skipTime:2500,minConfidence:.2,iouThreshold:.1,mask:!1,return:!1},mesh:{enabled:!0,modelPath:"facemesh.json",keepInvalid:!1},attention:{enabled:!1,modelPath:"facemesh-attention.json"},iris:{enabled:!0,modelPath:"iris.json"},emotion:{enabled:!0,minConfidence:.1,skipFrames:99,skipTime:1500,modelPath:"emotion.json"},description:{enabled:!0,modelPath:"faceres.json",skipFrames:99,skipTime:3e3,minConfidence:.1},antispoof:{enabled:!1,skipFrames:99,skipTime:4e3,modelPath:"antispoof.json"},liveness:{enabled:!1,skipFrames:99,skipTime:4e3,modelPath:"liveness.json"}},body:{enabled:!0,modelPath:"movenet-lightning.json",maxDetected:-1,minConfidence:.3,skipFrames:1,skipTime:200},hand:{enabled:!0,rotation:!0,skipFrames:99,skipTime:1e3,minConfidence:.5,iouThreshold:.2,maxDetected:-1,landmarks:!0,detector:{modelPath:"handtrack.json"},skeleton:{modelPath:"handlandmark-full.json"}},object:{enabled:!1,modelPath:"centernet.json",minConfidence:.2,iouThreshold:.4,maxDetected:10,skipFrames:99,skipTime:2e3},segmentation:{enabled:!1,modelPath:"rvm.json",ratio:.5,mode:"default"}};var I0=V(H());var N=V(H());var w1=` + 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.); + } +`;var E1=` + 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]; + } +`,z1=` + 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; + } +`,S1=` + 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); + } +`,j1=` + 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; + } +`,N1=` + 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); // top left + vec4 c12 = texture2D(texture, vec2(vUv.x, vUv.y - px.y)); // top center + vec4 c13 = texture2D(texture, vec2(vUv.x + px.x, vUv.y - px.y)); // top right + vec4 c21 = texture2D(texture, vec2(vUv.x - px.x, vUv.y) ); // mid left + vec4 c22 = texture2D(texture, vUv); // mid center + vec4 c23 = texture2D(texture, vec2(vUv.x + px.x, vUv.y) ); // mid right + vec4 c31 = texture2D(texture, vec2(vUv.x - px.x, vUv.y + px.y) ); // bottom left + vec4 c32 = texture2D(texture, vec2(vUv.x, vUv.y + px.y) ); // bottom center + vec4 c33 = texture2D(texture, vUv + px ); // bottom right + 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; + } +`;var Xt=(e,t,n)=>{let o=new RegExp("\\b"+t+" \\w+ (\\w+)","ig");e.replace(o,(r,s)=>(n[s]=0,r))},qt=class{constructor(t,n,o){k(this,"uniform",{});k(this,"attribute",{});k(this,"gl");k(this,"id");k(this,"compile",(t,n)=>{let o=this.gl.createShader(n);return o?(this.gl.shaderSource(o,t),this.gl.compileShader(o),this.gl.getShaderParameter(o,this.gl.COMPILE_STATUS)?o:(u(`filter: gl compile failed: ${this.gl.getShaderInfoLog(o)||"unknown"}`),null)):(u("filter: could not create shader"),null)});this.gl=t;let r=this.compile(n,this.gl.VERTEX_SHADER),s=this.compile(o,this.gl.FRAGMENT_SHADER);if(this.id=this.gl.createProgram(),!(!r||!s)){if(!this.id){u("filter: could not create webgl program");return}if(this.gl.attachShader(this.id,r),this.gl.attachShader(this.id,s),this.gl.linkProgram(this.id),!this.gl.getProgramParameter(this.id,this.gl.LINK_STATUS)){u(`filter: gl link failed: ${this.gl.getProgramInfoLog(this.id)||"unknown"}`);return}this.gl.useProgram(this.id),Xt(n,"attribute",this.attribute);for(let A in this.attribute)this.attribute[A]=this.gl.getAttribLocation(this.id,A);Xt(n,"uniform",this.uniform),Xt(o,"uniform",this.uniform);for(let A in this.uniform)this.uniform[A]=this.gl.getUniformLocation(this.id,A)}}};function I1(){let e=0,t=null,n=!1,o=-1,r=[null,null],s=[],A=null,a=null,l=ee(100,100),c={},x={INTERMEDIATE:1},i=l.getContext("webgl");if(!i){u("filter: cannot get webgl context");return}this.gl=i;function y(T,m){if(!(T===l.width&&m===l.height)){if(l.width=T,l.height=m,!A){let h=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]);A=i.createBuffer(),i.bindBuffer(i.ARRAY_BUFFER,A),i.bufferData(i.ARRAY_BUFFER,h,i.STATIC_DRAW),i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0)}i.viewport(0,0,l.width,l.height),r=[null,null]}}function d(T,m){let h=i.createFramebuffer();i.bindFramebuffer(i.FRAMEBUFFER,h);let S=i.createRenderbuffer();i.bindRenderbuffer(i.RENDERBUFFER,S);let P=i.createTexture();return i.bindTexture(i.TEXTURE_2D,P),i.texImage2D(i.TEXTURE_2D,0,i.RGBA,T,m,0,i.RGBA,i.UNSIGNED_BYTE,null),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,i.LINEAR),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,i.LINEAR),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,i.CLAMP_TO_EDGE),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,i.CLAMP_TO_EDGE),i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,P,0),i.bindTexture(i.TEXTURE_2D,null),i.bindFramebuffer(i.FRAMEBUFFER,null),{fbo:h,texture:P}}function p(T){return r[T]=r[T]||d(l.width,l.height),r[T]}function f(T=0){if(!a)return;let m=null,h=null,S=!1;e===0?m=t:m=p(o).texture||null,e++,n&&!(T&x.INTERMEDIATE)?(h=null,S=e%2===0):(o=(o+1)%2,h=p(o).fbo||null),i.bindTexture(i.TEXTURE_2D,m),i.bindFramebuffer(i.FRAMEBUFFER,h),i.uniform1f(a.uniform.flipY,S?-1:1),i.drawArrays(i.TRIANGLES,0,6)}function b(T){if(c[T])return a=c[T],i.useProgram((a?a.id:null)||null),a;if(a=new qt(i,w1,T),!a)return u("filter: could not get webgl program"),null;let m=Float32Array.BYTES_PER_ELEMENT,h=4*m;return i.enableVertexAttribArray(a.attribute.pos),i.vertexAttribPointer(a.attribute.pos,2,i.FLOAT,!1,h,0*m),i.enableVertexAttribArray(a.attribute.uv),i.vertexAttribPointer(a.attribute.uv,2,i.FLOAT,!1,h,2*m),c[T]=a,a}let M={colorMatrix:T=>{let m=new Float32Array(T);m[4]/=255,m[9]/=255,m[14]/=255,m[19]/=255;let h=m[18]===1&&m[3]===0&&m[8]===0&&m[13]===0&&m[15]===0&&m[16]===0&&m[17]===0&&m[19]===0?z1:E1,S=b(h);!S||(i.uniform1fv(S.uniform.m,m),f())},brightness:T=>{let m=(T||0)+1;M.colorMatrix([m,0,0,0,0,0,m,0,0,0,0,0,m,0,0,0,0,0,1,0])},saturation:T=>{let m=(T||0)*2/3+1,h=(m-1)*-.5;M.colorMatrix([m,h,h,0,0,h,m,h,0,0,h,h,m,0,0,0,0,0,1,0])},desaturate:()=>{M.saturation(-1)},contrast:T=>{let m=(T||0)+1,h=-128*(m-1);M.colorMatrix([m,0,0,0,h,0,m,0,0,h,0,0,m,0,h,0,0,0,1,0])},negative:()=>{M.contrast(-2)},hue:T=>{T=(T||0)/180*Math.PI;let m=Math.cos(T),h=Math.sin(T),S=.213,P=.715,I=.072;M.colorMatrix([S+m*(1-S)+h*-S,P+m*-P+h*-P,I+m*-I+h*(1-I),0,0,S+m*-S+h*.143,P+m*(1-P)+h*.14,I+m*-I+h*-.283,0,0,S+m*-S+h*-(1-S),P+m*-P+h*P,I+m*(1-I)+h*I,0,0,0,0,0,1,0])},desaturateLuminance:()=>{M.colorMatrix([.2764723,.929708,.0938197,0,-37.1,.2764723,.929708,.0938197,0,-37.1,.2764723,.929708,.0938197,0,-37.1,0,0,0,1,0])},sepia:()=>{M.colorMatrix([.393,.7689999,.18899999,0,0,.349,.6859999,.16799999,0,0,.272,.5339999,.13099999,0,0,0,0,0,1,0])},brownie:()=>{M.colorMatrix([.5997023498159715,.34553243048391263,-.2708298674538042,0,47.43192855600873,-.037703249837783157,.8609577587992641,.15059552388459913,0,-36.96841498319127,.24113635128153335,-.07441037908422492,.44972182064877153,0,-7.562075277591283,0,0,0,1,0])},vintagePinhole:()=>{M.colorMatrix([.6279345635605994,.3202183420819367,-.03965408211312453,0,9.651285835294123,.02578397704808868,.6441188644374771,.03259127616149294,0,7.462829176470591,.0466055556782719,-.0851232987247891,.5241648018700465,0,5.159190588235296,0,0,0,1,0])},kodachrome:()=>{M.colorMatrix([1.1285582396593525,-.3967382283601348,-.03992559172921793,0,63.72958762196502,-.16404339962244616,1.0835251566291304,-.05498805115633132,0,24.732407896706203,-.16786010706155763,-.5603416277695248,1.6014850761964943,0,35.62982807460946,0,0,0,1,0])},technicolor:()=>{M.colorMatrix([1.9125277891456083,-.8545344976951645,-.09155508482755585,0,11.793603434377337,-.3087833385928097,1.7658908555458428,-.10601743074722245,0,-70.35205161461398,-.231103377548616,-.7501899197440212,1.847597816108189,0,30.950940869491138,0,0,0,1,0])},polaroid:()=>{M.colorMatrix([1.438,-.062,-.062,0,0,-.122,1.378,-.122,0,0,-.016,-.016,1.483,0,0,0,0,0,1,0])},shiftToBGR:()=>{M.colorMatrix([0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0])},convolution:T=>{let m=new Float32Array(T),h=1/l.width,S=1/l.height,P=b(N1);!P||(i.uniform1fv(P.uniform.m,m),i.uniform2f(P.uniform.px,h,S),f())},detectEdges:()=>{M.convolution.call(this,[0,1,0,1,-4,1,0,1,0])},sobelX:()=>{M.convolution.call(this,[-1,0,1,-2,0,2,-1,0,1])},sobelY:()=>{M.convolution.call(this,[-1,-2,-1,0,0,0,1,2,1])},sharpen:T=>{let m=T||1;M.convolution.call(this,[0,-1*m,0,-1*m,1+4*m,-1*m,0,-1*m,0])},emboss:T=>{let m=T||1;M.convolution.call(this,[-2*m,-1*m,0,-1*m,1,1*m,0,1*m,2*m])},blur:T=>{let m=T/7/l.width,h=T/7/l.height,S=b(j1);!S||(i.uniform2f(S.uniform.px,0,h),f(x.INTERMEDIATE),i.uniform2f(S.uniform.px,m,0),f())},pixelate:T=>{let m=T/l.width,h=T/l.height,S=b(S1);!S||(i.uniform2f(S.uniform.size,m,h),f())}};this.add=function(T){let m=Array.prototype.slice.call(arguments,1),h=M[T];s.push({func:h,args:m})},this.reset=function(){s=[]},this.get=function(){return s},this.apply=function(T){y(T.width,T.height),e=0,t||(t=i.createTexture()),i.bindTexture(i.TEXTURE_2D,t),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,i.CLAMP_TO_EDGE),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,i.CLAMP_TO_EDGE),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,i.NEAREST),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,i.NEAREST),i.texImage2D(i.TEXTURE_2D,0,i.RGBA,i.RGBA,i.UNSIGNED_BYTE,T);for(let m=0;mx.data())),A=Math.max(s[0][0],s[1][0],s[2][0]),l=(A>1?255:1)/A,c;if(l>1){let x=[Y.sub(n[0],o[0]),Y.sub(n[1],o[1]),Y.sub(n[2],o[2])],i=[Y.sub(r[0],o[0]),Y.sub(r[1],o[1]),Y.sub(r[2],o[2])],y=[Y.mul(x[0],l),Y.mul(x[1],l),Y.mul(x[2],l)],d=Y.stack([y[0],y[1],y[2]],2);c=Y.reshape(d,[1,t.shape[0]||0,t.shape[1]||0,3]),Y.dispose([...x,...i,...y])}else c=Y.expandDims(t,0);return Y.dispose([...n,...o,...r,n,t,e]),c}var B2=3840,v0=null,R0=null,l2=null,e0,K0={inputSum:0,cacheDiff:1,sumMethod:0,inputTensor:void 0};function Ut(){K0.inputSum=0,K0.cacheDiff=1,K0.sumMethod=0,K0.inputTensor=void 0}function ee(e,t){let n;if(v.browser)if(v.worker){if(typeof OffscreenCanvas=="undefined")throw new Error("canvas error: attempted to run in web worker but OffscreenCanvas is not supported");n=new OffscreenCanvas(e,t)}else{if(typeof document=="undefined")throw new Error("canvas error: attempted to run in browser but DOM is not defined");n=document.createElement("canvas"),n.width=e,n.height=t}else typeof v.Canvas!="undefined"?n=new v.Canvas(e,t):typeof globalThis.Canvas!="undefined"&&(n=new globalThis.Canvas(e,t));return n}function H2(e,t){let n=t||ee(e.width,e.height);return n.getContext("2d").drawImage(e,0,0),n}async function G2(e,t,n=!0){var y,d,p;if(!e)return t.debug&&u("input error: input is missing"),{tensor:null,canvas:null};if(!(e instanceof N.Tensor)&&!(typeof Image!="undefined"&&e instanceof Image)&&!(typeof v.Canvas!="undefined"&&e instanceof v.Canvas)&&!(typeof globalThis.Canvas!="undefined"&&e instanceof globalThis.Canvas)&&!(typeof ImageData!="undefined"&&e instanceof ImageData)&&!(typeof ImageBitmap!="undefined"&&e instanceof ImageBitmap)&&!(typeof HTMLImageElement!="undefined"&&e instanceof HTMLImageElement)&&!(typeof HTMLMediaElement!="undefined"&&e instanceof HTMLMediaElement)&&!(typeof HTMLVideoElement!="undefined"&&e instanceof HTMLVideoElement)&&!(typeof HTMLCanvasElement!="undefined"&&e instanceof HTMLCanvasElement)&&!(typeof OffscreenCanvas!="undefined"&&e instanceof OffscreenCanvas))throw new Error("input error: type is not recognized");if(e instanceof N.Tensor){let f=null;if(e.isDisposedInternal)throw new Error("input error: attempted to use tensor but it is disposed");if(!e.shape)throw new Error("input error: attempted to use tensor without a shape");if(e.shape.length===3){if(e.shape[2]===3)f=N.expandDims(e,0);else if(e.shape[2]===4){let b=N.slice3d(e,[0,0,0],[-1,-1,3]);f=N.expandDims(b,0),N.dispose(b)}}else e.shape.length===4&&(e.shape[3]===3?f=N.clone(e):e.shape[3]===4&&(f=N.slice4d(e,[0,0,0,0],[-1,-1,-1,3])));if(f==null||f.shape.length!==4||f.shape[0]!==1||f.shape[3]!==3)throw new Error(`input error: attempted to use tensor with unrecognized shape: ${e.shape.toString()}`);if(f.dtype==="int32"){let b=N.cast(f,"float32");N.dispose(f),f=b}return{tensor:f,canvas:t.filter.return?R0:null}}if(typeof e.readyState!="undefined"&&e.readyState<=2)return t.debug&&u("input stream is not ready"),{tensor:null,canvas:v0};let o=e.naturalWidth||e.videoWidth||e.width||e.shape&&e.shape[1]>0,r=e.naturalHeight||e.videoHeight||e.height||e.shape&&e.shape[2]>0;if(!o||!r)return t.debug&&u("cannot determine input dimensions"),{tensor:null,canvas:v0};let s=o,A=r;if(s>B2&&(s=B2,A=Math.trunc(s*r/o)),A>B2&&(A=B2,s=Math.trunc(A*o/r)),(((y=t.filter)==null?void 0:y.width)||0)>0?s=t.filter.width:(((d=t.filter)==null?void 0:d.height)||0)>0&&(s=o*((t.filter.height||0)/r)),(t.filter.height||0)>0?A=t.filter.height:(t.filter.width||0)>0&&(A=r*((t.filter.width||0)/o)),!s||!A)throw new Error("input error: cannot determine dimension");(!v0||v0.width!==s||v0.height!==A)&&(v0=ee(s,A));let a=v0.getContext("2d");if(typeof ImageData!="undefined"&&e instanceof ImageData?a.putImageData(e,0,0):t.filter.flip&&typeof a.translate!="undefined"?(a.translate(o,0),a.scale(-1,1),a.drawImage(e,0,0,o,r,0,0,v0.width,v0.height),a.setTransform(1,0,0,1,0,0)):a.drawImage(e,0,0,o,r,0,0,v0.width,v0.height),(!R0||v0.width!==R0.width||v0.height!==R0.height)&&(R0=ee(v0.width,v0.height)),t.filter.enabled&&v.webgl.supported?(e0||(e0=v.browser?new I1:null),v.filter=!!e0,e0!=null&&e0.add?(e0.reset(),t.filter.brightness!==0&&e0.add("brightness",t.filter.brightness),t.filter.contrast!==0&&e0.add("contrast",t.filter.contrast),t.filter.sharpness!==0&&e0.add("sharpen",t.filter.sharpness),t.filter.blur!==0&&e0.add("blur",t.filter.blur),t.filter.saturation!==0&&e0.add("saturation",t.filter.saturation),t.filter.hue!==0&&e0.add("hue",t.filter.hue),t.filter.negative&&e0.add("negative"),t.filter.sepia&&e0.add("sepia"),t.filter.vintage&&e0.add("brownie"),t.filter.sepia&&e0.add("sepia"),t.filter.kodachrome&&e0.add("kodachrome"),t.filter.technicolor&&e0.add("technicolor"),t.filter.polaroid&&e0.add("polaroid"),t.filter.pixelate!==0&&e0.add("pixelate",t.filter.pixelate),((p=e0.get())==null?void 0:p.length)>1?R0=e0.apply(v0):R0=e0.draw(v0)):(t.debug&&u("input process error: cannot initialize filters"),v.webgl.supported=!1,t.filter.enabled=!1,H2(v0,R0))):(H2(v0,R0),e0&&(e0=null),v.filter=!!e0),!n)return{tensor:null,canvas:R0};if(!R0)throw new Error("canvas error: cannot create output");let l,c=3;if(typeof ImageData!="undefined"&&e instanceof ImageData||e.data&&e.width&&e.height)if(v.browser&&N.browser)l=N.browser?N.browser.fromPixels(e):null;else{c=e.data.length/e.height/e.width;let f=new Uint8Array(e.data.buffer);l=N.tensor(f,[e.height,e.width,c],"int32")}else if((!l2||R0.width!==l2.width||R0.height!==l2.height)&&(l2=ee(R0.width,R0.height)),N.browser&&v.browser)t.backend==="webgl"||t.backend==="humangl"||t.backend==="webgpu"?l=N.browser.fromPixels(R0):(l2=H2(R0),l=N.browser.fromPixels(l2));else{let M=H2(R0).getContext("2d").getImageData(0,0,s,A);c=M.data.length/s/A;let T=new Uint8Array(M.data.buffer);l=N.tensor(T,[s,A,c])}if(c===4){let f=N.slice3d(l,[0,0,0],[-1,-1,3]);N.dispose(l),l=f}if(!l)throw new Error("input error: cannot create tensor");let x=N.cast(l,"float32"),i=t.filter.equalization?await F2(x):N.expandDims(x,0);if(N.dispose([l,x]),t.filter.autoBrightness){let f=N.max(i),b=await f.data();t.filter.brightness=b[0]>1?1-b[0]/255:1-b[0],N.dispose(f)}return{tensor:i,canvas:t.filter.return?R0:null}}async function O1(e,t){let n=!1;if(e.cacheSensitivity===0||!t.shape||t.shape.length!==4||t.shape[1]>3840||t.shape[2]>2160)return n;if(!K0.inputTensor)K0.inputTensor=N.clone(t);else if(K0.inputTensor.shape[1]!==t.shape[1]||K0.inputTensor.shape[2]!==t.shape[2])N.dispose(K0.inputTensor),K0.inputTensor=N.clone(t);else{let o={};o.diff=N.sub(t,K0.inputTensor),o.squared=N.mul(o.diff,o.diff),o.sum=N.sum(o.squared);let s=(await o.sum.data())[0]/(t.shape[1]||1)/(t.shape[2]||1)/255/3;N.dispose([K0.inputTensor,o.diff,o.squared,o.sum]),K0.inputTensor=N.clone(t),n=s<=(e.cacheSensitivity||0)}return n}async function L1(e,t,n){let o={};if(!t||!n||t.shape.length!==4||t.shape.length!==n.shape.length)return e.debug||u("invalid input tensor or tensor shapes do not match:",t.shape,n.shape),0;if(t.shape[0]!==1||n.shape[0]!==1||t.shape[3]!==3||n.shape[3]!==3)return e.debug||u("input tensors must be of shape [1, height, width, 3]:",t.shape,n.shape),0;o.input1=N.clone(t),o.input2=t.shape[1]!==n.shape[1]||t.shape[2]!==n.shape[2]?N.image.resizeBilinear(n,[t.shape[1],t.shape[2]]):N.clone(n),o.diff=N.sub(o.input1,o.input2),o.squared=N.mul(o.diff,o.diff),o.sum=N.sum(o.squared);let s=(await o.sum.data())[0]/(t.shape[1]||1)/(t.shape[2]||1)/255/3;return N.dispose([o.input1,o.input2,o.diff,o.squared,o.sum]),s}var w2=class{constructor(){k(this,"browser");k(this,"node");k(this,"worker");k(this,"platform","");k(this,"agent","");k(this,"backends",[]);k(this,"initial");k(this,"filter");k(this,"tfjs");k(this,"offscreen");k(this,"perfadd",!1);k(this,"tensorflow",{version:void 0,gpu:void 0});k(this,"wasm",{supported:void 0,backend:void 0,simd:void 0,multithread:void 0});k(this,"webgl",{supported:void 0,backend:void 0,version:void 0,renderer:void 0,shader:void 0,vendor:void 0});k(this,"webgpu",{supported:void 0,backend:void 0,adapter:void 0});k(this,"cpu",{model:void 0,flags:[]});k(this,"kernels",[]);k(this,"Canvas");k(this,"Image");k(this,"ImageData");if(this.browser=typeof navigator!="undefined",this.node=typeof process!="undefined"&&typeof process.versions!="undefined"&&typeof process.versions.node!="undefined",this.tfjs={version:I0.version["tfjs-core"]},this.offscreen=typeof OffscreenCanvas!="undefined",this.initial=!0,this.worker=this.browser&&this.offscreen?typeof WorkerGlobalScope!="undefined":void 0,typeof navigator!="undefined"){let t=navigator.userAgent.match(/\(([^()]+)\)/g);if(t!=null&&t[0]){let n=t[0].match(/\(([^()]+)\)/g);this.platform=n!=null&&n[0]?n[0].replace(/\(|\)/g,""):"",this.agent=navigator.userAgent.replace(t[0],""),this.platform[1]&&(this.agent=this.agent.replace(t[1],"")),this.agent=this.agent.replace(/ /g," ")}}else typeof process!="undefined"&&(this.platform=`${process.platform} ${process.arch}`,this.agent=`NodeJS ${process.version}`)}async updateBackend(){this.backends=Object.keys(I0.engine().registryFactory);try{this.tensorflow={version:I0.backend().binding?I0.backend().binding.TF_Version:void 0,gpu:I0.backend().binding?I0.backend().binding.isUsingGpuDevice():void 0}}catch(o){}this.wasm.supported=typeof WebAssembly!="undefined",this.wasm.backend=this.backends.includes("wasm"),this.wasm.supported&&this.wasm.backend&&(this.wasm.simd=await I0.env().getAsync("WASM_HAS_SIMD_SUPPORT"),this.wasm.multithread=await I0.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT"));let t=ee(100,100),n=t?t.getContext("webgl2"):void 0;this.webgl.supported=typeof n!="undefined",this.webgl.backend=this.backends.includes("webgl"),this.webgl.supported&&this.webgl.backend&&n&&(this.webgl.version=n.getParameter(n.VERSION),this.webgl.vendor=n.getParameter(n.VENDOR),this.webgl.renderer=n.getParameter(n.RENDERER),this.webgl.shader=n.getParameter(n.SHADING_LANGUAGE_VERSION)),this.webgpu.supported=this.browser&&typeof navigator.gpu!="undefined",this.webgpu.backend=this.backends.includes("webgpu");try{if(this.webgpu.supported){let o=await navigator.gpu.requestAdapter();this.webgpu.adapter=await(o==null?void 0:o.requestAdapterInfo())}}catch(o){this.webgpu.supported=!1}try{this.kernels=I0.getKernelsForBackend(I0.getBackend()).map(o=>o.kernelName.toLowerCase())}catch(o){}}updateCPU(){let t={model:"",flags:[]};this.node&&this.platform.startsWith("linux"),this.cpu?this.cpu=t:Object.defineProperty(this,"cpu",{value:t})}},v=new w2;var Z2=class{constructor(){k(this,"config");k(this,"element");k(this,"stream");k(this,"devices",[]);k(this,"enumerate",async()=>{try{let t=await navigator.mediaDevices.enumerateDevices();this.devices=t.filter(n=>n.kind==="videoinput")}catch(t){this.devices=[]}return this.devices});k(this,"start",async t=>{if(t!=null&&t.debug&&(this.config.debug=t==null?void 0:t.debug),t!=null&&t.crop&&(this.config.crop=t==null?void 0:t.crop),t!=null&&t.mode&&(this.config.mode=t==null?void 0:t.mode),t!=null&&t.width&&(this.config.width=t==null?void 0:t.width),t!=null&&t.height&&(this.config.height=t==null?void 0:t.height),t!=null&&t.id&&(this.config.id=t==null?void 0:t.id),t!=null&&t.element)if(typeof t.element=="string"){let r=document.getElementById(t.element);if(r&&r instanceof HTMLVideoElement)this.element=r;else{this.config.debug&&u("webcam","cannot get dom element",t.element);return}}else if(t.element instanceof HTMLVideoElement)this.element=t.element;else{this.config.debug&&u("webcam","unknown dom element",t.element);return}else this.element=document.createElement("video");let n={audio:!1,video:{facingMode:this.config.mode==="front"?"user":"environment",resizeMode:this.config.crop?"crop-and-scale":"none",width:{ideal:this.config.width>0?this.config.width:window.innerWidth},height:{ideal:this.config.height>0?this.config.height:window.innerHeight}}};if(this.config.id&&(n.video.deviceId=this.config.id),this.element.addEventListener("play",()=>{this.config.debug&&u("webcam","play")}),this.element.addEventListener("pause",()=>{this.config.debug&&u("webcam","pause")}),this.element.addEventListener("click",async()=>{!this.element||!this.stream||(this.element.paused?await this.element.play():this.element.pause())}),!(navigator!=null&&navigator.mediaDevices)){this.config.debug&&u("webcam","no devices");return}try{this.stream=await navigator.mediaDevices.getUserMedia(n)}catch(r){u("webcam",r);return}if(!this.stream){this.config.debug&&u("webcam","no stream");return}this.element.srcObject=this.stream,await new Promise(r=>{this.element?this.element.onloadeddata=()=>r(!0):r(!1)}),await this.element.play(),this.config.debug&&u("webcam",{width:this.width,height:this.height,label:this.label,stream:this.stream,track:this.track,settings:this.settings,constraints:this.constraints,capabilities:this.capabilities})});k(this,"pause",()=>{this.element&&this.element.pause()});k(this,"play",async()=>{this.element&&await this.element.play()});k(this,"stop",()=>{this.config.debug&&u("webcam","stop"),this.track&&this.track.stop()});this.config={element:void 0,debug:!0,mode:"front",crop:!1,width:0,height:0}}get track(){if(!!this.stream)return this.stream.getVideoTracks()[0]}get capabilities(){if(!!this.track)return this.track.getCapabilities?this.track.getCapabilities():void 0}get constraints(){if(!!this.track)return this.track.getConstraints?this.track.getConstraints():void 0}get settings(){if(!this.stream)return;let t=this.stream.getVideoTracks()[0];return t.getSettings?t.getSettings():void 0}get label(){return this.track?this.track.label:""}get paused(){var t;return((t=this.element)==null?void 0:t.paused)||!1}get width(){var t;return((t=this.element)==null?void 0:t.videoWidth)||0}get height(){var t;return((t=this.element)==null?void 0:t.videoHeight)||0}};var c2=V(H());var Yt={};we(Yt,{age:()=>cr,"anti-spoofing":()=>Vr,antispoof:()=>_o,blazeface:()=>$o,"blazeface-back":()=>dr,"blazeface-front":()=>xr,"blazepose-detect":()=>Gr,"blazepose-detector2d":()=>yr,"blazepose-detector3d":()=>fr,"blazepose-full":()=>mr,"blazepose-heavy":()=>pr,"blazepose-lite":()=>ur,centernet:()=>er,default:()=>ns,efficientpose:()=>hr,"efficientpose-i-lite":()=>Zr,"efficientpose-ii-lite":()=>Xr,"efficientpose-iv":()=>qr,emotion:()=>tr,faceboxes:()=>br,facemesh:()=>nr,"facemesh-attention":()=>Tr,"facemesh-attention-alt":()=>gr,"facemesh-detection-full":()=>vr,"facemesh-detection-short":()=>Rr,"facemesh-orig":()=>Mr,faceres:()=>or,"faceres-deep":()=>Pr,gear:()=>kr,gender:()=>Er,"gender-ssrnet-imdb":()=>wr,handdetect:()=>zr,"handlandmark-full":()=>rr,"handlandmark-lite":()=>Sr,"handlandmark-sparse":()=>jr,handskeleton:()=>Nr,handtrack:()=>sr,"insightface-efficientnet-b0":()=>Ur,"insightface-ghostnet-strides1":()=>Yr,"insightface-ghostnet-strides2":()=>Kr,"insightface-mobilenet-emore":()=>Jr,"insightface-mobilenet-swish":()=>Qr,iris:()=>Ar,liveness:()=>ar,meet:()=>Ir,mobileface:()=>Or,mobilefacenet:()=>Lr,models:()=>ir,"movenet-lightning":()=>lr,"movenet-multipose":()=>Cr,"movenet-thunder":()=>Wr,nanodet:()=>Dr,"nanodet-e":()=>_r,"nanodet-g":()=>$r,"nanodet-m":()=>es,"nanodet-t":()=>ts,posenet:()=>Fr,rvm:()=>Br,selfie:()=>Hr});var _o=853098,$o=538928,er=4030290,tr=820516,nr=1477958,or=6978814,rr=5431368,sr=2964837,Ar=2599092,ar=592976,ir=0,lr=4650216,cr=161240,dr=538928,xr=402048,yr=7499400,fr=5928856,mr=6338290,pr=27501554,ur=2725490,hr=5651240,br=2013002,gr=2387598,Tr=2382414,vr=1026192,Rr=201268,Mr=2955780,Pr=13957620,kr=1498916,wr=161236,Er=201808,zr=3515612,Sr=2023432,jr=5286322,Nr=5502280,Ir=372228,Or=2183192,Lr=5171976,Cr=9448838,Wr=12477112,Dr=7574558,Fr=5032780,Br=3739355,Hr=212886,Gr=5928804,Vr=853098,Zr=2269064,Xr=5651240,qr=25643252,Ur=13013224,Yr=8093408,Kr=8049584,Jr=6938536,Qr=12168584,_r=12319156,$r=7574558,es=1887474,ts=5294216,ns={antispoof:_o,blazeface:$o,centernet:er,emotion:tr,facemesh:nr,faceres:or,"handlandmark-full":rr,handtrack:sr,iris:Ar,liveness:ar,models:ir,"movenet-lightning":lr,age:cr,"blazeface-back":dr,"blazeface-front":xr,"blazepose-detector2d":yr,"blazepose-detector3d":fr,"blazepose-full":mr,"blazepose-heavy":pr,"blazepose-lite":ur,efficientpose:hr,faceboxes:br,"facemesh-attention-alt":gr,"facemesh-attention":Tr,"facemesh-detection-full":vr,"facemesh-detection-short":Rr,"facemesh-orig":Mr,"faceres-deep":Pr,gear:kr,"gender-ssrnet-imdb":wr,gender:Er,handdetect:zr,"handlandmark-lite":Sr,"handlandmark-sparse":jr,handskeleton:Nr,meet:Ir,mobileface:Or,mobilefacenet:Lr,"movenet-multipose":Cr,"movenet-thunder":Wr,nanodet:Dr,posenet:Fr,rvm:Br,selfie:Hr,"blazepose-detect":Gr,"anti-spoofing":Vr,"efficientpose-i-lite":Zr,"efficientpose-ii-lite":Xr,"efficientpose-iv":qr,"insightface-efficientnet-b0":Ur,"insightface-ghostnet-strides1":Yr,"insightface-ghostnet-strides2":Kr,"insightface-mobilenet-emore":Jr,"insightface-mobilenet-swish":Qr,"nanodet-e":_r,"nanodet-g":$r,"nanodet-m":es,"nanodet-t":ts};var O0={cacheModels:!0,cacheSupported:!0,verbose:!0,debug:!1,modelBasePath:""},E0={};async function os(e,t){return O0.debug&&u("load model fetch:",e,t),fetch(e,t)}function C1(e){O0.cacheModels=e.cacheModels,O0.verbose=e.debug,O0.modelBasePath=e.modelBasePath}async function O(e){var c,x,i,y;let t=k1(O0.modelBasePath,e||"");t.toLowerCase().endsWith(".json")||(t+=".json");let n=t.includes("/")?t.split("/"):t.split("\\"),o=n[n.length-1].replace(".json",""),r="indexeddb://"+o;E0[o]={name:o,sizeFromManifest:0,sizeLoadedWeights:0,sizeDesired:Yt[o],inCache:!1,url:""},O0.cacheSupported=typeof indexedDB!="undefined";let s={};try{s=O0.cacheSupported&&O0.cacheModels?await c2.io.listModels():{}}catch(d){O0.cacheSupported=!1}E0[o].inCache=O0.cacheSupported&&O0.cacheModels&&Object.keys(s).includes(r),E0[o].url=E0[o].inCache?r:t;let A=typeof fetch=="undefined"?{}:{fetchFunc:(d,p)=>os(d,p)},a=new c2.GraphModel(E0[o].url,A),l=!1;try{a.findIOHandler(),O0.debug&&u("model load handler:",a.handler)}catch(d){u("error finding model i/o handler:",t,d)}try{let d=await((c=a.handler)==null?void 0:c.load())||null;E0[o].sizeFromManifest=((x=d==null?void 0:d.weightData)==null?void 0:x.byteLength)||0,d?a.loadSync(d):a=await c2.loadGraphModel(E0[o].inCache?r:t,A),E0[o].sizeLoadedWeights=((y=(i=a.artifacts)==null?void 0:i.weightData)==null?void 0:y.byteLength)||0,O0.verbose&&u("load:",{model:o,url:a.modelUrl,bytes:E0[o].sizeLoadedWeights}),l=!0}catch(d){u("error loading model:",t,d)}if(l&&O0.cacheModels&&O0.cacheSupported&&!E0[o].inCache)try{let d=await a.save(r);O0.debug&&u("model saved:",r,d)}catch(d){u("error saving model:",t,d)}return a}var Kt="3.0.0";var E=V(H());var m0=V(H());var n0={name:"humangl",priority:999,canvas:null,gl:null,extensions:[],webGLattr:{alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!1,desynchronized:!0}};function As(){let e=n0.gl;!e||(n0.extensions=e.getSupportedExtensions())}function W1(e){var t;if(e.config.backend==="humangl"&&(n0.name in m0.engine().registry&&!((t=n0==null?void 0:n0.gl)!=null&&t.getParameter(n0.gl.VERSION))&&(u("humangl error: backend invalid context"),e.models.reset()),!m0.findBackend(n0.name))){try{n0.canvas=ee(100,100)}catch(r){u("humangl error: cannot create canvas:",r);return}try{if(n0.gl=n0.canvas.getContext("webgl2",n0.webGLattr),!n0.gl){u("humangl error: cannot get webgl context");return}if(!n0.gl.getParameter(n0.gl.VERSION).includes("2.0")){u("backend override: using fallback webgl backend as webgl 2.0 is not detected"),e.config.backend="webgl";return}n0.canvas&&(n0.canvas.addEventListener("webglcontextlost",s=>{throw u("humangl error:",s.type),u("possible browser memory leak using webgl or conflict with multiple backend registrations"),e.emit("error"),new Error("backend error: webgl context lost")}),n0.canvas.addEventListener("webglcontextrestored",s=>{u("humangl error: context restored:",s)}),n0.canvas.addEventListener("webglcontextcreationerror",s=>{u("humangl error: context create:",s)}))}catch(r){u("humangl error: cannot get webgl context:",r);return}try{m0.setWebGLContext(2,n0.gl)}catch(r){u("humangl error: cannot set webgl context:",r);return}try{let r=new m0.GPGPUContext(n0.gl);m0.registerBackend(n0.name,()=>new m0.MathBackendWebGL(r),n0.priority)}catch(r){u("humangl error: cannot register webgl backend:",r);return}try{m0.getKernelsForBackend("webgl").forEach(s=>{let A={...s,backendName:n0.name};m0.registerKernel(A)})}catch(r){u("humangl error: cannot update webgl backend registration:",r);return}try{m0.env().flagRegistry.WEBGL_VERSION&&m0.env().set("WEBGL_VERSION",2)}catch(r){u("humangl error: cannot set WebGL backend flags:",r);return}As();let n=m0.backend(),o=typeof n.gpgpu!="undefined"?n.getGPGPUContext().gl:null;o?e.config.debug&&u("humangl backend registered:",{webgl:o.getParameter(o.VERSION),renderer:o.getParameter(o.RENDERER)}):u("humangl error: no current gl context:",o,n0.gl)}}var Ee=V(H()),C={tf255:255,tf1:1,tf2:2,tf05:.5,tf127:127.5,rgb:[.2989,.587,.114]};function D1(){C.tf255=Ee.scalar(255,"float32"),C.tf1=Ee.scalar(1,"float32"),C.tf2=Ee.scalar(2,"float32"),C.tf05=Ee.scalar(.5,"float32"),C.tf127=Ee.scalar(127.5,"float32"),C.rgb=Ee.tensor1d([.2989,.587,.114],"float32")}async function ls(){return await v.updateBackend(),v.browser?v.webgpu.supported&&v.webgpu.backend?"webgpu":v.webgl.supported&&v.webgl.backend?"webgl":v.wasm.supported&&v.wasm.backend?"wasm":"cpu":"tensorflow"}function cs(e){let t=[];if(!v.kernels.includes("mod")){let n={kernelName:"Mod",backendName:E.getBackend(),kernelFunc:o=>E.tidy(()=>E.sub(o.inputs.a,E.mul(E.div(o.inputs.a,o.inputs.b),o.inputs.b)))};E.registerKernel(n),v.kernels.push("mod"),t.push("mod")}if(!v.kernels.includes("floormod")){let n={kernelName:"FloorMod",backendName:E.getBackend(),kernelFunc:o=>E.tidy(()=>E.add(E.mul(E.floorDiv(o.inputs.a,o.inputs.b),o.inputs.b),E.mod(o.inputs.a,o.inputs.b)))};E.registerKernel(n),v.kernels.push("floormod"),t.push("floormod")}if(!v.kernels.includes("rotatewithoffset")&&e.softwareKernels){let n={kernelName:"RotateWithOffset",backendName:E.getBackend(),kernelFunc:o=>E.tidy(()=>{let r=E.getBackend();E.setBackend("cpu");let s=E.image.rotateWithOffset(o.inputs.image,o.attrs.radians,o.attrs.fillValue,o.attrs.center);return E.setBackend(r),s})};E.registerKernel(n),v.kernels.push("rotatewithoffset"),t.push("rotatewithoffset")}t.length>0&&e.debug&&u("registered kernels:",t)}var F1={};async function E2(e,t=!1){var n;if(e.state="backend",((n=e.config.backend)==null?void 0:n.length)===0&&(e.config.backend=await ls()),t||v.initial||e.config.backend&&e.config.backend.length>0&&E.getBackend()!==e.config.backend){let o=g();if(e.config.backend&&e.config.backend.length>0){if(typeof window=="undefined"&&typeof WorkerGlobalScope!="undefined"&&e.config.debug&&e.config.debug&&u("running inside web worker"),v.browser&&e.config.backend==="tensorflow"&&(e.config.debug&&u("override: backend set to tensorflow while running in browser"),e.config.backend="webgl"),v.node&&(e.config.backend==="webgl"||e.config.backend==="humangl")&&(e.config.debug&&u(`override: backend set to ${e.config.backend} while running in nodejs`),e.config.backend="tensorflow"),v.browser&&e.config.backend==="webgpu")if(typeof navigator=="undefined"||typeof navigator.gpu=="undefined")u("override: backend set to webgpu but browser does not support webgpu"),e.config.backend="webgl";else{let s=await navigator.gpu.requestAdapter();if(e.config.debug&&u("enumerated webgpu adapter:",s),!s)u("override: backend set to webgpu but browser reports no available gpu"),e.config.backend="webgl";else{let A="requestAdapterInfo"in s?await s.requestAdapterInfo():void 0;u("webgpu adapter info:",A)}}let r=Object.keys(E.engine().registryFactory);if(e.config.backend==="humangl"&&!r.includes("humangl")&&(W1(e),r=Object.keys(E.engine().registryFactory)),e.config.debug&&u("available backends:",r),r.includes(e.config.backend)||(u(`error: backend ${e.config.backend} not found in registry`),e.config.backend=v.node?"tensorflow":"webgl",e.config.debug&&u(`override: setting backend ${e.config.backend}`)),e.config.debug&&u("setting backend:",[e.config.backend]),e.config.backend==="wasm"){if(E.env().flagRegistry.CANVAS2D_WILL_READ_FREQUENTLY&&E.env().set("CANVAS2D_WILL_READ_FREQUENTLY",!0),e.config.debug&&u("wasm path:",e.config.wasmPath),typeof E.setWasmPaths!="undefined")E.setWasmPaths(e.config.wasmPath,e.config.wasmPlatformFetch);else throw new Error("backend error: attempting to use wasm backend but wasm path is not set");let s=!1,A=!1;try{s=await E.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT"),A=await E.env().getAsync("WASM_HAS_SIMD_SUPPORT"),e.config.debug&&u(`wasm execution: ${A?"simd":"no simd"} ${s?"multithreaded":"singlethreaded"}`),e.config.debug&&!A&&u("warning: wasm simd support is not enabled")}catch(a){u("wasm detection failed")}}try{await E.setBackend(e.config.backend),await E.ready()}catch(s){return u("error: cannot set backend:",e.config.backend,s),!1}e.config.debug&&(F1=JSON.parse(JSON.stringify(E.env().flags)))}if((E.getBackend()==="humangl"||E.getBackend()==="webgl")&&(E.env().flagRegistry.WEBGL_USE_SHAPES_UNIFORMS&&E.env().set("WEBGL_USE_SHAPES_UNIFORMS",!0),E.env().flagRegistry.WEBGL_EXP_CONV&&E.env().set("WEBGL_EXP_CONV",!0),e.config.debug&&typeof e.config.deallocate!="undefined"&&e.config.deallocate&&(u("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",!0),E.env().set("WEBGL_DELETE_TEXTURE_THRESHOLD",0))),E.getBackend(),e.config.debug){let r=E.env().flags,s={};for(let A of Object.keys(r))F1[A]!==r[A]&&(s[A]=r[A]);e.config.debug&&Object.keys(s).length>0&&u("backend:",E.getBackend(),"flags:",s)}if(e.config.flags&&Object.keys(e.config.flags).length>0){e.config.debug&&u("flags:",e.config.flags);for(let[r,s]of Object.entries(e.config.flags))E.env().set(r,s)}E.enableProdMode(),D1(),e.performance.initBackend=Math.trunc(g()-o),e.config.backend=E.getBackend(),await v.updateBackend(),cs(e.config),v.initial=!1}return!0}function X2(e,t){for(let n of e){let o={kernelName:n,backendName:t.backend,kernelFunc:r=>{var s;return t.debug&&u("kernelFunc",n,t.backend,r),(s=r==null?void 0:r.inputs)==null?void 0:s.info}};E.registerKernel(o)}v.kernels=E.getKernelsForBackend(E.getBackend()).map(n=>n.kernelName.toLowerCase())}var Q2={};we(Q2,{all:()=>Hs,body:()=>U2,canvas:()=>Bs,face:()=>q2,gesture:()=>J2,hand:()=>Y2,init:()=>n5,object:()=>K2,options:()=>d0,person:()=>Fs});var J0=e=>{if(!e)u("draw error: invalid canvas");else if(!e.getContext)u("draw error: canvas context not defined");else{let t=e.getContext("2d");if(!t)u("draw error: cannot get canvas context");else return t}return null},Ue=e=>Math.round(e*180/Math.PI),_=(e,t,n)=>e.replace(t,typeof n=="number"?n.toFixed(1):n),Ye=(e,t)=>{if(!t.useDepth||typeof e=="undefined")return t.color;let n=Uint8ClampedArray.from([127+2*e,127-2*e,255]);return`rgba(${n[0]}, ${n[1]}, ${n[2]}, ${t.alpha})`};function te(e,t,n,o,r){let s=t.replace(/\[.*\]/g,"").split(` +`).map(a=>a.trim()),A=Math.max(0,n);for(let a=s.length-1;a>=0;a--){let l=a*r.lineHeight+o;r.shadowColor&&r.shadowColor!==""&&(e.fillStyle=r.shadowColor,e.fillText(s[a],A+5,l+16)),e.fillStyle=r.labelColor,e.fillText(s[a],A+4,l+15)}}function be(e,t,n,o,r){e.fillStyle=Ye(o,r),e.beginPath(),e.arc(t,n,r.pointSize,0,2*Math.PI),e.fill()}function me(e,t,n,o,r,s){if(e.beginPath(),e.lineWidth=s.lineWidth,s.useCurves){let A=(t+t+o)/2,a=(n+n+r)/2;e.ellipse(A,a,o/2,r/2,0,0,2*Math.PI)}else e.moveTo(t+s.roundRect,n),e.lineTo(t+o-s.roundRect,n),e.quadraticCurveTo(t+o,n,t+o,n+s.roundRect),e.lineTo(t+o,n+r-s.roundRect),e.quadraticCurveTo(t+o,n+r,t+o-s.roundRect,n+r),e.lineTo(t+s.roundRect,n+r),e.quadraticCurveTo(t,n+r,t,n+r-s.roundRect),e.lineTo(t,n+s.roundRect),e.quadraticCurveTo(t,n,t+s.roundRect,n),e.closePath();e.stroke()}function Jt(e,t,n){if(!(t.length<2)){e.beginPath(),e.moveTo(t[0][0],t[0][1]);for(let o of t)e.strokeStyle=Ye(o[2]||0,n),e.lineTo(Math.trunc(o[0]),Math.trunc(o[1]));e.stroke(),n.fillPolygons&&(e.closePath(),e.fill())}}function H1(e,t,n){if(!(t.length<2)){if(e.lineWidth=n.lineWidth,!n.useCurves||t.length<=2){Jt(e,t,n);return}e.moveTo(t[0][0],t[0][1]);for(let o=0;oz2[e]),L4=xs.map(e=>z2[e]),C4=ys.map(e=>z2[e]);function ze(e){let t=e.map(n=>n[0]);return t.push(e[e.length-1][1]),t}var fs=[[61,146],[146,91],[91,181],[181,84],[84,17],[17,314],[314,405],[405,321],[321,375],[375,291],[61,185],[185,40],[40,39],[39,37],[37,0],[0,267],[267,269],[269,270],[270,409],[409,291],[78,95],[95,88],[88,178],[178,87],[87,14],[14,317],[317,402],[402,318],[318,324],[324,308],[78,191],[191,80],[80,81],[81,82],[82,13],[13,312],[312,311],[311,310],[310,415],[415,308]],ms=[[263,249],[249,390],[390,373],[373,374],[374,380],[380,381],[381,382],[382,362],[263,466],[466,388],[388,387],[387,386],[386,385],[385,384],[384,398],[398,362]],ps=[[276,283],[283,282],[282,295],[295,285],[300,293],[293,334],[334,296],[296,336]],us=[[474,475],[475,476],[476,477],[477,474]],hs=[[33,7],[7,163],[163,144],[144,145],[145,153],[153,154],[154,155],[155,133],[33,246],[246,161],[161,160],[160,159],[159,158],[158,157],[157,173],[173,133]],bs=[[46,53],[53,52],[52,65],[65,55],[70,63],[63,105],[105,66],[66,107]],gs=[[469,470],[470,471],[471,472],[472,469]],Ts=[[10,338],[338,297],[297,332],[332,284],[284,251],[251,389],[389,356],[356,454],[454,323],[323,361],[361,288],[288,397],[397,365],[365,379],[379,378],[378,400],[400,377],[377,152],[152,148],[148,176],[176,149],[149,150],[150,136],[136,172],[172,58],[58,132],[132,93],[93,234],[234,127],[127,162],[162,21],[21,54],[54,103],[103,67],[67,109],[109,10]],W4={lips:ze(fs),leftEye:ze(ms),leftEyebrow:ze(ps),leftIris:ze(us),rightEye:ze(hs),rightEyebrow:ze(bs),rightIris:ze(gs),faceOval:ze(Ts)};var vs=[[61,146],[146,91],[91,181],[181,84],[84,17],[17,314],[314,405],[405,321],[321,375],[375,291],[61,185],[185,40],[40,39],[39,37],[37,0],[0,267],[267,269],[269,270],[270,409],[409,291],[78,95],[95,88],[88,178],[178,87],[87,14],[14,317],[317,402],[402,318],[318,324],[324,308],[78,191],[191,80],[80,81],[81,82],[82,13],[13,312],[312,311],[311,310],[310,415],[415,308]],Rs=[[263,249],[249,390],[390,373],[373,374],[374,380],[380,381],[381,382],[382,362],[263,466],[466,388],[388,387],[387,386],[386,385],[385,384],[384,398],[398,362]],Ms=[[276,283],[283,282],[282,295],[295,285],[300,293],[293,334],[334,296],[296,336]],Ps=[[474,475],[475,476],[476,477],[477,474]],ks=[[33,7],[7,163],[163,144],[144,145],[145,153],[153,154],[154,155],[155,133],[33,246],[246,161],[161,160],[160,159],[159,158],[158,157],[157,173],[173,133]],ws=[[46,53],[53,52],[52,65],[65,55],[70,63],[63,105],[105,66],[66,107]],Es=[[469,470],[470,471],[471,472],[472,469]],zs=[[10,338],[338,297],[297,332],[332,284],[284,251],[251,389],[389,356],[356,454],[454,323],[323,361],[361,288],[288,397],[397,365],[365,379],[379,378],[378,400],[400,377],[377,152],[152,148],[148,176],[176,149],[149,150],[150,136],[136,172],[172,58],[58,132],[132,93],[93,234],[234,127],[127,162],[162,21],[21,54],[54,103],[103,67],[67,109],[109,10]];function Se(e){let t=e.map(n=>n[0]);return t.push(e[e.length-1][1]),t}var Ss={lips:Se(vs),leftEye:Se(Rs),leftEyebrow:Se(Ms),leftIris:Se(Ps),rightEye:Se(ks),rightEyebrow:Se(ws),rightIris:Se(Es),faceOval:Se(zs)},js=Object.entries(Ss).map(([e,t])=>t.map(n=>[n,e])).flat(),D4=new Map(js),S2=[61,146,91,181,84,17,314,405,321,375,291,185,40,39,37,0,267,269,270,409,78,95,88,178,87,14,317,402,318,324,308,191,80,81,82,13,312,311,310,415,76,77,90,180,85,16,315,404,320,307,306,184,74,73,72,11,302,303,304,408,62,96,89,179,86,15,316,403,319,325,292,183,42,41,38,12,268,271,272,407],Qe=[33,7,163,144,145,153,154,155,133,246,161,160,159,158,157,173,130,25,110,24,23,22,26,112,243,247,30,29,27,28,56,190,226,31,228,229,230,231,232,233,244,113,225,224,223,222,221,189,35,124,46,53,52,65,143,111,117,118,119,120,121,128,245,156,70,63,105,66,107,55,193],_e=[263,249,390,373,374,380,381,382,362,466,388,387,386,385,384,398,359,255,339,254,253,252,256,341,463,467,260,259,257,258,286,414,446,261,448,449,450,451,452,453,464,342,445,444,443,442,441,413,265,353,276,283,282,295,372,340,346,347,348,349,350,357,465,383,300,293,334,296,336,285,417];var K;function Ns(e,t){var o,r,s,A,a,l,c,x,i;if(!K.drawLabels||((o=K.faceLabels)==null?void 0:o.length)===0)return;let n=K.faceLabels.slice();if(e.score&&(n=_(n,"[score]",100*e.score)),e.gender&&(n=_(n,"[gender]",e.gender)),e.genderScore&&(n=_(n,"[genderScore]",100*e.genderScore)),e.age&&(n=_(n,"[age]",e.age)),e.distance&&(n=_(n,"[distance]",100*e.distance)),e.real&&(n=_(n,"[real]",100*e.real)),e.live&&(n=_(n,"[live]",100*e.live)),e.emotion&&e.emotion.length>0){let y=e.emotion.map(d=>`${Math.trunc(100*d.score)}% ${d.emotion}`);y.length>3&&(y.length=3),n=_(n,"[emotions]",y.join(" "))}(s=(r=e.rotation)==null?void 0:r.angle)!=null&&s.roll&&(n=_(n,"[roll]",Ue(e.rotation.angle.roll))),(a=(A=e.rotation)==null?void 0:A.angle)!=null&&a.yaw&&(n=_(n,"[yaw]",Ue(e.rotation.angle.yaw))),(c=(l=e.rotation)==null?void 0:l.angle)!=null&&c.pitch&&(n=_(n,"[pitch]",Ue(e.rotation.angle.pitch))),(i=(x=e.rotation)==null?void 0:x.gaze)!=null&&i.bearing&&(n=_(n,"[gaze]",Ue(e.rotation.gaze.bearing))),te(t,n,e.box[0],e.box[1],K)}function Is(e,t){var n,o,r,s;if(((n=e.annotations)==null?void 0:n.leftEyeIris)&&((o=e.annotations)==null?void 0:o.leftEyeIris[0])){t.strokeStyle=K.useDepth?"rgba(255, 200, 255, 0.3)":K.color,t.beginPath();let A=Math.abs(e.annotations.leftEyeIris[3][0]-e.annotations.leftEyeIris[1][0])/2,a=Math.abs(e.annotations.leftEyeIris[4][1]-e.annotations.leftEyeIris[2][1])/2;t.ellipse(e.annotations.leftEyeIris[0][0],e.annotations.leftEyeIris[0][1],A,a,0,0,2*Math.PI),t.stroke(),K.fillPolygons&&(t.fillStyle=K.useDepth?"rgba(255, 255, 200, 0.3)":K.color,t.fill())}if(((r=e.annotations)==null?void 0:r.rightEyeIris)&&((s=e.annotations)==null?void 0:s.rightEyeIris[0])){t.strokeStyle=K.useDepth?"rgba(255, 200, 255, 0.3)":K.color,t.beginPath();let A=Math.abs(e.annotations.rightEyeIris[3][0]-e.annotations.rightEyeIris[1][0])/2,a=Math.abs(e.annotations.rightEyeIris[4][1]-e.annotations.rightEyeIris[2][1])/2;t.ellipse(e.annotations.rightEyeIris[0][0],e.annotations.rightEyeIris[0][1],A,a,0,0,2*Math.PI),t.stroke(),K.fillPolygons&&(t.fillStyle=K.useDepth?"rgba(255, 255, 200, 0.3)":K.color,t.fill())}}function Os(e,t){var n;if(K.drawGaze&&((n=e.rotation)==null?void 0:n.angle)&&typeof Path2D!="undefined"){t.strokeStyle="pink";let o=e.box[0]+e.box[2]/2-e.box[3]*Ue(e.rotation.angle.yaw)/90,r=e.box[1]+e.box[3]/2+e.box[2]*Ue(e.rotation.angle.pitch)/90,s=new Path2D(` + M ${e.box[0]+e.box[2]/2} ${e.box[1]} + C + ${o} ${e.box[1]}, + ${o} ${e.box[1]+e.box[3]}, + ${e.box[0]+e.box[2]/2} ${e.box[1]+e.box[3]} + `),A=new Path2D(` + M ${e.box[0]} ${e.box[1]+e.box[3]/2} + C + ${e.box[0]} ${r}, + ${e.box[0]+e.box[2]} ${r}, + ${e.box[0]+e.box[2]} ${e.box[1]+e.box[3]/2} + `);t.stroke(A),t.stroke(s)}}function Ls(e,t){var n;if(K.drawGaze&&((n=e.rotation)==null?void 0:n.gaze.strength)&&e.rotation.gaze.bearing&&e.annotations.leftEyeIris&&e.annotations.rightEyeIris&&e.annotations.leftEyeIris[0]&&e.annotations.rightEyeIris[0]){t.strokeStyle="pink",t.fillStyle="pink";let o=[e.annotations.leftEyeIris[0][0]+Math.sin(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[3],e.annotations.leftEyeIris[0][1]+Math.cos(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[2]];Qt(t,[e.annotations.leftEyeIris[0][0],e.annotations.leftEyeIris[0][1]],[o[0],o[1]],4);let r=[e.annotations.rightEyeIris[0][0]+Math.sin(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[3],e.annotations.rightEyeIris[0][1]+Math.cos(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[2]];Qt(t,[e.annotations.rightEyeIris[0][0],e.annotations.rightEyeIris[0][1]],[r[0],r[1]],4)}}function Cs(e,t){if(K.drawPolygons&&e.mesh.length>=468){t.lineWidth=1;for(let n=0;ne.mesh[r]);Jt(t,o,K)}Is(e,t)}}function Ws(e,t){if(K.drawPoints&&e.mesh.length>=468)for(let n=0;n0&&(Ws(r,o),Cs(r,o),Os(r,o),Ls(r,o))}}function U2(e,t,n){var s,A;let o=A0(d0,n);if(!t||!e)return;let r=J0(e);if(!!r){r.lineJoin="round";for(let a=0;a0)){let l=o.bodyLabels.slice();l=_(l,"[score]",100*t[a].score),te(r,l,t[a].box[0],t[a].box[1],o)}if(o.drawPoints&&t[a].keypoints)for(let l=0;l0&&t[a].keypoints){r.font=o.font;for(let l of t[a].keypoints){if(!l.score||l.score===0)continue;let c=o.bodyPartLabels.slice();c=_(c,"[label]",l.part),c=_(c,"[score]",100*l.score),te(r,c,l.position[0],l.position[1],o)}}if(o.drawPolygons&&t[a].keypoints&&t[a].annotations)for(let l of Object.values(t[a].annotations))for(let c of l)H1(r,c,o)}}}function Y2(e,t,n){var s,A;let o=A0(d0,n);if(!t||!e)return;let r=J0(e);if(!!r){r.lineJoin="round",r.font=o.font;for(let a of t){if(o.drawBoxes){if(r.strokeStyle=o.color,r.fillStyle=o.color,me(r,a.box[0],a.box[1],a.box[2],a.box[3],o),o.drawLabels&&((s=o.handLabels)==null?void 0:s.length)>0){let l=o.handLabels.slice();l=_(l,"[label]",a.label),l=_(l,"[score]",100*a.score),te(r,l,a.box[0],a.box[1],o)}r.stroke()}if(o.drawPoints&&a.keypoints&&a.keypoints.length>0)for(let l of a.keypoints)r.fillStyle=Ye(l[2],o),be(r,l[0],l[1],0,o);if(o.drawLabels&&a.annotations&&((A=o.fingerLabels)==null?void 0:A.length)>0)for(let[l,c]of Object.entries(a.annotations)){let x=o.fingerLabels.slice();x=_(x,"[label]",l),te(r,x,c[c.length-1][0],c[c.length-1][1],o)}if(o.drawPolygons&&a.annotations){let l=c=>{if(!(!c||c.length===0||!c[0]))for(let x=0;x0?x-1:0][0],c[x>0?x-1:0][1]),r.lineTo(c[x][0],c[x][1]),r.stroke()}};r.lineWidth=o.lineWidth,l(a.annotations.index),l(a.annotations.middle),l(a.annotations.ring),l(a.annotations.pinky),l(a.annotations.thumb)}}}}function K2(e,t,n){var s;let o=A0(d0,n);if(!t||!e)return;let r=J0(e);if(!!r){r.lineJoin="round",r.font=o.font;for(let A of t)if(o.drawBoxes){if(r.strokeStyle=o.color,r.fillStyle=o.color,me(r,A.box[0],A.box[1],A.box[2],A.box[3],o),o.drawLabels&&((s=o.objectLabels)==null?void 0:s.length)>0){let a=o.objectLabels.slice();a=_(a,"[label]",A.label),a=_(a,"[score]",100*A.score),te(r,a,A.box[0],A.box[1],o)}r.stroke()}}}function J2(e,t,n){var r;let o=A0(d0,n);if(!(!t||!e)&&o.drawGestures&&((r=o.gestureLabels)==null?void 0:r.length)>0){let s=J0(e);if(!s)return;s.font=o.font,s.fillStyle=o.color;let A=1;for(let a=0;a1&&c[1].length>0){let x=l[1]>0?`#${l[1]}`:"",i=o.gestureLabels.slice();i=_(i,"[where]",l[0]),i=_(i,"[who]",x),i=_(i,"[what]",c[1]),te(s,i,8,2+A*o.lineHeight,o),A+=1}}}}var je={face:`face + confidence: [score]% + [gender] [genderScore]% + age: [age] years + distance: [distance]cm + real: [real]% + live: [live]% + [emotions] + roll: [roll]\xB0 yaw:[yaw]\xB0 pitch:[pitch]\xB0 + gaze: [gaze]\xB0`,body:"body [score]%",bodyPart:"[label] [score]%",object:"[label] [score]%",hand:"[label] [score]%",finger:"[label]",gesture:"[where] [who]: [what]"};var t5=0;function Fs(e,t,n){let o=A0(d0,n);if(!t||!e)return;let r=J0(e);if(!!r){r.lineJoin="round",r.font=o.font;for(let s=0;sr5,kpt:()=>o5});var o5=["nose","leftEyeInside","leftEye","leftEyeOutside","rightEyeInside","rightEye","rightEyeOutside","leftEar","rightEar","leftMouth","rightMouth","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftPinky","rightPinky","leftIndex","rightIndex","leftThumb","rightThumb","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle","leftHeel","rightHeel","leftFoot","rightFoot","bodyCenter","bodyTop","leftPalm","leftHand","rightPalm","rightHand"],r5={shoulders:["leftShoulder","rightShoulder"],hips:["rightHip","leftHip"],mouth:["leftMouth","rightMouth"],leftLegUpper:["leftHip","leftKnee"],leftLegLower:["leftKnee","leftAnkle"],leftFoot:["leftAnkle","leftHeel","leftFoot"],leftTorso:["leftShoulder","leftHip"],leftArmUpper:["leftShoulder","leftElbow"],leftArmLower:["leftElbow","leftWrist"],leftHand:["leftWrist","leftPalm"],leftHandPinky:["leftPalm","leftPinky"],leftHandIndex:["leftPalm","leftIndex"],leftHandThumb:["leftPalm","leftThumb"],leftEyeOutline:["leftEyeInside","leftEyeOutside"],rightLegUpper:["rightHip","rightKnee"],rightLegLower:["rightKnee","rightAnkle"],rightFoot:["rightAnkle","rightHeel","rightFoot"],rightTorso:["rightShoulder","rightHip"],rightArmUpper:["rightShoulder","rightElbow"],rightArmLower:["rightElbow","rightWrist"],rightHand:["rightWrist","rightPalm"],rightHandPinky:["rightPalm","rightPinky"],rightHandIndex:["rightPalm","rightIndex"],rightHandThumb:["rightPalm","rightThumb"],rightEyeOutline:["rightEyeInside","rightEyeOutside"]};var D=V(H());var Q0,$e=224,Z1,Gs=5,$2=[8,16,32,32,32];function Vs(){let e=[],t=0;for(;tn.x)),y:D.tensor1d(e.map(n=>n.y))}}async function X1(e){if(v.initial&&(Q0=null),!Q0&&e.body.detector&&e.body.detector.modelPath){Q0=await O(e.body.detector.modelPath);let t=Q0!=null&&Q0.executor?Object.values(Q0.modelSignature.inputs):void 0;$e=Array.isArray(t)?parseInt(t[0].tensorShape.dim[1].size):0}else e.debug&&Q0&&u("cached model:",Q0.modelUrl);return Vs(),Q0}var V1=[5,5];function Zs(e,t){return D.tidy(()=>{let n=D.split(e,12,1),o=D.squeeze(n[0]),r=D.squeeze(n[1]),s=D.squeeze(n[2]),A=D.squeeze(n[3]);o=D.add(D.div(o,$e),t.x),r=D.add(D.div(r,$e),t.y),s=D.mul(D.div(s,$e),V1[0]),A=D.mul(D.div(A,$e),V1[1]);let a=D.sub(o,D.div(s,2)),l=D.sub(r,D.div(A,2)),c=D.add(a,s),x=D.add(l,A);return D.stack([a,l,c,x],1)})}async function Xs(e,t,n,o){var c,x;let r=[],s={};s.boxes=Zs(e,Z1),s.scores=D.sigmoid(t),s.nms=await D.image.nonMaxSuppressionAsync(s.boxes,s.scores,1,((c=n.body.detector)==null?void 0:c.minConfidence)||.1,((x=n.body.detector)==null?void 0:x.iouThreshold)||.1);let A=await s.nms.data(),a=await s.scores.data(),l=await s.boxes.array();for(let i of Array.from(A)){let y=a[i],d=l[i],p=[Math.round(d[0]*o[0]),Math.round(d[1]*o[1]),Math.round(d[2]*o[0]),Math.round(d[3]*o[1])],f={score:y,boxRaw:d,box:p};r.push(f)}return Object.keys(s).forEach(i=>D.dispose(s[i])),r}async function q1(e,t,n){let o={};o.res=Q0==null?void 0:Q0.execute(e,["Identity"]),o.logitsRaw=D.slice(o.res,[0,0,0],[1,-1,1]),o.boxesRaw=D.slice(o.res,[0,0,1],[1,-1,-1]),o.logits=D.squeeze(o.logitsRaw),o.boxes=D.squeeze(o.boxesRaw);let r=await Xs(o.boxes,o.logits,t,n);return Object.keys(o).forEach(s=>D.dispose(o[s])),r}function ge(e,t=[1,1]){let n=[e.map(a=>a[0]),e.map(a=>a[1])],o=[Math.min(...n[0]),Math.min(...n[1])],r=[Math.max(...n[0]),Math.max(...n[1])],s=[o[0],o[1],r[0]-o[0],r[1]-o[1]],A=[s[0]/t[0],s[1]/t[1],s[2]/t[0],s[3]/t[1]];return{box:s,boxRaw:A}}function U1(e,t=[1,1]){let n=[e.map(c=>c[0]),e.map(c=>c[1])],o=[Math.min(...n[0]),Math.min(...n[1])],r=[Math.max(...n[0]),Math.max(...n[1])],s=[(o[0]+r[0])/2,(o[1]+r[1])/2],A=Math.max(s[0]-o[0],s[1]-o[1],-s[0]+r[0],-s[1]+r[1]),a=[Math.trunc(s[0]-A),Math.trunc(s[1]-A),Math.trunc(2*A),Math.trunc(2*A)],l=[a[0]/t[0],a[1]/t[1],a[2]/t[0],a[3]/t[1]];return{box:a,boxRaw:l}}function et(e,t){let n=[e[2]*t,e[3]*t];return[e[0]-(n[0]-e[2])/2,e[1]-(n[1]-e[3])/2,n[0],n[1]]}var F0,A5=256,s5=Number.MAX_SAFE_INTEGER,qs={landmarks:["ld_3d","activation_segmentation","activation_heatmap","world_3d","output_poseflag"],detector:[]},nt=[],Ne=[[0,0],[0,0],[0,0],[0,0]],Y1=0,K1=e=>1-1/(1+Math.exp(e)),Q1=e=>X1(e);async function _1(e){if(v.initial&&(F0=null),F0)e.debug&&u("cached model:",F0.modelUrl);else{F0=await O(e.body.modelPath);let t=F0!=null&&F0.executor?Object.values(F0.modelSignature.inputs):void 0;A5=Array.isArray(t)?parseInt(t[0].tensorShape.dim[1].size):0}return F0}function J1(e,t,n){var s,A;let o={};if(!((s=e==null?void 0:e.shape)!=null&&s[1])||!((A=e==null?void 0:e.shape)!=null&&A[2]))return e;let r;if(n&&(o.cropped=B0.image.cropAndResize(e,[n],[0],[e.shape[1],e.shape[2]])),e.shape[1]!==e.shape[2]){let a=[e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0,e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0],l=[e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0,e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0];Ne=[[0,0],a,l,[0,0]],o.pad=B0.pad(o.cropped||e,Ne),o.resize=B0.image.resizeBilinear(o.pad,[t,t]),r=B0.div(o.resize,C.tf255)}else e.shape[1]!==t?(o.resize=B0.image.resizeBilinear(o.cropped||e,[t,t]),r=B0.div(o.resize,C.tf255)):r=B0.div(o.cropped||e,C.tf255);return Object.keys(o).forEach(a=>B0.dispose(o[a])),r}function Us(e,t,n){for(let o of e)o.position=[Math.trunc(o.position[0]*(t[0]+Ne[2][0]+Ne[2][1])/t[0]-Ne[2][0]),Math.trunc(o.position[1]*(t[1]+Ne[1][0]+Ne[1][1])/t[1]-Ne[1][0]),o.position[2]],o.positionRaw=[o.position[0]/t[0],o.position[1]/t[1],2*o.position[2]/(t[0]+t[1])];if(n){let o=n[2]-n[0],r=n[3]-n[1];for(let s of e)s.positionRaw=[s.positionRaw[0]/r+n[1],s.positionRaw[1]/o+n[0],s.positionRaw[2]],s.position=[Math.trunc(s.positionRaw[0]*t[0]),Math.trunc(s.positionRaw[1]*t[1]),s.positionRaw[2]]}return e}function Ys(e){let t=e.find(a=>a.part==="leftPalm"),n=e.find(a=>a.part==="leftWrist"),o=e.find(a=>a.part==="leftIndex");t.position[2]=((n.position[2]||0)+(o.position[2]||0))/2;let r=e.find(a=>a.part==="rightPalm"),s=e.find(a=>a.part==="rightWrist"),A=e.find(a=>a.part==="rightIndex");r.position[2]=((s.position[2]||0)+(A.position[2]||0))/2}async function Ks(e,t,n){if(!(F0!=null&&F0.executor))return null;let o={};[o.ld,o.segmentation,o.heatmap,o.world,o.poseflag]=F0==null?void 0:F0.execute(e,qs.landmarks);let r=(await o.poseflag.data())[0],s=await o.ld.data(),A=await o.world.data();Object.keys(o).forEach(p=>B0.dispose(o[p]));let a=[],l=5;for(let p=0;pp.position),i=ge(x,[n[0],n[1]]),y={};for(let[p,f]of Object.entries(r5)){let b=[];for(let M=0;Mh.part===f[M]),m=c.find(h=>h.part===f[M+1]);T&&m&&b.push([T.position,m.position])}y[p]=b}return{id:0,score:Math.trunc(100*r)/100,box:i.box,boxRaw:i.boxRaw,keypoints:c,annotations:y}}async function a5(e,t){var s,A,a;let n=[e.shape[2]||0,e.shape[1]||0],o=(t.body.skipTime||0)>g()-Y1,r=s5<(t.body.skipFrames||0);if(t.skipAllowed&&o&&r&&nt!==null)s5++;else{let l=[];if((A=(s=t.body)==null?void 0:s.detector)!=null&&A.enabled){let c=J1(e,224);l=await q1(c,t,n),B0.dispose(c)}else l=[{box:[0,0,0,0],boxRaw:[0,0,1,1],score:0}];for(let c=0;cL0.dispose(o[c])),r}async function c5(e,t){if(!(H0!=null&&H0.executor))return[];let n=(t.object.skipTime||0)>g()-e3,o=l5<(t.object.skipFrames||0);return t.skipAllowed&&n&&o&&i5.length>0?(l5++,i5):(l5=0,new Promise(async r=>{let s=[e.shape[2]||0,e.shape[1]||0],A=L0.image.resizeBilinear(e,[e2,e2]),a=t.object.enabled?H0==null?void 0:H0.execute(A,["tower_0/detections"]):null;e3=g(),L0.dispose(A);let l=await Js(a,s,t);i5=l,r(l)}))}var J=V(H());var ot={};we(ot,{connected:()=>x5,kpt:()=>d5});var d5=["head","neck","rightShoulder","rightElbow","rightWrist","chest","leftShoulder","leftElbow","leftWrist","bodyCenter","rightHip","rightKnee","rightAnkle","leftHip","leftKnee","leftAnkle"],x5={leftLeg:["leftHip","leftKnee","leftAnkle"],rightLeg:["rightHip","rightKnee","rightAnkle"],torso:["leftShoulder","rightShoulder","rightHip","leftHip","leftShoulder"],leftArm:["leftShoulder","leftElbow","leftWrist"],rightArm:["rightShoulder","rightElbow","rightWrist"],head:[]};var a0,o3=0,C0={id:0,keypoints:[],box:[0,0,0,0],boxRaw:[0,0,0,0],score:0,annotations:{}},y5=Number.MAX_SAFE_INTEGER;async function r3(e){return v.initial&&(a0=null),a0?e.debug&&u("cached model:",a0.modelUrl):a0=await O(e.body.modelPath),a0}async function Qs(e,t){let[n,o]=e.shape,r=J.reshape(e,[o*n]),s=J.max(r,0),A=(await s.data())[0];if(A>t){let a=J.argMax(r,0),l=J.mod(a,n),c=(await l.data())[0],x=J.div(a,n),i=(await x.data())[0];return J.dispose([r,s,a,l,x]),[c,i,A]}return J.dispose([r,s]),[0,0,A]}async function f5(e,t){if(!(a0!=null&&a0.executor)||!(a0!=null&&a0.inputs[0].shape))return[];let n=(t.body.skipTime||0)>g()-o3,o=y5<(t.body.skipFrames||0);return t.skipAllowed&&n&&o&&Object.keys(C0.keypoints).length>0?(y5++,[C0]):(y5=0,new Promise(async r=>{let s=J.tidy(()=>{var p,f;let i=J.image.resizeBilinear(e,[((p=a0==null?void 0:a0.inputs[0].shape)==null?void 0:p[2])||0,((f=a0==null?void 0:a0.inputs[0].shape)==null?void 0:f[1])||0],!1),y=J.mul(i,C.tf2);return J.sub(y,C.tf1)}),A;if(t.body.enabled&&(A=a0==null?void 0:a0.execute(s)),o3=g(),J.dispose(s),A){C0.keypoints.length=0;let i=J.squeeze(A);J.dispose(A);let y=J.unstack(i,2);J.dispose(i);for(let d=0;d(t.body.minConfidence||0)&&C0.keypoints.push({score:Math.round(100*b)/100,part:d5[d],positionRaw:[p/a0.inputs[0].shape[2],f/a0.inputs[0].shape[1]],position:[Math.round(e.shape[2]*p/a0.inputs[0].shape[2]),Math.round(e.shape[1]*f/a0.inputs[0].shape[1])]})}y.forEach(d=>J.dispose(d))}C0.score=C0.keypoints.reduce((i,y)=>y.score>i?y.score:i,0);let a=C0.keypoints.map(i=>i.position[0]),l=C0.keypoints.map(i=>i.position[1]);C0.box=[Math.min(...a),Math.min(...l),Math.max(...a)-Math.min(...a),Math.max(...l)-Math.min(...l)];let c=C0.keypoints.map(i=>i.positionRaw[0]),x=C0.keypoints.map(i=>i.positionRaw[1]);C0.boxRaw=[Math.min(...c),Math.min(...x),Math.max(...c)-Math.min(...c),Math.max(...x)-Math.min(...x)];for(let[i,y]of Object.entries(x5)){let d=[];for(let p=0;pM.part===y[p]),b=C0.keypoints.find(M=>M.part===y[p+1]);f&&b&&f.score>(t.body.minConfidence||0)&&b.score>(t.body.minConfidence||0)&&d.push([f.position,b.position])}C0.annotations[i]=d}r([C0])}))}var i0=V(H());var Le=V(H());var L=V(H());var Te=V(H());var x2=e=>[Math.abs(e.endPoint[0]-e.startPoint[0]),Math.abs(e.endPoint[1]-e.startPoint[1])],rt=e=>[e.startPoint[0]+(e.endPoint[0]-e.startPoint[0])/2,e.startPoint[1]+(e.endPoint[1]-e.startPoint[1])/2,1],st=(e,t)=>e?[Math.trunc(Math.max(0,e.startPoint[0])),Math.trunc(Math.max(0,e.startPoint[1])),Math.trunc(Math.min(t.shape[2]||0,e.endPoint[0])-Math.max(0,e.startPoint[0])),Math.trunc(Math.min(t.shape[1]||0,e.endPoint[1])-Math.max(0,e.startPoint[1]))]:[0,0,0,0],At=(e,t)=>e?[e.startPoint[0]/(t.shape[2]||0),e.startPoint[1]/(t.shape[1]||0),(e.endPoint[0]-e.startPoint[0])/(t.shape[2]||0),(e.endPoint[1]-e.startPoint[1])/(t.shape[1]||0)]:[0,0,0,0],i3=(e,t)=>{let n=[e.startPoint[0]*t[0],e.startPoint[1]*t[1]],o=[e.endPoint[0]*t[0],e.endPoint[1]*t[1]];return{startPoint:n,endPoint:o,landmarks:e.landmarks,confidence:e.confidence}},m5=(e,t,n)=>{let o=t.shape[1],r=t.shape[2],s=[e.startPoint[1]/o,e.startPoint[0]/r,e.endPoint[1]/o,e.endPoint[0]/r],A=Te.image.cropAndResize(t,[s],[0],n),a=Te.div(A,C.tf255);return Te.dispose(A),a},at=(e,t)=>{let n=rt(e),o=x2(e),r=[t*o[0]/2,t*o[1]/2];return{startPoint:[n[0]-r[0],n[1]-r[1]],endPoint:[n[0]+r[0],n[1]+r[1]],landmarks:e.landmarks,confidence:e.confidence}},it=e=>{let t=rt(e),n=x2(e),o=Math.max(...n)/2;return{startPoint:[Math.round(t[0]-o),Math.round(t[1]-o)],endPoint:[Math.round(t[0]+o),Math.round(t[1]+o)],landmarks:e.landmarks,confidence:e.confidence}},l3=e=>{let t=e.map(o=>o[0]),n=e.map(o=>o[1]);return{startPoint:[Math.min(...t),Math.min(...n)],endPoint:[Math.max(...t),Math.max(...n)],landmarks:e}},p5=[[1,0,0],[0,1,0],[0,0,1]],_s=e=>e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI)),$s=(e,t)=>_s(Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]));var A3=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]],t2=(e,t)=>{let n=0;for(let o=0;o{let n=[];for(let o=0;o{let n=[],o=e.length;for(let r=0;r{let n=Math.cos(e),o=Math.sin(e),r=[[n,-o,0],[o,n,0],[0,0,1]],s=A3(t[0],t[1]),A=a3(s,r),a=A3(-t[0],-t[1]);return a3(A,a)},tA=e=>{let t=[[e[0][0],e[1][0]],[e[0][1],e[1][1]]],n=[e[0][2],e[1][2]],o=[-t2(t[0],n),-t2(t[1],n)];return[t[0].concat(o[0]),t[1].concat(o[1]),[0,0,1]]},nA=(e,t)=>[t2(e,t[0]),t2(e,t[1])];function d3(e){let t=e===192?{strides:[4],anchors:[1]}:{strides:[e/16,e/8],anchors:[2,6]},n=[];for(let o=0;o[s[0]/r*(d[0]-r/2),s[1]/r*(d[1]-r/2),d[2]||0]),a=n&&n!==0&&Math.abs(n)>.2,l=a?c3(n,[0,0]):p5,c=a?A.map(d=>[...nA(d,l),d[2]]):A,x=a?tA(o):p5,i=rt(t),y=[t2(i,x[0]),t2(i,x[1])];return c.map(d=>[Math.trunc(d[0]+y[0]),Math.trunc(d[1]+y[1]),Math.trunc(d[2]||0)])}function y3(e,t,n,o){let r=t.landmarks.length>=_t.count?_t.symmetryLine:Ke.symmetryLine,s=0,A=p5,a;if(e&&v.kernels.includes("rotatewithoffset"))if(s=$s(t.landmarks[r[0]],t.landmarks[r[1]]),s&&s!==0&&Math.abs(s)>.2){let c=rt(t),x=[c[0]/n.shape[2],c[1]/n.shape[1]],i=Te.image.rotateWithOffset(n,s,0,[x[0],x[1]]);A=c3(-s,c),a=m5(t,i,[o,o]),Te.dispose(i)}else a=m5(t,n,[o,o]);else a=m5(t,n,[o,o]);return[s,A,a]}var oA=e=>{let t=e.map(o=>o[0]),n=e.map(o=>o[1]);return[Math.min(...t)+(Math.max(...t)-Math.min(...t))/2,Math.min(...n)+(Math.max(...n)-Math.min(...n))/2]},f3=(e,t)=>{let n=oA(e),o=x2(t);return{startPoint:[n[0]-o[0]/2,n[1]-o[1]/2],endPoint:[n[0]+o[0]/2,n[1]+o[1]/2]}};var m3=6,rA=1.4,ae,h5=null,Ie=0,y2=null,f2=()=>Ie;async function p3(e){var t;return v.initial&&(ae=null),ae?e.debug&&u("cached model:",ae.modelUrl):ae=await O((t=e.face.detector)==null?void 0:t.modelPath),Ie=ae.executor&&ae.inputs[0].shape?ae.inputs[0].shape[2]:256,y2=L.scalar(Ie,"int32"),h5=L.tensor2d(d3(Ie)),ae}function sA(e){if(!h5||!y2)return L.zeros([0,0]);let t={};t.boxStarts=L.slice(e,[0,1],[-1,2]),t.centers=L.add(t.boxStarts,h5),t.boxSizes=L.slice(e,[0,3],[-1,2]),t.boxSizesNormalized=L.div(t.boxSizes,y2),t.centersNormalized=L.div(t.centers,y2),t.halfBoxSize=L.div(t.boxSizesNormalized,C.tf2),t.starts=L.sub(t.centersNormalized,t.halfBoxSize),t.ends=L.add(t.centersNormalized,t.halfBoxSize),t.startNormalized=L.mul(t.starts,y2),t.endNormalized=L.mul(t.ends,y2);let n=L.concat2d([t.startNormalized,t.endNormalized],1);return Object.keys(t).forEach(o=>L.dispose(t[o])),n}async function u3(e,t){var a,l,c,x;if(!e||e.isDisposedInternal||e.shape.length!==4||e.shape[1]<1||e.shape[2]<1)return[];let n={};n.resized=L.image.resizeBilinear(e,[Ie,Ie]),n.div=L.div(n.resized,C.tf127),n.normalized=L.sub(n.div,C.tf05);let o=ae==null?void 0:ae.execute(n.normalized);if(Array.isArray(o)&&o.length>2){let i=o.sort((y,d)=>y.size-d.size);n.concat384=L.concat([i[0],i[2]],2),n.concat512=L.concat([i[1],i[3]],2),n.concat=L.concat([n.concat512,n.concat384],1),n.batch=L.squeeze(n.concat,[0])}else Array.isArray(o)?n.batch=L.squeeze(o[0]):n.batch=L.squeeze(o);L.dispose(o),n.boxes=sA(n.batch),n.logits=L.slice(n.batch,[0,0],[-1,1]),n.sigmoid=L.sigmoid(n.logits),n.scores=L.squeeze(n.sigmoid),n.nms=await L.image.nonMaxSuppressionAsync(n.boxes,n.scores,((a=t.face.detector)==null?void 0:a.maxDetected)||0,((l=t.face.detector)==null?void 0:l.iouThreshold)||0,((c=t.face.detector)==null?void 0:c.minConfidence)||0);let r=await n.nms.array(),s=[],A=await n.scores.data();for(let i=0;i(((x=t.face.detector)==null?void 0:x.minConfidence)||0)){let d={};d.bbox=L.slice(n.boxes,[r[i],0],[1,-1]),d.slice=L.slice(n.batch,[r[i],m3-1],[1,-1]),d.squeeze=L.squeeze(d.slice),d.landmarks=L.reshape(d.squeeze,[m3,-1]);let p=await d.bbox.data(),f={startPoint:[p[0],p[1]],endPoint:[p[2],p[3]],landmarks:await d.landmarks.array(),confidence:y},b=i3(f,[(e.shape[2]||0)/Ie,(e.shape[1]||0)/Ie]),M=at(b,t.face.scale||rA),T=it(M);s.push(T),Object.keys(d).forEach(m=>L.dispose(d[m]))}}return Object.keys(n).forEach(i=>L.dispose(n[i])),s}var ie=V(H());var G0,Oe=0,AA=2.3,b5=ne.leftEyeLower0,g5=ne.rightEyeLower0,m2={leftBounds:[b5[0],b5[b5.length-1]],rightBounds:[g5[0],g5[g5.length-1]]},p2={upperCenter:3,lowerCenter:4,index:71,numCoordinates:76};async function v3(e){var t,n;return v.initial&&(G0=null),G0?e.debug&&u("cached model:",G0.modelUrl):G0=await O((t=e.face.iris)==null?void 0:t.modelPath),Oe=(G0==null?void 0:G0.executor)&&((n=G0.inputs)==null?void 0:n[0].shape)?G0.inputs[0].shape[2]:0,Oe===-1&&(Oe=64),G0}function lt(e,t,n,o){for(let r=0;r<$t.length;r++){let{key:s,indices:A}=$t[r],a=ne[`${n}${s}`];if(!o||o.includes(s))for(let l=0;l{let t=e[m2.leftBounds[0]][2],n=e[m2.rightBounds[0]][2];return t-n},b3=(e,t,n,o,r,s=!1)=>{let A=it(at(l3([e[n],e[o]]),AA)),a=x2(A),l=ie.image.cropAndResize(t,[[A.startPoint[1]/r,A.startPoint[0]/r,A.endPoint[1]/r,A.endPoint[0]/r]],[0],[Oe,Oe]);if(s&&v.kernels.includes("flipleftright")){let c=ie.image.flipLeftRight(l);ie.dispose(l),l=c}return{box:A,boxSize:a,crop:l}},g3=(e,t,n,o=!1)=>{let r=[];for(let s=0;s{let o=e[ne[`${n}EyeUpper0`][p2.upperCenter]][2],r=e[ne[`${n}EyeLower0`][p2.lowerCenter]][2],s=(o+r)/2;return t.map((A,a)=>{let l=s;return a===2?l=o:a===4&&(l=r),[A[0],A[1],l]})};async function R3(e,t,n){if(!(G0!=null&&G0.executor))return e;let{box:o,boxSize:r,crop:s}=b3(e,t,m2.leftBounds[0],m2.leftBounds[1],n,!0),{box:A,boxSize:a,crop:l}=b3(e,t,m2.rightBounds[0],m2.rightBounds[1],n,!0),c=ie.concat([s,l]);ie.dispose(s),ie.dispose(l);let x=G0.execute(c);ie.dispose(c);let i=await x.data();ie.dispose(x);let y=i.slice(0,p2.numCoordinates*3),{rawCoords:d,iris:p}=g3(y,o,r,!0),f=i.slice(p2.numCoordinates*3),{rawCoords:b,iris:M}=g3(f,A,a,!1),T=aA(e);Math.abs(T)<30?(lt(e,d,"left",null),lt(e,b,"right",null)):T<1?lt(e,d,"left",["EyeUpper0","EyeLower0"]):lt(e,b,"right",["EyeUpper0","EyeLower0"]);let m=T3(e,p,"left"),h=T3(e,M,"right");return e.concat(m).concat(h)}async function P3(e,t){var s,A,a,l,c,x,i,y,d,p;let n={lips:await((A=(s=t.filter(f=>f.size===160))==null?void 0:s[0])==null?void 0:A.data()),irisL:await((l=(a=t.filter(f=>f.size===10))==null?void 0:a[0])==null?void 0:l.data()),eyeL:await((x=(c=t.filter(f=>f.size===142))==null?void 0:c[0])==null?void 0:x.data()),irisR:await((y=(i=t.filter(f=>f.size===10))==null?void 0:i[1])==null?void 0:y.data()),eyeR:await((p=(d=t.filter(f=>f.size===142))==null?void 0:d[1])==null?void 0:p.data())};for(let f of Object.values(n))if(!f)return e;let o=Qe.reduce((f,b)=>f+=e[b][2],0)/Qe.length;for(let f=0;ff+=e[b][2],0)/_e.length;for(let f=0;fg()-pe.timestamp,o=pe.skipped<(((c=t.face.detector)==null?void 0:c.skipFrames)||0);!t.skipAllowed||!n||!o||pe.boxes.length===0?(pe.boxes=await u3(e,t),pe.timestamp=g(),pe.skipped=0):pe.skipped++;let r=[],s=[],A=0,a=j2;for(let T=0;TG.shape[G.shape.length-1]===1).data();if(P.faceScore=Math.round(100*t0[0])/100,P.faceScore<(((p=t.face.detector)==null?void 0:p.minConfidence)||1)){if(m.confidence=P.faceScore,t.face.mesh.keepInvalid){P.box=st(m,e),P.boxRaw=At(m,e),P.score=P.boxScore,P.mesh=m.landmarks.map(G=>[(m.startPoint[0]+m.endPoint[0])/2+(m.endPoint[0]+m.startPoint[0])*G[0]/f2(),(m.startPoint[1]+m.endPoint[1])/2+(m.endPoint[1]+m.startPoint[1])*G[1]/f2()]),P.meshRaw=P.mesh.map(G=>[G[0]/(e.shape[2]||1),G[1]/(e.shape[1]||1),(G[2]||0)/a]);for(let G of Object.keys(Ke))P.annotations[G]=[P.mesh[Ke[G]]]}}else{let G=I.find(Z=>Z.shape[Z.shape.length-1]===1404),$=Le.reshape(G,[-1,3]),s0=await $.array();Le.dispose($),(f=t.face.attention)!=null&&f.enabled?s0=await P3(s0,I):(b=t.face.iris)!=null&&b.enabled&&(s0=await R3(s0,P.tensor,j2)),P.mesh=x3(s0,m,h,S,j2),P.meshRaw=P.mesh.map(Z=>[Z[0]/(e.shape[2]||0),Z[1]/(e.shape[1]||0),(Z[2]||0)/a]);for(let Z of Object.keys(ne))P.annotations[Z]=ne[Z].map(b0=>P.mesh[b0]);P.score=P.faceScore;let R={...f3(P.mesh,m),confidence:m.confidence,landmarks:m.landmarks};P.box=st(R,e),P.boxRaw=At(R,e),s.push(R)}Le.dispose(I)}else{P.box=st(m,e),P.boxRaw=At(m,e),P.score=P.boxScore,P.mesh=m.landmarks.map(I=>[(m.startPoint[0]+m.endPoint[0])/2+(m.endPoint[0]+m.startPoint[0])*I[0]/f2(),(m.startPoint[1]+m.endPoint[1])/2+(m.endPoint[1]+m.startPoint[1])*I[1]/f2()]),P.meshRaw=P.mesh.map(I=>[I[0]/(e.shape[2]||0),I[1]/(e.shape[1]||0),(I[2]||0)/a]);for(let I of Object.keys(Ke))P.annotations[I]=[P.mesh[Ke[I]]]}P.score>(((M=t.face.detector)==null?void 0:M.minConfidence)||1)?r.push(P):Le.dispose(P.tensor)}return pe.boxes=s,r}async function w3(e){var t,n,o,r,s,A;return v.initial&&(o0=null),((t=e.face.attention)==null?void 0:t.enabled)&&(o0==null?void 0:o0.signature)&&Object.keys(((n=o0==null?void 0:o0.signature)==null?void 0:n.outputs)||{}).length<6&&(o0=null),o0?e.debug&&u("cached model:",o0.modelUrl):(o=e.face.attention)!=null&&o.enabled?o0=await O(e.face.attention.modelPath):o0=await O((r=e.face.mesh)==null?void 0:r.modelPath),j2=o0.executor&&((s=o0==null?void 0:o0.inputs)==null?void 0:s[0].shape)?(A=o0==null?void 0:o0.inputs)==null?void 0:A[0].shape[2]:256,o0}var E3=Je,z3=z2;var le=V(H());var lA=["angry","disgust","fear","happy","sad","surprise","neutral"],_0,ct=[],S3=0,j3=0,v5=Number.MAX_SAFE_INTEGER;async function N3(e){var t;return v.initial&&(_0=null),_0?e.debug&&u("cached model:",_0.modelUrl):_0=await O((t=e.face.emotion)==null?void 0:t.modelPath),_0}async function R5(e,t,n,o){var A,a;if(!_0)return[];let r=v5<(((A=t.face.emotion)==null?void 0:A.skipFrames)||0),s=(((a=t.face.emotion)==null?void 0:a.skipTime)||0)>g()-j3;return t.skipAllowed&&s&&r&&S3===o&&ct[n]&&ct[n].length>0?(v5++,ct[n]):(v5=0,new Promise(async l=>{var x;let c=[];if((x=t.face.emotion)!=null&&x.enabled){let i={},y=_0!=null&&_0.inputs[0].shape?_0.inputs[0].shape[2]:0;i.resize=le.image.resizeBilinear(e,[y,y],!1),i.channels=le.mul(i.resize,C.rgb),i.grayscale=le.sum(i.channels,3,!0),i.grayscaleSub=le.sub(i.grayscale,C.tf05),i.grayscaleMul=le.mul(i.grayscaleSub,C.tf2),i.emotion=_0==null?void 0:_0.execute(i.grayscaleMul),j3=g();let d=await i.emotion.data();for(let p=0;p(t.face.emotion.minConfidence||0)&&c.push({score:Math.min(.99,Math.trunc(100*d[p])/100),emotion:lA[p]});c.sort((p,f)=>f.score-p.score),Object.keys(i).forEach(p=>le.dispose(i[p]))}ct[n]=c,S3=o,l(c)}))}var ce=V(H());var z0,Ce=[],O3=0,L3=0,M5=Number.MAX_SAFE_INTEGER;async function C3(e){var t;return v.initial&&(z0=null),z0?e.debug&&u("cached model:",z0.modelUrl):z0=await O((t=e.face.description)==null?void 0:t.modelPath),z0}function cA(e){let t=e.image||e.tensor||e;if(!(z0!=null&&z0.inputs[0].shape))return t;let n=ce.image.resizeBilinear(t,[z0.inputs[0].shape[2],z0.inputs[0].shape[1]],!1),o=ce.mul(n,C.tf255);return ce.dispose(n),o}async function P5(e,t,n,o){var a,l,c,x;let r={age:0,gender:"unknown",genderScore:0,descriptor:[]};if(!(z0!=null&&z0.executor))return r;let s=M5<(((a=t.face.description)==null?void 0:a.skipFrames)||0),A=(((l=t.face.description)==null?void 0:l.skipTime)||0)>g()-O3;return t.skipAllowed&&s&&A&&L3===o&&((c=Ce==null?void 0:Ce[n])==null?void 0:c.age)>0&&((x=Ce==null?void 0:Ce[n])==null?void 0:x.genderScore)>0?(M5++,Ce[n]):(M5=0,new Promise(async i=>{var y;if((y=t.face.description)!=null&&y.enabled){let d=cA(e),p=z0==null?void 0:z0.execute(d);O3=g(),ce.dispose(d);let b=await p.find(q=>q.shape[1]===1).data(),M=Math.trunc(200*Math.abs(b[0]-.5))/100;M>(t.face.description.minConfidence||0)&&(r.gender=b[0]<=.5?"female":"male",r.genderScore=Math.min(.99,M));let T=ce.argMax(p.find(q=>q.shape[1]===100),1),m=(await T.data())[0];ce.dispose(T);let S=await p.find(q=>q.shape[1]===100).data();r.age=Math.round(S[m-1]>S[m+1]?10*m-100*S[m-1]:10*m+100*S[m+1])/10,(Number.isNaN(b[0])||Number.isNaN(S[0]))&&u("faceres error:",{model:z0,result:p});let P=p.find(q=>q.shape[1]===1024),I=P?await P.data():[];r.descriptor=Array.from(I),p.forEach(q=>ce.dispose(q))}Ce[n]=r,L3=o,i(r)}))}var u2=.1,k5=.5;function dA(e,t,n){let o=!1,r=n.length-1;for(let s=0;st!=n[r].y>t&&e<(n[r].x-n[s].x)*(t-n[s].y)/(n[r].y-n[s].y)+n[s].x&&(o=!o);return o}async function D3(e){if(!e.tensor||!e.mesh||e.mesh.length<100)return e.tensor;let t=e.tensor.shape[2]||0,n=e.tensor.shape[1]||0,o=await e.tensor.buffer(),r=[];for(let A of ne.silhouette)r.push({x:(e.mesh[A][0]-e.box[0])/e.box[2],y:(e.mesh[A][1]-e.box[1])/e.box[3]});u2&&u2>0&&(r=r.map(A=>({x:A.x>.5?A.x+u2:A.x-u2,y:A.y>.5?A.y+u2:A.y-u2})));for(let A=0;Ag()-B3,s=w5<(((a=t.face.antispoof)==null?void 0:a.skipFrames)||0);return t.skipAllowed&&r&&s&&F3===o&&dt[n]?(w5++,dt[n]):(w5=0,new Promise(async l=>{let c=xt.image.resizeBilinear(e,[M0!=null&&M0.inputs[0].shape?M0.inputs[0].shape[2]:0,M0!=null&&M0.inputs[0].shape?M0.inputs[0].shape[1]:0],!1),x=M0==null?void 0:M0.execute(c),i=(await x.data())[0];dt[n]=Math.round(100*i)/100,F3=o,B3=g(),xt.dispose([c,x]),l(dt[n])}))}var ft=V(H());var P0,yt=[],z5=Number.MAX_SAFE_INTEGER,V3=0,Z3=0;async function X3(e){var t;return v.initial&&(P0=null),P0?e.debug&&u("cached model:",P0.modelUrl):P0=await O((t=e.face.liveness)==null?void 0:t.modelPath),P0}async function S5(e,t,n,o){var A,a;if(!(P0!=null&&P0.executor))return 0;let r=(((A=t.face.liveness)==null?void 0:A.skipTime)||0)>g()-Z3,s=z5<(((a=t.face.liveness)==null?void 0:a.skipFrames)||0);return t.skipAllowed&&r&&s&&V3===o&&yt[n]?(z5++,yt[n]):(z5=0,new Promise(async l=>{let c=ft.image.resizeBilinear(e,[P0!=null&&P0.inputs[0].shape?P0.inputs[0].shape[2]:0,P0!=null&&P0.inputs[0].shape?P0.inputs[0].shape[1]:0],!1),x=P0==null?void 0:P0.execute(c),i=(await x.data())[0];yt[n]=Math.round(100*i)/100,V3=o,Z3=g(),ft.dispose([c,x]),l(yt[n])}))}var mt=V(H());var oe,j5=[],yA=["white","black","asian","indian","other"],fA=[15,23,28,35.5,45.5,55.5,65],U3=0,Y3=0,N5=Number.MAX_SAFE_INTEGER;async function K3(e){var t;return v.initial&&(oe=null),oe?e.debug&&u("cached model:",oe.modelUrl):oe=await O((t=e.face.gear)==null?void 0:t.modelPath),oe}async function I5(e,t,n,o){var A,a;if(!oe)return{age:0,gender:"unknown",genderScore:0,race:[]};let r=N5<(((A=t.face.gear)==null?void 0:A.skipFrames)||0),s=(((a=t.face.gear)==null?void 0:a.skipTime)||0)>g()-Y3;return t.skipAllowed&&s&&r&&U3===o&&j5[n]?(N5++,j5[n]):(N5=0,new Promise(async l=>{var M,T;if(!(oe!=null&&oe.inputs[0].shape))return;let c={},x=[[0,.1,.9,.9]];c.resize=mt.image.cropAndResize(e,x,[0],[oe.inputs[0].shape[2],oe.inputs[0].shape[1]]);let i={age:0,gender:"unknown",genderScore:0,race:[]};(M=t.face.gear)!=null&&M.enabled&&([c.age,c.gender,c.race]=oe.execute(c.resize,["age_output","gender_output","race_output"]));let y=await c.gender.data();i.gender=y[0]>y[1]?"male":"female",i.genderScore=Math.round(100*(y[0]>y[1]?y[0]:y[1]))/100;let d=await c.race.data();for(let m=0;m(((T=t.face.gear)==null?void 0:T.minConfidence)||.2)&&i.race.push({score:Math.round(100*d[m])/100,race:yA[m]});i.race.sort((m,h)=>h.score-m.score);let f=Array.from(await c.age.data()).map((m,h)=>[fA[h],m]).sort((m,h)=>h[1]-m[1]),b=f[0][0];for(let m=1;mmt.dispose(c[m])),j5[n]=i,U3=o,Y3=g(),l(i)}))}var h2=V(H());var V0,pt=[],Q3=0,_3=0,O5=Number.MAX_SAFE_INTEGER;async function $3(e){return v.initial&&(V0=null),V0?e.debug&&u("cached model:",V0.modelUrl):V0=await O(e.face.ssrnet.modelPathAge),V0}async function L5(e,t,n,o){var A,a,l,c;if(!V0)return{age:0};let r=O5<(((A=t.face.ssrnet)==null?void 0:A.skipFrames)||0),s=(((a=t.face.ssrnet)==null?void 0:a.skipTime)||0)>g()-_3;return t.skipAllowed&&r&&s&&Q3===o&&((l=pt[n])==null?void 0:l.age)&&((c=pt[n])==null?void 0:c.age)>0?(O5++,pt[n]):(O5=0,new Promise(async x=>{var d;if(!(V0!=null&&V0.inputs)||!V0.inputs[0]||!V0.inputs[0].shape)return;let i={};i.resize=h2.image.resizeBilinear(e,[V0.inputs[0].shape[2],V0.inputs[0].shape[1]],!1),i.enhance=h2.mul(i.resize,C.tf255);let y={age:0};if((d=t.face.ssrnet)!=null&&d.enabled&&(i.age=V0.execute(i.enhance)),i.age){let p=await i.age.data();y.age=Math.trunc(10*p[0])/10}Object.keys(i).forEach(p=>h2.dispose(i[p])),pt[n]=y,Q3=o,_3=g(),x(y)}))}var S0=V(H());var re,ut=[],tn=0,nn=0,C5=Number.MAX_SAFE_INTEGER,W5=[.2989,.587,.114];async function on(e){var t;return v.initial&&(re=null),re?e.debug&&u("cached model:",re.modelUrl):re=await O((t=e.face.ssrnet)==null?void 0:t.modelPathGender),re}async function D5(e,t,n,o){var A,a,l,c;if(!re)return{gender:"unknown",genderScore:0};let r=C5<(((A=t.face.ssrnet)==null?void 0:A.skipFrames)||0),s=(((a=t.face.ssrnet)==null?void 0:a.skipTime)||0)>g()-nn;return t.skipAllowed&&r&&s&&tn===o&&((l=ut[n])==null?void 0:l.gender)&&((c=ut[n])==null?void 0:c.genderScore)>0?(C5++,ut[n]):(C5=0,new Promise(async x=>{var p;if(!(re!=null&&re.inputs[0].shape))return;let i={};i.resize=S0.image.resizeBilinear(e,[re.inputs[0].shape[2],re.inputs[0].shape[1]],!1),i.enhance=S0.tidy(()=>{let[f,b,M]=S0.split(i.resize,3,3),T=S0.mul(f,W5[0]),m=S0.mul(b,W5[1]),h=S0.mul(M,W5[2]),S=S0.addN([T,m,h]);return S0.mul(S0.sub(S,C.tf05),2)});let y={gender:"unknown",genderScore:0};(p=t.face.ssrnet)!=null&&p.enabled&&(i.gender=re.execute(i.enhance));let d=await i.gender.data();y.gender=d[0]>d[1]?"female":"male",y.genderScore=d[0]>d[1]?Math.trunc(100*d[0])/100:Math.trunc(100*d[1])/100,Object.keys(i).forEach(f=>S0.dispose(i[f])),ut[n]=y,tn=o,nn=g(),x(y)}))}var ht=V(H());var Z0,F5=[],sn=0,An=0,an=Number.MAX_SAFE_INTEGER;async function ln(e){var t;return v.initial&&(Z0=null),Z0?e.debug&&u("cached model:",Z0.modelUrl):Z0=await O((t=e.face.mobilefacenet)==null?void 0:t.modelPath),Z0}async function B5(e,t,n,o){var A,a;if(!(Z0!=null&&Z0.executor))return[];let r=an<(((A=t.face.mobilefacenet)==null?void 0:A.skipFrames)||0),s=(((a=t.face.mobilefacenet)==null?void 0:a.skipTime)||0)>g()-An;return t.skipAllowed&&s&&r&&sn===o&&F5[n]?(an++,F5[n]):new Promise(async l=>{var x;let c=[];if(((x=t.face.mobilefacenet)==null?void 0:x.enabled)&&(Z0==null?void 0:Z0.inputs[0].shape)){let i={};i.crop=ht.image.resizeBilinear(e,[Z0.inputs[0].shape[2],Z0.inputs[0].shape[1]],!1),i.data=Z0.execute(i.crop);let y=await i.data.data();c=Array.from(y),Object.keys(i).forEach(d=>ht.dispose(i[d]))}F5[n]=c,sn=o,An=g(),l(c)})}var bt=V(H());var X0,H5=[],dn=0,xn=0,yn=Number.MAX_SAFE_INTEGER;async function fn(e){return v.initial&&(X0=null),X0?e.debug&&u("cached model:",X0.modelUrl):X0=await O(e.face.insightface.modelPath),X0}async function G5(e,t,n,o){var A,a;if(!(X0!=null&&X0.executor))return[];let r=yn<(((A=t.face.insightface)==null?void 0:A.skipFrames)||0),s=(((a=t.face.insightface)==null?void 0:a.skipTime)||0)>g()-xn;return t.skipAllowed&&s&&r&&dn===o&&H5[n]?(yn++,H5[n]):new Promise(async l=>{var x;let c=[];if(((x=t.face.insightface)==null?void 0:x.enabled)&&(X0==null?void 0:X0.inputs[0].shape)){let i={};i.crop=bt.image.resizeBilinear(e,[X0.inputs[0].shape[2],X0.inputs[0].shape[1]],!1),i.data=X0.execute(i.crop);let y=await i.data.data();c=Array.from(y),Object.keys(i).forEach(d=>bt.dispose(i[d]))}H5[n]=c,dn=o,xn=g(),l(c)})}var mA=e=>{let t=(i,y)=>Math.atan2(i[1]-y[1],i[0]-y[0]);if(!e.annotations.rightEyeIris||!e.annotations.leftEyeIris)return{bearing:0,strength:0};let n=[0,-.1],o=1,r=(e.mesh[33][2]||0)>(e.mesh[263][2]||0),s=r?e.mesh[473]:e.mesh[468],A=r?[(e.mesh[133][0]+e.mesh[33][0])/2,(e.mesh[133][1]+e.mesh[33][1])/2]:[(e.mesh[263][0]+e.mesh[362][0])/2,(e.mesh[263][1]+e.mesh[362][1])/2],a=r?[e.mesh[133][0]-e.mesh[33][0],e.mesh[23][1]-e.mesh[27][1]]:[e.mesh[263][0]-e.mesh[362][0],e.mesh[253][1]-e.mesh[257][1]],l=[(A[0]-s[0])/a[0]-n[0],o*(s[1]-A[1])/a[1]-n[1]],c=Math.sqrt(l[0]*l[0]+l[1]*l[1]);return c=Math.min(c,e.boxRaw[2]/2,e.boxRaw[3]/2),{bearing:(t([0,0],l)+Math.PI/2)%Math.PI,strength:c}},pn=(e,t)=>{let n=f=>{let b=Math.sqrt(f[0]*f[0]+f[1]*f[1]+f[2]*f[2]);return f[0]/=b,f[1]/=b,f[2]/=b,f},o=(f,b)=>{let M=f[0]-b[0],T=f[1]-b[1],m=f[2]-b[2];return[M,T,m]},r=(f,b)=>{let M=f[1]*b[2]-f[2]*b[1],T=f[2]*b[0]-f[0]*b[2],m=f[0]*b[1]-f[1]*b[0];return[M,T,m]},s=f=>{let[b,M,T,m,h,S,P,I,q]=f,t0,G,$;return m<1?m>-1?($=Math.asin(m),G=Math.atan2(-P,b),t0=Math.atan2(-S,h)):($=-Math.PI/2,G=-Math.atan2(I,q),t0=0):($=Math.PI/2,G=Math.atan2(I,q),t0=0),Number.isNaN(t0)&&(t0=0),Number.isNaN(G)&&(G=0),Number.isNaN($)&&($=0),{pitch:2*-t0,yaw:2*-G,roll:2*-$}},A=e.meshRaw;if(!A||A.length<300)return{angle:{pitch:0,yaw:0,roll:0},matrix:[1,0,0,0,1,0,0,0,1],gaze:{bearing:0,strength:0}};let a=Math.max(e.boxRaw[2]*t[0],e.boxRaw[3]*t[1])/1.5,l=[A[10],A[152],A[234],A[454]].map(f=>[f[0]*t[0]/a,f[1]*t[1]/a,f[2]]),c=n(o(l[1],l[0])),x=n(o(l[3],l[2])),i=n(r(x,c));x=r(c,i);let y=[x[0],x[1],x[2],c[0],c[1],c[2],i[0],i[1],i[2]],d=s(y),p=A.length===478?mA(e):{bearing:0,strength:0};return{angle:d,matrix:y,gaze:p}};function un(e,t){let n=e==null?void 0:e.annotations;if(!n)return 0;let o=Math.max(Math.abs(n.leftEyeIris[3][0]-n.leftEyeIris[1][0]),Math.abs(n.rightEyeIris[3][0]-n.rightEyeIris[1][0]))/t;return Math.round(1.17/o)/100}var V5=async(e,t)=>{var p,f,b,M,T,m,h,S,P,I,q,t0,G,$,s0,R,Z,b0,U,g0,f0,B,X;let n=g(),o,r,s,A,a,l,c,x,i,y=[];e.state="run:face";let d=await k3(t,e.config);if(e.performance.face=v.perfadd?(e.performance.face||0)+Math.trunc(g()-n):Math.trunc(g()-n),!t.shape||t.shape.length!==4)return[];if(!d)return[];for(let z=0;z200?pn(d[z],[t.shape[2],t.shape[1]]):null;e.analyze("Start Emotion:"),e.config.async?A=(f=e.config.face.emotion)!=null&&f.enabled?R5(d[z].tensor||i0.tensor([]),e.config,z,d.length):[]:(e.state="run:emotion",n=g(),A=(b=e.config.face.emotion)!=null&&b.enabled?await R5(d[z].tensor||i0.tensor([]),e.config,z,d.length):[],e.performance.emotion=v.perfadd?(e.performance.emotion||0)+Math.trunc(g()-n):Math.trunc(g()-n)),e.analyze("End Emotion:"),e.analyze("Start AntiSpoof:"),e.config.async?c=(M=e.config.face.antispoof)!=null&&M.enabled?E5(d[z].tensor||i0.tensor([]),e.config,z,d.length):0:(e.state="run:antispoof",n=g(),c=(T=e.config.face.antispoof)!=null&&T.enabled?await E5(d[z].tensor||i0.tensor([]),e.config,z,d.length):0,e.performance.antispoof=v.perfadd?(e.performance.antispoof||0)+Math.trunc(g()-n):Math.trunc(g()-n)),e.analyze("End AntiSpoof:"),e.analyze("Start Liveness:"),e.config.async?x=(m=e.config.face.liveness)!=null&&m.enabled?S5(d[z].tensor||i0.tensor([]),e.config,z,d.length):0:(e.state="run:liveness",n=g(),x=(h=e.config.face.liveness)!=null&&h.enabled?await S5(d[z].tensor||i0.tensor([]),e.config,z,d.length):0,e.performance.liveness=v.perfadd?(e.performance.antispoof||0)+Math.trunc(g()-n):Math.trunc(g()-n)),e.analyze("End Liveness:"),e.analyze("Start GEAR:"),e.config.async?r=(S=e.config.face.gear)!=null&&S.enabled?I5(d[z].tensor||i0.tensor([]),e.config,z,d.length):null:(e.state="run:gear",n=g(),r=(P=e.config.face.gear)!=null&&P.enabled?await I5(d[z].tensor||i0.tensor([]),e.config,z,d.length):null,e.performance.gear=Math.trunc(g()-n)),e.analyze("End GEAR:"),e.analyze("Start SSRNet:"),e.config.async?(o=(I=e.config.face.ssrnet)!=null&&I.enabled?L5(d[z].tensor||i0.tensor([]),e.config,z,d.length):null,s=(q=e.config.face.ssrnet)!=null&&q.enabled?D5(d[z].tensor||i0.tensor([]),e.config,z,d.length):null):(e.state="run:ssrnet",n=g(),o=(t0=e.config.face.ssrnet)!=null&&t0.enabled?await L5(d[z].tensor||i0.tensor([]),e.config,z,d.length):null,s=(G=e.config.face.ssrnet)!=null&&G.enabled?await D5(d[z].tensor||i0.tensor([]),e.config,z,d.length):null,e.performance.ssrnet=Math.trunc(g()-n)),e.analyze("End SSRNet:"),e.analyze("Start MobileFaceNet:"),e.config.async?a=($=e.config.face.mobilefacenet)!=null&&$.enabled?B5(d[z].tensor||i0.tensor([]),e.config,z,d.length):null:(e.state="run:mobilefacenet",n=g(),a=(s0=e.config.face.mobilefacenet)!=null&&s0.enabled?await B5(d[z].tensor||i0.tensor([]),e.config,z,d.length):null,e.performance.mobilefacenet=Math.trunc(g()-n)),e.analyze("End MobileFaceNet:"),e.analyze("Start InsightFace:"),e.config.async?l=(R=e.config.face.insightface)!=null&&R.enabled?G5(d[z].tensor||i0.tensor([]),e.config,z,d.length):null:(e.state="run:mobilefacenet",n=g(),l=(Z=e.config.face.insightface)!=null&&Z.enabled?await G5(d[z].tensor||i0.tensor([]),e.config,z,d.length):null,e.performance.mobilefacenet=Math.trunc(g()-n)),e.analyze("End InsightFace:"),e.analyze("Start Description:"),e.config.async?i=P5(d[z].tensor||i0.tensor([]),e.config,z,d.length):(e.state="run:description",n=g(),i=await P5(d[z].tensor||i0.tensor([]),e.config,z,d.length),e.performance.description=v.perfadd?(e.performance.description||0)+Math.trunc(g()-n):Math.trunc(g()-n)),e.analyze("End Description:"),e.config.async&&([o,s,A,a,l,i,r,c,x]=await Promise.all([o,s,A,a,l,i,r,c,x])),e.analyze("Finish Face:"),((b0=e.config.face.ssrnet)==null?void 0:b0.enabled)&&o&&s&&(i={...i,age:o.age,gender:s.gender,genderScore:s.genderScore}),((U=e.config.face.gear)==null?void 0:U.enabled)&&r&&(i={...i,age:r.age,gender:r.gender,genderScore:r.genderScore,race:r.race}),((g0=e.config.face.mobilefacenet)==null?void 0:g0.enabled)&&a&&(i.descriptor=a),((f0=e.config.face.insightface)==null?void 0:f0.enabled)&&l&&(i.descriptor=l);let Pe=(B=e.config.face.iris)!=null&&B.enabled?un(d[z],t.shape[2]):0,ke=(X=e.config.face.detector)!=null&&X.return?i0.squeeze(d[z].tensor):null;i0.dispose(d[z].tensor),d[z].tensor&&delete d[z].tensor;let T0={...d[z],id:z};i.age&&(T0.age=i.age),i.gender&&(T0.gender=i.gender),i.genderScore&&(T0.genderScore=i.genderScore),i.descriptor&&(T0.embedding=i.descriptor),i.race&&(T0.race=i.race),A&&(T0.emotion=A),c&&(T0.real=c),x&&(T0.live=x),Pe>0&&(T0.distance=Pe),$0&&(T0.rotation=$0),ke&&(T0.tensor=ke),y.push(T0),e.analyze("End Face")}return e.analyze("End FaceMesh:"),e.config.async&&(e.performance.face&&delete e.performance.face,e.performance.age&&delete e.performance.age,e.performance.gender&&delete e.performance.gender,e.performance.emotion&&delete e.performance.emotion),y};var W0={thumb:0,index:1,middle:2,ring:3,pinky:4,all:[0,1,2,3,4],nameMapping:{0:"thumb",1:"index",2:"middle",3:"ring",4:"pinky"},pointsMapping:{0:[[0,1],[1,2],[2,3],[3,4]],1:[[0,5],[5,6],[6,7],[7,8]],2:[[0,9],[9,10],[10,11],[11,12]],3:[[0,13],[13,14],[14,15],[15,16]],4:[[0,17],[17,18],[18,19],[19,20]]},getName:e=>W0.nameMapping[e],getPoints:e=>W0.pointsMapping[e]},De={none:0,half:1,full:2,nameMapping:{0:"none",1:"half",2:"full"},getName:e=>De.nameMapping[e]},l0={verticalUp:0,verticalDown:1,horizontalLeft:2,horizontalRight:3,diagonalUpRight:4,diagonalUpLeft:5,diagonalDownRight:6,diagonalDownLeft:7,nameMapping:{0:"verticalUp",1:"verticalDown",2:"horizontalLeft",3:"horizontalRight",4:"diagonalUpRight",5:"diagonalUpLeft",6:"diagonalDownRight",7:"diagonalDownLeft"},getName:e=>l0.nameMapping[e]},We=class{constructor(t){k(this,"name");k(this,"curls");k(this,"directions");k(this,"weights");k(this,"weightsRelative");this.name=t,this.curls={},this.directions={},this.weights=[1,1,1,1,1],this.weightsRelative=[1,1,1,1,1]}curl(t,n,o){typeof this.curls[t]=="undefined"&&(this.curls[t]=[]),this.curls[t].push([n,o])}direction(t,n,o){this.directions[t]||(this.directions[t]=[]),this.directions[t].push([n,o])}weight(t,n){this.weights[t]=n;let o=this.weights.reduce((r,s)=>r+s,0);this.weightsRelative=this.weights.map(r=>r*5/o)}matchAgainst(t,n){let o=0;for(let r in t){let s=t[r],A=this.curls[r];if(typeof A=="undefined"){o+=this.weightsRelative[r];continue}for(let[a,l]of A)if(s===a){o+=l*this.weightsRelative[r];break}}for(let r in n){let s=n[r],A=this.directions[r];if(typeof A=="undefined"){o+=this.weightsRelative[r];continue}for(let[a,l]of A)if(s===a){o+=l*this.weightsRelative[r];break}}return o/10}};var{thumb:de,index:ve,middle:Re,ring:n2,pinky:o2}=W0,{none:xe,half:uA,full:ye}=De,{verticalUp:b2,verticalDown:G7,horizontalLeft:Z5,horizontalRight:hA,diagonalUpRight:bA,diagonalUpLeft:g2,diagonalDownRight:V7,diagonalDownLeft:Z7}=l0,Fe=new We("thumbs up");Fe.curl(de,xe,1);Fe.direction(de,b2,1);Fe.direction(de,g2,.25);Fe.direction(de,bA,.25);for(let e of[W0.index,W0.middle,W0.ring,W0.pinky])Fe.curl(e,ye,1),Fe.direction(e,Z5,1),Fe.direction(e,hA,1);var p0=new We("victory");p0.curl(de,uA,.5);p0.curl(de,xe,.5);p0.direction(de,b2,1);p0.direction(de,g2,1);p0.curl(ve,xe,1);p0.direction(ve,b2,.75);p0.direction(ve,g2,1);p0.curl(Re,xe,1);p0.direction(Re,b2,1);p0.direction(Re,g2,.75);p0.curl(n2,ye,1);p0.direction(n2,b2,.2);p0.direction(n2,g2,1);p0.direction(n2,Z5,.2);p0.curl(o2,ye,1);p0.direction(o2,b2,.2);p0.direction(o2,g2,1);p0.direction(o2,Z5,.2);p0.weight(ve,2);p0.weight(Re,2);var Be=new We("point");Be.curl(de,ye,1);Be.curl(ve,xe,.5);Be.curl(Re,ye,.5);Be.curl(n2,ye,.5);Be.curl(o2,ye,.5);Be.weight(ve,2);Be.weight(Re,2);var He=new We("middle finger");He.curl(de,xe,1);He.curl(ve,ye,.5);He.curl(Re,ye,.5);He.curl(n2,ye,.5);He.curl(o2,ye,.5);He.weight(ve,2);He.weight(Re,2);var T2=new We("open palm");T2.curl(de,xe,.75);T2.curl(ve,xe,.75);T2.curl(Re,xe,.75);T2.curl(n2,xe,.75);T2.curl(o2,xe,.75);var hn=[Fe,p0,Be,He,T2];var gA=.7,r2={HALF_CURL_START_LIMIT:60,NO_CURL_START_LIMIT:130,DISTANCE_VOTE_POWER:1.1,SINGLE_ANGLE_VOTE_POWER:.9,TOTAL_ANGLE_VOTE_POWER:1.6};function bn(e,t,n,o){let r=(t-o)/(e-n),s=Math.atan(r)*180/Math.PI;return s<=0?s=-s:s>0&&(s=180-s),s}function Tn(e,t){if(!e||!t)return[0,0];let n=bn(e[0],e[1],t[0],t[1]);if(e.length===2)return n;let o=bn(e[1],e[2],t[1],t[2]);return[n,o]}function gn(e,t=1){let n=0,o=0,r=0;return e>=75&&e<=105?n=1*t:e>=25&&e<=155?o=1*t:r=1*t,[n,o,r]}function TA(e,t,n){let o=e[0]-t[0],r=e[0]-n[0],s=t[0]-n[0],A=e[1]-t[1],a=e[1]-n[1],l=t[1]-n[1],c=e[2]-t[2],x=e[2]-n[2],i=t[2]-n[2],y=Math.sqrt(o*o+A*A+c*c),d=Math.sqrt(r*r+a*a+x*x),p=Math.sqrt(s*s+l*l+i*i),f=(p*p+y*y-d*d)/(2*p*y);f>1?f=1:f<-1&&(f=-1);let b=Math.acos(f);b=57.2958*b%180;let M;return b>r2.NO_CURL_START_LIMIT?M=De.none:b>r2.HALF_CURL_START_LIMIT?M=De.half:M=De.full,M}function vn(e,t,n,o){let r;return o===Math.abs(e)?e>0?r=l0.horizontalLeft:r=l0.horizontalRight:o===Math.abs(t)?t>0?r=l0.horizontalLeft:r=l0.horizontalRight:n>0?r=l0.horizontalLeft:r=l0.horizontalRight,r}function Rn(e,t,n,o){let r;return o===Math.abs(e)?e<0?r=l0.verticalDown:r=l0.verticalUp:o===Math.abs(t)?t<0?r=l0.verticalDown:r=l0.verticalUp:n<0?r=l0.verticalDown:r=l0.verticalUp,r}function vA(e,t,n,o,r,s,A,a){let l,c=Rn(e,t,n,o),x=vn(r,s,A,a);return c===l0.verticalUp?x===l0.horizontalLeft?l=l0.diagonalUpLeft:l=l0.diagonalUpRight:x===l0.horizontalLeft?l=l0.diagonalDownLeft:l=l0.diagonalDownRight,l}function RA(e,t,n,o){let r=e[0]-t[0],s=e[0]-n[0],A=t[0]-n[0],a=e[1]-t[1],l=e[1]-n[1],c=t[1]-n[1],x=Math.max(Math.abs(r),Math.abs(s),Math.abs(A)),i=Math.max(Math.abs(a),Math.abs(l),Math.abs(c)),y=0,d=0,p=0,f=i/(x+1e-5);f>1.5?y+=r2.DISTANCE_VOTE_POWER:f>.66?d+=r2.DISTANCE_VOTE_POWER:p+=r2.DISTANCE_VOTE_POWER;let b=Math.sqrt(r*r+a*a),M=Math.sqrt(s*s+l*l),T=Math.sqrt(A*A+c*c),m=Math.max(b,M,T),h=e[0],S=e[1],P=n[0],I=n[1];m===b?(P=n[0],I=n[1]):m===T&&(h=t[0],S=t[1]);let G=Tn([h,S],[P,I]),$=gn(G,r2.TOTAL_ANGLE_VOTE_POWER);y+=$[0],d+=$[1],p+=$[2];for(let R of o){let Z=gn(R,r2.SINGLE_ANGLE_VOTE_POWER);y+=Z[0],d+=Z[1],p+=Z[2]}let s0;return y===Math.max(y,d,p)?s0=Rn(l,a,c,i):p===Math.max(d,p)?s0=vn(s,r,A,x):s0=vA(l,a,c,i,s,r,A,x),s0}function Mn(e){let t=[],n=[],o=[],r=[];if(!e)return{curls:o,directions:r};for(let s of W0.all){let A=W0.getPoints(s),a=[],l=[];for(let c of A){let x=e[c[0]],i=e[c[1]],y=Tn(x,i),d=y[0],p=y[1];a.push(d),l.push(p)}t.push(a),n.push(l)}for(let s of W0.all){let A=s===W0.thumb?1:0,a=W0.getPoints(s),l=e[a[A][0]],c=e[a[A+1][1]],x=e[a[3][1]],i=TA(l,c,x),y=RA(l,c,x,t[s].slice(A));o[s]=i,r[s]=y}return{curls:o,directions:r}}function gt(e){if(!e||e.length===0)return null;let t=Mn(e),n={};for(let o of W0.all)n[W0.getName(o)]={curl:De.getName(t.curls[o]),direction:l0.getName(t.directions[o])};return n}function Pn(e){let t=[];if(!e||e.length===0)return t;let n=Mn(e);for(let o of hn){let r=o.matchAgainst(n.curls,n.directions);r>=gA&&t.push({name:o.name,confidence:r})}return t}var kn=e=>{if(!e)return[];let t=[];for(let n=0;nl.part==="leftWrist"),r=e[n].keypoints.find(l=>l.part==="rightWrist"),s=e[n].keypoints.find(l=>l.part==="nose");s&&o&&r&&o.position[1]l.part==="leftShoulder"),a=e[n].keypoints.find(l=>l.part==="rightShoulder");A&&a&&Math.abs(A.positionRaw[1]-a.positionRaw[1])>.1&&t.push({body:n,gesture:`leaning ${A.position[1]>a.position[1]?"left":"right"}`})}return t},wn=e=>{if(!e)return[];let t=[];for(let n=0;n450){let o=(e[n].mesh[33][2]||0)-(e[n].mesh[263][2]||0),r=e[n].mesh[33][0]-e[n].mesh[263][0];Math.abs(o/r)<=.15?t.push({face:n,gesture:"facing center"}):t.push({face:n,gesture:`facing ${o<0?"left":"right"}`}),Math.abs(e[n].mesh[374][1]-e[n].mesh[386][1])/Math.abs(e[n].mesh[443][1]-e[n].mesh[450][1])<.2&&t.push({face:n,gesture:"blink left eye"}),Math.abs(e[n].mesh[145][1]-e[n].mesh[159][1])/Math.abs(e[n].mesh[223][1]-e[n].mesh[230][1])<.2&&t.push({face:n,gesture:"blink right eye"});let a=Math.min(100,500*Math.abs(e[n].mesh[13][1]-e[n].mesh[14][1])/Math.abs(e[n].mesh[10][1]-e[n].mesh[152][1]));a>10&&t.push({face:n,gesture:`mouth ${Math.trunc(a)}% open`});let l=e[n].mesh[152][2]||0;Math.abs(l)>10&&t.push({face:n,gesture:`head ${l<0?"up":"down"}`})}return t},En=e=>{var n,o,r,s;if(!e)return[];let t=[];for(let A=0;A.06||b>.06)&&(d=!1),f>b?f>.05&&t.push({iris:A,gesture:"looking right"}):b>.05&&t.push({iris:A,gesture:"looking left"});let M=Math.abs(e[A].mesh[145][1]-e[A].annotations.rightEyeIris[0][1])/e[A].box[3],T=Math.abs(e[A].mesh[374][1]-e[A].annotations.leftEyeIris[0][1])/e[A].box[3];(T<.01||M<.01||T>.022||M>.022)&&(d=!1),(T<.01||M<.01)&&t.push({iris:A,gesture:"looking down"}),(T>.022||M>.022)&&t.push({iris:A,gesture:"looking up"}),d&&t.push({iris:A,gesture:"looking center"})}return t},zn=e=>{if(!e)return[];let t=[];for(let n=0;n0){let r=o.reduce((A,a)=>(A.position[2]||0)<(a.position[2]||0)?A:a);t.push({hand:n,gesture:`${r.name} forward`});let s=o.reduce((A,a)=>A.position[1][s[0]*t[0],s[1]*t[1]]);return{startPoint:n,endPoint:o,palmLandmarks:r,confidence:e.confidence}}function vt(e,t=1.5){let n=N2(e),o=Tt(e),r=[t*o[0]/2,t*o[1]/2],s=[n[0]-r[0],n[1]-r[1]],A=[n[0]+r[0],n[1]+r[1]];return{startPoint:s,endPoint:A,palmLandmarks:e.palmLandmarks}}function Rt(e){let t=N2(e),n=Tt(e),r=Math.max(...n)/2,s=[t[0]-r,t[1]-r],A=[t[0]+r,t[1]+r];return{startPoint:s,endPoint:A,palmLandmarks:e.palmLandmarks}}function PA(e){return e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI))}function Ln(e,t){let n=Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]);return PA(n)}var Sn=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]];function Ge(e,t){let n=0;for(let o=0;o[A.x,A.y]),this.anchorsTensor=W.tensor2d(this.anchors),this.inputSize=((s=(r=(o=(n=this==null?void 0:this.model)==null?void 0:n.inputs)==null?void 0:o[0])==null?void 0:r.shape)==null?void 0:s[2])||0,this.inputSizeTensor=W.tensor1d([this.inputSize,this.inputSize]),this.doubleInputSizeTensor=W.tensor1d([this.inputSize*2,this.inputSize*2])}normalizeBoxes(t){let n={};n.boxOffsets=W.slice(t,[0,0],[-1,2]),n.boxSizes=W.slice(t,[0,2],[-1,2]),n.div=W.div(n.boxOffsets,this.inputSizeTensor),n.boxCenterPoints=W.add(n.div,this.anchorsTensor),n.halfBoxSizes=W.div(n.boxSizes,this.doubleInputSizeTensor),n.sub=W.sub(n.boxCenterPoints,n.halfBoxSizes),n.startPoints=W.mul(n.sub,this.inputSizeTensor),n.add=W.add(n.boxCenterPoints,n.halfBoxSizes),n.endPoints=W.mul(n.add,this.inputSizeTensor);let o=W.concat2d([n.startPoints,n.endPoints],1);return Object.keys(n).forEach(r=>W.dispose(n[r])),o}normalizeLandmarks(t,n){let o={};o.reshape=W.reshape(t,[-1,7,2]),o.div=W.div(o.reshape,this.inputSizeTensor),o.landmarks=W.add(o.div,this.anchors[n]?this.anchors[n]:0);let r=W.mul(o.landmarks,this.inputSizeTensor);return Object.keys(o).forEach(s=>W.dispose(o[s])),r}async predict(t,n){var a;let o={};o.resize=W.image.resizeBilinear(t,[this.inputSize,this.inputSize]),o.div=W.div(o.resize,C.tf127),o.image=W.sub(o.div,C.tf1),o.batched=this.model.execute(o.image),o.predictions=W.squeeze(o.batched),o.slice=W.slice(o.predictions,[0,0],[-1,1]),o.sigmoid=W.sigmoid(o.slice),o.scores=W.squeeze(o.sigmoid);let r=await o.scores.data();o.boxes=W.slice(o.predictions,[0,1],[-1,4]),o.norm=this.normalizeBoxes(o.boxes),o.nms=await W.image.nonMaxSuppressionAsync(o.norm,o.scores,3*(((a=n.hand)==null?void 0:a.maxDetected)||1),n.hand.iouThreshold,n.hand.minConfidence);let s=await o.nms.array(),A=[];for(let l of s){let c={};c.box=W.slice(o.norm,[l,0],[1,-1]),c.slice=W.slice(o.predictions,[l,5],[1,14]),c.norm=this.normalizeLandmarks(c.slice,l),c.palmLandmarks=W.reshape(c.norm,[-1,2]);let x=await c.box.data(),i=x.slice(0,2),y=x.slice(2,4),d=await c.palmLandmarks.array(),p={startPoint:i,endPoint:y,palmLandmarks:d,confidence:r[l]},f=On(p,[(t.shape[2]||1)/this.inputSize,(t.shape[1]||0)/this.inputSize]);A.push(f),Object.keys(c).forEach(b=>W.dispose(c[b]))}return Object.keys(o).forEach(l=>W.dispose(o[l])),A}};var q0=V(H());var zA=5,Fn=1.65,Bn=[0,5,9,13,17,1,2],SA=0,jA=2,Hn=0,Pt=class{constructor(t,n){k(this,"handDetector");k(this,"handPoseModel");k(this,"inputSize");k(this,"storedBoxes");k(this,"skipped");k(this,"detectedHands");var o,r,s;this.handDetector=t,this.handPoseModel=n,this.inputSize=((s=(r=(o=this.handPoseModel)==null?void 0:o.inputs)==null?void 0:r[0].shape)==null?void 0:s[2])||0,this.storedBoxes=[],this.skipped=Number.MAX_SAFE_INTEGER,this.detectedHands=0}calculateLandmarksBoundingBox(t){let n=t.map(A=>A[0]),o=t.map(A=>A[1]),r=[Math.min(...n),Math.min(...o)],s=[Math.max(...n),Math.max(...o)];return{startPoint:r,endPoint:s}}getBoxForPalmLandmarks(t,n){let o=t.map(s=>U5([...s,1],n)),r=this.calculateLandmarksBoundingBox(o);return vt(Rt(r),zA)}getBoxForHandLandmarks(t){let n=this.calculateLandmarksBoundingBox(t),o=vt(Rt(n),Fn);o.palmLandmarks=[];for(let r=0;r[A[0]*(d[0]-this.inputSize/2),A[1]*(d[1]-this.inputSize/2),A[2]*d[2]]),l=q5(o,[0,0]),c=a.map(d=>[...U5(d,l),d[2]]),x=Cn(r),i=[...N2(n),1],y=[Ge(i,x[0]),Ge(i,x[1])];return c.map(d=>[Math.trunc(d[0]+y[0]),Math.trunc(d[1]+y[1]),Math.trunc(d[2])])}async estimateHands(t,n){let o=!1,r,s=(n.hand.skipTime||0)>g()-Hn,A=this.skipped<(n.hand.skipFrames||0);n.skipAllowed&&s&&A&&(r=await this.handDetector.predict(t,n),this.skipped=0),n.skipAllowed&&this.skipped++,r&&r.length>0&&(r.length!==this.detectedHands&&this.detectedHands!==n.hand.maxDetected||!n.hand.landmarks)&&(this.detectedHands=0,this.storedBoxes=[...r],this.storedBoxes.length>0&&(o=!0));let a=[];for(let l=0;l=n.hand.minConfidence/4){let S=q0.reshape(m,[-1,3]),P=await S.array();q0.dispose(m),q0.dispose(S);let I=this.transformRawCoords(P,f,x,p),q=this.getBoxForHandLandmarks(I);this.storedBoxes[l]={...q,confidence:h};let t0={landmarks:I,confidence:h,boxConfidence:c.confidence,fingerConfidence:h,box:{topLeft:q.startPoint,bottomRight:q.endPoint}};a.push(t0)}else this.storedBoxes[l]=null;q0.dispose(m)}else{let x=vt(Rt(c),Fn),i={confidence:c.confidence,boxConfidence:c.confidence,fingerConfidence:0,box:{topLeft:x.startPoint,bottomRight:x.endPoint},landmarks:[]};a.push(i)}}return this.storedBoxes=this.storedBoxes.filter(l=>l!==null),this.detectedHands=a.length,a.length>n.hand.maxDetected&&(a.length=n.hand.maxDetected),a}};var Gn={thumb:[1,2,3,4],index:[5,6,7,8],middle:[9,10,11,12],ring:[13,14,15,16],pinky:[17,18,19,20],palm:[0]},s2,A2,Vn;async function Y5(e,t){let n=await Vn.estimateHands(e,t);if(!n)return[];let o=[];for(let r=0;rn[r].landmarks[i]);let A=n[r].landmarks,a=[Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER,0,0],l=[0,0,0,0];if(A&&A.length>0){for(let x of A)x[0]a[2]&&(a[2]=x[0]),x[1]>a[3]&&(a[3]=x[1]);a[2]-=a[0],a[3]-=a[1],l=[a[0]/(e.shape[2]||0),a[1]/(e.shape[1]||0),a[2]/(e.shape[2]||0),a[3]/(e.shape[1]||0)]}else a=n[r].box?[Math.trunc(Math.max(0,n[r].box.topLeft[0])),Math.trunc(Math.max(0,n[r].box.topLeft[1])),Math.trunc(Math.min(e.shape[2]||0,n[r].box.bottomRight[0])-Math.max(0,n[r].box.topLeft[0])),Math.trunc(Math.min(e.shape[1]||0,n[r].box.bottomRight[1])-Math.max(0,n[r].box.topLeft[1]))]:[0,0,0,0],l=[n[r].box.topLeft[0]/(e.shape[2]||0),n[r].box.topLeft[1]/(e.shape[1]||0),(n[r].box.bottomRight[0]-n[r].box.topLeft[0])/(e.shape[2]||0),(n[r].box.bottomRight[1]-n[r].box.topLeft[1])/(e.shape[1]||0)];let c=gt(A);o.push({id:r,score:Math.round(100*n[r].confidence)/100,boxScore:Math.round(100*n[r].boxConfidence)/100,fingerScore:Math.round(100*n[r].fingerConfidence)/100,label:"hand",box:a,boxRaw:l,keypoints:A,annotations:s,landmarks:c})}return o}async function Zn(e){var n,o;v.initial&&(s2=null,A2=null),!s2||!A2?[s2,A2]=await Promise.all([e.hand.enabled?O((n=e.hand.detector)==null?void 0:n.modelPath):null,e.hand.landmarks?O((o=e.hand.skeleton)==null?void 0:o.modelPath):null]):(e.debug&&u("cached model:",s2.modelUrl),e.debug&&u("cached model:",A2.modelUrl));let t=s2?new Mt(s2):void 0;return t&&A2&&(Vn=new Pt(t,A2)),[s2,A2]}var Q=V(H());var y0=[null,null],IA=["StatefulPartitionedCall/Postprocessor/Slice","StatefulPartitionedCall/Postprocessor/ExpandDims_1"],Ve=[[0,0],[0,0]],OA=["hand","fist","pinch","point","face","tip","pinchtip"],qn=4,Un=1.6,LA=512,CA=1.4,kt=Number.MAX_SAFE_INTEGER,K5=0,Me=[0,0],x0={boxes:[],hands:[]},Yn={thumb:[1,2,3,4],index:[5,6,7,8],middle:[9,10,11,12],ring:[13,14,15,16],pinky:[17,18,19,20],base:[0],palm:[0,17,13,9,5,1,0]};async function Kn(e){var t;if(v.initial&&(y0[0]=null),y0[0])e.debug&&u("cached model:",y0[0].modelUrl);else{X2(["tensorlistreserve","enter","tensorlistfromtensor","merge","loopcond","switch","exit","tensorliststack","nextiteration","tensorlistsetitem","tensorlistgetitem","reciprocal","shape","split","where"],e),y0[0]=await O((t=e.hand.detector)==null?void 0:t.modelPath);let n=y0[0].executor?Object.values(y0[0].modelSignature.inputs):void 0;Ve[0][0]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[1].size):0,Ve[0][1]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[2].size):0}return y0[0]}async function Jn(e){var t;if(v.initial&&(y0[1]=null),y0[1])e.debug&&u("cached model:",y0[1].modelUrl);else{y0[1]=await O((t=e.hand.skeleton)==null?void 0:t.modelPath);let n=y0[1].executor?Object.values(y0[1].modelSignature.inputs):void 0;Ve[1][0]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[1].size):0,Ve[1][1]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[2].size):0}return y0[1]}async function WA(e,t){let n=[];if(!e||!y0[0])return n;let o={},r=(e.shape[2]||1)/(e.shape[1]||1),s=Math.min(Math.round((e.shape[1]||0)/8)*8,LA),A=Math.round(s*r/8)*8;o.resize=Q.image.resizeBilinear(e,[s,A]),o.cast=Q.cast(o.resize,"int32"),[o.rawScores,o.rawBoxes]=await y0[0].executeAsync(o.cast,IA),o.boxes=Q.squeeze(o.rawBoxes,[0,2]),o.scores=Q.squeeze(o.rawScores,[0]);let a=Q.unstack(o.scores,1);Q.dispose(a[qn]),a.splice(qn,1),o.filtered=Q.stack(a,1),Q.dispose(a),o.max=Q.max(o.filtered,1),o.argmax=Q.argMax(o.filtered,1);let l=0;o.nms=await Q.image.nonMaxSuppressionAsync(o.boxes,o.max,(t.hand.maxDetected||0)+1,t.hand.iouThreshold||0,t.hand.minConfidence||1);let c=await o.nms.data(),x=await o.max.data(),i=await o.argmax.data();for(let y of Array.from(c)){let d=Q.slice(o.boxes,y,1),p=await d.data();Q.dispose(d);let f=[p[1],p[0],p[3]-p[1],p[2]-p[0]],b=et(f,CA),M=[Math.trunc(f[0]*Me[0]),Math.trunc(f[1]*Me[1]),Math.trunc(f[2]*Me[0]),Math.trunc(f[3]*Me[1])],T=x[y],m=OA[i[y]],h={id:l++,score:T,box:M,boxRaw:b,label:m};n.push(h)}return Object.keys(o).forEach(y=>Q.dispose(o[y])),n.sort((y,d)=>d.score-y.score),n.length>(t.hand.maxDetected||1)&&(n.length=t.hand.maxDetected||1),n}async function J5(e,t,n){let o={id:t.id,score:Math.round(100*t.score)/100,boxScore:Math.round(100*t.score)/100,fingerScore:0,box:t.box,boxRaw:t.boxRaw,label:t.label,keypoints:[],landmarks:{},annotations:{}};if(e&&y0[1]&&n.hand.landmarks&&t.score>(n.hand.minConfidence||0)){let r={},s=[t.boxRaw[1],t.boxRaw[0],t.boxRaw[3]+t.boxRaw[1],t.boxRaw[2]+t.boxRaw[0]];r.crop=Q.image.cropAndResize(e,[s],[0],[Ve[1][0],Ve[1][1]],"bilinear"),r.div=Q.div(r.crop,C.tf255),[r.score,r.keypoints]=y0[1].execute(r.div,["Identity_1","Identity"]);let A=(await r.score.data())[0],a=(100-Math.trunc(100/(1+Math.exp(A))))/100;if(a>=(n.hand.minConfidence||0)){o.fingerScore=a,r.reshaped=Q.reshape(r.keypoints,[-1,3]);let x=(await r.reshaped.array()).map(i=>[i[0]/Ve[1][1],i[1]/Ve[1][0],i[2]||0]).map(i=>[i[0]*t.boxRaw[2],i[1]*t.boxRaw[3],i[2]||0]);o.keypoints=x.map(i=>[Me[0]*(i[0]+t.boxRaw[0]),Me[1]*(i[1]+t.boxRaw[1]),i[2]||0]),o.landmarks=gt(o.keypoints);for(let i of Object.keys(Yn))o.annotations[i]=Yn[i].map(y=>o.landmarks&&o.keypoints[y]?o.keypoints[y]:null)}Object.keys(r).forEach(l=>Q.dispose(r[l]))}return o}async function Q5(e,t){var r,s;if(!((r=y0[0])!=null&&r.executor)||!((s=y0[1])!=null&&s.executor)||!y0[0].inputs[0].shape||!y0[1].inputs[0].shape)return[];Me=[e.shape[2]||0,e.shape[1]||0],kt++;let n=(t.hand.skipTime||0)>g()-K5,o=kt<(t.hand.skipFrames||0);return t.skipAllowed&&n&&o?x0.hands:new Promise(async A=>{let a=3*(t.hand.skipTime||0)>g()-K5,l=kt<3*(t.hand.skipFrames||0);t.skipAllowed&&x0.hands.length===t.hand.maxDetected?x0.hands=await Promise.all(x0.boxes.map(x=>J5(e,x,t))):t.skipAllowed&&a&&l&&x0.hands.length>0?x0.hands=await Promise.all(x0.boxes.map(x=>J5(e,x,t))):(x0.boxes=await WA(e,t),K5=g(),x0.hands=await Promise.all(x0.boxes.map(x=>J5(e,x,t))),kt=0);let c=[...x0.boxes];if(x0.boxes.length=0,t.cacheSensitivity>0)for(let x=0;x.05&&i.box[3]/(e.shape[1]||1)>.05&&x0.hands[x].fingerScore&&x0.hands[x].fingerScore>(t.hand.minConfidence||0)){let y=et(i.box,Un),d=et(i.boxRaw,Un);x0.boxes.push({...c[x],box:y,boxRaw:d})}}for(let x=0;x({face:[],body:[],hand:[],gesture:[],object:[],persons:[],performance:{},timestamp:0,width:0,height:0,error:e});var I2={};we(I2,{connected:()=>Et,horizontal:()=>_5,kpt:()=>wt,relative:()=>e1,vertical:()=>$5});var wt=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],_5=[["leftEye","rightEye"],["leftEar","rightEar"],["leftShoulder","rightShoulder"],["leftElbow","rightElbow"],["leftWrist","rightWrist"],["leftHip","rightHip"],["leftKnee","rightKnee"],["leftAnkle","rightAnkle"]],$5=[["leftKnee","leftShoulder"],["rightKnee","rightShoulder"],["leftAnkle","leftKnee"],["rightAnkle","rightKnee"]],e1=[[["leftHip","rightHip"],["leftShoulder","rightShoulder"]],[["leftElbow","rightElbow"],["leftShoulder","rightShoulder"]]],Et={leftLeg:["leftHip","leftKnee","leftAnkle"],rightLeg:["rightHip","rightKnee","rightAnkle"],torso:["leftShoulder","rightShoulder","rightHip","leftHip","leftShoulder"],leftArm:["leftShoulder","leftElbow","leftWrist"],rightArm:["rightShoulder","rightElbow","rightWrist"],head:[]};var w=ue(),t1=0;function _n(e,t){var A,a,l,c,x,i,y,d,p,f,b,M,T,m,h,S,P,I,q,t0,G,$,s0;let n=g();if(!e)return ue();let o=Date.now()-e.timestamp,r=o<1e3?8-Math.log(o+1):1;if(e.canvas&&(w.canvas=e.canvas),e.error&&(w.error=e.error),!w.body||e.body.length!==w.body.length)w.body=JSON.parse(JSON.stringify(e.body));else for(let R=0;R((r-1)*w.body[R].box[X]+B)/r),b0=e.body[R].boxRaw.map((B,X)=>((r-1)*w.body[R].boxRaw[X]+B)/r),U=e.body[R].keypoints.map((B,X)=>{var z,$0,Pe,ke,T0,M2,g1,T1,v1;return{score:B.score,part:B.part,position:[w.body[R].keypoints[X]?((r-1)*(w.body[R].keypoints[X].position[0]||0)+(B.position[0]||0))/r:B.position[0],w.body[R].keypoints[X]?((r-1)*(w.body[R].keypoints[X].position[1]||0)+(B.position[1]||0))/r:B.position[1],w.body[R].keypoints[X]?((r-1)*(w.body[R].keypoints[X].position[2]||0)+(B.position[2]||0))/r:B.position[2]],positionRaw:[w.body[R].keypoints[X]?((r-1)*(w.body[R].keypoints[X].positionRaw[0]||0)+(B.positionRaw[0]||0))/r:B.positionRaw[0],w.body[R].keypoints[X]?((r-1)*(w.body[R].keypoints[X].positionRaw[1]||0)+(B.positionRaw[1]||0))/r:B.positionRaw[1],w.body[R].keypoints[X]?((r-1)*(w.body[R].keypoints[X].positionRaw[2]||0)+(B.positionRaw[2]||0))/r:B.positionRaw[2]],distance:[w.body[R].keypoints[X]?((r-1)*(((z=w.body[R].keypoints[X].distance)==null?void 0:z[0])||0)+((($0=B.distance)==null?void 0:$0[0])||0))/r:(Pe=B.distance)==null?void 0:Pe[0],w.body[R].keypoints[X]?((r-1)*(((ke=w.body[R].keypoints[X].distance)==null?void 0:ke[1])||0)+(((T0=B.distance)==null?void 0:T0[1])||0))/r:(M2=B.distance)==null?void 0:M2[1],w.body[R].keypoints[X]?((r-1)*(((g1=w.body[R].keypoints[X].distance)==null?void 0:g1[2])||0)+(((T1=B.distance)==null?void 0:T1[2])||0))/r:(v1=B.distance)==null?void 0:v1[2]]}}),g0={},f0={connected:{}};(A=t.body.modelPath)!=null&&A.includes("efficientpose")?f0=ot:(a=t.body.modelPath)!=null&&a.includes("blazepose")?f0=_2:(l=t.body.modelPath)!=null&&l.includes("movenet")&&(f0=I2);for(let[B,X]of Object.entries(f0.connected)){let z=[];for(let $0=0;$0T0.part===X[$0]),ke=U.find(T0=>T0.part===X[$0+1]);Pe&&ke&&z.push([Pe.position,ke.position])}g0[B]=z}w.body[R]={...e.body[R],box:Z,boxRaw:b0,keypoints:U,annotations:g0}}if(!w.hand||e.hand.length!==w.hand.length)w.hand=JSON.parse(JSON.stringify(e.hand));else for(let R=0;R((r-1)*w.hand[R].box[B]+f0)/r),b0=e.hand[R].boxRaw.map((f0,B)=>((r-1)*w.hand[R].boxRaw[B]+f0)/r);w.hand[R].keypoints.length!==e.hand[R].keypoints.length&&(w.hand[R].keypoints=e.hand[R].keypoints);let U=e.hand[R].keypoints&&e.hand[R].keypoints.length>0?e.hand[R].keypoints.map((f0,B)=>f0.map((X,z)=>((r-1)*(w.hand[R].keypoints[B][z]||1)+(X||0))/r)):[],g0={};if(Object.keys(w.hand[R].annotations).length!==Object.keys(e.hand[R].annotations).length)w.hand[R].annotations=e.hand[R].annotations,g0=w.hand[R].annotations;else if(e.hand[R].annotations)for(let f0 of Object.keys(e.hand[R].annotations))g0[f0]=(i=(x=(c=e.hand[R])==null?void 0:c.annotations)==null?void 0:x[f0])!=null&&i[0]?e.hand[R].annotations[f0].map((B,X)=>B.map((z,$0)=>((r-1)*w.hand[R].annotations[f0][X][$0]+z)/r)):null;w.hand[R]={...e.hand[R],box:Z,boxRaw:b0,keypoints:U,annotations:g0}}if(!w.face||e.face.length!==w.face.length)w.face=JSON.parse(JSON.stringify(e.face));else for(let R=0;R((r-1)*w.face[R].box[g0]+U)/r),b0=e.face[R].boxRaw.map((U,g0)=>((r-1)*w.face[R].boxRaw[g0]+U)/r);if(e.face[R].rotation){let U={matrix:[0,0,0,0,0,0,0,0,0],angle:{roll:0,yaw:0,pitch:0},gaze:{bearing:0,strength:0}};U.matrix=(y=e.face[R].rotation)==null?void 0:y.matrix,U.angle={roll:((r-1)*(((p=(d=w.face[R].rotation)==null?void 0:d.angle)==null?void 0:p.roll)||0)+(((b=(f=e.face[R].rotation)==null?void 0:f.angle)==null?void 0:b.roll)||0))/r,yaw:((r-1)*(((T=(M=w.face[R].rotation)==null?void 0:M.angle)==null?void 0:T.yaw)||0)+(((h=(m=e.face[R].rotation)==null?void 0:m.angle)==null?void 0:h.yaw)||0))/r,pitch:((r-1)*(((P=(S=w.face[R].rotation)==null?void 0:S.angle)==null?void 0:P.pitch)||0)+(((q=(I=e.face[R].rotation)==null?void 0:I.angle)==null?void 0:q.pitch)||0))/r},U.gaze={bearing:((r-1)*(((t0=w.face[R].rotation)==null?void 0:t0.gaze.bearing)||0)+(((G=e.face[R].rotation)==null?void 0:G.gaze.bearing)||0))/r,strength:((r-1)*((($=w.face[R].rotation)==null?void 0:$.gaze.strength)||0)+(((s0=e.face[R].rotation)==null?void 0:s0.gaze.strength)||0))/r},w.face[R]={...e.face[R],rotation:U,box:Z,boxRaw:b0}}else w.face[R]={...e.face[R],box:Z,boxRaw:b0}}if(!w.object||e.object.length!==w.object.length)w.object=JSON.parse(JSON.stringify(e.object));else for(let R=0;R((r-1)*w.object[R].box[g0]+U)/r),b0=e.object[R].boxRaw.map((U,g0)=>((r-1)*w.object[R].boxRaw[g0]+U)/r);w.object[R]={...e.object[R],box:Z,boxRaw:b0}}if(e.persons){let R=e.persons;if(!w.persons||R.length!==w.persons.length)w.persons=JSON.parse(JSON.stringify(R));else for(let Z=0;Z((r-1)*w.persons[Z].box[U]+b0)/r)}e.gesture&&(w.gesture=e.gesture),w.width=e.width,w.height=e.height;let s=g();return t1=v.perfadd?t1+Math.round(s-n):Math.round(s-n),e.performance&&(w.performance={...e.performance,interpolate:t1}),w}var r0=V(H());var j0;async function n1(e){return!j0||v.initial?j0=await O(e.segmentation.modelPath):e.debug&&u("cached model:",j0.modelUrl),j0}async function $n(e,t){var r;if(j0||(j0=await n1(t)),!(j0!=null&&j0.executor)||!((r=j0==null?void 0:j0.inputs)!=null&&r[0].shape))return null;let n={};n.resize=r0.image.resizeBilinear(e,[j0.inputs[0].shape?j0.inputs[0].shape[1]:0,j0.inputs[0].shape?j0.inputs[0].shape[2]:0],!1),n.norm=r0.div(n.resize,C.tf255),n.res=j0.execute(n.norm),n.squeeze=r0.squeeze(n.res,[0]),[n.bgRaw,n.fgRaw]=r0.unstack(n.squeeze,2),n.fg=r0.softmax(n.fgRaw),n.mul=r0.mul(n.fg,C.tf255),n.expand=r0.expandDims(n.mul,2),n.output=r0.image.resizeBilinear(n.expand,[e.shape[1]||0,e.shape[2]||0]);let o;switch(t.segmentation.mode||"default"){case"default":n.input=r0.squeeze(e),n.concat=r0.concat([n.input,n.output],-1),o=r0.cast(n.concat,"int32");break;case"alpha":o=r0.cast(n.output,"int32");break;default:o=r0.tensor(0)}return Object.keys(n).forEach(s=>r0.dispose(n[s])),o}var zt={};we(zt,{distance:()=>o1,find:()=>BA,similarity:()=>FA});function o1(e,t,n={order:2,multiplier:25}){if(!e||!e)return Number.MAX_SAFE_INTEGER;let o=0;for(let r=0;r{if(e===0)return 1;let s=(1-(t===2?Math.sqrt(e):e**(1/t))/100-n)/(o-n);return Math.max(Math.min(s,1),0)};function FA(e,t,n={order:2,multiplier:25,min:.2,max:.8}){let o=o1(e,t,n);return to(o,n.order||2,n.min||0,n.max||1)}function BA(e,t,n={order:2,multiplier:25,threshold:0,min:.2,max:.8}){if(!Array.isArray(e)||!Array.isArray(t)||e.length<64||t.length===0)return{index:-1,distance:Number.POSITIVE_INFINITY,similarity:0};let o=Number.MAX_SAFE_INTEGER,r=-1;for(let A=0;AC2,validateModel:()=>Ct});var Ao=V(H());var Ze=V(H());var no=.005,U0={keypoints:[],padding:[[0,0],[0,0],[0,0],[0,0]]};function r1(e){for(let t of _5){let n=e.keypoints.findIndex(r=>r.part===t[0]),o=e.keypoints.findIndex(r=>r.part===t[1]);if(e.keypoints[n]&&e.keypoints[o]&&e.keypoints[n].position[0]r&&r.part===t[0]),o=e.keypoints.findIndex(r=>r&&r.part===t[1]);e.keypoints[n]&&e.keypoints[o]&&e.keypoints[n].position[1]c&&c.part===t[0]),r=e.keypoints.findIndex(c=>c&&c.part===t[1]),s=e.keypoints.findIndex(c=>c&&c.part===n[0]),A=e.keypoints.findIndex(c=>c&&c.part===n[1]);if(!e.keypoints[s]||!e.keypoints[A])continue;let a=e.keypoints[o]?[Math.abs(e.keypoints[s].position[0]-e.keypoints[o].position[0]),Math.abs(e.keypoints[A].position[0]-e.keypoints[o].position[0])]:[0,0],l=e.keypoints[r]?[Math.abs(e.keypoints[A].position[0]-e.keypoints[r].position[0]),Math.abs(e.keypoints[s].position[0]-e.keypoints[r].position[0])]:[0,0];if(a[0]>a[1]||l[0]>l[1]){let c=e.keypoints[o];e.keypoints[o]=e.keypoints[r],e.keypoints[r]=c}}}function oo(e){for(let t=0;te.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0,e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0],[e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0,e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0],[0,0]],n.pad=Ze.pad(e,U0.padding),n.resize=Ze.image.resizeBilinear(n.pad,[t,t]);let o=Ze.cast(n.resize,"int32");return Object.keys(n).forEach(A=>Ze.dispose(n[A])),o}function so(e,t){e.keypoints=e.keypoints.filter(o=>o==null?void 0:o.position);for(let o of e.keypoints)o.position=[o.position[0]*(t[0]+U0.padding[2][0]+U0.padding[2][1])/t[0]-U0.padding[2][0],o.position[1]*(t[1]+U0.padding[1][0]+U0.padding[1][1])/t[1]-U0.padding[1][0]],o.positionRaw=[o.position[0]/t[0],o.position[1]/t[1]];let n=ge(e.keypoints.map(o=>o.position),t);return e.box=n.box,e.boxRaw=n.boxRaw,e}var u0,St=0,s1=Number.MAX_SAFE_INTEGER,a2={boxes:[],bodies:[],last:0};async function ao(e){var t;return v.initial&&(u0=null),u0?e.debug&&u("cached model:",u0.modelUrl):(X2(["size"],e),u0=await O(e.body.modelPath)),St=(u0==null?void 0:u0.executor)&&((t=u0==null?void 0:u0.inputs)==null?void 0:t[0].shape)?u0.inputs[0].shape[2]:0,St<64&&(St=256),u0}function GA(e,t,n){let o=e[0][0],r=[],s=0;for(let x=0;xt.body.minConfidence){let i=[o[x][1],o[x][0]];r.push({score:Math.round(100*s)/100,part:wt[x],positionRaw:i,position:[Math.round((n.shape[2]||0)*i[0]),Math.round((n.shape[1]||0)*i[1])]})}s=r.reduce((x,i)=>i.score>x?i.score:x,0);let A=[],a=ge(r.map(x=>x.position),[n.shape[2],n.shape[1]]),l={};for(let[x,i]of Object.entries(Et)){let y=[];for(let d=0;db.part===i[d]),f=r.find(b=>b.part===i[d+1]);p&&f&&p.score>(t.body.minConfidence||0)&&f.score>(t.body.minConfidence||0)&&y.push([p.position,f.position])}l[x]=y}let c={id:0,score:s,box:a.box,boxRaw:a.boxRaw,keypoints:r,annotations:l};return r1(c),A.push(c),A}function VA(e,t,n){let o=[];for(let r=0;rt.body.minConfidence){let a=[];for(let i=0;i<17;i++){let y=s[3*i+2];if(y>t.body.minConfidence){let d=[s[3*i+1],s[3*i+0]];a.push({part:wt[i],score:Math.round(100*y)/100,positionRaw:d,position:[Math.round((n.shape[2]||0)*d[0]),Math.round((n.shape[1]||0)*d[1])]})}}let l=ge(a.map(i=>i.position),[n.shape[2],n.shape[1]]),c={};for(let[i,y]of Object.entries(Et)){let d=[];for(let p=0;pM.part===y[p]),b=a.find(M=>M.part===y[p+1]);f&&b&&f.score>(t.body.minConfidence||0)&&b.score>(t.body.minConfidence||0)&&d.push([f.position,b.position])}c[i]=d}let x={id:r,score:A,box:l.box,boxRaw:l.boxRaw,keypoints:[...a],annotations:c};r1(x),o.push(x)}}return o.sort((r,s)=>s.score-r.score),o.length>t.body.maxDetected&&(o.length=t.body.maxDetected),o}async function A1(e,t){var r;if(!(u0!=null&&u0.executor)||!((r=u0==null?void 0:u0.inputs)!=null&&r[0].shape))return[];t.skipAllowed||(a2.boxes.length=0),s1++;let n=(t.body.skipTime||0)>g()-a2.last,o=s1<(t.body.skipFrames||0);return t.skipAllowed&&n&&o?a2.bodies:new Promise(async s=>{let A={};s1=0,A.input=ro(e,St),A.res=u0==null?void 0:u0.execute(A.input),a2.last=g();let a=await A.res.array();a2.bodies=A.res.shape[2]===17?GA(a,t,e):VA(a,t,e);for(let l of a2.bodies)so(l,[e.shape[2]||1,e.shape[1]||1]),oo(l.keypoints);Object.keys(A).forEach(l=>Ao.dispose(A[l])),s(a2.bodies)})}var w0=V(H());var se,jt=[],lo=0,a1=Number.MAX_SAFE_INTEGER,It=0,Nt=2.5;async function co(e){if(!se||v.initial){se=await O(e.object.modelPath);let t=se!=null&&se.executor?Object.values(se.modelSignature.inputs):void 0;It=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):416}else e.debug&&u("cached model:",se.modelUrl);return se}async function ZA(e,t,n){var c,x;let o=0,r=[],s=It;for(let i of[1,2,4]){let y=i*13,d=w0.squeeze(e.find(m=>m.shape[1]===y**2&&(m.shape[2]||0)===d2.length)),p=await d.array(),f=w0.squeeze(e.find(m=>m.shape[1]===y**2&&(m.shape[2]||0)(n.object.minConfidence||0)&&h!==61){let P=(.5+Math.trunc(m%y))/y,I=(.5+Math.trunc(m/y))/y,q=T[m].map(U=>U*(y/i/s)),[t0,G]=[P-Nt/i*q[0],I-Nt/i*q[1]],[$,s0]=[P+Nt/i*q[2]-t0,I+Nt/i*q[3]-G],R=[t0,G,$,s0];R=R.map(U=>Math.max(0,Math.min(U,1)));let Z=[R[0]*t[0],R[1]*t[1],R[2]*t[0],R[3]*t[1]],b0={id:o++,score:Math.round(100*S)/100,class:h+1,label:d2[h].label,box:Z.map(U=>Math.trunc(U)),boxRaw:R};r.push(b0)}}w0.dispose([d,f,b,M])}let A=r.map(i=>[i.boxRaw[1],i.boxRaw[0],i.boxRaw[3],i.boxRaw[2]]),a=r.map(i=>i.score),l=[];if(A&&A.length>0){let i=await w0.image.nonMaxSuppressionAsync(A,a,n.object.maxDetected||0,n.object.iouThreshold,n.object.minConfidence);l=Array.from(await i.data()),w0.dispose(i)}return r=r.filter((i,y)=>l.includes(y)).sort((i,y)=>y.score-i.score),r}async function i1(e,t){if(!(se!=null&&se.executor))return[];let n=(t.object.skipTime||0)>g()-lo,o=a1<(t.object.skipFrames||0);return t.skipAllowed&&n&&o&&jt.length>0?(a1++,jt):(a1=0,!v.kernels.includes("mod")||!v.kernels.includes("sparsetodense")?jt:new Promise(async r=>{let s=[e.shape[2]||0,e.shape[1]||0],A=w0.image.resizeBilinear(e,[It,It],!1),a=w0.div(A,C.tf255),l=w0.transpose(a,[0,3,1,2]),c;t.object.enabled&&(c=se.execute(l)),lo=g();let x=await ZA(c,s,t);jt=x,w0.dispose([A,a,l,...c]),r(x)}))}var D0=V(H());var L2=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],XA=L2.length,O2=L2.reduce((e,t,n)=>(e[t]=n,e),{}),qA=[["leftHip","leftShoulder"],["leftElbow","leftShoulder"],["leftElbow","leftWrist"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["rightHip","rightShoulder"],["rightElbow","rightShoulder"],["rightElbow","rightWrist"],["rightHip","rightKnee"],["rightKnee","rightAnkle"],["leftShoulder","rightShoulder"],["leftHip","rightHip"]],Li=qA.map(([e,t])=>[O2[e],O2[t]]),yo=[["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 fo(e){let t=e.reduce(({maxX:n,maxY:o,minX:r,minY:s},{position:{x:A,y:a}})=>({maxX:Math.max(n,A),maxY:Math.max(o,a),minX:Math.min(r,A),minY:Math.min(s,a)}),{maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY,minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY});return[t.minX,t.minY,t.maxX-t.minX,t.maxY-t.minY]}function mo(e,[t,n],[o,r]){let s=t/o,A=n/r,a=(c,x)=>({id:x,score:c.score,boxRaw:[c.box[0]/r,c.box[1]/o,c.box[2]/r,c.box[3]/o],box:[Math.trunc(c.box[0]*A),Math.trunc(c.box[1]*s),Math.trunc(c.box[2]*A),Math.trunc(c.box[3]*s)],keypoints:c.keypoints.map(({score:i,part:y,position:d})=>({score:i,part:y,position:[Math.trunc(d.x*A),Math.trunc(d.y*s)],positionRaw:[d.x/o,d.y/o]})),annotations:{}});return e.map((c,x)=>a(c,x))}var Ot=class{constructor(t,n){k(this,"priorityQueue");k(this,"numberOfElements");k(this,"getElementValue");this.priorityQueue=new Array(t),this.numberOfElements=-1,this.getElementValue=n}enqueue(t){this.priorityQueue[++this.numberOfElements]=t,this.swim(this.numberOfElements)}dequeue(){let t=this.priorityQueue[0];return this.exchange(0,this.numberOfElements--),this.sink(0),this.priorityQueue[this.numberOfElements+1]=null,t}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(t){for(;t>0&&this.less(Math.floor(t/2),t);)this.exchange(t,Math.floor(t/2)),t=Math.floor(t/2)}sink(t){for(;2*t<=this.numberOfElements;){let n=2*t;if(nn?n:e}function po(e,t,n,o){let r=n-e,s=o-t;return r*r+s*s}function x1(e,t){return{x:e.x+t.x,y:e.y+t.y}}var Y0,YA=["MobilenetV1/offset_2/BiasAdd","MobilenetV1/heatmap_2/BiasAdd","MobilenetV1/displacement_fwd_2/BiasAdd","MobilenetV1/displacement_bwd_2/BiasAdd"],Lt=1,v2=16,KA=50**2;function uo(e,t,n,o,r,s,A=2){let a=M=>({y:s.get(M.y,M.x,e),x:s.get(M.y,M.x,s.shape[2]/2+e)}),l=(M,T,m)=>({y:d1(Math.round(M.y/v2),0,T-1),x:d1(Math.round(M.x/v2),0,m-1)}),[c,x]=o.shape,i=l(t.position,c,x),y=a(i),p=x1(t.position,y);for(let M=0;M[O2[y],O2[d]]),A=s.map(([,y])=>y),a=s.map(([y])=>y),l=t.shape[2],c=A.length,x=new Array(l),i=c1(e.part,v2,n);x[e.part.id]={score:e.score,part:L2[e.part.id],position:i};for(let y=c-1;y>=0;--y){let d=A[y],p=a[y];x[d]&&!x[p]&&(x[p]=uo(y,x[d],p,t,n,r))}for(let y=0;yt){a=!1;break}if(!a)break}return a}function _A(e,t){let[n,o,r]=t.shape,s=new Ot(n*o*r,({score:A})=>A);for(let A=0;A{var A;let s=(A=r[o])==null?void 0:A.position;return s?po(n,t,s.y,s.x)<=KA:!1})}function $A(e,t){return t.reduce((o,{position:r,score:s},A)=>(ho(e,r,A)||(o+=s),o),0)/t.length}function e4(e,t,n,o,r,s){let A=[],a=_A(s,t);for(;A.lengthd.score>s);let i=$A(A,x),y=fo(x);i>s&&A.push({keypoints:x,box:y,score:Math.round(100*i)/100})}return A}async function y1(e,t){if(!(Y0!=null&&Y0.executor))return[];let n=D0.tidy(()=>{if(!Y0.inputs[0].shape)return[];let A=D0.image.resizeBilinear(e,[Y0.inputs[0].shape[2],Y0.inputs[0].shape[1]]),a=D0.sub(D0.div(D0.cast(A,"float32"),127.5),1),c=Y0.execute(a,YA).map(x=>D0.squeeze(x,[0]));return c[1]=D0.sigmoid(c[1]),c}),o=await Promise.all(n.map(A=>A.buffer()));for(let A of n)D0.dispose(A);let r=e4(o[0],o[1],o[2],o[3],t.body.maxDetected,t.body.minConfidence);return Y0.inputs[0].shape?mo(r,[e.shape[1],e.shape[2]],[Y0.inputs[0].shape[2],Y0.inputs[0].shape[1]]):[]}async function bo(e){return!Y0||v.initial?Y0=await O(e.body.modelPath):e.debug&&u("cached model:",Y0.modelUrl),Y0}var F=V(H());var he,t4=["fgr","pha","r1o","r2o","r3o","r4o"],h0={},m1=0;function vo(e){F.dispose([h0.r1i,h0.r2i,h0.r3i,h0.r4i,h0.downsample_ratio]),h0.r1i=F.tensor(0),h0.r2i=F.tensor(0),h0.r3i=F.tensor(0),h0.r4i=F.tensor(0),m1=e.segmentation.ratio||.5,h0.downsample_ratio=F.tensor(m1)}async function p1(e){return!he||v.initial?he=await O(e.segmentation.modelPath):e.debug&&u("cached model:",he.modelUrl),vo(e),he}var To=e=>F.tidy(()=>{let t=F.squeeze(e,[0]),n=F.mul(t,C.tf255);return F.cast(n,"int32")});function f1(e,t){let n=e?To(e):F.fill([t.shape[1]||0,t.shape[2]||0,3],255,"int32"),o=t?To(t):F.fill([e.shape[1]||0,e.shape[2]||0,1],255,"int32"),r=F.concat([n,o],-1);return F.dispose([n,o]),r}function n4(e){return F.tidy(()=>{let t={};return t.unstack=F.unstack(e,-1),t.concat=F.concat(t.unstack,1),t.split=F.split(t.concat,4,1),t.stack=F.concat(t.split,2),t.squeeze=F.squeeze(t.stack,[0]),t.expand=F.expandDims(t.squeeze,-1),t.add=F.add(t.expand,1),t.mul=F.mul(t.add,127.5),t.cast=F.cast(t.mul,"int32"),t.tile=F.tile(t.cast,[1,1,3]),t.alpha=F.fill([t.tile.shape[0]||0,t.tile.shape[1]||0,1],255,"int32"),F.concat([t.tile,t.alpha],-1)})}async function Ro(e,t){if(he||(he=await p1(t)),!(he!=null&&he.executor))return null;h0.src=F.div(e,255),m1!==t.segmentation.ratio&&vo(t);let[n,o,r,s,A,a]=await he.executeAsync(h0,t4),l;switch(t.segmentation.mode||"default"){case"default":l=f1(n,o);break;case"alpha":l=f1(null,o);break;case"foreground":l=f1(n,null);break;case"state":l=n4(r);break;default:l=F.tensor(0)}return F.dispose([h0.src,n,o,h0.r1i,h0.r2i,h0.r3i,h0.r4i]),[h0.r1i,h0.r2i,h0.r3i,h0.r4i]=[r,s,A,a],l}var k0=V(H());var N0;async function u1(e){return!N0||v.initial?N0=await O(e.segmentation.modelPath):e.debug&&u("cached model:",N0.modelUrl),N0}async function Po(e,t){var r;if(N0||(N0=await u1(t)),!(N0!=null&&N0.executor)||!((r=N0==null?void 0:N0.inputs)!=null&&r[0].shape))return null;let n={};n.resize=k0.image.resizeBilinear(e,[N0.inputs[0].shape?N0.inputs[0].shape[1]:0,N0.inputs[0].shape?N0.inputs[0].shape[2]:0],!1),n.norm=k0.div(n.resize,C.tf255),n.res=N0.execute(n.norm),n.squeeze=k0.squeeze(n.res,[0]),n.alpha=k0.image.resizeBilinear(n.squeeze,[e.shape[1]||0,e.shape[2]||0]),n.mul=k0.mul(n.alpha,C.tf255);let o;switch(t.segmentation.mode||"default"){case"default":n.input=k0.squeeze(e),n.concat=k0.concat([n.input,n.mul],-1),o=k0.cast(n.concat,"int32");break;case"alpha":o=k0.cast(n.mul,"int32");break;default:o=k0.tensor(0)}return Object.keys(n).forEach(s=>k0.dispose(n[s])),o}function Ct(e,t,n){var c,x;if(!t||!((c=e==null?void 0:e.config)!=null&&c.validateModels))return null;let o=["const","placeholder","noop","pad","squeeze","add","sub","mul","div"],r=["biasadd","fusedbatchnormv3","matmul","switch","shape","merge","split","broadcastto"],s=[],A=[],a=t.modelUrl,l=t.executor;if((x=l==null?void 0:l.graph)!=null&&x.nodes)for(let i of Object.values(l.graph.nodes)){let y=i.op.toLowerCase();s.includes(y)||s.push(y)}else!l&&e.config.debug&&u("model not loaded",n);for(let i of s)!o.includes(i)&&!r.includes(i)&&!e.env.kernels.includes(i)&&!e.env.kernels.includes(i.replace("_",""))&&!e.env.kernels.includes(i.replace("native",""))&&!e.env.kernels.includes(i.replace("v2",""))&&A.push(i);return e.config.debug&&A.length>0&&u("model validation failed:",n,A),A.length>0?{name:n,missing:A,ops:s,url:a}:null}var C2=class{constructor(t){k(this,"instance");k(this,"models");this.models={},this.instance=t}stats(){let t=0,n=0,o=0;for(let s of Object.values(E0))t+=s.sizeFromManifest,n+=s.sizeLoadedWeights,o+=s.sizeDesired;let r=o>0?n/o:0;return{numLoadedModels:Object.values(E0).length,numDefinedModels:Object.keys(this.models).length,percentageLoaded:r,totalSizeFromManifest:t,totalSizeWeights:n,totalSizeLoading:o,modelStats:Object.values(E0)}}reset(){for(let t of Object.keys(this.models))this.models[t]=null}async load(){var n,o,r,s,A,a,l,c,x,i,y,d,p,f,b,M,T,m,h,S,P,I,q,t0,G,$,s0;v.initial&&this.reset();let t={};t.blazeface=this.instance.config.face.enabled&&!this.models.blazeface?p3(this.instance.config):null,t.antispoof=this.instance.config.face.enabled&&((n=this.instance.config.face.antispoof)==null?void 0:n.enabled)&&!this.models.antispoof?H3(this.instance.config):null,t.liveness=this.instance.config.face.enabled&&((o=this.instance.config.face.liveness)==null?void 0:o.enabled)&&!this.models.liveness?X3(this.instance.config):null,t.faceres=this.instance.config.face.enabled&&((r=this.instance.config.face.description)==null?void 0:r.enabled)&&!this.models.faceres?C3(this.instance.config):null,t.emotion=this.instance.config.face.enabled&&((s=this.instance.config.face.emotion)==null?void 0:s.enabled)&&!this.models.emotion?N3(this.instance.config):null,t.iris=this.instance.config.face.enabled&&((A=this.instance.config.face.iris)==null?void 0:A.enabled)&&!((a=this.instance.config.face.attention)!=null&&a.enabled)&&!this.models.iris?v3(this.instance.config):null,t.facemesh=this.instance.config.face.enabled&&((l=this.instance.config.face.mesh)==null?void 0:l.enabled)&&!this.models.facemesh?w3(this.instance.config):null,t.gear=this.instance.config.face.enabled&&((c=this.instance.config.face.gear)==null?void 0:c.enabled)&&!this.models.gear?K3(this.instance.config):null,t.ssrnetage=this.instance.config.face.enabled&&((x=this.instance.config.face.ssrnet)==null?void 0:x.enabled)&&!this.models.ssrnetage?$3(this.instance.config):null,t.ssrnetgender=this.instance.config.face.enabled&&((i=this.instance.config.face.ssrnet)==null?void 0:i.enabled)&&!this.models.ssrnetgender?on(this.instance.config):null,t.mobilefacenet=this.instance.config.face.enabled&&((y=this.instance.config.face.mobilefacenet)==null?void 0:y.enabled)&&!this.models.mobilefacenet?ln(this.instance.config):null,t.insightface=this.instance.config.face.enabled&&((d=this.instance.config.face.insightface)==null?void 0:d.enabled)&&!this.models.insightface?fn(this.instance.config):null,t.blazepose=this.instance.config.body.enabled&&!this.models.blazepose&&((p=this.instance.config.body.modelPath)==null?void 0:p.includes("blazepose"))?_1(this.instance.config):null,t.blazeposedetect=this.instance.config.body.enabled&&!this.models.blazeposedetect&&this.instance.config.body.detector&&this.instance.config.body.detector.modelPath?Q1(this.instance.config):null,t.efficientpose=this.instance.config.body.enabled&&!this.models.efficientpose&&((f=this.instance.config.body.modelPath)==null?void 0:f.includes("efficientpose"))?r3(this.instance.config):null,t.movenet=this.instance.config.body.enabled&&!this.models.movenet&&((b=this.instance.config.body.modelPath)==null?void 0:b.includes("movenet"))?ao(this.instance.config):null,t.posenet=this.instance.config.body.enabled&&!this.models.posenet&&((M=this.instance.config.body.modelPath)==null?void 0:M.includes("posenet"))?bo(this.instance.config):null,t.handtrack=this.instance.config.hand.enabled&&!this.models.handtrack&&((m=(T=this.instance.config.hand.detector)==null?void 0:T.modelPath)==null?void 0:m.includes("handtrack"))?Kn(this.instance.config):null,t.handskeleton=this.instance.config.hand.enabled&&this.instance.config.hand.landmarks&&!this.models.handskeleton&&((S=(h=this.instance.config.hand.detector)==null?void 0:h.modelPath)==null?void 0:S.includes("handtrack"))?Jn(this.instance.config):null,(I=(P=this.instance.config.hand.detector)==null?void 0:P.modelPath)!=null&&I.includes("handdetect")&&([t.handpose,t.handskeleton]=this.models.handpose?[null,null]:await Zn(this.instance.config)),t.centernet=this.instance.config.object.enabled&&!this.models.centernet&&((q=this.instance.config.object.modelPath)==null?void 0:q.includes("centernet"))?t3(this.instance.config):null,t.nanodet=this.instance.config.object.enabled&&!this.models.nanodet&&((t0=this.instance.config.object.modelPath)==null?void 0:t0.includes("nanodet"))?co(this.instance.config):null,t.selfie=this.instance.config.segmentation.enabled&&!this.models.selfie&&((G=this.instance.config.segmentation.modelPath)==null?void 0:G.includes("selfie"))?u1(this.instance.config):null,t.meet=this.instance.config.segmentation.enabled&&!this.models.meet&&(($=this.instance.config.segmentation.modelPath)==null?void 0:$.includes("meet"))?n1(this.instance.config):null,t.rvm=this.instance.config.segmentation.enabled&&!this.models.rvm&&((s0=this.instance.config.segmentation.modelPath)==null?void 0:s0.includes("rvm"))?p1(this.instance.config):null,await Promise.all([...Object.values(t)]);for(let R of Object.keys(t))this.models[R]=t[R]||this.models[R]||null}list(){let t=Object.keys(this.models).map(n=>{var o;return{name:n,loaded:this.models[n]!==null,size:0,url:this.models[n]?(o=this.models[n])==null?void 0:o.modelUrl:null}});for(let n of t){let o=Object.keys(E0).find(r=>r.startsWith(n.name));!o||(n.size=E0[o].sizeLoadedWeights,n.url=E0[o].url)}return t}loaded(){return this.list().filter(o=>o.loaded).map(o=>o.name)}validate(){let t=[];for(let n of Object.keys(this.models)){let o=this.models[n];if(!o)continue;let r=Ct(this.instance,o,n);r&&t.push(r)}return t}};function wo(e,t,n,o,r){var a,l,c,x,i,y;let s=0,A=[];for(let d of e){let p={id:s++,face:d,body:null,hands:{left:null,right:null},gestures:[],box:[0,0,0,0]};for(let h of t)d.box[0]>h.box[0]&&d.box[0]h.box[1]&&d.box[1]+d.box[3]p.body.box[0]&&h.box[0]+h.box[2]p.body.box[1]&&h.box[1]+h.box[3]p.body.box[0]&&h.box[1]+h.box[3]>p.body.box[1]&&h.box[1]+h.box[3]{h&&h.length===4&&(f.push(h[0],h[0]+h[2]),b.push(h[1],h[1]+h[3]))};M(p.face.box),M((x=p.body)==null?void 0:x.box),M((i=p.hands.left)==null?void 0:i.box),M((y=p.hands.right)==null?void 0:y.box);let T=Math.min(...f),m=Math.min(...b);p.box=[T,m,Math.max(...f)-T,Math.max(...b)-m],(r==null?void 0:r[1])&&(r==null?void 0:r[2])&&(p.boxRaw=[p.box[0]/r[2],p.box[1]/r[1],p.box[2]/r[2],p.box[3]/r[1]]),A.push(p)}return A}var c0=V(H());var Wt=` +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`,Dt=` +/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAsICAoIBwsKCQoNDAsNERwSEQ8PESIZGhQcKSQrKigk +JyctMkA3LTA9MCcnOEw5PUNFSElIKzZPVU5GVEBHSEX/2wBDAQwNDREPESESEiFFLicuRUVFRUVF +RUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUX/wAARCASwBLADASIA +AhEBAxEB/8QAGwABAAIDAQEAAAAAAAAAAAAAAAEDAgQFBgf/xABDEAEAAgECBAMECQIDBgUFAQAA +AQIDBBEFEiExE0FRBiJhcRQjMkJSgZGhsWLBJDNyFSVTY3OSNEPR4fAHFjWCokT/xAAYAQEAAwEA +AAAAAAAAAAAAAAAAAQIDBP/EACARAQEBAQADAQEBAQEBAAAAAAABAhEDITFBEjJRIhP/2gAMAwEA +AhEDEQA/APqYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAKNTq8OkxzfNkisQC8eb1XtRNbzXT4q7eU2nu0MntRq/D8StMccvW29ZmdvgjsTyvZjxOLj ++s8WLxn8TFPXs6Oj9oct7c14rkxz22nrB2I49KOdTjelmszfmpMeUxv/AA28OqwZ4icWWtt/SUi4 +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmdo3nsPNe0Pt +Fh09Z0+DNWL7+9O/7A3eJcZppsV5raI27esvH6jX5ddM25p79Ilo59VbUZOe2Tm/PeGvfPfT2iKR +PLv1+DO678XmW/a97U6TtOyzTbTF538/T9WjTNecm9a7126tqk3rSYxY5ta1plRZqZNXGjyZcPXl +mZmsx+qjBrsuO16xM7eXRt04JrdTltk5OWJnfaWf0a2lty5MdZnfzSn+WOHiOutFpjHa9e8bQ2fp ++alYy462pk7zXbuxjPesbRS0f6ZZV1ET1tErzXFLHo+A+1ddZf6NrI8PJHa1vN6iJi0bxMTHwfOa +zhzd61v1846utwniM6DUdb3nBaNrVmd9vjC/ZVePYirBqMWppz4rxaPgtEAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAItaK1m09ojcHnvarjM8P0vh49+a/eY8ng9D +h1fGM1rxjtGPfvbzdbjuTJxHX48cTPNltM/KsS9Dw7S49Jp6UpHaGe2vjz1y9J7LYK13vHWe7bj2 +ex1tvM80ekuxW3RnW3Vm6P5jRx8H0+OYmMcb+bapo8GKPdpC6bQwtdHU8JpWkdJ/JweL6e23iU67 +d4dubSqyVi9Zi0bwIs68XGp36TtEq7ZJmZmevzdbifCKWtbJinkt6eTgZPFw32t+sRurbWVzxs1y +Rv6T8V1NZNPtfq0seTm+Kevr+SZuxXjvaPiV8N4viycto9HseG6+uu08W6Rkj7UPmFck1tE1nlmP +Ld3eA8V8HVVi1pjq6Ma/pnqce/ERMTETHaUrKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAADW19+TQ5p/p2bLS4v04Zmt5VjeQeJ4bjnLqsupv+Ka1+ERLv4reTmcNxcuC +vy3l0qdI2hlr66sT02ot0ZV7qqrInruzrVZLGSZ37JjqgYTG0K5lbaFVhDT1Ub456RPweY4hixWi +eSdpjvD1eWejz3FNHWYtkpvFo9EIseb3tS3SerOms22rfpPqZKzvvHSYUz70TExG6Gdbs2rljeJ/ +Mx5L0vEzPaelnOi98c9J2bFNTFpit47+a+PVUvx9T9nOIfT+GV5p3yY/ds67wvsXqpxau+G09Lx+ +r3TqrEAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADV4ljnLw3U0jvO +O0fs2lWqyUw6XLkyfYrWZkHldBEV09eveG3Fq1mI3jd4vPrOIaid8G9MP3Y38k6fNrt/rMk9Ou8s +tfXXn49rGWInuy8SO/k5Gl1E3rG/fzbOe94wTy99mbRvTrMOOvNfJWsesywniukrG/jU6fF43WYN +TmtEeJtEQ06aSmK2+bNtEd+qfSO17unF9Hmvy1y13XWyVmN4tExLxVK8PmNq5NrT58zawam+m/yc +0Xj8NpRYSvQZ7xEOdqI3rPozxayNRXe0ct/ON03jmrKB5nV4q1yTO20Obmv4c+cx8HoeI6WZpNoj +q83niYmYscU0r8aJ6T1n49zeJ+Meqm1drb9J+Kd5p136StGVem9l9TbHxLDFp7W7+sS+q1nesT6w ++PcAzVjiGHftzQ+v4f8AJpv6On8jH9ZgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAABp8VrW/C9TW0ztOO3b5Nxp8VmI4bn37TWYB8f1HFtTfUfR9FWJmsdZ9I7MtJxDX5s +d8ta1y0xzteaR2277rcuhycP12SceLxMeWNpjttHwlu8I0mfQ1y+D7k5YmJmY36T36Ka43z/AF1t +cI1ds+qxVj7/AEej19PCw9HJ4NoK4OIU5Y35YmZdzVTGebVZabx5jJS+Tmns81rNLm1Wrzc9rVw4 +Yibbem72mXTTS0w0M3BvEta1bWrM95ie5EanY87wXgNOL6XPfxraXLhra/W28bR/dzYzarBqJxRe +bzE7Rt5vWU9n8mPHOGmS0Ypnea1naJb+k9ncNLR7u2y/WcxXO4TOoyUrN6zD0FaW5Y3hu49FiwUi +KxCvLMR0hlW0jn6ukWw3iXjOJzbDlneOj3GaN6zDzfFOH+LE7SRGo83XNSZ2lbG2/WfdlvaT2cy6 +rNFInlrv1mfJ37cK4PwTTxOoidRm2+/2/KFuyMp47XB4LivXiunrH2b2iH2qn2K/J8x4fGDNxTSZ +9Nh8OviRvTyfT6xtWI+DeXs9MNZubypASqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAOZx6/LoOWPvWiHTcf2hiZ0e8fc2mf1E5+vP/AEeuSd7RC2uKtI6QjHfeINTfwtPf +Jvty9WPfbt/lucP03gxfJf7d/wBoReYpm97zaNeLb4Ims9Nt94auDjem1Wo5PFi1onylS+1o7l8V +bxvtupjDMdNkYtXS1+Stt+m63xImEJ4xjHER2ZxMUjeUTO3VRmydBbjLJqPi08mbeVOXJPq1sl5Q +Vbkz9+rRy35rxHqzmZlVEe/Ez5LRlW5iyfR6zffaIjq1OSNZps2a21rZInafSPJhxGMl9LStLRWM +lorM/A4dkrWbYfLZC2W/7K6eubX6b4RzT+W76K8b7G6X62cu3Sten59nsm3j+OXz3/0ANGIAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0OIYfpOHPijvNNo+fdvtXJO18k/ +/OwPFYbz2ls3jx8VqW6xMdWPEdP9D4lkx/dt79flLLHbkxTPwY6nt2512ORTRzE2x4/dpE7cvkme +E4IrW3hRMxO8THRtU1FKWtvtvK2upx22rzRCtXkqzh2jtF7ZbT122b01ndnpuWuP3Z3+Ky20qDVv +fauzVy3mejZzNK8dVjqi87KLRLYtXruqvXzkQp7Qoid88R6rcl+WGlW0/Sa22mfhCZOq2x082ix6 +jkm822pO8VrPdr4dNObVeDo8XW3uzMbzK+mvxT7szE27cvnu9j7PcNjSaXx8mOIzZevbrEeic5tN ++SZnpt8J4fHD9HXHO3PPW0x/DeBtJxx29vaAJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAKNRim9Z5e89Nl4DzXtVh5babURHrSf7f3ec1+qnDorWrvvt5Pccb0n0zhmWk +Rvevv1+cPE2rGTFNZU26PFfxwa5dVkjelI2772nZnX6bbrEUq3o0d678u8wmuDL2ittvVjXdneeK +cGv4jpJ6U56+kS7+j118+GLXpakzHaWlp9NNY3tv+bbiYiNoQy1y30uyZJlrWmZnuym6q1iIJnop +yW2Te8bdWnnypQqzZOadokiIpSZntWN5lrxki19vNRxrUeBwnNNd+fJEY6/OejXLn3Xe/wDp9wyn +E8uo4lqqxblv7lJ26T6vpD5X7G8QycKzeBMbzMRM1/FH/wA/h9QwZ6ajDXLitvWzRgsAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeL45w+dDrZvWv1OWd4+E+j2jX +12jx67TWw5Y6T2nzifU+rZ1y9eHwzDYxxEy18+DJodXfT5o96vafWPVbjyxDn1OOzHudbM0rt2UW +iI69mVtRXZq5tREb9VUoy2iIlRbJ0UX1VZ6btTLrI7V6yk62M2oisT1c7JmtkttVMUyZp6x0beDS +RWOvdKijDimvWd3G9pNRMfRcNfvZOb9Hpb0itJeP47k/3hgjaZnbaP1XxWW3T0movbNS0W645nbf +0nrMPpXs3xamoxdJiLbe/X1n8Uf3fKsOTw4jbaXo+EarJhtGTHMxeJ6xH7Sti9Zaj6x3HM4NxXFx +DS1mtoi8dJrv2l011QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AGjxLhODieOIye7kr9m8d4eM4to9RwjPXFa0ZIvG9bR0fQXmPbDFvTTZPOJmEWS/V8bs9R43NxLL +G8eFbePg1bajU5/s0l1ceKLx1hbjwRE9mOpx0y2uRTSZsm3PMw2aaKtIjo6kYo9EXpET0hVLXxYK +xC6MZvyx1lFs0RHfaPiCnU12pLyHGNDbUajBekWma2npWN3p8+opa20e9LSyZLxExTlpM+vdOdcZ +a9tPS8MyUvFrzWlI6727u1pYxYrbVmb7x+TQx6au3Nqcl7/0rcmW9axGnwZJj1novmxnZXV0fFp4 +ZxLBPgTGK8xzXr5fOH0bFlpmxVyY7Rato3iYfNuG2x56Wrqa8s2jz+7Lu8O12bS6jkwzN6THNNI6 +tvrN68Y4rxlx1vHa0bskAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAA4XtTTm0OKfTJ/aXdcL2pyRGjwU362yb7fkJz9eTxxyZJjyltRXzUZK7TFtl9Lbwy06YzrHwa+ +fJFd/wCVt8m0bQ0eS2qzcm+1K/an+zNZFL5M1pjFXeI72ky48eGnPkvNp27+TPU6nHpMfLXaIjpE +erk5dRMxOfN1mPeisfshW1ne1a1577Y6x5R3U0zze31FOWI6ze0byU098kRlzbxM9qrMlPDpyRMR +Md5Vt/Ihp5898mWZm1pjftE91uCt7fCI7dWeHDEW3t723l6rslqxWZnasR+SYhFbzhnfxJ2jyeq9 +lcGXWZcmW0zWKxHLaI7794eJx5fpfEKabT8t8l5isddo3l9S4VjrwrRUwzSJt3tav3pdOL6Y6dXD +j8HFWm+/KsU4NRXPvtWazHquWVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAa+fXYNP9u8b+kdZBsDkZOO135cWOZn4y5Wu4xqctbe9y19Kp4njt6vi+PDm8DFMWybbzPlV +5PiGtz67UxbNbeKTtWIjaIXYpnwuaftT5tXJT3vmi1pMsrU5qIrG1V1a+5DCa7b9GFbRr5J6Wnbt +Cu+Wmk0m8956z8ZWZNorbfzcbX5rZslazPux3hUt41NTntktObJ13+zX1bek01r4/HzVm0bxPXy/ ++bNfDgjVa2uOY92kdfg6ufJOKvLXtttVVSqbcta2vM7zXtHpLQy5ZtMd+vWd+7Zy3mdJHXra3f0c +vUarw7zFY5rT2hH1Lavnrgx81p3U49Pk4nE5L35MO/StfNRXR5tXnrS8W67WvfyiPSPi7uLHFK1p +jrtSsbR5Lc4RzsXBaYreP4l45esRD2HD9fnw6evvWvO3Tfr0aGk0U55ra0TFInv6uzgrXFXlx0i0 +77RPlC83Yj+JW7oddqr6vHzTTw9/f6dod+L1t9m0T8pcbFSmPHER3892W0zPuz+jSbVvidkcqmfP +Sel7bekrI4n4dZnPWIrHeYnZee2Wpy8dEaml4npNZblw5qzb8M9JbYgAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAABEzFYmZnaI7yCXL1XGa0jJXT0571nbee27DiXEprp8nhbxG20W8 +5cbD0ikfnKO+urTPvjoZdXqctdsmTaPSvRpWmsdZ6yztfaGplvv3lWW1tyRlz1x0vkn7Vo5atTNe +Y0+1o79V2KsZsvX7Ne5mwxnyTNvsx2iGneM/rCdRSuOsTasTt5kRFtpjqmOH4t4nk7estiMNa97R +Hwhna0iuKTEdmGWa4672nZtRele1N59Zlq6vLOSsYorEc07qcW65euzRvtXvPZy52naZ7ujr6fXV +rWdukREK8+njHgmZmPc67bq6ivVWhxxgxZLztNrT1mZ/SP4VZs0zaOvfp84WUtNsXLvtv3699+rU +z7+Jtt5qURqMnPpctaR1rMSw4ZoK57eNk6xHaJRh97Ltt7lo5Z+L1HAPZvVauZ2nFTSzMTzeJEz8 +to6xPfvsZntPZ9rXxabmxzefdrv0j1dXh/BcmstW1qxTHHasR3+b0GPhGl+kWmd64dNEVjf73T7X +y8vy+Ddx6O3iRakxTH5RXrMw1/lX+3Itw2MFIraN48qRHdZi0cUjmmPen9noox1iO0fNzdXEYrTt +stcmd9aX0bJ+HePmiKTitO8TMLZ1cVjrMfqpz6ys4pjfrPRWZ9rXXptUit6zO+23VyaRHEc05L1/ +w9J9ys/en1ljqdVbwYw452tlnl3jyjzbmmiMeKtYjpEbLeTXPUU8ee/+qjJpsV5rbkrFqzE1tEbT +DpYNbW21Mnu29fKWna0KbqTdjXXjld0cvQ63ltGHNPSfs2n+HUbS9c2s2UASqAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAOVxPWe99HpP8ArmP4b+r1EabT3yT3iOkesvMVtN7za07zad5l +XV5GmM9vVfEstvDx0jtaVVMlq+UJ18b5cMRvPeSuK87bUt+i2Z3PtG7zXpjkzXt6R+TXyTMzvM7t +ydHqZ+zhv1+Cv/ZuqvPTHMfOYaTMil1a1K2vHSLTELq2v+KWzThGo84rH5rq8JzedqR+ZeI7WnOS +34pYTafWXR/2Pln/AMyrKOCWnvmiPyR6O1y9585lhWJvl557Q6eo4T4dYiMvW3b3UanhldHpJtGX +e09unmjsT7eb1l4trI2t0hsZfrdNO0bzy+nzU20/+NmkzO9esz+TZxWis9dttvPv+Tn21jjaW8zn +26bTG3mp1M/Wzv3t0jyWXiKZJmsTERaZhXXDbNl8WaztWenxZLstPp5pau8frDtVrNMM5cfTfpMf +3aunxxbes9d/R09Dp8ebJi09ptFr3jtt2WyrW9wy1Jx132mK+Xq9PotT0iIU19ntLtExa3T47T+q +6nBaYvsZstZ+cT/LeMnUi0TXffo1s2m8Ws2/OIMWk5Jib5L328rS2t94Sh5TV4ppklpW6PT6rh+P +NbebTHyas8E081mZy5P2W6OFhjxNTE/hr/LoRO0Kvo9dPqctKzMxEx1la5t3tdnjnMs4noievcrO +yZjeFF1OSnNV0OG62cn1GWffj7Mz5w05joovzY7xes7TE7w0xrjPeex6Ua+j1UarBFu1o6Wj0lsN +3JfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrU5o0+nvlt92P3BxuM6nxNRGCs+7Tv8 +2hToxm1r3m9utrTvMsonqyt7XTmcja0u3O6FMfi5t/u0/lzdJM81p9O3zdvHTwsUR5+bfPqOfX1h +dqV+3O7bs1+T31oqmI3TEM4rvCdkDGIIhlFd2daboS0NXG2bD6bufxXU1vlmu/u4us/N0+L1tTSx +kr9qk7w89j1FNZMV3jxLzvaJ8mer+LSOZqK2xZotbvljfr/89U453rXt9lse081xZtNjx7TGKu0t +DHlrevSevaN5Y6+tJ8c7VRNMt63n3ub+6/R54rERMztDYy4a5omclYmfxKcenrjtHLvtPrCnVmdb +eFe3JXmjy6eS/DrMuLVYsta9Mdt++6qLxO+0dEc8UmInr18iUfReHcXrqccb9Z27Q61Lb13eJ9nc +1Z35rTvE9avY4bTkpG8xEfB05vYxqybc07R281naGMREdoT5JQqy9mply7Q3bV3iXG1eXw7TWSka +c258t7+tpT5/BjT7MfHqndz12Z+M4lMMKyziUJJiN1WSu9fku23RaOgKNJqbaTU1t9yelo+D0cTE +xEx1iXmM1Nt3W4PqvFweDaffx9vjDbGvxz+TP66QDRiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAOJxzU73rp6z296zsZMkYsdr2naKxvLyObNOfNfJbvad1dXkaeOdpvsc2yuZVzfbfqybutwu +s5s8R92J3dvJb3tnO4HSMegtmt3nfZvYp8SZl0z45NfSK7onH1bNcfRFqnUKJr0Y7dVtq7prjEsK +0XVpEM6028mW20IHK41aPo3J6zs4ODhdcvPnvExFevNXpMOrxi/PlrTee7PLX6Pwa09uaNlKtHg9 +dM3z5d7ReOu02nu0JzZMfblrv5R5uvrcdImZ26T1mYhxs1Os7RH93PZ7axuafNfLitvbaYU3yZYt +PXs9NwHhui1HBa5LVicsb81onrEuVqNNSuS8Y67dZ6xPZa59Il9uX41vEitImZme3q2Kxbxora0T +Md/ROSa4Ztkj7c9OafL5LuGYubmyX3iu/TfbdSfVnpvZLT/XZK233+Mbbva1xRXyiPk8pwbH4N6T +adq5a71n0tD1WDL4tPe6Xr0tDpz8YVnJHWEXYxbqlBedoef4tW0XraO09HdyztSZcbUz43C+ee9b +SVMaeOfqq7+jGckQ1Yz7+7v2RN/WXPXZPjci2+2yyJaVMuy+uSJlA2d+pNoVRbeDcSxyTE+TDDlt +pdRXLTynrHrDOyiyZeVFnY9TjvXJjres71tG8MnJ4Nqt4tp7T1jrV1nRL1x2cvABKAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAHJ49qfD09cNZ97JPX5PPw2uI6j6Vrsl/ux7tfk1mWr7dOM8iLdm +vfebREefRsWldw7SxqNbWbR7lPesrn3Vteo7dYjDpMGCvfbeXQ0uLlxRLRxROfUc34p6fCHYrXlr +EejqrjY8uzCYW7MZjdVKqK9VlaxCYrsnYExBMRMJRPZA8/xPHtmpP9W2xx76vhWOInvt/C7ike7N +vwzE9kcapGfhlevTaFbFo8RqJ5vy8/RoW09ek0msxHfp3dzNoLzp4zUmZpMbT8HJyYJi20X2n0lh +ZY1li/RaidBF4w2mK3jrHaFGp1lN+tptPp5IjBkid5mIp16TKu0abBPv33vPlM7z+iPdFNcWXU5I +tkrNce/b1W5db1nTaf3ax9q0fxDW1ebNk2phty1mOu09VOm8W19orEz23j1TwfSeERFuEYMddptW +d43dvBn21eKJ75KbW+cf/JcTgMxXTb3nbljz+TpcPmc2uyZO1KRtVtGVdi0bx07qJnllsRO6rNTe +N4XVamsy8mnvPwc3R2jPwe8TPbdlxXNOPSZfhWWpwO85OFzv57qrODkzeHntSe8Sn6Rv0a3EZ218 +8nXekfr1a0ZLVnqx19dWb6demXybOO7lYMvNMdW9S/VVLo0us7tPHdtUtEwJiZU3jq2Jhham8CVG +PNODNTJXvWd3qcWSubFXJWd4tG8PK3pPd1OB6veLaa89Y61/u2xfxh5c/rsgNHOAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAANLimq+i6O0xPv392rdeZ4rq/pOqnlnelOkIt5F8Z7Wj27I2I6sb25YY +V1ImY3dbQ08LRc23vZp2j5OJG+XJWle9p2h6HHtbJXFT7OOIpX+7TxT31j5rycdTh+Dpz+XaG/sw +w18PHWseULN2trBE9UcrJKBhFU7JAQi0dEomegNDUYovM7x3jb5tO1ZvpbaTLtzRExWfWPJ08kbT +Ex5NXWYYyV5omYtHWJieyeDzuizfRs19Jn6TM7Ru1uMcJxZqTkw+5f4ebqa7SV1MR4tdrx2vEfy1 +axqsNOTLjnLXytVXi3Xj8+nmsxTLM16d5npPyUzpekTtSK+U7vS6vQ/SYmK1vWPS1HOn2dvvvvE/ +tDO5XlcO+LbfHSd/W3o6/BdDOXPTnj3Kz38rS6Wm4FNrRyRzTH3p6RH/AKvR8L4dXSzE3jmtHn5I +mbfqLV+m4dbLSsZInHjr3iI6zLpYaxS01rHuxHRHiT9mv6s67Vj1aqL6326MrWiYa+/Q54BxPaGe +XRZpj8MquB4+Xg8zPnB7SX30to379GxpK1xcHiKz5IS8xr8PLPixH2bftLTy05o6dHYyVjLhy0t1 +izjZa3pMVv3iO/qz1G2L+NbSajbNyW7xLsY8kTDz+fJXFqKZN4iZnafi6WHL0iYlStI7OO+7axW2 +crFl7dW9jvE9ULN+J3ZbdFGOy+AYWpEqN7afNXLj+1Wd23KrJVMvCzseh0+auow1yU7WhY4fCdV4 +OadPefcvPuz6S7jol649Tl4AJVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV581NPhtkvO0R+4NPi2 +r8DB4dJ9+/7Q83Po2NTqLanNbLfvPaPSFDHV66sZ5ET0hRknyW2lTtMyouz0c8usx2n7s7vScKwx +zc1vu/y85p+maJh6Th+SOWeveXR4/wDLm8v+nX5mUWa9bbrInolmu5jdTNkxYFk2Isr3TuCzeGMz ++THdEyDDJO9Ja823rt2XWnya946pGvktDXta0ztWu/ybvLE9dkcoOf4GbJPWK1j49VmLh9JtE33v +Mevb9G7WsW8l1ccREISophiJ2jpDYpijbaOjOuOJ8ujOdqxsgVcsUjaETYvbaFFrgu5lVsm0yUtu +ryg43H5m+GIj1XcJzePoL4pnrWGtxmfchr8JvfHS1622if3QljzTTLes+qrNjrkiYtCzPMxnm095 +YZJ6boS5teB49Tqscza97VtvWvlv8V/FOF34RrIxTM2xXjelp/eHoeA6XnzReY3ivX/0dfivDcfE +9HbDbaLx1pb0lOs+jO7K8Lis3cN+0NKcd9PmthzV5clJ2mF9J9GHHVL108dm1SznYr/Ft0tuhLb8 +mNohFbMhLWy0mJ3rPXvDvcO1karBG8/WV6Wj+7kWrvDDBlvpdRGSnbzj1hpjX4z8mOx6UYYstc2O +uSk71tG7Ns5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZ2jeXneJ62dVl5KT9VTt8Z9W9xbWclPo+O +fft9qfSHEU1pv48ftYST23ZTDC/p0YtlVuvVjMbM5+LCZjYGWGdrTPxiHY4ffaf3cjTxz1v6xMS6 +Olty2iXVj/Dk8n+ndrkhnGRo1v8AFdW3RCrZ5uiYsqrboncSu508yjmZRYQt50TfowYTbYGVrKrT +uTZjvukQnYhMIGVY2ZxPVWyrHVCWzXpVXkt3TE7Va+W4K7X3jv1auTNy3jdba0RZpamfroQN7Hk3 +6wr1GTaN2OOJiu6Mu98NvgDi8Wy74d/yZ8PiPAiO2zU4nb6qIn1bugjfFE/ASp1ke9u15mbbRDZ1 +Mb823kx0Ontn1OOkedoJCvT8I03gaKsz9q/WW+isRWsVjtHRKyrhe0XCfpWL6Vgr9fjjrEfeh5fF +feH0V5Dj3DPoOo+k4a/U5J6xH3ZZ7z3228evytOk7NvFbo0cdols47bSybt7HbddHVqUs2aW3Qnq +xVeu8LILR3SlZw3V/R8nhXn6u0/pLuPMXjeHT4Zruf6jLPvR9mZ8/g1xrvpz+TH7HUAaMAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAABRq9VXSYJyW79qx6yvmdo3l5viGs+maqYrO+OnSvx+KLeLZz2te1rZL2v +ed7WneZYWnZl5K72YV1xEyxmeqJljzIEWlVkszvbZp5soN3h2SJz3pP3odCnuWmPRxuERfJrZmtZ +mtY96fR28kbX3dXj/wAuTyf6bmK+9YX1s0cNtm3Sd4LFY2K23W1s16StiUJW7bp22RW3RluBuruz +mWEgrmCGWyNkoExKE1QlPmsqRDKeyBjaejWy2W3ttDUyz1QKslvehVqKTNosyyTvELabXptIJpaP +B39Ia2mz+JGpr51jdZefDx2hzuHZObNq58poJaGtjxJ2+LoaKP8ADRPo5+T3skx5OhpOmC0fBNQ0 +5yTbn+bt8A0u9raiY6RHLVwY62mI6zMvaaHBGn0mPHt1iN5+aYVsACBXqMFNTgviyxvW0bSsAeE1 +mkvw7V2w5Ote9besJx2er4rw2nEdNNekZa9aW9JeQjnxZLYskTW9Z2mJY7zz26fHrrdpbZsY7NGt +mxjvso1b9NmUwpx33XRO4K7VUTE1nmrvEx1bVo2VWiJE/XY4frY1WPlt0y17x6/FuPM0m+HJGTHO +1qu9pNVXVYt46Xj7VfRtnXXL5MfzexsALsgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHM4jxOMFJphmJv529Dq +ZLfjDjPEIx450+K3v2+1MeUOHSOWFc3nJkmZnf4yujpVlqunOeFpV2nctLCZUXRM7MJtsWlRkv3Q +ky5NmpWt9RnrixVm17TtEQnJabXisRMzPSIew9n+CRoccajURvqLx5/chfOest642OGcIpoOG2w7 +ROW9d72+LQvXevyejcPUU5M+SvpLeOataraw2a0dLbLqTtK1G3Es4lVWWUSoldFtmcXUbpidgXzK +GEW3TuCUSncnsDFMMLSms9EC6J6FpVzbZE5ALy0809ZbFr9GtfrEoFMzuuwz0Ueey3HbaBLDXe7i +tMOfwWnP9I+NZbuttvhs1uBRtXPb4SDm3iIvf57N7Dbl0VrS5+XrltEd+Z1Jx7cNms9N4TURRw3T ++PrcO3WszEvZOD7P6aYiMlvu16S7y1QAIAABxOPcLnUY/pWCv1tI96I+9DtgmXl68Biy7/NtUu3+ +O8HnFa2s0tfd75KR5fFyMWTdhrPHVnX9R0cd21S3Rzsdm1iuqs256wrmGcT0RYSx5d047X02SMmO +esd49YRE9WcdSXhZ2O1p89NRji9J+cei1xMc3wXi+KZj1j1dTTaqmor06WjvWW+ddcu8XK8BZmAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAMMmWmKu952UZ9XFZmuP3revlDTtzWnmvO8q3XGmfHb9ZanV3yxtWeWn7y4es +vPNtDqZJ6Ts5mppvdl/XXRMyfGvSNlu/RVvtOzLfoipLT1VTKbSpvfogRkvtDVyZOhkyvQcA4Dzz +XV6yvTvTHMfvK+c9U3rkW+zvA/D21urr789cdZ8vi9KDb45rejl8Rry6iJ/FV1HP4vXbBTJEfYt1 ++UpiHM295bXsqrO9l8QkZ0lZEqqLeyBZHZLGvZkhIndADKJ3TMoqWQMZ6pjsxll2jsCLSrmU2lFY +36gieyu0LJk3jbsga0wdqzK20QpyztQGprL/AFMrOE05NLkt6qdVWZxNrSe5o9vWBLiUjnzXn0vL +q555dHt8HOwV928/1z/LpzXxbYccRvzTB+jucOwxh0dI22mY3ltIrHLWIjyjZKyoAAAAACJiJjaY +3iXleM8InR5J1GniZw2n3oj7s/8Ao9Wi9a3rNbRE1mNpifNFnVs65XhcWTdt47bnFuF24dm8TFEz +p7T0/pn0a+HJux1OOrOux08d1ndqY7tillVkzExLOk7yd4YxGwluViJhE45raL0na0dtlWO0+bZr +1TKi+2zptZGTamT3b/tLacvJjiY3XaTWdYxZZ6/dtPm1zrv1z78fPcbwC7EAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhkyV +xUm152iAZWtFazNp2iGhm1Vss8uP3aevnKrNntqLdelI7VRHRnrX/HRjx/tZREVjZXeybW6KbWZt +pCZ6S08tN7Nmbb7zCrJtyoS5145bSx5mWafelr3tsKmS/o08uXyhlly7RPV2+AcBnPNdZrK+53pS +fP4ytnPVda4y4BwHxOXV6uvu96Unz+MvVxG0bQRG0bR2G0nHLb2gCUDX12LxtFmpHeazt82wT1gH +mMN4tWs+rcr2aEV8DU5sM/cvO3yb+O0csLUTSdrLphRE8tlkZI7Atr2ZMazDJVKTYSCawi7Ksq7z +1QERvLK3ZGPrKbyCrbdnMcsbeaa18/RhvvM7oGEwTG0JmYYTIML22a2e28xELM19oURPNO4lOem+ +n3ZY5+prVnMc2GYU4/L4A0a15cNf6rz/AC6fC6+NxCPOuOu/5tHJTbHj+F5/l1+BYumXJMd9o3/d +MRXYASgAAAAAAABhlxUz4rY8lYtS0bTEvH8R4ffhmo6bzhtPu29Pg9mq1Gnx6rDbFmrzVsizq2df +zXkMWTeIbNL7tbXaHLwzUctvexWn3bmPL8WFnHVL326VZ91MfFVjvvVlz79kLrcf2m7j7bNHH3bl +J2SirLQoy4t1++7G0dBC/RanxI8PJPv18/WG241+alovSdrV6w6mDNGfFF4/OPSW2b1zeTPL1aAs +zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAVZ9RXBTe3WZ7R6iZOpzZq4ac1p+UermZMl89+a/byj0Ra9815ted59PQ32hlrXXRjH +DpCLX6ML5NlNsm/ZRqstfdXzbsZt06sLZNvNB1Za8RDWyZdo7q8udq5Mu/mIMt4md2lmy7JzZuWJ +dHgfBL8RvGo1MTXTxPSPx/8AstJ1XWpIs4BwSdbeNVqq/URPu0n73/s9hEREbRG0QUpWlYrWIisR +tER5JbSccur2gCUAAAAPM8Sry8Uyz67fwuxbzVPGsE49XGbvF42V4M0TEL33ERnktsxpk3sumK2j +admFdPFZ33VS2Mdui2J3UU6LYlFSsN2O5NkCyJ6K7T1TEsbAsxdpReerKkTFGMxvYEz0rsqtbbpC +b2VT1QEzuwtbaGUxspuJU3neWdKoiu8rq12gCI92YatLcublnzbEz1aOptyZqTuDHLfxN6R0+t5X +qdJhjBp6UiPLeXl9NSMnEKxHa1+bb8nrlvxUAAAAAAAAAAABTqtNj1eC2LLXeto/R43VabJw/VTh +ydY+7b1h7ho8V4dXiGlmvbJXrS3xRZ1fGv5rzeHN02bEW3cys3xZJx5ImtqztMS3MeTeGFjqlb2O +8btql3NpbZtYsnSBLeiWfdTjtutid+ghherHS5p0+f3vsX6T8Fkw181d4lMvEWdnHaGnw/UeNh5L +T7+PpPxbjdyWcvAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAo1Oprgr63ntAmTqdRqK4K9etp7Q5d7Wy2m953lNrWyWm953mVd77R0 +Za1104xxlN9lV8qnJl2a9s3xUXX2ybsJyRDWtl3YWydEC+2VRkzeW6q+T4tbJm+KRdfK1cmWZnlr +vNp7RC/R6HU8SycmCk7ed57Q9ZwvgOn4fEXtHi5/O9o7fJaZ6z1uRyOEezVstq6jiEbV71xevzer +rWtKxWsRFY6REeSRrJxz22gCUAAAAAANbX6aNVpL0npMRvWfSXlKamsRMVvXm+EvZXjmpaPWHzfL +oNRjzXicfWJ8phfPxFejx72x7xMzK+sXiNoiXlq+Pi6fWV/VfTNqfLJl/WTg9Pji8R70LqvMV1Gq +j/zcv6yz+lanzzZP1lWpelTET6S81Gp1P/Gyf90s412rjtnyfqql6asREdWM9+jz9eJ6yP8Az7uh +odZqMt458tpB1JvEViI3/RhzRt13/R1MNaziiZiJn5K9ZNceKZiIiQcu/WekT+iYrWI3lzdTrs+8 +8uW0fJzcur1Np/zsn6g79phVaIeetqNR/wAXJ/3SwnUaj/i5P+6UD0ldonum161h5mNRqP8Ai5P1 +lNtRqJjacuT9Qd22WN5aGeZyZd/KHJy59RHbLf8AVq31Gp/4uT9ZEvS8Lr/vSs2npzRtL1z53wK+ +oza/HW2XJNd99pmX0Rb8VAAAAAAAAAAAAAAcHj/C5yV+l4I9+v24jzj1cLFk8nu5jeNpeW41wmdL +knU6ev1Vp96sfdn/ANFdTrXG+eq1q5F2LLtbZoY8m8d11bbSydErsYsm+zZrO/zcnBm226uhiyRK +EtrvCrJDOJTeu8A1MWX6Lqq5N/dnpb5O5ExMbx2cPNTeJb/DM/iYPDtPvY+nzhri/jDy5/W6AuwA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAa2p1UYo5adbz+xbxMlvqJ1OqjDHLXree0ejmzNrWm953tPmTPWbWneZ7yoy5YhjrXXTjH8s75N +mtkyxt0VZM2/m175N1V03yTKubMLXVXybeYLLX2VXy7eam+b0bOg4VquJW+rry4/O9uyZOq3UjVm +9r25axMzPaIdvhns1kzbZddM0p5Y47z8/R2+HcF03Doi1a8+Xzvbv+TotJnjDXkt+K8ODHp8cY8N +IpSO0RCwF2YAAAAAAAAACvUZYw6fJkntWN3k8dfHz2vLucdz8mkjFE9bz1+UOZosX1UzPm0nqI/W +MYo9FlcPNklfFGeH/NshLGun+Cz6PtHZtVZWlRLS+jxPkRpIn7rdoupHTdA5s6SI+7H6Mfo+32Y2 ++To3neSIiZ7A0IjPXpXLePlMotGW3272t85datKzHZjbTVnsDj+FG/2Y/RlGP4R+jo20u7H6N1Ql +o+H8I/REY957R+jpfReiK6eOYHLtj2tttH6KrY/6Y/R2c+kjeJiFVtLG24hxpw7/AHY/RRkw9O37 +O99Hrt1YX0tfOBLjcGp4XF8c+u8fs9c4dcVcGemSI61nd3IneN1orQAAAAAAAAAAAAABFqxes1tE +TE9JiUgPKcX4RbRXnNgiZwWnrH4XPi28PdXpW9JraImsxtMS8pxXhF9DecuGJtgmf+1TWW2N/la1 +L7N7T5e3Vy6W3hsYcvLbqzbO9jvvCzvDR0+XeO7crO6FmGSvRThy/RtVXJ92elvk2rRvDUzU7pl4 +izsd2J3jeBpcNz+Lg5LT7+Pp+Xk3W7js5eAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs0NTrN96Yp6edkW8Wzm6+LNTq4pvTHO9vOfRoWtt +1mes95YWvs1s2fZldddOczLPLn2ju0MmebT3YZc2/mpm3qqllN1drsbZIhr3yzvtHf4AsvlYYseb +V5Yx4KTe0+UQ6nDvZ3UazbJqd8OKeu33peq0eh0+hxcmnxxWPOfOfm0mP+steT/ji8N9mKY9suum +L37+HHaPm9DSlaVitKxWsdohI0Y22gAgAAAAAAAAAABXnyRhw3yT92Nwef4xm8bVzET0rPJH5d12 +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 +NO67NbkhzNVnmInqzaOZrL93JyZeV0M1++7S02jvxDWxhxx033tPpC8Z6rrezWjmZyazJG2/u03h +2vFibTHoqvamiwVwY+nLGzV0+SZ1Mx8G0/45tOhzJ5lXMc3UVXRdlF1HP+iYsDPLPPy49/tz1+Te +pSIr0ho6ak5Ms5J8o2q6NImOrHV7XX488ypzTtHXo0s9t6zG7c1G1qz6ubeZiZ3UatXJG3yauSO7 +cvMTEx5tPLb3prPRMVr0HB8vicNxf0+7+kt+LOJwTJyY/Bnz3tH93X36N58cWvq6LSyiyndMSlC7 +mZcymLJiwLosmJVRLKLAtiU7q4lMSCzc3YxJuDMRuAlKAEgAAAlAkAAAAAABKAEgAAAAAJAAAAAA +AAAAAAAEgAAAAAAAAAAAAAkAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAhIAAACAAAASgAAAAAAEAAAA +hGzJAImGMwzQDDZjNVuyNgUTVhNGxysZqDVmiu1G5NN2M4waM0+DCaN2cbGcQNGaMZq3JxMJxA1J +qx2bU4kU09slorWNwa20z02RXHbJbl26QvtFovbHWkxEdJt5y2MOHlr2U1W3jx+1hiw8vSO63lmI +XRTaEWmtY6snRHO1VpmJ+DjavpSZl2s8b7y4HFcnh0n0gha5ebJN55KRM2mdoiPN6fh+kpwXh0Wy +RHj5Otp/s5Ps1p62y31+em9aTMYt/OfVfxTiPjZ52naI7fBrI5t66xz5+a1rW7yx0eSL6iZjtEOX +qNbSletom3lENjh2fbHzbbWt3iVozruc+5ztWubf4M4ybpQ2Oboyrva0Vjza8WdDR4OkXt3n9ldX +kaePP9VtYqctYhdvt5oivTeCZ2YOxXk6ubqMfV0b9mrljfqlFcq88k7z2U5axeItDa1OPessuC8P +ya7XRWYnwqdbT/ZMilvIu4dpslNdixXja8Y5tt85djZdbDWnGOesRtXFtuw6T27No5Kx2OrKYQlC +ExKJgBnEpiyvdlEgsizKLKollFgWxLKJVRLKJBbEp3VxLKJBnuMWQJEbpBIAAAJAAAABIAAAAAAA +lAJAAAAAAAAAAAAAASAAAAAAAAAAAAAJAAAABAJABAlAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAA +AAABAJQAAAAgAABAAI2EoBGyJhkgGPKxmqxAKpownHC+YRMdN5BrTj67R3bOn01o7p01Iv71u89o +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 +2Q==`;async function s4(e){let t=(r,s="application/octet-stream")=>fetch(`data:${s};base64,${r}`).then(A=>A.blob()),n,o;switch(e.config.warmup){case"face":n=await t(Wt);break;case"body":case"full":n=await t(Dt);break;default:n=null}if(n){let r=await createImageBitmap(n);o=await e.detect(r,e.config),r.close()}return o}async function A4(e){return new Promise(t=>{let n;switch(e.config.warmup){case"face":n="data:image/jpeg;base64,"+Wt;break;case"full":case"body":n="data:image/jpeg;base64,"+Dt;break;default:n=""}let o;if(typeof Image!="undefined")o=new Image;else if(v.Image)o=new v.Image;else return;o.onload=async()=>{let r=ee(o.naturalWidth,o.naturalHeight);if(!r)u("Warmup: Canvas not found"),t(void 0);else{let s=r.getContext("2d");s&&s.drawImage(o,0,0);let A=await e.image(r,!0),a=A.tensor?await e.detect(A.tensor,e.config):void 0;t(a)}},n?o.src=n:t(void 0)})}async function a4(e){let t=r=>Buffer.from(r,"base64"),n;e.config.warmup==="face"?n=t(Wt):n=t(Dt);let o;if("node"in c0&&c0.getBackend()==="tensorflow"){let r=c0.node.decodeJpeg(n),s=c0.expandDims(r,0);e.tf.dispose(r),o=await e.detect(s,e.config),e.tf.dispose(s)}else e.config.debug&&u("Warmup tfjs-node not loaded");return o}async function i4(e){let t;return typeof createImageBitmap=="function"?t=await s4(e):typeof Image!="undefined"||v.Canvas!==void 0?t=await A4(e):t=await a4(e),t}async function l4(e){var a,l,c,x;if(!c0.env().flagRegistry.ENGINE_COMPILE_ONLY)return;let t=c0.getBackend(),n=c0.backend();if(t!=="webgl"&&t!=="humangl"||!(n!=null&&n.checkCompileCompletion))return;c0.env().set("ENGINE_COMPILE_ONLY",!0);let o=c0.engine().state.numTensors,r=[];for(let[i,y]of Object.entries(e.models).filter(([d,p])=>d!==null&&p!==null)){let d=(y==null?void 0:y.modelSignature)&&((l=(a=y==null?void 0:y.inputs)==null?void 0:a[0])==null?void 0:l.shape)?[...y.inputs[0].shape]:[1,64,64,3],p=(y==null?void 0:y.modelSignature)&&((x=(c=y==null?void 0:y.inputs)==null?void 0:c[0])==null?void 0:x.dtype)?y.inputs[0].dtype:"float32";for(let b=0;bc0.dispose(M)):c0.dispose(b)}catch(b){e.config.debug&&u("compile fail model:",i)}c0.dispose(f)}let s=await n.checkCompileCompletionAsync();n.getUniformLocations(),e.config.debug&&u("compile pass:",{models:r,kernels:s.length}),c0.env().set("ENGINE_COMPILE_ONLY",!1);let A=c0.engine().state.numTensors;A-o>0&&u("tensor leak:",A-o)}async function Eo(e,t){await E2(e,!1);let n=g();return e.state="warmup",t&&(e.config=A0(e.config,t)),!e.config.warmup||e.config.warmup.length===0||e.config.warmup==="none"?ue():new Promise(async o=>{await e.models.load(),await l4(e);let r=await i4(e),s=g();e.config.debug&&u("warmup",e.config.warmup,Math.round(s-n),"ms"),e.emit("warmup"),o(r)})}var R2,W2,D2,Ft,Xe,b1=class{constructor(t){k(this,"version");k(this,"config");k(this,"result");k(this,"state");k(this,"process");k(this,"tf");k(this,"env",v);k(this,"draw",Q2);k(this,"match",zt);k(this,"models");k(this,"events");k(this,"faceTriangulation");k(this,"faceUVMap");k(this,"performance");i2(this,R2,void 0);i2(this,W2,void 0);i2(this,D2,void 0);k(this,"analyze",(...t)=>{if(!fe(this,W2))return;let n=this.tf.engine().state.numTensors,o=fe(this,R2);k2(this,R2,n);let r=n-o;r!==0&&u(...t,r)});i2(this,Ft,t=>{if(!fe(this,D2))return null;if(!t)return"input is not defined";if(this.env.node&&!(t instanceof Ae.Tensor))return"input must be a tensor";try{this.tf.getBackend()}catch(n){return"backend not loaded"}return null});k(this,"webcam",new Z2);k(this,"emit",t=>{var n;(n=this.events)!=null&&n.dispatchEvent&&this.events.dispatchEvent(new Event(t))});i2(this,Xe,{});let n=(Ae.version.tfjs||Ae.version_core).replace(/-(.*)/,"");qe.wasmPath=`https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${n}/dist/`,qe.modelBasePath=v.browser?"../models/":"file://models/",this.version=Kt,Object.defineProperty(this,"version",{value:Kt}),this.config=JSON.parse(JSON.stringify(qe)),Object.seal(this.config),this.config.cacheModels=typeof indexedDB!="undefined",t&&(this.config=A0(this.config,t)),C1(this.config),this.tf=Ae,this.state="idle",k2(this,R2,0),k2(this,W2,!1),k2(this,D2,!1),this.performance={},this.events=typeof EventTarget!="undefined"?new EventTarget:void 0,this.models=new C2(this),n5(),this.result=ue(),this.process={tensor:null,canvas:null},this.faceTriangulation=E3,this.faceUVMap=z3,Ct(this,null,""),this.emit("create"),(this.config.debug||this.env.browser)&&u(`version: ${this.version}`),this.config.debug&&u(`tfjs version: ${this.tf.version["tfjs-core"]}`);let o=JSON.parse(JSON.stringify(this.env));delete o.kernels,delete o.initial,delete o.perfadd,this.config.debug&&u("environment:",o)}reset(){let t=this.config.backend;this.config=JSON.parse(JSON.stringify(qe)),this.config.backend=t,Ut(),v.initial=!0}validate(t){let n=Zt(qe,t||this.config);return n.length===0&&(this.config=A0(this.config,t)),n}now(){return g()}image(t,n=!1){return G2(t,this.config,n)}async segmentation(t,n){var s,A,a;if(n&&(this.config=A0(this.config,n)),!this.config.segmentation.enabled)return null;let o=await G2(t,this.config);if(!o.tensor)return null;let r=null;return(s=this.config.segmentation.modelPath)!=null&&s.includes("rvm")&&(r=await Ro(o.tensor,this.config)),(A=this.config.segmentation.modelPath)!=null&&A.includes("meet")&&(r=await $n(o.tensor,this.config)),(a=this.config.segmentation.modelPath)!=null&&a.includes("selfie")&&(r=await Po(o.tensor,this.config)),Ae.dispose(o.tensor),r}compare(t,n){return L1(this.config,t,n)}async init(){await E2(this,!0),await this.tf.ready(),Ut()}async load(t){this.state="load";let n=g(),o=Object.values(this.models).filter(A=>A).length;t&&(this.config=A0(this.config,t)),this.env.initial&&(await E2(this,!1)||u("error: backend check failed"),await Ae.ready(),this.env.browser&&(this.config.debug&&u("configuration:",this.config),this.config.debug&&u("tf flags:",this.tf.ENV.flags))),await this.models.load(),this.env.initial&&this.config.debug&&u("tf engine state:",this.tf.engine().state.numBytes,"bytes",this.tf.engine().state.numTensors,"tensors"),this.env.initial=!1,Object.values(this.models).filter(A=>A).length!==o&&(this.models.validate(),this.emit("load"));let s=Math.trunc(g()-n);s>(this.performance.loadModels||0)&&(this.performance.loadModels=this.env.perfadd?(this.performance.loadModels||0)+s:s)}next(t=this.result){return _n(t,this.config)}async warmup(t){let n=g(),o=await Eo(this,t),r=g();return this.performance.warmup=Math.trunc(r-n),o}async profile(t,n){let o=await this.tf.profile(()=>this.detect(t,n)),r={},s=0;for(let a of o.kernels){let l=Number(a.kernelTimeMs)||0;r[a.name]?r[a.name]+=l:r[a.name]=l,s+=l}let A=[];Object.entries(r).forEach(a=>A.push({kernel:a[0],time:a[1],perc:0}));for(let a of A)a.perc=Math.round(1e3*a.time/s)/1e3,a.time=Math.round(1e3*a.time)/1e3;return A.sort((a,l)=>l.time-a.time),A.length=20,A}async detect(t,n){return this.state="detect",new Promise(async o=>{var b,M,T,m,h,S,P,I,q,t0,G,$,s0,R,Z,b0,U,g0,f0,B,X;this.state="config";let r;this.config=A0(this.config,n),this.state="check";let s=fe(this,Ft).call(this,t);s&&(u(s,t),this.emit("error"),o(ue(s)));let A=g();await this.load(),r=g(),this.state="image";let a=await G2(t,this.config);if(this.process=a,this.performance.inputProcess=this.env.perfadd?(this.performance.inputProcess||0)+Math.trunc(g()-r):Math.trunc(g()-r),this.analyze("Get Image:"),!a.tensor){this.config.debug&&u("could not convert input to tensor"),this.emit("error"),o(ue("could not convert input to tensor"));return}this.emit("image"),r=g(),this.config.skipAllowed=await O1(this.config,a.tensor),this.config.filter.autoBrightness=(this.config.filter.autoBrightness||!1)&&this.config.skipAllowed,this.performance.totalFrames||(this.performance.totalFrames=0),this.performance.cachedFrames||(this.performance.cachedFrames=0),this.performance.totalFrames++,this.config.skipAllowed&&this.performance.cachedFrames++,this.performance.cacheCheck=this.env.perfadd?(this.performance.cacheCheck||0)+Math.trunc(g()-r):Math.trunc(g()-r),this.analyze("Check Changed:");let l=[],c=[],x=[],i=[];this.state="detect:face",this.config.async?(l=this.config.face.enabled?V5(this,a.tensor):[],this.performance.face&&delete this.performance.face):(r=g(),l=this.config.face.enabled?await V5(this,a.tensor):[],this.performance.face=this.env.perfadd?(this.performance.face||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.config.async&&(this.config.body.maxDetected===-1||this.config.hand.maxDetected===-1)&&(l=await l),this.analyze("Start Body:"),this.state="detect:body";let y=this.config.body.maxDetected===-1?A0(this.config,{body:{maxDetected:this.config.face.enabled?1*l.length:1}}):this.config;this.config.async?((b=this.config.body.modelPath)!=null&&b.includes("posenet")?c=this.config.body.enabled?y1(a.tensor,y):[]:(M=this.config.body.modelPath)!=null&&M.includes("blazepose")?c=this.config.body.enabled?a5(a.tensor,y):[]:(T=this.config.body.modelPath)!=null&&T.includes("efficientpose")?c=this.config.body.enabled?f5(a.tensor,y):[]:(m=this.config.body.modelPath)!=null&&m.includes("movenet")&&(c=this.config.body.enabled?A1(a.tensor,y):[]),this.performance.body&&delete this.performance.body):(r=g(),(h=this.config.body.modelPath)!=null&&h.includes("posenet")?c=this.config.body.enabled?await y1(a.tensor,y):[]:(S=this.config.body.modelPath)!=null&&S.includes("blazepose")?c=this.config.body.enabled?await a5(a.tensor,y):[]:(P=this.config.body.modelPath)!=null&&P.includes("efficientpose")?c=this.config.body.enabled?await f5(a.tensor,y):[]:(I=this.config.body.modelPath)!=null&&I.includes("movenet")&&(c=this.config.body.enabled?await A1(a.tensor,y):[]),this.performance.body=this.env.perfadd?(this.performance.body||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.state="detect:hand";let d=this.config.hand.maxDetected===-1?A0(this.config,{hand:{maxDetected:this.config.face.enabled?2*l.length:1}}):this.config;this.config.async?((t0=(q=this.config.hand.detector)==null?void 0:q.modelPath)!=null&&t0.includes("handdetect")?x=this.config.hand.enabled?Y5(a.tensor,d):[]:($=(G=this.config.hand.detector)==null?void 0:G.modelPath)!=null&&$.includes("handtrack")&&(x=this.config.hand.enabled?Q5(a.tensor,d):[]),this.performance.hand&&delete this.performance.hand):(r=g(),(R=(s0=this.config.hand.detector)==null?void 0:s0.modelPath)!=null&&R.includes("handdetect")?x=this.config.hand.enabled?await Y5(a.tensor,d):[]:(b0=(Z=this.config.hand.detector)==null?void 0:Z.modelPath)!=null&&b0.includes("handtrack")&&(x=this.config.hand.enabled?await Q5(a.tensor,d):[]),this.performance.hand=this.env.perfadd?(this.performance.hand||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.state="detect:object",this.config.async?((U=this.config.object.modelPath)!=null&&U.includes("nanodet")?i=this.config.object.enabled?i1(a.tensor,this.config):[]:(g0=this.config.object.modelPath)!=null&&g0.includes("centernet")&&(i=this.config.object.enabled?c5(a.tensor,this.config):[]),this.performance.object&&delete this.performance.object):(r=g(),(f0=this.config.object.modelPath)!=null&&f0.includes("nanodet")?i=this.config.object.enabled?await i1(a.tensor,this.config):[]:(B=this.config.object.modelPath)!=null&&B.includes("centernet")&&(i=this.config.object.enabled?await c5(a.tensor,this.config):[]),this.performance.object=this.env.perfadd?(this.performance.object||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.analyze("End Object:"),this.state="detect:await",this.config.async&&([l,c,x,i]=await Promise.all([l,c,x,i])),this.state="detect:gesture";let p=[];this.config.gesture.enabled&&(r=g(),p=[...wn(l),...kn(c),...zn(x),...En(l)],this.config.async?this.performance.gesture&&delete this.performance.gesture:this.performance.gesture=this.env.perfadd?(this.performance.gesture||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.performance.total=this.env.perfadd?(this.performance.total||0)+Math.trunc(g()-A):Math.trunc(g()-A);let f=((X=this.process.tensor)==null?void 0:X.shape)||[0,0,0,0];this.result={face:l,body:c,hand:x,gesture:p,object:i,performance:this.performance,canvas:this.process.canvas,timestamp:Date.now(),error:null,width:f[2],height:f[1],get persons(){return wo(l,c,x,p,f)}},Ae.dispose(a.tensor),this.emit("detect"),this.state="idle",o(this.result)})}async sleep(t){return new Promise(n=>{setTimeout(n,t)})}async video(t,n=!0,o=0){n?(fe(this,Xe)[t.id]||(this.config.debug&&u("video start",t.id),fe(this,Xe)[t.id]=!0),!t.paused&&fe(this,Xe)[t.id]&&t.readyState>=2&&await this.detect(t),o>0&&await this.sleep(o),fe(this,Xe)[t.id]&&requestAnimationFrame(()=>this.video(t,n,o))):(this.config.debug&&u("video stop",t.id),fe(this,Xe)[t.id]=!1)}};R2=new WeakMap,W2=new WeakMap,D2=new WeakMap,Ft=new WeakMap,Xe=new WeakMap;0&&(module.exports={Env,Human,defaults,draw,empty,env,match,models}); diff --git a/dist/human.node-wasm.d.ts b/dist/human.node-wasm.d.ts new file mode 100644 index 00000000..f94037de --- /dev/null +++ b/dist/human.node-wasm.d.ts @@ -0,0 +1 @@ +export * from '../types/human'; \ No newline at end of file diff --git a/dist/human.node-wasm.js b/dist/human.node-wasm.js new file mode 100644 index 00000000..52df9c58 --- /dev/null +++ b/dist/human.node-wasm.js @@ -0,0 +1,840 @@ +/* + Human + homepage: + author: ' +*/ + +"use strict";var So=Object.create;var P2=Object.defineProperty;var jo=Object.getOwnPropertyDescriptor;var No=Object.getOwnPropertyNames;var Io=Object.getPrototypeOf,Oo=Object.prototype.hasOwnProperty;var Lo=(e,t,n)=>t in e?P2(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var Co=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),we=(e,t)=>{for(var n in t)P2(e,n,{get:t[n],enumerable:!0})},M1=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of No(t))!Oo.call(e,r)&&r!==n&&P2(e,r,{get:()=>t[r],enumerable:!(o=jo(t,r))||o.enumerable});return e};var V=(e,t,n)=>(n=e!=null?So(Io(e)):{},M1(t||!e||!e.__esModule?P2(n,"default",{value:e,enumerable:!0}):n,e)),Wo=e=>M1(P2({},"__esModule",{value:!0}),e);var k=(e,t,n)=>(Lo(e,typeof t!="symbol"?t+"":t,n),n),P1=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)};var fe=(e,t,n)=>(P1(e,t,"read from private field"),n?n.call(e):t.get(e)),i2=(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)},k2=(e,t,n,o)=>(P1(e,t,"write to private field"),o?o.call(e,n):t.set(e,n),n);var H=Co((y4,E2)=>{"use strict";var Vt=Object.defineProperty,Do=Object.getOwnPropertyDescriptor,Fo=Object.getOwnPropertyNames,Bo=Object.prototype.hasOwnProperty,Ho=(e,t)=>{for(var n in t)Vt(e,n,{get:t[n],enumerable:!0})},Gt=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Fo(t))!Bo.call(e,r)&&r!==n&&Vt(e,r,{get:()=>t[r],enumerable:!(o=Do(t,r))||o.enumerable});return e},Zt=(e,t,n)=>(Gt(e,t,"default"),n&&Gt(n,t,"default")),Go=e=>Gt(Vt({},"__esModule",{value:!0}),e),w2={};Ho(w2,{version:()=>Yo});E2.exports=Go(w2);Zt(w2,require("@tensorflow/tfjs-core"),E2.exports);Zt(w2,require("@tensorflow/tfjs-converter"),E2.exports);Zt(w2,require("@tensorflow/tfjs-backend-wasm"),E2.exports);var k1="4.0.0",Vo="4.0.0",Zo="4.0.0",Xo="4.0.0",qo="4.0.0",Uo="0.0.1-alpha.14",Yo={tfjs:k1,"tfjs-core":k1,"tfjs-converter":Vo,"tfjs-backend-cpu":Zo,"tfjs-backend-webgl":Xo,"tfjs-backend-wasm":qo,"tfjs-backend-webgpu":Uo}});var x4={};we(x4,{Env:()=>z2,Human:()=>g1,default:()=>g1,defaults:()=>qe,draw:()=>$2,empty:()=>ue,env:()=>v,match:()=>jt,models:()=>b1});module.exports=Wo(x4);var Ae=V(H());function u(...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)}function w1(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(`modelpath error: expecting json file: ${r}`);return r}var g=()=>typeof performance!="undefined"?performance.now():parseInt((Number(process.hrtime.bigint())/1e3/1e3).toString());function Xt(e,t,n="config",o=[]){for(let r of Object.keys(t))if(typeof t[r]=="object")Xt(e[r],t[r],r,o);else{let s=e&&typeof e[r]!="undefined";s||o.push({reason:"unknown property",where:`${n}.${r} = ${t[r]}`});let A=e&&typeof e[r]==typeof t[r];s&&!A&&o.push({reason:"property type mismatch",where:`${n}.${r} = ${t[r]}`,expected:typeof e[r]})}return t.debug&&n==="config"&&o.length>0&&u("invalid configuration",o),o}function A0(...e){let t=n=>n&&typeof n=="object";return e.reduce((n,o)=>(Object.keys(o||{}).forEach(r=>{let s=n[r],A=o[r];Array.isArray(s)&&Array.isArray(A)?n[r]=s.concat(...A):t(s)&&t(A)?n[r]=A0(s,A):n[r]=A}),n),{})}var qe={backend:"",modelBasePath:"",cacheModels:!0,validateModels:!0,wasmPath:"",wasmPlatformFetch:!1,debug:!1,async:!0,warmup:"full",cacheSensitivity:.7,skipAllowed:!1,deallocate:!1,flags:{},softwareKernels:!1,filter:{enabled:!0,equalization:!1,width:0,height:0,flip:!1,return:!0,autoBrightness:!0,brightness:0,contrast:0,sharpness:0,blur:0,saturation:0,hue:0,negative:!1,sepia:!1,vintage:!1,kodachrome:!1,technicolor:!1,polaroid:!1,pixelate:0},gesture:{enabled:!0},face:{enabled:!0,detector:{modelPath:"blazeface.json",rotation:!0,maxDetected:1,skipFrames:99,skipTime:2500,minConfidence:.2,iouThreshold:.1,mask:!1,return:!1},mesh:{enabled:!0,modelPath:"facemesh.json",keepInvalid:!1},attention:{enabled:!1,modelPath:"facemesh-attention.json"},iris:{enabled:!0,modelPath:"iris.json"},emotion:{enabled:!0,minConfidence:.1,skipFrames:99,skipTime:1500,modelPath:"emotion.json"},description:{enabled:!0,modelPath:"faceres.json",skipFrames:99,skipTime:3e3,minConfidence:.1},antispoof:{enabled:!1,skipFrames:99,skipTime:4e3,modelPath:"antispoof.json"},liveness:{enabled:!1,skipFrames:99,skipTime:4e3,modelPath:"liveness.json"}},body:{enabled:!0,modelPath:"movenet-lightning.json",maxDetected:-1,minConfidence:.3,skipFrames:1,skipTime:200},hand:{enabled:!0,rotation:!0,skipFrames:99,skipTime:1e3,minConfidence:.5,iouThreshold:.2,maxDetected:-1,landmarks:!0,detector:{modelPath:"handtrack.json"},skeleton:{modelPath:"handlandmark-full.json"}},object:{enabled:!1,modelPath:"centernet.json",minConfidence:.2,iouThreshold:.4,maxDetected:10,skipFrames:99,skipTime:2e3},segmentation:{enabled:!1,modelPath:"rvm.json",ratio:.5,mode:"default"}};var I0=V(H());var N=V(H());var E1=` + 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.); + } +`;var z1=` + 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]; + } +`,S1=` + 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; + } +`,j1=` + 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); + } +`,N1=` + 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; + } +`,I1=` + 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); // top left + vec4 c12 = texture2D(texture, vec2(vUv.x, vUv.y - px.y)); // top center + vec4 c13 = texture2D(texture, vec2(vUv.x + px.x, vUv.y - px.y)); // top right + vec4 c21 = texture2D(texture, vec2(vUv.x - px.x, vUv.y) ); // mid left + vec4 c22 = texture2D(texture, vUv); // mid center + vec4 c23 = texture2D(texture, vec2(vUv.x + px.x, vUv.y) ); // mid right + vec4 c31 = texture2D(texture, vec2(vUv.x - px.x, vUv.y + px.y) ); // bottom left + vec4 c32 = texture2D(texture, vec2(vUv.x, vUv.y + px.y) ); // bottom center + vec4 c33 = texture2D(texture, vUv + px ); // bottom right + 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; + } +`;var qt=(e,t,n)=>{let o=new RegExp("\\b"+t+" \\w+ (\\w+)","ig");e.replace(o,(r,s)=>(n[s]=0,r))},Ut=class{constructor(t,n,o){k(this,"uniform",{});k(this,"attribute",{});k(this,"gl");k(this,"id");k(this,"compile",(t,n)=>{let o=this.gl.createShader(n);return o?(this.gl.shaderSource(o,t),this.gl.compileShader(o),this.gl.getShaderParameter(o,this.gl.COMPILE_STATUS)?o:(u(`filter: gl compile failed: ${this.gl.getShaderInfoLog(o)||"unknown"}`),null)):(u("filter: could not create shader"),null)});this.gl=t;let r=this.compile(n,this.gl.VERTEX_SHADER),s=this.compile(o,this.gl.FRAGMENT_SHADER);if(this.id=this.gl.createProgram(),!(!r||!s)){if(!this.id){u("filter: could not create webgl program");return}if(this.gl.attachShader(this.id,r),this.gl.attachShader(this.id,s),this.gl.linkProgram(this.id),!this.gl.getProgramParameter(this.id,this.gl.LINK_STATUS)){u(`filter: gl link failed: ${this.gl.getProgramInfoLog(this.id)||"unknown"}`);return}this.gl.useProgram(this.id),qt(n,"attribute",this.attribute);for(let A in this.attribute)this.attribute[A]=this.gl.getAttribLocation(this.id,A);qt(n,"uniform",this.uniform),qt(o,"uniform",this.uniform);for(let A in this.uniform)this.uniform[A]=this.gl.getUniformLocation(this.id,A)}}};function O1(){let e=0,t=null,n=!1,o=-1,r=[null,null],s=[],A=null,a=null,l=ee(100,100),c={},d={INTERMEDIATE:1},i=l.getContext("webgl");if(!i){u("filter: cannot get webgl context");return}this.gl=i;function y(T,m){if(!(T===l.width&&m===l.height)){if(l.width=T,l.height=m,!A){let h=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]);A=i.createBuffer(),i.bindBuffer(i.ARRAY_BUFFER,A),i.bufferData(i.ARRAY_BUFFER,h,i.STATIC_DRAW),i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0)}i.viewport(0,0,l.width,l.height),r=[null,null]}}function x(T,m){let h=i.createFramebuffer();i.bindFramebuffer(i.FRAMEBUFFER,h);let S=i.createRenderbuffer();i.bindRenderbuffer(i.RENDERBUFFER,S);let P=i.createTexture();return i.bindTexture(i.TEXTURE_2D,P),i.texImage2D(i.TEXTURE_2D,0,i.RGBA,T,m,0,i.RGBA,i.UNSIGNED_BYTE,null),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,i.LINEAR),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,i.LINEAR),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,i.CLAMP_TO_EDGE),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,i.CLAMP_TO_EDGE),i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,P,0),i.bindTexture(i.TEXTURE_2D,null),i.bindFramebuffer(i.FRAMEBUFFER,null),{fbo:h,texture:P}}function p(T){return r[T]=r[T]||x(l.width,l.height),r[T]}function f(T=0){if(!a)return;let m=null,h=null,S=!1;e===0?m=t:m=p(o).texture||null,e++,n&&!(T&d.INTERMEDIATE)?(h=null,S=e%2===0):(o=(o+1)%2,h=p(o).fbo||null),i.bindTexture(i.TEXTURE_2D,m),i.bindFramebuffer(i.FRAMEBUFFER,h),i.uniform1f(a.uniform.flipY,S?-1:1),i.drawArrays(i.TRIANGLES,0,6)}function b(T){if(c[T])return a=c[T],i.useProgram((a?a.id:null)||null),a;if(a=new Ut(i,E1,T),!a)return u("filter: could not get webgl program"),null;let m=Float32Array.BYTES_PER_ELEMENT,h=4*m;return i.enableVertexAttribArray(a.attribute.pos),i.vertexAttribPointer(a.attribute.pos,2,i.FLOAT,!1,h,0*m),i.enableVertexAttribArray(a.attribute.uv),i.vertexAttribPointer(a.attribute.uv,2,i.FLOAT,!1,h,2*m),c[T]=a,a}let M={colorMatrix:T=>{let m=new Float32Array(T);m[4]/=255,m[9]/=255,m[14]/=255,m[19]/=255;let h=m[18]===1&&m[3]===0&&m[8]===0&&m[13]===0&&m[15]===0&&m[16]===0&&m[17]===0&&m[19]===0?S1:z1,S=b(h);!S||(i.uniform1fv(S.uniform.m,m),f())},brightness:T=>{let m=(T||0)+1;M.colorMatrix([m,0,0,0,0,0,m,0,0,0,0,0,m,0,0,0,0,0,1,0])},saturation:T=>{let m=(T||0)*2/3+1,h=(m-1)*-.5;M.colorMatrix([m,h,h,0,0,h,m,h,0,0,h,h,m,0,0,0,0,0,1,0])},desaturate:()=>{M.saturation(-1)},contrast:T=>{let m=(T||0)+1,h=-128*(m-1);M.colorMatrix([m,0,0,0,h,0,m,0,0,h,0,0,m,0,h,0,0,0,1,0])},negative:()=>{M.contrast(-2)},hue:T=>{T=(T||0)/180*Math.PI;let m=Math.cos(T),h=Math.sin(T),S=.213,P=.715,I=.072;M.colorMatrix([S+m*(1-S)+h*-S,P+m*-P+h*-P,I+m*-I+h*(1-I),0,0,S+m*-S+h*.143,P+m*(1-P)+h*.14,I+m*-I+h*-.283,0,0,S+m*-S+h*-(1-S),P+m*-P+h*P,I+m*(1-I)+h*I,0,0,0,0,0,1,0])},desaturateLuminance:()=>{M.colorMatrix([.2764723,.929708,.0938197,0,-37.1,.2764723,.929708,.0938197,0,-37.1,.2764723,.929708,.0938197,0,-37.1,0,0,0,1,0])},sepia:()=>{M.colorMatrix([.393,.7689999,.18899999,0,0,.349,.6859999,.16799999,0,0,.272,.5339999,.13099999,0,0,0,0,0,1,0])},brownie:()=>{M.colorMatrix([.5997023498159715,.34553243048391263,-.2708298674538042,0,47.43192855600873,-.037703249837783157,.8609577587992641,.15059552388459913,0,-36.96841498319127,.24113635128153335,-.07441037908422492,.44972182064877153,0,-7.562075277591283,0,0,0,1,0])},vintagePinhole:()=>{M.colorMatrix([.6279345635605994,.3202183420819367,-.03965408211312453,0,9.651285835294123,.02578397704808868,.6441188644374771,.03259127616149294,0,7.462829176470591,.0466055556782719,-.0851232987247891,.5241648018700465,0,5.159190588235296,0,0,0,1,0])},kodachrome:()=>{M.colorMatrix([1.1285582396593525,-.3967382283601348,-.03992559172921793,0,63.72958762196502,-.16404339962244616,1.0835251566291304,-.05498805115633132,0,24.732407896706203,-.16786010706155763,-.5603416277695248,1.6014850761964943,0,35.62982807460946,0,0,0,1,0])},technicolor:()=>{M.colorMatrix([1.9125277891456083,-.8545344976951645,-.09155508482755585,0,11.793603434377337,-.3087833385928097,1.7658908555458428,-.10601743074722245,0,-70.35205161461398,-.231103377548616,-.7501899197440212,1.847597816108189,0,30.950940869491138,0,0,0,1,0])},polaroid:()=>{M.colorMatrix([1.438,-.062,-.062,0,0,-.122,1.378,-.122,0,0,-.016,-.016,1.483,0,0,0,0,0,1,0])},shiftToBGR:()=>{M.colorMatrix([0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0])},convolution:T=>{let m=new Float32Array(T),h=1/l.width,S=1/l.height,P=b(I1);!P||(i.uniform1fv(P.uniform.m,m),i.uniform2f(P.uniform.px,h,S),f())},detectEdges:()=>{M.convolution.call(this,[0,1,0,1,-4,1,0,1,0])},sobelX:()=>{M.convolution.call(this,[-1,0,1,-2,0,2,-1,0,1])},sobelY:()=>{M.convolution.call(this,[-1,-2,-1,0,0,0,1,2,1])},sharpen:T=>{let m=T||1;M.convolution.call(this,[0,-1*m,0,-1*m,1+4*m,-1*m,0,-1*m,0])},emboss:T=>{let m=T||1;M.convolution.call(this,[-2*m,-1*m,0,-1*m,1,1*m,0,1*m,2*m])},blur:T=>{let m=T/7/l.width,h=T/7/l.height,S=b(N1);!S||(i.uniform2f(S.uniform.px,0,h),f(d.INTERMEDIATE),i.uniform2f(S.uniform.px,m,0),f())},pixelate:T=>{let m=T/l.width,h=T/l.height,S=b(j1);!S||(i.uniform2f(S.uniform.size,m,h),f())}};this.add=function(T){let m=Array.prototype.slice.call(arguments,1),h=M[T];s.push({func:h,args:m})},this.reset=function(){s=[]},this.get=function(){return s},this.apply=function(T){y(T.width,T.height),e=0,t||(t=i.createTexture()),i.bindTexture(i.TEXTURE_2D,t),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,i.CLAMP_TO_EDGE),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,i.CLAMP_TO_EDGE),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,i.NEAREST),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,i.NEAREST),i.texImage2D(i.TEXTURE_2D,0,i.RGBA,i.RGBA,i.UNSIGNED_BYTE,T);for(let m=0;md.data())),A=Math.max(s[0][0],s[1][0],s[2][0]),l=(A>1?255:1)/A,c;if(l>1){let d=[Y.sub(n[0],o[0]),Y.sub(n[1],o[1]),Y.sub(n[2],o[2])],i=[Y.sub(r[0],o[0]),Y.sub(r[1],o[1]),Y.sub(r[2],o[2])],y=[Y.mul(d[0],l),Y.mul(d[1],l),Y.mul(d[2],l)],x=Y.stack([y[0],y[1],y[2]],2);c=Y.reshape(x,[1,t.shape[0]||0,t.shape[1]||0,3]),Y.dispose([...d,...i,...y])}else c=Y.expandDims(t,0);return Y.dispose([...n,...o,...r,n,t,e]),c}var G2=3840,v0=null,R0=null,l2=null,e0,K0={inputSum:0,cacheDiff:1,sumMethod:0,inputTensor:void 0};function Yt(){K0.inputSum=0,K0.cacheDiff=1,K0.sumMethod=0,K0.inputTensor=void 0}function ee(e,t){let n;if(v.browser)if(v.worker){if(typeof OffscreenCanvas=="undefined")throw new Error("canvas error: attempted to run in web worker but OffscreenCanvas is not supported");n=new OffscreenCanvas(e,t)}else{if(typeof document=="undefined")throw new Error("canvas error: attempted to run in browser but DOM is not defined");n=document.createElement("canvas"),n.width=e,n.height=t}else typeof v.Canvas!="undefined"?n=new v.Canvas(e,t):typeof globalThis.Canvas!="undefined"&&(n=new globalThis.Canvas(e,t));return n}function V2(e,t){let n=t||ee(e.width,e.height);return n.getContext("2d").drawImage(e,0,0),n}async function Z2(e,t,n=!0){var y,x,p;if(!e)return t.debug&&u("input error: input is missing"),{tensor:null,canvas:null};if(!(e instanceof N.Tensor)&&!(typeof Image!="undefined"&&e instanceof Image)&&!(typeof v.Canvas!="undefined"&&e instanceof v.Canvas)&&!(typeof globalThis.Canvas!="undefined"&&e instanceof globalThis.Canvas)&&!(typeof ImageData!="undefined"&&e instanceof ImageData)&&!(typeof ImageBitmap!="undefined"&&e instanceof ImageBitmap)&&!(typeof HTMLImageElement!="undefined"&&e instanceof HTMLImageElement)&&!(typeof HTMLMediaElement!="undefined"&&e instanceof HTMLMediaElement)&&!(typeof HTMLVideoElement!="undefined"&&e instanceof HTMLVideoElement)&&!(typeof HTMLCanvasElement!="undefined"&&e instanceof HTMLCanvasElement)&&!(typeof OffscreenCanvas!="undefined"&&e instanceof OffscreenCanvas))throw new Error("input error: type is not recognized");if(e instanceof N.Tensor){let f=null;if(e.isDisposedInternal)throw new Error("input error: attempted to use tensor but it is disposed");if(!e.shape)throw new Error("input error: attempted to use tensor without a shape");if(e.shape.length===3){if(e.shape[2]===3)f=N.expandDims(e,0);else if(e.shape[2]===4){let b=N.slice3d(e,[0,0,0],[-1,-1,3]);f=N.expandDims(b,0),N.dispose(b)}}else e.shape.length===4&&(e.shape[3]===3?f=N.clone(e):e.shape[3]===4&&(f=N.slice4d(e,[0,0,0,0],[-1,-1,-1,3])));if(f==null||f.shape.length!==4||f.shape[0]!==1||f.shape[3]!==3)throw new Error(`input error: attempted to use tensor with unrecognized shape: ${e.shape.toString()}`);if(f.dtype==="int32"){let b=N.cast(f,"float32");N.dispose(f),f=b}return{tensor:f,canvas:t.filter.return?R0:null}}if(typeof e.readyState!="undefined"&&e.readyState<=2)return t.debug&&u("input stream is not ready"),{tensor:null,canvas:v0};let o=e.naturalWidth||e.videoWidth||e.width||e.shape&&e.shape[1]>0,r=e.naturalHeight||e.videoHeight||e.height||e.shape&&e.shape[2]>0;if(!o||!r)return t.debug&&u("cannot determine input dimensions"),{tensor:null,canvas:v0};let s=o,A=r;if(s>G2&&(s=G2,A=Math.trunc(s*r/o)),A>G2&&(A=G2,s=Math.trunc(A*o/r)),(((y=t.filter)==null?void 0:y.width)||0)>0?s=t.filter.width:(((x=t.filter)==null?void 0:x.height)||0)>0&&(s=o*((t.filter.height||0)/r)),(t.filter.height||0)>0?A=t.filter.height:(t.filter.width||0)>0&&(A=r*((t.filter.width||0)/o)),!s||!A)throw new Error("input error: cannot determine dimension");(!v0||v0.width!==s||v0.height!==A)&&(v0=ee(s,A));let a=v0.getContext("2d");if(typeof ImageData!="undefined"&&e instanceof ImageData?a.putImageData(e,0,0):t.filter.flip&&typeof a.translate!="undefined"?(a.translate(o,0),a.scale(-1,1),a.drawImage(e,0,0,o,r,0,0,v0.width,v0.height),a.setTransform(1,0,0,1,0,0)):a.drawImage(e,0,0,o,r,0,0,v0.width,v0.height),(!R0||v0.width!==R0.width||v0.height!==R0.height)&&(R0=ee(v0.width,v0.height)),t.filter.enabled&&v.webgl.supported?(e0||(e0=v.browser?new O1:null),v.filter=!!e0,e0!=null&&e0.add?(e0.reset(),t.filter.brightness!==0&&e0.add("brightness",t.filter.brightness),t.filter.contrast!==0&&e0.add("contrast",t.filter.contrast),t.filter.sharpness!==0&&e0.add("sharpen",t.filter.sharpness),t.filter.blur!==0&&e0.add("blur",t.filter.blur),t.filter.saturation!==0&&e0.add("saturation",t.filter.saturation),t.filter.hue!==0&&e0.add("hue",t.filter.hue),t.filter.negative&&e0.add("negative"),t.filter.sepia&&e0.add("sepia"),t.filter.vintage&&e0.add("brownie"),t.filter.sepia&&e0.add("sepia"),t.filter.kodachrome&&e0.add("kodachrome"),t.filter.technicolor&&e0.add("technicolor"),t.filter.polaroid&&e0.add("polaroid"),t.filter.pixelate!==0&&e0.add("pixelate",t.filter.pixelate),((p=e0.get())==null?void 0:p.length)>1?R0=e0.apply(v0):R0=e0.draw(v0)):(t.debug&&u("input process error: cannot initialize filters"),v.webgl.supported=!1,t.filter.enabled=!1,V2(v0,R0))):(V2(v0,R0),e0&&(e0=null),v.filter=!!e0),!n)return{tensor:null,canvas:R0};if(!R0)throw new Error("canvas error: cannot create output");let l,c=3;if(typeof ImageData!="undefined"&&e instanceof ImageData||e.data&&e.width&&e.height)if(v.browser&&N.browser)l=N.browser?N.browser.fromPixels(e):null;else{c=e.data.length/e.height/e.width;let f=new Uint8Array(e.data.buffer);l=N.tensor(f,[e.height,e.width,c],"int32")}else if((!l2||R0.width!==l2.width||R0.height!==l2.height)&&(l2=ee(R0.width,R0.height)),N.browser&&v.browser)t.backend==="webgl"||t.backend==="humangl"||t.backend==="webgpu"?l=N.browser.fromPixels(R0):(l2=V2(R0),l=N.browser.fromPixels(l2));else{let M=V2(R0).getContext("2d").getImageData(0,0,s,A);c=M.data.length/s/A;let T=new Uint8Array(M.data.buffer);l=N.tensor(T,[s,A,c])}if(c===4){let f=N.slice3d(l,[0,0,0],[-1,-1,3]);N.dispose(l),l=f}if(!l)throw new Error("input error: cannot create tensor");let d=N.cast(l,"float32"),i=t.filter.equalization?await H2(d):N.expandDims(d,0);if(N.dispose([l,d]),t.filter.autoBrightness){let f=N.max(i),b=await f.data();t.filter.brightness=b[0]>1?1-b[0]/255:1-b[0],N.dispose(f)}return{tensor:i,canvas:t.filter.return?R0:null}}async function L1(e,t){let n=!1;if(e.cacheSensitivity===0||!t.shape||t.shape.length!==4||t.shape[1]>3840||t.shape[2]>2160)return n;if(!K0.inputTensor)K0.inputTensor=N.clone(t);else if(K0.inputTensor.shape[1]!==t.shape[1]||K0.inputTensor.shape[2]!==t.shape[2])N.dispose(K0.inputTensor),K0.inputTensor=N.clone(t);else{let o={};o.diff=N.sub(t,K0.inputTensor),o.squared=N.mul(o.diff,o.diff),o.sum=N.sum(o.squared);let s=(await o.sum.data())[0]/(t.shape[1]||1)/(t.shape[2]||1)/255/3;N.dispose([K0.inputTensor,o.diff,o.squared,o.sum]),K0.inputTensor=N.clone(t),n=s<=(e.cacheSensitivity||0)}return n}async function C1(e,t,n){let o={};if(!t||!n||t.shape.length!==4||t.shape.length!==n.shape.length)return e.debug||u("invalid input tensor or tensor shapes do not match:",t.shape,n.shape),0;if(t.shape[0]!==1||n.shape[0]!==1||t.shape[3]!==3||n.shape[3]!==3)return e.debug||u("input tensors must be of shape [1, height, width, 3]:",t.shape,n.shape),0;o.input1=N.clone(t),o.input2=t.shape[1]!==n.shape[1]||t.shape[2]!==n.shape[2]?N.image.resizeBilinear(n,[t.shape[1],t.shape[2]]):N.clone(n),o.diff=N.sub(o.input1,o.input2),o.squared=N.mul(o.diff,o.diff),o.sum=N.sum(o.squared);let s=(await o.sum.data())[0]/(t.shape[1]||1)/(t.shape[2]||1)/255/3;return N.dispose([o.input1,o.input2,o.diff,o.squared,o.sum]),s}var z2=class{constructor(){k(this,"browser");k(this,"node");k(this,"worker");k(this,"platform","");k(this,"agent","");k(this,"backends",[]);k(this,"initial");k(this,"filter");k(this,"tfjs");k(this,"offscreen");k(this,"perfadd",!1);k(this,"tensorflow",{version:void 0,gpu:void 0});k(this,"wasm",{supported:void 0,backend:void 0,simd:void 0,multithread:void 0});k(this,"webgl",{supported:void 0,backend:void 0,version:void 0,renderer:void 0,shader:void 0,vendor:void 0});k(this,"webgpu",{supported:void 0,backend:void 0,adapter:void 0});k(this,"cpu",{model:void 0,flags:[]});k(this,"kernels",[]);k(this,"Canvas");k(this,"Image");k(this,"ImageData");if(this.browser=typeof navigator!="undefined",this.node=typeof process!="undefined"&&typeof process.versions!="undefined"&&typeof process.versions.node!="undefined",this.tfjs={version:I0.version["tfjs-core"]},this.offscreen=typeof OffscreenCanvas!="undefined",this.initial=!0,this.worker=this.browser&&this.offscreen?typeof WorkerGlobalScope!="undefined":void 0,typeof navigator!="undefined"){let t=navigator.userAgent.match(/\(([^()]+)\)/g);if(t!=null&&t[0]){let n=t[0].match(/\(([^()]+)\)/g);this.platform=n!=null&&n[0]?n[0].replace(/\(|\)/g,""):"",this.agent=navigator.userAgent.replace(t[0],""),this.platform[1]&&(this.agent=this.agent.replace(t[1],"")),this.agent=this.agent.replace(/ /g," ")}}else typeof process!="undefined"&&(this.platform=`${process.platform} ${process.arch}`,this.agent=`NodeJS ${process.version}`)}async updateBackend(){this.backends=Object.keys(I0.engine().registryFactory);try{this.tensorflow={version:I0.backend().binding?I0.backend().binding.TF_Version:void 0,gpu:I0.backend().binding?I0.backend().binding.isUsingGpuDevice():void 0}}catch(o){}this.wasm.supported=typeof WebAssembly!="undefined",this.wasm.backend=this.backends.includes("wasm"),this.wasm.supported&&this.wasm.backend&&(this.wasm.simd=await I0.env().getAsync("WASM_HAS_SIMD_SUPPORT"),this.wasm.multithread=await I0.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT"));let t=ee(100,100),n=t?t.getContext("webgl2"):void 0;this.webgl.supported=typeof n!="undefined",this.webgl.backend=this.backends.includes("webgl"),this.webgl.supported&&this.webgl.backend&&n&&(this.webgl.version=n.getParameter(n.VERSION),this.webgl.vendor=n.getParameter(n.VENDOR),this.webgl.renderer=n.getParameter(n.RENDERER),this.webgl.shader=n.getParameter(n.SHADING_LANGUAGE_VERSION)),this.webgpu.supported=this.browser&&typeof navigator.gpu!="undefined",this.webgpu.backend=this.backends.includes("webgpu");try{if(this.webgpu.supported){let o=await navigator.gpu.requestAdapter();this.webgpu.adapter=await(o==null?void 0:o.requestAdapterInfo())}}catch(o){this.webgpu.supported=!1}try{this.kernels=I0.getKernelsForBackend(I0.getBackend()).map(o=>o.kernelName.toLowerCase())}catch(o){}}updateCPU(){let t={model:"",flags:[]};this.node&&this.platform.startsWith("linux"),this.cpu?this.cpu=t:Object.defineProperty(this,"cpu",{value:t})}},v=new z2;var q2=class{constructor(){k(this,"config");k(this,"element");k(this,"stream");k(this,"devices",[]);k(this,"enumerate",async()=>{try{let t=await navigator.mediaDevices.enumerateDevices();this.devices=t.filter(n=>n.kind==="videoinput")}catch(t){this.devices=[]}return this.devices});k(this,"start",async t=>{if(t!=null&&t.debug&&(this.config.debug=t==null?void 0:t.debug),t!=null&&t.crop&&(this.config.crop=t==null?void 0:t.crop),t!=null&&t.mode&&(this.config.mode=t==null?void 0:t.mode),t!=null&&t.width&&(this.config.width=t==null?void 0:t.width),t!=null&&t.height&&(this.config.height=t==null?void 0:t.height),t!=null&&t.id&&(this.config.id=t==null?void 0:t.id),t!=null&&t.element)if(typeof t.element=="string"){let r=document.getElementById(t.element);if(r&&r instanceof HTMLVideoElement)this.element=r;else{this.config.debug&&u("webcam","cannot get dom element",t.element);return}}else if(t.element instanceof HTMLVideoElement)this.element=t.element;else{this.config.debug&&u("webcam","unknown dom element",t.element);return}else this.element=document.createElement("video");let n={audio:!1,video:{facingMode:this.config.mode==="front"?"user":"environment",resizeMode:this.config.crop?"crop-and-scale":"none",width:{ideal:this.config.width>0?this.config.width:window.innerWidth},height:{ideal:this.config.height>0?this.config.height:window.innerHeight}}};if(this.config.id&&(n.video.deviceId=this.config.id),this.element.addEventListener("play",()=>{this.config.debug&&u("webcam","play")}),this.element.addEventListener("pause",()=>{this.config.debug&&u("webcam","pause")}),this.element.addEventListener("click",async()=>{!this.element||!this.stream||(this.element.paused?await this.element.play():this.element.pause())}),!(navigator!=null&&navigator.mediaDevices)){this.config.debug&&u("webcam","no devices");return}try{this.stream=await navigator.mediaDevices.getUserMedia(n)}catch(r){u("webcam",r);return}if(!this.stream){this.config.debug&&u("webcam","no stream");return}this.element.srcObject=this.stream,await new Promise(r=>{this.element?this.element.onloadeddata=()=>r(!0):r(!1)}),await this.element.play(),this.config.debug&&u("webcam",{width:this.width,height:this.height,label:this.label,stream:this.stream,track:this.track,settings:this.settings,constraints:this.constraints,capabilities:this.capabilities})});k(this,"pause",()=>{this.element&&this.element.pause()});k(this,"play",async()=>{this.element&&await this.element.play()});k(this,"stop",()=>{this.config.debug&&u("webcam","stop"),this.track&&this.track.stop()});this.config={element:void 0,debug:!0,mode:"front",crop:!1,width:0,height:0}}get track(){if(!!this.stream)return this.stream.getVideoTracks()[0]}get capabilities(){if(!!this.track)return this.track.getCapabilities?this.track.getCapabilities():void 0}get constraints(){if(!!this.track)return this.track.getConstraints?this.track.getConstraints():void 0}get settings(){if(!this.stream)return;let t=this.stream.getVideoTracks()[0];return t.getSettings?t.getSettings():void 0}get label(){return this.track?this.track.label:""}get paused(){var t;return((t=this.element)==null?void 0:t.paused)||!1}get width(){var t;return((t=this.element)==null?void 0:t.videoWidth)||0}get height(){var t;return((t=this.element)==null?void 0:t.videoHeight)||0}};var c2=V(H());var Kt={};we(Kt,{age:()=>cr,"anti-spoofing":()=>Vr,antispoof:()=>_o,blazeface:()=>$o,"blazeface-back":()=>xr,"blazeface-front":()=>dr,"blazepose-detect":()=>Gr,"blazepose-detector2d":()=>yr,"blazepose-detector3d":()=>fr,"blazepose-full":()=>mr,"blazepose-heavy":()=>pr,"blazepose-lite":()=>ur,centernet:()=>er,default:()=>ns,efficientpose:()=>hr,"efficientpose-i-lite":()=>Zr,"efficientpose-ii-lite":()=>Xr,"efficientpose-iv":()=>qr,emotion:()=>tr,faceboxes:()=>br,facemesh:()=>nr,"facemesh-attention":()=>Tr,"facemesh-attention-alt":()=>gr,"facemesh-detection-full":()=>vr,"facemesh-detection-short":()=>Rr,"facemesh-orig":()=>Mr,faceres:()=>or,"faceres-deep":()=>Pr,gear:()=>kr,gender:()=>Er,"gender-ssrnet-imdb":()=>wr,handdetect:()=>zr,"handlandmark-full":()=>rr,"handlandmark-lite":()=>Sr,"handlandmark-sparse":()=>jr,handskeleton:()=>Nr,handtrack:()=>sr,"insightface-efficientnet-b0":()=>Ur,"insightface-ghostnet-strides1":()=>Yr,"insightface-ghostnet-strides2":()=>Kr,"insightface-mobilenet-emore":()=>Jr,"insightface-mobilenet-swish":()=>Qr,iris:()=>Ar,liveness:()=>ar,meet:()=>Ir,mobileface:()=>Or,mobilefacenet:()=>Lr,models:()=>ir,"movenet-lightning":()=>lr,"movenet-multipose":()=>Cr,"movenet-thunder":()=>Wr,nanodet:()=>Dr,"nanodet-e":()=>_r,"nanodet-g":()=>$r,"nanodet-m":()=>es,"nanodet-t":()=>ts,posenet:()=>Fr,rvm:()=>Br,selfie:()=>Hr});var _o=853098,$o=538928,er=4030290,tr=820516,nr=1477958,or=6978814,rr=5431368,sr=2964837,Ar=2599092,ar=592976,ir=0,lr=4650216,cr=161240,xr=538928,dr=402048,yr=7499400,fr=5928856,mr=6338290,pr=27501554,ur=2725490,hr=5651240,br=2013002,gr=2387598,Tr=2382414,vr=1026192,Rr=201268,Mr=2955780,Pr=13957620,kr=1498916,wr=161236,Er=201808,zr=3515612,Sr=2023432,jr=5286322,Nr=5502280,Ir=372228,Or=2183192,Lr=5171976,Cr=9448838,Wr=12477112,Dr=7574558,Fr=5032780,Br=3739355,Hr=212886,Gr=5928804,Vr=853098,Zr=2269064,Xr=5651240,qr=25643252,Ur=13013224,Yr=8093408,Kr=8049584,Jr=6938536,Qr=12168584,_r=12319156,$r=7574558,es=1887474,ts=5294216,ns={antispoof:_o,blazeface:$o,centernet:er,emotion:tr,facemesh:nr,faceres:or,"handlandmark-full":rr,handtrack:sr,iris:Ar,liveness:ar,models:ir,"movenet-lightning":lr,age:cr,"blazeface-back":xr,"blazeface-front":dr,"blazepose-detector2d":yr,"blazepose-detector3d":fr,"blazepose-full":mr,"blazepose-heavy":pr,"blazepose-lite":ur,efficientpose:hr,faceboxes:br,"facemesh-attention-alt":gr,"facemesh-attention":Tr,"facemesh-detection-full":vr,"facemesh-detection-short":Rr,"facemesh-orig":Mr,"faceres-deep":Pr,gear:kr,"gender-ssrnet-imdb":wr,gender:Er,handdetect:zr,"handlandmark-lite":Sr,"handlandmark-sparse":jr,handskeleton:Nr,meet:Ir,mobileface:Or,mobilefacenet:Lr,"movenet-multipose":Cr,"movenet-thunder":Wr,nanodet:Dr,posenet:Fr,rvm:Br,selfie:Hr,"blazepose-detect":Gr,"anti-spoofing":Vr,"efficientpose-i-lite":Zr,"efficientpose-ii-lite":Xr,"efficientpose-iv":qr,"insightface-efficientnet-b0":Ur,"insightface-ghostnet-strides1":Yr,"insightface-ghostnet-strides2":Kr,"insightface-mobilenet-emore":Jr,"insightface-mobilenet-swish":Qr,"nanodet-e":_r,"nanodet-g":$r,"nanodet-m":es,"nanodet-t":ts};var O0={cacheModels:!0,cacheSupported:!0,verbose:!0,debug:!1,modelBasePath:""},E0={};async function os(e,t){return O0.debug&&u("load model fetch:",e,t),fetch(e,t)}function W1(e){O0.cacheModels=e.cacheModels,O0.verbose=e.debug,O0.modelBasePath=e.modelBasePath}async function O(e){var c,d,i,y;let t=w1(O0.modelBasePath,e||"");t.toLowerCase().endsWith(".json")||(t+=".json");let n=t.includes("/")?t.split("/"):t.split("\\"),o=n[n.length-1].replace(".json",""),r="indexeddb://"+o;E0[o]={name:o,sizeFromManifest:0,sizeLoadedWeights:0,sizeDesired:Kt[o],inCache:!1,url:""},O0.cacheSupported=typeof indexedDB!="undefined";let s={};try{s=O0.cacheSupported&&O0.cacheModels?await c2.io.listModels():{}}catch(x){O0.cacheSupported=!1}E0[o].inCache=O0.cacheSupported&&O0.cacheModels&&Object.keys(s).includes(r),E0[o].url=E0[o].inCache?r:t;let A=typeof fetch=="undefined"?{}:{fetchFunc:(x,p)=>os(x,p)},a=new c2.GraphModel(E0[o].url,A),l=!1;try{a.findIOHandler(),O0.debug&&u("model load handler:",a.handler)}catch(x){u("error finding model i/o handler:",t,x)}try{let x=await((c=a.handler)==null?void 0:c.load())||null;E0[o].sizeFromManifest=((d=x==null?void 0:x.weightData)==null?void 0:d.byteLength)||0,x?a.loadSync(x):a=await c2.loadGraphModel(E0[o].inCache?r:t,A),E0[o].sizeLoadedWeights=((y=(i=a.artifacts)==null?void 0:i.weightData)==null?void 0:y.byteLength)||0,O0.verbose&&u("load:",{model:o,url:a.modelUrl,bytes:E0[o].sizeLoadedWeights}),l=!0}catch(x){u("error loading model:",t,x)}if(l&&O0.cacheModels&&O0.cacheSupported&&!E0[o].inCache)try{let x=await a.save(r);O0.debug&&u("model saved:",r,x)}catch(x){u("error saving model:",t,x)}return a}var Jt="3.0.0";var E=V(H());var m0=V(H());var n0={name:"humangl",priority:999,canvas:null,gl:null,extensions:[],webGLattr:{alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!1,desynchronized:!0}};function As(){let e=n0.gl;!e||(n0.extensions=e.getSupportedExtensions())}function D1(e){var t;if(e.config.backend==="humangl"&&(n0.name in m0.engine().registry&&!((t=n0==null?void 0:n0.gl)!=null&&t.getParameter(n0.gl.VERSION))&&(u("humangl error: backend invalid context"),e.models.reset()),!m0.findBackend(n0.name))){try{n0.canvas=ee(100,100)}catch(r){u("humangl error: cannot create canvas:",r);return}try{if(n0.gl=n0.canvas.getContext("webgl2",n0.webGLattr),!n0.gl){u("humangl error: cannot get webgl context");return}if(!n0.gl.getParameter(n0.gl.VERSION).includes("2.0")){u("backend override: using fallback webgl backend as webgl 2.0 is not detected"),e.config.backend="webgl";return}n0.canvas&&(n0.canvas.addEventListener("webglcontextlost",s=>{throw u("humangl error:",s.type),u("possible browser memory leak using webgl or conflict with multiple backend registrations"),e.emit("error"),new Error("backend error: webgl context lost")}),n0.canvas.addEventListener("webglcontextrestored",s=>{u("humangl error: context restored:",s)}),n0.canvas.addEventListener("webglcontextcreationerror",s=>{u("humangl error: context create:",s)}))}catch(r){u("humangl error: cannot get webgl context:",r);return}try{m0.setWebGLContext(2,n0.gl)}catch(r){u("humangl error: cannot set webgl context:",r);return}try{let r=new m0.GPGPUContext(n0.gl);m0.registerBackend(n0.name,()=>new m0.MathBackendWebGL(r),n0.priority)}catch(r){u("humangl error: cannot register webgl backend:",r);return}try{m0.getKernelsForBackend("webgl").forEach(s=>{let A={...s,backendName:n0.name};m0.registerKernel(A)})}catch(r){u("humangl error: cannot update webgl backend registration:",r);return}try{m0.env().flagRegistry.WEBGL_VERSION&&m0.env().set("WEBGL_VERSION",2)}catch(r){u("humangl error: cannot set WebGL backend flags:",r);return}As();let n=m0.backend(),o=typeof n.gpgpu!="undefined"?n.getGPGPUContext().gl:null;o?e.config.debug&&u("humangl backend registered:",{webgl:o.getParameter(o.VERSION),renderer:o.getParameter(o.RENDERER)}):u("humangl error: no current gl context:",o,n0.gl)}}var Ee=V(H()),C={tf255:255,tf1:1,tf2:2,tf05:.5,tf127:127.5,rgb:[.2989,.587,.114]};function F1(){C.tf255=Ee.scalar(255,"float32"),C.tf1=Ee.scalar(1,"float32"),C.tf2=Ee.scalar(2,"float32"),C.tf05=Ee.scalar(.5,"float32"),C.tf127=Ee.scalar(127.5,"float32"),C.rgb=Ee.tensor1d([.2989,.587,.114],"float32")}async function ls(){return await v.updateBackend(),v.browser?v.webgpu.supported&&v.webgpu.backend?"webgpu":v.webgl.supported&&v.webgl.backend?"webgl":v.wasm.supported&&v.wasm.backend?"wasm":"cpu":"tensorflow"}function cs(e){let t=[];if(!v.kernels.includes("mod")){let n={kernelName:"Mod",backendName:E.getBackend(),kernelFunc:o=>E.tidy(()=>E.sub(o.inputs.a,E.mul(E.div(o.inputs.a,o.inputs.b),o.inputs.b)))};E.registerKernel(n),v.kernels.push("mod"),t.push("mod")}if(!v.kernels.includes("floormod")){let n={kernelName:"FloorMod",backendName:E.getBackend(),kernelFunc:o=>E.tidy(()=>E.add(E.mul(E.floorDiv(o.inputs.a,o.inputs.b),o.inputs.b),E.mod(o.inputs.a,o.inputs.b)))};E.registerKernel(n),v.kernels.push("floormod"),t.push("floormod")}if(!v.kernels.includes("rotatewithoffset")&&e.softwareKernels){let n={kernelName:"RotateWithOffset",backendName:E.getBackend(),kernelFunc:o=>E.tidy(()=>{let r=E.getBackend();E.setBackend("cpu");let s=E.image.rotateWithOffset(o.inputs.image,o.attrs.radians,o.attrs.fillValue,o.attrs.center);return E.setBackend(r),s})};E.registerKernel(n),v.kernels.push("rotatewithoffset"),t.push("rotatewithoffset")}t.length>0&&e.debug&&u("registered kernels:",t)}var B1={};async function S2(e,t=!1){var n;if(e.state="backend",((n=e.config.backend)==null?void 0:n.length)===0&&(e.config.backend=await ls()),t||v.initial||e.config.backend&&e.config.backend.length>0&&E.getBackend()!==e.config.backend){let o=g();if(e.config.backend&&e.config.backend.length>0){if(typeof window=="undefined"&&typeof WorkerGlobalScope!="undefined"&&e.config.debug&&e.config.debug&&u("running inside web worker"),v.browser&&e.config.backend==="tensorflow"&&(e.config.debug&&u("override: backend set to tensorflow while running in browser"),e.config.backend="webgl"),v.node&&(e.config.backend==="webgl"||e.config.backend==="humangl")&&(e.config.debug&&u(`override: backend set to ${e.config.backend} while running in nodejs`),e.config.backend="tensorflow"),v.browser&&e.config.backend==="webgpu")if(typeof navigator=="undefined"||typeof navigator.gpu=="undefined")u("override: backend set to webgpu but browser does not support webgpu"),e.config.backend="webgl";else{let s=await navigator.gpu.requestAdapter();if(e.config.debug&&u("enumerated webgpu adapter:",s),!s)u("override: backend set to webgpu but browser reports no available gpu"),e.config.backend="webgl";else{let A="requestAdapterInfo"in s?await s.requestAdapterInfo():void 0;u("webgpu adapter info:",A)}}let r=Object.keys(E.engine().registryFactory);if(e.config.backend==="humangl"&&!r.includes("humangl")&&(D1(e),r=Object.keys(E.engine().registryFactory)),e.config.debug&&u("available backends:",r),r.includes(e.config.backend)||(u(`error: backend ${e.config.backend} not found in registry`),e.config.backend=v.node?"tensorflow":"webgl",e.config.debug&&u(`override: setting backend ${e.config.backend}`)),e.config.debug&&u("setting backend:",[e.config.backend]),e.config.backend==="wasm"){if(E.env().flagRegistry.CANVAS2D_WILL_READ_FREQUENTLY&&E.env().set("CANVAS2D_WILL_READ_FREQUENTLY",!0),e.config.debug&&u("wasm path:",e.config.wasmPath),typeof E.setWasmPaths!="undefined")E.setWasmPaths(e.config.wasmPath,e.config.wasmPlatformFetch);else throw new Error("backend error: attempting to use wasm backend but wasm path is not set");let s=!1,A=!1;try{s=await E.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT"),A=await E.env().getAsync("WASM_HAS_SIMD_SUPPORT"),e.config.debug&&u(`wasm execution: ${A?"simd":"no simd"} ${s?"multithreaded":"singlethreaded"}`),e.config.debug&&!A&&u("warning: wasm simd support is not enabled")}catch(a){u("wasm detection failed")}}try{await E.setBackend(e.config.backend),await E.ready()}catch(s){return u("error: cannot set backend:",e.config.backend,s),!1}e.config.debug&&(B1=JSON.parse(JSON.stringify(E.env().flags)))}if((E.getBackend()==="humangl"||E.getBackend()==="webgl")&&(E.env().flagRegistry.WEBGL_USE_SHAPES_UNIFORMS&&E.env().set("WEBGL_USE_SHAPES_UNIFORMS",!0),E.env().flagRegistry.WEBGL_EXP_CONV&&E.env().set("WEBGL_EXP_CONV",!0),e.config.debug&&typeof e.config.deallocate!="undefined"&&e.config.deallocate&&(u("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",!0),E.env().set("WEBGL_DELETE_TEXTURE_THRESHOLD",0))),E.getBackend(),e.config.debug){let r=E.env().flags,s={};for(let A of Object.keys(r))B1[A]!==r[A]&&(s[A]=r[A]);e.config.debug&&Object.keys(s).length>0&&u("backend:",E.getBackend(),"flags:",s)}if(e.config.flags&&Object.keys(e.config.flags).length>0){e.config.debug&&u("flags:",e.config.flags);for(let[r,s]of Object.entries(e.config.flags))E.env().set(r,s)}E.enableProdMode(),F1(),e.performance.initBackend=Math.trunc(g()-o),e.config.backend=E.getBackend(),await v.updateBackend(),cs(e.config),v.initial=!1}return!0}function U2(e,t){for(let n of e){let o={kernelName:n,backendName:t.backend,kernelFunc:r=>{var s;return t.debug&&u("kernelFunc",n,t.backend,r),(s=r==null?void 0:r.inputs)==null?void 0:s.info}};E.registerKernel(o)}v.kernels=E.getKernelsForBackend(E.getBackend()).map(n=>n.kernelName.toLowerCase())}var $2={};we($2,{all:()=>Hs,body:()=>K2,canvas:()=>Bs,face:()=>Y2,gesture:()=>_2,hand:()=>J2,init:()=>o5,object:()=>Q2,options:()=>x0,person:()=>Fs});var J0=e=>{if(!e)u("draw error: invalid canvas");else if(!e.getContext)u("draw error: canvas context not defined");else{let t=e.getContext("2d");if(!t)u("draw error: cannot get canvas context");else return t}return null},Ue=e=>Math.round(e*180/Math.PI),_=(e,t,n)=>e.replace(t,typeof n=="number"?n.toFixed(1):n),Ye=(e,t)=>{if(!t.useDepth||typeof e=="undefined")return t.color;let n=Uint8ClampedArray.from([127+2*e,127-2*e,255]);return`rgba(${n[0]}, ${n[1]}, ${n[2]}, ${t.alpha})`};function te(e,t,n,o,r){let s=t.replace(/\[.*\]/g,"").split(` +`).map(a=>a.trim()),A=Math.max(0,n);for(let a=s.length-1;a>=0;a--){let l=a*r.lineHeight+o;r.shadowColor&&r.shadowColor!==""&&(e.fillStyle=r.shadowColor,e.fillText(s[a],A+5,l+16)),e.fillStyle=r.labelColor,e.fillText(s[a],A+4,l+15)}}function be(e,t,n,o,r){e.fillStyle=Ye(o,r),e.beginPath(),e.arc(t,n,r.pointSize,0,2*Math.PI),e.fill()}function me(e,t,n,o,r,s){if(e.beginPath(),e.lineWidth=s.lineWidth,s.useCurves){let A=(t+t+o)/2,a=(n+n+r)/2;e.ellipse(A,a,o/2,r/2,0,0,2*Math.PI)}else e.moveTo(t+s.roundRect,n),e.lineTo(t+o-s.roundRect,n),e.quadraticCurveTo(t+o,n,t+o,n+s.roundRect),e.lineTo(t+o,n+r-s.roundRect),e.quadraticCurveTo(t+o,n+r,t+o-s.roundRect,n+r),e.lineTo(t+s.roundRect,n+r),e.quadraticCurveTo(t,n+r,t,n+r-s.roundRect),e.lineTo(t,n+s.roundRect),e.quadraticCurveTo(t,n,t+s.roundRect,n),e.closePath();e.stroke()}function Qt(e,t,n){if(!(t.length<2)){e.beginPath(),e.moveTo(t[0][0],t[0][1]);for(let o of t)e.strokeStyle=Ye(o[2]||0,n),e.lineTo(Math.trunc(o[0]),Math.trunc(o[1]));e.stroke(),n.fillPolygons&&(e.closePath(),e.fill())}}function G1(e,t,n){if(!(t.length<2)){if(e.lineWidth=n.lineWidth,!n.useCurves||t.length<=2){Qt(e,t,n);return}e.moveTo(t[0][0],t[0][1]);for(let o=0;oj2[e]),L4=ds.map(e=>j2[e]),C4=ys.map(e=>j2[e]);function ze(e){let t=e.map(n=>n[0]);return t.push(e[e.length-1][1]),t}var fs=[[61,146],[146,91],[91,181],[181,84],[84,17],[17,314],[314,405],[405,321],[321,375],[375,291],[61,185],[185,40],[40,39],[39,37],[37,0],[0,267],[267,269],[269,270],[270,409],[409,291],[78,95],[95,88],[88,178],[178,87],[87,14],[14,317],[317,402],[402,318],[318,324],[324,308],[78,191],[191,80],[80,81],[81,82],[82,13],[13,312],[312,311],[311,310],[310,415],[415,308]],ms=[[263,249],[249,390],[390,373],[373,374],[374,380],[380,381],[381,382],[382,362],[263,466],[466,388],[388,387],[387,386],[386,385],[385,384],[384,398],[398,362]],ps=[[276,283],[283,282],[282,295],[295,285],[300,293],[293,334],[334,296],[296,336]],us=[[474,475],[475,476],[476,477],[477,474]],hs=[[33,7],[7,163],[163,144],[144,145],[145,153],[153,154],[154,155],[155,133],[33,246],[246,161],[161,160],[160,159],[159,158],[158,157],[157,173],[173,133]],bs=[[46,53],[53,52],[52,65],[65,55],[70,63],[63,105],[105,66],[66,107]],gs=[[469,470],[470,471],[471,472],[472,469]],Ts=[[10,338],[338,297],[297,332],[332,284],[284,251],[251,389],[389,356],[356,454],[454,323],[323,361],[361,288],[288,397],[397,365],[365,379],[379,378],[378,400],[400,377],[377,152],[152,148],[148,176],[176,149],[149,150],[150,136],[136,172],[172,58],[58,132],[132,93],[93,234],[234,127],[127,162],[162,21],[21,54],[54,103],[103,67],[67,109],[109,10]],W4={lips:ze(fs),leftEye:ze(ms),leftEyebrow:ze(ps),leftIris:ze(us),rightEye:ze(hs),rightEyebrow:ze(bs),rightIris:ze(gs),faceOval:ze(Ts)};var vs=[[61,146],[146,91],[91,181],[181,84],[84,17],[17,314],[314,405],[405,321],[321,375],[375,291],[61,185],[185,40],[40,39],[39,37],[37,0],[0,267],[267,269],[269,270],[270,409],[409,291],[78,95],[95,88],[88,178],[178,87],[87,14],[14,317],[317,402],[402,318],[318,324],[324,308],[78,191],[191,80],[80,81],[81,82],[82,13],[13,312],[312,311],[311,310],[310,415],[415,308]],Rs=[[263,249],[249,390],[390,373],[373,374],[374,380],[380,381],[381,382],[382,362],[263,466],[466,388],[388,387],[387,386],[386,385],[385,384],[384,398],[398,362]],Ms=[[276,283],[283,282],[282,295],[295,285],[300,293],[293,334],[334,296],[296,336]],Ps=[[474,475],[475,476],[476,477],[477,474]],ks=[[33,7],[7,163],[163,144],[144,145],[145,153],[153,154],[154,155],[155,133],[33,246],[246,161],[161,160],[160,159],[159,158],[158,157],[157,173],[173,133]],ws=[[46,53],[53,52],[52,65],[65,55],[70,63],[63,105],[105,66],[66,107]],Es=[[469,470],[470,471],[471,472],[472,469]],zs=[[10,338],[338,297],[297,332],[332,284],[284,251],[251,389],[389,356],[356,454],[454,323],[323,361],[361,288],[288,397],[397,365],[365,379],[379,378],[378,400],[400,377],[377,152],[152,148],[148,176],[176,149],[149,150],[150,136],[136,172],[172,58],[58,132],[132,93],[93,234],[234,127],[127,162],[162,21],[21,54],[54,103],[103,67],[67,109],[109,10]];function Se(e){let t=e.map(n=>n[0]);return t.push(e[e.length-1][1]),t}var Ss={lips:Se(vs),leftEye:Se(Rs),leftEyebrow:Se(Ms),leftIris:Se(Ps),rightEye:Se(ks),rightEyebrow:Se(ws),rightIris:Se(Es),faceOval:Se(zs)},js=Object.entries(Ss).map(([e,t])=>t.map(n=>[n,e])).flat(),D4=new Map(js),N2=[61,146,91,181,84,17,314,405,321,375,291,185,40,39,37,0,267,269,270,409,78,95,88,178,87,14,317,402,318,324,308,191,80,81,82,13,312,311,310,415,76,77,90,180,85,16,315,404,320,307,306,184,74,73,72,11,302,303,304,408,62,96,89,179,86,15,316,403,319,325,292,183,42,41,38,12,268,271,272,407],Qe=[33,7,163,144,145,153,154,155,133,246,161,160,159,158,157,173,130,25,110,24,23,22,26,112,243,247,30,29,27,28,56,190,226,31,228,229,230,231,232,233,244,113,225,224,223,222,221,189,35,124,46,53,52,65,143,111,117,118,119,120,121,128,245,156,70,63,105,66,107,55,193],_e=[263,249,390,373,374,380,381,382,362,466,388,387,386,385,384,398,359,255,339,254,253,252,256,341,463,467,260,259,257,258,286,414,446,261,448,449,450,451,452,453,464,342,445,444,443,442,441,413,265,353,276,283,282,295,372,340,346,347,348,349,350,357,465,383,300,293,334,296,336,285,417];var K;function Ns(e,t){var o,r,s,A,a,l,c,d,i;if(!K.drawLabels||((o=K.faceLabels)==null?void 0:o.length)===0)return;let n=K.faceLabels.slice();if(e.score&&(n=_(n,"[score]",100*e.score)),e.gender&&(n=_(n,"[gender]",e.gender)),e.genderScore&&(n=_(n,"[genderScore]",100*e.genderScore)),e.age&&(n=_(n,"[age]",e.age)),e.distance&&(n=_(n,"[distance]",100*e.distance)),e.real&&(n=_(n,"[real]",100*e.real)),e.live&&(n=_(n,"[live]",100*e.live)),e.emotion&&e.emotion.length>0){let y=e.emotion.map(x=>`${Math.trunc(100*x.score)}% ${x.emotion}`);y.length>3&&(y.length=3),n=_(n,"[emotions]",y.join(" "))}(s=(r=e.rotation)==null?void 0:r.angle)!=null&&s.roll&&(n=_(n,"[roll]",Ue(e.rotation.angle.roll))),(a=(A=e.rotation)==null?void 0:A.angle)!=null&&a.yaw&&(n=_(n,"[yaw]",Ue(e.rotation.angle.yaw))),(c=(l=e.rotation)==null?void 0:l.angle)!=null&&c.pitch&&(n=_(n,"[pitch]",Ue(e.rotation.angle.pitch))),(i=(d=e.rotation)==null?void 0:d.gaze)!=null&&i.bearing&&(n=_(n,"[gaze]",Ue(e.rotation.gaze.bearing))),te(t,n,e.box[0],e.box[1],K)}function Is(e,t){var n,o,r,s;if(((n=e.annotations)==null?void 0:n.leftEyeIris)&&((o=e.annotations)==null?void 0:o.leftEyeIris[0])){t.strokeStyle=K.useDepth?"rgba(255, 200, 255, 0.3)":K.color,t.beginPath();let A=Math.abs(e.annotations.leftEyeIris[3][0]-e.annotations.leftEyeIris[1][0])/2,a=Math.abs(e.annotations.leftEyeIris[4][1]-e.annotations.leftEyeIris[2][1])/2;t.ellipse(e.annotations.leftEyeIris[0][0],e.annotations.leftEyeIris[0][1],A,a,0,0,2*Math.PI),t.stroke(),K.fillPolygons&&(t.fillStyle=K.useDepth?"rgba(255, 255, 200, 0.3)":K.color,t.fill())}if(((r=e.annotations)==null?void 0:r.rightEyeIris)&&((s=e.annotations)==null?void 0:s.rightEyeIris[0])){t.strokeStyle=K.useDepth?"rgba(255, 200, 255, 0.3)":K.color,t.beginPath();let A=Math.abs(e.annotations.rightEyeIris[3][0]-e.annotations.rightEyeIris[1][0])/2,a=Math.abs(e.annotations.rightEyeIris[4][1]-e.annotations.rightEyeIris[2][1])/2;t.ellipse(e.annotations.rightEyeIris[0][0],e.annotations.rightEyeIris[0][1],A,a,0,0,2*Math.PI),t.stroke(),K.fillPolygons&&(t.fillStyle=K.useDepth?"rgba(255, 255, 200, 0.3)":K.color,t.fill())}}function Os(e,t){var n;if(K.drawGaze&&((n=e.rotation)==null?void 0:n.angle)&&typeof Path2D!="undefined"){t.strokeStyle="pink";let o=e.box[0]+e.box[2]/2-e.box[3]*Ue(e.rotation.angle.yaw)/90,r=e.box[1]+e.box[3]/2+e.box[2]*Ue(e.rotation.angle.pitch)/90,s=new Path2D(` + M ${e.box[0]+e.box[2]/2} ${e.box[1]} + C + ${o} ${e.box[1]}, + ${o} ${e.box[1]+e.box[3]}, + ${e.box[0]+e.box[2]/2} ${e.box[1]+e.box[3]} + `),A=new Path2D(` + M ${e.box[0]} ${e.box[1]+e.box[3]/2} + C + ${e.box[0]} ${r}, + ${e.box[0]+e.box[2]} ${r}, + ${e.box[0]+e.box[2]} ${e.box[1]+e.box[3]/2} + `);t.stroke(A),t.stroke(s)}}function Ls(e,t){var n;if(K.drawGaze&&((n=e.rotation)==null?void 0:n.gaze.strength)&&e.rotation.gaze.bearing&&e.annotations.leftEyeIris&&e.annotations.rightEyeIris&&e.annotations.leftEyeIris[0]&&e.annotations.rightEyeIris[0]){t.strokeStyle="pink",t.fillStyle="pink";let o=[e.annotations.leftEyeIris[0][0]+Math.sin(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[3],e.annotations.leftEyeIris[0][1]+Math.cos(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[2]];_t(t,[e.annotations.leftEyeIris[0][0],e.annotations.leftEyeIris[0][1]],[o[0],o[1]],4);let r=[e.annotations.rightEyeIris[0][0]+Math.sin(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[3],e.annotations.rightEyeIris[0][1]+Math.cos(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[2]];_t(t,[e.annotations.rightEyeIris[0][0],e.annotations.rightEyeIris[0][1]],[r[0],r[1]],4)}}function Cs(e,t){if(K.drawPolygons&&e.mesh.length>=468){t.lineWidth=1;for(let n=0;ne.mesh[r]);Qt(t,o,K)}Is(e,t)}}function Ws(e,t){if(K.drawPoints&&e.mesh.length>=468)for(let n=0;n0&&(Ws(r,o),Cs(r,o),Os(r,o),Ls(r,o))}}function K2(e,t,n){var s,A;let o=A0(x0,n);if(!t||!e)return;let r=J0(e);if(!!r){r.lineJoin="round";for(let a=0;a0)){let l=o.bodyLabels.slice();l=_(l,"[score]",100*t[a].score),te(r,l,t[a].box[0],t[a].box[1],o)}if(o.drawPoints&&t[a].keypoints)for(let l=0;l0&&t[a].keypoints){r.font=o.font;for(let l of t[a].keypoints){if(!l.score||l.score===0)continue;let c=o.bodyPartLabels.slice();c=_(c,"[label]",l.part),c=_(c,"[score]",100*l.score),te(r,c,l.position[0],l.position[1],o)}}if(o.drawPolygons&&t[a].keypoints&&t[a].annotations)for(let l of Object.values(t[a].annotations))for(let c of l)G1(r,c,o)}}}function J2(e,t,n){var s,A;let o=A0(x0,n);if(!t||!e)return;let r=J0(e);if(!!r){r.lineJoin="round",r.font=o.font;for(let a of t){if(o.drawBoxes){if(r.strokeStyle=o.color,r.fillStyle=o.color,me(r,a.box[0],a.box[1],a.box[2],a.box[3],o),o.drawLabels&&((s=o.handLabels)==null?void 0:s.length)>0){let l=o.handLabels.slice();l=_(l,"[label]",a.label),l=_(l,"[score]",100*a.score),te(r,l,a.box[0],a.box[1],o)}r.stroke()}if(o.drawPoints&&a.keypoints&&a.keypoints.length>0)for(let l of a.keypoints)r.fillStyle=Ye(l[2],o),be(r,l[0],l[1],0,o);if(o.drawLabels&&a.annotations&&((A=o.fingerLabels)==null?void 0:A.length)>0)for(let[l,c]of Object.entries(a.annotations)){let d=o.fingerLabels.slice();d=_(d,"[label]",l),te(r,d,c[c.length-1][0],c[c.length-1][1],o)}if(o.drawPolygons&&a.annotations){let l=c=>{if(!(!c||c.length===0||!c[0]))for(let d=0;d0?d-1:0][0],c[d>0?d-1:0][1]),r.lineTo(c[d][0],c[d][1]),r.stroke()}};r.lineWidth=o.lineWidth,l(a.annotations.index),l(a.annotations.middle),l(a.annotations.ring),l(a.annotations.pinky),l(a.annotations.thumb)}}}}function Q2(e,t,n){var s;let o=A0(x0,n);if(!t||!e)return;let r=J0(e);if(!!r){r.lineJoin="round",r.font=o.font;for(let A of t)if(o.drawBoxes){if(r.strokeStyle=o.color,r.fillStyle=o.color,me(r,A.box[0],A.box[1],A.box[2],A.box[3],o),o.drawLabels&&((s=o.objectLabels)==null?void 0:s.length)>0){let a=o.objectLabels.slice();a=_(a,"[label]",A.label),a=_(a,"[score]",100*A.score),te(r,a,A.box[0],A.box[1],o)}r.stroke()}}}function _2(e,t,n){var r;let o=A0(x0,n);if(!(!t||!e)&&o.drawGestures&&((r=o.gestureLabels)==null?void 0:r.length)>0){let s=J0(e);if(!s)return;s.font=o.font,s.fillStyle=o.color;let A=1;for(let a=0;a1&&c[1].length>0){let d=l[1]>0?`#${l[1]}`:"",i=o.gestureLabels.slice();i=_(i,"[where]",l[0]),i=_(i,"[who]",d),i=_(i,"[what]",c[1]),te(s,i,8,2+A*o.lineHeight,o),A+=1}}}}var je={face:`face + confidence: [score]% + [gender] [genderScore]% + age: [age] years + distance: [distance]cm + real: [real]% + live: [live]% + [emotions] + roll: [roll]\xB0 yaw:[yaw]\xB0 pitch:[pitch]\xB0 + gaze: [gaze]\xB0`,body:"body [score]%",bodyPart:"[label] [score]%",object:"[label] [score]%",hand:"[label] [score]%",finger:"[label]",gesture:"[where] [who]: [what]"};var n5=0;function Fs(e,t,n){let o=A0(x0,n);if(!t||!e)return;let r=J0(e);if(!!r){r.lineJoin="round",r.font=o.font;for(let s=0;ss5,kpt:()=>r5});var r5=["nose","leftEyeInside","leftEye","leftEyeOutside","rightEyeInside","rightEye","rightEyeOutside","leftEar","rightEar","leftMouth","rightMouth","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftPinky","rightPinky","leftIndex","rightIndex","leftThumb","rightThumb","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle","leftHeel","rightHeel","leftFoot","rightFoot","bodyCenter","bodyTop","leftPalm","leftHand","rightPalm","rightHand"],s5={shoulders:["leftShoulder","rightShoulder"],hips:["rightHip","leftHip"],mouth:["leftMouth","rightMouth"],leftLegUpper:["leftHip","leftKnee"],leftLegLower:["leftKnee","leftAnkle"],leftFoot:["leftAnkle","leftHeel","leftFoot"],leftTorso:["leftShoulder","leftHip"],leftArmUpper:["leftShoulder","leftElbow"],leftArmLower:["leftElbow","leftWrist"],leftHand:["leftWrist","leftPalm"],leftHandPinky:["leftPalm","leftPinky"],leftHandIndex:["leftPalm","leftIndex"],leftHandThumb:["leftPalm","leftThumb"],leftEyeOutline:["leftEyeInside","leftEyeOutside"],rightLegUpper:["rightHip","rightKnee"],rightLegLower:["rightKnee","rightAnkle"],rightFoot:["rightAnkle","rightHeel","rightFoot"],rightTorso:["rightShoulder","rightHip"],rightArmUpper:["rightShoulder","rightElbow"],rightArmLower:["rightElbow","rightWrist"],rightHand:["rightWrist","rightPalm"],rightHandPinky:["rightPalm","rightPinky"],rightHandIndex:["rightPalm","rightIndex"],rightHandThumb:["rightPalm","rightThumb"],rightEyeOutline:["rightEyeInside","rightEyeOutside"]};var D=V(H());var Q0,$e=224,X1,Gs=5,tt=[8,16,32,32,32];function Vs(){let e=[],t=0;for(;tn.x)),y:D.tensor1d(e.map(n=>n.y))}}async function q1(e){if(v.initial&&(Q0=null),!Q0&&e.body.detector&&e.body.detector.modelPath){Q0=await O(e.body.detector.modelPath);let t=Q0!=null&&Q0.executor?Object.values(Q0.modelSignature.inputs):void 0;$e=Array.isArray(t)?parseInt(t[0].tensorShape.dim[1].size):0}else e.debug&&Q0&&u("cached model:",Q0.modelUrl);return Vs(),Q0}var Z1=[5,5];function Zs(e,t){return D.tidy(()=>{let n=D.split(e,12,1),o=D.squeeze(n[0]),r=D.squeeze(n[1]),s=D.squeeze(n[2]),A=D.squeeze(n[3]);o=D.add(D.div(o,$e),t.x),r=D.add(D.div(r,$e),t.y),s=D.mul(D.div(s,$e),Z1[0]),A=D.mul(D.div(A,$e),Z1[1]);let a=D.sub(o,D.div(s,2)),l=D.sub(r,D.div(A,2)),c=D.add(a,s),d=D.add(l,A);return D.stack([a,l,c,d],1)})}async function Xs(e,t,n,o){var c,d;let r=[],s={};s.boxes=Zs(e,X1),s.scores=D.sigmoid(t),s.nms=await D.image.nonMaxSuppressionAsync(s.boxes,s.scores,1,((c=n.body.detector)==null?void 0:c.minConfidence)||.1,((d=n.body.detector)==null?void 0:d.iouThreshold)||.1);let A=await s.nms.data(),a=await s.scores.data(),l=await s.boxes.array();for(let i of Array.from(A)){let y=a[i],x=l[i],p=[Math.round(x[0]*o[0]),Math.round(x[1]*o[1]),Math.round(x[2]*o[0]),Math.round(x[3]*o[1])],f={score:y,boxRaw:x,box:p};r.push(f)}return Object.keys(s).forEach(i=>D.dispose(s[i])),r}async function U1(e,t,n){let o={};o.res=Q0==null?void 0:Q0.execute(e,["Identity"]),o.logitsRaw=D.slice(o.res,[0,0,0],[1,-1,1]),o.boxesRaw=D.slice(o.res,[0,0,1],[1,-1,-1]),o.logits=D.squeeze(o.logitsRaw),o.boxes=D.squeeze(o.boxesRaw);let r=await Xs(o.boxes,o.logits,t,n);return Object.keys(o).forEach(s=>D.dispose(o[s])),r}function ge(e,t=[1,1]){let n=[e.map(a=>a[0]),e.map(a=>a[1])],o=[Math.min(...n[0]),Math.min(...n[1])],r=[Math.max(...n[0]),Math.max(...n[1])],s=[o[0],o[1],r[0]-o[0],r[1]-o[1]],A=[s[0]/t[0],s[1]/t[1],s[2]/t[0],s[3]/t[1]];return{box:s,boxRaw:A}}function Y1(e,t=[1,1]){let n=[e.map(c=>c[0]),e.map(c=>c[1])],o=[Math.min(...n[0]),Math.min(...n[1])],r=[Math.max(...n[0]),Math.max(...n[1])],s=[(o[0]+r[0])/2,(o[1]+r[1])/2],A=Math.max(s[0]-o[0],s[1]-o[1],-s[0]+r[0],-s[1]+r[1]),a=[Math.trunc(s[0]-A),Math.trunc(s[1]-A),Math.trunc(2*A),Math.trunc(2*A)],l=[a[0]/t[0],a[1]/t[1],a[2]/t[0],a[3]/t[1]];return{box:a,boxRaw:l}}function nt(e,t){let n=[e[2]*t,e[3]*t];return[e[0]-(n[0]-e[2])/2,e[1]-(n[1]-e[3])/2,n[0],n[1]]}var F0,a5=256,A5=Number.MAX_SAFE_INTEGER,qs={landmarks:["ld_3d","activation_segmentation","activation_heatmap","world_3d","output_poseflag"],detector:[]},rt=[],Ne=[[0,0],[0,0],[0,0],[0,0]],K1=0,J1=e=>1-1/(1+Math.exp(e)),_1=e=>q1(e);async function $1(e){if(v.initial&&(F0=null),F0)e.debug&&u("cached model:",F0.modelUrl);else{F0=await O(e.body.modelPath);let t=F0!=null&&F0.executor?Object.values(F0.modelSignature.inputs):void 0;a5=Array.isArray(t)?parseInt(t[0].tensorShape.dim[1].size):0}return F0}function Q1(e,t,n){var s,A;let o={};if(!((s=e==null?void 0:e.shape)!=null&&s[1])||!((A=e==null?void 0:e.shape)!=null&&A[2]))return e;let r;if(n&&(o.cropped=B0.image.cropAndResize(e,[n],[0],[e.shape[1],e.shape[2]])),e.shape[1]!==e.shape[2]){let a=[e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0,e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0],l=[e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0,e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0];Ne=[[0,0],a,l,[0,0]],o.pad=B0.pad(o.cropped||e,Ne),o.resize=B0.image.resizeBilinear(o.pad,[t,t]),r=B0.div(o.resize,C.tf255)}else e.shape[1]!==t?(o.resize=B0.image.resizeBilinear(o.cropped||e,[t,t]),r=B0.div(o.resize,C.tf255)):r=B0.div(o.cropped||e,C.tf255);return Object.keys(o).forEach(a=>B0.dispose(o[a])),r}function Us(e,t,n){for(let o of e)o.position=[Math.trunc(o.position[0]*(t[0]+Ne[2][0]+Ne[2][1])/t[0]-Ne[2][0]),Math.trunc(o.position[1]*(t[1]+Ne[1][0]+Ne[1][1])/t[1]-Ne[1][0]),o.position[2]],o.positionRaw=[o.position[0]/t[0],o.position[1]/t[1],2*o.position[2]/(t[0]+t[1])];if(n){let o=n[2]-n[0],r=n[3]-n[1];for(let s of e)s.positionRaw=[s.positionRaw[0]/r+n[1],s.positionRaw[1]/o+n[0],s.positionRaw[2]],s.position=[Math.trunc(s.positionRaw[0]*t[0]),Math.trunc(s.positionRaw[1]*t[1]),s.positionRaw[2]]}return e}function Ys(e){let t=e.find(a=>a.part==="leftPalm"),n=e.find(a=>a.part==="leftWrist"),o=e.find(a=>a.part==="leftIndex");t.position[2]=((n.position[2]||0)+(o.position[2]||0))/2;let r=e.find(a=>a.part==="rightPalm"),s=e.find(a=>a.part==="rightWrist"),A=e.find(a=>a.part==="rightIndex");r.position[2]=((s.position[2]||0)+(A.position[2]||0))/2}async function Ks(e,t,n){if(!(F0!=null&&F0.executor))return null;let o={};[o.ld,o.segmentation,o.heatmap,o.world,o.poseflag]=F0==null?void 0:F0.execute(e,qs.landmarks);let r=(await o.poseflag.data())[0],s=await o.ld.data(),A=await o.world.data();Object.keys(o).forEach(p=>B0.dispose(o[p]));let a=[],l=5;for(let p=0;pp.position),i=ge(d,[n[0],n[1]]),y={};for(let[p,f]of Object.entries(s5)){let b=[];for(let M=0;Mh.part===f[M]),m=c.find(h=>h.part===f[M+1]);T&&m&&b.push([T.position,m.position])}y[p]=b}return{id:0,score:Math.trunc(100*r)/100,box:i.box,boxRaw:i.boxRaw,keypoints:c,annotations:y}}async function i5(e,t){var s,A,a;let n=[e.shape[2]||0,e.shape[1]||0],o=(t.body.skipTime||0)>g()-K1,r=A5<(t.body.skipFrames||0);if(t.skipAllowed&&o&&r&&rt!==null)A5++;else{let l=[];if((A=(s=t.body)==null?void 0:s.detector)!=null&&A.enabled){let c=Q1(e,224);l=await U1(c,t,n),B0.dispose(c)}else l=[{box:[0,0,0,0],boxRaw:[0,0,1,1],score:0}];for(let c=0;cL0.dispose(o[c])),r}async function x5(e,t){if(!(H0!=null&&H0.executor))return[];let n=(t.object.skipTime||0)>g()-t3,o=c5<(t.object.skipFrames||0);return t.skipAllowed&&n&&o&&l5.length>0?(c5++,l5):(c5=0,new Promise(async r=>{let s=[e.shape[2]||0,e.shape[1]||0],A=L0.image.resizeBilinear(e,[e2,e2]),a=t.object.enabled?H0==null?void 0:H0.execute(A,["tower_0/detections"]):null;t3=g(),L0.dispose(A);let l=await Js(a,s,t);l5=l,r(l)}))}var J=V(H());var st={};we(st,{connected:()=>y5,kpt:()=>d5});var d5=["head","neck","rightShoulder","rightElbow","rightWrist","chest","leftShoulder","leftElbow","leftWrist","bodyCenter","rightHip","rightKnee","rightAnkle","leftHip","leftKnee","leftAnkle"],y5={leftLeg:["leftHip","leftKnee","leftAnkle"],rightLeg:["rightHip","rightKnee","rightAnkle"],torso:["leftShoulder","rightShoulder","rightHip","leftHip","leftShoulder"],leftArm:["leftShoulder","leftElbow","leftWrist"],rightArm:["rightShoulder","rightElbow","rightWrist"],head:[]};var a0,r3=0,C0={id:0,keypoints:[],box:[0,0,0,0],boxRaw:[0,0,0,0],score:0,annotations:{}},f5=Number.MAX_SAFE_INTEGER;async function s3(e){return v.initial&&(a0=null),a0?e.debug&&u("cached model:",a0.modelUrl):a0=await O(e.body.modelPath),a0}async function Qs(e,t){let[n,o]=e.shape,r=J.reshape(e,[o*n]),s=J.max(r,0),A=(await s.data())[0];if(A>t){let a=J.argMax(r,0),l=J.mod(a,n),c=(await l.data())[0],d=J.div(a,n),i=(await d.data())[0];return J.dispose([r,s,a,l,d]),[c,i,A]}return J.dispose([r,s]),[0,0,A]}async function m5(e,t){if(!(a0!=null&&a0.executor)||!(a0!=null&&a0.inputs[0].shape))return[];let n=(t.body.skipTime||0)>g()-r3,o=f5<(t.body.skipFrames||0);return t.skipAllowed&&n&&o&&Object.keys(C0.keypoints).length>0?(f5++,[C0]):(f5=0,new Promise(async r=>{let s=J.tidy(()=>{var p,f;let i=J.image.resizeBilinear(e,[((p=a0==null?void 0:a0.inputs[0].shape)==null?void 0:p[2])||0,((f=a0==null?void 0:a0.inputs[0].shape)==null?void 0:f[1])||0],!1),y=J.mul(i,C.tf2);return J.sub(y,C.tf1)}),A;if(t.body.enabled&&(A=a0==null?void 0:a0.execute(s)),r3=g(),J.dispose(s),A){C0.keypoints.length=0;let i=J.squeeze(A);J.dispose(A);let y=J.unstack(i,2);J.dispose(i);for(let x=0;x(t.body.minConfidence||0)&&C0.keypoints.push({score:Math.round(100*b)/100,part:d5[x],positionRaw:[p/a0.inputs[0].shape[2],f/a0.inputs[0].shape[1]],position:[Math.round(e.shape[2]*p/a0.inputs[0].shape[2]),Math.round(e.shape[1]*f/a0.inputs[0].shape[1])]})}y.forEach(x=>J.dispose(x))}C0.score=C0.keypoints.reduce((i,y)=>y.score>i?y.score:i,0);let a=C0.keypoints.map(i=>i.position[0]),l=C0.keypoints.map(i=>i.position[1]);C0.box=[Math.min(...a),Math.min(...l),Math.max(...a)-Math.min(...a),Math.max(...l)-Math.min(...l)];let c=C0.keypoints.map(i=>i.positionRaw[0]),d=C0.keypoints.map(i=>i.positionRaw[1]);C0.boxRaw=[Math.min(...c),Math.min(...d),Math.max(...c)-Math.min(...c),Math.max(...d)-Math.min(...d)];for(let[i,y]of Object.entries(y5)){let x=[];for(let p=0;pM.part===y[p]),b=C0.keypoints.find(M=>M.part===y[p+1]);f&&b&&f.score>(t.body.minConfidence||0)&&b.score>(t.body.minConfidence||0)&&x.push([f.position,b.position])}C0.annotations[i]=x}r([C0])}))}var i0=V(H());var Le=V(H());var L=V(H());var Te=V(H());var d2=e=>[Math.abs(e.endPoint[0]-e.startPoint[0]),Math.abs(e.endPoint[1]-e.startPoint[1])],At=e=>[e.startPoint[0]+(e.endPoint[0]-e.startPoint[0])/2,e.startPoint[1]+(e.endPoint[1]-e.startPoint[1])/2,1],at=(e,t)=>e?[Math.trunc(Math.max(0,e.startPoint[0])),Math.trunc(Math.max(0,e.startPoint[1])),Math.trunc(Math.min(t.shape[2]||0,e.endPoint[0])-Math.max(0,e.startPoint[0])),Math.trunc(Math.min(t.shape[1]||0,e.endPoint[1])-Math.max(0,e.startPoint[1]))]:[0,0,0,0],it=(e,t)=>e?[e.startPoint[0]/(t.shape[2]||0),e.startPoint[1]/(t.shape[1]||0),(e.endPoint[0]-e.startPoint[0])/(t.shape[2]||0),(e.endPoint[1]-e.startPoint[1])/(t.shape[1]||0)]:[0,0,0,0],l3=(e,t)=>{let n=[e.startPoint[0]*t[0],e.startPoint[1]*t[1]],o=[e.endPoint[0]*t[0],e.endPoint[1]*t[1]];return{startPoint:n,endPoint:o,landmarks:e.landmarks,confidence:e.confidence}},p5=(e,t,n)=>{let o=t.shape[1],r=t.shape[2],s=[e.startPoint[1]/o,e.startPoint[0]/r,e.endPoint[1]/o,e.endPoint[0]/r],A=Te.image.cropAndResize(t,[s],[0],n),a=Te.div(A,C.tf255);return Te.dispose(A),a},lt=(e,t)=>{let n=At(e),o=d2(e),r=[t*o[0]/2,t*o[1]/2];return{startPoint:[n[0]-r[0],n[1]-r[1]],endPoint:[n[0]+r[0],n[1]+r[1]],landmarks:e.landmarks,confidence:e.confidence}},ct=e=>{let t=At(e),n=d2(e),o=Math.max(...n)/2;return{startPoint:[Math.round(t[0]-o),Math.round(t[1]-o)],endPoint:[Math.round(t[0]+o),Math.round(t[1]+o)],landmarks:e.landmarks,confidence:e.confidence}},c3=e=>{let t=e.map(o=>o[0]),n=e.map(o=>o[1]);return{startPoint:[Math.min(...t),Math.min(...n)],endPoint:[Math.max(...t),Math.max(...n)],landmarks:e}},u5=[[1,0,0],[0,1,0],[0,0,1]],_s=e=>e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI)),$s=(e,t)=>_s(Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]));var a3=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]],t2=(e,t)=>{let n=0;for(let o=0;o{let n=[];for(let o=0;o{let n=[],o=e.length;for(let r=0;r{let n=Math.cos(e),o=Math.sin(e),r=[[n,-o,0],[o,n,0],[0,0,1]],s=a3(t[0],t[1]),A=i3(s,r),a=a3(-t[0],-t[1]);return i3(A,a)},tA=e=>{let t=[[e[0][0],e[1][0]],[e[0][1],e[1][1]]],n=[e[0][2],e[1][2]],o=[-t2(t[0],n),-t2(t[1],n)];return[t[0].concat(o[0]),t[1].concat(o[1]),[0,0,1]]},nA=(e,t)=>[t2(e,t[0]),t2(e,t[1])];function d3(e){let t=e===192?{strides:[4],anchors:[1]}:{strides:[e/16,e/8],anchors:[2,6]},n=[];for(let o=0;o[s[0]/r*(x[0]-r/2),s[1]/r*(x[1]-r/2),x[2]||0]),a=n&&n!==0&&Math.abs(n)>.2,l=a?x3(n,[0,0]):u5,c=a?A.map(x=>[...nA(x,l),x[2]]):A,d=a?tA(o):u5,i=At(t),y=[t2(i,d[0]),t2(i,d[1])];return c.map(x=>[Math.trunc(x[0]+y[0]),Math.trunc(x[1]+y[1]),Math.trunc(x[2]||0)])}function f3(e,t,n,o){let r=t.landmarks.length>=$t.count?$t.symmetryLine:Ke.symmetryLine,s=0,A=u5,a;if(e&&v.kernels.includes("rotatewithoffset"))if(s=$s(t.landmarks[r[0]],t.landmarks[r[1]]),s&&s!==0&&Math.abs(s)>.2){let c=At(t),d=[c[0]/n.shape[2],c[1]/n.shape[1]],i=Te.image.rotateWithOffset(n,s,0,[d[0],d[1]]);A=x3(-s,c),a=p5(t,i,[o,o]),Te.dispose(i)}else a=p5(t,n,[o,o]);else a=p5(t,n,[o,o]);return[s,A,a]}var oA=e=>{let t=e.map(o=>o[0]),n=e.map(o=>o[1]);return[Math.min(...t)+(Math.max(...t)-Math.min(...t))/2,Math.min(...n)+(Math.max(...n)-Math.min(...n))/2]},m3=(e,t)=>{let n=oA(e),o=d2(t);return{startPoint:[n[0]-o[0]/2,n[1]-o[1]/2],endPoint:[n[0]+o[0]/2,n[1]+o[1]/2]}};var p3=6,rA=1.4,ae,b5=null,Ie=0,y2=null,f2=()=>Ie;async function u3(e){var t;return v.initial&&(ae=null),ae?e.debug&&u("cached model:",ae.modelUrl):ae=await O((t=e.face.detector)==null?void 0:t.modelPath),Ie=ae.executor&&ae.inputs[0].shape?ae.inputs[0].shape[2]:256,y2=L.scalar(Ie,"int32"),b5=L.tensor2d(d3(Ie)),ae}function sA(e){if(!b5||!y2)return L.zeros([0,0]);let t={};t.boxStarts=L.slice(e,[0,1],[-1,2]),t.centers=L.add(t.boxStarts,b5),t.boxSizes=L.slice(e,[0,3],[-1,2]),t.boxSizesNormalized=L.div(t.boxSizes,y2),t.centersNormalized=L.div(t.centers,y2),t.halfBoxSize=L.div(t.boxSizesNormalized,C.tf2),t.starts=L.sub(t.centersNormalized,t.halfBoxSize),t.ends=L.add(t.centersNormalized,t.halfBoxSize),t.startNormalized=L.mul(t.starts,y2),t.endNormalized=L.mul(t.ends,y2);let n=L.concat2d([t.startNormalized,t.endNormalized],1);return Object.keys(t).forEach(o=>L.dispose(t[o])),n}async function h3(e,t){var a,l,c,d;if(!e||e.isDisposedInternal||e.shape.length!==4||e.shape[1]<1||e.shape[2]<1)return[];let n={};n.resized=L.image.resizeBilinear(e,[Ie,Ie]),n.div=L.div(n.resized,C.tf127),n.normalized=L.sub(n.div,C.tf05);let o=ae==null?void 0:ae.execute(n.normalized);if(Array.isArray(o)&&o.length>2){let i=o.sort((y,x)=>y.size-x.size);n.concat384=L.concat([i[0],i[2]],2),n.concat512=L.concat([i[1],i[3]],2),n.concat=L.concat([n.concat512,n.concat384],1),n.batch=L.squeeze(n.concat,[0])}else Array.isArray(o)?n.batch=L.squeeze(o[0]):n.batch=L.squeeze(o);L.dispose(o),n.boxes=sA(n.batch),n.logits=L.slice(n.batch,[0,0],[-1,1]),n.sigmoid=L.sigmoid(n.logits),n.scores=L.squeeze(n.sigmoid),n.nms=await L.image.nonMaxSuppressionAsync(n.boxes,n.scores,((a=t.face.detector)==null?void 0:a.maxDetected)||0,((l=t.face.detector)==null?void 0:l.iouThreshold)||0,((c=t.face.detector)==null?void 0:c.minConfidence)||0);let r=await n.nms.array(),s=[],A=await n.scores.data();for(let i=0;i(((d=t.face.detector)==null?void 0:d.minConfidence)||0)){let x={};x.bbox=L.slice(n.boxes,[r[i],0],[1,-1]),x.slice=L.slice(n.batch,[r[i],p3-1],[1,-1]),x.squeeze=L.squeeze(x.slice),x.landmarks=L.reshape(x.squeeze,[p3,-1]);let p=await x.bbox.data(),f={startPoint:[p[0],p[1]],endPoint:[p[2],p[3]],landmarks:await x.landmarks.array(),confidence:y},b=l3(f,[(e.shape[2]||0)/Ie,(e.shape[1]||0)/Ie]),M=lt(b,t.face.scale||rA),T=ct(M);s.push(T),Object.keys(x).forEach(m=>L.dispose(x[m]))}}return Object.keys(n).forEach(i=>L.dispose(n[i])),s}var ie=V(H());var G0,Oe=0,AA=2.3,g5=ne.leftEyeLower0,T5=ne.rightEyeLower0,m2={leftBounds:[g5[0],g5[g5.length-1]],rightBounds:[T5[0],T5[T5.length-1]]},p2={upperCenter:3,lowerCenter:4,index:71,numCoordinates:76};async function R3(e){var t,n;return v.initial&&(G0=null),G0?e.debug&&u("cached model:",G0.modelUrl):G0=await O((t=e.face.iris)==null?void 0:t.modelPath),Oe=(G0==null?void 0:G0.executor)&&((n=G0.inputs)==null?void 0:n[0].shape)?G0.inputs[0].shape[2]:0,Oe===-1&&(Oe=64),G0}function xt(e,t,n,o){for(let r=0;r{let t=e[m2.leftBounds[0]][2],n=e[m2.rightBounds[0]][2];return t-n},g3=(e,t,n,o,r,s=!1)=>{let A=ct(lt(c3([e[n],e[o]]),AA)),a=d2(A),l=ie.image.cropAndResize(t,[[A.startPoint[1]/r,A.startPoint[0]/r,A.endPoint[1]/r,A.endPoint[0]/r]],[0],[Oe,Oe]);if(s&&v.kernels.includes("flipleftright")){let c=ie.image.flipLeftRight(l);ie.dispose(l),l=c}return{box:A,boxSize:a,crop:l}},T3=(e,t,n,o=!1)=>{let r=[];for(let s=0;s{let o=e[ne[`${n}EyeUpper0`][p2.upperCenter]][2],r=e[ne[`${n}EyeLower0`][p2.lowerCenter]][2],s=(o+r)/2;return t.map((A,a)=>{let l=s;return a===2?l=o:a===4&&(l=r),[A[0],A[1],l]})};async function M3(e,t,n){if(!(G0!=null&&G0.executor))return e;let{box:o,boxSize:r,crop:s}=g3(e,t,m2.leftBounds[0],m2.leftBounds[1],n,!0),{box:A,boxSize:a,crop:l}=g3(e,t,m2.rightBounds[0],m2.rightBounds[1],n,!0),c=ie.concat([s,l]);ie.dispose(s),ie.dispose(l);let d=G0.execute(c);ie.dispose(c);let i=await d.data();ie.dispose(d);let y=i.slice(0,p2.numCoordinates*3),{rawCoords:x,iris:p}=T3(y,o,r,!0),f=i.slice(p2.numCoordinates*3),{rawCoords:b,iris:M}=T3(f,A,a,!1),T=aA(e);Math.abs(T)<30?(xt(e,x,"left",null),xt(e,b,"right",null)):T<1?xt(e,x,"left",["EyeUpper0","EyeLower0"]):xt(e,b,"right",["EyeUpper0","EyeLower0"]);let m=v3(e,p,"left"),h=v3(e,M,"right");return e.concat(m).concat(h)}async function k3(e,t){var s,A,a,l,c,d,i,y,x,p;let n={lips:await((A=(s=t.filter(f=>f.size===160))==null?void 0:s[0])==null?void 0:A.data()),irisL:await((l=(a=t.filter(f=>f.size===10))==null?void 0:a[0])==null?void 0:l.data()),eyeL:await((d=(c=t.filter(f=>f.size===142))==null?void 0:c[0])==null?void 0:d.data()),irisR:await((y=(i=t.filter(f=>f.size===10))==null?void 0:i[1])==null?void 0:y.data()),eyeR:await((p=(x=t.filter(f=>f.size===142))==null?void 0:x[1])==null?void 0:p.data())};for(let f of Object.values(n))if(!f)return e;let o=Qe.reduce((f,b)=>f+=e[b][2],0)/Qe.length;for(let f=0;ff+=e[b][2],0)/_e.length;for(let f=0;fg()-pe.timestamp,o=pe.skipped<(((c=t.face.detector)==null?void 0:c.skipFrames)||0);!t.skipAllowed||!n||!o||pe.boxes.length===0?(pe.boxes=await h3(e,t),pe.timestamp=g(),pe.skipped=0):pe.skipped++;let r=[],s=[],A=0,a=I2;for(let T=0;TG.shape[G.shape.length-1]===1).data();if(P.faceScore=Math.round(100*t0[0])/100,P.faceScore<(((p=t.face.detector)==null?void 0:p.minConfidence)||1)){if(m.confidence=P.faceScore,t.face.mesh.keepInvalid){P.box=at(m,e),P.boxRaw=it(m,e),P.score=P.boxScore,P.mesh=m.landmarks.map(G=>[(m.startPoint[0]+m.endPoint[0])/2+(m.endPoint[0]+m.startPoint[0])*G[0]/f2(),(m.startPoint[1]+m.endPoint[1])/2+(m.endPoint[1]+m.startPoint[1])*G[1]/f2()]),P.meshRaw=P.mesh.map(G=>[G[0]/(e.shape[2]||1),G[1]/(e.shape[1]||1),(G[2]||0)/a]);for(let G of Object.keys(Ke))P.annotations[G]=[P.mesh[Ke[G]]]}}else{let G=I.find(Z=>Z.shape[Z.shape.length-1]===1404),$=Le.reshape(G,[-1,3]),s0=await $.array();Le.dispose($),(f=t.face.attention)!=null&&f.enabled?s0=await k3(s0,I):(b=t.face.iris)!=null&&b.enabled&&(s0=await M3(s0,P.tensor,I2)),P.mesh=y3(s0,m,h,S,I2),P.meshRaw=P.mesh.map(Z=>[Z[0]/(e.shape[2]||0),Z[1]/(e.shape[1]||0),(Z[2]||0)/a]);for(let Z of Object.keys(ne))P.annotations[Z]=ne[Z].map(b0=>P.mesh[b0]);P.score=P.faceScore;let R={...m3(P.mesh,m),confidence:m.confidence,landmarks:m.landmarks};P.box=at(R,e),P.boxRaw=it(R,e),s.push(R)}Le.dispose(I)}else{P.box=at(m,e),P.boxRaw=it(m,e),P.score=P.boxScore,P.mesh=m.landmarks.map(I=>[(m.startPoint[0]+m.endPoint[0])/2+(m.endPoint[0]+m.startPoint[0])*I[0]/f2(),(m.startPoint[1]+m.endPoint[1])/2+(m.endPoint[1]+m.startPoint[1])*I[1]/f2()]),P.meshRaw=P.mesh.map(I=>[I[0]/(e.shape[2]||0),I[1]/(e.shape[1]||0),(I[2]||0)/a]);for(let I of Object.keys(Ke))P.annotations[I]=[P.mesh[Ke[I]]]}P.score>(((M=t.face.detector)==null?void 0:M.minConfidence)||1)?r.push(P):Le.dispose(P.tensor)}return pe.boxes=s,r}async function E3(e){var t,n,o,r,s,A;return v.initial&&(o0=null),((t=e.face.attention)==null?void 0:t.enabled)&&(o0==null?void 0:o0.signature)&&Object.keys(((n=o0==null?void 0:o0.signature)==null?void 0:n.outputs)||{}).length<6&&(o0=null),o0?e.debug&&u("cached model:",o0.modelUrl):(o=e.face.attention)!=null&&o.enabled?o0=await O(e.face.attention.modelPath):o0=await O((r=e.face.mesh)==null?void 0:r.modelPath),I2=o0.executor&&((s=o0==null?void 0:o0.inputs)==null?void 0:s[0].shape)?(A=o0==null?void 0:o0.inputs)==null?void 0:A[0].shape[2]:256,o0}var z3=Je,S3=j2;var le=V(H());var lA=["angry","disgust","fear","happy","sad","surprise","neutral"],_0,dt=[],j3=0,N3=0,R5=Number.MAX_SAFE_INTEGER;async function I3(e){var t;return v.initial&&(_0=null),_0?e.debug&&u("cached model:",_0.modelUrl):_0=await O((t=e.face.emotion)==null?void 0:t.modelPath),_0}async function M5(e,t,n,o){var A,a;if(!_0)return[];let r=R5<(((A=t.face.emotion)==null?void 0:A.skipFrames)||0),s=(((a=t.face.emotion)==null?void 0:a.skipTime)||0)>g()-N3;return t.skipAllowed&&s&&r&&j3===o&&dt[n]&&dt[n].length>0?(R5++,dt[n]):(R5=0,new Promise(async l=>{var d;let c=[];if((d=t.face.emotion)!=null&&d.enabled){let i={},y=_0!=null&&_0.inputs[0].shape?_0.inputs[0].shape[2]:0;i.resize=le.image.resizeBilinear(e,[y,y],!1),i.channels=le.mul(i.resize,C.rgb),i.grayscale=le.sum(i.channels,3,!0),i.grayscaleSub=le.sub(i.grayscale,C.tf05),i.grayscaleMul=le.mul(i.grayscaleSub,C.tf2),i.emotion=_0==null?void 0:_0.execute(i.grayscaleMul),N3=g();let x=await i.emotion.data();for(let p=0;p(t.face.emotion.minConfidence||0)&&c.push({score:Math.min(.99,Math.trunc(100*x[p])/100),emotion:lA[p]});c.sort((p,f)=>f.score-p.score),Object.keys(i).forEach(p=>le.dispose(i[p]))}dt[n]=c,j3=o,l(c)}))}var ce=V(H());var z0,Ce=[],L3=0,C3=0,P5=Number.MAX_SAFE_INTEGER;async function W3(e){var t;return v.initial&&(z0=null),z0?e.debug&&u("cached model:",z0.modelUrl):z0=await O((t=e.face.description)==null?void 0:t.modelPath),z0}function cA(e){let t=e.image||e.tensor||e;if(!(z0!=null&&z0.inputs[0].shape))return t;let n=ce.image.resizeBilinear(t,[z0.inputs[0].shape[2],z0.inputs[0].shape[1]],!1),o=ce.mul(n,C.tf255);return ce.dispose(n),o}async function k5(e,t,n,o){var a,l,c,d;let r={age:0,gender:"unknown",genderScore:0,descriptor:[]};if(!(z0!=null&&z0.executor))return r;let s=P5<(((a=t.face.description)==null?void 0:a.skipFrames)||0),A=(((l=t.face.description)==null?void 0:l.skipTime)||0)>g()-L3;return t.skipAllowed&&s&&A&&C3===o&&((c=Ce==null?void 0:Ce[n])==null?void 0:c.age)>0&&((d=Ce==null?void 0:Ce[n])==null?void 0:d.genderScore)>0?(P5++,Ce[n]):(P5=0,new Promise(async i=>{var y;if((y=t.face.description)!=null&&y.enabled){let x=cA(e),p=z0==null?void 0:z0.execute(x);L3=g(),ce.dispose(x);let b=await p.find(q=>q.shape[1]===1).data(),M=Math.trunc(200*Math.abs(b[0]-.5))/100;M>(t.face.description.minConfidence||0)&&(r.gender=b[0]<=.5?"female":"male",r.genderScore=Math.min(.99,M));let T=ce.argMax(p.find(q=>q.shape[1]===100),1),m=(await T.data())[0];ce.dispose(T);let S=await p.find(q=>q.shape[1]===100).data();r.age=Math.round(S[m-1]>S[m+1]?10*m-100*S[m-1]:10*m+100*S[m+1])/10,(Number.isNaN(b[0])||Number.isNaN(S[0]))&&u("faceres error:",{model:z0,result:p});let P=p.find(q=>q.shape[1]===1024),I=P?await P.data():[];r.descriptor=Array.from(I),p.forEach(q=>ce.dispose(q))}Ce[n]=r,C3=o,i(r)}))}var u2=.1,w5=.5;function xA(e,t,n){let o=!1,r=n.length-1;for(let s=0;st!=n[r].y>t&&e<(n[r].x-n[s].x)*(t-n[s].y)/(n[r].y-n[s].y)+n[s].x&&(o=!o);return o}async function F3(e){if(!e.tensor||!e.mesh||e.mesh.length<100)return e.tensor;let t=e.tensor.shape[2]||0,n=e.tensor.shape[1]||0,o=await e.tensor.buffer(),r=[];for(let A of ne.silhouette)r.push({x:(e.mesh[A][0]-e.box[0])/e.box[2],y:(e.mesh[A][1]-e.box[1])/e.box[3]});u2&&u2>0&&(r=r.map(A=>({x:A.x>.5?A.x+u2:A.x-u2,y:A.y>.5?A.y+u2:A.y-u2})));for(let A=0;Ag()-H3,s=E5<(((a=t.face.antispoof)==null?void 0:a.skipFrames)||0);return t.skipAllowed&&r&&s&&B3===o&&yt[n]?(E5++,yt[n]):(E5=0,new Promise(async l=>{let c=ft.image.resizeBilinear(e,[M0!=null&&M0.inputs[0].shape?M0.inputs[0].shape[2]:0,M0!=null&&M0.inputs[0].shape?M0.inputs[0].shape[1]:0],!1),d=M0==null?void 0:M0.execute(c),i=(await d.data())[0];yt[n]=Math.round(100*i)/100,B3=o,H3=g(),ft.dispose([c,d]),l(yt[n])}))}var pt=V(H());var P0,mt=[],S5=Number.MAX_SAFE_INTEGER,Z3=0,X3=0;async function q3(e){var t;return v.initial&&(P0=null),P0?e.debug&&u("cached model:",P0.modelUrl):P0=await O((t=e.face.liveness)==null?void 0:t.modelPath),P0}async function j5(e,t,n,o){var A,a;if(!(P0!=null&&P0.executor))return 0;let r=(((A=t.face.liveness)==null?void 0:A.skipTime)||0)>g()-X3,s=S5<(((a=t.face.liveness)==null?void 0:a.skipFrames)||0);return t.skipAllowed&&r&&s&&Z3===o&&mt[n]?(S5++,mt[n]):(S5=0,new Promise(async l=>{let c=pt.image.resizeBilinear(e,[P0!=null&&P0.inputs[0].shape?P0.inputs[0].shape[2]:0,P0!=null&&P0.inputs[0].shape?P0.inputs[0].shape[1]:0],!1),d=P0==null?void 0:P0.execute(c),i=(await d.data())[0];mt[n]=Math.round(100*i)/100,Z3=o,X3=g(),pt.dispose([c,d]),l(mt[n])}))}var ut=V(H());var oe,N5=[],yA=["white","black","asian","indian","other"],fA=[15,23,28,35.5,45.5,55.5,65],Y3=0,K3=0,I5=Number.MAX_SAFE_INTEGER;async function J3(e){var t;return v.initial&&(oe=null),oe?e.debug&&u("cached model:",oe.modelUrl):oe=await O((t=e.face.gear)==null?void 0:t.modelPath),oe}async function O5(e,t,n,o){var A,a;if(!oe)return{age:0,gender:"unknown",genderScore:0,race:[]};let r=I5<(((A=t.face.gear)==null?void 0:A.skipFrames)||0),s=(((a=t.face.gear)==null?void 0:a.skipTime)||0)>g()-K3;return t.skipAllowed&&s&&r&&Y3===o&&N5[n]?(I5++,N5[n]):(I5=0,new Promise(async l=>{var M,T;if(!(oe!=null&&oe.inputs[0].shape))return;let c={},d=[[0,.1,.9,.9]];c.resize=ut.image.cropAndResize(e,d,[0],[oe.inputs[0].shape[2],oe.inputs[0].shape[1]]);let i={age:0,gender:"unknown",genderScore:0,race:[]};(M=t.face.gear)!=null&&M.enabled&&([c.age,c.gender,c.race]=oe.execute(c.resize,["age_output","gender_output","race_output"]));let y=await c.gender.data();i.gender=y[0]>y[1]?"male":"female",i.genderScore=Math.round(100*(y[0]>y[1]?y[0]:y[1]))/100;let x=await c.race.data();for(let m=0;m(((T=t.face.gear)==null?void 0:T.minConfidence)||.2)&&i.race.push({score:Math.round(100*x[m])/100,race:yA[m]});i.race.sort((m,h)=>h.score-m.score);let f=Array.from(await c.age.data()).map((m,h)=>[fA[h],m]).sort((m,h)=>h[1]-m[1]),b=f[0][0];for(let m=1;mut.dispose(c[m])),N5[n]=i,Y3=o,K3=g(),l(i)}))}var h2=V(H());var V0,ht=[],_3=0,$3=0,L5=Number.MAX_SAFE_INTEGER;async function en(e){return v.initial&&(V0=null),V0?e.debug&&u("cached model:",V0.modelUrl):V0=await O(e.face.ssrnet.modelPathAge),V0}async function C5(e,t,n,o){var A,a,l,c;if(!V0)return{age:0};let r=L5<(((A=t.face.ssrnet)==null?void 0:A.skipFrames)||0),s=(((a=t.face.ssrnet)==null?void 0:a.skipTime)||0)>g()-$3;return t.skipAllowed&&r&&s&&_3===o&&((l=ht[n])==null?void 0:l.age)&&((c=ht[n])==null?void 0:c.age)>0?(L5++,ht[n]):(L5=0,new Promise(async d=>{var x;if(!(V0!=null&&V0.inputs)||!V0.inputs[0]||!V0.inputs[0].shape)return;let i={};i.resize=h2.image.resizeBilinear(e,[V0.inputs[0].shape[2],V0.inputs[0].shape[1]],!1),i.enhance=h2.mul(i.resize,C.tf255);let y={age:0};if((x=t.face.ssrnet)!=null&&x.enabled&&(i.age=V0.execute(i.enhance)),i.age){let p=await i.age.data();y.age=Math.trunc(10*p[0])/10}Object.keys(i).forEach(p=>h2.dispose(i[p])),ht[n]=y,_3=o,$3=g(),d(y)}))}var S0=V(H());var re,bt=[],nn=0,on=0,W5=Number.MAX_SAFE_INTEGER,D5=[.2989,.587,.114];async function rn(e){var t;return v.initial&&(re=null),re?e.debug&&u("cached model:",re.modelUrl):re=await O((t=e.face.ssrnet)==null?void 0:t.modelPathGender),re}async function F5(e,t,n,o){var A,a,l,c;if(!re)return{gender:"unknown",genderScore:0};let r=W5<(((A=t.face.ssrnet)==null?void 0:A.skipFrames)||0),s=(((a=t.face.ssrnet)==null?void 0:a.skipTime)||0)>g()-on;return t.skipAllowed&&r&&s&&nn===o&&((l=bt[n])==null?void 0:l.gender)&&((c=bt[n])==null?void 0:c.genderScore)>0?(W5++,bt[n]):(W5=0,new Promise(async d=>{var p;if(!(re!=null&&re.inputs[0].shape))return;let i={};i.resize=S0.image.resizeBilinear(e,[re.inputs[0].shape[2],re.inputs[0].shape[1]],!1),i.enhance=S0.tidy(()=>{let[f,b,M]=S0.split(i.resize,3,3),T=S0.mul(f,D5[0]),m=S0.mul(b,D5[1]),h=S0.mul(M,D5[2]),S=S0.addN([T,m,h]);return S0.mul(S0.sub(S,C.tf05),2)});let y={gender:"unknown",genderScore:0};(p=t.face.ssrnet)!=null&&p.enabled&&(i.gender=re.execute(i.enhance));let x=await i.gender.data();y.gender=x[0]>x[1]?"female":"male",y.genderScore=x[0]>x[1]?Math.trunc(100*x[0])/100:Math.trunc(100*x[1])/100,Object.keys(i).forEach(f=>S0.dispose(i[f])),bt[n]=y,nn=o,on=g(),d(y)}))}var gt=V(H());var Z0,B5=[],An=0,an=0,ln=Number.MAX_SAFE_INTEGER;async function cn(e){var t;return v.initial&&(Z0=null),Z0?e.debug&&u("cached model:",Z0.modelUrl):Z0=await O((t=e.face.mobilefacenet)==null?void 0:t.modelPath),Z0}async function H5(e,t,n,o){var A,a;if(!(Z0!=null&&Z0.executor))return[];let r=ln<(((A=t.face.mobilefacenet)==null?void 0:A.skipFrames)||0),s=(((a=t.face.mobilefacenet)==null?void 0:a.skipTime)||0)>g()-an;return t.skipAllowed&&s&&r&&An===o&&B5[n]?(ln++,B5[n]):new Promise(async l=>{var d;let c=[];if(((d=t.face.mobilefacenet)==null?void 0:d.enabled)&&(Z0==null?void 0:Z0.inputs[0].shape)){let i={};i.crop=gt.image.resizeBilinear(e,[Z0.inputs[0].shape[2],Z0.inputs[0].shape[1]],!1),i.data=Z0.execute(i.crop);let y=await i.data.data();c=Array.from(y),Object.keys(i).forEach(x=>gt.dispose(i[x]))}B5[n]=c,An=o,an=g(),l(c)})}var Tt=V(H());var X0,G5=[],dn=0,yn=0,fn=Number.MAX_SAFE_INTEGER;async function mn(e){return v.initial&&(X0=null),X0?e.debug&&u("cached model:",X0.modelUrl):X0=await O(e.face.insightface.modelPath),X0}async function V5(e,t,n,o){var A,a;if(!(X0!=null&&X0.executor))return[];let r=fn<(((A=t.face.insightface)==null?void 0:A.skipFrames)||0),s=(((a=t.face.insightface)==null?void 0:a.skipTime)||0)>g()-yn;return t.skipAllowed&&s&&r&&dn===o&&G5[n]?(fn++,G5[n]):new Promise(async l=>{var d;let c=[];if(((d=t.face.insightface)==null?void 0:d.enabled)&&(X0==null?void 0:X0.inputs[0].shape)){let i={};i.crop=Tt.image.resizeBilinear(e,[X0.inputs[0].shape[2],X0.inputs[0].shape[1]],!1),i.data=X0.execute(i.crop);let y=await i.data.data();c=Array.from(y),Object.keys(i).forEach(x=>Tt.dispose(i[x]))}G5[n]=c,dn=o,yn=g(),l(c)})}var mA=e=>{let t=(i,y)=>Math.atan2(i[1]-y[1],i[0]-y[0]);if(!e.annotations.rightEyeIris||!e.annotations.leftEyeIris)return{bearing:0,strength:0};let n=[0,-.1],o=1,r=(e.mesh[33][2]||0)>(e.mesh[263][2]||0),s=r?e.mesh[473]:e.mesh[468],A=r?[(e.mesh[133][0]+e.mesh[33][0])/2,(e.mesh[133][1]+e.mesh[33][1])/2]:[(e.mesh[263][0]+e.mesh[362][0])/2,(e.mesh[263][1]+e.mesh[362][1])/2],a=r?[e.mesh[133][0]-e.mesh[33][0],e.mesh[23][1]-e.mesh[27][1]]:[e.mesh[263][0]-e.mesh[362][0],e.mesh[253][1]-e.mesh[257][1]],l=[(A[0]-s[0])/a[0]-n[0],o*(s[1]-A[1])/a[1]-n[1]],c=Math.sqrt(l[0]*l[0]+l[1]*l[1]);return c=Math.min(c,e.boxRaw[2]/2,e.boxRaw[3]/2),{bearing:(t([0,0],l)+Math.PI/2)%Math.PI,strength:c}},un=(e,t)=>{let n=f=>{let b=Math.sqrt(f[0]*f[0]+f[1]*f[1]+f[2]*f[2]);return f[0]/=b,f[1]/=b,f[2]/=b,f},o=(f,b)=>{let M=f[0]-b[0],T=f[1]-b[1],m=f[2]-b[2];return[M,T,m]},r=(f,b)=>{let M=f[1]*b[2]-f[2]*b[1],T=f[2]*b[0]-f[0]*b[2],m=f[0]*b[1]-f[1]*b[0];return[M,T,m]},s=f=>{let[b,M,T,m,h,S,P,I,q]=f,t0,G,$;return m<1?m>-1?($=Math.asin(m),G=Math.atan2(-P,b),t0=Math.atan2(-S,h)):($=-Math.PI/2,G=-Math.atan2(I,q),t0=0):($=Math.PI/2,G=Math.atan2(I,q),t0=0),Number.isNaN(t0)&&(t0=0),Number.isNaN(G)&&(G=0),Number.isNaN($)&&($=0),{pitch:2*-t0,yaw:2*-G,roll:2*-$}},A=e.meshRaw;if(!A||A.length<300)return{angle:{pitch:0,yaw:0,roll:0},matrix:[1,0,0,0,1,0,0,0,1],gaze:{bearing:0,strength:0}};let a=Math.max(e.boxRaw[2]*t[0],e.boxRaw[3]*t[1])/1.5,l=[A[10],A[152],A[234],A[454]].map(f=>[f[0]*t[0]/a,f[1]*t[1]/a,f[2]]),c=n(o(l[1],l[0])),d=n(o(l[3],l[2])),i=n(r(d,c));d=r(c,i);let y=[d[0],d[1],d[2],c[0],c[1],c[2],i[0],i[1],i[2]],x=s(y),p=A.length===478?mA(e):{bearing:0,strength:0};return{angle:x,matrix:y,gaze:p}};function hn(e,t){let n=e==null?void 0:e.annotations;if(!n)return 0;let o=Math.max(Math.abs(n.leftEyeIris[3][0]-n.leftEyeIris[1][0]),Math.abs(n.rightEyeIris[3][0]-n.rightEyeIris[1][0]))/t;return Math.round(1.17/o)/100}var Z5=async(e,t)=>{var p,f,b,M,T,m,h,S,P,I,q,t0,G,$,s0,R,Z,b0,U,g0,f0,B,X;let n=g(),o,r,s,A,a,l,c,d,i,y=[];e.state="run:face";let x=await w3(t,e.config);if(e.performance.face=v.perfadd?(e.performance.face||0)+Math.trunc(g()-n):Math.trunc(g()-n),!t.shape||t.shape.length!==4)return[];if(!x)return[];for(let z=0;z200?un(x[z],[t.shape[2],t.shape[1]]):null;e.analyze("Start Emotion:"),e.config.async?A=(f=e.config.face.emotion)!=null&&f.enabled?M5(x[z].tensor||i0.tensor([]),e.config,z,x.length):[]:(e.state="run:emotion",n=g(),A=(b=e.config.face.emotion)!=null&&b.enabled?await M5(x[z].tensor||i0.tensor([]),e.config,z,x.length):[],e.performance.emotion=v.perfadd?(e.performance.emotion||0)+Math.trunc(g()-n):Math.trunc(g()-n)),e.analyze("End Emotion:"),e.analyze("Start AntiSpoof:"),e.config.async?c=(M=e.config.face.antispoof)!=null&&M.enabled?z5(x[z].tensor||i0.tensor([]),e.config,z,x.length):0:(e.state="run:antispoof",n=g(),c=(T=e.config.face.antispoof)!=null&&T.enabled?await z5(x[z].tensor||i0.tensor([]),e.config,z,x.length):0,e.performance.antispoof=v.perfadd?(e.performance.antispoof||0)+Math.trunc(g()-n):Math.trunc(g()-n)),e.analyze("End AntiSpoof:"),e.analyze("Start Liveness:"),e.config.async?d=(m=e.config.face.liveness)!=null&&m.enabled?j5(x[z].tensor||i0.tensor([]),e.config,z,x.length):0:(e.state="run:liveness",n=g(),d=(h=e.config.face.liveness)!=null&&h.enabled?await j5(x[z].tensor||i0.tensor([]),e.config,z,x.length):0,e.performance.liveness=v.perfadd?(e.performance.antispoof||0)+Math.trunc(g()-n):Math.trunc(g()-n)),e.analyze("End Liveness:"),e.analyze("Start GEAR:"),e.config.async?r=(S=e.config.face.gear)!=null&&S.enabled?O5(x[z].tensor||i0.tensor([]),e.config,z,x.length):null:(e.state="run:gear",n=g(),r=(P=e.config.face.gear)!=null&&P.enabled?await O5(x[z].tensor||i0.tensor([]),e.config,z,x.length):null,e.performance.gear=Math.trunc(g()-n)),e.analyze("End GEAR:"),e.analyze("Start SSRNet:"),e.config.async?(o=(I=e.config.face.ssrnet)!=null&&I.enabled?C5(x[z].tensor||i0.tensor([]),e.config,z,x.length):null,s=(q=e.config.face.ssrnet)!=null&&q.enabled?F5(x[z].tensor||i0.tensor([]),e.config,z,x.length):null):(e.state="run:ssrnet",n=g(),o=(t0=e.config.face.ssrnet)!=null&&t0.enabled?await C5(x[z].tensor||i0.tensor([]),e.config,z,x.length):null,s=(G=e.config.face.ssrnet)!=null&&G.enabled?await F5(x[z].tensor||i0.tensor([]),e.config,z,x.length):null,e.performance.ssrnet=Math.trunc(g()-n)),e.analyze("End SSRNet:"),e.analyze("Start MobileFaceNet:"),e.config.async?a=($=e.config.face.mobilefacenet)!=null&&$.enabled?H5(x[z].tensor||i0.tensor([]),e.config,z,x.length):null:(e.state="run:mobilefacenet",n=g(),a=(s0=e.config.face.mobilefacenet)!=null&&s0.enabled?await H5(x[z].tensor||i0.tensor([]),e.config,z,x.length):null,e.performance.mobilefacenet=Math.trunc(g()-n)),e.analyze("End MobileFaceNet:"),e.analyze("Start InsightFace:"),e.config.async?l=(R=e.config.face.insightface)!=null&&R.enabled?V5(x[z].tensor||i0.tensor([]),e.config,z,x.length):null:(e.state="run:mobilefacenet",n=g(),l=(Z=e.config.face.insightface)!=null&&Z.enabled?await V5(x[z].tensor||i0.tensor([]),e.config,z,x.length):null,e.performance.mobilefacenet=Math.trunc(g()-n)),e.analyze("End InsightFace:"),e.analyze("Start Description:"),e.config.async?i=k5(x[z].tensor||i0.tensor([]),e.config,z,x.length):(e.state="run:description",n=g(),i=await k5(x[z].tensor||i0.tensor([]),e.config,z,x.length),e.performance.description=v.perfadd?(e.performance.description||0)+Math.trunc(g()-n):Math.trunc(g()-n)),e.analyze("End Description:"),e.config.async&&([o,s,A,a,l,i,r,c,d]=await Promise.all([o,s,A,a,l,i,r,c,d])),e.analyze("Finish Face:"),((b0=e.config.face.ssrnet)==null?void 0:b0.enabled)&&o&&s&&(i={...i,age:o.age,gender:s.gender,genderScore:s.genderScore}),((U=e.config.face.gear)==null?void 0:U.enabled)&&r&&(i={...i,age:r.age,gender:r.gender,genderScore:r.genderScore,race:r.race}),((g0=e.config.face.mobilefacenet)==null?void 0:g0.enabled)&&a&&(i.descriptor=a),((f0=e.config.face.insightface)==null?void 0:f0.enabled)&&l&&(i.descriptor=l);let Pe=(B=e.config.face.iris)!=null&&B.enabled?hn(x[z],t.shape[2]):0,ke=(X=e.config.face.detector)!=null&&X.return?i0.squeeze(x[z].tensor):null;i0.dispose(x[z].tensor),x[z].tensor&&delete x[z].tensor;let T0={...x[z],id:z};i.age&&(T0.age=i.age),i.gender&&(T0.gender=i.gender),i.genderScore&&(T0.genderScore=i.genderScore),i.descriptor&&(T0.embedding=i.descriptor),i.race&&(T0.race=i.race),A&&(T0.emotion=A),c&&(T0.real=c),d&&(T0.live=d),Pe>0&&(T0.distance=Pe),$0&&(T0.rotation=$0),ke&&(T0.tensor=ke),y.push(T0),e.analyze("End Face")}return e.analyze("End FaceMesh:"),e.config.async&&(e.performance.face&&delete e.performance.face,e.performance.age&&delete e.performance.age,e.performance.gender&&delete e.performance.gender,e.performance.emotion&&delete e.performance.emotion),y};var W0={thumb:0,index:1,middle:2,ring:3,pinky:4,all:[0,1,2,3,4],nameMapping:{0:"thumb",1:"index",2:"middle",3:"ring",4:"pinky"},pointsMapping:{0:[[0,1],[1,2],[2,3],[3,4]],1:[[0,5],[5,6],[6,7],[7,8]],2:[[0,9],[9,10],[10,11],[11,12]],3:[[0,13],[13,14],[14,15],[15,16]],4:[[0,17],[17,18],[18,19],[19,20]]},getName:e=>W0.nameMapping[e],getPoints:e=>W0.pointsMapping[e]},De={none:0,half:1,full:2,nameMapping:{0:"none",1:"half",2:"full"},getName:e=>De.nameMapping[e]},l0={verticalUp:0,verticalDown:1,horizontalLeft:2,horizontalRight:3,diagonalUpRight:4,diagonalUpLeft:5,diagonalDownRight:6,diagonalDownLeft:7,nameMapping:{0:"verticalUp",1:"verticalDown",2:"horizontalLeft",3:"horizontalRight",4:"diagonalUpRight",5:"diagonalUpLeft",6:"diagonalDownRight",7:"diagonalDownLeft"},getName:e=>l0.nameMapping[e]},We=class{constructor(t){k(this,"name");k(this,"curls");k(this,"directions");k(this,"weights");k(this,"weightsRelative");this.name=t,this.curls={},this.directions={},this.weights=[1,1,1,1,1],this.weightsRelative=[1,1,1,1,1]}curl(t,n,o){typeof this.curls[t]=="undefined"&&(this.curls[t]=[]),this.curls[t].push([n,o])}direction(t,n,o){this.directions[t]||(this.directions[t]=[]),this.directions[t].push([n,o])}weight(t,n){this.weights[t]=n;let o=this.weights.reduce((r,s)=>r+s,0);this.weightsRelative=this.weights.map(r=>r*5/o)}matchAgainst(t,n){let o=0;for(let r in t){let s=t[r],A=this.curls[r];if(typeof A=="undefined"){o+=this.weightsRelative[r];continue}for(let[a,l]of A)if(s===a){o+=l*this.weightsRelative[r];break}}for(let r in n){let s=n[r],A=this.directions[r];if(typeof A=="undefined"){o+=this.weightsRelative[r];continue}for(let[a,l]of A)if(s===a){o+=l*this.weightsRelative[r];break}}return o/10}};var{thumb:xe,index:ve,middle:Re,ring:n2,pinky:o2}=W0,{none:de,half:uA,full:ye}=De,{verticalUp:b2,verticalDown:G7,horizontalLeft:X5,horizontalRight:hA,diagonalUpRight:bA,diagonalUpLeft:g2,diagonalDownRight:V7,diagonalDownLeft:Z7}=l0,Fe=new We("thumbs up");Fe.curl(xe,de,1);Fe.direction(xe,b2,1);Fe.direction(xe,g2,.25);Fe.direction(xe,bA,.25);for(let e of[W0.index,W0.middle,W0.ring,W0.pinky])Fe.curl(e,ye,1),Fe.direction(e,X5,1),Fe.direction(e,hA,1);var p0=new We("victory");p0.curl(xe,uA,.5);p0.curl(xe,de,.5);p0.direction(xe,b2,1);p0.direction(xe,g2,1);p0.curl(ve,de,1);p0.direction(ve,b2,.75);p0.direction(ve,g2,1);p0.curl(Re,de,1);p0.direction(Re,b2,1);p0.direction(Re,g2,.75);p0.curl(n2,ye,1);p0.direction(n2,b2,.2);p0.direction(n2,g2,1);p0.direction(n2,X5,.2);p0.curl(o2,ye,1);p0.direction(o2,b2,.2);p0.direction(o2,g2,1);p0.direction(o2,X5,.2);p0.weight(ve,2);p0.weight(Re,2);var Be=new We("point");Be.curl(xe,ye,1);Be.curl(ve,de,.5);Be.curl(Re,ye,.5);Be.curl(n2,ye,.5);Be.curl(o2,ye,.5);Be.weight(ve,2);Be.weight(Re,2);var He=new We("middle finger");He.curl(xe,de,1);He.curl(ve,ye,.5);He.curl(Re,ye,.5);He.curl(n2,ye,.5);He.curl(o2,ye,.5);He.weight(ve,2);He.weight(Re,2);var T2=new We("open palm");T2.curl(xe,de,.75);T2.curl(ve,de,.75);T2.curl(Re,de,.75);T2.curl(n2,de,.75);T2.curl(o2,de,.75);var bn=[Fe,p0,Be,He,T2];var gA=.7,r2={HALF_CURL_START_LIMIT:60,NO_CURL_START_LIMIT:130,DISTANCE_VOTE_POWER:1.1,SINGLE_ANGLE_VOTE_POWER:.9,TOTAL_ANGLE_VOTE_POWER:1.6};function gn(e,t,n,o){let r=(t-o)/(e-n),s=Math.atan(r)*180/Math.PI;return s<=0?s=-s:s>0&&(s=180-s),s}function vn(e,t){if(!e||!t)return[0,0];let n=gn(e[0],e[1],t[0],t[1]);if(e.length===2)return n;let o=gn(e[1],e[2],t[1],t[2]);return[n,o]}function Tn(e,t=1){let n=0,o=0,r=0;return e>=75&&e<=105?n=1*t:e>=25&&e<=155?o=1*t:r=1*t,[n,o,r]}function TA(e,t,n){let o=e[0]-t[0],r=e[0]-n[0],s=t[0]-n[0],A=e[1]-t[1],a=e[1]-n[1],l=t[1]-n[1],c=e[2]-t[2],d=e[2]-n[2],i=t[2]-n[2],y=Math.sqrt(o*o+A*A+c*c),x=Math.sqrt(r*r+a*a+d*d),p=Math.sqrt(s*s+l*l+i*i),f=(p*p+y*y-x*x)/(2*p*y);f>1?f=1:f<-1&&(f=-1);let b=Math.acos(f);b=57.2958*b%180;let M;return b>r2.NO_CURL_START_LIMIT?M=De.none:b>r2.HALF_CURL_START_LIMIT?M=De.half:M=De.full,M}function Rn(e,t,n,o){let r;return o===Math.abs(e)?e>0?r=l0.horizontalLeft:r=l0.horizontalRight:o===Math.abs(t)?t>0?r=l0.horizontalLeft:r=l0.horizontalRight:n>0?r=l0.horizontalLeft:r=l0.horizontalRight,r}function Mn(e,t,n,o){let r;return o===Math.abs(e)?e<0?r=l0.verticalDown:r=l0.verticalUp:o===Math.abs(t)?t<0?r=l0.verticalDown:r=l0.verticalUp:n<0?r=l0.verticalDown:r=l0.verticalUp,r}function vA(e,t,n,o,r,s,A,a){let l,c=Mn(e,t,n,o),d=Rn(r,s,A,a);return c===l0.verticalUp?d===l0.horizontalLeft?l=l0.diagonalUpLeft:l=l0.diagonalUpRight:d===l0.horizontalLeft?l=l0.diagonalDownLeft:l=l0.diagonalDownRight,l}function RA(e,t,n,o){let r=e[0]-t[0],s=e[0]-n[0],A=t[0]-n[0],a=e[1]-t[1],l=e[1]-n[1],c=t[1]-n[1],d=Math.max(Math.abs(r),Math.abs(s),Math.abs(A)),i=Math.max(Math.abs(a),Math.abs(l),Math.abs(c)),y=0,x=0,p=0,f=i/(d+1e-5);f>1.5?y+=r2.DISTANCE_VOTE_POWER:f>.66?x+=r2.DISTANCE_VOTE_POWER:p+=r2.DISTANCE_VOTE_POWER;let b=Math.sqrt(r*r+a*a),M=Math.sqrt(s*s+l*l),T=Math.sqrt(A*A+c*c),m=Math.max(b,M,T),h=e[0],S=e[1],P=n[0],I=n[1];m===b?(P=n[0],I=n[1]):m===T&&(h=t[0],S=t[1]);let G=vn([h,S],[P,I]),$=Tn(G,r2.TOTAL_ANGLE_VOTE_POWER);y+=$[0],x+=$[1],p+=$[2];for(let R of o){let Z=Tn(R,r2.SINGLE_ANGLE_VOTE_POWER);y+=Z[0],x+=Z[1],p+=Z[2]}let s0;return y===Math.max(y,x,p)?s0=Mn(l,a,c,i):p===Math.max(x,p)?s0=Rn(s,r,A,d):s0=vA(l,a,c,i,s,r,A,d),s0}function Pn(e){let t=[],n=[],o=[],r=[];if(!e)return{curls:o,directions:r};for(let s of W0.all){let A=W0.getPoints(s),a=[],l=[];for(let c of A){let d=e[c[0]],i=e[c[1]],y=vn(d,i),x=y[0],p=y[1];a.push(x),l.push(p)}t.push(a),n.push(l)}for(let s of W0.all){let A=s===W0.thumb?1:0,a=W0.getPoints(s),l=e[a[A][0]],c=e[a[A+1][1]],d=e[a[3][1]],i=TA(l,c,d),y=RA(l,c,d,t[s].slice(A));o[s]=i,r[s]=y}return{curls:o,directions:r}}function vt(e){if(!e||e.length===0)return null;let t=Pn(e),n={};for(let o of W0.all)n[W0.getName(o)]={curl:De.getName(t.curls[o]),direction:l0.getName(t.directions[o])};return n}function kn(e){let t=[];if(!e||e.length===0)return t;let n=Pn(e);for(let o of bn){let r=o.matchAgainst(n.curls,n.directions);r>=gA&&t.push({name:o.name,confidence:r})}return t}var wn=e=>{if(!e)return[];let t=[];for(let n=0;nl.part==="leftWrist"),r=e[n].keypoints.find(l=>l.part==="rightWrist"),s=e[n].keypoints.find(l=>l.part==="nose");s&&o&&r&&o.position[1]l.part==="leftShoulder"),a=e[n].keypoints.find(l=>l.part==="rightShoulder");A&&a&&Math.abs(A.positionRaw[1]-a.positionRaw[1])>.1&&t.push({body:n,gesture:`leaning ${A.position[1]>a.position[1]?"left":"right"}`})}return t},En=e=>{if(!e)return[];let t=[];for(let n=0;n450){let o=(e[n].mesh[33][2]||0)-(e[n].mesh[263][2]||0),r=e[n].mesh[33][0]-e[n].mesh[263][0];Math.abs(o/r)<=.15?t.push({face:n,gesture:"facing center"}):t.push({face:n,gesture:`facing ${o<0?"left":"right"}`}),Math.abs(e[n].mesh[374][1]-e[n].mesh[386][1])/Math.abs(e[n].mesh[443][1]-e[n].mesh[450][1])<.2&&t.push({face:n,gesture:"blink left eye"}),Math.abs(e[n].mesh[145][1]-e[n].mesh[159][1])/Math.abs(e[n].mesh[223][1]-e[n].mesh[230][1])<.2&&t.push({face:n,gesture:"blink right eye"});let a=Math.min(100,500*Math.abs(e[n].mesh[13][1]-e[n].mesh[14][1])/Math.abs(e[n].mesh[10][1]-e[n].mesh[152][1]));a>10&&t.push({face:n,gesture:`mouth ${Math.trunc(a)}% open`});let l=e[n].mesh[152][2]||0;Math.abs(l)>10&&t.push({face:n,gesture:`head ${l<0?"up":"down"}`})}return t},zn=e=>{var n,o,r,s;if(!e)return[];let t=[];for(let A=0;A.06||b>.06)&&(x=!1),f>b?f>.05&&t.push({iris:A,gesture:"looking right"}):b>.05&&t.push({iris:A,gesture:"looking left"});let M=Math.abs(e[A].mesh[145][1]-e[A].annotations.rightEyeIris[0][1])/e[A].box[3],T=Math.abs(e[A].mesh[374][1]-e[A].annotations.leftEyeIris[0][1])/e[A].box[3];(T<.01||M<.01||T>.022||M>.022)&&(x=!1),(T<.01||M<.01)&&t.push({iris:A,gesture:"looking down"}),(T>.022||M>.022)&&t.push({iris:A,gesture:"looking up"}),x&&t.push({iris:A,gesture:"looking center"})}return t},Sn=e=>{if(!e)return[];let t=[];for(let n=0;n0){let r=o.reduce((A,a)=>(A.position[2]||0)<(a.position[2]||0)?A:a);t.push({hand:n,gesture:`${r.name} forward`});let s=o.reduce((A,a)=>A.position[1][s[0]*t[0],s[1]*t[1]]);return{startPoint:n,endPoint:o,palmLandmarks:r,confidence:e.confidence}}function Mt(e,t=1.5){let n=O2(e),o=Rt(e),r=[t*o[0]/2,t*o[1]/2],s=[n[0]-r[0],n[1]-r[1]],A=[n[0]+r[0],n[1]+r[1]];return{startPoint:s,endPoint:A,palmLandmarks:e.palmLandmarks}}function Pt(e){let t=O2(e),n=Rt(e),r=Math.max(...n)/2,s=[t[0]-r,t[1]-r],A=[t[0]+r,t[1]+r];return{startPoint:s,endPoint:A,palmLandmarks:e.palmLandmarks}}function PA(e){return e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI))}function Cn(e,t){let n=Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]);return PA(n)}var jn=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]];function Ge(e,t){let n=0;for(let o=0;o[A.x,A.y]),this.anchorsTensor=W.tensor2d(this.anchors),this.inputSize=((s=(r=(o=(n=this==null?void 0:this.model)==null?void 0:n.inputs)==null?void 0:o[0])==null?void 0:r.shape)==null?void 0:s[2])||0,this.inputSizeTensor=W.tensor1d([this.inputSize,this.inputSize]),this.doubleInputSizeTensor=W.tensor1d([this.inputSize*2,this.inputSize*2])}normalizeBoxes(t){let n={};n.boxOffsets=W.slice(t,[0,0],[-1,2]),n.boxSizes=W.slice(t,[0,2],[-1,2]),n.div=W.div(n.boxOffsets,this.inputSizeTensor),n.boxCenterPoints=W.add(n.div,this.anchorsTensor),n.halfBoxSizes=W.div(n.boxSizes,this.doubleInputSizeTensor),n.sub=W.sub(n.boxCenterPoints,n.halfBoxSizes),n.startPoints=W.mul(n.sub,this.inputSizeTensor),n.add=W.add(n.boxCenterPoints,n.halfBoxSizes),n.endPoints=W.mul(n.add,this.inputSizeTensor);let o=W.concat2d([n.startPoints,n.endPoints],1);return Object.keys(n).forEach(r=>W.dispose(n[r])),o}normalizeLandmarks(t,n){let o={};o.reshape=W.reshape(t,[-1,7,2]),o.div=W.div(o.reshape,this.inputSizeTensor),o.landmarks=W.add(o.div,this.anchors[n]?this.anchors[n]:0);let r=W.mul(o.landmarks,this.inputSizeTensor);return Object.keys(o).forEach(s=>W.dispose(o[s])),r}async predict(t,n){var a;let o={};o.resize=W.image.resizeBilinear(t,[this.inputSize,this.inputSize]),o.div=W.div(o.resize,C.tf127),o.image=W.sub(o.div,C.tf1),o.batched=this.model.execute(o.image),o.predictions=W.squeeze(o.batched),o.slice=W.slice(o.predictions,[0,0],[-1,1]),o.sigmoid=W.sigmoid(o.slice),o.scores=W.squeeze(o.sigmoid);let r=await o.scores.data();o.boxes=W.slice(o.predictions,[0,1],[-1,4]),o.norm=this.normalizeBoxes(o.boxes),o.nms=await W.image.nonMaxSuppressionAsync(o.norm,o.scores,3*(((a=n.hand)==null?void 0:a.maxDetected)||1),n.hand.iouThreshold,n.hand.minConfidence);let s=await o.nms.array(),A=[];for(let l of s){let c={};c.box=W.slice(o.norm,[l,0],[1,-1]),c.slice=W.slice(o.predictions,[l,5],[1,14]),c.norm=this.normalizeLandmarks(c.slice,l),c.palmLandmarks=W.reshape(c.norm,[-1,2]);let d=await c.box.data(),i=d.slice(0,2),y=d.slice(2,4),x=await c.palmLandmarks.array(),p={startPoint:i,endPoint:y,palmLandmarks:x,confidence:r[l]},f=Ln(p,[(t.shape[2]||1)/this.inputSize,(t.shape[1]||0)/this.inputSize]);A.push(f),Object.keys(c).forEach(b=>W.dispose(c[b]))}return Object.keys(o).forEach(l=>W.dispose(o[l])),A}};var q0=V(H());var zA=5,Bn=1.65,Hn=[0,5,9,13,17,1,2],SA=0,jA=2,Gn=0,wt=class{constructor(t,n){k(this,"handDetector");k(this,"handPoseModel");k(this,"inputSize");k(this,"storedBoxes");k(this,"skipped");k(this,"detectedHands");var o,r,s;this.handDetector=t,this.handPoseModel=n,this.inputSize=((s=(r=(o=this.handPoseModel)==null?void 0:o.inputs)==null?void 0:r[0].shape)==null?void 0:s[2])||0,this.storedBoxes=[],this.skipped=Number.MAX_SAFE_INTEGER,this.detectedHands=0}calculateLandmarksBoundingBox(t){let n=t.map(A=>A[0]),o=t.map(A=>A[1]),r=[Math.min(...n),Math.min(...o)],s=[Math.max(...n),Math.max(...o)];return{startPoint:r,endPoint:s}}getBoxForPalmLandmarks(t,n){let o=t.map(s=>Y5([...s,1],n)),r=this.calculateLandmarksBoundingBox(o);return Mt(Pt(r),zA)}getBoxForHandLandmarks(t){let n=this.calculateLandmarksBoundingBox(t),o=Mt(Pt(n),Bn);o.palmLandmarks=[];for(let r=0;r[A[0]*(x[0]-this.inputSize/2),A[1]*(x[1]-this.inputSize/2),A[2]*x[2]]),l=U5(o,[0,0]),c=a.map(x=>[...Y5(x,l),x[2]]),d=Wn(r),i=[...O2(n),1],y=[Ge(i,d[0]),Ge(i,d[1])];return c.map(x=>[Math.trunc(x[0]+y[0]),Math.trunc(x[1]+y[1]),Math.trunc(x[2])])}async estimateHands(t,n){let o=!1,r,s=(n.hand.skipTime||0)>g()-Gn,A=this.skipped<(n.hand.skipFrames||0);n.skipAllowed&&s&&A&&(r=await this.handDetector.predict(t,n),this.skipped=0),n.skipAllowed&&this.skipped++,r&&r.length>0&&(r.length!==this.detectedHands&&this.detectedHands!==n.hand.maxDetected||!n.hand.landmarks)&&(this.detectedHands=0,this.storedBoxes=[...r],this.storedBoxes.length>0&&(o=!0));let a=[];for(let l=0;l=n.hand.minConfidence/4){let S=q0.reshape(m,[-1,3]),P=await S.array();q0.dispose(m),q0.dispose(S);let I=this.transformRawCoords(P,f,d,p),q=this.getBoxForHandLandmarks(I);this.storedBoxes[l]={...q,confidence:h};let t0={landmarks:I,confidence:h,boxConfidence:c.confidence,fingerConfidence:h,box:{topLeft:q.startPoint,bottomRight:q.endPoint}};a.push(t0)}else this.storedBoxes[l]=null;q0.dispose(m)}else{let d=Mt(Pt(c),Bn),i={confidence:c.confidence,boxConfidence:c.confidence,fingerConfidence:0,box:{topLeft:d.startPoint,bottomRight:d.endPoint},landmarks:[]};a.push(i)}}return this.storedBoxes=this.storedBoxes.filter(l=>l!==null),this.detectedHands=a.length,a.length>n.hand.maxDetected&&(a.length=n.hand.maxDetected),a}};var Vn={thumb:[1,2,3,4],index:[5,6,7,8],middle:[9,10,11,12],ring:[13,14,15,16],pinky:[17,18,19,20],palm:[0]},s2,A2,Zn;async function K5(e,t){let n=await Zn.estimateHands(e,t);if(!n)return[];let o=[];for(let r=0;rn[r].landmarks[i]);let A=n[r].landmarks,a=[Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER,0,0],l=[0,0,0,0];if(A&&A.length>0){for(let d of A)d[0]a[2]&&(a[2]=d[0]),d[1]>a[3]&&(a[3]=d[1]);a[2]-=a[0],a[3]-=a[1],l=[a[0]/(e.shape[2]||0),a[1]/(e.shape[1]||0),a[2]/(e.shape[2]||0),a[3]/(e.shape[1]||0)]}else a=n[r].box?[Math.trunc(Math.max(0,n[r].box.topLeft[0])),Math.trunc(Math.max(0,n[r].box.topLeft[1])),Math.trunc(Math.min(e.shape[2]||0,n[r].box.bottomRight[0])-Math.max(0,n[r].box.topLeft[0])),Math.trunc(Math.min(e.shape[1]||0,n[r].box.bottomRight[1])-Math.max(0,n[r].box.topLeft[1]))]:[0,0,0,0],l=[n[r].box.topLeft[0]/(e.shape[2]||0),n[r].box.topLeft[1]/(e.shape[1]||0),(n[r].box.bottomRight[0]-n[r].box.topLeft[0])/(e.shape[2]||0),(n[r].box.bottomRight[1]-n[r].box.topLeft[1])/(e.shape[1]||0)];let c=vt(A);o.push({id:r,score:Math.round(100*n[r].confidence)/100,boxScore:Math.round(100*n[r].boxConfidence)/100,fingerScore:Math.round(100*n[r].fingerConfidence)/100,label:"hand",box:a,boxRaw:l,keypoints:A,annotations:s,landmarks:c})}return o}async function Xn(e){var n,o;v.initial&&(s2=null,A2=null),!s2||!A2?[s2,A2]=await Promise.all([e.hand.enabled?O((n=e.hand.detector)==null?void 0:n.modelPath):null,e.hand.landmarks?O((o=e.hand.skeleton)==null?void 0:o.modelPath):null]):(e.debug&&u("cached model:",s2.modelUrl),e.debug&&u("cached model:",A2.modelUrl));let t=s2?new kt(s2):void 0;return t&&A2&&(Zn=new wt(t,A2)),[s2,A2]}var Q=V(H());var y0=[null,null],IA=["StatefulPartitionedCall/Postprocessor/Slice","StatefulPartitionedCall/Postprocessor/ExpandDims_1"],Ve=[[0,0],[0,0]],OA=["hand","fist","pinch","point","face","tip","pinchtip"],Un=4,Yn=1.6,LA=512,CA=1.4,Et=Number.MAX_SAFE_INTEGER,J5=0,Me=[0,0],d0={boxes:[],hands:[]},Kn={thumb:[1,2,3,4],index:[5,6,7,8],middle:[9,10,11,12],ring:[13,14,15,16],pinky:[17,18,19,20],base:[0],palm:[0,17,13,9,5,1,0]};async function Jn(e){var t;if(v.initial&&(y0[0]=null),y0[0])e.debug&&u("cached model:",y0[0].modelUrl);else{U2(["tensorlistreserve","enter","tensorlistfromtensor","merge","loopcond","switch","exit","tensorliststack","nextiteration","tensorlistsetitem","tensorlistgetitem","reciprocal","shape","split","where"],e),y0[0]=await O((t=e.hand.detector)==null?void 0:t.modelPath);let n=y0[0].executor?Object.values(y0[0].modelSignature.inputs):void 0;Ve[0][0]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[1].size):0,Ve[0][1]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[2].size):0}return y0[0]}async function Qn(e){var t;if(v.initial&&(y0[1]=null),y0[1])e.debug&&u("cached model:",y0[1].modelUrl);else{y0[1]=await O((t=e.hand.skeleton)==null?void 0:t.modelPath);let n=y0[1].executor?Object.values(y0[1].modelSignature.inputs):void 0;Ve[1][0]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[1].size):0,Ve[1][1]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[2].size):0}return y0[1]}async function WA(e,t){let n=[];if(!e||!y0[0])return n;let o={},r=(e.shape[2]||1)/(e.shape[1]||1),s=Math.min(Math.round((e.shape[1]||0)/8)*8,LA),A=Math.round(s*r/8)*8;o.resize=Q.image.resizeBilinear(e,[s,A]),o.cast=Q.cast(o.resize,"int32"),[o.rawScores,o.rawBoxes]=await y0[0].executeAsync(o.cast,IA),o.boxes=Q.squeeze(o.rawBoxes,[0,2]),o.scores=Q.squeeze(o.rawScores,[0]);let a=Q.unstack(o.scores,1);Q.dispose(a[Un]),a.splice(Un,1),o.filtered=Q.stack(a,1),Q.dispose(a),o.max=Q.max(o.filtered,1),o.argmax=Q.argMax(o.filtered,1);let l=0;o.nms=await Q.image.nonMaxSuppressionAsync(o.boxes,o.max,(t.hand.maxDetected||0)+1,t.hand.iouThreshold||0,t.hand.minConfidence||1);let c=await o.nms.data(),d=await o.max.data(),i=await o.argmax.data();for(let y of Array.from(c)){let x=Q.slice(o.boxes,y,1),p=await x.data();Q.dispose(x);let f=[p[1],p[0],p[3]-p[1],p[2]-p[0]],b=nt(f,CA),M=[Math.trunc(f[0]*Me[0]),Math.trunc(f[1]*Me[1]),Math.trunc(f[2]*Me[0]),Math.trunc(f[3]*Me[1])],T=d[y],m=OA[i[y]],h={id:l++,score:T,box:M,boxRaw:b,label:m};n.push(h)}return Object.keys(o).forEach(y=>Q.dispose(o[y])),n.sort((y,x)=>x.score-y.score),n.length>(t.hand.maxDetected||1)&&(n.length=t.hand.maxDetected||1),n}async function Q5(e,t,n){let o={id:t.id,score:Math.round(100*t.score)/100,boxScore:Math.round(100*t.score)/100,fingerScore:0,box:t.box,boxRaw:t.boxRaw,label:t.label,keypoints:[],landmarks:{},annotations:{}};if(e&&y0[1]&&n.hand.landmarks&&t.score>(n.hand.minConfidence||0)){let r={},s=[t.boxRaw[1],t.boxRaw[0],t.boxRaw[3]+t.boxRaw[1],t.boxRaw[2]+t.boxRaw[0]];r.crop=Q.image.cropAndResize(e,[s],[0],[Ve[1][0],Ve[1][1]],"bilinear"),r.div=Q.div(r.crop,C.tf255),[r.score,r.keypoints]=y0[1].execute(r.div,["Identity_1","Identity"]);let A=(await r.score.data())[0],a=(100-Math.trunc(100/(1+Math.exp(A))))/100;if(a>=(n.hand.minConfidence||0)){o.fingerScore=a,r.reshaped=Q.reshape(r.keypoints,[-1,3]);let d=(await r.reshaped.array()).map(i=>[i[0]/Ve[1][1],i[1]/Ve[1][0],i[2]||0]).map(i=>[i[0]*t.boxRaw[2],i[1]*t.boxRaw[3],i[2]||0]);o.keypoints=d.map(i=>[Me[0]*(i[0]+t.boxRaw[0]),Me[1]*(i[1]+t.boxRaw[1]),i[2]||0]),o.landmarks=vt(o.keypoints);for(let i of Object.keys(Kn))o.annotations[i]=Kn[i].map(y=>o.landmarks&&o.keypoints[y]?o.keypoints[y]:null)}Object.keys(r).forEach(l=>Q.dispose(r[l]))}return o}async function _5(e,t){var r,s;if(!((r=y0[0])!=null&&r.executor)||!((s=y0[1])!=null&&s.executor)||!y0[0].inputs[0].shape||!y0[1].inputs[0].shape)return[];Me=[e.shape[2]||0,e.shape[1]||0],Et++;let n=(t.hand.skipTime||0)>g()-J5,o=Et<(t.hand.skipFrames||0);return t.skipAllowed&&n&&o?d0.hands:new Promise(async A=>{let a=3*(t.hand.skipTime||0)>g()-J5,l=Et<3*(t.hand.skipFrames||0);t.skipAllowed&&d0.hands.length===t.hand.maxDetected?d0.hands=await Promise.all(d0.boxes.map(d=>Q5(e,d,t))):t.skipAllowed&&a&&l&&d0.hands.length>0?d0.hands=await Promise.all(d0.boxes.map(d=>Q5(e,d,t))):(d0.boxes=await WA(e,t),J5=g(),d0.hands=await Promise.all(d0.boxes.map(d=>Q5(e,d,t))),Et=0);let c=[...d0.boxes];if(d0.boxes.length=0,t.cacheSensitivity>0)for(let d=0;d.05&&i.box[3]/(e.shape[1]||1)>.05&&d0.hands[d].fingerScore&&d0.hands[d].fingerScore>(t.hand.minConfidence||0)){let y=nt(i.box,Yn),x=nt(i.boxRaw,Yn);d0.boxes.push({...c[d],box:y,boxRaw:x})}}for(let d=0;d({face:[],body:[],hand:[],gesture:[],object:[],persons:[],performance:{},timestamp:0,width:0,height:0,error:e});var L2={};we(L2,{connected:()=>St,horizontal:()=>$5,kpt:()=>zt,relative:()=>t1,vertical:()=>e1});var zt=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],$5=[["leftEye","rightEye"],["leftEar","rightEar"],["leftShoulder","rightShoulder"],["leftElbow","rightElbow"],["leftWrist","rightWrist"],["leftHip","rightHip"],["leftKnee","rightKnee"],["leftAnkle","rightAnkle"]],e1=[["leftKnee","leftShoulder"],["rightKnee","rightShoulder"],["leftAnkle","leftKnee"],["rightAnkle","rightKnee"]],t1=[[["leftHip","rightHip"],["leftShoulder","rightShoulder"]],[["leftElbow","rightElbow"],["leftShoulder","rightShoulder"]]],St={leftLeg:["leftHip","leftKnee","leftAnkle"],rightLeg:["rightHip","rightKnee","rightAnkle"],torso:["leftShoulder","rightShoulder","rightHip","leftHip","leftShoulder"],leftArm:["leftShoulder","leftElbow","leftWrist"],rightArm:["rightShoulder","rightElbow","rightWrist"],head:[]};var w=ue(),n1=0;function $n(e,t){var A,a,l,c,d,i,y,x,p,f,b,M,T,m,h,S,P,I,q,t0,G,$,s0;let n=g();if(!e)return ue();let o=Date.now()-e.timestamp,r=o<1e3?8-Math.log(o+1):1;if(e.canvas&&(w.canvas=e.canvas),e.error&&(w.error=e.error),!w.body||e.body.length!==w.body.length)w.body=JSON.parse(JSON.stringify(e.body));else for(let R=0;R((r-1)*w.body[R].box[X]+B)/r),b0=e.body[R].boxRaw.map((B,X)=>((r-1)*w.body[R].boxRaw[X]+B)/r),U=e.body[R].keypoints.map((B,X)=>{var z,$0,Pe,ke,T0,M2,T1,v1,R1;return{score:B.score,part:B.part,position:[w.body[R].keypoints[X]?((r-1)*(w.body[R].keypoints[X].position[0]||0)+(B.position[0]||0))/r:B.position[0],w.body[R].keypoints[X]?((r-1)*(w.body[R].keypoints[X].position[1]||0)+(B.position[1]||0))/r:B.position[1],w.body[R].keypoints[X]?((r-1)*(w.body[R].keypoints[X].position[2]||0)+(B.position[2]||0))/r:B.position[2]],positionRaw:[w.body[R].keypoints[X]?((r-1)*(w.body[R].keypoints[X].positionRaw[0]||0)+(B.positionRaw[0]||0))/r:B.positionRaw[0],w.body[R].keypoints[X]?((r-1)*(w.body[R].keypoints[X].positionRaw[1]||0)+(B.positionRaw[1]||0))/r:B.positionRaw[1],w.body[R].keypoints[X]?((r-1)*(w.body[R].keypoints[X].positionRaw[2]||0)+(B.positionRaw[2]||0))/r:B.positionRaw[2]],distance:[w.body[R].keypoints[X]?((r-1)*(((z=w.body[R].keypoints[X].distance)==null?void 0:z[0])||0)+((($0=B.distance)==null?void 0:$0[0])||0))/r:(Pe=B.distance)==null?void 0:Pe[0],w.body[R].keypoints[X]?((r-1)*(((ke=w.body[R].keypoints[X].distance)==null?void 0:ke[1])||0)+(((T0=B.distance)==null?void 0:T0[1])||0))/r:(M2=B.distance)==null?void 0:M2[1],w.body[R].keypoints[X]?((r-1)*(((T1=w.body[R].keypoints[X].distance)==null?void 0:T1[2])||0)+(((v1=B.distance)==null?void 0:v1[2])||0))/r:(R1=B.distance)==null?void 0:R1[2]]}}),g0={},f0={connected:{}};(A=t.body.modelPath)!=null&&A.includes("efficientpose")?f0=st:(a=t.body.modelPath)!=null&&a.includes("blazepose")?f0=et:(l=t.body.modelPath)!=null&&l.includes("movenet")&&(f0=L2);for(let[B,X]of Object.entries(f0.connected)){let z=[];for(let $0=0;$0T0.part===X[$0]),ke=U.find(T0=>T0.part===X[$0+1]);Pe&&ke&&z.push([Pe.position,ke.position])}g0[B]=z}w.body[R]={...e.body[R],box:Z,boxRaw:b0,keypoints:U,annotations:g0}}if(!w.hand||e.hand.length!==w.hand.length)w.hand=JSON.parse(JSON.stringify(e.hand));else for(let R=0;R((r-1)*w.hand[R].box[B]+f0)/r),b0=e.hand[R].boxRaw.map((f0,B)=>((r-1)*w.hand[R].boxRaw[B]+f0)/r);w.hand[R].keypoints.length!==e.hand[R].keypoints.length&&(w.hand[R].keypoints=e.hand[R].keypoints);let U=e.hand[R].keypoints&&e.hand[R].keypoints.length>0?e.hand[R].keypoints.map((f0,B)=>f0.map((X,z)=>((r-1)*(w.hand[R].keypoints[B][z]||1)+(X||0))/r)):[],g0={};if(Object.keys(w.hand[R].annotations).length!==Object.keys(e.hand[R].annotations).length)w.hand[R].annotations=e.hand[R].annotations,g0=w.hand[R].annotations;else if(e.hand[R].annotations)for(let f0 of Object.keys(e.hand[R].annotations))g0[f0]=(i=(d=(c=e.hand[R])==null?void 0:c.annotations)==null?void 0:d[f0])!=null&&i[0]?e.hand[R].annotations[f0].map((B,X)=>B.map((z,$0)=>((r-1)*w.hand[R].annotations[f0][X][$0]+z)/r)):null;w.hand[R]={...e.hand[R],box:Z,boxRaw:b0,keypoints:U,annotations:g0}}if(!w.face||e.face.length!==w.face.length)w.face=JSON.parse(JSON.stringify(e.face));else for(let R=0;R((r-1)*w.face[R].box[g0]+U)/r),b0=e.face[R].boxRaw.map((U,g0)=>((r-1)*w.face[R].boxRaw[g0]+U)/r);if(e.face[R].rotation){let U={matrix:[0,0,0,0,0,0,0,0,0],angle:{roll:0,yaw:0,pitch:0},gaze:{bearing:0,strength:0}};U.matrix=(y=e.face[R].rotation)==null?void 0:y.matrix,U.angle={roll:((r-1)*(((p=(x=w.face[R].rotation)==null?void 0:x.angle)==null?void 0:p.roll)||0)+(((b=(f=e.face[R].rotation)==null?void 0:f.angle)==null?void 0:b.roll)||0))/r,yaw:((r-1)*(((T=(M=w.face[R].rotation)==null?void 0:M.angle)==null?void 0:T.yaw)||0)+(((h=(m=e.face[R].rotation)==null?void 0:m.angle)==null?void 0:h.yaw)||0))/r,pitch:((r-1)*(((P=(S=w.face[R].rotation)==null?void 0:S.angle)==null?void 0:P.pitch)||0)+(((q=(I=e.face[R].rotation)==null?void 0:I.angle)==null?void 0:q.pitch)||0))/r},U.gaze={bearing:((r-1)*(((t0=w.face[R].rotation)==null?void 0:t0.gaze.bearing)||0)+(((G=e.face[R].rotation)==null?void 0:G.gaze.bearing)||0))/r,strength:((r-1)*((($=w.face[R].rotation)==null?void 0:$.gaze.strength)||0)+(((s0=e.face[R].rotation)==null?void 0:s0.gaze.strength)||0))/r},w.face[R]={...e.face[R],rotation:U,box:Z,boxRaw:b0}}else w.face[R]={...e.face[R],box:Z,boxRaw:b0}}if(!w.object||e.object.length!==w.object.length)w.object=JSON.parse(JSON.stringify(e.object));else for(let R=0;R((r-1)*w.object[R].box[g0]+U)/r),b0=e.object[R].boxRaw.map((U,g0)=>((r-1)*w.object[R].boxRaw[g0]+U)/r);w.object[R]={...e.object[R],box:Z,boxRaw:b0}}if(e.persons){let R=e.persons;if(!w.persons||R.length!==w.persons.length)w.persons=JSON.parse(JSON.stringify(R));else for(let Z=0;Z((r-1)*w.persons[Z].box[U]+b0)/r)}e.gesture&&(w.gesture=e.gesture),w.width=e.width,w.height=e.height;let s=g();return n1=v.perfadd?n1+Math.round(s-n):Math.round(s-n),e.performance&&(w.performance={...e.performance,interpolate:n1}),w}var r0=V(H());var j0;async function o1(e){return!j0||v.initial?j0=await O(e.segmentation.modelPath):e.debug&&u("cached model:",j0.modelUrl),j0}async function eo(e,t){var r;if(j0||(j0=await o1(t)),!(j0!=null&&j0.executor)||!((r=j0==null?void 0:j0.inputs)!=null&&r[0].shape))return null;let n={};n.resize=r0.image.resizeBilinear(e,[j0.inputs[0].shape?j0.inputs[0].shape[1]:0,j0.inputs[0].shape?j0.inputs[0].shape[2]:0],!1),n.norm=r0.div(n.resize,C.tf255),n.res=j0.execute(n.norm),n.squeeze=r0.squeeze(n.res,[0]),[n.bgRaw,n.fgRaw]=r0.unstack(n.squeeze,2),n.fg=r0.softmax(n.fgRaw),n.mul=r0.mul(n.fg,C.tf255),n.expand=r0.expandDims(n.mul,2),n.output=r0.image.resizeBilinear(n.expand,[e.shape[1]||0,e.shape[2]||0]);let o;switch(t.segmentation.mode||"default"){case"default":n.input=r0.squeeze(e),n.concat=r0.concat([n.input,n.output],-1),o=r0.cast(n.concat,"int32");break;case"alpha":o=r0.cast(n.output,"int32");break;default:o=r0.tensor(0)}return Object.keys(n).forEach(s=>r0.dispose(n[s])),o}var jt={};we(jt,{distance:()=>r1,find:()=>BA,similarity:()=>FA});function r1(e,t,n={order:2,multiplier:25}){if(!e||!e)return Number.MAX_SAFE_INTEGER;let o=0;for(let r=0;r{if(e===0)return 1;let s=(1-(t===2?Math.sqrt(e):e**(1/t))/100-n)/(o-n);return Math.max(Math.min(s,1),0)};function FA(e,t,n={order:2,multiplier:25,min:.2,max:.8}){let o=r1(e,t,n);return no(o,n.order||2,n.min||0,n.max||1)}function BA(e,t,n={order:2,multiplier:25,threshold:0,min:.2,max:.8}){if(!Array.isArray(e)||!Array.isArray(t)||e.length<64||t.length===0)return{index:-1,distance:Number.POSITIVE_INFINITY,similarity:0};let o=Number.MAX_SAFE_INTEGER,r=-1;for(let A=0;AD2,validateModel:()=>Dt});var ao=V(H());var Ze=V(H());var oo=.005,U0={keypoints:[],padding:[[0,0],[0,0],[0,0],[0,0]]};function s1(e){for(let t of $5){let n=e.keypoints.findIndex(r=>r.part===t[0]),o=e.keypoints.findIndex(r=>r.part===t[1]);if(e.keypoints[n]&&e.keypoints[o]&&e.keypoints[n].position[0]r&&r.part===t[0]),o=e.keypoints.findIndex(r=>r&&r.part===t[1]);e.keypoints[n]&&e.keypoints[o]&&e.keypoints[n].position[1]c&&c.part===t[0]),r=e.keypoints.findIndex(c=>c&&c.part===t[1]),s=e.keypoints.findIndex(c=>c&&c.part===n[0]),A=e.keypoints.findIndex(c=>c&&c.part===n[1]);if(!e.keypoints[s]||!e.keypoints[A])continue;let a=e.keypoints[o]?[Math.abs(e.keypoints[s].position[0]-e.keypoints[o].position[0]),Math.abs(e.keypoints[A].position[0]-e.keypoints[o].position[0])]:[0,0],l=e.keypoints[r]?[Math.abs(e.keypoints[A].position[0]-e.keypoints[r].position[0]),Math.abs(e.keypoints[s].position[0]-e.keypoints[r].position[0])]:[0,0];if(a[0]>a[1]||l[0]>l[1]){let c=e.keypoints[o];e.keypoints[o]=e.keypoints[r],e.keypoints[r]=c}}}function ro(e){for(let t=0;te.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0,e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0],[e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0,e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0],[0,0]],n.pad=Ze.pad(e,U0.padding),n.resize=Ze.image.resizeBilinear(n.pad,[t,t]);let o=Ze.cast(n.resize,"int32");return Object.keys(n).forEach(A=>Ze.dispose(n[A])),o}function Ao(e,t){e.keypoints=e.keypoints.filter(o=>o==null?void 0:o.position);for(let o of e.keypoints)o.position=[o.position[0]*(t[0]+U0.padding[2][0]+U0.padding[2][1])/t[0]-U0.padding[2][0],o.position[1]*(t[1]+U0.padding[1][0]+U0.padding[1][1])/t[1]-U0.padding[1][0]],o.positionRaw=[o.position[0]/t[0],o.position[1]/t[1]];let n=ge(e.keypoints.map(o=>o.position),t);return e.box=n.box,e.boxRaw=n.boxRaw,e}var u0,Nt=0,A1=Number.MAX_SAFE_INTEGER,a2={boxes:[],bodies:[],last:0};async function io(e){var t;return v.initial&&(u0=null),u0?e.debug&&u("cached model:",u0.modelUrl):(U2(["size"],e),u0=await O(e.body.modelPath)),Nt=(u0==null?void 0:u0.executor)&&((t=u0==null?void 0:u0.inputs)==null?void 0:t[0].shape)?u0.inputs[0].shape[2]:0,Nt<64&&(Nt=256),u0}function GA(e,t,n){let o=e[0][0],r=[],s=0;for(let d=0;dt.body.minConfidence){let i=[o[d][1],o[d][0]];r.push({score:Math.round(100*s)/100,part:zt[d],positionRaw:i,position:[Math.round((n.shape[2]||0)*i[0]),Math.round((n.shape[1]||0)*i[1])]})}s=r.reduce((d,i)=>i.score>d?i.score:d,0);let A=[],a=ge(r.map(d=>d.position),[n.shape[2],n.shape[1]]),l={};for(let[d,i]of Object.entries(St)){let y=[];for(let x=0;xb.part===i[x]),f=r.find(b=>b.part===i[x+1]);p&&f&&p.score>(t.body.minConfidence||0)&&f.score>(t.body.minConfidence||0)&&y.push([p.position,f.position])}l[d]=y}let c={id:0,score:s,box:a.box,boxRaw:a.boxRaw,keypoints:r,annotations:l};return s1(c),A.push(c),A}function VA(e,t,n){let o=[];for(let r=0;rt.body.minConfidence){let a=[];for(let i=0;i<17;i++){let y=s[3*i+2];if(y>t.body.minConfidence){let x=[s[3*i+1],s[3*i+0]];a.push({part:zt[i],score:Math.round(100*y)/100,positionRaw:x,position:[Math.round((n.shape[2]||0)*x[0]),Math.round((n.shape[1]||0)*x[1])]})}}let l=ge(a.map(i=>i.position),[n.shape[2],n.shape[1]]),c={};for(let[i,y]of Object.entries(St)){let x=[];for(let p=0;pM.part===y[p]),b=a.find(M=>M.part===y[p+1]);f&&b&&f.score>(t.body.minConfidence||0)&&b.score>(t.body.minConfidence||0)&&x.push([f.position,b.position])}c[i]=x}let d={id:r,score:A,box:l.box,boxRaw:l.boxRaw,keypoints:[...a],annotations:c};s1(d),o.push(d)}}return o.sort((r,s)=>s.score-r.score),o.length>t.body.maxDetected&&(o.length=t.body.maxDetected),o}async function a1(e,t){var r;if(!(u0!=null&&u0.executor)||!((r=u0==null?void 0:u0.inputs)!=null&&r[0].shape))return[];t.skipAllowed||(a2.boxes.length=0),A1++;let n=(t.body.skipTime||0)>g()-a2.last,o=A1<(t.body.skipFrames||0);return t.skipAllowed&&n&&o?a2.bodies:new Promise(async s=>{let A={};A1=0,A.input=so(e,Nt),A.res=u0==null?void 0:u0.execute(A.input),a2.last=g();let a=await A.res.array();a2.bodies=A.res.shape[2]===17?GA(a,t,e):VA(a,t,e);for(let l of a2.bodies)Ao(l,[e.shape[2]||1,e.shape[1]||1]),ro(l.keypoints);Object.keys(A).forEach(l=>ao.dispose(A[l])),s(a2.bodies)})}var w0=V(H());var se,It=[],co=0,i1=Number.MAX_SAFE_INTEGER,Lt=0,Ot=2.5;async function xo(e){if(!se||v.initial){se=await O(e.object.modelPath);let t=se!=null&&se.executor?Object.values(se.modelSignature.inputs):void 0;Lt=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):416}else e.debug&&u("cached model:",se.modelUrl);return se}async function ZA(e,t,n){var c,d;let o=0,r=[],s=Lt;for(let i of[1,2,4]){let y=i*13,x=w0.squeeze(e.find(m=>m.shape[1]===y**2&&(m.shape[2]||0)===x2.length)),p=await x.array(),f=w0.squeeze(e.find(m=>m.shape[1]===y**2&&(m.shape[2]||0)(n.object.minConfidence||0)&&h!==61){let P=(.5+Math.trunc(m%y))/y,I=(.5+Math.trunc(m/y))/y,q=T[m].map(U=>U*(y/i/s)),[t0,G]=[P-Ot/i*q[0],I-Ot/i*q[1]],[$,s0]=[P+Ot/i*q[2]-t0,I+Ot/i*q[3]-G],R=[t0,G,$,s0];R=R.map(U=>Math.max(0,Math.min(U,1)));let Z=[R[0]*t[0],R[1]*t[1],R[2]*t[0],R[3]*t[1]],b0={id:o++,score:Math.round(100*S)/100,class:h+1,label:x2[h].label,box:Z.map(U=>Math.trunc(U)),boxRaw:R};r.push(b0)}}w0.dispose([x,f,b,M])}let A=r.map(i=>[i.boxRaw[1],i.boxRaw[0],i.boxRaw[3],i.boxRaw[2]]),a=r.map(i=>i.score),l=[];if(A&&A.length>0){let i=await w0.image.nonMaxSuppressionAsync(A,a,n.object.maxDetected||0,n.object.iouThreshold,n.object.minConfidence);l=Array.from(await i.data()),w0.dispose(i)}return r=r.filter((i,y)=>l.includes(y)).sort((i,y)=>y.score-i.score),r}async function l1(e,t){if(!(se!=null&&se.executor))return[];let n=(t.object.skipTime||0)>g()-co,o=i1<(t.object.skipFrames||0);return t.skipAllowed&&n&&o&&It.length>0?(i1++,It):(i1=0,!v.kernels.includes("mod")||!v.kernels.includes("sparsetodense")?It:new Promise(async r=>{let s=[e.shape[2]||0,e.shape[1]||0],A=w0.image.resizeBilinear(e,[Lt,Lt],!1),a=w0.div(A,C.tf255),l=w0.transpose(a,[0,3,1,2]),c;t.object.enabled&&(c=se.execute(l)),co=g();let d=await ZA(c,s,t);It=d,w0.dispose([A,a,l,...c]),r(d)}))}var D0=V(H());var W2=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],XA=W2.length,C2=W2.reduce((e,t,n)=>(e[t]=n,e),{}),qA=[["leftHip","leftShoulder"],["leftElbow","leftShoulder"],["leftElbow","leftWrist"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["rightHip","rightShoulder"],["rightElbow","rightShoulder"],["rightElbow","rightWrist"],["rightHip","rightKnee"],["rightKnee","rightAnkle"],["leftShoulder","rightShoulder"],["leftHip","rightHip"]],Li=qA.map(([e,t])=>[C2[e],C2[t]]),fo=[["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 mo(e){let t=e.reduce(({maxX:n,maxY:o,minX:r,minY:s},{position:{x:A,y:a}})=>({maxX:Math.max(n,A),maxY:Math.max(o,a),minX:Math.min(r,A),minY:Math.min(s,a)}),{maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY,minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY});return[t.minX,t.minY,t.maxX-t.minX,t.maxY-t.minY]}function po(e,[t,n],[o,r]){let s=t/o,A=n/r,a=(c,d)=>({id:d,score:c.score,boxRaw:[c.box[0]/r,c.box[1]/o,c.box[2]/r,c.box[3]/o],box:[Math.trunc(c.box[0]*A),Math.trunc(c.box[1]*s),Math.trunc(c.box[2]*A),Math.trunc(c.box[3]*s)],keypoints:c.keypoints.map(({score:i,part:y,position:x})=>({score:i,part:y,position:[Math.trunc(x.x*A),Math.trunc(x.y*s)],positionRaw:[x.x/o,x.y/o]})),annotations:{}});return e.map((c,d)=>a(c,d))}var Ct=class{constructor(t,n){k(this,"priorityQueue");k(this,"numberOfElements");k(this,"getElementValue");this.priorityQueue=new Array(t),this.numberOfElements=-1,this.getElementValue=n}enqueue(t){this.priorityQueue[++this.numberOfElements]=t,this.swim(this.numberOfElements)}dequeue(){let t=this.priorityQueue[0];return this.exchange(0,this.numberOfElements--),this.sink(0),this.priorityQueue[this.numberOfElements+1]=null,t}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(t){for(;t>0&&this.less(Math.floor(t/2),t);)this.exchange(t,Math.floor(t/2)),t=Math.floor(t/2)}sink(t){for(;2*t<=this.numberOfElements;){let n=2*t;if(nn?n:e}function uo(e,t,n,o){let r=n-e,s=o-t;return r*r+s*s}function y1(e,t){return{x:e.x+t.x,y:e.y+t.y}}var Y0,YA=["MobilenetV1/offset_2/BiasAdd","MobilenetV1/heatmap_2/BiasAdd","MobilenetV1/displacement_fwd_2/BiasAdd","MobilenetV1/displacement_bwd_2/BiasAdd"],Wt=1,v2=16,KA=50**2;function ho(e,t,n,o,r,s,A=2){let a=M=>({y:s.get(M.y,M.x,e),x:s.get(M.y,M.x,s.shape[2]/2+e)}),l=(M,T,m)=>({y:d1(Math.round(M.y/v2),0,T-1),x:d1(Math.round(M.x/v2),0,m-1)}),[c,d]=o.shape,i=l(t.position,c,d),y=a(i),p=y1(t.position,y);for(let M=0;M[C2[y],C2[x]]),A=s.map(([,y])=>y),a=s.map(([y])=>y),l=t.shape[2],c=A.length,d=new Array(l),i=x1(e.part,v2,n);d[e.part.id]={score:e.score,part:W2[e.part.id],position:i};for(let y=c-1;y>=0;--y){let x=A[y],p=a[y];d[x]&&!d[p]&&(d[p]=ho(y,d[x],p,t,n,r))}for(let y=0;yt){a=!1;break}if(!a)break}return a}function _A(e,t){let[n,o,r]=t.shape,s=new Ct(n*o*r,({score:A})=>A);for(let A=0;A{var A;let s=(A=r[o])==null?void 0:A.position;return s?uo(n,t,s.y,s.x)<=KA:!1})}function $A(e,t){return t.reduce((o,{position:r,score:s},A)=>(bo(e,r,A)||(o+=s),o),0)/t.length}function e4(e,t,n,o,r,s){let A=[],a=_A(s,t);for(;A.lengthx.score>s);let i=$A(A,d),y=mo(d);i>s&&A.push({keypoints:d,box:y,score:Math.round(100*i)/100})}return A}async function f1(e,t){if(!(Y0!=null&&Y0.executor))return[];let n=D0.tidy(()=>{if(!Y0.inputs[0].shape)return[];let A=D0.image.resizeBilinear(e,[Y0.inputs[0].shape[2],Y0.inputs[0].shape[1]]),a=D0.sub(D0.div(D0.cast(A,"float32"),127.5),1),c=Y0.execute(a,YA).map(d=>D0.squeeze(d,[0]));return c[1]=D0.sigmoid(c[1]),c}),o=await Promise.all(n.map(A=>A.buffer()));for(let A of n)D0.dispose(A);let r=e4(o[0],o[1],o[2],o[3],t.body.maxDetected,t.body.minConfidence);return Y0.inputs[0].shape?po(r,[e.shape[1],e.shape[2]],[Y0.inputs[0].shape[2],Y0.inputs[0].shape[1]]):[]}async function go(e){return!Y0||v.initial?Y0=await O(e.body.modelPath):e.debug&&u("cached model:",Y0.modelUrl),Y0}var F=V(H());var he,t4=["fgr","pha","r1o","r2o","r3o","r4o"],h0={},p1=0;function Ro(e){F.dispose([h0.r1i,h0.r2i,h0.r3i,h0.r4i,h0.downsample_ratio]),h0.r1i=F.tensor(0),h0.r2i=F.tensor(0),h0.r3i=F.tensor(0),h0.r4i=F.tensor(0),p1=e.segmentation.ratio||.5,h0.downsample_ratio=F.tensor(p1)}async function u1(e){return!he||v.initial?he=await O(e.segmentation.modelPath):e.debug&&u("cached model:",he.modelUrl),Ro(e),he}var vo=e=>F.tidy(()=>{let t=F.squeeze(e,[0]),n=F.mul(t,C.tf255);return F.cast(n,"int32")});function m1(e,t){let n=e?vo(e):F.fill([t.shape[1]||0,t.shape[2]||0,3],255,"int32"),o=t?vo(t):F.fill([e.shape[1]||0,e.shape[2]||0,1],255,"int32"),r=F.concat([n,o],-1);return F.dispose([n,o]),r}function n4(e){return F.tidy(()=>{let t={};return t.unstack=F.unstack(e,-1),t.concat=F.concat(t.unstack,1),t.split=F.split(t.concat,4,1),t.stack=F.concat(t.split,2),t.squeeze=F.squeeze(t.stack,[0]),t.expand=F.expandDims(t.squeeze,-1),t.add=F.add(t.expand,1),t.mul=F.mul(t.add,127.5),t.cast=F.cast(t.mul,"int32"),t.tile=F.tile(t.cast,[1,1,3]),t.alpha=F.fill([t.tile.shape[0]||0,t.tile.shape[1]||0,1],255,"int32"),F.concat([t.tile,t.alpha],-1)})}async function Mo(e,t){if(he||(he=await u1(t)),!(he!=null&&he.executor))return null;h0.src=F.div(e,255),p1!==t.segmentation.ratio&&Ro(t);let[n,o,r,s,A,a]=await he.executeAsync(h0,t4),l;switch(t.segmentation.mode||"default"){case"default":l=m1(n,o);break;case"alpha":l=m1(null,o);break;case"foreground":l=m1(n,null);break;case"state":l=n4(r);break;default:l=F.tensor(0)}return F.dispose([h0.src,n,o,h0.r1i,h0.r2i,h0.r3i,h0.r4i]),[h0.r1i,h0.r2i,h0.r3i,h0.r4i]=[r,s,A,a],l}var k0=V(H());var N0;async function h1(e){return!N0||v.initial?N0=await O(e.segmentation.modelPath):e.debug&&u("cached model:",N0.modelUrl),N0}async function ko(e,t){var r;if(N0||(N0=await h1(t)),!(N0!=null&&N0.executor)||!((r=N0==null?void 0:N0.inputs)!=null&&r[0].shape))return null;let n={};n.resize=k0.image.resizeBilinear(e,[N0.inputs[0].shape?N0.inputs[0].shape[1]:0,N0.inputs[0].shape?N0.inputs[0].shape[2]:0],!1),n.norm=k0.div(n.resize,C.tf255),n.res=N0.execute(n.norm),n.squeeze=k0.squeeze(n.res,[0]),n.alpha=k0.image.resizeBilinear(n.squeeze,[e.shape[1]||0,e.shape[2]||0]),n.mul=k0.mul(n.alpha,C.tf255);let o;switch(t.segmentation.mode||"default"){case"default":n.input=k0.squeeze(e),n.concat=k0.concat([n.input,n.mul],-1),o=k0.cast(n.concat,"int32");break;case"alpha":o=k0.cast(n.mul,"int32");break;default:o=k0.tensor(0)}return Object.keys(n).forEach(s=>k0.dispose(n[s])),o}function Dt(e,t,n){var c,d;if(!t||!((c=e==null?void 0:e.config)!=null&&c.validateModels))return null;let o=["const","placeholder","noop","pad","squeeze","add","sub","mul","div"],r=["biasadd","fusedbatchnormv3","matmul","switch","shape","merge","split","broadcastto"],s=[],A=[],a=t.modelUrl,l=t.executor;if((d=l==null?void 0:l.graph)!=null&&d.nodes)for(let i of Object.values(l.graph.nodes)){let y=i.op.toLowerCase();s.includes(y)||s.push(y)}else!l&&e.config.debug&&u("model not loaded",n);for(let i of s)!o.includes(i)&&!r.includes(i)&&!e.env.kernels.includes(i)&&!e.env.kernels.includes(i.replace("_",""))&&!e.env.kernels.includes(i.replace("native",""))&&!e.env.kernels.includes(i.replace("v2",""))&&A.push(i);return e.config.debug&&A.length>0&&u("model validation failed:",n,A),A.length>0?{name:n,missing:A,ops:s,url:a}:null}var D2=class{constructor(t){k(this,"instance");k(this,"models");this.models={},this.instance=t}stats(){let t=0,n=0,o=0;for(let s of Object.values(E0))t+=s.sizeFromManifest,n+=s.sizeLoadedWeights,o+=s.sizeDesired;let r=o>0?n/o:0;return{numLoadedModels:Object.values(E0).length,numDefinedModels:Object.keys(this.models).length,percentageLoaded:r,totalSizeFromManifest:t,totalSizeWeights:n,totalSizeLoading:o,modelStats:Object.values(E0)}}reset(){for(let t of Object.keys(this.models))this.models[t]=null}async load(){var n,o,r,s,A,a,l,c,d,i,y,x,p,f,b,M,T,m,h,S,P,I,q,t0,G,$,s0;v.initial&&this.reset();let t={};t.blazeface=this.instance.config.face.enabled&&!this.models.blazeface?u3(this.instance.config):null,t.antispoof=this.instance.config.face.enabled&&((n=this.instance.config.face.antispoof)==null?void 0:n.enabled)&&!this.models.antispoof?G3(this.instance.config):null,t.liveness=this.instance.config.face.enabled&&((o=this.instance.config.face.liveness)==null?void 0:o.enabled)&&!this.models.liveness?q3(this.instance.config):null,t.faceres=this.instance.config.face.enabled&&((r=this.instance.config.face.description)==null?void 0:r.enabled)&&!this.models.faceres?W3(this.instance.config):null,t.emotion=this.instance.config.face.enabled&&((s=this.instance.config.face.emotion)==null?void 0:s.enabled)&&!this.models.emotion?I3(this.instance.config):null,t.iris=this.instance.config.face.enabled&&((A=this.instance.config.face.iris)==null?void 0:A.enabled)&&!((a=this.instance.config.face.attention)!=null&&a.enabled)&&!this.models.iris?R3(this.instance.config):null,t.facemesh=this.instance.config.face.enabled&&((l=this.instance.config.face.mesh)==null?void 0:l.enabled)&&!this.models.facemesh?E3(this.instance.config):null,t.gear=this.instance.config.face.enabled&&((c=this.instance.config.face.gear)==null?void 0:c.enabled)&&!this.models.gear?J3(this.instance.config):null,t.ssrnetage=this.instance.config.face.enabled&&((d=this.instance.config.face.ssrnet)==null?void 0:d.enabled)&&!this.models.ssrnetage?en(this.instance.config):null,t.ssrnetgender=this.instance.config.face.enabled&&((i=this.instance.config.face.ssrnet)==null?void 0:i.enabled)&&!this.models.ssrnetgender?rn(this.instance.config):null,t.mobilefacenet=this.instance.config.face.enabled&&((y=this.instance.config.face.mobilefacenet)==null?void 0:y.enabled)&&!this.models.mobilefacenet?cn(this.instance.config):null,t.insightface=this.instance.config.face.enabled&&((x=this.instance.config.face.insightface)==null?void 0:x.enabled)&&!this.models.insightface?mn(this.instance.config):null,t.blazepose=this.instance.config.body.enabled&&!this.models.blazepose&&((p=this.instance.config.body.modelPath)==null?void 0:p.includes("blazepose"))?$1(this.instance.config):null,t.blazeposedetect=this.instance.config.body.enabled&&!this.models.blazeposedetect&&this.instance.config.body.detector&&this.instance.config.body.detector.modelPath?_1(this.instance.config):null,t.efficientpose=this.instance.config.body.enabled&&!this.models.efficientpose&&((f=this.instance.config.body.modelPath)==null?void 0:f.includes("efficientpose"))?s3(this.instance.config):null,t.movenet=this.instance.config.body.enabled&&!this.models.movenet&&((b=this.instance.config.body.modelPath)==null?void 0:b.includes("movenet"))?io(this.instance.config):null,t.posenet=this.instance.config.body.enabled&&!this.models.posenet&&((M=this.instance.config.body.modelPath)==null?void 0:M.includes("posenet"))?go(this.instance.config):null,t.handtrack=this.instance.config.hand.enabled&&!this.models.handtrack&&((m=(T=this.instance.config.hand.detector)==null?void 0:T.modelPath)==null?void 0:m.includes("handtrack"))?Jn(this.instance.config):null,t.handskeleton=this.instance.config.hand.enabled&&this.instance.config.hand.landmarks&&!this.models.handskeleton&&((S=(h=this.instance.config.hand.detector)==null?void 0:h.modelPath)==null?void 0:S.includes("handtrack"))?Qn(this.instance.config):null,(I=(P=this.instance.config.hand.detector)==null?void 0:P.modelPath)!=null&&I.includes("handdetect")&&([t.handpose,t.handskeleton]=this.models.handpose?[null,null]:await Xn(this.instance.config)),t.centernet=this.instance.config.object.enabled&&!this.models.centernet&&((q=this.instance.config.object.modelPath)==null?void 0:q.includes("centernet"))?n3(this.instance.config):null,t.nanodet=this.instance.config.object.enabled&&!this.models.nanodet&&((t0=this.instance.config.object.modelPath)==null?void 0:t0.includes("nanodet"))?xo(this.instance.config):null,t.selfie=this.instance.config.segmentation.enabled&&!this.models.selfie&&((G=this.instance.config.segmentation.modelPath)==null?void 0:G.includes("selfie"))?h1(this.instance.config):null,t.meet=this.instance.config.segmentation.enabled&&!this.models.meet&&(($=this.instance.config.segmentation.modelPath)==null?void 0:$.includes("meet"))?o1(this.instance.config):null,t.rvm=this.instance.config.segmentation.enabled&&!this.models.rvm&&((s0=this.instance.config.segmentation.modelPath)==null?void 0:s0.includes("rvm"))?u1(this.instance.config):null,await Promise.all([...Object.values(t)]);for(let R of Object.keys(t))this.models[R]=t[R]||this.models[R]||null}list(){let t=Object.keys(this.models).map(n=>{var o;return{name:n,loaded:this.models[n]!==null,size:0,url:this.models[n]?(o=this.models[n])==null?void 0:o.modelUrl:null}});for(let n of t){let o=Object.keys(E0).find(r=>r.startsWith(n.name));!o||(n.size=E0[o].sizeLoadedWeights,n.url=E0[o].url)}return t}loaded(){return this.list().filter(o=>o.loaded).map(o=>o.name)}validate(){let t=[];for(let n of Object.keys(this.models)){let o=this.models[n];if(!o)continue;let r=Dt(this.instance,o,n);r&&t.push(r)}return t}};function Eo(e,t,n,o,r){var a,l,c,d,i,y;let s=0,A=[];for(let x of e){let p={id:s++,face:x,body:null,hands:{left:null,right:null},gestures:[],box:[0,0,0,0]};for(let h of t)x.box[0]>h.box[0]&&x.box[0]h.box[1]&&x.box[1]+x.box[3]p.body.box[0]&&h.box[0]+h.box[2]p.body.box[1]&&h.box[1]+h.box[3]p.body.box[0]&&h.box[1]+h.box[3]>p.body.box[1]&&h.box[1]+h.box[3]{h&&h.length===4&&(f.push(h[0],h[0]+h[2]),b.push(h[1],h[1]+h[3]))};M(p.face.box),M((d=p.body)==null?void 0:d.box),M((i=p.hands.left)==null?void 0:i.box),M((y=p.hands.right)==null?void 0:y.box);let T=Math.min(...f),m=Math.min(...b);p.box=[T,m,Math.max(...f)-T,Math.max(...b)-m],(r==null?void 0:r[1])&&(r==null?void 0:r[2])&&(p.boxRaw=[p.box[0]/r[2],p.box[1]/r[1],p.box[2]/r[2],p.box[3]/r[1]]),A.push(p)}return A}var c0=V(H());var Ft=` +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`,Bt=` +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 +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAa2p1UYo5adbz+xbxMlvqJ1OqjDHLXree0ejmzNrWm953tPmTPWbWneZ7yoy5YhjrXXTjH8s75N +mtkyxt0VZM2/m175N1V03yTKubMLXVXybeYLLX2VXy7eam+b0bOg4VquJW+rry4/O9uyZOq3UjVm +9r25axMzPaIdvhns1kzbZddM0p5Y47z8/R2+HcF03Doi1a8+Xzvbv+TotJnjDXkt+K8ODHp8cY8N +IpSO0RCwF2YAAAAAAAAACvUZYw6fJkntWN3k8dfHz2vLucdz8mkjFE9bz1+UOZosX1UzPm0nqI/W +MYo9FlcPNklfFGeH/NshLGun+Cz6PtHZtVZWlRLS+jxPkRpIn7rdoupHTdA5s6SI+7H6Mfo+32Y2 ++To3neSIiZ7A0IjPXpXLePlMotGW3272t85datKzHZjbTVnsDj+FG/2Y/RlGP4R+jo20u7H6N1Ql +o+H8I/REY957R+jpfReiK6eOYHLtj2tttH6KrY/6Y/R2c+kjeJiFVtLG24hxpw7/AHY/RRkw9O37 +O99Hrt1YX0tfOBLjcGp4XF8c+u8fs9c4dcVcGemSI61nd3IneN1orQAAAAAAAAAAAAABFqxes1tE +TE9JiUgPKcX4RbRXnNgiZwWnrH4XPi28PdXpW9JraImsxtMS8pxXhF9DecuGJtgmf+1TWW2N/la1 +L7N7T5e3Vy6W3hsYcvLbqzbO9jvvCzvDR0+XeO7crO6FmGSvRThy/RtVXJ92elvk2rRvDUzU7pl4 +izsd2J3jeBpcNz+Lg5LT7+Pp+Xk3W7js5eAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs0NTrN96Yp6edkW8Wzm6+LNTq4pvTHO9vOfRoWtt +1mes95YWvs1s2fZldddOczLPLn2ju0MmebT3YZc2/mpm3qqllN1drsbZIhr3yzvtHf4AsvlYYseb +V5Yx4KTe0+UQ6nDvZ3UazbJqd8OKeu33peq0eh0+hxcmnxxWPOfOfm0mP+steT/ji8N9mKY9suum +L37+HHaPm9DSlaVitKxWsdohI0Y22gAgAAAAAAAAAABXnyRhw3yT92Nwef4xm8bVzET0rPJH5d12 +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 +NO67NbkhzNVnmInqzaOZrL93JyZeV0M1++7S02jvxDWxhxx033tPpC8Z6rrezWjmZyazJG2/u03h +2vFibTHoqvamiwVwY+nLGzV0+SZ1Mx8G0/45tOhzJ5lXMc3UVXRdlF1HP+iYsDPLPPy49/tz1+Te +pSIr0ho6ak5Ms5J8o2q6NImOrHV7XX488ypzTtHXo0s9t6zG7c1G1qz6ubeZiZ3UatXJG3yauSO7 +cvMTEx5tPLb3prPRMVr0HB8vicNxf0+7+kt+LOJwTJyY/Bnz3tH93X36N58cWvq6LSyiyndMSlC7 +mZcymLJiwLosmJVRLKLAtiU7q4lMSCzc3YxJuDMRuAlKAEgAAAlAkAAAAAABKAEgAAAAAJAAAAAA +AAAAAAAEgAAAAAAAAAAAAAkAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAhIAAACAAAASgAAAAAAEAAAA +hGzJAImGMwzQDDZjNVuyNgUTVhNGxysZqDVmiu1G5NN2M4waM0+DCaN2cbGcQNGaMZq3JxMJxA1J +qx2bU4kU09slorWNwa20z02RXHbJbl26QvtFovbHWkxEdJt5y2MOHlr2U1W3jx+1hiw8vSO63lmI +XRTaEWmtY6snRHO1VpmJ+DjavpSZl2s8b7y4HFcnh0n0gha5ebJN55KRM2mdoiPN6fh+kpwXh0Wy +RHj5Otp/s5Ps1p62y31+em9aTMYt/OfVfxTiPjZ52naI7fBrI5t66xz5+a1rW7yx0eSL6iZjtEOX +qNbSletom3lENjh2fbHzbbWt3iVozruc+5ztWubf4M4ybpQ2Oboyrva0Vjza8WdDR4OkXt3n9ldX +kaePP9VtYqctYhdvt5oivTeCZ2YOxXk6ubqMfV0b9mrljfqlFcq88k7z2U5axeItDa1OPessuC8P +ya7XRWYnwqdbT/ZMilvIu4dpslNdixXja8Y5tt85djZdbDWnGOesRtXFtuw6T27No5Kx2OrKYQlC +ExKJgBnEpiyvdlEgsizKLKollFgWxLKJVRLKJBbEp3VxLKJBnuMWQJEbpBIAAAJAAAABIAAAAAAA +lAJAAAAAAAAAAAAAASAAAAAAAAAAAAAJAAAABAJABAlAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAA +AAABAJQAAAAgAABAAI2EoBGyJhkgGPKxmqxAKpownHC+YRMdN5BrTj67R3bOn01o7p01Iv71u89o +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 +2Q==`;async function s4(e){let t=(r,s="application/octet-stream")=>fetch(`data:${s};base64,${r}`).then(A=>A.blob()),n,o;switch(e.config.warmup){case"face":n=await t(Ft);break;case"body":case"full":n=await t(Bt);break;default:n=null}if(n){let r=await createImageBitmap(n);o=await e.detect(r,e.config),r.close()}return o}async function A4(e){return new Promise(t=>{let n;switch(e.config.warmup){case"face":n="data:image/jpeg;base64,"+Ft;break;case"full":case"body":n="data:image/jpeg;base64,"+Bt;break;default:n=""}let o;if(typeof Image!="undefined")o=new Image;else if(v.Image)o=new v.Image;else return;o.onload=async()=>{let r=ee(o.naturalWidth,o.naturalHeight);if(!r)u("Warmup: Canvas not found"),t(void 0);else{let s=r.getContext("2d");s&&s.drawImage(o,0,0);let A=await e.image(r,!0),a=A.tensor?await e.detect(A.tensor,e.config):void 0;t(a)}},n?o.src=n:t(void 0)})}async function a4(e){let t=r=>Buffer.from(r,"base64"),n;e.config.warmup==="face"?n=t(Ft):n=t(Bt);let o;if("node"in c0&&c0.getBackend()==="tensorflow"){let r=c0.node.decodeJpeg(n),s=c0.expandDims(r,0);e.tf.dispose(r),o=await e.detect(s,e.config),e.tf.dispose(s)}else e.config.debug&&u("Warmup tfjs-node not loaded");return o}async function i4(e){let t;return typeof createImageBitmap=="function"?t=await s4(e):typeof Image!="undefined"||v.Canvas!==void 0?t=await A4(e):t=await a4(e),t}async function l4(e){var a,l,c,d;if(!c0.env().flagRegistry.ENGINE_COMPILE_ONLY)return;let t=c0.getBackend(),n=c0.backend();if(t!=="webgl"&&t!=="humangl"||!(n!=null&&n.checkCompileCompletion))return;c0.env().set("ENGINE_COMPILE_ONLY",!0);let o=c0.engine().state.numTensors,r=[];for(let[i,y]of Object.entries(e.models).filter(([x,p])=>x!==null&&p!==null)){let x=(y==null?void 0:y.modelSignature)&&((l=(a=y==null?void 0:y.inputs)==null?void 0:a[0])==null?void 0:l.shape)?[...y.inputs[0].shape]:[1,64,64,3],p=(y==null?void 0:y.modelSignature)&&((d=(c=y==null?void 0:y.inputs)==null?void 0:c[0])==null?void 0:d.dtype)?y.inputs[0].dtype:"float32";for(let b=0;bc0.dispose(M)):c0.dispose(b)}catch(b){e.config.debug&&u("compile fail model:",i)}c0.dispose(f)}let s=await n.checkCompileCompletionAsync();n.getUniformLocations(),e.config.debug&&u("compile pass:",{models:r,kernels:s.length}),c0.env().set("ENGINE_COMPILE_ONLY",!1);let A=c0.engine().state.numTensors;A-o>0&&u("tensor leak:",A-o)}async function zo(e,t){await S2(e,!1);let n=g();return e.state="warmup",t&&(e.config=A0(e.config,t)),!e.config.warmup||e.config.warmup.length===0||e.config.warmup==="none"?ue():new Promise(async o=>{await e.models.load(),await l4(e);let r=await i4(e),s=g();e.config.debug&&u("warmup",e.config.warmup,Math.round(s-n),"ms"),e.emit("warmup"),o(r)})}var R2,F2,B2,Ht,Xe,g1=class{constructor(t){k(this,"version");k(this,"config");k(this,"result");k(this,"state");k(this,"process");k(this,"tf");k(this,"env",v);k(this,"draw",$2);k(this,"match",jt);k(this,"models");k(this,"events");k(this,"faceTriangulation");k(this,"faceUVMap");k(this,"performance");i2(this,R2,void 0);i2(this,F2,void 0);i2(this,B2,void 0);k(this,"analyze",(...t)=>{if(!fe(this,F2))return;let n=this.tf.engine().state.numTensors,o=fe(this,R2);k2(this,R2,n);let r=n-o;r!==0&&u(...t,r)});i2(this,Ht,t=>{if(!fe(this,B2))return null;if(!t)return"input is not defined";if(this.env.node&&!(t instanceof Ae.Tensor))return"input must be a tensor";try{this.tf.getBackend()}catch(n){return"backend not loaded"}return null});k(this,"webcam",new q2);k(this,"emit",t=>{var n;(n=this.events)!=null&&n.dispatchEvent&&this.events.dispatchEvent(new Event(t))});i2(this,Xe,{});let n=(Ae.version.tfjs||Ae.version_core).replace(/-(.*)/,"");qe.wasmPath=`https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${n}/dist/`,qe.modelBasePath=v.browser?"../models/":"file://models/",this.version=Jt,Object.defineProperty(this,"version",{value:Jt}),this.config=JSON.parse(JSON.stringify(qe)),Object.seal(this.config),this.config.cacheModels=typeof indexedDB!="undefined",t&&(this.config=A0(this.config,t)),W1(this.config),this.tf=Ae,this.state="idle",k2(this,R2,0),k2(this,F2,!1),k2(this,B2,!1),this.performance={},this.events=typeof EventTarget!="undefined"?new EventTarget:void 0,this.models=new D2(this),o5(),this.result=ue(),this.process={tensor:null,canvas:null},this.faceTriangulation=z3,this.faceUVMap=S3,Dt(this,null,""),this.emit("create"),(this.config.debug||this.env.browser)&&u(`version: ${this.version}`),this.config.debug&&u(`tfjs version: ${this.tf.version["tfjs-core"]}`);let o=JSON.parse(JSON.stringify(this.env));delete o.kernels,delete o.initial,delete o.perfadd,this.config.debug&&u("environment:",o)}reset(){let t=this.config.backend;this.config=JSON.parse(JSON.stringify(qe)),this.config.backend=t,Yt(),v.initial=!0}validate(t){let n=Xt(qe,t||this.config);return n.length===0&&(this.config=A0(this.config,t)),n}now(){return g()}image(t,n=!1){return Z2(t,this.config,n)}async segmentation(t,n){var s,A,a;if(n&&(this.config=A0(this.config,n)),!this.config.segmentation.enabled)return null;let o=await Z2(t,this.config);if(!o.tensor)return null;let r=null;return(s=this.config.segmentation.modelPath)!=null&&s.includes("rvm")&&(r=await Mo(o.tensor,this.config)),(A=this.config.segmentation.modelPath)!=null&&A.includes("meet")&&(r=await eo(o.tensor,this.config)),(a=this.config.segmentation.modelPath)!=null&&a.includes("selfie")&&(r=await ko(o.tensor,this.config)),Ae.dispose(o.tensor),r}compare(t,n){return C1(this.config,t,n)}async init(){await S2(this,!0),await this.tf.ready(),Yt()}async load(t){this.state="load";let n=g(),o=Object.values(this.models).filter(A=>A).length;t&&(this.config=A0(this.config,t)),this.env.initial&&(await S2(this,!1)||u("error: backend check failed"),await Ae.ready(),this.env.browser&&(this.config.debug&&u("configuration:",this.config),this.config.debug&&u("tf flags:",this.tf.ENV.flags))),await this.models.load(),this.env.initial&&this.config.debug&&u("tf engine state:",this.tf.engine().state.numBytes,"bytes",this.tf.engine().state.numTensors,"tensors"),this.env.initial=!1,Object.values(this.models).filter(A=>A).length!==o&&(this.models.validate(),this.emit("load"));let s=Math.trunc(g()-n);s>(this.performance.loadModels||0)&&(this.performance.loadModels=this.env.perfadd?(this.performance.loadModels||0)+s:s)}next(t=this.result){return $n(t,this.config)}async warmup(t){let n=g(),o=await zo(this,t),r=g();return this.performance.warmup=Math.trunc(r-n),o}async profile(t,n){let o=await this.tf.profile(()=>this.detect(t,n)),r={},s=0;for(let a of o.kernels){let l=Number(a.kernelTimeMs)||0;r[a.name]?r[a.name]+=l:r[a.name]=l,s+=l}let A=[];Object.entries(r).forEach(a=>A.push({kernel:a[0],time:a[1],perc:0}));for(let a of A)a.perc=Math.round(1e3*a.time/s)/1e3,a.time=Math.round(1e3*a.time)/1e3;return A.sort((a,l)=>l.time-a.time),A.length=20,A}async detect(t,n){return this.state="detect",new Promise(async o=>{var b,M,T,m,h,S,P,I,q,t0,G,$,s0,R,Z,b0,U,g0,f0,B,X;this.state="config";let r;this.config=A0(this.config,n),this.state="check";let s=fe(this,Ht).call(this,t);s&&(u(s,t),this.emit("error"),o(ue(s)));let A=g();await this.load(),r=g(),this.state="image";let a=await Z2(t,this.config);if(this.process=a,this.performance.inputProcess=this.env.perfadd?(this.performance.inputProcess||0)+Math.trunc(g()-r):Math.trunc(g()-r),this.analyze("Get Image:"),!a.tensor){this.config.debug&&u("could not convert input to tensor"),this.emit("error"),o(ue("could not convert input to tensor"));return}this.emit("image"),r=g(),this.config.skipAllowed=await L1(this.config,a.tensor),this.config.filter.autoBrightness=(this.config.filter.autoBrightness||!1)&&this.config.skipAllowed,this.performance.totalFrames||(this.performance.totalFrames=0),this.performance.cachedFrames||(this.performance.cachedFrames=0),this.performance.totalFrames++,this.config.skipAllowed&&this.performance.cachedFrames++,this.performance.cacheCheck=this.env.perfadd?(this.performance.cacheCheck||0)+Math.trunc(g()-r):Math.trunc(g()-r),this.analyze("Check Changed:");let l=[],c=[],d=[],i=[];this.state="detect:face",this.config.async?(l=this.config.face.enabled?Z5(this,a.tensor):[],this.performance.face&&delete this.performance.face):(r=g(),l=this.config.face.enabled?await Z5(this,a.tensor):[],this.performance.face=this.env.perfadd?(this.performance.face||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.config.async&&(this.config.body.maxDetected===-1||this.config.hand.maxDetected===-1)&&(l=await l),this.analyze("Start Body:"),this.state="detect:body";let y=this.config.body.maxDetected===-1?A0(this.config,{body:{maxDetected:this.config.face.enabled?1*l.length:1}}):this.config;this.config.async?((b=this.config.body.modelPath)!=null&&b.includes("posenet")?c=this.config.body.enabled?f1(a.tensor,y):[]:(M=this.config.body.modelPath)!=null&&M.includes("blazepose")?c=this.config.body.enabled?i5(a.tensor,y):[]:(T=this.config.body.modelPath)!=null&&T.includes("efficientpose")?c=this.config.body.enabled?m5(a.tensor,y):[]:(m=this.config.body.modelPath)!=null&&m.includes("movenet")&&(c=this.config.body.enabled?a1(a.tensor,y):[]),this.performance.body&&delete this.performance.body):(r=g(),(h=this.config.body.modelPath)!=null&&h.includes("posenet")?c=this.config.body.enabled?await f1(a.tensor,y):[]:(S=this.config.body.modelPath)!=null&&S.includes("blazepose")?c=this.config.body.enabled?await i5(a.tensor,y):[]:(P=this.config.body.modelPath)!=null&&P.includes("efficientpose")?c=this.config.body.enabled?await m5(a.tensor,y):[]:(I=this.config.body.modelPath)!=null&&I.includes("movenet")&&(c=this.config.body.enabled?await a1(a.tensor,y):[]),this.performance.body=this.env.perfadd?(this.performance.body||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.state="detect:hand";let x=this.config.hand.maxDetected===-1?A0(this.config,{hand:{maxDetected:this.config.face.enabled?2*l.length:1}}):this.config;this.config.async?((t0=(q=this.config.hand.detector)==null?void 0:q.modelPath)!=null&&t0.includes("handdetect")?d=this.config.hand.enabled?K5(a.tensor,x):[]:($=(G=this.config.hand.detector)==null?void 0:G.modelPath)!=null&&$.includes("handtrack")&&(d=this.config.hand.enabled?_5(a.tensor,x):[]),this.performance.hand&&delete this.performance.hand):(r=g(),(R=(s0=this.config.hand.detector)==null?void 0:s0.modelPath)!=null&&R.includes("handdetect")?d=this.config.hand.enabled?await K5(a.tensor,x):[]:(b0=(Z=this.config.hand.detector)==null?void 0:Z.modelPath)!=null&&b0.includes("handtrack")&&(d=this.config.hand.enabled?await _5(a.tensor,x):[]),this.performance.hand=this.env.perfadd?(this.performance.hand||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.state="detect:object",this.config.async?((U=this.config.object.modelPath)!=null&&U.includes("nanodet")?i=this.config.object.enabled?l1(a.tensor,this.config):[]:(g0=this.config.object.modelPath)!=null&&g0.includes("centernet")&&(i=this.config.object.enabled?x5(a.tensor,this.config):[]),this.performance.object&&delete this.performance.object):(r=g(),(f0=this.config.object.modelPath)!=null&&f0.includes("nanodet")?i=this.config.object.enabled?await l1(a.tensor,this.config):[]:(B=this.config.object.modelPath)!=null&&B.includes("centernet")&&(i=this.config.object.enabled?await x5(a.tensor,this.config):[]),this.performance.object=this.env.perfadd?(this.performance.object||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.analyze("End Object:"),this.state="detect:await",this.config.async&&([l,c,d,i]=await Promise.all([l,c,d,i])),this.state="detect:gesture";let p=[];this.config.gesture.enabled&&(r=g(),p=[...En(l),...wn(c),...Sn(d),...zn(l)],this.config.async?this.performance.gesture&&delete this.performance.gesture:this.performance.gesture=this.env.perfadd?(this.performance.gesture||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.performance.total=this.env.perfadd?(this.performance.total||0)+Math.trunc(g()-A):Math.trunc(g()-A);let f=((X=this.process.tensor)==null?void 0:X.shape)||[0,0,0,0];this.result={face:l,body:c,hand:d,gesture:p,object:i,performance:this.performance,canvas:this.process.canvas,timestamp:Date.now(),error:null,width:f[2],height:f[1],get persons(){return Eo(l,c,d,p,f)}},Ae.dispose(a.tensor),this.emit("detect"),this.state="idle",o(this.result)})}async sleep(t){return new Promise(n=>{setTimeout(n,t)})}async video(t,n=!0,o=0){n?(fe(this,Xe)[t.id]||(this.config.debug&&u("video start",t.id),fe(this,Xe)[t.id]=!0),!t.paused&&fe(this,Xe)[t.id]&&t.readyState>=2&&await this.detect(t),o>0&&await this.sleep(o),fe(this,Xe)[t.id]&&requestAnimationFrame(()=>this.video(t,n,o))):(this.config.debug&&u("video stop",t.id),fe(this,Xe)[t.id]=!1)}};R2=new WeakMap,F2=new WeakMap,B2=new WeakMap,Ht=new WeakMap,Xe=new WeakMap;0&&(module.exports={Env,Human,defaults,draw,empty,env,match,models}); diff --git a/dist/human.node.d.ts b/dist/human.node.d.ts new file mode 100644 index 00000000..f94037de --- /dev/null +++ b/dist/human.node.d.ts @@ -0,0 +1 @@ +export * from '../types/human'; \ No newline at end of file diff --git a/dist/human.node.js b/dist/human.node.js new file mode 100644 index 00000000..dcde41a3 --- /dev/null +++ b/dist/human.node.js @@ -0,0 +1,840 @@ +/* + Human + homepage: + author: ' +*/ + +"use strict";var zo=Object.create;var P2=Object.defineProperty;var So=Object.getOwnPropertyDescriptor;var jo=Object.getOwnPropertyNames;var No=Object.getPrototypeOf,Io=Object.prototype.hasOwnProperty;var Oo=(e,t,n)=>t in e?P2(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var Lo=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),we=(e,t)=>{for(var n in t)P2(e,n,{get:t[n],enumerable:!0})},R1=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of jo(t))!Io.call(e,r)&&r!==n&&P2(e,r,{get:()=>t[r],enumerable:!(o=So(t,r))||o.enumerable});return e};var V=(e,t,n)=>(n=e!=null?zo(No(e)):{},R1(t||!e||!e.__esModule?P2(n,"default",{value:e,enumerable:!0}):n,e)),Co=e=>R1(P2({},"__esModule",{value:!0}),e);var k=(e,t,n)=>(Oo(e,typeof t!="symbol"?t+"":t,n),n),M1=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)};var fe=(e,t,n)=>(M1(e,t,"read from private field"),n?n.call(e):t.get(e)),i2=(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)},k2=(e,t,n,o)=>(M1(e,t,"write to private field"),o?o.call(e,n):t.set(e,n),n);var H=Lo((y4,Vt)=>{"use strict";var Ht=Object.defineProperty,Wo=Object.getOwnPropertyDescriptor,Do=Object.getOwnPropertyNames,Fo=Object.prototype.hasOwnProperty,Bo=(e,t)=>{for(var n in t)Ht(e,n,{get:t[n],enumerable:!0})},Bt=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Do(t))!Fo.call(e,r)&&r!==n&&Ht(e,r,{get:()=>t[r],enumerable:!(o=Wo(t,r))||o.enumerable});return e},Ho=(e,t,n)=>(Bt(e,t,"default"),n&&Bt(n,t,"default")),Go=e=>Bt(Ht({},"__esModule",{value:!0}),e),Gt={};Bo(Gt,{version:()=>Yo});Vt.exports=Go(Gt);Ho(Gt,require("@tensorflow/tfjs-node"),Vt.exports);var P1="4.0.0",Vo="4.0.0",Zo="4.0.0",Xo="4.0.0",qo="4.0.0",Uo="0.0.1-alpha.14",Yo={tfjs:P1,"tfjs-core":P1,"tfjs-converter":Vo,"tfjs-backend-cpu":Zo,"tfjs-backend-webgl":Xo,"tfjs-backend-wasm":qo,"tfjs-backend-webgpu":Uo}});var d4={};we(d4,{Env:()=>w2,Human:()=>b1,default:()=>b1,defaults:()=>qe,draw:()=>Q2,empty:()=>ue,env:()=>v,match:()=>zt,models:()=>h1});module.exports=Co(d4);var Ae=V(H());function u(...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)}function k1(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(`modelpath error: expecting json file: ${r}`);return r}var g=()=>typeof performance!="undefined"?performance.now():parseInt((Number(process.hrtime.bigint())/1e3/1e3).toString());function Zt(e,t,n="config",o=[]){for(let r of Object.keys(t))if(typeof t[r]=="object")Zt(e[r],t[r],r,o);else{let s=e&&typeof e[r]!="undefined";s||o.push({reason:"unknown property",where:`${n}.${r} = ${t[r]}`});let A=e&&typeof e[r]==typeof t[r];s&&!A&&o.push({reason:"property type mismatch",where:`${n}.${r} = ${t[r]}`,expected:typeof e[r]})}return t.debug&&n==="config"&&o.length>0&&u("invalid configuration",o),o}function A0(...e){let t=n=>n&&typeof n=="object";return e.reduce((n,o)=>(Object.keys(o||{}).forEach(r=>{let s=n[r],A=o[r];Array.isArray(s)&&Array.isArray(A)?n[r]=s.concat(...A):t(s)&&t(A)?n[r]=A0(s,A):n[r]=A}),n),{})}var qe={backend:"",modelBasePath:"",cacheModels:!0,validateModels:!0,wasmPath:"",wasmPlatformFetch:!1,debug:!1,async:!0,warmup:"full",cacheSensitivity:.7,skipAllowed:!1,deallocate:!1,flags:{},softwareKernels:!1,filter:{enabled:!0,equalization:!1,width:0,height:0,flip:!1,return:!0,autoBrightness:!0,brightness:0,contrast:0,sharpness:0,blur:0,saturation:0,hue:0,negative:!1,sepia:!1,vintage:!1,kodachrome:!1,technicolor:!1,polaroid:!1,pixelate:0},gesture:{enabled:!0},face:{enabled:!0,detector:{modelPath:"blazeface.json",rotation:!0,maxDetected:1,skipFrames:99,skipTime:2500,minConfidence:.2,iouThreshold:.1,mask:!1,return:!1},mesh:{enabled:!0,modelPath:"facemesh.json",keepInvalid:!1},attention:{enabled:!1,modelPath:"facemesh-attention.json"},iris:{enabled:!0,modelPath:"iris.json"},emotion:{enabled:!0,minConfidence:.1,skipFrames:99,skipTime:1500,modelPath:"emotion.json"},description:{enabled:!0,modelPath:"faceres.json",skipFrames:99,skipTime:3e3,minConfidence:.1},antispoof:{enabled:!1,skipFrames:99,skipTime:4e3,modelPath:"antispoof.json"},liveness:{enabled:!1,skipFrames:99,skipTime:4e3,modelPath:"liveness.json"}},body:{enabled:!0,modelPath:"movenet-lightning.json",maxDetected:-1,minConfidence:.3,skipFrames:1,skipTime:200},hand:{enabled:!0,rotation:!0,skipFrames:99,skipTime:1e3,minConfidence:.5,iouThreshold:.2,maxDetected:-1,landmarks:!0,detector:{modelPath:"handtrack.json"},skeleton:{modelPath:"handlandmark-full.json"}},object:{enabled:!1,modelPath:"centernet.json",minConfidence:.2,iouThreshold:.4,maxDetected:10,skipFrames:99,skipTime:2e3},segmentation:{enabled:!1,modelPath:"rvm.json",ratio:.5,mode:"default"}};var I0=V(H());var N=V(H());var w1=` + 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.); + } +`;var E1=` + 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]; + } +`,z1=` + 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; + } +`,S1=` + 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); + } +`,j1=` + 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; + } +`,N1=` + 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); // top left + vec4 c12 = texture2D(texture, vec2(vUv.x, vUv.y - px.y)); // top center + vec4 c13 = texture2D(texture, vec2(vUv.x + px.x, vUv.y - px.y)); // top right + vec4 c21 = texture2D(texture, vec2(vUv.x - px.x, vUv.y) ); // mid left + vec4 c22 = texture2D(texture, vUv); // mid center + vec4 c23 = texture2D(texture, vec2(vUv.x + px.x, vUv.y) ); // mid right + vec4 c31 = texture2D(texture, vec2(vUv.x - px.x, vUv.y + px.y) ); // bottom left + vec4 c32 = texture2D(texture, vec2(vUv.x, vUv.y + px.y) ); // bottom center + vec4 c33 = texture2D(texture, vUv + px ); // bottom right + 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; + } +`;var Xt=(e,t,n)=>{let o=new RegExp("\\b"+t+" \\w+ (\\w+)","ig");e.replace(o,(r,s)=>(n[s]=0,r))},qt=class{constructor(t,n,o){k(this,"uniform",{});k(this,"attribute",{});k(this,"gl");k(this,"id");k(this,"compile",(t,n)=>{let o=this.gl.createShader(n);return o?(this.gl.shaderSource(o,t),this.gl.compileShader(o),this.gl.getShaderParameter(o,this.gl.COMPILE_STATUS)?o:(u(`filter: gl compile failed: ${this.gl.getShaderInfoLog(o)||"unknown"}`),null)):(u("filter: could not create shader"),null)});this.gl=t;let r=this.compile(n,this.gl.VERTEX_SHADER),s=this.compile(o,this.gl.FRAGMENT_SHADER);if(this.id=this.gl.createProgram(),!(!r||!s)){if(!this.id){u("filter: could not create webgl program");return}if(this.gl.attachShader(this.id,r),this.gl.attachShader(this.id,s),this.gl.linkProgram(this.id),!this.gl.getProgramParameter(this.id,this.gl.LINK_STATUS)){u(`filter: gl link failed: ${this.gl.getProgramInfoLog(this.id)||"unknown"}`);return}this.gl.useProgram(this.id),Xt(n,"attribute",this.attribute);for(let A in this.attribute)this.attribute[A]=this.gl.getAttribLocation(this.id,A);Xt(n,"uniform",this.uniform),Xt(o,"uniform",this.uniform);for(let A in this.uniform)this.uniform[A]=this.gl.getUniformLocation(this.id,A)}}};function I1(){let e=0,t=null,n=!1,o=-1,r=[null,null],s=[],A=null,a=null,l=ee(100,100),c={},x={INTERMEDIATE:1},i=l.getContext("webgl");if(!i){u("filter: cannot get webgl context");return}this.gl=i;function y(T,m){if(!(T===l.width&&m===l.height)){if(l.width=T,l.height=m,!A){let h=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]);A=i.createBuffer(),i.bindBuffer(i.ARRAY_BUFFER,A),i.bufferData(i.ARRAY_BUFFER,h,i.STATIC_DRAW),i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0)}i.viewport(0,0,l.width,l.height),r=[null,null]}}function d(T,m){let h=i.createFramebuffer();i.bindFramebuffer(i.FRAMEBUFFER,h);let S=i.createRenderbuffer();i.bindRenderbuffer(i.RENDERBUFFER,S);let P=i.createTexture();return i.bindTexture(i.TEXTURE_2D,P),i.texImage2D(i.TEXTURE_2D,0,i.RGBA,T,m,0,i.RGBA,i.UNSIGNED_BYTE,null),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,i.LINEAR),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,i.LINEAR),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,i.CLAMP_TO_EDGE),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,i.CLAMP_TO_EDGE),i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,P,0),i.bindTexture(i.TEXTURE_2D,null),i.bindFramebuffer(i.FRAMEBUFFER,null),{fbo:h,texture:P}}function p(T){return r[T]=r[T]||d(l.width,l.height),r[T]}function f(T=0){if(!a)return;let m=null,h=null,S=!1;e===0?m=t:m=p(o).texture||null,e++,n&&!(T&x.INTERMEDIATE)?(h=null,S=e%2===0):(o=(o+1)%2,h=p(o).fbo||null),i.bindTexture(i.TEXTURE_2D,m),i.bindFramebuffer(i.FRAMEBUFFER,h),i.uniform1f(a.uniform.flipY,S?-1:1),i.drawArrays(i.TRIANGLES,0,6)}function b(T){if(c[T])return a=c[T],i.useProgram((a?a.id:null)||null),a;if(a=new qt(i,w1,T),!a)return u("filter: could not get webgl program"),null;let m=Float32Array.BYTES_PER_ELEMENT,h=4*m;return i.enableVertexAttribArray(a.attribute.pos),i.vertexAttribPointer(a.attribute.pos,2,i.FLOAT,!1,h,0*m),i.enableVertexAttribArray(a.attribute.uv),i.vertexAttribPointer(a.attribute.uv,2,i.FLOAT,!1,h,2*m),c[T]=a,a}let M={colorMatrix:T=>{let m=new Float32Array(T);m[4]/=255,m[9]/=255,m[14]/=255,m[19]/=255;let h=m[18]===1&&m[3]===0&&m[8]===0&&m[13]===0&&m[15]===0&&m[16]===0&&m[17]===0&&m[19]===0?z1:E1,S=b(h);!S||(i.uniform1fv(S.uniform.m,m),f())},brightness:T=>{let m=(T||0)+1;M.colorMatrix([m,0,0,0,0,0,m,0,0,0,0,0,m,0,0,0,0,0,1,0])},saturation:T=>{let m=(T||0)*2/3+1,h=(m-1)*-.5;M.colorMatrix([m,h,h,0,0,h,m,h,0,0,h,h,m,0,0,0,0,0,1,0])},desaturate:()=>{M.saturation(-1)},contrast:T=>{let m=(T||0)+1,h=-128*(m-1);M.colorMatrix([m,0,0,0,h,0,m,0,0,h,0,0,m,0,h,0,0,0,1,0])},negative:()=>{M.contrast(-2)},hue:T=>{T=(T||0)/180*Math.PI;let m=Math.cos(T),h=Math.sin(T),S=.213,P=.715,I=.072;M.colorMatrix([S+m*(1-S)+h*-S,P+m*-P+h*-P,I+m*-I+h*(1-I),0,0,S+m*-S+h*.143,P+m*(1-P)+h*.14,I+m*-I+h*-.283,0,0,S+m*-S+h*-(1-S),P+m*-P+h*P,I+m*(1-I)+h*I,0,0,0,0,0,1,0])},desaturateLuminance:()=>{M.colorMatrix([.2764723,.929708,.0938197,0,-37.1,.2764723,.929708,.0938197,0,-37.1,.2764723,.929708,.0938197,0,-37.1,0,0,0,1,0])},sepia:()=>{M.colorMatrix([.393,.7689999,.18899999,0,0,.349,.6859999,.16799999,0,0,.272,.5339999,.13099999,0,0,0,0,0,1,0])},brownie:()=>{M.colorMatrix([.5997023498159715,.34553243048391263,-.2708298674538042,0,47.43192855600873,-.037703249837783157,.8609577587992641,.15059552388459913,0,-36.96841498319127,.24113635128153335,-.07441037908422492,.44972182064877153,0,-7.562075277591283,0,0,0,1,0])},vintagePinhole:()=>{M.colorMatrix([.6279345635605994,.3202183420819367,-.03965408211312453,0,9.651285835294123,.02578397704808868,.6441188644374771,.03259127616149294,0,7.462829176470591,.0466055556782719,-.0851232987247891,.5241648018700465,0,5.159190588235296,0,0,0,1,0])},kodachrome:()=>{M.colorMatrix([1.1285582396593525,-.3967382283601348,-.03992559172921793,0,63.72958762196502,-.16404339962244616,1.0835251566291304,-.05498805115633132,0,24.732407896706203,-.16786010706155763,-.5603416277695248,1.6014850761964943,0,35.62982807460946,0,0,0,1,0])},technicolor:()=>{M.colorMatrix([1.9125277891456083,-.8545344976951645,-.09155508482755585,0,11.793603434377337,-.3087833385928097,1.7658908555458428,-.10601743074722245,0,-70.35205161461398,-.231103377548616,-.7501899197440212,1.847597816108189,0,30.950940869491138,0,0,0,1,0])},polaroid:()=>{M.colorMatrix([1.438,-.062,-.062,0,0,-.122,1.378,-.122,0,0,-.016,-.016,1.483,0,0,0,0,0,1,0])},shiftToBGR:()=>{M.colorMatrix([0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0])},convolution:T=>{let m=new Float32Array(T),h=1/l.width,S=1/l.height,P=b(N1);!P||(i.uniform1fv(P.uniform.m,m),i.uniform2f(P.uniform.px,h,S),f())},detectEdges:()=>{M.convolution.call(this,[0,1,0,1,-4,1,0,1,0])},sobelX:()=>{M.convolution.call(this,[-1,0,1,-2,0,2,-1,0,1])},sobelY:()=>{M.convolution.call(this,[-1,-2,-1,0,0,0,1,2,1])},sharpen:T=>{let m=T||1;M.convolution.call(this,[0,-1*m,0,-1*m,1+4*m,-1*m,0,-1*m,0])},emboss:T=>{let m=T||1;M.convolution.call(this,[-2*m,-1*m,0,-1*m,1,1*m,0,1*m,2*m])},blur:T=>{let m=T/7/l.width,h=T/7/l.height,S=b(j1);!S||(i.uniform2f(S.uniform.px,0,h),f(x.INTERMEDIATE),i.uniform2f(S.uniform.px,m,0),f())},pixelate:T=>{let m=T/l.width,h=T/l.height,S=b(S1);!S||(i.uniform2f(S.uniform.size,m,h),f())}};this.add=function(T){let m=Array.prototype.slice.call(arguments,1),h=M[T];s.push({func:h,args:m})},this.reset=function(){s=[]},this.get=function(){return s},this.apply=function(T){y(T.width,T.height),e=0,t||(t=i.createTexture()),i.bindTexture(i.TEXTURE_2D,t),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,i.CLAMP_TO_EDGE),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,i.CLAMP_TO_EDGE),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,i.NEAREST),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,i.NEAREST),i.texImage2D(i.TEXTURE_2D,0,i.RGBA,i.RGBA,i.UNSIGNED_BYTE,T);for(let m=0;mx.data())),A=Math.max(s[0][0],s[1][0],s[2][0]),l=(A>1?255:1)/A,c;if(l>1){let x=[Y.sub(n[0],o[0]),Y.sub(n[1],o[1]),Y.sub(n[2],o[2])],i=[Y.sub(r[0],o[0]),Y.sub(r[1],o[1]),Y.sub(r[2],o[2])],y=[Y.mul(x[0],l),Y.mul(x[1],l),Y.mul(x[2],l)],d=Y.stack([y[0],y[1],y[2]],2);c=Y.reshape(d,[1,t.shape[0]||0,t.shape[1]||0,3]),Y.dispose([...x,...i,...y])}else c=Y.expandDims(t,0);return Y.dispose([...n,...o,...r,n,t,e]),c}var B2=3840,v0=null,R0=null,l2=null,e0,K0={inputSum:0,cacheDiff:1,sumMethod:0,inputTensor:void 0};function Ut(){K0.inputSum=0,K0.cacheDiff=1,K0.sumMethod=0,K0.inputTensor=void 0}function ee(e,t){let n;if(v.browser)if(v.worker){if(typeof OffscreenCanvas=="undefined")throw new Error("canvas error: attempted to run in web worker but OffscreenCanvas is not supported");n=new OffscreenCanvas(e,t)}else{if(typeof document=="undefined")throw new Error("canvas error: attempted to run in browser but DOM is not defined");n=document.createElement("canvas"),n.width=e,n.height=t}else typeof v.Canvas!="undefined"?n=new v.Canvas(e,t):typeof globalThis.Canvas!="undefined"&&(n=new globalThis.Canvas(e,t));return n}function H2(e,t){let n=t||ee(e.width,e.height);return n.getContext("2d").drawImage(e,0,0),n}async function G2(e,t,n=!0){var y,d,p;if(!e)return t.debug&&u("input error: input is missing"),{tensor:null,canvas:null};if(!(e instanceof N.Tensor)&&!(typeof Image!="undefined"&&e instanceof Image)&&!(typeof v.Canvas!="undefined"&&e instanceof v.Canvas)&&!(typeof globalThis.Canvas!="undefined"&&e instanceof globalThis.Canvas)&&!(typeof ImageData!="undefined"&&e instanceof ImageData)&&!(typeof ImageBitmap!="undefined"&&e instanceof ImageBitmap)&&!(typeof HTMLImageElement!="undefined"&&e instanceof HTMLImageElement)&&!(typeof HTMLMediaElement!="undefined"&&e instanceof HTMLMediaElement)&&!(typeof HTMLVideoElement!="undefined"&&e instanceof HTMLVideoElement)&&!(typeof HTMLCanvasElement!="undefined"&&e instanceof HTMLCanvasElement)&&!(typeof OffscreenCanvas!="undefined"&&e instanceof OffscreenCanvas))throw new Error("input error: type is not recognized");if(e instanceof N.Tensor){let f=null;if(e.isDisposedInternal)throw new Error("input error: attempted to use tensor but it is disposed");if(!e.shape)throw new Error("input error: attempted to use tensor without a shape");if(e.shape.length===3){if(e.shape[2]===3)f=N.expandDims(e,0);else if(e.shape[2]===4){let b=N.slice3d(e,[0,0,0],[-1,-1,3]);f=N.expandDims(b,0),N.dispose(b)}}else e.shape.length===4&&(e.shape[3]===3?f=N.clone(e):e.shape[3]===4&&(f=N.slice4d(e,[0,0,0,0],[-1,-1,-1,3])));if(f==null||f.shape.length!==4||f.shape[0]!==1||f.shape[3]!==3)throw new Error(`input error: attempted to use tensor with unrecognized shape: ${e.shape.toString()}`);if(f.dtype==="int32"){let b=N.cast(f,"float32");N.dispose(f),f=b}return{tensor:f,canvas:t.filter.return?R0:null}}if(typeof e.readyState!="undefined"&&e.readyState<=2)return t.debug&&u("input stream is not ready"),{tensor:null,canvas:v0};let o=e.naturalWidth||e.videoWidth||e.width||e.shape&&e.shape[1]>0,r=e.naturalHeight||e.videoHeight||e.height||e.shape&&e.shape[2]>0;if(!o||!r)return t.debug&&u("cannot determine input dimensions"),{tensor:null,canvas:v0};let s=o,A=r;if(s>B2&&(s=B2,A=Math.trunc(s*r/o)),A>B2&&(A=B2,s=Math.trunc(A*o/r)),(((y=t.filter)==null?void 0:y.width)||0)>0?s=t.filter.width:(((d=t.filter)==null?void 0:d.height)||0)>0&&(s=o*((t.filter.height||0)/r)),(t.filter.height||0)>0?A=t.filter.height:(t.filter.width||0)>0&&(A=r*((t.filter.width||0)/o)),!s||!A)throw new Error("input error: cannot determine dimension");(!v0||v0.width!==s||v0.height!==A)&&(v0=ee(s,A));let a=v0.getContext("2d");if(typeof ImageData!="undefined"&&e instanceof ImageData?a.putImageData(e,0,0):t.filter.flip&&typeof a.translate!="undefined"?(a.translate(o,0),a.scale(-1,1),a.drawImage(e,0,0,o,r,0,0,v0.width,v0.height),a.setTransform(1,0,0,1,0,0)):a.drawImage(e,0,0,o,r,0,0,v0.width,v0.height),(!R0||v0.width!==R0.width||v0.height!==R0.height)&&(R0=ee(v0.width,v0.height)),t.filter.enabled&&v.webgl.supported?(e0||(e0=v.browser?new I1:null),v.filter=!!e0,e0!=null&&e0.add?(e0.reset(),t.filter.brightness!==0&&e0.add("brightness",t.filter.brightness),t.filter.contrast!==0&&e0.add("contrast",t.filter.contrast),t.filter.sharpness!==0&&e0.add("sharpen",t.filter.sharpness),t.filter.blur!==0&&e0.add("blur",t.filter.blur),t.filter.saturation!==0&&e0.add("saturation",t.filter.saturation),t.filter.hue!==0&&e0.add("hue",t.filter.hue),t.filter.negative&&e0.add("negative"),t.filter.sepia&&e0.add("sepia"),t.filter.vintage&&e0.add("brownie"),t.filter.sepia&&e0.add("sepia"),t.filter.kodachrome&&e0.add("kodachrome"),t.filter.technicolor&&e0.add("technicolor"),t.filter.polaroid&&e0.add("polaroid"),t.filter.pixelate!==0&&e0.add("pixelate",t.filter.pixelate),((p=e0.get())==null?void 0:p.length)>1?R0=e0.apply(v0):R0=e0.draw(v0)):(t.debug&&u("input process error: cannot initialize filters"),v.webgl.supported=!1,t.filter.enabled=!1,H2(v0,R0))):(H2(v0,R0),e0&&(e0=null),v.filter=!!e0),!n)return{tensor:null,canvas:R0};if(!R0)throw new Error("canvas error: cannot create output");let l,c=3;if(typeof ImageData!="undefined"&&e instanceof ImageData||e.data&&e.width&&e.height)if(v.browser&&N.browser)l=N.browser?N.browser.fromPixels(e):null;else{c=e.data.length/e.height/e.width;let f=new Uint8Array(e.data.buffer);l=N.tensor(f,[e.height,e.width,c],"int32")}else if((!l2||R0.width!==l2.width||R0.height!==l2.height)&&(l2=ee(R0.width,R0.height)),N.browser&&v.browser)t.backend==="webgl"||t.backend==="humangl"||t.backend==="webgpu"?l=N.browser.fromPixels(R0):(l2=H2(R0),l=N.browser.fromPixels(l2));else{let M=H2(R0).getContext("2d").getImageData(0,0,s,A);c=M.data.length/s/A;let T=new Uint8Array(M.data.buffer);l=N.tensor(T,[s,A,c])}if(c===4){let f=N.slice3d(l,[0,0,0],[-1,-1,3]);N.dispose(l),l=f}if(!l)throw new Error("input error: cannot create tensor");let x=N.cast(l,"float32"),i=t.filter.equalization?await F2(x):N.expandDims(x,0);if(N.dispose([l,x]),t.filter.autoBrightness){let f=N.max(i),b=await f.data();t.filter.brightness=b[0]>1?1-b[0]/255:1-b[0],N.dispose(f)}return{tensor:i,canvas:t.filter.return?R0:null}}async function O1(e,t){let n=!1;if(e.cacheSensitivity===0||!t.shape||t.shape.length!==4||t.shape[1]>3840||t.shape[2]>2160)return n;if(!K0.inputTensor)K0.inputTensor=N.clone(t);else if(K0.inputTensor.shape[1]!==t.shape[1]||K0.inputTensor.shape[2]!==t.shape[2])N.dispose(K0.inputTensor),K0.inputTensor=N.clone(t);else{let o={};o.diff=N.sub(t,K0.inputTensor),o.squared=N.mul(o.diff,o.diff),o.sum=N.sum(o.squared);let s=(await o.sum.data())[0]/(t.shape[1]||1)/(t.shape[2]||1)/255/3;N.dispose([K0.inputTensor,o.diff,o.squared,o.sum]),K0.inputTensor=N.clone(t),n=s<=(e.cacheSensitivity||0)}return n}async function L1(e,t,n){let o={};if(!t||!n||t.shape.length!==4||t.shape.length!==n.shape.length)return e.debug||u("invalid input tensor or tensor shapes do not match:",t.shape,n.shape),0;if(t.shape[0]!==1||n.shape[0]!==1||t.shape[3]!==3||n.shape[3]!==3)return e.debug||u("input tensors must be of shape [1, height, width, 3]:",t.shape,n.shape),0;o.input1=N.clone(t),o.input2=t.shape[1]!==n.shape[1]||t.shape[2]!==n.shape[2]?N.image.resizeBilinear(n,[t.shape[1],t.shape[2]]):N.clone(n),o.diff=N.sub(o.input1,o.input2),o.squared=N.mul(o.diff,o.diff),o.sum=N.sum(o.squared);let s=(await o.sum.data())[0]/(t.shape[1]||1)/(t.shape[2]||1)/255/3;return N.dispose([o.input1,o.input2,o.diff,o.squared,o.sum]),s}var w2=class{constructor(){k(this,"browser");k(this,"node");k(this,"worker");k(this,"platform","");k(this,"agent","");k(this,"backends",[]);k(this,"initial");k(this,"filter");k(this,"tfjs");k(this,"offscreen");k(this,"perfadd",!1);k(this,"tensorflow",{version:void 0,gpu:void 0});k(this,"wasm",{supported:void 0,backend:void 0,simd:void 0,multithread:void 0});k(this,"webgl",{supported:void 0,backend:void 0,version:void 0,renderer:void 0,shader:void 0,vendor:void 0});k(this,"webgpu",{supported:void 0,backend:void 0,adapter:void 0});k(this,"cpu",{model:void 0,flags:[]});k(this,"kernels",[]);k(this,"Canvas");k(this,"Image");k(this,"ImageData");if(this.browser=typeof navigator!="undefined",this.node=typeof process!="undefined"&&typeof process.versions!="undefined"&&typeof process.versions.node!="undefined",this.tfjs={version:I0.version["tfjs-core"]},this.offscreen=typeof OffscreenCanvas!="undefined",this.initial=!0,this.worker=this.browser&&this.offscreen?typeof WorkerGlobalScope!="undefined":void 0,typeof navigator!="undefined"){let t=navigator.userAgent.match(/\(([^()]+)\)/g);if(t!=null&&t[0]){let n=t[0].match(/\(([^()]+)\)/g);this.platform=n!=null&&n[0]?n[0].replace(/\(|\)/g,""):"",this.agent=navigator.userAgent.replace(t[0],""),this.platform[1]&&(this.agent=this.agent.replace(t[1],"")),this.agent=this.agent.replace(/ /g," ")}}else typeof process!="undefined"&&(this.platform=`${process.platform} ${process.arch}`,this.agent=`NodeJS ${process.version}`)}async updateBackend(){this.backends=Object.keys(I0.engine().registryFactory);try{this.tensorflow={version:I0.backend().binding?I0.backend().binding.TF_Version:void 0,gpu:I0.backend().binding?I0.backend().binding.isUsingGpuDevice():void 0}}catch(o){}this.wasm.supported=typeof WebAssembly!="undefined",this.wasm.backend=this.backends.includes("wasm"),this.wasm.supported&&this.wasm.backend&&(this.wasm.simd=await I0.env().getAsync("WASM_HAS_SIMD_SUPPORT"),this.wasm.multithread=await I0.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT"));let t=ee(100,100),n=t?t.getContext("webgl2"):void 0;this.webgl.supported=typeof n!="undefined",this.webgl.backend=this.backends.includes("webgl"),this.webgl.supported&&this.webgl.backend&&n&&(this.webgl.version=n.getParameter(n.VERSION),this.webgl.vendor=n.getParameter(n.VENDOR),this.webgl.renderer=n.getParameter(n.RENDERER),this.webgl.shader=n.getParameter(n.SHADING_LANGUAGE_VERSION)),this.webgpu.supported=this.browser&&typeof navigator.gpu!="undefined",this.webgpu.backend=this.backends.includes("webgpu");try{if(this.webgpu.supported){let o=await navigator.gpu.requestAdapter();this.webgpu.adapter=await(o==null?void 0:o.requestAdapterInfo())}}catch(o){this.webgpu.supported=!1}try{this.kernels=I0.getKernelsForBackend(I0.getBackend()).map(o=>o.kernelName.toLowerCase())}catch(o){}}updateCPU(){let t={model:"",flags:[]};this.node&&this.platform.startsWith("linux"),this.cpu?this.cpu=t:Object.defineProperty(this,"cpu",{value:t})}},v=new w2;var Z2=class{constructor(){k(this,"config");k(this,"element");k(this,"stream");k(this,"devices",[]);k(this,"enumerate",async()=>{try{let t=await navigator.mediaDevices.enumerateDevices();this.devices=t.filter(n=>n.kind==="videoinput")}catch(t){this.devices=[]}return this.devices});k(this,"start",async t=>{if(t!=null&&t.debug&&(this.config.debug=t==null?void 0:t.debug),t!=null&&t.crop&&(this.config.crop=t==null?void 0:t.crop),t!=null&&t.mode&&(this.config.mode=t==null?void 0:t.mode),t!=null&&t.width&&(this.config.width=t==null?void 0:t.width),t!=null&&t.height&&(this.config.height=t==null?void 0:t.height),t!=null&&t.id&&(this.config.id=t==null?void 0:t.id),t!=null&&t.element)if(typeof t.element=="string"){let r=document.getElementById(t.element);if(r&&r instanceof HTMLVideoElement)this.element=r;else{this.config.debug&&u("webcam","cannot get dom element",t.element);return}}else if(t.element instanceof HTMLVideoElement)this.element=t.element;else{this.config.debug&&u("webcam","unknown dom element",t.element);return}else this.element=document.createElement("video");let n={audio:!1,video:{facingMode:this.config.mode==="front"?"user":"environment",resizeMode:this.config.crop?"crop-and-scale":"none",width:{ideal:this.config.width>0?this.config.width:window.innerWidth},height:{ideal:this.config.height>0?this.config.height:window.innerHeight}}};if(this.config.id&&(n.video.deviceId=this.config.id),this.element.addEventListener("play",()=>{this.config.debug&&u("webcam","play")}),this.element.addEventListener("pause",()=>{this.config.debug&&u("webcam","pause")}),this.element.addEventListener("click",async()=>{!this.element||!this.stream||(this.element.paused?await this.element.play():this.element.pause())}),!(navigator!=null&&navigator.mediaDevices)){this.config.debug&&u("webcam","no devices");return}try{this.stream=await navigator.mediaDevices.getUserMedia(n)}catch(r){u("webcam",r);return}if(!this.stream){this.config.debug&&u("webcam","no stream");return}this.element.srcObject=this.stream,await new Promise(r=>{this.element?this.element.onloadeddata=()=>r(!0):r(!1)}),await this.element.play(),this.config.debug&&u("webcam",{width:this.width,height:this.height,label:this.label,stream:this.stream,track:this.track,settings:this.settings,constraints:this.constraints,capabilities:this.capabilities})});k(this,"pause",()=>{this.element&&this.element.pause()});k(this,"play",async()=>{this.element&&await this.element.play()});k(this,"stop",()=>{this.config.debug&&u("webcam","stop"),this.track&&this.track.stop()});this.config={element:void 0,debug:!0,mode:"front",crop:!1,width:0,height:0}}get track(){if(!!this.stream)return this.stream.getVideoTracks()[0]}get capabilities(){if(!!this.track)return this.track.getCapabilities?this.track.getCapabilities():void 0}get constraints(){if(!!this.track)return this.track.getConstraints?this.track.getConstraints():void 0}get settings(){if(!this.stream)return;let t=this.stream.getVideoTracks()[0];return t.getSettings?t.getSettings():void 0}get label(){return this.track?this.track.label:""}get paused(){var t;return((t=this.element)==null?void 0:t.paused)||!1}get width(){var t;return((t=this.element)==null?void 0:t.videoWidth)||0}get height(){var t;return((t=this.element)==null?void 0:t.videoHeight)||0}};var c2=V(H());var Yt={};we(Yt,{age:()=>cr,"anti-spoofing":()=>Vr,antispoof:()=>_o,blazeface:()=>$o,"blazeface-back":()=>dr,"blazeface-front":()=>xr,"blazepose-detect":()=>Gr,"blazepose-detector2d":()=>yr,"blazepose-detector3d":()=>fr,"blazepose-full":()=>mr,"blazepose-heavy":()=>pr,"blazepose-lite":()=>ur,centernet:()=>er,default:()=>ns,efficientpose:()=>hr,"efficientpose-i-lite":()=>Zr,"efficientpose-ii-lite":()=>Xr,"efficientpose-iv":()=>qr,emotion:()=>tr,faceboxes:()=>br,facemesh:()=>nr,"facemesh-attention":()=>Tr,"facemesh-attention-alt":()=>gr,"facemesh-detection-full":()=>vr,"facemesh-detection-short":()=>Rr,"facemesh-orig":()=>Mr,faceres:()=>or,"faceres-deep":()=>Pr,gear:()=>kr,gender:()=>Er,"gender-ssrnet-imdb":()=>wr,handdetect:()=>zr,"handlandmark-full":()=>rr,"handlandmark-lite":()=>Sr,"handlandmark-sparse":()=>jr,handskeleton:()=>Nr,handtrack:()=>sr,"insightface-efficientnet-b0":()=>Ur,"insightface-ghostnet-strides1":()=>Yr,"insightface-ghostnet-strides2":()=>Kr,"insightface-mobilenet-emore":()=>Jr,"insightface-mobilenet-swish":()=>Qr,iris:()=>Ar,liveness:()=>ar,meet:()=>Ir,mobileface:()=>Or,mobilefacenet:()=>Lr,models:()=>ir,"movenet-lightning":()=>lr,"movenet-multipose":()=>Cr,"movenet-thunder":()=>Wr,nanodet:()=>Dr,"nanodet-e":()=>_r,"nanodet-g":()=>$r,"nanodet-m":()=>es,"nanodet-t":()=>ts,posenet:()=>Fr,rvm:()=>Br,selfie:()=>Hr});var _o=853098,$o=538928,er=4030290,tr=820516,nr=1477958,or=6978814,rr=5431368,sr=2964837,Ar=2599092,ar=592976,ir=0,lr=4650216,cr=161240,dr=538928,xr=402048,yr=7499400,fr=5928856,mr=6338290,pr=27501554,ur=2725490,hr=5651240,br=2013002,gr=2387598,Tr=2382414,vr=1026192,Rr=201268,Mr=2955780,Pr=13957620,kr=1498916,wr=161236,Er=201808,zr=3515612,Sr=2023432,jr=5286322,Nr=5502280,Ir=372228,Or=2183192,Lr=5171976,Cr=9448838,Wr=12477112,Dr=7574558,Fr=5032780,Br=3739355,Hr=212886,Gr=5928804,Vr=853098,Zr=2269064,Xr=5651240,qr=25643252,Ur=13013224,Yr=8093408,Kr=8049584,Jr=6938536,Qr=12168584,_r=12319156,$r=7574558,es=1887474,ts=5294216,ns={antispoof:_o,blazeface:$o,centernet:er,emotion:tr,facemesh:nr,faceres:or,"handlandmark-full":rr,handtrack:sr,iris:Ar,liveness:ar,models:ir,"movenet-lightning":lr,age:cr,"blazeface-back":dr,"blazeface-front":xr,"blazepose-detector2d":yr,"blazepose-detector3d":fr,"blazepose-full":mr,"blazepose-heavy":pr,"blazepose-lite":ur,efficientpose:hr,faceboxes:br,"facemesh-attention-alt":gr,"facemesh-attention":Tr,"facemesh-detection-full":vr,"facemesh-detection-short":Rr,"facemesh-orig":Mr,"faceres-deep":Pr,gear:kr,"gender-ssrnet-imdb":wr,gender:Er,handdetect:zr,"handlandmark-lite":Sr,"handlandmark-sparse":jr,handskeleton:Nr,meet:Ir,mobileface:Or,mobilefacenet:Lr,"movenet-multipose":Cr,"movenet-thunder":Wr,nanodet:Dr,posenet:Fr,rvm:Br,selfie:Hr,"blazepose-detect":Gr,"anti-spoofing":Vr,"efficientpose-i-lite":Zr,"efficientpose-ii-lite":Xr,"efficientpose-iv":qr,"insightface-efficientnet-b0":Ur,"insightface-ghostnet-strides1":Yr,"insightface-ghostnet-strides2":Kr,"insightface-mobilenet-emore":Jr,"insightface-mobilenet-swish":Qr,"nanodet-e":_r,"nanodet-g":$r,"nanodet-m":es,"nanodet-t":ts};var O0={cacheModels:!0,cacheSupported:!0,verbose:!0,debug:!1,modelBasePath:""},E0={};async function os(e,t){return O0.debug&&u("load model fetch:",e,t),fetch(e,t)}function C1(e){O0.cacheModels=e.cacheModels,O0.verbose=e.debug,O0.modelBasePath=e.modelBasePath}async function O(e){var c,x,i,y;let t=k1(O0.modelBasePath,e||"");t.toLowerCase().endsWith(".json")||(t+=".json");let n=t.includes("/")?t.split("/"):t.split("\\"),o=n[n.length-1].replace(".json",""),r="indexeddb://"+o;E0[o]={name:o,sizeFromManifest:0,sizeLoadedWeights:0,sizeDesired:Yt[o],inCache:!1,url:""},O0.cacheSupported=typeof indexedDB!="undefined";let s={};try{s=O0.cacheSupported&&O0.cacheModels?await c2.io.listModels():{}}catch(d){O0.cacheSupported=!1}E0[o].inCache=O0.cacheSupported&&O0.cacheModels&&Object.keys(s).includes(r),E0[o].url=E0[o].inCache?r:t;let A=typeof fetch=="undefined"?{}:{fetchFunc:(d,p)=>os(d,p)},a=new c2.GraphModel(E0[o].url,A),l=!1;try{a.findIOHandler(),O0.debug&&u("model load handler:",a.handler)}catch(d){u("error finding model i/o handler:",t,d)}try{let d=await((c=a.handler)==null?void 0:c.load())||null;E0[o].sizeFromManifest=((x=d==null?void 0:d.weightData)==null?void 0:x.byteLength)||0,d?a.loadSync(d):a=await c2.loadGraphModel(E0[o].inCache?r:t,A),E0[o].sizeLoadedWeights=((y=(i=a.artifacts)==null?void 0:i.weightData)==null?void 0:y.byteLength)||0,O0.verbose&&u("load:",{model:o,url:a.modelUrl,bytes:E0[o].sizeLoadedWeights}),l=!0}catch(d){u("error loading model:",t,d)}if(l&&O0.cacheModels&&O0.cacheSupported&&!E0[o].inCache)try{let d=await a.save(r);O0.debug&&u("model saved:",r,d)}catch(d){u("error saving model:",t,d)}return a}var Kt="3.0.0";var E=V(H());var m0=V(H());var n0={name:"humangl",priority:999,canvas:null,gl:null,extensions:[],webGLattr:{alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!1,desynchronized:!0}};function As(){let e=n0.gl;!e||(n0.extensions=e.getSupportedExtensions())}function W1(e){var t;if(e.config.backend==="humangl"&&(n0.name in m0.engine().registry&&!((t=n0==null?void 0:n0.gl)!=null&&t.getParameter(n0.gl.VERSION))&&(u("humangl error: backend invalid context"),e.models.reset()),!m0.findBackend(n0.name))){try{n0.canvas=ee(100,100)}catch(r){u("humangl error: cannot create canvas:",r);return}try{if(n0.gl=n0.canvas.getContext("webgl2",n0.webGLattr),!n0.gl){u("humangl error: cannot get webgl context");return}if(!n0.gl.getParameter(n0.gl.VERSION).includes("2.0")){u("backend override: using fallback webgl backend as webgl 2.0 is not detected"),e.config.backend="webgl";return}n0.canvas&&(n0.canvas.addEventListener("webglcontextlost",s=>{throw u("humangl error:",s.type),u("possible browser memory leak using webgl or conflict with multiple backend registrations"),e.emit("error"),new Error("backend error: webgl context lost")}),n0.canvas.addEventListener("webglcontextrestored",s=>{u("humangl error: context restored:",s)}),n0.canvas.addEventListener("webglcontextcreationerror",s=>{u("humangl error: context create:",s)}))}catch(r){u("humangl error: cannot get webgl context:",r);return}try{m0.setWebGLContext(2,n0.gl)}catch(r){u("humangl error: cannot set webgl context:",r);return}try{let r=new m0.GPGPUContext(n0.gl);m0.registerBackend(n0.name,()=>new m0.MathBackendWebGL(r),n0.priority)}catch(r){u("humangl error: cannot register webgl backend:",r);return}try{m0.getKernelsForBackend("webgl").forEach(s=>{let A={...s,backendName:n0.name};m0.registerKernel(A)})}catch(r){u("humangl error: cannot update webgl backend registration:",r);return}try{m0.env().flagRegistry.WEBGL_VERSION&&m0.env().set("WEBGL_VERSION",2)}catch(r){u("humangl error: cannot set WebGL backend flags:",r);return}As();let n=m0.backend(),o=typeof n.gpgpu!="undefined"?n.getGPGPUContext().gl:null;o?e.config.debug&&u("humangl backend registered:",{webgl:o.getParameter(o.VERSION),renderer:o.getParameter(o.RENDERER)}):u("humangl error: no current gl context:",o,n0.gl)}}var Ee=V(H()),C={tf255:255,tf1:1,tf2:2,tf05:.5,tf127:127.5,rgb:[.2989,.587,.114]};function D1(){C.tf255=Ee.scalar(255,"float32"),C.tf1=Ee.scalar(1,"float32"),C.tf2=Ee.scalar(2,"float32"),C.tf05=Ee.scalar(.5,"float32"),C.tf127=Ee.scalar(127.5,"float32"),C.rgb=Ee.tensor1d([.2989,.587,.114],"float32")}async function ls(){return await v.updateBackend(),v.browser?v.webgpu.supported&&v.webgpu.backend?"webgpu":v.webgl.supported&&v.webgl.backend?"webgl":v.wasm.supported&&v.wasm.backend?"wasm":"cpu":"tensorflow"}function cs(e){let t=[];if(!v.kernels.includes("mod")){let n={kernelName:"Mod",backendName:E.getBackend(),kernelFunc:o=>E.tidy(()=>E.sub(o.inputs.a,E.mul(E.div(o.inputs.a,o.inputs.b),o.inputs.b)))};E.registerKernel(n),v.kernels.push("mod"),t.push("mod")}if(!v.kernels.includes("floormod")){let n={kernelName:"FloorMod",backendName:E.getBackend(),kernelFunc:o=>E.tidy(()=>E.add(E.mul(E.floorDiv(o.inputs.a,o.inputs.b),o.inputs.b),E.mod(o.inputs.a,o.inputs.b)))};E.registerKernel(n),v.kernels.push("floormod"),t.push("floormod")}if(!v.kernels.includes("rotatewithoffset")&&e.softwareKernels){let n={kernelName:"RotateWithOffset",backendName:E.getBackend(),kernelFunc:o=>E.tidy(()=>{let r=E.getBackend();E.setBackend("cpu");let s=E.image.rotateWithOffset(o.inputs.image,o.attrs.radians,o.attrs.fillValue,o.attrs.center);return E.setBackend(r),s})};E.registerKernel(n),v.kernels.push("rotatewithoffset"),t.push("rotatewithoffset")}t.length>0&&e.debug&&u("registered kernels:",t)}var F1={};async function E2(e,t=!1){var n;if(e.state="backend",((n=e.config.backend)==null?void 0:n.length)===0&&(e.config.backend=await ls()),t||v.initial||e.config.backend&&e.config.backend.length>0&&E.getBackend()!==e.config.backend){let o=g();if(e.config.backend&&e.config.backend.length>0){if(typeof window=="undefined"&&typeof WorkerGlobalScope!="undefined"&&e.config.debug&&e.config.debug&&u("running inside web worker"),v.browser&&e.config.backend==="tensorflow"&&(e.config.debug&&u("override: backend set to tensorflow while running in browser"),e.config.backend="webgl"),v.node&&(e.config.backend==="webgl"||e.config.backend==="humangl")&&(e.config.debug&&u(`override: backend set to ${e.config.backend} while running in nodejs`),e.config.backend="tensorflow"),v.browser&&e.config.backend==="webgpu")if(typeof navigator=="undefined"||typeof navigator.gpu=="undefined")u("override: backend set to webgpu but browser does not support webgpu"),e.config.backend="webgl";else{let s=await navigator.gpu.requestAdapter();if(e.config.debug&&u("enumerated webgpu adapter:",s),!s)u("override: backend set to webgpu but browser reports no available gpu"),e.config.backend="webgl";else{let A="requestAdapterInfo"in s?await s.requestAdapterInfo():void 0;u("webgpu adapter info:",A)}}let r=Object.keys(E.engine().registryFactory);if(e.config.backend==="humangl"&&!r.includes("humangl")&&(W1(e),r=Object.keys(E.engine().registryFactory)),e.config.debug&&u("available backends:",r),r.includes(e.config.backend)||(u(`error: backend ${e.config.backend} not found in registry`),e.config.backend=v.node?"tensorflow":"webgl",e.config.debug&&u(`override: setting backend ${e.config.backend}`)),e.config.debug&&u("setting backend:",[e.config.backend]),e.config.backend==="wasm"){if(E.env().flagRegistry.CANVAS2D_WILL_READ_FREQUENTLY&&E.env().set("CANVAS2D_WILL_READ_FREQUENTLY",!0),e.config.debug&&u("wasm path:",e.config.wasmPath),typeof E.setWasmPaths!="undefined")E.setWasmPaths(e.config.wasmPath,e.config.wasmPlatformFetch);else throw new Error("backend error: attempting to use wasm backend but wasm path is not set");let s=!1,A=!1;try{s=await E.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT"),A=await E.env().getAsync("WASM_HAS_SIMD_SUPPORT"),e.config.debug&&u(`wasm execution: ${A?"simd":"no simd"} ${s?"multithreaded":"singlethreaded"}`),e.config.debug&&!A&&u("warning: wasm simd support is not enabled")}catch(a){u("wasm detection failed")}}try{await E.setBackend(e.config.backend),await E.ready()}catch(s){return u("error: cannot set backend:",e.config.backend,s),!1}e.config.debug&&(F1=JSON.parse(JSON.stringify(E.env().flags)))}if((E.getBackend()==="humangl"||E.getBackend()==="webgl")&&(E.env().flagRegistry.WEBGL_USE_SHAPES_UNIFORMS&&E.env().set("WEBGL_USE_SHAPES_UNIFORMS",!0),E.env().flagRegistry.WEBGL_EXP_CONV&&E.env().set("WEBGL_EXP_CONV",!0),e.config.debug&&typeof e.config.deallocate!="undefined"&&e.config.deallocate&&(u("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",!0),E.env().set("WEBGL_DELETE_TEXTURE_THRESHOLD",0))),E.getBackend(),e.config.debug){let r=E.env().flags,s={};for(let A of Object.keys(r))F1[A]!==r[A]&&(s[A]=r[A]);e.config.debug&&Object.keys(s).length>0&&u("backend:",E.getBackend(),"flags:",s)}if(e.config.flags&&Object.keys(e.config.flags).length>0){e.config.debug&&u("flags:",e.config.flags);for(let[r,s]of Object.entries(e.config.flags))E.env().set(r,s)}E.enableProdMode(),D1(),e.performance.initBackend=Math.trunc(g()-o),e.config.backend=E.getBackend(),await v.updateBackend(),cs(e.config),v.initial=!1}return!0}function X2(e,t){for(let n of e){let o={kernelName:n,backendName:t.backend,kernelFunc:r=>{var s;return t.debug&&u("kernelFunc",n,t.backend,r),(s=r==null?void 0:r.inputs)==null?void 0:s.info}};E.registerKernel(o)}v.kernels=E.getKernelsForBackend(E.getBackend()).map(n=>n.kernelName.toLowerCase())}var Q2={};we(Q2,{all:()=>Hs,body:()=>U2,canvas:()=>Bs,face:()=>q2,gesture:()=>J2,hand:()=>Y2,init:()=>n5,object:()=>K2,options:()=>d0,person:()=>Fs});var J0=e=>{if(!e)u("draw error: invalid canvas");else if(!e.getContext)u("draw error: canvas context not defined");else{let t=e.getContext("2d");if(!t)u("draw error: cannot get canvas context");else return t}return null},Ue=e=>Math.round(e*180/Math.PI),_=(e,t,n)=>e.replace(t,typeof n=="number"?n.toFixed(1):n),Ye=(e,t)=>{if(!t.useDepth||typeof e=="undefined")return t.color;let n=Uint8ClampedArray.from([127+2*e,127-2*e,255]);return`rgba(${n[0]}, ${n[1]}, ${n[2]}, ${t.alpha})`};function te(e,t,n,o,r){let s=t.replace(/\[.*\]/g,"").split(` +`).map(a=>a.trim()),A=Math.max(0,n);for(let a=s.length-1;a>=0;a--){let l=a*r.lineHeight+o;r.shadowColor&&r.shadowColor!==""&&(e.fillStyle=r.shadowColor,e.fillText(s[a],A+5,l+16)),e.fillStyle=r.labelColor,e.fillText(s[a],A+4,l+15)}}function be(e,t,n,o,r){e.fillStyle=Ye(o,r),e.beginPath(),e.arc(t,n,r.pointSize,0,2*Math.PI),e.fill()}function me(e,t,n,o,r,s){if(e.beginPath(),e.lineWidth=s.lineWidth,s.useCurves){let A=(t+t+o)/2,a=(n+n+r)/2;e.ellipse(A,a,o/2,r/2,0,0,2*Math.PI)}else e.moveTo(t+s.roundRect,n),e.lineTo(t+o-s.roundRect,n),e.quadraticCurveTo(t+o,n,t+o,n+s.roundRect),e.lineTo(t+o,n+r-s.roundRect),e.quadraticCurveTo(t+o,n+r,t+o-s.roundRect,n+r),e.lineTo(t+s.roundRect,n+r),e.quadraticCurveTo(t,n+r,t,n+r-s.roundRect),e.lineTo(t,n+s.roundRect),e.quadraticCurveTo(t,n,t+s.roundRect,n),e.closePath();e.stroke()}function Jt(e,t,n){if(!(t.length<2)){e.beginPath(),e.moveTo(t[0][0],t[0][1]);for(let o of t)e.strokeStyle=Ye(o[2]||0,n),e.lineTo(Math.trunc(o[0]),Math.trunc(o[1]));e.stroke(),n.fillPolygons&&(e.closePath(),e.fill())}}function H1(e,t,n){if(!(t.length<2)){if(e.lineWidth=n.lineWidth,!n.useCurves||t.length<=2){Jt(e,t,n);return}e.moveTo(t[0][0],t[0][1]);for(let o=0;oz2[e]),L4=xs.map(e=>z2[e]),C4=ys.map(e=>z2[e]);function ze(e){let t=e.map(n=>n[0]);return t.push(e[e.length-1][1]),t}var fs=[[61,146],[146,91],[91,181],[181,84],[84,17],[17,314],[314,405],[405,321],[321,375],[375,291],[61,185],[185,40],[40,39],[39,37],[37,0],[0,267],[267,269],[269,270],[270,409],[409,291],[78,95],[95,88],[88,178],[178,87],[87,14],[14,317],[317,402],[402,318],[318,324],[324,308],[78,191],[191,80],[80,81],[81,82],[82,13],[13,312],[312,311],[311,310],[310,415],[415,308]],ms=[[263,249],[249,390],[390,373],[373,374],[374,380],[380,381],[381,382],[382,362],[263,466],[466,388],[388,387],[387,386],[386,385],[385,384],[384,398],[398,362]],ps=[[276,283],[283,282],[282,295],[295,285],[300,293],[293,334],[334,296],[296,336]],us=[[474,475],[475,476],[476,477],[477,474]],hs=[[33,7],[7,163],[163,144],[144,145],[145,153],[153,154],[154,155],[155,133],[33,246],[246,161],[161,160],[160,159],[159,158],[158,157],[157,173],[173,133]],bs=[[46,53],[53,52],[52,65],[65,55],[70,63],[63,105],[105,66],[66,107]],gs=[[469,470],[470,471],[471,472],[472,469]],Ts=[[10,338],[338,297],[297,332],[332,284],[284,251],[251,389],[389,356],[356,454],[454,323],[323,361],[361,288],[288,397],[397,365],[365,379],[379,378],[378,400],[400,377],[377,152],[152,148],[148,176],[176,149],[149,150],[150,136],[136,172],[172,58],[58,132],[132,93],[93,234],[234,127],[127,162],[162,21],[21,54],[54,103],[103,67],[67,109],[109,10]],W4={lips:ze(fs),leftEye:ze(ms),leftEyebrow:ze(ps),leftIris:ze(us),rightEye:ze(hs),rightEyebrow:ze(bs),rightIris:ze(gs),faceOval:ze(Ts)};var vs=[[61,146],[146,91],[91,181],[181,84],[84,17],[17,314],[314,405],[405,321],[321,375],[375,291],[61,185],[185,40],[40,39],[39,37],[37,0],[0,267],[267,269],[269,270],[270,409],[409,291],[78,95],[95,88],[88,178],[178,87],[87,14],[14,317],[317,402],[402,318],[318,324],[324,308],[78,191],[191,80],[80,81],[81,82],[82,13],[13,312],[312,311],[311,310],[310,415],[415,308]],Rs=[[263,249],[249,390],[390,373],[373,374],[374,380],[380,381],[381,382],[382,362],[263,466],[466,388],[388,387],[387,386],[386,385],[385,384],[384,398],[398,362]],Ms=[[276,283],[283,282],[282,295],[295,285],[300,293],[293,334],[334,296],[296,336]],Ps=[[474,475],[475,476],[476,477],[477,474]],ks=[[33,7],[7,163],[163,144],[144,145],[145,153],[153,154],[154,155],[155,133],[33,246],[246,161],[161,160],[160,159],[159,158],[158,157],[157,173],[173,133]],ws=[[46,53],[53,52],[52,65],[65,55],[70,63],[63,105],[105,66],[66,107]],Es=[[469,470],[470,471],[471,472],[472,469]],zs=[[10,338],[338,297],[297,332],[332,284],[284,251],[251,389],[389,356],[356,454],[454,323],[323,361],[361,288],[288,397],[397,365],[365,379],[379,378],[378,400],[400,377],[377,152],[152,148],[148,176],[176,149],[149,150],[150,136],[136,172],[172,58],[58,132],[132,93],[93,234],[234,127],[127,162],[162,21],[21,54],[54,103],[103,67],[67,109],[109,10]];function Se(e){let t=e.map(n=>n[0]);return t.push(e[e.length-1][1]),t}var Ss={lips:Se(vs),leftEye:Se(Rs),leftEyebrow:Se(Ms),leftIris:Se(Ps),rightEye:Se(ks),rightEyebrow:Se(ws),rightIris:Se(Es),faceOval:Se(zs)},js=Object.entries(Ss).map(([e,t])=>t.map(n=>[n,e])).flat(),D4=new Map(js),S2=[61,146,91,181,84,17,314,405,321,375,291,185,40,39,37,0,267,269,270,409,78,95,88,178,87,14,317,402,318,324,308,191,80,81,82,13,312,311,310,415,76,77,90,180,85,16,315,404,320,307,306,184,74,73,72,11,302,303,304,408,62,96,89,179,86,15,316,403,319,325,292,183,42,41,38,12,268,271,272,407],Qe=[33,7,163,144,145,153,154,155,133,246,161,160,159,158,157,173,130,25,110,24,23,22,26,112,243,247,30,29,27,28,56,190,226,31,228,229,230,231,232,233,244,113,225,224,223,222,221,189,35,124,46,53,52,65,143,111,117,118,119,120,121,128,245,156,70,63,105,66,107,55,193],_e=[263,249,390,373,374,380,381,382,362,466,388,387,386,385,384,398,359,255,339,254,253,252,256,341,463,467,260,259,257,258,286,414,446,261,448,449,450,451,452,453,464,342,445,444,443,442,441,413,265,353,276,283,282,295,372,340,346,347,348,349,350,357,465,383,300,293,334,296,336,285,417];var K;function Ns(e,t){var o,r,s,A,a,l,c,x,i;if(!K.drawLabels||((o=K.faceLabels)==null?void 0:o.length)===0)return;let n=K.faceLabels.slice();if(e.score&&(n=_(n,"[score]",100*e.score)),e.gender&&(n=_(n,"[gender]",e.gender)),e.genderScore&&(n=_(n,"[genderScore]",100*e.genderScore)),e.age&&(n=_(n,"[age]",e.age)),e.distance&&(n=_(n,"[distance]",100*e.distance)),e.real&&(n=_(n,"[real]",100*e.real)),e.live&&(n=_(n,"[live]",100*e.live)),e.emotion&&e.emotion.length>0){let y=e.emotion.map(d=>`${Math.trunc(100*d.score)}% ${d.emotion}`);y.length>3&&(y.length=3),n=_(n,"[emotions]",y.join(" "))}(s=(r=e.rotation)==null?void 0:r.angle)!=null&&s.roll&&(n=_(n,"[roll]",Ue(e.rotation.angle.roll))),(a=(A=e.rotation)==null?void 0:A.angle)!=null&&a.yaw&&(n=_(n,"[yaw]",Ue(e.rotation.angle.yaw))),(c=(l=e.rotation)==null?void 0:l.angle)!=null&&c.pitch&&(n=_(n,"[pitch]",Ue(e.rotation.angle.pitch))),(i=(x=e.rotation)==null?void 0:x.gaze)!=null&&i.bearing&&(n=_(n,"[gaze]",Ue(e.rotation.gaze.bearing))),te(t,n,e.box[0],e.box[1],K)}function Is(e,t){var n,o,r,s;if(((n=e.annotations)==null?void 0:n.leftEyeIris)&&((o=e.annotations)==null?void 0:o.leftEyeIris[0])){t.strokeStyle=K.useDepth?"rgba(255, 200, 255, 0.3)":K.color,t.beginPath();let A=Math.abs(e.annotations.leftEyeIris[3][0]-e.annotations.leftEyeIris[1][0])/2,a=Math.abs(e.annotations.leftEyeIris[4][1]-e.annotations.leftEyeIris[2][1])/2;t.ellipse(e.annotations.leftEyeIris[0][0],e.annotations.leftEyeIris[0][1],A,a,0,0,2*Math.PI),t.stroke(),K.fillPolygons&&(t.fillStyle=K.useDepth?"rgba(255, 255, 200, 0.3)":K.color,t.fill())}if(((r=e.annotations)==null?void 0:r.rightEyeIris)&&((s=e.annotations)==null?void 0:s.rightEyeIris[0])){t.strokeStyle=K.useDepth?"rgba(255, 200, 255, 0.3)":K.color,t.beginPath();let A=Math.abs(e.annotations.rightEyeIris[3][0]-e.annotations.rightEyeIris[1][0])/2,a=Math.abs(e.annotations.rightEyeIris[4][1]-e.annotations.rightEyeIris[2][1])/2;t.ellipse(e.annotations.rightEyeIris[0][0],e.annotations.rightEyeIris[0][1],A,a,0,0,2*Math.PI),t.stroke(),K.fillPolygons&&(t.fillStyle=K.useDepth?"rgba(255, 255, 200, 0.3)":K.color,t.fill())}}function Os(e,t){var n;if(K.drawGaze&&((n=e.rotation)==null?void 0:n.angle)&&typeof Path2D!="undefined"){t.strokeStyle="pink";let o=e.box[0]+e.box[2]/2-e.box[3]*Ue(e.rotation.angle.yaw)/90,r=e.box[1]+e.box[3]/2+e.box[2]*Ue(e.rotation.angle.pitch)/90,s=new Path2D(` + M ${e.box[0]+e.box[2]/2} ${e.box[1]} + C + ${o} ${e.box[1]}, + ${o} ${e.box[1]+e.box[3]}, + ${e.box[0]+e.box[2]/2} ${e.box[1]+e.box[3]} + `),A=new Path2D(` + M ${e.box[0]} ${e.box[1]+e.box[3]/2} + C + ${e.box[0]} ${r}, + ${e.box[0]+e.box[2]} ${r}, + ${e.box[0]+e.box[2]} ${e.box[1]+e.box[3]/2} + `);t.stroke(A),t.stroke(s)}}function Ls(e,t){var n;if(K.drawGaze&&((n=e.rotation)==null?void 0:n.gaze.strength)&&e.rotation.gaze.bearing&&e.annotations.leftEyeIris&&e.annotations.rightEyeIris&&e.annotations.leftEyeIris[0]&&e.annotations.rightEyeIris[0]){t.strokeStyle="pink",t.fillStyle="pink";let o=[e.annotations.leftEyeIris[0][0]+Math.sin(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[3],e.annotations.leftEyeIris[0][1]+Math.cos(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[2]];Qt(t,[e.annotations.leftEyeIris[0][0],e.annotations.leftEyeIris[0][1]],[o[0],o[1]],4);let r=[e.annotations.rightEyeIris[0][0]+Math.sin(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[3],e.annotations.rightEyeIris[0][1]+Math.cos(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[2]];Qt(t,[e.annotations.rightEyeIris[0][0],e.annotations.rightEyeIris[0][1]],[r[0],r[1]],4)}}function Cs(e,t){if(K.drawPolygons&&e.mesh.length>=468){t.lineWidth=1;for(let n=0;ne.mesh[r]);Jt(t,o,K)}Is(e,t)}}function Ws(e,t){if(K.drawPoints&&e.mesh.length>=468)for(let n=0;n0&&(Ws(r,o),Cs(r,o),Os(r,o),Ls(r,o))}}function U2(e,t,n){var s,A;let o=A0(d0,n);if(!t||!e)return;let r=J0(e);if(!!r){r.lineJoin="round";for(let a=0;a0)){let l=o.bodyLabels.slice();l=_(l,"[score]",100*t[a].score),te(r,l,t[a].box[0],t[a].box[1],o)}if(o.drawPoints&&t[a].keypoints)for(let l=0;l0&&t[a].keypoints){r.font=o.font;for(let l of t[a].keypoints){if(!l.score||l.score===0)continue;let c=o.bodyPartLabels.slice();c=_(c,"[label]",l.part),c=_(c,"[score]",100*l.score),te(r,c,l.position[0],l.position[1],o)}}if(o.drawPolygons&&t[a].keypoints&&t[a].annotations)for(let l of Object.values(t[a].annotations))for(let c of l)H1(r,c,o)}}}function Y2(e,t,n){var s,A;let o=A0(d0,n);if(!t||!e)return;let r=J0(e);if(!!r){r.lineJoin="round",r.font=o.font;for(let a of t){if(o.drawBoxes){if(r.strokeStyle=o.color,r.fillStyle=o.color,me(r,a.box[0],a.box[1],a.box[2],a.box[3],o),o.drawLabels&&((s=o.handLabels)==null?void 0:s.length)>0){let l=o.handLabels.slice();l=_(l,"[label]",a.label),l=_(l,"[score]",100*a.score),te(r,l,a.box[0],a.box[1],o)}r.stroke()}if(o.drawPoints&&a.keypoints&&a.keypoints.length>0)for(let l of a.keypoints)r.fillStyle=Ye(l[2],o),be(r,l[0],l[1],0,o);if(o.drawLabels&&a.annotations&&((A=o.fingerLabels)==null?void 0:A.length)>0)for(let[l,c]of Object.entries(a.annotations)){let x=o.fingerLabels.slice();x=_(x,"[label]",l),te(r,x,c[c.length-1][0],c[c.length-1][1],o)}if(o.drawPolygons&&a.annotations){let l=c=>{if(!(!c||c.length===0||!c[0]))for(let x=0;x0?x-1:0][0],c[x>0?x-1:0][1]),r.lineTo(c[x][0],c[x][1]),r.stroke()}};r.lineWidth=o.lineWidth,l(a.annotations.index),l(a.annotations.middle),l(a.annotations.ring),l(a.annotations.pinky),l(a.annotations.thumb)}}}}function K2(e,t,n){var s;let o=A0(d0,n);if(!t||!e)return;let r=J0(e);if(!!r){r.lineJoin="round",r.font=o.font;for(let A of t)if(o.drawBoxes){if(r.strokeStyle=o.color,r.fillStyle=o.color,me(r,A.box[0],A.box[1],A.box[2],A.box[3],o),o.drawLabels&&((s=o.objectLabels)==null?void 0:s.length)>0){let a=o.objectLabels.slice();a=_(a,"[label]",A.label),a=_(a,"[score]",100*A.score),te(r,a,A.box[0],A.box[1],o)}r.stroke()}}}function J2(e,t,n){var r;let o=A0(d0,n);if(!(!t||!e)&&o.drawGestures&&((r=o.gestureLabels)==null?void 0:r.length)>0){let s=J0(e);if(!s)return;s.font=o.font,s.fillStyle=o.color;let A=1;for(let a=0;a1&&c[1].length>0){let x=l[1]>0?`#${l[1]}`:"",i=o.gestureLabels.slice();i=_(i,"[where]",l[0]),i=_(i,"[who]",x),i=_(i,"[what]",c[1]),te(s,i,8,2+A*o.lineHeight,o),A+=1}}}}var je={face:`face + confidence: [score]% + [gender] [genderScore]% + age: [age] years + distance: [distance]cm + real: [real]% + live: [live]% + [emotions] + roll: [roll]\xB0 yaw:[yaw]\xB0 pitch:[pitch]\xB0 + gaze: [gaze]\xB0`,body:"body [score]%",bodyPart:"[label] [score]%",object:"[label] [score]%",hand:"[label] [score]%",finger:"[label]",gesture:"[where] [who]: [what]"};var t5=0;function Fs(e,t,n){let o=A0(d0,n);if(!t||!e)return;let r=J0(e);if(!!r){r.lineJoin="round",r.font=o.font;for(let s=0;sr5,kpt:()=>o5});var o5=["nose","leftEyeInside","leftEye","leftEyeOutside","rightEyeInside","rightEye","rightEyeOutside","leftEar","rightEar","leftMouth","rightMouth","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftPinky","rightPinky","leftIndex","rightIndex","leftThumb","rightThumb","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle","leftHeel","rightHeel","leftFoot","rightFoot","bodyCenter","bodyTop","leftPalm","leftHand","rightPalm","rightHand"],r5={shoulders:["leftShoulder","rightShoulder"],hips:["rightHip","leftHip"],mouth:["leftMouth","rightMouth"],leftLegUpper:["leftHip","leftKnee"],leftLegLower:["leftKnee","leftAnkle"],leftFoot:["leftAnkle","leftHeel","leftFoot"],leftTorso:["leftShoulder","leftHip"],leftArmUpper:["leftShoulder","leftElbow"],leftArmLower:["leftElbow","leftWrist"],leftHand:["leftWrist","leftPalm"],leftHandPinky:["leftPalm","leftPinky"],leftHandIndex:["leftPalm","leftIndex"],leftHandThumb:["leftPalm","leftThumb"],leftEyeOutline:["leftEyeInside","leftEyeOutside"],rightLegUpper:["rightHip","rightKnee"],rightLegLower:["rightKnee","rightAnkle"],rightFoot:["rightAnkle","rightHeel","rightFoot"],rightTorso:["rightShoulder","rightHip"],rightArmUpper:["rightShoulder","rightElbow"],rightArmLower:["rightElbow","rightWrist"],rightHand:["rightWrist","rightPalm"],rightHandPinky:["rightPalm","rightPinky"],rightHandIndex:["rightPalm","rightIndex"],rightHandThumb:["rightPalm","rightThumb"],rightEyeOutline:["rightEyeInside","rightEyeOutside"]};var D=V(H());var Q0,$e=224,Z1,Gs=5,$2=[8,16,32,32,32];function Vs(){let e=[],t=0;for(;tn.x)),y:D.tensor1d(e.map(n=>n.y))}}async function X1(e){if(v.initial&&(Q0=null),!Q0&&e.body.detector&&e.body.detector.modelPath){Q0=await O(e.body.detector.modelPath);let t=Q0!=null&&Q0.executor?Object.values(Q0.modelSignature.inputs):void 0;$e=Array.isArray(t)?parseInt(t[0].tensorShape.dim[1].size):0}else e.debug&&Q0&&u("cached model:",Q0.modelUrl);return Vs(),Q0}var V1=[5,5];function Zs(e,t){return D.tidy(()=>{let n=D.split(e,12,1),o=D.squeeze(n[0]),r=D.squeeze(n[1]),s=D.squeeze(n[2]),A=D.squeeze(n[3]);o=D.add(D.div(o,$e),t.x),r=D.add(D.div(r,$e),t.y),s=D.mul(D.div(s,$e),V1[0]),A=D.mul(D.div(A,$e),V1[1]);let a=D.sub(o,D.div(s,2)),l=D.sub(r,D.div(A,2)),c=D.add(a,s),x=D.add(l,A);return D.stack([a,l,c,x],1)})}async function Xs(e,t,n,o){var c,x;let r=[],s={};s.boxes=Zs(e,Z1),s.scores=D.sigmoid(t),s.nms=await D.image.nonMaxSuppressionAsync(s.boxes,s.scores,1,((c=n.body.detector)==null?void 0:c.minConfidence)||.1,((x=n.body.detector)==null?void 0:x.iouThreshold)||.1);let A=await s.nms.data(),a=await s.scores.data(),l=await s.boxes.array();for(let i of Array.from(A)){let y=a[i],d=l[i],p=[Math.round(d[0]*o[0]),Math.round(d[1]*o[1]),Math.round(d[2]*o[0]),Math.round(d[3]*o[1])],f={score:y,boxRaw:d,box:p};r.push(f)}return Object.keys(s).forEach(i=>D.dispose(s[i])),r}async function q1(e,t,n){let o={};o.res=Q0==null?void 0:Q0.execute(e,["Identity"]),o.logitsRaw=D.slice(o.res,[0,0,0],[1,-1,1]),o.boxesRaw=D.slice(o.res,[0,0,1],[1,-1,-1]),o.logits=D.squeeze(o.logitsRaw),o.boxes=D.squeeze(o.boxesRaw);let r=await Xs(o.boxes,o.logits,t,n);return Object.keys(o).forEach(s=>D.dispose(o[s])),r}function ge(e,t=[1,1]){let n=[e.map(a=>a[0]),e.map(a=>a[1])],o=[Math.min(...n[0]),Math.min(...n[1])],r=[Math.max(...n[0]),Math.max(...n[1])],s=[o[0],o[1],r[0]-o[0],r[1]-o[1]],A=[s[0]/t[0],s[1]/t[1],s[2]/t[0],s[3]/t[1]];return{box:s,boxRaw:A}}function U1(e,t=[1,1]){let n=[e.map(c=>c[0]),e.map(c=>c[1])],o=[Math.min(...n[0]),Math.min(...n[1])],r=[Math.max(...n[0]),Math.max(...n[1])],s=[(o[0]+r[0])/2,(o[1]+r[1])/2],A=Math.max(s[0]-o[0],s[1]-o[1],-s[0]+r[0],-s[1]+r[1]),a=[Math.trunc(s[0]-A),Math.trunc(s[1]-A),Math.trunc(2*A),Math.trunc(2*A)],l=[a[0]/t[0],a[1]/t[1],a[2]/t[0],a[3]/t[1]];return{box:a,boxRaw:l}}function et(e,t){let n=[e[2]*t,e[3]*t];return[e[0]-(n[0]-e[2])/2,e[1]-(n[1]-e[3])/2,n[0],n[1]]}var F0,A5=256,s5=Number.MAX_SAFE_INTEGER,qs={landmarks:["ld_3d","activation_segmentation","activation_heatmap","world_3d","output_poseflag"],detector:[]},nt=[],Ne=[[0,0],[0,0],[0,0],[0,0]],Y1=0,K1=e=>1-1/(1+Math.exp(e)),Q1=e=>X1(e);async function _1(e){if(v.initial&&(F0=null),F0)e.debug&&u("cached model:",F0.modelUrl);else{F0=await O(e.body.modelPath);let t=F0!=null&&F0.executor?Object.values(F0.modelSignature.inputs):void 0;A5=Array.isArray(t)?parseInt(t[0].tensorShape.dim[1].size):0}return F0}function J1(e,t,n){var s,A;let o={};if(!((s=e==null?void 0:e.shape)!=null&&s[1])||!((A=e==null?void 0:e.shape)!=null&&A[2]))return e;let r;if(n&&(o.cropped=B0.image.cropAndResize(e,[n],[0],[e.shape[1],e.shape[2]])),e.shape[1]!==e.shape[2]){let a=[e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0,e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0],l=[e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0,e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0];Ne=[[0,0],a,l,[0,0]],o.pad=B0.pad(o.cropped||e,Ne),o.resize=B0.image.resizeBilinear(o.pad,[t,t]),r=B0.div(o.resize,C.tf255)}else e.shape[1]!==t?(o.resize=B0.image.resizeBilinear(o.cropped||e,[t,t]),r=B0.div(o.resize,C.tf255)):r=B0.div(o.cropped||e,C.tf255);return Object.keys(o).forEach(a=>B0.dispose(o[a])),r}function Us(e,t,n){for(let o of e)o.position=[Math.trunc(o.position[0]*(t[0]+Ne[2][0]+Ne[2][1])/t[0]-Ne[2][0]),Math.trunc(o.position[1]*(t[1]+Ne[1][0]+Ne[1][1])/t[1]-Ne[1][0]),o.position[2]],o.positionRaw=[o.position[0]/t[0],o.position[1]/t[1],2*o.position[2]/(t[0]+t[1])];if(n){let o=n[2]-n[0],r=n[3]-n[1];for(let s of e)s.positionRaw=[s.positionRaw[0]/r+n[1],s.positionRaw[1]/o+n[0],s.positionRaw[2]],s.position=[Math.trunc(s.positionRaw[0]*t[0]),Math.trunc(s.positionRaw[1]*t[1]),s.positionRaw[2]]}return e}function Ys(e){let t=e.find(a=>a.part==="leftPalm"),n=e.find(a=>a.part==="leftWrist"),o=e.find(a=>a.part==="leftIndex");t.position[2]=((n.position[2]||0)+(o.position[2]||0))/2;let r=e.find(a=>a.part==="rightPalm"),s=e.find(a=>a.part==="rightWrist"),A=e.find(a=>a.part==="rightIndex");r.position[2]=((s.position[2]||0)+(A.position[2]||0))/2}async function Ks(e,t,n){if(!(F0!=null&&F0.executor))return null;let o={};[o.ld,o.segmentation,o.heatmap,o.world,o.poseflag]=F0==null?void 0:F0.execute(e,qs.landmarks);let r=(await o.poseflag.data())[0],s=await o.ld.data(),A=await o.world.data();Object.keys(o).forEach(p=>B0.dispose(o[p]));let a=[],l=5;for(let p=0;pp.position),i=ge(x,[n[0],n[1]]),y={};for(let[p,f]of Object.entries(r5)){let b=[];for(let M=0;Mh.part===f[M]),m=c.find(h=>h.part===f[M+1]);T&&m&&b.push([T.position,m.position])}y[p]=b}return{id:0,score:Math.trunc(100*r)/100,box:i.box,boxRaw:i.boxRaw,keypoints:c,annotations:y}}async function a5(e,t){var s,A,a;let n=[e.shape[2]||0,e.shape[1]||0],o=(t.body.skipTime||0)>g()-Y1,r=s5<(t.body.skipFrames||0);if(t.skipAllowed&&o&&r&&nt!==null)s5++;else{let l=[];if((A=(s=t.body)==null?void 0:s.detector)!=null&&A.enabled){let c=J1(e,224);l=await q1(c,t,n),B0.dispose(c)}else l=[{box:[0,0,0,0],boxRaw:[0,0,1,1],score:0}];for(let c=0;cL0.dispose(o[c])),r}async function c5(e,t){if(!(H0!=null&&H0.executor))return[];let n=(t.object.skipTime||0)>g()-e3,o=l5<(t.object.skipFrames||0);return t.skipAllowed&&n&&o&&i5.length>0?(l5++,i5):(l5=0,new Promise(async r=>{let s=[e.shape[2]||0,e.shape[1]||0],A=L0.image.resizeBilinear(e,[e2,e2]),a=t.object.enabled?H0==null?void 0:H0.execute(A,["tower_0/detections"]):null;e3=g(),L0.dispose(A);let l=await Js(a,s,t);i5=l,r(l)}))}var J=V(H());var ot={};we(ot,{connected:()=>x5,kpt:()=>d5});var d5=["head","neck","rightShoulder","rightElbow","rightWrist","chest","leftShoulder","leftElbow","leftWrist","bodyCenter","rightHip","rightKnee","rightAnkle","leftHip","leftKnee","leftAnkle"],x5={leftLeg:["leftHip","leftKnee","leftAnkle"],rightLeg:["rightHip","rightKnee","rightAnkle"],torso:["leftShoulder","rightShoulder","rightHip","leftHip","leftShoulder"],leftArm:["leftShoulder","leftElbow","leftWrist"],rightArm:["rightShoulder","rightElbow","rightWrist"],head:[]};var a0,o3=0,C0={id:0,keypoints:[],box:[0,0,0,0],boxRaw:[0,0,0,0],score:0,annotations:{}},y5=Number.MAX_SAFE_INTEGER;async function r3(e){return v.initial&&(a0=null),a0?e.debug&&u("cached model:",a0.modelUrl):a0=await O(e.body.modelPath),a0}async function Qs(e,t){let[n,o]=e.shape,r=J.reshape(e,[o*n]),s=J.max(r,0),A=(await s.data())[0];if(A>t){let a=J.argMax(r,0),l=J.mod(a,n),c=(await l.data())[0],x=J.div(a,n),i=(await x.data())[0];return J.dispose([r,s,a,l,x]),[c,i,A]}return J.dispose([r,s]),[0,0,A]}async function f5(e,t){if(!(a0!=null&&a0.executor)||!(a0!=null&&a0.inputs[0].shape))return[];let n=(t.body.skipTime||0)>g()-o3,o=y5<(t.body.skipFrames||0);return t.skipAllowed&&n&&o&&Object.keys(C0.keypoints).length>0?(y5++,[C0]):(y5=0,new Promise(async r=>{let s=J.tidy(()=>{var p,f;let i=J.image.resizeBilinear(e,[((p=a0==null?void 0:a0.inputs[0].shape)==null?void 0:p[2])||0,((f=a0==null?void 0:a0.inputs[0].shape)==null?void 0:f[1])||0],!1),y=J.mul(i,C.tf2);return J.sub(y,C.tf1)}),A;if(t.body.enabled&&(A=a0==null?void 0:a0.execute(s)),o3=g(),J.dispose(s),A){C0.keypoints.length=0;let i=J.squeeze(A);J.dispose(A);let y=J.unstack(i,2);J.dispose(i);for(let d=0;d(t.body.minConfidence||0)&&C0.keypoints.push({score:Math.round(100*b)/100,part:d5[d],positionRaw:[p/a0.inputs[0].shape[2],f/a0.inputs[0].shape[1]],position:[Math.round(e.shape[2]*p/a0.inputs[0].shape[2]),Math.round(e.shape[1]*f/a0.inputs[0].shape[1])]})}y.forEach(d=>J.dispose(d))}C0.score=C0.keypoints.reduce((i,y)=>y.score>i?y.score:i,0);let a=C0.keypoints.map(i=>i.position[0]),l=C0.keypoints.map(i=>i.position[1]);C0.box=[Math.min(...a),Math.min(...l),Math.max(...a)-Math.min(...a),Math.max(...l)-Math.min(...l)];let c=C0.keypoints.map(i=>i.positionRaw[0]),x=C0.keypoints.map(i=>i.positionRaw[1]);C0.boxRaw=[Math.min(...c),Math.min(...x),Math.max(...c)-Math.min(...c),Math.max(...x)-Math.min(...x)];for(let[i,y]of Object.entries(x5)){let d=[];for(let p=0;pM.part===y[p]),b=C0.keypoints.find(M=>M.part===y[p+1]);f&&b&&f.score>(t.body.minConfidence||0)&&b.score>(t.body.minConfidence||0)&&d.push([f.position,b.position])}C0.annotations[i]=d}r([C0])}))}var i0=V(H());var Le=V(H());var L=V(H());var Te=V(H());var x2=e=>[Math.abs(e.endPoint[0]-e.startPoint[0]),Math.abs(e.endPoint[1]-e.startPoint[1])],rt=e=>[e.startPoint[0]+(e.endPoint[0]-e.startPoint[0])/2,e.startPoint[1]+(e.endPoint[1]-e.startPoint[1])/2,1],st=(e,t)=>e?[Math.trunc(Math.max(0,e.startPoint[0])),Math.trunc(Math.max(0,e.startPoint[1])),Math.trunc(Math.min(t.shape[2]||0,e.endPoint[0])-Math.max(0,e.startPoint[0])),Math.trunc(Math.min(t.shape[1]||0,e.endPoint[1])-Math.max(0,e.startPoint[1]))]:[0,0,0,0],At=(e,t)=>e?[e.startPoint[0]/(t.shape[2]||0),e.startPoint[1]/(t.shape[1]||0),(e.endPoint[0]-e.startPoint[0])/(t.shape[2]||0),(e.endPoint[1]-e.startPoint[1])/(t.shape[1]||0)]:[0,0,0,0],i3=(e,t)=>{let n=[e.startPoint[0]*t[0],e.startPoint[1]*t[1]],o=[e.endPoint[0]*t[0],e.endPoint[1]*t[1]];return{startPoint:n,endPoint:o,landmarks:e.landmarks,confidence:e.confidence}},m5=(e,t,n)=>{let o=t.shape[1],r=t.shape[2],s=[e.startPoint[1]/o,e.startPoint[0]/r,e.endPoint[1]/o,e.endPoint[0]/r],A=Te.image.cropAndResize(t,[s],[0],n),a=Te.div(A,C.tf255);return Te.dispose(A),a},at=(e,t)=>{let n=rt(e),o=x2(e),r=[t*o[0]/2,t*o[1]/2];return{startPoint:[n[0]-r[0],n[1]-r[1]],endPoint:[n[0]+r[0],n[1]+r[1]],landmarks:e.landmarks,confidence:e.confidence}},it=e=>{let t=rt(e),n=x2(e),o=Math.max(...n)/2;return{startPoint:[Math.round(t[0]-o),Math.round(t[1]-o)],endPoint:[Math.round(t[0]+o),Math.round(t[1]+o)],landmarks:e.landmarks,confidence:e.confidence}},l3=e=>{let t=e.map(o=>o[0]),n=e.map(o=>o[1]);return{startPoint:[Math.min(...t),Math.min(...n)],endPoint:[Math.max(...t),Math.max(...n)],landmarks:e}},p5=[[1,0,0],[0,1,0],[0,0,1]],_s=e=>e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI)),$s=(e,t)=>_s(Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]));var A3=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]],t2=(e,t)=>{let n=0;for(let o=0;o{let n=[];for(let o=0;o{let n=[],o=e.length;for(let r=0;r{let n=Math.cos(e),o=Math.sin(e),r=[[n,-o,0],[o,n,0],[0,0,1]],s=A3(t[0],t[1]),A=a3(s,r),a=A3(-t[0],-t[1]);return a3(A,a)},tA=e=>{let t=[[e[0][0],e[1][0]],[e[0][1],e[1][1]]],n=[e[0][2],e[1][2]],o=[-t2(t[0],n),-t2(t[1],n)];return[t[0].concat(o[0]),t[1].concat(o[1]),[0,0,1]]},nA=(e,t)=>[t2(e,t[0]),t2(e,t[1])];function d3(e){let t=e===192?{strides:[4],anchors:[1]}:{strides:[e/16,e/8],anchors:[2,6]},n=[];for(let o=0;o[s[0]/r*(d[0]-r/2),s[1]/r*(d[1]-r/2),d[2]||0]),a=n&&n!==0&&Math.abs(n)>.2,l=a?c3(n,[0,0]):p5,c=a?A.map(d=>[...nA(d,l),d[2]]):A,x=a?tA(o):p5,i=rt(t),y=[t2(i,x[0]),t2(i,x[1])];return c.map(d=>[Math.trunc(d[0]+y[0]),Math.trunc(d[1]+y[1]),Math.trunc(d[2]||0)])}function y3(e,t,n,o){let r=t.landmarks.length>=_t.count?_t.symmetryLine:Ke.symmetryLine,s=0,A=p5,a;if(e&&v.kernels.includes("rotatewithoffset"))if(s=$s(t.landmarks[r[0]],t.landmarks[r[1]]),s&&s!==0&&Math.abs(s)>.2){let c=rt(t),x=[c[0]/n.shape[2],c[1]/n.shape[1]],i=Te.image.rotateWithOffset(n,s,0,[x[0],x[1]]);A=c3(-s,c),a=m5(t,i,[o,o]),Te.dispose(i)}else a=m5(t,n,[o,o]);else a=m5(t,n,[o,o]);return[s,A,a]}var oA=e=>{let t=e.map(o=>o[0]),n=e.map(o=>o[1]);return[Math.min(...t)+(Math.max(...t)-Math.min(...t))/2,Math.min(...n)+(Math.max(...n)-Math.min(...n))/2]},f3=(e,t)=>{let n=oA(e),o=x2(t);return{startPoint:[n[0]-o[0]/2,n[1]-o[1]/2],endPoint:[n[0]+o[0]/2,n[1]+o[1]/2]}};var m3=6,rA=1.4,ae,h5=null,Ie=0,y2=null,f2=()=>Ie;async function p3(e){var t;return v.initial&&(ae=null),ae?e.debug&&u("cached model:",ae.modelUrl):ae=await O((t=e.face.detector)==null?void 0:t.modelPath),Ie=ae.executor&&ae.inputs[0].shape?ae.inputs[0].shape[2]:256,y2=L.scalar(Ie,"int32"),h5=L.tensor2d(d3(Ie)),ae}function sA(e){if(!h5||!y2)return L.zeros([0,0]);let t={};t.boxStarts=L.slice(e,[0,1],[-1,2]),t.centers=L.add(t.boxStarts,h5),t.boxSizes=L.slice(e,[0,3],[-1,2]),t.boxSizesNormalized=L.div(t.boxSizes,y2),t.centersNormalized=L.div(t.centers,y2),t.halfBoxSize=L.div(t.boxSizesNormalized,C.tf2),t.starts=L.sub(t.centersNormalized,t.halfBoxSize),t.ends=L.add(t.centersNormalized,t.halfBoxSize),t.startNormalized=L.mul(t.starts,y2),t.endNormalized=L.mul(t.ends,y2);let n=L.concat2d([t.startNormalized,t.endNormalized],1);return Object.keys(t).forEach(o=>L.dispose(t[o])),n}async function u3(e,t){var a,l,c,x;if(!e||e.isDisposedInternal||e.shape.length!==4||e.shape[1]<1||e.shape[2]<1)return[];let n={};n.resized=L.image.resizeBilinear(e,[Ie,Ie]),n.div=L.div(n.resized,C.tf127),n.normalized=L.sub(n.div,C.tf05);let o=ae==null?void 0:ae.execute(n.normalized);if(Array.isArray(o)&&o.length>2){let i=o.sort((y,d)=>y.size-d.size);n.concat384=L.concat([i[0],i[2]],2),n.concat512=L.concat([i[1],i[3]],2),n.concat=L.concat([n.concat512,n.concat384],1),n.batch=L.squeeze(n.concat,[0])}else Array.isArray(o)?n.batch=L.squeeze(o[0]):n.batch=L.squeeze(o);L.dispose(o),n.boxes=sA(n.batch),n.logits=L.slice(n.batch,[0,0],[-1,1]),n.sigmoid=L.sigmoid(n.logits),n.scores=L.squeeze(n.sigmoid),n.nms=await L.image.nonMaxSuppressionAsync(n.boxes,n.scores,((a=t.face.detector)==null?void 0:a.maxDetected)||0,((l=t.face.detector)==null?void 0:l.iouThreshold)||0,((c=t.face.detector)==null?void 0:c.minConfidence)||0);let r=await n.nms.array(),s=[],A=await n.scores.data();for(let i=0;i(((x=t.face.detector)==null?void 0:x.minConfidence)||0)){let d={};d.bbox=L.slice(n.boxes,[r[i],0],[1,-1]),d.slice=L.slice(n.batch,[r[i],m3-1],[1,-1]),d.squeeze=L.squeeze(d.slice),d.landmarks=L.reshape(d.squeeze,[m3,-1]);let p=await d.bbox.data(),f={startPoint:[p[0],p[1]],endPoint:[p[2],p[3]],landmarks:await d.landmarks.array(),confidence:y},b=i3(f,[(e.shape[2]||0)/Ie,(e.shape[1]||0)/Ie]),M=at(b,t.face.scale||rA),T=it(M);s.push(T),Object.keys(d).forEach(m=>L.dispose(d[m]))}}return Object.keys(n).forEach(i=>L.dispose(n[i])),s}var ie=V(H());var G0,Oe=0,AA=2.3,b5=ne.leftEyeLower0,g5=ne.rightEyeLower0,m2={leftBounds:[b5[0],b5[b5.length-1]],rightBounds:[g5[0],g5[g5.length-1]]},p2={upperCenter:3,lowerCenter:4,index:71,numCoordinates:76};async function v3(e){var t,n;return v.initial&&(G0=null),G0?e.debug&&u("cached model:",G0.modelUrl):G0=await O((t=e.face.iris)==null?void 0:t.modelPath),Oe=(G0==null?void 0:G0.executor)&&((n=G0.inputs)==null?void 0:n[0].shape)?G0.inputs[0].shape[2]:0,Oe===-1&&(Oe=64),G0}function lt(e,t,n,o){for(let r=0;r<$t.length;r++){let{key:s,indices:A}=$t[r],a=ne[`${n}${s}`];if(!o||o.includes(s))for(let l=0;l{let t=e[m2.leftBounds[0]][2],n=e[m2.rightBounds[0]][2];return t-n},b3=(e,t,n,o,r,s=!1)=>{let A=it(at(l3([e[n],e[o]]),AA)),a=x2(A),l=ie.image.cropAndResize(t,[[A.startPoint[1]/r,A.startPoint[0]/r,A.endPoint[1]/r,A.endPoint[0]/r]],[0],[Oe,Oe]);if(s&&v.kernels.includes("flipleftright")){let c=ie.image.flipLeftRight(l);ie.dispose(l),l=c}return{box:A,boxSize:a,crop:l}},g3=(e,t,n,o=!1)=>{let r=[];for(let s=0;s{let o=e[ne[`${n}EyeUpper0`][p2.upperCenter]][2],r=e[ne[`${n}EyeLower0`][p2.lowerCenter]][2],s=(o+r)/2;return t.map((A,a)=>{let l=s;return a===2?l=o:a===4&&(l=r),[A[0],A[1],l]})};async function R3(e,t,n){if(!(G0!=null&&G0.executor))return e;let{box:o,boxSize:r,crop:s}=b3(e,t,m2.leftBounds[0],m2.leftBounds[1],n,!0),{box:A,boxSize:a,crop:l}=b3(e,t,m2.rightBounds[0],m2.rightBounds[1],n,!0),c=ie.concat([s,l]);ie.dispose(s),ie.dispose(l);let x=G0.execute(c);ie.dispose(c);let i=await x.data();ie.dispose(x);let y=i.slice(0,p2.numCoordinates*3),{rawCoords:d,iris:p}=g3(y,o,r,!0),f=i.slice(p2.numCoordinates*3),{rawCoords:b,iris:M}=g3(f,A,a,!1),T=aA(e);Math.abs(T)<30?(lt(e,d,"left",null),lt(e,b,"right",null)):T<1?lt(e,d,"left",["EyeUpper0","EyeLower0"]):lt(e,b,"right",["EyeUpper0","EyeLower0"]);let m=T3(e,p,"left"),h=T3(e,M,"right");return e.concat(m).concat(h)}async function P3(e,t){var s,A,a,l,c,x,i,y,d,p;let n={lips:await((A=(s=t.filter(f=>f.size===160))==null?void 0:s[0])==null?void 0:A.data()),irisL:await((l=(a=t.filter(f=>f.size===10))==null?void 0:a[0])==null?void 0:l.data()),eyeL:await((x=(c=t.filter(f=>f.size===142))==null?void 0:c[0])==null?void 0:x.data()),irisR:await((y=(i=t.filter(f=>f.size===10))==null?void 0:i[1])==null?void 0:y.data()),eyeR:await((p=(d=t.filter(f=>f.size===142))==null?void 0:d[1])==null?void 0:p.data())};for(let f of Object.values(n))if(!f)return e;let o=Qe.reduce((f,b)=>f+=e[b][2],0)/Qe.length;for(let f=0;ff+=e[b][2],0)/_e.length;for(let f=0;fg()-pe.timestamp,o=pe.skipped<(((c=t.face.detector)==null?void 0:c.skipFrames)||0);!t.skipAllowed||!n||!o||pe.boxes.length===0?(pe.boxes=await u3(e,t),pe.timestamp=g(),pe.skipped=0):pe.skipped++;let r=[],s=[],A=0,a=j2;for(let T=0;TG.shape[G.shape.length-1]===1).data();if(P.faceScore=Math.round(100*t0[0])/100,P.faceScore<(((p=t.face.detector)==null?void 0:p.minConfidence)||1)){if(m.confidence=P.faceScore,t.face.mesh.keepInvalid){P.box=st(m,e),P.boxRaw=At(m,e),P.score=P.boxScore,P.mesh=m.landmarks.map(G=>[(m.startPoint[0]+m.endPoint[0])/2+(m.endPoint[0]+m.startPoint[0])*G[0]/f2(),(m.startPoint[1]+m.endPoint[1])/2+(m.endPoint[1]+m.startPoint[1])*G[1]/f2()]),P.meshRaw=P.mesh.map(G=>[G[0]/(e.shape[2]||1),G[1]/(e.shape[1]||1),(G[2]||0)/a]);for(let G of Object.keys(Ke))P.annotations[G]=[P.mesh[Ke[G]]]}}else{let G=I.find(Z=>Z.shape[Z.shape.length-1]===1404),$=Le.reshape(G,[-1,3]),s0=await $.array();Le.dispose($),(f=t.face.attention)!=null&&f.enabled?s0=await P3(s0,I):(b=t.face.iris)!=null&&b.enabled&&(s0=await R3(s0,P.tensor,j2)),P.mesh=x3(s0,m,h,S,j2),P.meshRaw=P.mesh.map(Z=>[Z[0]/(e.shape[2]||0),Z[1]/(e.shape[1]||0),(Z[2]||0)/a]);for(let Z of Object.keys(ne))P.annotations[Z]=ne[Z].map(b0=>P.mesh[b0]);P.score=P.faceScore;let R={...f3(P.mesh,m),confidence:m.confidence,landmarks:m.landmarks};P.box=st(R,e),P.boxRaw=At(R,e),s.push(R)}Le.dispose(I)}else{P.box=st(m,e),P.boxRaw=At(m,e),P.score=P.boxScore,P.mesh=m.landmarks.map(I=>[(m.startPoint[0]+m.endPoint[0])/2+(m.endPoint[0]+m.startPoint[0])*I[0]/f2(),(m.startPoint[1]+m.endPoint[1])/2+(m.endPoint[1]+m.startPoint[1])*I[1]/f2()]),P.meshRaw=P.mesh.map(I=>[I[0]/(e.shape[2]||0),I[1]/(e.shape[1]||0),(I[2]||0)/a]);for(let I of Object.keys(Ke))P.annotations[I]=[P.mesh[Ke[I]]]}P.score>(((M=t.face.detector)==null?void 0:M.minConfidence)||1)?r.push(P):Le.dispose(P.tensor)}return pe.boxes=s,r}async function w3(e){var t,n,o,r,s,A;return v.initial&&(o0=null),((t=e.face.attention)==null?void 0:t.enabled)&&(o0==null?void 0:o0.signature)&&Object.keys(((n=o0==null?void 0:o0.signature)==null?void 0:n.outputs)||{}).length<6&&(o0=null),o0?e.debug&&u("cached model:",o0.modelUrl):(o=e.face.attention)!=null&&o.enabled?o0=await O(e.face.attention.modelPath):o0=await O((r=e.face.mesh)==null?void 0:r.modelPath),j2=o0.executor&&((s=o0==null?void 0:o0.inputs)==null?void 0:s[0].shape)?(A=o0==null?void 0:o0.inputs)==null?void 0:A[0].shape[2]:256,o0}var E3=Je,z3=z2;var le=V(H());var lA=["angry","disgust","fear","happy","sad","surprise","neutral"],_0,ct=[],S3=0,j3=0,v5=Number.MAX_SAFE_INTEGER;async function N3(e){var t;return v.initial&&(_0=null),_0?e.debug&&u("cached model:",_0.modelUrl):_0=await O((t=e.face.emotion)==null?void 0:t.modelPath),_0}async function R5(e,t,n,o){var A,a;if(!_0)return[];let r=v5<(((A=t.face.emotion)==null?void 0:A.skipFrames)||0),s=(((a=t.face.emotion)==null?void 0:a.skipTime)||0)>g()-j3;return t.skipAllowed&&s&&r&&S3===o&&ct[n]&&ct[n].length>0?(v5++,ct[n]):(v5=0,new Promise(async l=>{var x;let c=[];if((x=t.face.emotion)!=null&&x.enabled){let i={},y=_0!=null&&_0.inputs[0].shape?_0.inputs[0].shape[2]:0;i.resize=le.image.resizeBilinear(e,[y,y],!1),i.channels=le.mul(i.resize,C.rgb),i.grayscale=le.sum(i.channels,3,!0),i.grayscaleSub=le.sub(i.grayscale,C.tf05),i.grayscaleMul=le.mul(i.grayscaleSub,C.tf2),i.emotion=_0==null?void 0:_0.execute(i.grayscaleMul),j3=g();let d=await i.emotion.data();for(let p=0;p(t.face.emotion.minConfidence||0)&&c.push({score:Math.min(.99,Math.trunc(100*d[p])/100),emotion:lA[p]});c.sort((p,f)=>f.score-p.score),Object.keys(i).forEach(p=>le.dispose(i[p]))}ct[n]=c,S3=o,l(c)}))}var ce=V(H());var z0,Ce=[],O3=0,L3=0,M5=Number.MAX_SAFE_INTEGER;async function C3(e){var t;return v.initial&&(z0=null),z0?e.debug&&u("cached model:",z0.modelUrl):z0=await O((t=e.face.description)==null?void 0:t.modelPath),z0}function cA(e){let t=e.image||e.tensor||e;if(!(z0!=null&&z0.inputs[0].shape))return t;let n=ce.image.resizeBilinear(t,[z0.inputs[0].shape[2],z0.inputs[0].shape[1]],!1),o=ce.mul(n,C.tf255);return ce.dispose(n),o}async function P5(e,t,n,o){var a,l,c,x;let r={age:0,gender:"unknown",genderScore:0,descriptor:[]};if(!(z0!=null&&z0.executor))return r;let s=M5<(((a=t.face.description)==null?void 0:a.skipFrames)||0),A=(((l=t.face.description)==null?void 0:l.skipTime)||0)>g()-O3;return t.skipAllowed&&s&&A&&L3===o&&((c=Ce==null?void 0:Ce[n])==null?void 0:c.age)>0&&((x=Ce==null?void 0:Ce[n])==null?void 0:x.genderScore)>0?(M5++,Ce[n]):(M5=0,new Promise(async i=>{var y;if((y=t.face.description)!=null&&y.enabled){let d=cA(e),p=z0==null?void 0:z0.execute(d);O3=g(),ce.dispose(d);let b=await p.find(q=>q.shape[1]===1).data(),M=Math.trunc(200*Math.abs(b[0]-.5))/100;M>(t.face.description.minConfidence||0)&&(r.gender=b[0]<=.5?"female":"male",r.genderScore=Math.min(.99,M));let T=ce.argMax(p.find(q=>q.shape[1]===100),1),m=(await T.data())[0];ce.dispose(T);let S=await p.find(q=>q.shape[1]===100).data();r.age=Math.round(S[m-1]>S[m+1]?10*m-100*S[m-1]:10*m+100*S[m+1])/10,(Number.isNaN(b[0])||Number.isNaN(S[0]))&&u("faceres error:",{model:z0,result:p});let P=p.find(q=>q.shape[1]===1024),I=P?await P.data():[];r.descriptor=Array.from(I),p.forEach(q=>ce.dispose(q))}Ce[n]=r,L3=o,i(r)}))}var u2=.1,k5=.5;function dA(e,t,n){let o=!1,r=n.length-1;for(let s=0;st!=n[r].y>t&&e<(n[r].x-n[s].x)*(t-n[s].y)/(n[r].y-n[s].y)+n[s].x&&(o=!o);return o}async function D3(e){if(!e.tensor||!e.mesh||e.mesh.length<100)return e.tensor;let t=e.tensor.shape[2]||0,n=e.tensor.shape[1]||0,o=await e.tensor.buffer(),r=[];for(let A of ne.silhouette)r.push({x:(e.mesh[A][0]-e.box[0])/e.box[2],y:(e.mesh[A][1]-e.box[1])/e.box[3]});u2&&u2>0&&(r=r.map(A=>({x:A.x>.5?A.x+u2:A.x-u2,y:A.y>.5?A.y+u2:A.y-u2})));for(let A=0;Ag()-B3,s=w5<(((a=t.face.antispoof)==null?void 0:a.skipFrames)||0);return t.skipAllowed&&r&&s&&F3===o&&dt[n]?(w5++,dt[n]):(w5=0,new Promise(async l=>{let c=xt.image.resizeBilinear(e,[M0!=null&&M0.inputs[0].shape?M0.inputs[0].shape[2]:0,M0!=null&&M0.inputs[0].shape?M0.inputs[0].shape[1]:0],!1),x=M0==null?void 0:M0.execute(c),i=(await x.data())[0];dt[n]=Math.round(100*i)/100,F3=o,B3=g(),xt.dispose([c,x]),l(dt[n])}))}var ft=V(H());var P0,yt=[],z5=Number.MAX_SAFE_INTEGER,V3=0,Z3=0;async function X3(e){var t;return v.initial&&(P0=null),P0?e.debug&&u("cached model:",P0.modelUrl):P0=await O((t=e.face.liveness)==null?void 0:t.modelPath),P0}async function S5(e,t,n,o){var A,a;if(!(P0!=null&&P0.executor))return 0;let r=(((A=t.face.liveness)==null?void 0:A.skipTime)||0)>g()-Z3,s=z5<(((a=t.face.liveness)==null?void 0:a.skipFrames)||0);return t.skipAllowed&&r&&s&&V3===o&&yt[n]?(z5++,yt[n]):(z5=0,new Promise(async l=>{let c=ft.image.resizeBilinear(e,[P0!=null&&P0.inputs[0].shape?P0.inputs[0].shape[2]:0,P0!=null&&P0.inputs[0].shape?P0.inputs[0].shape[1]:0],!1),x=P0==null?void 0:P0.execute(c),i=(await x.data())[0];yt[n]=Math.round(100*i)/100,V3=o,Z3=g(),ft.dispose([c,x]),l(yt[n])}))}var mt=V(H());var oe,j5=[],yA=["white","black","asian","indian","other"],fA=[15,23,28,35.5,45.5,55.5,65],U3=0,Y3=0,N5=Number.MAX_SAFE_INTEGER;async function K3(e){var t;return v.initial&&(oe=null),oe?e.debug&&u("cached model:",oe.modelUrl):oe=await O((t=e.face.gear)==null?void 0:t.modelPath),oe}async function I5(e,t,n,o){var A,a;if(!oe)return{age:0,gender:"unknown",genderScore:0,race:[]};let r=N5<(((A=t.face.gear)==null?void 0:A.skipFrames)||0),s=(((a=t.face.gear)==null?void 0:a.skipTime)||0)>g()-Y3;return t.skipAllowed&&s&&r&&U3===o&&j5[n]?(N5++,j5[n]):(N5=0,new Promise(async l=>{var M,T;if(!(oe!=null&&oe.inputs[0].shape))return;let c={},x=[[0,.1,.9,.9]];c.resize=mt.image.cropAndResize(e,x,[0],[oe.inputs[0].shape[2],oe.inputs[0].shape[1]]);let i={age:0,gender:"unknown",genderScore:0,race:[]};(M=t.face.gear)!=null&&M.enabled&&([c.age,c.gender,c.race]=oe.execute(c.resize,["age_output","gender_output","race_output"]));let y=await c.gender.data();i.gender=y[0]>y[1]?"male":"female",i.genderScore=Math.round(100*(y[0]>y[1]?y[0]:y[1]))/100;let d=await c.race.data();for(let m=0;m(((T=t.face.gear)==null?void 0:T.minConfidence)||.2)&&i.race.push({score:Math.round(100*d[m])/100,race:yA[m]});i.race.sort((m,h)=>h.score-m.score);let f=Array.from(await c.age.data()).map((m,h)=>[fA[h],m]).sort((m,h)=>h[1]-m[1]),b=f[0][0];for(let m=1;mmt.dispose(c[m])),j5[n]=i,U3=o,Y3=g(),l(i)}))}var h2=V(H());var V0,pt=[],Q3=0,_3=0,O5=Number.MAX_SAFE_INTEGER;async function $3(e){return v.initial&&(V0=null),V0?e.debug&&u("cached model:",V0.modelUrl):V0=await O(e.face.ssrnet.modelPathAge),V0}async function L5(e,t,n,o){var A,a,l,c;if(!V0)return{age:0};let r=O5<(((A=t.face.ssrnet)==null?void 0:A.skipFrames)||0),s=(((a=t.face.ssrnet)==null?void 0:a.skipTime)||0)>g()-_3;return t.skipAllowed&&r&&s&&Q3===o&&((l=pt[n])==null?void 0:l.age)&&((c=pt[n])==null?void 0:c.age)>0?(O5++,pt[n]):(O5=0,new Promise(async x=>{var d;if(!(V0!=null&&V0.inputs)||!V0.inputs[0]||!V0.inputs[0].shape)return;let i={};i.resize=h2.image.resizeBilinear(e,[V0.inputs[0].shape[2],V0.inputs[0].shape[1]],!1),i.enhance=h2.mul(i.resize,C.tf255);let y={age:0};if((d=t.face.ssrnet)!=null&&d.enabled&&(i.age=V0.execute(i.enhance)),i.age){let p=await i.age.data();y.age=Math.trunc(10*p[0])/10}Object.keys(i).forEach(p=>h2.dispose(i[p])),pt[n]=y,Q3=o,_3=g(),x(y)}))}var S0=V(H());var re,ut=[],tn=0,nn=0,C5=Number.MAX_SAFE_INTEGER,W5=[.2989,.587,.114];async function on(e){var t;return v.initial&&(re=null),re?e.debug&&u("cached model:",re.modelUrl):re=await O((t=e.face.ssrnet)==null?void 0:t.modelPathGender),re}async function D5(e,t,n,o){var A,a,l,c;if(!re)return{gender:"unknown",genderScore:0};let r=C5<(((A=t.face.ssrnet)==null?void 0:A.skipFrames)||0),s=(((a=t.face.ssrnet)==null?void 0:a.skipTime)||0)>g()-nn;return t.skipAllowed&&r&&s&&tn===o&&((l=ut[n])==null?void 0:l.gender)&&((c=ut[n])==null?void 0:c.genderScore)>0?(C5++,ut[n]):(C5=0,new Promise(async x=>{var p;if(!(re!=null&&re.inputs[0].shape))return;let i={};i.resize=S0.image.resizeBilinear(e,[re.inputs[0].shape[2],re.inputs[0].shape[1]],!1),i.enhance=S0.tidy(()=>{let[f,b,M]=S0.split(i.resize,3,3),T=S0.mul(f,W5[0]),m=S0.mul(b,W5[1]),h=S0.mul(M,W5[2]),S=S0.addN([T,m,h]);return S0.mul(S0.sub(S,C.tf05),2)});let y={gender:"unknown",genderScore:0};(p=t.face.ssrnet)!=null&&p.enabled&&(i.gender=re.execute(i.enhance));let d=await i.gender.data();y.gender=d[0]>d[1]?"female":"male",y.genderScore=d[0]>d[1]?Math.trunc(100*d[0])/100:Math.trunc(100*d[1])/100,Object.keys(i).forEach(f=>S0.dispose(i[f])),ut[n]=y,tn=o,nn=g(),x(y)}))}var ht=V(H());var Z0,F5=[],sn=0,An=0,an=Number.MAX_SAFE_INTEGER;async function ln(e){var t;return v.initial&&(Z0=null),Z0?e.debug&&u("cached model:",Z0.modelUrl):Z0=await O((t=e.face.mobilefacenet)==null?void 0:t.modelPath),Z0}async function B5(e,t,n,o){var A,a;if(!(Z0!=null&&Z0.executor))return[];let r=an<(((A=t.face.mobilefacenet)==null?void 0:A.skipFrames)||0),s=(((a=t.face.mobilefacenet)==null?void 0:a.skipTime)||0)>g()-An;return t.skipAllowed&&s&&r&&sn===o&&F5[n]?(an++,F5[n]):new Promise(async l=>{var x;let c=[];if(((x=t.face.mobilefacenet)==null?void 0:x.enabled)&&(Z0==null?void 0:Z0.inputs[0].shape)){let i={};i.crop=ht.image.resizeBilinear(e,[Z0.inputs[0].shape[2],Z0.inputs[0].shape[1]],!1),i.data=Z0.execute(i.crop);let y=await i.data.data();c=Array.from(y),Object.keys(i).forEach(d=>ht.dispose(i[d]))}F5[n]=c,sn=o,An=g(),l(c)})}var bt=V(H());var X0,H5=[],dn=0,xn=0,yn=Number.MAX_SAFE_INTEGER;async function fn(e){return v.initial&&(X0=null),X0?e.debug&&u("cached model:",X0.modelUrl):X0=await O(e.face.insightface.modelPath),X0}async function G5(e,t,n,o){var A,a;if(!(X0!=null&&X0.executor))return[];let r=yn<(((A=t.face.insightface)==null?void 0:A.skipFrames)||0),s=(((a=t.face.insightface)==null?void 0:a.skipTime)||0)>g()-xn;return t.skipAllowed&&s&&r&&dn===o&&H5[n]?(yn++,H5[n]):new Promise(async l=>{var x;let c=[];if(((x=t.face.insightface)==null?void 0:x.enabled)&&(X0==null?void 0:X0.inputs[0].shape)){let i={};i.crop=bt.image.resizeBilinear(e,[X0.inputs[0].shape[2],X0.inputs[0].shape[1]],!1),i.data=X0.execute(i.crop);let y=await i.data.data();c=Array.from(y),Object.keys(i).forEach(d=>bt.dispose(i[d]))}H5[n]=c,dn=o,xn=g(),l(c)})}var mA=e=>{let t=(i,y)=>Math.atan2(i[1]-y[1],i[0]-y[0]);if(!e.annotations.rightEyeIris||!e.annotations.leftEyeIris)return{bearing:0,strength:0};let n=[0,-.1],o=1,r=(e.mesh[33][2]||0)>(e.mesh[263][2]||0),s=r?e.mesh[473]:e.mesh[468],A=r?[(e.mesh[133][0]+e.mesh[33][0])/2,(e.mesh[133][1]+e.mesh[33][1])/2]:[(e.mesh[263][0]+e.mesh[362][0])/2,(e.mesh[263][1]+e.mesh[362][1])/2],a=r?[e.mesh[133][0]-e.mesh[33][0],e.mesh[23][1]-e.mesh[27][1]]:[e.mesh[263][0]-e.mesh[362][0],e.mesh[253][1]-e.mesh[257][1]],l=[(A[0]-s[0])/a[0]-n[0],o*(s[1]-A[1])/a[1]-n[1]],c=Math.sqrt(l[0]*l[0]+l[1]*l[1]);return c=Math.min(c,e.boxRaw[2]/2,e.boxRaw[3]/2),{bearing:(t([0,0],l)+Math.PI/2)%Math.PI,strength:c}},pn=(e,t)=>{let n=f=>{let b=Math.sqrt(f[0]*f[0]+f[1]*f[1]+f[2]*f[2]);return f[0]/=b,f[1]/=b,f[2]/=b,f},o=(f,b)=>{let M=f[0]-b[0],T=f[1]-b[1],m=f[2]-b[2];return[M,T,m]},r=(f,b)=>{let M=f[1]*b[2]-f[2]*b[1],T=f[2]*b[0]-f[0]*b[2],m=f[0]*b[1]-f[1]*b[0];return[M,T,m]},s=f=>{let[b,M,T,m,h,S,P,I,q]=f,t0,G,$;return m<1?m>-1?($=Math.asin(m),G=Math.atan2(-P,b),t0=Math.atan2(-S,h)):($=-Math.PI/2,G=-Math.atan2(I,q),t0=0):($=Math.PI/2,G=Math.atan2(I,q),t0=0),Number.isNaN(t0)&&(t0=0),Number.isNaN(G)&&(G=0),Number.isNaN($)&&($=0),{pitch:2*-t0,yaw:2*-G,roll:2*-$}},A=e.meshRaw;if(!A||A.length<300)return{angle:{pitch:0,yaw:0,roll:0},matrix:[1,0,0,0,1,0,0,0,1],gaze:{bearing:0,strength:0}};let a=Math.max(e.boxRaw[2]*t[0],e.boxRaw[3]*t[1])/1.5,l=[A[10],A[152],A[234],A[454]].map(f=>[f[0]*t[0]/a,f[1]*t[1]/a,f[2]]),c=n(o(l[1],l[0])),x=n(o(l[3],l[2])),i=n(r(x,c));x=r(c,i);let y=[x[0],x[1],x[2],c[0],c[1],c[2],i[0],i[1],i[2]],d=s(y),p=A.length===478?mA(e):{bearing:0,strength:0};return{angle:d,matrix:y,gaze:p}};function un(e,t){let n=e==null?void 0:e.annotations;if(!n)return 0;let o=Math.max(Math.abs(n.leftEyeIris[3][0]-n.leftEyeIris[1][0]),Math.abs(n.rightEyeIris[3][0]-n.rightEyeIris[1][0]))/t;return Math.round(1.17/o)/100}var V5=async(e,t)=>{var p,f,b,M,T,m,h,S,P,I,q,t0,G,$,s0,R,Z,b0,U,g0,f0,B,X;let n=g(),o,r,s,A,a,l,c,x,i,y=[];e.state="run:face";let d=await k3(t,e.config);if(e.performance.face=v.perfadd?(e.performance.face||0)+Math.trunc(g()-n):Math.trunc(g()-n),!t.shape||t.shape.length!==4)return[];if(!d)return[];for(let z=0;z200?pn(d[z],[t.shape[2],t.shape[1]]):null;e.analyze("Start Emotion:"),e.config.async?A=(f=e.config.face.emotion)!=null&&f.enabled?R5(d[z].tensor||i0.tensor([]),e.config,z,d.length):[]:(e.state="run:emotion",n=g(),A=(b=e.config.face.emotion)!=null&&b.enabled?await R5(d[z].tensor||i0.tensor([]),e.config,z,d.length):[],e.performance.emotion=v.perfadd?(e.performance.emotion||0)+Math.trunc(g()-n):Math.trunc(g()-n)),e.analyze("End Emotion:"),e.analyze("Start AntiSpoof:"),e.config.async?c=(M=e.config.face.antispoof)!=null&&M.enabled?E5(d[z].tensor||i0.tensor([]),e.config,z,d.length):0:(e.state="run:antispoof",n=g(),c=(T=e.config.face.antispoof)!=null&&T.enabled?await E5(d[z].tensor||i0.tensor([]),e.config,z,d.length):0,e.performance.antispoof=v.perfadd?(e.performance.antispoof||0)+Math.trunc(g()-n):Math.trunc(g()-n)),e.analyze("End AntiSpoof:"),e.analyze("Start Liveness:"),e.config.async?x=(m=e.config.face.liveness)!=null&&m.enabled?S5(d[z].tensor||i0.tensor([]),e.config,z,d.length):0:(e.state="run:liveness",n=g(),x=(h=e.config.face.liveness)!=null&&h.enabled?await S5(d[z].tensor||i0.tensor([]),e.config,z,d.length):0,e.performance.liveness=v.perfadd?(e.performance.antispoof||0)+Math.trunc(g()-n):Math.trunc(g()-n)),e.analyze("End Liveness:"),e.analyze("Start GEAR:"),e.config.async?r=(S=e.config.face.gear)!=null&&S.enabled?I5(d[z].tensor||i0.tensor([]),e.config,z,d.length):null:(e.state="run:gear",n=g(),r=(P=e.config.face.gear)!=null&&P.enabled?await I5(d[z].tensor||i0.tensor([]),e.config,z,d.length):null,e.performance.gear=Math.trunc(g()-n)),e.analyze("End GEAR:"),e.analyze("Start SSRNet:"),e.config.async?(o=(I=e.config.face.ssrnet)!=null&&I.enabled?L5(d[z].tensor||i0.tensor([]),e.config,z,d.length):null,s=(q=e.config.face.ssrnet)!=null&&q.enabled?D5(d[z].tensor||i0.tensor([]),e.config,z,d.length):null):(e.state="run:ssrnet",n=g(),o=(t0=e.config.face.ssrnet)!=null&&t0.enabled?await L5(d[z].tensor||i0.tensor([]),e.config,z,d.length):null,s=(G=e.config.face.ssrnet)!=null&&G.enabled?await D5(d[z].tensor||i0.tensor([]),e.config,z,d.length):null,e.performance.ssrnet=Math.trunc(g()-n)),e.analyze("End SSRNet:"),e.analyze("Start MobileFaceNet:"),e.config.async?a=($=e.config.face.mobilefacenet)!=null&&$.enabled?B5(d[z].tensor||i0.tensor([]),e.config,z,d.length):null:(e.state="run:mobilefacenet",n=g(),a=(s0=e.config.face.mobilefacenet)!=null&&s0.enabled?await B5(d[z].tensor||i0.tensor([]),e.config,z,d.length):null,e.performance.mobilefacenet=Math.trunc(g()-n)),e.analyze("End MobileFaceNet:"),e.analyze("Start InsightFace:"),e.config.async?l=(R=e.config.face.insightface)!=null&&R.enabled?G5(d[z].tensor||i0.tensor([]),e.config,z,d.length):null:(e.state="run:mobilefacenet",n=g(),l=(Z=e.config.face.insightface)!=null&&Z.enabled?await G5(d[z].tensor||i0.tensor([]),e.config,z,d.length):null,e.performance.mobilefacenet=Math.trunc(g()-n)),e.analyze("End InsightFace:"),e.analyze("Start Description:"),e.config.async?i=P5(d[z].tensor||i0.tensor([]),e.config,z,d.length):(e.state="run:description",n=g(),i=await P5(d[z].tensor||i0.tensor([]),e.config,z,d.length),e.performance.description=v.perfadd?(e.performance.description||0)+Math.trunc(g()-n):Math.trunc(g()-n)),e.analyze("End Description:"),e.config.async&&([o,s,A,a,l,i,r,c,x]=await Promise.all([o,s,A,a,l,i,r,c,x])),e.analyze("Finish Face:"),((b0=e.config.face.ssrnet)==null?void 0:b0.enabled)&&o&&s&&(i={...i,age:o.age,gender:s.gender,genderScore:s.genderScore}),((U=e.config.face.gear)==null?void 0:U.enabled)&&r&&(i={...i,age:r.age,gender:r.gender,genderScore:r.genderScore,race:r.race}),((g0=e.config.face.mobilefacenet)==null?void 0:g0.enabled)&&a&&(i.descriptor=a),((f0=e.config.face.insightface)==null?void 0:f0.enabled)&&l&&(i.descriptor=l);let Pe=(B=e.config.face.iris)!=null&&B.enabled?un(d[z],t.shape[2]):0,ke=(X=e.config.face.detector)!=null&&X.return?i0.squeeze(d[z].tensor):null;i0.dispose(d[z].tensor),d[z].tensor&&delete d[z].tensor;let T0={...d[z],id:z};i.age&&(T0.age=i.age),i.gender&&(T0.gender=i.gender),i.genderScore&&(T0.genderScore=i.genderScore),i.descriptor&&(T0.embedding=i.descriptor),i.race&&(T0.race=i.race),A&&(T0.emotion=A),c&&(T0.real=c),x&&(T0.live=x),Pe>0&&(T0.distance=Pe),$0&&(T0.rotation=$0),ke&&(T0.tensor=ke),y.push(T0),e.analyze("End Face")}return e.analyze("End FaceMesh:"),e.config.async&&(e.performance.face&&delete e.performance.face,e.performance.age&&delete e.performance.age,e.performance.gender&&delete e.performance.gender,e.performance.emotion&&delete e.performance.emotion),y};var W0={thumb:0,index:1,middle:2,ring:3,pinky:4,all:[0,1,2,3,4],nameMapping:{0:"thumb",1:"index",2:"middle",3:"ring",4:"pinky"},pointsMapping:{0:[[0,1],[1,2],[2,3],[3,4]],1:[[0,5],[5,6],[6,7],[7,8]],2:[[0,9],[9,10],[10,11],[11,12]],3:[[0,13],[13,14],[14,15],[15,16]],4:[[0,17],[17,18],[18,19],[19,20]]},getName:e=>W0.nameMapping[e],getPoints:e=>W0.pointsMapping[e]},De={none:0,half:1,full:2,nameMapping:{0:"none",1:"half",2:"full"},getName:e=>De.nameMapping[e]},l0={verticalUp:0,verticalDown:1,horizontalLeft:2,horizontalRight:3,diagonalUpRight:4,diagonalUpLeft:5,diagonalDownRight:6,diagonalDownLeft:7,nameMapping:{0:"verticalUp",1:"verticalDown",2:"horizontalLeft",3:"horizontalRight",4:"diagonalUpRight",5:"diagonalUpLeft",6:"diagonalDownRight",7:"diagonalDownLeft"},getName:e=>l0.nameMapping[e]},We=class{constructor(t){k(this,"name");k(this,"curls");k(this,"directions");k(this,"weights");k(this,"weightsRelative");this.name=t,this.curls={},this.directions={},this.weights=[1,1,1,1,1],this.weightsRelative=[1,1,1,1,1]}curl(t,n,o){typeof this.curls[t]=="undefined"&&(this.curls[t]=[]),this.curls[t].push([n,o])}direction(t,n,o){this.directions[t]||(this.directions[t]=[]),this.directions[t].push([n,o])}weight(t,n){this.weights[t]=n;let o=this.weights.reduce((r,s)=>r+s,0);this.weightsRelative=this.weights.map(r=>r*5/o)}matchAgainst(t,n){let o=0;for(let r in t){let s=t[r],A=this.curls[r];if(typeof A=="undefined"){o+=this.weightsRelative[r];continue}for(let[a,l]of A)if(s===a){o+=l*this.weightsRelative[r];break}}for(let r in n){let s=n[r],A=this.directions[r];if(typeof A=="undefined"){o+=this.weightsRelative[r];continue}for(let[a,l]of A)if(s===a){o+=l*this.weightsRelative[r];break}}return o/10}};var{thumb:de,index:ve,middle:Re,ring:n2,pinky:o2}=W0,{none:xe,half:uA,full:ye}=De,{verticalUp:b2,verticalDown:G7,horizontalLeft:Z5,horizontalRight:hA,diagonalUpRight:bA,diagonalUpLeft:g2,diagonalDownRight:V7,diagonalDownLeft:Z7}=l0,Fe=new We("thumbs up");Fe.curl(de,xe,1);Fe.direction(de,b2,1);Fe.direction(de,g2,.25);Fe.direction(de,bA,.25);for(let e of[W0.index,W0.middle,W0.ring,W0.pinky])Fe.curl(e,ye,1),Fe.direction(e,Z5,1),Fe.direction(e,hA,1);var p0=new We("victory");p0.curl(de,uA,.5);p0.curl(de,xe,.5);p0.direction(de,b2,1);p0.direction(de,g2,1);p0.curl(ve,xe,1);p0.direction(ve,b2,.75);p0.direction(ve,g2,1);p0.curl(Re,xe,1);p0.direction(Re,b2,1);p0.direction(Re,g2,.75);p0.curl(n2,ye,1);p0.direction(n2,b2,.2);p0.direction(n2,g2,1);p0.direction(n2,Z5,.2);p0.curl(o2,ye,1);p0.direction(o2,b2,.2);p0.direction(o2,g2,1);p0.direction(o2,Z5,.2);p0.weight(ve,2);p0.weight(Re,2);var Be=new We("point");Be.curl(de,ye,1);Be.curl(ve,xe,.5);Be.curl(Re,ye,.5);Be.curl(n2,ye,.5);Be.curl(o2,ye,.5);Be.weight(ve,2);Be.weight(Re,2);var He=new We("middle finger");He.curl(de,xe,1);He.curl(ve,ye,.5);He.curl(Re,ye,.5);He.curl(n2,ye,.5);He.curl(o2,ye,.5);He.weight(ve,2);He.weight(Re,2);var T2=new We("open palm");T2.curl(de,xe,.75);T2.curl(ve,xe,.75);T2.curl(Re,xe,.75);T2.curl(n2,xe,.75);T2.curl(o2,xe,.75);var hn=[Fe,p0,Be,He,T2];var gA=.7,r2={HALF_CURL_START_LIMIT:60,NO_CURL_START_LIMIT:130,DISTANCE_VOTE_POWER:1.1,SINGLE_ANGLE_VOTE_POWER:.9,TOTAL_ANGLE_VOTE_POWER:1.6};function bn(e,t,n,o){let r=(t-o)/(e-n),s=Math.atan(r)*180/Math.PI;return s<=0?s=-s:s>0&&(s=180-s),s}function Tn(e,t){if(!e||!t)return[0,0];let n=bn(e[0],e[1],t[0],t[1]);if(e.length===2)return n;let o=bn(e[1],e[2],t[1],t[2]);return[n,o]}function gn(e,t=1){let n=0,o=0,r=0;return e>=75&&e<=105?n=1*t:e>=25&&e<=155?o=1*t:r=1*t,[n,o,r]}function TA(e,t,n){let o=e[0]-t[0],r=e[0]-n[0],s=t[0]-n[0],A=e[1]-t[1],a=e[1]-n[1],l=t[1]-n[1],c=e[2]-t[2],x=e[2]-n[2],i=t[2]-n[2],y=Math.sqrt(o*o+A*A+c*c),d=Math.sqrt(r*r+a*a+x*x),p=Math.sqrt(s*s+l*l+i*i),f=(p*p+y*y-d*d)/(2*p*y);f>1?f=1:f<-1&&(f=-1);let b=Math.acos(f);b=57.2958*b%180;let M;return b>r2.NO_CURL_START_LIMIT?M=De.none:b>r2.HALF_CURL_START_LIMIT?M=De.half:M=De.full,M}function vn(e,t,n,o){let r;return o===Math.abs(e)?e>0?r=l0.horizontalLeft:r=l0.horizontalRight:o===Math.abs(t)?t>0?r=l0.horizontalLeft:r=l0.horizontalRight:n>0?r=l0.horizontalLeft:r=l0.horizontalRight,r}function Rn(e,t,n,o){let r;return o===Math.abs(e)?e<0?r=l0.verticalDown:r=l0.verticalUp:o===Math.abs(t)?t<0?r=l0.verticalDown:r=l0.verticalUp:n<0?r=l0.verticalDown:r=l0.verticalUp,r}function vA(e,t,n,o,r,s,A,a){let l,c=Rn(e,t,n,o),x=vn(r,s,A,a);return c===l0.verticalUp?x===l0.horizontalLeft?l=l0.diagonalUpLeft:l=l0.diagonalUpRight:x===l0.horizontalLeft?l=l0.diagonalDownLeft:l=l0.diagonalDownRight,l}function RA(e,t,n,o){let r=e[0]-t[0],s=e[0]-n[0],A=t[0]-n[0],a=e[1]-t[1],l=e[1]-n[1],c=t[1]-n[1],x=Math.max(Math.abs(r),Math.abs(s),Math.abs(A)),i=Math.max(Math.abs(a),Math.abs(l),Math.abs(c)),y=0,d=0,p=0,f=i/(x+1e-5);f>1.5?y+=r2.DISTANCE_VOTE_POWER:f>.66?d+=r2.DISTANCE_VOTE_POWER:p+=r2.DISTANCE_VOTE_POWER;let b=Math.sqrt(r*r+a*a),M=Math.sqrt(s*s+l*l),T=Math.sqrt(A*A+c*c),m=Math.max(b,M,T),h=e[0],S=e[1],P=n[0],I=n[1];m===b?(P=n[0],I=n[1]):m===T&&(h=t[0],S=t[1]);let G=Tn([h,S],[P,I]),$=gn(G,r2.TOTAL_ANGLE_VOTE_POWER);y+=$[0],d+=$[1],p+=$[2];for(let R of o){let Z=gn(R,r2.SINGLE_ANGLE_VOTE_POWER);y+=Z[0],d+=Z[1],p+=Z[2]}let s0;return y===Math.max(y,d,p)?s0=Rn(l,a,c,i):p===Math.max(d,p)?s0=vn(s,r,A,x):s0=vA(l,a,c,i,s,r,A,x),s0}function Mn(e){let t=[],n=[],o=[],r=[];if(!e)return{curls:o,directions:r};for(let s of W0.all){let A=W0.getPoints(s),a=[],l=[];for(let c of A){let x=e[c[0]],i=e[c[1]],y=Tn(x,i),d=y[0],p=y[1];a.push(d),l.push(p)}t.push(a),n.push(l)}for(let s of W0.all){let A=s===W0.thumb?1:0,a=W0.getPoints(s),l=e[a[A][0]],c=e[a[A+1][1]],x=e[a[3][1]],i=TA(l,c,x),y=RA(l,c,x,t[s].slice(A));o[s]=i,r[s]=y}return{curls:o,directions:r}}function gt(e){if(!e||e.length===0)return null;let t=Mn(e),n={};for(let o of W0.all)n[W0.getName(o)]={curl:De.getName(t.curls[o]),direction:l0.getName(t.directions[o])};return n}function Pn(e){let t=[];if(!e||e.length===0)return t;let n=Mn(e);for(let o of hn){let r=o.matchAgainst(n.curls,n.directions);r>=gA&&t.push({name:o.name,confidence:r})}return t}var kn=e=>{if(!e)return[];let t=[];for(let n=0;nl.part==="leftWrist"),r=e[n].keypoints.find(l=>l.part==="rightWrist"),s=e[n].keypoints.find(l=>l.part==="nose");s&&o&&r&&o.position[1]l.part==="leftShoulder"),a=e[n].keypoints.find(l=>l.part==="rightShoulder");A&&a&&Math.abs(A.positionRaw[1]-a.positionRaw[1])>.1&&t.push({body:n,gesture:`leaning ${A.position[1]>a.position[1]?"left":"right"}`})}return t},wn=e=>{if(!e)return[];let t=[];for(let n=0;n450){let o=(e[n].mesh[33][2]||0)-(e[n].mesh[263][2]||0),r=e[n].mesh[33][0]-e[n].mesh[263][0];Math.abs(o/r)<=.15?t.push({face:n,gesture:"facing center"}):t.push({face:n,gesture:`facing ${o<0?"left":"right"}`}),Math.abs(e[n].mesh[374][1]-e[n].mesh[386][1])/Math.abs(e[n].mesh[443][1]-e[n].mesh[450][1])<.2&&t.push({face:n,gesture:"blink left eye"}),Math.abs(e[n].mesh[145][1]-e[n].mesh[159][1])/Math.abs(e[n].mesh[223][1]-e[n].mesh[230][1])<.2&&t.push({face:n,gesture:"blink right eye"});let a=Math.min(100,500*Math.abs(e[n].mesh[13][1]-e[n].mesh[14][1])/Math.abs(e[n].mesh[10][1]-e[n].mesh[152][1]));a>10&&t.push({face:n,gesture:`mouth ${Math.trunc(a)}% open`});let l=e[n].mesh[152][2]||0;Math.abs(l)>10&&t.push({face:n,gesture:`head ${l<0?"up":"down"}`})}return t},En=e=>{var n,o,r,s;if(!e)return[];let t=[];for(let A=0;A.06||b>.06)&&(d=!1),f>b?f>.05&&t.push({iris:A,gesture:"looking right"}):b>.05&&t.push({iris:A,gesture:"looking left"});let M=Math.abs(e[A].mesh[145][1]-e[A].annotations.rightEyeIris[0][1])/e[A].box[3],T=Math.abs(e[A].mesh[374][1]-e[A].annotations.leftEyeIris[0][1])/e[A].box[3];(T<.01||M<.01||T>.022||M>.022)&&(d=!1),(T<.01||M<.01)&&t.push({iris:A,gesture:"looking down"}),(T>.022||M>.022)&&t.push({iris:A,gesture:"looking up"}),d&&t.push({iris:A,gesture:"looking center"})}return t},zn=e=>{if(!e)return[];let t=[];for(let n=0;n0){let r=o.reduce((A,a)=>(A.position[2]||0)<(a.position[2]||0)?A:a);t.push({hand:n,gesture:`${r.name} forward`});let s=o.reduce((A,a)=>A.position[1][s[0]*t[0],s[1]*t[1]]);return{startPoint:n,endPoint:o,palmLandmarks:r,confidence:e.confidence}}function vt(e,t=1.5){let n=N2(e),o=Tt(e),r=[t*o[0]/2,t*o[1]/2],s=[n[0]-r[0],n[1]-r[1]],A=[n[0]+r[0],n[1]+r[1]];return{startPoint:s,endPoint:A,palmLandmarks:e.palmLandmarks}}function Rt(e){let t=N2(e),n=Tt(e),r=Math.max(...n)/2,s=[t[0]-r,t[1]-r],A=[t[0]+r,t[1]+r];return{startPoint:s,endPoint:A,palmLandmarks:e.palmLandmarks}}function PA(e){return e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI))}function Ln(e,t){let n=Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]);return PA(n)}var Sn=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]];function Ge(e,t){let n=0;for(let o=0;o[A.x,A.y]),this.anchorsTensor=W.tensor2d(this.anchors),this.inputSize=((s=(r=(o=(n=this==null?void 0:this.model)==null?void 0:n.inputs)==null?void 0:o[0])==null?void 0:r.shape)==null?void 0:s[2])||0,this.inputSizeTensor=W.tensor1d([this.inputSize,this.inputSize]),this.doubleInputSizeTensor=W.tensor1d([this.inputSize*2,this.inputSize*2])}normalizeBoxes(t){let n={};n.boxOffsets=W.slice(t,[0,0],[-1,2]),n.boxSizes=W.slice(t,[0,2],[-1,2]),n.div=W.div(n.boxOffsets,this.inputSizeTensor),n.boxCenterPoints=W.add(n.div,this.anchorsTensor),n.halfBoxSizes=W.div(n.boxSizes,this.doubleInputSizeTensor),n.sub=W.sub(n.boxCenterPoints,n.halfBoxSizes),n.startPoints=W.mul(n.sub,this.inputSizeTensor),n.add=W.add(n.boxCenterPoints,n.halfBoxSizes),n.endPoints=W.mul(n.add,this.inputSizeTensor);let o=W.concat2d([n.startPoints,n.endPoints],1);return Object.keys(n).forEach(r=>W.dispose(n[r])),o}normalizeLandmarks(t,n){let o={};o.reshape=W.reshape(t,[-1,7,2]),o.div=W.div(o.reshape,this.inputSizeTensor),o.landmarks=W.add(o.div,this.anchors[n]?this.anchors[n]:0);let r=W.mul(o.landmarks,this.inputSizeTensor);return Object.keys(o).forEach(s=>W.dispose(o[s])),r}async predict(t,n){var a;let o={};o.resize=W.image.resizeBilinear(t,[this.inputSize,this.inputSize]),o.div=W.div(o.resize,C.tf127),o.image=W.sub(o.div,C.tf1),o.batched=this.model.execute(o.image),o.predictions=W.squeeze(o.batched),o.slice=W.slice(o.predictions,[0,0],[-1,1]),o.sigmoid=W.sigmoid(o.slice),o.scores=W.squeeze(o.sigmoid);let r=await o.scores.data();o.boxes=W.slice(o.predictions,[0,1],[-1,4]),o.norm=this.normalizeBoxes(o.boxes),o.nms=await W.image.nonMaxSuppressionAsync(o.norm,o.scores,3*(((a=n.hand)==null?void 0:a.maxDetected)||1),n.hand.iouThreshold,n.hand.minConfidence);let s=await o.nms.array(),A=[];for(let l of s){let c={};c.box=W.slice(o.norm,[l,0],[1,-1]),c.slice=W.slice(o.predictions,[l,5],[1,14]),c.norm=this.normalizeLandmarks(c.slice,l),c.palmLandmarks=W.reshape(c.norm,[-1,2]);let x=await c.box.data(),i=x.slice(0,2),y=x.slice(2,4),d=await c.palmLandmarks.array(),p={startPoint:i,endPoint:y,palmLandmarks:d,confidence:r[l]},f=On(p,[(t.shape[2]||1)/this.inputSize,(t.shape[1]||0)/this.inputSize]);A.push(f),Object.keys(c).forEach(b=>W.dispose(c[b]))}return Object.keys(o).forEach(l=>W.dispose(o[l])),A}};var q0=V(H());var zA=5,Fn=1.65,Bn=[0,5,9,13,17,1,2],SA=0,jA=2,Hn=0,Pt=class{constructor(t,n){k(this,"handDetector");k(this,"handPoseModel");k(this,"inputSize");k(this,"storedBoxes");k(this,"skipped");k(this,"detectedHands");var o,r,s;this.handDetector=t,this.handPoseModel=n,this.inputSize=((s=(r=(o=this.handPoseModel)==null?void 0:o.inputs)==null?void 0:r[0].shape)==null?void 0:s[2])||0,this.storedBoxes=[],this.skipped=Number.MAX_SAFE_INTEGER,this.detectedHands=0}calculateLandmarksBoundingBox(t){let n=t.map(A=>A[0]),o=t.map(A=>A[1]),r=[Math.min(...n),Math.min(...o)],s=[Math.max(...n),Math.max(...o)];return{startPoint:r,endPoint:s}}getBoxForPalmLandmarks(t,n){let o=t.map(s=>U5([...s,1],n)),r=this.calculateLandmarksBoundingBox(o);return vt(Rt(r),zA)}getBoxForHandLandmarks(t){let n=this.calculateLandmarksBoundingBox(t),o=vt(Rt(n),Fn);o.palmLandmarks=[];for(let r=0;r[A[0]*(d[0]-this.inputSize/2),A[1]*(d[1]-this.inputSize/2),A[2]*d[2]]),l=q5(o,[0,0]),c=a.map(d=>[...U5(d,l),d[2]]),x=Cn(r),i=[...N2(n),1],y=[Ge(i,x[0]),Ge(i,x[1])];return c.map(d=>[Math.trunc(d[0]+y[0]),Math.trunc(d[1]+y[1]),Math.trunc(d[2])])}async estimateHands(t,n){let o=!1,r,s=(n.hand.skipTime||0)>g()-Hn,A=this.skipped<(n.hand.skipFrames||0);n.skipAllowed&&s&&A&&(r=await this.handDetector.predict(t,n),this.skipped=0),n.skipAllowed&&this.skipped++,r&&r.length>0&&(r.length!==this.detectedHands&&this.detectedHands!==n.hand.maxDetected||!n.hand.landmarks)&&(this.detectedHands=0,this.storedBoxes=[...r],this.storedBoxes.length>0&&(o=!0));let a=[];for(let l=0;l=n.hand.minConfidence/4){let S=q0.reshape(m,[-1,3]),P=await S.array();q0.dispose(m),q0.dispose(S);let I=this.transformRawCoords(P,f,x,p),q=this.getBoxForHandLandmarks(I);this.storedBoxes[l]={...q,confidence:h};let t0={landmarks:I,confidence:h,boxConfidence:c.confidence,fingerConfidence:h,box:{topLeft:q.startPoint,bottomRight:q.endPoint}};a.push(t0)}else this.storedBoxes[l]=null;q0.dispose(m)}else{let x=vt(Rt(c),Fn),i={confidence:c.confidence,boxConfidence:c.confidence,fingerConfidence:0,box:{topLeft:x.startPoint,bottomRight:x.endPoint},landmarks:[]};a.push(i)}}return this.storedBoxes=this.storedBoxes.filter(l=>l!==null),this.detectedHands=a.length,a.length>n.hand.maxDetected&&(a.length=n.hand.maxDetected),a}};var Gn={thumb:[1,2,3,4],index:[5,6,7,8],middle:[9,10,11,12],ring:[13,14,15,16],pinky:[17,18,19,20],palm:[0]},s2,A2,Vn;async function Y5(e,t){let n=await Vn.estimateHands(e,t);if(!n)return[];let o=[];for(let r=0;rn[r].landmarks[i]);let A=n[r].landmarks,a=[Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER,0,0],l=[0,0,0,0];if(A&&A.length>0){for(let x of A)x[0]a[2]&&(a[2]=x[0]),x[1]>a[3]&&(a[3]=x[1]);a[2]-=a[0],a[3]-=a[1],l=[a[0]/(e.shape[2]||0),a[1]/(e.shape[1]||0),a[2]/(e.shape[2]||0),a[3]/(e.shape[1]||0)]}else a=n[r].box?[Math.trunc(Math.max(0,n[r].box.topLeft[0])),Math.trunc(Math.max(0,n[r].box.topLeft[1])),Math.trunc(Math.min(e.shape[2]||0,n[r].box.bottomRight[0])-Math.max(0,n[r].box.topLeft[0])),Math.trunc(Math.min(e.shape[1]||0,n[r].box.bottomRight[1])-Math.max(0,n[r].box.topLeft[1]))]:[0,0,0,0],l=[n[r].box.topLeft[0]/(e.shape[2]||0),n[r].box.topLeft[1]/(e.shape[1]||0),(n[r].box.bottomRight[0]-n[r].box.topLeft[0])/(e.shape[2]||0),(n[r].box.bottomRight[1]-n[r].box.topLeft[1])/(e.shape[1]||0)];let c=gt(A);o.push({id:r,score:Math.round(100*n[r].confidence)/100,boxScore:Math.round(100*n[r].boxConfidence)/100,fingerScore:Math.round(100*n[r].fingerConfidence)/100,label:"hand",box:a,boxRaw:l,keypoints:A,annotations:s,landmarks:c})}return o}async function Zn(e){var n,o;v.initial&&(s2=null,A2=null),!s2||!A2?[s2,A2]=await Promise.all([e.hand.enabled?O((n=e.hand.detector)==null?void 0:n.modelPath):null,e.hand.landmarks?O((o=e.hand.skeleton)==null?void 0:o.modelPath):null]):(e.debug&&u("cached model:",s2.modelUrl),e.debug&&u("cached model:",A2.modelUrl));let t=s2?new Mt(s2):void 0;return t&&A2&&(Vn=new Pt(t,A2)),[s2,A2]}var Q=V(H());var y0=[null,null],IA=["StatefulPartitionedCall/Postprocessor/Slice","StatefulPartitionedCall/Postprocessor/ExpandDims_1"],Ve=[[0,0],[0,0]],OA=["hand","fist","pinch","point","face","tip","pinchtip"],qn=4,Un=1.6,LA=512,CA=1.4,kt=Number.MAX_SAFE_INTEGER,K5=0,Me=[0,0],x0={boxes:[],hands:[]},Yn={thumb:[1,2,3,4],index:[5,6,7,8],middle:[9,10,11,12],ring:[13,14,15,16],pinky:[17,18,19,20],base:[0],palm:[0,17,13,9,5,1,0]};async function Kn(e){var t;if(v.initial&&(y0[0]=null),y0[0])e.debug&&u("cached model:",y0[0].modelUrl);else{X2(["tensorlistreserve","enter","tensorlistfromtensor","merge","loopcond","switch","exit","tensorliststack","nextiteration","tensorlistsetitem","tensorlistgetitem","reciprocal","shape","split","where"],e),y0[0]=await O((t=e.hand.detector)==null?void 0:t.modelPath);let n=y0[0].executor?Object.values(y0[0].modelSignature.inputs):void 0;Ve[0][0]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[1].size):0,Ve[0][1]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[2].size):0}return y0[0]}async function Jn(e){var t;if(v.initial&&(y0[1]=null),y0[1])e.debug&&u("cached model:",y0[1].modelUrl);else{y0[1]=await O((t=e.hand.skeleton)==null?void 0:t.modelPath);let n=y0[1].executor?Object.values(y0[1].modelSignature.inputs):void 0;Ve[1][0]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[1].size):0,Ve[1][1]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[2].size):0}return y0[1]}async function WA(e,t){let n=[];if(!e||!y0[0])return n;let o={},r=(e.shape[2]||1)/(e.shape[1]||1),s=Math.min(Math.round((e.shape[1]||0)/8)*8,LA),A=Math.round(s*r/8)*8;o.resize=Q.image.resizeBilinear(e,[s,A]),o.cast=Q.cast(o.resize,"int32"),[o.rawScores,o.rawBoxes]=await y0[0].executeAsync(o.cast,IA),o.boxes=Q.squeeze(o.rawBoxes,[0,2]),o.scores=Q.squeeze(o.rawScores,[0]);let a=Q.unstack(o.scores,1);Q.dispose(a[qn]),a.splice(qn,1),o.filtered=Q.stack(a,1),Q.dispose(a),o.max=Q.max(o.filtered,1),o.argmax=Q.argMax(o.filtered,1);let l=0;o.nms=await Q.image.nonMaxSuppressionAsync(o.boxes,o.max,(t.hand.maxDetected||0)+1,t.hand.iouThreshold||0,t.hand.minConfidence||1);let c=await o.nms.data(),x=await o.max.data(),i=await o.argmax.data();for(let y of Array.from(c)){let d=Q.slice(o.boxes,y,1),p=await d.data();Q.dispose(d);let f=[p[1],p[0],p[3]-p[1],p[2]-p[0]],b=et(f,CA),M=[Math.trunc(f[0]*Me[0]),Math.trunc(f[1]*Me[1]),Math.trunc(f[2]*Me[0]),Math.trunc(f[3]*Me[1])],T=x[y],m=OA[i[y]],h={id:l++,score:T,box:M,boxRaw:b,label:m};n.push(h)}return Object.keys(o).forEach(y=>Q.dispose(o[y])),n.sort((y,d)=>d.score-y.score),n.length>(t.hand.maxDetected||1)&&(n.length=t.hand.maxDetected||1),n}async function J5(e,t,n){let o={id:t.id,score:Math.round(100*t.score)/100,boxScore:Math.round(100*t.score)/100,fingerScore:0,box:t.box,boxRaw:t.boxRaw,label:t.label,keypoints:[],landmarks:{},annotations:{}};if(e&&y0[1]&&n.hand.landmarks&&t.score>(n.hand.minConfidence||0)){let r={},s=[t.boxRaw[1],t.boxRaw[0],t.boxRaw[3]+t.boxRaw[1],t.boxRaw[2]+t.boxRaw[0]];r.crop=Q.image.cropAndResize(e,[s],[0],[Ve[1][0],Ve[1][1]],"bilinear"),r.div=Q.div(r.crop,C.tf255),[r.score,r.keypoints]=y0[1].execute(r.div,["Identity_1","Identity"]);let A=(await r.score.data())[0],a=(100-Math.trunc(100/(1+Math.exp(A))))/100;if(a>=(n.hand.minConfidence||0)){o.fingerScore=a,r.reshaped=Q.reshape(r.keypoints,[-1,3]);let x=(await r.reshaped.array()).map(i=>[i[0]/Ve[1][1],i[1]/Ve[1][0],i[2]||0]).map(i=>[i[0]*t.boxRaw[2],i[1]*t.boxRaw[3],i[2]||0]);o.keypoints=x.map(i=>[Me[0]*(i[0]+t.boxRaw[0]),Me[1]*(i[1]+t.boxRaw[1]),i[2]||0]),o.landmarks=gt(o.keypoints);for(let i of Object.keys(Yn))o.annotations[i]=Yn[i].map(y=>o.landmarks&&o.keypoints[y]?o.keypoints[y]:null)}Object.keys(r).forEach(l=>Q.dispose(r[l]))}return o}async function Q5(e,t){var r,s;if(!((r=y0[0])!=null&&r.executor)||!((s=y0[1])!=null&&s.executor)||!y0[0].inputs[0].shape||!y0[1].inputs[0].shape)return[];Me=[e.shape[2]||0,e.shape[1]||0],kt++;let n=(t.hand.skipTime||0)>g()-K5,o=kt<(t.hand.skipFrames||0);return t.skipAllowed&&n&&o?x0.hands:new Promise(async A=>{let a=3*(t.hand.skipTime||0)>g()-K5,l=kt<3*(t.hand.skipFrames||0);t.skipAllowed&&x0.hands.length===t.hand.maxDetected?x0.hands=await Promise.all(x0.boxes.map(x=>J5(e,x,t))):t.skipAllowed&&a&&l&&x0.hands.length>0?x0.hands=await Promise.all(x0.boxes.map(x=>J5(e,x,t))):(x0.boxes=await WA(e,t),K5=g(),x0.hands=await Promise.all(x0.boxes.map(x=>J5(e,x,t))),kt=0);let c=[...x0.boxes];if(x0.boxes.length=0,t.cacheSensitivity>0)for(let x=0;x.05&&i.box[3]/(e.shape[1]||1)>.05&&x0.hands[x].fingerScore&&x0.hands[x].fingerScore>(t.hand.minConfidence||0)){let y=et(i.box,Un),d=et(i.boxRaw,Un);x0.boxes.push({...c[x],box:y,boxRaw:d})}}for(let x=0;x({face:[],body:[],hand:[],gesture:[],object:[],persons:[],performance:{},timestamp:0,width:0,height:0,error:e});var I2={};we(I2,{connected:()=>Et,horizontal:()=>_5,kpt:()=>wt,relative:()=>e1,vertical:()=>$5});var wt=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],_5=[["leftEye","rightEye"],["leftEar","rightEar"],["leftShoulder","rightShoulder"],["leftElbow","rightElbow"],["leftWrist","rightWrist"],["leftHip","rightHip"],["leftKnee","rightKnee"],["leftAnkle","rightAnkle"]],$5=[["leftKnee","leftShoulder"],["rightKnee","rightShoulder"],["leftAnkle","leftKnee"],["rightAnkle","rightKnee"]],e1=[[["leftHip","rightHip"],["leftShoulder","rightShoulder"]],[["leftElbow","rightElbow"],["leftShoulder","rightShoulder"]]],Et={leftLeg:["leftHip","leftKnee","leftAnkle"],rightLeg:["rightHip","rightKnee","rightAnkle"],torso:["leftShoulder","rightShoulder","rightHip","leftHip","leftShoulder"],leftArm:["leftShoulder","leftElbow","leftWrist"],rightArm:["rightShoulder","rightElbow","rightWrist"],head:[]};var w=ue(),t1=0;function _n(e,t){var A,a,l,c,x,i,y,d,p,f,b,M,T,m,h,S,P,I,q,t0,G,$,s0;let n=g();if(!e)return ue();let o=Date.now()-e.timestamp,r=o<1e3?8-Math.log(o+1):1;if(e.canvas&&(w.canvas=e.canvas),e.error&&(w.error=e.error),!w.body||e.body.length!==w.body.length)w.body=JSON.parse(JSON.stringify(e.body));else for(let R=0;R((r-1)*w.body[R].box[X]+B)/r),b0=e.body[R].boxRaw.map((B,X)=>((r-1)*w.body[R].boxRaw[X]+B)/r),U=e.body[R].keypoints.map((B,X)=>{var z,$0,Pe,ke,T0,M2,g1,T1,v1;return{score:B.score,part:B.part,position:[w.body[R].keypoints[X]?((r-1)*(w.body[R].keypoints[X].position[0]||0)+(B.position[0]||0))/r:B.position[0],w.body[R].keypoints[X]?((r-1)*(w.body[R].keypoints[X].position[1]||0)+(B.position[1]||0))/r:B.position[1],w.body[R].keypoints[X]?((r-1)*(w.body[R].keypoints[X].position[2]||0)+(B.position[2]||0))/r:B.position[2]],positionRaw:[w.body[R].keypoints[X]?((r-1)*(w.body[R].keypoints[X].positionRaw[0]||0)+(B.positionRaw[0]||0))/r:B.positionRaw[0],w.body[R].keypoints[X]?((r-1)*(w.body[R].keypoints[X].positionRaw[1]||0)+(B.positionRaw[1]||0))/r:B.positionRaw[1],w.body[R].keypoints[X]?((r-1)*(w.body[R].keypoints[X].positionRaw[2]||0)+(B.positionRaw[2]||0))/r:B.positionRaw[2]],distance:[w.body[R].keypoints[X]?((r-1)*(((z=w.body[R].keypoints[X].distance)==null?void 0:z[0])||0)+((($0=B.distance)==null?void 0:$0[0])||0))/r:(Pe=B.distance)==null?void 0:Pe[0],w.body[R].keypoints[X]?((r-1)*(((ke=w.body[R].keypoints[X].distance)==null?void 0:ke[1])||0)+(((T0=B.distance)==null?void 0:T0[1])||0))/r:(M2=B.distance)==null?void 0:M2[1],w.body[R].keypoints[X]?((r-1)*(((g1=w.body[R].keypoints[X].distance)==null?void 0:g1[2])||0)+(((T1=B.distance)==null?void 0:T1[2])||0))/r:(v1=B.distance)==null?void 0:v1[2]]}}),g0={},f0={connected:{}};(A=t.body.modelPath)!=null&&A.includes("efficientpose")?f0=ot:(a=t.body.modelPath)!=null&&a.includes("blazepose")?f0=_2:(l=t.body.modelPath)!=null&&l.includes("movenet")&&(f0=I2);for(let[B,X]of Object.entries(f0.connected)){let z=[];for(let $0=0;$0T0.part===X[$0]),ke=U.find(T0=>T0.part===X[$0+1]);Pe&&ke&&z.push([Pe.position,ke.position])}g0[B]=z}w.body[R]={...e.body[R],box:Z,boxRaw:b0,keypoints:U,annotations:g0}}if(!w.hand||e.hand.length!==w.hand.length)w.hand=JSON.parse(JSON.stringify(e.hand));else for(let R=0;R((r-1)*w.hand[R].box[B]+f0)/r),b0=e.hand[R].boxRaw.map((f0,B)=>((r-1)*w.hand[R].boxRaw[B]+f0)/r);w.hand[R].keypoints.length!==e.hand[R].keypoints.length&&(w.hand[R].keypoints=e.hand[R].keypoints);let U=e.hand[R].keypoints&&e.hand[R].keypoints.length>0?e.hand[R].keypoints.map((f0,B)=>f0.map((X,z)=>((r-1)*(w.hand[R].keypoints[B][z]||1)+(X||0))/r)):[],g0={};if(Object.keys(w.hand[R].annotations).length!==Object.keys(e.hand[R].annotations).length)w.hand[R].annotations=e.hand[R].annotations,g0=w.hand[R].annotations;else if(e.hand[R].annotations)for(let f0 of Object.keys(e.hand[R].annotations))g0[f0]=(i=(x=(c=e.hand[R])==null?void 0:c.annotations)==null?void 0:x[f0])!=null&&i[0]?e.hand[R].annotations[f0].map((B,X)=>B.map((z,$0)=>((r-1)*w.hand[R].annotations[f0][X][$0]+z)/r)):null;w.hand[R]={...e.hand[R],box:Z,boxRaw:b0,keypoints:U,annotations:g0}}if(!w.face||e.face.length!==w.face.length)w.face=JSON.parse(JSON.stringify(e.face));else for(let R=0;R((r-1)*w.face[R].box[g0]+U)/r),b0=e.face[R].boxRaw.map((U,g0)=>((r-1)*w.face[R].boxRaw[g0]+U)/r);if(e.face[R].rotation){let U={matrix:[0,0,0,0,0,0,0,0,0],angle:{roll:0,yaw:0,pitch:0},gaze:{bearing:0,strength:0}};U.matrix=(y=e.face[R].rotation)==null?void 0:y.matrix,U.angle={roll:((r-1)*(((p=(d=w.face[R].rotation)==null?void 0:d.angle)==null?void 0:p.roll)||0)+(((b=(f=e.face[R].rotation)==null?void 0:f.angle)==null?void 0:b.roll)||0))/r,yaw:((r-1)*(((T=(M=w.face[R].rotation)==null?void 0:M.angle)==null?void 0:T.yaw)||0)+(((h=(m=e.face[R].rotation)==null?void 0:m.angle)==null?void 0:h.yaw)||0))/r,pitch:((r-1)*(((P=(S=w.face[R].rotation)==null?void 0:S.angle)==null?void 0:P.pitch)||0)+(((q=(I=e.face[R].rotation)==null?void 0:I.angle)==null?void 0:q.pitch)||0))/r},U.gaze={bearing:((r-1)*(((t0=w.face[R].rotation)==null?void 0:t0.gaze.bearing)||0)+(((G=e.face[R].rotation)==null?void 0:G.gaze.bearing)||0))/r,strength:((r-1)*((($=w.face[R].rotation)==null?void 0:$.gaze.strength)||0)+(((s0=e.face[R].rotation)==null?void 0:s0.gaze.strength)||0))/r},w.face[R]={...e.face[R],rotation:U,box:Z,boxRaw:b0}}else w.face[R]={...e.face[R],box:Z,boxRaw:b0}}if(!w.object||e.object.length!==w.object.length)w.object=JSON.parse(JSON.stringify(e.object));else for(let R=0;R((r-1)*w.object[R].box[g0]+U)/r),b0=e.object[R].boxRaw.map((U,g0)=>((r-1)*w.object[R].boxRaw[g0]+U)/r);w.object[R]={...e.object[R],box:Z,boxRaw:b0}}if(e.persons){let R=e.persons;if(!w.persons||R.length!==w.persons.length)w.persons=JSON.parse(JSON.stringify(R));else for(let Z=0;Z((r-1)*w.persons[Z].box[U]+b0)/r)}e.gesture&&(w.gesture=e.gesture),w.width=e.width,w.height=e.height;let s=g();return t1=v.perfadd?t1+Math.round(s-n):Math.round(s-n),e.performance&&(w.performance={...e.performance,interpolate:t1}),w}var r0=V(H());var j0;async function n1(e){return!j0||v.initial?j0=await O(e.segmentation.modelPath):e.debug&&u("cached model:",j0.modelUrl),j0}async function $n(e,t){var r;if(j0||(j0=await n1(t)),!(j0!=null&&j0.executor)||!((r=j0==null?void 0:j0.inputs)!=null&&r[0].shape))return null;let n={};n.resize=r0.image.resizeBilinear(e,[j0.inputs[0].shape?j0.inputs[0].shape[1]:0,j0.inputs[0].shape?j0.inputs[0].shape[2]:0],!1),n.norm=r0.div(n.resize,C.tf255),n.res=j0.execute(n.norm),n.squeeze=r0.squeeze(n.res,[0]),[n.bgRaw,n.fgRaw]=r0.unstack(n.squeeze,2),n.fg=r0.softmax(n.fgRaw),n.mul=r0.mul(n.fg,C.tf255),n.expand=r0.expandDims(n.mul,2),n.output=r0.image.resizeBilinear(n.expand,[e.shape[1]||0,e.shape[2]||0]);let o;switch(t.segmentation.mode||"default"){case"default":n.input=r0.squeeze(e),n.concat=r0.concat([n.input,n.output],-1),o=r0.cast(n.concat,"int32");break;case"alpha":o=r0.cast(n.output,"int32");break;default:o=r0.tensor(0)}return Object.keys(n).forEach(s=>r0.dispose(n[s])),o}var zt={};we(zt,{distance:()=>o1,find:()=>BA,similarity:()=>FA});function o1(e,t,n={order:2,multiplier:25}){if(!e||!e)return Number.MAX_SAFE_INTEGER;let o=0;for(let r=0;r{if(e===0)return 1;let s=(1-(t===2?Math.sqrt(e):e**(1/t))/100-n)/(o-n);return Math.max(Math.min(s,1),0)};function FA(e,t,n={order:2,multiplier:25,min:.2,max:.8}){let o=o1(e,t,n);return to(o,n.order||2,n.min||0,n.max||1)}function BA(e,t,n={order:2,multiplier:25,threshold:0,min:.2,max:.8}){if(!Array.isArray(e)||!Array.isArray(t)||e.length<64||t.length===0)return{index:-1,distance:Number.POSITIVE_INFINITY,similarity:0};let o=Number.MAX_SAFE_INTEGER,r=-1;for(let A=0;AC2,validateModel:()=>Ct});var Ao=V(H());var Ze=V(H());var no=.005,U0={keypoints:[],padding:[[0,0],[0,0],[0,0],[0,0]]};function r1(e){for(let t of _5){let n=e.keypoints.findIndex(r=>r.part===t[0]),o=e.keypoints.findIndex(r=>r.part===t[1]);if(e.keypoints[n]&&e.keypoints[o]&&e.keypoints[n].position[0]r&&r.part===t[0]),o=e.keypoints.findIndex(r=>r&&r.part===t[1]);e.keypoints[n]&&e.keypoints[o]&&e.keypoints[n].position[1]c&&c.part===t[0]),r=e.keypoints.findIndex(c=>c&&c.part===t[1]),s=e.keypoints.findIndex(c=>c&&c.part===n[0]),A=e.keypoints.findIndex(c=>c&&c.part===n[1]);if(!e.keypoints[s]||!e.keypoints[A])continue;let a=e.keypoints[o]?[Math.abs(e.keypoints[s].position[0]-e.keypoints[o].position[0]),Math.abs(e.keypoints[A].position[0]-e.keypoints[o].position[0])]:[0,0],l=e.keypoints[r]?[Math.abs(e.keypoints[A].position[0]-e.keypoints[r].position[0]),Math.abs(e.keypoints[s].position[0]-e.keypoints[r].position[0])]:[0,0];if(a[0]>a[1]||l[0]>l[1]){let c=e.keypoints[o];e.keypoints[o]=e.keypoints[r],e.keypoints[r]=c}}}function oo(e){for(let t=0;te.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0,e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0],[e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0,e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0],[0,0]],n.pad=Ze.pad(e,U0.padding),n.resize=Ze.image.resizeBilinear(n.pad,[t,t]);let o=Ze.cast(n.resize,"int32");return Object.keys(n).forEach(A=>Ze.dispose(n[A])),o}function so(e,t){e.keypoints=e.keypoints.filter(o=>o==null?void 0:o.position);for(let o of e.keypoints)o.position=[o.position[0]*(t[0]+U0.padding[2][0]+U0.padding[2][1])/t[0]-U0.padding[2][0],o.position[1]*(t[1]+U0.padding[1][0]+U0.padding[1][1])/t[1]-U0.padding[1][0]],o.positionRaw=[o.position[0]/t[0],o.position[1]/t[1]];let n=ge(e.keypoints.map(o=>o.position),t);return e.box=n.box,e.boxRaw=n.boxRaw,e}var u0,St=0,s1=Number.MAX_SAFE_INTEGER,a2={boxes:[],bodies:[],last:0};async function ao(e){var t;return v.initial&&(u0=null),u0?e.debug&&u("cached model:",u0.modelUrl):(X2(["size"],e),u0=await O(e.body.modelPath)),St=(u0==null?void 0:u0.executor)&&((t=u0==null?void 0:u0.inputs)==null?void 0:t[0].shape)?u0.inputs[0].shape[2]:0,St<64&&(St=256),u0}function GA(e,t,n){let o=e[0][0],r=[],s=0;for(let x=0;xt.body.minConfidence){let i=[o[x][1],o[x][0]];r.push({score:Math.round(100*s)/100,part:wt[x],positionRaw:i,position:[Math.round((n.shape[2]||0)*i[0]),Math.round((n.shape[1]||0)*i[1])]})}s=r.reduce((x,i)=>i.score>x?i.score:x,0);let A=[],a=ge(r.map(x=>x.position),[n.shape[2],n.shape[1]]),l={};for(let[x,i]of Object.entries(Et)){let y=[];for(let d=0;db.part===i[d]),f=r.find(b=>b.part===i[d+1]);p&&f&&p.score>(t.body.minConfidence||0)&&f.score>(t.body.minConfidence||0)&&y.push([p.position,f.position])}l[x]=y}let c={id:0,score:s,box:a.box,boxRaw:a.boxRaw,keypoints:r,annotations:l};return r1(c),A.push(c),A}function VA(e,t,n){let o=[];for(let r=0;rt.body.minConfidence){let a=[];for(let i=0;i<17;i++){let y=s[3*i+2];if(y>t.body.minConfidence){let d=[s[3*i+1],s[3*i+0]];a.push({part:wt[i],score:Math.round(100*y)/100,positionRaw:d,position:[Math.round((n.shape[2]||0)*d[0]),Math.round((n.shape[1]||0)*d[1])]})}}let l=ge(a.map(i=>i.position),[n.shape[2],n.shape[1]]),c={};for(let[i,y]of Object.entries(Et)){let d=[];for(let p=0;pM.part===y[p]),b=a.find(M=>M.part===y[p+1]);f&&b&&f.score>(t.body.minConfidence||0)&&b.score>(t.body.minConfidence||0)&&d.push([f.position,b.position])}c[i]=d}let x={id:r,score:A,box:l.box,boxRaw:l.boxRaw,keypoints:[...a],annotations:c};r1(x),o.push(x)}}return o.sort((r,s)=>s.score-r.score),o.length>t.body.maxDetected&&(o.length=t.body.maxDetected),o}async function A1(e,t){var r;if(!(u0!=null&&u0.executor)||!((r=u0==null?void 0:u0.inputs)!=null&&r[0].shape))return[];t.skipAllowed||(a2.boxes.length=0),s1++;let n=(t.body.skipTime||0)>g()-a2.last,o=s1<(t.body.skipFrames||0);return t.skipAllowed&&n&&o?a2.bodies:new Promise(async s=>{let A={};s1=0,A.input=ro(e,St),A.res=u0==null?void 0:u0.execute(A.input),a2.last=g();let a=await A.res.array();a2.bodies=A.res.shape[2]===17?GA(a,t,e):VA(a,t,e);for(let l of a2.bodies)so(l,[e.shape[2]||1,e.shape[1]||1]),oo(l.keypoints);Object.keys(A).forEach(l=>Ao.dispose(A[l])),s(a2.bodies)})}var w0=V(H());var se,jt=[],lo=0,a1=Number.MAX_SAFE_INTEGER,It=0,Nt=2.5;async function co(e){if(!se||v.initial){se=await O(e.object.modelPath);let t=se!=null&&se.executor?Object.values(se.modelSignature.inputs):void 0;It=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):416}else e.debug&&u("cached model:",se.modelUrl);return se}async function ZA(e,t,n){var c,x;let o=0,r=[],s=It;for(let i of[1,2,4]){let y=i*13,d=w0.squeeze(e.find(m=>m.shape[1]===y**2&&(m.shape[2]||0)===d2.length)),p=await d.array(),f=w0.squeeze(e.find(m=>m.shape[1]===y**2&&(m.shape[2]||0)(n.object.minConfidence||0)&&h!==61){let P=(.5+Math.trunc(m%y))/y,I=(.5+Math.trunc(m/y))/y,q=T[m].map(U=>U*(y/i/s)),[t0,G]=[P-Nt/i*q[0],I-Nt/i*q[1]],[$,s0]=[P+Nt/i*q[2]-t0,I+Nt/i*q[3]-G],R=[t0,G,$,s0];R=R.map(U=>Math.max(0,Math.min(U,1)));let Z=[R[0]*t[0],R[1]*t[1],R[2]*t[0],R[3]*t[1]],b0={id:o++,score:Math.round(100*S)/100,class:h+1,label:d2[h].label,box:Z.map(U=>Math.trunc(U)),boxRaw:R};r.push(b0)}}w0.dispose([d,f,b,M])}let A=r.map(i=>[i.boxRaw[1],i.boxRaw[0],i.boxRaw[3],i.boxRaw[2]]),a=r.map(i=>i.score),l=[];if(A&&A.length>0){let i=await w0.image.nonMaxSuppressionAsync(A,a,n.object.maxDetected||0,n.object.iouThreshold,n.object.minConfidence);l=Array.from(await i.data()),w0.dispose(i)}return r=r.filter((i,y)=>l.includes(y)).sort((i,y)=>y.score-i.score),r}async function i1(e,t){if(!(se!=null&&se.executor))return[];let n=(t.object.skipTime||0)>g()-lo,o=a1<(t.object.skipFrames||0);return t.skipAllowed&&n&&o&&jt.length>0?(a1++,jt):(a1=0,!v.kernels.includes("mod")||!v.kernels.includes("sparsetodense")?jt:new Promise(async r=>{let s=[e.shape[2]||0,e.shape[1]||0],A=w0.image.resizeBilinear(e,[It,It],!1),a=w0.div(A,C.tf255),l=w0.transpose(a,[0,3,1,2]),c;t.object.enabled&&(c=se.execute(l)),lo=g();let x=await ZA(c,s,t);jt=x,w0.dispose([A,a,l,...c]),r(x)}))}var D0=V(H());var L2=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],XA=L2.length,O2=L2.reduce((e,t,n)=>(e[t]=n,e),{}),qA=[["leftHip","leftShoulder"],["leftElbow","leftShoulder"],["leftElbow","leftWrist"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["rightHip","rightShoulder"],["rightElbow","rightShoulder"],["rightElbow","rightWrist"],["rightHip","rightKnee"],["rightKnee","rightAnkle"],["leftShoulder","rightShoulder"],["leftHip","rightHip"]],Li=qA.map(([e,t])=>[O2[e],O2[t]]),yo=[["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 fo(e){let t=e.reduce(({maxX:n,maxY:o,minX:r,minY:s},{position:{x:A,y:a}})=>({maxX:Math.max(n,A),maxY:Math.max(o,a),minX:Math.min(r,A),minY:Math.min(s,a)}),{maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY,minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY});return[t.minX,t.minY,t.maxX-t.minX,t.maxY-t.minY]}function mo(e,[t,n],[o,r]){let s=t/o,A=n/r,a=(c,x)=>({id:x,score:c.score,boxRaw:[c.box[0]/r,c.box[1]/o,c.box[2]/r,c.box[3]/o],box:[Math.trunc(c.box[0]*A),Math.trunc(c.box[1]*s),Math.trunc(c.box[2]*A),Math.trunc(c.box[3]*s)],keypoints:c.keypoints.map(({score:i,part:y,position:d})=>({score:i,part:y,position:[Math.trunc(d.x*A),Math.trunc(d.y*s)],positionRaw:[d.x/o,d.y/o]})),annotations:{}});return e.map((c,x)=>a(c,x))}var Ot=class{constructor(t,n){k(this,"priorityQueue");k(this,"numberOfElements");k(this,"getElementValue");this.priorityQueue=new Array(t),this.numberOfElements=-1,this.getElementValue=n}enqueue(t){this.priorityQueue[++this.numberOfElements]=t,this.swim(this.numberOfElements)}dequeue(){let t=this.priorityQueue[0];return this.exchange(0,this.numberOfElements--),this.sink(0),this.priorityQueue[this.numberOfElements+1]=null,t}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(t){for(;t>0&&this.less(Math.floor(t/2),t);)this.exchange(t,Math.floor(t/2)),t=Math.floor(t/2)}sink(t){for(;2*t<=this.numberOfElements;){let n=2*t;if(nn?n:e}function po(e,t,n,o){let r=n-e,s=o-t;return r*r+s*s}function x1(e,t){return{x:e.x+t.x,y:e.y+t.y}}var Y0,YA=["MobilenetV1/offset_2/BiasAdd","MobilenetV1/heatmap_2/BiasAdd","MobilenetV1/displacement_fwd_2/BiasAdd","MobilenetV1/displacement_bwd_2/BiasAdd"],Lt=1,v2=16,KA=50**2;function uo(e,t,n,o,r,s,A=2){let a=M=>({y:s.get(M.y,M.x,e),x:s.get(M.y,M.x,s.shape[2]/2+e)}),l=(M,T,m)=>({y:d1(Math.round(M.y/v2),0,T-1),x:d1(Math.round(M.x/v2),0,m-1)}),[c,x]=o.shape,i=l(t.position,c,x),y=a(i),p=x1(t.position,y);for(let M=0;M[O2[y],O2[d]]),A=s.map(([,y])=>y),a=s.map(([y])=>y),l=t.shape[2],c=A.length,x=new Array(l),i=c1(e.part,v2,n);x[e.part.id]={score:e.score,part:L2[e.part.id],position:i};for(let y=c-1;y>=0;--y){let d=A[y],p=a[y];x[d]&&!x[p]&&(x[p]=uo(y,x[d],p,t,n,r))}for(let y=0;yt){a=!1;break}if(!a)break}return a}function _A(e,t){let[n,o,r]=t.shape,s=new Ot(n*o*r,({score:A})=>A);for(let A=0;A{var A;let s=(A=r[o])==null?void 0:A.position;return s?po(n,t,s.y,s.x)<=KA:!1})}function $A(e,t){return t.reduce((o,{position:r,score:s},A)=>(ho(e,r,A)||(o+=s),o),0)/t.length}function e4(e,t,n,o,r,s){let A=[],a=_A(s,t);for(;A.lengthd.score>s);let i=$A(A,x),y=fo(x);i>s&&A.push({keypoints:x,box:y,score:Math.round(100*i)/100})}return A}async function y1(e,t){if(!(Y0!=null&&Y0.executor))return[];let n=D0.tidy(()=>{if(!Y0.inputs[0].shape)return[];let A=D0.image.resizeBilinear(e,[Y0.inputs[0].shape[2],Y0.inputs[0].shape[1]]),a=D0.sub(D0.div(D0.cast(A,"float32"),127.5),1),c=Y0.execute(a,YA).map(x=>D0.squeeze(x,[0]));return c[1]=D0.sigmoid(c[1]),c}),o=await Promise.all(n.map(A=>A.buffer()));for(let A of n)D0.dispose(A);let r=e4(o[0],o[1],o[2],o[3],t.body.maxDetected,t.body.minConfidence);return Y0.inputs[0].shape?mo(r,[e.shape[1],e.shape[2]],[Y0.inputs[0].shape[2],Y0.inputs[0].shape[1]]):[]}async function bo(e){return!Y0||v.initial?Y0=await O(e.body.modelPath):e.debug&&u("cached model:",Y0.modelUrl),Y0}var F=V(H());var he,t4=["fgr","pha","r1o","r2o","r3o","r4o"],h0={},m1=0;function vo(e){F.dispose([h0.r1i,h0.r2i,h0.r3i,h0.r4i,h0.downsample_ratio]),h0.r1i=F.tensor(0),h0.r2i=F.tensor(0),h0.r3i=F.tensor(0),h0.r4i=F.tensor(0),m1=e.segmentation.ratio||.5,h0.downsample_ratio=F.tensor(m1)}async function p1(e){return!he||v.initial?he=await O(e.segmentation.modelPath):e.debug&&u("cached model:",he.modelUrl),vo(e),he}var To=e=>F.tidy(()=>{let t=F.squeeze(e,[0]),n=F.mul(t,C.tf255);return F.cast(n,"int32")});function f1(e,t){let n=e?To(e):F.fill([t.shape[1]||0,t.shape[2]||0,3],255,"int32"),o=t?To(t):F.fill([e.shape[1]||0,e.shape[2]||0,1],255,"int32"),r=F.concat([n,o],-1);return F.dispose([n,o]),r}function n4(e){return F.tidy(()=>{let t={};return t.unstack=F.unstack(e,-1),t.concat=F.concat(t.unstack,1),t.split=F.split(t.concat,4,1),t.stack=F.concat(t.split,2),t.squeeze=F.squeeze(t.stack,[0]),t.expand=F.expandDims(t.squeeze,-1),t.add=F.add(t.expand,1),t.mul=F.mul(t.add,127.5),t.cast=F.cast(t.mul,"int32"),t.tile=F.tile(t.cast,[1,1,3]),t.alpha=F.fill([t.tile.shape[0]||0,t.tile.shape[1]||0,1],255,"int32"),F.concat([t.tile,t.alpha],-1)})}async function Ro(e,t){if(he||(he=await p1(t)),!(he!=null&&he.executor))return null;h0.src=F.div(e,255),m1!==t.segmentation.ratio&&vo(t);let[n,o,r,s,A,a]=await he.executeAsync(h0,t4),l;switch(t.segmentation.mode||"default"){case"default":l=f1(n,o);break;case"alpha":l=f1(null,o);break;case"foreground":l=f1(n,null);break;case"state":l=n4(r);break;default:l=F.tensor(0)}return F.dispose([h0.src,n,o,h0.r1i,h0.r2i,h0.r3i,h0.r4i]),[h0.r1i,h0.r2i,h0.r3i,h0.r4i]=[r,s,A,a],l}var k0=V(H());var N0;async function u1(e){return!N0||v.initial?N0=await O(e.segmentation.modelPath):e.debug&&u("cached model:",N0.modelUrl),N0}async function Po(e,t){var r;if(N0||(N0=await u1(t)),!(N0!=null&&N0.executor)||!((r=N0==null?void 0:N0.inputs)!=null&&r[0].shape))return null;let n={};n.resize=k0.image.resizeBilinear(e,[N0.inputs[0].shape?N0.inputs[0].shape[1]:0,N0.inputs[0].shape?N0.inputs[0].shape[2]:0],!1),n.norm=k0.div(n.resize,C.tf255),n.res=N0.execute(n.norm),n.squeeze=k0.squeeze(n.res,[0]),n.alpha=k0.image.resizeBilinear(n.squeeze,[e.shape[1]||0,e.shape[2]||0]),n.mul=k0.mul(n.alpha,C.tf255);let o;switch(t.segmentation.mode||"default"){case"default":n.input=k0.squeeze(e),n.concat=k0.concat([n.input,n.mul],-1),o=k0.cast(n.concat,"int32");break;case"alpha":o=k0.cast(n.mul,"int32");break;default:o=k0.tensor(0)}return Object.keys(n).forEach(s=>k0.dispose(n[s])),o}function Ct(e,t,n){var c,x;if(!t||!((c=e==null?void 0:e.config)!=null&&c.validateModels))return null;let o=["const","placeholder","noop","pad","squeeze","add","sub","mul","div"],r=["biasadd","fusedbatchnormv3","matmul","switch","shape","merge","split","broadcastto"],s=[],A=[],a=t.modelUrl,l=t.executor;if((x=l==null?void 0:l.graph)!=null&&x.nodes)for(let i of Object.values(l.graph.nodes)){let y=i.op.toLowerCase();s.includes(y)||s.push(y)}else!l&&e.config.debug&&u("model not loaded",n);for(let i of s)!o.includes(i)&&!r.includes(i)&&!e.env.kernels.includes(i)&&!e.env.kernels.includes(i.replace("_",""))&&!e.env.kernels.includes(i.replace("native",""))&&!e.env.kernels.includes(i.replace("v2",""))&&A.push(i);return e.config.debug&&A.length>0&&u("model validation failed:",n,A),A.length>0?{name:n,missing:A,ops:s,url:a}:null}var C2=class{constructor(t){k(this,"instance");k(this,"models");this.models={},this.instance=t}stats(){let t=0,n=0,o=0;for(let s of Object.values(E0))t+=s.sizeFromManifest,n+=s.sizeLoadedWeights,o+=s.sizeDesired;let r=o>0?n/o:0;return{numLoadedModels:Object.values(E0).length,numDefinedModels:Object.keys(this.models).length,percentageLoaded:r,totalSizeFromManifest:t,totalSizeWeights:n,totalSizeLoading:o,modelStats:Object.values(E0)}}reset(){for(let t of Object.keys(this.models))this.models[t]=null}async load(){var n,o,r,s,A,a,l,c,x,i,y,d,p,f,b,M,T,m,h,S,P,I,q,t0,G,$,s0;v.initial&&this.reset();let t={};t.blazeface=this.instance.config.face.enabled&&!this.models.blazeface?p3(this.instance.config):null,t.antispoof=this.instance.config.face.enabled&&((n=this.instance.config.face.antispoof)==null?void 0:n.enabled)&&!this.models.antispoof?H3(this.instance.config):null,t.liveness=this.instance.config.face.enabled&&((o=this.instance.config.face.liveness)==null?void 0:o.enabled)&&!this.models.liveness?X3(this.instance.config):null,t.faceres=this.instance.config.face.enabled&&((r=this.instance.config.face.description)==null?void 0:r.enabled)&&!this.models.faceres?C3(this.instance.config):null,t.emotion=this.instance.config.face.enabled&&((s=this.instance.config.face.emotion)==null?void 0:s.enabled)&&!this.models.emotion?N3(this.instance.config):null,t.iris=this.instance.config.face.enabled&&((A=this.instance.config.face.iris)==null?void 0:A.enabled)&&!((a=this.instance.config.face.attention)!=null&&a.enabled)&&!this.models.iris?v3(this.instance.config):null,t.facemesh=this.instance.config.face.enabled&&((l=this.instance.config.face.mesh)==null?void 0:l.enabled)&&!this.models.facemesh?w3(this.instance.config):null,t.gear=this.instance.config.face.enabled&&((c=this.instance.config.face.gear)==null?void 0:c.enabled)&&!this.models.gear?K3(this.instance.config):null,t.ssrnetage=this.instance.config.face.enabled&&((x=this.instance.config.face.ssrnet)==null?void 0:x.enabled)&&!this.models.ssrnetage?$3(this.instance.config):null,t.ssrnetgender=this.instance.config.face.enabled&&((i=this.instance.config.face.ssrnet)==null?void 0:i.enabled)&&!this.models.ssrnetgender?on(this.instance.config):null,t.mobilefacenet=this.instance.config.face.enabled&&((y=this.instance.config.face.mobilefacenet)==null?void 0:y.enabled)&&!this.models.mobilefacenet?ln(this.instance.config):null,t.insightface=this.instance.config.face.enabled&&((d=this.instance.config.face.insightface)==null?void 0:d.enabled)&&!this.models.insightface?fn(this.instance.config):null,t.blazepose=this.instance.config.body.enabled&&!this.models.blazepose&&((p=this.instance.config.body.modelPath)==null?void 0:p.includes("blazepose"))?_1(this.instance.config):null,t.blazeposedetect=this.instance.config.body.enabled&&!this.models.blazeposedetect&&this.instance.config.body.detector&&this.instance.config.body.detector.modelPath?Q1(this.instance.config):null,t.efficientpose=this.instance.config.body.enabled&&!this.models.efficientpose&&((f=this.instance.config.body.modelPath)==null?void 0:f.includes("efficientpose"))?r3(this.instance.config):null,t.movenet=this.instance.config.body.enabled&&!this.models.movenet&&((b=this.instance.config.body.modelPath)==null?void 0:b.includes("movenet"))?ao(this.instance.config):null,t.posenet=this.instance.config.body.enabled&&!this.models.posenet&&((M=this.instance.config.body.modelPath)==null?void 0:M.includes("posenet"))?bo(this.instance.config):null,t.handtrack=this.instance.config.hand.enabled&&!this.models.handtrack&&((m=(T=this.instance.config.hand.detector)==null?void 0:T.modelPath)==null?void 0:m.includes("handtrack"))?Kn(this.instance.config):null,t.handskeleton=this.instance.config.hand.enabled&&this.instance.config.hand.landmarks&&!this.models.handskeleton&&((S=(h=this.instance.config.hand.detector)==null?void 0:h.modelPath)==null?void 0:S.includes("handtrack"))?Jn(this.instance.config):null,(I=(P=this.instance.config.hand.detector)==null?void 0:P.modelPath)!=null&&I.includes("handdetect")&&([t.handpose,t.handskeleton]=this.models.handpose?[null,null]:await Zn(this.instance.config)),t.centernet=this.instance.config.object.enabled&&!this.models.centernet&&((q=this.instance.config.object.modelPath)==null?void 0:q.includes("centernet"))?t3(this.instance.config):null,t.nanodet=this.instance.config.object.enabled&&!this.models.nanodet&&((t0=this.instance.config.object.modelPath)==null?void 0:t0.includes("nanodet"))?co(this.instance.config):null,t.selfie=this.instance.config.segmentation.enabled&&!this.models.selfie&&((G=this.instance.config.segmentation.modelPath)==null?void 0:G.includes("selfie"))?u1(this.instance.config):null,t.meet=this.instance.config.segmentation.enabled&&!this.models.meet&&(($=this.instance.config.segmentation.modelPath)==null?void 0:$.includes("meet"))?n1(this.instance.config):null,t.rvm=this.instance.config.segmentation.enabled&&!this.models.rvm&&((s0=this.instance.config.segmentation.modelPath)==null?void 0:s0.includes("rvm"))?p1(this.instance.config):null,await Promise.all([...Object.values(t)]);for(let R of Object.keys(t))this.models[R]=t[R]||this.models[R]||null}list(){let t=Object.keys(this.models).map(n=>{var o;return{name:n,loaded:this.models[n]!==null,size:0,url:this.models[n]?(o=this.models[n])==null?void 0:o.modelUrl:null}});for(let n of t){let o=Object.keys(E0).find(r=>r.startsWith(n.name));!o||(n.size=E0[o].sizeLoadedWeights,n.url=E0[o].url)}return t}loaded(){return this.list().filter(o=>o.loaded).map(o=>o.name)}validate(){let t=[];for(let n of Object.keys(this.models)){let o=this.models[n];if(!o)continue;let r=Ct(this.instance,o,n);r&&t.push(r)}return t}};function wo(e,t,n,o,r){var a,l,c,x,i,y;let s=0,A=[];for(let d of e){let p={id:s++,face:d,body:null,hands:{left:null,right:null},gestures:[],box:[0,0,0,0]};for(let h of t)d.box[0]>h.box[0]&&d.box[0]h.box[1]&&d.box[1]+d.box[3]p.body.box[0]&&h.box[0]+h.box[2]p.body.box[1]&&h.box[1]+h.box[3]p.body.box[0]&&h.box[1]+h.box[3]>p.body.box[1]&&h.box[1]+h.box[3]{h&&h.length===4&&(f.push(h[0],h[0]+h[2]),b.push(h[1],h[1]+h[3]))};M(p.face.box),M((x=p.body)==null?void 0:x.box),M((i=p.hands.left)==null?void 0:i.box),M((y=p.hands.right)==null?void 0:y.box);let T=Math.min(...f),m=Math.min(...b);p.box=[T,m,Math.max(...f)-T,Math.max(...b)-m],(r==null?void 0:r[1])&&(r==null?void 0:r[2])&&(p.boxRaw=[p.box[0]/r[2],p.box[1]/r[1],p.box[2]/r[2],p.box[3]/r[1]]),A.push(p)}return A}var c0=V(H());var Wt=` +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`,Dt=` +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 +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAa2p1UYo5adbz+xbxMlvqJ1OqjDHLXree0ejmzNrWm953tPmTPWbWneZ7yoy5YhjrXXTjH8s75N +mtkyxt0VZM2/m175N1V03yTKubMLXVXybeYLLX2VXy7eam+b0bOg4VquJW+rry4/O9uyZOq3UjVm +9r25axMzPaIdvhns1kzbZddM0p5Y47z8/R2+HcF03Doi1a8+Xzvbv+TotJnjDXkt+K8ODHp8cY8N +IpSO0RCwF2YAAAAAAAAACvUZYw6fJkntWN3k8dfHz2vLucdz8mkjFE9bz1+UOZosX1UzPm0nqI/W +MYo9FlcPNklfFGeH/NshLGun+Cz6PtHZtVZWlRLS+jxPkRpIn7rdoupHTdA5s6SI+7H6Mfo+32Y2 ++To3neSIiZ7A0IjPXpXLePlMotGW3272t85datKzHZjbTVnsDj+FG/2Y/RlGP4R+jo20u7H6N1Ql +o+H8I/REY957R+jpfReiK6eOYHLtj2tttH6KrY/6Y/R2c+kjeJiFVtLG24hxpw7/AHY/RRkw9O37 +O99Hrt1YX0tfOBLjcGp4XF8c+u8fs9c4dcVcGemSI61nd3IneN1orQAAAAAAAAAAAAABFqxes1tE +TE9JiUgPKcX4RbRXnNgiZwWnrH4XPi28PdXpW9JraImsxtMS8pxXhF9DecuGJtgmf+1TWW2N/la1 +L7N7T5e3Vy6W3hsYcvLbqzbO9jvvCzvDR0+XeO7crO6FmGSvRThy/RtVXJ92elvk2rRvDUzU7pl4 +izsd2J3jeBpcNz+Lg5LT7+Pp+Xk3W7js5eAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs0NTrN96Yp6edkW8Wzm6+LNTq4pvTHO9vOfRoWtt +1mes95YWvs1s2fZldddOczLPLn2ju0MmebT3YZc2/mpm3qqllN1drsbZIhr3yzvtHf4AsvlYYseb +V5Yx4KTe0+UQ6nDvZ3UazbJqd8OKeu33peq0eh0+hxcmnxxWPOfOfm0mP+steT/ji8N9mKY9suum +L37+HHaPm9DSlaVitKxWsdohI0Y22gAgAAAAAAAAAABXnyRhw3yT92Nwef4xm8bVzET0rPJH5d12 +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 +NO67NbkhzNVnmInqzaOZrL93JyZeV0M1++7S02jvxDWxhxx033tPpC8Z6rrezWjmZyazJG2/u03h +2vFibTHoqvamiwVwY+nLGzV0+SZ1Mx8G0/45tOhzJ5lXMc3UVXRdlF1HP+iYsDPLPPy49/tz1+Te +pSIr0ho6ak5Ms5J8o2q6NImOrHV7XX488ypzTtHXo0s9t6zG7c1G1qz6ubeZiZ3UatXJG3yauSO7 +cvMTEx5tPLb3prPRMVr0HB8vicNxf0+7+kt+LOJwTJyY/Bnz3tH93X36N58cWvq6LSyiyndMSlC7 +mZcymLJiwLosmJVRLKLAtiU7q4lMSCzc3YxJuDMRuAlKAEgAAAlAkAAAAAABKAEgAAAAAJAAAAAA +AAAAAAAEgAAAAAAAAAAAAAkAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAhIAAACAAAASgAAAAAAEAAAA +hGzJAImGMwzQDDZjNVuyNgUTVhNGxysZqDVmiu1G5NN2M4waM0+DCaN2cbGcQNGaMZq3JxMJxA1J +qx2bU4kU09slorWNwa20z02RXHbJbl26QvtFovbHWkxEdJt5y2MOHlr2U1W3jx+1hiw8vSO63lmI +XRTaEWmtY6snRHO1VpmJ+DjavpSZl2s8b7y4HFcnh0n0gha5ebJN55KRM2mdoiPN6fh+kpwXh0Wy +RHj5Otp/s5Ps1p62y31+em9aTMYt/OfVfxTiPjZ52naI7fBrI5t66xz5+a1rW7yx0eSL6iZjtEOX +qNbSletom3lENjh2fbHzbbWt3iVozruc+5ztWubf4M4ybpQ2Oboyrva0Vjza8WdDR4OkXt3n9ldX +kaePP9VtYqctYhdvt5oivTeCZ2YOxXk6ubqMfV0b9mrljfqlFcq88k7z2U5axeItDa1OPessuC8P +ya7XRWYnwqdbT/ZMilvIu4dpslNdixXja8Y5tt85djZdbDWnGOesRtXFtuw6T27No5Kx2OrKYQlC +ExKJgBnEpiyvdlEgsizKLKollFgWxLKJVRLKJBbEp3VxLKJBnuMWQJEbpBIAAAJAAAABIAAAAAAA +lAJAAAAAAAAAAAAAASAAAAAAAAAAAAAJAAAABAJABAlAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAA +AAABAJQAAAAgAABAAI2EoBGyJhkgGPKxmqxAKpownHC+YRMdN5BrTj67R3bOn01o7p01Iv71u89o +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 +2Q==`;async function s4(e){let t=(r,s="application/octet-stream")=>fetch(`data:${s};base64,${r}`).then(A=>A.blob()),n,o;switch(e.config.warmup){case"face":n=await t(Wt);break;case"body":case"full":n=await t(Dt);break;default:n=null}if(n){let r=await createImageBitmap(n);o=await e.detect(r,e.config),r.close()}return o}async function A4(e){return new Promise(t=>{let n;switch(e.config.warmup){case"face":n="data:image/jpeg;base64,"+Wt;break;case"full":case"body":n="data:image/jpeg;base64,"+Dt;break;default:n=""}let o;if(typeof Image!="undefined")o=new Image;else if(v.Image)o=new v.Image;else return;o.onload=async()=>{let r=ee(o.naturalWidth,o.naturalHeight);if(!r)u("Warmup: Canvas not found"),t(void 0);else{let s=r.getContext("2d");s&&s.drawImage(o,0,0);let A=await e.image(r,!0),a=A.tensor?await e.detect(A.tensor,e.config):void 0;t(a)}},n?o.src=n:t(void 0)})}async function a4(e){let t=r=>Buffer.from(r,"base64"),n;e.config.warmup==="face"?n=t(Wt):n=t(Dt);let o;if("node"in c0&&c0.getBackend()==="tensorflow"){let r=c0.node.decodeJpeg(n),s=c0.expandDims(r,0);e.tf.dispose(r),o=await e.detect(s,e.config),e.tf.dispose(s)}else e.config.debug&&u("Warmup tfjs-node not loaded");return o}async function i4(e){let t;return typeof createImageBitmap=="function"?t=await s4(e):typeof Image!="undefined"||v.Canvas!==void 0?t=await A4(e):t=await a4(e),t}async function l4(e){var a,l,c,x;if(!c0.env().flagRegistry.ENGINE_COMPILE_ONLY)return;let t=c0.getBackend(),n=c0.backend();if(t!=="webgl"&&t!=="humangl"||!(n!=null&&n.checkCompileCompletion))return;c0.env().set("ENGINE_COMPILE_ONLY",!0);let o=c0.engine().state.numTensors,r=[];for(let[i,y]of Object.entries(e.models).filter(([d,p])=>d!==null&&p!==null)){let d=(y==null?void 0:y.modelSignature)&&((l=(a=y==null?void 0:y.inputs)==null?void 0:a[0])==null?void 0:l.shape)?[...y.inputs[0].shape]:[1,64,64,3],p=(y==null?void 0:y.modelSignature)&&((x=(c=y==null?void 0:y.inputs)==null?void 0:c[0])==null?void 0:x.dtype)?y.inputs[0].dtype:"float32";for(let b=0;bc0.dispose(M)):c0.dispose(b)}catch(b){e.config.debug&&u("compile fail model:",i)}c0.dispose(f)}let s=await n.checkCompileCompletionAsync();n.getUniformLocations(),e.config.debug&&u("compile pass:",{models:r,kernels:s.length}),c0.env().set("ENGINE_COMPILE_ONLY",!1);let A=c0.engine().state.numTensors;A-o>0&&u("tensor leak:",A-o)}async function Eo(e,t){await E2(e,!1);let n=g();return e.state="warmup",t&&(e.config=A0(e.config,t)),!e.config.warmup||e.config.warmup.length===0||e.config.warmup==="none"?ue():new Promise(async o=>{await e.models.load(),await l4(e);let r=await i4(e),s=g();e.config.debug&&u("warmup",e.config.warmup,Math.round(s-n),"ms"),e.emit("warmup"),o(r)})}var R2,W2,D2,Ft,Xe,b1=class{constructor(t){k(this,"version");k(this,"config");k(this,"result");k(this,"state");k(this,"process");k(this,"tf");k(this,"env",v);k(this,"draw",Q2);k(this,"match",zt);k(this,"models");k(this,"events");k(this,"faceTriangulation");k(this,"faceUVMap");k(this,"performance");i2(this,R2,void 0);i2(this,W2,void 0);i2(this,D2,void 0);k(this,"analyze",(...t)=>{if(!fe(this,W2))return;let n=this.tf.engine().state.numTensors,o=fe(this,R2);k2(this,R2,n);let r=n-o;r!==0&&u(...t,r)});i2(this,Ft,t=>{if(!fe(this,D2))return null;if(!t)return"input is not defined";if(this.env.node&&!(t instanceof Ae.Tensor))return"input must be a tensor";try{this.tf.getBackend()}catch(n){return"backend not loaded"}return null});k(this,"webcam",new Z2);k(this,"emit",t=>{var n;(n=this.events)!=null&&n.dispatchEvent&&this.events.dispatchEvent(new Event(t))});i2(this,Xe,{});let n=(Ae.version.tfjs||Ae.version_core).replace(/-(.*)/,"");qe.wasmPath=`https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${n}/dist/`,qe.modelBasePath=v.browser?"../models/":"file://models/",this.version=Kt,Object.defineProperty(this,"version",{value:Kt}),this.config=JSON.parse(JSON.stringify(qe)),Object.seal(this.config),this.config.cacheModels=typeof indexedDB!="undefined",t&&(this.config=A0(this.config,t)),C1(this.config),this.tf=Ae,this.state="idle",k2(this,R2,0),k2(this,W2,!1),k2(this,D2,!1),this.performance={},this.events=typeof EventTarget!="undefined"?new EventTarget:void 0,this.models=new C2(this),n5(),this.result=ue(),this.process={tensor:null,canvas:null},this.faceTriangulation=E3,this.faceUVMap=z3,Ct(this,null,""),this.emit("create"),(this.config.debug||this.env.browser)&&u(`version: ${this.version}`),this.config.debug&&u(`tfjs version: ${this.tf.version["tfjs-core"]}`);let o=JSON.parse(JSON.stringify(this.env));delete o.kernels,delete o.initial,delete o.perfadd,this.config.debug&&u("environment:",o)}reset(){let t=this.config.backend;this.config=JSON.parse(JSON.stringify(qe)),this.config.backend=t,Ut(),v.initial=!0}validate(t){let n=Zt(qe,t||this.config);return n.length===0&&(this.config=A0(this.config,t)),n}now(){return g()}image(t,n=!1){return G2(t,this.config,n)}async segmentation(t,n){var s,A,a;if(n&&(this.config=A0(this.config,n)),!this.config.segmentation.enabled)return null;let o=await G2(t,this.config);if(!o.tensor)return null;let r=null;return(s=this.config.segmentation.modelPath)!=null&&s.includes("rvm")&&(r=await Ro(o.tensor,this.config)),(A=this.config.segmentation.modelPath)!=null&&A.includes("meet")&&(r=await $n(o.tensor,this.config)),(a=this.config.segmentation.modelPath)!=null&&a.includes("selfie")&&(r=await Po(o.tensor,this.config)),Ae.dispose(o.tensor),r}compare(t,n){return L1(this.config,t,n)}async init(){await E2(this,!0),await this.tf.ready(),Ut()}async load(t){this.state="load";let n=g(),o=Object.values(this.models).filter(A=>A).length;t&&(this.config=A0(this.config,t)),this.env.initial&&(await E2(this,!1)||u("error: backend check failed"),await Ae.ready(),this.env.browser&&(this.config.debug&&u("configuration:",this.config),this.config.debug&&u("tf flags:",this.tf.ENV.flags))),await this.models.load(),this.env.initial&&this.config.debug&&u("tf engine state:",this.tf.engine().state.numBytes,"bytes",this.tf.engine().state.numTensors,"tensors"),this.env.initial=!1,Object.values(this.models).filter(A=>A).length!==o&&(this.models.validate(),this.emit("load"));let s=Math.trunc(g()-n);s>(this.performance.loadModels||0)&&(this.performance.loadModels=this.env.perfadd?(this.performance.loadModels||0)+s:s)}next(t=this.result){return _n(t,this.config)}async warmup(t){let n=g(),o=await Eo(this,t),r=g();return this.performance.warmup=Math.trunc(r-n),o}async profile(t,n){let o=await this.tf.profile(()=>this.detect(t,n)),r={},s=0;for(let a of o.kernels){let l=Number(a.kernelTimeMs)||0;r[a.name]?r[a.name]+=l:r[a.name]=l,s+=l}let A=[];Object.entries(r).forEach(a=>A.push({kernel:a[0],time:a[1],perc:0}));for(let a of A)a.perc=Math.round(1e3*a.time/s)/1e3,a.time=Math.round(1e3*a.time)/1e3;return A.sort((a,l)=>l.time-a.time),A.length=20,A}async detect(t,n){return this.state="detect",new Promise(async o=>{var b,M,T,m,h,S,P,I,q,t0,G,$,s0,R,Z,b0,U,g0,f0,B,X;this.state="config";let r;this.config=A0(this.config,n),this.state="check";let s=fe(this,Ft).call(this,t);s&&(u(s,t),this.emit("error"),o(ue(s)));let A=g();await this.load(),r=g(),this.state="image";let a=await G2(t,this.config);if(this.process=a,this.performance.inputProcess=this.env.perfadd?(this.performance.inputProcess||0)+Math.trunc(g()-r):Math.trunc(g()-r),this.analyze("Get Image:"),!a.tensor){this.config.debug&&u("could not convert input to tensor"),this.emit("error"),o(ue("could not convert input to tensor"));return}this.emit("image"),r=g(),this.config.skipAllowed=await O1(this.config,a.tensor),this.config.filter.autoBrightness=(this.config.filter.autoBrightness||!1)&&this.config.skipAllowed,this.performance.totalFrames||(this.performance.totalFrames=0),this.performance.cachedFrames||(this.performance.cachedFrames=0),this.performance.totalFrames++,this.config.skipAllowed&&this.performance.cachedFrames++,this.performance.cacheCheck=this.env.perfadd?(this.performance.cacheCheck||0)+Math.trunc(g()-r):Math.trunc(g()-r),this.analyze("Check Changed:");let l=[],c=[],x=[],i=[];this.state="detect:face",this.config.async?(l=this.config.face.enabled?V5(this,a.tensor):[],this.performance.face&&delete this.performance.face):(r=g(),l=this.config.face.enabled?await V5(this,a.tensor):[],this.performance.face=this.env.perfadd?(this.performance.face||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.config.async&&(this.config.body.maxDetected===-1||this.config.hand.maxDetected===-1)&&(l=await l),this.analyze("Start Body:"),this.state="detect:body";let y=this.config.body.maxDetected===-1?A0(this.config,{body:{maxDetected:this.config.face.enabled?1*l.length:1}}):this.config;this.config.async?((b=this.config.body.modelPath)!=null&&b.includes("posenet")?c=this.config.body.enabled?y1(a.tensor,y):[]:(M=this.config.body.modelPath)!=null&&M.includes("blazepose")?c=this.config.body.enabled?a5(a.tensor,y):[]:(T=this.config.body.modelPath)!=null&&T.includes("efficientpose")?c=this.config.body.enabled?f5(a.tensor,y):[]:(m=this.config.body.modelPath)!=null&&m.includes("movenet")&&(c=this.config.body.enabled?A1(a.tensor,y):[]),this.performance.body&&delete this.performance.body):(r=g(),(h=this.config.body.modelPath)!=null&&h.includes("posenet")?c=this.config.body.enabled?await y1(a.tensor,y):[]:(S=this.config.body.modelPath)!=null&&S.includes("blazepose")?c=this.config.body.enabled?await a5(a.tensor,y):[]:(P=this.config.body.modelPath)!=null&&P.includes("efficientpose")?c=this.config.body.enabled?await f5(a.tensor,y):[]:(I=this.config.body.modelPath)!=null&&I.includes("movenet")&&(c=this.config.body.enabled?await A1(a.tensor,y):[]),this.performance.body=this.env.perfadd?(this.performance.body||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.state="detect:hand";let d=this.config.hand.maxDetected===-1?A0(this.config,{hand:{maxDetected:this.config.face.enabled?2*l.length:1}}):this.config;this.config.async?((t0=(q=this.config.hand.detector)==null?void 0:q.modelPath)!=null&&t0.includes("handdetect")?x=this.config.hand.enabled?Y5(a.tensor,d):[]:($=(G=this.config.hand.detector)==null?void 0:G.modelPath)!=null&&$.includes("handtrack")&&(x=this.config.hand.enabled?Q5(a.tensor,d):[]),this.performance.hand&&delete this.performance.hand):(r=g(),(R=(s0=this.config.hand.detector)==null?void 0:s0.modelPath)!=null&&R.includes("handdetect")?x=this.config.hand.enabled?await Y5(a.tensor,d):[]:(b0=(Z=this.config.hand.detector)==null?void 0:Z.modelPath)!=null&&b0.includes("handtrack")&&(x=this.config.hand.enabled?await Q5(a.tensor,d):[]),this.performance.hand=this.env.perfadd?(this.performance.hand||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.state="detect:object",this.config.async?((U=this.config.object.modelPath)!=null&&U.includes("nanodet")?i=this.config.object.enabled?i1(a.tensor,this.config):[]:(g0=this.config.object.modelPath)!=null&&g0.includes("centernet")&&(i=this.config.object.enabled?c5(a.tensor,this.config):[]),this.performance.object&&delete this.performance.object):(r=g(),(f0=this.config.object.modelPath)!=null&&f0.includes("nanodet")?i=this.config.object.enabled?await i1(a.tensor,this.config):[]:(B=this.config.object.modelPath)!=null&&B.includes("centernet")&&(i=this.config.object.enabled?await c5(a.tensor,this.config):[]),this.performance.object=this.env.perfadd?(this.performance.object||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.analyze("End Object:"),this.state="detect:await",this.config.async&&([l,c,x,i]=await Promise.all([l,c,x,i])),this.state="detect:gesture";let p=[];this.config.gesture.enabled&&(r=g(),p=[...wn(l),...kn(c),...zn(x),...En(l)],this.config.async?this.performance.gesture&&delete this.performance.gesture:this.performance.gesture=this.env.perfadd?(this.performance.gesture||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.performance.total=this.env.perfadd?(this.performance.total||0)+Math.trunc(g()-A):Math.trunc(g()-A);let f=((X=this.process.tensor)==null?void 0:X.shape)||[0,0,0,0];this.result={face:l,body:c,hand:x,gesture:p,object:i,performance:this.performance,canvas:this.process.canvas,timestamp:Date.now(),error:null,width:f[2],height:f[1],get persons(){return wo(l,c,x,p,f)}},Ae.dispose(a.tensor),this.emit("detect"),this.state="idle",o(this.result)})}async sleep(t){return new Promise(n=>{setTimeout(n,t)})}async video(t,n=!0,o=0){n?(fe(this,Xe)[t.id]||(this.config.debug&&u("video start",t.id),fe(this,Xe)[t.id]=!0),!t.paused&&fe(this,Xe)[t.id]&&t.readyState>=2&&await this.detect(t),o>0&&await this.sleep(o),fe(this,Xe)[t.id]&&requestAnimationFrame(()=>this.video(t,n,o))):(this.config.debug&&u("video stop",t.id),fe(this,Xe)[t.id]=!1)}};R2=new WeakMap,W2=new WeakMap,D2=new WeakMap,Ft=new WeakMap,Xe=new WeakMap;0&&(module.exports={Env,Human,defaults,draw,empty,env,match,models}); diff --git a/dist/tfjs.esm.d.ts b/dist/tfjs.esm.d.ts new file mode 100644 index 00000000..90ac9fb4 --- /dev/null +++ b/dist/tfjs.esm.d.ts @@ -0,0 +1,25 @@ +/* eslint-disable import/no-unresolved */ +/* eslint-disable import/no-extraneous-dependencies */ + +export * from 'types/tfjs.esm'; + +export declare const version: { + 'tfjs-core': string; + 'tfjs-backend-cpu': string; + 'tfjs-backend-webgl': string; + 'tfjs-data': string; + 'tfjs-layers': string; + 'tfjs-converter': string; + tfjs: string; +}; + +export * from '@tensorflow/tfjs-core'; +export * from '@tensorflow/tfjs-converter'; +export * from '@tensorflow/tfjs-data'; +export * from '@tensorflow/tfjs-layers'; +export * from '@tensorflow/tfjs-backend-cpu'; +export * from '@tensorflow/tfjs-backend-wasm'; +export * from '@tensorflow/tfjs-backend-webgl'; +export * from '@tensorflow/tfjs-backend-webgpu'; +export * from '@tensorflow/tfjs-node'; +export * from '@tensorflow/tfjs-node-gpu'; diff --git a/dist/tfjs.esm.js b/dist/tfjs.esm.js new file mode 100644 index 00000000..8ef8f368 --- /dev/null +++ b/dist/tfjs.esm.js @@ -0,0 +1,7083 @@ +/* + Human + homepage: + author: ' +*/ + +var QV=Object.create;var fb=Object.defineProperty;var ZV=Object.getOwnPropertyDescriptor;var JV=Object.getOwnPropertyNames;var ez=Object.getPrototypeOf,tz=Object.prototype.hasOwnProperty;var Em=(r=>typeof require!="undefined"?require:typeof Proxy!="undefined"?new Proxy(r,{get:(e,t)=>(typeof require!="undefined"?require:e)[t]}):r)(function(r){if(typeof require!="undefined")return require.apply(this,arguments);throw new Error('Dynamic require of "'+r+'" is not supported')});var Kt=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),Be=(r,e)=>{for(var t in e)fb(r,t,{get:e[t],enumerable:!0})},rz=(r,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of JV(e))!tz.call(r,n)&&n!==t&&fb(r,n,{get:()=>e[n],enumerable:!(o=ZV(e,n))||o.enumerable});return r};var rp=(r,e,t)=>(t=r!=null?QV(ez(r)):{},rz(e||!r||!r.__esModule?fb(t,"default",{value:r,enumerable:!0}):t,r));var _0=Kt((Vne,N0)=>{N0.exports=wt;var Oo=null;try{Oo=new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0,1,13,2,96,0,1,127,96,4,127,127,127,127,1,127,3,7,6,0,1,1,1,1,1,6,6,1,127,1,65,0,11,7,50,6,3,109,117,108,0,1,5,100,105,118,95,115,0,2,5,100,105,118,95,117,0,3,5,114,101,109,95,115,0,4,5,114,101,109,95,117,0,5,8,103,101,116,95,104,105,103,104,0,0,10,191,1,6,4,0,35,0,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,126,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,127,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,128,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,129,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,130,34,4,66,32,135,167,36,0,32,4,167,11])),{}).exports}catch(r){}function wt(r,e,t){this.low=r|0,this.high=e|0,this.unsigned=!!t}wt.prototype.__isLong__;Object.defineProperty(wt.prototype,"__isLong__",{value:!0});function Br(r){return(r&&r.__isLong__)===!0}wt.isLong=Br;var y0={},b0={};function eu(r,e){var t,o,n;return e?(r>>>=0,(n=0<=r&&r<256)&&(o=b0[r],o)?o:(t=St(r,(r|0)<0?-1:0,!0),n&&(b0[r]=t),t)):(r|=0,(n=-128<=r&&r<128)&&(o=y0[r],o)?o:(t=St(r,r<0?-1:0,!1),n&&(y0[r]=t),t))}wt.fromInt=eu;function Mo(r,e){if(isNaN(r))return e?Ji:Lo;if(e){if(r<0)return Ji;if(r>=S0)return T0}else{if(r<=-I0)return Lr;if(r+1>=I0)return k0}return r<0?Mo(-r,e).neg():St(r%Dp|0,r/Dp|0,e)}wt.fromNumber=Mo;function St(r,e,t){return new wt(r,e,t)}wt.fromBits=St;var Wm=Math.pow;function _b(r,e,t){if(r.length===0)throw Error("empty string");if(r==="NaN"||r==="Infinity"||r==="+Infinity"||r==="-Infinity")return Lo;if(typeof e=="number"?(t=e,e=!1):e=!!e,t=t||10,t<2||360)throw Error("interior hyphen");if(o===0)return _b(r.substring(1),e,t).neg();for(var n=Mo(Wm(t,8)),s=Lo,a=0;a>>0:this.low};ce.toNumber=function(){return this.unsigned?(this.high>>>0)*Dp+(this.low>>>0):this.high*Dp+(this.low>>>0)};ce.toString=function(e){if(e=e||10,e<2||36>>0,c=u.toString(e);if(a=p,a.isZero())return c+i;for(;c.length<6;)c="0"+c;i=""+c+i}};ce.getHighBits=function(){return this.high};ce.getHighBitsUnsigned=function(){return this.high>>>0};ce.getLowBits=function(){return this.low};ce.getLowBitsUnsigned=function(){return this.low>>>0};ce.getNumBitsAbs=function(){if(this.isNegative())return this.eq(Lr)?64:this.neg().getNumBitsAbs();for(var e=this.high!=0?this.high:this.low,t=31;t>0&&(e&1<=0};ce.isOdd=function(){return(this.low&1)===1};ce.isEven=function(){return(this.low&1)===0};ce.equals=function(e){return Br(e)||(e=ts(e)),this.unsigned!==e.unsigned&&this.high>>>31===1&&e.high>>>31===1?!1:this.high===e.high&&this.low===e.low};ce.eq=ce.equals;ce.notEquals=function(e){return!this.eq(e)};ce.neq=ce.notEquals;ce.ne=ce.notEquals;ce.lessThan=function(e){return this.comp(e)<0};ce.lt=ce.lessThan;ce.lessThanOrEqual=function(e){return this.comp(e)<=0};ce.lte=ce.lessThanOrEqual;ce.le=ce.lessThanOrEqual;ce.greaterThan=function(e){return this.comp(e)>0};ce.gt=ce.greaterThan;ce.greaterThanOrEqual=function(e){return this.comp(e)>=0};ce.gte=ce.greaterThanOrEqual;ce.ge=ce.greaterThanOrEqual;ce.compare=function(e){if(Br(e)||(e=ts(e)),this.eq(e))return 0;var t=this.isNegative(),o=e.isNegative();return t&&!o?-1:!t&&o?1:this.unsigned?e.high>>>0>this.high>>>0||e.high===this.high&&e.low>>>0>this.low>>>0?-1:1:this.sub(e).isNegative()?-1:1};ce.comp=ce.compare;ce.negate=function(){return!this.unsigned&&this.eq(Lr)?Lr:this.not().add(Fp)};ce.neg=ce.negate;ce.add=function(e){Br(e)||(e=ts(e));var t=this.high>>>16,o=this.high&65535,n=this.low>>>16,s=this.low&65535,a=e.high>>>16,i=e.high&65535,p=e.low>>>16,u=e.low&65535,c=0,l=0,m=0,f=0;return f+=s+u,m+=f>>>16,f&=65535,m+=n+p,l+=m>>>16,m&=65535,l+=o+i,c+=l>>>16,l&=65535,c+=t+a,c&=65535,St(m<<16|f,c<<16|l,this.unsigned)};ce.subtract=function(e){return Br(e)||(e=ts(e)),this.add(e.neg())};ce.sub=ce.subtract;ce.multiply=function(e){if(this.isZero())return Lo;if(Br(e)||(e=ts(e)),Oo){var t=Oo.mul(this.low,this.high,e.low,e.high);return St(t,Oo.get_high(),this.unsigned)}if(e.isZero())return Lo;if(this.eq(Lr))return e.isOdd()?Lr:Lo;if(e.eq(Lr))return this.isOdd()?Lr:Lo;if(this.isNegative())return e.isNegative()?this.neg().mul(e.neg()):this.neg().mul(e).neg();if(e.isNegative())return this.mul(e.neg()).neg();if(this.lt(w0)&&e.lt(w0))return Mo(this.toNumber()*e.toNumber(),this.unsigned);var o=this.high>>>16,n=this.high&65535,s=this.low>>>16,a=this.low&65535,i=e.high>>>16,p=e.high&65535,u=e.low>>>16,c=e.low&65535,l=0,m=0,f=0,d=0;return d+=a*c,f+=d>>>16,d&=65535,f+=s*c,m+=f>>>16,f&=65535,f+=a*u,m+=f>>>16,f&=65535,m+=n*c,l+=m>>>16,m&=65535,m+=s*u,l+=m>>>16,m&=65535,m+=a*p,l+=m>>>16,m&=65535,l+=o*c+n*u+s*p+a*i,l&=65535,St(f<<16|d,l<<16|m,this.unsigned)};ce.mul=ce.multiply;ce.divide=function(e){if(Br(e)||(e=ts(e)),e.isZero())throw Error("division by zero");if(Oo){if(!this.unsigned&&this.high===-2147483648&&e.low===-1&&e.high===-1)return this;var t=(this.unsigned?Oo.div_u:Oo.div_s)(this.low,this.high,e.low,e.high);return St(t,Oo.get_high(),this.unsigned)}if(this.isZero())return this.unsigned?Ji:Lo;var o,n,s;if(this.unsigned){if(e.unsigned||(e=e.toUnsigned()),e.gt(this))return Ji;if(e.gt(this.shru(1)))return v0;s=Ji}else{if(this.eq(Lr)){if(e.eq(Fp)||e.eq(Nb))return Lr;if(e.eq(Lr))return Fp;var a=this.shr(1);return o=a.div(e).shl(1),o.eq(Lo)?e.isNegative()?Fp:Nb:(n=this.sub(e.mul(o)),s=o.add(n.div(e)),s)}else if(e.eq(Lr))return this.unsigned?Ji:Lo;if(this.isNegative())return e.isNegative()?this.neg().div(e.neg()):this.neg().div(e).neg();if(e.isNegative())return this.div(e.neg()).neg();s=Lo}for(n=this;n.gte(e);){o=Math.max(1,Math.floor(n.toNumber()/e.toNumber()));for(var i=Math.ceil(Math.log(o)/Math.LN2),p=i<=48?1:Wm(2,i-48),u=Mo(o),c=u.mul(e);c.isNegative()||c.gt(n);)o-=p,u=Mo(o,this.unsigned),c=u.mul(e);u.isZero()&&(u=Fp),s=s.add(u),n=n.sub(c)}return s};ce.div=ce.divide;ce.modulo=function(e){if(Br(e)||(e=ts(e)),Oo){var t=(this.unsigned?Oo.rem_u:Oo.rem_s)(this.low,this.high,e.low,e.high);return St(t,Oo.get_high(),this.unsigned)}return this.sub(this.div(e).mul(e))};ce.mod=ce.modulo;ce.rem=ce.modulo;ce.not=function(){return St(~this.low,~this.high,this.unsigned)};ce.and=function(e){return Br(e)||(e=ts(e)),St(this.low&e.low,this.high&e.high,this.unsigned)};ce.or=function(e){return Br(e)||(e=ts(e)),St(this.low|e.low,this.high|e.high,this.unsigned)};ce.xor=function(e){return Br(e)||(e=ts(e)),St(this.low^e.low,this.high^e.high,this.unsigned)};ce.shiftLeft=function(e){return Br(e)&&(e=e.toInt()),(e&=63)===0?this:e<32?St(this.low<>>32-e,this.unsigned):St(0,this.low<>>e|this.high<<32-e,this.high>>e,this.unsigned):St(this.high>>e-32,this.high>=0?0:-1,this.unsigned)};ce.shr=ce.shiftRight;ce.shiftRightUnsigned=function(e){if(Br(e)&&(e=e.toInt()),e&=63,e===0)return this;var t=this.high;if(e<32){var o=this.low;return St(o>>>e|t<<32-e,t>>>e,this.unsigned)}else return e===32?St(t,0,this.unsigned):St(t>>>e-32,0,this.unsigned)};ce.shru=ce.shiftRightUnsigned;ce.shr_u=ce.shiftRightUnsigned;ce.toSigned=function(){return this.unsigned?St(this.low,this.high,!1):this};ce.toUnsigned=function(){return this.unsigned?this:St(this.low,this.high,!0)};ce.toBytes=function(e){return e?this.toBytesLE():this.toBytesBE()};ce.toBytesLE=function(){var e=this.high,t=this.low;return[t&255,t>>>8&255,t>>>16&255,t>>>24,e&255,e>>>8&255,e>>>16&255,e>>>24]};ce.toBytesBE=function(){var e=this.high,t=this.low;return[e>>>24,e>>>16&255,e>>>8&255,e&255,t>>>24,t>>>16&255,t>>>8&255,t&255]};wt.fromBytes=function(e,t,o){return o?wt.fromBytesLE(e,t):wt.fromBytesBE(e,t)};wt.fromBytesLE=function(e,t){return new wt(e[0]|e[1]<<8|e[2]<<16|e[3]<<24,e[4]|e[5]<<8|e[6]<<16|e[7]<<24,t)};wt.fromBytesBE=function(e,t){return new wt(e[4]<<24|e[5]<<16|e[6]<<8|e[7],e[0]<<24|e[1]<<16|e[2]<<8|e[3],t)}});var pv=Kt(()=>{});var cv=Kt(()=>{});var l1=Kt((c1,hC)=>{(function(r,e,t){function o(i){var p=this,u=a();p.next=function(){var c=2091639*p.s0+p.c*23283064365386963e-26;return p.s0=p.s1,p.s1=p.s2,p.s2=c-(p.c=c|0)},p.c=1,p.s0=u(" "),p.s1=u(" "),p.s2=u(" "),p.s0-=u(i),p.s0<0&&(p.s0+=1),p.s1-=u(i),p.s1<0&&(p.s1+=1),p.s2-=u(i),p.s2<0&&(p.s2+=1),u=null}function n(i,p){return p.c=i.c,p.s0=i.s0,p.s1=i.s1,p.s2=i.s2,p}function s(i,p){var u=new o(i),c=p&&p.state,l=u.next;return l.int32=function(){return u.next()*4294967296|0},l.double=function(){return l()+(l()*2097152|0)*11102230246251565e-32},l.quick=l,c&&(typeof c=="object"&&n(c,u),l.state=function(){return n(u,{})}),l}function a(){var i=4022871197,p=function(u){u=String(u);for(var c=0;c>>0,l-=i,l*=i,i=l>>>0,l-=i,i+=l*4294967296}return(i>>>0)*23283064365386963e-26};return p}e&&e.exports?e.exports=s:t&&t.amd?t(function(){return s}):this.alea=s})(c1,typeof hC=="object"&&hC,typeof define=="function"&&define)});var f1=Kt((m1,gC)=>{(function(r,e,t){function o(a){var i=this,p="";i.x=0,i.y=0,i.z=0,i.w=0,i.next=function(){var c=i.x^i.x<<11;return i.x=i.y,i.y=i.z,i.z=i.w,i.w^=i.w>>>19^c^c>>>8},a===(a|0)?i.x=a:p+=a;for(var u=0;u>>0)/4294967296};return c.double=function(){do var l=p.next()>>>11,m=(p.next()>>>0)/4294967296,f=(l+m)/(1<<21);while(f===0);return f},c.int32=p.next,c.quick=c,u&&(typeof u=="object"&&n(u,p),c.state=function(){return n(p,{})}),c}e&&e.exports?e.exports=s:t&&t.amd?t(function(){return s}):this.xor128=s})(m1,typeof gC=="object"&&gC,typeof define=="function"&&define)});var h1=Kt((d1,xC)=>{(function(r,e,t){function o(a){var i=this,p="";i.next=function(){var c=i.x^i.x>>>2;return i.x=i.y,i.y=i.z,i.z=i.w,i.w=i.v,(i.d=i.d+362437|0)+(i.v=i.v^i.v<<4^(c^c<<1))|0},i.x=0,i.y=0,i.z=0,i.w=0,i.v=0,a===(a|0)?i.x=a:p+=a;for(var u=0;u>>4),i.next()}function n(a,i){return i.x=a.x,i.y=a.y,i.z=a.z,i.w=a.w,i.v=a.v,i.d=a.d,i}function s(a,i){var p=new o(a),u=i&&i.state,c=function(){return(p.next()>>>0)/4294967296};return c.double=function(){do var l=p.next()>>>11,m=(p.next()>>>0)/4294967296,f=(l+m)/(1<<21);while(f===0);return f},c.int32=p.next,c.quick=c,u&&(typeof u=="object"&&n(u,p),c.state=function(){return n(p,{})}),c}e&&e.exports?e.exports=s:t&&t.amd?t(function(){return s}):this.xorwow=s})(d1,typeof xC=="object"&&xC,typeof define=="function"&&define)});var x1=Kt((g1,yC)=>{(function(r,e,t){function o(a){var i=this;i.next=function(){var u=i.x,c=i.i,l,m,f;return l=u[c],l^=l>>>7,m=l^l<<24,l=u[c+1&7],m^=l^l>>>10,l=u[c+3&7],m^=l^l>>>3,l=u[c+4&7],m^=l^l<<7,l=u[c+7&7],l=l^l<<13,m^=l^l<<9,u[c]=m,i.i=c+1&7,m};function p(u,c){var l,m,f=[];if(c===(c|0))m=f[0]=c;else for(c=""+c,l=0;l0;--l)u.next()}p(i,a)}function n(a,i){return i.x=a.x.slice(),i.i=a.i,i}function s(a,i){a==null&&(a=+new Date);var p=new o(a),u=i&&i.state,c=function(){return(p.next()>>>0)/4294967296};return c.double=function(){do var l=p.next()>>>11,m=(p.next()>>>0)/4294967296,f=(l+m)/(1<<21);while(f===0);return f},c.int32=p.next,c.quick=c,u&&(u.x&&n(u,p),c.state=function(){return n(p,{})}),c}e&&e.exports?e.exports=s:t&&t.amd?t(function(){return s}):this.xorshift7=s})(g1,typeof yC=="object"&&yC,typeof define=="function"&&define)});var b1=Kt((y1,bC)=>{(function(r,e,t){function o(a){var i=this;i.next=function(){var u=i.w,c=i.X,l=i.i,m,f;return i.w=u=u+1640531527|0,f=c[l+34&127],m=c[l=l+1&127],f^=f<<13,m^=m<<17,f^=f>>>15,m^=m>>>12,f=c[l]=f^m,i.i=l,f+(u^u>>>16)|0};function p(u,c){var l,m,f,d,h,g=[],y=128;for(c===(c|0)?(m=c,c=null):(c=c+"\0",m=0,y=Math.max(y,c.length)),f=0,d=-32;d>>15,m^=m<<4,m^=m>>>13,d>=0&&(h=h+1640531527|0,l=g[d&127]^=m+h,f=l==0?f+1:0);for(f>=128&&(g[(c&&c.length||0)&127]=-1),f=127,d=4*128;d>0;--d)m=g[f+34&127],l=g[f=f+1&127],m^=m<<13,l^=l<<17,m^=m>>>15,l^=l>>>12,g[f]=m^l;u.w=h,u.X=g,u.i=f}p(i,a)}function n(a,i){return i.i=a.i,i.w=a.w,i.X=a.X.slice(),i}function s(a,i){a==null&&(a=+new Date);var p=new o(a),u=i&&i.state,c=function(){return(p.next()>>>0)/4294967296};return c.double=function(){do var l=p.next()>>>11,m=(p.next()>>>0)/4294967296,f=(l+m)/(1<<21);while(f===0);return f},c.int32=p.next,c.quick=c,u&&(u.X&&n(u,p),c.state=function(){return n(p,{})}),c}e&&e.exports?e.exports=s:t&&t.amd?t(function(){return s}):this.xor4096=s})(y1,typeof bC=="object"&&bC,typeof define=="function"&&define)});var I1=Kt((C1,CC)=>{(function(r,e,t){function o(a){var i=this,p="";i.next=function(){var c=i.b,l=i.c,m=i.d,f=i.a;return c=c<<25^c>>>7^l,l=l-m|0,m=m<<24^m>>>8^f,f=f-c|0,i.b=c=c<<20^c>>>12^l,i.c=l=l-m|0,i.d=m<<16^l>>>16^f,i.a=f-c|0},i.a=0,i.b=0,i.c=-1640531527,i.d=1367130551,a===Math.floor(a)?(i.a=a/4294967296|0,i.b=a|0):p+=a;for(var u=0;u>>0)/4294967296};return c.double=function(){do var l=p.next()>>>11,m=(p.next()>>>0)/4294967296,f=(l+m)/(1<<21);while(f===0);return f},c.int32=p.next,c.quick=c,u&&(typeof u=="object"&&n(u,p),c.state=function(){return n(p,{})}),c}e&&e.exports?e.exports=s:t&&t.amd?t(function(){return s}):this.tychei=s})(C1,typeof CC=="object"&&CC,typeof define=="function"&&define)});var w1=Kt(()=>{});var v1=Kt((S1,Of)=>{(function(r,e,t){var o=256,n=6,s=52,a="random",i=t.pow(o,n),p=t.pow(2,s),u=p*2,c=o-1,l;function m(C,w,k){var _=[];w=w==!0?{entropy:!0}:w||{};var E=g(h(w.entropy?[C,b(e)]:C==null?y():C,3),_),R=new f(_),A=function(){for(var D=R.g(n),O=i,M=0;D=u;)D/=2,O/=2,M>>>=1;return(D+M)/O};return A.int32=function(){return R.g(4)|0},A.quick=function(){return R.g(4)/4294967296},A.double=A,g(b(R.S),e),(w.pass||k||function(D,O,M,L){return L&&(L.S&&d(L,R),D.state=function(){return d(R,{})}),M?(t[a]=D,O):D})(A,E,"global"in w?w.global:this==t,w.state)}function f(C){var w,k=C.length,_=this,E=0,R=_.i=_.j=0,A=_.S=[];for(k||(C=[k++]);E{var F4=l1(),D4=f1(),P4=h1(),O4=x1(),M4=b1(),L4=I1(),fu=v1();fu.alea=F4;fu.xor128=D4;fu.xorwow=P4;fu.xorshift7=O4;fu.xor4096=M4;fu.tychei=L4;k1.exports=fu});var Vl=Kt(()=>{});var Qw=Kt(()=>{});var D3=Kt(()=>{});var P3=Kt(()=>{});var O3=Kt(()=>{});var M3=Kt((Fg,Jw)=>{var Zw=(()=>{var r=typeof document!="undefined"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename!="undefined"&&(r=r||__filename),function(e){e=e||{};function t(){return Q.buffer!=De&&Tt(Q.buffer),ft}function o(){return Q.buffer!=De&&Tt(Q.buffer),at}function n(){return Q.buffer!=De&&Tt(Q.buffer),dt}function s(){return Q.buffer!=De&&Tt(Q.buffer),Fr}function a(){return Q.buffer!=De&&Tt(Q.buffer),Pt}function i(){return Q.buffer!=De&&Tt(Q.buffer),jr}function p(){return Q.buffer!=De&&Tt(Q.buffer),er}var u=typeof e!="undefined"?e:{},c,l;u.ready=new Promise(function(F,B){c=F,l=B});var m;typeof process!="undefined"&&process.listeners&&(m={uncaughtException:process.listeners("uncaughtException"),unhandledRejection:process.listeners("unhandledRejection")});var f=Object.assign({},u),d=[],h="./this.program",g=(F,B)=>{throw B},y=typeof window=="object",b=typeof importScripts=="function",C=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string",w=u.ENVIRONMENT_IS_PTHREAD||!1,k="";function _(F){return u.locateFile?u.locateFile(F,k):k+F}var E,R,A,D;function O(F){if(F instanceof Di)return;q("exiting due to exception: "+F)}if(C){b?k=Vl().dirname(k)+"/":k=__dirname+"/";var M,L;typeof Em=="function"&&(M=Qw(),L=Vl()),E=(B,re)=>(B=L.normalize(B),M.readFileSync(B,re?void 0:"utf8")),A=B=>{var re=E(B,!0);return re.buffer||(re=new Uint8Array(re)),re},R=(B,re,le)=>{B=L.normalize(B),M.readFile(B,function(Te,Ze){Te?le(Te):re(Ze.buffer)})},process.argv.length>1&&(h=process.argv[1].replace(/\\/g,"/")),d=process.argv.slice(2),process.on("uncaughtException",function(B){if(!(B instanceof Di))throw B}),process.on("unhandledRejection",function(B){throw B}),g=(B,re)=>{if(tn())throw process.exitCode=B,re;O(re),process.exit(B)},u.inspect=function(){return"[Emscripten Module object]"};let F;try{F=D3()}catch(B){throw console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?'),B}global.Worker=F.Worker}else(y||b)&&(b?k=self.location.href:typeof document!="undefined"&&document.currentScript&&(k=document.currentScript.src),typeof r!="undefined"&&r&&(k=r),k.indexOf("blob:")!==0?k=k.substr(0,k.replace(/[?#].*/,"").lastIndexOf("/")+1):k="",C||(E=F=>{var B=new XMLHttpRequest;return B.open("GET",F,!1),B.send(null),B.responseText},b&&(A=F=>{var B=new XMLHttpRequest;return B.open("GET",F,!1),B.responseType="arraybuffer",B.send(null),new Uint8Array(B.response)}),R=(F,B,re)=>{var le=new XMLHttpRequest;le.open("GET",F,!0),le.responseType="arraybuffer",le.onload=()=>{if(le.status==200||le.status==0&&le.response){B(le.response);return}re()},le.onerror=re,le.send(null)}),D=F=>document.title=F);C&&typeof performance=="undefined"&&(global.performance=P3().performance);var W=console.log.bind(console),V=console.warn.bind(console);C&&(W=F=>M.writeSync(1,F+` +`),V=F=>M.writeSync(2,F+` +`));var G=u.print||W,q=u.printErr||V;Object.assign(u,f),f=null,u.arguments&&(d=u.arguments),u.thisProgram&&(h=u.thisProgram),u.quit&&(g=u.quit);var H=4,j=Atomics.load,Y=Atomics.store,Z=Atomics.compareExchange,ee;u.wasmBinary&&(ee=u.wasmBinary);var X=u.noExitRuntime||!0;typeof WebAssembly!="object"&&Xu("no native wasm support detected");var Q,se,ie=!1,de;function Ie(F,B){F||Xu(B)}var Se=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):void 0;function Ee(F,B,re){for(var le=B+re,Te=B;F[Te]&&!(Te>=le);)++Te;if(Te-B>16&&F.buffer&&Se)return Se.decode(F.buffer instanceof SharedArrayBuffer?F.slice(B,Te):F.subarray(B,Te));for(var Ze="";B>10,56320|Zr&1023)}}return Ze}function Me(F,B){return F?Ee(o(),F,B):""}function st(F,B,re,le){if(!(le>0))return 0;for(var Te=re,Ze=re+le-1,$e=0;$e=55296&&Pe<=57343){var Wt=F.charCodeAt(++$e);Pe=65536+((Pe&1023)<<10)|Wt&1023}if(Pe<=127){if(re>=Ze)break;B[re++]=Pe}else if(Pe<=2047){if(re+1>=Ze)break;B[re++]=192|Pe>>6,B[re++]=128|Pe&63}else if(Pe<=65535){if(re+2>=Ze)break;B[re++]=224|Pe>>12,B[re++]=128|Pe>>6&63,B[re++]=128|Pe&63}else{if(re+3>=Ze)break;B[re++]=240|Pe>>18,B[re++]=128|Pe>>12&63,B[re++]=128|Pe>>6&63,B[re++]=128|Pe&63}}return B[re]=0,re-Te}function pt(F,B,re){return st(F,o(),B,re)}var De,ft,at,dt,It,Fr,Pt,jr,er;w&&(De=u.buffer);function Tt(F){De=F,u.HEAP8=ft=new Int8Array(F),u.HEAP16=dt=new Int16Array(F),u.HEAP32=Fr=new Int32Array(F),u.HEAPU8=at=new Uint8Array(F),u.HEAPU16=It=new Uint16Array(F),u.HEAPU32=Pt=new Uint32Array(F),u.HEAPF32=jr=new Float32Array(F),u.HEAPF64=er=new Float64Array(F)}var tr=u.INITIAL_MEMORY||16777216;if(w)Q=u.wasmMemory,De=u.buffer;else if(u.wasmMemory)Q=u.wasmMemory;else if(Q=new WebAssembly.Memory({initial:tr/65536,maximum:32768,shared:!0}),!(Q.buffer instanceof SharedArrayBuffer))throw q("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"),C&&console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)"),Error("bad memory");Q&&(De=Q.buffer),tr=De.byteLength,Tt(De);var rr,Xr=[],Yr=[],pr=[],Qs=!1;function tn(){return X}function Ua(){if(u.preRun)for(typeof u.preRun=="function"&&(u.preRun=[u.preRun]);u.preRun.length;)Lc(u.preRun.shift());Uc(Xr)}function jt(){Qs=!0,!w&&Uc(Yr)}function Zs(){if(!w){if(u.postRun)for(typeof u.postRun=="function"&&(u.postRun=[u.postRun]);u.postRun.length;)KS(u.postRun.shift());Uc(pr)}}function Lc(F){Xr.unshift(F)}function Bc(F){Yr.unshift(F)}function KS(F){pr.unshift(F)}var Ga=0,ju=null,Js=null;function jS(F){Ga++,u.monitorRunDependencies&&u.monitorRunDependencies(Ga)}function XS(F){if(Ga--,u.monitorRunDependencies&&u.monitorRunDependencies(Ga),Ga==0&&(ju!==null&&(clearInterval(ju),ju=null),Js)){var B=Js;Js=null,B()}}function Xu(F){w?postMessage({cmd:"onAbort",arg:F}):u.onAbort&&u.onAbort(F),F="Aborted("+F+")",q(F),ie=!0,de=1,F+=". Build with -sASSERTIONS for more info.";var B=new WebAssembly.RuntimeError(F);throw l(B),B}var $x="data:application/octet-stream;base64,";function nm(F){return F.startsWith($x)}function Vc(F){return F.startsWith("file://")}var dr;dr="tfjs-backend-wasm-threaded-simd.wasm",nm(dr)||(dr=_(dr));function sm(F){try{if(F==dr&&ee)return new Uint8Array(ee);if(A)return A(F);throw"both async and sync fetching of the wasm failed"}catch(B){Xu(B)}}function Rx(){if(!ee&&(y||b)){if(typeof fetch=="function"&&!Vc(dr))return fetch(dr,{credentials:"same-origin"}).then(function(F){if(!F.ok)throw"failed to load wasm binary file at '"+dr+"'";return F.arrayBuffer()}).catch(function(){return sm(dr)});if(R)return new Promise(function(F,B){R(dr,function(re){F(new Uint8Array(re))},B)})}return Promise.resolve().then(function(){return sm(dr)})}function Ax(){var F={env:xm,wasi_snapshot_preview1:xm};function B($e,Pe){var Wt=$e.exports;if(u.asm=Wt,Wx(u.asm._emscripten_tls_init),rr=u.asm.__indirect_function_table,Bc(u.asm.__wasm_call_ctors),se=Pe,!w){var Zr=Fe.unusedWorkers.length;Fe.unusedWorkers.forEach(function(ta){Fe.loadWasmModuleToWorker(ta,function(){--Zr||XS("wasm-instantiate")})})}}w||jS("wasm-instantiate");function re($e){B($e.instance,$e.module)}function le($e){return Rx().then(function(Pe){return WebAssembly.instantiate(Pe,F)}).then(function(Pe){return Pe}).then($e,function(Pe){q("failed to asynchronously prepare wasm: "+Pe),Xu(Pe)})}function Te(){return!ee&&typeof WebAssembly.instantiateStreaming=="function"&&!nm(dr)&&!Vc(dr)&&!C&&typeof fetch=="function"?fetch(dr,{credentials:"same-origin"}).then(function($e){var Pe=WebAssembly.instantiateStreaming($e,F);return Pe.then(re,function(Wt){return q("wasm streaming compile failed: "+Wt),q("falling back to ArrayBuffer instantiation"),le(re)})}):le(re)}if(u.instantiateWasm)try{var Ze=u.instantiateWasm(F,B);return Ze}catch($e){q("Module.instantiateWasm callback failed with error: "+$e),l($e)}return Te().catch(l),{}}var Fx,YS,Dx={};function Di(F){this.name="ExitStatus",this.message="Program terminated with exit("+F+")",this.status=F}function Px(F){var B=Fe.pthreads[F];delete Fe.pthreads[F],B.terminate(),cb(F),Fe.runningWorkers.splice(Fe.runningWorkers.indexOf(B),1),B.pthread_ptr=0}function Ox(F){var B=Fe.pthreads[F];B.postMessage({cmd:"cancel"})}function zc(F){var B=Fe.pthreads[F];Ie(B),Fe.returnWorkerToPool(B)}function am(F){var B=Fe.getNewWorker();if(!B)return 6;Fe.runningWorkers.push(B),Fe.pthreads[F.pthread_ptr]=B,B.pthread_ptr=F.pthread_ptr;var re={cmd:"run",start_routine:F.startRoutine,arg:F.arg,pthread_ptr:F.pthread_ptr};return B.runPthread=()=>{re.time=performance.now(),B.postMessage(re,F.transferList)},B.loaded&&(B.runPthread(),delete B.runPthread),0}var im={varargs:void 0,get:function(){im.varargs+=4;var F=s()[im.varargs-4>>2];return F},getStr:function(F){var B=Me(F);return B}};function Wc(F){if(w)return Ha(1,1,F);de=F,tn()||(Fe.terminateAllThreads(),u.onExit&&u.onExit(F),ie=!0),g(F,new Di(F))}function QS(F,B){if(de=F,!B&&w)throw pm(F),"unwind";Wc(F)}var um=QS;function Mx(F){if(F instanceof Di||F=="unwind")return de;g(1,F)}var Fe={unusedWorkers:[],runningWorkers:[],tlsInitFunctions:[],pthreads:{},init:function(){w?Fe.initWorker():Fe.initMainThread()},initMainThread:function(){for(var F=8;F--;)Fe.allocateUnusedWorker()},initWorker:function(){X=!1},setExitStatus:function(F){de=F},terminateAllThreads:function(){for(var F of Object.values(Fe.pthreads))Fe.returnWorkerToPool(F);for(var F of Fe.unusedWorkers)F.terminate();Fe.unusedWorkers=[]},returnWorkerToPool:function(F){var B=F.pthread_ptr;delete Fe.pthreads[B],Fe.unusedWorkers.push(F),Fe.runningWorkers.splice(Fe.runningWorkers.indexOf(F),1),F.pthread_ptr=0,cb(B)},receiveObjectTransfer:function(F){},threadInitTLS:function(){Fe.tlsInitFunctions.forEach(F=>F())},loadWasmModuleToWorker:function(F,B){F.onmessage=re=>{var le=re.data,Te=le.cmd;if(F.pthread_ptr&&(Fe.currentProxiedOperationCallerThread=F.pthread_ptr),le.targetThread&&le.targetThread!=Sm()){var Ze=Fe.pthreads[le.targetThread];Ze?Ze.postMessage(le,le.transferList):q('Internal error! Worker sent a message "'+Te+'" to target pthread '+le.targetThread+", but that thread no longer exists!"),Fe.currentProxiedOperationCallerThread=void 0;return}Te==="processProxyingQueue"?Gc(le.queue):Te==="spawnThread"?am(le):Te==="cleanupThread"?zc(le.thread):Te==="killThread"?Px(le.thread):Te==="cancelThread"?Ox(le.thread):Te==="loaded"?(F.loaded=!0,B&&B(F),F.runPthread&&(F.runPthread(),delete F.runPthread)):Te==="print"?G("Thread "+le.threadId+": "+le.text):Te==="printErr"?q("Thread "+le.threadId+": "+le.text):Te==="alert"?alert("Thread "+le.threadId+": "+le.text):le.target==="setimmediate"?F.postMessage(le):Te==="onAbort"?u.onAbort&&u.onAbort(le.arg):Te&&q("worker sent an unknown command "+Te),Fe.currentProxiedOperationCallerThread=void 0},F.onerror=re=>{var le="worker sent an error!";throw q(le+" "+re.filename+":"+re.lineno+": "+re.message),re},C&&(F.on("message",function(re){F.onmessage({data:re})}),F.on("error",function(re){F.onerror(re)}),F.on("detachedExit",function(){})),F.postMessage({cmd:"load",urlOrBlob:u.mainScriptUrlOrBlob||r,wasmMemory:Q,wasmModule:se})},allocateUnusedWorker:function(){var F=_("tfjs-backend-wasm-threaded-simd.worker.js");Fe.unusedWorkers.push(new Worker(F))},getNewWorker:function(){return Fe.unusedWorkers.length==0&&(Fe.allocateUnusedWorker(),Fe.loadWasmModuleToWorker(Fe.unusedWorkers[0])),Fe.unusedWorkers.pop()}};u.PThread=Fe;function Uc(F){for(;F.length>0;)F.shift()(u)}function Lx(F){var B=lb(),re=F();return vm(B),re}function ZS(F){return F}function JS(F){var B=/\b_Z[\w\d_]+/g;return F.replace(B,function(re){var le=re;return re===le?re:le+" ["+re+"]"})}function Bx(){var F=Sm(),B=s()[F+44>>2],re=s()[F+48>>2],le=B-re;a0(B,le),vm(B)}u.establishStackSpace=Bx;function pm(F){if(w)return Ha(2,0,F);try{um(F)}catch(B){Mx(B)}}var Yu=[];function Vx(F){var B=Yu[F];return B||(F>=Yu.length&&(Yu.length=F+1),Yu[F]=B=rr.get(F)),B}function zx(F,B){var re=Vx(F)(B);tn()?Fe.setExitStatus(re):s0(re)}u.invokeEntryPoint=zx;function e0(){var F=new Error;if(!F.stack){try{throw new Error}catch(B){F=B}if(!F.stack)return"(no stack trace available)"}return F.stack.toString()}function Wx(F){Fe.tlsInitFunctions.push(F)}function Ux(F,B){t().set(F,B)}function Gx(F){r0(F,!b,1,!y),Fe.threadInitTLS()}function Hx(F){w?postMessage({cmd:"cleanupThread",thread:F}):zc(F)}function cm(F,B,re,le){return w?Ha(3,1,F,B,re,le):lm(F,B,re,le)}function lm(F,B,re,le){if(typeof SharedArrayBuffer=="undefined")return q("Current environment does not support SharedArrayBuffer, pthreads are not available!"),6;var Te=[],Ze=0;if(w&&(Te.length===0||Ze))return cm(F,B,re,le);if(Ze)return Ze;var $e={startRoutine:re,pthread_ptr:F,arg:le,transferList:Te};return w?($e.cmd="spawnThread",postMessage($e,Te),0):am($e)}function qx(){return 2097152}var Kx=!0;function jx(){return Kx}function Gc(F){Atomics.store(s(),F>>2,1),Sm()&&n0(F),Atomics.compareExchange(s(),F>>2,1,0)}u.executeNotifiedProxyingQueue=Gc;function Xx(F,B,re,le){if(F==B)setTimeout(()=>Gc(le));else if(w)postMessage({targetThread:F,cmd:"processProxyingQueue",queue:le});else{var Te=Fe.pthreads[F];if(!Te)return;Te.postMessage({cmd:"processProxyingQueue",queue:le})}return 1}function Yx(F,B,re){return-1}function Qx(){Xu("")}function Pi(F){Pi.shown||(Pi.shown={}),Pi.shown[F]||(Pi.shown[F]=1,C&&(F="warning: "+F),q(F))}function Zx(){C||b||Pi("Blocking on the main thread is very dangerous, see https://emscripten.org/docs/porting/pthreads.html#blocking-on-the-main-browser-thread")}function Jx(){return Date.now()}function mm(){return 2147483648}function ey(){return mm()}var Qu;C?Qu=()=>{var F=process.hrtime();return F[0]*1e3+F[1]/1e6}:w?Qu=()=>performance.now()-u.__performance_now_clock_drift:Qu=()=>performance.now();function ty(F,B,re){o().copyWithin(F,B,B+re)}function ry(){return C?O3().cpus().length:navigator.hardwareConcurrency}function Ha(F,B){var re=arguments.length-2,le=arguments;return Lx(()=>{for(var Te=re,Ze=km(Te*8),$e=Ze>>3,Pe=0;Pe>3,Te=0;Te>>16),Tt(Q.buffer),1}catch(B){}}function sy(F){var B=o().length;if(F=F>>>0,F<=B)return!1;var re=mm();if(F>re)return!1;let le=(Wt,Zr)=>Wt+(Zr-Wt%Zr)%Zr;for(var Te=1;Te<=4;Te*=2){var Ze=B*(1+.2/Te);Ze=Math.min(Ze,F+100663296);var $e=Math.min(re,le(Math.max(F,Ze),65536)),Pe=ny($e);if(Pe)return!0}return!1}function ay(){throw"unwind"}function fm(F){return w?Ha(4,1,F):52}function dm(F,B,re,le,Te){return w?Ha(5,1,F,B,re,le,Te):70}var iy=[null,[],[]];function uy(F,B){var re=iy[F];B===0||B===10?((F===1?G:q)(Ee(re,0)),re.length=0):re.push(B)}function hm(F,B,re,le){if(w)return Ha(6,1,F,B,re,le);for(var Te=0,Ze=0;Ze>2],Pe=a()[B+4>>2];B+=8;for(var Wt=0;Wt>2]=Te,0}function gm(F){var B=u["_"+F];return B}function py(F,B,re,le,Te){var Ze={string:Dr=>{var tp=0;if(Dr!=null&&Dr!==0){var p0=(Dr.length<<2)+1;tp=km(p0),pt(Dr,tp,p0)}return tp},array:Dr=>{var tp=km(Dr.length);return Ux(Dr,tp),tp}};function $e(Dr){return B==="string"?Me(Dr):B==="boolean"?Boolean(Dr):Dr}var Pe=gm(F),Wt=[],Zr=0;if(le)for(var ta=0;ta$e==="number"||$e==="boolean"),Ze=B!=="string";return Ze&&Te&&!le?gm(F):function(){return py(F,B,re,arguments,le)}}Fe.init();var ly=[null,Wc,pm,cm,fm,dm,hm],xm={__emscripten_init_main_thread_js:Gx,__emscripten_thread_cleanup:Hx,__pthread_create_js:lm,_emscripten_default_pthread_stack_size:qx,_emscripten_get_now_is_monotonic:jx,_emscripten_notify_task_queue:Xx,_emscripten_set_offscreencanvas_size:Yx,abort:Qx,emscripten_check_blocking_allowed:Zx,emscripten_date_now:Jx,emscripten_get_heap_max:ey,emscripten_get_now:Qu,emscripten_memcpy_big:ty,emscripten_num_logical_cores:ry,emscripten_receive_on_main_thread_js:oy,emscripten_resize_heap:sy,emscripten_unwind_to_js_event_loop:ay,exit:um,fd_close:fm,fd_seek:dm,fd_write:hm,memory:Q||u.wasmMemory},t0=Ax(),my=u.___wasm_call_ctors=function(){return(my=u.___wasm_call_ctors=u.asm.__wasm_call_ctors).apply(null,arguments)},fy=u._init=function(){return(fy=u._init=u.asm.init).apply(null,arguments)},dy=u._init_with_threads_count=function(){return(dy=u._init_with_threads_count=u.asm.init_with_threads_count).apply(null,arguments)},hy=u._get_threads_count=function(){return(hy=u._get_threads_count=u.asm.get_threads_count).apply(null,arguments)},gy=u._register_tensor=function(){return(gy=u._register_tensor=u.asm.register_tensor).apply(null,arguments)},xy=u._dispose_data=function(){return(xy=u._dispose_data=u.asm.dispose_data).apply(null,arguments)},yy=u._dispose=function(){return(yy=u._dispose=u.asm.dispose).apply(null,arguments)},by=u._Abs=function(){return(by=u._Abs=u.asm.Abs).apply(null,arguments)},Cy=u._Add=function(){return(Cy=u._Add=u.asm.Add).apply(null,arguments)},Iy=u._AddN=function(){return(Iy=u._AddN=u.asm.AddN).apply(null,arguments)},wy=u._All=function(){return(wy=u._All=u.asm.All).apply(null,arguments)},Sy=u._Any=function(){return(Sy=u._Any=u.asm.Any).apply(null,arguments)},vy=u._ArgMax=function(){return(vy=u._ArgMax=u.asm.ArgMax).apply(null,arguments)},ky=u._AvgPool=function(){return(ky=u._AvgPool=u.asm.AvgPool).apply(null,arguments)},Ty=u._BatchMatMul=function(){return(Ty=u._BatchMatMul=u.asm.BatchMatMul).apply(null,arguments)},Ny=u._Ceil=function(){return(Ny=u._Ceil=u.asm.Ceil).apply(null,arguments)},_y=u._ClipByValue=function(){return(_y=u._ClipByValue=u.asm.ClipByValue).apply(null,arguments)},Ey=u._Conv2D=function(){return(Ey=u._Conv2D=u.asm.Conv2D).apply(null,arguments)},$y=u._Conv2DBackpropInput=function(){return($y=u._Conv2DBackpropInput=u.asm.Conv2DBackpropInput).apply(null,arguments)},Ry=u._Cos=function(){return(Ry=u._Cos=u.asm.Cos).apply(null,arguments)},Ay=u._Cosh=function(){return(Ay=u._Cosh=u.asm.Cosh).apply(null,arguments)},Fy=u._CropAndResize=function(){return(Fy=u._CropAndResize=u.asm.CropAndResize).apply(null,arguments)},Dy=u._Cumprod=function(){return(Dy=u._Cumprod=u.asm.Cumprod).apply(null,arguments)},Py=u._Cumsum=function(){return(Py=u._Cumsum=u.asm.Cumsum).apply(null,arguments)},Oy=u._DepthToSpace=function(){return(Oy=u._DepthToSpace=u.asm.DepthToSpace).apply(null,arguments)},My=u._DepthwiseConv2dNative=function(){return(My=u._DepthwiseConv2dNative=u.asm.DepthwiseConv2dNative).apply(null,arguments)},Ly=u._Elu=function(){return(Ly=u._Elu=u.asm.Elu).apply(null,arguments)},By=u._Equal=function(){return(By=u._Equal=u.asm.Equal).apply(null,arguments)},Vy=u._Exp=function(){return(Vy=u._Exp=u.asm.Exp).apply(null,arguments)},zy=u._FlipLeftRight=function(){return(zy=u._FlipLeftRight=u.asm.FlipLeftRight).apply(null,arguments)},Wy=u._Floor=function(){return(Wy=u._Floor=u.asm.Floor).apply(null,arguments)},Uy=u._FloorDiv=function(){return(Uy=u._FloorDiv=u.asm.FloorDiv).apply(null,arguments)},Gy=u._FusedBatchNorm=function(){return(Gy=u._FusedBatchNorm=u.asm.FusedBatchNorm).apply(null,arguments)},Hy=u._FusedConv2D=function(){return(Hy=u._FusedConv2D=u.asm.FusedConv2D).apply(null,arguments)},qy=u._FusedDepthwiseConv2D=function(){return(qy=u._FusedDepthwiseConv2D=u.asm.FusedDepthwiseConv2D).apply(null,arguments)},Ky=u._Gather=function(){return(Ky=u._Gather=u.asm.Gather).apply(null,arguments)},jy=u._GatherNd=function(){return(jy=u._GatherNd=u.asm.GatherNd).apply(null,arguments)},Xy=u._Greater=function(){return(Xy=u._Greater=u.asm.Greater).apply(null,arguments)},Yy=u._GreaterEqual=function(){return(Yy=u._GreaterEqual=u.asm.GreaterEqual).apply(null,arguments)},Qy=u._LeakyRelu=function(){return(Qy=u._LeakyRelu=u.asm.LeakyRelu).apply(null,arguments)},Zy=u._Less=function(){return(Zy=u._Less=u.asm.Less).apply(null,arguments)},Jy=u._LessEqual=function(){return(Jy=u._LessEqual=u.asm.LessEqual).apply(null,arguments)},eb=u._Log=function(){return(eb=u._Log=u.asm.Log).apply(null,arguments)},tb=u._LogicalAnd=function(){return(tb=u._LogicalAnd=u.asm.LogicalAnd).apply(null,arguments)},rb=u._LogicalNot=function(){return(rb=u._LogicalNot=u.asm.LogicalNot).apply(null,arguments)},ob=u._LogicalOr=function(){return(ob=u._LogicalOr=u.asm.LogicalOr).apply(null,arguments)},nb=u._LogicalXor=function(){return(nb=u._LogicalXor=u.asm.LogicalXor).apply(null,arguments)},sb=u._Max=function(){return(sb=u._Max=u.asm.Max).apply(null,arguments)},ym=u._MaxPool=function(){return(ym=u._MaxPool=u.asm.MaxPool).apply(null,arguments)},bm=u._Maximum=function(){return(bm=u._Maximum=u.asm.Maximum).apply(null,arguments)},qc=u._Mean=function(){return(qc=u._Mean=u.asm.Mean).apply(null,arguments)},ab=u._Min=function(){return(ab=u._Min=u.asm.Min).apply(null,arguments)},ib=u._Minimum=function(){return(ib=u._Minimum=u.asm.Minimum).apply(null,arguments)},Zu=u._MirrorPad=function(){return(Zu=u._MirrorPad=u.asm.MirrorPad).apply(null,arguments)},Cm=u._Multiply=function(){return(Cm=u._Multiply=u.asm.Multiply).apply(null,arguments)},Ju=u._Neg=function(){return(Ju=u._Neg=u.asm.Neg).apply(null,arguments)},ep=u._NonMaxSuppressionV3=function(){return(ep=u._NonMaxSuppressionV3=u.asm.NonMaxSuppressionV3).apply(null,arguments)},ub=u._NonMaxSuppressionV4=function(){return(ub=u._NonMaxSuppressionV4=u.asm.NonMaxSuppressionV4).apply(null,arguments)},U=u._NonMaxSuppressionV5=function(){return(U=u._NonMaxSuppressionV5=u.asm.NonMaxSuppressionV5).apply(null,arguments)},te=u._NotEqual=function(){return(te=u._NotEqual=u.asm.NotEqual).apply(null,arguments)},ve=u._OneHot=function(){return(ve=u._OneHot=u.asm.OneHot).apply(null,arguments)},Ke=u._PadV2=function(){return(Ke=u._PadV2=u.asm.PadV2).apply(null,arguments)},Nt=u._Pow=function(){return(Nt=u._Pow=u.asm.Pow).apply(null,arguments)},_t=u._Prelu=function(){return(_t=u._Prelu=u.asm.Prelu).apply(null,arguments)},He=u._Prod=function(){return(He=u._Prod=u.asm.Prod).apply(null,arguments)},ze=u._RealDiv=function(){return(ze=u._RealDiv=u.asm.RealDiv).apply(null,arguments)},zt=u._Relu=function(){return(zt=u._Relu=u.asm.Relu).apply(null,arguments)},Qr=u._Relu6=function(){return(Qr=u._Relu6=u.asm.Relu6).apply(null,arguments)},ea=u._ResizeBilinear=function(){return(ea=u._ResizeBilinear=u.asm.ResizeBilinear).apply(null,arguments)},Im=u._ResizeNearestNeighbor=function(){return(Im=u._ResizeNearestNeighbor=u.asm.ResizeNearestNeighbor).apply(null,arguments)},Kc=u._Reverse=function(){return(Kc=u._Reverse=u.asm.Reverse).apply(null,arguments)},pb=u._RotateWithOffset=function(){return(pb=u._RotateWithOffset=u.asm.RotateWithOffset).apply(null,arguments)},hr=u._Round=function(){return(hr=u._Round=u.asm.Round).apply(null,arguments)},qa=u._Rsqrt=function(){return(qa=u._Rsqrt=u.asm.Rsqrt).apply(null,arguments)},wm=u._ScatterNd=function(){return(wm=u._ScatterNd=u.asm.ScatterNd).apply(null,arguments)},yV=u._SelectV2=function(){return(yV=u._SelectV2=u.asm.SelectV2).apply(null,arguments)},bV=u._Sigmoid=function(){return(bV=u._Sigmoid=u.asm.Sigmoid).apply(null,arguments)},CV=u._Sin=function(){return(CV=u._Sin=u.asm.Sin).apply(null,arguments)},IV=u._Softmax=function(){return(IV=u._Softmax=u.asm.Softmax).apply(null,arguments)},wV=u._SparseFillEmptyRows=function(){return(wV=u._SparseFillEmptyRows=u.asm.SparseFillEmptyRows).apply(null,arguments)},SV=u._SparseReshape=function(){return(SV=u._SparseReshape=u.asm.SparseReshape).apply(null,arguments)},vV=u._SparseSegmentReduction=function(){return(vV=u._SparseSegmentReduction=u.asm.SparseSegmentReduction).apply(null,arguments)},kV=u._Sqrt=function(){return(kV=u._Sqrt=u.asm.Sqrt).apply(null,arguments)},TV=u._Square=function(){return(TV=u._Square=u.asm.Square).apply(null,arguments)},NV=u._SquaredDifference=function(){return(NV=u._SquaredDifference=u.asm.SquaredDifference).apply(null,arguments)},_V=u._Step=function(){return(_V=u._Step=u.asm.Step).apply(null,arguments)},EV=u._StridedSlice=function(){return(EV=u._StridedSlice=u.asm.StridedSlice).apply(null,arguments)},$V=u._Sub=function(){return($V=u._Sub=u.asm.Sub).apply(null,arguments)},RV=u._Sum=function(){return(RV=u._Sum=u.asm.Sum).apply(null,arguments)},AV=u._Tan=function(){return(AV=u._Tan=u.asm.Tan).apply(null,arguments)},FV=u._Tanh=function(){return(FV=u._Tanh=u.asm.Tanh).apply(null,arguments)},DV=u._Tile=function(){return(DV=u._Tile=u.asm.Tile).apply(null,arguments)},PV=u._TopK=function(){return(PV=u._TopK=u.asm.TopK).apply(null,arguments)},OV=u._Transform=function(){return(OV=u._Transform=u.asm.Transform).apply(null,arguments)},MV=u._Transpose=function(){return(MV=u._Transpose=u.asm.Transpose).apply(null,arguments)},LV=u.__FusedMatMul=function(){return(LV=u.__FusedMatMul=u.asm._FusedMatMul).apply(null,arguments)},BV=u._malloc=function(){return(BV=u._malloc=u.asm.malloc).apply(null,arguments)},VV=u._free=function(){return(VV=u._free=u.asm.free).apply(null,arguments)},zV=u.__emscripten_tls_init=function(){return(zV=u.__emscripten_tls_init=u.asm._emscripten_tls_init).apply(null,arguments)},Sm=u._pthread_self=function(){return(Sm=u._pthread_self=u.asm.pthread_self).apply(null,arguments)},WV=u.___errno_location=function(){return(WV=u.___errno_location=u.asm.__errno_location).apply(null,arguments)},r0=u.__emscripten_thread_init=function(){return(r0=u.__emscripten_thread_init=u.asm._emscripten_thread_init).apply(null,arguments)},UV=u.__emscripten_thread_crashed=function(){return(UV=u.__emscripten_thread_crashed=u.asm._emscripten_thread_crashed).apply(null,arguments)},GV=u._emscripten_main_thread_process_queued_calls=function(){return(GV=u._emscripten_main_thread_process_queued_calls=u.asm.emscripten_main_thread_process_queued_calls).apply(null,arguments)},HV=u._emscripten_main_browser_thread_id=function(){return(HV=u._emscripten_main_browser_thread_id=u.asm.emscripten_main_browser_thread_id).apply(null,arguments)},o0=u._emscripten_run_in_main_runtime_thread_js=function(){return(o0=u._emscripten_run_in_main_runtime_thread_js=u.asm.emscripten_run_in_main_runtime_thread_js).apply(null,arguments)},qV=u._emscripten_dispatch_to_thread_=function(){return(qV=u._emscripten_dispatch_to_thread_=u.asm.emscripten_dispatch_to_thread_).apply(null,arguments)},n0=u.__emscripten_proxy_execute_task_queue=function(){return(n0=u.__emscripten_proxy_execute_task_queue=u.asm._emscripten_proxy_execute_task_queue).apply(null,arguments)},cb=u.__emscripten_thread_free_data=function(){return(cb=u.__emscripten_thread_free_data=u.asm._emscripten_thread_free_data).apply(null,arguments)},s0=u.__emscripten_thread_exit=function(){return(s0=u.__emscripten_thread_exit=u.asm._emscripten_thread_exit).apply(null,arguments)},a0=u._emscripten_stack_set_limits=function(){return(a0=u._emscripten_stack_set_limits=u.asm.emscripten_stack_set_limits).apply(null,arguments)},lb=u.stackSave=function(){return(lb=u.stackSave=u.asm.stackSave).apply(null,arguments)},vm=u.stackRestore=function(){return(vm=u.stackRestore=u.asm.stackRestore).apply(null,arguments)},km=u.stackAlloc=function(){return(km=u.stackAlloc=u.asm.stackAlloc).apply(null,arguments)},KV=u.dynCall_iijjiiii=function(){return(KV=u.dynCall_iijjiiii=u.asm.dynCall_iijjiiii).apply(null,arguments)},jV=u.dynCall_jiji=function(){return(jV=u.dynCall_jiji=u.asm.dynCall_jiji).apply(null,arguments)};u.keepRuntimeAlive=tn,u.wasmMemory=Q,u.cwrap=cy,u.ExitStatus=Di,u.PThread=Fe;var Tm;Js=function F(){Tm||i0(),Tm||(Js=F)};function i0(F){if(F=F||d,Ga>0)return;if(w){c(u),jt(),postMessage({cmd:"loaded"});return}if(Ua(),Ga>0)return;function B(){Tm||(Tm=!0,u.calledRun=!0,!ie&&(jt(),c(u),u.onRuntimeInitialized&&u.onRuntimeInitialized(),Zs()))}u.setStatus?(u.setStatus("Running..."),setTimeout(function(){setTimeout(function(){u.setStatus("")},1),B()},1)):B()}if(u.preInit)for(typeof u.preInit=="function"&&(u.preInit=[u.preInit]);u.preInit.length>0;)u.preInit.pop()();i0();var Nm;m&&(Nm={uncaughtException:process.listeners("uncaughtException").filter(function(F){return!m.uncaughtException.indexOf(F)>-1}),unhandledRejection:process.listeners("unhandledRejection").filter(function(F){return!m.unhandledRejection.indexOf(F)>-1})});var _m;if(typeof WasmBackendModule!="undefined")_m=WasmBackendModule;else if(typeof e!="undefined")_m=e;else throw new Error("Could not find wasm module in post.js");if(Nm){var XV=_m._dispose;_m._dispose=function(){XV(),Nm.uncaughtException.forEach(function(F){process.removeListener("uncaughtException",F)}),Nm.unhandledRejection.forEach(function(F){process.removeListener("unhandledRejection",F)})}}return e.ready}})();typeof Fg=="object"&&typeof Jw=="object"?Jw.exports=Zw:typeof define=="function"&&define.amd?define([],function(){return Zw}):typeof Fg=="object"&&(Fg.WasmBackendModuleThreadedSimd=Zw)});var B3=Kt((ukt,L3)=>{L3.exports.wasmWorkerContents=`"use strict";var Module={};var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";if(ENVIRONMENT_IS_NODE){var nodeWorkerThreads=require("worker_threads");var parentPort=nodeWorkerThreads.parentPort;parentPort.on("message",data=>onmessage({data:data}));var fs=require("fs");Object.assign(global,{self:global,require:require,Module:Module,location:{href:__filename},Worker:nodeWorkerThreads.Worker,importScripts:function(f){(0,eval)(fs.readFileSync(f,"utf8"))},postMessage:function(msg){parentPort.postMessage(msg)},performance:global.performance||{now:function(){return Date.now()}}})}var initializedJS=false;var pendingNotifiedProxyingQueues=[];function threadPrintErr(){var text=Array.prototype.slice.call(arguments).join(" ");if(ENVIRONMENT_IS_NODE){fs.writeSync(2,text+" +");return}console.error(text)}function threadAlert(){var text=Array.prototype.slice.call(arguments).join(" ");postMessage({cmd:"alert",text:text,threadId:Module["_pthread_self"]()})}var err=threadPrintErr;self.alert=threadAlert;Module["instantiateWasm"]=(info,receiveInstance)=>{var instance=new WebAssembly.Instance(Module["wasmModule"],info);receiveInstance(instance);Module["wasmModule"]=null;return instance.exports};self.onunhandledrejection=e=>{throw e.reason??e};self.onmessage=e=>{try{if(e.data.cmd==="load"){Module["wasmModule"]=e.data.wasmModule;Module["wasmMemory"]=e.data.wasmMemory;Module["buffer"]=Module["wasmMemory"].buffer;Module["ENVIRONMENT_IS_PTHREAD"]=true;if(typeof e.data.urlOrBlob=="string"){importScripts(e.data.urlOrBlob)}else{var objectUrl=URL.createObjectURL(e.data.urlOrBlob);importScripts(objectUrl);URL.revokeObjectURL(objectUrl)}WasmBackendModuleThreadedSimd(Module).then(function(instance){Module=instance})}else if(e.data.cmd==="run"){Module["__performance_now_clock_drift"]=performance.now()-e.data.time;Module["__emscripten_thread_init"](e.data.pthread_ptr,0,0,1);Module["establishStackSpace"]();Module["PThread"].receiveObjectTransfer(e.data);Module["PThread"].threadInitTLS();if(!initializedJS){pendingNotifiedProxyingQueues.forEach(queue=>{Module["executeNotifiedProxyingQueue"](queue)});pendingNotifiedProxyingQueues=[];initializedJS=true}try{Module["invokeEntryPoint"](e.data.start_routine,e.data.arg)}catch(ex){if(ex!="unwind"){if(ex instanceof Module["ExitStatus"]){if(Module["keepRuntimeAlive"]()){}else{Module["__emscripten_thread_exit"](ex.status)}}else{throw ex}}}}else if(e.data.cmd==="cancel"){if(Module["_pthread_self"]()){Module["__emscripten_thread_exit"](-1)}}else if(e.data.target==="setimmediate"){}else if(e.data.cmd==="processProxyingQueue"){if(initializedJS){Module["executeNotifiedProxyingQueue"](e.data.queue)}else{pendingNotifiedProxyingQueues.push(e.data.queue)}}else if(e.data.cmd){err("worker.js received unknown command "+e.data.cmd);err(e.data)}}catch(ex){if(Module["__emscripten_thread_crashed"]){Module["__emscripten_thread_crashed"]()}throw ex}};`});var V3=Kt((Dg,tS)=>{var eS=(()=>{var r=typeof document!="undefined"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename!="undefined"&&(r=r||__filename),function(e){e=e||{};var t=typeof e!="undefined"?e:{},o,n;t.ready=new Promise(function(U,te){o=U,n=te});var s;typeof process!="undefined"&&process.listeners&&(s={uncaughtException:process.listeners("uncaughtException"),unhandledRejection:process.listeners("unhandledRejection")});var a=Object.assign({},t),i=[],p="./this.program",u=(U,te)=>{throw te},c=typeof window=="object",l=typeof importScripts=="function",m=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string",f="";function d(U){return t.locateFile?t.locateFile(U,f):f+U}var h,g,y,b;function C(U){if(U instanceof ju)return;E("exiting due to exception: "+U)}if(m){l?f=Vl().dirname(f)+"/":f=__dirname+"/";var w,k;typeof Em=="function"&&(w=Qw(),k=Vl()),h=(U,te)=>(U=k.normalize(U),w.readFileSync(U,te?void 0:"utf8")),y=U=>{var te=h(U,!0);return te.buffer||(te=new Uint8Array(te)),te},g=(U,te,ve)=>{U=k.normalize(U),w.readFile(U,function(Ke,Nt){Ke?ve(Ke):te(Nt.buffer)})},process.argv.length>1&&(p=process.argv[1].replace(/\\/g,"/")),i=process.argv.slice(2),process.on("uncaughtException",function(U){if(!(U instanceof ju))throw U}),process.on("unhandledRejection",function(U){throw U}),u=(U,te)=>{if(at())throw process.exitCode=U,te;C(te),process.exit(U)},t.inspect=function(){return"[Emscripten Module object]"}}else(c||l)&&(l?f=self.location.href:typeof document!="undefined"&&document.currentScript&&(f=document.currentScript.src),r&&(f=r),f.indexOf("blob:")!==0?f=f.substr(0,f.replace(/[?#].*/,"").lastIndexOf("/")+1):f="",h=U=>{var te=new XMLHttpRequest;return te.open("GET",U,!1),te.send(null),te.responseText},l&&(y=U=>{var te=new XMLHttpRequest;return te.open("GET",U,!1),te.responseType="arraybuffer",te.send(null),new Uint8Array(te.response)}),g=(U,te,ve)=>{var Ke=new XMLHttpRequest;Ke.open("GET",U,!0),Ke.responseType="arraybuffer",Ke.onload=()=>{if(Ke.status==200||Ke.status==0&&Ke.response){te(Ke.response);return}ve()},Ke.onerror=ve,Ke.send(null)},b=U=>document.title=U);var _=t.print||console.log.bind(console),E=t.printErr||console.warn.bind(console);Object.assign(t,a),a=null,t.arguments&&(i=t.arguments),t.thisProgram&&(p=t.thisProgram),t.quit&&(u=t.quit);var R=4,A;t.wasmBinary&&(A=t.wasmBinary);var D=t.noExitRuntime||!0;typeof WebAssembly!="object"&&pr("no native wasm support detected");var O,M=!1,L;function W(U,te){U||pr(te)}var V=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):void 0;function G(U,te,ve){for(var Ke=te+ve,Nt=te;U[Nt]&&!(Nt>=Ke);)++Nt;if(Nt-te>16&&U.buffer&&V)return V.decode(U.subarray(te,Nt));for(var _t="";te>10,56320|Qr&1023)}}return _t}function q(U,te){return U?G(ee,U,te):""}function H(U,te,ve,Ke){if(!(Ke>0))return 0;for(var Nt=ve,_t=ve+Ke-1,He=0;He=55296&&ze<=57343){var zt=U.charCodeAt(++He);ze=65536+((ze&1023)<<10)|zt&1023}if(ze<=127){if(ve>=_t)break;te[ve++]=ze}else if(ze<=2047){if(ve+1>=_t)break;te[ve++]=192|ze>>6,te[ve++]=128|ze&63}else if(ze<=65535){if(ve+2>=_t)break;te[ve++]=224|ze>>12,te[ve++]=128|ze>>6&63,te[ve++]=128|ze&63}else{if(ve+3>=_t)break;te[ve++]=240|ze>>18,te[ve++]=128|ze>>12&63,te[ve++]=128|ze>>6&63,te[ve++]=128|ze&63}}return te[ve]=0,ve-Nt}function j(U,te,ve){return H(U,ee,te,ve)}var Y,Z,ee,X,Q,se,ie,de,Ie;function Se(U){Y=U,t.HEAP8=Z=new Int8Array(U),t.HEAP16=X=new Int16Array(U),t.HEAP32=se=new Int32Array(U),t.HEAPU8=ee=new Uint8Array(U),t.HEAPU16=Q=new Uint16Array(U),t.HEAPU32=ie=new Uint32Array(U),t.HEAPF32=de=new Float32Array(U),t.HEAPF64=Ie=new Float64Array(U)}var Ee=t.INITIAL_MEMORY||16777216,Me,st=[],pt=[],De=[],ft=!1;function at(){return D}function dt(){if(t.preRun)for(typeof t.preRun=="function"&&(t.preRun=[t.preRun]);t.preRun.length;)Pt(t.preRun.shift());Js(st)}function It(){ft=!0,Js(pt)}function Fr(){if(t.postRun)for(typeof t.postRun=="function"&&(t.postRun=[t.postRun]);t.postRun.length;)er(t.postRun.shift());Js(De)}function Pt(U){st.unshift(U)}function jr(U){pt.unshift(U)}function er(U){De.unshift(U)}var Tt=0,tr=null,rr=null;function Xr(U){Tt++,t.monitorRunDependencies&&t.monitorRunDependencies(Tt)}function Yr(U){if(Tt--,t.monitorRunDependencies&&t.monitorRunDependencies(Tt),Tt==0&&(tr!==null&&(clearInterval(tr),tr=null),rr)){var te=rr;rr=null,te()}}function pr(U){t.onAbort&&t.onAbort(U),U="Aborted("+U+")",E(U),M=!0,L=1,U+=". Build with -sASSERTIONS for more info.";var te=new WebAssembly.RuntimeError(U);throw n(te),te}var Qs="data:application/octet-stream;base64,";function tn(U){return U.startsWith(Qs)}function Ua(U){return U.startsWith("file://")}var jt;jt="tfjs-backend-wasm.wasm",tn(jt)||(jt=d(jt));function Zs(U){try{if(U==jt&&A)return new Uint8Array(A);if(y)return y(U);throw"both async and sync fetching of the wasm failed"}catch(te){pr(te)}}function Lc(){if(!A&&(c||l)){if(typeof fetch=="function"&&!Ua(jt))return fetch(jt,{credentials:"same-origin"}).then(function(U){if(!U.ok)throw"failed to load wasm binary file at '"+jt+"'";return U.arrayBuffer()}).catch(function(){return Zs(jt)});if(g)return new Promise(function(U,te){g(jt,function(ve){U(new Uint8Array(ve))},te)})}return Promise.resolve().then(function(){return Zs(jt)})}function Bc(){var U={env:Wc,wasi_snapshot_preview1:Wc};function te(He,ze){var zt=He.exports;t.asm=zt,O=t.asm.memory,Se(O.buffer),Me=t.asm.__indirect_function_table,jr(t.asm.__wasm_call_ctors),Yr("wasm-instantiate")}Xr("wasm-instantiate");function ve(He){te(He.instance)}function Ke(He){return Lc().then(function(ze){return WebAssembly.instantiate(ze,U)}).then(function(ze){return ze}).then(He,function(ze){E("failed to asynchronously prepare wasm: "+ze),pr(ze)})}function Nt(){return!A&&typeof WebAssembly.instantiateStreaming=="function"&&!tn(jt)&&!Ua(jt)&&!m&&typeof fetch=="function"?fetch(jt,{credentials:"same-origin"}).then(function(He){var ze=WebAssembly.instantiateStreaming(He,U);return ze.then(ve,function(zt){return E("wasm streaming compile failed: "+zt),E("falling back to ArrayBuffer instantiation"),Ke(ve)})}):Ke(ve)}if(t.instantiateWasm)try{var _t=t.instantiateWasm(U,te);return _t}catch(He){E("Module.instantiateWasm callback failed with error: "+He),n(He)}return Nt().catch(n),{}}var KS,Ga;function ju(U){this.name="ExitStatus",this.message="Program terminated with exit("+U+")",this.status=U}function Js(U){for(;U.length>0;)U.shift()(t)}function jS(U){return U}function XS(U){var te=/\b_Z[\w\d_]+/g;return U.replace(te,function(ve){var Ke=ve;return ve===Ke?ve:Ke+" ["+ve+"]"})}function Xu(){var U=new Error;if(!U.stack){try{throw new Error}catch(te){U=te}if(!U.stack)return"(no stack trace available)"}return U.stack.toString()}function $x(U,te){Z.set(U,te)}function nm(){pr("")}function Vc(){return 2147483648}function dr(){return Vc()}function sm(U,te,ve){ee.copyWithin(U,te,te+ve)}function Rx(U){try{return O.grow(U-Y.byteLength+65535>>>16),Se(O.buffer),1}catch(te){}}function Ax(U){var te=ee.length;U=U>>>0;var ve=Vc();if(U>ve)return!1;let Ke=(zt,Qr)=>zt+(Qr-zt%Qr)%Qr;for(var Nt=1;Nt<=4;Nt*=2){var _t=te*(1+.2/Nt);_t=Math.min(_t,U+100663296);var He=Math.min(ve,Ke(Math.max(U,_t),65536)),ze=Rx(He);if(ze)return!0}return!1}var Fx={varargs:void 0,get:function(){Fx.varargs+=4;var U=se[Fx.varargs-4>>2];return U},getStr:function(U){var te=q(U);return te}};function YS(U){return 52}function Dx(U,te,ve,Ke,Nt){return 70}var Di=[null,[],[]];function Px(U,te){var ve=Di[U];te===0||te===10?((U===1?_:E)(G(ve,0)),ve.length=0):ve.push(te)}function Ox(U,te,ve,Ke){for(var Nt=0,_t=0;_t>2],ze=ie[te+4>>2];te+=8;for(var zt=0;zt>2]=Nt,0}function zc(U){var te=t["_"+U];return te}function am(U,te,ve,Ke,Nt){var _t={string:hr=>{var qa=0;if(hr!=null&&hr!==0){var wm=(hr.length<<2)+1;qa=qc(wm),j(hr,qa,wm)}return qa},array:hr=>{var qa=qc(hr.length);return $x(hr,qa),qa}};function He(hr){return te==="string"?q(hr):te==="boolean"?Boolean(hr):hr}var ze=zc(U),zt=[],Qr=0;if(Ke)for(var ea=0;eaHe==="number"||He==="boolean"),_t=te!=="string";return _t&&Nt&&!Ke?zc(U):function(){return am(U,te,ve,arguments,Ke)}}var Wc={abort:nm,emscripten_get_heap_max:dr,emscripten_memcpy_big:sm,emscripten_resize_heap:Ax,fd_close:YS,fd_seek:Dx,fd_write:Ox},QS=Bc(),um=t.___wasm_call_ctors=function(){return(um=t.___wasm_call_ctors=t.asm.__wasm_call_ctors).apply(null,arguments)},Mx=t._init=function(){return(Mx=t._init=t.asm.init).apply(null,arguments)},Fe=t._init_with_threads_count=function(){return(Fe=t._init_with_threads_count=t.asm.init_with_threads_count).apply(null,arguments)},Uc=t._get_threads_count=function(){return(Uc=t._get_threads_count=t.asm.get_threads_count).apply(null,arguments)},Lx=t._register_tensor=function(){return(Lx=t._register_tensor=t.asm.register_tensor).apply(null,arguments)},ZS=t._dispose_data=function(){return(ZS=t._dispose_data=t.asm.dispose_data).apply(null,arguments)},JS=t._dispose=function(){return(JS=t._dispose=t.asm.dispose).apply(null,arguments)},Bx=t._Abs=function(){return(Bx=t._Abs=t.asm.Abs).apply(null,arguments)},pm=t._Add=function(){return(pm=t._Add=t.asm.Add).apply(null,arguments)},Yu=t._AddN=function(){return(Yu=t._AddN=t.asm.AddN).apply(null,arguments)},Vx=t._All=function(){return(Vx=t._All=t.asm.All).apply(null,arguments)},zx=t._Any=function(){return(zx=t._Any=t.asm.Any).apply(null,arguments)},e0=t._ArgMax=function(){return(e0=t._ArgMax=t.asm.ArgMax).apply(null,arguments)},Wx=t._AvgPool=function(){return(Wx=t._AvgPool=t.asm.AvgPool).apply(null,arguments)},Ux=t._BatchMatMul=function(){return(Ux=t._BatchMatMul=t.asm.BatchMatMul).apply(null,arguments)},Gx=t._Ceil=function(){return(Gx=t._Ceil=t.asm.Ceil).apply(null,arguments)},Hx=t._ClipByValue=function(){return(Hx=t._ClipByValue=t.asm.ClipByValue).apply(null,arguments)},cm=t._Conv2D=function(){return(cm=t._Conv2D=t.asm.Conv2D).apply(null,arguments)},lm=t._Conv2DBackpropInput=function(){return(lm=t._Conv2DBackpropInput=t.asm.Conv2DBackpropInput).apply(null,arguments)},qx=t._Cos=function(){return(qx=t._Cos=t.asm.Cos).apply(null,arguments)},Kx=t._Cosh=function(){return(Kx=t._Cosh=t.asm.Cosh).apply(null,arguments)},jx=t._CropAndResize=function(){return(jx=t._CropAndResize=t.asm.CropAndResize).apply(null,arguments)},Gc=t._Cumprod=function(){return(Gc=t._Cumprod=t.asm.Cumprod).apply(null,arguments)},Xx=t._Cumsum=function(){return(Xx=t._Cumsum=t.asm.Cumsum).apply(null,arguments)},Yx=t._DepthToSpace=function(){return(Yx=t._DepthToSpace=t.asm.DepthToSpace).apply(null,arguments)},Qx=t._DepthwiseConv2dNative=function(){return(Qx=t._DepthwiseConv2dNative=t.asm.DepthwiseConv2dNative).apply(null,arguments)},Pi=t._Elu=function(){return(Pi=t._Elu=t.asm.Elu).apply(null,arguments)},Zx=t._Equal=function(){return(Zx=t._Equal=t.asm.Equal).apply(null,arguments)},Jx=t._Exp=function(){return(Jx=t._Exp=t.asm.Exp).apply(null,arguments)},mm=t._FlipLeftRight=function(){return(mm=t._FlipLeftRight=t.asm.FlipLeftRight).apply(null,arguments)},ey=t._Floor=function(){return(ey=t._Floor=t.asm.Floor).apply(null,arguments)},Qu=t._FloorDiv=function(){return(Qu=t._FloorDiv=t.asm.FloorDiv).apply(null,arguments)},ty=t._FusedBatchNorm=function(){return(ty=t._FusedBatchNorm=t.asm.FusedBatchNorm).apply(null,arguments)},ry=t._FusedConv2D=function(){return(ry=t._FusedConv2D=t.asm.FusedConv2D).apply(null,arguments)},Ha=t._FusedDepthwiseConv2D=function(){return(Ha=t._FusedDepthwiseConv2D=t.asm.FusedDepthwiseConv2D).apply(null,arguments)},Hc=t._Gather=function(){return(Hc=t._Gather=t.asm.Gather).apply(null,arguments)},oy=t._GatherNd=function(){return(oy=t._GatherNd=t.asm.GatherNd).apply(null,arguments)},ny=t._Greater=function(){return(ny=t._Greater=t.asm.Greater).apply(null,arguments)},sy=t._GreaterEqual=function(){return(sy=t._GreaterEqual=t.asm.GreaterEqual).apply(null,arguments)},ay=t._LeakyRelu=function(){return(ay=t._LeakyRelu=t.asm.LeakyRelu).apply(null,arguments)},fm=t._Less=function(){return(fm=t._Less=t.asm.Less).apply(null,arguments)},dm=t._LessEqual=function(){return(dm=t._LessEqual=t.asm.LessEqual).apply(null,arguments)},iy=t._Log=function(){return(iy=t._Log=t.asm.Log).apply(null,arguments)},uy=t._LogicalAnd=function(){return(uy=t._LogicalAnd=t.asm.LogicalAnd).apply(null,arguments)},hm=t._LogicalNot=function(){return(hm=t._LogicalNot=t.asm.LogicalNot).apply(null,arguments)},gm=t._LogicalOr=function(){return(gm=t._LogicalOr=t.asm.LogicalOr).apply(null,arguments)},py=t._LogicalXor=function(){return(py=t._LogicalXor=t.asm.LogicalXor).apply(null,arguments)},cy=t._Max=function(){return(cy=t._Max=t.asm.Max).apply(null,arguments)},ly=t._MaxPool=function(){return(ly=t._MaxPool=t.asm.MaxPool).apply(null,arguments)},xm=t._Maximum=function(){return(xm=t._Maximum=t.asm.Maximum).apply(null,arguments)},t0=t._Mean=function(){return(t0=t._Mean=t.asm.Mean).apply(null,arguments)},my=t._Min=function(){return(my=t._Min=t.asm.Min).apply(null,arguments)},fy=t._Minimum=function(){return(fy=t._Minimum=t.asm.Minimum).apply(null,arguments)},dy=t._MirrorPad=function(){return(dy=t._MirrorPad=t.asm.MirrorPad).apply(null,arguments)},hy=t._Multiply=function(){return(hy=t._Multiply=t.asm.Multiply).apply(null,arguments)},gy=t._Neg=function(){return(gy=t._Neg=t.asm.Neg).apply(null,arguments)},xy=t._NonMaxSuppressionV3=function(){return(xy=t._NonMaxSuppressionV3=t.asm.NonMaxSuppressionV3).apply(null,arguments)},yy=t._NonMaxSuppressionV4=function(){return(yy=t._NonMaxSuppressionV4=t.asm.NonMaxSuppressionV4).apply(null,arguments)},by=t._NonMaxSuppressionV5=function(){return(by=t._NonMaxSuppressionV5=t.asm.NonMaxSuppressionV5).apply(null,arguments)},Cy=t._NotEqual=function(){return(Cy=t._NotEqual=t.asm.NotEqual).apply(null,arguments)},Iy=t._OneHot=function(){return(Iy=t._OneHot=t.asm.OneHot).apply(null,arguments)},wy=t._PadV2=function(){return(wy=t._PadV2=t.asm.PadV2).apply(null,arguments)},Sy=t._Pow=function(){return(Sy=t._Pow=t.asm.Pow).apply(null,arguments)},vy=t._Prelu=function(){return(vy=t._Prelu=t.asm.Prelu).apply(null,arguments)},ky=t._Prod=function(){return(ky=t._Prod=t.asm.Prod).apply(null,arguments)},Ty=t._RealDiv=function(){return(Ty=t._RealDiv=t.asm.RealDiv).apply(null,arguments)},Ny=t._Relu=function(){return(Ny=t._Relu=t.asm.Relu).apply(null,arguments)},_y=t._Relu6=function(){return(_y=t._Relu6=t.asm.Relu6).apply(null,arguments)},Ey=t._ResizeBilinear=function(){return(Ey=t._ResizeBilinear=t.asm.ResizeBilinear).apply(null,arguments)},$y=t._ResizeNearestNeighbor=function(){return($y=t._ResizeNearestNeighbor=t.asm.ResizeNearestNeighbor).apply(null,arguments)},Ry=t._Reverse=function(){return(Ry=t._Reverse=t.asm.Reverse).apply(null,arguments)},Ay=t._RotateWithOffset=function(){return(Ay=t._RotateWithOffset=t.asm.RotateWithOffset).apply(null,arguments)},Fy=t._Round=function(){return(Fy=t._Round=t.asm.Round).apply(null,arguments)},Dy=t._Rsqrt=function(){return(Dy=t._Rsqrt=t.asm.Rsqrt).apply(null,arguments)},Py=t._ScatterNd=function(){return(Py=t._ScatterNd=t.asm.ScatterNd).apply(null,arguments)},Oy=t._SelectV2=function(){return(Oy=t._SelectV2=t.asm.SelectV2).apply(null,arguments)},My=t._Sigmoid=function(){return(My=t._Sigmoid=t.asm.Sigmoid).apply(null,arguments)},Ly=t._Sin=function(){return(Ly=t._Sin=t.asm.Sin).apply(null,arguments)},By=t._Softmax=function(){return(By=t._Softmax=t.asm.Softmax).apply(null,arguments)},Vy=t._SparseFillEmptyRows=function(){return(Vy=t._SparseFillEmptyRows=t.asm.SparseFillEmptyRows).apply(null,arguments)},zy=t._SparseReshape=function(){return(zy=t._SparseReshape=t.asm.SparseReshape).apply(null,arguments)},Wy=t._SparseSegmentReduction=function(){return(Wy=t._SparseSegmentReduction=t.asm.SparseSegmentReduction).apply(null,arguments)},Uy=t._Sqrt=function(){return(Uy=t._Sqrt=t.asm.Sqrt).apply(null,arguments)},Gy=t._Square=function(){return(Gy=t._Square=t.asm.Square).apply(null,arguments)},Hy=t._SquaredDifference=function(){return(Hy=t._SquaredDifference=t.asm.SquaredDifference).apply(null,arguments)},qy=t._Step=function(){return(qy=t._Step=t.asm.Step).apply(null,arguments)},Ky=t._StridedSlice=function(){return(Ky=t._StridedSlice=t.asm.StridedSlice).apply(null,arguments)},jy=t._Sub=function(){return(jy=t._Sub=t.asm.Sub).apply(null,arguments)},Xy=t._Sum=function(){return(Xy=t._Sum=t.asm.Sum).apply(null,arguments)},Yy=t._Tan=function(){return(Yy=t._Tan=t.asm.Tan).apply(null,arguments)},Qy=t._Tanh=function(){return(Qy=t._Tanh=t.asm.Tanh).apply(null,arguments)},Zy=t._Tile=function(){return(Zy=t._Tile=t.asm.Tile).apply(null,arguments)},Jy=t._TopK=function(){return(Jy=t._TopK=t.asm.TopK).apply(null,arguments)},eb=t._Transform=function(){return(eb=t._Transform=t.asm.Transform).apply(null,arguments)},tb=t._Transpose=function(){return(tb=t._Transpose=t.asm.Transpose).apply(null,arguments)},rb=t.__FusedMatMul=function(){return(rb=t.__FusedMatMul=t.asm._FusedMatMul).apply(null,arguments)},ob=t._malloc=function(){return(ob=t._malloc=t.asm.malloc).apply(null,arguments)},nb=t._free=function(){return(nb=t._free=t.asm.free).apply(null,arguments)},sb=t.___errno_location=function(){return(sb=t.___errno_location=t.asm.__errno_location).apply(null,arguments)},ym=t.stackSave=function(){return(ym=t.stackSave=t.asm.stackSave).apply(null,arguments)},bm=t.stackRestore=function(){return(bm=t.stackRestore=t.asm.stackRestore).apply(null,arguments)},qc=t.stackAlloc=function(){return(qc=t.stackAlloc=t.asm.stackAlloc).apply(null,arguments)},ab=t.dynCall_iijjiiii=function(){return(ab=t.dynCall_iijjiiii=t.asm.dynCall_iijjiiii).apply(null,arguments)},ib=t.dynCall_jiji=function(){return(ib=t.dynCall_jiji=t.asm.dynCall_jiji).apply(null,arguments)};t.cwrap=im;var Zu;rr=function U(){Zu||Cm(),Zu||(rr=U)};function Cm(U){if(U=U||i,Tt>0||(dt(),Tt>0))return;function te(){Zu||(Zu=!0,t.calledRun=!0,!M&&(It(),o(t),t.onRuntimeInitialized&&t.onRuntimeInitialized(),Fr()))}t.setStatus?(t.setStatus("Running..."),setTimeout(function(){setTimeout(function(){t.setStatus("")},1),te()},1)):te()}if(t.preInit)for(typeof t.preInit=="function"&&(t.preInit=[t.preInit]);t.preInit.length>0;)t.preInit.pop()();Cm();var Ju;s&&(Ju={uncaughtException:process.listeners("uncaughtException").filter(function(U){return!s.uncaughtException.indexOf(U)>-1}),unhandledRejection:process.listeners("unhandledRejection").filter(function(U){return!s.unhandledRejection.indexOf(U)>-1})});var ep;if(typeof e!="undefined")ep=e;else if(typeof WasmBackendModuleThreadedSimd!="undefined")ep=WasmBackendModuleThreadedSimd;else throw new Error("Could not find wasm module in post.js");if(Ju){var ub=ep._dispose;ep._dispose=function(){ub(),Ju.uncaughtException.forEach(function(U){process.removeListener("uncaughtException",U)}),Ju.unhandledRejection.forEach(function(U){process.removeListener("unhandledRejection",U)})}}return e.ready}})();typeof Dg=="object"&&typeof tS=="object"?tS.exports=eS:typeof define=="function"&&define.amd?define([],function(){return eS}):typeof Dg=="object"&&(Dg.WasmBackendModule=eS)});var rn=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}},Jr=class{refCount(e){return Pr("refCount")}incRef(e){return Pr("incRef")}timerAvailable(){return!0}time(e){return Pr("time")}read(e){return Pr("read")}readSync(e){return Pr("readSync")}readToGPU(e,t){return Pr("readToGPU")}numDataIds(){return Pr("numDataIds")}disposeData(e,t){return Pr("disposeData")}write(e,t,o){return Pr("write")}move(e,t,o,n,s){return Pr("move")}createTensorFromTexture(e,t,o){return Pr("createTensorFromTexture")}memory(){return Pr("memory")}floatPrecision(){return Pr("floatPrecision")}epsilon(){return this.floatPrecision()===32?1e-7:1e-4}dispose(){return Pr("dispose")}};function Pr(r){throw new Error(`'${r}' not yet implemented or not found in the registry. This kernel may not be supported by the tfjs backend you have chosen`)}function c0(r){let e=r.length,t=0;for(;e>0;)t=Math.random()*e|0,e--,$m(r,e,t)}function oz(r,e){if(r.length!==e.length)throw new Error(`Array sizes must match to be shuffled together First array length was ${r.length}Second array length was ${e.length}`);let t=r.length,o=0;for(;t>0;)o=Math.random()*t|0,t--,$m(r,t,o),$m(e,t,o)}function op(r,e,t){return Math.max(r,Math.min(e,t))}function nz(r){return r%2===0?r:r+1}function $m(r,e,t){let o=r[e];r[e]=r[t],r[t]=o}function sz(r){let e=0;for(let t=0;tt+` Shapes ${r} and ${e} must match`)}function eo(r){$(r!=null,()=>"The input to the tensor constructor must be a non-null value.")}function on(r,e=[],t=!1){if(e==null&&(e=[]),Array.isArray(r)||Ut(r)&&!t)for(let o=0;o0,t,o){return new Promise((n,s)=>{let a=0,i=()=>{if(r()){n();return}a++;let p=e(a);if(t!=null&&a>=t){s();return}o!=null?o(i,p):setTimeout(i,p)};i()})}function fz(r,e){let t=1,o=-1;for(let s=0;s=0)t*=r[s];else if(r[s]===-1){if(o!==-1)throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${o} and dim ${s}`);o=s}else if(r[s]<0)throw Error(`Shapes can not be < 0. Found ${r[s]} at dim ${s}`);if(o===-1){if(e>0&&e!==t)throw Error(`Size(${e}) must match the product of shape ${r}`);return r}if(t===0)throw Error(`Cannot infer the missing size in [${r}] when there are 0 elements`);if(e%t!==0)throw Error(`The implicit shape can't be a fractional number. Got ${e} / ${t}`);let n=r.slice();return n[o]=e/t,n}function Ka(r,e){let t=e.length;return r=r==null?e.map((o,n)=>n):[].concat(r),$(r.every(o=>o>=-t&&o`All values in axis param must be in range [-${t}, ${t}) but got axis ${r}`),$(r.every(o=>ra(o)),()=>`All values in axis param must be integers but got axis ${r}`),r.map(o=>o<0?t+o:o)}function db(r,e){let t=[],o=[],n=e!=null&&Array.isArray(e)&&e.length===0,s=e==null||n?null:Ka(e,r).sort(),a=0;for(let i=0;ii)&&r[i]===1&&(t.push(r[i]),o.push(i)),s[a]<=i&&a++}r[i]!==1&&(t.push(r[i]),o.push(i))}return{newShape:t,keptDims:o}}function hb(r,e){let t=null;if(r==null||r==="float32")t=new Float32Array(e);else if(r==="int32")t=new Int32Array(e);else if(r==="bool")t=new Uint8Array(e);else throw new Error(`Unknown data type ${r}`);return t}function gb(r,e){let t=null;if(r==null||r==="float32")t=new Float32Array(e);else if(r==="int32")t=new Int32Array(e);else if(r==="bool")t=new Uint8Array(e);else if(r==="string")t=new Array(e);else throw new Error(`Unknown data type ${r}`);return t}function xb(r,e){for(let t=0;te+=t.length),e}function nn(r){return typeof r=="string"||r instanceof String}function l0(r){return typeof r=="boolean"}function m0(r){return typeof r=="number"}function np(r){return Array.isArray(r)?np(r[0]):r instanceof Float32Array?"float32":r instanceof Int32Array||r instanceof Uint8Array||r instanceof Uint8ClampedArray?"int32":m0(r)?"float32":nn(r)?"string":l0(r)?"bool":"float32"}function fs(r){return!!(r&&r.constructor&&r.call&&r.apply)}function sp(r,e){for(let t=e;t=0;--o)t[o]=t[o+1]*r[o+1];return t}function f0(r,e,t,o=!1){let n=new Array;if(e.length===1){let s=e[0]*(o?2:1);for(let a=0;ap*u)*(o?2:1);for(let p=0;pn*s)*(t?2:1);if(o===0)return[];if(o!==e.length)throw new Error(`[${r}] does not match the input size ${e.length}${t?" for a complex tensor":""}.`);return f0(0,r,e,t)}function jc(r,e){let t=ap(r,e);for(let o=0;oo*n,1);if(e==null||e==="float32")return Oi(r,new Float32Array(t));if(e==="int32")return Oi(r,new Int32Array(t));if(e==="bool")return Oi(r,new Uint8Array(t));throw new Error(`Unknown data type ${e}`)}function Xc(r){r.forEach(e=>{$(Number.isInteger(e)&&e>=0,()=>`Tensor must have a shape comprised of positive integers but got shape [${r}].`)})}function gz(r,e,t){if(e===0)return 0;if(e===1)return r[0];let o=r[r.length-1];for(let n=0;n{let[n,s]=o.split(":");this.urlFlags[n]=Iz(n,s)})}};function bz(r){let e={};return r.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g,(t,...o)=>(Cz(e,o[0],o[1]),o.join("="))),e}function Cz(r,e,t){r[decodeURIComponent(e)]=decodeURIComponent(t||"")}function Iz(r,e){if(e=e.toLowerCase(),e==="true"||e==="false")return e==="true";if(`${+e}`===e)return+e;throw new Error(`Could not parse value flag value ${e} for flag ${r}.`)}function P(){return Cb}var Cb=null;function h0(r){Cb=r}var Ib;function wb(){if(Ib==null){let r;if(typeof window!="undefined")r=window;else if(typeof global!="undefined")r=global;else if(typeof process!="undefined")r=process;else if(typeof self!="undefined")r=self;else throw new Error("Could not find a global object");Ib=r}return Ib}function wz(){let r=wb();return r._tfGlobals==null&&(r._tfGlobals=new Map),r._tfGlobals}function Zc(r,e){let t=wz();if(t.has(r))return t.get(r);{let o=e();return t.set(r,o),t.get(r)}}var sn="Abs",Li="Acos",Bi="Acosh",_r="Add",an="AddN",oa="All",na="Any",un="ArgMax",ja="ArgMin",Vi="Asin",zi="Asinh",Wi="Atan",Ui="Atanh",sa="Atan2",pn="AvgPool",Am="AvgPoolGrad",ip="AvgPool3D",Fm="AvgPool3DGrad",cn="BatchMatMul",hs="BatchToSpaceND",up="Bincount",Tne="BroadcastTo",pp="BroadcastArgs",to="Cast",ro="Ceil",Ro="ClipByValue",aa="Complex",cp="ComplexAbs",gs="Concat",ln="Conv2D",lp="Conv2DBackpropFilter",mn="Conv2DBackpropInput",mp="Conv3D",Dm="Conv3DBackpropFilterV2",fp="Conv3DBackpropInputV2",fn="Cos",dn="Cosh",hn="Cumprod",gn="Cumsum",xn="CropAndResize",dp="DenseBincount",yn="DepthToSpace",bn="DepthwiseConv2dNative",hp="DepthwiseConv2dNativeBackpropFilter",gp="DepthwiseConv2dNativeBackpropInput",xp="Diag",yp="Dilation2D",Sb="Dilation2DBackpropInput",vb="Dilation2DBackpropFilter",Cn="RealDiv",Xa="Einsum",In="Elu",Pm="EluGrad",Gi="Erf",oo="Equal",no="Exp",xs="ExpandDims",wn="Expm1",bp="FFT",ys="Fill",Sn="FlipLeftRight",so="Floor",vn="FloorDiv",kn="FusedBatchNorm",bs="GatherV2",Tn="GatherNd",ao="Greater",io="GreaterEqual",uo="Identity",Cp="IFFT",Ya="Imag",Hi="IsFinite",qi="IsInf",ia="IsNan",Nn="LeakyRelu",po="Less",co="LessEqual",Ip="LinSpace",lo="Log",Ki="Log1p",_n="LogicalAnd",En="LogicalNot",ua="LogicalOr",g0="LogicalXor",Nne="LogSoftmax",_ne="LowerBound",wp="LRN",Om="LRNGrad",$n="Max",mo="Maximum",Rn="MaxPool",Mm="MaxPoolGrad",Sp="MaxPool3D",Lm="MaxPool3DGrad",vp="MaxPoolWithArgmax",An="Mean",Fn="Min",fo="Minimum",Dn="MirrorPad",ji="Mod",kp="Multinomial",ho="Multiply",Pn="Neg",go="NotEqual",On="NonMaxSuppressionV3",pa="NonMaxSuppressionV4",Mn="NonMaxSuppressionV5",Cs="OnesLike",ca="OneHot",Is="Pack",Ln="PadV2",Ene="Pool",Bn="Pow",Vn="Prelu",Ao="Prod",Tp="RaggedGather",Np="RaggedRange",_p="RaggedTensorToTensor",ws="Range",la="Real",ma="Reciprocal",zn="Relu",Ss="Reshape",Wn="ResizeNearestNeighbor",Bm="ResizeNearestNeighborGrad",Un="ResizeBilinear",Vm="ResizeBilinearGrad",Gn="Relu6",fa="Reverse",da="Round",xo="Rsqrt",Hn="ScatterNd",Ep="SearchSorted",vs="Select",Xi="Selu",qn="Slice",Kn="Sin",ha="Sinh",Yi="Sign",yo="Sigmoid",Qi="Softplus",bo="Sqrt",jn="Sum",ks="SpaceToBatchND",Ts="SplitV",Xn="Softmax",Qa="SparseFillEmptyRows",ga="SparseReshape",Za="SparseSegmentMean",Ja="SparseSegmentSum",ei="SparseToDense",Co="SquaredDifference",ti="Square",Yn="StridedSlice",Ns="StringNGrams",ri="StringSplit",oi="StringToHashBucketFast",Io="Sub",xa="Tan",Qn="Tanh",wo="Tile",Zn="TopK",Jn="Transform",Mr="Transpose",$p="Unique",_s="Unpack",Rp="UnsortedSegmentSum",$ne="UpperBound",Es="ZerosLike",$s="Step",Zi="FromPixels",es="RotateWithOffset",Fo="_FusedMatMul",Do="FusedConv2D",Po="FusedDepthwiseConv2D";function Rs(...r){P().getBool("IS_TEST")||P().getBool("PROD")||console.warn(...r)}function Sz(...r){P().getBool("IS_TEST")||P().getBool("PROD")||console.log(...r)}var Ap=Zc("kernelRegistry",()=>new Map),Jc=Zc("gradRegistry",()=>new Map);function el(r,e){let t=Tb(r,e);return Ap.get(t)}function kb(r){return Jc.get(r)}function zm(r){let e=Ap.entries(),t=[];for(;;){let{done:o,value:n}=e.next();if(o)break;let[s,a]=n,[i]=s.split("_");i===r&&t.push(a)}return t}function ya(r){let{kernelName:e,backendName:t}=r,o=Tb(e,t);Ap.has(o)&&Rs(`The kernel '${e}' for backend '${t}' is already registered`),Ap.set(o,r)}function Pne(r){let{kernelName:e}=r;Jc.has(e)&&P().getBool("DEBUG")&&Rs(`Overriding the gradient for '${e}'`),Jc.set(e,r)}function One(r,e){let t=Tb(r,e);if(!Ap.has(t))throw new Error(`The kernel '${r}' for backend '${e}' is not registered`);Ap.delete(t)}function Mne(r){if(!Jc.has(r))throw new Error(`The gradient '${r}' for backend is not registered`);Jc.delete(r)}function Lne(r,e){zm(r).forEach(o=>{let n=Object.assign({},o,{backendName:e});ya(n)})}function Tb(r,e){return`${e}_${r}`}var x={};Be(x,{arraysEqual:()=>Or,assert:()=>$,assertNonNegativeIntegerDimensions:()=>Xc,assertNonNull:()=>eo,assertShapesMatch:()=>ht,bytesFromStringArray:()=>bb,bytesPerElement:()=>Rm,checkConversionForErrors:()=>xb,clamp:()=>op,computeStrides:()=>ds,createScalarValue:()=>$z,createShuffledIndices:()=>lz,decodeString:()=>Op,distSquared:()=>iz,encodeString:()=>si,fetch:()=>Az,fingerPrint64:()=>Ez,flatten:()=>on,getArrayFromDType:()=>gb,getTypedArrayFromDType:()=>hb,hasEncodingLoss:()=>dz,hexToLong:()=>tl,indexToLoc:()=>xz,inferDtype:()=>np,inferFromImplicitShape:()=>fz,isBoolean:()=>l0,isFunction:()=>fs,isInt:()=>ra,isNumber:()=>m0,isPromise:()=>Yc,isScalarShape:()=>uz,isString:()=>nn,isTypedArray:()=>Ut,isValidDtype:()=>yb,locToIndex:()=>gz,makeOnesTypedArray:()=>jc,makeZerosNestedTypedArray:()=>hz,makeZerosTypedArray:()=>ap,nearestDivisor:()=>sp,nearestLargerEven:()=>nz,now:()=>ou,parseAxisParam:()=>Ka,randUniform:()=>az,repeatedTry:()=>mz,rightPad:()=>Mi,shuffle:()=>c0,shuffleCombo:()=>oz,sizeFromShape:()=>Ve,sizeToSquarishShape:()=>cz,squeezeShape:()=>db,sum:()=>sz,swap:()=>$m,tanh:()=>pz,toNestedArray:()=>Oi,toTypedArray:()=>Pp});var $b=rp(_0());var ru=$b.default||$b;function tl(r){return ru.fromString(r,!0,16)}var $0=tl("c3a5c85c97cb3127"),tu=tl("b492b66fbe98f273"),gr=tl("9ae16a3b2f90404f");function Eb(r){return r.xor(r.shru(47))}function R0(r,e,t){let o=r.slice(e,e+t);return ru.fromBytes(Array.from(o),!0,!0)}function yt(r,e){return R0(r,e,8)}function E0(r,e){return R0(r,e,4)}function Xt(r,e){return e===0?r:r.shru(e).or(r.shl(64-e))}function ni(r,e,t=tl("9ddfea08eb382d69")){let o=r.xor(e).mul(t);o=o.xor(o.shru(47));let n=e.xor(o).mul(t);return n=n.xor(n.shru(47)),n=n.mul(t),n}function kz(r,e,t,o,n,s){n=n.add(r),s=Xt(s.add(n).add(o),21);let a=n;return n=n.add(e),n=n.add(t),s=s.add(Xt(n,44)),[n.add(o),s.add(a)]}function Um(r,e,t,o){return kz(yt(r,e),yt(r,e+8),yt(r,e+16),yt(r,e+24),t,o)}function Tz(r,e=r.length){if(e>=8){let t=gr.add(e*2),o=yt(r,0).add(gr),n=yt(r,e-8),s=Xt(n,37).mul(t).add(o),a=Xt(o,25).add(n).mul(t);return ni(s,a,t)}if(e>=4){let t=gr.add(e*2),o=E0(r,0);return ni(o.shl(3).add(e),E0(r,e-4),t)}if(e>0){let t=r[0],o=r[e>>1],n=r[e-1],s=t+(o<<8),a=e+(n<<2);return Eb(gr.mul(s).xor($0.mul(a))).mul(gr)}return gr}function Nz(r,e=r.length){let t=gr.add(e*2),o=yt(r,0).mul(tu),n=yt(r,8),s=yt(r,e-8).mul(t),a=yt(r,e-16).mul(gr);return ni(Xt(o.add(n),43).add(Xt(s,30)).add(a),o.add(Xt(n.add(gr),18)).add(s),t)}function _z(r,e=r.length){let t=gr.add(e*2),o=yt(r,0).mul(gr),n=yt(r,8),s=yt(r,e-8).mul(t),a=yt(r,e-16).mul(gr),i=Xt(o.add(n),43).add(Xt(s,30)).add(a),p=ni(i,o.add(Xt(n.add(gr),18)).add(s),t),u=yt(r,16).mul(t),c=yt(r,24),l=i.add(yt(r,e-32)).mul(t),m=p.add(yt(r,e-24)).mul(t);return ni(Xt(u.add(c),43).add(Xt(l,30)).add(m),u.add(Xt(c.add(o),18)).add(l),t)}function Ez(r,e=r.length){let t=ru.fromNumber(81,!0);if(e<=32)return e<=16?Tz(r,e):Nz(r,e);if(e<=64)return _z(r,e);let o=t,n=t.mul(tu).add(113),s=Eb(n.mul(gr).add(113)).mul(gr),a=[ru.UZERO,ru.UZERO],i=[ru.UZERO,ru.UZERO];o=o.mul(gr).add(yt(r,0));let p=0,u=(e-1>>6)*64,c=u+(e-1&63)-63;do o=Xt(o.add(n).add(a[0]).add(yt(r,p+8)),37).mul(tu),n=Xt(n.add(a[1]).add(yt(r,p+48)),42).mul(tu),o=o.xor(i[1]),n=n.add(a[0]).add(yt(r,p+40)),s=Xt(s.add(i[0]),33).mul(tu),a=Um(r,p,a[1].mul(tu),o.add(i[0])),i=Um(r,p+32,s.add(i[1]),n.add(yt(r,p+16))),[s,o]=[o,s],p+=64;while(p!==u);let l=tu.add(s.and(255).shl(1));return p=c,i[0]=i[0].add(e-1&63),a[0]=a[0].add(i[0]),i[0]=i[0].add(a[0]),o=Xt(o.add(n).add(a[0]).add(yt(r,p+8)),37).mul(l),n=Xt(n.add(a[1]).add(yt(r,p+48)),42).mul(l),o=o.xor(i[1].mul(9)),n=n.add(a[0].mul(9).add(yt(r,p+40))),s=Xt(s.add(i[0]),33).mul(l),a=Um(r,p,a[1].mul(l),o.add(i[0])),i=Um(r,p+32,s.add(i[1]),n.add(yt(r,p+16))),[s,o]=[o,s],ni(ni(a[0],i[0],l).add(Eb(n).mul($0)).add(s),ni(a[1],i[1],l).add(o),l)}function $z(r,e){return e==="string"?si(r):Pp([r],e)}function Rz(r,e){return r instanceof Float32Array&&e==="float32"||r instanceof Int32Array&&e==="int32"||r instanceof Uint8Array&&e==="bool"}function Pp(r,e){if(e==="string")throw new Error("Cannot convert a string[] to a TypedArray");if(Array.isArray(r)&&(r=on(r)),P().getBool("DEBUG")&&xb(r,e),Rz(r,e))return r;if(e==null||e==="float32"||e==="complex64")return new Float32Array(r);if(e==="int32")return new Int32Array(r);if(e==="bool"){let t=new Uint8Array(r.length);for(let o=0;o{n=o()},a,i=ou();if(this.backendTimer.timerAvailable())a=this.backendTimer.time(s);else{s();for(let u of n)u.dataSync();a=Promise.resolve({kernelMs:ou()-i})}if(P().getBool("CHECK_COMPUTATION_FOR_ERRORS"))for(let u=0;u{Fz(l,c.dtype,e)})}return{kernelName:e,outputs:n,inputs:t,timeMs:a.then(u=>u.kernelMs),extraInfo:a.then(u=>u.getExtraProfileInfo!=null?u.getExtraProfileInfo():"")}}logKernelProfile(e){let{kernelName:t,outputs:o,timeMs:n,inputs:s,extraInfo:a}=e;o.forEach(i=>{Promise.all([i.data(),n,a]).then(p=>{this.logger.logKernelProfile(t,i,p[0],p[1],s,p[2])})})}};function Fz(r,e,t){if(e!=="float32")return!1;for(let o=0;o0?h:""} `}}console.log(`%c${p} %c${i} %c${u}D ${l} %c${c} %c${m} %c${a}`,"font-weight:bold","color:red","color:blue","color: orange","color: green","color: steelblue")}};function A0(r,e,t){let o={},n={};for(let p=0;po[h.id]=!0),f=!0,n[u.id]=!0;break}if(f)break}}let s={};s[t.id]=!0;let a={};for(let p=r.length-1;p>=0;p--){let u=r[p],c=u.inputs;for(let l=0;l=0;n--){let s=e[n],a=[];if(s.outputs.forEach(p=>{let u=r[p.id];u!=null?a.push(u):a.push(null)}),s.gradient==null)throw new Error(`Cannot compute gradient: gradient function not found for ${s.kernelName}.`);let i=s.gradient(a);for(let p in s.inputs){if(!(p in i))throw new Error(`Cannot backprop through input ${p}. Available gradients found: ${Object.keys(i)}.`);let u=t(()=>i[p]());if(u.dtype!=="float32")throw new Error(`Error in gradient for op ${s.kernelName}. The gradient of input ${p} must have 'float32' dtype, but has '${u.dtype}'`);let c=s.inputs[p];if(!Or(u.shape,c.shape))throw new Error(`Error in gradient for op ${s.kernelName}. The gradient of input '${p}' has shape '${u.shape}', which does not match the shape of the input '${c.shape}'`);if(r[c.id]==null)r[c.id]=u;else{let l=r[c.id];r[c.id]=o(l,u),l.dispose()}}}}var D0=20,rl=3,Ab=7;function P0(r,e,t,o){let n=ds(e),s=Dz(r,e,t,n),a=e.length,i=Hm(r,e,t,n,s),p=["Tensor"];return o&&(p.push(` dtype: ${t}`),p.push(` rank: ${a}`),p.push(` shape: [${e}]`),p.push(" values:")),p.push(i.map(u=>" "+u).join(` +`)),p.join(` +`)}function Dz(r,e,t,o){let n=Ve(e),s=o[o.length-1],a=new Array(s).fill(0),i=e.length,p=t==="complex64"?nl(r):r;if(i>1)for(let u=0;uD0){let g=rl*a,y=Array.from(r.slice(0,g)),b=Array.from(r.slice((i-rl)*a,i*a));return t==="complex64"&&(y=nl(y),b=nl(b)),["["+y.map((C,w)=>ol(C,n[w],t)).join(", ")+", ..., "+b.map((C,w)=>ol(C,n[i-rl+w],t)).join(", ")+"]"]}return["["+(t==="complex64"?nl(r):Array.from(r)).map((g,y)=>ol(g,n[y],t)).join(", ")+"]"]}let u=e.slice(1),c=o.slice(1),l=o[0]*a,m=[];if(i>D0){for(let h=0;h`Length of values '${n}' 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=o||gb(t,this.size),this.strides=ds(e)}set(e,...t){t.length===0&&(t=[0]),$(t.length===this.rank,()=>`The number of provided coordinates (${t.length}) must match the rank (${this.rank})`);let o=this.locToIndex(t);this.values[o]=e}get(...e){e.length===0&&(e=[0]);let t=0;for(let n of e){if(n<0||n>=this.shape[t]){let s=`Requested out of range element at ${e}. Buffer shape=${this.shape}`;throw new Error(s)}t++}let o=e[e.length-1];for(let n=0;nOp(o))}catch(o){throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().")}}return e}dataToGPU(e){return this.throwIfDisposed(),rs().readToGPU(this.dataId,e)}dataSync(){this.throwIfDisposed();let e=rs().readSync(this.dataId);if(this.dtype==="string")try{return e.map(t=>Op(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 rs().read(this.dataId);return this.dtype==="string"?e:new Uint8Array(e.buffer)}dispose(){this.isDisposed||(rs().disposeTensor(this),this.isDisposedInternal=!0)}get isDisposed(){return this.isDisposedInternal}throwIfDisposed(){if(this.isDisposed)throw new Error("Tensor is disposed.")}print(e=!1){return Mp.print(this,e)}clone(){return this.throwIfDisposed(),Mp.clone(this)}toString(e=!1){let t=this.dataSync();return P0(t,this.shape,this.dtype,e)}cast(e){return this.throwIfDisposed(),Mp.cast(this,e)}variable(e=!0,t,o){return this.throwIfDisposed(),rs().makeVariable(this,e,t,o)}};Object.defineProperty(ut,Symbol.hasInstance,{value:r=>!!r&&r.data!=null&&r.dataSync!=null&&r.throwIfDisposed!=null});function Oz(){return Zc("Tensor",()=>ut)}Oz();var ba=class extends ut{constructor(e,t,o,n){super(e.shape,e.dtype,e.dataId,n),this.trainable=t,this.name=o}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(!Or(e.shape,this.shape))throw new Error(`shape of the new value (${e.shape}) and previous value (${this.shape}) must match`);rs().disposeTensor(this),this.dataId=e.dataId,rs().incRef(this,null)}dispose(){rs().disposeVariable(this),this.isDisposedInternal=!0}};Object.defineProperty(ba,Symbol.hasInstance,{value:r=>r instanceof ut&&r.assign!=null&&r.assign instanceof Function});var z0={};Be(z0,{assertTypesMatch:()=>Lb,getTensorsInContainer:()=>sl,isTensorInList:()=>Lz,makeTypesMatch:()=>Re});var Fb;(function(r){r.R0="R0",r.R1="R1",r.R2="R2",r.R3="R3",r.R4="R4",r.R5="R5",r.R6="R6"})(Fb||(Fb={}));var Db;(function(r){r.float32="float32",r.int32="int32",r.bool="int32",r.complex64="complex64"})(Db||(Db={}));var Pb;(function(r){r.float32="float32",r.int32="int32",r.bool="bool",r.complex64="complex64"})(Pb||(Pb={}));var Ob;(function(r){r.float32="float32",r.int32="float32",r.bool="float32",r.complex64="complex64"})(Ob||(Ob={}));var Mb;(function(r){r.float32="complex64",r.int32="complex64",r.bool="complex64",r.complex64="complex64"})(Mb||(Mb={}));var Mz={float32:Ob,int32:Db,bool:Pb,complex64:Mb};function ct(r,e){if(r==="string"||e==="string"){if(r==="string"&&e==="string")return"string";throw new Error(`Can not upcast ${r} with ${e}`)}return Mz[r][e]}function Ca(r){return ct(r,"int32")}function Re(r,e){if(r.dtype===e.dtype)return[r,e];let t=ct(r.dtype,e.dtype);return[r.cast(t),e.cast(t)]}function Lb(r,e){$(r.dtype===e.dtype,()=>`The dtypes of the first(${r.dtype}) and second(${e.dtype}) input must match`)}function Lz(r,e){return e.some(t=>t.id===r.id)}function sl(r){let e=[];return V0(r,e,new Set),e}function V0(r,e,t){if(r==null)return;if(r instanceof ut){e.push(r);return}if(!Bz(r))return;let o=r;for(let n in o){let s=o[n];t.has(s)||(t.add(s),V0(s,e,t))}}function Bz(r){return Array.isArray(r)||typeof r=="object"}function Bb(r){return r.kernelName!=null}var qm=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()}},ai=class{constructor(e){this.ENV=e,this.registry={},this.registryFactory={},this.pendingBackendInitId=0,this.state=new qm}async ready(){if(this.pendingBackendInit!=null)return this.pendingBackendInit.then(()=>{});if(this.backendInstance!=null)return;let e=this.getSortedBackends();for(let t=0;t{t.setupFunc!=null&&t.setupFunc(this.backendInstance)})}disposeRegisteredKernels(e){zm(e).forEach(o=>{o.disposeFunc!=null&&o.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 o=t.factory();if(o&&!(o instanceof Jr)&&typeof o.then=="function"){let n=++this.pendingBackendInitId,s=o.then(a=>n(nthis.registryFactory[t].priority-this.registryFactory[e].priority)}initializeBackendsAndReturnBest(){let e=this.getSortedBackends();for(let t=0;tthis.startScope(o),()=>this.endScope(n),()=>(n=t(),n instanceof Promise&&console.error("Cannot return a Promise inside of tidy."),n))}scopedRun(e,t,o){e();try{let n=o();return t(),n}catch(n){throw t(),n}}nextTensorId(){return ai.nextTensorId++}nextVariableId(){return ai.nextVariableId++}clone(e){let t=N.runKernel(uo,{x:e}),o={x:e},n=a=>({x:()=>{let i="float32",p={x:a},u={dtype:i};return N.runKernel(to,p,u)}}),s=[];return this.addTapeNode(this.state.activeScope.name,o,[t],n,s,{}),t}runKernel(e,t,o){if(this.backendName==null&&this.backend,!(el(e,this.backendName)!=null))throw new Error(`Kernel '${e}' not registered for backend '${this.backendName}'`);return this.runKernelFunc({kernelName:e,inputs:t,attrs:o})}shouldCheckForMemLeaks(){return this.ENV.getBool("IS_TEST")}checkKernelForMemLeak(e,t,o){let n=this.backend.numDataIds(),s=0;o.forEach(p=>{s+=p.dtype==="complex64"?3:1});let a=this.state.numDataMovesStack[this.state.numDataMovesStack.length-1],i=n-t-s-a;if(i>0)throw new Error(`Backend '${this.backendName}' has an internal memory leak (${i} data ids) after running '${e}'`)}runKernelFunc(e){let t,o=[],n=this.isTapeOn(),s=this.state.numBytes,a=this.state.numTensors;this.shouldCheckForMemLeaks()&&this.state.numDataMovesStack.push(0);let i;this.backendName==null&&this.backend;let p,u=Bb(e)?e.kernelName:this.state.activeScope!=null?this.state.activeScope.name:"";if(Bb(e)){let{kernelName:d,inputs:h,attrs:g}=e;this.backendName==null&&this.backend;let y=el(d,this.backendName);$(y!=null,()=>`Cannot find registered kernel '${d}' for backend '${this.backendName}'`),i=()=>{let b=this.backend.numDataIds();p=y.kernelFunc({inputs:h,attrs:g,backend:this.backend});let C=Array.isArray(p)?p:[p];this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(d,b,C);let w=C.map(k=>k.rank!=null?k:this.makeTensorFromTensorInfo(k));if(n){let k=this.getTensorsForGradient(d,h,w);o=this.saveTensorsForBackwardMode(k)}return w}}else{let{forwardFunc:d}=e,h=g=>{!n||(o=g.map(y=>this.keep(this.clone(y))))};i=()=>{let g=this.backend.numDataIds();p=this.tidy(()=>d(this.backend,h));let y=Array.isArray(p)?p:[p];return this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(u,g,y),y}}let{inputs:c,attrs:l}=e,m=Bb(e)?null:e.backwardsFunc,f;return this.scopedRun(()=>this.state.kernelDepth++,()=>this.state.kernelDepth--,()=>{!this.ENV.getBool("DEBUG")&&!this.state.profiling?t=i():(f=this.profiler.profileKernel(u,c,()=>i()),this.ENV.getBool("DEBUG")&&this.profiler.logKernelProfile(f),t=f.outputs)}),n&&this.addTapeNode(u,c,t,m,o,l),this.state.profiling&&this.state.activeProfile.kernels.push({name:u,bytesAdded:this.state.numBytes-s,totalBytesSnapshot:this.state.numBytes,tensorsAdded:this.state.numTensors-a,totalTensorsSnapshot:this.state.numTensors,inputShapes:Object.keys(c).map(d=>c[d]!=null?c[d].shape:null),outputShapes:t.map(d=>d.shape),kernelTimeMs:f.timeMs,extraInfo:f.extraInfo}),Array.isArray(p)?t:t[0]}saveTensorsForBackwardMode(e){return e.map(o=>this.keep(this.clone(o)))}getTensorsForGradient(e,t,o){let n=kb(e);if(n!=null){let s=n.inputsToSave||[],a=n.outputsToSave||[],i;n.saveAllInputs?($(Array.isArray(t),()=>"saveAllInputs is true, expected inputs to be an array."),i=Object.keys(t).map(u=>t[u])):i=s.map(u=>t[u]);let p=o.filter((u,c)=>a[c]);return i.concat(p)}return[]}makeTensor(e,t,o,n){if(e==null)throw new Error("Values passed to engine.makeTensor() are null");o=o||"float32",n=n||this.backend;let s=e;o==="string"&&nn(e[0])&&(s=e.map(p=>si(p)));let a=n.write(s,t,o),i=new ut(t,o,a,this.nextTensorId());if(this.trackTensor(i,n),o==="string"){let p=this.state.tensorInfo.get(a),u=bb(s);this.state.numBytes+=u-p.bytes,p.bytes=u}return i}makeTensorFromDataId(e,t,o,n){o=o||"float32";let s={dataId:e,shape:t,dtype:o};return this.makeTensorFromTensorInfo(s,n)}makeTensorFromTensorInfo(e,t){let{dataId:o,shape:n,dtype:s}=e,a=new ut(n,s,o,this.nextTensorId());return this.trackTensor(a,t),a}makeVariable(e,t=!0,o,n){o=o||this.nextVariableId().toString(),n!=null&&n!==e.dtype&&(e=e.cast(n));let s=new ba(e,t,o,this.nextTensorId());if(this.state.registeredVariables[s.name]!=null)throw new Error(`Variable with name ${s.name} was already registered`);return this.state.registeredVariables[s.name]=s,this.incRef(s,this.backend),s}trackTensor(e,t){this.state.numTensors++,e.dtype==="string"&&this.state.numStringTensors++;let o=0;e.dtype!=="complex64"&&e.dtype!=="string"&&(o=e.size*Rm(e.dtype)),this.state.numBytes+=o,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:o})),e instanceof ba||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 o=e.size*Rm(e.dtype);this.state.numBytes-=o}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,o=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(n=>n.totalBytesSnapshot)),this.state.activeProfile.newBytes=this.state.numBytes-t,this.state.activeProfile.newTensors=this.state.numTensors-o;for(let n of this.state.activeProfile.kernels)n.kernelTimeMs=await n.kernelTimeMs,n.extraInfo=await n.extraInfo;return this.state.activeProfile}isTapeOn(){return this.state.gradientDepth>0&&this.state.kernelDepth===0}addTapeNode(e,t,o,n,s,a){let i={id:this.state.nextTapeNodeId++,kernelName:e,inputs:t,outputs:o,saved:s},p=kb(e);p!=null&&(n=p.gradFunc),n!=null&&(i.gradient=u=>(u=u.map((c,l)=>{if(c==null){let m=o[l],f=ap(m.size,m.dtype);return this.makeTensor(f,m.shape,m.dtype)}return c}),n(u.length>1?u:u[0],s,a))),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=sl(e),o=new Set(t.map(s=>s.id));for(let s=0;s{!s.kept&&s.scopeId===n.id&&this.track(s)})}gradients(e,t,o,n=!1){if($(t.length>0,()=>"gradients() received an empty list of xs."),o!=null&&o.dtype!=="float32")throw new Error(`dy must have 'float32' dtype, but has '${o.dtype}'`);let s=this.scopedRun(()=>this.startTape(),()=>this.endTape(),()=>this.tidy("forward",e));$(s instanceof ut,()=>"The result y returned by f() must be a tensor.");let a=A0(this.state.activeTape,t,s);if(!n&&a.length===0&&t.length>0)throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y.");return this.tidy("backward",()=>{let i={};i[s.id]=o==null?Vz(s.shape):o,F0(i,a,u=>this.tidy(u),zz);let p=t.map(u=>i[u.id]);return this.state.gradientDepth===0&&(this.state.activeTape.forEach(u=>{for(let c of u.saved)c.dispose()}),this.state.activeTape=null),{value:s,grads:p}})}customGrad(e){return $(fs(e),()=>"The f passed in customGrad(f) must be a function."),(...t)=>{$(t.every(i=>i instanceof ut),()=>"The args passed in customGrad(f)(x1, x2,...) must all be tensors");let o,n={};t.forEach((i,p)=>{n[p]=i});let s=(i,p)=>(o=e(...t,p),$(o.value instanceof ut,()=>"The function f passed in customGrad(f) must return an object where `obj.value` is a tensor"),$(fs(o.gradFunc),()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function."),o.value),a=(i,p)=>{let u=o.gradFunc(i,p),c=Array.isArray(u)?u:[u];$(c.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(...)."),$(c.every(m=>m instanceof ut),()=>"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 l={};return c.forEach((m,f)=>{l[f]=()=>m}),l};return this.runKernelFunc({forwardFunc:s,backwardsFunc:a,inputs:n})}}readSync(e){return this.state.tensorInfo.get(e).backend.readSync(e)}read(e){return this.state.tensorInfo.get(e).backend.read(e)}readToGPU(e,t){return this.state.tensorInfo.get(e).backend.readToGPU(e,t)}async time(e){let t=ou(),o=await this.backend.time(e);return o.wallMs=ou()-t,o}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 qm;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}};ai.nextTensorId=0;ai.nextVariableId=0;function Vz(r){let e=jc(Ve(r),"float32");return N.makeTensor(e,r,"float32")}function Vb(){let r=wb();if(r._tfengine==null){let e=new Qc(r);r._tfengine=new ai(e)}return h0(r._tfengine.ENV),M0(()=>r._tfengine),r._tfengine}var N=Vb();function zz(r,e){let t={a:r,b:e};return N.runKernel(_r,t)}var ii={};Be(ii,{isBrowser:()=>Wb,isMobile:()=>Gz,mockIsMobile:()=>Uz});function Wz(){return typeof navigator!="undefined"&&navigator!=null}var zb;function Uz(r){zb=r}function Gz(r){if(zb!==void 0)return zb;if(r||Wz()){if(r||(r=navigator),r.product==="ReactNative")return!0;let e=r.userAgent||r.vendor||(typeof window!="undefined"?window.opera:"");if(!e){let t=r;return t.userAgentData&&t.userAgentData.mobile}return/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(e)||/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(e.substr(0,4))}return!1}function Wb(){return typeof window!="undefined"&&window.document!=null||typeof WorkerGlobalScope!="undefined"}var Vr=P();Vr.registerFlag("DEBUG",()=>!1,r=>{r&&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.")});Vr.registerFlag("IS_BROWSER",()=>Wb());Vr.registerFlag("IS_NODE",()=>typeof process!="undefined"&&typeof process.versions!="undefined"&&typeof process.versions.node!="undefined");Vr.registerFlag("IS_CHROME",()=>typeof navigator!="undefined"&&navigator!=null&&navigator.userAgent!=null&&/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor));Vr.registerFlag("PROD",()=>!1);Vr.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY",()=>Vr.getBool("DEBUG"));Vr.registerFlag("DEPRECATION_WARNINGS_ENABLED",()=>!0);Vr.registerFlag("IS_TEST",()=>!1);Vr.registerFlag("CHECK_COMPUTATION_FOR_ERRORS",()=>!0);Vr.registerFlag("WRAP_TO_IMAGEBITMAP",()=>!1);Vr.registerFlag("ENGINE_COMPILE_ONLY",()=>!1);Vr.registerFlag("CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU",()=>!1);Vr.registerFlag("USE_SETTIMEOUTCUSTOM",()=>!1);function or(r,e){let t=r;if(Ut(r))return e==="string"?[]:[r.length];if(typeof r=="object"&&"texture"in r){let n=r.channels||"RGBA";return[r.height,r.width*n.length]}if(!Array.isArray(r))return[];let o=[];for(;Array.isArray(t)||Ut(t)&&e!=="string";)o.push(t.length),t=t[0];return Array.isArray(r)&&P().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")&&U0(r,o,[]),o}function U0(r,e,t){if(t=t||[],!Array.isArray(r)&&!Ut(r)){$(e.length===0,()=>`Element arr[${t.join("][")}] is a primitive, but should be an array/TypedArray of ${e[0]} elements`);return}$(e.length>0,()=>`Element arr[${t.join("][")}] should be a primitive, but is an array of ${r.length} elements`),$(r.length===e[0],()=>`Element arr[${t.join("][")}] should have ${e[0]} elements, but has ${r.length} elements`);let o=e.slice(1);for(let n=0;n=0&&(n=o),W0(o,n,e,t),r==null||!Ut(r)&&!Array.isArray(r)&&typeof r!="number"&&typeof r!="boolean"&&typeof r!="string"){let p=r==null?"null":r.constructor.name;throw new Error(`Argument '${e}' passed to '${t}' must be a Tensor or TensorLike, but got '${p}'`)}let s=or(r,n);!Ut(r)&&!Array.isArray(r)&&(r=[r]);let i=n!=="string"?Pp(r,n):on(r,[],!0);return N.makeTensor(i,s,n)}function Ia(r,e,t,o="numeric"){if(!Array.isArray(r))throw new Error(`Argument ${e} passed to ${t} must be a \`Tensor[]\` or \`TensorLike[]\``);return r.map((s,a)=>v(s,`${e}[${a}]`,t,o))}var Ub="__op";function T(r){let e=Object.keys(r);if(e.length!==1)throw new Error(`Please provide an object with a single key (operation name) mapping to a function. Got an object with ${e.length} keys.`);let t=e[0],o=r[t];t.endsWith("_")&&(t=t.substring(0,t.length-1)),t=t+Ub;let n=(...s)=>{N.startScope(t);try{let a=o(...s);return Yc(a)&&console.error("Cannot return a Promise inside of tidy."),N.endScope(a),a}catch(a){throw N.endScope(null),a}};return Object.defineProperty(n,"name",{value:t,configurable:!0}),n}function Hz(r,e){let t=v(r,"real","complex"),o=v(e,"imag","complex");ht(t.shape,o.shape,`real and imag shapes, ${t.shape} and ${o.shape}, must match in call to tf.complex().`);let n={real:t,imag:o};return N.runKernel(aa,n)}var Er=T({complex_:Hz});function xr(r,e,t,o){if(o==null&&(o=np(r)),o==="complex64")throw new Error("Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).");if(typeof r=="object"&&"texture"in r){if(o!=="float32"&&o!=="int32")throw new Error(`Creating tensor from texture only supports 'float32'|'int32' dtype, while the dtype is ${o}.`);return r.channels=r.channels||"RGBA",N.backend.createTensorFromTexture(r,e||t,o)}if(!Ut(r)&&!Array.isArray(r)&&typeof r!="number"&&typeof r!="boolean"&&typeof r!="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(e!=null){Xc(e);let n=Ve(e),s=Ve(t);$(n===s,()=>`Based on the provided shape, [${e}], the tensor should have ${n} values but has ${s}`);for(let a=0;a`Error creating a new Tensor. Inferred shape (${t}) does not match the provided shape (${e}). `)}}return!Ut(r)&&!Array.isArray(r)&&(r=[r]),e=e||t,r=o!=="string"?Pp(r,o):on(r,[],!0),N.makeTensor(r,e,o)}function nr(r,e,t){let o=or(r,t);return xr(r,e,o,t)}var al={float32:4,float16:2,int32:4,uint16:2,uint8:1,bool:1,complex64:8};var Km=4;async function H0(r,e){let t=[],o=[],n=Array.isArray(r)?r.map(a=>a.name):Object.keys(r);for(let a=0;a{let m=await p.bytes(),f=m.reduce((g,y)=>g+y.length,0)+Km*m.length,d=new Uint8Array(f),h=0;for(let g=0;g{if(e+=s.byteLength,t.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 o=new Uint8Array(e),n=0;return t.forEach(s=>{o.set(new Uint8Array(s.buffer),n),n+=s.byteLength}),o.buffer}var Gb=typeof Buffer!="undefined"&&(typeof Blob=="undefined"||typeof atob=="undefined"||typeof btoa=="undefined");function G0(r){return Gb?Buffer.byteLength(r):new Blob([r]).size}function q0(r){if(Gb)return Buffer.from(r).toString("base64");let e=new Uint8Array(r),t="";for(let o=0,n=e.length;o{e+=n.byteLength});let t=new Uint8Array(e),o=0;return r.forEach(n=>{t.set(new Uint8Array(n),o),o+=n.byteLength}),t.buffer}function Hb(r){let e="/";for(r=r.trim();r.endsWith(e);)r=r.slice(0,r.length-1);let t=r.split(e);return t[t.length-1]}function Xm(r,e){let t={modelTopology:r.modelTopology,format:r.format,generatedBy:r.generatedBy,convertedBy:r.convertedBy,weightsManifest:e};return r.signature!=null&&(t.signature=r.signature),r.userDefinedMetadata!=null&&(t.userDefinedMetadata=r.userDefinedMetadata),r.modelInitializer!=null&&(t.modelInitializer=r.modelInitializer),r.initializerSignature!=null&&(t.initializerSignature=r.initializerSignature),r.trainingConfig!=null&&(t.trainingConfig=r.trainingConfig),t}function qb(r,e,t){let o={modelTopology:r.modelTopology,format:r.format,generatedBy:r.generatedBy,convertedBy:r.convertedBy};if(r.trainingConfig!=null&&(o.trainingConfig=r.trainingConfig),r.weightsManifest!=null){if(!e)throw new Error("modelJSON has weightsManifest but weightSpecs is null");if(!t)throw new Error("modelJSON has weightsManifest but weightData is null");o.weightSpecs=e,o.weightData=t}return r.signature!=null&&(o.signature=r.signature),r.userDefinedMetadata!=null&&(o.userDefinedMetadata=r.userDefinedMetadata),r.modelInitializer!=null&&(o.modelInitializer=r.modelInitializer),r.initializerSignature!=null&&(o.initializerSignature=r.initializerSignature),o}async function Bp(r,e){let t,o;return r.weightsManifest!=null&&([t,o]=await e(r.weightsManifest)),qb(r,t,o)}function As(r){if(r.modelTopology instanceof ArrayBuffer)throw new Error("Expected JSON model topology, received ArrayBuffer.");return{dateSaved:new Date,modelTopologyType:"JSON",modelTopologyBytes:r.modelTopology==null?0:G0(JSON.stringify(r.modelTopology)),weightSpecsBytes:r.weightSpecs==null?0:G0(JSON.stringify(r.weightSpecs)),weightDataBytes:r.weightData==null?0:r.weightData.byteLength}}function Ym(r){let e=[];for(let t of r)e.push(...t.weights);return e}function Kz(){let r=t=>{let o=t<<13,n=0;for(;(o&8388608)===0;)n-=8388608,o<<=1;return o&=-8388609,n+=947912704,o|n},e=new Uint32Array(2048);e[0]=0;for(let t=1;t<1024;t++)e[t]=r(t);for(let t=1024;t<2048;t++)e[t]=939524096+(t-1024<<13);return e}function jz(){let r=new Uint32Array(64);r[0]=0,r[31]=1199570944,r[32]=2147483648,r[63]=3347054592;for(let e=1;e<31;e++)r[e]=e<<23;for(let e=33;e<63;e++)r[e]=2147483648+(e-32<<23);return r}function Xz(){let r=new Uint32Array(64);for(let e=0;e<64;e++)r[e]=1024;return r[0]=r[32]=0,r}function Yz(){let r=Kz(),e=jz(),t=Xz();return o=>{let n=new ArrayBuffer(4*o.length),s=new Uint32Array(n);for(let a=0;a>10]+(i&1023)]+e[i>>10];s[a]=p}return new Float32Array(n)}}var mt=class{constructor(){this.saveRouters=[],this.loadRouters=[]}static getInstance(){return mt.instance==null&&(mt.instance=new mt),mt.instance}static registerSaveRouter(e){mt.getInstance().saveRouters.push(e)}static registerLoadRouter(e){mt.getInstance().loadRouters.push(e)}static getSaveHandlers(e){return mt.getHandlers(e,"save")}static getLoadHandlers(e,t){return mt.getHandlers(e,"load",t)}static getHandlers(e,t,o){let n=[];return(t==="load"?mt.getInstance().loadRouters:mt.getInstance().saveRouters).forEach(a=>{let i=a(e,o);i!==null&&n.push(i)}),n}},j0=r=>mt.registerSaveRouter(r),X0=r=>mt.registerLoadRouter(r),Y0=r=>mt.getSaveHandlers(r),Q0=(r,e)=>mt.getLoadHandlers(r,e);var Kb="tensorflowjs",jb=1,nu="models_store",ui="model_info_store";function Z0(){if(!P().getBool("IS_BROWSER"))throw new Error("Failed to obtain IndexedDB factory because the current environmentis not a web browser.");let r=typeof window=="undefined"?self:window,e=r.indexedDB||r.mozIndexedDB||r.webkitIndexedDB||r.msIndexedDB||r.shimIndexedDB;if(e==null)throw new Error("The current browser does not appear to support IndexedDB.");return e}function Xb(r){let e=r.result;e.createObjectStore(nu,{keyPath:"modelPath"}),e.createObjectStore(ui,{keyPath:"modelPath"})}var Fs=class{constructor(e){if(this.indexedDB=Z0(),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((o,n)=>{let s=this.indexedDB.open(Kb,jb);s.onupgradeneeded=()=>Xb(s),s.onsuccess=()=>{let a=s.result;if(t==null){let i=a.transaction(nu,"readonly"),u=i.objectStore(nu).get(this.modelPath);u.onsuccess=()=>{if(u.result==null)return a.close(),n(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`));o(u.result.modelArtifacts)},u.onerror=c=>(a.close(),n(u.error)),i.oncomplete=()=>a.close()}else{let i=As(t),p=a.transaction(ui,"readwrite"),u=p.objectStore(ui),c=u.put({modelPath:this.modelPath,modelArtifactsInfo:i}),l;c.onsuccess=()=>{l=a.transaction(nu,"readwrite");let f=l.objectStore(nu).put({modelPath:this.modelPath,modelArtifacts:t,modelArtifactsInfo:i});f.onsuccess=()=>o({modelArtifactsInfo:i}),f.onerror=d=>{u=p.objectStore(ui);let h=u.delete(this.modelPath);h.onsuccess=()=>(a.close(),n(f.error)),h.onerror=g=>(a.close(),n(f.error))}},c.onerror=m=>(a.close(),n(c.error)),p.oncomplete=()=>{l==null?a.close():l.oncomplete=()=>a.close()}}},s.onerror=a=>n(s.error)})}};Fs.URL_SCHEME="indexeddb://";var J0=r=>P().getBool("IS_BROWSER")&&!Array.isArray(r)&&r.startsWith(Fs.URL_SCHEME)?Qz(r.slice(Fs.URL_SCHEME.length)):null;mt.registerSaveRouter(J0);mt.registerLoadRouter(J0);function Qz(r){return new Fs(r)}function Zz(r){return r.startsWith(Fs.URL_SCHEME)?r.slice(Fs.URL_SCHEME.length):r}var Qm=class{constructor(){this.indexedDB=Z0()}async listModels(){return new Promise((e,t)=>{let o=this.indexedDB.open(Kb,jb);o.onupgradeneeded=()=>Xb(o),o.onsuccess=()=>{let n=o.result,s=n.transaction(ui,"readonly"),i=s.objectStore(ui).getAll();i.onsuccess=()=>{let p={};for(let u of i.result)p[u.modelPath]=u.modelArtifactsInfo;e(p)},i.onerror=p=>(n.close(),t(i.error)),s.oncomplete=()=>n.close()},o.onerror=n=>t(o.error)})}async removeModel(e){return e=Zz(e),new Promise((t,o)=>{let n=this.indexedDB.open(Kb,jb);n.onupgradeneeded=()=>Xb(n),n.onsuccess=()=>{let s=n.result,a=s.transaction(ui,"readwrite"),i=a.objectStore(ui),p=i.get(e),u;p.onsuccess=()=>{if(p.result==null)return s.close(),o(new Error(`Cannot find model with path '${e}' in IndexedDB.`));{let c=i.delete(e),l=()=>{u=s.transaction(nu,"readwrite");let f=u.objectStore(nu).delete(e);f.onsuccess=()=>t(p.result.modelArtifactsInfo),f.onerror=d=>o(p.error)};c.onsuccess=l,c.onerror=m=>(l(),s.close(),o(p.error))}},p.onerror=c=>(s.close(),o(p.error)),a.oncomplete=()=>{u==null?s.close():u.oncomplete=()=>s.close()}},n.onerror=s=>o(n.error)})}};var wa="/",Vp="tensorflowjs_models",ev="info",Jz="model_topology",eW="weight_specs",tW="weight_data",rW="model_metadata";function tv(r){return{info:[Vp,r,ev].join(wa),topology:[Vp,r,Jz].join(wa),weightSpecs:[Vp,r,eW].join(wa),weightData:[Vp,r,tW].join(wa),modelMetadata:[Vp,r,rW].join(wa)}}function rv(r){for(let e of Object.values(r))window.localStorage.removeItem(e)}function oW(r){let e=r.split(wa);if(e.length<3)throw new Error(`Invalid key format: ${r}`);return e.slice(1,e.length-1).join(wa)}function nW(r){return r.startsWith(Ds.URL_SCHEME)?r.slice(Ds.URL_SCHEME.length):r}var Ds=class{constructor(e){if(!P().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=tv(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),o=JSON.stringify(e.weightSpecs),n=As(e);try{this.LS.setItem(this.keys.info,JSON.stringify(n)),this.LS.setItem(this.keys.topology,t),this.LS.setItem(this.keys.weightSpecs,o),this.LS.setItem(this.keys.weightData,q0(e.weightData));let s={format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,signature:e.signature!=null?e.signature:void 0,userDefinedMetadata:e.userDefinedMetadata!=null?e.userDefinedMetadata:void 0,modelInitializer:e.modelInitializer!=null?e.modelInitializer:void 0,initializerSignature:e.initializerSignature!=null?e.initializerSignature:void 0,trainingConfig:e.trainingConfig!=null?e.trainingConfig:void 0};return this.LS.setItem(this.keys.modelMetadata,JSON.stringify(s)),{modelArtifactsInfo:n}}catch(s){throw rv(this.keys),new Error(`Failed to save model '${this.modelPath}' to local storage: size quota being exceeded is a possible cause of this failure: modelTopologyBytes=${n.modelTopologyBytes}, weightSpecsBytes=${n.weightSpecsBytes}, weightDataBytes=${n.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={},o=JSON.parse(this.LS.getItem(this.keys.topology));if(o==null)throw new Error(`In local storage, the topology of model '${this.modelPath}' is missing.`);t.modelTopology=o;let n=JSON.parse(this.LS.getItem(this.keys.weightSpecs));if(n==null)throw new Error(`In local storage, the weight specs of model '${this.modelPath}' are missing.`);t.weightSpecs=n;let s=this.LS.getItem(this.keys.modelMetadata);if(s!=null){let i=JSON.parse(s);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),i.initializerSignature!=null&&(t.initializerSignature=i.initializerSignature),i.trainingConfig!=null&&(t.trainingConfig=i.trainingConfig)}let a=this.LS.getItem(this.keys.weightData);if(a==null)throw new Error(`In local storage, the binary weight values of model '${this.modelPath}' are missing.`);return t.weightData=K0(a),t}};Ds.URL_SCHEME="localstorage://";var ov=r=>P().getBool("IS_BROWSER")&&!Array.isArray(r)&&r.startsWith(Ds.URL_SCHEME)?sW(r.slice(Ds.URL_SCHEME.length)):null;mt.registerSaveRouter(ov);mt.registerLoadRouter(ov);function sW(r){return new Ds(r)}var Zm=class{constructor(){$(P().getBool("IS_BROWSER"),()=>"Current environment is not a web browser"),$(typeof window=="undefined"||typeof window.localStorage!="undefined",()=>"Current browser does not appear to support localStorage"),this.LS=window.localStorage}async listModels(){let e={},t=Vp+wa,o=wa+ev;for(let n=0;n"scheme must not be undefined or null."),e.endsWith(zp)&&(e=e.slice(0,e.indexOf(zp))),$(e.length>0,()=>"scheme must not be an empty string.");let o=Yt.getInstance();$(o.managers[e]==null,()=>`A model store manager is already registered for scheme '${e}'.`),o.managers[e]=t}static getManager(e){let t=Yt.getInstance().managers[e];if(t==null)throw new Error(`Cannot find model manager for scheme '${e}'`);return t}static getSchemes(){return Object.keys(Yt.getInstance().managers)}};function Jm(r){if(r.indexOf(zp)===-1)throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${Yt.getSchemes().join(",")}`);return{scheme:r.split(zp)[0],path:r.split(zp)[1]}}async function nv(r,e,t=!1){$(r!==e,()=>`Old path and new path are the same: '${r}'`);let o=mt.getLoadHandlers(r);$(o.length>0,()=>`Copying failed because no load handler is found for source URL ${r}.`),$(o.length<2,()=>`Copying failed because more than one (${o.length}) load handlers for source URL ${r}.`);let n=o[0],s=mt.getSaveHandlers(e);$(s.length>0,()=>`Copying failed because no save handler is found for destination URL ${e}.`),$(s.length<2,()=>`Copying failed because more than one (${o.length}) save handlers for destination URL ${e}.`);let a=s[0],i=Jm(r).scheme,p=Jm(r).path,u=i===Jm(r).scheme,c=await n.load();t&&u&&await Yt.getManager(i).removeModel(p);let l=await a.save(c);return t&&!u&&await Yt.getManager(i).removeModel(p),l.modelArtifactsInfo}async function sv(){let r=Yt.getSchemes(),e={};for(let t of r){let o=await Yt.getManager(t).listModels();for(let n in o){let s=t+zp+n;e[s]=o[n]}}return e}async function av(r){let e=Jm(r);return Yt.getManager(e.scheme).removeModel(e.path)}async function iv(r,e){return nv(r,e,!1)}async function uv(r,e){return nv(r,e,!0)}var Yb=class{constructor(){this.messageName="setTimeoutCustom",this.functionRefs=[],this.handledMessageCount=0,this.hasEventListener=!1}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)}setTimeoutCustom(e,t){if(typeof window=="undefined"||!P().getBool("USE_SETTIMEOUTCUSTOM")){setTimeout(e,t);return}this.functionRefs.push(e),setTimeout(()=>{window.postMessage({name:this.messageName,index:this.functionRefs.length-1},"*")},t),this.hasEventListener||(this.hasEventListener=!0,window.addEventListener("message",o=>{if(o.source===window&&o.data.name===this.messageName){o.stopPropagation();let n=this.functionRefs[o.data.index];n(),this.handledMessageCount++,this.handledMessageCount===this.functionRefs.length&&(this.functionRefs=[],this.handledMessageCount=0)}},!0))}};if(P().get("IS_BROWSER")){P().setPlatform("browser",new Yb);try{Yt.registerManager(Ds.URL_SCHEME,new Zm)}catch(r){}try{Yt.registerManager(Fs.URL_SCHEME,new Qm)}catch(r){}}var aW={importFetch:()=>pv()},Qb;var Zb=class{constructor(){this.util=cv(),this.textEncoder=new this.util.TextEncoder}fetch(e,t){return P().global.fetch!=null?P().global.fetch(e,t):(Qb==null&&(Qb=aW.importFetch()),Qb(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)}};P().get("IS_NODE")&&!P().get("IS_BROWSER")&&P().setPlatform("node",new Zb);function ne(r,e="float32",t){return e=e||"float32",Xc(r),new je(r,e,t)}function iW(r,e){let t=v(r,"x","cast");if(!yb(e))throw new Error(`Failed to cast to unknown dtype ${e}`);if(e==="string"&&t.dtype!=="string"||e!=="string"&&t.dtype==="string")throw new Error("Only strings can be casted to strings");let o={x:t},n={dtype:e};return N.runKernel(to,o,n)}var qe=T({cast_:iW});function uW(r){let t={x:v(r,"x","clone","string_or_numeric")};return N.runKernel(uo,t)}var zr=T({clone_:uW});function ef(r,e=!1){console.log(r.toString(e))}Vb();var pW={buffer:ne,cast:qe,clone:zr,print:ef};L0(pW);var va={};Be(va,{browserFiles:()=>mv,browserHTTPRequest:()=>hv,concatenateArrayBuffers:()=>Lp,copyModel:()=>iv,decodeWeights:()=>jm,encodeWeights:()=>H0,fromMemory:()=>gv,fromMemorySync:()=>nC,getLoadHandlers:()=>Q0,getModelArtifactsForJSON:()=>Bp,getModelArtifactsForJSONSync:()=>qb,getModelArtifactsInfoForJSON:()=>As,getSaveHandlers:()=>Y0,getWeightSpecs:()=>Ym,http:()=>rf,isHTTPScheme:()=>tf,listModels:()=>sv,loadWeights:()=>fv,moveModel:()=>uv,registerLoadRouter:()=>X0,registerSaveRouter:()=>j0,removeModel:()=>av,weightsLoaderFactory:()=>rC,withSaveHandler:()=>xv,withSaveHandlerSync:()=>yv});var cW="model",lW=".json",mW=".weights.bin";function lv(r){return new Promise(e=>setTimeout(e)).then(r)}var Sa=class{constructor(e){if(!P().getBool("IS_BROWSER"))throw new Error("browserDownloads() cannot proceed because the current environment is not a browser.");e.startsWith(Sa.URL_SCHEME)&&(e=e.slice(Sa.URL_SCHEME.length)),(e==null||e.length===0)&&(e=cW),this.modelJsonFileName=e+lW,this.weightDataFileName=e+mW}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 o=[{paths:["./"+this.weightDataFileName],weights:e.weightSpecs}],n=Xm(e,o),s=window.URL.createObjectURL(new Blob([JSON.stringify(n)],{type:"application/json"})),a=this.modelJsonAnchor==null?document.createElement("a"):this.modelJsonAnchor;if(a.download=this.modelJsonFileName,a.href=s,await lv(()=>a.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 lv(()=>i.dispatchEvent(new MouseEvent("click")))}return{modelArtifactsInfo:As(e)}}}};Sa.URL_SCHEME="downloads://";var Jb=class{constructor(e){if(e==null||e.length<1)throw new Error(`When calling browserFiles, at least 1 file is required, but received ${e}`);this.jsonFile=e[0],this.weightsFiles=e.slice(1)}async load(){return new Promise((e,t)=>{let o=new FileReader;o.onload=n=>{let s=JSON.parse(n.target.result),a=s.modelTopology;if(a==null){t(new Error(`modelTopology field is missing from file ${this.jsonFile.name}`));return}if(s.weightsManifest==null){t(new Error(`weightManifest field is missing from file ${this.jsonFile.name}`));return}if(this.weightsFiles.length===0){e({modelTopology:a});return}let p=Bp(s,u=>this.loadWeights(u));e(p)},o.onerror=n=>t(`Failed to read model topology and weights manifest JSON from file '${this.jsonFile.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`),o.readAsText(this.jsonFile)})}loadWeights(e){let t=[],o=[];for(let a of e)t.push(...a.weights),o.push(...a.paths);let n=this.checkManifestAndWeightFiles(e),s=o.map(a=>this.loadWeightsFile(a,n[a]));return Promise.all(s).then(a=>[t,Lp(a)])}loadWeightsFile(e,t){return new Promise((o,n)=>{let s=new FileReader;s.onload=a=>{let i=a.target.result;o(i)},s.onerror=a=>n(`Failed to weights data from file of path '${e}'.`),s.readAsArrayBuffer(t)})}checkManifestAndWeightFiles(e){let t=[],o=this.weightsFiles.map(s=>Hb(s.name)),n={};for(let s of e)s.paths.forEach(a=>{let i=Hb(a);if(t.indexOf(i)!==-1)throw new Error(`Duplicate file basename found in weights manifest: '${i}'`);if(t.push(i),o.indexOf(i)===-1)throw new Error(`Weight file with basename '${i}' is not provided.`);n[a]=this.weightsFiles[o.indexOf(i)]});if(t.length!==this.weightsFiles.length)throw new Error(`Mismatch in the number of files in weights manifest (${t.length}) and the number of weight files provided (${this.weightsFiles.length}).`);return n}},fW=r=>P().getBool("IS_BROWSER")&&!Array.isArray(r)&&r.startsWith(Sa.URL_SCHEME)?dW(r.slice(Sa.URL_SCHEME.length)):null;mt.registerSaveRouter(fW);function dW(r="model"){return new Sa(r)}function mv(r){return new Jb(r)}function eC(r,e,t,o){a(r),t=t==null?0:t,o=o==null?1:o,i(t,o);let n=0,s=p=>(p.then(u=>{let c=t+ ++n/r.length*(o-t);return e(c),u}),p);function a(p){$(p!=null&&Array.isArray(p)&&p.length>0,()=>"promises must be a none empty array")}function i(p,u){$(p>=0&&p<=1,()=>`Progress fraction must be in range [0, 1], but got startFraction ${p}`),$(u>=0&&u<=1,()=>`Progress fraction must be in range [0, 1], but got endFraction ${u}`),$(u>=p,()=>`startFraction must be no more than endFraction, but got startFraction ${p} and endFraction ${u}`)}return Promise.all(r.map(s))}async function tC(r,e){e==null&&(e={});let t=e.fetchFunc==null?P().platform.fetch:e.fetchFunc,o=r.map(l=>t(l,e.requestInit,{isBinary:!0})),n=0,s=.5,i=(e.onProgress==null?await Promise.all(o):await eC(o,e.onProgress,n,s)).map(l=>l.arrayBuffer()),p=.5,u=1;return e.onProgress==null?await Promise.all(i):await eC(i,e.onProgress,p,u)}async function fv(r,e="",t,o){return rC(a=>tC(a,{requestInit:o}))(r,e,t)}function rC(r){return async(e,t="",o)=>{let n=e.map(()=>!1),s={},a=o!=null?o.map(()=>!1):[],i=[];if(e.forEach((f,d)=>{let h=0;f.weights.forEach(g=>{let y="quantization"in g?g.quantization.dtype:g.dtype,b=al[y]*Ve(g.shape),C=()=>{n[d]=!0,s[d]==null&&(s[d]=[]),s[d].push({manifestEntry:g,groupOffset:h,sizeBytes:b})};o!=null?o.forEach((w,k)=>{w===g.name&&(C(),a[k]=!0)}):C(),i.push(g.name),h+=b})}),!a.every(f=>f)){let f=o.filter((d,h)=>!a[h]);throw new Error(`Could not find weights in manifest with names: ${f.join(", ")}. +Manifest JSON has weights with names: ${i.join(", ")}.`)}let p=n.reduce((f,d,h)=>(d&&f.push(h),f),[]),u=[];p.forEach(f=>{e[f].paths.forEach(d=>{let h=t+(t.endsWith("/")?"":"/")+d;u.push(h)})});let c=await r(u),l={},m=0;return p.forEach(f=>{let d=e[f].paths.length,h=0;for(let w=0;w{let k=g.slice(w.groupOffset,w.groupOffset+w.sizeBytes),_=jm(k,[w.manifestEntry]);for(let E in _)l[E]=_[E]}),m+=d}),l}}var hW="application/octet-stream",gW="application/json",il=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?($(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=P().platform.fetch,$(e!=null&&e.length>0,()=>"URL path for http must not be null, undefined or empty."),Array.isArray(e)&&$(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 o=[{paths:["./model.weights.bin"],weights:e.weightSpecs}],n=Xm(e,o);t.body.append("model.json",new Blob([JSON.stringify(n)],{type:gW}),"model.json"),e.weightData!=null&&t.body.append("model.weights.bin",new Blob([e.weightData],{type:hW}),"model.weights.bin");let s=await this.fetch(this.path,t);if(s.ok)return{modelArtifactsInfo:As(e),responses:[s]};throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${s.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(s){let a=`Failed to parse model JSON of response from ${this.path}.`;throw this.path.endsWith(".pb")?a+=" Your path contains a .pb file extension. Support for .pb models have been removed in TensorFlow.js 1.0 in favor of .json models. You can re-convert your Python TensorFlow model using the TensorFlow.js 1.0 conversion scripts or you can convert your.pb models with the 'pb2json'NPM script in the tensorflow/tfjs-converter repository.":a+=" Please make sure the server is serving valid JSON for this request.",new Error(a)}let o=t.modelTopology,n=t.weightsManifest;if(o==null&&n==null)throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`);return Bp(t,s=>this.loadWeights(s))}async loadWeights(e){let t=Array.isArray(this.path)?this.path[1]:this.path,[o,n]=xW(t),s=this.weightPathPrefix||o,a=Ym(e),i=[],p=[];for(let c of e)for(let l of c.paths)this.weightUrlConverter!=null?p.push(this.weightUrlConverter(l)):i.push(s+l+n);this.weightUrlConverter&&i.push(...await Promise.all(p));let u=await tC(i,{requestInit:this.requestInit,fetchFunc:this.fetch,onProgress:this.onProgress});return[a,Lp(u)]}};il.URL_SCHEME_REGEX=/^https?:\/\//;function xW(r){let e=r.lastIndexOf("/"),t=r.lastIndexOf("?"),o=r.substring(0,e),n=t>e?r.substring(t):"";return[o+"/",n]}function tf(r){return r.match(il.URL_SCHEME_REGEX)!=null}var dv=(r,e)=>{if(typeof fetch=="undefined"&&(e==null||e.fetchFunc==null))return null;{let t=!0;if(Array.isArray(r)?t=r.every(o=>tf(o)):t=tf(r),t)return rf(r,e)}return null};mt.registerSaveRouter(dv);mt.registerLoadRouter(dv);function rf(r,e){return new il(r,e)}function hv(r,e){return rf(r,e)}var ul=class{constructor(e){this.modelArtifacts=e}load(){return this.modelArtifacts}},of=class{constructor(e){this.saveHandler=e}save(e){return this.saveHandler(e)}},oC=class{constructor(e){e.load&&(this.load=()=>Promise.resolve(e.load())),e.save&&(this.save=t=>Promise.resolve(e.save(t)))}};function gv(r,e,t,o){let n=arguments;return new oC(nC(...n))}function nC(r,e,t,o){return arguments.length===1?r.modelTopology!=null||r.weightSpecs!=null?new ul(r):(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 ul({modelTopology:r})):(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 ul({modelTopology:r,weightSpecs:e,weightData:t,trainingConfig:o}))}function xv(r){return new of(r)}function yv(r){return new of(r)}var Cv={};Be(Cv,{confusionMatrix:()=>bv});function yW(r,e,t=!1,o=!1){let n=v(r,"a","matMul"),s=v(e,"b","matMul");[n,s]=Re(n,s);let a={a:n,b:s},i={transposeA:t,transposeB:o};return N.runKernel(cn,a,i)}var Xe=T({matMul_:yW});function bW(r,e,t=1,o=0,n="int32"){if(e<2)throw new Error(`Error in oneHot: depth must be >=2, but it is ${e}`);let a={indices:v(r,"indices","oneHot","int32")},i={dtype:n,depth:e,onValue:t,offValue:o};return N.runKernel(ca,a,i)}var pl=T({oneHot_:bW});function Tie(){P().set("PROD",!0)}function Nie(){P().set("DEBUG",!0)}function _ie(){P().set("DEPRECATION_WARNINGS_ENABLED",!1),console.warn("TensorFlow.js deprecation warnings have been disabled.")}function sC(r){P().getBool("DEPRECATION_WARNINGS_ENABLED")&&console.warn(r+" You can disable deprecation warnings with tf.disableDeprecationWarnings().")}B0(sC);function Eie(){N.disposeVariables()}function cr(){return N}function $ie(){return N.memory()}function Rie(r){return N.profile(r)}function Ne(r,e){return N.tidy(r,e)}function Ft(r){sl(r).forEach(t=>t.dispose())}function So(r){return N.keep(r)}function Aie(r){return N.time(r)}function Fie(r){return N.setBackend(r)}function Die(){return N.ready()}function Pie(){return N.backendName}function Oie(r){N.removeBackend(r)}function Mie(r){return N.findBackend(r)}function Lie(r){return N.findBackendFactory(r)}function pi(r,e,t=1){return N.registerBackend(r,e,t)}function Bie(){return N.backend}function Vie(r,e){P().setPlatform(r,e)}function CW(r){let t={input:v(r,"input","imag")};return N.runKernel(Ya,t)}var ci=T({imag_:CW});function IW(r){let t={x:v(r,"x","neg")};return N.runKernel(Pn,t)}var yr=T({neg_:IW});function wW(r){let t={input:v(r,"input","real")};return N.runKernel(la,t)}var ka=T({real_:wW});function SW(r,e,t){let o=v(r,"x","transpose");if(e==null&&(e=o.shape.map((a,i)=>i).reverse()),$(o.rank===e.length,()=>`Error in transpose: rank of input ${o.rank} must match length of perm ${e}.`),e.forEach(a=>{$(a>=0&&a`All entries in 'perm' must be between 0 and ${o.rank-1} but got ${e}`)}),o.rank<=1)return o.clone();let n={x:o},s={perm:e};return o.dtype==="complex64"?Ne(()=>{let a=ka(o),i=ci(o);return a=N.runKernel(Mr,{x:a},s),i=N.runKernel(Mr,{x:i},s),t&&(i=yr(i)),Er(a,i)}):N.runKernel(Mr,n,s)}var Wp=T({transpose_:SW});function vW(r,e,t){let o=v(r,"labels","confusionMatrix"),n=v(e,"predictions","confusionMatrix");$(t==null||t>0&&Number.isInteger(t),()=>`If provided, numClasses must be a positive integer, but got ${t}`),$(o.rank===1,()=>`Expected the rank of labels to be 1, but got ${o.rank}`),$(n.rank===1,()=>`Expected the rank of predictions to be 1, but got ${n.rank}`),$(o.shape[0]===n.shape[0],()=>`Mismatch in the number of examples: ${o.shape[0]} vs. ${n.shape[0]}. Labels and predictions should have the same number of elements.`),$(t>0&&Number.isInteger(t),()=>`numClasses is required to be a positive integer, but got ${t}`);let s=pl(qe(o,"int32"),t),a=pl(qe(n,"int32"),t),i=Wp(s),p=Xe(i,a);return qe(p,"int32")}var bv=T({confusionMatrix_:vW});var br={};Be(br,{assertAndGetBroadcastShape:()=>Je,getBroadcastDims:()=>Iv,getReductionAxes:()=>nf});function Iv(r,e){let t=r.length,o=[];for(let n=0;n1&&a===1&&o.unshift(s)}return o}function nf(r,e){let t=[];for(let o=0;o1)&&t.unshift(s)}return t}function Je(r,e){let t=[],o=Math.max(r.length,e.length);for(let n=0;nRW,fromPixelsAsync:()=>EW,toPixels:()=>$W});function sf(r,e,t){if(eo(r),e!=null&&e.length!==3)throw new Error("tensor3d() requires shape to have three numbers");let o=or(r,t);if(o.length!==3&&o.length!==1)throw new Error("tensor3d() requires values to be number[][][] or flat/TypedArray");if(o.length===1&&e==null)throw new Error("tensor3d() requires shape to be provided when `values` are a flat array");return xr(r,e,o,t)}var su;function wv(r,e=3){if(e>4)throw new Error("Cannot construct Tensor with more than 4 channels from pixels.");if(r==null)throw new Error("pixels passed to tf.browser.fromPixels() can not be null");let t=!1,o=!1,n=!1,s=!1,a=!1,i=!1;if(r.data instanceof Uint8Array)t=!0;else if(typeof ImageData!="undefined"&&r instanceof ImageData)o=!0;else if(typeof HTMLVideoElement!="undefined"&&r instanceof HTMLVideoElement)n=!0;else if(typeof HTMLImageElement!="undefined"&&r instanceof HTMLImageElement)s=!0;else if(r.getContext!=null)a=!0;else if(typeof ImageBitmap!="undefined"&&r instanceof ImageBitmap)i=!0;else throw new Error(`pixels passed to tf.browser.fromPixels() must be either an HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData in browser, or OffscreenCanvas, ImageData in webworker or {data: Uint32Array, width: number, height: number}, but was ${r.constructor.name}`);if(el(Zi,N.backendName)!=null){let d={pixels:r},h={numChannels:e};return N.runKernel(Zi,d,h)}let[u,c]=n?[r.videoWidth,r.videoHeight]:[r.width,r.height],l;if(a)l=r.getContext("2d").getImageData(0,0,u,c).data;else if(o||t)l=r.data;else if(s||n||i){if(su==null)if(typeof document=="undefined")if(typeof OffscreenCanvas!="undefined"&&typeof OffscreenCanvasRenderingContext2D!="undefined")su=new OffscreenCanvas(1,1).getContext("2d");else throw new Error("Cannot parse input in current context. Reason: OffscreenCanvas Context2D rendering is not supported.");else su=document.createElement("canvas").getContext("2d",{willReadFrequently:!0});su.canvas.width=u,su.canvas.height=c,su.drawImage(r,0,0,u,c),l=su.getImageData(0,0,u,c).data}let m;if(e===4)m=new Int32Array(l);else{let d=u*c;m=new Int32Array(d*e);for(let h=0;h4||s===2)throw new Error(`toPixels only supports depth of size 1, 3 or 4 but got ${s}`);if(t.dtype!=="float32"&&t.dtype!=="int32")throw new Error(`Unsupported type for toPixels: ${t.dtype}. Please use float32 or int32 tensors.`);let a=await t.data(),i=t.dtype==="float32"?255:1,p=new Uint8ClampedArray(n*o*4);for(let u=0;u1)throw new Error(`Tensor values for a float32 Tensor must be in the range [0 - 1] but encountered ${f}.`)}else if(t.dtype==="int32"&&(f<0||f>255))throw new Error(`Tensor values for a int32 Tensor must be in the range [0 - 255] but encountered ${f}.`);s===1?(c[0]=f*i,c[1]=f*i,c[2]=f*i):c[m]=f*i}let l=u*4;p[l+0]=Math.round(c[0]),p[l+1]=Math.round(c[1]),p[l+2]=Math.round(c[2]),p[l+3]=Math.round(c[3])}if(e!=null){e.width=n,e.height=o;let u=e.getContext("2d"),c=new ImageData(p,n,o);u.putImageData(c,0,0)}return t!==r&&t.dispose(),p}var RW=T({fromPixels_:wv});var af={};Be(af,{prepareAndValidate:()=>vv});function vv(r,e){let t=r.shape.length,o=e.shape.length;if(t<1)throw new Error(`tf.gatherND() expects the input to be rank 1 or higher, but the rank was ${t}.`);if(o<1)throw new Error(`tf.gatherND() expects the indices to be rank 1 or higher, but the rank was ${o}.`);if(e.dtype!=="int32")throw new Error(`tf.gatherND() expects the indices to be int32 type, but the dtype was ${e.dtype}.`);if(e.shape[o-1]>t)throw new Error(`index innermost dimension length must be <= tensor rank; saw: ${e.shape[o-1]} vs. ${t}`);if(Ve(r.shape)===0)throw new Error(`Requested more than 0 entries, but input is empty. Input shape: ${r.shape}.`);let n=e.shape,s=n[n.length-1],a=1;for(let l=0;ll/u),1].slice(0,s);return[p,a,u,c]}var cl={};Be(cl,{calculateShapes:()=>kv,validateInput:()=>uf,validateUpdateShape:()=>aC});function aC(r,e,t){let o=e.rank>1?e.shape[e.rank-1]:1,n=e.rank>1?e.rank-1:1,s=`Must have updates.shape = indices.shape[:batchDim] + shape[sliceDim:], got updates.shape: ${t.shape}, indices.shape: ${e.shape}, shape: ${r}, sliceDim: ${o}, and batchDim: ${n}.`;if(t.rank1?e.shape[o-1]:1,s=t.length,a=1;for(let l=n;lFW,computeFlatOffset:()=>LW,computeOutShape:()=>PW,getNormalizedAxes:()=>OW,isSliceContinous:()=>MW,maskToAxes:()=>DW,parseSliceParams:()=>BW,sliceInfo:()=>VW,startForAxis:()=>Fv,startIndicesWithElidedDims:()=>$v,stopForAxis:()=>Dv,stopIndicesWithElidedDims:()=>Rv,stridesForAxis:()=>Av,stridesWithElidedDims:()=>Nv});var iC=-2,AW=-1;function FW(r,e,t){let o=r.shape.length;$(o===e.length,()=>`Error in slice${o}D: Length of begin ${e} must match the rank of the array (${o}).`),$(o===t.length,()=>`Error in slice${o}D: Length of size ${t} must match the rank of the array (${o}).`);for(let n=0;n`Error in slice${o}D: begin[${n}] + size[${n}] (${e[n]+t[n]}) would overflow input.shape[${n}] (${r.shape[n]})`)}function DW(r){let e=[],t=0;for(;r>0;)r&1&&e.push(t),r/=2,t++;return e}function PW(r,e,t){let o=[];for(let n=0;n0){let f=e[0],d=t+1;c=$v(a,f,d,o,r),l=Rv(i,f,d,n,r),m=Nv(s,f,d,r)}else for(let f=0;f-1)s[i]=0;else{let p=_v(e,t,i),u=o[p];r&1<-1)s[i]=Number.MAX_SAFE_INTEGER;else{let p=_v(e,t,i),u=o[p];r&1<0?a=Number.MIN_SAFE_INTEGER:a=Number.MAX_SAFE_INTEGER);let p=o[n];return a<0&&(a+=p),a=op(0,a,p-1),a}function Dv(r,e,t,o,n,s){let a=e[n],i=t[n]||1;(r&1<0?a=Number.MAX_SAFE_INTEGER:a=Number.MIN_SAFE_INTEGER);let p=o[n];return a<0&&(a+=p),i>0?a=op(0,a,p):a=op(-1,a,p-1),a}function MW(r,e,t){let o=t.length;for(let n=0;n1){o=n;break}for(let n=o+1;n0||t[n]!==r[n])return!1;return!0}function LW(r,e){let t=r.length>0?r[r.length-1]:1;for(let o=0;o{$(a!==-1,()=>"slice() does not support negative begin indexing.")});let s;return t==null?s=new Array(n).fill(-1):typeof t=="number"?s=[t,...new Array(n-1).fill(-1)]:t.lengtha>=0?a:($(a===-1,()=>`Negative size values should be exactly -1 but got ${a} for the slice() size at index ${i}.`),r.shape[i]-o[i])),[o,s]}function VW(r,e,t,o,n,s,a,i,p){let u;if(o==null?(u=new Array(e.length),u.fill(1)):u=o,a!=null&&(a&a-1)!==0)throw new Error("Multiple ellipses in slice is not allowed.");let c=!1,l={dims:u.length,numAddAxisAfterEllipsis:0,begin:e.slice(),end:t.slice(),strides:u.slice(),beginMask:n,endMask:s,ellipsisMask:a,newAxisMask:i,shrinkAxisMask:p};for(let C=0;C0?0:-1,m.strides[C]>0?k:k-1];if(w&&m.strides[C]<=0)throw Error("only stride 1 allowed on non-range indexing.");h=h&&m.strides[C]===1;let R=!!(m.beginMask&1<=k)throw Error(`slice index ${m.begin[C]} of dimension ${C} out of bounds.`)}else m.begin[C]=Tv(m.begin[C],0,m.strides[C],k,_,E),m.end[C]=Tv(m.end[C],1,m.strides[C],k,_,E);let O=m.strides[C]===1&&m.begin[C]===0&&m.end[C]===k;f=f&&O,d=d&&(C===0&&m.strides[C]===1||O)}else f=f&&m.strides[C]===1&&R,d=d&&(C===0&&m.strides[C]===1||R);let A,D=!1;if(m.beginValid&&m.endValid?(A=m.end[C]-m.begin[C],D=!0):w?(A=1,D=!0):R&&k>=0&&(m.strides[C]<0?A=-k:A=k,D=!0),D){let O;A===0||A<0!=m.strides[C]<0?O=0:O=Math.trunc(A/m.strides[C])+(A%m.strides[C]!==0?1:0),g.push(O)}else g.push(-1)}for(let C=0;C=0?y.push(g[w]):w===iC&&y.push(1)}return{finalShapeSparse:y.filter((C,w)=>m.finalShapeGatherIndices[w]!==iC),finalShape:y,isIdentity:f,sliceDim0:d,isSimpleSlice:h,begin:m.begin,end:m.end,strides:m.strides}}function zW(r,e){e.beginMask=0,e.endMask=0,e.shrinkAxisMask=0;let t=0;e.beginValid=r.begin!=null,e.endValid=r.end!=null,e.begin=new Array(e.dims),e.end=new Array(e.dims),e.strides=new Array(e.dims),e.finalShapeGatherIndices=[],e.finalShapeGatherIndicesSparse=[],e.inputShapeGatherIndicesSparse=new Array(e.dims);for(let o=0;o0?s[e]:s[e+1&1];{let a=r<0?o+r:r;return as[1]?s[1]:a}}var Pv={};Be(Pv,{Serializable:()=>ll,SerializationMap:()=>Ps,registerClass:()=>$r});var ll=class{getClassName(){return this.constructor.className}static fromConfig(e,t){return new e(t)}},Ps=class{constructor(){this.classNameMap={}}static getMap(){return Ps.instance==null&&(Ps.instance=new Ps),Ps.instance}static register(e){Ps.getMap().classNameMap[e.className]=[e,e.fromConfig]}};function $r(r){$(r.className!=null,()=>"Class being registered does not have the static className property defined."),$(typeof r.className=="string",()=>"className is required to be a string, but got type "+typeof r.className),$(r.className.length>0,()=>"Class being registered has an empty-string as its className, which is disallowed."),Ps.register(r)}var Bv={};Be(Bv,{TEST_EPSILON_FLOAT16:()=>Ov,createVideoElement:()=>jW,encodeStrings:()=>Lv,expectArrayBuffersEqual:()=>KW,expectArraysClose:()=>UW,expectArraysEqual:()=>HW,expectNumbersClose:()=>Mv,expectPromiseToFail:()=>GW,expectValuesInRange:()=>qW,play:()=>XW,testEpsilon:()=>pf});var WW=.001,Ov=.1;function UW(r,e,t){return t==null&&(t=pf()),uC(r,e,(o,n)=>pC(o,n,t))}function pf(){return N.backend.floatPrecision()===32?WW:Ov}function uC(r,e,t){let o=!0;if((Ut(r)||Ut(e))&&(o=!1),Ut(r)&&Ut(e)&&(o=!0),o){let a=r.constructor.name,i=e.constructor.name;if(a!==i)throw new Error(`Arrays are of different type. Actual: ${a}. Expected: ${i}`)}if(Array.isArray(r)&&Array.isArray(e)){let a=or(r),i=or(e);if(!Or(a,i))throw new Error(`Arrays have different shapes. Actual: [${a}]. Expected: [${i}]`)}let n=Ut(r)?r:on(r),s=Ut(e)?e:on(e);if(n.length!==s.length)throw new Error(`Arrays have different lengths actual: ${n.length} vs expected: ${s.length}. +Actual: ${n}. +Expected: ${s}.`);for(let a=0;ae.fail(),()=>e()),typeof expect!="undefined"&&expect().nothing()}function HW(r,e){let t=typeof e=="string"||typeof e=="number"||typeof e=="boolean"?[e]:e;return nn(r)||nn(r[0])||nn(e)||nn(e[0])?uC(r,t,(o,n)=>o==n):uC(r,e,(o,n)=>pC(o,n,0))}function Mv(r,e,t){if(t==null&&(t=pf()),!pC(r,e,t))throw new Error(`Numbers differ: actual === ${r}, expected === ${e}`);typeof expect!="undefined"&&expect().nothing()}function pC(r,e,t){return!isFinite(r)&&!isFinite(e)?!0:!(isNaN(r)||isNaN(e)||Math.abs(r-e)>t)}function qW(r,e,t){for(let o=0;ot)throw new Error(`Value out of range:${r[o]} low: ${e}, high: ${t}`)}function KW(r,e){let t=new Float32Array(r),o=new Float32Array(e);if(t.length!==o.length)throw new Error(`Expected ArrayBuffer to be of length ${o.length}, but it was ${t.length}`);for(let n=0;n{e.addEventListener("loadeddata",o=>t(e)),e.load()})}async function XW(r){await r.play(),"requestVideoFrameCallback"in r&&await new Promise(e=>{r.requestVideoFrameCallback(e)})}var YW="4.0.0";function QW(r,e){let t=v(r,"a","add"),o=v(e,"b","add");[t,o]=Re(t,o);let n={a:t,b:o};return N.runKernel(_r,n)}var ge=T({add_:QW});function ZW(r,e){let t=v(r,"a","floorDiv"),o=v(e,"b","floorDiv");[t,o]=Re(t,o);let n={a:t,b:o};return N.runKernel(vn,n)}var cf=T({floorDiv_:ZW});function JW(r,e){let t=v(r,"a","div"),o=v(e,"b","div");if([t,o]=Re(t,o),t.dtype==="int32"&&o.dtype==="int32")return cf(t,o);let n={a:t,b:o},s={};return N.runKernel(Cn,n,s)}var We=T({div_:JW});function eU(r,e){let t=v(r,"a","mul"),o=v(e,"b","mul");[t,o]=Re(t,o);let n={a:t,b:o};return N.runKernel(ho,n)}var oe=T({mul_:eU});function tU(r){let e=v(r,"x","abs");if(e.dtype==="complex64"){let t={x:e};return N.runKernel(cp,t)}else{let t={x:e};return N.runKernel(sn,t)}}var Qt=T({abs_:tU});function rU(r){let t={x:v(r,"x","acos")};return N.runKernel(Li,t)}var Vv=T({acos_:rU});function oU(r){let t={x:v(r,"x","acosh")};return N.runKernel(Bi,t)}var zv=T({acosh_:oU});function nU(r){$(Array.isArray(r),()=>"The argument passed to tf.addN() must be a list of tensors"),$(r.length>=1,()=>`Must pass at least one tensor to tf.addN(), but got ${r.length}`);let e=r.map((n,s)=>v(n,`tensors${s}`,"addN")),t=e[0];e.forEach(n=>{if(n.dtype!==t.dtype)throw new Error("All tensors passed to tf.addN() must have the same dtype")}),e.forEach(n=>{if(!Or(n.shape,t.shape))throw new Error("All tensors passed to tf.addN() must have the same shape")});let o=e;return N.runKernel(an,o)}var Wv=T({addN_:nU});function sU(r,e=null,t=!1){let n={x:v(r,"x","all","bool")},s={axis:e,keepDims:t};return N.runKernel(oa,n,s)}var Uv=T({all_:sU});function aU(r,e=null,t=!1){let n={x:v(r,"x","any","bool")},s={axis:e,keepDims:t};return N.runKernel(na,n,s)}var Gv=T({any_:aU});function iU(r,e=0){let o={x:v(r,"x","argMax")},n={axis:e};return N.runKernel(un,o,n)}var Hv=T({argMax_:iU});function uU(r,e=0){let o={x:v(r,"x","argMin")},n={axis:e};return N.runKernel(ja,o,n)}var qv=T({argMin_:uU});function pU(r){let t={x:v(r,"x","asin")};return N.runKernel(Vi,t)}var Kv=T({asin_:pU});function cU(r){let t={x:v(r,"x","asinh")};return N.runKernel(zi,t)}var jv=T({asinh_:cU});function lU(r){let t={x:v(r,"x","atan")};return N.runKernel(Wi,t)}var Xv=T({atan_:lU});function mU(r,e){let t=v(r,"a","atan2"),o=v(e,"b","atan2");[t,o]=Re(t,o);let n={a:t,b:o};return N.runKernel(sa,n)}var Yv=T({atan2_:mU});function fU(r){let t={x:v(r,"x","atanh")};return N.runKernel(Ui,t)}var Qv=T({atanh_:fU});function dU(r,e,t,o,n="NHWC",s){let a=r[3],i=[...e,a],p=Jv(n);return uu(r,i,t,s,o,null,null,p)}function lC(r,e,t,o,n,s,a="channelsLast"){let[i,p]=lf(e),u;if(a==="channelsLast")u=[i,p,r[3],r[3]];else if(a==="channelsFirst")u=[i,p,r[1],r[1]];else throw new Error(`Unknown dataFormat ${a}`);return uu(r,u,t,o,n,s,!1,a)}function hU(r,e,t,o,n,s,a="NDHWC"){let[i,p,u]=cC(e),c,l;if(a==="NDHWC")l="channelsLast",c=[i,p,u,r[4],r[4]];else if(a==="NCDHW")l="channelsFirst",c=[i,p,u,r[1],r[1]];else throw new Error(`Unknown dataFormat ${a}`);return Zv(r,c,t,o,n,!1,l,s)}function uu(r,e,t,o,n,s,a=!1,i="channelsLast"){let[p,u,c,l]=[-1,-1,-1,-1];if(i==="channelsLast")[p,u,c,l]=r;else if(i==="channelsFirst")[p,l,u,c]=r;else throw new Error(`Unknown dataFormat ${i}`);let[m,f,,d]=e,[h,g]=lf(t),[y,b]=lf(o),C=Up(m,y),w=Up(f,b),{padInfo:k,outHeight:_,outWidth:E}=yU(n,u,c,h,g,C,w,s,i),R=a?d*l:d,A;return i==="channelsFirst"?A=[p,R,_,E]:i==="channelsLast"&&(A=[p,_,E,R]),{batchSize:p,dataFormat:i,inHeight:u,inWidth:c,inChannels:l,outHeight:_,outWidth:E,outChannels:R,padInfo:k,strideHeight:h,strideWidth:g,filterHeight:m,filterWidth:f,effectiveFilterHeight:C,effectiveFilterWidth:w,dilationHeight:y,dilationWidth:b,inShape:r,outShape:A,filterShape:e}}function Zv(r,e,t,o,n,s=!1,a="channelsLast",i){let[p,u,c,l,m]=[-1,-1,-1,-1,-1];if(a==="channelsLast")[p,u,c,l,m]=r;else if(a==="channelsFirst")[p,m,u,c,l]=r;else throw new Error(`Unknown dataFormat ${a}`);let[f,d,h,,g]=e,[y,b,C]=cC(t),[w,k,_]=cC(o),E=Up(f,w),R=Up(d,k),A=Up(h,_),{padInfo:D,outDepth:O,outHeight:M,outWidth:L}=bU(n,u,c,l,y,b,C,E,R,A,i),W=s?g*m:g,V;return a==="channelsFirst"?V=[p,W,O,M,L]:a==="channelsLast"&&(V=[p,O,M,L,W]),{batchSize:p,dataFormat:a,inDepth:u,inHeight:c,inWidth:l,inChannels:m,outDepth:O,outHeight:M,outWidth:L,outChannels:W,padInfo:D,strideDepth:y,strideHeight:b,strideWidth:C,filterDepth:f,filterHeight:d,filterWidth:h,effectiveFilterDepth:E,effectiveFilterHeight:R,effectiveFilterWidth:A,dilationDepth:w,dilationHeight:k,dilationWidth:_,inShape:r,outShape:V,filterShape:e}}function gU(r,e,t,o,n){o==null&&(o=mC(r,e,t));let s=r[0],a=r[1],i=au((s-e+2*o)/t+1,n),p=au((a-e+2*o)/t+1,n);return[i,p]}function xU(r,e,t,o,n,s){n==null&&(n=mC(r,e,o));let a=r[0],i=r[1],p=r[2],u=au((a-e+2*n)/o+1,s),c=au((i-e+2*n)/o+1,s),l=au((p-e+2*n)/o+1,s);return[u,c,l,t]}function mC(r,e,t,o=1){let n=Up(e,o);return Math.floor((r[0]*(t-1)-t+n)/2)}function lf(r){return typeof r=="number"?[r,r,r]:r.length===2?[r[0],r[1],1]:r}function cC(r){return typeof r=="number"?[r,r,r]:r}function Up(r,e){return e<=1?r:r+(r-1)*(e-1)}function yU(r,e,t,o,n,s,a,i,p){let u,c,l;if(typeof r=="number"){u={top:r,bottom:r,left:r,right:r,type:r===0?"VALID":"NUMBER"};let f=gU([e,t],s,o,r,i);c=f[0],l=f[1]}else if(r==="same"){c=Math.ceil(e/o),l=Math.ceil(t/n);let m=Math.max(0,(c-1)*o+s-e),f=Math.max(0,(l-1)*n+a-t),d=Math.floor(m/2),h=m-d,g=Math.floor(f/2),y=f-g;u={top:d,bottom:h,left:g,right:y,type:"SAME"}}else if(r==="valid")u={top:0,bottom:0,left:0,right:0,type:"VALID"},c=Math.ceil((e-s+1)/o),l=Math.ceil((t-a+1)/n);else if(typeof r=="object"){let m=p==="channelsLast"?r[1][0]:r[2][0],f=p==="channelsLast"?r[1][1]:r[2][1],d=p==="channelsLast"?r[2][0]:r[3][0],h=p==="channelsLast"?r[2][1]:r[3][1];u={top:m,bottom:f,left:d,right:h,type:m===0&&f===0&&d===0&&h===0?"VALID":"EXPLICIT"},c=au((e-s+m+f)/o+1,i),l=au((t-a+d+h)/n+1,i)}else throw Error(`Unknown padding parameter: ${r}`);return{padInfo:u,outHeight:c,outWidth:l}}function bU(r,e,t,o,n,s,a,i,p,u,c){let l,m,f,d;if(typeof r=="number"){l={top:r,bottom:r,left:r,right:r,front:r,back:r,type:r===0?"VALID":"NUMBER"};let g=xU([e,t,o,1],i,1,n,r,c);m=g[0],f=g[1],d=g[2]}else if(r==="same"){m=Math.ceil(e/n),f=Math.ceil(t/s),d=Math.ceil(o/a);let h=(m-1)*n+i-e,g=(f-1)*s+p-t,y=(d-1)*a+u-o,b=Math.floor(h/2),C=h-b,w=Math.floor(g/2),k=g-w,_=Math.floor(y/2),E=y-_;l={top:w,bottom:k,left:_,right:E,front:b,back:C,type:"SAME"}}else if(r==="valid")l={top:0,bottom:0,left:0,right:0,front:0,back:0,type:"VALID"},m=Math.ceil((e-i+1)/n),f=Math.ceil((t-p+1)/s),d=Math.ceil((o-u+1)/a);else throw Error(`Unknown padding parameter: ${r}`);return{padInfo:l,outDepth:m,outHeight:f,outWidth:d}}function au(r,e){if(!e)return Math.trunc(r);switch(e){case"round":return Math.round(r);case"ceil":return Math.ceil(r);case"floor":return Math.floor(r);default:throw new Error(`Unknown roundingMode ${e}`)}}function iu(r){let[e,t,o]=lf(r);return e===1&&t===1&&o===1}function lr(r,e){return iu(r)||iu(e)}function Jv(r){if(r==="NHWC")return"channelsLast";if(r==="NCHW")return"channelsFirst";throw new Error(`Unknown dataFormat ${r}`)}function Ot(r,e,t){if(t!=null){if(typeof e=="string")throw Error(`Error in ${r}: pad must be an integer when using dimRoundingMode ${t} but got pad ${e}.`);if(typeof e=="number")$(ra(e),()=>`Error in ${r}: pad must be an integer when using dimRoundingMode ${t} but got pad ${e}.`);else if(typeof e=="object")e.forEach(o=>{o.forEach(n=>{$(ra(n),()=>`Error in ${r}: pad must be an integer when using dimRoundingMode ${t} but got pad ${n}.`)})});else throw Error(`Error in ${r}: Unknown padding parameter: ${e}`)}}function CU(r,e){let o={x:v(r,"x","reshape","string_or_numeric")},n={shape:e};return N.runKernel(Ss,o,n)}var z=T({reshape_:CU});function IU(r,e,t,o,n){let s=v(r,"x","avgPool","float32"),a=1;$(lr(t,a),()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${t} and dilations '${a}'`);let i=s,p=!1;s.rank===3&&(p=!0,i=z(s,[1,s.shape[0],s.shape[1],s.shape[2]])),$(i.rank===4,()=>`Error in avgPool: x must be rank 4 but got rank ${i.rank}.`),Ot("avgPool",o,n);let u={x:i},c={filterSize:e,strides:t,pad:o,dimRoundingMode:n},l=N.runKernel(pn,u,c);return l=qe(l,s.dtype),p?z(l,[l.shape[1],l.shape[2],l.shape[3]]):l}var mf=T({avgPool_:IU});function wU(r,e,t,o,n,s="NDHWC"){let a=v(r,"x","avgPool3d","float32"),i=a,p=!1;a.rank===4&&(p=!0,i=z(a,[1,a.shape[0],a.shape[1],a.shape[2],a.shape[3]])),$(i.rank===5,()=>`Error in avgPool3d: x must be rank 5 but got rank ${i.rank}.`),$(s==="NDHWC",()=>`Error in avgPool3d: Only NDHWC is currently supported, but got dataFormat of ${s}`),Ot("avgPool3d",o,n);let u={x:i},c={filterSize:e,strides:t,pad:o,dimRoundingMode:n,dataFormat:s},l=N.runKernel(ip,u,c);return l=qe(l,i.dtype),p?z(l,[l.shape[1],l.shape[2],l.shape[3],l.shape[4]]):l}var ek=T({avgPool3d_:wU});function SU(r,e=0){$(r.length>=1,()=>"Pass at least one tensor to concat");let t=Ia(r,"tensors","concat","string_or_numeric");if(t[0].dtype==="complex64"&&t.forEach(s=>{if(s.dtype!=="complex64")throw new Error(`Cannot concatenate complex64 tensors with a tensor + with dtype ${s.dtype}. `)}),t.length===1)return zr(t[0]);let o=t,n={axis:e};return N.runKernel(gs,o,n)}var gt=T({concat_:SU});function vU(r){let t={x:v(r,"x","sigmoid","float32")};return N.runKernel(yo,t)}var Ms=T({sigmoid_:vU});function kU(r,e,t){let o=v(r,"x","slice","string_or_numeric");if(o.rank===0)throw new Error("Slicing scalar is not possible");let n={x:o},s={begin:e,size:t};return N.runKernel(qn,n,s)}var Ue=T({slice_:kU});function TU(r){let t={x:v(r,"x","tanh","float32")};return N.runKernel(Qn,t)}var ml=T({tanh_:TU});function NU(r,e,t,o,n,s){let a=v(r,"forgetBias","basicLSTMCell"),i=v(e,"lstmKernel","basicLSTMCell"),p=v(t,"lstmBias","basicLSTMCell"),u=v(o,"data","basicLSTMCell"),c=v(n,"c","basicLSTMCell"),l=v(s,"h","basicLSTMCell"),m=gt([u,l],1),f=Xe(m,i),d=ge(f,p),h=d.shape[0],g=d.shape[1]/4,y=[h,g],b=Ue(d,[0,0],y),C=Ue(d,[0,g],y),w=Ue(d,[0,g*2],y),k=Ue(d,[0,g*3],y),_=ge(oe(Ms(b),ml(C)),oe(c,Ms(ge(a,w)))),E=oe(ml(_),Ms(k));return[_,E]}var tk=T({basicLSTMCell_:NU});function _U(r,e,t){let o=v(r,"x","batchToSpaceND"),n=e.reduce((i,p)=>i*p);$(o.rank>=1+e.length,()=>`input rank is ${o.rank} but should be > than blockShape.length ${e.length}`),$(t.length===e.length,()=>`crops.length is ${t.length} but should be equal to blockShape.length ${e.length}`),$(o.shape[0]%n===0,()=>`input tensor batch is ${o.shape[0]} but is not divisible by the product of the elements of blockShape ${e.join(" * ")} === ${n}`);let s={x:o},a={blockShape:e,crops:t};return N.runKernel(hs,s,a)}var ff=T({batchToSpaceND_:_U});function rk(r){let e;return r.rank===0||r.rank===1?e=z(r,[1,1,1,r.size]):r.rank===2?e=z(r,[1,1,r.shape[0],r.shape[1]]):r.rank===3?e=z(r,[1,r.shape[0],r.shape[1],r.shape[2]]):e=r,e}function EU(r,e,t,o,n,s){s==null&&(s=.001);let a=v(r,"x","batchNorm"),i=v(e,"mean","batchNorm"),p=v(t,"variance","batchNorm"),u;n!=null&&(u=v(n,"scale","batchNorm"));let c;o!=null&&(c=v(o,"offset","batchNorm")),$(i.rank===p.rank,()=>"Batch normalization gradient requires mean and variance to have equal ranks."),$(c==null||i.rank===c.rank,()=>"Batch normalization gradient requires mean and offset to have equal ranks."),$(u==null||i.rank===u.rank,()=>"Batch normalization gradient requires mean and scale to have equal ranks.");let m={x:rk(a),scale:u,offset:c,mean:i,variance:p},f={varianceEpsilon:s},d=N.runKernel(kn,m,f);return z(d,a.shape)}var li=T({batchNorm_:EU});function $U(r,e,t,o,n,s){let a=v(r,"x","batchNorm"),i=v(e,"mean","batchNorm"),p=v(t,"variance","batchNorm"),u;n!=null&&(u=v(n,"scale","batchNorm"));let c;return o!=null&&(c=v(o,"offset","batchNorm")),$(a.rank===2,()=>`Error in batchNorm2D: x must be rank 2 but got rank ${a.rank}.`),$(i.rank===2||i.rank===1,()=>`Error in batchNorm2D: mean must be rank 2 or rank 1 but got rank ${i.rank}.`),$(p.rank===2||p.rank===1,()=>`Error in batchNorm2D: variance must be rank 2 or rank 1 but got rank ${p.rank}.`),u!=null&&$(u.rank===2||u.rank===1,()=>`Error in batchNorm2D: scale must be rank 2 or rank 1 but got rank ${u.rank}.`),c!=null&&$(c.rank===2||c.rank===1,()=>`Error in batchNorm2D: offset must be rank 2 or rank 1 but got rank ${c.rank}.`),li(a,i,p,c,u,s)}var ok=T({batchNorm2d_:$U});function RU(r,e,t,o,n,s){let a=v(r,"x","batchNorm"),i=v(e,"mean","batchNorm"),p=v(t,"variance","batchNorm"),u;n!=null&&(u=v(n,"scale","batchNorm"));let c;return o!=null&&(c=v(o,"offset","batchNorm")),$(a.rank===3,()=>`Error in batchNorm3D: x must be rank 3 but got rank ${a.rank}.`),$(i.rank===3||i.rank===1,()=>`Error in batchNorm3D: mean must be rank 3 or rank 1 but got rank ${i.rank}.`),$(p.rank===3||p.rank===1,()=>`Error in batchNorm3D: variance must be rank 3 or rank 1 but got rank ${p.rank}.`),u!=null&&$(u.rank===3||u.rank===1,()=>`Error in batchNorm3D: scale must be rank 3 or rank 1 but got rank ${u.rank}.`),c!=null&&$(c.rank===3||c.rank===1,()=>`Error in batchNorm3D: offset must be rank 3 or rank 1 but got rank ${c.rank}.`),li(a,i,p,c,u,s)}var nk=T({batchNorm3d_:RU});function AU(r,e,t,o,n,s){let a=v(r,"x","batchNorm"),i=v(e,"mean","batchNorm"),p=v(t,"variance","batchNorm"),u;n!=null&&(u=v(n,"scale","batchNorm"));let c;return o!=null&&(c=v(o,"offset","batchNorm")),$(a.rank===4,()=>`Error in batchNorm4D: x must be rank 4 but got rank ${a.rank}.`),$(i.rank===4||i.rank===1,()=>`Error in batchNorm4D: mean must be rank 4 or rank 1 but got rank ${i.rank}.`),$(p.rank===4||p.rank===1,()=>`Error in batchNorm4D: variance must be rank 4 or rank 1 but got rank ${p.rank}.`),u!=null&&$(u.rank===4||u.rank===1,()=>`Error in batchNorm4D: scale must be rank 4 or rank 1 but got rank ${u.rank}.`),c!=null&&$(c.rank===4||c.rank===1,()=>`Error in batchNorm4D: offset must be rank 4 or rank 1 but got rank ${c.rank}.`),li(a,i,p,c,u,s)}var sk=T({batchNorm4d_:AU});function FU(r,e,t){let o=v(r,"x","bincount"),n=v(e,"weights","bincount");$(o.dtype==="int32",()=>`Error in bincount: input dtype must be int32, but got ${o.dtype}`),$(t>=0,()=>`size must be non-negative, but got ${t}.`),$(n.size===o.size||n.size===0,()=>`Error in bincount: weights must have the same size as input or0-length, but got input shape: ${o.shape}, weights shape: ${n.shape}.`);let s={x:o,weights:n},a={size:t};return N.runKernel(up,s,a)}var df=T({bincount_:FU});function DU(r,e){let t=v(r,"s0","broadcastArgs","int32"),o=v(e,"s1","broadcastArgs","int32");if(t.rank!==1)throw new Error(`broadcastArgs(): first input must be a vector (rank=1). Has rank ${t.rank}`);if(o.rank!==1)throw new Error(`broadcastArgs(): second input must be a vector (rank=1). Has rank ${o.rank}`);let n={s0:t,s1:o};return N.runKernel(pp,n)}var ak=T({broadcastArgs_:DU});function PU(r,e){let t=v(r,"broadcastTo","x"),o=t.shape;if(e.some(u=>!(u>0)||u%1!==0))throw new Error(`broadcastTo(): Invalid broadcast shape [${e}].`);if(e.lengtht.rank){let u=t.shape.slice();for(;u.length=0;u--)if(n[u]===e[u])s[u]=1;else if(t.shape[u]!==1)throw new Error(`broadcastTo(): [${o}] cannot be broadcast to [${e}].`);if(s.map((u,c)=>u>1?c:-1).filter(u=>u>=0).length===0)return zr(t);let i={x:t},p={reps:s};return N.runKernel(wo,i,p)}var Ls=T({broadcastTo_:PU});function OU(r){let t={x:v(r,"x","ceil","float32")};return N.runKernel(ro,t)}var ik=T({ceil_:OU});function Bs(r,e,t){let o={shape:r,value:e,dtype:t};return N.runKernel(ys,{},o)}function MU(r,e,t){let o=v(r,"x","clipByValue");if($(e<=t,()=>`Error in clip: min (${e}) must be less than or equal to max (${t}).`),e===t)return Bs(o.shape,e,o.dtype);let n={x:o},s={clipValueMin:e,clipValueMax:t};return N.runKernel(Ro,n,s)}var uk=T({clipByValue_:MU});function LU(r){return gt(r,0)}var pk=T({concat1d_:LU});function BU(r,e){return gt(r,e)}var ck=T({concat2d_:BU});function VU(r,e){return gt(r,e)}var lk=T({concat3d_:VU});function zU(r,e){return gt(r,e)}var mk=T({concat4d_:zU});function WU(r,e,t,o,n="NHWC",s=[1,1],a){let i=v(r,"x","conv2d","float32"),p=v(e,"filter","conv2d","float32"),u=i,c=!1;i.rank===3&&(c=!0,u=z(i,[1,i.shape[0],i.shape[1],i.shape[2]])),$(u.rank===4,()=>`Error in conv2d: input must be rank 4, but got rank ${u.rank}.`),$(p.rank===4,()=>`Error in conv2d: filter must be rank 4, but got rank ${p.rank}.`),Ot("conv2d",o,a);let l=n==="NHWC"?u.shape[3]:u.shape[1];$(l===p.shape[2],()=>`Error in conv2d: depth of input (${l}) must match input depth for filter ${p.shape[2]}.`),$(lr(t,s),()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${t} and dilations '${s}'`);let m={x:u,filter:p},f={strides:t,pad:o,dataFormat:n,dilations:s,dimRoundingMode:a},d=N.runKernel(ln,m,f);return c?z(d,[d.shape[1],d.shape[2],d.shape[3]]):d}var mi=T({conv2d_:WU});function UU(r,e,t,o,n="NWC",s=1,a){let i=v(r,"x","conv1d"),p=v(e,"filter","conv1d"),u=i,c=!1;i.rank===2&&(c=!0,u=z(i,[1,i.shape[0],i.shape[1]])),$(u.rank===3,()=>`Error in conv1d: input must be rank 3, but got rank ${u.rank}.`),$(p.rank===3,()=>`Error in conv1d: filter must be rank 3, but got rank ${p.rank}.`),Ot("conv1d",o,a),$(u.shape[2]===p.shape[1],()=>`Error in conv1d: depth of input (${u.shape[2]}) must match input depth for filter ${p.shape[1]}.`),$(lr(t,s),()=>`Error in conv1D: Either stride or dilation must be 1. Got stride ${t} and dilation '${s}'`),$(n==="NWC",()=>`Error in conv1d: got dataFormat of ${n} but only NWC is currently supported.`);let l=z(p,[1,p.shape[0],p.shape[1],p.shape[2]]),m=z(u,[u.shape[0],1,u.shape[1],u.shape[2]]),g=mi(m,l,[1,t],o,"NHWC",[1,s],a);return c?z(g,[g.shape[2],g.shape[3]]):z(g,[g.shape[0],g.shape[2],g.shape[3]])}var fk=T({conv1d_:UU});function GU(r,e,t,o,n,s="NHWC",a){$(r.length===e.rank,()=>`Length of inShape (${r.length}) and rank of dy (${e.rank}) must match`);let i=r,p=e,u=!1;e.rank===3&&(u=!0,p=z(e,[1,e.shape[0],e.shape[1],e.shape[2]]),i=[1,r[0],r[1],r[2]]),$(i.length===4,()=>`Error in conv2dDerInput: inShape must be length 4, but got length ${i.length}.`),$(p.rank===4,()=>`Error in conv2dDerInput: dy must be rank 4, but got rank ${p.rank}`),$(t.rank===4,()=>`Error in conv2dDerInput: filter must be rank 4, but got rank ${t.rank}`);let c=s==="NHWC"?i[3]:i[1],l=s==="NHWC"?p.shape[3]:p.shape[1];$(c===t.shape[2],()=>`Error in conv2dDerInput: depth of input (${c}) must match input depth for filter ${t.shape[2]}.`),$(l===t.shape[3],()=>`Error in conv2dDerInput: depth of output (${l}) must match output depth for filter ${t.shape[3]}.`),Ot("conv2dDerInput",n,a);let m={dy:p,filter:t},f={strides:o,pad:n,dataFormat:s,dimRoundingMode:a,inputShape:i},d=N.runKernel(mn,m,f);return u?z(d,[d.shape[1],d.shape[2],d.shape[3]]):d}var hf=T({conv2DBackpropInput_:GU});function HU(r,e,t,o,n,s){let a=v(r,"x","conv2dTranspose"),i=v(e,"filter","conv2dTranspose");return hf(t,a,i,o,n,"NHWC",s)}var dk=T({conv2dTranspose_:HU});function qU(r,e,t,o,n="NDHWC",s=[1,1,1]){let a=v(r,"x","conv3d"),i=v(e,"filter","conv3d"),p=a,u=!1;a.rank===4&&(u=!0,p=z(a,[1,a.shape[0],a.shape[1],a.shape[2],a.shape[3]])),$(p.rank===5,()=>`Error in conv3d: input must be rank 5, but got rank ${p.rank}.`),$(i.rank===5,()=>`Error in conv3d: filter must be rank 5, but got rank ${i.rank}.`),$(p.shape[4]===i.shape[3],()=>`Error in conv3d: depth of input (${p.shape[4]}) must match input depth for filter ${i.shape[3]}.`),$(lr(t,s),()=>`Error in conv3D: Either strides or dilations must be 1. Got strides ${t} and dilations '${s}'`),$(n==="NDHWC",()=>`Error in conv3d: got dataFormat of ${n} but only NDHWC is currently supported.`);let c={x:p,filter:i},l={strides:t,pad:o,dataFormat:n,dilations:s},m=N.runKernel(mp,c,l);return u?z(m,[m.shape[1],m.shape[2],m.shape[3],m.shape[4]]):m}var hk=T({conv3d_:qU});function KU(r,e,t,o,n){$(r.length===e.rank,()=>`Length of inShape (${r.length}) and rank of dy (${e.rank}) must match`);let s=r,a=e,i=!1;e.rank===4&&(i=!0,a=z(e,[1,e.shape[0],e.shape[1],e.shape[2],e.shape[3]]),s=[1,r[0],r[1],r[2],r[3]]);let p=s[4],u=a.shape[4];$(s.length===5,()=>`Error in conv3dDerInput: inShape must be length 5, but got length ${s.length}.`),$(a.rank===5,()=>`Error in conv3dDerInput: dy must be rank 5, but got rank ${a.rank}`),$(t.rank===5,()=>`Error in conv3dDerInput: filter must be rank 5, but got rank ${t.rank}`),$(p===t.shape[3],()=>`Error in conv3dDerInput: depth of input (${p}) must match input depth for filter ${t.shape[3]}.`),$(u===t.shape[4],()=>`Error in conv3dDerInput: depth of output (${u}) must match output depth for filter ${t.shape[4]}.`);let c={dy:a,filter:t},l={pad:n,strides:o,inputShape:s},m=N.runKernel(fp,c,l);return i?z(m,[m.shape[1],m.shape[2],m.shape[3],m.shape[4]]):m}var gk=T({conv3DBackpropInput_:KU});function jU(r,e,t,o,n){let s=v(r,"x","conv3dTranspose"),a=v(e,"filter","conv3dTranspose");return gk(t,s,a,o,n)}var xk=T({conv3dTranspose_:jU});function XU(r){let t={x:v(r,"x","cos","float32")};return N.runKernel(fn,t)}var yk=T({cos_:XU});function YU(r){let t={x:v(r,"x","cosh","float32")};return N.runKernel(dn,t)}var bk=T({cosh_:YU});function QU(r,e=0,t=!1,o=!1){let s={x:v(r,"x","cumprod")},a={axis:e,exclusive:t,reverse:o};return N.runKernel(hn,s,a)}var Ck=T({cumprod_:QU});function ZU(r,e=0,t=!1,o=!1){let s={x:v(r,"x","cumsum")},a={axis:e,exclusive:t,reverse:o};return N.runKernel(gn,s,a)}var Ik=T({cumsum_:ZU});function JU(r,e,t,o=!1){let n=v(r,"x","denseBincount"),s=v(e,"weights","denseBincount");$(n.dtype==="int32",()=>`Error in denseBincount: input dtype must be int32, but got ${n.dtype}`),$(n.rank<=2,()=>`Error in denseBincount: input must be at most rank 2, but got rank ${n.rank}.`),$(t>=0,()=>`size must be non-negative, but got ${t}.`),$(s.size===n.size||s.size===0,()=>`Error in denseBincount: weights must have the same shape as x or 0-length, but got x shape: ${n.shape}, weights shape: ${s.shape}.`);let a={x:n,weights:s},i={size:t,binaryOutput:o};return N.runKernel(dp,a,i)}var wk=T({denseBincount_:JU});function eG(r,e,t="NHWC"){let o=v(r,"x","depthToSpace","float32"),n=t==="NHWC"?o.shape[1]:o.shape[2],s=t==="NHWC"?o.shape[2]:o.shape[3],a=t==="NHWC"?o.shape[3]:o.shape[1];$(e>1,()=>`blockSize should be > 1 for depthToSpace, but was: ${e}`),$(n*e>=0,()=>`Negative dimension size caused by overflow when multiplying + ${n} and ${e} for depthToSpace with input shape + ${o.shape}`),$(s*e>=0,()=>`Negative dimension size caused by overflow when multiplying + ${s} and ${e} for depthToSpace with input shape + ${o.shape}`),$(a%(e*e)===0,()=>`Dimension size must be evenly divisible by ${e*e} but is ${a} for depthToSpace with input shape ${o.shape}`);let i={x:o},p={blockSize:e,dataFormat:t};return N.runKernel(yn,i,p)}var Sk=T({depthToSpace_:eG});function tG(r,e,t,o,n="NHWC",s=[1,1],a){let i=v(r,"x","depthwiseConv2d","float32"),p=v(e,"filter","depthwiseConv2d","float32"),u=i,c=!1;i.rank===3&&(c=!0,u=z(i,[1,i.shape[0],i.shape[1],i.shape[2]])),$(u.rank===4,()=>`Error in depthwiseConv2d: input must be rank 4, but got rank ${u.rank}.`),$(p.rank===4,()=>`Error in depthwiseConv2d: filter must be rank 4, but got rank ${p.rank}.`);let l=n==="NHWC"?u.shape[3]:u.shape[1];$(l===p.shape[2],()=>`Error in depthwiseConv2d: number of input channels (${l}) must match the inChannels dimension in filter ${p.shape[2]}.`),Ot("depthwiseConv2d",o,a);let m={x:u,filter:p},f={strides:t,pad:o,dataFormat:n,dilations:s,dimRoundingMode:a},d=N.runKernel(bn,m,f);return c?z(d,[d.shape[1],d.shape[2],d.shape[3]]):d}var Gp=T({depthwiseConv2d_:tG});function rG(r){let t={x:v(r,"x","diag")};return N.runKernel(xp,t)}var vk=T({diag_:rG});function oG(r,e,t,o,n=[1,1],s="NHWC"){let a=v(r,"x","dilation2d"),i=v(e,"filter","dilation2d");$(a.rank===3||a.rank===4,()=>`Error in dilation2d: input must be rank 3 or 4, but got rank ${a.rank}.`),$(i.rank===3,()=>`Error in dilation2d: filter must be rank 3, but got rank ${i.rank}.`),$(s==="NHWC",()=>`Error in dilation2d: Only NHWC is currently supported, but got dataFormat of ${s}`);let p=a,u=!1;a.rank===3&&(p=z(a,[1,a.shape[0],a.shape[1],a.shape[2]]),u=!0);let c={x:p,filter:i},l={strides:t,pad:o,dilations:n},m=N.runKernel(yp,c,l);return u?z(m,[m.shape[1],m.shape[2],m.shape[3]]):m}var kk=T({dilation2d_:oG});function nG(r,e){let t=v(r,"a","equal","string_or_numeric"),o=v(e,"b","equal","string_or_numeric");[t,o]=Re(t,o),Je(t.shape,o.shape);let n={a:t,b:o};return N.runKernel(oo,n)}var gf=T({equal_:nG});function sG(r,e,t){let o=v(e,"a","where"),n=v(t,"b","where"),s=v(r,"condition","where","bool"),a=Je(Je(s.shape,o.shape),n.shape),i=Ls(s,a),p=Ls(o,a),u=Ls(n,a),c={condition:i,t:p,e:u};return N.runKernel(vs,c)}var os=T({where_:sG});function aG(r){let t={x:v(r,"x","zerosLike")};return N.runKernel(Es,t)}var Gt=T({zerosLike_:aG});function iG(r,e){let t=v(r,"a","div"),o=v(e,"b","div");[t,o]=Re(t,o);let n=We(t,o),s=Gt(n),a=gf(o,s);return os(a,s,n)}var Tk=T({divNoNan_:iG});function uG(r,e){let t=v(r,"t1","dot"),o=v(e,"t2","dot");$((t.rank===1||t.rank===2)&&(o.rank===1||o.rank===2),()=>`Error in dot: inputs must all be rank 1 or 2, but got ranks ${t.rank} and ${o.rank}.`);let n=t.rank===1?t.size:t.shape[1],s=o.rank===1?o.size:o.shape[0];if($(n===s,()=>`Error in dot: inner dimensions of inputs must match, but got ${n} and ${s}.`),t.rank===1&&o.rank===1){let a=z(t,[1,-1]),i=z(o,[-1,1]),p=Xe(a,i);return z(p,[])}else if(t.rank===1&&o.rank===2){let a=z(t,[1,-1]),i=z(o,[o.shape[0],o.shape[1]]),p=Xe(a,i);return z(p,[p.size])}else if(t.rank===2&&o.rank===1){let a=z(o,[-1,1]),i=Xe(t,a);return z(i,[i.size])}else{let a=z(o,[o.shape[0],o.shape[1]]);return Xe(t,a)}}var Nk=T({dot_:uG});function pG(r,...e){let t=e.map((n,s)=>v(n,`tensors${s}`,"einsum")),o={equation:r};return N.runKernel(Xa,t,o)}var _k=T({einsum_:pG});function cG(r){let t={x:v(r,"x","elu","float32")};return N.runKernel(In,t)}var xf=T({elu_:cG});function lG(r){let e=v(r,"x","erf");$(e.dtype==="int32"||e.dtype==="float32",()=>"Input dtype must be `int32` or `float32`."),e.dtype==="int32"&&(e=qe(e,"float32"));let t={x:e};return N.runKernel(Gi,t)}var Ek=T({erf_:lG});function fC(r,e){for(let t=0;tr[s]);return[t,n]}function Ta(r,e){let t=e.map(o=>1);return $k(r,t,e)}function fG(r,e,t){$(fC(e,t),()=>`${r} supports only inner-most axes for now. Got axes ${e} and rank-${t} input.`)}function dG(r,e){if(fC(r,e))return null;let t=[];for(let o=0;ot.push(o)),t}function hG(r){return r.map((e,t)=>[t,e]).sort((e,t)=>e[1]-t[1]).map(e=>e[0])}function gG(r,e){let t=[];for(let o=e-r;o"Axis must be <= rank of the tensor");let o={input:t},n={dim:e};return N.runKernel(xs,o,n)}var _a=T({expandDims_:NG});function _G(r){let t={x:v(r,"x","expm1")};return N.runKernel(wn,t)}var Fk=T({expm1_:_G});function EG(r,e){let t=v(r,"x","tile","string_or_numeric");$(t.rank===e.length,()=>`Error in transpose: rank of input ${t.rank} must match length of reps ${e}.`);let o={x:t},n={reps:e};return N.runKernel(wo,o,n)}var fi=T({tile_:EG});function $G(r,e,t,o="float32"){e==null&&(e=r);let n=ne([r,e],o),s=r<=e?r:e;for(let i=0;i`Error in localResponseNormalization: x must be rank 3 or 4 but got + rank ${s.rank}.`),$(ra(e),()=>`Error in localResponseNormalization: depthRadius must be an integer but got depthRadius ${e}.`);let a=s,i=!1;s.rank===3&&(i=!0,a=z(s,[1,s.shape[0],s.shape[1],s.shape[2]]));let p={x:a},u={depthRadius:e,bias:t,alpha:o,beta:n},c=N.runKernel(wp,p,u);return i?z(c,[c.shape[1],c.shape[2],c.shape[3]]):c}var Bk=T({localResponseNormalization_:zG});function WG(r){let t={x:v(r,"x","log","float32")};return N.runKernel(lo,t)}var Ea=T({log_:WG});function UG(r){let t={x:v(r,"x","log1p")};return N.runKernel(Ki,t)}var Sf=T({log1p_:UG});function GG(r){return $(fs(r),()=>"The f passed in grad(f) must be a function"),(e,t)=>{let o=v(e,"x","tf.grad","string_or_numeric"),n=t!=null?v(t,"dy","tf.grad"):null;return N.tidy(()=>{let{value:s,grads:a}=N.gradients(()=>r(o),[o],n);return n!=null&&ht(s.shape,n.shape,"The shape of dy passed in grad(f)(x, dy) must match the shape returned by f(x)"),vf(a),a[0]})}}function HG(r){return $(fs(r),()=>"The f passed in grads(f) must be a function"),(e,t)=>{$(Array.isArray(e),()=>"The args passed in grads(f)(args) must be an array of `Tensor`s or `TensorLike`s");let o=Ia(e,"args","tf.grads","string_or_numeric"),n=t!=null?v(t,"dy","tf.grads"):null;return N.tidy(()=>{let{value:s,grads:a}=N.gradients(()=>r(...o),o,n);return n!=null&&ht(s.shape,n.shape,"The shape of dy passed in grads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),vf(a),a})}}function qG(r){return $(fs(r),()=>"The f passed in valueAndGrad(f) must be a function"),(e,t)=>{$(e instanceof ut,()=>"The x passed in valueAndGrad(f)(x) must be a tensor"),$(t==null||t instanceof ut,()=>"The dy passed in valueAndGrad(f)(x, dy) must be a tensor");let{grads:o,value:n}=N.gradients(()=>r(e),[e],t);return vf(o),{grad:o[0],value:n}}}function KG(r){return $(fs(r),()=>"The f passed in valueAndGrads(f) must be a function"),(e,t)=>{$(Array.isArray(e)&&e.every(n=>n instanceof ut),()=>"The args passed in valueAndGrads(f)(args) must be array of tensors"),$(t==null||t instanceof ut,()=>"The dy passed in valueAndGrads(f)(args, dy) must be a tensor");let o=N.gradients(()=>r(...e),e,t);return t!=null&&ht(o.value.shape,t.shape,"The shape of dy passed in valueAndGrads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),vf(o.grads),o}}function dC(r,e){$(fs(r),()=>"The f passed in variableGrads(f) must be a function"),$(e==null||Array.isArray(e)&&e.every(u=>u instanceof ba),()=>"The varList passed in variableGrads(f, varList) must be an array of variables");let t=e!=null;if(!t){e=[];for(let u in N.registeredVariables)e.push(N.registeredVariables[u])}let o=t?e.filter(u=>!u.trainable):null,n=e.length;e=e.filter(u=>u.trainable),$(e.length>0,()=>`variableGrads() expects at least one of the input variables to be trainable, but none of the ${n} variables is trainable.`);let s=!0,{value:a,grads:i}=N.gradients(r,e,null,s);$(i.some(u=>u!=null),()=>"Cannot find a connection between any variable and the result of the loss function y=f(x). Please make sure the operations that use variables are inside the function f passed to minimize()."),$(a.rank===0,()=>`The f passed in variableGrads(f) must return a scalar, but it returned a rank-${a.rank} tensor`);let p={};return e.forEach((u,c)=>{i[c]!=null&&(p[u.name]=i[c])}),o!=null&&o.forEach(u=>p[u.name]=null),{value:a,grads:p}}function Cr(r){return N.customGrad(r)}function vf(r){if(r.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 jG(r){let t={x:v(r,"x","softplus")};return N.runKernel(Qi,t)}var kf=T({softplus_:jG});function XG(r){let e=v(r,"x","logSigmoid");return Cr(o=>({value:yr(kf(yr(o))),gradFunc:a=>oe(a,Ms(yr(o)))}))(e)}var Vk=T({logSigmoid_:XG});function YG(r,e){let t=v(r,"a","sub"),o=v(e,"b","sub");[t,o]=Re(t,o);let n={a:t,b:o};return N.runKernel(Io,n)}var ke=T({sub_:YG});function QG(r,e=-1){let t=v(r,"logits","logSoftmax");if(e===-1&&(e=t.rank-1),e!==t.rank-1)throw Error(`Log Softmax along a non-last dimension is not yet supported. Logits was rank ${t.rank} and axis was ${e}`);return Cr((n,s)=>{let i=Vs(n,e,!0),p=ke(n,i),u=ke(qe(p,"float32"),Ea(tt(Bo(p),e,!0)));return s([u]),{value:u,gradFunc:(l,m)=>{let[f]=m,d=!0,h=Bo(f);return ke(l,oe(tt(l,e,d),h))}}})(t)}var zk=T({logSoftmax_:QG});function ZG(r,e=null,t=!1){let o=v(r,"x","logSumExp"),n=Ka(e,o.shape),s=Vs(o,n,!0),a=ke(o,s),i=Bo(a),p=tt(i,n),u=Ea(p),c=ge(z(s,u.shape),u);if(t){let l=Ta(c.shape,n);return z(c,l)}return c}var Tf=T({logSumExp_:ZG});function JG(r,e){let t=v(r,"a","logicalAnd","bool"),o=v(e,"b","logicalAnd","bool");Je(t.shape,o.shape);let n={a:t,b:o};return N.runKernel(_n,n)}var lu=T({logicalAnd_:JG});function e4(r){let t={x:v(r,"x","logicalNot","bool")};return N.runKernel(En,t)}var Nf=T({logicalNot_:e4});function t4(r,e){let t=v(r,"a","logicalOr","bool"),o=v(e,"b","logicalOr","bool");Je(t.shape,o.shape);let n={a:t,b:o};return N.runKernel(ua,n)}var _f=T({logicalOr_:t4});function r4(r,e){let t=v(r,"a","logicalXor","bool"),o=v(e,"b","logicalXor","bool");return Je(t.shape,o.shape),lu(_f(r,e),Nf(lu(r,e)))}var Wk=T({logicalXor_:r4});var Ef=2147483648;function o4(r,e,t="left"){let o=v(r,"sortedSequence","searchSorted"),n=v(e,"values","searchSorted"),s=o.shape[o.shape.length-1],a=n.shape[n.shape.length-1],i=z(o,[-1,s]),p=z(n,[-1,a]);if(i.rank<2)throw new Error("Sorted input argument must be at least 2-dimensional");if(i.shape[0]!==p.shape[0])throw new Error("Leading dimension of 'sortedSequence' and 'values' must match.");if(Ve(p.shape)>=Ef)throw new Error(`values tensor size must less than ${Ef}`);if(i.shape[1]>=Ef)throw new Error(`trailing dim_size must less than ${Ef} for int32 output type, was ${i.shape[1]}`);let u={sortedSequence:i,values:p},c={side:t};return N.runKernel(Ep,u,c)}var dl=T({searchSorted_:o4});function Uk(r,e){return dl(r,e,"left")}function n4(r,e,t,o,n){let s=v(r,"x","maxPool"),a=1,i=s,p=!1;s.rank===3&&(p=!0,i=z(s,[1,s.shape[0],s.shape[1],s.shape[2]])),$(i.rank===4,()=>`Error in maxPool: input must be rank 4 but got rank ${i.rank}.`),$(lr(t,a),()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${t} and dilations '${a}'`),Ot("maxPool",o,n);let u={x:i},c={filterSize:e,strides:t,pad:o,dimRoundingMode:n},l=N.runKernel(Rn,u,c);return p?z(l,[l.shape[1],l.shape[2],l.shape[3]]):l}var $f=T({maxPool_:n4});function s4(r,e=[1,1,1],t,o,n,s="NDHWC"){let a=v(r,"x","maxPool3d"),i=a,p=!1;a.rank===4&&(p=!0,i=z(a,[1,a.shape[0],a.shape[1],a.shape[2],a.shape[3]])),$(i.rank===5,()=>`Error in maxPool3d: x must be rank 5 but got rank ${i.rank}.`),$(s==="NDHWC",()=>`Error in maxPool3d: Only NDHWC is currently supported, but got dataFormat of ${s}`),Ot("maxPool3d",o,n);let u={x:i},c={filterSize:e,strides:t,pad:o,dimRoundingMode:n,dataFormat:s},l=N.runKernel(Sp,u,c);return p?z(l,[l.shape[1],l.shape[2],l.shape[3],l.shape[4]]):l}var Gk=T({maxPool3d_:s4});function a4(r,e,t,o,n=!1){let a={x:v(r,"x","maxPoolWithArgmax")},i={filterSize:e,strides:t,pad:o,includeBatchInIndex:n},p=N.runKernel(vp,a,i);return{result:p[0],indexes:p[1]}}var Hk=T({maxPoolWithArgmax_:a4});function i4(r,e){let t=v(r,"a","maximum"),o=v(e,"b","maximum");[t,o]=Re(t,o),t.dtype==="bool"&&(t=qe(t,"int32"),o=qe(o,"int32")),Je(t.shape,o.shape);let n={a:t,b:o};return N.runKernel(mo,n)}var Rf=T({maximum_:i4});function u4(r,e=null,t=!1){let n={x:v(r,"x","mean")},s={axis:e,keepDims:t};return N.runKernel(An,n,s)}var mu=T({mean_:u4});function Wr(r,e="float32"){if(e==="complex64"){let o=Wr(r,"float32"),n=Wr(r,"float32");return Er(o,n)}let t=ap(Ve(r),e);return N.makeTensor(t,r,e)}function zs(r,e="float32"){if(e==="complex64"){let o=zs(r,"float32"),n=Wr(r,"float32");return Er(o,n)}let t=jc(Ve(r),e);return N.makeTensor(t,r,e)}function qk(r,e,{indexing:t="xy"}={}){if(t!=="xy"&&t!=="ij")throw new TypeError(`${t} is not a valid third argument to meshgrid`);if(r===void 0)return[];let o=v(r,"x","meshgrid",r instanceof ut?r.dtype:"float32");if(e===void 0)return[o];let n=v(e,"y","meshgrid",e instanceof ut?e.dtype:"float32"),s=Ve(o.shape),a=Ve(n.shape);return t==="xy"?(o=z(o,[1,-1]),n=z(n,[-1,1]),[Xe(zs([a,1],o.dtype),o),Xe(n,zs([1,s],n.dtype))]):(o=z(o,[-1,1]),n=z(n,[1,-1]),[Xe(o,zs([1,a],o.dtype)),Xe(zs([s,1],n.dtype),n)])}function p4(r,e){let t=v(r,"a","minimum"),o=v(e,"b","minimum");[t,o]=Re(t,o),t.dtype==="bool"&&(t=qe(t,"int32"),o=qe(o,"int32")),Je(t.shape,o.shape);let n={a:t,b:o};return N.runKernel(fo,n)}var Af=T({minimum_:p4});function c4(r,e,t){$(t==="reflect"||t==="symmetric",()=>`Invalid mode. Mode must be either reflect or symmetric. Got ${t}.`);let o=v(r,"x","mirrorPad");if(o.rank===0)throw new Error("mirrorPad(scalar) is not defined. Pass non-scalar to mirrorPad");$(e.length===o.rank,()=>`Padding doesn't match input. Must be ${o.rank}. Got ${e.length}.`);let n=t==="reflect"?1:0;for(let i=0;i"Invalid number of paddings. Must be length of 2 each."),$(e[i][0]>=0&&e[i][0]<=o.shape[i]-n&&e[i][1]>=0&&e[i][1]<=o.shape[i]-n,()=>`Padding in dimension ${i} cannot be greater than or equal to ${o.shape[i]-n} or less than 0 for input of shape ${o.shape}`);let s={paddings:e,mode:t},a={x:o};return N.runKernel(Dn,a,s)}var Kk=T({mirrorPad_:c4});function l4(r,e){let t=v(r,"a","mod"),o=v(e,"b","mod");[t,o]=Re(t,o);let n={a:t,b:o};return N.runKernel(ji,n)}var jk=T({mod_:l4});function m4(r,e=null,t=!1){r=v(r,"x","moments");let o=Ka(e,r.shape),n=mu(r,o,t),s=n.shape;t||(s=Ta(n.shape,o));let a=Zt(ke(qe(r,"float32"),z(n,s))),i=mu(a,o,t);return{mean:n,variance:i}}var Xk=T({moments_:m4});function f4(r,e,t,o){let n=v(e,"data","multiRNNCell"),s=Ia(t,"c","multiRNNCell"),a=Ia(o,"h","multiRNNCell"),i=n,p=[];for(let l=0;l2)throw new Error(`Rank of probabilities must be 1 or 2, but is ${a}`);t=t||Math.random();let p={logits:a===1?z(n,[1,-1]):n},u={numSamples:e,seed:t,normalized:o},c=N.runKernel(kp,p,u);return a===1?z(c,[c.size]):c}var Qk=T({multinomial_:d4});function h4(r,e){let t=v(r,"a","notEqual","string_or_numeric"),o=v(e,"b","notEqual","string_or_numeric");[t,o]=Re(t,o),Je(t.shape,o.shape);let n={a:t,b:o};return N.runKernel(go,n)}var Ff=T({notEqual_:h4});function g4(r){let t={x:v(r,"x","onesLike")};return N.runKernel(Cs,t)}var Zk=T({onesLike_:g4});function x4(r,e){let t=v(r,"v1","outerProduct"),o=v(e,"v2","outerProduct");$(t.rank===1&&o.rank===1,()=>`Error in outerProduct: inputs must be rank 1, but got ranks ${t.rank} and ${o.rank}.`);let n=z(t,[-1,1]),s=z(o,[1,-1]);return Xe(n,s)}var Jk=T({outerProduct_:x4});function y4(r,e,t=0){let o=v(r,"x","pad");if(o.rank===0)throw new Error("pad(scalar) is not defined. Pass non-scalar to pad");let n={paddings:e,constantValue:t},s={x:o};return N.runKernel(Ln,s,n)}var Ws=T({pad_:y4});function b4(r,e,t=0){return $(e.length===2,()=>"Invalid number of paddings. Must be length of 2."),Ws(r,[e],t)}var e1=T({pad1d_:b4});function C4(r,e,t=0){return $(e.length===2&&e[0].length===2&&e[1].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),Ws(r,e,t)}var t1=T({pad2d_:C4});function I4(r,e,t=0){return $(e.length===3&&e[0].length===2&&e[1].length===2&&e[2].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),Ws(r,e,t)}var r1=T({pad3d_:I4});function w4(r,e,t=0){return $(e.length===4&&e[0].length===2&&e[1].length===2&&e[2].length===2&&e[3].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),Ws(r,e,t)}var o1=T({pad4d_:w4});function S4(r,e,t){let o=v(r,"x","spaceToBatchND");$(o.rank>=1+e.length,()=>`input rank ${o.rank} should be > than [blockShape] ${e.length}`),$(t.length===e.length,()=>`paddings.shape[0] ${t.length} must be equal to [blockShape] ${e.length}`),$(o.shape.reduce((a,i,p)=>p>0&&p<=e.length?a&&(i+t[p-1][0]+t[p-1][1])%e[p-1]===0:a,!0),()=>`input spatial dimensions ${o.shape.slice(1)} with paddings ${t.toString()} must be divisible by blockShapes ${e.toString()}`);let n={x:o},s={blockShape:e,paddings:t};return N.runKernel(ks,n,s)}var Df=T({spaceToBatchND_:S4});function v4(r,e,t,o,n,s,a){n==null&&(n=[1,1]),s==null&&(s=1),o===0&&(o="valid");let i=v(r,"x","maxPool"),p=i,u=!1;i.rank===3&&(u=!0,p=z(i,[1,i.shape[0],i.shape[1],i.shape[2]])),$(lr(s,n),()=>`Error in pool: Either strides or dilations must be 1. Got strides ${s} and dilations '${n}'`);let c=lC(p.shape,e,s,n,o),l=[c.dilationHeight,c.dilationWidth],m;o==="same"?m=T4([c.filterHeight,c.filterWidth],l):m=[[0,0],[0,0]];let f=l[0]===1&&l[1]===1,[d,h]=k4([c.inHeight,c.inWidth],l,m),g=f?o:"valid",y=f?p:Df(p,l,d),C=(t==="avg"?()=>mf(y,e,s,g,a):()=>$f(y,e,s,g,a))(),w=f?C:ff(C,l,h);return u?z(w,[w.shape[1],w.shape[2],w.shape[3]]):w}function k4(r,e,t){let o=t.map(c=>c[0]),n=t.map(c=>c[1]),s=r.concat(o,n),a=e.map((c,l)=>(c-s[l]%c)%c),i=n.map((c,l)=>c+a[l]),p=e.map((c,l)=>[o[l],i[l]]),u=e.map((c,l)=>[0,a[l]]);return[p,u]}function T4(r,e){let o=r.map((a,i)=>a+(a-1)*(e[i]-1)).map(a=>a-1),n=o.map(a=>Math.floor(a/2)),s=o.map((a,i)=>a-n[i]);return o.map((a,i)=>[n[i],s[i]])}var n1=T({pool_:v4});function N4(r,e){let t=v(r,"x","prelu"),o=v(e,"alpha","prelu"),n={x:t,alpha:o};return N.runKernel(Vn,n)}var Pf=T({prelu_:N4});function _4(r,e=null,t=!1){let o=v(r,"x","prod");o.dtype==="bool"&&(o=qe(o,"int32"));let n={x:o},s={axis:e,keepDims:t};return N.runKernel(Ao,n,s)}var s1=T({prod_:_4});function E4(r,e,t,o){let n=r.map((c,l)=>v(c,`tensors${l}`,"raggedGather","int32")),s=v(e,"paramsDenseValues","raggedGather"),a=v(t,"indices","raggedGather","int32"),i={paramsNestedSplits:n,paramsDenseValues:s,indices:a},p={outputRaggedRank:o},u=N.runKernel(Tp,i,p);return{outputNestedSplits:u.slice(0,u.length-1),outputDenseValues:u[u.length-1]}}var a1=T({raggedGather_:E4});function $4(r,e,t){let o=v(r,"starts","raggedRange"),n=v(e,"limits","raggedRange",o.dtype),s=v(t,"deltas","raggedRange",o.dtype),a={starts:o,limits:n,deltas:s},i=N.runKernel(Np,a);return{rtNestedSplits:i[0],rtDenseValues:i[1]}}var i1=T({raggedRange_:$4});function R4(r,e,t,o,n){let s=v(r,"shape","raggedTensorToTensor","int32"),a=v(e,"values","raggedTensorToTensor"),i=v(t,"defaultValue","raggedTensorToTensor",a.dtype),p=o.map((l,m)=>v(l,`tensors${m}`,"raggedTensorToTensor","int32")),u={shape:s,values:a,defaultValue:i,rowPartitionTensors:p},c={rowPartitionTypes:n};return N.runKernel(_p,u,c)}var u1=T({raggedTensorToTensor_:R4});function A4(r,e,t){let o=Ve(r),n=null;if(t==null||t==="float32")n=new Float32Array(o);else if(t==="int32")n=new Int32Array(o);else if(t==="bool")n=new Uint8Array(o);else throw new Error(`Unknown data type ${t}`);for(let s=0;s=1||a===0);let i=Math.sqrt(-2*Math.log(a)/a);e=this.mean+this.stdDev*n*i,t=this.mean+this.stdDev*s*i,(!this.truncated||this.isValidTruncated(e))&&(o=!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}},Mf=class{constructor(e,t,o,n){this.alpha=e,this.beta=1/t,this.dtype=o;let s=n||Math.random();this.randu=Bf.alea(s.toString()),this.randn=new du(0,1,o,!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,o,n,s,a;for(;;){do n=this.randn.nextValue(),a=1+this.c*n;while(a<=0);if(a*=a*a,e=n*n,t=1-.331*e*e,o=.5*e+this.d*(1-a+Math.log(a)),s=this.randu(),sthis.dtype==null||this.dtype==="float32",this.min=e,this.range=t-e,this.dtype=o,n==null&&(n=Math.random()),typeof n=="number"&&(n=n.toString()),!this.canReturnFloat()&&this.range<=1)throw new Error(`The difference between ${e} - ${t} <= 1 and dtype is not float`);this.random=Bf.alea(n)}convertValue(e){return this.canReturnFloat()?e:Math.round(e)}nextValue(){return this.convertValue(this.min+this.range*this.random())}};function B4(r,e,t=1,o="float32",n){if(t==null&&(t=1),o==null&&(o="float32"),o!=="float32"&&o!=="int32")throw new Error(`Unsupported data type ${o}`);let s=new Mf(e,t,o,n),a=ne(r,o);for(let i=0;i`Error in reverse1D: x must be rank 1 but got rank ${e.rank}.`),vo(e,0)}var E1=T({reverse1d_:K4});function j4(r,e){let t=v(r,"x","reverse");return $(t.rank===2,()=>`Error in reverse2D: x must be rank 2 but got rank ${t.rank}.`),vo(t,e)}var $1=T({reverse2d_:j4});function X4(r,e){let t=v(r,"x","reverse");return $(t.rank===3,()=>`Error in reverse3D: x must be rank 3 but got rank ${t.rank}.`),vo(t,e)}var R1=T({reverse3d_:X4});function Y4(r,e){let t=v(r,"x","reverse");return $(t.rank===4,()=>`Error in reverse4D: x must be rank 4 but got rank ${t.rank}.`),vo(t,e)}var A1=T({reverse4d_:Y4});function Q4(r){let t={x:v(r,"x","round")};return N.runKernel(da,t)}var Uf=T({round_:Q4});function Z4(r){let t={x:v(r,"x","rsqrt","float32")};return N.runKernel(xo,t)}var F1=T({rsqrt_:Z4});function J4(r){let t={x:v(r,"x","selu")};return N.runKernel(Xi,t)}var D1=T({selu_:J4});function eH(r,e,t,o,n,s=[1,1],a="NHWC"){let i=v(r,"x","separableConv2d"),p=v(e,"depthwiseFilter","separableConv2d"),u=v(t,"pointwiseFilter","separableConv2d"),c=i,l=!1;if(i.rank===3&&(l=!0,c=z(i,[1,i.shape[0],i.shape[1],i.shape[2]])),a==="NCHW")throw new Error("separableConv2d currently does not support dataFormat NCHW; only NHWC is supported");$(c.rank===4,()=>`Error in separableConv2d: input must be rank 4, but got rank ${c.rank}.`),$(p.rank===4,()=>`Error in separableConv2d: depthwise filter must be rank 4, but got rank ${p.rank}.`),$(u.rank===4,()=>`Error in separableConv2d: pointwise filter must be rank 4, but got rank ${p.rank}.`),$(u.shape[0]===1,()=>`Error in separableConv2d: the first dimension of pointwise filter must be 1, but got ${u.shape[0]}.`),$(u.shape[1]===1,()=>`Error in separableConv2d: the second dimension of pointwise filter must be 1, but got ${u.shape[1]}.`);let m=p.shape[2],f=p.shape[3];$(u.shape[2]===m*f,()=>`Error in separableConv2d: the third dimension of pointwise filter must be ${m*f}, but got ${u.shape[2]}.`);let d=Gp(c,p,o,n,a,s),g=mi(d,u,1,"valid",a);return l?z(g,[g.shape[1],g.shape[2],g.shape[3]]):g}var P1=T({separableConv2d_:eH});async function tH(r,e){let t=v(r,"x","setdiff1d"),o=v(e,"y","setdiff1d");$(t.dtype===o.dtype,()=>`x and y should have the same dtype, but got x (${t.dtype}) and y (${o.dtype}).`),$(t.rank===1,()=>`x should be 1D tensor, but got x (${t.shape}).`),$(o.rank===1,()=>`y should be 1D tensor, but got y (${o.shape}).`);let n=await t.data(),s=await o.data(),a=new Set(s),i=0;for(let c=0;c`slice1d expects a rank-1 tensor, but got a rank-${o.rank} tensor`),Ue(o,[e],[t])}var V1=T({slice1d_:sH});function aH(r,e,t){let o=v(r,"x","slice2d");return $(o.rank===2,()=>`slice2d expects a rank-2 tensor, but got a rank-${o.rank} tensor`),Ue(o,e,t)}var z1=T({slice2d_:aH});function iH(r,e,t){let o=v(r,"x","slice3d");return $(o.rank===3,()=>`slice3d expects a rank-3 tensor, but got a rank-${o.rank} tensor`),Ue(o,e,t)}var W1=T({slice3d_:iH});function uH(r,e,t){let o=v(r,"x","slice4d");return $(o.rank===4,()=>`slice4d expects a rank-4 tensor, but got a rank-${o.rank} tensor`),Ue(o,e,t)}var U1=T({slice4d_:uH});function pH(r,e=-1){let t=v(r,"logits","softmax","float32");if(e===-1&&(e=t.rank-1),e!==t.rank-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${t.rank} and dim was ${e}`);let o={logits:t},n={dim:e};return N.runKernel(Xn,o,n)}var G1=T({softmax_:pH});function cH(r){$(r.dtype==="complex64",()=>`The dtype for tf.spectral.fft() must be complex64 but got ${r.dtype}.`);let e={input:r};return N.runKernel(bp,e)}var qp=T({fft_:cH});function lH(r){$(r.dtype==="complex64",()=>`The dtype for tf.spectral.ifft() must be complex64 but got ${r.dtype}.`);let e={input:r};return N.runKernel(Cp,e)}var hu=T({ifft_:lH});function mH(r){let e=r.shape[r.shape.length-1],t=r.size/e,o;if(e<=2){let n=z(r,[t,e]);o=hu(n)}else{let n=[t,2*(e-1)],s=z(ka(r),[t,e]),a=z(ci(r),[t,e]),i=vo(Ue(s,[0,1],[t,e-2]),1),p=oe(vo(Ue(a,[0,1],[t,e-2]),1),be(-1)),u=gt([s,i],1),c=gt([a,p],1),l=z(Er(u,c),[n[0],n[1]]);o=hu(l)}if(o=ka(o),r.rank===3&&r.shape[0]!==0){let n=o,s=r.shape[0];o=z(o,[s,o.shape[0]/s,o.shape[1]]),n.dispose()}return o}var Gf=T({irfft_:mH});function fH(r,e,t=0){let n={x:v(r,"x","split")},s={numOrSizeSplits:e,axis:t};return N.runKernel(Ts,n,s)}var $a=T({split_:fH});function dH(r,e){$(r.dtype==="float32",()=>`The dtype for rfft() must be real value but got ${r.dtype}`);let t=r.shape[r.shape.length-1],o=r.size/t,n;if(e!=null&&e0),h=r.shape.map(g=>g);h[r.shape.length-1]=e,n=Ue(r,d,h),t=e}else if(e!=null&&e>t){let d=r.shape.map(h=>h);d[r.shape.length-1]=e-t,n=gt([r,Wr(d)],r.shape.length-1),t=e}else n=r;let s=Gt(n),a=z(Er(n,s),[o,t]),i=qp(a),p=Math.floor(t/2)+1,u=ka(i),c=ci(i),l=$a(u,[p,t-p],u.shape.length-1),m=$a(c,[p,t-p],c.shape.length-1),f=n.shape.slice();return f[n.shape.length-1]=p,z(Er(l[0],m[0]),f)}var Kp=T({rfft_:dH});function hH(r,e){let t=v(r,"a","squaredDifference"),o=v(e,"b","squaredDifference");[t,o]=Re(t,o),Je(t.shape,o.shape);let n={a:t,b:o},s={};return N.runKernel(Co,n,s)}var Hf=T({squaredDifference_:hH});function gH(r,e){let t=v(r,"x","squeeze","string_or_numeric");return z(t,db(t.shape,e).newShape)}var jp=T({squeeze_:gH});function xH(r,e=0){let t=Ia(r,"tensors","stack","string_or_numeric");$(t.length>=1,()=>"Pass at least one tensor to tf.stack"),t.length>0&&$(e<=t[0].rank,()=>"Axis must be <= rank of the tensor");let o=t,n={axis:e};return N.runKernel(Is,o,n)}var Ir=T({stack_:xH});function yH(r,e=0){let o={x:v(r,"x","step")},n={alpha:e};return N.runKernel($s,o,n)}var qf=T({step_:yH});function bH(r,e,t,o,n=0,s=0,a=0,i=0,p=0){let c={x:v(r,"x","stridedSlice","string_or_numeric")},l={begin:e,end:t,strides:o,beginMask:n,endMask:s,ellipsisMask:a,newAxisMask:i,shrinkAxisMask:p};return N.runKernel(Yn,c,l)}var H1=T({stridedSlice_:bH});function CH(r){let t={x:v(r,"x","tan","float32")};return N.runKernel(xa,t)}var q1=T({tan_:CH});function mr(r,e){eo(r);let t=or(r,e);if(t.length!==1)throw new Error("tensor1d() requires values to be a flat/TypedArray");return xr(r,null,t,e)}function gi(r,e,t){if(eo(r),e!=null&&e.length!==2)throw new Error("tensor2d() requires shape to have two numbers");let o=or(r,t);if(o.length!==2&&o.length!==1)throw new Error("tensor2d() requires values to be number[][] or flat/TypedArray");if(o.length===1&&e==null)throw new Error("tensor2d() requires shape to be provided when `values` are a flat/TypedArray");return xr(r,e,o,t)}function K1(r,e,t){if(eo(r),e!=null&&e.length!==4)throw new Error("tensor4d() requires shape to have four numbers");let o=or(r,t);if(o.length!==4&&o.length!==1)throw new Error("tensor4d() requires values to be number[][][][] or flat/TypedArray");if(o.length===1&&e==null)throw new Error("tensor4d() requires shape to be provided when `values` are a flat array");return xr(r,e,o,t)}function j1(r,e,t){if(eo(r),e!=null&&e.length!==5)throw new Error("tensor5d() requires shape to have five numbers");let o=or(r,t);if(o.length!==5&&o.length!==1)throw new Error("tensor5d() requires values to be number[][][][][] or flat/TypedArray");if(o.length===1&&e==null)throw new Error("tensor5d() requires shape to be provided when `values` are a flat array");return xr(r,e,o,t)}function X1(r,e,t){if(eo(r),e!=null&&e.length!==6)throw new Error("tensor6d() requires shape to have six numbers");let o=or(r,t);if(o.length!==6&&o.length!==1)throw new Error("tensor6d() requires values to be number[][][][][][] or flat/TypedArray");if(o.length===1&&e==null)throw new Error("tensor6d() requires shape to be provided when `values` are a flat array");return e=e||o,xr(r,e,o,t)}function IH(r,e=1,t=!0){let o=v(r,"x","topk");if(o.rank===0)throw new Error("topk() expects the input to be of rank 1 or higher");let n=o.shape[o.shape.length-1];if(e<0)throw new Error(`'k' passed to topk() must be >= 0 but got ${e}`);if(e>n)throw new Error(`'k' passed to topk() must be <= the last dimension (${n}) but got ${e}`);let s={x:o},a={k:e,sorted:t},[i,p]=N.runKernel(Zn,s,a);return{values:i,indices:p}}var Y1=T({topk_:IH});function wH(r,e=0,t=1,o,n){if(o!=null&&o==="bool")throw new Error("Unsupported data type $ { dtype }");let s=new du(e,t,o,!0,n),a=ne(r,o);for(let i=0;i0,()=>"The input tensor must be at least 1D");let o={x:t},n={axis:e},[s,a]=N.runKernel($p,o,n);return{values:s,indices:a}}var Z1=T({unique_:SH});function vH(r,e,t){let o=v(r,"x","unsortedSegmentSum"),n=v(e,"segmentIds","unsortedSegmentSum","int32");$(ra(t),()=>"numSegments must be of dtype int");let s={x:o,segmentIds:n},a={numSegments:t};return N.runKernel(Rp,s,a)}var J1=T({unsortedSegmentSum_:vH});function kH(r,e=0){let t=v(r,"x","unstack","string_or_numeric");$(e>=-t.shape.length&&e`Axis = ${e} is not in [-${t.shape.length}, ${t.shape.length})`);let o={value:t},n={axis:e};return N.runKernel(_s,o,n)}var ko=T({unstack_:kH});function eT(r,e){return dl(r,e,"right")}function tT(r,e=!0,t,o){return N.makeVariable(r,e,t,o)}function Kf(r,e){let t=[];for(let s=0;s0,()=>"mask cannot be scalar"),ht(i.slice(s,s+a),n.shape,"mask's shape must match the first K dimensions of tensor's shape,");let p=1;for(let h=s;h"Shape mismatch in v and x");let p=be(1),u=ke(p,i),c=oe(ke(a,s),u);if(n){$(o!=null,()=>"When using zeroDebias: true, step is required.");let l=v(o,"step","movingAverage");c=We(c,ke(p,Na(i,l)))}return ge(s,c)}var $H=T({movingAverage_:EH});function RH(r,e,t){let o=v(r,"indices","scatterND","int32"),n=v(e,"updates","scatterND");uf(n,o,t);let s={indices:o,updates:n},a={shape:t};return N.runKernel(Hn,s,a)}var AH=T({scatterND_:RH});function rT(r,e,t,o){if(r.dtype!=="int32")throw new Error(`tf.sparseToDense() expects the indices to be int32 type, but the dtype was ${r.dtype}.`);if(r.rank>2)throw new Error(`sparseIndices should be a scalar, vector, or matrix, but got shape ${r.shape}.`);let n=r.rank>0?r.shape[0]:1,s=r.rank>1?r.shape[1]:1;if(t.length!==s)throw new Error(`outputShape has incorrect number of elements:, ${t.length}, should be: ${s}.`);let a=e.size;if(!(e.rank===0||e.rank===1&&a===n))throw new Error(`sparseValues has incorrect shape ${e.shape}, should be [] or [${n}]`);if(e.dtype!==o.dtype)throw new Error("sparseValues.dtype must match defaultValues.dtype")}function DH(r,e,t,o=0){let n=v(r,"sparseIndices","sparseToDense","int32"),s=v(e,"sparseValues","sparseToDense","string_or_numeric"),a=v(o,"defaultValue","sparseToDense",s.dtype);rT(n,s,t,a);let i={sparseIndices:n,sparseValues:s,defaultValue:a},p={outputShape:t};return N.runKernel(ei,i,p)}var PH=T({sparseToDense_:DH});function OH(r,e){let t=v(e,"indices","gatherND","int32"),n={params:v(r,"x","gatherND","string_or_numeric"),indices:t};return N.runKernel(Tn,n)}var MH=T({gatherND_:OH});function oT(r,e){if(e==null)return r.shape.slice();if(Or(r.shape,e))return e;if(r.shape.length===e.length){let t=[];for(let o=0;o`x has to be a floating point tensor since it's going to be scaled, but got a ${n.dtype} tensor instead.`),$(e>=0&&e<1,()=>`rate must be a float in the range [0, 1), but got ${e}.`),e===0)return r instanceof ut?n.clone():n;let s=oT(n,t),a=1-e,i=We(bf(ge(zf(s,0,1,"float32",o),a)),a);return oe(n,i)}var BH=T({dropout_:LH});function wC(r){return Math.floor(Math.pow(2,Math.ceil(Math.log(r)/Math.log(2))))}function hl(r,e,t){let o=1-r%2,n=new Float32Array(r);for(let s=0;s1,()=>`inTopK() expects the predictions to be of rank 2 or higher, but got ${o.rank}`),$(o.rank-1===n.rank,()=>`predictions rank should be 1 larger than targets rank, but got predictions rank ${o.rank} and targets rank ${n.rank}`),ht(o.shape.slice(0,o.shape.length-1),n.shape,"predictions's shape should be align with the targets' shape, except the last dimension.");let s=o.shape[o.shape.length-1];$(t>0&&t<=s,()=>`'k' passed to inTopK() must be > 0 && <= the predictions last dimension (${s}), but got ${t}`);let a=await o.data(),i=await n.data(),[p,u]=[a.length/s,s],c=hb("bool",p);for(let l=0;lg.value-h.value),c[l]=0;for(let h=0;hsT,depthwiseConv2d:()=>uT,matMul:()=>pT});function WH(r,e,t,o,n,s="NHWC",a){let i=r;r.rank===3&&(i=z(r,[1,r.shape[0],r.shape[1],r.shape[2]]));let p=e;p.rank===3&&(p=z(e,[1,e.shape[0],e.shape[1],e.shape[2]])),$(i.rank===4,()=>`Error in conv2dDerFilter: input must be rank 4, but got shape ${i.shape}.`),$(p.rank===4,()=>`Error in conv2dDerFilter: dy must be rank 4, but got shape ${p.shape}.`),$(t.length===4,()=>`Error in conv2dDerFilter: filterShape must be length 4, but got ${t}.`);let u=s==="NHWC"?i.shape[3]:i.shape[1],c=s==="NHWC"?p.shape[3]:p.shape[1];$(u===t[2],()=>`Error in conv2dDerFilter: depth of input ${u}) must match input depth in filter (${t[2]}.`),$(c===t[3],()=>`Error in conv2dDerFilter: depth of dy (${c}) must match output depth for filter (${t[3]}).`),Ot("conv2dDerFilter",n,a);let l={x:i,dy:p},m={strides:o,pad:n,dataFormat:s,dimRoundingMode:a,filterShape:t};return N.runKernel(lp,l,m)}var nT=T({conv2DBackpropFilter_:WH});function gu(r,e,t){if(t==null||t==="linear")return r;if(t==="relu")return oe(r,qf(e));throw new Error(`Cannot compute gradient for fused activation ${t}.`)}function xu(r,e){let t=e,o=nf(r.shape,e.shape);return o.length>0&&(t=tt(t,o)),z(t,r.shape)}function yu(r,e,t,o){if(e==="linear")return r;if(e==="relu")return hi(r);if(e==="elu")return xf(r);if(e==="relu6")return Wf(r);if(e==="prelu")return Pf(r,t);if(e==="leakyrelu")return wf(r,o);if(e==="sigmoid")return Ms(r);throw new Error(`Unknown fused activation ${e}.`)}var bu=(r,e)=>!(r>0)||e==="linear";function UH({x:r,filter:e,strides:t,pad:o,dataFormat:n="NHWC",dilations:s=[1,1],dimRoundingMode:a,bias:i,activation:p="linear",preluActivationWeights:u,leakyreluAlpha:c}){if(p=p||"linear",bu(N.state.gradientDepth,p)===!1){$(n==="NHWC",()=>`Error in fused conv2d: got dataFormat of ${n} but only NHWC is currently supported for the case of gradient depth is 0 and the activation is not linear.`);let _=mi(r,e,t,o,n,s,a);return i!=null&&(_=ge(_,i)),yu(_,p,u,c)}let l=v(r,"x","conv2d","float32"),m=v(e,"filter","conv2d","float32"),f=l,d=!1;l.rank===3&&(d=!0,f=z(l,[1,l.shape[0],l.shape[1],l.shape[2]])),$(f.rank===4,()=>`Error in fused conv2d: input must be rank 4, but got rank ${f.rank}.`),$(m.rank===4,()=>`Error in fused conv2d: filter must be rank 4, but got rank ${m.rank}.`),Ot("fused conv2d",o,a);let h=n==="NHWC"?f.shape[3]:f.shape[1];$(m.shape[2]===h,()=>`Error in conv2d: depth of input (${h}) must match input depth for filter ${m.shape[2]}.`),$(lr(t,s),()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${t} and dilations '${s}'`);let g=uu(f.shape,m.shape,t,s,o,a),y;i!=null&&(y=v(i,"bias","fused conv2d"),[y]=Re(y,l),n==="NHWC"?Je(g.outShape,y.shape):($(y.shape.length<=1,()=>`Error in fused conv2d: only supports scalar or 1-D Tensor bias for NCHW format but got the bias of rank-${y.shape.length}.`),$(y.shape.length===0||y.shape[0]===g.outChannels||y.shape[0]===1,()=>`Error in fused conv2d: bias shape (${y.shape}) is not compatible with the number of output channels (${g.outChannels})`)));let b;if(u!=null){let _=u.shape;if($(_.length<=1||_.length===3,()=>`Error in fused conv2d: only supports scalar, 1-D Tensor or 3-D Tensor PReLU activation weights but got a tensor of rank-${_.length}.`),_.length===1)$(_[0]===1||_[0]===g.outChannels,()=>`Error in fused conv2d: PReLU activation weights (${_}) is not compatible with the number of output channels (${g.outChannels}).`);else if(_.length===3)try{Je(_,g.outShape)}catch(E){let R=`Error in fused conv2d: PReLU activation weights (${_}) is not compatible with the output shape of the conv2d (${g.outShape}).`;throw Error(R)}b=v(u,"prelu weights","fused conv2d")}let C=(_,E)=>{$(n==="NHWC",()=>`Error in gradient of fused conv2D: got dataFormat of ${n} but only NHWC is currently supported.`);let[R,A,D,O]=E,M=gu(_,D,p);$(iu(s),()=>`Error in gradient of fused conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${s}'`);let L=hf(A.shape,M,R,t,o),W=nT(A,M,R.shape,t,o),V=[L,W];if(O!=null){let G=xu(O,M);V.push(G)}return V},w={x:f,filter:m,bias:y,preluActivationWeights:b},k={strides:t,pad:o,dataFormat:n,dilations:s,dimRoundingMode:a,activation:p,leakyreluAlpha:c};return i==null?Cr((E,R,A)=>{let D=N.runKernel(Do,w,k);return A([R,E,D]),d&&(D=z(D,[D.shape[1],D.shape[2],D.shape[3]])),{value:D,gradFunc:C}})(f,m):Cr((E,R,A,D)=>{let O=N.runKernel(Do,w,k);return D([R,E,O,A]),d&&(O=z(O,[O.shape[1],O.shape[2],O.shape[3]])),{value:O,gradFunc:C}})(f,m,y)}var sT=T({fusedConv2d_:UH});function GH(r,e,t,o,n,s=[1,1],a){let i=r;r.rank===3&&(i=z(r,[1,r.shape[0],r.shape[1],r.shape[2]]));let p=e;p.rank===3&&(p=z(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let u={x:i,dy:p},c={strides:o,pad:n,dimRoundingMode:a,dilations:s,filterShape:t};return N.runKernel(hp,u,c)}var aT=T({depthwiseConv2dNativeBackpropFilter_:GH});function HH(r,e,t,o,n,s=[1,1],a){let i=e,p=!1;e.rank===3&&(p=!0,i=z(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let u={dy:i,filter:t},c={strides:o,pad:n,dimRoundingMode:a,dilations:s,inputShape:r},l=N.runKernel(gp,u,c);return p?z(l,[l.shape[1],l.shape[2],l.shape[3]]):l}var iT=T({depthwiseConv2dNativeBackpropInput_:HH});function qH({x:r,filter:e,strides:t,pad:o,dataFormat:n="NHWC",dilations:s=[1,1],dimRoundingMode:a,bias:i,activation:p="linear",preluActivationWeights:u,leakyreluAlpha:c}){if(bu(N.state.gradientDepth,p)===!1){let k=Gp(r,e,t,o,n,s,a);return i!=null&&(k=ge(k,i)),yu(k,p,u,c)}let l=v(r,"x","depthwiseConv2d","float32"),m=v(e,"filter","depthwiseConv2d","float32"),f=l,d=!1;l.rank===3&&(d=!0,f=z(l,[1,l.shape[0],l.shape[1],l.shape[2]])),$(f.rank===4,()=>`Error in fused depthwiseConv2d: input must be rank 4, but got rank ${f.rank}.`),$(m.rank===4,()=>`Error in fused depthwiseConv2d: filter must be rank 4, but got rank ${m.rank}.`),$(f.shape[3]===m.shape[2],()=>`Error in fused depthwiseConv2d: number of input channels (${f.shape[3]}) must match the inChannels dimension in filter ${m.shape[2]}.`),s==null&&(s=[1,1]),$(lr(t,s),()=>`Error in fused depthwiseConv2d: Either strides or dilations must be 1. Got strides ${t} and dilations '${s}'`),Ot("fused depthwiseConv2d",o,a);let h=uu(f.shape,m.shape,t,s,o,a,!0),g;i!=null&&(g=v(i,"bias","fused conv2d"),[g]=Re(g,l),Je(h.outShape,g.shape));let y;u!=null&&(y=v(u,"prelu weights","fused depthwiseConv2d"));let b=(k,_)=>{$(iu(s),()=>`Error in gradient of fused depthwiseConv2d: dilation rates greater than 1 are not yet supported. Got dilations '${s}'`);let[E,R,A,D]=_,O=gu(k,A,p),M=iT(R.shape,O,E,t,o,s,a),L=aT(R,O,E.shape,t,o,s,a);if(D!=null){let W=xu(g,O);return[M,L,W]}return[M,L]},C={x:f,filter:m,bias:g,preluActivationWeights:y},w={strides:t,pad:o,dataFormat:n,dilations:s,dimRoundingMode:a,activation:p,leakyreluAlpha:c};return i==null?Cr((_,E,R)=>{let A=N.runKernel(Po,C,w);return R([E,_,A]),d&&(A=z(A,[A.shape[1],A.shape[2],A.shape[3]])),{value:A,gradFunc:b}})(f,m):Cr((_,E,R,A)=>{let D=N.runKernel(Po,C,w);return A([E,_,D,R]),d&&(D=z(D,[D.shape[1],D.shape[2],D.shape[3]])),{value:D,gradFunc:b}})(f,m,g)}var uT=T({fusedDepthwiseConv2d_:qH});function KH({a:r,b:e,transposeA:t=!1,transposeB:o=!1,bias:n,activation:s="linear",preluActivationWeights:a,leakyreluAlpha:i=.2}){if(bu(N.state.gradientDepth,s)===!1){let O=Xe(r,e,t,o);return n!=null&&(O=ge(O,n)),yu(O,s,a,i)}let p=v(r,"a","fused matMul"),u=v(e,"b","fused matMul");[p,u]=Re(p,u);let c=t?p.shape[p.rank-2]:p.shape[p.rank-1],l=o?u.shape[u.rank-1]:u.shape[u.rank-2],m=t?p.shape[p.rank-1]:p.shape[p.rank-2],f=o?u.shape[u.rank-2]:u.shape[u.rank-1],d=p.shape.slice(0,-2),h=u.shape.slice(0,-2),g=Ve(d),y=Ve(h);$(c===l,()=>`Error in fused matMul: inner shapes (${c}) and (${l}) of Tensors with shapes ${p.shape} and ${u.shape} and transposeA=${t} and transposeB=${o} must match.`);let C=Je(p.shape.slice(0,-2),u.shape.slice(0,-2)).concat([m,f]),w=t?z(p,[g,c,m]):z(p,[g,m,c]),k=o?z(u,[y,f,l]):z(u,[y,l,f]),_;n!=null&&(_=v(n,"bias","fused matMul"),[_]=Re(_,p),Je(C,_.shape));let E;a!=null&&(E=v(a,"prelu weights","fused matMul"));let R=(O,M)=>{let[L,W,V,G]=M,q=gu(z(O,V.shape),V,s),H,j;if(!t&&!o?(H=Xe(q,W,!1,!0),j=Xe(L,q,!0,!1)):!t&&o?(H=Xe(q,W,!1,!1),j=Xe(q,L,!0,!1)):t&&!o?(H=Xe(W,q,!1,!0),j=Xe(L,q,!1,!1)):(H=Xe(W,q,!0,!0),j=Xe(q,L,!0,!0)),n!=null){let Y=xu(G,q);return[H,j,Y]}else return[H,j]},A={a:w,b:k,bias:_,preluActivationWeights:E},D={transposeA:t,transposeB:o,activation:s,leakyreluAlpha:i};return n==null?Cr((M,L,W)=>{let V=N.runKernel(Fo,A,D);return W([M,L,V]),{value:z(V,C),gradFunc:R}})(w,k):Cr((M,L,W,V)=>{let G=N.runKernel(Fo,A,D);return V([M,L,G,W]),{value:z(G,C),gradFunc:R}})(w,k,_)}var pT=T({fusedMatMul_:KH});function jH(r){return hl(r,.54,.46)}var cT=T({hammingWindow_:jH});function XH(r){return hl(r,.5,.5)}var Xf=T({hannWindow_:XH});function YH(r,e,t,o=!1,n=0){let s=0,a=[];for(;s+e<=r.size;)a.push(Ue(r,s,e)),s+=t;if(o)for(;s`Error in cropAndResize: image must be rank 4,but got rank ${a.rank}.`),$(i.rank===2&&i.shape[1]===4,()=>`Error in cropAndResize: boxes must be have size [${u},4] but had shape ${i.shape}.`),$(p.rank===1&&p.shape[0]===u,()=>`Error in cropAndResize: boxInd must be have size [${u}] but had shape ${i.shape}.`),$(o.length===2,()=>`Error in cropAndResize: cropSize must be of length 2, but got length ${o.length}.`),$(o[0]>=1&&o[1]>=1,()=>`cropSize must be atleast [1,1], but was ${o}`),$(n==="bilinear"||n==="nearest",()=>`method must be bilinear or nearest, but was ${n}`);let c={image:a,boxes:i,boxInd:p},l={method:n,extrapolationValue:s,cropSize:o};return N.runKernel(xn,c,l)}var mT=T({cropAndResize_:ZH});function JH(r){let e=v(r,"image","flipLeftRight","float32");$(e.rank===4,()=>`Error in flipLeftRight: image must be rank 4,but got rank ${e.rank}.`);let t={image:e};return N.runKernel(Sn,t,{})}var fT=T({flipLeftRight_:JH});function eq(r){let e=v(r,"image","grayscaleToRGB"),t=e.rank-1,o=e.shape[t];$(e.rank>=2,()=>`Error in grayscaleToRGB: images must be at least rank 2, but got rank ${e.rank}.`),$(o===1,()=>`Error in grayscaleToRGB: last dimension of a grayscale image should be size 1, but got size ${o}.`);let n=new Array(e.rank);return n.fill(1,0,t),n[t]=3,fi(e,n)}var dT=T({grayscaleToRGB_:eq});function tq(r,e,t=0,o=.5){let n=v(r,"image","rotateWithOffset","float32");$(n.rank===4,()=>`Error in rotateWithOffset: image must be rank 4,but got rank ${n.rank}.`);let s={image:n},a={radians:e,fillValue:t,center:o};return N.runKernel(es,s,a)}var hT=T({rotateWithOffset_:tq});function Vo(r,e,t,o,n,s){o==null&&(o=.5),n==null&&(n=Number.NEGATIVE_INFINITY),s==null&&(s=0);let a=r.shape[0];return t=Math.min(t,a),$(0<=o&&o<=1,()=>`iouThreshold must be in [0, 1], but was '${o}'`),$(r.rank===2,()=>`boxes must be a 2D tensor, but was of rank '${r.rank}'`),$(r.shape[1]===4,()=>`boxes must have 4 columns, but 2nd dimension was ${r.shape[1]}`),$(e.rank===1,()=>"scores must be a 1D tensor"),$(e.shape[0]===a,()=>`scores has incompatible shape with boxes. Expected ${a}, but was ${e.shape[0]}`),$(0<=s&&s<=1,()=>`softNmsSigma must be in [0, 1], but was '${s}'`),{maxOutputSize:t,iouThreshold:o,scoreThreshold:n,softNmsSigma:s}}function rq(r,e,t,o=.5,n=Number.NEGATIVE_INFINITY){let s=v(r,"boxes","nonMaxSuppression","float32"),a=v(e,"scores","nonMaxSuppression","float32"),i=Vo(s,a,t,o,n);t=i.maxOutputSize,o=i.iouThreshold,n=i.scoreThreshold;let p={maxOutputSize:t,iouThreshold:o,scoreThreshold:n};return N.runKernel(On,{boxes:s,scores:a},p)}var gT=T({nonMaxSuppression_:rq});function xT(r,e,t){let o=oq(r,e,t),n=o<0?-(o+1):o;r.splice(n,0,e)}function oq(r,e,t){return sq(r,e,t||nq)}function nq(r,e){return r>e?1:r>>1);let i=t(e,r[s]);i>0?o=s+1:(n=s,a=!i)}return a?o:-o-1}function Qf(r,e,t,o,n){return vC(r,e,t,o,n,0)}function Zf(r,e,t,o,n,s){return vC(r,e,t,o,n,0,!1,s,!0)}function Jf(r,e,t,o,n,s){return vC(r,e,t,o,n,s,!0)}function vC(r,e,t,o,n,s,a=!1,i=!1,p=!1){let u=[];for(let g=0;gn&&u.push({score:e[g],boxIndex:g,suppressBeginIndex:0});u.sort(yT);let c=s>0?-.5/s:0,l=[],m=[];for(;l.length0;){let g=u.pop(),{score:y,boxIndex:b,suppressBeginIndex:C}=g;if(y=C;--k){let _=aq(r,b,l[k]);if(_>=o){w=!0;break}if(g.score=g.score*iq(o,c,_),g.score<=n)break}g.suppressBeginIndex=l.length,w||(g.score===y?(l.push(b),m.push(g.score)):g.score>n&&xT(u,g,yT))}let f=l.length,d=t-f;i&&d>0&&(l.push(...new Array(d).fill(0)),m.push(...new Array(d).fill(0)));let h={selectedIndices:l};return a&&(h.selectedScores=m),p&&(h.validOutputs=f),h}function aq(r,e,t){let o=r.subarray(e*4,e*4+4),n=r.subarray(t*4,t*4+4),s=Math.min(o[0],o[2]),a=Math.min(o[1],o[3]),i=Math.max(o[0],o[2]),p=Math.max(o[1],o[3]),u=Math.min(n[0],n[2]),c=Math.min(n[1],n[3]),l=Math.max(n[0],n[2]),m=Math.max(n[1],n[3]),f=(i-s)*(p-a),d=(l-u)*(m-c);if(f<=0||d<=0)return 0;let h=Math.max(s,u),g=Math.max(a,c),y=Math.min(i,l),b=Math.min(p,m),C=Math.max(y-h,0)*Math.max(b-g,0);return C/(f+d-C)}function iq(r,e,t){let o=Math.exp(e*t*t);return t<=r?o:0}function yT(r,e){return r.score-e.score||r.score===e.score&&e.boxIndex-r.boxIndex}async function uq(r,e,t,o=.5,n=Number.NEGATIVE_INFINITY){let s=v(r,"boxes","nonMaxSuppressionAsync"),a=v(e,"scores","nonMaxSuppressionAsync"),i=Vo(s,a,t,o,n);t=i.maxOutputSize,o=i.iouThreshold,n=i.scoreThreshold;let p=await Promise.all([s.data(),a.data()]),u=p[0],c=p[1],{selectedIndices:l}=Qf(u,c,t,o,n);return s!==r&&s.dispose(),a!==e&&a.dispose(),mr(l,"int32")}var bT=uq;function pq(r,e,t,o=.5,n=Number.NEGATIVE_INFINITY,s=0){let a=v(r,"boxes","nonMaxSuppression"),i=v(e,"scores","nonMaxSuppression"),p=Vo(a,i,t,o,n,s);t=p.maxOutputSize,o=p.iouThreshold,n=p.scoreThreshold,s=p.softNmsSigma;let u={boxes:a,scores:i},c={maxOutputSize:t,iouThreshold:o,scoreThreshold:n,softNmsSigma:s},l=N.runKernel(Mn,u,c);return{selectedIndices:l[0],selectedScores:l[1]}}var CT=T({nonMaxSuppressionWithScore_:pq});async function cq(r,e,t,o=.5,n=Number.NEGATIVE_INFINITY,s=0){let a=v(r,"boxes","nonMaxSuppressionAsync"),i=v(e,"scores","nonMaxSuppressionAsync"),p=Vo(a,i,t,o,n,s);t=p.maxOutputSize,o=p.iouThreshold,n=p.scoreThreshold,s=p.softNmsSigma;let u=await Promise.all([a.data(),i.data()]),c=u[0],l=u[1],{selectedIndices:m,selectedScores:f}=Jf(c,l,t,o,n,s);return a!==r&&a.dispose(),i!==e&&i.dispose(),{selectedIndices:mr(m,"int32"),selectedScores:mr(f)}}var IT=cq;function lq(r,e,t,o=.5,n=Number.NEGATIVE_INFINITY,s=!1){let a=v(r,"boxes","nonMaxSuppression"),i=v(e,"scores","nonMaxSuppression"),p=Vo(a,i,t,o,n,null),u=p.maxOutputSize,c=p.iouThreshold,l=p.scoreThreshold,m={boxes:a,scores:i},f={maxOutputSize:u,iouThreshold:c,scoreThreshold:l,padToMaxOutputSize:s},d=N.runKernel(pa,m,f);return{selectedIndices:d[0],validOutputs:d[1]}}var wT=T({nonMaxSuppressionPadded_:lq});async function mq(r,e,t,o=.5,n=Number.NEGATIVE_INFINITY,s=!1){let a=v(r,"boxes","nonMaxSuppressionAsync"),i=v(e,"scores","nonMaxSuppressionAsync"),p=Vo(a,i,t,o,n,null),u=p.maxOutputSize,c=p.iouThreshold,l=p.scoreThreshold,[m,f]=await Promise.all([a.data(),i.data()]),{selectedIndices:d,validOutputs:h}=Zf(m,f,u,c,l,s);return a!==r&&a.dispose(),i!==e&&i.dispose(),{selectedIndices:mr(d,"int32"),validOutputs:be(h,"int32")}}var ST=mq;function fq(r,e,t=!1,o=!1){let n=v(r,"images","resizeBilinear");$(n.rank===3||n.rank===4,()=>`Error in resizeBilinear: x must be rank 3 or 4, but got rank ${n.rank}.`),$(e.length===2,()=>`Error in resizeBilinear: new shape must 2D, but got shape ${e}.`),$(o===!1||t===!1,()=>"Error in resizeBilinear: If halfPixelCenters is true, alignCorners must be false.");let s=n,a=!1;n.rank===3&&(a=!0,s=z(n,[1,n.shape[0],n.shape[1],n.shape[2]]));let[]=e,i={images:s},p={alignCorners:t,halfPixelCenters:o,size:e},u=N.runKernel(Un,i,p);return a?z(u,[u.shape[1],u.shape[2],u.shape[3]]):u}var vT=T({resizeBilinear_:fq});function dq(r,e,t=!1,o=!1){let n=v(r,"images","resizeNearestNeighbor");$(n.rank===3||n.rank===4,()=>`Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank ${n.rank}.`),$(e.length===2,()=>`Error in resizeNearestNeighbor: new shape must 2D, but got shape ${e}.`),$(n.dtype==="float32"||n.dtype==="int32",()=>"`images` must have `int32` or `float32` as dtype"),$(o===!1||t===!1,()=>"Error in resizeNearestNeighbor: If halfPixelCenters is true, alignCorners must be false.");let s=n,a=!1;n.rank===3&&(a=!0,s=z(n,[1,n.shape[0],n.shape[1],n.shape[2]]));let[]=e,i={images:s},p={alignCorners:t,halfPixelCenters:o,size:e},u=N.runKernel(Wn,i,p);return a?z(u,[u.shape[1],u.shape[2],u.shape[3]]):u}var kT=T({resizeNearestNeighbor_:dq});function hq(r,e="binary",t=!1,o=.5){let n=v(r,"image","threshold"),s=.2989,a=.587,i=.114,p=n.shape[0]*n.shape[1],u=oe(mr([o]),255),c,l,m,f;if($(n.rank===3,()=>`Error in threshold: image must be rank 3,but got rank ${n.rank}.`),$(n.shape[2]===3||n.shape[2]===1,()=>`Error in threshold: image color channel must be equal to 3 or 1but got ${n.shape[2]}.`),$(n.dtype==="int32"||n.dtype==="float32",()=>`Error in dtype: image dtype must be int32 or float32,but got dtype ${n.dtype}.`),$(e==="otsu"||e==="binary",()=>`Method must be binary or otsu, but was ${e}`),n.shape[2]===3){[c,l,m]=$a(n,[1,1,1],-1);let g=oe(c,s),y=oe(l,a),b=oe(m,i);f=ge(ge(g,y),b)}else f=r;if(e==="otsu"){let g=df(qe(Uf(f),"int32"),nr([]),256);u=gq(g,p)}let d=t?Hp(f,u):cu(f,u);return qe(oe(d,255),"int32")}function gq(r,e){let t=mr([-1]),o=mr([0]),n=mr([0]),s,a,i,p,u,c;for(let l=0;l`Error in transform: image must be rank 4,but got rank ${a.rank}.`),$(i.rank===2&&(i.shape[0]===a.shape[0]||i.shape[0]===1)&&i.shape[1]===8,()=>"Error in transform: Input transform should be batch x 8 or 1 x 8"),$(s==null||s.length===2,()=>`Error in transform: outputShape must be [height, width] or null, but got ${s}.`);let p={image:a,transforms:i},u={interpolation:t,fillMode:o,fillValue:n,outputShape:s};return N.runKernel(Jn,p,u)}var NT=T({transform_:xq});function yq(r,e,t){$(e%1===0,()=>`bandPart(): numLower must be an integer, got ${e}.`),$(t%1===0,()=>`bandPart(): numUpper must be an integer, got ${t}.`);let o=v(r,"a","bandPart");$(o.rank>=2,()=>`bandPart(): Rank must be at least 2, got ${o.rank}.`);let n=o.shape,[s,a]=o.shape.slice(-2);if(!(e<=s))throw new Error(`bandPart(): numLower (${e}) must not be greater than the number of rows (${s}).`);if(!(t<=a))throw new Error(`bandPart(): numUpper (${t}) must not be greater than the number of columns (${a}).`);e<0&&(e=s),t<0&&(t=a);let i=z(di(0,s,1,"int32"),[-1,1]),p=di(0,a,1,"int32"),u=ke(i,p),c=lu(Hp(u,be(+e,"int32")),If(u,be(-t,"int32"))),l=Wr([s,a],o.dtype);return z(Ir(ko(z(o,[-1,s,a])).map(m=>os(c,m,l))),n)}var _T=T({bandPart_:yq});function bq(r){let e;if(Array.isArray(r)){e=!1,$(r!=null&&r.length>0,()=>"Gram-Schmidt process: input must not be null, undefined, or empty");let n=r[0].shape[0];for(let s=1;s`Gram-Schmidt: Non-unique lengths found in the input vectors: (${r[s].shape[0]} vs. ${n})`)}else e=!0,r=$a(r,r.shape[0],0).map(n=>jp(n,[0]));$(r.length<=r[0].shape[0],()=>`Gram-Schmidt: Number of vectors (${r.length}) exceeds number of dimensions (${r[0].shape[0]}).`);let t=[],o=r;for(let n=0;n{let s=o[n];if(n>0)for(let a=0;a=2,()=>`qr() requires input tensor to have a rank >= 2, but got rank ${r.rank}`),r.rank===2)return $T(r,e);{let t=r.shape.slice(0,r.shape.length-2).reduce((p,u)=>p*u),o=ko(z(r,[t,r.shape[r.shape.length-2],r.shape[r.shape.length-1]]),0),n=[],s=[];o.forEach(p=>{let[u,c]=$T(p,e);n.push(u),s.push(c)});let a=z(Ir(n,0),r.shape),i=z(Ir(s,0),r.shape);return[a,i]}}function $T(r,e=!1){return N.tidy(()=>{$(r.shape.length===2,()=>`qr2d() requires a 2D Tensor, but got a ${r.shape.length}D Tensor.`);let t=r.shape[0],o=r.shape[1],n=yf(t),s=zr(r),a=gi([[1]],[1,1]),i=zr(a),p=t>=o?o:t;for(let u=0;u{let f=Ue(s,[u,u],[t-u,1]),d=pu(f),h=Ue(s,[u,u],[1,1]),g=os(cu(h,0),gi([[-1]]),gi([[1]])),y=ke(h,oe(g,d)),b=We(f,y);b.shape[0]===1?i=zr(a):i=gt([a,Ue(b,[1,0],[b.shape[0]-1,b.shape[1]])],0);let C=yr(We(Xe(g,y),d)),w=Ue(s,[u,0],[t-u,o]),k=oe(C,i),_=Wp(i);if(u===0)s=ke(w,Xe(k,Xe(_,w)));else{let A=ke(w,Xe(k,Xe(_,w)));s=gt([Ue(s,[0,0],[u,o]),A],0)}let E=Wp(k),R=Ue(n,[0,u],[t,n.shape[1]-u]);if(u===0)n=ke(R,Xe(Xe(R,i),E));else{let A=ke(R,Xe(Xe(R,i),E));n=gt([Ue(n,[0,0],[t,u]),A],1)}return[i,s,n]}),Ft([c,l,m])}return!e&&t>o&&(n=Ue(n,[0,0],[t,o]),s=Ue(s,[0,0],[o,o])),[n,s]})}var RT=T({qr_:Cq});var Et;(function(r){r[r.NONE=0]="NONE",r[r.MEAN=1]="MEAN",r[r.SUM=2]="SUM",r[r.SUM_BY_NONZERO_WEIGHTS=3]="SUM_BY_NONZERO_WEIGHTS"})(Et||(Et={}));function Iq(r,e,t=Et.SUM_BY_NONZERO_WEIGHTS){let o=v(r,"losses","computeWeightedLoss"),n=null;e!=null&&(n=v(e,"weights","computeWeightedLoss"));let s=n==null?o:oe(o,n);if(t===Et.NONE)return s;if(t===Et.SUM)return tt(s);if(t===Et.MEAN){if(n==null)return mu(s);{let a=o.size/n.size,i=We(tt(s),tt(n));return a>1?We(i,be(a)):i}}if(t===Et.SUM_BY_NONZERO_WEIGHTS){if(n==null)return We(tt(s),be(o.size));{let a=oe(n,zs(o.shape)),i=qe(tt(Ff(a,be(0))),"float32");return We(tt(s),i)}}throw Error(`Unknown reduction: ${t}`)}var sr=T({computeWeightedLoss_:Iq});function wq(r,e,t,o=Et.SUM_BY_NONZERO_WEIGHTS){let n=v(r,"labels","absoluteDifference"),s=v(e,"predictions","absoluteDifference"),a=null;t!=null&&(a=v(t,"weights","absoluteDifference")),ht(n.shape,s.shape,"Error in absoluteDifference: ");let i=Qt(ke(n,s));return sr(i,a,o)}var AT=T({absoluteDifference_:wq});function Sq(r,e,t,o,n=Et.SUM_BY_NONZERO_WEIGHTS){let s=v(r,"labels","cosineDistance"),a=v(e,"predictions","cosineDistance"),i=null;o!=null&&(i=v(o,"weights","cosineDistance")),ht(s.shape,a.shape,"Error in cosineDistance: ");let p=be(1),u=ke(p,tt(oe(s,a),t,!0));return sr(u,i,n)}var FT=T({cosineDistance_:Sq});function vq(r,e,t,o=Et.SUM_BY_NONZERO_WEIGHTS){let n=v(r,"labels","hingeLoss"),s=v(e,"predictions","hingeLoss"),a=null;t!=null&&(a=v(t,"weights","hingeLoss")),ht(n.shape,s.shape,"Error in hingeLoss: ");let i=be(1);n=ke(oe(be(2),n),i);let p=hi(ke(i,oe(n,s)));return sr(p,a,o)}var DT=T({hingeLoss_:vq});function kq(r,e,t,o=1,n=Et.SUM_BY_NONZERO_WEIGHTS){let s=v(r,"labels","huberLoss"),a=v(e,"predictions","huberLoss"),i=null;t!=null&&(i=v(t,"weights","huberLoss")),ht(s.shape,a.shape,"Error in huberLoss: ");let p=be(o),u=Qt(ke(a,s)),c=Af(u,p),l=ke(u,c),m=ge(oe(be(.5),Zt(c)),oe(p,l));return sr(m,i,n)}var PT=T({huberLoss_:kq});function Tq(r,e,t,o=1e-7,n=Et.SUM_BY_NONZERO_WEIGHTS){let s=v(r,"labels","logLoss"),a=v(e,"predictions","logLoss"),i=null;t!=null&&(i=v(t,"weights","logLoss")),ht(s.shape,a.shape,"Error in logLoss: ");let p=be(1),u=be(o),c=yr(oe(s,Ea(ge(a,u)))),l=oe(ke(p,s),Ea(ge(ke(p,a),u))),m=ke(c,l);return sr(m,i,n)}var OT=T({logLoss_:Tq});function Nq(r,e,t,o=Et.SUM_BY_NONZERO_WEIGHTS){let n=v(r,"labels","meanSquaredError"),s=v(e,"predictions","meanSquaredError"),a=null;t!=null&&(a=v(t,"weights","meanSquaredError")),ht(n.shape,s.shape,"Error in meanSquaredError: ");let i=Hf(n,s);return sr(i,a,o)}var MT=T({meanSquaredError_:Nq});function _q(r,e){let t=v(r,"labels","sigmoidCrossEntropyWithLogits"),o=v(e,"logits","sigmoidCrossEntropyWithLogits");ht(t.shape,o.shape,"Error in sigmoidCrossEntropyWithLogits: ");let n=hi(o),s=oe(o,t),a=Sf(Bo(yr(Qt(o))));return ge(ke(n,s),a)}function Eq(r,e,t,o=0,n=Et.SUM_BY_NONZERO_WEIGHTS){let s=v(r,"multiClassLabels","sigmoidCrossEntropy"),a=v(e,"logits","sigmoidCrossEntropy"),i=null;if(t!=null&&(i=v(t,"weights","sigmoidCrossEntropy")),ht(s.shape,a.shape,"Error in sigmoidCrossEntropy: "),o>0){let u=be(o),c=be(1),l=be(.5);s=ge(oe(s,ke(c,u)),oe(l,u))}let p=_q(s,a);return sr(p,i,n)}var LT=T({sigmoidCrossEntropy_:Eq});function $q(r,e,t=-1){if(t===-1&&(t=e.rank-1),t!==e.rank-1)throw Error(`Softmax cross entropy along a non-last dimension is not yet supported. Labels / logits was rank ${e.rank} and dim was ${t}`);return Cr((n,s,a)=>{let p=Tf(s,[t],!0),u=ke(qe(s,"float32"),p);a([n,u]);let c=yr(oe(u,n));return{value:tt(c,[t]),gradFunc:(f,d)=>{let[h,g]=d,y=Ta(f.shape,[t]);return[oe(z(f,y),ke(qe(h,"float32"),Bo(g))),oe(z(f,y),ke(Bo(g),qe(h,"float32")))]}}})(r,e)}function Rq(r,e,t,o=0,n=Et.SUM_BY_NONZERO_WEIGHTS){let s=v(r,"onehotLabels","softmaxCrossEntropy"),a=v(e,"logits","softmaxCrossEntropy"),i=null;if(t!=null&&(i=v(t,"weights","softmaxCrossEntropy")),ht(s.shape,a.shape,"Error in softmaxCrossEntropy: "),o>0){let u=be(o),c=be(1),l=be(s.shape[1]);s=ge(oe(s,ke(c,u)),We(u,l))}let p=$q(s,a);return sr(p,i,n)}var BT=T({softmaxCrossEntropy_:Rq});function Aq(r,e,t,o){let n=v(r,"indices","sparseFillEmptyRows","int32"),s=v(e,"values","sparseFillEmptyRows"),a=v(t,"denseShape","sparseFillEmptyRows","int32"),i=v(o,"defaultValue","sparseFillEmptyRows",s.dtype);if(n.rank!==2)throw new Error(`Indices should be Tensor2D but received shape + ${n.shape}`);if(s.rank!==1)throw new Error(`Values should be Tensor1D but received shape ${s.shape}`);if(a.rank!==1)throw new Error(`Dense shape should be Tensor1D but received shape ${a.shape}`);if(i.rank!==0)throw new Error(`Default value should be a scalar but received shape ${i.shape}`);let p={indices:n,values:s,denseShape:a,defaultValue:i},u=N.runKernel(Qa,p);return{outputIndices:u[0],outputValues:u[1],emptyRowIndicator:u[2],reverseIndexMap:u[3]}}var VT=T({sparseFillEmptyRows_:Aq});function Fq(r,e,t){let o=v(r,"inputIndices","sparseReshape","int32"),n=v(e,"inputShape","sparseReshape","int32"),s=v(t,"newShape","sparseReshape","int32");if(o.rank!==2)throw new Error(`Input indices should be Tensor2D but received shape + ${o.shape}`);if(n.rank!==1)throw new Error(`Input shape should be Tensor1D but received shape ${n.shape}`);if(s.rank!==1)throw new Error(`New shape should be Tensor1D but received shape ${s.shape}`);let a={inputIndices:o,inputShape:n,newShape:s},i=N.runKernel(ga,a);return{outputIndices:i[0],outputShape:i[1]}}var zT=T({sparseReshape_:Fq});function Dq(r,e,t){let o=v(r,"data","sparseSegmentMean"),n=v(e,"indices","sparseSegmentMean","int32"),s=v(t,"segmentIds","sparseSegmentMean","int32");if(o.rank<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(n.rank!==1)throw new Error(`Indices should be Tensor1D but received shape + ${n.shape}`);if(s.rank!==1)throw new Error(`Segment ids should be Tensor1D but received shape + ${s.shape}`);let a={data:o,indices:n,segmentIds:s};return N.runKernel(Za,a)}var WT=T({sparseSegmentMean_:Dq});function Pq(r,e,t){let o=v(r,"data","sparseSegmentSum"),n=v(e,"indices","sparseSegmentSum","int32"),s=v(t,"segmentIds","sparseSegmentSum","int32");if(o.rank<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(n.rank!==1)throw new Error(`Indices should be Tensor1D but received shape + ${n.shape}`);if(s.rank!==1)throw new Error(`Segment ids should be Tensor1D but received shape + ${s.shape}`);let a={data:o,indices:n,segmentIds:s};return N.runKernel(Ja,a)}var UT=T({sparseSegmentSum_:Pq});function Oq(r,e,t,o,n,s,a,i){let p=v(r,"data","stringNGrams","string");if(p.dtype!=="string")throw new Error("Data must be of datatype string");if(p.shape.length!==1)throw new Error(`Data must be a vector, saw: ${p.shape}`);let u=v(e,"dataSplits","stringNGrams");if(u.dtype!=="int32")throw new Error("Data splits must be of datatype int32");let c={separator:t,nGramWidths:o,leftPad:n,rightPad:s,padWidth:a,preserveShortSequences:i},l={data:p,dataSplits:u},m=N.runKernel(Ns,l,c);return{nGrams:m[0],nGramsSplits:m[1]}}var GT=T({stringNGrams_:Oq});function Mq(r,e,t=!0){let o=v(r,"input","stringSplit","string"),n=v(e,"delimiter","stringSplit","string");if(o.rank!==1)throw new Error(`Input should be Tensor1D but received shape ${o.shape}`);if(n.rank!==0)throw new Error(`Delimiter should be a scalar but received shape ${n.shape}`);let s={skipEmpty:t},a={input:o,delimiter:n},i=N.runKernel(ri,a,s);return{indices:i[0],values:i[1],shape:i[2]}}var HT=T({stringSplit_:Mq});function Lq(r,e){let t=v(r,"input","stringToHashBucketFast","string"),o={numBuckets:e};if(e<=0)throw new Error("Number of buckets must be at least 1");let n={input:t};return N.runKernel(oi,n,o)}var qT=T({stringToHashBucketFast_:Lq});var Bq={fft:qp,ifft:hu,rfft:Kp,irfft:Gf},Vq={hammingWindow:cT,hannWindow:Xf,frame:Yf,stft:lT},zq={flipLeftRight:fT,grayscaleToRGB:dT,resizeNearestNeighbor:kT,resizeBilinear:vT,rotateWithOffset:hT,cropAndResize:mT,nonMaxSuppression:gT,nonMaxSuppressionAsync:bT,nonMaxSuppressionWithScore:CT,nonMaxSuppressionWithScoreAsync:IT,nonMaxSuppressionPadded:wT,nonMaxSuppressionPaddedAsync:ST,threshold:TT,transform:NT},Wq={bandPart:_T,gramSchmidt:ET,qr:RT},Uq={absoluteDifference:AT,computeWeightedLoss:sr,cosineDistance:FT,hingeLoss:DT,huberLoss:PT,logLoss:OT,meanSquaredError:MT,sigmoidCrossEntropy:LT,softmaxCrossEntropy:BT},Gq={sparseFillEmptyRows:VT,sparseReshape:zT,sparseSegmentMean:WT,sparseSegmentSum:UT},Hq={stringNGrams:GT,stringSplit:HT,stringToHashBucketFast:qT};var wr=class extends ll{minimize(e,t=!1,o){let{value:n,grads:s}=this.computeGradients(e,o);if(o!=null){let a=o.map(i=>({name:i.name,tensor:s[i.name]}));this.applyGradients(a)}else this.applyGradients(s);return Ft(s),t?n:(n.dispose(),null)}get iterations(){return this.iterations_==null&&(this.iterations_=0),this.iterations_}incrementIterations(){this.iterations_=this.iterations+1}computeGradients(e,t){return dC(e,t)}dispose(){this.iterations_!=null&&Ft(this.iterations_)}async saveIterations(){return this.iterations_==null&&(this.iterations_=0),{name:"iter",tensor:be(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(wr,Symbol.hasInstance,{value:r=>r.minimize!=null&&r.computeGradients!=null&&r.applyGradients!=null});var xi=class extends wr{constructor(e,t,o=null){super(),this.learningRate=e,this.rho=t,this.epsilon=o,this.accumulatedGrads=[],this.accumulatedUpdates=[],o==null&&(this.epsilon=N.backend.epsilon())}applyGradients(e){(Array.isArray(e)?e.map(o=>o.name):Object.keys(e)).forEach((o,n)=>{let s=N.registeredVariables[o],a=!1;this.accumulatedGrads[n]==null&&(this.accumulatedGrads[n]={originalName:`${o}/accum_grad`,variable:Ne(()=>Gt(s).variable(a))}),this.accumulatedUpdates[n]==null&&(this.accumulatedUpdates[n]={originalName:`${o}/accum_var`,variable:Ne(()=>Gt(s).variable(a))});let i=Array.isArray(e)?e[n].tensor:e[o];if(i==null)return;let p=this.accumulatedGrads[n].variable,u=this.accumulatedUpdates[n].variable;Ne(()=>{let c=ge(oe(p,this.rho),oe(Zt(i),1-this.rho)),l=oe(We(Rr(ge(u,this.epsilon)),Rr(ge(p,this.epsilon))),i),m=ge(oe(u,this.rho),oe(Zt(l),1-this.rho));p.assign(c),u.assign(m);let f=ge(oe(l,-this.learningRate),s);s.assign(f)})}),this.incrementIterations()}dispose(){this.accumulatedUpdates!=null&&(Ft(this.accumulatedGrads.map(e=>e.variable)),Ft(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,o=!1;this.accumulatedGrads=e.slice(0,t).map(n=>({originalName:n.name,variable:n.tensor.variable(o)})),this.accumulatedUpdates=e.slice(t,t*2).map(n=>({originalName:n.name,variable:n.tensor.variable(o)}))}getConfig(){return{learningRate:this.learningRate,rho:this.rho,epsilon:this.epsilon}}static fromConfig(e,t){return new e(t.learningRate,t.rho,t.epsilon)}};xi.className="Adadelta";$r(xi);var yi=class extends wr{constructor(e,t=.1){super(),this.learningRate=e,this.initialAccumulatorValue=t,this.accumulatedGrads=[]}applyGradients(e){(Array.isArray(e)?e.map(o=>o.name):Object.keys(e)).forEach((o,n)=>{let s=N.registeredVariables[o];this.accumulatedGrads[n]==null&&(this.accumulatedGrads[n]={originalName:`${o}/accumulator`,variable:Ne(()=>Bs(s.shape,this.initialAccumulatorValue).variable(!1))});let a=Array.isArray(e)?e[n].tensor:e[o];if(a==null)return;let i=this.accumulatedGrads[n].variable;Ne(()=>{let p=ge(i,Zt(a));i.assign(p);let u=ge(oe(We(a,Rr(ge(p,N.backend.epsilon()))),-this.learningRate),s);s.assign(u)})}),this.incrementIterations()}dispose(){this.accumulatedGrads!=null&&Ft(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(o=>({originalName:o.name,variable:o.tensor.variable(t)}))}getConfig(){return{learningRate:this.learningRate,initialAccumulatorValue:this.initialAccumulatorValue}}static fromConfig(e,t){return new e(t.learningRate,t.initialAccumulatorValue)}};yi.className="Adagrad";$r(yi);var bi=class extends wr{constructor(e,t,o,n=null){super(),this.learningRate=e,this.beta1=t,this.beta2=o,this.epsilon=n,this.accumulatedFirstMoment=[],this.accumulatedSecondMoment=[],Ne(()=>{this.accBeta1=be(t).variable(),this.accBeta2=be(o).variable()}),n==null&&(this.epsilon=N.backend.epsilon())}applyGradients(e){let t=Array.isArray(e)?e.map(o=>o.name):Object.keys(e);Ne(()=>{let o=ke(1,this.accBeta1),n=ke(1,this.accBeta2);t.forEach((s,a)=>{let i=N.registeredVariables[s],p=!1;this.accumulatedFirstMoment[a]==null&&(this.accumulatedFirstMoment[a]={originalName:`${s}/m`,variable:Ne(()=>Gt(i).variable(p))}),this.accumulatedSecondMoment[a]==null&&(this.accumulatedSecondMoment[a]={originalName:`${s}/v`,variable:Ne(()=>Gt(i).variable(p))});let u=Array.isArray(e)?e[a].tensor:e[s];if(u==null)return;let c=this.accumulatedFirstMoment[a].variable,l=this.accumulatedSecondMoment[a].variable,m=ge(oe(c,this.beta1),oe(u,1-this.beta1)),f=ge(oe(l,this.beta2),oe(Zt(u),1-this.beta2)),d=We(m,o),h=We(f,n);c.assign(m),l.assign(f);let g=ge(oe(We(d,ge(Rr(h),this.epsilon)),-this.learningRate),i);i.assign(g)}),this.accBeta1.assign(oe(this.accBeta1,this.beta1)),this.accBeta2.assign(oe(this.accBeta2,this.beta2))}),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.accBeta2.dispose(),this.accumulatedFirstMoment!=null&&Ft(this.accumulatedFirstMoment.map(e=>e.variable)),this.accumulatedSecondMoment!=null&&Ft(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),Ne(()=>{this.accBeta1.assign(Na(this.beta1,this.iterations_+1)),this.accBeta2.assign(Na(this.beta2,this.iterations_+1))});let t=e.length/2,o=!1;this.accumulatedFirstMoment=e.slice(0,t).map(n=>({originalName:n.name,variable:n.tensor.variable(o)})),this.accumulatedSecondMoment=e.slice(t,t*2).map(n=>({originalName:n.name,variable:n.tensor.variable(o)}))}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)}};bi.className="Adam";$r(bi);var Ci=class extends wr{constructor(e,t,o,n=null,s=0){super(),this.learningRate=e,this.beta1=t,this.beta2=o,this.epsilon=n,this.decay=s,this.accumulatedFirstMoment=[],this.accumulatedWeightedInfNorm=[],Ne(()=>{this.iteration=be(0).variable(),this.accBeta1=be(t).variable()}),n==null&&(this.epsilon=N.backend.epsilon())}applyGradients(e){let t=Array.isArray(e)?e.map(o=>o.name):Object.keys(e);Ne(()=>{let o=ke(1,this.accBeta1),n=We(-this.learningRate,ge(oe(this.iteration,this.decay),1));t.forEach((s,a)=>{let i=N.registeredVariables[s],p=!1;this.accumulatedFirstMoment[a]==null&&(this.accumulatedFirstMoment[a]={originalName:`${s}/m`,variable:Gt(i).variable(p)}),this.accumulatedWeightedInfNorm[a]==null&&(this.accumulatedWeightedInfNorm[a]={originalName:`${s}/v`,variable:Gt(i).variable(p)});let u=Array.isArray(e)?e[a].tensor:e[s];if(u==null)return;let c=this.accumulatedFirstMoment[a].variable,l=this.accumulatedWeightedInfNorm[a].variable,m=ge(oe(c,this.beta1),oe(u,1-this.beta1)),f=oe(l,this.beta2),d=Qt(u),h=Rf(f,d);c.assign(m),l.assign(h);let g=ge(oe(We(n,o),We(m,ge(h,this.epsilon))),i);i.assign(g)}),this.iteration.assign(ge(this.iteration,1)),this.accBeta1.assign(oe(this.accBeta1,this.beta1))}),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.iteration.dispose(),this.accumulatedFirstMoment!=null&&Ft(this.accumulatedFirstMoment.map(e=>e.variable)),this.accumulatedWeightedInfNorm!=null&&Ft(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)}};Ci.className="Adamax";$r(Ci);var Us=class extends wr{constructor(e){super(),this.learningRate=e,this.setLearningRate(e)}applyGradients(e){(Array.isArray(e)?e.map(o=>o.name):Object.keys(e)).forEach((o,n)=>{let s=Array.isArray(e)?e[n].tensor:e[o];if(s==null)return;let a=N.registeredVariables[o];Ne(()=>{let i=ge(oe(this.c,s),a);a.assign(i)})}),this.incrementIterations()}setLearningRate(e){this.learningRate=e,this.c!=null&&this.c.dispose(),this.c=So(be(-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)}};Us.className="SGD";$r(Us);var Ii=class extends Us{constructor(e,t,o=!1){super(e),this.learningRate=e,this.momentum=t,this.useNesterov=o,this.accumulations=[],this.m=be(this.momentum)}applyGradients(e){(Array.isArray(e)?e.map(o=>o.name):Object.keys(e)).forEach((o,n)=>{let s=N.registeredVariables[o];this.accumulations[n]==null&&(this.accumulations[n]={originalName:`${o}/momentum`,variable:Ne(()=>Gt(s).variable(!1))});let a=this.accumulations[n].variable,i=Array.isArray(e)?e[n].tensor:e[o];i!=null&&Ne(()=>{let p,u=ge(oe(this.m,a),i);this.useNesterov?p=ge(oe(this.c,ge(i,oe(u,this.m))),s):p=ge(oe(this.c,u),s),a.assign(u),s.assign(p)})}),this.incrementIterations()}dispose(){this.m.dispose(),this.accumulations!=null&&Ft(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(o=>({originalName:o.name,variable:o.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)}};Ii.className="Momentum";$r(Ii);var wi=class extends wr{constructor(e,t=.9,o=0,n=null,s=!1){if(super(),this.learningRate=e,this.decay=t,this.momentum=o,this.epsilon=n,this.accumulatedMeanSquares=[],this.accumulatedMoments=[],this.accumulatedMeanGrads=[],this.centered=s,n==null&&(this.epsilon=N.backend.epsilon()),e==null)throw new Error("learningRate for RMSPropOptimizer must be defined.")}applyGradients(e){(Array.isArray(e)?e.map(o=>o.name):Object.keys(e)).forEach((o,n)=>{let s=N.registeredVariables[o],a=!1;this.accumulatedMeanSquares[n]==null&&(this.accumulatedMeanSquares[n]={originalName:`${o}/rms`,variable:Ne(()=>Gt(s).variable(a))}),this.accumulatedMoments[n]==null&&(this.accumulatedMoments[n]={originalName:`${o}/momentum`,variable:Ne(()=>Gt(s).variable(a))}),this.accumulatedMeanGrads[n]==null&&this.centered&&(this.accumulatedMeanGrads[n]={originalName:`${o}/mg`,variable:Ne(()=>Gt(s).variable(a))});let i=Array.isArray(e)?e[n].tensor:e[o];if(i==null)return;let p=this.accumulatedMeanSquares[n].variable,u=this.accumulatedMoments[n].variable;Ne(()=>{let c=ge(oe(p,this.decay),oe(Zt(i),1-this.decay));if(this.centered){let l=this.accumulatedMeanGrads[n].variable,m=ge(oe(l,this.decay),oe(i,1-this.decay)),f=We(oe(i,this.learningRate),Rr(ke(c,ge(Zt(m),this.epsilon)))),d=ge(oe(u,this.momentum),f);p.assign(c),l.assign(m),u.assign(d);let h=ke(s,d);s.assign(h)}else{let l=ge(oe(p,this.decay),oe(Zt(i),1-this.decay)),m=ge(oe(u,this.momentum),We(oe(i,this.learningRate),Rr(ge(l,this.epsilon))));p.assign(l),u.assign(m);let f=ke(s,m);s.assign(f)}})}),this.incrementIterations()}dispose(){this.accumulatedMeanSquares!=null&&Ft(this.accumulatedMeanSquares.map(e=>e.variable)),this.accumulatedMeanGrads!=null&&this.centered&&Ft(this.accumulatedMeanGrads.map(e=>e.variable)),this.accumulatedMoments!=null&&Ft(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,o=!1;this.accumulatedMeanSquares=e.slice(0,t).map(n=>({originalName:n.name,variable:n.tensor.variable(o)})),this.accumulatedMoments=e.slice(t,t*2).map(n=>({originalName:n.name,variable:n.tensor.variable(o)})),this.centered&&(this.accumulatedMeanGrads=e.slice(t*2,t*3).map(n=>({originalName:n.name,variable:n.tensor.variable(o)})))}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)}};wi.className="RMSProp";$r(wi);var ns=class{static sgd(e){return new Us(e)}static momentum(e,t,o=!1){return new Ii(e,t,o)}static rmsprop(e,t=.9,o=0,n=null,s=!1){return new wi(e,t,o,n,s)}static adam(e=.001,t=.9,o=.999,n=null){return new bi(e,t,o,n)}static adadelta(e=.001,t=.95,o=null){return new xi(e,t,o)}static adamax(e=.002,t=.9,o=.999,n=null,s=0){return new Ci(e,t,o,n,s)}static adagrad(e,t=.1){return new yi(e,t)}};var pMe={sgd:ns.sgd,momentum:ns.momentum,adadelta:ns.adadelta,adagrad:ns.adagrad,rmsprop:ns.rmsprop,adamax:ns.adamax,adam:ns.adam};var qq=(()=>typeof requestAnimationFrame!="undefined"?requestAnimationFrame:typeof setImmediate!="undefined"?setImmediate:r=>r())();function kC(){return new Promise(r=>qq(()=>r()))}var I={};Be(I,{ERF_A1:()=>pK,ERF_A2:()=>cK,ERF_A3:()=>lK,ERF_A4:()=>mK,ERF_A5:()=>fK,ERF_P:()=>uK,PARALLELIZE_THRESHOLD:()=>ed,RowPartitionType:()=>Gs,SELU_SCALE:()=>iK,SELU_SCALEALPHA:()=>aK,applyActivation:()=>yu,assertAndGetBroadcastShape:()=>Je,assertAxesAreInnerMostDims:()=>fG,assertParamsConsistent:()=>Kq,assignToTypedArray:()=>bK,axesAreInnerMostDims:()=>fC,calculateShapes:()=>kv,checkEinsumDimSizes:()=>kK,checkPadOnDimRoundingMode:()=>Ot,combineLocations:()=>$k,combineRaggedTensorToTensorShapes:()=>Xq,complexWithEvenIndex:()=>gK,complexWithOddIndex:()=>xK,computeConv2DInfo:()=>uu,computeConv3DInfo:()=>Zv,computeDefaultPad:()=>mC,computeDilation2DInfo:()=>dU,computeOptimalWindowSize:()=>Jq,computeOutAndReduceShapes:()=>mG,computeOutShape:()=>jq,computePool2DInfo:()=>lC,computePool3DInfo:()=>hU,convertConv2DDataFormat:()=>Jv,decodeEinsumEquation:()=>SK,eitherStridesOrDilationsAreOne:()=>lr,expandShapeToKeepDim:()=>Ta,exponent:()=>IK,exponents:()=>CK,fromStringArrayToUint8:()=>qK,fromUint8ToStringArray:()=>HK,getAxesPermutation:()=>dG,getBroadcastDims:()=>Iv,getComplexWithIndex:()=>yK,getEinsumComputePath:()=>TK,getEinsumPermutation:()=>vK,getFusedBiasGradient:()=>xu,getFusedDyActivation:()=>gu,getImageCenter:()=>eK,getInnerMostAxes:()=>gG,getPermuted:()=>rK,getRaggedRank:()=>Qq,getReductionAxes:()=>nf,getReshaped:()=>tK,getReshapedPermuted:()=>oK,getRowPartitionTypesHelper:()=>Yq,getSliceBeginCoords:()=>nK,getSliceSize:()=>sK,getSparseFillEmptyRowsIndicesDenseShapeMismatch:()=>$K,getSparseFillEmptyRowsNegativeIndexErrorMessage:()=>RK,getSparseFillEmptyRowsOutOfRangeIndexErrorMessage:()=>AK,getSparseReshapeEmptyTensorZeroOutputDimErrorMessage:()=>PK,getSparseReshapeInputOutputMismatchErrorMessage:()=>MK,getSparseReshapeInputOutputMultipleErrorMessage:()=>OK,getSparseReshapeMultipleNegativeOneOutputDimErrorMessage:()=>FK,getSparseReshapeNegativeOutputDimErrorMessage:()=>DK,getSparseSegmentReductionIndicesOutOfRangeErrorMessage:()=>zK,getSparseSegmentReductionNegativeSegmentIdsErrorMessage:()=>LK,getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage:()=>BK,getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage:()=>VK,getUndoAxesPermutation:()=>hG,isIdentityPermutation:()=>NK,log:()=>Sz,mergeRealAndImagArrays:()=>dK,prepareAndValidate:()=>vv,prepareSplitSize:()=>EK,segment_util:()=>NC,shouldFuse:()=>bu,slice_util:()=>et,splitRealAndImagArrays:()=>hK,tupleValuesAreOne:()=>iu,upcastType:()=>ct,validateDefaultValueShape:()=>Zq,validateInput:()=>uf,validateUpdateShape:()=>aC,warn:()=>Rs});function Kq(r,e){let t=r[0].length;r.forEach((n,s)=>{$(n.length===t,()=>`Error in concat${t}D: rank of tensors[${s}] must be the same as the rank of the rest (${t})`)}),$(e>=0&&e`Error in concat${t}D: axis must be between 0 and ${t-1}.`);let o=r[0];r.forEach((n,s)=>{for(let a=0;a`Error in concat${t}D: Shape of tensors[${s}] (${n}) does not match the shape of the rest (${o}) along the non-concatenated axis ${s}.`)})}function jq(r,e){let t=r[0].slice();for(let o=1;o=0)if(i>=0){if(i!==s)throw new Error(`rt input.shape and shape=${e} are incompatible: rt input.shape[${n+r}] = ${s} but shape[${n+r}] = ${i}`)}else o[a]=s}return o}function Yq(r){let e={FIRST_DIM_SIZE:Gs.FIRST_DIM_SIZE,VALUE_ROWIDS:Gs.VALUE_ROWIDS,ROW_LENGTHS:Gs.ROW_LENGTHS,ROW_SPLITS:Gs.ROW_SPLITS,ROW_LIMITS:Gs.ROW_LIMITS,ROW_STARTS:Gs.ROW_STARTS},t=[];for(let o of r)if(o in e)t.push(e[o]);else break;return t}function Qq(r){return r.length===0?0:r[0]===Gs.FIRST_DIM_SIZE?r.length-1:r.length}function Zq(r,e){if(r==null||e==null)return;let t=r.length,o=e.length;if(t>=o)throw new Error(`defaultValue.shape=${r} and ragged tensor flatValues.shape=${e}, are incompatible: defaultValue.rank = ${t} must be less than ragged tensor input flatValues.rank = ${o})`);for(let n=0;n=0&&a>=0&&s!==1&&s!==a)throw new Error(`defaultValue.shape=${r}, and ragged tensor input flatValues.shape=${e} are incompatible: defaultValue.shape[${n-r.length}] = ${s} but ragged tensor input.flatValues.shape[${n-r.length}] = ${a}`)}}var ed=30;function Jq(r){return r<=ed?r:sp(r,Math.floor(Math.sqrt(r)))}function eK(r,e,t){let o=t*(typeof r=="number"?r:r[0]),n=e*(typeof r=="number"?r:r[1]);return[o,n]}function tK(r,e,t,o=!0){let n=[];if(o)n=n.concat(e.slice(0)),n.push(r[0]/t),n=n.concat(r.slice(1));else{n=n.concat(r[0]);let s=e.length;for(let a=0;a=e*2+1||a%2===1?s.push(a):n.push(a);o.push(...n),o.push(0),o.push(...s)}return o}function oK(r,e,t,o=!0){let n=[];o?n.push(r[0]/t):n.push(r[0]*t);for(let s=1;s/g,KT=",",jT="...";function SK(r,e){r=r.replace(/\s/g,"");let t=(r.length-r.replace(wK,"").length)/TC.length;if(t<1)throw new Error("Equations without an arrow are not supported.");if(t>1)throw new Error(`Equation must contain exactly one arrow ("${TC}").`);let[o,n]=r.split(TC);$(o.indexOf(jT)===-1,()=>`The ellipsis notation ("${jT}") is not supported yet.`);let s=o.split(KT),a=s.length;if(e!==a)throw new Error(`Expected ${a} input tensors, received ${e}`);if(a>2)throw new Error("Support for more than 2 input tensors is not implemented yet.");let i=[];for(let m=0;md.indexOf(f)!==-1))throw new Error(`Output subscripts contain the label ${f} not present in the input subscripts.`);i.indexOf(f)===-1&&i.push(f)}for(let m=0;mn!==-1),{permutationIndices:t,expandDims:o}}function kK(r,e,t){let o=new Array(r);for(let n=0;n`Expected dimension ${o[e[n][a]]} at axis ${a} of input shaped ${JSON.stringify(s)}, but got dimension ${s[a]}`)}}function TK(r,e){let t=r,o=[],n=0;r.length===0&&t.push(-1),n=r.length+1;for(let a=0;ae===t)}function _K(r,e){let t=[];for(let o=0;o"Number of splits must evenly divide the axis."),o=new Array(e).fill(r.shape[t]/e);else{let n=e.reduce((a,i)=>(i===-1&&(a+=1),a),0);$(n<=1,()=>"There should be only one negative value in split array.");let s=e.indexOf(-1);if(s!==-1){let a=e.reduce((i,p)=>p>0?i+p:i);e[s]=r.shape[t]-a}$(r.shape[t]===e.reduce((a,i)=>a+i),()=>"The sum of sizes must match the size of the axis dimension."),o=e}return o}function $K(r){return`Received SparseTensor with denseShape[0] = 0 but + indices.shape[0] = ${r}`}function RK(r,e){return`indices(${r}, 0) is invalid: ${e} < 0`}function AK(r,e,t){return`indices(${r}, 0) is invalid: ${e} >= ${t}`}function FK(r,e){return`only one output dimension may be -1, not both ${r} and ${e}`}function DK(r,e){return`size ${r} must be non-negative, not ${e}`}function PK(){return"reshape cannot infer the missing input size for an empty tensor unless all specified input sizes are non-zero"}function OK(r,e){let t=Ve(r),o=Ve(e);return`Input to reshape is a SparseTensor with ${t} + dense values, but the requested shape requires a multiple of ${o}. inputShape=${r} outputShape= ${e}`}function MK(r,e){let t=Ve(r),o=Ve(e);return`Input to reshape is a tensor with ${t} dense values, but the requested shape has ${o}. inputShape=${r} outputShape=${e}`}function LK(){return"segment ids must be >= 0"}function BK(){return"segment ids are not increasing"}function VK(r,e){return`Segment id ${r} out of range [0, ${e}), possibly because segmentIds input is not sorted.`}function zK(r,e,t){return`Bad: indices[${r}] == ${e} out of range [0, ${t})`}var NC={};Be(NC,{collectGatherOpShapeInfo:()=>GK,computeOutShape:()=>UK,segOpComputeOptimalWindowSize:()=>WK});function WK(r,e){let t=!1,o;for(r<=ed?(o=r,t=!0):o=sp(r,Math.floor(Math.sqrt(r)));!t;)o>e||o===r?t=!0:o=sp(r,o+1);return o}function UK(r,e,t){let o=[],n=r.length;for(let s=0;sn))throw new Error(`Expect batchDims in the range of [-${n}, ${n}], but got ${o}`);if(o<0&&(o+=n),o>s)throw new Error(`batchDims (${o}) must be less than rank(x) ( + ${s}).`);if(tOp(e))}catch(e){throw new Error(`Failed to decode encoded string bytes into utf-8, error: ${e}`)}}function qK(r){return r.map(e=>si(e))}var Bt={};Be(Bt,{nonMaxSuppressionV3Impl:()=>Qf,nonMaxSuppressionV4Impl:()=>Zf,nonMaxSuppressionV5Impl:()=>Jf,whereImpl:()=>Kf});var KK=P();KK.registerFlag("KEEP_INTERMEDIATE_TENSORS",()=>!1,r=>{r&&console.warn("Keep intermediate tensors is ON. This will print the values of all intermediate tensors during model inference. Not all models support this mode. For details, check e2e/benchmarks/ model_config.js. This significantly impacts performance.")});var To;(function(r){r[r.DT_INVALID=0]="DT_INVALID",r[r.DT_FLOAT=1]="DT_FLOAT",r[r.DT_DOUBLE=2]="DT_DOUBLE",r[r.DT_INT32=3]="DT_INT32",r[r.DT_UINT8=4]="DT_UINT8",r[r.DT_INT16=5]="DT_INT16",r[r.DT_INT8=6]="DT_INT8",r[r.DT_STRING=7]="DT_STRING",r[r.DT_COMPLEX64=8]="DT_COMPLEX64",r[r.DT_INT64=9]="DT_INT64",r[r.DT_BOOL=10]="DT_BOOL",r[r.DT_QINT8=11]="DT_QINT8",r[r.DT_QUINT8=12]="DT_QUINT8",r[r.DT_QINT32=13]="DT_QINT32",r[r.DT_BFLOAT16=14]="DT_BFLOAT16",r[r.DT_QINT16=15]="DT_QINT16",r[r.DT_QUINT16=16]="DT_QUINT16",r[r.DT_UINT16=17]="DT_UINT16",r[r.DT_COMPLEX128=18]="DT_COMPLEX128",r[r.DT_HALF=19]="DT_HALF",r[r.DT_RESOURCE=20]="DT_RESOURCE",r[r.DT_VARIANT=21]="DT_VARIANT",r[r.DT_UINT32=22]="DT_UINT32",r[r.DT_UINT64=23]="DT_UINT64",r[r.DT_FLOAT_REF=101]="DT_FLOAT_REF",r[r.DT_DOUBLE_REF=102]="DT_DOUBLE_REF",r[r.DT_INT32_REF=103]="DT_INT32_REF",r[r.DT_UINT8_REF=104]="DT_UINT8_REF",r[r.DT_INT16_REF=105]="DT_INT16_REF",r[r.DT_INT8_REF=106]="DT_INT8_REF",r[r.DT_STRING_REF=107]="DT_STRING_REF",r[r.DT_COMPLEX64_REF=108]="DT_COMPLEX64_REF",r[r.DT_INT64_REF=109]="DT_INT64_REF",r[r.DT_BOOL_REF=110]="DT_BOOL_REF",r[r.DT_QINT8_REF=111]="DT_QINT8_REF",r[r.DT_QUINT8_REF=112]="DT_QUINT8_REF",r[r.DT_QINT32_REF=113]="DT_QINT32_REF",r[r.DT_BFLOAT16_REF=114]="DT_BFLOAT16_REF",r[r.DT_QINT16_REF=115]="DT_QINT16_REF",r[r.DT_QUINT16_REF=116]="DT_QUINT16_REF",r[r.DT_UINT16_REF=117]="DT_UINT16_REF",r[r.DT_COMPLEX128_REF=118]="DT_COMPLEX128_REF",r[r.DT_HALF_REF=119]="DT_HALF_REF",r[r.DT_RESOURCE_REF=120]="DT_RESOURCE_REF",r[r.DT_VARIANT_REF=121]="DT_VARIANT_REF",r[r.DT_UINT32_REF=122]="DT_UINT32_REF",r[r.DT_UINT64_REF=123]="DT_UINT64_REF"})(To||(To={}));var XT;(function(r){let e;(function(t){t[t.LEGACY=0]="LEGACY",t[t.V1=1]="V1",t[t.V2=2]="V2"})(e=r.CheckpointFormatVersion||(r.CheckpointFormatVersion={}))})(XT||(XT={}));var EC={};function XK(r,e){let t={tfOpName:r,category:"custom",inputs:[],attrs:[],customExecutor:e};EC[r]=t}function td(r){return EC[r]}function YK(r){delete EC[r]}function S(r,e,t,o,n){let s=e.inputParams[r];if(s&&s.inputIndexStart!==void 0){let i=s.inputIndexStart,p=s.inputIndexEnd===0?void 0:s.inputIndexEnd===void 0?i+1:s.inputIndexEnd;if(s.type==="tensor")return Ht(e.inputNames[s.inputIndexStart],t,o,n);if(s.type==="tensors")return e.inputNames.slice(i,p).map(m=>Ht(m,t,o,n));let u=Ht(e.inputNames.slice(i)[0],t,o,n),c=u.dataSync();return s.type==="number"?c[0]:x.toNestedArray(u.shape,c)}let a=e.attrParams[r];return a&&a.value}function Ht(r,e,t,o){let[n,s]=Sr(r);if(o!=null){let i=o.getHashTableHandleByName(n);if(i!=null)return i}let a=t.currentContextIds.find(i=>!!e[rd(n,i)]);return a!==void 0?e[rd(n,a)][s]:void 0}function YT(r,e,t){return e[rd(r,t.currentContextId)]}function zo(r,e){let[t,o,n]=Sr(r);return[rd(t,e&&e.currentContextId),o,n]}function rd(r,e){return e?`${r}-${e}`:r}function Sr(r){let e=r.split(":");if(e.length===1)return[r,0,void 0];let t=e[0],o=e.length===3?e[1]:void 0,n=Number(e[e.length-1]);return[t,n,o]}function gl(r,e,t){let o=S("pad",r,e,t);if(o==="explicit"){o=S("explicitPaddings",r,e,t);let n=[[0,0],[0,0],[0,0],[0,0]];for(let s=0;s<4;s++)n[s][0]=o[s*2],n[s][1]=o[s*2+1];return n}return o}function ss(r){return r.kept?r:zr(r)}var $C={};Be($C,{json:()=>QK});var QK=[{tfOpName:"Add",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"AddV2",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"AddN",category:"arithmetic",inputs:[{start:0,end:0,name:"tensors",type:"tensors"}]},{tfOpName:"BiasAdd",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0}]},{tfOpName:"Sub",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"RealDiv",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Div",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"DivNoNan",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"FloorDiv",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Mul",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Maximum",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Minimum",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Pow",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"SquaredDifference",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Mod",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"FloorMod",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]}];var RC={};Be(RC,{json:()=>ZK});var ZK=[{tfOpName:"Abs",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Acos",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Asin",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Atan",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Atan2",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"y",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Ceil",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"ClipByValue",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"clipValueMin",type:"number"},{start:2,name:"clipValueMax",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Complex",category:"basic_math",inputs:[{start:0,name:"real",type:"tensor"},{start:1,name:"imag",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"ComplexAbs",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Cos",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Cosh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Elu",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Exp",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Floor",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Log",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Imag",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"Tout",name:"outputType",type:"dtype",notSupported:!0}]},{tfOpName:"Neg",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Real",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"Tout",name:"outputType",type:"dtype",notSupported:!0}]},{tfOpName:"Prelu",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"alpha",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Relu",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Relu6",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Selu",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Sigmoid",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Sin",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Sinh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Sqrt",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Rsqrt",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Square",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Tan",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Tanh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Sign",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Round",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Expm1",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Log1p",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Reciprocal",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Softplus",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Asinh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Acosh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Atanh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Erf",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Prod",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axes",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool",notSupported:!0},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"LeakyRelu",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"alpha",name:"alpha",type:"number",defaultValue:.2},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"IsNan",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]}];var AC={};Be(AC,{json:()=>JK});var JK=[{tfOpName:"EmptyTensorList",category:"control",inputs:[{start:0,name:"elementShape",type:"shape"},{start:1,name:"maxNumElements",type:"number"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"LoopCond",category:"control",inputs:[{start:0,name:"pred",type:"tensor"}]},{tfOpName:"Switch",category:"control",inputs:[{start:0,name:"data",type:"tensor"},{start:1,name:"pred",type:"tensor"}]},{tfOpName:"Merge",category:"control",inputs:[{start:0,end:0,name:"tensors",type:"tensors"}]},{tfOpName:"Enter",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"frame_name",name:"frameName",type:"string"},{tfName:"is_constant",name:"isConstant",type:"bool"}]},{tfOpName:"Exit",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"NextIteration",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"TensorArrayV3",category:"control",inputs:[{start:0,name:"size",type:"number"}],attrs:[{tfName:"dtype",name:"dtype",type:"dtype"},{tfName:"element_shape",name:"elementShape",type:"shape"},{tfName:"dynamic_size",name:"dynamicSize",type:"bool"},{tfName:"clear_after_read",name:"clearAfterRead",type:"bool"},{tfName:"identical_element_shapes",name:"identicalElementShapes",type:"bool"},{tfName:"tensor_array_name",name:"name",type:"string"}]},{tfOpName:"TensorArrayWriteV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"index",type:"number"},{start:2,name:"tensor",type:"tensor"},{start:3,name:"flowIn",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"TensorArrayReadV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"index",type:"number"},{start:2,name:"flowIn",type:"number"}],attrs:[{tfName:"dtype",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"TensorArrayGatherV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"indices",type:"number[]"},{start:2,name:"flowIn",type:"number"}],attrs:[{tfName:"dtype",name:"dtype",type:"dtype"},{tfName:"element_shape",name:"elementShape",type:"shape"}]},{tfOpName:"TensorArrayScatterV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"indices",type:"number[]"},{start:2,name:"tensor",type:"tensor"},{start:3,name:"flowIn",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"TensorArrayConcatV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"flowIn",type:"number"}],attrs:[{tfName:"dtype",name:"dtype",type:"dtype"},{tfName:"element_shape_except0",name:"elementShapeExcept0",type:"shape",notSupported:!0}]},{tfOpName:"TensorArraySplitV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"tensor",type:"tensor"},{start:2,name:"lengths",type:"number[]"},{start:3,name:"flowIn",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"TensorArraySizeV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"flowIn",type:"number"}]},{tfOpName:"TensorArrayCloseV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"}]},{tfOpName:"StatelessIf",category:"control",inputs:[{start:0,name:"cond",type:"tensor"},{start:1,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"then_branch",name:"thenBranch",type:"func"},{tfName:"else_branch",name:"elseBranch",type:"func"}]},{tfOpName:"If",category:"control",inputs:[{start:0,name:"cond",type:"tensor"},{start:1,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"then_branch",name:"thenBranch",type:"func"},{tfName:"else_branch",name:"elseBranch",type:"func"}]},{tfOpName:"StatelessWhile",category:"control",inputs:[{start:0,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"cond",name:"cond",type:"func"},{tfName:"body",name:"body",type:"func"}]},{tfOpName:"While",category:"control",inputs:[{start:0,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"cond",name:"cond",type:"func"},{tfName:"body",name:"body",type:"func"}]},{tfOpName:"TensorListScatter",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"},{start:1,name:"indices",type:"number[]"},{start:2,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListScatterV2",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"},{start:1,name:"indices",type:"number[]"},{start:2,name:"elementShape",type:"shape"},{start:3,name:"numElements",type:"number"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListGather",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"indices",type:"number[]"},{start:2,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListGetItem",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"index",type:"number"},{start:2,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListSetItem",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"index",type:"number"},{start:2,name:"tensor",type:"tensor"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListReserve",category:"control",inputs:[{start:0,name:"elementShape",type:"shape"},{start:1,name:"numElements",type:"number"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListFromTensor",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"},{start:1,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListStack",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"},{tfName:"num_elements",name:"numElements",type:"dtype"}]},{tfOpName:"TensorListSplit",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"},{start:1,name:"elementShape",type:"shape"},{start:2,name:"lengths",type:"number[]"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListConcat",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"}],attrs:[{tfName:"element_shape",name:"elementShape",type:"shape"},{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListConcatV2",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"}],attrs:[{tfName:"element_shape",name:"elementShape",type:"shape"},{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListPopBack",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListPushBack",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"tensor",type:"tensor"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListLength",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"}]},{tfOpName:"TensorListResize",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"size",type:"number"}]}];var FC={};Be(FC,{json:()=>e6});var e6=[{tfOpName:"AvgPool",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0},{tfName:"ksize",name:"kernelSize",type:"number[]"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"MaxPool",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0},{tfName:"ksize",name:"kernelSize",type:"number[]"},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[],notSupported:!0},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"MaxPoolWithArgmax",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"ksize",name:"kernelSize",type:"number[]"},{tfName:"include_batch_in_index",name:"includeBatchInIndex",type:"bool"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"AvgPool3D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0},{tfName:"ksize",name:"kernelSize",type:"number[]"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"MaxPool3D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0},{tfName:"ksize",name:"kernelSize",type:"number[]"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Conv1D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"stride",name:"stride",type:"number"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NWC"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"dilation",name:"dilation",type:"number",defaultValue:1}]},{tfOpName:"Conv2D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"useCudnnOnGpu",name:"useCudnnOnGpu",type:"bool"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]},{tfName:"dilations",name:"dilations",type:"number[]"}]},{tfOpName:"_FusedConv2D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"},{start:2,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"num_args",name:"numArgs",type:"number"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]},{tfName:"use_cudnn_on_gpu",name:"useCudnnOnGpu",type:"bool",defaultValue:!0},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"dilations",name:"dilations",type:"number[]",defaultValue:[1,1,1,1]},{tfName:"fused_ops",name:"fusedOps",type:"string[]",defaultValue:[]},{tfName:"epsilon",name:"epsilon",type:"number",defaultValue:1e-4},{tfName:"leakyrelu_alpha",name:"leakyreluAlpha",type:"number",defaultValue:.2}]},{tfOpName:"Conv2DBackpropInput",category:"convolution",inputs:[{start:2,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"},{start:0,name:"outputShape",type:"number[]"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]},{tfName:"dilations",name:"dilations",type:"number[]",notSupported:!0}]},{tfOpName:"DepthwiseConv2d",category:"convolution",inputs:[{start:0,name:"input",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]},{tfName:"dilations",name:"dilations",type:"number[]"}]},{tfOpName:"DepthwiseConv2dNative",category:"convolution",inputs:[{start:0,name:"input",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]},{tfName:"dilations",name:"dilations",type:"number[]"}]},{tfOpName:"FusedDepthwiseConv2dNative",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"},{start:2,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"num_args",name:"numArgs",type:"number"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"dilations",name:"dilations",type:"number[]",defaultValue:[1,1,1,1]},{tfName:"fused_ops",name:"fusedOps",type:"string[]",defaultValue:[]},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]}]},{tfOpName:"Conv3D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"dilations",name:"dilations",type:"number[]"}]},{tfOpName:"Dilation2D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"rates",name:"dilations",type:"number[]"},{tfName:"padding",name:"pad",type:"string"}]}];var DC={};Be(DC,{json:()=>t6});var t6=[{tfOpName:"Fill",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"},{start:1,name:"value",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"LinSpace",category:"creation",inputs:[{start:0,name:"start",type:"number"},{start:1,name:"stop",type:"number"},{start:2,name:"num",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"OneHot",category:"creation",inputs:[{start:0,name:"indices",type:"tensor"},{start:1,name:"depth",type:"number"},{start:2,name:"onValue",type:"number",defaultValue:1},{start:3,name:"offValue",type:"number",defaultValue:0}],attrs:[{tfName:"axis",name:"axis",type:"number",notSupported:!0},{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"Ones",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"OnesLike",category:"creation",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"dtype",name:"dtype",type:"dtype"}]},{tfOpName:"RandomStandardNormal",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"}],attrs:[{tfName:"seed",name:"seed",type:"number",defaultValue:0},{tfName:"seed2",name:"seed2",type:"number",defaultValue:0,notSupported:!0},{tfName:"dtype",name:"dtype",type:"dtype"},{tfName:"T",name:"T",type:"number",notSupported:!0}]},{tfOpName:"RandomUniform",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"}],attrs:[{tfName:"minval",name:"minval",type:"number",defaultValue:0},{tfName:"maxval",name:"maxval",type:"number",defaultValue:1},{tfName:"dtype",name:"dtype",type:"dtype"},{tfName:"seed",name:"seed",type:"number",defaultValue:0},{tfName:"seed2",name:"seed2",type:"number",defaultValue:0,notSupported:!0},{tfName:"T",name:"T",type:"number",notSupported:!0}]},{tfOpName:"Range",category:"creation",inputs:[{start:0,name:"start",type:"number"},{start:1,name:"stop",type:"number"},{start:2,name:"step",type:"number",defaultValue:0}],attrs:[{tfName:"Tidx",name:"dtype",type:"dtype"}]},{tfOpName:"TruncatedNormal",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"}],attrs:[{tfName:"means",name:"mean",type:"number",defaultValue:0},{tfName:"stddev",name:"stdDev",type:"number",defaultValue:1},{tfName:"seed",name:"seed",type:"number"},{tfName:"seed2",name:"seed2",type:"number",defaultValue:0,notSupported:!0},{tfName:"dtype",name:"dtype",type:"dtype"},{tfName:"T",name:"T",type:"number",notSupported:!0}]},{tfOpName:"Zeros",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"ZerosLike",category:"creation",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"Multinomial",category:"creation",inputs:[{start:0,name:"logits",type:"tensor"},{start:1,name:"numSamples",type:"number"}],attrs:[{tfName:"seed",name:"seed",type:"number"},{tfName:"seed2",name:"seed2",type:"number"},{tfName:"T",name:"dtype",type:"dtype"},{tfName:"output_dtype",name:"output_dtype",type:"dtype"}]}];var PC={};Be(PC,{json:()=>r6});var r6=[{tfOpName:"NonMaxSuppressionV2",category:"dynamic",inputs:[{start:0,name:"boxes",type:"tensor"},{start:1,name:"scores",type:"tensor"},{start:2,name:"maxOutputSize",type:"number"},{start:3,name:"iouThreshold",type:"number"}]},{tfOpName:"NonMaxSuppressionV3",category:"dynamic",inputs:[{start:0,name:"boxes",type:"tensor"},{start:1,name:"scores",type:"tensor"},{start:2,name:"maxOutputSize",type:"number"},{start:3,name:"iouThreshold",type:"number"},{start:4,name:"scoreThreshold",type:"number"}]},{tfOpName:"NonMaxSuppressionV4",category:"dynamic",inputs:[{start:0,name:"boxes",type:"tensor"},{start:1,name:"scores",type:"tensor"},{start:2,name:"maxOutputSize",type:"number"},{start:3,name:"iouThreshold",type:"number"},{start:4,name:"scoreThreshold",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"T_threshold",name:"threshold",type:"dtype",notSupported:!0},{tfName:"pad_to_max_output_size",name:"padToMaxOutputSize",type:"bool"}]},{tfOpName:"NonMaxSuppressionV5",category:"dynamic",inputs:[{start:0,name:"boxes",type:"tensor"},{start:1,name:"scores",type:"tensor"},{start:2,name:"maxOutputSize",type:"number"},{start:3,name:"iouThreshold",type:"number"},{start:4,name:"scoreThreshold",type:"number"},{start:5,name:"softNmsSigma",type:"number"}]},{tfOpName:"Where",category:"dynamic",inputs:[{start:0,name:"condition",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"ListDiff",category:"dynamic",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"y",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]}];var OC={};Be(OC,{json:()=>o6});var o6=[{tfOpName:"LowerBound",category:"evaluation",inputs:[{start:0,name:"sortedSequence",type:"tensor"},{start:1,name:"values",type:"tensor"}]},{tfOpName:"TopKV2",category:"evaluation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"k",type:"number"}],attrs:[{tfName:"sorted",name:"sorted",type:"bool"}]},{tfOpName:"UpperBound",category:"evaluation",inputs:[{start:0,name:"sortedSequence",type:"tensor"},{start:1,name:"values",type:"tensor"}]},{tfOpName:"Unique",category:"evaluation",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"UniqueV2",category:"evaluation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number"}]}];var MC={};Be(MC,{json:()=>n6});var n6=[{tfOpName:"PlaceholderWithDefault",category:"graph",inputs:[{start:0,name:"default",type:"tensor"}],attrs:[{tfName:"shape",name:"shape",type:"shape"},{tfName:"dtype",name:"dtype",type:"dtype"}]},{tfOpName:"Placeholder",category:"graph",attrs:[{tfName:"shape",name:"shape",type:"shape"},{tfName:"dtype",name:"dtype",type:"dtype"}]},{tfOpName:"Const",category:"graph"},{tfOpName:"Identity",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"IdentityN",category:"graph",inputs:[{start:0,end:0,name:"x",type:"tensors"}]},{tfOpName:"Snapshot",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"Rank",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"Size",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"Shape",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"ShapeN",category:"graph",inputs:[{start:0,end:0,name:"x",type:"tensors"}]},{tfOpName:"Print",category:"graph",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"data",type:"tensors"}],attrs:[{tfName:"message",name:"message",type:"string"},{tfName:"first_n",name:"firstN",type:"number",notSupported:!0},{tfName:"summarize",name:"summarize",type:"number",defaultValue:3}]},{tfOpName:"NoOp",category:"graph",inputs:[]},{tfOpName:"StopGradient",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"FakeQuantWithMinMaxVars",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"min",name:"min",type:"number"},{tfName:"max",name:"max",type:"number"}]}];var LC={};Be(LC,{json:()=>s6});var s6=[{tfOpName:"HashTable",category:"hash_table",inputs:[],attrs:[{tfName:"shared_name",name:"sharedName",type:"string"},{tfName:"use_node_name_sharing",name:"useNodeNameSharing",type:"bool"},{tfName:"key_dtype",name:"keyDType",type:"dtype"},{tfName:"value_dtype",name:"valueDType",type:"dtype"}]},{tfOpName:"HashTableV2",category:"hash_table",inputs:[],attrs:[{tfName:"shared_name",name:"sharedName",type:"string"},{tfName:"use_node_name_sharing",name:"useNodeNameSharing",type:"bool"},{tfName:"key_dtype",name:"keyDType",type:"dtype"},{tfName:"value_dtype",name:"valueDType",type:"dtype"}]},{tfOpName:"LookupTableImport",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"},{start:1,name:"keys",type:"tensor"},{start:2,name:"values",type:"tensor"}],attrs:[{tfName:"Tin",name:"tIn",type:"dtype",notSupported:!0},{tfName:"Tout",name:"tOut",type:"dtype",notSupported:!0}]},{tfOpName:"LookupTableImportV2",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"},{start:1,name:"keys",type:"tensor"},{start:2,name:"values",type:"tensor"}],attrs:[{tfName:"Tin",name:"tIn",type:"dtype",notSupported:!0},{tfName:"Tout",name:"tOut",type:"dtype",notSupported:!0}]},{tfOpName:"LookupTableFind",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"},{start:1,name:"keys",type:"tensor"},{start:2,name:"defaultValue",type:"tensor"}],attrs:[{tfName:"Tin",name:"tIn",type:"dtype",notSupported:!0},{tfName:"Tout",name:"tOut",type:"dtype",notSupported:!0}]},{tfOpName:"LookupTableFindV2",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"},{start:1,name:"keys",type:"tensor"},{start:2,name:"defaultValue",type:"tensor"}],attrs:[{tfName:"Tin",name:"tIn",type:"dtype",notSupported:!0},{tfName:"Tout",name:"tOut",type:"dtype",notSupported:!0}]},{tfOpName:"LookupTableSize",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"}]},{tfOpName:"LookupTableSizeV2",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"}]}];var BC={};Be(BC,{json:()=>a6});var a6=[{tfOpName:"ResizeBilinear",category:"image",inputs:[{start:0,name:"images",type:"tensor"},{start:1,name:"size",type:"number[]"}],attrs:[{tfName:"align_corners",name:"alignCorners",type:"bool"},{tfName:"half_pixel_centers",name:"halfPixelCenters",type:"bool"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"ResizeNearestNeighbor",category:"image",inputs:[{start:0,name:"images",type:"tensor"},{start:1,name:"size",type:"number[]"}],attrs:[{tfName:"align_corners",name:"alignCorners",type:"bool"},{tfName:"half_pixel_centers",name:"halfPixelCenters",type:"bool"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"CropAndResize",category:"image",inputs:[{start:0,name:"image",type:"tensor"},{start:1,name:"boxes",type:"tensor"},{start:2,name:"boxInd",type:"tensor"},{start:3,name:"cropSize",type:"number[]"}],attrs:[{tfName:"method",name:"method",type:"string"},{tfName:"extrapolation_value",name:"extrapolationValue",type:"number"}]},{tfOpName:"ImageProjectiveTransformV3",category:"image",inputs:[{start:0,name:"images",type:"tensor"},{start:1,name:"transforms",type:"tensor"},{start:2,name:"outputShape",type:"number[]"},{start:3,name:"fillValue",type:"number"}],attrs:[{tfName:"interpolation",name:"interpolation",type:"string"},{tfName:"fill_mode",name:"fillMode",type:"string"}]}];var VC={};Be(VC,{json:()=>i6});var i6=[{tfOpName:"Equal",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"NotEqual",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Greater",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"GreaterEqual",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Less",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"LessEqual",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"LogicalAnd",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"LogicalNot",category:"logical",inputs:[{start:0,name:"a",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"LogicalOr",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Select",category:"logical",inputs:[{start:0,name:"condition",type:"tensor"},{start:1,name:"a",type:"tensor"},{start:2,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"SelectV2",category:"logical",inputs:[{start:0,name:"condition",type:"tensor"},{start:1,name:"a",type:"tensor"},{start:2,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]}];var zC={};Be(zC,{json:()=>u6});var u6=[{tfOpName:"_FusedMatMul",category:"matrices",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"},{start:2,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"num_args",name:"numArgs",type:"number"},{tfName:"fused_ops",name:"fusedOps",type:"string[]",defaultValue:[]},{tfName:"epsilon",name:"epsilon",type:"number",defaultValue:1e-4},{tfName:"transpose_a",name:"transposeA",type:"bool",defaultValue:!1},{tfName:"transpose_b",name:"transposeB",type:"bool",defaultValue:!1},{tfName:"leakyrelu_alpha",name:"leakyreluAlpha",type:"number",defaultValue:.2},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"MatMul",category:"matrices",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"transpose_a",name:"transposeA",type:"bool",defaultValue:!1},{tfName:"transpose_b",name:"transposeB",type:"bool",defaultValue:!1},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"BatchMatMul",category:"matrices",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"adj_x",name:"transposeA",type:"bool",defaultValue:!1},{tfName:"adj_y",name:"transposeB",type:"bool",defaultValue:!1},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"BatchMatMulV2",category:"matrices",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"adj_x",name:"transposeA",type:"bool",defaultValue:!1},{tfName:"adj_y",name:"transposeB",type:"bool",defaultValue:!1},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Transpose",category:"matrices",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"perm",type:"number[]"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Einsum",category:"matrices",inputs:[{start:0,end:0,name:"tensors",type:"tensors"}],attrs:[{tfName:"equation",name:"equation",type:"string"},{tfName:"N",name:"n",type:"number",defaultValue:2},{tfName:"T",name:"dtype",type:"dtype"}]}];var WC={};Be(WC,{json:()=>p6});var p6=[{tfOpName:"EuclideanNorm",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool",defaultValue:!1}]},{tfOpName:"FusedBatchNorm",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"scale",type:"tensor"},{start:2,name:"offset",type:"tensor"},{start:3,name:"mean",type:"tensor"},{start:4,name:"variance",type:"tensor"}],attrs:[{tfName:"epsilon",name:"epsilon",type:"number",defaultValue:.001},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0}]},{tfOpName:"FusedBatchNormV2",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"scale",type:"tensor"},{start:2,name:"offset",type:"tensor"},{start:3,name:"mean",type:"tensor"},{start:4,name:"variance",type:"tensor"}],attrs:[{tfName:"epsilon",name:"epsilon",type:"number",defaultValue:.001},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0}]},{tfOpName:"FusedBatchNormV3",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"scale",type:"tensor"},{start:2,name:"offset",type:"tensor"},{start:3,name:"mean",type:"tensor"},{start:4,name:"variance",type:"tensor"}],attrs:[{tfName:"epsilon",name:"epsilon",type:"number",defaultValue:.001},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0}]},{tfOpName:"LRN",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"depth_radius",name:"radius",type:"number",defaultValue:5},{tfName:"bias",name:"bias",type:"number",defaultValue:1},{tfName:"alpha",name:"alpha",type:"number",defaultValue:1},{tfName:"beta",name:"beta",type:"number",defaultValue:.5}]},{tfOpName:"Softmax",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"LogSoftmax",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"SparseToDense",category:"normalization",inputs:[{start:0,name:"sparseIndices",type:"tensor"},{start:1,name:"outputShape",type:"number[]"},{start:2,name:"sparseValues",type:"tensor"},{start:3,name:"defaultValue",type:"tensor"}],attrs:[{tfName:"validate_indices",name:"validateIndices",type:"bool",defaultValue:!0,notSupported:!0}]}];var UC={};Be(UC,{json:()=>c6});var c6=[{tfOpName:"Bincount",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"size",type:"number"},{start:2,name:"weights",type:"tensor"}]},{tfOpName:"DenseBincount",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"size",type:"number"},{start:2,name:"weights",type:"tensor"}],attrs:[{tfName:"binary_output",name:"binaryOutput",type:"bool"}]},{tfOpName:"Max",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"Mean",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"Min",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"Sum",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"All",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"Any",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"ArgMax",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number"}]},{tfOpName:"ArgMin",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number"}]},{tfOpName:"Prod",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"Cumprod",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number"}],attrs:[{tfName:"exclusive",name:"exclusive",type:"bool"},{tfName:"reverse",name:"reverse",type:"bool"}]},{tfOpName:"Cumsum",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number"}],attrs:[{tfName:"exclusive",name:"exclusive",type:"bool"},{tfName:"reverse",name:"reverse",type:"bool"}]}];var GC={};Be(GC,{json:()=>l6});var l6=[{tfOpName:"ConcatV2",category:"slice_join",inputs:[{start:0,end:-1,name:"tensors",type:"tensors"},{start:-1,name:"axis",type:"number"}],attrs:[{tfName:"N",name:"n",type:"number",defaultValue:2}]},{tfOpName:"Concat",category:"slice_join",inputs:[{start:1,end:0,name:"tensors",type:"tensors"},{start:0,name:"axis",type:"number"}],attrs:[{tfName:"N",name:"n",type:"number",defaultValue:2}]},{tfOpName:"GatherV2",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"indices",type:"tensor"},{start:2,name:"axis",type:"number",defaultValue:0}],attrs:[{tfName:"batch_dims",name:"batchDims",type:"number",defaultValue:0}]},{tfOpName:"Gather",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"indices",type:"tensor"}],attrs:[{tfName:"validate_indices",name:"validateIndices",type:"bool",notSupported:!0}]},{tfOpName:"Reverse",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"dims",type:"bool[]"}]},{tfOpName:"ReverseV2",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}]},{tfOpName:"Slice",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"begin",type:"number[]"},{start:2,name:"size",type:"number[]"}]},{tfOpName:"StridedSlice",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"begin",type:"number[]"},{start:2,name:"end",type:"number[]"},{start:3,name:"strides",type:"number[]"}],attrs:[{tfName:"begin_mask",name:"beginMask",type:"number",defaultValue:0},{tfName:"end_mask",name:"endMask",type:"number",defaultValue:0},{tfName:"new_axis_mask",name:"newAxisMask",type:"number",defaultValue:0},{tfName:"ellipsis_mask",name:"ellipsisMask",type:"number",defaultValue:0},{tfName:"shrink_axis_mask",name:"shrinkAxisMask",type:"number",defaultValue:0}]},{tfOpName:"Pack",category:"slice_join",inputs:[{start:0,end:0,name:"tensors",type:"tensors"}],attrs:[{tfName:"axis",name:"axis",type:"number",defaultValue:0}]},{tfOpName:"Unpack",category:"slice_join",inputs:[{start:0,name:"tensor",type:"tensor"}],attrs:[{tfName:"axis",name:"axis",type:"number",defaultValue:0},{tfName:"num",name:"num",type:"number",defaultValue:0,notSupported:!0}]},{tfOpName:"Tile",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"reps",type:"number[]"}]},{tfOpName:"Split",category:"slice_join",inputs:[{start:0,name:"axis",type:"number",defaultValue:0},{start:1,name:"x",type:"tensor"}],attrs:[{tfName:"num_split",name:"numOrSizeSplits",type:"number",defaultValue:1}]},{tfOpName:"SplitV",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"numOrSizeSplits",type:"number[]"},{start:2,name:"axis",type:"number",defaultValue:0}]},{tfOpName:"ScatterNd",category:"slice_join",inputs:[{start:0,name:"indices",type:"tensor"},{start:1,name:"values",type:"tensor"},{start:2,name:"shape",type:"number[]"}]},{tfOpName:"GatherNd",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"indices",type:"tensor"}]},{tfOpName:"SparseToDense",category:"slice_join",inputs:[{start:0,name:"sparseIndices",type:"tensor"},{start:1,name:"outputShape",type:"number[]"},{start:2,name:"sparseValues",type:"tensor"},{start:3,name:"defaultValue",type:"tensor"}],attrs:[{tfName:"validate_indices",name:"validateIndices",type:"bool",defaultValue:!1,notSupported:!0}]}];var HC={};Be(HC,{json:()=>m6});var m6=[{tfOpName:"SparseFillEmptyRows",category:"sparse",inputs:[{start:0,name:"indices",type:"tensor"},{start:1,name:"values",type:"tensor"},{start:2,name:"denseShape",type:"tensor"},{start:3,name:"defaultValue",type:"tensor"}]},{tfOpName:"SparseReshape",category:"sparse",inputs:[{start:0,name:"inputIndices",type:"tensor"},{start:1,name:"inputShape",type:"tensor"},{start:2,name:"newShape",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"SparseSegmentMean",category:"sparse",inputs:[{start:0,name:"data",type:"tensor"},{start:1,name:"indices",type:"tensor"},{start:2,name:"segmentIds",type:"tensor"}]},{tfOpName:"SparseSegmentSum",category:"sparse",inputs:[{start:0,name:"data",type:"tensor"},{start:1,name:"indices",type:"tensor"},{start:2,name:"segmentIds",type:"tensor"}]}];var qC={};Be(qC,{json:()=>f6});var f6=[{tfOpName:"FFT",category:"spectral",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"IFFT",category:"spectral",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"RFFT",category:"spectral",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"fft_length",type:"number",notSupported:!0}]},{tfOpName:"IRFFT",category:"spectral",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"fft_length",type:"number",notSupported:!0}]}];var KC={};Be(KC,{json:()=>d6});var d6=[{tfOpName:"StringNGrams",category:"string",inputs:[{start:0,name:"data",type:"tensor"},{start:1,name:"dataSplits",type:"tensor"}],attrs:[{tfName:"separator",name:"separator",type:"string"},{tfName:"ngram_widths",name:"nGramWidths",type:"number[]"},{tfName:"left_pad",name:"leftPad",type:"string"},{tfName:"right_pad",name:"rightPad",type:"string"},{tfName:"pad_width",name:"padWidth",type:"number"},{tfName:"preserve_short_sequences",name:"preserveShortSequences",type:"bool"}],outputs:["ngrams","ngrams_splits"]},{tfOpName:"StringSplit",category:"string",inputs:[{start:0,name:"input",type:"tensor"},{start:1,name:"delimiter",type:"tensor"}],attrs:[{tfName:"skip_empty",name:"skipEmpty",type:"bool"}],outputs:["indices","values","shape"]},{tfOpName:"StringToHashBucketFast",category:"string",inputs:[{start:0,name:"input",type:"tensor"}],attrs:[{tfName:"num_buckets",name:"numBuckets",type:"number"}]}];var jC={};Be(jC,{json:()=>h6});var h6=[{tfOpName:"Cast",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"SrcT",name:"sdtype",type:"dtype",notSupported:!0},{tfName:"DstT",name:"dtype",type:"dtype"}]},{tfOpName:"ExpandDims",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number"}]},{tfOpName:"MirrorPad",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"padding",type:"number[]"}],attrs:[{tfName:"mode",name:"mode",type:"string"}]},{tfOpName:"Pad",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"padding",type:"number[]"}],attrs:[{tfName:"constant_value",name:"constantValue",type:"number",defaultValue:0}]},{tfOpName:"PadV2",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"padding",type:"number[]"},{start:2,name:"constantValue",type:"number",defaultValue:0}]},{tfOpName:"Reshape",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"shape",type:"number[]"}]},{tfOpName:"Squeeze",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"axis",tfDeprecatedName:"squeeze_dims",name:"axis",type:"number[]"}]},{tfOpName:"SpaceToBatchND",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"blockShape",type:"number[]"},{start:2,name:"paddings",type:"number[]"}]},{tfOpName:"BatchToSpaceND",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"blockShape",type:"number[]"},{start:2,name:"crops",type:"number[]"}]},{tfOpName:"DepthToSpace",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"block_size",name:"blockSize",type:"number"},{tfName:"data_format",name:"dataFormat",type:"string"}]},{tfOpName:"BroadcastTo",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"shape",type:"number[]"}],attrs:[]},{tfOpName:"BroadcastArgs",category:"transformation",inputs:[{start:0,name:"s0",type:"tensor"},{start:1,name:"s1",type:"tensor"}],attrs:[]}];var xl=class{constructor(){let e=[$C,RC,AC,FC,DC,PC,OC,MC,LC,BC,VC,zC,WC,UC,GC,HC,qC,KC,jC],t=[].concat(...e.map(o=>o.json));this.opMappers=t.reduce((o,n)=>(o[n.tfOpName]=n,o),{})}static get Instance(){return this._instance||(this._instance=new this)}transformGraph(e,t={}){let o=e.node,n=[],s=[],a=[],i=o.reduce((h,g)=>(h[g.name]=this.mapNode(g),g.op.startsWith("Placeholder")?n.push(h[g.name]):g.op==="Const"?s.push(h[g.name]):(g.input==null||g.input.length===0)&&a.push(h[g.name]),h),{}),p=[],u=[],c={},l={};t!=null&&(c=this.mapSignatureEntries(t.inputs),l=this.mapSignatureEntries(t.outputs));let m=Object.keys(i);m.forEach(h=>{let g=i[h];g.inputNames.forEach((y,b)=>{let[C,,w]=zo(y),k=i[C];if(k.outputs!=null){let _=k.outputs.indexOf(w);if(_!==-1){let E=`${C}:${_}`;g.inputNames[b]=E}}g.inputs.push(k),k.children.push(g)})}),Object.keys(l).length===0?m.forEach(h=>{let g=i[h];g.children.length===0&&u.push(g)}):Object.keys(l).forEach(h=>{let[g]=zo(h),y=i[g];y!=null&&(y.signatureKey=l[h],u.push(y))}),Object.keys(c).length>0?Object.keys(c).forEach(h=>{let[g]=zo(h),y=i[g];y&&(y.signatureKey=c[h],p.push(y))}):p=n;let f={};e.library!=null&&e.library.function!=null&&(f=e.library.function.reduce((h,g)=>(h[g.signature.name]=this.mapFunction(g),h),{}));let d={nodes:i,inputs:p,outputs:u,weights:s,placeholders:n,signature:t,functions:f};return a.length>0&&(d.initNodes=a),d}mapSignatureEntries(e){return Object.keys(e||{}).reduce((t,o)=>(t[e[o].name]=o,t),{})}mapNode(e){let t=td(e.op)||this.opMappers[e.op]||{};e.attr==null&&(e.attr={});let o={name:e.name,op:e.op,category:t.category,inputNames:(e.input||[]).map(n=>n.startsWith("^")?n.slice(1):n),inputs:[],children:[],inputParams:{},attrParams:{},rawAttrs:e.attr,outputs:t.outputs};return t.inputs!=null&&(o.inputParams=t.inputs.reduce((n,s)=>(n[s.name]={type:s.type,inputIndexStart:s.start,inputIndexEnd:s.end},n),{})),t.attrs!=null&&(o.attrParams=t.attrs.reduce((n,s)=>{let a=s.type,i;switch(s.type){case"string":i=od(e.attr,s.tfName,s.defaultValue),i===void 0&&!!s.tfDeprecatedName&&(i=od(e.attr,s.tfDeprecatedName,s.defaultValue));break;case"string[]":i=cd(e.attr,s.tfName,s.defaultValue),i===void 0&&!!s.tfDeprecatedName&&(i=cd(e.attr,s.tfDeprecatedName,s.defaultValue));break;case"number":i=sd(e.attr,s.tfName,s.defaultValue||0),i===void 0&&!!s.tfDeprecatedName&&(i=sd(e.attr,s.tfDeprecatedName,s.defaultValue));break;case"number[]":i=pd(e.attr,s.tfName,s.defaultValue),i===void 0&&!!s.tfDeprecatedName&&(i=pd(e.attr,s.tfDeprecatedName,s.defaultValue));break;case"bool":i=nd(e.attr,s.tfName,s.defaultValue),i===void 0&&!!s.tfDeprecatedName&&(i=nd(e.attr,s.tfDeprecatedName,s.defaultValue));break;case"bool[]":i=md(e.attr,s.tfName,s.defaultValue),i===void 0&&!!s.tfDeprecatedName&&(i=md(e.attr,s.tfDeprecatedName,s.defaultValue));break;case"shape":i=ud(e.attr,s.tfName,s.defaultValue),i===void 0&&!!s.tfDeprecatedName&&(i=ud(e.attr,s.tfDeprecatedName,s.defaultValue));break;case"shape[]":i=ld(e.attr,s.tfName,s.defaultValue),i===void 0&&!!s.tfDeprecatedName&&(i=ld(e.attr,s.tfDeprecatedName,s.defaultValue));break;case"dtype":i=ad(e.attr,s.tfName,s.defaultValue),i===void 0&&!!s.tfDeprecatedName&&(i=ad(e.attr,s.tfDeprecatedName,s.defaultValue));break;case"dtype[]":i=id(e.attr,s.tfName,s.defaultValue),i===void 0&&!!s.tfDeprecatedName&&(i=id(e.attr,s.tfDeprecatedName,s.defaultValue));break;case"func":i=QT(e.attr,s.tfName,s.defaultValue),i===void 0&&!!s.tfDeprecatedName&&(i=QT(e.attr,s.tfDeprecatedName,s.defaultValue));break;case"tensor":case"tensors":break;default:throw new Error(`Unsupported param type: ${s.type} for op: ${e.op}`)}return n[s.name]={value:i,type:a},n},{})),o}mapFunction(e){let t=e.nodeDef,o=[],n=[],s={};t!=null&&(s=t.reduce((l,m)=>(l[m.name]=this.mapNode(m),m.op==="Const"&&n.push(l[m.name]),l),{}));let a=[],i=[];e.signature.inputArg.forEach(l=>{let[m]=zo(l.name),f={name:m,op:"Placeholder",inputs:[],inputNames:[],category:"graph",inputParams:{},attrParams:{dtype:{value:XC(l.type),type:"dtype"}},children:[]};f.signatureKey=l.name,a.push(f),s[m]=f}),Object.keys(s).forEach(l=>{let m=s[l];m.inputNames.forEach((f,d)=>{let[h,,g]=zo(f),y=s[h];if(y.outputs!=null){let b=y.outputs.indexOf(g);if(b!==-1){let C=`${h}:${b}`;m.inputNames[d]=C}}m.inputs.push(y),y.children.push(m)})});let u=e.ret;e.signature.outputArg.forEach(l=>{let[m,f]=zo(u[l.name]),d=s[m];d!=null&&(d.defaultOutput=f,i.push(d))});let c=this.mapArgsToSignature(e);return{nodes:s,inputs:a,outputs:i,weights:n,placeholders:o,signature:c}}mapArgsToSignature(e){return{methodName:e.signature.name,inputs:e.signature.inputArg.reduce((t,o)=>(t[o.name]=this.mapArgToTensorInfo(o),t),{}),outputs:e.signature.outputArg.reduce((t,o)=>(t[o.name]=this.mapArgToTensorInfo(o,e.ret),t),{})}}mapArgToTensorInfo(e,t){let o=e.name;return t!=null&&(o=t[o]),{name:o,dtype:e.type}}};function g6(r){let e=P().global;if(typeof e.atob!="undefined")return e.atob(r);if(typeof Buffer!="undefined")return new Buffer(r,"base64").toString();throw new Error("Unable to decode base64 in this environment. Missing built-in atob() or Buffer()")}function ZT(r,e){let t=Array.isArray(r)?String.fromCharCode.apply(null,r):g6(r);return e?t:t.toLowerCase()}function od(r,e,t,o=!1){let n=r[e];return n!=null?ZT(n.s,o):t}function nd(r,e,t){let o=r[e];return o?o.b:t}function sd(r,e,t){let o=r[e]||{},n=o.i!=null?o.i:o.f!=null?o.f:t;return typeof n=="number"?n:parseInt(n,10)}function XC(r){switch(typeof r=="string"&&(r=To[r]),r){case To.DT_FLOAT:case To.DT_HALF:return"float32";case To.DT_INT32:case To.DT_INT64:case To.DT_INT8:case To.DT_UINT8:return"int32";case To.DT_BOOL:return"bool";case To.DT_DOUBLE:return"float32";case To.DT_STRING:return"string";default:return null}}function QT(r,e,t){let o=r[e];return o&&o.func?o.func.name:t}function ad(r,e,t){let o=r[e];return o&&o.type?XC(o.type):t}function id(r,e,t){let o=r[e];return o&&o.list&&o.list.type?o.list.type.map(n=>XC(n)):t}function JT(r){if(!r.unknownRank)return r.dim!=null?r.dim.map(e=>typeof e.size=="number"?e.size:parseInt(e.size,10)):[]}function ud(r,e,t){let o=r[e];return o&&o.shape?JT(o.shape):t}function pd(r,e,t){let o=r[e];return o?((o.list.f&&o.list.f.length?o.list.f:o.list.i)||[]).map(n=>typeof n=="number"?n:parseInt(n,10)):t}function cd(r,e,t,o=!1){let n=r[e];return n&&n.list&&n.list.s?n.list.s.map(s=>ZT(s,o)):t}function ld(r,e,t){let o=r[e];return o&&o.list&&o.list.shape?o.list.shape.map(n=>JT(n)):t}function md(r,e,t){let o=r[e];return o&&o.list&&o.list.b?o.list.b:t}var fd=class{constructor(e,t,o){this.node=e,this.tensorMap=t,this.context=o,this.inputs=[],this.attrs={},this.inputs=e.inputNames.map(n=>this.getInput(n)),e.rawAttrs!=null&&(this.attrs=Object.keys(e.rawAttrs).reduce((n,s)=>(n[s]=this.getAttr(s),n),{}))}getInput(e){return Ht(e,this.tensorMap,this.context)}getAttr(e,t){let o=this.node.rawAttrs[e];if(o.tensor!=null)return Ht(e,this.tensorMap,this.context);if(o.i!=null||o.f!=null)return sd(this.node.rawAttrs,e,t);if(o.s!=null)return od(this.node.rawAttrs,e,t);if(o.b!=null)return nd(this.node.rawAttrs,e,t);if(o.shape!=null)return ud(this.node.rawAttrs,e,t);if(o.type!=null)return ad(this.node.rawAttrs,e,t);if(o.list!=null){if(o.list.i!=null||o.list.f!=null)return pd(this.node.rawAttrs,e,t);if(o.list.s!=null)return cd(this.node.rawAttrs,e,t);if(o.list.shape!=null)return ld(this.node.rawAttrs,e,t);if(o.list.b!=null)return md(this.node.rawAttrs,e,t);if(o.list.type!=null)return id(this.node.rawAttrs,e,t)}return t}};var rt={};Be(rt,{OP_SCOPE_SUFFIX:()=>Ub,abs:()=>Qt,acos:()=>Vv,acosh:()=>zv,add:()=>ge,addN:()=>Wv,all:()=>Uv,any:()=>Gv,argMax:()=>Hv,argMin:()=>qv,asin:()=>Kv,asinh:()=>jv,atan:()=>Xv,atan2:()=>Yv,atanh:()=>Qv,avgPool:()=>mf,avgPool3d:()=>ek,basicLSTMCell:()=>tk,batchNorm:()=>li,batchNorm2d:()=>ok,batchNorm3d:()=>nk,batchNorm4d:()=>sk,batchToSpaceND:()=>ff,bincount:()=>df,booleanMaskAsync:()=>_H,broadcastArgs:()=>ak,broadcastTo:()=>Ls,buffer:()=>ne,cast:()=>qe,ceil:()=>ik,clipByValue:()=>uk,clone:()=>zr,complex:()=>Er,concat:()=>gt,concat1d:()=>pk,concat2d:()=>ck,concat3d:()=>lk,concat4d:()=>mk,conv1d:()=>fk,conv2d:()=>mi,conv2dTranspose:()=>dk,conv3d:()=>hk,conv3dTranspose:()=>xk,cos:()=>yk,cosh:()=>bk,cosineWindow:()=>hl,cumprod:()=>Ck,cumsum:()=>Ik,denseBincount:()=>wk,depthToSpace:()=>Sk,depthwiseConv2d:()=>Gp,diag:()=>vk,dilation2d:()=>kk,div:()=>We,divNoNan:()=>Tk,dot:()=>Nk,dropout:()=>BH,einsum:()=>_k,elu:()=>xf,enclosingPowerOfTwo:()=>wC,equal:()=>gf,erf:()=>Ek,euclideanNorm:()=>Ak,exp:()=>Bo,expandDims:()=>_a,expm1:()=>Fk,eye:()=>yf,fft:()=>qp,fill:()=>Bs,floor:()=>bf,floorDiv:()=>cf,fused:()=>SC,gather:()=>Cf,gatherND:()=>MH,greater:()=>cu,greaterEqual:()=>If,ifft:()=>hu,imag:()=>ci,image:()=>zq,inTopKAsync:()=>zH,irfft:()=>Gf,isFinite:()=>Dk,isInf:()=>Pk,isNaN:()=>Ok,leakyRelu:()=>wf,less:()=>Mk,lessEqual:()=>Hp,linalg:()=>Wq,linspace:()=>Lk,localResponseNormalization:()=>Bk,log:()=>Ea,log1p:()=>Sf,logSigmoid:()=>Vk,logSoftmax:()=>zk,logSumExp:()=>Tf,logicalAnd:()=>lu,logicalNot:()=>Nf,logicalOr:()=>_f,logicalXor:()=>Wk,losses:()=>Uq,lowerBound:()=>Uk,matMul:()=>Xe,max:()=>Vs,maxPool:()=>$f,maxPool3d:()=>Gk,maxPoolWithArgmax:()=>Hk,maximum:()=>Rf,mean:()=>mu,meshgrid:()=>qk,min:()=>fl,minimum:()=>Af,mirrorPad:()=>Kk,mod:()=>jk,moments:()=>Xk,movingAverage:()=>$H,mul:()=>oe,multiRNNCell:()=>Yk,multinomial:()=>Qk,neg:()=>yr,norm:()=>pu,notEqual:()=>Ff,oneHot:()=>pl,ones:()=>zs,onesLike:()=>Zk,op:()=>T,outerProduct:()=>Jk,pad:()=>Ws,pad1d:()=>e1,pad2d:()=>t1,pad3d:()=>r1,pad4d:()=>o1,pool:()=>n1,pow:()=>Na,prelu:()=>Pf,print:()=>ef,prod:()=>s1,raggedGather:()=>a1,raggedRange:()=>i1,raggedTensorToTensor:()=>u1,rand:()=>p1,randomGamma:()=>T1,randomNormal:()=>Vf,randomStandardNormal:()=>N1,randomUniform:()=>zf,range:()=>di,real:()=>ka,reciprocal:()=>_1,relu:()=>hi,relu6:()=>Wf,reshape:()=>z,reverse:()=>vo,reverse1d:()=>E1,reverse2d:()=>$1,reverse3d:()=>R1,reverse4d:()=>A1,rfft:()=>Kp,round:()=>Uf,rsqrt:()=>F1,scalar:()=>be,scatterND:()=>AH,searchSorted:()=>dl,selu:()=>D1,separableConv2d:()=>P1,setdiff1dAsync:()=>O1,sigmoid:()=>Ms,sign:()=>M1,signal:()=>Vq,sin:()=>L1,sinh:()=>B1,slice:()=>Ue,slice1d:()=>V1,slice2d:()=>z1,slice3d:()=>W1,slice4d:()=>U1,softmax:()=>G1,softplus:()=>kf,spaceToBatchND:()=>Df,sparse:()=>Gq,sparseToDense:()=>PH,spectral:()=>Bq,split:()=>$a,sqrt:()=>Rr,square:()=>Zt,squaredDifference:()=>Hf,squeeze:()=>jp,stack:()=>Ir,step:()=>qf,stridedSlice:()=>H1,string:()=>Hq,sub:()=>ke,sum:()=>tt,tan:()=>q1,tanh:()=>ml,tensor:()=>nr,tensor1d:()=>mr,tensor2d:()=>gi,tensor3d:()=>sf,tensor4d:()=>K1,tensor5d:()=>j1,tensor6d:()=>X1,tile:()=>fi,topk:()=>Y1,transpose:()=>Wp,truncatedNormal:()=>Q1,unique:()=>Z1,unsortedSegmentSum:()=>J1,unstack:()=>ko,upperBound:()=>eT,variable:()=>tT,where:()=>os,whereAsync:()=>jf,zeros:()=>Wr,zerosLike:()=>Gt});var eN=(r,e,t,o=rt)=>{switch(r.op){case"BiasAdd":case"AddV2":case"Add":return[o.add(S("a",r,e,t),S("b",r,e,t))];case"AddN":return[o.addN(S("tensors",r,e,t))];case"FloorMod":case"Mod":return[o.mod(S("a",r,e,t),S("b",r,e,t))];case"Mul":return[o.mul(S("a",r,e,t),S("b",r,e,t))];case"RealDiv":case"Div":return[o.div(S("a",r,e,t),S("b",r,e,t))];case"DivNoNan":return[o.divNoNan(S("a",r,e,t),S("b",r,e,t))];case"FloorDiv":return[o.floorDiv(S("a",r,e,t),S("b",r,e,t))];case"Sub":return[o.sub(S("a",r,e,t),S("b",r,e,t))];case"Minimum":return[o.minimum(S("a",r,e,t),S("b",r,e,t))];case"Maximum":return[o.maximum(S("a",r,e,t),S("b",r,e,t))];case"Pow":return[o.pow(S("a",r,e,t),S("b",r,e,t))];case"SquaredDifference":return[o.squaredDifference(S("a",r,e,t),S("b",r,e,t))];default:throw TypeError(`Node type ${r.op} is not implemented`)}};var tN=(r,e,t,o=rt)=>{switch(r.op){case"Abs":case"ComplexAbs":return[o.abs(S("x",r,e,t))];case"Acos":return[o.acos(S("x",r,e,t))];case"Acosh":return[o.acosh(S("x",r,e,t))];case"Asin":return[o.asin(S("x",r,e,t))];case"Asinh":return[o.asinh(S("x",r,e,t))];case"Atan":return[o.atan(S("x",r,e,t))];case"Atan2":return[o.atan2(S("x",r,e,t),S("y",r,e,t))];case"Atanh":return[o.atanh(S("x",r,e,t))];case"Ceil":return[o.ceil(S("x",r,e,t))];case"Complex":return[o.complex(S("real",r,e,t),S("imag",r,e,t))];case"Cos":return[o.cos(S("x",r,e,t))];case"Cosh":return[o.cosh(S("x",r,e,t))];case"Elu":return[o.elu(S("x",r,e,t))];case"Erf":return[o.erf(S("x",r,e,t))];case"Exp":return[o.exp(S("x",r,e,t))];case"Expm1":return[o.expm1(S("x",r,e,t))];case"Floor":return[o.floor(S("x",r,e,t))];case"Log":return[o.log(S("x",r,e,t))];case"Log1p":return[o.log1p(S("x",r,e,t))];case"Imag":return[o.imag(S("x",r,e,t))];case"Neg":return[o.neg(S("x",r,e,t))];case"Reciprocal":return[o.reciprocal(S("x",r,e,t))];case"Real":return[o.real(S("x",r,e,t))];case"Relu":return[o.relu(S("x",r,e,t))];case"Round":return[o.round(S("x",r,e,t))];case"Selu":return[o.selu(S("x",r,e,t))];case"Sigmoid":return[o.sigmoid(S("x",r,e,t))];case"Sin":return[o.sin(S("x",r,e,t))];case"Sign":return[o.sign(S("x",r,e,t))];case"Sinh":return[o.sinh(S("x",r,e,t))];case"Softplus":return[o.softplus(S("x",r,e,t))];case"Sqrt":return[o.sqrt(S("x",r,e,t))];case"Square":return[o.square(S("x",r,e,t))];case"Tanh":return[o.tanh(S("x",r,e,t))];case"Tan":return[o.tan(S("x",r,e,t))];case"ClipByValue":return[o.clipByValue(S("x",r,e,t),S("clipValueMin",r,e,t),S("clipValueMax",r,e,t))];case"Relu6":return[o.relu6(S("x",r,e,t))];case"Rsqrt":return[o.rsqrt(Ht(r.inputNames[0],e,t))];case"Prod":return[o.prod(S("x",r,e,t),S("axes",r,e,t))];case"LeakyRelu":return[o.leakyRelu(S("x",r,e,t),S("alpha",r,e,t))];case"Prelu":return[o.prelu(S("x",r,e,t),S("alpha",r,e,t))];case"IsNan":return[o.isNaN(Ht(r.inputNames[0],e,t))];default:throw TypeError(`Node type ${r.op} is not implemented`)}};function Ur(r,e,t=""){if(!(typeof r=="number"||typeof e=="number")){x.assert(r.length===e.length,()=>t+` Shapes ${r} and ${e} must match`);for(let o=0;ot+` Shapes ${r} and ${e} must match`)}}}function rN(r){return!(typeof r=="number"||r.some(e=>e<0))}function Xp(r,e,t){let o=dd(r,t),n=!rN(o);if(n&&e.length===0)throw new Error(`Tried to calculate elements of an empty list with non-fully-defined elementShape: ${o}`);if(n&&e.forEach(s=>{o=dd(s.shape,o)}),!rN(o))throw new Error(`Non-fully-defined elementShape: ${o}`);return o}function dd(r,e){if(typeof r=="number")return e;if(typeof e=="number")return r;if(r.length!==e.length)throw new Error(`Incompatible ranks during merge: ${r} vs. ${e}`);let t=[];for(let o=0;o=0&&s>=0&&n!==s)throw new Error(`Incompatible shape during merge: ${r} vs. ${e}`);t[o]=n>=0?n:s}return t}var hd=class{constructor(e,t,o,n,s,a,i){this.name=e,this.dtype=t,this.maxSize=o,this.elementShape=n,this.identicalElementShapes=s,this.dynamicSize=a,this.clearAfterRead=i,this.tensors=[],this.closed_=!1,this.idTensor=be(0),So(this.idTensor)}get id(){return this.idTensor.id}get closed(){return this.closed_}clearAndClose(e){this.tensors.forEach(t=>{(e==null||!e.has(t.tensor.id))&&t.tensor.dispose()}),this.tensors=[],this.closed_=!0,this.idTensor.dispose()}size(){return this.tensors.length}read(e){if(this.closed_)throw new Error(`TensorArray ${this.name} has already been closed.`);if(e<0||e>=this.size())throw new Error(`Tried to read from index ${e}, but array size is: ${this.size()}`);let t=this.tensors[e];if(t.cleared)throw new Error(`TensorArray ${this.name}: Could not read index ${e} twice because it was cleared after a previous read (perhaps try setting clear_after_read = false?).`);return this.clearAfterRead&&(t.cleared=!0),t.read=!0,t.tensor}readMany(e){return e.map(t=>this.read(t))}write(e,t){if(this.closed_)throw new Error(`TensorArray ${this.name} has already been closed.`);if(e<0||!this.dynamicSize&&e>=this.maxSize)throw new Error(`Tried to write to index ${e}, but array is not resizeable and size is: ${this.maxSize}`);let o=this.tensors[e]||{};if(t.dtype!==this.dtype)throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${e}, + because the value dtype is ${t.dtype}, but TensorArray dtype is ${this.dtype}.`);if(this.size()===0&&(this.elementShape==null||this.elementShape.length===0)&&(this.elementShape=t.shape),Ur(this.elementShape,t.shape,`TensorArray ${this.name}: Could not write to TensorArray index ${e}.`),o.read)throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${e}, because it has already been read.`);if(o.written)throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${e}, because it has already been written.`);o.tensor=t,So(t),o.written=!0,this.tensors[e]=o}writeMany(e,t){if(e.length!==t.length)throw new Error(`TensorArray ${this.name}: could not write multiple tensors,because the index size: ${e.length} is not the same as tensors size: ${t.length}.`);e.forEach((o,n)=>this.write(o,t[n]))}gather(e,t){if(!!t&&t!==this.dtype)throw new Error(`TensorArray dtype is ${this.dtype} but gather requested dtype ${t}`);if(e)e=e.slice(0,this.size());else{e=[];for(let n=0;n=this.maxSize)throw new Error(`Max index must be < array size (${o} vs. ${this.maxSize})`);this.writeMany(e,ko(t,0))}split(e,t){if(t.dtype!==this.dtype)throw new Error(`TensorArray dtype is ${this.dtype} but tensor has dtype ${t.dtype}`);let o=0,n=e.map(p=>(o+=p,o));if(o!==t.shape[0])throw new Error(`Expected sum of lengths to be equal to + tensor.shape[0], but sum of lengths is + ${o}, and tensor's shape is: ${t.shape}`);if(!this.dynamicSize&&e.length!==this.maxSize)throw new Error(`TensorArray's size is not equal to the size of lengths (${this.maxSize} vs. ${e.length}), and the TensorArray is not marked as dynamically resizeable`);let s=o===0?0:t.size/o,a=[];Ne(()=>{t=z(t,[1,o,s]);for(let p=0;p{if(o!==s.dtype)throw new Error(`Invalid data types; op elements ${o}, but list elements ${s.dtype}`);Ur(t,s.shape,"TensorList shape mismatch: "),So(s)}),this.idTensor=be(0),this.maxNumElements=n,So(this.idTensor)}get id(){return this.idTensor.id}copy(){return new Ra([...this.tensors],this.elementShape,this.elementDtype)}clearAndClose(e){this.tensors.forEach(t=>{(e==null||!e.has(t.id))&&t.dispose()}),this.tensors.length=0,this.idTensor.dispose()}size(){return this.tensors.length}stack(e,t,o=-1){if(t!==this.elementDtype)throw new Error(`Invalid data types; op elements ${t}, but list elements ${this.elementDtype}`);if(o!==-1&&this.tensors.length!==o)throw new Error(`Operation expected a list with ${o} elements but got a list with ${this.tensors.length} elements.`);Ur(e,this.elementShape,"TensorList shape mismatch: ");let n=Xp(this.elementShape,this.tensors,e);return Ne(()=>{let s=this.tensors.map(a=>z(a,n));return Ir(s,0)})}popBack(e,t){if(t!==this.elementDtype)throw new Error(`Invalid data types; op elements ${t}, but list elements ${this.elementDtype}`);if(this.size()===0)throw new Error("Trying to pop from an empty list.");let o=Xp(this.elementShape,this.tensors,e),n=this.tensors.pop();return n.kept=!1,Ur(n.shape,e,"TensorList shape mismatch: "),z(n,o)}pushBack(e){if(e.dtype!==this.elementDtype)throw new Error(`Invalid data types; op elements ${e.dtype}, but list elements ${this.elementDtype}`);if(Ur(e.shape,this.elementShape,"TensorList shape mismatch: "),this.maxNumElements===this.size())throw new Error("Trying to push element into a full list.");So(e),this.tensors.push(e)}resize(e){if(e<0)throw new Error(`TensorListResize expects size to be non-negative. Got: ${e}`);if(this.maxNumElements!==-1&&e>this.maxNumElements)throw new Error(`TensorListResize input size ${e} is greater maxNumElement ${this.maxNumElements}.`);let t=new Ra([],this.elementShape,this.elementDtype,this.maxNumElements);t.tensors.length=e;for(let o=0;othis.tensors.length)throw new Error(`Trying to access element ${e} in a list with ${this.tensors.length} elements.`);if(this.tensors[e]==null)throw new Error(`element at index ${e} is null.`);Ur(this.tensors[e].shape,t,"TensorList shape mismatch: ");let n=Xp(this.elementShape,this.tensors,t);return z(this.tensors[e],n)}setItem(e,t){if(t.dtype!==this.elementDtype)throw new Error(`Invalid data types; op elements ${t.dtype}, but list elements ${this.elementDtype}`);if(e<0||this.maxNumElements!==-1&&e>=this.maxNumElements)throw new Error(`Trying to set element ${e} in a list with max ${this.maxNumElements} elements.`);Ur(this.elementShape,t.shape,"TensorList shape mismatch: "),So(t),this.tensors[e]!=null&&(this.tensors[e].kept=!1),this.tensors[e]=t}gather(e,t,o){if(t!==this.elementDtype)throw new Error(`Invalid data types; op elements ${t}, but list elements ${this.elementDtype}`);Ur(this.elementShape,o,"TensorList shape mismatch: "),e=e.slice(0,this.size());let n=Xp(this.elementShape,this.tensors,o);return e.length===0?nr([],[0].concat(n)):Ne(()=>{let s=e.map(a=>z(this.tensors[a],n));return Ir(s,0)})}concat(e,t){if(!!e&&e!==this.elementDtype)throw new Error(`TensorList dtype is ${this.elementDtype} but concat requested dtype ${e}`);Ur(this.elementShape,t,"TensorList shape mismatch: ");let o=Xp(this.elementShape,this.tensors,t);return this.size()===0?nr([],[0].concat(o)):Ne(()=>{let n=this.tensors.map(s=>z(s,o));return gt(n,0)})}};function oN(r,e,t){let o=r.dtype;if(r.shape.length<1)throw new Error(`Tensor must be at least a vector, but saw shape: ${r.shape}`);if(r.dtype!==t)throw new Error(`Invalid data types; op elements ${r.dtype}, but list elements ${t}`);let n=r.shape.slice(1);Ur(n,e,"TensorList shape mismatch: ");let s=ko(r);return new Ra(s,e,o)}function nN(r,e,t,o){return new Ra([],r,e,o)}function sN(r,e,t,o){if(e.length!==r.shape[0])throw new Error(`Expected len(indices) == tensor.shape[0], but saw: ${e.length} vs. ${r.shape[0]}`);let n=Math.max(...e);if(o!=null&&o!==-1&&n>=o)throw new Error(`Max index must be < array size (${n} vs. ${o})`);let s=new Ra([],t,r.dtype,o),a=ko(r,0);return e.forEach((i,p)=>{s.setItem(i,a[p])}),s}function aN(r,e,t){let o=0,n=e.map(c=>(o+=c,o));if(o!==r.shape[0])throw new Error(`Expected sum of lengths to be equal to + tensor.shape[0], but sum of lengths is + ${o}, and tensor's shape is: ${r.shape}`);let s=r.shape.slice(1),a=dd(s,t),i=o===0?0:r.size/o,p=Ne(()=>{let c=[];r=z(r,[1,o,i]);for(let l=0;l{switch(r.op){case"If":case"StatelessIf":{let o=S("thenBranch",r,e,t),n=S("elseBranch",r,e,t),s=S("cond",r,e,t),a=S("args",r,e,t);return(await s.data())[0]?t.functionMap[o].executeFunctionAsync(a,t.tensorArrayMap,t.tensorListMap):t.functionMap[n].executeFunctionAsync(a,t.tensorArrayMap,t.tensorListMap)}case"While":case"StatelessWhile":{let o=S("body",r,e,t),n=S("cond",r,e,t),s=S("args",r,e,t),a=await t.functionMap[n].executeFunctionAsync(s,t.tensorArrayMap,t.tensorListMap),i=s.map(c=>c.id),p=await a[0].data();a.forEach(c=>{!c.kept&&i.indexOf(c.id)===-1&&c.dispose()});let u=s;for(;p[0];){let c=u;u=await t.functionMap[o].executeFunctionAsync(u,t.tensorArrayMap,t.tensorListMap);let l=u.map(f=>f.id);c.forEach(f=>{!f.kept&&i.indexOf(f.id)===-1&&l.indexOf(f.id)===-1&&f.dispose()});let m=await t.functionMap[n].executeFunctionAsync(u,t.tensorArrayMap,t.tensorListMap);p=await m[0].data(),m.forEach(f=>{!f.kept&&i.indexOf(f.id)===-1&&l.indexOf(f.id)===-1&&f.dispose()})}return u}case"LoopCond":{let o=S("pred",r,e,t);return[ss(o)]}case"Switch":{let o=S("pred",r,e,t),n=S("data",r,e,t);return n.kept||(n=ss(n)),(await o.data())[0]?[void 0,n]:[n,void 0]}case"Merge":{let o=r.inputNames.find(n=>Ht(n,e,t)!==void 0);if(o){let n=Ht(o,e,t);return[ss(n)]}return}case"Enter":{let o=S("frameName",r,e,t),n=S("tensor",r,e,t);return t.enterFrame(o),[ss(n)]}case"Exit":{let o=S("tensor",r,e,t);return t.exitFrame(),[ss(o)]}case"NextIteration":{let o=S("tensor",r,e,t);return t.nextIteration(),[ss(o)]}case"TensorArrayV3":{let o=S("size",r,e,t),n=S("dtype",r,e,t),s=S("elementShape",r,e,t),a=S("dynamicSize",r,e,t),i=S("clearAfterRead",r,e,t),p=S("identicalElementShapes",r,e,t),u=S("name",r,e,t),c=new hd(u,n,o,s,p,a,i);return t.addTensorArray(c),[c.idTensor,be(1)]}case"TensorArrayWriteV3":{let o=S("tensorArrayId",r,e,t),n=S("index",r,e,t),s=S("tensor",r,e,t),a=t.getTensorArray(o.id);return a.write(n,s),[a.idTensor]}case"TensorArrayReadV3":{let o=S("tensorArrayId",r,e,t),n=S("index",r,e,t);return[t.getTensorArray(o.id).read(n)]}case"TensorArrayGatherV3":{let o=S("tensorArrayId",r,e,t),n=S("indices",r,e,t),s=S("dtype",r,e,t);return[t.getTensorArray(o.id).gather(n,s)]}case"TensorArrayScatterV3":{let o=S("tensorArrayId",r,e,t),n=S("indices",r,e,t),s=S("tensor",r,e,t),a=t.getTensorArray(o.id);return a.scatter(n,s),[a.idTensor]}case"TensorArrayConcatV3":{let o=S("tensorArrayId",r,e,t),n=t.getTensorArray(o.id),s=S("dtype",r,e,t);return[n.concat(s)]}case"TensorArraySplitV3":{let o=S("tensorArrayId",r,e,t),n=S("tensor",r,e,t),s=S("lengths",r,e,t),a=t.getTensorArray(o.id);return a.split(s,n),[a.idTensor]}case"TensorArraySizeV3":{let o=S("tensorArrayId",r,e,t),n=t.getTensorArray(o.id);return[be(n.size(),"int32")]}case"TensorArrayCloseV3":{let o=S("tensorArrayId",r,e,t),n=t.getTensorArray(o.id);return n.clearAndClose(),[n.idTensor]}case"TensorListSetItem":{let o=S("tensorListId",r,e,t),n=S("index",r,e,t),s=S("tensor",r,e,t),a=t.getTensorList(o.id);return a.setItem(n,s),[a.idTensor]}case"TensorListGetItem":{let o=S("tensorListId",r,e,t),n=S("index",r,e,t),s=S("elementShape",r,e,t),a=S("elementDType",r,e,t);return[t.getTensorList(o.id).getItem(n,s,a)]}case"TensorListScatterV2":case"TensorListScatter":{let o=S("indices",r,e,t),n=S("tensor",r,e,t),s=S("elementShape",r,e,t),a=S("numElements",r,e,t),i=sN(n,o,s,a);return t.addTensorList(i),[i.idTensor]}case"TensorListReserve":case"EmptyTensorList":{let o=S("elementShape",r,e,t),n=S("elementDType",r,e,t),s;r.op==="TensorListReserve"?s="numElements":s="maxNumElements";let a=S(s,r,e,t),i=r.op==="TensorListReserve"?-1:a,p=nN(o,n,a,i);return t.addTensorList(p),[p.idTensor]}case"TensorListGather":{let o=S("tensorListId",r,e,t),n=S("indices",r,e,t),s=S("elementShape",r,e,t),a=S("elementDType",r,e,t);return[t.getTensorList(o.id).gather(n,a,s)]}case"TensorListStack":{let o=S("tensorListId",r,e,t),n=S("elementShape",r,e,t),s=S("elementDType",r,e,t),a=S("numElements",r,e,t);return[t.getTensorList(o.id).stack(n,s,a)]}case"TensorListFromTensor":{let o=S("tensor",r,e,t),n=S("elementShape",r,e,t),s=S("elementDType",r,e,t),a=oN(o,n,s);return t.addTensorList(a),[a.idTensor]}case"TensorListConcat":case"TensorListConcatV2":{let o=S("tensorListId",r,e,t),n=t.getTensorList(o.id),s=S("dtype",r,e,t),a=S("elementShape",r,e,t);return[n.concat(s,a)]}case"TensorListPushBack":{let o=S("tensorListId",r,e,t),n=S("tensor",r,e,t),s=t.getTensorList(o.id);return s.pushBack(n),[s.idTensor]}case"TensorListPopBack":{let o=S("tensorListId",r,e,t),n=S("elementShape",r,e,t),s=S("elementDType",r,e,t);return[t.getTensorList(o.id).popBack(n,s)]}case"TensorListSplit":{let o=S("tensor",r,e,t),n=S("elementShape",r,e,t),s=S("lengths",r,e,t),a=aN(o,s,n);return t.addTensorList(a),[a.idTensor]}case"TensorListLength":{let o=S("tensorListId",r,e,t),n=t.getTensorList(o.id);return[be(n.size(),"int32")]}case"TensorListResize":{let o=S("tensorListId",r,e,t),n=S("size",r,e,t),a=t.getTensorList(o.id).resize(n);return t.addTensorList(a),[a.idTensor]}default:throw TypeError(`Node type ${r.op} is not implemented`)}};function uN(r,e,t){let[o,n]=S("fusedOps",r,e,t),s=o==="biasadd",a=!s,i=n==="prelu",p=o==="fusedbatchnorm",u=S("numArgs",r,e,t);if(s){if(i&&u!==2)throw new Error("FusedConv2d and DepthwiseConv2d with BiasAdd and Prelu must have two extra arguments: bias and alpha.");if(!i&&s&&u!==1)throw new Error("FusedConv2d and DepthwiseConv2d with BiasAdd must have one extra argument: bias.")}if(p)throw new Error("FusedConv2d and DepthwiseConv2d with FusedBatchNorm is not supported");let c=S("strides",r,e,t),l=gl(r,e,t),m=S("dataFormat",r,e,t).toUpperCase(),f=S("dilations",r,e,t),[d,h]=S("args",r,e,t);a&&(h=d,d=void 0);let g=S("leakyreluAlpha",r,e,t);return{stride:c,pad:l,dataFormat:m,dilations:f,biasArg:d,preluArg:h,activationFunc:n,leakyreluAlpha:g}}var pN=(r,e,t,o=rt)=>{switch(r.op){case"Conv1D":{let n=S("stride",r,e,t),s=S("pad",r,e,t),a=S("dataFormat",r,e,t).toUpperCase(),i=S("dilation",r,e,t);return[o.conv1d(S("x",r,e,t),S("filter",r,e,t),n,s,a,i)]}case"Conv2D":{let n=S("strides",r,e,t),s=gl(r,e,t),a=S("dataFormat",r,e,t).toUpperCase(),i=S("dilations",r,e,t);return[o.conv2d(S("x",r,e,t),S("filter",r,e,t),[n[1],n[2]],s,a,[i[1],i[2]])]}case"_FusedConv2D":{let{stride:n,pad:s,dataFormat:a,dilations:i,biasArg:p,preluArg:u,activationFunc:c,leakyreluAlpha:l}=uN(r,e,t);return[o.fused.conv2d({x:S("x",r,e,t),filter:S("filter",r,e,t),strides:[n[1],n[2]],pad:s,dataFormat:a,dilations:[i[1],i[2]],bias:p,activation:c,preluActivationWeights:u,leakyreluAlpha:l})]}case"FusedDepthwiseConv2dNative":{let{stride:n,pad:s,dataFormat:a,dilations:i,biasArg:p,preluArg:u,activationFunc:c,leakyreluAlpha:l}=uN(r,e,t);return[o.fused.depthwiseConv2d({x:S("x",r,e,t),filter:S("filter",r,e,t),strides:[n[1],n[2]],pad:s,dataFormat:a,dilations:[i[1],i[2]],bias:p,activation:c,preluActivationWeights:u,leakyreluAlpha:l})]}case"Conv2DBackpropInput":case"Conv2dTranspose":{let n=S("outputShape",r,e,t),s=S("strides",r,e,t),a=gl(r,e,t);return[o.conv2dTranspose(S("x",r,e,t),S("filter",r,e,t),n,[s[1],s[2]],a)]}case"DepthwiseConv2dNative":case"DepthwiseConv2d":{let n=S("strides",r,e,t),s=gl(r,e,t),a=S("dilations",r,e,t),i=S("dataFormat",r,e,t).toUpperCase();return[o.depthwiseConv2d(S("input",r,e,t),S("filter",r,e,t),[n[1],n[2]],s,i,[a[1],a[2]])]}case"Conv3D":{let n=S("strides",r,e,t),s=S("pad",r,e,t),a=S("dataFormat",r,e,t).toUpperCase(),i=S("dilations",r,e,t);return[o.conv3d(S("x",r,e,t),S("filter",r,e,t),[n[1],n[2],n[3]],s,a,[i[1],i[2],i[3]])]}case"AvgPool":{let n=S("strides",r,e,t),s=S("pad",r,e,t),a=S("kernelSize",r,e,t);return[o.avgPool(S("x",r,e,t),[a[1],a[2]],[n[1],n[2]],s)]}case"MaxPool":{let n=S("strides",r,e,t),s=S("pad",r,e,t),a=S("kernelSize",r,e,t);return[o.maxPool(S("x",r,e,t),[a[1],a[2]],[n[1],n[2]],s)]}case"MaxPoolWithArgmax":{let n=S("strides",r,e,t),s=S("pad",r,e,t),a=S("kernelSize",r,e,t),i=S("includeBatchInIndex",r,e,t),{result:p,indexes:u}=o.maxPoolWithArgmax(S("x",r,e,t),[a[1],a[2]],[n[1],n[2]],s,i);return[p,u]}case"AvgPool3D":{let n=S("strides",r,e,t),s=S("pad",r,e,t),a=S("kernelSize",r,e,t);return[o.avgPool3d(S("x",r,e,t),[a[1],a[2],a[3]],[n[1],n[2],n[3]],s)]}case"MaxPool3D":{let n=S("strides",r,e,t),s=S("pad",r,e,t),a=S("kernelSize",r,e,t);return[o.maxPool3d(S("x",r,e,t),[a[1],a[2],a[3]],[n[1],n[2],n[3]],s)]}case"Dilation2D":{let n=S("strides",r,e,t),s=S("pad",r,e,t),a=S("dilations",r,e,t),i=n[1],p=n[2],u=a[1],c=a[2];return[o.dilation2d(S("x",r,e,t),S("filter",r,e,t),[i,p],s,[u,c],"NHWC")]}default:throw TypeError(`Node type ${r.op} is not implemented`)}};var cN=(r,e,t,o=rt)=>{switch(r.op){case"Fill":{let n=S("shape",r,e,t),s=S("dtype",r,e,t),a=S("value",r,e,t);return[o.fill(n,a,s)]}case"LinSpace":{let n=S("start",r,e,t),s=S("stop",r,e,t),a=S("num",r,e,t);return[o.linspace(n,s,a)]}case"Multinomial":{let n=S("logits",r,e,t),s=S("numSamples",r,e,t),a=S("seed",r,e,t);return[o.multinomial(n,s,a)]}case"OneHot":{let n=S("indices",r,e,t),s=S("depth",r,e,t),a=S("onValue",r,e,t),i=S("offValue",r,e,t),p=S("dtype",r,e,t);return[o.oneHot(n,s,a,i,p)]}case"Ones":return[o.ones(S("shape",r,e,t),S("dtype",r,e,t))];case"OnesLike":return[o.onesLike(S("x",r,e,t))];case"RandomStandardNormal":return[o.randomStandardNormal(S("shape",r,e,t),S("dtype",r,e,t),S("seed",r,e,t))];case"RandomUniform":return[o.randomUniform(S("shape",r,e,t),S("minval",r,e,t),S("maxval",r,e,t),S("dtype",r,e,t))];case"Range":{let n=S("start",r,e,t),s=S("stop",r,e,t),a=S("step",r,e,t);return[o.range(n,s,a,S("dtype",r,e,t))]}case"TruncatedNormal":{let n=S("shape",r,e,t),s=S("mean",r,e,t),a=S("stdDev",r,e,t),i=S("seed",r,e,t);return[o.truncatedNormal(n,s,a,S("dtype",r,e,t),i)]}case"Zeros":return[o.zeros(S("shape",r,e,t),S("dtype",r,e,t))];case"ZerosLike":return[o.zerosLike(S("x",r,e,t))];default:throw TypeError(`Node type ${r.op} is not implemented`)}};function YC(r,e,t){let o=S("boxes",r,e,t),n=S("scores",r,e,t),s=S("maxOutputSize",r,e,t),a=S("iouThreshold",r,e,t),i=S("scoreThreshold",r,e,t),p=S("softNmsSigma",r,e,t);return{boxes:o,scores:n,maxOutputSize:s,iouThreshold:a,scoreThreshold:i,softNmsSigma:p}}var lN=async(r,e,t,o,n=rt)=>{switch(r.op){case"NonMaxSuppressionV5":{let{boxes:s,scores:a,maxOutputSize:i,iouThreshold:p,scoreThreshold:u,softNmsSigma:c}=YC(r,e,t),l=await n.image.nonMaxSuppressionWithScoreAsync(s,a,i,p,u,c);return[l.selectedIndices,l.selectedScores]}case"NonMaxSuppressionV4":{let{boxes:s,scores:a,maxOutputSize:i,iouThreshold:p,scoreThreshold:u}=YC(r,e,t),c=S("padToMaxOutputSize",r,e,t),l=await n.image.nonMaxSuppressionPaddedAsync(s,a,i,p,u,c);return[l.selectedIndices,l.validOutputs]}case"NonMaxSuppressionV3":case"NonMaxSuppressionV2":{let{boxes:s,scores:a,maxOutputSize:i,iouThreshold:p,scoreThreshold:u}=YC(r,e,t);return[await n.image.nonMaxSuppressionAsync(s,a,i,p,u)]}case"Where":{let s=n.cast(S("condition",r,e,t),"bool"),a=[await n.whereAsync(s)];return s.dispose(),a}case"ListDiff":return n.setdiff1dAsync(S("x",r,e,t),S("y",r,e,t));default:throw TypeError(`Node type ${r.op} is not implemented`)}};var mN=(r,e,t,o=rt)=>{switch(r.op){case"LowerBound":{let n=S("sortedSequence",r,e,t),s=S("values",r,e,t);return[o.lowerBound(n,s)]}case"TopKV2":{let n=S("x",r,e,t),s=S("k",r,e,t),a=S("sorted",r,e,t),i=o.topk(n,s,a);return[i.values,i.indices]}case"UpperBound":{let n=S("sortedSequence",r,e,t),s=S("values",r,e,t);return[o.upperBound(n,s)]}case"Unique":{let n=S("x",r,e,t),s=o.unique(n);return[s.values,s.indices]}case"UniqueV2":{let n=S("x",r,e,t),s=S("axis",r,e,t),a=o.unique(n,s);return[a.values,a.indices]}default:throw TypeError(`Node type ${r.op} is not implemented`)}};var fN=(r,e,t,o=rt)=>{switch(r.op){case"Const":return e[r.name];case"PlaceholderWithDefault":let n=S("default",r,e,t);return[Ht(r.name,e,t)||n];case"Placeholder":return[Ht(r.name,e,t)];case"Identity":case"StopGradient":case"FakeQuantWithMinMaxVars":{let c=S("x",r,e,t);return[ss(c)]}case"IdentityN":return S("x",r,e,t).map(c=>ss(c));case"Snapshot":let s=S("x",r,e,t);return[ss(s)];case"Shape":return[o.tensor1d(S("x",r,e,t).shape,"int32")];case"ShapeN":return S("x",r,e,t).map(c=>o.tensor1d(c.shape));case"Size":return[o.scalar(S("x",r,e,t).size,"int32")];case"Rank":return[o.scalar(S("x",r,e,t).rank,"int32")];case"NoOp":return[o.scalar(1)];case"Print":let a=S("x",r,e,t),i=S("data",r,e,t),p=S("message",r,e,t),u=S("summarize",r,e,t);console.warn("The graph has a tf.print() operation,usually used for debugging, which slows down performance."),console.log(p);for(let c=0;ce.dispose()),this.tensorMap.clear(),this.handle.dispose()}size(){return this.tensorMap.size}tensorSize(){return be(this.size(),"int32")}async import(e,t){this.checkKeyAndValueTensor(e,t);let o=await e.data();return this.tensorMap.forEach(n=>n.dispose()),this.tensorMap.clear(),Ne(()=>{let n=ko(t),s=o.length,a=n.length;x.assert(s===a,()=>`The number of elements doesn't match, keys has ${s} elements, the values has ${a} elements.`);for(let i=0;i{let n=[];for(let s=0;s{switch(r.op){case"HashTable":case"HashTableV2":{let n=o.getHashTableHandleByName(r.name);if(n!=null)return[n];{let s=S("keyDType",r,e,t),a=S("valueDType",r,e,t),i=new gd(s,a);return o.addHashTable(r.name,i),[i.handle]}}case"LookupTableImport":case"LookupTableImportV2":{let n=S("tableHandle",r,e,t,o),s=S("keys",r,e,t),a=S("values",r,e,t);return[await o.getHashTableById(n.id).import(s,a)]}case"LookupTableFind":case"LookupTableFindV2":{let n=S("tableHandle",r,e,t,o),s=S("keys",r,e,t),a=S("defaultValue",r,e,t);return[await o.getHashTableById(n.id).find(s,a)]}case"LookupTableSize":case"LookupTableSizeV2":{let n=S("tableHandle",r,e,t,o);return[o.getHashTableById(n.id).tensorSize()]}default:throw TypeError(`Node type ${r.op} is not implemented`)}};var hN=(r,e,t,o=rt)=>{switch(r.op){case"ResizeBilinear":{let n=S("images",r,e,t),s=S("size",r,e,t),a=S("alignCorners",r,e,t),i=S("halfPixelCenters",r,e,t);return[o.image.resizeBilinear(n,[s[0],s[1]],a,i)]}case"ResizeNearestNeighbor":{let n=S("images",r,e,t),s=S("size",r,e,t),a=S("alignCorners",r,e,t),i=S("halfPixelCenters",r,e,t);return[o.image.resizeNearestNeighbor(n,[s[0],s[1]],a,i)]}case"CropAndResize":{let n=S("image",r,e,t),s=S("boxes",r,e,t),a=S("boxInd",r,e,t),i=S("cropSize",r,e,t),p=S("method",r,e,t),u=S("extrapolationValue",r,e,t);return[o.image.cropAndResize(n,s,a,i,p,u)]}case"ImageProjectiveTransformV3":{let n=S("images",r,e,t),s=S("transforms",r,e,t),a=S("outputShape",r,e,t),i=S("fillValue",r,e,t),p=S("interpolation",r,e,t),u=S("fillMode",r,e,t);return[o.image.transform(n,s,p.toLowerCase(),u.toLowerCase(),i,a)]}default:throw TypeError(`Node type ${r.op} is not implemented`)}};var gN=(r,e,t,o=rt)=>{switch(r.op){case"Equal":return[o.equal(S("a",r,e,t),S("b",r,e,t))];case"NotEqual":return[o.notEqual(S("a",r,e,t),S("b",r,e,t))];case"Greater":return[o.greater(S("a",r,e,t),S("b",r,e,t))];case"GreaterEqual":return[o.greaterEqual(S("a",r,e,t),S("b",r,e,t))];case"Less":return[o.less(S("a",r,e,t),S("b",r,e,t))];case"LessEqual":return[o.lessEqual(S("a",r,e,t),S("b",r,e,t))];case"LogicalAnd":return[o.logicalAnd(S("a",r,e,t),S("b",r,e,t))];case"LogicalNot":return[o.logicalNot(S("a",r,e,t))];case"LogicalOr":return[o.logicalOr(S("a",r,e,t),S("b",r,e,t))];case"Select":case"SelectV2":return[o.where(S("condition",r,e,t),S("a",r,e,t),S("b",r,e,t))];default:throw TypeError(`Node type ${r.op} is not implemented`)}};var xN=(r,e,t,o=rt)=>{switch(r.op){case"BatchMatMul":case"BatchMatMulV2":case"MatMul":return[o.matMul(S("a",r,e,t),S("b",r,e,t),S("transposeA",r,e,t),S("transposeB",r,e,t))];case"Einsum":return[o.einsum(S("equation",r,e,t),...S("tensors",r,e,t))];case"Transpose":return[o.transpose(S("x",r,e,t),S("perm",r,e,t))];case"_FusedMatMul":let[n,s]=S("fusedOps",r,e,t),a=n==="biasadd",i=s==="prelu",p=S("numArgs",r,e,t),u=S("leakyreluAlpha",r,e,t);if(a){if(i&&p!==2)throw new Error("Fused MatMul with BiasAdd and Prelu must have two extra arguments: bias and alpha.");if(!i&&p!==1)throw new Error("Fused MatMul with BiasAdd must have one extra argument: bias.")}let[c,l]=S("args",r,e,t);return[o.fused.matMul({a:S("a",r,e,t),b:S("b",r,e,t),transposeA:S("transposeA",r,e,t),transposeB:S("transposeB",r,e,t),bias:c,activation:s,preluActivationWeights:l,leakyreluAlpha:u})];default:throw TypeError(`Node type ${r.op} is not implemented`)}};var yN=(r,e,t,o=rt)=>{switch(r.op){case"EuclideanNorm":return[o.euclideanNorm(S("x",r,e,t),S("axis",r,e,t),S("keepDims",r,e,t))];case"FusedBatchNorm":case"FusedBatchNormV2":return[o.batchNorm(S("x",r,e,t),S("mean",r,e,t),S("variance",r,e,t),S("offset",r,e,t),S("scale",r,e,t),S("epsilon",r,e,t))];case"FusedBatchNormV3":return[o.batchNorm(S("x",r,e,t),S("mean",r,e,t),S("variance",r,e,t),S("offset",r,e,t),S("scale",r,e,t),S("epsilon",r,e,t))];case"LRN":return[o.localResponseNormalization(S("x",r,e,t),S("radius",r,e,t),S("bias",r,e,t),S("alpha",r,e,t),S("beta",r,e,t))];case"Softmax":return[o.softmax(S("x",r,e,t))];case"LogSoftmax":return[o.logSoftmax(S("x",r,e,t))];case"SparseToDense":return[o.sparseToDense(S("sparseIndices",r,e,t),S("outputShape",r,e,t),S("sparseValues",r,e,t),S("defaultValue",r,e,t))];default:throw TypeError(`Node type ${r.op} is not implemented`)}};var bN=(r,e,t,o=rt)=>{switch(r.op){case"Max":{let i=S("axis",r,e,t),p=S("keepDims",r,e,t);return[o.max(S("x",r,e,t),i,p)]}case"Mean":{let i=S("axis",r,e,t),p=S("keepDims",r,e,t);return[o.mean(S("x",r,e,t),i,p)]}case"Min":{let i=S("axis",r,e,t),p=S("keepDims",r,e,t);return[o.min(S("x",r,e,t),i,p)]}case"Sum":{let i=S("axis",r,e,t),p=S("keepDims",r,e,t);return[o.sum(S("x",r,e,t),i,p)]}case"All":{let i=S("axis",r,e,t),p=S("keepDims",r,e,t);return[o.all(S("x",r,e,t),i,p)]}case"Any":{let i=S("axis",r,e,t),p=S("keepDims",r,e,t);return[o.any(S("x",r,e,t),i,p)]}case"ArgMax":{let i=S("axis",r,e,t);return[o.argMax(S("x",r,e,t),i)]}case"ArgMin":{let i=S("axis",r,e,t);return[o.argMin(S("x",r,e,t),i)]}case"Prod":{let i=S("axis",r,e,t),p=S("keepDims",r,e,t);return[o.prod(S("x",r,e,t),i,p)]}case"Cumprod":{let i=S("axis",r,e,t),p=S("exclusive",r,e,t),u=S("reverse",r,e,t);return[o.cumprod(S("x",r,e,t),i,p,u)]}case"Cumsum":{let i=S("axis",r,e,t),p=S("exclusive",r,e,t),u=S("reverse",r,e,t);return[o.cumsum(S("x",r,e,t),i,p,u)]}case"Bincount":let n=S("x",r,e,t),s=S("weights",r,e,t),a=S("size",r,e,t);return[o.bincount(n,s,a)];case"DenseBincount":{let i=S("x",r,e,t),p=S("weights",r,e,t),u=S("size",r,e,t),c=S("binaryOutput",r,e,t);return[o.denseBincount(i,p,u,c)]}default:throw TypeError(`Node type ${r.op} is not implemented`)}};var CN=(r,e,t,o=rt)=>{switch(r.op){case"ConcatV2":case"Concat":{let n=S("n",r,e,t),s=S("axis",r,e,t),a=S("tensors",r,e,t);return a=a.slice(0,n),[o.concat(a,s)]}case"Gather":{let n=S("x",r,e,t),s=S("indices",r,e,t);return[o.gather(n,o.cast(s,"int32"),0)]}case"GatherV2":{let n=S("axis",r,e,t),s=S("batchDims",r,e,t),a=S("x",r,e,t),i=S("indices",r,e,t);return[o.gather(a,o.cast(i,"int32"),n,s)]}case"Reverse":{let n=S("dims",r,e,t),s=[];for(let i=0;i{let n=S("axis",r,e,t),s=S("tensors",r,e,t),a=s[0].shape,i=o.squeeze(s[0]).shape,p=s.map(u=>{let c=x.arraysEqual(u.shape,a);if(!c&&!x.arraysEqual(o.squeeze(u).shape,i))throw new Error("the input tensors shape does not match");return c?u:o.reshape(u,a)});return[o.stack(p,n)]});case"Unpack":{let n=S("axis",r,e,t),s=S("tensor",r,e,t);return o.unstack(s,n)}case"Tile":{let n=S("reps",r,e,t);return[o.tile(S("x",r,e,t),n)]}case"Split":case"SplitV":{let n=S("axis",r,e,t),s=S("numOrSizeSplits",r,e,t),a=S("x",r,e,t);return o.split(a,s,n)}case"ScatterNd":{let n=S("indices",r,e,t),s=S("values",r,e,t),a=S("shape",r,e,t);return[o.scatterND(n,s,a)]}case"GatherNd":{let n=S("x",r,e,t),s=S("indices",r,e,t);return[o.gatherND(n,s)]}case"SparseToDense":{let n=S("sparseIndices",r,e,t),s=S("outputShape",r,e,t),a=S("sparseValues",r,e,t),i=S("defaultValue",r,e,t);return[o.sparseToDense(n,a,s,a.dtype===i.dtype?i:o.cast(i,a.dtype))]}default:throw TypeError(`Node type ${r.op} is not implemented`)}};var IN=(r,e,t,o=rt)=>{switch(r.op){case"SparseFillEmptyRows":{let{outputIndices:n,outputValues:s,emptyRowIndicator:a,reverseIndexMap:i}=o.sparse.sparseFillEmptyRows(S("indices",r,e,t),S("values",r,e,t),S("denseShape",r,e,t),S("defaultValue",r,e,t));return[n,s,a,i]}case"SparseReshape":{let{outputIndices:n,outputShape:s}=o.sparse.sparseReshape(S("inputIndices",r,e,t),S("inputShape",r,e,t),S("newShape",r,e,t));return[n,s]}case"SparseSegmentMean":return[o.sparse.sparseSegmentMean(S("data",r,e,t),S("indices",r,e,t),S("segmentIds",r,e,t))];case"SparseSegmentSum":return[o.sparse.sparseSegmentSum(S("data",r,e,t),S("indices",r,e,t),S("segmentIds",r,e,t))];default:throw TypeError(`Node type ${r.op} is not implemented`)}};var wN=(r,e,t,o=rt)=>{switch(r.op){case"FFT":return[o.fft(S("x",r,e,t))];case"IFFT":return[o.ifft(S("x",r,e,t))];case"RFFT":return[o.rfft(S("x",r,e,t))];case"IRFFT":return[o.irfft(S("x",r,e,t))];default:throw TypeError(`Node type ${r.op} is not implemented`)}};var SN=(r,e,t,o=rt)=>{switch(r.op){case"StringNGrams":{let{nGrams:n,nGramsSplits:s}=o.string.stringNGrams(S("data",r,e,t),S("dataSplits",r,e,t),S("separator",r,e,t),S("nGramWidths",r,e,t),S("leftPad",r,e,t),S("rightPad",r,e,t),S("padWidth",r,e,t),S("preserveShortSequences",r,e,t));return[n,s]}case"StringSplit":{let{indices:n,values:s,shape:a}=o.string.stringSplit(S("input",r,e,t),S("delimiter",r,e,t),S("skipEmpty",r,e,t));return[n,s,a]}case"StringToHashBucketFast":return[o.string.stringToHashBucketFast(S("input",r,e,t),S("numBuckets",r,e,t))];default:throw TypeError(`Node type ${r.op} is not implemented`)}};var vN=(r,e,t,o=rt)=>{switch(r.op){case"Cast":return[o.cast(S("x",r,e,t),S("dtype",r,e,t))];case"ExpandDims":{let n=S("axis",r,e,t);return[o.expandDims(S("x",r,e,t),n)]}case"Squeeze":{let n=S("axis",r,e,t);return[o.squeeze(S("x",r,e,t),n)]}case"Reshape":return[o.reshape(S("x",r,e,t),S("shape",r,e,t))];case"MirrorPad":return[o.mirrorPad(S("x",r,e,t),S("padding",r,e,t),S("mode",r,e,t))];case"PadV2":case"Pad":return[o.pad(S("x",r,e,t),S("padding",r,e,t),S("constantValue",r,e,t))];case"SpaceToBatchND":{let n=S("blockShape",r,e,t),s=S("paddings",r,e,t);return[o.spaceToBatchND(S("x",r,e,t),n,s)]}case"BatchToSpaceND":{let n=S("blockShape",r,e,t),s=S("crops",r,e,t);return[o.batchToSpaceND(S("x",r,e,t),n,s)]}case"DepthToSpace":{let n=S("blockSize",r,e,t),s=S("dataFormat",r,e,t).toUpperCase();return[o.depthToSpace(S("x",r,e,t),n,s)]}case"BroadcastTo":return[o.broadcastTo(S("x",r,e,t),S("shape",r,e,t))];case"BroadcastArgs":return[o.broadcastArgs(S("s0",r,e,t),S("s1",r,e,t))];default:throw TypeError(`Node type ${r.op} is not implemented`)}};function QC(r,e,t,o,n=Ne){let s=((a,i,p)=>{switch(a.category){case"arithmetic":return n(()=>eN(a,i,p));case"basic_math":return n(()=>tN(a,i,p));case"control":return iN(a,i,p);case"convolution":return n(()=>pN(a,i,p));case"creation":return n(()=>cN(a,i,p));case"dynamic":return lN(a,i,p);case"evaluation":return n(()=>mN(a,i,p));case"image":return n(()=>hN(a,i,p));case"graph":return n(()=>fN(a,i,p));case"logical":return n(()=>gN(a,i,p));case"matrices":return n(()=>xN(a,i,p));case"normalization":return n(()=>yN(a,i,p));case"reduction":return n(()=>bN(a,i,p));case"slice_join":return n(()=>CN(a,i,p));case"sparse":return n(()=>IN(a,i,p));case"spectral":return n(()=>wN(a,i,p));case"string":return n(()=>SN(a,i,p));case"transformation":return n(()=>vN(a,i,p));case"hash_table":return dN(a,i,p,o);case"custom":let u=td(a.op);if(u&&u.customExecutor)return u.customExecutor(new fd(a,i,p));throw TypeError(`Custom op ${a.op} is not registered.`);default:throw TypeError(`Unknown op '${a.op}'. File an issue at https://github.com/tensorflow/tfjs/issues so we can add it, or register a custom execution with tf.registerOp()`)}})(r,e,t);return x.isPromise(s)?s.then(a=>[].concat(a)):[].concat(s)}var yl=class{constructor(e={},t={},o={},n={}){this.weightMap=e,this.tensorArrayMap=t,this.tensorListMap=o,this.functionMap=n,this.rootContext={id:0,frameName:"",iterationId:0},this.contexts=[this.rootContext],this.lastId=0,this.generateCurrentContextIds()}newFrame(e,t){return{id:e,frameName:t,iterationId:0}}set currentContext(e){this.contexts!==e&&(this.contexts=e,this.generateCurrentContextIds())}get currentContext(){return this.contexts}get currentContextId(){return this._currentContextIds[0]}get currentContextIds(){return this._currentContextIds}generateCurrentContextIds(){let e=[];for(let t=0;tt.id===0&&t.iterationId===0?"":`${t.frameName}-${t.iterationId}`).join("/"):""}enterFrame(e){this.contexts&&(this.lastId++,this.contexts=this.contexts.slice(),this.contexts.push(this.newFrame(this.lastId,e)),this._currentContextIds.unshift(this.contextIdforContexts(this.contexts)))}exitFrame(){if(this.contexts&&this.contexts.length>1)this.contexts=this.contexts.slice(),this.contexts.splice(-1),this.currentContextIds.shift();else throw new Error("Cannot exit frame, the context is empty")}nextIteration(){if(this.contexts&&this.contexts.length>0){this.contexts=this.contexts.slice(),this.lastId++;let e=Object.assign({},this.contexts[this.contexts.length-1]);e.iterationId+=1,e.id=this.lastId,this.contexts.splice(-1,1,e),this._currentContextIds.splice(0,1,this.contextIdforContexts(this.contexts))}else throw new Error("Cannot increase frame iteration, the context is empty")}getWeight(e){return this.weightMap[e]}addTensorArray(e){this.tensorArrayMap[e.id]=e}getTensorArray(e){return this.tensorArrayMap[e]}addTensorList(e){this.tensorListMap[e.id]=e}getTensorList(e){return this.tensorListMap[e]}dispose(e){for(let t in this.tensorArrayMap)this.tensorArrayMap[t].clearAndClose(e);for(let t in this.tensorListMap)this.tensorListMap[t].clearAndClose(e)}};function ZC(r,e,t,o){let n=new Set,s=[],a=null,i=null,p=new Set,u=Object.keys(r).map(m=>Sr(m)[0]),c=[];o!=null&&(c=o.map(m=>Sr(m.name)[0]));let l=[...e];for(;l.length>0;){let m=l.pop();if((JC(m)||B6(m)||V6(m))&&a==null&&(a=m,i=a.children.map(f=>f.name).filter(f=>n.has(f))),n.add(m.name),t[m.name]==null&&u.indexOf(m.name)===-1&&c.indexOf(m.name)===-1){if(m.inputs.length===0){s.push(m.name);continue}m.inputs.forEach(f=>{p.has(f.name)||(p.add(f.name),l.push(f))})}}return{inputs:r,outputs:e,usedNodes:n,missingInputs:s,dynamicNode:a,syncInputs:i}}function kN(r,e,t){let{usedNodes:o,inputs:n}=t,s=[],a=Object.keys(n).map(c=>Sr(c)[0]).map(c=>r.nodes[c]),i=r.initNodes;a.forEach(c=>{o.has(c.name)&&s.push(c)}),r.weights.forEach(c=>{o.has(c.name)&&s.push(c)}),i!=null&&i.forEach(c=>{o.has(c.name)&&s.push(c)});let p=new Set,u=[];for(;s.length>0;){let c=s.pop();p.add(c.name),e[c.name]||u.push(c),c.children.forEach(l=>{!p.has(l.name)&&o.has(l.name)&&l.inputs.every(m=>p.has(m.name))&&s.push(l)})}return u}var O6=["Switch","Merge","Enter","Exit","NextIteration","StatelessIf","StatelessWhile","if","While"],M6=["NonMaxSuppressionV2","NonMaxSuppressionV3","NonMaxSuppressionV5","Where"],L6=["HashTable","HashTableV2","LookupTableImport","LookupTableImportV2","LookupTableFind","LookupTableFindV2","LookupTableSize","LookupTableSizeV2"];function JC(r){return O6.indexOf(r.op)>=0}function B6(r){return M6.indexOf(r.op)>=0}function V6(r){return L6.indexOf(r.op)>=0}var Cu=class{constructor(e,t){this.graph=e,this.parent=t,this.compiledMap=new Map,this._weightMap={},this.SEPERATOR=",",this._functions={},this._functionExecutorMap={},this.intermediateTensors={},this.keepTensorForDebug=!1,this._outputs=e.outputs,this._inputs=e.inputs,this._initNodes=e.initNodes,this._signature=e.signature,this._functions=e.functions,e.functions!=null&&Object.keys(e.functions).forEach(o=>{this._functionExecutorMap[o]=new Cu(e.functions[o],this)})}get weightIds(){return this.parent?this.parent.weightIds:this._weightIds}get functionExecutorMap(){return this.parent?this.parent.functionExecutorMap:this._functionExecutorMap}get weightMap(){return this.parent?this.parent.weightMap:this._weightMap}set weightMap(e){let t=Object.keys(e).map(o=>e[o].map(n=>n.id));this._weightIds=[].concat(...t),this._weightMap=e}set resourceManager(e){this._resourceManager=e}get inputs(){return this._inputs.map(e=>({name:e.name,shape:e.attrParams.shape?e.attrParams.shape.value:void 0,dtype:e.attrParams.dtype?e.attrParams.dtype.value:void 0}))}get outputs(){return this._outputs.map(e=>({name:e.name,shape:e.attrParams.shape?e.attrParams.shape.value:void 0,dtype:e.attrParams.dtype?e.attrParams.dtype.value:void 0}))}get inputNodes(){return this._inputs.map(e=>e.signatureKey||e.name)}get outputNodes(){return this._outputs.map(e=>{let t=e.signatureKey||e.name;return e.defaultOutput?`${t}:${e.defaultOutput}`:t})}get functions(){return Object.keys(this._functions).reduce((e,t)=>(e[t]=this._functions[t].signature,e),{})}getCompilationKey(e,t){let o=e.map(s=>s.name).sort(),n=t.map(s=>s.name).sort();return o.join(this.SEPERATOR)+"--"+n.join(this.SEPERATOR)}compile(e,t){let o=ZC(e,t,this.weightMap,this._initNodes),{missingInputs:n,dynamicNode:s,syncInputs:a}=o;if(s!=null)throw new Error(`This execution contains the node '${s.name}', which has the dynamic op '${s.op}'. Please use model.executeAsync() instead. Alternatively, to avoid the dynamic ops, specify the inputs [${a}]`);if(n.length>0){let i=t.map(u=>u.name),p=Object.keys(e);throw new Error(`Cannot compute the outputs [${i}] from the provided inputs [${p}]. Missing the following inputs: [${n}]`)}return kN(this.graph,this.weightMap,o)}execute(e,t){e=this.mapInputs(e);let o=Object.keys(e).sort();this.checkInputs(e),this.checkInputShapeAndType(e),t=this.mapOutputs(t),this.checkOutputs(t);let n=o.map(l=>this.graph.nodes[Sr(l)[0]]),s=t.map(l=>Sr(l)[0]),a=s.map(l=>this.graph.nodes[l]);this.resetIntermediateTensors(),a.length===0&&(a=this._outputs);let i=this.getCompilationKey(n,a),p=this.compiledMap.get(i);p==null&&(p=this.compile(e,a),this.compiledMap.set(i,p));let u={},c={};return Ne(()=>{let l=new yl(this.weightMap,u,c,this.functionExecutorMap),m=Object.assign({},this.weightMap);Object.keys(e).forEach(h=>{let[g,y]=Sr(h),b=[];b[y]=e[h],m[g]=b});let f=this.getFrozenTensorIds(m),d={};for(let h=0;hHt(h,m,l))})}getFrozenTensorIds(e){let t=[].concat.apply([],Object.keys(e).map(o=>e[o]).map(o=>o.map(n=>n.id)));return new Set(t)}checkTensorForDisposal(e,t,o,n,s,a,i){t.category==="control"||a.indexOf(e)!==-1||(o[e].forEach(p=>{p!=null&&(i[p.id]=(i[p.id]||0)+t.children.length)}),t.inputs.forEach(p=>{if(p.category!=="control"){let u=YT(p.name,o,n);u!=null&&u.forEach(c=>{if(c&&!c.kept&&!s.has(c.id)){let l=i[c.id];if(l===1){if(!this.keepTensorForDebug)c.dispose();else{let[m,f]=zo(t.name,n);this.intermediateTensors[m]?this.intermediateTensors[m][f]=c:(this.intermediateTensors[m]=[],this.intermediateTensors[m][f]=c)}delete i[c.id]}else l!=null&&i[c.id]--}})}}))}async executeAsync(e,t){return this._executeAsync(e,t)}disposeIntermediateTensors(){!this.intermediateTensors||(Object.keys(this.intermediateTensors).forEach(e=>this.intermediateTensors[e].forEach(t=>t.dispose())),this.disposeTensorsMap())}disposeTensorsMap(){!this.tensorsMap||Object.keys(this.tensorsMap).forEach(e=>{this.tensorsMap[e].forEach(o=>{o&&!o.kept&&!o.isDisposed&&!this.keepIds.has(o.id)&&o.dispose()})})}getIntermediateTensors(){return this.tensorsMap}resetIntermediateTensors(){for(let e in this.intermediateTensors)this.intermediateTensors[e].forEach(t=>t.dispose()),delete this.intermediateTensors[e]}async _executeAsync(e,t,o=!1,n={},s={}){o||(e=this.mapInputs(e),this.checkInputs(e),this.checkInputShapeAndType(e),t=this.mapOutputs(t),this.checkOutputs(t));try{this.keepTensorForDebug=P().getBool("KEEP_INTERMEDIATE_TENSORS")}catch(c){console.warn(c.message)}this.resetIntermediateTensors();let a=new yl(this.weightMap,n,s,this.functionExecutorMap);this.tensorsMap=await this.executeWithControlFlow(e,a,t,o);let i=t.map(c=>Ht(c,this.tensorsMap,a)),p=i.map(c=>c.id),u=Object.keys(e).map(c=>e[c].id);return this.keepIds=new Set([...p,...u,...this.weightIds]),this.keepTensorForDebug||this.disposeTensorsMap(),this.parent==null&&a.dispose(this.keepIds),i}async executeFunctionAsync(e,t,o){let n=e.reduce((s,a,i)=>(s[this.inputs[i].name]=a,s),{});return this._executeAsync(n,this.outputNodes,!0,t,o)}async executeWithControlFlow(e,t,o,n){let s=Object.keys(e),a=s.map(C=>this.graph.nodes[Sr(C)[0]]),i=o.map(C=>Sr(C)[0]),p=i.map(C=>this.graph.nodes[C]);p.length===0&&(p=this._outputs);let{usedNodes:u,missingInputs:c,dynamicNode:l,syncInputs:m}=ZC(e,p,this.weightMap,this._initNodes),f=[...a,...this.graph.weights,...this._initNodes||[]].map(C=>({node:C,contexts:t.currentContext})),d=Object.assign({},this.weightMap);Object.keys(e).forEach(C=>{let[w,k]=Sr(C),_=[];_[k]=e[C],d[w]=_});let h={},g=this.getFrozenTensorIds(d),y={};for(;f.length>0;){let C=this.processStack(a,f,t,d,y,g,i,h,u);await Promise.all(C)}l==null&&!n&&console.warn("This model execution did not contain any nodes with control flow or dynamic output shapes. You can use model.execute() instead.");let b=p.filter(C=>!JC(C)&&!Ht(C.name,d,t)).map(C=>C.name);if(b.length>0){let C="";throw l!=null&&(C=`Alternatively, to avoid the dynamic ops, use model.execute() and specify the inputs [${m}]`),new Error(`Cannot compute the outputs [${b}] from the provided inputs [${s}]. Consider providing the following inputs: [${c}]. ${C}`)}return d}processStack(e,t,o,n,s,a,i,p,u){let c=[];for(;t.length>0;){let l=t.pop();o.currentContext=l.contexts;let m="";if(l.node.op==="Enter"&&S("isConstant",l.node,n,o)&&([m]=zo(l.node.name,o)),n[l.node.name]==null){let f=QC(l.node,n,o,this._resourceManager);m||([m]=zo(l.node.name,o));let d=o.currentContext;x.isPromise(f)?c.push(f.then(h=>(n[m]=h,o.currentContext=d,this.checkTensorForDisposal(m,l.node,n,o,a,i,p),this.processChildNodes(l.node,t,o,n,s,u),h))):(n[m]=f,this.checkTensorForDisposal(m,l.node,n,o,a,i,p),this.processChildNodes(l.node,t,o,n,s,u))}else this.processChildNodes(l.node,t,o,n,s,u)}return c}processChildNodes(e,t,o,n,s,a){e.children.forEach(i=>{let[p]=zo(i.name,o);s[p]||!a.has(i.name)||(i.op==="Merge"?i.inputNames.some(u=>!!Ht(u,n,o))&&(s[p]=!0,t.push({contexts:o.currentContext,node:i})):i.inputNames.every(u=>!!Ht(u,n,o))&&(s[p]=!0,t.push({contexts:o.currentContext,node:i})))})}dispose(){Object.keys(this.weightMap).forEach(e=>this.weightMap[e].forEach(t=>t.dispose()))}checkInputShapeAndType(e){Object.keys(e).forEach(t=>{let o=e[t],[n]=Sr(t),s=this.graph.nodes[n];if(s.attrParams.shape&&s.attrParams.shape.value){let a=s.attrParams.shape.value,i=a.length===o.shape.length&&o.shape.every((p,u)=>a[u]===-1||a[u]===p);x.assert(i,()=>`The shape of dict['${s.name}'] provided in model.execute(dict) must be [${a}], but was [${o.shape}]`)}s.attrParams.dtype&&s.attrParams.dtype.value&&x.assert(o.dtype===s.attrParams.dtype.value,()=>`The dtype of dict['${s.name}'] provided in model.execute(dict) must be ${s.attrParams.dtype.value}, but was ${o.dtype}`)})}mapInputs(e){let t={};for(let o in e)if(this._signature!=null&&this._signature.inputs!=null&&this._signature.inputs[o]!=null){let n=this._signature.inputs[o];t[n.name]=e[o]}else t[o]=e[o];return t}checkInputs(e){let t=Object.keys(e).filter(o=>{let[n]=Sr(o);return this.graph.nodes[n]==null});if(t.length>0)throw new Error(`The dict provided in model.execute(dict) has keys: [${t}] that are not part of graph`)}mapOutputs(e){return e.map(t=>this._signature!=null&&this._signature.outputs!=null&&this._signature.outputs[t]!=null?this._signature.outputs[t].name:t,{})}checkOutputs(e){e.forEach(t=>{let[o]=Sr(t);if(!this.graph.nodes[o])throw new Error(`The output '${t}' is not found in the graph`)})}};var xd=class{constructor(e={},t={}){this.hashTableNameToHandle=e,this.hashTableMap=t}addHashTable(e,t){this.hashTableNameToHandle[e]=t.handle,this.hashTableMap[t.id]=t}getHashTableHandleByName(e){return this.hashTableNameToHandle[e]}getHashTableById(e){return this.hashTableMap[e]}dispose(){for(let e in this.hashTableMap)this.hashTableMap[e].clearAndClose(),delete this.hashTableMap[e];for(let e in this.hashTableNameToHandle)this.hashTableNameToHandle[e].dispose(),delete this.hashTableNameToHandle[e]}};var z6="?tfjs-format=file",W6="model.json",bl=class{constructor(e,t={},o=va){this.modelUrl=e,this.loadOptions=t,this.version="n/a",this.io=o,t==null&&(this.loadOptions={}),this.resourceManager=new xd}get modelVersion(){return this.version}get inputNodes(){return this.executor.inputNodes}get outputNodes(){return this.executor.outputNodes}get inputs(){return this.executor.inputs}get outputs(){return this.executor.outputs}get weights(){return this.executor.weightMap}get metadata(){return this.artifacts.userDefinedMetadata}get modelSignature(){return this.signature}get modelStructuredOutputKeys(){return this.structuredOutputKeys}findIOHandler(){let e=this.modelUrl;if(e.load!=null)this.handler=e;else if(this.loadOptions.requestInit!=null)this.handler=this.io.browserHTTPRequest(e,this.loadOptions);else{let t=this.io.getLoadHandlers(e,this.loadOptions);if(t.length===0)t.push(this.io.browserHTTPRequest(e,this.loadOptions));else if(t.length>1)throw new Error(`Found more than one (${t.length}) load handlers for URL '${[e]}'`);this.handler=t[0]}}load(){if(this.findIOHandler(),this.handler.load==null)throw new Error("Cannot proceed with model loading because the IOHandler provided does not have the `load` method implemented.");let e=this.handler.load();return x.isPromise(e)?e.then(t=>this.loadSync(t)):this.loadSync(e)}loadSync(e){this.artifacts=e;let t=this.artifacts.modelTopology,o=this.artifacts.signature;if(this.artifacts.userDefinedMetadata!=null){let s=this.artifacts.userDefinedMetadata;s.signature!=null&&(o=s.signature),s.structuredOutputKeys!=null&&(this.structuredOutputKeys=s.structuredOutputKeys)}this.signature=o,this.version=`${t.versions.producer}.${t.versions.minConsumer}`;let n=this.io.decodeWeights(this.artifacts.weightData,this.artifacts.weightSpecs);if(this.executor=new Cu(xl.Instance.transformGraph(t,this.signature)),this.executor.weightMap=this.convertTensorMapToTensorsMap(n),this.executor.resourceManager=this.resourceManager,e.modelInitializer!=null&&e.modelInitializer.node!=null){let s=xl.Instance.transformGraph(e.modelInitializer);this.initializer=new Cu(s),this.initializer.weightMap=this.executor.weightMap,this.initializer.resourceManager=this.resourceManager,this.initializerSignature=e.initializerSignature}return!0}async save(e,t){if(typeof e=="string"){let o=this.io.getSaveHandlers(e);if(o.length===0)throw new Error(`Cannot find any save handlers for URL '${e}'`);if(o.length>1)throw new Error(`Found more than one (${o.length}) save handlers for URL '${e}'`);e=o[0]}if(e.save==null)throw new Error("GraphModel.save() cannot proceed because the IOHandler provided does not have the `save` attribute defined.");return e.save(this.artifacts)}predict(e,t){let o=this.execute(e,this.outputNodes);if(this.structuredOutputKeys){let n=o instanceof ut?[o]:o,s={};return n.forEach((a,i)=>s[this.structuredOutputKeys[i]]=a),s}return o}normalizeInputs(e){if(!(e instanceof ut)&&!Array.isArray(e)){if(this.signature!=null&&this.signature.inputs!=null)for(let n in this.signature.inputs){let s=this.signature.inputs[n];s.resourceId!=null&&(e[n]=this.resourceIdToCapturedInput[s.resourceId])}return e}e=Array.isArray(e)?e:[e];let t=Object.keys(this.resourceIdToCapturedInput).length;if(e.length+t!==this.inputNodes.length)throw new Error(`Input tensor count mismatch, the graph model has ${this.inputNodes.length-t} non-resource placeholders, while there are ${e.length} input tensors provided.`);let o=0;return this.inputNodes.reduce((n,s)=>{let a=this.signature?this.signature.inputs[s]:null;return a!=null&&a.resourceId!=null?n[s]=this.resourceIdToCapturedInput[a.resourceId]:n[s]=e[o++],n},{})}normalizeOutputs(e){return e=e||this.outputNodes,Array.isArray(e)?e:[e]}executeInitializerGraph(){return this.initializer==null?[]:this.initializerSignature==null?this.initializer.execute({},[]):this.initializer.execute({},Object.keys(this.initializerSignature.outputs))}async executeInitializerGraphAsync(){return this.initializer==null?[]:this.initializerSignature==null?this.initializer.executeAsync({},[]):this.initializer.executeAsync({},Object.keys(this.initializerSignature.outputs))}setResourceIdToCapturedInput(e){if(this.resourceIdToCapturedInput={},this.initializerSignature){let t=Object.keys(this.initializerSignature.outputs);for(let o=0;o1?o:o[0]}async executeAsync(e,t){this.resourceIdToCapturedInput==null&&this.setResourceIdToCapturedInput(await this.executeInitializerGraphAsync()),e=this.normalizeInputs(e),t=this.normalizeOutputs(t);let o=await this.executor.executeAsync(e,t);return o.length>1?o:o[0]}getIntermediateTensors(){return this.executor.getIntermediateTensors()}disposeIntermediateTensors(){this.executor.disposeIntermediateTensors()}convertTensorMapToTensorsMap(e){return Object.keys(e).reduce((t,o)=>(t[o]=[e[o]],t),{})}dispose(){this.executor.dispose(),this.initializer&&(this.initializer.dispose(),this.resourceIdToCapturedInput&&Ft(this.resourceIdToCapturedInput)),this.resourceManager.dispose()}};async function U6(r,e={},t=va){if(r==null)throw new Error("modelUrl in loadGraphModel() cannot be null. Please provide a url or an IOHandler that loads the model");e==null&&(e={}),e.fromTFHub&&typeof r=="string"&&(r=H6(r));let o=new bl(r,e,t);return await o.load(),o}function G6(r){if(r==null)throw new Error("modelUrl in loadGraphModelSync() cannot be null. Please provide model artifacts or an IOHandler that loads the model");let e;if(r instanceof Array){let[o,n]=r;if(!o)throw new Error("modelJSON must be the first element of the array");if(!n||!(n instanceof ArrayBuffer))throw new Error("An ArrayBuffer of weights must be the second element of the array");if(!("modelTopology"in o))throw new Error("Model JSON is missing 'modelTopology'");if(!("weightsManifest"in o))throw new Error("Model JSON is missing 'weightsManifest'");let s=va.getWeightSpecs(o.weightsManifest),a=va.getModelArtifactsForJSONSync(o,s,n);e=va.fromMemorySync(a)}else if("load"in r)e=r;else if("modelTopology"in r&&"weightSpecs"in r&&"weightData"in r)e=va.fromMemorySync(r);else throw new Error("Unknown model format");let t=new bl(e);return t.load(),t}function H6(r){return r.endsWith("/")||(r=r+"/"),`${r}${W6}${z6}`}var q6="4.0.0";function K(r,e){Array.isArray(r)||(r=[r]),r.forEach(t=>{t!=null&&x.assert(t.dtype!=="complex64",()=>`${e} does not support complex64 tensors in the CPU backend.`)})}var K6=Bt.whereImpl,Si=class extends Jr{constructor(){super(),this.blockSize=48,this.firstUse=!0,this.data=new rn(this,cr())}nextDataId(){return Si.nextDataId++}write(e,t,o){this.firstUse&&(this.firstUse=!1,P().get("IS_NODE")&&I.warn(` +============================ +Hi, looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, visit https://github.com/tensorflow/tfjs-node for more details. +============================`));let n={id:this.nextDataId()};return this.data.set(n,{values:e,dtype:o,refCount:1}),n}makeTensorInfo(e,t,o){let n;if(t==="string"&&o!=null&&o.length>0&&x.isString(o[0])){let s=o.map(a=>x.encodeString(a));n=this.write(s,e,t)}else n=this.write(o,e,t);return{dataId:n,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,o,n,s){this.data.set(e,{values:t,dtype:n,refCount:s})}numDataIds(){return this.data.numDataIds()}async read(e){return this.readSync(e)}readSync(e){let{dtype:t,complexTensorInfos:o}=this.data.get(e);if(t==="complex64"){let n=this.readSync(o.real.dataId),s=this.readSync(o.imag.dataId);return I.mergeRealAndImagArrays(n,s)}return this.data.get(e).values}bufferSync(e){let t=this.readSync(e.dataId);if(e.dtype==="string")try{let o=t.map(n=>x.decodeString(n));return ne(e.shape,e.dtype,o)}catch(o){throw new Error("Failed to decode encoded string bytes into utf-8")}return ne(e.shape,e.dtype,t)}makeOutput(e,t,o){return cr().makeTensorFromTensorInfo(this.makeTensorInfo(t,o,e),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:o}=this.data.get(e);o!=null&&(this.disposeData(o.real.dataId,!0),this.disposeData(o.imag.dataId,!0)),this.data.delete(e)}return!0}disposeIntermediateTensorInfo(e){this.disposeData(e.dataId)}async time(e){let t=x.now();return e(),{kernelMs:x.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){K([e],"where");let t=this.readSync(e.dataId);return K6(e.shape,t)}dispose(){}floatPrecision(){return 32}epsilon(){return super.epsilon()}};Si.nextDataId=0;var Ad={};Be(Ad,{addImpl:()=>rI,bincountImpl:()=>Zp,bincountReduceImpl:()=>yd,castImpl:()=>tI,ceilImpl:()=>oI,concatImpl:()=>Iu,equalImpl:()=>nI,expImpl:()=>aI,expm1Impl:()=>uI,floorImpl:()=>pI,gatherNdImpl:()=>bd,gatherV2Impl:()=>Cd,greaterEqualImpl:()=>lI,greaterImpl:()=>cI,lessEqualImpl:()=>fI,lessImpl:()=>mI,linSpaceImpl:()=>Id,logImpl:()=>dI,maxImpl:()=>wd,maximumImpl:()=>hI,minimumImpl:()=>gI,multiplyImpl:()=>Cl,negImpl:()=>xI,notEqualImpl:()=>yI,prodImpl:()=>bI,raggedGatherImpl:()=>Sd,raggedRangeImpl:()=>vd,raggedTensorToTensorImpl:()=>kd,rangeImpl:()=>Su,rsqrtImpl:()=>CI,scatterImpl:()=>Aa,sigmoidImpl:()=>e2,simpleAbsImpl:()=>eI,sliceImpl:()=>vu,sparseFillEmptyRowsImpl:()=>Td,sparseReshapeImpl:()=>Nd,sparseSegmentReductionImpl:()=>tc,sqrtImpl:()=>o2,squaredDifferenceImpl:()=>wI,stridedSliceImpl:()=>_d,stringNGramsImpl:()=>ku,stringSplitImpl:()=>Tu,stringToHashBucketFastImpl:()=>Nu,subImpl:()=>vI,tileImpl:()=>Ed,topKImpl:()=>$d,transposeImpl:()=>Jp,uniqueImpl:()=>Rd});function eI(r){let e=new Float32Array(r.length);for(let t=0;t{let{x:e}=r.inputs,t=r.backend;K(e,"abs");let o=new Float32Array(x.sizeFromShape(e.shape)),n=t.data.get(e.dataId).values;return o=eI(n),t.makeOutput(o,e.shape,e.dtype)},TN={kernelName:sn,backendName:"cpu",kernelFunc:j6};function Le(r){return(e,t,o,n,s)=>{let a=I.assertAndGetBroadcastShape(e,t),i=a.length,p=x.computeStrides(a),u=x.sizeFromShape(a),c=x.getTypedArrayFromDType(s,u),l=e.length,m=t.length,f=x.computeStrides(e),d=x.computeStrides(t),h=I.getBroadcastDims(e,a),g=I.getBroadcastDims(t,a);if(h.length+g.length===0)for(let y=0;yC[E]=0);let w=x.locToIndex(C,l,f),k=b.slice(-m);g.forEach(E=>k[E]=0);let _=x.locToIndex(k,m,d);c[y]=r(o[w],n[_])}return[c,a]}}function qt(r){let{inputs:e,backend:t}=r,{real:o,imag:n}=e,s=t.data.get(o.dataId).values,a=t.data.get(n.dataId).values,i=t.makeTensorInfo(o.shape,"complex64"),p=t.data.get(i.dataId);return p.complexTensorInfos={real:t.makeTensorInfo(o.shape,"float32",s),imag:t.makeTensorInfo(n.shape,"float32",a)},i}var NN={kernelName:aa,backendName:"cpu",kernelFunc:qt};function Yp(r,e,t="float32"){if(t==="complex64"){let n=Yp(r,e,"float32"),s=Yp(r,e,"float32");return qt({inputs:{real:n,imag:s},backend:r})}let o=x.makeZerosTypedArray(x.sizeFromShape(e),t);return r.makeTensorInfo(e,t,o)}function ar(r){let{inputs:e,backend:t}=r,{x:o}=e;return t.incRef(o.dataId),{dataId:o.dataId,shape:o.shape,dtype:o.dtype}}var _N={kernelName:uo,backendName:"cpu",kernelFunc:ar};function Wo(r){let{inputs:e,backend:t}=r,{input:o}=e,n=t.data.get(o.dataId).complexTensorInfos.real,s=t.data.get(n.dataId).values;return t.makeTensorInfo(n.shape,n.dtype,s)}var EN={kernelName:la,backendName:"cpu",kernelFunc:Wo};function tI(r,e,t,o){if(o==="int32"){let n=Int32Array.from(r);return[e,"int32",n]}if(o==="bool"){let n=x.toTypedArray([0],t),[s,a]=Le((i,p)=>i!==p?1:0)(e,[],r,n,"bool");return[a,"bool",s]}throw new Error(`Error in Cast: failed to cast ${t} to ${o}`)}function Uo(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{dtype:s}=o;if(s==="complex64"){if(n.dtype==="complex64")return ar({inputs:{x:n},backend:t});let c=Yp(t,n.shape,n.dtype),l=Uo({inputs:{x:n},backend:t,attrs:{dtype:"float32"}}),m=qt({inputs:{real:l,imag:c},backend:t});return t.disposeIntermediateTensorInfo(c),t.disposeIntermediateTensorInfo(l),m}if(n.dtype==="complex64"){let c=Wo({inputs:{input:n},backend:t}),l=Uo({inputs:{x:c},backend:t,attrs:{dtype:s}});return t.disposeIntermediateTensorInfo(c),l}if(!x.hasEncodingLoss(n.dtype,s)){let c=ar({inputs:{x:n},backend:t});return{dataId:c.dataId,shape:c.shape,dtype:s}}let a=t.data.get(n.dataId).values,[i,p,u]=tI(a,n.shape,n.dtype,s);return t.makeTensorInfo(i,p,u)}var $N={kernelName:to,backendName:"cpu",kernelFunc:Uo};function Ye(r,e,t,o){return t==null?({inputs:n,backend:s})=>{let{a,b:i}=n,p=s;K([a,i],r);let u=p.data.get(a.dataId).values,c=p.data.get(i.dataId).values,l=a.dtype==="string"?I.fromUint8ToStringArray(u):u,m=a.dtype==="string"?I.fromUint8ToStringArray(c):c,f=o||a.dtype,[d,h]=e(a.shape,i.shape,l,m,f);return p.makeTensorInfo(h,f,d)}:({inputs:n,backend:s})=>{let{a,b:i}=n,p=s;if(a.dtype==="complex64"||i.dtype==="complex64"){let u=Uo({inputs:{x:a},backend:p,attrs:{dtype:"complex64"}}),c=p.data.get(u.dataId),l=c.complexTensorInfos.real,m=c.complexTensorInfos.imag,f=p.data.get(l.dataId).values,d=p.data.get(m.dataId).values,h=Uo({inputs:{x:i},backend:p,attrs:{dtype:"complex64"}}),g=p.data.get(h.dataId),y=g.complexTensorInfos.real,b=g.complexTensorInfos.imag,C=p.data.get(y.dataId).values,w=p.data.get(b.dataId).values,[k,_,E]=t(a.shape,i.shape,f,d,C,w),R=p.makeTensorInfo(E,"float32",k),A=p.makeTensorInfo(E,"float32",_),D=qt({inputs:{real:R,imag:A},backend:p});return p.disposeIntermediateTensorInfo(u),p.disposeIntermediateTensorInfo(h),p.disposeIntermediateTensorInfo(R),p.disposeIntermediateTensorInfo(A),D}else{let u=p.data.get(a.dataId).values,c=p.data.get(i.dataId).values,l=o||a.dtype,[m,f]=e(a.shape,i.shape,u,c,l);return p.makeTensorInfo(f,l,m)}}}function Qp(r){return(e,t,o,n,s,a)=>{let i=I.assertAndGetBroadcastShape(e,t),p=x.sizeFromShape(i),u=i.length,c=x.computeStrides(i),l=x.getTypedArrayFromDType("float32",p),m=x.getTypedArrayFromDType("float32",p),f=I.getBroadcastDims(e,i),d=I.getBroadcastDims(t,i),h=I.mergeRealAndImagArrays(o,n),g=I.mergeRealAndImagArrays(s,a),y=e.length,b=x.computeStrides(e),C=t.length,w=x.computeStrides(t);if(f.length+d.length===0)for(let k=0;kE[M]=0);let R=x.locToIndex(E,y,b),A=_.slice(-C);d.forEach(M=>A[M]=0);let D=x.locToIndex(A,C,w),O=r(h[R*2],h[R*2+1],g[D*2],g[D*2+1]);l[k]=O.real,m[k]=O.imag}return[l,m,i]}}var rI=Le((r,e)=>r+e),X6=Qp((r,e,t,o)=>({real:r+t,imag:e+o})),Hs=Ye(_r,rI,X6),RN={kernelName:_r,backendName:"cpu",kernelFunc:Hs};function Zp(r,e,t,o,n){let s=x.sizeFromShape(o),a=x.makeZerosTypedArray(n,t);for(let i=0;i=n||(s>0?a[p]+=e[i]:a[p]+=1)}return a}function yd(r,e,t,o=!1){let n=r.shape[0],s=r.shape[1],a=ne([n,t],e.dtype);for(let i=0;i=t||(o?a.set(1,i,u):e.size>0?a.set(a.get(i,u)+e.get(i,p),i,u):a.set(a.get(i,u)+1,i,u))}return a}function vr(r){return(e,t,o)=>{let n=x.getTypedArrayFromDType(t,e.length);for(let s=0;s{let{x:a}=o;if(K(a,r),a.dtype==="string"||t==="string")throw new Error("unaryKernelFunc does not support string input/output");let i=s,p=i.data.get(a.dataId).values,u=x.sizeFromShape(a.shape),c=t||a.dtype,l=x.getArrayFromDType(c,u);for(let m=0;m{let{x:a}=o;if(K(a,r),a.dtype==="string"||t==="string")throw new Error("unaryKernelFunc does not support string input/output");let i=s,p=i.data.get(a.dataId).values,u=t||a.dtype,c=e(p,u,n);return i.makeTensorInfo(a.shape,u,c)}}var oI=vr(r=>Math.ceil(r)),Y6=Go(ro,oI),AN={kernelName:ro,backendName:"cpu",kernelFunc:Y6};function Iu(r,e,t,o){let n=x.getArrayFromDType(t,x.sizeFromShape(e));if(o&&t!=="string"){let s=0;r.forEach(a=>{let i=x.sizeFromShape(a.shape);n.set(a.vals,s),s+=i})}else{let s=0;r.forEach(a=>{let i=t==="string"?I.fromUint8ToStringArray(a.vals):a.vals,p=0;for(let u=0;ur===e?1:0),sI=Ye(oo,nI,null,"bool"),FN={kernelName:oo,backendName:"cpu",kernelFunc:sI};var aI=vr(r=>Math.exp(r)),iI=Go(no,aI,"float32"),DN={kernelName:no,backendName:"cpu",kernelFunc:iI};var uI=vr(r=>Math.expm1(r)),Q6=Go(wn,uI),PN={kernelName:wn,backendName:"cpu",kernelFunc:Q6};var pI=vr(r=>Math.floor(r)),Z6=Go(so,pI),ON={kernelName:so,backendName:"cpu",kernelFunc:Z6};function bd(r,e,t,o,n,s,a,i,p){let u=ne([o,s],t);for(let c=0;c=p/s)throw new Error(`Invalid indices: ${l} does not index into ${i}`);for(let f=0;fr>e?1:0),J6=Ye(ao,cI,null,"bool"),MN={kernelName:ao,backendName:"cpu",kernelFunc:J6};var lI=Le((r,e)=>r>=e?1:0),ej=Ye(io,lI,null,"bool"),LN={kernelName:io,backendName:"cpu",kernelFunc:ej};var mI=Le((r,e)=>rr<=e?1:0),rj=Ye(co,fI,null,"bool"),VN={kernelName:co,backendName:"cpu",kernelFunc:rj};function Id(r,e,t){let o=(e-r)/(t-1),n=x.makeZerosTypedArray(t,"float32");n[0]=r;for(let s=1;sMath.log(r)),oj=Go(lo,dI),zN={kernelName:lo,backendName:"cpu",kernelFunc:oj};function wd(r,e,t,o){let n=x.getTypedArrayFromDType(o,x.sizeFromShape(t));for(let s=0;si)&&(i=u)}n[s]=i}return n}var hI=Le((r,e)=>Math.max(r,e)),nj=Ye(mo,hI),WN={kernelName:mo,backendName:"cpu",kernelFunc:nj};var gI=Le((r,e)=>Math.min(r,e)),sj=Ye(fo,gI),UN={kernelName:fo,backendName:"cpu",kernelFunc:sj};var Cl=Le((r,e)=>r*e),aj=Qp((r,e,t,o)=>({real:r*t-e*o,imag:r*o+e*t})),wu=Ye(ho,Cl,aj),GN={kernelName:ho,backendName:"cpu",kernelFunc:wu};function xI(r,e,t){let o=x.createScalarValue(-1,t);return Cl([],e,o,r,t)}function ij(r){let{inputs:e,backend:t}=r,{x:o}=e;K(o,"neg");let n=t.data.get(o.dataId).values,[s,a]=xI(n,o.shape,o.dtype);return t.makeTensorInfo(a,o.dtype,s)}var HN={kernelName:Pn,backendName:"cpu",kernelFunc:ij};var yI=Le((r,e)=>r!==e?1:0),uj=Ye(go,yI,null,"bool"),qN={kernelName:go,backendName:"cpu",kernelFunc:uj};function Jp(r,e,t,o,n){let s=e.length,a=x.sizeFromShape(e),i=x.computeStrides(e),p=x.computeStrides(n),u=x.getTypedArrayFromDType(t,x.sizeFromShape(n));for(let c=0;ct.disposeIntermediateTensorInfo(b)),t.makeTensorInfo(y,g,d)}var jN={kernelName:Ao,backendName:"cpu",kernelFunc:pj};function cj(r,e,t){r.forEach((o,n)=>{if(o<0||o>=t){let s=x.indexToLoc(n,e.length,x.computeStrides(e)).join(",");throw new Error(`indices[${s}] = ${o} is not in [0, ${t})`)}})}function lj(r,e){for(let t=0;tn)throw new Error("Ragged splits must not point past values");for(let s=1;so[s])throw new Error("Ragged splits must be sorted in ascending order")}}function mj(r,e,t,o){let n=[],s=0,a=e.length-1+t.length,i=new Array(a).fill(null).map(()=>[0]);lj(t,o);let p=1;for(let u=0;u=0){let h=i[d],g=h[h.length-1]-f[c];for(let y=c;yn[a]=s)}return e}function XN(r,e){let t=r.slice(0,e);for(;t.length1)throw new Error("starts must be a scalar or vector");if(n.length>1)throw new Error("limits must be a scalar or vector");if(a.length>1)throw new Error("deltas must be a scalar or vector");let i=e.length===0,p=n.length===0,u=a.length===0,c=[];i||c.push(e[0]),p||c.push(n[0]),u||c.push(a[0]);for(let g=1;g0&&by)w=0;else if(w=Math.ceil(Math.abs((b-y)/C)),w>YN)throw new Error(`Requires ((limit - start) / delta) <= ${YN}`);m[g+1]=m[g]+w}let f=m[l],d=x.getArrayFromDType(t,f),h=0;for(let g=0;go&&(o=s)}return o}static getMaxWidthValueRowID(e){let t=e.length;if(t===0)return 0;let o=0,n=e[0],s=0;for(let a=1;a"Final length of result must be equal to firstDimension."),s}calculateOutputIndexRowSplit(e,t,o,n){let s=e.length,a=[];for(let i=0;i0&&a.length!==e[s-1])throw new Error("Invalid row split size.");return a}calculateOutputIndexValueRowID(e,t,o,n){let s=e.length,a=[];if(s===0)return[];let i=0,p=e[0];if(p>=t.length)throw new Error(`Got currentValueRowId=${p}, which is not less than ${t.length}`);let u=t[p];a.push(u);for(let c=1;c=0&&(++i,i=t.length)throw new Error(`Got nextValueRowId=${l} which is not less than ${t.length}`);u=t[l]}a.push(u)}if(a.length!==e.length)throw new Error("Invalid row ids.");return a}calculateOutputIndex(e,t,o,n){let s=this.getRowPartitionTensor(e),a=this.getRowPartitionTypeByDimension(e);switch(a){case Ho.VALUE_ROWIDS:return this.calculateOutputIndexValueRowID(s,t,o,n);case Ho.ROW_SPLITS:if(s.length-1>t.length)throw new Error(`Row partition size is greater than output size: ${s.length-1} > ${t.length}`);return this.calculateOutputIndexRowSplit(s,t,o,n);default:throw new Error(`Unsupported partition type: ${Ho[a]}`)}}getFirstDimensionSize(){let e=this.rowPartitionValues[0];if(this.rowPartitionTypes.length===0)throw new Error("No row_partition_types given.");let t=this.rowPartitionTypes[0];switch(t){case Ho.FIRST_DIM_SIZE:return e[0];case Ho.VALUE_ROWIDS:throw new Error("Cannot handle VALUE_ROWIDS in first dimension.");case Ho.ROW_SPLITS:return this.rowPartitionValuesShapes[0][0]-1;default:throw new Error(`Cannot handle type ${Ho[t]}`)}}compute(){if(this.rowPartitionValues[0].length<=0)throw new Error("Invalid first partition input. Tensor requires at least one element.");let t=this.getFirstDimensionSize(),o=this.calculateOutputSize(t),n=new Array(this.raggedRank+1);n[n.length-1]=1;for(let p=n.length-2;p>=0;--p)n[p]=n[p+1]*o[p+1];let s=ZN(o,!1),a=x.getArrayFromDType(this.valuesDType,x.sizeFromShape(s));if(n[0]*o[0]>0){let p=this.calculateFirstParentOutputIndex(t,n[0],o[0]);for(let u=1;u<=this.raggedRank;++u)p=this.calculateOutputIndex(u-1,p,n[u],o[u]);this.setOutput(this.raggedRank,p,a,s)}return[s,a]}setOutput(e,t,o,n){if(o.length===0)return;let s=this.values,a=o,i=n.slice();i=i.slice(e+1);let p=x.sizeFromShape(i),u=t.length,c=this.defaultValue;if(c.length!==p&&c.length!==1){let d=this.defaultValueShape;Ne(()=>{let h=z(c,d);c=Ls(h,i).dataSync()})}let l=0,m=0,f=0;for(let d=0;d<=u;++d){let h=d=u){let g=o.length;h=Math.floor(g/p)}if(h>f)if(this.defaultValue.length===1)a.subarray(f*p,h*p).fill(this.defaultValue[0]),f=h;else for(;h>f;){let g=a.slice(f*p);QN(g,c,p),++f}h<0?(l=d+1,m=f):(l=d,m=f,f=m+1)}}};function QN(r,e,t){for(let o=0;o= 0`);if(o<-1)throw new Error(`Dimension ${o} must be >= -1`);o=-1}t.push(o)}return t}function kd(r,e,t,o,n,s,a,i,p,u){return new ec(r,e,t,o,n,s,a,i,p,u).compute()}function Su(r,e,t,o){let n=r===e,s=r1;if(n||s||a)return x.makeZerosTypedArray(0,o);let i=Math.abs(Math.ceil((e-r)/t)),p=x.makeZerosTypedArray(i,o);e1/Math.sqrt(r)),gj=Go(xo,CI),JN={kernelName:xo,backendName:"cpu",kernelFunc:gj};function Aa(r,e,t,o,n,s,a,i,p,u){let c=[o/n,n],l=r.values,m=e.values;if(o===0)return ne(t,e.dtype);let f=ne(c,e.dtype);typeof p=="string"||typeof p=="number"?f.values.fill(p):typeof p=="boolean"&&f.values.fill(+p);for(let d=0;d=o/n)throw new Error(`Invalid indices: ${h} does not index into ${t}`);for(let y=0;y1/(1+Math.exp(-r))),II=we(yo,r=>1/(1+Math.exp(-r))),t2={kernelName:yo,backendName:"cpu",kernelFunc:II};function vu(r,e,t,o,n){let s=et.isSliceContinous(o,e,t),a=x.sizeFromShape(t),i=x.computeStrides(o);if(s){let l=et.computeFlatOffset(e,i);return n==="string"?r.slice(l,l+a):r.subarray(l,l+a)}let p=n==="string"?I.fromUint8ToStringArray(r):r,u=ne(o,n,p),c=ne(t,n);for(let l=0;ld+e[h]);c.set(u.get(...f),...m)}return n==="string"?I.fromStringArrayToUint8(c.values):c.values}function qo(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{begin:s,size:a}=o;K(n,"slice");let[i,p]=et.parseSliceParams(n,s,a);et.assertParamsValid(n,i,p);let u=t.data.get(n.dataId).values,c=vu(u,i,p,n.shape,n.dtype);return t.makeTensorInfo(p,n.dtype,c)}var r2={kernelName:qn,backendName:"cpu",kernelFunc:qo};function Td(r,e,t,o,n,s,a){let i=e[0],p=s[0],u=new Array(p),c=new Array(i),l=e[1];if(p===0){if(i!==0)throw new Error(I.getSparseFillEmptyRowsIndicesDenseShapeMismatch(i));let g=x.getArrayFromDType(t,0),y=x.getArrayFromDType(n,0);return[g,[0,l],y,u,c]}let m=!0,f=0,d=new Array(p).fill(0);for(let g=0;g=p)throw new Error(I.getSparseFillEmptyRowsOutOfRangeIndexErrorMessage(g,y,p));++d[y],m=m&&y>=f,f=y}let h=!0;for(let g=0;g0&&(d[g]+=d[g-1])}if(h&&m){let g=r,y=o;for(let b=0;b0){f[m-1]=1;for(let g=m-2;g>=0;--g)f[g]=f[g+1]*o[g+1]}let d=[];if(i>0){d[i-1]=1;for(let g=i-2;g>=0;--g)d[g]=d[g+1]*p[g+1]}let h=x.getArrayFromDType(t,a*i);for(let g=0;g0?n[i-1]+1:0;if(l<0)throw new Error(I.getSparseSegmentReductionNegativeSegmentIdsErrorMessage());let m=e.slice();m[0]=l;let f=m.reduce((C,w)=>C*w,1),d=x.getArrayFromDType(t,f);if(i===0)return l>0&&d.fill(a),[d,m];if(l<=0)throw new Error(I.getSparseSegmentReductionNegativeSegmentIdsErrorMessage());let h=0,g=1,y=0,b=n[h];for(;;){let C=0;if(g=C)throw new Error(I.getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage())}if(b<0||b>=l)throw new Error(I.getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage(b,l));b>y&&d.fill(a,y*u,b*u);for(let w=h;w=p[0])throw new Error(I.getSparseSegmentReductionIndicesOutOfRangeErrorMessage(w,o[w],p[0]));for(let _=0;_i)break}return yMath.sqrt(r)),xj=we(bo,r=>Math.sqrt(r)),n2={kernelName:bo,backendName:"cpu",kernelFunc:xj};var wI=Le((r,e)=>{let t=r-e;return t*t}),yj=Ye(Co,wI),s2={kernelName:Co,backendName:"cpu",kernelFunc:yj};function _d(r,e,t,o){let n=ne(r,e.dtype);for(let s=0;s0?0:i-p),f=0;f+=u*this.leftPad.length;for(let b=0;bb.forEach(C=>h[g++]=C);for(let b=0;b0){y(e[m+l-1]);for(let b=0;b0){let p=t[0];if(p!==0)throw new Error(`First split value must be 0, got ${p}`);for(let u=1;u=p;if(c=c&&t[u]<=o,!c)throw new Error(`Invalid split value ${t[u]}, must be in [${p}, ${o}]`);p=t[u]}if(p!==o)throw new Error(`Last split value must be data size. Expected ${o}, got ${p}`)}let s=n-1,a=x.getArrayFromDType("int32",n);if(o===0||n===0){let p=new Array(o);for(let u=0;u<=s;++u)a[u]=0;return[p,a]}a[0]=0;for(let p=1;p<=s;++p){let u=t[p]-t[p-1],c=0;this.nGramWidths.forEach(l=>{c+=this.getNumNGrams(u,l)}),this.preserveShort&&u>0&&c===0&&(c=1),a[p]=a[p-1]+c}let i=new Array(a[s]);for(let p=0;p{let m=t[p+1]-t[p],f=this.getNumNGrams(m,l);this.createNGrams(e,u,i,c,f,l),c+=f}),this.preserveShort&&c===a[p]){let l=t[p+1]-t[p];if(l===0)continue;let m=l+2*this.padWidth,f=1;this.createNGrams(e,u,i,c,f,m)}}return[i,a]}};function ku(r,e,t,o,n,s,a,i){return new SI(t,o,n,s,a,i).compute(r,e)}function bj(r,e,t,o){if(!r.length)return;if(e.length===0){for(let s=0;sr-e),Cj=Qp((r,e,t,o)=>({real:r-t,imag:e-o})),Il=Ye(Io,vI,Cj),a2={kernelName:Io,backendName:"cpu",kernelFunc:Il};function Ed(r,e){let t=new Array(r.rank);for(let n=0;n{let t=e.value-r.value;return t===0?r.index-e.index:t};function i2(r,e,t=0,o=r.length-1){for(;o>t;){if(o-t>600){let i=o-t+1,p=e-t+1,u=Math.log(i),c=.5*Math.exp(2*u/3),l=.5*Math.sqrt(u*c*(i-c)/i)*Math.sign(p-i/2),m=Math.max(t,Math.floor(e-p*c/i+l)),f=Math.min(o,Math.floor(e+(i-p)*c/i+l));i2(r,e,m,f)}let n=r[e],s=t,a=o;for(x.swap(r,t,e),wl(r[o],n)>0&&x.swap(r,t,o);s0;)a=a-1}wl(r[t],n)===0?x.swap(r,t,a):(a=a+1,x.swap(r,a,o)),a<=e&&(t=a+1),e<=a&&(o=a-1)}}function $d(r,e,t,o,n){let s=e[e.length-1],[a,i]=[r.length/s,s],p=x.getTypedArrayFromDType(t,a*o),u=x.getTypedArrayFromDType("int32",a*o);for(let l=0;ld[C]={value:b,index:C}),o{for(let g=0;gnew Si,1);var kI=we(In,r=>r>=0?r:Math.exp(r)-1),u2={kernelName:In,backendName:"cpu",kernelFunc:kI};function TI(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{alpha:s}=o;K([n],"leakyRelu");let a=x.sizeFromShape(n.shape),i=t.data.get(n.dataId).values,p=x.getTypedArrayFromDType("float32",a);for(let u=0;ur<0?e*r:r);function NI(r){let{inputs:e,backend:t}=r,{x:o,alpha:n}=e;K([o,n],"prelu");let s=t.data.get(o.dataId).values,a=t.data.get(n.dataId).values,[i,p]=wj(o.shape,n.shape,s,a,"float32");return t.makeTensorInfo(p,"float32",i)}var c2={kernelName:Vn,backendName:"cpu",kernelFunc:NI};var _I=we(zn,r=>Math.max(0,r)),l2={kernelName:zn,backendName:"cpu",kernelFunc:_I};var EI=we(Gn,r=>Math.min(Math.max(0,r),6)),m2={kernelName:Gn,backendName:"cpu",kernelFunc:EI};function _u(r,e,t,o,n){if(t==="linear")return ar({inputs:{x:e},backend:r});if(t==="relu")return _I({inputs:{x:e},backend:r});if(t==="elu")return kI({inputs:{x:e},backend:r});if(t==="relu6")return EI({inputs:{x:e},backend:r});if(t==="prelu")return NI({inputs:{x:e,alpha:o},backend:r});if(t==="leakyrelu")return TI({inputs:{x:e},backend:r,attrs:{alpha:n}});if(t==="sigmoid")return II({inputs:{x:e},backend:r});throw new Error(`Activation ${t} has not been implemented for the CPU backend.`)}function Oe(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{shape:s}=o,a=x.sizeFromShape(n.shape),i=x.inferFromImplicitShape(s,a),p=x.sizeFromShape(i);x.assert(a===p,()=>`The new shape (${i}) has ${p} elements and the old shape (${n.shape}) has ${a} elements. The new shape and old shape must have the same number of elements.`),t.incRef(n.dataId);let u=t.data.get(n.dataId);if(u.complexTensorInfos!=null){let c=u.complexTensorInfos.real,l=u.complexTensorInfos.imag;c.shape=i,l.shape=i}return{dataId:n.dataId,shape:i,dtype:n.dtype}}var f2={kernelName:Ss,backendName:"cpu",kernelFunc:Oe};function $I(r){let{inputs:e,backend:t,attrs:o}=r,{a:n,b:s}=e,{transposeA:a,transposeB:i}=o;K([n,s],"matMul");let p=n.shape.length,u=s.shape.length,c=a?n.shape[p-2]:n.shape[p-1],l=i?s.shape[u-1]:s.shape[u-2],m=a?n.shape[p-1]:n.shape[p-2],f=i?s.shape[u-2]:s.shape[u-1],d=n.shape.slice(0,-2),h=s.shape.slice(0,-2),g=x.sizeFromShape(d),y=x.sizeFromShape(h),C=br.assertAndGetBroadcastShape(n.shape.slice(0,-2),s.shape.slice(0,-2)).concat([m,f]);x.assert(c===l,()=>`Error in matMul: inner shapes (${c}) and (${l}) of Tensors with shapes ${n.shape} and ${s.shape} and transposeA=${a} and transposeB=${i} must match.`);let w=a?[g,c,m]:[g,m,c],k=i?[y,f,l]:[y,l,f],_=Oe({inputs:{x:n},backend:t,attrs:{shape:w}}),E=Oe({inputs:{x:s},backend:t,attrs:{shape:k}}),R=a?_.shape[1]:_.shape[2],A=a?_.shape[2]:_.shape[1],D=i?E.shape[1]:E.shape[2],O=Math.max(g,y),M=t.data.get(_.dataId).values,L=t.data.get(E.dataId).values,W=x.computeStrides(_.shape),V=x.computeStrides(E.shape),[G,q,H]=a?[W[0],1,W[1]]:[W[0],W[1],1],[j,Y,Z]=i?[1,V[1],V[0]]:[V[1],1,V[0]],ee=A*D,X=ne([O,A,D],_.dtype),Q=X.values,se=t.blockSize;for(let ie=0;ieMath.acos(r)),g2={kernelName:Li,backendName:"cpu",kernelFunc:vj};var kj=we(Bi,r=>Math.acosh(r)),x2={kernelName:Bi,backendName:"cpu",kernelFunc:kj};function Tj(r){let{inputs:e,backend:t}=r,o=e;K(e,"addN");let n=o.map(i=>t.data.get(i.dataId).values),s=ne(o[0].shape,o[0].dtype),a=s.values;for(let i=0;ib&&(b=k,C=w)}f[g]=C}return u.forEach(g=>t.disposeIntermediateTensorInfo(g)),t.makeTensorInfo(c,"int32",f)}var I2={kernelName:un,backendName:"cpu",kernelFunc:Ej};function $j(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s}=o;K(n,"argMin");let a=x.parseAxisParam(s,n.shape),i=I.getAxesPermutation(a,n.shape.length),p=n,u=[];i!=null&&(p=bt({inputs:{x:n},backend:t,attrs:{perm:i}}),u.push(p),a=I.getInnerMostAxes(a.length,p.shape.length)),a=[a[0]],I.assertAxesAreInnerMostDims("argMin",a,p.shape.length);let[c,l]=I.computeOutAndReduceShapes(p.shape,a),m=x.sizeFromShape(c),f=x.makeZerosTypedArray(m,"int32"),d=x.sizeFromShape(l),h=t.data.get(p.dataId).values;for(let g=0;gt.disposeIntermediateTensorInfo(g)),t.makeTensorInfo(c,"int32",f)}var w2={kernelName:ja,backendName:"cpu",kernelFunc:$j};var Rj=we(Vi,r=>Math.asin(r)),S2={kernelName:Vi,backendName:"cpu",kernelFunc:Rj};var Aj=we(zi,r=>Math.asinh(r)),v2={kernelName:zi,backendName:"cpu",kernelFunc:Aj};var Fj=we(Wi,r=>Math.atan(r)),k2={kernelName:Wi,backendName:"cpu",kernelFunc:Fj};var Dj=Le((r,e)=>Math.atan2(r,e)),Pj=Ye(sa,Dj),T2={kernelName:sa,backendName:"cpu",kernelFunc:Pj};var Oj=we(Ui,r=>Math.atanh(r)),N2={kernelName:Ui,backendName:"cpu",kernelFunc:Oj};function rc(r,e,t,o,n,s){let a=n.strideHeight,i=n.strideWidth,p=n.dilationHeight,u=n.dilationWidth,c=n.effectiveFilterHeight,l=n.effectiveFilterWidth,m=n.padInfo.top,f=n.padInfo.left,d=s==="max"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,h=ne(n.outShape,t),g=h.values,y=n.outShape[1]*n.outShape[2]*n.outShape[3],b=n.outShape[2]*n.outShape[3],C=n.outShape[3];for(let w=0;wq?q=se:s==="avg"&&(H+=se,j++)}if(isNaN(q))break}let Y=M+L*C+E;g[Y]=s==="avg"?H/j:q}}}return h}function Fd(r,e,t,o,n=!1,s=!1){let a=ne(o.outShape,"int32"),i=o.strideHeight,p=o.strideWidth,u=o.dilationHeight,c=o.dilationWidth,l=o.effectiveFilterHeight,m=o.effectiveFilterWidth,f=o.padInfo.top,d=o.padInfo.left,h=ne(e,t,r);for(let g=0;gD&&(D=G,n?O=s?((g*o.inHeight+M)*o.inWidth+W)*o.inChannels+y:(M*o.inWidth+W)*o.inChannels+y:O=L*m+V)}}a.set(O,g,b,_,y)}}return a}function Dd(r,e,t,o,n,s){let a=n.strideDepth,i=n.strideHeight,p=n.strideWidth,u=n.dilationDepth,c=n.dilationHeight,l=n.dilationWidth,m=n.effectiveFilterDepth,f=n.effectiveFilterHeight,d=n.effectiveFilterWidth,h=n.padInfo.front,g=n.padInfo.top,y=n.padInfo.left,b=s==="max"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,C=ne(n.outShape,t),w=C.values,k=n.outShape[1]*n.outShape[2]*n.outShape[3]*n.outShape[4],_=n.outShape[2]*n.outShape[3]*n.outShape[4],E=n.outShape[3]*n.outShape[4],R=n.outShape[4];for(let A=0;AIe?Ie=It:s==="avg"&&(Se+=It,Ee++),isNaN(Ie))break}if(isNaN(Ie))break}if(isNaN(Ie))break}let Me=de+M;w[Me]=s==="avg"?Se/Ee:Ie}}}}return C}function _2(r,e){let t=ne(e.outShape,"int32"),o=e.strideDepth,n=e.strideHeight,s=e.strideWidth,a=e.dilationDepth,i=e.dilationHeight,p=e.dilationWidth,u=e.effectiveFilterDepth,c=e.effectiveFilterHeight,l=e.effectiveFilterWidth,m=e.padInfo.front,f=e.padInfo.top,d=e.padInfo.left;for(let h=0;h=L&&(L=Z,W=G*c*l+H*c+Y)}}}t.set(W,h,y,k,A,g)}}}return t}function Mj(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e;K(n,"avgPool");let{filterSize:s,strides:a,pad:i,dimRoundingMode:p}=o,u=1;x.assert(I.eitherStridesOrDilationsAreOne(a,u),()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${a} and dilations '${u}'`);let c=I.computePool2DInfo(n.shape,s,a,u,i,p),l;if(c.filterWidth===1&&c.filterHeight===1&&x.arraysEqual(c.inShape,c.outShape))l=ar({inputs:{x:n},backend:t});else{let m=t.data.get(n.dataId).values,f=x.computeStrides(n.shape),d=rc(m,n.shape,n.dtype,f,c,"avg");l=t.makeTensorInfo(c.outShape,n.dtype,d.values)}return l}var E2={kernelName:pn,backendName:"cpu",kernelFunc:Mj};function Lj(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{filterSize:s,strides:a,pad:i,dimRoundingMode:p,dataFormat:u}=o;K(n,"avgPool3d");let c=I.computePool3DInfo(n.shape,s,a,1,i,p,u),l=t.data.get(n.dataId).values,m=Dd(l,n.shape,n.dtype,x.computeStrides(n.shape),c,"avg");return t.makeTensorInfo(m.shape,"float32",m.values)}var $2={kernelName:ip,backendName:"cpu",kernelFunc:Lj};function Bj(r){let{inputs:e,backend:t,attrs:o}=r,{dy:n,input:s}=e,{filterSize:a,strides:i,pad:p,dimRoundingMode:u}=o;K([n,s],"avgPool3DGrad");let c=I.computePool3DInfo(s.shape,a,i,1,p,u),l=c.strideDepth,m=c.strideHeight,f=c.strideWidth,d=c.filterDepth,h=c.filterHeight,g=c.filterWidth,y=c.dilationDepth,b=c.dilationHeight,C=c.dilationWidth,w=c.effectiveFilterDepth,k=c.effectiveFilterHeight,_=c.effectiveFilterWidth,E=w-1-c.padInfo.front,R=_-1-c.padInfo.left,A=k-1-c.padInfo.top,D=ne(s.shape,"float32"),O=1/(d*h*g),M=t.bufferSync(n);for(let L=0;L=c.outDepth||Math.floor(X)!==X))for(let Q=0;Q=c.outHeight||Math.floor(se)!==se))for(let ie=0;ie<_;ie+=C){let de=(Y+ie)/f;if(de<0||de>=c.outWidth||Math.floor(de)!==de)continue;let Ie=M.get(L,X,se,de,W);Z+=Ie}}}D.set(Z*O,L,V,G,q,W)}return t.makeTensorInfo(D.shape,D.dtype,D.values)}var R2={kernelName:Fm,backendName:"cpu",kernelFunc:Bj};function Vj(r){let{inputs:e,backend:t,attrs:o}=r,{dy:n,input:s}=e,a=s;K([n,s],"avgPoolGrad");let{filterSize:i,strides:p,pad:u}=o,c=I.computePool2DInfo(a.shape,i,p,1,u),l=c.strideHeight,m=c.strideWidth,f=c.filterHeight,d=c.filterWidth,h=c.dilationHeight,g=c.dilationWidth,y=c.effectiveFilterHeight,b=c.effectiveFilterWidth,C=b-1-c.padInfo.left,w=y-1-c.padInfo.top,k=ne(a.shape,"float32"),_=1/(f*d),E=t.data.get(n.dataId).values,R=ne(n.shape,"float32",E);for(let A=0;A=c.outHeight||Math.floor(q)!==q))for(let H=0;H=c.outWidth||Math.floor(j)!==j)continue;let Y=R.get(A,q,j,D);V+=Y}}k.set(V*_,A,O,M,D)}return t.makeTensorInfo(k.shape,k.dtype,k.values)}var A2={kernelName:Am,backendName:"cpu",kernelFunc:Vj};function zj(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,scale:s,offset:a,mean:i,variance:p}=e;x.assert(i.shape.length===p.shape.length,()=>"Batch normalization gradient requires mean and variance to have equal ranks."),x.assert(a==null||i.shape.length===a.shape.length,()=>"Batch normalization gradient requires mean and offset to have equal ranks."),x.assert(s==null||i.shape.length===s.shape.length,()=>"Batch normalization gradient requires mean and scale to have equal ranks."),K([n,i,p,s,a],"batchNorm");let{varianceEpsilon:u}=o;u==null&&(u=.001);let c=t.data.get(n.dataId).values,l=t.data.get(i.dataId).values,m=t.data.get(p.dataId).values,f=s?t.data.get(s.dataId).values:new Float32Array([1]),d=a?t.data.get(a.dataId).values:new Float32Array([0]),h=new Float32Array(c.length),g=d.length,y=f.length,b=m.length,C=l.length,w=0,k=0,_=0,E=0;for(let R=0;R=g&&(w=0),k>=C&&(k=0),_>=y&&(_=0),E>=b&&(E=0);return t.makeTensorInfo(n.shape,n.dtype,h)}var F2={kernelName:kn,backendName:"cpu",kernelFunc:zj};function Wj(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{blockShape:s,crops:a}=o;K([n],"batchToSpaceND");let i=s.reduce((y,b)=>y*b),p=I.getReshaped(n.shape,s,i),u=I.getPermuted(p.length,s.length),c=I.getReshapedPermuted(n.shape,s,i),l=I.getSliceBeginCoords(a,s.length),m=I.getSliceSize(c,a,s.length),f=Oe({inputs:{x:n},backend:t,attrs:{shape:p}}),d=bt({inputs:{x:f},backend:t,attrs:{perm:u}}),h=Oe({inputs:{x:d},backend:t,attrs:{shape:c}}),g=qo({inputs:{x:h},backend:t,attrs:{begin:l,size:m}});return t.disposeIntermediateTensorInfo(f),t.disposeIntermediateTensorInfo(d),t.disposeIntermediateTensorInfo(h),g}var D2={kernelName:hs,backendName:"cpu",kernelFunc:Wj};function Uj(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,weights:s}=e,{size:a}=o,i=t.data.get(n.dataId).values,p=t.data.get(s.dataId).values,u=Zp(i,p,s.dtype,s.shape,a);return t.makeTensorInfo([a],s.dtype,u)}var P2={kernelName:up,backendName:"cpu",kernelFunc:Uj};function Gj(r){let{inputs:e,backend:t}=r,{s0:o,s1:n}=e,s=t.data.get(o.dataId).values,a=t.data.get(n.dataId).values,i=I.assertAndGetBroadcastShape(Array.from(s),Array.from(a));return t.makeTensorInfo([i.length],"int32",Int32Array.from(i))}var O2={kernelName:pp,backendName:"cpu",kernelFunc:Gj};var Hj=we(Ro,(r,e)=>{let t=e;return r>t.clipValueMax?t.clipValueMax:r{let{x:e}=r.inputs,t=r.backend,o=new Float32Array(x.sizeFromShape(e.shape)),n=t.data.get(e.dataId),s=n.complexTensorInfos.real,a=n.complexTensorInfos.imag,i=t.data.get(s.dataId).values,p=t.data.get(a.dataId).values;for(let u=0;uh.shape);I.assertParamsConsistent(a,s);let i=I.computeOutShape(e.map(h=>h.shape),s);if(x.sizeFromShape(i)===0)return t.makeTensorInfo(i,e[0].dtype,[]);let p=e.filter(h=>x.sizeFromShape(h.shape)>0);if(p.length===1)return ar({inputs:{x:p[0]},backend:t});if(p[0].dtype==="complex64"){let h=p.map(w=>Wo({inputs:{input:w},backend:t})),g=p.map(w=>qs({inputs:{input:w},backend:t})),y=vi({inputs:h,backend:t,attrs:{axis:s}}),b=vi({inputs:g,backend:t,attrs:{axis:s}}),C=qt({inputs:{real:y,imag:b},backend:t});return h.forEach(w=>t.disposeIntermediateTensorInfo(w)),g.forEach(w=>t.disposeIntermediateTensorInfo(w)),t.disposeIntermediateTensorInfo(y),t.disposeIntermediateTensorInfo(b),C}let u=p.map(h=>{let y=[-1,x.sizeFromShape(h.shape.slice(s))];return Oe({inputs:{x:h},backend:t,attrs:{shape:y}})}),c=u.map(h=>({vals:t.data.get(h.dataId).values,shape:h.shape}));i=I.computeOutShape(u.map(h=>h.shape),1);let l=u[0].shape[0]===1,m=Iu(c,i,e[0].dtype,l),f=I.computeOutShape(p.map(h=>h.shape),s),d=t.makeTensorInfo(f,e[0].dtype,m);return u.forEach(h=>t.disposeIntermediateTensorInfo(h)),d}var V2={kernelName:gs,backendName:"cpu",kernelFunc:vi};function RI(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,filter:s}=e,{strides:a,pad:i,dataFormat:p,dilations:u,dimRoundingMode:c}=o;K([n,s],"conv2d");let l=I.convertConv2DDataFormat(p),m=I.computeConv2DInfo(n.shape,s.shape,a,u,i,c,!1,l),f=m.filterHeight,d=m.filterWidth,h=m.dilationHeight,g=m.dilationWidth,y=m.padInfo.left,b=m.padInfo.top,C=m.dataFormat==="channelsLast",w=new je(m.outShape,n.dtype),k=x.computeStrides(n.shape),_=x.computeStrides(s.shape),E=k[0],R=C?k[1]:k[2],A=C?k[2]:1,D=C?1:k[1],O=w.strides[0],M=C?w.strides[1]:w.strides[2],L=C?w.strides[2]:1,W=C?1:w.strides[1],V=t.data.get(n.dataId).values,G=t.data.get(s.dataId).values,q=w.values;for(let H=0;H=m.inHeight)continue;let ie=Q*_[0],de=j+se*R;for(let Ie=0;Ie=m.inWidth)continue;let pt=ie+Me*_[1],De=de+st*A,ft=pt;for(let at=0;at=u.inDepth)continue;let H=G*A[0],j=O+q*R[1];for(let Y=0;Y=u.inHeight)continue;let se=H+X*A[1],ie=j+Q*R[2];for(let de=0;de=u.inWidth)continue;let st=se+Ee*A[2],pt=ie+Me*u.inChannels,De=st;for(let ft=0;ftMath.cos(r)),K2={kernelName:fn,backendName:"cpu",kernelFunc:Zj};var Jj=we(dn,r=>Math.cosh(r)),j2={kernelName:dn,backendName:"cpu",kernelFunc:Jj};function eX(r){let{inputs:e,backend:t,attrs:o}=r,{image:n,boxes:s,boxInd:a}=e,{cropSize:i,method:p,extrapolationValue:u}=o,[c,l,m,f]=n.shape,d=s.shape[0],[h,g]=i,y=ne([d,h,g,f],"float32"),b=t.data.get(s.dataId).values,C=t.data.get(a.dataId).values,w=t.data.get(n.dataId).values,k=x.computeStrides(n.shape),_=x.computeStrides(y.shape);for(let E=0;E=c)continue;let W=h>1?(O-A)*(l-1)/(h-1):0,V=g>1?(M-D)*(m-1)/(g-1):0;for(let G=0;G1?A*(l-1)+G*W:.5*(A+O)*(l-1);if(q<0||q>l-1){for(let H=0;H1?D*(m-1)+Z*V:.5*(D+M)*(m-1);if(ee<0||ee>m-1){for(let ie=0;ie1?D*(m-1)+H*V:.5*(D+M)*(m-1);if(j<0||j>m-1){for(let ee=0;eey+d-b-1:(y,b)=>y+b;for(let y=0;yy+d-b-1:(y,b)=>y+b;for(let y=0;y`Only NHWC dataFormat supported on CPU for depthToSpace. Got ${a}`);let i=n.shape[0],p=n.shape[1],u=n.shape[2],c=n.shape[3],l=p*s,m=u*s,f=c/(s*s),d=t.data.get(n.dataId).values,h=new Float32Array(i*l*m*f),g=0;for(let y=0;y`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${a} and dilations '${m}'`);let f=I.computeConv2DInfo(n.shape,s.shape,a,m,i,u,!0),{filterHeight:d,filterWidth:h,dilationHeight:g,dilationWidth:y,padInfo:b}=f,C=b.left,w=b.top,k=f.outChannels/f.inChannels,_=new je(f.outShape,n.dtype),E=t.data.get(n.dataId).values,R=t.data.get(s.dataId).values,A=_.values;for(let D=0;D=f.inHeight)continue;let H=G*l[0],j=O+q*c[1];for(let Y=0;Y=f.inWidth)continue;let se=H+X*l[1],ie=j+Q*f.inChannels,de=Z,Ie=se;for(let Se=0;Se{let{x:o,filter:n}=r,{strides:s,pad:a,dilations:i}=t,p=e,u=p.data.get(o.dataId).values,c=o.shape.length,l=p.data.get(n.dataId).values,m=n.shape.length,{batchSize:f,inHeight:d,inWidth:h,inChannels:g,outHeight:y,outWidth:b,padInfo:C,strideHeight:w,strideWidth:k,filterHeight:_,filterWidth:E,dilationHeight:R,dilationWidth:A,outShape:D}=I.computeDilation2DInfo(o.shape,n.shape,s,a,"NHWC",i),O=x.sizeFromShape(D),M=D.length,L=x.getArrayFromDType(o.dtype,O);for(let V=0;V=0&&Q=0&&ieZ&&(Z=Se)}}}let ee=x.locToIndex([V,G,H,Y],M,x.computeStrides(D));L[ee]=Z}}}return{dataId:p.write(x.toTypedArray(L,o.dtype),D,o.dtype),shape:D,dtype:o.dtype}}};var s_={kernelName:vb,backendName:"cpu",kernelFunc:({inputs:r,backend:e,attrs:t})=>{let{x:o,filter:n,dy:s}=r,{strides:a,pad:i,dilations:p}=t,u=e,c=x.toNestedArray(o.shape,u.data.get(o.dataId).values),l=x.toNestedArray(n.shape,u.data.get(n.dataId).values),{batchSize:m,inHeight:f,inWidth:d,inChannels:h,outHeight:g,outWidth:y,padInfo:b,strideHeight:C,strideWidth:w,filterHeight:k,filterWidth:_,dilationHeight:E,dilationWidth:R,outShape:A}=I.computeDilation2DInfo(o.shape,n.shape,a,i,"NHWC",p);x.assert(s.rank===A.length,()=>`Error in ${vb}, dy must have the same rank as output ${A.length}, but got ${s.rank}`);let D=x.toNestedArray(A,u.data.get(s.dataId).values),O=x.makeZerosNestedTypedArray(n.shape,n.dtype);for(let L=0;L=0&&X=0&&sej&&(j=ie,Y=ee,Z=Q)}}}O[Y][Z][H]+=D[L][W][G][H]}}}return{dataId:u.write(x.toTypedArray(O,o.dtype),n.shape,n.dtype),shape:n.shape,dtype:n.dtype}}};var a_={kernelName:Sb,backendName:"cpu",kernelFunc:({inputs:r,backend:e,attrs:t})=>{let{x:o,filter:n,dy:s}=r,{strides:a,pad:i,dilations:p}=t,u=e,c=x.toNestedArray(o.shape,u.data.get(o.dataId).values),l=x.toNestedArray(n.shape,u.data.get(n.dataId).values),{batchSize:m,inHeight:f,inWidth:d,inChannels:h,outHeight:g,outWidth:y,padInfo:b,strideHeight:C,strideWidth:w,filterHeight:k,filterWidth:_,dilationHeight:E,dilationWidth:R,outShape:A}=I.computeDilation2DInfo(o.shape,n.shape,a,i,"NHWC",p);x.assert(s.rank===A.length,()=>`Error in ${Sb}, dy must have the same rank as output ${A.length}, but got ${s.rank}`);let D=x.toNestedArray(A,u.data.get(s.dataId).values),O=x.makeZerosNestedTypedArray(o.shape,o.dtype);for(let L=0;L=0&&X=0&&sej&&(j=ie,Y=X,Z=se)}}}O[L][Y][Z][H]+=D[L][W][G][H]}}}return{dataId:u.write(x.toTypedArray(O,o.dtype),o.shape,o.dtype),shape:o.shape,dtype:o.dtype}}};function Fa(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s,keepDims:a}=o;K(n,"sum");let i;n.dtype==="bool"?i=Uo({inputs:{x:n},backend:t,attrs:{dtype:"int32"}}):i=ar({inputs:{x:n},backend:t});let p=i.shape.length,u=x.parseAxisParam(s,i.shape),c=I.getAxesPermutation(u,p),l=u,m=i;c!=null&&(m=bt({inputs:{x:i},backend:t,attrs:{perm:c}}),l=I.getInnerMostAxes(l.length,p)),I.assertAxesAreInnerMostDims("sum",l,m.shape.length);let[f,d]=I.computeOutAndReduceShapes(m.shape,l),h=I.upcastType(m.dtype,"int32"),g=Yp(t,f,h),y=x.sizeFromShape(d),b=t.data.get(g.dataId).values,C=t.data.get(m.dataId).values;for(let w=0;w=0&&(m=Fa({inputs:{x:m},backend:t,attrs:{axis:u[h]-(a.length-f),keepDims:!1}}),d.push(m)),f--)}for(let h of d)h!==m&&t.disposeIntermediateTensorInfo(h);return m}var u_={kernelName:Xa,backendName:"cpu",kernelFunc:uX};function pX(r){let{inputs:e,backend:t}=r,{dy:o,y:n}=e;K([o,n],"eluGrad");let s=new Float32Array(x.sizeFromShape(n.shape)),a=t.data.get(n.dataId).values,i=t.data.get(o.dataId).values;for(let p=0;p=1?s[p]=i[p]:s[p]=i[p]*(u+1)}return t.makeTensorInfo(n.shape,"float32",s)}var p_={kernelName:Pm,backendName:"cpu",kernelFunc:pX};var cX=I.ERF_P,lX=I.ERF_A1,mX=I.ERF_A2,fX=I.ERF_A3,dX=I.ERF_A4,hX=I.ERF_A5,gX=we(Gi,r=>{let e=Math.sign(r),t=Math.abs(r),o=1/(1+cX*t);return e*(1-((((hX*o+dX)*o+fX)*o+mX)*o+lX)*o*Math.exp(-t*t))}),c_={kernelName:Gi,backendName:"cpu",kernelFunc:gX};function oc(r){let{inputs:e,backend:t,attrs:o}=r,{input:n}=e,{dim:s}=o,a=n.shape.length,i=n.shape.slice(),p=s;return s<0&&(x.assert(-(a+1)<=s,()=>`Axis must be in the interval [${-(a+1)}, ${a}]`),p=a+s+1),i.splice(p,0,1),Oe({inputs:{x:n},backend:t,attrs:{shape:i}})}var l_={kernelName:xs,backendName:"cpu",kernelFunc:oc};var xX=Le((r,e)=>r/e),Sl=Ye(Cn,xX),vl={kernelName:Cn,backendName:"cpu",kernelFunc:Sl};function Pd(r,e,t){let o=r.shape,n=o[0],s=o[1],a=t.data.get(r.dataId),i=a.complexTensorInfos.real,p=a.complexTensorInfos.imag,u=[n,s],c=x.sizeFromShape(u),l=x.getTypedArrayFromDType("float32",c),m=x.getTypedArrayFromDType("float32",c);for(let g=0;g{let{image:o}=r,n=t,s=x.getTypedArrayFromDType(o.dtype,x.sizeFromShape(o.shape)),[a,i,p,u]=o.shape,c=n.data.get(o.dataId).values;for(let m=0;m=0&&CMath.floor(r/e)),vX=Ye(vn,SX,null,"int32"),h_={kernelName:vn,backendName:"cpu",kernelFunc:vX};function kX(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,filter:s,bias:a,preluActivationWeights:i}=e,{strides:p,pad:u,dataFormat:c,dilations:l,dimRoundingMode:m,activation:f,leakyreluAlpha:d}=o,h=RI({inputs:{x:n,filter:s},backend:t,attrs:{strides:p,pad:u,dataFormat:c,dilations:l,dimRoundingMode:m}});if(a){let g=h;if(c==="NCHW"&&a.shape.length===1&&a.shape[0]!==1){let y=Oe({inputs:{x:a},backend:t,attrs:{shape:[a.shape[0],1,1]}});h=Hs({inputs:{a:h,b:y},backend:t}),t.disposeIntermediateTensorInfo(y)}else h=Hs({inputs:{a:h,b:a},backend:t});t.disposeIntermediateTensorInfo(g)}if(f){let g=h;if(c==="NCHW"&&f==="prelu"&&i.shape.length===1&&i.shape[0]!==1){let y=Oe({inputs:{x:i},backend:t,attrs:{shape:[i.shape[0],1,1]}});h=_u(t,h,f,y,d),t.disposeIntermediateTensorInfo(y)}else h=_u(t,h,f,i,d);t.disposeIntermediateTensorInfo(g)}return h}var g_={kernelName:Do,backendName:"cpu",kernelFunc:kX};function TX(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,filter:s,bias:a,preluActivationWeights:i}=e,{strides:p,pad:u,dataFormat:c,dilations:l,dimRoundingMode:m,activation:f,leakyreluAlpha:d}=o,h=AI({inputs:{x:n,filter:s},backend:t,attrs:{strides:p,pad:u,dataFormat:c,dilations:l,dimRoundingMode:m}});if(a){let g=h;h=Hs({inputs:{a:h,b:a},backend:t}),t.disposeIntermediateTensorInfo(g)}if(f){let g=h;h=_u(t,h,f,i,d),t.disposeIntermediateTensorInfo(g)}return h}var x_={kernelName:Po,backendName:"cpu",kernelFunc:TX};function NX(r){let{inputs:e,backend:t}=r,{params:o,indices:n}=e,s=x.sizeFromShape(o.shape),a=n.shape,i=a[a.length-1],[p,u,c,l]=I.prepareAndValidate(o,n);if(u===0)return t.makeTensorInfo(p,o.dtype,[]);let m=t.data.get(n.dataId).values,f=t.bufferSync(o),d=bd(m,f,o.dtype,u,i,c,l,o.shape,s);return t.makeTensorInfo(p,o.dtype,d.values)}var y_={kernelName:Tn,backendName:"cpu",kernelFunc:NX};function _X(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,indices:s}=e,{axis:a,batchDims:i}=o;K([n,s],"gatherV2");let p=x.parseAxisParam(a,n.shape)[0],u=t.data.get(s.dataId).values,c=n.shape[p];for(let w=0;w=0,()=>`GatherV2: the index value ${k} is not in [0, ${c-1}]`)}let l=i;i==null&&(l=0);let m=x.sizeFromShape(s.shape),f=I.segment_util.collectGatherOpShapeInfo(n,s,p,l),d=Oe({inputs:{x:n},backend:t,attrs:{shape:[f.batchSize,f.outerSize,f.dimSize,f.sliceSize]}}),h=Oe({inputs:{x:s},backend:t,attrs:{shape:[f.batchSize,m/f.batchSize]}}),g=[f.batchSize,f.outerSize,m/f.batchSize,f.sliceSize],y=t.bufferSync(h),b=t.bufferSync(d),C=Cd(b,y,g);return t.disposeIntermediateTensorInfo(d),t.disposeIntermediateTensorInfo(h),t.makeTensorInfo(f.outputShape,C.dtype,C.values)}var b_={kernelName:bs,backendName:"cpu",kernelFunc:_X};function EX(r){let{inputs:e,backend:t}=r,{input:o}=e,n=x.sizeFromShape(o.shape),s=o.shape[o.shape.length-1],a=n/s,i=Oe({inputs:{x:o},backend:t,attrs:{shape:[a,s]}}),p=Pd(i,!0,t),u=Oe({inputs:{x:p},backend:t,attrs:{shape:o.shape}});return t.disposeIntermediateTensorInfo(i),t.disposeIntermediateTensorInfo(p),u}var C_={kernelName:Cp,backendName:"cpu",kernelFunc:EX};var $X=we(Hi,r=>Number.isFinite(r)?1:0,"bool"),I_={kernelName:Hi,backendName:"cpu",kernelFunc:$X};var RX=we(qi,r=>Math.abs(r)===1/0?1:0,"bool"),w_={kernelName:qi,backendName:"cpu",kernelFunc:RX};var AX=we(ia,r=>Number.isNaN(r)?1:0,"bool"),S_={kernelName:ia,backendName:"cpu",kernelFunc:AX};function FX(r){let{backend:e,attrs:t}=r,{start:o,stop:n,num:s}=t,a=Id(o,n,s);return e.makeTensorInfo([a.length],"float32",a)}var v_={kernelName:Ip,backendName:"cpu",kernelFunc:FX};var DX=we(Ki,r=>Math.log1p(r)),k_={kernelName:Ki,backendName:"cpu",kernelFunc:DX};var PX=Le((r,e)=>r&&e),OX=Ye(_n,PX,null,"bool"),T_={kernelName:_n,backendName:"cpu",kernelFunc:OX};var MX=we(En,r=>r?0:1,"bool"),N_={kernelName:En,backendName:"cpu",kernelFunc:MX};var LX=Le((r,e)=>r||e),BX=Ye(ua,LX,null,"bool"),__={kernelName:ua,backendName:"cpu",kernelFunc:BX};function VX(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{depthRadius:s,bias:a,alpha:i,beta:p}=o;K(n,"LRN");let u=n.shape[3],c=u-1,l=t.data.get(n.dataId).values,m=x.sizeFromShape(n.shape),f=new Float32Array(m);function d(h){let g=h%u,y=h-g+Math.max(0,g-s),b=h-g+Math.min(g+s,c),C=0;for(;y<=b;y++){let w=l[y];C+=w*w}return C}for(let h=0;h`Error in maxPool: Either strides or dilations must be 1. Got strides ${a} and dilations '${u}'`);let c=I.computePool2DInfo(n.shape,s,a,u,i,p),l;if(c.filterWidth===1&&c.filterHeight===1&&x.arraysEqual(c.inShape,c.outShape))l=ar({inputs:{x:n},backend:t});else{let m=t.data.get(n.dataId).values,f=x.computeStrides(n.shape),d=rc(m,n.shape,n.dtype,f,c,"max");l=t.makeTensorInfo(c.outShape,n.dtype,d.values)}return l}var A_={kernelName:Rn,backendName:"cpu",kernelFunc:WX};function UX(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{filterSize:s,strides:a,pad:i,dimRoundingMode:p,dataFormat:u}=o;K(n,"maxPool3d");let c=I.computePool3DInfo(n.shape,s,a,1,i,p,u),l=t.data.get(n.dataId).values,m=Dd(l,n.shape,n.dtype,x.computeStrides(n.shape),c,"max");return t.makeTensorInfo(m.shape,"float32",m.values)}var F_={kernelName:Sp,backendName:"cpu",kernelFunc:UX};function GX(r){let{inputs:e,backend:t,attrs:o}=r,{dy:n,input:s}=e,{filterSize:a,strides:i,pad:p,dimRoundingMode:u}=o;K([n,s],"maxPool3DGrad");let c=I.computePool3DInfo(s.shape,a,i,1,p,u),l=t.bufferSync(s),m=_2(l,c),f=c.strideDepth,d=c.strideHeight,h=c.strideWidth,g=c.dilationDepth,y=c.dilationHeight,b=c.dilationWidth,C=c.effectiveFilterDepth,w=c.effectiveFilterHeight,k=c.effectiveFilterWidth,_=C-1-c.padInfo.front,E=k-1-c.padInfo.left,R=w-1-c.padInfo.top,A=ne(s.shape,"float32"),D=t.bufferSync(n);for(let O=0;O=c.outDepth||Math.floor(Z)!==Z))for(let ee=0;ee=c.outHeight||Math.floor(X)!==X))for(let Q=0;Q=c.outWidth||Math.floor(se)!==se)continue;let ie=C*w*k-1-m.get(O,Z,X,se,M),de=Y*w*k+ee*k+Q,Ie=ie===de?1:0;if(Ie===0)continue;let Se=D.get(O,Z,X,se,M);j+=Se*Ie}}}A.set(j,O,L,W,V,M)}return t.makeTensorInfo(A.shape,A.dtype,A.values)}var D_={kernelName:Lm,backendName:"cpu",kernelFunc:GX};function HX(r){let{inputs:e,backend:t,attrs:o}=r,{dy:n,input:s,output:a}=e,i=s;K([s,a],"maxPoolGrad");let{filterSize:p,strides:u,pad:c,dimRoundingMode:l}=o,m=I.computePool2DInfo(i.shape,p,u,1,c,l),f=t.data.get(i.dataId).values,d=ne(m.outShape,i.dtype,Fd(f,i.shape,i.dtype,m).values),h=m.strideHeight,g=m.strideWidth,y=m.dilationHeight,b=m.dilationWidth,C=m.effectiveFilterHeight,w=m.effectiveFilterWidth,k=w-1-m.padInfo.left,_=C-1-m.padInfo.top,E=ne(i.shape,"float32"),R=t.data.get(n.dataId).values,A=ne(n.shape,"float32",R);for(let D=0;D=m.outHeight||Math.floor(H)!==H))for(let j=0;j=m.outWidth||Math.floor(Y)!==Y)continue;let Z=C*w-1-d.get(D,H,Y,O),ee=q*w+j,X=Z===ee?1:0;if(X===0)continue;let Q=A.get(D,H,Y,O);G+=Q*X}}E.set(G,D,M,L,O)}return t.makeTensorInfo(E.shape,E.dtype,E.values)}var P_={kernelName:Mm,backendName:"cpu",kernelFunc:HX};function O_(r,e,t,o,n){let s=x.computeStrides(e),a=rc(r,e,t,s,n,"max"),i=Fd(r,e,t,n,!0,o);return[a.values,i.values]}var M_={kernelName:vp,backendName:"cpu",kernelFunc:({inputs:r,attrs:e,backend:t})=>{let{x:o}=r,{filterSize:n,strides:s,pad:a,includeBatchInIndex:i}=e,p=t;K(o,"MaxPoolWithArgmax");let u=p.data.get(o.dataId).values,c=I.computePool2DInfo(o.shape,n,s,[1,1],a),[l,m]=O_(u,o.shape,o.dtype,i,c),f=p.write(l,c.outShape,o.dtype),d=p.write(m,c.outShape,o.dtype);return[{dataId:f,shape:c.outShape,dtype:o.dtype},{dataId:d,shape:c.outShape,dtype:"int32"}]}};function qX(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s,keepDims:a}=o,i=x.parseAxisParam(s,n.shape),u=I.computeOutAndReduceShapes(n.shape,i)[1],c=x.sizeFromShape(u),l=[],m=t.makeTensorInfo([],"float32",new Float32Array([c]));l.push(m);let f=Uo({inputs:{x:n},backend:t,attrs:{dtype:"float32"}});l.push(f);let d=Sl({inputs:{a:f,b:m},backend:t});l.push(d);let h=Fa({inputs:{x:d},backend:t,attrs:{axis:s,keepDims:a}});return l.forEach(g=>t.disposeIntermediateTensorInfo(g)),h}var L_={kernelName:An,backendName:"cpu",kernelFunc:qX};function KX(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s,keepDims:a}=o;K(n,"min");let i=x.parseAxisParam(s,n.shape),p=i,u=I.getAxesPermutation(p,n.shape.length),c=n;u!=null&&(c=bt({inputs:{x:n},backend:t,attrs:{perm:u}}),p=I.getInnerMostAxes(p.length,n.shape.length)),I.assertAxesAreInnerMostDims("min",p,c.shape.length);let[l,m]=I.computeOutAndReduceShapes(c.shape,p),f=x.sizeFromShape(m),d=x.makeZerosTypedArray(x.sizeFromShape(l),c.dtype),h=t.data.get(c.dataId).values;for(let y=0;yC[0]+n.shape[w]+C[1]),p=s.map(C=>C[0]),u=s.map((C,w)=>C[0]+n.shape[w]),c=a==="reflect"?0:1,l=t.data.get(n.dataId).values,m=n.shape.length,f=x.computeStrides(n.shape),d=x.sizeFromShape(i),h=i.length,g=x.computeStrides(i),y=x.getTypedArrayFromDType(n.dtype,d);for(let C=0;C=u[_]&&(w[_]=(u[_]-1)*2-w[_]+c);w=w.map((_,E)=>_-p[E]);let k=x.locToIndex(w,m,f);y[C]=l[k]}return{dataId:t.write(y,i,n.dtype),shape:i,dtype:n.dtype}}var V_={kernelName:Dn,backendName:"cpu",kernelFunc:jX};var XX=Le((r,e)=>{let t=r%e;return r<0&&e<0||r>=0&&e>=0?t:(t+e)%e}),YX=Ye(ji,XX),z_={kernelName:ji,backendName:"cpu",kernelFunc:YX};var U_=rp(IC());function PI(r){let{inputs:e,backend:t,attrs:o}=r,{logits:n}=e,{dim:s}=o,a=n.shape.length,i=s;if(i===-1&&(i=a-1),i!==a-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${a} and dim was ${i}`);let p=x.parseAxisParam([i],n.shape),u=DI({inputs:{x:n},backend:t,attrs:{reductionIndices:p,keepDims:!1}}),c=I.expandShapeToKeepDim(u.shape,p),l=Oe({inputs:{x:u},backend:t,attrs:{shape:c}}),m=Il({inputs:{a:n,b:l},backend:t}),f=iI({inputs:{x:m},backend:t}),d=Fa({inputs:{x:f},backend:t,attrs:{axis:p,keepDims:!1}}),h=Oe({inputs:{x:d},backend:t,attrs:{shape:c}}),g=Sl({inputs:{a:f,b:h},backend:t});return t.disposeIntermediateTensorInfo(u),t.disposeIntermediateTensorInfo(l),t.disposeIntermediateTensorInfo(m),t.disposeIntermediateTensorInfo(f),t.disposeIntermediateTensorInfo(d),t.disposeIntermediateTensorInfo(h),g}var W_={kernelName:Xn,backendName:"cpu",kernelFunc:PI};function QX(r){let{inputs:e,backend:t,attrs:o}=r,{logits:n}=e,{numSamples:s,seed:a,normalized:i}=o;K(n,"multinomial");let p=i?n:PI({inputs:{logits:n},backend:t,attrs:{dim:-1}}),u=p.shape[0],c=p.shape[1],l=t.data.get(p.dataId).values,m=[u,s],f=x.makeZerosTypedArray(x.sizeFromShape(m),"int32");for(let d=0;d=0&&l[m]{x.assertShapesMatch(s,c.shape,"All tensors passed to stack must have matching shapes"),x.assert(a===c.dtype,()=>"All tensors passed to stack must have matching dtypes")});let i=[],p=e.map(c=>{let l=oc({inputs:{input:c},backend:t,attrs:{dim:n}});return i.push(l),l}),u=vi({inputs:p,backend:t,attrs:{axis:n}});return i.forEach(c=>t.disposeIntermediateTensorInfo(c)),u}var Z_={kernelName:Is,backendName:"cpu",kernelFunc:OI};function s5(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{paddings:s,constantValue:a}=o;K(n,"pad");let i=s.map((b,C)=>b[0]+n.shape[C]+b[1]),p=s.map(b=>b[0]),u=t.data.get(n.dataId).values,c=x.sizeFromShape(n.shape),l=n.shape.length,m=x.computeStrides(n.shape),f=x.sizeFromShape(i),d=i.length,h=x.computeStrides(i),g=x.getTypedArrayFromDType(n.dtype,f);a!==0&&g.fill(a);for(let b=0;b_+p[E]),k=x.locToIndex(w,d,h);g[k]=u[b]}return{dataId:t.write(g,i,n.dtype),shape:i,dtype:n.dtype}}var Od={kernelName:Ln,backendName:"cpu",kernelFunc:s5};var a5=Le((r,e)=>Math.pow(r,e)),i5=Ye(Bn,a5),J_={kernelName:Bn,backendName:"cpu",kernelFunc:i5};function u5(r){let{inputs:e,backend:t,attrs:o}=r,{paramsNestedSplits:n,paramsDenseValues:s,indices:a}=e,{outputRaggedRank:i}=o,p=n.map(y=>t.data.get(y.dataId).values),u=n.map(y=>y.shape),c=t.data.get(s.dataId).values,l=t.data.get(a.dataId).values,[m,f,d]=Sd(p,u,c,s.shape,s.dtype,l,a.shape,i),h=m.map(y=>t.makeTensorInfo([y.length],"int32",y)),g=t.makeTensorInfo(d,s.dtype,f);return h.concat([g])}var eE={kernelName:Tp,backendName:"cpu",kernelFunc:u5};function p5(r){let{inputs:e,backend:t}=r,{starts:o,limits:n,deltas:s}=e,a=t.data.get(o.dataId).values,i=t.data.get(n.dataId).values,p=t.data.get(s.dataId).values,[u,c]=vd(a,o.shape,o.dtype,i,n.shape,p,s.shape),l=t.makeTensorInfo([u.length],"int32",u),m=t.makeTensorInfo([c.length],o.dtype,c);return[l,m]}var tE={kernelName:Np,backendName:"cpu",kernelFunc:p5};function c5(r){let{inputs:e,backend:t,attrs:o}=r,{shape:n,values:s,defaultValue:a,rowPartitionTensors:i}=e,{rowPartitionTypes:p}=o,u=t.data.get(n.dataId).values,c=t.data.get(s.dataId).values,l=t.data.get(a.dataId).values,m=i.map(g=>t.data.get(g.dataId).values),f=i.map(g=>g.shape),[d,h]=kd(u,n.shape,c,s.shape,s.dtype,l,a.shape,m,f,p);return t.makeTensorInfo(d,s.dtype,h)}var rE={kernelName:_p,backendName:"cpu",kernelFunc:c5};function l5(r){let{backend:e,attrs:t}=r,{start:o,stop:n,dtype:s,step:a}=t,i=Su(o,n,a,s);return e.makeTensorInfo([i.length],s,i)}var oE={kernelName:ws,backendName:"cpu",kernelFunc:l5};var m5=we(ma,r=>1/r),nE={kernelName:ma,backendName:"cpu",kernelFunc:m5};function f5(r){let{inputs:e,backend:t,attrs:o}=r,{images:n}=e,{alignCorners:s,halfPixelCenters:a,size:i}=o;K(n,"resizeBilinear");let p=x.computeStrides(n.shape),[u,c]=i,[l,m,f,d]=n.shape,h=t.data.get(n.dataId).values,g=new Float32Array(x.sizeFromShape([l,u,c,d])),y=[s&&u>1?m-1:m,s&&c>1?f-1:f],b=[s&&u>1?u-1:u,s&&c>1?c-1:c],C=0,w=y[0]/b[0],k=y[1]/b[1];for(let _=0;_1?u-1:u,a&&f>1?c-1:c],g=[a&&m>1?m-1:m,a&&f>1?f-1:f],y=h[0]/g[0],b=h[1]/g[1],C=t.data.get(s.dataId).values,w=0;for(let k=0;k1?m-1:m,s&&c>1?f-1:f],b=[s&&u>1?u-1:u,s&&c>1?c-1:c],C=y[0]/b[0],w=y[1]/b[1],k=0;for(let _=0;_1?c-1:c,a&&d>1?l-1:l],b=[a&&f>1?f-1:f,a&&d>1?d-1:d],C=y[0]/b[0],w=y[1]/b[1],k=1/C,_=1/w,E=Math.ceil(k)*2+2,R=Math.ceil(_)*2+2;for(let A=0;A=f)continue;let X=D+ee*p[1],Q=ee*C,se=Math.min(c-1,a?Math.round(Q):Math.floor(Q));if(O===se)for(let ie=0;ie=d)continue;let Ie=X+de*p[2],Se=de*w,Ee=Math.min(l-1,a?Math.round(Se):Math.floor(Se));V===Ee&&(Y+=g[Ie+j])}}h[G+j]=Y}}}}return t.makeTensorInfo(n.shape,n.dtype,h)}var uE={kernelName:Bm,backendName:"cpu",kernelFunc:g5};function x5(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{dims:s}=o;K(n,"reverse");let a=n.shape.length,i=x.parseAxisParam(s,n.shape);if(a===0)return ar({inputs:{x:n},backend:t});let p=new je(n.shape,n.dtype),u=t.bufferSync(n);for(let c=0;cm[f]=n.shape[f]-1-m[f]),p.set(u.get(...m),...l)}return t.makeTensorInfo(p.shape,p.dtype,p.values)}var pE={kernelName:fa,backendName:"cpu",kernelFunc:x5};var cE={kernelName:es,backendName:"cpu",kernelFunc:({inputs:r,attrs:e,backend:t})=>{let{image:o}=r,{radians:n,fillValue:s,center:a}=e,i=t,p=x.getTypedArrayFromDType(o.dtype,x.sizeFromShape(o.shape)),[u,c,l,m]=o.shape,[f,d]=I.getImageCenter(a,c,l),h=255,g=Math.sin(n),y=Math.cos(n),b=i.data.get(o.dataId).values;for(let w=0;w=0&&W=0&&V{let e=Math.floor(r);return r-e<.5?Math.floor(r):r-e>.5?Math.ceil(r):e%2===0?e:e+1}),lE={kernelName:da,backendName:"cpu",kernelFunc:y5};function b5(r){let{inputs:e,backend:t,attrs:o}=r,{indices:n,updates:s}=e,{shape:a}=o,{sliceRank:i,numUpdates:p,sliceSize:u,strides:c,outputSize:l}=I.calculateShapes(s,n,a),m=!0,f=t.bufferSync(n),d=t.bufferSync(s),h=Aa(f,d,a,l,u,p,i,c,0,m);return t.makeTensorInfo(a,h.dtype,h.values)}var mE={kernelName:Hn,backendName:"cpu",kernelFunc:b5};function C5(r,e){let t=0,o=r.length,n=0;for(;t1||n.shape.length===1?1:x.sizeFromShape(n.shape.slice(1));for(let d=0;dr>=0?k5*r:v5*(Math.exp(r)-1)),gE={kernelName:Xi,backendName:"cpu",kernelFunc:T5};var N5=we(Yi,r=>r<0?-1:r>0?1:0),xE={kernelName:Yi,backendName:"cpu",kernelFunc:N5};var _5=we(Kn,r=>Math.sin(r)),yE={kernelName:Kn,backendName:"cpu",kernelFunc:_5};var E5=we(ha,r=>Math.sinh(r)),bE={kernelName:ha,backendName:"cpu",kernelFunc:E5};var $5=11920928955078125e-23,CE=Math.log($5)+2,R5=we(Qi,r=>{let e=r>-CE,t=rNumber(g)))),t.makeTensorInfo([h.length],o.dtype,new Int32Array(h))]}var SE={kernelName:Qa,backendName:"cpu",kernelFunc:F5};function D5(r){let{inputs:e,backend:t}=r,{inputIndices:o,inputShape:n,newShape:s}=e;if(o.shape.length!==2)throw new Error(`Input indices should be a matrix but received shape + ${o.shape}`);if(n.shape.length!==1)throw new Error(`Input shape should be a vector but received shape + ${n.shape}`);if(s.shape.length!==1)throw new Error(`Target shape should be a vector but received shape ${s.shape}`);let a=Array.from(t.data.get(n.dataId).values),i=t.data.get(o.dataId).values,p=Array.from(t.data.get(s.dataId).values),[u,c,l]=Nd(i,o.shape,o.dtype,a,p);return[t.makeTensorInfo(c,o.dtype,u),t.makeTensorInfo([l.length],s.dtype,new Int32Array(l))]}var vE={kernelName:ga,backendName:"cpu",kernelFunc:D5};function P5(r){let{inputs:e,backend:t}=r,{data:o,indices:n,segmentIds:s}=e;if(o.shape.length<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(n.shape.length!==1)throw new Error(`Indices should be a vector but received shape + ${n.shape}`);if(s.shape.length!==1)throw new Error(`Segment ids should be a vector but received shape + ${s.shape}`);if(n.shape[0]!==s.shape[0])throw new Error("segmentIds and indices should have same size.");let a=t.data.get(o.dataId).values,i=t.data.get(n.dataId).values,p=t.data.get(s.dataId).values,[u,c]=tc(a,o.shape,o.dtype,i,p,!0);return t.makeTensorInfo(c,o.dtype,u)}var kE={kernelName:Za,backendName:"cpu",kernelFunc:P5};function O5(r){let{inputs:e,backend:t}=r,{data:o,indices:n,segmentIds:s}=e;if(o.shape.length<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(n.shape.length!==1)throw new Error(`Indices should be a vector but received shape + ${n.shape}`);if(s.shape.length!==1)throw new Error(`Segment ids should be a vector but received shape + ${s.shape}`);if(n.shape[0]!==s.shape[0])throw new Error("segmentIds and indices should have same size.");let a=t.data.get(o.dataId).values,i=t.data.get(n.dataId).values,p=t.data.get(s.dataId).values,[u,c]=tc(a,o.shape,o.dtype,i,p);return t.makeTensorInfo(c,o.dtype,u)}var TE={kernelName:Ja,backendName:"cpu",kernelFunc:O5};function M5(r){let{inputs:e,backend:t,attrs:o}=r,{sparseIndices:n,sparseValues:s,defaultValue:a}=e,{outputShape:i}=o,{sliceRank:p,numUpdates:u,sliceSize:c,strides:l,outputSize:m}=I.calculateShapes(s,n,i),f=!1,d=t.bufferSync(n),h;switch(s.dtype){case"bool":{let g=t.bufferSync(s),y=Boolean(t.data.get(a.dataId).values[0]);h=Aa(d,g,i,m,c,u,p,l,y,f);break}case"float32":{let g=t.bufferSync(s),y=t.data.get(a.dataId).values[0];h=Aa(d,g,i,m,c,u,p,l,y,f);break}case"int32":{let g=t.bufferSync(s),y=t.data.get(a.dataId).values[0];h=Aa(d,g,i,m,c,u,p,l,y,f);break}case"string":{let g=t.bufferSync(s),y=x.decodeString(t.data.get(a.dataId).values[0]);h=Aa(d,g,i,m,c,u,p,l,y,f);break}default:throw new Error(`Unsupported type ${s.dtype}`)}return t.makeTensorInfo(i,h.dtype,h.values)}var NE={kernelName:ei,backendName:"cpu",kernelFunc:M5};function L5(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{numOrSizeSplits:s,axis:a}=o,i=x.parseAxisParam(a,n.shape)[0],p=I.prepareSplitSize(n,s,i),u=new Array(n.shape.length).fill(0),c=n.shape.slice();return p.map(l=>{let m=[...c];m[i]=l;let f=qo({inputs:{x:n},backend:t,attrs:{begin:u,size:m}});return u[i]+=l,f})}var _E={kernelName:Ts,backendName:"cpu",kernelFunc:L5};var EE={kernelName:ti,backendName:"cpu",kernelFunc:({inputs:r,backend:e})=>{let{x:t}=r,o=e;K(t,"square");let n=o.data.get(t.dataId).values,s=new Float32Array(n.length);for(let i=0;i{let t=e;return isNaN(r)?NaN:r>0?1:t.alpha}),$E={kernelName:$s,backendName:"cpu",kernelFunc:B5};function V5(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{begin:s,end:a,strides:i,beginMask:p,endMask:u,ellipsisMask:c,newAxisMask:l,shrinkAxisMask:m}=o;K(n,"stridedSlice");let{finalShapeSparse:f,finalShape:d,isIdentity:h,sliceDim0:g,isSimpleSlice:y,begin:b,end:C,strides:w}=et.sliceInfo(n.shape,s,a,i,p,u,c,l,m),k;if(h)k=Oe({inputs:{x:n},backend:t,attrs:{shape:d}});else if(g||y){x.assert(n.shape.length>=1,()=>`Input must have rank at least 1, got: ${n.shape.length}`);let _=et.computeOutShape(b,C,w),E=qo({inputs:{x:n},backend:t,attrs:{begin:b,size:_}});k=Oe({inputs:{x:E},backend:t,attrs:{shape:d}}),t.disposeIntermediateTensorInfo(E)}else{let _=t.bufferSync(n),E=_d(f,_,w,b);k=t.makeTensorInfo(d,E.dtype,E.values)}return k}var RE={kernelName:Yn,backendName:"cpu",kernelFunc:V5};function z5(r){let{inputs:e,backend:t,attrs:o}=r,{separator:n,nGramWidths:s,leftPad:a,rightPad:i,padWidth:p,preserveShortSequences:u}=o,{data:c,dataSplits:l}=e,m=t.data.get(c.dataId).values,f=t.data.get(l.dataId).values,[d,h]=ku(m,f,n,s,a,i,p,u);return[t.makeTensorInfo([d.length],"string",d),t.makeTensorInfo(l.shape,"int32",h)]}var AE={kernelName:Ns,backendName:"cpu",kernelFunc:z5};function W5(r){let{inputs:e,backend:t,attrs:o}=r,{skipEmpty:n}=o,{input:s,delimiter:a}=e;if(s.dtype!=="string")throw new Error("Input must be of datatype string");if(s.shape.length!==1)throw new Error(`Input must be a vector, got shape: ${s.shape}`);if(a.shape.length!==0)throw new Error(`Delimiter must be a scalar, got shape: ${a.shape}`);let i=t.data.get(s.dataId).values,p=t.data.get(a.dataId).values[0],[u,c,l]=Tu(i,p,n),m=c.length;return[t.makeTensorInfo([m,2],"int32",u),t.makeTensorInfo([m],"string",c),t.makeTensorInfo([2],"int32",new Int32Array(l))]}var FE={kernelName:ri,backendName:"cpu",kernelFunc:W5};function U5(r){let{inputs:e,backend:t,attrs:o}=r,{numBuckets:n}=o,{input:s}=e;if(s.dtype!=="string")throw new Error("Input must be of datatype string");if(n<=0)throw new Error("Number of buckets must be at least 1");let a=t.data.get(s.dataId).values,i=Nu(a,n);return t.makeTensorInfo(s.shape,"int32",i)}var DE={kernelName:oi,backendName:"cpu",kernelFunc:U5};var G5=we(xa,r=>Math.tan(r)),PE={kernelName:xa,backendName:"cpu",kernelFunc:G5};var H5=we(Qn,r=>Math.tanh(r)),OE={kernelName:Qn,backendName:"cpu",kernelFunc:H5};function q5(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{reps:s}=o;K(n,"tile");let a=Ed(t.bufferSync(n),s);return t.makeTensorInfo(a.shape,a.dtype,a.values)}var ME={kernelName:wo,backendName:"cpu",kernelFunc:q5};function K5(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{k:s,sorted:a}=o;K(n,"topk");let i=t.data.get(n.dataId).values,[p,u]=$d(i,n.shape,n.dtype,s,a);return[t.makeTensorInfo(p.shape,p.dtype,p.values),t.makeTensorInfo(u.shape,u.dtype,u.values)]}var LE={kernelName:Zn,backendName:"cpu",kernelFunc:K5};function j5(r){let{inputs:e,attrs:t,backend:o}=r,{image:n,transforms:s}=e,{interpolation:a,fillMode:i,fillValue:p,outputShape:u}=t,[c,l,m,f]=n.shape,[d,h]=u!=null?u:[l,m],g=[c,d,h,f],y=x.computeStrides(n.shape),b=y[0],C=y[1],w=y[2],k=x.computeStrides(g),_=k[0],E=k[1],R=k[2],A=x.getTypedArrayFromDType(n.dtype,x.sizeFromShape(g));A.fill(p);let D=o.data.get(n.dataId).values,O=o.data.get(s.dataId).values;for(let L=0;Le-1)if(e<=1)t=0;else{let o=2*e;t-=o*Math.trunc(t/o),t>=e&&(t=o-t-1)}return x.clamp(0,t,e-1)}function Y5(r,e){let t=r;if(t<0)if(e<=1)t=0;else{let o=e-1;t+=e*(Math.trunc(-t/o)+1)}else if(t>e-1)if(e<=1)t=0;else{let o=e-1;t-=e*Math.trunc(t/o)}return x.clamp(0,t,e-1)}function Q5(r,e){return r}function Z5(r,e){return x.clamp(0,r,e-1)}function Nl(r,e,t,o,n,s,a,i,p,u,c){let l=a*o+i*n+p*s+u;return 0<=i&&it.disposeIntermediateTensorInfo(d)),f}var UE={kernelName:Rp,backendName:"cpu",kernelFunc:o8};var n8=[h2,TN,g2,x2,RN,y2,b2,C2,I2,w2,S2,v2,k2,T2,N2,E2,$2,R2,A2,d2,F2,D2,P2,O2,$N,AN,M2,NN,L2,V2,z2,W2,U2,G2,H2,q2,K2,j2,X2,Y2,Q2,Z2,J2,e_,t_,r_,o_,n_,s_,a_,u_,u2,p_,FN,c_,DN,l_,PN,m_,f_,d_,ON,h_,g_,x_,y_,b_,MN,LN,_N,C_,B2,I_,w_,S_,p2,BN,VN,v_,zN,k_,T_,N_,__,E_,$_,R_,WN,A_,F_,D_,P_,M_,L_,B_,UN,V_,z_,G_,GN,HN,H_,q_,K_,qN,j_,Q_,Z_,Od,J_,c2,jN,eE,tE,rE,oE,EN,vl,nE,l2,m2,f2,sE,aE,iE,uE,pE,cE,lE,JN,mE,dE,hE,gE,t2,xE,yE,bE,r2,W_,IE,wE,SE,vE,kE,TE,NE,_E,n2,EE,s2,$E,RE,AE,FE,DE,a2,i_,PE,OE,ME,LE,VE,KN,zE,WE,UE,X_];for(let r of n8)ya(r);var ic={};Be(ic,{assertNotComplex:()=>as,bindCanvasToFramebuffer:()=>f8,bindColorTextureToFramebuffer:()=>Rl,bindTextureToProgramUniformSampler:()=>ZI,bindTextureUnit:()=>KE,bindVertexBufferToProgramAttribute:()=>Wd,callAndCheck:()=>me,canBeRepresented:()=>VI,createFragmentShader:()=>WI,createFramebuffer:()=>XI,createProgram:()=>UI,createStaticIndexBuffer:()=>qI,createStaticVertexBuffer:()=>HI,createTexture:()=>KI,createVertexShader:()=>zI,getBatchDim:()=>Pa,getExtensionOrThrow:()=>nc,getFramebufferErrorMessage:()=>jE,getMaxTexturesInShader:()=>tw,getNumChannels:()=>l8,getProgramUniformLocation:()=>QI,getProgramUniformLocationOrThrow:()=>YI,getRowsCols:()=>Oa,getShapeAs3D:()=>ac,getTextureShapeFromLogicalShape:()=>JI,getWebGLDisjointQueryTimerVersion:()=>rw,getWebGLErrorMessage:()=>qE,getWebGLMaxTextureSize:()=>ew,hasExtension:()=>Hr,isCapableOfRenderingToFloatTexture:()=>ow,isDownloadFloatTextureEnabled:()=>nw,isReshapeFree:()=>Ti,isWebGLFenceEnabled:()=>sw,isWebGLVersionEnabled:()=>Gd,linkProgram:()=>GI,logShaderSourceAndInfoLog:()=>zd,resetMaxTextureSize:()=>d8,resetMaxTexturesInShader:()=>h8,unbindColorTextureFromFramebuffer:()=>Ud,unbindTextureUnit:()=>m8,validateFramebuffer:()=>sc,validateProgram:()=>$l,validateTextureSize:()=>jI});var Eu={},Md={alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!0};function MI(r,e){Eu[r]=e}function Gr(r,e){if(!(r in Eu)||e!=null){let o=a8(r,e);if(o!==null)Eu[r]=o;else return console.log("Could not get context for WebGL version",r),null}let t=Eu[r];return t==null||t.isContextLost()?(delete Eu[r],Gr(r)):(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),Eu[r])}function s8(r){if(typeof OffscreenCanvas!="undefined"&&r===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 a8(r,e){if(r!==1&&r!==2)throw new Error("Cannot get WebGL rendering context, WebGL is disabled.");let t=e==null?s8(r):e;return t.addEventListener("webglcontextlost",o=>{o.preventDefault(),delete Eu[r]},!1),P().getBool("SOFTWARE_WEBGL_ENABLED")&&(Md.failIfMajorPerformanceCaveat=!1),r===1?t.getContext("webgl",Md)||t.getContext("experimental-webgl",Md):t.getContext("webgl2",Md)}var ki;(function(r){r[r.DENSE=0]="DENSE",r[r.SHARED_BATCH=1]="SHARED_BATCH"})(ki||(ki={}));var ir;(function(r){r[r.RENDER=0]="RENDER",r[r.UPLOAD=1]="UPLOAD",r[r.PIXELS=2]="PIXELS",r[r.DOWNLOAD=3]="DOWNLOAD"})(ir||(ir={}));var Jt;(function(r){r[r.UNPACKED_FLOAT16=0]="UNPACKED_FLOAT16",r[r.UNPACKED_FLOAT32=1]="UNPACKED_FLOAT32",r[r.PACKED_4X1_UNSIGNED_BYTE=2]="PACKED_4X1_UNSIGNED_BYTE",r[r.PACKED_2X2_FLOAT32=3]="PACKED_2X2_FLOAT32",r[r.PACKED_2X2_FLOAT16=4]="PACKED_2X2_FLOAT16"})(Jt||(Jt={}));function $u(r,e){return[e,r]}function GE(r,e){return r*e}function _l(r){let e=x.sizeFromShape(r),t=Math.ceil(e/4);return x.sizeToSquarishShape(t)}function Ks(r,e){return[Math.max(1,Math.ceil(e/2)),Math.max(1,Math.ceil(r/2))]}function HE(r,e){let[t,o]=Ks(r,e);return t*o*4}function El(r,e){let t=r,o,n,s,a,i,p,u,c,l,m;return P().getNumber("WEBGL_VERSION")===2?(o=t.R32F,n=t.R16F,s=t.RGBA16F,a=t.RGBA32F,i=t.RED,u=4,c=1,l=t.HALF_FLOAT,m=t.FLOAT,p=t.RGBA8):(o=r.RGBA,n=r.RGBA,s=r.RGBA,a=t.RGBA,i=r.RGBA,u=4,c=4,l=e!=null?e.HALF_FLOAT_OES:null,m=r.FLOAT,p=r.RGBA),{internalFormatFloat:o,internalFormatHalfFloat:n,internalFormatPackedHalfFloat:s,internalFormatPackedFloat:a,textureFormatFloat:i,downloadTextureFormat:p,downloadUnpackNumChannels:u,defaultNumChannels:c,textureTypeHalfFloat:l,textureTypeFloat:m}}function me(r,e){let t=e();return P().getBool("DEBUG")&&i8(r),t}function i8(r){let e=r.getError();if(e!==r.NO_ERROR)throw new Error("WebGL Error: "+qE(r,e))}var u8=596e-10,p8=65504;function VI(r){return!!(P().getBool("WEBGL_RENDER_FLOAT32_ENABLED")||r===0||u8r.getExtension(e),'Extension "'+e+'" not supported on this browser.')}function zI(r,e){let t=Da(r,()=>r.createShader(r.VERTEX_SHADER),"Unable to create vertex WebGLShader.");if(me(r,()=>r.shaderSource(t,e)),me(r,()=>r.compileShader(t)),r.getShaderParameter(t,r.COMPILE_STATUS)===!1)throw console.log(r.getShaderInfoLog(t)),new Error("Failed to compile vertex shader.");return t}function WI(r,e){let t=Da(r,()=>r.createShader(r.FRAGMENT_SHADER),"Unable to create fragment WebGLShader.");if(me(r,()=>r.shaderSource(t,e)),me(r,()=>r.compileShader(t)),P().get("ENGINE_COMPILE_ONLY"))return t;if(r.getShaderParameter(t,r.COMPILE_STATUS)===!1)throw zd(e,r.getShaderInfoLog(t)),new Error("Failed to compile fragment shader.");return t}var c8=/ERROR: [0-9]+:([0-9]+):/g;function zd(r,e){let t=c8.exec(e);if(t==null){console.log(`Couldn't parse line number in error: ${e}`),console.log(r);return}let o=+t[1],n=r.split(` +`),s=n.length.toString().length+2,a=n.map((l,m)=>x.rightPad((m+1).toString(),s)+l),i=0;for(let l=0;lr.createProgram(),"Unable to create WebGLProgram.")}function GI(r,e){if(me(r,()=>r.linkProgram(e)),!P().get("ENGINE_COMPILE_ONLY")&&r.getProgramParameter(e,r.LINK_STATUS)===!1)throw console.log(r.getProgramInfoLog(e)),new Error("Failed to link vertex and fragment shaders.")}function $l(r,e){if(me(r,()=>r.validateProgram(e)),r.getProgramParameter(e,r.VALIDATE_STATUS)===!1)throw console.log(r.getProgramInfoLog(e)),new Error("Shader program validation failed.")}function HI(r,e){let t=Da(r,()=>r.createBuffer(),"Unable to create WebGLBuffer");return me(r,()=>r.bindBuffer(r.ARRAY_BUFFER,t)),me(r,()=>r.bufferData(r.ARRAY_BUFFER,e,r.STATIC_DRAW)),t}function qI(r,e){let t=Da(r,()=>r.createBuffer(),"Unable to create WebGLBuffer");return me(r,()=>r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,t)),me(r,()=>r.bufferData(r.ELEMENT_ARRAY_BUFFER,e,r.STATIC_DRAW)),t}function l8(){return P().getNumber("WEBGL_VERSION")===2?1:4}function KI(r){return Da(r,()=>r.createTexture(),"Unable to create WebGLTexture.")}function jI(r,e){let t=P().getNumber("WEBGL_MAX_TEXTURE_SIZE");if(r<=0||e<=0){let o=`[${r}x${e}]`;throw new Error("Requested texture size "+o+" is invalid.")}if(r>t||e>t){let o=`[${r}x${e}]`,n=`[${t}x${t}]`;throw new Error("Requested texture size "+o+" greater than WebGL maximum on this browser / GPU "+n+".")}}function XI(r){return Da(r,()=>r.createFramebuffer(),"Unable to create WebGLFramebuffer.")}function Wd(r,e,t,o,n,s,a){let i=r.getAttribLocation(e,t);return i===-1?!1:(me(r,()=>r.bindBuffer(r.ARRAY_BUFFER,o)),me(r,()=>r.vertexAttribPointer(i,n,r.FLOAT,!1,s,a)),me(r,()=>r.enableVertexAttribArray(i)),!0)}function KE(r,e,t){XE(r,t),me(r,()=>r.activeTexture(r.TEXTURE0+t)),me(r,()=>r.bindTexture(r.TEXTURE_2D,e))}function m8(r,e){XE(r,e),me(r,()=>r.activeTexture(r.TEXTURE0+e)),me(r,()=>r.bindTexture(r.TEXTURE_2D,null))}function YI(r,e,t){return Da(r,()=>r.getUniformLocation(e,t),'uniform "'+t+'" not present in program.')}function QI(r,e,t){return r.getUniformLocation(e,t)}function ZI(r,e,t,o){me(r,()=>KE(r,e,o)),me(r,()=>r.uniform1i(t,o))}function f8(r){me(r,()=>r.bindFramebuffer(r.FRAMEBUFFER,null)),me(r,()=>r.viewport(0,0,r.canvas.width,r.canvas.height)),me(r,()=>r.scissor(0,0,r.canvas.width,r.canvas.height))}function Rl(r,e,t){me(r,()=>r.bindFramebuffer(r.FRAMEBUFFER,t)),me(r,()=>r.framebufferTexture2D(r.FRAMEBUFFER,r.COLOR_ATTACHMENT0,r.TEXTURE_2D,e,0))}function Ud(r,e){me(r,()=>r.bindFramebuffer(r.FRAMEBUFFER,e)),me(r,()=>r.framebufferTexture2D(r.FRAMEBUFFER,r.COLOR_ATTACHMENT0,r.TEXTURE_2D,null,0))}function sc(r){let e=r.checkFramebufferStatus(r.FRAMEBUFFER);if(e!==r.FRAMEBUFFER_COMPLETE)throw new Error("Error binding framebuffer: "+jE(r,e))}function jE(r,e){switch(e){case r.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_ATTACHMENT";case r.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT";case r.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:return"FRAMEBUFFER_INCOMPLETE_DIMENSIONS";case r.FRAMEBUFFER_UNSUPPORTED:return"FRAMEBUFFER_UNSUPPORTED";default:return`unknown error ${e}`}}function Da(r,e,t){let o=me(r,()=>e());if(o==null)throw new Error(t);return o}function XE(r,e){let t=r.MAX_COMBINED_TEXTURE_IMAGE_UNITS-1,o=e+r.TEXTURE0;if(ot){let n=`[gl.TEXTURE0, gl.TEXTURE${t}]`;throw new Error(`textureUnit must be in ${n}.`)}}function Pa(r,e=2){return x.sizeFromShape(r.slice(0,r.length-e))}function Oa(r){if(r.length===0)throw Error("Cannot get rows and columns of an empty shape array.");return[r.length>1?r[r.length-2]:1,r[r.length-1]]}function ac(r){let e=[1,1,1];return r.length===0||r.length===1&&r[0]===1||(e=[Pa(r),...Oa(r)]),e}function JI(r,e=!1){let t=P().getNumber("WEBGL_MAX_TEXTURE_SIZE"),o=P().getNumber("WEBGL_MAX_SIZE_FOR_NARROW_TEXTURE");o===1/0&&P().getBool("WEBGL_AUTO_SQUARIFY_NARROW_TEXTURE_SHAPE")&&(o=t/2),e&&(t=t*2,o=o*2,r=r.map((i,p)=>p>=r.length-2?x.nearestLargerEven(r[p]):r[p]),r.length===1&&(r=[2,r[0]])),r.length!==2&&(r=x.squeezeShape(r).newShape);let n=x.sizeFromShape(r),s=null;r.length<=1&&n<=t?s=[1,n]:r.length===2&&r[0]<=t&&r[1]<=t?s=r:r.length===3&&r[0]*r[1]<=t&&r[2]<=t?s=[r[0]*r[1],r[2]]:r.length===3&&r[0]<=t&&r[1]*r[2]<=t?s=[r[0],r[1]*r[2]]:r.length===4&&r[0]*r[1]*r[2]<=t&&r[3]<=t?s=[r[0]*r[1]*r[2],r[3]]:r.length===4&&r[0]<=t&&r[1]*r[2]*r[3]<=t&&(s=[r[0],r[1]*r[2]*r[3]]);let a=s!=null&&Math.max(...s)>o&&Math.min(...s)<=(e?2:1)&&Math.min(...s)>0;if(s==null||a)if(e){let i=Pa(r),p=2,u=2;r.length&&([p,u]=Oa(r)),n=i*(p/2)*(u/2),s=x.sizeToSquarishShape(n).map(c=>c*2)}else s=x.sizeToSquarishShape(n);return s}function Ld(r){return r%2===0}function Ti(r,e){if(r=r.slice(-2),e=e.slice(-2),x.arraysEqual(r,e)||!r.length||!e.length||r[0]===0||r[1]===0||e[0]===0||e[1]===0)return!0;if(r.length!==e.length){let t=r.slice(-1)[0],o=e.slice(-1)[0];if(t===o||Ld(t)&&Ld(o)&&(r[0]===1||e[0]===1))return!0}return r[1]===e[1]&&Ld(r[0])&&Ld(e[0])}var Bd,Vd;function ew(r){if(Bd==null){let e=Gr(r);Bd=e.getParameter(e.MAX_TEXTURE_SIZE)}return Bd}function d8(){Bd=null}function h8(){Vd=null}function tw(r){if(Vd==null){let e=Gr(r);Vd=e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS)}return Math.min(16,Vd)}function rw(r){if(r===0)return 0;let e,t=Gr(r);return Hr(t,"EXT_disjoint_timer_query_webgl2")&&r===2?e=2:Hr(t,"EXT_disjoint_timer_query")?e=1:e=0,e}function Hr(r,e){return r.getExtension(e)!=null}function Gd(r){try{if(Gr(r)!=null)return!0}catch(e){return console.log("Error when getting WebGL context: ",e),!1}return!1}function ow(r){if(r===0)return!1;let e=Gr(r);if(r===1){if(!Hr(e,"OES_texture_float"))return!1}else if(!Hr(e,"EXT_color_buffer_float"))return!1;return BI(e)}function nw(r){if(r===0)return!1;let e=Gr(r);if(r===1){if(!Hr(e,"OES_texture_float")||!Hr(e,"WEBGL_color_buffer_float"))return!1}else{if(Hr(e,"EXT_color_buffer_float"))return BI(e);let o="EXT_color_buffer_half_float";if(Hr(e,o)){let n=e.getExtension(o);return g8(e,n)}return!1}return BI(e)}function BI(r){let e=El(r),t=r.createTexture();r.bindTexture(r.TEXTURE_2D,t);let o=1,n=1;r.texImage2D(r.TEXTURE_2D,0,e.internalFormatFloat,o,n,0,e.textureFormatFloat,e.textureTypeFloat,null);let s=r.createFramebuffer();r.bindFramebuffer(r.FRAMEBUFFER,s),r.framebufferTexture2D(r.FRAMEBUFFER,r.COLOR_ATTACHMENT0,r.TEXTURE_2D,t,0);let a=r.checkFramebufferStatus(r.FRAMEBUFFER)===r.FRAMEBUFFER_COMPLETE;return r.bindTexture(r.TEXTURE_2D,null),r.bindFramebuffer(r.FRAMEBUFFER,null),r.deleteTexture(t),r.deleteFramebuffer(s),a}function g8(r,e){let t=El(r,e),o=r.createTexture();r.bindTexture(r.TEXTURE_2D,o);let n=1,s=1;r.texImage2D(r.TEXTURE_2D,0,t.internalFormatHalfFloat,n,s,0,t.textureFormatFloat,t.textureTypeHalfFloat,null);let a=r.createFramebuffer();r.bindFramebuffer(r.FRAMEBUFFER,a),r.framebufferTexture2D(r.FRAMEBUFFER,r.COLOR_ATTACHMENT0,r.TEXTURE_2D,o,0);let i=r.checkFramebufferStatus(r.FRAMEBUFFER)===r.FRAMEBUFFER_COMPLETE;return r.bindTexture(r.TEXTURE_2D,null),r.bindFramebuffer(r.FRAMEBUFFER,null),r.deleteTexture(o),r.deleteFramebuffer(a),i}function sw(r){return r!==2?!1:Gr(r).fenceSync!=null}function as(r,e){Array.isArray(r)||(r=[r]),r.forEach(t=>{t!=null&&x.assert(t.dtype!=="complex64",()=>`${e} does not support complex64 tensors in the WebGL backend.`)})}var Ce=P();Ce.registerFlag("HAS_WEBGL",()=>Ce.getNumber("WEBGL_VERSION")>0);Ce.registerFlag("WEBGL_VERSION",()=>Gd(2)?2:Gd(1)?1:0);Ce.registerFlag("WEBGL_CHECK_NUMERICAL_PROBLEMS",()=>!1);Ce.registerFlag("WEBGL_BUFFER_SUPPORTED",()=>Ce.get("WEBGL_VERSION")===2);Ce.registerFlag("WEBGL_CPU_FORWARD",()=>!0);Ce.registerFlag("WEBGL_FORCE_F16_TEXTURES",()=>!1);Ce.registerFlag("WEBGL_PACK",()=>Ce.getBool("HAS_WEBGL"));Ce.registerFlag("WEBGL_PACK_NORMALIZATION",()=>Ce.getBool("WEBGL_PACK"));Ce.registerFlag("WEBGL_PACK_CLIP",()=>Ce.getBool("WEBGL_PACK"));Ce.registerFlag("WEBGL_PACK_DEPTHWISECONV",()=>Ce.getBool("WEBGL_PACK"));Ce.registerFlag("WEBGL_PACK_BINARY_OPERATIONS",()=>Ce.getBool("WEBGL_PACK"));Ce.registerFlag("WEBGL_PACK_UNARY_OPERATIONS",()=>Ce.getBool("WEBGL_PACK"));Ce.registerFlag("WEBGL_PACK_ARRAY_OPERATIONS",()=>Ce.getBool("WEBGL_PACK"));Ce.registerFlag("WEBGL_PACK_IMAGE_OPERATIONS",()=>Ce.getBool("WEBGL_PACK"));Ce.registerFlag("WEBGL_PACK_REDUCE",()=>Ce.getBool("WEBGL_PACK"));Ce.registerFlag("WEBGL_LAZILY_UNPACK",()=>Ce.getBool("WEBGL_PACK"));Ce.registerFlag("WEBGL_CONV_IM2COL",()=>Ce.getBool("WEBGL_PACK"));Ce.registerFlag("WEBGL_MAX_TEXTURE_SIZE",()=>ew(Ce.getNumber("WEBGL_VERSION")));Ce.registerFlag("WEBGL_MAX_TEXTURES_IN_SHADER",()=>tw(Ce.getNumber("WEBGL_VERSION")));Ce.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION",()=>{let r=Ce.getNumber("WEBGL_VERSION");return r===0?0:rw(r)});Ce.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE",()=>Ce.getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0&&!ii.isMobile());Ce.registerFlag("WEBGL_RENDER_FLOAT32_CAPABLE",()=>ow(Ce.getNumber("WEBGL_VERSION")));Ce.registerFlag("WEBGL_RENDER_FLOAT32_ENABLED",()=>Ce.getBool("WEBGL_FORCE_F16_TEXTURES")?!1:Ce.getBool("WEBGL_RENDER_FLOAT32_CAPABLE"));Ce.registerFlag("WEBGL_DOWNLOAD_FLOAT_ENABLED",()=>nw(Ce.getNumber("WEBGL_VERSION")));Ce.registerFlag("WEBGL_FENCE_API_ENABLED",()=>sw(Ce.getNumber("WEBGL_VERSION")));Ce.registerFlag("WEBGL_SIZE_UPLOAD_UNIFORM",()=>Ce.getBool("WEBGL_RENDER_FLOAT32_ENABLED")?4:0);Ce.registerFlag("WEBGL_DELETE_TEXTURE_THRESHOLD",()=>-1,r=>{if(r<0&&r!==-1)throw new Error(`WEBGL_DELETE_TEXTURE_THRESHOLD must be -1 (indicating never delete) or at least 0, but got ${r}.`)});Ce.registerFlag("WEBGL_FLUSH_THRESHOLD",()=>ii.isMobile()?1:-1,r=>{if(r<0&&r!==-1)throw new Error(`WEBGL_FLUSH_THRESHOLD must be -1 (indicating never manual flush) or at least 0, but got ${r}.`)});Ce.registerFlag("CPU_HANDOFF_SIZE_THRESHOLD",()=>128);Ce.registerFlag("WEBGL_USE_SHAPES_UNIFORMS",()=>!1);Ce.registerFlag("TOPK_LAST_DIM_CPU_HANDOFF_SIZE_THRESHOLD",()=>1e5);Ce.registerFlag("TOPK_K_CPU_HANDOFF_THRESHOLD",()=>128);Ce.registerFlag("WEBGL_EXP_CONV",()=>!1);Ce.registerFlag("SOFTWARE_WEBGL_ENABLED",()=>Ce.getBool("IS_TEST"));Ce.registerFlag("WEBGL_MAX_SIZE_FOR_NARROW_TEXTURE",()=>1/0);Ce.registerFlag("WEBGL_AUTO_SQUARIFY_NARROW_TEXTURE_SHAPE",()=>!1);Ce.registerFlag("WEBGL2_ISNAN_CUSTOM",()=>!1);function Ct(){let r,e,t,o,n,s,a,i,p,u;return P().getNumber("WEBGL_VERSION")===2?(r="#version 300 es",e="in",t="out",o="in",n="texture",s="outputColor",a="out vec4 outputColor;",i=P().getBool("WEBGL2_ISNAN_CUSTOM")?` + bool isnan_custom(float val) { + uint floatToUint = floatBitsToUint(val); + return (floatToUint & 0x7fffffffu) > 0x7f800000u; + } + + bvec4 isnan_custom(vec4 val) { + return bvec4(isnan_custom(val.x), + isnan_custom(val.y), isnan_custom(val.z), isnan_custom(val.w)); + } + + #define isnan(value) isnan_custom(value) + `:"",p="",u=` + #define round(value) newRound(value) + int newRound(float value) { + return int(floor(value + 0.5)); + } + + ivec4 newRound(vec4 value) { + return ivec4(floor(value + vec4(0.5))); + } + `):(r="",e="attribute",t="varying",o="varying",n="texture2D",s="gl_FragColor",a="",i=` + #define isnan(value) isnan_custom(value) + bool isnan_custom(float val) { + return (val > 0. || val < 1. || val == 0.) ? false : true; + } + bvec4 isnan_custom(vec4 val) { + return bvec4(isnan(val.x), isnan(val.y), isnan(val.z), isnan(val.w)); + } + `,p=` + uniform float INFINITY; + + bool isinf(float val) { + return abs(val) == INFINITY; + } + bvec4 isinf(vec4 val) { + return equal(abs(val), vec4(INFINITY)); + } + `,u=` + int round(float value) { + return int(floor(value + 0.5)); + } + + ivec4 round(vec4 value) { + return ivec4(floor(value + vec4(0.5))); + } + `),{version:r,attribute:e,varyingVs:t,varyingFs:o,texture2D:n,output:s,defineOutput:a,defineSpecialNaN:i,defineSpecialInf:p,defineRound:u}}function is(r,e,t="index"){let o=x.computeStrides(e);return o.map((n,s)=>{let a=`int ${r[s]} = ${t} / ${n}`,i=s===o.length-1?`int ${r[s+1]} = ${t} - ${r[s]} * ${n}`:`index -= ${r[s]} * ${n}`;return`${a}; ${i};`}).join("")}function Ru(r,e,t="index"){let o=x.computeStrides(e);return o.map((n,s)=>{let a=`int ${r[s]} = ${t} / outShapeStrides[${s}]`,i=s===o.length-1?`int ${r[s+1]} = ${t} - ${r[s]} * outShapeStrides[${s}]`:`index -= ${r[s]} * outShapeStrides[${s}]`;return`${a}; ${i};`}).join("")}function x8(r,e){let t=r.length,o=r.map(s=>`${e}[${s}]`),n=new Array(t-1);n[t-2]=o[t-1];for(let s=t-3;s>=0;--s)n[s]=`(${n[s+1]} * ${o[s+1]})`;return n}function YE(r,e,t="index"){let o=r.map((s,a)=>a),n=x8(o,e);return n.map((s,a)=>{let i=`int ${r[a]} = ${t} / ${n[a]}`,p=a===n.length-1?`int ${r[a+1]} = ${t} - ${r[a]} * ${n[a]}`:`index -= ${r[a]} * ${n[a]}`;return`${i}; ${p};`}).join("")}function uc(r){let e=x.computeStrides(r).map(t=>t.toString());return` + int getFlatIndex(ivec3 coords) { + return coords.x * ${e[0]} + coords.y * ${e[1]} + coords.z; + } +`}function pc(){return` + int getFlatIndex(ivec3 coords) { + return coords.x * outShapeStrides[0] + coords.y * outShapeStrides[1] + coords.z; + } +`}var Hd=` + const float FLOAT_MAX = 1.70141184e38; + const float FLOAT_MIN = 1.17549435e-38; + + lowp vec4 encode_float(highp float v) { + if (isnan(v)) { + return vec4(255, 255, 255, 255); + } + + highp float av = abs(v); + + if(av < FLOAT_MIN) { + return vec4(0.0, 0.0, 0.0, 0.0); + } else if(v > FLOAT_MAX) { + return vec4(0.0, 0.0, 128.0, 127.0) / 255.0; + } else if(v < -FLOAT_MAX) { + return vec4(0.0, 0.0, 128.0, 255.0) / 255.0; + } + + highp vec4 c = vec4(0,0,0,0); + + highp float e = floor(log2(av)); + highp float m = exp2(fract(log2(av))) - 1.0; + + c[2] = floor(128.0 * m); + m -= c[2] / 128.0; + c[1] = floor(32768.0 * m); + m -= c[1] / 32768.0; + c[0] = floor(8388608.0 * m); + + highp float ebias = e + 127.0; + c[3] = floor(ebias / 2.0); + ebias -= c[3] * 2.0; + c[2] += floor(ebias) * 128.0; + + c[3] += 128.0 * step(0.0, -v); + + return c / 255.0; + } +`;var{getBroadcastDims:QE}=I;function ZE(r,e,t){let o=[];if(r.forEach(f=>{let d=x.sizeFromShape(f.shapeInfo.logicalShape);if(f.shapeInfo.isUniform?o.push(`uniform float ${f.name}${d>1?`[${d}]`:""};`):(o.push(`uniform sampler2D ${f.name};`),o.push(`uniform int offset${f.name};`)),t.enableShapeUniforms){let{uniformShape:h}=qd(t.packedInputs,f.shapeInfo.logicalShape,f.shapeInfo.texShape);switch(h.length){case 1:o.push(`uniform int ${f.name}Shape;`);break;case 2:o.push(`uniform ivec2 ${f.name}Shape;`);break;case 3:o.push(`uniform ivec3 ${f.name}Shape;`);break;case 4:o.push(`uniform ivec4 ${f.name}Shape;`);break;default:break}o.push(`uniform ivec2 ${f.name}TexShape;`)}}),t.enableShapeUniforms){switch(e.logicalShape.length){case 1:o.push("uniform int outShape;");break;case 2:o.push("uniform ivec2 outShape;"),o.push("uniform int outShapeStrides;");break;case 3:o.push("uniform ivec3 outShape;"),o.push("uniform ivec2 outShapeStrides;");break;case 4:o.push("uniform ivec4 outShape;"),o.push("uniform ivec3 outShapeStrides;");break;default:break}o.push("uniform ivec2 outTexShape;")}t.customUniforms&&t.customUniforms.forEach(f=>{o.push(`uniform ${f.type} ${f.name}${f.arrayIndex?`[${f.arrayIndex}]`:""};`)});let n=o.join(` +`),s=r.map(f=>y8(f,e,t.packedInputs,t.enableShapeUniforms)).join(` +`),a=e.texShape,i=Ct(),p=I8(i),u,c,l=v8(i);return e.isPacked?(u=b8(e.logicalShape,a,t.enableShapeUniforms),c=S8(i)):(u=C8(e.logicalShape,a,t.enableShapeUniforms),c=w8(i)),t.packedInputs&&(l+=_8),[l,p,c,n,u,s,t.userCode].join(` +`)}function lc(r,e=!1){let t=r.shapeInfo.logicalShape;switch(t.length){case 0:return V8(r,e);case 1:return W8(r,e);case 2:return G8(r,e);case 3:return q8(r,e);case 4:return j8(r,e);case 5:return X8(r);case 6:return Y8(r);default:throw new Error(`${t.length}-D input sampling is not yet supported`)}}function JE(r,e){switch(r.shapeInfo.logicalShape.length){case 0:return B8(r);case 1:return z8(r,e);case 2:return U8(r,e);case 3:return H8(r,e);default:return K8(r,e)}}function y8(r,e,t=!1,o){let n="";t?n+=JE(r,o):n+=lc(r,o);let s=r.shapeInfo.logicalShape,a=e.logicalShape;return s.length<=a.length&&(t?n+=Q8(r,e):n+=Z8(r,e)),n}function b8(r,e,t){switch(r.length){case 0:return e$();case 1:return E8(r,e,t);case 2:return M8(r,e,t);case 3:return R8(r,e,t);default:return F8(r,e,t)}}function C8(r,e,t){switch(r.length){case 0:return e$();case 1:return $8(r,e,t);case 2:return L8(r,e,t);case 3:return A8(r,e,t);case 4:return D8(r,e,t);case 5:return P8(r,e);case 6:return O8(r,e);default:throw new Error(`${r.length}-D output sampling is not yet supported`)}}function I8(r){return` + float sampleTexture(sampler2D textureSampler, vec2 uv) { + return ${r.texture2D}(textureSampler, uv).r; + } + `}function w8(r){return` + void setOutput(float val) { + ${r.output} = vec4(val, 0, 0, 0); + } + `}function S8(r){return` + void setOutput(vec4 val) { + ${r.output} = val; + } + `}function v8(r){return`${r.version} + precision highp float; + precision highp int; + precision highp sampler2D; + ${r.varyingFs} vec2 resultUV; + ${r.defineOutput} + const vec2 halfCR = vec2(0.5, 0.5); + + struct ivec5 + { + int x; + int y; + int z; + int w; + int u; + }; + + struct ivec6 + { + int x; + int y; + int z; + int w; + int u; + int v; + }; + + uniform float NAN; + ${r.defineSpecialNaN} + ${r.defineSpecialInf} + ${r.defineRound} + + int imod(int x, int y) { + return x - y * (x / y); + } + + int idiv(int a, int b, float sign) { + int res = a / b; + int mod = imod(a, b); + if (sign < 0. && mod != 0) { + res -= 1; + } + return res; + } + + //Based on the work of Dave Hoskins + //https://www.shadertoy.com/view/4djSRW + #define HASHSCALE1 443.8975 + float random(float seed){ + vec2 p = resultUV * seed; + vec3 p3 = fract(vec3(p.xyx) * HASHSCALE1); + p3 += dot(p3, p3.yzx + 19.19); + return fract((p3.x + p3.y) * p3.z); + } + + ${k8} + ${T8} + ${N8} + `}var k8=` +vec2 uvFromFlat(int texNumR, int texNumC, int index) { + int texR = index / texNumC; + int texC = index - texR * texNumC; + return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR); +} +vec2 packedUVfrom1D(int texNumR, int texNumC, int index) { + int texelIndex = index / 2; + int texR = texelIndex / texNumC; + int texC = texelIndex - texR * texNumC; + return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR); +} +`,T8=` +vec2 packedUVfrom2D(int texelsInLogicalRow, int texNumR, + int texNumC, int row, int col) { + int texelIndex = (row / 2) * texelsInLogicalRow + (col / 2); + int texR = texelIndex / texNumC; + int texC = texelIndex - texR * texNumC; + return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR); +} +`,N8=` +vec2 packedUVfrom3D(int texNumR, int texNumC, + int texelsInBatch, int texelsInLogicalRow, int b, + int row, int col) { + int index = b * texelsInBatch + (row / 2) * texelsInLogicalRow + (col / 2); + int texR = index / texNumC; + int texC = index - texR * texNumC; + return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR); +} +`,_8=` + float getChannel(vec4 frag, vec2 innerDims) { + vec2 modCoord = mod(innerDims, 2.); + return modCoord.x == 0. ? + (modCoord.y == 0. ? frag.r : frag.g) : + (modCoord.y == 0. ? frag.b : frag.a); + } + float getChannel(vec4 frag, int dim) { + float modCoord = mod(float(dim), 2.); + return modCoord == 0. ? frag.r : frag.g; + } +`;function e$(){return` + int getOutputCoords() { + return 0; + } + `}function E8(r,e,t){let o=[Math.ceil(e[0]/2),Math.ceil(e[1]/2)];return o[0]===1?t?` + int getOutputCoords() { + return 2 * int(resultUV.x * ceil(float(outTexShape[1]) / 2.0)); + } + `:` + int getOutputCoords() { + return 2 * int(resultUV.x * ${o[1]}.0); + } + `:o[1]===1?t?` + int getOutputCoords() { + return 2 * int(resultUV.y * ceil(float(outTexShape[0]) / 2.0)); + } + `:` + int getOutputCoords() { + return 2 * int(resultUV.y * ${o[0]}.0); + } + `:t?` + int getOutputCoords() { + ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0)); + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(packedTexShape[0], packedTexShape[1])); + return 2 * (resTexRC.x * packedTexShape[1] + resTexRC.y); + } + `:` + int getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${o[0]}, ${o[1]})); + return 2 * (resTexRC.x * ${o[1]} + resTexRC.y); + } + `}function $8(r,e,t){return e[0]===1?t?` + int getOutputCoords() { + return int(resultUV.x * float(outTexShape[1])); + } + `:` + int getOutputCoords() { + return int(resultUV.x * ${e[1]}.0); + } + `:e[1]===1?t?` + int getOutputCoords() { + return int(resultUV.y * float(outTexShape[0])); + } + `:` + int getOutputCoords() { + return int(resultUV.y * ${e[0]}.0); + } + `:t?` + int getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(outTexShape[0], outTexShape[1])); + return resTexRC.x * outTexShape[1] + resTexRC.y; + } + `:` + int getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${e[0]}, ${e[1]})); + return resTexRC.x * ${e[1]} + resTexRC.y; + } + `}function R8(r,e,t){if(t)return` + ivec3 getOutputCoords() { + ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0)); + int texelsInLogicalRow = int(ceil(float(outShape[2]) / 2.0)); + int texelsInBatch = texelsInLogicalRow * int(ceil(float(outShape[1]) / 2.0)); + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(packedTexShape[0], packedTexShape[1])); + int index = resTexRC.x * packedTexShape[1] + resTexRC.y; + + int b = index / texelsInBatch; + index -= b * texelsInBatch; + + int r = 2 * (index / texelsInLogicalRow); + int c = imod(index, texelsInLogicalRow) * 2; + + return ivec3(b, r, c); + } + `;let o=[Math.ceil(e[0]/2),Math.ceil(e[1]/2)],n=Math.ceil(r[2]/2),s=n*Math.ceil(r[1]/2);return` + ivec3 getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${o[0]}, ${o[1]})); + int index = resTexRC.x * ${o[1]} + resTexRC.y; + + int b = index / ${s}; + index -= b * ${s}; + + int r = 2 * (index / ${n}); + int c = imod(index, ${n}) * 2; + + return ivec3(b, r, c); + } + `}function A8(r,e,t){if(t)return` + ivec3 getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(outTexShape[0], outTexShape[1])); + int index = resTexRC.x * outTexShape[1] + resTexRC.y; + ${Ru(["r","c","d"],r)} + return ivec3(r, c, d); + } +`;let o=is(["r","c","d"],r);return` + ivec3 getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${e[0]}, ${e[1]})); + int index = resTexRC.x * ${e[1]} + resTexRC.y; + ${o} + return ivec3(r, c, d); + } + `}function F8(r,e,t){if(t)return` + ivec4 getOutputCoords() { + ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0)); + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(packedTexShape[0], packedTexShape[1])); + int index = resTexRC.x * packedTexShape[1] + resTexRC.y; + + int texelsInLogicalRow = int(ceil(float(outShape[3]) / 2.0)); + int texelsInBatch = texelsInLogicalRow * int(ceil(float(outShape[2]) / 2.0)); + int texelsInBatchN = texelsInBatch * outShape[1]; + + int b2 = index / texelsInBatchN; + index -= b2 * texelsInBatchN; + + int b = index / texelsInBatch; + index -= b * texelsInBatch; + + int r = 2 * (index / texelsInLogicalRow); + int c = imod(index, texelsInLogicalRow) * 2; + + return ivec4(b2, b, r, c); + } + `;let o=[Math.ceil(e[0]/2),Math.ceil(e[1]/2)],n=Math.ceil(r[r.length-1]/2),s=n*Math.ceil(r[r.length-2]/2),a=s,i="",p="b, r, c";for(let u=2;u=1?c="coords = 0;":c=i.map(b=>`coords.${l[b+u]} = 0;`).join(` +`);let m="";a<2&&s>0?m="coords":m=r.shapeInfo.logicalShape.map((b,C)=>`coords.${l[C+u]}`).join(", ");let f="return outputValue;",h=x.sizeFromShape(r.shapeInfo.logicalShape)===1,y=x.sizeFromShape(e.logicalShape)===1;if(s===1&&!h&&!y)f=` + return vec4(outputValue.xy, outputValue.xy); + `;else if(h&&!y)a===1?f=` + return vec4(outputValue.x, outputValue.x, 0., 0.); + `:f=` + return vec4(outputValue.x); + `;else if(i.length){let b=s-2,C=s-1;i.indexOf(b)>-1&&i.indexOf(C)>-1?f="return vec4(outputValue.x);":i.indexOf(b)>-1?f="return vec4(outputValue.x, outputValue.y, outputValue.x, outputValue.y);":i.indexOf(C)>-1&&(f="return vec4(outputValue.xx, outputValue.zz);")}return` + vec4 ${n}() { + ${p} coords = getOutputCoords(); + ${c} + vec4 outputValue = get${o}(${m}); + ${f} + } + `}function Z8(r,e){let t=r.name,o=t.charAt(0).toUpperCase()+t.slice(1),n="get"+o+"AtOutCoords",s=e.texShape,a=r.shapeInfo.texShape,i=r.shapeInfo.logicalShape.length,p=e.logicalShape.length;if(!r.shapeInfo.isUniform&&i===p&&r.shapeInfo.flatOffset==null&&x.arraysEqual(a,s))return` + float ${n}() { + return sampleTexture(${t}, resultUV); + } + `;let u=_e(p),c=QE(r.shapeInfo.logicalShape,e.logicalShape),l=p-i,m,f=["x","y","z","w","u","v"];i===0?m="":p<2&&c.length>=1?m="coords = 0;":m=c.map(h=>`coords.${f[h+l]} = 0;`).join(` +`);let d="";return p<2&&i>0?d="coords":d=r.shapeInfo.logicalShape.map((h,g)=>`coords.${f[g+l]}`).join(", "),` + float ${n}() { + ${u} coords = getOutputCoords(); + ${m} + return get${o}(${d}); + } + `}function _e(r){if(r<=1)return"int";if(r===2)return"ivec2";if(r===3)return"ivec3";if(r===4)return"ivec4";if(r===5)return"ivec5";if(r===6)return"ivec6";throw Error(`GPU for rank ${r} is not yet supported`)}function qd(r,e,t){let{newShape:o,keptDims:n}=x.squeezeShape(e),s=e.length,a=r&&s===3&&e[0]===1,i=a?e.slice(1):o,p=!r&&s>1&&!x.arraysEqual(e,t)&&o.lengthr[t]).join(", ")}function r$(r,e,t,o){let n=t.map((c,l)=>{let m={logicalShape:c.shape,texShape:c.isUniform?null:c.texData.texShape,isUniform:c.isUniform,isPacked:c.isUniform?!1:c.texData.isPacked,flatOffset:null};return c.texData!=null&&c.texData.slice!=null&&c.texData.slice.flatOffset>0&&(m.flatOffset=c.texData.slice.flatOffset),{name:e.variableNames[l],shapeInfo:m}}),s=n.map(c=>c.shapeInfo),a={logicalShape:o.shape,texShape:o.texData.texShape,isUniform:!1,isPacked:o.texData.isPacked,flatOffset:null},i=ZE(n,a,e),p=WI(r.gl,i),u=r.createProgram(p);return P().get("ENGINE_COMPILE_ONLY")?{program:e,fragmentShader:p,source:i,webGLProgram:u,inShapeInfos:s,outShapeInfo:a,uniformLocations:null,customUniformLocations:null,infLoc:null,nanLoc:null,inShapesLocations:null,inTexShapesLocations:null,outShapeLocation:null,outShapeStridesLocation:null,outTexShapeLocation:null}:Object.assign({program:e,fragmentShader:p,source:i,webGLProgram:u,inShapeInfos:s,outShapeInfo:a},aw(r,e,u))}function aw(r,e,t){let o={},n={},s={},a=[],i,p,u,c=null,l=null;l=r.getUniformLocation(t,"NAN",!1),P().getNumber("WEBGL_VERSION")===1&&(c=r.getUniformLocation(t,"INFINITY",!1));let m=!1;for(let f=0;f{a[d]=r.getUniformLocation(t,f.name,m)}),{uniformLocations:o,customUniformLocations:a,infLoc:c,nanLoc:l,inShapesLocations:n,inTexShapesLocations:s,outShapeLocation:i,outShapeStridesLocation:u,outTexShapeLocation:p}}function t$(r,e){if(r.length!==e.length)throw Error(`Binary was compiled with ${r.length} inputs, but was executed with ${e.length} inputs`);r.forEach((t,o)=>{let n=t.logicalShape,s=e[o],a=s.shape;if(!x.arraysEqual(n,a))throw Error(`Binary was compiled with different shapes than the current args. Shapes ${n} and ${a} must match`);if(t.isUniform&&s.isUniform)return;let i=t.texShape,p=s.isUniform?null:s.texData.texShape;if(!x.arraysEqual(i,p))throw Error(`Binary was compiled with different texture shapes than the current args. Shape ${i} and ${p} must match`)})}function o$(r,e,t,o,n){e.program.enableShapeUniforms||(t$(e.inShapeInfos,t),t$([e.outShapeInfo],[o]));let s=o.texData.texture,a=o.texData.texShape;o.texData.isPacked?r.setOutputPackedMatrixTexture(s.texture,a[0],a[1]):r.setOutputMatrixTexture(s.texture,a[0],a[1]),r.setProgram(e.webGLProgram),P().getNumber("WEBGL_VERSION")===1&&e.infLoc!==null&&r.gl.uniform1f(e.infLoc,1/0),e.nanLoc!==null&&r.gl.uniform1f(e.nanLoc,NaN),t.forEach((p,u)=>{let c=e.program.variableNames[u],l=e.uniformLocations[c],m=e.uniformLocations[`offset${c}`],f=e.inShapesLocations[`${c}Shape`],d=e.inTexShapesLocations[`${c}TexShape`];if(f){let{uniformShape:h}=qd(e.program.packedInputs,p.shape,p.texData.texShape);switch(h.length){case 1:r.gl.uniform1iv(f,new Int32Array(h));break;case 2:r.gl.uniform2iv(f,new Int32Array(h));break;case 3:r.gl.uniform3iv(f,new Int32Array(h));break;case 4:r.gl.uniform4iv(f,new Int32Array(h));break;default:break}}if(d&&r.gl.uniform2i(d,p.texData.texShape[0],p.texData.texShape[1]),l!=null){if(p.isUniform){if(x.sizeFromShape(p.shape)<2)r.gl.uniform1f(l,p.uniformValues[0]);else{let h=p.uniformValues;h instanceof Float32Array||(h=new Float32Array(h)),r.gl.uniform1fv(l,h)}return}p.texData.slice!=null&&m!=null&&r.gl.uniform1i(m,p.texData.slice.flatOffset),r.setInputMatrixTexture(p.texData.texture.texture,l,u)}});let i=e.outShapeLocation;if(i)switch(o.shape.length){case 1:r.gl.uniform1iv(i,new Int32Array(o.shape));break;case 2:r.gl.uniform2iv(i,new Int32Array(o.shape));break;case 3:r.gl.uniform3iv(i,new Int32Array(o.shape));break;case 4:r.gl.uniform4iv(i,new Int32Array(o.shape));break;default:break}if(e.outShapeStridesLocation){let p=x.computeStrides(o.shape);switch(o.shape.length){case 2:r.gl.uniform1iv(e.outShapeStridesLocation,new Int32Array(p));break;case 3:r.gl.uniform2iv(e.outShapeStridesLocation,new Int32Array(p));break;case 4:r.gl.uniform3iv(e.outShapeStridesLocation,new Int32Array(p));break;default:break}}e.outTexShapeLocation&&r.gl.uniform2i(e.outTexShapeLocation,o.texData.texShape[0],o.texData.texShape[1]),e.program.customUniforms&&n&&e.program.customUniforms.forEach((p,u)=>{let c=e.customUniformLocations[u],l=n[u];if(p.type==="float")r.gl.uniform1fv(c,l);else if(p.type==="vec2")r.gl.uniform2fv(c,l);else if(p.type==="vec3")r.gl.uniform3fv(c,l);else if(p.type==="vec4")r.gl.uniform4fv(c,l);else if(p.type==="int")r.gl.uniform1iv(c,l);else if(p.type==="ivec2")r.gl.uniform2iv(c,l);else if(p.type==="ivec3")r.gl.uniform3iv(c,l);else if(p.type==="ivec4")r.gl.uniform4iv(c,l);else throw Error(`uniform type ${p.type} is not supported yet.`)}),r.executeProgram()}function n$(r,e,t){let o="";e.concat(t).forEach(a=>{let i=a.texData!=null&&a.texData.slice!=null&&a.texData.slice.flatOffset>0;if(r.enableShapeUniforms&&!a.isUniform){let p=a.texData.texShape,{useSqueezeShape:u,uniformShape:c,keptDims:l}=qd(r.packedInputs,a.shape,p),m="",f="",d="";if(c.length===1&&r.packedInputs){let k=[Math.ceil(p[0]/2),Math.ceil(p[1]/2)];m=`${k[0]>1}_${k[1]>1}`}else if(c.length===2&&!r.packedInputs)f=`${c[0]>1}_${c[1]>1}`;else if(c.length>2&&!r.packedInputs){let k=x.computeStrides(c);d=`${k[0]===p[1]}_${k[k.length-1]===p[1]}`}let h=a.shape.length,g=c.length===2&&x.arraysEqual(a.shape,p),y=x.sizeFromShape(a.shape)===1,b=I.getBroadcastDims(a.shape,t.shape),C=!r.packedInputs&&h===t.shape.length&&x.arraysEqual(p,t.texData.texShape),w=r.packedInputs||c.length>2?"":`${p[0]>1}_${p[1]>1}`;o+=`${h}_${C}_${u?l:""}_${c.length}_${y}_${b}_${g}_${m}_${f}_${d}_${w}_${i}`}else{let p=a.isUniform?"uniform":a.texData.texShape;o+=`${a.shape}_${p}_${i}`}});let n=r.userCode,s=r.constructor.name;return s+="_"+o+"_"+n+`${P().getNumber("WEBGL_VERSION")}`,s}function lt(r){return P().getBool("WEBGL_USE_SHAPES_UNIFORMS")&&r<=4}var Kd=class{constructor(e){this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0,this.outPackingScheme=ki.DENSE,this.customUniforms=[{name:"texShape",type:"ivec2"}];let t=Ct();this.outputShape=e,this.enableShapeUniforms=lt(this.outputShape.length),this.userCode=` + ivec3 outCoordsFromFlatIndex(int index) { + ${this.enableShapeUniforms?Ru(["r","c","d"],e):is(["r","c","d"],e)} + return ivec3(r, c, d); + } + + void main() { + ivec2 resTexRC = ivec2(resultUV.yx * vec2(texShape[0], texShape[1])); + int index = 4 * (resTexRC.x * texShape[1] + resTexRC.y); + + vec4 result = vec4(0.); + + for (int i=0; i<4; i++) { + int flatIndex = index + i; + ivec3 rc = outCoordsFromFlatIndex(flatIndex); + result[i] = getA(rc.x, rc.y, rc.z); + } + + ${t.output} = result; + } + `}};var jd=class{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outPackingScheme=ki.DENSE,this.customUniforms=[{name:"texShape",type:"ivec2"}];let t=Ct();this.outputShape=e,this.enableShapeUniforms=lt(this.outputShape.length),this.userCode=` + ivec3 outCoordsFromFlatIndex(int index) { + ${this.enableShapeUniforms?Ru(["r","c","d"],e):is(["r","c","d"],e)} + return ivec3(r, c, d); + } + + void main() { + ivec2 resTexRC = ivec2(resultUV.yx * vec2(texShape[0], texShape[1])); + int index = 4 * (resTexRC.x * texShape[1] + resTexRC.y); + + vec4 result = vec4(0.); + + for (int i=0; i<4; i++) { + int flatIndex = index + i; + ivec3 rc = outCoordsFromFlatIndex(flatIndex); + result[i] = getChannel(getA(rc.x, rc.y, rc.z), vec2(rc.y, rc.z)); + } + + ${t.output} = result; + } + `}};var Xd=class{constructor(e){this.variableNames=["A"],this.outTexUsage=ir.DOWNLOAD;let t=Ct();this.outputShape=e,this.userCode=` + ${Hd} + + void main() { + float x = getAAtOutCoords(); + ${t.output} = encode_float(x); + } + `}};var Yd=class{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!1,this.outTexUsage=ir.DOWNLOAD;let t=Ct();this.outputShape=e,this.userCode=` + ${Hd} + + void main() { + ivec3 coords = getOutputCoords(); + float x = getChannel(getAAtOutCoords(), vec2(coords.y, coords.z)); + ${t.output} = encode_float(x); + } + `}};var tY={R:0,G:1,B:2,A:3},Al=class{constructor(e,t=!1,o="RGBA"){this.variableNames=["A"],this.customUniforms=[{name:"texShape",type:"ivec2"}];let n=Ct();this.outputShape=e,this.enableShapeUniforms=lt(this.outputShape.length);let s="result";t&&(s="floor(result * 255. + 0.5)");let a="";for(let i=0;ihw,createBufferFromOutputTexture:()=>yw,createFloat16MatrixTexture:()=>lw,createFloat16PackedMatrixTexture:()=>dw,createFloat32MatrixTexture:()=>cw,createIndexBuffer:()=>pw,createPackedMatrixTexture:()=>fw,createUnsignedBytesMatrixTexture:()=>mw,createVertexBuffer:()=>uw,createVertexShader:()=>iw,downloadByteEncodedFloatMatrixFromOutputTexture:()=>Cw,downloadFloat32MatrixFromBuffer:()=>bw,downloadMatrixFromPackedOutputTexture:()=>ww,downloadPackedMatrixFromBuffer:()=>Iw,getInternalFormatForFloat16MatrixTexture:()=>Jd,getInternalFormatForFloat16PackedMatrixTexture:()=>rh,getInternalFormatForFloat32MatrixTexture:()=>Zd,getInternalFormatForPackedMatrixTexture:()=>th,getInternalFormatForUnsignedBytesMatrixTexture:()=>eh,uploadDenseMatrixToTexture:()=>gw,uploadPixelDataToTexture:()=>xw});function iw(r){let e=Ct(),t=`${e.version} + precision highp float; + ${e.attribute} vec3 clipSpacePos; + ${e.attribute} vec2 uv; + ${e.varyingVs} vec2 resultUV; + + void main() { + gl_Position = vec4(clipSpacePos, 1); + resultUV = uv; + }`;return zI(r,t)}function uw(r){let e=new Float32Array([-1,1,0,0,1,-1,-1,0,0,0,1,1,0,1,1,1,-1,0,1,0]);return HI(r,e)}function pw(r){let e=new Uint16Array([0,1,2,2,1,3]);return qI(r,e)}function Fl(r,e,t,o,n,s){jI(e,t);let a=KI(r),i=r.TEXTURE_2D;return me(r,()=>r.bindTexture(i,a)),me(r,()=>r.texParameteri(i,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE)),me(r,()=>r.texParameteri(i,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE)),me(r,()=>r.texParameteri(i,r.TEXTURE_MIN_FILTER,r.NEAREST)),me(r,()=>r.texParameteri(i,r.TEXTURE_MAG_FILTER,r.NEAREST)),P().getNumber("WEBGL_VERSION")===1?me(r,()=>r.texImage2D(i,0,o,e,t,0,n,s,null)):me(r,()=>r.texStorage2D(i,1,o,e,t)),me(r,()=>r.bindTexture(r.TEXTURE_2D,null)),{texture:a,texShape:[t,e]}}function Zd(r){return r.internalFormatFloat}function cw(r,e,t,o){let[n,s]=$u(e,t);return Fl(r,n,s,Zd(o),o.textureFormatFloat,r.FLOAT)}function Jd(r){return r.internalFormatHalfFloat}function lw(r,e,t,o){let[n,s]=$u(e,t);return Fl(r,n,s,Jd(o),o.textureFormatFloat,o.textureTypeHalfFloat)}function eh(r){return r.downloadTextureFormat}function mw(r,e,t,o){let[n,s]=$u(e,t);return Fl(r,n,s,eh(o),r.RGBA,r.UNSIGNED_BYTE)}function th(r){return r.internalFormatPackedFloat}function fw(r,e,t,o){let[n,s]=Ks(e,t);return Fl(r,n,s,th(o),r.RGBA,r.FLOAT)}function rh(r){return r.internalFormatPackedHalfFloat}function dw(r,e,t,o){let[n,s]=Ks(e,t);return Fl(r,n,s,rh(o),r.RGBA,o.textureTypeHalfFloat)}function hw(r,e,t){return me(r,()=>r.bindBuffer(r.ARRAY_BUFFER,t)),Wd(r,e,"clipSpacePos",t,3,20,0)&&Wd(r,e,"uv",t,2,20,12)}function gw(r,e,t,o,n,s){me(r,()=>r.bindTexture(r.TEXTURE_2D,e));let a,i,p;n instanceof Uint8Array?(a=new Uint8Array(t*o*4),i=r.UNSIGNED_BYTE,p=r.RGBA):(a=new Float32Array(t*o*4),i=r.FLOAT,p=s.internalFormatPackedFloat),a.set(n),P().getNumber("WEBGL_VERSION")===2?me(r,()=>r.texSubImage2D(r.TEXTURE_2D,0,0,0,t,o,r.RGBA,i,a)):me(r,()=>r.texImage2D(r.TEXTURE_2D,0,p,t,o,0,r.RGBA,i,a)),me(r,()=>r.bindTexture(r.TEXTURE_2D,null))}function xw(r,e,t){me(r,()=>r.bindTexture(r.TEXTURE_2D,e)),t.data instanceof Uint8Array?P().getNumber("WEBGL_VERSION")===2?me(r,()=>r.texSubImage2D(r.TEXTURE_2D,0,0,0,t.width,t.height,r.RGBA,r.UNSIGNED_BYTE,t.data)):me(r,()=>r.texImage2D(r.TEXTURE_2D,0,r.RGBA,t.width,t.height,0,r.RGBA,r.UNSIGNED_BYTE,t.data)):P().getNumber("WEBGL_VERSION")===2?me(r,()=>r.texSubImage2D(r.TEXTURE_2D,0,0,0,r.RGBA,r.UNSIGNED_BYTE,t)):me(r,()=>r.texImage2D(r.TEXTURE_2D,0,r.RGBA,r.RGBA,r.UNSIGNED_BYTE,t)),me(r,()=>r.bindTexture(r.TEXTURE_2D,null))}function yw(r,e,t,o){let n=r.createBuffer();me(r,()=>r.bindBuffer(r.PIXEL_PACK_BUFFER,n));let i=4*4*e*t;return me(r,()=>r.bufferData(r.PIXEL_PACK_BUFFER,i,r.STREAM_READ)),me(r,()=>r.readPixels(0,0,t,e,r.RGBA,r.FLOAT,0)),me(r,()=>r.bindBuffer(r.PIXEL_PACK_BUFFER,null)),n}function bw(r,e,t){let o=r,n=new Float32Array(t);return o.bindBuffer(o.PIXEL_PACK_BUFFER,e),o.getBufferSubData(o.PIXEL_PACK_BUFFER,0,n),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),n}function Cw(r,e,t,o){let[n,s]=$u(e,t),a=4,i=new Uint8Array(GE(e*t,a));return me(r,()=>r.readPixels(0,0,n,s,o.downloadTextureFormat,r.UNSIGNED_BYTE,i)),new Float32Array(i.buffer)}function Iw(r,e,t,o,n,s,a,i){let p=r,u=new Float32Array(HE(s,a));return p.bindBuffer(p.PIXEL_PACK_BUFFER,e),p.getBufferSubData(p.PIXEL_PACK_BUFFER,0,u),p.bindBuffer(p.PIXEL_PACK_BUFFER,null),u}function ww(r,e,t){let o=new Float32Array(e*t*4);return me(r,()=>r.readPixels(0,0,t,e,r.RGBA,r.FLOAT,o)),o}var Fu=class{constructor(e){this.outputTexture=null,this.program=null,this.disposed=!1,this.vertexAttrsAreBound=!1,this.itemsToPoll=[];let t=P().getNumber("WEBGL_VERSION");e!=null?(this.gl=e,MI(t,e)):this.gl=Gr(t);let o="WEBGL_color_buffer_float",n="EXT_color_buffer_half_float";if(this.parallelCompilationExtension=this.gl.getExtension("KHR_parallel_shader_compile"),P().getNumber("WEBGL_VERSION")===1){let s="OES_texture_float",a="OES_texture_half_float";if(this.textureFloatExtension=nc(this.gl,s),Hr(this.gl,a))this.textureHalfFloatExtension=nc(this.gl,a);else if(P().get("WEBGL_FORCE_F16_TEXTURES"))throw new Error("GL context does not support half float textures, yet the environment flag WEBGL_FORCE_F16_TEXTURES is set to true.");if(this.colorBufferFloatExtension=this.gl.getExtension(o),Hr(this.gl,n))this.colorBufferHalfFloatExtension=nc(this.gl,n);else if(P().get("WEBGL_FORCE_F16_TEXTURES"))throw new Error("GL context does not support color renderable half floats, yet the environment flag WEBGL_FORCE_F16_TEXTURES is set to true.")}else if(o="EXT_color_buffer_float",Hr(this.gl,o))this.colorBufferFloatExtension=this.gl.getExtension(o);else if(Hr(this.gl,n))this.colorBufferHalfFloatExtension=this.gl.getExtension(n);else throw new Error("GL context does not support color renderable floats");this.vertexBuffer=uw(this.gl),this.indexBuffer=pw(this.gl),this.framebuffer=XI(this.gl),this.textureConfig=El(this.gl,this.textureHalfFloatExtension)}get debug(){return P().getBool("DEBUG")}dispose(){if(this.disposed)return;this.program!=null&&console.warn("Disposing a GPGPUContext that still has a bound WebGLProgram. This is probably a resource leak, delete the program with GPGPUContext.deleteProgram before disposing."),this.outputTexture!=null&&console.warn("Disposing a GPGPUContext that still has a bound output matrix texture. This is probably a resource leak, delete the output matrix texture with GPGPUContext.deleteMatrixTexture before disposing.");let e=this.gl;me(e,()=>e.finish()),me(e,()=>e.bindFramebuffer(e.FRAMEBUFFER,null)),me(e,()=>e.deleteFramebuffer(this.framebuffer)),me(e,()=>e.bindBuffer(e.ARRAY_BUFFER,null)),me(e,()=>e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,null)),me(e,()=>e.deleteBuffer(this.indexBuffer)),this.disposed=!0}createFloat32MatrixTexture(e,t){return this.throwIfDisposed(),cw(this.gl,e,t,this.textureConfig)}createFloat16MatrixTexture(e,t){return this.throwIfDisposed(),lw(this.gl,e,t,this.textureConfig)}createUnsignedBytesMatrixTexture(e,t){return this.throwIfDisposed(),mw(this.gl,e,t,this.textureConfig)}uploadPixelDataToTexture(e,t){this.throwIfDisposed(),xw(this.gl,e,t)}uploadDenseMatrixToTexture(e,t,o,n){this.throwIfDisposed(),gw(this.gl,e,t,o,n,this.textureConfig)}createFloat16PackedMatrixTexture(e,t){return this.throwIfDisposed(),dw(this.gl,e,t,this.textureConfig)}createPackedMatrixTexture(e,t){return this.throwIfDisposed(),fw(this.gl,e,t,this.textureConfig)}deleteMatrixTexture(e){this.throwIfDisposed(),this.outputTexture===e&&(Ud(this.gl,this.framebuffer),this.outputTexture=null),me(this.gl,()=>this.gl.deleteTexture(e))}downloadByteEncodedFloatMatrixFromOutputTexture(e,t,o){return this.downloadMatrixDriver(e,()=>Cw(this.gl,t,o,this.textureConfig))}downloadPackedMatrixFromBuffer(e,t,o,n,s,a){return Iw(this.gl,e,t,o,n,s,a,this.textureConfig)}downloadFloat32MatrixFromBuffer(e,t){return bw(this.gl,e,t)}createBufferFromTexture(e,t,o){this.bindTextureToFrameBuffer(e);let n=yw(this.gl,t,o,this.textureConfig);return this.unbindTextureToFrameBuffer(),n}createAndWaitForFence(){let e=this.createFence(this.gl);return this.pollFence(e)}createFence(e){let t,o;if(P().getBool("WEBGL_FENCE_API_ENABLED")){let n=e,s=n.fenceSync(n.SYNC_GPU_COMMANDS_COMPLETE,0);e.flush(),o=()=>{let a=n.clientWaitSync(s,0,0);return a===n.ALREADY_SIGNALED||a===n.CONDITION_SATISFIED},t=s}else P().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0?(t=this.beginQuery(),this.endQuery(),o=()=>this.isQueryAvailable(t,P().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION"))):o=()=>!0;return{query:t,isFencePassed:o}}downloadMatrixFromPackedTexture(e,t,o){return this.downloadMatrixDriver(e,()=>ww(this.gl,t,o))}createProgram(e){this.throwIfDisposed();let t=this.gl;this.vertexShader==null&&(this.vertexShader=iw(t));let o=UI(t);return me(t,()=>t.attachShader(o,this.vertexShader)),me(t,()=>t.attachShader(o,e)),GI(t,o),this.debug&&$l(t,o),this.vertexAttrsAreBound||(this.setProgram(o),this.vertexAttrsAreBound=hw(t,this.program,this.vertexBuffer)),o}deleteProgram(e){this.throwIfDisposed(),e===this.program&&(this.program=null),e!=null&&me(this.gl,()=>this.gl.deleteProgram(e))}setProgram(e){this.throwIfDisposed(),this.program=e,this.program!=null&&this.debug&&$l(this.gl,this.program),me(this.gl,()=>this.gl.useProgram(e))}getUniformLocation(e,t,o=!0){return this.throwIfDisposed(),o?YI(this.gl,e,t):QI(this.gl,e,t)}getAttributeLocation(e,t){return this.throwIfDisposed(),me(this.gl,()=>this.gl.getAttribLocation(e,t))}getUniformLocationNoThrow(e,t){return this.throwIfDisposed(),this.gl.getUniformLocation(e,t)}setInputMatrixTexture(e,t,o){this.throwIfDisposed(),this.throwIfNoProgram(),ZI(this.gl,e,t,o)}setOutputMatrixTexture(e,t,o){this.setOutputMatrixTextureDriver(e,o,t)}setOutputPackedMatrixTexture(e,t,o){this.throwIfDisposed();let[n,s]=Ks(t,o);this.setOutputMatrixTextureDriver(e,n,s)}setOutputMatrixWriteRegion(e,t,o,n){this.setOutputMatrixWriteRegionDriver(o,e,n,t)}setOutputPackedMatrixWriteRegion(e,t,o,n){throw new Error("setOutputPackedMatrixWriteRegion not implemented.")}debugValidate(){this.program!=null&&$l(this.gl,this.program),sc(this.gl)}executeProgram(){this.throwIfDisposed(),this.throwIfNoProgram();let e=this.gl;this.debug&&this.debugValidate(),me(e,()=>e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT,0))}blockUntilAllProgramsCompleted(){this.throwIfDisposed(),me(this.gl,()=>this.gl.finish())}getQueryTimerExtension(){return this.disjointQueryTimerExtension==null&&(this.disjointQueryTimerExtension=nc(this.gl,P().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")===2?"EXT_disjoint_timer_query_webgl2":"EXT_disjoint_timer_query")),this.disjointQueryTimerExtension}getQueryTimerExtensionWebGL2(){return this.getQueryTimerExtension()}getQueryTimerExtensionWebGL1(){return this.getQueryTimerExtension()}beginQuery(){if(P().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")===2){let o=this.gl,n=this.getQueryTimerExtensionWebGL2(),s=o.createQuery();return o.beginQuery(n.TIME_ELAPSED_EXT,s),s}let e=this.getQueryTimerExtensionWebGL1(),t=e.createQueryEXT();return e.beginQueryEXT(e.TIME_ELAPSED_EXT,t),t}endQuery(){if(P().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")===2){let t=this.gl,o=this.getQueryTimerExtensionWebGL2();t.endQuery(o.TIME_ELAPSED_EXT);return}let e=this.getQueryTimerExtensionWebGL1();e.endQueryEXT(e.TIME_ELAPSED_EXT)}async waitForQueryAndGetTime(e){return await x.repeatedTry(()=>this.disposed||this.isQueryAvailable(e,P().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION"))),this.getQueryTime(e,P().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION"))}getQueryTime(e,t){if(t===0)return null;if(t===2){let o=this.gl;return o.getQueryParameter(e,o.QUERY_RESULT)/1e6}else{let o=this.getQueryTimerExtensionWebGL1();return o.getQueryObjectEXT(e,o.QUERY_RESULT_EXT)/1e6}}isQueryAvailable(e,t){if(t===0)return!0;if(t===2){let o=this.gl,n=this.getQueryTimerExtensionWebGL2(),s=o.getQueryParameter(e,o.QUERY_RESULT_AVAILABLE);return this.disjoint==null&&(this.disjoint=this.gl.getParameter(n.GPU_DISJOINT_EXT)),s&&!this.disjoint}else{let o=this.getQueryTimerExtensionWebGL1(),n=o.getQueryObjectEXT(e,o.QUERY_RESULT_AVAILABLE_EXT);return this.disjoint==null&&(this.disjoint=this.gl.getParameter(o.GPU_DISJOINT_EXT)),n&&!this.disjoint}}pollFence(e){return new Promise(t=>{this.addItemToPoll(()=>e.isFencePassed(),()=>t())})}pollItems(){let e=rY(this.itemsToPoll.map(t=>t.isDoneFn));for(let t=0;t<=e;++t){let{resolveFn:o}=this.itemsToPoll[t];o()}this.itemsToPoll=this.itemsToPoll.slice(e+1)}addItemToPoll(e,t){if(this.itemsToPoll.push({isDoneFn:e,resolveFn:t}),this.itemsToPoll.length>1)return;let o;"setTimeoutCustom"in P().platform&&(o=P().platform.setTimeoutCustom.bind(P().platform)),x.repeatedTry(()=>(this.pollItems(),this.itemsToPoll.length===0),()=>0,null,o)}bindTextureToFrameBuffer(e){this.throwIfDisposed(),Rl(this.gl,e,this.framebuffer),this.debug&&sc(this.gl)}unbindTextureToFrameBuffer(){this.outputTexture!=null?(Rl(this.gl,this.outputTexture,this.framebuffer),this.debug&&sc(this.gl)):Ud(this.gl,this.framebuffer)}downloadMatrixDriver(e,t){this.bindTextureToFrameBuffer(e);let o=t();return this.unbindTextureToFrameBuffer(),o}setOutputMatrixTextureDriver(e,t,o){this.throwIfDisposed();let n=this.gl;Rl(n,e,this.framebuffer),this.debug&&sc(n),this.outputTexture=e,me(n,()=>n.viewport(0,0,t,o)),me(n,()=>n.scissor(0,0,t,o))}setOutputMatrixWriteRegionDriver(e,t,o,n){this.throwIfDisposed(),me(this.gl,()=>this.gl.scissor(e,t,o,n))}throwIfDisposed(){if(this.disposed)throw new Error("Attempted to use disposed GPGPUContext.")}throwIfNoProgram(){if(this.program==null)throw new Error("No GPU program is currently set.")}};function rY(r){let e=0;for(;e`${r}.${t}`)}function $t(r,e){return e===1?[r]:vw(r,e)}function j$(r,e){if(r===1)return"rc";let t="";for(let o=0;o ${this.enableShapeUniforms?"outShape":this.outputShape[0]}`;let t="";for(let o=this.rank-2;o= ${this.enableShapeUniforms?`outShape[${o}]`:this.outputShape[o]}`,o= ${o}; + bool rEdge = rp1 >= ${n}; + `}getOutput(e){let t=this.getSourceCoordsArr(e);return this.rank===1?`getA(rc), (rc + 1 >= ${this.enableShapeUniforms?"outShape":this.outputShape[0]} ? 0. : getA(rc + 1)), 0, 0`:`getA(${t[0]}), + cEdge ? 0. : getA(${t[1]}), + rEdge ? 0. : getA(${t[2]}), + rEdge || cEdge ? 0. : getA(${t[3]})`}};var hc=class{constructor(e,t){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"inputShape",type:"ivec3"}],this.outputShape=e,this.enableShapeUniforms=lt(this.outputShape.length);let o="";for(let n=0;n<4;n++){let s="thisRC = rc;";n%2===1&&(s+="thisRC.z += 1;"),n>1&&(s+="thisRC.y += 1;"),o+=` + ${s} + ${n>0?"if(thisRC.y < rows && thisRC.z < cols){":""} + int flatIndex = getFlatIndex(thisRC); + + ivec3 inputRC = inputCoordsFromReshapedOutCoords(flatIndex); + vec2 inputRCInnerDims = vec2(float(inputRC.y),float(inputRC.z)); + + result[${n}] = + getChannel(getA(inputRC.x, inputRC.y, inputRC.z), inputRCInnerDims); + ${n>0?"}":""} + `}this.userCode=` + ${oY(t,this.enableShapeUniforms)} + ${this.enableShapeUniforms?pc():uc(e)} + + void main() { + ivec3 rc = getOutputCoords(); + + vec4 result = vec4(0.); + + ivec3 thisRC; + int rows = ${this.enableShapeUniforms?"outShape[1]":e[1]}; + int cols = ${this.enableShapeUniforms?"outShape[2]":e[2]}; + + ${o} + + setOutput(result); + } + `}};function oY(r,e){return` + ivec3 inputCoordsFromReshapedOutCoords(int index) { + ${e?YE(["r","c","d"],"inputShape"):is(["r","c","d"],r)} + return ivec3(r, c, d); + } + `}var ih=class{constructor(e){this.gpgpu=e,this.numUsedTextures=0,this.numFreeTextures=0,this._numBytesAllocated=0,this._numBytesFree=0,this.freeTextures={},this.logEnabled=!1,this.usedTextures={}}acquireTexture(e,t,o){let n=Y$(t,o),s=Q$(e,n,o);s in this.freeTextures||(this.freeTextures[s]=[]),s in this.usedTextures||(this.usedTextures[s]=[]);let a=X$(e,n,this.gpgpu.gl,this.gpgpu.textureConfig,o);if(this.freeTextures[s].length>0){this.numFreeTextures--,this.numUsedTextures++,this._numBytesFree-=a,this.log();let p=this.freeTextures[s].shift();return this.usedTextures[s].push(p),p}let i;return n===Jt.PACKED_2X2_FLOAT32?i=this.gpgpu.createPackedMatrixTexture(e[0],e[1]):n===Jt.PACKED_2X2_FLOAT16?i=this.gpgpu.createFloat16PackedMatrixTexture(e[0],e[1]):n===Jt.UNPACKED_FLOAT32?i=this.gpgpu.createFloat32MatrixTexture(e[0],e[1]):n===Jt.UNPACKED_FLOAT16?i=this.gpgpu.createFloat16MatrixTexture(e[0],e[1]):n===Jt.PACKED_4X1_UNSIGNED_BYTE&&(i=this.gpgpu.createUnsignedBytesMatrixTexture(e[0],e[1])),this.usedTextures[s].push(i),this.numUsedTextures++,this._numBytesAllocated+=a,this.log(),i}releaseTexture(e,t,o,n){if(this.freeTextures==null)return;let s=Y$(o,n),a=Q$(t,s,n);a in this.freeTextures||(this.freeTextures[a]=[]);let i=X$(t,s,this.gpgpu.gl,this.gpgpu.textureConfig,n),p=P().get("WEBGL_DELETE_TEXTURE_THRESHOLD");p!==-1&&this._numBytesAllocated>p?(this.gpgpu.deleteMatrixTexture(e.texture),this._numBytesAllocated-=i):(this.freeTextures[a].push(e),this.numFreeTextures++,this._numBytesFree+=i),this.numUsedTextures--;let u=this.usedTextures[a],c=u.indexOf(e);if(c<0)throw new Error("Cannot release a texture that was never provided by this texture manager");u.splice(c,1),this.log()}log(){if(!this.logEnabled)return;let e=this.numFreeTextures+this.numUsedTextures;console.log("Free/Used",`${this.numFreeTextures} / ${this.numUsedTextures}`,`(${e})`);let t=this._numBytesFree/this._numBytesAllocated;console.log(`Bytes allocated: ${this._numBytesAllocated}`),console.log(`Bytes unused: ${this._numBytesFree} (${Math.round(100*t)}%)`)}get numBytesAllocated(){return this._numBytesAllocated}get numBytesFree(){return this._numBytesFree}getNumUsedTextures(){return this.numUsedTextures}getNumFreeTextures(){return this.numFreeTextures}dispose(){if(this.freeTextures!=null){for(let e in this.freeTextures)this.freeTextures[e].forEach(t=>{this.gpgpu.deleteMatrixTexture(t.texture)});for(let e in this.usedTextures)this.usedTextures[e].forEach(t=>{this.gpgpu.deleteMatrixTexture(t.texture)});this.freeTextures=null,this.usedTextures=null,this.numUsedTextures=0,this.numFreeTextures=0,this._numBytesAllocated=0,this._numBytesFree=0}}};function nY(r,e){let t=r;if(e===t.R32F)return 4;if(e===t.R16F)return 2;if(e===t.RGBA32F)return 16;if(e===r.RGBA)return 16;if(e===t.RGBA16F)return 8;if(e===t.RGBA8)return 4;throw new Error(`Unknown internal format ${e}`)}function X$(r,e,t,o,n){let s=sY(e,o),a;if(n){let[p,u]=Ks(r[0],r[1]);a=p*u}else{let[p,u]=$u(r[0],r[1]);a=p*u}let i=nY(t,s);return a*i}function sY(r,e){switch(r){case Jt.PACKED_2X2_FLOAT32:return th(e);case Jt.PACKED_2X2_FLOAT16:return rh(e);case Jt.UNPACKED_FLOAT32:return Zd(e);case Jt.UNPACKED_FLOAT16:return Jd(e);case Jt.PACKED_4X1_UNSIGNED_BYTE:return eh(e);default:throw new Error(`Unknown physical texture type ${r}`)}}function aY(r){return P().getBool("WEBGL_RENDER_FLOAT32_ENABLED")?r?Jt.PACKED_2X2_FLOAT32:Jt.UNPACKED_FLOAT32:r?Jt.PACKED_2X2_FLOAT16:Jt.UNPACKED_FLOAT16}function Y$(r,e){if(r===ir.UPLOAD)return Jt.PACKED_2X2_FLOAT32;if(r===ir.RENDER||r==null)return aY(e);if(r===ir.DOWNLOAD||r===ir.PIXELS)return Jt.PACKED_4X1_UNSIGNED_BYTE;throw new Error(`Unknown logical texture type ${r}`)}function Q$(r,e,t){return`${r[0]}_${r[1]}_${e}_${t}`}var fr=class{constructor(e,t){this.variableNames=["A"],this.outputShape=e,this.enableShapeUniforms=lt(this.outputShape.length),this.userCode=` + float unaryOperation(float x) { + ${t} + } + + void main() { + float x = getAAtOutCoords(); + float y = unaryOperation(x); + + setOutput(y); + } + `}},Vt="if (isnan(x)) return x;",Z$="return x;",kw="return abs(x);";var J$="return (x >= 0.0) ? x : (exp(x) - 1.0);",eR=Vt+` + return (x < 0.0) ? 0.0 : x; +`,tR=Vt+` + return (x < 0.0) ? 0.0 : min(6.0, x); +`,Pu="return x;",rR="return 1.0 / (1.0 + exp(-1.0 * x));";var nR="return x;",sR=` + vec4 result; + + result.r = (x.r >= 0.0) ? x.r : (exp(x.r) - 1.0); + result.g = (x.g >= 0.0) ? x.g : (exp(x.g) - 1.0); + result.b = (x.b >= 0.0) ? x.b : (exp(x.b) - 1.0); + result.a = (x.a >= 0.0) ? x.a : (exp(x.a) - 1.0); + + return result; +`,aR=` + vec4 result = x * vec4(greaterThanEqual(x, vec4(0.0))); + bvec4 isNaN = isnan(x); + + result.r = isNaN.r ? x.r : result.r; + result.g = isNaN.g ? x.g : result.g; + result.b = isNaN.b ? x.b : result.b; + result.a = isNaN.a ? x.a : result.a; + + return result; +`,iR=` + vec4 result = min(x, vec4(6.)) * vec4(greaterThanEqual(x, vec4(0.0))); + bvec4 isNaN = isnan(x); + + result.r = isNaN.r ? x.r : result.r; + result.g = isNaN.g ? x.g : result.g; + result.b = isNaN.b ? x.b : result.b; + result.a = isNaN.a ? x.a : result.a; + + return result; +`,uR="return 1.0 / (1.0 + exp(-1.0 * x));",No=class{constructor(e,t){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e,this.enableShapeUniforms=lt(this.outputShape.length),this.userCode=` + vec4 unaryOperation(vec4 x) { + ${t} + } + + void main() { + vec4 x = getAAtOutCoords(); + vec4 y = unaryOperation(x); + + setOutput(y); + } + `}};var uh=class{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!1,this.outputShape=e,this.enableShapeUniforms=lt(this.outputShape.length);let t=e.length,o=$t("rc",t),n=_e(t),s=j$(t,o),a=o.slice(-2),i=t<=1?"rc":`vec2(${a.join(",")})`;this.userCode=` + void main() { + ${n} rc = getOutputCoords(); + vec4 packedInput = getA(${s}); + + setOutput(getChannel(packedInput, ${i})); + } + `}};var uY=Bt.whereImpl,pY=1e-7,cY=1e-4,ph={};function lY(r){return r in ph||(ph[r]={}),ph[r]}var mY=P().getNumber("CPU_HANDOFF_SIZE_THRESHOLD"),fY=600;function dY(){return P().global.screen==null?1024:P().global.screen.height*P().global.screen.width*window.devicePixelRatio*fY/1024/1024}var Ni=class extends Jr{constructor(e){if(super(),this.pendingRead=new WeakMap,this.pendingDisposal=new WeakSet,this.dataRefCount=new WeakMap,this.numBytesInGPU=0,this.uploadWaitMs=0,this.downloadWaitMs=0,this.lastGlFlushTime=0,this.warnedAboutMemory=!1,this.pendingDeletes=0,this.disposed=!1,!P().getBool("HAS_WEBGL"))throw new Error("WebGL is not supported on this device");let t;if(e!=null){if(e instanceof Fu)t=e;else{let o=Gr(P().getNumber("WEBGL_VERSION"),e);t=new Fu(o)}this.binaryCache={},this.gpgpuCreatedLocally=!1}else{let o=Gr(P().getNumber("WEBGL_VERSION"));t=new Fu(o),this.binaryCache=lY(P().getNumber("WEBGL_VERSION")),this.gpgpuCreatedLocally=!0}this.gpgpu=t,this.canvas=this.gpgpu.gl.canvas,this.textureManager=new ih(this.gpgpu),this.numMBBeforeWarning=dY(),this.texData=new rn(this,cr())}nextDataId(){return Ni.nextDataId++}numDataIds(){return this.texData.numDataIds()-this.pendingDeletes}writeTexture(e,t,o,n,s,a){let i=this.makeTensorInfo(t,o),p=this.texData.get(i.dataId);p.isPacked=!1,p.texture={texture:e,texShape:[n,s]},p.texShape=[n,s];let u=ac(t),c=new Al(u,!1,a),l=this.runWebGLProgram(c,[i],o,[[n,s]]);return l.shape=t,p.texture=null,this.disposeIntermediateTensorInfo(i),l.dataId}write(e,t,o){if((P().getBool("WEBGL_CHECK_NUMERICAL_PROBLEMS")||P().getBool("DEBUG"))&&this.checkNumericalProblems(e),o==="complex64"&&e!=null)throw new Error("Cannot write to a complex64 dtype. Please use tf.complex(real, imag).");let n={id:this.nextDataId()};return this.texData.set(n,{shape:t,dtype:o,values:e,usage:ir.UPLOAD,refCount:1}),n}refCount(e){return this.texData.has(e)?this.texData.get(e).refCount:0}incRef(e){let t=this.texData.get(e);t.refCount++}decRef(e){if(this.texData.has(e)){let t=this.texData.get(e);t.refCount--}}move(e,t,o,n,s){if(P().getBool("DEBUG")&&this.checkNumericalProblems(t),n==="complex64")throw new Error("Cannot write to a complex64 dtype. Please use tf.complex(real, imag).");this.texData.set(e,{shape:o,dtype:n,values:t,usage:ir.UPLOAD,refCount:s})}disposeIntermediateTensorInfo(e){this.disposeData(e.dataId)}readSync(e){let t=this.texData.get(e),{values:o,dtype:n,complexTensorInfos:s,slice:a,shape:i,isPacked:p}=t;if(a!=null){let m;p?m=new No(i,Pu):m=new fr(i,Pu);let f=this.runWebGLProgram(m,[{dataId:e,shape:i,dtype:n}],n),d=this.readSync(f.dataId);return this.disposeIntermediateTensorInfo(f),d}if(o!=null)return this.convertAndCacheOnCPU(e);if(n==="string")return o;let u=this.activeTimers!=null,c;u&&(c=x.now());let l;if(n==="complex64"){let m=this.readSync(s.real.dataId),f=this.readSync(s.imag.dataId);l=I.mergeRealAndImagArrays(m,f)}else l=this.getValuesFromTexture(e);return u&&(this.downloadWaitMs+=x.now()-c),this.convertAndCacheOnCPU(e,l)}async read(e){if(this.pendingRead.has(e)){let d=this.pendingRead.get(e);return new Promise(h=>d.push(h))}let t=this.texData.get(e),{values:o,shape:n,slice:s,dtype:a,complexTensorInfos:i,isPacked:p}=t;if(s!=null){let d;p?d=new No(n,Pu):d=new fr(n,Pu);let h=this.runWebGLProgram(d,[{dataId:e,shape:n,dtype:a}],a),g=this.read(h.dataId);return this.disposeIntermediateTensorInfo(h),g}if(o!=null)return this.convertAndCacheOnCPU(e);if(P().getBool("DEBUG")&&!P().getBool("WEBGL_DOWNLOAD_FLOAT_ENABLED")&&P().getNumber("WEBGL_VERSION")===2)throw new Error("tensor.data() with WEBGL_DOWNLOAD_FLOAT_ENABLED=false and WEBGL_VERSION=2 not yet supported.");let u=null,c;if(a!=="complex64"&&P().get("WEBGL_BUFFER_SUPPORTED")){c=this.decode(e);let d=this.texData.get(c.dataId);u=this.gpgpu.createBufferFromTexture(d.texture.texture,..._l(n))}this.pendingRead.set(e,[]),a!=="complex64"&&await this.gpgpu.createAndWaitForFence();let l;if(a==="complex64"){let d=await Promise.all([this.read(i.real.dataId),this.read(i.imag.dataId)]),h=d[0],g=d[1];l=I.mergeRealAndImagArrays(h,g)}else if(u==null)l=this.getValuesFromTexture(e);else{let d=x.sizeFromShape(n);l=this.gpgpu.downloadFloat32MatrixFromBuffer(u,d)}if(c!=null&&this.disposeIntermediateTensorInfo(c),u!=null){let d=this.gpgpu.gl;me(d,()=>d.deleteBuffer(u))}let m=this.convertAndCacheOnCPU(e,l),f=this.pendingRead.get(e);return this.pendingRead.delete(e),f.forEach(d=>d(m)),this.pendingDisposal.has(e)&&(this.pendingDisposal.delete(e),this.disposeData(e)&&cr().removeDataId(e,this),this.pendingDeletes--),m}readToGPU(e,t={}){let o=this.texData.get(e),{values:n,shape:s,slice:a,dtype:i,isPacked:p,texture:u}=o;if(i==="complex64")throw new Error("Does not support reading texture for complex64 dtype.");if(a!=null){let f;p?f=new No(s,Pu):f=new fr(s,Pu);let d=this.runWebGLProgram(f,[{dataId:e,shape:s,dtype:i}],i),h=this.readToGPU(d,t);return this.disposeIntermediateTensorInfo(d),h}if(u==null)throw n!=null?new Error("Data is not on GPU but on CPU."):new Error("There is no data on GPU or CPU.");let c=this.decode(e,t.customTexShape),l=cr().makeTensorFromTensorInfo(c),m=this.texData.get(c.dataId);return Object.assign({tensorRef:l},m.texture)}bufferSync(e){let t=this.readSync(e.dataId);if(e.dtype==="string")try{let o=t.map(n=>x.decodeString(n));return ne(e.shape,e.dtype,o)}catch(o){throw new Error("Failed to decode encoded string bytes into utf-8")}return ne(e.shape,e.dtype,t)}checkNumericalProblems(e){if(e!=null)for(let t=0;t0}time(e){let t=this.activeTimers,o=[],n=!1;this.programTimersStack==null?(this.programTimersStack=o,n=!0):this.activeTimers.push(o),this.activeTimers=o,e();let s=x.flatten(this.activeTimers.map(p=>p.query)).filter(p=>p!=null),a=x.flatten(this.activeTimers.map(p=>p.name)).filter(p=>p!=null);this.activeTimers=t,n&&(this.programTimersStack=null);let i={uploadWaitMs:this.uploadWaitMs,downloadWaitMs:this.downloadWaitMs,kernelMs:null,wallMs:null};return(async()=>{if(P().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0){let p=await Promise.all(s);i.kernelMs=x.sum(p),i.getExtraProfileInfo=()=>p.map((u,c)=>({name:a[c],ms:u})).map(u=>`${u.name}: ${u.ms}`).join(", ")}else i.kernelMs={error:"WebGL query timers are not supported in this environment."};return this.uploadWaitMs=0,this.downloadWaitMs=0,i})()}memory(){return{unreliable:!1,numBytesInGPU:this.numBytesInGPU,numBytesInGPUAllocated:this.textureManager.numBytesAllocated,numBytesInGPUFree:this.textureManager.numBytesFree}}startTimer(){return P().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0?this.gpgpu.beginQuery():{startMs:x.now(),endMs:null}}endTimer(e){return P().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0?(this.gpgpu.endQuery(),e):(e.endMs=x.now(),e)}async getQueryTime(e){if(P().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0)return this.gpgpu.waitForQueryAndGetTime(e);let t=e;return t.endMs-t.startMs}disposeData(e,t=!1){if(this.pendingDisposal.has(e))return!1;if(!this.texData.has(e))return!0;if(t?this.texData.get(e).refCount=0:this.texData.get(e).refCount--,!t&&this.texData.get(e).refCount>0)return!1;if(this.pendingRead.has(e))return this.pendingDisposal.add(e),this.pendingDeletes++,!1;this.releaseGPUData(e);let{complexTensorInfos:o}=this.texData.get(e);return o!=null&&(this.disposeData(o.real.dataId,t),this.disposeData(o.imag.dataId,t)),this.texData.delete(e),!0}releaseGPUData(e){let{texture:t,dtype:o,texShape:n,usage:s,isPacked:a,slice:i}=this.texData.get(e),p=i&&i.origDataId||e,u=this.dataRefCount.get(p);u>1?this.dataRefCount.set(p,u-1):(this.dataRefCount.delete(p),t!=null&&(this.numBytesInGPU-=this.computeBytes(n,o),this.textureManager.releaseTexture(t,n,s,a)));let c=this.texData.get(e);c.texture=null,c.texShape=null,c.isPacked=!1,c.slice=null}getTexture(e){return this.uploadToGPU(e),this.texData.get(e).texture.texture}getDataInfo(e){return this.texData.get(e)}shouldExecuteOnCPU(e,t=mY){return P().getBool("WEBGL_CPU_FORWARD")&&e.every(o=>this.texData.get(o.dataId).texture==null&&x.sizeFromShape(o.shape)0&&x.isString(o[0])){let s=o.map(a=>x.encodeString(a));n=this.write(s,e,t)}else n=this.write(o,e,t);return this.texData.get(n).usage=null,{dataId:n,shape:e,dtype:t}}makeOutput(e,t,o){return cr().makeTensorFromTensorInfo(this.makeTensorInfo(e,t,o),this)}unpackTensor(e){let t=new uh(e.shape);return this.runWebGLProgram(t,[e],e.dtype)}packTensor(e){let t=new ah(e.shape),o=!0;return this.runWebGLProgram(t,[e],e.dtype,null,o)}packedReshape(e,t){let o=[Pa(e.shape),...Oa(e.shape)],n={dtype:e.dtype,shape:o,dataId:e.dataId},s=[Pa(t),...Oa(t)],a=new hc(s,o),i=!0,p=[o],u=this.runWebGLProgram(a,[n],e.dtype,p,i);return{dataId:u.dataId,shape:t,dtype:u.dtype}}decode(e,t){let o=this.texData.get(e),{isPacked:n,shape:s,dtype:a}=o;if(t!=null){let m=x.sizeFromShape(s),f=t[0]*t[1]*4;x.assert(m<=f,()=>"customTexShape is too small. Row * Column * 4 should be equal or larger than the size of the tensor data.")}let i=ac(s),p;n?p=new jd(i):p=new Kd(i);let u=!0,c=[t!=null?t:_l(i)],l=this.runWebGLProgram(p,[{shape:i,dtype:a,dataId:e}],a,c,u,t);return{dtype:a,shape:s,dataId:l.dataId}}runWebGLProgram(e,t,o,n,s=!1,a){let i=this.makeTensorInfo(e.outputShape,o),p=this.texData.get(i.dataId);if(e.packedOutput&&(p.isPacked=!0),e.outPackingScheme===ki.DENSE){let y=a!=null?a:_l(e.outputShape);p.texShape=y.map(b=>b*2)}if(e.outTexUsage!=null&&(p.usage=e.outTexUsage),x.sizeFromShape(i.shape)===0)return p.values=x.getTypedArrayFromDType(i.dtype,0),i;let u=[],c=t.map(y=>{if(y.dtype==="complex64")throw new Error("GPGPUProgram does not support complex64 input. For complex64 dtypes, please separate the program into real and imaginary parts.");let b=this.texData.get(y.dataId);if(b.texture==null){if(!e.packedInputs&&x.sizeFromShape(y.shape)<=P().getNumber("WEBGL_SIZE_UPLOAD_UNIFORM"))return{shape:y.shape,texData:null,isUniform:!0,uniformValues:b.values};e.packedInputs&&(b.isPacked=!0,b.shape=y.shape)}if(this.uploadToGPU(y.dataId),!!b.isPacked!=!!e.packedInputs)y=b.isPacked?this.unpackTensor(y):this.packTensor(y),u.push(y),b=this.texData.get(y.dataId);else if(b.isPacked&&!Ti(b.shape,y.shape)){let C=y,w=y.shape;y.shape=b.shape,y=this.packedReshape(y,w),u.push(y),b=this.texData.get(y.dataId),C.shape=w}return{shape:y.shape,texData:b,isUniform:!1}});this.uploadToGPU(i.dataId);let l={shape:i.shape,texData:p,isUniform:!1},m=n$(e,c,l),f=this.getAndSaveBinary(m,()=>r$(this.gpgpu,e,c,l)),d=this.activeTimers!=null,h;d&&(h=this.startTimer()),P().get("ENGINE_COMPILE_ONLY")||o$(this.gpgpu,f,c,l,n),u.forEach(y=>this.disposeIntermediateTensorInfo(y)),d&&(h=this.endTimer(h),this.activeTimers.push({name:e.constructor.name,query:this.getQueryTime(h)}));let g=P().get("WEBGL_FLUSH_THRESHOLD");if(g>0){let y=x.now();y-this.lastGlFlushTime>g&&(this.gpgpu.gl.flush(),this.lastGlFlushTime=y)}if(!P().getBool("WEBGL_LAZILY_UNPACK")&&p.isPacked&&s===!1){let y=this.unpackTensor(i);return this.disposeIntermediateTensorInfo(i),y}return i}compileAndRun(e,t,o,n,s=!1){return o=o||t[0].dtype,this.runWebGLProgram(e,t,o,n,s)}getAndSaveBinary(e,t){return e in this.binaryCache||(this.binaryCache[e]=t()),this.binaryCache[e]}getTextureManager(){return this.textureManager}dispose(){this.disposed||(P().getBool("IS_TEST")||Object.keys(this.binaryCache).forEach(t=>{this.gpgpu.deleteProgram(this.binaryCache[t].webGLProgram),delete this.binaryCache[t]}),this.textureManager.dispose(),this.canvas!=null&&typeof HTMLCanvasElement!="undefined"&&this.canvas instanceof HTMLCanvasElement?this.canvas.remove():this.canvas=null,this.gpgpuCreatedLocally&&(this.gpgpu.program=null,this.gpgpu.dispose()),this.disposed=!0)}floatPrecision(){return this.floatPrecisionValue==null&&(this.floatPrecisionValue=Ne(()=>{if(!P().get("WEBGL_RENDER_FLOAT32_ENABLED")){let e=P().getBool("DEBUG");P().set("DEBUG",!1);let t=this.abs(be(1e-8)).dataSync()[0];if(P().set("DEBUG",e),t>0)return 32}return 16})),this.floatPrecisionValue}epsilon(){return this.floatPrecision()===32?pY:cY}uploadToGPU(e){let t=this.texData.get(e),{shape:o,dtype:n,values:s,texture:a,usage:i,isPacked:p}=t;if(a!=null)return;let u=this.activeTimers!=null,c;u&&(c=x.now());let l=t.texShape;if(l==null&&(l=JI(o,p),t.texShape=l),s!=null){let m=ac(o),f,d=l[1],h=l[0],g=s instanceof Uint8Array||s instanceof Uint8ClampedArray;(p||!g)&&([d,h]=Ks(l[0],l[1])),p?f=new Qd(m,g):f=new Al(m,g);let y=g?[h,d]:l,b=this.makeTensorInfo(y,n),C=this.texData.get(b.dataId);g?C.usage=ir.PIXELS:C.usage=ir.UPLOAD,C.texShape=y,this.gpgpu.uploadDenseMatrixToTexture(this.getTexture(b.dataId),d,h,s);let w=[[h,d]],k=!0,_=this.runWebGLProgram(f,[b],n,w,k),E=this.texData.get(_.dataId);t.texShape=E.texShape,t.isPacked=E.isPacked,t.usage=E.usage,P().get("ENGINE_COMPILE_ONLY")?this.disposeData(_.dataId):(t.texture=E.texture,t.values=null,this.texData.delete(_.dataId)),this.disposeIntermediateTensorInfo(b),u&&(this.uploadWaitMs+=x.now()-c)}else{let m=this.acquireTexture(l,i,n,p);t.texture=m}}convertAndCacheOnCPU(e,t){let o=this.texData.get(e),{dtype:n}=o;return this.releaseGPUData(e),t!=null&&(o.values=hY(t,n)),o.values}acquireTexture(e,t,o,n){if(this.numBytesInGPU+=this.computeBytes(e,o),!this.warnedAboutMemory&&this.numBytesInGPU>this.numMBBeforeWarning*1024*1024){let s=(this.numBytesInGPU/1024/1024).toFixed(2);this.warnedAboutMemory=!0,console.warn(`High memory usage in GPU: ${s} MB, most likely due to a memory leak`)}return this.textureManager.acquireTexture(e,t,n)}computeBytes(e,t){return e[0]*e[1]*x.bytesPerElement(t)}checkCompileCompletion(){for(let[,e]of Object.entries(this.binaryCache))this.checkCompletion_(e)}async checkCompileCompletionAsync(){let e=[];if(this.gpgpu.parallelCompilationExtension){for(let[,t]of Object.entries(this.binaryCache))e.push(this.checkCompletionAsync_(t));return Promise.all(e)}else{for(let[,t]of Object.entries(this.binaryCache)){let o=new Promise(n=>{try{this.checkCompletion_(t),n(!0)}catch(s){throw s}});e.push(o)}return Promise.all(e)}}async checkCompletionAsync_(e){return this.gpgpu.gl.getProgramParameter(e.webGLProgram,this.gpgpu.parallelCompilationExtension.COMPLETION_STATUS_KHR)?this.checkCompletion_(e):(await kC(),this.checkCompletionAsync_(e))}checkCompletion_(e){if(this.gpgpu.gl.getProgramParameter(e.webGLProgram,this.gpgpu.gl.LINK_STATUS)===!1)throw console.log(this.gpgpu.gl.getProgramInfoLog(e.webGLProgram)),this.gpgpu.gl.getShaderParameter(e.fragmentShader,this.gpgpu.gl.COMPILE_STATUS)===!1?(zd(e.source,this.gpgpu.gl.getShaderInfoLog(e.fragmentShader)),new Error("Failed to compile fragment shader.")):new Error("Failed to link vertex and fragment shaders.");return!0}getUniformLocations(){for(let[,e]of Object.entries(this.binaryCache)){let{uniformLocations:t,customUniformLocations:o,infLoc:n,nanLoc:s,inShapesLocations:a,inTexShapesLocations:i,outShapeLocation:p,outShapeStridesLocation:u,outTexShapeLocation:c}=aw(this.gpgpu,e.program,e.webGLProgram);e.uniformLocations=t,e.customUniformLocations=o,e.infLoc=n,e.nanLoc=s,e.inShapesLocations=a,e.inTexShapesLocations=i,e.outShapeLocation=p,e.outShapeStridesLocation=u,e.outTexShapeLocation=c}}createTensorFromTexture(e,t,o){let{texture:n,height:s,width:a,channels:i}=e,p=cr().backend;if(!p.gpgpu.gl.isTexture(n))throw new Error("The texture is invalid. Also, please make sure the texture and the TFJS WebGL backend are using the same canvas. If you want to use your own custom canvas, you have to create and use the custom TFJS WebGL backend created from the canvas through 'new tf.MathBackendWebGL(customCanvas)'.");let u=p.writeTexture(n,t,o,s,a,i);return cr().makeTensorFromDataId(u,t,o,p)}};Ni.nextDataId=0;function hY(r,e){if(e==="float32"||e==="complex64")return r;if(e==="int32"||e==="bool"){let t=e==="int32"?new Int32Array(r.length):new Uint8Array(r.length);for(let o=0;onew Ni,2);var R9e={forceHalfFloat:pR};var gc=` + if (isnan(a)) return a; + if (isnan(b)) return b; +`;var _o=class{constructor(e,t,o){this.variableNames=["A","B"],this.outputShape=I.assertAndGetBroadcastShape(t,o),this.enableShapeUniforms=lt(this.outputShape.length),this.userCode=` + float binaryOperation(float a, float b) { + ${e} + } + + void main() { + float a = getAAtOutCoords(); + float b = getBAtOutCoords(); + setOutput(binaryOperation(a, b)); + } + `}};var js=` + result.r = isNaN.r ? NAN : result.r; + result.g = isNaN.g ? NAN : result.g; + result.b = isNaN.b ? NAN : result.b; + result.a = isNaN.a ? NAN : result.a; +`;var Ko=class{constructor(e,t,o,n=!1){this.variableNames=["A","B"],this.supportsBroadcasting=!0,this.packedInputs=!0,this.packedOutput=!0,this.outputShape=I.assertAndGetBroadcastShape(t,o);let s=this.outputShape.length;this.enableShapeUniforms=lt(s);let a="";if(n)if(s===0||x.sizeFromShape(this.outputShape)===1)a=` + result.y = 0.; + result.z = 0.; + result.w = 0.; + `;else if(a=` + ${_e(s)} coords = getOutputCoords(); + `,s===1)this.enableShapeUniforms?a+=` + result.y = (coords + 1) >= outShape ? 0. : result.y; + result.z = 0.; + result.w = 0.; + `:a+=` + result.y = (coords + 1) >= ${this.outputShape[0]} ? 0. : result.y; + result.z = 0.; + result.w = 0.; + `;else{let p=$t("coords",s);this.enableShapeUniforms?a+=` + bool nextRowOutOfBounds = + (${p[s-2]} + 1) >= outShape[${s} - 2]; + bool nextColOutOfBounds = + (${p[s-1]} + 1) >= outShape[${s} - 1]; + result.y = nextColOutOfBounds ? 0. : result.y; + result.z = nextRowOutOfBounds ? 0. : result.z; + result.w = nextColOutOfBounds || nextRowOutOfBounds ? 0. : result.w; + `:a+=` + bool nextRowOutOfBounds = + (${p[s-2]} + 1) >= ${this.outputShape[s-2]}; + bool nextColOutOfBounds = + (${p[s-1]} + 1) >= ${this.outputShape[s-1]}; + result.y = nextColOutOfBounds ? 0. : result.y; + result.z = nextRowOutOfBounds ? 0. : result.z; + result.w = nextColOutOfBounds || nextRowOutOfBounds ? 0. : result.w; + `}this.userCode=` + vec4 binaryOperation(vec4 a, vec4 b) { + ${e} + } + + void main() { + vec4 a = getAAtOutCoords(); + vec4 b = getBAtOutCoords(); + + vec4 result = binaryOperation(a, b); + ${a} + + setOutput(result); + } + `}};function Rt(r){let{inputs:e,backend:t}=r,{x:o}=e;return t.incRef(o.dataId),{dataId:o.dataId,shape:o.shape,dtype:o.dtype}}var cR={kernelName:uo,backendName:"webgl",kernelFunc:Rt};function Ar(r){let{inputs:e,backend:t}=r,{real:o,imag:n}=e,s=t.makeTensorInfo(o.shape,"complex64"),a=t.texData.get(s.dataId),i=Rt({inputs:{x:o},backend:t}),p=Rt({inputs:{x:n},backend:t});return a.complexTensorInfos={real:i,imag:p},s}var lR={kernelName:aa,backendName:"webgl",kernelFunc:Ar};var Tw="return (a < 0.) ? b * a : a;",Nw=` + vec4 aLessThanZero = vec4(lessThan(a, vec4(0.))); + return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a); +`;function xY(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{alpha:s}=o,a=t.makeTensorInfo([],"float32",x.createScalarValue(s,"float32")),i=P().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new Ko(Nw,n.shape,a.shape):new _o(Tw,n.shape,a.shape),p=t.runWebGLProgram(i,[n,a],"float32");return t.disposeIntermediateTensorInfo(a),p}var mR={kernelName:Nn,backendName:"webgl",kernelFunc:xY};var _w="return (a < 0.) ? b * a : a;",Ew=` + vec4 aLessThanZero = vec4(lessThan(a, vec4(0.))); + return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a); +`;function yY(r){let{inputs:e,backend:t}=r,{x:o,alpha:n}=e,s=P().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new Ko(Ew,o.shape,n.shape):new _o(_w,o.shape,n.shape);return t.runWebGLProgram(s,[o,n],"float32")}var fR={kernelName:Vn,backendName:"webgl",kernelFunc:yY};var jo="if (isnan(x)) return x;";function he({opSnippet:r,packedOpSnippet:e,cpuKernelImpl:t,dtype:o}){return({inputs:n,backend:s})=>{let{x:a}=n,i=s,p=o||a.dtype;if(i.shouldExecuteOnCPU([a])&&t!=null){let l=i.texData.get(a.dataId),m=t(l.values,p);return i.makeTensorInfo(a.shape,p,m)}let u=P().getBool("WEBGL_PACK_UNARY_OPERATIONS")&&e!=null,c;return u?c=new No(a.shape,e):c=new fr(a.shape,r),i.runWebGLProgram(c,[a],p)}}function ot({opSnippet:r,packedOpSnippet:e,checkOutOfBounds:t=!1,supportsComplex:o=!1,cpuKernelImpl:n,dtype:s}){return({inputs:a,backend:i})=>{let{a:p,b:u}=a,c=i;if(o&&p.dtype==="complex64"){let d=c.texData.get(p.dataId),h=c.texData.get(u.dataId),[g,y]=[[d.complexTensorInfos.real,h.complexTensorInfos.real],[d.complexTensorInfos.imag,h.complexTensorInfos.imag]].map(C=>{let[w,k]=C,_={dataId:w.dataId,dtype:w.dtype,shape:p.shape},E={dataId:k.dataId,dtype:k.dtype,shape:u.shape},R=new _o(r,p.shape,u.shape);return c.runWebGLProgram(R,[_,E],ct(w.dtype,k.dtype))}),b=Ar({inputs:{real:g,imag:y},backend:c});return c.disposeIntermediateTensorInfo(g),c.disposeIntermediateTensorInfo(y),b}let l=s||ct(p.dtype,u.dtype);if((p.dtype==="string"||u.dtype==="string"||c.shouldExecuteOnCPU([p,u]))&&n!=null){let d=c.texData.get(p.dataId).values,h=c.texData.get(u.dataId).values,g=p.dtype==="string"?I.fromUint8ToStringArray(d):d,y=p.dtype==="string"?I.fromUint8ToStringArray(h):h,[b,C]=n(p.shape,u.shape,g,y,l),w=c.makeTensorInfo(C,l),k=c.texData.get(w.dataId);return k.values=b,w}let m=P().getBool("WEBGL_PACK_BINARY_OPERATIONS")&&e!=null,f;return m?f=new Ko(e,p.shape,u.shape,t):f=new _o(r,p.shape,u.shape),c.runWebGLProgram(f,[p,u],l)}}function Ma(r,e=!1){if(r==="linear")return e?nR:Z$;if(r==="relu")return e?aR:eR;if(r==="elu")return e?sR:J$;if(r==="relu6")return e?iR:tR;if(r==="prelu")return e?Ew:_w;if(r==="leakyrelu")return e?Nw:Tw;if(r==="sigmoid")return e?uR:rR;throw new Error(`Activation ${r} has not been implemented for the WebGL backend.`)}var xc=class{constructor(e,t,o,n=!1,s=!1,a=!1,i=null,p=!1,u=!1){this.variableNames=["matrixA","matrixB"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=o,this.enableShapeUniforms=lt(this.outputShape.length);let c=n?e[1]:e[2],l=Math.ceil(c/2),m=n?"i * 2, rc.y":"rc.y, i * 2",f=s?"rc.z, i * 2":"i * 2, rc.z",d=n?["a.xxyy","a.zzww"]:["a.xxzz","a.yyww"],h=s?["b.xzxz","b.ywyw"]:["b.xyxy","b.zwzw"],g="",y="";i&&(p?g=`vec4 activation(vec4 a) { + vec4 b = getPreluActivationWeightsAtOutCoords(); + ${i} + }`:u?g=`vec4 activation(vec4 a) { + vec4 b = getLeakyreluAlphaAtOutCoords(); + ${i} + }`:g=`vec4 activation(vec4 x) { + ${i} + }`,y="result = activation(result);");let b=a?"result += getBiasAtOutCoords();":"";a&&this.variableNames.push("bias"),p&&this.variableNames.push("preluActivationWeights"),u&&this.variableNames.push("leakyreluAlpha");let C="rc.x",w="rc.x";e[0]`The new shape (${p}) has ${u} elements and the old shape (${n.shape}) has ${i} elements. The new shape and old shape must have the same number of elements.`);let c=a.texData.get(n.dataId);return c.isPacked&&!Ti(n.shape,p)&&!(c.texture!==null&&Ti(c.shape,p))?gR(n,p,a):(a.incRef(n.dataId),{dataId:n.dataId,shape:p,dtype:n.dtype})}var xR={kernelName:Ss,backendName:"webgl",kernelFunc:J};var Ol=class{constructor(e,t){this.variableNames=["x"];let{windowSize:o,batchSize:n,inSize:s,outSize:a}=e;this.outputShape=[n,a];let i=Math.floor(o/4)*4,p=o%4,u="sumValue += dot(values, ones);";if(t!=null){let l=1/t;u=`sumValue += dot(values * ${x.isInt(l)?l.toPrecision(2):l}, ones);`}let c="";s%o>0&&(c=` + if (inIdx < 0 || inIdx >= ${s}) { + return 0.0; + } + `),this.userCode=` + const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0); + + float getValue(int batch, int inIdx) { + ${c} + return getX(batch, inIdx); + } + + void main() { + ivec2 coords = getOutputCoords(); + int batch = coords[0]; + int outIdx = coords[1]; + int inOffset = outIdx * ${o}; + + float sumValue = 0.0; + + for (int i = 0; i < ${i}; i += 4) { + int inIdx = inOffset + i; + vec4 values = vec4( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + getValue(batch, inIdx + 2), + getValue(batch, inIdx + 3) + ); + + ${u} + } + + int inIdx = inOffset + ${i}; + if (${p===1}) { + vec4 values = vec4(getValue(batch, inIdx), 0.0, 0.0, 0.0); + + ${u} + } else if (${p===2}) { + vec4 values = vec4( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), 0.0, 0.0); + + ${u} + } else if (${p===3}) { + vec4 values = vec4( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + getValue(batch, inIdx + 2), 0.0); + + ${u} + } + setOutput(sumValue); + } + `}};var ch=class{constructor(e,t){this.variableNames=["x"];let{windowSize:o,batchSize:n,inSize:s,outSize:a}=e;this.outputShape=[n,a];let i="0.0",p="";t==="prod"?i="1.0":t==="min"?(i="1.0 / 1e-20",p="min"):t==="max"&&(i="-1.0 / 1e-20",p="max");let u=`${t}(${t}(${t}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`;t==="sum"?u="sumValue":t==="prod"?u="prodValue":t==="all"?u="allValue":t==="any"&&(u="anyValue");let c=Math.floor(o/4)*4,l=o%4,m=` + if (${t==="sum"}) { + sumValue += dot(values, ones); + } else if (${t==="prod"}) { + vec2 tmp = vec2(values[0], values[1]) * vec2(values[2], values[3]); + prodValue *= tmp[0] * tmp[1]; + } else { + minMaxValue = ${p}(values, minMaxValue); + if (${t==="min"} || ${t==="max"}) { + minMaxValue = ${p}(values, minMaxValue); + bvec4 isNaN = isnan(values); + if (isNaN.r || isNaN.g || isNaN.b || isNaN.a) { + minMaxValue = vec4(NAN); + } + } + } + `,f="vec4";t==="all"?(i="1.0",m=` + bool reducedAllValue = all(values); + float floatedReducedAllValue = float(reducedAllValue); + allValue = float(allValue >= 1.0 && floatedReducedAllValue >= 1.0); + `,f="bvec4"):t==="any"&&(i="0.0",m=` + bool reducedAnyValue = any(values); + float floatedReducedAnyValue = float(reducedAnyValue); + anyValue = float(anyValue >= 1.0 || floatedReducedAnyValue >= 1.0); + `,f="bvec4");let d="";s%o>0&&(d=` + if (inIdx < 0 || inIdx >= ${s}) { + return initializationValue; + } + `),this.userCode=` + const float initializationValue = ${i}; + const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0); + + float getValue(int batch, int inIdx) { + ${d} + return getX(batch, inIdx); + } + + void main() { + ivec2 coords = getOutputCoords(); + int batch = coords[0]; + int outIdx = coords[1]; + int inOffset = outIdx * ${o}; + + vec4 minMaxValue = vec4(${i}); + float prodValue = 1.0; + float sumValue = 0.0; + float allValue = 1.0; + float anyValue = 0.0; + + for (int i = 0; i < ${c}; i += 4) { + int inIdx = inOffset + i; + ${f} values = ${f}( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + getValue(batch, inIdx + 2), + getValue(batch, inIdx + 3) + ); + + ${m} + } + + int inIdx = inOffset + ${c}; + if (${l===1}) { + ${f} values = ${f}( + getValue(batch, inIdx), + initializationValue, + initializationValue, + initializationValue + ); + + ${m} + } else if (${l===2}) { + ${f} values = ${f}( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + initializationValue, + initializationValue + ); + + ${m} + } else if (${l===3}) { + ${f} values = ${f}( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + getValue(batch, inIdx + 2), + initializationValue + ); + + ${m} + } + setOutput(${u}); + } + `}};function CY(r){let e=[];for(;e.length===0||e[e.length-1].outSize!==1;){let t=e.length?e[e.length-1].outSize:r[1],o=I.computeOptimalWindowSize(t);e.push({inSize:t,windowSize:o,outSize:Math.ceil(t/o)})}return e}function qr(r,e,t,o){let n=CY(r.shape),s=r;for(let a=0;a6)throw Error(`Transpose for rank ${e} is not yet supported`);let t=["resRC.x","resRC.y","resRC.z","resRC.w","resRC.u","resRC.v"],o=new Array(e);for(let n=0;n6)throw Error(`Packed transpose for rank ${this.rank} is not yet supported.`);let n=_e(this.rank),s=vw("rc",this.rank),a=new Array(this.rank);for(let c=0;c`Error in matMul: inner shapes (${l}) and (${m}) of Tensors with shapes ${r.shape} and ${e.shape} and transposeA=${t} and transposeB=${o} must match.`);let k=t?[y,l,f]:[y,f,l],_=o?[b,d,m]:[b,m,d],E=J({inputs:{x:r},backend:n,attrs:{shape:k}}),R=J({inputs:{x:e},backend:n,attrs:{shape:_}}),A=[E,R],D=Math.max(y,b),O=t?E.shape[1]:E.shape[2],M=s!=null,L=a!=null,W=p==="leakyrelu",V=p!=null?Ma(p,!0):null,G=M||L||W||V!=null,q;if((f===1||d===1)&&O>Rw&&G===!1){let j=E,Y=R;t&&(j=xt({inputs:{x:E},backend:n,attrs:{perm:[0,2,1]}}),A.push(j)),o&&(Y=xt({inputs:{x:R},backend:n,attrs:{perm:[0,2,1]}}),A.push(Y));let Z=d!==1,ee=d===1,X=j;Z&&(X=J({inputs:{x:j},backend:n,attrs:{shape:[D,O,1]}}),A.push(X));let Q=d===1?2:1,se=Y;ee&&(se=J({inputs:{x:Y},backend:n,attrs:{shape:[D,1,O]}}),A.push(se));let ie=Pl({inputs:{a:X,b:se},backend:n});q=Ou({inputs:{x:ie},backend:n,attrs:{axis:Q,keepDims:!0}}),A.push(ie)}else{let j=ct(r.dtype,e.dtype),Y=new xc(k,_,[D,f,d],t,o,M,V,L,W),Z=[E,R];if(s!=null&&Z.push(s),L&&Z.push(a),W){let ee=n.makeTensorInfo([],"float32",x.createScalarValue(i,"float32"));Z.push(ee),A.push(ee)}q=n.runWebGLProgram(Y,Z,j)}let H=J({inputs:{x:q},backend:n,attrs:{shape:w}});A.push(q);for(let j of A)n.disposeIntermediateTensorInfo(j);return H}function wY(r){let{inputs:e,backend:t,attrs:o}=r,{a:n,b:s,bias:a,preluActivationWeights:i}=e,{transposeA:p,transposeB:u,activation:c,leakyreluAlpha:l}=o;return Mu({a:n,b:s,transposeA:p,transposeB:u,backend:t,bias:a,preluActivationWeights:i,leakyreluAlpha:l,activation:c})}var IR={kernelName:Fo,backendName:"webgl",kernelFunc:wY};var wR="return abs(x);";function SY(r){let{inputs:e,backend:t}=r,{x:o}=e;if(t.shouldExecuteOnCPU([o])&&o.dtype!=="complex64"){let s=t.texData.get(o.dataId),a=nh(s.values);return t.makeTensorInfo(o.shape,o.dtype,a)}let n;return P().getBool("WEBGL_PACK_UNARY_OPERATIONS")?n=new No(o.shape,wR):n=new fr(o.shape,wR),t.runWebGLProgram(n,[o],o.dtype)}var SR={kernelName:sn,backendName:"webgl",kernelFunc:SY};var vY=Vt+` + if (abs(x) > 1.) { + return NAN; + } + return acos(x); +`,kY=he({opSnippet:vY}),vR={kernelName:Li,backendName:"webgl",kernelFunc:kY};var TY=Vt+` + if (x < 1.0) return NAN; +return log(x + sqrt(x * x - 1.0));`,NY=he({opSnippet:TY}),kR={kernelName:Bi,backendName:"webgl",kernelFunc:NY};var TR="return a + b;",_Y=ot({opSnippet:TR,packedOpSnippet:TR,supportsComplex:!0,cpuKernelImpl:s$}),NR={kernelName:_r,backendName:"webgl",kernelFunc:_Y};var fh=class{constructor(e,t){this.outputShape=[],this.outputShape=e,this.variableNames=t.map((s,a)=>`T${a}`);let o=[];this.variableNames.forEach(s=>{o.push(`float v${s} = get${s}AtOutCoords();`)});let n=this.variableNames.map(s=>`v${s}`).join(" + ");this.userCode=` + void main() { + ${o.join(` + `)} + + float result = ${n}; + setOutput(result); + } + `}};var dh=class{constructor(e,t){this.outputShape=[],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e,this.variableNames=t.map((s,a)=>`T${a}`);let o=[];this.variableNames.forEach(s=>{o.push(`vec4 v${s} = get${s}AtOutCoords();`)});let n=this.variableNames.map(s=>`v${s}`).join(" + ");this.userCode=` + void main() { + ${o.join(` + `)} + + vec4 result = ${n}; + setOutput(result); + } + `}};function hh(r){let{inputs:e,backend:t}=r,o=e;if(o.length===1)return Rt({inputs:{x:o[0]},backend:t});if(o.length>P().get("WEBGL_MAX_TEXTURES_IN_SHADER")){let p=Math.floor(o.length/2),u=hh({inputs:o.slice(0,p),backend:t}),c=hh({inputs:o.slice(p),backend:t});return hh({inputs:[u,c],backend:t})}let n=o.map(p=>p.dtype).reduce((p,u)=>ct(p,u)),s=o.map(p=>p.shape),i=P().getBool("WEBGL_PACK")?new dh(o[0].shape,s):new fh(o[0].shape,s);return t.runWebGLProgram(i,o,n)}var _R={kernelName:an,backendName:"webgl",kernelFunc:hh};function EY(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s,keepDims:a}=o,i=n.shape.length,p=x.parseAxisParam(s,n.shape),u=p,c=I.getAxesPermutation(u,i),l=n;c!=null&&(l=xt({inputs:{x:n},backend:t,attrs:{perm:c}}),u=I.getInnerMostAxes(u.length,i)),I.assertAxesAreInnerMostDims("all",u,i);let[m,f]=I.computeOutAndReduceShapes(l.shape,u),d=x.sizeFromShape(f),h=J({inputs:{x:l},backend:t,attrs:{shape:[-1,d]}}),g=qr(h,h.dtype,"all",t),y;if(a){let b=I.expandShapeToKeepDim(m,p);y=J({inputs:{x:g},backend:t,attrs:{shape:b}})}else y=J({inputs:{x:g},backend:t,attrs:{shape:m}});return t.disposeIntermediateTensorInfo(h),t.disposeIntermediateTensorInfo(g),c!=null&&t.disposeIntermediateTensorInfo(l),y}var ER={kernelName:oa,backendName:"webgl",kernelFunc:EY};function $Y(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s,keepDims:a}=o,i=n.shape.length,p=x.parseAxisParam(s,n.shape),u=p,c=I.getAxesPermutation(u,i),l=n;c!=null&&(l=xt({inputs:{x:n},backend:t,attrs:{perm:c}}),u=I.getInnerMostAxes(u.length,i)),I.assertAxesAreInnerMostDims("any",u,i);let[m,f]=I.computeOutAndReduceShapes(l.shape,u),d=x.sizeFromShape(f),h=J({inputs:{x:l},backend:t,attrs:{shape:[-1,d]}}),g=qr(h,h.dtype,"any",t),y;if(a){let b=I.expandShapeToKeepDim(m,p);y=J({inputs:{x:g},backend:t,attrs:{shape:b}})}else y=J({inputs:{x:g},backend:t,attrs:{shape:m}});return t.disposeIntermediateTensorInfo(h),t.disposeIntermediateTensorInfo(g),c!=null&&t.disposeIntermediateTensorInfo(l),y}var $R={kernelName:na,backendName:"webgl",kernelFunc:$Y};var gh=class{constructor(e,t,o){this.variableNames=["A"];let{windowSize:n,batchSize:s,outSize:a}=e;o||this.variableNames.push("bestIndicesA"),this.outputShape=[s,a];let i=t==="max"?">":"<",p=o?"inOffset + i;":"round(getBestIndicesA(batch, inOffset + i));";this.userCode=` + void main() { + ivec2 coords = getOutputCoords(); + int batch = coords[0]; + int outIdx = coords[1]; + int inOffset = outIdx * ${n}; + + int bestIndex = inOffset; + float bestValue = getA(batch, bestIndex); + + for (int i = 0; i < ${n}; i++) { + int inIdx = ${p}; + float candidate = getA(batch, inIdx); + if (candidate ${i} bestValue) { + bestValue = candidate; + bestIndex = inIdx; + } + } + setOutput(float(bestIndex)); + } + `}};var xh=class{constructor(e,t,o,n){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,x.assert(e.length>2,()=>`Packed arg${o.charAt(0).toUpperCase()+o.slice(1)} supports only inputs with rank above 2.`);let s=e[e.length-1],a=Math.ceil(s/t);this.outputShape=e.slice(0,-1),a>1&&this.outputShape.push(a),n||this.variableNames.push("bestIndicesA");let i=this.outputShape,p=i.length,u=_e(p),c=$t("coords",p),l,m;if(a===1){m=p+1;let R=_e(m);l=` + ${R} sourceLocR = ${R}(${c.join()}, 0); + ++${c[p-1]}; + ${R} sourceLocG = ${R}(${c.join()}, 0); + ++${c[p-2]}; + ${R} sourceLocA = ${R}(${c.join()}, 0); + --${c[p-1]}; + ${R} sourceLocB = ${R}(${c.join()}, 0); + --${c[p-2]};`}else m=p,l=` + ${u} sourceLocR = coords; + ++${c[p-1]}; + ${u} sourceLocG = coords; + ++${c[p-2]}; + ${u} sourceLocA = coords; + --${c[p-1]}; + ${u} sourceLocB = coords; + --${c[p-2]};`;let f=["x","y","z","w","u","v"].slice(0,m),d="."+f[m-1],h=f.map(R=>"int "+R),g=$t("sourceLocR",m-1).concat("inIdx.r"),y=$t("sourceLocG",m-1).concat("inIdx.g"),b=$t("sourceLocB",m-1).concat("inIdx.b"),C=$t("sourceLocA",m-1).concat("inIdx.a"),w=o==="max"?"greaterThan":"lessThan",k=n?"":` + inIdx = round(vec4(getBestIndicesAChannel(${g.join()}), + getBestIndicesAChannel(${y.join()}), + getBestIndicesAChannel(${b.join()}), + getBestIndicesAChannel(${C.join()})));`,_=`vec4( + getAChannel(${g.join()}), + hasNextCol ? getAChannel(${y.join()}) : 0., + hasNextRow ? getAChannel(${b.join()}) : 0., + hasNextRow && hasNextCol ? getAChannel(${C.join()}) : 0.)`,E=n?"":` + float getBestIndicesAChannel(${h.join()}) { + return getChannel(getBestIndicesA(${f.join()}), + vec2(${f.slice(-2).join()})); + }`;this.userCode=` + float getAChannel(${h.join()}) { + return getChannel(getA(${f.join()}), + vec2(${f.slice(-2).join()})); + } + ${E} + void main() { + ${u} coords = getOutputCoords(); + bool hasNextCol = ${c[p-1]} < ${i[p-1]-1}; + bool hasNextRow = ${c[p-2]} < ${i[p-2]-1}; + ${l} + ivec4 srcIdx = ivec4(sourceLocR${d}, sourceLocG${d}, + sourceLocB${d}, sourceLocA${d}) * ${t}; + ivec4 inIdx = srcIdx; + vec4 bestIndex = vec4(inIdx); + vec4 bestValue = ${_}; + + for (int i = 0; i < ${t}; i++) { + inIdx = srcIdx; + ${k} + vec4 candidate = ${_}; + bvec4 nan = isnan(candidate); + bvec4 replace = bvec4( + vec4(${w}(candidate, bestValue)) * (vec4(1.0) - vec4(nan))); + + bestValue = vec4(replace.x ? candidate.x : bestValue.x, + replace.y ? candidate.y : bestValue.y, + replace.z ? candidate.z : bestValue.z, + replace.w ? candidate.w : bestValue.w); + bestIndex = mix(bestIndex, vec4(inIdx), vec4(replace)); + srcIdx++; + } + setOutput(bestIndex); + } + `}};function RR(r,e,t,o=null){let n=e.shape[0],s=e.shape[1];o!=null&&(n=o.shape[0],s=o.shape[1]);let a=I.computeOptimalWindowSize(s),i={windowSize:a,inSize:s,batchSize:n,outSize:Math.ceil(s/a)},p=new gh(i,t,o==null),u=[e];o!=null&&u.push(o);let c=r.runWebGLProgram(p,u,"int32");if(c.shape[1]===1)return c;let l=RR(r,e,t,c);return r.disposeIntermediateTensorInfo(c),l}function AR(r,e,t,o=null){let n=o!=null?o.shape:e.shape,s=n[n.length-1],a=I.computeOptimalWindowSize(s),i=new xh(n,a,t,o==null),p=o==null?[e]:[e,o],u=r.runWebGLProgram(i,p,"int32");if(u.shape.length===e.shape.length){let c=AR(r,e,t,u);return r.disposeIntermediateTensorInfo(u),c}return u}function yh(r,e,t,o){let n=[t];if(I.assertAxesAreInnerMostDims("arg"+o.charAt(0).toUpperCase()+o.slice(1),n,e.shape.length),!P().getBool("WEBGL_PACK_REDUCE")||e.shape.length<=2){let s=[],a=r.texData.get(e.dataId),i=a!==null&&a.isPacked,p=e;i&&(p=r.unpackTensor(e),s.push(p));let[u,c]=I.computeOutAndReduceShapes(p.shape,n),l=x.sizeFromShape(c),m=J({inputs:{x:p},backend:r,attrs:{shape:[-1,l]}});s.push(m);let f=RR(r,m,o);s.push(f);let d=J({inputs:{x:f},backend:r,attrs:{shape:u}});return s.forEach(h=>r.disposeIntermediateTensorInfo(h)),d}return AR(r,e,o)}function RY(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s}=o,a=x.parseAxisParam(s,n.shape),i=I.getAxesPermutation(a,n.shape.length),p=n,u=[];i!=null&&(p=xt({inputs:{x:n},backend:t,attrs:{perm:i}}),u.push(p),a=I.getInnerMostAxes(a.length,p.shape.length)),I.assertAxesAreInnerMostDims("argMax",[a[0]],p.shape.length);let c=yh(t,p,a[0],"max");return u.forEach(l=>t.disposeIntermediateTensorInfo(l)),c}var FR={kernelName:un,backendName:"webgl",kernelFunc:RY};function AY(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s}=o,a=x.parseAxisParam(s,n.shape),i=I.getAxesPermutation(a,n.shape.length),p=n,u=[];i!=null&&(p=xt({inputs:{x:n},backend:t,attrs:{perm:i}}),u.push(p),a=I.getInnerMostAxes(a.length,p.shape.length)),I.assertAxesAreInnerMostDims("argMin",[a[0]],p.shape.length);let c=yh(t,p,a[0],"min");return u.forEach(l=>t.disposeIntermediateTensorInfo(l)),c}var DR={kernelName:ja,backendName:"webgl",kernelFunc:AY};var FY=Vt+` + if (abs(x) > 1.) { + return NAN; + } + return asin(x); +`,DY=he({opSnippet:FY}),PR={kernelName:Vi,backendName:"webgl",kernelFunc:DY};var PY=Vt+"return log(x + sqrt(x * x + 1.0));",OY=he({opSnippet:PY}),OR={kernelName:zi,backendName:"webgl",kernelFunc:OY};var MY=Vt+` + return atan(x); +`,LY=he({opSnippet:MY}),MR={kernelName:Wi,backendName:"webgl",kernelFunc:LY};var BY=gc+` + return atan(a, b); +`,VY=` + vec4 result = atan(a, b); + bvec4 isNaNA = isnan(a); + bvec4 isNaNB = isnan(b); + bvec4 isNaN = bvec4(isNaNA.x || isNaNB.x, isNaNA.y || isNaNB.y, isNaNA.z || isNaNB.z, isNaNA.w || isNaNB.w); + `+js+` + return result; +`,zY=ot({opSnippet:BY,packedOpSnippet:VY}),LR={kernelName:sa,backendName:"webgl",kernelFunc:zY};var WY=Vt+` + if ((x < -1.0) || (x > 1.0)) return NAN; +return (log(1.0 + x) - log(1.0 - x)) / 2.0;`,UY=he({opSnippet:WY}),BR={kernelName:Ui,backendName:"webgl",kernelFunc:UY};var us=class{constructor(e,t,o,n=!1,s=!1){if(this.variableNames=["x"],t==="avg"&&o)throw new Error("Cannot compute positions for average pool.");let a=e.filterWidth,i=e.strideHeight,p=e.strideWidth,u=e.dilationHeight,c=e.dilationWidth,l=e.effectiveFilterHeight,m=e.effectiveFilterWidth,f=e.padInfo.top,d=e.padInfo.left;this.outputShape=e.outShape;let h=t==="avg",g=`((batch * ${e.inHeight} + xR) * ${e.inWidth} + xC) * ${e.inChannels} + d`,y=`(xR * ${e.inWidth} + xC) * ${e.inChannels} + d`,b="0.0";if(h||(b="-1.0 / 1e-20"),o){let R=">=";this.userCode=` + const ivec2 strides = ivec2(${i}, ${p}); + const ivec2 pads = ivec2(${f}, ${d}); + + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords[0]; + int d = coords[3]; + + ivec2 xRCCorner = coords.yz * strides - pads; + int xRCorner = xRCCorner.x; + int xCCorner = xRCCorner.y; + + // max/min x(?, ?, d) to get y(yR, yC, d). + // ? = to be determined + float minMaxValue = 0.0; + float minMaxValueFound = 0.0; + int minMaxPosition = 0; + float avgValue = 0.0; + + for (int wR = 0; wR < ${l}; + wR += ${u}) { + int xR = xRCorner + wR; + + if (xR < 0 || xR >= ${e.inHeight}) { + continue; + } + + for (int wC = 0; wC < ${m}; + wC += ${c}) { + int xC = xCCorner + wC; + + if (xC < 0 || xC >= ${e.inWidth}) { + continue; + } + + float value = getX(batch, xR, xC, d); + + // If a min / max value has already been found, use it. If not, + // use the current value. + float currMinMaxValue = mix( + value, minMaxValue, minMaxValueFound); + if (value ${R} currMinMaxValue) { + minMaxValue = value; + minMaxValueFound = 1.0; + minMaxPosition = ${n?s?g:y:`wR * ${m} + wC`}; + } + } + } + setOutput(float(minMaxPosition)); + } + `;return}let C="max",w=`${t}(${t}(${t}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`;t==="avg"&&(w="avgValue / count");let k=Math.floor(a/4)*4,_=a%4,E=` + if (${h}) { + avgValue += dot(values, ones); + } else { + minMaxValue = ${C}(values, minMaxValue); + } + `;this.userCode=` + const ivec2 strides = ivec2(${i}, ${p}); + const ivec2 pads = ivec2(${f}, ${d}); + const float initializationValue = ${b}; + const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0); + + float count = 0.0; + + float getValue(int batch, int xR, int xC, int d) { + if (xC < 0 || xC >= ${e.inWidth}) { + return initializationValue; + } + count += 1.0; + return getX(batch, xR, xC, d); + } + + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords[0]; + int d = coords[3]; + + ivec2 xRCCorner = coords.yz * strides - pads; + int xRCorner = xRCCorner.x; + int xCCorner = xRCCorner.y; + + // max/min x(?, ?, d) to get y(yR, yC, d). + // ? = to be determined + vec4 minMaxValue = vec4(${b}); + float avgValue = 0.0; + count = 0.0; + + for (int wR = 0; wR < ${l}; + wR += ${u}) { + int xR = xRCorner + wR; + + if (xR < 0 || xR >= ${e.inHeight}) { + continue; + } + + for (int wC = 0; wC < ${k}; wC += 4) { + int xC = xCCorner + wC * ${c}; + + vec4 values = vec4( + getValue(batch, xR, xC, d), + getValue(batch, xR, xC + ${c}, d), + getValue(batch, xR, xC + 2 * ${c}, d), + getValue(batch, xR, xC + 3 * ${c}, d) + ); + + ${E} + } + + int xC = xCCorner + ${k}; + if (${_===1}) { + vec4 values = vec4( + getValue(batch, xR, xC, d), + initializationValue, + initializationValue, + initializationValue + ); + + ${E} + } else if (${_===2}) { + vec4 values = vec4( + getValue(batch, xR, xC, d), + getValue(batch, xR, xC + ${c}, d), + initializationValue, + initializationValue + ); + + ${E} + } else if (${_===3}) { + vec4 values = vec4( + getValue(batch, xR, xC, d), + getValue(batch, xR, xC + ${c}, d), + getValue(batch, xR, xC + 2 * ${c}, d), + initializationValue + ); + + ${E} + } + } + setOutput(${w}); + } + `}},Ei=class{constructor(e,t,o,n=!1,s=!1){if(this.variableNames=["x"],t==="avg"&&o)throw new Error("Cannot compute positions for average pool.");let a=e.filterWidth,i=e.strideDepth,p=e.strideHeight,u=e.strideWidth,c=e.dilationDepth,l=e.dilationHeight,m=e.dilationWidth,f=e.effectiveFilterDepth,d=e.effectiveFilterHeight,h=e.effectiveFilterWidth,g=e.padInfo.front,y=e.padInfo.top,b=e.padInfo.left;this.outputShape=e.outShape;let C=t==="avg",w="0.0";if(C||(w="-1.0 / 1e-20"),o){let D=">=";this.userCode=` + const ivec3 strides = + ivec3(${i}, ${p}, ${u}); + const ivec3 pads = ivec3(${g}, ${y}, ${b}); + + void main() { + ivec5 coords = getOutputCoords(); + int batch = coords.x; + int ch = coords.u; + + ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads; + int xDCorner = xCorner.x; + int xRCorner = xCorner.y; + int xCCorner = xCorner.z; + + // max/min x(?, ?, ?, ch) to get y(yD, yR, yC, ch). + // ? = to be determined + float minMaxValue = 0.0; + float minMaxValueFound = 0.0; + int minMaxPosition = 0; + + for (int wD = 0; wD < ${f}; + wD += ${c}) { + int xD = xDCorner + wD; + + if (xD < 0 || xD >= ${e.inDepth}) { + continue; + } + + for (int wR = 0; wR < ${d}; + wR += ${l}) { + int xR = xRCorner + wR; + + if (xR < 0 || xR >= ${e.inHeight}) { + continue; + } + + for (int wC = 0; wC < ${h}; + wC += ${m}) { + int xC = xCCorner + wC; + + if (xC < 0 || xC >= ${e.inWidth}) { + continue; + } + + float value = getX(batch, xD, xR, xC, ch); + + // If a min / max value has already been found, use it. If not, + // use the current value. + float currMinMaxValue = mix( + value, minMaxValue, minMaxValueFound); + if (value ${D} currMinMaxValue) { + minMaxValue = value; + minMaxValueFound = 1.0; + minMaxPosition = ${n?s?`(((batch * ${e.inDepth} + xD) * ${e.inHeight} + xR) * ${e.inWidth} + xC) * ${e.inChannels} + ch`:`((xD * ${e.inHeight} + xR) * ${e.inWidth} + xC) * ${e.inChannels} + ch`:`wD * ${d} * ${h} + + wR * ${h} + wC`}; + } + } + } + } + setOutput(float(minMaxPosition)); + } + `;return}let k="max",_=`${t}(${t}(${t}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`;t==="avg"&&(_="avgValue / count");let E=Math.floor(a/4)*4,R=a%4,A=` + if (${C}) { + avgValue += dot(values, ones); + } else { + minMaxValue = ${k}(values, minMaxValue); + } + `;this.userCode=` + const ivec3 strides = + ivec3(${i}, ${p}, ${u}); + const ivec3 pads = ivec3(${g}, ${y}, ${b}); + const float initializationValue = ${w}; + const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0); + + float count = 0.0; + + float getValue(int batch, int xD, int xR, int xC, int ch) { + if (xC < 0 || xC >= ${e.inWidth}) { + return initializationValue; + } + count += 1.0; + return getX(batch, xD, xR, xC, ch); + } + + void main() { + ivec5 coords = getOutputCoords(); + int batch = coords.x; + int ch = coords.u; + + ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads; + int xDCorner = xCorner.x; + int xRCorner = xCorner.y; + int xCCorner = xCorner.z; + + // max/min x(?, ?, ?, d) to get y(yD, yR, yC, ch). + // ? = to be determined + vec4 minMaxValue = vec4(${w}); + float avgValue = 0.0; + count = 0.0; + + for (int wD = 0; wD < ${f}; + wD += ${c}) { + int xD = xDCorner + wD; + + if (xD < 0 || xD >= ${e.inDepth}) { + continue; + } + + for (int wR = 0; wR < ${d}; + wR += ${l}) { + int xR = xRCorner + wR; + + if (xR < 0 || xR >= ${e.inHeight}) { + continue; + } + + for (int wC = 0; wC < ${E}; wC += 4) { + int xC = xCCorner + wC * ${m}; + + vec4 values = vec4( + getValue(batch, xD, xR, xC, ch), + getValue(batch, xD, xR, xC + ${m}, ch), + getValue(batch, xD, xR, xC + 2 * ${m}, ch), + getValue(batch, xD, xR, xC + 3 * ${m}, ch) + ); + + ${A} + } + + int xC = xCCorner + ${E}; + if (${R===1}) { + vec4 values = vec4( + getValue(batch, xD, xR, xC, ch), + initializationValue, + initializationValue, + initializationValue + ); + + ${A} + } else if (${R===2}) { + vec4 values = vec4( + getValue(batch, xD, xR, xC, ch), + getValue(batch, xD, xR, xC + ${m}, ch), + initializationValue, + initializationValue + ); + + ${A} + } else if (${R===3}) { + vec4 values = vec4( + getValue(batch, xD, xR, xC, ch), + getValue(batch, xD, xR, xC + ${m}, ch), + getValue(batch, xD, xR, xC + 2 * ${m}, ch), + initializationValue + ); + + ${A} + } + } + setOutput(${_}); + } + } + `}};function GY(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e;as(n,"avgPool");let{filterSize:s,strides:a,pad:i,dimRoundingMode:p}=o,u=1;x.assert(I.eitherStridesOrDilationsAreOne(a,u),()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${a} and dilations '${u}'`);let c=I.computePool2DInfo(n.shape,s,a,u,i,p);if(c.filterWidth===1&&c.filterHeight===1&&x.arraysEqual(c.inShape,c.outShape))return Rt({inputs:{x:n},backend:t});let l=new us(c,"avg",!1);return t.runWebGLProgram(l,[n],"float32")}var VR={kernelName:pn,backendName:"webgl",kernelFunc:GY};function HY(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{filterSize:s,strides:a,pad:i,dimRoundingMode:p,dataFormat:u}=o,c=[1,1,1],l=I.computePool3DInfo(n.shape,s,a,c,i,p,u),m=new Ei(l,"avg",!1);return t.runWebGLProgram(m,[n],"float32")}var zR={kernelName:ip,backendName:"webgl",kernelFunc:HY};var bh=class{constructor(e){this.variableNames=["dy"],this.outputShape=e.inShape;let t=e.filterHeight,o=e.filterWidth,n=e.strideHeight,s=e.strideWidth,a=e.dilationHeight,i=e.dilationWidth,p=e.effectiveFilterHeight,u=e.effectiveFilterWidth,c=p-1-e.padInfo.top,l=u-1-e.padInfo.left,m=1/(t*o);this.userCode=` + const ivec2 pads = ivec2(${c}, ${l}); + const float avgMultiplier = float(${m}); + + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + + ivec2 dyRCCorner = coords.yz - pads; + int dyRCorner = dyRCCorner.x; + int dyCCorner = dyRCCorner.y; + + // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + for (int wR = 0; wR < ${p}; + wR += ${a}) { + float dyR = float(dyRCorner + wR) / ${n}.0; + + if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) { + continue; + } + int idyR = int(dyR); + + for (int wC = 0; wC < ${u}; + wC+= ${i}) { + float dyC = float(dyCCorner + wC) / ${s}.0; + + if (dyC < 0.0 || dyC >= ${e.outWidth}.0 || + fract(dyC) > 0.0) { + continue; + } + int idyC = int(dyC); + + float dyValue = getDy(b, idyR, idyC, d); + + dotProd += dyValue * avgMultiplier; + } + } + setOutput(dotProd); + } + `}},Ch=class{constructor(e){this.variableNames=["dy"],this.outputShape=e.inShape;let t=e.filterDepth,o=e.filterHeight,n=e.filterWidth,s=e.strideDepth,a=e.strideHeight,i=e.strideWidth,p=e.dilationDepth,u=e.dilationHeight,c=e.dilationWidth,l=e.effectiveFilterDepth,m=e.effectiveFilterHeight,f=e.effectiveFilterWidth,d=l-1-e.padInfo.front,h=m-1-e.padInfo.top,g=f-1-e.padInfo.left,y=1/(t*o*n);this.userCode=` + const ivec3 pads = ivec3(${d}, ${h}, ${g}); + const float avgMultiplier = float(${y}); + + void main() { + ivec5 coords = getOutputCoords(); + int batch = coords.x; + int ch = coords.u; + + ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads; + int dyDCorner = dyCorner.x; + int dyRCorner = dyCorner.y; + int dyCCorner = dyCorner.z; + + // Convolve dy(?, ?, ?, d) with pos mask(:, :, :, ch) to get + // dx(xD, xR, xC, ch). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + + for (int wD = 0; wD < ${l}; + wD += ${p}) { + float dyD = float(dyDCorner + wD) / ${s}.0; + + if (dyD < 0.0 || dyD >= ${e.outDepth}.0 || fract(dyD) > 0.0) { + continue; + } + int idyD = int(dyD); + + for (int wR = 0; wR < ${m}; + wR += ${u}) { + float dyR = float(dyRCorner + wR) / ${a}.0; + + if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || + fract(dyR) > 0.0) { + continue; + } + int idyR = int(dyR); + + for (int wC = 0; wC < ${f}; + wC += ${c}) { + float dyC = float(dyCCorner + wC) / ${i}.0; + + if (dyC < 0.0 || dyC >= ${e.outWidth}.0 || + fract(dyC) > 0.0) { + continue; + } + int idyC = int(dyC); + + float dyValue = getDy(batch, idyD, idyR, idyC, ch); + + dotProd += dyValue * avgMultiplier; + } + } + } + setOutput(dotProd); + } + `}};function qY(r){let{inputs:e,backend:t,attrs:o}=r,{dy:n,input:s}=e,a=s,{filterSize:i,strides:p,pad:u,dimRoundingMode:c}=o,l=[1,1,1],m=I.computePool3DInfo(a.shape,i,p,l,u,c),f=new Ch(m);return t.runWebGLProgram(f,[n],a.dtype)}var WR={kernelName:Fm,backendName:"webgl",kernelFunc:qY};function KY(r){let{inputs:e,backend:t,attrs:o}=r,{dy:n,input:s}=e,a=s;as([n,s],"avgPoolGrad");let{filterSize:i,strides:p,pad:u}=o,c=I.computePool2DInfo(a.shape,i,p,1,u),l=new bh(c);return t.runWebGLProgram(l,[n],a.dtype)}var UR={kernelName:Am,backendName:"webgl",kernelFunc:KY};function jY(r){let{inputs:e,backend:t,attrs:o}=r,{a:n,b:s}=e,{transposeA:a,transposeB:i}=o;return Mu({a:n,b:s,transposeA:a,transposeB:i,backend:t})}var GR={kernelName:cn,backendName:"webgl",kernelFunc:jY};var Ih=class{constructor(e,t,o,n,s,a){this.outputShape=[],this.variableNames=["x","mean","variance"],I.assertAndGetBroadcastShape(e,t),I.assertAndGetBroadcastShape(e,o);let i="0.0";n!=null&&(I.assertAndGetBroadcastShape(e,n),this.variableNames.push("offset"),i="getOffsetAtOutCoords()");let p="1.0";s!=null&&(I.assertAndGetBroadcastShape(e,s),this.variableNames.push("scale"),p="getScaleAtOutCoords()"),this.outputShape=e,this.userCode=` + void main() { + float x = getXAtOutCoords(); + float mean = getMeanAtOutCoords(); + float variance = getVarianceAtOutCoords(); + float offset = ${i}; + float scale = ${p}; + float inv = scale * inversesqrt(variance + float(${a})); + setOutput(dot(vec3(x, -mean, offset), vec3(inv, inv, 1))); + } + `}};var wh=class{constructor(e,t,o,n,s,a){this.packedInputs=!0,this.packedOutput=!0,this.variableNames=["x","mean","variance"],I.assertAndGetBroadcastShape(e,t),I.assertAndGetBroadcastShape(e,o);let i="vec4(0.0)";n!=null&&(I.assertAndGetBroadcastShape(e,n),this.variableNames.push("offset"),i="getOffsetAtOutCoords()");let p="vec4(1.0)";s!=null&&(I.assertAndGetBroadcastShape(e,s),this.variableNames.push("scale"),p="getScaleAtOutCoords()"),this.outputShape=e,this.userCode=` + void main() { + vec4 offset = ${i}; + vec4 scale = ${p}; + + vec4 x = getXAtOutCoords(); + vec4 mean = getMeanAtOutCoords(); + vec4 variance = getVarianceAtOutCoords(); + + vec4 inv = scale * inversesqrt(variance + vec4(${a})); + + setOutput((x - mean) * inv + offset); + } + `}};var XY=({inputs:r,backend:e,attrs:t})=>{let{x:o,mean:n,variance:s,offset:a,scale:i}=r;x.assert(n.shape.length===s.shape.length,()=>"Batch normalization gradient requires mean and variance to have equal ranks."),x.assert(a==null||n.shape.length===a.shape.length,()=>"Batch normalization gradient requires mean and offset to have equal ranks."),x.assert(i==null||n.shape.length===i.shape.length,()=>"Batch normalization gradient requires mean and scale to have equal ranks.");let{varianceEpsilon:p}=t;p==null&&(p=.001);let u=[o,n,s],c=null;a!=null&&(c=a.shape,u.push(a));let l=null;i!=null&&(l=i.shape,u.push(i));let m=P().getBool("WEBGL_PACK_NORMALIZATION")?new wh(o.shape,n.shape,s.shape,c,l,p):new Ih(o.shape,n.shape,s.shape,c,l,p);return e.runWebGLProgram(m,u,u[0].dtype)},HR={kernelName:kn,backendName:"webgl",kernelFunc:XY};var Sh=class{constructor(e){this.variableNames=["source"],this.outputShape=e,this.rank=e.length;let t=_e(this.rank);this.customUniforms=[{name:"start",arrayIndex:this.rank,type:"int"}];let o=YY(this.rank),n,s=e.map((a,i)=>`sourceLoc.${Aw[i]} = start[${i}] + coords.${Aw[i]};`);n=` + ${t} sourceLoc; + ${t} coords = getOutputCoords(); + ${s.join(` +`)} + `,this.userCode=` + void main() { + ${n} + setOutput(getSource(${o})); + } + `}},Aw=["x","y","z","w","u","v"];function YY(r){if(r===1)return"sourceLoc";if(r<=6)return Aw.slice(0,r).map(e=>"sourceLoc."+e).join(",");throw Error(`Slicing for rank ${r} is not yet supported`)}var vh=class{constructor(e){this.variableNames=["source"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e,this.rank=e.length,this.customUniforms=[{name:"start",arrayIndex:this.rank,type:"int"}];let t=_e(this.rank),o=$t("coords",this.rank),n=$t("sourceLoc",this.rank),s=this.rank===1?"sourceLoc":`vec2(${n.slice(-2).join()})`,a=`getChannel(getSource(${n.join()}), ${s})`,i=` + result.x = ${a}; + if (++${o[this.rank-1]} < ${e[this.rank-1]}) { + ++${n[this.rank-1]}; + result.y = ${a}; + --${n[this.rank-1]}; + } + `,p=this.rank===1?"":` + --${o[this.rank-1]}; + if (++${o[this.rank-2]} < ${e[this.rank-2]}) { + ++${n[this.rank-2]}; + result.z = ${a}; + if (++${o[this.rank-1]} < ${e[this.rank-1]}) { + ++${n[this.rank-1]}; + result.w = ${a}; + } + } + `,u=this.rank<=4?`sourceLoc = coords + + ${t}(${e.map((c,l)=>`start[${l}]`).join()});`:e.map((c,l)=>`${n[l]} = ${o[l]} + start[${l}];`).join(` +`);this.userCode=` + void main() { + ${t} coords = getOutputCoords(); + ${t} sourceLoc; + ${u} + vec4 result = vec4(0.); + ${i} + ${p} + setOutput(result); + } + `}};function QY(r,e,t,o){let n=o.texData.get(r.dataId),s=o.makeTensorInfo(t,r.dtype),a=o.texData.get(s.dataId);Object.assign(a,n),a.refCount=1,a.shape=t,a.dtype=r.dtype;let i=et.computeFlatOffset(e,x.computeStrides(r.shape));n.slice&&(i+=n.slice.flatOffset),a.slice={flatOffset:i,origDataId:n.slice&&n.slice.origDataId||r.dataId};let p=o.dataRefCount.get(a.slice.origDataId)||1;return o.dataRefCount.set(a.slice.origDataId,p+1),s}function ps(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{begin:s,size:a}=o,[i,p]=et.parseSliceParams(n,s,a);if(et.assertParamsValid(n,i,p),x.sizeFromShape(p)===0)return t.makeTensorInfo(p,n.dtype,[]);if(t.shouldExecuteOnCPU([n])||n.dtype==="string"){let l=t.texData.get(n.dataId),m=O$(l.values,i,p,n.shape,n.dtype);return t.makeTensorInfo(p,n.dtype,m)}let{isPacked:u}=t.texData.get(n.dataId),c=et.isSliceContinous(n.shape,i,p);if(u||!c){let l=P().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new vh(p):new Sh(p),m=[i];return t.runWebGLProgram(l,[n],n.dtype,m)}return t.uploadToGPU(n.dataId),QY(n,i,p,t)}var qR={kernelName:qn,backendName:"webgl",kernelFunc:ps};var ZY=r=>{let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{blockShape:s,crops:a}=o;x.assert(n.shape.length<=4,()=>"batchToSpaceND for rank > 4 with a WebGL backend not implemented yet");let i=s.reduce((b,C)=>b*C),p=I.getReshaped(n.shape,s,i),u=I.getPermuted(p.length,s.length),c=I.getReshapedPermuted(n.shape,s,i),l=I.getSliceBeginCoords(a,s.length),m=I.getSliceSize(c,a,s.length),f=[],d=J({inputs:{x:n},backend:t,attrs:{shape:p}}),h=xt({inputs:{x:d},backend:t,attrs:{perm:u}}),g=J({inputs:{x:h},backend:t,attrs:{shape:c}}),y=ps({inputs:{x:g},backend:t,attrs:{begin:l,size:m}});return f.push(d),f.push(h),f.push(g),f.forEach(b=>t.disposeIntermediateTensorInfo(b)),y},KR={kernelName:hs,backendName:"webgl",kernelFunc:ZY};function JY(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,weights:s}=e,{size:a}=o,i=t.readSync(n.dataId),p=t.readSync(s.dataId),u=oh(i,p,s.dtype,s.shape,a);return t.makeTensorInfo([a],s.dtype,u)}var jR={kernelName:up,backendName:"webgl",kernelFunc:JY};function eQ(r){let{inputs:e,backend:t}=r,{s0:o,s1:n}=e,s=t.readSync(o.dataId),a=t.readSync(n.dataId),i=I.assertAndGetBroadcastShape(Array.from(s),Array.from(a));return t.makeTensorInfo([i.length],"int32",Int32Array.from(i))}var XR={kernelName:pp,backendName:"webgl",kernelFunc:eQ};var tQ="return float(a != b);",Fw=ot({opSnippet:tQ,cpuKernelImpl:N$,dtype:"bool"}),YR={kernelName:go,backendName:"webgl",kernelFunc:Fw};function La(r){let{inputs:e,backend:t}=r,{input:o}=e,n=t.texData.get(o.dataId);return Rt({inputs:{x:n.complexTensorInfos.real},backend:t})}var QR={kernelName:la,backendName:"webgl",kernelFunc:La};var rQ="return float(int(x));";function ZR(r,e){let t=new fr(r.shape,rQ),o=e.runWebGLProgram(t,[r],"int32");return{dataId:o.dataId,shape:o.shape,dtype:o.dtype}}function Dw(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{dtype:s}=o;if(s==="complex64"){if(n.dtype==="complex64")return Rt({inputs:{x:n},backend:t});let a=Wr(n.shape),i=Dw({inputs:{x:n},backend:t,attrs:{dtype:"float32"}}),p=Ar({inputs:{real:i,imag:a},backend:t});return a.dispose(),t.disposeIntermediateTensorInfo(i),p}if(n.dtype==="complex64"){let a=La({inputs:{input:n},backend:t}),i=Dw({inputs:{x:a},backend:t,attrs:{dtype:s}});return t.disposeIntermediateTensorInfo(a),i}if(!x.hasEncodingLoss(n.dtype,s)){let a=Rt({inputs:{x:n},backend:t});return{dataId:a.dataId,shape:a.shape,dtype:s}}if(t.shouldExecuteOnCPU([n])){let a=t.texData.get(n.dataId).values,[i,p,u]=i$(a,n.shape,n.dtype,s);return t.makeTensorInfo(i,p,u)}if(s==="int32")return ZR(n,t);if(s==="bool"){let a=t.makeTensorInfo([],"bool",x.getTypedArrayFromDType("bool",1)),p=Fw({inputs:{a:n,b:a},backend:t});return t.disposeIntermediateTensorInfo(a),p}throw new Error(`Error in Cast: failed to cast ${n.dtype} to ${s}`)}var JR={kernelName:to,backendName:"webgl",kernelFunc:Dw};var eA="return ceil(x);",oQ=he({opSnippet:eA,packedOpSnippet:eA,cpuKernelImpl:u$}),tA={kernelName:ro,backendName:"webgl",kernelFunc:oQ};var kh=class{constructor(e){this.variableNames=["A"],this.customUniforms=[{name:"minVal",type:"float"},{name:"maxVal",type:"float"}],this.outputShape=e,this.userCode=` + + void main() { + float value = getAAtOutCoords(); + if (isnan(value)) { + setOutput(value); + return; + } + + setOutput(clamp(value, minVal, maxVal)); + } + `}};var Th=class{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"minVal",type:"float"},{name:"maxVal",type:"float"}],this.outputShape=e,this.userCode=` + void main() { + vec4 value = getAAtOutCoords(); + + if (any(isnan(value))) { + setOutput(value); + return; + } + + setOutput(clamp(value, vec4(minVal), vec4(maxVal))); + } + `}};function nQ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{clipValueMin:s,clipValueMax:a}=o,i;P().getBool("WEBGL_PACK_CLIP")?i=new Th(n.shape):i=new kh(n.shape);let p=[[s],[a]];return t.runWebGLProgram(i,[n],n.dtype,p)}var rA={kernelName:Ro,backendName:"webgl",kernelFunc:nQ};var Nh=class{constructor(e){this.variableNames=["real","imag"],this.outputShape=e,this.userCode=` + void main() { + float re = abs(getRealAtOutCoords()); + float im = abs(getImagAtOutCoords()); + float mx = max(re, im); + + // sadly the length function in glsl is not underflow-safe + // (at least not on Intel GPUs). So the safe solution is + // to ensure underflow-safety in all cases. + setOutput( + mx == 0.0 ? 0.0 : mx * length(vec2(1, min(re, im)/mx)) + ); + } + `}};function oA(r,e){return{dataId:e.dataId,dtype:e.dtype,shape:r.shape}}function sQ(r){let{inputs:e,backend:t}=r,{x:o}=e,n=t.texData.get(o.dataId),s=new Nh(o.shape),a=[oA(o,n.complexTensorInfos.real),oA(o,n.complexTensorInfos.imag)];return t.runWebGLProgram(s,a,a[0].dtype)}var nA={kernelName:cp,backendName:"webgl",kernelFunc:sQ};var _h=class{constructor(e){this.outputShape=[],this.outputShape=I.computeOutShape(e,1),this.variableNames=e.map((a,i)=>`T${i}`);let t=new Array(e.length-1);t[0]=e[0][1];for(let a=1;a`T${g}`);let p=new Array(e.length-1);p[0]=e[0][t];for(let h=1;h= ${p[h-1]}) { + return getChannel( + getT${h}(${Eh(i,u,g)}), + vec2(${Eh(c,u,g)})); + }`}let f=p.length,d=p[p.length-1];m+=` + return getChannel( + getT${f}(${Eh(i,u,d)}), + vec2(${Eh(c,u,d)}));`,this.userCode=` + float getValue(${i.map(h=>"int "+h)}) { + ${m} + } + + void main() { + ${s} coords = getOutputCoords(); + vec4 result = vec4(getValue(${a}), 0., 0., 0.); + + ${a[n-1]} = ${a[n-1]} + 1; + if (${a[n-1]} < ${o[n-1]}) { + result.g = getValue(${a}); + } + + ${a[n-2]} = ${a[n-2]} + 1; + if (${a[n-2]} < ${o[n-2]}) { + result.a = getValue(${a}); + } + + ${a[n-1]} = ${a[n-1]} - 1; + if (${a[n-2]} < ${o[n-2]} && + ${a[n-1]} < ${o[n-1]}) { + result.b = getValue(${a}); + } + setOutput(result); + } + `}};function Eh(r,e,t){let o=r.indexOf(e);return r.map((s,a)=>a===o?`${s} - ${t}`:s).join()}function Lu(r){let{inputs:e,backend:t}=r,{input:o}=e,n=t.texData.get(o.dataId);return Rt({inputs:{x:n.complexTensorInfos.imag},backend:t})}var sA={kernelName:Ya,backendName:"webgl",kernelFunc:Lu};function yc(r,e,t){let o=r[0].dtype;if(o==="complex64"){let l=r.map(g=>La({inputs:{input:g},backend:t})),m=r.map(g=>Lu({inputs:{input:g},backend:t})),f=yc(l,e,t),d=yc(m,e,t),h=Ar({inputs:{real:f,imag:d},backend:t});return l.forEach(g=>t.disposeIntermediateTensorInfo(g)),m.forEach(g=>t.disposeIntermediateTensorInfo(g)),t.disposeIntermediateTensorInfo(f),t.disposeIntermediateTensorInfo(d),h}let n=t.shouldExecuteOnCPU(r);if(o==="string"&&(n=!0),n){let l=r.map(b=>{let w=[-1,x.sizeFromShape(b.shape.slice(e))];return J({inputs:{x:b},backend:t,attrs:{shape:w}})}),m=l.map(b=>({vals:t.readSync(b.dataId),shape:b.shape})),f=I.computeOutShape(l.map(b=>b.shape),1),d=l[0].shape[0]===1,h=p$(m,f,o,d),g=I.computeOutShape(r.map(b=>b.shape),e),y=t.makeTensorInfo(g,o,h);return l.forEach(b=>t.disposeIntermediateTensorInfo(b)),y}let s=P().getNumber("WEBGL_MAX_TEXTURES_IN_SHADER");if(r.length>s){let l=[];for(let f=0;f1){let l=new $h(r.map(m=>m.shape),e);return t.runWebGLProgram(l,r,o)}let{tensors2D:a,outShape:i}=aQ(r,e,t),p=new _h(a.map(l=>l.shape)),u=t.runWebGLProgram(p,a,o);a.forEach(l=>t.disposeIntermediateTensorInfo(l));let c=J({inputs:{x:u},attrs:{shape:i},backend:t});return t.disposeIntermediateTensorInfo(u),c}function aQ(r,e,t){let o=I.computeOutShape(r.map(s=>s.shape),e);return{tensors2D:r.map(s=>J({inputs:{x:s},attrs:{shape:[-1,x.sizeFromShape(s.shape.slice(e))]},backend:t})),outShape:o}}function Pw(r){let{inputs:e,backend:t,attrs:o}=r,{axis:n}=o,s=x.parseAxisParam(n,e[0].shape)[0],a=e.map(u=>u.shape);I.assertParamsConsistent(a,s);let i=I.computeOutShape(e.map(u=>u.shape),s);if(x.sizeFromShape(i)===0)return t.makeTensorInfo(i,e[0].dtype,[]);let p=e.filter(u=>x.sizeFromShape(u.shape)>0);return p.length===1?Rt({inputs:{x:p[0]},backend:t}):yc(p,s,t)}var aA={kernelName:gs,backendName:"webgl",kernelFunc:Pw};var bc=class{constructor(e,t=!1,o=null,n=!1,s=!1){this.variableNames=["x","W"],this.outputShape=e.outShape;let a=e.padInfo.top,i=e.padInfo.left,p=e.strideHeight,u=e.strideWidth,c=e.dilationHeight,l=e.dilationWidth,m=e.filterHeight,f=e.filterWidth,d=Math.floor(e.inChannels/4)*4,h=e.inChannels%4,g=e.dataFormat==="channelsLast",y=g?1:2,b=g?2:3,C=g?3:1,w="",k="";o&&(n?w=`float activation(float a) { + float b = getPreluActivationWeightsAtOutCoords(); + ${o} + }`:s?w=`float activation(float a) { + float b = getLeakyreluAlphaAtOutCoords(); + ${o} + }`:w=` + float activation(float x) { + ${o} + } + `,k="result = activation(result);");let _=t?"result += getBiasAtOutCoords();":"";t&&this.variableNames.push("bias"),n&&this.variableNames.push("preluActivationWeights"),s&&this.variableNames.push("leakyreluAlpha"),this.userCode=` + ${w} + + const ivec2 strides = ivec2(${p}, ${u}); + const ivec2 pads = ivec2(${a}, ${i}); + + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords[0]; + int d2 = coords[${C}]; + + ivec2 xRCCorner = + ivec2(coords[${y}], coords[${b}]) * strides - pads; + int xRCorner = xRCCorner.x; + int xCCorner = xRCCorner.y; + + // Convolve x(?, ?, d1) with w(:, :, d1, d2) to get y(yR, yC, d2). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + for (int wR = 0; wR < ${m}; wR++) { + int xR = xRCorner + wR * ${c}; + + if (xR < 0 || xR >= ${e.inHeight}) { + continue; + } + + for (int wC = 0; wC < ${f}; wC++) { + int xC = xCCorner + wC * ${l}; + + if (xC < 0 || xC >= ${e.inWidth}) { + continue; + } + + for (int d1 = 0; d1 < ${d}; d1 += 4) { + vec4 wValues = vec4( + getW(wR, wC, d1, d2), + getW(wR, wC, d1 + 1, d2), + getW(wR, wC, d1 + 2, d2), + getW(wR, wC, d1 + 3, d2) + ); + + if (${g}) { + vec4 xValues = vec4( + getX(batch, xR, xC, d1), + getX(batch, xR, xC, d1 + 1), + getX(batch, xR, xC, d1 + 2), + getX(batch, xR, xC, d1 + 3) + ); + dotProd += dot(xValues, wValues); + } else { + vec4 xValues = vec4( + getX(batch, d1, xR, xC), + getX(batch, d1 + 1, xR, xC), + getX(batch, d1 + 2, xR, xC), + getX(batch, d1 + 3, xR, xC) + ); + dotProd += dot(xValues, wValues); + } + } + + if (${h===1}) { + + if (${g}) { + dotProd += + getX(batch, xR, xC, ${d}) * + getW(wR, wC, ${d}, d2); + } else { + dotProd += + getX(batch, ${d}, xR, xC) * + getW(wR, wC, ${d}, d2); + } + + } else if (${h===2}) { + vec2 wValues = vec2( + getW(wR, wC, ${d}, d2), + getW(wR, wC, ${d} + 1, d2) + ); + + if (${g}) { + vec2 xValues = vec2( + getX(batch, xR, xC, ${d}), + getX(batch, xR, xC, ${d} + 1) + ); + dotProd += dot(xValues, wValues); + } else { + vec2 xValues = vec2( + getX(batch, ${d}, xR, xC), + getX(batch, ${d} + 1, xR, xC) + ); + dotProd += dot(xValues, wValues); + } + + } else if (${h===3}) { + vec3 wValues = vec3( + getW(wR, wC, ${d}, d2), + getW(wR, wC, ${d} + 1, d2), + getW(wR, wC, ${d} + 2, d2) + ); + + if (${g}) { + vec3 xValues = vec3( + getX(batch, xR, xC, ${d}), + getX(batch, xR, xC, ${d} + 1), + getX(batch, xR, xC, ${d} + 2) + ); + dotProd += dot(xValues, wValues); + } else { + vec3 xValues = vec3( + getX(batch, ${d}, xR, xC), + getX(batch, ${d} + 1, xR, xC), + getX(batch, ${d} + 2, xR, xC) + ); + dotProd += dot(xValues, wValues); + } + + } + } + } + + float result = dotProd; + ${_} + ${k} + setOutput(result); + } + `}},Rh=class{constructor(e){this.variableNames=["x","W"],this.outputShape=e.outShape;let t=e.padInfo.front,o=e.padInfo.top,n=e.padInfo.left,s=e.strideDepth,a=e.strideHeight,i=e.strideWidth,p=e.dilationDepth,u=e.dilationHeight,c=e.dilationWidth,l=e.filterDepth,m=e.filterHeight,f=e.filterWidth,d=Math.floor(e.inChannels/4)*4,h=e.inChannels%4;this.userCode=` + const ivec3 strides = ivec3(${s}, ${a}, ${i}); + const ivec3 pads = ivec3(${t}, ${o}, ${n}); + + void main() { + ivec5 coords = getOutputCoords(); + int batch = coords.x; + int d2 = coords.u; + + ivec3 xFRCCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads; + int xFCorner = xFRCCorner.x; + int xRCorner = xFRCCorner.y; + int xCCorner = xFRCCorner.z; + + // Convolve x(?, ?, ?, d1) with w(:, :, :, d1, d2) to get + // y(yF, yR, yC, d2). ? = to be determined. : = across all + // values in that axis. + float dotProd = 0.0; + for (int wF = 0; wF < ${l}; wF++) { + int xF = xFCorner + wF * ${p}; + + if (xF < 0 || xF >= ${e.inDepth}) { + continue; + } + + for (int wR = 0; wR < ${m}; wR++) { + int xR = xRCorner + wR * ${u}; + + if (xR < 0 || xR >= ${e.inHeight}) { + continue; + } + + for (int wC = 0; wC < ${f}; wC++) { + int xC = xCCorner + wC * ${c}; + + if (xC < 0 || xC >= ${e.inWidth}) { + continue; + } + + for (int d1 = 0; d1 < ${d}; d1 += 4) { + vec4 xValues = vec4( + getX(batch, xF, xR, xC, d1), + getX(batch, xF, xR, xC, d1 + 1), + getX(batch, xF, xR, xC, d1 + 2), + getX(batch, xF, xR, xC, d1 + 3) + ); + vec4 wValues = vec4( + getW(wF, wR, wC, d1, d2), + getW(wF, wR, wC, d1 + 1, d2), + getW(wF, wR, wC, d1 + 2, d2), + getW(wF, wR, wC, d1 + 3, d2) + ); + + dotProd += dot(xValues, wValues); + } + + if (${h===1}) { + dotProd += + getX(batch, xF, xR, xC, ${d}) * + getW(wF, wR, wC, ${d}, d2); + } else if (${h===2}) { + vec2 xValues = vec2( + getX(batch, xF, xR, xC, ${d}), + getX(batch, xF, xR, xC, ${d} + 1) + ); + vec2 wValues = vec2( + getW(wF, wR, wC, ${d}, d2), + getW(wF, wR, wC, ${d} + 1, d2) + ); + dotProd += dot(xValues, wValues); + } else if (${h===3}) { + vec3 xValues = vec3( + getX(batch, xF, xR, xC, ${d}), + getX(batch, xF, xR, xC, ${d} + 1), + getX(batch, xF, xR, xC, ${d} + 2) + ); + vec3 wValues = vec3( + getW(wF, wR, wC, ${d}, d2), + getW(wF, wR, wC, ${d} + 1, d2), + getW(wF, wR, wC, ${d} + 2, d2) + ); + dotProd += dot(xValues, wValues); + } + } + } + } + setOutput(dotProd); + } + `}};var Cc=class{constructor(e,t=!1,o=null,n=!1,s=!1){this.variableNames=["x","W"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"pads",type:"ivec2"},{name:"strides",type:"ivec2"},{name:"dilations",type:"ivec2"},{name:"inDims",type:"ivec2"}],this.outputShape=e.outShape,this.enableShapeUniforms=lt(this.outputShape.length);let a=e.padInfo.left,i=e.strideWidth,p=e.dilationWidth,u=e.filterHeight,c=e.filterWidth,l=c,m=` + int xR; int xC; int xCOffset; + vec4 wTexel; vec4 previous; vec4 final;`;for(let g=0;g=0 && xR < inDims[0]) { + `;for(let g=0;g<(l+1)/2;g++){let y=g*2;if(m+=` + xC = xCCorner + ${y*p}; + `,i===1){if(y= 0 && xCOffset < inDims[1] && xTexelC${y}Ready == 0) { + xTexelC${y} = getX(batch, xR, xCOffset, d1); + + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xCOffset + 1 >= inDims[1]) { + xTexelC${y}.zw = vec2(0.0); + } + xTexelC${y}Ready = 1; + } + `,p===1&&y>0?m+=` + xC${y} = vec4(xTexelC${y-2}.zw, xTexelC${y}.xy); + `:m+=` + xCOffset = xC + 1 - 2; + + if (xCOffset >= 0 && xCOffset < inDims[1]) { + previous = getX(batch, xR, xCOffset, d1); + + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xCOffset + 1 >= inDims[1]) { + previous.zw = vec2(0.0); + } + + xC${y} = vec4(previous.zw, xTexelC${y}.xy); + } else { + xC${y} = vec4(0.0, 0.0, xTexelC${y}.xy); + } + `):m+=` + if (xC >= 0 && xC < inDims[1] && xTexelC${y}Ready == 0) { + xTexelC${y} = getX(batch, xR, xC, d1); + if (xC + 1 >= inDims[1]) { + xTexelC${y}.zw = vec2(0.0); + } + xTexelC${y}Ready = 1; + } + + xC${y} = xTexelC${y}; + `,y+1= 0 && xCOffset < inDims[1] && xTexelC${y+1}Ready == 0) { + xTexelC${y+1} = getX(batch, xR, xCOffset, d1); + + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xCOffset + 1 >= inDims[1]) { + xTexelC${y+1}.zw = vec2(0.0); + } + xTexelC${y+1}Ready = 1; + } + `,p>1?m+=` + xCOffset -= 2; + if (xCOffset >= 0 && xCOffset < inDims[1]) { + previous = getX(batch, xR, xCOffset, d1); + xC${y+1} = vec4(previous.zw, xTexelC${y+1}.xy); + } else { + xC${y+1} = vec4(0.0, 0.0, xTexelC${y+1}.xy); + } + `:m+=` + xC${y+1} = vec4(xTexelC${y}.zw, xTexelC${y+1}.xy); + `):b===1?m+=` + xC${y+1} = xTexelC${y}; + `:m+=` + xCOffset = xC + ${b}; + + if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${y+1}Ready == 0) { + xTexelC${y+1} = getX(batch, xR, xCOffset, d1); + if (xCOffset + 1 >= inDims[1]) { + xTexelC${y+1}.zw = vec2(0.0); + } + xTexelC${y+1}Ready = 1; + } + + xC${y+1} = xTexelC${y+1}; + `}}else y= 0 && xCOffset < inDims[1] && xTexelC${y}Ready == 0) { + xTexelC${y} = getX(batch, xR, xCOffset, d1); + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xCOffset + 1 >= inDims[1]) { + xTexelC${y}.zw = vec2(0.0); + } + xTexelC${y}Ready = 1; + } + + if(xC + 1 >= 0 && xC + 1 < inDims[1] && xTexelC${y+1}Ready == 0) { + xTexelC${y+1} = getX(batch, xR, xC + 1, d1); + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xC + 2 >= inDims[1]) { + xTexelC${y+1}.zw = vec2(0.0); + } + xTexelC${y+1}Ready = 1; + } + + xC${y} = vec4(xTexelC${y}.zw, xTexelC${y+1}.zw); + `,y+1= 0 && xCOffset < inDims[1]) { + final = getX(batch, xR, xCOffset, d1); + } + xC${y+1} = vec4(xTexelC${y+1}.xy, final.xy); + `)):(m+=` + if(xC >= 0 && xC < inDims[1] && xTexelC${y}Ready == 0) { + xTexelC${y} = getX(batch, xR, xC, d1); + if (xC + 1 >= inDims[1]) { + xTexelC${y}.zw = vec2(0.0); + } + xTexelC${y}Ready = 1; + } + + xCOffset = xC + strides[1]; + if(xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${y+1}Ready == 0) { + xTexelC${y+1} = getX(batch, xR, xCOffset, d1); + if (xCOffset + 1 >= inDims[1]) { + xTexelC${y+1}.zw = vec2(0.); + } + xTexelC${y+1}Ready = 1; + } + + xC${y} = vec4( + xTexelC${y}.xy, xTexelC${y+1}.xy); + `,y+1= 0) { + // Use custom imod instead mod. On Intel GPU, mod may generate + // unexpected value. + // https://github.com/tensorflow/tfjs/issues/5447 + offsetX = imod(blockIndex, outWidth) * stride[1] - pad[1]; + d1 = offsetX + dilation[1] * (imod(pos, itemsPerBlockRow) / + inChannels); + + if(d1 < inputShape[${i}] && d1 >= 0) { + + ch = imod(pos, inChannels); + + if (${s}) { + innerDims = vec2(d1, ch); + result[${c*2+l}] = getChannel( + getA(rc.x, d0, int(innerDims.x), + int(innerDims.y)), innerDims); + } else { + innerDims = vec2(d0, d1); + result[${c*2+l}] = getChannel( + getA(rc.x, ch, int(innerDims.x), + int(innerDims.y)), innerDims); + } + } + } + } + `;this.userCode=` + void main() { + ivec3 rc = getOutputCoords(); + + vec4 result = vec4(0); + + int blockIndex, pos, offsetY, d0, offsetX, d1, ch; + vec2 innerDims; + + ${u} + + ${n.output} = result; + } + `}};function Fh(r,e){let t=r.length;return t>=3?e?[...r.slice(0,-3),r[t-3]*r[t-2],r[t-1]]:[...r.slice(0,-3),r[t-3],r[t-2]*r[t-1]]:!e&&t===1&&r[0]>1?[r[0],1]:null}function Dh({x:r,filter:e,convInfo:t,backend:o,bias:n=null,preluActivationWeights:s=null,leakyreluAlpha:a=0,activation:i=null}){let p=r.shape,u=o.texData.get(r.dataId),c=t.inChannels,l=p[0]*p[1]*p[2],m=t.outChannels,f=t.dataFormat==="channelsLast",d=!1,h=!1,g,y=[];if(s!=null){let w=Fh(s.shape,f);w!=null&&(s=J({inputs:{x:s},backend:o,attrs:{shape:w}}),y.push(s))}if(n!=null){let w=Fh(n.shape,f);w!=null&&(n=J({inputs:{x:n},backend:o,attrs:{shape:w}}),y.push(n))}if(!((l===1||m===1)&&c>Rw)&&u.isPacked&&f&&u.texture!=null&&p[2]%2!==0&&x.arraysEqual(u.shape.slice(-3),p.slice(-3))){let w=p[0]*p[1]*(p[2]+1),k={dataId:r.dataId,shape:[1,w,t.inChannels],dtype:r.dtype},_=u.shape;u.shape=u.shape.slice(),u.shape[u.shape.length-2]++,x.assert(Ti(u.shape,k.shape),()=>`packed reshape ${u.shape} to ${k.shape} isn't free`);let E=J({inputs:{x:e},backend:o,attrs:{shape:[1,t.inChannels,t.outChannels]}});y.push(E);let R=Mu({a:k,b:E,backend:o,transposeA:d,transposeB:h,bias:n,activation:i,preluActivationWeights:s,leakyreluAlpha:a}),A=o.texData.get(R.dataId);x.assert(A.isPacked,()=>"batchMatMul result is expected to be packed"),u.shape=_,A.shape=t.outShape,g=Rt({inputs:{x:R},backend:o}),g.shape=t.outShape,y.push(R)}else{let w=t.outHeight*t.outWidth,k=J({inputs:{x:r},backend:o,attrs:{shape:f?[t.batchSize,w,t.inChannels]:[t.batchSize,t.inChannels,w]}}),_=J({inputs:{x:e},backend:o,attrs:{shape:[1,t.inChannels,t.outChannels]}}),E=Mu({a:f?k:_,b:f?_:k,transposeA:!f,transposeB:h,backend:o,bias:n,activation:i,preluActivationWeights:s,leakyreluAlpha:a});g=J({inputs:{x:E},backend:o,attrs:{shape:t.outShape}}),y.push(k),y.push(_),y.push(E)}for(let w of y)o.disposeIntermediateTensorInfo(w);return g}function Ph({x:r,filter:e,convInfo:t,backend:o,bias:n=null,preluActivationWeights:s=null,leakyreluAlpha:a=0,activation:i=null}){let{filterWidth:p,filterHeight:u,inChannels:c,outWidth:l,outHeight:m,dataFormat:f}=t,d=f==="channelsLast",h=p*u*c,g=m*l,y=[t.batchSize,h,g],b=!0,C=!1,w=[];if(s!=null){let H=Fh(s.shape,d);H!=null&&(s=J({inputs:{x:s},backend:o,attrs:{shape:H}}),w.push(s))}if(n!=null){let H=Fh(n.shape,d);H!=null&&(n=J({inputs:{x:n},backend:o,attrs:{shape:H}}),w.push(n))}let k=J({inputs:{x:e},backend:o,attrs:{shape:[1,h,x.sizeFromShape(e.shape)/h]}});w.push(k);let _=new Ah(y,t),E=[r.shape,[t.padInfo.top,t.padInfo.left],[t.strideHeight,t.strideWidth],[t.dilationHeight,t.dilationWidth],[t.inChannels],[t.filterWidth*t.inChannels],[t.outWidth]],R=o.runWebGLProgram(_,[r],"float32",E),A=J({inputs:{x:R},backend:o,attrs:{shape:y}});w.push(R),w.push(A);let D=n!=null,O=s!=null,M=i==="leakyrelu",L=i?Ma(i,!0):null,W=new xc(d?A.shape:k.shape,d?k.shape:A.shape,d?[t.batchSize,g,t.outChannels]:[t.batchSize,t.outChannels,g],b,C,D,L,O,M),V=d?[A,k]:[k,A];if(n&&V.push(n),O&&V.push(s),M){let H=o.makeTensorInfo([],"float32",x.createScalarValue(a,"float32"));V.push(H),w.push(H)}let G=o.runWebGLProgram(W,V,"float32"),q=J({inputs:{x:G},backend:o,attrs:{shape:t.outShape}});w.push(G);for(let H of w)o.disposeIntermediateTensorInfo(H);return q}function iQ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,filter:s}=e,{strides:a,pad:i,dataFormat:p,dilations:u,dimRoundingMode:c}=o,l=I.convertConv2DDataFormat(p),m=I.computeConv2DInfo(n.shape,s.shape,a,u,i,c,!1,l),f;if(m.filterHeight===1&&m.filterWidth===1&&m.dilationHeight===1&&m.dilationWidth===1&&m.strideHeight===1&&m.strideWidth===1&&(m.padInfo.type==="SAME"||m.padInfo.type==="VALID"))f=Dh({x:n,filter:s,convInfo:m,backend:t});else if(m.strideWidth<=2&&l==="channelsLast"&&P().getBool("WEBGL_EXP_CONV")){let h=new Cc(m),g=[[m.padInfo.top,m.padInfo.left],[m.strideHeight,m.strideWidth],[m.dilationHeight,m.dilationWidth],[m.inHeight,m.inWidth]];f=t.runWebGLProgram(h,[n,s],"float32",g)}else if(P().getBool("WEBGL_CONV_IM2COL"))f=Ph({x:n,filter:s,convInfo:m,backend:t});else{let h=new bc(m);f=t.runWebGLProgram(h,[n,s],"float32")}let d=J({inputs:{x:f},backend:t,attrs:{shape:m.outShape}});return t.disposeIntermediateTensorInfo(f),d}var iA={kernelName:ln,backendName:"webgl",kernelFunc:iQ};var Oh=class{constructor(e){this.variableNames=["x","dy"],this.outputShape=e.filterShape;let t=e.strideHeight,o=e.strideWidth,n=e.padInfo.top,s=e.padInfo.left,a=e.dataFormat==="channelsLast";this.userCode=` + void main() { + ivec4 coords = getOutputCoords(); + int wR = coords.x; + int wC = coords.y; + int d1 = coords.z; + int d2 = coords.w; + + // Convolve x(?, ?, d1) with dy(:, :, d2) to get dw(wR, wC, d1, d2). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + + for (int b = 0; b < ${e.batchSize}; b++) { + for (int yR = 0; yR < ${e.outHeight}; yR++) { + int xR = wR + yR * ${t} - ${n}; + + if (xR < 0 || xR >= ${e.inHeight}) { + continue; + } + + for (int yC = 0; yC < ${e.outWidth}; yC++) { + int xC = wC + yC * ${o} - ${s}; + + if (xC < 0 || xC >= ${e.inWidth}) { + continue; + } + + if (${a}) { + float dyValue = getDy(b, yR, yC, d2); + float xValue = getX(b, xR, xC, d1); + dotProd += (xValue * dyValue); + } else { + float dyValue = getDy(b, d2, yR, yC); + float xValue = getX(b, d1, xR, xC); + dotProd += (xValue * dyValue); + } + + } + } + } + setOutput(dotProd); + } + `}},Mh=class{constructor(e){this.variableNames=["dy","W"],this.outputShape=e.inShape;let t=e.filterHeight,o=e.filterWidth,n=e.strideHeight,s=e.strideWidth,a=e.dataFormat==="channelsLast",i=t-1-e.padInfo.top,p=o-1-e.padInfo.left,u=a?1:2,c=a?2:3,l=a?3:1;this.userCode=` + const ivec2 pads = ivec2(${i}, ${p}); + + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords[0]; + int d1 = coords[${l}]; + + ivec2 dyCorner = ivec2(coords[${u}], coords[${c}]) - pads; + int dyRCorner = dyCorner.x; + int dyCCorner = dyCorner.y; + + // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + for (int wR = 0; wR < ${t}; wR++) { + float dyR = float(dyRCorner + wR) / ${n}.0; + + if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) { + continue; + } + int idyR = int(dyR); + + int wRPerm = ${t} - 1 - wR; + + for (int wC = 0; wC < ${o}; wC++) { + float dyC = float(dyCCorner + wC) / ${s}.0; + + if (dyC < 0.0 || dyC >= ${e.outWidth}.0 || + fract(dyC) > 0.0) { + continue; + } + int idyC = int(dyC); + + int wCPerm = ${o} - 1 - wC; + + for (int d2 = 0; d2 < ${e.outChannels}; d2++) { + + if (${a}) { + float xValue = getDy(batch, idyR, idyC, d2); + float wValue = getW(wRPerm, wCPerm, d1, d2); + dotProd += xValue * wValue; + } else { + float xValue = getDy(batch, d2, idyR, idyC); + float wValue = getW(wRPerm, wCPerm, d1, d2); + dotProd += xValue * wValue; + } + + } + } + } + setOutput(dotProd); + } + `}},Lh=class{constructor(e){this.variableNames=["x","dy"],this.outputShape=e.filterShape;let t=e.strideDepth,o=e.strideHeight,n=e.strideWidth,s=e.padInfo.front,a=e.padInfo.top,i=e.padInfo.left;this.userCode=` + void main() { + ivec5 coords = getOutputCoords(); + int wF = coords.x; + int wR = coords.y; + int wC = coords.z; + int d1 = coords.w; + int d2 = coords.u; + + float dotProd = 0.0; + + for (int b = 0; b < ${e.batchSize}; b++) { + for (int yF = 0; yF < ${e.outDepth}; yF++) { + int xF = wF + yF * ${t} - ${s}; + + if (xF < 0 || xF >= ${e.inDepth}) { + continue; + } + + for (int yR = 0; yR < ${e.outHeight}; yR++) { + int xR = wR + yR * ${o} - ${a}; + + if (xR < 0 || xR >= ${e.inHeight}) { + continue; + } + + for (int yC = 0; yC < ${e.outWidth}; yC++) { + int xC = wC + yC * ${n} - ${i}; + + if (xC < 0 || xC >= ${e.inWidth}) { + continue; + } + + float dyValue = getDy(b, yF, yR, yC, d2); + float xValue = getX(b, xF, xR, xC, d1); + dotProd += (xValue * dyValue); + } + } + } + } + setOutput(dotProd); + } + `}},Bh=class{constructor(e){this.variableNames=["dy","W"],this.outputShape=e.inShape;let t=e.filterDepth,o=e.filterHeight,n=e.filterWidth,s=e.strideDepth,a=e.strideHeight,i=e.strideWidth,p=t-1-e.padInfo.front,u=o-1-e.padInfo.top,c=n-1-e.padInfo.left;this.userCode=` + const ivec3 pads = ivec3(${p}, ${u}, ${c}); + + void main() { + ivec5 coords = getOutputCoords(); + int batch = coords.x; + int d1 = coords.u; + + + ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads; + int dyFCorner = dyCorner.x; + int dyRCorner = dyCorner.y; + int dyCCorner = dyCorner.z; + + float dotProd = 0.0; + for (int wF = 0; wF < ${t}; wF++) { + float dyF = float(dyFCorner + wF) / ${s}.0; + + if (dyF < 0.0 || dyF >= ${e.outDepth}.0 || fract(dyF) > 0.0) { + continue; + } + int idyF = int(dyF); + + int wFPerm = ${t} - 1 - wF; + + for (int wR = 0; wR < ${o}; wR++) { + float dyR = float(dyRCorner + wR) / ${a}.0; + + if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || + fract(dyR) > 0.0) { + continue; + } + int idyR = int(dyR); + + int wRPerm = ${o} - 1 - wR; + + for (int wC = 0; wC < ${n}; wC++) { + float dyC = float(dyCCorner + wC) / ${i}.0; + + if (dyC < 0.0 || dyC >= ${e.outWidth}.0 || + fract(dyC) > 0.0) { + continue; + } + int idyC = int(dyC); + + int wCPerm = ${n} - 1 - wC; + + for (int d2 = 0; d2 < ${e.outChannels}; d2++) { + float xValue = getDy(batch, idyF, idyR, idyC, d2); + float wValue = getW(wFPerm, wRPerm, wCPerm, d1, d2); + dotProd += xValue * wValue; + } + } + } + } + setOutput(dotProd); + } + `}};function uQ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,dy:s}=e,{strides:a,pad:i,dataFormat:p,dimRoundingMode:u,filterShape:c}=o,l=I.convertConv2DDataFormat(p),m=I.computeConv2DInfo(n.shape,c,a,1,i,u,!1,l),f=new Oh(m);return t.runWebGLProgram(f,[n,s],"float32")}var uA={kernelName:lp,backendName:"webgl",kernelFunc:uQ};function pQ(r){let{inputs:e,backend:t,attrs:o}=r,{dy:n,filter:s}=e,{inputShape:a,strides:i,pad:p,dataFormat:u,dimRoundingMode:c}=o,l=I.convertConv2DDataFormat(u),m=I.computeConv2DInfo(a,s.shape,i,1,p,c,!1,l),f=new Mh(m);return t.runWebGLProgram(f,[n,s],"float32")}var pA={kernelName:mn,backendName:"webgl",kernelFunc:pQ};function cQ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,filter:s}=e,{strides:a,pad:i,dilations:p}=o,u=I.computeConv3DInfo(n.shape,s.shape,a,p,i),c=new Rh(u);return t.runWebGLProgram(c,[n,s],"float32")}var cA={kernelName:mp,backendName:"webgl",kernelFunc:cQ};function lQ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,dy:s}=e,{strides:a,pad:i,filterShape:p}=o,u=I.computeConv3DInfo(n.shape,p,a,1,i),c=new Lh(u);return t.runWebGLProgram(c,[n,s],"float32")}var lA={kernelName:Dm,backendName:"webgl",kernelFunc:lQ};function mQ(r){let{inputs:e,backend:t,attrs:o}=r,{dy:n,filter:s}=e,{pad:a,strides:i,inputShape:p}=o,u=I.computeConv3DInfo(p,s.shape,i,1,a),c=new Bh(u);return t.runWebGLProgram(c,[n,s],"float32")}var mA={kernelName:fp,backendName:"webgl",kernelFunc:mQ};var fQ=jo+` + return cos(x); +`,dQ=he({opSnippet:fQ}),fA={kernelName:fn,backendName:"webgl",kernelFunc:dQ};var hQ=` + float e2x = exp(-x); + return (e2x + 1.0 / e2x) / 2.0; +`,gQ=he({opSnippet:hQ}),dA={kernelName:dn,backendName:"webgl",kernelFunc:gQ};var Vh=class{constructor(e,t,o,n,s){this.variableNames=["Image","Boxes","BoxInd"],this.outputShape=[];let[a,i,p,u]=e,[c]=t,[l,m]=o;this.outputShape=[c,l,m,u];let f=n==="bilinear"?1:0,[d,h]=[`${i-1}.0`,`${p-1}.0`],[g,y,b]=l>1?[`${(i-1)/(l-1)}`,"(y2-y1) * height_ratio",`y1*${d} + float(y)*(height_scale)`]:["0.0","0.0",`0.5 * (y1+y2) * ${d}`],[C,w,k]=m>1?[`${(p-1)/(m-1)}`,"(x2-x1) * width_ratio",`x1*${h} + float(x)*(width_scale)`]:["0.0","0.0",`0.5 * (x1+x2) * ${h}`];this.userCode=` + const float height_ratio = float(${g}); + const float width_ratio = float(${C}); + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int y = coords[1]; + int x = coords[2]; + int d = coords[3]; + + // get box vals + float y1 = getBoxes(b,0); + float x1 = getBoxes(b,1); + float y2 = getBoxes(b,2); + float x2 = getBoxes(b,3); + + // get image in batch index + int bInd = round(getBoxInd(b)); + if(bInd < 0 || bInd >= ${a}) { + return; + } + + float height_scale = ${y}; + float width_scale = ${w}; + + float in_y = ${b}; + if( in_y < 0.0 || in_y > ${d} ) { + setOutput(float(${s})); + return; + } + float in_x = ${k}; + if( in_x < 0.0 || in_x > ${h} ) { + setOutput(float(${s})); + return; + } + + vec2 sourceFracIndexCR = vec2(in_x,in_y); + if(${f} == 1) { + // Compute the four integer indices. + ivec2 sourceFloorCR = ivec2(sourceFracIndexCR); + ivec2 sourceCeilCR = ivec2(ceil(sourceFracIndexCR)); + + float topLeft = getImage(b, sourceFloorCR.y, sourceFloorCR.x, d); + float bottomLeft = getImage(b, sourceCeilCR.y, sourceFloorCR.x, d); + float topRight = getImage(b, sourceFloorCR.y, sourceCeilCR.x, d); + float bottomRight = getImage(b, sourceCeilCR.y, sourceCeilCR.x, d); + + vec2 fracCR = sourceFracIndexCR - vec2(sourceFloorCR); + + float top = topLeft + (topRight - topLeft) * fracCR.x; + float bottom = bottomLeft + (bottomRight - bottomLeft) * fracCR.x; + float newValue = top + (bottom - top) * fracCR.y; + setOutput(newValue); + } else { + // Compute the coordinators of nearest neighbor point. + ivec2 sourceNearestCR = ivec2(floor( + sourceFracIndexCR + vec2(0.5,0.5))); + float newValue = getImage(b, sourceNearestCR.y, sourceNearestCR.x, d); + setOutput(newValue); + } + } + `}};var xQ=r=>{let{inputs:e,backend:t,attrs:o}=r,{image:n,boxes:s,boxInd:a}=e,{cropSize:i,method:p,extrapolationValue:u}=o,c=new Vh(n.shape,s.shape,i,p,u);return t.runWebGLProgram(c,[n,s,a],"float32")},hA={kernelName:xn,backendName:"webgl",kernelFunc:xQ};var Bu;(function(r){r.Prod="*",r.Sum="+"})(Bu||(Bu={}));var Ml=class{constructor(e,t,o,n){this.op=e,this.outputShape=t,this.variableNames=["x"],this.customUniforms=[{name:"index",type:"float"}];let s=this.outputShape.length,a=this.op===Bu.Prod?"1.0":"0.0",i=o?a:`getX(${gA(s,"coords",this.op)})`,p=this.outputShape[this.outputShape.length-1],u="",c="";o?(u=n?`end != ${p-1}`:"end != 0",c=n?"end + 1":"end - 1"):(u=n?`end + pow2 < ${p}`:"end >= pow2",c=n?"end + pow2":"end - pow2"),this.userCode=` + void main() { + ${_e(s)} coords = getOutputCoords(); + int end = ${xA(s,"coords",this.op)}; + float val = ${i}; + int pow2 = int(pow(2.0, index)); + if (${u}) { + int idx = ${c}; + ${xA(s,"coords",this.op)} = idx; + val ${this.op}= getX(${gA(s,"coords",this.op)}); + } + setOutput(val); + } + `}};function gA(r,e,t){if(r===1)return`${e}`;if(r===2)return`${e}.x, ${e}.y`;if(r===3)return`${e}.x, ${e}.y, ${e}.z`;if(r===4)return`${e}.x, ${e}.y, ${e}.z, ${e}.w`;throw new Error(`Cumulative ${t} for rank ${r} is not yet supported`)}function xA(r,e,t){if(r===1)return`${e}`;if(r===2)return`${e}.y`;if(r===3)return`${e}.z`;if(r===4)return`${e}.w`;throw new Error(`Cumulative ${t} for rank ${r} is not yet supported`)}function zh(r,e,t,o,n,s){let a=e.shape.length,i=I.getAxesPermutation([o],a),p=e;i!=null&&(p=xt({inputs:{x:e},backend:t,attrs:{perm:i}}));let u=I.getInnerMostAxes(1,a)[0];if(u!==a-1)throw new Error(`WebGL cumprod shader expects an inner-most axis=${e.shape.length-1} but got axis=${o}`);let c=p.shape[u],l=Rt({inputs:{x:p},backend:t});for(let m=0;m<=Math.ceil(Math.log2(c))-1;m++){let f=new Ml(r,p.shape,!1,s),d=[[m]],h=l;l=t.runWebGLProgram(f,[l],l.dtype,d),t.disposeIntermediateTensorInfo(h)}if(n){let m=new Ml(r,p.shape,n,s),f=l;l=t.runWebGLProgram(m,[l],l.dtype),t.disposeIntermediateTensorInfo(f)}if(i!=null){let m=I.getUndoAxesPermutation(i),f=xt({inputs:{x:l},backend:t,attrs:{perm:m}});return t.disposeIntermediateTensorInfo(l),t.disposeIntermediateTensorInfo(p),f}return l}function yQ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s,exclusive:a,reverse:i}=o;return zh(Bu.Prod,n,t,s,a,i)}var yA={kernelName:hn,backendName:"webgl",kernelFunc:yQ};function bQ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s,exclusive:a,reverse:i}=o;return zh(Bu.Sum,n,t,s,a,i)}var bA={kernelName:gn,backendName:"webgl",kernelFunc:bQ};function CQ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,weights:s}=e,{size:a,binaryOutput:i}=o;if(n.shape.length===1){let p=t.readSync(n.dataId),u=t.readSync(s.dataId),c=oh(p,u,s.dtype,s.shape,a);return t.makeTensorInfo([a],s.dtype,c)}else if(n.shape.length===2){let p=t.bufferSync(n),u=t.bufferSync(s),c=a$(p,u,a,i);return t.makeTensorInfo(c.shape,s.dtype,c.values)}throw new Error(`Error in denseBincount: input must be at most rank 2, but got rank${n.shape.length}.`)}var CA={kernelName:dp,backendName:"webgl",kernelFunc:CQ};var Wh=class{constructor(e,t,o){this.variableNames=["x"],this.outputShape=[],this.outputShape=e,this.blockSize=t,this.dataFormat=o,this.userCode=` + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int h = ${this.getHeightCoordString()}; + int w = ${this.getWidthCoordString()}; + int d = ${this.getDepthCoordString()}; + + int in_h = h / ${t}; + int offset_h = imod(h, ${t}); + int in_w = w / ${t}; + int offset_w = imod(w, ${t}); + int offset_d = (offset_h * ${t} + offset_w) * + ${this.getOutputDepthSize()}; + int in_d = d + offset_d; + + float result = ${this.getInputSamplingString()}; + setOutput(result); + } + `}getHeightCoordString(){return this.dataFormat==="NHWC"?"coords[1]":"coords[2]"}getWidthCoordString(){return this.dataFormat==="NHWC"?"coords[2]":"coords[3]"}getDepthCoordString(){return this.dataFormat==="NHWC"?"coords[3]":"coords[1]"}getOutputDepthSize(){return this.dataFormat==="NHWC"?this.outputShape[3]:this.outputShape[1]}getInputSamplingString(){return this.dataFormat==="NHWC"?"getX(b, in_h, in_w, in_d)":"getX(b, in_d, in_h, in_w)"}};function IQ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{blockSize:s,dataFormat:a}=o,i=n.shape[0],p=a==="NHWC"?n.shape[1]:n.shape[2],u=a==="NHWC"?n.shape[2]:n.shape[3],c=a==="NHWC"?n.shape[3]:n.shape[1],l=p*s,m=u*s,f=c/(s*s),d=a==="NHWC"?[i,l,m,f]:[i,f,l,m],h=new Wh(d,s,a);return t.runWebGLProgram(h,[n],n.dtype)}var IA={kernelName:yn,backendName:"webgl",kernelFunc:IQ};var Ic=class{constructor(e,t=!1,o=null,n=!1,s=!1){this.variableNames=["x","W"],this.customUniforms=[{name:"pads",type:"ivec2"},{name:"strides",type:"ivec2"},{name:"dilations",type:"ivec2"},{name:"inDims",type:"ivec2"}],this.outputShape=e.outShape,this.enableShapeUniforms=lt(this.outputShape.length);let a=e.filterHeight,i=e.filterWidth,p=e.outChannels/e.inChannels,u="",c="";o&&(n?u=`float activation(float a) { + float b = getPreluActivationWeightsAtOutCoords(); + ${o} + }`:s?u=`float activation(float a) { + float b = getLeakyreluAlphaAtOutCoords(); + ${o} + }`:u=` + float activation(float x) { + ${o} + } + `,c="result = activation(result);");let l=t?"result += getBiasAtOutCoords();":"";t&&this.variableNames.push("bias"),n&&this.variableNames.push("preluActivationWeights"),s&&this.variableNames.push("leakyreluAlpha"),this.userCode=` + ${u} + + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords.x; + ivec2 xRCCorner = coords.yz * strides - pads; + int d2 = coords.w; + int d1 = d2 / ${p}; + int q = d2 - d1 * ${p}; + + int xRCorner = xRCCorner.x; + int xCCorner = xRCCorner.y; + + // Convolve x(?, ?, d1) with w(:, :, d1, q) to get y(yR, yC, d2). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + // TO DO(dsmilkov): Flatten the two for loops and vec4 the operations. + for (int wR = 0; wR < ${a}; wR++) { + int xR = xRCorner + wR * dilations[0]; + + if (xR < 0 || xR >= inDims[0]) { + continue; + } + + for (int wC = 0; wC < ${i}; wC++) { + int xC = xCCorner + wC * dilations[1]; + + if (xC < 0 || xC >= inDims[1]) { + continue; + } + + float xVal = getX(batch, xR, xC, d1); + float wVal = getW(wR, wC, d1, q); + dotProd += xVal * wVal; + } + } + + float result = dotProd; + ${l} + ${c} + setOutput(result); + } + `}};var wc=class{constructor(e,t=!1,o=null,n=!1,s=!1){this.variableNames=["x","W"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"pads",type:"ivec2"},{name:"strides",type:"ivec2"},{name:"dilations",type:"ivec2"},{name:"inDims",type:"ivec2"}],this.outputShape=e.outShape,this.enableShapeUniforms=lt(this.outputShape.length);let a=e.outChannels/e.inChannels,i=e.padInfo.left,p=e.strideWidth,u=e.dilationWidth,c=e.filterHeight,l=e.filterWidth,m=l,f=` + int xR; int xC; int xCOffset; + vec4 wTexel; vec4 previous; vec4 final;`;for(let y=0;y=0 && xR < inDims[0]) { + `;for(let y=0;y<(m+1)/2;y++){let b=y*2;if(f+=` + xC = xCCorner + ${b*u}; + `,p===1){if(b= 0 && xCOffset < inDims[1] && xTexelC${b}Ready == 0) { + xTexelC${b} = getX(batch, xR, xCOffset, d1); + + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xCOffset + 1 >= inDims[1]) { + xTexelC${b}.zw = vec2(0.0); + } + xTexelC${b}Ready = 1; + } + `,u===1&&b>0?f+=` + xC${b} = vec4(xTexelC${b-2}.zw, xTexelC${b}.xy); + `:f+=` + xCOffset = xC + 1 - 2; + + if (xCOffset >= 0 && xCOffset < inDims[1]) { + previous = getX(batch, xR, xCOffset, d1); + + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xCOffset + 1 >= inDims[1]) { + previous.zw = vec2(0.0); + } + + xC${b} = vec4(previous.zw, xTexelC${b}.xy); + } else { + xC${b} = vec4(0.0, 0.0, xTexelC${b}.xy); + } + `):f+=` + if (xC >= 0 && xC < inDims[1] && xTexelC${b}Ready == 0) { + xTexelC${b} = getX(batch, xR, xC, d1); + if (xC + 1 >= inDims[1]) { + xTexelC${b}.zw = vec2(0.0); + } + xTexelC${b}Ready = 1; + } + + xC${b} = xTexelC${b}; + `,b+1= 0 && xCOffset < inDims[1] && xTexelC${b+1}Ready == 0) { + xTexelC${b+1} = getX(batch, xR, xCOffset, d1); + + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xCOffset + 1 >= inDims[1]) { + xTexelC${b+1}.zw = vec2(0.0); + } + xTexelC${b+1}Ready = 1; + } + `,u>1?f+=` + xCOffset -= 2; + if (xCOffset >= 0 && xCOffset < inDims[1]) { + previous = getX(batch, xR, xCOffset, d1); + xC${b+1} = vec4(previous.zw, xTexelC${b+1}.xy); + } else { + xC${b+1} = vec4(0.0, 0.0, xTexelC${b+1}.xy); + } + `:f+=` + xC${b+1} = vec4(xTexelC${b}.zw, xTexelC${b+1}.xy); + `):C===1?f+=` + xC${b+1} = xTexelC${b}; + `:f+=` + xCOffset = xC + ${C}; + + if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${b+1}Ready == 0) { + xTexelC${b+1} = getX(batch, xR, xCOffset, d1); + if (xCOffset + 1 >= inDims[1]) { + xTexelC${b+1}.zw = vec2(0.0); + } + xTexelC${b+1}Ready = 1; + } + + xC${b+1} = xTexelC${b+1}; + `}}else b= 0 && xCOffset < inDims[1] && xTexelC${b}Ready == 0) { + xTexelC${b} = getX(batch, xR, xCOffset, d1); + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xCOffset + 1 >= inDims[1]) { + xTexelC${b}.zw = vec2(0.0); + } + xTexelC${b}Ready = 1; + } + + if(xC + 1 >= 0 && xC + 1 < inDims[1] && xTexelC${b+1}Ready == 0) { + xTexelC${b+1} = getX(batch, xR, xC + 1, d1); + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if (xC + 2 >= inDims[1]) { + xTexelC${b+1}.zw = vec2(0.0); + } + xTexelC${b+1}Ready = 1; + } + + xC${b} = vec4(xTexelC${b}.zw, xTexelC${b+1}.zw); + `,b+1= 0 && xCOffset < inDims[1]) { + final = getX(batch, xR, xCOffset, d1); + } + xC${b+1} = vec4(xTexelC${b+1}.xy, final.xy); + `)):(f+=` + if(xC >= 0 && xC < inDims[1] && xTexelC${b}Ready == 0) { + xTexelC${b} = getX(batch, xR, xC, d1); + if (xC + 1 >= inDims[1]) { + xTexelC${b}.zw = vec2(0.0); + } + xTexelC${b}Ready = 1; + } + + xCOffset = xC + strides[1]; + if(xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${b+1}Ready == 0) { + xTexelC${b+1} = getX(batch, xR, xCOffset, d1); + if (xCOffset + 1 >= inDims[1]) { + xTexelC${b+1}.zw = vec2(0.); + } + xTexelC${b+1}Ready = 1; + } + + xC${b} = vec4( + xTexelC${b}.xy, xTexelC${b+1}.xy); + `,b+1`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${a} and dilations '${c}'`);let l=I.computeConv2DInfo(n.shape,s.shape,a,c,i,u,!0),m;P().getBool("WEBGL_PACK_DEPTHWISECONV")&&l.strideWidth<=2&&l.outChannels/l.inChannels===1?m=new wc(l):m=new Ic(l);let f=[[l.padInfo.top,l.padInfo.left],[l.strideHeight,l.strideWidth],[l.dilationHeight,l.dilationWidth],[l.inHeight,l.inWidth]];return t.runWebGLProgram(m,[n,s],"float32",f)}var wA={kernelName:bn,backendName:"webgl",kernelFunc:wQ};var Uh=class{constructor(e){this.variableNames=["x","dy"],this.outputShape=e.filterShape;let t=e.strideHeight,o=e.strideWidth,n=e.padInfo.top,s=e.padInfo.left,a=e.outChannels/e.inChannels;this.userCode=` + void main() { + ivec4 coords = getOutputCoords(); + int wR = coords.x; + int wC = coords.y; + int d1 = coords.z; + int dm = coords.w; + int d2 = d1 * ${a} + dm; + + float dotProd = 0.0; + + // TO DO: Vec4 over the batch size + for (int b = 0; b < ${e.batchSize}; b++) { + for (int yR = 0; yR < ${e.outHeight}; yR++) { + int xR = wR + yR * ${t} - ${n}; + + if (xR < 0 || xR >= ${e.inHeight}) { + continue; + } + + for (int yC = 0; yC < ${e.outWidth}; yC++) { + int xC = wC + yC * ${o} - ${s}; + + if (xC < 0 || xC >= ${e.inWidth}) { + continue; + } + + float dyValue = getDy(b, yR, yC, d2); + float xValue = getX(b, xR, xC, d1); + dotProd += (xValue * dyValue); + } + } + } + setOutput(dotProd); + } + `}},Gh=class{constructor(e){this.variableNames=["dy","W"],this.outputShape=e.inShape;let t=e.filterHeight,o=e.filterWidth,n=e.strideHeight,s=e.strideWidth,a=t-1-e.padInfo.top,i=o-1-e.padInfo.left,p=e.outChannels/e.inChannels;this.userCode=` + const ivec2 pads = ivec2(${a}, ${i}); + + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords[0]; + int d1 = coords[3]; + ivec2 dyCorner = coords.yz - pads; + int dyRCorner = dyCorner.x; + int dyCCorner = dyCorner.y; + + float dotProd = 0.0; + + for (int wR = 0; wR < ${t}; wR++) { + float dyR = float(dyRCorner + wR) / ${n}.0; + + if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) { + continue; + } + int idyR = int(dyR); + + int wRPerm = ${t} - 1 - wR; + + for (int wC = 0; wC < ${o}; wC++) { + float dyC = float(dyCCorner + wC) / ${s}.0; + + if (dyC < 0.0 || dyC >= ${e.outWidth}.0 || + fract(dyC) > 0.0) { + continue; + } + int idyC = int(dyC); + + int wCPerm = ${o} - 1 - wC; + + // TO DO: Vec4 over the channelMul + for (int dm = 0; dm < ${p}; dm++) { + int d2 = d1 * ${p} + dm; + float xValue = getDy(batch, idyR, idyC, d2); + float wValue = getW(wRPerm, wCPerm, d1, dm); + dotProd += xValue * wValue; + } + } + } + setOutput(dotProd); + } + `}};function SQ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,dy:s}=e,{strides:a,dilations:i,pad:p,dimRoundingMode:u,filterShape:c}=o,l=I.computeConv2DInfo(n.shape,c,a,i,p,u,!0),m=new Uh(l);return t.runWebGLProgram(m,[n,s],"float32")}var SA={kernelName:hp,backendName:"webgl",kernelFunc:SQ};function vQ(r){let{inputs:e,backend:t,attrs:o}=r,{dy:n,filter:s}=e,{strides:a,dilations:i,pad:p,dimRoundingMode:u,inputShape:c}=o,l=I.computeConv2DInfo(c,s.shape,a,i,p,u,!0),m=new Gh(l);return t.runWebGLProgram(m,[n,s],"float32")}var vA={kernelName:gp,backendName:"webgl",kernelFunc:vQ};var Hh=class{constructor(e){this.variableNames=["X"],this.outputShape=[e,e],this.userCode=` + void main() { + ivec2 coords = getOutputCoords(); + float val = coords[0] == coords[1] ? getX(coords[0]) : 0.0; + setOutput(val); + } + `}};function kQ(r){let{inputs:e,backend:t}=r,{x:o}=e,n=[...o.shape,...o.shape],s=x.sizeFromShape(o.shape),a=J({inputs:{x:o},backend:t,attrs:{shape:[s]}}),i=new Hh(s),p=t.runWebGLProgram(i,[a],a.dtype),u=J({inputs:{x:p},backend:t,attrs:{shape:n}});return t.disposeIntermediateTensorInfo(a),t.disposeIntermediateTensorInfo(p),u}var kA={kernelName:xp,backendName:"webgl",kernelFunc:kQ};var qh=class{constructor(e){this.variableNames=["x","W"],this.outputShape=e.outShape;let{inHeight:t,inWidth:o,padInfo:n,strideHeight:s,strideWidth:a,filterHeight:i,filterWidth:p,dilationHeight:u,dilationWidth:c}=e,{top:l,left:m}=n;this.userCode=` + const ivec2 strides = ivec2(${s}, ${a}); + const ivec2 pads = ivec2(${l}, ${m}); + const float neg_infinity = -3.4e38; + + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords.x; + int d1 = coords.w; + ivec2 outTopLeftCorner = + coords.yz * strides - pads; + int hBeg = outTopLeftCorner.x; + int wBeg = outTopLeftCorner.y; + + float curVal = neg_infinity; + for (int h = 0; h < ${i}; h++) { + int hIn = hBeg + h * ${u}; + + if (hIn >= 0 && hIn < ${t}) { + for (int w = 0; w < ${p}; w++) { + int wIn = wBeg + w * ${c}; + + if (wIn >= 0 && wIn < ${o}) { + float xVal = getX(batch, hIn, wIn, d1); + float wVal = getW(h, w, d1); + + float val = xVal + wVal; + if (val > curVal) { + curVal = val; + } + } + } + } + } + + float result = curVal; + setOutput(result); + } + `}};function TQ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,filter:s}=e,{strides:a,pad:i,dilations:p}=o,u=I.computeDilation2DInfo(n.shape,s.shape,a,i,"NHWC",p),c,l=new qh(u);c=t.runWebGLProgram(l,[n,s],"float32");let m=J({inputs:{x:c},backend:t,attrs:{shape:u.outShape}});return t.disposeIntermediateTensorInfo(c),m}var TA={kernelName:yp,backendName:"webgl",kernelFunc:TQ};function NQ(r){let{inputs:e,backend:t,attrs:o}=r,{equation:n}=o,s=e,{allDims:a,summedDims:i,idDims:p}=I.decodeEinsumEquation(n,s.length);I.checkEinsumDimSizes(a.length,p,s);let{path:u,steps:c}=I.getEinsumComputePath(i,p),l=c.length,m=null,f=a.length,d=[];for(let h=0;h=0&&(m=Ou({inputs:{x:m},backend:t,attrs:{axis:u[h]-(a.length-f),keepDims:!1}}),d.push(m)),f--)}for(let h of d)h!==m&&t.disposeIntermediateTensorInfo(h);return m}var NA={kernelName:Xa,backendName:"webgl",kernelFunc:NQ};var _Q="return (x >= 0.0) ? x : (exp(x) - 1.0);",EQ=` + vec4 result; + + result.r = (x.r >= 0.0) ? x.r : (exp(x.r) - 1.0); + result.g = (x.g >= 0.0) ? x.g : (exp(x.g) - 1.0); + result.b = (x.b >= 0.0) ? x.b : (exp(x.b) - 1.0); + result.a = (x.a >= 0.0) ? x.a : (exp(x.a) - 1.0); + + return result; +`,$Q=he({opSnippet:_Q,packedOpSnippet:EQ}),_A={kernelName:In,backendName:"webgl",kernelFunc:$Q};var RQ="return (b >= 1.0) ? a : a * (b + 1.0);",AQ=` + vec4 bGTEZero = vec4(greaterThanEqual(b, vec4(0.))); + return (bGTEZero * a) + ((vec4(1.0) - bGTEZero) * (a * (b + vec4(1.0)))); +`,FQ=r=>{let{inputs:e,backend:t}=r,{dy:o,y:n}=e,s=P().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new Ko(AQ,o.shape,n.shape):new _o(RQ,o.shape,n.shape);return t.runWebGLProgram(s,[o,n],o.dtype)},EA={kernelName:Pm,backendName:"webgl",kernelFunc:FQ};var DQ=` + return vec4(equal(a, b)); +`,PQ="return float(a == b);",OQ=ot({opSnippet:PQ,packedOpSnippet:DQ,dtype:"bool",cpuKernelImpl:c$}),$A={kernelName:oo,backendName:"webgl",kernelFunc:OQ};var MQ=` + // Error function is calculated approximately with elementary function. + // See "Handbook of Mathematical Functions with Formulas, + // Graphs, and Mathematical Tables", Abramowitz and Stegun. + float p = ${I.ERF_P}; + float a1 = ${I.ERF_A1}; + float a2 = ${I.ERF_A2}; + float a3 = ${I.ERF_A3}; + float a4 = ${I.ERF_A4}; + float a5 = ${I.ERF_A5}; + + float sign = sign(x); + x = abs(x); + float t = 1.0 / (1.0 + p * x); + return sign * (1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*exp(-x*x)); +`,LQ=he({opSnippet:MQ}),RA={kernelName:Gi,backendName:"webgl",kernelFunc:LQ};var BQ=jo+` + return exp(x); +`,VQ=` + vec4 result = exp(x); + bvec4 isNaN = isnan(x); + result.r = isNaN.r ? x.r : result.r; + result.g = isNaN.g ? x.g : result.g; + result.b = isNaN.b ? x.b : result.b; + result.a = isNaN.a ? x.a : result.a; + + return result; +`,Ow=he({opSnippet:BQ,packedOpSnippet:VQ,cpuKernelImpl:l$,dtype:"float32"}),AA={kernelName:no,backendName:"webgl",kernelFunc:Ow};function Kh(r){let{inputs:e,attrs:t,backend:o}=r,{dim:n}=t,{input:s}=e,a=s.shape.length,i=s.shape.slice(),p=n;return n<0&&(x.assert(-(a+1)<=n,()=>`Axis must be in the interval [${-(a+1)}, ${a}]`),p=a+n+1),i.splice(p,0,1),J({inputs:{x:s},backend:o,attrs:{shape:i}})}var FA={kernelName:xs,backendName:"webgl",kernelFunc:Kh};var DA="return exp(x) - 1.0;",zQ=he({opSnippet:DA,packedOpSnippet:DA,cpuKernelImpl:m$}),PA={kernelName:wn,backendName:"webgl",kernelFunc:zQ};var Ll=class{constructor(e,t,o){this.variableNames=["real","imag"];let n=t[1];this.outputShape=t;let s=o?`2.0 * ${Math.PI}`:`-2.0 * ${Math.PI}`,a=o?`${n}.0`:"1.0",i;if(e==="real")i="return real * expR - imag * expI;";else if(e==="imag")i="return real * expI + imag * expR;";else throw new Error(`FFT component must be either "real" or "imag", got ${e}.`);this.userCode=` + const float exponentMultiplier = ${s}; + + float unaryOpComplex(float real, float expR, float imag, float expI) { + ${i} + } + + float mulMatDFT(int batch, int index) { + float indexRatio = float(index) / float(${n}); + float exponentMultiplierTimesIndexRatio = + exponentMultiplier * indexRatio; + + float result = 0.0; + + for (int i = 0; i < ${n}; i++) { + // x = (-2|2 * PI / N) * index * i; + float x = exponentMultiplierTimesIndexRatio * float(i); + float expR = cos(x); + float expI = sin(x); + float real = getReal(batch, i); + float imag = getImag(batch, i); + + result += + unaryOpComplex(real, expR, imag, expI) / ${a}; + } + + return result; + } + + void main() { + ivec2 coords = getOutputCoords(); + setOutput(mulMatDFT(coords[0], coords[1])); + } + `}};function jh(r,e,t){let o=t.texData.get(r.dataId),n=x.sizeFromShape(r.shape),s=r.shape[r.shape.length-1],a=n/s,i=J({inputs:{x:r},backend:t,attrs:{shape:[a,s]}}),p=i.shape,u=new Ll("real",p,e),c=new Ll("imag",p,e),l=[{dataId:o.complexTensorInfos.real.dataId,dtype:o.complexTensorInfos.real.dtype,shape:p},{dataId:o.complexTensorInfos.imag.dataId,dtype:o.complexTensorInfos.imag.dtype,shape:p}],m=t.runWebGLProgram(u,l,"float32"),f=t.runWebGLProgram(c,l,"float32"),d=Ar({inputs:{real:m,imag:f},backend:t});t.disposeIntermediateTensorInfo(m),t.disposeIntermediateTensorInfo(f);let h=J({inputs:{x:d},backend:t,attrs:{shape:r.shape}});return t.disposeIntermediateTensorInfo(i),t.disposeIntermediateTensorInfo(d),h}function WQ(r){let{inputs:e,backend:t}=r,{input:o}=e;return jh(o,!1,t)}var OA={kernelName:bp,backendName:"webgl",kernelFunc:WQ};var Xh=class{constructor(e,t){this.outputShape=[],this.customUniforms=[{name:"value",type:"float"}],this.variableNames=["x"],this.outputShape=e,this.userCode=` + void main() { + // Input can be obtained from uniform value. + setOutput(value); + } + `}};function Ba(r){let{backend:e,attrs:t}=r,{shape:o,value:n}=t,{dtype:s}=t;if(s=s||x.inferDtype(n),s==="string"){let a=x.getArrayFromDType(s,x.sizeFromShape(o));return a.fill(n),e.makeTensorInfo(o,s,a)}else{let a=new Xh(o,n),i=[[n]];return e.runWebGLProgram(a,[],s,i)}}var MA={kernelName:ys,backendName:"webgl",kernelFunc:Ba};var Yh=class{constructor(e){this.variableNames=["Image"],this.outputShape=[];let t=e[2];this.outputShape=e,this.userCode=` + void main() { + ivec4 coords = getOutputCoords(); + int x = coords[2]; + + int coordX = ${t} - x - 1; + float outputValue; + if(coordX >= 0 && coordX < ${t}) { + outputValue = getImage(coords[0], coords[1], coordX, coords[3]); + } else { + outputValue = getImage(coords[0], coords[1], coords[2], coords[3]); + } + setOutput(outputValue); + } + `}};var LA={kernelName:Sn,backendName:"webgl",kernelFunc:({inputs:r,backend:e})=>{let{image:t}=r,o=e,n=new Yh(t.shape);return o.runWebGLProgram(n,[t],t.dtype)}};var BA="return floor(x);",UQ=he({opSnippet:BA,packedOpSnippet:BA,cpuKernelImpl:f$}),VA={kernelName:so,backendName:"webgl",kernelFunc:UQ};var GQ=` + float s = sign(a) * sign(b); + int ia = round(a); + int ib = round(b); + if (ib != 0) { + // Windows (D3D) wants guaranteed non-zero int division at compile-time. + return float(idiv(ia, ib, s)); + } else { + return NAN; + } +`,HQ=` + ivec4 ia = round(a); + ivec4 ib = round(b); + bvec4 cond = notEqual(ib, ivec4(0)); + ivec4 result = ivec4(0); + vec4 s = sign(a) * sign(b); + + // Windows (D3D) wants guaranteed non-zero int division at compile-time. + if (cond[0]) { + result[0] = idiv(ia[0], ib[0], s[0]); + } + if (cond[1]) { + result[1] = idiv(ia[1], ib[1], s[1]); + } + if (cond[2]) { + result[2] = idiv(ia[2], ib[2], s[2]); + } + if (cond[3]) { + result[3] = idiv(ia[3], ib[3], s[3]); + } + return vec4(result); +`,qQ=ot({opSnippet:GQ,packedOpSnippet:HQ,dtype:"int32"}),zA={kernelName:vn,backendName:"webgl",kernelFunc:qQ};var Qh=class{constructor(e){this.variableNames=["A"];let t=Ct(),[o,n]=e;this.outputShape=e,this.userCode=` + void main() { + ivec3 coords = getOutputCoords(); + int texR = coords[0]; + int texC = coords[1]; + int depth = coords[2]; + vec2 uv = (vec2(texC, texR) + halfCR) / vec2(${n}.0, ${o}.0); + + vec4 values = ${t.texture2D}(A, uv); + float value; + if (depth == 0) { + value = values.r; + } else if (depth == 1) { + value = values.g; + } else if (depth == 2) { + value = values.b; + } else if (depth == 3) { + value = values.a; + } + + setOutput(floor(value * 255.0 + 0.5)); + } + `}};var Zh=class{constructor(e){this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0;let t=Ct(),[o,n]=e;this.outputShape=e,this.userCode=` + void main() { + ivec3 coords = getOutputCoords(); + int texR = coords[0]; + int texC = coords[1]; + int depth = coords[2]; + + vec4 result = vec4(0.); + + for(int row=0; row<=1; row++) { + for(int col=0; col<=1; col++) { + texC = coords[1] + row; + depth = coords[2] + col; + + vec2 uv = (vec2(texC, texR) + halfCR) / + vec2(${n}.0, ${o}.0); + vec4 values = ${t.texture2D}(A, uv); + float value; + if (depth == 0) { + value = values.r; + } else if (depth == 1) { + value = values.g; + } else if (depth == 2) { + value = values.b; + } else if (depth == 3) { + value = values.a; + } + + result[row * 2 + col] = floor(value * 255.0 + 0.5); + } + } + + ${t.output} = result; + } + `}};var WA={kernelName:Zi,backendName:"webgl",kernelFunc:KQ},Sc,Mw=P().getBool("CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU");function KQ(r){let{inputs:e,backend:t,attrs:o}=r,{pixels:n}=e,{numChannels:s}=o,a=typeof HTMLVideoElement!="undefined"&&n instanceof HTMLVideoElement,i=typeof HTMLImageElement!="undefined"&&n instanceof HTMLImageElement,[p,u]=a?[n.videoWidth,n.videoHeight]:[n.width,n.height],c=[u,p],l=[u,p,s];if(i||a){let h=P().getBool("CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU");(Sc==null||h!==Mw)&&(Mw=h,Sc=document.createElement("canvas").getContext("2d",{willReadFrequently:Mw})),Sc.canvas.width=p,Sc.canvas.height=u,Sc.drawImage(n,0,0,p,u),n=Sc.canvas}let m=t.makeTensorInfo(c,"int32");t.texData.get(m.dataId).usage=ir.PIXELS,t.gpgpu.uploadPixelDataToTexture(t.getTexture(m.dataId),n);let f=P().getBool("WEBGL_PACK")?new Zh(l):new Qh(l),d=t.runWebGLProgram(f,[m],"int32");return t.disposeData(m.dataId),d}function jQ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,filter:s,bias:a,preluActivationWeights:i}=e,{strides:p,pad:u,dataFormat:c,dilations:l,dimRoundingMode:m,activation:f,leakyreluAlpha:d}=o,h=I.convertConv2DDataFormat(c),g=I.computeConv2DInfo(n.shape,s.shape,p,l,u,m,!1,h),y,b=[],C=a!=null,w=i!=null,k=f==="leakyrelu",_=()=>{let R=[n,s],A=(D,O)=>{if(O==="NCHW"&&D.shape.length===1&&D.shape[0]!==1){let M=J({inputs:{x:D},backend:t,attrs:{shape:[D.shape[0],1,1]}});return b.push(M),M}return D};if(C&&R.push(A(a,c)),w&&R.push(A(i,c)),k){let D=t.makeTensorInfo([],"float32",x.createScalarValue(d,"float32"));R.push(D),b.push(D)}return R};if(g.filterHeight===1&&g.filterWidth===1&&g.dilationHeight===1&&g.dilationWidth===1&&g.strideHeight===1&&g.strideWidth===1&&(g.padInfo.type==="SAME"||g.padInfo.type==="VALID"))y=Dh({x:n,filter:s,convInfo:g,backend:t,bias:a,activation:f,preluActivationWeights:i,leakyreluAlpha:d});else if(g.strideWidth<=2&&h==="channelsLast"&&P().getBool("WEBGL_EXP_CONV")){let R=f?Ma(f,!0):null,A=new Cc(g,C,R,w,k),D=[[g.padInfo.top,g.padInfo.left],[g.strideHeight,g.strideWidth],[g.dilationHeight,g.dilationWidth],[g.inHeight,g.inWidth]],O=_();y=t.runWebGLProgram(A,O,"float32",D)}else if(P().getBool("WEBGL_CONV_IM2COL"))y=Ph({x:n,filter:s,convInfo:g,backend:t,bias:a,activation:f,preluActivationWeights:i,leakyreluAlpha:d});else{let R=f?Ma(f,!1):null,A=new bc(g,C,R,w,k),D=_();y=t.runWebGLProgram(A,D,"float32")}let E=J({inputs:{x:y},backend:t,attrs:{shape:g.outShape}});return b.push(y),b.forEach(R=>t.disposeIntermediateTensorInfo(R)),E}var UA={kernelName:Do,backendName:"webgl",kernelFunc:jQ};function XQ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,filter:s,bias:a,preluActivationWeights:i}=e,{strides:p,pad:u,dilations:c,dimRoundingMode:l,activation:m,leakyreluAlpha:f}=o,d=[],h=c;h==null&&(h=[1,1]),x.assert(I.eitherStridesOrDilationsAreOne(p,h),()=>`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${p} and dilations '${h}'`);let g=I.computeConv2DInfo(n.shape,s.shape,p,h,u,l,!0),y=P().getBool("WEBGL_PACK_DEPTHWISECONV")&&g.strideWidth<=2&&g.outChannels/g.inChannels===1,b=m?Ma(m,y):null,C=[n,s],w=a!=null,k=i!=null,_=m==="leakyrelu";if(w&&C.push(a),k&&C.push(i),_){let D=t.makeTensorInfo([],"float32",x.createScalarValue(f,"float32"));C.push(D),d.push(D)}let E;y?E=new wc(g,w,b,k,_):E=new Ic(g,w,b,k,_);let R=[[g.padInfo.top,g.padInfo.left],[g.strideHeight,g.strideWidth],[g.dilationHeight,g.dilationWidth],[g.inHeight,g.inWidth]],A=t.runWebGLProgram(E,C,"float32",R);return d.forEach(D=>t.disposeIntermediateTensorInfo(D)),A}var GA={kernelName:Po,backendName:"webgl",kernelFunc:XQ};var Jh=class{constructor(e,t,o,n){this.sliceDim=e,this.strides=t,this.paramsShape=n,this.variableNames=["x","indices"],this.outputShape=o;let s=_e(o.length),a=` + int index;`;for(let i=0;i= ${this.paramsShape[i]}; + flattenIndex += index * ${this.strides[i]};`;this.userCode=` + void main() { + ${s} coords = getOutputCoords(); + int flattenIndex = 0; + bool out_of_bounds = false; + + ${a} + + setOutput(out_of_bounds ? 0.0 : getX(flattenIndex, coords[1])); + } + `}};function YQ(r){let{inputs:e,backend:t}=r,{params:o,indices:n}=e,s=n.shape,a=s[s.length-1],i=x.sizeFromShape(o.shape),[p,u,c,l]=I.prepareAndValidate(o,n),m=J({inputs:{x:n},backend:t,attrs:{shape:[u,a]}}),f=J({inputs:{x:o},backend:t,attrs:{shape:[x.sizeFromShape(o.shape)/c,c]}});if(t.shouldExecuteOnCPU([o,n])||o.dtype==="string"){let y=t.readSync(n.dataId),b=t.bufferSync(o),C=d$(y,b,o.dtype,u,a,c,l,o.shape,i);return t.makeTensorInfo(p,o.dtype,C.values)}let d=new Jh(a,l,[u,c],o.shape),h=t.runWebGLProgram(d,[f,m],f.dtype),g=J({inputs:{x:h},backend:t,attrs:{shape:p}});return t.disposeIntermediateTensorInfo(m),t.disposeIntermediateTensorInfo(f),t.disposeIntermediateTensorInfo(h),g}var HA={kernelName:Tn,backendName:"webgl",kernelFunc:YQ};var eg=class{constructor(e,t){this.variableNames=["A","indices"],this.outputShape=t,this.rank=t.length;let o=_e(this.rank),n=QQ(e,2);this.userCode=` + void main() { + ${o} resRC = getOutputCoords(); + int index = int(getIndices(resRC.x, resRC.z)); + float inBounds = (index >= 0) && (index < ${e[2]}) ? 1.0 : 0.0; + setOutput(inBounds * getA(${n})); + } + `}};function QQ(r,e){let t=["resRC.x","resRC.y","resRC.z","resRC.w"],o=[];for(let n=0;n=0,()=>`GatherV2: the index value ${k} is not in [0, ${C-1}]`)}}let u=I.segment_util.collectGatherOpShapeInfo(n,s,p,i),c=x.sizeFromShape(s.shape),l=[],m=J({inputs:{x:n},backend:t,attrs:{shape:[u.batchSize,u.outerSize,u.dimSize,u.sliceSize]}}),f=J({inputs:{x:s},backend:t,attrs:{shape:[u.batchSize,c/u.batchSize]}});l.push(m),l.push(f);let d=[u.batchSize,u.outerSize,c/u.batchSize,u.sliceSize];if(t.shouldExecuteOnCPU([n,s])||n.dtype==="string"){let b=t.bufferSync(f),C=t.bufferSync(m),w=h$(C,b,d);return l.forEach(k=>t.disposeIntermediateTensorInfo(k)),t.makeTensorInfo(u.outputShape,w.dtype,w.values)}let h=new eg(m.shape,d),g=t.runWebGLProgram(h,[m,f],m.dtype);l.push(g);let y=J({inputs:{x:g},backend:t,attrs:{shape:u.outputShape}});return l.forEach(b=>t.disposeIntermediateTensorInfo(b)),y}var qA={kernelName:bs,backendName:"webgl",kernelFunc:Lw};var ZQ="return float(a > b);",JQ=` + return vec4(greaterThan(a, b)); +`,e7=ot({opSnippet:ZQ,packedOpSnippet:JQ,cpuKernelImpl:g$,dtype:"bool"}),KA={kernelName:ao,backendName:"webgl",kernelFunc:e7};var t7="return float(a >= b);",r7=` + return vec4(greaterThanEqual(a, b)); +`,o7=ot({opSnippet:t7,packedOpSnippet:r7,dtype:"bool",cpuKernelImpl:x$}),jA={kernelName:io,backendName:"webgl",kernelFunc:o7};function n7(r){let{inputs:e,backend:t}=r,{input:o}=e;return jh(o,!0,t)}var XA={kernelName:Cp,backendName:"webgl",kernelFunc:n7};var s7="return float(!isnan(x) && !isinf(x));",a7=he({opSnippet:s7,dtype:"bool"}),YA={kernelName:Hi,backendName:"webgl",kernelFunc:a7};var i7="return float(isinf(x));",u7=he({opSnippet:i7,dtype:"bool"}),QA={kernelName:qi,backendName:"webgl",kernelFunc:u7};var p7="return float(isnan(x));",c7=he({opSnippet:p7,dtype:"bool"}),ZA={kernelName:ia,backendName:"webgl",kernelFunc:c7};var l7="return float(a < b);",m7=` + return vec4(lessThan(a, b)); +`,f7=ot({opSnippet:l7,packedOpSnippet:m7,cpuKernelImpl:y$,dtype:"bool"}),JA={kernelName:po,backendName:"webgl",kernelFunc:f7};var d7="return float(a <= b);",h7=` + return vec4(lessThanEqual(a, b)); +`,g7=ot({opSnippet:d7,packedOpSnippet:h7,cpuKernelImpl:b$,dtype:"bool"}),eF={kernelName:co,backendName:"webgl",kernelFunc:g7};function x7(r){let{backend:e,attrs:t}=r,{start:o,stop:n,num:s}=t,a=C$(o,n,s);return e.makeTensorInfo([a.length],"float32",a)}var tF={kernelName:Ip,backendName:"webgl",kernelFunc:x7};var y7=jo+` + return x < 0.0 ? 0./0. : log(x); +`,b7=` + vec4 result = log(x); + bvec4 isNaN = isnan(x); + result.r = isNaN.r ? x.r : (x.r < 0.0 ? 0./0. : result.r); + result.g = isNaN.g ? x.g : (x.g < 0.0 ? 0./0. : result.g); + result.b = isNaN.b ? x.b : (x.b < 0.0 ? 0./0. : result.b); + result.a = isNaN.a ? x.a : (x.a < 0.0 ? 0./0. : result.a); + return result; +`,C7=he({opSnippet:y7,packedOpSnippet:b7,cpuKernelImpl:I$}),rF={kernelName:lo,backendName:"webgl",kernelFunc:C7};var I7=jo+` + return log(1.0 + x); +`,w7=he({opSnippet:I7}),oF={kernelName:Ki,backendName:"webgl",kernelFunc:w7};var S7="return float(a >= 1.0 && b >= 1.0);",v7=` + return vec4( + vec4(greaterThanEqual(a, vec4(1.0))) * + vec4(greaterThanEqual(b, vec4(1.0)))); +`,k7=ot({opSnippet:S7,packedOpSnippet:v7,dtype:"bool"}),nF={kernelName:_n,backendName:"webgl",kernelFunc:k7};var T7="return float(!(x >= 1.0));",N7=he({opSnippet:T7}),sF={kernelName:En,backendName:"webgl",kernelFunc:N7};var _7="return float(a >= 1.0 || b >= 1.0);",E7=` + return min( + vec4(greaterThanEqual(a, vec4(1.0))) + + vec4(greaterThanEqual(b, vec4(1.0))), + vec4(1.0)); +`,$7=ot({opSnippet:_7,packedOpSnippet:E7,dtype:"bool"}),aF={kernelName:ua,backendName:"webgl",kernelFunc:$7};var tg=class{constructor(e,t,o,n,s){this.variableNames=["x"],this.outputShape=[];let a=t,i=e[3]-1;this.outputShape=e;let p,u=`float(${o}) + float(${n}) * sum`;s===.5?p=`inversesqrt(${u})`:s===1?p=`1.0/(${u})`:p=`exp(log(${u}) * float(-${s}));`,this.userCode=` + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int r = coords[1]; + int c = coords[2]; + int d = coords[3]; + float x = getX(b, r, c, d); + float sum = 0.0; + for (int j = -${a}; j <= ${a}; j++) { + int idx = d + j; + if (idx >= 0 && idx <= ${i}) { + float z = getX(b, r, c, idx); + sum += z * z; + } + } + float val = x * ${p}; + setOutput(val); + } + `}};var rg=class{constructor(e,t,o,n,s){this.variableNames=["x"],this.outputShape=[],this.packedInputs=!0,this.packedOutput=!0;let a=t,i=e[3]-1;this.outputShape=e;let p,u=`float(${o}) + float(${n}) * sum`;s===.5?p=`inversesqrt(${u})`:s===1?p=`1.0/(${u})`:p=`exp(log(${u}) * float(-${s}));`,this.userCode=` + void main() { + ivec4 coords = getOutputCoords(); + int b = coords.x; + int r = coords.y; + int c = coords.z; + int d = coords.w; + + bool hasNextCol = d < ${this.outputShape[3]}; + bool hasNextRow = c < ${this.outputShape[2]}; + + vec4 sum = vec4(0.); + vec4 xFragAtOutputCoords = getX(b, r, c, d); + + vec4 xAtOutputCoords = vec4( + getChannel(xFragAtOutputCoords, vec2(c, d)), + hasNextCol ? + getChannel(xFragAtOutputCoords, vec2(c, d + 1)) : 0.0, + hasNextRow ? + getChannel(xFragAtOutputCoords , vec2(c + 1, d)) : 0.0, + (hasNextRow && hasNextCol) ? + getChannel(xFragAtOutputCoords, vec2(c + 1, d + 1)) : 0.0 + ); + + int firstChannel = d - ${a}; + vec2 cache = vec2(0.); + if(firstChannel >= 0){ + vec4 firstChannelFrag = getX(b, r, c, firstChannel); + cache.x = getChannel(firstChannelFrag, vec2(c, firstChannel)); + if(hasNextRow){ + cache.y = getChannel(firstChannelFrag, vec2(c + 1, firstChannel)); + } + } + + ivec2 depth = ivec2(d, d + 1); + for (int j = - ${a}; j <= ${a}; j++) { + ivec2 idx = depth + j; + bvec2 aboveLowerBound = greaterThanEqual(idx, ivec2(0)); + bvec2 belowUpperBound = lessThanEqual(idx, ivec2(${i})); + + bool depthInRange = aboveLowerBound.x && belowUpperBound.x; + bool depthPlusOneInRange = aboveLowerBound.y && belowUpperBound.y; + + if(depthInRange || depthPlusOneInRange){ + vec4 z = vec4(0.); + vec4 xFragAtCurrentDepth; + z.xz = cache.xy; + if(depthPlusOneInRange && hasNextCol){ + xFragAtCurrentDepth = idx.y != d ? + getX(b, r, c, idx.y) : xFragAtOutputCoords; + z.y = getChannel(xFragAtCurrentDepth, vec2(c, idx.y)); + if(hasNextRow){ + z.w = getChannel(xFragAtCurrentDepth, vec2(c + 1, idx.y)); + } + } + cache.xy = z.yw; + sum += z * z; + } + } + vec4 result = xAtOutputCoords * ${p}; + setOutput(result); + } + `}};var R7=r=>{let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{depthRadius:s,bias:a,alpha:i,beta:p}=o,u=P().getBool("WEBGL_PACK_NORMALIZATION")?new rg(n.shape,s,a,i,p):new tg(n.shape,s,a,i,p);return t.runWebGLProgram(u,[n],n.dtype)},iF={kernelName:wp,backendName:"webgl",kernelFunc:R7};var og=class{constructor(e,t,o,n,s){this.variableNames=["inputImage","outputImage","dy"],this.outputShape=[],this.outputShape=e,this.depth=e[3],this.depthRadius=t,this.bias=o,this.alpha=n,this.beta=s,this.userCode=` + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int r = coords[1]; + int c = coords[2]; + + float result = 0.0; + for (int d = 0; d < ${this.depth}; ++d) { + int depthBegin = int(max(0.0, float(d - ${t}))); + int depthEnd = int(min(float(${this.depth}), + float(d + ${t} + 1))); + + const int MIN_DEPTH_BEGIN = 0; + const int MAX_DEPTH_END = ${this.depth}; + + float norm = 0.0; + for (int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k) { + if (k < depthBegin){ + continue; + } + else if (k >= depthBegin && k < depthEnd) { + norm += getInputImage(b, r, c, k) * getInputImage(b, r, c, k); + } + else { + break; + } + } + + norm = float(${n}) * norm + float(${o}); + + for(int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k){ + if (k < depthBegin){ + continue; + } + else if (k >= depthBegin && k < depthEnd){ + float dyi = -2.0 * float(${n}) + * float(${s}) + * getInputImage(b ,r ,c, k) * getOutputImage(b, r, c, d) + / norm; + if (k == d) { + dyi += pow(norm, -1.0 * ${s}); + } + if (k == coords[3]) { + dyi *= getDy(b, r, c, d); + result += dyi; + } + } + else { + break; + } + } + } + setOutput(result); + } + `}};var A7=r=>{let{inputs:e,backend:t,attrs:o}=r,{x:n,y:s,dy:a}=e,{depthRadius:i,bias:p,alpha:u,beta:c}=o,l=new og(n.shape,i,p,u,c);return t.runWebGLProgram(l,[n,s,a],n.dtype)},uF={kernelName:Om,backendName:"webgl",kernelFunc:A7};function pF(r,e,t,o){let n=x.sizeFromShape(e),a=x.sizeFromShape(r.shape)/n,i=J({inputs:{x:r},attrs:{shape:[a,n]},backend:o}),p=qr(i,r.dtype,"max",o),u=J({inputs:{x:p},attrs:{shape:t},backend:o});return o.disposeIntermediateTensorInfo(i),o.disposeIntermediateTensorInfo(p),u}function Bw(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{reductionIndices:s,keepDims:a}=o,i=n.shape.length,p=x.parseAxisParam(s,n.shape),u=p,c=I.getAxesPermutation(u,i),l=c!=null,m=t.shouldExecuteOnCPU([n]),f=n;if(l){if(m){let C=t.texData.get(f.dataId).values,w=new Array(i);for(let E=0;E`Error in maxPool: Either strides or dilations must be 1. Got strides ${a} and dilations '${u}'`);let c=I.computePool2DInfo(n.shape,s,a,u,i,p);if(c.filterWidth===1&&c.filterHeight===1&&x.arraysEqual(c.inShape,c.outShape))return Rt({inputs:{x:n},backend:t});let l=new us(c,"max",!1);return t.runWebGLProgram(l,[n],n.dtype)}var mF={kernelName:Rn,backendName:"webgl",kernelFunc:O7};function M7(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{filterSize:s,strides:a,pad:i,dataFormat:p,dimRoundingMode:u}=o,c=[1,1,1],l=I.computePool3DInfo(n.shape,s,a,c,i,u,p),m=new Ei(l,"max",!1);return t.runWebGLProgram(m,[n],n.dtype)}var fF={kernelName:Sp,backendName:"webgl",kernelFunc:M7};var ng=class{constructor(e){this.variableNames=["dy","maxPos"],this.outputShape=e.inShape;let t=e.strideHeight,o=e.strideWidth,n=e.dilationHeight,s=e.effectiveFilterHeight,a=e.effectiveFilterWidth,i=s-1-e.padInfo.top,p=a-1-e.padInfo.left,u=s*a-1;this.userCode=` + const ivec2 pads = ivec2(${i}, ${p}); + + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + + ivec2 dyRCCorner = coords.yz - pads; + int dyRCorner = dyRCCorner.x; + int dyCCorner = dyRCCorner.y; + + // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + for (int wR = 0; wR < ${s}; + wR += ${n}) { + float dyR = float(dyRCorner + wR) / ${t}.0; + + if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) { + continue; + } + int idyR = int(dyR); + + for (int wC = 0; wC < ${a}; wC++) { + float dyC = float(dyCCorner + wC) / ${o}.0; + + if (dyC < 0.0 || dyC >= ${e.outWidth}.0 || + fract(dyC) > 0.0) { + continue; + } + int idyC = int(dyC); + + float dyValue = getDy(b, idyR, idyC, d); + int maxPosValue = ${u} - int(getMaxPos(b, idyR, idyC, d)); + + // Get the current value, check it against the value from the + // position matrix. + int curPosValue = wR * ${a} + wC; + float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0); + + dotProd += dyValue * mask; + } + } + setOutput(dotProd); + } + `}},sg=class{constructor(e){this.variableNames=["dy","maxPos"],this.outputShape=e.inShape;let t=e.strideDepth,o=e.strideHeight,n=e.strideWidth,s=e.dilationDepth,a=e.dilationHeight,i=e.dilationWidth,p=e.effectiveFilterDepth,u=e.effectiveFilterHeight,c=e.effectiveFilterWidth,l=p-1-e.padInfo.front,m=u-1-e.padInfo.top,f=c-1-e.padInfo.left,d=p*u*c-1;this.userCode=` + const ivec3 pads = ivec3(${l}, ${m}, ${f}); + + void main() { + ivec5 coords = getOutputCoords(); + int batch = coords.x; + int ch = coords.u; + + ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads; + int dyDCorner = dyCorner.x; + int dyRCorner = dyCorner.y; + int dyCCorner = dyCorner.z; + + // Convolve dy(?, ?, ?, ch) with pos mask(:, :, :, d) to get + // dx(xD, xR, xC, ch). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + + for (int wD = 0; wD < ${p}; + wD += ${s}) { + float dyD = float(dyDCorner + wD) / ${t}.0; + + if (dyD < 0.0 || dyD >= ${e.outDepth}.0 || fract(dyD) > 0.0) { + continue; + } + int idyD = int(dyD); + + for (int wR = 0; wR < ${u}; + wR += ${a}) { + float dyR = float(dyRCorner + wR) / ${o}.0; + + if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || + fract(dyR) > 0.0) { + continue; + } + int idyR = int(dyR); + + for (int wC = 0; wC < ${c}; + wC += ${i}) { + float dyC = float(dyCCorner + wC) / ${n}.0; + + if (dyC < 0.0 || dyC >= ${e.outWidth}.0 || + fract(dyC) > 0.0) { + continue; + } + int idyC = int(dyC); + + float dyValue = getDy(batch, idyD, idyR, idyC, ch); + int maxPosValue = ${d} - + int(getMaxPos(batch, idyD, idyR, idyC, ch)); + + // Get the current value, check it against the value from the + // position matrix. + int curPosValue = + wD * ${u} * ${c} + + wR * ${c} + wC; + float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0); + + dotProd += dyValue * mask; + } + } + } + setOutput(dotProd); + } + `}};function L7(r){let{inputs:e,backend:t,attrs:o}=r,{dy:n,input:s}=e,a=s,{filterSize:i,strides:p,pad:u,dimRoundingMode:c}=o,l=[1,1,1],m=I.computePool3DInfo(a.shape,i,p,l,u,c),f=new Ei(m,"max",!0),d=t.runWebGLProgram(f,[a],a.dtype),h=new sg(m),g=t.runWebGLProgram(h,[n,d],a.dtype);return t.disposeIntermediateTensorInfo(d),g}var dF={kernelName:Lm,backendName:"webgl",kernelFunc:L7};function B7(r){let{inputs:e,backend:t,attrs:o}=r,{dy:n,input:s,output:a}=e,i=s;as([s,a],"maxPoolGrad");let{filterSize:p,strides:u,pad:c,dimRoundingMode:l}=o,m=I.computePool2DInfo(i.shape,p,u,1,c,l),f=!0,d=new us(m,"max",f),h=t.runWebGLProgram(d,[i],i.dtype),g=new ng(m),y=t.runWebGLProgram(g,[n,h],i.dtype);return t.disposeIntermediateTensorInfo(h),y}var hF={kernelName:Mm,backendName:"webgl",kernelFunc:B7};function gF(r,e,t,o){let n=new us(t,"max",!1),s=o.runWebGLProgram(n,[r],"float32");n=new us(t,"max",!0,!0,e);let a=o.runWebGLProgram(n,[r],"float32");return[s,a]}var xF={kernelName:vp,backendName:"webgl",kernelFunc:({inputs:r,attrs:e,backend:t})=>{let{x:o}=r,{filterSize:n,strides:s,pad:a,includeBatchInIndex:i}=e,p=t;x.assert(o.shape.length===4,()=>`Error in maxPool: input must be rank 4 but got rank ${o.shape.length}.`);let u=[1,1];x.assert(I.eitherStridesOrDilationsAreOne(s,u),()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${s} and dilations '${u}'`);let c=I.computePool2DInfo(o.shape,n,s,u,a),[l,m]=gF(o,i,c,p);return[l,m]}};function yF(r,e,t,o){let n=x.sizeFromShape(e),a=x.sizeFromShape(r.shape)/n,i=J({inputs:{x:r},attrs:{shape:[a,n]},backend:o}),p=qr(i,"float32","mean",o),u=J({inputs:{x:p},attrs:{shape:t},backend:o});return o.disposeIntermediateTensorInfo(i),o.disposeIntermediateTensorInfo(p),u}var bF={kernelName:An,backendName:"webgl",kernelFunc:({inputs:r,attrs:e,backend:t})=>{let{x:o}=r,{keepDims:n,axis:s}=e,a=t,i=o.shape.length,p=x.parseAxisParam(s,o.shape),u=p,c=I.getAxesPermutation(u,i),l=c!=null,m=a.shouldExecuteOnCPU([o]),f=[],d=o;if(l){if(m){let w=a.texData.get(d.dataId).values,k=new Array(i);for(let R=0;Rc[0]+e[l]+c[1]);let n=e.length,s=_e(n),a=t.map(c=>c[0]).join(","),i=t.map((c,l)=>c[0]+e[l]).join(","),p=["coords[0]","coords[1]","coords[2]","coords[3]"].slice(0,n),u=o==="reflect"?0:1;if(n===1){this.userCode=` + int start = ${a}; + int end = ${i}; + + void main() { + int outC = getOutputCoords(); + if (outC < start) { + outC = start * 2 - outC - ${u}; + } else if(outC >= end) { + outC = (end - 1) * 2 - outC + ${u}; + } + setOutput(getX(outC - start)); + } + `;return}this.userCode=` + ${s} start = ${s}(${a}); + ${s} end = ${s}(${i}); + + void main() { + ${s} outC = getOutputCoords(); + for (int i = 0; i < ${n}; i++) { + if (outC[i] < start[i]) { + outC[i] = start[i] * 2 - outC[i] - ${u}; + } else if(outC[i] >= end[i]) { + outC[i] = (end[i] - 1) * 2 - outC[i] + ${u}; + } + } + ${s} coords = outC - start; + setOutput(getX(${p})); + } + `}};var ig=class{constructor(e,t,o){this.variableNames=["x"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=t.map((d,h)=>d[0]+e[h]+d[1]);let n=e.length,s=_e(n),a=t.map(d=>d[0]).join(","),i=t.map((d,h)=>d[0]+e[h]).join(","),p=$t("rc",n),u=$t("source",n),c=`${p[n-1]} < ${this.outputShape[n-1]}`,l=n===1?"source":`vec2(${u.slice(-2).join()})`,m=o==="reflect"?0:1,f="";if(n===1){let d=` + ${s} source = rc; + if (source < start) { + source = start * 2 - source - ${m}; + } else if (source >= end) { + source = (end - 1) * 2 - source + ${m}; + } + source -= start; + `;f=` + ${s} rc = outputLoc; + ${d} + result[0] = getChannel(getX(${u.join()}), ${l}); + ${p[n-1]} += 1; + if(${c}) { + ${d} + result[1] = getChannel(getX(${u.join()}), ${l}); + } + `}else{let d=` + ${s} source = rc; + ${s} lt = ${s}(lessThan(source, start)); + ${s} gte = ${s}(greaterThanEqual(source, end)); + ${s} orig = 1 - (lt + gte); + source = orig * source + + lt * (start * 2 - source - ${m}) + + gte * ((end - 1) * 2 - source + ${m}); + source -= start; + `;f=` + ${s} rc = outputLoc; + ${d} + result[0] = getChannel(getX(${u.join()}), ${l}); + ${p[n-1]} += 1; + if(${c}) { + ${d} + result[1] = getChannel(getX(${u.join()}), ${l}); + } + rc = outputLoc; + ${p[n-2]} += 1; + if(${p[n-2]} < ${this.outputShape[n-2]}) { + ${d} + result[2] = getChannel(getX(${u.join()}), ${l}); + ${p[n-1]} += 1; + if(${c}) { + ${d} + result[3] = getChannel(getX(${u.join()}), ${l}); + } + } + `}this.userCode=` + const ${s} start = ${s}(${a}); + const ${s} end = ${s}(${i}); + + void main() { + ${s} outputLoc = getOutputCoords(); + vec4 result = vec4(0.); + ${f} + setOutput(result); + } + `}};var G7=({inputs:r,backend:e,attrs:t})=>{let{x:o}=r,{paddings:n,mode:s}=t,a=P().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new ig(o.shape,n,s):new ag(o.shape,n,s);return e.runWebGLProgram(a,[o],o.dtype)},wF={kernelName:Dn,backendName:"webgl",kernelFunc:G7};var H7=`if (b == 0.0) return NAN; + return mod(a, b);`,q7=` + vec4 result = mod(a, b); + bvec4 isNaN = equal(b, vec4(0.0)); + `+js+` + return result; +`,K7=ot({opSnippet:H7,packedOpSnippet:q7}),SF={kernelName:ji,backendName:"webgl",kernelFunc:K7};var ug=class{constructor(e,t,o){this.variableNames=["probs"],this.customUniforms=[{name:"seed",type:"float"}],this.outputShape=[e,o],this.userCode=` + void main() { + ivec2 coords = getOutputCoords(); + int batch = coords[0]; + + float r = random(seed); + float cdf = 0.0; + + for (int i = 0; i < ${t-1}; i++) { + cdf += getProbs(batch, i); + + if (r < cdf) { + setOutput(float(i)); + return; + } + } + + // If no other event happened, last event happened. + setOutput(float(${t-1})); + } + `}};var j7=` +if (a == b) { + return 1.0; +}; +return a / b;`,X7=` + // vec4 one = vec4(equal(a, b)); + // return one + (vec4(1.0) - one) * a / b; + vec4 result = a / b; + if(a.x == b.x) { + result.x = 1.; + } + if(a.y == b.y) { + result.y = 1.; + } + if(a.z == b.z) { + result.z = 1.; + } + if(a.w == b.w) { + result.w = 1.; + } + + return result; +`,Vw=ot({opSnippet:j7,packedOpSnippet:X7,checkOutOfBounds:!0}),vF={kernelName:Cn,backendName:"webgl",kernelFunc:Vw};var kF="return a - b;",zw=ot({opSnippet:kF,packedOpSnippet:kF,supportsComplex:!0,cpuKernelImpl:G$}),TF={kernelName:Io,backendName:"webgl",kernelFunc:zw};function Ww(r){let{inputs:e,backend:t,attrs:o}=r,{logits:n}=e,{dim:s}=o,a=x.parseAxisParam([s],n.shape),i=Bw({inputs:{x:n},backend:t,attrs:{reductionIndices:a,keepDims:!1}}),p=I.expandShapeToKeepDim(i.shape,a),u=J({inputs:{x:i},backend:t,attrs:{shape:p}}),c=zw({inputs:{a:n,b:u},backend:t}),l=Ow({inputs:{x:c},backend:t}),m=Ou({inputs:{x:l},backend:t,attrs:{axis:a,keepDims:!1}}),f=J({inputs:{x:m},backend:t,attrs:{shape:p}}),d=Vw({inputs:{a:l,b:f},backend:t});return t.disposeIntermediateTensorInfo(i),t.disposeIntermediateTensorInfo(u),t.disposeIntermediateTensorInfo(c),t.disposeIntermediateTensorInfo(l),t.disposeIntermediateTensorInfo(m),t.disposeIntermediateTensorInfo(f),d}var NF={kernelName:Xn,backendName:"webgl",kernelFunc:Ww};function Y7(r){let{inputs:e,backend:t,attrs:o}=r,{logits:n}=e,{numSamples:s,seed:a,normalized:i}=o,p=i?n:Ww({inputs:{logits:n},backend:t,attrs:{dim:n.shape.length-1}}),u=p.shape[0],c=p.shape[1],l=new ug(u,c,s),m=[[a]],f=t.runWebGLProgram(l,[p],"int32",m);return i||t.disposeIntermediateTensorInfo(p),f}var _F={kernelName:kp,backendName:"webgl",kernelFunc:Y7};var Q7=Vt+` + return -x; +`,Z7=` + vec4 result = -x; + bvec4 isNaN = isnan(x); + + result.r = isNaN.r ? x.r : result.r; + result.g = isNaN.g ? x.g : result.g; + result.b = isNaN.b ? x.b : result.b; + result.a = isNaN.a ? x.a : result.a; + + return result; +`;function J7(r){let{inputs:e,backend:t}=r,{x:o}=e;if(t.shouldExecuteOnCPU([o])){let s=t.texData.get(o.dataId),[a,i]=T$(s.values,o.shape,o.dtype);return t.makeTensorInfo(i,o.dtype,a)}let n;return P().getBool("WEBGL_PACK_UNARY_OPERATIONS")?n=new No(o.shape,Z7):n=new fr(o.shape,Q7),t.runWebGLProgram(n,[o],o.dtype)}var EF={kernelName:Pn,backendName:"webgl",kernelFunc:J7};var eZ=Bt.nonMaxSuppressionV3Impl;function tZ(r){I.warn("tf.nonMaxSuppression() in webgl locks the UI thread. Call tf.nonMaxSuppressionAsync() instead");let{inputs:e,backend:t,attrs:o}=r,{boxes:n,scores:s}=e,{maxOutputSize:a,iouThreshold:i,scoreThreshold:p}=o,u=t.readSync(n.dataId),c=t.readSync(s.dataId),{selectedIndices:l}=eZ(u,c,a,i,p);return t.makeTensorInfo([l.length],"int32",new Int32Array(l))}var $F={kernelName:On,backendName:"webgl",kernelFunc:tZ};var rZ=Bt.nonMaxSuppressionV4Impl;function oZ(r){I.warn("tf.nonMaxSuppression() in webgl locks the UI thread. Call tf.nonMaxSuppressionAsync() instead");let{inputs:e,backend:t,attrs:o}=r,{boxes:n,scores:s}=e,{maxOutputSize:a,iouThreshold:i,scoreThreshold:p,padToMaxOutputSize:u}=o,c=t.readSync(n.dataId),l=t.readSync(s.dataId),{selectedIndices:m,validOutputs:f}=rZ(c,l,a,i,p,u);return[t.makeTensorInfo([m.length],"int32",new Int32Array(m)),t.makeTensorInfo([],"int32",new Int32Array([f]))]}var RF={kernelName:pa,backendName:"webgl",kernelFunc:oZ};var nZ=Bt.nonMaxSuppressionV5Impl;function sZ(r){I.warn("tf.nonMaxSuppression() in webgl locks the UI thread. Call tf.nonMaxSuppressionAsync() instead");let{inputs:e,backend:t,attrs:o}=r,{boxes:n,scores:s}=e,{maxOutputSize:a,iouThreshold:i,scoreThreshold:p,softNmsSigma:u}=o,c=t.readSync(n.dataId),l=t.readSync(s.dataId),m=a,f=i,d=p,h=u,{selectedIndices:g,selectedScores:y}=nZ(c,l,m,f,d,h);return[t.makeTensorInfo([g.length],"int32",new Int32Array(g)),t.makeTensorInfo([y.length],"float32",new Float32Array(y))]}var AF={kernelName:Mn,backendName:"webgl",kernelFunc:sZ};var pg=class{constructor(e,t,o,n){this.variableNames=["indices"],this.outputShape=[e,t],this.userCode=` + void main() { + ivec2 coords = getOutputCoords(); + int index = round(getIndices(coords.x)); + setOutput(mix(float(${n}), float(${o}), + float(index == coords.y))); + } + `}};var aZ=r=>{let{inputs:e,backend:t,attrs:o}=r,{indices:n}=e,{dtype:s,depth:a,onValue:i,offValue:p}=o,u=x.sizeFromShape(n.shape),c=new pg(u,a,i,p),l=J({inputs:{x:n},backend:t,attrs:{shape:[u]}}),m=t.runWebGLProgram(c,[l],s);t.disposeIntermediateTensorInfo(l);let f=[...n.shape,a],d=J({inputs:{x:m},backend:t,attrs:{shape:f}});return t.disposeIntermediateTensorInfo(m),d},FF={kernelName:ca,backendName:"webgl",kernelFunc:aZ};function Bl(r){let{inputs:e,backend:t}=r,{x:o}=e;if(o.dtype==="complex64"){let n=La({inputs:{input:o},backend:t}),s=Bl({inputs:{x:n},backend:t}),a=Lu({inputs:{input:o},backend:t}),i=Bl({inputs:{x:a},backend:t}),p=Ar({inputs:{real:s,imag:i},backend:t});return t.disposeIntermediateTensorInfo(n),t.disposeIntermediateTensorInfo(s),t.disposeIntermediateTensorInfo(a),t.disposeIntermediateTensorInfo(i),p}else return Ba({attrs:{shape:o.shape,dtype:o.dtype,value:o.dtype==="string"?"":0},backend:t})}var DF={kernelName:Es,backendName:"webgl",kernelFunc:Bl};function PF(r){let{inputs:e,backend:t}=r,{x:o}=e;if(o.dtype==="string")throw new Error("onesLike is not supported under string dtype");if(o.dtype==="complex64"){let n=La({inputs:{input:o},backend:t}),s=PF({inputs:{x:n},backend:t}),a=Lu({inputs:{input:o},backend:t}),i=Bl({inputs:{x:a},backend:t}),p=Ar({inputs:{real:s,imag:i},backend:t});return t.disposeIntermediateTensorInfo(n),t.disposeIntermediateTensorInfo(s),t.disposeIntermediateTensorInfo(a),t.disposeIntermediateTensorInfo(i),p}else return Ba({attrs:{shape:o.shape,dtype:o.dtype,value:1},backend:t})}var OF={kernelName:Cs,backendName:"webgl",kernelFunc:PF};function iZ(r){let{inputs:e,backend:t,attrs:o}=r,{axis:n}=o;if(e.length===1)return Kh({inputs:{input:e[0]},backend:t,attrs:{dim:n}});let s=e[0].shape,a=e[0].dtype;e.forEach(c=>{x.assertShapesMatch(s,c.shape,"All tensors passed to stack must have matching shapes"),x.assert(a===c.dtype,()=>"All tensors passed to stack must have matching dtypes")});let i=[],p=e.map(c=>{let l=Kh({inputs:{input:c},backend:t,attrs:{dim:n}});return i.push(l),l}),u=Pw({inputs:p,backend:t,attrs:{axis:n}});return i.forEach(c=>t.disposeIntermediateTensorInfo(c)),u}var MF={kernelName:Is,backendName:"webgl",kernelFunc:iZ};var cg=class{constructor(e,t,o){this.variableNames=["x"],this.customUniforms=[{name:"value",type:"float"}],this.outputShape=t.map((u,c)=>u[0]+e[c]+u[1]);let n=e.length,s=_e(n),a=t.map(u=>u[0]).join(","),i=t.map((u,c)=>u[0]+e[c]).join(","),p=["coords[0]","coords[1]","coords[2]","coords[3]"].slice(0,n);if(n===1){this.userCode=` + int start = ${a}; + int end = ${i}; + + void main() { + int outC = getOutputCoords(); + if (outC < start || outC >= end) { + setOutput(value); + } else { + setOutput(getX(outC - start)); + } + } + `;return}this.userCode=` + ${s} start = ${s}(${a}); + ${s} end = ${s}(${i}); + + void main() { + ${s} outC = getOutputCoords(); + if (any(lessThan(outC, start)) || any(greaterThanEqual(outC, end))) { + setOutput(value); + } else { + ${s} coords = outC - start; + setOutput(getX(${p})); + } + } + `}};var lg=class{constructor(e,t,o){this.variableNames=["x"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"value",type:"float"}],this.outputShape=t.map((h,g)=>h[0]+e[g]+h[1]);let n=e.length,s=_e(n),a=t.map(h=>h[0]).join(","),i=t.map((h,g)=>h[0]+e[g]).join(","),p=$t("rc",n),u=$t("source",n),c=`${p[n-1]} < ${this.outputShape[n-1]}`,l=n===1?"source":`vec2(${u.slice(-2).join()})`,m=[`${s} rc = outputLoc;`,`${p[n-1]} += 1; + if(${c}) { + `,n===1?"":`} + rc = outputLoc; + ${p[n-2]} += 1; + if(${p[n-2]} < ${this.outputShape[n-2]}) {`,n===1?"":` ${p[n-1]} += 1; + if(${c}) {`],f=n===1?"rc < start || rc >= end":"any(lessThan(rc, start)) || any(greaterThanEqual(rc, end))",d="";for(let h=0,g=n===1?2:4;h{let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{paddings:s,constantValue:a}=o;if(x.sizeFromShape(n.shape)===0){let u=s.map((c,l)=>c[0]+n.shape[l]+c[1]);return Ba({backend:t,attrs:{shape:u,value:a,dtype:n.dtype}})}let i=P().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new lg(n.shape,s,a):new cg(n.shape,s,a),p=[[a]];return t.runWebGLProgram(i,[n],n.dtype,p)},LF={kernelName:Ln,backendName:"webgl",kernelFunc:Uw};var uZ=` + if(a < 0.0 && floor(b) < b){ + return NAN; + } + if (b == 0.0) { + return 1.0; + } + return (round(mod(b, 2.0)) != 1) ? + pow(abs(a), b) : sign(a) * pow(abs(a), b); +`,pZ=` + // isModRound1 has 1 for components with round(mod(b, 2.0)) == 1, 0 otherwise. + vec4 isModRound1 = vec4(equal(round(mod(b, 2.0)), ivec4(1))); + vec4 multiplier = sign(a) * isModRound1 + (vec4(1.0) - isModRound1); + vec4 result = multiplier * pow(abs(a), b); + + // Ensure that a^0 = 1, including 0^0 = 1 as this correspond to TF and JS + bvec4 isExpZero = equal(b, vec4(0.0)); + result.r = isExpZero.r ? 1.0 : result.r; + result.g = isExpZero.g ? 1.0 : result.g; + result.b = isExpZero.b ? 1.0 : result.b; + result.a = isExpZero.a ? 1.0 : result.a; + + bvec4 isNaN1 = lessThan(a, vec4(0.0)); + bvec4 isNaN2 = lessThan(floor(b), b); + bvec4 isNaN = bvec4(isNaN1.x && isNaN2.x, isNaN1.y && isNaN2.y, isNaN1.z && isNaN2.z, isNaN1.w && isNaN2.w); + `+js+` + return result; +`,cZ=ot({opSnippet:uZ,packedOpSnippet:pZ}),BF={kernelName:Bn,backendName:"webgl",kernelFunc:cZ};function lZ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s,keepDims:a}=o,i=n.shape.length,p=[],u=x.parseAxisParam(s,n.shape),c=u,l=I.getAxesPermutation(c,i),m=n;l!=null&&(m=xt({inputs:{x:n},backend:t,attrs:{perm:l}}),c=I.getInnerMostAxes(c.length,i),p.push(m)),I.assertAxesAreInnerMostDims("prod",c,i);let f;if(t.shouldExecuteOnCPU([m])){let d=t.texData.get(m.dataId).values,{outVals:h,outShape:g,outDtype:y}=_$(m.shape,m.dtype,d,c);f=t.makeTensorInfo(g,y,h)}else{let[d,h]=I.computeOutAndReduceShapes(m.shape,c),g=x.sizeFromShape(h),y=J({inputs:{x:m},backend:t,attrs:{shape:[-1,g]}}),b=Ca(n.dtype),C=qr(y,b,"prod",t);f=J({inputs:{x:C},backend:t,attrs:{shape:d}}),p.push(y),p.push(C)}if(a){p.push(f);let d=I.expandShapeToKeepDim(f.shape,u);f=J({inputs:{x:f},backend:t,attrs:{shape:d}})}return p.forEach(d=>t.disposeIntermediateTensorInfo(d)),f}var VF={kernelName:Ao,backendName:"webgl",kernelFunc:lZ};function mZ(r){let{inputs:e,backend:t,attrs:o}=r,{paramsNestedSplits:n,paramsDenseValues:s,indices:a}=e,{outputRaggedRank:i}=o,p=n.map(y=>t.readSync(y.dataId)),u=n.map(y=>y.shape),c=t.readSync(s.dataId),l=t.readSync(a.dataId),[m,f,d]=E$(p,u,c,s.shape,s.dtype,l,a.shape,i),h=m.map(y=>t.makeTensorInfo([y.length],"int32",y)),g=t.makeTensorInfo(d,s.dtype,f);return h.concat([g])}var zF={kernelName:Tp,backendName:"webgl",kernelFunc:mZ};function fZ(r){let{inputs:e,backend:t}=r,{starts:o,limits:n,deltas:s}=e,a=t.readSync(o.dataId),i=t.readSync(n.dataId),p=t.readSync(s.dataId),[u,c]=$$(a,o.shape,o.dtype,i,n.shape,p,s.shape),l=t.makeTensorInfo([u.length],"int32",u),m=t.makeTensorInfo([c.length],o.dtype,c);return[l,m]}var WF={kernelName:Np,backendName:"webgl",kernelFunc:fZ};function dZ(r){let{inputs:e,backend:t,attrs:o}=r,{shape:n,values:s,defaultValue:a,rowPartitionTensors:i}=e,{rowPartitionTypes:p}=o,u=t.readSync(n.dataId),c=t.readSync(s.dataId),l=t.readSync(a.dataId),m=i.map(g=>t.readSync(g.dataId)),f=i.map(g=>g.shape),[d,h]=R$(u,n.shape,c,s.shape,s.dtype,l,a.shape,m,f,p);return t.makeTensorInfo(d,s.dtype,h)}var UF={kernelName:_p,backendName:"webgl",kernelFunc:dZ};var Gw=r=>{let{backend:e,attrs:t}=r,{start:o,stop:n,step:s,dtype:a}=t,i=A$(o,n,s,a);return e.makeTensorInfo([i.length],a,i)},GF={kernelName:ws,backendName:"webgl",kernelFunc:Gw};var hZ="return 1.0 / x;",gZ=he({opSnippet:hZ}),HF={kernelName:ma,backendName:"webgl",kernelFunc:gZ};var xZ=Vt+` + return (x < 0.0) ? 0.0 : x; +`,yZ=` + vec4 result = x * vec4(greaterThanEqual(x, vec4(0.0))); + bvec4 isNaN = isnan(x); + + result.r = isNaN.r ? x.r : result.r; + result.g = isNaN.g ? x.g : result.g; + result.b = isNaN.b ? x.b : result.b; + result.a = isNaN.a ? x.a : result.a; + + return result; +`,bZ=he({opSnippet:xZ,packedOpSnippet:yZ}),qF={kernelName:zn,backendName:"webgl",kernelFunc:bZ};var CZ=Vt+` + return (x < 0.0) ? 0.0 : min(6.0, x); +`,IZ=` + vec4 result = min(x, vec4(6.)) * vec4(greaterThanEqual(x, vec4(0.0))); + bvec4 isNaN = isnan(x); + + result.r = isNaN.r ? x.r : result.r; + result.g = isNaN.g ? x.g : result.g; + result.b = isNaN.b ? x.b : result.b; + result.a = isNaN.a ? x.a : result.a; + + return result; +`,wZ=he({opSnippet:CZ,packedOpSnippet:IZ}),KF={kernelName:Gn,backendName:"webgl",kernelFunc:wZ};var mg=class{constructor(e,t,o,n,s){this.variableNames=["A"],this.outputShape=[];let[a,i,p,u]=e;this.outputShape=[a,t,o,u];let c=[n&&t>1?i-1:i,n&&o>1?p-1:p],l=[n&&t>1?t-1:t,n&&o>1?o-1:o],m;s?m="(vec2(yRC) + vec2(0.5)) * effectiveInputOverOutputRatioRC - vec2(0.5)":m="vec2(yRC) * effectiveInputOverOutputRatioRC",this.userCode=` + const vec2 effectiveInputOverOutputRatioRC = vec2( + ${c[0]/l[0]}, + ${c[1]/l[1]}); + const vec2 inputShapeRC = vec2(${i}.0, ${p}.0); + + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + ivec2 yRC = coords.yz; + + // Fractional source index. + vec2 sourceFracIndexRC = ${m}; + + // Compute the four integer indices. + ivec2 sourceFloorRC = ivec2(max(sourceFracIndexRC, vec2(0.0))); + ivec2 sourceCeilRC = ivec2( + min(inputShapeRC - 1.0, ceil(sourceFracIndexRC))); + + float topLeft = getA(b, sourceFloorRC.x, sourceFloorRC.y, d); + float bottomLeft = getA(b, sourceCeilRC.x, sourceFloorRC.y, d); + float topRight = getA(b, sourceFloorRC.x, sourceCeilRC.y, d); + float bottomRight = getA(b, sourceCeilRC.x, sourceCeilRC.y, d); + + vec2 fracRC = sourceFracIndexRC - vec2(sourceFloorRC); + + float top = topLeft + (topRight - topLeft) * fracRC.y; + float bottom = bottomLeft + (bottomRight - bottomLeft) * fracRC.y; + float newValue = top + (bottom - top) * fracRC.x; + + setOutput(newValue); + } + `}};var fg=class{constructor(e,t,o,n,s){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=[];let[a,i,p,u]=e;this.outputShape=[a,t,o,u];let c=[n&&t>1?i-1:i,n&&o>1?p-1:p],l=[n&&t>1?t-1:t,n&&o>1?o-1:o],m;s?m="(vec3(yRC) + vec3(0.5)) * effectiveInputOverOutputRatioRC - vec3(0.5)":m="vec3(yRC) * effectiveInputOverOutputRatioRC",this.userCode=` + const vec3 effectiveInputOverOutputRatioRC = vec3( + ${c[0]/l[0]}, + ${c[1]/l[1]}, + ${c[1]/l[1]}); + const vec3 inputShapeRC = vec3(${i}.0, ${p}.0, + ${p}.0); + + float getAValue(int b, int r, int c, int d) { + return getChannel(getA(b, r, c, d), vec2(c, d)); + } + + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + // Calculate values for next column in yRC.z. + ivec3 yRC = coords.yzz + ivec3(0, 0, 1); + + // Fractional source index. + vec3 sourceFracIndexRC = ${m}; + + // Compute the four integer indices. + ivec3 sourceFloorRC = ivec3(max(sourceFracIndexRC, vec3(0.0))); + ivec3 sourceCeilRC = ivec3( + min(inputShapeRC - 1.0, ceil(sourceFracIndexRC))); + + // Should we calculate next column and row elements in 2x2 packed cell. + bool hasNextCol = d < ${u-1}; + bool hasNextRow = coords.z < ${o-1}; + + // In parallel, construct four corners for all four components in + // packed 2x2 cell. + vec4 topLeft = vec4( + getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d), + hasNextCol ? getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d + 1) + : 0.0, + hasNextRow ? getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d) + : 0.0, + (hasNextRow && hasNextCol) ? + getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d + 1) : 0.0); + + vec4 bottomLeft = vec4( + getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d), + hasNextCol ? getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d + 1) + : 0.0, + hasNextRow ? getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d) + : 0.0, + (hasNextRow && hasNextCol) ? + getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d + 1) : 0.0); + + vec4 topRight = vec4( + getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d), + hasNextCol ? getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d + 1) + : 0.0, + hasNextRow ? getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d) + : 0.0, + (hasNextRow && hasNextCol) ? + getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d + 1) : 0.0); + + vec4 bottomRight = vec4( + getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d), + hasNextCol ? getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d + 1) + : 0.0, + hasNextRow ? getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d) + : 0.0, + (hasNextRow && hasNextCol) ? + getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d + 1) : 0.0); + + vec3 fracRC = sourceFracIndexRC - vec3(sourceFloorRC); + + vec4 top = mix(topLeft, topRight, fracRC.yyzz); + vec4 bottom = mix(bottomLeft, bottomRight, fracRC.yyzz); + vec4 newValue = mix(top, bottom, fracRC.x); + + setOutput(newValue); + } + `}};function SZ(r){let{inputs:e,backend:t,attrs:o}=r,{images:n}=e,{alignCorners:s,halfPixelCenters:a,size:i}=o,[p,u]=i,c=P().getBool("WEBGL_PACK_IMAGE_OPERATIONS")?new fg(n.shape,p,u,s,a):new mg(n.shape,p,u,s,a);return t.runWebGLProgram(c,[n],"float32")}var jF={kernelName:Un,backendName:"webgl",kernelFunc:SZ};var dg=class{constructor(e,t,o){this.variableNames=["dy"],this.outputShape=[],this.outputShape=t;let[,n,s]=t,[,a,i]=e,p=[o&&a>1?n-1:n,o&&i>1?s-1:s],u=[o&&a>1?a-1:a,o&&i>1?i-1:i],c=p[0]/u[0],l=p[1]/u[1],m=1/c,f=1/l,d=Math.ceil(m)*2+2,h=Math.ceil(f)*2+2;this.userCode=` + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + int r = coords[1]; + int c = coords[2]; + + float accumulator = 0.0; + + const float heightScale = float(${c}); + const float widthScale = float(${l}); + + const float invHeightScale = float(${m}); + const float invWidthScale = float(${f}); + + const int winHeight = int(${d}); + const int winWidth = int(${h}); + + // Compute bounds for where in dy we will look + float startRLerp = floor(float(r) * invHeightScale); + int startDyR = int(startRLerp - float(winHeight / 2)); + + float startCLerp = floor(float(c) * invWidthScale); + int startDyC = int(startCLerp - float(winWidth / 2)); + + // Loop over dy + for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) { + int dyR = dyROffset + startDyR; + + // Guard against the window exceeding the bounds of dy + if (dyR < 0 || dyR >= ${a}) { + continue; + } + + for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) { + int dyC = dyCOffset + startDyC; + + // Guard against the window exceeding the bounds of dy + if (dyC < 0 || dyC >= ${i}) { + continue; + } + + float dxR = float(dyR) * heightScale; + int topDxRIndex = int(floor(dxR)); + int bottomDxRIndex = int(min(ceil(dxR), ${n-1}.0)); + float dxRLerp = dxR - float(topDxRIndex); + float inverseDxRLerp = 1.0 - dxRLerp; + + float dxC = float(dyC) * widthScale; + int leftDxCIndex = int(floor(dxC)); + int rightDxCIndex = int(min(ceil(dxC), ${s-1}.0)); + float dxCLerp = dxC - float(leftDxCIndex); + float inverseDxCLerp = 1.0 - dxCLerp; + + if (r == topDxRIndex && c == leftDxCIndex) { + // topLeft + accumulator += + getDy(b, dyR, dyC, d) * inverseDxRLerp * inverseDxCLerp; + } + + if (r == topDxRIndex && c == rightDxCIndex) { + // topRight + accumulator += getDy(b, dyR, dyC, d) * inverseDxRLerp * dxCLerp; + } + + if (r == bottomDxRIndex && c == leftDxCIndex) { + // bottomLeft + accumulator += getDy(b, dyR, dyC, d) * dxRLerp * inverseDxCLerp; + } + + if (r == bottomDxRIndex && c == rightDxCIndex) { + // bottomRight + accumulator += getDy(b, dyR, dyC, d) * dxRLerp * dxCLerp; + } + } + } + // End loop over dy + + setOutput(accumulator); + } + `}};function vZ(r){let{inputs:e,backend:t,attrs:o}=r,{images:n,dy:s}=e,{alignCorners:a}=o,i=new dg(s.shape,n.shape,a);return t.runWebGLProgram(i,[s],s.dtype)}var XF={kernelName:Vm,backendName:"webgl",kernelFunc:vZ};var hg=class{constructor(e,t,o,n,s){this.variableNames=["A"],this.outputShape=[];let[a,i,p,u]=e;this.outputShape=[a,t,o,u];let c=[n&&t>1?i-1:i,n&&o>1?p-1:p],l=[n&&t>1?t-1:t,n&&o>1?o-1:o],m=n?"0.5":"0.0",f;s?f="max((vec2(yRC) + vec2(0.5)) * effectiveInputOverOutputRatioRC, vec2(0.0))":f="vec2(yRC) * effectiveInputOverOutputRatioRC",this.userCode=` + const vec2 effectiveInputOverOutputRatioRC = vec2( + ${c[0]/l[0]}, + ${c[1]/l[1]}); + const vec2 inputShapeRC = vec2(${i}.0, ${p}.0); + + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + ivec2 yRC = coords.yz; + + // Fractional source index. + vec2 sourceFracIndexRC = ${f}; + + // Compute the coordinators of nearest neighbor point. + ivec2 sourceNearestRC = ivec2( + min(inputShapeRC - 1.0, floor(sourceFracIndexRC + ${m}))); + float newValue = getA(b, sourceNearestRC.x, sourceNearestRC.y, d); + + setOutput(newValue); + } + `}};var gg=class{constructor(e,t,o,n,s){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=[];let[a,i,p,u]=e;this.outputShape=[a,t,o,u];let c=[n&&t>1?i-1:i,n&&o>1?p-1:p],l=[n&&t>1?t-1:t,n&&o>1?o-1:o],m=n?"0.5":"0.0",f;s?f="max((vec3(yRC) + vec3(0.5)) * effectiveInputOverOutputRatioRC, vec3(0.0))":f="vec3(yRC) * effectiveInputOverOutputRatioRC",this.userCode=` + const vec3 effectiveInputOverOutputRatioRC = vec3( + ${c[0]/l[0]}, + ${c[1]/l[1]}, + ${c[1]/l[1]}); + const vec3 inputShapeRC = vec3(${i}.0, ${p}.0, + ${p}.0); + + float getAValue(int b, int r, int c, int d) { + return getChannel(getA(b, r, c, d), vec2(c, d)); + } + + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + // Calculate values for next column in yRC.z. + ivec3 yRC = coords.yzz + ivec3(0, 0, 1); + + // Fractional source index. + vec3 sourceFracIndexRC = ${f}; + + // Compute the coordinators of nearest neighbor point. + ivec3 sourceNearestRC = ivec3( + min(inputShapeRC - 1.0, floor(sourceFracIndexRC + ${m}))); + + // Should we calculate next column and row elements in 2x2 packed cell. + bool hasNextCol = d < ${u-1}; + bool hasNextRow = coords.z < ${o-1}; + + vec4 newValue = vec4( + getAValue(b, sourceNearestRC.x, sourceNearestRC.y, d), + hasNextCol ? getAValue(b, sourceNearestRC.x, sourceNearestRC.y, d + 1) + : 0.0, + hasNextRow ? getAValue(b, sourceNearestRC.x, sourceNearestRC.z, d) + : 0.0, + (hasNextRow && hasNextCol) ? + getAValue(b, sourceNearestRC.x, sourceNearestRC.z, d + 1) : 0.0); + + setOutput(newValue); + } + `}};function kZ(r){let{inputs:e,backend:t,attrs:o}=r,{images:n}=e,{alignCorners:s,halfPixelCenters:a,size:i}=o,[p,u]=i,c=P().getBool("WEBGL_PACK_IMAGE_OPERATIONS")?new gg(n.shape,p,u,s,a):new hg(n.shape,p,u,s,a);return t.runWebGLProgram(c,[n],n.dtype)}var YF={kernelName:Wn,backendName:"webgl",kernelFunc:kZ};var xg=class{constructor(e,t,o){this.variableNames=["dy"],this.outputShape=[],this.outputShape=t;let[,n,s]=t,[,a,i]=e,p=[o&&a>1?n-1:n,o&&i>1?s-1:s],u=[o&&a>1?a-1:a,o&&i>1?i-1:i],c=p[0]/u[0],l=p[1]/u[1],m=1/c,f=1/l,d=Math.ceil(m)*2+2,h=Math.ceil(f)*2+2;this.userCode=` + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + int r = coords[1]; + int c = coords[2]; + + float accumulator = 0.0; + + const float heightScale = float(${c}); + const float widthScale = float(${l}); + + const float invHeightScale = float(${m}); + const float invWidthScale = float(${f}); + + const int winHeight = int(${d}); + const int winWidth = int(${h}); + + // Compute bounds for where in dy we will look + float startRLerp = floor(float(r) * invHeightScale); + int startDyR = int(floor(startRLerp - float(winHeight / 2))); + + float startCLerp = floor(float(c) * invWidthScale); + int startDyC = int(floor(startCLerp - float(winWidth / 2))); + + // Loop over dy + for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) { + int dyR = dyROffset + startDyR; + + // Guard against the window exceeding the bounds of dy + if (dyR < 0 || dyR >= ${a}) { + continue; + } + + for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) { + int dyC = dyCOffset + startDyC; + + // Guard against the window exceeding the bounds of dy + if (dyC < 0 || dyC >= ${i}) { + continue; + } + + float sourceFracRow = + float(${p[0]}) * + (float(dyR) / float(${u[0]})); + + float sourceFracCol = + float(${p[1]}) * + (float(dyC) / float(${u[1]})); + + int sourceNearestRow = int(min( + float(int(${n}) - 1), + ${o} ? float(round(sourceFracRow)) : + float(floor(sourceFracRow)))); + + int sourceNearestCol = int(min( + float(int(${s}) - 1), + ${o} ? float(round(sourceFracCol)) : + float(floor(sourceFracCol)))); + + if (r == sourceNearestRow && c == sourceNearestCol) { + accumulator += getDy(b, dyR, dyC, d); + } + } + } + // End loop over dy + + setOutput(accumulator); + } + `}};function TZ(r){let{inputs:e,backend:t,attrs:o}=r,{images:n,dy:s}=e,{alignCorners:a}=o,i=new xg(s.shape,n.shape,a);return t.runWebGLProgram(i,[s],s.dtype)}var QF={kernelName:Bm,backendName:"webgl",kernelFunc:TZ};var yg=class{constructor(e,t){this.variableNames=["x"];let o=e.length;if(o>4)throw new Error(`WebGL backend: Reverse of rank-${o} tensor is not yet supported`);if(this.outputShape=e,o===1){this.userCode=` + void main() { + int coord = getOutputCoords(); + setOutput(getX(${e[0]} - coord - 1)); + } + `;return}let n=i=>t.indexOf(i)!==-1&&e[i]!==1?`${e[i]} - coords[${i}] - 1`:`coords[${i}]`,s=e.map((i,p)=>n(p)).join(","),a=_e(o);this.userCode=` + void main() { + ${a} coords = getOutputCoords(); + setOutput(getX(${s})); + } + `}};var bg=class{constructor(e,t){this.variableNames=["x"],this.packedInputs=!0,this.packedOutput=!0;let o=e.length;if(o>4)throw new Error(`WebGL backend: Reverse of rank-${o} tensor is not yet supported`);this.outputShape=e;let n=$t("rc",o),s=`${n[o-1]} + 1 < ${this.outputShape[o-1]}`,a=`${n[o-2]} + 1 < ${this.outputShape[o-2]}`,i=_e(o);o===1?this.userCode=` + void main(){ + int rc = getOutputCoords(); + vec4 result = vec4(0.); + result.r = getChannel(getX(${e[0]} - rc - 1), + ${e[0]} - rc - 1); + if(${s}){ + result.g = getChannel(getX(${e[0]} - (rc + 1) - 1), + ${e[0]} - (rc + 1) - 1); + } + setOutput(result); + } + `:this.userCode=` + void main() { + ${i} rc = getOutputCoords(); + vec4 result = vec4(0.); + result.r = ${p(n.slice())}; + if(${s}){ + result.g = ${u(n.slice())}; + } + if(${a}) { + result.b = ${c(n.slice())}; + if(${s}) { + result.a = ${l(n.slice())}; + } + } + setOutput(result); + } + `;function p(d){return m(d)}function u(d){return d[o-1]="("+d[o-1]+" + 1)",m(d)}function c(d){return d[o-2]="("+d[o-2]+" + 1)",m(d)}function l(d){return d[o-1]="("+d[o-1]+" + 1)",d[o-2]="("+d[o-2]+" + 1)",m(d)}function m(d){let h=e.map((b,C)=>f(C,d)),g=h.join(","),y=h.slice(-2).join(",");return`getChannel(getX(${g}), vec2(${y}))`}function f(d,h){return t.indexOf(d)!==-1&&e[d]!==1?`${e[d]} - ${h[d]} - 1`:`${h[d]}`}}};function NZ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{dims:s}=o,a=n.shape.length,i=x.parseAxisParam(s,n.shape);if(a===0)return Rt({inputs:{x:n},backend:t});let p=P().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new bg(n.shape,i):new yg(n.shape,i);return t.runWebGLProgram(p,[n],n.dtype)}var ZF={kernelName:fa,backendName:"webgl",kernelFunc:NZ};var Cg=class{constructor(e,t){this.variableNames=["Image"],this.outputShape=[],this.customUniforms=[{name:"params",type:"vec4"}];let o=e[1],n=e[2];this.outputShape=e;let s="";typeof t=="number"?s=`float outputValue = ${t.toFixed(2)};`:s=` + vec3 fill = vec3(${t.join(",")}); + float outputValue = fill[coords[3]];`,this.userCode=` + void main() { + ivec4 coords = getOutputCoords(); + int x = coords[2]; + int y = coords[1]; + float coordXFloat = (float(x) - params[0]) * params[3] - + (float(y) - params[1]) * params[2]; + float coordYFloat = (float(x) - params[0]) * params[2] + + (float(y) - params[1]) * params[3]; + int coordX = int(round(coordXFloat + params[0])); + int coordY = int(round(coordYFloat + params[1])); + ${s} + if(coordX >= 0 && coordX < ${n} && coordY >= 0 && coordY < ${o}) { + outputValue = getImage(coords[0], coordY, coordX, coords[3]); + } + setOutput(outputValue); + } + `}};var JF={kernelName:es,backendName:"webgl",kernelFunc:({inputs:r,attrs:e,backend:t})=>{let{image:o}=r,{radians:n,fillValue:s,center:a}=e,i=t,p=new Cg(o.shape,s),[u,c]=I.getImageCenter(a,o.shape[1],o.shape[2]),l=[[u,c,Math.sin(n),Math.cos(n)]];return i.runWebGLProgram(p,[o],o.dtype,l)}};var _Z=` + // OpenGL ES does not support round function. + // The algorithm is based on banker's rounding. + float base = floor(x); + if ((x - base) < 0.5) { + return floor(x); + } else if ((x - base) > 0.5) { + return ceil(x); + } else { + if (mod(base, 2.0) == 0.0) { + return base; + } else { + return base + 1.0; + } + } +`,EZ=he({opSnippet:_Z}),eD={kernelName:da,backendName:"webgl",kernelFunc:EZ};var $Z="return inversesqrt(x);",RZ=he({opSnippet:$Z,cpuKernelImpl:F$}),tD={kernelName:xo,backendName:"webgl",kernelFunc:RZ};var vc=class{constructor(e,t,o,n,s,a,i=!0){this.variableNames=["updates","indices","defaultValue"],this.outputShape=a;let p=_e(s.length),u=_e(a.length),c="";o===1?c="i":o===2&&(c="i, j");let l=`getIndices(${c})`,m="";n===1?m="i":n===2&&(m="i, coords[1]");let f=`getUpdates(${m})`,d=t>1?"strides[j]":"strides";this.userCode=` + ${p} strides = ${p}(${s}); + + void main() { + ${u} coords = getOutputCoords(); + float sum = 0.0; + bool found = false; + for (int i = 0; i < ${e}; i++) { + int flattenedIndex = 0; + for (int j = 0; j < ${t}; j++) { + int index = round(${l}); + flattenedIndex += index * ${d}; + } + if (flattenedIndex == coords[0]) { + sum += ${f}; + found = true; + } + } + setOutput(mix(getDefaultValue(), sum, float(found))); + } + `}};function AZ(r){let{inputs:e,backend:t,attrs:o}=r,{indices:n,updates:s}=e,{shape:a}=o,{sliceRank:i,numUpdates:p,sliceSize:u,strides:c,outputSize:l}=I.calculateShapes(s,n,a),m=[l/u,u];if(l===0)return t.makeTensorInfo(a,n.dtype);let f=J({inputs:{x:n},backend:t,attrs:{shape:[p,i]}}),d=J({inputs:{x:s},backend:t,attrs:{shape:[p,u]}}),h=t.makeTensorInfo([],"float32",new Float32Array([0])),g=new vc(p,i,f.shape.length,d.shape.length,c,m),y=t.runWebGLProgram(g,[d,f,h],d.dtype),b=J({inputs:{x:y},backend:t,attrs:{shape:a}});return t.disposeIntermediateTensorInfo(f),t.disposeIntermediateTensorInfo(d),t.disposeIntermediateTensorInfo(y),t.disposeIntermediateTensorInfo(h),b}var rD={kernelName:Hn,backendName:"webgl",kernelFunc:AZ};var Ig=class{constructor(e,t,o,n){this.variableNames=["sortedSequence","values"],this.customUniforms=[{name:"numInputs",type:"int"}],this.outputShape=[e,o];let s="while (left < right) {",a=`for (int i = 0; i < ${Math.ceil(Math.log2(t+1))}; ++i) { if (left >= right) break;`,i=P().getNumber("WEBGL_VERSION")===2?s:a,p=n==="left"?"<":"<=";this.userCode=` + int findBound(int batch, float value) { + int left = 0; + int right = numInputs; + int mid; + ${i} + mid = (left + right) / 2; + if (getSortedSequence(batch, mid) ${p} value) { + left = mid + 1; + } else { + right = mid; + } + } + return right; + } + + void main() { + ivec2 coords = getOutputCoords(); + int batch = coords[0]; + int valueIndex = coords[1]; + + float value = getValues(batch, valueIndex); + + setOutput(float(findBound(batch, value))); + } + `}};function FZ(r){let{inputs:e,backend:t,attrs:o}=r,{sortedSequence:n,values:s}=e,{side:a}=o,i=new Ig(n.shape[0],n.shape[1],s.shape[1],a),p=[[n.shape[1]]];return t.runWebGLProgram(i,[n,s],"int32",p)}var oD={kernelName:Ep,backendName:"webgl",kernelFunc:FZ};var wg=class{constructor(e,t,o){this.variableNames=["c","a","b"],this.outputShape=t;let n,s;if(o>4)throw Error(`Where for rank ${o} is not yet supported`);if(o===1)s="resRC",n="resRC";else{let i=["resRC.x","resRC.y","resRC.z","resRC.w"],p=[],u=[];for(let c=0;c= 1.0) { + setOutput(getA(${s})); + } else { + setOutput(getB(${s})); + } + } + `}};function DZ(r){let{inputs:e,backend:t}=r,{condition:o,t:n,e:s}=e,a=new wg(o.shape.length,n.shape,n.shape.length);return t.runWebGLProgram(a,[o,n,s],ct(n.dtype,s.dtype))}var nD={kernelName:vs,backendName:"webgl",kernelFunc:DZ};var PZ=` + // Stable and Attracting Fixed Point (0, 1) for Normalized Weights. + // see: https://arxiv.org/abs/1706.02515 + float scaleAlpha = ${I.SELU_SCALEALPHA}; + float scale = ${I.SELU_SCALE}; + return (x >= 0.0) ? scale * x : scaleAlpha * (exp(x) - 1.0); +`,OZ=he({opSnippet:PZ}),sD={kernelName:Xi,backendName:"webgl",kernelFunc:OZ};var MZ=jo+` + return 1.0 / (1.0 + exp(-1.0 * x)); +`,LZ=` + vec4 result = 1.0 / (1.0 + exp(-1.0 * x)); + bvec4 isNaN = isnan(x); + + result.r = isNaN.r ? x.r : result.r; + result.g = isNaN.g ? x.g : result.g; + result.b = isNaN.b ? x.b : result.b; + result.a = isNaN.a ? x.a : result.a; + + return result; +`,BZ=he({opSnippet:MZ,packedOpSnippet:LZ,cpuKernelImpl:P$}),aD={kernelName:yo,backendName:"webgl",kernelFunc:BZ};var VZ=` + if (isnan(x)) { return 0.0; } + return sign(x); +`,zZ=he({opSnippet:VZ}),iD={kernelName:Yi,backendName:"webgl",kernelFunc:zZ};var WZ=jo+` + return sin(x); +`,UZ=he({opSnippet:WZ}),uD={kernelName:Kn,backendName:"webgl",kernelFunc:UZ};var GZ=` + float e2x = exp(x); + return (e2x - 1.0 / e2x) / 2.0; +`,HZ=he({opSnippet:GZ}),pD={kernelName:ha,backendName:"webgl",kernelFunc:HZ};var qZ=` + float epsilon = 1.1920928955078125e-7; + float threshold = log(epsilon) + 2.0; + + bool too_large = x > -threshold; + bool too_small = x < threshold; + + float result; + float exp_x = exp(x); + + if (too_large){ + result = x; + } + else if (too_small){ + result = exp_x; + } + else{ + result = log(exp_x + 1.0); + } + return result; +`,KZ=he({opSnippet:qZ}),cD={kernelName:Qi,backendName:"webgl",kernelFunc:KZ};var jZ=r=>{let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{blockShape:s,paddings:a}=o;x.assert(n.shape.length<=4,()=>"spaceToBatchND for rank > 4 with a WebGL backend not implemented yet");let i=s.reduce((y,b)=>y*b),p=[[0,0]];p.push(...a);for(let y=1+s.length;yt.disposeIntermediateTensorInfo(y)),g},lD={kernelName:ks,backendName:"webgl",kernelFunc:jZ};function XZ(r){let{inputs:e,backend:t}=r,{indices:o,values:n,denseShape:s,defaultValue:a}=e;if(s.shape.length!==1)throw new Error(`Dense shape must be a vector, saw: + ${s.shape}`);if(o.shape.length!==2)throw new Error(`Indices must be a matrix, saw: + ${o.shape}`);if(n.shape.length!==1)throw new Error(`Values must be a vector, saw: + ${n.shape}`);if(a.shape.length!==0)throw new Error(`Default value must be a scalar, saw: + ${a.shape}`);let i=t.readSync(o.dataId),p=t.readSync(n.dataId),u=t.readSync(s.dataId),c=t.readSync(a.dataId)[0],[l,m,f,d,h]=M$(i,o.shape,o.dtype,p,n.dtype,u,c);return[t.makeTensorInfo(m,o.dtype,l),t.makeTensorInfo([m[0]],n.dtype,f),t.makeTensorInfo([d.length],"bool",new Uint8Array(d.map(g=>Number(g)))),t.makeTensorInfo([h.length],o.dtype,new Int32Array(h))]}var mD={kernelName:Qa,backendName:"webgl",kernelFunc:XZ};function YZ(r){let{inputs:e,backend:t}=r,{inputIndices:o,inputShape:n,newShape:s}=e;if(o.shape.length!==2)throw new Error(`Input indices should be a matrix but received shape ${o.shape}`);if(n.shape.length!==1)throw new Error(`Input shape should be a vector but received shape ${n.shape}`);if(s.shape.length!==1)throw new Error(`Target shape should be a vector but received shape ${s.shape}`);let a=Array.from(t.readSync(n.dataId)),i=t.readSync(o.dataId),p=Array.from(t.readSync(s.dataId)),[u,c,l]=L$(i,o.shape,o.dtype,a,p);return[t.makeTensorInfo(c,o.dtype,u),t.makeTensorInfo([l.length],s.dtype,new Int32Array(l))]}var fD={kernelName:ga,backendName:"webgl",kernelFunc:YZ};function QZ(r){let{inputs:e,backend:t}=r,{data:o,indices:n,segmentIds:s}=e;if(o.shape.length<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(n.shape.length!==1)throw new Error(`Indices should be a vector but received shape + ${n.shape}`);if(s.shape.length!==1)throw new Error(`Segment ids should be a vector but received shape + ${s.shape}`);let a=t.readSync(o.dataId),i=t.readSync(n.dataId),p=t.readSync(s.dataId),[u,c]=sh(a,o.shape,o.dtype,i,p,!0);return t.makeTensorInfo(c,o.dtype,u)}var dD={kernelName:Za,backendName:"webgl",kernelFunc:QZ};function ZZ(r){let{inputs:e,backend:t}=r,{data:o,indices:n,segmentIds:s}=e;if(o.shape.length<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(n.shape.length!==1)throw new Error(`Indices should be a vector but received shape + ${n.shape}`);if(s.shape.length!==1)throw new Error(`Segment ids should be a vector but received shape + ${s.shape}`);let a=t.readSync(o.dataId),i=t.readSync(n.dataId),p=t.readSync(s.dataId),[u,c]=sh(a,o.shape,o.dtype,i,p);return t.makeTensorInfo(c,o.dtype,u)}var hD={kernelName:Ja,backendName:"webgl",kernelFunc:ZZ};function JZ(r){let{inputs:e,backend:t,attrs:o}=r,{sparseIndices:n,sparseValues:s,defaultValue:a}=e,{outputShape:i}=o,{sliceRank:p,numUpdates:u,sliceSize:c,strides:l,outputSize:m}=I.calculateShapes(s,n,i),f=!1;if(s.dtype==="string"){let y=t.bufferSync(n),b=t.bufferSync(s),C=x.decodeString(t.readSync(a.dataId)[0]),w=D$(y,b,i,m,c,u,p,l,C,f);return t.makeTensorInfo(i,w.dtype,w.values)}let d=new vc(u,p,n.shape.length,s.shape.length,l,[m,1],f),h=t.runWebGLProgram(d,[s,n,a],s.dtype),g=J({inputs:{x:h},backend:t,attrs:{shape:i}});return t.disposeIntermediateTensorInfo(h),g}var gD={kernelName:ei,backendName:"webgl",kernelFunc:JZ};function e9(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{numOrSizeSplits:s,axis:a}=o,i=x.parseAxisParam(a,n.shape)[0],p=I.prepareSplitSize(n,s,i),u=n.shape.length,c=new Array(u).fill(0),l=n.shape.slice();return p.map(m=>{let f=[...l];f[i]=m;let d=ps({inputs:{x:n},backend:t,attrs:{begin:c,size:f}});return c[i]+=m,d})}var xD={kernelName:Ts,backendName:"webgl",kernelFunc:e9};var yD="return sqrt(x);",t9=he({opSnippet:yD,packedOpSnippet:yD,cpuKernelImpl:B$}),bD={kernelName:bo,backendName:"webgl",kernelFunc:t9};var r9="return x * x;",o9=he({opSnippet:r9}),CD={kernelName:ti,backendName:"webgl",kernelFunc:o9};var ID="return (a - b) * (a - b);",n9=ot({opSnippet:ID,packedOpSnippet:ID}),wD={kernelName:Co,backendName:"webgl",kernelFunc:n9};function s9({inputs:r,attrs:e,backend:t}){let{x:o}=r,n=Vt+` + return x > 0.0 ? 1.0 : float(${e.alpha}); + `,s=new fr(o.shape,n);return t.runWebGLProgram(s,[o],o.dtype)}var SD={kernelName:$s,backendName:"webgl",kernelFunc:s9};var Sg=class{constructor(e,t,o){this.variableNames=["x"],this.outputShape=o;let n=o.length,s=_e(o.length),a=_e(o.length),i="";if(n===1)i="coords * strides + begin";else{let p=0;i=o.map((u,c)=>(p++,o.length===1?`coords * strides[${c}] + begin[${c}]`:`coords[${p-1}] * strides[${c}] + begin[${c}]`)).join(",")}this.userCode=` + ${s} begin = ${s}(${e}); + ${s} strides = ${s}(${t}); + + void main() { + ${a} coords = getOutputCoords(); + setOutput(getX(${i})); + } + `}};function a9(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{begin:s,end:a,strides:i,beginMask:p,endMask:u,ellipsisMask:c,newAxisMask:l,shrinkAxisMask:m}=o,{finalShapeSparse:f,finalShape:d,isIdentity:h,sliceDim0:g,isSimpleSlice:y,begin:b,end:C,strides:w}=et.sliceInfo(n.shape,s,a,i,p,u,c,l,m),k;if(h)k=J({inputs:{x:n},backend:t,attrs:{shape:d}});else if(g||y){x.assert(n.shape.length>=1,()=>`Input must have rank at least 1, got: ${n.shape.length}`);let E=et.computeOutShape(b,C,w),R=ps({inputs:{x:n},backend:t,attrs:{begin:b,size:E}});k=J({inputs:{x:R},backend:t,attrs:{shape:d}}),t.disposeIntermediateTensorInfo(R)}else if(t.shouldExecuteOnCPU([n])){let R=t.readSync(n.dataId),A=ne(n.shape,n.dtype,R),D=V$(f,A,w,b);k=t.makeTensorInfo(d,n.dtype,D.values)}else{let R=new Sg(b,w,f);k=t.runWebGLProgram(R,[n],n.dtype)}let _=J({inputs:{x:k},backend:t,attrs:{shape:d}});return t.disposeIntermediateTensorInfo(k),_}var vD={kernelName:Yn,backendName:"webgl",kernelFunc:a9};function i9(r){let{inputs:e,backend:t,attrs:o}=r,{separator:n,nGramWidths:s,leftPad:a,rightPad:i,padWidth:p,preserveShortSequences:u}=o,{data:c,dataSplits:l}=e,m=t.readSync(c.dataId),f=t.readSync(l.dataId),[d,h]=z$(m,f,n,s,a,i,p,u);return[t.makeTensorInfo([d.length],"string",d),t.makeTensorInfo(l.shape,"int32",h)]}var kD={kernelName:Ns,backendName:"webgl",kernelFunc:i9};function u9(r){let{inputs:e,backend:t,attrs:o}=r,{skipEmpty:n}=o,{input:s,delimiter:a}=e;if(s.dtype!=="string")throw new Error("Input must be of datatype string");if(s.shape.length!==1)throw new Error(`Input must be a vector, got shape: ${s.shape}`);if(a.shape.length!==0)throw new Error(`Delimiter must be a scalar, got shape: ${a.shape}`);let i=t.readSync(s.dataId),p=t.readSync(a.dataId)[0],[u,c,l]=W$(i,p,n),m=c.length;return[t.makeTensorInfo([m,2],"int32",u),t.makeTensorInfo([m],"string",c),t.makeTensorInfo([2],"int32",new Int32Array(l))]}var TD={kernelName:ri,backendName:"webgl",kernelFunc:u9};function p9(r){let{inputs:e,backend:t,attrs:o}=r,{numBuckets:n}=o,{input:s}=e;if(s.dtype!=="string")throw new Error("Input must be of datatype string");if(n<=0)throw new Error("Number of buckets must be at least 1");let a=t.readSync(s.dataId),i=U$(a,n);return t.makeTensorInfo(s.shape,"int32",i)}var ND={kernelName:oi,backendName:"webgl",kernelFunc:p9};var c9="return tan(x);",l9=he({opSnippet:c9}),_D={kernelName:xa,backendName:"webgl",kernelFunc:l9};var m9=` + float e2x = exp(-2.0 * abs(x)); + return sign(x) * (1.0 - e2x) / (1.0 + e2x); +`,f9=he({opSnippet:m9}),ED={kernelName:Qn,backendName:"webgl",kernelFunc:f9};var vg=class{constructor(e,t){this.variableNames=["A"];let o=new Array(e.length);for(let a=0;a5)throw Error(`Tile for rank ${e} is not yet supported`);if(e===1)return`imod(resRC, ${r[0]})`;let t=["resRC.x","resRC.y","resRC.z","resRC.w","resRC.u"],o=[];for(let n=0;n5){let p=t.readSync(n.dataId),u=n.dtype==="string"?p.map(m=>x.decodeString(m)):p,c=ne(n.shape,n.dtype,u),l=H$(c,s);return t.makeTensorInfo(l.shape,l.dtype,l.values)}let a=new vg(n.shape,s);return t.runWebGLProgram(a,[n],n.dtype)}var $D={kernelName:wo,backendName:"webgl",kernelFunc:Hw};var kg=class{constructor(e){this.variableNames=["x","indices"],this.customUniforms=[{name:"n",type:"int"},{name:"firstPass",type:"int"},{name:"negativeInf",type:"float"},{name:"dir",type:"int"},{name:"inc",type:"int"}],this.outputShape=e,this.userCode=` + void main() { + ivec2 coords = getOutputCoords(); + int batch = coords[0]; + int elemIdx = coords[1]; + + // We compare elements pair-wise within a group of size 2 * inc. + // The comparing rule for each group alternates between ascending + // and descending. Within each group, we compare each pair at + // positions i and i+inc. To decide whether an element at position i + // is x0 or x1, we mod it by 2 * inc, if the result is smaller than + // inc, it is in the first half of the group, we denote it as x0, + // otherwise we denote it as x1. + // For example, as shown in the Bitonic top K paper referenced above, + // Figure5(a) shows that element[1] is in the + // second half of the group when group size is 2, but it is in the + // first half of the group when group size is 4. + + bool isFirstInPair = imod(elemIdx, 2 * inc) < inc; + int i = isFirstInPair ? elemIdx : elemIdx - inc; + + int i0 = firstPass == 1 ? i : int(getIndices(batch, i)); + int i1 = firstPass == 1 ? i + inc : int(getIndices(batch, i + inc)); + float x0 = i0 < n ? getX(batch, i0) : negativeInf; + float x1 = i1 < n ? getX(batch, i1) : negativeInf; + + // Denotes which direction indices are in (ascending or descending). + bool reverse = imod(elemIdx, 2 * dir) >= dir; + bool isGreater = x0 > x1 || (x0 == x1 && i1 > i0); + if (reverse == isGreater) { // Elements in opposite order of direction + int iTemp = i0; + i0 = i1; + i1 = iTemp; + } + if (isFirstInPair) { + setOutput(float(i0)); + } else { + setOutput(float(i1)); + } + } + `}},Tg=class{constructor(e){this.variableNames=["x","indices"],this.customUniforms=[{name:"n",type:"int"},{name:"firstPass",type:"int"},{name:"k",type:"int"}],this.outputShape=e,this.userCode=` + void main() { + // Takes max of indices (0, k), (1, k + 1), (2, k + 2) ... + ivec2 coords = getOutputCoords(); + int batch = coords[0]; + int elemIdx = coords[1]; + + // The output size is half of the previous size. + // If the previous sequence is | | | | _ _ _ _ | | | | _ _ _ _ (k=4), + // we only need to output the indices at positions |, the indices at + // positions _ can be thrown away, see Figure5(b) After Phase 2 + // (Merge phase) in the Bitonic Top K paper referenced above. + // For example, the paper shows we only need to output the orange bars. + // The output sequence should look like this | | | | | | | |. + // Because the sequence is halved, to map the output index back + // to the previous sequence to find the corresponding value, + // we need to double the index. When we double the index, + // we basically interpolate a position, so 2i looks like + // | _ | _ | _ | _ | _ | _ | _. We move the | to the first k position + // of each 2k positions by - elemIdx % k. E.g. for output at + // index 4,5,6,7, we want to get the corresponding element at + // original index 8,9,10,11, for output at index 8,9,10,11, + // we want to get the corresponding element at original index + // 16,17,18,19, so on and so forth. + + int i = elemIdx < k ? elemIdx : (elemIdx * 2 - imod(elemIdx, k)); + int i0 = firstPass == 1 ? i : int(getIndices(batch, i)); + int i1 = firstPass == 1 ? i + k : int(getIndices(batch, i + k)); + + float x0 = getX(batch, i0); + float x1 = i1 < n ? getX(batch, i1) : x0; + + setOutput(x0 >= x1 ? float(i0) : float(i1)); + } + `}};function Vu(r,e){e!==null&&r.disposeIntermediateTensorInfo(e)}function RD(r){let e=1;for(;ep){let D=t.readSync(n.dataId),[O,M]=q$(D,u,n.dtype,s,a);return[t.makeTensorInfo(O.shape,O.dtype,O.values),t.makeTensorInfo(M.shape,M.dtype,M.values)]}if(s===0)return u[u.length-1]=0,[t.makeTensorInfo(u,n.dtype,[]),t.makeTensorInfo(u,"int32",[])];if(c===1)return[n,Ba({attrs:{shape:u,dtype:"int32",value:0},backend:t})];let l=t.texData.get(n.dataId),m=l!==null&&l.isPacked,f=m?t.unpackTensor(n):n,h=x.sizeFromShape(u)/c,g=J({inputs:{x:f},attrs:{shape:[h,c]},backend:t});m&&Vu(t,f);let y=RD(s),b=RD(c),C=null,w=()=>C===null?[g,g]:[g,C],k=(D,O,M)=>{let L=w(),W=new kg(M),G=[[c],[C===null?1:0],[Number.NEGATIVE_INFINITY],[D],[O]],q=C;C=t.runWebGLProgram(W,L,"int32",G),Vu(t,q)};for(let D=1;D=1;M/=2)k(O,M,[h,b])}for(let D=b;D>y;D/=2){let O=w(),M=new Tg([h,D/2]),W=[[c],[C===null?1:0],[y]],V=C;C=t.runWebGLProgram(M,O,"int32",W),Vu(t,V);let G=y/2,q=G*2;for(let H=G;H>=1;H/=2)k(q,H,C.shape)}let _=C;C=ps({inputs:{x:C},backend:t,attrs:{begin:0,size:[h,s]}}),Vu(t,_);let E=Lw({inputs:{x:g,indices:C},backend:t,attrs:{axis:1,batchDims:1}});Vu(t,g);let R=u.slice(0,-1);R.push(s),_=C,C=J({inputs:{x:C},attrs:{shape:R},backend:t}),Vu(t,_);let A=E;return E=J({inputs:{x:E},attrs:{shape:R},backend:t}),Vu(t,A),[E,C]}var AD={kernelName:Zn,backendName:"webgl",kernelFunc:h9};var Ng=class{constructor(e,t,o,n,s,a){this.variableNames=["Image","Transforms"],this.outputShape=a;let i=o==="nearest"?1:2,p;switch(n){case"constant":p=1;break;case"reflect":p=2;break;case"wrap":p=3;break;case"nearest":p=4;break;default:p=1;break}this.userCode=` + float mapCoord(float outCoord, float len) { + float inCoord = outCoord; + if(${p} == 2) { + if (inCoord < 0.0) { + if (len <= 1.0) { + inCoord = 0.0; + } else { + float sz2 = 2.0 * len; + if (inCoord < sz2) { + inCoord = sz2 * float(int(float(-inCoord / sz2))) + + inCoord; + } + inCoord = inCoord < -len ? inCoord + sz2 : -inCoord - 1.0; + } + } else if (inCoord > len - 1.0) { + if (len <= 1.0) { + inCoord = 0.0; + } else { + float sz2 = 2.0 * len; + inCoord -= sz2 * float(int(float(inCoord / sz2))); + if (inCoord >= len) { + inCoord = sz2 - inCoord - 1.0; + } + } + } + return clamp(inCoord, 0.0, len - 1.0); + } else if (${p} == 3) { + if (inCoord < 0.0) { + if (len <= 1.0) { + inCoord = 0.0; + } else { + float sz = len - 1.0; + inCoord += len * (float(int(float(-inCoord / sz))) + 1.0); + } + } else if (inCoord > len - 1.0) { + if (len <= 1.0) { + inCoord = 0.0; + } else { + float sz = len - 1.0; + inCoord -= len * float(int(float(inCoord / sz))); + } + } + return clamp(inCoord, 0.0, len - 1.0); + } else if (${p} == 4) { + return clamp(outCoord, 0.0, len - 1.0); + } else { + return outCoord; + } + } + + float readWithFillValue(int batch, int coordY, int coordX, + int channel) { + float outputValue; + if (0 <= coordY && coordY < ${e} && 0 <= coordX && coordX < ${t}) { + outputValue = getImage(batch, coordY, coordX, channel); + } else { + outputValue = float(${s}); + } + return outputValue; + } + + void main() { + ivec4 coords = getOutputCoords(); + float outputValue; + int batch = coords[0]; + int x = coords[2]; + int y = coords[1]; + int channel = coords[3]; + float xf = float(x); + float yf = float(y); + float a1 = getTransforms(batch, 0); + float a2 = getTransforms(batch, 1); + float a3 = getTransforms(batch, 2); + float b1 = getTransforms(batch, 3); + float b2 = getTransforms(batch, 4); + float b3 = getTransforms(batch, 5); + float c1 = getTransforms(batch, 6); + float c2 = getTransforms(batch, 7); + float projection = c1 * xf + c2 * yf + 1.0; + if (projection == 0.0) { + outputValue = float(${s}); + } else { + float inX = (a1 * xf + a2 * yf + a3) / projection; + float inY = (b1 * xf + b2 * yf + b3) / projection; + float mapX = mapCoord(inX, float(${t})); + float mapY = mapCoord(inY, float(${e})); + + if (${i} == 1) { + int coordY = int(round(mapY)); + int coordX = int(round(mapX)); + outputValue = readWithFillValue(batch, coordY, coordX, + channel); + } else { + float yFloor = floor(mapY); + float xFloor = floor(mapX); + float yCeil = yFloor + 1.0; + float xCeil = xFloor + 1.0; + float valueYFloor = (xCeil - mapX) * + readWithFillValue(batch, int(yFloor), int(xFloor), channel) + + (mapX - xFloor) * + readWithFillValue(batch, int(yFloor), int(xCeil), channel); + float valueYCeil = (xCeil - mapX) * + readWithFillValue(batch, int(yCeil), int(xFloor), channel) + + (mapX - xFloor) * + readWithFillValue(batch, int(yCeil), int(xCeil), channel); + outputValue = (yCeil - mapY) * valueYFloor + + (mapY - yFloor) * valueYCeil; + } + } + setOutput(outputValue); + } + `}};function g9(r){let{inputs:e,backend:t,attrs:o}=r,{image:n,transforms:s}=e,{interpolation:a,fillMode:i,fillValue:p,outputShape:u}=o,[c,l,m,f]=n.shape,[d,h]=u!=null?u:[l,m],g=[c,d,h,f],y=new Ng(l,m,a,i,p,g);return t.runWebGLProgram(y,[n,s],"float32")}var FD={kernelName:Jn,backendName:"webgl",kernelFunc:g9};function x9(r){let{inputs:e,attrs:t,backend:o}=r,{axis:n}=t,{x:s}=e;as(s,"unique"),console.warn("WARNING: ","UI might be locked temporarily as data is being downloaded");let a=o.readSync(s.dataId),{outputValues:i,outputShape:p,indices:u}=K$(a,n,s.shape,s.dtype);return[o.makeTensorInfo(p,s.dtype,i),o.makeTensorInfo([u.length],"int32",u)]}var DD={kernelName:$p,backendName:"webgl",kernelFunc:x9};function y9(r){let{inputs:e,backend:t,attrs:o}=r,{value:n}=e,{axis:s}=o;s<0&&(s+=n.shape.length);let a=n,i=a.shape.length,p=n.shape[s],u=new Array(i-1),c=0;for(let h=0;ht.disposeIntermediateTensorInfo(h)),d}var PD={kernelName:_s,backendName:"webgl",kernelFunc:y9};var _g=class{constructor(e,t){this.variableNames=["x","segmentIds"];let o=e.windowSize,n=e.batchSize,s=e.inSize,a=e.numSegments,i=a*Math.ceil(s/o);this.outputShape=[n,i];let p="0.0",u="sumValue",c=Math.floor(o/4)*4,l=o%4,m=` + sumValue += dot(values, segFilter); + `,f="";s%o>0&&(f=` + if (inIdx < 0 || inIdx >= ${s}) { + return initializationValue; + } + `);let d="";s%o>0&&(d=` + if (inIdx < 0 || inIdx >= ${s}) { + return -1.0; + } + `),this.userCode=` + const float initializationValue = ${p}; + + float getValue(int batch, int inIdx) { + ${f} + return getX(batch, inIdx); + } + + float getSegmentIdAtIndex(int inIdx) { + ${d} + return getSegmentIds(inIdx); + } + + void main() { + ivec2 coords = getOutputCoords(); + int batch = coords[0]; + int outIdx = coords[1]; + int inOffset = int(floor(float(outIdx) / float( + ${a})) * float(${o})); + int currentSeg = int(mod(float(outIdx), float(${a}))); + + float sumValue = 0.0; + + for (int i = 0; i < ${c}; i += 4) { + int inIdx = inOffset + i; + vec4 values = vec4( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + getValue(batch, inIdx + 2), + getValue(batch, inIdx + 3) + ); + + vec4 segFilter = vec4( + int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0, + int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0, + int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0, + int(getSegmentIdAtIndex(inIdx + 3)) == currentSeg ? 1 : 0 + ); + + ${m} + } + + int inIdx = inOffset + ${c}; + if (${l===1}) { + vec4 values = vec4( + getValue(batch, inIdx), + initializationValue, + initializationValue, + initializationValue + ); + + int inIdxSeg = int(getSegmentIdAtIndex(inIdx)); + + vec4 segFilter = vec4( + int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0, + 0, + 0, + 0 + ); + + ${m} + } else if (${l===2}) { + vec4 values = vec4( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + initializationValue, + initializationValue + ); + + vec4 segFilter = vec4( + int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0, + int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0, + 0, + 0 + ); + + ${m} + } else if (${l===3}) { + vec4 values = vec4( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + getValue(batch, inIdx + 2), + initializationValue + ); + + vec4 segFilter = vec4( + int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0, + int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0, + int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0, + 0 + ); + + ${m} + } + setOutput(${u}); + } + `}};function b9(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,segmentIds:s}=e,{numSegments:a}=o,i=n.shape.length,p=[],u=0,c=I.getAxesPermutation([u],i),l=n;c!=null&&(l=xt({inputs:{x:n},backend:t,attrs:{perm:c}}),p.push(l),u=I.getInnerMostAxes(1,i)[0]);let m=I.segment_util.computeOutShape(l.shape,u,a),f=x.sizeFromShape([l.shape[u]]),d=J({inputs:{x:l},backend:t,attrs:{shape:[-1,f]}});p.push(d);let h=Ca(n.dtype),g=(w,k,_,E,R)=>{let A=w.shape[0],D=w.shape[1],O=I.segment_util.segOpComputeOptimalWindowSize(D,R),M={windowSize:O,inSize:D,batchSize:A,numSegments:R},L=new _g(M,k),W=t.compileAndRun(L,[w,_],E);if(p.push(W),W.shape[1]===R)return W;let V=Gw({backend:t,attrs:{start:0,stop:R,step:1,dtype:"float32"}}),G=Hw({inputs:{x:V},backend:t,attrs:{reps:[D/O]}});return p.push(V),p.push(G),g(W,k,G,E,R)},y=g(d,"unsortedSegmentSum",s,h,a),b=J({inputs:{x:y},backend:t,attrs:{shape:m}}),C=b;if(c!=null){p.push(b);let w=I.getUndoAxesPermutation(c);C=xt({inputs:{x:C},backend:t,attrs:{perm:w}})}return p.forEach(w=>t.disposeIntermediateTensorInfo(w)),C}var OD={kernelName:Rp,backendName:"webgl",kernelFunc:b9};var C9=[IR,SR,vR,kR,NR,_R,ER,$R,FR,DR,PR,OR,MR,LR,BR,VR,zR,WR,UR,GR,HR,KR,jR,XR,JR,tA,rA,lR,nA,aA,iA,uA,pA,cA,lA,mA,fA,dA,hA,yA,bA,CA,IA,wA,SA,vA,kA,TA,NA,_A,EA,$A,RA,AA,FA,PA,OA,MA,LA,VA,zA,WA,UA,GA,HA,qA,KA,jA,cR,XA,sA,YA,QA,ZA,mR,JA,eF,tF,rF,oF,nF,sF,aF,iF,uF,cF,lF,mF,fF,dF,hF,xF,bF,CF,IF,wF,SF,_F,hR,EF,$F,RF,AF,YR,FF,OF,MF,LF,BF,fR,VF,zF,WF,UF,GF,QR,vF,HF,qF,KF,xR,jF,XF,YF,QF,ZF,JF,eD,tD,rD,oD,nD,sD,aD,iD,uD,pD,qR,NF,cD,lD,mD,fD,dD,hD,gD,xD,bD,CD,wD,SD,vD,kD,TD,ND,TF,bR,_D,ED,$D,AD,FD,CR,DD,PD,OD,DF];for(let r of C9)ya(r);var Ae;(function(r){r[r.float32=0]="float32",r[r.int32=1]="int32",r[r.bool=2]="bool",r[r.string=3]="string",r[r.complex64=4]="complex64"})(Ae||(Ae={}));var $i;(function(r){r[r.linear=0]="linear",r[r.relu=1]="relu",r[r.relu6=2]="relu6",r[r.prelu=3]="prelu",r[r.leakyrelu=4]="leakyrelu",r[r.sigmoid=5]="sigmoid",r[r.elu=6]="elu"})($i||($i={}));var MD;function I9(r){MD=r.wasm.cwrap(Fo,null,["number","array","number","number","array","number","number","number","number","number","number","number","number"])}function w9(r){let{inputs:e,backend:t,attrs:o}=r,{a:n,b:s,bias:a,preluActivationWeights:i}=e;if(n.dtype!=="float32"||s.dtype!=="float32")throw new Error("_FusedMatMul for non non-float32 tensors not yet supported.");let{transposeA:p,transposeB:u,activation:c,leakyreluAlpha:l}=o,m=t.dataIdMap.get(n.dataId).id,f=t.dataIdMap.get(s.dataId).id,d=0;if(a!=null){let R=t.dataIdMap.get(a.dataId);if(R.shape.length!==1)throw new Error(`_FusedMatMul only supports rank-1 bias but got rank ${R.shape.length}.`);d=R.id}let h=i==null?0:t.dataIdMap.get(i.dataId).id,g=$i[c];if(g==null)throw new Error(`${c} activation not yet supported for FusedConv2D in the wasm backend.`);let y=p?n.shape[2]:n.shape[1],b=u?s.shape[1]:s.shape[2],C=br.assertAndGetBroadcastShape(n.shape.slice(0,-2),s.shape.slice(0,-2)),w=t.makeOutput([...C,y,b],n.dtype),k=t.dataIdMap.get(w.dataId).id,_=new Uint8Array(new Int32Array(n.shape).buffer),E=new Uint8Array(new Int32Array(s.shape).buffer);return MD(m,_,n.shape.length,f,E,s.shape.length,p,u,g,d,h,l||0,k),w}var LD={kernelName:Fo,backendName:"wasm",setupFunc:I9,kernelFunc:w9};function Qe(r,e){let t;function o(s){t=s.wasm.cwrap(r,null,["number","number","number"])}function n(s){let{backend:a,inputs:{x:i}}=s,p=a.dataIdMap.get(i.dataId).id,u=a.makeOutput(i.shape,e||i.dtype),c=a.dataIdMap.get(u.dataId).id;return x.sizeFromShape(u.shape)===0||t(p,Ae[i.dtype],c),u}return{kernelName:r,backendName:"wasm",setupFunc:o,kernelFunc:n}}var BD=Qe(sn);function nt(r,e,t){let o;function n(a){o=a.wasm.cwrap(r,null,["number","array","number","number","array","number","number","number"])}function s(a){let{backend:i,inputs:p}=a,{a:u,b:c}=p,l=i.dataIdMap.get(u.dataId).id,m=i.dataIdMap.get(c.dataId).id,f=t!=null?t:u.dtype,d=I.assertAndGetBroadcastShape(u.shape,c.shape),h=i.makeOutput(d,f);if(x.sizeFromShape(d)===0)return h;let g=new Uint8Array(new Int32Array(u.shape).buffer),y=new Uint8Array(new Int32Array(c.shape).buffer),b=i.dataIdMap.get(h.dataId).id;return(()=>o(l,g,u.shape.length,m,y,c.shape.length,Ae[u.dtype],b))(),h}return{kernelName:r,backendName:"wasm",setupFunc:n,kernelFunc:s}}var S9=!0,VD=nt(_r,S9);var zD;function v9(r){zD=r.wasm.cwrap(an,null,["array","number","number","number"])}function k9(r){let{inputs:e,backend:t}=r,o=t.makeOutput(e[0].shape,e[0].dtype);if(x.sizeFromShape(o.shape)===0)return o;let n=e.map(i=>t.dataIdMap.get(i.dataId).id),s=new Uint8Array(new Int32Array(n).buffer),a=t.dataIdMap.get(o.dataId).id;return zD(s,n.length,Ae[o.dtype],a),o}var WD={kernelName:an,backendName:"wasm",setupFunc:v9,kernelFunc:k9};function zu(r){let{inputs:{x:e},backend:t}=r;if(e.dtype==="string")return nr(t.readSync(e.dataId),e.shape,e.dtype);let o=t.makeOutput(e.shape,e.dtype),n=t.typedArrayFromHeap(e);return t.typedArrayFromHeap(o).set(n),o}var UD={kernelName:uo,backendName:"wasm",kernelFunc:zu};var GD;function T9(r){GD=r.wasm.cwrap(Mr,null,["number","array","number","number","number","array","number"])}function Eo(r){let{inputs:e,backend:t,attrs:o}=r,[n,s]=_9(e.x.shape,o.perm),a=!0;for(let d=0;d=n&&(s===-1||o[s]>o[a])&&(s=a);o[s]=n}return[t,o]}var HD={kernelName:Mr,backendName:"wasm",kernelFunc:Eo,setupFunc:T9};function kr(r,e,t){let o=r.shape,n=r.shape.length,s=x.parseAxisParam(e,o),a=s,i=I.getAxesPermutation(a,n),p=null,u=!1;if(i!=null){let c=new Array(n);for(let f=0;f`new shape: ${a}, old shape: ${o.shape}. New shape and old shape must have the same number of elements.`),r.backend.incRef(o.dataId),{dataId:o.dataId,shape:a,dtype:o.dtype}}var eP={kernelName:Ss,backendName:"wasm",kernelFunc:Mt};var tP;function M9(r){tP=r.wasm.cwrap(cn,null,["number","array","number","number","array","number","number","number","number"])}function L9(r){let{inputs:e,backend:t,attrs:o}=r,{a:n,b:s}=e,{transposeA:a,transposeB:i}=o;if(n.dtype!=="float32"||s.dtype!=="float32")throw new Error("BatchMatMul for non non-float32 tensors not yet supported.");let p=n.shape.length,u=s.shape.length,c=a?n.shape[p-2]:n.shape[p-1],l=i?s.shape[u-1]:s.shape[u-2],m=a?n.shape[p-1]:n.shape[p-2],f=i?s.shape[u-2]:s.shape[u-1],d=n.shape.slice(0,-2),h=s.shape.slice(0,-2),g=x.sizeFromShape(d),y=x.sizeFromShape(h),C=br.assertAndGetBroadcastShape(n.shape.slice(0,-2),s.shape.slice(0,-2)).concat([m,f]);x.assert(c===l,()=>`Error in matMul: inner shapes (${c}) and (${l}) of Tensors with shapes ${n.shape} and ${s.shape} and transposeA=${a} and transposeB=${i} must match.`);let w=a?[g,c,m]:[g,m,c],k=i?[y,f,l]:[y,l,f],_=Mt({inputs:{x:n},backend:t,attrs:{shape:w}}),E=Mt({inputs:{x:s},backend:t,attrs:{shape:k}}),R=t.dataIdMap.get(_.dataId).id,A=t.dataIdMap.get(E.dataId).id,D=a?_.shape[2]:_.shape[1],O=i?E.shape[1]:E.shape[2],M=Math.max(g,y),L=t.makeOutput([M,D,O],_.dtype),W=t.dataIdMap.get(L.dataId).id,V=new Uint8Array(new Int32Array(_.shape).buffer),G=new Uint8Array(new Int32Array(E.shape).buffer);return tP(R,V,_.shape.length,A,G,E.shape.length,a,i,W),t.disposeData(_.dataId),t.disposeData(E.dataId),L.shape=C,L}var rP={kernelName:cn,backendName:"wasm",setupFunc:M9,kernelFunc:L9};function Xo(r){let{inputs:{x:e},attrs:{begin:t,size:o},backend:n}=r,[s,a]=et.parseSliceParams(e,t,o),i=et.isSliceContinous(e.shape,s,a),p=n.readSync(e.dataId),u=n.makeOutput(a,e.dtype),c=x.computeStrides(e.shape),l=n.dataIdMap.get(u.dataId);if(i){let d=et.computeFlatOffset(s,c);return e.dtype==="string"?l.stringBytes=p.slice(d,d+x.sizeFromShape(a)):n.typedArrayFromHeap(u).set(p.subarray(d,d+x.sizeFromShape(a))),u}if(e.dtype==="string"){let d=vu(p,s,a,e.shape,e.dtype);return l.stringBytes=d,u}let m=n.typedArrayFromHeap(u),f=e.shape.length;if(f===2)B9(p,c[0],m,s,a);else if(f===3)V9(p,c[0],c[1],m,s,a);else if(f===4)z9(p,c[0],c[1],c[2],m,s,a);else{let d=vu(p,s,a,e.shape,e.dtype);m.set(d)}return u}function B9(r,e,t,o,n){let s=0,a=o[0],i=o[1],p=a+n[0];for(let u=a;uy*b),p=I.getReshaped(n.shape,s,i),u=I.getPermuted(p.length,s.length),c=I.getReshapedPermuted(n.shape,s,i),l=I.getSliceBeginCoords(a,s.length),m=I.getSliceSize(c,a,s.length),f=Mt({inputs:{x:n},backend:t,attrs:{shape:p}}),d=Eo({inputs:{x:f},backend:t,attrs:{perm:u}}),h=Mt({inputs:{x:d},backend:t,attrs:{shape:c}}),g=Xo({inputs:{x:h},backend:t,attrs:{begin:l,size:m}});return t.disposeData(f.dataId),t.disposeData(d.dataId),t.disposeData(f.dataId),g}var nP={kernelName:hs,backendName:"wasm",kernelFunc:W9};function cs(r){let{inputs:{x:e},attrs:{dtype:t},backend:o}=r,n=o.makeOutput(e.shape,t),s=o.typedArrayFromHeap(e);return o.typedArrayFromHeap(n).set(s),n}var sP={kernelName:to,backendName:"wasm",kernelFunc:cs};var aP=Qe(ro);var iP;function U9(r){iP=r.wasm.cwrap(Ro,null,["number","number","number","number"])}function G9(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{clipValueMin:s,clipValueMax:a}=o,i=t.dataIdMap.get(n.dataId).id,p=t.makeOutput(n.shape,n.dtype),u=t.dataIdMap.get(p.dataId).id;return iP(i,s,a,u),p}var uP={kernelName:Ro,backendName:"wasm",setupFunc:U9,kernelFunc:G9};function qw(r){let{inputs:e,backend:t}=r,o=x.parseAxisParam(r.attrs.axis,e[0].shape)[0],n=e.map(f=>f.shape);I.assertParamsConsistent(n,o);let s=I.computeOutShape(e.map(f=>f.shape),o),a=e.filter(f=>x.sizeFromShape(f.shape)>0);if(a.length===1)return zu({inputs:{x:a[0]},backend:t});let i=t.makeOutput(s,e[0].dtype);if(x.sizeFromShape(s)===0)return i;if(a[0].dtype==="string"){let f=a.map(C=>{let k=[-1,x.sizeFromShape(C.shape.slice(o))];return Mt({inputs:{x:C},backend:t,attrs:{shape:k}})}),d=f.map(C=>({vals:t.readSync(C.dataId),shape:C.shape}));s=I.computeOutShape(f.map(C=>C.shape),1);let h=f[0].shape[0]===1,g=Iu(d,s,e[0].dtype,h),y=I.computeOutShape(a.map(C=>C.shape),o);i.shape=y;let b=t.dataIdMap.get(i.dataId);return b.stringBytes=I.fromStringArrayToUint8(g),f.forEach(C=>t.disposeData(C.dataId)),i}let p=x.sizeFromShape(a[0].shape.slice(0,o)),u=0,c=a.map(f=>{let d=x.sizeFromShape(f.shape.slice(o));return u+=d,d}),l=a.map(f=>t.typedArrayFromHeap(f)),m=t.typedArrayFromHeap(i);for(let f=0;f`cumprod does not support ${n.dtype} tensors in the WASM backend`);let u=I.getAxesPermutation([s],p),c=n;u!==null&&(c=Eo({inputs:{x:n},attrs:{perm:u},backend:t}));let l=I.getInnerMostAxes(1,p)[0];I.assertAxesAreInnerMostDims("cumprod",[l],p);let m=t.makeOutput(c.shape,c.dtype),f=c.shape[l],d=t.dataIdMap.get(c.dataId).id,h=t.dataIdMap.get(m.dataId).id;yP(d,a?1:0,i?1:0,f,h,Ae[n.dtype]);let g=m;if(u!==null){let y=I.getUndoAxesPermutation(u);g=Eo({inputs:{x:m},attrs:{perm:y},backend:t}),t.disposeData(c.dataId),t.disposeData(m.dataId)}return g}var bP={kernelName:hn,backendName:"wasm",setupFunc:Q9,kernelFunc:Z9};var CP;function J9(r){CP=r.wasm.cwrap(gn,null,["number","number","number","number","number","number"])}function eJ(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s,exclusive:a,reverse:i}=o,p=n.shape.length;x.assert(n.dtype==="float32"||n.dtype==="int32",()=>`cumsum does not support ${n.dtype} tensors in the WASM backend`);let u=I.getAxesPermutation([s],p),c=n;u!==null&&(c=Eo({inputs:{x:n},attrs:{perm:u},backend:t}));let l=I.getInnerMostAxes(1,p)[0];I.assertAxesAreInnerMostDims("cumsum",[l],p);let m=t.makeOutput(c.shape,c.dtype),f=c.shape[l],d=t.dataIdMap.get(c.dataId).id,h=t.dataIdMap.get(m.dataId).id;CP(d,a?1:0,i?1:0,f,h,Ae[n.dtype]);let g=m;if(u!==null){let y=I.getUndoAxesPermutation(u);g=Eo({inputs:{x:m},attrs:{perm:y},backend:t}),t.disposeData(c.dataId),t.disposeData(m.dataId)}return g}var IP={kernelName:gn,backendName:"wasm",setupFunc:J9,kernelFunc:eJ};var wP;function tJ(r){wP=r.wasm.cwrap(yn,null,["number","number","number","array","number","array","array","number","number"])}function rJ(r){let{backend:e,inputs:t,attrs:o}=r,{x:n}=t,{blockSize:s,dataFormat:a}=o,i=n.shape[0],p=a==="NHWC"?n.shape[1]:n.shape[2],u=a==="NHWC"?n.shape[2]:n.shape[3],c=a==="NHWC"?n.shape[3]:n.shape[1],l=p*s,m=u*s,f=c/(s*s),d=a==="NHWC"?[i,l,m,f]:[i,f,l,m],h=e.makeOutput(d,"float32"),y=e.dataIdMap.get(n.dataId).id,b=new Uint8Array(new Int32Array(x.computeStrides(n.shape)).buffer),C=new Uint8Array(new Int32Array(d).buffer),w=new Uint8Array(new Int32Array(x.computeStrides(d)).buffer),k=e.dataIdMap.get(h.dataId).id;return wP(y,s,a==="NHWC"?1:0,b,n.shape.length-1,C,w,d.length,k),h}var SP={kernelName:yn,backendName:"wasm",setupFunc:tJ,kernelFunc:rJ};var vP;function oJ(r){vP=r.wasm.cwrap(bn,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function nJ(r){let{inputs:e,attrs:t,backend:o}=r,{x:n,filter:s}=e,a=o.dataIdMap.get(n.dataId).id,i=o.dataIdMap.get(s.dataId).id,{strides:p,dilations:u,pad:c,dimRoundingMode:l}=t,m=u==null?[1,1]:u,f=I.computeConv2DInfo(n.shape,s.shape,p,m,c,l,!0),d=f.filterHeight,h=f.filterWidth,g=f.padInfo.top,y=f.padInfo.right,b=f.padInfo.bottom,C=f.padInfo.left,w=f.dilationHeight,k=f.dilationWidth,_=f.strideHeight,E=f.strideWidth,R=f.inChannels,A=f.outChannels,D=f.padInfo.type==="SAME"?1:0;if(f.dataFormat!=="channelsLast")throw new Error(`wasm backend DepthwiseConv2dNative does not support dataFormat:'${f.dataFormat}'. Please use 'channelsLast'.`);let O=o.makeOutput(f.outShape,"float32"),M=o.dataIdMap.get(O.dataId).id;return vP(a,n.shape[0],n.shape[1],n.shape[2],i,d,h,g,y,b,C,D,w,k,_,E,R,A,M),O}var kP={kernelName:bn,backendName:"wasm",setupFunc:oJ,kernelFunc:nJ};var TP=Qe(In);var sJ=!1,NP=nt(oo,sJ,"bool");var _P=Qe(no,"float32");function Eg(r){let{inputs:e,attrs:t,backend:o}=r,{input:n}=e,{dim:s}=t,a=n.shape.length,i=n.shape.slice(),p=s;return s<0&&(x.assert(-(a+1)<=s,()=>`Axis must be in the interval [${-(a+1)}, ${a}]`),p=a+s+1),i.splice(p,0,1),Mt({inputs:{x:n},backend:o,attrs:{shape:i}})}var EP={kernelName:xs,backendName:"wasm",kernelFunc:Eg};function jw(r){let{attrs:{shape:e,value:t,dtype:o},backend:n}=r,s=n.makeOutput(e,o);return n.typedArrayFromHeap(s).fill(t),s}var $P={kernelName:ys,backendName:"wasm",kernelFunc:jw};var RP;function aJ(r){RP=r.wasm.cwrap(Sn,null,["number","number","number","number","number","number"])}function iJ(r){let{inputs:e,backend:t}=r,{image:o}=e,n=t.makeOutput(o.shape,o.dtype),s=t.dataIdMap.get(o.dataId).id,a=t.dataIdMap.get(n.dataId).id,[i,p,u,c]=o.shape;return RP(s,i,p,u,c,a),n}var AP={kernelName:Sn,backendName:"wasm",kernelFunc:iJ,setupFunc:aJ};var FP=Qe(so);var uJ=!1,DP=nt(vn,uJ);var PP;function pJ(r){PP=r.wasm.cwrap(kn,null,["number","number","number","number","number","number","number"])}function cJ(r){let{backend:e,inputs:t,attrs:o}=r,{varianceEpsilon:n}=o,{x:s,mean:a,variance:i,offset:p,scale:u}=t,c=e.dataIdMap.get(s.dataId).id,l=e.dataIdMap.get(a.dataId).id,m=e.dataIdMap.get(i.dataId).id,f=p!=null?e.dataIdMap.get(p.dataId).id:0,d=u!=null?e.dataIdMap.get(u.dataId).id:0,h=e.makeOutput(s.shape,s.dtype);if(x.sizeFromShape(s.shape)===0)return h;let g=e.dataIdMap.get(h.dataId).id;return PP(c,l,m,f,d,n,g),h}var OP={kernelName:kn,backendName:"wasm",setupFunc:pJ,kernelFunc:cJ};var MP;function lJ(r){MP=r.wasm.cwrap(Do,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function mJ(r){let{inputs:e,attrs:t,backend:o}=r,{x:n,filter:s,bias:a,preluActivationWeights:i}=e,{strides:p,pad:u,dilations:c,dataFormat:l,dimRoundingMode:m,activation:f,leakyreluAlpha:d}=t,h=I.computeConv2DInfo(n.shape,s.shape,p,c,u,m),g=$i[f];if(g==null)throw new Error(`${f} activation not yet supported for FusedConv2D in the wasm backend.`);let y=o.dataIdMap.get(n.dataId).id,b=o.dataIdMap.get(s.dataId).id,C=h.outChannels,w=0;if(a!=null){let X=o.dataIdMap.get(a.dataId);if(X.shape.length!==1)throw new Error(`FusedConv2D only supports rank-1 bias but got rank ${X.shape.length}.`);if(X.shape[0]!==C)throw new Error(`FusedConv2D bias shape (${X.shape}) does not match the number of output channels (${C})`);w=X.id}let k=h.filterHeight,_=h.filterWidth,E=h.padInfo.top,R=h.padInfo.right,A=h.padInfo.bottom,D=h.padInfo.left,O=h.dilationHeight,M=h.dilationWidth,L=h.strideHeight,W=h.strideWidth,V=h.inChannels,G=h.padInfo.type==="SAME"?1:0,q=h.batchSize,H=h.inHeight,j=h.inWidth;if(l!=="NHWC")throw new Error(`wasm backend FusedConv2D does not support dataFormat:'${l}'. Please use 'NHWC'.`);let Y=o.makeOutput(h.outShape,"float32"),Z=o.dataIdMap.get(Y.dataId).id,ee=i==null?0:o.dataIdMap.get(i.dataId).id;return MP(y,q,H,j,b,k,_,w,E,R,A,D,G,O,M,L,W,V,C,g,ee,d||0,Z),Y}var LP={kernelName:Do,backendName:"wasm",setupFunc:lJ,kernelFunc:mJ};var BP;function fJ(r){BP=r.wasm.cwrap(Po,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function dJ(r){let{inputs:e,attrs:t,backend:o}=r,{x:n,filter:s,bias:a,preluActivationWeights:i}=e,{strides:p,pad:u,dilations:c,dataFormat:l,dimRoundingMode:m,activation:f,leakyreluAlpha:d}=t,h=I.computeConv2DInfo(n.shape,s.shape,p,c,u,m,!0),g=$i[f];if(g==null)throw new Error(`${f} activation not yet supported for FusedDepthwiseConv2D in the wasm backend.`);let y=o.dataIdMap.get(n.dataId).id,b=o.dataIdMap.get(s.dataId).id,C=h.outChannels,w=0;if(a!=null){let X=o.dataIdMap.get(a.dataId);if(X.shape.length!==1)throw new Error(`FusedDepthwiseConv2D only supports rank-1 bias but got rank ${X.shape.length}.`);if(X.shape[0]!==C)throw new Error(`FusedDepthwiseConv2D bias shape (${X.shape}) does not match the number of output channels (${C})`);w=X.id}let k=h.filterHeight,_=h.filterWidth,E=h.padInfo.top,R=h.padInfo.right,A=h.padInfo.bottom,D=h.padInfo.left,O=h.dilationHeight,M=h.dilationWidth,L=h.strideHeight,W=h.strideWidth,V=h.inChannels,G=h.padInfo.type==="SAME"?1:0,q=h.batchSize,H=h.inHeight,j=h.inWidth;if(l!=="NHWC")throw new Error(`wasm backend FusedDepthwiseConv2D does not support dataFormat:'${l}'. Please use 'NHWC'.`);let Y=o.makeOutput(h.outShape,"float32"),Z=o.dataIdMap.get(Y.dataId).id,ee=i==null?0:o.dataIdMap.get(i.dataId).id;return BP(y,q,H,j,b,k,_,w,E,R,A,D,G,O,M,L,W,V,C,g,ee,d||0,Z),Y}var VP={kernelName:Po,backendName:"wasm",setupFunc:fJ,kernelFunc:dJ};var zP;function hJ(r){zP=r.wasm.cwrap(Tn,null,["number","number","number","number","number","number","array","number"])}function gJ(r){let{backend:e,inputs:t}=r,{params:o,indices:n}=t,[s,a,i,p]=af.prepareAndValidate(o,n),u=e.makeOutput(s,o.dtype);if(a===0)return u;let c=n.shape,l=c[c.length-1],f=e.dataIdMap.get(o.dataId).id,h=e.dataIdMap.get(n.dataId).id,g=new Uint8Array(new Int32Array(p).buffer),y=e.dataIdMap.get(u.dataId).id;return zP(f,Ae[o.dtype],h,a,l,i,g,y),u}var WP={kernelName:Tn,backendName:"wasm",setupFunc:hJ,kernelFunc:gJ};var UP;function xJ(r){UP=r.wasm.cwrap("Gather",null,["number","number","array","number","number","number","array","number"])}function yJ(r){let{backend:e,inputs:t,attrs:o}=r,{x:n,indices:s}=t,{axis:a,batchDims:i}=o,p=x.parseAxisParam(a,n.shape)[0],u=e.readSync(s.dataId),c=n.shape[p];for(let A=0;A=0,()=>`GatherV2: the index value ${D} is not in [0, ${c-1}]`)}let l=I.segment_util.collectGatherOpShapeInfo(n,s,p,i),m=Mt({inputs:{x:n},attrs:{shape:[l.batchSize,l.outerSize,l.dimSize,l.sliceSize]},backend:e}),f=x.sizeFromShape(s.shape),d=Mt({inputs:{x:s},attrs:{shape:[l.batchSize,f/l.batchSize]},backend:e}),h=[l.batchSize,l.outerSize,f/l.batchSize,l.sliceSize],g=e.makeOutput(h,n.dtype);if(x.sizeFromShape(n.shape)===0)return g;let y=m.shape.length-1,C=e.dataIdMap.get(m.dataId).id,k=e.dataIdMap.get(d.dataId).id,_=e.dataIdMap.get(g.dataId).id,E=new Uint8Array(new Int32Array(x.computeStrides(m.shape)).buffer),R=new Uint8Array(new Int32Array(x.computeStrides(h)).buffer);return UP(C,Ae[n.dtype],E,y,k,l.batchSize,R,_),e.disposeData(m.dataId),e.disposeData(d.dataId),g.shape=l.outputShape,g}var GP={kernelName:bs,backendName:"wasm",setupFunc:xJ,kernelFunc:yJ};var bJ=!1,HP=nt(ao,bJ,"bool");var CJ=!1,qP=nt(io,CJ,"bool");var KP;function IJ(r){KP=r.wasm.cwrap(Nn,null,["number","number","number","number"])}function wJ(r){let{inputs:{x:e},attrs:{alpha:t},backend:o}=r,n=o.dataIdMap.get(e.dataId).id,s=o.makeOutput(e.shape,"float32");if(x.sizeFromShape(e.shape)!==0){let a=o.dataIdMap.get(s.dataId).id;KP(n,Ae[e.dtype],t,a)}return s}var jP={kernelName:Nn,backendName:"wasm",setupFunc:IJ,kernelFunc:wJ};var SJ=!1,XP=nt(po,SJ,"bool");var vJ=!1,YP=nt(co,vJ,"bool");var QP=Qe(lo);var kJ=!1,ZP=nt(_n,kJ,"bool");var JP=Qe(En);var TJ=!1,eO=nt(ua,TJ,"bool");var NJ=!1,tO=nt(g0,NJ,"bool");var rO;function _J(r){rO=r.wasm.cwrap($n,null,["number","number","number","number"])}function EJ(r){let{backend:e,inputs:t,attrs:o}=r,{reductionIndices:n,keepDims:s}=o,{x:a}=t,p=e.dataIdMap.get(a.dataId).id,u=a,{transposed:c,axes:l,originalAxes:m,inputWasTransposed:f}=kr(a,n,e);if(f){let C=e.dataIdMap.get(c.dataId).id;u=c,p=C}let d=u.shape.length;I.assertAxesAreInnerMostDims("max",l,d);let[h,g]=I.computeOutAndReduceShapes(u.shape,l),y=x.sizeFromShape(g),b=e.makeOutput(h,a.dtype);if(x.sizeFromShape(u.shape)!==0){let C=e.dataIdMap.get(b.dataId).id;rO(p,Ae[a.dtype],y,C)}if(f&&e.disposeData(c.dataId),s){let C=I.expandShapeToKeepDim(b.shape,m);b.shape=C}return b}var oO={kernelName:$n,backendName:"wasm",setupFunc:_J,kernelFunc:EJ};var $J=!1,nO=nt(mo,$J);var sO;function RJ(r){sO=r.wasm.cwrap(Rn,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function AJ(r){let{inputs:e,attrs:t,backend:o}=r,n=e.x,s=o.dataIdMap.get(n.dataId).id;x.assert(n.dtype==="float32",()=>`Error in MaxPool: only float32 input is supported. Got ${n.dtype}.`);let{filterSize:a,strides:i,pad:p,dimRoundingMode:u}=t,c=I.computePool2DInfo(n.shape,a,i,1,p,u),l=c.filterHeight,m=c.filterWidth,f=c.padInfo.top,d=c.padInfo.right,h=c.padInfo.bottom,g=c.padInfo.left,y=c.dilationHeight,b=c.dilationWidth,C=c.strideHeight,w=c.strideWidth,k=c.inChannels,_=c.outChannels;if(c.dataFormat!=="channelsLast")throw new Error(`wasm backend does not support dataFormat:'${c.dataFormat}'. Please use 'channelsLast'.`);let E=o.makeOutput(c.outShape,"float32"),R=o.dataIdMap.get(E.dataId).id;return sO(s,n.shape[0],n.shape[1],n.shape[2],l,m,f,d,h,g,y,b,C,w,k,_,R),E}var aO={kernelName:Rn,backendName:"wasm",setupFunc:RJ,kernelFunc:AJ};var iO;function FJ(r){iO=r.wasm.cwrap(An,null,["number, number, number"])}function DJ(r){let{backend:e,inputs:t,attrs:o}=r,{axis:n,keepDims:s}=o,{x:a}=t,i=e.dataIdMap.get(a.dataId).id,p=i,u=a,{transposed:c,axes:l,originalAxes:m,inputWasTransposed:f}=kr(a,n,e),d=l;if(f){let w=e.dataIdMap.get(c.dataId).id;w!==i&&(u=c,p=w,d=I.getInnerMostAxes(d.length,u.shape.length))}I.assertAxesAreInnerMostDims("mean",d,u.shape.length);let[h,g]=I.computeOutAndReduceShapes(u.shape,d),y=x.sizeFromShape(g),b=u;u.dtype!=="float32"&&(b=cs({backend:e,inputs:{x:u},attrs:{dtype:"float32"}}),p=e.dataIdMap.get(b.dataId).id);let C=e.makeOutput(h,"float32");if(x.sizeFromShape(u.shape)!==0){let w=e.dataIdMap.get(C.dataId).id;iO(p,y,w)}if(f&&e.disposeData(c.dataId),s){let w=I.expandShapeToKeepDim(C.shape,m);C.shape=w}return u.dtype!=="float32"&&e.disposeData(b.dataId),C}var uO={kernelName:An,backendName:"wasm",setupFunc:FJ,kernelFunc:DJ};var pO;function PJ(r){pO=r.wasm.cwrap(Fn,null,["number","number","number","number"])}function OJ(r){let{backend:e,inputs:t,attrs:o}=r,{axis:n,keepDims:s}=o,{x:a}=t,i=e.dataIdMap.get(a.dataId).id,p=i,u=a,{transposed:c,axes:l,originalAxes:m,inputWasTransposed:f}=kr(a,n,e);if(f){let C=e.dataIdMap.get(c.dataId).id;C!==i&&(u=c,p=C)}let d=u.shape.length;I.assertAxesAreInnerMostDims("min",l,d);let[h,g]=I.computeOutAndReduceShapes(u.shape,l),y=x.sizeFromShape(g),b=e.makeOutput(h,u.dtype);if(x.sizeFromShape(u.shape)!==0){let C=e.dataIdMap.get(b.dataId).id;pO(p,Ae[a.dtype],y,C)}if(f&&e.disposeData(c.dataId),s){let C=I.expandShapeToKeepDim(b.shape,m);b.shape=C}return b}var cO={kernelName:Fn,backendName:"wasm",setupFunc:PJ,kernelFunc:OJ};var MJ=!1,lO=nt(fo,MJ);var Xw;(function(r){r[r.reflect=0]="reflect",r[r.symmetric=1]="symmetric"})(Xw||(Xw={}));var mO;function LJ(r){mO=r.wasm.cwrap(Dn,null,["number","array","number","number","array","array","number","number"])}function BJ(r){let{inputs:{x:e},backend:t,attrs:{paddings:o,mode:n}}=r,s=o.map((d,h)=>d[0]+e.shape[h]+d[1]),a=t.dataIdMap.get(e.dataId).id,i=t.makeOutput(s,e.dtype),p=t.dataIdMap.get(i.dataId).id,u=new Uint8Array(new Int32Array(e.shape).buffer),c=o.map(d=>d[0]),l=o.map(d=>d[1]),m=new Uint8Array(new Int32Array(c).buffer),f=new Uint8Array(new Int32Array(l).buffer);return mO(a,u,e.shape.length,Ae[e.dtype],m,f,Xw[n],p),i}var fO={kernelName:Dn,backendName:"wasm",kernelFunc:BJ,setupFunc:LJ};var VJ=!0,dO=nt(ho,VJ);var hO=Qe(Pn);function kc(r,e){let t=new Int32Array(r.wasm.HEAPU8.buffer,e,4),o=t[0],n=t[1],s=t[2],a=t[3];return r.wasm._free(e),{pSelectedIndices:o,selectedSize:n,pSelectedScores:s,pValidOutputs:a}}var gO;function zJ(r){gO=r.wasm.cwrap(On,"number",["number","number","number","number","number"])}function WJ(r){let{backend:e,inputs:t,attrs:o}=r,{iouThreshold:n,maxOutputSize:s,scoreThreshold:a}=o,{boxes:i,scores:p}=t,u=e.dataIdMap.get(i.dataId).id,c=e.dataIdMap.get(p.dataId).id,l=gO(u,c,s,n,a),{pSelectedIndices:m,selectedSize:f,pSelectedScores:d,pValidOutputs:h}=kc(e,l);return e.wasm._free(d),e.wasm._free(h),e.makeOutput([f],"int32",m)}var xO={kernelName:On,backendName:"wasm",setupFunc:zJ,kernelFunc:WJ};var yO;function UJ(r){yO=r.wasm.cwrap(pa,"number",["number","number","number","number","number","bool"])}function GJ(r){let{backend:e,inputs:t,attrs:o}=r,{iouThreshold:n,maxOutputSize:s,scoreThreshold:a,padToMaxOutputSize:i}=o,{boxes:p,scores:u}=t,c=e.dataIdMap.get(p.dataId).id,l=e.dataIdMap.get(u.dataId).id,m=yO(c,l,s,n,a,i),{pSelectedIndices:f,selectedSize:d,pSelectedScores:h,pValidOutputs:g}=kc(e,m);e.wasm._free(h);let y=e.makeOutput([d],"int32",f),b=e.makeOutput([],"int32",g);return[y,b]}var bO={kernelName:pa,backendName:"wasm",setupFunc:UJ,kernelFunc:GJ};var CO;function HJ(r){CO=r.wasm.cwrap(Mn,"number",["number","number","number","number","number","number"])}function qJ(r){let{backend:e,inputs:t,attrs:o}=r,{iouThreshold:n,maxOutputSize:s,scoreThreshold:a,softNmsSigma:i}=o,{boxes:p,scores:u}=t,c=e.dataIdMap.get(p.dataId).id,l=e.dataIdMap.get(u.dataId).id,m=CO(c,l,s,n,a,i),{pSelectedIndices:f,selectedSize:d,pSelectedScores:h,pValidOutputs:g}=kc(e,m);e.wasm._free(g);let y=e.makeOutput([d],"int32",f),b=e.makeOutput([d],"float32",h);return[y,b]}var IO={kernelName:Mn,backendName:"wasm",setupFunc:HJ,kernelFunc:qJ};var KJ=!1,wO=nt(go,KJ,"bool");var SO;function jJ(r){SO=r.wasm.cwrap(ca,null,["number","number","number","number","number"])}function XJ(r){let{inputs:e,backend:t,attrs:o}=r,{indices:n}=e,{dtype:s,depth:a,onValue:i,offValue:p}=o,u=t.makeOutput([...n.shape,a],s),c=t.dataIdMap.get(u.dataId).id,m=t.dataIdMap.get(n.dataId).id;return SO(m,a,i,p,c),u}var vO={kernelName:ca,backendName:"wasm",setupFunc:jJ,kernelFunc:XJ};function YJ(r){let{inputs:{x:e},backend:t}=r,o=t.makeOutput(e.shape,e.dtype);return t.typedArrayFromHeap(o).fill(1),o}var kO={kernelName:Cs,backendName:"wasm",kernelFunc:YJ};function QJ(r){let{inputs:e,backend:t,attrs:o}=r,{axis:n}=o;if(e.length===1)return Eg({inputs:{input:e[0]},backend:t,attrs:{dim:n}});let s=e[0].shape,a=e[0].dtype;e.forEach(c=>{x.assertShapesMatch(s,c.shape,"All tensors passed to stack must have matching shapes"),x.assert(a===c.dtype,()=>"All tensors passed to stack must have matching dtypes")});let i=[],p=e.map(c=>{let l=Eg({inputs:{input:c},backend:t,attrs:{dim:n}});return i.push(l),l}),u=qw({inputs:p,backend:t,attrs:{axis:n}});return i.forEach(c=>t.disposeData(c.dataId)),u}var TO={kernelName:Is,backendName:"wasm",kernelFunc:QJ};var NO;function ZJ(r){NO=r.wasm.cwrap(Ln,null,["number","array","number","number","array","array","number","number"])}function JJ(r){let{inputs:{x:e},backend:t,attrs:{paddings:o,constantValue:n}}=r,s=o.map((h,g)=>h[0]+e.shape[g]+h[1]);if(x.sizeFromShape(e.shape)===0)return jw({backend:t,attrs:{shape:s,value:n,dtype:e.dtype}});let a=t.dataIdMap.get(e.dataId).id,i=t.makeOutput(s,e.dtype),u=t.dataIdMap.get(i.dataId).id,c=new Uint8Array(new Int32Array(e.shape).buffer),l=o.map(h=>h[0]),m=o.map(h=>h[1]),f=new Uint8Array(new Int32Array(l).buffer),d=new Uint8Array(new Int32Array(m).buffer);return NO(a,c,e.shape.length,Ae[e.dtype],f,d,n,u),i}var $g={kernelName:Ln,backendName:"wasm",kernelFunc:JJ,setupFunc:ZJ};var eee=!1,_O=nt(Bn,eee);var EO;function tee(r){EO=r.wasm.cwrap(Vn,null,["number","number","number"])}function ree(r){let{inputs:e,backend:t}=r,{x:o,alpha:n}=e,s=t.dataIdMap.get(o.dataId).id,a=t.dataIdMap.get(n.dataId).id,i=s,p=o,u=p;p.dtype!=="float32"&&(u=cs({backend:t,inputs:{x:o},attrs:{dtype:"float32"}}),i=t.dataIdMap.get(u.dataId).id);let c=t.makeOutput(o.shape,"float32"),l=t.dataIdMap.get(c.dataId).id;return EO(i,a,l),p.dtype!=="float32"&&t.disposeData(u.dataId),c}var $O={kernelName:Vn,backendName:"wasm",setupFunc:tee,kernelFunc:ree};var RO;function oee(r){RO=r.wasm.cwrap(Ao,null,["number","number","number","number"])}function nee(r){let{backend:e,inputs:t,attrs:o}=r,{axis:n,keepDims:s}=o,{x:a}=t,i=e.dataIdMap.get(a.dataId).id,p=i,u=a,{transposed:c,axes:l,originalAxes:m,inputWasTransposed:f}=kr(a,n,e),d=l;if(f){let C=e.dataIdMap.get(c.dataId).id;C!==i&&(u=c,p=C,d=I.getInnerMostAxes(d.length,u.shape.length))}I.assertAxesAreInnerMostDims("prod",d,u.shape.length);let[h,g]=I.computeOutAndReduceShapes(u.shape,d),y=x.sizeFromShape(g),b=e.makeOutput(h,u.dtype);if(x.sizeFromShape(u.shape)!==0){let C=e.dataIdMap.get(b.dataId).id;RO(p,y,Ae[b.dtype],C)}if(f&&e.disposeData(c.dataId),s){let C=I.expandShapeToKeepDim(b.shape,m);b.shape=C}return b}var AO={kernelName:Ao,backendName:"wasm",setupFunc:oee,kernelFunc:nee};var see=r=>{let{backend:e,attrs:t}=r,{start:o,stop:n,step:s,dtype:a}=t,i=Su(o,n,s,a),p=e.makeOutput([i.length],a);return e.typedArrayFromHeap(p).set(i),p},FO={kernelName:ws,backendName:"wasm",kernelFunc:see};var aee=!0,DO=nt(Cn,aee);var PO=Qe(zn);var OO=Qe(Gn);var MO;function iee(r){MO=r.wasm.cwrap(Un,null,["number","number","number","number","number","number","number","number","number","number"])}function uee(r){let{backend:e,inputs:t,attrs:o}=r,{images:n}=t,{alignCorners:s,halfPixelCenters:a,size:i}=o,[p,u]=i,[c,l,m,f]=n.shape,d=[c,p,u,f],h=e.dataIdMap.get(n.dataId),g;h.dtype!=="float32"&&(g=cs({backend:e,inputs:{x:n},attrs:{dtype:"float32"}}),h=e.dataIdMap.get(g.dataId));let y=h.id,b=e.makeOutput(d,"float32");if(x.sizeFromShape(n.shape)===0)return b;let C=e.dataIdMap.get(b.dataId).id;return MO(y,c,l,m,f,p,u,s?1:0,a?1:0,C),g!=null&&e.disposeData(g.dataId),b}var LO={kernelName:Un,backendName:"wasm",setupFunc:iee,kernelFunc:uee};var BO;function pee(r){BO=r.wasm.cwrap(Wn,null,["number","number","number","number","number","number","number","number","number","number"])}function cee(r){let{backend:e,inputs:t,attrs:o}=r,{images:n}=t,{alignCorners:s,halfPixelCenters:a,size:i}=o,[p,u]=i,[c,l,m,f]=n.shape,d=[c,p,u,f],h=e.makeOutput(d,"float32");if(x.sizeFromShape(n.shape)===0)return h;let g=e.dataIdMap.get(n.dataId),y;g.dtype!=="float32"&&(y=cs({backend:e,inputs:{x:n},attrs:{dtype:"float32"}}),g=e.dataIdMap.get(y.dataId));let b=g.id,C=e.dataIdMap.get(h.dataId).id;return BO(b,c,l,m,f,p,u,s?1:0,a?1:0,C),y!=null&&e.disposeData(y.dataId),h}var VO={kernelName:Wn,backendName:"wasm",setupFunc:pee,kernelFunc:cee};var zO;function lee(r){zO=r.wasm.cwrap(fa,null,["number","array","number","array","number","number"])}function mee(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{dims:s}=o,a=x.parseAxisParam(s,n.shape);if(n.shape.length===0)return zu({inputs:{x:n},backend:t});let i=t.makeOutput(n.shape,n.dtype),p=t.dataIdMap.get(n.dataId).id,u=t.dataIdMap.get(i.dataId).id,c=new Uint8Array(new Int32Array(a).buffer),l=new Uint8Array(new Int32Array(n.shape).buffer);zO(p,c,a.length,l,n.shape.length,u);let m=Mt({inputs:{x:i},attrs:{shape:n.shape},backend:t});return t.disposeData(i.dataId),m}var WO={kernelName:fa,backendName:"wasm",kernelFunc:mee,setupFunc:lee};var UO;function fee(r){UO=r.wasm.cwrap(es,null,["number","number","number","number","number","number","number","number","array","number","number"])}function dee(r){let{inputs:e,backend:t,attrs:o}=r,{image:n}=e,{radians:s,fillValue:a,center:i}=o,p=t.makeOutput(n.shape,n.dtype),u=t.dataIdMap.get(n.dataId).id,c=t.dataIdMap.get(p.dataId).id,[l,m,f,d]=n.shape,[h,g]=I.getImageCenter(i,m,f),y=a===0,b=255,C=typeof a=="number"?[a,a,a,y?0:b]:[...a,b],w=new Uint8Array(new Int32Array(C).buffer);return UO(u,l,m,f,d,s,h,g,w,C.length,c),p}var GO={kernelName:es,backendName:"wasm",kernelFunc:dee,setupFunc:fee};var HO=Qe(da);var qO=Qe(xo);var KO;function hee(r){KO=r.wasm.cwrap(Hn,null,["number","number","number","number","number","number","array","number","number"])}function gee(r){let{backend:e,inputs:t,attrs:o}=r,{indices:n,updates:s}=t,{shape:a}=o,i=e.makeOutput(a,s.dtype);if(x.sizeFromShape(a)===0)return i;let{sliceRank:p,numUpdates:u,sliceSize:c,strides:l,outputSize:m}=cl.calculateShapes(s,n,a),d=e.dataIdMap.get(n.dataId).id,g=e.dataIdMap.get(s.dataId).id,y=new Uint8Array(new Int32Array(l).buffer),b=e.dataIdMap.get(i.dataId).id;return KO(d,g,Ae[s.dtype],p,u,c,y,m,b),i}var jO={kernelName:Hn,backendName:"wasm",setupFunc:hee,kernelFunc:gee};var XO;function xee(r){XO=r.wasm.cwrap("SelectV2",null,["number","number","number","number","number"])}function yee(r){let{inputs:e,backend:t}=r,{condition:o,t:n,e:s}=e,a=t.dataIdMap.get(o.dataId).id,i=t.dataIdMap.get(n.dataId).id,p=t.dataIdMap.get(s.dataId).id,u=t.makeOutput(n.shape,n.dtype),c=t.dataIdMap.get(u.dataId).id,l=o.shape.length,m=n.shape.length,f=l===0||l>1||m===1?1:x.sizeFromShape(n.shape.slice(1));return XO(a,i,p,f,c),u}var YO={kernelName:vs,backendName:"wasm",kernelFunc:yee,setupFunc:xee};var QO;function bee(r){QO=r.wasm.cwrap(yo,null,["number","number"])}function Cee(r){let{backend:e,inputs:{x:t}}=r,o=e.dataIdMap.get(t.dataId).id,n=e.makeOutput(t.shape,t.dtype),s=e.dataIdMap.get(n.dataId).id;return x.sizeFromShape(n.shape)===0||QO(o,s),n}var ZO={kernelName:"Sigmoid",backendName:"wasm",setupFunc:bee,kernelFunc:Cee};var JO=Qe(Kn);var e3;function Iee(r){e3=r.wasm.cwrap(Xn,null,["number","number","number","number"])}function wee(r){let{backend:e,inputs:{logits:t},attrs:{dim:o}}=r,n=e.dataIdMap.get(t.dataId).id,s=e.makeOutput(t.shape,t.dtype),a=e.dataIdMap.get(s.dataId).id,i=t.shape[o],p=x.sizeFromShape(t.shape)/i;return x.sizeFromShape(s.shape)===0||e3(n,a,i,p),s}var t3={kernelName:Xn,backendName:"wasm",setupFunc:Iee,kernelFunc:wee};function See(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{blockShape:s,paddings:a}=o,i=x.sizeFromShape(s),p=[[0,0]];p.push(...a);for(let _=1+s.length;_0?p+1:0;if(c<0)throw new Error(I.getSparseSegmentReductionNegativeSegmentIdsErrorMessage());let l=n.shape.slice();l[0]=c;let m=t.dataIdMap.get(n.dataId).id,f=t.dataIdMap.get(s.dataId).id,d=t.dataIdMap.get(a.dataId).id,h=t.makeOutput(l,n.dtype),g=t.dataIdMap.get(h.dataId).id,y=t.makeOutput([4],"int32"),b=t.dataIdMap.get(y.dataId).id;i3(m,Ae[n.dtype],n.shape[0],f,d,g,b,e,0);let C=t.readSync(y.dataId),w;switch(C[0]){case 0:{w=I.getSparseSegmentReductionNegativeSegmentIdsErrorMessage();break}case 1:{w=I.getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage();break}case 2:w=I.getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage(C[1],C[2]);break;case 3:w=I.getSparseSegmentReductionIndicesOutOfRangeErrorMessage(C[1],C[2],C[3]);break;default:w=""}if(t.disposeData(y.dataId),w)throw t.disposeData(h.dataId),new Error(w);return h}function _ee(r){return Ag(r,!0)}var u3={kernelName:Za,backendName:"wasm",setupFunc:Rg,kernelFunc:_ee};function Eee(r){return Ag(r,!1)}var p3={kernelName:Ja,backendName:"wasm",setupFunc:Rg,kernelFunc:Eee};function $ee(r){let{inputs:e,attrs:t,backend:o}=r,{x:n}=e,{numOrSizeSplits:s,axis:a}=t,i=x.parseAxisParam(a,n.shape)[0],p=I.prepareSplitSize(n,s,i),u=new Array(n.shape.length).fill(0),c=n.shape.slice();return p.map(l=>{let m=[...c];m[i]=l;let f=Xo({inputs:{x:n},attrs:{begin:u,size:m},backend:o});return u[i]+=l,f})}var c3={kernelName:Ts,backendName:"wasm",kernelFunc:$ee};var l3=Qe(bo);var m3=Qe(ti);var Ree=!0,f3=nt(Co,Ree);var d3;function Aee(r){d3=r.wasm.cwrap($s,null,["number","number","number","number"])}function Fee(r){let{backend:e,inputs:t,attrs:o}=r,{alpha:n}=o,{x:s}=t,a=e.dataIdMap.get(s.dataId).id,i=e.makeOutput(s.shape,s.dtype),p=e.dataIdMap.get(i.dataId).id;return d3(a,n,Ae[s.dtype],p),i}var h3={kernelName:$s,backendName:"wasm",setupFunc:Aee,kernelFunc:Fee};var g3;function Dee(r){g3=r.wasm.cwrap(Yn,null,["number","array","number","array","array","array","array","array","number","number"])}function Pee(r){let{backend:e,inputs:t,attrs:o}=r,{x:n}=t,{begin:s,end:a,strides:i,beginMask:p,endMask:u,ellipsisMask:c,newAxisMask:l,shrinkAxisMask:m}=o,{finalShapeSparse:f,finalShape:d,isIdentity:h,sliceDim0:g,isSimpleSlice:y,begin:b,end:C,strides:w}=et.sliceInfo(n.shape,s,a,i,p,u,c,l,m),k;if(h)k=Mt({inputs:{x:n},backend:e,attrs:{shape:d}});else if(g||y){x.assert(n.shape.length>=1,()=>`Input must have rank at least 1, got: ${n.shape.length}`);let _=et.computeOutShape(b,C,w),E=Xo({inputs:{x:n},backend:e,attrs:{begin:b,size:_}});k=Mt({inputs:{x:E},backend:e,attrs:{shape:d}}),e.disposeData(E.dataId)}else{let _=e.makeOutput(f,"float32"),E=e.dataIdMap.get(n.dataId).id,R=new Uint8Array(new Int32Array(x.computeStrides(n.shape)).buffer),A=new Uint8Array(new Int32Array(b).buffer),D=new Uint8Array(new Int32Array(C).buffer),O=new Uint8Array(new Int32Array(w).buffer),M=new Uint8Array(new Int32Array(f).buffer),L=new Uint8Array(new Int32Array(x.computeStrides(f)).buffer),W=e.dataIdMap.get(_.dataId).id;g3(E,R,n.shape.length,A,D,O,M,L,f.length,W),k=Mt({inputs:{x:_},backend:e,attrs:{shape:d}}),e.disposeData(_.dataId)}return k}var x3={kernelName:Yn,backendName:"wasm",setupFunc:Dee,kernelFunc:Pee};function Oee(r){let{backend:e,inputs:t,attrs:o}=r,{data:n,dataSplits:s}=t,{separator:a,nGramWidths:i,leftPad:p,rightPad:u,padWidth:c,preserveShortSequences:l}=o,m=e.readSync(n.dataId),f=e.readSync(s.dataId),[d,h]=ku(m,f,a,i,p,u,c,l),g=e.makeOutput([d.length],"string"),y=e.dataIdMap.get(g.dataId);y.stringBytes=d;let b=e.makeOutput(s.shape,"int32");return e.typedArrayFromHeap(b).set(h),[g,b]}var y3={kernelName:Ns,backendName:"wasm",kernelFunc:Oee};function Mee(r){let{backend:e,inputs:t,attrs:o}=r,{input:n,delimiter:s}=t,{skipEmpty:a}=o,i=e.readSync(n.dataId),p=e.readSync(s.dataId),[u,c,l]=Tu(i,p[0],a),m=c.length,f=e.makeOutput([m,2],"int32");e.typedArrayFromHeap(f).set(u);let h=e.makeOutput([m],"string"),g=e.dataIdMap.get(h.dataId);g.stringBytes=c;let y=e.makeOutput([2],"int32");return e.typedArrayFromHeap(y).set(l),[f,h,y]}var b3={kernelName:ri,backendName:"wasm",kernelFunc:Mee};function Lee(r){let{backend:e,inputs:t,attrs:o}=r,{input:n}=t,{numBuckets:s}=o,a=e.readSync(n.dataId),i=Nu(a,s),p=e.makeOutput(n.shape,"int32");return e.typedArrayFromHeap(p).set(i),p}var C3={kernelName:oi,backendName:"wasm",kernelFunc:Lee};var Bee=!0,I3=nt(Io,Bee);var w3;function Vee(r){w3=r.wasm.cwrap(jn,null,["number","number","number","number"])}function zee(r){let{backend:e,inputs:t,attrs:o}=r,{axis:n,keepDims:s}=o,{x:a}=t,i=e.dataIdMap.get(a.dataId).id,p=i,u=a,{transposed:c,axes:l,originalAxes:m,inputWasTransposed:f}=kr(a,n,e),d=l;if(f){let C=e.dataIdMap.get(c.dataId).id;C!==i&&(u=c,p=C,d=I.getInnerMostAxes(d.length,u.shape.length))}I.assertAxesAreInnerMostDims("sum",d,u.shape.length);let[h,g]=I.computeOutAndReduceShapes(u.shape,d),y=x.sizeFromShape(g),b=e.makeOutput(h,u.dtype);if(x.sizeFromShape(u.shape)!==0){let C=e.dataIdMap.get(b.dataId).id;w3(p,y,Ae[b.dtype],C)}if(f&&e.disposeData(c.dataId),s){let C=I.expandShapeToKeepDim(b.shape,m);b.shape=C}return b}var S3={kernelName:jn,backendName:"wasm",setupFunc:Vee,kernelFunc:zee};var v3=Qe(xa);var k3=Qe(Qn);var T3;function Wee(r){T3=r.wasm.cwrap(wo,null,["number","array","number","array","number","number"])}function Uee(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,s=t.dataIdMap.get(n.dataId).id,{reps:a}=o,i=new Array(n.shape.length);for(let m=0;m{let{x:o}=r,{k:n,sorted:s}=t,a=e.dataIdMap.get(o.dataId).id,i=new Uint8Array(new Int32Array(o.shape).buffer),p=o.shape.slice();p[p.length-1]=n;let u=e.makeOutput(p,o.dtype),c=e.dataIdMap.get(u.dataId).id,l=e.makeOutput(p,"int32"),m=e.dataIdMap.get(l.dataId).id;return _3(a,i,o.shape.length,Ae[o.dtype],n,s,c,m),[u,l]},E3={kernelName:Zn,backendName:"wasm",setupFunc:Gee,kernelFunc:Hee};var $3;function qee(r){$3=r.wasm.cwrap(Jn,null,["number","number","bool","number","number","number","number","number","number","array","number","array","number","number","number","number","number"])}function Kee(r){let{backend:e,inputs:t,attrs:o}=r,{image:n,transforms:s}=t,{interpolation:a,fillMode:i,fillValue:p,outputShape:u}=o,[c,l,m,f]=n.shape,[d,h]=u!=null?u:[l,m],g=[c,d,h,f],y=new Uint8Array(new Int32Array(x.computeStrides(n.shape)).buffer),b=new Uint8Array(new Int32Array(x.computeStrides(g)).buffer),C=e.makeOutput(g,n.dtype),w=e.dataIdMap.get(C.dataId).id,_=e.dataIdMap.get(n.dataId).id,R=e.dataIdMap.get(s.dataId).id,A=a==="nearest"?1:2,D;switch(i){case"constant":D=1;break;case"reflect":D=2;break;case"wrap":D=3;break;case"nearest":D=4;break;default:D=1;break}return $3(_,R,s.shape[0]>1,c,d,h,f,m,l,y,n.shape.length-1,b,g.length-1,A,D,p,w),C}var R3={kernelName:Jn,backendName:"wasm",setupFunc:qee,kernelFunc:Kee};function jee(r){let{inputs:e,backend:t,attrs:o}=r,{value:n}=e,{axis:s}=o;s<0&&(s+=n.shape.length);let a=n.shape[s],i=n.shape.length,p=new Array(i-1),u=0;for(let f=0;f({dataId:f,dtype:d,shape:p}))}var A3={kernelName:_s,backendName:"wasm",kernelFunc:jee};function Xee(r){let{inputs:{x:e},backend:t}=r,o=t.makeOutput(e.shape,e.dtype);return t.typedArrayFromHeap(o).fill(0),o}var F3={kernelName:Es,backendName:"wasm",kernelFunc:Xee};var Yee=[LD,BD,VD,WD,KD,XD,QD,JD,rP,nP,sP,aP,uP,pP,lP,fP,dP,hP,xP,bP,IP,SP,kP,TP,NP,_P,EP,$P,AP,FP,DP,OP,LP,VP,WP,GP,HP,qP,UD,jP,XP,YP,QP,ZP,JP,eO,tO,oO,nO,aO,uO,cO,lO,fO,dO,hO,xO,bO,IO,wO,vO,kO,TO,$g,_O,$O,AO,FO,DO,PO,OO,eP,LO,VO,WO,GO,HO,qO,jO,YO,ZO,JO,oP,t3,r3,n3,a3,u3,p3,c3,l3,m3,f3,h3,x3,y3,b3,C3,I3,S3,v3,k3,N3,E3,R3,HD,A3,F3];for(let r of Yee)ya(r);var Yw=P();Yw.registerFlag("WASM_HAS_SIMD_SUPPORT",async()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,9,1,7,0,65,0,253,15,26,11]))}catch(r){return!1}});Yw.registerFlag("WASM_HAS_MULTITHREAD_SUPPORT",async()=>{if(Yw.get("IS_NODE"))return!1;try{return new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch(r){return!1}});var oS=rp(M3()),U3=rp(B3()),nS=rp(V3());var z3=oS.default||oS,Qee=nS.default||nS,Gl=class extends Jr{constructor(e){super(),this.wasm=e,this.dataIdNextNumber=1,this.wasm.tfjs.initWithThreadsCount(H3),rS=this.wasm.tfjs.getThreadsCount(),this.dataIdMap=new rn(this,cr())}write(e,t,o){let n={id:this.dataIdNextNumber++};return this.move(n,e,t,o,1),n}numDataIds(){return this.dataIdMap.numDataIds()}async time(e){let t=x.now();return e(),{kernelMs:x.now()-t}}move(e,t,o,n,s){let a=this.dataIdNextNumber++;if(n==="string"){let c=t;this.dataIdMap.set(e,{id:a,stringBytes:c,shape:o,dtype:n,memoryOffset:null,refCount:s});return}let i=x.sizeFromShape(o),p=i*x.bytesPerElement(n),u=this.wasm._malloc(p);this.dataIdMap.set(e,{id:a,memoryOffset:u,shape:o,dtype:n,refCount:s}),this.wasm.tfjs.registerTensor(a,i,u),t!=null&&this.wasm.HEAPU8.set(new Uint8Array(t.buffer,t.byteOffset,p),u)}async read(e){return this.readSync(e)}readSync(e,t,o){let{memoryOffset:n,dtype:s,shape:a,stringBytes:i}=this.dataIdMap.get(e);if(s==="string")return(t==null||t===0)&&(o==null||o>=i.length)?i:i.slice(t,o);t=t||0,o=o||x.sizeFromShape(a);let p=x.bytesPerElement(s),u=this.wasm.HEAPU8.slice(n+t*p,n+o*p);return Jee(u.buffer,s)}disposeData(e,t=!1){if(this.dataIdMap.has(e)){let o=this.dataIdMap.get(e);if(o.refCount--,!t&&o.refCount>0)return!1;this.wasm._free(o.memoryOffset),this.wasm.tfjs.disposeData(o.id),this.dataIdMap.delete(e)}return!0}refCount(e){return this.dataIdMap.has(e)?this.dataIdMap.get(e).refCount:0}incRef(e){let t=this.dataIdMap.get(e);t!=null&&t.refCount++}floatPrecision(){return 32}getMemoryOffset(e){return this.dataIdMap.get(e).memoryOffset}dispose(){this.wasm.tfjs.dispose(),"PThread"in this.wasm&&this.wasm.PThread.terminateAllThreads(),this.wasm=null}memory(){return{unreliable:!1}}makeOutput(e,t,o){let n;if(o==null)n=this.write(null,e,t);else{let s=this.dataIdNextNumber++;n={id:s},this.dataIdMap.set(n,{id:s,memoryOffset:o,shape:e,dtype:t,refCount:1});let a=x.sizeFromShape(e);this.wasm.tfjs.registerTensor(s,a,o)}return{dataId:n,shape:e,dtype:t}}typedArrayFromHeap({shape:e,dtype:t,dataId:o}){let n=this.wasm.HEAPU8.buffer,{memoryOffset:s}=this.dataIdMap.get(o),a=x.sizeFromShape(e);switch(t){case"float32":return new Float32Array(n,s,a);case"int32":return new Int32Array(n,s,a);case"bool":return new Uint8Array(n,s,a);default:throw new Error(`Unknown dtype ${t}`)}}};function Zee(r){return(e,t)=>(x.fetch(r,{credentials:"same-origin"}).then(o=>{o.ok||e.env.a(`failed to load wasm binary file at '${r}'`),o.arrayBuffer().then(n=>{WebAssembly.instantiate(n,e).then(s=>{t(s.instance,s.module)})})}),{})}function W3(r,e,t){if(Pg!=null)return Pg;let o="tfjs-backend-wasm.wasm";return r&&e?o="tfjs-backend-wasm-threaded-simd.wasm":r&&(o="tfjs-backend-wasm-simd.wasm"),Wl!=null&&Wl[o]!=null?Wl[o]:t+o}async function G3(){let[r,e]=await Promise.all([P().getAsync("WASM_HAS_SIMD_SUPPORT"),P().getAsync("WASM_HAS_MULTITHREAD_SUPPORT")]);return new Promise((t,o)=>{let n={};n.locateFile=(i,p)=>{if(i.endsWith(".worker.js")){let u=U3.wasmWorkerContents.replace(/\n/g,"\\n"),c=new Blob([u],{type:"application/javascript"});return URL.createObjectURL(c)}return i.endsWith(".wasm")?W3(r,e,zl!=null?zl:p):p+i},sS&&(n.instantiateWasm=Zee(W3(r,e,zl!=null?zl:"")));let s=!1;n.onAbort=()=>{if(s||Ul)return;Ul=!0,o({message:"Make sure the server can serve the `.wasm` file relative to the bundled js file. For more details see https://github.com/tensorflow/tfjs/blob/master/tfjs-backend-wasm/README.md#using-bundlers"})};let a;e&&r&&Pg==null?(n.mainScriptUrlOrBlob=new Blob(["var WasmBackendModuleThreadedSimd = "+z3.toString()],{type:"text/javascript"}),a=z3(n)):a=Qee(n),a.then(i=>{s=!0,Ul=!1;let p=null;i.tfjs={init:i.cwrap("init",null,[]),initWithThreadsCount:i.cwrap("init_with_threads_count",null,["number"]),getThreadsCount:i.cwrap("get_threads_count","number",[]),registerTensor:i.cwrap("register_tensor",null,["number","number","number"]),disposeData:i.cwrap("dispose_data",p,["number"]),dispose:i.cwrap("dispose",p,[])},t({wasm:i})}).catch(o)})}function Jee(r,e){switch(e){case"float32":return new Float32Array(r);case"int32":return new Int32Array(r);case"bool":return new Uint8Array(r);default:throw new Error(`Unknown dtype ${e}`)}}var ete=["tfjs-backend-wasm.wasm","tfjs-backend-wasm-simd.wasm","tfjs-backend-wasm-threaded-simd.wasm"],Pg=null,zl=null,Wl={},Ul=!1,sS=!1;function tte(r,e=!1){if(sC("setWasmPath has been deprecated in favor of setWasmPaths and will be removed in a future release."),Ul)throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPath()` before you call `tf.setBackend()` or `tf.ready()`");Pg=r,sS=e}function rte(r,e=!1){if(Ul)throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPaths()` before you call `tf.setBackend()` or `tf.ready()`");if(typeof r=="string")zl=r;else{Wl=r;let t=ete.filter(o=>Wl[o]==null);if(t.length>0)throw new Error(`There were no entries found for the following binaries: ${t.join(",")}. Please either call setWasmPaths with a map providing a path for each binary, or with a string indicating the directory where all the binaries can be found.`)}sS=e}var H3=-1,rS=-1;function ote(r){H3=r}function nte(){if(rS===-1)throw new Error("WASM backend not initialized.");return rS}var ste="4.0.0";var ate=2;pi("wasm",async()=>{let{wasm:r}=await G3();return new Gl(r)},ate);var Va=P();Va.registerFlag("WEBGPU_DEFERRED_SUBMIT_BATCH_SIZE",()=>15);Va.registerFlag("WEBGPU_CPU_FORWARD",()=>!0);Va.registerFlag("WEBGPU_MATMUL_PROGRAM_TYPE",()=>-1);Va.registerFlag("WEBGPU_USE_NAIVE_CONV2D_TRANSPOSE",()=>!1);Va.registerFlag("WEBGPU_USE_LOW_POWER_GPU",()=>!1);Va.registerFlag("WEBGPU_CPU_HANDOFF_SIZE_THRESHOLD",()=>1e3);Va.registerFlag("WEBGPU_USE_PROFILE_TOOL",()=>!1);Va.registerFlag("WEBGPU_IMPORT_EXTERNAL_TEXTURE",()=>!0);Va.registerFlag("WEBGPU_USE_NAIVE_CONV2D_DEBUG",()=>!1);var Og=class{constructor(e){e&&(this.vendor=e.vendor)}isIntel(){return this.vendor==="intel"}};var Mg=class{constructor(e){this.device=e,this.numUsedBuffers=0,this.numFreeBuffers=0,this.freeBuffers=new Map,this.usedBuffers=new Map,this.numBytesUsed=0,this.numBytesAllocated=0}acquireUploadBuffer(e,t){return this.acquireBuffer(e,t,!0)}acquireBuffer(e,t,o=!1){let n=q3(e,t);if(this.freeBuffers.has(n)||this.freeBuffers.set(n,[]),this.usedBuffers.has(n)||this.usedBuffers.set(n,[]),this.numBytesUsed+=e,this.numUsedBuffers++,this.freeBuffers.get(n).length>0){this.numFreeBuffers--;let a=this.freeBuffers.get(n).shift();return this.usedBuffers.get(n).push(a),a}this.numBytesAllocated+=e;let s=this.device.createBuffer({size:e,usage:t,mappedAtCreation:o});return this.usedBuffers.get(n).push(s),s}releaseBuffer(e,t,o){if(this.freeBuffers.size===0)return;let n=q3(t,o);this.freeBuffers.has(n)||this.freeBuffers.set(n,[]),this.freeBuffers.get(n).push(e),this.numFreeBuffers++,this.numUsedBuffers--;let s=this.usedBuffers.get(n),a=s.indexOf(e);if(a<0)throw new Error("Cannot release a buffer that was never provided by this buffer manager");s.splice(a,1),this.numBytesUsed-=t}releaseUploadBuffer(e,t,o){e.mapAsync(GPUMapMode.WRITE).then(()=>{this.releaseBuffer(e,t,o)},n=>{})}getNumUsedBuffers(){return this.numUsedBuffers}getNumFreeBuffers(){return this.numFreeBuffers}dispose(){this.freeBuffers.forEach((e,t)=>{e.forEach(o=>{o.destroy()})}),this.usedBuffers.forEach((e,t)=>{e.forEach(o=>{o.destroy()})}),this.freeBuffers=new Map,this.usedBuffers=new Map,this.numUsedBuffers=0,this.numFreeBuffers=0,this.numBytesUsed=0,this.numBytesAllocated=0}};function q3(r,e){return`${r}_${e}`}var Lg=class{constructor(e){this.device=e,this.numUsedTextures=0,this.numFreeTextures=0,this.freeTextures=new Map,this.usedTextures=new Map,this.numBytesUsed=0,this.numBytesAllocated=0}acquireTexture(e,t,o,n){let s=j3(o),a=e*t*s,i=K3(e,t,o,n);if(this.freeTextures.has(i)||this.freeTextures.set(i,[]),this.usedTextures.has(i)||this.usedTextures.set(i,[]),this.numBytesUsed+=a,this.numUsedTextures++,this.freeTextures.get(i).length>0){this.numFreeTextures--;let u=this.freeTextures.get(i).shift();return this.usedTextures.get(i).push(u),u}this.numBytesAllocated+=a;let p=this.device.createTexture({size:[e,t],format:o,usage:n});return this.usedTextures.get(i).push(p),p}releaseTexture(e,t,o,n,s){if(this.freeTextures.size===0)return;let a=K3(t,o,n,s);this.freeTextures.has(a)||this.freeTextures.set(a,[]),this.freeTextures.get(a).push(e),this.numFreeTextures++,this.numUsedTextures--;let i=this.usedTextures.get(a),p=i.indexOf(e);if(p<0)throw new Error("Cannot release a texture that was never provided by this texture manager");i.splice(p,1);let u=j3(n),c=t*o*u;this.numBytesUsed-=c}getNumUsedTextures(){return this.numUsedTextures}getNumFreeTextures(){return this.numFreeTextures}dispose(){this.freeTextures.forEach((e,t)=>{e.forEach(o=>{o.destroy()})}),this.usedTextures.forEach((e,t)=>{e.forEach(o=>{o.destroy()})}),this.freeTextures=new Map,this.usedTextures=new Map,this.numUsedTextures=0,this.numFreeTextures=0,this.numBytesUsed=0,this.numBytesAllocated=0}};function K3(r,e,t,o){return`${r}_${e}_${t}_${o}`}function j3(r){if(r==="rgba8unorm")return 16;throw new Error(`${r} is not supported!`)}function X3(r,e){if(Math.max(...r)>3)throw new Error("Cannot symbolically compute strides for rank > 4 tensor.");let t=r.length,o=r.map(s=>`${e}[${s}]`),n=new Array(t-1);n[t-2]=o[t-1];for(let s=t-3;s>=0;--s)n[s]=`(${n[s+1]} * ${o[s+1]})`;return n}var Z3=(r,e,t,o)=>{let n={dtype:o.dtype,shape:o.shape},s=ite(t,n,e),a=r.createShaderModule({code:s,label:e.constructor.name});return r.createComputePipeline({compute:{module:a,entryPoint:"_start"},label:e.constructor.name,layout:"auto"})};function At(r){if(r<=1)return"i32";if(r===2)return"vec2";if(r===3)return"vec3";if(r===4)return"vec4";if(r===5)return"vec5";if(r===6)return"vec6";throw Error(`GPU for rank ${r} is not yet supported`)}function Yo(r){if(r===0)return"x";if(r===1)return"y";if(r===2)return"z";if(r===3)return"w";if(r===4)return"u";if(r===5)return"v";throw Error(`Index ${r} is not yet supported`)}function ue(...r){let e;switch(r.length){case 0:e=` + ${Ri()} + fn _start(@builtin(local_invocation_id) LocalId : vec3, + @builtin(global_invocation_id) GlobalId : vec3, + @builtin(num_workgroups) NumWorkgroups : vec3) { + localId = LocalId; + globalId = GlobalId; + numWorkgroups = NumWorkgroups; + main(); + } + + fn main() + `;break;case 1:e=` + ${Ri()} + fn _start(@builtin(local_invocation_id) LocalId : vec3, + @builtin(global_invocation_id) GlobalId : vec3, + @builtin(num_workgroups) NumWorkgroups : vec3) { + localId = LocalId; + globalId = GlobalId; + numWorkgroups = NumWorkgroups; + main(getGlobalIndex()); + } + + fn main(${r[0]} : i32) + `;break;default:throw Error("Unreachable")}return e}function Ri(){return` + @compute @workgroup_size(workGroupSizeX, workGroupSizeY, workGroupSizeZ) +`}function ite(r,e,t){let o=[];if(o.push(` + const workGroupSizeX = ${t.workGroupSize[0]}u; + const workGroupSizeY = ${t.workGroupSize[1]}u; + const workGroupSizeZ = ${t.workGroupSize[2]}u; + + var localId: vec3; + var globalId: vec3; + var numWorkgroups: vec3; + + // Only used when the y/z dimension of workgroup size is 1. + fn getGlobalIndex() -> i32 { + ${eM(t)?" return i32(globalId.x);":` let localInvocationIndex = localId.z * workGroupSizeX * workGroupSizeY + + localId.y * workGroupSizeX + localId.x; + let workGroupID = (globalId - localId)/vec3( + workGroupSizeX, workGroupSizeY, workGroupSizeZ); + + return i32((workGroupID.z * numWorkgroups.x * numWorkgroups.y + + workGroupID.y * numWorkgroups.x + workGroupID.x) * + (workGroupSizeX * workGroupSizeY * workGroupSizeZ) + + localInvocationIndex); + `} + } + `),t.isFromPixels)return o.push(` + struct Uniform { + size : i32, + numChannels : i32, + outShapeStrides : vec2, + }; + + @group(0) @binding(0) var result: array<${Tc(e.dtype,t.isVec4)}>; + @group(0) @binding(2) var uniforms: Uniform; + `),[Y3,o.join(` +`),Q3(e.shape),t.getUserCode()].join(` +`);let n="struct Uniforms { NAN : f32, ";t.variableNames.forEach((m,f)=>{let d=At(r[f].shape.length);n+=`${m.charAt(0).toLowerCase()+m.slice(1)}Shape : ${d}, `});let s=At(e.shape.length);n+=`outShape : ${s}, `;let a=e.shape.length-1,i=At(a);n+=` + outShapeStrides: ${i}, `,t.size&&(n+="size : i32, "),t.uniforms&&(n+=t.uniforms),n+="};",n=dte(n),o.push(n),t.atomic?o.push(` + @group(0) @binding(0) var result: array>; + `):o.push(` + @group(0) @binding(0) var result: array<${Tc(e.dtype,t.isVec4)}>; + `),t.variableNames.forEach((m,f)=>{o.push(` + @group(0) @binding(${1+f}) var ${m}: array<${t.variableTypes?t.variableTypes[f]:Tc(r[f].dtype,t.isVec4)}>; + `)}),n!==""&&o.push(` + @group(0) @binding(${1+t.variableNames.length}) var uniforms: Uniforms; + `);let p=lte(e.shape,t.dispatchLayout),u=[Y3,o.join(` +`),Q3(e.shape),p,mte(e.shape.length)];t.atomic||u.push(fte(e.shape,e.dtype,t.isVec4));let c=r.map((m,f)=>cte(m,e.shape,t.variableTypes?t.variableTypes[f]==="vec4":t.isVec4,t.dispatchLayout.x.length===e.shape.length)).join(` +`);return u.push(c),u.push(t.getUserCode()),u.join(` +`)}function J3(r,e,t,o){let n=r.shaderKey;if(r.isFromPixels)return n;let s=t.map(c=>c.dtype).concat(o.dtype),a=t.map(c=>I.getBroadcastDims(c.shape,o.shape)),i=t.map(c=>x.arraysEqual(c.shape,o.shape)).join("_"),p=a.map(c=>c.join("_")).join(";"),u=eM(r)?"flatDispatch":"";return n+="_"+(r.workGroupSize?r.workGroupSize.join(","):"")+e.map(c=>c.length).join(",")+s.join(",")+r.variableNames.join(",")+p+i+u,n}var Y3=` + struct vec5 {x: i32, y: i32, z: i32, w: i32, u: i32}; + struct vec6 {x: i32, y: i32, z: i32, w: i32, u: i32, v: i32}; + + // Checks whether coordinates lie within the bounds of the shape. + fn coordsInBounds2D(coord : vec2, shape : vec2) -> bool { + return all(coord >= vec2(0)) && all(coord < shape); + } + fn coordsInBounds3D(coord : vec3, shape : vec3) -> bool { + return all(coord >= vec3(0)) && all(coord < shape); + } + fn coordsInBounds4D(coord : vec4, shape : vec4) -> bool { + return all(coord >= vec4(0)) && all(coord < shape); + } + + fn getIndexFromCoords1D(coord : i32, shape : i32) -> i32 { + return coord; + } + fn getIndexFromCoords2D(coords : vec2, shape : vec2) -> i32 { + return dot(coords, vec2(shape.y, 1)); + } + fn getIndexFromCoords3D(coords : vec3, shape : vec3) -> i32 { + return dot(coords, vec3(shape.y * shape.z, shape.z, 1)); + } + fn getIndexFromCoords4D(coords : vec4, shape : vec4) -> i32 { + return dot(coords, vec4( + shape.y * shape.z * shape.w, shape.z * shape.w, shape.w, 1)); + } + fn getIndexFromCoords5D(coords : vec5, shape : vec5) -> i32 { + let shapeStrides: vec5 = vec5(shape.y * shape.z * shape.w * shape.u, shape.z * shape.w * shape.u, shape.w * shape.u, shape.u, 1); + return coords.x*shapeStrides.x + coords.y*shapeStrides.y + coords.z*shapeStrides.z + coords.w*shapeStrides.w + coords.u*shapeStrides.u; + } + fn getIndexFromCoords6D(coords : vec6, shape : vec6) -> i32 { + let shapeStrides: vec6 = vec6(shape.y * shape.z * shape.w * shape.u * shape.v, shape.z * shape.w * shape.u * shape.v, shape.w * shape.u * shape.v, shape.u * shape.v, shape.v, 1); + return coords.x*shapeStrides.x + coords.y*shapeStrides.y + coords.z*shapeStrides.z + coords.w*shapeStrides.w + coords.u*shapeStrides.u + coords.v*shapeStrides.v; + } + + fn idiv(a: i32, b: i32, sign: f32) -> i32 { + var res: i32 = a / b; + let modulo: i32 = a % b; + if (sign < 0. && modulo != 0) { + res = res - 1; + } + return res; + } + + // NaN defination in IEEE 754-1985 is : + // - sign = either 0 or 1. + // - biased exponent = all 1 bits. + // - fraction = anything except all 0 bits (since all 0 bits represents infinity). + // https://en.wikipedia.org/wiki/IEEE_754-1985#Representation_of_non-numbers + fn isnan(val: f32) -> bool { + let floatToUint: u32 = bitcast(val); + return (floatToUint & 0x7fffffffu) > 0x7f800000u; + } + fn isnanVec4(val : vec4) -> vec4 { + return vec4(isnan(val[0]), isnan(val[1]), isnan(val[2]), isnan(val[3])); + } +`;function Q3(r){let e=r.length;if(e<=1)return"fn getCoordsFromIndex(index : i32) -> i32 { return index; }";let t=x.computeStrides(r),o=At(e),n=[];for(let a=0;a vec2 { + let d0 = index / uniforms.outShapeStrides; let d1 = index - d0 * uniforms.outShapeStrides; + return vec2(d0, d1); + }`;let s;return s="var index2 = index;"+t.map((a,i)=>{let p=`let ${n[i]} = index2 / uniforms.outShapeStrides.${Yo(i)}`,u=i===t.length-1?`let ${n[i+1]} = index2 - ${n[i]} * uniforms.outShapeStrides.${Yo(i)}`:`index2 = index2 - ${n[i]} * uniforms.outShapeStrides.${Yo(i)}`;return`${p}; ${u};`}).join(""),` + fn getCoordsFromIndex(index : i32) -> ${o} { + ${s} + return ${o}(${n.join(",")}); + } + `}function ute(r,e){let t=r.name,o=r.shape.length,n=At(o),s="get"+t.charAt(0).toUpperCase()+t.slice(1),a=["d0","d1","d2","d3","d4","d5"].slice(0,o),i=a.map(c=>`${c} : i32`).join(", ");if(o<1)return e?` + fn ${s}() -> vec4 { + return vec4(${t}[0]); + } + `:` + fn ${s}() ->f32 { + return f32(${t}[0]); + } + `;let p=`uniforms.${t.charAt(0).toLowerCase()+t.slice(1)}Shape`,u=`${o}D`;return o===0&&(u="1D"),e?` + fn ${s}(${i}) -> vec4 { + return vec4(${t}[getIndexFromCoords${u}(${n}(${a.join(",")}), + ${p}) / 4]); + } + `:` + fn ${s}(${i}) -> f32 { + return f32(${t}[getIndexFromCoords${u}(${n}(${a.join(",")}), + ${p})]); + } + `}function pte(r,e,t,o){let n=r.name,s=n.charAt(0).toUpperCase()+n.slice(1),a="get"+s+"ByOutput",i=r.shape.length,p=e.length,u=At(p);if(x.arraysEqual(r.shape,e)&&o)return t?` + fn ${a}Index(globalIndex : i32) -> vec4 { + return vec4(${n}[globalIndex]); + } + + fn ${a}Coords(coords : ${u}) -> vec4 { + return vec4(${n}[${p>1?"getOutputIndexFromCoords(coords)":"coords"} / 4]); + } + `:` + fn ${a}Index(globalIndex : i32) -> f32 { + return f32(${n}[globalIndex]); + } + + fn ${a}Coords(coords : ${u}) -> f32 { + return f32(${n}[${p>1?"getOutputIndexFromCoords(coords)":"coords"}]); + } + `;let c=I.getBroadcastDims(r.shape,e),l=p-i,m="";if(i===0)return t?` + fn ${a}Index(globalIndex : i32) -> vec4 { + return get${s}(); + } + + fn ${a}Coords(coords : ${u}) -> vec4 { + return get${s}(); + } + `:` + fn ${a}Index(globalIndex : i32) -> f32{ + return get${s}(); + } + + fn ${a}Coords(coords : ${u}) -> f32{ + return get${s}(); + } + `;p<2&&c.length>=1?m="coords = 0;":m=c.map(g=>`coords.${Yo(g+l)} = 0;`).join(` +`);let f="";if(p<2&&i>0)f="coords";else if(p>1){let g=At(i),y=r.shape.map((b,C)=>`coords.${Yo(C+l)}`).join(", ");f=`${g}(${y})`}else f="coords";let d=`uniforms.${n.charAt(0).toLowerCase()+n.slice(1)}Shape`,h=`${i}D`;return t?` + fn ${a}Index(globalIndex : i32) -> vec4 { + var coords = getCoordsFromIndex(globalIndex); + ${m} + return ${n}[getIndexFromCoords${h}(${f}, ${d}) / 4]; + } + + fn ${a}Coords(coordsIn : ${u}) -> vec4 { + var coords = coordsIn; + ${m} + return ${n}[getIndexFromCoords${h}(${f}, ${d}) / 4]; + } + `:` + fn ${a}Index(globalIndex : i32) -> f32 { + var coords = getCoordsFromIndex(globalIndex); + ${m} + return f32(${n}[getIndexFromCoords${h}(${f}, ${d})]); + } + + fn ${a}Coords(coordsIn : ${u}) -> f32 { + var coords = coordsIn; + ${m} + return f32(${n}[getIndexFromCoords${h}(${f}, ${d})]); + } +`}function cte(r,e,t,o){let n=ute(r,t);return r.shape.length<=e.length&&(n+=pte(r,e,t,o)),n}function lte(r,e){let{x:t,y:o=[],z:n=[]}=e,s=r.length,a=t.length+o.length+n.length;if(a!==s)return"";if(t.length===s)return`fn getOutputCoords() -> ${At(s)}{ + let globalIndex = getGlobalIndex(); + return getCoordsFromIndex(globalIndex); + } + `;let i="",p=[t,o,n];for(let m=0;m ${c} { + ${i} +`;return u.length===0?l+=`return ${c}(0); }`:l+=`return ${c}(${u.join(",")}); }`,l}function mte(r){let e="";switch(r){case 0:case 1:e+=` + fn getOutputIndexFromCoords(coords : i32) -> i32 { + return coords; + } + `;break;case 2:e+=` + fn getOutputIndexFromCoords(coords : vec2) -> i32 { + return dot(coords, vec2(uniforms.outShapeStrides, 1)); + } + `;break;case 3:e+=` + fn getOutputIndexFromCoords(coords : vec3) -> i32 { + return dot(coords, vec3(uniforms.outShapeStrides.x, uniforms.outShapeStrides.y, 1)); + } + `;break;case 4:e+=` + fn getOutputIndexFromCoords(coords : vec4) -> i32 { + return dot(coords, vec4( + uniforms.outShapeStrides.x, uniforms.outShapeStrides.y, uniforms.outShapeStrides.z, 1)); + } + `;break;case 5:e+=` + fn getOutputIndexFromCoords(coords : vec5) -> i32 { + return coords.x * uniforms.outShapeStrides.x + + coords.y * uniforms.outShapeStrides.y + + coords.z * uniforms.outShapeStrides.z + + coords.w * uniforms.outShapeStrides.w + + coords.u; + } + `;break;case 6:e+=` + fn getOutputIndexFromCoords(coords : vec6) -> i32 { + return coords.x * uniforms.outShapeStrides.x + + coords.y * uniforms.outShapeStrides.y + + coords.z * uniforms.outShapeStrides.z + + coords.w * uniforms.outShapeStrides.w + + coords.u * uniforms.outShapeStrides.u + + coords.v; + } + `;break;default:x.assert(!1,()=>`Unsupported ${r}D shape`);break}return e}function eM(r){return r.dispatch[1]===1&&r.dispatch[2]===1}function Tc(r,e){return r==="float32"?e?"vec4":"f32":r==="int32"||r==="bool"?e?"vec4":"i32":r}function fte(r,e,t){let o=r.length,n=Tc(e,t),s;if(t?s=`fn setOutputAtIndex(flatIndex : i32, value : vec4) { + result[flatIndex] = ${n}(value); + } + fn setOutputAtIndexI32(flatIndex : i32, value : vec4) { + result[flatIndex] = ${n}(value); + }`:s=`fn setOutputAtIndex(flatIndex : i32, value : f32) { + result[flatIndex] = ${n}(value); + } + fn setOutputAtIndexI32(flatIndex : i32, value : i32) { + result[flatIndex] = ${n}(value); + }`,o>=2){let a=["d0","d1","d2","d3","d4","d5"].slice(0,o),i=At(o);t?s+=` + fn setOutputAtCoords(${a.map(p=>`${p} : i32`).join(", ")}, value : vec4) { + let flatIndex = getOutputIndexFromCoords(${i}(${a.join(", ")})); + setOutputAtIndex(flatIndex / 4, value); + } + fn setOutputAtCoordsI32(${a.map(p=>`${p} : i32`).join(", ")}, value : vec4) { + let flatIndex = getOutputIndexFromCoords(${i}(${a.join(", ")})); + setOutputAtIndexI32(flatIndex / 4, value); + } + `:s+=` + fn setOutputAtCoords(${a.map(p=>`${p} : i32`).join(", ")}, value : f32) { + let flatIndex = getOutputIndexFromCoords(${i}(${a.join(", ")})); + setOutputAtIndex(flatIndex, value); + } + fn setOutputAtCoordsI32(${a.map(p=>`${p} : i32`).join(", ")}, value : i32) { + let flatIndex = getOutputIndexFromCoords(${i}(${a.join(", ")})); + setOutputAtIndexI32(flatIndex, value); + } + `}return s}function dte(r){let e=/(\w+)\s*:\s*vec(5|6)/g;r=r.replace(e,o=>"@align(16) "+o);let t=/vec(5|6)\s*,\s*(\w+)/g;return r=r.replace(t,(o,n,s)=>`vec${n}, @align(16) ${s}`),r}var pS={};Be(pS,{ArrayBufferToTypedArray:()=>uS,GPUBytesPerElement:()=>iS,MatMulProgramType:()=>Qo,computeDispatch:()=>ae,computeWorkGroupInfoForMatMul:()=>aS,computeWorkGroupSizeForConv2d:()=>Hl,computeWorkPerThreadForConv2d:()=>ql,flatDispatchLayout:()=>fe,isWebGPUSupported:()=>Kl,tilesFitEvenlyIntoShape:()=>gte});var Wu=r=>{let e=1;for(let t=0;tt%r[o]===0)}function ae(r,e,t=[1,1,1],o=[1,1,1]){let[n,s,a]=[Math.ceil(Wu(r.x.map(i=>e[i]))/(t[0]*o[0])),r.y?Math.ceil(Wu(r.y.map(i=>e[i]))/(t[1]*o[1])):1,r.z?Math.ceil(Wu(r.z.map(i=>e[i]))/(t[2]*o[2])):1];return[n,s,a]}function aS(r,e,t,o=!1){let n=[8,8,1],s=[4,4,1];return o||(r<=8&&(s[1]=1),e<=16&&t<=16&&(n[0]=4)),{workGroupSize:n,elementsPerThread:s}}function Hl(r,e,t=!1){if(t)return[8,8,1];let o=Wu(r.x.map(s=>e[s])),n=Wu(r.y.map(s=>e[s]));return o<=4?[4,16,1]:n<=4?[16,4,1]:[16,16,1]}function ql(r,e,t=!1){if(t)return[4,4,1];let o=Wu(r.x.map(s=>e[s])),n=Wu(r.y.map(s=>e[s]));return o<=4?[1,2,1]:n<=4?[2,1,1]:[2,2,1]}function fe(r){return{x:r.map((e,t)=>t)}}function iS(r){if(r==="float32"||r==="int32"||r==="bool"||r==="string")return 4;if(r==="complex64")return 8;throw new Error(`Unknown dtype ${r}`)}function uS(r,e){if(e==="float32")return new Float32Array(r);if(e==="int32")return new Int32Array(r);if(e==="bool"||e==="string")return Uint8Array.from(new Int32Array(r));throw new Error(`Unknown dtype ${e}`)}function Kl(){return(typeof window!="undefined"||typeof WorkerGlobalScope!="undefined")&&!!navigator.gpu}var Qo;(function(r){r[r.MatMulReduceProgram=0]="MatMulReduceProgram",r[r.MatMulSplitKProgram=1]="MatMulSplitKProgram",r[r.MatMulSmallOutputSizeProgram=2]="MatMulSmallOutputSizeProgram",r[r.MatMulPackedProgram=3]="MatMulPackedProgram",r[r.MatMulMax=4]="MatMulMax"})(Qo||(Qo={}));var xte=P().getNumber("WEBGPU_CPU_HANDOFF_SIZE_THRESHOLD"),yte=(r,e)=>{let t=r.limits.maxComputeWorkgroupsPerDimension,o=e.dispatchLayout,n=e.dispatch;if(n.every(a=>a<=t))return n;x.assert(n[0]>t&&o.y===void 0&&o.z===void 0,()=>"Dispatch size exceeds WebGPU limits in Y or Z dimension.");let s=Math.ceil(Math.sqrt(n[0]));return s>t?(s=Math.ceil(Math.cbrt(n[0])),x.assert(s<=t,()=>"Total dispatch size exceeds WebGPU maximum."),[s,s,s]):[s,s,1]},Ai=class extends Jr{constructor(e,t){if(super(),this.commandQueueOwnedIds=new WeakSet,this.dispatchNumberInEncoder=0,this.disposed=!1,this.downloadWaitMs=0,this.tensorDataPendingDisposal=[],this.stagingPendingDisposal=[],this.uniformPendingDisposal=[],this.uploadWaitMs=0,!Kl())throw new Error("WebGPU is not supported on this device");this.pipelineCache={},this.device=e,this.queue=e.queue,this.currentCommandEncoder=null,this.currentComputePass=null,this.supportTimeQuery=e.features.has("timestamp-query"),this.adapterInfo=new Og(t),this.bufferManager=new Mg(this.device),this.textureManager=new Lg(this.device),this.tensorMap=new rn(this,cr()),this.supportTimeQuery&&(this.querySet=this.device.createQuerySet({type:"timestamp",count:2})),P().getBool("WEBGPU_USE_PROFILE_TOOL")&&(this.dummyCanvas=document.createElement("canvas"),this.dummyCanvas.width=1,this.dummyCanvas.height=1,this.dummyContext=this.dummyCanvas.getContext("webgpu"),this.dummyContext.configure({device:e,format:"bgra8unorm"}),document.body.appendChild(this.dummyCanvas))}nextDataId(){return Ai.nextDataId++}floatPrecision(){return 32}defaultGpuBufferUsage(){return GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST}disposeData(e,t=!1){if(this.tensorDataPendingDisposal.indexOf(e)>=0)return!1;if(!this.tensorMap.has(e))return!0;let o=this.tensorMap.get(e);if(this.decRef(e),!t&&o.refCount>0)return!1;if(this.commandQueueOwnedIds.has(e))return this.tensorDataPendingDisposal.push(e),!1;let{complexTensorInfos:n}=this.tensorMap.get(e);return n!=null&&(this.disposeData(n.real.dataId,t),this.disposeData(n.imag.dataId,t)),this.releaseResource(e),this.tensorMap.delete(e),!0}memory(){return{numBytesInGPU:this.bufferManager.numBytesUsed,numBytesAllocatedInGPU:this.bufferManager.numBytesAllocated,unreliable:!1}}releaseResource(e){let t=this.tensorMap.get(e);if(!(!t||!t.resourceInfo)){if("texture"in t.resourceInfo){let o=t.resourceInfo;o.texture instanceof GPUTexture&&this.textureManager.releaseTexture(o.texture,o.width,o.height,o.format,o.usage),o.texture=null}else{let o=t.resourceInfo;this.bufferManager.releaseBuffer(o.buffer,o.size,o.usage),o.buffer=null}t.resourceInfo=null}}refCount(e){return this.tensorMap.has(e)?this.tensorMap.get(e).refCount:0}incRef(e){let t=this.tensorMap.get(e);t.refCount++}decRef(e){if(this.tensorMap.has(e)){let t=this.tensorMap.get(e);t.refCount--}}write(e,t,o){if(o==="complex64"&&e!=null)throw new Error("Cannot write to a complex64 dtype. Please use tf.complex(real, imag).");let n={id:this.nextDataId()};return this.tensorMap.set(n,{dtype:o,shape:t,values:e,refCount:1}),n}move(e,t,o,n,s){if(n==="complex64")throw new Error("Cannot write to a complex64 dtype. Please use tf.complex(real, imag).");this.tensorMap.set(e,{dtype:n,shape:o,values:t,refCount:s})}submitQueue(){this.ensureComputePassEnded(),this.queue.submit([this.currentCommandEncoder.finish()]),this.currentCommandEncoder=null,this.dispatchNumberInEncoder=0,this.commandQueueOwnedIds=new WeakSet,this.tensorDataPendingDisposal.forEach(e=>{this.releaseResource(e),this.tensorMap.delete(e)}),this.uniformPendingDisposal.forEach(e=>this.bufferManager.releaseBuffer(e.buffer,e.size,e.usage)),this.stagingPendingDisposal.forEach(e=>this.bufferManager.releaseUploadBuffer(e.buffer,e.size,e.usage)),this.tensorDataPendingDisposal=[],this.uniformPendingDisposal=[],this.stagingPendingDisposal=[]}ensureCommandEncoderReady(){this.currentCommandEncoder||(this.currentCommandEncoder=this.device.createCommandEncoder())}ensureComputePassEnded(){this.currentComputePass&&(this.currentComputePass.end(),this.currentComputePass=null)}getComputePass(){return this.currentComputePass||(this.currentComputePass=this.currentCommandEncoder.beginComputePass()),this.currentComputePass}async getBufferData(e,t){let o=this.bufferManager.acquireBuffer(t,GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ);this.ensureCommandEncoderReady(),this.ensureComputePassEnded(),this.currentCommandEncoder.copyBufferToBuffer(e,0,o,0,t),this.submitQueue(),await o.mapAsync(GPUMapMode.READ);let n=o.getMappedRange().slice(0);return o.unmap(),o!=null&&this.bufferManager.releaseBuffer(o,t,GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ),P().getBool("WEBGPU_USE_PROFILE_TOOL")&&(x.assert(this.dummyContext!==void 0,()=>"Fail to get context for profiling tool"),this.dummyContext.getCurrentTexture()),n}convertAndCacheOnCPU(e,t){let o=this.tensorMap.get(e);return this.releaseResource(e),o.values=t,o.values}readSync(e){let t=this.tensorMap.get(e),{values:o}=t;if(o==null)throw new Error("WebGPU readSync is only available for CPU-resident tensors.");return o}async read(e){if(!this.tensorMap.has(e))throw new Error(`Tensor ${e} was not registered!`);let t=this.tensorMap.get(e),{values:o}=t;if(o!=null)return this.convertAndCacheOnCPU(e,o);let n;if(t.dtype==="complex64"){let s=await Promise.all([this.read(t.complexTensorInfos.real.dataId),this.read(t.complexTensorInfos.imag.dataId)]),a=s[0],i=s[1];n=I.mergeRealAndImagArrays(a,i)}else{let s=t.resourceInfo,a=await this.getBufferData(s.buffer,s.size);n=uS(a,t.dtype)}return this.convertAndCacheOnCPU(e,n),n}readToGPU(e){let t=this.tensorMap.get(e),{values:o,dtype:n,shape:s,resourceInfo:a}=t;if(n==="complex64")throw new Error("Does not support reading buffer for complex64 dtype.");if(a==null)throw o!=null?new Error("Data is not on GPU but on CPU."):new Error("There is no data on GPU or CPU.");let i=a.size,p=this.bufferManager.acquireBuffer(i,a.usage);this.ensureCommandEncoderReady(),this.ensureComputePassEnded(),this.currentCommandEncoder.copyBufferToBuffer(a.buffer,0,p,0,i),this.submitQueue();let u=this.makeTensorInfo(s,n),c=cr().makeTensorFromTensorInfo(u),l=this.tensorMap.get(u.dataId);return l.resourceInfo={size:i,usage:this.defaultGpuBufferUsage(),buffer:p},{tensorRef:c,buffer:p,bufSize:i}}bufferSync(e){let t=this.readSync(e.dataId);if(e.dtype==="string")try{let o=t.map(n=>x.decodeString(n));return ne(e.shape,e.dtype,o)}catch(o){throw new Error("Failed to decode encoded string bytes into utf-8")}return ne(e.shape,e.dtype,t)}async time(e){this.supportTimeQuery||console.warn("This device doesn't support timestamp-query extension. Start Chrome browser with flag --disable-dawn-features=disallow_unsafe_apis then try again. Otherwise, zero will be shown for the kernel time when profiling mode is enabled. Using performance.now is not workable for webgpu since it doesn't support synchronous data read from GPU.");let t=this.activeTimers,o=[],n=!1;this.programTimersStack==null?(this.programTimersStack=o,n=!0):this.activeTimers.push(o),this.activeTimers=o,e();let s=x.flatten(this.activeTimers.map(u=>u.query)).filter(u=>u!=null),a=x.flatten(this.activeTimers.map(u=>u.name)).filter(u=>u!=null);this.activeTimers=t,n&&(this.programTimersStack=null);let i={uploadWaitMs:this.uploadWaitMs,downloadWaitMs:this.downloadWaitMs,kernelMs:null,wallMs:null},p=await Promise.all(s);return i.kernelMs=x.sum(p),i.getExtraProfileInfo=()=>p.map((u,c)=>({name:a[c],ms:u})).map(u=>`${u.name}: ${u.ms}`).join(", "),this.uploadWaitMs=0,this.downloadWaitMs=0,i}makeTensorInfo(e,t,o){return t==="string"&&o!=null&&o.length>0&&x.isString(o[0])&&(o=o.map(s=>x.encodeString(s))),{dataId:this.write(o,e,t),shape:e,dtype:t}}tensorToBinding(e){if(!e)return null;let t=this.tensorMap.get(e.dataId);if("texture"in t.resourceInfo){let n=t.resourceInfo;return n.texture instanceof GPUExternalTexture?n.texture:n.texture.createView()}let o=t.resourceInfo;return{offset:0,size:o.size,buffer:o.buffer}}async getQueryTime(e){return this.supportTimeQuery?this.getTimeFromQuerySet(e):0}uploadToGPU(e){let t=this.tensorMap.get(e);if(t.resourceInfo)return;let o=iS(t.dtype)*x.sizeFromShape(t.shape),n=this.bufferManager.acquireBuffer(o,this.defaultGpuBufferUsage());if(t.resourceInfo={size:o,usage:this.defaultGpuBufferUsage(),buffer:n},t.values){let s=this.bufferManager.acquireUploadBuffer(o,GPUBufferUsage.MAP_WRITE|GPUBufferUsage.COPY_SRC),a=s.getMappedRange();t.dtype==="int32"||t.dtype==="bool"?new Int32Array(a).set(t.values):new Float32Array(a).set(t.values),s.unmap(),this.ensureCommandEncoderReady(),this.ensureComputePassEnded(),this.currentCommandEncoder.copyBufferToBuffer(s,0,n,0,o);let i={size:o,usage:GPUBufferUsage.MAP_WRITE|GPUBufferUsage.COPY_SRC,buffer:s};this.stagingPendingDisposal.push(i)}}makeUniforms(e){let t=0,o=0,n=[];e.forEach(p=>{p.data.length===0&&(p.data=[1]);let u;switch(p.data.length){case 1:u=4;break;case 2:u=8;break;case 3:u=16;break;case 4:u=16;break;case 5:u=16;break;case 6:u=16;break;default:x.assert(!1,()=>`Unsupported ${p.data.length}D shape`)}(o===5||o===6)&&(u=16),t=Math.ceil(t/u)*u,o=p.data.length,n.push(t),t+=p.data.length*4});let s=new ArrayBuffer(t);e.forEach((p,u)=>{let c=n[u];p.type==="int32"?new Int32Array(s,c,p.data.length).set(p.data):p.type==="uint32"?new Uint32Array(s,c,p.data.length).set(p.data):new Float32Array(s,c,p.data.length).set(p.data)});let a=this.bufferManager.acquireBuffer(t,GPUBufferUsage.COPY_DST|GPUBufferUsage.UNIFORM);this.queue.writeBuffer(a,0,s,0,t);let i={size:t,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.UNIFORM,buffer:a};return this.uniformPendingDisposal.push(i),{offset:0,size:t,buffer:a}}runWebGPUProgram(e,t,o,n,s){if(s||(s=this.makeTensorInfo(e.outputShape,o)),x.sizeFromShape(s.shape)===0)return this.tensorMap.get(s.dataId).values=x.getTypedArrayFromDType(s.dtype,0),s;this.uploadToGPU(s.dataId),e.dispatch=yte(this.device,e);let a=[],i=[];if(!e.isFromPixels){a.push({type:"float32",data:[NaN]}),i=t.concat(s).map(y=>y.shape);let h="int32";i.map(y=>{a.push({type:h,data:y})});let g=x.computeStrides(s.shape);if(a.push({type:h,data:g}),e.size){let y=x.sizeFromShape(e.outputShape);a.push({type:h,data:[e.isVec4?y/4:y]})}}let p=t.map((h,g)=>{if(h.dtype==="complex64")throw new Error("GPGPUProgram does not support complex64 input. For complex64 dtypes, please separate the program into real and imaginary parts.");return this.uploadToGPU(h.dataId),{dtype:this.tensorMap.get(h.dataId).dtype,shape:h.shape,name:e.variableNames[g]}}),u=J3(e,i,p,s),c;u in this.pipelineCache?c=this.pipelineCache[u]:(c=Z3(this.device,e,p,s),this.pipelineCache[u]=c),n&&(a=[...a,...n]);let l=[this.tensorToBinding(s),...t.map(h=>this.tensorToBinding(h)),this.makeUniforms(a)],m=this.device.createBindGroup({layout:c.getBindGroupLayout(0),entries:l.map((h,g)=>({binding:g,resource:h}))});this.ensureCommandEncoderReady();let f=this.getComputePass(),d=this.activeTimers!=null;return d&&this.supportTimeQuery&&f.writeTimestamp(this.querySet,0),f.setPipeline(c),f.setBindGroup(0,m),f.dispatchWorkgroups(e.dispatch[0],e.dispatch[1],e.dispatch[2]),d&&this.supportTimeQuery&&f.writeTimestamp(this.querySet,1),this.dispatchNumberInEncoder++,t.forEach(h=>{this.commandQueueOwnedIds.add(h.dataId)}),this.commandQueueOwnedIds.add(s.dataId),P().get("WEBGPU_DEFERRED_SUBMIT_BATCH_SIZE")<=this.dispatchNumberInEncoder&&this.submitQueue(),d&&this.activeTimers.push({name:e.constructor.name,query:this.getQueryTime(this.querySet)}),s}async getTimeFromQuerySet(e){let t=this.bufferManager.acquireBuffer(16,GPUBufferUsage.COPY_SRC|GPUBufferUsage.QUERY_RESOLVE),o=this.bufferManager.acquireBuffer(16,GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST);this.ensureCommandEncoderReady(),this.ensureComputePassEnded(),this.currentCommandEncoder.resolveQuerySet(e,0,2,t,0),this.currentCommandEncoder.copyBufferToBuffer(t,0,o,0,16),this.submitQueue(),await o.mapAsync(GPUMapMode.READ);let n=new BigUint64Array(o.getMappedRange()),s=Number(n[1]-n[0]);return o.unmap(),this.bufferManager.releaseBuffer(o,16,GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST),this.bufferManager.releaseBuffer(t,16,GPUBufferUsage.COPY_SRC|GPUBufferUsage.QUERY_RESOLVE),s/1e6}shouldExecuteOnCPU(e,t=xte){return P().getBool("WEBGPU_CPU_FORWARD")&&e.every(o=>this.tensorMap.get(o.dataId).resourceInfo==null&&x.sizeFromShape(o.shape){P().set("CHECK_COMPUTATION_FOR_ERRORS",!1);let r={powerPreference:P().get("WEBGPU_USE_LOW_POWER_GPU")?"low-power":"high-performance"},e=await navigator.gpu.requestAdapter(r),t=e.limits,o={},n=e.features.has("timestamp-query");o.requiredLimits={maxComputeWorkgroupStorageSize:t.maxComputeWorkgroupStorageSize,maxComputeWorkgroupsPerDimension:t.maxComputeWorkgroupsPerDimension,maxStorageBufferBindingSize:t.maxStorageBufferBindingSize},n&&(o.requiredFeatures=["timestamp-query"]);let s=await e.requestDevice(o),a=await e.requestAdapterInfo();return new Ai(s,a)},3);var ye;(function(r){r[r.MUL=0]="MUL",r[r.ADD=1]="ADD",r[r.ATAN2=2]="ATAN2",r[r.SUB=3]="SUB",r[r.DIV=4]="DIV",r[r.EQUAL=5]="EQUAL",r[r.GREATER=6]="GREATER",r[r.GREATER_EQUAL=7]="GREATER_EQUAL",r[r.LESS=8]="LESS",r[r.LESS_EQUAL=9]="LESS_EQUAL",r[r.LOGICAL_AND=10]="LOGICAL_AND",r[r.NOT_EQUAL=11]="NOT_EQUAL",r[r.SQUARED_DIFFERENCE=12]="SQUARED_DIFFERENCE",r[r.INT_DIV=13]="INT_DIV",r[r.POW=14]="POW",r[r.PRELU=15]="PRELU",r[r.MAX=16]="MAX",r[r.MIN=17]="MIN",r[r.COMPLEX_MULTIPLY_REAL=18]="COMPLEX_MULTIPLY_REAL",r[r.COMPLEX_MULTIPLY_IMAG=19]="COMPLEX_MULTIPLY_IMAG"})(ye||(ye={}));var bte=` + if (isnan(a)) { return a; } + if (isnan(b)) { return b; } + `,tM=` + if (isNaN.r) { + resultTemp.r = valueForNaN; + } + if (isNaN.g) { + resultTemp.g = valueForNaN; + } + if (isNaN.b) { + resultTemp.b = valueForNaN; + } + if (isNaN.a) { + resultTemp.a = valueForNaN; + } + `,rM=` + let isNaN = isnanVec4(a) | isnanVec4(b); + ${tM} + `,Cte="return a + b;",Ite="return areal * breal - aimag * bimag;",wte="return areal * bimag + aimag * breal;",Ste="return a / b;",vte="return a * b;",kte="return (a - b) * (a - b);",Tte="return a - b;",Nte="return f32(a == b);",_te="return vec4(a == b);",Ete="return f32(a > b);",$te="return vec4(a > b);",Rte="return f32(a >= b);",Ate="return vec4(a >= b);",Fte="return f32(a < b);",Dte="return vec4(a < b);",Pte="return f32(a <= b);",Ote="return vec4(a <= b);",Mte="return f32(f32(a) >= 1.0 && f32(b) >= 1.0);",Lte=`return (vec4(a >= vec4(1.0)) * + vec4(b >= vec4(1.0)));`,Bte=` + let s = sign(a) * sign(b); + let ia = i32(round(a)); + let ib = i32(round(b)); + return f32(idiv(ia, ib, s)); + `,Vte=` + let ia = vec4(round(a)); + let ib = vec4(round(b)); + let cond = ib != vec4(0); + var resultTemp = vec4(0); + let s = sign(a) * sign(b); + + // Windows (D3D) wants guaranteed non-zero int division at compile-time. + if (cond[0]) { + resultTemp[0] = idiv(ia[0], ib[0], s[0]); + } + if (cond[1]) { + resultTemp[1] = idiv(ia[1], ib[1], s[1]); + } + if (cond[2]) { + resultTemp[2] = idiv(ia[2], ib[2], s[2]); + } + if (cond[3]) { + resultTemp[3] = idiv(ia[3], ib[3], s[3]); + } + return vec4(resultTemp); + `,zte=` + if (isnan(a) || isnan(b)) { + return 1.0; + } + return f32(a != b); +`,Wte=` + var resultTemp = vec4(a != b); + let valueForNaN = 1.0; + ${rM} + + return resultTemp; +`,Ute=` + if(a < 0.0 && floor(b) < b) { + return uniforms.NAN; + } + if (b == 0.0) { + return 1.0; + } + if (round(abs(b) % 2.0) != 1.0) { + return pow(abs(a), b); + } + return sign(a) * pow(abs(a), b); + `,Gte=` + let isModRound1Bool = vec4(round(abs(b) % vec4(2.0))) == vec4(1); + let isModRound1 = vec4(isModRound1Bool); + let multiplier = sign(a) * isModRound1 + (vec4(1.0) - isModRound1); + var resultTemp = multiplier * pow(abs(a), b); + + // Ensure that a^0 = 1, including 0^0 = 1 as this correspond to TF and JS + let isExpZero = b == vec4(0.0); + if (isExpZero.r) { + resultTemp.r = 1.0; + } + if (isExpZero.g) { + resultTemp.g = 1.0; + } + if (isExpZero.b) { + resultTemp.b = 1.0; + } + if (isExpZero.a) { + resultTemp.a = 1.0; + } + let isNaN = (a < vec4(0.0)) & (floor(b) < b); + let valueForNaN = uniforms.NAN; + ${tM} + return resultTemp; + `,Hte="if (a < 0.0) { return b * a; } return a;",qte=` + let aLessThanZero = vec4(a < vec4(0.0)); + return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a); + `;function cS(r,e,t="uniforms.NAN"){let o=e?rM:bte;return e?` + let valueForNaN = ${t}; + var resultTemp = vec4(${r}(a, b)); + `+o+` + return resultTemp; + `:o+` + return ${r}(a, b); + `}function Nc(r,e){switch(r){case ye.MUL:return vte;case ye.ADD:return Cte;case ye.ATAN2:return cS("atan2",e);case ye.SUB:return Tte;case ye.DIV:return Ste;case ye.EQUAL:return e?_te:Nte;case ye.GREATER:return e?$te:Ete;case ye.GREATER_EQUAL:return e?Ate:Rte;case ye.LESS:return e?Dte:Fte;case ye.LESS_EQUAL:return e?Ote:Pte;case ye.LOGICAL_AND:return e?Lte:Mte;case ye.NOT_EQUAL:return e?Wte:zte;case ye.SQUARED_DIFFERENCE:return kte;case ye.INT_DIV:return e?Vte:Bte;case ye.PRELU:return e?qte:Hte;case ye.MAX:return cS("max",e);case ye.MIN:return cS("min",e);case ye.POW:return e?Gte:Ute;case ye.COMPLEX_MULTIPLY_REAL:return Ite;case ye.COMPLEX_MULTIPLY_IMAG:return wte;default:throw new Error(`BinaryType ${r} is not implemented!`)}}var pe;(function(r){r[r.ABS=0]="ABS",r[r.CEIL=1]="CEIL",r[r.COS=2]="COS",r[r.COSH=3]="COSH",r[r.ELU=4]="ELU",r[r.EXP=5]="EXP",r[r.EXPM1=6]="EXPM1",r[r.FLOOR=7]="FLOOR",r[r.IS_NAN=8]="IS_NAN",r[r.LINEAR=9]="LINEAR",r[r.LOG=10]="LOG",r[r.LOGICAL_NOT=11]="LOGICAL_NOT",r[r.NEG=12]="NEG",r[r.RELU=13]="RELU",r[r.RELU6=14]="RELU6",r[r.LEAKYRELU=15]="LEAKYRELU",r[r.RECIPROCAL=16]="RECIPROCAL",r[r.RSQRT=17]="RSQRT",r[r.SIN=18]="SIN",r[r.SINH=19]="SINH",r[r.SIGMOID=20]="SIGMOID",r[r.SQRT=21]="SQRT",r[r.SQUARE=22]="SQUARE",r[r.TANH=23]="TANH",r[r.TO_INT=24]="TO_INT"})(pe||(pe={}));var Kte="return abs(a);",jte="return ceil(a);",Xte="return cos(a);",Yte=` + let e2x = exp(-a); + return (e2x + 1.0 / e2x) / 2.0; +`,Qte="return exp(a) - 1.0;",Zte="if (a >= 0.0) { return a; } return (exp(a) - 1.0);",Jte=` + var resFloat = exp(a) - vec4(1.0); + if (a.r >= 0.0) { + resFloat.r = a.r; + } + if (a.g >= 0.0) { + resFloat.g = a.g; + } + if (a.b >= 0.0) { + resFloat.b = a.b; + } + if (a.a >= 0.0) { + resFloat.a = a.a; + } + return resFloat; +`,ere="return exp(a);",tre="return floor(a);",rre="return f32(isnan(a));",ore="return a;",nre=`if (a < 0.0) { return uniforms.NAN; } + return log(a);`,sre="return f32(!(a >= 1.0));",are="return -a;",ire="if (a < 0.0) { return uniforms.alpha * a; } return a;",ure=` + let aLessThanZero = vec4(a < vec4(0.0)); + return (aLessThanZero * (uniforms.alpha * a)) + ((vec4(1.0) - aLessThanZero) * a); +`,pre="return 1.0 / a;",cre="return select(a, 0.0, a < 0.0);",lre="return clamp(a, 0.0, 6.0);",mre="return clamp(a, vec4(0.0, 0.0, 0.0, 0.0), vec4(6.0, 6.0, 6.0, 6.0));",fre=` + return select(a, vec4(0.0), a < vec4(0.0)); +`,dre="return 1.0/sqrt(a);",hre="return 1.0 / (1.0 + exp(-1.0 * a));",gre="return sin(a);",xre=` + let e2x = exp(a); + return (e2x - 1.0 / e2x) / 2.0; +`,yre="return sqrt(a);",bre="return a * a;",Cre=` + let e2x = exp(-2.0 * abs(a)); + return sign(a) * (1.0 - e2x) / (1.0 + e2x); +`,Ire="return f32(i32((a)));";function za(r,e){switch(r){case pe.ABS:return Kte;case pe.COS:return Xte;case pe.COSH:return Yte;case pe.CEIL:return jte;case pe.ELU:return e?Jte:Zte;case pe.EXP:return ere;case pe.EXPM1:return Qte;case pe.FLOOR:return tre;case pe.IS_NAN:return rre;case pe.LINEAR:return ore;case pe.LOG:return nre;case pe.LOGICAL_NOT:return sre;case pe.NEG:return are;case pe.LEAKYRELU:return e?ure:ire;case pe.RECIPROCAL:return pre;case pe.RELU:return e?fre:cre;case pe.RELU6:return e?mre:lre;case pe.RSQRT:return dre;case pe.SIGMOID:return hre;case pe.SIN:return gre;case pe.SINH:return xre;case pe.SQRT:return yre;case pe.SQUARE:return bre;case pe.TANH:return Cre;case pe.TO_INT:return Ire;default:throw new Error(`BinaryType ${r} is not implemented!`)}}var vt=r=>{switch(r){case 1:return"f32";case 2:return"vec2";case 3:return"vec3";case 4:return"vec4";default:throw new Error(`${r}-component is not supported.`)}};function ur(r,e=!1,t=!1,o=3){if(r===null)return"";let n="";if(r==="linear")n=za(pe.LINEAR);else if(r==="relu")n=za(pe.RELU,t);else if(r==="elu")n=za(pe.ELU,t);else if(r==="relu6")n=za(pe.RELU6,t);else if(r==="prelu")n=Nc(ye.PRELU,t);else if(r==="sigmoid")n=za(pe.SIGMOID,t);else if(r==="leakyrelu")n=za(pe.LEAKYRELU,t);else throw new Error(`Activation ${r} has not been implemented for the WebGPU backend.`);let a=vt(t?4:1),i="";return e?i=` + fn activation(a : ${a}, coords : vec${o}) -> ${a} { + let b = getPreluActivationWeightsByOutputCoords(coords); + ${n} + }`:i=` + fn activation(a : ${a}, coords : vec${o}) -> ${a} { + ${n} + }`,i}function Kr(r,e){return` + ${r?"value = value + getBiasByOutputCoords(coords);":""} + ${e?"value = activation(value, coords);":""} + `}function lS(r,e,t,o,n=!1,s=!1,a=!1,i=1){x.assert(t&&i===1||!t,()=>`transposeA ${t} is not compatible with component size ${i}`);let p=` + let batch = ${r?"0":"batchIn"}; + ${t?"value = getA(batch, col, row);":"value = getA(batch, row, col);"} + + `,u=o?"value = getB(batch, col, row);":"value = getB(batch, row, col);";return` + fn mm_readA(batchIn: i32, row: i32, colIn: i32) -> ${vt(i)} { + var value = ${vt(i)}(0.0); + let col = colIn * ${i}; + ${n&&a?p:` + ${t?"if(row < uniforms.dimAOuter && col < uniforms.dimInner)":"if(row < uniforms.aShape[1] && col < uniforms.aShape[2])"} + { + ${p} + } + `} + return value; + } + + fn mm_readB(batchIn: i32, row: i32, colIn: i32) -> ${vt(i)} { + let col = colIn * ${i}; + let batch = ${e?"0":"batchIn"}; + var value = ${vt(i)}(0.0); + ${u} + return value; + } + `}function jl(r,e,t,o,n,s,a=!1,i=!1,p=!1,u=1){return` + ${lS(t,o,n,s,a,i,p,u)} + fn mm_write(batch: i32, row: i32, colIn: i32, valueIn: ${vt(u)}) { + let col = colIn * ${u}; + ${a&&i?"":"if (row < uniforms.dimAOuter && col < uniforms.dimBOuter)"} + { + var value = valueIn; + let coords = vec3(batch, row, col); + ${Kr(r,e)} + setOutputAtCoords(coords[0], coords[1], coords[2], value); + } + } + `}var wre=r=>r?` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + kStart + inputRow, + globalRowStart / InnerElementSize + inputCol); + `:` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + globalRow + innerRow, + kStart / InnerElementSize + inputCol); + `,Sre=(r,e)=>r?` + let ACached0 = mm_Asub[k * InnerElementSize][localRow]; + let ACached1 = mm_Asub[k * InnerElementSize + 1][localRow]; + let ACached2 = mm_Asub[k * InnerElementSize + 2][localRow]; + ${e===3?"":"let ACached3 = mm_Asub[k * InnerElementSize + 3][localRow];"} + for (var i = 0; i < RowPerThread; i = i + 1) { + acc[i] = BCached0 * ACached0[i] + acc[i]; + acc[i] = BCached1 * ACached1[i] + acc[i]; + acc[i] = BCached2 * ACached2[i] + acc[i]; + ${e===3?"":"acc[i] = BCached3 * ACached3[i] + acc[i];"} + }`:` + for (var i = 0; i < RowPerThread; i = i + 1) { + let ACached = mm_Asub[tileRow + i][k]; + acc[i] = BCached0 * ACached.x + acc[i]; + acc[i] = BCached1 * ACached.y + acc[i]; + acc[i] = BCached2 * ACached.z + acc[i]; + ${e===3?"":"acc[i] = BCached3 * ACached.w + acc[i];"} + }`;function Uu(r,e,t=!1,o=32,n=!1,s=32,a=!1){let i=e[1]*r[1],p=e[0]*r[0],u=t?i:o,c=t?o:i,l=u/e[0],m=o/e[1];return x.assert((t&&l===4&&r[1]===4||!t&&(l===3||l===4))&&u%e[0]===0&&o%e[1]===0&&r[0]===4,()=>`If transposeA ${t} is true, innerElementSize ${l} and workPerThread[1] ${r[1]} must be 4. + Otherwise, innerElementSize ${l} must be 3 or 4. + tileAWidth ${u} must be divisible by workGroupSize[0]${e[0]}. tileInner ${o} must be divisible by workGroupSize[1] ${e[1]}. ColPerThread ${r[0]} must be 4.`),` + var mm_Asub : array, ${u/l}>, ${c}>; + var mm_Bsub : array, ${p/r[0]}>, ${o}>; + + const RowPerThread = ${r[1]}; + const ColPerThread = ${r[0]}; + const InnerElementSize = ${l}; + const TileInner = ${o}; + + @compute @workgroup_size(workGroupSizeX, workGroupSizeY, workGroupSizeZ) + fn _start(@builtin(local_invocation_id) LocalId : vec3, + @builtin(global_invocation_id) GlobalId : vec3, + @builtin(num_workgroups) NumWorkgroups: vec3, + @builtin(workgroup_id) workgroupId: vec3) { + localId = LocalId; + globalId = GlobalId; + numWorkgroups = NumWorkgroups; + + let localRow = i32(localId.y); + let tileRow = ${a?"0":"localRow * RowPerThread"}; + let tileCol = i32(localId.x); + + let globalRow = ${a?"0":"i32(globalId.y) * RowPerThread"}; + let globalCol = i32(globalId.x); + let batch = ${n?"0":"i32(globalId.z)"}; + let globalRowStart = i32(workgroupId.y) * ${i}; + + let numTiles = ${n?`${Math.ceil(s/o)}`:"(uniforms.dimInner - 1) / TileInner + 1"}; + var kStart = ${n?`i32(globalId.z) * ${s}`:"0"}; + + var acc: array, RowPerThread>; + + // Loop over shared dimension. + let tileRowB = localRow * ${m}; + for (var t = 0; t < numTiles; t = t + 1) { + // Load one tile of A into local memory. + for (var innerRow = 0; innerRow < RowPerThread; innerRow = innerRow + 1) { + let inputRow = tileRow + innerRow; + let inputCol = tileCol; + ${wre(t)} + } + + // Load one tile of B into local memory. + for (var innerRow = 0; innerRow < ${m}; innerRow = innerRow + 1) { + let inputRow = tileRowB + innerRow; + let inputCol = tileCol; + mm_Bsub[inputRow][inputCol] = mm_readB(batch, kStart + inputRow, globalCol); + } + kStart = kStart + TileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + for (var k = 0; k < TileInner / InnerElementSize; k = k + 1) { + let BCached0 = mm_Bsub[k * InnerElementSize][tileCol]; + let BCached1 = mm_Bsub[k * InnerElementSize + 1][tileCol]; + let BCached2 = mm_Bsub[k * InnerElementSize + 2][tileCol]; + ${l===3?"":"let BCached3 = mm_Bsub[k * InnerElementSize + 3][tileCol];"} + + ${Sre(t,l)} + } + + workgroupBarrier(); + } + + for (var innerRow = 0; innerRow < RowPerThread; innerRow = innerRow + 1) { + mm_write(batch, globalRow + innerRow, globalCol, acc[innerRow]); + } + }`}var oM=r=>r?` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + kStart + inputRow, + globalRowStart + inputCol); + `:` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + globalRowStart + inputRow, + kStart + inputCol); + `,vre=r=>r?"let ACached = mm_Asub[k][tileRow + innerRow];":"let ACached = mm_Asub[tileRow + innerRow][k];";function Gu(r,e,t=!1,o=32,n=!1,s=32,a=!1){let i=r[1]*e[1],p=r[0]*e[0],u=t?i:o,c=t?o:i;x.assert(c%e[1]===0&&u%e[0]===0&&o%e[1]===0,()=>`tileAHight ${c} must be divisible by workGroupSize[1]${e[1]}, tileAWidth ${u} must be divisible by workGroupSize[0]${e[0]}, tileInner ${o} must be divisible by workGroupSize[1]${e[1]}`);let l=c/e[1],m=u/e[0],f=o/e[1],d=a?` + let localRow = i32(localId.y); + let localCol = i32(localId.x); + let globalRowStart = i32(workgroupId.y) * ${i}; + let globalColStart = i32(workgroupId.x) * ${p}; + + // Loop over shared dimension. + for (var t = 0; t < numTiles; t = t + 1) { + // Load one tile of A into local memory. + for (var inputRow = localRow; inputRow < ${c}; inputRow = inputRow + ${e[1]}) { + for (var inputCol = localCol; inputCol < ${u}; inputCol = inputCol + ${e[0]}) { + ${oM(t)} + } + } + // Load one tile of B into local memory. + for (var inputRow = localRow; inputRow < ${o}; inputRow = inputRow + ${e[1]}) { + for (var inputCol = localCol; inputCol < ${p}; inputCol = inputCol + ${e[0]}) { + mm_Bsub[inputRow][inputCol] = mm_readB(batch, + kStart + inputRow, + globalColStart + inputCol); + } + } + kStart = kStart + TileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + var BCached : array; + for (var k = 0; k < TileInner; k = k + 1) { + for (var inner = 0; inner < ColPerThread; inner = inner + 1) { + BCached[inner] = mm_Bsub[k][localCol + inner * ${e[0]}]; + } + for (var innerRow = 0; innerRow < RowPerThread; innerRow = innerRow + 1) { + let ACached = ${t?`mm_Asub[k][localRow + innerRow * ${e[1]}];`:`mm_Asub[localRow + innerRow * ${e[1]}][k];`} + for (var innerCol = 0; innerCol < ColPerThread; innerCol = innerCol + 1) { + acc[innerRow][innerCol] = acc[innerRow][innerCol] + + ACached * BCached[innerCol]; + } + } + } + workgroupBarrier(); + } + for (var innerRow = 0; innerRow < RowPerThread; innerRow = innerRow + 1) { + let gRow = globalRowStart + localRow + innerRow * ${e[1]}; + for (var innerCol = 0; innerCol < ColPerThread; innerCol = innerCol + 1) { + let gCol = globalColStart + localCol + innerCol * ${e[0]}; + mm_write(batch, gRow, gCol, acc[innerRow][innerCol]); + } + } + `:` + let tileRow = i32(localId.y) * RowPerThread; + let tileCol = i32(localId.x) * ColPerThread; + + let globalRow = i32(globalId.y) * RowPerThread; + let globalCol = i32(globalId.x) * ColPerThread; + let globalRowStart = i32(workgroupId.y) * ${i}; + + let tileRowA = i32(localId.y) * ${l}; + let tileColA = i32(localId.x) * ${m}; + let tileRowB = i32(localId.y) * ${f}; + // Loop over shared dimension. + for (var t = 0; t < numTiles; t = t + 1) { + // Load one tile of A into local memory. + for (var innerRow = 0; innerRow < ${l}; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < ${m}; innerCol = innerCol + 1) { + let inputRow = tileRowA + innerRow; + let inputCol = tileColA + innerCol; + ${oM(t)} + } + } + + // Load one tile of B into local memory. + for (var innerRow = 0; innerRow < ${f}; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < ColPerThread; innerCol = innerCol + 1) { + let inputRow = tileRowB + innerRow; + let inputCol = tileCol + innerCol; + mm_Bsub[inputRow][inputCol] = mm_readB(batch, + kStart + inputRow, + globalCol + innerCol); + } + } + kStart = kStart + TileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + var BCached : array; + for (var k = 0; k < TileInner; k = k + 1) { + for (var inner = 0; inner < ColPerThread; inner = inner + 1) { + BCached[inner] = mm_Bsub[k][tileCol + inner]; + } + + for (var innerRow = 0; innerRow < RowPerThread; innerRow = innerRow + 1) { + ${vre(t)} + for (var innerCol = 0; innerCol < ColPerThread; innerCol = innerCol + 1) { + acc[innerRow][innerCol] = acc[innerRow][innerCol] + ACached * BCached[innerCol]; + } + } + } + + workgroupBarrier(); + } + + for (var innerRow = 0; innerRow < RowPerThread; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < ColPerThread; innerCol = innerCol + 1) { + mm_write(batch, globalRow + innerRow, globalCol + innerCol, + acc[innerRow][innerCol]); + } + } + `;return` + var mm_Asub : array, ${c}>; + var mm_Bsub : array, ${o}>; + const RowPerThread = ${r[1]}; + const ColPerThread = ${r[0]}; + const TileInner = ${o}; + + @compute @workgroup_size(workGroupSizeX, workGroupSizeY, workGroupSizeZ) + fn _start(@builtin(local_invocation_id) LocalId : vec3, + @builtin(global_invocation_id) GlobalId : vec3, + @builtin(num_workgroups) NumWorkgroups: vec3, + @builtin(workgroup_id) workgroupId: vec3) { + localId = LocalId; + globalId = GlobalId; + numWorkgroups = NumWorkgroups; + + let batch = ${n?"0":"i32(globalId.z)"}; + let numTiles = ${n?`${Math.ceil(s/o)}`:"(uniforms.dimInner - 1) / TileInner + 1"}; + var kStart = ${n?`i32(globalId.z) * ${s}`:"0"}; + + var acc : array, RowPerThread>; + + // Without this initialization strange values show up in acc. + for (var innerRow = 0; innerRow < RowPerThread; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < ColPerThread; innerCol = innerCol + 1) { + acc[innerRow][innerCol] = 0.0; + } + } + ${d} + } + `}var kre=r=>r?` + mm_readA(batch, colA, globalRow), + mm_readA(batch, colA + 1, globalRow), + mm_readA(batch, colA + 2, globalRow), + mm_readA(batch, colA + 3, globalRow) + `:` + mm_readA(batch, globalRow, colA), + mm_readA(batch, globalRow, colA + 1), + mm_readA(batch, globalRow, colA + 2), + mm_readA(batch, globalRow, colA + 3) + `;function Tre(r,e=!1){return x.assert(r[1]===1&&r[2]===1,()=>`A linear work group size is required. But got ${r}.`),` + const TileSize = ${r[0]*4}; + var mm_Asub : array, ${r[0]}>; + + ${ue()} { + let tileCol = i32(localId.x); + let globalCol = i32(globalId.x); + let globalRow = i32(globalId.y); + + let numTiles = (uniforms.dimInner - 1) / TileSize + 1; + let batch = i32(globalId.z); + // Without this initialization strange values show up in acc. + var acc = 0.0; + + // Loop over shared dimension. + for (var t = 0; t < numTiles; t = t + 1) { + // Load one tile of A into local memory. + let colA = t * TileSize + tileCol * 4; + mm_Asub[tileCol] = vec4(${kre(e)}); + workgroupBarrier(); + + // Compute acc values for a single thread. + for (var k = 0; k < TileSize / 4; k = k + 1) { + let rowB = t * TileSize + k * 4; + let BCached = vec4(mm_readB(batch, rowB, globalCol), + mm_readB(batch, rowB + 1, globalCol), + mm_readB(batch, rowB + 2, globalCol), + mm_readB(batch, rowB + 3, globalCol)); + + let ACached = mm_Asub[k]; + acc = acc + dot(ACached, BCached); + } + + workgroupBarrier(); + } + + mm_write(batch, globalRow, globalCol, acc); + } + `}var Bg=class{constructor(e,t,o,n,s=!1,a=!1,i=null,p=null,u=null,c=!1){this.variableNames=["A","B"],this.uniforms="dimAOuter : i32, dimBOuter : i32, dimInner : i32,",this.outputShape=t,this.dispatchLayout={x:[2],y:[1],z:[0]};let l=s?e[1]:e[2];if(this.isVec4=(l%4===0&&!s||t[1]%4===0&&s)&&t[2]%4===0&&!a,this.isVectorA=t[1]===1&&!s,!this.isVec4&&this.isVectorA)this.elementsPerThread=[1,1,1],this.workGroupSize=[32,1,1];else{let d=aS(t[1],l,t[2],s);this.workGroupSize=d.workGroupSize,this.elementsPerThread=d.elementsPerThread}this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize,this.elementsPerThread);let m=i!=null,f=u!=null;m&&this.variableNames.push("bias"),f&&this.variableNames.push("preluActivationWeights"),this.sequentialAccessByThreads=c,this.transposeA=s,this.transposeB=a,this.addBias=m,this.activation=p,this.hasPreluActivationWeights=f,this.batchAEqualOne=o,this.batchBEqualOne=n,[this.fitAOuter,this.fitBOuter,this.fitInner]=this.getShapeFit(t[1],t[2],l),this.shaderKey=`matMulPacked_${this.elementsPerThread}_${s}_${a}_${this.activation}_${this.fitAOuter}_${this.fitBOuter}_${this.fitInner}_${this.isVec4}_${this.isVectorA}_${this.batchAEqualOne}_${this.batchBEqualOne}_${this.sequentialAccessByThreads}`}getShapeFit(e,t,o){let n=this.workGroupSize[1]*this.elementsPerThread[1],s=this.workGroupSize[0]*this.elementsPerThread[0];!this.isVec4&&this.isVectorA?this.tileInner=this.workGroupSize[0]*4:this.tileInner=s;let a=e%n===0,i=t%s===0,p=o%this.tileInner===0;return[a,i,p]}getUserCode(){return` + ${ur(this.activation,this.hasPreluActivationWeights,this.isVec4)} + ${jl(this.addBias,this.activation,this.batchAEqualOne,this.batchBEqualOne,!1,this.transposeB,this.fitAOuter,this.fitBOuter,this.fitInner,this.isVec4?4:1)} + ${this.isVec4?Uu(this.elementsPerThread,this.workGroupSize,this.transposeA,this.tileInner,!1,null,this.isVectorA):this.isVectorA?Tre(this.workGroupSize,this.transposeA):Gu(this.elementsPerThread,this.workGroupSize,this.transposeA,this.tileInner,!1,null,this.sequentialAccessByThreads)} + `}};function Nre(){return` + var sumValues : array; + ${ue()} { + let coords = getOutputCoords(); + let batch = coords[0]; + let row = coords[1]; + let col = coords[2]; + var sum = 0.0; + let Length = uniforms.dimInner; + for (var k = i32(localId.x); k < Length; k = k + i32(workGroupSizeX)) { + let dataA = mm_readA(batch, row, k); + let dataB = mm_readB(batch, k, col); + sum = sum + dataA * dataB; + } + sumValues[localId.x] = sum; + workgroupBarrier(); + + for(var currentSize = workGroupSizeX / 2u; currentSize > 1u; + currentSize = currentSize / 2u) { + if (localId.x < currentSize) + { + sumValues[localId.x] = sumValues[localId.x] + sumValues[localId.x + currentSize]; + } + workgroupBarrier(); + } + + if (localId.x == 0u) { + sum = sumValues[0] + sumValues[1]; + mm_write(batch, row, col, sum); + } + } + `}var Vg=class{constructor(e,t,o,n=!1,s=!1,a=null,i=null,p=null){this.variableNames=["A","B"],this.uniforms="dimAOuter : i32, dimBOuter : i32, dimInner : i32,",this.workGroupSize=[256,1,1],this.outputShape=e,this.dispatchLayout={x:[],y:[1,2],z:[0]},this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize);let u=a!=null,c=p!=null;u&&this.variableNames.push("bias"),c&&this.variableNames.push("preluActivationWeights"),this.transposeA=n,this.transposeB=s,this.addBias=u,this.activation=i,this.hasPreluActivationWeights=c,this.batchAEqualOne=t,this.batchBEqualOne=o,this.shaderKey=`matMulReduce_${this.activation}_${n}_${s}_${this.batchAEqualOne}_${this.batchBEqualOne}`}getUserCode(){return` + ${ur(this.activation,this.hasPreluActivationWeights)} + ${jl(this.addBias,this.activation,this.batchAEqualOne,this.batchBEqualOne,this.transposeA,this.transposeB)} + ${Nre()} + `}};function _re(r){let e=r[1],t=r[0],o=e>t?e:t;return` + var mm_Asub : array, ${e}>; + var mm_Bsub : array, ${o}>; + + // If the output size is small for matrix multiplication, avoid to use vec4 + // and handle some elements per thread to optimally utilize the ALU. + // Read data from global memory to registers firstly, then store them into + // shared memory, so it is instruction-Level parallelism for arithmetic + // operations and others handle IO operations between barrier api, makes ALU + // and load/store units work simultaneously, could improves the performance. + ${ue()} { + let tileRow = i32(localId.y); + let tileCol = i32(localId.x); + let globalRow = i32(globalId.y); + let globalCol = i32(globalId.x); + let batch = i32(globalId.z); + + // uniforms.dimInner should be greater than 0. + let numTiles = (uniforms.dimInner - 1) / ${o} + 1; + var acc = 0.0; + + var globalColA = tileCol; + var globalRowB = 0; + var regA = mm_readA(batch, globalRow, globalColA); + var regB0 = mm_readB(batch, globalRowB + 2 * tileRow, globalCol); + var regB1 = mm_readB(batch, globalRowB + 2 * tileRow + 1, globalCol); + globalColA = globalColA + ${o}; + globalRowB = globalRowB + ${o}; + + for (var t = 0; t < numTiles; t = t + 1) { + mm_Asub[tileRow][tileCol] = regA; + mm_Bsub[2 * tileRow][tileCol] = regB0; + mm_Bsub[2 * tileRow + 1][tileCol] = regB1; + + workgroupBarrier(); + + regA = mm_readA(batch, globalRow, globalColA); + regB0 = mm_readB(batch, globalRowB + 2 * tileRow, globalCol); + regB1 = mm_readB(batch, globalRowB + 2 * tileRow + 1, globalCol); + globalColA = globalColA + ${o}; + globalRowB = globalRowB + ${o}; + + for (var k = 0; k < ${o}; k = k + 1) { + acc = acc + mm_Asub[tileRow][k] * mm_Bsub[k][tileCol]; + } + workgroupBarrier(); + } + + mm_write(batch, globalRow, globalCol, acc); + } + `}var zg=class{constructor(e,t,o,n=!1,s=!1,a=null,i=null,p=null){this.variableNames=["A","B"],this.uniforms="dimAOuter : i32, dimBOuter : i32, dimInner : i32,",this.workGroupSize=[16,8,1],this.outputShape=o,this.dispatchLayout={x:[2],y:[1],z:[0]},this.dispatch=[Math.ceil(o[2]/this.workGroupSize[0]),Math.ceil(o[1]/this.workGroupSize[1]),o[0]];let u=a!=null;u&&this.variableNames.push("bias");let c=p!=null;c&&this.variableNames.push("preluActivationWeights"),this.transposeA=n,this.transposeB=s,this.addBias=u,this.activation=i,this.hasPreluActivationWeights=c,this.batchAEqualOne=e[0]===1,this.batchBEqualOne=t[0]===1,this.shaderKey=`matMulSmallOutputSize_${this.activation}_${n}_${s}_${this.batchAEqualOne}_${this.batchBEqualOne}`}getUserCode(){return` + ${ur(this.activation,this.hasPreluActivationWeights)} + ${jl(this.addBias,this.activation,this.batchAEqualOne,this.batchBEqualOne,this.transposeA,this.transposeB)} + ${_re(this.workGroupSize)} + `}};var Wg=class{constructor(e,t,o,n,s=!1,a=!1){this.variableNames=["A","B"],this.uniforms="dimAOuter : i32, dimBOuter : i32, dimInner : i32,",this.workGroupSize=[8,8,1],this.atomic=!0,this.isVec4=!1,this.splitedDimInner=128,x.assert(e[0]===1,()=>"MatMulSplitKProgram only supports batch = 1."),this.outputShape=e,this.dispatchLayout={x:[2],y:[1],z:[0,3]},this.isVec4=(s&&this.outputShape[1]%4===0||!s&&t%4===0)&&this.outputShape[2]%4===0,this.elementsPerThread=[4,4,this.splitedDimInner],this.isVec4||(this.outputShape[1]<16&&(this.elementsPerThread[1]=1),this.outputShape[2]<16&&(this.elementsPerThread[0]=1)),this.dispatch=ae(this.dispatchLayout,[this.outputShape[0],this.outputShape[1],this.outputShape[2],t],this.workGroupSize,this.elementsPerThread),this.transposeA=s,this.transposeB=a,this.batchAEqualOne=o,this.batchBEqualOne=n,this.shaderKey=`matMulSplitK_${s}_${a}_${o}_${n}_${this.elementsPerThread}_${this.isVec4}`}getUserCode(){let e=n=>` + for (var i = 0; i < ${n}; i = i + 1) + { + var oldValue = atomicLoad(&(result[flatIndex + i])); + var exchanged = false; + for (; !exchanged;) { + let newValueF32 = bitcast(oldValue) + ${n>1?"value[i]":"value"}; + let newValue = bitcast(newValueF32); + let res = atomicCompareExchangeWeak(&(result[flatIndex + i]), oldValue, newValue); + oldValue = res.old_value; + exchanged = res.exchanged; + } + } + `,t=this.isVec4?4:1;return` + ${lS(this.batchAEqualOne,this.batchBEqualOne,!1,this.transposeB,!1,!1,!1,t)} + fn mm_write(batch: i32, row : i32, colIn : i32, value : ${vt(t)}) { + let col = colIn * ${t}; + if (row < uniforms.dimAOuter && col < uniforms.dimBOuter) { + let coords = vec3(batch, row, col); + let flatIndex = getOutputIndexFromCoords(coords); + // The problem is that we should initialize output to zero before using. + // Otherwise, the original value will be added to the result. + ${e(t)} + } + } + ${this.isVec4?Uu(this.elementsPerThread,this.workGroupSize,this.transposeA,32,!0,this.splitedDimInner):Gu(this.elementsPerThread,this.workGroupSize,this.transposeA,32,!0,this.splitedDimInner)} + `}},Ug=class{constructor(e,t=null,o=null,n=null){this.uniforms="",this.variableNames=["x"],this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=e,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.addBias=t!=null,this.hasPreluActivationWeights=n!=null,this.activation=o,this.addBias&&this.variableNames.push("bias"),this.hasPreluActivationWeights&&this.variableNames.push("preluActivationWeights"),this.shaderKey=`biasActivation_${o}`}getUserCode(){return` + ${ur(this.activation,this.hasPreluActivationWeights)} + ${ue("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + var value = getXByOutputIndex(index); + ${Kr(this.addBias,this.activation)} + setOutputAtIndex(index, value); + } + } + `}};var Gg=class{constructor(e){this.variableNames=[],this.outputShape=[],this.uniforms="value : f32,",this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=e,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey="fill"}getUserCode(){return` + ${ue("index")} { + if (index < uniforms.size) { + setOutputAtIndex(index, uniforms.value); + } + } + `}};function $o(r){let{backend:e,attrs:t}=r,{shape:o,value:n}=t,{dtype:s}=t;if(s=s||x.inferDtype(n),s==="string"){let a=x.getArrayFromDType(s,x.sizeFromShape(o));return a.fill(n),e.makeTensorInfo(o,s,a)}else{let a=new Gg(o),i=[{type:"float32",data:[n]}];return e.runWebGPUProgram(a,[],s,i)}}var nM={kernelName:ys,backendName:"webgpu",kernelFunc:$o};function xe(r){let{inputs:e,attrs:t}=r,{x:o}=e,{shape:n}=t,s=x.sizeFromShape(o.shape),a=x.inferFromImplicitShape(n,s),i=x.sizeFromShape(a);return x.assert(s===i,()=>`The new shape (${a}) has ${i} elements and the old shape (${o.shape}) has ${s} elements. The new shape and old shape must have the same number of elements.`),r.backend.incRef(o.dataId),{dataId:o.dataId,shape:a,dtype:o.dtype}}var sM={kernelName:Ss,backendName:"webgpu",kernelFunc:xe};function _c({a:r,b:e,transposeA:t,transposeB:o,backend:n,bias:s=null,preluActivationWeights:a=null,leakyreluAlpha:i=0,activation:p=null}){let u=r.shape.length,c=e.shape.length,l=t?r.shape[u-2]:r.shape[u-1],m=o?e.shape[c-1]:e.shape[c-2],f=t?r.shape[u-1]:r.shape[u-2],d=o?e.shape[c-2]:e.shape[c-1],h=r.shape.slice(0,-2),g=e.shape.slice(0,-2),y=x.sizeFromShape(h),b=x.sizeFromShape(g),w=br.assertAndGetBroadcastShape(r.shape.slice(0,-2),e.shape.slice(0,-2)).concat([f,d]);x.assert(l===m,()=>`Error in matMul: inner shapes (${l}) and (${m}) of Tensors with shapes ${r.shape} and ${e.shape} and transposeA=${t} and transposeB=${o} must match.`);let k=t?[y,l,f]:[y,f,l],_=o?[b,d,m]:[b,m,d],E=xe({inputs:{x:r},backend:n,attrs:{shape:k}}),R=xe({inputs:{x:e},backend:n,attrs:{shape:_}}),A=[E,R],D=Math.max(y,b),O=y===1,M=b===1,L=[E,R],W=[{type:"int32",data:[f]},{type:"int32",data:[d]},{type:"int32",data:[l]}],V,G,q=[D,f,d],H=P().get("WEBGPU_MATMUL_PROGRAM_TYPE");switch(H<0&&(f*d<=128?H=Qo.MatMulReduceProgram:D===1&&f<=128&&d<=48&&m>=2e3?H=Qo.MatMulSplitKProgram:f<=16&&(d<=512||m>=2*d)||d<=16&&(f<=512||l>=2*f)?H=Qo.MatMulSmallOutputSizeProgram:H=Qo.MatMulPackedProgram),H){case Qo.MatMulReduceProgram:V=new Vg(q,O,M,t,o,s,p,a);break;case Qo.MatMulSplitKProgram:{if(G=$o({backend:n,attrs:{shape:q,value:0,dtype:r.dtype}}),V=new Wg(q,m,O,M,t,o),s||p){G=n.runWebGPUProgram(V,L,r.dtype,W,G);let Z=new Ug(G.shape,s,p,a),ee=null,X=[G];s&&X.push(s),a&&X.push(a),p==="leakyrelu"&&(ee=[{type:"float32",data:[i]}],Z.uniforms+=" alpha : f32,");let Q=n.runWebGPUProgram(Z,X,G.dtype,ee);A.push(G);let se=xe({inputs:{x:Q},backend:n,attrs:{shape:w}});A.push(Q);for(let ie of A)n.disposeData(ie.dataId);return se}break}case Qo.MatMulSmallOutputSizeProgram:V=new zg(k,_,q,t,o,s,p,a);break;case Qo.MatMulPackedProgram:let Y=n.adapterInfo.isIntel();V=new Bg(k,q,O,M,t,o,s,p,a,Y);break;default:throw new Error(`Unsupported MatMulProgramType ${H}.`)}s&&L.push(s),a&&L.push(a),p==="leakyrelu"&&(W.push({type:"float32",data:[i]}),V.uniforms+=" alpha : f32,"),G=n.runWebGPUProgram(V,L,r.dtype,W,G);let j=xe({inputs:{x:G},backend:n,attrs:{shape:w}});A.push(G);for(let Y of A)n.disposeData(Y.dataId);return j}function Ere(r){let{inputs:e,backend:t,attrs:o}=r,{a:n,b:s,bias:a,preluActivationWeights:i}=e,{transposeA:p,transposeB:u,activation:c,leakyreluAlpha:l}=o;return _c({a:n,b:s,transposeA:p,transposeB:u,backend:t,bias:a,preluActivationWeights:i,leakyreluAlpha:l,activation:c})}var aM={kernelName:Fo,backendName:"webgpu",kernelFunc:Ere};var Xl=class{constructor(e,t,o){this.variableNames=["AReal","AImag","BReal","BImag"],this.workGroupSize=[128,1,1],this.size=!0,this.outputShape=I.assertAndGetBroadcastShape(t,o),this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey=`binaryOpComplex_${e}`,this.op=e}getUserCode(){return` + fn binaryOpComplex( + areal : f32, aimag : f32, breal : f32, bimag : f32) -> f32 { + ${Nc(this.op,!1)} + } + + ${ue("index")} { + if(index < uniforms.size) { + let areal = getARealByOutputIndex(index); + let aimag = getAImagByOutputIndex(index); + let breal = getBRealByOutputIndex(index); + let bimag = getBImagByOutputIndex(index); + setOutputAtIndex(index, binaryOpComplex(areal, aimag, breal, bimag)); + } + } + `}};var Hu=class{constructor(e,t,o){this.size=!0,this.variableNames=["A","B"],this.outputShape=I.assertAndGetBroadcastShape(t,o),this.dispatchLayout=fe(this.outputShape),this.op=e,this.useSharedMemoryWithA=t.length<=1&&o.length>1&&t[0]<128,this.useSharedMemoryWithB=o.length<=1&&t.length>1&&o[0]<128,this.useSharedMemoryWithA||this.useSharedMemoryWithB?(this.isVec4=!1,this.lastDimensionSize=this.useSharedMemoryWithB?o[0]:t[0],this.shaderKey=`binary_${this.type}_${e}_${this.lastDimensionSize}_${this.useSharedMemoryWithB}`,this.type="shared",this.workGroupSize=[256,1,1],this.workPerThread=1):(x.arraysEqual(t,o)&&x.sizeFromShape(t)%4===0?(this.isVec4=!0,this.type="vec4",this.workPerThread=4):(this.isVec4=!1,this.type="plain",this.workPerThread=1),this.shaderKey=`binary_${this.type}_${e}`,this.workGroupSize=[128,1,1]),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize,[this.workPerThread,1,1])}getUserCode(){let e,t=this.isVec4?"vec4":"f32",o=` + fn binaryOperation(a : ${t}, b : ${t}) -> ${t} { + ${Nc(this.op,this.isVec4)} + }; + `;if(this.type==="shared"){let n=this.lastDimensionSize>1?`coords[${this.outputShape.length-1}]`:"0",s=this.useSharedMemoryWithB?`let a = getAByOutputIndex(index); + let b = sharedBuf[${n}];`:`let a = sharedBuf[${n}]; + let b = getBByOutputIndex(index);`;e=` + ${o} + var sharedBuf : array; + ${ue("index")} { + // Fill in the shared memory buffer. + let localIndex = i32(localId.x); + if(localIndex < ${this.lastDimensionSize}) { + sharedBuf[localIndex] = f32(${this.useSharedMemoryWithB?"B":"A"}[localIndex]); + } + workgroupBarrier(); + + if(index < uniforms.size) { + let coords = getCoordsFromIndex(index); + ${s} + setOutputAtIndex(index, binaryOperation(a, b)); + } + } + `}else e=` + ${o} + ${ue("index")} { + if (index < uniforms.size) { + let a = getAByOutputIndex(index); + let b = getBByOutputIndex(index); + setOutputAtIndex(index, binaryOperation(a, b)); + } + } + `;return e}};function Lt(r){let{inputs:e}=r,{x:t}=e;return r.backend.incRef(t.dataId),{dataId:t.dataId,shape:t.shape,dtype:t.dtype}}var iM={kernelName:uo,backendName:"webgpu",kernelFunc:Lt};function ls(r){let{inputs:e,backend:t}=r,{real:o,imag:n}=e,s=t.makeTensorInfo(o.shape,"complex64"),a=t.tensorMap.get(s.dataId),i=Lt({inputs:{x:o},backend:t}),p=Lt({inputs:{x:n},backend:t});return a.complexTensorInfos={real:i,imag:p},s}var uM={kernelName:aa,backendName:"webgpu",kernelFunc:ls};var Zo=class{constructor(e,t){this.variableNames=["A"],this.size=!0;let o=128;this.workGroupSize=[o,1,1],this.outputShape=e,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.op=t,this.shaderKey=`unary_${t}`}getUserCode(){return` + fn unaryOperation(a : f32) -> f32 { + ${za(this.op,!1)} + } + ${ue("index")} { + if (index < uniforms.size) { + let a = getAByOutputIndex(index); + setOutputAtIndex(index, unaryOperation(a)); + } + } + `}};function Ge({opType:r,cpuKernelImpl:e,dtype:t}){return({inputs:o,backend:n})=>{let{x:s}=o,a=n,i=t||s.dtype;if(a.shouldExecuteOnCPU([s])&&e!=null){let u=a.tensorMap.get(s.dataId),c=e(u.values,i);return a.makeTensorInfo(s.shape,i,c)}let p=new Zo(s.shape,r);return a.runWebGPUProgram(p,[s],i)}}function it({opType:r,cpuKernelImpl:e,supportsComplex:t=!1,dtype:o}){return({inputs:n,backend:s})=>{let{a,b:i}=n,p=s;if(t&&a.dtype==="complex64"){let l=p.tensorMap.get(a.dataId),m=p.tensorMap.get(i.dataId),f,d;if(r!==ye.MUL)[f,d]=[[l.complexTensorInfos.real,m.complexTensorInfos.real],[l.complexTensorInfos.imag,m.complexTensorInfos.imag]].map(g=>{let[y,b]=g,C={dataId:y.dataId,dtype:y.dtype,shape:a.shape},w={dataId:b.dataId,dtype:b.dtype,shape:i.shape},k=new Hu(r,a.shape,i.shape);return p.runWebGPUProgram(k,[C,w],ct(y.dtype,b.dtype))});else{let g=new Xl(ye.COMPLEX_MULTIPLY_REAL,a.shape,i.shape),y=new Xl(ye.COMPLEX_MULTIPLY_IMAG,a.shape,i.shape),b=[{dataId:l.complexTensorInfos.real.dataId,dtype:l.complexTensorInfos.real.dtype,shape:a.shape},{dataId:l.complexTensorInfos.imag.dataId,dtype:l.complexTensorInfos.imag.dtype,shape:a.shape},{dataId:m.complexTensorInfos.real.dataId,dtype:m.complexTensorInfos.real.dtype,shape:i.shape},{dataId:m.complexTensorInfos.imag.dataId,dtype:m.complexTensorInfos.imag.dtype,shape:i.shape}];f=p.runWebGPUProgram(g,b,"float32"),d=p.runWebGPUProgram(y,b,"float32")}let h=ls({inputs:{real:f,imag:d},backend:p});return p.disposeData(f.dataId),p.disposeData(d.dataId),h}let u=o||ct(a.dtype,i.dtype);if((a.dtype==="string"||i.dtype==="string"||p.shouldExecuteOnCPU([a,i]))&&e!=null){let l=p.tensorMap.get(a.dataId).values,m=p.tensorMap.get(i.dataId).values,f=a.dtype==="string"?I.fromUint8ToStringArray(l):l,d=a.dtype==="string"?I.fromUint8ToStringArray(m):m,[h,g]=e(a.shape,i.shape,f,d,u);return p.makeTensorInfo(g,u,h)}let c=new Hu(r,a.shape,i.shape);return p.runWebGPUProgram(c,[a,i],u)}}var FS={};Be(FS,{addImpl:()=>dS,bincountImpl:()=>lM,bincountReduceImpl:()=>mM,castImpl:()=>fS,ceilImpl:()=>hS,concatImpl:()=>fM,equalImpl:()=>gS,expImpl:()=>xS,expm1Impl:()=>yS,floorImpl:()=>bS,gatherNdImpl:()=>dM,gatherV2Impl:()=>hM,greaterEqualImpl:()=>IS,greaterImpl:()=>CS,lessEqualImpl:()=>SS,lessImpl:()=>wS,linSpaceImpl:()=>gM,logImpl:()=>vS,maxImpl:()=>xM,maximumImpl:()=>kS,minimumImpl:()=>TS,multiplyImpl:()=>Ql,negImpl:()=>yM,notEqualImpl:()=>NS,prodImpl:()=>bM,raggedGatherImpl:()=>IM,raggedTensorToTensorImpl:()=>vM,rangeImpl:()=>kM,rsqrtImpl:()=>ES,scatterImpl:()=>TM,sigmoidImpl:()=>NM,simpleAbsImpl:()=>pM,sliceImpl:()=>_M,sparseFillEmptyRowsImpl:()=>EM,sparseReshapeImpl:()=>$M,sparseSegmentReductionImpl:()=>RM,sqrtImpl:()=>AM,squaredDifferenceImpl:()=>$S,stridedSliceImpl:()=>FM,stringNGramsImpl:()=>DM,stringSplitImpl:()=>PM,stringToHashBucketFastImpl:()=>OM,subImpl:()=>AS,tileImpl:()=>MM,topKImpl:()=>BM,transposeImpl:()=>_S,uniqueImpl:()=>VM});function Xs(r,e){Array.isArray(r)||(r=[r]),r.forEach(t=>{t!=null&&x.assert(t.dtype!=="complex64",()=>`${e} does not support complex64 tensors in the CPU backend.`)})}function pM(r){let e=new Float32Array(r.length);for(let t=0;t{let a=I.assertAndGetBroadcastShape(e,t),i=a.length,p=x.computeStrides(a),u=x.sizeFromShape(a),c=x.getTypedArrayFromDType(s,u),l=e.length,m=t.length,f=x.computeStrides(e),d=x.computeStrides(t),h=I.getBroadcastDims(e,a),g=I.getBroadcastDims(t,a);if(h.length+g.length===0)for(let y=0;yC[E]=0);let w=x.locToIndex(C,l,f),k=b.slice(-m);g.forEach(E=>k[E]=0);let _=x.locToIndex(k,m,d);c[y]=r(o[w],n[_])}return[c,a]}}function Ec(r){let{inputs:e,backend:t}=r,{real:o,imag:n}=e,s=t.data.get(o.dataId).values,a=t.data.get(n.dataId).values,i=t.makeTensorInfo(o.shape,"complex64"),p=t.data.get(i.dataId);return p.complexTensorInfos={real:t.makeTensorInfo(o.shape,"float32",s),imag:t.makeTensorInfo(n.shape,"float32",a)},i}function Hg(r,e,t="float32"){if(t==="complex64"){let n=Hg(r,e,"float32"),s=Hg(r,e,"float32");return Ec({inputs:{real:n,imag:s},backend:r})}let o=x.makeZerosTypedArray(x.sizeFromShape(e),t);return r.makeTensorInfo(e,t,o)}function mS(r){let{inputs:e,backend:t}=r,{x:o}=e;return t.incRef(o.dataId),{dataId:o.dataId,shape:o.shape,dtype:o.dtype}}function cM(r){let{inputs:e,backend:t}=r,{input:o}=e,n=t.data.get(o.dataId).complexTensorInfos.real,s=t.data.get(n.dataId).values;return t.makeTensorInfo(n.shape,n.dtype,s)}function fS(r,e,t,o){if(o==="int32"){let n=Int32Array.from(r);return[e,"int32",n]}if(o==="bool"){let n=x.toTypedArray([0],t),[s,a]=kt((i,p)=>i!==p?1:0)(e,[],r,n,"bool");return[a,"bool",s]}throw new Error(`Error in Cast: failed to cast ${t} to ${o}`)}function Yl(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{dtype:s}=o;if(s==="complex64"){if(n.dtype==="complex64")return mS({inputs:{x:n},backend:t});let c=Hg(t,n.shape,n.dtype),l=Yl({inputs:{x:n},backend:t,attrs:{dtype:"float32"}}),m=Ec({inputs:{real:l,imag:c},backend:t});return t.disposeIntermediateTensorInfo(c),t.disposeIntermediateTensorInfo(l),m}if(n.dtype==="complex64"){let c=cM({inputs:{input:n},backend:t}),l=Yl({inputs:{x:c},backend:t,attrs:{dtype:s}});return t.disposeIntermediateTensorInfo(c),l}if(!x.hasEncodingLoss(n.dtype,s)){let c=mS({inputs:{x:n},backend:t});return{dataId:c.dataId,shape:c.shape,dtype:s}}let a=t.data.get(n.dataId).values,[i,p,u]=fS(a,n.shape,n.dtype,s);return t.makeTensorInfo(i,p,u)}function Dt(r,e,t,o){return t==null?({inputs:n,backend:s})=>{let{a,b:i}=n,p=s;Xs([a,i],r);let u=p.data.get(a.dataId).values,c=p.data.get(i.dataId).values,l=a.dtype==="string"?I.fromUint8ToStringArray(u):u,m=a.dtype==="string"?I.fromUint8ToStringArray(c):c,f=o||a.dtype,[d,h]=e(a.shape,i.shape,l,m,f);return p.makeTensorInfo(h,f,d)}:({inputs:n,backend:s})=>{let{a,b:i}=n,p=s;if(a.dtype==="complex64"||i.dtype==="complex64"){let u=Yl({inputs:{x:a},backend:p,attrs:{dtype:"complex64"}}),c=p.data.get(u.dataId),l=c.complexTensorInfos.real,m=c.complexTensorInfos.imag,f=p.data.get(l.dataId).values,d=p.data.get(m.dataId).values,h=Yl({inputs:{x:i},backend:p,attrs:{dtype:"complex64"}}),g=p.data.get(h.dataId),y=g.complexTensorInfos.real,b=g.complexTensorInfos.imag,C=p.data.get(y.dataId).values,w=p.data.get(b.dataId).values,[k,_,E]=t(a.shape,i.shape,f,d,C,w),R=p.makeTensorInfo(E,"float32",k),A=p.makeTensorInfo(E,"float32",_),D=Ec({inputs:{real:R,imag:A},backend:p});return p.disposeIntermediateTensorInfo(u),p.disposeIntermediateTensorInfo(h),p.disposeIntermediateTensorInfo(R),p.disposeIntermediateTensorInfo(A),D}else{let u=p.data.get(a.dataId).values,c=p.data.get(i.dataId).values,l=o||a.dtype,[m,f]=e(a.shape,i.shape,u,c,l);return p.makeTensorInfo(f,l,m)}}}function $c(r){return(e,t,o,n,s,a)=>{let i=I.assertAndGetBroadcastShape(e,t),p=x.sizeFromShape(i),u=i.length,c=x.computeStrides(i),l=x.getTypedArrayFromDType("float32",p),m=x.getTypedArrayFromDType("float32",p),f=I.getBroadcastDims(e,i),d=I.getBroadcastDims(t,i),h=I.mergeRealAndImagArrays(o,n),g=I.mergeRealAndImagArrays(s,a),y=e.length,b=x.computeStrides(e),C=t.length,w=x.computeStrides(t);if(f.length+d.length===0)for(let k=0;kE[M]=0);let R=x.locToIndex(E,y,b),A=_.slice(-C);d.forEach(M=>A[M]=0);let D=x.locToIndex(A,C,w),O=r(h[R*2],h[R*2+1],g[D*2],g[D*2+1]);l[k]=O.real,m[k]=O.imag}return[l,m,i]}}var dS=kt((r,e)=>r+e),$re=$c((r,e,t,o)=>({real:r+t,imag:e+o})),LTt=Dt(_r,dS,$re);function lM(r,e,t,o,n){let s=x.sizeFromShape(o),a=x.makeZerosTypedArray(n,t);for(let i=0;i=n||(s>0?a[p]+=e[i]:a[p]+=1)}return a}function mM(r,e,t,o=!1){let n=r.shape[0],s=r.shape[1],a=ne([n,t],e.dtype);for(let i=0;i=t||(o?a.set(1,i,u):e.size>0?a.set(a.get(i,u)+e.get(i,p),i,u):a.set(a.get(i,u)+1,i,u))}return a}function Tr(r){return(e,t,o)=>{let n=x.getTypedArrayFromDType(t,e.length);for(let s=0;s{let{x:a}=o;if(Xs(a,r),a.dtype==="string"||t==="string")throw new Error("unaryKernelFunc does not support string input/output");let i=s,p=i.data.get(a.dataId).values,u=x.sizeFromShape(a.shape),c=t||a.dtype,l=x.getArrayFromDType(c,u);for(let m=0;m{let{x:a}=o;if(Xs(a,r),a.dtype==="string"||t==="string")throw new Error("unaryKernelFunc does not support string input/output");let i=s,p=i.data.get(a.dataId).values,u=t||a.dtype,c=e(p,u,n);return i.makeTensorInfo(a.shape,u,c)}}var hS=Tr(r=>Math.ceil(r)),YTt=Jo(ro,hS);function fM(r,e,t,o){let n=x.getArrayFromDType(t,x.sizeFromShape(e));if(o&&t!=="string"){let s=0;r.forEach(a=>{let i=x.sizeFromShape(a.shape);n.set(a.vals,s),s+=i})}else{let s=0;r.forEach(a=>{let i=t==="string"?I.fromUint8ToStringArray(a.vals):a.vals,p=0;for(let u=0;ur===e?1:0),oNt=Dt(oo,gS,null,"bool");var xS=Tr(r=>Math.exp(r)),uNt=Jo(no,xS,"float32");var yS=Tr(r=>Math.expm1(r)),fNt=Jo(wn,yS);var bS=Tr(r=>Math.floor(r)),yNt=Jo(so,bS);function dM(r,e,t,o,n,s,a,i,p){let u=ne([o,s],t);for(let c=0;c=p/s)throw new Error(`Invalid indices: ${l} does not index into ${i}`);for(let f=0;fr>e?1:0),NNt=Dt(ao,CS,null,"bool");var IS=kt((r,e)=>r>=e?1:0),ANt=Dt(io,IS,null,"bool");var wS=kt((r,e)=>rr<=e?1:0),WNt=Dt(co,SS,null,"bool");function gM(r,e,t){let o=(e-r)/(t-1),n=x.makeZerosTypedArray(t,"float32");n[0]=r;for(let s=1;sMath.log(r)),XNt=Jo(lo,vS);function xM(r,e,t,o){let n=x.getTypedArrayFromDType(o,x.sizeFromShape(t));for(let s=0;si)&&(i=u)}n[s]=i}return n}var kS=kt((r,e)=>Math.max(r,e)),r2t=Dt(mo,kS);var TS=kt((r,e)=>Math.min(r,e)),i2t=Dt(fo,TS);var Ql=kt((r,e)=>r*e),Rre=$c((r,e,t,o)=>({real:r*t-e*o,imag:r*o+e*t})),m2t=Dt(ho,Ql,Rre);function yM(r,e,t){let o=x.createScalarValue(-1,t);return Ql([],e,o,r,t)}var NS=kt((r,e)=>r!==e?1:0),I2t=Dt(go,NS,null,"bool");function _S(r,e,t,o,n){let s=e.length,a=x.sizeFromShape(e),i=x.computeStrides(e),p=x.computeStrides(n),u=x.getTypedArrayFromDType(t,x.sizeFromShape(n));for(let c=0;c{if(o<0||o>=t){let s=x.indexToLoc(n,e.length,x.computeStrides(e)).join(",");throw new Error(`indices[${s}] = ${o} is not in [0, ${t})`)}})}function Fre(r,e){for(let t=0;tn)throw new Error("Ragged splits must not point past values");for(let s=1;so[s])throw new Error("Ragged splits must be sorted in ascending order")}}function Dre(r,e,t,o){let n=[],s=0,a=e.length-1+t.length,i=new Array(a).fill(null).map(()=>[0]);Fre(t,o);let p=1;for(let u=0;u=0){let h=i[d],g=h[h.length-1]-f[c];for(let y=c;yn[a]=s)}return e}function CM(r,e){let t=r.slice(0,e);for(;t.lengtho&&(o=s)}return o}static getMaxWidthValueRowID(e){let t=e.length;if(t===0)return 0;let o=0,n=e[0],s=0;for(let a=1;a"Final length of result must be equal to firstDimension."),s}calculateOutputIndexRowSplit(e,t,o,n){let s=e.length,a=[];for(let i=0;i0&&a.length!==e[s-1])throw new Error("Invalid row split size.");return a}calculateOutputIndexValueRowID(e,t,o,n){let s=e.length,a=[];if(s===0)return[];let i=0,p=e[0];if(p>=t.length)throw new Error(`Got currentValueRowId=${p}, which is not less than ${t.length}`);let u=t[p];a.push(u);for(let c=1;c=0&&(++i,i=t.length)throw new Error(`Got nextValueRowId=${l} which is not less than ${t.length}`);u=t[l]}a.push(u)}if(a.length!==e.length)throw new Error("Invalid row ids.");return a}calculateOutputIndex(e,t,o,n){let s=this.getRowPartitionTensor(e),a=this.getRowPartitionTypeByDimension(e);switch(a){case en.VALUE_ROWIDS:return this.calculateOutputIndexValueRowID(s,t,o,n);case en.ROW_SPLITS:if(s.length-1>t.length)throw new Error(`Row partition size is greater than output size: ${s.length-1} > ${t.length}`);return this.calculateOutputIndexRowSplit(s,t,o,n);default:throw new Error(`Unsupported partition type: ${en[a]}`)}}getFirstDimensionSize(){let e=this.rowPartitionValues[0];if(this.rowPartitionTypes.length===0)throw new Error("No row_partition_types given.");let t=this.rowPartitionTypes[0];switch(t){case en.FIRST_DIM_SIZE:return e[0];case en.VALUE_ROWIDS:throw new Error("Cannot handle VALUE_ROWIDS in first dimension.");case en.ROW_SPLITS:return this.rowPartitionValuesShapes[0][0]-1;default:throw new Error(`Cannot handle type ${en[t]}`)}}compute(){if(this.rowPartitionValues[0].length<=0)throw new Error("Invalid first partition input. Tensor requires at least one element.");let t=this.getFirstDimensionSize(),o=this.calculateOutputSize(t),n=new Array(this.raggedRank+1);n[n.length-1]=1;for(let p=n.length-2;p>=0;--p)n[p]=n[p+1]*o[p+1];let s=SM(o,!1),a=x.getArrayFromDType(this.valuesDType,x.sizeFromShape(s));if(n[0]*o[0]>0){let p=this.calculateFirstParentOutputIndex(t,n[0],o[0]);for(let u=1;u<=this.raggedRank;++u)p=this.calculateOutputIndex(u-1,p,n[u],o[u]);this.setOutput(this.raggedRank,p,a,s)}return[s,a]}setOutput(e,t,o,n){if(o.length===0)return;let s=this.values,a=o,i=n.slice();i=i.slice(e+1);let p=x.sizeFromShape(i),u=t.length,c=this.defaultValue;if(c.length!==p&&c.length!==1){let d=this.defaultValueShape;Ne(()=>{let h=z(c,d);c=Ls(h,i).dataSync()})}let l=0,m=0,f=0;for(let d=0;d<=u;++d){let h=d=u){let g=o.length;h=Math.floor(g/p)}if(h>f)if(this.defaultValue.length===1)a.subarray(f*p,h*p).fill(this.defaultValue[0]),f=h;else for(;h>f;){let g=a.slice(f*p);wM(g,c,p),++f}h<0?(l=d+1,m=f):(l=d,m=f,f=m+1)}}};function wM(r,e,t){for(let o=0;o= 0`);if(o<-1)throw new Error(`Dimension ${o} must be >= -1`);o=-1}t.push(o)}return t}function vM(r,e,t,o,n,s,a,i,p,u){return new Rc(r,e,t,o,n,s,a,i,p,u).compute()}function kM(r,e,t,o){let n=r===e,s=r1;if(n||s||a)return x.makeZerosTypedArray(0,o);let i=Math.abs(Math.ceil((e-r)/t)),p=x.makeZerosTypedArray(i,o);e1/Math.sqrt(r)),U2t=Jo(xo,ES);function TM(r,e,t,o,n,s,a,i,p,u){let c=[o/n,n],l=r.values,m=e.values;if(o===0)return ne(t,e.dtype);let f=ne(c,e.dtype);typeof p=="string"||typeof p=="number"?f.values.fill(p):typeof p=="boolean"&&f.values.fill(+p);for(let d=0;d=o/n)throw new Error(`Invalid indices: ${h} does not index into ${t}`);for(let y=0;y1/(1+Math.exp(-r))),Y2t=qg(yo,r=>1/(1+Math.exp(-r)));function _M(r,e,t,o,n){let s=et.isSliceContinous(o,e,t),a=x.sizeFromShape(t),i=x.computeStrides(o);if(s){let l=et.computeFlatOffset(e,i);return n==="string"?r.slice(l,l+a):r.subarray(l,l+a)}let p=n==="string"?I.fromUint8ToStringArray(r):r,u=ne(o,n,p),c=ne(t,n);for(let l=0;ld+e[h]);c.set(u.get(...f),...m)}return n==="string"?I.fromStringArrayToUint8(c.values):c.values}function EM(r,e,t,o,n,s,a){let i=e[0],p=s[0],u=new Array(p),c=new Array(i),l=e[1];if(p===0){if(i!==0)throw new Error(I.getSparseFillEmptyRowsIndicesDenseShapeMismatch(i));let g=x.getArrayFromDType(t,0),y=x.getArrayFromDType(n,0);return[g,[0,l],y,u,c]}let m=!0,f=0,d=new Array(p).fill(0);for(let g=0;g=p)throw new Error(I.getSparseFillEmptyRowsOutOfRangeIndexErrorMessage(g,y,p));++d[y],m=m&&y>=f,f=y}let h=!0;for(let g=0;g0&&(d[g]+=d[g-1])}if(h&&m){let g=r,y=o;for(let b=0;b0){f[m-1]=1;for(let g=m-2;g>=0;--g)f[g]=f[g+1]*o[g+1]}let d=[];if(i>0){d[i-1]=1;for(let g=i-2;g>=0;--g)d[g]=d[g+1]*p[g+1]}let h=x.getArrayFromDType(t,a*i);for(let g=0;g0?n[i-1]+1:0;if(l<0)throw new Error(I.getSparseSegmentReductionNegativeSegmentIdsErrorMessage());let m=e.slice();m[0]=l;let f=m.reduce((C,w)=>C*w,1),d=x.getArrayFromDType(t,f);if(i===0)return l>0&&d.fill(a),[d,m];if(l<=0)throw new Error(I.getSparseSegmentReductionNegativeSegmentIdsErrorMessage());let h=0,g=1,y=0,b=n[h];for(;;){let C=0;if(g=C)throw new Error(I.getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage())}if(b<0||b>=l)throw new Error(I.getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage(b,l));b>y&&d.fill(a,y*u,b*u);for(let w=h;w=p[0])throw new Error(I.getSparseSegmentReductionIndicesOutOfRangeErrorMessage(w,o[w],p[0]));for(let _=0;_i)break}return yMath.sqrt(r)),c_t=qg(bo,r=>Math.sqrt(r));var $S=kt((r,e)=>{let t=r-e;return t*t}),h_t=Dt(Co,$S);function FM(r,e,t,o){let n=ne(r,e.dtype);for(let s=0;s0?0:i-p),f=0;f+=u*this.leftPad.length;for(let b=0;bb.forEach(C=>h[g++]=C);for(let b=0;b0){y(e[m+l-1]);for(let b=0;b0){let p=t[0];if(p!==0)throw new Error(`First split value must be 0, got ${p}`);for(let u=1;u=p;if(c=c&&t[u]<=o,!c)throw new Error(`Invalid split value ${t[u]}, must be in [${p}, ${o}]`);p=t[u]}if(p!==o)throw new Error(`Last split value must be data size. Expected ${o}, got ${p}`)}let s=n-1,a=x.getArrayFromDType("int32",n);if(o===0||n===0){let p=new Array(o);for(let u=0;u<=s;++u)a[u]=0;return[p,a]}a[0]=0;for(let p=1;p<=s;++p){let u=t[p]-t[p-1],c=0;this.nGramWidths.forEach(l=>{c+=this.getNumNGrams(u,l)}),this.preserveShort&&u>0&&c===0&&(c=1),a[p]=a[p-1]+c}let i=new Array(a[s]);for(let p=0;p{let m=t[p+1]-t[p],f=this.getNumNGrams(m,l);this.createNGrams(e,u,i,c,f,l),c+=f}),this.preserveShort&&c===a[p]){let l=t[p+1]-t[p];if(l===0)continue;let m=l+2*this.padWidth,f=1;this.createNGrams(e,u,i,c,f,m)}}return[i,a]}};function DM(r,e,t,o,n,s,a,i){return new RS(t,o,n,s,a,i).compute(r,e)}function Lre(r,e,t,o){if(!r.length)return;if(e.length===0){for(let s=0;sr-e),Bre=$c((r,e,t,o)=>({real:r-t,imag:e-o})),__t=Dt(Io,AS,Bre);function MM(r,e){let t=new Array(r.rank);for(let n=0;n{let t=e.value-r.value;return t===0?r.index-e.index:t};function LM(r,e,t=0,o=r.length-1){for(;o>t;){if(o-t>600){let i=o-t+1,p=e-t+1,u=Math.log(i),c=.5*Math.exp(2*u/3),l=.5*Math.sqrt(u*c*(i-c)/i)*Math.sign(p-i/2),m=Math.max(t,Math.floor(e-p*c/i+l)),f=Math.min(o,Math.floor(e+(i-p)*c/i+l));LM(r,e,m,f)}let n=r[e],s=t,a=o;for(x.swap(r,t,e),Zl(r[o],n)>0&&x.swap(r,t,o);s0;)a=a-1}Zl(r[t],n)===0?x.swap(r,t,a):(a=a+1,x.swap(r,a,o)),a<=e&&(t=a+1),e<=a&&(o=a-1)}}function BM(r,e,t,o,n){let s=e[e.length-1],[a,i]=[r.length/s,s],p=x.getTypedArrayFromDType(t,a*o),u=x.getTypedArrayFromDType("int32",a*o);for(let l=0;ld[C]={value:b,index:C}),o{for(let g=0;g`T${o}`),this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize,[this.workPerThread,1,1]),this.shaderKey="addN"}getUserCode(){let e=[];this.variableNames.forEach(n=>{e.push(`let v${n} = get${n}ByOutputCoords(coords);`)});let t=this.variableNames.map(n=>`v${n}`).join(" + ");return` + ${ue("index")} { + for (var i = 0; i < ${this.workPerThread}; i = i + 1) { + let flatIndex = index * ${this.workPerThread} + i; + if (flatIndex < uniforms.size) { + let coords = getCoordsFromIndex(flatIndex); + ${e.join(` + `)} + setOutputAtIndex(flatIndex, ${t}); + } + } + } + `}};function Wre(r){let{inputs:e,backend:t}=r,o=e;if(o.length===1)return Lt({inputs:{x:o[0]},backend:t});let n=o.map(i=>i.dtype).reduce((i,p)=>ct(i,p)),s=o.map(i=>i.shape),a=new Kg(s);return t.runWebGPUProgram(a,o,n)}var wL={kernelName:an,backendName:"webgpu",kernelFunc:Wre};var Ac=class{constructor(e,t,o){this.workGroupSize=[64,1,1],this.variableNames=["x"],this.uniforms="infinityValue : f32,",this.size=!0;let n=[t];this.op=o==="min"?"<":">";let[s,a]=I.computeOutAndReduceShapes(e,n);this.outputShape=s.length===0?[1]:s,this.dispatchLayout=fe(this.outputShape),x.sizeFromShape(a)<32||x.sizeFromShape(s)>1e3?(this.type="plain",this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize)):(this.type="shared",this.dispatch=ae(this.dispatchLayout,this.outputShape,[1,1,1])),this.inputShape=e,this.shaderKey=`argMinMax_${this.op}_${this.type}`}getUserCode(){let e=()=>this.inputShape.length===1?"uniforms.xShape":`uniforms.xShape.${Yo(this.inputShape.length-1)}`,t=()=>{let o="";if(this.outputShape.length===1)this.inputShape.length!==1&&(o+="outputCoords,");else for(let n=0;n u32 { + return ((a - 1u) / b + 1u); + } + + ${` + var xBestIndices : array; + var xBestValues : array; + `} + + ${ue("index")} { + let outputIndex = index / i32(workGroupSizeX); + let reduceLength = ${e()}; + + var bestIndex = i32(localId.x); + var bestValue = uniforms.infinityValue; + let outputCoords = getCoordsFromIndex(outputIndex); + for (var k = i32(localId.x); k < reduceLength && outputIndex < uniforms.size; + k = k + i32(workGroupSizeX)) { + let candidate = getX(${t()} k); + if (!isnan(candidate) && candidate ${this.op} bestValue) { + bestValue = candidate; + bestIndex = k; + } + } + xBestValues[localId.x] = bestValue; + xBestIndices[localId.x] = bestIndex; + workgroupBarrier(); + + var reduceSize = min(u32(reduceLength), workGroupSizeX); + for (var currentSize = reduceSize / 2u; reduceSize > 1u; + currentSize = reduceSize / 2u) { + let interval = DIV_CEIL(reduceSize, 2u); + if (localId.x < currentSize) { + let candidate = xBestValues[localId.x + interval]; + if (candidate ${this.op} bestValue) { + bestValue = candidate; + xBestValues[localId.x] = bestValue; + xBestIndices[localId.x] = xBestIndices[localId.x + interval]; + } + } + reduceSize = interval; + workgroupBarrier(); + } + + if (localId.x == 0u && outputIndex < uniforms.size) { + setOutputAtIndexI32(outputIndex, xBestIndices[localId.x]); + } + } + `:` + ${ue("index")} { + if (index < uniforms.size) { + let outputCoords = getCoordsFromIndex(index); + var bestIndex = 0; + var bestValue = getX(${t()} 0); + let reduceLength = ${e()}; + for (var i = 1; i < reduceLength; i++) { + let candidate = getX(${t()} i); + if (candidate ${this.op} bestValue) { + bestValue = candidate; + bestIndex = i; + } + } + setOutputAtIndexI32(index, bestIndex); + } + } + `}};var jg=class{constructor(e,t){this.variableNames=["A"],this.workGroupSize=[16,16,1];let o=new Array(e.length);for(let n=0;n tile : array, ${this.workGroupSize[0]}>; + ${Ri()} + fn _start(@builtin(local_invocation_id) localId : vec3, + @builtin(workgroup_id) workgroupId : vec3) { + var x = i32(workgroupId.x) * TILE_DIM + i32(localId.x); + var y = i32(workgroupId.y) * TILE_DIM + i32(localId.y); + let width = uniforms.outShape[0]; + let height = uniforms.outShape[1]; + if (x < width && y < height) { + tile[localId.y][localId.x] = A[y * width + x]; + } + workgroupBarrier(); + + x = i32(workgroupId.y) * TILE_DIM + i32(localId.x); + y = i32(workgroupId.x) * TILE_DIM + i32(localId.y); + if (x < height && y < width) { + setOutputAtIndex((y * height + x), tile[localId.x] + [localId.y]); + } + } + `}};var Xg=class{constructor(e,t){this.variableNames=["A"],this.workPerThread=1,this.workGroupSize=[64,1,1],this.size=!0;let o=new Array(e.length);for(let n=0;n6)throw Error(`Transpose for rank ${e} is not yet supported`);let t=new Array(e);for(let o=0;ot.disposeData(f.dataId)),m}var vL={kernelName:un,backendName:"webgpu",kernelFunc:Gre};function Hre(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s}=o,a=x.parseAxisParam(s,n.shape),i=I.getAxesPermutation(a,n.shape.length),p=n,u=[];i!=null&&(p=Nr({inputs:{x:n},backend:t,attrs:{perm:i}}),u.push(p),a=I.getInnerMostAxes(a.length,p.shape.length)),I.assertAxesAreInnerMostDims("argMin",[a[0]],p.shape.length);let c=new Ac(p.shape,a[0],"min"),l=[{type:"float32",data:[Number.POSITIVE_INFINITY]}],m=t.runWebGPUProgram(c,[p],"int32",l);return u.forEach(f=>t.disposeData(f.dataId)),m}var kL={kernelName:ja,backendName:"webgpu",kernelFunc:Hre};var qre=it({opType:ye.ATAN2}),TL={kernelName:sa,backendName:"webgpu",kernelFunc:qre};var Jl=class{constructor(e,t){this.variableNames=["x"],this.uniforms="stride : vec2, pad : vec2, dilation : vec2, convDims : vec2, filterDims : vec2,",this.workGroupSize=[128,1,1],this.size=!0,this.outputShape=e.outShape,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey=`pool2D_${t}`,this.poolType=t}getUserCode(){let e="resultValue = max(value, resultValue);";this.poolType==="avg"&&(e="resultValue = resultValue + value; count = count + 1.0;");let t="resultValue";return this.poolType==="avg"&&(t="resultValue / count"),` + ${ue("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + let batch = coords[0]; + let xRCCorner = vec2(coords.yz) * uniforms.stride - uniforms.pad; + let xRCorner = xRCCorner.x; + let xCCorner = xRCCorner.y; + + var resultValue = ${this.poolType==="avg"?"0.0":"-1.0 / pow(10.0, -20.0)"}; + var count = 0.0; + + for (var wR = 0; wR < uniforms.filterDims.x; wR = wR + uniforms.dilation.x) { + let xR = xRCorner + wR; + + if (xR < 0 || xR >= uniforms.convDims.x) { + continue; + } + + for (var wC = 0; wC < uniforms.filterDims.y; wC = wC + uniforms.dilation.y) { + let xC = xCCorner + wC; + if (xC < 0 || xC >= uniforms.convDims.y) { + continue; + } + + let value = getX(batch, xR, xC, coords[3]); + ${e} + } + } + + setOutputAtIndex(index, ${t}); + } + } + `}};var Yg=class{constructor(e){this.variableNames=["x"],this.uniforms="stride : vec2,",this.workGroupSize=[256,1,1],this.size=!0,this.outputShape=e.outShape,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey="poolWithFilterSizeEqualsOne"}getUserCode(){return` + ${ue("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + let batch = coords[0]; + let d = coords[3]; + + let xRCCorner = coords.yz * uniforms.stride; + let xRCorner = xRCCorner.x; + let xCCorner = xRCCorner.y; + + let value = getX(batch, xRCorner, xCCorner, d); + setOutputAtIndex(index, value); + } + } + `}};var Qg=class{constructor(e,t){this.workGroupSize=[64,1,1],this.variableNames=["x"],this.uniforms="reduceSize : i32,",this.size=!0,this.inputShape=[e.batchSize,e.inSize];let[o]=I.computeOutAndReduceShapes(this.inputShape,[1]);this.outputShape=o.length===0?[1]:o,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,[1,1,1]),this.reduceType=t,this.shaderKey=`reduce_${t}`}getUserCode(){let e="",t="0.0";this.reduceType==="min"||this.reduceType==="max"?(e=` + if (isnan(candidate)) { + bestValue = uniforms.NAN; + } else if (!isnan(bestValue) && candidate ${this.reduceType==="min"?"<":">"} bestValue) + { bestValue = candidate; }`,t="f32(x[offset])"):this.reduceType==="sum"||this.reduceType==="mean"?e=" bestValue = bestValue + candidate; ":this.reduceType==="prod"&&(e=" bestValue = bestValue * candidate; ",t="1.0");let o=this.reduceType==="mean"?"setOutputAtIndex(outputIndex, bestValue / f32(uniforms.reduceSize));":"setOutputAtIndex(outputIndex, bestValue);";return` + fn DIV_CEIL(a : u32, b : u32) -> u32 { + return ((a - 1u) / b + 1u); + } + + ${` + var xBestValues : array; + `} + fn getOffset(outputIndex : i32) -> i32 { + let outputCoords = getCoordsFromIndex(outputIndex); + let offset = ${this.outputShape.length===1?"outputCoords":"outputCoords[0]"} * uniforms.reduceSize; + return offset; + } + ${ue("index")} { + let outputIndex = index / i32(workGroupSizeX); + let offset = getOffset(outputIndex); + var bestValue = ${t}; + let Length = uniforms.reduceSize; + let WorkPerThread = DIV_CEIL(u32(Length), workGroupSizeX); + for (var k = i32(localId.x); k < Length && outputIndex < uniforms.size; + k = k + i32(workGroupSizeX)) { + let candidate = f32(x[offset + k]); + ${e} + } + xBestValues[localId.x] = bestValue; + workgroupBarrier(); + + var reduceSize = min(u32(Length), workGroupSizeX); + for (var currentSize = reduceSize / 2u; reduceSize > 1u; + currentSize = reduceSize / 2u) { + let interval = DIV_CEIL(reduceSize, 2u); + if (localId.x < currentSize) { + let candidate = xBestValues[localId.x + interval]; + ${e} + xBestValues[localId.x] = bestValue; + } + reduceSize = interval; + workgroupBarrier(); + } + + if (localId.x == 0u && outputIndex < uniforms.size) { + ${o} + } + } + `}};function Ys(r,e,t,o,n){let s=r.shape.length,a=[],i=x.parseAxisParam(e,r.shape),p=i,u=I.getAxesPermutation(p,s),c=r;u!=null&&(c=Nr({inputs:{x:r},attrs:{perm:u},backend:n}),p=I.getInnerMostAxes(p.length,s),a.push(c)),I.assertAxesAreInnerMostDims(o,p,s);let[l,m]=I.computeOutAndReduceShapes(c.shape,p),f=l;t&&(f=I.expandShapeToKeepDim(l,i));let d;if((o==="max"||o==="prod")&&n.shouldExecuteOnCPU([c])){let h=n.tensorMap.get(c.dataId).values;switch(o){case"max":let g=rL(h,x.sizeFromShape(m),f,r.dtype);d=n.makeTensorInfo(f,r.dtype,g);break;case"prod":let{outVals:y,outShape:b,outDtype:C}=uL(c.shape,c.dtype,h,p);d=n.makeTensorInfo(b,C,y);break;default:throw new Error(`${o} CPU implementation is not yet supported.`)}}else{let h=x.sizeFromShape(m),y=x.sizeFromShape(c.shape)/h,b={windowSize:h,inSize:h,batchSize:y,outSize:1},C=o==="mean"?"float32":Ca(r.dtype),w=[{type:"int32",data:[h]}],k=new Qg(b,o),_=n.runWebGPUProgram(k,[c],C,w);a.push(_),d=xe({inputs:{x:_},attrs:{shape:f},backend:n})}return a.forEach(h=>n.disposeData(h.dataId)),d}function em(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{reductionIndices:s,keepDims:a}=o;return Ys(n,s,a,"max",t)}var NL={kernelName:$n,backendName:"webgpu",kernelFunc:em};function DS(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{keepDims:s,axis:a}=o;return Ys(n,a,s,"mean",t)}var _L={kernelName:An,backendName:"webgpu",kernelFunc:DS};function Zg(r,e,t,o){if(e.filterWidth===1&&e.filterHeight===1&&x.arraysEqual(e.inShape,e.outShape))return Lt({inputs:{x:r},backend:o});if(e.filterWidth===e.inWidth&&e.filterHeight===e.inHeight&&e.batchSize===1&&e.padInfo.type==="VALID"){let a=r.shape.length,i=xe({inputs:{x:r},backend:o,attrs:{shape:[r.shape[a-3]*r.shape[a-2],r.shape[a-1]]}}),p;t==="avg"?p=DS({inputs:{x:i},backend:o,attrs:{axis:0,keepDims:!1}}):(x.assert(t==="max",()=>`Invalid pool type ${t}`),p=em({inputs:{x:i},backend:o,attrs:{reductionIndices:0,keepDims:!1}}));let u=xe({inputs:{x:p},backend:o,attrs:{shape:e.outShape}});return o.disposeData(i.dataId),o.disposeData(p.dataId),u}let n,s=[{type:"int32",data:[e.strideHeight,e.strideWidth]}];return e.filterHeight===1&&e.filterWidth===1?n=new Yg(e):(t==="avg"?n=new Jl(e,"avg"):(x.assert(t==="max",()=>`Invalid pool type ${t}`),n=new Jl(e,"max")),s.push({type:"int32",data:[e.padInfo.top,e.padInfo.left]},{type:"int32",data:[e.dilationHeight,e.dilationWidth]},{type:"int32",data:[e.inHeight,e.inWidth]},{type:"int32",data:[e.effectiveFilterHeight,e.effectiveFilterWidth]})),o.runWebGPUProgram(n,[r],r.dtype,s)}function Kre(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{filterSize:s,strides:a,pad:i,dimRoundingMode:p}=o,u=1,c=I.computePool2DInfo(n.shape,s,a,u,i,p);return Zg(n,c,"avg",t)}var EL={kernelName:pn,backendName:"webgpu",kernelFunc:Kre};function jre(r){let{inputs:e,backend:t,attrs:o}=r,{a:n,b:s}=e,{transposeA:a,transposeB:i}=o;return _c({a:n,b:s,transposeA:a,transposeB:i,backend:t})}var $L={kernelName:cn,backendName:"webgpu",kernelFunc:jre};var Jg=class{constructor(e,t){this.variableNames=["source"],this.workPerThread=1,this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=t,this.rank=t.length,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize,[this.workPerThread,1,1]),this.start=e,this.uniforms=`start : ${At(e.length)}, `,this.shaderKey="slice"}getUserCode(){let e=At(this.rank),t=Xre(this.rank),o;return this.start.length===1?o=this.outputShape.map((s,a)=>"sourceLoc = uniforms.start + coords;"):o=this.outputShape.map((s,a)=>`sourceLoc.${PS[a]} = uniforms.start.${Yo(a)} + coords.${PS[a]};`),` + ${ue("index")} { + if (index < uniforms.size) { + var sourceLoc : ${e}; + let coords = getCoordsFromIndex(index); + ${o.join(` +`)} + setOutputAtIndex(index, getSource(${t})); + } + } + `}},PS=["x","y","z","w","u","v"];function Xre(r){if(r===1)return"sourceLoc";if(r<=6)return PS.slice(0,r).map(e=>`sourceLoc.${e}`).join(",");throw Error(`Slicing for rank ${r} is not yet supported`)}function ms(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{begin:s,size:a}=o,[i,p]=et.parseSliceParams(n,s,a);if(et.assertParamsValid(n,i,p),t.shouldExecuteOnCPU([n])||n.dtype==="string"){let l=t.tensorMap.get(n.dataId),m=fL(l.values,i,p,n.shape,n.dtype);return t.makeTensorInfo(p,n.dtype,m)}if(x.sizeFromShape(p)===0)return t.makeTensorInfo(p,n.dtype,[]);let u=new Jg(i,p),c=[{type:"int32",data:i}];return t.runWebGPUProgram(u,[n],n.dtype,c)}var RL={kernelName:qn,backendName:"webgpu",kernelFunc:ms};var Yre=r=>{let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{blockShape:s,crops:a}=o;x.assert(n.shape.length<=4,()=>"batchToSpaceND for rank > 4 with a WebGPU backend not implemented yet");let i=s.reduce((b,C)=>b*C),p=I.getReshaped(n.shape,s,i),u=I.getPermuted(p.length,s.length),c=I.getReshapedPermuted(n.shape,s,i),l=I.getSliceBeginCoords(a,s.length),m=I.getSliceSize(c,a,s.length),f=[],d=xe({inputs:{x:n},backend:t,attrs:{shape:p}}),h=Nr({inputs:{x:d},backend:t,attrs:{perm:u}}),g=xe({inputs:{x:h},backend:t,attrs:{shape:c}}),y=ms({inputs:{x:g},backend:t,attrs:{begin:l,size:m}});return f.push(d),f.push(h),f.push(g),f.forEach(b=>t.disposeData(b.dataId)),y},AL={kernelName:hs,backendName:"webgpu",kernelFunc:Yre};var OS=it({opType:ye.NOT_EQUAL,dtype:"bool",cpuKernelImpl:iL}),FL={kernelName:go,backendName:"webgpu",kernelFunc:OS};function Wa(r){let{inputs:e,backend:t}=r,{input:o}=e,n=t.tensorMap.get(o.dataId);return Lt({inputs:{x:n.complexTensorInfos.real},backend:t})}var DL={kernelName:la,backendName:"webgpu",kernelFunc:Wa};function PL(r,e){let t=new Zo(r.shape,pe.TO_INT),o=e.runWebGPUProgram(t,[r],"int32");return{dataId:o.dataId,shape:o.shape,dtype:o.dtype}}function MS(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{dtype:s}=o;if(s==="complex64"){if(n.dtype==="complex64")return Lt({inputs:{x:n},backend:t});let a=Wr(n.shape),i=MS({inputs:{x:n},backend:t,attrs:{dtype:"float32"}}),p=ls({inputs:{real:i,imag:a},backend:t});return a.dispose(),t.disposeData(i.dataId),p}if(n.dtype==="complex64"){let a=Wa({inputs:{input:n},backend:t}),i=MS({inputs:{x:a},backend:t,attrs:{dtype:s}});return t.disposeData(a.dataId),i}if(!x.hasEncodingLoss(n.dtype,s)){let a=Lt({inputs:{x:n},backend:t});return{dataId:a.dataId,shape:a.shape,dtype:s}}if(t.shouldExecuteOnCPU([n])){let a=t.tensorMap.get(n.dataId).values,[i,p,u]=WM(a,n.shape,n.dtype,s);return t.makeTensorInfo(i,p,u)}if(s==="int32")return PL(n,t);if(s==="bool"){let a=t.makeTensorInfo([],"bool",x.getTypedArrayFromDType("bool",1)),p=OS({inputs:{a:n,b:a},backend:t});return t.disposeData(a.dataId),p}throw new Error(`Error in Cast: failed to cast ${n.dtype} to ${s}`)}var OL={kernelName:to,backendName:"webgpu",kernelFunc:MS};var Qre=Ge({opType:pe.CEIL,cpuKernelImpl:UM}),ML={kernelName:ro,backendName:"webgpu",kernelFunc:Qre};var ex=class{constructor(e){this.variableNames=["A"],this.uniforms="minVal : f32, maxVal : f32,",this.workPerThread=4,this.workGroupSize=[64,1,1],this.isVec4=!0,this.size=!0,this.outputShape=e,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize,[this.workPerThread,1,1]),this.shaderKey="clipVec4"}getUserCode(){return` + ${ue("index")} { + if(index < uniforms.size) { + let value = getAByOutputIndex(index); + var clampedValue : vec4; + for (var i = 0; i < 4; i = i + 1) { + if (isnan(value[i])) { + clampedValue[i] = value[i]; + } else { + clampedValue[i] = clamp(value[i], uniforms.minVal, uniforms.maxVal); + } + } + + setOutputAtIndex(index, clampedValue); + } + } + `}};var tx=class{constructor(e){this.variableNames=["A"],this.uniforms="minVal : f32, maxVal : f32,",this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=e,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey="clip"}getUserCode(){return` + ${ue("index")} { + if(index < uniforms.size) { + let value = getAByOutputIndex(index); + if (isnan(value)) { + setOutputAtIndex(index, value); + return; + } + setOutputAtIndex(index, clamp(value, uniforms.minVal, uniforms.maxVal)); + } + } + `}};function Zre(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{clipValueMin:s,clipValueMax:a}=o,i,p=[{type:"float32",data:[s]},{type:"float32",data:[a]}];return x.sizeFromShape(n.shape)%4===0?i=new ex(n.shape):i=new tx(n.shape),t.runWebGPUProgram(i,[n],n.dtype,p)}var LL={kernelName:Ro,backendName:"webgpu",kernelFunc:Zre};var rx=class{constructor(e){this.uniforms="",this.workPerThread=1,this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=I.computeOutShape(e,1),this.variableNames=e.map((t,o)=>`T${o}`),this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize,[this.workPerThread,1,1]),this.offsetLength=e.length-1;for(let t=0;t0){e.push("if (yC < uniforms.offset0){ setOutputAtCoords(coords.x, coords.y, getT0(yR, yC)); }");for(let s=1;sWa({inputs:{input:C},backend:t})),h=r.map(C=>qu({inputs:{input:C},backend:t})),g=Fc(d,e,t),y=Fc(h,e,t),b=ls({inputs:{real:g,imag:y},backend:t});return d.forEach(C=>t.disposeData(C.dataId)),h.forEach(C=>t.disposeData(C.dataId)),t.disposeData(g.dataId),t.disposeData(y.dataId),b}let n=t.shouldExecuteOnCPU(r);if(o==="string"&&(n=!0),n){let d=r.map(k=>{let E=[-1,x.sizeFromShape(k.shape.slice(e))];return xe({inputs:{x:k},backend:t,attrs:{shape:E}})}),h=d.map(k=>({vals:t.readSync(k.dataId),shape:k.shape})),g=I.computeOutShape(d.map(k=>k.shape),1),y=d[0].shape[0]===1,b=GM(h,g,o,y),C=I.computeOutShape(r.map(k=>k.shape),e),w=t.makeTensorInfo(C,o,b);return d.forEach(k=>t.disposeData(k.dataId)),w}let s=t.device.limits.maxStorageBuffersPerShaderStage-1;if(r.length>s){let d=[];for(let g=0;gd.shape),u=new rx(p),c=[],l=new Array(p.length-1);if(l.length>0){l[0]=p[0][1],c.push({type:"int32",data:[l[0]]});for(let d=1;dt.disposeData(d.dataId));let f=xe({inputs:{x:m},backend:t,attrs:{shape:i}});return t.disposeData(m.dataId),f}function Jre(r,e,t){let o=I.computeOutShape(r.map(s=>s.shape),e);return{tensors2D:r.map(s=>xe({inputs:{x:s},backend:t,attrs:{shape:[x.sizeFromShape(s.shape.slice(0,e)),x.sizeFromShape(s.shape.slice(e))]}})),outShape:o}}function LS(r){let{inputs:e,backend:t,attrs:o}=r,{axis:n}=o,s=x.parseAxisParam(n,e[0].shape)[0],a=e.map(u=>u.shape);I.assertParamsConsistent(a,s);let i=I.computeOutShape(e.map(u=>u.shape),s);if(x.sizeFromShape(i)===0)return t.makeTensorInfo(i,e[0].dtype,[]);let p=e.filter(u=>x.sizeFromShape(u.shape)>0);return p.length===1?Lt({inputs:{x:p[0]},backend:t}):Fc(p,s,t)}var VL={kernelName:gs,backendName:"webgpu",kernelFunc:LS};function eoe(r,e,t,o,n=!1,s=null,a=!1,i=4,p=4,u=4){let c=A=>{switch(A){case 1:return"resData = x[xIndex];";case 3:return"resData = vec3(x[xIndex], x[xIndex + 1], x[xIndex + 2]);";case 4:return"resData = x[xIndex / 4];";default:throw new Error(`innerElementSize ${A} is not supported.`)}},l=A=>{switch(A){case 1:return"return W[row * uniforms.wShape[3] + colIn];";case 4:return"return W[row * uniforms.wShape[3] / 4 + colIn];";default:throw new Error(`innerElementSize ${A} is not supported.`)}},m=r?` + let coord = vec4(batch, xRow, xCol, xCh); + `:` + let coord = vec4(batch, xCh, xRow, xCol); + `,f=r?` + let coords = vec4( + batch, + row / outWidth, + row % outWidth, + col); + `:` + let coords = vec4( + batch, + row, + col / outWidth, + col % outWidth); + `,d=r?"uniforms.xShape[1]":"uniforms.xShape[2]",h=r?"uniforms.xShape[2]":"uniforms.xShape[3]",g=r?"row":"col",y=r?"col":"row",b=` + let inChannels = uniforms.wShape[2]; + let outWidth = ${r?"uniforms.outShape[2]":"uniforms.outShape[3]"}; + let outRow = ${g} / outWidth; + let outCol = ${g} % outWidth; + + let WRow = ${y} / (uniforms.filterDims[1] * inChannels); + let WCol = ${y} / inChannels % uniforms.filterDims[1]; + let xRow = outRow * uniforms.stride[0] + uniforms.dilation[0] * WRow - uniforms.pad[0]; + let xCol = outCol * uniforms.stride[1] + uniforms.dilation[1] * WCol - uniforms.pad[1]; + let xCh = ${y} % inChannels; + var resData = ${vt(i)}(0.0); + // The bounds checking is always needed since we use it to pad zero for + // the 'same' padding type. + if (xRow >= 0 && xRow < ${d} && xCol >= 0 && xCol < ${h}) { + ${m} + let xIndex = getIndexFromCoords4D(coord, uniforms.xShape); + ${c(i)} + } + return resData;`,C=r?e&&o?` + let col = colIn * ${i}; + ${b}`:` + let col = colIn * ${i}; + if (row < uniforms.dimAOuter && col < uniforms.dimInner) { + ${b} + } + return ${vt(i)}(0.0);`:o&&t?` + let col = colIn * ${i}; + ${b}`:` + let col = colIn * ${i}; + if (row < uniforms.dimInner && col < uniforms.dimBOuter) { + ${b} + } + return ${vt(i)}(0.0);`,w=`${l(p)}`,k=vt(u),_=r?vt(i):vt(p),E=r?vt(p):vt(i);return` + ${ur(s,a,u===4,4)} + fn mm_readA(batch: i32, row : i32, colIn : i32) -> ${_} { + ${r?C:w} + } + + fn mm_readB(batch: i32, row : i32, colIn : i32) -> ${E} { + ${r?w:C} + } + + fn mm_write(batch: i32, row : i32, colIn : i32, valueIn : ${k}) { + let col = colIn * ${u}; + if (row < uniforms.dimAOuter && col < uniforms.dimBOuter) + { + var value = valueIn; + let outWidth = ${r?"uniforms.outShape[2]":"uniforms.outShape[3]"}; + ${f} + ${Kr(n,s)} + setOutputAtCoords(coords[0], coords[1], coords[2], coords[3], value); + } + }`}var ox=class{constructor(e,t,o,n,s=!1,a=null,i=!1,p=!1){this.variableNames=["x","W"],this.uniforms="filterDims : vec2, pad : vec2, stride : vec2, dilation : vec2, dimAOuter : i32, dimBOuter : i32, dimInner : i32,",this.outputShape=e.outShape,this.isChannelsLast=e.dataFormat==="channelsLast",this.isVec4=((e.inChannels%4===0||e.inChannels%3===0)&&this.isChannelsLast||e.outWidth%4===0&&!this.isChannelsLast)&&e.outChannels%4===0,this.dispatchLayout=this.isChannelsLast?{x:[3],y:[1,2],z:[0]}:{x:[2,3],y:[1],z:[0]},this.workGroupSize=Hl(this.dispatchLayout,this.outputShape,this.isVec4),this.elementsPerThread=ql(this.dispatchLayout,this.outputShape,this.isVec4),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize,this.elementsPerThread),this.isVec4?(this.isChannelsLast&&e.inChannels%4!==0?(this.innerElementSize=3,this.variableTypes=["f32","vec4"]):(this.innerElementSize=4,this.variableTypes=["vec4","vec4"]),s&&(this.variableNames.push("bias"),this.variableTypes.push("vec4")),i&&(this.variableNames.push("preluActivationWeights"),this.variableTypes.push("vec4"))):(this.innerElementSize=this.elementsPerThread[0],s&&this.variableNames.push("bias"),i&&this.variableNames.push("preluActivationWeights")),this.sequentialAccessByThreads=p,this.addBias=s,this.activation=a,this.hasPreluActivationWeights=i,this.tileAOuter=this.workGroupSize[1]*this.elementsPerThread[1],this.tileBOuter=this.workGroupSize[0]*this.elementsPerThread[0],this.tileInner=Math.max(this.workGroupSize[0]*this.innerElementSize,this.workGroupSize[1]),this.fitAOuter=t%this.tileAOuter===0,this.fitBOuter=o%this.tileBOuter===0,this.fitInner=n%this.tileInner===0,this.shaderKey=`conv2DMM_${this.elementsPerThread}_${this.activation}}_${this.fitAOuter}_${this.fitBOuter}_${this.fitInner}_${this.isVec4}_${this.innerElementSize}_${this.isChannelsLast}_${this.sequentialAccessByThreads}`}getUserCode(){let e=this.isVec4?Uu(this.elementsPerThread,this.workGroupSize,!this.isChannelsLast,this.tileInner):Gu(this.elementsPerThread,this.workGroupSize,!this.isChannelsLast,this.tileInner,!1,null,this.sequentialAccessByThreads),t=this.isVec4?[this.innerElementSize,4,4]:[1,1,1];return` + ${eoe(this.isChannelsLast,this.fitAOuter,this.fitBOuter,this.fitInner,this.addBias,this.activation,this.hasPreluActivationWeights,t[0],t[1],t[2])} + ${e} + `}};var nx=class{constructor(e,t=!1,o=null,n=!1){this.variableNames=["x","W"],this.uniforms="filterDims: vec2, pad: vec2, stride: vec2, dilation: vec2,",this.workGroupSize=[4,4,8],this.outputShape=e.outShape,this.isChannelsLast=e.dataFormat==="channelsLast",this.dispatchLayout=this.isChannelsLast?{x:[2],y:[1],z:[0,3]}:{x:[3],y:[2],z:[0,1]},this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.addBias=t,this.activation=o,this.hasPreluActivationWeights=n,t&&this.variableNames.push("bias"),n&&this.variableNames.push("preluActivationWeights"),this.shaderKey=`conv2dnaive_${this.activation}_${this.isChannelsLast}`}getUserCode(){return` + ${ur(this.activation,this.hasPreluActivationWeights,!1,4)} + fn readInp(batch : i32, row : i32, col : i32, chan : i32) -> f32{ + let coords = vec4(batch, row, col, chan); + if (coordsInBounds4D(coords, uniforms.xShape)) { + return getX(batch, row, col, chan); + } else { + return 0.0; + } + } + fn readFilt(row : i32, col : i32, xChannel : i32, outChannel : i32) -> f32{ + let coords = vec4(row, col, xChannel, outChannel); + if(coordsInBounds4D(coords, uniforms.wShape)) { + return getW(row, col, xChannel, outChannel); + } else { + return 0.0; + } + } + fn writeResult(batch : i32, row : i32, col : i32, chan : i32, valueIn : f32) { + let coords = ${this.isChannelsLast?"vec4(batch, row, col, chan);":"vec4(batch, chan, row, col);"} + if (coordsInBounds4D(coords, uniforms.outShape)) { + var value = valueIn; + ${Kr(this.addBias,this.activation)} + setOutputAtCoords(coords.x, coords.y, coords.z, coords.w, value); + } + } + ${ue("index")} { + let coords = getOutputCoords(); + let batch = coords[0]; + let outChannel = ${this.isChannelsLast?"coords[3];":"coords[1];"} + let outRow = ${this.isChannelsLast?"coords[1];":"coords[2];"} + let outCol = ${this.isChannelsLast?"coords[2];":"coords[3];"} + var acc : f32 = 0.0; + for (var row = 0; row < uniforms.filterDims[0]; row = row + 1) { + for (var col = 0; col < uniforms.filterDims[1]; col = col + 1) { + let xRow = outRow * uniforms.stride[0] + uniforms.dilation[0] * row - uniforms.pad[0]; + let xCol = outCol * uniforms.stride[1] + uniforms.dilation[1] * col - uniforms.pad[1]; + for (var xChannel = 0; xChannel < ${this.isChannelsLast?"uniforms.xShape[3];":"uniforms.xShape[1];"} xChannel = xChannel + 1) { + ${this.isChannelsLast?"let v = readInp(batch, xRow, xCol, xChannel);":"let v = readInp(batch, xChannel, xRow, xCol);"} + let f = readFilt(row, col, xChannel, outChannel); + acc = acc + v * f; + } + } + } + writeResult(batch, outRow, outCol, outChannel, acc); + } + `}};function zL(r,e){let t=r.length;return t>=3?e?[...r.slice(0,-3),r[t-3]*r[t-2],r[t-1]]:[...r.slice(0,-3),r[t-3],r[t-2]*r[t-1]]:!e&&t===1&&r[0]>1?[r[0],1]:null}function toe({x:r,filter:e,convInfo:t,backend:o,bias:n=null,preluActivationWeights:s=null,leakyreluAlpha:a=0,activation:i=null}){let p=t.dataFormat==="channelsLast",u=!p,c=!1,l=p&&t.filterHeight===t.inHeight&&t.filterWidth===t.inWidth&&t.padInfo.type==="VALID",m=[],f,d;if(l){let y=t.inHeight*t.inWidth*t.inChannels;f=xe({inputs:{x:r},backend:o,attrs:{shape:[1,t.batchSize,y]}}),d=xe({inputs:{x:e},backend:o,attrs:{shape:[1,y,t.outChannels]}})}else f=xe({inputs:{x:r},backend:o,attrs:{shape:p?[t.batchSize,t.inHeight*t.inWidth,t.inChannels]:[t.batchSize,t.inChannels,t.inHeight*t.inWidth]}}),d=xe({inputs:{x:e},backend:o,attrs:{shape:[1,t.inChannels,t.outChannels]}});if(m.push(f),m.push(d),s!=null){let y=zL(s.shape,p);y!=null&&(s=xe({inputs:{x:s},backend:o,attrs:{shape:y}}),m.push(s))}if(n!=null){let y=zL(n.shape,p);y!=null&&(n=xe({inputs:{x:n},backend:o,attrs:{shape:y}}),m.push(n))}let h=_c({a:p?f:d,b:p?d:f,transposeA:u,transposeB:c,backend:o,bias:n,activation:i,preluActivationWeights:s,leakyreluAlpha:a}),g=xe({inputs:{x:h},backend:o,attrs:{shape:t.outShape}});m.push(h);for(let y of m)o.disposeData(y.dataId);return g}function sx({x:r,filter:e,convInfo:t,backend:o,bias:n=null,preluActivationWeights:s=null,leakyreluAlpha:a=0,activation:i=null}){let p=n!=null,u=s!=null,c=t.dataFormat==="channelsLast",l=c&&t.filterHeight===t.inHeight&&t.filterWidth===t.inWidth&&t.padInfo.type==="VALID",m=P().getBool("WEBGPU_USE_NAIVE_CONV2D_DEBUG");if(!m&&(l||t.filterHeight===1&&t.filterWidth===1&&t.dilationHeight===1&&t.dilationWidth===1&&t.strideHeight===1&&t.strideWidth===1&&(t.padInfo.type==="SAME"||t.padInfo.type==="VALID")))return toe({x:r,filter:e,convInfo:t,backend:o,bias:n,activation:i,preluActivationWeights:s,leakyreluAlpha:a});let f,d=[t.padInfo.top,t.padInfo.left],h=[{type:"int32",data:[t.filterHeight,t.filterWidth]},{type:"int32",data:[...d]},{type:"int32",data:[t.strideHeight,t.strideWidth]},{type:"int32",data:[t.dilationHeight,t.dilationWidth]}];if(m)f=new nx(t,p,i,u);else{let C=c?t.outHeight*t.outWidth:t.outChannels,w=c?t.outChannels:t.outHeight*t.outWidth,k=t.filterHeight*t.filterWidth*t.inChannels;h.push({type:"int32",data:[C]},{type:"int32",data:[w]},{type:"int32",data:[k]});let _=o.adapterInfo.isIntel();f=new ox(t,C,w,k,p,i,u,_)}let g=[],y=[r,e];p&&(!c&&n.shape.length===1&&(n=xe({inputs:{x:n},backend:o,attrs:{shape:[n.shape[0],1,1]}}),g.push(n)),y.push(n)),u&&(!c&&s.shape.length===1&&(s=xe({inputs:{x:s},backend:o,attrs:{shape:[s.shape[0],1,1]}}),g.push(s)),y.push(s)),i==="leakyrelu"&&(h.push({type:"float32",data:[a]}),f.uniforms+=" alpha : f32,");let b=o.runWebGPUProgram(f,y,r.dtype,h);for(let C of g)o.disposeData(C.dataId);return b}function roe(r){let{inputs:e,attrs:t,backend:o}=r,{x:n,filter:s}=e,{strides:a,pad:i,dataFormat:p,dilations:u,dimRoundingMode:c}=t,l=I.convertConv2DDataFormat(p),m=I.computeConv2DInfo(n.shape,s.shape,a,u,i,c,!1,l);return sx({x:n,filter:s,convInfo:m,backend:o})}var WL={kernelName:ln,backendName:"webgpu",kernelFunc:roe};function ooe(r=4){let e=s=>{switch(s){case 1:return"return W[getIndexFromCoords4D(coord, uniforms.wShape)];";case 4:return` + let coord1 = vec4(coordX, coordY, col + 1, rowInner); + let coord2 = vec4(coordX, coordY, col + 2, rowInner); + let coord3 = vec4(coordX, coordY, col + 3, rowInner); + let v0 = W[getIndexFromCoords4D(coord, uniforms.wShape)]; + let v1 = W[getIndexFromCoords4D(coord1, uniforms.wShape)]; + let v2 = W[getIndexFromCoords4D(coord2, uniforms.wShape)]; + let v3 = W[getIndexFromCoords4D(coord3, uniforms.wShape)]; + return vec4(v0, v1, v2, v3); + `;default:throw new Error(`innerElementSize ${s} is not supported.`)}},o=`if (row < uniforms.dimAOuter && col < uniforms.dimInner) { + ${` + let outRow = row / uniforms.outShape[2]; + let outCol = row % uniforms.outShape[2]; + + let WRow = col / (uniforms.filterDims[1] * uniforms.outBackprop[3]); + let WCol = col / uniforms.outBackprop[3] % uniforms.filterDims[1]; + let xR = f32(outRow - uniforms.pads[0] + WRow) / f32(uniforms.stride[0]); + let xC = f32(outCol - uniforms.pads[1] + WCol) / f32(uniforms.stride[1]); + if (xR < 0.0 || xR >= f32(uniforms.outBackprop[1]) || fract(xR) > 0.0) { + return ${vt(r)}(0.0); + } + if (xC < 0.0 || xC >= f32(uniforms.outBackprop[2]) || fract(xC) > 0.0) { + return ${vt(r)}(0.0); + } + let coord = vec4( + batch, + i32(xR), + i32(xC), + col % uniforms.outBackprop[3]); + return x[getIndexFromCoords4D(coord, uniforms.xShape)/${r}];`} + } + return ${vt(r)}(0.0);`;return` + fn mm_readA(batch: i32, row : i32, colIn : i32) -> ${vt(r)} { + let col = colIn * ${r}; + ${o} + } + + fn mm_readB(batch: i32, row : i32, colIn : i32) -> ${vt(r)} { + let col = colIn * ${r}; + let coordX = uniforms.filterDims.x - 1 - + row / (uniforms.filterDims[1] * uniforms.outBackprop[3]); + let coordY = uniforms.filterDims.y - 1 - + (row / uniforms.outBackprop[3]) % uniforms.filterDims[1]; + if (row < uniforms.dimInner && col < uniforms.dimBOuter && + coordX >= 0 && coordY >= 0) { + let rowInner = row % uniforms.outBackprop[3]; + let coord = vec4(coordX, coordY, col, rowInner); + ${e(r)} + } + return ${vt(r)}(0.0); + } + + fn mm_write(batch: i32, row : i32, colIn : i32, valueInput : ${vt(r)}) { + let col = colIn * ${r}; + if (row < uniforms.dimAOuter && (col + ${r-1}) < uniforms.dimBOuter) { + var value = valueInput; + let outCoord = vec4( + batch, + row / uniforms.outShape[2], + row % uniforms.outShape[2], + col); + result[getIndexFromCoords4D(outCoord, uniforms.outShape)/${r}] = value; + } + }`}var ax=class{constructor(e){this.variableNames=["x","W"],this.uniforms="filterDims : vec2, pads : vec2, stride : vec2, outBackprop : vec4, dimAOuter : i32, dimBOuter : i32, dimInner : i32,",this.outputShape=e.inShape,x.assert(e.dataFormat==="channelsLast",()=>"TODO: NCHW is unimplemented"),this.isVec4=e.inChannels%4===0&&e.outChannels%4===0,this.dispatchLayout={x:[3],y:[1,2],z:[0]},this.workGroupSize=Hl(this.dispatchLayout,this.outputShape,this.isVec4),this.elementsPerThread=ql(this.dispatchLayout,this.outputShape,this.isVec4),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize,this.elementsPerThread),this.isVec4&&(this.variableTypes=["vec4","f32"]),this.shaderKey=`conv2DDerInputMM_${this.isVec4}_${this.elementsPerThread}`}getUserCode(){let e=this.isVec4?Uu(this.elementsPerThread,this.workGroupSize):Gu(this.elementsPerThread,this.workGroupSize);return` + ${ooe(this.isVec4?4:1)} + ${e} + `}};var ix=class{constructor(e){this.variableNames=["dy","W"],this.uniforms="filterDims : vec2, pads : vec2, stride : vec2, outBackprop : vec4,",this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=e.inShape,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.isChannelsLast=e.dataFormat==="channelsLast",this.shaderKey=`conv2DDerInput_${this.isChannelsLast}`}getUserCode(){let e=this.isChannelsLast?1:2,t=this.isChannelsLast?2:3,o=this.isChannelsLast?3:1;return` + ${ue("index")} { + if(index < uniforms.size) { + let coords = getCoordsFromIndex(index); + let batch = coords[0]; + let d1 = coords[${o}]; + + let dyCorner = vec2(coords[${e}], coords[${t}]) - uniforms.pads; + let dyRCorner = dyCorner.x; + let dyCCorner = dyCorner.y; + + // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1). + // ? = to be determined. : = across all values in that axis. + var dotProd = 0.0; + for (var wR = 0; wR < uniforms.filterDims.x; wR = wR + 1) { + let dyR = (f32(dyRCorner) + f32(wR)) / f32(uniforms.stride.x); + let wRPerm = uniforms.filterDims.x - 1 - wR; + if (dyR < 0.0 || dyR >= f32(uniforms.outBackprop[1]) || fract(dyR) > 0.0 || + wRPerm < 0) { + continue; + } + let idyR = i32(dyR); + + for (var wC = 0; wC < uniforms.filterDims.y; wC = wC + 1) { + let dyC = (f32(dyCCorner) + f32(wC)) / f32(uniforms.stride.y); + let wCPerm = uniforms.filterDims.y - 1 - wC; + if (dyC < 0.0 || dyC >= f32(uniforms.outBackprop[2]) || + fract(dyC) > 0.0 || wCPerm < 0) { + continue; + } + let idyC = i32(dyC); + + for (var d2 = 0; d2 < uniforms.outBackprop[3]; d2 = d2 + 1) { + if (${this.isChannelsLast}) { + let xValue = getDy(batch, idyR, idyC, d2); + let wValue = getW(wRPerm, wCPerm, d1, d2); + dotProd = dotProd + xValue * wValue; + } else { + let xValue = getDy(batch, d2, idyR, idyC); + let wValue = getW(wRPerm, wCPerm, d1, d2); + dotProd = dotProd + xValue * wValue; + } + + } + } + } + setOutputAtIndex(index, dotProd); + } + } + `}};function noe(r){let{inputs:e,backend:t,attrs:o}=r,{dy:n,filter:s}=e,{inputShape:a,strides:i,pad:p,dataFormat:u,dimRoundingMode:c}=o,l=I.convertConv2DDataFormat(u),m=I.computeConv2DInfo(a,s.shape,i,1,p,c,!1,l),f=[{type:"int32",data:[m.filterHeight,m.filterWidth]},{type:"int32",data:[m.filterHeight-1-m.padInfo.top,m.filterWidth-1-m.padInfo.left]},{type:"int32",data:[m.strideHeight,m.strideWidth]},{type:"int32",data:[m.batchSize,m.outHeight,m.outWidth,m.outChannels]}],d;if(P().getBool("WEBGPU_USE_NAIVE_CONV2D_TRANSPOSE")||m.filterHeight<=2&&m.filterWidth<=2&&m.outChannels<=16&&m.inChannels===1)d=new ix(m);else{d=new ax(m);let h=m.inHeight*m.inWidth,g=m.inChannels,y=m.filterHeight*m.filterWidth*m.outChannels;f.push({type:"uint32",data:[h]},{type:"uint32",data:[g]},{type:"uint32",data:[y]})}return t.runWebGPUProgram(d,[n,s],"float32",f)}var UL={kernelName:mn,backendName:"webgpu",kernelFunc:noe};var soe=Ge({opType:pe.COS}),GL={kernelName:fn,backendName:"webgpu",kernelFunc:soe};var aoe=Ge({opType:pe.COSH}),HL={kernelName:dn,backendName:"webgpu",kernelFunc:aoe};var ux=class{constructor(e,t,o,n){this.variableNames=["Image","Boxes","BoxInd"],this.uniforms="extrapolationValue : f32,",this.workGroupSize=[64,1,1],this.size=!0;let[s]=t;this.outputShape=[s,o[0],o[1],e],this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.methodId=n==="bilinear"?1:0,this.cropHeightBiggerThan1=this.outputShape[1]>1,this.cropWidthBiggerThan1=this.outputShape[2]>1,this.shaderKey=`cropAndResize_${this.methodId}_${this.cropHeightBiggerThan1}_${this.cropWidthBiggerThan1}`}getUserCode(){let[e,t]=["f32(uniforms.imageShape[1] - 1)","f32(uniforms.imageShape[2] - 1)"],[o,n,s]=this.cropHeightBiggerThan1?[`(${e} / f32(uniforms.outShape[1] - 1))`,"(y2-y1) * height_ratio",`y1*${e} + f32(y)*(height_scale)`]:["0.0","0.0",`0.5 * (y1+y2) * ${e}`],[a,i,p]=this.cropWidthBiggerThan1?[`(${t} / f32(uniforms.outShape[2] - 1))`,"(x2-x1) * width_ratio",`x1*${t} + f32(x)*(width_scale)`]:["0.0","0.0",`0.5 * (x1+x2) * ${t}`];return` + ${ue("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + let height_ratio = f32(${o}); + let width_ratio = f32(${a}); + let b = coords[0]; + let y = coords[1]; + let x = coords[2]; + let d = coords[3]; + // get box vals + let y1 = getBoxes(b, 0); + let x1 = getBoxes(b, 1); + let y2 = getBoxes(b, 2); + let x2 = getBoxes(b, 3); + // get image in batch index + let bInd = i32(round(getBoxInd(b))); + if(bInd < 0 || bInd >= uniforms.outShape[0]) { + return; + } + let height_scale = ${n}; + let width_scale = ${i}; + let in_y = ${s}; + if( in_y < 0.0 || in_y > ${e} ) { + setOutputAtIndex(index, uniforms.extrapolationValue); + return; + } + let in_x = ${p}; + if( in_x < 0.0 || in_x > ${t} ) { + setOutputAtIndex(index, uniforms.extrapolationValue); + return; + } + let sourceFracIndexCR = vec2(in_x,in_y); + if(${this.methodId} == 1) { + // Compute the four integer indices. + let sourceFloorCR = vec2(sourceFracIndexCR); + let sourceCeilCR = vec2(ceil(sourceFracIndexCR)); + let topLeft = getImage(bInd, sourceFloorCR.y, sourceFloorCR.x, d); + let bottomLeft = getImage(bInd, sourceCeilCR.y, sourceFloorCR.x, d); + let topRight = getImage(bInd, sourceFloorCR.y, sourceCeilCR.x, d); + let bottomRight = getImage(bInd, sourceCeilCR.y, sourceCeilCR.x, d); + let fracCR = sourceFracIndexCR - vec2(sourceFloorCR); + let top = topLeft + (topRight - topLeft) * fracCR.x; + let bottom = bottomLeft + (bottomRight - bottomLeft) * fracCR.x; + let newValue = top + (bottom - top) * fracCR.y; + setOutputAtIndex(index, newValue); + } else { + // Compute the coordinators of nearest neighbor point. + let sourceNearestCR = vec2(floor( + sourceFracIndexCR + vec2(0.5,0.5))); + let newValue = getImage( + bInd, sourceNearestCR.y, sourceNearestCR.x, d); + setOutputAtIndex(index, newValue); + } + } + } + `}};var ioe=r=>{let{inputs:e,backend:t,attrs:o}=r,{image:n,boxes:s,boxInd:a}=e,{cropSize:i,method:p,extrapolationValue:u}=o,c=new ux(n.shape[3],s.shape,i,p),l=[{type:"float32",data:[u]}];return t.runWebGPUProgram(c,[n,s,a],"float32",l)},qL={kernelName:xn,backendName:"webgpu",kernelFunc:ioe};var Ku;(function(r){r.Prod="*",r.Sum="+"})(Ku||(Ku={}));var tm=class{constructor(e,t,o,n){this.variableNames=["x"],this.uniforms="index : f32,",this.size=!0;let s=128;this.workGroupSize=[s,1,1],this.outputShape=t,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.exclusive=o,this.reverse=n,this.op=e,this.shaderKey=`cum_${this.op}_${this.exclusive}_${this.reverse}`}getUserCode(){let e=this.outputShape.length,t=this.op===Ku.Prod?"1.0":"0.0",o=this.exclusive?t:`getX(${KL(e,"coords",this.op)})`,n=this.outputShape[this.outputShape.length-1],s="",a="";return this.exclusive?(s=this.reverse?`end != ${n-1}`:"end != 0",a=this.reverse?"end + 1":"end - 1"):(s=this.reverse?`end + pow2 < ${n}`:"end >= pow2",a=this.reverse?"end + pow2":"end - pow2"),` + ${ue("index")} { + if (index < uniforms.size) { + var coords = getCoordsFromIndex(index); + + let end = ${jL(e,"coords",this.op)}; + var val = ${o}; + let pow2 = i32(pow(2.0, uniforms.index)); + if (${s}) { + let idx = ${a}; + ${jL(e,"coords",this.op)} = idx; + val ${this.op}= getX(${KL(e,"coords",this.op)}); + } + setOutputAtIndex(index, val); + } + } + `}};function KL(r,e,t){if(r===1)return`${e}`;if(r===2)return`${e}.x, ${e}.y`;if(r===3)return`${e}.x, ${e}.y, ${e}.z`;if(r===4)return`${e}.x, ${e}.y, ${e}.z, ${e}.w`;throw Error(`Cumulative ${t} for rank ${r} is not yet supported`)}function jL(r,e,t){if(r===1)return`${e}`;if(r===2)return`${e}.y`;if(r===3)return`${e}.z`;if(r===4)return`${e}.w`;throw Error(`Cumulative ${t} for rank ${r} is not yet supported`)}function px(r,e,t,o,n,s){let a=e.shape.length,i=I.getAxesPermutation([o],a),p=e;i!=null&&(p=Nr({inputs:{x:e},backend:t,attrs:{perm:i}}));let u=I.getInnerMostAxes(1,a)[0];if(u!==a-1)throw new Error(`WebGPU cumprod shader expects an inner-most axis=${e.shape.length-1} but got axis=${o}`);let c=p.shape[u],l=Lt({inputs:{x:p},backend:t});for(let m=0;m<=Math.ceil(Math.log2(c))-1;m++){let f=new tm(r,p.shape,!1,s),d=l,h=[{type:"float32",data:[m]}];l=t.runWebGPUProgram(f,[l],l.dtype,h),t.disposeData(d.dataId)}if(n){let m=new tm(r,p.shape,n,s),f=l,d=[{type:"float32",data:[0]}];l=t.runWebGPUProgram(m,[l],l.dtype,d),t.disposeData(f.dataId)}if(i!=null){let m=I.getUndoAxesPermutation(i),f=Nr({inputs:{x:l},backend:t,attrs:{perm:m}});return t.disposeData(l.dataId),t.disposeData(p.dataId),f}return l}function uoe(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s,exclusive:a,reverse:i}=o;return px(Ku.Prod,n,t,s,a,i)}var XL={kernelName:hn,backendName:"webgpu",kernelFunc:uoe};function poe(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s,exclusive:a,reverse:i}=o;return px(Ku.Sum,n,t,s,a,i)}var YL={kernelName:gn,backendName:"webgpu",kernelFunc:poe};var cx=class{constructor(e,t){this.variableNames=["x"],this.workGroupSize=[64,1,1],this.size=!0,this.uniforms="blockSize : i32,",this.outputShape=e,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey=`depthToSpace_${t}`,this.dataFormat=t}getUserCode(){return` + ${ue("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + let b = coords[0]; + let h = ${this.getHeightCoordString()}; + let w = ${this.getWidthCoordString()}; + let d = ${this.getDepthCoordString()}; + + let in_h = h / uniforms.blockSize; + let offset_h = h % uniforms.blockSize; + let in_w = w / uniforms.blockSize; + let offset_w = w % uniforms.blockSize; + let offset_d = (offset_h * uniforms.blockSize + offset_w) * + ${this.getOutputDepthSize()}; + let in_d = d + offset_d; + + let rlt = ${this.getInputSamplingString()}; + setOutputAtIndex(index, rlt); + } + }`}getHeightCoordString(){return this.dataFormat==="NHWC"?"coords[1]":"coords[2]"}getWidthCoordString(){return this.dataFormat==="NHWC"?"coords[2]":"coords[3]"}getDepthCoordString(){return this.dataFormat==="NHWC"?"coords[3]":"coords[1]"}getOutputDepthSize(){return this.dataFormat==="NHWC"?"uniforms.outShape[3]":"uniforms.outShape[1]"}getInputSamplingString(){return this.dataFormat==="NHWC"?"getX(b, in_h, in_w, in_d)":"getX(b, in_d, in_h, in_w)"}};function coe(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{blockSize:s,dataFormat:a}=o,i=n.shape[0],p=a==="NHWC"?n.shape[1]:n.shape[2],u=a==="NHWC"?n.shape[2]:n.shape[3],c=a==="NHWC"?n.shape[3]:n.shape[1],l=p*s,m=u*s,f=c/(s*s),d=a==="NHWC"?[i,l,m,f]:[i,f,l,m],h=[{type:"int32",data:[s]}],g=new cx(d,a);return t.runWebGPUProgram(g,[n],n.dtype,h)}var QL={kernelName:yn,backendName:"webgpu",kernelFunc:coe};var lx=class{constructor(e,t,o,n=!1,s=null,a=!1){this.variableNames=["x","W"],this.uniforms="pad : vec2, inDims : vec2,",this.workGroupSize=[16,16,1],this.outputShape=e,this.dispatchLayout={x:[3],y:[2],z:[0,1]},this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),n&&this.variableNames.push("bias"),a&&this.variableNames.push("preluActivationWeights"),this.addBias=n,this.activation=s,this.hasPreluActivation=a,this.filterHeight=t,this.filterWidth=o,this.shaderKey=`depthwiseNCHW_${this.activation}_${this.filterHeight}_${this.filterWidth}`}getUserCode(){let e=this.filterWidth*this.filterHeight,t=this.workGroupSize[0]*this.workGroupSize[1]*this.workGroupSize[2],o=this.workGroupSize[1]+this.filterHeight-1,n=this.workGroupSize[0]+this.filterWidth-1;return` + ${ur(this.activation,this.hasPreluActivation,!1,4)} + + var mm_Asub : array, ${o}>; + var mm_Bsub : array, ${this.filterHeight}>; + fn readX(batch : i32, channel : i32, row : i32, col : i32) -> f32 { + var value = 0.0; + if (row >=0 && row < uniforms.inDims[0] && col >=0 && col < uniforms.inDims[1]) + { + value = getX(batch, channel, row, col); + } + return value; + } + + ${Ri()} + fn _start(@builtin(local_invocation_id) LocalId : vec3, + @builtin(global_invocation_id) GlobalId : vec3, + @builtin(local_invocation_index) LocalIndex: u32, + @builtin(num_workgroups) NumWorkgroups: vec3) { + localId = LocalId; + globalId = GlobalId; + let localIndex = i32(LocalIndex); + numWorkgroups = NumWorkgroups; + let coords = getOutputCoords(); + let batch = coords[0]; + let xRCCorner = vec2(coords.zw) - uniforms.pad; + let channelMul = uniforms.wShape[3]; + let d1 = coords[1] / channelMul; + let q = coords[1] % channelMul; + + let inputRowStart = xRCCorner.x; + let inputColStart = xRCCorner.y; + + let localRow = i32(localId.y); + let localCol = i32(localId.x); + + // Load one tile of X into local memory. + for (var inputRow = localRow; inputRow < ${o}; inputRow = inputRow + ${this.workGroupSize[1]}) { + for (var inputCol = localCol; inputCol < ${n}; inputCol = inputCol + ${this.workGroupSize[0]}) { + let rowOffset = inputRow - localRow; + let colOffset = inputCol - localCol; + mm_Asub[inputRow][inputCol] = readX(batch, d1, inputRowStart + rowOffset, inputColStart + colOffset); + } + } + + // Load one tile of W into local memory. + var wIndex = localIndex; + ${e, inDims : vec2,",this.workGroupSize=[4,4,4],this.workPerThread=4,this.isVec4=!0,this.outputShape=e.outShape,this.dispatchLayout={x:[3],y:[2],z:[0,1]},this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize,[4,this.workPerThread,1]),x.assert(e.dataFormat==="channelsLast",()=>"TODO: NCHW is unimplemented"),t&&this.variableNames.push("bias"),n&&this.variableNames.push("preluActivationWeights"),this.convInfo=e,this.addBias=t,this.activation=o,this.hasPreluActivation=n,this.shaderKey=`depthwiseVec4_${o}_${this.convInfo.filterHeight}_${this.convInfo.filterWidth}_${this.convInfo.strideHeight}_${this.convInfo.strideWidth}_${this.workPerThread}`}getUserCode(){let e=(this.workPerThread-1)*this.convInfo.strideWidth+this.convInfo.filterWidth;return` + ${ur(this.activation,this.hasPreluActivation,!0,4)} + fn readX(batch : i32, row : i32, col : i32, channel : i32) -> vec4 { + var value = vec4(0.0); + if (col >=0 && col < uniforms.inDims[1]) { + value = getX(batch, row, col, channel); + } + return value; + } + + const strideHeight = ${this.convInfo.strideHeight}; + const strideWidth = ${this.convInfo.strideWidth}; + ${Ri()} + fn _start(@builtin(global_invocation_id) globalId: vec3) { + let batch = i32(globalId.z) / uniforms.outShape[1]; + let r = i32(globalId.z) % uniforms.outShape[1]; + let c = i32(globalId.y) * ${this.workPerThread}; + let d1 = i32(globalId.x) * 4; + let xRCCorner = vec2(r, c) * vec2(strideHeight, strideWidth) - uniforms.pad; + + let xRCorner = xRCCorner.x; + let xCCorner = xRCCorner.y; + var xVals : array, ${e}>; + var dotProd : array, ${this.workPerThread}>; + for (var i = 0; i < ${this.workPerThread}; i++) { + dotProd[i] = vec4(0.0); + } + + // Use constant instead of uniform can give better performance. + for (var wR = 0; wR < ${this.convInfo.filterHeight}; wR = wR + 1) { + let xR = xRCorner + wR; + if (xR >=0 && xR < uniforms.inDims[0]) { + for (var i = 0; i < ${e}; i++) { + xVals[i] = readX(batch, xR, xCCorner + i, d1); + } + for (var wC = 0; wC < ${this.convInfo.filterWidth}; wC = wC + 1) { + let wValue = getW(wR, wC, d1, 0); + for (var i = 0; i < ${this.workPerThread}; i++) { + dotProd[i] = fma(xVals[i * strideWidth + wC], wValue, dotProd[i]); + } + } + } + } + + for (var i = 0; i < ${this.workPerThread}; i = i + 1) { + let coords = vec4(batch, r, c + i, d1); + if (coordsInBounds4D(coords, uniforms.outShape)) { + var value = dotProd[i]; + ${Kr(this.addBias,this.activation)} + setOutputAtCoords(coords[0], coords[1], coords[2], coords[3], value); + } + } + } + `}};var Pc=class{constructor(e,t=!1,o=null,n=!1){this.variableNames=["x","W"],this.uniforms=`pad : vec2, inDims : vec2, filterHeight : i32, + filterWidth : i32, stride : vec2, dilation : vec2,`,this.workGroupSize=[256,1,1],this.outputShape=e.outShape,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.isChannelsLast=e.dataFormat==="channelsLast",t&&this.variableNames.push("bias"),n&&this.variableNames.push("preluActivationWeights"),this.convInfo=e,this.addBias=t,this.activation=o,this.hasPreluActivation=n,this.shaderKey=`depthwise_${this.activation}_${this.isChannelsLast}`}getUserCode(){let e=this.isChannelsLast?"getX(batch, xR, xC, d1);":"getX(batch, d1, xR, xC);";return` + ${ur(this.activation,this.hasPreluActivation,!1,4)} + + ${ue()} { + let coords = getOutputCoords(); + let batch = coords[0]; + let xRCCorner = vec2(coords.${this.isChannelsLast?"yz":"zw"}) * uniforms.stride - uniforms.pad; + let d2 = coords[${this.isChannelsLast?3:1}]; + let channelMul = uniforms.wShape[3]; + let d1 = d2 / channelMul; + let q = d2 % channelMul; + + let inputRowStart = xRCCorner.x; + let inputColStart = xRCCorner.y; + let inputRowEnd = inputRowStart + uniforms.filterHeight * + uniforms.dilation[0]; + let inputColEnd = inputColStart + uniforms.filterWidth * + uniforms.dilation[1]; + + // Convolve x(?, ?, d1)|x(d1, ?, ?) with w(:, :, d1, q) to get + // y(yR, yC, d2)|y(d2, yR, yC). ? = to be determined. : = across all + // values in that axis. x(?, ?, d1) and y(yR, yC, d2) is for NHWC. + // x(d1, ?, ?) and y(d2, yR, yC) is for NCHW. + var value = 0.0; + + // Extract if checking out of for loop for performance. + if (inputRowStart >= 0 && inputColStart >= 0 && + inputRowEnd < uniforms.inDims[0] && + inputColEnd < uniforms.inDims[1]) { + for (var wR = 0; wR < uniforms.filterHeight; wR = wR + 1) { + let xR = inputRowStart + wR * uniforms.dilation[0]; + + for (var wC = 0; wC < uniforms.filterWidth; wC = wC + 1) { + let xC = inputColStart + wC * uniforms.dilation[1]; + + let xVal = ${e}; + let wVal = getW(wR, wC, d1, q); + value = value + xVal * wVal; + } + } + } else { + for (var wR = 0; wR < uniforms.filterHeight; wR = wR + 1) { + let xR = inputRowStart + wR * uniforms.dilation[0]; + + if (xR < 0 || xR >= uniforms.inDims[0]) { + continue; + } + + for (var wC = 0; wC < uniforms.filterWidth; wC = wC + 1) { + let xC = inputColStart + wC * uniforms.dilation[1]; + + if (xC < 0 || xC >= uniforms.inDims[1]) { + continue; + } + + let xVal = ${e}; + let wVal = getW(wR, wC, d1, q); + value = value + xVal * wVal; + } + } + } + ${Kr(this.addBias,this.activation)} + if (coordsInBounds4D(coords, uniforms.outShape)) { + setOutputAtCoords(coords[0], coords[1], coords[2], coords[3], value); + } + } + `}};function loe(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,filter:s}=e,{strides:a,pad:i,dataFormat:p,dilations:u,dimRoundingMode:c}=o,l=I.convertConv2DDataFormat(p),m=u;m==null&&(m=[1,1]);let f=I.computeConv2DInfo(n.shape,s.shape,a,m,i,c,!0,l),d=[{type:"int32",data:[f.padInfo.top,f.padInfo.left]},{type:"int32",data:[f.inHeight,f.inWidth]}],h=f.dataFormat==="channelsLast",g;return!h&&f.inHeight>16&&f.inWidth>16&&f.strideHeight===1&&f.strideWidth===1&&f.dilationWidth===1&&f.dilationHeight===1&&f.inChannels===f.outChannels?g=new lx(f.outShape,f.filterHeight,f.filterWidth):h&&f.inHeight>4&&f.inWidth>4&&f.strideWidth<=2&&f.inChannels===f.outChannels&&f.dilationHeight===1&&f.dilationWidth===1&&f.inChannels%4===0?g=new Dc(f):(g=new Pc(f),d.push({type:"int32",data:[f.filterHeight]},{type:"int32",data:[f.filterWidth]},{type:"int32",data:[f.strideHeight,f.strideWidth]},{type:"int32",data:[f.dilationHeight,f.dilationWidth]})),t.runWebGPUProgram(g,[n,s],n.dtype,d)}var ZL={kernelName:bn,backendName:"webgpu",kernelFunc:loe};var BS=it({opType:ye.MUL,cpuKernelImpl:sL,supportsComplex:!0}),JL={kernelName:ho,backendName:"webgpu",kernelFunc:BS};function rm(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s,keepDims:a}=o;return Ys(n,s,a,"sum",t)}var eB={kernelName:jn,backendName:"webgpu",kernelFunc:rm};function moe(r){let{inputs:e,backend:t,attrs:o}=r,{equation:n}=o,s=e,{allDims:a,summedDims:i,idDims:p}=I.decodeEinsumEquation(n,s.length);I.checkEinsumDimSizes(a.length,p,s);let{path:u,steps:c}=I.getEinsumComputePath(i,p),l=c.length,m=null,f=a.length,d=[];for(let h=0;h=0&&(m=rm({inputs:{x:m},backend:t,attrs:{axis:u[h]-(a.length-f),keepDims:!1}}),d.push(m)),f--)}for(let h of d)h!==m&&t.disposeData(h.dataId);return m}var tB={kernelName:Xa,backendName:"webgpu",kernelFunc:moe};var foe=Ge({opType:pe.ELU}),rB={kernelName:In,backendName:"webgpu",kernelFunc:foe};var doe=it({opType:ye.EQUAL,dtype:"bool",cpuKernelImpl:HM}),oB={kernelName:oo,backendName:"webgpu",kernelFunc:doe};var VS=Ge({opType:pe.EXP,cpuKernelImpl:qM,dtype:"float32"}),nB={kernelName:no,backendName:"webgpu",kernelFunc:VS};function mx(r){let{inputs:e,attrs:t,backend:o}=r,{dim:n}=t,{input:s}=e,a=s.shape.length,i=s.shape.slice(),p=n;return n<0&&(x.assert(-(a+1)<=n,()=>`Axis must be in the interval [${-(a+1)}, ${a}]`),p=a+n+1),i.splice(p,0,1),xe({inputs:{x:s},backend:o,attrs:{shape:i}})}var sB={kernelName:xs,backendName:"webgpu",kernelFunc:mx};var hoe=Ge({opType:pe.EXPM1,cpuKernelImpl:KM}),aB={kernelName:wn,backendName:"webgpu",kernelFunc:hoe};var fx=class{constructor(e){this.outputShape=[],this.variableNames=["x"],this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=e,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey="flipLeftRight"}getUserCode(){return` + ${ue("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + let coordX = uniforms.xShape[2] - coords[2] - 1; + let outputValue = getX(coords[0], coords[1], coordX, coords[3]); + setOutputAtIndex(index, outputValue); + } + } + `}};var iB={kernelName:Sn,backendName:"webgpu",kernelFunc:({inputs:r,backend:e})=>{let{image:t}=r,o=e,n=new fx(t.shape);return o.runWebGPUProgram(n,[t],t.dtype)}};var goe=Ge({opType:pe.FLOOR,cpuKernelImpl:jM}),uB={kernelName:so,backendName:"webgpu",kernelFunc:goe};var xoe=it({opType:ye.INT_DIV,dtype:"int32"}),pB={kernelName:vn,backendName:"webgpu",kernelFunc:xoe};var dx=class{constructor(e,t,o=!1){this.isFromPixels=!0,this.outputShape=[0],this.variableNames=[],this.workGroupSize=[256,1,1],this.outputShape=e,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize,[t,1,1]),this.importVideo=o,this.shaderKey=`fromPixels_${this.importVideo}`}getUserCode(){let e=this.importVideo?"textureLoad(src, vec2(coords.yx));":"textureLoad(src, vec2(coords.yx), 0)";return` + @binding(1) @group(0) var src: ${this.importVideo?"texture_external":"texture_2d"}; + ${ue("index")} { + let flatIndex = index * uniforms.numChannels; + if (flatIndex < uniforms.size) { + let coords = getCoordsFromIndex(flatIndex); + let values = ${e}; + for (var i = 0; i < uniforms.numChannels; i = i + 1) { + result[flatIndex + i] = i32(floor(255.0 * values[i])); + } + } + } + `}};var cB={kernelName:Zi,backendName:"webgpu",kernelFunc:yoe},Oc,zS=P().getBool("CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU"),hx=new Map;function yoe(r){let{inputs:e,backend:t,attrs:o}=r,{pixels:n}=e,{numChannels:s}=o;if(n==null)throw new Error("pixels passed to tf.browser.fromPixels() can not be null");let a=typeof HTMLVideoElement!="undefined"&&n instanceof HTMLVideoElement,i=typeof HTMLImageElement!="undefined"&&n instanceof HTMLImageElement,p=typeof HTMLCanvasElement!="undefined"&&n instanceof HTMLCanvasElement||typeof OffscreenCanvas!="undefined"&&n instanceof OffscreenCanvas,u=typeof ImageBitmap!="undefined"&&n instanceof ImageBitmap,[c,l]=a?[n.videoWidth,n.videoHeight]:[n.width,n.height],m=[l,c,s],f=!1,d=a||i;if(u||p||d){let b;if(f){let D=n;if(!hx.has(D)||hx.get(D).expired){let O={source:D};hx.set(D,t.device.importExternalTexture(O))}b={width:c,height:l,format:null,usage:null,texture:hx.get(D)}}else{if(d){let L=P().getBool("CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU");(Oc==null||L!==zS)&&(zS=L,Oc=document.createElement("canvas").getContext("2d",{willReadFrequently:zS})),Oc.canvas.width=c,Oc.canvas.height=l,Oc.drawImage(n,0,0,c,l),n=Oc.canvas}let D=GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING,O="rgba8unorm",M=t.textureManager.acquireTexture(m[1],m[0],O,D);t.queue.copyExternalImageToTexture({source:n},{texture:M},[m[1],m[0]]),b={width:c,height:l,format:O,usage:D,texture:M}}let C=x.sizeFromShape(m),w=x.computeStrides(m),k=new dx(m,s,f),_=[{type:"uint32",data:[C]},{type:"uint32",data:[s]},{type:"uint32",data:[...w]}],E=t.makeTensorInfo([l,c],"int32"),R=t.tensorMap.get(E.dataId);R.resourceInfo=b;let A=t.runWebGPUProgram(k,[E],"int32",_);return t.disposeData(E.dataId),A}let h=n.data,g=h;if(s!=null&&s!==4){g=new Uint8Array(n.width*n.height*s);let b=h.length,C=0;for(let w=0;w(xValue, -meanValue, offsetValue), vec3(inv, inv, 1.0))); + } + } + `}};var lB={kernelName:kn,backendName:"webgpu",kernelFunc:({inputs:r,attrs:e,backend:t})=>{let{x:o,scale:n,offset:s,mean:a,variance:i}=r,{varianceEpsilon:p}=e,u=t,c=[o,a,i],l=null;s!=null&&(l=s.shape,c.push(s));let m=null;n!=null&&(m=n.shape,c.push(n));let f=new gx(o.shape,a.shape,i.shape,l,m),d=[{type:"float32",data:[p]}];return u.runWebGPUProgram(f,c,o.dtype,d)}};function boe(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,filter:s,bias:a,preluActivationWeights:i}=e,{strides:p,pad:u,dataFormat:c,dilations:l,dimRoundingMode:m,activation:f,leakyreluAlpha:d}=o,h=I.convertConv2DDataFormat(c),g=I.computeConv2DInfo(n.shape,s.shape,p,l,u,m,!1,h);return sx({x:n,filter:s,convInfo:g,backend:t,bias:a,preluActivationWeights:i,leakyreluAlpha:d,activation:f})}var mB={kernelName:Do,backendName:"webgpu",kernelFunc:boe};function Coe(r){let{inputs:e,backend:t,attrs:o}=r,{x:n,filter:s,bias:a,preluActivationWeights:i}=e,{strides:p,pad:u,dilations:c,dimRoundingMode:l,activation:m,leakyreluAlpha:f}=o,d=c;d==null&&(d=[1,1]),x.assert(I.eitherStridesOrDilationsAreOne(p,d),()=>`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${p} and dilations '${d}'`);let h=I.computeConv2DInfo(n.shape,s.shape,p,d,u,l,!0),g=[n,s],y=a!=null,b=i!=null;y&&g.push(a),b&&g.push(i);let C=[{type:"int32",data:[h.padInfo.top,h.padInfo.left]},{type:"int32",data:[h.inHeight,h.inWidth]}],w;return h.inHeight>4&&h.inWidth>4&&h.strideWidth<=2&&h.inChannels===h.outChannels&&h.dilationHeight===1&&h.dilationWidth===1&&h.inChannels%4===0?w=new Dc(h,y,m,b):(w=new Pc(h,y,m,b),C.push({type:"int32",data:[h.filterHeight]},{type:"int32",data:[h.filterWidth]},{type:"int32",data:[h.strideHeight,h.strideWidth]},{type:"int32",data:[h.dilationHeight,h.dilationWidth]})),m==="leakyrelu"&&(C.push({type:"float32",data:[f]}),w.uniforms+=" alpha : f32,"),t.runWebGPUProgram(w,g,"float32",C)}var fB={kernelName:Po,backendName:"webgpu",kernelFunc:Coe};var xx=class{constructor(e,t){this.variableNames=["A","indices"],this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=t,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey=`gathernd_${e}`,this.sliceDim=e,this.uniforms=`sliceDim : i32, strides : ${At(e)},`}getUserCode(){let e;return this.sliceDim>1?e="uniforms.strides[j]":e="uniforms.strides",` + ${ue("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + var flattenIndex = 0; + for (var j = 0; j < uniforms.sliceDim; j = j + 1) { + let indexTemp = i32(round(getIndices(coords[0], j))); + let strideNum = ${e}; + flattenIndex = flattenIndex + indexTemp * strideNum; + } + + setOutputAtIndex(index, getA(flattenIndex, coords[1])); + } + } + `}};function Ioe(r){let{inputs:e,backend:t}=r,{params:o,indices:n}=e,s=n.shape,a=s[s.length-1],i=x.sizeFromShape(o.shape),[p,u,c,l]=I.prepareAndValidate(o,n),m=xe({inputs:{x:n},backend:t,attrs:{shape:[u,a]}}),f=xe({inputs:{x:o},backend:t,attrs:{shape:[x.sizeFromShape(o.shape)/c,c]}});if(t.shouldExecuteOnCPU([o,n])||o.dtype==="string"){let b=t.readSync(n.dataId),C=t.bufferSync(o),w=XM(b,C,o.dtype,u,a,c,l,o.shape,i);return t.makeTensorInfo(p,o.dtype,w.values)}let d=new xx(a,[u,c]),h=[{type:"int32",data:[a]},{type:"int32",data:l}],g=t.runWebGPUProgram(d,[f,m],f.dtype,h),y=xe({inputs:{x:g},backend:t,attrs:{shape:p}});return t.disposeData(m.dataId),t.disposeData(f.dataId),t.disposeData(g.dataId),y}var dB={kernelName:Tn,backendName:"webgpu",kernelFunc:Ioe};var yx=class{constructor(e,t){this.variableNames=["A","indices"],this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=e.slice(),this.aShape=e,this.outputShape=t,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey="gather"}getUserCode(){let e=woe(this.aShape);return` + ${ue("index")} { + if (index < uniforms.size) { + let resRC = getCoordsFromIndex(index); + let indexZ = i32(getIndices(resRC.x, resRC.z)); + let inBounds = select(0.0, 1.0, indexZ >= 0 && indexZ < uniforms.aShape[2]); + setOutputAtIndex(index, inBounds * getA(${e})); + } + } + `}};function woe(r){let e=["resRC.x","resRC.y","resRC.z","resRC.w"],t=[];for(let o=0;ot.disposeData(A.dataId)),t.makeTensorInfo(u.outputShape,R.dtype,R.values)}let h=new yx(m.shape,d),g=t.runWebGPUProgram(h,[m,f],m.dtype);l.push(g);let y=xe({inputs:{x:g},backend:t,attrs:{shape:u.outputShape}});return l.forEach(b=>t.disposeData(b.dataId)),y}var hB={kernelName:bs,backendName:"webgpu",kernelFunc:WS};var Soe=it({opType:ye.GREATER,cpuKernelImpl:ZM,dtype:"bool"}),gB={kernelName:ao,backendName:"webgpu",kernelFunc:Soe};var voe=it({opType:ye.GREATER_EQUAL,dtype:"bool",cpuKernelImpl:QM}),xB={kernelName:io,backendName:"webgpu",kernelFunc:voe};var koe=Ge({opType:pe.IS_NAN,dtype:"bool"}),yB={kernelName:ia,backendName:"webgpu",kernelFunc:koe};function Toe(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{alpha:s}=o,a=[{type:"float32",data:[s]}],i=new Zo(n.shape,pe.LEAKYRELU);return i.uniforms="alpha : f32,",t.runWebGPUProgram(i,[n],"float32",a)}var bB={kernelName:Nn,backendName:"webgpu",kernelFunc:Toe};var Noe=it({opType:ye.LESS,dtype:"bool",cpuKernelImpl:eL}),CB={kernelName:po,backendName:"webgpu",kernelFunc:Noe};var _oe=it({opType:ye.LESS_EQUAL,dtype:"bool",cpuKernelImpl:JM}),IB={kernelName:co,backendName:"webgpu",kernelFunc:_oe};var Eoe=Ge({opType:pe.LOG,cpuKernelImpl:tL}),wB={kernelName:lo,backendName:"webgpu",kernelFunc:Eoe};var $oe=it({opType:ye.LOGICAL_AND,dtype:"bool"}),SB={kernelName:_n,backendName:"webgpu",kernelFunc:$oe};var Roe=Ge({opType:pe.LOGICAL_NOT}),vB={kernelName:En,backendName:"webgpu",kernelFunc:Roe};var Aoe=it({opType:ye.MAX,cpuKernelImpl:oL}),kB={kernelName:mo,backendName:"webgpu",kernelFunc:Aoe};function Foe(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{filterSize:s,strides:a,pad:i,dimRoundingMode:p}=o,u=1,c=I.computePool2DInfo(n.shape,s,a,u,i,p);return Zg(n,c,"max",t)}var TB={kernelName:Rn,backendName:"webgpu",kernelFunc:Foe};function Doe(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s,keepDims:a}=o;return Ys(n,s,a,"min",t)}var NB={kernelName:Fn,backendName:"webgpu",kernelFunc:Doe};var Poe=it({opType:ye.MIN,cpuKernelImpl:nL}),_B={kernelName:fo,backendName:"webgpu",kernelFunc:Poe};var bx=class{constructor(e,t,o){this.uniforms="",this.variableNames=["x"],this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=t.map((n,s)=>n[0]+e[s]+n[1]),this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.xShape=e,t.map((n,s)=>{this.uniforms+=` pad${s} : vec2,`}),this.offset=o==="reflect"?0:1,this.shaderKey=`mirrorPad_${o}`}getUserCode(){let e=this.xShape.length,t=this.xShape.map((u,c)=>`uniforms.pad${c}[0]`).join(","),o=this.xShape.map((u,c)=>`uniforms.pad${c}[0] + uniforms.xShape${e>1?`[${c}]`:""}`).join(","),n=e===1?"start":"start[i]",s=e===1?"end":"end[i]",a=e===1?"outC":"outC[i]",i=At(e),p=e>1?["coords[0]","coords[1]","coords[2]","coords[3]"].slice(0,e):"coords";return` + ${ue("index")} { + if (index < uniforms.size) { + let start = ${i}(${t}); + let end = ${i}(${o}); + var outC = getCoordsFromIndex(index); + for (var i = 0; i < ${e}; i = i + 1) { + if (${a} < ${n}) { + ${a} = ${n} * 2 - ${a} - ${this.offset}; + } else if(${a} >= ${s}) { + ${a} = (${s} - 1) * 2 - ${a} + ${this.offset}; + } + } + let coords = outC - start; + setOutputAtIndex(index, getX(${p})); + } + } + `}};var EB={kernelName:Dn,backendName:"webgpu",kernelFunc:({inputs:r,attrs:e,backend:t})=>{let{x:o}=r,{paddings:n,mode:s}=e,a=t,i=n.map(c=>({type:"int32",data:[c[0],c[1]]})),p=new bx(o.shape,n,s);return a.runWebGPUProgram(p,[o],o.dtype,i)}};function Ooe(r){let{inputs:e,backend:t}=r,{x:o}=e;if(t.shouldExecuteOnCPU([o])){let s=t.tensorMap.get(o.dataId),[a,i]=aL(s.values,o.shape,o.dtype);return t.makeTensorInfo(i,o.dtype,a)}let n=new Zo(o.shape,pe.NEG);return t.runWebGPUProgram(n,[o],o.dtype)}var $B={kernelName:Pn,backendName:"webgpu",kernelFunc:Ooe};function Moe(r){console.warn("tf.nonMaxSuppression() in webgpu locks the UI thread. Call tf.nonMaxSuppressionAsync() instead");let{inputs:e,backend:t,attrs:o}=r,{boxes:n,scores:s}=e,{maxOutputSize:a,iouThreshold:i,scoreThreshold:p}=o,u=t.readSync(n.dataId),c=t.readSync(s.dataId),{selectedIndices:l}=Bt.nonMaxSuppressionV3Impl(u,c,a,i,p);return t.makeTensorInfo([l.length],"int32",new Int32Array(l))}var RB={kernelName:On,backendName:"webgpu",kernelFunc:Moe};function Loe(r){console.warn("tf.nonMaxSuppression() in webgpu locks the UI thread. Call tf.nonMaxSuppressionAsync() instead");let{inputs:e,backend:t,attrs:o}=r,{boxes:n,scores:s}=e,{maxOutputSize:a,iouThreshold:i,scoreThreshold:p,softNmsSigma:u}=o,c=t.readSync(n.dataId),l=t.readSync(s.dataId),m=a,f=i,d=p,h=u,{selectedIndices:g,selectedScores:y}=Bt.nonMaxSuppressionV5Impl(c,l,m,f,d,h);return[t.makeTensorInfo([g.length],"int32",new Int32Array(g)),t.makeTensorInfo([y.length],"float32",new Float32Array(y))]}var AB={kernelName:Mn,backendName:"webgpu",kernelFunc:Loe};function om(r){let{inputs:e,backend:t}=r,{x:o}=e;if(o.dtype==="complex64"){let n=Wa({inputs:{input:o},backend:t}),s=om({inputs:{x:n},backend:t}),a=qu({inputs:{input:o},backend:t}),i=om({inputs:{x:a},backend:t}),p=ls({inputs:{real:s,imag:i},backend:t});return t.disposeData(n.dataId),t.disposeData(s.dataId),t.disposeData(a.dataId),t.disposeData(i.dataId),p}else return $o({attrs:{shape:o.shape,dtype:o.dtype,value:o.dtype==="string"?"":0},backend:t})}var FB={kernelName:Es,backendName:"webgpu",kernelFunc:om};function DB(r){let{inputs:e,backend:t}=r,{x:o}=e;if(o.dtype==="string")throw new Error("onesLike is not supported under string dtype");if(o.dtype==="complex64"){let n=Wa({inputs:{input:o},backend:t}),s=DB({inputs:{x:n},backend:t}),a=qu({inputs:{input:o},backend:t}),i=om({inputs:{x:a},backend:t}),p=ls({inputs:{real:s,imag:i},backend:t});return t.disposeData(n.dataId),t.disposeData(s.dataId),t.disposeData(a.dataId),t.disposeData(i.dataId),p}else return $o({attrs:{shape:o.shape,dtype:o.dtype,value:1},backend:t})}var PB={kernelName:Cs,backendName:"webgpu",kernelFunc:DB};function Boe(r){let{inputs:e,backend:t,attrs:o}=r,{axis:n}=o;if(e.length===1)return mx({inputs:{input:e[0]},backend:t,attrs:{dim:n}});let s=e[0].shape,a=e[0].dtype;e.forEach(c=>{x.assertShapesMatch(s,c.shape,"All tensors passed to stack must have matching shapes"),x.assert(a===c.dtype,()=>"All tensors passed to stack must have matching dtypes")});let i=[],p=e.map(c=>{let l=mx({inputs:{input:c},backend:t,attrs:{dim:n}});return i.push(l),l}),u=LS({inputs:p,backend:t,attrs:{axis:n}});return i.forEach(c=>t.disposeData(c.dataId)),u}var OB={kernelName:Is,backendName:"webgpu",kernelFunc:Boe};var Cx=class{constructor(e,t){this.variableNames=["x"],this.uniforms="constantValue : f32,",this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=t.map((o,n)=>o[0]+e[n]+o[1]),this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),t.map((o,n)=>{this.uniforms+=` pad${n} : vec2,`}),this.xShape=e,this.shaderKey="pad"}getUserCode(){let e=this.xShape.length,t=At(e),o=this.xShape.map((l,m)=>`uniforms.pad${m}[0]`).join(","),n=this.xShape.map((l,m)=>`uniforms.pad${m}[0] + uniforms.xShape${e>1?`[${m}]`:""}`).join(","),s=e>1?`${t}(${o})`:`${o}`,a=e>1?`${t}(${n})`:`${n}`,i=e>1?"any(outC < start)":"outC < start",p=e>1?"any(outC >= end)":"outC >= end",u=e>1?["coords[0]","coords[1]","coords[2]","coords[3]"].slice(0,e):"coords";return` + ${ue("index")} { + if (index < uniforms.size) { + let start = ${s}; + let end = ${a}; + let outC = getCoordsFromIndex(index); + + if (${i} || ${p}) { + setOutputAtIndex(index, uniforms.constantValue); + } else { + let coords = outC - start; + setOutputAtIndex(index, getX(${u})); + } + } + } + `}};var US=r=>{let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{paddings:s,constantValue:a}=o;if(s.every(u=>x.arraysEqual(u,[0,0])))return Lt({inputs:{x:n},backend:t});if(x.sizeFromShape(n.shape)===0){let u=s.map((c,l)=>c[0]+n.shape[l]+c[1]);return $o({backend:t,attrs:{shape:u,value:a,dtype:n.dtype}})}let i=[{type:"float32",data:[a]}];s.map(u=>i.push({type:"int32",data:[u[0],u[1]]}));let p=new Cx(n.shape,s);return t.runWebGPUProgram(p,[n],n.dtype,i)},MB={kernelName:Ln,backendName:"webgpu",kernelFunc:US};var Voe=it({opType:ye.POW}),LB={kernelName:Bn,backendName:"webgpu",kernelFunc:Voe};function zoe(r){let{inputs:e,backend:t}=r,{x:o,alpha:n}=e,s=new Hu(ye.PRELU,o.shape,n.shape);return t.runWebGPUProgram(s,[o,n],"float32")}var BB={kernelName:Vn,backendName:"webgpu",kernelFunc:zoe};function Woe(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{axis:s,keepDims:a}=o;return Ys(n,s,a,"prod",t)}var VB={kernelName:Ao,backendName:"webgpu",kernelFunc:Woe};var Uoe=r=>{let{backend:e,attrs:t}=r,{start:o,stop:n,step:s,dtype:a}=t,i=pL(o,n,s,a);return e.makeTensorInfo([i.length],a,i)},zB={kernelName:ws,backendName:"webgpu",kernelFunc:Uoe};var GS=it({opType:ye.DIV}),WB={kernelName:Cn,backendName:"webgpu",kernelFunc:GS};var Goe=Ge({opType:pe.RECIPROCAL}),UB={kernelName:ma,backendName:"webgpu",kernelFunc:Goe};var Hoe=Ge({opType:pe.RELU}),GB={kernelName:zn,backendName:"webgpu",kernelFunc:Hoe};var qoe=Ge({opType:pe.RELU6}),HB={kernelName:Gn,backendName:"webgpu",kernelFunc:qoe};var Ix=class{constructor(e,t,o){this.variableNames=["x"],this.uniforms="adjustHeightWidth : vec2, halfPixelCenters : f32,",this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=[e[0],t,o,e[3]],this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey="resizeBilinear"}getUserCode(){return` + ${ue("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + let b = coords[0]; + let d = coords[3]; + let rc = coords.yz; + + let effectiveInSize = vec2( + f32(uniforms.xShape.y) - uniforms.adjustHeightWidth[0], + f32(uniforms.xShape.z) - uniforms.adjustHeightWidth[1]); + + let effectiveOutSize = vec2( + f32(uniforms.outShape.y) - uniforms.adjustHeightWidth[0], + f32(uniforms.outShape.z) - uniforms.adjustHeightWidth[1]); + + let effectiveInputOverOutputRatioRC = + effectiveInSize / effectiveOutSize; + + // Fractional source index + let sourceFracIndexRC = + (vec2(rc) + vec2(uniforms.halfPixelCenters)) * + effectiveInputOverOutputRatioRC - vec2(uniforms.halfPixelCenters); + + // Compute the four integer indices. + let sourceFloorRC = vec2(sourceFracIndexRC); + let sourceCeilRC = vec2( + min(vec2(uniforms.xShape.yz) - vec2(1.0), ceil(sourceFracIndexRC))); + + let topLeft = getX(b, sourceFloorRC.x, sourceFloorRC.y, d); + let bottomLeft = getX(b, sourceCeilRC.x, sourceFloorRC.y, d); + let topRight = getX(b, sourceFloorRC.x, sourceCeilRC.y, d); + let bottomRight = getX(b, sourceCeilRC.x, sourceCeilRC.y, d); + + let fracRC = sourceFracIndexRC - vec2(sourceFloorRC); + + let top = topLeft + (topRight - topLeft) * fracRC.y; + let bottom = bottomLeft + (bottomRight - bottomLeft) * fracRC.y; + let newValue = top + (bottom - top) * fracRC.x; + + setOutputAtIndex(index, newValue); + } + } + `}};function Koe(r){let{inputs:e,backend:t,attrs:o}=r,{images:n}=e,{alignCorners:s,size:a,halfPixelCenters:i}=o,[p,u]=a,c=s&&p>1?1:0,l=s&&u>1?1:0,f=[{type:"float32",data:[c,l]},{type:"float32",data:[i?.5:0]}],d=new Ix(n.shape,p,u);return t.runWebGPUProgram(d,[n],"float32",f)}var qB={kernelName:Un,backendName:"webgpu",kernelFunc:Koe};var wx=class{constructor(e,t,o,n){this.variableNames=["x"],this.uniforms="adjustHeightWidth : vec2, roundBase : f32,",this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=[e[0],t,o,e[3]],this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.halfPixelCenters=n,this.shaderKey=`resizeNearest_${n}`}getUserCode(){let e;return this.halfPixelCenters?e="max((vec2(rc) + vec2(0.5)) * effectiveInputOverOutputRatioRC, vec2(0.0))":e="vec2(rc) * effectiveInputOverOutputRatioRC",` + ${ue("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + let b = coords[0]; + let d = coords[3]; + let rc = coords.yz; + + let effectiveInSize = vec2( + f32(uniforms.xShape.y) - uniforms.adjustHeightWidth[0], + f32(uniforms.xShape.z) - uniforms.adjustHeightWidth[1]); + + let effectiveOutSize = vec2( + f32(uniforms.outShape.y) - uniforms.adjustHeightWidth[0], + f32(uniforms.outShape.z) - uniforms.adjustHeightWidth[1]); + + let effectiveInputOverOutputRatioRC = + effectiveInSize / effectiveOutSize; + + // Fractional source index + let sourceFracIndexRC = ${e}; + + // Compute the coordinators of nearest neighbor point. + let inputShapeRC = vec2(f32(uniforms.xShape.y), f32(uniforms.xShape.z)); + let sourceNearestRC = vec2( + min(inputShapeRC - 1.0, floor(sourceFracIndexRC + uniforms.roundBase))); + let newValue = getX(b, sourceNearestRC.x, sourceNearestRC.y, d); + + setOutputAtIndex(index, newValue); + } + } + `}};function joe(r){let{inputs:e,backend:t,attrs:o}=r,{images:n}=e,{alignCorners:s,halfPixelCenters:a,size:i}=o,[p,u]=i,c=s&&p>1?1:0,l=s&&u>1?1:0,f=[{type:"float32",data:[c,l]},{type:"float32",data:[s?.5:0]}],d=new wx(n.shape,p,u,a);return t.runWebGPUProgram(d,[n],n.dtype,f)}var KB={kernelName:Wn,backendName:"webgpu",kernelFunc:joe};var Sx=class{constructor(e,t){this.outputShape=[],this.variableNames=["x"],this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=e,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.uniforms=`centerX : f32, centerY : f32, sinRadians : f32, + cosRadians : f32,`,this.shaderKey="rotate",this.outputShape=e,typeof t=="number"?(this.uniforms+=" fillValue : f32,",this.fillSnippet="var outputValue = uniforms.fillValue;",this.shaderKey+="_float"):(this.uniforms+=" fillValue : vec3,",this.fillSnippet="var outputValue = uniforms.fillValue[coords[3]];",this.shaderKey+="_vec3")}getUserCode(){return` + ${ue("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + let coordXFloat = (f32(coords[2]) - uniforms.centerX) * + uniforms.cosRadians - (f32(coords[1]) - uniforms.centerY) * + uniforms.sinRadians; + let coordYFloat = (f32(coords[2]) - uniforms.centerX) * + uniforms.sinRadians + (f32(coords[1]) - uniforms.centerY) * + uniforms.cosRadians; + let coordX = i32(round(coordXFloat + uniforms.centerX)); + let coordY = i32(round(coordYFloat + uniforms.centerY)); + ${this.fillSnippet} + if(coordX >= 0 && coordX < uniforms.xShape[2] && coordY >= 0 && + coordY < uniforms.xShape[1]) { + outputValue = getX(coords[0], coordY, coordX, coords[3]); + } + setOutputAtIndex(index, outputValue); + } + } + `}};var jB={kernelName:es,backendName:"webgpu",kernelFunc:({inputs:r,attrs:e,backend:t})=>{let{image:o}=r,{radians:n,fillValue:s,center:a}=e,i=t,p=new Sx(o.shape,s),[u,c]=I.getImageCenter(a,o.shape[1],o.shape[2]),l=[{type:"float32",data:[u]},{type:"float32",data:[c]},{type:"float32",data:[Math.sin(n)]},{type:"float32",data:[Math.cos(n)]}];return typeof s=="number"?l.push({type:"float32",data:[Number.parseFloat(s.toFixed(2))]}):l.push({type:"float32",data:s}),i.runWebGPUProgram(p,[o],o.dtype,l)}};var Xoe=Ge({opType:pe.RSQRT,cpuKernelImpl:cL}),XB={kernelName:xo,backendName:"webgpu",kernelFunc:Xoe};var Fi=class{constructor(e,t,o,n,s,a,i,p=!0){this.variableNames=["updates","indices"],this.workGroupSize=[64,1,1],this.atomic=!0,this.outputShape=a,this.type=i,this.sumDupeIndices=p,this.dispatchLayout=fe(e),this.dispatch=ae(this.dispatchLayout,e,this.workGroupSize),this.sliceDimGreaterThanOne=t>1,this.shaderKey=`scatter_${o}_${n}_${this.sliceDimGreaterThanOne}_${i}_${p}`;let u=At(s.length);this.uniforms=`sliceDim : i32, strides: ${u}, size: i32,`,this.updatesRank=n,this.indicesRank=o}getUserCode(){let e="";this.indicesRank===1?e="coords[0]":this.indicesRank===2&&(e="coords[0], j");let t=`getIndices(${e})`,o=this.sliceDimGreaterThanOne?"uniforms.strides[j]":"uniforms.strides",n="",s="";this.dispatchLayout.x.length===1?(n="flattenedIndex",s=` + fn getUpdatesCoordsFromFlatIndex(index : i32) -> i32 { + return index; + } + `):this.dispatchLayout.x.length===2&&(n="vec2(flattenedIndex, coords[1])",s=` + fn getUpdatesCoordsFromFlatIndex(index : i32) -> vec2 { + // N.B. |updates| could be a scalar tensor, conceptually representing a + // 2D tensor with all values equal to that. By design, its size must be + // the same as |outShape[1]| in one dimension, and |indicesShape[0]| + // gives the other. + let sliceSize = uniforms.outShape[1]; + let d0 = index / sliceSize; + let d1 = index - d0 * sliceSize; + return vec2(d0, d1); + } + `);let i=`getUpdates(${Array.from({length:this.updatesRank},(c,l)=>`coords[${l}]`).join(", ")})`,p=(c,l)=>{let m=`atomicAdd(${c}, bitcast(${l}))`;this.type==="float32"&&(m=` + { + var oldBits = 0; + var newBits = bitcast(${l}); + loop { + let info = atomicCompareExchangeWeak(${c}, oldBits, newBits); + if (info.exchanged) { + break; + } + oldBits = info.old_value; + let oldValue = bitcast(oldBits); + let newValue = oldValue + (${l}); + newBits = bitcast(newValue); + } + } + `);let f=`atomicStore(${c}, bitcast(${l}));`;return this.sumDupeIndices?m:f};return` + ${s} + + ${ue("index")} { + if (index < uniforms.size) { + let coords = getUpdatesCoordsFromFlatIndex(index); + var flattenedIndex = 0; + for (var j = 0; j < uniforms.sliceDim; j = j + 1) { + let indexInside = i32(round(${t})); + flattenedIndex = flattenedIndex + indexInside * ${o}; + } + let updateValue = + ${Tc(this.type,!1)}(${i}); + let flatIndex = getOutputIndexFromCoords(${n}); + + ${p("&result[flatIndex]","updateValue")}; + } + }`}};function Yoe(r){let{inputs:e,backend:t,attrs:o}=r,{indices:n,updates:s}=e,{shape:a}=o,{sliceRank:i,numUpdates:p,sliceSize:u,strides:c,outputSize:l}=I.calculateShapes(s,n,a),m=[l/u,u];if(l===0)return t.makeTensorInfo(a,n.dtype);let f=xe({inputs:{x:n},backend:t,attrs:{shape:[p,i]}}),d=xe({inputs:{x:s},backend:t,attrs:{shape:[p,u]}}),h=d.dtype,g=$o({backend:t,attrs:{shape:m,value:0,dtype:h}}),y=x.sizeFromShape(d.shape),b=[{type:"int32",data:[i]},{type:"int32",data:c},{type:"int32",data:[y]}],C=new Fi(d.shape,i,f.shape.length,d.shape.length,c,m,h),w=t.runWebGPUProgram(C,[d,f],h,b,g),k=xe({inputs:{x:w},backend:t,attrs:{shape:a}});return t.disposeData(f.dataId),t.disposeData(d.dataId),t.disposeData(w.dataId),k}var YB={kernelName:Hn,backendName:"webgpu",kernelFunc:Yoe};var vx=class{constructor(e,t,o){this.variableNames=["c","a","b"],this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=t,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.cRank=e,this.rank=o,this.shaderKey="select"}getUserCode(){let e,t;if(this.rank>4)throw Error(`Where for rank ${this.rank} is not yet supported`);if(this.rank===1)t="resRC",e="resRC";else{let n=["resRC.x","resRC.y","resRC.z","resRC.w"],s=[],a=[];for(let i=0;i= 1.0) { + setOutputAtIndex(index, getA(${t})); + } else { + setOutputAtIndex(index, getB(${t})); + } + } + } + `}};function Qoe(r){let{inputs:e,backend:t}=r,{condition:o,t:n,e:s}=e,a=new vx(o.shape.length,n.shape,n.shape.length);return t.runWebGPUProgram(a,[o,n,s],ct(n.dtype,s.dtype))}var QB={kernelName:vs,backendName:"webgpu",kernelFunc:Qoe};var Zoe=Ge({opType:pe.SIGMOID}),ZB={kernelName:yo,backendName:"webgpu",kernelFunc:Zoe};var Joe=Ge({opType:pe.SIN}),JB={kernelName:Kn,backendName:"webgpu",kernelFunc:Joe};var ene=Ge({opType:pe.SINH}),eV={kernelName:ha,backendName:"webgpu",kernelFunc:ene};var HS=it({opType:ye.SUB,cpuKernelImpl:gL,supportsComplex:!0}),tV={kernelName:Io,backendName:"webgpu",kernelFunc:HS};function tne(r){let{inputs:e,backend:t,attrs:o}=r,{logits:n}=e,{dim:s}=o,a=x.parseAxisParam([s],n.shape),i=em({inputs:{x:n},backend:t,attrs:{reductionIndices:a,keepDims:!1}}),p=I.expandShapeToKeepDim(i.shape,a),u=xe({inputs:{x:i},backend:t,attrs:{shape:p}}),c=HS({inputs:{a:n,b:u},backend:t}),l=VS({inputs:{x:c},backend:t}),m=rm({inputs:{x:l},backend:t,attrs:{axis:a,keepDims:!1}}),f=xe({inputs:{x:m},backend:t,attrs:{shape:p}}),d=GS({inputs:{a:l,b:f},backend:t});return t.disposeData(i.dataId),t.disposeData(u.dataId),t.disposeData(c.dataId),t.disposeData(l.dataId),t.disposeData(m.dataId),t.disposeData(f.dataId),d}var rV={kernelName:Xn,backendName:"webgpu",kernelFunc:tne};var rne=r=>{let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{blockShape:s,paddings:a}=o;x.assert(n.shape.length<=4,()=>"spaceToBatchND for rank > 4 with a WebGPU backend not implemented yet");let i=s.reduce((y,b)=>y*b),p=[[0,0]];p.push(...a);for(let y=1+s.length;yt.disposeData(y.dataId)),g},oV={kernelName:ks,backendName:"webgpu",kernelFunc:rne};var kx=class{constructor(e,t){this.variableNames=["A"],this.workGroupSize=[64,1,1],this.size=!0;let o=new Array(e.length);for(let n=0;n=5)throw Error(`Tile for rank ${r} is not yet supported`);if(r===1)return`(resRC % ${e}aShape)`;let t=["resRC.x","resRC.y","resRC.z","resRC.w"],o=[];for(let n=0;n=5){let p=t.readSync(n.dataId),u=n.dtype==="string"?p.map(m=>x.decodeString(m)):p,c=ne(n.shape,n.dtype,u),l=xL(c,s);return t.makeTensorInfo(l.shape,l.dtype,l.values)}let a=new kx(n.shape,s);return t.runWebGPUProgram(a,[n],n.dtype)}var nV={kernelName:wo,backendName:"webgpu",kernelFunc:qS};function nne(r){let{inputs:e,backend:t,attrs:o}=r,{sparseIndices:n,sparseValues:s,defaultValue:a}=e,{outputShape:i}=o,{sliceRank:p,numUpdates:u,sliceSize:c,strides:l,outputSize:m}=I.calculateShapes(s,n,i),f=!1;if(s.dtype==="string"){let R=t.bufferSync(n),A=t.bufferSync(s),D=x.decodeString(t.readSync(a.dataId)[0]),O=lL(R,A,i,m,c,u,p,l,D,f);return t.makeTensorInfo(i,O.dtype,O.values)}let d=[m/c,c],h=xe({inputs:{x:n},backend:t,attrs:{shape:[u,p]}}),g=s.shape.length?xe({inputs:{x:s},backend:t,attrs:{shape:[u,c]}}):Lt({inputs:{x:s},backend:t}),y=g.dtype,b=t.makeTensorInfo([],y,x.makeZerosTypedArray(1,y)),C=xe({inputs:{x:a},backend:t,attrs:{shape:Array(d.length).fill(1)}}),w=qS({inputs:{x:C},backend:t,attrs:{reps:d}}),k=x.sizeFromShape([u,c]),_=[{type:"int32",data:[p]},{type:"int32",data:l},{type:"int32",data:[k]}];switch(u){case 0:break;case 1:{let R=new Fi([u,c],p,h.shape.length,g.shape.length,l,d,y,f);t.runWebGPUProgram(R,[g,h],y,_,w)}break;default:{let R=new Fi([u,c],p,h.shape.length,b.shape.length,l,d,y,f);t.runWebGPUProgram(R,[b,h],y,_,w)}{let R=new Fi([u,c],p,h.shape.length,g.shape.length,l,d,y);t.runWebGPUProgram(R,[g,h],y,_,w)}}let E=xe({inputs:{x:w},backend:t,attrs:{shape:i}});return t.disposeData(h.dataId),t.disposeData(g.dataId),t.disposeData(C.dataId),t.disposeData(b.dataId),t.disposeData(w.dataId),E}var sV={kernelName:ei,backendName:"webgpu",kernelFunc:nne};function sne(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{numOrSizeSplits:s,axis:a}=o,i=x.parseAxisParam(a,n.shape)[0],p=I.prepareSplitSize(n,s,i),u=n.shape.length,c=new Array(u).fill(0),l=n.shape.slice();return p.map(m=>{let f=[...l];f[i]=m;let d=ms({inputs:{x:n},backend:t,attrs:{begin:c,size:f}});return c[i]+=m,d})}var aV={kernelName:Ts,backendName:"webgpu",kernelFunc:sne};var ane=Ge({opType:pe.SQRT}),iV={kernelName:bo,backendName:"webgpu",kernelFunc:ane};var uV={kernelName:ti,backendName:"webgpu",kernelFunc:({inputs:r,backend:e})=>{let{x:t}=r,o=e,n=new Zo(t.shape,pe.SQUARE);return o.runWebGPUProgram(n,[t],t.dtype)}};var ine=it({opType:ye.SQUARED_DIFFERENCE}),pV={kernelName:Co,backendName:"webgpu",kernelFunc:ine};var Tx=class{constructor(e){this.variableNames=["x"],this.workPerThread=1,this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=e,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize,[this.workPerThread,1,1]);let t=At(this.outputShape.length);this.uniforms=`begin : ${t}, strides : ${t}, `,this.shaderKey="stridedSlice"}getUserCode(){let e=this.outputShape.length,t="";if(e===1)t="coords * uniforms.strides + uniforms.begin";else{let n=0;t=this.outputShape.map((s,a)=>(n++,this.outputShape.length===1?`coords * uniforms.strides[${a}] + uniforms.begin[${a}]`:`coords[${n-1}] * uniforms.strides[${a}] + uniforms.begin[${a}]`)).join(",")}return` + ${ue("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + setOutputAtIndex(index, getX(${t})); + } + } + `}};function une(r){let{inputs:e,backend:t,attrs:o}=r,{x:n}=e,{begin:s,end:a,strides:i,beginMask:p,endMask:u,ellipsisMask:c,newAxisMask:l,shrinkAxisMask:m}=o,{finalShapeSparse:f,finalShape:d,isIdentity:h,sliceDim0:g,isSimpleSlice:y,begin:b,end:C,strides:w}=et.sliceInfo(n.shape,s,a,i,p,u,c,l,m),k;if(h)k=xe({inputs:{x:n},backend:t,attrs:{shape:d}});else if(g||y){x.assert(n.shape.length>=1,()=>`Input must have rank at least 1, got: ${n.shape.length}`);let _=et.computeOutShape(b,C,w),E=ms({inputs:{x:n},backend:t,attrs:{begin:b,size:_}});k=xe({inputs:{x:E},backend:t,attrs:{shape:d}}),t.disposeData(E.dataId)}else if(t.shouldExecuteOnCPU([n])){let E=t.readSync(n.dataId),R=ne(n.shape,n.dtype,E),A=dL(f,R,w,b);k=t.makeTensorInfo(d,n.dtype,A.values)}else{let E=new Tx(f),R=[{type:"int32",data:b},{type:"int32",data:w}],A=t.runWebGPUProgram(E,[n],n.dtype,R);k=xe({inputs:{x:A},backend:t,attrs:{shape:d}}),t.disposeData(A.dataId)}return k}var cV={kernelName:Yn,backendName:"webgpu",kernelFunc:une};function pne(r){let{inputs:e,backend:t,attrs:o}=r,{separator:n,nGramWidths:s,leftPad:a,rightPad:i,padWidth:p,preserveShortSequences:u}=o,{data:c,dataSplits:l}=e,m=t.readSync(c.dataId),f=t.readSync(l.dataId),[d,h]=hL(m,f,n,s,a,i,p,u);return[t.makeTensorInfo([d.length],"string",d),t.makeTensorInfo(l.shape,"int32",h)]}var lV={kernelName:Ns,backendName:"webgpu",kernelFunc:pne};var cne=Ge({opType:pe.TANH}),mV={kernelName:Qn,backendName:"webgpu",kernelFunc:cne};var Nx=class{constructor(e){this.variableNames=["x","indices"],this.workGroupSize=[256,1,1],this.size=!0,this.outputShape=e,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.uniforms=`inputSize : i32, firstPass : i32, negativeInf : f32, + dir : i32, inc : i32,`,this.shaderKey="swap"}getUserCode(){return` + ${ue("index")} { + if (index < uniforms.size) { + let outC = getCoordsFromIndex(index); + let batch = outC[0]; + let elemIdx = outC[1]; + // We compare elements pair-wise within a group of size 2 * inc. + // The comparing rule for each group alternates between ascending + // and descending. Within each group, we compare each pair at + // positions i and i+inc. To decide whether an element at position i + // is x0 or x1, we mod it by 2 * inc, if the result is smaller than + // inc, it is in the first half of the group, we denote it as x0, + // otherwise we denote it as x1. + // For example, as shown in the Bitonic top K paper referenced + // above, Figure5(a) shows that element[1] is in the second half of + // the group when group size is 2, but it is in the first half of + // the group when group size is 4. + let isFirstInPair = elemIdx % (2 * uniforms.inc) < uniforms.inc; + var i = 0; + if (isFirstInPair) { + i = elemIdx; + } else { + i = elemIdx - uniforms.inc; + } + + var i0 = 0; + if (uniforms.firstPass == 1) { + i0 = i; + } else { + i0 = i32(getIndices(batch, i)); + } + + var i1 = 0; + if (uniforms.firstPass == 1) { + i1 = i + uniforms.inc; + } else { + i1 = i32(getIndices(batch, i + uniforms.inc)); + } + + var x0 = f32(0.0); + var x1 = f32(0.0); + if (i0 < uniforms.inputSize) { + x0 = getX(batch, i0); + } else { + x0 = uniforms.negativeInf; + } + if (i1 < uniforms.inputSize) { + x1 = getX(batch, i1); + } else { + x1 = uniforms.negativeInf; + } + + let reverse = elemIdx % (2 * uniforms.dir) >= uniforms.dir; + let isGreater = x0 > x1 || (x0 == x1 && i1 > i0); + if (reverse == isGreater) { + // Elements in opposite order of direction + let iTemp = i0; + i0 = i1; + i1 = iTemp; + } + if (isFirstInPair) { + setOutputAtIndex(index, f32(i0)); + } else { + setOutputAtIndex(index, f32(i1)); + } + } + } + `}},_x=class{constructor(e){this.variableNames=["x","indices"],this.workGroupSize=[256,1,1],this.size=!0,this.outputShape=e,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.uniforms="inputSize : i32, firstPass : i32, k : i32,",this.shaderKey="merge"}getUserCode(){return` + ${ue("index")} { + if (index < uniforms.size) { + let outC = getCoordsFromIndex(index); + let batch = outC[0]; + let elemIdx = outC[1]; + // The output size is half of the previous size. + // If the previous sequence is | | | | _ _ _ _ | | | | _ _ _ _ + // (k=4), we only need to output the indices at positions |, the + // indices at positions _ can be thrown away, see Figure5(b) After + // Phase 2 (Merge phase) in the Bitonic Top K paper referenced + // above. + // For example, the paper shows we only need to output the orange + // bars. The output sequence should look like this | | | | | | | |. + // Because the sequence is halved, to map the output index back to + // the previous sequence to find the corresponding value, we need + // to double the index. When we double the index, we basically + // interpolate a position, so 2i looks like + // | _ | _ | _ | _ | _ | _ | _. We move the | to the first k + // position of each 2k positions by - elemIdx % k. E.g. for output + // at index 4,5,6,7, we want to get the corresponding element at + // original index 8,9,10,11, for output at index 8,9,10,11, + // we want to get the corresponding element at original index + // 16,17,18,19, so on and so forth. + + var i = 0; + if (elemIdx < uniforms.k) { + i = elemIdx; + } else { + i = elemIdx * 2 - elemIdx % uniforms.k; + } + var i0 = 0; + if (uniforms.firstPass == 1) { + i0 = i; + } else { + i0 = i32(getIndices(batch, i)); + } + var i1 = 0; + if (uniforms.firstPass == 1) { + i1 = i + uniforms.k; + } else { + i1 = i32(getIndices(batch, i + uniforms.k)); + } + + let x0 = getX(batch, i0); + var x1 = f32(0.0); + if (i1 < uniforms.inputSize) { + x1 = getX(batch, i1); + } else { + x1 = x0; + } + + if (x0 >= x1) { + setOutputAtIndex(index, f32(i0)); + } else { + setOutputAtIndex(index, f32(i1)); + } + } + } + `}};function Mc(r,e){e!==null&&r.disposeData(e.dataId)}function fV(r){let e=1;for(;ed===null?[l,l]:[l,d],g=(k,_,E)=>{let R=h(),A=new Nx(E),O=[{type:"int32",data:[p]},{type:"int32",data:[d===null?1:0]},{type:"float32",data:[Number.NEGATIVE_INFINITY]},{type:"int32",data:[k]},{type:"int32",data:[_]}],M=d;d=t.runWebGPUProgram(A,R,"int32",O),Mc(t,M)};for(let k=1;k=1;E/=2)g(_,E,[c,f])}for(let k=f;k>m;k/=2){let _=h(),E=new _x([c,k/2]),A=[{type:"int32",data:[p]},{type:"int32",data:[d===null?1:0]},{type:"int32",data:[m]}],D=d;d=t.runWebGPUProgram(E,_,"int32",A),Mc(t,D);let O=m/2,M=O*2;for(let L=O;L>=1;L/=2)g(M,L,d.shape)}let y=d;d=ms({inputs:{x:d},backend:t,attrs:{begin:0,size:[c,s]}}),Mc(t,y);let b=WS({inputs:{x:l,indices:d},backend:t,attrs:{axis:1,batchDims:1}});Mc(t,l);let C=i.slice(0,-1);C.push(s),y=d,d=xe({inputs:{x:d},attrs:{shape:C},backend:t}),Mc(t,y);let w=b;return b=xe({inputs:{x:b},attrs:{shape:C},backend:t}),Mc(t,w),[b,d]}var dV={kernelName:Zn,backendName:"webgpu",kernelFunc:lne};var Ex=class{constructor(e){this.variableNames=["Image","Transforms"],this.uniforms="interpolationModeId : i32, fillModeId : i32, fillValue : f32,",this.workGroupSize=[64,1,1],this.size=!0,this.outputShape=e,this.dispatchLayout=fe(this.outputShape),this.dispatch=ae(this.dispatchLayout,this.outputShape,this.workGroupSize),this.shaderKey="transform"}getUserCode(){return` + fn mapCoord(outCoord : f32, len : f32) -> f32{ + var inCoord = outCoord; + if(uniforms.fillModeId == 2) { + if (inCoord < 0.0) { + if (len <= 1.0) { + inCoord = 0.0; + } else { + let sz2 = 2.0 * len; + if (inCoord < sz2) { + inCoord = sz2 * f32(i32(f32(-inCoord / sz2))) + + inCoord; + } + if (inCoord < -len) { + inCoord = inCoord + sz2; + } else { + inCoord = -inCoord - 1.0; + } + } + } else if (inCoord > len - 1.0) { + if (len <= 1.0) { + inCoord = 0.0; + } else { + let sz2 = 2.0 * len; + inCoord = inCoord - sz2 * f32(i32(f32(inCoord / sz2))); + if (inCoord >= len) { + inCoord = sz2 - inCoord - 1.0; + } + } + } + return clamp(inCoord, 0.0, len - 1.0); + } else if (uniforms.fillModeId == 3) { + if (inCoord < 0.0) { + if (len <= 1.0) { + inCoord = 0.0; + } else { + let sz = len - 1.0; + inCoord = inCoord + len * (f32(i32(f32(-inCoord / sz))) + 1.0); + } + } else if (inCoord > len - 1.0) { + if (len <= 1.0) { + inCoord = 0.0; + } else { + let sz = len - 1.0; + inCoord = inCoord - len * f32(i32(f32(inCoord / sz))); + } + } + return clamp(inCoord, 0.0, len - 1.0); + } else if (uniforms.fillModeId == 4) { + return clamp(outCoord, 0.0, len - 1.0); + } + return outCoord; + } + fn readWithFillValue(batch : i32, coordY : i32, coordX : i32, + channel : i32) -> f32 { + var outputValue : f32; + if (0 <= coordY && coordY < uniforms.imageShape[1] && 0 <= coordX && coordX < uniforms.imageShape[2]) { + outputValue = getImage(batch, coordY, coordX, channel); + } else { + outputValue = uniforms.fillValue; + } + return outputValue; + } + + ${ue("index")} { + if (index < uniforms.size) { + let coords = getCoordsFromIndex(index); + var outputValue : f32; + let batch = coords[0]; + let x = coords[2]; + let y = coords[1]; + let channel = coords[3]; + let xf = f32(x); + let yf = f32(y); + let a1 = getTransforms(batch, 0); + let a2 = getTransforms(batch, 1); + let a3 = getTransforms(batch, 2); + let b1 = getTransforms(batch, 3); + let b2 = getTransforms(batch, 4); + let b3 = getTransforms(batch, 5); + let c1 = getTransforms(batch, 6); + let c2 = getTransforms(batch, 7); + let projection = c1 * xf + c2 * yf + 1.0; + if (projection == 0.0) { + outputValue = uniforms.fillValue; + } else { + let inX = (a1 * xf + a2 * yf + a3) / projection; + let inY = (b1 * xf + b2 * yf + b3) / projection; + let mapX = mapCoord(inX, f32(uniforms.imageShape[2])); + let mapY = mapCoord(inY, f32(uniforms.imageShape[1])); + + if (uniforms.interpolationModeId == 1) { + let coordY = i32(round(mapY)); + let coordX = i32(round(mapX)); + outputValue = readWithFillValue(batch, coordY, coordX, + channel); + } else { + let yFloor = floor(mapY); + let xFloor = floor(mapX); + let yCeil = yFloor + 1.0; + let xCeil = xFloor + 1.0; + let valueYFloor = (xCeil - mapX) * + readWithFillValue(batch, i32(yFloor), i32(xFloor), channel) + + (mapX - xFloor) * + readWithFillValue(batch, i32(yFloor), i32(xCeil), channel); + let valueYCeil = (xCeil - mapX) * + readWithFillValue(batch, i32(yCeil), i32(xFloor), channel) + + (mapX - xFloor) * + readWithFillValue(batch, i32(yCeil), i32(xCeil), channel); + outputValue = (yCeil - mapY) * valueYFloor + + (mapY - yFloor) * valueYCeil; + } + } + setOutputAtIndex(index, outputValue); + } + } + `}};function mne(r){let{inputs:e,backend:t,attrs:o}=r,{image:n,transforms:s}=e,{interpolation:a,fillMode:i,fillValue:p,outputShape:u}=o,[c,l,m,f]=n.shape,[d,h]=u!=null?u:[l,m],g=[c,d,h,f],y=new Ex(g),b=a==="nearest"?1:2,C;switch(i){case"constant":C=1;break;case"reflect":C=2;break;case"wrap":C=3;break;case"nearest":C=4;break;default:C=1;break}let w=[{type:"int32",data:[b]},{type:"int32",data:[C]},{type:"float32",data:[p]}];return t.runWebGPUProgram(y,[n,s],"float32",w)}var hV={kernelName:Jn,backendName:"webgpu",kernelFunc:mne};function fne(r){let{inputs:e,backend:t,attrs:o}=r,{value:n}=e,{axis:s}=o;s<0&&(s+=n.shape.length);let a=n,i=a.shape.length,p=n.shape[s],u=new Array(i-1),c=0;for(let h=0;ht.disposeData(h.dataId)),d}var gV={kernelName:_s,backendName:"webgpu",kernelFunc:fne};var dne=[aM,CL,IL,wL,vL,kL,TL,EL,$L,AL,OL,ML,LL,uM,VL,WL,UL,GL,HL,qL,XL,YL,QL,ZL,tB,rB,oB,nB,sB,aB,nM,iB,cB,uB,pB,lB,mB,fB,dB,hB,gB,xB,iM,BL,yB,bB,CB,IB,wB,SB,vB,NL,kB,TB,_L,NB,_B,EB,JL,$B,RB,AB,FL,PB,OB,MB,LB,BB,VB,zB,DL,WB,UB,GB,HB,sM,qB,KB,jB,XB,YB,QB,ZB,JB,eV,RL,cV,lV,rV,oV,sV,aV,iV,uV,pV,tV,eB,mV,nV,dV,hV,SL,gV,FB];for(let r of dne)ya(r);var xV="4.0.0",hne="4.0.0",gne="4.0.0",xne="4.0.0",yne="4.0.0",bne="0.0.1-alpha.14",Cne={tfjs:xV,"tfjs-core":xV,"tfjs-converter":hne,"tfjs-backend-cpu":gne,"tfjs-backend-webgl":xne,"tfjs-backend-wasm":yne,"tfjs-backend-webgpu":bne};export{sn as Abs,Li as Acos,Bi as Acosh,xi as AdadeltaOptimizer,yi as AdagradOptimizer,bi as AdamOptimizer,Ci as AdamaxOptimizer,_r as Add,an as AddN,oa as All,na as Any,un as ArgMax,ja as ArgMin,Vi as Asin,zi as Asinh,Wi as Atan,sa as Atan2,Ui as Atanh,pn as AvgPool,ip as AvgPool3D,Fm as AvgPool3DGrad,Am as AvgPoolGrad,Gl as BackendWasm,cn as BatchMatMul,hs as BatchToSpaceND,up as Bincount,pp as BroadcastArgs,Tne as BroadcastTo,to as Cast,ro as Ceil,Ro as ClipByValue,aa as Complex,cp as ComplexAbs,gs as Concat,ln as Conv2D,lp as Conv2DBackpropFilter,mn as Conv2DBackpropInput,mp as Conv3D,Dm as Conv3DBackpropFilterV2,fp as Conv3DBackpropInputV2,fn as Cos,dn as Cosh,xn as CropAndResize,hn as Cumprod,gn as Cumsum,rn as DataStorage,dp as DenseBincount,yn as DepthToSpace,bn as DepthwiseConv2dNative,hp as DepthwiseConv2dNativeBackpropFilter,gp as DepthwiseConv2dNativeBackpropInput,xp as Diag,yp as Dilation2D,vb as Dilation2DBackpropFilter,Sb as Dilation2DBackpropInput,Cb as ENV,Xa as Einsum,In as Elu,Pm as EluGrad,Qc as Environment,oo as Equal,Gi as Erf,no as Exp,xs as ExpandDims,wn as Expm1,bp as FFT,ys as Fill,Sn as FlipLeftRight,so as Floor,vn as FloorDiv,Zi as FromPixels,kn as FusedBatchNorm,Do as FusedConv2D,Po as FusedDepthwiseConv2D,Fu as GPGPUContext,Tn as GatherNd,bs as GatherV2,bl as GraphModel,ao as Greater,io as GreaterEqual,Cp as IFFT,uo as Identity,Ya as Imag,Hi as IsFinite,qi as IsInf,ia as IsNan,Jr as KernelBackend,wp as LRN,Om as LRNGrad,Nn as LeakyRelu,po as Less,co as LessEqual,Ip as LinSpace,lo as Log,Ki as Log1p,Nne as LogSoftmax,_n as LogicalAnd,En as LogicalNot,ua as LogicalOr,g0 as LogicalXor,_ne as LowerBound,Si as MathBackendCPU,Ni as MathBackendWebGL,$n as Max,Rn as MaxPool,Sp as MaxPool3D,Lm as MaxPool3DGrad,Mm as MaxPoolGrad,vp as MaxPoolWithArgmax,mo as Maximum,An as Mean,Fn as Min,fo as Minimum,Dn as MirrorPad,ji as Mod,Ii as MomentumOptimizer,kp as Multinomial,ho as Multiply,Pn as Neg,On as NonMaxSuppressionV3,pa as NonMaxSuppressionV4,Mn as NonMaxSuppressionV5,go as NotEqual,Ub as OP_SCOPE_SUFFIX,ca as OneHot,Cs as OnesLike,wr as Optimizer,ns as OptimizerConstructors,Is as Pack,Ln as PadV2,Ene as Pool,Bn as Pow,Vn as Prelu,Ao as Prod,wi as RMSPropOptimizer,Tp as RaggedGather,Np as RaggedRange,_p as RaggedTensorToTensor,ws as Range,Fb as Rank,la as Real,Cn as RealDiv,ma as Reciprocal,Et as Reduction,zn as Relu,Gn as Relu6,Ss as Reshape,Un as ResizeBilinear,Vm as ResizeBilinearGrad,Wn as ResizeNearestNeighbor,Bm as ResizeNearestNeighborGrad,fa as Reverse,es as RotateWithOffset,da as Round,xo as Rsqrt,Us as SGDOptimizer,Hn as ScatterNd,Ep as SearchSorted,vs as Select,Xi as Selu,yo as Sigmoid,Yi as Sign,Kn as Sin,ha as Sinh,qn as Slice,Xn as Softmax,Qi as Softplus,ks as SpaceToBatchND,Qa as SparseFillEmptyRows,ga as SparseReshape,Za as SparseSegmentMean,Ja as SparseSegmentSum,ei as SparseToDense,Ts as SplitV,bo as Sqrt,ti as Square,Co as SquaredDifference,$s as Step,Yn as StridedSlice,Ns as StringNGrams,ri as StringSplit,oi as StringToHashBucketFast,Io as Sub,jn as Sum,xa as Tan,Qn as Tanh,ut as Tensor,je as TensorBuffer,wo as Tile,Zn as TopK,Jn as Transform,Mr as Transpose,$p as Unique,_s as Unpack,Rp as UnsortedSegmentSum,$ne as UpperBound,ba as Variable,Ai as WebGPUBackend,Es as ZerosLike,Fo as _FusedMatMul,Qt as abs,Vv as acos,zv as acosh,ge as add,Wv as addN,Uv as all,Gv as any,Hv as argMax,qv as argMin,Kv as asin,jv as asinh,Xv as atan,Yv as atan2,Qv as atanh,mf as avgPool,ek as avgPool3d,Bie as backend,I as backend_util,tk as basicLSTMCell,li as batchNorm,ok as batchNorm2d,nk as batchNorm3d,sk as batchNorm4d,ff as batchToSpaceND,df as bincount,_H as booleanMaskAsync,ak as broadcastArgs,Ls as broadcastTo,br as broadcast_util,Sv as browser,ne as buffer,qe as cast,ik as ceil,uk as clipByValue,zr as clone,Er as complex,gt as concat,pk as concat1d,ck as concat2d,lk as concat3d,mk as concat4d,fk as conv1d,mi as conv2d,dk as conv2dTranspose,hk as conv3d,xk as conv3dTranspose,Lne as copyRegisteredKernels,yk as cos,bk as cosh,hl as cosineWindow,Ck as cumprod,Ik as cumsum,Cr as customGrad,wk as denseBincount,sC as deprecationWarn,Sk as depthToSpace,Gp as depthwiseConv2d,YK as deregisterOp,ii as device_util,vk as diag,kk as dilation2d,_ie as disableDeprecationWarnings,Ft as dispose,Eie as disposeVariables,We as div,Tk as divNoNan,Nk as dot,BH as dropout,_k as einsum,xf as elu,Nie as enableDebugMode,Tie as enableProdMode,wC as enclosingPowerOfTwo,cr as engine,P as env,gf as equal,Ek as erf,Ak as euclideanNorm,Bo as exp,_a as expandDims,Fk as expm1,yf as eye,qp as fft,Bs as fill,Mie as findBackend,Lie as findBackendFactory,bf as floor,cf as floorDiv,pR as forceHalfFloat,SC as fused,Cf as gather,MH as gatherND,af as gather_util,Pie as getBackend,kb as getGradient,el as getKernel,zm as getKernelsForBackend,nte as getThreadsCount,Sw as gpgpu_util,GG as grad,HG as grads,cu as greater,If as greaterEqual,hu as ifft,ci as imag,zq as image,zH as inTopKAsync,va as io,Gf as irfft,Dk as isFinite,Pk as isInf,Ok as isNaN,So as keep,Bt as kernel_impls,wf as leakyRelu,Mk as less,Hp as lessEqual,Wq as linalg,Lk as linspace,U6 as loadGraphModel,G6 as loadGraphModelSync,Bk as localResponseNormalization,Ea as log,Sf as log1p,Vk as logSigmoid,zk as logSoftmax,Tf as logSumExp,lu as logicalAnd,Nf as logicalNot,_f as logicalOr,Wk as logicalXor,Uq as losses,Uk as lowerBound,Xe as matMul,Cv as math,Vs as max,$f as maxPool,Gk as maxPool3d,Hk as maxPoolWithArgmax,Rf as maximum,mu as mean,$ie as memory,qk as meshgrid,fl as min,Af as minimum,Kk as mirrorPad,jk as mod,Xk as moments,$H as movingAverage,oe as mul,Yk as multiRNNCell,Qk as multinomial,yr as neg,kC as nextFrame,pu as norm,Ff as notEqual,pl as oneHot,zs as ones,Zk as onesLike,T as op,Jk as outerProduct,Ws as pad,e1 as pad1d,t1 as pad2d,r1 as pad3d,o1 as pad4d,n1 as pool,Na as pow,Pf as prelu,ef as print,s1 as prod,Rie as profile,a1 as raggedGather,i1 as raggedRange,u1 as raggedTensorToTensor,p1 as rand,T1 as randomGamma,Vf as randomNormal,N1 as randomStandardNormal,zf as randomUniform,di as range,Die as ready,ka as real,_1 as reciprocal,pi as registerBackend,Pne as registerGradient,ya as registerKernel,XK as registerOp,hi as relu,Wf as relu6,Oie as removeBackend,z as reshape,vo as reverse,E1 as reverse1d,$1 as reverse2d,R1 as reverse3d,A1 as reverse4d,Kp as rfft,Uf as round,F1 as rsqrt,be as scalar,AH as scatterND,cl as scatter_util,dl as searchSorted,D1 as selu,P1 as separableConv2d,Pv as serialization,Fie as setBackend,Vie as setPlatform,ote as setThreadsCount,tte as setWasmPath,rte as setWasmPaths,MI as setWebGLContext,O1 as setdiff1dAsync,Ad as shared,Ms as sigmoid,M1 as sign,Vq as signal,L1 as sin,B1 as sinh,Ue as slice,V1 as slice1d,z1 as slice2d,W1 as slice3d,U1 as slice4d,et as slice_util,G1 as softmax,kf as softplus,Df as spaceToBatchND,Gq as sparse,PH as sparseToDense,Bq as spectral,$a as split,Rr as sqrt,Zt as square,Hf as squaredDifference,jp as squeeze,Ir as stack,qf as step,H1 as stridedSlice,Hq as string,ke as sub,tt as sum,Ca as sumOutType,q1 as tan,ml as tanh,nr as tensor,mr as tensor1d,gi as tensor2d,sf as tensor3d,K1 as tensor4d,j1 as tensor5d,X1 as tensor6d,z0 as tensor_util,Bv as test_util,Ne as tidy,fi as tile,Aie as time,Y1 as topk,pMe as train,Wp as transpose,Q1 as truncatedNormal,Z1 as unique,Mne as unregisterGradient,One as unregisterKernel,J1 as unsortedSegmentSum,ko as unstack,ct as upcastType,eT as upperBound,x as util,qG as valueAndGrad,KG as valueAndGrads,tT as variable,dC as variableGrads,Cne as version,q6 as version_converter,YW as version_core,Ij as version_cpu,ste as version_wasm,gY as version_webgl,R9e as webgl,ic as webgl_util,pS as webgpu_util,os as where,jf as whereAsync,Wr as zeros,Gt as zerosLike}; diff --git a/dist/tfjs.version.js b/dist/tfjs.version.js new file mode 100644 index 00000000..a6def486 --- /dev/null +++ b/dist/tfjs.version.js @@ -0,0 +1,7 @@ +/* + Human + homepage: + author: ' +*/ + +var e="4.0.0";var s="4.0.0";var t="4.0.0";var n="4.0.0";var i="4.0.0";var r="0.0.1-alpha.14";var h={tfjs:e,"tfjs-core":e,"tfjs-converter":s,"tfjs-backend-cpu":t,"tfjs-backend-webgl":n,"tfjs-backend-wasm":i,"tfjs-backend-webgpu":r};export{h as version}; diff --git a/test/build.log b/test/build.log index c6b76abd..ae17ccbf 100644 --- a/test/build.log +++ b/test/build.log @@ -1,50 +1,50 @@ -2022-11-17 14:50:24 DATA:  Build {"name":"@vladmandic/human","version":"3.0.0"} -2022-11-17 14:50:24 INFO:  Application: {"name":"@vladmandic/human","version":"3.0.0"} -2022-11-17 14:50:24 INFO:  Environment: {"profile":"production","config":".build.json","package":"package.json","tsconfig":true,"eslintrc":true,"git":true} -2022-11-17 14:50:24 INFO:  Toolchain: {"build":"0.7.14","esbuild":"0.15.14","typescript":"4.9.3","typedoc":"0.23.21","eslint":"8.27.0"} -2022-11-17 14:50:24 INFO:  Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]} -2022-11-17 14:50:24 STATE: Clean: {"locations":["dist/*","types/*","typedoc/*"]} -2022-11-17 14:50:24 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1289,"outputBytes":361} -2022-11-17 14:50:24 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":569,"outputBytes":924} -2022-11-17 14:50:24 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":80,"inputBytes":670091,"outputBytes":317438} -2022-11-17 14:50:24 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":577,"outputBytes":928} -2022-11-17 14:50:24 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":80,"inputBytes":670095,"outputBytes":317442} -2022-11-17 14:50:24 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":665,"outputBytes":1876} -2022-11-17 14:50:24 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":80,"inputBytes":671043,"outputBytes":317553} -2022-11-17 14:50:24 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":1375,"outputBytes":670} -2022-11-17 14:50:24 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":80,"inputBytes":669837,"outputBytes":316023} -2022-11-17 14:50:24 STATE: Compile: {"name":"tfjs/browser/esm/bundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":10,"inputBytes":1375,"outputBytes":1144900} -2022-11-17 14:50:25 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":80,"inputBytes":1814067,"outputBytes":1457337} -2022-11-17 14:50:25 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":80,"inputBytes":1814067,"outputBytes":1914669} -2022-11-17 14:50:28 STATE: Typings: {"input":"src/human.ts","output":"types/lib","files":15} -2022-11-17 14:50:30 STATE: TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":77,"generated":true} -2022-11-17 14:50:30 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6135,"outputBytes":2913} -2022-11-17 14:50:30 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":17572,"outputBytes":9456} -2022-11-17 14:50:38 STATE: Lint: {"locations":["*.json","src/**/*.ts","test/**/*.js","demo/**/*.js"],"files":114,"errors":0,"warnings":0} -2022-11-17 14:50:38 STATE: ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"} -2022-11-17 14:50:38 STATE: Copy: {"input":"node_modules/@vladmandic/tfjs/types/tfjs-core.d.ts","output":"types/tfjs-core.d.ts"} -2022-11-17 14:50:38 INFO:  Done... -2022-11-17 14:50:38 STATE: Copy: {"input":"node_modules/@vladmandic/tfjs/types/tfjs.d.ts","output":"types/tfjs.esm.d.ts"} -2022-11-17 14:50:38 STATE: Copy: {"input":"src/types/tsconfig.json","output":"types/tsconfig.json"} -2022-11-17 14:50:38 STATE: Copy: {"input":"src/types/eslint.json","output":"types/.eslintrc.json"} -2022-11-17 14:50:38 STATE: Copy: {"input":"src/types/tfjs.esm.d.ts","output":"dist/tfjs.esm.d.ts"} -2022-11-17 14:50:38 STATE: Filter: {"input":"types/tfjs-core.d.ts"} -2022-11-17 14:50:39 STATE: API-Extractor: {"succeeeded":true,"errors":0,"warnings":195} -2022-11-17 14:50:39 STATE: Filter: {"input":"types/human.d.ts"} -2022-11-17 14:50:39 STATE: Write: {"output":"dist/human.esm-nobundle.d.ts"} -2022-11-17 14:50:39 STATE: Write: {"output":"dist/human.esm.d.ts"} -2022-11-17 14:50:39 STATE: Write: {"output":"dist/human.d.ts"} -2022-11-17 14:50:39 STATE: Write: {"output":"dist/human.node-gpu.d.ts"} -2022-11-17 14:50:39 STATE: Write: {"output":"dist/human.node.d.ts"} -2022-11-17 14:50:39 STATE: Write: {"output":"dist/human.node-wasm.d.ts"} -2022-11-17 14:50:39 INFO:  Analyze models: {"folders":8,"result":"models/models.json"} -2022-11-17 14:50:39 STATE: Models {"folder":"./models","models":12} -2022-11-17 14:50:39 STATE: Models {"folder":"../human-models/models","models":43} -2022-11-17 14:50:39 STATE: Models {"folder":"../blazepose/model/","models":4} -2022-11-17 14:50:39 STATE: Models {"folder":"../anti-spoofing/model","models":1} -2022-11-17 14:50:39 STATE: Models {"folder":"../efficientpose/models","models":3} -2022-11-17 14:50:39 STATE: Models {"folder":"../insightface/models","models":5} -2022-11-17 14:50:39 STATE: Models {"folder":"../movenet/models","models":3} -2022-11-17 14:50:39 STATE: Models {"folder":"../nanodet/models","models":4} -2022-11-17 14:50:40 STATE: Models: {"count":58,"totalSize":386543911} -2022-11-17 14:50:40 INFO:  Human Build complete... {"logFile":"test/build.log"} +2022-11-18 11:12:48 DATA:  Build {"name":"@vladmandic/human","version":"3.0.0"} +2022-11-18 11:12:48 INFO:  Application: {"name":"@vladmandic/human","version":"3.0.0"} +2022-11-18 11:12:48 INFO:  Environment: {"profile":"production","config":".build.json","package":"package.json","tsconfig":true,"eslintrc":true,"git":true} +2022-11-18 11:12:48 INFO:  Toolchain: {"build":"0.7.14","esbuild":"0.15.14","typescript":"4.9.3","typedoc":"0.23.21","eslint":"8.27.0"} +2022-11-18 11:12:48 INFO:  Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]} +2022-11-18 11:12:48 STATE: Clean: {"locations":["dist/*","types/*","typedoc/*"]} +2022-11-18 11:12:48 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1289,"outputBytes":361} +2022-11-18 11:12:48 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":569,"outputBytes":924} +2022-11-18 11:12:48 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":80,"inputBytes":670091,"outputBytes":317438} +2022-11-18 11:12:48 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":577,"outputBytes":928} +2022-11-18 11:12:48 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":80,"inputBytes":670095,"outputBytes":317442} +2022-11-18 11:12:48 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":665,"outputBytes":1876} +2022-11-18 11:12:48 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":80,"inputBytes":671043,"outputBytes":317553} +2022-11-18 11:12:48 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":1375,"outputBytes":670} +2022-11-18 11:12:48 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":80,"inputBytes":669837,"outputBytes":316023} +2022-11-18 11:12:49 STATE: Compile: {"name":"tfjs/browser/esm/bundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":10,"inputBytes":1375,"outputBytes":1144900} +2022-11-18 11:12:49 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":80,"inputBytes":1814067,"outputBytes":1457337} +2022-11-18 11:12:49 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":80,"inputBytes":1814067,"outputBytes":1914669} +2022-11-18 11:12:52 STATE: Typings: {"input":"src/human.ts","output":"types/lib","files":15} +2022-11-18 11:12:54 STATE: TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":77,"generated":true} +2022-11-18 11:12:54 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6135,"outputBytes":2913} +2022-11-18 11:12:54 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":17572,"outputBytes":9456} +2022-11-18 11:13:02 STATE: Lint: {"locations":["*.json","src/**/*.ts","test/**/*.js","demo/**/*.js"],"files":114,"errors":0,"warnings":0} +2022-11-18 11:13:02 STATE: ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"} +2022-11-18 11:13:02 STATE: Copy: {"input":"node_modules/@vladmandic/tfjs/types/tfjs-core.d.ts","output":"types/tfjs-core.d.ts"} +2022-11-18 11:13:02 INFO:  Done... +2022-11-18 11:13:02 STATE: Copy: {"input":"node_modules/@vladmandic/tfjs/types/tfjs.d.ts","output":"types/tfjs.esm.d.ts"} +2022-11-18 11:13:02 STATE: Copy: {"input":"src/types/tsconfig.json","output":"types/tsconfig.json"} +2022-11-18 11:13:02 STATE: Copy: {"input":"src/types/eslint.json","output":"types/.eslintrc.json"} +2022-11-18 11:13:02 STATE: Copy: {"input":"src/types/tfjs.esm.d.ts","output":"dist/tfjs.esm.d.ts"} +2022-11-18 11:13:02 STATE: Filter: {"input":"types/tfjs-core.d.ts"} +2022-11-18 11:13:03 STATE: API-Extractor: {"succeeeded":true,"errors":0,"warnings":195} +2022-11-18 11:13:03 STATE: Filter: {"input":"types/human.d.ts"} +2022-11-18 11:13:03 STATE: Write: {"output":"dist/human.esm-nobundle.d.ts"} +2022-11-18 11:13:03 STATE: Write: {"output":"dist/human.esm.d.ts"} +2022-11-18 11:13:03 STATE: Write: {"output":"dist/human.d.ts"} +2022-11-18 11:13:03 STATE: Write: {"output":"dist/human.node-gpu.d.ts"} +2022-11-18 11:13:03 STATE: Write: {"output":"dist/human.node.d.ts"} +2022-11-18 11:13:03 STATE: Write: {"output":"dist/human.node-wasm.d.ts"} +2022-11-18 11:13:03 INFO:  Analyze models: {"folders":8,"result":"models/models.json"} +2022-11-18 11:13:03 STATE: Models {"folder":"./models","models":12} +2022-11-18 11:13:03 STATE: Models {"folder":"../human-models/models","models":43} +2022-11-18 11:13:03 STATE: Models {"folder":"../blazepose/model/","models":4} +2022-11-18 11:13:03 STATE: Models {"folder":"../anti-spoofing/model","models":1} +2022-11-18 11:13:03 STATE: Models {"folder":"../efficientpose/models","models":3} +2022-11-18 11:13:03 STATE: Models {"folder":"../insightface/models","models":5} +2022-11-18 11:13:03 STATE: Models {"folder":"../movenet/models","models":3} +2022-11-18 11:13:03 STATE: Models {"folder":"../nanodet/models","models":4} +2022-11-18 11:13:03 STATE: Models: {"count":58,"totalSize":386543911} +2022-11-18 11:13:03 INFO:  Human Build complete... {"logFile":"test/build.log"} diff --git a/typedoc/.nojekyll b/typedoc/.nojekyll new file mode 100644 index 00000000..e2ac6616 --- /dev/null +++ b/typedoc/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/typedoc/assets/highlight.css b/typedoc/assets/highlight.css new file mode 100644 index 00000000..70096219 --- /dev/null +++ b/typedoc/assets/highlight.css @@ -0,0 +1,85 @@ +:root { + --light-hl-0: #0000FF; + --dark-hl-0: #569CD6; + --light-hl-1: #000000; + --dark-hl-1: #D4D4D4; + --light-hl-2: #0070C1; + --dark-hl-2: #4FC1FF; + --light-hl-3: #A31515; + --dark-hl-3: #CE9178; + --light-hl-4: #AF00DB; + --dark-hl-4: #C586C0; + --light-hl-5: #001080; + --dark-hl-5: #9CDCFE; + --light-hl-6: #795E26; + --dark-hl-6: #DCDCAA; + --light-hl-7: #098658; + --dark-hl-7: #B5CEA8; + --light-hl-8: #000000; + --dark-hl-8: #C8C8C8; + --light-code-background: #FFFFFF; + --dark-code-background: #1E1E1E; +} + +@media (prefers-color-scheme: light) { :root { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); + --hl-6: var(--light-hl-6); + --hl-7: var(--light-hl-7); + --hl-8: var(--light-hl-8); + --code-background: var(--light-code-background); +} } + +@media (prefers-color-scheme: dark) { :root { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); + --hl-6: var(--dark-hl-6); + --hl-7: var(--dark-hl-7); + --hl-8: var(--dark-hl-8); + --code-background: var(--dark-code-background); +} } + +:root[data-theme='light'] { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); + --hl-6: var(--light-hl-6); + --hl-7: var(--light-hl-7); + --hl-8: var(--light-hl-8); + --code-background: var(--light-code-background); +} + +:root[data-theme='dark'] { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); + --hl-6: var(--dark-hl-6); + --hl-7: var(--dark-hl-7); + --hl-8: var(--dark-hl-8); + --code-background: var(--dark-code-background); +} + +.hl-0 { color: var(--hl-0); } +.hl-1 { color: var(--hl-1); } +.hl-2 { color: var(--hl-2); } +.hl-3 { color: var(--hl-3); } +.hl-4 { color: var(--hl-4); } +.hl-5 { color: var(--hl-5); } +.hl-6 { color: var(--hl-6); } +.hl-7 { color: var(--hl-7); } +.hl-8 { color: var(--hl-8); } +pre, code { background: var(--code-background); } diff --git a/typedoc/assets/main.js b/typedoc/assets/main.js new file mode 100644 index 00000000..b949086c --- /dev/null +++ b/typedoc/assets/main.js @@ -0,0 +1,54 @@ +"use strict"; +"use strict";(()=>{var Qe=Object.create;var ae=Object.defineProperty;var Pe=Object.getOwnPropertyDescriptor;var Ce=Object.getOwnPropertyNames;var Oe=Object.getPrototypeOf,Re=Object.prototype.hasOwnProperty;var _e=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var Me=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ce(e))!Re.call(t,i)&&i!==n&&ae(t,i,{get:()=>e[i],enumerable:!(r=Pe(e,i))||r.enumerable});return t};var De=(t,e,n)=>(n=t!=null?Qe(Oe(t)):{},Me(e||!t||!t.__esModule?ae(n,"default",{value:t,enumerable:!0}):n,t));var de=_e((ce,he)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var h=t.utils.clone(n)||{};h.position=[a,l],h.index=s.length,s.push(new t.Token(r.slice(a,o),h))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ou?h+=2:a==u&&(n+=r[l+1]*i[h+1],l+=2,h+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}if(s.str.length==0&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}s.str.length==1&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var h=s.str.charAt(0),m=s.str.charAt(1),v;m in s.node.edges?v=s.node.edges[m]:(v=new t.TokenSet,s.node.edges[m]=v),s.str.length==1&&(v.final=!0),i.push({node:v,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,n){typeof define=="function"&&define.amd?define(n):typeof ce=="object"?he.exports=n():e.lunr=n()}(this,function(){return t})})()});var le=[];function j(t,e){le.push({selector:e,constructor:t})}var Y=class{constructor(){this.createComponents(document.body)}createComponents(e){le.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r}),r.dataset.hasInstance=String(!0))})})}};var k=class{constructor(e){this.el=e.el}};var J=class{constructor(){this.listeners={}}addEventListener(e,n){e in this.listeners||(this.listeners[e]=[]),this.listeners[e].push(n)}removeEventListener(e,n){if(!(e in this.listeners))return;let r=this.listeners[e];for(let i=0,s=r.length;i{let n=Date.now();return(...r)=>{n+e-Date.now()<0&&(t(...r),n=Date.now())}};var re=class extends J{constructor(){super();this.scrollTop=0;this.lastY=0;this.width=0;this.height=0;this.showToolbar=!0;this.toolbar=document.querySelector(".tsd-page-toolbar"),this.navigation=document.querySelector(".col-menu"),window.addEventListener("scroll",ne(()=>this.onScroll(),10)),window.addEventListener("resize",ne(()=>this.onResize(),10)),this.searchInput=document.querySelector("#tsd-search input"),this.searchInput&&this.searchInput.addEventListener("focus",()=>{this.hideShowToolbar()}),this.onResize(),this.onScroll()}triggerResize(){let n=new CustomEvent("resize",{detail:{width:this.width,height:this.height}});this.dispatchEvent(n)}onResize(){this.width=window.innerWidth||0,this.height=window.innerHeight||0;let n=new CustomEvent("resize",{detail:{width:this.width,height:this.height}});this.dispatchEvent(n)}onScroll(){this.scrollTop=window.scrollY||0;let n=new CustomEvent("scroll",{detail:{scrollTop:this.scrollTop}});this.dispatchEvent(n),this.hideShowToolbar()}hideShowToolbar(){let n=this.showToolbar;this.showToolbar=this.lastY>=this.scrollTop||this.scrollTop<=0||!!this.searchInput&&this.searchInput===document.activeElement,n!==this.showToolbar&&(this.toolbar.classList.toggle("tsd-page-toolbar--hide"),this.navigation?.classList.toggle("col-menu--hide")),this.lastY=this.scrollTop}},R=re;R.instance=new re;var X=class extends k{constructor(n){super(n);this.anchors=[];this.index=-1;R.instance.addEventListener("resize",()=>this.onResize()),R.instance.addEventListener("scroll",r=>this.onScroll(r)),this.createAnchors()}createAnchors(){let n=window.location.href;n.indexOf("#")!=-1&&(n=n.substring(0,n.indexOf("#"))),this.el.querySelectorAll("a").forEach(r=>{let i=r.href;if(i.indexOf("#")==-1||i.substring(0,n.length)!=n)return;let s=i.substring(i.indexOf("#")+1),o=document.querySelector("a.tsd-anchor[name="+s+"]"),a=r.parentNode;!o||!a||this.anchors.push({link:a,anchor:o,position:0})}),this.onResize()}onResize(){let n;for(let i=0,s=this.anchors.length;ii.position-s.position);let r=new CustomEvent("scroll",{detail:{scrollTop:R.instance.scrollTop}});this.onScroll(r)}onScroll(n){let r=n.detail.scrollTop+5,i=this.anchors,s=i.length-1,o=this.index;for(;o>-1&&i[o].position>r;)o-=1;for(;o-1&&this.anchors[this.index].link.classList.remove("focus"),this.index=o,this.index>-1&&this.anchors[this.index].link.classList.add("focus"))}};var ue=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var me=De(de());function ve(){let t=document.getElementById("tsd-search");if(!t)return;let e=document.getElementById("search-script");t.classList.add("loading"),e&&(e.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),e.addEventListener("load",()=>{t.classList.remove("loading"),t.classList.add("ready")}),window.searchData&&t.classList.remove("loading"));let n=document.querySelector("#tsd-search input"),r=document.querySelector("#tsd-search .results");if(!n||!r)throw new Error("The input field or the result list wrapper was not found");let i=!1;r.addEventListener("mousedown",()=>i=!0),r.addEventListener("mouseup",()=>{i=!1,t.classList.remove("has-focus")}),n.addEventListener("focus",()=>t.classList.add("has-focus")),n.addEventListener("blur",()=>{i||(i=!1,t.classList.remove("has-focus"))});let s={base:t.dataset.base+"/"};Fe(t,r,n,s)}function Fe(t,e,n,r){n.addEventListener("input",ue(()=>{Ae(t,e,n,r)},200));let i=!1;n.addEventListener("keydown",s=>{i=!0,s.key=="Enter"?Ve(e,n):s.key=="Escape"?n.blur():s.key=="ArrowUp"?fe(e,-1):s.key==="ArrowDown"?fe(e,1):i=!1}),n.addEventListener("keypress",s=>{i&&s.preventDefault()}),document.body.addEventListener("keydown",s=>{s.altKey||s.ctrlKey||s.metaKey||!n.matches(":focus")&&s.key==="/"&&(n.focus(),s.preventDefault())})}function He(t,e){t.index||window.searchData&&(e.classList.remove("loading"),e.classList.add("ready"),t.data=window.searchData,t.index=me.Index.load(window.searchData.index))}function Ae(t,e,n,r){if(He(r,t),!r.index||!r.data)return;e.textContent="";let i=n.value.trim(),s=i?r.index.search(`*${i}*`):[];for(let o=0;oa.score-o.score);for(let o=0,a=Math.min(10,s.length);o${pe(u.parent,i)}.${l}`);let h=document.createElement("li");h.classList.value=u.classes??"";let m=document.createElement("a");m.href=r.base+u.url,m.innerHTML=l,h.append(m),e.appendChild(h)}}function fe(t,e){let n=t.querySelector(".current");if(!n)n=t.querySelector(e==1?"li:first-child":"li:last-child"),n&&n.classList.add("current");else{let r=n;if(e===1)do r=r.nextElementSibling??void 0;while(r instanceof HTMLElement&&r.offsetParent==null);else do r=r.previousElementSibling??void 0;while(r instanceof HTMLElement&&r.offsetParent==null);r&&(n.classList.remove("current"),r.classList.add("current"))}}function Ve(t,e){let n=t.querySelector(".current");if(n||(n=t.querySelector("li:first-child")),n){let r=n.querySelector("a");r&&(window.location.href=r.href),e.blur()}}function pe(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(ie(t.substring(s,o)),`${ie(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(ie(t.substring(s))),i.join("")}var Ne={"&":"&","<":"<",">":">","'":"'",'"':"""};function ie(t){return t.replace(/[&<>"'"]/g,e=>Ne[e])}var F="mousedown",ye="mousemove",B="mouseup",Z={x:0,y:0},ge=!1,se=!1,je=!1,H=!1,xe=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(xe?"is-mobile":"not-mobile");xe&&"ontouchstart"in document.documentElement&&(je=!0,F="touchstart",ye="touchmove",B="touchend");document.addEventListener(F,t=>{se=!0,H=!1;let e=F=="touchstart"?t.targetTouches[0]:t;Z.y=e.pageY||0,Z.x=e.pageX||0});document.addEventListener(ye,t=>{if(!!se&&!H){let e=F=="touchstart"?t.targetTouches[0]:t,n=Z.x-(e.pageX||0),r=Z.y-(e.pageY||0);H=Math.sqrt(n*n+r*r)>10}});document.addEventListener(B,()=>{se=!1});document.addEventListener("click",t=>{ge&&(t.preventDefault(),t.stopImmediatePropagation(),ge=!1)});var K=class extends k{constructor(n){super(n);this.className=this.el.dataset.toggle||"",this.el.addEventListener(B,r=>this.onPointerUp(r)),this.el.addEventListener("click",r=>r.preventDefault()),document.addEventListener(F,r=>this.onDocumentPointerDown(r)),document.addEventListener(B,r=>this.onDocumentPointerUp(r))}setActive(n){if(this.active==n)return;this.active=n,document.documentElement.classList.toggle("has-"+this.className,n),this.el.classList.toggle("active",n);let r=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(r),setTimeout(()=>document.documentElement.classList.remove(r),500)}onPointerUp(n){H||(this.setActive(!0),n.preventDefault())}onDocumentPointerDown(n){if(this.active){if(n.target.closest(".col-menu, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(n){if(!H&&this.active&&n.target.closest(".col-menu")){let r=n.target.closest("a");if(r){let i=window.location.href;i.indexOf("#")!=-1&&(i=i.substring(0,i.indexOf("#"))),r.href.substring(0,i.length)==i&&setTimeout(()=>this.setActive(!1),250)}}}};var oe;try{oe=localStorage}catch{oe={getItem(){return null},setItem(){}}}var Q=oe;var Le=document.head.appendChild(document.createElement("style"));Le.dataset.for="filters";var ee=class extends k{constructor(n){super(n);this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),Le.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } +`}fromLocalStorage(){let n=Q.getItem(this.key);return n?n==="true":this.el.checked}setLocalStorage(n){Q.setItem(this.key,n.toString()),this.value=n,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),document.querySelectorAll(".tsd-index-section").forEach(n=>{n.style.display="block";let r=Array.from(n.querySelectorAll(".tsd-index-link")).every(i=>i.offsetParent==null);n.style.display=r?"none":"block"})}};var te=class extends k{constructor(n){super(n);this.calculateHeights(),this.summary=this.el.querySelector(".tsd-accordion-summary"),this.icon=this.summary.querySelector("svg"),this.key=`tsd-accordion-${this.summary.textContent.replace(/\s+/g,"-").toLowerCase()}`,this.setLocalStorage(this.fromLocalStorage(),!0),this.summary.addEventListener("click",r=>this.toggleVisibility(r)),this.icon.style.transform=this.getIconRotation()}getIconRotation(n=this.el.open){return`rotate(${n?0:-90}deg)`}calculateHeights(){let n=this.el.open,{position:r,left:i}=this.el.style;this.el.style.position="fixed",this.el.style.left="-9999px",this.el.open=!0,this.expandedHeight=this.el.offsetHeight+"px",this.el.open=!1,this.collapsedHeight=this.el.offsetHeight+"px",this.el.open=n,this.el.style.height=n?this.expandedHeight:this.collapsedHeight,this.el.style.position=r,this.el.style.left=i}toggleVisibility(n){n.preventDefault(),this.el.style.overflow="hidden",this.el.open?this.collapse():this.expand()}expand(n=!0){this.el.open=!0,this.animate(this.collapsedHeight,this.expandedHeight,{opening:!0,duration:n?300:0})}collapse(n=!0){this.animate(this.expandedHeight,this.collapsedHeight,{opening:!1,duration:n?300:0})}animate(n,r,{opening:i,duration:s=300}){if(this.animation)return;let o={duration:s,easing:"ease"};this.animation=this.el.animate({height:[n,r]},o),this.icon.animate({transform:[this.icon.style.transform||this.getIconRotation(!i),this.getIconRotation(i)]},o).addEventListener("finish",()=>{this.icon.style.transform=this.getIconRotation(i)}),this.animation.addEventListener("finish",()=>this.animationEnd(i))}animationEnd(n){this.el.open=n,this.animation=void 0,this.el.style.height="auto",this.el.style.overflow="visible",this.setLocalStorage(n)}fromLocalStorage(){let n=Q.getItem(this.key);return n?n==="true":this.el.open}setLocalStorage(n,r=!1){this.fromLocalStorage()===n&&!r||(Q.setItem(this.key,n.toString()),this.el.open=n,this.handleValueChange(r))}handleValueChange(n=!1){this.fromLocalStorage()===this.el.open&&!n||(this.fromLocalStorage()?this.expand(!1):this.collapse(!1))}};function be(t){let e=Q.getItem("tsd-theme")||"os";t.value=e,Ee(e),t.addEventListener("change",()=>{Q.setItem("tsd-theme",t.value),Ee(t.value)})}function Ee(t){document.documentElement.dataset.theme=t}ve();j(X,".menu-highlight");j(K,"a[data-toggle]");j(te,".tsd-index-accordion");j(ee,".tsd-filter-item input[type=checkbox]");var Se=document.getElementById("theme");Se&&be(Se);var Be=new Y;Object.defineProperty(window,"app",{value:Be});})(); +/*! + * lunr.Builder + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.Index + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.Pipeline + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.Set + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.TokenSet + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.Vector + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.stemmer + * Copyright (C) 2020 Oliver Nightingale + * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt + */ +/*! + * lunr.stopWordFilter + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.tokenizer + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.trimmer + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.utils + * Copyright (C) 2020 Oliver Nightingale + */ +/** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + */ diff --git a/typedoc/assets/search.js b/typedoc/assets/search.js new file mode 100644 index 00000000..fd0dc77c --- /dev/null +++ b/typedoc/assets/search.js @@ -0,0 +1 @@ +window.searchData = JSON.parse("{\"kinds\":{\"4\":\"Namespace\",\"8\":\"Enumeration\",\"16\":\"Enumeration Member\",\"32\":\"Variable\",\"64\":\"Function\",\"128\":\"Class\",\"256\":\"Interface\",\"512\":\"Constructor\",\"1024\":\"Property\",\"2048\":\"Method\",\"65536\":\"Type literal\",\"262144\":\"Accessor\",\"4194304\":\"Type alias\",\"8388608\":\"Reference\"},\"rows\":[{\"kind\":128,\"name\":\"Human\",\"url\":\"classes/Human.html\",\"classes\":\"tsd-kind-class\"},{\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/Human.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":1024,\"name\":\"version\",\"url\":\"classes/Human.html#version\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":1024,\"name\":\"config\",\"url\":\"classes/Human.html#config\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":1024,\"name\":\"result\",\"url\":\"classes/Human.html#result\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":1024,\"name\":\"state\",\"url\":\"classes/Human.html#state\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":1024,\"name\":\"process\",\"url\":\"classes/Human.html#process\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/Human.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":1024,\"name\":\"tensor\",\"url\":\"classes/Human.html#__type.tensor\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Human.__type\"},{\"kind\":1024,\"name\":\"canvas\",\"url\":\"classes/Human.html#__type.canvas\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Human.__type\"},{\"kind\":1024,\"name\":\"tf\",\"url\":\"classes/Human.html#tf\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":1024,\"name\":\"env\",\"url\":\"classes/Human.html#env\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":1024,\"name\":\"draw\",\"url\":\"classes/Human.html#draw\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":1024,\"name\":\"match\",\"url\":\"classes/Human.html#match\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":1024,\"name\":\"events\",\"url\":\"classes/Human.html#events\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":1024,\"name\":\"faceTriangulation\",\"url\":\"classes/Human.html#faceTriangulation\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":1024,\"name\":\"faceUVMap\",\"url\":\"classes/Human.html#faceUVMap\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":1024,\"name\":\"performance\",\"url\":\"classes/Human.html#performance\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":2048,\"name\":\"analyze\",\"url\":\"classes/Human.html#analyze\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":2048,\"name\":\"reset\",\"url\":\"classes/Human.html#reset\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":2048,\"name\":\"validate\",\"url\":\"classes/Human.html#validate\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":2048,\"name\":\"now\",\"url\":\"classes/Human.html#now\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":2048,\"name\":\"image\",\"url\":\"classes/Human.html#image\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":2048,\"name\":\"segmentation\",\"url\":\"classes/Human.html#segmentation\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":2048,\"name\":\"compare\",\"url\":\"classes/Human.html#compare\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":2048,\"name\":\"init\",\"url\":\"classes/Human.html#init\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":1024,\"name\":\"webcam\",\"url\":\"classes/Human.html#webcam\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":2048,\"name\":\"load\",\"url\":\"classes/Human.html#load\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":2048,\"name\":\"emit\",\"url\":\"classes/Human.html#emit\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":2048,\"name\":\"next\",\"url\":\"classes/Human.html#next\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":2048,\"name\":\"warmup\",\"url\":\"classes/Human.html#warmup\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":2048,\"name\":\"profile\",\"url\":\"classes/Human.html#profile\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":2048,\"name\":\"detect\",\"url\":\"classes/Human.html#detect\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":2048,\"name\":\"sleep\",\"url\":\"classes/Human.html#sleep\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":2048,\"name\":\"video\",\"url\":\"classes/Human.html#video\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Human\"},{\"kind\":8388608,\"name\":\"default\",\"url\":\"index.html#default\",\"classes\":\"tsd-kind-reference\"},{\"kind\":4,\"name\":\"match\",\"url\":\"modules/match.html\",\"classes\":\"tsd-kind-namespace\"},{\"kind\":64,\"name\":\"distance\",\"url\":\"functions/match.distance.html\",\"classes\":\"tsd-kind-function tsd-parent-kind-namespace\",\"parent\":\"match\"},{\"kind\":64,\"name\":\"similarity\",\"url\":\"functions/match.similarity.html\",\"classes\":\"tsd-kind-function tsd-parent-kind-namespace\",\"parent\":\"match\"},{\"kind\":64,\"name\":\"find\",\"url\":\"functions/match.find.html\",\"classes\":\"tsd-kind-function tsd-parent-kind-namespace\",\"parent\":\"match\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"functions/match.find.html#find.__type\",\"classes\":\"tsd-kind-type-literal\",\"parent\":\"match.find.find\"},{\"kind\":1024,\"name\":\"index\",\"url\":\"functions/match.find.html#find.__type.index\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"match.find.find.__type\"},{\"kind\":1024,\"name\":\"distance\",\"url\":\"functions/match.find.html#find.__type.distance\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"match.find.find.__type\"},{\"kind\":1024,\"name\":\"similarity\",\"url\":\"functions/match.find.html#find.__type.similarity\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"match.find.find.__type\"},{\"kind\":4194304,\"name\":\"Descriptor\",\"url\":\"types/match.Descriptor.html\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"match\"},{\"kind\":4194304,\"name\":\"MatchOptions\",\"url\":\"types/match.MatchOptions.html\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"match\"},{\"kind\":4,\"name\":\"draw\",\"url\":\"modules/draw.html\",\"classes\":\"tsd-kind-namespace\"},{\"kind\":64,\"name\":\"person\",\"url\":\"functions/draw.person.html\",\"classes\":\"tsd-kind-function tsd-parent-kind-namespace\",\"parent\":\"draw\"},{\"kind\":64,\"name\":\"canvas\",\"url\":\"functions/draw.canvas.html\",\"classes\":\"tsd-kind-function tsd-parent-kind-namespace\",\"parent\":\"draw\"},{\"kind\":64,\"name\":\"all\",\"url\":\"functions/draw.all.html\",\"classes\":\"tsd-kind-function tsd-parent-kind-namespace\",\"parent\":\"draw\"},{\"kind\":64,\"name\":\"init\",\"url\":\"functions/draw.init.html\",\"classes\":\"tsd-kind-function tsd-parent-kind-namespace\",\"parent\":\"draw\"},{\"kind\":32,\"name\":\"options\",\"url\":\"variables/draw.options.html\",\"classes\":\"tsd-kind-variable tsd-parent-kind-namespace\",\"parent\":\"draw\"},{\"kind\":64,\"name\":\"face\",\"url\":\"functions/draw.face.html\",\"classes\":\"tsd-kind-function tsd-parent-kind-namespace\",\"parent\":\"draw\"},{\"kind\":64,\"name\":\"body\",\"url\":\"functions/draw.body.html\",\"classes\":\"tsd-kind-function tsd-parent-kind-namespace\",\"parent\":\"draw\"},{\"kind\":64,\"name\":\"hand\",\"url\":\"functions/draw.hand.html\",\"classes\":\"tsd-kind-function tsd-parent-kind-namespace\",\"parent\":\"draw\"},{\"kind\":64,\"name\":\"object\",\"url\":\"functions/draw.object.html\",\"classes\":\"tsd-kind-function tsd-parent-kind-namespace\",\"parent\":\"draw\"},{\"kind\":64,\"name\":\"gesture\",\"url\":\"functions/draw.gesture.html\",\"classes\":\"tsd-kind-function tsd-parent-kind-namespace\",\"parent\":\"draw\"},{\"kind\":4,\"name\":\"models\",\"url\":\"modules/models.html\",\"classes\":\"tsd-kind-namespace\"},{\"kind\":64,\"name\":\"validateModel\",\"url\":\"functions/models.validateModel.html\",\"classes\":\"tsd-kind-function tsd-parent-kind-namespace\",\"parent\":\"models\"},{\"kind\":256,\"name\":\"KernelOps\",\"url\":\"interfaces/models.KernelOps.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"models\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/models.KernelOps.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"models.KernelOps\"},{\"kind\":1024,\"name\":\"url\",\"url\":\"interfaces/models.KernelOps.html#url\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"models.KernelOps\"},{\"kind\":1024,\"name\":\"missing\",\"url\":\"interfaces/models.KernelOps.html#missing\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"models.KernelOps\"},{\"kind\":1024,\"name\":\"ops\",\"url\":\"interfaces/models.KernelOps.html#ops\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"models.KernelOps\"},{\"kind\":256,\"name\":\"ModelStats\",\"url\":\"interfaces/models.ModelStats.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"models\"},{\"kind\":1024,\"name\":\"numLoadedModels\",\"url\":\"interfaces/models.ModelStats.html#numLoadedModels\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"models.ModelStats\"},{\"kind\":1024,\"name\":\"numDefinedModels\",\"url\":\"interfaces/models.ModelStats.html#numDefinedModels\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"models.ModelStats\"},{\"kind\":1024,\"name\":\"percentageLoaded\",\"url\":\"interfaces/models.ModelStats.html#percentageLoaded\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"models.ModelStats\"},{\"kind\":1024,\"name\":\"totalSizeFromManifest\",\"url\":\"interfaces/models.ModelStats.html#totalSizeFromManifest\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"models.ModelStats\"},{\"kind\":1024,\"name\":\"totalSizeWeights\",\"url\":\"interfaces/models.ModelStats.html#totalSizeWeights\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"models.ModelStats\"},{\"kind\":1024,\"name\":\"totalSizeLoading\",\"url\":\"interfaces/models.ModelStats.html#totalSizeLoading\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"models.ModelStats\"},{\"kind\":1024,\"name\":\"modelStats\",\"url\":\"interfaces/models.ModelStats.html#modelStats\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"models.ModelStats\"},{\"kind\":128,\"name\":\"Models\",\"url\":\"classes/models.Models.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-namespace\",\"parent\":\"models\"},{\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/models.Models.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"models.Models\"},{\"kind\":1024,\"name\":\"instance\",\"url\":\"classes/models.Models.html#instance\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"models.Models\"},{\"kind\":1024,\"name\":\"models\",\"url\":\"classes/models.Models.html#models\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"models.Models\"},{\"kind\":2048,\"name\":\"stats\",\"url\":\"classes/models.Models.html#stats\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"models.Models\"},{\"kind\":2048,\"name\":\"reset\",\"url\":\"classes/models.Models.html#reset\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"models.Models\"},{\"kind\":2048,\"name\":\"load\",\"url\":\"classes/models.Models.html#load\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"models.Models\"},{\"kind\":2048,\"name\":\"list\",\"url\":\"classes/models.Models.html#list\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"models.Models\"},{\"kind\":2048,\"name\":\"loaded\",\"url\":\"classes/models.Models.html#loaded\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"models.Models\"},{\"kind\":2048,\"name\":\"validate\",\"url\":\"classes/models.Models.html#validate\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"models.Models\"},{\"kind\":128,\"name\":\"Tensor\",\"url\":\"classes/Tensor-1.html\",\"classes\":\"tsd-kind-class\"},{\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/Tensor-1.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":1024,\"name\":\"id\",\"url\":\"classes/Tensor-1.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":1024,\"name\":\"dataId\",\"url\":\"classes/Tensor-1.html#dataId\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":1024,\"name\":\"shape\",\"url\":\"classes/Tensor-1.html#shape\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":1024,\"name\":\"size\",\"url\":\"classes/Tensor-1.html#size\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":1024,\"name\":\"dtype\",\"url\":\"classes/Tensor-1.html#dtype\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":1024,\"name\":\"rankType\",\"url\":\"classes/Tensor-1.html#rankType\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":1024,\"name\":\"kept\",\"url\":\"classes/Tensor-1.html#kept\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":1024,\"name\":\"scopeId\",\"url\":\"classes/Tensor-1.html#scopeId\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":1024,\"name\":\"strides\",\"url\":\"classes/Tensor-1.html#strides\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":262144,\"name\":\"rank\",\"url\":\"classes/Tensor-1.html#rank\",\"classes\":\"tsd-kind-accessor tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"buffer\",\"url\":\"classes/Tensor-1.html#buffer\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"bufferSync\",\"url\":\"classes/Tensor-1.html#bufferSync\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"array\",\"url\":\"classes/Tensor-1.html#array\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"arraySync\",\"url\":\"classes/Tensor-1.html#arraySync\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"data\",\"url\":\"classes/Tensor-1.html#data\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"dataToGPU\",\"url\":\"classes/Tensor-1.html#dataToGPU\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"dataSync\",\"url\":\"classes/Tensor-1.html#dataSync\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"bytes\",\"url\":\"classes/Tensor-1.html#bytes\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"dispose\",\"url\":\"classes/Tensor-1.html#dispose\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":262144,\"name\":\"isDisposed\",\"url\":\"classes/Tensor-1.html#isDisposed\",\"classes\":\"tsd-kind-accessor tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"throwIfDisposed\",\"url\":\"classes/Tensor-1.html#throwIfDisposed\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"print\",\"url\":\"classes/Tensor-1.html#print\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"clone\",\"url\":\"classes/Tensor-1.html#clone\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"toString\",\"url\":\"classes/Tensor-1.html#toString\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"variable\",\"url\":\"classes/Tensor-1.html#variable\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"abs\",\"url\":\"classes/Tensor-1.html#abs\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"acos\",\"url\":\"classes/Tensor-1.html#acos\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"acosh\",\"url\":\"classes/Tensor-1.html#acosh\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"add\",\"url\":\"classes/Tensor-1.html#add\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"all\",\"url\":\"classes/Tensor-1.html#all\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"any\",\"url\":\"classes/Tensor-1.html#any\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"argMax\",\"url\":\"classes/Tensor-1.html#argMax\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"argMin\",\"url\":\"classes/Tensor-1.html#argMin\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"asScalar\",\"url\":\"classes/Tensor-1.html#asScalar\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"asType\",\"url\":\"classes/Tensor-1.html#asType\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"as1D\",\"url\":\"classes/Tensor-1.html#as1D\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"as2D\",\"url\":\"classes/Tensor-1.html#as2D\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"as3D\",\"url\":\"classes/Tensor-1.html#as3D\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"as4D\",\"url\":\"classes/Tensor-1.html#as4D\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"as5D\",\"url\":\"classes/Tensor-1.html#as5D\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"asin\",\"url\":\"classes/Tensor-1.html#asin\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"asinh\",\"url\":\"classes/Tensor-1.html#asinh\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"atan\",\"url\":\"classes/Tensor-1.html#atan\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"atan2\",\"url\":\"classes/Tensor-1.html#atan2\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"atanh\",\"url\":\"classes/Tensor-1.html#atanh\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"avgPool\",\"url\":\"classes/Tensor-1.html#avgPool\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"batchToSpaceND\",\"url\":\"classes/Tensor-1.html#batchToSpaceND\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"batchNorm\",\"url\":\"classes/Tensor-1.html#batchNorm\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"broadcastTo\",\"url\":\"classes/Tensor-1.html#broadcastTo\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"cast\",\"url\":\"classes/Tensor-1.html#cast\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"ceil\",\"url\":\"classes/Tensor-1.html#ceil\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"clipByValue\",\"url\":\"classes/Tensor-1.html#clipByValue\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"concat\",\"url\":\"classes/Tensor-1.html#concat\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"conv1d\",\"url\":\"classes/Tensor-1.html#conv1d\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"conv2dTranspose\",\"url\":\"classes/Tensor-1.html#conv2dTranspose\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"conv2d\",\"url\":\"classes/Tensor-1.html#conv2d\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"cos\",\"url\":\"classes/Tensor-1.html#cos\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"cosh\",\"url\":\"classes/Tensor-1.html#cosh\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"cumprod\",\"url\":\"classes/Tensor-1.html#cumprod\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"cumsum\",\"url\":\"classes/Tensor-1.html#cumsum\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"depthToSpace\",\"url\":\"classes/Tensor-1.html#depthToSpace\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"depthwiseConv2d\",\"url\":\"classes/Tensor-1.html#depthwiseConv2d\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"dilation2d\",\"url\":\"classes/Tensor-1.html#dilation2d\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"divNoNan\",\"url\":\"classes/Tensor-1.html#divNoNan\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"div\",\"url\":\"classes/Tensor-1.html#div\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"dot\",\"url\":\"classes/Tensor-1.html#dot\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"elu\",\"url\":\"classes/Tensor-1.html#elu\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"equal\",\"url\":\"classes/Tensor-1.html#equal\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"erf\",\"url\":\"classes/Tensor-1.html#erf\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"euclideanNorm\",\"url\":\"classes/Tensor-1.html#euclideanNorm\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"exp\",\"url\":\"classes/Tensor-1.html#exp\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"expandDims\",\"url\":\"classes/Tensor-1.html#expandDims\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"expm1\",\"url\":\"classes/Tensor-1.html#expm1\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"fft\",\"url\":\"classes/Tensor-1.html#fft\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"flatten\",\"url\":\"classes/Tensor-1.html#flatten\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"floor\",\"url\":\"classes/Tensor-1.html#floor\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"floorDiv\",\"url\":\"classes/Tensor-1.html#floorDiv\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"gather\",\"url\":\"classes/Tensor-1.html#gather\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"greaterEqual\",\"url\":\"classes/Tensor-1.html#greaterEqual\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"greater\",\"url\":\"classes/Tensor-1.html#greater\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"ifft\",\"url\":\"classes/Tensor-1.html#ifft\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"irfft\",\"url\":\"classes/Tensor-1.html#irfft\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"isFinite\",\"url\":\"classes/Tensor-1.html#isFinite\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"isInf\",\"url\":\"classes/Tensor-1.html#isInf\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"isNaN\",\"url\":\"classes/Tensor-1.html#isNaN\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"leakyRelu\",\"url\":\"classes/Tensor-1.html#leakyRelu\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"lessEqual\",\"url\":\"classes/Tensor-1.html#lessEqual\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"less\",\"url\":\"classes/Tensor-1.html#less\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"localResponseNormalization\",\"url\":\"classes/Tensor-1.html#localResponseNormalization\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"logSigmoid\",\"url\":\"classes/Tensor-1.html#logSigmoid\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"logSoftmax\",\"url\":\"classes/Tensor-1.html#logSoftmax\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"logSumExp\",\"url\":\"classes/Tensor-1.html#logSumExp\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"log\",\"url\":\"classes/Tensor-1.html#log\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"log1p\",\"url\":\"classes/Tensor-1.html#log1p\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"logicalAnd\",\"url\":\"classes/Tensor-1.html#logicalAnd\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"logicalNot\",\"url\":\"classes/Tensor-1.html#logicalNot\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"logicalOr\",\"url\":\"classes/Tensor-1.html#logicalOr\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"logicalXor\",\"url\":\"classes/Tensor-1.html#logicalXor\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"matMul\",\"url\":\"classes/Tensor-1.html#matMul\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"maxPool\",\"url\":\"classes/Tensor-1.html#maxPool\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"max\",\"url\":\"classes/Tensor-1.html#max\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"maximum\",\"url\":\"classes/Tensor-1.html#maximum\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"mean\",\"url\":\"classes/Tensor-1.html#mean\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"min\",\"url\":\"classes/Tensor-1.html#min\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"minimum\",\"url\":\"classes/Tensor-1.html#minimum\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"mirrorPad\",\"url\":\"classes/Tensor-1.html#mirrorPad\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"mod\",\"url\":\"classes/Tensor-1.html#mod\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"mul\",\"url\":\"classes/Tensor-1.html#mul\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"neg\",\"url\":\"classes/Tensor-1.html#neg\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"norm\",\"url\":\"classes/Tensor-1.html#norm\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"notEqual\",\"url\":\"classes/Tensor-1.html#notEqual\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"oneHot\",\"url\":\"classes/Tensor-1.html#oneHot\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"onesLike\",\"url\":\"classes/Tensor-1.html#onesLike\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"pad\",\"url\":\"classes/Tensor-1.html#pad\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"pool\",\"url\":\"classes/Tensor-1.html#pool\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"pow\",\"url\":\"classes/Tensor-1.html#pow\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"prelu\",\"url\":\"classes/Tensor-1.html#prelu\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"prod\",\"url\":\"classes/Tensor-1.html#prod\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"reciprocal\",\"url\":\"classes/Tensor-1.html#reciprocal\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"relu\",\"url\":\"classes/Tensor-1.html#relu\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"relu6\",\"url\":\"classes/Tensor-1.html#relu6\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"reshapeAs\",\"url\":\"classes/Tensor-1.html#reshapeAs\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"reshape\",\"url\":\"classes/Tensor-1.html#reshape\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"resizeBilinear\",\"url\":\"classes/Tensor-1.html#resizeBilinear\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"resizeNearestNeighbor\",\"url\":\"classes/Tensor-1.html#resizeNearestNeighbor\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"reverse\",\"url\":\"classes/Tensor-1.html#reverse\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"rfft\",\"url\":\"classes/Tensor-1.html#rfft\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"round\",\"url\":\"classes/Tensor-1.html#round\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"rsqrt\",\"url\":\"classes/Tensor-1.html#rsqrt\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"selu\",\"url\":\"classes/Tensor-1.html#selu\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"separableConv2d\",\"url\":\"classes/Tensor-1.html#separableConv2d\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"sigmoid\",\"url\":\"classes/Tensor-1.html#sigmoid\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"sign\",\"url\":\"classes/Tensor-1.html#sign\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"sin\",\"url\":\"classes/Tensor-1.html#sin\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"sinh\",\"url\":\"classes/Tensor-1.html#sinh\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"slice\",\"url\":\"classes/Tensor-1.html#slice\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"softmax\",\"url\":\"classes/Tensor-1.html#softmax\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"softplus\",\"url\":\"classes/Tensor-1.html#softplus\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"spaceToBatchND\",\"url\":\"classes/Tensor-1.html#spaceToBatchND\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"split\",\"url\":\"classes/Tensor-1.html#split\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"sqrt\",\"url\":\"classes/Tensor-1.html#sqrt\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"square\",\"url\":\"classes/Tensor-1.html#square\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"squaredDifference\",\"url\":\"classes/Tensor-1.html#squaredDifference\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"squeeze\",\"url\":\"classes/Tensor-1.html#squeeze\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"stack\",\"url\":\"classes/Tensor-1.html#stack\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"step\",\"url\":\"classes/Tensor-1.html#step\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"stridedSlice\",\"url\":\"classes/Tensor-1.html#stridedSlice\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"sub\",\"url\":\"classes/Tensor-1.html#sub\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"sum\",\"url\":\"classes/Tensor-1.html#sum\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"tan\",\"url\":\"classes/Tensor-1.html#tan\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"tanh\",\"url\":\"classes/Tensor-1.html#tanh\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"tile\",\"url\":\"classes/Tensor-1.html#tile\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"toBool\",\"url\":\"classes/Tensor-1.html#toBool\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"toFloat\",\"url\":\"classes/Tensor-1.html#toFloat\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"toInt\",\"url\":\"classes/Tensor-1.html#toInt\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"topk\",\"url\":\"classes/Tensor-1.html#topk\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/Tensor-1.html#topk.topk-1.__type\",\"classes\":\"tsd-kind-type-literal\",\"parent\":\"Tensor.topk.topk\"},{\"kind\":1024,\"name\":\"values\",\"url\":\"classes/Tensor-1.html#topk.topk-1.__type.values\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Tensor.topk.topk.__type\"},{\"kind\":1024,\"name\":\"indices\",\"url\":\"classes/Tensor-1.html#topk.topk-1.__type.indices\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Tensor.topk.topk.__type\"},{\"kind\":2048,\"name\":\"transpose\",\"url\":\"classes/Tensor-1.html#transpose\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"unique\",\"url\":\"classes/Tensor-1.html#unique\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/Tensor-1.html#unique.unique-1.__type-1\",\"classes\":\"tsd-kind-type-literal\",\"parent\":\"Tensor.unique.unique\"},{\"kind\":1024,\"name\":\"values\",\"url\":\"classes/Tensor-1.html#unique.unique-1.__type-1.values-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Tensor.unique.unique.__type\"},{\"kind\":1024,\"name\":\"indices\",\"url\":\"classes/Tensor-1.html#unique.unique-1.__type-1.indices-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Tensor.unique.unique.__type\"},{\"kind\":2048,\"name\":\"unsortedSegmentSum\",\"url\":\"classes/Tensor-1.html#unsortedSegmentSum\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"unstack\",\"url\":\"classes/Tensor-1.html#unstack\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"where\",\"url\":\"classes/Tensor-1.html#where\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":2048,\"name\":\"zerosLike\",\"url\":\"classes/Tensor-1.html#zerosLike\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Tensor\"},{\"kind\":4,\"name\":\"Tensor\",\"url\":\"modules/Tensor.html\",\"classes\":\"tsd-kind-namespace\"},{\"kind\":4194304,\"name\":\"Tensor4D\",\"url\":\"types/Tensor4D.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":128,\"name\":\"GraphModel\",\"url\":\"classes/GraphModel.html\",\"classes\":\"tsd-kind-class\"},{\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/GraphModel.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"GraphModel\"},{\"kind\":262144,\"name\":\"modelVersion\",\"url\":\"classes/GraphModel.html#modelVersion\",\"classes\":\"tsd-kind-accessor tsd-parent-kind-class\",\"parent\":\"GraphModel\"},{\"kind\":262144,\"name\":\"inputNodes\",\"url\":\"classes/GraphModel.html#inputNodes\",\"classes\":\"tsd-kind-accessor tsd-parent-kind-class\",\"parent\":\"GraphModel\"},{\"kind\":262144,\"name\":\"outputNodes\",\"url\":\"classes/GraphModel.html#outputNodes\",\"classes\":\"tsd-kind-accessor tsd-parent-kind-class\",\"parent\":\"GraphModel\"},{\"kind\":262144,\"name\":\"inputs\",\"url\":\"classes/GraphModel.html#inputs\",\"classes\":\"tsd-kind-accessor tsd-parent-kind-class\",\"parent\":\"GraphModel\"},{\"kind\":262144,\"name\":\"outputs\",\"url\":\"classes/GraphModel.html#outputs\",\"classes\":\"tsd-kind-accessor tsd-parent-kind-class\",\"parent\":\"GraphModel\"},{\"kind\":262144,\"name\":\"weights\",\"url\":\"classes/GraphModel.html#weights\",\"classes\":\"tsd-kind-accessor tsd-parent-kind-class\",\"parent\":\"GraphModel\"},{\"kind\":262144,\"name\":\"metadata\",\"url\":\"classes/GraphModel.html#metadata\",\"classes\":\"tsd-kind-accessor tsd-parent-kind-class\",\"parent\":\"GraphModel\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/GraphModel.html#metadata.metadata-1.__type\",\"classes\":\"tsd-kind-type-literal\",\"parent\":\"GraphModel.metadata.metadata\"},{\"kind\":262144,\"name\":\"modelSignature\",\"url\":\"classes/GraphModel.html#modelSignature\",\"classes\":\"tsd-kind-accessor tsd-parent-kind-class\",\"parent\":\"GraphModel\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/GraphModel.html#modelSignature.modelSignature-1.__type-1\",\"classes\":\"tsd-kind-type-literal\",\"parent\":\"GraphModel.modelSignature.modelSignature\"},{\"kind\":262144,\"name\":\"modelStructuredOutputKeys\",\"url\":\"classes/GraphModel.html#modelStructuredOutputKeys\",\"classes\":\"tsd-kind-accessor tsd-parent-kind-class\",\"parent\":\"GraphModel\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/GraphModel.html#modelStructuredOutputKeys.modelStructuredOutputKeys-1.__type-2\",\"classes\":\"tsd-kind-type-literal\",\"parent\":\"GraphModel.modelStructuredOutputKeys.modelStructuredOutputKeys\"},{\"kind\":2048,\"name\":\"load\",\"url\":\"classes/GraphModel.html#load\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"GraphModel\"},{\"kind\":2048,\"name\":\"loadSync\",\"url\":\"classes/GraphModel.html#loadSync\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"GraphModel\"},{\"kind\":2048,\"name\":\"save\",\"url\":\"classes/GraphModel.html#save\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"GraphModel\"},{\"kind\":2048,\"name\":\"predict\",\"url\":\"classes/GraphModel.html#predict\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"GraphModel\"},{\"kind\":2048,\"name\":\"execute\",\"url\":\"classes/GraphModel.html#execute\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"GraphModel\"},{\"kind\":2048,\"name\":\"executeAsync\",\"url\":\"classes/GraphModel.html#executeAsync\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"GraphModel\"},{\"kind\":2048,\"name\":\"getIntermediateTensors\",\"url\":\"classes/GraphModel.html#getIntermediateTensors\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"GraphModel\"},{\"kind\":2048,\"name\":\"disposeIntermediateTensors\",\"url\":\"classes/GraphModel.html#disposeIntermediateTensors\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"GraphModel\"},{\"kind\":2048,\"name\":\"dispose\",\"url\":\"classes/GraphModel.html#dispose\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"GraphModel\"},{\"kind\":8,\"name\":\"Rank\",\"url\":\"enums/Rank.html\",\"classes\":\"tsd-kind-enum\"},{\"kind\":16,\"name\":\"R0\",\"url\":\"enums/Rank.html#R0\",\"classes\":\"tsd-kind-enum-member tsd-parent-kind-enum\",\"parent\":\"Rank\"},{\"kind\":16,\"name\":\"R1\",\"url\":\"enums/Rank.html#R1\",\"classes\":\"tsd-kind-enum-member tsd-parent-kind-enum\",\"parent\":\"Rank\"},{\"kind\":16,\"name\":\"R2\",\"url\":\"enums/Rank.html#R2\",\"classes\":\"tsd-kind-enum-member tsd-parent-kind-enum\",\"parent\":\"Rank\"},{\"kind\":16,\"name\":\"R3\",\"url\":\"enums/Rank.html#R3\",\"classes\":\"tsd-kind-enum-member tsd-parent-kind-enum\",\"parent\":\"Rank\"},{\"kind\":16,\"name\":\"R4\",\"url\":\"enums/Rank.html#R4\",\"classes\":\"tsd-kind-enum-member tsd-parent-kind-enum\",\"parent\":\"Rank\"},{\"kind\":16,\"name\":\"R5\",\"url\":\"enums/Rank.html#R5\",\"classes\":\"tsd-kind-enum-member tsd-parent-kind-enum\",\"parent\":\"Rank\"},{\"kind\":16,\"name\":\"R6\",\"url\":\"enums/Rank.html#R6\",\"classes\":\"tsd-kind-enum-member tsd-parent-kind-enum\",\"parent\":\"Rank\"},{\"kind\":256,\"name\":\"DrawOptions\",\"url\":\"interfaces/DrawOptions.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"color\",\"url\":\"interfaces/DrawOptions.html#color\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DrawOptions\"},{\"kind\":1024,\"name\":\"alpha\",\"url\":\"interfaces/DrawOptions.html#alpha\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DrawOptions\"},{\"kind\":1024,\"name\":\"labelColor\",\"url\":\"interfaces/DrawOptions.html#labelColor\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DrawOptions\"},{\"kind\":1024,\"name\":\"shadowColor\",\"url\":\"interfaces/DrawOptions.html#shadowColor\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DrawOptions\"},{\"kind\":1024,\"name\":\"font\",\"url\":\"interfaces/DrawOptions.html#font\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DrawOptions\"},{\"kind\":1024,\"name\":\"lineHeight\",\"url\":\"interfaces/DrawOptions.html#lineHeight\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DrawOptions\"},{\"kind\":1024,\"name\":\"lineWidth\",\"url\":\"interfaces/DrawOptions.html#lineWidth\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DrawOptions\"},{\"kind\":1024,\"name\":\"pointSize\",\"url\":\"interfaces/DrawOptions.html#pointSize\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DrawOptions\"},{\"kind\":1024,\"name\":\"roundRect\",\"url\":\"interfaces/DrawOptions.html#roundRect\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DrawOptions\"},{\"kind\":1024,\"name\":\"drawPoints\",\"url\":\"interfaces/DrawOptions.html#drawPoints\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DrawOptions\"},{\"kind\":1024,\"name\":\"drawLabels\",\"url\":\"interfaces/DrawOptions.html#drawLabels\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DrawOptions\"},{\"kind\":1024,\"name\":\"drawAttention\",\"url\":\"interfaces/DrawOptions.html#drawAttention\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DrawOptions\"},{\"kind\":1024,\"name\":\"drawGestures\",\"url\":\"interfaces/DrawOptions.html#drawGestures\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DrawOptions\"},{\"kind\":1024,\"name\":\"drawBoxes\",\"url\":\"interfaces/DrawOptions.html#drawBoxes\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DrawOptions\"},{\"kind\":1024,\"name\":\"drawPolygons\",\"url\":\"interfaces/DrawOptions.html#drawPolygons\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DrawOptions\"},{\"kind\":1024,\"name\":\"drawGaze\",\"url\":\"interfaces/DrawOptions.html#drawGaze\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DrawOptions\"},{\"kind\":1024,\"name\":\"fillPolygons\",\"url\":\"interfaces/DrawOptions.html#fillPolygons\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DrawOptions\"},{\"kind\":1024,\"name\":\"useDepth\",\"url\":\"interfaces/DrawOptions.html#useDepth\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DrawOptions\"},{\"kind\":1024,\"name\":\"useCurves\",\"url\":\"interfaces/DrawOptions.html#useCurves\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DrawOptions\"},{\"kind\":1024,\"name\":\"faceLabels\",\"url\":\"interfaces/DrawOptions.html#faceLabels\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DrawOptions\"},{\"kind\":1024,\"name\":\"bodyLabels\",\"url\":\"interfaces/DrawOptions.html#bodyLabels\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DrawOptions\"},{\"kind\":1024,\"name\":\"bodyPartLabels\",\"url\":\"interfaces/DrawOptions.html#bodyPartLabels\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DrawOptions\"},{\"kind\":1024,\"name\":\"handLabels\",\"url\":\"interfaces/DrawOptions.html#handLabels\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DrawOptions\"},{\"kind\":1024,\"name\":\"fingerLabels\",\"url\":\"interfaces/DrawOptions.html#fingerLabels\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DrawOptions\"},{\"kind\":1024,\"name\":\"objectLabels\",\"url\":\"interfaces/DrawOptions.html#objectLabels\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DrawOptions\"},{\"kind\":1024,\"name\":\"gestureLabels\",\"url\":\"interfaces/DrawOptions.html#gestureLabels\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"DrawOptions\"},{\"kind\":4194304,\"name\":\"Box\",\"url\":\"types/Box.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"Point\",\"url\":\"types/Point.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":32,\"name\":\"env\",\"url\":\"variables/env-1.html\",\"classes\":\"tsd-kind-variable\"},{\"kind\":128,\"name\":\"Env\",\"url\":\"classes/Env.html\",\"classes\":\"tsd-kind-class\"},{\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/Env.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"Env\"},{\"kind\":1024,\"name\":\"browser\",\"url\":\"classes/Env.html#browser\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Env\"},{\"kind\":1024,\"name\":\"node\",\"url\":\"classes/Env.html#node\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Env\"},{\"kind\":1024,\"name\":\"worker\",\"url\":\"classes/Env.html#worker\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Env\"},{\"kind\":1024,\"name\":\"platform\",\"url\":\"classes/Env.html#platform\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Env\"},{\"kind\":1024,\"name\":\"agent\",\"url\":\"classes/Env.html#agent\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Env\"},{\"kind\":1024,\"name\":\"backends\",\"url\":\"classes/Env.html#backends\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Env\"},{\"kind\":1024,\"name\":\"initial\",\"url\":\"classes/Env.html#initial\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Env\"},{\"kind\":1024,\"name\":\"filter\",\"url\":\"classes/Env.html#filter\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Env\"},{\"kind\":1024,\"name\":\"tfjs\",\"url\":\"classes/Env.html#tfjs\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Env\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/Env.html#__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"Env\"},{\"kind\":1024,\"name\":\"version\",\"url\":\"classes/Env.html#__type-2.version-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Env.__type\"},{\"kind\":1024,\"name\":\"offscreen\",\"url\":\"classes/Env.html#offscreen\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Env\"},{\"kind\":1024,\"name\":\"perfadd\",\"url\":\"classes/Env.html#perfadd\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Env\"},{\"kind\":1024,\"name\":\"tensorflow\",\"url\":\"classes/Env.html#tensorflow\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Env\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/Env.html#__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"Env\"},{\"kind\":1024,\"name\":\"version\",\"url\":\"classes/Env.html#__type-1.version\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Env.__type\"},{\"kind\":1024,\"name\":\"gpu\",\"url\":\"classes/Env.html#__type-1.gpu\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Env.__type\"},{\"kind\":1024,\"name\":\"wasm\",\"url\":\"classes/Env.html#wasm\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Env\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/Env.html#__type-3\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"Env\"},{\"kind\":1024,\"name\":\"supported\",\"url\":\"classes/Env.html#__type-3.supported\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Env.__type\"},{\"kind\":1024,\"name\":\"backend\",\"url\":\"classes/Env.html#__type-3.backend\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Env.__type\"},{\"kind\":1024,\"name\":\"simd\",\"url\":\"classes/Env.html#__type-3.simd\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Env.__type\"},{\"kind\":1024,\"name\":\"multithread\",\"url\":\"classes/Env.html#__type-3.multithread\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Env.__type\"},{\"kind\":1024,\"name\":\"webgl\",\"url\":\"classes/Env.html#webgl\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Env\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/Env.html#__type-4\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"Env\"},{\"kind\":1024,\"name\":\"supported\",\"url\":\"classes/Env.html#__type-4.supported-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Env.__type\"},{\"kind\":1024,\"name\":\"backend\",\"url\":\"classes/Env.html#__type-4.backend-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Env.__type\"},{\"kind\":1024,\"name\":\"version\",\"url\":\"classes/Env.html#__type-4.version-2\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Env.__type\"},{\"kind\":1024,\"name\":\"renderer\",\"url\":\"classes/Env.html#__type-4.renderer\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Env.__type\"},{\"kind\":1024,\"name\":\"shader\",\"url\":\"classes/Env.html#__type-4.shader\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Env.__type\"},{\"kind\":1024,\"name\":\"vendor\",\"url\":\"classes/Env.html#__type-4.vendor\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Env.__type\"},{\"kind\":1024,\"name\":\"webgpu\",\"url\":\"classes/Env.html#webgpu\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Env\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/Env.html#__type-5\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"Env\"},{\"kind\":1024,\"name\":\"supported\",\"url\":\"classes/Env.html#__type-5.supported-2\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Env.__type\"},{\"kind\":1024,\"name\":\"backend\",\"url\":\"classes/Env.html#__type-5.backend-2\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Env.__type\"},{\"kind\":1024,\"name\":\"adapter\",\"url\":\"classes/Env.html#__type-5.adapter\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Env.__type\"},{\"kind\":1024,\"name\":\"cpu\",\"url\":\"classes/Env.html#cpu\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Env\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/Env.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"Env\"},{\"kind\":1024,\"name\":\"model\",\"url\":\"classes/Env.html#__type.model\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Env.__type\"},{\"kind\":1024,\"name\":\"flags\",\"url\":\"classes/Env.html#__type.flags\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Env.__type\"},{\"kind\":1024,\"name\":\"kernels\",\"url\":\"classes/Env.html#kernels\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Env\"},{\"kind\":1024,\"name\":\"Canvas\",\"url\":\"classes/Env.html#Canvas\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Env\"},{\"kind\":1024,\"name\":\"Image\",\"url\":\"classes/Env.html#Image\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Env\"},{\"kind\":1024,\"name\":\"ImageData\",\"url\":\"classes/Env.html#ImageData\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Env\"},{\"kind\":2048,\"name\":\"updateBackend\",\"url\":\"classes/Env.html#updateBackend\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Env\"},{\"kind\":2048,\"name\":\"updateCPU\",\"url\":\"classes/Env.html#updateCPU\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Env\"},{\"kind\":4194304,\"name\":\"FaceGesture\",\"url\":\"types/FaceGesture.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"BodyGesture\",\"url\":\"types/BodyGesture.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"HandGesture\",\"url\":\"types/HandGesture.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"IrisGesture\",\"url\":\"types/IrisGesture.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"Emotion\",\"url\":\"types/Emotion.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"Finger\",\"url\":\"types/Finger.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"FingerCurl\",\"url\":\"types/FingerCurl.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"FingerDirection\",\"url\":\"types/FingerDirection.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"HandType\",\"url\":\"types/HandType.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"Gender\",\"url\":\"types/Gender.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"Race\",\"url\":\"types/Race.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"FaceLandmark\",\"url\":\"types/FaceLandmark.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"BodyLandmark\",\"url\":\"types/BodyLandmark.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"BodyAnnotation\",\"url\":\"types/BodyAnnotation.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"ObjectType\",\"url\":\"types/ObjectType.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":128,\"name\":\"WebCam\",\"url\":\"classes/WebCam.html\",\"classes\":\"tsd-kind-class\"},{\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/WebCam.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"WebCam\"},{\"kind\":1024,\"name\":\"config\",\"url\":\"classes/WebCam.html#config\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"WebCam\"},{\"kind\":1024,\"name\":\"element\",\"url\":\"classes/WebCam.html#element\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"WebCam\"},{\"kind\":1024,\"name\":\"stream\",\"url\":\"classes/WebCam.html#stream\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"WebCam\"},{\"kind\":1024,\"name\":\"devices\",\"url\":\"classes/WebCam.html#devices\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"WebCam\"},{\"kind\":262144,\"name\":\"track\",\"url\":\"classes/WebCam.html#track\",\"classes\":\"tsd-kind-accessor tsd-parent-kind-class\",\"parent\":\"WebCam\"},{\"kind\":262144,\"name\":\"capabilities\",\"url\":\"classes/WebCam.html#capabilities\",\"classes\":\"tsd-kind-accessor tsd-parent-kind-class\",\"parent\":\"WebCam\"},{\"kind\":262144,\"name\":\"constraints\",\"url\":\"classes/WebCam.html#constraints\",\"classes\":\"tsd-kind-accessor tsd-parent-kind-class\",\"parent\":\"WebCam\"},{\"kind\":262144,\"name\":\"settings\",\"url\":\"classes/WebCam.html#settings\",\"classes\":\"tsd-kind-accessor tsd-parent-kind-class\",\"parent\":\"WebCam\"},{\"kind\":262144,\"name\":\"label\",\"url\":\"classes/WebCam.html#label\",\"classes\":\"tsd-kind-accessor tsd-parent-kind-class\",\"parent\":\"WebCam\"},{\"kind\":262144,\"name\":\"paused\",\"url\":\"classes/WebCam.html#paused\",\"classes\":\"tsd-kind-accessor tsd-parent-kind-class\",\"parent\":\"WebCam\"},{\"kind\":262144,\"name\":\"width\",\"url\":\"classes/WebCam.html#width\",\"classes\":\"tsd-kind-accessor tsd-parent-kind-class\",\"parent\":\"WebCam\"},{\"kind\":262144,\"name\":\"height\",\"url\":\"classes/WebCam.html#height\",\"classes\":\"tsd-kind-accessor tsd-parent-kind-class\",\"parent\":\"WebCam\"},{\"kind\":2048,\"name\":\"enumerate\",\"url\":\"classes/WebCam.html#enumerate\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"WebCam\"},{\"kind\":2048,\"name\":\"start\",\"url\":\"classes/WebCam.html#start\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"WebCam\"},{\"kind\":2048,\"name\":\"pause\",\"url\":\"classes/WebCam.html#pause\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"WebCam\"},{\"kind\":2048,\"name\":\"play\",\"url\":\"classes/WebCam.html#play\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"WebCam\"},{\"kind\":2048,\"name\":\"stop\",\"url\":\"classes/WebCam.html#stop\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"WebCam\"},{\"kind\":256,\"name\":\"WebCamConfig\",\"url\":\"interfaces/WebCamConfig.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"element\",\"url\":\"interfaces/WebCamConfig.html#element\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"WebCamConfig\"},{\"kind\":1024,\"name\":\"debug\",\"url\":\"interfaces/WebCamConfig.html#debug\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"WebCamConfig\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/WebCamConfig.html#mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"WebCamConfig\"},{\"kind\":1024,\"name\":\"crop\",\"url\":\"interfaces/WebCamConfig.html#crop\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"WebCamConfig\"},{\"kind\":1024,\"name\":\"width\",\"url\":\"interfaces/WebCamConfig.html#width\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"WebCamConfig\"},{\"kind\":1024,\"name\":\"height\",\"url\":\"interfaces/WebCamConfig.html#height\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"WebCamConfig\"},{\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/WebCamConfig.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"WebCamConfig\"},{\"kind\":256,\"name\":\"ModelInfo\",\"url\":\"interfaces/ModelInfo.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/ModelInfo.html#name\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ModelInfo\"},{\"kind\":1024,\"name\":\"inCache\",\"url\":\"interfaces/ModelInfo.html#inCache\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ModelInfo\"},{\"kind\":1024,\"name\":\"sizeDesired\",\"url\":\"interfaces/ModelInfo.html#sizeDesired\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ModelInfo\"},{\"kind\":1024,\"name\":\"sizeFromManifest\",\"url\":\"interfaces/ModelInfo.html#sizeFromManifest\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ModelInfo\"},{\"kind\":1024,\"name\":\"sizeLoadedWeights\",\"url\":\"interfaces/ModelInfo.html#sizeLoadedWeights\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ModelInfo\"},{\"kind\":1024,\"name\":\"url\",\"url\":\"interfaces/ModelInfo.html#url\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ModelInfo\"},{\"kind\":4194304,\"name\":\"Events\",\"url\":\"types/Events.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"AnyCanvas\",\"url\":\"types/AnyCanvas.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"AnyImage\",\"url\":\"types/AnyImage.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"AnyVideo\",\"url\":\"types/AnyVideo.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"ImageObjects\",\"url\":\"types/ImageObjects.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"ExternalCanvas\",\"url\":\"types/ExternalCanvas.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"Input\",\"url\":\"types/Input.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"BackendEnum\",\"url\":\"types/BackendEnum.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"WarmupEnum\",\"url\":\"types/WarmupEnum.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"SegmentationEnum\",\"url\":\"types/SegmentationEnum.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":256,\"name\":\"GenericConfig\",\"url\":\"interfaces/GenericConfig.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"enabled\",\"url\":\"interfaces/GenericConfig.html#enabled\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"GenericConfig\"},{\"kind\":1024,\"name\":\"modelPath\",\"url\":\"interfaces/GenericConfig.html#modelPath\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"GenericConfig\"},{\"kind\":1024,\"name\":\"skipFrames\",\"url\":\"interfaces/GenericConfig.html#skipFrames\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"GenericConfig\"},{\"kind\":1024,\"name\":\"skipTime\",\"url\":\"interfaces/GenericConfig.html#skipTime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"GenericConfig\"},{\"kind\":256,\"name\":\"FaceDetectorConfig\",\"url\":\"interfaces/FaceDetectorConfig.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"rotation\",\"url\":\"interfaces/FaceDetectorConfig.html#rotation\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceDetectorConfig\"},{\"kind\":1024,\"name\":\"maxDetected\",\"url\":\"interfaces/FaceDetectorConfig.html#maxDetected\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceDetectorConfig\"},{\"kind\":1024,\"name\":\"minConfidence\",\"url\":\"interfaces/FaceDetectorConfig.html#minConfidence\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceDetectorConfig\"},{\"kind\":1024,\"name\":\"iouThreshold\",\"url\":\"interfaces/FaceDetectorConfig.html#iouThreshold\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceDetectorConfig\"},{\"kind\":1024,\"name\":\"mask\",\"url\":\"interfaces/FaceDetectorConfig.html#mask\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceDetectorConfig\"},{\"kind\":1024,\"name\":\"return\",\"url\":\"interfaces/FaceDetectorConfig.html#return\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceDetectorConfig\"},{\"kind\":1024,\"name\":\"enabled\",\"url\":\"interfaces/FaceDetectorConfig.html#enabled\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceDetectorConfig\"},{\"kind\":1024,\"name\":\"modelPath\",\"url\":\"interfaces/FaceDetectorConfig.html#modelPath\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceDetectorConfig\"},{\"kind\":1024,\"name\":\"skipFrames\",\"url\":\"interfaces/FaceDetectorConfig.html#skipFrames\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceDetectorConfig\"},{\"kind\":1024,\"name\":\"skipTime\",\"url\":\"interfaces/FaceDetectorConfig.html#skipTime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceDetectorConfig\"},{\"kind\":256,\"name\":\"FaceMeshConfig\",\"url\":\"interfaces/FaceMeshConfig.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"keepInvalid\",\"url\":\"interfaces/FaceMeshConfig.html#keepInvalid\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceMeshConfig\"},{\"kind\":1024,\"name\":\"enabled\",\"url\":\"interfaces/FaceMeshConfig.html#enabled\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceMeshConfig\"},{\"kind\":1024,\"name\":\"modelPath\",\"url\":\"interfaces/FaceMeshConfig.html#modelPath\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceMeshConfig\"},{\"kind\":1024,\"name\":\"skipFrames\",\"url\":\"interfaces/FaceMeshConfig.html#skipFrames\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceMeshConfig\"},{\"kind\":1024,\"name\":\"skipTime\",\"url\":\"interfaces/FaceMeshConfig.html#skipTime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceMeshConfig\"},{\"kind\":256,\"name\":\"FaceIrisConfig\",\"url\":\"interfaces/FaceIrisConfig.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"enabled\",\"url\":\"interfaces/FaceIrisConfig.html#enabled\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceIrisConfig\"},{\"kind\":1024,\"name\":\"modelPath\",\"url\":\"interfaces/FaceIrisConfig.html#modelPath\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceIrisConfig\"},{\"kind\":1024,\"name\":\"skipFrames\",\"url\":\"interfaces/FaceIrisConfig.html#skipFrames\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceIrisConfig\"},{\"kind\":1024,\"name\":\"skipTime\",\"url\":\"interfaces/FaceIrisConfig.html#skipTime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceIrisConfig\"},{\"kind\":256,\"name\":\"FaceAttentionConfig\",\"url\":\"interfaces/FaceAttentionConfig.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"enabled\",\"url\":\"interfaces/FaceAttentionConfig.html#enabled\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceAttentionConfig\"},{\"kind\":1024,\"name\":\"modelPath\",\"url\":\"interfaces/FaceAttentionConfig.html#modelPath\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceAttentionConfig\"},{\"kind\":1024,\"name\":\"skipFrames\",\"url\":\"interfaces/FaceAttentionConfig.html#skipFrames\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceAttentionConfig\"},{\"kind\":1024,\"name\":\"skipTime\",\"url\":\"interfaces/FaceAttentionConfig.html#skipTime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceAttentionConfig\"},{\"kind\":256,\"name\":\"FaceDescriptionConfig\",\"url\":\"interfaces/FaceDescriptionConfig.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"minConfidence\",\"url\":\"interfaces/FaceDescriptionConfig.html#minConfidence\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceDescriptionConfig\"},{\"kind\":1024,\"name\":\"enabled\",\"url\":\"interfaces/FaceDescriptionConfig.html#enabled\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceDescriptionConfig\"},{\"kind\":1024,\"name\":\"modelPath\",\"url\":\"interfaces/FaceDescriptionConfig.html#modelPath\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceDescriptionConfig\"},{\"kind\":1024,\"name\":\"skipFrames\",\"url\":\"interfaces/FaceDescriptionConfig.html#skipFrames\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceDescriptionConfig\"},{\"kind\":1024,\"name\":\"skipTime\",\"url\":\"interfaces/FaceDescriptionConfig.html#skipTime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceDescriptionConfig\"},{\"kind\":256,\"name\":\"FaceEmotionConfig\",\"url\":\"interfaces/FaceEmotionConfig.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"minConfidence\",\"url\":\"interfaces/FaceEmotionConfig.html#minConfidence\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceEmotionConfig\"},{\"kind\":1024,\"name\":\"enabled\",\"url\":\"interfaces/FaceEmotionConfig.html#enabled\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceEmotionConfig\"},{\"kind\":1024,\"name\":\"modelPath\",\"url\":\"interfaces/FaceEmotionConfig.html#modelPath\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceEmotionConfig\"},{\"kind\":1024,\"name\":\"skipFrames\",\"url\":\"interfaces/FaceEmotionConfig.html#skipFrames\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceEmotionConfig\"},{\"kind\":1024,\"name\":\"skipTime\",\"url\":\"interfaces/FaceEmotionConfig.html#skipTime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceEmotionConfig\"},{\"kind\":256,\"name\":\"FaceAntiSpoofConfig\",\"url\":\"interfaces/FaceAntiSpoofConfig.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"enabled\",\"url\":\"interfaces/FaceAntiSpoofConfig.html#enabled\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceAntiSpoofConfig\"},{\"kind\":1024,\"name\":\"modelPath\",\"url\":\"interfaces/FaceAntiSpoofConfig.html#modelPath\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceAntiSpoofConfig\"},{\"kind\":1024,\"name\":\"skipFrames\",\"url\":\"interfaces/FaceAntiSpoofConfig.html#skipFrames\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceAntiSpoofConfig\"},{\"kind\":1024,\"name\":\"skipTime\",\"url\":\"interfaces/FaceAntiSpoofConfig.html#skipTime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceAntiSpoofConfig\"},{\"kind\":256,\"name\":\"FaceLivenessConfig\",\"url\":\"interfaces/FaceLivenessConfig.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"enabled\",\"url\":\"interfaces/FaceLivenessConfig.html#enabled\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceLivenessConfig\"},{\"kind\":1024,\"name\":\"modelPath\",\"url\":\"interfaces/FaceLivenessConfig.html#modelPath\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceLivenessConfig\"},{\"kind\":1024,\"name\":\"skipFrames\",\"url\":\"interfaces/FaceLivenessConfig.html#skipFrames\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceLivenessConfig\"},{\"kind\":1024,\"name\":\"skipTime\",\"url\":\"interfaces/FaceLivenessConfig.html#skipTime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceLivenessConfig\"},{\"kind\":256,\"name\":\"FaceGearConfig\",\"url\":\"interfaces/FaceGearConfig.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"minConfidence\",\"url\":\"interfaces/FaceGearConfig.html#minConfidence\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceGearConfig\"},{\"kind\":1024,\"name\":\"enabled\",\"url\":\"interfaces/FaceGearConfig.html#enabled\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceGearConfig\"},{\"kind\":1024,\"name\":\"modelPath\",\"url\":\"interfaces/FaceGearConfig.html#modelPath\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceGearConfig\"},{\"kind\":1024,\"name\":\"skipFrames\",\"url\":\"interfaces/FaceGearConfig.html#skipFrames\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceGearConfig\"},{\"kind\":1024,\"name\":\"skipTime\",\"url\":\"interfaces/FaceGearConfig.html#skipTime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceGearConfig\"},{\"kind\":256,\"name\":\"FaceConfig\",\"url\":\"interfaces/FaceConfig.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"detector\",\"url\":\"interfaces/FaceConfig.html#detector\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceConfig\"},{\"kind\":1024,\"name\":\"mesh\",\"url\":\"interfaces/FaceConfig.html#mesh\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceConfig\"},{\"kind\":1024,\"name\":\"attention\",\"url\":\"interfaces/FaceConfig.html#attention\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceConfig\"},{\"kind\":1024,\"name\":\"iris\",\"url\":\"interfaces/FaceConfig.html#iris\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceConfig\"},{\"kind\":1024,\"name\":\"description\",\"url\":\"interfaces/FaceConfig.html#description\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceConfig\"},{\"kind\":1024,\"name\":\"emotion\",\"url\":\"interfaces/FaceConfig.html#emotion\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceConfig\"},{\"kind\":1024,\"name\":\"antispoof\",\"url\":\"interfaces/FaceConfig.html#antispoof\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceConfig\"},{\"kind\":1024,\"name\":\"liveness\",\"url\":\"interfaces/FaceConfig.html#liveness\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceConfig\"},{\"kind\":1024,\"name\":\"gear\",\"url\":\"interfaces/FaceConfig.html#gear\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceConfig\"},{\"kind\":1024,\"name\":\"enabled\",\"url\":\"interfaces/FaceConfig.html#enabled\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceConfig\"},{\"kind\":1024,\"name\":\"modelPath\",\"url\":\"interfaces/FaceConfig.html#modelPath\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceConfig\"},{\"kind\":1024,\"name\":\"skipFrames\",\"url\":\"interfaces/FaceConfig.html#skipFrames\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceConfig\"},{\"kind\":1024,\"name\":\"skipTime\",\"url\":\"interfaces/FaceConfig.html#skipTime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"FaceConfig\"},{\"kind\":256,\"name\":\"BodyConfig\",\"url\":\"interfaces/BodyConfig.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"maxDetected\",\"url\":\"interfaces/BodyConfig.html#maxDetected\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"BodyConfig\"},{\"kind\":1024,\"name\":\"minConfidence\",\"url\":\"interfaces/BodyConfig.html#minConfidence\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"BodyConfig\"},{\"kind\":1024,\"name\":\"enabled\",\"url\":\"interfaces/BodyConfig.html#enabled\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"BodyConfig\"},{\"kind\":1024,\"name\":\"modelPath\",\"url\":\"interfaces/BodyConfig.html#modelPath\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"BodyConfig\"},{\"kind\":1024,\"name\":\"skipFrames\",\"url\":\"interfaces/BodyConfig.html#skipFrames\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"BodyConfig\"},{\"kind\":1024,\"name\":\"skipTime\",\"url\":\"interfaces/BodyConfig.html#skipTime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"BodyConfig\"},{\"kind\":256,\"name\":\"HandConfig\",\"url\":\"interfaces/HandConfig.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"rotation\",\"url\":\"interfaces/HandConfig.html#rotation\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"HandConfig\"},{\"kind\":1024,\"name\":\"minConfidence\",\"url\":\"interfaces/HandConfig.html#minConfidence\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"HandConfig\"},{\"kind\":1024,\"name\":\"iouThreshold\",\"url\":\"interfaces/HandConfig.html#iouThreshold\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"HandConfig\"},{\"kind\":1024,\"name\":\"maxDetected\",\"url\":\"interfaces/HandConfig.html#maxDetected\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"HandConfig\"},{\"kind\":1024,\"name\":\"landmarks\",\"url\":\"interfaces/HandConfig.html#landmarks\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"HandConfig\"},{\"kind\":1024,\"name\":\"detector\",\"url\":\"interfaces/HandConfig.html#detector\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"HandConfig\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/HandConfig.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"HandConfig\"},{\"kind\":1024,\"name\":\"modelPath\",\"url\":\"interfaces/HandConfig.html#__type.modelPath\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"HandConfig.__type\"},{\"kind\":1024,\"name\":\"skeleton\",\"url\":\"interfaces/HandConfig.html#skeleton\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"HandConfig\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/HandConfig.html#__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"HandConfig\"},{\"kind\":1024,\"name\":\"modelPath\",\"url\":\"interfaces/HandConfig.html#__type-1.modelPath-2\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"HandConfig.__type\"},{\"kind\":1024,\"name\":\"enabled\",\"url\":\"interfaces/HandConfig.html#enabled\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"HandConfig\"},{\"kind\":1024,\"name\":\"modelPath\",\"url\":\"interfaces/HandConfig.html#modelPath-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"HandConfig\"},{\"kind\":1024,\"name\":\"skipFrames\",\"url\":\"interfaces/HandConfig.html#skipFrames\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"HandConfig\"},{\"kind\":1024,\"name\":\"skipTime\",\"url\":\"interfaces/HandConfig.html#skipTime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"HandConfig\"},{\"kind\":256,\"name\":\"ObjectConfig\",\"url\":\"interfaces/ObjectConfig.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"minConfidence\",\"url\":\"interfaces/ObjectConfig.html#minConfidence\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ObjectConfig\"},{\"kind\":1024,\"name\":\"iouThreshold\",\"url\":\"interfaces/ObjectConfig.html#iouThreshold\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ObjectConfig\"},{\"kind\":1024,\"name\":\"maxDetected\",\"url\":\"interfaces/ObjectConfig.html#maxDetected\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ObjectConfig\"},{\"kind\":1024,\"name\":\"enabled\",\"url\":\"interfaces/ObjectConfig.html#enabled\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"ObjectConfig\"},{\"kind\":1024,\"name\":\"modelPath\",\"url\":\"interfaces/ObjectConfig.html#modelPath\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"ObjectConfig\"},{\"kind\":1024,\"name\":\"skipFrames\",\"url\":\"interfaces/ObjectConfig.html#skipFrames\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"ObjectConfig\"},{\"kind\":1024,\"name\":\"skipTime\",\"url\":\"interfaces/ObjectConfig.html#skipTime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"ObjectConfig\"},{\"kind\":256,\"name\":\"SegmentationConfig\",\"url\":\"interfaces/SegmentationConfig.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"ratio\",\"url\":\"interfaces/SegmentationConfig.html#ratio\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SegmentationConfig\"},{\"kind\":1024,\"name\":\"mode\",\"url\":\"interfaces/SegmentationConfig.html#mode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"SegmentationConfig\"},{\"kind\":1024,\"name\":\"enabled\",\"url\":\"interfaces/SegmentationConfig.html#enabled\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"SegmentationConfig\"},{\"kind\":1024,\"name\":\"modelPath\",\"url\":\"interfaces/SegmentationConfig.html#modelPath\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"SegmentationConfig\"},{\"kind\":1024,\"name\":\"skipFrames\",\"url\":\"interfaces/SegmentationConfig.html#skipFrames\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"SegmentationConfig\"},{\"kind\":1024,\"name\":\"skipTime\",\"url\":\"interfaces/SegmentationConfig.html#skipTime\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"SegmentationConfig\"},{\"kind\":256,\"name\":\"FilterConfig\",\"url\":\"interfaces/FilterConfig.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"enabled\",\"url\":\"interfaces/FilterConfig.html#enabled\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FilterConfig\"},{\"kind\":1024,\"name\":\"equalization\",\"url\":\"interfaces/FilterConfig.html#equalization\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FilterConfig\"},{\"kind\":1024,\"name\":\"width\",\"url\":\"interfaces/FilterConfig.html#width\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FilterConfig\"},{\"kind\":1024,\"name\":\"height\",\"url\":\"interfaces/FilterConfig.html#height\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FilterConfig\"},{\"kind\":1024,\"name\":\"return\",\"url\":\"interfaces/FilterConfig.html#return\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FilterConfig\"},{\"kind\":1024,\"name\":\"flip\",\"url\":\"interfaces/FilterConfig.html#flip\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FilterConfig\"},{\"kind\":1024,\"name\":\"autoBrightness\",\"url\":\"interfaces/FilterConfig.html#autoBrightness\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FilterConfig\"},{\"kind\":1024,\"name\":\"brightness\",\"url\":\"interfaces/FilterConfig.html#brightness\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FilterConfig\"},{\"kind\":1024,\"name\":\"contrast\",\"url\":\"interfaces/FilterConfig.html#contrast\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FilterConfig\"},{\"kind\":1024,\"name\":\"sharpness\",\"url\":\"interfaces/FilterConfig.html#sharpness\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FilterConfig\"},{\"kind\":1024,\"name\":\"blur\",\"url\":\"interfaces/FilterConfig.html#blur\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FilterConfig\"},{\"kind\":1024,\"name\":\"saturation\",\"url\":\"interfaces/FilterConfig.html#saturation\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FilterConfig\"},{\"kind\":1024,\"name\":\"hue\",\"url\":\"interfaces/FilterConfig.html#hue\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FilterConfig\"},{\"kind\":1024,\"name\":\"negative\",\"url\":\"interfaces/FilterConfig.html#negative\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FilterConfig\"},{\"kind\":1024,\"name\":\"sepia\",\"url\":\"interfaces/FilterConfig.html#sepia\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FilterConfig\"},{\"kind\":1024,\"name\":\"vintage\",\"url\":\"interfaces/FilterConfig.html#vintage\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FilterConfig\"},{\"kind\":1024,\"name\":\"kodachrome\",\"url\":\"interfaces/FilterConfig.html#kodachrome\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FilterConfig\"},{\"kind\":1024,\"name\":\"technicolor\",\"url\":\"interfaces/FilterConfig.html#technicolor\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FilterConfig\"},{\"kind\":1024,\"name\":\"polaroid\",\"url\":\"interfaces/FilterConfig.html#polaroid\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FilterConfig\"},{\"kind\":1024,\"name\":\"pixelate\",\"url\":\"interfaces/FilterConfig.html#pixelate\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FilterConfig\"},{\"kind\":256,\"name\":\"GestureConfig\",\"url\":\"interfaces/GestureConfig.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"enabled\",\"url\":\"interfaces/GestureConfig.html#enabled\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"GestureConfig\"},{\"kind\":256,\"name\":\"Config\",\"url\":\"interfaces/Config.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"backend\",\"url\":\"interfaces/Config.html#backend\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Config\"},{\"kind\":1024,\"name\":\"wasmPath\",\"url\":\"interfaces/Config.html#wasmPath\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Config\"},{\"kind\":1024,\"name\":\"wasmPlatformFetch\",\"url\":\"interfaces/Config.html#wasmPlatformFetch\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Config\"},{\"kind\":1024,\"name\":\"debug\",\"url\":\"interfaces/Config.html#debug\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Config\"},{\"kind\":1024,\"name\":\"async\",\"url\":\"interfaces/Config.html#async\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Config\"},{\"kind\":1024,\"name\":\"warmup\",\"url\":\"interfaces/Config.html#warmup\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Config\"},{\"kind\":1024,\"name\":\"modelBasePath\",\"url\":\"interfaces/Config.html#modelBasePath\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Config\"},{\"kind\":1024,\"name\":\"cacheModels\",\"url\":\"interfaces/Config.html#cacheModels\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Config\"},{\"kind\":1024,\"name\":\"validateModels\",\"url\":\"interfaces/Config.html#validateModels\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Config\"},{\"kind\":1024,\"name\":\"cacheSensitivity\",\"url\":\"interfaces/Config.html#cacheSensitivity\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Config\"},{\"kind\":1024,\"name\":\"flags\",\"url\":\"interfaces/Config.html#flags\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Config\"},{\"kind\":1024,\"name\":\"softwareKernels\",\"url\":\"interfaces/Config.html#softwareKernels\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Config\"},{\"kind\":1024,\"name\":\"deallocate\",\"url\":\"interfaces/Config.html#deallocate\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Config\"},{\"kind\":1024,\"name\":\"skipAllowed\",\"url\":\"interfaces/Config.html#skipAllowed\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Config\"},{\"kind\":1024,\"name\":\"filter\",\"url\":\"interfaces/Config.html#filter\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Config\"},{\"kind\":1024,\"name\":\"gesture\",\"url\":\"interfaces/Config.html#gesture\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Config\"},{\"kind\":1024,\"name\":\"face\",\"url\":\"interfaces/Config.html#face\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Config\"},{\"kind\":1024,\"name\":\"body\",\"url\":\"interfaces/Config.html#body\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Config\"},{\"kind\":1024,\"name\":\"hand\",\"url\":\"interfaces/Config.html#hand\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Config\"},{\"kind\":1024,\"name\":\"object\",\"url\":\"interfaces/Config.html#object\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Config\"},{\"kind\":1024,\"name\":\"segmentation\",\"url\":\"interfaces/Config.html#segmentation\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Config\"},{\"kind\":32,\"name\":\"defaults\",\"url\":\"variables/defaults.html\",\"classes\":\"tsd-kind-variable\"},{\"kind\":256,\"name\":\"FaceResult\",\"url\":\"interfaces/FaceResult.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/FaceResult.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceResult\"},{\"kind\":1024,\"name\":\"score\",\"url\":\"interfaces/FaceResult.html#score\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceResult\"},{\"kind\":1024,\"name\":\"boxScore\",\"url\":\"interfaces/FaceResult.html#boxScore\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceResult\"},{\"kind\":1024,\"name\":\"faceScore\",\"url\":\"interfaces/FaceResult.html#faceScore\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceResult\"},{\"kind\":1024,\"name\":\"box\",\"url\":\"interfaces/FaceResult.html#box\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceResult\"},{\"kind\":1024,\"name\":\"boxRaw\",\"url\":\"interfaces/FaceResult.html#boxRaw\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceResult\"},{\"kind\":1024,\"name\":\"mesh\",\"url\":\"interfaces/FaceResult.html#mesh\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceResult\"},{\"kind\":1024,\"name\":\"meshRaw\",\"url\":\"interfaces/FaceResult.html#meshRaw\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceResult\"},{\"kind\":1024,\"name\":\"annotations\",\"url\":\"interfaces/FaceResult.html#annotations\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceResult\"},{\"kind\":1024,\"name\":\"age\",\"url\":\"interfaces/FaceResult.html#age\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceResult\"},{\"kind\":1024,\"name\":\"gender\",\"url\":\"interfaces/FaceResult.html#gender\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceResult\"},{\"kind\":1024,\"name\":\"genderScore\",\"url\":\"interfaces/FaceResult.html#genderScore\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceResult\"},{\"kind\":1024,\"name\":\"emotion\",\"url\":\"interfaces/FaceResult.html#emotion\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceResult\"},{\"kind\":1024,\"name\":\"race\",\"url\":\"interfaces/FaceResult.html#race\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceResult\"},{\"kind\":1024,\"name\":\"embedding\",\"url\":\"interfaces/FaceResult.html#embedding\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceResult\"},{\"kind\":1024,\"name\":\"distance\",\"url\":\"interfaces/FaceResult.html#distance\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceResult\"},{\"kind\":1024,\"name\":\"real\",\"url\":\"interfaces/FaceResult.html#real\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceResult\"},{\"kind\":1024,\"name\":\"live\",\"url\":\"interfaces/FaceResult.html#live\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceResult\"},{\"kind\":1024,\"name\":\"rotation\",\"url\":\"interfaces/FaceResult.html#rotation\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceResult\"},{\"kind\":1024,\"name\":\"tensor\",\"url\":\"interfaces/FaceResult.html#tensor\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"FaceResult\"},{\"kind\":4194304,\"name\":\"BodyLandmarkPoseNet\",\"url\":\"types/BodyLandmarkPoseNet.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"BodyLandmarkMoveNet\",\"url\":\"types/BodyLandmarkMoveNet.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"BodyLandmarkEfficientNet\",\"url\":\"types/BodyLandmarkEfficientNet.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"BodyLandmarkBlazePose\",\"url\":\"types/BodyLandmarkBlazePose.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"BodyAnnotationBlazePose\",\"url\":\"types/BodyAnnotationBlazePose.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":4194304,\"name\":\"BodyAnnotationEfficientPose\",\"url\":\"types/BodyAnnotationEfficientPose.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":256,\"name\":\"BodyKeypoint\",\"url\":\"interfaces/BodyKeypoint.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"part\",\"url\":\"interfaces/BodyKeypoint.html#part\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"BodyKeypoint\"},{\"kind\":1024,\"name\":\"position\",\"url\":\"interfaces/BodyKeypoint.html#position\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"BodyKeypoint\"},{\"kind\":1024,\"name\":\"positionRaw\",\"url\":\"interfaces/BodyKeypoint.html#positionRaw\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"BodyKeypoint\"},{\"kind\":1024,\"name\":\"distance\",\"url\":\"interfaces/BodyKeypoint.html#distance\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"BodyKeypoint\"},{\"kind\":1024,\"name\":\"score\",\"url\":\"interfaces/BodyKeypoint.html#score\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"BodyKeypoint\"},{\"kind\":256,\"name\":\"BodyResult\",\"url\":\"interfaces/BodyResult.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/BodyResult.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"BodyResult\"},{\"kind\":1024,\"name\":\"score\",\"url\":\"interfaces/BodyResult.html#score\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"BodyResult\"},{\"kind\":1024,\"name\":\"box\",\"url\":\"interfaces/BodyResult.html#box\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"BodyResult\"},{\"kind\":1024,\"name\":\"boxRaw\",\"url\":\"interfaces/BodyResult.html#boxRaw\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"BodyResult\"},{\"kind\":1024,\"name\":\"keypoints\",\"url\":\"interfaces/BodyResult.html#keypoints\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"BodyResult\"},{\"kind\":1024,\"name\":\"annotations\",\"url\":\"interfaces/BodyResult.html#annotations\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"BodyResult\"},{\"kind\":256,\"name\":\"HandResult\",\"url\":\"interfaces/HandResult.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/HandResult.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"HandResult\"},{\"kind\":1024,\"name\":\"score\",\"url\":\"interfaces/HandResult.html#score\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"HandResult\"},{\"kind\":1024,\"name\":\"boxScore\",\"url\":\"interfaces/HandResult.html#boxScore\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"HandResult\"},{\"kind\":1024,\"name\":\"fingerScore\",\"url\":\"interfaces/HandResult.html#fingerScore\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"HandResult\"},{\"kind\":1024,\"name\":\"box\",\"url\":\"interfaces/HandResult.html#box\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"HandResult\"},{\"kind\":1024,\"name\":\"boxRaw\",\"url\":\"interfaces/HandResult.html#boxRaw\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"HandResult\"},{\"kind\":1024,\"name\":\"keypoints\",\"url\":\"interfaces/HandResult.html#keypoints\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"HandResult\"},{\"kind\":1024,\"name\":\"label\",\"url\":\"interfaces/HandResult.html#label\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"HandResult\"},{\"kind\":1024,\"name\":\"annotations\",\"url\":\"interfaces/HandResult.html#annotations\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"HandResult\"},{\"kind\":1024,\"name\":\"landmarks\",\"url\":\"interfaces/HandResult.html#landmarks\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"HandResult\"},{\"kind\":256,\"name\":\"ObjectResult\",\"url\":\"interfaces/ObjectResult.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/ObjectResult.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ObjectResult\"},{\"kind\":1024,\"name\":\"score\",\"url\":\"interfaces/ObjectResult.html#score\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ObjectResult\"},{\"kind\":1024,\"name\":\"class\",\"url\":\"interfaces/ObjectResult.html#class\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ObjectResult\"},{\"kind\":1024,\"name\":\"label\",\"url\":\"interfaces/ObjectResult.html#label\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ObjectResult\"},{\"kind\":1024,\"name\":\"box\",\"url\":\"interfaces/ObjectResult.html#box\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ObjectResult\"},{\"kind\":1024,\"name\":\"boxRaw\",\"url\":\"interfaces/ObjectResult.html#boxRaw\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"ObjectResult\"},{\"kind\":4194304,\"name\":\"GestureResult\",\"url\":\"types/GestureResult.html\",\"classes\":\"tsd-kind-type-alias\"},{\"kind\":256,\"name\":\"PersonResult\",\"url\":\"interfaces/PersonResult.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/PersonResult.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PersonResult\"},{\"kind\":1024,\"name\":\"face\",\"url\":\"interfaces/PersonResult.html#face\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PersonResult\"},{\"kind\":1024,\"name\":\"body\",\"url\":\"interfaces/PersonResult.html#body\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PersonResult\"},{\"kind\":1024,\"name\":\"hands\",\"url\":\"interfaces/PersonResult.html#hands\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PersonResult\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/PersonResult.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"PersonResult\"},{\"kind\":1024,\"name\":\"left\",\"url\":\"interfaces/PersonResult.html#__type.left\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"PersonResult.__type\"},{\"kind\":1024,\"name\":\"right\",\"url\":\"interfaces/PersonResult.html#__type.right\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"PersonResult.__type\"},{\"kind\":1024,\"name\":\"gestures\",\"url\":\"interfaces/PersonResult.html#gestures\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PersonResult\"},{\"kind\":1024,\"name\":\"box\",\"url\":\"interfaces/PersonResult.html#box\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PersonResult\"},{\"kind\":1024,\"name\":\"boxRaw\",\"url\":\"interfaces/PersonResult.html#boxRaw\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"PersonResult\"},{\"kind\":256,\"name\":\"Result\",\"url\":\"interfaces/Result.html\",\"classes\":\"tsd-kind-interface\"},{\"kind\":1024,\"name\":\"face\",\"url\":\"interfaces/Result.html#face\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Result\"},{\"kind\":1024,\"name\":\"body\",\"url\":\"interfaces/Result.html#body\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Result\"},{\"kind\":1024,\"name\":\"hand\",\"url\":\"interfaces/Result.html#hand\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Result\"},{\"kind\":1024,\"name\":\"gesture\",\"url\":\"interfaces/Result.html#gesture\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Result\"},{\"kind\":1024,\"name\":\"object\",\"url\":\"interfaces/Result.html#object\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Result\"},{\"kind\":1024,\"name\":\"performance\",\"url\":\"interfaces/Result.html#performance\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Result\"},{\"kind\":1024,\"name\":\"canvas\",\"url\":\"interfaces/Result.html#canvas\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Result\"},{\"kind\":1024,\"name\":\"timestamp\",\"url\":\"interfaces/Result.html#timestamp\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Result\"},{\"kind\":1024,\"name\":\"persons\",\"url\":\"interfaces/Result.html#persons\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Result\"},{\"kind\":1024,\"name\":\"error\",\"url\":\"interfaces/Result.html#error\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Result\"},{\"kind\":1024,\"name\":\"width\",\"url\":\"interfaces/Result.html#width\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Result\"},{\"kind\":1024,\"name\":\"height\",\"url\":\"interfaces/Result.html#height\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"Result\"},{\"kind\":64,\"name\":\"empty\",\"url\":\"functions/empty.html\",\"classes\":\"tsd-kind-function\"}],\"index\":{\"version\":\"2.3.9\",\"fields\":[\"name\",\"comment\"],\"fieldVectors\":[[\"name/0\",[0,60.943]],[\"comment/0\",[]],[\"name/1\",[1,46.28]],[\"comment/1\",[]],[\"name/2\",[2,49.957]],[\"comment/2\",[]],[\"name/3\",[3,52.47]],[\"comment/3\",[]],[\"name/4\",[4,55.835]],[\"comment/4\",[]],[\"name/5\",[5,60.943]],[\"comment/5\",[]],[\"name/6\",[6,60.943]],[\"comment/6\",[]],[\"name/7\",[7,36.964]],[\"comment/7\",[]],[\"name/8\",[8,49.957]],[\"comment/8\",[]],[\"name/9\",[9,49.957]],[\"comment/9\",[]],[\"name/10\",[10,60.943]],[\"comment/10\",[]],[\"name/11\",[11,52.47]],[\"comment/11\",[]],[\"name/12\",[12,55.835]],[\"comment/12\",[]],[\"name/13\",[13,55.835]],[\"comment/13\",[]],[\"name/14\",[14,55.835]],[\"comment/14\",[]],[\"name/15\",[15,60.943]],[\"comment/15\",[]],[\"name/16\",[16,60.943]],[\"comment/16\",[]],[\"name/17\",[17,55.835]],[\"comment/17\",[]],[\"name/18\",[18,60.943]],[\"comment/18\",[]],[\"name/19\",[19,55.835]],[\"comment/19\",[]],[\"name/20\",[20,55.835]],[\"comment/20\",[]],[\"name/21\",[21,60.943]],[\"comment/21\",[]],[\"name/22\",[22,55.835]],[\"comment/22\",[]],[\"name/23\",[23,55.835]],[\"comment/23\",[]],[\"name/24\",[24,60.943]],[\"comment/24\",[]],[\"name/25\",[25,55.835]],[\"comment/25\",[]],[\"name/26\",[26,55.835]],[\"comment/26\",[]],[\"name/27\",[27,52.47]],[\"comment/27\",[]],[\"name/28\",[28,60.943]],[\"comment/28\",[]],[\"name/29\",[29,60.943]],[\"comment/29\",[]],[\"name/30\",[30,55.835]],[\"comment/30\",[]],[\"name/31\",[31,60.943]],[\"comment/31\",[]],[\"name/32\",[32,60.943]],[\"comment/32\",[]],[\"name/33\",[33,60.943]],[\"comment/33\",[]],[\"name/34\",[34,60.943]],[\"comment/34\",[]],[\"name/35\",[35,60.943]],[\"comment/35\",[]],[\"name/36\",[13,55.835]],[\"comment/36\",[]],[\"name/37\",[36,49.957]],[\"comment/37\",[]],[\"name/38\",[37,55.835]],[\"comment/38\",[]],[\"name/39\",[38,60.943]],[\"comment/39\",[]],[\"name/40\",[7,36.964]],[\"comment/40\",[]],[\"name/41\",[39,60.943]],[\"comment/41\",[]],[\"name/42\",[36,49.957]],[\"comment/42\",[]],[\"name/43\",[37,55.835]],[\"comment/43\",[]],[\"name/44\",[40,60.943]],[\"comment/44\",[]],[\"name/45\",[41,60.943]],[\"comment/45\",[]],[\"name/46\",[12,55.835]],[\"comment/46\",[]],[\"name/47\",[42,60.943]],[\"comment/47\",[]],[\"name/48\",[9,49.957]],[\"comment/48\",[]],[\"name/49\",[43,55.835]],[\"comment/49\",[]],[\"name/50\",[25,55.835]],[\"comment/50\",[]],[\"name/51\",[44,60.943]],[\"comment/51\",[]],[\"name/52\",[45,49.957]],[\"comment/52\",[]],[\"name/53\",[46,49.957]],[\"comment/53\",[]],[\"name/54\",[47,52.47]],[\"comment/54\",[]],[\"name/55\",[48,52.47]],[\"comment/55\",[]],[\"name/56\",[49,52.47]],[\"comment/56\",[]],[\"name/57\",[50,52.47]],[\"comment/57\",[]],[\"name/58\",[51,60.943]],[\"comment/58\",[]],[\"name/59\",[52,60.943]],[\"comment/59\",[]],[\"name/60\",[53,55.835]],[\"comment/60\",[]],[\"name/61\",[54,55.835]],[\"comment/61\",[]],[\"name/62\",[55,60.943]],[\"comment/62\",[]],[\"name/63\",[56,60.943]],[\"comment/63\",[]],[\"name/64\",[57,55.835]],[\"comment/64\",[]],[\"name/65\",[58,60.943]],[\"comment/65\",[]],[\"name/66\",[59,60.943]],[\"comment/66\",[]],[\"name/67\",[60,60.943]],[\"comment/67\",[]],[\"name/68\",[61,60.943]],[\"comment/68\",[]],[\"name/69\",[62,60.943]],[\"comment/69\",[]],[\"name/70\",[63,60.943]],[\"comment/70\",[]],[\"name/71\",[57,55.835]],[\"comment/71\",[]],[\"name/72\",[50,52.47]],[\"comment/72\",[]],[\"name/73\",[1,46.28]],[\"comment/73\",[]],[\"name/74\",[64,60.943]],[\"comment/74\",[]],[\"name/75\",[50,52.47]],[\"comment/75\",[]],[\"name/76\",[65,60.943]],[\"comment/76\",[]],[\"name/77\",[19,55.835]],[\"comment/77\",[]],[\"name/78\",[27,52.47]],[\"comment/78\",[]],[\"name/79\",[66,60.943]],[\"comment/79\",[]],[\"name/80\",[67,60.943]],[\"comment/80\",[]],[\"name/81\",[20,55.835]],[\"comment/81\",[]],[\"name/82\",[8,49.957]],[\"comment/82\",[]],[\"name/83\",[1,46.28]],[\"comment/83\",[]],[\"name/84\",[68,44.849]],[\"comment/84\",[]],[\"name/85\",[69,60.943]],[\"comment/85\",[]],[\"name/86\",[70,60.943]],[\"comment/86\",[]],[\"name/87\",[71,60.943]],[\"comment/87\",[]],[\"name/88\",[72,60.943]],[\"comment/88\",[]],[\"name/89\",[73,60.943]],[\"comment/89\",[]],[\"name/90\",[74,60.943]],[\"comment/90\",[]],[\"name/91\",[75,60.943]],[\"comment/91\",[]],[\"name/92\",[76,60.943]],[\"comment/92\",[]],[\"name/93\",[77,55.835]],[\"comment/93\",[]],[\"name/94\",[78,60.943]],[\"comment/94\",[]],[\"name/95\",[79,60.943]],[\"comment/95\",[]],[\"name/96\",[80,60.943]],[\"comment/96\",[]],[\"name/97\",[81,60.943]],[\"comment/97\",[]],[\"name/98\",[82,60.943]],[\"comment/98\",[]],[\"name/99\",[83,60.943]],[\"comment/99\",[]],[\"name/100\",[84,60.943]],[\"comment/100\",[]],[\"name/101\",[85,60.943]],[\"comment/101\",[]],[\"name/102\",[86,55.835]],[\"comment/102\",[]],[\"name/103\",[87,60.943]],[\"comment/103\",[]],[\"name/104\",[88,60.943]],[\"comment/104\",[]],[\"name/105\",[89,60.943]],[\"comment/105\",[]],[\"name/106\",[90,60.943]],[\"comment/106\",[]],[\"name/107\",[91,60.943]],[\"comment/107\",[]],[\"name/108\",[92,60.943]],[\"comment/108\",[]],[\"name/109\",[93,60.943]],[\"comment/109\",[]],[\"name/110\",[94,60.943]],[\"comment/110\",[]],[\"name/111\",[95,60.943]],[\"comment/111\",[]],[\"name/112\",[96,60.943]],[\"comment/112\",[]],[\"name/113\",[43,55.835]],[\"comment/113\",[]],[\"name/114\",[97,60.943]],[\"comment/114\",[]],[\"name/115\",[98,60.943]],[\"comment/115\",[]],[\"name/116\",[99,60.943]],[\"comment/116\",[]],[\"name/117\",[100,60.943]],[\"comment/117\",[]],[\"name/118\",[101,60.943]],[\"comment/118\",[]],[\"name/119\",[102,60.943]],[\"comment/119\",[]],[\"name/120\",[103,60.943]],[\"comment/120\",[]],[\"name/121\",[104,60.943]],[\"comment/121\",[]],[\"name/122\",[105,60.943]],[\"comment/122\",[]],[\"name/123\",[106,60.943]],[\"comment/123\",[]],[\"name/124\",[107,60.943]],[\"comment/124\",[]],[\"name/125\",[108,60.943]],[\"comment/125\",[]],[\"name/126\",[109,60.943]],[\"comment/126\",[]],[\"name/127\",[110,60.943]],[\"comment/127\",[]],[\"name/128\",[111,60.943]],[\"comment/128\",[]],[\"name/129\",[112,60.943]],[\"comment/129\",[]],[\"name/130\",[113,60.943]],[\"comment/130\",[]],[\"name/131\",[114,60.943]],[\"comment/131\",[]],[\"name/132\",[115,60.943]],[\"comment/132\",[]],[\"name/133\",[116,60.943]],[\"comment/133\",[]],[\"name/134\",[117,60.943]],[\"comment/134\",[]],[\"name/135\",[118,60.943]],[\"comment/135\",[]],[\"name/136\",[119,60.943]],[\"comment/136\",[]],[\"name/137\",[120,60.943]],[\"comment/137\",[]],[\"name/138\",[121,60.943]],[\"comment/138\",[]],[\"name/139\",[122,60.943]],[\"comment/139\",[]],[\"name/140\",[123,60.943]],[\"comment/140\",[]],[\"name/141\",[124,60.943]],[\"comment/141\",[]],[\"name/142\",[125,60.943]],[\"comment/142\",[]],[\"name/143\",[126,60.943]],[\"comment/143\",[]],[\"name/144\",[127,60.943]],[\"comment/144\",[]],[\"name/145\",[128,60.943]],[\"comment/145\",[]],[\"name/146\",[129,60.943]],[\"comment/146\",[]],[\"name/147\",[130,60.943]],[\"comment/147\",[]],[\"name/148\",[131,60.943]],[\"comment/148\",[]],[\"name/149\",[132,60.943]],[\"comment/149\",[]],[\"name/150\",[133,60.943]],[\"comment/150\",[]],[\"name/151\",[134,60.943]],[\"comment/151\",[]],[\"name/152\",[135,60.943]],[\"comment/152\",[]],[\"name/153\",[136,60.943]],[\"comment/153\",[]],[\"name/154\",[137,60.943]],[\"comment/154\",[]],[\"name/155\",[138,60.943]],[\"comment/155\",[]],[\"name/156\",[139,60.943]],[\"comment/156\",[]],[\"name/157\",[140,60.943]],[\"comment/157\",[]],[\"name/158\",[141,60.943]],[\"comment/158\",[]],[\"name/159\",[142,60.943]],[\"comment/159\",[]],[\"name/160\",[143,60.943]],[\"comment/160\",[]],[\"name/161\",[144,60.943]],[\"comment/161\",[]],[\"name/162\",[145,60.943]],[\"comment/162\",[]],[\"name/163\",[146,60.943]],[\"comment/163\",[]],[\"name/164\",[147,60.943]],[\"comment/164\",[]],[\"name/165\",[148,60.943]],[\"comment/165\",[]],[\"name/166\",[149,60.943]],[\"comment/166\",[]],[\"name/167\",[150,60.943]],[\"comment/167\",[]],[\"name/168\",[151,60.943]],[\"comment/168\",[]],[\"name/169\",[152,60.943]],[\"comment/169\",[]],[\"name/170\",[153,60.943]],[\"comment/170\",[]],[\"name/171\",[154,60.943]],[\"comment/171\",[]],[\"name/172\",[155,60.943]],[\"comment/172\",[]],[\"name/173\",[156,60.943]],[\"comment/173\",[]],[\"name/174\",[157,60.943]],[\"comment/174\",[]],[\"name/175\",[158,60.943]],[\"comment/175\",[]],[\"name/176\",[159,60.943]],[\"comment/176\",[]],[\"name/177\",[160,60.943]],[\"comment/177\",[]],[\"name/178\",[161,60.943]],[\"comment/178\",[]],[\"name/179\",[162,60.943]],[\"comment/179\",[]],[\"name/180\",[163,60.943]],[\"comment/180\",[]],[\"name/181\",[164,60.943]],[\"comment/181\",[]],[\"name/182\",[165,60.943]],[\"comment/182\",[]],[\"name/183\",[166,60.943]],[\"comment/183\",[]],[\"name/184\",[167,60.943]],[\"comment/184\",[]],[\"name/185\",[168,60.943]],[\"comment/185\",[]],[\"name/186\",[169,60.943]],[\"comment/186\",[]],[\"name/187\",[170,60.943]],[\"comment/187\",[]],[\"name/188\",[171,60.943]],[\"comment/188\",[]],[\"name/189\",[172,60.943]],[\"comment/189\",[]],[\"name/190\",[173,60.943]],[\"comment/190\",[]],[\"name/191\",[174,60.943]],[\"comment/191\",[]],[\"name/192\",[175,60.943]],[\"comment/192\",[]],[\"name/193\",[176,60.943]],[\"comment/193\",[]],[\"name/194\",[177,60.943]],[\"comment/194\",[]],[\"name/195\",[178,60.943]],[\"comment/195\",[]],[\"name/196\",[179,60.943]],[\"comment/196\",[]],[\"name/197\",[180,60.943]],[\"comment/197\",[]],[\"name/198\",[181,60.943]],[\"comment/198\",[]],[\"name/199\",[182,60.943]],[\"comment/199\",[]],[\"name/200\",[183,60.943]],[\"comment/200\",[]],[\"name/201\",[184,60.943]],[\"comment/201\",[]],[\"name/202\",[185,60.943]],[\"comment/202\",[]],[\"name/203\",[186,60.943]],[\"comment/203\",[]],[\"name/204\",[187,60.943]],[\"comment/204\",[]],[\"name/205\",[188,60.943]],[\"comment/205\",[]],[\"name/206\",[189,60.943]],[\"comment/206\",[]],[\"name/207\",[190,60.943]],[\"comment/207\",[]],[\"name/208\",[191,60.943]],[\"comment/208\",[]],[\"name/209\",[192,60.943]],[\"comment/209\",[]],[\"name/210\",[193,60.943]],[\"comment/210\",[]],[\"name/211\",[194,60.943]],[\"comment/211\",[]],[\"name/212\",[195,60.943]],[\"comment/212\",[]],[\"name/213\",[196,60.943]],[\"comment/213\",[]],[\"name/214\",[197,60.943]],[\"comment/214\",[]],[\"name/215\",[198,60.943]],[\"comment/215\",[]],[\"name/216\",[199,60.943]],[\"comment/216\",[]],[\"name/217\",[200,60.943]],[\"comment/217\",[]],[\"name/218\",[201,60.943]],[\"comment/218\",[]],[\"name/219\",[202,60.943]],[\"comment/219\",[]],[\"name/220\",[203,60.943]],[\"comment/220\",[]],[\"name/221\",[204,60.943]],[\"comment/221\",[]],[\"name/222\",[205,60.943]],[\"comment/222\",[]],[\"name/223\",[206,60.943]],[\"comment/223\",[]],[\"name/224\",[207,60.943]],[\"comment/224\",[]],[\"name/225\",[208,60.943]],[\"comment/225\",[]],[\"name/226\",[209,60.943]],[\"comment/226\",[]],[\"name/227\",[210,60.943]],[\"comment/227\",[]],[\"name/228\",[211,60.943]],[\"comment/228\",[]],[\"name/229\",[212,60.943]],[\"comment/229\",[]],[\"name/230\",[213,60.943]],[\"comment/230\",[]],[\"name/231\",[214,60.943]],[\"comment/231\",[]],[\"name/232\",[215,60.943]],[\"comment/232\",[]],[\"name/233\",[216,60.943]],[\"comment/233\",[]],[\"name/234\",[217,60.943]],[\"comment/234\",[]],[\"name/235\",[218,60.943]],[\"comment/235\",[]],[\"name/236\",[219,60.943]],[\"comment/236\",[]],[\"name/237\",[220,60.943]],[\"comment/237\",[]],[\"name/238\",[221,60.943]],[\"comment/238\",[]],[\"name/239\",[222,60.943]],[\"comment/239\",[]],[\"name/240\",[7,36.964]],[\"comment/240\",[]],[\"name/241\",[223,55.835]],[\"comment/241\",[]],[\"name/242\",[224,55.835]],[\"comment/242\",[]],[\"name/243\",[225,60.943]],[\"comment/243\",[]],[\"name/244\",[226,60.943]],[\"comment/244\",[]],[\"name/245\",[7,36.964]],[\"comment/245\",[]],[\"name/246\",[223,55.835]],[\"comment/246\",[]],[\"name/247\",[224,55.835]],[\"comment/247\",[]],[\"name/248\",[227,60.943]],[\"comment/248\",[]],[\"name/249\",[228,60.943]],[\"comment/249\",[]],[\"name/250\",[229,60.943]],[\"comment/250\",[]],[\"name/251\",[230,60.943]],[\"comment/251\",[]],[\"name/252\",[8,49.957]],[\"comment/252\",[]],[\"name/253\",[231,60.943]],[\"comment/253\",[]],[\"name/254\",[232,60.943]],[\"comment/254\",[]],[\"name/255\",[1,46.28]],[\"comment/255\",[]],[\"name/256\",[233,60.943]],[\"comment/256\",[]],[\"name/257\",[234,60.943]],[\"comment/257\",[]],[\"name/258\",[235,60.943]],[\"comment/258\",[]],[\"name/259\",[236,60.943]],[\"comment/259\",[]],[\"name/260\",[237,60.943]],[\"comment/260\",[]],[\"name/261\",[238,60.943]],[\"comment/261\",[]],[\"name/262\",[239,60.943]],[\"comment/262\",[]],[\"name/263\",[7,36.964]],[\"comment/263\",[]],[\"name/264\",[240,60.943]],[\"comment/264\",[]],[\"name/265\",[7,36.964]],[\"comment/265\",[]],[\"name/266\",[241,60.943]],[\"comment/266\",[]],[\"name/267\",[7,36.964]],[\"comment/267\",[]],[\"name/268\",[27,52.47]],[\"comment/268\",[]],[\"name/269\",[242,60.943]],[\"comment/269\",[]],[\"name/270\",[243,60.943]],[\"comment/270\",[]],[\"name/271\",[244,60.943]],[\"comment/271\",[]],[\"name/272\",[245,60.943]],[\"comment/272\",[]],[\"name/273\",[246,60.943]],[\"comment/273\",[]],[\"name/274\",[247,60.943]],[\"comment/274\",[]],[\"name/275\",[248,60.943]],[\"comment/275\",[]],[\"name/276\",[86,55.835]],[\"comment/276\",[]],[\"name/277\",[77,55.835]],[\"comment/277\",[]],[\"name/278\",[249,60.943]],[\"comment/278\",[]],[\"name/279\",[250,60.943]],[\"comment/279\",[]],[\"name/280\",[251,60.943]],[\"comment/280\",[]],[\"name/281\",[252,60.943]],[\"comment/281\",[]],[\"name/282\",[253,60.943]],[\"comment/282\",[]],[\"name/283\",[254,60.943]],[\"comment/283\",[]],[\"name/284\",[255,60.943]],[\"comment/284\",[]],[\"name/285\",[256,60.943]],[\"comment/285\",[]],[\"name/286\",[257,60.943]],[\"comment/286\",[]],[\"name/287\",[258,60.943]],[\"comment/287\",[]],[\"name/288\",[259,60.943]],[\"comment/288\",[]],[\"name/289\",[260,60.943]],[\"comment/289\",[]],[\"name/290\",[261,60.943]],[\"comment/290\",[]],[\"name/291\",[262,60.943]],[\"comment/291\",[]],[\"name/292\",[263,60.943]],[\"comment/292\",[]],[\"name/293\",[264,60.943]],[\"comment/293\",[]],[\"name/294\",[265,60.943]],[\"comment/294\",[]],[\"name/295\",[266,60.943]],[\"comment/295\",[]],[\"name/296\",[267,60.943]],[\"comment/296\",[]],[\"name/297\",[268,60.943]],[\"comment/297\",[]],[\"name/298\",[269,60.943]],[\"comment/298\",[]],[\"name/299\",[270,60.943]],[\"comment/299\",[]],[\"name/300\",[271,60.943]],[\"comment/300\",[]],[\"name/301\",[272,60.943]],[\"comment/301\",[]],[\"name/302\",[273,60.943]],[\"comment/302\",[]],[\"name/303\",[274,60.943]],[\"comment/303\",[]],[\"name/304\",[275,60.943]],[\"comment/304\",[]],[\"name/305\",[276,60.943]],[\"comment/305\",[]],[\"name/306\",[277,60.943]],[\"comment/306\",[]],[\"name/307\",[278,60.943]],[\"comment/307\",[]],[\"name/308\",[279,60.943]],[\"comment/308\",[]],[\"name/309\",[280,60.943]],[\"comment/309\",[]],[\"name/310\",[281,60.943]],[\"comment/310\",[]],[\"name/311\",[282,60.943]],[\"comment/311\",[]],[\"name/312\",[283,46.28]],[\"comment/312\",[]],[\"name/313\",[284,60.943]],[\"comment/313\",[]],[\"name/314\",[11,52.47]],[\"comment/314\",[]],[\"name/315\",[11,52.47]],[\"comment/315\",[]],[\"name/316\",[1,46.28]],[\"comment/316\",[]],[\"name/317\",[285,60.943]],[\"comment/317\",[]],[\"name/318\",[286,60.943]],[\"comment/318\",[]],[\"name/319\",[287,60.943]],[\"comment/319\",[]],[\"name/320\",[288,60.943]],[\"comment/320\",[]],[\"name/321\",[289,60.943]],[\"comment/321\",[]],[\"name/322\",[290,60.943]],[\"comment/322\",[]],[\"name/323\",[291,60.943]],[\"comment/323\",[]],[\"name/324\",[292,55.835]],[\"comment/324\",[]],[\"name/325\",[293,60.943]],[\"comment/325\",[]],[\"name/326\",[7,36.964]],[\"comment/326\",[]],[\"name/327\",[2,49.957]],[\"comment/327\",[]],[\"name/328\",[294,60.943]],[\"comment/328\",[]],[\"name/329\",[295,60.943]],[\"comment/329\",[]],[\"name/330\",[296,60.943]],[\"comment/330\",[]],[\"name/331\",[7,36.964]],[\"comment/331\",[]],[\"name/332\",[2,49.957]],[\"comment/332\",[]],[\"name/333\",[297,60.943]],[\"comment/333\",[]],[\"name/334\",[298,60.943]],[\"comment/334\",[]],[\"name/335\",[7,36.964]],[\"comment/335\",[]],[\"name/336\",[299,52.47]],[\"comment/336\",[]],[\"name/337\",[300,49.957]],[\"comment/337\",[]],[\"name/338\",[301,60.943]],[\"comment/338\",[]],[\"name/339\",[302,60.943]],[\"comment/339\",[]],[\"name/340\",[303,60.943]],[\"comment/340\",[]],[\"name/341\",[7,36.964]],[\"comment/341\",[]],[\"name/342\",[299,52.47]],[\"comment/342\",[]],[\"name/343\",[300,49.957]],[\"comment/343\",[]],[\"name/344\",[2,49.957]],[\"comment/344\",[]],[\"name/345\",[304,60.943]],[\"comment/345\",[]],[\"name/346\",[305,60.943]],[\"comment/346\",[]],[\"name/347\",[306,60.943]],[\"comment/347\",[]],[\"name/348\",[307,60.943]],[\"comment/348\",[]],[\"name/349\",[7,36.964]],[\"comment/349\",[]],[\"name/350\",[299,52.47]],[\"comment/350\",[]],[\"name/351\",[300,49.957]],[\"comment/351\",[]],[\"name/352\",[308,60.943]],[\"comment/352\",[]],[\"name/353\",[309,60.943]],[\"comment/353\",[]],[\"name/354\",[7,36.964]],[\"comment/354\",[]],[\"name/355\",[310,60.943]],[\"comment/355\",[]],[\"name/356\",[311,55.835]],[\"comment/356\",[]],[\"name/357\",[312,60.943]],[\"comment/357\",[]],[\"name/358\",[9,49.957]],[\"comment/358\",[]],[\"name/359\",[22,55.835]],[\"comment/359\",[]],[\"name/360\",[313,60.943]],[\"comment/360\",[]],[\"name/361\",[314,60.943]],[\"comment/361\",[]],[\"name/362\",[315,60.943]],[\"comment/362\",[]],[\"name/363\",[316,60.943]],[\"comment/363\",[]],[\"name/364\",[317,60.943]],[\"comment/364\",[]],[\"name/365\",[318,60.943]],[\"comment/365\",[]],[\"name/366\",[319,60.943]],[\"comment/366\",[]],[\"name/367\",[320,52.47]],[\"comment/367\",[]],[\"name/368\",[321,60.943]],[\"comment/368\",[]],[\"name/369\",[322,60.943]],[\"comment/369\",[]],[\"name/370\",[323,60.943]],[\"comment/370\",[]],[\"name/371\",[324,60.943]],[\"comment/371\",[]],[\"name/372\",[325,55.835]],[\"comment/372\",[]],[\"name/373\",[326,55.835]],[\"comment/373\",[]],[\"name/374\",[327,60.943]],[\"comment/374\",[]],[\"name/375\",[328,60.943]],[\"comment/375\",[]],[\"name/376\",[329,60.943]],[\"comment/376\",[]],[\"name/377\",[330,60.943]],[\"comment/377\",[]],[\"name/378\",[26,55.835]],[\"comment/378\",[]],[\"name/379\",[1,46.28]],[\"comment/379\",[]],[\"name/380\",[3,52.47]],[\"comment/380\",[]],[\"name/381\",[331,55.835]],[\"comment/381\",[]],[\"name/382\",[332,60.943]],[\"comment/382\",[]],[\"name/383\",[333,60.943]],[\"comment/383\",[]],[\"name/384\",[334,60.943]],[\"comment/384\",[]],[\"name/385\",[335,60.943]],[\"comment/385\",[]],[\"name/386\",[336,60.943]],[\"comment/386\",[]],[\"name/387\",[337,60.943]],[\"comment/387\",[]],[\"name/388\",[338,52.47]],[\"comment/388\",[]],[\"name/389\",[339,60.943]],[\"comment/389\",[]],[\"name/390\",[340,49.957]],[\"comment/390\",[]],[\"name/391\",[341,49.957]],[\"comment/391\",[]],[\"name/392\",[342,60.943]],[\"comment/392\",[]],[\"name/393\",[343,60.943]],[\"comment/393\",[]],[\"name/394\",[344,60.943]],[\"comment/394\",[]],[\"name/395\",[345,60.943]],[\"comment/395\",[]],[\"name/396\",[346,60.943]],[\"comment/396\",[]],[\"name/397\",[347,60.943]],[\"comment/397\",[]],[\"name/398\",[331,55.835]],[\"comment/398\",[]],[\"name/399\",[348,55.835]],[\"comment/399\",[]],[\"name/400\",[349,55.835]],[\"comment/400\",[]],[\"name/401\",[350,60.943]],[\"comment/401\",[]],[\"name/402\",[340,49.957]],[\"comment/402\",[]],[\"name/403\",[341,49.957]],[\"comment/403\",[]],[\"name/404\",[68,44.849]],[\"comment/404\",[]],[\"name/405\",[351,60.943]],[\"comment/405\",[]],[\"name/406\",[53,55.835]],[\"comment/406\",[]],[\"name/407\",[352,60.943]],[\"comment/407\",[]],[\"name/408\",[353,60.943]],[\"comment/408\",[]],[\"name/409\",[354,60.943]],[\"comment/409\",[]],[\"name/410\",[355,60.943]],[\"comment/410\",[]],[\"name/411\",[54,55.835]],[\"comment/411\",[]],[\"name/412\",[14,55.835]],[\"comment/412\",[]],[\"name/413\",[356,60.943]],[\"comment/413\",[]],[\"name/414\",[357,60.943]],[\"comment/414\",[]],[\"name/415\",[358,60.943]],[\"comment/415\",[]],[\"name/416\",[359,60.943]],[\"comment/416\",[]],[\"name/417\",[360,60.943]],[\"comment/417\",[]],[\"name/418\",[361,60.943]],[\"comment/418\",[]],[\"name/419\",[362,60.943]],[\"comment/419\",[]],[\"name/420\",[363,60.943]],[\"comment/420\",[]],[\"name/421\",[364,60.943]],[\"comment/421\",[]],[\"name/422\",[365,60.943]],[\"comment/422\",[]],[\"name/423\",[366,36.376]],[\"comment/423\",[]],[\"name/424\",[367,36.376]],[\"comment/424\",[]],[\"name/425\",[368,37.589]],[\"comment/425\",[]],[\"name/426\",[369,37.589]],[\"comment/426\",[]],[\"name/427\",[370,60.943]],[\"comment/427\",[]],[\"name/428\",[371,52.47]],[\"comment/428\",[]],[\"name/429\",[372,49.957]],[\"comment/429\",[]],[\"name/430\",[373,44.849]],[\"comment/430\",[]],[\"name/431\",[374,52.47]],[\"comment/431\",[]],[\"name/432\",[375,60.943]],[\"comment/432\",[]],[\"name/433\",[376,55.835]],[\"comment/433\",[]],[\"name/434\",[366,36.376]],[\"comment/434\",[]],[\"name/435\",[367,36.376]],[\"comment/435\",[]],[\"name/436\",[368,37.589]],[\"comment/436\",[]],[\"name/437\",[369,37.589]],[\"comment/437\",[]],[\"name/438\",[377,60.943]],[\"comment/438\",[]],[\"name/439\",[378,60.943]],[\"comment/439\",[]],[\"name/440\",[366,36.376]],[\"comment/440\",[]],[\"name/441\",[367,36.376]],[\"comment/441\",[]],[\"name/442\",[368,37.589]],[\"comment/442\",[]],[\"name/443\",[369,37.589]],[\"comment/443\",[]],[\"name/444\",[379,60.943]],[\"comment/444\",[]],[\"name/445\",[366,36.376]],[\"comment/445\",[]],[\"name/446\",[367,36.376]],[\"comment/446\",[]],[\"name/447\",[368,37.589]],[\"comment/447\",[]],[\"name/448\",[369,37.589]],[\"comment/448\",[]],[\"name/449\",[380,60.943]],[\"comment/449\",[]],[\"name/450\",[366,36.376]],[\"comment/450\",[]],[\"name/451\",[367,36.376]],[\"comment/451\",[]],[\"name/452\",[368,37.589]],[\"comment/452\",[]],[\"name/453\",[369,37.589]],[\"comment/453\",[]],[\"name/454\",[381,60.943]],[\"comment/454\",[]],[\"name/455\",[373,44.849]],[\"comment/455\",[]],[\"name/456\",[366,36.376]],[\"comment/456\",[]],[\"name/457\",[367,36.376]],[\"comment/457\",[]],[\"name/458\",[368,37.589]],[\"comment/458\",[]],[\"name/459\",[369,37.589]],[\"comment/459\",[]],[\"name/460\",[382,60.943]],[\"comment/460\",[]],[\"name/461\",[373,44.849]],[\"comment/461\",[]],[\"name/462\",[366,36.376]],[\"comment/462\",[]],[\"name/463\",[367,36.376]],[\"comment/463\",[]],[\"name/464\",[368,37.589]],[\"comment/464\",[]],[\"name/465\",[369,37.589]],[\"comment/465\",[]],[\"name/466\",[383,60.943]],[\"comment/466\",[]],[\"name/467\",[366,36.376]],[\"comment/467\",[]],[\"name/468\",[367,36.376]],[\"comment/468\",[]],[\"name/469\",[368,37.589]],[\"comment/469\",[]],[\"name/470\",[369,37.589]],[\"comment/470\",[]],[\"name/471\",[384,60.943]],[\"comment/471\",[]],[\"name/472\",[366,36.376]],[\"comment/472\",[]],[\"name/473\",[367,36.376]],[\"comment/473\",[]],[\"name/474\",[368,37.589]],[\"comment/474\",[]],[\"name/475\",[369,37.589]],[\"comment/475\",[]],[\"name/476\",[385,60.943]],[\"comment/476\",[]],[\"name/477\",[373,44.849]],[\"comment/477\",[]],[\"name/478\",[366,36.376]],[\"comment/478\",[]],[\"name/479\",[367,36.376]],[\"comment/479\",[]],[\"name/480\",[368,37.589]],[\"comment/480\",[]],[\"name/481\",[369,37.589]],[\"comment/481\",[]],[\"name/482\",[386,60.943]],[\"comment/482\",[]],[\"name/483\",[387,55.835]],[\"comment/483\",[]],[\"name/484\",[388,55.835]],[\"comment/484\",[]],[\"name/485\",[389,60.943]],[\"comment/485\",[]],[\"name/486\",[390,60.943]],[\"comment/486\",[]],[\"name/487\",[391,60.943]],[\"comment/487\",[]],[\"name/488\",[320,52.47]],[\"comment/488\",[]],[\"name/489\",[392,60.943]],[\"comment/489\",[]],[\"name/490\",[393,60.943]],[\"comment/490\",[]],[\"name/491\",[394,60.943]],[\"comment/491\",[]],[\"name/492\",[366,36.376]],[\"comment/492\",[]],[\"name/493\",[367,36.376]],[\"comment/493\",[]],[\"name/494\",[368,37.589]],[\"comment/494\",[]],[\"name/495\",[369,37.589]],[\"comment/495\",[]],[\"name/496\",[395,60.943]],[\"comment/496\",[]],[\"name/497\",[372,49.957]],[\"comment/497\",[]],[\"name/498\",[373,44.849]],[\"comment/498\",[]],[\"name/499\",[366,36.376]],[\"comment/499\",[]],[\"name/500\",[367,36.376]],[\"comment/500\",[]],[\"name/501\",[368,37.589]],[\"comment/501\",[]],[\"name/502\",[369,37.589]],[\"comment/502\",[]],[\"name/503\",[396,60.943]],[\"comment/503\",[]],[\"name/504\",[371,52.47]],[\"comment/504\",[]],[\"name/505\",[373,44.849]],[\"comment/505\",[]],[\"name/506\",[374,52.47]],[\"comment/506\",[]],[\"name/507\",[372,49.957]],[\"comment/507\",[]],[\"name/508\",[397,55.835]],[\"comment/508\",[]],[\"name/509\",[387,55.835]],[\"comment/509\",[]],[\"name/510\",[7,36.964]],[\"comment/510\",[]],[\"name/511\",[367,36.376]],[\"comment/511\",[]],[\"name/512\",[398,60.943]],[\"comment/512\",[]],[\"name/513\",[7,36.964]],[\"comment/513\",[]],[\"name/514\",[367,36.376]],[\"comment/514\",[]],[\"name/515\",[366,36.376]],[\"comment/515\",[]],[\"name/516\",[367,36.376]],[\"comment/516\",[]],[\"name/517\",[368,37.589]],[\"comment/517\",[]],[\"name/518\",[369,37.589]],[\"comment/518\",[]],[\"name/519\",[399,60.943]],[\"comment/519\",[]],[\"name/520\",[373,44.849]],[\"comment/520\",[]],[\"name/521\",[374,52.47]],[\"comment/521\",[]],[\"name/522\",[372,49.957]],[\"comment/522\",[]],[\"name/523\",[366,36.376]],[\"comment/523\",[]],[\"name/524\",[367,36.376]],[\"comment/524\",[]],[\"name/525\",[368,37.589]],[\"comment/525\",[]],[\"name/526\",[369,37.589]],[\"comment/526\",[]],[\"name/527\",[400,60.943]],[\"comment/527\",[]],[\"name/528\",[401,60.943]],[\"comment/528\",[]],[\"name/529\",[349,55.835]],[\"comment/529\",[]],[\"name/530\",[366,36.376]],[\"comment/530\",[]],[\"name/531\",[367,36.376]],[\"comment/531\",[]],[\"name/532\",[368,37.589]],[\"comment/532\",[]],[\"name/533\",[369,37.589]],[\"comment/533\",[]],[\"name/534\",[402,60.943]],[\"comment/534\",[]],[\"name/535\",[366,36.376]],[\"comment/535\",[]],[\"name/536\",[403,60.943]],[\"comment/536\",[]],[\"name/537\",[340,49.957]],[\"comment/537\",[]],[\"name/538\",[341,49.957]],[\"comment/538\",[]],[\"name/539\",[376,55.835]],[\"comment/539\",[]],[\"name/540\",[404,60.943]],[\"comment/540\",[]],[\"name/541\",[405,60.943]],[\"comment/541\",[]],[\"name/542\",[406,60.943]],[\"comment/542\",[]],[\"name/543\",[407,60.943]],[\"comment/543\",[]],[\"name/544\",[408,60.943]],[\"comment/544\",[]],[\"name/545\",[409,60.943]],[\"comment/545\",[]],[\"name/546\",[410,60.943]],[\"comment/546\",[]],[\"name/547\",[411,60.943]],[\"comment/547\",[]],[\"name/548\",[412,60.943]],[\"comment/548\",[]],[\"name/549\",[413,60.943]],[\"comment/549\",[]],[\"name/550\",[414,60.943]],[\"comment/550\",[]],[\"name/551\",[415,60.943]],[\"comment/551\",[]],[\"name/552\",[416,60.943]],[\"comment/552\",[]],[\"name/553\",[417,60.943]],[\"comment/553\",[]],[\"name/554\",[418,60.943]],[\"comment/554\",[]],[\"name/555\",[419,60.943]],[\"comment/555\",[]],[\"name/556\",[366,36.376]],[\"comment/556\",[]],[\"name/557\",[3,52.47]],[\"comment/557\",[]],[\"name/558\",[300,49.957]],[\"comment/558\",[]],[\"name/559\",[420,60.943]],[\"comment/559\",[]],[\"name/560\",[421,60.943]],[\"comment/560\",[]],[\"name/561\",[348,55.835]],[\"comment/561\",[]],[\"name/562\",[422,60.943]],[\"comment/562\",[]],[\"name/563\",[30,55.835]],[\"comment/563\",[]],[\"name/564\",[423,60.943]],[\"comment/564\",[]],[\"name/565\",[424,60.943]],[\"comment/565\",[]],[\"name/566\",[425,60.943]],[\"comment/566\",[]],[\"name/567\",[426,60.943]],[\"comment/567\",[]],[\"name/568\",[311,55.835]],[\"comment/568\",[]],[\"name/569\",[427,60.943]],[\"comment/569\",[]],[\"name/570\",[428,60.943]],[\"comment/570\",[]],[\"name/571\",[429,60.943]],[\"comment/571\",[]],[\"name/572\",[292,55.835]],[\"comment/572\",[]],[\"name/573\",[49,52.47]],[\"comment/573\",[]],[\"name/574\",[45,49.957]],[\"comment/574\",[]],[\"name/575\",[46,49.957]],[\"comment/575\",[]],[\"name/576\",[47,52.47]],[\"comment/576\",[]],[\"name/577\",[48,52.47]],[\"comment/577\",[]],[\"name/578\",[23,55.835]],[\"comment/578\",[]],[\"name/579\",[430,60.943]],[\"comment/579\",[]],[\"name/580\",[431,60.943]],[\"comment/580\",[]],[\"name/581\",[68,44.849]],[\"comment/581\",[]],[\"name/582\",[432,47.95]],[\"comment/582\",[]],[\"name/583\",[433,55.835]],[\"comment/583\",[]],[\"name/584\",[434,60.943]],[\"comment/584\",[]],[\"name/585\",[283,46.28]],[\"comment/585\",[]],[\"name/586\",[435,47.95]],[\"comment/586\",[]],[\"name/587\",[388,55.835]],[\"comment/587\",[]],[\"name/588\",[436,60.943]],[\"comment/588\",[]],[\"name/589\",[437,52.47]],[\"comment/589\",[]],[\"name/590\",[438,60.943]],[\"comment/590\",[]],[\"name/591\",[325,55.835]],[\"comment/591\",[]],[\"name/592\",[439,60.943]],[\"comment/592\",[]],[\"name/593\",[320,52.47]],[\"comment/593\",[]],[\"name/594\",[326,55.835]],[\"comment/594\",[]],[\"name/595\",[440,60.943]],[\"comment/595\",[]],[\"name/596\",[36,49.957]],[\"comment/596\",[]],[\"name/597\",[441,60.943]],[\"comment/597\",[]],[\"name/598\",[442,60.943]],[\"comment/598\",[]],[\"name/599\",[371,52.47]],[\"comment/599\",[]],[\"name/600\",[8,49.957]],[\"comment/600\",[]],[\"name/601\",[443,60.943]],[\"comment/601\",[]],[\"name/602\",[444,60.943]],[\"comment/602\",[]],[\"name/603\",[445,60.943]],[\"comment/603\",[]],[\"name/604\",[446,60.943]],[\"comment/604\",[]],[\"name/605\",[447,60.943]],[\"comment/605\",[]],[\"name/606\",[448,60.943]],[\"comment/606\",[]],[\"name/607\",[449,60.943]],[\"comment/607\",[]],[\"name/608\",[450,60.943]],[\"comment/608\",[]],[\"name/609\",[451,60.943]],[\"comment/609\",[]],[\"name/610\",[452,60.943]],[\"comment/610\",[]],[\"name/611\",[36,49.957]],[\"comment/611\",[]],[\"name/612\",[432,47.95]],[\"comment/612\",[]],[\"name/613\",[453,60.943]],[\"comment/613\",[]],[\"name/614\",[68,44.849]],[\"comment/614\",[]],[\"name/615\",[432,47.95]],[\"comment/615\",[]],[\"name/616\",[283,46.28]],[\"comment/616\",[]],[\"name/617\",[435,47.95]],[\"comment/617\",[]],[\"name/618\",[454,55.835]],[\"comment/618\",[]],[\"name/619\",[437,52.47]],[\"comment/619\",[]],[\"name/620\",[455,60.943]],[\"comment/620\",[]],[\"name/621\",[68,44.849]],[\"comment/621\",[]],[\"name/622\",[432,47.95]],[\"comment/622\",[]],[\"name/623\",[433,55.835]],[\"comment/623\",[]],[\"name/624\",[456,60.943]],[\"comment/624\",[]],[\"name/625\",[283,46.28]],[\"comment/625\",[]],[\"name/626\",[435,47.95]],[\"comment/626\",[]],[\"name/627\",[454,55.835]],[\"comment/627\",[]],[\"name/628\",[338,52.47]],[\"comment/628\",[]],[\"name/629\",[437,52.47]],[\"comment/629\",[]],[\"name/630\",[397,55.835]],[\"comment/630\",[]],[\"name/631\",[457,60.943]],[\"comment/631\",[]],[\"name/632\",[68,44.849]],[\"comment/632\",[]],[\"name/633\",[432,47.95]],[\"comment/633\",[]],[\"name/634\",[458,60.943]],[\"comment/634\",[]],[\"name/635\",[338,52.47]],[\"comment/635\",[]],[\"name/636\",[283,46.28]],[\"comment/636\",[]],[\"name/637\",[435,47.95]],[\"comment/637\",[]],[\"name/638\",[459,60.943]],[\"comment/638\",[]],[\"name/639\",[460,60.943]],[\"comment/639\",[]],[\"name/640\",[68,44.849]],[\"comment/640\",[]],[\"name/641\",[45,49.957]],[\"comment/641\",[]],[\"name/642\",[46,49.957]],[\"comment/642\",[]],[\"name/643\",[461,60.943]],[\"comment/643\",[]],[\"name/644\",[7,36.964]],[\"comment/644\",[]],[\"name/645\",[462,60.943]],[\"comment/645\",[]],[\"name/646\",[463,60.943]],[\"comment/646\",[]],[\"name/647\",[464,60.943]],[\"comment/647\",[]],[\"name/648\",[283,46.28]],[\"comment/648\",[]],[\"name/649\",[435,47.95]],[\"comment/649\",[]],[\"name/650\",[4,55.835]],[\"comment/650\",[]],[\"name/651\",[45,49.957]],[\"comment/651\",[]],[\"name/652\",[46,49.957]],[\"comment/652\",[]],[\"name/653\",[47,52.47]],[\"comment/653\",[]],[\"name/654\",[49,52.47]],[\"comment/654\",[]],[\"name/655\",[48,52.47]],[\"comment/655\",[]],[\"name/656\",[17,55.835]],[\"comment/656\",[]],[\"name/657\",[9,49.957]],[\"comment/657\",[]],[\"name/658\",[465,60.943]],[\"comment/658\",[]],[\"name/659\",[466,60.943]],[\"comment/659\",[]],[\"name/660\",[467,60.943]],[\"comment/660\",[]],[\"name/661\",[340,49.957]],[\"comment/661\",[]],[\"name/662\",[341,49.957]],[\"comment/662\",[]],[\"name/663\",[468,60.943]],[\"comment/663\",[]]],\"invertedIndex\":[[\"__type\",{\"_index\":7,\"name\":{\"7\":{},\"40\":{},\"240\":{},\"245\":{},\"263\":{},\"265\":{},\"267\":{},\"326\":{},\"331\":{},\"335\":{},\"341\":{},\"349\":{},\"354\":{},\"510\":{},\"513\":{},\"644\":{}},\"comment\":{}}],[\"abs\",{\"_index\":93,\"name\":{\"109\":{}},\"comment\":{}}],[\"acos\",{\"_index\":94,\"name\":{\"110\":{}},\"comment\":{}}],[\"acosh\",{\"_index\":95,\"name\":{\"111\":{}},\"comment\":{}}],[\"adapter\",{\"_index\":308,\"name\":{\"352\":{}},\"comment\":{}}],[\"add\",{\"_index\":96,\"name\":{\"112\":{}},\"comment\":{}}],[\"age\",{\"_index\":438,\"name\":{\"590\":{}},\"comment\":{}}],[\"agent\",{\"_index\":289,\"name\":{\"321\":{}},\"comment\":{}}],[\"all\",{\"_index\":43,\"name\":{\"49\":{},\"113\":{}},\"comment\":{}}],[\"alpha\",{\"_index\":258,\"name\":{\"287\":{}},\"comment\":{}}],[\"analyze\",{\"_index\":18,\"name\":{\"18\":{}},\"comment\":{}}],[\"annotations\",{\"_index\":437,\"name\":{\"589\":{},\"619\":{},\"629\":{}},\"comment\":{}}],[\"antispoof\",{\"_index\":392,\"name\":{\"489\":{}},\"comment\":{}}],[\"any\",{\"_index\":97,\"name\":{\"114\":{}},\"comment\":{}}],[\"anycanvas\",{\"_index\":356,\"name\":{\"413\":{}},\"comment\":{}}],[\"anyimage\",{\"_index\":357,\"name\":{\"414\":{}},\"comment\":{}}],[\"anyvideo\",{\"_index\":358,\"name\":{\"415\":{}},\"comment\":{}}],[\"argmax\",{\"_index\":98,\"name\":{\"115\":{}},\"comment\":{}}],[\"argmin\",{\"_index\":99,\"name\":{\"116\":{}},\"comment\":{}}],[\"array\",{\"_index\":80,\"name\":{\"96\":{}},\"comment\":{}}],[\"arraysync\",{\"_index\":81,\"name\":{\"97\":{}},\"comment\":{}}],[\"as1d\",{\"_index\":102,\"name\":{\"119\":{}},\"comment\":{}}],[\"as2d\",{\"_index\":103,\"name\":{\"120\":{}},\"comment\":{}}],[\"as3d\",{\"_index\":104,\"name\":{\"121\":{}},\"comment\":{}}],[\"as4d\",{\"_index\":105,\"name\":{\"122\":{}},\"comment\":{}}],[\"as5d\",{\"_index\":106,\"name\":{\"123\":{}},\"comment\":{}}],[\"asin\",{\"_index\":107,\"name\":{\"124\":{}},\"comment\":{}}],[\"asinh\",{\"_index\":108,\"name\":{\"125\":{}},\"comment\":{}}],[\"asscalar\",{\"_index\":100,\"name\":{\"117\":{}},\"comment\":{}}],[\"astype\",{\"_index\":101,\"name\":{\"118\":{}},\"comment\":{}}],[\"async\",{\"_index\":422,\"name\":{\"562\":{}},\"comment\":{}}],[\"atan\",{\"_index\":109,\"name\":{\"126\":{}},\"comment\":{}}],[\"atan2\",{\"_index\":110,\"name\":{\"127\":{}},\"comment\":{}}],[\"atanh\",{\"_index\":111,\"name\":{\"128\":{}},\"comment\":{}}],[\"attention\",{\"_index\":389,\"name\":{\"485\":{}},\"comment\":{}}],[\"autobrightness\",{\"_index\":405,\"name\":{\"541\":{}},\"comment\":{}}],[\"avgpool\",{\"_index\":112,\"name\":{\"129\":{}},\"comment\":{}}],[\"backend\",{\"_index\":300,\"name\":{\"337\":{},\"343\":{},\"351\":{},\"558\":{}},\"comment\":{}}],[\"backendenum\",{\"_index\":362,\"name\":{\"419\":{}},\"comment\":{}}],[\"backends\",{\"_index\":290,\"name\":{\"322\":{}},\"comment\":{}}],[\"batchnorm\",{\"_index\":114,\"name\":{\"131\":{}},\"comment\":{}}],[\"batchtospacend\",{\"_index\":113,\"name\":{\"130\":{}},\"comment\":{}}],[\"blur\",{\"_index\":409,\"name\":{\"545\":{}},\"comment\":{}}],[\"body\",{\"_index\":46,\"name\":{\"53\":{},\"575\":{},\"642\":{},\"652\":{}},\"comment\":{}}],[\"bodyannotation\",{\"_index\":329,\"name\":{\"376\":{}},\"comment\":{}}],[\"bodyannotationblazepose\",{\"_index\":447,\"name\":{\"605\":{}},\"comment\":{}}],[\"bodyannotationefficientpose\",{\"_index\":448,\"name\":{\"606\":{}},\"comment\":{}}],[\"bodyconfig\",{\"_index\":395,\"name\":{\"496\":{}},\"comment\":{}}],[\"bodygesture\",{\"_index\":317,\"name\":{\"364\":{}},\"comment\":{}}],[\"bodykeypoint\",{\"_index\":449,\"name\":{\"607\":{}},\"comment\":{}}],[\"bodylabels\",{\"_index\":277,\"name\":{\"306\":{}},\"comment\":{}}],[\"bodylandmark\",{\"_index\":328,\"name\":{\"375\":{}},\"comment\":{}}],[\"bodylandmarkblazepose\",{\"_index\":446,\"name\":{\"604\":{}},\"comment\":{}}],[\"bodylandmarkefficientnet\",{\"_index\":445,\"name\":{\"603\":{}},\"comment\":{}}],[\"bodylandmarkmovenet\",{\"_index\":444,\"name\":{\"602\":{}},\"comment\":{}}],[\"bodylandmarkposenet\",{\"_index\":443,\"name\":{\"601\":{}},\"comment\":{}}],[\"bodypartlabels\",{\"_index\":278,\"name\":{\"307\":{}},\"comment\":{}}],[\"bodyresult\",{\"_index\":453,\"name\":{\"613\":{}},\"comment\":{}}],[\"box\",{\"_index\":283,\"name\":{\"312\":{},\"585\":{},\"616\":{},\"625\":{},\"636\":{},\"648\":{}},\"comment\":{}}],[\"boxraw\",{\"_index\":435,\"name\":{\"586\":{},\"617\":{},\"626\":{},\"637\":{},\"649\":{}},\"comment\":{}}],[\"boxscore\",{\"_index\":433,\"name\":{\"583\":{},\"623\":{}},\"comment\":{}}],[\"brightness\",{\"_index\":406,\"name\":{\"542\":{}},\"comment\":{}}],[\"broadcastto\",{\"_index\":115,\"name\":{\"132\":{}},\"comment\":{}}],[\"browser\",{\"_index\":285,\"name\":{\"317\":{}},\"comment\":{}}],[\"buffer\",{\"_index\":78,\"name\":{\"94\":{}},\"comment\":{}}],[\"buffersync\",{\"_index\":79,\"name\":{\"95\":{}},\"comment\":{}}],[\"bytes\",{\"_index\":85,\"name\":{\"101\":{}},\"comment\":{}}],[\"cachemodels\",{\"_index\":424,\"name\":{\"565\":{}},\"comment\":{}}],[\"cachesensitivity\",{\"_index\":426,\"name\":{\"567\":{}},\"comment\":{}}],[\"canvas\",{\"_index\":9,\"name\":{\"9\":{},\"48\":{},\"358\":{},\"657\":{}},\"comment\":{}}],[\"capabilities\",{\"_index\":335,\"name\":{\"385\":{}},\"comment\":{}}],[\"cast\",{\"_index\":116,\"name\":{\"133\":{}},\"comment\":{}}],[\"ceil\",{\"_index\":117,\"name\":{\"134\":{}},\"comment\":{}}],[\"class\",{\"_index\":458,\"name\":{\"634\":{}},\"comment\":{}}],[\"clipbyvalue\",{\"_index\":118,\"name\":{\"135\":{}},\"comment\":{}}],[\"clone\",{\"_index\":90,\"name\":{\"106\":{}},\"comment\":{}}],[\"color\",{\"_index\":257,\"name\":{\"286\":{}},\"comment\":{}}],[\"compare\",{\"_index\":24,\"name\":{\"24\":{}},\"comment\":{}}],[\"concat\",{\"_index\":119,\"name\":{\"136\":{}},\"comment\":{}}],[\"config\",{\"_index\":3,\"name\":{\"3\":{},\"380\":{},\"557\":{}},\"comment\":{}}],[\"constraints\",{\"_index\":336,\"name\":{\"386\":{}},\"comment\":{}}],[\"constructor\",{\"_index\":1,\"name\":{\"1\":{},\"73\":{},\"83\":{},\"255\":{},\"316\":{},\"379\":{}},\"comment\":{}}],[\"contrast\",{\"_index\":407,\"name\":{\"543\":{}},\"comment\":{}}],[\"conv1d\",{\"_index\":120,\"name\":{\"137\":{}},\"comment\":{}}],[\"conv2d\",{\"_index\":122,\"name\":{\"139\":{}},\"comment\":{}}],[\"conv2dtranspose\",{\"_index\":121,\"name\":{\"138\":{}},\"comment\":{}}],[\"cos\",{\"_index\":123,\"name\":{\"140\":{}},\"comment\":{}}],[\"cosh\",{\"_index\":124,\"name\":{\"141\":{}},\"comment\":{}}],[\"cpu\",{\"_index\":309,\"name\":{\"353\":{}},\"comment\":{}}],[\"crop\",{\"_index\":350,\"name\":{\"401\":{}},\"comment\":{}}],[\"cumprod\",{\"_index\":125,\"name\":{\"142\":{}},\"comment\":{}}],[\"cumsum\",{\"_index\":126,\"name\":{\"143\":{}},\"comment\":{}}],[\"data\",{\"_index\":82,\"name\":{\"98\":{}},\"comment\":{}}],[\"dataid\",{\"_index\":69,\"name\":{\"85\":{}},\"comment\":{}}],[\"datasync\",{\"_index\":84,\"name\":{\"100\":{}},\"comment\":{}}],[\"datatogpu\",{\"_index\":83,\"name\":{\"99\":{}},\"comment\":{}}],[\"deallocate\",{\"_index\":428,\"name\":{\"570\":{}},\"comment\":{}}],[\"debug\",{\"_index\":348,\"name\":{\"399\":{},\"561\":{}},\"comment\":{}}],[\"default\",{\"_index\":35,\"name\":{\"35\":{}},\"comment\":{}}],[\"defaults\",{\"_index\":430,\"name\":{\"579\":{}},\"comment\":{}}],[\"depthtospace\",{\"_index\":127,\"name\":{\"144\":{}},\"comment\":{}}],[\"depthwiseconv2d\",{\"_index\":128,\"name\":{\"145\":{}},\"comment\":{}}],[\"description\",{\"_index\":391,\"name\":{\"487\":{}},\"comment\":{}}],[\"descriptor\",{\"_index\":40,\"name\":{\"44\":{}},\"comment\":{}}],[\"detect\",{\"_index\":32,\"name\":{\"32\":{}},\"comment\":{}}],[\"detector\",{\"_index\":387,\"name\":{\"483\":{},\"509\":{}},\"comment\":{}}],[\"devices\",{\"_index\":333,\"name\":{\"383\":{}},\"comment\":{}}],[\"dilation2d\",{\"_index\":129,\"name\":{\"146\":{}},\"comment\":{}}],[\"dispose\",{\"_index\":86,\"name\":{\"102\":{},\"276\":{}},\"comment\":{}}],[\"disposeintermediatetensors\",{\"_index\":248,\"name\":{\"275\":{}},\"comment\":{}}],[\"distance\",{\"_index\":36,\"name\":{\"37\":{},\"42\":{},\"596\":{},\"611\":{}},\"comment\":{}}],[\"div\",{\"_index\":131,\"name\":{\"148\":{}},\"comment\":{}}],[\"divnonan\",{\"_index\":130,\"name\":{\"147\":{}},\"comment\":{}}],[\"dot\",{\"_index\":132,\"name\":{\"149\":{}},\"comment\":{}}],[\"draw\",{\"_index\":12,\"name\":{\"12\":{},\"46\":{}},\"comment\":{}}],[\"drawattention\",{\"_index\":268,\"name\":{\"297\":{}},\"comment\":{}}],[\"drawboxes\",{\"_index\":270,\"name\":{\"299\":{}},\"comment\":{}}],[\"drawgaze\",{\"_index\":272,\"name\":{\"301\":{}},\"comment\":{}}],[\"drawgestures\",{\"_index\":269,\"name\":{\"298\":{}},\"comment\":{}}],[\"drawlabels\",{\"_index\":267,\"name\":{\"296\":{}},\"comment\":{}}],[\"drawoptions\",{\"_index\":256,\"name\":{\"285\":{}},\"comment\":{}}],[\"drawpoints\",{\"_index\":266,\"name\":{\"295\":{}},\"comment\":{}}],[\"drawpolygons\",{\"_index\":271,\"name\":{\"300\":{}},\"comment\":{}}],[\"dtype\",{\"_index\":72,\"name\":{\"88\":{}},\"comment\":{}}],[\"element\",{\"_index\":331,\"name\":{\"381\":{},\"398\":{}},\"comment\":{}}],[\"elu\",{\"_index\":133,\"name\":{\"150\":{}},\"comment\":{}}],[\"embedding\",{\"_index\":440,\"name\":{\"595\":{}},\"comment\":{}}],[\"emit\",{\"_index\":28,\"name\":{\"28\":{}},\"comment\":{}}],[\"emotion\",{\"_index\":320,\"name\":{\"367\":{},\"488\":{},\"593\":{}},\"comment\":{}}],[\"empty\",{\"_index\":468,\"name\":{\"663\":{}},\"comment\":{}}],[\"enabled\",{\"_index\":366,\"name\":{\"423\":{},\"434\":{},\"440\":{},\"445\":{},\"450\":{},\"456\":{},\"462\":{},\"467\":{},\"472\":{},\"478\":{},\"492\":{},\"499\":{},\"515\":{},\"523\":{},\"530\":{},\"535\":{},\"556\":{}},\"comment\":{}}],[\"enumerate\",{\"_index\":342,\"name\":{\"392\":{}},\"comment\":{}}],[\"env\",{\"_index\":11,\"name\":{\"11\":{},\"314\":{},\"315\":{}},\"comment\":{}}],[\"equal\",{\"_index\":134,\"name\":{\"151\":{}},\"comment\":{}}],[\"equalization\",{\"_index\":403,\"name\":{\"536\":{}},\"comment\":{}}],[\"erf\",{\"_index\":135,\"name\":{\"152\":{}},\"comment\":{}}],[\"error\",{\"_index\":467,\"name\":{\"660\":{}},\"comment\":{}}],[\"euclideannorm\",{\"_index\":136,\"name\":{\"153\":{}},\"comment\":{}}],[\"events\",{\"_index\":14,\"name\":{\"14\":{},\"412\":{}},\"comment\":{}}],[\"execute\",{\"_index\":245,\"name\":{\"272\":{}},\"comment\":{}}],[\"executeasync\",{\"_index\":246,\"name\":{\"273\":{}},\"comment\":{}}],[\"exp\",{\"_index\":137,\"name\":{\"154\":{}},\"comment\":{}}],[\"expanddims\",{\"_index\":138,\"name\":{\"155\":{}},\"comment\":{}}],[\"expm1\",{\"_index\":139,\"name\":{\"156\":{}},\"comment\":{}}],[\"externalcanvas\",{\"_index\":360,\"name\":{\"417\":{}},\"comment\":{}}],[\"face\",{\"_index\":45,\"name\":{\"52\":{},\"574\":{},\"641\":{},\"651\":{}},\"comment\":{}}],[\"faceantispoofconfig\",{\"_index\":383,\"name\":{\"466\":{}},\"comment\":{}}],[\"faceattentionconfig\",{\"_index\":380,\"name\":{\"449\":{}},\"comment\":{}}],[\"faceconfig\",{\"_index\":386,\"name\":{\"482\":{}},\"comment\":{}}],[\"facedescriptionconfig\",{\"_index\":381,\"name\":{\"454\":{}},\"comment\":{}}],[\"facedetectorconfig\",{\"_index\":370,\"name\":{\"427\":{}},\"comment\":{}}],[\"faceemotionconfig\",{\"_index\":382,\"name\":{\"460\":{}},\"comment\":{}}],[\"facegearconfig\",{\"_index\":385,\"name\":{\"476\":{}},\"comment\":{}}],[\"facegesture\",{\"_index\":316,\"name\":{\"363\":{}},\"comment\":{}}],[\"faceirisconfig\",{\"_index\":379,\"name\":{\"444\":{}},\"comment\":{}}],[\"facelabels\",{\"_index\":276,\"name\":{\"305\":{}},\"comment\":{}}],[\"facelandmark\",{\"_index\":327,\"name\":{\"374\":{}},\"comment\":{}}],[\"facelivenessconfig\",{\"_index\":384,\"name\":{\"471\":{}},\"comment\":{}}],[\"facemeshconfig\",{\"_index\":377,\"name\":{\"438\":{}},\"comment\":{}}],[\"faceresult\",{\"_index\":431,\"name\":{\"580\":{}},\"comment\":{}}],[\"facescore\",{\"_index\":434,\"name\":{\"584\":{}},\"comment\":{}}],[\"facetriangulation\",{\"_index\":15,\"name\":{\"15\":{}},\"comment\":{}}],[\"faceuvmap\",{\"_index\":16,\"name\":{\"16\":{}},\"comment\":{}}],[\"fft\",{\"_index\":140,\"name\":{\"157\":{}},\"comment\":{}}],[\"fillpolygons\",{\"_index\":273,\"name\":{\"302\":{}},\"comment\":{}}],[\"filter\",{\"_index\":292,\"name\":{\"324\":{},\"572\":{}},\"comment\":{}}],[\"filterconfig\",{\"_index\":402,\"name\":{\"534\":{}},\"comment\":{}}],[\"find\",{\"_index\":38,\"name\":{\"39\":{}},\"comment\":{}}],[\"finger\",{\"_index\":321,\"name\":{\"368\":{}},\"comment\":{}}],[\"fingercurl\",{\"_index\":322,\"name\":{\"369\":{}},\"comment\":{}}],[\"fingerdirection\",{\"_index\":323,\"name\":{\"370\":{}},\"comment\":{}}],[\"fingerlabels\",{\"_index\":280,\"name\":{\"309\":{}},\"comment\":{}}],[\"fingerscore\",{\"_index\":456,\"name\":{\"624\":{}},\"comment\":{}}],[\"flags\",{\"_index\":311,\"name\":{\"356\":{},\"568\":{}},\"comment\":{}}],[\"flatten\",{\"_index\":141,\"name\":{\"158\":{}},\"comment\":{}}],[\"flip\",{\"_index\":404,\"name\":{\"540\":{}},\"comment\":{}}],[\"floor\",{\"_index\":142,\"name\":{\"159\":{}},\"comment\":{}}],[\"floordiv\",{\"_index\":143,\"name\":{\"160\":{}},\"comment\":{}}],[\"font\",{\"_index\":261,\"name\":{\"290\":{}},\"comment\":{}}],[\"gather\",{\"_index\":144,\"name\":{\"161\":{}},\"comment\":{}}],[\"gear\",{\"_index\":394,\"name\":{\"491\":{}},\"comment\":{}}],[\"gender\",{\"_index\":325,\"name\":{\"372\":{},\"591\":{}},\"comment\":{}}],[\"genderscore\",{\"_index\":439,\"name\":{\"592\":{}},\"comment\":{}}],[\"genericconfig\",{\"_index\":365,\"name\":{\"422\":{}},\"comment\":{}}],[\"gesture\",{\"_index\":49,\"name\":{\"56\":{},\"573\":{},\"654\":{}},\"comment\":{}}],[\"gestureconfig\",{\"_index\":419,\"name\":{\"555\":{}},\"comment\":{}}],[\"gesturelabels\",{\"_index\":282,\"name\":{\"311\":{}},\"comment\":{}}],[\"gestureresult\",{\"_index\":459,\"name\":{\"638\":{}},\"comment\":{}}],[\"gestures\",{\"_index\":464,\"name\":{\"647\":{}},\"comment\":{}}],[\"getintermediatetensors\",{\"_index\":247,\"name\":{\"274\":{}},\"comment\":{}}],[\"gpu\",{\"_index\":297,\"name\":{\"333\":{}},\"comment\":{}}],[\"graphmodel\",{\"_index\":232,\"name\":{\"254\":{}},\"comment\":{}}],[\"greater\",{\"_index\":146,\"name\":{\"163\":{}},\"comment\":{}}],[\"greaterequal\",{\"_index\":145,\"name\":{\"162\":{}},\"comment\":{}}],[\"hand\",{\"_index\":47,\"name\":{\"54\":{},\"576\":{},\"653\":{}},\"comment\":{}}],[\"handconfig\",{\"_index\":396,\"name\":{\"503\":{}},\"comment\":{}}],[\"handgesture\",{\"_index\":318,\"name\":{\"365\":{}},\"comment\":{}}],[\"handlabels\",{\"_index\":279,\"name\":{\"308\":{}},\"comment\":{}}],[\"handresult\",{\"_index\":455,\"name\":{\"620\":{}},\"comment\":{}}],[\"hands\",{\"_index\":461,\"name\":{\"643\":{}},\"comment\":{}}],[\"handtype\",{\"_index\":324,\"name\":{\"371\":{}},\"comment\":{}}],[\"height\",{\"_index\":341,\"name\":{\"391\":{},\"403\":{},\"538\":{},\"662\":{}},\"comment\":{}}],[\"hue\",{\"_index\":411,\"name\":{\"547\":{}},\"comment\":{}}],[\"human\",{\"_index\":0,\"name\":{\"0\":{}},\"comment\":{}}],[\"id\",{\"_index\":68,\"name\":{\"84\":{},\"404\":{},\"581\":{},\"614\":{},\"621\":{},\"632\":{},\"640\":{}},\"comment\":{}}],[\"ifft\",{\"_index\":147,\"name\":{\"164\":{}},\"comment\":{}}],[\"image\",{\"_index\":22,\"name\":{\"22\":{},\"359\":{}},\"comment\":{}}],[\"imagedata\",{\"_index\":313,\"name\":{\"360\":{}},\"comment\":{}}],[\"imageobjects\",{\"_index\":359,\"name\":{\"416\":{}},\"comment\":{}}],[\"incache\",{\"_index\":352,\"name\":{\"407\":{}},\"comment\":{}}],[\"index\",{\"_index\":39,\"name\":{\"41\":{}},\"comment\":{}}],[\"indices\",{\"_index\":224,\"name\":{\"242\":{},\"247\":{}},\"comment\":{}}],[\"init\",{\"_index\":25,\"name\":{\"25\":{},\"50\":{}},\"comment\":{}}],[\"initial\",{\"_index\":291,\"name\":{\"323\":{}},\"comment\":{}}],[\"input\",{\"_index\":361,\"name\":{\"418\":{}},\"comment\":{}}],[\"inputnodes\",{\"_index\":234,\"name\":{\"257\":{}},\"comment\":{}}],[\"inputs\",{\"_index\":236,\"name\":{\"259\":{}},\"comment\":{}}],[\"instance\",{\"_index\":64,\"name\":{\"74\":{}},\"comment\":{}}],[\"iouthreshold\",{\"_index\":374,\"name\":{\"431\":{},\"506\":{},\"521\":{}},\"comment\":{}}],[\"irfft\",{\"_index\":148,\"name\":{\"165\":{}},\"comment\":{}}],[\"iris\",{\"_index\":390,\"name\":{\"486\":{}},\"comment\":{}}],[\"irisgesture\",{\"_index\":319,\"name\":{\"366\":{}},\"comment\":{}}],[\"isdisposed\",{\"_index\":87,\"name\":{\"103\":{}},\"comment\":{}}],[\"isfinite\",{\"_index\":149,\"name\":{\"166\":{}},\"comment\":{}}],[\"isinf\",{\"_index\":150,\"name\":{\"167\":{}},\"comment\":{}}],[\"isnan\",{\"_index\":151,\"name\":{\"168\":{}},\"comment\":{}}],[\"keepinvalid\",{\"_index\":378,\"name\":{\"439\":{}},\"comment\":{}}],[\"kept\",{\"_index\":74,\"name\":{\"90\":{}},\"comment\":{}}],[\"kernelops\",{\"_index\":52,\"name\":{\"59\":{}},\"comment\":{}}],[\"kernels\",{\"_index\":312,\"name\":{\"357\":{}},\"comment\":{}}],[\"keypoints\",{\"_index\":454,\"name\":{\"618\":{},\"627\":{}},\"comment\":{}}],[\"kodachrome\",{\"_index\":415,\"name\":{\"551\":{}},\"comment\":{}}],[\"label\",{\"_index\":338,\"name\":{\"388\":{},\"628\":{},\"635\":{}},\"comment\":{}}],[\"labelcolor\",{\"_index\":259,\"name\":{\"288\":{}},\"comment\":{}}],[\"landmarks\",{\"_index\":397,\"name\":{\"508\":{},\"630\":{}},\"comment\":{}}],[\"leakyrelu\",{\"_index\":152,\"name\":{\"169\":{}},\"comment\":{}}],[\"left\",{\"_index\":462,\"name\":{\"645\":{}},\"comment\":{}}],[\"less\",{\"_index\":154,\"name\":{\"171\":{}},\"comment\":{}}],[\"lessequal\",{\"_index\":153,\"name\":{\"170\":{}},\"comment\":{}}],[\"lineheight\",{\"_index\":262,\"name\":{\"291\":{}},\"comment\":{}}],[\"linewidth\",{\"_index\":263,\"name\":{\"292\":{}},\"comment\":{}}],[\"list\",{\"_index\":66,\"name\":{\"79\":{}},\"comment\":{}}],[\"live\",{\"_index\":442,\"name\":{\"598\":{}},\"comment\":{}}],[\"liveness\",{\"_index\":393,\"name\":{\"490\":{}},\"comment\":{}}],[\"load\",{\"_index\":27,\"name\":{\"27\":{},\"78\":{},\"268\":{}},\"comment\":{}}],[\"loaded\",{\"_index\":67,\"name\":{\"80\":{}},\"comment\":{}}],[\"loadsync\",{\"_index\":242,\"name\":{\"269\":{}},\"comment\":{}}],[\"localresponsenormalization\",{\"_index\":155,\"name\":{\"172\":{}},\"comment\":{}}],[\"log\",{\"_index\":159,\"name\":{\"176\":{}},\"comment\":{}}],[\"log1p\",{\"_index\":160,\"name\":{\"177\":{}},\"comment\":{}}],[\"logicaland\",{\"_index\":161,\"name\":{\"178\":{}},\"comment\":{}}],[\"logicalnot\",{\"_index\":162,\"name\":{\"179\":{}},\"comment\":{}}],[\"logicalor\",{\"_index\":163,\"name\":{\"180\":{}},\"comment\":{}}],[\"logicalxor\",{\"_index\":164,\"name\":{\"181\":{}},\"comment\":{}}],[\"logsigmoid\",{\"_index\":156,\"name\":{\"173\":{}},\"comment\":{}}],[\"logsoftmax\",{\"_index\":157,\"name\":{\"174\":{}},\"comment\":{}}],[\"logsumexp\",{\"_index\":158,\"name\":{\"175\":{}},\"comment\":{}}],[\"mask\",{\"_index\":375,\"name\":{\"432\":{}},\"comment\":{}}],[\"match\",{\"_index\":13,\"name\":{\"13\":{},\"36\":{}},\"comment\":{}}],[\"matchoptions\",{\"_index\":41,\"name\":{\"45\":{}},\"comment\":{}}],[\"matmul\",{\"_index\":165,\"name\":{\"182\":{}},\"comment\":{}}],[\"max\",{\"_index\":167,\"name\":{\"184\":{}},\"comment\":{}}],[\"maxdetected\",{\"_index\":372,\"name\":{\"429\":{},\"497\":{},\"507\":{},\"522\":{}},\"comment\":{}}],[\"maximum\",{\"_index\":168,\"name\":{\"185\":{}},\"comment\":{}}],[\"maxpool\",{\"_index\":166,\"name\":{\"183\":{}},\"comment\":{}}],[\"mean\",{\"_index\":169,\"name\":{\"186\":{}},\"comment\":{}}],[\"mesh\",{\"_index\":388,\"name\":{\"484\":{},\"587\":{}},\"comment\":{}}],[\"meshraw\",{\"_index\":436,\"name\":{\"588\":{}},\"comment\":{}}],[\"metadata\",{\"_index\":239,\"name\":{\"262\":{}},\"comment\":{}}],[\"min\",{\"_index\":170,\"name\":{\"187\":{}},\"comment\":{}}],[\"minconfidence\",{\"_index\":373,\"name\":{\"430\":{},\"455\":{},\"461\":{},\"477\":{},\"498\":{},\"505\":{},\"520\":{}},\"comment\":{}}],[\"minimum\",{\"_index\":171,\"name\":{\"188\":{}},\"comment\":{}}],[\"mirrorpad\",{\"_index\":172,\"name\":{\"189\":{}},\"comment\":{}}],[\"missing\",{\"_index\":55,\"name\":{\"62\":{}},\"comment\":{}}],[\"mod\",{\"_index\":173,\"name\":{\"190\":{}},\"comment\":{}}],[\"mode\",{\"_index\":349,\"name\":{\"400\":{},\"529\":{}},\"comment\":{}}],[\"model\",{\"_index\":310,\"name\":{\"355\":{}},\"comment\":{}}],[\"modelbasepath\",{\"_index\":423,\"name\":{\"564\":{}},\"comment\":{}}],[\"modelinfo\",{\"_index\":351,\"name\":{\"405\":{}},\"comment\":{}}],[\"modelpath\",{\"_index\":367,\"name\":{\"424\":{},\"435\":{},\"441\":{},\"446\":{},\"451\":{},\"457\":{},\"463\":{},\"468\":{},\"473\":{},\"479\":{},\"493\":{},\"500\":{},\"511\":{},\"514\":{},\"516\":{},\"524\":{},\"531\":{}},\"comment\":{}}],[\"models\",{\"_index\":50,\"name\":{\"57\":{},\"72\":{},\"75\":{}},\"comment\":{}}],[\"modelsignature\",{\"_index\":240,\"name\":{\"264\":{}},\"comment\":{}}],[\"modelstats\",{\"_index\":57,\"name\":{\"64\":{},\"71\":{}},\"comment\":{}}],[\"modelstructuredoutputkeys\",{\"_index\":241,\"name\":{\"266\":{}},\"comment\":{}}],[\"modelversion\",{\"_index\":233,\"name\":{\"256\":{}},\"comment\":{}}],[\"mul\",{\"_index\":174,\"name\":{\"191\":{}},\"comment\":{}}],[\"multithread\",{\"_index\":302,\"name\":{\"339\":{}},\"comment\":{}}],[\"name\",{\"_index\":53,\"name\":{\"60\":{},\"406\":{}},\"comment\":{}}],[\"neg\",{\"_index\":175,\"name\":{\"192\":{}},\"comment\":{}}],[\"negative\",{\"_index\":412,\"name\":{\"548\":{}},\"comment\":{}}],[\"next\",{\"_index\":29,\"name\":{\"29\":{}},\"comment\":{}}],[\"node\",{\"_index\":286,\"name\":{\"318\":{}},\"comment\":{}}],[\"norm\",{\"_index\":176,\"name\":{\"193\":{}},\"comment\":{}}],[\"notequal\",{\"_index\":177,\"name\":{\"194\":{}},\"comment\":{}}],[\"now\",{\"_index\":21,\"name\":{\"21\":{}},\"comment\":{}}],[\"numdefinedmodels\",{\"_index\":59,\"name\":{\"66\":{}},\"comment\":{}}],[\"numloadedmodels\",{\"_index\":58,\"name\":{\"65\":{}},\"comment\":{}}],[\"object\",{\"_index\":48,\"name\":{\"55\":{},\"577\":{},\"655\":{}},\"comment\":{}}],[\"objectconfig\",{\"_index\":399,\"name\":{\"519\":{}},\"comment\":{}}],[\"objectlabels\",{\"_index\":281,\"name\":{\"310\":{}},\"comment\":{}}],[\"objectresult\",{\"_index\":457,\"name\":{\"631\":{}},\"comment\":{}}],[\"objecttype\",{\"_index\":330,\"name\":{\"377\":{}},\"comment\":{}}],[\"offscreen\",{\"_index\":294,\"name\":{\"328\":{}},\"comment\":{}}],[\"onehot\",{\"_index\":178,\"name\":{\"195\":{}},\"comment\":{}}],[\"oneslike\",{\"_index\":179,\"name\":{\"196\":{}},\"comment\":{}}],[\"ops\",{\"_index\":56,\"name\":{\"63\":{}},\"comment\":{}}],[\"options\",{\"_index\":44,\"name\":{\"51\":{}},\"comment\":{}}],[\"outputnodes\",{\"_index\":235,\"name\":{\"258\":{}},\"comment\":{}}],[\"outputs\",{\"_index\":237,\"name\":{\"260\":{}},\"comment\":{}}],[\"pad\",{\"_index\":180,\"name\":{\"197\":{}},\"comment\":{}}],[\"part\",{\"_index\":450,\"name\":{\"608\":{}},\"comment\":{}}],[\"pause\",{\"_index\":344,\"name\":{\"394\":{}},\"comment\":{}}],[\"paused\",{\"_index\":339,\"name\":{\"389\":{}},\"comment\":{}}],[\"percentageloaded\",{\"_index\":60,\"name\":{\"67\":{}},\"comment\":{}}],[\"perfadd\",{\"_index\":295,\"name\":{\"329\":{}},\"comment\":{}}],[\"performance\",{\"_index\":17,\"name\":{\"17\":{},\"656\":{}},\"comment\":{}}],[\"person\",{\"_index\":42,\"name\":{\"47\":{}},\"comment\":{}}],[\"personresult\",{\"_index\":460,\"name\":{\"639\":{}},\"comment\":{}}],[\"persons\",{\"_index\":466,\"name\":{\"659\":{}},\"comment\":{}}],[\"pixelate\",{\"_index\":418,\"name\":{\"554\":{}},\"comment\":{}}],[\"platform\",{\"_index\":288,\"name\":{\"320\":{}},\"comment\":{}}],[\"play\",{\"_index\":345,\"name\":{\"395\":{}},\"comment\":{}}],[\"point\",{\"_index\":284,\"name\":{\"313\":{}},\"comment\":{}}],[\"pointsize\",{\"_index\":264,\"name\":{\"293\":{}},\"comment\":{}}],[\"polaroid\",{\"_index\":417,\"name\":{\"553\":{}},\"comment\":{}}],[\"pool\",{\"_index\":181,\"name\":{\"198\":{}},\"comment\":{}}],[\"position\",{\"_index\":451,\"name\":{\"609\":{}},\"comment\":{}}],[\"positionraw\",{\"_index\":452,\"name\":{\"610\":{}},\"comment\":{}}],[\"pow\",{\"_index\":182,\"name\":{\"199\":{}},\"comment\":{}}],[\"predict\",{\"_index\":244,\"name\":{\"271\":{}},\"comment\":{}}],[\"prelu\",{\"_index\":183,\"name\":{\"200\":{}},\"comment\":{}}],[\"print\",{\"_index\":89,\"name\":{\"105\":{}},\"comment\":{}}],[\"process\",{\"_index\":6,\"name\":{\"6\":{}},\"comment\":{}}],[\"prod\",{\"_index\":184,\"name\":{\"201\":{}},\"comment\":{}}],[\"profile\",{\"_index\":31,\"name\":{\"31\":{}},\"comment\":{}}],[\"r0\",{\"_index\":249,\"name\":{\"278\":{}},\"comment\":{}}],[\"r1\",{\"_index\":250,\"name\":{\"279\":{}},\"comment\":{}}],[\"r2\",{\"_index\":251,\"name\":{\"280\":{}},\"comment\":{}}],[\"r3\",{\"_index\":252,\"name\":{\"281\":{}},\"comment\":{}}],[\"r4\",{\"_index\":253,\"name\":{\"282\":{}},\"comment\":{}}],[\"r5\",{\"_index\":254,\"name\":{\"283\":{}},\"comment\":{}}],[\"r6\",{\"_index\":255,\"name\":{\"284\":{}},\"comment\":{}}],[\"race\",{\"_index\":326,\"name\":{\"373\":{},\"594\":{}},\"comment\":{}}],[\"rank\",{\"_index\":77,\"name\":{\"93\":{},\"277\":{}},\"comment\":{}}],[\"ranktype\",{\"_index\":73,\"name\":{\"89\":{}},\"comment\":{}}],[\"ratio\",{\"_index\":401,\"name\":{\"528\":{}},\"comment\":{}}],[\"real\",{\"_index\":441,\"name\":{\"597\":{}},\"comment\":{}}],[\"reciprocal\",{\"_index\":185,\"name\":{\"202\":{}},\"comment\":{}}],[\"relu\",{\"_index\":186,\"name\":{\"203\":{}},\"comment\":{}}],[\"relu6\",{\"_index\":187,\"name\":{\"204\":{}},\"comment\":{}}],[\"renderer\",{\"_index\":304,\"name\":{\"345\":{}},\"comment\":{}}],[\"reset\",{\"_index\":19,\"name\":{\"19\":{},\"77\":{}},\"comment\":{}}],[\"reshape\",{\"_index\":189,\"name\":{\"206\":{}},\"comment\":{}}],[\"reshapeas\",{\"_index\":188,\"name\":{\"205\":{}},\"comment\":{}}],[\"resizebilinear\",{\"_index\":190,\"name\":{\"207\":{}},\"comment\":{}}],[\"resizenearestneighbor\",{\"_index\":191,\"name\":{\"208\":{}},\"comment\":{}}],[\"result\",{\"_index\":4,\"name\":{\"4\":{},\"650\":{}},\"comment\":{}}],[\"return\",{\"_index\":376,\"name\":{\"433\":{},\"539\":{}},\"comment\":{}}],[\"reverse\",{\"_index\":192,\"name\":{\"209\":{}},\"comment\":{}}],[\"rfft\",{\"_index\":193,\"name\":{\"210\":{}},\"comment\":{}}],[\"right\",{\"_index\":463,\"name\":{\"646\":{}},\"comment\":{}}],[\"rotation\",{\"_index\":371,\"name\":{\"428\":{},\"504\":{},\"599\":{}},\"comment\":{}}],[\"round\",{\"_index\":194,\"name\":{\"211\":{}},\"comment\":{}}],[\"roundrect\",{\"_index\":265,\"name\":{\"294\":{}},\"comment\":{}}],[\"rsqrt\",{\"_index\":195,\"name\":{\"212\":{}},\"comment\":{}}],[\"saturation\",{\"_index\":410,\"name\":{\"546\":{}},\"comment\":{}}],[\"save\",{\"_index\":243,\"name\":{\"270\":{}},\"comment\":{}}],[\"scopeid\",{\"_index\":75,\"name\":{\"91\":{}},\"comment\":{}}],[\"score\",{\"_index\":432,\"name\":{\"582\":{},\"612\":{},\"615\":{},\"622\":{},\"633\":{}},\"comment\":{}}],[\"segmentation\",{\"_index\":23,\"name\":{\"23\":{},\"578\":{}},\"comment\":{}}],[\"segmentationconfig\",{\"_index\":400,\"name\":{\"527\":{}},\"comment\":{}}],[\"segmentationenum\",{\"_index\":364,\"name\":{\"421\":{}},\"comment\":{}}],[\"selu\",{\"_index\":196,\"name\":{\"213\":{}},\"comment\":{}}],[\"separableconv2d\",{\"_index\":197,\"name\":{\"214\":{}},\"comment\":{}}],[\"sepia\",{\"_index\":413,\"name\":{\"549\":{}},\"comment\":{}}],[\"settings\",{\"_index\":337,\"name\":{\"387\":{}},\"comment\":{}}],[\"shader\",{\"_index\":305,\"name\":{\"346\":{}},\"comment\":{}}],[\"shadowcolor\",{\"_index\":260,\"name\":{\"289\":{}},\"comment\":{}}],[\"shape\",{\"_index\":70,\"name\":{\"86\":{}},\"comment\":{}}],[\"sharpness\",{\"_index\":408,\"name\":{\"544\":{}},\"comment\":{}}],[\"sigmoid\",{\"_index\":198,\"name\":{\"215\":{}},\"comment\":{}}],[\"sign\",{\"_index\":199,\"name\":{\"216\":{}},\"comment\":{}}],[\"simd\",{\"_index\":301,\"name\":{\"338\":{}},\"comment\":{}}],[\"similarity\",{\"_index\":37,\"name\":{\"38\":{},\"43\":{}},\"comment\":{}}],[\"sin\",{\"_index\":200,\"name\":{\"217\":{}},\"comment\":{}}],[\"sinh\",{\"_index\":201,\"name\":{\"218\":{}},\"comment\":{}}],[\"size\",{\"_index\":71,\"name\":{\"87\":{}},\"comment\":{}}],[\"sizedesired\",{\"_index\":353,\"name\":{\"408\":{}},\"comment\":{}}],[\"sizefrommanifest\",{\"_index\":354,\"name\":{\"409\":{}},\"comment\":{}}],[\"sizeloadedweights\",{\"_index\":355,\"name\":{\"410\":{}},\"comment\":{}}],[\"skeleton\",{\"_index\":398,\"name\":{\"512\":{}},\"comment\":{}}],[\"skipallowed\",{\"_index\":429,\"name\":{\"571\":{}},\"comment\":{}}],[\"skipframes\",{\"_index\":368,\"name\":{\"425\":{},\"436\":{},\"442\":{},\"447\":{},\"452\":{},\"458\":{},\"464\":{},\"469\":{},\"474\":{},\"480\":{},\"494\":{},\"501\":{},\"517\":{},\"525\":{},\"532\":{}},\"comment\":{}}],[\"skiptime\",{\"_index\":369,\"name\":{\"426\":{},\"437\":{},\"443\":{},\"448\":{},\"453\":{},\"459\":{},\"465\":{},\"470\":{},\"475\":{},\"481\":{},\"495\":{},\"502\":{},\"518\":{},\"526\":{},\"533\":{}},\"comment\":{}}],[\"sleep\",{\"_index\":33,\"name\":{\"33\":{}},\"comment\":{}}],[\"slice\",{\"_index\":202,\"name\":{\"219\":{}},\"comment\":{}}],[\"softmax\",{\"_index\":203,\"name\":{\"220\":{}},\"comment\":{}}],[\"softplus\",{\"_index\":204,\"name\":{\"221\":{}},\"comment\":{}}],[\"softwarekernels\",{\"_index\":427,\"name\":{\"569\":{}},\"comment\":{}}],[\"spacetobatchnd\",{\"_index\":205,\"name\":{\"222\":{}},\"comment\":{}}],[\"split\",{\"_index\":206,\"name\":{\"223\":{}},\"comment\":{}}],[\"sqrt\",{\"_index\":207,\"name\":{\"224\":{}},\"comment\":{}}],[\"square\",{\"_index\":208,\"name\":{\"225\":{}},\"comment\":{}}],[\"squareddifference\",{\"_index\":209,\"name\":{\"226\":{}},\"comment\":{}}],[\"squeeze\",{\"_index\":210,\"name\":{\"227\":{}},\"comment\":{}}],[\"stack\",{\"_index\":211,\"name\":{\"228\":{}},\"comment\":{}}],[\"start\",{\"_index\":343,\"name\":{\"393\":{}},\"comment\":{}}],[\"state\",{\"_index\":5,\"name\":{\"5\":{}},\"comment\":{}}],[\"stats\",{\"_index\":65,\"name\":{\"76\":{}},\"comment\":{}}],[\"step\",{\"_index\":212,\"name\":{\"229\":{}},\"comment\":{}}],[\"stop\",{\"_index\":346,\"name\":{\"396\":{}},\"comment\":{}}],[\"stream\",{\"_index\":332,\"name\":{\"382\":{}},\"comment\":{}}],[\"stridedslice\",{\"_index\":213,\"name\":{\"230\":{}},\"comment\":{}}],[\"strides\",{\"_index\":76,\"name\":{\"92\":{}},\"comment\":{}}],[\"sub\",{\"_index\":214,\"name\":{\"231\":{}},\"comment\":{}}],[\"sum\",{\"_index\":215,\"name\":{\"232\":{}},\"comment\":{}}],[\"supported\",{\"_index\":299,\"name\":{\"336\":{},\"342\":{},\"350\":{}},\"comment\":{}}],[\"tan\",{\"_index\":216,\"name\":{\"233\":{}},\"comment\":{}}],[\"tanh\",{\"_index\":217,\"name\":{\"234\":{}},\"comment\":{}}],[\"technicolor\",{\"_index\":416,\"name\":{\"552\":{}},\"comment\":{}}],[\"tensor\",{\"_index\":8,\"name\":{\"8\":{},\"82\":{},\"252\":{},\"600\":{}},\"comment\":{}}],[\"tensor4d\",{\"_index\":231,\"name\":{\"253\":{}},\"comment\":{}}],[\"tensorflow\",{\"_index\":296,\"name\":{\"330\":{}},\"comment\":{}}],[\"tf\",{\"_index\":10,\"name\":{\"10\":{}},\"comment\":{}}],[\"tfjs\",{\"_index\":293,\"name\":{\"325\":{}},\"comment\":{}}],[\"throwifdisposed\",{\"_index\":88,\"name\":{\"104\":{}},\"comment\":{}}],[\"tile\",{\"_index\":218,\"name\":{\"235\":{}},\"comment\":{}}],[\"timestamp\",{\"_index\":465,\"name\":{\"658\":{}},\"comment\":{}}],[\"tobool\",{\"_index\":219,\"name\":{\"236\":{}},\"comment\":{}}],[\"tofloat\",{\"_index\":220,\"name\":{\"237\":{}},\"comment\":{}}],[\"toint\",{\"_index\":221,\"name\":{\"238\":{}},\"comment\":{}}],[\"topk\",{\"_index\":222,\"name\":{\"239\":{}},\"comment\":{}}],[\"tostring\",{\"_index\":91,\"name\":{\"107\":{}},\"comment\":{}}],[\"totalsizefrommanifest\",{\"_index\":61,\"name\":{\"68\":{}},\"comment\":{}}],[\"totalsizeloading\",{\"_index\":63,\"name\":{\"70\":{}},\"comment\":{}}],[\"totalsizeweights\",{\"_index\":62,\"name\":{\"69\":{}},\"comment\":{}}],[\"track\",{\"_index\":334,\"name\":{\"384\":{}},\"comment\":{}}],[\"transpose\",{\"_index\":225,\"name\":{\"243\":{}},\"comment\":{}}],[\"unique\",{\"_index\":226,\"name\":{\"244\":{}},\"comment\":{}}],[\"unsortedsegmentsum\",{\"_index\":227,\"name\":{\"248\":{}},\"comment\":{}}],[\"unstack\",{\"_index\":228,\"name\":{\"249\":{}},\"comment\":{}}],[\"updatebackend\",{\"_index\":314,\"name\":{\"361\":{}},\"comment\":{}}],[\"updatecpu\",{\"_index\":315,\"name\":{\"362\":{}},\"comment\":{}}],[\"url\",{\"_index\":54,\"name\":{\"61\":{},\"411\":{}},\"comment\":{}}],[\"usecurves\",{\"_index\":275,\"name\":{\"304\":{}},\"comment\":{}}],[\"usedepth\",{\"_index\":274,\"name\":{\"303\":{}},\"comment\":{}}],[\"validate\",{\"_index\":20,\"name\":{\"20\":{},\"81\":{}},\"comment\":{}}],[\"validatemodel\",{\"_index\":51,\"name\":{\"58\":{}},\"comment\":{}}],[\"validatemodels\",{\"_index\":425,\"name\":{\"566\":{}},\"comment\":{}}],[\"values\",{\"_index\":223,\"name\":{\"241\":{},\"246\":{}},\"comment\":{}}],[\"variable\",{\"_index\":92,\"name\":{\"108\":{}},\"comment\":{}}],[\"vendor\",{\"_index\":306,\"name\":{\"347\":{}},\"comment\":{}}],[\"version\",{\"_index\":2,\"name\":{\"2\":{},\"327\":{},\"332\":{},\"344\":{}},\"comment\":{}}],[\"video\",{\"_index\":34,\"name\":{\"34\":{}},\"comment\":{}}],[\"vintage\",{\"_index\":414,\"name\":{\"550\":{}},\"comment\":{}}],[\"warmup\",{\"_index\":30,\"name\":{\"30\":{},\"563\":{}},\"comment\":{}}],[\"warmupenum\",{\"_index\":363,\"name\":{\"420\":{}},\"comment\":{}}],[\"wasm\",{\"_index\":298,\"name\":{\"334\":{}},\"comment\":{}}],[\"wasmpath\",{\"_index\":420,\"name\":{\"559\":{}},\"comment\":{}}],[\"wasmplatformfetch\",{\"_index\":421,\"name\":{\"560\":{}},\"comment\":{}}],[\"webcam\",{\"_index\":26,\"name\":{\"26\":{},\"378\":{}},\"comment\":{}}],[\"webcamconfig\",{\"_index\":347,\"name\":{\"397\":{}},\"comment\":{}}],[\"webgl\",{\"_index\":303,\"name\":{\"340\":{}},\"comment\":{}}],[\"webgpu\",{\"_index\":307,\"name\":{\"348\":{}},\"comment\":{}}],[\"weights\",{\"_index\":238,\"name\":{\"261\":{}},\"comment\":{}}],[\"where\",{\"_index\":229,\"name\":{\"250\":{}},\"comment\":{}}],[\"width\",{\"_index\":340,\"name\":{\"390\":{},\"402\":{},\"537\":{},\"661\":{}},\"comment\":{}}],[\"worker\",{\"_index\":287,\"name\":{\"319\":{}},\"comment\":{}}],[\"zeroslike\",{\"_index\":230,\"name\":{\"251\":{}},\"comment\":{}}]],\"pipeline\":[]}}"); \ No newline at end of file diff --git a/typedoc/assets/style.css b/typedoc/assets/style.css new file mode 100644 index 00000000..e5093854 --- /dev/null +++ b/typedoc/assets/style.css @@ -0,0 +1,1257 @@ +:root { + /* Light */ + --light-color-background: #f2f4f8; + --light-color-background-secondary: #eff0f1; + --light-color-icon-background: var(--light-color-background); + --light-color-accent: #c5c7c9; + --light-color-text: #222; + --light-color-text-aside: #707070; + --light-color-link: #4da6ff; + --light-color-ts: #db1373; + --light-color-ts-interface: #139d2c; + --light-color-ts-enum: #9c891a; + --light-color-ts-class: #2484e5; + --light-color-ts-function: #572be7; + --light-color-ts-namespace: #b111c9; + --light-color-ts-private: #707070; + --light-color-ts-variable: #4d68ff; + --light-external-icon: url("data:image/svg+xml;utf8,"); + --light-color-scheme: light; + + /* Dark */ + --dark-color-background: #2b2e33; + --dark-color-background-secondary: #1e2024; + --dark-color-icon-background: var(--dark-color-background-secondary); + --dark-color-accent: #9096a2; + --dark-color-text: #f5f5f5; + --dark-color-text-aside: #dddddd; + --dark-color-link: #00aff4; + --dark-color-ts: #ff6492; + --dark-color-ts-interface: #6cff87; + --dark-color-ts-enum: #f4d93e; + --dark-color-ts-class: #61b0ff; + --dark-color-ts-function: #9772ff; + --dark-color-ts-namespace: #e14dff; + --dark-color-ts-private: #e2e2e2; + --dark-color-ts-variable: #4d68ff; + --dark-external-icon: url("data:image/svg+xml;utf8,"); + --dark-color-scheme: dark; +} + +@media (prefers-color-scheme: light) { + :root { + --color-background: var(--light-color-background); + --color-background-secondary: var(--light-color-background-secondary); + --color-icon-background: var(--light-color-icon-background); + --color-accent: var(--light-color-accent); + --color-text: var(--light-color-text); + --color-text-aside: var(--light-color-text-aside); + --color-link: var(--light-color-link); + --color-ts: var(--light-color-ts); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-class: var(--light-color-ts-class); + --color-ts-function: var(--light-color-ts-function); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-private: var(--light-color-ts-private); + --color-ts-variable: var(--light-color-ts-variable); + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); + } +} + +@media (prefers-color-scheme: dark) { + :root { + --color-background: var(--dark-color-background); + --color-background-secondary: var(--dark-color-background-secondary); + --color-icon-background: var(--dark-color-icon-background); + --color-accent: var(--dark-color-accent); + --color-text: var(--dark-color-text); + --color-text-aside: var(--dark-color-text-aside); + --color-link: var(--dark-color-link); + --color-ts: var(--dark-color-ts); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-private: var(--dark-color-ts-private); + --color-ts-variable: var(--dark-color-ts-variable); + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); + } +} + +html { + color-scheme: var(--color-scheme); +} + +body { + margin: 0; +} + +:root[data-theme="light"] { + --color-background: var(--light-color-background); + --color-background-secondary: var(--light-color-background-secondary); + --color-icon-background: var(--light-color-icon-background); + --color-accent: var(--light-color-accent); + --color-text: var(--light-color-text); + --color-text-aside: var(--light-color-text-aside); + --color-link: var(--light-color-link); + --color-ts: var(--light-color-ts); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-class: var(--light-color-ts-class); + --color-ts-function: var(--light-color-ts-function); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-private: var(--light-color-ts-private); + --color-ts-variable: var(--light-color-ts-variable); + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); +} + +:root[data-theme="dark"] { + --color-background: var(--dark-color-background); + --color-background-secondary: var(--dark-color-background-secondary); + --color-icon-background: var(--dark-color-icon-background); + --color-accent: var(--dark-color-accent); + --color-text: var(--dark-color-text); + --color-text-aside: var(--dark-color-text-aside); + --color-link: var(--dark-color-link); + --color-ts: var(--dark-color-ts); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-private: var(--dark-color-ts-private); + --color-ts-variable: var(--dark-color-ts-variable); + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); +} + +h1, +h2, +h3, +h4, +h5, +h6 { + line-height: 1.2; +} + +h1 { + font-size: 1.875rem; + margin: 0.67rem 0; +} + +h2 { + font-size: 1.5rem; + margin: 0.83rem 0; +} + +h3 { + font-size: 1.25rem; + margin: 1rem 0; +} + +h4 { + font-size: 1.05rem; + margin: 1.33rem 0; +} + +h5 { + font-size: 1rem; + margin: 1.5rem 0; +} + +h6 { + font-size: 0.875rem; + margin: 2.33rem 0; +} + +.uppercase { + text-transform: uppercase; +} + +pre { + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; +} + +dl, +menu, +ol, +ul { + margin: 1em 0; +} + +dd { + margin: 0 0 0 40px; +} + +.container { + max-width: 1600px; + padding: 0 2rem; +} + +@media (min-width: 640px) { + .container { + padding: 0 4rem; + } +} +@media (min-width: 1200px) { + .container { + padding: 0 8rem; + } +} +@media (min-width: 1600px) { + .container { + padding: 0 12rem; + } +} + +/* Footer */ +.tsd-generator { + border-top: 1px solid var(--color-accent); + padding-top: 1rem; + padding-bottom: 1rem; + max-height: 3.5rem; +} + +.tsd-generator > p { + margin-top: 0; + margin-bottom: 0; + padding: 0 1rem; +} + +.container-main { + display: flex; + justify-content: space-between; + position: relative; + margin: 0 auto; +} + +.col-4, +.col-8 { + box-sizing: border-box; + float: left; + padding: 2rem 1rem; +} + +.col-4 { + flex: 0 0 25%; +} +.col-8 { + flex: 1 0; + flex-wrap: wrap; + padding-left: 0; +} + +@keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} +@keyframes fade-out { + from { + opacity: 1; + visibility: visible; + } + to { + opacity: 0; + } +} +@keyframes fade-in-delayed { + 0% { + opacity: 0; + } + 33% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@keyframes fade-out-delayed { + 0% { + opacity: 1; + visibility: visible; + } + 66% { + opacity: 0; + } + 100% { + opacity: 0; + } +} +@keyframes shift-to-left { + from { + transform: translate(0, 0); + } + to { + transform: translate(-25%, 0); + } +} +@keyframes unshift-to-left { + from { + transform: translate(-25%, 0); + } + to { + transform: translate(0, 0); + } +} +@keyframes pop-in-from-right { + from { + transform: translate(100%, 0); + } + to { + transform: translate(0, 0); + } +} +@keyframes pop-out-to-right { + from { + transform: translate(0, 0); + visibility: visible; + } + to { + transform: translate(100%, 0); + } +} +body { + background: var(--color-background); + font-family: "Segoe UI", sans-serif; + font-size: 16px; + color: var(--color-text); +} + +a { + color: var(--color-link); + text-decoration: none; +} +a:hover { + text-decoration: underline; +} +a.external[target="_blank"] { + background-image: var(--external-icon); + background-position: top 3px right; + background-repeat: no-repeat; + padding-right: 13px; +} + +code, +pre { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + padding: 0.2em; + margin: 0; + font-size: 0.875rem; + border-radius: 0.8em; +} + +pre { + padding: 10px; + border: 0.1em solid var(--color-accent); +} +pre code { + padding: 0; + font-size: 100%; +} + +blockquote { + margin: 1em 0; + padding-left: 1em; + border-left: 4px solid gray; +} + +.tsd-typography { + line-height: 1.333em; +} +.tsd-typography ul { + list-style: square; + padding: 0 0 0 20px; + margin: 0; +} +.tsd-typography h4, +.tsd-typography .tsd-index-panel h3, +.tsd-index-panel .tsd-typography h3, +.tsd-typography h5, +.tsd-typography h6 { + font-size: 1em; + margin: 0; +} +.tsd-typography h5, +.tsd-typography h6 { + font-weight: normal; +} +.tsd-typography p, +.tsd-typography ul, +.tsd-typography ol { + margin: 1em 0; +} + +@media (max-width: 1024px) { + html .col-content { + float: none; + max-width: 100%; + width: 100%; + padding-top: 3rem; + } + html .col-menu { + position: fixed !important; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + z-index: 1024; + top: 0 !important; + bottom: 0 !important; + left: auto !important; + right: 0 !important; + padding: 1.5rem 1.5rem 0 0; + max-width: 25rem; + visibility: hidden; + background-color: var(--color-background); + transform: translate(100%, 0); + } + html .col-menu > *:last-child { + padding-bottom: 20px; + } + html .overlay { + content: ""; + display: block; + position: fixed; + z-index: 1023; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.75); + visibility: hidden; + } + + .to-has-menu .overlay { + animation: fade-in 0.4s; + } + + .to-has-menu :is(header, footer, .col-content) { + animation: shift-to-left 0.4s; + } + + .to-has-menu .col-menu { + animation: pop-in-from-right 0.4s; + } + + .from-has-menu .overlay { + animation: fade-out 0.4s; + } + + .from-has-menu :is(header, footer, .col-content) { + animation: unshift-to-left 0.4s; + } + + .from-has-menu .col-menu { + animation: pop-out-to-right 0.4s; + } + + .has-menu body { + overflow: hidden; + } + .has-menu .overlay { + visibility: visible; + } + .has-menu :is(header, footer, .col-content) { + transform: translate(-25%, 0); + } + .has-menu .col-menu { + visibility: visible; + transform: translate(0, 0); + display: grid; + align-items: center; + grid-template-rows: auto 1fr; + grid-gap: 1.5rem; + max-height: 100vh; + padding: 1rem 2rem; + } + .has-menu .tsd-navigation { + max-height: 100%; + } +} + +.tsd-breadcrumb { + margin: 0; + padding: 0; + color: var(--color-text-aside); +} +.tsd-breadcrumb a { + color: var(--color-text-aside); + text-decoration: none; +} +.tsd-breadcrumb a:hover { + text-decoration: underline; +} +.tsd-breadcrumb li { + display: inline; +} +.tsd-breadcrumb li:after { + content: " / "; +} + +.tsd-comment-tags { + display: flex; + flex-direction: column; +} +dl.tsd-comment-tag-group { + display: flex; + align-items: center; + overflow: hidden; + margin: 0.5em 0; +} +dl.tsd-comment-tag-group dt { + display: flex; + margin-right: 0.5em; + font-size: 0.875em; + font-weight: normal; +} +dl.tsd-comment-tag-group dd { + margin: 0; +} +code.tsd-tag { + padding: 0.25em 0.4em; + border: 0.1em solid var(--color-accent); + margin-right: 0.25em; + font-size: 70%; +} +h1 code.tsd-tag:first-of-type { + margin-left: 0.25em; +} + +dl.tsd-comment-tag-group dd:before, +dl.tsd-comment-tag-group dd:after { + content: " "; +} +dl.tsd-comment-tag-group dd pre, +dl.tsd-comment-tag-group dd:after { + clear: both; +} +dl.tsd-comment-tag-group p { + margin: 0; +} + +.tsd-panel.tsd-comment .lead { + font-size: 1.1em; + line-height: 1.333em; + margin-bottom: 2em; +} +.tsd-panel.tsd-comment .lead:last-child { + margin-bottom: 0; +} + +.tsd-filter-visibility h4 { + font-size: 1rem; + padding-top: 0.75rem; + padding-bottom: 0.5rem; + margin: 0; +} +.tsd-filter-item:not(:last-child) { + margin-bottom: 0.5rem; +} +.tsd-filter-input { + display: flex; + width: fit-content; + width: -moz-fit-content; + align-items: center; + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + cursor: pointer; +} +.tsd-filter-input input[type="checkbox"] { + cursor: pointer; + position: absolute; + width: 1.5em; + height: 1.5em; + opacity: 0; +} +.tsd-filter-input input[type="checkbox"]:disabled { + pointer-events: none; +} +.tsd-filter-input svg { + cursor: pointer; + width: 1.5em; + height: 1.5em; + margin-right: 0.5em; + border-radius: 0.33em; + /* Leaving this at full opacity breaks event listeners on Firefox. + Don't remove unless you know what you're doing. */ + opacity: 0.99; +} +.tsd-filter-input input[type="checkbox"]:focus + svg { + transform: scale(0.95); +} +.tsd-filter-input input[type="checkbox"]:focus:not(:focus-visible) + svg { + transform: scale(1); +} +.tsd-checkbox-background { + fill: var(--color-accent); +} +input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { + stroke: var(--color-text); +} +.tsd-filter-input input:disabled ~ svg > .tsd-checkbox-background { + fill: var(--color-background); + stroke: var(--color-accent); + stroke-width: 0.25rem; +} +.tsd-filter-input input:disabled ~ svg > .tsd-checkbox-checkmark { + stroke: var(--color-accent); +} + +.tsd-theme-toggle { + padding-top: 0.75rem; +} +.tsd-theme-toggle > h4 { + display: inline; + vertical-align: middle; + margin-right: 0.75rem; +} + +.tsd-hierarchy { + list-style: square; + margin: 0; +} +.tsd-hierarchy .target { + font-weight: bold; +} + +.tsd-panel-group.tsd-index-group { + margin-bottom: 0; +} +.tsd-index-panel .tsd-index-list { + list-style: none; + line-height: 1.333em; + margin: 0; + padding: 0.25rem 0 0 0; + overflow: hidden; + display: grid; + grid-template-columns: repeat(3, 1fr); + column-gap: 1rem; + grid-template-rows: auto; +} +@media (max-width: 1024px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(2, 1fr); + } +} +@media (max-width: 768px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(1, 1fr); + } +} +.tsd-index-panel .tsd-index-list li { + -webkit-page-break-inside: avoid; + -moz-page-break-inside: avoid; + -ms-page-break-inside: avoid; + -o-page-break-inside: avoid; + page-break-inside: avoid; +} +.tsd-index-panel a, +.tsd-index-panel a.tsd-parent-kind-module { + color: var(--color-ts); +} +.tsd-index-panel a.tsd-parent-kind-interface { + color: var(--color-ts-interface); +} +.tsd-index-panel a.tsd-parent-kind-enum { + color: var(--color-ts-enum); +} +.tsd-index-panel a.tsd-parent-kind-class { + color: var(--color-ts-class); +} +.tsd-index-panel a.tsd-kind-module { + color: var(--color-ts-namespace); +} +.tsd-index-panel a.tsd-kind-interface { + color: var(--color-ts-interface); +} +.tsd-index-panel a.tsd-kind-enum { + color: var(--color-ts-enum); +} +.tsd-index-panel a.tsd-kind-class { + color: var(--color-ts-class); +} +.tsd-index-panel a.tsd-kind-function { + color: var(--color-ts-function); +} +.tsd-index-panel a.tsd-kind-namespace { + color: var(--color-ts-namespace); +} +.tsd-index-panel a.tsd-kind-variable { + color: var(--color-ts-variable); +} +.tsd-index-panel a.tsd-is-private { + color: var(--color-ts-private); +} + +.tsd-flag { + display: inline-block; + padding: 0.25em 0.4em; + border-radius: 4px; + color: var(--color-comment-tag-text); + background-color: var(--color-comment-tag); + text-indent: 0; + font-size: 75%; + line-height: 1; + font-weight: normal; +} + +.tsd-anchor { + position: absolute; + top: -100px; +} + +.tsd-member { + position: relative; +} +.tsd-member .tsd-anchor + h3 { + display: flex; + align-items: center; + margin-top: 0; + margin-bottom: 0; + border-bottom: none; +} +.tsd-member [data-tsd-kind] { + color: var(--color-ts); +} +.tsd-member [data-tsd-kind="Interface"] { + color: var(--color-ts-interface); +} +.tsd-member [data-tsd-kind="Enum"] { + color: var(--color-ts-enum); +} +.tsd-member [data-tsd-kind="Class"] { + color: var(--color-ts-class); +} +.tsd-member [data-tsd-kind="Private"] { + color: var(--color-ts-private); +} + +.tsd-navigation a { + display: block; + margin: 0.4rem 0; + border-left: 2px solid transparent; + color: var(--color-text); + text-decoration: none; + transition: border-left-color 0.1s; +} +.tsd-navigation a:hover { + text-decoration: underline; +} +.tsd-navigation ul { + margin: 0; + padding: 0; + list-style: none; +} +.tsd-navigation li { + padding: 0; +} + +.tsd-navigation.primary .tsd-accordion-details > ul { + margin-top: 0.75rem; +} +.tsd-navigation.primary a { + padding: 0.75rem 0.5rem; + margin: 0; +} +.tsd-navigation.primary ul li a { + margin-left: 0.5rem; +} +.tsd-navigation.primary ul li li a { + margin-left: 1.5rem; +} +.tsd-navigation.primary ul li li li a { + margin-left: 2.5rem; +} +.tsd-navigation.primary ul li li li li a { + margin-left: 3.5rem; +} +.tsd-navigation.primary ul li li li li li a { + margin-left: 4.5rem; +} +.tsd-navigation.primary ul li li li li li li a { + margin-left: 5.5rem; +} +.tsd-navigation.primary li.current > a { + border-left: 0.15rem var(--color-text) solid; +} +.tsd-navigation.primary li.selected > a { + font-weight: bold; + border-left: 0.2rem var(--color-text) solid; +} +.tsd-navigation.primary ul li a:hover { + border-left: 0.2rem var(--color-text-aside) solid; +} +.tsd-navigation.primary li.globals + li > span, +.tsd-navigation.primary li.globals + li > a { + padding-top: 20px; +} + +.tsd-navigation.secondary.tsd-navigation--toolbar-hide { + max-height: calc(100vh - 1rem); + top: 0.5rem; +} +.tsd-navigation.secondary > ul { + display: inline; + padding-right: 0.5rem; + transition: opacity 0.2s; +} +.tsd-navigation.secondary ul li a { + padding-left: 0; +} +.tsd-navigation.secondary ul li li a { + padding-left: 1.1rem; +} +.tsd-navigation.secondary ul li li li a { + padding-left: 2.2rem; +} +.tsd-navigation.secondary ul li li li li a { + padding-left: 3.3rem; +} +.tsd-navigation.secondary ul li li li li li a { + padding-left: 4.4rem; +} +.tsd-navigation.secondary ul li li li li li li a { + padding-left: 5.5rem; +} + +#tsd-sidebar-links a { + margin-top: 0; + margin-bottom: 0.5rem; + line-height: 1.25rem; +} +#tsd-sidebar-links a:last-of-type { + margin-bottom: 0; +} + +a.tsd-index-link { + margin: 0.25rem 0; + font-size: 1rem; + line-height: 1.25rem; + display: inline-flex; + align-items: center; +} +.tsd-accordion-summary > h1, +.tsd-accordion-summary > h2, +.tsd-accordion-summary > h3, +.tsd-accordion-summary > h4, +.tsd-accordion-summary > h5 { + display: inline-flex; + align-items: center; + vertical-align: middle; + margin-bottom: 0; + user-select: none; + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; +} +.tsd-accordion-summary { + display: block; + cursor: pointer; +} +.tsd-accordion-summary > * { + margin-top: 0; + margin-bottom: 0; + padding-top: 0; + padding-bottom: 0; +} +.tsd-accordion-summary::-webkit-details-marker { + display: none; +} +.tsd-index-accordion .tsd-accordion-summary svg { + margin-right: 0.25rem; +} +.tsd-index-content > :not(:first-child) { + margin-top: 0.75rem; +} +.tsd-index-heading { + margin-top: 1.5rem; + margin-bottom: 0.75rem; +} + +.tsd-kind-icon { + margin-right: 0.5rem; + width: 1.25rem; + height: 1.25rem; + min-width: 1.25rem; + min-height: 1.25rem; +} +.tsd-kind-icon path { + transform-origin: center; + transform: scale(1.1); +} +.tsd-signature > .tsd-kind-icon { + margin-right: 0.8rem; +} + +@media (min-width: 1024px) { + .col-content { + margin: 2rem auto; + } + + .menu-sticky-wrap { + position: sticky; + height: calc(100vh - 2rem); + top: 4rem; + right: 0; + padding: 0 1.5rem; + padding-top: 1rem; + margin-top: 3rem; + transition: 0.3s ease-in-out; + transition-property: top, padding-top, padding, height; + overflow-y: auto; + } + .col-menu { + border-left: 1px solid var(--color-accent); + } + .col-menu--hide { + top: 1rem; + } + .col-menu .tsd-navigation:not(:last-child) { + padding-bottom: 1.75rem; + } +} + +.tsd-panel { + margin-bottom: 2.5rem; +} +.tsd-panel.tsd-member { + margin-bottom: 4rem; +} +.tsd-panel:empty { + display: none; +} +.tsd-panel > h1, +.tsd-panel > h2, +.tsd-panel > h3 { + margin: 1.5rem -1.5rem 0.75rem -1.5rem; + padding: 0 1.5rem 0.75rem 1.5rem; +} +.tsd-panel > h1.tsd-before-signature, +.tsd-panel > h2.tsd-before-signature, +.tsd-panel > h3.tsd-before-signature { + margin-bottom: 0; + border-bottom: none; +} + +.tsd-panel-group { + margin: 4rem 0; +} +.tsd-panel-group.tsd-index-group { + margin: 2rem 0; +} +.tsd-panel-group.tsd-index-group details { + margin: 2rem 0; +} + +#tsd-search { + transition: background-color 0.2s; +} +#tsd-search .title { + position: relative; + z-index: 2; +} +#tsd-search .field { + position: absolute; + left: 0; + top: 0; + right: 2.5rem; + height: 100%; +} +#tsd-search .field input { + box-sizing: border-box; + position: relative; + top: -50px; + z-index: 1; + width: 100%; + padding: 0 10px; + opacity: 0; + outline: 0; + border: 0; + background: transparent; + color: var(--color-text); +} +#tsd-search .field label { + position: absolute; + overflow: hidden; + right: -40px; +} +#tsd-search .field input, +#tsd-search .title, +#tsd-toolbar-links a { + transition: opacity 0.2s; +} +#tsd-search .results { + position: absolute; + visibility: hidden; + top: 40px; + width: 100%; + margin: 0; + padding: 0; + list-style: none; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); +} +#tsd-search .results li { + padding: 0 10px; + background-color: var(--color-background); +} +#tsd-search .results li:nth-child(even) { + background-color: var(--color-background-secondary); +} +#tsd-search .results li.state { + display: none; +} +#tsd-search .results li.current, +#tsd-search .results li:hover { + background-color: var(--color-accent); +} +#tsd-search .results a { + display: block; +} +#tsd-search .results a:before { + top: 10px; +} +#tsd-search .results span.parent { + color: var(--color-text-aside); + font-weight: normal; +} +#tsd-search.has-focus { + background-color: var(--color-accent); +} +#tsd-search.has-focus .field input { + top: 0; + opacity: 1; +} +#tsd-search.has-focus .title, +#tsd-search.has-focus #tsd-toolbar-links a { + z-index: 0; + opacity: 0; +} +#tsd-search.has-focus .results { + visibility: visible; +} +#tsd-search.loading .results li.state.loading { + display: block; +} +#tsd-search.failure .results li.state.failure { + display: block; +} + +#tsd-toolbar-links { + position: absolute; + top: 0; + right: 2rem; + height: 100%; + display: flex; + align-items: center; + justify-content: flex-end; +} +#tsd-toolbar-links a { + margin-left: 1.5rem; +} +#tsd-toolbar-links a:hover { + text-decoration: underline; +} + +.tsd-signature { + margin: 0 0 1rem 0; + padding: 1rem 0.5rem; + border: 1px solid var(--color-accent); + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 14px; + overflow-x: auto; +} + +.tsd-signature-symbol { + color: var(--color-text-aside); + font-weight: normal; +} + +.tsd-signature-type { + font-style: italic; + font-weight: normal; +} + +.tsd-signatures { + padding: 0; + margin: 0 0 1em 0; + list-style-type: none; +} +.tsd-signatures .tsd-signature { + margin: 0; + border-color: var(--color-accent); + border-width: 1px 0; + transition: background-color 0.1s; +} +.tsd-description .tsd-signatures .tsd-signature { + border-width: 1px; +} + +ul.tsd-parameter-list, +ul.tsd-type-parameter-list { + list-style: square; + margin: 0; + padding-left: 20px; +} +ul.tsd-parameter-list > li.tsd-parameter-signature, +ul.tsd-type-parameter-list > li.tsd-parameter-signature { + list-style: none; + margin-left: -20px; +} +ul.tsd-parameter-list h5, +ul.tsd-type-parameter-list h5 { + font-size: 16px; + margin: 1em 0 0.5em 0; +} +.tsd-sources { + margin-top: 1rem; + font-size: 0.875em; +} +.tsd-sources a { + color: var(--color-text-aside); + text-decoration: underline; +} +.tsd-sources ul { + list-style: none; + padding: 0; +} + +.tsd-page-toolbar { + position: fixed; + z-index: 1; + top: 0; + left: 0; + width: 100%; + color: var(--color-text); + background: var(--color-background-secondary); + border-bottom: 1px var(--color-accent) solid; + transition: transform 0.3s ease-in-out; +} +.tsd-page-toolbar a { + color: var(--color-text); + text-decoration: none; +} +.tsd-page-toolbar a.title { + font-weight: bold; +} +.tsd-page-toolbar a.title:hover { + text-decoration: underline; +} +.tsd-page-toolbar .tsd-toolbar-contents { + display: flex; + justify-content: space-between; + height: 2.5rem; + margin: 0 auto; +} +.tsd-page-toolbar .table-cell { + position: relative; + white-space: nowrap; + line-height: 40px; +} +.tsd-page-toolbar .table-cell:first-child { + width: 100%; +} +.tsd-page-toolbar .tsd-toolbar-icon { + box-sizing: border-box; + line-height: 0; + padding: 12px 0; +} + +.tsd-page-toolbar--hide { + transform: translateY(-100%); +} + +.tsd-widget { + display: inline-block; + overflow: hidden; + opacity: 0.8; + height: 40px; + transition: opacity 0.1s, background-color 0.2s; + vertical-align: bottom; + cursor: pointer; +} +.tsd-widget:hover { + opacity: 0.9; +} +.tsd-widget.active { + opacity: 1; + background-color: var(--color-accent); +} +.tsd-widget.no-caption { + width: 40px; +} +.tsd-widget.no-caption:before { + margin: 0; +} + +.tsd-widget.options, +.tsd-widget.menu { + display: none; +} +@media (max-width: 1024px) { + .tsd-widget.options, + .tsd-widget.menu { + display: inline-block; + } +} +input[type="checkbox"] + .tsd-widget:before { + background-position: -120px 0; +} +input[type="checkbox"]:checked + .tsd-widget:before { + background-position: -160px 0; +} + +img { + max-width: 100%; +} + +.tsd-anchor-icon { + display: inline-flex; + align-items: center; + margin-left: 0.5rem; + vertical-align: middle; + color: var(--color-text); +} + +.tsd-anchor-icon svg { + width: 1em; + height: 1em; + visibility: hidden; +} + +.tsd-anchor-link:hover > .tsd-anchor-icon svg { + visibility: visible; +} + +.deprecated { + text-decoration: line-through; +} + +* { + scrollbar-width: thin; + scrollbar-color: var(--color-accent) var(--color-icon-background); +} + +*::-webkit-scrollbar { + width: 0.75rem; +} + +*::-webkit-scrollbar-track { + background: var(--color-icon-background); +} + +*::-webkit-scrollbar-thumb { + background-color: var(--color-accent); + border-radius: 999rem; + border: 0.25rem solid var(--color-icon-background); +} diff --git a/typedoc/classes/Env.html b/typedoc/classes/Env.html new file mode 100644 index 00000000..1db0171c --- /dev/null +++ b/typedoc/classes/Env.html @@ -0,0 +1,341 @@ +Env | @vladmandic/human - v3.0.0
+
+ +
+
+
+ +
+

Env class that holds detected capabilities

+
+
+

Hierarchy

+
    +
  • Env
+
+
+
+ +
+
+

Constructors

+
+ +
+
+

Properties

+
+ +
Canvas: undefined
+

MonkeyPatch for Canvas

+
+
+ +
Image: undefined
+

MonkeyPatch for Image

+
+
+ +
ImageData: undefined
+

MonkeyPatch for ImageData

+
+
+ +
agent: string = ''
+

Detected agent

+
+
+ +
backends: string[] = []
+

List of supported backends

+
+
+ +
browser: boolean
+

Running in Browser

+
+
+ +
cpu: {
    flags: string[];
    model: undefined | string;
} = ...
+

CPU info

+
+
+

Type declaration

+
    +
  • +
    flags: string[]
  • +
  • +
    model: undefined | string
+
+ +
filter: undefined | boolean
+

Are image filters supported?

+
+
+ +
initial: boolean
+

Has any work been performed so far

+
+
+ +
kernels: string[] = []
+

List of supported kernels for current backend

+
+
+ +
node: boolean
+

Running in NodeJS

+
+
+ +
offscreen: undefined | boolean
+

Is offscreenCanvas supported?

+
+
+ +
perfadd: boolean = false
+

Are performance counter instant values or additive

+
+
+ +
platform: string = ''
+

Detected platform

+
+
+ +
tensorflow: {
    gpu: undefined | boolean;
    version: undefined | string;
} = ...
+

If using tfjs-node get version of underlying tensorflow shared library and if gpu acceleration is enabled

+
+
+

Type declaration

+
    +
  • +
    gpu: undefined | boolean
  • +
  • +
    version: undefined | string
+
+ +
tfjs: {
    version: undefined | string;
}
+

TFJS instance details

+
+
+

Type declaration

+
    +
  • +
    version: undefined | string
+
+ +
wasm: {
    backend: undefined | boolean;
    multithread: undefined | boolean;
    simd: undefined | boolean;
    supported: undefined | boolean;
} = ...
+

WASM detected capabilities

+
+
+

Type declaration

+
    +
  • +
    backend: undefined | boolean
  • +
  • +
    multithread: undefined | boolean
  • +
  • +
    simd: undefined | boolean
  • +
  • +
    supported: undefined | boolean
+
+ +
webgl: {
    backend: undefined | boolean;
    renderer: undefined | string;
    shader: undefined | string;
    supported: undefined | boolean;
    vendor: undefined | string;
    version: undefined | string;
} = ...
+

WebGL detected capabilities

+
+
+

Type declaration

+
    +
  • +
    backend: undefined | boolean
  • +
  • +
    renderer: undefined | string
  • +
  • +
    shader: undefined | string
  • +
  • +
    supported: undefined | boolean
  • +
  • +
    vendor: undefined | string
  • +
  • +
    version: undefined | string
+
+ +
webgpu: {
    adapter: undefined | GPUAdapterInfo;
    backend: undefined | boolean;
    supported: undefined | boolean;
} = ...
+

WebGPU detected capabilities

+
+
+

Type declaration

+
    +
  • +
    adapter: undefined | GPUAdapterInfo
  • +
  • +
    backend: undefined | boolean
  • +
  • +
    supported: undefined | boolean
+
+ +
worker: boolean
+

Running in WebWorker thread

+
+
+

Methods

+
+ +
    + +
  • +

    update backend information

    +
    +

    Returns Promise<void>

+
+ +
    + +
  • +

    update cpu information

    +
    +

    Returns void

+
+
\ No newline at end of file diff --git a/typedoc/classes/GraphModel.html b/typedoc/classes/GraphModel.html new file mode 100644 index 00000000..f47449fc --- /dev/null +++ b/typedoc/classes/GraphModel.html @@ -0,0 +1,438 @@ +GraphModel | @vladmandic/human - v3.0.0
+
+ +
+
+
+
+ +

Class GraphModel<ModelURL>

+
+

A tf.GraphModel is a directed, acyclic graph built from a +SavedModel GraphDef and allows inference execution.

+

A tf.GraphModel can only be created by loading from a model converted from +a TensorFlow SavedModel using +the command line converter tool and loaded via tf.loadGraphModel.

+ +

Doc

+
+

Type Parameters

+
    +
  • +

    ModelURL extends Url = string | io.IOHandler

+
+

Hierarchy

+
    +
  • GraphModel
+
+

Implements

+
    +
  • InferenceModel
+
+
+
+ +
+
+

Constructors

+
+ +
    + +
  • +
    +

    Type Parameters

    +
      +
    • +

      ModelURL extends Url = string | IOHandler

    +
    +

    Parameters

    +
      +
    • +
      modelUrl: ModelURL
      +

      url for the model, or an io.IOHandler.

      +
    • +
    • +
      Optional loadOptions: LoadOptions
    • +
    • +
      Optional tfio: __module
    +

    Returns GraphModel<ModelURL>

+
+

Accessors

+
+ +
    +
  • get inputNodes(): string[]
  • +
  • +

    Returns string[]

+
+ +
    +
  • get inputs(): TensorInfo[]
  • +
  • +

    Returns TensorInfo[]

+
+ +
    +
  • get metadata(): {}
  • +
  • +

    Returns {}

    +
    +
    + +
      +
    • get modelSignature(): {}
    • +
    • +

      Returns {}

      +
      +
      + +
        +
      • get modelStructuredOutputKeys(): {}
      • +
      • +

        Returns {}

        +
        +
        + +
          +
        • get modelVersion(): string
        • +
        • +

          Returns string

        +
        + +
          +
        • get outputNodes(): string[]
        • +
        • +

          Returns string[]

        +
        + +
          +
        • get outputs(): TensorInfo[]
        • +
        • +

          Returns TensorInfo[]

        +
        + +
          +
        • get weights(): NamedTensorsMap
        • +
        • +

          Returns NamedTensorsMap

        +
        +

        Methods

        +
        + +
          + +
        • +

          Releases the memory used by the weight tensors and resourceManager.

          + +

          Doc

          +

          Returns void

        +
        + +
          + +
        • +

          Dispose intermediate tensors for model debugging mode (flag +KEEP_INTERMEDIATE_TENSORS is true).

          + +

          Doc

          +

          Returns void

        +
        + +
          + +
        • +

          Executes inference for the model for given input tensors.

          + +

          Returns

          A single tensor if provided with a single output or no outputs +are provided and there is only one default output, otherwise return a +tensor array. The order of the tensor array is the same as the outputs +if provided, otherwise the order of outputNodes attribute of the model.

          + +

          Doc

          +
          +

          Parameters

          +
            +
          • +
            inputs: Tensor<Rank> | Tensor<Rank>[] | NamedTensorMap
            +

            tensor, tensor array or tensor map of the inputs for the +model, keyed by the input node names.

            +
          • +
          • +
            Optional outputs: string | string[]
            +

            output node name from the TensorFlow model, if no +outputs are specified, the default outputs of the model would be used. +You can inspect intermediate nodes of the model by adding them to the +outputs array.

            +
          +

          Returns Tensor<Rank> | Tensor<Rank>[]

        +
        + +
          + +
        • +

          Executes inference for the model for given input tensors in async +fashion, use this method when your model contains control flow ops.

          + +

          Returns

          A Promise of single tensor if provided with a single output or +no outputs are provided and there is only one default output, otherwise +return a tensor map.

          + +

          Doc

          +
          +

          Parameters

          +
            +
          • +
            inputs: Tensor<Rank> | Tensor<Rank>[] | NamedTensorMap
            +

            tensor, tensor array or tensor map of the inputs for the +model, keyed by the input node names.

            +
          • +
          • +
            Optional outputs: string | string[]
            +

            output node name from the TensorFlow model, if no outputs +are specified, the default outputs of the model would be used. You can +inspect intermediate nodes of the model by adding them to the outputs +array.

            +
          +

          Returns Promise<Tensor<Rank> | Tensor<Rank>[]>

        +
        + +
          + +
        • +

          Get intermediate tensors for model debugging mode (flag +KEEP_INTERMEDIATE_TENSORS is true).

          + +

          Doc

          +

          Returns NamedTensorsMap

        +
        + +
          + +
        • +

          Loads the model and weight files, construct the in memory weight map and +compile the inference graph.

          +
          +

          Returns UrlIOHandler<ModelURL> extends IOHandlerSync ? boolean : Promise<boolean>

        +
        + +
          + +
        • +

          Synchronously construct the in memory weight map and +compile the inference graph.

          + +

          Doc

          +
          +

          Parameters

          +
            +
          • +
            artifacts: ModelArtifacts
          +

          Returns boolean

        +
        + +
          + +
        • +

          Execute the inference for the input tensors.

          + +

          See

          inputNodes

          +

          You can also feed any intermediate nodes using the NamedTensorMap as the +input type. For example, given the graph + InputNode => Intermediate => OutputNode, +you can execute the subgraph Intermediate => OutputNode by calling + model.execute('IntermediateNode' : tf.tensor(...));

          +

          This is useful for models that uses tf.dynamic_rnn, where the intermediate +state needs to be fed manually.

          +

          For batch inference execution, the tensors for each input need to be +concatenated together. For example with mobilenet, the required input shape +is [1, 244, 244, 3], which represents the [batch, height, width, channel]. +If we are provide a batched data of 100 images, the input tensor should be +in the shape of [100, 244, 244, 3].

          + +

          Returns

          Inference result tensors. If the model is converted and it +originally had structured_outputs in tensorflow, then a NamedTensorMap +will be returned matching the structured_outputs. If no structured_outputs +are present, the output will be single tf.Tensor if the model has single +output node, otherwise Tensor[].

          + +

          Doc

          +
          +

          Parameters

          +
            +
          • +
            inputs: Tensor<Rank> | Tensor<Rank>[] | NamedTensorMap
          • +
          • +
            Optional config: ModelPredictConfig
            +

            Prediction configuration for specifying the batch size. +Currently the batch size option is ignored for graph model.

            +
          +

          Returns Tensor<Rank> | Tensor<Rank>[] | NamedTensorMap

        +
        + +
          + +
        • +

          Save the configuration and/or weights of the GraphModel.

          +

          An IOHandler is an object that has a save method of the proper +signature defined. The save method manages the storing or +transmission of serialized data ("artifacts") that represent the +model's topology and weights onto or via a specific medium, such as +file downloads, local storage, IndexedDB in the web browser and HTTP +requests to a server. TensorFlow.js provides IOHandler +implementations for a number of frequently used saving mediums, such as +tf.io.browserDownloads and tf.io.browserLocalStorage. See tf.io +for more details.

          +

          This method also allows you to refer to certain types of IOHandlers +as URL-like string shortcuts, such as 'localstorage://' and +'indexeddb://'.

          +

          Example 1: Save model's topology and weights to browser local +storage; +then load it back.

          +
          const modelUrl =
          'https://storage.googleapis.com/tfjs-models/savedmodel/mobilenet_v2_1.0_224/model.json';
          const model = await tf.loadGraphModel(modelUrl);
          const zeros = tf.zeros([1, 224, 224, 3]);
          model.predict(zeros).print();

          const saveResults = await model.save('localstorage://my-model-1');

          const loadedModel = await tf.loadGraphModel('localstorage://my-model-1');
          console.log('Prediction from loaded model:');
          model.predict(zeros).print(); +
          + +

          Returns

          A Promise of SaveResult, which summarizes the result of +the saving, such as byte sizes of the saved artifacts for the model's + topology and weight values.

          + +

          Doc

          +
          +

          Parameters

          +
            +
          • +
            handlerOrURL: string | IOHandler
            +

            An instance of IOHandler or a URL-like, +scheme-based string shortcut for IOHandler.

            +
          • +
          • +
            Optional config: SaveConfig
            +

            Options for saving the model.

            +
          +

          Returns Promise<SaveResult>

        +
        +
        \ No newline at end of file diff --git a/typedoc/classes/Human.html b/typedoc/classes/Human.html new file mode 100644 index 00000000..fb606b86 --- /dev/null +++ b/typedoc/classes/Human.html @@ -0,0 +1,602 @@ +Human | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        + +
        +

        Human* library main class

        +

        All methods and properties are available only as members of Human class

        +
          +
        • Configuration object definition: Config
        • +
        • Results object definition: Result
        • +
        • Possible inputs: Input
        • +
        + +

        Param

        Config

        + +

        Returns

        instance of Human

        +
        +
        +

        Hierarchy

        +
          +
        • Human
        +
        +
        +
        + +
        +
        +

        Constructors

        +
        + +
          + +
        • +

          Constructor for Human library that is futher used for all operations

          +
          +
          +

          Parameters

          +
            +
          • +
            Optional userConfig: Partial<Config>
            +

            user configuration object Config

            +
          +

          Returns Human

        +
        +

        Properties

        +
        + +
        config: Config
        +

        Current configuration

        + +
        +
        + +
        draw: draw = draw
        +

        Draw helper classes that can draw detected objects on canvas using specified draw

        +
          +
        • canvas: draws input to canvas
        • +
        • options: are global settings for all draw operations, can be overriden for each draw method DrawOptions
        • +
        • face, body, hand, gesture, object, person: draws detected results as overlays on canvas
        • +
        +
        +
        + +
        env: Env = env
        +

        Object containing environment information used for diagnostics

        +
        +
        + +
        events: undefined | EventTarget
        +

        Container for events dispatched by Human +Possible events:

        +
          +
        • create: triggered when Human object is instantiated
        • +
        • load: triggered when models are loaded (explicitly or on-demand)
        • +
        • image: triggered when input image is processed
        • +
        • result: triggered when detection is complete
        • +
        • warmup: triggered when warmup is complete
        • +
        • error: triggered on some errors
        • +
        +
        +
        + +
        faceTriangulation: number[]
        +

        Reference face triangualtion array of 468 points, used for triangle references between points

        +
        +
        + +
        faceUVMap: [number, number][]
        +

        Refernce UV map of 468 values, used for 3D mapping of the face mesh

        +
        +
        + +
        match: match = match
        +

        Face Matching

        +
          +
        • similarity: compare two face descriptors and return similarity index
        • +
        • distance: compare two face descriptors and return raw calculated differences
        • +
        • find: compare face descriptor to array of face descriptors and return best match
        • +
        +
        +
        + +
        performance: Record<string, number>
        +

        Performance object that contains values for all recently performed operations

        +
        +
        + +
        process: {
            canvas: null | AnyCanvas;
            tensor: null | Tensor<Rank>;
        }
        +

        currenty processed image tensor and canvas

        +
        +
        +

        Type declaration

        +
        +
        + +
        result: Result
        +

        Last known result of detect run

        +
          +
        • Can be accessed anytime after initial detection
        • +
        +
        +
        + +
        state: string
        +

        Current state of Human library

        +
          +
        • Can be polled to determine operations that are currently executed
        • +
        • Progresses through: 'config', 'check', 'backend', 'load', 'run:', 'idle'
        • +
        +
        +
        + +
        tf: any
        +

        Instance of TensorFlow/JS used by Human

        +
          +
        • Can be embedded or externally provided +TFJS API
        • +
        +
        +
        + +
        version: string
        +

        Current version of Human library in semver format

        +
        +
        + +
        webcam: WebCam = ...
        +

        WebCam helper methods

        +
        +
        +

        Methods

        +
        + +
          + +
        • +

          internal function to measure tensor leaks

          +
          +
          +

          Parameters

          +
            +
          • +
            Rest ...msg: string[]
          +

          Returns void

        +
        + +
          + +
        • +

          Compare two input tensors for pixel similarity

          +
            +
          • use human.image to process any valid input and get a tensor that can be used for compare
          • +
          • when passing manually generated tensors:
          • +
          • both input tensors must be in format [1, height, width, 3]
          • +
          • if resolution of tensors does not match, second tensor will be resized to match resolution of the first tensor
          • +
          • return value is pixel similarity score normalized by input resolution and rgb channels
          • +
          +
          +
          +

          Parameters

          +
          +

          Returns Promise<number>

        +
        + +
        +
        + +
          + +
        • +

          emit event

          +
          +
          +

          Parameters

          +
            +
          • +
            event: string
          +

          Returns void

        +
        + +
          + +
        • +

          Process input as return canvas and tensor

          +
          +
          +

          Parameters

          +
            +
          • +
            input: Input
            +

            any input Input

            +
          • +
          • +
            getTensor: boolean = false
            +

            should image processing also return tensor or just canvas +Returns object with tensor and canvas

            +
          +

          Returns Promise<{
              canvas: null | AnyCanvas;
              tensor: null | Tensor4D;
          }>

        +
        + +
          + +
        • +

          Explicit backend initialization

          +
            +
          • Normally done implicitly during initial load phase
          • +
          • Call to explictly register and initialize TFJS backend without any other operations
          • +
          • Use when changing backend during runtime
          • +
          +
          +

          Returns Promise<void>

        +
        + +
          + +
        • +

          Load method preloads all configured models on-demand

          +
            +
          • Not explicitly required as any required model is load implicitly on it's first run
          • +
          +
          +
          +

          Parameters

          +
          +

          Returns Promise<void>

        +
        + +
          + +
        • +

          Runs interpolation using last known result and returns smoothened result +Interpolation is based on time since last known result so can be called independently

          + +

          Returns

          result - Result

          +
          +
          +

          Parameters

          +
            +
          • +
            result: Result = ...
            +

            Result optional use specific result set to run interpolation on

            +
          +

          Returns Result

        +
        + +
          + +
        • +

          Utility wrapper for performance.now()

          +
          +

          Returns number

        +
        + +
          + +
        • +

          Run detect with tensorflow profiling

          +
            +
          • result object will contain total exeuction time information for top-20 kernels
          • +
          • actual detection object can be accessed via human.result
          • +
          +
          +
          +

          Parameters

          +
            +
          • +
            input: Input
          • +
          • +
            Optional userConfig: Partial<Config>
          +

          Returns Promise<{
              kernel: string;
              perc: number;
              time: number;
          }[]>

        +
        + +
          + +
        • +

          Reset configuration to default values

          +
          +

          Returns void

        +
        + +
          + +
        • +

          Segmentation method takes any input and returns RGBA tensor +Note: Segmentation is not triggered as part of detect process

          +
          +
          +

          Parameters

          +
            +
          • +
            input: Input
            +

            Input +Returns tensor which contains image data in RGBA format

            +
          • +
          • +
            Optional userConfig: Partial<Config>
          +

          Returns Promise<null | Tensor<Rank>>

        +
        + +
          + +
        • +

          Helper function

          +
          +
          +

          Parameters

          +
            +
          • +
            ms: number
            +

            sleep time in miliseconds

            +
          +

          Returns Promise<void>

        +
        + +
          + +
        • +

          Validate current configuration schema

          +
          +
          +

          Parameters

          +
            +
          • +
            Optional userConfig: Partial<Config>
          +

          Returns {
              expected?: string;
              reason: string;
              where: string;
          }[]

        +
        + +
          + +
        • +

          Continously detect video frames

          +
          +
          +

          Parameters

          +
            +
          • +
            element: HTMLVideoElement
            +

            HTMLVideoElement input

            +
          • +
          • +
            run: boolean = true
            +

            boolean run continously or stop if already running, default true

            +
          • +
          • +
            delay: number = 0
            +

            number delay detection between frames for number of miliseconds, default 0

            +
          +

          Returns Promise<void>

        +
        + +
          + +
        • +

          Warmup method pre-initializes all configured models for faster inference

          +
            +
          • can take significant time on startup
          • +
          • only used for webgl and humangl backends
          • +
          + +

          Returns

          result - Result

          +
          +
          +

          Parameters

          +
          +

          Returns Promise<undefined | Result>

        +
        +
        \ No newline at end of file diff --git a/typedoc/classes/Tensor-1.html b/typedoc/classes/Tensor-1.html new file mode 100644 index 00000000..8647a704 --- /dev/null +++ b/typedoc/classes/Tensor-1.html @@ -0,0 +1,3547 @@ +Tensor | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Class Tensor<R>

        +
        +

        A tf.Tensor object represents an immutable, multidimensional array of +numbers that has a shape and a data type.

        +

        For performance reasons, functions that create tensors do not necessarily +perform a copy of the data passed to them (e.g. if the data is passed as a +Float32Array), and changes to the data will change the tensor. This is not +a feature and is not supported. To avoid this behavior, use the tensor before +changing the input data or create a copy with copy = tf.add(yourTensor, 0).

        +

        See tf.tensor for details on how to create a tf.Tensor.

        + +

        Doc

        +
        +

        Type Parameters

        +
        +
        +

        Hierarchy

        +
          +
        • Tensor
        +
        +
        +
        + +
        +
        +

        Constructors

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            shape: ShapeMap[R]
          • +
          • +
            dtype: keyof DataTypeMap
          • +
          • +
            dataId: object
          • +
          • +
            id: number
          +

          Returns Tensor<R>

        +
        +

        Properties

        +
        + +
        dataId: object
        +

        Id of the bucket holding the data for this tensor. Multiple arrays can +point to the same bucket (e.g. when calling array.reshape()).

        +
        +
        + +
        dtype: keyof DataTypeMap
        +

        The data type for the array.

        +
        +
        + +
        id: number
        +

        Unique id of this tensor.

        +
        +
        + +
        kept: boolean
        +

        Whether this tensor has been globally kept.

        +
        +
        + +
        rankType: R
        +

        The rank type for the array (see Rank enum).

        +
        +
        + +
        scopeId: number
        +

        The id of the scope this tensor is being tracked in.

        +
        +
        + +
        shape: ShapeMap[R]
        +

        The shape of the tensor.

        +
        +
        + +
        size: number
        +

        Number of elements in the tensor.

        +
        +
        + +
        strides: number[]
        +

        Number of elements to skip in each dimension when indexing. See +https://docs.scipy.org/doc/numpy/reference/generated/\ +numpy.ndarray.strides.html

        +
        +
        +

        Accessors

        +
        + +
          +
        • get isDisposed(): boolean
        • +
        • +

          Returns boolean

        +
        + +
          +
        • get rank(): number
        • +
        • +

          Returns number

        +
        +

        Methods

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          • +
          • +
            Optional axis: number | number[]
          • +
          • +
            Optional keepDims: boolean
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          • +
          • +
            Optional axis: number | number[]
          • +
          • +
            Optional keepDims: boolean
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            Optional axis: number
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            Optional axis: number
          +

          Returns T

        +
        + +
          + +
        • +

          Returns the tensor data as a nested array. The transfer of data is done +asynchronously.

          + +

          Doc

          +

          Returns Promise<ArrayMap[R]>

        +
        + +
          + +
        • +

          Returns the tensor data as a nested array. The transfer of data is done +synchronously.

          + +

          Doc

          +

          Returns ArrayMap[R]

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +

          Returns Tensor1D

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            rows: number
          • +
          • +
            columns: number
          +

          Returns Tensor2D

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            rows: number
          • +
          • +
            columns: number
          • +
          • +
            depth: number
          +

          Returns Tensor3D

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            rows: number
          • +
          • +
            columns: number
          • +
          • +
            depth: number
          • +
          • +
            depth2: number
          +

          Returns Tensor4D

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            rows: number
          • +
          • +
            columns: number
          • +
          • +
            depth: number
          • +
          • +
            depth2: number
          • +
          • +
            depth3: number
          +

          Returns Tensor5D

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +

          Returns Scalar

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          • +
          • +
            dtype: keyof DataTypeMap
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            filterSize: number | [number, number]
          • +
          • +
            strides: number | [number, number]
          • +
          • +
            pad: number | "valid" | "same" | ExplicitPadding
          • +
          • +
            Optional dimRoundingMode: "round" | "floor" | "ceil"
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            mean: Tensor<R> | TensorLike | Tensor1D
          • +
          • +
            variance: Tensor<R> | TensorLike | Tensor1D
          • +
          • +
            Optional offset: Tensor<R> | TensorLike | Tensor1D
          • +
          • +
            Optional scale: Tensor<R> | TensorLike | Tensor1D
          • +
          • +
            Optional varianceEpsilon: number
          +

          Returns Tensor<R>

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            blockShape: number[]
          • +
          • +
            crops: number[][]
          +

          Returns Tensor<R>

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            shape: ShapeMap[R]
          +

          Returns Tensor<R>

        +
        + +
          + +
        • +

          Returns a promise of tf.TensorBuffer that holds the underlying data.

          + +

          Doc

          +
          +

          Type Parameters

          +
            +
          • +

            D extends keyof DataTypeMap = "float32"

          +

          Returns Promise<TensorBuffer<R, D>>

        +
        + +
          + +
        • +

          Returns a tf.TensorBuffer that holds the underlying data.

          + +

          Doc

          +
          +

          Type Parameters

          +
            +
          • +

            D extends keyof DataTypeMap = "float32"

          +

          Returns TensorBuffer<R, D>

        +
        + +
          + +
        • +

          Returns the underlying bytes of the tensor's data.

          +
          +

          Returns Promise<Uint8Array | Uint8Array[]>

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            dtype: keyof DataTypeMap
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            min: number
          • +
          • +
            max: number
          +

          Returns Tensor<Rank>

        +
        + +
          + +
        • +

          Returns a copy of the tensor. See tf.clone for details.

          + +

          Doc

          +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            tensors: T | (TensorLike | T)[]
          • +
          • +
            Optional axis: number
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
            +
          • +

            T extends Tensor3D | Tensor2D

          +
          +

          Parameters

          +
            +
          • +
            filter: Tensor3D | TensorLike3D
          • +
          • +
            stride: number
          • +
          • +
            pad: number | "valid" | "same" | ExplicitPadding
          • +
          • +
            Optional dataFormat: "NWC" | "NCW"
          • +
          • +
            Optional dilation: number
          • +
          • +
            Optional dimRoundingMode: "round" | "floor" | "ceil"
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            filter: Tensor4D | TensorLike4D
          • +
          • +
            strides: number | [number, number]
          • +
          • +
            pad: number | "valid" | "same"
          • +
          • +
            Optional dataFormat: "NHWC" | "NCHW"
          • +
          • +
            Optional dilations: number | [number, number]
          • +
          • +
            Optional dimRoundingMode: "round" | "floor" | "ceil"
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            filter: Tensor4D | TensorLike4D
          • +
          • +
            outputShape: [number, number, number] | [number, number, number, number]
          • +
          • +
            strides: number | [number, number]
          • +
          • +
            pad: number | "valid" | "same"
          • +
          • +
            Optional dimRoundingMode: "round" | "floor" | "ceil"
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            Optional axis: number
          • +
          • +
            Optional exclusive: boolean
          • +
          • +
            Optional reverse: boolean
          +

          Returns Tensor<R>

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            Optional axis: number
          • +
          • +
            Optional exclusive: boolean
          • +
          • +
            Optional reverse: boolean
          +

          Returns Tensor<R>

        +
        + +
          + +
        • +

          Asynchronously downloads the values from the tf.Tensor. Returns a +promise of TypedArray that resolves when the computation has finished.

          + +

          Doc

          +
          +

          Type Parameters

          +
            +
          • +

            D extends keyof DataTypeMap = NumericDataType

          +

          Returns Promise<DataTypeMap[D]>

        +
        + +
          + +
        • +

          Synchronously downloads the values from the tf.Tensor. This blocks the +UI thread until the values are ready, which can cause performance issues.

          + +

          Doc

          +
          +

          Type Parameters

          +
            +
          • +

            D extends keyof DataTypeMap = NumericDataType

          +

          Returns DataTypeMap[D]

        +
        + +
          + +
        • +

          Copy the tensor's data to a new GPU resource. Comparing to the dataSync() +and data(), this method prevents data from being downloaded to CPU.

          +

          For WebGL backend, the data will be stored on a densely packed texture. +This means that the texture will use the RGBA channels to store value.

          +

          For WebGPU backend, the data will be stored on a buffer. There is no +parameter, so can not use a user-defined size to create the buffer.

          + +

          Returns

          For WebGL backend, a GPUData contains the new texture and + its information. + { + tensorRef: The tensor that is associated with this texture, + texture: WebGLTexture, + texShape: [number, number] // [height, width] + }

          +
          For WebGPU backend, a GPUData contains the new buffer and
          its information.
          {
          tensorRef: The tensor that is associated with this buffer,
          buffer: GPUBuffer,
          bufSize: number
          }

          Remember to dispose the GPUData after it is used by
          `res.tensorRef.dispose()`. +
          + +

          Doc

          +
          +

          Parameters

          +
            +
          • +
            Optional options: DataToGPUWebGLOption
          +

          Returns GPUData

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            blockSize: number
          • +
          • +
            dataFormat: "NHWC" | "NCHW"
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            filter: Tensor4D | TensorLike4D
          • +
          • +
            strides: number | [number, number]
          • +
          • +
            pad: number | "valid" | "same"
          • +
          • +
            Optional dataFormat: "NHWC" | "NCHW"
          • +
          • +
            Optional dilations: number | [number, number]
          • +
          • +
            Optional dimRoundingMode: "round" | "floor" | "ceil"
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            filter: Tensor3D | TensorLike3D
          • +
          • +
            strides: number | [number, number]
          • +
          • +
            pad: "valid" | "same"
          • +
          • +
            Optional dilations: number | [number, number]
          • +
          • +
            Optional dataFormat: "NHWC"
          +

          Returns T

        +
        + +
          + +
        • +

          Disposes tf.Tensor from memory.

          + +

          Doc

          +

          Returns void

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
          +

          Returns Tensor<Rank>

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          • +
          • +
            Optional axis: number | number[]
          • +
          • +
            Optional keepDims: boolean
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            Optional axis: number
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
          +

          Returns Tensor<Rank>

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +

          Returns Tensor1D

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          • +
          • +
            indices: Tensor<Rank> | TensorLike
          • +
          • +
            Optional axis: number
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
          +

          Returns Tensor<Rank>

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
          +

          Returns Tensor<Rank>

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            alpha: number
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            Optional depthRadius: number
          • +
          • +
            Optional bias: number
          • +
          • +
            Optional alpha: number
          • +
          • +
            Optional beta: number
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          • +
          • +
            Optional axis: number
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          • +
          • +
            Optional axis: number | number[]
          • +
          • +
            Optional keepDims: boolean
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            b: Tensor<Rank> | TensorLike
          • +
          • +
            Optional transposeA: boolean
          • +
          • +
            Optional transposeB: boolean
          +

          Returns Tensor<Rank>

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            Optional axis: number | number[]
          • +
          • +
            Optional keepDims: boolean
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            filterSize: number | [number, number]
          • +
          • +
            strides: number | [number, number]
          • +
          • +
            pad: number | "valid" | "same" | ExplicitPadding
          • +
          • +
            Optional dimRoundingMode: "round" | "floor" | "ceil"
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            Optional axis: number | number[]
          • +
          • +
            Optional keepDims: boolean
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            Optional axis: number | number[]
          • +
          • +
            Optional keepDims: boolean
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            paddings: [number, number][]
          • +
          • +
            mode: "reflect" | "symmetric"
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            Optional ord: number | "euclidean" | "fro"
          • +
          • +
            Optional axis: number | number[]
          • +
          • +
            Optional keepDims: boolean
          +

          Returns Tensor<Rank>

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Parameters

          +
            +
          • +
            depth: number
          • +
          • +
            onValue: number
          • +
          • +
            offValue: number
          +

          Returns Tensor<Rank>

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            paddings: [number, number][]
          • +
          • +
            Optional constantValue: number
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            windowShape: number | [number, number]
          • +
          • +
            poolingType: "avg" | "max"
          • +
          • +
            padding: number | "valid" | "same" | ExplicitPadding
          • +
          • +
            Optional diationRate: number | [number, number]
          • +
          • +
            Optional strides: number | [number, number]
          • +
          • +
            Optional dimRoundingMode: "round" | "floor" | "ceil"
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            alpha: TensorLike | T
          +

          Returns T

        +
        + +
          + +
        • +

          Prints the tf.Tensor. See tf.print for details.

          + +

          Doc

          +
          +

          Parameters

          +
            +
          • +
            Optional verbose: boolean
            +

            Whether to print verbose information about the tensor, + including dtype and size.

            +
          +

          Returns void

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          • +
          • +
            Optional axis: number | number[]
          • +
          • +
            Optional keepDims: boolean
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            shape: number[]
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            x: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            newShape2D: [number, number]
          • +
          • +
            Optional alignCorners: boolean
          • +
          • +
            Optional halfPixelCenters: boolean
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            newShape2D: [number, number]
          • +
          • +
            Optional alignCorners: boolean
          • +
          • +
            Optional halfFloatCenters: boolean
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          • +
          • +
            Optional axis: number | number[]
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
          +

          Returns Tensor<Rank>

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            depthwiseFilter: Tensor4D | TensorLike4D
          • +
          • +
            pointwiseFilter: Tensor4D | TensorLike
          • +
          • +
            strides: number | [number, number]
          • +
          • +
            pad: "valid" | "same"
          • +
          • +
            Optional dilation: number | [number, number]
          • +
          • +
            Optional dataFormat: "NHWC" | "NCHW"
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          • +
          • +
            begin: number | number[]
          • +
          • +
            Optional size: number | number[]
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          • +
          • +
            Optional dim: number
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            blockShape: number[]
          • +
          • +
            paddings: number[][]
          +

          Returns Tensor<R>

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            numOrSizeSplits: number | number[]
          • +
          • +
            Optional axis: number
          +

          Returns T[]

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            Optional axis: number[]
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          • +
          • +
            Optional alpha: number
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: Tensor<Rank>
          • +
          • +
            begin: number[]
          • +
          • +
            end: number[]
          • +
          • +
            strides: number[]
          • +
          • +
            Optional beginMask: number
          • +
          • +
            Optional endMask: number
          • +
          • +
            Optional ellipsisMask: number
          • +
          • +
            Optional newAxisMask: number
          • +
          • +
            Optional shrinkAxisMask: number
          +

          Returns Tensor<Rank>

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            Optional axis: number | number[]
          • +
          • +
            Optional keepDims: boolean
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +

          Returns void

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            b: number[]
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        + +
          + +
        • +

          Returns a human-readable description of the tensor. Useful for logging.

          + +

          Doc

          +
          +

          Parameters

          +
            +
          • +
            Optional verbose: boolean
          +

          Returns string

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          • +
          • +
            Optional k: number
          • +
          • +
            Optional sorted: boolean
          +

          Returns {
              indices: T;
              values: T;
          }

          +
            +
          • +
            indices: T
          • +
          • +
            values: T
        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            Optional perm: number[]
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          • +
          • +
            Optional axis: number
          +

          Returns {
              indices: T;
              values: T;
          }

          +
            +
          • +
            indices: T
          • +
          • +
            values: T
        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          • +
          • +
            segmentIds: Tensor1D | TensorLike1D
          • +
          • +
            numSegments: number
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            Optional axis: number
          +

          Returns T[]

        +
        + +
          + +
        • +
          +

          Parameters

          +
            +
          • +
            Optional trainable: boolean
          • +
          • +
            Optional name: string
          • +
          • +
            Optional dtype: keyof DataTypeMap
          +

          Returns Variable<R>

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
          +

          Returns T

        +
        + +
          + +
        • +
          +

          Type Parameters

          +
          +
          +

          Parameters

          +
            +
          • +
            this: T
          +

          Returns T

        +
        +
        \ No newline at end of file diff --git a/typedoc/classes/WebCam.html b/typedoc/classes/WebCam.html new file mode 100644 index 00000000..fa084f3a --- /dev/null +++ b/typedoc/classes/WebCam.html @@ -0,0 +1,280 @@ +WebCam | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        + +
        +

        Hierarchy

        +
          +
        • WebCam
        +
        +
        +
        + +
        +
        +

        Constructors

        +
        +
        +

        Properties

        +
        +
        +

        Accessors

        +
        +
        +

        Methods

        +
        +
        +

        Constructors

        +
        + +
        +
        +

        Properties

        +
        + +
        config: WebCamConfig
        +

        current webcam configuration

        +
        +
        + +
        devices: MediaDeviceInfo[] = []
        +

        enumerated video devices

        +
        +
        + +
        element: undefined | HTMLVideoElement
        +

        instance of dom element associated with webcam stream

        +
        +
        + +
        stream: undefined | MediaStream
        +

        active webcam stream

        +
        +
        +

        Accessors

        +
        + +
          +
        • get capabilities(): undefined | MediaTrackCapabilities
        • +
        • +

          get webcam capabilities

          +
          +

          Returns undefined | MediaTrackCapabilities

        +
        + +
          +
        • get constraints(): undefined | MediaTrackConstraints
        • +
        • +

          get webcam constraints

          +
          +

          Returns undefined | MediaTrackConstraints

        +
        + +
        +
        + +
        +
        + +
        +
        + +
          +
        • get settings(): undefined | MediaTrackSettings
        • +
        • +

          get webcam settings

          +
          +

          Returns undefined | MediaTrackSettings

        +
        + +
          +
        • get track(): undefined | MediaStreamTrack
        • +
        • +

          get active webcam stream track

          +
          +

          Returns undefined | MediaStreamTrack

        +
        + +
        +
        +

        Methods

        +
        + +
          + +
        • +

          Returns Promise<MediaDeviceInfo[]>

        +
        + +
        +
        + +
          + +
        • +

          play webcam video method

          +
          +

          Returns Promise<void>

        +
        + +
          + +
        • +

          start method initializizes webcam stream and associates it with a dom video element

          +
          +
          +

          Parameters

          +
          +

          Returns Promise<void>

        +
        + +
          + +
        • +

          stop method stops active webcam stream track and disconnects webcam

          +
          +

          Returns void

        +
        +
        \ No newline at end of file diff --git a/typedoc/classes/models.Models.html b/typedoc/classes/models.Models.html new file mode 100644 index 00000000..0c0d7b96 --- /dev/null +++ b/typedoc/classes/models.Models.html @@ -0,0 +1,171 @@ +Models | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        + +
        +

        Models class used by Human

        +
          +
        • models: record of all GraphModels
        • +
        • list: returns list of configured models with their stats
        • +
        • loaded: returns array of loaded models
        • +
        • reset: unloads all models
        • +
        • validate: checks loaded models for valid kernel ops vs current backend
        • +
        • stats: live detailed model stats that can be checked during model load phase
        • +
        +
        +
        +

        Hierarchy

        +
          +
        • Models
        +
        +
        +
        + +
        +
        +

        Constructors

        +
        +
        +

        Properties

        +
        +
        +

        Methods

        +
        +
        +

        Constructors

        +
        + +
        +
        +

        Properties

        +
        + +
        instance: Human
        +
        + +
        models: Record<string, null | GraphModel<string | IOHandler>>
        +
        +

        Methods

        +
        + +
          + +
        • +

          Returns {
              loaded: boolean;
              name: string;
              size: number;
              url: any;
          }[]

        +
        + +
        +
        + +
        +
        + +
        +
        + +
        +
        + +
          + +
        • +

          Returns {
              missing: string[];
              name: string;
          }[]

        +
        +
        \ No newline at end of file diff --git a/typedoc/enums/Rank.html b/typedoc/enums/Rank.html new file mode 100644 index 00000000..68b0e843 --- /dev/null +++ b/typedoc/enums/Rank.html @@ -0,0 +1,105 @@ +Rank | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Enumeration Rank

        +
        +
        +
        + +
        +
        +

        Enumeration Members

        +
        R0 +R1 +R2 +R3 +R4 +R5 +R6 +
        +
        +

        Enumeration Members

        +
        + +
        R0: "R0"
        +
        + +
        R1: "R1"
        +
        + +
        R2: "R2"
        +
        + +
        R3: "R3"
        +
        + +
        R4: "R4"
        +
        + +
        R5: "R5"
        +
        + +
        R6: "R6"
        +
        +
        \ No newline at end of file diff --git a/typedoc/functions/draw.all.html b/typedoc/functions/draw.all.html new file mode 100644 index 00000000..cc48f9ff --- /dev/null +++ b/typedoc/functions/draw.all.html @@ -0,0 +1,71 @@ +all | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Function all

        +
        +
          + +
        • +

          meta-function that performs draw for: canvas, face, body, hand

          +
          +
          +

          Parameters

          +
          +

          Returns Promise<null | [void, void, void, void, void]>

        +
        +
        \ No newline at end of file diff --git a/typedoc/functions/draw.body.html b/typedoc/functions/draw.body.html new file mode 100644 index 00000000..5d0976c4 --- /dev/null +++ b/typedoc/functions/draw.body.html @@ -0,0 +1,71 @@ +body | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Function body

        +
        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/functions/draw.canvas.html b/typedoc/functions/draw.canvas.html new file mode 100644 index 00000000..3e0197fa --- /dev/null +++ b/typedoc/functions/draw.canvas.html @@ -0,0 +1,69 @@ +canvas | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Function canvas

        +
        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/functions/draw.face.html b/typedoc/functions/draw.face.html new file mode 100644 index 00000000..472a19a4 --- /dev/null +++ b/typedoc/functions/draw.face.html @@ -0,0 +1,71 @@ +face | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Function face

        +
        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/functions/draw.gesture.html b/typedoc/functions/draw.gesture.html new file mode 100644 index 00000000..57022e37 --- /dev/null +++ b/typedoc/functions/draw.gesture.html @@ -0,0 +1,71 @@ +gesture | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Function gesture

        +
        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/functions/draw.hand.html b/typedoc/functions/draw.hand.html new file mode 100644 index 00000000..ab4b8e54 --- /dev/null +++ b/typedoc/functions/draw.hand.html @@ -0,0 +1,71 @@ +hand | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Function hand

        +
        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/functions/draw.init.html b/typedoc/functions/draw.init.html new file mode 100644 index 00000000..02560026 --- /dev/null +++ b/typedoc/functions/draw.init.html @@ -0,0 +1,62 @@ +init | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Function init

        +
        +
          + +
        • +

          sets default label templates for face/body/hand/object/gestures

          +
          +

          Returns void

        +
        +
        \ No newline at end of file diff --git a/typedoc/functions/draw.object.html b/typedoc/functions/draw.object.html new file mode 100644 index 00000000..6be4d557 --- /dev/null +++ b/typedoc/functions/draw.object.html @@ -0,0 +1,71 @@ +object | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Function object

        +
        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/functions/draw.person.html b/typedoc/functions/draw.person.html new file mode 100644 index 00000000..811ff68b --- /dev/null +++ b/typedoc/functions/draw.person.html @@ -0,0 +1,71 @@ +person | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Function person

        +
        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/functions/empty.html b/typedoc/functions/empty.html new file mode 100644 index 00000000..4938ccce --- /dev/null +++ b/typedoc/functions/empty.html @@ -0,0 +1,127 @@ +empty | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/functions/match.distance.html b/typedoc/functions/match.distance.html new file mode 100644 index 00000000..43c9dc95 --- /dev/null +++ b/typedoc/functions/match.distance.html @@ -0,0 +1,74 @@ +distance | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Function distance

        +
        +
          + +
        • +

          Calculates distance between two descriptors

          +
          +
          +

          Parameters

          +
            +
          • +
            descriptor1: Descriptor
          • +
          • +
            descriptor2: Descriptor
          • +
          • +
            options: MatchOptions = ...
            +

            calculation options

            +
              +
            • order - algorithm to use +Euclidean distance if order is 2 (default), Minkowski distance algorithm of nth order if order is higher than 2
            • +
            • multiplier - by how much to enhance difference analysis in range of 1..100 +default is 20 which normalizes results to similarity above 0.5 can be considered a match
            • +
            +
          +

          Returns number

        +
        +
        \ No newline at end of file diff --git a/typedoc/functions/match.find.html b/typedoc/functions/match.find.html new file mode 100644 index 00000000..d023a48b --- /dev/null +++ b/typedoc/functions/match.find.html @@ -0,0 +1,85 @@ +find | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        + +
        +
          + +
        • +

          Matches given descriptor to a closest entry in array of descriptors

          +
          +
          +

          Parameters

          +
            +
          • +
            descriptor: Descriptor
            +

            face descriptor

            +
          • +
          • +
            descriptors: Descriptor[]
            +

            array of face descriptors to commpare given descriptor to

            +
          • +
          • +
            options: MatchOptions = ...
            +

            see similarity method for options description +Returns

            +
              +
            • index index array index where best match was found or -1 if no matches
            • +
            • distance calculated distance of given descriptor to the best match
            • +
            • similarity calculated normalized similarity of given descriptor to the best match
            • +
            +
          +

          Returns {
              distance: number;
              index: number;
              similarity: number;
          }

          +
            +
          • +
            distance: number
          • +
          • +
            index: number
          • +
          • +
            similarity: number
        +
        +
        \ No newline at end of file diff --git a/typedoc/functions/match.similarity.html b/typedoc/functions/match.similarity.html new file mode 100644 index 00000000..6729d7f2 --- /dev/null +++ b/typedoc/functions/match.similarity.html @@ -0,0 +1,78 @@ +similarity | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Function similarity

        +
        +
          + +
        • +

          Calculates normalized similarity between two face descriptors based on their distance

          +
          +
          +

          Parameters

          +
            +
          • +
            descriptor1: Descriptor
          • +
          • +
            descriptor2: Descriptor
          • +
          • +
            options: MatchOptions = ...
            +

            calculation options

            +
              +
            • order - algorithm to use +Euclidean distance if order is 2 (default), Minkowski distance algorithm of nth order if order is higher than 2
            • +
            • multiplier - by how much to enhance difference analysis in range of 1..100 +default is 20 which normalizes results to similarity above 0.5 can be considered a match
            • +
            • min - normalize similarity result to a given range
            • +
            • max - normalzie similarity resutl to a given range +default is 0.2...0.8 +Returns similarity between two face descriptors normalized to 0..1 range where 0 is no similarity and 1 is perfect similarity
            • +
            +
          +

          Returns number

        +
        +
        \ No newline at end of file diff --git a/typedoc/functions/models.validateModel.html b/typedoc/functions/models.validateModel.html new file mode 100644 index 00000000..c526f69b --- /dev/null +++ b/typedoc/functions/models.validateModel.html @@ -0,0 +1,63 @@ +validateModel | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Function validateModel

        +
        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/index.html b/typedoc/index.html new file mode 100644 index 00000000..6a53cec5 --- /dev/null +++ b/typedoc/index.html @@ -0,0 +1,222 @@ +@vladmandic/human - v3.0.0
        +
        + +
        +
        + +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/BodyConfig.html b/typedoc/interfaces/BodyConfig.html new file mode 100644 index 00000000..b1c9ce64 --- /dev/null +++ b/typedoc/interfaces/BodyConfig.html @@ -0,0 +1,125 @@ +BodyConfig | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface BodyConfig

        +
        +

        Configures all body detection specific options

        +
        +
        +

        Hierarchy

        +
        +
        +
        +
        + +
        +
        +

        Properties

        +
        + +
        enabled: boolean
        +

        is module enabled?

        +
        +
        + +
        maxDetected: number
        +

        maximum number of detected bodies

        +
        +
        + +
        minConfidence: number
        +

        minimum confidence for a detected body before results are discarded

        +
        +
        + +
        modelPath: string
        +

        path to model json file (relative to modelBasePath

        +
        +
        + +
        skipFrames: number
        +

        how many max frames to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        + +
        skipTime: number
        +

        how many max milliseconds to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/BodyKeypoint.html b/typedoc/interfaces/BodyKeypoint.html new file mode 100644 index 00000000..cc85a6b9 --- /dev/null +++ b/typedoc/interfaces/BodyKeypoint.html @@ -0,0 +1,108 @@ +BodyKeypoint | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface BodyKeypoint

        +
        +

        Body Result keypoints

        +
        +
        +

        Hierarchy

        +
          +
        • BodyKeypoint
        +
        +
        +
        + +
        +
        +

        Properties

        +
        +
        +

        Properties

        +
        + +
        distance?: Point
        +

        body part position relative to body center in meters

        +
        +
        + + +

        body part name

        +
        +
        + +
        position: Point
        +

        body part position

        +
        +
        + +
        positionRaw: Point
        +

        body part position normalized to 0..1

        +
        +
        + +
        score: number
        +

        body part detection score

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/BodyResult.html b/typedoc/interfaces/BodyResult.html new file mode 100644 index 00000000..d0e140f8 --- /dev/null +++ b/typedoc/interfaces/BodyResult.html @@ -0,0 +1,117 @@ +BodyResult | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface BodyResult

        +
        +

        Body results

        +
        +
        +

        Hierarchy

        +
          +
        • BodyResult
        +
        +
        +
        + +
        +
        +

        Properties

        +
        +
        +

        Properties

        +
        + +
        annotations: Record<BodyAnnotation, Point[][]>
        +

        detected body keypoints combined into annotated parts

        +
        +
        + +
        box: Box
        +

        detected body box

        +
        +
        + +
        boxRaw: Box
        +

        detected body box normalized to 0..1

        +
        +
        + +
        id: number
        +

        body id

        +
        +
        + +
        keypoints: BodyKeypoint[]
        +

        detected body keypoints

        +
        +
        + +
        score: number
        +

        body detection score

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/Config.html b/typedoc/interfaces/Config.html new file mode 100644 index 00000000..146402db --- /dev/null +++ b/typedoc/interfaces/Config.html @@ -0,0 +1,282 @@ +Config | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface Config

        +
        +

        Configuration interface definition for Human library +Contains all configurable parameters +Defaults: config

        +
        +
        +

        Hierarchy

        +
          +
        • Config
        +
        +
        +
        + +
        +
        +

        Properties

        +
        + +
        async: boolean
        +

        Perform model loading and inference concurrently or sequentially

        +

        default: true

        +
        +
        + +
        backend: BackendEnum
        +

        Backend used for TFJS operations +valid build-in backends are:

        +
          +
        • Browser: cpu, wasm, webgl, humangl, webgpu
        • +
        • NodeJS: cpu, wasm, tensorflow +default: webgl for browser and tensorflow for nodejs
        • +
        +
        +
        + +
        body: Partial<BodyConfig>
        +

        Body config BodyConfig

        +
        +
        + +
        cacheModels: boolean
        +

        Cache models in IndexDB on first sucessfull load +default: true if indexdb is available (browsers), false if its not (nodejs)

        +
        +
        + +
        cacheSensitivity: number
        +

        Cache sensitivity

        +
          +
        • values 0..1 where 0.01 means reset cache if input changed more than 1%
        • +
        • set to 0 to disable caching
        • +
        +

        default: 0.7

        +
        +
        + +
        deallocate: boolean
        +

        Perform immediate garbage collection on deallocated tensors instead of caching them

        +
        +
        + +
        debug: boolean
        +

        Print debug statements to console

        +

        default: true

        +
        +
        + +
        face: Partial<FaceConfig>
        +

        Face config FaceConfig

        +
        +
        + +
        filter: Partial<FilterConfig>
        +

        Filter config FilterConfig

        +
        +
        + +
        flags: Record<string, unknown>
        +

        Explicit flags passed to initialize TFJS

        +
        +
        + +
        gesture: Partial<GestureConfig>
        +

        Gesture config GestureConfig

        +
        +
        + +
        hand: Partial<HandConfig>
        +

        Hand config HandConfig

        +
        +
        + +
        modelBasePath: string
        +

        Base model path (typically starting with file://, http:// or https://) for all models

        +
          +
        • individual modelPath values are relative to this path
        • +
        +

        default: ../models/ for browsers and file://models/ for nodejs

        +
        +
        + +
        object: Partial<ObjectConfig>
        +

        Object config ObjectConfig

        +
        +
        + +
        segmentation: Partial<SegmentationConfig>
        +

        Segmentation config SegmentationConfig

        +
        +
        + +
        skipAllowed: boolean
        +

        Internal Variable

        +
        +
        + +
        softwareKernels: boolean
        +

        Software Kernels +Registers software kernel ops running on CPU when accelerated version of kernel is not found in the current backend

        +
        +
        + +
        validateModels: boolean
        +

        Validate kernel ops used in model during model load +default: true +any errors will be printed on console but will be treated as non-fatal

        +
        +
        + +
        warmup: WarmupEnum
        +

        What to use for human.warmup()

        +
          +
        • warmup pre-initializes all models for faster inference but can take significant time on startup
        • +
        • used by webgl, humangl and webgpu backends
        • +
        +

        default: full

        +
        +
        + +
        wasmPath: string
        +

        Path to *.wasm files if backend is set to wasm

        +

        default: auto-detects to link to CDN jsdelivr when running in browser

        +
        +
        + +
        wasmPlatformFetch: boolean
        +

        Force WASM loader to use platform fetch

        +

        default: false

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/DrawOptions.html b/typedoc/interfaces/DrawOptions.html new file mode 100644 index 00000000..296cb595 --- /dev/null +++ b/typedoc/interfaces/DrawOptions.html @@ -0,0 +1,300 @@ +DrawOptions | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface DrawOptions

        +
        +

        Draw Options

        +
          +
        • Accessed via human.draw.options or provided per each draw method as the drawOptions optional parameter
        • +
        +
        +
        +

        Hierarchy

        +
          +
        • DrawOptions
        +
        +
        +
        + +
        +
        +

        Properties

        +
        + +
        alpha: number
        +

        alpha value used for lines

        +
        +
        + +
        bodyLabels: string
        +

        string template for body labels

        +
        +
        + +
        bodyPartLabels: string
        +

        string template for body part labels

        +
        +
        + +
        color: string
        +

        draw line color

        +
        +
        + +
        drawAttention: boolean
        +

        should face attention keypoints be highlighted

        +
        +
        + +
        drawBoxes: boolean
        +

        should draw boxes around detection results?

        +
        +
        + +
        drawGaze: boolean
        +

        should draw gaze arrows?

        +
        +
        + +
        drawGestures: boolean
        +

        should detected gestures be drawn?

        +
        +
        + +
        drawLabels: boolean
        +

        should labels be drawn?

        +
        +
        + +
        drawPoints: boolean
        +

        should points be drawn?

        +
        +
        + +
        drawPolygons: boolean
        +

        should draw polygons from detection points?

        +
        +
        + +
        faceLabels: string
        +

        string template for face labels

        +
        +
        + +
        fillPolygons: boolean
        +

        should fill polygons?

        +
        +
        + +
        fingerLabels: string
        +

        string template for hand labels

        +
        +
        + +
        font: string
        +

        label font

        +
        +
        + +
        gestureLabels: string
        +

        string template for gesture labels

        +
        +
        + +
        handLabels: string
        +

        string template for hand labels

        +
        +
        + +
        labelColor: string
        +

        label color

        +
        +
        + +
        lineHeight: number
        +

        line spacing between labels

        +
        +
        + +
        lineWidth: number
        +

        line width for drawn lines

        +
        +
        + +
        objectLabels: string
        +

        string template for object labels

        +
        +
        + +
        pointSize: number
        +

        size of drawn points

        +
        +
        + +
        roundRect: number
        +

        draw rounded boxes by n pixels

        +
        +
        + +
        shadowColor: string
        +

        label shadow color

        +
        +
        + +
        useCurves: boolean
        +

        should lines be curved?

        +
        +
        + +
        useDepth: boolean
        +

        use z-coordinate when available

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/FaceAntiSpoofConfig.html b/typedoc/interfaces/FaceAntiSpoofConfig.html new file mode 100644 index 00000000..a8b075d8 --- /dev/null +++ b/typedoc/interfaces/FaceAntiSpoofConfig.html @@ -0,0 +1,107 @@ +FaceAntiSpoofConfig | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface FaceAntiSpoofConfig

        +
        +

        Anti-spoofing part of face configuration

        +
        +
        +

        Hierarchy

        +
        +
        +
        +
        + +
        +
        +

        Properties

        +
        +
        +

        Properties

        +
        + +
        enabled: boolean
        +

        is module enabled?

        +
        +
        + +
        modelPath: string
        +

        path to model json file (relative to modelBasePath

        +
        +
        + +
        skipFrames: number
        +

        how many max frames to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        + +
        skipTime: number
        +

        how many max milliseconds to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/FaceAttentionConfig.html b/typedoc/interfaces/FaceAttentionConfig.html new file mode 100644 index 00000000..350a49d4 --- /dev/null +++ b/typedoc/interfaces/FaceAttentionConfig.html @@ -0,0 +1,107 @@ +FaceAttentionConfig | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface FaceAttentionConfig

        +
        +

        Attention part of face configuration

        +
        +
        +

        Hierarchy

        +
        +
        +
        +
        + +
        +
        +

        Properties

        +
        +
        +

        Properties

        +
        + +
        enabled: boolean
        +

        is module enabled?

        +
        +
        + +
        modelPath: string
        +

        path to model json file (relative to modelBasePath

        +
        +
        + +
        skipFrames: number
        +

        how many max frames to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        + +
        skipTime: number
        +

        how many max milliseconds to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/FaceConfig.html b/typedoc/interfaces/FaceConfig.html new file mode 100644 index 00000000..1d025eeb --- /dev/null +++ b/typedoc/interfaces/FaceConfig.html @@ -0,0 +1,170 @@ +FaceConfig | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface FaceConfig

        +
        +

        Configures all face-specific options: face detection, mesh analysis, age, gender, emotion detection and face description

        +
        +
        +

        Hierarchy

        +
        +
        +
        +
        + +
        +
        +

        Properties

        +
        + +
        antispoof: Partial<FaceAntiSpoofConfig>
        +
        + +
        attention: Partial<FaceAttentionConfig>
        +
        + +
        description: Partial<FaceDescriptionConfig>
        +
        + +
        detector: Partial<FaceDetectorConfig>
        +
        + +
        emotion: Partial<FaceEmotionConfig>
        +
        + +
        enabled: boolean
        +

        is module enabled?

        +
        +
        + +
        gear: Partial<FaceGearConfig>
        +
        + +
        iris: Partial<FaceIrisConfig>
        +
        + +
        liveness: Partial<FaceLivenessConfig>
        +
        + +
        mesh: Partial<FaceMeshConfig>
        +
        + +
        modelPath: string
        +

        path to model json file (relative to modelBasePath

        +
        +
        + +
        skipFrames: number
        +

        how many max frames to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        + +
        skipTime: number
        +

        how many max milliseconds to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/FaceDescriptionConfig.html b/typedoc/interfaces/FaceDescriptionConfig.html new file mode 100644 index 00000000..99f89266 --- /dev/null +++ b/typedoc/interfaces/FaceDescriptionConfig.html @@ -0,0 +1,119 @@ +FaceDescriptionConfig | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface FaceDescriptionConfig

        +
        +

        Description or face embedding part of face configuration

        +
          +
        • also used by age and gender detection
        • +
        +
        +
        +

        Hierarchy

        +
        +
        +
        +
        + +
        +
        +

        Properties

        +
        + +
        enabled: boolean
        +

        is module enabled?

        +
        +
        + +
        minConfidence: number
        +

        minimum confidence for a detected face before results are discarded

        +
        +
        + +
        modelPath: string
        +

        path to model json file (relative to modelBasePath

        +
        +
        + +
        skipFrames: number
        +

        how many max frames to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        + +
        skipTime: number
        +

        how many max milliseconds to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/FaceDetectorConfig.html b/typedoc/interfaces/FaceDetectorConfig.html new file mode 100644 index 00000000..bddd1620 --- /dev/null +++ b/typedoc/interfaces/FaceDetectorConfig.html @@ -0,0 +1,163 @@ +FaceDetectorConfig | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface FaceDetectorConfig

        +
        +

        Detector part of face configuration

        +
        +
        +

        Hierarchy

        +
        +
        +
        +
        + +
        +
        +

        Properties

        +
        + +
        enabled: boolean
        +

        is module enabled?

        +
        +
        + +
        iouThreshold: number
        +

        minimum overlap between two detected faces before one is discarded

        +
        +
        + +
        mask: boolean
        +

        should child models perform on masked image of a face

        +
        +
        + +
        maxDetected: number
        +

        maximum number of detected faces

        +
        +
        + +
        minConfidence: number
        +

        minimum confidence for a detected face before results are discarded

        +
        +
        + +
        modelPath: string
        +

        path to model json file (relative to modelBasePath

        +
        +
        + +
        return: boolean
        +

        should face detection return processed and cropped face tensor that can with an external model for addtional processing? +if enabled it must be manually deallocated to avoid memory leak

        +
        +
        + +
        rotation: boolean
        +

        is face rotation correction performed after detecting face? +used to correctly analyze faces under high angles

        +
        +
        + +
        skipFrames: number
        +

        how many max frames to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        + +
        skipTime: number
        +

        how many max milliseconds to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/FaceEmotionConfig.html b/typedoc/interfaces/FaceEmotionConfig.html new file mode 100644 index 00000000..a161f85e --- /dev/null +++ b/typedoc/interfaces/FaceEmotionConfig.html @@ -0,0 +1,116 @@ +FaceEmotionConfig | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface FaceEmotionConfig

        +
        +

        Emotion part of face configuration

        +
        +
        +

        Hierarchy

        +
        +
        +
        +
        + +
        +
        +

        Properties

        +
        + +
        enabled: boolean
        +

        is module enabled?

        +
        +
        + +
        minConfidence: number
        +

        minimum confidence for a detected face before results are discarded

        +
        +
        + +
        modelPath: string
        +

        path to model json file (relative to modelBasePath

        +
        +
        + +
        skipFrames: number
        +

        how many max frames to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        + +
        skipTime: number
        +

        how many max milliseconds to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/FaceGearConfig.html b/typedoc/interfaces/FaceGearConfig.html new file mode 100644 index 00000000..c75ca929 --- /dev/null +++ b/typedoc/interfaces/FaceGearConfig.html @@ -0,0 +1,116 @@ +FaceGearConfig | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface FaceGearConfig

        +
        +

        Gear part of face configuration

        +
        +
        +

        Hierarchy

        +
        +
        +
        +
        + +
        +
        +

        Properties

        +
        + +
        enabled: boolean
        +

        is module enabled?

        +
        +
        + +
        minConfidence: number
        +

        minimum confidence for a detected race before results are discarded

        +
        +
        + +
        modelPath: string
        +

        path to model json file (relative to modelBasePath

        +
        +
        + +
        skipFrames: number
        +

        how many max frames to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        + +
        skipTime: number
        +

        how many max milliseconds to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/FaceIrisConfig.html b/typedoc/interfaces/FaceIrisConfig.html new file mode 100644 index 00000000..f4af54a5 --- /dev/null +++ b/typedoc/interfaces/FaceIrisConfig.html @@ -0,0 +1,107 @@ +FaceIrisConfig | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface FaceIrisConfig

        +
        +

        Iris part of face configuration

        +
        +
        +

        Hierarchy

        +
        +
        +
        +
        + +
        +
        +

        Properties

        +
        +
        +

        Properties

        +
        + +
        enabled: boolean
        +

        is module enabled?

        +
        +
        + +
        modelPath: string
        +

        path to model json file (relative to modelBasePath

        +
        +
        + +
        skipFrames: number
        +

        how many max frames to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        + +
        skipTime: number
        +

        how many max milliseconds to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/FaceLivenessConfig.html b/typedoc/interfaces/FaceLivenessConfig.html new file mode 100644 index 00000000..5dff7e07 --- /dev/null +++ b/typedoc/interfaces/FaceLivenessConfig.html @@ -0,0 +1,107 @@ +FaceLivenessConfig | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface FaceLivenessConfig

        +
        +

        Liveness part of face configuration

        +
        +
        +

        Hierarchy

        +
        +
        +
        +
        + +
        +
        +

        Properties

        +
        +
        +

        Properties

        +
        + +
        enabled: boolean
        +

        is module enabled?

        +
        +
        + +
        modelPath: string
        +

        path to model json file (relative to modelBasePath

        +
        +
        + +
        skipFrames: number
        +

        how many max frames to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        + +
        skipTime: number
        +

        how many max milliseconds to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/FaceMeshConfig.html b/typedoc/interfaces/FaceMeshConfig.html new file mode 100644 index 00000000..6f864515 --- /dev/null +++ b/typedoc/interfaces/FaceMeshConfig.html @@ -0,0 +1,116 @@ +FaceMeshConfig | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface FaceMeshConfig

        +
        +

        Mesh part of face configuration

        +
        +
        +

        Hierarchy

        +
        +
        +
        +
        + +
        +
        +

        Properties

        +
        + +
        enabled: boolean
        +

        is module enabled?

        +
        +
        + +
        keepInvalid: boolean
        +

        Keep detected faces that cannot be verified using facemesh

        +
        +
        + +
        modelPath: string
        +

        path to model json file (relative to modelBasePath

        +
        +
        + +
        skipFrames: number
        +

        how many max frames to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        + +
        skipTime: number
        +

        how many max milliseconds to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/FaceResult.html b/typedoc/interfaces/FaceResult.html new file mode 100644 index 00000000..48358d35 --- /dev/null +++ b/typedoc/interfaces/FaceResult.html @@ -0,0 +1,247 @@ +FaceResult | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface FaceResult

        +
        +

        Face results

        +
          +
        • Combined results of face detector, face mesh, age, gender, emotion, embedding, iris models
        • +
        • Some values may be null if specific model is not enabled
        • +
        +
        +
        +

        Hierarchy

        +
          +
        • FaceResult
        +
        +
        +
        + +
        +
        +

        Properties

        +
        + +
        age?: number
        +

        detected age

        +
        +
        + +
        annotations: Record<FaceLandmark, Point[]>
        +

        mesh keypoints combined into annotated results

        +
        +
        + +
        box: Box
        +

        detected face box

        +
        +
        + +
        boxRaw: Box
        +

        detected face box normalized to 0..1

        +
        +
        + +
        boxScore: number
        +

        detection score

        +
        +
        + +
        distance?: number
        +

        face distance from camera

        +
        +
        + +
        embedding?: number[]
        +

        face descriptor

        +
        +
        + +
        emotion?: {
            emotion: Emotion;
            score: number;
        }[]
        +

        detected emotions

        +
        +
        + +
        faceScore: number
        +

        mesh score

        +
        +
        + +
        gender?: Gender
        +

        detected gender

        +
        +
        + +
        genderScore?: number
        +

        gender detection score

        +
        +
        + +
        id: number
        +

        face id

        +
        +
        + +
        live?: number
        +

        face liveness result confidence

        +
        +
        + +
        mesh: Point[]
        +

        detected face mesh

        +
        +
        + +
        meshRaw: Point[]
        +

        detected face mesh normalized to 0..1

        +
        +
        + +
        race?: {
            race: Race;
            score: number;
        }[]
        +

        detected race

        +
        +
        + +
        real?: number
        +

        face anti-spoofing result confidence

        +
        +
        + +
        rotation?: null | {
            angle: {
                pitch: number;
                roll: number;
                yaw: number;
            };
            gaze: {
                bearing: number;
                strength: number;
            };
            matrix: [number, number, number, number, number, number, number, number, number];
        }
        +

        face rotation details

        +
        +
        + +
        score: number
        +

        overall face score

        +
        +
        + +
        tensor?: Tensor<Rank>
        +

        detected face as tensor that can be used in further pipelines

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/FilterConfig.html b/typedoc/interfaces/FilterConfig.html new file mode 100644 index 00000000..454b6444 --- /dev/null +++ b/typedoc/interfaces/FilterConfig.html @@ -0,0 +1,260 @@ +FilterConfig | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface FilterConfig

        +
        +

        Run input through image filters before inference

        +
          +
        • available only in Browser environments
        • +
        • image filters run with near-zero latency as they are executed on the GPU using WebGL
        • +
        +
        +
        +

        Hierarchy

        +
          +
        • FilterConfig
        +
        +
        +
        + +
        +
        +

        Properties

        +
        + +
        autoBrightness: boolean
        +

        apply auto-brighness

        +
        +
        + +
        blur: number
        +

        range: 0 (no blur) to N (blur radius in pixels)

        +
        +
        + +
        brightness: number
        +

        range: -1 (darken) to 1 (lighten)

        +
        +
        + +
        contrast: number
        +

        range: -1 (reduce contrast) to 1 (increase contrast)

        +
        +
        + +
        enabled: boolean
        +

        are image filters enabled?

        +
        +
        + +
        equalization: boolean
        +

        perform image histogram equalization

        +
          +
        • equalization is performed on input as a whole and detected face before its passed for further analysis
        • +
        +
        +
        + +
        flip: boolean
        +

        flip input as mirror image

        +
        +
        + +
        height: number
        +

        resize input height

        +
          +
        • if both width and height are set to 0, there is no resizing
        • +
        • if just one is set, second one is scaled automatically
        • +
        • if both are set, values are used as-is
        • +
        +
        +
        + +
        hue: number
        +

        range: 0 (no change) to 360 (hue rotation in degrees)

        +
        +
        + +
        kodachrome: boolean
        +

        image kodachrome colors

        +
        +
        + +
        negative: boolean
        +

        image negative

        +
        +
        + +
        pixelate: number
        +

        range: 0 (no pixelate) to N (number of pixels to pixelate)

        +
        +
        + +
        polaroid: boolean
        +

        image polaroid camera effect

        +
        +
        + +
        return: boolean
        +

        return processed canvas imagedata in result

        +
        +
        + +
        saturation: number
        +

        range: -1 (reduce saturation) to 1 (increase saturation)

        +
        +
        + +
        sepia: boolean
        +

        image sepia colors

        +
        +
        + +
        sharpness: number
        +

        range: 0 (no sharpening) to 1 (maximum sharpening)

        +
        +
        + +
        technicolor: boolean
        +

        image technicolor colors

        +
        +
        + +
        vintage: boolean
        +

        image vintage colors

        +
        +
        + +
        width: number
        +

        resize input width

        +
          +
        • if both width and height are set to 0, there is no resizing
        • +
        • if just one is set, second one is scaled automatically
        • +
        • if both are set, values are used as-is
        • +
        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/GenericConfig.html b/typedoc/interfaces/GenericConfig.html new file mode 100644 index 00000000..16e3ca8a --- /dev/null +++ b/typedoc/interfaces/GenericConfig.html @@ -0,0 +1,116 @@ +GenericConfig | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface GenericConfig

        +
        +

        Generic config type inherited by all module types

        +
        +
        +

        Hierarchy

        +
        +
        +
        +
        + +
        +
        +

        Properties

        +
        +
        +

        Properties

        +
        + +
        enabled: boolean
        +

        is module enabled?

        +
        +
        + +
        modelPath: string
        +

        path to model json file (relative to modelBasePath

        +
        +
        + +
        skipFrames: number
        +

        how many max frames to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        + +
        skipTime: number
        +

        how many max milliseconds to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/GestureConfig.html b/typedoc/interfaces/GestureConfig.html new file mode 100644 index 00000000..849654c3 --- /dev/null +++ b/typedoc/interfaces/GestureConfig.html @@ -0,0 +1,72 @@ +GestureConfig | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface GestureConfig

        +
        +

        Controlls gesture detection

        +
        +
        +

        Hierarchy

        +
          +
        • GestureConfig
        +
        +
        +
        + +
        +
        +

        Properties

        +
        +
        +

        Properties

        +
        + +
        enabled: boolean
        +

        is gesture detection enabled?

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/HandConfig.html b/typedoc/interfaces/HandConfig.html new file mode 100644 index 00000000..75cd5f9e --- /dev/null +++ b/typedoc/interfaces/HandConfig.html @@ -0,0 +1,180 @@ +HandConfig | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface HandConfig

        +
        +

        Configures all hand detection specific options

        +
        +
        +

        Hierarchy

        +
        +
        +
        +
        + +
        +
        +

        Properties

        +
        + +
        detector: {
            modelPath?: string;
        }
        +
        +

        Type declaration

        +
          +
        • +
          Optional modelPath?: string
          +

          path to hand detector model json

          +
        +
        + +
        enabled: boolean
        +

        is module enabled?

        +
        +
        + +
        iouThreshold: number
        +

        minimum overlap between two detected hands before one is discarded

        +
        +
        + +
        landmarks: boolean
        +

        should hand landmarks be detected or just return detected hand box

        +
        +
        + +
        maxDetected: number
        +

        maximum number of detected hands

        +
        +
        + +
        minConfidence: number
        +

        minimum confidence for a detected hand before results are discarded

        +
        +
        + +
        modelPath: string
        +

        path to model json file (relative to modelBasePath

        +
        +
        + +
        rotation: boolean
        +

        should hand rotation correction be performed after hand detection?

        +
        +
        + +
        skeleton: {
            modelPath?: string;
        }
        +
        +

        Type declaration

        +
          +
        • +
          Optional modelPath?: string
          +

          path to hand skeleton model json

          +
        +
        + +
        skipFrames: number
        +

        how many max frames to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        + +
        skipTime: number
        +

        how many max milliseconds to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/HandResult.html b/typedoc/interfaces/HandResult.html new file mode 100644 index 00000000..d1d22d21 --- /dev/null +++ b/typedoc/interfaces/HandResult.html @@ -0,0 +1,153 @@ +HandResult | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface HandResult

        +
        +

        Hand results

        +
        +
        +

        Hierarchy

        +
          +
        • HandResult
        +
        +
        +
        + +
        +
        +

        Properties

        +
        + +
        annotations: Record<Finger, Point[]>
        +

        detected hand keypoints combined into annotated parts

        +
        +
        + +
        box: Box
        +

        detected hand box

        +
        +
        + +
        boxRaw: Box
        +

        detected hand box normalized to 0..1

        +
        +
        + +
        boxScore: number
        +

        hand detection score

        +
        +
        + +
        fingerScore: number
        +

        hand skelton score

        +
        +
        + +
        id: number
        +

        hand id

        +
        +
        + +
        keypoints: Point[]
        +

        detected hand keypoints

        +
        +
        + +
        label: HandType
        +

        detected hand class

        +
        +
        + +
        landmarks: Record<Finger, {
            curl: FingerCurl;
            direction: FingerDirection;
        }>
        +

        detected hand parts annotated with part gestures

        +
        +
        + +
        score: number
        +

        hand overal score

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/ModelInfo.html b/typedoc/interfaces/ModelInfo.html new file mode 100644 index 00000000..0924ce3c --- /dev/null +++ b/typedoc/interfaces/ModelInfo.html @@ -0,0 +1,102 @@ +ModelInfo | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface ModelInfo

        +
        +

        Hierarchy

        +
          +
        • ModelInfo
        +
        +
        +
        + +
        +
        +

        Properties

        +
        + +
        inCache: boolean
        +
        + +
        name: string
        +
        + +
        sizeDesired: number
        +
        + +
        sizeFromManifest: number
        +
        + +
        sizeLoadedWeights: number
        +
        + +
        url: string
        +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/ObjectConfig.html b/typedoc/interfaces/ObjectConfig.html new file mode 100644 index 00000000..e06cdc22 --- /dev/null +++ b/typedoc/interfaces/ObjectConfig.html @@ -0,0 +1,134 @@ +ObjectConfig | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface ObjectConfig

        +
        +

        Configures all object detection specific options

        +
        +
        +

        Hierarchy

        +
        +
        +
        +
        + +
        +
        +

        Properties

        +
        + +
        enabled: boolean
        +

        is module enabled?

        +
        +
        + +
        iouThreshold: number
        +

        minimum overlap between two detected objects before one is discarded

        +
        +
        + +
        maxDetected: number
        +

        maximum number of detected objects

        +
        +
        + +
        minConfidence: number
        +

        minimum confidence for a detected objects before results are discarded

        +
        +
        + +
        modelPath: string
        +

        path to model json file (relative to modelBasePath

        +
        +
        + +
        skipFrames: number
        +

        how many max frames to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        + +
        skipTime: number
        +

        how many max milliseconds to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/ObjectResult.html b/typedoc/interfaces/ObjectResult.html new file mode 100644 index 00000000..7c3f6d57 --- /dev/null +++ b/typedoc/interfaces/ObjectResult.html @@ -0,0 +1,117 @@ +ObjectResult | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface ObjectResult

        +
        +

        Object results

        +
        +
        +

        Hierarchy

        +
          +
        • ObjectResult
        +
        +
        +
        + +
        +
        +

        Properties

        +
        +
        +

        Properties

        +
        + +
        box: Box
        +

        detected object box

        +
        +
        + +
        boxRaw: Box
        +

        detected object box normalized to 0..1

        +
        +
        + +
        class: number
        +

        detected object class id

        +
        +
        + +
        id: number
        +

        object id

        +
        +
        + +
        label: ObjectType
        +

        detected object class name

        +
        +
        + +
        score: number
        +

        object detection score

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/PersonResult.html b/typedoc/interfaces/PersonResult.html new file mode 100644 index 00000000..b2c27a49 --- /dev/null +++ b/typedoc/interfaces/PersonResult.html @@ -0,0 +1,136 @@ +PersonResult | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface PersonResult

        +
        +

        Person getter

        +
          +
        • Triggers combining all individual results into a virtual person object
        • +
        +
        +
        +

        Hierarchy

        +
          +
        • PersonResult
        +
        +
        +
        + +
        +
        +

        Properties

        +
        +
        +

        Properties

        +
        + +
        body: null | BodyResult
        +

        body result that belongs to this person

        +
        +
        + +
        box: Box
        +

        box that defines the person

        +
        +
        + +
        boxRaw?: Box
        +

        box that defines the person normalized to 0..1

        +
        +
        + + +

        face result that belongs to this person

        +
        +
        + +
        gestures: GestureResult[]
        +

        detected gestures specific to this person

        +
        +
        + +
        hands: {
            left: null | HandResult;
            right: null | HandResult;
        }
        +

        left and right hand results that belong to this person

        +
        +
        +

        Type declaration

        +
        +
        + +
        id: number
        +

        person id

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/Result.html b/typedoc/interfaces/Result.html new file mode 100644 index 00000000..f18050d0 --- /dev/null +++ b/typedoc/interfaces/Result.html @@ -0,0 +1,172 @@ +Result | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface Result

        +
        +

        Result interface definition for Human library

        +

        Contains all possible detection results

        +
        +
        +

        Hierarchy

        +
          +
        • Result
        +
        +
        +
        + +
        +
        +

        Properties

        +
        + +
        body: BodyResult[]
        +

        BodyResult: detection & analysis results

        +
        +
        + +
        canvas?: null | AnyCanvas
        +

        optional processed canvas that can be used to draw input on screen

        +
        +
        + +
        error: null | string
        +

        Last known error message

        +
        +
        + +
        face: FaceResult[]
        +

        FaceResult: detection & analysis results

        +
        +
        + +
        gesture: GestureResult[]
        +

        GestureResult: detection & analysis results

        +
        +
        + +
        hand: HandResult[]
        +

        HandResult: detection & analysis results

        +
        +
        + +
        height: number
        +

        Resolution height

        +
        +
        + +
        object: ObjectResult[]
        +

        ObjectResult: detection & analysis results

        +
        +
        + +
        performance: Record<string, number>
        +

        global performance object with timing values for each operation

        +
        +
        + +
        persons: PersonResult[]
        +

        getter property that returns unified persons object

        +
        +
        + +
        timestamp: number
        +

        timestamp of detection representing the milliseconds elapsed since the UNIX epoch

        +
        +
        + +
        width: number
        +

        Resolution width

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/SegmentationConfig.html b/typedoc/interfaces/SegmentationConfig.html new file mode 100644 index 00000000..b04096e5 --- /dev/null +++ b/typedoc/interfaces/SegmentationConfig.html @@ -0,0 +1,129 @@ +SegmentationConfig | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface SegmentationConfig

        +
        +

        Configures all body segmentation module +removes background from input containing person +if segmentation is enabled it will run as preprocessing task before any other model +alternatively leave it disabled and use it on-demand using human.segmentation method which can +remove background or replace it with user-provided background

        +
        +
        +

        Hierarchy

        +
        +
        +
        +
        + +
        +
        +

        Properties

        +
        + +
        enabled: boolean
        +

        is module enabled?

        +
        +
        + + +

        possible rvm segmentation mode

        +
        +
        + +
        modelPath: string
        +

        path to model json file (relative to modelBasePath

        +
        +
        + +
        ratio: number
        +

        downsample ratio, adjust to reflect approximately how much of input is taken by body

        +
        +
        + +
        skipFrames: number
        +

        how many max frames to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        + +
        skipTime: number
        +

        how many max milliseconds to go without re-running model if cached results are acceptable +for two-phase models such as face and hand caching applies to bounding boxes detection only

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/WebCamConfig.html b/typedoc/interfaces/WebCamConfig.html new file mode 100644 index 00000000..8db87ea2 --- /dev/null +++ b/typedoc/interfaces/WebCamConfig.html @@ -0,0 +1,131 @@ +WebCamConfig | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface WebCamConfig

        +
        +

        WebCam configuration

        +
        +
        +

        Hierarchy

        +
          +
        • WebCamConfig
        +
        +
        +
        + +
        +
        +

        Properties

        +
        +
        +

        Properties

        +
        + +
        crop: boolean
        +

        camera crop mode

        +
        +
        + +
        debug: boolean
        +

        print messages on console

        +
        +
        + +
        element: undefined | string | HTMLVideoElement
        +

        element can be:

        +
          +
        • string which indicates dom element id
        • +
        • actual HTMLVideo dom element
        • +
        • undefined in which case a new HTMLVideoElement will be created
        • +
        +
        +
        + +
        height: number
        +

        desired webcam height

        +
        +
        + +
        id?: string
        +

        deviceId of the video device to use

        +
        +
        + +
        mode: "front" | "back"
        +

        use front or back camera

        +
        +
        + +
        width: number
        +

        desired webcam width

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/models.KernelOps.html b/typedoc/interfaces/models.KernelOps.html new file mode 100644 index 00000000..218682e1 --- /dev/null +++ b/typedoc/interfaces/models.KernelOps.html @@ -0,0 +1,89 @@ +KernelOps | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface KernelOps

        +
        +

        Hierarchy

        +
          +
        • KernelOps
        +
        +
        +
        + +
        +
        +

        Properties

        +
        +
        +

        Properties

        +
        + +
        missing: string[]
        +
        + +
        name: string
        +
        + +
        ops: string[]
        +
        + +
        url: string
        +
        +
        \ No newline at end of file diff --git a/typedoc/interfaces/models.ModelStats.html b/typedoc/interfaces/models.ModelStats.html new file mode 100644 index 00000000..5c7c60fd --- /dev/null +++ b/typedoc/interfaces/models.ModelStats.html @@ -0,0 +1,113 @@ +ModelStats | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Interface ModelStats

        +
        +

        structure that holds global stats for currently loaded models

        +
        +
        +

        Hierarchy

        +
          +
        • ModelStats
        +
        +
        +
        + +
        +
        +

        Properties

        +
        + +
        modelStats: ModelInfo[]
        +
        + +
        numDefinedModels: number
        +
        + +
        numLoadedModels: number
        +
        + +
        percentageLoaded: number
        +
        + +
        totalSizeFromManifest: number
        +
        + +
        totalSizeLoading: number
        +
        + +
        totalSizeWeights: number
        +
        +
        \ No newline at end of file diff --git a/typedoc/modules/Tensor.html b/typedoc/modules/Tensor.html new file mode 100644 index 00000000..df42ae77 --- /dev/null +++ b/typedoc/modules/Tensor.html @@ -0,0 +1,258 @@ +Tensor | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Namespace Tensor

        +
        +

        Explict reexport of main @tensorflow/tfjs types

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/modules/draw.html b/typedoc/modules/draw.html new file mode 100644 index 00000000..5bf52cf6 --- /dev/null +++ b/typedoc/modules/draw.html @@ -0,0 +1,76 @@ +draw | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Namespace draw

        +
        +

        Class Human as default export

        +
        +
        +
        +

        Index

        +
        +

        Variables

        +
        +
        +

        Functions

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/modules/match.html b/typedoc/modules/match.html new file mode 100644 index 00000000..9879daee --- /dev/null +++ b/typedoc/modules/match.html @@ -0,0 +1,66 @@ +match | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Namespace match

        +
        +

        Class Human as default export

        +
        +
        +
        +

        Index

        +
        +

        Type Aliases

        +
        +
        +

        Functions

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/modules/models.html b/typedoc/modules/models.html new file mode 100644 index 00000000..efd9df18 --- /dev/null +++ b/typedoc/modules/models.html @@ -0,0 +1,67 @@ +models | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Namespace models

        +
        +

        Class Human as default export

        +
        +
        +
        +

        Index

        +
        +

        Classes

        +
        +
        +

        Interfaces

        +
        +
        +

        Functions

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/types/AnyCanvas.html b/typedoc/types/AnyCanvas.html new file mode 100644 index 00000000..53f4a9cb --- /dev/null +++ b/typedoc/types/AnyCanvas.html @@ -0,0 +1,120 @@ +AnyCanvas | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/AnyImage.html b/typedoc/types/AnyImage.html new file mode 100644 index 00000000..2a54a814 --- /dev/null +++ b/typedoc/types/AnyImage.html @@ -0,0 +1,120 @@ +AnyImage | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/AnyVideo.html b/typedoc/types/AnyVideo.html new file mode 100644 index 00000000..23398fbb --- /dev/null +++ b/typedoc/types/AnyVideo.html @@ -0,0 +1,120 @@ +AnyVideo | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/BackendEnum.html b/typedoc/types/BackendEnum.html new file mode 100644 index 00000000..e3024520 --- /dev/null +++ b/typedoc/types/BackendEnum.html @@ -0,0 +1,120 @@ +BackendEnum | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/BodyAnnotation.html b/typedoc/types/BodyAnnotation.html new file mode 100644 index 00000000..87485c51 --- /dev/null +++ b/typedoc/types/BodyAnnotation.html @@ -0,0 +1,118 @@ +BodyAnnotation | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/BodyAnnotationBlazePose.html b/typedoc/types/BodyAnnotationBlazePose.html new file mode 100644 index 00000000..2f605ead --- /dev/null +++ b/typedoc/types/BodyAnnotationBlazePose.html @@ -0,0 +1,118 @@ +BodyAnnotationBlazePose | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/BodyAnnotationEfficientPose.html b/typedoc/types/BodyAnnotationEfficientPose.html new file mode 100644 index 00000000..c6573980 --- /dev/null +++ b/typedoc/types/BodyAnnotationEfficientPose.html @@ -0,0 +1,118 @@ +BodyAnnotationEfficientPose | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/BodyGesture.html b/typedoc/types/BodyGesture.html new file mode 100644 index 00000000..540d4895 --- /dev/null +++ b/typedoc/types/BodyGesture.html @@ -0,0 +1,120 @@ +BodyGesture | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/BodyLandmark.html b/typedoc/types/BodyLandmark.html new file mode 100644 index 00000000..91241b29 --- /dev/null +++ b/typedoc/types/BodyLandmark.html @@ -0,0 +1,118 @@ +BodyLandmark | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/BodyLandmarkBlazePose.html b/typedoc/types/BodyLandmarkBlazePose.html new file mode 100644 index 00000000..6ff2ff5c --- /dev/null +++ b/typedoc/types/BodyLandmarkBlazePose.html @@ -0,0 +1,118 @@ +BodyLandmarkBlazePose | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Type alias BodyLandmarkBlazePose

        +
        BodyLandmarkBlazePose: "nose" | "leftEyeInside" | "leftEye" | "leftEyeOutside" | "rightEyeInside" | "rightEye" | "rightEyeOutside" | "leftEar" | "rightEar" | "leftMouth" | "rightMouth" | "leftShoulder" | "rightShoulder" | "leftElbow" | "rightElbow" | "leftWrist" | "rightWrist" | "leftPinky" | "rightPinky" | "leftIndex" | "rightIndex" | "leftThumb" | "rightThumb" | "leftHip" | "rightHip" | "leftKnee" | "rightKnee" | "leftAnkle" | "rightAnkle" | "leftHeel" | "rightHeel" | "leftFoot" | "rightFoot" | "bodyCenter" | "bodyTop" | "leftPalm" | "leftHand" | "rightPalm" | "rightHand"
        +
        +
        \ No newline at end of file diff --git a/typedoc/types/BodyLandmarkEfficientNet.html b/typedoc/types/BodyLandmarkEfficientNet.html new file mode 100644 index 00000000..9baf578b --- /dev/null +++ b/typedoc/types/BodyLandmarkEfficientNet.html @@ -0,0 +1,118 @@ +BodyLandmarkEfficientNet | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/BodyLandmarkMoveNet.html b/typedoc/types/BodyLandmarkMoveNet.html new file mode 100644 index 00000000..0d951969 --- /dev/null +++ b/typedoc/types/BodyLandmarkMoveNet.html @@ -0,0 +1,118 @@ +BodyLandmarkMoveNet | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/BodyLandmarkPoseNet.html b/typedoc/types/BodyLandmarkPoseNet.html new file mode 100644 index 00000000..1a79274a --- /dev/null +++ b/typedoc/types/BodyLandmarkPoseNet.html @@ -0,0 +1,118 @@ +BodyLandmarkPoseNet | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/Box.html b/typedoc/types/Box.html new file mode 100644 index 00000000..2a4cf8a7 --- /dev/null +++ b/typedoc/types/Box.html @@ -0,0 +1,120 @@ +Box | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/Emotion.html b/typedoc/types/Emotion.html new file mode 100644 index 00000000..b8ba6481 --- /dev/null +++ b/typedoc/types/Emotion.html @@ -0,0 +1,118 @@ +Emotion | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/Events.html b/typedoc/types/Events.html new file mode 100644 index 00000000..d0325c5f --- /dev/null +++ b/typedoc/types/Events.html @@ -0,0 +1,127 @@ +Events | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Type alias Events

        +
        Events: "create" | "load" | "image" | "result" | "warmup" | "error"
        +

        Events dispatched by human.events

        +
          +
        • create: triggered when Human object is instantiated
        • +
        • load: triggered when models are loaded (explicitly or on-demand)
        • +
        • image: triggered when input image is processed
        • +
        • result: triggered when detection is complete
        • +
        • warmup: triggered when warmup is complete
        • +
        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/types/ExternalCanvas.html b/typedoc/types/ExternalCanvas.html new file mode 100644 index 00000000..bc73709c --- /dev/null +++ b/typedoc/types/ExternalCanvas.html @@ -0,0 +1,120 @@ +ExternalCanvas | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/FaceGesture.html b/typedoc/types/FaceGesture.html new file mode 100644 index 00000000..2a0ad7a5 --- /dev/null +++ b/typedoc/types/FaceGesture.html @@ -0,0 +1,120 @@ +FaceGesture | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/FaceLandmark.html b/typedoc/types/FaceLandmark.html new file mode 100644 index 00000000..38813839 --- /dev/null +++ b/typedoc/types/FaceLandmark.html @@ -0,0 +1,118 @@ +FaceLandmark | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Type alias FaceLandmark

        +
        FaceLandmark: "leftEye" | "rightEye" | "nose" | "mouth" | "leftEar" | "rightEar" | "symmetryLine" | "silhouette" | "lipsUpperOuter" | "lipsLowerOuter" | "lipsUpperInner" | "lipsLowerInner" | "rightEyeUpper0" | "rightEyeLower0" | "rightEyeUpper1" | "rightEyeLower1" | "rightEyeUpper2" | "rightEyeLower2" | "rightEyeLower3" | "rightEyebrowUpper" | "rightEyebrowLower" | "rightEyeIris" | "leftEyeUpper0" | "leftEyeLower0" | "leftEyeUpper1" | "leftEyeLower1" | "leftEyeUpper2" | "leftEyeLower2" | "leftEyeLower3" | "leftEyebrowUpper" | "leftEyebrowLower" | "leftEyeIris" | "midwayBetweenEyes" | "noseTip" | "noseBottom" | "noseRightCorner" | "noseLeftCorner" | "rightCheek" | "leftCheek"
        +
        +
        \ No newline at end of file diff --git a/typedoc/types/Finger.html b/typedoc/types/Finger.html new file mode 100644 index 00000000..62dc7417 --- /dev/null +++ b/typedoc/types/Finger.html @@ -0,0 +1,118 @@ +Finger | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/FingerCurl.html b/typedoc/types/FingerCurl.html new file mode 100644 index 00000000..f6bf35cb --- /dev/null +++ b/typedoc/types/FingerCurl.html @@ -0,0 +1,118 @@ +FingerCurl | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/FingerDirection.html b/typedoc/types/FingerDirection.html new file mode 100644 index 00000000..6ec69406 --- /dev/null +++ b/typedoc/types/FingerDirection.html @@ -0,0 +1,118 @@ +FingerDirection | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/Gender.html b/typedoc/types/Gender.html new file mode 100644 index 00000000..c5b5dd6e --- /dev/null +++ b/typedoc/types/Gender.html @@ -0,0 +1,118 @@ +Gender | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/GestureResult.html b/typedoc/types/GestureResult.html new file mode 100644 index 00000000..44ed3464 --- /dev/null +++ b/typedoc/types/GestureResult.html @@ -0,0 +1,125 @@ +GestureResult | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Type alias GestureResult

        +
        GestureResult: {
            face: number;
            gesture: FaceGesture;
        } | {
            gesture: IrisGesture;
            iris: number;
        } | {
            body: number;
            gesture: BodyGesture;
        } | {
            gesture: HandGesture;
            hand: number;
        }
        +

        Gesture combined results +Each result has:

        +
          +
        • part: part name and number where gesture was detected: face, iris, body, hand
        • +
        • gesture: gesture detected
        • +
        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/types/HandGesture.html b/typedoc/types/HandGesture.html new file mode 100644 index 00000000..4b4dec95 --- /dev/null +++ b/typedoc/types/HandGesture.html @@ -0,0 +1,120 @@ +HandGesture | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/HandType.html b/typedoc/types/HandType.html new file mode 100644 index 00000000..37428652 --- /dev/null +++ b/typedoc/types/HandType.html @@ -0,0 +1,118 @@ +HandType | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/ImageObjects.html b/typedoc/types/ImageObjects.html new file mode 100644 index 00000000..de7adf08 --- /dev/null +++ b/typedoc/types/ImageObjects.html @@ -0,0 +1,120 @@ +ImageObjects | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/Input.html b/typedoc/types/Input.html new file mode 100644 index 00000000..8eefa803 --- /dev/null +++ b/typedoc/types/Input.html @@ -0,0 +1,120 @@ +Input | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/IrisGesture.html b/typedoc/types/IrisGesture.html new file mode 100644 index 00000000..74bd4be2 --- /dev/null +++ b/typedoc/types/IrisGesture.html @@ -0,0 +1,120 @@ +IrisGesture | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/ObjectType.html b/typedoc/types/ObjectType.html new file mode 100644 index 00000000..f8ec0e2b --- /dev/null +++ b/typedoc/types/ObjectType.html @@ -0,0 +1,118 @@ +ObjectType | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Type alias ObjectType

        +
        ObjectType: "person" | "bicycle" | "car" | "motorcycle" | "airplane" | "bus" | "train" | "truck" | "boat" | "traffic light" | "fire hydrant" | "stop sign" | "parking meter" | "bench" | "bird" | "cat" | "dog" | "horse" | "sheep" | "cow" | "elephant" | "bear" | "zebra" | "giraffe" | "backpack" | "umbrella" | "handbag" | "tie" | "suitcase" | "frisbee" | "skis" | "snowboard" | "sports ball" | "kite" | "baseball bat" | "baseball glove" | "skateboard" | "surfboard" | "tennis racket" | "bottle" | "wine glass" | "cup" | "fork" | "knife" | "spoon" | "bowl" | "banana" | "apple" | "sandwich" | "orange" | "broccoli" | "carrot" | "hot dog" | "pizza" | "donut" | "cake" | "chair" | "couch" | "potted plant" | "bed" | "dining table" | "toilet" | "tv" | "laptop" | "mouse" | "remote" | "keyboard" | "cell phone" | "microwave" | "oven" | "toaster" | "sink" | "refrigerator" | "book" | "clock" | "vase" | "scissors" | "teddy bear" | "hair drier" | "toothbrush"
        +
        +
        \ No newline at end of file diff --git a/typedoc/types/Point.html b/typedoc/types/Point.html new file mode 100644 index 00000000..61cb7e02 --- /dev/null +++ b/typedoc/types/Point.html @@ -0,0 +1,120 @@ +Point | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/Race.html b/typedoc/types/Race.html new file mode 100644 index 00000000..6d982108 --- /dev/null +++ b/typedoc/types/Race.html @@ -0,0 +1,118 @@ +Race | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/SegmentationEnum.html b/typedoc/types/SegmentationEnum.html new file mode 100644 index 00000000..f62ee014 --- /dev/null +++ b/typedoc/types/SegmentationEnum.html @@ -0,0 +1,120 @@ +SegmentationEnum | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/Tensor4D.html b/typedoc/types/Tensor4D.html new file mode 100644 index 00000000..fb4a123f --- /dev/null +++ b/typedoc/types/Tensor4D.html @@ -0,0 +1,121 @@ +Tensor4D | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/WarmupEnum.html b/typedoc/types/WarmupEnum.html new file mode 100644 index 00000000..2532941c --- /dev/null +++ b/typedoc/types/WarmupEnum.html @@ -0,0 +1,120 @@ +WarmupEnum | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/types/match.Descriptor.html b/typedoc/types/match.Descriptor.html new file mode 100644 index 00000000..c55305ef --- /dev/null +++ b/typedoc/types/match.Descriptor.html @@ -0,0 +1,53 @@ +Descriptor | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Type alias Descriptor

        +
        Descriptor: number[]
        +

        Face descriptor type as number array

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/types/match.MatchOptions.html b/typedoc/types/match.MatchOptions.html new file mode 100644 index 00000000..d6cd9e9a --- /dev/null +++ b/typedoc/types/match.MatchOptions.html @@ -0,0 +1,51 @@ +MatchOptions | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Type alias MatchOptions

        +
        MatchOptions: {
            max?: number;
            min?: number;
            multiplier?: number;
            order?: number;
            threshold?: number;
        } | undefined
        +
        +
        \ No newline at end of file diff --git a/typedoc/variables/defaults.html b/typedoc/variables/defaults.html new file mode 100644 index 00000000..fad1b468 --- /dev/null +++ b/typedoc/variables/defaults.html @@ -0,0 +1,122 @@ +defaults | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/typedoc/variables/draw.options.html b/typedoc/variables/draw.options.html new file mode 100644 index 00000000..f8e172e4 --- /dev/null +++ b/typedoc/variables/draw.options.html @@ -0,0 +1,58 @@ +options | @vladmandic/human - v3.0.0
        +
        + +
        +
        +
        +
        + +

        Variable optionsConst

        +
        options: DrawOptions = ...
        +

        currently set draw options DrawOptions

        +
        +
        +
        \ No newline at end of file diff --git a/typedoc/variables/env-1.html b/typedoc/variables/env-1.html new file mode 100644 index 00000000..ccdd3b7c --- /dev/null +++ b/typedoc/variables/env-1.html @@ -0,0 +1,118 @@ +env | @vladmandic/human - v3.0.0
        +
        + +
        + +
        \ No newline at end of file diff --git a/types/.eslintrc.json b/types/.eslintrc.json new file mode 100644 index 00000000..40cada03 --- /dev/null +++ b/types/.eslintrc.json @@ -0,0 +1,51 @@ +{ + "globals": {}, + "env": { + "browser": true, + "commonjs": true, + "node": true, + "es2022": true + }, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": "latest" + }, + "plugins": [ + "@typescript-eslint" + ], + "extends": [ + "airbnb-base", + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + "max-len": [1, 1000, 3], + "@typescript-eslint/ban-types":"off", + "@typescript-eslint/no-empty-interface":"off", + "@typescript-eslint/no-explicit-any":"off", + "@typescript-eslint/no-extraneous-class":"off", + "@typescript-eslint/no-unnecessary-type-constraint":"off", + "@typescript-eslint/no-unused-vars":"off", + "@typescript-eslint/prefer-function-type":"off", + "@typescript-eslint/unified-signatures":"off", + "@typescript-eslint/triple-slash-reference":"off", + "camelcase":"off", + "comma-dangle":"off", + "import/extensions":"off", + "import/no-duplicates":"off", + "import/no-mutable-exports":"off", + "import/no-unresolved":"off", + "indent":"off", + "lines-between-class-members":"off", + "max-classes-per-file":"off", + "no-multiple-empty-lines":"off", + "no-shadow":"off", + "no-tabs":"off", + "no-underscore-dangle":"off", + "no-use-before-define":"off", + "object-curly-newline":"off", + "quotes":"off", + "semi":"off" + } +} diff --git a/types/human.d.ts b/types/human.d.ts new file mode 100644 index 00000000..077dd112 --- /dev/null +++ b/types/human.d.ts @@ -0,0 +1,2787 @@ +/// + +/** meta-function that performs draw for: canvas, face, body, hand */ +declare function all(inCanvas: AnyCanvas, result: Result, drawOptions?: Partial): Promise<[void, void, void, void, void] | null>; + +/** Defines all possible canvas types */ +export declare type AnyCanvas = HTMLCanvasElement | OffscreenCanvas; + +/** Defines all possible image types */ +export declare type AnyImage = HTMLImageElement | typeof Image; + +/** Defines all possible video types */ +export declare type AnyVideo = HTMLMediaElement | HTMLVideoElement; + +/** @docalias number[] */ +declare interface ArrayMap { + R0: number; + R1: number[]; + R2: number[][]; + R3: number[][][]; + R4: number[][][][]; + R5: number[][][][][]; + R6: number[][][][][][]; +} + +/** Possible TensorFlow backends */ +export declare type BackendEnum = '' | 'cpu' | 'wasm' | 'webgl' | 'humangl' | 'tensorflow' | 'webgpu'; + +/** draw detected bodies */ +declare function body(inCanvas: AnyCanvas, result: BodyResult[], drawOptions?: Partial): void; + +export declare type BodyAnnotation = BodyAnnotationBlazePose | BodyAnnotationEfficientPose; + +export declare type BodyAnnotationBlazePose = 'leftLeg' | 'rightLeg' | 'torso' | 'leftArm' | 'rightArm' | 'leftEye' | 'rightEye' | 'mouth'; + +export declare type BodyAnnotationEfficientPose = 'leftLeg' | 'rightLeg' | 'torso' | 'leftArm' | 'rightArm' | 'head'; + +/** Configures all body detection specific options */ +export declare interface BodyConfig extends GenericConfig { + /** maximum number of detected bodies */ + maxDetected: number; + /** minimum confidence for a detected body before results are discarded */ + minConfidence: number; +} + +/** body gesture type */ +export declare type BodyGesture = `leaning ${'left' | 'right'}` | `raise ${'left' | 'right'} hand` | 'i give up'; + +/** Body Result keypoints */ +export declare interface BodyKeypoint { + /** body part name */ + part: BodyLandmark; + /** body part position */ + position: Point; + /** body part position normalized to 0..1 */ + positionRaw: Point; + /** body part position relative to body center in meters */ + distance?: Point; + /** body part detection score */ + score: number; +} + +export declare type BodyLandmark = BodyLandmarkPoseNet | BodyLandmarkMoveNet | BodyLandmarkEfficientNet | BodyLandmarkBlazePose; + +export declare type BodyLandmarkBlazePose = 'nose' | 'leftEyeInside' | 'leftEye' | 'leftEyeOutside' | 'rightEyeInside' | 'rightEye' | 'rightEyeOutside' | 'leftEar' | 'rightEar' | 'leftMouth' | 'rightMouth' | 'leftShoulder' | 'rightShoulder' | 'leftElbow' | 'rightElbow' | 'leftWrist' | 'rightWrist' | 'leftPinky' | 'rightPinky' | 'leftIndex' | 'rightIndex' | 'leftThumb' | 'rightThumb' | 'leftHip' | 'rightHip' | 'leftKnee' | 'rightKnee' | 'leftAnkle' | 'rightAnkle' | 'leftHeel' | 'rightHeel' | 'leftFoot' | 'rightFoot' | 'bodyCenter' | 'bodyTop' | 'leftPalm' | 'leftHand' | 'rightPalm' | 'rightHand'; + +export declare type BodyLandmarkEfficientNet = 'head' | 'neck' | 'rightShoulder' | 'rightElbow' | 'rightWrist' | 'chest' | 'leftShoulder' | 'leftElbow' | 'leftWrist' | 'bodyCenter' | 'rightHip' | 'rightKnee' | 'rightAnkle' | 'leftHip' | 'leftKnee' | 'leftAnkle'; + +export declare type BodyLandmarkMoveNet = 'nose' | 'leftEye' | 'rightEye' | 'leftEar' | 'rightEar' | 'leftShoulder' | 'rightShoulder' | 'leftElbow' | 'rightElbow' | 'leftWrist' | 'rightWrist' | 'leftHip' | 'rightHip' | 'leftKnee' | 'rightKnee' | 'leftAnkle' | 'rightAnkle'; + +export declare type BodyLandmarkPoseNet = 'nose' | 'leftEye' | 'rightEye' | 'leftEar' | 'rightEar' | 'leftShoulder' | 'rightShoulder' | 'leftElbow' | 'rightElbow' | 'leftWrist' | 'rightWrist' | 'leftHip' | 'rightHip' | 'leftKnee' | 'rightKnee' | 'leftAnkle' | 'rightAnkle'; + +/** Body results */ +export declare interface BodyResult { + /** body id */ + id: number; + /** body detection score */ + score: number; + /** detected body box */ + box: Box; + /** detected body box normalized to 0..1 */ + boxRaw: Box; + /** detected body keypoints */ + keypoints: BodyKeypoint[]; + /** detected body keypoints combined into annotated parts */ + annotations: Record; +} + +/** generic box as [x, y, width, height] */ +export declare type Box = [number, number, number, number]; + +/** + * Creates an IOHandler that loads model artifacts from user-selected files. + * + * This method can be used for loading from files such as user-selected files + * in the browser. + * When used in conjunction with `tf.loadLayersModel`, an instance of + * `tf.LayersModel` (Keras-style) can be constructed from the loaded artifacts. + * + * ```js + * // Note: This code snippet won't run properly without the actual file input + * // elements in the HTML DOM. + * + * // Suppose there are two HTML file input (``) + * // elements. + * const uploadJSONInput = document.getElementById('upload-json'); + * const uploadWeightsInput = document.getElementById('upload-weights'); + * const model = await tf.loadLayersModel(tf.io.browserFiles( + * [uploadJSONInput.files[0], uploadWeightsInput.files[0]])); + * ``` + * + * @param files `File`s to load from. Currently, this function supports only + * loading from files that contain Keras-style models (i.e., `tf.Model`s), for + * which an `Array` of `File`s is expected (in that order): + * - A JSON file containing the model topology and weight manifest. + * - Optionally, one or more binary files containing the binary weights. + * These files must have names that match the paths in the `weightsManifest` + * contained by the aforementioned JSON file, or errors will be thrown + * during loading. These weights files have the same format as the ones + * generated by `tensorflowjs_converter` that comes with the `tensorflowjs` + * Python PIP package. If no weights files are provided, only the model + * topology will be loaded from the JSON file above. + * @returns An instance of `Files` `IOHandler`. + * + * @doc { + * heading: 'Models', + * subheading: 'Loading', + * namespace: 'io', + * ignoreCI: true + * } + */ +declare function browserFiles(files: File[]): IOHandler; + +/** + * Deprecated. Use `tf.io.http`. + * @param path + * @param loadOptions + */ +declare function browserHTTPRequest(path: string, loadOptions?: LoadOptions): IOHandler; + +/** draw processed canvas */ +declare function canvas(input: AnyCanvas | HTMLImageElement | HTMLVideoElement, output: AnyCanvas): void; + +/** + * Concatenate a number of ArrayBuffers into one. + * + * @param buffers A number of array buffers to concatenate. + * @returns Result of concatenating `buffers` in order. + */ +declare function concatenateArrayBuffers(buffers: ArrayBuffer[]): ArrayBuffer; + +/** + * Configuration interface definition for **Human** library + * Contains all configurable parameters + * Defaults: [config](https://github.com/vladmandic/human/blob/main/src/config.ts#L262) + */ +export declare interface Config { + /** Backend used for TFJS operations + * valid build-in backends are: + * - Browser: `cpu`, `wasm`, `webgl`, `humangl`, `webgpu` + * - NodeJS: `cpu`, `wasm`, `tensorflow` + * default: `webgl` for browser and `tensorflow` for nodejs + */ + backend: BackendEnum; + /** Path to *.wasm files if backend is set to `wasm` + * + * default: auto-detects to link to CDN `jsdelivr` when running in browser + */ + wasmPath: string; + /** Force WASM loader to use platform fetch + * + * default: false + */ + wasmPlatformFetch: boolean; + /** Print debug statements to console + * + * default: `true` + */ + debug: boolean; + /** Perform model loading and inference concurrently or sequentially + * + * default: `true` + */ + async: boolean; + /** What to use for `human.warmup()` + * - warmup pre-initializes all models for faster inference but can take significant time on startup + * - used by `webgl`, `humangl` and `webgpu` backends + * + * default: `full` + */ + warmup: WarmupEnum; + /** Base model path (typically starting with file://, http:// or https://) for all models + * - individual modelPath values are relative to this path + * + * default: `../models/` for browsers and `file://models/` for nodejs + */ + modelBasePath: string; + /** Cache models in IndexDB on first sucessfull load + * default: true if indexdb is available (browsers), false if its not (nodejs) + */ + cacheModels: boolean; + /** Validate kernel ops used in model during model load + * default: true + * any errors will be printed on console but will be treated as non-fatal + */ + validateModels: boolean; + /** Cache sensitivity + * - values 0..1 where 0.01 means reset cache if input changed more than 1% + * - set to 0 to disable caching + * + * default: 0.7 + */ + cacheSensitivity: number; + /** Explicit flags passed to initialize TFJS */ + flags: Record; + /** Software Kernels + * Registers software kernel ops running on CPU when accelerated version of kernel is not found in the current backend + */ + softwareKernels: boolean; + /** Perform immediate garbage collection on deallocated tensors instead of caching them */ + deallocate: boolean; + /** Internal Variable */ + skipAllowed: boolean; + /** Filter config {@link FilterConfig} */ + filter: Partial; + /** Gesture config {@link GestureConfig} */ + gesture: Partial; + /** Face config {@link FaceConfig} */ + face: Partial; + /** Body config {@link BodyConfig} */ + body: Partial; + /** Hand config {@link HandConfig} */ + hand: Partial; + /** Object config {@link ObjectConfig} */ + object: Partial; + /** Segmentation config {@link SegmentationConfig} */ + segmentation: Partial; +} + +/** + * Copy a model from one URL to another. + * + * This function supports: + * + * 1. Copying within a storage medium, e.g., + * `tf.io.copyModel('localstorage://model-1', 'localstorage://model-2')` + * 2. Copying between two storage mediums, e.g., + * `tf.io.copyModel('localstorage://model-1', 'indexeddb://model-1')` + * + * ```js + * // First create and save a model. + * const model = tf.sequential(); + * model.add(tf.layers.dense( + * {units: 1, inputShape: [10], activation: 'sigmoid'})); + * await model.save('localstorage://demo/management/model1'); + * + * // Then list existing models. + * console.log(JSON.stringify(await tf.io.listModels())); + * + * // Copy the model, from Local Storage to IndexedDB. + * await tf.io.copyModel( + * 'localstorage://demo/management/model1', + * 'indexeddb://demo/management/model1'); + * + * // List models again. + * console.log(JSON.stringify(await tf.io.listModels())); + * + * // Remove both models. + * await tf.io.removeModel('localstorage://demo/management/model1'); + * await tf.io.removeModel('indexeddb://demo/management/model1'); + * ``` + * + * @param sourceURL Source URL of copying. + * @param destURL Destination URL of copying. + * @returns ModelArtifactsInfo of the copied model (if and only if copying + * is successful). + * @throws Error if copying fails, e.g., if no model exists at `sourceURL`, or + * if `oldPath` and `newPath` are identical. + * + * @doc { + * heading: 'Models', + * subheading: 'Management', + * namespace: 'io', + * ignoreCI: true + * } + */ +declare function copyModel(sourceURL: string, destURL: string): Promise; + +/** + * We wrap data id since we use weak map to avoid memory leaks. + * Since we have our own memory management, we have a reference counter + * mapping a tensor to its data, so there is always a pointer (even if that + * data is otherwise garbage collectable). + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ + * Global_Objects/WeakMap + */ +declare type DataId = object; + +declare type DataToGPUOptions = DataToGPUWebGLOption; + +declare interface DataToGPUWebGLOption { + customTexShape?: [number, number]; +} + +/** @docalias 'float32'|'int32'|'bool'|'complex64'|'string' */ +declare type DataType = keyof DataTypeMap; + +declare interface DataTypeMap { + float32: Float32Array; + int32: Int32Array; + bool: Uint8Array; + complex64: Float32Array; + string: string[]; +} + +/** + * Decode flat ArrayBuffer as weights. + * + * This function does not handle sharding. + * + * This function is the reverse of `encodeWeights`. + * + * @param buffer A flat ArrayBuffer carrying the binary values of the tensors + * concatenated in the order specified in `specs`. + * @param specs Specifications of the names, dtypes and shapes of the tensors + * whose value are encoded by `buffer`. + * @return A map from tensor name to tensor value, with the names corresponding + * to names in `specs`. + * @throws Error, if any of the tensors has unsupported dtype. + */ +declare function decodeWeights(buffer: ArrayBuffer, specs: WeightsManifestEntry[]): NamedTensorMap; + +/** - [See all default Config values...](https://github.com/vladmandic/human/blob/main/src/config.ts#L262) */ +export declare const defaults: Config; + +/** Face descriptor type as number array */ +declare type Descriptor = number[]; + +/** Calculates distance between two descriptors + * @param options - calculation options + * - order - algorithm to use + * Euclidean distance if `order` is 2 (default), Minkowski distance algorithm of nth order if `order` is higher than 2 + * - multiplier - by how much to enhance difference analysis in range of 1..100 + * default is 20 which normalizes results to similarity above 0.5 can be considered a match + */ +declare function distance(descriptor1: Descriptor, descriptor2: Descriptor, options?: MatchOptions): number; + +declare namespace draw { + export { + person, + canvas, + all, + init, + options, + face, + body, + hand, + object, + gesture + } +} +export { draw } + +/** Draw Options + * - Accessed via `human.draw.options` or provided per each draw method as the drawOptions optional parameter + */ +export declare interface DrawOptions { + /** draw line color */ + color: string; + /** alpha value used for lines */ + alpha: number; + /** label color */ + labelColor: string; + /** label shadow color */ + shadowColor: string; + /** label font */ + font: string; + /** line spacing between labels */ + lineHeight: number; + /** line width for drawn lines */ + lineWidth: number; + /** size of drawn points */ + pointSize: number; + /** draw rounded boxes by n pixels */ + roundRect: number; + /** should points be drawn? */ + drawPoints: boolean; + /** should labels be drawn? */ + drawLabels: boolean; + /** should face attention keypoints be highlighted */ + drawAttention: boolean; + /** should detected gestures be drawn? */ + drawGestures: boolean; + /** should draw boxes around detection results? */ + drawBoxes: boolean; + /** should draw polygons from detection points? */ + drawPolygons: boolean; + /** should draw gaze arrows? */ + drawGaze: boolean; + /** should fill polygons? */ + fillPolygons: boolean; + /** use z-coordinate when available */ + useDepth: boolean; + /** should lines be curved? */ + useCurves: boolean; + /** string template for face labels */ + faceLabels: string; + /** string template for body labels */ + bodyLabels: string; + /** string template for body part labels */ + bodyPartLabels: string; + /** string template for hand labels */ + handLabels: string; + /** string template for hand labels */ + fingerLabels: string; + /** string template for object labels */ + objectLabels: string; + /** string template for gesture labels */ + gestureLabels: string; +} + +export declare type Emotion = 'angry' | 'disgust' | 'fear' | 'happy' | 'sad' | 'surprise' | 'neutral'; + +export declare const empty: (error?: string | null) => Result; + +/** + * Encode a map from names to weight values as an ArrayBuffer, along with an + * `Array` of `WeightsManifestEntry` as specification of the encoded weights. + * + * This function does not perform sharding. + * + * This function is the reverse of `decodeWeights`. + * + * @param tensors A map ("dict") from names to tensors. + * @param group Group to which the weights belong (optional). + * @returns A `Promise` of + * - A flat `ArrayBuffer` with all the binary values of the `Tensor`s + * concatenated. + * - An `Array` of `WeightManifestEntry`s, carrying information including + * tensor names, `dtype`s and shapes. + * @throws Error: on unsupported tensor `dtype`. + */ +declare function encodeWeights(tensors: NamedTensorMap | NamedTensor[], group?: WeightGroup): Promise<{ + data: ArrayBuffer; + specs: WeightsManifestEntry[]; +}>; + +/** Env class that holds detected capabilities */ +export declare class Env { + /** Running in Browser */ + browser: boolean; + /** Running in NodeJS */ + node: boolean; + /** Running in WebWorker thread */ + worker: boolean; + /** Detected platform */ + platform: string; + /** Detected agent */ + agent: string; + /** List of supported backends */ + backends: string[]; + /** Has any work been performed so far */ + initial: boolean; + /** Are image filters supported? */ + filter: boolean | undefined; + /** TFJS instance details */ + tfjs: { + version: undefined | string; + }; + /** Is offscreenCanvas supported? */ + offscreen: undefined | boolean; + /** Are performance counter instant values or additive */ + perfadd: boolean; + /** If using tfjs-node get version of underlying tensorflow shared library and if gpu acceleration is enabled */ + tensorflow: { + version: undefined | string; + gpu: undefined | boolean; + }; + /** WASM detected capabilities */ + wasm: { + supported: undefined | boolean; + backend: undefined | boolean; + simd: undefined | boolean; + multithread: undefined | boolean; + }; + /** WebGL detected capabilities */ + webgl: { + supported: undefined | boolean; + backend: undefined | boolean; + version: undefined | string; + renderer: undefined | string; + shader: undefined | string; + vendor: undefined | string; + }; + /** WebGPU detected capabilities */ + webgpu: { + supported: undefined | boolean; + backend: undefined | boolean; + adapter: undefined | GPUAdapterInfo; + }; + /** CPU info */ + cpu: { + model: undefined | string; + flags: string[]; + }; + /** List of supported kernels for current backend */ + kernels: string[]; + /** MonkeyPatch for Canvas */ + Canvas: undefined; + /** MonkeyPatch for Image */ + Image: undefined; + /** MonkeyPatch for ImageData */ + ImageData: undefined; + constructor(); + /** update backend information */ + updateBackend(): Promise; + /** update cpu information */ + updateCPU(): void; +} + +export declare const env: Env; + +/** Events dispatched by `human.events` + * - `create`: triggered when Human object is instantiated + * - `load`: triggered when models are loaded (explicitly or on-demand) + * - `image`: triggered when input image is processed + * - `result`: triggered when detection is complete + * - `warmup`: triggered when warmup is complete + */ +export declare type Events = 'create' | 'load' | 'image' | 'result' | 'warmup' | 'error'; + +/** Defines possible externally defined canvas */ +export declare type ExternalCanvas = typeof env.Canvas; + +/** draw detected faces */ +declare function face(inCanvas: AnyCanvas, result: FaceResult[], drawOptions?: Partial): void; + +/** Anti-spoofing part of face configuration */ +export declare interface FaceAntiSpoofConfig extends GenericConfig { +} + +/** Attention part of face configuration */ +export declare interface FaceAttentionConfig extends GenericConfig { +} + +/** Configures all face-specific options: face detection, mesh analysis, age, gender, emotion detection and face description */ +export declare interface FaceConfig extends GenericConfig { + detector: Partial; + mesh: Partial; + attention: Partial; + iris: Partial; + description: Partial; + emotion: Partial; + antispoof: Partial; + liveness: Partial; + gear: Partial; +} + +/** Description or face embedding part of face configuration + * - also used by age and gender detection + */ +export declare interface FaceDescriptionConfig extends GenericConfig { + /** minimum confidence for a detected face before results are discarded */ + minConfidence: number; +} + +/** Detector part of face configuration */ +export declare interface FaceDetectorConfig extends GenericConfig { + /** is face rotation correction performed after detecting face? + * used to correctly analyze faces under high angles + */ + rotation: boolean; + /** maximum number of detected faces */ + maxDetected: number; + /** minimum confidence for a detected face before results are discarded */ + minConfidence: number; + /** minimum overlap between two detected faces before one is discarded */ + iouThreshold: number; + /** should child models perform on masked image of a face */ + mask: boolean; + /** should face detection return processed and cropped face tensor that can with an external model for addtional processing? + * if enabled it must be manually deallocated to avoid memory leak */ + return: boolean; +} + +/** Emotion part of face configuration */ +export declare interface FaceEmotionConfig extends GenericConfig { + /** minimum confidence for a detected face before results are discarded */ + minConfidence: number; +} + +/** Gear part of face configuration */ +export declare interface FaceGearConfig extends GenericConfig { + /** minimum confidence for a detected race before results are discarded */ + minConfidence: number; +} + +/** face gesture type */ +export declare type FaceGesture = `facing ${'left' | 'center' | 'right'}` | `blink ${'left' | 'right'} eye` | `mouth ${number}% open` | `head ${'up' | 'down'}`; + +/** Iris part of face configuration */ +export declare interface FaceIrisConfig extends GenericConfig { +} + +export declare type FaceLandmark = 'leftEye' | 'rightEye' | 'nose' | 'mouth' | 'leftEar' | 'rightEar' | 'symmetryLine' | 'silhouette' | 'lipsUpperOuter' | 'lipsLowerOuter' | 'lipsUpperInner' | 'lipsLowerInner' | 'rightEyeUpper0' | 'rightEyeLower0' | 'rightEyeUpper1' | 'rightEyeLower1' | 'rightEyeUpper2' | 'rightEyeLower2' | 'rightEyeLower3' | 'rightEyebrowUpper' | 'rightEyebrowLower' | 'rightEyeIris' | 'leftEyeUpper0' | 'leftEyeLower0' | 'leftEyeUpper1' | 'leftEyeLower1' | 'leftEyeUpper2' | 'leftEyeLower2' | 'leftEyeLower3' | 'leftEyebrowUpper' | 'leftEyebrowLower' | 'leftEyeIris' | 'midwayBetweenEyes' | 'noseTip' | 'noseBottom' | 'noseRightCorner' | 'noseLeftCorner' | 'rightCheek' | 'leftCheek'; + +/** Liveness part of face configuration */ +export declare interface FaceLivenessConfig extends GenericConfig { +} + +/** Mesh part of face configuration */ +export declare interface FaceMeshConfig extends GenericConfig { + /** Keep detected faces that cannot be verified using facemesh */ + keepInvalid: boolean; +} + +/** Face results + * - Combined results of face detector, face mesh, age, gender, emotion, embedding, iris models + * - Some values may be null if specific model is not enabled + */ +export declare interface FaceResult { + /** face id */ + id: number; + /** overall face score */ + score: number; + /** detection score */ + boxScore: number; + /** mesh score */ + faceScore: number; + /** detected face box */ + box: Box; + /** detected face box normalized to 0..1 */ + boxRaw: Box; + /** detected face mesh */ + mesh: Point[]; + /** detected face mesh normalized to 0..1 */ + meshRaw: Point[]; + /** face contours as array of 2d points normalized to 0..1 */ + /** face contours as array of 2d points */ + /** mesh keypoints combined into annotated results */ + annotations: Record; + /** detected age */ + age?: number; + /** detected gender */ + gender?: Gender; + /** gender detection score */ + genderScore?: number; + /** detected emotions */ + emotion?: { + score: number; + emotion: Emotion; + }[]; + /** detected race */ + race?: { + score: number; + race: Race; + }[]; + /** face descriptor */ + embedding?: number[]; + /** face distance from camera */ + distance?: number; + /** face anti-spoofing result confidence */ + real?: number; + /** face liveness result confidence */ + live?: number; + /** face rotation details */ + rotation?: { + angle: { + roll: number; + yaw: number; + pitch: number; + }; + matrix: [number, number, number, number, number, number, number, number, number]; + gaze: { + bearing: number; + strength: number; + }; + } | null; + /** detected face as tensor that can be used in further pipelines */ + tensor?: Tensor; +} + +/** Run input through image filters before inference + * - available only in Browser environments + * - image filters run with near-zero latency as they are executed on the GPU using WebGL + */ +export declare interface FilterConfig { + /** are image filters enabled? */ + enabled: boolean; + /** perform image histogram equalization + * - equalization is performed on input as a whole and detected face before its passed for further analysis + */ + equalization: boolean; + /** resize input width + * - if both width and height are set to 0, there is no resizing + * - if just one is set, second one is scaled automatically + * - if both are set, values are used as-is + */ + width: number; + /** resize input height + * - if both width and height are set to 0, there is no resizing + * - if just one is set, second one is scaled automatically + * - if both are set, values are used as-is + */ + height: number; + /** return processed canvas imagedata in result */ + return: boolean; + /** flip input as mirror image */ + flip: boolean; + /** apply auto-brighness */ + autoBrightness: boolean; + /** range: -1 (darken) to 1 (lighten) */ + brightness: number; + /** range: -1 (reduce contrast) to 1 (increase contrast) */ + contrast: number; + /** range: 0 (no sharpening) to 1 (maximum sharpening) */ + sharpness: number; + /** range: 0 (no blur) to N (blur radius in pixels) */ + blur: number; + /** range: -1 (reduce saturation) to 1 (increase saturation) */ + saturation: number; + /** range: 0 (no change) to 360 (hue rotation in degrees) */ + hue: number; + /** image negative */ + negative: boolean; + /** image sepia colors */ + sepia: boolean; + /** image vintage colors */ + vintage: boolean; + /** image kodachrome colors */ + kodachrome: boolean; + /** image technicolor colors */ + technicolor: boolean; + /** image polaroid camera effect */ + polaroid: boolean; + /** range: 0 (no pixelate) to N (number of pixels to pixelate) */ + pixelate: number; +} + +/** Matches given descriptor to a closest entry in array of descriptors + * @param descriptor - face descriptor + * @param descriptors - array of face descriptors to commpare given descriptor to + * @param options - see `similarity` method for options description + * Returns + * - `index` index array index where best match was found or -1 if no matches + * - `distance` calculated `distance` of given descriptor to the best match + * - `similarity` calculated normalized `similarity` of given descriptor to the best match + */ +declare function find(descriptor: Descriptor, descriptors: Descriptor[], options?: MatchOptions): { + index: number; + distance: number; + similarity: number; +}; + +export declare type Finger = 'index' | 'middle' | 'pinky' | 'ring' | 'thumb' | 'palm'; + +export declare type FingerCurl = 'none' | 'half' | 'full'; + +export declare type FingerDirection = 'verticalUp' | 'verticalDown' | 'horizontalLeft' | 'horizontalRight' | 'diagonalUpRight' | 'diagonalUpLeft' | 'diagonalDownRight' | 'diagonalDownLeft'; + +/** + * Creates an IOHandler that loads model artifacts from memory. + * + * When used in conjunction with `tf.loadLayersModel`, an instance of + * `tf.LayersModel` (Keras-style) can be constructed from the loaded artifacts. + * + * ```js + * const model = await tf.loadLayersModel(tf.io.fromMemory( + * modelTopology, weightSpecs, weightData)); + * ``` + * + * @param modelArtifacts a object containing model topology (i.e., parsed from + * the JSON format). + * @param weightSpecs An array of `WeightsManifestEntry` objects describing the + * names, shapes, types, and quantization of the weight data. Optional. + * @param weightData A single `ArrayBuffer` containing the weight data, + * concatenated in the order described by the weightSpecs. Optional. + * @param trainingConfig Model training configuration. Optional. + * + * @returns A passthrough `IOHandler` that simply loads the provided data. + */ +declare function fromMemory(modelArtifacts: {} | ModelArtifacts, weightSpecs?: WeightsManifestEntry[], weightData?: ArrayBuffer, trainingConfig?: TrainingConfig): IOHandler; + +/** + * Creates an IOHandler that loads model artifacts from memory. + * + * When used in conjunction with `tf.loadLayersModel`, an instance of + * `tf.LayersModel` (Keras-style) can be constructed from the loaded artifacts. + * + * ```js + * const model = await tf.loadLayersModel(tf.io.fromMemory( + * modelTopology, weightSpecs, weightData)); + * ``` + * + * @param modelArtifacts a object containing model topology (i.e., parsed from + * the JSON format). + * @param weightSpecs An array of `WeightsManifestEntry` objects describing the + * names, shapes, types, and quantization of the weight data. Optional. + * @param weightData A single `ArrayBuffer` containing the weight data, + * concatenated in the order described by the weightSpecs. Optional. + * @param trainingConfig Model training configuration. Optional. + * + * @returns A passthrough `IOHandlerSync` that simply loads the provided data. + */ +declare function fromMemorySync(modelArtifacts: {} | ModelArtifacts, weightSpecs?: WeightsManifestEntry[], weightData?: ArrayBuffer, trainingConfig?: TrainingConfig): IOHandlerSync; + +export declare type Gender = 'male' | 'female' | 'unknown'; + +/** Generic config type inherited by all module types */ +export declare interface GenericConfig { + /** is module enabled? */ + enabled: boolean; + /** path to model json file (relative to `modelBasePath` */ + modelPath: string; + /** how many max frames to go without re-running model if cached results are acceptable + * for two-phase models such as face and hand caching applies to bounding boxes detection only */ + skipFrames: number; + /** how many max milliseconds to go without re-running model if cached results are acceptable + * for two-phase models such as face and hand caching applies to bounding boxes detection only */ + skipTime: number; +} + +/** draw detected gestures */ +declare function gesture(inCanvas: AnyCanvas, result: GestureResult[], drawOptions?: Partial): void; + +/** Controlls gesture detection */ +export declare interface GestureConfig { + /** is gesture detection enabled? */ + enabled: boolean; +} + +/** Gesture combined results + * Each result has: + * - part: part name and number where gesture was detected: `face`, `iris`, `body`, `hand` + * - gesture: gesture detected + */ +export declare type GestureResult = { + 'face': number; + gesture: FaceGesture; +} | { + 'iris': number; + gesture: IrisGesture; +} | { + 'body': number; + gesture: BodyGesture; +} | { + 'hand': number; + gesture: HandGesture; +}; + +declare const getLoadHandlers: (url: string | string[], loadOptions?: LoadOptions) => IOHandler[]; + +/** + * Create `ModelArtifacts` from a JSON file. + * + * @param modelJSON Object containing the parsed JSON of `model.json` + * @param loadWeights Function that takes the JSON file's weights manifest, + * reads weights from the listed path(s), and returns a Promise of the + * weight manifest entries along with the weights data. + * @returns A Promise of the `ModelArtifacts`, as described by the JSON file. + */ +declare function getModelArtifactsForJSON(modelJSON: ModelJSON, loadWeights: (weightsManifest: WeightsManifestConfig) => Promise<[ +WeightsManifestEntry[], +ArrayBuffer +]>): Promise; + +/** + * Create `ModelArtifacts` from a JSON file and weights. + * + * @param modelJSON Object containing the parsed JSON of `model.json` + * @param weightSpecs The list of WeightsManifestEntry for the model. Must be + * passed if the modelJSON has a weightsManifest. + * @param weightData An ArrayBuffer of weight data for the model corresponding + * to the weights in weightSpecs. Must be passed if the modelJSON has a + * weightsManifest. + * @returns A Promise of the `ModelArtifacts`, as described by the JSON file. + */ +declare function getModelArtifactsForJSONSync(modelJSON: ModelJSON, weightSpecs?: WeightsManifestEntry[], weightData?: ArrayBuffer): ModelArtifacts; + +/** + * Populate ModelArtifactsInfo fields for a model with JSON topology. + * @param modelArtifacts + * @returns A ModelArtifactsInfo object. + */ +declare function getModelArtifactsInfoForJSON(modelArtifacts: ModelArtifacts): ModelArtifactsInfo; + +declare const getSaveHandlers: (url: string | string[]) => IOHandler[]; + +/** + * Concatenate the weights stored in a WeightsManifestConfig into a list of + * WeightsManifestEntry + * + * @param weightsManifest The WeightsManifestConfig to extract weights from. + * @returns A list of WeightsManifestEntry of the weights in the weightsManifest + */ +declare function getWeightSpecs(weightsManifest: WeightsManifestConfig): WeightsManifestEntry[]; + +declare interface GPUData { + tensorRef: Tensor; + texture?: WebGLTexture; + buffer?: GPUBuffer; + texShape?: [number, number]; + bufSize?: number; +} + +/** + * A `tf.GraphModel` is a directed, acyclic graph built from a + * SavedModel GraphDef and allows inference execution. + * + * A `tf.GraphModel` can only be created by loading from a model converted from + * a [TensorFlow SavedModel](https://www.tensorflow.org/guide/saved_model) using + * the command line converter tool and loaded via `tf.loadGraphModel`. + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ +export declare class GraphModel implements InferenceModel { + private modelUrl; + private loadOptions; + private executor; + private version; + private handler; + private artifacts; + private initializer; + private resourceIdToCapturedInput; + private resourceManager; + private signature; + private initializerSignature; + private structuredOutputKeys; + private readonly io; + get modelVersion(): string; + get inputNodes(): string[]; + get outputNodes(): string[]; + get inputs(): TensorInfo[]; + get outputs(): TensorInfo[]; + get weights(): NamedTensorsMap; + get metadata(): {}; + get modelSignature(): {}; + get modelStructuredOutputKeys(): {}; + /** + * @param modelUrl url for the model, or an `io.IOHandler`. + * @param weightManifestUrl url for the weight file generated by + * scripts/convert.py script. + * @param requestOption options for Request, which allows to send credentials + * and custom headers. + * @param onProgress Optional, progress callback function, fired periodically + * before the load is completed. + */ + constructor(modelUrl: ModelURL, loadOptions?: io.LoadOptions, tfio?: typeof io); + private findIOHandler; + /** + * Loads the model and weight files, construct the in memory weight map and + * compile the inference graph. + */ + load(): UrlIOHandler extends io.IOHandlerSync ? boolean : Promise; + /** + * Synchronously construct the in memory weight map and + * compile the inference graph. + * + * @doc {heading: 'Models', subheading: 'Classes', ignoreCI: true} + */ + loadSync(artifacts: io.ModelArtifacts): boolean; + /** + * Save the configuration and/or weights of the GraphModel. + * + * An `IOHandler` is an object that has a `save` method of the proper + * signature defined. The `save` method manages the storing or + * transmission of serialized data ("artifacts") that represent the + * model's topology and weights onto or via a specific medium, such as + * file downloads, local storage, IndexedDB in the web browser and HTTP + * requests to a server. TensorFlow.js provides `IOHandler` + * implementations for a number of frequently used saving mediums, such as + * `tf.io.browserDownloads` and `tf.io.browserLocalStorage`. See `tf.io` + * for more details. + * + * This method also allows you to refer to certain types of `IOHandler`s + * as URL-like string shortcuts, such as 'localstorage://' and + * 'indexeddb://'. + * + * Example 1: Save `model`'s topology and weights to browser [local + * storage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage); + * then load it back. + * + * ```js + * const modelUrl = + * 'https://storage.googleapis.com/tfjs-models/savedmodel/mobilenet_v2_1.0_224/model.json'; + * const model = await tf.loadGraphModel(modelUrl); + * const zeros = tf.zeros([1, 224, 224, 3]); + * model.predict(zeros).print(); + * + * const saveResults = await model.save('localstorage://my-model-1'); + * + * const loadedModel = await tf.loadGraphModel('localstorage://my-model-1'); + * console.log('Prediction from loaded model:'); + * model.predict(zeros).print(); + * ``` + * + * @param handlerOrURL An instance of `IOHandler` or a URL-like, + * scheme-based string shortcut for `IOHandler`. + * @param config Options for saving the model. + * @returns A `Promise` of `SaveResult`, which summarizes the result of + * the saving, such as byte sizes of the saved artifacts for the model's + * topology and weight values. + * + * @doc {heading: 'Models', subheading: 'Classes', ignoreCI: true} + */ + save(handlerOrURL: io.IOHandler | string, config?: io.SaveConfig): Promise; + /** + * Execute the inference for the input tensors. + * + * @param input The input tensors, when there is single input for the model, + * inputs param should be a `tf.Tensor`. For models with mutliple inputs, + * inputs params should be in either `tf.Tensor`[] if the input order is + * fixed, or otherwise NamedTensorMap format. + * + * For model with multiple inputs, we recommend you use NamedTensorMap as the + * input type, if you use `tf.Tensor`[], the order of the array needs to + * follow the + * order of inputNodes array. @see {@link GraphModel.inputNodes} + * + * You can also feed any intermediate nodes using the NamedTensorMap as the + * input type. For example, given the graph + * InputNode => Intermediate => OutputNode, + * you can execute the subgraph Intermediate => OutputNode by calling + * model.execute('IntermediateNode' : tf.tensor(...)); + * + * This is useful for models that uses tf.dynamic_rnn, where the intermediate + * state needs to be fed manually. + * + * For batch inference execution, the tensors for each input need to be + * concatenated together. For example with mobilenet, the required input shape + * is [1, 244, 244, 3], which represents the [batch, height, width, channel]. + * If we are provide a batched data of 100 images, the input tensor should be + * in the shape of [100, 244, 244, 3]. + * + * @param config Prediction configuration for specifying the batch size. + * Currently the batch size option is ignored for graph model. + * + * @returns Inference result tensors. If the model is converted and it + * originally had structured_outputs in tensorflow, then a NamedTensorMap + * will be returned matching the structured_outputs. If no structured_outputs + * are present, the output will be single `tf.Tensor` if the model has single + * output node, otherwise Tensor[]. + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ + predict(inputs: Tensor | Tensor[] | NamedTensorMap, config?: ModelPredictConfig): Tensor | Tensor[] | NamedTensorMap; + private normalizeInputs; + private normalizeOutputs; + private executeInitializerGraph; + private executeInitializerGraphAsync; + private setResourceIdToCapturedInput; + /** + * Executes inference for the model for given input tensors. + * @param inputs tensor, tensor array or tensor map of the inputs for the + * model, keyed by the input node names. + * @param outputs output node name from the TensorFlow model, if no + * outputs are specified, the default outputs of the model would be used. + * You can inspect intermediate nodes of the model by adding them to the + * outputs array. + * + * @returns A single tensor if provided with a single output or no outputs + * are provided and there is only one default output, otherwise return a + * tensor array. The order of the tensor array is the same as the outputs + * if provided, otherwise the order of outputNodes attribute of the model. + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ + execute(inputs: Tensor | Tensor[] | NamedTensorMap, outputs?: string | string[]): Tensor | Tensor[]; + /** + * Executes inference for the model for given input tensors in async + * fashion, use this method when your model contains control flow ops. + * @param inputs tensor, tensor array or tensor map of the inputs for the + * model, keyed by the input node names. + * @param outputs output node name from the TensorFlow model, if no outputs + * are specified, the default outputs of the model would be used. You can + * inspect intermediate nodes of the model by adding them to the outputs + * array. + * + * @returns A Promise of single tensor if provided with a single output or + * no outputs are provided and there is only one default output, otherwise + * return a tensor map. + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ + executeAsync(inputs: Tensor | Tensor[] | NamedTensorMap, outputs?: string | string[]): Promise; + /** + * Get intermediate tensors for model debugging mode (flag + * KEEP_INTERMEDIATE_TENSORS is true). + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ + getIntermediateTensors(): NamedTensorsMap; + /** + * Dispose intermediate tensors for model debugging mode (flag + * KEEP_INTERMEDIATE_TENSORS is true). + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ + disposeIntermediateTensors(): void; + private convertTensorMapToTensorsMap; + /** + * Releases the memory used by the weight tensors and resourceManager. + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ + dispose(): void; +} + +/** draw detected hands */ +declare function hand(inCanvas: AnyCanvas, result: HandResult[], drawOptions?: Partial): void; + +/** Configures all hand detection specific options */ +export declare interface HandConfig extends GenericConfig { + /** should hand rotation correction be performed after hand detection? */ + rotation: boolean; + /** minimum confidence for a detected hand before results are discarded */ + minConfidence: number; + /** minimum overlap between two detected hands before one is discarded */ + iouThreshold: number; + /** maximum number of detected hands */ + maxDetected: number; + /** should hand landmarks be detected or just return detected hand box */ + landmarks: boolean; + detector: { + /** path to hand detector model json */ + modelPath?: string; + }; + skeleton: { + /** path to hand skeleton model json */ + modelPath?: string; + }; +} + +/** hand gesture type */ +export declare type HandGesture = `${'thumb' | 'index' | 'middle' | 'ring' | 'pinky'} forward` | `${'thumb' | 'index' | 'middle' | 'ring' | 'pinky'} up` | 'victory' | 'thumbs up'; + +/** Hand results */ +export declare interface HandResult { + /** hand id */ + id: number; + /** hand overal score */ + score: number; + /** hand detection score */ + boxScore: number; + /** hand skelton score */ + fingerScore: number; + /** detected hand box */ + box: Box; + /** detected hand box normalized to 0..1 */ + boxRaw: Box; + /** detected hand keypoints */ + keypoints: Point[]; + /** detected hand class */ + label: HandType; + /** detected hand keypoints combined into annotated parts */ + annotations: Record; + /** detected hand parts annotated with part gestures */ + landmarks: Record; +} + +export declare type HandType = 'hand' | 'fist' | 'pinch' | 'point' | 'face' | 'tip' | 'pinchtip'; + +/** + * Creates an IOHandler subtype that sends model artifacts to HTTP server. + * + * An HTTP request of the `multipart/form-data` mime type will be sent to the + * `path` URL. The form data includes artifacts that represent the topology + * and/or weights of the model. In the case of Keras-style `tf.Model`, two + * blobs (files) exist in form-data: + * - A JSON file consisting of `modelTopology` and `weightsManifest`. + * - A binary weights file consisting of the concatenated weight values. + * These files are in the same format as the one generated by + * [tfjs_converter](https://js.tensorflow.org/tutorials/import-keras.html). + * + * The following code snippet exemplifies the client-side code that uses this + * function: + * + * ```js + * const model = tf.sequential(); + * model.add( + * tf.layers.dense({units: 1, inputShape: [100], activation: 'sigmoid'})); + * + * const saveResult = await model.save(tf.io.http( + * 'http://model-server:5000/upload', {requestInit: {method: 'PUT'}})); + * console.log(saveResult); + * ``` + * + * If the default `POST` method is to be used, without any custom parameters + * such as headers, you can simply pass an HTTP or HTTPS URL to `model.save`: + * + * ```js + * const saveResult = await model.save('http://model-server:5000/upload'); + * ``` + * + * The following GitHub Gist + * https://gist.github.com/dsmilkov/1b6046fd6132d7408d5257b0976f7864 + * implements a server based on [flask](https://github.com/pallets/flask) that + * can receive the request. Upon receiving the model artifacts via the requst, + * this particular server reconstitutes instances of [Keras + * Models](https://keras.io/models/model/) in memory. + * + * + * @param path A URL path to the model. + * Can be an absolute HTTP path (e.g., + * 'http://localhost:8000/model-upload)') or a relative path (e.g., + * './model-upload'). + * @param requestInit Request configurations to be used when sending + * HTTP request to server using `fetch`. It can contain fields such as + * `method`, `credentials`, `headers`, `mode`, etc. See + * https://developer.mozilla.org/en-US/docs/Web/API/Request/Request + * for more information. `requestInit` must not have a body, because the + * body will be set by TensorFlow.js. File blobs representing the model + * topology (filename: 'model.json') and the weights of the model (filename: + * 'model.weights.bin') will be appended to the body. If `requestInit` has a + * `body`, an Error will be thrown. + * @param loadOptions Optional configuration for the loading. It includes the + * following fields: + * - weightPathPrefix Optional, this specifies the path prefix for weight + * files, by default this is calculated from the path param. + * - fetchFunc Optional, custom `fetch` function. E.g., in Node.js, + * the `fetch` from node-fetch can be used here. + * - onProgress Optional, progress callback function, fired periodically + * before the load is completed. + * @returns An instance of `IOHandler`. + * + * @doc { + * heading: 'Models', + * subheading: 'Loading', + * namespace: 'io', + * ignoreCI: true + * } + */ +declare function http(path: string, loadOptions?: LoadOptions): IOHandler; + +/** **Human** library main class + * + * All methods and properties are available only as members of Human class + * + * - Configuration object definition: {@link Config} + * - Results object definition: {@link Result} + * - Possible inputs: {@link Input} + * + * @param userConfig - {@link Config} + * @returns instance of {@link Human} + */ +declare class Human { + #private; + /** Current version of Human library in *semver* format */ + version: string; + /** Current configuration + * - Defaults: [config](https://github.com/vladmandic/human/blob/main/src/config.ts#L262) + */ + config: Config; + /** Last known result of detect run + * - Can be accessed anytime after initial detection + */ + result: Result; + /** Current state of Human library + * - Can be polled to determine operations that are currently executed + * - Progresses through: 'config', 'check', 'backend', 'load', 'run:', 'idle' + */ + state: string; + /** currenty processed image tensor and canvas */ + process: { + tensor: Tensor | null; + canvas: AnyCanvas | null; + }; + /** Instance of TensorFlow/JS used by Human + * - Can be embedded or externally provided + * [TFJS API](https://js.tensorflow.org/api/latest/) + */ + tf: any; + /** Object containing environment information used for diagnostics */ + env: Env; + /** Draw helper classes that can draw detected objects on canvas using specified draw + * - canvas: draws input to canvas + * - options: are global settings for all draw operations, can be overriden for each draw method {@link DrawOptions} + * - face, body, hand, gesture, object, person: draws detected results as overlays on canvas + */ + draw: typeof draw; + /** Face Matching + * - similarity: compare two face descriptors and return similarity index + * - distance: compare two face descriptors and return raw calculated differences + * - find: compare face descriptor to array of face descriptors and return best match + */ + match: typeof match; + /** Currently loaded models + * @internal + * {@link models#Models} + */ + models: models.Models; + /** Container for events dispatched by Human + * Possible events: + * - `create`: triggered when Human object is instantiated + * - `load`: triggered when models are loaded (explicitly or on-demand) + * - `image`: triggered when input image is processed + * - `result`: triggered when detection is complete + * - `warmup`: triggered when warmup is complete + * - `error`: triggered on some errors + */ + events: EventTarget | undefined; + /** Reference face triangualtion array of 468 points, used for triangle references between points */ + faceTriangulation: number[]; + /** Refernce UV map of 468 values, used for 3D mapping of the face mesh */ + faceUVMap: [number, number][]; + /** Performance object that contains values for all recently performed operations */ + performance: Record; + /** Constructor for **Human** library that is futher used for all operations + * @param userConfig - user configuration object {@link Config} + */ + constructor(userConfig?: Partial); + /** internal function to measure tensor leaks */ + analyze: (...msg: string[]) => void; + /** Reset configuration to default values */ + reset(): void; + /** Validate current configuration schema */ + validate(userConfig?: Partial): { + reason: string; + where: string; + expected?: string; + }[]; + /** Utility wrapper for performance.now() */ + now(): number; + /** Process input as return canvas and tensor + * + * @param input - any input {@link Input} + * @param getTensor - should image processing also return tensor or just canvas + * Returns object with `tensor` and `canvas` + */ + image(input: Input, getTensor?: boolean): Promise<{ + tensor: Tensor4D | null; + canvas: AnyCanvas | null; + }>; + /** Segmentation method takes any input and returns RGBA tensor + * Note: Segmentation is not triggered as part of detect process + * + * @param input - {@link Input} + * Returns tensor which contains image data in RGBA format + */ + segmentation(input: Input, userConfig?: Partial): Promise; + /** Compare two input tensors for pixel similarity + * - use `human.image` to process any valid input and get a tensor that can be used for compare + * - when passing manually generated tensors: + * - both input tensors must be in format [1, height, width, 3] + * - if resolution of tensors does not match, second tensor will be resized to match resolution of the first tensor + * - return value is pixel similarity score normalized by input resolution and rgb channels + */ + compare(firstImageTensor: Tensor, secondImageTensor: Tensor): Promise; + /** Explicit backend initialization + * - Normally done implicitly during initial load phase + * - Call to explictly register and initialize TFJS backend without any other operations + * - Use when changing backend during runtime + */ + init(): Promise; + /** WebCam helper methods + * + */ + webcam: WebCam; + /** Load method preloads all configured models on-demand + * - Not explicitly required as any required model is load implicitly on it's first run + * + * @param userConfig - {@link Config} + */ + load(userConfig?: Partial): Promise; + /** emit event */ + emit: (event: string) => void; + /** Runs interpolation using last known result and returns smoothened result + * Interpolation is based on time since last known result so can be called independently + * + * @param result - {@link Result} optional use specific result set to run interpolation on + * @returns result - {@link Result} + */ + next(result?: Result): Result; + /** Warmup method pre-initializes all configured models for faster inference + * - can take significant time on startup + * - only used for `webgl` and `humangl` backends + * @param userConfig - {@link Config} + * @returns result - {@link Result} + */ + warmup(userConfig?: Partial): Promise; + /** Run detect with tensorflow profiling + * - result object will contain total exeuction time information for top-20 kernels + * - actual detection object can be accessed via `human.result` + */ + profile(input: Input, userConfig?: Partial): Promise<{ + kernel: string; + time: number; + perc: number; + }[]>; + /** Main detection method + * - Analyze configuration: {@link Config} + * - Pre-process input: {@link Input} + * - Run inference for all configured models + * - Process and return result: {@link Result} + * + * @param input - {@link Input} + * @param userConfig - {@link Config} + * @returns result - {@link Result} + */ + detect(input: Input, userConfig?: Partial): Promise; + /** Helper function + * @param ms - sleep time in miliseconds + */ + sleep(ms: number): Promise; + /** Continously detect video frames + * @param element - HTMLVideoElement input + * @param run - boolean run continously or stop if already running, default true + * @param delay - number delay detection between frames for number of miliseconds, default 0 + */ + video(element: HTMLVideoElement, run?: boolean, delay?: number): Promise; +} +export { Human } +export default Human; + +/** Defines all possible image objects */ +export declare type ImageObjects = ImageData | ImageBitmap; + +/** + * Common interface for a machine learning model that can do inference. + */ +declare interface InferenceModel { + /** + * Return the array of input tensor info. + */ + readonly inputs: ModelTensorInfo[]; + /** + * Return the array of output tensor info. + */ + readonly outputs: ModelTensorInfo[]; + /** + * Execute the inference for the input tensors. + * + * @param input The input tensors, when there is single input for the model, + * inputs param should be a Tensor. For models with multiple inputs, inputs + * params should be in either Tensor[] if the input order is fixed, or + * otherwise NamedTensorMap format. + * For batch inference execution, the tensors for each input need to be + * concatenated together. For example with mobilenet, the required input shape + * is [1, 244, 244, 3], which represents the [batch, height, width, channel]. + * If we are provide a batched data of 100 images, the input tensor should be + * in the shape of [100, 244, 244, 3]. + * + * @param config Prediction configuration for specifying the batch size. + * + * @returns Inference result tensors. The output would be single Tensor if + * model has single output node, otherwise Tensor[] or NamedTensorMap[] will + * be returned for model with multiple outputs. + */ + predict(inputs: Tensor | Tensor[] | NamedTensorMap, config: ModelPredictConfig): Tensor | Tensor[] | NamedTensorMap; + /** + * Single Execute the inference for the input tensors and return activation + * values for specified output node names without batching. + * + * @param input The input tensors, when there is single input for the model, + * inputs param should be a Tensor. For models with multiple inputs, inputs + * params should be in either Tensor[] if the input order is fixed, or + * otherwise NamedTensorMap format. + * + * @param outputs string|string[]. List of output node names to retrieve + * activation from. + * + * @returns Activation values for the output nodes result tensors. The return + * type matches specified parameter outputs type. The output would be single + * Tensor if single output is specified, otherwise Tensor[] for multiple + * outputs. + */ + execute(inputs: Tensor | Tensor[] | NamedTensorMap, outputs: string | string[]): Tensor | Tensor[]; +} + +/** sets default label templates for face/body/hand/object/gestures */ +declare function init(): void; + +/** Defines all possible input types for **Human** detection */ +export declare type Input = Tensor | AnyCanvas | AnyImage | AnyVideo | ImageObjects | ExternalCanvas; + +declare namespace io { + export { + copyModel, + listModels, + moveModel, + removeModel, + browserFiles, + browserHTTPRequest, + concatenateArrayBuffers, + decodeWeights, + encodeWeights, + fromMemory, + fromMemorySync, + getLoadHandlers, + getModelArtifactsForJSON, + getModelArtifactsForJSONSync, + getModelArtifactsInfoForJSON, + getSaveHandlers, + getWeightSpecs, + http, + IOHandler, + IOHandlerSync, + isHTTPScheme, + LoadHandler, + LoadOptions, + loadWeights, + ModelArtifacts, + ModelArtifactsInfo, + ModelJSON, + ModelStoreManager, + OnProgressCallback, + registerLoadRouter, + registerSaveRouter, + RequestDetails, + SaveConfig, + SaveHandler, + SaveResult, + TrainingConfig, + WeightGroup, + weightsLoaderFactory, + WeightsManifestConfig, + WeightsManifestEntry, + withSaveHandler, + withSaveHandlerSync + } +} + +/** + * Interface for a model import/export handler. + * + * The `save` and `load` handlers are both optional, in order to allow handlers + * that support only saving or loading. + */ +declare interface IOHandler { + save?: SaveHandler; + load?: LoadHandler; +} + +/** + * Interface for a synchronous model import/export handler. + * + * The `save` and `load` handlers are both optional, in order to allow handlers + * that support only saving or loading. + */ +declare type IOHandlerSync = { + save?: SaveHandlerSync; + load?: LoadHandlerSync; +}; + +declare type IORouter = (url: string | string[], loadOptions?: LoadOptions) => IOHandler; + +/** iris gesture type */ +export declare type IrisGesture = 'facing center' | `looking ${'left' | 'right' | 'up' | 'down'}` | 'looking center'; + +declare function isHTTPScheme(url: string): boolean; + +declare interface KernelOps { + name: string; + url: string; + missing: string[]; + ops: string[]; +} + +/** + * List all models stored in registered storage mediums. + * + * For a web browser environment, the registered mediums are Local Storage and + * IndexedDB. + * + * ```js + * // First create and save a model. + * const model = tf.sequential(); + * model.add(tf.layers.dense( + * {units: 1, inputShape: [10], activation: 'sigmoid'})); + * await model.save('localstorage://demo/management/model1'); + * + * // Then list existing models. + * console.log(JSON.stringify(await tf.io.listModels())); + * + * // Delete the model. + * await tf.io.removeModel('localstorage://demo/management/model1'); + * + * // List models again. + * console.log(JSON.stringify(await tf.io.listModels())); + * ``` + * + * @returns A `Promise` of a dictionary mapping URLs of existing models to + * their model artifacts info. URLs include medium-specific schemes, e.g., + * 'indexeddb://my/model/1'. Model artifacts info include type of the + * model's topology, byte sizes of the topology, weights, etc. + * + * @doc { + * heading: 'Models', + * subheading: 'Management', + * namespace: 'io', + * ignoreCI: true + * } + */ +declare function listModels(): Promise<{ + [url: string]: ModelArtifactsInfo; +}>; + +/** + * Type definition for handlers of loading operations. + */ +declare type LoadHandler = () => Promise; + +/** + * Type definition for handlers of synchronous loading operations. + */ +declare type LoadHandlerSync = () => ModelArtifacts; + +/** @innamespace io */ +declare interface LoadOptions { + /** + * RequestInit (options) for HTTP requests. + * + * For detailed information on the supported fields, see + * [https://developer.mozilla.org/en-US/docs/Web/API/Request/Request]( + * https://developer.mozilla.org/en-US/docs/Web/API/Request/Request) + */ + requestInit?: RequestInit; + /** + * Progress callback. + */ + onProgress?: OnProgressCallback; + /** + * A function used to override the `window.fetch` function. + */ + fetchFunc?: Function; + /** + * Strict loading model: whether extraneous weights or missing + * weights should trigger an `Error`. + * + * If `true`, require that the provided weights exactly match those + * required by the layers. `false` means that both extra weights + * and missing weights will be silently ignored. + * + * Default: `true`. + */ + strict?: boolean; + /** + * Path prefix for weight files, by default this is calculated from the + * path of the model JSON file. + * + * For instance, if the path to the model JSON file is + * `http://localhost/foo/model.json`, then the default path prefix will be + * `http://localhost/foo/`. If a weight file has the path value + * `group1-shard1of2` in the weight manifest, then the weight file will be + * loaded from `http://localhost/foo/group1-shard1of2` by default. However, + * if you provide a `weightPathPrefix` value of + * `http://localhost/foo/alt-weights`, then the weight file will be loaded + * from the path `http://localhost/foo/alt-weights/group1-shard1of2` instead. + */ + weightPathPrefix?: string; + /** + * Whether the module or model is to be loaded from TF Hub. + * + * Setting this to `true` allows passing a TF-Hub module URL, omitting the + * standard model file name and the query parameters. + * + * Default: `false`. + */ + fromTFHub?: boolean; + /** + * An async function to convert weight file name to URL. The weight file + * names are stored in model.json's weightsManifest.paths field. By default we + * consider weight files are colocated with the model.json file. For example: + * model.json URL: https://www.google.com/models/1/model.json + * group1-shard1of1.bin url: + * https://www.google.com/models/1/group1-shard1of1.bin + * + * With this func you can convert the weight file name to any URL. + */ + weightUrlConverter?: (weightFileName: string) => Promise; +} + +/** + * Reads a weights manifest JSON configuration, fetches the weights and + * returns them as `Tensor`s. + * + * @param manifest The weights manifest JSON. + * @param filePathPrefix The path prefix for filenames given in the manifest. + * Defaults to the empty string. + * @param weightNames The names of the weights to be fetched. + */ +declare function loadWeights(manifest: WeightsManifestConfig, filePathPrefix?: string, weightNames?: string[], requestInit?: RequestInit): Promise; + +declare namespace match { + export { + distance, + similarity, + find, + Descriptor, + MatchOptions + } +} +export { match } + +declare type MatchOptions = { + order?: number; + threshold?: number; + multiplier?: number; + min?: number; + max?: number; +} | undefined; + +/** + * The serialized artifacts of a model, including topology and weights. + * + * The `modelTopology`, `trainingConfig`, `weightSpecs` and `weightData` fields + * of this interface are optional, in order to support topology- or weights-only + * saving and loading. + * + * Note this interface is used internally in IOHandlers. For the file format + * written to disk as `model.json`, see `ModelJSON`. + */ +declare interface ModelArtifacts { + /** + * Model topology. + * + * For Keras-style `tf.Model`s, this is a JSON object. + * For TensorFlow-style models (e.g., `SavedModel`), this is the JSON + * encoding of the `GraphDef` protocol buffer. + */ + modelTopology?: {} | ArrayBuffer; + /** + * Serialized configuration for the model's training. + */ + trainingConfig?: TrainingConfig; + /** + * Weight specifications. + * + * This corresponds to the weightsData below. + */ + weightSpecs?: WeightsManifestEntry[]; + /** + * Binary buffer for all weight values concatenated in the order specified + * by `weightSpecs`. + */ + weightData?: ArrayBuffer; + /** + * Hard-coded format name for models saved from TensorFlow.js or converted + * by TensorFlow.js Converter. + */ + format?: string; + /** + * What library is responsible for originally generating this artifact. + * + * Used for debugging purposes. E.g., 'TensorFlow.js v1.0.0'. + */ + generatedBy?: string; + /** + * What library or tool is responsible for converting the original model + * to this format, applicable only if the model is output by a converter. + * + * Used for debugging purposes. E.g., 'TensorFlow.js Converter v1.0.0'. + * + * A value of `null` means the model artifacts are generated without any + * conversion process (e.g., saved directly from a TensorFlow.js + * `tf.LayersModel` instance.) + */ + convertedBy?: string | null; + /** + * Inputs and outputs signature for saved model. + */ + signature?: {}; + /** + * User-defined metadata about the model. + */ + userDefinedMetadata?: { + [key: string]: {}; + }; + /** + * Initializer for the model. + */ + modelInitializer?: {}; + /** + * Inputs and outputs signature for model initializer. + */ + initializerSignature?: {}; +} + +declare interface ModelArtifactsInfo { + /** + * Timestamp for when the model is saved. + */ + dateSaved: Date; + /** + * TODO (cais,yassogba) consider removing GraphDef as GraphDefs now + * come in a JSON format and none of our IOHandlers support a non json + * format. We could conder replacing this with 'Binary' if we want to + * allow future handlers to save to non json formats (though they will + * probably want more information than 'Binary'). + * Type of the model topology + * + * Type of the model topology + * + * Possible values: + * - JSON: JSON config (human-readable, e.g., Keras JSON). + * - GraphDef: TensorFlow + * [GraphDef](https://www.tensorflow.org/extend/tool_developers/#graphdef) + * protocol buffer (binary). + */ + modelTopologyType: 'JSON' | 'GraphDef'; + /** + * Size of model topology (Keras JSON or GraphDef), in bytes. + */ + modelTopologyBytes?: number; + /** + * Size of weight specification or manifest, in bytes. + */ + weightSpecsBytes?: number; + /** + * Size of weight value data, in bytes. + */ + weightDataBytes?: number; +} + +export declare interface ModelInfo { + name: string; + inCache: boolean; + sizeDesired: number; + sizeFromManifest: number; + sizeLoadedWeights: number; + url: string; +} + +/** + * The on-disk format of the `model.json` file. + * + * TF.js 1.0 always populates the optional fields when writing model.json. + * Prior versions did not provide those fields. + */ +declare interface ModelJSON { + /** + * Model topology. + * + * For Keras-style `tf.Model`s, this is a JSON object. + * For TensorFlow-style models (e.g., `SavedModel`), this is the JSON + * encoding of the `GraphDef` protocol buffer. + */ + modelTopology: {}; + /** Model training configuration. */ + trainingConfig?: TrainingConfig; + /** + * Weights manifest. + * + * The weights manifest consists of an ordered list of weight-manifest + * groups. Each weight-manifest group consists of a number of weight values + * stored in a number of paths. See the documentation of + * `WeightsManifestConfig` for more details. + */ + weightsManifest: WeightsManifestConfig; + /** + * Hard-coded format name for models saved from TensorFlow.js or converted + * by TensorFlow.js Converter. + */ + format?: string; + /** + * What library is responsible for originally generating this artifact. + * + * Used for debugging purposes. E.g., 'TensorFlow.js v1.0.0'. + */ + generatedBy?: string; + /** + * What library or tool is responsible for converting the original model + * to this format, applicable only if the model is output by a converter. + * + * Used for debugging purposes. E.g., 'TensorFlow.js Converter v1.0.0'. + * + * A value of `null` means the model artifacts are generated without any + * conversion process (e.g., saved directly from a TensorFlow.js + * `tf.LayersModel` instance.) + */ + convertedBy?: string | null; + /** + * Inputs and outputs signature for saved model. + */ + signature?: {}; + /** + * User-defined metadata about the model. + */ + userDefinedMetadata?: { + [key: string]: {}; + }; + /** + * Initializer for the model. + */ + modelInitializer?: {}; + /** + * Inputs and outputs signature for model initializer. + */ + initializerSignature?: {}; +} + +declare interface ModelPredictConfig { + /** + * Optional. Batch size (Integer). If unspecified, it will default to 32. + */ + batchSize?: number; + /** + * Optional. Verbosity mode. Defaults to false. + */ + verbose?: boolean; +} + +/** Models class used by Human + * - models: record of all GraphModels + * - list: returns list of configured models with their stats + * - loaded: returns array of loaded models + * - reset: unloads all models + * - validate: checks loaded models for valid kernel ops vs current backend + * - stats: live detailed model stats that can be checked during model load phase + */ +declare class Models { + instance: Human; + models: Record; + constructor(currentInstance: Human); + stats(): ModelStats; + reset(): void; + load(): Promise; + list(): { + name: string; + loaded: boolean; + size: number; + url: any; + }[]; + loaded(): string[]; + validate(): { + name: string; + missing: string[]; + }[]; +} + +declare namespace models { + export { + validateModel, + KernelOps, + ModelStats, + Models + } +} +export { models } + +/** structure that holds global stats for currently loaded models */ +declare interface ModelStats { + numLoadedModels: number; + numDefinedModels: number; + percentageLoaded: number; + totalSizeFromManifest: number; + totalSizeWeights: number; + totalSizeLoading: number; + modelStats: ModelInfo[]; +} + +/** + * An interface for the manager of a model store. + * + * A model store is defined as a storage medium on which multiple models can + * be stored. Each stored model has a unique `path` as its identifier. + * A `ModelStoreManager` for the store allows actions including + * + * - Listing the models stored in the store. + * - Deleting a model from the store. + */ +declare interface ModelStoreManager { + /** + * List all models in the model store. + * + * @returns A dictionary mapping paths of existing models to their + * model artifacts info. Model artifacts info include type of the model's + * topology, byte sizes of the topology, weights, etc. + */ + listModels(): Promise<{ + [path: string]: ModelArtifactsInfo; + }>; + /** + * Remove a model specified by `path`. + * + * @param path + * @returns ModelArtifactsInfo of the deleted model (if and only if deletion + * is successful). + * @throws Error if deletion fails, e.g., if no model exists at `path`. + */ + removeModel(path: string): Promise; +} + +/** + * Interface for model input/output tensor info. + */ +declare interface ModelTensorInfo { + name: string; + shape?: number[]; + dtype: DataType; + tfDtype?: string; +} + +/** + * Move a model from one URL to another. + * + * This function supports: + * + * 1. Moving within a storage medium, e.g., + * `tf.io.moveModel('localstorage://model-1', 'localstorage://model-2')` + * 2. Moving between two storage mediums, e.g., + * `tf.io.moveModel('localstorage://model-1', 'indexeddb://model-1')` + * + * ```js + * // First create and save a model. + * const model = tf.sequential(); + * model.add(tf.layers.dense( + * {units: 1, inputShape: [10], activation: 'sigmoid'})); + * await model.save('localstorage://demo/management/model1'); + * + * // Then list existing models. + * console.log(JSON.stringify(await tf.io.listModels())); + * + * // Move the model, from Local Storage to IndexedDB. + * await tf.io.moveModel( + * 'localstorage://demo/management/model1', + * 'indexeddb://demo/management/model1'); + * + * // List models again. + * console.log(JSON.stringify(await tf.io.listModels())); + * + * // Remove the moved model. + * await tf.io.removeModel('indexeddb://demo/management/model1'); + * ``` + * + * @param sourceURL Source URL of moving. + * @param destURL Destination URL of moving. + * @returns ModelArtifactsInfo of the copied model (if and only if copying + * is successful). + * @throws Error if moving fails, e.g., if no model exists at `sourceURL`, or + * if `oldPath` and `newPath` are identical. + * + * @doc { + * heading: 'Models', + * subheading: 'Management', + * namespace: 'io', + * ignoreCI: true + * } + */ +declare function moveModel(sourceURL: string, destURL: string): Promise; + +declare interface NamedTensor { + name: string; + tensor: Tensor; +} + +/** @docalias {[name: string]: Tensor} */ +declare type NamedTensorMap = { + [name: string]: Tensor; +}; + +declare type NamedTensorsMap = { + [key: string]: Tensor[]; +}; + +declare type NumericDataType = 'float32' | 'int32' | 'bool' | 'complex64'; + +/** draw detected objects */ +declare function object(inCanvas: AnyCanvas, result: ObjectResult[], drawOptions?: Partial): void; + +/** Configures all object detection specific options */ +export declare interface ObjectConfig extends GenericConfig { + /** minimum confidence for a detected objects before results are discarded */ + minConfidence: number; + /** minimum overlap between two detected objects before one is discarded */ + iouThreshold: number; + /** maximum number of detected objects */ + maxDetected: number; +} + +/** Object results */ +export declare interface ObjectResult { + /** object id */ + id: number; + /** object detection score */ + score: number; + /** detected object class id */ + class: number; + /** detected object class name */ + label: ObjectType; + /** detected object box */ + box: Box; + /** detected object box normalized to 0..1 */ + boxRaw: Box; +} + +export declare type ObjectType = 'person' | 'bicycle' | 'car' | 'motorcycle' | 'airplane' | 'bus' | 'train' | 'truck' | 'boat' | 'traffic light' | 'fire hydrant' | 'stop sign' | 'parking meter' | 'bench' | 'bird' | 'cat' | 'dog' | 'horse' | 'sheep' | 'cow' | 'elephant' | 'bear' | 'zebra' | 'giraffe' | 'backpack' | 'umbrella' | 'handbag' | 'tie' | 'suitcase' | 'frisbee' | 'skis' | 'snowboard' | 'sports ball' | 'kite' | 'baseball bat' | 'baseball glove' | 'skateboard' | 'surfboard' | 'tennis racket' | 'bottle' | 'wine glass' | 'cup' | 'fork' | 'knife' | 'spoon' | 'bowl' | 'banana' | 'apple' | 'sandwich' | 'orange' | 'broccoli' | 'carrot' | 'hot dog' | 'pizza' | 'donut' | 'cake' | 'chair' | 'couch' | 'potted plant' | 'bed' | 'dining table' | 'toilet' | 'tv' | 'laptop' | 'mouse' | 'remote' | 'keyboard' | 'cell phone' | 'microwave' | 'oven' | 'toaster' | 'sink' | 'refrigerator' | 'book' | 'clock' | 'vase' | 'scissors' | 'teddy bear' | 'hair drier' | 'toothbrush'; + +/** + * Callback for the progress of a long-running action such as an HTTP + * request for a large binary object. + * + * `fraction` should be a number in the [0, 1] interval, indicating how + * much of the action has completed. + */ +declare type OnProgressCallback = (fraction: number) => void; + +/** currently set draw options {@link DrawOptions} */ +declare const options: DrawOptions; + +/** draw combined person results instead of individual detection result objects */ +declare function person(inCanvas: AnyCanvas, result: PersonResult[], drawOptions?: Partial): void; + +/** Person getter + * - Triggers combining all individual results into a virtual person object + */ +export declare interface PersonResult { + /** person id */ + id: number; + /** face result that belongs to this person */ + face: FaceResult; + /** body result that belongs to this person */ + body: BodyResult | null; + /** left and right hand results that belong to this person */ + hands: { + left: HandResult | null; + right: HandResult | null; + }; + /** detected gestures specific to this person */ + gestures: GestureResult[]; + /** box that defines the person */ + box: Box; + /** box that defines the person normalized to 0..1 */ + boxRaw?: Box; +} + +/** generic point as [x, y, z?] */ +export declare type Point = [number, number, number?]; + +export declare type Race = 'white' | 'black' | 'asian' | 'indian' | 'other'; + +export declare enum Rank { + R0 = "R0", + R1 = "R1", + R2 = "R2", + R3 = "R3", + R4 = "R4", + R5 = "R5", + R6 = "R6" +} + +declare const registerLoadRouter: (loudRouter: IORouter) => void; + +declare const registerSaveRouter: (loudRouter: IORouter) => void; + +/** + * Remove a model specified by URL from a registered storage medium. + * + * ```js + * // First create and save a model. + * const model = tf.sequential(); + * model.add(tf.layers.dense( + * {units: 1, inputShape: [10], activation: 'sigmoid'})); + * await model.save('localstorage://demo/management/model1'); + * + * // Then list existing models. + * console.log(JSON.stringify(await tf.io.listModels())); + * + * // Delete the model. + * await tf.io.removeModel('localstorage://demo/management/model1'); + * + * // List models again. + * console.log(JSON.stringify(await tf.io.listModels())); + * ``` + * + * @param url A URL to a stored model, with a scheme prefix, e.g., + * 'localstorage://my-model-1', 'indexeddb://my/model/2'. + * @returns ModelArtifactsInfo of the deleted model (if and only if deletion + * is successful). + * @throws Error if deletion fails, e.g., if no model exists at `path`. + * + * @doc { + * heading: 'Models', + * subheading: 'Management', + * namespace: 'io', + * ignoreCI: true + * } + */ +declare function removeModel(url: string): Promise; + +/** + * Additional options for Platform.fetch + */ +declare interface RequestDetails { + /** + * Is this request for a binary file (as opposed to a json file) + */ + isBinary?: boolean; +} + +/** + * Result interface definition for **Human** library + * + * Contains all possible detection results + */ +export declare interface Result { + /** {@link FaceResult}: detection & analysis results */ + face: FaceResult[]; + /** {@link BodyResult}: detection & analysis results */ + body: BodyResult[]; + /** {@link HandResult}: detection & analysis results */ + hand: HandResult[]; + /** {@link GestureResult}: detection & analysis results */ + gesture: GestureResult[]; + /** {@link ObjectResult}: detection & analysis results */ + object: ObjectResult[]; + /** global performance object with timing values for each operation */ + performance: Record; + /** optional processed canvas that can be used to draw input on screen */ + canvas?: AnyCanvas | null; + /** timestamp of detection representing the milliseconds elapsed since the UNIX epoch */ + readonly timestamp: number; + /** getter property that returns unified persons object */ + persons: PersonResult[]; + /** Last known error message */ + error: string | null; + /** Resolution width */ + width: number; + /** Resolution height */ + height: number; +} + +/** + * Options for saving a model. + * @innamespace io + */ +declare interface SaveConfig { + /** + * Whether to save only the trainable weights of the model, ignoring the + * non-trainable ones. + */ + trainableOnly?: boolean; + /** + * Whether the optimizer will be saved (if exists). + * + * Default: `false`. + */ + includeOptimizer?: boolean; +} + +/** + * Type definition for handlers of saving operations. + */ +declare type SaveHandler = (modelArtifact: ModelArtifacts) => Promise; + +/** + * Type definition for handlers of synchronous saving operations. + */ +declare type SaveHandlerSync = (modelArtifact: ModelArtifacts) => SaveResult; + +/** + * Result of a saving operation. + */ +declare interface SaveResult { + /** + * Information about the model artifacts saved. + */ + modelArtifactsInfo: ModelArtifactsInfo; + /** + * HTTP responses from the server that handled the model-saving request (if + * any). This is applicable only to server-based saving routes. + */ + responses?: Response[]; + /** + * Error messages and related data (if any). + */ + errors?: Array<{} | string>; +} + +/** Configures all body segmentation module + * removes background from input containing person + * if segmentation is enabled it will run as preprocessing task before any other model + * alternatively leave it disabled and use it on-demand using human.segmentation method which can + * remove background or replace it with user-provided background + */ +export declare interface SegmentationConfig extends GenericConfig { + /** downsample ratio, adjust to reflect approximately how much of input is taken by body */ + ratio: number; + /** possible rvm segmentation mode */ + mode: SegmentationEnum; +} + +/** Possible segmentation model behavior */ +export declare type SegmentationEnum = 'default' | 'alpha' | 'foreground' | 'state'; + +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/// +/** @docalias number[] */ +declare interface ShapeMap { + R0: number[]; + R1: [number]; + R2: [number, number]; + R3: [number, number, number]; + R4: [number, number, number, number]; + R5: [number, number, number, number, number]; + R6: [number, number, number, number, number, number]; +} + +/** Calculates normalized similarity between two face descriptors based on their `distance` + * @param options - calculation options + * - order - algorithm to use + * Euclidean distance if `order` is 2 (default), Minkowski distance algorithm of nth order if `order` is higher than 2 + * - multiplier - by how much to enhance difference analysis in range of 1..100 + * default is 20 which normalizes results to similarity above 0.5 can be considered a match + * - min - normalize similarity result to a given range + * - max - normalzie similarity resutl to a given range + * default is 0.2...0.8 + * Returns similarity between two face descriptors normalized to 0..1 range where 0 is no similarity and 1 is perfect similarity + */ +declare function similarity(descriptor1: Descriptor, descriptor2: Descriptor, options?: MatchOptions): number; + +declare interface SingleValueMap { + bool: boolean; + int32: number; + float32: number; + complex64: number; + string: string; +} + +export declare namespace Tensor { } + +/** + * A `tf.Tensor` object represents an immutable, multidimensional array of + * numbers that has a shape and a data type. + * + * For performance reasons, functions that create tensors do not necessarily + * perform a copy of the data passed to them (e.g. if the data is passed as a + * `Float32Array`), and changes to the data will change the tensor. This is not + * a feature and is not supported. To avoid this behavior, use the tensor before + * changing the input data or create a copy with `copy = tf.add(yourTensor, 0)`. + * + * See `tf.tensor` for details on how to create a `tf.Tensor`. + * + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ +export declare class Tensor { + /** Unique id of this tensor. */ + readonly id: number; + /** + * Id of the bucket holding the data for this tensor. Multiple arrays can + * point to the same bucket (e.g. when calling array.reshape()). + */ + dataId: DataId; + /** The shape of the tensor. */ + readonly shape: ShapeMap[R]; + /** Number of elements in the tensor. */ + readonly size: number; + /** The data type for the array. */ + readonly dtype: DataType; + /** The rank type for the array (see `Rank` enum). */ + readonly rankType: R; + /** Whether this tensor has been globally kept. */ + kept: boolean; + /** The id of the scope this tensor is being tracked in. */ + scopeId: number; + /** + * Number of elements to skip in each dimension when indexing. See + * https://docs.scipy.org/doc/numpy/reference/generated/\ + * numpy.ndarray.strides.html + */ + readonly strides: number[]; + constructor(shape: ShapeMap[R], dtype: DataType, dataId: DataId, id: number); + get rank(): number; + /** + * Returns a promise of `tf.TensorBuffer` that holds the underlying data. + * + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ + buffer(): Promise>; + /** + * Returns a `tf.TensorBuffer` that holds the underlying data. + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ + bufferSync(): TensorBuffer; + /** + * Returns the tensor data as a nested array. The transfer of data is done + * asynchronously. + * + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ + array(): Promise; + /** + * Returns the tensor data as a nested array. The transfer of data is done + * synchronously. + * + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ + arraySync(): ArrayMap[R]; + /** + * Asynchronously downloads the values from the `tf.Tensor`. Returns a + * promise of `TypedArray` that resolves when the computation has finished. + * + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ + data(): Promise; + /** + * Copy the tensor's data to a new GPU resource. Comparing to the `dataSync()` + * and `data()`, this method prevents data from being downloaded to CPU. + * + * For WebGL backend, the data will be stored on a densely packed texture. + * This means that the texture will use the RGBA channels to store value. + * + * For WebGPU backend, the data will be stored on a buffer. There is no + * parameter, so can not use a user-defined size to create the buffer. + * + * @param options: + * For WebGL, + * - customTexShape: Optional. If set, will use the user defined + * texture shape to create the texture. + * + * @returns For WebGL backend, a GPUData contains the new texture and + * its information. + * { + * tensorRef: The tensor that is associated with this texture, + * texture: WebGLTexture, + * texShape: [number, number] // [height, width] + * } + * + * For WebGPU backend, a GPUData contains the new buffer and + * its information. + * { + * tensorRef: The tensor that is associated with this buffer, + * buffer: GPUBuffer, + * bufSize: number + * } + * + * Remember to dispose the GPUData after it is used by + * `res.tensorRef.dispose()`. + * + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ + dataToGPU(options?: DataToGPUOptions): GPUData; + /** + * Synchronously downloads the values from the `tf.Tensor`. This blocks the + * UI thread until the values are ready, which can cause performance issues. + * + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ + dataSync(): DataTypeMap[D]; + /** Returns the underlying bytes of the tensor's data. */ + bytes(): Promise; + /** + * Disposes `tf.Tensor` from memory. + * + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ + dispose(): void; + protected isDisposedInternal: boolean; + get isDisposed(): boolean; + throwIfDisposed(): void; + /** + * Prints the `tf.Tensor`. See `tf.print` for details. + * + * @param verbose Whether to print verbose information about the tensor, + * including dtype and size. + * + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ + print(verbose?: boolean): void; + /** + * Returns a copy of the tensor. See `tf.clone` for details. + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ + clone(this: T): T; + /** + * Returns a human-readable description of the tensor. Useful for logging. + * + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ + toString(verbose?: boolean): string; + variable(trainable?: boolean, name?: string, dtype?: DataType): Variable; +} + +/** @doclink Tensor */ +export declare type Tensor4D = Tensor; + +/** + * A mutable object, similar to `tf.Tensor`, that allows users to set values + * at locations before converting to an immutable `tf.Tensor`. + * + * See `tf.buffer` for creating a tensor buffer. + * + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ +declare class TensorBuffer { + dtype: D; + size: number; + shape: ShapeMap[R]; + strides: number[]; + values: DataTypeMap[D]; + constructor(shape: ShapeMap[R], dtype: D, values?: DataTypeMap[D]); + /** + * Sets a value in the buffer at a given location. + * + * @param value The value to set. + * @param locs The location indices. + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ + set(value: SingleValueMap[D], ...locs: number[]): void; + /** + * Returns the value in the buffer at the provided location. + * + * @param locs The location indices. + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ + get(...locs: number[]): SingleValueMap[D]; + locToIndex(locs: number[]): number; + indexToLoc(index: number): number[]; + get rank(): number; + /** + * Creates an immutable `tf.Tensor` object from the buffer. + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ + toTensor(): Tensor; +} + +declare interface TensorInfo { + name: string; + shape?: number[]; + dtype: DataType; +} + +/** Model training configuration. */ +declare interface TrainingConfig { + /** Optimizer used for the model training. */ + optimizer_config: {}; + /** Loss function(s) for the model's output(s). */ + loss: string | string[] | { + [key: string]: string; + }; + /** Metric function(s) for the model's output(s). */ + metrics?: string[] | { + [key: string]: string; + }; + weighted_metrics?: string[]; + sample_weight_mode?: string; + loss_weights?: number[] | { + [key: string]: number; + }; +} + +declare type Url = string | io.IOHandler | io.IOHandlerSync; + +declare type UrlIOHandler = T extends string ? io.IOHandler : T; + +declare function validateModel(instance: Human | null, model: GraphModel | null, name: string): KernelOps | null; + +/** + * A mutable `tf.Tensor`, useful for persisting state, e.g. for training. + * + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ +declare class Variable extends Tensor { + trainable: boolean; + name: string; + constructor(initialValue: Tensor, trainable: boolean, name: string, tensorId: number); + /** + * Assign a new `tf.Tensor` to this variable. The new `tf.Tensor` must have + * the same shape and dtype as the old `tf.Tensor`. + * + * @param newValue New tensor to be assigned to this variable. + * + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ + assign(newValue: Tensor): void; + dispose(): void; +} + +/** Possible values for `human.warmup` */ +export declare type WarmupEnum = '' | 'none' | 'face' | 'full' | 'body'; + +export declare class WebCam { + /** current webcam configuration */ + config: WebCamConfig; + /** instance of dom element associated with webcam stream */ + element: HTMLVideoElement | undefined; + /** active webcam stream */ + stream: MediaStream | undefined; + /** enumerated video devices */ + devices: MediaDeviceInfo[]; + constructor(); + /** get active webcam stream track */ + get track(): MediaStreamTrack | undefined; + /** get webcam capabilities */ + get capabilities(): MediaTrackCapabilities | undefined; + /** get webcam constraints */ + get constraints(): MediaTrackConstraints | undefined; + /** get webcam settings */ + get settings(): MediaTrackSettings | undefined; + /** get webcam label */ + get label(): string; + /** is webcam paused */ + get paused(): boolean; + /** webcam current width */ + get width(): number; + /** webcam current height */ + get height(): number; + enumerate: () => Promise; + /** start method initializizes webcam stream and associates it with a dom video element */ + start: (webcamConfig?: Partial) => Promise; + /** pause webcam video method */ + pause: () => void; + /** play webcam video method */ + play: () => Promise; + /** stop method stops active webcam stream track and disconnects webcam */ + stop: () => void; +} + +/** WebCam configuration */ +export declare interface WebCamConfig { + /** + * element can be: + * - string which indicates dom element id + * - actual HTMLVideo dom element + * - undefined in which case a new HTMLVideoElement will be created + */ + element: string | HTMLVideoElement | undefined; + /** print messages on console */ + debug: boolean; + /** use front or back camera */ + mode: 'front' | 'back'; + /** camera crop mode */ + crop: boolean; + /** desired webcam width */ + width: number; + /** desired webcam height */ + height: number; + /** deviceId of the video device to use */ + id?: string; +} + +/** + * Group to which the weight belongs. + * + * - 'optimizer': Weight from a stateful optimizer. + */ +declare type WeightGroup = 'model' | 'optimizer'; + +/** + * Creates a function, which reads a weights manifest JSON configuration, + * fetches the weight files using the specified function and returns them as + * `Tensor`s. + * + * ```js + * // example for creating a nodejs weight loader, which reads the weight files + * // from disk using fs.readFileSync + * + * import * as fs from 'fs' + * + * const fetchWeightsFromDisk = (filePaths: string[]) => + * filePaths.map(filePath => fs.readFileSync(filePath).buffer) + * + * const loadWeights = tf.io.weightsLoaderFactory(fetchWeightsFromDisk) + * + * const manifest = JSON.parse( + * fs.readFileSync('./my_model-weights_manifest').toString() + * ) + * const weightMap = await loadWeights(manifest, './') + * ``` + * @param fetchWeightsFunction The function used for fetching the weight files. + * @returns Weight loading function. + */ +declare function weightsLoaderFactory(fetchWeightsFunction: (fetchUrls: string[]) => Promise): (manifest: WeightsManifestConfig, filePathPrefix?: string, weightNames?: string[]) => Promise; + +/** + * A weight manifest. + * + * The weight manifest consists of an ordered list of weight-manifest groups. + * Each weight-manifest group ("group" for short hereafter) consists of a + * number of weight values stored in a number of paths. + * See the documentation of `WeightManifestGroupConfig` below for more details. + */ +declare type WeightsManifestConfig = WeightsManifestGroupConfig[]; + +/** + * An entry in the weight manifest. + * + * The entry contains specification of a weight. + */ +declare interface WeightsManifestEntry { + /** + * Name of the weight, e.g., 'Dense_1/bias' + */ + name: string; + /** + * Shape of the weight. + */ + shape: number[]; + /** + * Data type of the weight. + */ + dtype: 'float32' | 'int32' | 'bool' | 'string' | 'complex64'; + /** + * Type of the weight. + * + * Optional. + * + * The value 'optimizer' indicates the weight belongs to an optimizer + * (i.e., used only during model training and not during inference). + */ + group?: WeightGroup; + /** + * Information for dequantization of the weight. + */ + quantization?: { + scale?: number; + min?: number; + dtype: 'uint16' | 'uint8' | 'float16'; + }; +} + +/** + * A weight-manifest group. + * + * Consists of an ordered list of weight values encoded in binary format, + * stored in an ordered list of paths. + */ +declare interface WeightsManifestGroupConfig { + /** + * An ordered list of paths. + * + * Paths are intentionally abstract in order to be general. For example, they + * can be relative URL paths or relative paths on the file system. + */ + paths: string[]; + /** + * Specifications of the weights stored in the paths. + */ + weights: WeightsManifestEntry[]; +} + +/** + * Creates an IOHandler that passes saved model artifacts to a callback. + * + * ```js + * function handleSave(artifacts) { + * // ... do something with the artifacts ... + * return {modelArtifactsInfo: {...}, ...}; + * } + * + * const saveResult = model.save(tf.io.withSaveHandler(handleSave)); + * ``` + * + * @param saveHandler A function that accepts a `ModelArtifacts` and returns a + * promise that resolves to a `SaveResult`. + */ +declare function withSaveHandler(saveHandler: (artifacts: ModelArtifacts) => Promise): IOHandler; + +/** + * Creates an IOHandlerSync that passes saved model artifacts to a callback. + * + * ```js + * function handleSave(artifacts) { + * // ... do something with the artifacts ... + * return {modelArtifactsInfo: {...}, ...}; + * } + * + * const saveResult = model.save(tf.io.withSaveHandler(handleSave)); + * ``` + * + * @param saveHandler A function that accepts a `ModelArtifacts` and returns a + * `SaveResult`. + */ +declare function withSaveHandlerSync(saveHandler: (artifacts: ModelArtifacts) => SaveResult): IOHandlerSync; + +export { } diff --git a/types/tfjs-core.d.ts b/types/tfjs-core.d.ts new file mode 100644 index 00000000..3f6da67e --- /dev/null +++ b/types/tfjs-core.d.ts @@ -0,0 +1,11357 @@ +/// + +export declare const Abs = "Abs"; + +export declare const abs: typeof abs_; + +/** + * Computes absolute value element-wise: `abs(x)` + * + * ```js + * const x = tf.tensor1d([-1, 2, -3, 4]); + * + * x.abs().print(); // or tf.abs(x) + * ``` + * @param x The input `tf.Tensor`. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function abs_(x: T | TensorLike): T; + +export declare type AbsInputs = UnaryInputs; + +export declare const Acos = "Acos"; + +export declare const acos: typeof acos_; + +/** + * Computes acos of the input `tf.Tensor` element-wise: `acos(x)` + * + * ```js + * const x = tf.tensor1d([0, 1, -1, .7]); + * + * x.acos().print(); // or tf.acos(x) + * ``` + * @param x The input tensor. + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function acos_(x: T | TensorLike): T; + +export declare const Acosh = "Acosh"; + +export declare const acosh: typeof acosh_; + +/** + * Computes the inverse hyperbolic cos of the input `tf.Tensor` element-wise: + * `acosh(x)` + * + * ```js + * const x = tf.tensor1d([10, 1, 3, 5.7]); + * + * x.acosh().print(); // or tf.acosh(x) + * ``` + * @param x The input tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function acosh_(x: T | TensorLike): T; + +export declare type AcoshInputs = UnaryInputs; + +export declare type AcosInputs = UnaryInputs; + +declare type Activation = 'linear' | 'relu' | 'prelu' | 'elu' | 'relu6' | 'leakyrelu' | 'sigmoid'; + +/** @doclink Optimizer */ +export declare class AdadeltaOptimizer extends Optimizer { + protected learningRate: number; + protected rho: number; + protected epsilon: number; + /** @nocollapse */ + static className: string; + private accumulatedGrads; + private accumulatedUpdates; + constructor(learningRate: number, rho: number, epsilon?: number); + applyGradients(variableGradients: NamedVariableMap | NamedTensor[]): void; + dispose(): void; + getWeights(): Promise; + setWeights(weightValues: NamedTensor[]): Promise; + getConfig(): ConfigDict; + /** @nocollapse */ + static fromConfig(cls: SerializableConstructor, config: ConfigDict): T; +} + +/** @doclink Optimizer */ +export declare class AdagradOptimizer extends Optimizer { + protected learningRate: number; + private initialAccumulatorValue; + /** @nocollapse */ + static className: string; + private accumulatedGrads; + constructor(learningRate: number, initialAccumulatorValue?: number); + applyGradients(variableGradients: NamedVariableMap | NamedTensor[]): void; + dispose(): void; + getWeights(): Promise; + setWeights(weightValues: NamedTensor[]): Promise; + getConfig(): ConfigDict; + /** @nocollapse */ + static fromConfig(cls: SerializableConstructor, config: ConfigDict): T; +} + +export declare class AdamaxOptimizer extends Optimizer { + protected learningRate: number; + protected beta1: number; + protected beta2: number; + protected epsilon: number; + protected decay: number; + /** @nocollapse */ + static className: string; + private accBeta1; + private iteration; + private accumulatedFirstMoment; + private accumulatedWeightedInfNorm; + constructor(learningRate: number, beta1: number, beta2: number, epsilon?: number, decay?: number); + applyGradients(variableGradients: NamedVariableMap | NamedTensor[]): void; + dispose(): void; + getWeights(): Promise; + setWeights(weightValues: NamedTensor[]): Promise; + getConfig(): ConfigDict; + /** @nocollapse */ + static fromConfig(cls: SerializableConstructor, config: ConfigDict): T; +} + +export declare class AdamOptimizer extends Optimizer { + protected learningRate: number; + protected beta1: number; + protected beta2: number; + protected epsilon: number; + /** @nocollapse */ + static className: string; + private accBeta1; + private accBeta2; + private accumulatedFirstMoment; + private accumulatedSecondMoment; + constructor(learningRate: number, beta1: number, beta2: number, epsilon?: number); + applyGradients(variableGradients: NamedVariableMap | NamedTensor[]): void; + dispose(): void; + getWeights(): Promise; + setWeights(weightValues: NamedTensor[]): Promise; + getConfig(): ConfigDict; + /** @nocollapse */ + static fromConfig(cls: SerializableConstructor, config: ConfigDict): T; +} + +export declare const Add = "Add"; + +export declare const add: typeof add_; + +/** + * Adds two `tf.Tensor`s element-wise, A + B. Supports broadcasting. + * + * + * ```js + * const a = tf.tensor1d([1, 2, 3, 4]); + * const b = tf.tensor1d([10, 20, 30, 40]); + * + * a.add(b).print(); // or tf.add(a, b) + * ``` + * + * ```js + * // Broadcast add a with b. + * const a = tf.scalar(5); + * const b = tf.tensor1d([10, 20, 30, 40]); + * + * a.add(b).print(); // or tf.add(a, b) + * ``` + * @param a The first `tf.Tensor` to add. + * @param b The second `tf.Tensor` to add. Must have the same type as `a`. + * + * @doc {heading: 'Operations', subheading: 'Arithmetic'} + */ +declare function add_(a: Tensor | TensorLike, b: Tensor | TensorLike): T; + +export declare type AddInputs = BinaryInputs; + +export declare const AddN = "AddN"; + +export declare const addN: typeof addN_; + +/** + * Adds a list of `tf.Tensor`s element-wise, each with the same shape and dtype. + * + * ```js + * const a = tf.tensor1d([1, 2]); + * const b = tf.tensor1d([3, 4]); + * const c = tf.tensor1d([5, 6]); + * + * tf.addN([a, b, c]).print(); + * ``` + * @param tensors A list of tensors with the same shape and dtype. + * @doc {heading: 'Operations', subheading: 'Arithmetic'} + */ +declare function addN_(tensors: Array): T; + +export declare type AddNInputs = TensorInfo[]; + +export declare const All = "All"; + +export declare const all: typeof all_; + +/** + * Computes the logical and of elements across dimensions of a `tf.Tensor`. + * + * Reduces the input along the dimensions given in `axes`. Unless `keepDims` + * is true, the rank of the `tf.Tensor` is reduced by 1 for each entry in + * `axes`. If `keepDims` is true, the reduced dimensions are retained with + * length 1. If `axes` has no entries, all dimensions are reduced, and a + * `tf.Tensor` with a single element is returned. + * + * ```js + * const x = tf.tensor1d([1, 1, 1], 'bool'); + * + * x.all().print(); // or tf.all(x) + * ``` + * + * ```js + * const x = tf.tensor2d([1, 1, 0, 0], [2, 2], 'bool'); + * + * const axis = 1; + * x.all(axis).print(); // or tf.all(x, axis) + * ``` + * + * @param x The input tensor. Must be of dtype bool. + * @param axis The dimension(s) to reduce. By default it reduces + * all dimensions. + * @param keepDims If true, retains reduced dimensions with size 1. + * + * @doc {heading: 'Operations', subheading: 'Reduction'} + */ +declare function all_(x: Tensor | TensorLike, axis?: number | number[], keepDims?: boolean): T; + +export declare interface AllAttrs { + axis: number | number[]; + keepDims: boolean; +} + +export declare type AllInputs = Pick; + +export declare const Any = "Any"; + +export declare const any: typeof any_; + +/** + * Computes the logical or of elements across dimensions of a `tf.Tensor`. + * + * Reduces the input along the dimensions given in `axes`. Unless `keepDims` + * is true, the rank of the `tf.Tensor` is reduced by 1 for each entry in + * `axes`. If `keepDims` is true, the reduced dimensions are retained with + * length 1. If `axes` has no entries, all dimensions are reduced, and a + * `tf.Tensor` with a single element is returned. + * + * ```js + * const x = tf.tensor1d([1, 1, 1], 'bool'); + * + * x.any().print(); // or tf.any(x) + * ``` + * + * ```js + * const x = tf.tensor2d([1, 1, 0, 0], [2, 2], 'bool'); + * + * const axis = 1; + * x.any(axis).print(); // or tf.any(x, axis) + * ``` + * + * @param x The input tensor. Must be of dtype bool. + * @param axis The dimension(s) to reduce. By default it reduces + * all dimensions. + * @param keepDims If true, retains reduced dimensions with size 1. + * + * @doc {heading: 'Operations', subheading: 'Reduction'} + */ +declare function any_(x: Tensor | TensorLike, axis?: number | number[], keepDims?: boolean): T; + +export declare interface AnyAttrs { + axis: number | number[]; + keepDims: boolean; +} + +export declare type AnyInputs = Pick; + +declare function applyActivation(x: Tensor, activation: Activation, preluActivationWeights?: Tensor, leakyreluAlpha?: number): Tensor; + +export declare const ArgMax = "ArgMax"; + +export declare const argMax: typeof argMax_; + +/** + * Returns the indices of the maximum values along an `axis`. + * + * The result has the same shape as `input` with the dimension along `axis` + * removed. + * + * ```js + * const x = tf.tensor1d([1, 2, 3]); + * + * x.argMax().print(); // or tf.argMax(x) + * ``` + * + * ```js + * const x = tf.tensor2d([1, 2, 4, 3], [2, 2]); + * + * const axis = 1; + * x.argMax(axis).print(); // or tf.argMax(x, axis) + * ``` + * + * @param x The input tensor. + * @param axis The dimension to reduce. Defaults to 0 (outer-most dimension). + * + * @doc {heading: 'Operations', subheading: 'Reduction'} + */ +declare function argMax_(x: Tensor | TensorLike, axis?: number): T; + +export declare interface ArgMaxAttrs { + axis: number; +} + +export declare type ArgMaxInputs = Pick; + +export declare const ArgMin = "ArgMin"; + +export declare const argMin: typeof argMin_; + +/** + * Returns the indices of the minimum values along an `axis`. + * + * The result has the same shape as `input` with the dimension along `axis` + * removed. + * + * ```js + * const x = tf.tensor1d([1, 2, 3]); + * + * x.argMin().print(); // or tf.argMin(x) + * ``` + * + * ```js + * const x = tf.tensor2d([1, 2, 4, 3], [2, 2]); + * + * const axis = 1; + * x.argMin(axis).print(); // or tf.argMin(x, axis) + * ``` + * + * @param x The input tensor. + * @param axis The dimension to reduce. Defaults to 0 (outer-most dimension). + * + * @doc {heading: 'Operations', subheading: 'Reduction'} + */ +declare function argMin_(x: Tensor | TensorLike, axis?: number): T; + +export declare interface ArgMinAttrs { + axis: number; +} + +export declare type ArgMinInputs = Pick; + +/** @docalias number[] */ +declare interface ArrayMap { + R0: number; + R1: number[]; + R2: number[][]; + R3: number[][][]; + R4: number[][][][]; + R5: number[][][][][]; + R6: number[][][][][][]; +} + +declare function arraysEqual(n1: FlatVector, n2: FlatVector): boolean; + +export declare const Asin = "Asin"; + +export declare const asin: typeof asin_; + +/** + * Computes asin of the input `tf.Tensor` element-wise: `asin(x)` + * + * ```js + * const x = tf.tensor1d([0, 1, -1, .7]); + * + * x.asin().print(); // or tf.asin(x) + * ``` + * @param x The input tensor. + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function asin_(x: T | TensorLike): T; + +export declare const Asinh = "Asinh"; + +export declare const asinh: typeof asinh_; + +/** + * Computes inverse hyperbolic sin of the input `tf.Tensor` element-wise: + * `asinh(x)` + * + * ```js + * const x = tf.tensor1d([0, 1, -1, .7]); + * + * x.asinh().print(); // or tf.asinh(x) + * ``` + * @param x The input tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function asinh_(x: T | TensorLike): T; + +export declare type AsinhInputs = UnaryInputs; + +export declare type AsinInputs = UnaryInputs; + +/** + * Asserts that the expression is true. Otherwise throws an error with the + * provided message. + * + * ```js + * const x = 2; + * tf.util.assert(x === 2, 'x is not 2'); + * ``` + * + * @param expr The expression to assert (as a boolean). + * @param msg A function that returns the message to report when throwing an + * error. We use a function for performance reasons. + * + * @doc {heading: 'Util', namespace: 'util'} + */ +declare function assert(expr: boolean, msg: () => string): void; + +declare function assertAndGetBroadcastShape(shapeA: number[], shapeB: number[]): number[]; + +declare function assertAxesAreInnerMostDims(msg: string, axes: number[], rank: number): void; + +declare function assertNonNegativeIntegerDimensions(shape: number[]): void; + +declare function assertNonNull(a: TensorLike): void; + +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +declare function assertParamsConsistent(shapes: number[][], axis: number): void; + +declare function assertParamsValid(input: TensorInfo, begin: number[], size: number[]): void; + +declare function assertShapesMatch(shapeA: number[], shapeB: number[], errorMessagePrefix?: string): void; + +declare function assertTypesMatch(a: Tensor, b: Tensor): void; + +/** + * Insert a given complex value into the TypedArray. + * @param data The array in which the complex value is inserted. + * @param c The complex value to be inserted. + * @param index An index of the target complex value. + */ +declare function assignToTypedArray(data: TypedArray, real: number, imag: number, index: number): void; + +export declare const Atan = "Atan"; + +export declare const atan: typeof atan_; + +export declare const Atan2 = "Atan2"; + +export declare const atan2: typeof atan2_; + +/** + * Computes arctangent of `tf.Tensor`s a / b element-wise: `atan2(a, b)`. + * Supports broadcasting. + * + * ```js + * const a = tf.tensor1d([1.0, 1.0, -1.0, .7]); + * const b = tf.tensor1d([2.0, 13.0, 3.5, .21]); + * + * tf.atan2(a, b).print() + * ``` + * + * @param a The first tensor. + * @param b The second tensor. Must have the same dtype as `a`. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function atan2_(a: Tensor | TensorLike, b: Tensor | TensorLike): T; + +export declare type Atan2Inputs = BinaryInputs; + +/** + * Computes atan of the input `tf.Tensor` element-wise: `atan(x)` + * + * ```js + * const x = tf.tensor1d([0, 1, -1, .7]); + * + * x.atan().print(); // or tf.atan(x) + * ``` + * @param x The input tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function atan_(x: T | TensorLike): T; + +export declare const Atanh = "Atanh"; + +export declare const atanh: typeof atanh_; + +/** + * Computes inverse hyperbolic tan of the input `tf.Tensor` element-wise: + * `atanh(x)` + * + * ```js + * const x = tf.tensor1d([0, .1, -.1, .7]); + * + * x.atanh().print(); // or tf.atanh(x) + * ``` + * @param x The input tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function atanh_(x: T | TensorLike): T; + +export declare type AtanhInputs = UnaryInputs; + +export declare type AtanInputs = UnaryInputs; + +/** These are extra non-tensor/primitive params passed to kernel functions. */ +export declare type Attribute = AttributeValue | RecursiveArray; + +declare type AttributeValue = number | number[] | boolean | boolean[] | string | string[] | NamedAttrMap; + +export declare const AvgPool = "AvgPool"; + +export declare const avgPool: typeof avgPool_; + +export declare const AvgPool3D = "AvgPool3D"; + +export declare const avgPool3d: typeof avgPool3d_; + +/** + * Computes the 3D average pooling. + * + * ```js + * const x = tf.tensor5d([1, 2, 3, 4, 5, 6, 7, 8], [1, 2, 2, 2, 1]); + * const result = tf.avgPool3d(x, 2, 1, 'valid'); + * result.print(); + * ``` + * + * @param x The input tensor, of rank 5 or rank 4 of shape + * `[batch, depth, height, width, inChannels]`. + * @param filterSize The filter size: + * `[filterDepth, filterHeight, filterWidth]`. + * If `filterSize` is a single number, + * then `filterDepth == filterHeight == filterWidth`. + * @param strides The strides of the pooling: + * `[strideDepth, strideHeight, strideWidth]`. + * If `strides` is a single number, + * then `strideDepth == strideHeight == strideWidth`. + * @param pad The type of padding algorithm. + * - `same` and stride 1: output will be of same size as input, + * regardless of filter size. + * - `valid`: output will be smaller than input if filter is larger + * than 1*1x1. + * - For more info, see this guide: + * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution]( + * https://www.tensorflow.org/api_docs/python/tf/nn/convolution) + * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is + * provided, it will default to truncate. + * @param dataFormat An optional string from: "NDHWC", "NCDHW". Defaults to + * "NDHWC". Specify the data format of the input and output data. With the + * default format "NDHWC", the data is stored in the order of: [batch, + * depth, height, width, channels]. Only "NDHWC" is currently supported. + * + * @doc {heading: 'Operations', subheading: 'Convolution'} + */ +declare function avgPool3d_(x: T | TensorLike, filterSize: [number, number, number] | number, strides: [number, number, number] | number, pad: 'valid' | 'same' | number, dimRoundingMode?: 'floor' | 'round' | 'ceil', dataFormat?: 'NDHWC' | 'NCDHW'): T; + +export declare interface AvgPool3DAttrs { + filterSize: [number, number, number] | number; + strides: [number, number, number] | number; + pad: 'valid' | 'same' | number; + dimRoundingMode?: 'floor' | 'round' | 'ceil'; + dataFormat: 'NDHWC' | 'NCDHW'; +} + +export declare const AvgPool3DGrad = "AvgPool3DGrad"; + +export declare interface AvgPool3DGradAttrs { + filterSize: [number, number, number] | number; + strides: [number, number, number] | number; + pad: 'valid' | 'same' | number; + dimRoundingMode?: 'floor' | 'round' | 'ceil'; +} + +export declare type AvgPool3DGradInputs = Pick; + +export declare type AvgPool3DInputs = Pick; + +/** + * Computes the 2D average pooling of an image. + * + * @param x The input tensor, of rank 4 or rank 3 of shape + * `[batch, height, width, inChannels]`. If rank 3, batch of 1 is assumed. + * @param filterSize The filter size: `[filterHeight, filterWidth]`. If + * `filterSize` is a single number, then `filterHeight == filterWidth`. + * @param strides The strides of the pooling: `[strideHeight, strideWidth]`. If + * `strides` is a single number, then `strideHeight == strideWidth`. + * @param pad The type of padding algorithm: + * - `same` and stride 1: output will be of same size as input, + * regardless of filter size. + * - `valid`: output will be smaller than input if filter is larger + * than 1x1. + * - For more info, see this guide: + * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution]( + * https://www.tensorflow.org/api_docs/python/tf/nn/convolution) + * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is + * provided, it will default to truncate. + * + * @doc {heading: 'Operations', subheading: 'Convolution'} + */ +declare function avgPool_(x: T | TensorLike, filterSize: [number, number] | number, strides: [number, number] | number, pad: 'valid' | 'same' | number | conv_util.ExplicitPadding, dimRoundingMode?: 'floor' | 'round' | 'ceil'): T; + +export declare interface AvgPoolAttrs { + filterSize: [number, number] | number; + strides: [number, number] | number; + pad: 'valid' | 'same' | number | ExplicitPadding; + dimRoundingMode?: 'floor' | 'round' | 'ceil'; +} + +export declare const AvgPoolGrad = "AvgPoolGrad"; + +export declare interface AvgPoolGradAttrs { + filterSize: [number, number] | number; + strides: [number, number] | number; + pad: 'valid' | 'same' | number | ExplicitPadding; +} + +export declare type AvgPoolGradInputs = Pick; + +export declare type AvgPoolInputs = Pick; + +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/** + * Returns true if the axis specifies the inner most dimensions of the + * array. + */ +declare function axesAreInnerMostDims(axes: number[], rank: number): boolean; + +declare interface Backend { +} + +/** + * Gets the current backend. If no backends have been initialized, this will + * attempt to initialize the best backend. Will throw an error if the highest + * priority backend has async initialization, in which case you should call + * 'await tf.ready()' before running other code. + * + * @doc {heading: 'Backends'} + */ +export declare function backend(): KernelBackend; + +declare namespace backend_util { + export { + fromUint8ToStringArray, + fromStringArrayToUint8, + slice_util, + BackendValues, + TypedArray, + upcastType, + PixelData, + MemoryInfo, + TimingInfo, + segment_util, + axesAreInnerMostDims, + combineLocations, + computeOutAndReduceShapes, + expandShapeToKeepDim, + assertAxesAreInnerMostDims, + getAxesPermutation, + getUndoAxesPermutation, + getInnerMostAxes, + getBroadcastDims, + getReductionAxes, + assertAndGetBroadcastShape, + assertParamsConsistent, + computeOutShape_3 as computeOutShape, + computeDilation2DInfo, + computePool2DInfo, + computePool3DInfo, + computeConv2DInfo, + computeConv3DInfo, + computeDefaultPad, + tupleValuesAreOne, + eitherStridesOrDilationsAreOne, + convertConv2DDataFormat, + checkPadOnDimRoundingMode, + ExplicitPadding, + PadInfo, + PadInfo3D, + Conv2DInfo, + Conv3DInfo, + getFusedDyActivation, + getFusedBiasGradient, + applyActivation, + shouldFuse, + FusedConv2DConfig, + FusedBatchMatMulConfig, + Activation, + combineRaggedTensorToTensorShapes, + getRowPartitionTypesHelper, + getRaggedRank, + validateDefaultValueShape, + RowPartitionType, + computeOptimalWindowSize, + PARALLELIZE_THRESHOLD, + ReduceInfo, + getImageCenter, + getReshaped, + getPermuted, + getReshapedPermuted, + getSliceBeginCoords, + getSliceSize, + prepareAndValidate, + validateUpdateShape, + validateInput, + calculateShapes, + ScatterShapeInfo, + SELU_SCALEALPHA, + SELU_SCALE, + ERF_P, + ERF_A1, + ERF_A2, + ERF_A3, + ERF_A4, + ERF_A5, + warn, + log_2 as log, + mergeRealAndImagArrays, + splitRealAndImagArrays, + complexWithEvenIndex, + complexWithOddIndex, + getComplexWithIndex, + assignToTypedArray, + exponents, + exponent, + decodeEinsumEquation, + getEinsumPermutation, + checkEinsumDimSizes, + getEinsumComputePath, + isIdentityPermutation, + prepareSplitSize, + getSparseFillEmptyRowsIndicesDenseShapeMismatch, + getSparseFillEmptyRowsNegativeIndexErrorMessage, + getSparseFillEmptyRowsOutOfRangeIndexErrorMessage, + getSparseReshapeMultipleNegativeOneOutputDimErrorMessage, + getSparseReshapeNegativeOutputDimErrorMessage, + getSparseReshapeEmptyTensorZeroOutputDimErrorMessage, + getSparseReshapeInputOutputMultipleErrorMessage, + getSparseReshapeInputOutputMismatchErrorMessage, + getSparseSegmentReductionNegativeSegmentIdsErrorMessage, + getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage, + getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage, + getSparseSegmentReductionIndicesOutOfRangeErrorMessage + } +} +export { backend_util } + +declare interface BackendTimer { + timerAvailable(): boolean; + time(f: () => void): Promise; +} + +export declare interface BackendTimingInfo { + kernelMs: number | { + error: string; + }; + getExtraProfileInfo?(): string; +} + +/** The underlying tensor data that gets stored in a backend. */ +export declare type BackendValues = Float32Array | Int32Array | Uint8Array | Uint8Array[]; + +export declare const basicLSTMCell: typeof basicLSTMCell_; + +/** + * Computes the next state and output of a BasicLSTMCell. + * + * Returns `[newC, newH]`. + * + * Derived from tf.contrib.rnn.BasicLSTMCell. + * + * @param forgetBias Forget bias for the cell. + * @param lstmKernel The weights for the cell. + * @param lstmBias The bias for the cell. + * @param data The input to the cell. + * @param c Previous cell state. + * @param h Previous cell output. + * + * @doc {heading: 'Operations', subheading: 'RNN'} + */ +declare function basicLSTMCell_(forgetBias: Scalar | TensorLike, lstmKernel: Tensor2D | TensorLike, lstmBias: Tensor1D | TensorLike, data: Tensor2D | TensorLike, c: Tensor2D | TensorLike, h: Tensor2D | TensorLike): [Tensor2D, Tensor2D]; + +export declare const BatchMatMul = "BatchMatMul"; + +export declare interface BatchMatMulAttrs { + transposeA: boolean; + transposeB: boolean; +} + +export declare type BatchMatMulInputs = Pick; + +export declare const batchNorm: typeof batchNorm_; + +export declare const batchNorm2d: typeof batchNorm2d_; + +/** + * Batch normalization, strictly for 2D. For the more relaxed version, see + * `tf.batchNorm`. + * + * @param x The input Tensor. + * @param mean A mean Tensor. + * @param variance A variance Tensor. + * @param offset An offset Tensor. + * @param scale A scale Tensor. + * @param varianceEpsilon A small float number to avoid dividing by 0. + */ +declare function batchNorm2d_(x: Tensor2D | TensorLike, mean: Tensor2D | Tensor1D | TensorLike, variance: Tensor2D | Tensor1D | TensorLike, offset?: Tensor2D | Tensor1D | TensorLike, scale?: Tensor2D | Tensor1D | TensorLike, varianceEpsilon?: number): Tensor2D; + +export declare const batchNorm3d: typeof batchNorm3d_; + +/** + * Batch normalization, strictly for 3D. For the more relaxed version, see + * `tf.batchNorm`. + * + * @param x The input Tensor. + * @param mean A mean Tensor. + * @param variance A variance Tensor. + * @param offset An offset Tensor. + * @param scale A scale Tensor. + * @param varianceEpsilon A small float number to avoid dividing by 0. + */ +declare function batchNorm3d_(x: Tensor3D | TensorLike, mean: Tensor3D | Tensor1D | TensorLike, variance: Tensor3D | Tensor1D | TensorLike, offset?: Tensor3D | Tensor1D | TensorLike, scale?: Tensor3D | Tensor1D | TensorLike, varianceEpsilon?: number): Tensor3D; + +export declare const batchNorm4d: typeof batchNorm4d_; + +/** + * Batch normalization, strictly for 4D. For the more relaxed version, see + * `tf.batchNorm`. + * + * @param x The input Tensor. + * @param mean A mean Tensor. + * @param variance A variance Tensor. + * @param offset An offset Tensor. + * @param scale A scale Tensor. + * @param varianceEpsilon A small float number to avoid dividing by 0. + */ +declare function batchNorm4d_(x: Tensor4D | TensorLike, mean: Tensor4D | Tensor1D | TensorLike, variance: Tensor4D | Tensor1D | TensorLike, offset?: Tensor4D | Tensor1D | TensorLike, scale?: Tensor4D | Tensor1D | TensorLike, varianceEpsilon?: number): Tensor4D; + +/** + * Batch normalization. + * + * As described in + * [http://arxiv.org/abs/1502.03167](http://arxiv.org/abs/1502.03167). + * + * Mean, variance, scale, and offset can be of two shapes: + * - The same shape as the input. + * - In the common case, the depth dimension is the last dimension of x, so + * the values would be a `tf.Tensor1D` of shape [depth]. + * + * Also available are stricter rank-specific methods with the same signature + * as this method that assert that parameters passed are of given rank + * - `tf.batchNorm2d` + * - `tf.batchNorm3d` + * - `tf.batchNorm4d` + * + * @param x The input Tensor. + * @param mean A mean Tensor. + * @param variance A variance Tensor. + * @param offset An offset Tensor. + * @param scale A scale Tensor. + * @param varianceEpsilon A small float number to avoid dividing by 0. + * + * @doc {heading: 'Operations', subheading: 'Normalization'} + */ +declare function batchNorm_(x: Tensor | TensorLike, mean: Tensor | Tensor1D | TensorLike, variance: Tensor | Tensor1D | TensorLike, offset?: Tensor | Tensor1D | TensorLike, scale?: Tensor | Tensor1D | TensorLike, varianceEpsilon?: number): Tensor; + +export declare const BatchToSpaceND = "BatchToSpaceND"; + +export declare const batchToSpaceND: typeof batchToSpaceND_; + +/** + * This operation reshapes the "batch" dimension 0 into `M + 1` dimensions of + * shape `blockShape + [batch]`, interleaves these blocks back into the grid + * defined by the spatial dimensions `[1, ..., M]`, to obtain a result with + * the same rank as the input. The spatial dimensions of this intermediate + * result are then optionally cropped according to `crops` to produce the + * output. This is the reverse of `tf.spaceToBatchND`. See below for a precise + * description. + * + * ```js + * const x = tf.tensor4d([1, 2, 3, 4], [4, 1, 1, 1]); + * const blockShape = [2, 2]; + * const crops = [[0, 0], [0, 0]]; + * + * x.batchToSpaceND(blockShape, crops).print(); + * ``` + * + * @param x A `tf.Tensor`. N-D with `x.shape` = `[batch] + spatialShape + + * remainingShape`, where spatialShape has `M` dimensions. + * @param blockShape A 1-D array. Must have shape `[M]`, all values must + * be >= 1. + * @param crops A 2-D array. Must have shape `[M, 2]`, all values must be >= 0. + * `crops[i] = [cropStart, cropEnd]` specifies the amount to crop from input + * dimension `i + 1`, which corresponds to spatial dimension `i`. It is required + * that `cropStart[i] + cropEnd[i] <= blockShape[i] * inputShape[i + 1]` + * + * This operation is equivalent to the following steps: + * + * 1. Reshape `x` to `reshaped` of shape: `[blockShape[0], ..., + * blockShape[M-1], batch / prod(blockShape), x.shape[1], ..., + * x.shape[N-1]]` + * + * 2. Permute dimensions of `reshaped` to produce `permuted` of shape `[batch / + * prod(blockShape),x.shape[1], blockShape[0], ..., x.shape[M], + * blockShape[M-1],x.shape[M+1], ..., x.shape[N-1]]` + * + * 3. Reshape `permuted` to produce `reshapedPermuted` of shape `[batch / + * prod(blockShape),x.shape[1] * blockShape[0], ..., x.shape[M] * + * blockShape[M-1],x.shape[M+1], ..., x.shape[N-1]]` + * + * 4. Crop the start and end of dimensions `[1, ..., M]` of `reshapedPermuted` + * according to `crops` to produce the output of shape: `[batch / + * prod(blockShape),x.shape[1] * blockShape[0] - crops[0,0] - crops[0,1], + * ..., x.shape[M] * blockShape[M-1] - crops[M-1,0] - + * crops[M-1,1],x.shape[M+1], ..., x.shape[N-1]]` + * + * @doc {heading: 'Tensors', subheading: 'Transformations'} + */ +declare function batchToSpaceND_(x: T | TensorLike, blockShape: number[], crops: number[][]): T; + +export declare interface BatchToSpaceNDAttrs { + blockShape: number[]; + crops: number[][]; +} + +export declare type BatchToSpaceNDInputs = Pick; + +export declare type BinaryInputs = Pick; + +export declare const Bincount = "Bincount"; + +export declare const bincount: typeof bincount_; + +/** + * Outputs a vector with length `size` and the same dtype as `weights`. + * + * If `weights` are empty, then index `i` stores the number of times the value + * `i` is counted in `x`. If `weights` are non-empty, then index `i` stores the + * sum of the value in `weights` at each index where the corresponding value in + * `x` is `i`. + * + * Values in `x` outside of the range [0, size) are ignored. + * + * @param x The input int tensor, rank 1. + * @param weights The weights tensor, must have the same shape as x, or a + * length-0 Tensor, in which case it acts as all weights equal to 1. + * @param size Non-negative integer. + * + * @doc {heading: 'Operations', subheading: 'Reduction'} + */ +declare function bincount_(x: T | TensorLike, weights: T | TensorLike, size: number): T; + +export declare interface BincountAttrs { + size: number; +} + +export declare type BincountInputs = Pick; + +export declare const booleanMaskAsync: typeof booleanMaskAsync_; + +/** + * Apply boolean mask to tensor. + * + * ```js + * const tensor = tf.tensor2d([1, 2, 3, 4, 5, 6], [3, 2]); + * const mask = tf.tensor1d([1, 0, 1], 'bool'); + * const result = await tf.booleanMaskAsync(tensor, mask); + * result.print(); + * ``` + * + * @param tensor N-D tensor. + * @param mask K-D boolean tensor, K <= N and K must be known statically. + * @param axis A 0-D int Tensor representing the axis in tensor to mask from. + * By default, axis is 0 which will mask from the first dimension. + * Otherwise K + axis <= N. + * + * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'} + */ +declare function booleanMaskAsync_(tensor: Tensor | TensorLike, mask: Tensor | TensorLike, axis?: number): Promise; + +declare namespace broadcast_util { + export { + getBroadcastDims, + getReductionAxes, + assertAndGetBroadcastShape + } +} +export { broadcast_util } + +export declare const BroadcastArgs = "BroadcastArgs"; + +export declare const broadcastArgs: typeof broadcastArgs_; + +/** + * Return the shape of s0 op s1 with broadcast. + * + * compute r0, the broadcasted shape as a tensor. + * s0, s1 and r0 are all integer vectors. + * + * This function returns the shape of the result of an operation between + * two tensors of size s0 and s1 performed with broadcast. + * + * @param s0 A tensor representing a shape + * @param s1 A tensor representing a shape + * + * @doc {heading: 'Tensors', subheading: 'Transformations'} + */ +declare function broadcastArgs_(s0: Tensor | TensorLike, s1: Tensor | TensorLike): Tensor; + +export declare type BroadcastArgsInputs = Pick; + +export declare const BroadcastTo = "BroadcastTo"; + +export declare const broadcastTo: typeof broadcastTo_; + +/** + * Broadcast an array to a compatible shape NumPy-style. + * + * The tensor's shape is compared to the broadcast shape from end to beginning. + * Ones are prepended to the tensor's shape until it has the same length as + * the broadcast shape. If input.shape[i]==shape[i], the (i+1)-th axis is + * already broadcast-compatible. If input.shape[i]==1 and shape[i]==N, then + * the input tensor is tiled N times along that axis (using tf.tile). + * + * @param input The tensor that is to be broadcasted. + * @param shape The input is to be broadcast to this shape. + * + * @doc {heading: 'Tensors', subheading: 'Transformations'} + */ +declare function broadcastTo_(x: Tensor | TensorLike, shape: ShapeMap[R]): Tensor; + +export declare interface BroadCastToAttrs { + shape: number[]; + inputShape: number[]; +} + +export declare type BroadcastToInputs = Pick; + +declare namespace browser { + export { + fromPixelsAsync, + toPixels, + fromPixels + } +} +export { browser } + +/** + * Creates an IOHandler that loads model artifacts from user-selected files. + * + * This method can be used for loading from files such as user-selected files + * in the browser. + * When used in conjunction with `tf.loadLayersModel`, an instance of + * `tf.LayersModel` (Keras-style) can be constructed from the loaded artifacts. + * + * ```js + * // Note: This code snippet won't run properly without the actual file input + * // elements in the HTML DOM. + * + * // Suppose there are two HTML file input (``) + * // elements. + * const uploadJSONInput = document.getElementById('upload-json'); + * const uploadWeightsInput = document.getElementById('upload-weights'); + * const model = await tf.loadLayersModel(tf.io.browserFiles( + * [uploadJSONInput.files[0], uploadWeightsInput.files[0]])); + * ``` + * + * @param files `File`s to load from. Currently, this function supports only + * loading from files that contain Keras-style models (i.e., `tf.Model`s), for + * which an `Array` of `File`s is expected (in that order): + * - A JSON file containing the model topology and weight manifest. + * - Optionally, one or more binary files containing the binary weights. + * These files must have names that match the paths in the `weightsManifest` + * contained by the aforementioned JSON file, or errors will be thrown + * during loading. These weights files have the same format as the ones + * generated by `tensorflowjs_converter` that comes with the `tensorflowjs` + * Python PIP package. If no weights files are provided, only the model + * topology will be loaded from the JSON file above. + * @returns An instance of `Files` `IOHandler`. + * + * @doc { + * heading: 'Models', + * subheading: 'Loading', + * namespace: 'io', + * ignoreCI: true + * } + */ +declare function browserFiles(files: File[]): IOHandler; + +/** + * Deprecated. Use `tf.io.http`. + * @param path + * @param loadOptions + */ +declare function browserHTTPRequest(path: string, loadOptions?: LoadOptions): IOHandler; + +/** + * Creates an empty `tf.TensorBuffer` with the specified `shape` and `dtype`. + * + * The values are stored in CPU as `TypedArray`. Fill the buffer using + * `buffer.set()`, or by modifying directly `buffer.values`. + * + * When done, call `buffer.toTensor()` to get an immutable `tf.Tensor` with + * those values. + * + * ```js + * // Create a buffer and set values at particular indices. + * const buffer = tf.buffer([2, 2]); + * buffer.set(3, 0, 0); + * buffer.set(5, 1, 0); + * + * // Convert the buffer back to a tensor. + * buffer.toTensor().print(); + * ``` + * + * @param shape An array of integers defining the output tensor shape. + * @param dtype The dtype of the buffer. Defaults to 'float32'. + * @param values The values of the buffer as `TypedArray`. Defaults to + * zeros. + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ +export declare function buffer(shape: ShapeMap[R], dtype?: D, values?: DataTypeMap[D]): TensorBuffer; + +/** + * Returns the approximate number of bytes allocated in the string array - 2 + * bytes per character. Computing the exact bytes for a native string in JS + * is not possible since it depends on the encoding of the html page that + * serves the website. + */ +declare function bytesFromStringArray(arr: Uint8Array[]): number; + +declare function bytesPerElement(dtype: DataType): number; + +/** + * Calculate the shape information for the output. + * + * @param update The tensor contains the update values. + * @param indices The tensor contains the indices for the update values. + * @param shape The shape of the output tensor. + * + * @returns ScatterShapeInfo + */ +declare function calculateShapes(updates: TensorInfo, indices: TensorInfo, shape: number[]): ScatterShapeInfo; + +export declare const Cast = "Cast"; + +export declare const cast: typeof cast_; + +/** + * Casts a `tf.Tensor` to a new dtype. + * + * ```js + * const x = tf.tensor1d([1.5, 2.5, 3]); + * tf.cast(x, 'int32').print(); + * ``` + * @param x The input tensor to be casted. + * @param dtype The dtype to cast the input tensor to. + * + * @doc {heading: 'Tensors', subheading: 'Transformations'} + */ +declare function cast_(x: T | TensorLike, dtype: DataType): T; + +export declare interface CastAttrs { + dtype: DataType; +} + +export declare type CastInputs = UnaryInputs; + +export declare const Ceil = "Ceil"; + +export declare const ceil: typeof ceil_; + +/** + * Computes ceiling of input `tf.Tensor` element-wise: `ceil(x)` + * + * ```js + * const x = tf.tensor1d([.6, 1.1, -3.3]); + * + * x.ceil().print(); // or tf.ceil(x) + * ``` + * @param x The input Tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function ceil_(x: T | TensorLike): T; + +export declare type CeilInputs = UnaryInputs; + +declare function checkConversionForErrors(vals: DataTypeMap[D] | number[], dtype: D): void; + +/** + * Checks that the dimension sizes from different input tensors match the + * equation. + */ +declare function checkEinsumDimSizes(nDims: number, idDims: number[][], tensors: Tensor[]): void; + +/** + * Check validity of pad when using dimRoundingMode. + * @param opDesc A string of op description + * @param pad The type of padding algorithm. + * - `same` and stride 1: output will be of same size as input, + * regardless of filter size. + * - `valid` output will be smaller than input if filter is larger + * than 1x1. + * - For more info, see this guide: + * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution]( + * https://www.tensorflow.org/api_docs/python/tf/nn/convolution) + * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is + * provided, it will default to truncate. + * @throws unknown padding parameter + */ +declare function checkPadOnDimRoundingMode(opDesc: string, pad: 'valid' | 'same' | number | ExplicitPadding, dimRoundingMode?: 'floor' | 'round' | 'ceil'): void; + +/** Clamps a value to a specified range. */ +declare function clamp(min: number, x: number, max: number): number; + +export declare const ClipByValue = "ClipByValue"; + +export declare const clipByValue: typeof clipByValue_; + +/** + * Clips values element-wise. `max(min(x, clipValueMax), clipValueMin)` + * + * ```js + * const x = tf.tensor1d([-1, 2, -3, 4]); + * + * x.clipByValue(-2, 3).print(); // or tf.clipByValue(x, -2, 3) + * ``` + * @param x The input tensor. + * @param clipValueMin Lower bound of range to be clipped to. + * @param clipValueMax Upper bound of range to be clipped to. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function clipByValue_(x: T | TensorLike, clipValueMin: number, clipValueMax: number): T; + +export declare interface ClipByValueAttrs { + clipValueMin: number; + clipValueMax: number; +} + +export declare type ClipByValueInputs = UnaryInputs; + +export declare const clone: typeof clone_; + +/** + * Creates a new tensor with the same values and shape as the specified + * tensor. + * + * ```js + * const x = tf.tensor([1, 2]); + * + * x.clone().print(); + * ``` + * + * @param x The tensor to clone. + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ +declare function clone_(x: T | TensorLike): T; + +declare function collectGatherOpShapeInfo(x: TensorInfo, indices: TensorInfo, axis: number, batchDims: number): GatherOpShapeInfo; + +declare function combineLocations(outputLoc: number[], reduceLoc: number[], axes: number[]): number[]; + +declare function combineRaggedTensorToTensorShapes(raggedRank: number, shape: number[], valueShape: number[]): number[]; + +export declare const Complex = "Complex"; + +export declare const complex: typeof complex_; + +/** + * Converts two real numbers to a complex number. + * + * Given a tensor `real` representing the real part of a complex number, and a + * tensor `imag` representing the imaginary part of a complex number, this + * operation returns complex numbers elementwise of the form [r0, i0, r1, i1], + * where r represents the real part and i represents the imag part. + * + * The input tensors real and imag must have the same shape. + * + * ```js + * const real = tf.tensor1d([2.25, 3.25]); + * const imag = tf.tensor1d([4.75, 5.75]); + * const complex = tf.complex(real, imag); + * + * complex.print(); + * ``` + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ +declare function complex_(real: T | TensorLike, imag: T | TensorLike): T; + +export declare const ComplexAbs = "ComplexAbs"; + +export declare type ComplexAbsInputs = UnaryInputs; + +export declare type ComplexInputs = Pick; + +/** + * Extracts even indexed complex values in the given array. + * @param complex The complex tensor values + */ +declare function complexWithEvenIndex(complex: Float32Array): { + real: Float32Array; + imag: Float32Array; +}; + +/** + * Extracts odd indexed comple values in the given array. + * @param complex The complex tensor values + */ +declare function complexWithOddIndex(complex: Float32Array): { + real: Float32Array; + imag: Float32Array; +}; + +/** + * Computes the information for a forward pass of a convolution/pooling + * operation. + */ +declare function computeConv2DInfo(inShape: [number, number, number, number], filterShape: [number, number, number, number], strides: number | [number, number], dilations: number | [number, number], pad: 'same' | 'valid' | number | ExplicitPadding, roundingMode?: 'floor' | 'round' | 'ceil', depthwise?: boolean, dataFormat?: 'channelsFirst' | 'channelsLast'): Conv2DInfo; + +/** + * Computes the information for a forward pass of a 3D convolution/pooling + * operation. + */ +declare function computeConv3DInfo(inShape: [number, number, number, number, number], filterShape: [number, number, number, number, number], strides: number | [number, number, number], dilations: number | [number, number, number], pad: 'same' | 'valid' | number, depthwise?: boolean, dataFormat?: 'channelsFirst' | 'channelsLast', roundingMode?: 'floor' | 'round' | 'ceil'): Conv3DInfo; + +declare function computeDefaultPad(inputShape: [number, number] | [number, number, number, number], fieldSize: number, stride: number, dilation?: number): number; + +/** + * + * @param inputShape Input tensor shape is of the following dimensions: + * `[batch, height, width, inChannels]`. + * @param filterShape The filter shape is of the following dimensions: + * `[filterHeight, filterWidth, depth]`. + * @param strides The strides of the sliding window for each dimension of the + * input tensor: `[strideHeight, strideWidth]`. + * If `strides` is a single number, + * then `strideHeight == strideWidth`. + * @param pad The type of padding algorithm. + * - `same` and stride 1: output will be of same size as input, + * regardless of filter size. + * - `valid`: output will be smaller than input if filter is larger + * than 1*1x1. + * - For more info, see this guide: + * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution]( + * https://www.tensorflow.org/api_docs/python/tf/nn/convolution) + * @param dataFormat The data format of the input and output data. + * Defaults to 'NHWC'. + * @param dilations The dilation rates: `[dilationHeight, dilationWidth]`. + * Defaults to `[1, 1]`. If `dilations` is a single number, then + * `dilationHeight == dilationWidth`. + */ +declare function computeDilation2DInfo(inputShape: [number, number, number, number], filterShape: [number, number, number], strides: number | [number, number], pad: 'same' | 'valid' | number, dataFormat: 'NHWC', dilations: number | [number, number]): Conv2DInfo; + +declare function computeFlatOffset(begin: number[], strides: number[]): number; + +declare function computeOptimalWindowSize(inSize: number): number; + +declare function computeOutAndReduceShapes(aShape: number[], axes: number[]): [number[], number[]]; + +/** Computes the output shape given the strided slice params. */ +declare function computeOutShape(begin: number[], end: number[], strides: number[]): number[]; + +declare function computeOutShape_2(aShape: number[], axis: number, numSegments: number): number[]; + +declare function computeOutShape_3(shapes: number[][], axis: number): number[]; + +declare function computePool2DInfo(inShape: [number, number, number, number], filterSize: [number, number] | number, strides: number | [number, number], dilations: number | [number, number], pad: 'same' | 'valid' | number | ExplicitPadding, roundingMode?: 'floor' | 'round' | 'ceil', dataFormat?: 'channelsFirst' | 'channelsLast'): Conv2DInfo; + +/** + * Computes the information for a forward pass of a pooling3D operation. + */ +declare function computePool3DInfo(inShape: [number, number, number, number, number], filterSize: number | [number, number, number], strides: number | [number, number, number], dilations: number | [number, number, number], pad: 'same' | 'valid' | number, roundingMode?: 'floor' | 'round' | 'ceil', dataFormat?: 'NDHWC' | 'NCDHW'): Conv3DInfo; + +declare function computeStrides(shape: number[]): number[]; + +export declare const Concat = "Concat"; + +export declare const concat: typeof concat_; + +export declare const concat1d: typeof concat1d_; + +/** + * Concatenates a list of`tf.Tensor1D`s along an axis. See `concat` for details. + * + * For example, if: + * A: shape(3) = |r1, g1, b1| + * B: shape(2) = |r2, g2| + * C = tf.concat1d([A, B]) == |r1, g1, b1, r2, g2| + * + * @param tensors A list of`tf.Tensor`s to concatenate. + * @return The concatenated array. + */ +declare function concat1d_(tensors: Array): Tensor1D; + +export declare const concat2d: typeof concat2d_; + +/** + * Concatenates a list of`tf.Tensor2D`s along an axis. See `concat` for details. + * + * For example, if: + * A: shape(2, 3) = | r1, g1, b1 | + * | r2, g2, b2 | + * + * B: shape(2, 3) = | r3, g3, b3 | + * | r4, g4, b4 | + * + * C = tf.concat2d([A, B], axis) + * + * if axis = 0: + * C: shape(4, 3) = | r1, g1, b1 | + * | r2, g2, b2 | + * | r3, g3, b3 | + * | r4, g4, b4 | + * + * if axis = 1: + * C = shape(2, 6) = | r1, g1, b1, r3, g3, b3 | + * | r2, g2, b2, r4, g4, b4 | + * + * + * @param tensors A list of `tf.Tensor`s to concatenate. + * @param axis The axis to concatenate along. + * @return The concatenated array. + */ +declare function concat2d_(tensors: Array, axis: number): Tensor2D; + +export declare const concat3d: typeof concat3d_; + +/** + * Concatenates a list of `tf.Tensor3D`s along an axis. + * See `concat` for details. + * + * For example, if: + * A: shape(2, 1, 3) = | r1, g1, b1 | + * | r2, g2, b2 | + * + * B: shape(2, 1, 3) = | r3, g3, b3 | + * | r4, g4, b4 | + * + * C = tf.concat3d([A, B], axis) + * + * if axis = 0: + * C: shape(4, 1, 3) = | r1, g1, b1 | + * | r2, g2, b2 | + * | r3, g3, b3 | + * | r4, g4, b4 | + * + * if axis = 1: + * C: shape(2, 2, 3) = | r1, g1, b1, r3, g3, b3 | + * | r2, g2, b2, r4, g4, b4 | + * + * if axis = 2: + * C = shape(2, 1, 6) = | r1, g1, b1, r3, g3, b3 | + * | r2, g2, b2, r4, g4, b4 | + * + * @param tensors A list of`tf.Tensor`s to concatenate. + * @param axis The axis to concate along. + * @return The concatenated array. + */ +declare function concat3d_(tensors: Array, axis: number): Tensor3D; + +export declare const concat4d: typeof concat4d_; + +/** + * Concatenates a list of `tf.Tensor4D`s along an axis. + * See `concat` for details. + * + * @param tensors A list of `tf.Tensor`s to concatenate. + * @param axis The axis to concate along. + * @return The concatenated array. + */ +declare function concat4d_(tensors: Array, axis: number): Tensor4D; + +/** + * Concatenates a list of `tf.Tensor`s along a given axis. + * + * The tensors ranks and types must match, and their sizes must match in all + * dimensions except `axis`. + * + * Also available are stricter rank-specific methods that assert that + * `tensors` are of the given rank: + * - `tf.concat1d` + * - `tf.concat2d` + * - `tf.concat3d` + * - `tf.concat4d` + * + * Except `tf.concat1d` (which does not have axis param), all methods have + * same signature as this method. + * + * ```js + * const a = tf.tensor1d([1, 2]); + * const b = tf.tensor1d([3, 4]); + * a.concat(b).print(); // or a.concat(b) + * ``` + * + * ```js + * const a = tf.tensor1d([1, 2]); + * const b = tf.tensor1d([3, 4]); + * const c = tf.tensor1d([5, 6]); + * tf.concat([a, b, c]).print(); + * ``` + * + * ```js + * const a = tf.tensor2d([[1, 2], [10, 20]]); + * const b = tf.tensor2d([[3, 4], [30, 40]]); + * const axis = 1; + * tf.concat([a, b], axis).print(); + * ``` + * @param tensors A list of tensors to concatenate. + * @param axis The axis to concatenate along. Defaults to 0 (the first dim). + * + * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'} + */ +declare function concat_(tensors: Array, axis?: number): T; + +export declare interface ConcatAttrs { + axis: number; +} + +/** + * Concatenate a number of ArrayBuffers into one. + * + * @param buffers A number of array buffers to concatenate. + * @returns Result of concatenating `buffers` in order. + */ +declare function concatenateArrayBuffers(buffers: ArrayBuffer[]): ArrayBuffer; + +export declare type ConcatInputs = TensorInfo[]; + +declare interface ConfigDict { + [key: string]: ConfigDictValue; +} + +declare interface ConfigDictArray extends Array { +} + +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/** + * Types to support JSON-esque data structures internally. + * + * Internally ConfigDict's use camelCase keys and values where the + * values are class names to be instantiated. On the python side, these + * will be snake_case. Internally we allow Enums into the values for better + * type safety, but these need to be converted to raw primitives (usually + * strings) for round-tripping with python. + * + * toConfig returns the TS-friendly representation. model.toJSON() returns + * the pythonic version as that's the portable format. If you need to + * python-ify a non-model level toConfig output, you'll need to use a + * convertTsToPythonic from serialization_utils in -Layers. + * + */ +declare type ConfigDictValue = boolean | number | string | null | ConfigDictArray | ConfigDict; + +declare const confusionMatrix: typeof confusionMatrix_; + +/** + * Computes the confusion matrix from true labels and predicted labels. + * + * ```js + * const labels = tf.tensor1d([0, 1, 2, 1, 0], 'int32'); + * const predictions = tf.tensor1d([0, 2, 2, 1, 0], 'int32'); + * const numClasses = 3; + * const out = tf.math.confusionMatrix(labels, predictions, numClasses); + * out.print(); + * // Expected output matrix: + * // [[2, 0, 0], + * // [0, 1, 1], + * // [0, 0, 1]] + * ``` + * + * @param labels The target labels, assumed to be 0-based integers + * for the classes. The shape is `[numExamples]`, where + * `numExamples` is the number of examples included. + * @param predictions The predicted classes, assumed to be + * 0-based integers for the classes. Must have the same shape as `labels`. + * @param numClasses Number of all classes, as an integer. + * Its value must be larger than the largest element in `labels` and + * `predictions`. + * @returns The confusion matrix as a int32-type 2D tensor. The value at + * row `r` and column `c` is the number of times examples of actual class + * `r` were predicted as class `c`. + * + * @doc {heading: 'Operations', subheading: 'Evaluation'} + */ +declare function confusionMatrix_(labels: Tensor1D | TensorLike, predictions: Tensor1D | TensorLike, numClasses: number): Tensor2D; + +export declare const conv1d: typeof conv1d_; + +/** + * Computes a 1D convolution over the input x. + * + * @param x The input tensor, of rank 3 or rank 2, of shape + * `[batch, width, inChannels]`. If rank 2, batch of 1 is assumed. + * @param filter The filter, rank 3, of shape + * `[filterWidth, inDepth, outDepth]`. + * @param stride The number of entries by which the filter is moved right at + * each step. + * @param pad The type of padding algorithm. + * - `same` and stride 1: output will be of same size as input, + * regardless of filter size. + * - `valid`: output will be smaller than input if filter is larger + * than 1x1. + * - For more info, see this guide: + * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution]( + * https://www.tensorflow.org/api_docs/python/tf/nn/convolution) + * @param dataFormat An optional string from "NWC", "NCW". Defaults to "NWC", + * the data is stored in the order of [batch, in_width, in_channels]. Only + * "NWC" is currently supported. + * @param dilation The dilation rate in which we sample input values in + * atrous convolution. Defaults to `1`. If it is greater than 1, then + * stride must be `1`. + * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is + * provided, it will default to truncate. + * + * @doc {heading: 'Operations', subheading: 'Convolution'} + */ +declare function conv1d_(x: T | TensorLike, filter: Tensor3D | TensorLike, stride: number, pad: 'valid' | 'same' | number | conv_util.ExplicitPadding, dataFormat?: 'NWC' | 'NCW', dilation?: number, dimRoundingMode?: 'floor' | 'round' | 'ceil'): T; + +export declare const Conv2D = "Conv2D"; + +export declare const conv2d: typeof conv2d_; + +/** + * Computes a 2D convolution over the input x. + * + * @param x The input tensor, of rank 4 or rank 3, of shape + * `[batch, height, width, inChannels]`. If rank 3, batch of 1 is + * assumed. + * @param filter The filter, rank 4, of shape + * `[filterHeight, filterWidth, inDepth, outDepth]`. + * @param strides The strides of the convolution: `[strideHeight, + * strideWidth]`. + * @param pad The type of padding algorithm. + * - `same` and stride 1: output will be of same size as input, + * regardless of filter size. + * - `valid`: output will be smaller than input if filter is larger + * than 1x1. + * - For more info, see this guide: + * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution]( + * https://www.tensorflow.org/api_docs/python/tf/nn/convolution) + * @param dataFormat: An optional string from: "NHWC", "NCHW". Defaults to + * "NHWC". Specify the data format of the input and output data. With the + * default format "NHWC", the data is stored in the order of: [batch, + * height, width, channels]. + * @param dilations The dilation rates: `[dilationHeight, dilationWidth]` + * in which we sample input values across the height and width dimensions + * in atrous convolution. Defaults to `[1, 1]`. If `dilations` is a single + * number, then `dilationHeight == dilationWidth`. If it is greater than + * 1, then all values of `strides` must be 1. + * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is + * provided, it will default to truncate. + * + * @doc {heading: 'Operations', subheading: 'Convolution'} + */ +declare function conv2d_(x: T | TensorLike, filter: Tensor4D | TensorLike, strides: [number, number] | number, pad: 'valid' | 'same' | number | conv_util.ExplicitPadding, dataFormat?: 'NHWC' | 'NCHW', dilations?: [number, number] | number, dimRoundingMode?: 'floor' | 'round' | 'ceil'): T; + +declare const conv2d_2: typeof fusedConv2d_; + +export declare interface Conv2DAttrs { + strides: [number, number] | number; + pad: 'valid' | 'same' | number | ExplicitPadding; + dataFormat: 'NHWC' | 'NCHW'; + dilations: [number, number] | number; + dimRoundingMode?: 'floor' | 'round' | 'ceil'; +} + +export declare const Conv2DBackpropFilter = "Conv2DBackpropFilter"; + +export declare interface Conv2DBackpropFilterAttrs { + strides: [number, number] | number; + pad: 'valid' | 'same' | number | ExplicitPadding; + dataFormat: 'NHWC' | 'NCHW'; + dimRoundingMode?: 'floor' | 'round' | 'ceil'; + filterShape: [number, number, number, number]; +} + +export declare type Conv2DBackpropFilterInputs = Pick; + +export declare const Conv2DBackpropInput = "Conv2DBackpropInput"; + +export declare interface Conv2DBackpropInputAttrs { + strides: [number, number] | number; + pad: 'valid' | 'same' | number | ExplicitPadding; + dataFormat: 'NHWC' | 'NCHW'; + dimRoundingMode?: 'floor' | 'round' | 'ceil'; + inputShape: [number, number, number, number]; +} + +export declare type Conv2DBackpropInputInputs = Pick; + +/** + * Information about the forward pass of a convolution/pooling operation. + * It includes input and output shape, strides, filter size and padding + * information. + */ +declare type Conv2DInfo = { + batchSize: number; + inHeight: number; + inWidth: number; + inChannels: number; + outHeight: number; + outWidth: number; + outChannels: number; + dataFormat: 'channelsFirst' | 'channelsLast'; + strideHeight: number; + strideWidth: number; + dilationHeight: number; + dilationWidth: number; + filterHeight: number; + filterWidth: number; + effectiveFilterHeight: number; + effectiveFilterWidth: number; + padInfo: PadInfo; + inShape: [number, number, number, number]; + outShape: [number, number, number, number]; + filterShape: [number, number, number, number]; +}; + +export declare type Conv2DInputs = Pick; + +export declare const conv2dTranspose: typeof conv2dTranspose_; + +/** + * Computes the transposed 2D convolution of an image, also known as a + * deconvolution. + * + * @param x The input image, of rank 4 or rank 3, of shape + * `[batch, height, width, inDepth]`. If rank 3, batch of 1 is assumed. + * @param filter The filter, rank 4, of shape + * `[filterHeight, filterWidth, outDepth, inDepth]`. + * `inDepth` must match `inDepth` in `x`. + * @param outputShape Output shape, of rank 4 or rank 3: + * `[batch, height, width, outDepth]`. If rank 3, batch of 1 is assumed. + * @param strides The strides of the original convolution: + * `[strideHeight, strideWidth]`. + * @param pad The type of padding algorithm used in the non-transpose version + * of the op. + * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is + * provided, it will default to truncate. + * + * @doc {heading: 'Operations', subheading: 'Convolution'} + */ +declare function conv2dTranspose_(x: T | TensorLike, filter: Tensor4D | TensorLike, outputShape: [number, number, number, number] | [number, number, number], strides: [number, number] | number, pad: 'valid' | 'same' | number | ExplicitPadding, dimRoundingMode?: 'floor' | 'round' | 'ceil'): T; + +export declare const Conv3D = "Conv3D"; + +export declare const conv3d: typeof conv3d_; + +/** + * Computes a 3D convolution over the input x. + * + * @param x The input tensor, of rank 5 or rank 4, of shape + * `[batch, depth, height, width, channels]`. If rank 4, + * batch of 1 is assumed. + * @param filter The filter, rank 5, of shape + * `[filterDepth, filterHeight, filterWidth, inChannels, outChannels]`. + * inChannels must match between input and filter. + * @param strides The strides of the convolution: `[strideDepth, strideHeight, + * strideWidth]`. + * @param pad The type of padding algorithm. + * - `same` and stride 1: output will be of same size as input, + * regardless of filter size. + * - `valid`: output will be smaller than input if filter is larger + * than 1x1. + * - For more info, see this guide: + * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution]( + * https://www.tensorflow.org/api_docs/python/tf/nn/convolution) + * @param dataFormat: An optional string from: "NDHWC", "NCDHW". Defaults to + * "NDHWC". Specify the data format of the input and output data. With the + * default format "NDHWC", the data is stored in the order of: [batch, + * depth, height, width, channels]. Only "NDHWC" is currently supported. + * @param dilations The dilation rates: `[dilationDepth, dilationHeight, + * dilationWidth]` in which we sample input values across the height + * and width dimensions in atrous convolution. Defaults to `[1, 1, 1]`. + * If `dilations` is a single number, then + * `dilationDepth == dilationHeight == dilationWidth`. If it is greater + * than 1, then all values of `strides` must be 1. + * + * @doc {heading: 'Operations', subheading: 'Convolution'} + */ +declare function conv3d_(x: T | TensorLike, filter: Tensor5D | TensorLike, strides: [number, number, number] | number, pad: 'valid' | 'same', dataFormat?: 'NDHWC' | 'NCDHW', dilations?: [number, number, number] | number): T; + +export declare interface Conv3DAttrs { + strides: [number, number, number] | number; + pad: 'valid' | 'same'; + dataFormat: 'NDHWC' | 'NCDHW'; + dilations: [number, number, number] | number; +} + +export declare const Conv3DBackpropFilterV2 = "Conv3DBackpropFilterV2"; + +export declare interface Conv3DBackpropFilterV2Attrs { + strides: [number, number, number] | number; + pad: 'valid' | 'same'; + filterShape: [number, number, number, number, number]; +} + +export declare type Conv3DBackpropFilterV2Inputs = Pick; + +export declare const Conv3DBackpropInputV2 = "Conv3DBackpropInputV2"; + +export declare interface Conv3DBackpropInputV2Attrs { + strides: [number, number, number] | number; + pad: 'valid' | 'same'; + inputShape: [number, number, number, number, number]; +} + +export declare type Conv3DBackpropInputV2Inputs = Pick; + +/** + * Information about the forward pass of a 3D convolution/pooling operation. + * It includes input and output shape, strides, filter size and padding + * information. + */ +declare type Conv3DInfo = { + batchSize: number; + inDepth: number; + inHeight: number; + inWidth: number; + inChannels: number; + outDepth: number; + outHeight: number; + outWidth: number; + outChannels: number; + dataFormat: 'channelsFirst' | 'channelsLast'; + strideDepth: number; + strideHeight: number; + strideWidth: number; + dilationDepth: number; + dilationHeight: number; + dilationWidth: number; + filterDepth: number; + filterHeight: number; + filterWidth: number; + effectiveFilterDepth: number; + effectiveFilterHeight: number; + effectiveFilterWidth: number; + padInfo: PadInfo3D; + inShape: [number, number, number, number, number]; + outShape: [number, number, number, number, number]; + filterShape: [number, number, number, number, number]; +}; + +export declare type Conv3DInputs = Pick; + +export declare const conv3dTranspose: typeof conv3dTranspose_; + +/** + * Computes the transposed 3D convolution of a volume, also known as a + * deconvolution. + * + * @param x The input image, of rank 5 or rank 4, of shape + * `[batch, depth, height, width, inDepth]`. If rank 4, batch of 1 is assumed. + * @param filter The filter, rank 4, of shape + * `[depth, filterHeight, filterWidth, outDepth, inDepth]`. + * `inDepth` must match `inDepth` in `x`. + * @param outputShape Output shape, of rank 5 or rank 4: + * `[batch, depth, height, width, outDepth]`. If rank 3, batch of 1 is + * assumed. + * @param strides The strides of the original convolution: + * `[strideDepth, strideHeight, strideWidth]`. + * @param pad The type of padding algorithm used in the non-transpose version + * of the op. + * + * @doc {heading: 'Operations', subheading: 'Convolution'} + */ +declare function conv3dTranspose_(x: T | TensorLike, filter: Tensor5D | TensorLike, outputShape: [ +number, +number, +number, +number, +number +] | [number, number, number, number], strides: [number, number, number] | number, pad: 'valid' | 'same'): T; + +declare namespace conv_util { + export { + computeDilation2DInfo, + computePool2DInfo, + computePool3DInfo, + computeConv2DInfo, + computeConv3DInfo, + computeDefaultPad, + tupleValuesAreOne, + eitherStridesOrDilationsAreOne, + convertConv2DDataFormat, + checkPadOnDimRoundingMode, + ExplicitPadding, + PadInfo, + PadInfo3D, + Conv2DInfo, + Conv3DInfo + } +} + +/** + * Convert Conv2D dataFormat from 'NHWC'|'NCHW' to + * 'channelsLast'|'channelsFirst' + * @param dataFormat in 'NHWC'|'NCHW' mode + * @return dataFormat in 'channelsLast'|'channelsFirst' mode + * @throws unknown dataFormat + */ +declare function convertConv2DDataFormat(dataFormat: 'NHWC' | 'NCHW'): 'channelsLast' | 'channelsFirst'; + +/** + * Copy a model from one URL to another. + * + * This function supports: + * + * 1. Copying within a storage medium, e.g., + * `tf.io.copyModel('localstorage://model-1', 'localstorage://model-2')` + * 2. Copying between two storage mediums, e.g., + * `tf.io.copyModel('localstorage://model-1', 'indexeddb://model-1')` + * + * ```js + * // First create and save a model. + * const model = tf.sequential(); + * model.add(tf.layers.dense( + * {units: 1, inputShape: [10], activation: 'sigmoid'})); + * await model.save('localstorage://demo/management/model1'); + * + * // Then list existing models. + * console.log(JSON.stringify(await tf.io.listModels())); + * + * // Copy the model, from Local Storage to IndexedDB. + * await tf.io.copyModel( + * 'localstorage://demo/management/model1', + * 'indexeddb://demo/management/model1'); + * + * // List models again. + * console.log(JSON.stringify(await tf.io.listModels())); + * + * // Remove both models. + * await tf.io.removeModel('localstorage://demo/management/model1'); + * await tf.io.removeModel('indexeddb://demo/management/model1'); + * ``` + * + * @param sourceURL Source URL of copying. + * @param destURL Destination URL of copying. + * @returns ModelArtifactsInfo of the copied model (if and only if copying + * is successful). + * @throws Error if copying fails, e.g., if no model exists at `sourceURL`, or + * if `oldPath` and `newPath` are identical. + * + * @doc { + * heading: 'Models', + * subheading: 'Management', + * namespace: 'io', + * ignoreCI: true + * } + */ +declare function copyModel(sourceURL: string, destURL: string): Promise; + +/** + * Finds kernels that have already been registered to a backend and re-registers + * them for a new backend. Useful for registering custom backends. + * @param registeredBackendName Already registered backend. + * @param newBackendName New backend. + */ +export declare function copyRegisteredKernels(registeredBackendName: string, newBackendName: string): void; + +export declare const Cos = "Cos"; + +export declare const cos: typeof cos_; + +/** + * Computes cos of the input `tf.Tensor` element-wise: `cos(x)` + * + * ```js + * const x = tf.tensor1d([0, Math.PI / 2, Math.PI * 3 / 4]); + * + * x.cos().print(); // or tf.cos(x) + * ``` + * @param x The input tensor. Must be float32 type. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function cos_(x: T | TensorLike): T; + +export declare const Cosh = "Cosh"; + +export declare const cosh: typeof cosh_; + +/** + * Computes hyperbolic cos of the input `tf.Tensor` element-wise: `cosh(x)` + * + * ```js + * const x = tf.tensor1d([0, 1, -1, .7]); + * + * x.cosh().print(); // or tf.cosh(x) + * ``` + * @param x The input tensor. Must be float32 type. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function cosh_(x: T | TensorLike): T; + +export declare type CoshInputs = UnaryInputs; + +export declare function cosineWindow(windowLength: number, a: number, b: number): Tensor1D; + +export declare type CosInputs = UnaryInputs; + +/** + * Create typed array for scalar value. Used for storing in `DataStorage`. + */ +declare function createScalarValue(value: DataType, dtype: DataType): BackendValues; + +/** + * Creates a new array with randomized indices to a given quantity. + * + * ```js + * const randomTen = tf.util.createShuffledIndices(10); + * console.log(randomTen); + * ``` + * + * @param number Quantity of how many shuffled indices to create. + * + * @doc {heading: 'Util', namespace: 'util'} + */ +declare function createShuffledIndices(n: number): Uint32Array; + +/** Creates an HTMLVideoElement with autoplay-friendly default settings. */ +declare function createVideoElement(source: HTMLSourceElement): Promise; + +export declare const CropAndResize = "CropAndResize"; + +export declare interface CropAndResizeAttrs { + cropSize: [number, number]; + method: 'bilinear' | 'nearest'; + extrapolationValue: number; +} + +export declare type CropAndResizeInputs = Pick; + +export declare const Cumprod = "Cumprod"; + +export declare const cumprod: typeof cumprod_; + +/** + * Computes the cumulative product of a `tf.Tensor` along `axis`. + * + * ```js + * const x = tf.tensor([1, 2, 3, 4]); + * x.cumprod().print(); + * ``` + * ```js + * const x = tf.tensor([[1, 2], [3, 4]]); + * x.cumprod().print(); + * ``` + * + * @param x The input tensor to cumulatively multiply. + * @param axis The axis along which to multiply. Optional. Defaults to 0. + * @param exclusive Whether to perform exclusive cumulative product. Optional. + * Defaults to false. If set to true then the product of each tensor entry + * does not include its own value, but only the values previous to it + * along the specified axis. + * @param reverse Whether to multiply in the opposite direction. Optional. + * Defaults to false. + * + * @doc {heading: 'Operations', subheading: 'Scan'} + */ +declare function cumprod_(x: Tensor | TensorLike, axis?: number, exclusive?: boolean, reverse?: boolean): T; + +export declare interface CumprodAttrs { + axis: number; + exclusive: boolean; + reverse: boolean; +} + +export declare type CumprodInputs = Pick; + +export declare const Cumsum = "Cumsum"; + +export declare const cumsum: typeof cumsum_; + +/** + * Computes the cumulative sum of a `tf.Tensor` along `axis`. + * + * ```js + * const x = tf.tensor([1, 2, 3, 4]); + * x.cumsum().print(); + * ``` + * ```js + * const x = tf.tensor([[1, 2], [3, 4]]); + * x.cumsum().print(); + * ``` + * + * @param x The input tensor to be summed. + * @param axis The axis along which to sum. Optional. Defaults to 0. + * @param exclusive Whether to perform exclusive cumulative sum. Optional. + * Defaults to false. If set to true then the sum of each tensor entry + * does not include its own value, but only the values previous to it + * along the specified axis. + * @param reverse Whether to sum in the opposite direction. Optional. + * Defaults to false. + * + * @doc {heading: 'Operations', subheading: 'Scan'} + */ +declare function cumsum_(x: Tensor | TensorLike, axis?: number, exclusive?: boolean, reverse?: boolean): T; + +export declare interface CumsumAttrs { + axis: number; + exclusive: boolean; + reverse: boolean; +} + +export declare type CumsumInputs = Pick; + +/** + * Overrides the gradient computation of a function `f`. + * + * Takes a function + * `f(...inputs, save) => {value: Tensor, gradFunc: (dy, saved) => Tensor[]}` + * and returns another function `g(...inputs)` which takes the same inputs as + * `f`. When called, `g` returns `f().value`. In backward mode, custom gradients + * with respect to each input of `f` are computed using `f().gradFunc`. + * + * The `save` function passed to `f` should be used for saving tensors needed + * in the gradient. And the `saved` passed to the `gradFunc` is a + * `NamedTensorMap`, which contains those saved tensors. + * + * ```js + * const customOp = tf.customGrad((x, save) => { + * // Save x to make sure it's available later for the gradient. + * save([x]); + * // Override gradient of our custom x ^ 2 op to be dy * abs(x); + * return { + * value: x.square(), + * // Note `saved.x` which points to the `x` we saved earlier. + * gradFunc: (dy, saved) => [dy.mul(saved[0].abs())] + * }; + * }); + * + * const x = tf.tensor1d([-1, -2, 3]); + * const dx = tf.grad(x => customOp(x)); + * + * console.log(`f(x):`); + * customOp(x).print(); + * console.log(`f'(x):`); + * dx(x).print(); + * ``` + * + * @param f The function to evaluate in forward mode, which should return + * `{value: Tensor, gradFunc: (dy, saved) => Tensor[]}`, where `gradFunc` + * returns the custom gradients of `f` with respect to its inputs. + * + * @doc {heading: 'Training', subheading: 'Gradients'} + */ +export declare function customGrad(f: CustomGradientFunc): (...args: Tensor[]) => T; + +/** + * @docalias (a: Tensor, b: Tensor,..., save?: Function) => { + * value: Tensor, + * gradFunc: (dy: Tensor, saved?: NamedTensorMap) => Tensor | Tensor[] + * } + */ +declare type CustomGradientFunc = (...inputs: Array) => { + value: T; + gradFunc: (dy: T, saved: Tensor[]) => Tensor | Tensor[]; +}; + +/** + * We wrap data id since we use weak map to avoid memory leaks. + * Since we have our own memory management, we have a reference counter + * mapping a tensor to its data, so there is always a pointer (even if that + * data is otherwise garbage collectable). + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ + * Global_Objects/WeakMap + */ +export declare type DataId = object; + +export declare interface DataMover { + /** + * To be called by backends whenever they see a dataId that they don't own. + * Upon calling this method, the mover will fetch the tensor from another + * backend and register it with the current active backend. + */ + moveData(backend: KernelBackend, dataId: DataId): void; +} + +/** Convenient class for storing tensor-related data. */ +export declare class DataStorage { + private backend; + private dataMover; + private data; + private dataIdsCount; + constructor(backend: KernelBackend, dataMover: DataMover); + get(dataId: DataId): T; + set(dataId: DataId, value: T): void; + has(dataId: DataId): boolean; + delete(dataId: DataId): boolean; + numDataIds(): number; +} + +export declare type DataToGPUOptions = DataToGPUWebGLOption; + +export declare interface DataToGPUWebGLOption { + customTexShape?: [number, number]; +} + +/** @docalias 'float32'|'int32'|'bool'|'complex64'|'string' */ +export declare type DataType = keyof DataTypeMap; + +export declare interface DataTypeMap { + float32: Float32Array; + int32: Int32Array; + bool: Uint8Array; + complex64: Float32Array; + string: string[]; +} + +/** Tensor data used in tensor creation and user-facing API. */ +export declare type DataValues = DataTypeMap[DataType]; + +/** + * Parse an equation for einsum. + * + * @param equation The einsum equation (e.g., "ij,jk->ik"). + * @param numTensors Number of tensors provided along with `equation`. Used to + * check matching number of input tensors. + * @returns An object consisting of the following fields: + * - allDims: all dimension names as strings. + * - summedDims: a list of all dimensions being summed over, as indices to + * the elements of `allDims`. + * - idDims: indices of the dimensions in each input tensor, as indices to + * the elements of `allDims. + */ +declare function decodeEinsumEquation(equation: string, numTensors: number): { + allDims: string[]; + summedDims: number[]; + idDims: number[][]; +}; + +/** + * Decodes the provided bytes into a string using the provided encoding scheme. + * @param bytes The bytes to decode. + * + * @param encoding The encoding scheme. Defaults to utf-8. + * + * @doc {heading: 'Util'} + */ +declare function decodeString(bytes: Uint8Array, encoding?: string): string; + +/** + * Decode flat ArrayBuffer as weights. + * + * This function does not handle sharding. + * + * This function is the reverse of `encodeWeights`. + * + * @param buffer A flat ArrayBuffer carrying the binary values of the tensors + * concatenated in the order specified in `specs`. + * @param specs Specifications of the names, dtypes and shapes of the tensors + * whose value are encoded by `buffer`. + * @return A map from tensor name to tensor value, with the names corresponding + * to names in `specs`. + * @throws Error, if any of the tensors has unsupported dtype. + */ +declare function decodeWeights(buffer: ArrayBuffer, specs: WeightsManifestEntry[]): NamedTensorMap; + +export declare const DenseBincount = "DenseBincount"; + +export declare const denseBincount: typeof denseBincount_; + +/** + * Outputs a vector with length `size` and the same dtype as `weights`. + * + * If `weights` are empty, then index `i` stores the number of times the value + * `i` is counted in `x`. If `weights` are non-empty, then index `i` stores the + * sum of the value in `weights` at each index where the corresponding value in + * `x` is `i`. + * + * Values in `x` outside of the range [0, size) are ignored. + * + * @param x The input int tensor, rank 1 or rank 2. + * @param weights The weights tensor, must have the same shape as x, or a + * length-0 Tensor, in which case it acts as all weights equal to 1. + * @param size Non-negative integer. + * @param binaryOutput Optional. Whether the kernel should count the appearance + * or number of occurrences. Defaults to False. + * + * @doc {heading: 'Operations', subheading: 'Reduction'} + */ +declare function denseBincount_(x: T | TensorLike, weights: T | TensorLike, size: number, binaryOutput?: boolean): T; + +export declare interface DenseBincountAttrs { + size: number; + binaryOutput?: boolean; +} + +export declare type DenseBincountInputs = Pick; + +/** Warn users about deprecated functionality. */ +export declare function deprecationWarn(msg: string): void; + +export declare const DepthToSpace = "DepthToSpace"; + +export declare const depthToSpace: typeof depthToSpace_; + +/** + * Rearranges data from depth into blocks of spatial data. More specifically, + * this op outputs a copy of the input tensor where values from the `depth` + * dimension are moved in spatial blocks to the `height` and `width` dimensions. + * The attr `blockSize` indicates the input block size and how the data is + * moved. + * + * - Chunks of data of size `blockSize * blockSize` from depth are rearranged + * into non-overlapping blocks of size `blockSize x blockSize` + * + * - The width the output tensor is `inputWidth * blockSize`, whereas the + * height is `inputHeight * blockSize` + * + * - The Y, X coordinates within each block of the output image are determined + * by the high order component of the input channel index + * + * - The depth of the input tensor must be divisible by `blockSize * + * blockSize` + * + * The `dataFormat` attr specifies the layout of the input and output tensors + * with the following options: "NHWC": [ `batch, height, width, channels` ] + * "NCHW": [ `batch, channels, height, width` ] + * + * ```js + * const x = tf.tensor4d([1, 2, 3, 4], [1, 1, 1, 4]); + * const blockSize = 2; + * const dataFormat = "NHWC"; + * + * tf.depthToSpace(x, blockSize, dataFormat).print(); + * ``` + * + * @param x The input tensor of rank 4 + * @param blockSIze An `int` that is `>= 2`. The size of the spatial block + * @param dataFormat An optional string from: "NHWC", "NCHW". Defaults to "NHWC" + * + * @doc {heading: 'Tensors', subheading: 'Transformations'} + */ +declare function depthToSpace_(x: Tensor4D | TensorLike4D, blockSize: number, dataFormat?: 'NHWC' | 'NCHW'): Tensor4D; + +export declare interface DepthToSpaceAttrs { + blockSize: number; + dataFormat: 'NHWC' | 'NCHW'; +} + +export declare type DepthToSpaceInputs = Pick; + +export declare const depthwiseConv2d: typeof depthwiseConv2d_; + +/** + * Depthwise 2D convolution. + * + * Given a 4D `input` array and a `filter` array of shape + * `[filterHeight, filterWidth, inChannels, channelMultiplier]` containing + * `inChannels` convolutional filters of depth 1, this op applies a + * different filter to each input channel (expanding from 1 channel to + * `channelMultiplier` channels for each), then concatenates the results + * together. The output has `inChannels * channelMultiplier` channels. + * + * See + * [https://www.tensorflow.org/api_docs/python/tf/nn/depthwise_conv2d]( + * https://www.tensorflow.org/api_docs/python/tf/nn/depthwise_conv2d) + * for more details. + * + * @param x The input tensor, of rank 4 or rank 3, of shape + * `[batch, height, width, inChannels]`. If rank 3, batch of 1 is + * assumed. + * @param filter The filter tensor, rank 4, of shape + * `[filterHeight, filterWidth, inChannels, channelMultiplier]`. + * @param strides The strides of the convolution: `[strideHeight, + * strideWidth]`. If strides is a single number, then `strideHeight == + * strideWidth`. + * @param pad The type of padding algorithm. + * - `same` and stride 1: output will be of same size as input, + * regardless of filter size. + * - `valid`: output will be smaller than input if filter is larger + * than 1x1. + * - For more info, see this guide: + * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution]( + * https://www.tensorflow.org/api_docs/python/tf/nn/convolution) + * @param dilations The dilation rates: `[dilationHeight, dilationWidth]` + * in which we sample input values across the height and width dimensions + * in atrous convolution. Defaults to `[1, 1]`. If `rate` is a single + * number, then `dilationHeight == dilationWidth`. If it is greater than + * 1, then all values of `strides` must be 1. + * @param dataFormat: An optional string from: "NHWC", "NCHW". Defaults to + * "NHWC". Specify the data format of the input and output data. With the + * default format "NHWC", the data is stored in the order of: [batch, + * height, width, channels]. Only "NHWC" is currently supported. + * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is + * provided, it will default to truncate. + * + * @doc {heading: 'Operations', subheading: 'Convolution'} + */ +declare function depthwiseConv2d_(x: T | TensorLike, filter: Tensor4D | TensorLike, strides: [number, number] | number, pad: 'valid' | 'same' | number | conv_util.ExplicitPadding, dataFormat?: 'NHWC' | 'NCHW', dilations?: [number, number] | number, dimRoundingMode?: 'floor' | 'round' | 'ceil'): T; + +declare const depthwiseConv2d_2: typeof fusedDepthwiseConv2d_; + +export declare const DepthwiseConv2dNative = "DepthwiseConv2dNative"; + +export declare interface DepthwiseConv2dNativeAttrs { + strides: [number, number] | number; + pad: 'valid' | 'same' | number | ExplicitPadding; + dataFormat: 'NHWC' | 'NCHW'; + dilations: [number, number] | number; + dimRoundingMode?: 'floor' | 'round' | 'ceil'; +} + +export declare const DepthwiseConv2dNativeBackpropFilter = "DepthwiseConv2dNativeBackpropFilter"; + +export declare interface DepthwiseConv2dNativeBackpropFilterAttrs { + strides: [number, number] | number; + dilations: [number, number] | number; + pad: 'valid' | 'same' | number | ExplicitPadding; + dimRoundingMode?: 'floor' | 'round' | 'ceil'; + filterShape: [number, number, number, number]; +} + +export declare type DepthwiseConv2dNativeBackpropFilterInputs = Pick; + +export declare const DepthwiseConv2dNativeBackpropInput = "DepthwiseConv2dNativeBackpropInput"; + +export declare interface DepthwiseConv2dNativeBackpropInputAttrs { + strides: [number, number] | number; + dilations: [number, number] | number; + pad: 'valid' | 'same' | number | ExplicitPadding; + dimRoundingMode?: 'floor' | 'round' | 'ceil'; + inputShape: [number, number, number, number]; +} + +export declare type DepthwiseConv2dNativeBackpropInputInputs = Pick; + +export declare type DepthwiseConv2dNativeInputs = Pick; + +declare namespace device_util { + export { + mockIsMobile, + isMobile, + isBrowser + } +} +export { device_util } + +export declare const Diag = "Diag"; + +export declare const diag: typeof diag_; + +/** + * Returns a diagonal tensor with given diagonal values. + * + * Given a diagonal, this operation returns a tensor with the diagonal and + * everything else padded with zeros. + * + * Assume the input has dimensions `[D1,..., Dk]`, then the output is a tensor + * of rank 2k with dimensions `[D1,..., Dk, D1,..., Dk]` + * + * ```js + * const x = tf.tensor1d([1, 2, 3, 4]); + * + * tf.diag(x).print() + * ``` + * ```js + * const x = tf.tensor2d([1, 2, 3, 4, 5, 6, 6, 8], [4, 2]) + * + * tf.diag(x).print() + * ``` + * @param x The input tensor. + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ +declare function diag_(x: Tensor): Tensor; + +export declare type DiagInputs = Pick; + +export declare const Dilation2D = "Dilation2D"; + +export declare const dilation2d: typeof dilation2d_; + +/** + * Computes the grayscale dilation over the input `x`. + * + * @param x The input tensor, rank 3 or rank 4 of shape + * `[batch, height, width, inChannels]`. If rank 3, batch of 1 is assumed. + * @param filter The filter tensor, rank 3, of shape + * `[filterHeight, filterWidth, depth]`. + * @param strides The strides of the sliding window for each dimension of the + * input tensor: `[strideHeight, strideWidth]`. + * If `strides` is a single number, + * then `strideHeight == strideWidth`. + * @param pad The type of padding algorithm. + * - `same` and stride 1: output will be of same size as input, + * regardless of filter size. + * - `valid`: output will be smaller than input if filter is larger + * than 1*1x1. + * - For more info, see this guide: + * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution]( + * https://www.tensorflow.org/api_docs/python/tf/nn/convolution) + * @param dataFormat Specify the data format of the input and output data. + * Defaults to 'NHWC'. Only 'NHWC' is currently supported. With the + * default format "NHWC", the data is stored in the order of: [batch, + * height, width, channels]. + * @param dilations The dilation rates: `[dilationHeight, dilationWidth]` + * in which we sample input values across the height and width dimensions + * for atrous morphological dilation. Defaults to `[1, 1]`. If `dilations` + * is a single number, then `dilationHeight == dilationWidth`. If it is + * greater than 1, then all values of `strides` must be 1. + * + * @doc {heading: 'Operations', subheading: 'Convolution'} + */ +declare function dilation2d_(x: T | TensorLike, filter: Tensor3D | TensorLike, strides: [number, number] | number, pad: 'valid' | 'same', dilations?: [number, number] | number, dataFormat?: 'NHWC'): T; + +export declare interface Dilation2DAttrs { + strides: [number, number] | number; + pad: 'valid' | 'same' | number; + dilations: [number, number] | number; +} + +export declare const Dilation2DBackpropFilter = "Dilation2DBackpropFilter"; + +export declare type Dilation2DBackpropFilterInputs = Pick; + +export declare const Dilation2DBackpropInput = "Dilation2DBackpropInput"; + +export declare type Dilation2DBackpropInputInputs = Pick; + +export declare type Dilation2DInputs = Pick; + +/** Globally disables deprecation warnings */ +export declare function disableDeprecationWarnings(): void; + +/** + * Disposes any `tf.Tensor`s found within the provided object. + * + * @param container an object that may be a `tf.Tensor` or may directly + * contain `tf.Tensor`s, such as a `Tensor[]` or `{key: Tensor, ...}`. If + * the object is not a `tf.Tensor` or does not contain `Tensors`, nothing + * happens. In general it is safe to pass any object here, except that + * `Promise`s are not supported. + * + * @doc {heading: 'Performance', subheading: 'Memory'} + */ +export declare function dispose(container: TensorContainer): void; + +/** + * Dispose all variables kept in backend engine. + * + * @doc {heading: 'Environment'} + */ +export declare function disposeVariables(): void; + +/** Returns the squared Euclidean distance between two vectors. */ +declare function distSquared(a: FlatVector, b: FlatVector): number; + +export declare const div: typeof div_; + +/** + * Divides two `tf.Tensor`s element-wise, A / B. Supports broadcasting. + * + * ```js + * const a = tf.tensor1d([1, 4, 9, 16]); + * const b = tf.tensor1d([1, 2, 3, 4]); + * + * a.div(b).print(); // or tf.div(a, b) + * ``` + * + * ```js + * // Broadcast div a with b. + * const a = tf.tensor1d([2, 4, 6, 8]); + * const b = tf.scalar(2); + * + * a.div(b).print(); // or tf.div(a, b) + * ``` + * + * @param a The first tensor as the numerator. + * @param b The second tensor as the denominator. Must have the same dtype as + * `a`. + * + * @doc {heading: 'Operations', subheading: 'Arithmetic'} + */ +declare function div_(a: Tensor | TensorLike, b: Tensor | TensorLike): T; + +export declare const divNoNan: typeof divNoNan_; + +/** + * Divides two `tf.Tensor`s element-wise, A / B. Supports broadcasting. Return 0 + * if denominator is 0. + * + * + * ```js + * const a = tf.tensor1d([1, 4, 9, 16]); + * const b = tf.tensor1d([1, 2, 3, 4]); + * const c = tf.tensor1d([0, 0, 0, 0]); + * + * a.divNoNan(b).print(); // or tf.divNoNan(a, b) + * a.divNoNan(c).print(); // or tf.divNoNan(a, c) + * ``` + * + * ```js + * // Broadcast div a with b. + * const a = tf.tensor1d([2, 4, 6, 8]); + * const b = tf.scalar(2); + * const c = tf.scalar(0); + * + * a.divNoNan(b).print(); // or tf.divNoNan(a, b) + * a.divNoNan(c).print(); // or tf.divNoNan(a, c) + * ``` + * + * @param a The first tensor as the numerator. + * @param b The second tensor as the denominator. Must have the same dtype as + * `a`. + * + * @doc {heading: 'Operations', subheading: 'Arithmetic'} + */ +declare function divNoNan_(a: Tensor | TensorLike, b: Tensor | TensorLike): T; + +declare interface DoneFn_2 { + (): void; + fail: (message?: Error | string) => void; +} + +export declare const dot: typeof dot_; + +/** + * Computes the dot product of two matrices and/or vectors, `t1` and `t2`. + * + * ```js + * const a = tf.tensor1d([1, 2]); + * const b = tf.tensor2d([[1, 2], [3, 4]]); + * const c = tf.tensor2d([[1, 2, 3], [4, 5, 6]]); + * + * a.dot(b).print(); // or tf.dot(a, b) + * b.dot(a).print(); + * b.dot(c).print(); + * ``` + * @param t1 The first tensor in the dot operation. + * @param t2 The second tensor in the dot operation. + * + * @doc {heading: 'Operations', subheading: 'Matrices'} + */ +declare function dot_(t1: Tensor | TensorLike, t2: Tensor | TensorLike): Tensor; + +export declare const dropout: typeof dropout_; + +/** + * Computes dropout. + * + * ```js + * const x = tf.tensor1d([1, 2, 2, 1]); + * const rate = 0.75; + * const output = tf.dropout(x, rate); + * output.print(); + * ``` + * + * @param x A floating point Tensor or TensorLike. + * @param rate A float in the range [0, 1). The probability that each element + * of x is discarded. + * @param noiseShape An array of numbers of type int32, representing the + * shape for randomly generated keep/drop flags. If the noiseShape has null + * value, it will be automatically replaced with the x's relative dimension + * size. Optional. + * @param seed Used to create random seeds. Optional. + * @returns A Tensor of the same shape of x. + * + * @doc {heading: 'Operations', subheading: 'Dropout'} + */ +declare function dropout_(x: Tensor | TensorLike, rate: number, noiseShape?: number[], seed?: number | string): Tensor; + +export declare const Einsum = "Einsum"; + +export declare const einsum: typeof einsum_; + +/** + * Tensor contraction over specified indices and outer product. + * + * `einsum` allows defining Tensors by defining their element-wise computation. + * This computation is based on + * [Einstein summation](https://en.wikipedia.org/wiki/Einstein_notation). + * + * Some special cases include: + * + * Matrix multiplication: + * ```js + * const x = tf.tensor2d([[1, 2, 3], [4, 5, 6]]); + * const y = tf.tensor2d([[0, 1], [2, 3], [4, 5]]); + * x.print(); + * y.print(); + * tf.einsum('ij,jk->ik', x, y).print(); + * ``` + * + * Dot product: + * ```js + * const x = tf.tensor1d([1, 2, 3]); + * const y = tf.tensor1d([0, 1, 2]); + * x.print(); + * y.print(); + * tf.einsum('i,i->', x, y).print(); + * ``` + * + * Batch dot product: + * ```js + * const x = tf.tensor2d([[1, 2, 3], [4, 5, 6]]); + * const y = tf.tensor2d([[0, 1, 2], [3, 4, 5]]); + * x.print(); + * y.print(); + * tf.einsum('bi,bi->b', x, y).print(); + * ``` + * + * Outer prouduct: + * ```js + * const x = tf.tensor1d([1, 3, 5]); + * const y = tf.tensor1d([2, 4, 6]); + * x.print(); + * y.print(); + * tf.einsum('i,j->ij', x, y).print(); + * ``` + * + * Matrix transpose: + * ```js + * const x = tf.tensor2d([[1, 2], [3, 4]]); + * x.print(); + * tf.einsum('ij->ji', x).print(); + * ``` + * + * Batch matrix transpose: + * ```js + * const x = tf.tensor3d([[[1, 2], [3, 4]], [[-1, -2], [-3, -4]]]); + * x.print(); + * tf.einsum('bij->bji', x).print(); + * ``` + * + * Limitations: + * + * This implementation of einsum has the following limitations: + * + * - Does not support >2 input tensors. + * - Does not support duplicate axes for any given input tensor. E.g., equation + * 'ii->' is not supported. + * - The `...` notation is not supported. + * + * @param equation a string describing the contraction, in the same format as + * [numpy.einsum](https://numpy.org/doc/stable/reference/generated/numpy.einsum.html). + * @param tensors the input(s) to contract (each one a Tensor), whose shapes + * should be consistent with equation. + * @returns The output tensor. + * + * @doc {heading: 'Tensors', subheading: 'Matrices'} + */ +declare function einsum_(equation: string, ...tensors: Tensor[]): Tensor; + +export declare interface EinsumAttrs { + equation: string; +} + +export declare type EinsumInputs = TensorInfo[]; + +declare function eitherStridesOrDilationsAreOne(strides: number | number[], dilations: number | number[]): boolean; + +export declare const Elu = "Elu"; + +export declare const elu: typeof elu_; + +/** + * Computes exponential linear element-wise: `x > 0 ? x : (e ^ x) - 1`. + * + * ```js + * const x = tf.tensor1d([-1, 1, -3, 2]); + * + * x.elu().print(); // or tf.elu(x) + * ``` + * @param x The input tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function elu_(x: T | TensorLike): T; + +export declare const EluGrad = "EluGrad"; + +export declare type EluGradInputs = Pick; + +export declare type EluInputs = Pick; + +/** + * Enables debug mode which will log information about all executed kernels: + * the elapsed time of the kernel execution, as well as the rank, shape, and + * size of the output tensor. + * + * Debug mode will significantly slow down your application as it will + * download the result of every operation to the CPU. This should not be used in + * production. Debug mode does not affect the timing information of the kernel + * execution as we do not measure download time in the kernel execution time. + * + * See also: `tf.profile`, `tf.memory`. + * + * @doc {heading: 'Environment'} + */ +export declare function enableDebugMode(): void; + +/** + * Enables production mode which disables correctness checks in favor of + * performance. + * + * @doc {heading: 'Environment'} + */ +export declare function enableProdMode(): void; + +export declare function enclosingPowerOfTwo(value: number): number; + +/** + * Encodes the provided string into bytes using the provided encoding scheme. + * + * @param s The string to encode. + * @param encoding The encoding scheme. Defaults to utf-8. + * + * @doc {heading: 'Util'} + */ +declare function encodeString(s: string, encoding?: string): Uint8Array; + +/** Encodes strings into utf-8 bytes. */ +declare function encodeStrings(a: RecursiveArray<{}>): RecursiveArray; + +/** + * Encode a map from names to weight values as an ArrayBuffer, along with an + * `Array` of `WeightsManifestEntry` as specification of the encoded weights. + * + * This function does not perform sharding. + * + * This function is the reverse of `decodeWeights`. + * + * @param tensors A map ("dict") from names to tensors. + * @param group Group to which the weights belong (optional). + * @returns A `Promise` of + * - A flat `ArrayBuffer` with all the binary values of the `Tensor`s + * concatenated. + * - An `Array` of `WeightManifestEntry`s, carrying information including + * tensor names, `dtype`s and shapes. + * @throws Error: on unsupported tensor `dtype`. + */ +declare function encodeWeights(tensors: NamedTensorMap | NamedTensor[], group?: WeightGroup): Promise<{ + data: ArrayBuffer; + specs: WeightsManifestEntry[]; +}>; + +declare class Engine implements TensorTracker, DataMover { + ENV: Environment; + state: EngineState; + backendName: string; + registry: { + [id: string]: KernelBackend; + }; + registryFactory: { + [id: string]: { + factory: () => KernelBackend | Promise; + priority: number; + }; + }; + private profiler; + private backendInstance; + private pendingBackendInit; + private pendingBackendInitId; + constructor(ENV: Environment); + ready(): Promise; + get backend(): KernelBackend; + backendNames(): string[]; + findBackend(backendName: string): KernelBackend; + findBackendFactory(backendName: string): () => KernelBackend | Promise; + registerBackend(backendName: string, factory: () => KernelBackend | Promise, priority?: number): boolean; + setBackend(backendName: string): Promise; + private setupRegisteredKernels; + private disposeRegisteredKernels; + /** + * Initializes a backend by looking up the backend name in the factory + * registry and calling the factory method. Returns a boolean representing + * whether the initialization of the backend suceeded. Throws an error if + * there is no backend in the factory registry. + */ + private initializeBackend; + removeBackend(backendName: string): void; + private getSortedBackends; + private initializeBackendsAndReturnBest; + moveData(backend: KernelBackend, dataId: DataId): void; + tidy(nameOrFn: string | ScopeFn, fn?: ScopeFn): T; + private scopedRun; + private static nextTensorId; + private nextTensorId; + private static nextVariableId; + private nextVariableId; + /** + * This method is called instead of the public-facing tensor.clone() when + * saving a tensor for backwards pass. It makes sure to add the clone + * operation to the tape regardless of being called inside a kernel + * execution. + */ + private clone; + /** + * Execute a kernel with the given name and return the output tensor. + * + * @param kernelName The name of the kernel to execute. + * @param inputs A map of input names to tensors. + * @param attrs A map of attribute names to their values. An attribute is a + * primitive (non-tensor) input to the kernel. + * @param inputsToSave A list of tensors, inputs to save for the backprop + * computation. + * @param outputsToSave A list of booleans, specifying which output to save + * for the backprop computation. These are booleans since the output + * tensors are not visible to the user. + */ + runKernel(kernelName: string, inputs: NamedTensorMap, attrs?: NamedAttrMap): T; + private shouldCheckForMemLeaks; + private checkKernelForMemLeak; + /** + * Internal helper method to execute a kernel Func + * + * Use `runKernel` to execute kernels from outside of engine. + */ + private runKernelFunc; + /** + * Saves tensors used in forward mode for use in backward mode. + * + * @param tensors the list of tensors to save. + */ + private saveTensorsForBackwardMode; + /** + * Returns a list of tensors to save for a given gradient calculation. + * + * @param kernelName name of kernel to look up gradient for. + * @param inputs a map of input tensors. + * @param outputs an array of output tensors from forward mode of kernel. + */ + private getTensorsForGradient; + /** + * Internal method used by public APIs for tensor creation. Makes a new + * tensor with the provided shape, dtype and values. It always + * creates a new data id and writes the values to the underlying backend. + */ + makeTensor(values: DataValues, shape: number[], dtype: DataType, backend?: KernelBackend): Tensor; + /** + * Internal method used by backends. Makes a new tensor + * that is a wrapper around an existing data id. It doesn't create + * a new data id, only increments the ref count used in memory tracking. + * @deprecated + */ + makeTensorFromDataId(dataId: DataId, shape: number[], dtype: DataType, backend?: KernelBackend): Tensor; + /** + * Internal method used by backends. Makes a new tensor that is a wrapper + * around an existing data id in TensorInfo. It doesn't create a new data id, + * only increments the ref count used in memory tracking. + */ + makeTensorFromTensorInfo(tensorInfo: TensorInfo, backend?: KernelBackend): Tensor; + makeVariable(initialValue: Tensor, trainable?: boolean, name?: string, dtype?: DataType): Variable; + trackTensor(a: Tensor, backend: KernelBackend): void; + incRef(a: Tensor, backend: KernelBackend): void; + removeDataId(dataId: DataId, backend: KernelBackend): void; + disposeTensor(a: Tensor): void; + disposeVariables(): void; + disposeVariable(v: Variable): void; + memory(): MemoryInfo; + profile(query: () => (TensorContainer | Promise)): Promise; + isTapeOn(): boolean; + private addTapeNode; + keep(result: T): T; + private startTape; + private endTape; + /** + * Start a scope. Use this with endScope() to achieve the same functionality + * as scope() without the need for a function closure. + */ + startScope(name?: string): void; + /** + * End a scope. Use this with startScope() to achieve the same functionality + * as scope() without the need for a function closure. + */ + endScope(result?: TensorContainer): void; + /** + * Returns gradients of `f` with respect to each of the `xs`. The gradients + * returned are of the same length as `xs`, but some might be null if `f` + * was not a function of that `x`. It also takes optional dy to multiply the + * gradient, which defaults to `1`. + */ + gradients(f: () => T, xs: Tensor[], dy?: T, allowNoGradients?: boolean): { + value: T; + grads: Tensor[]; + }; + customGrad(f: CustomGradientFunc): (...args: Array) => T; + readSync(dataId: DataId): BackendValues; + read(dataId: DataId): Promise; + readToGPU(dataId: DataId, options?: DataToGPUOptions): GPUData; + time(query: () => void): Promise; + /** + * Tracks a Tensor in the current scope to be automatically cleaned up + * when the current scope ends, and returns the value. + * + * @param result The Tensor to track in the current scope. + */ + private track; + get registeredVariables(): NamedVariableMap; + /** + * Resets the engine state. Removes all backends but does not remove + * registered backend factories. + */ + reset(): void; +} + +/** + * It returns the global engine that keeps track of all tensors and backends. + * + * @doc {heading: 'Environment'} + */ +export declare function engine(): Engine; + +declare class EngineState { + registeredVariables: NamedVariableMap; + nextTapeNodeId: number; + numBytes: number; + numTensors: number; + numStringTensors: number; + numDataBuffers: number; + activeTape: TapeNode[]; + gradientDepth: number; + kernelDepth: number; + activeScope: ScopeState; + scopeStack: ScopeState[]; + /** + * Keeps track of the number of data moves during a kernel execution. We + * maintain a stack since kernels can call other kernels, recursively. + */ + numDataMovesStack: number[]; + nextScopeId: number; + tensorInfo: WeakMap; + profiling: boolean; + activeProfile: ProfileInfo; + dispose(): void; +} + +export declare let ENV: Environment; + +/** + * Returns the current environment (a global singleton). + * + * The environment object contains the evaluated feature values as well as the + * active platform. + * + * @doc {heading: 'Environment'} + */ +export declare function env(): Environment; + +/** + * The environment contains evaluated flags as well as the registered platform. + * This is always used as a global singleton and can be retrieved with + * `tf.env()`. + * + * @doc {heading: 'Environment'} + */ +export declare class Environment { + global: any; + private flags; + private flagRegistry; + private urlFlags; + platformName: string; + platform: Platform; + getQueryParams: typeof getQueryParams; + constructor(global: any); + setPlatform(platformName: string, platform: Platform): void; + registerFlag(flagName: string, evaluationFn: FlagEvaluationFn, setHook?: (value: FlagValue) => void): void; + getAsync(flagName: string): Promise; + get(flagName: string): FlagValue; + getNumber(flagName: string): number; + getBool(flagName: string): boolean; + getFlags(): Flags; + get features(): Flags; + set(flagName: string, value: FlagValue): void; + private evaluateFlag; + setFlags(flags: Flags): void; + reset(): void; + private populateURLFlags; +} + +export declare const Equal = "Equal"; + +export declare const equal: typeof equal_; + +/** + * Returns the truth value of (a == b) element-wise. Supports broadcasting. + * + * ```js + * const a = tf.tensor1d([1, 2, 3]); + * const b = tf.tensor1d([2, 2, 2]); + * + * a.equal(b).print(); + * ``` + * + * @param a The first input tensor. + * @param b The second input tensor. Must have the same dtype as `a`. + * + * @doc {heading: 'Operations', subheading: 'Logical'} + */ +declare function equal_(a: Tensor | TensorLike, b: Tensor | TensorLike): T; + +export declare type EqualInputs = BinaryInputs; + +export declare const Erf = "Erf"; + +export declare const erf: typeof erf_; + +/** + * Computes Gauss error function of the input `tf.Tensor` element-wise: + * `erf(x)` + * + * ```js + * const x = tf.tensor1d([0, .1, -.1, .7]); + * + * x.erf().print(); // or tf.erf(x); + * ``` + * @param x The input tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function erf_(x: T | TensorLike): T; + +declare const ERF_A1 = 0.254829592; + +declare const ERF_A2 = -0.284496736; + +declare const ERF_A3 = 1.421413741; + +declare const ERF_A4 = -1.453152027; + +declare const ERF_A5 = 1.061405429; + +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +declare const ERF_P = 0.3275911; + +export declare type ErfInputs = UnaryInputs; + +export declare const euclideanNorm: typeof euclideanNorm_; + +/** + * Computes the Euclidean norm of scalar, vectors, and matrices. + * + * ```js + * const x = tf.tensor1d([1, 2, 3, 4]); + * + * x.euclideanNorm().print(); // or tf.euclideanNorm(x) + * ``` + * + * @param x The input array. + * @param axis Optional. If axis is null (the default), the input is + * considered a vector and a single vector norm is computed over the entire + * set of values in the Tensor, i.e. euclideanNorm(x) is equivalent + * to euclideanNorm(x.reshape([-1])). If axis is an integer, the input + * is considered a batch of vectors, and axis determines the axis in x + * over which to compute vector norms. If axis is a 2-tuple of integer it is + * considered a batch of matrices and axis determines the axes in NDArray + * over which to compute a matrix norm. + * @param keepDims Optional. If true, the norm has the same dimensionality + * as the input. + * + * @doc {heading: 'Operations', subheading: 'Matrices'} + */ +declare function euclideanNorm_(x: Tensor | TensorLike, axis?: number | number[], keepDims?: boolean): Tensor; + +export declare const Exp = "Exp"; + +export declare const exp: typeof exp_; + +/** + * Computes exponential of the input `tf.Tensor` element-wise. `e ^ x` + * + * ```js + * const x = tf.tensor1d([1, 2, -3]); + * + * x.exp().print(); // or tf.exp(x) + * ``` + * @param x The input tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function exp_(x: T | TensorLike): T; + +export declare const ExpandDims = "ExpandDims"; + +export declare const expandDims: typeof expandDims_; + +/** + * Returns a `tf.Tensor` that has expanded rank, by inserting a dimension + * into the tensor's shape. + * + * ```js + * const x = tf.tensor1d([1, 2, 3, 4]); + * const axis = 1; + * x.expandDims(axis).print(); + * ``` + * + * @param x The input tensor whose dimensions are to be expanded. + * @param axis The dimension index at which to insert shape of `1`. Defaults + * to 0 (the first dimension). + * + * @doc {heading: 'Tensors', subheading: 'Transformations'} + */ +declare function expandDims_(x: Tensor | TensorLike, axis?: number): T; + +export declare interface ExpandDimsAttrs { + dim: number; +} + +export declare type ExpandDimsInputs = Pick; + +declare function expandShapeToKeepDim(shape: number[], axes: number[]): number[]; + +declare function expectArrayBuffersEqual(actual: ArrayBuffer, expected: ArrayBuffer): void; + +declare function expectArraysClose(actual: TypedArray | number | RecursiveArray, expected: TypedArray | number | RecursiveArray, epsilon?: number): void; + +declare function expectArraysEqual(actual: TensorLike, expected: TensorLike): void; + +declare function expectNumbersClose(a: number, e: number, epsilon?: number): void; + +declare function expectPromiseToFail(fn: () => Promise<{}>, done: DoneFn_2): void; + +declare function expectValuesInRange(actual: TypedArray | number[], low: number, high: number): void; + +export declare type ExpInputs = UnaryInputs; + +declare type ExplicitPadding = [ +[number, number], +[number, number], +[number, number], +[number, number] +]; + +export declare const Expm1 = "Expm1"; + +export declare const expm1: typeof expm1_; + +/** + * Computes exponential of the input `tf.Tensor` minus one element-wise. + * `e ^ x - 1` + * + * ```js + * const x = tf.tensor1d([1, 2, -3]); + * + * x.expm1().print(); // or tf.expm1(x) + * ``` + * @param x The input tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function expm1_(x: T | TensorLike): T; + +export declare type Expm1Inputs = UnaryInputs; + +/** + * Make the exponent term used by FFT. + */ +declare function exponent(k: number, n: number, inverse: boolean): { + real: number; + imag: number; +}; + +/** + * Make the list of exponent terms used by FFT. + */ +declare function exponents(n: number, inverse: boolean): { + real: Float32Array; + imag: Float32Array; +}; + +export declare const eye: typeof eye_; + +/** + * Create an identity matrix. + * + * @param numRows Number of rows. + * @param numColumns Number of columns. Defaults to `numRows`. + * @param batchShape If provided, will add the batch shape to the beginning + * of the shape of the returned `tf.Tensor` by repeating the identity + * matrix. + * @param dtype Data type. + * @returns Identity matrix of the specified size and data type, possibly + * with batch repetition if `batchShape` is specified. + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ +declare function eye_(numRows: number, numColumns?: number, batchShape?: [ +number +] | [ +number, +number +] | [number, number, number] | [number, number, number, number], dtype?: DataType): Tensor2D; + +/** + * Returns a platform-specific implementation of + * [`fetch`](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API). + * + * If `fetch` is defined on the global object (`window`, `process`, etc.), + * `tf.util.fetch` returns that function. + * + * If not, `tf.util.fetch` returns a platform-specific solution. + * + * ```js + * const resource = await tf.util.fetch('https://unpkg.com/@tensorflow/tfjs'); + * // handle response + * ``` + * + * @doc {heading: 'Util'} + */ +declare function fetch_2(path: string, requestInits?: RequestInit): Promise; + +export declare const FFT = "FFT"; + +export declare const fft: typeof fft_; + +/** + * Fast Fourier transform. + * + * Computes the 1-dimensional discrete Fourier transform over the inner-most + * dimension of input. + * + * ```js + * const real = tf.tensor1d([1, 2, 3]); + * const imag = tf.tensor1d([1, 2, 3]); + * const x = tf.complex(real, imag); + * + * x.fft().print(); // tf.spectral.fft(x).print(); + * ``` + * @param input The complex input to compute an fft over. + * + * @doc {heading: 'Operations', subheading: 'Spectral', namespace: 'spectral'} + */ +declare function fft_(input: Tensor): Tensor; + +export declare type FFTInputs = Pick; + +export declare const Fill = "Fill"; + +/** + * Creates a `tf.Tensor` filled with a scalar value. + * + * ```js + * tf.fill([2, 2], 4).print(); + * ``` + * + * @param shape An array of integers defining the output tensor shape. + * @param value The scalar value to fill the tensor with. + * @param dtype The type of an element in the resulting tensor. Defaults to + * 'float'. + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ +export declare function fill(shape: ShapeMap[R], value: number | string, dtype?: DataType): Tensor; + +export declare interface FillAttrs { + shape: number[]; + value: number | string; + dtype: DataType; +} + +/** + * Finds the backend registered under the provided name. Returns null if the + * name is not in the registry, or the registration hasn't finished yet. + */ +export declare function findBackend(name: string): KernelBackend; + +/** + * Finds the backend factory registered under the provided name. Returns a + * function that produces a new backend when called. Returns null if the name + * is not in the registry. + */ +export declare function findBackendFactory(name: string): () => KernelBackend | Promise; + +declare function fingerPrint64(s: Uint8Array, len?: number): Long; + +declare type FlagEvaluationFn = (() => FlagValue) | (() => Promise); + +declare type Flags = { + [featureName: string]: FlagValue; +}; + +declare type FlagValue = number | boolean; + +/** + * Flattens an arbitrarily nested array. + * + * ```js + * const a = [[1, 2], [3, 4], [5, [6, [7]]]]; + * const flat = tf.util.flatten(a); + * console.log(flat); + * ``` + * + * @param arr The nested array to flatten. + * @param result The destination array which holds the elements. + * @param skipTypedArray If true, avoids flattening the typed arrays. Defaults + * to false. + * + * @doc {heading: 'Util', namespace: 'util'} + */ +declare function flatten | TypedArray>(arr: T | RecursiveArray, result?: T[], skipTypedArray?: boolean): T[]; + +declare type FlatVector = boolean[] | number[] | TypedArray; + +export declare const FlipLeftRight = "FlipLeftRight"; + +export declare type FlipLeftRightInputs = Pick; + +export declare const Floor = "Floor"; + +export declare const floor: typeof floor_; + +/** + * Computes floor of input `tf.Tensor` element-wise: `floor(x)`. + * + * ```js + * const x = tf.tensor1d([.6, 1.1, -3.3]); + * + * x.floor().print(); // or tf.floor(x) + * ``` + * @param x The input tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function floor_(x: T | TensorLike): T; + +export declare const FloorDiv = "FloorDiv"; + +export declare const floorDiv: typeof floorDiv_; + +/** + * Divides two `tf.Tensor`s element-wise, A / B. Supports broadcasting. + * The result is rounded with floor function. + * + * + * ```js + * const a = tf.tensor1d([1, 4, 9, 16]); + * const b = tf.tensor1d([1, 2, 3, 4]); + * + * a.floorDiv(b).print(); // or tf.div(a, b) + * ``` + * + * ```js + * // Broadcast div a with b. + * const a = tf.tensor1d([2, 4, 6, 8]); + * const b = tf.scalar(2); + * + * a.floorDiv(b).print(); // or tf.floorDiv(a, b) + * ``` + * + * @param a The first tensor as the numerator. + * @param b The second tensor as the denominator. Must have the same dtype as + * `a`. + * + * @doc {heading: 'Operations', subheading: 'Arithmetic'} + */ +declare function floorDiv_(a: Tensor | TensorLike, b: Tensor | TensorLike): T; + +export declare type FloorDivInputs = BinaryInputs; + +export declare type FloorInputs = UnaryInputs; + +/** + * A function that computes an output. The save function is for saving tensors + * computed in the forward pass, that we need in the backward pass. + */ +export declare type ForwardFunc = (backend: KernelBackend, save?: GradSaveFunc) => T; + +declare type FromConfigMethod = (cls: SerializableConstructor, config: ConfigDict) => T; + +/** + * Creates an IOHandler that loads model artifacts from memory. + * + * When used in conjunction with `tf.loadLayersModel`, an instance of + * `tf.LayersModel` (Keras-style) can be constructed from the loaded artifacts. + * + * ```js + * const model = await tf.loadLayersModel(tf.io.fromMemory( + * modelTopology, weightSpecs, weightData)); + * ``` + * + * @param modelArtifacts a object containing model topology (i.e., parsed from + * the JSON format). + * @param weightSpecs An array of `WeightsManifestEntry` objects describing the + * names, shapes, types, and quantization of the weight data. Optional. + * @param weightData A single `ArrayBuffer` containing the weight data, + * concatenated in the order described by the weightSpecs. Optional. + * @param trainingConfig Model training configuration. Optional. + * + * @returns A passthrough `IOHandler` that simply loads the provided data. + */ +declare function fromMemory(modelArtifacts: {} | ModelArtifacts, weightSpecs?: WeightsManifestEntry[], weightData?: ArrayBuffer, trainingConfig?: TrainingConfig): IOHandler; + +/** + * Creates an IOHandler that loads model artifacts from memory. + * + * When used in conjunction with `tf.loadLayersModel`, an instance of + * `tf.LayersModel` (Keras-style) can be constructed from the loaded artifacts. + * + * ```js + * const model = await tf.loadLayersModel(tf.io.fromMemory( + * modelTopology, weightSpecs, weightData)); + * ``` + * + * @param modelArtifacts a object containing model topology (i.e., parsed from + * the JSON format). + * @param weightSpecs An array of `WeightsManifestEntry` objects describing the + * names, shapes, types, and quantization of the weight data. Optional. + * @param weightData A single `ArrayBuffer` containing the weight data, + * concatenated in the order described by the weightSpecs. Optional. + * @param trainingConfig Model training configuration. Optional. + * + * @returns A passthrough `IOHandlerSync` that simply loads the provided data. + */ +declare function fromMemorySync(modelArtifacts: {} | ModelArtifacts, weightSpecs?: WeightsManifestEntry[], weightData?: ArrayBuffer, trainingConfig?: TrainingConfig): IOHandlerSync; + +export declare const FromPixels = "FromPixels"; + +declare const fromPixels: typeof fromPixels_; + +/** + * Creates a `tf.Tensor` from an image. + * + * ```js + * const image = new ImageData(1, 1); + * image.data[0] = 100; + * image.data[1] = 150; + * image.data[2] = 200; + * image.data[3] = 255; + * + * tf.browser.fromPixels(image).print(); + * ``` + * + * @param pixels The input image to construct the tensor from. The + * supported image types are all 4-channel. You can also pass in an image + * object with following attributes: + * `{data: Uint8Array; width: number; height: number}` + * @param numChannels The number of channels of the output tensor. A + * numChannels value less than 4 allows you to ignore channels. Defaults to + * 3 (ignores alpha channel of input image). + * + * @returns A Tensor3D with the shape `[height, width, numChannels]`. + * + * Note: fromPixels can be lossy in some cases, same image may result in + * slightly different tensor values, if rendered by different rendering + * engines. This means that results from different browsers, or even same + * browser with CPU and GPU rendering engines can be different. See discussion + * in details: + * https://github.com/tensorflow/tfjs/issues/5482 + * + * @doc {heading: 'Browser', namespace: 'browser', ignoreCI: true} + */ +declare function fromPixels_(pixels: PixelData | ImageData | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap, numChannels?: number): Tensor3D; + +/** + * Creates a `tf.Tensor` from an image in async way. + * + * ```js + * const image = new ImageData(1, 1); + * image.data[0] = 100; + * image.data[1] = 150; + * image.data[2] = 200; + * image.data[3] = 255; + * + * (await tf.browser.fromPixelsAsync(image)).print(); + * ``` + * This API is the async version of fromPixels. The API will first + * check |WRAP_TO_IMAGEBITMAP| flag, and try to wrap the input to + * imageBitmap if the flag is set to true. + * + * @param pixels The input image to construct the tensor from. The + * supported image types are all 4-channel. You can also pass in an image + * object with following attributes: + * `{data: Uint8Array; width: number; height: number}` + * @param numChannels The number of channels of the output tensor. A + * numChannels value less than 4 allows you to ignore channels. Defaults to + * 3 (ignores alpha channel of input image). + * + * @doc {heading: 'Browser', namespace: 'browser', ignoreCI: true} + */ +declare function fromPixelsAsync(pixels: PixelData | ImageData | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap, numChannels?: number): Promise; + +export declare interface FromPixelsAttrs { + numChannels: number; +} + +export declare interface FromPixelsInputs { + pixels: PixelData | ImageData | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap; +} + +declare function fromStringArrayToUint8(strings: string[]): Uint8Array[]; + +declare function fromUint8ToStringArray(vals: Uint8Array[]): string[]; + +declare namespace fused { + export { + Activation, + conv2d_2 as conv2d, + depthwiseConv2d_2 as depthwiseConv2d, + matMul_2 as matMul + } +} +export { fused } + +declare type FusedBatchMatMulConfig = { + a: Tensor3D; + b: Tensor3D; + transposeA: boolean; + transposeB: boolean; + bias?: Tensor; + activation?: Activation; + preluActivationWeights?: Tensor; + leakyreluAlpha?: number; +}; + +export declare const FusedBatchNorm = "FusedBatchNorm"; + +export declare interface FusedBatchNormAttrs { + varianceEpsilon: number; +} + +export declare type FusedBatchNormInputs = Pick; + +export declare const FusedConv2D = "FusedConv2D"; + +/** + * Computes a 2D convolution over the input x, optionally fused with adding a + * bias and applying an activation. + * + * ```js + * const inputDepth = 2; + * const inShape = [2, 2, 2, inputDepth]; + * const outputDepth = 2; + * const fSize = 1; + * const pad = 0; + * const strides = 1; + * + * const x = tf.tensor4d( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + * 16], inShape); + * const w = tf.tensor4d([-1, 1, -2, 0.5], [fSize, fSize, inputDepth, + * outputDepth]); + * + * tf.fused.conv2d({ x, filter: w, strides, pad, dataFormat: 'NHWC', + * dilations: [1, 1], bias: tf.scalar(5), activation: 'relu' }).print(); + * ``` + * + * @param obj An object with the following properties: + * @param x The input tensor, of rank 4 or rank 3, of shape + * `[batch, height, width, inChannels]`. If rank 3, batch of 1 is + * assumed. + * @param filter The filter, rank 4, of shape + * `[filterHeight, filterWidth, inDepth, outDepth]`. + * @param strides The strides of the convolution: `[strideHeight, + * strideWidth]`. + * @param pad The type of padding algorithm. + * - `same` and stride 1: output will be of same size as input, + * regardless of filter size. + * - `valid` output will be smaller than input if filter is larger + * than 1x1. + * - For more info, see this guide: + * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution]( + * https://www.tensorflow.org/api_docs/python/tf/nn/convolution) + * @param dataFormat An optional string from: "NHWC", "NCHW". Defaults to + * "NHWC". Specify the data format of the input and output data. With the + * default format "NHWC", the data is stored in the order of: [batch, + * height, width, channels]. Only "NHWC" is currently supported. + * @param dilations The dilation rates: `[dilationHeight, dilationWidth]` + * in which we sample input values across the height and width dimensions + * in atrous convolution. Defaults to `[1, 1]`. If `dilations` is a single + * number, then `dilationHeight == dilationWidth`. If it is greater than + * 1, then all values of `strides` must be 1. + * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is + * provided, it will default to truncate. + * @param bias Tensor to be added to the result. + * @param activation Name of activation kernel (defaults to `linear`) to be + * applied + * after biasAdd. + * @param preluActivationWeights Tensor of prelu weights to be applied as part + * of a `prelu` activation, typically the same shape as `x`. + * @param leakyreluAlpha Optional. Alpha to be applied as part of a `leakyrelu` + * activation. + */ +declare function fusedConv2d_({ x, filter, strides, pad, dataFormat, dilations, dimRoundingMode, bias, activation, preluActivationWeights, leakyreluAlpha }: { + x: T | TensorLike; + filter: Tensor4D | TensorLike; + strides: [number, number] | number; + pad: 'valid' | 'same' | number | conv_util.ExplicitPadding; + dataFormat?: 'NHWC' | 'NCHW'; + dilations?: [number, number] | number; + dimRoundingMode?: 'floor' | 'round' | 'ceil'; + bias?: Tensor | TensorLike; + activation?: Activation; + preluActivationWeights?: Tensor; + leakyreluAlpha?: number; +}): T; + +export declare interface FusedConv2DAttrs { + strides: [number, number] | number; + pad: 'valid' | 'same' | number | ExplicitPadding; + dataFormat: 'NHWC' | 'NCHW'; + dilations: [number, number] | number; + dimRoundingMode: 'floor' | 'round' | 'ceil'; + activation: Activation; + leakyreluAlpha?: number; +} + +declare type FusedConv2DConfig = { + input: Tensor4D; + filter: Tensor4D; + convInfo: Conv2DInfo; + bias?: Tensor; + activation?: Activation; + preluActivationWeights?: Tensor; + leakyreluAlpha?: number; +}; + +export declare interface FusedConv2DInputs extends NamedTensorInfoMap { + x: TensorInfo; + filter: TensorInfo; + bias?: TensorInfo; + preluActivationWeights?: TensorInfo; +} + +export declare const FusedDepthwiseConv2D = "FusedDepthwiseConv2D"; + +/** + * Computes depthwise 2D convolution, optionally fused with adding a + * bias and applying an activation. + * + * Given a 4D `input` array and a `filter` array of shape + * `[filterHeight, filterWidth, inChannels, channelMultiplier]` containing + * `inChannels` convolutional filters of depth 1, this op applies a + * different filter to each input channel (expanding from 1 channel to + * `channelMultiplier` channels for each), then concatenates the results + * together. The output has `inChannels * channelMultiplier` channels. + * + * See + * [https://www.tensorflow.org/api_docs/python/tf/nn/depthwise_conv2d]( + * https://www.tensorflow.org/api_docs/python/tf/nn/depthwise_conv2d) + * for more details. + * + * @param obj An object with the following properties: + * @param x The input tensor, of rank 4 or rank 3, of shape + * `[batch, height, width, inChannels]`. If rank 3, batch of 1 is + * assumed. + * @param filter The filter tensor, rank 4, of shape + * `[filterHeight, filterWidth, inChannels, channelMultiplier]`. + * @param strides The strides of the convolution: `[strideHeight, + * strideWidth]`. If strides is a single number, then `strideHeight == + * strideWidth`. + * @param pad The type of padding algorithm. + * - `same` and stride 1: output will be of same size as input, + * regardless of filter size. + * - `valid`: output will be smaller than input if filter is larger + * than 1x1. + * - For more info, see this guide: + * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution]( + * https://www.tensorflow.org/api_docs/python/tf/nn/convolution) + * @param dilations The dilation rates: `[dilationHeight, dilationWidth]` + * in which we sample input values across the height and width dimensions + * in atrous convolution. Defaults to `[1, 1]`. If `rate` is a single + * number, then `dilationHeight == dilationWidth`. If it is greater than + * 1, then all values of `strides` must be 1. + * @param dataFormat: An optional string from: "NHWC", "NCHW". Defaults to + * "NHWC". Specify the data format of the input and output data. With the + * default format "NHWC", the data is stored in the order of: [batch, + * height, width, channels]. Only "NHWC" is currently supported. + * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is + * provided, it will default to truncate. + * @param bias Tensor to be added to the result. + * @param activation Name of activation kernel (defaults to `linear`). + * @param preluActivationWeights Tensor of prelu weights to be applied as part + * of a `prelu` activation, typically the same shape as `x`. + * @param leakyreluAlpha Optional. Alpha to be applied as part of a `leakyrelu` + * activation. + */ +declare function fusedDepthwiseConv2d_({ x, filter, strides, pad, dataFormat, dilations, dimRoundingMode, bias, activation, preluActivationWeights, leakyreluAlpha }: { + x: T | TensorLike; + filter: Tensor4D | TensorLike; + strides: [number, number] | number; + pad: 'valid' | 'same' | number; + dataFormat?: 'NHWC' | 'NCHW'; + dilations?: [number, number] | number; + dimRoundingMode?: 'floor' | 'round' | 'ceil'; + bias?: Tensor | TensorLike; + activation?: Activation; + preluActivationWeights?: Tensor; + leakyreluAlpha?: number; +}): T; + +export declare interface FusedDepthwiseConv2DAttrs { + strides: [number, number] | number; + pad: 'valid' | 'same' | number | ExplicitPadding; + dataFormat: 'NHWC' | 'NCHW'; + dilations: [number, number] | number; + dimRoundingMode: 'floor' | 'round' | 'ceil'; + activation: Activation; + leakyreluAlpha?: number; +} + +export declare interface FusedDepthwiseConv2DInputs extends NamedTensorInfoMap { + x: TensorInfo; + filter: TensorInfo; + bias?: TensorInfo; + preluActivationWeights?: TensorInfo; +} + +export declare const _FusedMatMul = "_FusedMatMul"; + +/** + * Computes the dot product of two matrices with optional activation and bias. + * + * ```js + * const a = tf.tensor2d([-1, -2], [1, 2]); + * const b = tf.tensor2d([1, 2, 3, 4], [2, 2]); + * const bias = tf.tensor2d([1, 2], [1, 2]); + * + * tf.fused.matMul({a, b, bias, activation: 'relu'}).print(); + * ``` + * + * @param obj An object with the following properties: + * - `a` First matrix in dot product operation. + * - `b` Second matrix in dot product operation. + * - `transposeA` If true, `a` is transposed before multiplication. + * - `transposeB` If true, `b` is transposed before multiplication. + * - `bias` Matrix to be added to the result. + * - `activation` Name of activation kernel (defaults to `linear`). + * - `preluActivationWeights` Tensor of prelu weights. + * - `leakyreluAlpha` Alpha of leakyrelu. + */ +declare function fusedMatMul_({ a, b, transposeA, transposeB, bias, activation, preluActivationWeights, leakyreluAlpha, }: { + a: Tensor | TensorLike; + b: Tensor | TensorLike; + transposeA?: boolean; + transposeB?: boolean; + bias?: Tensor | TensorLike; + activation?: Activation; + preluActivationWeights?: Tensor; + leakyreluAlpha?: number; +}): Tensor; + +export declare interface _FusedMatMulAttrs { + transposeA: boolean; + transposeB: boolean; + activation: Activation; + leakyreluAlpha?: number; +} + +export declare interface _FusedMatMulInputs extends NamedTensorInfoMap { + a: TensorInfo; + b: TensorInfo; + bias?: TensorInfo; + preluActivationWeights?: TensorInfo; +} + +export declare const gather: typeof gather_; + +/** + * Gather slices from tensor `x`'s axis `axis` according to `indices`. + * + * ```js + * const x = tf.tensor1d([1, 2, 3, 4]); + * const indices = tf.tensor1d([1, 3, 3], 'int32'); + * + * x.gather(indices).print(); + * ``` + * + * ```js + * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]); + * const indices = tf.tensor1d([1, 1, 0], 'int32'); + * + * x.gather(indices).print(); + * ``` + * @param x The input tensor whose slices are to be gathered. + * @param indices The indices of the values to extract. + * @param axis The axis over which to select values. Defaults to 0. + * @param batchDims Optional. The number of batch dimensions. It must be less + * than or equal to rank(indices). Defaults to 0. + * The output tensor will have shape of + * `x.shape[:axis] + indices.shape[batchDims:] + x.shape[axis + 1:]` + * + * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'} + */ +declare function gather_(x: T | TensorLike, indices: Tensor | TensorLike, axis?: number, batchDims?: number): T; + +declare namespace gather_util { + export { + prepareAndValidate + } +} +export { gather_util } + +export declare const GatherNd = "GatherNd"; + +export declare const gatherND: typeof gatherND_; + +/** + * Gather slices from input tensor into a Tensor with shape specified by + * `indices`. + * + * `indices` is a K-dimensional integer tensor, best thought of as a + * (K-1)-dimensional tensor of indices into input, where each element defines a + * slice of input: + * output[\\(i_0, ..., i_{K-2}\\)] = input[indices[\\(i_0, ..., i_{K-2}\\)]] + * + * Whereas in `tf.gather`, `indices` defines slices into the first dimension of + * input, in `tf.gatherND`, `indices` defines slices into the first N dimensions + * of input, where N = indices.shape[-1]. + * + * The last dimension of indices can be at most the rank of input: + * indices.shape[-1] <= input.rank + * + * The last dimension of `indices` corresponds to elements + * (if indices.shape[-1] == input.rank) or slices + * (if indices.shape[-1] < input.rank) along dimension indices.shape[-1] of + * input. + * The output tensor has shape + * indices.shape[:-1] + input.shape[indices.shape[-1]:] + * + * Note that on CPU, if an out of bound index is found, an error is returned. On + * GPU, if an out of bound index is found, a 0 is stored in the corresponding + * output value. + * + * ```js + * const indices = tf.tensor2d([0, 1, 1, 0], [2,2], 'int32'); + * const input = tf.tensor2d([9, 10, 11, 12], [2, 2]); + * tf.gatherND(input, indices).print() // [10, 11] + * ``` + * + * @param x The tensor from which to gather values. + * @param indices Index tensor, must be of type int32. + * + * @doc {heading: 'Operations', subheading: 'Slicing and Joining'} + */ +declare function gatherND_(x: Tensor | TensorLike, indices: Tensor | TensorLike): Tensor; + +export declare type GatherNdInputs = Pick; + +declare interface GatherOpShapeInfo { + batchSize: number; + sliceSize: number; + outerSize: number; + dimSize: number; + outputShape: number[]; +} + +export declare const GatherV2 = "GatherV2"; + +export declare interface GatherV2Attrs { + axis: number; + batchDims: number; +} + +export declare type GatherV2Inputs = Pick; + +declare function getArrayFromDType(dtype: D, size: number): DataTypeMap[D]; + +/** + * Returns the axes permutation to be used with `tf.transpose`, if such + * permutation is necessary. Otherwise it returns null. This method is used by + * operations that operate only on inner-most axes. + */ +declare function getAxesPermutation(axes: number[], rank: number): number[] | null; + +/** + * Returns the current backend name (cpu, webgl, etc). The backend is + * responsible for creating tensors and executing operations on those tensors. + * + * @doc {heading: 'Backends'} + */ +export declare function getBackend(): string; + +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/** + * Returns the dimensions in the input shape that are broadcasted to + * produce the provided output shape. + * + * The returned dimensions are 0-indexed and sorted. An example: + * inShape = [4, 1, 3] + * outShape = [5, 4, 3, 3] + * result = [1]. Dimension 1 (2nd dimension of input) gets broadcasted 1 => 3. + */ +declare function getBroadcastDims(inShape: number[], outShape: number[]): number[]; + +/** + * Get the map representing a complex value in the given array. + * @param complex The complex tensor values. + * @param index An index of the target complex value. + */ +declare function getComplexWithIndex(complex: Float32Array, index: number): { + real: number; + imag: number; +}; + +/** + * Gets path of computation for einsum. + * + * @param summedDims indices to the dimensions being summed over. + * @param idDims A look up table for the dimensions present in each input + * tensor. Each consituent array contains indices for the dimensions in the + * corresponding input tensor. + * + * @return A map with two fields: + * - path: The path of computation, with each element indicating the dimension + * being summed over after the element-wise multiplication in that step. + * - steps: With the same length as `path`. Each element contains the indices + * to the input tensors being used for element-wise multiplication in the + * corresponding step. + */ +declare function getEinsumComputePath(summedDims: number[], idDims: number[][]): { + path: number[]; + steps: number[][]; +}; + +/** + * Get the permutation for a given input tensor. + * + * @param nDims Total number of dimension of all tensors involved in the einsum + * operation. + * @param idDims Dimension indices involve in the tensor in question. + * @returns An object consisting of the following fields: + * - permutationIndices: Indices to permute the axes of the tensor with. + * - expandDims: Indices to the dimension that need to be expanded from the + * tensor after permutation. + */ +declare function getEinsumPermutation(nDims: number, idDims: number[]): { + permutationIndices: number[]; + expandDims: number[]; +}; + +declare function getFusedBiasGradient(bias: Tensor, dyActivation: Tensor): Tensor; + +declare function getFusedDyActivation(dy: Tensor, y: Tensor, activation: Activation): Tensor; + +/** + * Returns the registered gradient info associated with the provided kernel. + * @param kernelName The official TF kernel name. + */ +export declare function getGradient(kernelName: string): GradConfig; + +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +declare function getImageCenter(center: number | [number, number], imageHeight: number, imageWidth: number): [number, number]; + +declare function getInnerMostAxes(numAxes: number, rank: number): number[]; + +/** + * Returns the kernel function (code) associated with the provided names. + * + * @param kernelName The official name of the kernel. + * @param backendName The official name of the backend. + */ +export declare function getKernel(kernelName: string, backendName: string): KernelConfig; + +export declare function getKernelsForBackend(backendName: string): KernelConfig[]; + +declare const getLoadHandlers: (url: string | string[], loadOptions?: LoadOptions) => IOHandler[]; + +/** + * Create `ModelArtifacts` from a JSON file. + * + * @param modelJSON Object containing the parsed JSON of `model.json` + * @param loadWeights Function that takes the JSON file's weights manifest, + * reads weights from the listed path(s), and returns a Promise of the + * weight manifest entries along with the weights data. + * @returns A Promise of the `ModelArtifacts`, as described by the JSON file. + */ +declare function getModelArtifactsForJSON(modelJSON: ModelJSON, loadWeights: (weightsManifest: WeightsManifestConfig) => Promise<[ +WeightsManifestEntry[], +ArrayBuffer +]>): Promise; + +/** + * Create `ModelArtifacts` from a JSON file and weights. + * + * @param modelJSON Object containing the parsed JSON of `model.json` + * @param weightSpecs The list of WeightsManifestEntry for the model. Must be + * passed if the modelJSON has a weightsManifest. + * @param weightData An ArrayBuffer of weight data for the model corresponding + * to the weights in weightSpecs. Must be passed if the modelJSON has a + * weightsManifest. + * @returns A Promise of the `ModelArtifacts`, as described by the JSON file. + */ +declare function getModelArtifactsForJSONSync(modelJSON: ModelJSON, weightSpecs?: WeightsManifestEntry[], weightData?: ArrayBuffer): ModelArtifacts; + +/** + * Populate ModelArtifactsInfo fields for a model with JSON topology. + * @param modelArtifacts + * @returns A ModelArtifactsInfo object. + */ +declare function getModelArtifactsInfoForJSON(modelArtifacts: ModelArtifacts): ModelArtifactsInfo; + +declare function getNormalizedAxes(inputShape: number[], ellipsisAxes: number[], numInterpolatedAxes: number, begin: number[], end: number[], strides: number[], beginMask: number, endMask: number, ellipsisMask: number): { + begin: number[]; + end: number[]; + strides: number[]; +}; + +/** + * Gets the permutation that will transpose the dimensions of the + * reshaped tensor to shape: + * + * [batch / prod(block_shape),inputShape[1], blockShape[0], ..., + * inputShape[M], blockShape[M-1],inputShape[M+1], ..., inputShape[N-1]] + * + * see step 2: https://www.tensorflow.org/api_docs/python/tf/batch_to_space_nd + */ +declare function getPermuted(reshapedRank: number, blockShapeRank: number, batchToSpace?: boolean): number[]; + +declare function getQueryParams(queryString: string): { + [key: string]: string; +}; + +declare function getRaggedRank(rowPartitionTypes: RowPartitionType[]): number; + +/** + * Returns the axes in the output space that should be reduced to produce + * the input space. + */ +declare function getReductionAxes(inShape: number[], outShape: number[]): number[]; + +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/** + * Gets the new shape of the input Tensor after it's been reshaped + * to: + * [blockShape[0], ..., blockShape[M-1], batch / prod(blockShape), + * inputShape[1], ..., inputShape[N-1]] + * + * See step 1: https://www.tensorflow.org/api_docs/python/tf/batch_to_space_nd + */ +declare function getReshaped(inputShape: number[], blockShape: number[], prod: number, batchToSpace?: boolean): number[]; + +/** + * Gets the shape of the reshaped and permuted input Tensor before any cropping + * is applied. The new shape will be: + * + * [batch / prod(blockShape),inputShape[1] * blockShape[0], ..., + * inputShape[M] * blockShape[M-1],inputShape[M+1], ..., inputShape[N-1]] + * + * See step 3: https://www.tensorflow.org/api_docs/python/tf/batch_to_space_nd + */ +declare function getReshapedPermuted(inputShape: number[], blockShape: number[], prod: number, batchToSpace?: boolean): number[]; + +declare function getRowPartitionTypesHelper(rowPartitionTypeStrings: string[]): RowPartitionType[]; + +declare const getSaveHandlers: (url: string | string[]) => IOHandler[]; + +/** + * Converts the crops argument into the beginning coordinates of a slice + * operation. + */ +declare function getSliceBeginCoords(crops: number[][], blockShape: number): number[]; + +/** + * Converts the crops argument into the size of a slice operation. When + * combined with getSliceBeginCoords this function allows the reshaped and + * permuted Tensor to be cropped to its final output shape of: + * + * inputShape[1] * blockShape[0] - crops[0,0] - crops[0,1], ..., + * inputShape[M] * blockShape[M-1] -crops[M-1,0] - + * crops[M-1,1],inputShape[M+1], ..., inputShape[N-1]] + * + * See step 4: https://www.tensorflow.org/api_docs/python/tf/batch_to_space_nd + */ +declare function getSliceSize(uncroppedShape: number[], crops: number[][], blockShape: number): number[]; + +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/** + * Generates sparse fill empty rows indices, dense shape mismatch error message. + * + * @param indicesLength The first dimension of indices. + */ +declare function getSparseFillEmptyRowsIndicesDenseShapeMismatch(indicesLength: number): string; + +/** + * Generates sparse fill empty rows negative index error message. + * + * @param index The index with a negative value. + * @param value The negative value. + */ +declare function getSparseFillEmptyRowsNegativeIndexErrorMessage(index: number, value: number): string; + +/** + * Generates sparse fill empty rows out of range index error message. + * + * @param index The index with an out of range value. + * @param value The out of range value. + * @param limit The upper limit for indices. + */ +declare function getSparseFillEmptyRowsOutOfRangeIndexErrorMessage(index: number, value: number, limit: number): string; + +/** + * Generates sparse reshape empty tensor zero output dimension error message. + * + */ +declare function getSparseReshapeEmptyTensorZeroOutputDimErrorMessage(): string; + +/** + * Generates sparse reshape input output inequality error message. + * + * @param inputShape the input shape. + * @param outputShape the requested output shape. + */ +declare function getSparseReshapeInputOutputMismatchErrorMessage(inputShape: number[], outputShape: number[]): string; + +/** + * Generates sparse reshape input output multiple mismatch error message. + * + * @param inputShape the input shape. + * @param outputShape the requested output shape. + */ +declare function getSparseReshapeInputOutputMultipleErrorMessage(inputShape: number[], outputShape: number[]): string; + +/** + * Generates sparse reshape multiple negative 1 output dimension error message. + * + * @param dim1 The first dimension with a negative 1 value. + * @param dim2 The second dimension with a negative 1 value. + */ +declare function getSparseReshapeMultipleNegativeOneOutputDimErrorMessage(dim1: number, dim2: number): string; + +/** + * Generates sparse reshape negative output dimension error message. + * + * @param dim The dimension with a negative value. + * @param value The negative value. + */ +declare function getSparseReshapeNegativeOutputDimErrorMessage(dim: number, value: number): string; + +/** + * Generates sparse segment reduction input indice out of range error message. + * + * @param index The index that holds the out of range value. + * @param indexValue The value that is out of range. + * @param inputRows Upper bound of valid index values. + */ +declare function getSparseSegmentReductionIndicesOutOfRangeErrorMessage(index: number, indexValue: number, inputRows: number): string; + +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/** + * Generates sparse segment reduction negative segment ids error message. + * + */ +declare function getSparseSegmentReductionNegativeSegmentIdsErrorMessage(): string; + +/** + * Generates sparse segment reduction non increasing segment ids error message. + * + */ +declare function getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage(): string; + +/** + * Generates sparse segment reduction segment id out of range error message. + * + * @param segmentId The segment id index that is out of range. + * @param outputRows Upper bound of valid segment id values. + */ +declare function getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage(segmentId: number, outputRows: number): string; + +/** + * Extracts any `Tensor`s found within the provided object. + * + * @param container an object that may be a `Tensor` or may directly contain + * `Tensor`s, such as a `Tensor[]` or `{key: Tensor, ...}`. In general it + * is safe to pass any object here, except that `Promise`s are not + * supported. + * @returns An array of `Tensors` found within the passed object. If the + * argument is simply a `Tensor', a list containing that `Tensor` is + * returned. If the object is not a `Tensor` or does not + * contain `Tensors`, an empty list is returned. + */ +declare function getTensorsInContainer(result: TensorContainer): Tensor[]; + +declare function getTypedArrayFromDType(dtype: D, size: number): DataTypeMap[D]; + +/** Returns the axes permutation that undoes the original permutation. */ +declare function getUndoAxesPermutation(axes: number[]): number[]; + +/** + * Concatenate the weights stored in a WeightsManifestConfig into a list of + * WeightsManifestEntry + * + * @param weightsManifest The WeightsManifestConfig to extract weights from. + * @returns A list of WeightsManifestEntry of the weights in the weightsManifest + */ +declare function getWeightSpecs(weightsManifest: WeightsManifestConfig): WeightsManifestEntry[]; + +export declare interface GPUData { + tensorRef: Tensor; + texture?: WebGLTexture; + buffer?: GPUBuffer; + texShape?: [number, number]; + bufSize?: number; +} + +/** + * Provided `f(x)`, returns another function `g(x, dy?)`, which gives the + * gradient of `f(x)` with respect to `x`. + * + * If `dy` is provided, the gradient of `f(x).mul(dy).sum()` with respect to + * `x` is computed instead. `f(x)` must take a single tensor `x` and return a + * single tensor `y`. If `f()` takes multiple inputs, use `tf.grads` instead. + * + * ```js + * // f(x) = x ^ 2 + * const f = x => x.square(); + * // f'(x) = 2x + * const g = tf.grad(f); + * + * const x = tf.tensor1d([2, 3]); + * g(x).print(); + * ``` + * + * ```js + * // f(x) = x ^ 3 + * const f = x => x.pow(tf.scalar(3, 'int32')); + * // f'(x) = 3x ^ 2 + * const g = tf.grad(f); + * // f''(x) = 6x + * const gg = tf.grad(g); + * + * const x = tf.tensor1d([2, 3]); + * gg(x).print(); + * ``` + * + * @param f The function f(x), to compute gradient for. + * + * @doc {heading: 'Training', subheading: 'Gradients'} + */ +export declare function grad(f: (x: Tensor) => Tensor): (x: TensorLike | Tensor, dy?: TensorLike | Tensor) => Tensor; + +/** Config object for registering a gradient in the global registry. */ +export declare interface GradConfig { + kernelName: string; + inputsToSave?: string[]; + saveAllInputs?: boolean; + outputsToSave?: boolean[]; + gradFunc: GradFunc; +} + +/** The function to run when computing a gradient during backprop. */ +export declare type GradFunc = (dy: Tensor | Tensor[], saved: Tensor[], attrs: NamedAttrMap) => NamedGradientMap; + +/** + * Provided `f(x1, x2,...)`, returns another function `g([x1, x2,...], dy?)`, + * which gives an array of gradients of `f()` with respect to each input + * [`x1`,`x2`,...]. + * + * If `dy` is passed when calling `g()`, the gradient of + * `f(x1,...).mul(dy).sum()` with respect to each input is computed instead. + * The provided `f` must take one or more tensors and return a single tensor + * `y`. If `f()` takes a single input, we recommend using `tf.grad` instead. + * + * ```js + * // f(a, b) = a * b + * const f = (a, b) => a.mul(b); + * // df / da = b, df / db = a + * const g = tf.grads(f); + * + * const a = tf.tensor1d([2, 3]); + * const b = tf.tensor1d([-2, -3]); + * const [da, db] = g([a, b]); + * console.log('da'); + * da.print(); + * console.log('db'); + * db.print(); + * ``` + * + * @param f The function `f(x1, x2,...)` to compute gradients for. + * + * @doc {heading: 'Training', subheading: 'Gradients'} + */ +export declare function grads(f: (...args: Tensor[]) => Tensor): (args: Array, dy?: Tensor | TensorLike) => Tensor[]; + +export declare type GradSaveFunc = (save: Tensor[]) => void; + +export declare const Greater = "Greater"; + +export declare const greater: typeof greater_; + +/** + * Returns the truth value of (a > b) element-wise. Supports broadcasting. + * + * ```js + * const a = tf.tensor1d([1, 2, 3]); + * const b = tf.tensor1d([2, 2, 2]); + * + * a.greater(b).print(); + * ``` + * + * @param a The first input tensor. + * @param b The second input tensor. Must have the same dtype as `a`. + * + * @doc {heading: 'Operations', subheading: 'Logical'} + */ +declare function greater_(a: Tensor | TensorLike, b: Tensor | TensorLike): T; + +export declare const GreaterEqual = "GreaterEqual"; + +export declare const greaterEqual: typeof greaterEqual_; + +/** + * Returns the truth value of (a >= b) element-wise. Supports broadcasting. + * + * ```js + * const a = tf.tensor1d([1, 2, 3]); + * const b = tf.tensor1d([2, 2, 2]); + * + * a.greaterEqual(b).print(); + * ``` + * + * @param a The first input tensor. + * @param b The second input tensor. Must have the same dtype as `a`. + * + * @doc {heading: 'Operations', subheading: 'Logical'} + */ +declare function greaterEqual_(a: Tensor | TensorLike, b: Tensor | TensorLike): T; + +export declare type GreaterEqualInputs = BinaryInputs; + +export declare type GreaterInputs = BinaryInputs; + +/** + * Returns true if the new type can't encode the old type without loss of + * precision. + */ +declare function hasEncodingLoss(oldType: DataType, newType: DataType): boolean; + +declare function hexToLong(hex: string): Long; + +/** + * Creates an IOHandler subtype that sends model artifacts to HTTP server. + * + * An HTTP request of the `multipart/form-data` mime type will be sent to the + * `path` URL. The form data includes artifacts that represent the topology + * and/or weights of the model. In the case of Keras-style `tf.Model`, two + * blobs (files) exist in form-data: + * - A JSON file consisting of `modelTopology` and `weightsManifest`. + * - A binary weights file consisting of the concatenated weight values. + * These files are in the same format as the one generated by + * [tfjs_converter](https://js.tensorflow.org/tutorials/import-keras.html). + * + * The following code snippet exemplifies the client-side code that uses this + * function: + * + * ```js + * const model = tf.sequential(); + * model.add( + * tf.layers.dense({units: 1, inputShape: [100], activation: 'sigmoid'})); + * + * const saveResult = await model.save(tf.io.http( + * 'http://model-server:5000/upload', {requestInit: {method: 'PUT'}})); + * console.log(saveResult); + * ``` + * + * If the default `POST` method is to be used, without any custom parameters + * such as headers, you can simply pass an HTTP or HTTPS URL to `model.save`: + * + * ```js + * const saveResult = await model.save('http://model-server:5000/upload'); + * ``` + * + * The following GitHub Gist + * https://gist.github.com/dsmilkov/1b6046fd6132d7408d5257b0976f7864 + * implements a server based on [flask](https://github.com/pallets/flask) that + * can receive the request. Upon receiving the model artifacts via the requst, + * this particular server reconstitutes instances of [Keras + * Models](https://keras.io/models/model/) in memory. + * + * + * @param path A URL path to the model. + * Can be an absolute HTTP path (e.g., + * 'http://localhost:8000/model-upload)') or a relative path (e.g., + * './model-upload'). + * @param requestInit Request configurations to be used when sending + * HTTP request to server using `fetch`. It can contain fields such as + * `method`, `credentials`, `headers`, `mode`, etc. See + * https://developer.mozilla.org/en-US/docs/Web/API/Request/Request + * for more information. `requestInit` must not have a body, because the + * body will be set by TensorFlow.js. File blobs representing the model + * topology (filename: 'model.json') and the weights of the model (filename: + * 'model.weights.bin') will be appended to the body. If `requestInit` has a + * `body`, an Error will be thrown. + * @param loadOptions Optional configuration for the loading. It includes the + * following fields: + * - weightPathPrefix Optional, this specifies the path prefix for weight + * files, by default this is calculated from the path param. + * - fetchFunc Optional, custom `fetch` function. E.g., in Node.js, + * the `fetch` from node-fetch can be used here. + * - onProgress Optional, progress callback function, fired periodically + * before the load is completed. + * @returns An instance of `IOHandler`. + * + * @doc { + * heading: 'Models', + * subheading: 'Loading', + * namespace: 'io', + * ignoreCI: true + * } + */ +declare function http(path: string, loadOptions?: LoadOptions): IOHandler; + +export declare const Identity = "Identity"; + +export declare type IdentityInputs = Pick; + +export declare const IFFT = "IFFT"; + +export declare const ifft: typeof ifft_; + +/** + * Inverse fast Fourier transform. + * + * Computes the inverse 1-dimensional discrete Fourier transform over the + * inner-most dimension of input. + * + * ```js + * const real = tf.tensor1d([1, 2, 3]); + * const imag = tf.tensor1d([1, 2, 3]); + * const x = tf.complex(real, imag); + * + * x.ifft().print(); // tf.spectral.ifft(x).print(); + * ``` + * @param input The complex input to compute an ifft over. + * + * @doc {heading: 'Operations', subheading: 'Spectral', namespace: 'spectral'} + */ +declare function ifft_(input: Tensor): Tensor; + +export declare type IFFTInputs = Pick; + +export declare const Imag = "Imag"; + +export declare const imag: typeof imag_; + +/** + * Returns the imaginary part of a complex (or real) tensor. + * + * Given a tensor input, this operation returns a tensor of type float that is + * the imaginary part of each element in input considered as a complex number. + * If input is real, a tensor of all zeros is returned. + * + * ```js + * const x = tf.complex([-2.25, 3.25], [4.75, 5.75]); + * tf.imag(x).print(); + * ``` + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ +declare function imag_(input: T | TensorLike): T; + +export declare const image: { + flipLeftRight: (image: TensorLike | Tensor4D) => Tensor4D; + grayscaleToRGB: (image: TensorLike | T) => T; + resizeNearestNeighbor: (images: TensorLike | T_1, size: [number, number], alignCorners?: boolean, halfPixelCenters?: boolean) => T_1; + resizeBilinear: (images: TensorLike | T_2, size: [number, number], alignCorners?: boolean, halfPixelCenters?: boolean) => T_2; + rotateWithOffset: (image: TensorLike | Tensor4D, radians: number, fillValue?: number | [number, number, number], center?: number | [number, number]) => Tensor4D; + cropAndResize: (image: TensorLike | Tensor4D, boxes: TensorLike | Tensor2D, boxInd: TensorLike | Tensor1D, cropSize: [number, number], method?: "nearest" | "bilinear", extrapolationValue?: number) => Tensor4D; + nonMaxSuppression: (boxes: TensorLike | Tensor2D, scores: TensorLike | Tensor1D, maxOutputSize: number, iouThreshold?: number, scoreThreshold?: number) => Tensor1D; + nonMaxSuppressionAsync: (boxes: TensorLike | Tensor2D, scores: TensorLike | Tensor1D, maxOutputSize: number, iouThreshold?: number, scoreThreshold?: number) => Promise; + nonMaxSuppressionWithScore: (boxes: TensorLike | Tensor2D, scores: TensorLike | Tensor1D, maxOutputSize: number, iouThreshold?: number, scoreThreshold?: number, softNmsSigma?: number) => NamedTensorMap; + nonMaxSuppressionWithScoreAsync: (boxes: TensorLike | Tensor2D, scores: TensorLike | Tensor1D, maxOutputSize: number, iouThreshold?: number, scoreThreshold?: number, softNmsSigma?: number) => Promise; + nonMaxSuppressionPadded: (boxes: TensorLike | Tensor2D, scores: TensorLike | Tensor1D, maxOutputSize: number, iouThreshold?: number, scoreThreshold?: number, padToMaxOutputSize?: boolean) => NamedTensorMap; + nonMaxSuppressionPaddedAsync: (boxes: TensorLike | Tensor2D, scores: TensorLike | Tensor1D, maxOutputSize: number, iouThreshold?: number, scoreThreshold?: number, padToMaxOutputSize?: boolean) => Promise; + threshold: (image: TensorLike | Tensor3D, method?: string, inverted?: boolean, threshValue?: number) => Tensor3D; + transform: (image: TensorLike | Tensor4D, transforms: TensorLike | Tensor2D, interpolation?: "nearest" | "bilinear", fillMode?: "nearest" | "constant" | "reflect" | "wrap", fillValue?: number, outputShape?: [number, number]) => Tensor4D; +}; + +export declare type ImagInputs = Pick; + +/** + * Computes the location (multidimensional index) in a + * tensor/multidimentional array for a given flat index. + * + * @param index Index in flat array. + * @param rank Rank of tensor. + * @param strides Strides of tensor. + */ +declare function indexToLoc(index: number, rank: number, strides: number[]): number[]; + +declare function inferDtype(values: TensorLike | WebGLData): DataType; + +/** + * Common interface for a machine learning model that can do inference. + */ +export declare interface InferenceModel { + /** + * Return the array of input tensor info. + */ + readonly inputs: ModelTensorInfo[]; + /** + * Return the array of output tensor info. + */ + readonly outputs: ModelTensorInfo[]; + /** + * Execute the inference for the input tensors. + * + * @param input The input tensors, when there is single input for the model, + * inputs param should be a Tensor. For models with multiple inputs, inputs + * params should be in either Tensor[] if the input order is fixed, or + * otherwise NamedTensorMap format. + * For batch inference execution, the tensors for each input need to be + * concatenated together. For example with mobilenet, the required input shape + * is [1, 244, 244, 3], which represents the [batch, height, width, channel]. + * If we are provide a batched data of 100 images, the input tensor should be + * in the shape of [100, 244, 244, 3]. + * + * @param config Prediction configuration for specifying the batch size. + * + * @returns Inference result tensors. The output would be single Tensor if + * model has single output node, otherwise Tensor[] or NamedTensorMap[] will + * be returned for model with multiple outputs. + */ + predict(inputs: Tensor | Tensor[] | NamedTensorMap, config: ModelPredictConfig): Tensor | Tensor[] | NamedTensorMap; + /** + * Single Execute the inference for the input tensors and return activation + * values for specified output node names without batching. + * + * @param input The input tensors, when there is single input for the model, + * inputs param should be a Tensor. For models with multiple inputs, inputs + * params should be in either Tensor[] if the input order is fixed, or + * otherwise NamedTensorMap format. + * + * @param outputs string|string[]. List of output node names to retrieve + * activation from. + * + * @returns Activation values for the output nodes result tensors. The return + * type matches specified parameter outputs type. The output would be single + * Tensor if single output is specified, otherwise Tensor[] for multiple + * outputs. + */ + execute(inputs: Tensor | Tensor[] | NamedTensorMap, outputs: string | string[]): Tensor | Tensor[]; +} + +/** + * Given the full size of the array and a shape that may contain -1 as the + * implicit dimension, returns the inferred shape where -1 is replaced. + * E.g. For shape=[2, -1, 3] and size=24, it will return [2, 4, 3]. + * + * @param shape The shape, which may contain -1 in some dimension. + * @param size The full size (number of elements) of the array. + * @return The inferred shape where -1 is replaced with the inferred size. + */ +declare function inferFromImplicitShape(shape: number[], size: number): number[]; + +export declare const inTopKAsync: typeof inTopKAsync_; + +/** + * Returns whether the targets are in the top K predictions. + * + * ```js + * const predictions = tf.tensor2d([[20, 10, 40, 30], [30, 50, -20, 10]]); + * const targets = tf.tensor1d([2, 0]); + * const precision = await tf.inTopKAsync(predictions, targets); + * precision.print(); + * ``` + * @param predictions 2-D or higher `tf.Tensor` with last dimension being + * at least `k`. + * @param targets 1-D or higher `tf.Tensor`. + * @param k Optional Number of top elements to look at for computing precision, + * default to 1. + * + * @doc {heading: 'Operations', subheading: 'Evaluation'} + */ +declare function inTopKAsync_(predictions: T | TensorLike, targets: U | TensorLike, k?: number): Promise; + +declare namespace io { + export { + copyModel, + listModels, + moveModel, + removeModel, + browserFiles, + browserHTTPRequest, + concatenateArrayBuffers, + decodeWeights, + encodeWeights, + fromMemory, + fromMemorySync, + getLoadHandlers, + getModelArtifactsForJSON, + getModelArtifactsForJSONSync, + getModelArtifactsInfoForJSON, + getSaveHandlers, + getWeightSpecs, + http, + IOHandler, + IOHandlerSync, + isHTTPScheme, + LoadHandler, + LoadOptions, + loadWeights, + ModelArtifacts, + ModelArtifactsInfo, + ModelJSON, + ModelStoreManager, + OnProgressCallback, + registerLoadRouter, + registerSaveRouter, + RequestDetails, + SaveConfig, + SaveHandler, + SaveResult, + TrainingConfig, + WeightGroup, + weightsLoaderFactory, + WeightsManifestConfig, + WeightsManifestEntry, + withSaveHandler, + withSaveHandlerSync + } +} +export { io } + +/** + * Interface for a model import/export handler. + * + * The `save` and `load` handlers are both optional, in order to allow handlers + * that support only saving or loading. + */ +declare interface IOHandler { + save?: SaveHandler; + load?: LoadHandler; +} + +/** + * Interface for a synchronous model import/export handler. + * + * The `save` and `load` handlers are both optional, in order to allow handlers + * that support only saving or loading. + */ +declare type IOHandlerSync = { + save?: SaveHandlerSync; + load?: LoadHandlerSync; +}; + +declare type IORouter = (url: string | string[], loadOptions?: LoadOptions) => IOHandler; + +export declare const irfft: typeof irfft_; + +/** + * Inversed real value input fast Fourier transform. + * + * Computes the 1-dimensional inversed discrete Fourier transform over the + * inner-most dimension of the real input. + * + * ```js + * const real = tf.tensor1d([1, 2, 3]); + * const imag = tf.tensor1d([0, 0, 0]); + * const x = tf.complex(real, imag); + * + * x.irfft().print(); + * ``` + * @param input The real value input to compute an irfft over. + * + * @doc {heading: 'Operations', subheading: 'Spectral', namespace: 'spectral'} + */ +declare function irfft_(input: Tensor): Tensor; + +declare function isBoolean(value: {}): boolean; + +declare function isBrowser(): boolean; + +export declare const IsFinite = "IsFinite"; + +/** + * Returns which elements of x are finite. + * + * ```js + * const x = tf.tensor1d([NaN, Infinity, -Infinity, 0, 1]); + * + * x.isFinite().print(); // or tf.isNaN(x) + * ``` + * @param x The input Tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function isFinite_(x: T | TensorLike): T; + +declare const isFinite_2: typeof isFinite_; +export { isFinite_2 as isFinite } + +export declare type IsFiniteInputs = UnaryInputs; + +declare function isFunction(f: Function): boolean; + +declare function isHTTPScheme(url: string): boolean; + +/** Determines if an axes permutation is the identity permutation. */ +declare function isIdentityPermutation(perm: number[]): boolean; + +export declare const IsInf = "IsInf"; + +export declare const isInf: typeof isInf_; + +/** + * Returns which elements of x are Infinity or -Infinity. + * + * ```js + * const x = tf.tensor1d([NaN, Infinity, -Infinity, 0, 1]); + * + * x.isInf().print(); // or tf.isNaN(x) + * ``` + * @param x The input Tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function isInf_(x: T | TensorLike): T; + +export declare type IsInfInputs = UnaryInputs; + +declare function isInt(a: number): boolean; + +declare function isMobile(nav?: Navigator): boolean; + +export declare const IsNan = "IsNan"; + +/** + * Returns which elements of x are NaN. + * + * ```js + * const x = tf.tensor1d([NaN, Infinity, -Infinity, 0, 1]); + * + * x.isNaN().print(); // or tf.isNaN(x) + * ``` + * @param x The input Tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function isNaN_(x: T | TensorLike): T; + +declare const isNaN_2: typeof isNaN_; +export { isNaN_2 as isNaN } + +export declare type IsNanInputs = UnaryInputs; + +declare function isNumber(value: {}): boolean; + +/** + * This method asserts whether an object is a Promise instance. + * @param object + */ +declare function isPromise(object: any): object is Promise; + +declare function isScalarShape(shape: number[]): boolean; + +/** + * Returns true if the slice occupies a continous set of elements in the + * 'flat' space. + */ +declare function isSliceContinous(shape: number[], begin: number[], size: number[]): boolean; + +/** Returns true if the value is a string. */ +declare function isString(value: {}): value is string; + +declare function isTensorInList(tensor: Tensor, tensorList: Tensor[]): boolean; + +declare function isTypedArray(a: {}): a is Float32Array | Int32Array | Uint8Array | Uint8ClampedArray; + +/** Returns true if the dtype is valid. */ +declare function isValidDtype(dtype: DataType): boolean; + +/** + * Keeps a `tf.Tensor` generated inside a `tf.tidy` from being disposed + * automatically. + * + * ```js + * let b; + * const y = tf.tidy(() => { + * const one = tf.scalar(1); + * const a = tf.scalar(2); + * + * // b will not be cleaned up by the tidy. a and one will be cleaned up + * // when the tidy ends. + * b = tf.keep(a.square()); + * + * console.log('numTensors (in tidy): ' + tf.memory().numTensors); + * + * // The value returned inside the tidy function will return + * // through the tidy, in this case to the variable y. + * return b.add(one); + * }); + * + * console.log('numTensors (outside tidy): ' + tf.memory().numTensors); + * console.log('y:'); + * y.print(); + * console.log('b:'); + * b.print(); + * ``` + * + * @param result The tensor to keep from being disposed. + * + * @doc {heading: 'Performance', subheading: 'Memory'} + */ +export declare function keep(result: T): T; + +declare namespace kernel_impls { + export { + nonMaxSuppressionV3Impl, + nonMaxSuppressionV4Impl, + nonMaxSuppressionV5Impl, + whereImpl + } +} +export { kernel_impls } + +/** + * The interface that defines the kernels that should be implemented when + * adding a new backend. New backends don't need to implement every one of the + * methods, this can be done gradually (throw an error for unimplemented + * methods). + */ +export declare class KernelBackend implements TensorStorage, Backend, BackendTimer { + refCount(dataId: DataId): number; + incRef(dataId: DataId): void; + timerAvailable(): boolean; + time(f: () => void): Promise; + read(dataId: object): Promise; + readSync(dataId: object): BackendValues; + readToGPU(dataId: object, options?: DataToGPUOptions): GPUData; + numDataIds(): number; + disposeData(dataId: object, force?: boolean): boolean; + write(values: BackendValues, shape: number[], dtype: DataType): DataId; + move(dataId: DataId, values: BackendValues, shape: number[], dtype: DataType, refCount: number): void; + createTensorFromTexture(values: WebGLData, shape: number[], dtype: DataType): Tensor; + memory(): { + unreliable: boolean; + reasons?: string[]; + }; + /** Returns the highest precision for floats in bits (e.g. 16 or 32) */ + floatPrecision(): 16 | 32; + /** Returns the smallest representable number. */ + epsilon(): number; + dispose(): void; +} + +/** Config object for registering a kernel in the global registry. */ +export declare interface KernelConfig { + kernelName: string; + backendName: string; + kernelFunc: KernelFunc; + setupFunc?: KernelSetupFunc; + disposeFunc?: KernelDisposeFunc; +} + +/** Function that gets called right before the backend is disposed. */ +export declare type KernelDisposeFunc = KernelSetupFunc; + +/** Specifies the code to run when executing a kernel. */ +export declare type KernelFunc = (params: { + inputs: NamedTensorInfoMap; + backend: {}; + attrs?: NamedAttrMap; +}) => TensorInfo | TensorInfo[]; + +declare type KernelInfo = { + name: string; + bytesAdded: number; + totalBytesSnapshot: number; + tensorsAdded: number; + totalTensorsSnapshot: number; + inputShapes: number[][]; + outputShapes: number[][]; + kernelTimeMs: number | { + error: string; + } | Promise; + extraInfo: string | Promise; +}; + +/** Function that gets called after the backend initializes. */ +export declare type KernelSetupFunc = (backend: {}) => void; + +export declare const LeakyRelu = "LeakyRelu"; + +export declare const leakyRelu: typeof leakyRelu_; + +/** + * Computes leaky rectified linear element-wise. + * + * See + * [http://web.stanford.edu/~awni/papers/relu_hybrid_icml2013_final.pdf]( + * http://web.stanford.edu/~awni/papers/relu_hybrid_icml2013_final.pdf) + * + * ```js + * const x = tf.tensor1d([-1, 2, -3, 4]); + * + * x.leakyRelu(0.1).print(); // or tf.leakyRelu(x, 0.1) + * ``` + * @param x The input tensor. + * @param alpha The scaling factor for negative values, defaults to 0.2. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function leakyRelu_(x: T | TensorLike, alpha?: number): T; + +export declare interface LeakyReluAttrs { + alpha: number; +} + +export declare type LeakyReluInputs = Pick; + +export declare const Less = "Less"; + +export declare const less: typeof less_; + +/** + * Returns the truth value of (a < b) element-wise. Supports broadcasting. + * + * ```js + * const a = tf.tensor1d([1, 2, 3]); + * const b = tf.tensor1d([2, 2, 2]); + * + * a.less(b).print(); + * ``` + * @param a The first input tensor. + * @param b The second input tensor. Must have the same dtype as `a`. + * + * @doc {heading: 'Operations', subheading: 'Logical'} + */ +declare function less_(a: Tensor | TensorLike, b: Tensor | TensorLike): T; + +export declare const LessEqual = "LessEqual"; + +export declare const lessEqual: typeof lessEqual_; + +/** + * Returns the truth value of (a <= b) element-wise. Supports broadcasting. + * + * ```js + * const a = tf.tensor1d([1, 2, 3]); + * const b = tf.tensor1d([2, 2, 2]); + * + * a.lessEqual(b).print(); + * ``` + * + * @param a The first input tensor. + * @param b The second input tensor. Must have the same dtype as `a`. + * + * @doc {heading: 'Operations', subheading: 'Logical'} + */ +declare function lessEqual_(a: Tensor | TensorLike, b: Tensor | TensorLike): T; + +export declare type LessEqualInputs = BinaryInputs; + +export declare type LessInputs = BinaryInputs; + +export declare const linalg: { + bandPart: >(a: TensorLike | T, numLower: number, numUpper: number) => T; + gramSchmidt: (xs: Tensor2D | Tensor1D[]) => Tensor2D | Tensor1D[]; + qr: (x: Tensor, fullMatrices?: boolean) => [Tensor, Tensor]; +}; + +export declare const LinSpace = "LinSpace"; + +/** + * Return an evenly spaced sequence of numbers over the given interval. + * + * ```js + * tf.linspace(0, 9, 10).print(); + * ``` + * @param start The start value of the sequence. + * @param stop The end value of the sequence. + * @param num The number of values to generate. + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ +export declare function linspace(start: number, stop: number, num: number): Tensor1D; + +export declare interface LinSpaceAttrs { + start: number; + stop: number; + num: number; +} + +/** + * List all models stored in registered storage mediums. + * + * For a web browser environment, the registered mediums are Local Storage and + * IndexedDB. + * + * ```js + * // First create and save a model. + * const model = tf.sequential(); + * model.add(tf.layers.dense( + * {units: 1, inputShape: [10], activation: 'sigmoid'})); + * await model.save('localstorage://demo/management/model1'); + * + * // Then list existing models. + * console.log(JSON.stringify(await tf.io.listModels())); + * + * // Delete the model. + * await tf.io.removeModel('localstorage://demo/management/model1'); + * + * // List models again. + * console.log(JSON.stringify(await tf.io.listModels())); + * ``` + * + * @returns A `Promise` of a dictionary mapping URLs of existing models to + * their model artifacts info. URLs include medium-specific schemes, e.g., + * 'indexeddb://my/model/1'. Model artifacts info include type of the + * model's topology, byte sizes of the topology, weights, etc. + * + * @doc { + * heading: 'Models', + * subheading: 'Management', + * namespace: 'io', + * ignoreCI: true + * } + */ +declare function listModels(): Promise<{ + [url: string]: ModelArtifactsInfo; +}>; + +/** + * Type definition for handlers of loading operations. + */ +declare type LoadHandler = () => Promise; + +/** + * Type definition for handlers of synchronous loading operations. + */ +declare type LoadHandlerSync = () => ModelArtifacts; + +/** @innamespace io */ +declare interface LoadOptions { + /** + * RequestInit (options) for HTTP requests. + * + * For detailed information on the supported fields, see + * [https://developer.mozilla.org/en-US/docs/Web/API/Request/Request]( + * https://developer.mozilla.org/en-US/docs/Web/API/Request/Request) + */ + requestInit?: RequestInit; + /** + * Progress callback. + */ + onProgress?: OnProgressCallback; + /** + * A function used to override the `window.fetch` function. + */ + fetchFunc?: Function; + /** + * Strict loading model: whether extraneous weights or missing + * weights should trigger an `Error`. + * + * If `true`, require that the provided weights exactly match those + * required by the layers. `false` means that both extra weights + * and missing weights will be silently ignored. + * + * Default: `true`. + */ + strict?: boolean; + /** + * Path prefix for weight files, by default this is calculated from the + * path of the model JSON file. + * + * For instance, if the path to the model JSON file is + * `http://localhost/foo/model.json`, then the default path prefix will be + * `http://localhost/foo/`. If a weight file has the path value + * `group1-shard1of2` in the weight manifest, then the weight file will be + * loaded from `http://localhost/foo/group1-shard1of2` by default. However, + * if you provide a `weightPathPrefix` value of + * `http://localhost/foo/alt-weights`, then the weight file will be loaded + * from the path `http://localhost/foo/alt-weights/group1-shard1of2` instead. + */ + weightPathPrefix?: string; + /** + * Whether the module or model is to be loaded from TF Hub. + * + * Setting this to `true` allows passing a TF-Hub module URL, omitting the + * standard model file name and the query parameters. + * + * Default: `false`. + */ + fromTFHub?: boolean; + /** + * An async function to convert weight file name to URL. The weight file + * names are stored in model.json's weightsManifest.paths field. By default we + * consider weight files are colocated with the model.json file. For example: + * model.json URL: https://www.google.com/models/1/model.json + * group1-shard1of1.bin url: + * https://www.google.com/models/1/group1-shard1of1.bin + * + * With this func you can convert the weight file name to any URL. + */ + weightUrlConverter?: (weightFileName: string) => Promise; +} + +/** + * Reads a weights manifest JSON configuration, fetches the weights and + * returns them as `Tensor`s. + * + * @param manifest The weights manifest JSON. + * @param filePathPrefix The path prefix for filenames given in the manifest. + * Defaults to the empty string. + * @param weightNames The names of the weights to be fetched. + */ +declare function loadWeights(manifest: WeightsManifestConfig, filePathPrefix?: string, weightNames?: string[], requestInit?: RequestInit): Promise; + +export declare const localResponseNormalization: typeof localResponseNormalization_; + +/** + * Normalizes the activation of a local neighborhood across or within + * channels. + * + * @param x The input tensor. The 4-D input tensor is treated as a 3-D array + * of 1D vectors (along the last dimension), and each vector is + * normalized independently. + * @param depthRadius The number of adjacent channels in the 1D normalization + * window. + * @param bias A constant bias term for the basis. + * @param alpha A scale factor, usually positive. + * @param beta An exponent. + * + * @doc {heading: 'Operations', subheading: 'Normalization'} + */ +declare function localResponseNormalization_(x: T | TensorLike, depthRadius?: number, bias?: number, alpha?: number, beta?: number): T; + +/** + * Computes flat index for a given location (multidimentionsal index) in a + * Tensor/multidimensional array. + * + * @param locs Location in the tensor. + * @param rank Rank of the tensor. + * @param strides Tensor strides. + */ +declare function locToIndex(locs: number[], rank: number, strides: number[]): number; + +export declare const Log = "Log"; + +export declare const log: typeof log_; + +export declare const Log1p = "Log1p"; + +export declare const log1p: typeof log1p_; + +/** + * Computes natural logarithm of the input `tf.Tensor` plus one + * element-wise: `ln(1 + x)` + * + * ```js + * const x = tf.tensor1d([1, 2, Math.E - 1]); + * + * x.log1p().print(); // or tf.log1p(x) + * ``` + * @param x The input tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function log1p_(x: T | TensorLike): T; + +export declare type Log1pInputs = UnaryInputs; + +/** + * Computes natural logarithm of the input `tf.Tensor` element-wise: `ln(x)` + * + * ```js + * const x = tf.tensor1d([1, 2, Math.E]); + * + * x.log().print(); // or tf.log(x) + * ``` + * @param x The input tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function log_(x: T | TensorLike): T; + +declare function log_2(...msg: Array<{}>): void; + +export declare const LogicalAnd = "LogicalAnd"; + +export declare const logicalAnd: typeof logicalAnd_; + +/** + * Returns the truth value of `a AND b` element-wise. Supports broadcasting. + * + * ```js + * const a = tf.tensor1d([false, false, true, true], 'bool'); + * const b = tf.tensor1d([false, true, false, true], 'bool'); + * + * a.logicalAnd(b).print(); + * ``` + * + * @param a The first input tensor. Must be of dtype bool. + * @param b The second input tensor. Must be of dtype bool. + * + * @doc {heading: 'Operations', subheading: 'Logical'} + */ +declare function logicalAnd_(a: Tensor | TensorLike, b: Tensor | TensorLike): T; + +export declare type LogicalAndInputs = BinaryInputs; + +export declare const LogicalNot = "LogicalNot"; + +export declare const logicalNot: typeof logicalNot_; + +/** + * Returns the truth value of `NOT x` element-wise. + * + * ```js + * const a = tf.tensor1d([false, true], 'bool'); + * + * a.logicalNot().print(); + * ``` + * + * @param x The input tensor. Must be of dtype 'bool'. + * + * @doc {heading: 'Operations', subheading: 'Logical'} + */ +declare function logicalNot_(x: T | TensorLike): T; + +export declare type LogicalNotInputs = Pick; + +export declare const LogicalOr = "LogicalOr"; + +export declare const logicalOr: typeof logicalOr_; + +/** + * Returns the truth value of `a OR b` element-wise. Supports broadcasting. + * + * ```js + * const a = tf.tensor1d([false, false, true, true], 'bool'); + * const b = tf.tensor1d([false, true, false, true], 'bool'); + * + * a.logicalOr(b).print(); + * ``` + * @param a The first input tensor. Must be of dtype bool. + * @param b The second input tensor. Must be of dtype bool. + * + * @doc {heading: 'Operations', subheading: 'Logical'} + */ +declare function logicalOr_(a: Tensor | TensorLike, b: Tensor | TensorLike): T; + +export declare type LogicalOrInputs = BinaryInputs; + +export declare const LogicalXor = "LogicalXor"; + +export declare const logicalXor: typeof logicalXor_; + +/** + * Returns the truth value of `a XOR b` element-wise. Supports broadcasting. + * + * ```js + * const a = tf.tensor1d([false, false, true, true], 'bool'); + * const b = tf.tensor1d([false, true, false, true], 'bool'); + * + * a.logicalXor(b).print(); + * ``` + * + * @param a The first input tensor. Must be of dtype bool. + * @param b The second input tensor. Must be of dtype bool. + * + * @doc {heading: 'Operations', subheading: 'Logical'} + */ +declare function logicalXor_(a: Tensor | TensorLike, b: Tensor | TensorLike): T; + +export declare type LogicalXorInputs = BinaryInputs; + +export declare type LogInputs = UnaryInputs; + +export declare const logSigmoid: typeof logSigmoid_; + +/** + * Computes log sigmoid of the input `tf.Tensor` element-wise: + * `logSigmoid(x)`. For numerical stability, we use `-tf.softplus(-x)`. + * + * ```js + * const x = tf.tensor1d([0, 1, -1, .7]); + * + * x.logSigmoid().print(); // or tf.logSigmoid(x) + * ``` + * @param x The input tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function logSigmoid_(x: T | TensorLike): T; + +export declare const LogSoftmax = "LogSoftmax"; + +export declare const logSoftmax: typeof logSoftmax_; + +/** + * Computes the log softmax. + * + * ```js + * const a = tf.tensor1d([1, 2, 3]); + * + * a.logSoftmax().print(); // or tf.logSoftmax(a) + * ``` + * + * ```js + * const a = tf.tensor2d([2, 4, 6, 1, 2, 3], [2, 3]); + * + * a.logSoftmax().print(); // or tf.logSoftmax(a) + * ``` + * + * @param logits The logits array. + * @param axis The dimension softmax would be performed on. Defaults to `-1` + * which indicates the last dimension. + * + * @doc {heading: 'Operations', subheading: 'Normalization'} + */ +declare function logSoftmax_(logits: T | TensorLike, axis?: number): T; + +export declare interface LogSoftmaxAttrs { + axis: number; +} + +export declare type LogSoftmaxInputs = Pick; + +export declare const logSumExp: typeof logSumExp_; + +/** + * Computes the log(sum(exp(elements across the reduction dimensions))). + * + * Reduces the input along the dimensions given in `axis`. Unless `keepDims` + * is true, the rank of the array is reduced by 1 for each entry in `axis`. + * If `keepDims` is true, the reduced dimensions are retained with length 1. + * If `axis` has no entries, all dimensions are reduced, and an array with a + * single element is returned. + * + * ```js + * const x = tf.tensor1d([1, 2, 3]); + * + * x.logSumExp().print(); // or tf.logSumExp(x) + * ``` + * + * ```js + * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]); + * + * const axis = 1; + * x.logSumExp(axis).print(); // or tf.logSumExp(a, axis) + * ``` + * @param x The input tensor. + * @param axis The dimension(s) to reduce. If null (the default), + * reduces all dimensions. + * @param keepDims If true, retains reduced dimensions with length + * of 1. Defaults to false. + * + * @doc {heading: 'Operations', subheading: 'Reduction'} + */ +declare function logSumExp_(x: Tensor | TensorLike, axis?: number | number[], keepDims?: boolean): T; + +export declare const losses: { + absoluteDifference: , O extends Tensor>(labels: TensorLike | T, predictions: TensorLike | T, weights?: TensorLike | Tensor, reduction?: Reduction) => O; + computeWeightedLoss: , O_1 extends Tensor>(losses: TensorLike | T_1, weights?: TensorLike | Tensor, reduction?: Reduction) => O_1; + cosineDistance: , O_2 extends Tensor>(labels: TensorLike | T_2, predictions: TensorLike | T_2, axis: number, weights?: TensorLike | Tensor, reduction?: Reduction) => O_2; + hingeLoss: , O_3 extends Tensor>(labels: TensorLike | T_3, predictions: TensorLike | T_3, weights?: TensorLike | Tensor, reduction?: Reduction) => O_3; + huberLoss: , O_4 extends Tensor>(labels: TensorLike | T_4, predictions: TensorLike | T_4, weights?: TensorLike | Tensor, delta?: number, reduction?: Reduction) => O_4; + logLoss: , O_5 extends Tensor>(labels: TensorLike | T_5, predictions: TensorLike | T_5, weights?: TensorLike | Tensor, epsilon?: number, reduction?: Reduction) => O_5; + meanSquaredError: , O_6 extends Tensor>(labels: TensorLike | T_6, predictions: TensorLike | T_6, weights?: TensorLike | Tensor, reduction?: Reduction) => O_6; + sigmoidCrossEntropy: , O_7 extends Tensor>(multiClassLabels: TensorLike | T_7, logits: TensorLike | T_7, weights?: TensorLike | Tensor, labelSmoothing?: number, reduction?: Reduction) => O_7; + softmaxCrossEntropy: , O_8 extends Tensor>(onehotLabels: TensorLike | T_8, logits: TensorLike | T_8, weights?: TensorLike | Tensor, labelSmoothing?: number, reduction?: Reduction) => O_8; +}; + +export declare const LowerBound = "LowerBound"; + +/** + * Searches for where a value would go in a sorted sequence. + * + * This is not a method for checking containment (like javascript in). + * + * The typical use case for this operation is "binning", "bucketing", or + * "discretizing". The values are assigned to bucket-indices based on the edges + * listed in 'sortedSequence'. This operation returns the bucket-index for each + * value. + * + * The index returned corresponds to the first edge greater than or equal to the + * value. + * + * The axis is not settable for this operation. It always operates on the + * innermost dimension (axis=-1). The operation will accept any number of outer + * dimensions. + * + * Note: This operation assumes that 'lowerBound' is sorted along the + * innermost axis, maybe using 'sort(..., axis=-1)'. If the sequence is not + * sorted no error is raised and the content of the returned tensor is not well + * defined. + * + * ```js + * const edges = tf.tensor1d([-1, 3.3, 9.1, 10.0]); + * let values = tf.tensor1d([0.0, 4.1, 12.0]); + * const result1 = tf.lowerBound(edges, values); + * result1.print(); // [1, 2, 4] + * + * const seq = tf.tensor1d([0, 3, 9, 10, 10]); + * values = tf.tensor1d([0, 4, 10]); + * const result2 = tf.lowerBound(seq, values); + * result2.print(); // [0, 2, 3] + * + * const sortedSequence = tf.tensor2d([[0., 3., 8., 9., 10.], + * [1., 2., 3., 4., 5.]]); + * values = tf.tensor2d([[9.8, 2.1, 4.3], + * [0.1, 6.6, 4.5, ]]); + * const result3 = tf.lowerBound(sortedSequence, values); + * result3.print(); // [[4, 1, 2], [0, 5, 4]] + * ``` + * @param sortedSequence: N-D. Sorted sequence. + * @param values: N-D. Search values. + * @return An N-D int32 tensor the size of values containing the result of + * applying lower bound to each value. The result is not a global index to + * the entire Tensor, but the index in the last dimension. + * @doc {heading: 'Operations', subheading: 'Evaluation'} + */ +export declare function lowerBound(sortedSequence: Tensor | TensorLike, values: Tensor | TensorLike): Tensor; + +export declare type LowerBoundInputs = Pick; + +export declare const LRN = "LRN"; + +export declare interface LRNAttrs { + depthRadius: number; + bias: number; + alpha: number; + beta: number; +} + +export declare const LRNGrad = "LRNGrad"; + +export declare interface LRNGradAttrs { + depthRadius: number; + bias: number; + alpha: number; + beta: number; +} + +export declare type LRNGradInputs = Pick; + +export declare type LRNInputs = Pick; + +/** + * @docalias (data: Tensor2D, c: Tensor2D, h: Tensor2D): [Tensor2D, Tensor2D] + */ +export declare type LSTMCellFunc = { + (data: Tensor2D, c: Tensor2D, h: Tensor2D): [Tensor2D, Tensor2D]; +}; + +declare function makeOnesTypedArray(size: number, dtype: D): DataTypeMap[D]; + +declare function makeTypesMatch(a: T, b: T): [T, T]; + +/** + * Make nested `TypedArray` filled with zeros. + * @param shape The shape information for the nested array. + * @param dtype dtype of the array element. + */ +declare function makeZerosNestedTypedArray(shape: number[], dtype: D): number | any[]; + +declare function makeZerosTypedArray(size: number, dtype: D): DataTypeMap[D]; + +/** Converts a binary mask to an array of axes. Used in stridedSlice(). */ +declare function maskToAxes(mask: number): number[]; + +declare namespace math { + export { + confusionMatrix + } +} +export { math } + +export declare const matMul: typeof matMul_; + +/** + * Computes the dot product of two matrices, A * B. These must be matrices. + * + * ```js + * const a = tf.tensor2d([1, 2], [1, 2]); + * const b = tf.tensor2d([1, 2, 3, 4], [2, 2]); + * + * a.matMul(b).print(); // or tf.matMul(a, b) + * ``` + * @param a First matrix in dot product operation. + * @param b Second matrix in dot product operation. + * @param transposeA If true, `a` is transposed before multiplication. + * @param transposeB If true, `b` is transposed before multiplication. + * + * @doc {heading: 'Operations', subheading: 'Matrices'} + */ +declare function matMul_(a: Tensor | TensorLike, b: Tensor | TensorLike, transposeA?: boolean, transposeB?: boolean): T; + +declare const matMul_2: typeof fusedMatMul_; + +export declare const Max = "Max"; + +export declare const max: typeof max_; + +/** + * Computes the maximum of elements across dimensions of a `tf.Tensor`. + * + * Reduces the input along the dimensions given in `axes`. Unless `keepDims` + * is true, the rank of the `tf.Tensor` is reduced by 1 for each entry in + * `axes`. If `keepDims` is true, the reduced dimensions are retained with + * length 1. If `axes` has no entries, all dimensions are reduced, and a + * `tf.Tensor` with a single element is returned. + * + * ```js + * const x = tf.tensor1d([1, 2, 3]); + * + * x.max().print(); // or tf.max(x) + * ``` + * + * ```js + * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]); + * + * const axis = 1; + * x.max(axis).print(); // or tf.max(x, axis) + * ``` + * + * @param x The input tensor. + * @param axis The dimension(s) to reduce. By default it reduces + * all dimensions. + * @param keepDims If true, retains reduced dimensions with size 1. + * + * @doc {heading: 'Operations', subheading: 'Reduction'} + */ +declare function max_(x: Tensor | TensorLike, axis?: number | number[], keepDims?: boolean): T; + +export declare interface MaxAttrs { + reductionIndices: number | number[]; + keepDims: boolean; +} + +export declare const Maximum = "Maximum"; + +export declare const maximum: typeof maximum_; + +/** + * Returns the max of a and b (`a > b ? a : b`) element-wise. + * Supports broadcasting. + * + * We also expose `tf.maximumStrict` which has the same signature as this op and + * asserts that `a` and `b` are the same shape (does not broadcast). + * + * ```js + * const a = tf.tensor1d([1, 4, 3, 16]); + * const b = tf.tensor1d([1, 2, 9, 4]); + * + * a.maximum(b).print(); // or tf.maximum(a, b) + * ``` + * + * ```js + * // Broadcast maximum a with b. + * const a = tf.tensor1d([2, 4, 6, 8]); + * const b = tf.scalar(5); + * + * a.maximum(b).print(); // or tf.maximum(a, b) + * ``` + * + * @param a The first tensor. + * @param b The second tensor. Must have the same type as `a`. + * + * @doc {heading: 'Operations', subheading: 'Arithmetic'} + */ +declare function maximum_(a: Tensor | TensorLike, b: Tensor | TensorLike): T; + +export declare type MaximumInputs = BinaryInputs; + +export declare type MaxInputs = Pick; + +export declare const MaxPool = "MaxPool"; + +export declare const maxPool: typeof maxPool_; + +export declare const MaxPool3D = "MaxPool3D"; + +export declare const maxPool3d: typeof maxPool3d_; + +/** + * Computes the 3D max pooling. + * + * ```js + * const x = tf.tensor5d([1, 2, 3, 4, 5, 6, 7, 8], [1, 2, 2, 2, 1]); + * const result = tf.maxPool3d(x, 2, 1, 'valid'); + * result.print(); + * ``` + * + * @param x The input tensor, of rank 5 or rank 4 of shape + * `[batch, depth, height, width, inChannels]`. + * @param filterSize The filter size: + * `[filterDepth, filterHeight, filterWidth]`. + * If `filterSize` is a single number, + * then `filterDepth == filterHeight == filterWidth`. + * @param strides The strides of the pooling: + * `[strideDepth, strideHeight, strideWidth]`. + * If `strides` is a single number, + * then `strideDepth == strideHeight == strideWidth`. + * @param pad The type of padding algorithm. + * - `same` and stride 1: output will be of same size as input, + * regardless of filter size. + * - `valid`: output will be smaller than input if filter is larger + * than 1*1x1. + * - For more info, see this guide: + * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution]( + * https://www.tensorflow.org/api_docs/python/tf/nn/convolution) + * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is + * provided, it will default to truncate. + * @param dataFormat An optional string from: "NDHWC", "NCDHW". Defaults to + * "NDHWC". Specify the data format of the input and output data. With the + * default format "NDHWC", the data is stored in the order of: [batch, + * depth, height, width, channels]. Only "NDHWC" is currently supported. + * @doc {heading: 'Operations', subheading: 'Convolution'} + */ +declare function maxPool3d_(x: T | TensorLike, filterSize: [number, number, number] | number, strides: [number, number, number] | number, pad: 'valid' | 'same' | number, dimRoundingMode?: 'floor' | 'round' | 'ceil', dataFormat?: 'NDHWC' | 'NCDHW'): T; + +export declare interface MaxPool3DAttrs { + filterSize: [number, number, number] | number; + strides: [number, number, number] | number; + pad: 'valid' | 'same' | number; + dataFormat: 'NDHWC' | 'NCDHW'; + dimRoundingMode?: 'floor' | 'round' | 'ceil'; +} + +export declare const MaxPool3DGrad = "MaxPool3DGrad"; + +export declare interface MaxPool3DGradAttrs { + filterSize: [number, number, number] | number; + strides: [number, number, number] | number; + pad: 'valid' | 'same' | number; + dimRoundingMode?: 'floor' | 'round' | 'ceil'; +} + +export declare type MaxPool3DGradInputs = Pick; + +export declare type MaxPool3DInputs = Pick; + +/** + * Computes the 2D max pooling of an image. + * + * @param x The input tensor, of rank 4 or rank 3 of shape + * `[batch, height, width, inChannels]`. If rank 3, batch of 1 is assumed. + * @param filterSize The filter size: `[filterHeight, filterWidth]`. If + * `filterSize` is a single number, then `filterHeight == filterWidth`. + * @param strides The strides of the pooling: `[strideHeight, strideWidth]`. If + * `strides` is a single number, then `strideHeight == strideWidth`. + * @param dilations The dilation rates: `[dilationHeight, dilationWidth]` + * in which we sample input values across the height and width dimensions + * in dilated pooling. Defaults to `[1, 1]`. If `dilations` is a single + * number, then `dilationHeight == dilationWidth`. If it is greater than + * 1, then all values of `strides` must be 1. + * @param pad The type of padding algorithm. + * - `same` and stride 1: output will be of same size as input, + * regardless of filter size. + * - `valid`: output will be smaller than input if filter is larger + * than 1x1. + * - For more info, see this guide: + * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution]( + * https://www.tensorflow.org/api_docs/python/tf/nn/convolution) + * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is + * provided, it will default to truncate. + */ +declare function maxPool_(x: T | TensorLike, filterSize: [number, number] | number, strides: [number, number] | number, pad: 'valid' | 'same' | number | conv_util.ExplicitPadding, dimRoundingMode?: 'floor' | 'round' | 'ceil'): T; + +export declare interface MaxPoolAttrs { + filterSize: [number, number] | number; + strides: [number, number] | number; + pad: 'valid' | 'same' | number | ExplicitPadding; + dimRoundingMode?: 'floor' | 'round' | 'ceil'; +} + +export declare const MaxPoolGrad = "MaxPoolGrad"; + +export declare interface MaxPoolGradAttrs { + filterSize: [number, number] | number; + strides: [number, number] | number; + pad: 'valid' | 'same' | number | ExplicitPadding; + dimRoundingMode?: 'floor' | 'round' | 'ceil'; +} + +export declare type MaxPoolGradInputs = Pick; + +export declare type MaxPoolInputs = Pick; + +export declare const MaxPoolWithArgmax = "MaxPoolWithArgmax"; + +export declare const maxPoolWithArgmax: typeof maxPoolWithArgmax_; + +/** + * Computes the 2D max pooling of an image with Argmax index. + * The indices in argmax are flattened, so that a maximum value at position `[b, + * y, x, c]` becomes flattened index: `(y * width + x) * channels + c` if + * include_batch_in_index is False; `((b * height + y) * width + x) * channels + * +c` if include_batch_in_index is True. + * + * The indices returned are always in `[0, height) x [0, width)` before + * flattening. + * + * @param x The input tensor, of rank 4 or rank 3 of shape + * `[batch, height, width, inChannels]`. If rank 3, batch of 1 is assumed. + * @param filterSize The filter size: `[filterHeight, filterWidth]`. If + * `filterSize` is a single number, then `filterHeight == filterWidth`. + * @param strides The strides of the pooling: `[strideHeight, strideWidth]`. If + * `strides` is a single number, then `strideHeight == strideWidth`. + * @param dataFormat An optional string from: "NDHWC", "NCDHW". Defaults to + * "NDHWC". Specify the data format of the input and output data. With the + * default format "NDHWC", the data is stored in the order of: [batch, + * depth, height, width, channels]. Only "NDHWC" is currently supported. + * @param pad The type of padding algorithm. + * - `same` and stride 1: output will be of same size as input, + * regardless of filter size. + * - `valid`: output will be smaller than input if filter is larger + * than 1x1. + * - For more info, see this guide: + * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution]( + * https://www.tensorflow.org/api_docs/python/tf/nn/convolution) + * @param includeBatchIndex Defaults to False. Whether to include batch + * dimension in flattened index of argmax. + * + * @doc {heading: 'Operations', subheading: 'Convolution'} + */ +declare function maxPoolWithArgmax_(x: T | TensorLike, filterSize: [number, number] | number, strides: [number, number] | number, pad: 'valid' | 'same' | number, includeBatchInIndex?: boolean): NamedTensorMap; + +export declare interface MaxPoolWithArgmaxAttrs { + filterSize: [number, number] | number; + strides: [number, number] | number; + pad: 'valid' | 'same' | number; + includeBatchInIndex: boolean; +} + +export declare type MaxPoolWithArgmaxInputs = Pick; + +export declare const Mean = "Mean"; + +export declare const mean: typeof mean_; + +/** + * Computes the mean of elements across dimensions of a `tf.Tensor`. + * + * Reduces `x` along the dimensions given in `axis`. Unless `keepDims` is + * true, the rank of the `tf.Tensor` is reduced by 1 for each entry in `axis`. + * If `keepDims` is true, the reduced dimensions are retained with length 1. + * If `axis` has no entries, all dimensions are reduced, and a `tf.Tensor` with + * a single element is returned. + * + * ```js + * const x = tf.tensor1d([1, 2, 3]); + * + * x.mean().print(); // or tf.mean(a) + * ``` + * + * ```js + * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]); + * + * const axis = 1; + * x.mean(axis).print(); // or tf.mean(x, axis) + * ``` + * + * @param x The input tensor. + * @param axis The dimension(s) to reduce. By default it reduces + * all dimensions. + * @param keepDims If true, retains reduced dimensions with size 1. + * + * @doc {heading: 'Operations', subheading: 'Reduction'} + */ +declare function mean_(x: Tensor | TensorLike, axis?: number | number[], keepDims?: boolean): T; + +export declare interface MeanAttrs { + axis: number | number[]; + keepDims: boolean; +} + +export declare type MeanInputs = Pick; + +/** + * Returns memory info at the current time in the program. The result is an + * object with the following properties: + * + * - `numBytes`: Number of bytes allocated (undisposed) at this time. + * - `numTensors`: Number of unique tensors allocated. + * - `numDataBuffers`: Number of unique data buffers allocated + * (undisposed) at this time, which is ≤ the number of tensors + * (e.g. `a.reshape(newShape)` makes a new Tensor that shares the same + * data buffer with `a`). + * - `unreliable`: True if the memory usage is unreliable. See `reasons` when + * `unreliable` is true. + * - `reasons`: `string[]`, reasons why the memory is unreliable, present if + * `unreliable` is true. + * + * WebGL Properties: + * - `numBytesInGPU`: Number of bytes allocated (undisposed) in the GPU only at + * this time. + * + * @doc {heading: 'Performance', subheading: 'Memory'} + */ +export declare function memory(): MemoryInfo; + +export declare type MemoryInfo = { + numTensors: number; + numDataBuffers: number; + numBytes: number; + unreliable?: boolean; + reasons: string[]; +}; + +/** + * Merges real and imaginary Float32Arrays into a single complex Float32Array. + * + * The memory layout is interleaved as follows: + * real: [r0, r1, r2] + * imag: [i0, i1, i2] + * complex: [r0, i0, r1, i1, r2, i2] + * + * This is the inverse of splitRealAndImagArrays. + * + * @param real The real values of the complex tensor values. + * @param imag The imag values of the complex tensor values. + * @returns A complex tensor as a Float32Array with merged values. + */ +declare function mergeRealAndImagArrays(real: Float32Array, imag: Float32Array): Float32Array; + +/** + * Broadcasts parameters for evaluation on an N-D grid. + * + * Given N one-dimensional coordinate arrays `*args`, returns a list `outputs` + * of N-D coordinate arrays for evaluating expressions on an N-D grid. + * + * Notes: + * `meshgrid` supports cartesian ('xy') and matrix ('ij') indexing conventions. + * When the `indexing` argument is set to 'xy' (the default), the broadcasting + * instructions for the first two dimensions are swapped. + * Examples: + * Calling `const [X, Y] = meshgrid(x, y)` with the tensors + * + * ```javascript + * const x = [1, 2, 3]; + * const y = [4, 5, 6]; + * const [X, Y] = tf.meshgrid(x, y); + * // X = [[1, 2, 3], + * // [1, 2, 3], + * // [1, 2, 3]] + * // Y = [[4, 4, 4], + * // [5, 5, 5], + * // [6, 6, 6]] + * ``` + * + * @param x Tensor with rank geq 1. + * @param y Tensor with rank geq 1. + * @param indexing + * + * @doc {heading: 'Operations', subheading: 'Slicing and Joining'} + */ +export declare function meshgrid(x?: T | TensorLike, y?: T | TensorLike, { indexing }?: { + indexing?: string; +}): T[]; + +/** + * Interface for SavedModel/GraphModel MetaGraph info. + */ +export declare interface MetaGraph { + tags: string[]; + signatureDefs: SignatureDef; +} + +/** + * @deprecated Deprecated interface for SavedModel/GraphModel MetaGraph info. + * User MetaGraph instead. + */ +export declare interface MetaGraphInfo { + tags: string[]; + signatureDefs: SignatureDefInfo; +} + +export declare const Min = "Min"; + +export declare const min: typeof min_; + +/** + * Computes the minimum value from the input. + * + * Reduces the input along the dimensions given in `axes`. Unless `keepDims` + * is true, the rank of the array is reduced by 1 for each entry in `axes`. + * If `keepDims` is true, the reduced dimensions are retained with length 1. + * If `axes` has no entries, all dimensions are reduced, and an array with a + * single element is returned. + * + * ```js + * const x = tf.tensor1d([1, 2, 3]); + * + * x.min().print(); // or tf.min(x) + * ``` + * + * ```js + * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]); + * + * const axis = 1; + * x.min(axis).print(); // or tf.min(x, axis) + * ``` + * + * @param x The input Tensor. + * @param axis The dimension(s) to reduce. By default it reduces + * all dimensions. + * @param keepDims If true, retains reduced dimensions with size 1. + * + * @doc {heading: 'Operations', subheading: 'Reduction'} + */ +declare function min_(x: Tensor | TensorLike, axis?: number | number[], keepDims?: boolean): T; + +export declare interface MinAttrs { + axis: number | number[]; + keepDims: boolean; +} + +export declare const Minimum = "Minimum"; + +export declare const minimum: typeof minimum_; + +/** + * Returns the min of a and b (`a < b ? a : b`) element-wise. + * Supports broadcasting. + * + * We also expose `minimumStrict` which has the same signature as this op and + * asserts that `a` and `b` are the same shape (does not broadcast). + * + * ```js + * const a = tf.tensor1d([1, 4, 3, 16]); + * const b = tf.tensor1d([1, 2, 9, 4]); + * + * a.minimum(b).print(); // or tf.minimum(a, b) + * ``` + * + * ```js + * // Broadcast minimum a with b. + * const a = tf.tensor1d([2, 4, 6, 8]); + * const b = tf.scalar(5); + * + * a.minimum(b).print(); // or tf.minimum(a, b) + * ``` + * + * @param a The first tensor. + * @param b The second tensor. Must have the same type as `a`. + * + * @doc {heading: 'Operations', subheading: 'Arithmetic'} + */ +declare function minimum_(a: Tensor | TensorLike, b: Tensor | TensorLike): T; + +export declare type MinimumInputs = BinaryInputs; + +export declare type MinInputs = Pick; + +export declare const MirrorPad = "MirrorPad"; + +export declare const mirrorPad: typeof mirrorPad_; + +/** + * Pads a `tf.Tensor` using mirror padding. + * + * This operation implements the `REFLECT` and `SYMMETRIC` modes of pad. + * + * ```js + * const x = tf.range(0, 9).reshape([1, 1, 3, 3]); + * x.mirrorPad([[0, 0], [0, 0], [2, 2], [2, 2]], 'reflect').print(); + * ``` + * @param x The tensor to pad. + * @param paddings An array of length `R` (the rank of the tensor), where + * each element is a length-2 tuple of ints `[padBefore, padAfter]`, + * specifying how much to pad along each dimension of the tensor. + * In "reflect" mode, the padded regions do not include the borders, + * while in "symmetric" mode the padded regions do include the borders. + * For example, if the input is `[1, 2, 3]` and paddings is `[0, 2]`, + * then the output is `[1, 2, 3, 2, 1]` in "reflect" mode, and + * `[1, 2, 3, 3, 2]` in "symmetric" mode. + * If `mode` is "reflect" then both `paddings[D, 0]` and `paddings[D, 1]` + * must be no greater than `x.shape[D] - 1`. If mode is "symmetric" + * then both `paddings[D, 0]` and `paddings[D, 1]` must be no greater than + * `x.shape[D]` + * @param mode String to specify padding mode. Can be `'reflect' | 'symmetric'` + */ +/** @doc {heading: 'Tensors', subheading: 'Transformations'} */ +declare function mirrorPad_(x: T | TensorLike, paddings: Array<[number, number]>, mode: 'reflect' | 'symmetric'): T; + +export declare interface MirrorPadAttrs { + paddings: Array<[number, number]>; + mode: 'reflect' | 'symmetric'; +} + +export declare type MirrorPadInputs = Pick; + +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +declare function mockIsMobile(value: boolean | undefined): void; + +export declare const Mod = "Mod"; + +export declare const mod: typeof mod_; + +/** + * Returns the mod of a and b element-wise. + * `floor(x / y) * y + mod(x, y) = x` + * Supports broadcasting. + * + * We also expose `tf.modStrict` which has the same signature as this op and + * asserts that `a` and `b` are the same shape (does not broadcast). + * + * ```js + * const a = tf.tensor1d([1, 4, 3, 16]); + * const b = tf.tensor1d([1, 2, 9, 4]); + * + * a.mod(b).print(); // or tf.mod(a, b) + * ``` + * + * ```js + * // Broadcast a mod b. + * const a = tf.tensor1d([2, 4, 6, 8]); + * const b = tf.scalar(5); + * + * a.mod(b).print(); // or tf.mod(a, b) + * ``` + * + * @param a The first tensor. + * @param b The second tensor. Must have the same type as `a`. + * + * @doc {heading: 'Operations', subheading: 'Arithmetic'} + */ +declare function mod_(a: Tensor | TensorLike, b: Tensor | TensorLike): T; + +/** + * The serialized artifacts of a model, including topology and weights. + * + * The `modelTopology`, `trainingConfig`, `weightSpecs` and `weightData` fields + * of this interface are optional, in order to support topology- or weights-only + * saving and loading. + * + * Note this interface is used internally in IOHandlers. For the file format + * written to disk as `model.json`, see `ModelJSON`. + */ +declare interface ModelArtifacts { + /** + * Model topology. + * + * For Keras-style `tf.Model`s, this is a JSON object. + * For TensorFlow-style models (e.g., `SavedModel`), this is the JSON + * encoding of the `GraphDef` protocol buffer. + */ + modelTopology?: {} | ArrayBuffer; + /** + * Serialized configuration for the model's training. + */ + trainingConfig?: TrainingConfig; + /** + * Weight specifications. + * + * This corresponds to the weightsData below. + */ + weightSpecs?: WeightsManifestEntry[]; + /** + * Binary buffer for all weight values concatenated in the order specified + * by `weightSpecs`. + */ + weightData?: ArrayBuffer; + /** + * Hard-coded format name for models saved from TensorFlow.js or converted + * by TensorFlow.js Converter. + */ + format?: string; + /** + * What library is responsible for originally generating this artifact. + * + * Used for debugging purposes. E.g., 'TensorFlow.js v1.0.0'. + */ + generatedBy?: string; + /** + * What library or tool is responsible for converting the original model + * to this format, applicable only if the model is output by a converter. + * + * Used for debugging purposes. E.g., 'TensorFlow.js Converter v1.0.0'. + * + * A value of `null` means the model artifacts are generated without any + * conversion process (e.g., saved directly from a TensorFlow.js + * `tf.LayersModel` instance.) + */ + convertedBy?: string | null; + /** + * Inputs and outputs signature for saved model. + */ + signature?: {}; + /** + * User-defined metadata about the model. + */ + userDefinedMetadata?: { + [key: string]: {}; + }; + /** + * Initializer for the model. + */ + modelInitializer?: {}; + /** + * Inputs and outputs signature for model initializer. + */ + initializerSignature?: {}; +} + +declare interface ModelArtifactsInfo { + /** + * Timestamp for when the model is saved. + */ + dateSaved: Date; + /** + * TODO (cais,yassogba) consider removing GraphDef as GraphDefs now + * come in a JSON format and none of our IOHandlers support a non json + * format. We could conder replacing this with 'Binary' if we want to + * allow future handlers to save to non json formats (though they will + * probably want more information than 'Binary'). + * Type of the model topology + * + * Type of the model topology + * + * Possible values: + * - JSON: JSON config (human-readable, e.g., Keras JSON). + * - GraphDef: TensorFlow + * [GraphDef](https://www.tensorflow.org/extend/tool_developers/#graphdef) + * protocol buffer (binary). + */ + modelTopologyType: 'JSON' | 'GraphDef'; + /** + * Size of model topology (Keras JSON or GraphDef), in bytes. + */ + modelTopologyBytes?: number; + /** + * Size of weight specification or manifest, in bytes. + */ + weightSpecsBytes?: number; + /** + * Size of weight value data, in bytes. + */ + weightDataBytes?: number; +} + +/** + * The on-disk format of the `model.json` file. + * + * TF.js 1.0 always populates the optional fields when writing model.json. + * Prior versions did not provide those fields. + */ +declare interface ModelJSON { + /** + * Model topology. + * + * For Keras-style `tf.Model`s, this is a JSON object. + * For TensorFlow-style models (e.g., `SavedModel`), this is the JSON + * encoding of the `GraphDef` protocol buffer. + */ + modelTopology: {}; + /** Model training configuration. */ + trainingConfig?: TrainingConfig; + /** + * Weights manifest. + * + * The weights manifest consists of an ordered list of weight-manifest + * groups. Each weight-manifest group consists of a number of weight values + * stored in a number of paths. See the documentation of + * `WeightsManifestConfig` for more details. + */ + weightsManifest: WeightsManifestConfig; + /** + * Hard-coded format name for models saved from TensorFlow.js or converted + * by TensorFlow.js Converter. + */ + format?: string; + /** + * What library is responsible for originally generating this artifact. + * + * Used for debugging purposes. E.g., 'TensorFlow.js v1.0.0'. + */ + generatedBy?: string; + /** + * What library or tool is responsible for converting the original model + * to this format, applicable only if the model is output by a converter. + * + * Used for debugging purposes. E.g., 'TensorFlow.js Converter v1.0.0'. + * + * A value of `null` means the model artifacts are generated without any + * conversion process (e.g., saved directly from a TensorFlow.js + * `tf.LayersModel` instance.) + */ + convertedBy?: string | null; + /** + * Inputs and outputs signature for saved model. + */ + signature?: {}; + /** + * User-defined metadata about the model. + */ + userDefinedMetadata?: { + [key: string]: {}; + }; + /** + * Initializer for the model. + */ + modelInitializer?: {}; + /** + * Inputs and outputs signature for model initializer. + */ + initializerSignature?: {}; +} + +export declare interface ModelPredictConfig { + /** + * Optional. Batch size (Integer). If unspecified, it will default to 32. + */ + batchSize?: number; + /** + * Optional. Verbosity mode. Defaults to false. + */ + verbose?: boolean; +} + +/** + * An interface for the manager of a model store. + * + * A model store is defined as a storage medium on which multiple models can + * be stored. Each stored model has a unique `path` as its identifier. + * A `ModelStoreManager` for the store allows actions including + * + * - Listing the models stored in the store. + * - Deleting a model from the store. + */ +declare interface ModelStoreManager { + /** + * List all models in the model store. + * + * @returns A dictionary mapping paths of existing models to their + * model artifacts info. Model artifacts info include type of the model's + * topology, byte sizes of the topology, weights, etc. + */ + listModels(): Promise<{ + [path: string]: ModelArtifactsInfo; + }>; + /** + * Remove a model specified by `path`. + * + * @param path + * @returns ModelArtifactsInfo of the deleted model (if and only if deletion + * is successful). + * @throws Error if deletion fails, e.g., if no model exists at `path`. + */ + removeModel(path: string): Promise; +} + +/** + * Interface for model input/output tensor info. + */ +export declare interface ModelTensorInfo { + name: string; + shape?: number[]; + dtype: DataType; + tfDtype?: string; +} + +export declare type ModInputs = BinaryInputs; + +export declare const moments: typeof moments_; + +/** + * Calculates the mean and variance of `x`. The mean and variance are + * calculated by aggregating the contents of `x` across `axes`. If `x` is + * 1-D and `axes = [0]` this is just the mean and variance of a vector. + * + * @param x The input tensor. + * @param axis The dimension(s) along with to compute mean and + * variance. By default it reduces all dimensions. + * @param keepDims If true, the moments have the same dimensionality as the + * input. + * @return An object with two keys: `mean` and `variance`. + * + * @doc {heading: 'Operations', subheading: 'Normalization'} + */ +declare function moments_(x: Tensor | TensorLike, axis?: number | number[], keepDims?: boolean): { + mean: Tensor; + variance: Tensor; +}; + +/** @doclink Optimizer */ +export declare class MomentumOptimizer extends SGDOptimizer { + protected learningRate: number; + private momentum; + private useNesterov; + /** @nocollapse */ + static className: string; + private m; + private accumulations; + constructor(learningRate: number, momentum: number, useNesterov?: boolean); + applyGradients(variableGradients: NamedVariableMap | NamedTensor[]): void; + dispose(): void; + /** + * Sets the momentum of the optimizer. + * + * @param momentum + */ + setMomentum(momentum: number): void; + getWeights(): Promise; + setWeights(weightValues: NamedTensor[]): Promise; + getConfig(): ConfigDict; + /** @nocollapse */ + static fromConfig(cls: SerializableConstructor, config: ConfigDict): T; +} + +/** + * Move a model from one URL to another. + * + * This function supports: + * + * 1. Moving within a storage medium, e.g., + * `tf.io.moveModel('localstorage://model-1', 'localstorage://model-2')` + * 2. Moving between two storage mediums, e.g., + * `tf.io.moveModel('localstorage://model-1', 'indexeddb://model-1')` + * + * ```js + * // First create and save a model. + * const model = tf.sequential(); + * model.add(tf.layers.dense( + * {units: 1, inputShape: [10], activation: 'sigmoid'})); + * await model.save('localstorage://demo/management/model1'); + * + * // Then list existing models. + * console.log(JSON.stringify(await tf.io.listModels())); + * + * // Move the model, from Local Storage to IndexedDB. + * await tf.io.moveModel( + * 'localstorage://demo/management/model1', + * 'indexeddb://demo/management/model1'); + * + * // List models again. + * console.log(JSON.stringify(await tf.io.listModels())); + * + * // Remove the moved model. + * await tf.io.removeModel('indexeddb://demo/management/model1'); + * ``` + * + * @param sourceURL Source URL of moving. + * @param destURL Destination URL of moving. + * @returns ModelArtifactsInfo of the copied model (if and only if copying + * is successful). + * @throws Error if moving fails, e.g., if no model exists at `sourceURL`, or + * if `oldPath` and `newPath` are identical. + * + * @doc { + * heading: 'Models', + * subheading: 'Management', + * namespace: 'io', + * ignoreCI: true + * } + */ +declare function moveModel(sourceURL: string, destURL: string): Promise; + +export declare const movingAverage: typeof movingAverage_; + +/** + * Compute the moving average of a variable. + * + * Without zeroDebias, the moving average operation is defined by: + * `v += delta` + * where + * `delta = (1 - decay) * (x - v)` + * + * With zeroDebias (default), the `delta` term is scaled to debias the + * effect of the (assumed) zero-initialization of `v`. + * `delta /= (1 - decay ^ step)` + * + * For more details on the zero-debiasing algorithm, see: + * https://arxiv.org/abs/1412.6980 + * + * Note that this function is completely stateless and does not keep track of + * step count. The step count needs to be maintained by the caller and passed + * in as `step`. + * + * @param v The current moving average value. + * @param x New input value, must have the same shape and dtype as `v`. + * @param decay The decay factor. Typical values are 0.95 and 0.99. + * @param step Step count. + * @param zeroDebias: Whether zeroDebias is to be performed (default: `true`). + * @returns The new moving average value. + * + * @doc {heading: 'Operations', subheading: 'Moving Average'} + */ +declare function movingAverage_(v: T | TensorLike, x: T | TensorLike, decay: number | Scalar, step?: number | Scalar, zeroDebias?: boolean): T; + +export declare const mul: typeof mul_; + +/** + * Multiplies two `tf.Tensor`s element-wise, A * B. Supports broadcasting. + * + * We also expose `tf.mulStrict` which has the same signature as this op and + * asserts that `a` and `b` are the same shape (does not broadcast). + * + * ```js + * const a = tf.tensor1d([1, 2, 3, 4]); + * const b = tf.tensor1d([2, 3, 4, 5]); + * + * a.mul(b).print(); // or tf.mul(a, b) + * ``` + * + * ```js + * // Broadcast mul a with b. + * const a = tf.tensor1d([1, 2, 3, 4]); + * const b = tf.scalar(5); + * + * a.mul(b).print(); // or tf.mul(a, b) + * ``` + * @param a The first tensor to multiply. + * @param b The second tensor to multiply. Must have the same dtype as `a`. + * + * @doc {heading: 'Operations', subheading: 'Arithmetic'} + */ +declare function mul_(a: Tensor | TensorLike, b: Tensor | TensorLike): T; + +export declare const Multinomial = "Multinomial"; + +export declare const multinomial: typeof multinomial_; + +/** + * Creates a `tf.Tensor` with values drawn from a multinomial distribution. + * + * ```js + * const probs = tf.tensor([.75, .25]); + * tf.multinomial(probs, 3).print(); + * ``` + * + * @param logits 1D array with unnormalized log-probabilities, or + * 2D array of shape `[batchSize, numOutcomes]`. See the `normalized` + * parameter. + * @param numSamples Number of samples to draw for each row slice. + * @param seed The seed number. + * @param normalized Whether the provided `logits` are normalized true + * probabilities (sum to 1). Defaults to false. + * @return 1D array of shape `[numSamples]`, or 2D array of shape + * `[batchSize, numSamples]`, depending on the rank of the input. + * + * @doc {heading: 'Tensors', subheading: 'Random'} + */ +declare function multinomial_(logits: Tensor1D | Tensor2D | TensorLike, numSamples: number, seed?: number, normalized?: boolean): Tensor1D | Tensor2D; + +export declare interface MultinomialAttrs { + numSamples: number; + seed: number; + normalized: boolean; +} + +export declare type MultinomialInputs = Pick; + +export declare const Multiply = "Multiply"; + +export declare type MultiplyInputs = BinaryInputs; + +export declare const multiRNNCell: typeof multiRNNCell_; + +/** + * Computes the next states and outputs of a stack of LSTMCells. + * + * Each cell output is used as input to the next cell. + * + * Returns `[cellState, cellOutput]`. + * + * Derived from tf.contrib.rn.MultiRNNCell. + * + * @param lstmCells Array of LSTMCell functions. + * @param data The input to the cell. + * @param c Array of previous cell states. + * @param h Array of previous cell outputs. + * + * @doc {heading: 'Operations', subheading: 'RNN'} + */ +declare function multiRNNCell_(lstmCells: LSTMCellFunc[], data: Tensor2D | TensorLike, c: Array, h: Array): [Tensor2D[], Tensor2D[]]; + +export declare interface NamedAttrMap { + [name: string]: Attribute; +} + +declare type NamedGradientMap = { + [inputName: string]: () => Tensor; +}; + +declare interface NamedTensor { + name: string; + tensor: Tensor; +} + +export declare interface NamedTensorInfoMap { + [name: string]: TensorInfo | undefined; +} + +/** @docalias {[name: string]: Tensor} */ +export declare type NamedTensorMap = { + [name: string]: Tensor; +}; + +declare type NamedVariableMap = { + [name: string]: Variable; +}; + +declare function nearestDivisor(size: number, start: number): number; + +declare function nearestLargerEven(val: number): number; + +export declare const Neg = "Neg"; + +export declare const neg: typeof neg_; + +/** + * Computes `-1 * x` element-wise. + * + * ```js + * const x = tf.tensor2d([1, 2, -2, 0], [2, 2]); + * + * x.neg().print(); // or tf.neg(x) + * ``` + * + * @param x The input tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function neg_(x: T | TensorLike): T; + +export declare type NegInputs = UnaryInputs; + +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/** + * Returns a promise that resolves when a requestAnimationFrame has completed. + * + * On Node.js this uses setImmediate instead of requestAnimationFrame. + * + * This is simply a sugar method so that users can do the following: + * `await tf.nextFrame();` + * + * @doc {heading: 'Performance', subheading: 'Timing'} + */ +export declare function nextFrame(): Promise; + +declare interface NonMaxSuppressionResult { + selectedIndices: number[]; + selectedScores?: number[]; + validOutputs?: number; +} + +export declare const NonMaxSuppressionV3 = "NonMaxSuppressionV3"; + +export declare interface NonMaxSuppressionV3Attrs { + maxOutputSize: number; + iouThreshold: number; + scoreThreshold: number; +} + +declare function nonMaxSuppressionV3Impl(boxes: TypedArray, scores: TypedArray, maxOutputSize: number, iouThreshold: number, scoreThreshold: number): NonMaxSuppressionResult; + +export declare type NonMaxSuppressionV3Inputs = Pick; + +export declare const NonMaxSuppressionV4 = "NonMaxSuppressionV4"; + +export declare interface NonMaxSuppressionV4Attrs { + maxOutputSize: number; + iouThreshold: number; + scoreThreshold: number; + padToMaxOutputSize: boolean; +} + +declare function nonMaxSuppressionV4Impl(boxes: TypedArray, scores: TypedArray, maxOutputSize: number, iouThreshold: number, scoreThreshold: number, padToMaxOutputSize: boolean): NonMaxSuppressionResult; + +export declare type NonMaxSuppressionV4Inputs = Pick; + +export declare const NonMaxSuppressionV5 = "NonMaxSuppressionV5"; + +export declare interface NonMaxSuppressionV5Attrs { + maxOutputSize: number; + iouThreshold: number; + scoreThreshold: number; + softNmsSigma: number; +} + +declare function nonMaxSuppressionV5Impl(boxes: TypedArray, scores: TypedArray, maxOutputSize: number, iouThreshold: number, scoreThreshold: number, softNmsSigma: number): NonMaxSuppressionResult; + +export declare type NonMaxSuppressionV5Inputs = Pick; + +export declare const norm: typeof norm_; + +/** + * Computes the norm of scalar, vectors, and matrices. + * This function can compute several different vector norms (the 1-norm, the + * Euclidean or 2-norm, the inf-norm, and in general the p-norm for p > 0) + * and matrix norms (Frobenius, 1-norm, and inf-norm). + * + * ```js + * const x = tf.tensor1d([1, 2, 3, 4]); + * + * x.norm().print(); // or tf.norm(x) + * ``` + * + * @param x The input array. + * @param ord Optional. Order of the norm. Supported norm types are + * following: + * + * | ord | norm for matrices | norm for vectors + * |------------|---------------------------|--------------------- + * |'euclidean' |Frobenius norm |2-norm + * |'fro' |Frobenius norm | + * |Infinity |max(sum(abs(x), axis=1)) |max(abs(x)) + * |-Infinity |min(sum(abs(x), axis=1)) |min(abs(x)) + * |1 |max(sum(abs(x), axis=0)) |sum(abs(x)) + * |2 | |sum(abs(x)^2)^(1/2) + * + * @param axis Optional. If axis is null (the default), the input is + * considered a vector and a single vector norm is computed over the entire + * set of values in the Tensor, i.e. norm(x, ord) is equivalent + * to norm(x.reshape([-1]), ord). If axis is an integer, the input + * is considered a batch of vectors, and axis determines the axis in x + * over which to compute vector norms. If axis is a 2-tuple of integer it is + * considered a batch of matrices and axis determines the axes in NDArray + * over which to compute a matrix norm. + * @param keepDims Optional. If true, the norm has the same dimensionality + * as the input. + * + * @doc {heading: 'Operations', subheading: 'Matrices'} + */ +declare function norm_(x: Tensor | TensorLike, ord?: number | 'euclidean' | 'fro', axis?: number | number[], keepDims?: boolean): Tensor; + +export declare const NotEqual = "NotEqual"; + +export declare const notEqual: typeof notEqual_; + +/** + * Returns the truth value of (a != b) element-wise. Supports broadcasting. + * + * ```js + * const a = tf.tensor1d([1, 2, 3]); + * const b = tf.tensor1d([0, 2, 3]); + * + * a.notEqual(b).print(); + * ``` + * @param a The first input tensor. + * @param b The second input tensor. Must have the same dtype as `a`. + * + * @doc {heading: 'Operations', subheading: 'Logical'} + */ +declare function notEqual_(a: Tensor | TensorLike, b: Tensor | TensorLike): T; + +export declare type NotEqualInputs = BinaryInputs; + +/** + * Returns the current high-resolution time in milliseconds relative to an + * arbitrary time in the past. It works across different platforms (node.js, + * browsers). + * + * ```js + * console.log(tf.util.now()); + * ``` + * + * @doc {heading: 'Util', namespace: 'util'} + */ +declare function now(): number; + +export declare type NumericDataType = 'float32' | 'int32' | 'bool' | 'complex64'; + +export declare const OneHot = "OneHot"; + +export declare const oneHot: typeof oneHot_; + +/** + * Creates a one-hot `tf.Tensor`. The locations represented by `indices` take + * value `onValue` (defaults to 1), while all other locations take value + * `offValue` (defaults to 0). If `indices` is rank `R`, the output has rank + * `R+1` with the last axis of size `depth`. + * `indices` used to encode prediction class must start from 0. For example, + * if you have 3 classes of data, class 1 should be encoded as 0, class 2 + * should be 1, and class 3 should be 2. + * + * ```js + * tf.oneHot(tf.tensor1d([0, 1], 'int32'), 3).print(); + * ``` + * + * @param indices `tf.Tensor` of indices with dtype `int32`. Indices must + * start from 0. + * @param depth The depth of the one hot dimension. + * @param onValue A number used to fill in the output when the index matches + * the location. + * @param offValue A number used to fill in the output when the index does + * not match the location. + * @param dtype The dtype of the output tensor, default to 'int32'. + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ +declare function oneHot_(indices: Tensor | TensorLike, depth: number, onValue?: number, offValue?: number, dtype?: DataType): Tensor; + +export declare interface OneHotAttrs { + depth: number; + onValue: number; + offValue: number; + dtype: DataType; +} + +export declare type OneHotInputs = Pick; + +/** + * Creates a `tf.Tensor` with all elements set to 1. + * + * ```js + * tf.ones([2, 2]).print(); + * ``` + * + * @param shape An array of integers defining the output tensor shape. + * @param dtype The type of an element in the resulting tensor. Defaults to + * 'float'. + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ +export declare function ones(shape: ShapeMap[R], dtype?: DataType): Tensor; + +export declare const OnesLike = "OnesLike"; + +export declare const onesLike: typeof onesLike_; + +/** + * Creates a `tf.Tensor` with all elements set to 1 with the same shape as the + * given tensor. + * + * ```js + * const x = tf.tensor([1, 2]); + * tf.onesLike(x).print(); + * ``` + * @param x A tensor. + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ +declare function onesLike_(x: T | TensorLike): T; + +export declare type OnesLikeInputs = UnaryInputs; + +/** + * Callback for the progress of a long-running action such as an HTTP + * request for a large binary object. + * + * `fraction` should be a number in the [0, 1] interval, indicating how + * much of the action has completed. + */ +declare type OnProgressCallback = (fraction: number) => void; + +/** + * Used for wrapping functions that perform math operations on + * Tensors. The function will be wrapped in a named scope that cleans all + * memory usage after the function is done. + */ +export declare function op(f: { + [name: string]: T; +}): T; + +export declare const OP_SCOPE_SUFFIX = "__op"; + +/** @doc {heading: 'Training', subheading: 'Classes', namespace: 'train'} */ +export declare abstract class Optimizer extends Serializable { + protected iterations_: number; + /** + * Executes `f()` and minimizes the scalar output of `f()` by computing + * gradients of y with respect to the list of trainable variables provided by + * `varList`. If no list is provided, it defaults to all trainable variables. + * + * @param f The function to execute and whose output to minimize. + * @param returnCost Whether to return the scalar cost value produced by + * executing `f()`. + * @param varList An optional list of variables to update. If specified, only + * the trainable variables in varList will be updated by minimize. Defaults to + * all trainable variables. + * + * @doc {heading: 'Training', subheading: 'Optimizers'} + */ + minimize(f: () => Scalar, returnCost?: boolean, varList?: Variable[]): Scalar | null; + /** + * The number of iterations that this optimizer instance has been invoked for. + */ + get iterations(): number; + protected incrementIterations(): void; + /** + * Executes f() and computes the gradient of the scalar output of f() with + * respect to the list of trainable variables provided by `varList`. If no + * list is provided, it defaults to all trainable variables. + * + * @param f The function to execute and whose output to use for computing + * gradients with respect to variables. + * @param varList An optional list of variables to compute gradients with + * respect to. If specified, only the trainable variables in varList will have + * gradients computed with respect to. Defaults to all trainable variables. + * + * @doc {heading: 'Training', subheading: 'Optimizers'} + */ + computeGradients(f: () => Scalar, varList?: Variable[]): { + value: Scalar; + grads: NamedTensorMap; + }; + /** + * Updates variables by using the computed gradients. + * + * @param variableGradients A mapping of variable name to its gradient value. + * + * @doc {heading: 'Training', subheading: 'Optimizers'} + */ + abstract applyGradients(variableGradients: NamedTensorMap | NamedTensor[]): void; + /** + * Dispose the variables (if any) owned by this optimizer instance. + */ + dispose(): void; + saveIterations(): Promise; + getWeights(): Promise; + setWeights(weightValues: NamedTensor[]): Promise; + /** + * Extract the first element of the weight values and set it + * as the iterations counter variable of this instance of optimizer. + * + * @param weightValues + * @returns Weight values with the first element consumed and excluded. + */ + protected extractIterations(weightValues: NamedTensor[]): Promise; +} + +export declare class OptimizerConstructors { + /** + * Constructs a `tf.SGDOptimizer` that uses stochastic gradient descent. + * + * ```js + * // Fit a quadratic function by learning the coefficients a, b, c. + * const xs = tf.tensor1d([0, 1, 2, 3]); + * const ys = tf.tensor1d([1.1, 5.9, 16.8, 33.9]); + * + * const a = tf.scalar(Math.random()).variable(); + * const b = tf.scalar(Math.random()).variable(); + * const c = tf.scalar(Math.random()).variable(); + * + * // y = a * x^2 + b * x + c. + * const f = x => a.mul(x.square()).add(b.mul(x)).add(c); + * const loss = (pred, label) => pred.sub(label).square().mean(); + * + * const learningRate = 0.01; + * const optimizer = tf.train.sgd(learningRate); + * + * // Train the model. + * for (let i = 0; i < 10; i++) { + * optimizer.minimize(() => loss(f(xs), ys)); + * } + * + * // Make predictions. + * console.log( + * `a: ${a.dataSync()}, b: ${b.dataSync()}, c: ${c.dataSync()}`); + * const preds = f(xs).dataSync(); + * preds.forEach((pred, i) => { + * console.log(`x: ${i}, pred: ${pred}`); + * }); + * ``` + * + * @param learningRate The learning rate to use for the SGD algorithm. + * + * @doc {heading: 'Training', subheading: 'Optimizers', namespace: 'train'} + */ + static sgd(learningRate: number): SGDOptimizer; + /** + * Constructs a `tf.MomentumOptimizer` that uses momentum gradient + * descent. + * + * See + * [http://proceedings.mlr.press/v28/sutskever13.pdf]( + * http://proceedings.mlr.press/v28/sutskever13.pdf) + * + * @param learningRate The learning rate to use for the Momentum gradient + * descent algorithm. + * @param momentum The momentum to use for the momentum gradient descent + * algorithm. + * + * @doc {heading: 'Training', subheading: 'Optimizers', namespace: 'train'} + */ + static momentum(learningRate: number, momentum: number, useNesterov?: boolean): MomentumOptimizer; + /** + * Constructs a `tf.RMSPropOptimizer` that uses RMSProp gradient + * descent. This implementation uses plain momentum and is not centered + * version of RMSProp. + * + * See + * [http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf]( + * http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf) + * + * @param learningRate The learning rate to use for the RMSProp gradient + * descent algorithm. + * @param decay The discounting factor for the history/coming gradient. + * @param momentum The momentum to use for the RMSProp gradient descent + * algorithm. + * @param epsilon Small value to avoid zero denominator. + * @param centered If true, gradients are normalized by the estimated + * variance of the gradient. + * + * @doc {heading: 'Training', subheading: 'Optimizers', namespace: 'train'} + */ + static rmsprop(learningRate: number, decay?: number, momentum?: number, epsilon?: number, centered?: boolean): RMSPropOptimizer; + /** + * Constructs a `tf.AdamOptimizer` that uses the Adam algorithm. + * See [https://arxiv.org/abs/1412.6980](https://arxiv.org/abs/1412.6980) + * + * @param learningRate The learning rate to use for the Adam gradient + * descent algorithm. + * @param beta1 The exponential decay rate for the 1st moment estimates. + * @param beta2 The exponential decay rate for the 2nd moment estimates. + * @param epsilon A small constant for numerical stability. + * + * @doc {heading: 'Training', subheading: 'Optimizers', namespace: 'train'} + */ + static adam(learningRate?: number, beta1?: number, beta2?: number, epsilon?: number): AdamOptimizer; + /** + * Constructs a `tf.AdadeltaOptimizer` that uses the Adadelta algorithm. + * See [https://arxiv.org/abs/1212.5701](https://arxiv.org/abs/1212.5701) + * + * @param learningRate The learning rate to use for the Adadelta gradient + * descent algorithm. + * @param rho The learning rate decay over each update. + * @param epsilon A constant epsilon used to better condition the grad + * update. + * + * @doc {heading: 'Training', subheading: 'Optimizers', namespace: 'train'} + */ + static adadelta(learningRate?: number, rho?: number, epsilon?: number): AdadeltaOptimizer; + /** + * Constructs a `tf.AdamaxOptimizer` that uses the Adamax algorithm. + * See [https://arxiv.org/abs/1412.6980](https://arxiv.org/abs/1412.6980) + * + * @param learningRate The learning rate to use for the Adamax gradient + * descent algorithm. + * @param beta1 The exponential decay rate for the 1st moment estimates. + * @param beta2 The exponential decay rate for the 2nd moment estimates. + * @param epsilon A small constant for numerical stability. + * @param decay The learning rate decay over each update. + * + * @doc {heading: 'Training', subheading: 'Optimizers', namespace: 'train'} + */ + static adamax(learningRate?: number, beta1?: number, beta2?: number, epsilon?: number, decay?: number): AdamaxOptimizer; + /** + * Constructs a `tf.AdagradOptimizer` that uses the Adagrad algorithm. + * See + * [http://www.jmlr.org/papers/volume12/duchi11a/duchi11a.pdf]( + * http://www.jmlr.org/papers/volume12/duchi11a/duchi11a.pdf) + * or + * [http://ruder.io/optimizing-gradient-descent/index.html#adagrad]( + * http://ruder.io/optimizing-gradient-descent/index.html#adagrad) + * + * @param learningRate The learning rate to use for the Adagrad gradient + * descent algorithm. + * @param initialAccumulatorValue Starting value for the accumulators, must be + * positive. + * + * @doc {heading: 'Training', subheading: 'Optimizers', namespace: 'train'} + */ + static adagrad(learningRate: number, initialAccumulatorValue?: number): AdagradOptimizer; +} + +export declare const outerProduct: typeof outerProduct_; + +/** + * Computes the outer product of two vectors, `v1` and `v2`. + * + * ```js + * const a = tf.tensor1d([1, 2, 3]); + * const b = tf.tensor1d([3, 4, 5]); + * + * tf.outerProduct(a, b).print(); + * ``` + * @param v1 The first vector in the outer product operation. + * @param v2 The second vector in the outer product operation. + * + * @doc {heading: 'Operations', subheading: 'Matrices'} + */ +declare function outerProduct_(v1: Tensor1D | TensorLike, v2: Tensor1D | TensorLike): Tensor2D; + +export declare const Pack = "Pack"; + +export declare interface PackAttrs { + axis: number; +} + +export declare type PackInputs = TensorInfo[]; + +export declare const pad: typeof pad_; + +export declare const pad1d: typeof pad1d_; + +/** + * Pads a `tf.Tensor1D` with a given value and paddings. See `pad` for details. + */ +declare function pad1d_(x: Tensor1D | TensorLike, paddings: [number, number], constantValue?: number): Tensor1D; + +export declare const pad2d: typeof pad2d_; + +/** + * Pads a `tf.Tensor2D` with a given value and paddings. See `pad` for details. + */ +declare function pad2d_(x: Tensor2D | TensorLike, paddings: [[number, number], [number, number]], constantValue?: number): Tensor2D; + +export declare const pad3d: typeof pad3d_; + +/** + * Pads a `tf.Tensor3D` with a given value and paddings. See `pad` for details. + */ +declare function pad3d_(x: Tensor3D | TensorLike, paddings: [[number, number], [number, number], [number, number]], constantValue?: number): Tensor3D; + +export declare const pad4d: typeof pad4d_; + +/** + * Pads a `tf.Tensor4D` with a given value and paddings. See `pad` for details. + */ +declare function pad4d_(x: Tensor4D | TensorLike, paddings: [ +[ +number, +number +], +[number, number], +[number, number], +[number, number] +], constantValue?: number): Tensor4D; + +/** + * Pads a `tf.Tensor` with a given value and paddings. + * + * This operation implements `CONSTANT` mode. For `REFLECT` and `SYMMETRIC`, + * refer to `tf.mirrorPad`. + * + * Also available are stricter rank-specific methods with the same signature + * as this method that assert that `paddings` is of given length. + * - `tf.pad1d` + * - `tf.pad2d` + * - `tf.pad3d` + * - `tf.pad4d` + * + * ```js + * const x = tf.tensor1d([1, 2, 3, 4]); + * x.pad([[1, 2]]).print(); + * ``` + * @param x The tensor to pad. + * @param paddings An array of length `R` (the rank of the tensor), where + * each element is a length-2 tuple of ints `[padBefore, padAfter]`, + * specifying how much to pad along each dimension of the tensor. + * @param constantValue The pad value to use. Defaults to 0. + * + * @doc {heading: 'Tensors', subheading: 'Transformations'} + */ +declare function pad_(x: T | TensorLike, paddings: Array<[number, number]>, constantValue?: number): T; + +declare type PadInfo = { + top: number; + left: number; + right: number; + bottom: number; + type: PadType; +}; + +declare type PadInfo3D = { + top: number; + left: number; + right: number; + bottom: number; + front: number; + back: number; + type: PadType; +}; + +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +declare type PadType = 'SAME' | 'VALID' | 'NUMBER' | 'EXPLICIT'; + +export declare const PadV2 = "PadV2"; + +export declare interface PadV2Attrs { + paddings: Array<[number, number]>; + constantValue: number; +} + +export declare type PadV2Inputs = Pick; + +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +declare const PARALLELIZE_THRESHOLD = 30; + +declare function parseAxisParam(axis: number | number[], shape: number[]): number[]; + +declare function parseSliceParams(x: TensorInfo, begin: number | number[], size?: number | number[]): number[][]; + +/** Type for representing image data in Uint8Array type. */ +export declare interface PixelData { + width: number; + height: number; + data: Uint8Array; +} + +/** + * At any given time a single platform is active and represents and + * implementation of this interface. In practice, a platform is an environment + * where TensorFlow.js can be executed, e.g. the browser or Node.js. + */ +export declare interface Platform { + /** + * Makes an HTTP request. + * @param path The URL path to make a request to + * @param init The request init. See init here: + * https://developer.mozilla.org/en-US/docs/Web/API/Request/Request + */ + fetch(path: string, requestInits?: RequestInit, options?: RequestDetails): Promise; + /** + * Returns the current high-resolution time in milliseconds relative to an + * arbitrary time in the past. It works across different platforms (node.js, + * browsers). + */ + now(): number; + /** + * Encode the provided string into an array of bytes using the provided + * encoding. + */ + encode(text: string, encoding: string): Uint8Array; + /** Decode the provided bytes into a string using the provided encoding. */ + decode(bytes: Uint8Array, encoding: string): string; + setTimeoutCustom?(functionRef: Function, delay: number): void; +} + +declare function play(video: HTMLVideoElement): Promise; + +export declare const Pool = "Pool"; + +export declare const pool: typeof pool_; + +/** + * Performs an N-D pooling operation + * + * @param input The input tensor, of rank 4 or rank 3 of shape + * `[batch, height, width, inChannels]`. If rank 3, batch of 1 is assumed. + * @param windowShape The filter size: `[filterHeight, filterWidth]`. If + * `filterSize` is a single number, then `filterHeight == filterWidth`. + * @param poolingType The type of pooling, either 'max' or 'avg'. + * @param pad The type of padding algorithm: + * - `same` and stride 1: output will be of same size as input, + * regardless of filter size. + * - `valid`: output will be smaller than input if filter is larger + * than 1x1. + * - For more info, see this guide: + * [https://www.tensorflow.org/api_guides/python/nn#Convolution]( + * https://www.tensorflow.org/api_guides/python/nn#Convolution) + * @param dilations The dilation rates: `[dilationHeight, dilationWidth]` + * in which we sample input values across the height and width dimensions + * in dilated pooling. Defaults to `[1, 1]`. If `dilationRate` is a single + * number, then `dilationHeight == dilationWidth`. If it is greater than + * 1, then all values of `strides` must be 1. + * @param strides The strides of the pooling: `[strideHeight, strideWidth]`. If + * `strides` is a single number, then `strideHeight == strideWidth`. + * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is + * provided, it will default to truncate. + * + * @doc {heading: 'Operations', subheading: 'Convolution'} + */ +declare function pool_(input: T | TensorLike, windowShape: [number, number] | number, poolingType: 'avg' | 'max', pad: 'valid' | 'same' | number | conv_util.ExplicitPadding, dilations?: [number, number] | number, strides?: [number, number] | number, dimRoundingMode?: 'floor' | 'round' | 'ceil'): T; + +export declare type PoolInputs = Pick; + +export declare const Pow = "Pow"; + +export declare const pow: typeof pow_; + +/** + * Computes the power of one `tf.Tensor` to another. Supports broadcasting. + * + * Given a `tf.Tensor` x and a `tf.Tensor` y, this operation computes x^y for + * corresponding elements in x and y. The result's dtype will be the upcasted + * type of the `base` and `exp` dtypes. + * + * ```js + * const a = tf.tensor([[2, 3], [4, 5]]) + * const b = tf.tensor([[1, 2], [3, 0]]).toInt(); + * + * a.pow(b).print(); // or tf.pow(a, b) + * ``` + * + * ```js + * const a = tf.tensor([[1, 2], [3, 4]]) + * const b = tf.tensor(2).toInt(); + * + * a.pow(b).print(); // or tf.pow(a, b) + * ``` + * We also expose `powStrict` which has the same signature as this op and + * asserts that `base` and `exp` are the same shape (does not broadcast). + * + * @param base The base `tf.Tensor` to pow element-wise. + * @param exp The exponent `tf.Tensor` to pow element-wise. + * + * @doc {heading: 'Operations', subheading: 'Arithmetic'} + */ +declare function pow_(base: Tensor | TensorLike, exp: Tensor | TensorLike): T; + +export declare type PowInputs = BinaryInputs; + +export declare const Prelu = "Prelu"; + +export declare const prelu: typeof prelu_; + +/** + * Computes leaky rectified linear element-wise with parametric alphas. + * + * `x < 0 ? alpha * x : f(x) = x` + * + * ```js + * const x = tf.tensor1d([-1, 2, -3, 4]); + * const alpha = tf.scalar(0.1); + * + * x.prelu(alpha).print(); // or tf.prelu(x, alpha) + * ``` + * @param x The input tensor. + * @param alpha Scaling factor for negative values. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function prelu_(x: T | TensorLike, alpha: T | TensorLike): T; + +export declare type PreluInputs = Pick; + +/** + * Validate gather nd inputs. + * + * @param tensor The tensor contains the source values. + * @param indices The tensor contains the indices to slice the source. + * + * @returns [resultShape, numUpdates, sliceSize, strides] + */ +declare function prepareAndValidate(tensor: TensorInfo, indices: TensorInfo): [ +number[], +number, +number, +number[] +]; + +/** + * Prepare the split size array. When the input is a number, the axis is evenly + * divided among the split size. When the input contains the negative value, the + * rest of the axis is allocated toward that. + */ +declare function prepareSplitSize(x: Tensor | TensorInfo, numOrSizeSplits: number[] | number, axis?: number): number[]; + +/** + * Prints information about the `tf.Tensor` including its data. + * + * ```js + * const verbose = true; + * tf.tensor2d([1, 2, 3, 4], [2, 2]).print(verbose); + * ``` + * @param x The tensor to be printed. + * @param verbose Whether to print verbose information about the ` Tensor`, + * including dtype and size. + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ +declare function print_2(x: T, verbose?: boolean): void; +export { print_2 as print } + +export declare const Prod = "Prod"; + +export declare const prod: typeof prod_; + +/** + * Computes the product of elements across dimensions of a `tf.Tensor`. + * + * Reduces the input along the dimensions given in `axes`. Unless `keepDims` + * is true, the rank of the `tf.Tensor` is reduced by 1 for each entry in + * `axes`. If `keepDims` is true, the reduced dimensions are retained with + * length 1. If `axes` has no entries, all dimensions are reduced, and a + * `tf.Tensor` with a single element is returned. + * + * ```js + * const x = tf.tensor1d([1, 2, 3]); + * + * x.prod().print(); // or tf.prod(x) + * ``` + * + * ```js + * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]); + * + * const axis = 1; + * x.prod(axis).print(); // or tf.prod(x, axis) + * ``` + * + * @param x The input tensor to compute the product over. If the dtype is `bool` + * it will be converted to `int32` and the output dtype will be `int32`. + * @param axis The dimension(s) to reduce. By default it reduces + * all dimensions. + * @param keepDims If true, retains reduced dimensions with size 1. + * + * @doc {heading: 'Operations', subheading: 'Reduction'} + */ +declare function prod_(x: Tensor | TensorLike, axis?: number | number[], keepDims?: boolean): T; + +export declare interface ProdAttrs { + axis: number | number[]; + keepDims: boolean; +} + +export declare type ProdInputs = Pick; + +/** + * Executes the provided function `f()` and returns a promise that resolves + * with information about the function's memory use: + * - `newBytes`: the number of new bytes allocated + * - `newTensors`: the number of new tensors created + * - `peakBytes`: the peak number of bytes allocated + * - `kernels`: an array of objects for each kernel involved that reports + * their input and output shapes, number of bytes used, and number of new + * tensors created. + * - `kernelNames`: an array of unique strings with just the names of the + * kernels in the `kernels` array. + * + * ```js + * const profile = await tf.profile(() => { + * const x = tf.tensor1d([1, 2, 3]); + * let x2 = x.square(); + * x2.dispose(); + * x2 = x.square(); + * x2.dispose(); + * return x; + * }); + * + * console.log(`newBytes: ${profile.newBytes}`); + * console.log(`newTensors: ${profile.newTensors}`); + * console.log(`byte usage over all kernels: ${profile.kernels.map(k => + * k.totalBytesSnapshot)}`); + * ``` + * + * + * @doc {heading: 'Performance', subheading: 'Profile'} + */ +export declare function profile(f: () => (TensorContainer | Promise)): Promise; + +declare type ProfileInfo = { + newBytes: number; + newTensors: number; + peakBytes: number; + kernels: KernelInfo[]; + result: TensorContainer; + kernelNames: string[]; +}; + +export declare const RaggedGather = "RaggedGather"; + +export declare const raggedGather: typeof raggedGather_; + +declare function raggedGather_(paramsNestedSplits: Tensor[], paramsDenseValues: Tensor | TensorLike, indices: Tensor | TensorLike, outputRaggedRank: number): RaggedGatherMap; + +export declare interface RaggedGatherAttrs { + outputRaggedRank: number; +} + +export declare type RaggedGatherInputs = { + paramsNestedSplits: TensorInfo[]; +} & Pick; + +/** + * Gather ragged slices from params axis 0 according to indices. + * + * @param paramsNestedSplits: A list of at least 1 Tensor with type 'int32' The + * nestedRowSplits tensors that define the row-partitioning for the params + * RaggedTensor input. + * @param paramsDenseValues: A Tensor. The flatValues for the params + * RaggedTensor. + * @param indices: A Tensor. Must be one of type: int32. Indices in the + * outermost dimension of params of the values that should be gathered. + * @param outputRaggedRank: An int that is >= 0. The ragged rank of the output + * RaggedTensor. outputNestedSplits will contain this number of rowSplits + * tensors. This value should equal indices.shape.ndims + params.raggedRank + * - 1. + * @return A map with the following properties: + * - outputNestedSplits: A list of outputRaggedRank Tensor objects with the + * same type as paramsNestedSplits. + * - outputDenseValues: A Tensor. Has the same type as paramsDenseValues. + * @doc {heading: 'Operations', subheading: 'Ragged'} + */ +declare interface RaggedGatherMap { + outputNestedSplits: Tensor[]; + outputDenseValues: Tensor; +} + +export declare const RaggedRange = "RaggedRange"; + +export declare const raggedRange: typeof raggedRange_; + +/** + * Returns a RaggedTensor result composed from rtDenseValues and rtNestedSplits, + * such that result[i] = [starts[i], starts[i] + deltas[i], ..., limits[i]]). + * + * @param starts: A Tensor. Must be one of the following types: + * 'float32', 'int32'. The starts of each range. + * @param limits: A Tensor. Must have the same type as starts. The limits of + * each range. + * @param deltas: A Tensor. Must have the same type as starts. The deltas of + * each range. + * @return A map with the following properties: + * - rtNestedSplits: A Tensor of type 'int32'. + * - rtDenseValues: A Tensor. Has the same type as starts. + */ +declare function raggedRange_(starts: Tensor | TensorLike, limits: Tensor | TensorLike, deltas: Tensor | TensorLike): NamedTensorMap; + +export declare type RaggedRangeInputs = Pick; + +export declare const RaggedTensorToTensor = "RaggedTensorToTensor"; + +export declare const raggedTensorToTensor: typeof raggedTensorToTensor_; + +/** + * Create a dense tensor from a ragged tensor, possibly altering its shape. + * + * The raggedTensorToTensor op creates a dense tensor from am array of row + * partition tensors, a value vector, and default values. If the shape is + * unspecified, the minimal shape required to contain all the elements in the + * ragged tensor (the natural shape) will be used. If some dimensions are left + * unspecified, then the size of the natural shape is used in that dimension. + * + * The defaultValue will be broadcast to the output shape. After that, the + * values from the ragged tensor overwrite the default values. Note that the + * defaultValue must have less dimensions than the value. + * + * The row partition tensors are in the order of the dimensions. At present, the + * types can be: "ROW_SPLITS": the row_splits tensor from the ragged tensor. + * "VALUE_ROWIDS": the value_rowids tensor from the ragged tensor. + * "FIRST_DIM_SIZE": if value_rowids is used for the first dimension, then it + * is preceded by "FIRST_DIM_SIZE". + * ``` + * @param shape: A Tensor. Must be one of the following types: 'int32'. The + * desired shape of the output tensor. If left unspecified (empty), the + * minimal shape required to contain all the elements in the ragged tensor + * (the natural shape) will be used. If some dimensions are left + * unspecified, then the size of the natural shape is used in that + * dimension. + * + * Note that dense dimensions cannot be modified by the shape argument. + * Trying to change the size of a dense dimension will cause the op to fail. + * Examples: natural shape: [4, 5, 6] shape: -1 output shape: [4, 5, 6] + * + * natural shape: [4, 5, 6] shape: [3, -1, 2] output shape: [3, 5, 2] + * + * natural shape: [4, 5, 6] shape: [3, 7, 2] output shape: [3, 7, 2] + * @param values: A Tensor. A 1D tensor representing the values of the ragged + * tensor. + * @param defaultValue: A Tensor. Must have the same type as values. The + * defaultValue when the shape is larger than the ragged tensor. The + * defaultValue is broadcast until it is the shape of the output tensor, + * and then overwritten by values in the ragged tensor. The default value + * must be compatible with this broadcast operation, and must have fewer + * dimensions than the value tensor. + * @param rowPartitionTensors: A list of at least 1 Tensor objects with the same + * type in: 'int32'. + * @param rowPartitionTypes: A list of strings. The types of the row partition + * tensors. At present, these can be: + * "ROW_SPLITS": the row_splits tensor from the ragged tensor. + * "VALUE_ROWIDS": the value_rowids tensor from the ragged tensor. + * "FIRST_DIM_SIZE": if value_rowids is used for the first dimension, then + * it is preceeded by "FIRST_DIM_SIZE". The tensors are in the order of + * the dimensions. + * @return A Tensor. Has the same type as values. + * @doc {heading: 'Operations', subheading: 'Ragged'} + */ +declare function raggedTensorToTensor_(shape: Tensor | TensorLike, values: Tensor | TensorLike, defaultValue: Tensor | TensorLike, rowPartitionTensors: Tensor[], rowPartitionTypes: string[]): Tensor; + +export declare interface RaggedTensorToTensorAttrs { + rowPartitionTypes: string[]; +} + +export declare type RaggedTensorToTensorInputs = Pick & { + rowPartitionTensors: TensorInfo[]; +}; + +export declare const rand: typeof rand_; + +/** + * Creates a `tf.Tensor` with values sampled from a random number generator + * function defined by the user. + * + * @param shape An array of integers defining the output tensor shape. + * @param randFunction A random number generator function which is called + * for each element in the output tensor. + * @param dtype The data type of the output tensor. Defaults to 'float32'. + * + * @doc {heading: 'Tensors', subheading: 'Random'} + */ +declare function rand_(shape: ShapeMap[R], randFunction: () => number, dtype?: DataType): Tensor; + +export declare const randomGamma: typeof randomGamma_; + +/** + * Creates a `tf.Tensor` with values sampled from a gamma distribution. + * + * ```js + * tf.randomGamma([2, 2], 1).print(); + * ``` + * + * @param shape An array of integers defining the output tensor shape. + * @param alpha The shape parameter of the gamma distribution. + * @param beta The inverse scale parameter of the gamma distribution. Defaults + * to 1. + * @param dtype The data type of the output. Defaults to float32. + * @param seed The seed for the random number generator. + * + * @doc {heading: 'Tensors', subheading: 'Random'} + */ +declare function randomGamma_(shape: ShapeMap[R], alpha: number, beta?: number, dtype?: 'float32' | 'int32', seed?: number): Tensor; + +export declare const randomNormal: typeof randomNormal_; + +/** + * Creates a `tf.Tensor` with values sampled from a normal distribution. + * + * ```js + * tf.randomNormal([2, 2]).print(); + * ``` + * + * @param shape An array of integers defining the output tensor shape. + * @param mean The mean of the normal distribution. + * @param stdDev The standard deviation of the normal distribution. + * @param dtype The data type of the output. + * @param seed The seed for the random number generator. + * + * @doc {heading: 'Tensors', subheading: 'Random'} + */ +declare function randomNormal_(shape: ShapeMap[R], mean?: number, stdDev?: number, dtype?: 'float32' | 'int32', seed?: number): Tensor; + +export declare const randomStandardNormal: typeof randomStandardNormal_; + +/** + * Creates a `tf.Tensor` with values sampled from a normal distribution. + * + * The generated values will have mean 0 and standard deviation 1. + * + * ```js + * tf.randomStandardNormal([2, 2]).print(); + * ``` + * + * @param shape An array of integers defining the output tensor shape. + * @param dtype The data type of the output. + * @param seed The seed for the random number generator. + * + * @doc {heading: 'Tensors', subheading: 'Random'} + */ +declare function randomStandardNormal_(shape: ShapeMap[R], dtype?: 'float32' | 'int32', seed?: number): Tensor; + +export declare const randomUniform: typeof randomUniform_; + +/** + * Creates a `tf.Tensor` with values sampled from a uniform distribution. + * + * The generated values follow a uniform distribution in the range [minval, + * maxval). The lower bound minval is included in the range, while the upper + * bound maxval is excluded. + * + * ```js + * tf.randomUniform([2, 2]).print(); + * ``` + * + * @param shape An array of integers defining the output tensor shape. + * @param minval The lower bound on the range of random values to generate. + * Defaults to 0. + * @param maxval The upper bound on the range of random values to generate. + * Defaults to 1. + * @param dtype The data type of the output tensor. Defaults to 'float32'. + * + * @doc {heading: 'Tensors', subheading: 'Random'} + */ +declare function randomUniform_(shape: ShapeMap[R], minval?: number, maxval?: number, dtype?: DataType, seed?: number | string): Tensor; + +/** + * Returns a sample from a uniform [a, b) distribution. + * + * @param a The minimum support (inclusive). + * @param b The maximum support (exclusive). + * @return A pseudorandom number on the half-open interval [a,b). + */ +declare function randUniform(a: number, b: number): number; + +/** + * Creates a new `tf.Tensor1D` filled with the numbers in the range provided. + * + * The tensor is a half-open interval meaning it includes start, but + * excludes stop. Decrementing ranges and negative step values are also + * supported. + * + * + * ```js + * tf.range(0, 9, 2).print(); + * ``` + * + * @param start An integer start value + * @param stop An integer stop value + * @param step An integer increment (will default to 1 or -1) + * @param dtype The data type of the output tensor. Defaults to 'float32'. + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ +export declare function range(start: number, stop: number, step?: number, dtype?: 'float32' | 'int32'): Tensor1D; + +declare const Range_2 = "Range"; +export { Range_2 as Range } + +export declare interface RangeAttrs { + start: number; + stop: number; + step: number; + dtype: 'float32' | 'int32'; +} + +export declare enum Rank { + R0 = "R0", + R1 = "R1", + R2 = "R2", + R3 = "R3", + R4 = "R4", + R5 = "R5", + R6 = "R6" +} + +/** + * Returns a promise that resolves when the currently selected backend (or the + * highest priority one) has initialized. Await this promise when you are using + * a backend that has async initialization. + * + * @doc {heading: 'Backends'} + */ +export declare function ready(): Promise; + +export declare const Real = "Real"; + +export declare const real: typeof real_; + +/** + * Returns the real part of a complex (or real) tensor. + * + * Given a tensor input, this operation returns a tensor of type float that is + * the real part of each element in input considered as a complex number. + * + * If the input is real, it simply makes a clone. + * + * ```js + * const x = tf.complex([-2.25, 3.25], [4.75, 5.75]); + * tf.real(x).print(); + * ``` + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ +declare function real_(input: T | TensorLike): T; + +export declare const RealDiv = "RealDiv"; + +export declare type RealDivInputs = BinaryInputs; + +export declare type RealInputs = Pick; + +export declare const Reciprocal = "Reciprocal"; + +export declare const reciprocal: typeof reciprocal_; + +/** + * Computes reciprocal of x element-wise: `1 / x` + * + * ```js + * const x = tf.tensor1d([0, 1, 2]); + * + * x.reciprocal().print(); // or tf.reciprocal(x) + * ``` + * @param x The input tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function reciprocal_(x: T | TensorLike): T; + +export declare type ReciprocalInputs = UnaryInputs; + +export declare interface RecursiveArray { + [index: number]: T | RecursiveArray; +} + +declare interface ReduceInfo { + windowSize: number; + batchSize: number; + inSize: number; + outSize: number; +} + +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +export declare enum Reduction { + NONE = 0, + MEAN = 1, + SUM = 2, + SUM_BY_NONZERO_WEIGHTS = 3 +} + +/** + * Registers a global backend. The registration should happen when importing + * a module file (e.g. when importing `backend_webgl.ts`), and is used for + * modular builds (e.g. custom tfjs bundle with only webgl support). + * + * @param factory The backend factory function. When called, it should + * return a backend instance, or a promise of an instance. + * @param priority The priority of the backend (higher = more important). + * In case multiple backends are registered, the priority is used to find + * the best backend. Defaults to 1. + * @return False if there is already a registered backend under this name, true + * if not. + * + * @doc {heading: 'Backends'} + */ +export declare function registerBackend(name: string, factory: () => KernelBackend | Promise, priority?: number): boolean; + +/** + * Register a class with the serialization map of TensorFlow.js. + * + * This is often used for registering custom Layers, so they can be + * serialized and deserialized. + * + * Example: + * + * ```js + * class MyCustomLayer extends tf.layers.Layer { + * static className = 'MyCustomLayer'; + * + * constructor(config) { + * super(config); + * } + * } + * tf.serialization.registerClass(MyCustomLayer); + * ``` + * + * @param cls The class to be registered. It must have a public static member + * called `className` defined and the value must be a non-empty string. + * + * @doc {heading: 'Models', subheading: 'Serialization', ignoreCI: true} + */ +declare function registerClass(cls: SerializableConstructor): void; + +/** + * Registers a gradient function for a given kernel in the global registry, + * to be used during the back-propagation of that kernel. + * + * @param config An object with the following properties: + * - `kernelName` The name of the kernel that the gradient function is for. + * - `gradFunc` The function to run during back-propagation. + */ +export declare function registerGradient(config: GradConfig): void; + +/** + * Registers the function (forward pass) for the kernel in a global registry. + * + * @param config A config object with the following properties: + * - `kernelName` The official name of the kernel. + * - `backendName` The official name of the backend. + * - `kernelFunc` The function to run during the forward pass of the kernel. + * - `setupFunc` Optional. Gets called once, after the backend initializes. + * - `disposeFunc` Optional. Gets called once, right before the backend is + * disposed. + */ +export declare function registerKernel(config: KernelConfig): void; + +declare const registerLoadRouter: (loudRouter: IORouter) => void; + +declare const registerSaveRouter: (loudRouter: IORouter) => void; + +export declare const Relu = "Relu"; + +export declare const relu: typeof relu_; + +export declare const Relu6 = "Relu6"; + +export declare const relu6: typeof relu6_; + +/** + * Computes rectified linear 6 element-wise: `min(max(x, 0), 6)`. + * + * ```js + * const x = tf.tensor1d([-1, 2, -3, 8]); + * + * x.relu6().print(); // or tf.relu6(x) + * ``` + * @param x The input tensor. If the dtype is `bool`, the output dtype will be + * `int32`. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function relu6_(x: T | TensorLike): T; + +export declare type Relu6Inputs = Pick; + +/** + * Computes rectified linear element-wise: `max(x, 0)`. + * + * ```js + * const x = tf.tensor1d([-1, 2, -3, 4]); + * + * x.relu().print(); // or tf.relu(x) + * ``` + * @param x The input tensor. If the dtype is `bool`, the output dtype will be + * `int32`. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function relu_(x: T | TensorLike): T; + +export declare type ReluInputs = Pick; + +/** + * Removes a backend and the registered factory. + * + * @doc {heading: 'Backends'} + */ +export declare function removeBackend(name: string): void; + +/** + * Remove a model specified by URL from a registered storage medium. + * + * ```js + * // First create and save a model. + * const model = tf.sequential(); + * model.add(tf.layers.dense( + * {units: 1, inputShape: [10], activation: 'sigmoid'})); + * await model.save('localstorage://demo/management/model1'); + * + * // Then list existing models. + * console.log(JSON.stringify(await tf.io.listModels())); + * + * // Delete the model. + * await tf.io.removeModel('localstorage://demo/management/model1'); + * + * // List models again. + * console.log(JSON.stringify(await tf.io.listModels())); + * ``` + * + * @param url A URL to a stored model, with a scheme prefix, e.g., + * 'localstorage://my-model-1', 'indexeddb://my/model/2'. + * @returns ModelArtifactsInfo of the deleted model (if and only if deletion + * is successful). + * @throws Error if deletion fails, e.g., if no model exists at `path`. + * + * @doc { + * heading: 'Models', + * subheading: 'Management', + * namespace: 'io', + * ignoreCI: true + * } + */ +declare function removeModel(url: string): Promise; + +declare function repeatedTry(checkFn: () => boolean, delayFn?: (counter: number) => number, maxCounter?: number, scheduleFn?: (functionRef: Function, delay: number) => void): Promise; + +/** + * Additional options for Platform.fetch + */ +declare interface RequestDetails { + /** + * Is this request for a binary file (as opposed to a json file) + */ + isBinary?: boolean; +} + +export declare const Reshape = "Reshape"; + +export declare const reshape: typeof reshape_; + +/** + * Reshapes a `tf.Tensor` to a given shape. + * + * Given an input tensor, returns a new tensor with the same values as the + * input tensor with shape `shape`. + * + * If one component of shape is the special value -1, the size of that + * dimension is computed so that the total size remains constant. In + * particular, a shape of [-1] flattens into 1-D. At most one component of + * shape can be -1. + * + * If shape is 1-D or higher, then the operation returns a tensor with shape + * shape filled with the values of tensor. In this case, the number of + * elements implied by shape must be the same as the number of elements in + * tensor. + * + * ```js + * const x = tf.tensor1d([1, 2, 3, 4]); + * x.reshape([2, 2]).print(); + * ``` + * + * @param x The input tensor to be reshaped. + * @param shape An array of integers defining the output tensor shape. + * + * @doc {heading: 'Tensors', subheading: 'Transformations'} + */ +declare function reshape_(x: Tensor | TensorLike, shape: ShapeMap[R]): Tensor; + +export declare interface ReshapeAttrs { + shape: number[]; +} + +export declare type ReshapeInputs = Pick; + +export declare const ResizeBilinear = "ResizeBilinear"; + +export declare interface ResizeBilinearAttrs { + alignCorners: boolean; + halfPixelCenters: boolean; + size: [number, number]; +} + +export declare const ResizeBilinearGrad = "ResizeBilinearGrad"; + +export declare type ResizeBilinearGradAttrs = ResizeBilinearAttrs; + +export declare type ResizeBilinearGradInputs = Pick; + +export declare type ResizeBilinearInputs = Pick; + +export declare const ResizeNearestNeighbor = "ResizeNearestNeighbor"; + +export declare interface ResizeNearestNeighborAttrs { + alignCorners: boolean; + halfPixelCenters: boolean; + size: [number, number]; +} + +export declare const ResizeNearestNeighborGrad = "ResizeNearestNeighborGrad"; + +export declare type ResizeNearestNeighborGradAttrs = ResizeNearestNeighborAttrs; + +export declare type ResizeNearestNeighborGradInputs = Pick; + +export declare type ResizeNearestNeighborInputs = Pick; + +export declare const Reverse = "Reverse"; + +export declare const reverse: typeof reverse_; + +export declare const reverse1d: typeof reverse1d_; + +/** + * Reverses a `tf.Tensor1D`. + * + * @param x The input tensor. + */ +declare function reverse1d_(x: Tensor1D | TensorLike): Tensor1D; + +export declare const reverse2d: typeof reverse2d_; + +/** + * Reverses a `tf.Tensor2D` along a specified axis. + * + * @param x The input tensor. + * @param axis The set of dimensions to reverse. Must be in the + * range [-rank(x), rank(x)). Defaults to all axes. + */ +declare function reverse2d_(x: Tensor2D | TensorLike, axis?: number | number[]): Tensor2D; + +export declare const reverse3d: typeof reverse3d_; + +/** + * Reverses a `tf.Tensor3D` along a specified axis. + * + * @param x The input tensor. + * @param axis The set of dimensions to reverse. Must be in the + * range [-rank(x), rank(x)). Defaults to all axes. + */ +declare function reverse3d_(x: Tensor3D | TensorLike, axis?: number | number[]): Tensor3D; + +export declare const reverse4d: typeof reverse4d_; + +/** + * Reverses a `tf.Tensor4D` along a specified axis. + * + * @param x The input tensor. + * @param axis The set of dimensions to reverse. Must be in the + * range [-rank(x), rank(x)). Defaults to all axes. + */ +declare function reverse4d_(x: Tensor4D | TensorLike, axis?: number | number[]): Tensor4D; + +/** + * Reverses a `tf.Tensor` along a specified axis. + * + * Also available are stricter rank-specific methods that assert that `x` is + * of the given rank: + * - `tf.reverse1d` + * - `tf.reverse2d` + * - `tf.reverse3d` + * - `tf.reverse4d` + * + * Except `tf.reverse1d` (which does not have axis param), all methods have + * same signature as this method. + * + * ```js + * const x = tf.tensor1d([1, 2, 3, 4]); + * + * x.reverse().print(); + * ``` + * + * ```js + * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]); + * + * const axis = 1; + * x.reverse(axis).print(); + * ``` + * @param x The input tensor to be reversed. + * @param axis The set of dimensions to reverse. Must be in the + * range [-rank(x), rank(x)). Defaults to all axes. + * + * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'} + */ +declare function reverse_(x: T | TensorLike, axis?: number | number[]): T; + +export declare interface ReverseAttrs { + dims: number | number[]; +} + +export declare type ReverseInputs = Pick; + +export declare const rfft: typeof rfft_; + +/** + * Real value input fast Fourier transform. + * + * Computes the 1-dimensional discrete Fourier transform over the + * inner-most dimension of the real input. + * + * ```js + * const real = tf.tensor1d([1, 2, 3]); + * + * real.rfft().print(); + * ``` + * @param input The real value input to compute an rfft over. + * + * @doc {heading: 'Operations', subheading: 'Spectral', namespace: 'spectral'} + */ +declare function rfft_(input: Tensor, fftLength?: number): Tensor; + +declare function rightPad(a: string, size: number): string; + +/** @doclink Optimizer */ +export declare class RMSPropOptimizer extends Optimizer { + protected learningRate: number; + protected decay: number; + protected momentum: number; + protected epsilon: number; + /** @nocollapse */ + static className: string; + private centered; + private accumulatedMeanSquares; + private accumulatedMoments; + private accumulatedMeanGrads; + constructor(learningRate: number, decay?: number, momentum?: number, epsilon?: number, centered?: boolean); + applyGradients(variableGradients: NamedTensorMap | NamedTensor[]): void; + dispose(): void; + getWeights(): Promise; + setWeights(weightValues: NamedTensor[]): Promise; + getConfig(): ConfigDict; + /** @nocollapse */ + static fromConfig(cls: SerializableConstructor, config: ConfigDict): T; +} + +export declare const RotateWithOffset = "RotateWithOffset"; + +export declare interface RotateWithOffsetAttrs { + radians: number; + fillValue: number | [number, number, number]; + center: number | [number, number]; +} + +export declare type RotateWithOffsetInputs = Pick; + +export declare const Round = "Round"; + +export declare const round: typeof round_; + +/** + * Computes round of input `tf.Tensor` element-wise: `round(x)`. + * It implements banker's rounding. + * + * ```js + * const x = tf.tensor1d([.6, 1.1, -3.3]); + * + * x.round().print(); // or tf.round(x) + * ``` + * @param x The input tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function round_(x: T | TensorLike): T; + +export declare type RoundInputs = UnaryInputs; + +/** + * @license + * Copyright 2022 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +declare enum RowPartitionType { + FIRST_DIM_SIZE = 0, + VALUE_ROWIDS = 1, + ROW_LENGTHS = 2, + ROW_SPLITS = 3, + ROW_LIMITS = 4, + ROW_STARTS = 5 +} + +export declare const Rsqrt = "Rsqrt"; + +export declare const rsqrt: typeof rsqrt_; + +/** + * Computes reciprocal of square root of the input `tf.Tensor` element-wise: + * `y = 1 / sqrt(x)` + * + * ```js + * const x = tf.tensor1d([1, 2, 4, -1]); + * + * x.rsqrt().print(); // or tf.rsqrt(x) + * ``` + * @param x The input tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function rsqrt_(x: T | TensorLike): T; + +export declare type RsqrtInputs = UnaryInputs; + +/** + * Options for saving a model. + * @innamespace io + */ +declare interface SaveConfig { + /** + * Whether to save only the trainable weights of the model, ignoring the + * non-trainable ones. + */ + trainableOnly?: boolean; + /** + * Whether the optimizer will be saved (if exists). + * + * Default: `false`. + */ + includeOptimizer?: boolean; +} + +/** + * @deprecated Deprecated interface for SavedModel/GraphModel signature + * input/output Tensor info. User ModelTensorInfo instead. + */ +export declare interface SavedModelTensorInfo { + dtype: string; + shape: number[]; + name: string; +} + +/** + * Type definition for handlers of saving operations. + */ +declare type SaveHandler = (modelArtifact: ModelArtifacts) => Promise; + +/** + * Type definition for handlers of synchronous saving operations. + */ +declare type SaveHandlerSync = (modelArtifact: ModelArtifacts) => SaveResult; + +/** + * Result of a saving operation. + */ +declare interface SaveResult { + /** + * Information about the model artifacts saved. + */ + modelArtifactsInfo: ModelArtifactsInfo; + /** + * HTTP responses from the server that handled the model-saving request (if + * any). This is applicable only to server-based saving routes. + */ + responses?: Response[]; + /** + * Error messages and related data (if any). + */ + errors?: Array<{} | string>; +} + +/** @doclink Tensor */ +export declare type Scalar = Tensor; + +/** + * Creates rank-0 `tf.Tensor` (scalar) with the provided value and dtype. + * + * The same functionality can be achieved with `tf.tensor`, but in general + * we recommend using `tf.scalar` as it makes the code more readable. + * + * ```js + * tf.scalar(3.14).print(); + * ``` + * + * @param value The value of the scalar. + * @param dtype The data type. + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ +export declare function scalar(value: number | boolean | string | Uint8Array, dtype?: DataType): Scalar; + +export declare type ScalarLike = number | boolean | string | Uint8Array; + +declare namespace scatter_util { + export { + validateUpdateShape, + validateInput, + calculateShapes, + ScatterShapeInfo + } +} +export { scatter_util } + +export declare const ScatterNd = "ScatterNd"; + +export declare const scatterND: typeof scatterND_; + +/** + * Creates a new tensor by applying sparse updates to individual + * values or slices within a zero tensor of the given shape tensor according to + * indices. This operator is the inverse of the `tf.gatherND` operator which + * extracts values or slices from a given tensor. + * + * ```js + * const indices = tf.tensor2d([4, 3, 1, 7], [4, 1], 'int32'); + * const updates = tf.tensor1d([9, 10, 11, 12]); + * const shape = [8]; + * tf.scatterND(indices, updates, shape).print() //[0, 11, 0, 10, 9, 0, 0, 12] + * ``` + * + * @param indices The tensor contains the indices into the output tensor. + * @param updates The tensor contains the value for the indices. + * @param shape: The shape of the output tensor. + * + * @doc {heading: 'Operations', subheading: 'Slicing and Joining'} + */ +declare function scatterND_(indices: Tensor | TensorLike, updates: Tensor | TensorLike, shape: ShapeMap[R]): Tensor; + +export declare interface ScatterNdAttrs { + shape: number[]; +} + +export declare type ScatterNdInputs = Pick; + +declare interface ScatterShapeInfo { + sliceRank: number; + numUpdates: number; + sliceSize: number; + strides: number[]; + outputSize: number; +} + +/** @docalias Function */ +declare type ScopeFn = () => T; + +declare interface ScopeState { + track: Tensor[]; + name: string; + id: number; +} + +export declare const SearchSorted = "SearchSorted"; + +export declare const searchSorted: typeof searchSorted_; + +/** + * Searches for where a value would go in a sorted sequence. + * + * This is not a method for checking containment (like javascript in). + * + * The typical use case for this operation is "binning", "bucketing", or + * "discretizing". The values are assigned to bucket-indices based on the edges + * listed in 'sortedSequence'. This operation returns the bucket-index for each + * value. + * + * The side argument controls which index is returned if a value lands exactly + * on an edge. + * + * The axis is not settable for this operation. It always operates on the + * innermost dimension (axis=-1). The operation will accept any number of outer + * dimensions. + * + * Note: This operation assumes that 'sortedSequence' is sorted along the + * innermost axis, maybe using 'sort(..., axis=-1)'. If the sequence is not + * sorted no error is raised and the content of the returned tensor is not well + * defined. + * + * ```js + * const edges = tf.tensor1d([-1, 3.3, 9.1, 10.0]); + * let values = tf.tensor1d([0.0, 4.1, 12.0]); + * const result1 = tf.searchSorted(edges, values, 'left'); + * result1.print(); // [1, 2, 4] + * + * const seq = tf.tensor1d([0, 3, 9, 10, 10]); + * values = tf.tensor1d([0, 4, 10]); + * const result2 = tf.searchSorted(seq, values, 'left'); + * result2.print(); // [0, 2, 3] + * const result3 = tf.searchSorted(seq, values, 'right'); + * result3.print(); // [1, 2, 5] + * + * const sortedSequence = tf.tensor2d([[0., 3., 8., 9., 10.], + * [1., 2., 3., 4., 5.]]); + * values = tf.tensor2d([[9.8, 2.1, 4.3], + * [0.1, 6.6, 4.5, ]]); + * const result4 = tf.searchSorted(sortedSequence, values, 'left'); + * result4.print(); // [[4, 1, 2], [0, 5, 4]] + * ``` + * @param sortedSequence: N-D. Sorted sequence. + * @param values: N-D. Search values. + * @param side: 'left'|'right'. Defaults to 'left'. 'left' corresponds to lower + * bound and 'right' to upper bound. + * @return An N-D int32 tensor the size of values containing the result of + * applying either lower bound or upper bound (depending on side) to each + * value. The result is not a global index to the entire Tensor, but the + * index in the last dimension. + * @doc {heading: 'Operations', subheading: 'Evaluation'} + */ +declare function searchSorted_(sortedSequence: Tensor | TensorLike, values: Tensor | TensorLike, side?: 'left' | 'right'): Tensor; + +export declare interface SearchSortedAttrs { + side: 'left' | 'right'; +} + +export declare type SearchSortedInputs = Pick; + +declare namespace segment_util { + export { + segOpComputeOptimalWindowSize, + computeOutShape_2 as computeOutShape, + collectGatherOpShapeInfo, + SegOpInfo, + GatherOpShapeInfo + } +} + +declare function segOpComputeOptimalWindowSize(inSize: number, numSegments: number): number; + +declare interface SegOpInfo { + windowSize: number; + batchSize: number; + inSize: number; + numSegments: number; +} + +export declare const Select = "Select"; + +export declare type SelectInputs = Pick; + +export declare const Selu = "Selu"; + +export declare const selu: typeof selu_; + +/** + * Computes scaled exponential linear element-wise. + * + * `x < 0 ? scale * alpha * (exp(x) - 1) : scale * x` + * + * ```js + * const x = tf.tensor1d([-1, 2, -3, 4]); + * + * x.selu().print(); // or tf.selu(x) + * ``` + * @param x The input tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function selu_(x: T | TensorLike): T; + +declare const SELU_SCALE = 1.0507009873554805; + +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +declare const SELU_SCALEALPHA = 1.7580993408473768; + +export declare type SeluInputs = Pick; + +export declare const separableConv2d: typeof separableConv2d_; + +/** + * 2-D convolution with separable filters. + * + * Performs a depthwise convolution that acts separately on channels followed + * by a pointwise convolution that mixes channels. Note that this is + * separability between dimensions [1, 2] and 3, not spatial separability + * between dimensions 1 and 2. + * + * See + * [https://www.tensorflow.org/api_docs/python/tf/nn/separable_conv2d]( + * https://www.tensorflow.org/api_docs/python/tf/nn/separable_conv2d) + * for more details. + * + * @param x The input tensor, of rank 4 or rank 3, of shape + * `[batch, height, width, inChannels]`. If rank 3, batch of 1 is + * assumed. + * @param depthwiseFilter The depthwise filter tensor, rank 4, of shape + * `[filterHeight, filterWidth, inChannels, channelMultiplier]`. This is + * the filter used in the first step. + * @param pointwiseFilter The pointwise filter tensor, rank 4, of shape + * `[1, 1, inChannels * channelMultiplier, outChannels]`. This is + * the filter used in the second step. + * @param strides The strides of the convolution: `[strideHeight, + * strideWidth]`. If strides is a single number, then `strideHeight == + * strideWidth`. + * @param pad The type of padding algorithm. + * - `same` and stride 1: output will be of same size as input, + * regardless of filter size. + * - `valid`: output will be smaller than input if filter is larger + * than 1x1. + * - For more info, see this guide: + * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution]( + * https://www.tensorflow.org/api_docs/python/tf/nn/convolution) + * @param dilations The dilation rates: `[dilationHeight, dilationWidth]` + * in which we sample input values across the height and width dimensions + * in atrous convolution. Defaults to `[1, 1]`. If `rate` is a single + * number, then `dilationHeight == dilationWidth`. If it is greater than + * 1, then all values of `strides` must be 1. + * @param dataFormat: An optional string from: "NHWC", "NCHW". Defaults to + * "NHWC". Specify the data format of the input and output data. With the + * default format "NHWC", the data is stored in the order of: [batch, + * height, width, channels]. Only "NHWC" is currently supported. + * + * @doc {heading: 'Operations', subheading: 'Convolution'} + */ +declare function separableConv2d_(x: T | TensorLike, depthwiseFilter: Tensor4D | TensorLike, pointwiseFilter: Tensor4D | TensorLike, strides: [number, number] | number, pad: 'valid' | 'same', dilation?: [number, number] | number, dataFormat?: 'NHWC' | 'NCHW'): T; + +/** + * Serializable defines the serialization contract. + * + * TFJS requires serializable classes to return their className when asked + * to avoid issues with minification. + */ +declare abstract class Serializable { + /** + * Return the class name for this class to use in serialization contexts. + * + * Generally speaking this will be the same thing that constructor.name + * would have returned. However, the class name needs to be robust + * against minification for serialization/deserialization to work properly. + * + * There's also places such as initializers.VarianceScaling, where + * implementation details between different languages led to different + * class hierarchies and a non-leaf node is used for serialization purposes. + */ + getClassName(): string; + /** + * Return all the non-weight state needed to serialize this object. + */ + abstract getConfig(): ConfigDict; + /** + * Creates an instance of T from a ConfigDict. + * + * This works for most descendants of serializable. A few need to + * provide special handling. + * @param cls A Constructor for the class to instantiate. + * @param config The Configuration for the object. + */ + /** @nocollapse */ + static fromConfig(cls: SerializableConstructor, config: ConfigDict): T; +} + +/** + * Type to represent the class-type of Serializable objects. + * + * Ie the class prototype with access to the constructor and any + * static members/methods. Instance methods are not listed here. + * + * Source for this idea: https://stackoverflow.com/a/43607255 + */ +declare type SerializableConstructor = { + new (...args: any[]): T; + className: string; + fromConfig: FromConfigMethod; +}; + +declare namespace serialization { + export { + registerClass, + ConfigDictValue, + ConfigDict, + ConfigDictArray, + SerializableConstructor, + FromConfigMethod, + Serializable, + SerializationMap + } +} +export { serialization } + +/** + * Maps string keys to class constructors. + * + * Used during (de)serialization from the cross-language JSON format, which + * requires the class name in the serialization format matches the class + * names as used in Python, should it exist. + */ +declare class SerializationMap { + private static instance; + classNameMap: { + [className: string]: [ + SerializableConstructor, + FromConfigMethod + ]; + }; + private constructor(); + /** + * Returns the singleton instance of the map. + */ + static getMap(): SerializationMap; + /** + * Registers the class as serializable. + */ + static register(cls: SerializableConstructor): void; +} + +/** + * Sets the backend (cpu, webgl, wasm, etc) responsible for creating tensors and + * executing operations on those tensors. Returns a promise that resolves + * to a boolean if the backend initialization was successful. + * + * Note this disposes the current backend, if any, as well as any tensors + * associated with it. A new backend is initialized, even if it is of the + * same type as the previous one. + * + * @param backendName The name of the backend. Currently supports + * `'webgl'|'cpu'` in the browser, `'tensorflow'` under node.js + * (requires tfjs-node), and `'wasm'` (requires tfjs-backend-wasm). + * + * @doc {heading: 'Backends'} + */ +export declare function setBackend(backendName: string): Promise; + +export declare const setdiff1dAsync: typeof setdiff1dAsync_; + +/** + * Computes the difference between two lists of numbers. + * + * Given a Tensor `x` and a Tensor `y`, this operation returns a Tensor `out` + * that represents all values that are in `x` but not in `y`. The returned + * Tensor `out` is sorted in the same order that the numbers appear in `x` + * (duplicates are preserved). This operation also returns a Tensor indices that + * represents the position of each out element in `x`. In other words: + * + * `out[i] = x[idx[i]] for i in [0, 1, ..., out.length - 1]` + * + * ```js + * const x = [1, 2, 3, 4, 5, 6]; + * const y = [1, 3, 5]; + * + * const [out, indices] = await tf.setdiff1dAsync(x, y); + * out.print(); // [2, 4, 6] + * indices.print(); // [1, 3, 5] + * ``` + * + * @param x 1-D Tensor. Values to keep. + * @param y 1-D Tensor. Must have the same type as x. Values to exclude in the + * output. + * @returns Promise of Tensor tuple [out, indices]. + * out: Tensor with the same type as x. + * indices: A Tensor of type int32. + * + * @doc {heading: 'Tensors', subheading: 'Transformations'} + */ +declare function setdiff1dAsync_(x: Tensor | TensorLike, y: Tensor | TensorLike): Promise<[Tensor, Tensor]>; + +/** + * Sets the global platform. + * + * @param platformName The name of this platform. + * @param platform A platform implementation. + */ +export declare function setPlatform(platformName: string, platform: Platform): void; + +/** @doclink Optimizer */ +export declare class SGDOptimizer extends Optimizer { + protected learningRate: number; + /** @nocollapse */ + static className: string; + protected c: Scalar; + constructor(learningRate: number); + applyGradients(variableGradients: NamedTensorMap | NamedTensor[]): void; + /** + * Sets the learning rate of the optimizer. + */ + setLearningRate(learningRate: number): void; + dispose(): void; + getWeights(): Promise; + setWeights(weightValues: NamedTensor[]): Promise; + getConfig(): ConfigDict; + /** @nocollapse */ + static fromConfig(cls: SerializableConstructor, config: ConfigDict): T; +} + +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/** @docalias number[] */ +export declare interface ShapeMap { + R0: number[]; + R1: [number]; + R2: [number, number]; + R3: [number, number, number]; + R4: [number, number, number, number]; + R5: [number, number, number, number, number]; + R6: [number, number, number, number, number, number]; +} + +declare const shouldFuse: (gradientDepth: number, activation: Activation) => boolean; + +/** + * Shuffles the array in-place using Fisher-Yates algorithm. + * + * ```js + * const a = [1, 2, 3, 4, 5]; + * tf.util.shuffle(a); + * console.log(a); + * ``` + * + * @param array The array to shuffle in-place. + * + * @doc {heading: 'Util', namespace: 'util'} + */ +declare function shuffle(array: any[] | Uint32Array | Int32Array | Float32Array): void; + +/** + * Shuffles two arrays in-place the same way using Fisher-Yates algorithm. + * + * ```js + * const a = [1,2,3,4,5]; + * const b = [11,22,33,44,55]; + * tf.util.shuffleCombo(a, b); + * console.log(a, b); + * ``` + * + * @param array The first array to shuffle in-place. + * @param array2 The second array to shuffle in-place with the same permutation + * as the first array. + * + * @doc {heading: 'Util', namespace: 'util'} + */ +declare function shuffleCombo(array: any[] | Uint32Array | Int32Array | Float32Array, array2: any[] | Uint32Array | Int32Array | Float32Array): void; + +export declare const Sigmoid = "Sigmoid"; + +export declare const sigmoid: typeof sigmoid_; + +/** + * Computes sigmoid element-wise, `1 / (1 + exp(-x))` + * + * ```js + * const x = tf.tensor1d([0, -1, 2, -3]); + * + * x.sigmoid().print(); // or tf.sigmoid(x) + * ``` + * @param x The input tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function sigmoid_(x: T | TensorLike): T; + +export declare type SigmoidInputs = UnaryInputs; + +export declare const Sign = "Sign"; + +export declare const sign: typeof sign_; + +/** + * Returns an element-wise indication of the sign of a number. + * + * ```js + * const x = tf.tensor1d([.6, 1.1, -3.3, NaN, 0]); + * + * x.sign().print(); // or tf.sign(x) + * ``` + * @param x The input Tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function sign_(x: T | TensorLike): T; + +export declare const signal: { + hammingWindow: (windowLength: number) => Tensor1D; + hannWindow: (windowLength: number) => Tensor1D; + frame: (signal: Tensor1D, frameLength: number, frameStep: number, padEnd?: boolean, padValue?: number) => Tensor; + stft: (signal: Tensor1D, frameLength: number, frameStep: number, fftLength?: number, windowFn?: (length: number) => Tensor1D) => Tensor; +}; + +/** + * Interface for SavedModel/GraphModel SignatureDef info. + */ +export declare interface SignatureDef { + [key: string]: SignatureDefEntry; +} + +/** + * Interface for SavedModel/GraphModel SignatureDef entry. + */ +export declare interface SignatureDefEntry { + inputs: { + [key: string]: ModelTensorInfo; + }; + outputs: { + [key: string]: ModelTensorInfo; + }; +} + +/** + * @deprecated Deprecated interface for SavedModel/GraphModel SignatureDef info. + * User SignatureDef instead. + */ +export declare interface SignatureDefInfo { + [key: string]: { + inputs: { + [key: string]: SavedModelTensorInfo; + }; + outputs: { + [key: string]: SavedModelTensorInfo; + }; + }; +} + +export declare type SignInputs = UnaryInputs; + +export declare const Sin = "Sin"; + +export declare const sin: typeof sin_; + +/** + * Computes sin of the input Tensor element-wise: `sin(x)` + * + * ```js + * const x = tf.tensor1d([0, Math.PI / 2, Math.PI * 3 / 4]); + * + * x.sin().print(); // or tf.sin(x) + * ``` + * @param x The input tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function sin_(x: T | TensorLike): T; + +declare interface SingleValueMap { + bool: boolean; + int32: number; + float32: number; + complex64: number; + string: string; +} + +export declare const Sinh = "Sinh"; + +export declare const sinh: typeof sinh_; + +/** + * Computes hyperbolic sin of the input `tf.Tensor` element-wise: `sinh(x)` + * + * ```js + * const x = tf.tensor1d([0, 1, -1, .7]); + * + * x.sinh().print(); // or tf.sinh(x) + * ``` + * @param x The input tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function sinh_(x: T | TensorLike): T; + +export declare type SinhInputs = UnaryInputs; + +export declare type SinInputs = UnaryInputs; + +/** + * Returns the size (number of elements) of the tensor given its shape. + * + * ```js + * const shape = [3, 4, 2]; + * const size = tf.util.sizeFromShape(shape); + * console.log(size); + * ``` + * + * @doc {heading: 'Util', namespace: 'util'} + */ +declare function sizeFromShape(shape: number[]): number; + +declare function sizeToSquarishShape(size: number): [number, number]; + +export declare const Slice = "Slice"; + +export declare const slice: typeof slice_; + +export declare const slice1d: typeof slice1d_; + +/** + * Extracts a 1D slice from 1D array starting at coordinates `begin` and is + * of length `size`. See `slice` for details. + */ +declare function slice1d_(x: Tensor1D | TensorLike, begin: number, size: number): Tensor1D; + +export declare const slice2d: typeof slice2d_; + +/** + * Extracts a 2D slice from a 2D array starting at coordinates `begin` and + * is of size `size`. See `slice` for details. + */ +declare function slice2d_(x: Tensor2D | TensorLike, begin: [number, number], size: [number, number]): Tensor2D; + +export declare const slice3d: typeof slice3d_; + +/** + * Extracts a 3D slice from a 3D array starting at coordinates `begin` and + * is of size `size`. See `slice` for details. + */ +declare function slice3d_(x: Tensor3D | TensorLike, begin: [number, number, number], size: [number, number, number]): Tensor3D; + +export declare const slice4d: typeof slice4d_; + +/** + * Extracts a 4D slice from a 4D array starting at coordinates `begin` and + * is of size `size`. See `slice` for details. + */ +declare function slice4d_(x: Tensor4D | TensorLike, begin: [number, number, number, number], size: [number, number, number, number]): Tensor4D; + +/** + * Extracts a slice from a `tf.Tensor` starting at coordinates `begin` + * and is of size `size`. + * + * Also available are stricter rank-specific methods with the same signature + * as this method that assert that `x` is of the given rank: + * - `tf.slice1d` + * - `tf.slice2d` + * - `tf.slice3d` + * - `tf.slice4d` + * + * ```js + * const x = tf.tensor1d([1, 2, 3, 4]); + * + * x.slice([1], [2]).print(); + * ``` + * + * ```js + * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]); + * + * x.slice([1, 0], [1, 2]).print(); + * ``` + * @param x The input `tf.Tensor` to slice from. + * @param begin The coordinates to start the slice from. The length can be + * less than the rank of x - the rest of the axes will have implicit 0 as + * start. Can also be a single number, in which case it specifies the + * first axis. + * @param size The size of the slice. The length can be less than the rank of + * x - the rest of the axes will have implicit -1. A value of -1 requests + * the rest of the dimensions in the axis. Can also be a single number, + * in which case it specifies the size of the first axis. + * + * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'} + */ +declare function slice_>(x: T | TensorLike, begin: number | number[], size?: number | number[]): T; + +declare namespace slice_util { + export { + assertParamsValid, + maskToAxes, + computeOutShape, + stridesWithElidedDims, + getNormalizedAxes, + startIndicesWithElidedDims, + stopIndicesWithElidedDims, + stridesForAxis, + startForAxis, + stopForAxis, + isSliceContinous, + computeFlatOffset, + parseSliceParams, + sliceInfo, + SliceInfo + } +} +export { slice_util } + +export declare interface SliceAttrs { + begin: number | number[]; + size: number | number[]; +} + +declare type SliceInfo = { + finalShapeSparse: number[]; + finalShape: number[]; + isIdentity: boolean; + sliceDim0: boolean; + isSimpleSlice: boolean; + begin: number[]; + end: number[]; + strides: number[]; +}; + +declare function sliceInfo(xShape: number[], begin: number[], end: number[], strides: number[], beginMask: number, endMask: number, ellipsisMask: number, newAxisMask: number, shrinkAxisMask: number): SliceInfo; + +export declare type SliceInputs = Pick; + +export declare const Softmax = "Softmax"; + +export declare const softmax: typeof softmax_; + +/** + * Computes the softmax normalized vector given the logits. + * + * ```js + * const a = tf.tensor1d([1, 2, 3]); + * + * a.softmax().print(); // or tf.softmax(a) + * ``` + * + * ```js + * const a = tf.tensor2d([2, 4, 6, 1, 2, 3], [2, 3]); + * + * a.softmax().print(); // or tf.softmax(a) + * ``` + * + * @param logits The logits array. + * @param dim The dimension softmax would be performed on. Defaults to `-1` + * which indicates the last dimension. + * + * @doc {heading: 'Operations', subheading: 'Normalization'} + */ +declare function softmax_(logits: T | TensorLike, dim?: number): T; + +export declare interface SoftmaxAttrs { + dim: number; +} + +export declare type SoftmaxInputs = Pick; + +export declare const Softplus = "Softplus"; + +export declare const softplus: typeof softplus_; + +/** + * Computes softplus of the input `tf.Tensor` element-wise: `log(exp(x) + 1)` + * + * ```js + * const x = tf.tensor1d([0, 1, -1, .7]); + * + * x.softplus().print(); // or tf.softplus(x) + * ``` + * @param x The input tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function softplus_(x: T | TensorLike): T; + +export declare type SoftplusInputs = UnaryInputs; + +export declare const SpaceToBatchND = "SpaceToBatchND"; + +export declare const spaceToBatchND: typeof spaceToBatchND_; + +/** + * This operation divides "spatial" dimensions `[1, ..., M]` of the input into + * a grid of blocks of shape `blockShape`, and interleaves these blocks with + * the "batch" dimension (0) such that in the output, the spatial + * dimensions `[1, ..., M]` correspond to the position within the grid, + * and the batch dimension combines both the position within a spatial block + * and the original batch position. Prior to division into blocks, + * the spatial dimensions of the input are optionally zero padded + * according to `paddings`. See below for a precise description. + * + * ```js + * const x = tf.tensor4d([1, 2, 3, 4], [1, 2, 2, 1]); + * const blockShape = [2, 2]; + * const paddings = [[0, 0], [0, 0]]; + * + * x.spaceToBatchND(blockShape, paddings).print(); + * ``` + * + * @param x A `tf.Tensor`. N-D with `x.shape` = `[batch] + spatialShape + + * remainingShape`, where spatialShape has `M` dimensions. + * @param blockShape A 1-D array. Must have shape `[M]`, all values must + * be >= 1. + * @param paddings A 2-D array. Must have shape `[M, 2]`, all values must be >= + * 0. `paddings[i] = [padStart, padEnd]` specifies the amount to zero-pad + * from input dimension `i + 1`, which corresponds to spatial dimension `i`. It + * is required that + * `(inputShape[i + 1] + padStart + padEnd) % blockShape[i] === 0` + * + * This operation is equivalent to the following steps: + * + * 1. Zero-pad the start and end of dimensions `[1, ..., M]` of the input + * according to `paddings` to produce `padded` of shape paddedShape. + * + * 2. Reshape `padded` to `reshapedPadded` of shape: + * `[batch] + [paddedShape[1] / blockShape[0], blockShape[0], ..., + * paddedShape[M] / blockShape[M-1], blockShape[M-1]] + remainingShape` + * + * 3. Permute dimensions of `reshapedPadded` to produce `permutedReshapedPadded` + * of shape: `blockShape + [batch] + [paddedShape[1] / blockShape[0], ..., + * paddedShape[M] / blockShape[M-1]] + remainingShape` + * + * 4. Reshape `permutedReshapedPadded` to flatten `blockShape` into the + * batch dimension, producing an output tensor of shape: + * `[batch * prod(blockShape)] + [paddedShape[1] / blockShape[0], ..., + * paddedShape[M] / blockShape[M-1]] + remainingShape` + * + * @doc {heading: 'Tensors', subheading: 'Transformations'} + */ +declare function spaceToBatchND_(x: T | TensorLike, blockShape: number[], paddings: number[][]): T; + +export declare interface SpaceToBatchNDAttrs { + blockShape: number[]; + paddings: number[][]; +} + +export declare type SpaceToBatchNDInputs = Pick; + +export declare const sparse: { + sparseFillEmptyRows: (indices: TensorLike | Tensor2D, values: TensorLike | Tensor1D, denseShape: TensorLike | Tensor1D, defaultValue: ScalarLike | Scalar) => NamedTensorMap; + sparseReshape: (inputIndices: TensorLike | Tensor2D, inputShape: TensorLike | Tensor1D, newShape: TensorLike | Tensor1D) => NamedTensorMap; + sparseSegmentMean: (data: TensorLike | Tensor, indices: TensorLike | Tensor1D, segmentIds: TensorLike | Tensor1D) => Tensor; + sparseSegmentSum: (data: TensorLike | Tensor, indices: TensorLike | Tensor1D, segmentIds: TensorLike | Tensor1D) => Tensor; +}; + +export declare const SparseFillEmptyRows = "SparseFillEmptyRows"; + +export declare type SparseFillEmptyRowsInputs = Pick; + +export declare const SparseReshape = "SparseReshape"; + +export declare type SparseReshapeInputs = Pick; + +export declare const SparseSegmentMean = "SparseSegmentMean"; + +export declare type SparseSegmentMeanInputs = Pick; + +export declare const SparseSegmentSum = "SparseSegmentSum"; + +export declare type SparseSegmentSumInputs = Pick; + +export declare const SparseToDense = "SparseToDense"; + +export declare const sparseToDense: typeof sparseToDense_; + +/** + * Converts a sparse representation into a dense tensor. + * + * Builds an array dense with shape outputShape such that: + * + * // If sparseIndices is scalar + * dense[i] = (i == sparseIndices ? sparseValues : defaultValue) + * + * // If sparseIndices is a vector, then for each i + * dense[sparseIndices[i]] = sparseValues[i] + * + * // If sparseIndices is an n by d matrix, then for each i in [0, n) + * dense[sparseIndices[i][0], ..., sparseIndices[i][d-1]] = sparseValues[i] + * All other values in dense are set to defaultValue. If sparseValues is a + * scalar, all sparse indices are set to this single value. + * + * If indices are repeated the final value is summed over all values for those + * indices. + * + * ```js + * const indices = tf.tensor1d([4, 5, 6, 1, 2, 3], 'int32'); + * const values = tf.tensor1d([10, 11, 12, 13, 14, 15], 'float32'); + * const shape = [8]; + * tf.sparseToDense(indices, values, shape).print(); + * ``` + * + * @param sparseIndices A 0-D, 1-D, or 2-D Tensor of type int32. + * sparseIndices[i] contains the complete index where sparseValues[i] will be + * placed. + * @param sparseValues A 0-D or 1-D Tensor. Values + * corresponding to each row of sparseIndices, or a scalar value to be used for + * all sparse indices. + * @param outputShape Shape of the dense output tensor. The type is inferred. + * @param defaultValue Scalar. Value to set for indices not specified in + * sparseIndices. Defaults to zero. + * + * @doc {heading: 'Operations', subheading: 'Normalization'} + */ +declare function sparseToDense_(sparseIndices: Tensor | TensorLike, sparseValues: Tensor | TensorLike, outputShape: ShapeMap[R], defaultValue?: Scalar | ScalarLike): Tensor; + +export declare interface SparseToDenseAttrs { + outputShape: number[]; +} + +export declare type SparseToDenseInputs = Pick; + +export declare const spectral: { + fft: (input: Tensor) => Tensor; + ifft: (input: Tensor) => Tensor; + rfft: (input: Tensor, fftLength?: number) => Tensor; + irfft: (input: Tensor) => Tensor; +}; + +export declare const split: typeof split_; + +/** + * Splits a `tf.Tensor` into sub tensors. + * + * If `numOrSizeSplits` is a number, splits `x` along dimension `axis` + * into `numOrSizeSplits` smaller tensors. + * Requires that `numOrSizeSplits` evenly divides `x.shape[axis]`. + * + * If `numOrSizeSplits` is a number array, splits `x` into + * `numOrSizeSplits.length` pieces. The shape of the `i`-th piece has the + * same size as `x` except along dimension `axis` where the size is + * `numOrSizeSplits[i]`. + * + * ```js + * const x = tf.tensor2d([1, 2, 3, 4, 5, 6, 7, 8], [2, 4]); + * const [a, b] = tf.split(x, 2, 1); + * a.print(); + * b.print(); + * + * const [c, d, e] = tf.split(x, [1, 2, 1], 1); + * c.print(); + * d.print(); + * e.print(); + * ``` + * + * @param x The input tensor to split. + * @param numOrSizeSplits Either an integer indicating the number of + * splits along the axis or an array of integers containing the sizes of + * each output tensor along the axis. If a number then it must evenly divide + * `x.shape[axis]`; otherwise the sum of sizes must match `x.shape[axis]`. + * Can contain one -1 indicating that dimension is to be inferred. + * @param axis The dimension along which to split. Defaults to 0 (the first + * dim). + * + * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'} + */ +declare function split_(x: Tensor | TensorLike, numOrSizeSplits: number[] | number, axis?: number): T[]; + +/** + * Splits a complex Float32Array into real and imag parts. + * + * The memory layout is interleaved as follows: + * complex: [r0, i0, r1, i1, r2, i2] + * real: [r0, r1, r2] + * imag: [i0, i1, i2] + * + * This is the inverse of mergeRealAndImagArrays. + * + * @param complex The complex tensor values. + * @returns An object with real and imag Float32Array components of the complex + * tensor. + */ +declare function splitRealAndImagArrays(complex: Float32Array): { + real: Float32Array; + imag: Float32Array; +}; + +export declare const SplitV = "SplitV"; + +export declare interface SplitVAttrs { + numOrSizeSplits: number[] | number; + axis: number; +} + +export declare type SplitVInputs = Pick; + +export declare const Sqrt = "Sqrt"; + +export declare const sqrt: typeof sqrt_; + +/** + * Computes square root of the input `tf.Tensor` element-wise: `y = sqrt(x)` + * + * ```js + * const x = tf.tensor1d([1, 2, 4, -1]); + * + * x.sqrt().print(); // or tf.sqrt(x) + * ``` + * @param x The input tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function sqrt_(x: T | TensorLike): T; + +export declare type SqrtInputs = UnaryInputs; + +export declare const Square = "Square"; + +export declare const square: typeof square_; + +/** + * Computes square of `x` element-wise: `x ^ 2` + * + * ```js + * const x = tf.tensor1d([1, 2, Math.sqrt(2), -1]); + * + * x.square().print(); // or tf.square(x) + * ``` + * @param x The input Tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function square_(x: T | TensorLike): T; + +export declare const SquaredDifference = "SquaredDifference"; + +export declare const squaredDifference: typeof squaredDifference_; + +/** + * Returns (a - b) * (a - b) element-wise. + * Supports broadcasting. + * + * ```js + * const a = tf.tensor1d([1, 4, 3, 16]); + * const b = tf.tensor1d([1, 2, 9, 4]); + * + * a.squaredDifference(b).print(); // or tf.squaredDifference(a, b) + * ``` + * + * ```js + * // Broadcast squared difference a with b. + * const a = tf.tensor1d([2, 4, 6, 8]); + * const b = tf.scalar(5); + * + * a.squaredDifference(b).print(); // or tf.squaredDifference(a, b) + * ``` + * + * @param a The first tensor. + * @param b The second tensor. Must have the same type as `a`. + * + * @doc {heading: 'Operations', subheading: 'Arithmetic'} + */ +declare function squaredDifference_(a: Tensor | TensorLike, b: Tensor | TensorLike): T; + +export declare type SquaredDifferenceInputs = BinaryInputs; + +export declare type SquareInputs = Pick; + +export declare const squeeze: typeof squeeze_; + +/** + * Removes dimensions of size 1 from the shape of a `tf.Tensor`. + * + * ```js + * const x = tf.tensor([1, 2, 3, 4], [1, 1, 4]); + * x.squeeze().print(); + * ``` + * + * @param x The input tensor to be squeezed. + * @param axis An optional list of numbers. If specified, only + * squeezes the dimensions listed. The dimension index starts at 0. It + * is an error to squeeze a dimension that is not 1. + * + * @doc {heading: 'Tensors', subheading: 'Transformations'} + */ +declare function squeeze_(x: Tensor | TensorLike, axis?: number[]): T; + +/** Reduces the shape by removing all dimensions of shape 1. */ +declare function squeezeShape(shape: number[], axis?: number[]): { + newShape: number[]; + keptDims: number[]; +}; + +export declare const stack: typeof stack_; + +/** + * Stacks a list of rank-`R` `tf.Tensor`s into one rank-`(R+1)` `tf.Tensor`. + * + * ```js + * const a = tf.tensor1d([1, 2]); + * const b = tf.tensor1d([3, 4]); + * const c = tf.tensor1d([5, 6]); + * tf.stack([a, b, c]).print(); + * ``` + * + * @param tensors A list of tensor objects with the same shape and dtype. + * @param axis The axis to stack along. Defaults to 0 (the first dim). + * + * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'} + */ +declare function stack_(tensors: Array, axis?: number): Tensor; + +declare function startForAxis(beginMask: number, startIndices: number[], strides: number[], inputShape: number[], axis: number, ellipsisMask: number): number; + +declare function startIndicesWithElidedDims(beginMask: number, ellipsisInsertionIndex: number, numElidedAxes: number, originalBegin: number[], inputShape: number[]): number[]; + +/** + * TensorFlow.js-only kernels + */ +export declare const Step = "Step"; + +export declare const step: typeof step_; + +/** + * Computes step of the input `tf.Tensor` element-wise: `x > 0 ? 1 : alpha * x` + * + * ```js + * const x = tf.tensor1d([0, 2, -1, -3]); + * + * x.step(.5).print(); // or tf.step(x, .5) + * ``` + * @param x The input tensor. + * @param alpha The gradient when input is negative. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function step_(x: T | TensorLike, alpha?: number): T; + +export declare interface StepAttrs { + alpha: number; +} + +export declare type StepInputs = UnaryInputs; + +declare function stopForAxis(endMask: number, stopIndices: number[], strides: number[], inputShape: number[], axis: number, ellipsisMask: number): number; + +declare function stopIndicesWithElidedDims(endMask: number, ellipsisInsertionIndex: number, numElidedAxes: number, originalEnd: number[], inputShape: number[]): number[]; + +export declare const StridedSlice = "StridedSlice"; + +export declare const stridedSlice: typeof stridedSlice_; + +/** + * Extracts a strided slice of a tensor. + * + * Roughly speaking, this op extracts a slice of size (end-begin)/stride from + * the given input tensor (x). Starting at the location specified by begin the + * slice continues by adding stride to the index until all dimensions are not + * less than end. Note that a stride can be negative, which causes a reverse + * slice. + * + * ```js + * const t = tf.tensor3d([1, 1, 1 ,2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6], + * [3, 2, 3]); + * t.stridedSlice([1, 0, 0], [2, 1, 3], [1, 1, 1]).print() // [[[3, 3, 3]]] + * t.stridedSlice([1, 0, 0], [2, 2, 3], [1, 1, 1]).print() // [[[3, 3, 3], + * // [4, 4, 4]]] + * t.stridedSlice([1, -1, 0], [2, -3, 3], [1, -1, 1]).print() // [[[4, 4, 4], + * // [3, 3, 3]]] + * ``` + * + * @param x The tensor to stride slice. + * @param begin The coordinates to start the slice from. + * @param end: The coordinates to end the slice at. + * @param strides: The size of the slice. + * @param beginMask: If the ith bit of beginMask is set, begin[i] is ignored + * and the fullest possible range in that dimension is used instead. + * @param endMask: If the ith bit of endMask is set, end[i] is ignored + * and the fullest possible range in that dimension is used instead. + * @param shrinkAxisMask: a bitmask where bit i implies that + * the ith specification should shrink the dimensionality. begin and end must + * imply a slice of size 1 in the dimension. + * + * @doc {heading: 'Operations', subheading: 'Slicing and Joining'} + */ +declare function stridedSlice_(x: Tensor | TensorLike, begin: number[], end: number[], strides?: number[], beginMask?: number, endMask?: number, ellipsisMask?: number, newAxisMask?: number, shrinkAxisMask?: number): Tensor; + +export declare interface StridedSliceAttrs { + begin: number[]; + end: number[]; + strides: number[]; + beginMask: number; + endMask: number; + ellipsisMask: number; + newAxisMask: number; + shrinkAxisMask: number; +} + +export declare type StridedSliceInputs = Pick; + +declare function stridesForAxis(strides: number[], axis: number, ellipsisMask: number): number; + +declare function stridesWithElidedDims(strides: number[], ellipsisInsertionIndex: number, numElidedAxes: number, inputShape: number[]): number[]; + +export declare const string: { + stringNGrams: (data: TensorLike | Tensor1D, dataSplits: TensorLike | Tensor, separator: string, nGramWidths: number[], leftPad: string, rightPad: string, padWidth: number, preserveShortSequences: boolean) => NamedTensorMap; + stringSplit: (input: TensorLike | Tensor1D, delimiter: ScalarLike | Scalar, skipEmpty?: boolean) => NamedTensorMap; + stringToHashBucketFast: (input: TensorLike | Tensor, numBuckets: number) => Tensor; +}; + +export declare const StringNGrams = "StringNGrams"; + +export declare interface StringNGramsAttrs { + separator: string; + nGramWidths: number[]; + leftPad: string; + rightPad: string; + padWidth: number; + preserveShortSequences: boolean; +} + +export declare type StringNGramsInputs = Pick; + +export declare const StringSplit = "StringSplit"; + +export declare interface StringSplitAttrs { + skipEmpty: boolean; +} + +export declare type StringSplitInputs = Pick; + +export declare const StringToHashBucketFast = "StringToHashBucketFast"; + +export declare interface StringToHashBucketFastAttrs { + numBuckets: number; +} + +export declare type StringToHashBucketFastInputs = Pick; + +export declare const Sub = "Sub"; + +export declare const sub: typeof sub_; + +/** + * Subtracts two `tf.Tensor`s element-wise, A - B. Supports broadcasting. + * + * ```js + * const a = tf.tensor1d([10, 20, 30, 40]); + * const b = tf.tensor1d([1, 2, 3, 4]); + * + * a.sub(b).print(); // or tf.sub(a, b) + * ``` + * + * ```js + * // Broadcast subtract a with b. + * const a = tf.tensor1d([10, 20, 30, 40]); + * const b = tf.scalar(5); + * + * a.sub(b).print(); // or tf.sub(a, b) + * ``` + * @param a The first `tf.Tensor` to subtract from. + * @param b The second `tf.Tensor` to be subtracted. Must have the same dtype as + * `a`. + * + * @doc {heading: 'Operations', subheading: 'Arithmetic'} + */ +declare function sub_(a: Tensor | TensorLike, b: Tensor | TensorLike): T; + +export declare type SubInputs = BinaryInputs; + +export declare const Sum = "Sum"; + +export declare const sum: typeof sum_; + +/** + * Computes the sum of elements across dimensions of a `tf.Tensor`. + * + * Reduces the input along the dimensions given in `axes`. Unless `keepDims` + * is true, the rank of the `tf.Tensor` is reduced by 1 for each entry in + * `axes`. If `keepDims` is true, the reduced dimensions are retained with + * length 1. If axes has no entries, all dimensions are reduced, and a + * `tf.Tensor` with a single element is returned. + * + * ```js + * const x = tf.tensor1d([1, 2, 3]); + * + * x.sum().print(); // or tf.sum(x) + * ``` + * + * ```js + * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]); + * + * const axis = 1; + * x.sum(axis).print(); // or tf.sum(x, axis) + * ``` + * + * @param x The input tensor to compute the sum over. If the dtype is `bool` + * it will be converted to `int32` and the output dtype will be `int32`. + * @param axis The dimension(s) to reduce. By default it reduces + * all dimensions. + * @param keepDims If true, retains reduced dimensions with size 1. + * + * @doc {heading: 'Operations', subheading: 'Reduction'} + */ +declare function sum_(x: Tensor | TensorLike, axis?: number | number[], keepDims?: boolean): T; + +declare function sum_2(arr: number[]): number; + +export declare interface SumAttrs { + axis: number | number[]; + keepDims: boolean; +} + +export declare type SumInputs = Pick; + +/** Returns the output type after summation. */ +export declare function sumOutType(type: DataType): DataType; + +declare function swap(object: { + [index: number]: T; +}, left: number, right: number): void; + +export declare const Tan = "Tan"; + +export declare const tan: typeof tan_; + +/** + * Computes tan of the input `tf.Tensor` element-wise, `tan(x)` + * + * ```js + * const x = tf.tensor1d([0, Math.PI / 2, Math.PI * 3 / 4]); + * + * x.tan().print(); // or tf.tan(x) + * ``` + * @param x The input tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function tan_(x: T | TensorLike): T; + +export declare const Tanh = "Tanh"; + +export declare const tanh: typeof tanh_; + +/** + * Computes hyperbolic tangent of the input `tf.Tensor` element-wise: `tanh(x)` + * + * ```js + * const x = tf.tensor1d([0, 1, -1, 70]); + * + * x.tanh().print(); // or tf.tanh(x) + * ``` + * @param x The input tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +declare function tanh_(x: T | TensorLike): T; + +declare function tanh_2(x: number): number; + +export declare type TanhInputs = UnaryInputs; + +export declare type TanInputs = UnaryInputs; + +declare interface TapeNode { + id: number; + kernelName: string; + outputs: Tensor[]; + inputs: NamedTensorMap; + gradient?: (dys: Tensor[]) => NamedGradientMap; + saved?: Tensor[]; +} + +export declare namespace Tensor { } + +/** + * A `tf.Tensor` object represents an immutable, multidimensional array of + * numbers that has a shape and a data type. + * + * For performance reasons, functions that create tensors do not necessarily + * perform a copy of the data passed to them (e.g. if the data is passed as a + * `Float32Array`), and changes to the data will change the tensor. This is not + * a feature and is not supported. To avoid this behavior, use the tensor before + * changing the input data or create a copy with `copy = tf.add(yourTensor, 0)`. + * + * See `tf.tensor` for details on how to create a `tf.Tensor`. + * + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ +export declare class Tensor implements TensorInfo { + /** Unique id of this tensor. */ + readonly id: number; + /** + * Id of the bucket holding the data for this tensor. Multiple arrays can + * point to the same bucket (e.g. when calling array.reshape()). + */ + dataId: DataId; + /** The shape of the tensor. */ + readonly shape: ShapeMap[R]; + /** Number of elements in the tensor. */ + readonly size: number; + /** The data type for the array. */ + readonly dtype: DataType; + /** The rank type for the array (see `Rank` enum). */ + readonly rankType: R; + /** Whether this tensor has been globally kept. */ + kept: boolean; + /** The id of the scope this tensor is being tracked in. */ + scopeId: number; + /** + * Number of elements to skip in each dimension when indexing. See + * https://docs.scipy.org/doc/numpy/reference/generated/\ + * numpy.ndarray.strides.html + */ + readonly strides: number[]; + constructor(shape: ShapeMap[R], dtype: DataType, dataId: DataId, id: number); + get rank(): number; + /** + * Returns a promise of `tf.TensorBuffer` that holds the underlying data. + * + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ + buffer(): Promise>; + /** + * Returns a `tf.TensorBuffer` that holds the underlying data. + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ + bufferSync(): TensorBuffer; + /** + * Returns the tensor data as a nested array. The transfer of data is done + * asynchronously. + * + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ + array(): Promise; + /** + * Returns the tensor data as a nested array. The transfer of data is done + * synchronously. + * + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ + arraySync(): ArrayMap[R]; + /** + * Asynchronously downloads the values from the `tf.Tensor`. Returns a + * promise of `TypedArray` that resolves when the computation has finished. + * + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ + data(): Promise; + /** + * Copy the tensor's data to a new GPU resource. Comparing to the `dataSync()` + * and `data()`, this method prevents data from being downloaded to CPU. + * + * For WebGL backend, the data will be stored on a densely packed texture. + * This means that the texture will use the RGBA channels to store value. + * + * For WebGPU backend, the data will be stored on a buffer. There is no + * parameter, so can not use a user-defined size to create the buffer. + * + * @param options: + * For WebGL, + * - customTexShape: Optional. If set, will use the user defined + * texture shape to create the texture. + * + * @returns For WebGL backend, a GPUData contains the new texture and + * its information. + * { + * tensorRef: The tensor that is associated with this texture, + * texture: WebGLTexture, + * texShape: [number, number] // [height, width] + * } + * + * For WebGPU backend, a GPUData contains the new buffer and + * its information. + * { + * tensorRef: The tensor that is associated with this buffer, + * buffer: GPUBuffer, + * bufSize: number + * } + * + * Remember to dispose the GPUData after it is used by + * `res.tensorRef.dispose()`. + * + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ + dataToGPU(options?: DataToGPUOptions): GPUData; + /** + * Synchronously downloads the values from the `tf.Tensor`. This blocks the + * UI thread until the values are ready, which can cause performance issues. + * + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ + dataSync(): DataTypeMap[D]; + /** Returns the underlying bytes of the tensor's data. */ + bytes(): Promise; + /** + * Disposes `tf.Tensor` from memory. + * + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ + dispose(): void; + protected isDisposedInternal: boolean; + get isDisposed(): boolean; + throwIfDisposed(): void; + /** + * Prints the `tf.Tensor`. See `tf.print` for details. + * + * @param verbose Whether to print verbose information about the tensor, + * including dtype and size. + * + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ + print(verbose?: boolean): void; + /** + * Returns a copy of the tensor. See `tf.clone` for details. + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ + clone(this: T): T; + /** + * Returns a human-readable description of the tensor. Useful for logging. + * + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ + toString(verbose?: boolean): string; + cast(dtype: DataType): T; + variable(trainable?: boolean, name?: string, dtype?: DataType): Variable; +} + +/** + * Creates a `tf.Tensor` with the provided values, shape and dtype. + * + * ```js + * // Pass an array of values to create a vector. + * tf.tensor([1, 2, 3, 4]).print(); + * ``` + * + * ```js + * // Pass a nested array of values to make a matrix or a higher + * // dimensional tensor. + * tf.tensor([[1, 2], [3, 4]]).print(); + * ``` + * + * ```js + * // Pass a flat array and specify a shape yourself. + * tf.tensor([1, 2, 3, 4], [2, 2]).print(); + * ``` + * + * ```js + * // Pass a `WebGLData` object and specify a shape yourself. + * + * // This makes it possible for TF.js applications to avoid GPU / CPU sync. + * // For example, if your application includes a preprocessing step on the GPU, + * // you could upload the GPU output directly to TF.js, rather than first + * // downloading the values. + * + * // Example for WebGL2: + * const customCanvas = document.createElement('canvas'); + * const customBackend = new tf.MathBackendWebGL(customCanvas); + * tf.registerBackend('custom-webgl', () => customBackend); + * await tf.setBackend('custom-webgl'); + * const gl = customBackend.gpgpu.gl; + * const texture = gl.createTexture(); + * const tex2d = gl.TEXTURE_2D; + * const width = 2; + * const height = 2; + * + * gl.bindTexture(tex2d, texture); + * gl.texParameteri(tex2d, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + * gl.texParameteri(tex2d, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + * gl.texParameteri(tex2d, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + * gl.texParameteri(tex2d, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + * gl.texImage2D( + * tex2d, 0, gl.RGBA32F, // internalFormat + * width, height, 0, + * gl.RGBA, // textureFormat + * gl.FLOAT, // textureType + * new Float32Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]) + * ); + * + * // Currently, the `texture` has 4 pixels: + * // Pixel0 is {R:0, G:1, B:2, A:3} + * // Pixel1 is {R:4, G:5, B:6, A:7} + * // Pixel2 is {R:8, G:9, B:10, A:11} + * // Pixel3 is {R:12, G:13, B:14, A:15} + * + * const logicalShape = [height * width * 2]; + * const a = tf.tensor({texture, height, width, channels: 'BR'}, logicalShape); + * // Tensor value will be [2, 0, 6, 4, 10, 8, 14, 12], since [2, 0] is the + * // values of 'B' and 'R' channels of Pixel0, [6, 4] is the values of 'B' and + * 'R' + * // channels of Pixel1... + * + * // For postprocessing on the GPU, it's possible to retrieve the texture + * // backing any tensor by calling the tensor's `dataToGPU` method like + * // so: + * + * const tex = a.dataToGPU(); + * ``` + * @param values The values of the tensor. Can be nested array of numbers, + * or a flat array, or a `TypedArray`, or a `WebGLData` object. If the + * values are strings, they will be encoded as utf-8 and kept as `Uint8Array[]`. + * If the values is a `WebGLData` object, the dtype could only be 'float32' or + * 'int32' and the object has to have: 1. texture, a `WebGLTexture`, the texture + * must share the same `WebGLRenderingContext` with TFJS's WebGL backend (you + * could create a custom WebGL backend from your texture's canvas) and the + * internal texture format for the input texture must be floating point or + * normalized integer; 2. height, the height of the texture; 3. width, the width + * of the texture; 4. channels, a non-empty subset of 'RGBA', indicating the + * values of which channels will be passed to the tensor, such as 'R' or 'BR' + * (The order of the channels affect the order of tensor values. ). (If the + * values passed from texture is less than the tensor size, zeros will be padded + * at the rear.) + * @param shape The shape of the tensor. Optional. If not provided, + * it is inferred from `values`. + * @param dtype The data type. + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ +export declare function tensor(values: TensorLike | WebGLData, shape?: ShapeMap[R], dtype?: DataType): Tensor; + +/** @doclink Tensor */ +export declare type Tensor1D = Tensor; + +/** + * Creates rank-1 `tf.Tensor` with the provided values, shape and dtype. + * + * The same functionality can be achieved with `tf.tensor`, but in general + * we recommend using `tf.tensor1d` as it makes the code more readable. + * + * ```js + * tf.tensor1d([1, 2, 3]).print(); + * ``` + * + * @param values The values of the tensor. Can be array of numbers, + * or a `TypedArray`. + * @param dtype The data type. + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ +export declare function tensor1d(values: TensorLike1D, dtype?: DataType): Tensor1D; + +/** @doclink Tensor */ +export declare type Tensor2D = Tensor; + +/** + * Creates rank-2 `tf.Tensor` with the provided values, shape and dtype. + * + * The same functionality can be achieved with `tf.tensor`, but in general + * we recommend using `tf.tensor2d` as it makes the code more readable. + * + * ```js + * // Pass a nested array. + * tf.tensor2d([[1, 2], [3, 4]]).print(); + * ``` + * ```js + * // Pass a flat array and specify a shape. + * tf.tensor2d([1, 2, 3, 4], [2, 2]).print(); + * ``` + * + * @param values The values of the tensor. Can be nested array of numbers, + * or a flat array, or a `TypedArray`. + * @param shape The shape of the tensor. If not provided, it is inferred from + * `values`. + * @param dtype The data type. + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ +export declare function tensor2d(values: TensorLike2D, shape?: [number, number], dtype?: DataType): Tensor2D; + +/** @doclink Tensor */ +export declare type Tensor3D = Tensor; + +/** + * Creates rank-3 `tf.Tensor` with the provided values, shape and dtype. + * + * The same functionality can be achieved with `tf.tensor`, but in general + * we recommend using `tf.tensor3d` as it makes the code more readable. + * + * ```js + * // Pass a nested array. + * tf.tensor3d([[[1], [2]], [[3], [4]]]).print(); + * ``` + * ```js + * // Pass a flat array and specify a shape. + * tf.tensor3d([1, 2, 3, 4], [2, 2, 1]).print(); + * ``` + * + * @param values The values of the tensor. Can be nested array of numbers, + * or a flat array, or a `TypedArray`. + * @param shape The shape of the tensor. If not provided, it is inferred from + * `values`. + * @param dtype The data type. + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ +export declare function tensor3d(values: TensorLike3D, shape?: [number, number, number], dtype?: DataType): Tensor3D; + +/** @doclink Tensor */ +export declare type Tensor4D = Tensor; + +/** + * Creates rank-4 `tf.Tensor` with the provided values, shape and dtype. + * + * The same functionality can be achieved with `tf.tensor`, but in general + * we recommend using `tf.tensor4d` as it makes the code more readable. + * + * ```js + * // Pass a nested array. + * tf.tensor4d([[[[1], [2]], [[3], [4]]]]).print(); + * ``` + * ```js + * // Pass a flat array and specify a shape. + * tf.tensor4d([1, 2, 3, 4], [1, 2, 2, 1]).print(); + * ``` + * + * @param values The values of the tensor. Can be nested array of numbers, + * or a flat array, or a `TypedArray`. + * @param shape The shape of the tensor. Optional. If not provided, + * it is inferred from `values`. + * @param dtype The data type. + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ +export declare function tensor4d(values: TensorLike4D, shape?: [number, number, number, number], dtype?: DataType): Tensor4D; + +/** @doclink Tensor */ +export declare type Tensor5D = Tensor; + +/** + * Creates rank-5 `tf.Tensor` with the provided values, shape and dtype. + * + * The same functionality can be achieved with `tf.tensor`, but in general + * we recommend using `tf.tensor5d` as it makes the code more readable. + * + * ```js + * // Pass a nested array. + * tf.tensor5d([[[[[1],[2]],[[3],[4]]],[[[5],[6]],[[7],[8]]]]]).print(); + * ``` + * ```js + * // Pass a flat array and specify a shape. + * tf.tensor5d([1, 2, 3, 4, 5, 6, 7, 8], [1, 2, 2, 2, 1]).print(); + * ``` + * + * @param values The values of the tensor. Can be nested array of numbers, + * or a flat array, or a `TypedArray`. + * @param shape The shape of the tensor. Optional. If not provided, + * it is inferred from `values`. + * @param dtype The data type. + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ +export declare function tensor5d(values: TensorLike5D, shape?: [number, number, number, number, number], dtype?: DataType): Tensor5D; + +/** @doclink Tensor */ +declare type Tensor6D = Tensor; + +/** + * Creates rank-6 `tf.Tensor` with the provided values, shape and dtype. + * + * The same functionality can be achieved with `tf.tensor`, but in general + * we recommend using `tf.tensor6d` as it makes the code more readable. + * + * ```js + * // Pass a nested array. + * tf.tensor6d([[[[[[1],[2]],[[3],[4]]],[[[5],[6]],[[7],[8]]]]]]).print(); + * ``` + * ```js + * // Pass a flat array and specify a shape. + * tf.tensor6d([1, 2, 3, 4, 5, 6, 7, 8], [1, 1, 2, 2, 2, 1]).print(); + * ``` + * + * @param values The values of the tensor. Can be nested array of numbers, + * or a flat array, or a `TypedArray`. + * @param shape The shape of the tensor. Optional. If not provided, + * it is inferred from `values`. + * @param dtype The data type. + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ +export declare function tensor6d(values: TensorLike6D, shape?: [number, number, number, number, number, number], dtype?: DataType): Tensor6D; + +declare namespace tensor_util { + export { + makeTypesMatch, + assertTypesMatch, + isTensorInList, + getTensorsInContainer + } +} +export { tensor_util } + +/** + * A mutable object, similar to `tf.Tensor`, that allows users to set values + * at locations before converting to an immutable `tf.Tensor`. + * + * See `tf.buffer` for creating a tensor buffer. + * + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ +export declare class TensorBuffer { + dtype: D; + size: number; + shape: ShapeMap[R]; + strides: number[]; + values: DataTypeMap[D]; + constructor(shape: ShapeMap[R], dtype: D, values?: DataTypeMap[D]); + /** + * Sets a value in the buffer at a given location. + * + * @param value The value to set. + * @param locs The location indices. + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ + set(value: SingleValueMap[D], ...locs: number[]): void; + /** + * Returns the value in the buffer at the provided location. + * + * @param locs The location indices. + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ + get(...locs: number[]): SingleValueMap[D]; + locToIndex(locs: number[]): number; + indexToLoc(index: number): number[]; + get rank(): number; + /** + * Creates an immutable `tf.Tensor` object from the buffer. + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ + toTensor(): Tensor; +} + +/** + * @docalias void|number|string|TypedArray|Tensor|Tensor[]|{[key: + * string]:Tensor|number|string} + */ +export declare type TensorContainer = void | Tensor | string | number | boolean | TensorContainerObject | TensorContainerArray | Float32Array | Int32Array | Uint8Array; + +export declare interface TensorContainerArray extends Array { +} + +export declare interface TensorContainerObject { + [x: string]: TensorContainer; +} + +/** Holds metadata for a given tensor. */ +export declare interface TensorInfo { + dataId: DataId; + shape: number[]; + dtype: DataType; +} + +/** @docalias TypedArray|Array */ +export declare type TensorLike = TypedArray | number | boolean | string | RecursiveArray | RecursiveArray | RecursiveArray | Uint8Array[]; + +/** @docalias TypedArray|Array */ +declare type TensorLike1D = TypedArray | number[] | boolean[] | string[] | Uint8Array[]; + +/** @docalias TypedArray|Array */ +declare type TensorLike2D = TypedArray | number[] | number[][] | boolean[] | boolean[][] | string[] | string[][] | Uint8Array[] | Uint8Array[][]; + +/** @docalias TypedArray|Array */ +declare type TensorLike3D = TypedArray | number[] | number[][][] | boolean[] | boolean[][][] | string[] | string[][][] | Uint8Array[] | Uint8Array[][][]; + +/** @docalias TypedArray|Array */ +declare type TensorLike4D = TypedArray | number[] | number[][][][] | boolean[] | boolean[][][][] | string[] | string[][][][] | Uint8Array[] | Uint8Array[][][][]; + +/** @docalias TypedArray|Array */ +declare type TensorLike5D = TypedArray | number[] | number[][][][][] | boolean[] | boolean[][][][][] | string[] | string[][][][][] | Uint8Array[] | Uint8Array[][][][][]; + +/** @docalias TypedArray|Array */ +declare type TensorLike6D = TypedArray | number[] | number[][][][][][] | boolean[] | boolean[][][][][][] | string[] | string[][][][][][] | Uint8Array[] | Uint8Array[][][][][]; + +declare interface TensorStorage { + read(dataId: DataId): Promise; + readSync(dataId: DataId): BackendValues; + disposeData(dataId: DataId, force?: boolean): boolean; + write(values: BackendValues, shape: number[], dtype: DataType): DataId; + move(dataId: DataId, values: BackendValues, shape: number[], dtype: DataType, refCount: number): void; + memory(): { + unreliable: boolean; + }; + /** Returns number of data ids currently in the storage. */ + numDataIds(): number; + refCount(dataId: DataId): number; +} + +declare interface TensorTracker { + makeTensor(values: DataValues, shape: number[], dtype: DataType, backend?: Backend): Tensor; + makeVariable(initialValue: Tensor, trainable?: boolean, name?: string, dtype?: DataType): Variable; + incRef(a: Tensor, backend: Backend): void; + disposeTensor(t: Tensor): void; + disposeVariable(v: Variable): void; + read(dataId: DataId): Promise; + readSync(dataId: DataId): BackendValues; + readToGPU(dataId: DataId, options?: DataToGPUOptions): GPUData; +} + +declare const TEST_EPSILON_FLOAT16 = 0.1; + +declare namespace test_util { + export { + expectArraysClose, + testEpsilon, + expectPromiseToFail, + expectArraysEqual, + expectNumbersClose, + expectValuesInRange, + expectArrayBuffersEqual, + encodeStrings, + createVideoElement, + play, + TEST_EPSILON_FLOAT16, + DoneFn_2 as DoneFn + } +} +export { test_util } + +declare function testEpsilon(): 0.001 | 0.1; + +/** + * Executes the provided function `fn` and after it is executed, cleans up all + * intermediate tensors allocated by `fn` except those returned by `fn`. + * `fn` must not return a Promise (async functions not allowed). The returned + * result can be a complex object. + * + * Using this method helps avoid memory leaks. In general, wrap calls to + * operations in `tf.tidy` for automatic memory cleanup. + * + * NOTE: Variables do *not* get cleaned up when inside a tidy(). If you want to + * dispose variables, please use `tf.disposeVariables` or call dispose() + * directly on variables. + * + * ```js + * // y = 2 ^ 2 + 1 + * const y = tf.tidy(() => { + * // a, b, and one will be cleaned up when the tidy ends. + * const one = tf.scalar(1); + * const a = tf.scalar(2); + * const b = a.square(); + * + * console.log('numTensors (in tidy): ' + tf.memory().numTensors); + * + * // The value returned inside the tidy function will return + * // through the tidy, in this case to the variable y. + * return b.add(one); + * }); + * + * console.log('numTensors (outside tidy): ' + tf.memory().numTensors); + * y.print(); + * ``` + * + * @param nameOrFn The name of the closure, or the function to execute. + * If a name is provided, the 2nd argument should be the function. + * If debug mode is on, the timing and the memory usage of the function + * will be tracked and displayed on the console using the provided name. + * @param fn The function to execute. + * + * @doc {heading: 'Performance', subheading: 'Memory'} + */ +export declare function tidy(nameOrFn: string | ScopeFn, fn?: ScopeFn): T; + +export declare const Tile = "Tile"; + +export declare const tile: typeof tile_; + +/** + * Construct a tensor by repeating it the number of times given by reps. + * + * This operation creates a new tensor by replicating `input` `reps` + * times. The output tensor's `i`th dimension has `input.shape[i] * + * reps[i]` elements, and the values of `input` are replicated + * `reps[i]` times along the `i`th dimension. For example, tiling + * `[a, b, c, d]` by `[2]` produces `[a, b, c, d, a, b, c, d]`. + * + * ```js + * const a = tf.tensor1d([1, 2]); + * + * a.tile([2]).print(); // or a.tile([2]) + * ``` + * + * ```js + * const a = tf.tensor2d([1, 2, 3, 4], [2, 2]); + * + * a.tile([1, 2]).print(); // or a.tile([1, 2]) + * ``` + * @param x The tensor to tile. + * @param reps Determines the number of replications per dimension. + * + * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'} + */ +declare function tile_(x: T | TensorLike, reps: number[]): T; + +export declare interface TileAttrs { + reps: number[]; +} + +export declare type TileInputs = Pick; + +/** + * Executes `f()` and returns a promise that resolves with timing + * information. + * + * The result is an object with the following properties: + * + * - `wallMs`: Wall execution time. + * - `kernelMs`: Kernel execution time, ignoring data transfer. If using the + * WebGL backend and the query timer extension is not available, this will + * return an error object. + * - On `WebGL` The following additional properties exist: + * - `uploadWaitMs`: CPU blocking time on texture uploads. + * - `downloadWaitMs`: CPU blocking time on texture downloads (readPixels). + * + * ```js + * const x = tf.randomNormal([20, 20]); + * const time = await tf.time(() => x.matMul(x)); + * + * console.log(`kernelMs: ${time.kernelMs}, wallTimeMs: ${time.wallMs}`); + * ``` + * + * @param f The function to execute and time. + * + * @doc {heading: 'Performance', subheading: 'Timing'} + */ +export declare function time(f: () => void): Promise; + +export declare interface TimingInfo extends BackendTimingInfo { + wallMs: number; +} + +declare function toNestedArray(shape: number[], a: TypedArray, isComplex?: boolean): number | any[]; + +/** + * Draws a `tf.Tensor` of pixel values to a byte array or optionally a + * canvas. + * + * When the dtype of the input is 'float32', we assume values in the range + * [0-1]. Otherwise, when input is 'int32', we assume values in the range + * [0-255]. + * + * Returns a promise that resolves when the canvas has been drawn to. + * + * @param img A rank-2 tensor with shape `[height, width]`, or a rank-3 tensor + * of shape `[height, width, numChannels]`. If rank-2, draws grayscale. If + * rank-3, must have depth of 1, 3 or 4. When depth of 1, draws + * grayscale. When depth of 3, we draw with the first three components of + * the depth dimension corresponding to r, g, b and alpha = 1. When depth of + * 4, all four components of the depth dimension correspond to r, g, b, a. + * @param canvas The canvas to draw to. + * + * @doc {heading: 'Browser', namespace: 'browser'} + */ +declare function toPixels(img: Tensor2D | Tensor3D | TensorLike, canvas?: HTMLCanvasElement): Promise; + +export declare const TopK = "TopK"; + +export declare const topk: typeof topk_; + +/** + * Finds the values and indices of the `k` largest entries along the last + * dimension. + * + * If the input is a vector (rank=1), finds the k largest entries in the vector + * and outputs their values and indices as vectors. Thus values[j] is the j-th + * largest entry in input, and its index is indices[j]. + * For higher rank inputs, computes the top k entries along the last dimension. + * + * If two elements are equal, the lower-index element appears first. + * + * ```js + * const a = tf.tensor2d([[1, 5], [4, 3]]); + * const {values, indices} = tf.topk(a); + * values.print(); + * indices.print(); + * ``` + * @param x 1-D or higher `tf.Tensor` with last dimension being at least `k`. + * @param k Number of top elements to look for along the last dimension. + * @param sorted If true, the resulting `k` elements will be sorted by the + * values in descending order. + * + * @doc {heading: 'Operations', subheading: 'Evaluation'} + */ +declare function topk_(x: T | TensorLike, k?: number, sorted?: boolean): { + values: T; + indices: T; +}; + +export declare interface TopKAttrs { + k: number; + sorted: boolean; +} + +export declare type TopKInputs = Pick; + +declare function toTypedArray(a: TensorLike, dtype: DataType): TypedArray; + +export declare const train: { + sgd: typeof OptimizerConstructors.sgd; + momentum: typeof OptimizerConstructors.momentum; + adadelta: typeof OptimizerConstructors.adadelta; + adagrad: typeof OptimizerConstructors.adagrad; + rmsprop: typeof OptimizerConstructors.rmsprop; + adamax: typeof OptimizerConstructors.adamax; + adam: typeof OptimizerConstructors.adam; +}; + +/** Model training configuration. */ +declare interface TrainingConfig { + /** Optimizer used for the model training. */ + optimizer_config: {}; + /** Loss function(s) for the model's output(s). */ + loss: string | string[] | { + [key: string]: string; + }; + /** Metric function(s) for the model's output(s). */ + metrics?: string[] | { + [key: string]: string; + }; + weighted_metrics?: string[]; + sample_weight_mode?: string; + loss_weights?: number[] | { + [key: string]: number; + }; +} + +export declare const Transform = "Transform"; + +export declare interface TransformAttrs { + interpolation: 'nearest' | 'bilinear'; + fillMode: 'constant' | 'reflect' | 'wrap' | 'nearest'; + fillValue: number; + outputShape?: [number, number]; +} + +export declare type TransformInputs = Pick; + +export declare const Transpose = "Transpose"; + +export declare const transpose: typeof transpose_; + +/** + * Transposes the `tf.Tensor`. Permutes the dimensions according to `perm`. + * + * The returned `tf.Tensor`'s dimension `i` will correspond to the input + * dimension `perm[i]`. If `perm` is not given, it is set to `[n-1...0]`, + * where `n` is the rank of the input `tf.Tensor`. Hence by default, this + * operation performs a regular matrix transpose on 2-D input `tf.Tensor`s. + * + * ```js + * const a = tf.tensor2d([1, 2, 3, 4, 5, 6], [2, 3]); + * + * a.transpose().print(); // or tf.transpose(a) + * ``` + * + * @param x The tensor to transpose. + * @param perm The permutation of the dimensions of a. + * @param conjugate Will conjugate complex input if true. + * + * @doc {heading: 'Operations', subheading: 'Matrices'} + */ +declare function transpose_(x: T | TensorLike, perm?: number[], conjugate?: boolean): T; + +export declare interface TransposeAttrs { + perm: number[]; +} + +export declare type TransposeInputs = Pick; + +export declare const truncatedNormal: typeof truncatedNormal_; + +/** + * Creates a `tf.Tensor` with values sampled from a truncated normal + * distribution. + * + * ```js + * tf.truncatedNormal([2, 2]).print(); + * ``` + * + * The generated values follow a normal distribution with specified mean and + * standard deviation, except that values whose magnitude is more than 2 + * standard deviations from the mean are dropped and re-picked. + * + * @param shape An array of integers defining the output tensor shape. + * @param mean The mean of the normal distribution. + * @param stdDev The standard deviation of the normal distribution. + * @param dtype The data type of the output tensor. + * @param seed The seed for the random number generator. + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ +declare function truncatedNormal_(shape: ShapeMap[R], mean?: number, stdDev?: number, dtype?: 'float32' | 'int32', seed?: number): Tensor; + +declare function tupleValuesAreOne(param: number | number[]): boolean; + +export declare type TypedArray = Float32Array | Int32Array | Uint8Array; + +export declare type UnaryInputs = Pick; + +export declare const Unique = "Unique"; + +export declare const unique: typeof unique_; + +/** + * Finds unique elements along an axis of a tensor. + * + * It returns a tensor `values` containing all of the unique elements along the + * `axis` of the given tensor `x` in the same order that they occur along the + * `axis` in `x`; `x` does not need to be sorted. It also returns a tensor + * `indices` the same size as the number of the elements in `x` along the `axis` + * dimension. It contains the index in the unique output `values`. + * + * ```js + * // A 1-D tensor + * const a = tf.tensor1d([1, 1, 2, 4, 4, 4, 7, 8, 8]); + * const {values, indices} = tf.unique(a); + * values.print(); // [1, 2, 4, 7, 8,] + * indices.print(); // [0, 0, 1, 2, 2, 2, 3, 4, 4] + * ``` + * + * ```js + * // A 2-D tensor with axis=0 + * // + * // 'a' is: [[1, 0, 0], + * // [1, 0, 0], + * // [2, 0, 0]] + * const a = tf.tensor2d([[1, 0, 0], [1, 0, 0], [2, 0, 0]]); + * const {values, indices} = tf.unique(a, 0) + * values.print(); // [[1, 0, 0], + * // [2, 0, 0]] + * indices.print(); // [0, 0, 1] + * ``` + * + * ```js + * // A 2-D tensor with axis=1 + * // + * // 'a' is: [[1, 0, 0], + * // [1, 0, 0], + * // [2, 0, 0]] + * const a = tf.tensor2d([[1, 0, 0], [1, 0, 0], [2, 0, 0]]); + * const {values, indices} = tf.unique(a, 1) + * values.print(); // [[1, 0], + * // [1, 0], + * // [2, 0]] + * indices.print(); // [0, 1, 1] + * ``` + * @param x A tensor (int32, string, bool). + * @param axis The axis of the tensor to find the unique elements. + * @returns [uniqueElements, indices] (see above for details) + * + * @doc {heading: 'Operations', subheading: 'Evaluation'} + */ +declare function unique_(x: T | TensorLike, axis?: number): { + values: T; + indices: Tensor1D; +}; + +export declare interface UniqueAttrs { + axis: number; +} + +export declare type UniqueInputs = Pick; + +export declare const Unpack = "Unpack"; + +export declare interface UnpackAttrs { + axis: number; +} + +export declare type UnpackInputs = Pick; + +/** Removes the registered gradient from the global registry. */ +export declare function unregisterGradient(kernelName: string): void; + +/** + * Removes the kernel function from the registry. + * + * @param kernelName The official name of the kernel. + * @param backendName The official name of the backend. + * + */ +export declare function unregisterKernel(kernelName: string, backendName: string): void; + +export declare const UnsortedSegmentSum = "UnsortedSegmentSum"; + +export declare const unsortedSegmentSum: typeof unsortedSegmentSum_; + +/** + * Computes the sum along segments of a `tf.Tensor`. + * + * ```js + * const x = tf.tensor1d([1, 2, 3, 4]); + * const segmentIds = tf.tensor1d([1, 2, 0, 1], 'int32'); + * const numSegments = 3; + * + * x.unsortedSegmentSum(segmentIds, numSegments).print() + * //or tf.unsortedSegmentSum(x, segmentIds, numSegments) + * ``` + * @param x The `tf.Tensor` that will be summed along its segments. + * @param segmentIds A `tf.Tensor1D` whose rank is equal to the rank of `x`'s + * dimension along the `axis`. Maps each element of `x` to a segment. + * @param numSegments The number of distinct `segmentIds`. + * + * @doc {heading: 'Operations', subheading: 'Segment'} + */ +declare function unsortedSegmentSum_(x: T | TensorLike, segmentIds: Tensor1D | TensorLike, numSegments: number): T; + +export declare interface UnsortedSegmentSumAttrs { + numSegments: number; +} + +export declare type UnsortedSegmentSumInputs = Pick; + +export declare const unstack: typeof unstack_; + +/** + * Unstacks a `tf.Tensor` of rank-`R` into a list of rank-`(R-1)` `tf.Tensor`s. + * + * ```js + * const a = tf.tensor2d([1, 2, 3, 4], [2, 2]); + * + * tf.unstack(a).forEach(tensor => tensor.print()); + * ``` + * + * @param x A tensor object. + * @param axis The axis to unstack along. Defaults to 0 (the first dim). + * + * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'} + */ +declare function unstack_(x: Tensor | TensorLike, axis?: number): Tensor[]; + +export declare function upcastType(typeA: DataType, typeB: DataType): DataType; + +export declare const UpperBound = "UpperBound"; + +/** + * Searches for where a value would go in a sorted sequence. + * + * This is not a method for checking containment (like javascript in). + * + * The typical use case for this operation is "binning", "bucketing", or + * "discretizing". The values are assigned to bucket-indices based on the edges + * listed in 'sortedSequence'. This operation returns the bucket-index for each + * value. + * + * The index returned corresponds to the first edge greater than the value. + * + * The axis is not settable for this operation. It always operates on the + * innermost dimension (axis=-1). The operation will accept any number of outer + * dimensions. + * + * Note: This operation assumes that 'upperBound' is sorted along the + * innermost axis, maybe using 'sort(..., axis=-1)'. If the sequence is not + * sorted no error is raised and the content of the returned tensor is not well + * defined. + * + * ```js + * const seq = tf.tensor1d([0, 3, 9, 10, 10]); + * const values = tf.tensor1d([0, 4, 10]); + * const result = tf.upperBound(seq, values); + * result.print(); // [1, 2, 5] + * ``` + * @param sortedSequence: N-D. Sorted sequence. + * @param values: N-D. Search values. + * @return An N-D int32 tensor the size of values containing the result of + * applying upper bound to each value. The result is not a global index to + * the entire Tensor, but the index in the last dimension. + * @doc {heading: 'Operations', subheading: 'Evaluation'} + */ +export declare function upperBound(sortedSequence: Tensor | TensorLike, values: Tensor | TensorLike): Tensor; + +export declare type UpperBoundInputs = Pick; + +declare namespace util { + export { + createScalarValue, + toTypedArray, + now, + fetch_2 as fetch, + encodeString, + decodeString, + shuffle, + shuffleCombo, + clamp, + nearestLargerEven, + swap, + sum_2 as sum, + randUniform, + distSquared, + assert, + assertShapesMatch, + assertNonNull, + flatten, + sizeFromShape, + isScalarShape, + arraysEqual, + isInt, + tanh_2 as tanh, + sizeToSquarishShape, + createShuffledIndices, + rightPad, + repeatedTry, + inferFromImplicitShape, + parseAxisParam, + squeezeShape, + getTypedArrayFromDType, + getArrayFromDType, + checkConversionForErrors, + isValidDtype, + hasEncodingLoss, + isTypedArray, + bytesPerElement, + bytesFromStringArray, + isString, + isBoolean, + isNumber, + inferDtype, + isFunction, + nearestDivisor, + computeStrides, + toNestedArray, + makeOnesTypedArray, + makeZerosTypedArray, + makeZerosNestedTypedArray, + assertNonNegativeIntegerDimensions, + locToIndex, + indexToLoc, + isPromise, + hexToLong, + fingerPrint64 + } +} +export { util } + +declare function validateDefaultValueShape(defaultValueShape: number[], valueShape: number[]): void; + +/** + * Validate scatter nd inputs. + * + * @param update The tensor contains the update values. + * @param indices The tensor contains the indices for the update values. + * @param shape The shape of the output tensor. + */ +declare function validateInput(updates: Tensor, indices: Tensor, shape: number[]): void; + +/** + * Check whether updates.shape = indices.shape[:batchDim] + + * shape[sliceDim:] + * + * @param x The input tensor. + */ +declare function validateUpdateShape(shape: number[], indices: Tensor, updates: Tensor): void; + +/** + * Like `tf.grad`, but also returns the value of `f()`. Useful when `f()` + * returns a metric you want to show. + * + * The result is a rich object with the following properties: + * - grad: The gradient of `f(x)` w.r.t. `x` (result of `tf.grad`). + * - value: The value returned by `f(x)`. + * + * ```js + * // f(x) = x ^ 2 + * const f = x => x.square(); + * // f'(x) = 2x + * const g = tf.valueAndGrad(f); + * + * const x = tf.tensor1d([2, 3]); + * const {value, grad} = g(x); + * + * console.log('value'); + * value.print(); + * console.log('grad'); + * grad.print(); + * ``` + * + * @doc {heading: 'Training', subheading: 'Gradients'} + */ +export declare function valueAndGrad(f: (x: I) => O): (x: I, dy?: O) => { + value: O; + grad: I; +}; + +/** + * Like `tf.grads`, but returns also the value of `f()`. Useful when `f()` + * returns a metric you want to show. + * + * The result is a rich object with the following properties: + * - grads: The gradients of `f()` w.r.t. each input (result of `tf.grads`). + * - value: The value returned by `f(x)`. + * + * ```js + * // f(a, b) = a * b + * const f = (a, b) => a.mul(b); + * // df/da = b, df/db = a + * const g = tf.valueAndGrads(f); + * + * const a = tf.tensor1d([2, 3]); + * const b = tf.tensor1d([-2, -3]); + * const {value, grads} = g([a, b]); + * + * const [da, db] = grads; + * + * console.log('value'); + * value.print(); + * + * console.log('da'); + * da.print(); + * console.log('db'); + * db.print(); + * ``` + * + * @doc {heading: 'Training', subheading: 'Gradients'} + */ +export declare function valueAndGrads(f: (...args: Tensor[]) => O): (args: Tensor[], dy?: O) => { + grads: Tensor[]; + value: O; +}; + +/** + * A mutable `tf.Tensor`, useful for persisting state, e.g. for training. + * + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ +export declare class Variable extends Tensor { + trainable: boolean; + name: string; + constructor(initialValue: Tensor, trainable: boolean, name: string, tensorId: number); + /** + * Assign a new `tf.Tensor` to this variable. The new `tf.Tensor` must have + * the same shape and dtype as the old `tf.Tensor`. + * + * @param newValue New tensor to be assigned to this variable. + * + * @doc {heading: 'Tensors', subheading: 'Classes'} + */ + assign(newValue: Tensor): void; + dispose(): void; +} + +/** + * Creates a new variable with the provided initial value. + * ```js + * const x = tf.variable(tf.tensor([1, 2, 3])); + * x.assign(tf.tensor([4, 5, 6])); + * + * x.print(); + * ``` + * + * @param initialValue Initial value for the tensor. + * @param trainable If true, optimizers are allowed to update it. + * @param name Name of the variable. Defaults to a unique id. + * @param dtype If set, initialValue will be converted to the given type. + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ +export declare function variable(initialValue: Tensor, trainable?: boolean, name?: string, dtype?: DataType): Variable; + +/** + * Computes and returns the gradient of f(x) with respect to the list of + * trainable variables provided by `varList`. If no list is provided, it + * defaults to all trainable variables. + * + * ```js + * const a = tf.variable(tf.tensor1d([3, 4])); + * const b = tf.variable(tf.tensor1d([5, 6])); + * const x = tf.tensor1d([1, 2]); + * + * // f(a, b) = a * x ^ 2 + b * x + * const f = () => a.mul(x.square()).add(b.mul(x)).sum(); + * // df/da = x ^ 2, df/db = x + * const {value, grads} = tf.variableGrads(f); + * + * Object.keys(grads).forEach(varName => grads[varName].print()); + * ``` + * + * @param f The function to execute. f() should return a scalar. + * @param varList The list of variables to compute the gradients with respect + * to. Defaults to all trainable variables. + * @returns An object with the following keys and values: + * - `value`: The value of the function `f`. + * - `grads`: A map from the names of the variables to the gradients. + * If the `varList` argument is provided explicitly and contains a subset of + * non-trainable variables, this map in the return value will contain keys + * that map the names of the non-trainable variables to `null`. + * + * @doc {heading: 'Training', subheading: 'Gradients'} + */ +export declare function variableGrads(f: () => Scalar, varList?: Variable[]): { + value: Scalar; + grads: NamedTensorMap; +}; + +/** @license See the LICENSE file. */ +export declare const version_core = "0.0.0"; + +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +declare function warn(...msg: Array<{}>): void; + +/** + * Type for representing all permutations and combinations of 'RGBA' channels. + */ +declare type WebGLChannels = 'A' | 'B' | 'G' | 'R' | 'AB' | 'AG' | 'AR' | 'BA' | 'BG' | 'BR' | 'GA' | 'GB' | 'GR' | 'RA' | 'RB' | 'RG' | 'ABG' | 'ABR' | 'AGB' | 'AGR' | 'ARB' | 'ARG' | 'BAG' | 'BAR' | 'BGA' | 'BGR' | 'BRA' | 'BRG' | 'GAB' | 'GAR' | 'GBA' | 'GBR' | 'GRA' | 'GRB' | 'RAB' | 'RAG' | 'RBA' | 'RBG' | 'RGA' | 'RGB' | 'ABGR' | 'ABRG' | 'AGBR' | 'AGRB' | 'ARBG' | 'ARGB' | 'BAGR' | 'BARG' | 'BGAR' | 'BGRA' | 'BRAG' | 'BRGA' | 'GABR' | 'GARB' | 'GBAR' | 'GBRA' | 'GRAB' | 'GRBA' | 'RABG' | 'RAGB' | 'RBAG' | 'RBGA' | 'RGAB' | 'RGBA'; + +/** Type for representing a texture data to create a tensor. */ +export declare interface WebGLData { + texture: WebGLTexture; + height: number; + width: number; + channels: WebGLChannels; +} + +/** + * Group to which the weight belongs. + * + * - 'optimizer': Weight from a stateful optimizer. + */ +declare type WeightGroup = 'model' | 'optimizer'; + +/** + * Creates a function, which reads a weights manifest JSON configuration, + * fetches the weight files using the specified function and returns them as + * `Tensor`s. + * + * ```js + * // example for creating a nodejs weight loader, which reads the weight files + * // from disk using fs.readFileSync + * + * import * as fs from 'fs' + * + * const fetchWeightsFromDisk = (filePaths: string[]) => + * filePaths.map(filePath => fs.readFileSync(filePath).buffer) + * + * const loadWeights = tf.io.weightsLoaderFactory(fetchWeightsFromDisk) + * + * const manifest = JSON.parse( + * fs.readFileSync('./my_model-weights_manifest').toString() + * ) + * const weightMap = await loadWeights(manifest, './') + * ``` + * @param fetchWeightsFunction The function used for fetching the weight files. + * @returns Weight loading function. + */ +declare function weightsLoaderFactory(fetchWeightsFunction: (fetchUrls: string[]) => Promise): (manifest: WeightsManifestConfig, filePathPrefix?: string, weightNames?: string[]) => Promise; + +/** + * A weight manifest. + * + * The weight manifest consists of an ordered list of weight-manifest groups. + * Each weight-manifest group ("group" for short hereafter) consists of a + * number of weight values stored in a number of paths. + * See the documentation of `WeightManifestGroupConfig` below for more details. + */ +declare type WeightsManifestConfig = WeightsManifestGroupConfig[]; + +/** + * An entry in the weight manifest. + * + * The entry contains specification of a weight. + */ +declare interface WeightsManifestEntry { + /** + * Name of the weight, e.g., 'Dense_1/bias' + */ + name: string; + /** + * Shape of the weight. + */ + shape: number[]; + /** + * Data type of the weight. + */ + dtype: 'float32' | 'int32' | 'bool' | 'string' | 'complex64'; + /** + * Type of the weight. + * + * Optional. + * + * The value 'optimizer' indicates the weight belongs to an optimizer + * (i.e., used only during model training and not during inference). + */ + group?: WeightGroup; + /** + * Information for dequantization of the weight. + */ + quantization?: { + scale?: number; + min?: number; + dtype: 'uint16' | 'uint8' | 'float16'; + }; +} + +/** + * A weight-manifest group. + * + * Consists of an ordered list of weight values encoded in binary format, + * stored in an ordered list of paths. + */ +declare interface WeightsManifestGroupConfig { + /** + * An ordered list of paths. + * + * Paths are intentionally abstract in order to be general. For example, they + * can be relative URL paths or relative paths on the file system. + */ + paths: string[]; + /** + * Specifications of the weights stored in the paths. + */ + weights: WeightsManifestEntry[]; +} + +export declare const where: typeof where_; + +/** + * Returns the elements, either `a` or `b` depending on the `condition`. + * + * If the condition is true, select from `a`, otherwise select from `b`. + * + * ```js + * const cond = tf.tensor1d([false, false, true], 'bool'); + * const a = tf.tensor1d([1 , 2, 3]); + * const b = tf.tensor1d([-1, -2, -3]); + * + * a.where(cond, b).print(); + * ``` + * + * @param condition The input condition. Must be of dtype bool. + * @param a If `condition` is rank 1, `a` may have a higher rank but + * its first dimension must match the size of `condition`. + * @param b A tensor with the same dtype as `a` and with shape that is + * compatible with `a`. + * @return A tensor with same dtype as `a` and `b`, and shape that is + * broadcastable from `a` and `b`. + * + * @doc {heading: 'Operations', subheading: 'Logical'} + */ +declare function where_(condition: Tensor | TensorLike, a: T | TensorLike, b: T | TensorLike): T; + +export declare const whereAsync: typeof whereAsync_; + +/** + * Returns the coordinates of true elements of condition. + * + * The coordinates are returned in a 2-D tensor where the first dimension (rows) + * represents the number of true elements, and the second dimension (columns) + * represents the coordinates of the true elements. Keep in mind, the shape of + * the output tensor can vary depending on how many true values there are in + * input. Indices are output in row-major order. The resulting tensor has the + * shape `[numTrueElems, condition.rank]`. + * + * This is analogous to calling the python `tf.where(cond)` without an x or y. + * + * ```js + * const cond = tf.tensor1d([false, false, true], 'bool'); + * const result = await tf.whereAsync(cond); + * result.print(); + * ``` + * + * @doc {heading: 'Operations', subheading: 'Logical'} + */ +declare function whereAsync_(condition: Tensor | TensorLike): Promise; + +declare function whereImpl(condShape: number[], condVals: TypedArray): Tensor2D; + +/** + * Creates an IOHandler that passes saved model artifacts to a callback. + * + * ```js + * function handleSave(artifacts) { + * // ... do something with the artifacts ... + * return {modelArtifactsInfo: {...}, ...}; + * } + * + * const saveResult = model.save(tf.io.withSaveHandler(handleSave)); + * ``` + * + * @param saveHandler A function that accepts a `ModelArtifacts` and returns a + * promise that resolves to a `SaveResult`. + */ +declare function withSaveHandler(saveHandler: (artifacts: ModelArtifacts) => Promise): IOHandler; + +/** + * Creates an IOHandlerSync that passes saved model artifacts to a callback. + * + * ```js + * function handleSave(artifacts) { + * // ... do something with the artifacts ... + * return {modelArtifactsInfo: {...}, ...}; + * } + * + * const saveResult = model.save(tf.io.withSaveHandler(handleSave)); + * ``` + * + * @param saveHandler A function that accepts a `ModelArtifacts` and returns a + * `SaveResult`. + */ +declare function withSaveHandlerSync(saveHandler: (artifacts: ModelArtifacts) => SaveResult): IOHandlerSync; + +/** + * Creates a `tf.Tensor` with all elements set to 0. + * + * ```js + * tf.zeros([2, 2]).print(); + * ``` + * + * @param shape An array of integers defining the output tensor shape. + * @param dtype The type of an element in the resulting tensor. Can + * be 'float32', 'int32' or 'bool'. Defaults to 'float'. + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ +export declare function zeros(shape: ShapeMap[R], dtype?: DataType): Tensor; + +export declare const ZerosLike = "ZerosLike"; + +export declare const zerosLike: typeof zerosLike_; + +/** + * Creates a `tf.Tensor` with all elements set to 0 with the same shape as the + * given tensor. + * + * ```js + * const x = tf.tensor([1, 2]); + * tf.zerosLike(x).print(); + * ``` + * + * @param x The tensor of required shape. + * + * @doc {heading: 'Tensors', subheading: 'Creation'} + */ +declare function zerosLike_(x: T | TensorLike): T; + +export declare type ZerosLikeInputs = UnaryInputs; + +export { } diff --git a/types/tfjs.esm.d.ts b/types/tfjs.esm.d.ts new file mode 100644 index 00000000..7a52b9d3 --- /dev/null +++ b/types/tfjs.esm.d.ts @@ -0,0 +1,9956 @@ + +import { backend_util } from './tfjs-core'; +import { BackendTimingInfo } from './tfjs-core'; +import { BackendValues } from './tfjs-core'; +import { DataId as DataId_2 } from './tfjs-core'; +import { DataStorage } from './tfjs-core'; +import { DataToGPUWebGLOption } from './tfjs-core'; +import { DataType } from './tfjs-core'; +import { DataTypeMap } from './tfjs-core'; +import { GPUData } from './tfjs-core'; +import { InferenceModel } from './tfjs-core'; +import { io } from './tfjs-core'; +import { KernelBackend } from './tfjs-core'; +import { MemoryInfo } from './tfjs-core'; +import { ModelPredictConfig } from './tfjs-core'; +import { NamedAttrMap } from './tfjs-core'; +import { NamedTensorMap } from './tfjs-core'; +import { NumericDataType } from './tfjs-core'; +import { Optimizer } from './tfjs-core'; +import { PixelData } from './tfjs-core'; +import { Rank } from './tfjs-core'; +import { Scalar } from './tfjs-core'; +import { serialization } from './tfjs-core'; +import { ShapeMap } from './tfjs-core'; +import { Tensor } from './tfjs-core'; +import { Tensor2D } from './tfjs-core'; +import { Tensor3D } from './tfjs-core'; +import { Tensor4D } from './tfjs-core'; +import { TensorBuffer } from './tfjs-core'; +import { TensorInfo as TensorInfo_2 } from './tfjs-core'; +import * as tfc from './tfjs-core'; +import { TimingInfo } from './tfjs-core'; +import { TypedArray } from './tfjs-core'; +import { WebGLData } from './tfjs-core'; + +/** + * Base class for Activations. + * + * Special note: due to cross-language compatibility reasons, the + * static readonly className field in this family of classes must be set to + * the initialLowerCamelCase name of the activation. + */ +declare abstract class Activation extends serialization.Serializable { + abstract apply(tensor: Tensor, axis?: number): Tensor; + getConfig(): serialization.ConfigDict; +} + +/** + * Applies an activation function to an output. + * + * This layer applies element-wise activation function. Other layers, notably + * `dense` can also apply activation functions. Use this isolated activation + * function to extract the values before and after the + * activation. For instance: + * + * ```js + * const input = tf.input({shape: [5]}); + * const denseLayer = tf.layers.dense({units: 1}); + * const activationLayer = tf.layers.activation({activation: 'relu6'}); + * + * // Obtain the output symbolic tensors by applying the layers in order. + * const denseOutput = denseLayer.apply(input); + * const activationOutput = activationLayer.apply(denseOutput); + * + * // Create the model based on the inputs. + * const model = tf.model({ + * inputs: input, + * outputs: [denseOutput, activationOutput] + * }); + * + * // Collect both outputs and print separately. + * const [denseOut, activationOut] = model.predict(tf.randomNormal([6, 5])); + * denseOut.print(); + * activationOut.print(); + * ``` + * + * @doc {heading: 'Layers', subheading: 'Basic', namespace: 'layers'} + */ +declare function activation(args: ActivationLayerArgs): Activation_2; + +declare class Activation_2 extends Layer { + /** @nocollapse */ + static className: string; + activation: Activation; + constructor(args: ActivationLayerArgs); + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + getConfig(): serialization.ConfigDict; +} + +/** @docinline */ +declare type ActivationIdentifier = 'elu' | 'hardSigmoid' | 'linear' | 'relu' | 'relu6' | 'selu' | 'sigmoid' | 'softmax' | 'softplus' | 'softsign' | 'tanh' | 'swish' | 'mish'; + +declare interface ActivationLayerArgs extends LayerArgs { + /** + * Name of the activation function to use. + */ + activation: ActivationIdentifier; +} + +declare type AdadeltaOptimizerConfig = { + learning_rate: number; + rho: number; + epsilon: number; +}; + +declare type AdadeltaSerialization = BaseSerialization<'Adadelta', AdadeltaOptimizerConfig>; + +declare type AdagradOptimizerConfig = { + learning_rate: number; + initial_accumulator_value?: number; +}; + +declare type AdagradSerialization = BaseSerialization<'Adagrad', AdagradOptimizerConfig>; + +declare type AdamaxOptimizerConfig = { + learning_rate: number; + beta1: number; + beta2: number; + epsilon?: number; + decay?: number; +}; + +declare type AdamaxSerialization = BaseSerialization<'Adamax', AdamaxOptimizerConfig>; + +declare type AdamOptimizerConfig = { + learning_rate: number; + beta1: number; + beta2: number; + epsilon?: number; +}; + +declare type AdamSerialization = BaseSerialization<'Adam', AdamOptimizerConfig>; + +/** + * @license + * Copyright 2022 Google LLC. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +declare class AdapterInfo { + private vendor; + private architecture; + intelGPUGeneration: number; + constructor(adapterInfo: GPUAdapterInfo); + private getIntelGPUGeneration; + isIntel(): boolean; +} + +declare class Add extends Merge { + /** @nocollapse */ + static className: string; + constructor(args?: LayerArgs); + protected mergeFunction(inputs: Tensor[]): Tensor; +} + +/** + * Layer that performs element-wise addition on an `Array` of inputs. + * + * It takes as input a list of tensors, all of the same shape, and returns a + * single tensor (also of the same shape). The inputs are specified as an + * `Array` when the `apply` method of the `Add` layer instance is called. For + * example: + * + * ```js + * const input1 = tf.input({shape: [2, 2]}); + * const input2 = tf.input({shape: [2, 2]}); + * const addLayer = tf.layers.add(); + * const sum = addLayer.apply([input1, input2]); + * console.log(JSON.stringify(sum.shape)); + * // You get [null, 2, 2], with the first dimension as the undetermined batch + * // dimension. + * ``` + * + * @doc {heading: 'Layers', subheading: 'Merge', namespace: 'layers'} + */ +declare function add(args?: LayerArgs): Add; + +declare const addImpl: SimpleBinaryKernelImpl; + +/** + * Applies Alpha Dropout to the input. + * + * As it is a regularization layer, it is only active at training time. + * + * Alpha Dropout is a `Dropout` that keeps mean and variance of inputs + * to their original values, in order to ensure the self-normalizing property + * even after this dropout. + * Alpha Dropout fits well to Scaled Exponential Linear Units + * by randomly setting activations to the negative saturation value. + * + * Arguments: + * - `rate`: float, drop probability (as with `Dropout`). + * The multiplicative noise will have + * standard deviation `sqrt(rate / (1 - rate))`. + * - `noise_shape`: A 1-D `Tensor` of type `int32`, representing the + * shape for randomly generated keep/drop flags. + * + * Input shape: + * Arbitrary. Use the keyword argument `inputShape` + * (tuple of integers, does not include the samples axis) + * when using this layer as the first layer in a model. + * + * Output shape: + * Same shape as input. + * + * References: + * - [Self-Normalizing Neural Networks](https://arxiv.org/abs/1706.02515) + */ +declare class AlphaDropout extends Layer { + /** @nocollapse */ + static className: string; + readonly rate: number; + readonly noiseShape: Shape; + constructor(args: AlphaDropoutArgs); + _getNoiseShape(inputs: Tensor | Tensor[]): number[]; + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + getConfig(): { + rate: number; + }; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; +} + +/** + * Applies Alpha Dropout to the input. + * + * As it is a regularization layer, it is only active at training time. + * + * Alpha Dropout is a `Dropout` that keeps mean and variance of inputs + * to their original values, in order to ensure the self-normalizing property + * even after this dropout. + * Alpha Dropout fits well to Scaled Exponential Linear Units + * by randomly setting activations to the negative saturation value. + * + * Arguments: + * - `rate`: float, drop probability (as with `Dropout`). + * The multiplicative noise will have + * standard deviation `sqrt(rate / (1 - rate))`. + * - `noise_shape`: A 1-D `Tensor` of type `int32`, representing the + * shape for randomly generated keep/drop flags. + * + * Input shape: + * Arbitrary. Use the keyword argument `inputShape` + * (tuple of integers, does not include the samples axis) + * when using this layer as the first layer in a model. + * + * Output shape: + * Same shape as input. + * + * References: + * - [Self-Normalizing Neural Networks](https://arxiv.org/abs/1706.02515) + * + * @doc {heading: 'Layers', subheading: 'Noise', namespace: 'layers'} + */ +declare function alphaDropout(args: AlphaDropoutArgs): AlphaDropout; + +declare interface AlphaDropoutArgs extends LayerArgs { + /** drop probability. */ + rate: number; + /** + * A 1-D `Tensor` of type `int32`, representing the + * shape for randomly generated keep/drop flags. + */ + noiseShape?: Shape; +} + +declare function ArrayBufferToTypedArray(data: ArrayBuffer, dtype: DataType): Uint8Array | Int32Array | Float32Array; + +declare function assertNotComplex(tensor: TensorInfo_2 | TensorInfo_2[], opName: string): void; + +declare namespace AttrValue { + /** Properties of a ListValue. */ + interface IListValue { + /** ListValue s */ + s?: (string[] | null); + /** ListValue i */ + i?: ((number | string)[] | null); + /** ListValue f */ + f?: (number[] | null); + /** ListValue b */ + b?: (boolean[] | null); + /** ListValue type */ + type?: (DataType_2[] | null); + /** ListValue shape */ + shape?: (ITensorShape[] | null); + /** ListValue tensor */ + tensor?: (ITensor[] | null); + /** ListValue func */ + func?: (INameAttrList[] | null); + } +} + +declare class Average extends Merge { + /** @nocollapse */ + static className: string; + constructor(args?: LayerArgs); + protected mergeFunction(inputs: Tensor[]): Tensor; +} + +/** + * Layer that performs element-wise averaging on an `Array` of inputs. + * + * It takes as input a list of tensors, all of the same shape, and returns a + * single tensor (also of the same shape). For example: + * + * ```js + * const input1 = tf.input({shape: [2, 2]}); + * const input2 = tf.input({shape: [2, 2]}); + * const averageLayer = tf.layers.average(); + * const average = averageLayer.apply([input1, input2]); + * console.log(JSON.stringify(average.shape)); + * // You get [null, 2, 2], with the first dimension as the undetermined batch + * // dimension. + * ``` + * + * @doc {heading: 'Layers', subheading: 'Merge', namespace: 'layers'} + */ +declare function average(args?: LayerArgs): Average; + +declare class AveragePooling1D extends Pooling1D { + /** @nocollapse */ + static className: string; + constructor(args: Pooling1DLayerArgs); + protected poolingFunction(inputs: Tensor, poolSize: [number, number], strides: [number, number], padding: PaddingMode, dataFormat: DataFormat): Tensor; +} + +/** + * Average pooling operation for spatial data. + * + * Input shape: `[batchSize, inLength, channels]` + * + * Output shape: `[batchSize, pooledLength, channels]` + * + * `tf.avgPool1d` is an alias. + * + * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'} + */ +declare function averagePooling1d(args: Pooling1DLayerArgs): AveragePooling1D; + +declare class AveragePooling2D extends Pooling2D { + /** @nocollapse */ + static className: string; + constructor(args: Pooling2DLayerArgs); + protected poolingFunction(inputs: Tensor, poolSize: [number, number], strides: [number, number], padding: PaddingMode, dataFormat: DataFormat): Tensor; +} + +/** + * Average pooling operation for spatial data. + * + * Input shape: + * - If `dataFormat === CHANNEL_LAST`: + * 4D tensor with shape: + * `[batchSize, rows, cols, channels]` + * - If `dataFormat === CHANNEL_FIRST`: + * 4D tensor with shape: + * `[batchSize, channels, rows, cols]` + * + * Output shape + * - If `dataFormat === CHANNEL_LAST`: + * 4D tensor with shape: + * `[batchSize, pooledRows, pooledCols, channels]` + * - If `dataFormat === CHANNEL_FIRST`: + * 4D tensor with shape: + * `[batchSize, channels, pooledRows, pooledCols]` + * + * `tf.avgPool2d` is an alias. + * + * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'} + */ +declare function averagePooling2d(args: Pooling2DLayerArgs): AveragePooling2D; + +declare class AveragePooling3D extends Pooling3D { + /** @nocollapse */ + static className: string; + constructor(args: Pooling3DLayerArgs); + protected poolingFunction(inputs: Tensor, poolSize: [number, number, number], strides: [number, number, number], padding: PaddingMode, dataFormat: DataFormat): Tensor; +} + +/** + * Average pooling operation for 3D data. + * + * Input shape + * - If `dataFormat === channelsLast`: + * 5D tensor with shape: + * `[batchSize, depths, rows, cols, channels]` + * - If `dataFormat === channelsFirst`: + * 4D tensor with shape: + * `[batchSize, channels, depths, rows, cols]` + * + * Output shape + * - If `dataFormat=channelsLast`: + * 5D tensor with shape: + * `[batchSize, pooledDepths, pooledRows, pooledCols, channels]` + * - If `dataFormat=channelsFirst`: + * 5D tensor with shape: + * `[batchSize, channels, pooledDepths, pooledRows, pooledCols]` + * + * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'} + */ +declare function averagePooling3d(args: Pooling3DLayerArgs): AveragePooling3D; + +declare function avgPool1d(args: Pooling1DLayerArgs): AveragePooling1D; + +declare function avgPool2d(args: Pooling2DLayerArgs): AveragePooling2D; + +declare function avgPool3d(args: Pooling3DLayerArgs): AveragePooling3D; + +declare function avgPooling1d(args: Pooling1DLayerArgs): AveragePooling1D; + +declare function avgPooling2d(args: Pooling2DLayerArgs): AveragePooling2D; + +declare function avgPooling3d(args: Pooling3DLayerArgs): AveragePooling3D; + +export declare class BackendWasm extends KernelBackend { + wasm: BackendWasmModule | BackendWasmThreadedSimdModule; + private dataIdNextNumber; + dataIdMap: DataStorage; + constructor(wasm: BackendWasmModule | BackendWasmThreadedSimdModule); + write(values: backend_util.BackendValues, shape: number[], dtype: DataType): DataId_3; + numDataIds(): number; + time(f: () => void): Promise; + move(dataId: DataId_3, values: backend_util.BackendValues, shape: number[], dtype: DataType, refCount: number): void; + read(dataId: DataId_3): Promise; + readSync(dataId: DataId_3, start?: number, end?: number): backend_util.BackendValues; + /** + * Dispose the memory if the dataId has 0 refCount. Return true if the memory + * is released, false otherwise. + * @param dataId + * @oaram force Optional, remove the data regardless of refCount + */ + disposeData(dataId: DataId_3, force?: boolean): boolean; + /** Return refCount of a `TensorData`. */ + refCount(dataId: DataId_3): number; + incRef(dataId: DataId_3): void; + floatPrecision(): 32; + getMemoryOffset(dataId: DataId_3): number; + dispose(): void; + memory(): { + unreliable: boolean; + }; + /** + * Make a tensor info for the output of an op. If `memoryOffset` is not + * present, this method allocates memory on the WASM heap. If `memoryOffset` + * is present, the memory was allocated elsewhere (in c++) and we just record + * the pointer where that memory lives. + */ + makeOutput(shape: number[], dtype: DataType, memoryOffset?: number): TensorInfo_2; + typedArrayFromHeap({ shape, dtype, dataId }: TensorInfo_2): backend_util.TypedArray; +} + +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +declare interface BackendWasmModule extends EmscriptenModule { + // Using the tfjs namespace to avoid conflict with emscripten's API. + tfjs: { + init(): void, + initWithThreadsCount(threadsCount: number): void, + getThreadsCount(): number, + registerTensor(id: number, size: number, memoryOffset: number): void, + // Disposes the data behind the data bucket. + disposeData(id: number): void, + // Disposes the backend and all of its associated data. + dispose(): void, + } +} + +declare interface BackendWasmThreadedSimdModule extends BackendWasmModule { + PThread: { + // Terminates all webworkers + terminateAllThreads(): void, + }; +} + +/** + * Abstract base class used to build new callbacks. + * + * The `logs` dictionary that callback methods take as argument will contain + * keys for quantities relevant to the current batch or epoch. + * + * Currently, the `.fit()` method of the `Sequential` model class + * will include the following quantities in the `logs` that + * it passes to its callbacks: + * + * onEpochEnd: Logs include `acc` and `loss`, and optionally include `valLoss` + * (if validation is enabled in `fit`), and `valAcc` (if validation and + * accuracy monitoring are enabled). + * onBatchBegin: Logs include `size`, the number of samples in the current + * batch. + * onBatchEnd: Logs include `loss`, and optionally `acc` (if accuracy monitoring + * is enabled). + */ +declare abstract class BaseCallback { + validationData: Tensor | Tensor[]; + /** + * Training parameters (eg. verbosity, batch size, number of epochs...). + */ + params: Params; + setParams(params: Params): void; + onEpochBegin(epoch: number, logs?: UnresolvedLogs): Promise; + onEpochEnd(epoch: number, logs?: UnresolvedLogs): Promise; + onBatchBegin(batch: number, logs?: UnresolvedLogs): Promise; + onBatchEnd(batch: number, logs?: UnresolvedLogs): Promise; + onTrainBegin(logs?: UnresolvedLogs): Promise; + onTrainEnd(logs?: UnresolvedLogs): Promise; + setModel(model: Container): void; +} + +declare type BaseCallbackConstructor = { + new (): BaseCallback; +}; + +/** + * Abstract convolution layer. + */ +declare abstract class BaseConv extends Layer { + protected readonly rank: number; + protected readonly kernelSize: number[]; + protected readonly strides: number[]; + protected readonly padding: PaddingMode; + protected readonly dataFormat: DataFormat; + protected readonly activation: Activation; + protected readonly useBias: boolean; + protected readonly dilationRate: number[]; + protected readonly biasInitializer?: Initializer; + protected readonly biasConstraint?: Constraint; + protected readonly biasRegularizer?: Regularizer; + protected bias: LayerVariable; + readonly DEFAULT_KERNEL_INITIALIZER: InitializerIdentifier; + readonly DEFAULT_BIAS_INITIALIZER: InitializerIdentifier; + constructor(rank: number, args: BaseConvLayerArgs); + protected static verifyArgs(args: BaseConvLayerArgs): void; + getConfig(): serialization.ConfigDict; +} + +/** + * Base LayerConfig for depthwise and non-depthwise convolutional layers. + */ +declare interface BaseConvLayerArgs extends LayerArgs { + /** + * The dimensions of the convolution window. If kernelSize is a number, the + * convolutional window will be square. + */ + kernelSize: number | number[]; + /** + * The strides of the convolution in each dimension. If strides is a number, + * strides in both dimensions are equal. + * + * Specifying any stride value != 1 is incompatible with specifying any + * `dilationRate` value != 1. + */ + strides?: number | number[]; + /** + * Padding mode. + */ + padding?: PaddingMode; + /** + * Format of the data, which determines the ordering of the dimensions in + * the inputs. + * + * `channels_last` corresponds to inputs with shape + * `(batch, ..., channels)` + * + * `channels_first` corresponds to inputs with shape `(batch, channels, + * ...)`. + * + * Defaults to `channels_last`. + */ + dataFormat?: DataFormat; + /** + * The dilation rate to use for the dilated convolution in each dimension. + * Should be an integer or array of two or three integers. + * + * Currently, specifying any `dilationRate` value != 1 is incompatible with + * specifying any `strides` value != 1. + */ + dilationRate?: number | [number] | [number, number] | [number, number, number]; + /** + * Activation function of the layer. + * + * If you don't specify the activation, none is applied. + */ + activation?: ActivationIdentifier; + /** + * Whether the layer uses a bias vector. Defaults to `true`. + */ + useBias?: boolean; + /** + * Initializer for the convolutional kernel weights matrix. + */ + kernelInitializer?: InitializerIdentifier | Initializer; + /** + * Initializer for the bias vector. + */ + biasInitializer?: InitializerIdentifier | Initializer; + /** + * Constraint for the convolutional kernel weights. + */ + kernelConstraint?: ConstraintIdentifier | Constraint; + /** + * Constraint for the bias vector. + */ + biasConstraint?: ConstraintIdentifier | Constraint; + /** + * Regularizer function applied to the kernel weights matrix. + */ + kernelRegularizer?: RegularizerIdentifier | Regularizer; + /** + * Regularizer function applied to the bias vector. + */ + biasRegularizer?: RegularizerIdentifier | Regularizer; + /** + * Regularizer function applied to the activation. + */ + activityRegularizer?: RegularizerIdentifier | Regularizer; +} + +declare interface BaseRNNLayerArgs extends LayerArgs { + /** + * A RNN cell instance. A RNN cell is a class that has: + * - a `call()` method, which takes `[Tensor, Tensor]` as the + * first input argument. The first item is the input at time t, and + * second item is the cell state at time t. + * The `call()` method returns `[outputAtT, statesAtTPlus1]`. + * The `call()` method of the cell can also take the argument `constants`, + * see section "Note on passing external constants" below. + * Porting Node: PyKeras overrides the `call()` signature of RNN cells, + * which are Layer subtypes, to accept two arguments. tfjs-layers does + * not do such overriding. Instead we preseve the `call()` signature, + * which due to its `Tensor|Tensor[]` argument and return value is + * flexible enough to handle the inputs and states. + * - a `stateSize` attribute. This can be a single integer (single state) + * in which case it is the size of the recurrent state (which should be + * the same as the size of the cell output). This can also be an Array of + * integers (one size per state). In this case, the first entry + * (`stateSize[0]`) should be the same as the size of the cell output. + * It is also possible for `cell` to be a list of RNN cell instances, in which + * case the cells get stacked on after the other in the RNN, implementing an + * efficient stacked RNN. + */ + cell?: RNNCell | RNNCell[]; + /** + * Whether to return the last output in the output sequence, or the full + * sequence. + */ + returnSequences?: boolean; + /** + * Whether to return the last state in addition to the output. + */ + returnState?: boolean; + /** + * If `true`, process the input sequence backwards and return the reversed + * sequence (default: `false`). + */ + goBackwards?: boolean; + /** + * If `true`, the last state for each sample at index i in a batch will be + * used as initial state of the sample of index i in the following batch + * (default: `false`). + * + * You can set RNN layers to be "stateful", which means that the states + * computed for the samples in one batch will be reused as initial states + * for the samples in the next batch. This assumes a one-to-one mapping + * between samples in different successive batches. + * + * To enable "statefulness": + * - specify `stateful: true` in the layer constructor. + * - specify a fixed batch size for your model, by passing + * - if sequential model: + * `batchInputShape: [...]` to the first layer in your model. + * - else for functional model with 1 or more Input layers: + * `batchShape: [...]` to all the first layers in your model. + * This is the expected shape of your inputs + * *including the batch size*. + * It should be a tuple of integers, e.g., `[32, 10, 100]`. + * - specify `shuffle: false` when calling `LayersModel.fit()`. + * + * To reset the state of your model, call `resetStates()` on either the + * specific layer or on the entire model. + */ + stateful?: boolean; + /** + * If `true`, the network will be unrolled, else a symbolic loop will be + * used. Unrolling can speed up a RNN, although it tends to be more + * memory-intensive. Unrolling is only suitable for short sequences (default: + * `false`). + * Porting Note: tfjs-layers has an imperative backend. RNNs are executed with + * normal TypeScript control flow. Hence this property is inapplicable and + * ignored in tfjs-layers. + */ + unroll?: boolean; + /** + * Dimensionality of the input (integer). + * This option (or alternatively, the option `inputShape`) is required when + * this layer is used as the first layer in a model. + */ + inputDim?: number; + /** + * Length of the input sequences, to be specified when it is constant. + * This argument is required if you are going to connect `Flatten` then + * `Dense` layers upstream (without it, the shape of the dense outputs cannot + * be computed). Note that if the recurrent layer is not the first layer in + * your model, you would need to specify the input length at the level of the + * first layer (e.g., via the `inputShape` option). + */ + inputLength?: number; +} + +/** + * A Keras JSON entry representing a Keras object such as a Layer. + * + * The Keras JSON convention is to provide the `class_name` (e.g., the layer + * type) at the top level, and then to place the class-specific configuration in + * a `config` subtree. These class-specific configurations are provided by + * subtypes of `PyJsonDict`. Thus, this `*Serialization` has a type parameter + * giving the specific type of the wrapped `PyJsonDict`. + */ +declare interface BaseSerialization>> extends PyJsonDict { + class_name: N; + config: T; +} + +declare class BatchNormalization extends Layer { + /** @nocollapse */ + static className: string; + private readonly axis; + private readonly momentum; + private readonly epsilon; + private readonly center; + private readonly scale; + private readonly betaInitializer; + private readonly gammaInitializer; + private readonly movingMeanInitializer; + private readonly movingVarianceInitializer; + private readonly betaConstraint; + private readonly gammaConstraint; + private readonly betaRegularizer; + private readonly gammaRegularizer; + private gamma; + private beta; + private movingMean; + private movingVariance; + constructor(args?: BatchNormalizationLayerArgs); + build(inputShape: Shape | Shape[]): void; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + getConfig(): serialization.ConfigDict; +} + +/** + * Batch normalization layer (Ioffe and Szegedy, 2014). + * + * Normalize the activations of the previous layer at each batch, + * i.e. applies a transformation that maintains the mean activation + * close to 0 and the activation standard deviation close to 1. + * + * Input shape: + * Arbitrary. Use the keyword argument `inputShape` (Array of integers, does + * not include the sample axis) when calling the constructor of this class, + * if this layer is used as a first layer in a model. + * + * Output shape: + * Same shape as input. + * + * References: + * - [Batch Normalization: Accelerating Deep Network Training by Reducing + * Internal Covariate Shift](https://arxiv.org/abs/1502.03167) + * + * @doc {heading: 'Layers', subheading: 'Normalization', namespace: 'layers'} + */ +declare function batchNormalization(args?: BatchNormalizationLayerArgs): BatchNormalization; + +declare interface BatchNormalizationLayerArgs extends LayerArgs { + /** + * The integer axis that should be normalized (typically the features axis). + * Defaults to -1. + * + * For instance, after a `Conv2D` layer with `data_format="channels_first"`, + * set `axis=1` in `batchNormalization`. + */ + axis?: number; + /** + * Momentum of the moving average. Defaults to 0.99. + */ + momentum?: number; + /** + * Small float added to the variance to avoid dividing by zero. Defaults to + * 1e-3. + */ + epsilon?: number; + /** + * If `true`, add offset of `beta` to normalized tensor. + * If `false`, `beta` is ignored. + * Defaults to `true`. + */ + center?: boolean; + /** + * If `true`, multiply by `gamma`. + * If `false`, `gamma` is not used. + * When the next layer is linear (also e.g. `nn.relu`), + * this can be disabled since the scaling will be done by the next layer. + * Defaults to `true`. + */ + scale?: boolean; + /** + * Initializer for the beta weight. + * Defaults to 'zeros'. + */ + betaInitializer?: InitializerIdentifier | Initializer; + /** + * Initializer for the gamma weight. + * Defaults to `ones`. + */ + gammaInitializer?: InitializerIdentifier | Initializer; + /** + * Initializer for the moving mean. + * Defaults to `zeros` + */ + movingMeanInitializer?: InitializerIdentifier | Initializer; + /** + * Initializer for the moving variance. + * Defaults to 'Ones'. + */ + movingVarianceInitializer?: InitializerIdentifier | Initializer; + /** + * Constraint for the beta weight. + */ + betaConstraint?: ConstraintIdentifier | Constraint; + /** + * Constraint for gamma weight. + */ + gammaConstraint?: ConstraintIdentifier | Constraint; + /** + * Regularizer for the beta weight. + */ + betaRegularizer?: RegularizerIdentifier | Regularizer; + /** + * Regularizer for the gamma weight. + */ + gammaRegularizer?: RegularizerIdentifier | Regularizer; +} + +declare class Bidirectional extends Wrapper { + /** @nocollapse */ + static className: string; + mergeMode: BidirectionalMergeMode; + private forwardLayer; + private backwardLayer; + private returnSequences; + private returnState; + private numConstants?; + private _trainable; + constructor(args: BidirectionalLayerArgs); + get trainable(): boolean; + set trainable(value: boolean); + getWeights(): Tensor[]; + setWeights(weights: Tensor[]): void; + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + apply(inputs: Tensor | Tensor[] | SymbolicTensor | SymbolicTensor[], kwargs?: Kwargs): Tensor | Tensor[] | SymbolicTensor | SymbolicTensor[]; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + resetStates(states?: Tensor | Tensor[]): void; + build(inputShape: Shape | Shape[]): void; + computeMask(inputs: Tensor | Tensor[], mask?: Tensor | Tensor[]): Tensor | Tensor[]; + get trainableWeights(): LayerVariable[]; + get nonTrainableWeights(): LayerVariable[]; + setFastWeightInitDuringBuild(value: boolean): void; + getConfig(): serialization.ConfigDict; + /** @nocollapse */ + static fromConfig(cls: serialization.SerializableConstructor, config: serialization.ConfigDict): T; +} + +/** @doc {heading: 'Layers', subheading: 'Wrapper', namespace: 'layers'} */ +declare function bidirectional(args: BidirectionalLayerArgs): Bidirectional; + +declare interface BidirectionalLayerArgs extends WrapperLayerArgs { + /** + * The instance of an `RNN` layer to be wrapped. + */ + layer: RNN; + /** + * Mode by which outputs of the forward and backward RNNs are + * combined. If `null` or `undefined`, the output will not be + * combined, they will be returned as an `Array`. + * + * If `undefined` (i.e., not provided), defaults to `'concat'`. + */ + mergeMode?: BidirectionalMergeMode; +} + +/** @docinline */ +declare type BidirectionalMergeMode = 'sum' | 'mul' | 'concat' | 'ave'; + +/** + * Binary accuracy metric function. + * + * `yTrue` and `yPred` can have 0-1 values. Example: + * ```js + * const x = tf.tensor2d([[1, 1, 1, 1], [0, 0, 0, 0]], [2, 4]); + * const y = tf.tensor2d([[1, 0, 1, 0], [0, 0, 0, 1]], [2, 4]); + * const accuracy = tf.metrics.binaryAccuracy(x, y); + * accuracy.print(); + * ``` + * + * `yTrue` and `yPred` can also have floating-number values between 0 and 1, in + * which case the values will be thresholded at 0.5 to yield 0-1 values (i.e., + * a value >= 0.5 and <= 1.0 is interpreted as 1). + * + * Example: + * ```js + * const x = tf.tensor1d([1, 1, 1, 1, 0, 0, 0, 0]); + * const y = tf.tensor1d([0.2, 0.4, 0.6, 0.8, 0.2, 0.3, 0.4, 0.7]); + * const accuracy = tf.metrics.binaryAccuracy(x, y); + * accuracy.print(); + * ``` + * + * @param yTrue Binary Tensor of truth. + * @param yPred Binary Tensor of prediction. + * @return Accuracy Tensor. + * + * @doc {heading: 'Metrics', namespace: 'metrics'} + */ +declare function binaryAccuracy(yTrue: Tensor, yPred: Tensor): Tensor; + +/** + * Binary crossentropy metric function. + * + * Example: + * ```js + * const x = tf.tensor2d([[0], [1], [1], [1]]); + * const y = tf.tensor2d([[0], [0], [0.5], [1]]); + * const crossentropy = tf.metrics.binaryCrossentropy(x, y); + * crossentropy.print(); + * ``` + * + * @param yTrue Binary Tensor of truth. + * @param yPred Binary Tensor of prediction, probabilities for the `1` case. + * @return Accuracy Tensor. + * + * @doc {heading: 'Metrics', namespace: 'metrics'} + */ +declare function binaryCrossentropy(yTrue: Tensor, yPred: Tensor): Tensor; + +declare function bincountImpl(xVals: TypedArray, weightsVals: TypedArray, weightsDtype: DataType, weightsShape: number[], size: number): TypedArray; + +declare function bincountReduceImpl(xBuf: TensorBuffer, weightsBuf: TensorBuffer, size: number, binaryOutput?: boolean): TensorBuffer; + +declare function bindCanvasToFramebuffer(gl: WebGLRenderingContext): void; + +declare function bindColorTextureToFramebuffer(gl: WebGLRenderingContext, texture: WebGLTexture, framebuffer: WebGLFramebuffer): void; + +declare function bindTextureToProgramUniformSampler(gl: WebGLRenderingContext, texture: WebGLTexture, uniformSamplerLocation: WebGLUniformLocation, textureUnit: number): void; + +declare function bindTextureUnit(gl: WebGLRenderingContext, texture: WebGLTexture, textureUnit: number): void; + +declare function bindVertexBufferToProgramAttribute(gl: WebGLRenderingContext, program: WebGLProgram, attribute: string, buffer: WebGLBuffer, arrayEntriesPerItem: number, itemStrideInBytes: number, itemOffsetInBytes: number): boolean; + +declare function bindVertexProgramAttributeStreams(gl: WebGLRenderingContext, program: WebGLProgram, vertexBuffer: WebGLBuffer): boolean; + +declare type BufferInfo = { + size: number; + usage: GPUBufferUsageFlags; + buffer: GPUBuffer; +}; + +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +declare class BufferManager { + private device; + private numUsedBuffers; + private numFreeBuffers; + private freeBuffers; + private usedBuffers; + numBytesUsed: number; + numBytesAllocated: number; + constructor(device: GPUDevice); + acquireUploadBuffer(size: number, usage: GPUBufferUsageFlags): GPUBuffer; + acquireBuffer(size: number, usage: GPUBufferUsageFlags, mappedAtCreation?: boolean): GPUBuffer; + releaseBuffer(buffer: GPUBuffer, size: number, usage: GPUBufferUsageFlags): void; + releaseUploadBuffer(buffer: GPUBuffer, size: number, usage: GPUBufferUsageFlags): void; + getNumUsedBuffers(): number; + getNumFreeBuffers(): number; + dispose(): void; +} + +declare function callAndCheck(gl: WebGLRenderingContext, func: () => T): T; + +export declare abstract class Callback extends BaseCallback { + /** Instance of `keras.models.Model`. Reference of the model being trained. */ + model: LayersModel; + setModel(model: Container): void; +} + +/** + * Container abstracting a list of callbacks. + */ +export declare class CallbackList { + callbacks: BaseCallback[]; + queueLength: number; + /** + * Constructor of CallbackList. + * @param callbacks Array of `Callback` instances. + * @param queueLength Queue length for keeping running statistics over + * callback execution time. + */ + constructor(callbacks?: BaseCallback[], queueLength?: number); + append(callback: BaseCallback): void; + setParams(params: Params): void; + setModel(model: Container): void; + /** + * Called at the start of an epoch. + * @param epoch Index of epoch. + * @param logs Dictionary of logs. + */ + onEpochBegin(epoch: number, logs?: UnresolvedLogs): Promise; + /** + * Called at the end of an epoch. + * @param epoch Index of epoch. + * @param logs Dictionary of logs. + */ + onEpochEnd(epoch: number, logs?: UnresolvedLogs): Promise; + /** + * Called right before processing a batch. + * @param batch Index of batch within the current epoch. + * @param logs Dictionary of logs. + */ + onBatchBegin(batch: number, logs?: UnresolvedLogs): Promise; + /** + * Called at the end of a batch. + * @param batch Index of batch within the current epoch. + * @param logs Dictionary of logs. + */ + onBatchEnd(batch: number, logs?: UnresolvedLogs): Promise; + /** + * Called at the beginning of training. + * @param logs Dictionary of logs. + */ + onTrainBegin(logs?: UnresolvedLogs): Promise; + /** + * Called at the end of training. + * @param logs Dictionary of logs. + */ + onTrainEnd(logs?: UnresolvedLogs): Promise; +} + +export declare const callbacks: { + earlyStopping: typeof earlyStopping; +}; + +declare type CallHook = (inputs: Tensor | Tensor[], kwargs: Kwargs) => void; + +declare function canBeRepresented(num: number): boolean; + +declare function castImpl(values: TypedArray, shape: number[], inputType: DataType, dtype: DataType): [number[], DataType, TypedArray]; + +/** + * Categorical accuracy metric function. + * + * Example: + * ```js + * const x = tf.tensor2d([[0, 0, 0, 1], [0, 0, 0, 1]]); + * const y = tf.tensor2d([[0.1, 0.8, 0.05, 0.05], [0.1, 0.05, 0.05, 0.8]]); + * const accuracy = tf.metrics.categoricalAccuracy(x, y); + * accuracy.print(); + * ``` + * + * @param yTrue Binary Tensor of truth: one-hot encoding of categories. + * @param yPred Binary Tensor of prediction: probabilities or logits for the + * same categories as in `yTrue`. + * @return Accuracy Tensor. + * + * @doc {heading: 'Metrics', namespace: 'metrics'} + */ +declare function categoricalAccuracy(yTrue: Tensor, yPred: Tensor): Tensor; + +/** + * Categorical crossentropy between an output tensor and a target tensor. + * + * @param target A tensor of the same shape as `output`. + * @param output A tensor resulting from a softmax (unless `fromLogits` is + * `true`, in which case `output` is expected to be the logits). + * @param fromLogits Boolean, whether `output` is the result of a softmax, or is + * a tensor of logits. + * + * @doc {heading: 'Metrics', namespace: 'metrics'} + */ +declare function categoricalCrossentropy(yTrue: Tensor, yPred: Tensor): Tensor; + +declare class CategoryEncoding extends Layer { + /** @nocollapse */ + static className: string; + private readonly numTokens; + private readonly outputMode; + constructor(args: CategoryEncodingArgs); + getConfig(): serialization.ConfigDict; + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor[] | Tensor; +} + +/** + * A preprocessing layer which encodes integer features. + * + * This layer provides options for condensing data into a categorical encoding + * when the total number of tokens are known in advance. It accepts integer + * values as inputs, and it outputs a dense representation of those + * inputs. + * + * Arguments: + * + * numTokens: The total number of tokens the layer should support. All + * inputs to the layer must integers in the range `0 <= value < + * numTokens`, or an error will be thrown. + * + * outputMode: Specification for the output of the layer. + * Defaults to `multiHot`. Values can be `oneHot`, `multiHot` or + * `count`, configuring the layer as follows: + * + * oneHot: Encodes each individual element in the input into an + * array of `numTokens` size, containing a 1 at the element index. If + * the last dimension is size 1, will encode on that dimension. If the + * last dimension is not size 1, will append a new dimension for the + * encoded output. + * + * multiHot: Encodes each sample in the input into a single array + * of `numTokens` size, containing a 1 for each vocabulary term + * present in the sample. Treats the last dimension as the sample + * dimension, if input shape is `(..., sampleLength)`, output shape + * will be `(..., numTokens)`. + * + * count: Like `multiHot`, but the int array contains a count of + * the number of times the token at that index appeared in the sample. + * + * For all output modes, currently only output up to rank 2 is supported. + * Call arguments: + * inputs: A 1D or 2D tensor of integer inputs. + * countWeights: A tensor in the same shape as `inputs` indicating the + * weight for each sample value when summing up in `count` mode. Not used + * in `multiHot` or `oneHot` modes. + * + * + * @doc {heading: 'Layers', subheading: 'CategoryEncoding', namespace: 'layers'} + */ +declare function categoryEncoding(args: CategoryEncodingArgs): CategoryEncoding; + +declare interface CategoryEncodingArgs extends LayerArgs { + numTokens: number; + outputMode?: OutputMode; +} + +declare const ceilImpl: SimpleUnaryImpl; + +declare class CenterCrop extends Layer { + /** @nocollapse */ + static className: string; + private readonly height; + private readonly width; + constructor(args: CenterCropArgs); + centerCrop(inputs: Tensor3D | Tensor4D, hBuffer: number, wBuffer: number, height: number, width: number, inputHeight: number, inputWidth: number, dtype: DataType): Tensor | Tensor[]; + upsize(inputs: Tensor3D | Tensor4D, height: number, width: number, dtype: DataType): Tensor | Tensor[]; + call(inputs: Tensor3D | Tensor4D, kwargs: Kwargs): Tensor[] | Tensor; + getConfig(): serialization.ConfigDict; + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; +} + +/** + * A preprocessing layer which center crops images. + * + * This layers crops the central portion of the images to a target size. If an + * image is smaller than the target size, it will be resized and cropped so as + * to return the largest possible window in the image that matches the target + * aspect ratio. + * + * Input pixel values can be of any range (e.g. `[0., 1.)` or `[0, 255]`) and + * of integer or floating point dtype. + * + * If the input height/width is even and the target height/width is odd (or + * inversely), the input image is left-padded by 1 pixel. + * + * Arguments: + * `height`: Integer, the height of the output shape. + * `width`: Integer, the width of the output shape. + * + * Input shape: + * 3D (unbatched) or 4D (batched) tensor with shape: + * `(..., height, width, channels)`, in `channelsLast` format. + * + * Output shape: + * 3D (unbatched) or 4D (batched) tensor with shape: + * `(..., targetHeight, targetWidth, channels)`. + * + * + * @doc {heading: 'Layers', subheading: 'CenterCrop', namespace: 'layers'} + */ +declare function centerCrop(args?: CenterCropArgs): CenterCrop; + +declare interface CenterCropArgs extends LayerArgs { + height: number; + width: number; +} + +/** + * For multi-class classification problems, this object is designed to store a + * mapping from class index to the "weight" of the class, where higher weighted + * classes have larger impact on loss, accuracy, and other metrics. + * + * This is useful for cases in which you want the model to "pay more attention" + * to examples from an under-represented class, e.g., in unbalanced datasets. + */ +export declare type ClassWeight = { + [classIndex: number]: number; +}; + +/** + * Class weighting for a model with multiple outputs. + * + * This object maps each output name to a class-weighting object. + */ +export declare type ClassWeightMap = { + [outputName: string]: ClassWeight; +}; + +declare const compileProgram: (device: GPUDevice, program: WebGPUProgram, inputsData: InputInfo[], output: TensorInfo_2) => GPUComputePipeline; + +declare type ComplexBinaryKernelImpl = (aShape: number[], bShape: number[], aRealVals: Float32Array, aImagVals: Float32Array, bRealVals: Float32Array, bImagVals: Float32Array) => [TypedArray, TypedArray, number[]]; + +declare function computeDispatch(layout: { + x: number[]; + y?: number[]; + z?: number[]; +}, outputShape: number[], workgroupSize?: [number, number, number], elementsPerThread?: [number, number, number]): [number, number, number]; + +declare function computeWorkgroupInfoForMatMul(dimAOuter: number, dimInner: number, dimBOuter: number, transposeA?: boolean): WorkgroupInfo; + +declare function computeWorkgroupSizeForConv2d(layout: { + x: number[]; + y?: number[]; + z?: number[]; +}, outputShape: number[], isVec4?: boolean): [number, number, number]; + +declare function computeWorkPerThreadForConv2d(layout: { + x: number[]; + y?: number[]; + z?: number[]; +}, outputShape: number[], isVec4?: boolean): [number, number, number]; + +declare class Concatenate extends Merge { + /** @nocollapse */ + static className: string; + readonly DEFAULT_AXIS = -1; + private readonly axis; + constructor(args?: ConcatenateLayerArgs); + build(inputShape: Shape | Shape[]): void; + protected mergeFunction(inputs: Tensor[]): Tensor; + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + computeMask(inputs: Tensor | Tensor[], mask?: Tensor | Tensor[]): Tensor; + getConfig(): serialization.ConfigDict; +} + +/** + * Layer that concatenates an `Array` of inputs. + * + * It takes a list of tensors, all of the same shape except for the + * concatenation axis, and returns a single tensor, the concatenation + * of all inputs. For example: + * + * ```js + * const input1 = tf.input({shape: [2, 2]}); + * const input2 = tf.input({shape: [2, 3]}); + * const concatLayer = tf.layers.concatenate(); + * const output = concatLayer.apply([input1, input2]); + * console.log(JSON.stringify(output.shape)); + * // You get [null, 2, 5], with the first dimension as the undetermined batch + * // dimension. The last dimension (5) is the result of concatenating the + * // last dimensions of the inputs (2 and 3). + * ``` + * + * @doc {heading: 'Layers', subheading: 'Merge', namespace: 'layers'} + */ +declare function concatenate(args?: ConcatenateLayerArgs): Concatenate; + +declare interface ConcatenateLayerArgs extends LayerArgs { + /** + * Axis along which to concatenate. + */ + axis?: number; +} + +declare function concatImpl(inputs: Array<{ + vals: BackendValues; + shape: number[]; +}>, outShape: number[], dtype: DataType, simplyConcat: boolean): TypedArray | string[]; + +/** + * Initializer that generates values initialized to some constant. + * + * @doc {heading: 'Initializers', namespace: 'initializers'} + */ +declare function constant(args: ConstantArgs): Initializer; + +declare interface ConstantArgs { + /** The value for each element in the variable. */ + value: number; +} + +/** + * Base class for functions that impose constraints on weight values + * + * @doc { + * heading: 'Constraints', + * subheading: 'Classes', + * namespace: 'constraints' + * } + */ +declare abstract class Constraint extends serialization.Serializable { + abstract apply(w: Tensor): Tensor; + getConfig(): serialization.ConfigDict; +} + +/** @docinline */ +declare type ConstraintIdentifier = 'maxNorm' | 'minMaxNorm' | 'nonNeg' | 'unitNorm' | string; + +declare namespace constraints { + export { + maxNorm, + unitNorm, + nonNeg, + minMaxNorm + } +} +export { constraints } + +/** + * A Container is a directed acyclic graph of layers. + * + * It is the topological form of a "model". A LayersModel + * is simply a Container with added training routines. + * + */ +declare abstract class Container extends Layer { + inputs: SymbolicTensor[]; + outputs: SymbolicTensor[]; + inputLayers: Layer[]; + inputLayersNodeIndices: number[]; + inputLayersTensorIndices: number[]; + outputLayers: Layer[]; + outputLayersNodeIndices: number[]; + outputLayersTensorIndices: number[]; + layers: Layer[]; + layersByDepth: { + [depth: string]: Layer[]; + }; + nodesByDepth: { + [depth: string]: Node_2[]; + }; + internalContainerRefs: Container[]; + containerNodes: Set; + inputNames: string[]; + outputNames: string[]; + feedInputShapes: Shape[]; + protected internalInputShapes: Shape[]; + protected internalOutputShapes: Shape[]; + protected feedInputNames: string[]; + protected feedOutputNames: string[]; + constructor(args: ContainerArgs); + protected assertNotDisposed(): void; + /** + * Attempt to dispose a LayersModel's weights. + * + * This method decrease the reference count of the LayersModel object by 1. + * + * A LayersModel is reference-counted. Its reference count is incremented by 1 + * when it is first constructed and when it is used as a Layer of another + * LayersModel. + * + * If the reference count of a LayersModel becomes 0, the `dispose` method of + * all its constituent `Layer`s will be called. + * + * Note: If the reference count is greater than 0 after the decrement, the + * `dispose` method of its constituent `Layer`s will *not* be called. + * + * After a LayersModel is disposed, it cannot be used in calls such as + * 'predict`, `evaluate` or `fit` anymore. + * + * @returns A DisposeResult Object with the following fields: + * - refCountAfterDispose: The reference count of the LayersModel after this + * `dispose()` call. + * - numDisposedVariables: Number of `tf.Variable`s (i.e., weights) disposed + * during this `dispose()` call. + * @throws {Error} If the layer is not built yet, or if the LayersModel has + * already been disposed. + */ + dispose(): DisposeResult; + get trainable(): boolean; + set trainable(trainable: boolean); + get trainableWeights(): LayerVariable[]; + get nonTrainableWeights(): LayerVariable[]; + get weights(): LayerVariable[]; + /** + * Loads all layer weights from a JSON object. + * + * Porting Note: HDF5 weight files cannot be directly loaded in JavaScript / + * TypeScript. The utility script at `scripts/pykeras.py` offers means + * to convert them into JSON strings compatible with this method. + * Porting Note: TensorFlow.js Layers supports only loading by name currently. + * + * @param weights A JSON mapping weight names to weight values as nested + * arrays of numbers, or a `NamedTensorMap`, i.e., a JSON mapping weight + * names to `tf.Tensor` objects. + * @param strict Require that the provided weights exactly match those + * required by the container. Default: `true`. Passing `false` means that + * extra weights and missing weights will be silently ignored. + */ + loadWeights(weights: NamedTensorMap, strict?: boolean): void; + /** + * Util shared between different serialization methods. + * @returns LayersModel config with Keras version information added. + */ + protected updatedConfig(): serialization.ConfigDict; + /** + * Returns a JSON string containing the network configuration. + * + * To load a network from a JSON save file, use + * models.modelFromJSON(jsonString); + * @param extraJsonArgs Unused in tfjs-layers, maintained for PyKeras + * @param returnString Whether the return value should be stringified + * (default: `true`). + * @returns a JSON string if `returnString` (default), or a JSON object if + * `!returnString`. + */ + toJSON(unused?: any, returnString?: boolean): string | PyJsonDict; + /** + * Call the model on new inputs. + * + * In this case `call` just reapplies all ops in the graph to the new inputs + * (e.g. build a new computational graph from the provided inputs). + * + * @param inputs A tensor or list of tensors. + * @param mask A mask or list of masks. A mask can be either a tensor or null + * (no mask). + * + * @return A tensor if there is a single output, or a list of tensors if there + * are more than one outputs. + */ + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + /** + * Computes an output mask tensor. + * + * @param inputs Tensor or list of tensors. + * @param mask Tensor or list of tensors. + * + * @return null or a tensor (or list of tensors, one per output tensor of the + * layer). + */ + computeMask(inputs: Tensor | Tensor[], mask?: Tensor | Tensor[]): Tensor | Tensor[]; + /** + * Computes the output shape of the layer. + * + * Assumes that the layer will be built to match that input shape provided. + * + * @param inputShape A shape (tuple of integers) or a list of shape tuples + * (one per output tensor of the layer). Shape tuples can include null for + * free dimensions, instead of an integer. + */ + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + /** + * Computes output tensors for new inputs. + * + * Note: + * - Expects `inputs` to be a list (potentially with 1 element). + * + * @param inputs List of tensors + * @param masks List of masks (tensors or null). + * @return Three lists: outputTensors, outputMasks, outputShapes + */ + protected runInternalGraph(inputs: Tensor[], masks?: Tensor[]): [ + Tensor[], + Tensor[], + Shape[] + ]; + /** + * Builds a map of internal node keys to node ordering. + * Used in serializaion a node orderings may change as unused nodes are + * dropped. Porting Note: This helper method was pulled out of getConfig to + * improve readability. + * @param layers An array of Layers in the model. + * @returns Map of Node Keys to index order within the layer. + */ + private buildNodeConversionMap; + /** + * Retrieves a layer based on either its name (unique) or index. + * + * Indices are based on order of horizontal graph traversal (bottom-up). + * + * If both `name` and `index` are specified, `index` takes precedence. + * + * @param name Name of layer. + * @param index Index of layer. + * @returns A Layer instance. + * @throws ValueError: In case of invalid layer name or index. + * + * @doc { + * heading: 'Layers', + * subheading: 'Classes', + * namespace: 'layers', + * subclasses: ['LayersModel'] + * } + */ + getLayer(name?: string, index?: number): Layer; + /** + * Retrieves the Container's current loss values. + * + * Used for regularizers during training. + */ + calculateLosses(): Scalar[]; + getConfig(): serialization.ConfigDict; + /** + * Instantiates a LayersModel from its config (output of `get_config()`). + * @param cls the class to create + * @param config LayersModel config dictionary. + * @param customObjects An optional dictionary of custom objects. + * @param fastWeightInit Optional flag to use fast weight initialization + * during deserialization. This is applicable to cases in which + * the initialization will be immediately overwritten by loaded weight + * values. Default: `false`. + * @returns A LayersModel instance. + * @throws ValueError: In case of improperly formatted config dict. + */ + /** @nocollapse */ + static fromConfig(cls: serialization.SerializableConstructor, config: serialization.ConfigDict, customObjects?: serialization.ConfigDict, fastWeightInit?: boolean): T; + /** + * Determine whether the container is stateful. + * + * Porting Note: this is the equivalent of the stateful @property of + * the Container class in PyKeras. + */ + get stateful(): boolean; + /** + * Reset the state of all stateful constituent layers (if any). + * + * Examples of stateful layers include RNN layers whose `stateful` property + * is set as `true`. + */ + resetStates(): void; +} + +/** Constructor config for Container. */ +declare interface ContainerArgs { + inputs: SymbolicTensor | SymbolicTensor[]; + outputs: SymbolicTensor | SymbolicTensor[]; + name?: string; +} + +/** + * Abstract nD convolution layer. Ancestor of convolution layers which reduce + * across channels, i.e., Conv1D and Conv2D, but not DepthwiseConv2D. + */ +declare abstract class Conv extends BaseConv { + protected readonly filters: number; + protected kernel: LayerVariable; + protected readonly kernelInitializer?: Initializer; + protected readonly kernelConstraint?: Constraint; + protected readonly kernelRegularizer?: Regularizer; + constructor(rank: number, args: ConvLayerArgs); + build(inputShape: Shape | Shape[]): void; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + getConfig(): serialization.ConfigDict; + protected static verifyArgs(args: ConvLayerArgs): void; +} + +declare class Conv1D extends Conv { + /** @nocollapse */ + static className: string; + constructor(args: ConvLayerArgs); + getConfig(): serialization.ConfigDict; + protected static verifyArgs(args: ConvLayerArgs): void; +} + +/** + * 1D convolution layer (e.g., temporal convolution). + * + * This layer creates a convolution kernel that is convolved + * with the layer input over a single spatial (or temporal) dimension + * to produce a tensor of outputs. + * + * If `use_bias` is True, a bias vector is created and added to the outputs. + * + * If `activation` is not `null`, it is applied to the outputs as well. + * + * When using this layer as the first layer in a model, provide an + * `inputShape` argument `Array` or `null`. + * + * For example, `inputShape` would be: + * - `[10, 128]` for sequences of 10 vectors of 128-dimensional vectors + * - `[null, 128]` for variable-length sequences of 128-dimensional vectors. + * + * @doc {heading: 'Layers', subheading: 'Convolutional', namespace: 'layers'} + */ +declare function conv1d(args: ConvLayerArgs): Conv1D; + +declare class Conv2D extends Conv { + /** @nocollapse */ + static className: string; + constructor(args: ConvLayerArgs); + getConfig(): serialization.ConfigDict; + protected static verifyArgs(args: ConvLayerArgs): void; +} + +/** + * 2D convolution layer (e.g. spatial convolution over images). + * + * This layer creates a convolution kernel that is convolved + * with the layer input to produce a tensor of outputs. + * + * If `useBias` is True, a bias vector is created and added to the outputs. + * + * If `activation` is not `null`, it is applied to the outputs as well. + * + * When using this layer as the first layer in a model, + * provide the keyword argument `inputShape` + * (Array of integers, does not include the sample axis), + * e.g. `inputShape=[128, 128, 3]` for 128x128 RGB pictures + * in `dataFormat='channelsLast'`. + * + * @doc {heading: 'Layers', subheading: 'Convolutional', namespace: 'layers'} + */ +declare function conv2d(args: ConvLayerArgs): Conv2D; + +declare class Conv2DTranspose extends Conv2D { + /** @nocollapse */ + static className: string; + constructor(args: ConvLayerArgs); + build(inputShape: Shape | Shape[]): void; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + getConfig(): serialization.ConfigDict; +} + +/** + * Transposed convolutional layer (sometimes called Deconvolution). + * + * The need for transposed convolutions generally arises + * from the desire to use a transformation going in the opposite direction of + * a normal convolution, i.e., from something that has the shape of the output + * of some convolution to something that has the shape of its input while + * maintaining a connectivity pattern that is compatible with said + * convolution. + * + * When using this layer as the first layer in a model, provide the + * configuration `inputShape` (`Array` of integers, does not include the + * sample axis), e.g., `inputShape: [128, 128, 3]` for 128x128 RGB pictures in + * `dataFormat: 'channelsLast'`. + * + * Input shape: + * 4D tensor with shape: + * `[batch, channels, rows, cols]` if `dataFormat` is `'channelsFirst'`. + * or 4D tensor with shape + * `[batch, rows, cols, channels]` if `dataFormat` is `'channelsLast'`. + * + * Output shape: + * 4D tensor with shape: + * `[batch, filters, newRows, newCols]` if `dataFormat` is + * `'channelsFirst'`. or 4D tensor with shape: + * `[batch, newRows, newCols, filters]` if `dataFormat` is `'channelsLast'`. + * + * References: + * - [A guide to convolution arithmetic for deep + * learning](https://arxiv.org/abs/1603.07285v1) + * - [Deconvolutional + * Networks](http://www.matthewzeiler.com/pubs/cvpr2010/cvpr2010.pdf) + * + * @doc {heading: 'Layers', subheading: 'Convolutional', namespace: 'layers'} + */ +declare function conv2dTranspose(args: ConvLayerArgs): Conv2DTranspose; + +declare class Conv3D extends Conv { + /** @nocollapse */ + static className: string; + constructor(args: ConvLayerArgs); + getConfig(): serialization.ConfigDict; + protected static verifyArgs(args: ConvLayerArgs): void; +} + +/** + * 3D convolution layer (e.g. spatial convolution over volumes). + * + * This layer creates a convolution kernel that is convolved + * with the layer input to produce a tensor of outputs. + * + * If `useBias` is True, a bias vector is created and added to the outputs. + * + * If `activation` is not `null`, it is applied to the outputs as well. + * + * When using this layer as the first layer in a model, + * provide the keyword argument `inputShape` + * (Array of integers, does not include the sample axis), + * e.g. `inputShape=[128, 128, 128, 1]` for 128x128x128 grayscale volumes + * in `dataFormat='channelsLast'`. + * + * @doc {heading: 'Layers', subheading: 'Convolutional', namespace: 'layers'} + */ +declare function conv3d(args: ConvLayerArgs): Conv3D; + +declare function conv3dTranspose(args: ConvLayerArgs): Layer; + +/** + * LayerConfig for non-depthwise convolutional layers. + * Applies to non-depthwise convolution of all ranks (e.g, Conv1D, Conv2D, + * Conv3D). + */ +declare interface ConvLayerArgs extends BaseConvLayerArgs { + /** + * The dimensionality of the output space (i.e. the number of filters in the + * convolution). + */ + filters: number; +} + +declare class ConvLSTM2D extends ConvRNN2D { + /** @nocollapse */ + static className: string; + constructor(args: ConvLSTM2DArgs); + /** @nocollapse */ + static fromConfig(cls: tfc.serialization.SerializableConstructor, config: tfc.serialization.ConfigDict): T; +} + +/** + * Convolutional LSTM layer - Xingjian Shi 2015. + * + * This is a `ConvRNN2D` layer consisting of one `ConvLSTM2DCell`. However, + * unlike the underlying `ConvLSTM2DCell`, the `apply` method of `ConvLSTM2D` + * operates on a sequence of inputs. The shape of the input (not including the + * first, batch dimension) needs to be 4-D, with the first dimension being time + * steps. For example: + * + * ```js + * const filters = 3; + * const kernelSize = 3; + * + * const batchSize = 4; + * const sequenceLength = 2; + * const size = 5; + * const channels = 3; + * + * const inputShape = [batchSize, sequenceLength, size, size, channels]; + * const input = tf.ones(inputShape); + * + * const layer = tf.layers.convLstm2d({filters, kernelSize}); + * + * const output = layer.apply(input); + * ``` + */ +/** @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'} */ +declare function convLstm2d(args: ConvLSTM2DArgs): ConvLSTM2D; + +declare interface ConvLSTM2DArgs extends Omit, ConvRNN2DLayerArgs { +} + +declare class ConvLSTM2DCell extends LSTMCell implements ConvRNN2DCell { + /** @nocollapse */ + static className: string; + readonly filters: number; + readonly kernelSize: number[]; + readonly strides: number[]; + readonly padding: PaddingMode; + readonly dataFormat: DataFormat; + readonly dilationRate: number[]; + constructor(args: ConvLSTM2DCellArgs); + build(inputShape: Shape | Shape[]): void; + call(inputs: tfc.Tensor[], kwargs: Kwargs): tfc.Tensor[]; + getConfig(): tfc.serialization.ConfigDict; + inputConv(x: Tensor, w: Tensor, b?: Tensor, padding?: PaddingMode): tfc.Tensor3D; + recurrentConv(x: Tensor, w: Tensor): tfc.Tensor3D; +} + +/** + * Cell class for `ConvLSTM2D`. + * + * `ConvLSTM2DCell` is distinct from the `ConvRNN2D` subclass `ConvLSTM2D` in + * that its `call` method takes the input data of only a single time step and + * returns the cell's output at the time step, while `ConvLSTM2D` takes the + * input data over a number of time steps. For example: + * + * ```js + * const filters = 3; + * const kernelSize = 3; + * + * const sequenceLength = 1; + * const size = 5; + * const channels = 3; + * + * const inputShape = [sequenceLength, size, size, channels]; + * const input = tf.ones(inputShape); + * + * const cell = tf.layers.convLstm2dCell({filters, kernelSize}); + * + * cell.build(input.shape); + * + * const outputSize = size - kernelSize + 1; + * const outShape = [sequenceLength, outputSize, outputSize, filters]; + * + * const initialH = tf.zeros(outShape); + * const initialC = tf.zeros(outShape); + * + * const [o, h, c] = cell.call([input, initialH, initialC], {}); + * ``` + */ +/** @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'} */ +declare function convLstm2dCell(args: ConvLSTM2DCellArgs): ConvLSTM2DCell; + +declare interface ConvLSTM2DCellArgs extends Omit, ConvRNN2DCellArgs { +} + +/** + * Base class for convolutional-recurrent layers. + */ +declare class ConvRNN2D extends RNN { + /** @nocollapse */ + static className: string; + readonly cell: ConvRNN2DCell; + constructor(args: ConvRNN2DLayerArgs); + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + computeOutputShape(inputShape: Shape): Shape | Shape[]; + getInitialState(inputs: tfc.Tensor): tfc.Tensor[]; + resetStates(states?: Tensor | Tensor[], training?: boolean): void; + protected computeSingleOutputShape(inputShape: Shape): Shape; +} + +declare abstract class ConvRNN2DCell extends RNNCell { + readonly filters: number; + readonly kernelSize: number[]; + readonly strides: number[]; + readonly padding: PaddingMode; + readonly dataFormat: DataFormat; + readonly dilationRate: number[]; + readonly activation: Activation; + readonly useBias: boolean; + readonly kernelInitializer: Initializer; + readonly recurrentInitializer: Initializer; + readonly biasInitializer: Initializer; + readonly kernelConstraint: Constraint; + readonly recurrentConstraint: Constraint; + readonly biasConstraint: Constraint; + readonly kernelRegularizer: Regularizer; + readonly recurrentRegularizer: Regularizer; + readonly biasRegularizer: Regularizer; + readonly dropout: number; + readonly recurrentDropout: number; +} + +declare interface ConvRNN2DCellArgs extends Omit { + /** + * The dimensionality of the output space (i.e. the number of filters in the + * convolution). + */ + filters: number; + /** + * The dimensions of the convolution window. If kernelSize is a number, the + * convolutional window will be square. + */ + kernelSize: number | number[]; + /** + * The strides of the convolution in each dimension. If strides is a number, + * strides in both dimensions are equal. + * + * Specifying any stride value != 1 is incompatible with specifying any + * `dilationRate` value != 1. + */ + strides?: number | number[]; + /** + * Padding mode. + */ + padding?: PaddingMode; + /** + * Format of the data, which determines the ordering of the dimensions in + * the inputs. + * + * `channels_last` corresponds to inputs with shape + * `(batch, ..., channels)` + * + * `channels_first` corresponds to inputs with shape `(batch, channels, + * ...)`. + * + * Defaults to `channels_last`. + */ + dataFormat?: DataFormat; + /** + * The dilation rate to use for the dilated convolution in each dimension. + * Should be an integer or array of two or three integers. + * + * Currently, specifying any `dilationRate` value != 1 is incompatible with + * specifying any `strides` value != 1. + */ + dilationRate?: number | [number] | [number, number]; +} + +declare interface ConvRNN2DLayerArgs extends BaseRNNLayerArgs, ConvRNN2DCellArgs { +} + +/** + * Loss or metric function: Cosine proximity. + * + * Mathematically, cosine proximity is defined as: + * `-sum(l2Normalize(yTrue) * l2Normalize(yPred))`, + * wherein `l2Normalize()` normalizes the L2 norm of the input to 1 and `*` + * represents element-wise multiplication. + * + * ```js + * const yTrue = tf.tensor2d([[1, 0], [1, 0]]); + * const yPred = tf.tensor2d([[1 / Math.sqrt(2), 1 / Math.sqrt(2)], [0, 1]]); + * const proximity = tf.metrics.cosineProximity(yTrue, yPred); + * proximity.print(); + * ``` + * + * @param yTrue Truth Tensor. + * @param yPred Prediction Tensor. + * @return Cosine proximity Tensor. + * + * @doc {heading: 'Metrics', namespace: 'metrics'} + */ +declare function cosineProximity(yTrue: Tensor, yPred: Tensor): Tensor; + +declare function createBufferFromOutputTexture(gl2: WebGL2RenderingContext, rows: number, columns: number, textureConfig: TextureConfig): WebGLBuffer; + +declare function createFloat16MatrixTexture(gl: WebGLRenderingContext, rows: number, columns: number, textureConfig: TextureConfig): Texture; + +declare function createFloat16PackedMatrixTexture(gl: WebGLRenderingContext, rows: number, columns: number, textureConfig: TextureConfig): Texture; + +declare function createFloat32MatrixTexture(gl: WebGLRenderingContext, rows: number, columns: number, textureConfig: TextureConfig): Texture; + +declare function createFragmentShader(gl: WebGLRenderingContext, fragmentShaderSource: string): WebGLShader; + +declare function createFramebuffer(gl: WebGLRenderingContext): WebGLFramebuffer; + +declare function createIndexBuffer(gl: WebGLRenderingContext): WebGLBuffer; + +declare function createPackedMatrixTexture(gl: WebGLRenderingContext, rows: number, columns: number, textureConfig: TextureConfig): Texture; + +declare function createProgram(gl: WebGLRenderingContext): WebGLProgram; + +declare function createStaticIndexBuffer(gl: WebGLRenderingContext, data: Uint16Array): WebGLBuffer; + +declare function createStaticVertexBuffer(gl: WebGLRenderingContext, data: Float32Array): WebGLBuffer; + +declare function createTexture(gl: WebGLRenderingContext): WebGLTexture; + +declare function createUnsignedBytesMatrixTexture(gl: WebGLRenderingContext, rows: number, columns: number, textureConfig: TextureConfig): Texture; + +declare function createVertexBuffer(gl: WebGLRenderingContext): WebGLBuffer; + +declare function createVertexShader(gl: WebGLRenderingContext): WebGLShader; + +declare function createVertexShader_2(gl: WebGLRenderingContext, vertexShaderSource: string): WebGLShader; + +declare class Cropping2D extends Layer { + /** @nocollapse */ + static className: string; + protected readonly cropping: [[number, number], [number, number]]; + protected readonly dataFormat: DataFormat; + constructor(args: Cropping2DLayerArgs); + computeOutputShape(inputShape: Shape): Shape; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + getConfig(): serialization.ConfigDict; +} + +/** + * Cropping layer for 2D input (e.g., image). + * + * This layer can crop an input + * at the top, bottom, left and right side of an image tensor. + * + * Input shape: + * 4D tensor with shape: + * - If `dataFormat` is `"channelsLast"`: + * `[batch, rows, cols, channels]` + * - If `data_format` is `"channels_first"`: + * `[batch, channels, rows, cols]`. + * + * Output shape: + * 4D with shape: + * - If `dataFormat` is `"channelsLast"`: + * `[batch, croppedRows, croppedCols, channels]` + * - If `dataFormat` is `"channelsFirst"`: + * `[batch, channels, croppedRows, croppedCols]`. + * + * Examples + * ```js + * + * const model = tf.sequential(); + * model.add(tf.layers.cropping2D({cropping:[[2, 2], [2, 2]], + * inputShape: [128, 128, 3]})); + * //now output shape is [batch, 124, 124, 3] + * ``` + * + * @doc {heading: 'Layers', subheading: 'Convolutional', namespace: 'layers'} + */ +declare function cropping2D(args: Cropping2DLayerArgs): Cropping2D; + +declare interface Cropping2DLayerArgs extends LayerArgs { + /** + * Dimension of the cropping along the width and the height. + * - If integer: the same symmetric cropping + * is applied to width and height. + * - If list of 2 integers: + * interpreted as two different + * symmetric cropping values for height and width: + * `[symmetric_height_crop, symmetric_width_crop]`. + * - If a list of 2 lists of 2 integers: + * interpreted as + * `[[top_crop, bottom_crop], [left_crop, right_crop]]` + */ + cropping: number | [number, number] | [[number, number], [number, number]]; + /** + * Format of the data, which determines the ordering of the dimensions in + * the inputs. + * + * `channels_last` corresponds to inputs with shape + * `(batch, ..., channels)` + * + * `channels_first` corresponds to inputs with shape + * `(batch, channels, ...)` + * + * Defaults to `channels_last`. + */ + dataFormat?: DataFormat; +} + +/** + * Custom callback for training. + */ +export declare class CustomCallback extends BaseCallback { + protected readonly trainBegin: (logs?: Logs) => void | Promise; + protected readonly trainEnd: (logs?: Logs) => void | Promise; + protected readonly epochBegin: (epoch: number, logs?: Logs) => void | Promise; + protected readonly epochEnd: (epoch: number, logs?: Logs) => void | Promise; + protected readonly batchBegin: (batch: number, logs?: Logs) => void | Promise; + protected readonly batchEnd: (batch: number, logs?: Logs) => void | Promise; + protected readonly yield: (epoch: number, batch: number, logs: Logs) => void | Promise; + private yieldEvery; + private currentEpoch; + nowFunc: Function; + nextFrameFunc: Function; + constructor(args: CustomCallbackArgs, yieldEvery?: YieldEveryOptions); + maybeWait(epoch: number, batch: number, logs: UnresolvedLogs): Promise; + onEpochBegin(epoch: number, logs?: UnresolvedLogs): Promise; + onEpochEnd(epoch: number, logs?: UnresolvedLogs): Promise; + onBatchBegin(batch: number, logs?: UnresolvedLogs): Promise; + onBatchEnd(batch: number, logs?: UnresolvedLogs): Promise; + onTrainBegin(logs?: UnresolvedLogs): Promise; + onTrainEnd(logs?: UnresolvedLogs): Promise; +} + +export declare interface CustomCallbackArgs { + onTrainBegin?: (logs?: Logs) => void | Promise; + onTrainEnd?: (logs?: Logs) => void | Promise; + onEpochBegin?: (epoch: number, logs?: Logs) => void | Promise; + onEpochEnd?: (epoch: number, logs?: Logs) => void | Promise; + onBatchBegin?: (batch: number, logs?: Logs) => void | Promise; + onBatchEnd?: (batch: number, logs?: Logs) => void | Promise; + onYield?: (epoch: number, batch: number, logs: Logs) => void | Promise; + nowFunc?: Function; + nextFrameFunc?: Function; +} + +/** @docinline */ +declare type DataFormat = 'channelsFirst' | 'channelsLast'; + +declare interface DataId { +} + +declare type DataId_3 = object; + +declare interface DataId_4 { +} + +declare abstract class Dataset { + abstract iterator(): Promise>; + size: number; +} + +/** DataType enum. */ +declare enum DataType_2 { + DT_INVALID = 0, + DT_FLOAT = 1, + DT_DOUBLE = 2, + DT_INT32 = 3, + DT_UINT8 = 4, + DT_INT16 = 5, + DT_INT8 = 6, + DT_STRING = 7, + DT_COMPLEX64 = 8, + DT_INT64 = 9, + DT_BOOL = 10, + DT_QINT8 = 11, + DT_QUINT8 = 12, + DT_QINT32 = 13, + DT_BFLOAT16 = 14, + DT_QINT16 = 15, + DT_QUINT16 = 16, + DT_UINT16 = 17, + DT_COMPLEX128 = 18, + DT_HALF = 19, + DT_RESOURCE = 20, + DT_VARIANT = 21, + DT_UINT32 = 22, + DT_UINT64 = 23, + DT_FLOAT_REF = 101, + DT_DOUBLE_REF = 102, + DT_INT32_REF = 103, + DT_UINT8_REF = 104, + DT_INT16_REF = 105, + DT_INT8_REF = 106, + DT_STRING_REF = 107, + DT_COMPLEX64_REF = 108, + DT_INT64_REF = 109, + DT_BOOL_REF = 110, + DT_QINT8_REF = 111, + DT_QUINT8_REF = 112, + DT_QINT32_REF = 113, + DT_BFLOAT16_REF = 114, + DT_QINT16_REF = 115, + DT_QUINT16_REF = 116, + DT_UINT16_REF = 117, + DT_COMPLEX128_REF = 118, + DT_HALF_REF = 119, + DT_RESOURCE_REF = 120, + DT_VARIANT_REF = 121, + DT_UINT32_REF = 122, + DT_UINT64_REF = 123 +} + +declare interface DefaultValueTypeMap { + bool: boolean; + int32: number; + float32: number; + string: string; +} + +declare class Dense extends Layer { + /** @nocollapse */ + static className: string; + private units; + private activation; + private useBias; + private kernelInitializer; + private biasInitializer; + private kernel; + private bias; + readonly DEFAULT_KERNEL_INITIALIZER: InitializerIdentifier; + readonly DEFAULT_BIAS_INITIALIZER: InitializerIdentifier; + private readonly kernelConstraint?; + private readonly biasConstraint?; + private readonly kernelRegularizer?; + private readonly biasRegularizer?; + constructor(args: DenseLayerArgs); + build(inputShape: Shape | Shape[]): void; + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + getConfig(): serialization.ConfigDict; +} + +/** + * Creates a dense (fully connected) layer. + * + * This layer implements the operation: + * `output = activation(dot(input, kernel) + bias)` + * + * `activation` is the element-wise activation function + * passed as the `activation` argument. + * + * `kernel` is a weights matrix created by the layer. + * + * `bias` is a bias vector created by the layer (only applicable if `useBias` + * is `true`). + * + * **Input shape:** + * + * nD `tf.Tensor` with shape: `(batchSize, ..., inputDim)`. + * + * The most common situation would be + * a 2D input with shape `(batchSize, inputDim)`. + * + * **Output shape:** + * + * nD tensor with shape: `(batchSize, ..., units)`. + * + * For instance, for a 2D input with shape `(batchSize, inputDim)`, + * the output would have shape `(batchSize, units)`. + * + * Note: if the input to the layer has a rank greater than 2, then it is + * flattened prior to the initial dot product with the kernel. + * + * @doc {heading: 'Layers', subheading: 'Basic', namespace: 'layers'} + */ +declare function dense(args: DenseLayerArgs): Dense; + +declare interface DenseLayerArgs extends LayerArgs { + /** Positive integer, dimensionality of the output space. */ + units: number; + /** + * Activation function to use. + * + * If unspecified, no activation is applied. + */ + activation?: ActivationIdentifier; + /** Whether to apply a bias. */ + useBias?: boolean; + /** + * Initializer for the dense kernel weights matrix. + */ + kernelInitializer?: InitializerIdentifier | Initializer; + /** + * Initializer for the bias vector. + */ + biasInitializer?: InitializerIdentifier | Initializer; + /** + * If specified, defines inputShape as `[inputDim]`. + */ + inputDim?: number; + /** + * Constraint for the kernel weights. + */ + kernelConstraint?: ConstraintIdentifier | Constraint; + /** + * Constraint for the bias vector. + */ + biasConstraint?: ConstraintIdentifier | Constraint; + /** + * Regularizer function applied to the dense kernel weights matrix. + */ + kernelRegularizer?: RegularizerIdentifier | Regularizer; + /** + * Regularizer function applied to the bias vector. + */ + biasRegularizer?: RegularizerIdentifier | Regularizer; + /** + * Regularizer function applied to the activation. + */ + activityRegularizer?: RegularizerIdentifier | Regularizer; +} + +declare class DepthwiseConv2D extends BaseConv { + /** @nocollapse */ + static className: string; + private readonly depthMultiplier; + private readonly depthwiseInitializer; + private readonly depthwiseConstraint; + private readonly depthwiseRegularizer; + private depthwiseKernel; + constructor(args: DepthwiseConv2DLayerArgs); + build(inputShape: Shape | Shape[]): void; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + getConfig(): serialization.ConfigDict; +} + +/** + * Depthwise separable 2D convolution. + * + * Depthwise Separable convolutions consists in performing just the first step + * in a depthwise spatial convolution (which acts on each input channel + * separately). The `depthMultiplier` argument controls how many output channels + * are generated per input channel in the depthwise step. + * + * @doc {heading: 'Layers', subheading: 'Convolutional', namespace: 'layers'} + */ +declare function depthwiseConv2d(args: DepthwiseConv2DLayerArgs): DepthwiseConv2D; + +declare interface DepthwiseConv2DLayerArgs extends BaseConvLayerArgs { + /** + * An integer or Array of 2 integers, specifying the width and height of the + * 2D convolution window. Can be a single integer to specify the same value + * for all spatial dimensions. + */ + kernelSize: number | [number, number]; + /** + * The number of depthwise convolution output channels for each input + * channel. + * The total number of depthwise convolution output channels will be equal to + * `filtersIn * depthMultiplier`. + * Default: 1. + */ + depthMultiplier?: number; + /** + * Initializer for the depthwise kernel matrix. + * Default: GlorotNormal. + */ + depthwiseInitializer?: InitializerIdentifier | Initializer; + /** + * Constraint for the depthwise kernel matrix. + */ + depthwiseConstraint?: ConstraintIdentifier | Constraint; + /** + * Regularizer function for the depthwise kernel matrix. + */ + depthwiseRegularizer?: RegularizerIdentifier | Regularizer; +} + +/** + * Deregister the Op for graph model executor. + * + * @param name The Tensorflow Op name. + * + * @doc {heading: 'Models', subheading: 'Op Registry'} + */ +export declare function deregisterOp(name: string): void; + +/** + * The type of the return value of Layer.dispose() and Container.dispose(). + */ +declare interface DisposeResult { + /** + * Reference count after the dispose call. + */ + refCountAfterDispose: number; + /** + * Number of variables dispose in this dispose call. + */ + numDisposedVariables: number; +} + +/** @docinline */ +declare type Distribution = 'normal' | 'uniform' | 'truncatedNormal'; + +declare class Dot extends Merge { + /** @nocollapse */ + static className: string; + private axes; + private normalize; + constructor(args: DotLayerArgs); + build(inputShape: Shape | Shape[]): void; + protected mergeFunction(inputs: Tensor[]): Tensor; + private interpretAxes; + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + computeMask(inputs: Tensor | Tensor[], mask?: Tensor | Tensor[]): Tensor; + getConfig(): serialization.ConfigDict; +} + +/** + * Layer that computes a dot product between samples in two tensors. + * + * E.g., if applied to a list of two tensors `a` and `b` both of shape + * `[batchSize, n]`, the output will be a tensor of shape `[batchSize, 1]`, + * where each entry at index `[i, 0]` will be the dot product between + * `a[i, :]` and `b[i, :]`. + * + * Example: + * + * ```js + * const dotLayer = tf.layers.dot({axes: -1}); + * const x1 = tf.tensor2d([[10, 20], [30, 40]]); + * const x2 = tf.tensor2d([[-1, -2], [-3, -4]]); + * + * // Invoke the layer's apply() method in eager (imperative) mode. + * const y = dotLayer.apply([x1, x2]); + * y.print(); + * ``` + * + * @doc {heading: 'Layers', subheading: 'Merge', namespace: 'layers'} + */ +declare function dot(args: DotLayerArgs): Dot; + +declare interface DotLayerArgs extends LayerArgs { + /** + * Axis or axes along which the dot product will be taken. + * + * Integer or an Array of integers. + */ + axes: number | [number, number]; + /** + * Whether to L2-normalize samples along the dot product axis + * before taking the dot product. + * + * If set to `true`, the output of the dot product is the cosine + * proximity between the two samples. + */ + normalize?: boolean; +} + +declare function downloadByteEncodedFloatMatrixFromOutputTexture(gl: WebGLRenderingContext, rows: number, columns: number, textureConfig: TextureConfig): Float32Array; + +declare function downloadFloat32MatrixFromBuffer(gl: WebGLRenderingContext, buffer: WebGLBuffer, size: number): Float32Array; + +declare function downloadMatrixFromPackedOutputTexture(gl: WebGLRenderingContext, physicalRows: number, physicalCols: number): Float32Array; + +declare function downloadPackedMatrixFromBuffer(gl: WebGLRenderingContext, buffer: WebGLBuffer, batch: number, rows: number, cols: number, physicalRows: number, physicalCols: number, textureConfig: TextureConfig): Float32Array; + +declare class Dropout extends Layer { + /** @nocollapse */ + static className: string; + private readonly rate; + private readonly noiseShape; + private readonly seed; + constructor(args: DropoutLayerArgs); + protected getNoiseShape(input: Tensor): Shape; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + getConfig(): serialization.ConfigDict; + dispose(): DisposeResult; +} + +/** + * Applies + * [dropout](http://www.cs.toronto.edu/~rsalakhu/papers/srivastava14a.pdf) to + * the input. + * + * Dropout consists in randomly setting a fraction `rate` of input units to 0 at + * each update during training time, which helps prevent overfitting. + * + * @doc {heading: 'Layers', subheading: 'Basic', namespace: 'layers'} + */ +declare function dropout(args: DropoutLayerArgs): Dropout; + +declare interface DropoutLayerArgs extends LayerArgs { + /** Float between 0 and 1. Fraction of the input units to drop. */ + rate: number; + /** + * Integer array representing the shape of the binary dropout mask that will + * be multiplied with the input. + * + * For instance, if your inputs have shape `(batchSize, timesteps, features)` + * and you want the dropout mask to be the same for all timesteps, you can use + * `noise_shape=(batch_size, 1, features)`. + */ + noiseShape?: number[]; + /** An integer to use as random seed. */ + seed?: number; +} + +/** + * A Callback that stops training when a monitored quantity has stopped + * improving. + */ +export declare class EarlyStopping extends Callback { + protected readonly monitor: string; + protected readonly minDelta: number; + protected readonly patience: number; + protected readonly baseline: number; + protected readonly verbose: number; + protected readonly mode: 'auto' | 'min' | 'max'; + protected monitorFunc: (currVal: number, prevVal: number) => boolean; + private wait; + private stoppedEpoch; + private best; + constructor(args?: EarlyStoppingCallbackArgs); + onTrainBegin(logs?: Logs): Promise; + onEpochEnd(epoch: number, logs?: Logs): Promise; + onTrainEnd(logs?: Logs): Promise; + private getMonitorValue; +} + +/** + * Factory function for a Callback that stops training when a monitored + * quantity has stopped improving. + * + * Early stopping is a type of regularization, and protects model against + * overfitting. + * + * The following example based on fake data illustrates how this callback + * can be used during `tf.LayersModel.fit()`: + * + * ```js + * const model = tf.sequential(); + * model.add(tf.layers.dense({ + * units: 3, + * activation: 'softmax', + * kernelInitializer: 'ones', + * inputShape: [2] + * })); + * const xs = tf.tensor2d([1, 2, 3, 4], [2, 2]); + * const ys = tf.tensor2d([[1, 0, 0], [0, 1, 0]], [2, 3]); + * const xsVal = tf.tensor2d([4, 3, 2, 1], [2, 2]); + * const ysVal = tf.tensor2d([[0, 0, 1], [0, 1, 0]], [2, 3]); + * model.compile( + * {loss: 'categoricalCrossentropy', optimizer: 'sgd', metrics: ['acc']}); + * + * // Without the EarlyStopping callback, the val_acc value would be: + * // 0.5, 0.5, 0.5, 0.5, ... + * // With val_acc being monitored, training should stop after the 2nd epoch. + * const history = await model.fit(xs, ys, { + * epochs: 10, + * validationData: [xsVal, ysVal], + * callbacks: tf.callbacks.earlyStopping({monitor: 'val_acc'}) + * }); + * + * // Expect to see a length-2 array. + * console.log(history.history.val_acc); + * ``` + * + * @doc { + * heading: 'Callbacks', + * namespace: 'callbacks' + * } + */ +declare function earlyStopping(args?: EarlyStoppingCallbackArgs): EarlyStopping; + +export declare interface EarlyStoppingCallbackArgs { + /** + * Quantity to be monitored. + * + * Defaults to 'val_loss'. + */ + monitor?: string; + /** + * Minimum change in the monitored quantity to qualify as improvement, + * i.e., an absolute change of less than `minDelta` will count as no + * improvement. + * + * Defaults to 0. + */ + minDelta?: number; + /** + * Number of epochs with no improvement after which training will be stopped. + * + * Defaults to 0. + */ + patience?: number; + /** Verbosity mode. */ + verbose?: number; + /** + * Mode: one of 'min', 'max', and 'auto'. + * - In 'min' mode, training will be stopped when the quantity monitored has + * stopped decreasing. + * - In 'max' mode, training will be stopped when the quantity monitored has + * stopped increasing. + * - In 'auto' mode, the direction is inferred automatically from the name of + * the monitored quantity. + * + * Defaults to 'auto'. + */ + mode?: 'auto' | 'min' | 'max'; + /** + * Baseline value of the monitored quantity. + * + * If specified, training will be stopped if the model doesn't show + * improvement over the baseline. + */ + baseline?: number; + /** + * Whether to restore model weights from the epoch with the best value + * of the monitored quantity. If `False`, the model weights obtained at the + * last step of training are used. + * + * **`True` is not supported yet.** + */ + restoreBestWeights?: boolean; +} + +declare class ELU extends Layer { + /** @nocollapse */ + static className: string; + readonly alpha: number; + readonly DEFAULT_ALPHA = 1; + constructor(args?: ELULayerArgs); + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + getConfig(): serialization.ConfigDict; +} + +/** + * Exponential Linear Unit (ELU). + * + * It follows: + * `f(x) = alpha * (exp(x) - 1.) for x < 0`, + * `f(x) = x for x >= 0`. + * + * Input shape: + * Arbitrary. Use the configuration `inputShape` when using this layer as the + * first layer in a model. + * + * Output shape: + * Same shape as the input. + * + * References: + * - [Fast and Accurate Deep Network Learning by Exponential Linear Units + * (ELUs)](https://arxiv.org/abs/1511.07289v1) + * + * @doc { + * heading: 'Layers', + * subheading: 'Advanced Activation', + * namespace: 'layers' + * } + */ +declare function elu(args?: ELULayerArgs): ELU; + +declare interface ELULayerArgs extends LayerArgs { + /** + * Float `>= 0`. Negative slope coefficient. Defaults to `1.0`. + */ + alpha?: number; +} + +declare class Embedding extends Layer { + /** @nocollapse */ + static className: string; + private inputDim; + private outputDim; + private embeddingsInitializer; + private maskZero; + private inputLength; + private embeddings; + readonly DEFAULT_EMBEDDINGS_INITIALIZER: InitializerIdentifier; + private readonly embeddingsRegularizer?; + private readonly embeddingsConstraint?; + constructor(args: EmbeddingLayerArgs); + build(inputShape: Shape | Shape[]): void; + protected warnOnIncompatibleInputShape(inputShape: Shape): void; + computeMask(inputs: Tensor | Tensor[], mask?: Tensor | Tensor[]): Tensor; + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + getConfig(): serialization.ConfigDict; +} + +/** + * Maps positive integers (indices) into dense vectors of fixed size. + * E.g. [[4], [20]] -> [[0.25, 0.1], [0.6, -0.2]] + * + * **Input shape:** 2D tensor with shape: `[batchSize, sequenceLength]`. + * + * **Output shape:** 3D tensor with shape: `[batchSize, sequenceLength, + * outputDim]`. + * + * @doc {heading: 'Layers', subheading: 'Basic', namespace: 'layers'} + */ +declare function embedding(args: EmbeddingLayerArgs): Embedding; + +declare interface EmbeddingLayerArgs extends LayerArgs { + /** + * Integer > 0. Size of the vocabulary, i.e. maximum integer index + 1. + */ + inputDim: number; + /** + * Integer >= 0. Dimension of the dense embedding. + */ + outputDim: number; + /** + * Initializer for the `embeddings` matrix. + */ + embeddingsInitializer?: InitializerIdentifier | Initializer; + /** + * Regularizer function applied to the `embeddings` matrix. + */ + embeddingsRegularizer?: RegularizerIdentifier | Regularizer; + /** + * Regularizer function applied to the activation. + */ + activityRegularizer?: RegularizerIdentifier | Regularizer; + /** + * Constraint function applied to the `embeddings` matrix. + */ + embeddingsConstraint?: ConstraintIdentifier | Constraint; + /** + * Whether the input value 0 is a special "padding" value that should be + * masked out. This is useful when using recurrent layers which may take + * variable length input. + * + * If this is `True` then all subsequent layers in the model need to support + * masking or an exception will be raised. If maskZero is set to `True`, as a + * consequence, index 0 cannot be used in the vocabulary (inputDim should + * equal size of vocabulary + 1). + */ + maskZero?: boolean; + /** + * Length of input sequences, when it is constant. + * + * This argument is required if you are going to connect `flatten` then + * `dense` layers upstream (without it, the shape of the dense outputs cannot + * be computed). + */ + inputLength?: number | number[]; +} + +declare const equalImpl: SimpleBinaryKernelImpl; + +declare const expImpl: SimpleUnaryImpl; + +declare const expm1Impl: SimpleUnaryImpl; + +/** @docinline */ +declare type FanMode = 'fanIn' | 'fanOut' | 'fanAvg'; + +declare interface FenceContext { + query: WebGLQuery | WebGLSync; + isFencePassed(): boolean; +} + +declare function flatDispatchLayout(shape: number[]): { + x: number[]; +}; + +declare class Flatten extends Layer { + private dataFormat; + /** @nocollapse */ + static className: string; + constructor(args?: FlattenLayerArgs); + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + getConfig(): serialization.ConfigDict; +} + +/** + * Flattens the input. Does not affect the batch size. + * + * A `Flatten` layer flattens each batch in its inputs to 1D (making the output + * 2D). + * + * For example: + * + * ```js + * const input = tf.input({shape: [4, 3]}); + * const flattenLayer = tf.layers.flatten(); + * // Inspect the inferred output shape of the flatten layer, which + * // equals `[null, 12]`. The 2nd dimension is 4 * 3, i.e., the result of the + * // flattening. (The 1st dimension is the undermined batch size.) + * console.log(JSON.stringify(flattenLayer.apply(input).shape)); + * ``` + * + * @doc {heading: 'Layers', subheading: 'Basic', namespace: 'layers'} + */ +declare function flatten(args?: FlattenLayerArgs): Flatten; + +declare interface FlattenLayerArgs extends LayerArgs { + /** Image data format: channelsLast (default) or channelsFirst. */ + dataFormat?: DataFormat; +} + +declare const floorImpl: SimpleUnaryImpl; + +/** + * Enforce use of half precision textures if available on the platform. + * + * @doc {heading: 'Environment', namespace: 'webgl'} + */ +export declare function forceHalfFloat(): void; + +declare function gatherNdImpl(indicesData: TypedArray, paramsBuf: TensorBuffer, dtype: DataType, numSlices: number, sliceRank: number, sliceSize: number, strides: number[], paramsShape: number[], paramsSize: number): TensorBuffer; + +declare function gatherV2Impl(xBuf: TensorBuffer, indicesBuf: TensorBuffer, flattenOutputShape: number[]): TensorBuffer; + +declare class GaussianDropout extends Layer { + /** @nocollapse */ + static className: string; + readonly rate: number; + constructor(args: GaussianDropoutArgs); + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + getConfig(): { + rate: number; + }; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; +} + +/** + * Apply multiplicative 1-centered Gaussian noise. + * + * As it is a regularization layer, it is only active at training time. + * + * Arguments: + * - `rate`: float, drop probability (as with `Dropout`). + * The multiplicative noise will have + * standard deviation `sqrt(rate / (1 - rate))`. + * + * Input shape: + * Arbitrary. Use the keyword argument `inputShape` + * (tuple of integers, does not include the samples axis) + * when using this layer as the first layer in a model. + * + * Output shape: + * Same shape as input. + * + * References: + * - [Dropout: A Simple Way to Prevent Neural Networks from Overfitting]( + * http://www.cs.toronto.edu/~rsalakhu/papers/srivastava14a.pdf) + * + * @doc {heading: 'Layers', subheading: 'Noise', namespace: 'layers'} + */ +declare function gaussianDropout(args: GaussianDropoutArgs): GaussianDropout; + +declare interface GaussianDropoutArgs extends LayerArgs { + /** drop probability. */ + rate: number; +} + +declare class GaussianNoise extends Layer { + /** @nocollapse */ + static className: string; + readonly stddev: number; + constructor(args: GaussianNoiseArgs); + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + getConfig(): { + stddev: number; + }; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; +} + +/** + * Apply additive zero-centered Gaussian noise. + * + * As it is a regularization layer, it is only active at training time. + * + * This is useful to mitigate overfitting + * (you could see it as a form of random data augmentation). + * Gaussian Noise (GS) is a natural choice as corruption process + * for real valued inputs. + * + * # Arguments + * stddev: float, standard deviation of the noise distribution. + * + * # Input shape + * Arbitrary. Use the keyword argument `input_shape` + * (tuple of integers, does not include the samples axis) + * when using this layer as the first layer in a model. + * + * # Output shape + * Same shape as input. + * + * @doc {heading: 'Layers', subheading: 'Noise', namespace: 'layers'} + */ +declare function gaussianNoise(args: GaussianNoiseArgs): GaussianNoise; + +declare interface GaussianNoiseArgs extends LayerArgs { + /** Standard Deviation. */ + stddev: number; +} + +declare function getBatchDim(shape: number[], dimsToSkip?: number): number; + +declare function getCoordsDataType(rank: number): string; + +declare function getCoordsXYZ(index: number): string; + +declare function getExtensionOrThrow(gl: WebGLRenderingContext, extensionName: string): {}; + +declare function getFramebufferErrorMessage(gl: WebGLRenderingContext, status: number): string; + +declare function getInternalFormatForFloat16MatrixTexture(textureConfig: TextureConfig): number; + +declare function getInternalFormatForFloat16PackedMatrixTexture(textureConfig: TextureConfig): number; + +declare function getInternalFormatForFloat32MatrixTexture(textureConfig: TextureConfig): number; + +declare function getInternalFormatForPackedMatrixTexture(textureConfig: TextureConfig): number; + +declare function getInternalFormatForUnsignedBytesMatrixTexture(textureConfig: TextureConfig): number; + +declare function getMainHeaderString(): string; + +declare function getMainHeaderString(index: string): string; + +declare function getMaxTexturesInShader(webGLVersion: number): number; + +declare function getNumChannels(): number; + +declare function getProgramUniformLocation(gl: WebGLRenderingContext, program: WebGLProgram, uniformName: string): WebGLUniformLocation; + +declare function getProgramUniformLocationOrThrow(gl: WebGLRenderingContext, program: WebGLProgram, uniformName: string): WebGLUniformLocation; + +declare function getRowsCols(shape: number[]): [number, number]; + +declare function getShapeAs3D(shape: number[]): [number, number, number]; + +declare function getStartHeaderString(useGlobalIndex: boolean): string; + +declare function getTextureShapeFromLogicalShape(logShape: number[], isPacked?: boolean): [number, number]; + +/** + * Gets the actual threads count that is used by XNNPACK. + * + * It is set after the backend is intialized. + */ +export declare function getThreadsCount(): number; + +declare function getWebGLDisjointQueryTimerVersion(webGLVersion: number): number; + +declare function getWebGLErrorMessage(gl: WebGLRenderingContext, status: number): string; + +declare function getWebGLMaxTextureSize(webGLVersion: number): number; + +declare function getWorkgroupSizeString(): string; + +declare class GlobalAveragePooling1D extends GlobalPooling1D { + /** @nocollapse */ + static className: string; + constructor(args?: LayerArgs); + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; +} + +/** + * Global average pooling operation for temporal data. + * + * Input Shape: 3D tensor with shape: `[batchSize, steps, features]`. + * + * Output Shape: 2D tensor with shape: `[batchSize, features]`. + * + * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'} + */ +declare function globalAveragePooling1d(args?: LayerArgs): GlobalAveragePooling1D; + +declare class GlobalAveragePooling2D extends GlobalPooling2D { + /** @nocollapse */ + static className: string; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; +} + +/** + * Global average pooling operation for spatial data. + * + * Input shape: + * - If `dataFormat` is `CHANNEL_LAST`: + * 4D tensor with shape: `[batchSize, rows, cols, channels]`. + * - If `dataFormat` is `CHANNEL_FIRST`: + * 4D tensor with shape: `[batchSize, channels, rows, cols]`. + * + * Output shape: + * 2D tensor with shape: `[batchSize, channels]`. + * + * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'} + */ +declare function globalAveragePooling2d(args: GlobalPooling2DLayerArgs): GlobalAveragePooling2D; + +declare const globalMaxPool1d: typeof globalMaxPooling1d; + +declare const globalMaxPool2d: typeof globalMaxPooling2d; + +declare class GlobalMaxPooling1D extends GlobalPooling1D { + /** @nocollapse */ + static className: string; + constructor(args: LayerArgs); + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; +} + +/** + * Global max pooling operation for temporal data. + * + * Input Shape: 3D tensor with shape: `[batchSize, steps, features]`. + * + * Output Shape: 2D tensor with shape: `[batchSize, features]`. + * + * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'} + */ +declare function globalMaxPooling1d(args?: LayerArgs): GlobalMaxPooling1D; + +declare class GlobalMaxPooling2D extends GlobalPooling2D { + /** @nocollapse */ + static className: string; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; +} + +/** + * Global max pooling operation for spatial data. + * + * Input shape: + * - If `dataFormat` is `CHANNEL_LAST`: + * 4D tensor with shape: `[batchSize, rows, cols, channels]`. + * - If `dataFormat` is `CHANNEL_FIRST`: + * 4D tensor with shape: `[batchSize, channels, rows, cols]`. + * + * Output shape: + * 2D tensor with shape: `[batchSize, channels]`. + * + * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'} + */ +declare function globalMaxPooling2d(args: GlobalPooling2DLayerArgs): GlobalMaxPooling2D; + +/** + * Abstract class for different global pooling 1D layers. + */ +declare abstract class GlobalPooling1D extends Layer { + constructor(args: LayerArgs); + computeOutputShape(inputShape: Shape): Shape; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; +} + +/** + * Abstract class for different global pooling 2D layers. + */ +declare abstract class GlobalPooling2D extends Layer { + protected dataFormat: DataFormat; + constructor(args: GlobalPooling2DLayerArgs); + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + getConfig(): serialization.ConfigDict; +} + +declare interface GlobalPooling2DLayerArgs extends LayerArgs { + /** + * One of `CHANNEL_LAST` (default) or `CHANNEL_FIRST`. + * + * The ordering of the dimensions in the inputs. `CHANNEL_LAST` corresponds + * to inputs with shape `[batch, height, width, channels]` while + * `CHANNEL_FIRST` corresponds to inputs with shape + * `[batch, channels, height, width]`. + */ + dataFormat?: DataFormat; +} + +/** + * Glorot normal initializer, also called Xavier normal initializer. + * It draws samples from a truncated normal distribution centered on 0 + * with `stddev = sqrt(2 / (fan_in + fan_out))` + * where `fan_in` is the number of input units in the weight tensor + * and `fan_out` is the number of output units in the weight tensor. + * + * Reference: + * Glorot & Bengio, AISTATS 2010 + * http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf + * + * @doc {heading: 'Initializers', namespace: 'initializers'} + */ +declare function glorotNormal(args: SeedOnlyInitializerArgs): Initializer; + +/** + * Glorot uniform initializer, also called Xavier uniform initializer. + * It draws samples from a uniform distribution within [-limit, limit] + * where `limit` is `sqrt(6 / (fan_in + fan_out))` + * where `fan_in` is the number of input units in the weight tensor + * and `fan_out` is the number of output units in the weight tensor + * + * Reference: + * Glorot & Bengio, AISTATS 2010 + * http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf. + * + * @doc {heading: 'Initializers', namespace: 'initializers'} + */ +declare function glorotUniform(args: SeedOnlyInitializerArgs): Initializer; + +declare namespace gpgpu_util { + export { + createVertexShader, + createVertexBuffer, + createIndexBuffer, + getInternalFormatForFloat32MatrixTexture, + createFloat32MatrixTexture, + getInternalFormatForFloat16MatrixTexture, + createFloat16MatrixTexture, + getInternalFormatForUnsignedBytesMatrixTexture, + createUnsignedBytesMatrixTexture, + getInternalFormatForPackedMatrixTexture, + createPackedMatrixTexture, + getInternalFormatForFloat16PackedMatrixTexture, + createFloat16PackedMatrixTexture, + bindVertexProgramAttributeStreams, + uploadDenseMatrixToTexture, + uploadPixelDataToTexture, + createBufferFromOutputTexture, + downloadFloat32MatrixFromBuffer, + downloadByteEncodedFloatMatrixFromOutputTexture, + downloadPackedMatrixFromBuffer, + downloadMatrixFromPackedOutputTexture + } +} +export { gpgpu_util } + +export declare class GPGPUContext { + gl: WebGLRenderingContext; + textureFloatExtension: {}; + textureHalfFloatExtension: {}; + colorBufferFloatExtension: {}; + colorBufferHalfFloatExtension: {}; + disjointQueryTimerExtension: WebGL2DisjointQueryTimerExtension | WebGL1DisjointQueryTimerExtension; + parallelCompilationExtension: WebGLParallelCompilationExtension; + vertexBuffer: WebGLBuffer; + indexBuffer: WebGLBuffer; + framebuffer: WebGLFramebuffer; + outputTexture: WebGLTexture | null; + program: GPGPUContextProgram | null; + private disposed; + private disjoint; + private vertexShader; + textureConfig: TextureConfig; + createVertexArray: () => WebGLVao | null; + bindVertexArray: (vao: WebGLVao | null) => void; + deleteVertexArray: (vao: WebGLVao | null) => void; + getVertexArray: () => WebGLVao | null; + constructor(gl?: WebGLRenderingContext); + private get debug(); + dispose(): void; + createFloat32MatrixTexture(rows: number, columns: number): Texture; + createFloat16MatrixTexture(rows: number, columns: number): Texture; + createUnsignedBytesMatrixTexture(rows: number, columns: number): Texture; + uploadPixelDataToTexture(texture: WebGLTexture, pixels: PixelData | ImageData | HTMLImageElement | HTMLCanvasElement | ImageBitmap): void; + uploadDenseMatrixToTexture(texture: WebGLTexture, width: number, height: number, data: TypedArray): void; + createFloat16PackedMatrixTexture(rows: number, columns: number): Texture; + createPackedMatrixTexture(rows: number, columns: number): Texture; + deleteMatrixTexture(texture: WebGLTexture): void; + downloadByteEncodedFloatMatrixFromOutputTexture(texture: WebGLTexture, rows: number, columns: number): Float32Array; + downloadPackedMatrixFromBuffer(buffer: WebGLBuffer, batch: number, rows: number, columns: number, physicalRows: number, physicalCols: number): Float32Array; + downloadFloat32MatrixFromBuffer(buffer: WebGLBuffer, size: number): Float32Array; + createBufferFromTexture(texture: WebGLTexture, rows: number, columns: number): WebGLBuffer; + createAndWaitForFence(): Promise; + private createFence; + downloadMatrixFromPackedTexture(texture: WebGLTexture, physicalRows: number, physicalCols: number): Float32Array; + createProgram(fragmentShader: WebGLShader): GPGPUContextProgram; + deleteProgram(program: GPGPUContextProgram): void; + setProgram(program: GPGPUContextProgram | null): void; + getUniformLocation(program: WebGLProgram, uniformName: string, shouldThrow?: boolean): WebGLUniformLocation; + getAttributeLocation(program: WebGLProgram, attribute: string): number; + getUniformLocationNoThrow(program: WebGLProgram, uniformName: string): WebGLUniformLocation; + setInputMatrixTexture(inputMatrixTexture: WebGLTexture, uniformLocation: WebGLUniformLocation, textureUnit: number): void; + setOutputMatrixTexture(outputMatrixTexture: WebGLTexture, rows: number, columns: number): void; + setOutputPackedMatrixTexture(outputPackedMatrixTexture: WebGLTexture, rows: number, columns: number): void; + setOutputMatrixWriteRegion(startRow: number, numRows: number, startColumn: number, numColumns: number): void; + setOutputPackedMatrixWriteRegion(startRow: number, numRows: number, startColumn: number, numColumns: number): void; + debugValidate(): void; + executeProgram(): void; + blockUntilAllProgramsCompleted(): void; + private getQueryTimerExtension; + private getQueryTimerExtensionWebGL2; + private getQueryTimerExtensionWebGL1; + beginQuery(): WebGLQuery; + endQuery(): void; + waitForQueryAndGetTime(query: WebGLQuery): Promise; + private getQueryTime; + private isQueryAvailable; + pollFence(fenceContext: FenceContext): Promise; + private itemsToPoll; + pollItems(): void; + private addItemToPoll; + private bindTextureToFrameBuffer; + private unbindTextureToFrameBuffer; + private downloadMatrixDriver; + private setOutputMatrixTextureDriver; + private setOutputMatrixWriteRegionDriver; + private throwIfDisposed; + private throwIfNoProgram; +} + +declare interface GPGPUContextProgram extends WebGLProgram { + vao: WebGLVao; +} + +export declare interface GPGPUProgram { + variableNames: string[]; + outputShape: number[]; + userCode: string; + enableShapeUniforms?: boolean; + /** If true, this program expects packed input textures. Defaults to false. */ + packedInputs?: boolean; + /** If true, this program produces a packed texture. Defaults to false. */ + packedOutput?: boolean; + /** + * Affects what type of texture we allocate for the output. Defaults to + * `TextureUsage.RENDER`. + */ + outTexUsage?: TextureUsage; + /** + * The type of scheme to use when packing texels for the output values. + * See `PackingScheme` for details. Defaults to `PackingScheme.SHARED_BATCH`. + */ + outPackingScheme?: PackingScheme; + customUniforms?: Array<{ + name: string; + arrayIndex?: number; + type: UniformType; + }>; +} + +declare function GPUBytesPerElement(dtype: DataType): number; + +/** + * A `tf.GraphModel` is a directed, acyclic graph built from a + * SavedModel GraphDef and allows inference execution. + * + * A `tf.GraphModel` can only be created by loading from a model converted from + * a [TensorFlow SavedModel](https://www.tensorflow.org/guide/saved_model) using + * the command line converter tool and loaded via `tf.loadGraphModel`. + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ +export declare class GraphModel implements InferenceModel { + private modelUrl; + private loadOptions; + private executor; + private version; + private handler; + private artifacts; + private initializer; + private resourceIdToCapturedInput; + private resourceManager; + private signature; + private initializerSignature; + private structuredOutputKeys; + private readonly io; + get modelVersion(): string; + get inputNodes(): string[]; + get outputNodes(): string[]; + get inputs(): TensorInfo[]; + get outputs(): TensorInfo[]; + get weights(): NamedTensorsMap; + get metadata(): {}; + get modelSignature(): {}; + get modelStructuredOutputKeys(): {}; + /** + * @param modelUrl url for the model, or an `io.IOHandler`. + * @param weightManifestUrl url for the weight file generated by + * scripts/convert.py script. + * @param requestOption options for Request, which allows to send credentials + * and custom headers. + * @param onProgress Optional, progress callback function, fired periodically + * before the load is completed. + */ + constructor(modelUrl: ModelURL, loadOptions?: io.LoadOptions, tfio?: typeof io); + private findIOHandler; + /** + * Loads the model and weight files, construct the in memory weight map and + * compile the inference graph. + */ + load(): UrlIOHandler extends io.IOHandlerSync ? boolean : Promise; + /** + * Synchronously construct the in memory weight map and + * compile the inference graph. + * + * @doc {heading: 'Models', subheading: 'Classes', ignoreCI: true} + */ + loadSync(artifacts: io.ModelArtifacts): boolean; + /** + * Save the configuration and/or weights of the GraphModel. + * + * An `IOHandler` is an object that has a `save` method of the proper + * signature defined. The `save` method manages the storing or + * transmission of serialized data ("artifacts") that represent the + * model's topology and weights onto or via a specific medium, such as + * file downloads, local storage, IndexedDB in the web browser and HTTP + * requests to a server. TensorFlow.js provides `IOHandler` + * implementations for a number of frequently used saving mediums, such as + * `tf.io.browserDownloads` and `tf.io.browserLocalStorage`. See `tf.io` + * for more details. + * + * This method also allows you to refer to certain types of `IOHandler`s + * as URL-like string shortcuts, such as 'localstorage://' and + * 'indexeddb://'. + * + * Example 1: Save `model`'s topology and weights to browser [local + * storage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage); + * then load it back. + * + * ```js + * const modelUrl = + * 'https://storage.googleapis.com/tfjs-models/savedmodel/mobilenet_v2_1.0_224/model.json'; + * const model = await tf.loadGraphModel(modelUrl); + * const zeros = tf.zeros([1, 224, 224, 3]); + * model.predict(zeros).print(); + * + * const saveResults = await model.save('localstorage://my-model-1'); + * + * const loadedModel = await tf.loadGraphModel('localstorage://my-model-1'); + * console.log('Prediction from loaded model:'); + * model.predict(zeros).print(); + * ``` + * + * @param handlerOrURL An instance of `IOHandler` or a URL-like, + * scheme-based string shortcut for `IOHandler`. + * @param config Options for saving the model. + * @returns A `Promise` of `SaveResult`, which summarizes the result of + * the saving, such as byte sizes of the saved artifacts for the model's + * topology and weight values. + * + * @doc {heading: 'Models', subheading: 'Classes', ignoreCI: true} + */ + save(handlerOrURL: io.IOHandler | string, config?: io.SaveConfig): Promise; + private addStructuredOutputNames; + /** + * Execute the inference for the input tensors. + * + * @param input The input tensors, when there is single input for the model, + * inputs param should be a `tf.Tensor`. For models with mutliple inputs, + * inputs params should be in either `tf.Tensor`[] if the input order is + * fixed, or otherwise NamedTensorMap format. + * + * For model with multiple inputs, we recommend you use NamedTensorMap as the + * input type, if you use `tf.Tensor`[], the order of the array needs to + * follow the + * order of inputNodes array. @see {@link GraphModel.inputNodes} + * + * You can also feed any intermediate nodes using the NamedTensorMap as the + * input type. For example, given the graph + * InputNode => Intermediate => OutputNode, + * you can execute the subgraph Intermediate => OutputNode by calling + * model.execute('IntermediateNode' : tf.tensor(...)); + * + * This is useful for models that uses tf.dynamic_rnn, where the intermediate + * state needs to be fed manually. + * + * For batch inference execution, the tensors for each input need to be + * concatenated together. For example with mobilenet, the required input shape + * is [1, 244, 244, 3], which represents the [batch, height, width, channel]. + * If we are provide a batched data of 100 images, the input tensor should be + * in the shape of [100, 244, 244, 3]. + * + * @param config Prediction configuration for specifying the batch size. + * Currently the batch size option is ignored for graph model. + * + * @returns Inference result tensors. If the model is converted and it + * originally had structured_outputs in tensorflow, then a NamedTensorMap + * will be returned matching the structured_outputs. If no structured_outputs + * are present, the output will be single `tf.Tensor` if the model has single + * output node, otherwise Tensor[]. + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ + predict(inputs: Tensor | Tensor[] | NamedTensorMap, config?: ModelPredictConfig): Tensor | Tensor[] | NamedTensorMap; + /** + * Execute the inference for the input tensors in async fashion, use this + * method when your model contains control flow ops. + * + * @param input The input tensors, when there is single input for the model, + * inputs param should be a `tf.Tensor`. For models with mutliple inputs, + * inputs params should be in either `tf.Tensor`[] if the input order is + * fixed, or otherwise NamedTensorMap format. + * + * For model with multiple inputs, we recommend you use NamedTensorMap as the + * input type, if you use `tf.Tensor`[], the order of the array needs to + * follow the + * order of inputNodes array. @see {@link GraphModel.inputNodes} + * + * You can also feed any intermediate nodes using the NamedTensorMap as the + * input type. For example, given the graph + * InputNode => Intermediate => OutputNode, + * you can execute the subgraph Intermediate => OutputNode by calling + * model.execute('IntermediateNode' : tf.tensor(...)); + * + * This is useful for models that uses tf.dynamic_rnn, where the intermediate + * state needs to be fed manually. + * + * For batch inference execution, the tensors for each input need to be + * concatenated together. For example with mobilenet, the required input shape + * is [1, 244, 244, 3], which represents the [batch, height, width, channel]. + * If we are provide a batched data of 100 images, the input tensor should be + * in the shape of [100, 244, 244, 3]. + * + * @param config Prediction configuration for specifying the batch size. + * Currently the batch size option is ignored for graph model. + * + * @returns A Promise of inference result tensors. If the model is converted + * and it originally had structured_outputs in tensorflow, then a + * NamedTensorMap will be returned matching the structured_outputs. If no + * structured_outputs are present, the output will be single `tf.Tensor` if + * the model has single output node, otherwise Tensor[]. + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ + predictAsync(inputs: Tensor | Tensor[] | NamedTensorMap, config?: ModelPredictConfig): Promise; + private normalizeInputs; + private normalizeOutputs; + private executeInitializerGraph; + private executeInitializerGraphAsync; + private setResourceIdToCapturedInput; + /** + * Executes inference for the model for given input tensors. + * @param inputs tensor, tensor array or tensor map of the inputs for the + * model, keyed by the input node names. + * @param outputs output node name from the TensorFlow model, if no + * outputs are specified, the default outputs of the model would be used. + * You can inspect intermediate nodes of the model by adding them to the + * outputs array. + * + * @returns A single tensor if provided with a single output or no outputs + * are provided and there is only one default output, otherwise return a + * tensor array. The order of the tensor array is the same as the outputs + * if provided, otherwise the order of outputNodes attribute of the model. + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ + execute(inputs: Tensor | Tensor[] | NamedTensorMap, outputs?: string | string[]): Tensor | Tensor[]; + /** + * Executes inference for the model for given input tensors in async + * fashion, use this method when your model contains control flow ops. + * @param inputs tensor, tensor array or tensor map of the inputs for the + * model, keyed by the input node names. + * @param outputs output node name from the TensorFlow model, if no outputs + * are specified, the default outputs of the model would be used. You can + * inspect intermediate nodes of the model by adding them to the outputs + * array. + * + * @returns A Promise of single tensor if provided with a single output or + * no outputs are provided and there is only one default output, otherwise + * return a tensor map. + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ + executeAsync(inputs: Tensor | Tensor[] | NamedTensorMap, outputs?: string | string[]): Promise; + /** + * Get intermediate tensors for model debugging mode (flag + * KEEP_INTERMEDIATE_TENSORS is true). + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ + getIntermediateTensors(): NamedTensorsMap; + /** + * Dispose intermediate tensors for model debugging mode (flag + * KEEP_INTERMEDIATE_TENSORS is true). + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ + disposeIntermediateTensors(): void; + private convertTensorMapToTensorsMap; + /** + * Releases the memory used by the weight tensors and resourceManager. + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ + dispose(): void; +} + +export declare interface GraphNode { + inputs: Tensor[]; + attrs: { + [key: string]: ValueType; + }; +} + +declare const greaterEqualImpl: SimpleBinaryKernelImpl; + +declare const greaterImpl: SimpleBinaryKernelImpl; + +declare class GRU extends RNN { + /** @nocollapse */ + static className: string; + constructor(args: GRULayerArgs); + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + /** @nocollapse */ + static fromConfig(cls: serialization.SerializableConstructor, config: serialization.ConfigDict): T; +} + +/** + * Gated Recurrent Unit - Cho et al. 2014. + * + * This is an `RNN` layer consisting of one `GRUCell`. However, unlike + * the underlying `GRUCell`, the `apply` method of `SimpleRNN` operates + * on a sequence of inputs. The shape of the input (not including the first, + * batch dimension) needs to be at least 2-D, with the first dimension being + * time steps. For example: + * + * ```js + * const rnn = tf.layers.gru({units: 8, returnSequences: true}); + * + * // Create an input with 10 time steps. + * const input = tf.input({shape: [10, 20]}); + * const output = rnn.apply(input); + * + * console.log(JSON.stringify(output.shape)); + * // [null, 10, 8]: 1st dimension is unknown batch size; 2nd dimension is the + * // same as the sequence length of `input`, due to `returnSequences`: `true`; + * // 3rd dimension is the `GRUCell`'s number of units. + * + * @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'} + */ +declare function gru(args: GRULayerArgs): GRU; + +declare class GRUCell extends RNNCell { + /** @nocollapse */ + static className: string; + readonly units: number; + readonly activation: Activation; + readonly recurrentActivation: Activation; + readonly useBias: boolean; + readonly kernelInitializer: Initializer; + readonly recurrentInitializer: Initializer; + readonly biasInitializer: Initializer; + readonly kernelRegularizer: Regularizer; + readonly recurrentRegularizer: Regularizer; + readonly biasRegularizer: Regularizer; + readonly kernelConstraint: Constraint; + readonly recurrentConstraint: Constraint; + readonly biasConstraint: Constraint; + readonly dropout: number; + readonly recurrentDropout: number; + readonly dropoutFunc: Function; + readonly stateSize: number; + readonly implementation: number; + readonly DEFAULT_ACTIVATION = "tanh"; + readonly DEFAULT_RECURRENT_ACTIVATION: ActivationIdentifier; + readonly DEFAULT_KERNEL_INITIALIZER = "glorotNormal"; + readonly DEFAULT_RECURRENT_INITIALIZER = "orthogonal"; + readonly DEFAULT_BIAS_INITIALIZER: InitializerIdentifier; + kernel: LayerVariable; + recurrentKernel: LayerVariable; + bias: LayerVariable; + constructor(args: GRUCellLayerArgs); + build(inputShape: Shape | Shape[]): void; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + getConfig(): serialization.ConfigDict; +} + +/** + * Cell class for `GRU`. + * + * `GRUCell` is distinct from the `RNN` subclass `GRU` in that its + * `apply` method takes the input data of only a single time step and returns + * the cell's output at the time step, while `GRU` takes the input data + * over a number of time steps. For example: + * + * ```js + * const cell = tf.layers.gruCell({units: 2}); + * const input = tf.input({shape: [10]}); + * const output = cell.apply(input); + * + * console.log(JSON.stringify(output.shape)); + * // [null, 10]: This is the cell's output at a single time step. The 1st + * // dimension is the unknown batch size. + * ``` + * + * Instance(s) of `GRUCell` can be used to construct `RNN` layers. The + * most typical use of this workflow is to combine a number of cells into a + * stacked RNN cell (i.e., `StackedRNNCell` internally) and use it to create an + * RNN. For example: + * + * ```js + * const cells = [ + * tf.layers.gruCell({units: 4}), + * tf.layers.gruCell({units: 8}), + * ]; + * const rnn = tf.layers.rnn({cell: cells, returnSequences: true}); + * + * // Create an input with 10 time steps and a length-20 vector at each step. + * const input = tf.input({shape: [10, 20]}); + * const output = rnn.apply(input); + * + * console.log(JSON.stringify(output.shape)); + * // [null, 10, 8]: 1st dimension is unknown batch size; 2nd dimension is the + * // same as the sequence length of `input`, due to `returnSequences`: `true`; + * // 3rd dimension is the last `gruCell`'s number of units. + * ``` + * + * To create an `RNN` consisting of only *one* `GRUCell`, use the + * `tf.layers.gru`. + * + * @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'} + */ +declare function gruCell(args: GRUCellLayerArgs): GRUCell; + +export declare interface GRUCellLayerArgs extends SimpleRNNCellLayerArgs { + /** + * Activation function to use for the recurrent step. + * + * Defaults to hard sigmoid (`hardSigmoid`). + * + * If `null`, no activation is applied. + */ + recurrentActivation?: ActivationIdentifier; + /** + * Implementation mode, either 1 or 2. + * + * Mode 1 will structure its operations as a larger number of + * smaller dot products and additions. + * + * Mode 2 will batch them into fewer, larger operations. These modes will + * have different performance profiles on different hardware and + * for different applications. + * + * Note: For superior performance, TensorFlow.js always uses implementation + * 2, regardless of the actual value of this configuration field. + */ + implementation?: number; + /** + * GRU convention (whether to apply reset gate after or before matrix + * multiplication). false = "before", true = "after" (only false is + * supported). + */ + resetAfter?: boolean; +} + +export declare interface GRULayerArgs extends SimpleRNNLayerArgs { + /** + * Activation function to use for the recurrent step. + * + * Defaults to hard sigmoid (`hardSigmoid`). + * + * If `null`, no activation is applied. + */ + recurrentActivation?: ActivationIdentifier; + /** + * Implementation mode, either 1 or 2. + * + * Mode 1 will structure its operations as a larger number of + * smaller dot products and additions. + * + * Mode 2 will batch them into fewer, larger operations. These modes will + * have different performance profiles on different hardware and + * for different applications. + * + * Note: For superior performance, TensorFlow.js always uses implementation + * 2, regardless of the actual value of this configuration field. + */ + implementation?: number; +} + +declare function hasExtension(gl: WebGLRenderingContext, extensionName: string): boolean; + +/** + * He normal initializer. + * + * It draws samples from a truncated normal distribution centered on 0 + * with `stddev = sqrt(2 / fanIn)` + * where `fanIn` is the number of input units in the weight tensor. + * + * Reference: + * He et al., http://arxiv.org/abs/1502.01852 + * + * @doc {heading: 'Initializers', namespace: 'initializers'} + */ +declare function heNormal(args: SeedOnlyInitializerArgs): Initializer; + +/** + * He uniform initializer. + * + * It draws samples from a uniform distribution within [-limit, limit] + * where `limit` is `sqrt(6 / fan_in)` + * where `fanIn` is the number of input units in the weight tensor. + * + * Reference: + * He et al., http://arxiv.org/abs/1502.01852 + * + * @doc {heading: 'Initializers',namespace: 'initializers'} + */ +declare function heUniform(args: SeedOnlyInitializerArgs): Initializer; + +/** + * Callback that records events into a `History` object. This callback is + * automatically applied to every TF.js Layers model. The `History` object + * gets returned by the `fit` method of models. + */ +declare class History_2 extends BaseCallback { + epoch: number[]; + history: { + [key: string]: Array; + }; + onTrainBegin(logs?: UnresolvedLogs): Promise; + onEpochEnd(epoch: number, logs?: UnresolvedLogs): Promise; + /** + * Await the values of all losses and metrics. + */ + syncData(): Promise; +} +export { History_2 as History } + +/** Properties of an AttrValue. */ +export declare interface IAttrValue { + /** AttrValue list */ + list?: (AttrValue.IListValue | null); + /** AttrValue s */ + s?: (string | null); + /** AttrValue i */ + i?: (number | string | null); + /** AttrValue f */ + f?: (number | null); + /** AttrValue b */ + b?: (boolean | null); + /** AttrValue type */ + type?: (DataType_2 | null); + /** AttrValue shape */ + shape?: (ITensorShape | null); + /** AttrValue tensor */ + tensor?: (ITensor | null); + /** AttrValue placeholder */ + placeholder?: (string | null); + /** AttrValue func */ + func?: (INameAttrList | null); +} + +/** + * Initializer that generates the identity matrix. + * Only use for square 2D matrices. + * + * @doc {heading: 'Initializers', namespace: 'initializers'} + */ +declare function identity(args: IdentityArgs): Initializer; + +declare interface IdentityArgs { + /** + * Multiplicative factor to apply to the identity matrix. + */ + gain?: number; +} + +/** Properties of a NameAttrList. */ +export declare interface INameAttrList { + /** NameAttrList name */ + name?: (string | null); + /** NameAttrList attr */ + attr?: ({ + [k: string]: IAttrValue; + } | null); +} + +/** + * Initializer base class. + * + * @doc { + * heading: 'Initializers', subheading: 'Classes', namespace: 'initializers'} + */ +declare abstract class Initializer extends serialization.Serializable { + fromConfigUsesCustomObjects(): boolean; + /** + * Generate an initial value. + * @param shape + * @param dtype + * @return The init value. + */ + abstract apply(shape: Shape, dtype?: DataType): Tensor; + getConfig(): serialization.ConfigDict; +} + +/** @docinline */ +declare type InitializerIdentifier = 'constant' | 'glorotNormal' | 'glorotUniform' | 'heNormal' | 'heUniform' | 'identity' | 'leCunNormal' | 'leCunUniform' | 'ones' | 'orthogonal' | 'randomNormal' | 'randomUniform' | 'truncatedNormal' | 'varianceScaling' | 'zeros' | string; + +declare namespace initializers { + export { + zeros, + ones, + constant, + randomUniform, + randomNormal, + truncatedNormal, + identity, + varianceScaling, + glorotUniform, + glorotNormal, + heNormal, + heUniform, + leCunNormal, + leCunUniform, + orthogonal + } +} +export { initializers } + +/** Properties of a NodeDef. */ +export declare interface INodeDef { + /** NodeDef name */ + name?: (string | null); + /** NodeDef op */ + op?: (string | null); + /** NodeDef input */ + input?: (string[] | null); + /** NodeDef device */ + device?: (string | null); + /** NodeDef attr */ + attr?: ({ + [k: string]: IAttrValue; + } | null); +} + +/** + * Used to instantiate an input to a model as a `tf.SymbolicTensor`. + * + * Users should call the `input` factory function for + * consistency with other generator functions. + * + * Example: + * + * ```js + * // Defines a simple logistic regression model with 32 dimensional input + * // and 3 dimensional output. + * const x = tf.input({shape: [32]}); + * const y = tf.layers.dense({units: 3, activation: 'softmax'}).apply(x); + * const model = tf.model({inputs: x, outputs: y}); + * model.predict(tf.ones([2, 32])).print(); + * ``` + * + * Note: `input` is only necessary when using `model`. When using + * `sequential`, specify `inputShape` for the first layer or use `inputLayer` + * as the first layer. + * + * @doc {heading: 'Models', subheading: 'Inputs'} + */ +export declare function input(config: InputConfig): SymbolicTensor; + +/** + * Config for the Input function. + * + * Note: You should provide only shape or batchShape (not both). + * If only shape is provided, then the batchShape becomes + * [null].concat(inputShape). + */ +declare interface InputConfig { + /** + * A shape, not including the batch size. For instance, `shape=[32]` + * indicates that the expected input will be batches of 32-dimensional + * vectors. + */ + shape?: Shape; + /** + * A shape tuple (integer), including the batch size. For instance, + * `batchShape=[10, 32]` indicates that the expected input will be batches of + * 10 32-dimensional vectors. `batchShape=[null, 32]` indicates batches of an + * arbitrary number of 32-dimensional vectors. + */ + batchShape?: Shape; + /** + * An optional name string for the layer. Should be unique in a model (do not + * reuse the same name twice). It will be autogenerated if it isn't provided. + */ + name?: string; + dtype?: DataType; + /** + * A boolean specifying whether the placeholder to be created is sparse. + */ + sparse?: boolean; +} + +declare type InputInfo = { + dtype: DataType; + shape: number[]; + name: string; +}; + +declare class InputLayer extends Layer { + /** @nocollapse */ + static readonly className = "InputLayer"; + sparse: boolean; + constructor(args: InputLayerArgs); + apply(inputs: Tensor | Tensor[] | SymbolicTensor | SymbolicTensor[], kwargs?: Kwargs): Tensor | Tensor[] | SymbolicTensor; + dispose(): DisposeResult; + getConfig(): serialization.ConfigDict; +} + +/** + * An input layer is an entry point into a `tf.LayersModel`. + * + * `InputLayer` is generated automatically for `tf.Sequential` models by + * specifying the `inputshape` or `batchInputShape` for the first layer. It + * should not be specified explicitly. However, it can be useful sometimes, + * e.g., when constructing a sequential model from a subset of another + * sequential model's layers. Like the code snippet below shows. + * + * ```js + * // Define a model which simply adds two inputs. + * const model1 = tf.sequential(); + * model1.add(tf.layers.dense({inputShape: [4], units: 3, activation: 'relu'})); + * model1.add(tf.layers.dense({units: 1, activation: 'sigmoid'})); + * model1.summary(); + * model1.predict(tf.zeros([1, 4])).print(); + * + * // Construct another model, reusing the second layer of `model1` while + * // not using the first layer of `model1`. Note that you cannot add the second + * // layer of `model` directly as the first layer of the new sequential model, + * // because doing so will lead to an error related to the fact that the layer + * // is not an input layer. Instead, you need to create an `inputLayer` and add + * // it to the new sequential model before adding the reused layer. + * const model2 = tf.sequential(); + * // Use an inputShape that matches the input shape of `model1`'s second + * // layer. + * model2.add(tf.layers.inputLayer({inputShape: [3]})); + * model2.add(model1.layers[1]); + * model2.summary(); + * model2.predict(tf.zeros([1, 3])).print(); + * ``` + * + * @doc {heading: 'Layers', subheading: 'Inputs', namespace: 'layers'} + */ +declare function inputLayer(args: InputLayerArgs): InputLayer; + +/** + * Constructor arguments for InputLayer. + * + * Note: You should provide only inputShape or batchInputShape (not both). + * If only inputShape is provided, then the batchInputShape is determined by + * the batchSize argument and the inputShape: [batchSize].concat(inputShape). + */ +declare interface InputLayerArgs { + /** Input shape, not including the batch axis. */ + inputShape?: Shape; + /** Optional input batch size (integer or null). */ + batchSize?: number; + /** Batch input shape, including the batch axis. */ + batchInputShape?: Shape; + /** Datatype of the input. */ + dtype?: DataType; + /** + * Whether the placeholder created is meant to be sparse. + */ + sparse?: boolean; + /** Name of the layer. */ + name?: string; +} + +/** + * Specifies the ndim, dtype and shape of every input to a layer. + * + * Every layer should expose (if appropriate) an `inputSpec` attribute: + * a list of instances of InputSpec (one per input tensor). + * + * A null entry in a shape is compatible with any dimension, + * a null shape is compatible with any shape. + */ +export declare class InputSpec { + /** Expected datatype of the input. */ + dtype?: DataType; + /** Expected shape of the input (may include null for unchecked axes). */ + shape?: Shape; + /** Expected rank of the input. */ + ndim?: number; + /** Maximum rank of the input. */ + maxNDim?: number; + /** Minimum rank of the input. */ + minNDim?: number; + /** Dictionary mapping integer axes to a specific dimension value. */ + axes?: { + [axis: number]: number; + }; + constructor(args: InputSpecArgs); +} + +/** + * Constructor arguments for InputSpec. + */ +declare interface InputSpecArgs { + /** Expected datatype of the input. */ + dtype?: DataType; + /** Expected shape of the input (may include null for unchecked axes). */ + shape?: Shape; + /** Expected rank of the input. */ + ndim?: number; + /** Maximum rank of the input. */ + maxNDim?: number; + /** Minimum rank of the input. */ + minNDim?: number; + /** Dictionary mapping integer axes to a specific dimension value. */ + axes?: { + [axis: number]: number; + }; +} + +declare const INTERPOLATION_KEYS: readonly ["bilinear", "nearest"]; + +declare type InterpolationFormat = 'nearest' | 'bilinear'; + +declare type InterpolationType = typeof INTERPOLATION_KEYS[number]; + +declare function isCapableOfRenderingToFloatTexture(webGLVersion: number): boolean; + +/** + * Check if we can download values from a float/half-float texture. + * + * Note that for performance reasons we use binding a texture to a framebuffer + * as a proxy for ability to download float values later using readPixels. The + * texture params of this texture will not match those in readPixels exactly + * but if we are unable to bind some kind of float texture to the frameBuffer + * then we definitely will not be able to read float values from it. + */ +declare function isDownloadFloatTextureEnabled(webGLVersion: number): boolean; + +/** + * This determines whether reshaping a packed texture requires rearranging + * the data within the texture, assuming 2x2 packing. + */ +declare function isReshapeFree(shape1: number[], shape2: number[]): boolean; + +declare function isWebGLFenceEnabled(webGLVersion: number): boolean; + +declare function isWebGLVersionEnabled(webGLVersion: 1 | 2): boolean; + +declare function isWebGPUSupported(): boolean; + +/** Properties of a Tensor. */ +export declare interface ITensor { + /** Tensor dtype */ + dtype?: (DataType_2 | null); + /** Tensor tensorShape */ + tensorShape?: (ITensorShape | null); + /** Tensor versionNumber */ + versionNumber?: (number | null); + /** Tensor tensorContent */ + tensorContent?: (Uint8Array | null); + /** Tensor floatVal */ + floatVal?: (number[] | null); + /** Tensor doubleVal */ + doubleVal?: (number[] | null); + /** Tensor intVal */ + intVal?: (number[] | null); + /** Tensor stringVal */ + stringVal?: (Uint8Array[] | null); + /** Tensor scomplexVal */ + scomplexVal?: (number[] | null); + /** Tensor int64Val */ + int64Val?: ((number | string)[] | null); + /** Tensor boolVal */ + boolVal?: (boolean[] | null); + /** Tensor uint32Val */ + uint32Val?: (number[] | null); + /** Tensor uint64Val */ + uint64Val?: ((number | string)[] | null); +} + +/** Properties of a TensorShape. */ +export declare interface ITensorShape { + /** TensorShape dim */ + dim?: (TensorShape.IDim[] | null); + /** TensorShape unknownRank */ + unknownRank?: (boolean | null); +} + +/** + * Type representing a loosely-typed bundle of keyword arguments. + * + * This is a looser type than PyJsonDict/serialization.ConfigDict as it + * can contain arbitrary objects as its values. It is most appropriate + * for functions that pass through keyword arguments to other functions + * without knowledge of the structure. If the function can place type + * restrictions on the keyword arguments, it should via the Config + * interface convention used throughout. + */ +declare type Kwargs = { + [key: string]: any; +}; + +/** + * Regularizer for L1 regularization. + * + * Adds a term to the loss to penalize large weights: + * loss += sum(l1 * abs(x)) + * @param args l1 config. + * + * @doc {heading: 'Regularizers', namespace: 'regularizers'} + */ +declare function l1(config?: L1Args): Regularizer; + +declare interface L1Args { + /** L1 regularization rate. Defaults to 0.01. */ + l1: number; +} + +/** + * Regularizer for L1 and L2 regularization. + * + * Adds a term to the loss to penalize large weights: + * loss += sum(l1 * abs(x)) + sum(l2 * x^2) + * + * @doc {heading: 'Regularizers', namespace: 'regularizers'} + */ +declare function l1l2(config?: L1L2Args): Regularizer; + +declare interface L1L2Args { + /** L1 regularization rate. Defaults to 0.01. */ + l1?: number; + /** L2 regularization rate. Defaults to 0.01. */ + l2?: number; +} + +/** + * Regularizer for L2 regularization. + * + * Adds a term to the loss to penalize large weights: + * loss += sum(l2 * x^2) + * @param args l2 config. + * + * @doc {heading: 'Regularizers', namespace: 'regularizers'} + */ +declare function l2(config?: L2Args): Regularizer; + +declare interface L2Args { + /** L2 regularization rate. Defaults to 0.01. */ + l2: number; +} + +/** + * A layer is a grouping of operations and weights that can be composed to + * create a `tf.LayersModel`. + * + * Layers are constructed by using the functions under the + * [tf.layers](#Layers-Basic) namespace. + * + * @doc {heading: 'Layers', subheading: 'Classes', namespace: 'layers'} + */ +declare abstract class Layer extends serialization.Serializable { + /** Name for this layer. Must be unique within a model. */ + name: string; + /** + * List of InputSpec class instances. + * + * Each entry describes one required input: + * - ndim + * - dtype + * A layer with `n` input tensors must have an `inputSpec` of length `n`. + */ + inputSpec: InputSpec[]; + supportsMasking: boolean; + /** Whether the layer weights will be updated during training. */ + protected trainable_: boolean; + batchInputShape: Shape; + dtype: DataType; + initialWeights: Tensor[]; + inboundNodes: Node_2[]; + outboundNodes: Node_2[]; + activityRegularizer: Regularizer; + protected _trainableWeights: LayerVariable[]; + private _nonTrainableWeights; + private _losses; + private _updates; + private _built; + private _callHook; + private _addedWeightNames; + readonly id: number; + protected _stateful: boolean; + protected _refCount: number | null; + private fastWeightInitDuringBuild; + constructor(args?: LayerArgs); + /** + * Converts a layer and its index to a unique (immutable type) name. + * This function is used internally with `this.containerNodes`. + * @param layer The layer. + * @param nodeIndex The layer's position (e.g. via enumerate) in a list of + * nodes. + * + * @returns The unique name. + */ + protected static nodeKey(layer: Layer, nodeIndex: number): string; + /** + * Returns this.inboundNode at index nodeIndex. + * + * Porting note: This is a replacement for _get_node_attribute_at_index() + * @param nodeIndex + * @param attrName The name of the attribute related to request for this node. + */ + private getNodeAtIndex; + /** + * Retrieves the input tensor(s) of a layer at a given node. + * + * @param nodeIndex Integer, index of the node from which to retrieve the + * attribute. E.g. `nodeIndex=0` will correspond to the first time the layer + * was called. + * + * @return A tensor (or list of tensors if the layer has multiple inputs). + */ + getInputAt(nodeIndex: number): SymbolicTensor | SymbolicTensor[]; + /** + * Retrieves the output tensor(s) of a layer at a given node. + * + * @param nodeIndex Integer, index of the node from which to retrieve the + * attribute. E.g. `nodeIndex=0` will correspond to the first time the layer + * was called. + * + * @return A tensor (or list of tensors if the layer has multiple outputs). + */ + getOutputAt(nodeIndex: number): SymbolicTensor | SymbolicTensor[]; + /** + * Retrieves the input tensor(s) of a layer. + * + * Only applicable if the layer has exactly one inbound node, + * i.e. if it is connected to one incoming layer. + * + * @return Input tensor or list of input tensors. + * + * @exception AttributeError if the layer is connected to more than one + * incoming layers. + */ + get input(): SymbolicTensor | SymbolicTensor[]; + /** + * Retrieves the output tensor(s) of a layer. + * + * Only applicable if the layer has exactly one inbound node, + * i.e. if it is connected to one incoming layer. + * + * @return Output tensor or list of output tensors. + * + * @exception AttributeError if the layer is connected to more than one + * incoming layers. + */ + get output(): SymbolicTensor | SymbolicTensor[]; + get losses(): RegularizerFn[]; + /** + * Retrieves the Layer's current loss values. + * + * Used for regularizers during training. + */ + calculateLosses(): Scalar[]; + get updates(): Tensor[]; + get built(): boolean; + set built(built: boolean); + get trainable(): boolean; + set trainable(trainable: boolean); + get trainableWeights(): LayerVariable[]; + set trainableWeights(weights: LayerVariable[]); + get nonTrainableWeights(): LayerVariable[]; + set nonTrainableWeights(weights: LayerVariable[]); + /** + * The concatenation of the lists trainableWeights and nonTrainableWeights + * (in this order). + */ + get weights(): LayerVariable[]; + get stateful(): boolean; + /** + * Reset the states of the layer. + * + * This method of the base Layer class is essentially a no-op. + * Subclasses that are stateful (e.g., stateful RNNs) should override this + * method. + */ + resetStates(): void; + /** + * Checks compatibility between the layer and provided inputs. + * + * This checks that the tensor(s) `input` + * verify the input assumptions of the layer + * (if any). If not, exceptions are raised. + * + * @param inputs Input tensor or list of input tensors. + * + * @exception ValueError in case of mismatch between + * the provided inputs and the expectations of the layer. + */ + protected assertInputCompatibility(inputs: Tensor | Tensor[] | SymbolicTensor | SymbolicTensor[]): void; + /** + * This is where the layer's logic lives. + * + * @param inputs Input tensor, or list/tuple of input tensors. + * @param kwargs Additional keyword arguments. + * + * @return A tensor or list/tuple of tensors. + */ + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + protected invokeCallHook(inputs: Tensor | Tensor[], kwargs: Kwargs): void; + /** + * Set call hook. + * This is currently used for testing only. + * @param callHook + */ + setCallHook(callHook: CallHook): void; + /** + * Clear call hook. + * This is currently used for testing only. + */ + clearCallHook(): void; + /** + * Builds or executes a `Layer`'s logic. + * + * When called with `tf.Tensor`(s), execute the `Layer`'s computation and + * return Tensor(s). For example: + * + * ```js + * const denseLayer = tf.layers.dense({ + * units: 1, + * kernelInitializer: 'zeros', + * useBias: false + * }); + * + * // Invoke the layer's apply() method with a `tf.Tensor` (with concrete + * // numeric values). + * const input = tf.ones([2, 2]); + * const output = denseLayer.apply(input); + * + * // The output's value is expected to be [[0], [0]], due to the fact that + * // the dense layer has a kernel initialized to all-zeros and does not have + * // a bias. + * output.print(); + * ``` + * + * When called with `tf.SymbolicTensor`(s), this will prepare the layer for + * future execution. This entails internal book-keeping on shapes of + * expected Tensors, wiring layers together, and initializing weights. + * + * Calling `apply` with `tf.SymbolicTensor`s are typically used during the + * building of non-`tf.Sequential` models. For example: + * + * ```js + * const flattenLayer = tf.layers.flatten(); + * const denseLayer = tf.layers.dense({units: 1}); + * + * // Use tf.layers.input() to obtain a SymbolicTensor as input to apply(). + * const input = tf.input({shape: [2, 2]}); + * const output1 = flattenLayer.apply(input); + * + * // output1.shape is [null, 4]. The first dimension is the undetermined + * // batch size. The second dimension comes from flattening the [2, 2] + * // shape. + * console.log(JSON.stringify(output1.shape)); + * + * // The output SymbolicTensor of the flatten layer can be used to call + * // the apply() of the dense layer: + * const output2 = denseLayer.apply(output1); + * + * // output2.shape is [null, 1]. The first dimension is the undetermined + * // batch size. The second dimension matches the number of units of the + * // dense layer. + * console.log(JSON.stringify(output2.shape)); + * + * // The input and output can be used to construct a model that consists + * // of the flatten and dense layers. + * const model = tf.model({inputs: input, outputs: output2}); + * ``` + * + * @param inputs a `tf.Tensor` or `tf.SymbolicTensor` or an Array of them. + * @param kwargs Additional keyword arguments to be passed to `call()`. + * + * @return Output of the layer's `call` method. + * + * @exception ValueError error in case the layer is missing shape information + * for its `build` call. + * + * @doc {heading: 'Models', 'subheading': 'Classes'} + */ + apply(inputs: Tensor | Tensor[] | SymbolicTensor | SymbolicTensor[], kwargs?: Kwargs): Tensor | Tensor[] | SymbolicTensor | SymbolicTensor[]; + /** + * Check compatibility between input shape and this layer's batchInputShape. + * + * Print warning if any incompatibility is found. + * + * @param inputShape Input shape to be checked. + */ + protected warnOnIncompatibleInputShape(inputShape: Shape): void; + /** + * Retrieves the output shape(s) of a layer. + * + * Only applicable if the layer has only one inbound node, or if all inbound + * nodes have the same output shape. + * + * @returns Output shape or shapes. + * @throws AttributeError: if the layer is connected to more than one incoming + * nodes. + * + * @doc {heading: 'Models', 'subheading': 'Classes'} + */ + get outputShape(): Shape | Shape[]; + /** + * Counts the total number of numbers (e.g., float32, int32) in the + * weights. + * + * @returns An integer count. + * @throws RuntimeError: If the layer is not built yet (in which case its + * weights are not defined yet.) + * + * @doc {heading: 'Models', 'subheading': 'Classes'} + */ + countParams(): number; + /** + * Creates the layer weights. + * + * Must be implemented on all layers that have weights. + * + * Called when apply() is called to construct the weights. + * + * @param inputShape A `Shape` or array of `Shape` (unused). + * + * @doc {heading: 'Models', 'subheading': 'Classes'} + */ + build(inputShape: Shape | Shape[]): void; + /** + * Returns the current values of the weights of the layer. + * + * @param trainableOnly Whether to get the values of only trainable weights. + * @returns Weight values as an `Array` of `tf.Tensor`s. + * + * @doc {heading: 'Models', 'subheading': 'Classes'} + */ + getWeights(trainableOnly?: boolean): Tensor[]; + /** + * Sets the weights of the layer, from Tensors. + * + * @param weights a list of Tensors. The number of arrays and their shape + * must match number of the dimensions of the weights of the layer (i.e. + * it should match the output of `getWeights`). + * + * @exception ValueError If the provided weights list does not match the + * layer's specifications. + * + * @doc {heading: 'Models', 'subheading': 'Classes'} + */ + setWeights(weights: Tensor[]): void; + /** + * Adds a weight variable to the layer. + * + * @param name Name of the new weight variable. + * @param shape The shape of the weight. + * @param dtype The dtype of the weight. + * @param initializer An initializer instance. + * @param regularizer A regularizer instance. + * @param trainable Whether the weight should be trained via backprop or not + * (assuming that the layer itself is also trainable). + * @param constraint An optional trainable. + * @return The created weight variable. + * + * @doc {heading: 'Models', 'subheading': 'Classes'} + */ + protected addWeight(name: string, shape: Shape, dtype?: DataType, initializer?: Initializer, regularizer?: Regularizer, trainable?: boolean, constraint?: Constraint, getInitializerFunc?: Function): LayerVariable; + /** + * Set the fast-weight-initialization flag. + * + * In cases where the initialized weight values will be immediately + * overwritten by loaded weight values during model loading, setting + * the flag to `true` saves unnecessary calls to potentially expensive + * initializers and speeds up the loading process. + * + * @param value Target value of the flag. + */ + setFastWeightInitDuringBuild(value: boolean): void; + /** + * Add losses to the layer. + * + * The loss may potentially be conditional on some inputs tensors, + * for instance activity losses are conditional on the layer's inputs. + * + * @doc {heading: 'Models', 'subheading': 'Classes'} + */ + addLoss(losses: RegularizerFn | RegularizerFn[]): void; + /** + * Computes the output shape of the layer. + * + * Assumes that the layer will be built to match that input shape provided. + * + * @param inputShape A shape (tuple of integers) or a list of shape tuples + * (one per output tensor of the layer). Shape tuples can include null for + * free dimensions, instead of an integer. + * + * @doc {heading: 'Models', 'subheading': 'Classes'} + */ + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + /** + * Computes an output mask tensor. + * + * @param inputs Tensor or list of tensors. + * @param mask Tensor or list of tensors. + * + * @return null or a tensor (or list of tensors, one per output tensor of the + * layer). + */ + computeMask(inputs: Tensor | Tensor[], mask?: Tensor | Tensor[]): Tensor | Tensor[]; + /** + * Internal method to create an inbound node for the layer. + * + * @param inputTensors List of input tensors. + * @param outputTensors List of output tensors. + * @param inputMasks List of input masks (a mask can be a tensor, or null). + * @param outputMasks List of output masks (a mask can be a tensor, or null). + * @param inputShapes List of input shape tuples. + * @param outputShapes List of output shape tuples. + * @param kwargs Dictionary of keyword arguments that were passed to the + * `call` method of the layer at the call that created the node. + */ + private addInboundNode; + /** + * Returns the config of the layer. + * + * A layer config is a TS dictionary (serializable) + * containing the configuration of a layer. + * The same layer can be reinstantiated later + * (without its trained weights) from this configuration. + * + * The config of a layer does not include connectivity + * information, nor the layer class name. These are handled + * by 'Container' (one layer of abstraction above). + * + * Porting Note: The TS dictionary follows TS naming standards for + * keys, and uses tfjs-layers type-safe Enums. Serialization methods + * should use a helper function to convert to the pythonic storage + * standard. (see serialization_utils.convertTsToPythonic) + * + * @returns TS dictionary of configuration. + * + * @doc {heading: 'Models', 'subheading': 'Classes'} + */ + getConfig(): serialization.ConfigDict; + /** + * Dispose the weight variables that this Layer instance holds. + * + * @returns {number} Number of disposed variables. + */ + protected disposeWeights(): number; + protected assertNotDisposed(): void; + /** + * Attempt to dispose layer's weights. + * + * This method decreases the reference count of the Layer object by 1. + * + * A Layer is reference-counted. Its reference count is incremented by 1 + * the first item its `apply()` method is called and when it becomes a part + * of a new `Node` (through calling the `apply()` method on a + * `tf.SymbolicTensor`). + * + * If the reference count of a Layer becomes 0, all the weights will be + * disposed and the underlying memory (e.g., the textures allocated in WebGL) + * will be freed. + * + * Note: If the reference count is greater than 0 after the decrement, the + * weights of the Layer will *not* be disposed. + * + * After a Layer is disposed, it cannot be used in calls such as `apply()`, + * `getWeights()` or `setWeights()` anymore. + * + * @returns A DisposeResult Object with the following fields: + * - refCountAfterDispose: The reference count of the Container after this + * `dispose()` call. + * - numDisposedVariables: Number of `tf.Variable`s (i.e., weights) disposed + * during this `dispose()` call. + * @throws {Error} If the layer is not built yet, or if the layer has already + * been disposed. + * + * @doc {heading: 'Models', 'subheading': 'Classes'} + */ + dispose(): DisposeResult; +} + +/** Constructor arguments for Layer. */ +declare interface LayerArgs { + /** + * If defined, will be used to create an input layer to insert before this + * layer. If both `inputShape` and `batchInputShape` are defined, + * `batchInputShape` will be used. This argument is only applicable to input + * layers (the first layer of a model). + */ + inputShape?: Shape; + /** + * If defined, will be used to create an input layer to insert before this + * layer. If both `inputShape` and `batchInputShape` are defined, + * `batchInputShape` will be used. This argument is only applicable to input + * layers (the first layer of a model). + */ + batchInputShape?: Shape; + /** + * If `inputShape` is specified and `batchInputShape` is *not* specified, + * `batchSize` is used to construct the `batchInputShape`: `[batchSize, + * ...inputShape]` + */ + batchSize?: number; + /** + * The data-type for this layer. Defaults to 'float32'. + * This argument is only applicable to input layers (the first layer of a + * model). + */ + dtype?: DataType; + /** Name for this layer. */ + name?: string; + /** + * Whether the weights of this layer are updatable by `fit`. + * Defaults to true. + */ + trainable?: boolean; + /** + * Initial weight values of the layer. + */ + weights?: Tensor[]; + /** Legacy support. Do not use for new code. */ + inputDType?: DataType; +} + +/** Constructor arguments for Layer. */ +declare interface LayerConfig extends PyJsonDict { + input_shape?: Shape; + batch_input_shape?: Shape; + batch_size?: number; + dtype?: DataType; + name?: string; + trainable?: boolean; + input_dtype?: DataType; +} + +declare class LayerNormalization extends Layer { + /** @nocollapse */ + static className: string; + private axis; + readonly epsilon: number; + readonly center: boolean; + readonly scale: boolean; + readonly betaInitializer: Initializer; + readonly gammaInitializer: Initializer; + readonly betaRegularizer: Regularizer; + readonly gammaRegularizer: Regularizer; + private gamma; + private beta; + constructor(args?: LayerNormalizationLayerArgs); + build(inputShape: Shape | Shape[]): void; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + getConfig(): serialization.ConfigDict; +} + +/** + * Layer-normalization layer (Ba et al., 2016). + * + * Normalizes the activations of the previous layer for each given example in a + * batch independently, instead of across a batch like in `batchNormalization`. + * In other words, this layer applies a transformation that maintains the mean + * activation within each example close to 0 and activation variance close to 1. + * + * Input shape: + * Arbitrary. Use the argument `inputShape` when using this layer as the first + * layer in a model. + * + * Output shape: + * Same as input. + * + * References: + * - [Layer Normalization](https://arxiv.org/abs/1607.06450) + * + * @doc {heading: 'Layers', subheading: 'Normalization', namespace: 'layers'} + */ +declare function layerNormalization(args?: LayerNormalizationLayerArgs): LayerNormalization; + +declare interface LayerNormalizationLayerArgs extends LayerArgs { + /** + * The axis or axes that should be normalized (typically, the feature axis). + * Defaults to -1 (the last axis). + */ + axis?: number | number[]; + /** + * A small positive float added to variance to avoid divison by zero. + * Defaults to 1e-3. + */ + epsilon?: number; + /** + * If `true`, add offset of `beta` to normalized tensor. + * If `false`, `beta` is ignored. + * Default: `true`. + */ + center?: boolean; + /** + * If `true`, multiply output by `gamma`. + * If `false`, `gamma` is not used. + * When the next layer is linear, this can be disabled since scaling will + * be done by the next layer. + * Default: `true`. + */ + scale?: boolean; + /** + * Initializer for the beta weight. + * Default: `'zeros'`. + */ + betaInitializer?: InitializerIdentifier | Initializer; + /** + * Initializer for the gamma weight. + * Default: `'ones'`. + */ + gammaInitializer?: InitializerIdentifier | Initializer; + /** Regularizer for the beta weight. */ + betaRegularizer?: RegularizerIdentifier | Regularizer; + /** Regularizer for the gamma weight. */ + gammaRegularizer?: RegularizerIdentifier | Regularizer; +} + +declare namespace layers { + export { + inputLayer, + elu, + reLU, + leakyReLU, + prelu, + softmax, + thresholdedReLU, + conv1d, + conv2d, + conv2dTranspose, + conv3d, + conv3dTranspose, + separableConv2d, + cropping2D, + upSampling2d, + depthwiseConv2d, + activation, + dense, + dropout, + spatialDropout1d, + flatten, + repeatVector, + reshape, + permute, + embedding, + add, + average, + concatenate, + maximum, + minimum, + multiply, + dot, + batchNormalization, + layerNormalization, + zeroPadding2d, + averagePooling1d, + avgPool1d, + avgPooling1d, + averagePooling2d, + avgPool2d, + avgPooling2d, + averagePooling3d, + avgPool3d, + avgPooling3d, + globalAveragePooling1d, + globalAveragePooling2d, + globalMaxPooling1d, + globalMaxPooling2d, + maxPooling1d, + maxPooling2d, + maxPooling3d, + gru, + gruCell, + lstm, + lstmCell, + simpleRNN, + simpleRNNCell, + convLstm2d, + convLstm2dCell, + rnn, + stackedRNNCells, + bidirectional, + timeDistributed, + gaussianNoise, + gaussianDropout, + alphaDropout, + masking, + rescaling, + centerCrop, + resizing, + categoryEncoding, + globalMaxPool1d, + globalMaxPool2d, + maxPool1d, + maxPool2d, + Layer, + RNN, + RNNCell, + input + } +} +export { layers } + +/** + * A `tf.LayersModel` is a directed, acyclic graph of `tf.Layer`s plus methods + * for training, evaluation, prediction and saving. + * + * `tf.LayersModel` is the basic unit of training, inference and evaluation in + * TensorFlow.js. To create a `tf.LayersModel`, use `tf.LayersModel`. + * + * See also: + * `tf.Sequential`, `tf.loadLayersModel`. + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ +export declare class LayersModel extends Container implements tfc.InferenceModel { + /** @nocollapse */ + static className: string; + protected optimizer_: Optimizer; + protected isOptimizerOwned: boolean; + loss: string | string[] | { + [outputName: string]: string; + } | LossOrMetricFn | LossOrMetricFn[] | { + [outputName: string]: LossOrMetricFn; + }; + lossFunctions: LossOrMetricFn[]; + private feedOutputShapes; + private feedLossFns; + private collectedTrainableWeights; + private testFunction; + history: History_2; + protected stopTraining_: boolean; + protected isTraining: boolean; + metrics: string | LossOrMetricFn | Array | { + [outputName: string]: string | LossOrMetricFn; + }; + metricsNames: string[]; + metricsTensors: Array<[LossOrMetricFn, number]>; + private userDefinedMetadata; + constructor(args: ContainerArgs); + /** + * Print a text summary of the model's layers. + * + * The summary includes + * - Name and type of all layers that comprise the model. + * - Output shape(s) of the layers + * - Number of weight parameters of each layer + * - If the model has non-sequential-like topology, the inputs each layer + * receives + * - The total number of trainable and non-trainable parameters of the model. + * + * ```js + * const input1 = tf.input({shape: [10]}); + * const input2 = tf.input({shape: [20]}); + * const dense1 = tf.layers.dense({units: 4}).apply(input1); + * const dense2 = tf.layers.dense({units: 8}).apply(input2); + * const concat = tf.layers.concatenate().apply([dense1, dense2]); + * const output = + * tf.layers.dense({units: 3, activation: 'softmax'}).apply(concat); + * + * const model = tf.model({inputs: [input1, input2], outputs: output}); + * model.summary(); + * ``` + * + * @param lineLength Custom line length, in number of characters. + * @param positions Custom widths of each of the columns, as either + * fractions of `lineLength` (e.g., `[0.5, 0.75, 1]`) or absolute number + * of characters (e.g., `[30, 50, 65]`). Each number corresponds to + * right-most (i.e., ending) position of a column. + * @param printFn Custom print function. Can be used to replace the default + * `console.log`. For example, you can use `x => {}` to mute the printed + * messages in the console. + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ + summary(lineLength?: number, positions?: number[], printFn?: (message?: any, ...optionalParams: any[]) => void): void; + /** + * Configures and prepares the model for training and evaluation. Compiling + * outfits the model with an optimizer, loss, and/or metrics. Calling `fit` + * or `evaluate` on an un-compiled model will throw an error. + * + * @param args a `ModelCompileArgs` specifying the loss, optimizer, and + * metrics to be used for fitting and evaluating this model. + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ + compile(args: ModelCompileArgs): void; + /** + * Check trainable weights count consistency. + * + * This will raise a warning if `this.trainableWeights` and + * `this.collectedTrainableWeights` are inconsistent (i.e., have different + * numbers of parameters). + * Inconsistency will typically arise when one modifies `model.trainable` + * without calling `model.compile()` again. + */ + protected checkTrainableWeightsConsistency(): void; + /** + * Returns the loss value & metrics values for the model in test mode. + * + * Loss and metrics are specified during `compile()`, which needs to happen + * before calls to `evaluate()`. + * + * Computation is done in batches. + * + * ```js + * const model = tf.sequential({ + * layers: [tf.layers.dense({units: 1, inputShape: [10]})] + * }); + * model.compile({optimizer: 'sgd', loss: 'meanSquaredError'}); + * const result = model.evaluate( + * tf.ones([8, 10]), tf.ones([8, 1]), {batchSize: 4}); + * result.print(); + * ``` + * + * @param x `tf.Tensor` of test data, or an `Array` of `tf.Tensor`s if the + * model has multiple inputs. + * @param y `tf.Tensor` of target data, or an `Array` of `tf.Tensor`s if the + * model has multiple outputs. + * @param args A `ModelEvaluateArgs`, containing optional fields. + * + * @return `Scalar` test loss (if the model has a single output and no + * metrics) or `Array` of `Scalar`s (if the model has multiple outputs + * and/or metrics). The attribute `model.metricsNames` + * will give you the display labels for the scalar outputs. + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ + evaluate(x: Tensor | Tensor[], y: Tensor | Tensor[], args?: ModelEvaluateArgs): Scalar | Scalar[]; + /** + * Evaluate model using a dataset object. + * + * Note: Unlike `evaluate()`, this method is asynchronous (`async`). + * + * @param dataset A dataset object. Its `iterator()` method is expected + * to generate a dataset iterator object, the `next()` method of which + * is expected to produce data batches for evaluation. The return value + * of the `next()` call ought to contain a boolean `done` field and a + * `value` field. The `value` field is expected to be an array of two + * `tf.Tensor`s or an array of two nested `tf.Tensor` structures. The former + * case is for models with exactly one input and one output (e.g. + * a sequential model). The latter case is for models with multiple + * inputs and/or multiple outputs. Of the two items in the array, the + * first is the input feature(s) and the second is the output target(s). + * @param args A configuration object for the dataset-based evaluation. + * @returns Loss and metric values as an Array of `Scalar` objects. + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ + evaluateDataset(dataset: Dataset<{}>, args?: ModelEvaluateDatasetArgs): Promise; + /** + * Get number of samples provided for training, evaluation or prediction. + * + * @param ins Input `tf.Tensor`. + * @param batchSize Integer batch size, optional. + * @param steps Total number of steps (batches of samples) before + * declaring loop finished. Optional. + * @param stepsName The public API's parameter name for `steps`. + * @returns Number of samples provided. + */ + private checkNumSamples; + /** + * Execute internal tensors of the model with input data feed. + * @param inputs Input data feed. Must match the inputs of the model. + * @param outputs Names of the output tensors to be fetched. Must match + * names of the SymbolicTensors that belong to the graph. + * @returns Fetched values for `outputs`. + */ + execute(inputs: Tensor | Tensor[] | NamedTensorMap, outputs: string | string[]): Tensor | Tensor[]; + /** + * Retrieve the model's internal symbolic tensors from symbolic-tensor names. + */ + private retrieveSymbolicTensors; + /** + * Helper method to loop over some data in batches. + * + * Porting Note: Not using the functional approach in the Python equivalent + * due to the imperative backend. + * Porting Note: Does not support step mode currently. + * + * @param ins: input data + * @param batchSize: integer batch size. + * @param verbose: verbosity model + * @returns: Predictions as `tf.Tensor` (if a single output) or an `Array` of + * `tf.Tensor` (if multipe outputs). + */ + private predictLoop; + /** + * Generates output predictions for the input samples. + * + * Computation is done in batches. + * + * Note: the "step" mode of predict() is currently not supported. + * This is because the TensorFlow.js core backend is imperative only. + * + * ```js + * const model = tf.sequential({ + * layers: [tf.layers.dense({units: 1, inputShape: [10]})] + * }); + * model.predict(tf.ones([8, 10]), {batchSize: 4}).print(); + * ``` + * + * @param x The input data, as a Tensor, or an `Array` of `tf.Tensor`s if + * the model has multiple inputs. + * @param args A `ModelPredictArgs` object containing optional fields. + * + * @return Prediction results as a `tf.Tensor`(s). + * + * @exception ValueError In case of mismatch between the provided input data + * and the model's expectations, or in case a stateful model receives a + * number of samples that is not a multiple of the batch size. + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ + predict(x: Tensor | Tensor[], args?: ModelPredictConfig): Tensor | Tensor[]; + /** + * Returns predictions for a single batch of samples. + * + * ```js + * const model = tf.sequential({ + * layers: [tf.layers.dense({units: 1, inputShape: [10]})] + * }); + * model.predictOnBatch(tf.ones([8, 10])).print(); + * ``` + * @param x: Input samples, as a Tensor (for models with exactly one + * input) or an array of Tensors (for models with more than one input). + * @return Tensor(s) of predictions + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ + predictOnBatch(x: Tensor | Tensor[]): Tensor | Tensor[]; + protected standardizeUserDataXY(x: Tensor | Tensor[] | { + [inputName: string]: Tensor; + }, y: Tensor | Tensor[] | { + [inputName: string]: Tensor; + }, checkBatchAxis?: boolean, batchSize?: number): [Tensor[], Tensor[]]; + protected standardizeUserData(x: Tensor | Tensor[] | { + [inputName: string]: Tensor; + }, y: Tensor | Tensor[] | { + [inputName: string]: Tensor; + }, sampleWeight?: Tensor | Tensor[] | { + [outputName: string]: Tensor; + }, classWeight?: ClassWeight | ClassWeight[] | ClassWeightMap, checkBatchAxis?: boolean, batchSize?: number): Promise<[Tensor[], Tensor[], Tensor[]]>; + /** + * Loop over some test data in batches. + * @param f A Function returning a list of tensors. + * @param ins Array of tensors to be fed to `f`. + * @param batchSize Integer batch size or `null` / `undefined`. + * @param verbose verbosity mode. + * @param steps Total number of steps (batches of samples) before + * declaring test finished. Ignored with the default value of `null` / + * `undefined`. + * @returns Array of Scalars. + */ + private testLoop; + protected getDedupedMetricsNames(): string[]; + /** + * Creates a function that performs the following actions: + * + * 1. computes the losses + * 2. sums them to get the total loss + * 3. call the optimizer computes the gradients of the LayersModel's + * trainable weights w.r.t. the total loss and update the variables + * 4. calculates the metrics + * 5. returns the values of the losses and metrics. + */ + protected makeTrainFunction(): (data: Tensor[]) => Scalar[]; + /** + * Create a function which, when invoked with an array of `tf.Tensor`s as a + * batch of inputs, returns the prespecified loss and metrics of the model + * under the batch of input data. + */ + private makeTestFunction; + /** + * Trains the model for a fixed number of epochs (iterations on a + * dataset). + * + * ```js + * const model = tf.sequential({ + * layers: [tf.layers.dense({units: 1, inputShape: [10]})] + * }); + * model.compile({optimizer: 'sgd', loss: 'meanSquaredError'}); + * for (let i = 1; i < 5 ; ++i) { + * const h = await model.fit(tf.ones([8, 10]), tf.ones([8, 1]), { + * batchSize: 4, + * epochs: 3 + * }); + * console.log("Loss after Epoch " + i + " : " + h.history.loss[0]); + * } + * ``` + * + * @param x `tf.Tensor` of training data, or an array of `tf.Tensor`s if the + * model has multiple inputs. If all inputs in the model are named, you + * can also pass a dictionary mapping input names to `tf.Tensor`s. + * @param y `tf.Tensor` of target (label) data, or an array of `tf.Tensor`s if + * the model has multiple outputs. If all outputs in the model are named, + * you can also pass a dictionary mapping output names to `tf.Tensor`s. + * @param args A `ModelFitArgs`, containing optional fields. + * + * @return A `History` instance. Its `history` attribute contains all + * information collected during training. + * + * @exception ValueError In case of mismatch between the provided input + * data and what the model expects. + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ + fit(x: Tensor | Tensor[] | { + [inputName: string]: Tensor; + }, y: Tensor | Tensor[] | { + [inputName: string]: Tensor; + }, args?: ModelFitArgs): Promise; + /** + * Abstract fit function for `f(ins)`. + * @param f A Function returning a list of tensors. For training, this + * function is expected to perform the updates to the variables. + * @param ins List of tensors to be fed to `f`. + * @param outLabels List of strings, display names of the outputs of `f`. + * @param batchSize Integer batch size or `== null` if unknown. Default : 32. + * @param epochs Number of times to iterate over the data. Default : 1. + * @param verbose Verbosity mode: 0, 1, or 2. Default: 1. + * @param callbacks List of callbacks to be called during training. + * @param valF Function to call for validation. + * @param valIns List of tensors to be fed to `valF`. + * @param shuffle Whether to shuffle the data at the beginning of every + * epoch. Default : true. + * @param callbackMetrics List of strings, the display names of the metrics + * passed to the callbacks. They should be the concatenation of the + * display names of the outputs of `f` and the list of display names + * of the outputs of `valF`. + * @param initialEpoch Epoch at which to start training (useful for + * resuming a previous training run). Default : 0. + * @param stepsPerEpoch Total number of steps (batches on samples) before + * declaring one epoch finished and starting the next epoch. Ignored with + * the default value of `undefined` or `null`. + * @param validationSteps Number of steps to run validation for (only if + * doing validation from data tensors). Not applicable for tfjs-layers. + * @returns A `History` object. + */ + fitLoop(f: (data: Tensor[]) => Scalar[], ins: Tensor[], outLabels?: string[], batchSize?: number, epochs?: number, verbose?: number, callbacks?: BaseCallback[], valF?: (data: Tensor[]) => Scalar[], valIns?: Tensor[], shuffle?: boolean | string, callbackMetrics?: string[], initialEpoch?: number, stepsPerEpoch?: number, validationSteps?: number): Promise; + /** + * Trains the model using a dataset object. + * + * @param dataset A dataset object. Its `iterator()` method is expected + * to generate a dataset iterator object, the `next()` method of which + * is expected to produce data batches for training. The return value + * of the `next()` call ought to contain a boolean `done` field and a + * `value` field. The `value` field is expected to be an array of two + * `tf.Tensor`s or an array of two nested `tf.Tensor` structures. The former + * case is for models with exactly one input and one output (e.g. + * a sequential model). The latter case is for models with multiple + * inputs and/or multiple outputs. + * Of the two items in the array, the first is the input feature(s) and + * the second is the output target(s). + * @param args A `ModelFitDatasetArgs`, containing optional fields. + * + * @return A `History` instance. Its `history` attribute contains all + * information collected during training. + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ + fitDataset(dataset: Dataset, args: ModelFitDatasetArgs): Promise; + /** + * Runs a single gradient update on a single batch of data. + * + * This method differs from `fit()` and `fitDataset()` in the following + * regards: + * - It operates on exactly one batch of data. + * - It returns only the loss and metric values, instead of + * returning the batch-by-batch loss and metric values. + * - It doesn't support fine-grained options such as verbosity and + * callbacks. + * + * @param x Input data. It could be one of the following: + * - A `tf.Tensor`, or an Array of `tf.Tensor`s (in case the model has + * multiple inputs). + * - An Object mapping input names to corresponding `tf.Tensor` (if the + * model has named inputs). + * @param y Target data. It could be either a `tf.Tensor` or multiple + * `tf.Tensor`s. It should be consistent with `x`. + * @returns Training loss or losses (in case the model has + * multiple outputs), along with metrics (if any), as numbers. + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ + trainOnBatch(x: Tensor | Tensor[] | { + [inputName: string]: Tensor; + }, y: Tensor | Tensor[] | { + [inputName: string]: Tensor; + }): Promise; + /** + * Extract weight values of the model. + * + * @param config: An instance of `io.SaveConfig`, which specifies + * model-saving options such as whether only trainable weights are to be + * saved. + * @returns A `NamedTensorMap` mapping original weight names (i.e., + * non-uniqueified weight names) to their values. + */ + protected getNamedWeights(config?: io.SaveConfig): NamedTensor[]; + /** + * Setter used for force stopping of LayersModel.fit() (i.e., training). + * + * Example: + * + * ```js + * const input = tf.input({shape: [10]}); + * const output = tf.layers.dense({units: 1}).apply(input); + * const model = tf.model({inputs: [input], outputs: [output]}); + * model.compile({loss: 'meanSquaredError', optimizer: 'sgd'}); + * const xs = tf.ones([8, 10]); + * const ys = tf.zeros([8, 1]); + * + * const history = await model.fit(xs, ys, { + * epochs: 10, + * callbacks: { + * onEpochEnd: async (epoch, logs) => { + * if (epoch === 2) { + * model.stopTraining = true; + * } + * } + * } + * }); + * + * // There should be only 3 values in the loss array, instead of 10 + * values, + * // due to the stopping after 3 epochs. + * console.log(history.history.loss); + * ``` + */ + set stopTraining(stop: boolean); + get stopTraining(): boolean; + get optimizer(): Optimizer; + set optimizer(optimizer: Optimizer); + dispose(): DisposeResult; + private getLossIdentifiers; + private getMetricIdentifiers; + protected getTrainingConfig(): TrainingConfig; + loadTrainingConfig(trainingConfig: TrainingConfig): void; + /** + * Save the configuration and/or weights of the LayersModel. + * + * An `IOHandler` is an object that has a `save` method of the proper + * signature defined. The `save` method manages the storing or + * transmission of serialized data ("artifacts") that represent the + * model's topology and weights onto or via a specific medium, such as + * file downloads, local storage, IndexedDB in the web browser and HTTP + * requests to a server. TensorFlow.js provides `IOHandler` + * implementations for a number of frequently used saving mediums, such as + * `tf.io.browserDownloads` and `tf.io.browserLocalStorage`. See `tf.io` + * for more details. + * + * This method also allows you to refer to certain types of `IOHandler`s + * as URL-like string shortcuts, such as 'localstorage://' and + * 'indexeddb://'. + * + * Example 1: Save `model`'s topology and weights to browser [local + * storage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage); + * then load it back. + * + * ```js + * const model = tf.sequential( + * {layers: [tf.layers.dense({units: 1, inputShape: [3]})]}); + * console.log('Prediction from original model:'); + * model.predict(tf.ones([1, 3])).print(); + * + * const saveResults = await model.save('localstorage://my-model-1'); + * + * const loadedModel = await tf.loadLayersModel('localstorage://my-model-1'); + * console.log('Prediction from loaded model:'); + * loadedModel.predict(tf.ones([1, 3])).print(); + * ``` + * + * Example 2. Saving `model`'s topology and weights to browser + * [IndexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API); + * then load it back. + * + * ```js + * const model = tf.sequential( + * {layers: [tf.layers.dense({units: 1, inputShape: [3]})]}); + * console.log('Prediction from original model:'); + * model.predict(tf.ones([1, 3])).print(); + * + * const saveResults = await model.save('indexeddb://my-model-1'); + * + * const loadedModel = await tf.loadLayersModel('indexeddb://my-model-1'); + * console.log('Prediction from loaded model:'); + * loadedModel.predict(tf.ones([1, 3])).print(); + * ``` + * + * Example 3. Saving `model`'s topology and weights as two files + * (`my-model-1.json` and `my-model-1.weights.bin`) downloaded from + * browser. + * + * ```js + * const model = tf.sequential( + * {layers: [tf.layers.dense({units: 1, inputShape: [3]})]}); + * const saveResults = await model.save('downloads://my-model-1'); + * ``` + * + * Example 4. Send `model`'s topology and weights to an HTTP server. + * See the documentation of `tf.io.http` for more details + * including specifying request parameters and implementation of the + * server. + * + * ```js + * const model = tf.sequential( + * {layers: [tf.layers.dense({units: 1, inputShape: [3]})]}); + * const saveResults = await model.save('http://my-server/model/upload'); + * ``` + * + * @param handlerOrURL An instance of `IOHandler` or a URL-like, + * scheme-based string shortcut for `IOHandler`. + * @param config Options for saving the model. + * @returns A `Promise` of `SaveResult`, which summarizes the result of + * the saving, such as byte sizes of the saved artifacts for the model's + * topology and weight values. + * + * @doc {heading: 'Models', subheading: 'Classes', ignoreCI: true} + */ + save(handlerOrURL: io.IOHandler | string, config?: io.SaveConfig): Promise; + /** + * Set user-defined metadata. + * + * The set metadata will be serialized together with the topology + * and weights of the model during `save()` calls. + * + * @param setUserDefinedMetadata + */ + setUserDefinedMetadata(userDefinedMetadata: {}): void; + /** + * Get user-defined metadata. + * + * The metadata is supplied via one of the two routes: + * 1. By calling `setUserDefinedMetadata()`. + * 2. Loaded during model loading (if the model is constructed + * via `tf.loadLayersModel()`.) + * + * If no user-defined metadata is available from either of the + * two routes, this function will return `undefined`. + */ + getUserDefinedMetadata(): {}; +} + +/** + * A `tf.layers.LayerVariable` is similar to a `tf.Tensor` in that it has a + * dtype and shape, but its value is mutable. The value is itself represented + * as a`tf.Tensor`, and can be read with the `read()` method and updated with + * the `write()` method. + */ +export declare class LayerVariable { + readonly dtype: DataType; + readonly shape: Shape; + readonly id: number; + readonly name: string; + readonly originalName: string; + private trainable_; + protected readonly val: tfc.Variable; + readonly constraint: Constraint; + /** + * Construct Variable from a `tf.Tensor`. + * + * If not explicitly named, the Variable will be given a name with the + * prefix 'Variable'. Variable names are unique. In the case of name + * collision, suffixies '_' will be added to the name. + * + * @param val Initial value of the Variable. + * @param name Name of the variable. If `null` or `undefined` is provided, it + * will default a name with the prefix 'Variable'. + * @param constraint Optional, projection function to be applied to the + * variable after optimize updates + * @throws ValueError if `name` is `null` or `undefined`. + */ + constructor(val: Tensor, dtype?: DataType, name?: string, trainable?: boolean, constraint?: Constraint); + /** + * Get a snapshot of the Variable's value. + * + * The returned value is a snapshot of the Variable's value at the time of + * the invocation. Future mutations in the value of the tensor will only + * be reflected by future calls to this method. + */ + read(): Tensor; + /** + * Update the value of the Variable. + * + * @param newVal: The new value to update to. Must be consistent with the + * dtype and shape of the Variable. + * @return This Variable. + */ + write(newVal: Tensor): this; + /** + * Dispose this LayersVariable instance from memory. + */ + dispose(): void; + protected assertNotDisposed(): void; + get trainable(): boolean; + set trainable(trainable: boolean); +} + +/** + * @license + * Copyright 2018 Google LLC + * + * Use of this source code is governed by an MIT-style + * license that can be found in the LICENSE file or at + * https://opensource.org/licenses/MIT. + * ============================================================================= + */ +/** + * Stub interfaces and classes for testing tf.LayersModel.fitDataset(). + * + * TODO(cais, soergel): Remove this in favor of actual interfaces and classes + * when ready. + */ +declare abstract class LazyIterator { + abstract next(): Promise>; +} + +declare class LeakyReLU extends Layer { + /** @nocollapse */ + static className: string; + readonly alpha: number; + readonly DEFAULT_ALPHA = 0.3; + constructor(args?: LeakyReLULayerArgs); + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + getConfig(): serialization.ConfigDict; +} + +/** + * Leaky version of a rectified linear unit. + * + * It allows a small gradient when the unit is not active: + * `f(x) = alpha * x for x < 0.` + * `f(x) = x for x >= 0.` + * + * Input shape: + * Arbitrary. Use the configuration `inputShape` when using this layer as the + * first layer in a model. + * + * Output shape: + * Same shape as the input. + * + * @doc { + * heading: 'Layers', + * subheading: 'Advanced Activation', + * namespace: 'layers' + * } + */ +declare function leakyReLU(args?: LeakyReLULayerArgs): LeakyReLU; + +declare interface LeakyReLULayerArgs extends LayerArgs { + /** + * Float `>= 0`. Negative slope coefficient. Defaults to `0.3`. + */ + alpha?: number; +} + +/** + * LeCun normal initializer. + * + * It draws samples from a truncated normal distribution centered on 0 + * with `stddev = sqrt(1 / fanIn)` + * where `fanIn` is the number of input units in the weight tensor. + * + * References: + * [Self-Normalizing Neural Networks](https://arxiv.org/abs/1706.02515) + * [Efficient Backprop](http://yann.lecun.com/exdb/publis/pdf/lecun-98b.pdf) + * + * @doc {heading: 'Initializers', namespace: 'initializers'} + */ +declare function leCunNormal(args: SeedOnlyInitializerArgs): Initializer; + +/** + * LeCun uniform initializer. + * + * It draws samples from a uniform distribution in the interval + * `[-limit, limit]` with `limit = sqrt(3 / fanIn)`, + * where `fanIn` is the number of input units in the weight tensor. + * + * @doc {heading: 'Initializers', namespace: 'initializers'} + */ +declare function leCunUniform(args: SeedOnlyInitializerArgs): Initializer; + +declare const lessEqualImpl: SimpleBinaryKernelImpl; + +declare const lessImpl: SimpleBinaryKernelImpl; + +declare function linkProgram(gl: WebGLRenderingContext, program: WebGLProgram): void; + +declare function linSpaceImpl(start: number, stop: number, num: number): TypedArray; + +/** + * Load a graph model given a URL to the model definition. + * + * Example of loading MobileNetV2 from a URL and making a prediction with a + * zeros input: + * + * ```js + * const modelUrl = + * 'https://storage.googleapis.com/tfjs-models/savedmodel/mobilenet_v2_1.0_224/model.json'; + * const model = await tf.loadGraphModel(modelUrl); + * const zeros = tf.zeros([1, 224, 224, 3]); + * model.predict(zeros).print(); + * ``` + * + * Example of loading MobileNetV2 from a TF Hub URL and making a prediction + * with a zeros input: + * + * ```js + * const modelUrl = + * 'https://tfhub.dev/google/imagenet/mobilenet_v2_140_224/classification/2'; + * const model = await tf.loadGraphModel(modelUrl, {fromTFHub: true}); + * const zeros = tf.zeros([1, 224, 224, 3]); + * model.predict(zeros).print(); + * ``` + * @param modelUrl The url or an `io.IOHandler` that loads the model. + * @param options Options for the HTTP request, which allows to send + * credentials + * and custom headers. + * + * @doc {heading: 'Models', subheading: 'Loading'} + */ +export declare function loadGraphModel(modelUrl: string | io.IOHandler, options?: io.LoadOptions, tfio?: typeof io): Promise; + +/** + * Load a graph model given a synchronous IO handler with a 'load' method. + * + * @param modelSource The `io.IOHandlerSync` that loads the model, or the + * `io.ModelArtifacts` that encode the model, or a tuple of + * `[io.ModelJSON, ArrayBuffer]` of which the first element encodes the + * model and the second contains the weights. + * + * @doc {heading: 'Models', subheading: 'Loading'} + */ +export declare function loadGraphModelSync(modelSource: io.IOHandlerSync | io.ModelArtifacts | [io.ModelJSON, /* Weights */ ArrayBuffer]): GraphModel; + +/** + * Load a model composed of Layer objects, including its topology and optionally + * weights. See the Tutorial named "How to import a Keras Model" for usage + * examples. + * + * This method is applicable to: + * + * 1. Models created with the `tf.layers.*`, `tf.sequential`, and + * `tf.model` APIs of TensorFlow.js and later saved with the + * `tf.LayersModel.save` method. + * 2. Models converted from Keras or TensorFlow tf.keras using the + * [tensorflowjs_converter](https://github.com/tensorflow/tfjs/tree/master/tfjs-converter). + * + * This mode is *not* applicable to TensorFlow `SavedModel`s or their converted + * forms. For those models, use `tf.loadGraphModel`. + * + * Example 1. Load a model from an HTTP server. + * + * ```js + * const model = await tf.loadLayersModel( + * 'https://storage.googleapis.com/tfjs-models/tfjs/iris_v1/model.json'); + * model.summary(); + * ``` + * + * Example 2: Save `model`'s topology and weights to browser [local + * storage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage); + * then load it back. + * + * ```js + * const model = tf.sequential( + * {layers: [tf.layers.dense({units: 1, inputShape: [3]})]}); + * console.log('Prediction from original model:'); + * model.predict(tf.ones([1, 3])).print(); + * + * const saveResults = await model.save('localstorage://my-model-1'); + * + * const loadedModel = await tf.loadLayersModel('localstorage://my-model-1'); + * console.log('Prediction from loaded model:'); + * loadedModel.predict(tf.ones([1, 3])).print(); + * ``` + * + * Example 3. Saving `model`'s topology and weights to browser + * [IndexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API); + * then load it back. + * + * ```js + * const model = tf.sequential( + * {layers: [tf.layers.dense({units: 1, inputShape: [3]})]}); + * console.log('Prediction from original model:'); + * model.predict(tf.ones([1, 3])).print(); + * + * const saveResults = await model.save('indexeddb://my-model-1'); + * + * const loadedModel = await tf.loadLayersModel('indexeddb://my-model-1'); + * console.log('Prediction from loaded model:'); + * loadedModel.predict(tf.ones([1, 3])).print(); + * ``` + * + * Example 4. Load a model from user-selected files from HTML + * [file input + * elements](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file). + * + * ```js + * // Note: this code snippet will not work without the HTML elements in the + * // page + * const jsonUpload = document.getElementById('json-upload'); + * const weightsUpload = document.getElementById('weights-upload'); + * + * const model = await tf.loadLayersModel( + * tf.io.browserFiles([jsonUpload.files[0], weightsUpload.files[0]])); + * ``` + * + * @param pathOrIOHandler Can be either of the two formats + * 1. A string path to the `ModelAndWeightsConfig` JSON describing + * the model in the canonical TensorFlow.js format. For file:// + * (tfjs-node-only), http:// and https:// schemas, the path can be + * either absolute or relative. The content of the JSON file is assumed to + * be a JSON object with the following fields and values: + * - 'modelTopology': A JSON object that can be either of: + * 1. a model architecture JSON consistent with the format of the return + * value of `keras.Model.to_json()` + * 2. a full model JSON in the format of `keras.models.save_model()`. + * - 'weightsManifest': A TensorFlow.js weights manifest. + * See the Python converter function `save_model()` for more details. + * It is also assumed that model weights can be accessed from relative + * paths described by the `paths` fields in weights manifest. + * 2. A `tf.io.IOHandler` object that loads model artifacts with its `load` + * method. + * @param options Optional configuration arguments for the model loading, + * including: + * - `strict`: Require that the provided weights exactly match those required + * by the layers. Default true. Passing false means that both extra + * weights and missing weights will be silently ignored. + * - `onProgress`: A progress callback of the form: + * `(fraction: number) => void`. This callback can be used to monitor the + * model-loading process. + * @returns A `Promise` of `tf.LayersModel`, with the topology and weights + * loaded. + * + * @doc {heading: 'Models', subheading: 'Loading'} + */ +export declare function loadLayersModel(pathOrIOHandler: string | io.IOHandler, options?: io.LoadOptions): Promise; + +declare const logImpl: SimpleUnaryImpl; + +/** + * Logs in which values can only be numbers. + * + * Used when calling client-provided custom callbacks. + */ +export declare type Logs = { + [key: string]: number; +}; + +declare function logShaderSourceAndInfoLog(shaderSource: string, shaderInfoLog: string): void; + +/** + * A type representing the strings that are valid loss names. + */ +declare type LossIdentifier = typeof lossOptions[number]; + +/** + * List of all known loss names. + */ +declare const lossOptions: ("mean_squared_error" | "mean_absolute_error" | "mean_absolute_percentage_error" | "mean_squared_logarithmic_error" | "squared_hinge" | "hinge" | "categorical_hinge" | "logcosh" | "categorical_crossentropy" | "sparse_categorical_crossentropy" | "kullback_leibler_divergence" | "poisson" | "cosine_proximity")[]; + +/** + * Type for loss a metric function. + * + * Takes a true value and a predicted value, and returns a loss or metric value. + */ +declare type LossOrMetricFn = (yTrue: Tensor, yPred: Tensor) => Tensor; + +/** + * a type for valid values of the `loss_weights` field. + */ +declare type LossWeights = number[] | { + [key: string]: number; +}; + +declare class LSTM extends RNN { + /** @nocollapse */ + static className: string; + constructor(args: LSTMLayerArgs); + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + /** @nocollapse */ + static fromConfig(cls: serialization.SerializableConstructor, config: serialization.ConfigDict): T; +} + +/** + * Long-Short Term Memory layer - Hochreiter 1997. + * + * This is an `RNN` layer consisting of one `LSTMCell`. However, unlike + * the underlying `LSTMCell`, the `apply` method of `LSTM` operates + * on a sequence of inputs. The shape of the input (not including the first, + * batch dimension) needs to be at least 2-D, with the first dimension being + * time steps. For example: + * + * ```js + * const lstm = tf.layers.lstm({units: 8, returnSequences: true}); + * + * // Create an input with 10 time steps. + * const input = tf.input({shape: [10, 20]}); + * const output = lstm.apply(input); + * + * console.log(JSON.stringify(output.shape)); + * // [null, 10, 8]: 1st dimension is unknown batch size; 2nd dimension is the + * // same as the sequence length of `input`, due to `returnSequences`: `true`; + * // 3rd dimension is the `LSTMCell`'s number of units. + * + * @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'} + */ +declare function lstm(args: LSTMLayerArgs): LSTM; + +declare class LSTMCell extends RNNCell { + /** @nocollapse */ + static className: string; + readonly units: number; + readonly activation: Activation; + readonly recurrentActivation: Activation; + readonly useBias: boolean; + readonly kernelInitializer: Initializer; + readonly recurrentInitializer: Initializer; + readonly biasInitializer: Initializer; + readonly unitForgetBias: boolean; + readonly kernelConstraint: Constraint; + readonly recurrentConstraint: Constraint; + readonly biasConstraint: Constraint; + readonly kernelRegularizer: Regularizer; + readonly recurrentRegularizer: Regularizer; + readonly biasRegularizer: Regularizer; + readonly dropout: number; + readonly recurrentDropout: number; + readonly dropoutFunc: Function; + readonly stateSize: number[]; + readonly implementation: number; + readonly DEFAULT_ACTIVATION = "tanh"; + readonly DEFAULT_RECURRENT_ACTIVATION = "hardSigmoid"; + readonly DEFAULT_KERNEL_INITIALIZER = "glorotNormal"; + readonly DEFAULT_RECURRENT_INITIALIZER = "orthogonal"; + readonly DEFAULT_BIAS_INITIALIZER = "zeros"; + kernel: LayerVariable; + recurrentKernel: LayerVariable; + bias: LayerVariable; + constructor(args: LSTMCellLayerArgs); + build(inputShape: Shape | Shape[]): void; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + getConfig(): serialization.ConfigDict; +} + +/** + * Cell class for `LSTM`. + * + * `LSTMCell` is distinct from the `RNN` subclass `LSTM` in that its + * `apply` method takes the input data of only a single time step and returns + * the cell's output at the time step, while `LSTM` takes the input data + * over a number of time steps. For example: + * + * ```js + * const cell = tf.layers.lstmCell({units: 2}); + * const input = tf.input({shape: [10]}); + * const output = cell.apply(input); + * + * console.log(JSON.stringify(output.shape)); + * // [null, 10]: This is the cell's output at a single time step. The 1st + * // dimension is the unknown batch size. + * ``` + * + * Instance(s) of `LSTMCell` can be used to construct `RNN` layers. The + * most typical use of this workflow is to combine a number of cells into a + * stacked RNN cell (i.e., `StackedRNNCell` internally) and use it to create an + * RNN. For example: + * + * ```js + * const cells = [ + * tf.layers.lstmCell({units: 4}), + * tf.layers.lstmCell({units: 8}), + * ]; + * const rnn = tf.layers.rnn({cell: cells, returnSequences: true}); + * + * // Create an input with 10 time steps and a length-20 vector at each step. + * const input = tf.input({shape: [10, 20]}); + * const output = rnn.apply(input); + * + * console.log(JSON.stringify(output.shape)); + * // [null, 10, 8]: 1st dimension is unknown batch size; 2nd dimension is the + * // same as the sequence length of `input`, due to `returnSequences`: `true`; + * // 3rd dimension is the last `lstmCell`'s number of units. + * ``` + * + * To create an `RNN` consisting of only *one* `LSTMCell`, use the + * `tf.layers.lstm`. + * + * @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'} + */ +declare function lstmCell(args: LSTMCellLayerArgs): LSTMCell; + +export declare interface LSTMCellLayerArgs extends SimpleRNNCellLayerArgs { + /** + * Activation function to use for the recurrent step. + * + * Defaults to hard sigmoid (`hardSigmoid`). + * + * If `null`, no activation is applied. + */ + recurrentActivation?: ActivationIdentifier; + /** + * If `true`, add 1 to the bias of the forget gate at initialization. + * Setting it to `true` will also force `biasInitializer = 'zeros'`. + * This is recommended in + * [Jozefowicz et + * al.](http://www.jmlr.org/proceedings/papers/v37/jozefowicz15.pdf) + */ + unitForgetBias?: boolean; + /** + * Implementation mode, either 1 or 2. + * + * Mode 1 will structure its operations as a larger number of + * smaller dot products and additions. + * + * Mode 2 will batch them into fewer, larger operations. These modes will + * have different performance profiles on different hardware and + * for different applications. + * + * Note: For superior performance, TensorFlow.js always uses implementation + * 2, regardless of the actual value of this configuration field. + */ + implementation?: number; +} + +export declare interface LSTMLayerArgs extends SimpleRNNLayerArgs { + /** + * Activation function to use for the recurrent step. + * + * Defaults to hard sigmoid (`hardSigmoid`). + * + * If `null`, no activation is applied. + */ + recurrentActivation?: ActivationIdentifier; + /** + * If `true`, add 1 to the bias of the forget gate at initialization. + * Setting it to `true` will also force `biasInitializer = 'zeros'`. + * This is recommended in + * [Jozefowicz et + * al.](http://www.jmlr.org/proceedings/papers/v37/jozefowicz15.pdf) + */ + unitForgetBias?: boolean; + /** + * Implementation mode, either 1 or 2. + * Mode 1 will structure its operations as a larger number of + * smaller dot products and additions, whereas mode 2 will + * batch them into fewer, larger operations. These modes will + * have different performance profiles on different hardware and + * for different applications. + * + * Note: For superior performance, TensorFlow.js always uses implementation + * 2, regardless of the actual value of this config field. + */ + implementation?: number; +} + +declare function makeShaderKey(program: WebGPUProgram, shapes: Array, inputsData: InputInfo[], output: TensorInfo_2): string; + +declare function MAPE(yTrue: Tensor, yPred: Tensor): Tensor; + +declare function mape(yTrue: Tensor, yPred: Tensor): Tensor; + +declare function mapToWgslTypes(type: DataType, isVec4: boolean): WGSLDataType | DataType; + +declare class Masking extends Layer { + /** @nocollapse */ + static className: string; + maskValue: number; + constructor(args?: MaskingArgs); + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + getConfig(): { + maskValue: number; + }; + computeMask(inputs: Tensor | Tensor[], mask?: Tensor | Tensor[]): Tensor; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; +} + +/** + * Masks a sequence by using a mask value to skip timesteps. + * + * If all features for a given sample timestep are equal to `mask_value`, + * then the sample timestep will be masked (skipped) in all downstream layers + * (as long as they support masking). + * + * If any downstream layer does not support masking yet receives such + * an input mask, an exception will be raised. + * + * Arguments: + * - `maskValue`: Either None or mask value to skip. + * + * Input shape: + * Arbitrary. Use the keyword argument `inputShape` + * (tuple of integers, does not include the samples axis) + * when using this layer as the first layer in a model. + * + * Output shape: + * Same shape as input. + * + * @doc {heading: 'Layers', subheading: 'Mask', namespace: 'layers'} + */ +declare function masking(args?: MaskingArgs): Masking; + +declare interface MaskingArgs extends LayerArgs { + /** + * Masking Value. Defaults to `0.0`. + */ + maskValue?: number; +} + +export declare class MathBackendCPU extends KernelBackend { + blockSize: number; + data: DataStorage>; + private firstUse; + private static nextDataId; + private nextDataId; + constructor(); + write(values: backend_util.BackendValues, shape: number[], dtype: DataType): DataId; + /** + * Create a data bucket in cpu backend. + * @param shape Shape of the `TensorInfo`. + * @param dtype DType of the `TensorInfo`. + * @param values The value of the `TensorInfo` stored as a flattened array. + */ + makeTensorInfo(shape: number[], dtype: DataType, values?: backend_util.BackendValues | string[]): TensorInfo_2; + /** Return refCount of a `TensorData`. */ + refCount(dataId: DataId): number; + /** Increase refCount of a `TensorData`. */ + incRef(dataId: DataId): void; + /** Decrease refCount of a `TensorData`. */ + decRef(dataId: DataId): void; + move(dataId: DataId, values: backend_util.BackendValues, shape: number[], dtype: DataType, refCount: number): void; + numDataIds(): number; + read(dataId: DataId): Promise; + readSync(dataId: DataId): backend_util.BackendValues; + bufferSync(t: TensorInfo_2): TensorBuffer; + makeOutput(values: backend_util.BackendValues, shape: number[], dtype: DataType): T; + /** + * Dispose the memory if the dataId has 0 refCount. Return true if the memory + * is released or memory is not managed in this backend, false if memory is + * not cleared. + * @param dataId + * @oaram force Optional, remove the data regardless of refCount + */ + disposeData(dataId: DataId, force?: boolean): boolean; + disposeIntermediateTensorInfo(tensorInfo: TensorInfo_2): void; + time(f: () => void): Promise; + memory(): { + unreliable: boolean; + reasons: string[]; + }; + where(condition: Tensor): Tensor2D; + dispose(): void; + floatPrecision(): 16 | 32; + /** Returns the smallest representable number. */ + epsilon(): number; +} + +export declare class MathBackendWebGL extends KernelBackend { + texData: DataStorage; + gpgpu: GPGPUContext; + private static nextDataId; + private nextDataId; + private pendingRead; + private pendingDisposal; + dataRefCount: WeakMap; + private numBytesInGPU; + private canvas; + private programTimersStack; + private activeTimers; + private uploadWaitMs; + private downloadWaitMs; + private lastGlFlushTime; + private floatPrecisionValue; + private textureManager; + private binaryCache; + private gpgpuCreatedLocally; + private numMBBeforeWarning; + private warnedAboutMemory; + constructor(gpuResource?: GPGPUContext | HTMLCanvasElement | OffscreenCanvas); + numDataIds(): number; + writeTexture(texture: WebGLTexture, shape: number[], dtype: DataType, texHeight: number, texWidth: number, channels: string): DataId_2; + write(values: BackendValues, shape: number[], dtype: DataType): DataId_2; + /** Return refCount of a `TensorData`. */ + refCount(dataId: DataId_2): number; + /** Increase refCount of a `TextureData`. */ + incRef(dataId: DataId_2): void; + /** Decrease refCount of a `TextureData`. */ + decRef(dataId: DataId_2): void; + move(dataId: DataId_2, values: BackendValues, shape: number[], dtype: DataType, refCount: number): void; + disposeIntermediateTensorInfo(tensorInfo: TensorInfo_2): void; + readSync(dataId: DataId_2): BackendValues; + read(dataId: DataId_2): Promise; + /** + * Read tensor to a new texture that is densely packed for ease of use. + * @param dataId The source tensor. + * @param options + * customTexShape: Optional. If set, will use the user defined texture + * shape to create the texture. + */ + readToGPU(dataId: DataId_2, options?: DataToGPUWebGLOption): GPUData; + bufferSync(t: TensorInfo_2): TensorBuffer; + private checkNumericalProblems; + private getValuesFromTexture; + timerAvailable(): boolean; + time(f: () => void): Promise; + memory(): WebGLMemoryInfo; + private startTimer; + private endTimer; + private getQueryTime; + private pendingDeletes; + /** + * Decrease the RefCount on the dataId and dispose the memory if the dataId + * has 0 refCount. If there are pending read on the data, the disposal would + * added to the pending delete queue. Return true if the dataId is removed + * from backend or the backend does not contain the dataId, false if the + * dataId is not removed. Memory may or may not be released even when dataId + * is removed, which also depends on dataRefCount, see `releaseGPU`. + * @param dataId + * @oaram force Optional, remove the data regardless of refCount + */ + disposeData(dataId: DataId_2, force?: boolean): boolean; + private releaseGPUData; + getTexture(dataId: DataId_2): WebGLTexture; + /** + * Returns internal information for the specific data bucket. Used in unit + * tests. + */ + getDataInfo(dataId: DataId_2): TextureData; + shouldExecuteOnCPU(inputs: TensorInfo_2[], sizeThreshold?: number): boolean; + getGPGPUContext(): GPGPUContext; + where(condition: Tensor): Tensor2D; + private packedUnaryOp; + abs(x: T): T; + makeTensorInfo(shape: number[], dtype: DataType, values?: BackendValues | string[]): TensorInfo_2; + private makeOutput; + unpackTensor(input: TensorInfo_2): TensorInfo_2; + packTensor(input: TensorInfo_2): TensorInfo_2; + private packedReshape; + private decode; + runWebGLProgram(program: GPGPUProgram, inputs: TensorInfo_2[], outputDtype: DataType, customUniformValues?: number[][], preventEagerUnpackingOfOutput?: boolean, customTexShape?: [number, number]): TensorInfo_2; + compileAndRun(program: GPGPUProgram, inputs: TensorInfo_2[], outputDtype?: DataType, customUniformValues?: number[][], preventEagerUnpackingOfOutput?: boolean): TensorInfo_2; + private getAndSaveBinary; + getTextureManager(): TextureManager; + private disposed; + dispose(): void; + floatPrecision(): 16 | 32; + /** Returns the smallest representable number. */ + epsilon(): number; + uploadToGPU(dataId: DataId_2): void; + private convertAndCacheOnCPU; + private acquireTexture; + private computeBytes; + checkCompileCompletion(): void; + checkCompileCompletionAsync(): Promise; + private checkCompletionAsync_; + private checkCompletion_; + getUniformLocations(): void; + /** + * Create a TF.js tensor out of an existing WebGL texture. A new texture will + * be created. + */ + createTensorFromTexture(values: WebGLData, shape: number[], dtype: DataType): Tensor; +} + +declare enum MatMulProgramType { + MatMulReduceProgram = 0, + MatMulSplitKProgram = 1, + MatMulSmallOutputSizeProgram = 2, + MatMulPackedProgram = 3, + MatMulMax = 4 +} + +declare function maxImpl(aVals: TypedArray, reduceSize: number, outShape: number[], dtype: DataType): TypedArray; + +declare class Maximum extends Merge { + /** @nocollapse */ + static className: string; + constructor(args?: LayerArgs); + protected mergeFunction(inputs: Tensor[]): Tensor; +} + +/** + * Layer that computes the element-wise maximum of an `Array` of inputs. + * + * It takes as input a list of tensors, all of the same shape, and returns a + * single tensor (also of the same shape). For example: + * + * ```js + * const input1 = tf.input({shape: [2, 2]}); + * const input2 = tf.input({shape: [2, 2]}); + * const maxLayer = tf.layers.maximum(); + * const max = maxLayer.apply([input1, input2]); + * console.log(JSON.stringify(max.shape)); + * // You get [null, 2, 2], with the first dimension as the undetermined batch + * // dimension. + * ``` + * + * @doc {heading: 'Layers', subheading: 'Merge', namespace: 'layers'} + */ +declare function maximum(args?: LayerArgs): Maximum; + +declare const maximumImpl: SimpleBinaryKernelImpl; + +/** + * MaxNorm weight constraint. + * + * Constrains the weights incident to each hidden unit + * to have a norm less than or equal to a desired value. + * + * References + * - [Dropout: A Simple Way to Prevent Neural Networks from Overfitting + * Srivastava, Hinton, et al. + * 2014](http://www.cs.toronto.edu/~rsalakhu/papers/srivastava14a.pdf) + * + * @doc {heading: 'Constraints',namespace: 'constraints'} + */ +declare function maxNorm(args: MaxNormArgs): Constraint; + +declare interface MaxNormArgs { + /** + * Maximum norm for incoming weights + */ + maxValue?: number; + /** + * Axis along which to calculate norms. + * + * For instance, in a `Dense` layer the weight matrix + * has shape `[inputDim, outputDim]`, + * set `axis` to `0` to constrain each weight vector + * of length `[inputDim,]`. + * In a `Conv2D` layer with `dataFormat="channels_last"`, + * the weight tensor has shape + * `[rows, cols, inputDepth, outputDepth]`, + * set `axis` to `[0, 1, 2]` + * to constrain the weights of each filter tensor of size + * `[rows, cols, inputDepth]`. + */ + axis?: number; +} + +declare const maxPool1d: typeof maxPooling1d; + +declare const maxPool2d: typeof maxPooling2d; + +declare class MaxPooling1D extends Pooling1D { + /** @nocollapse */ + static className: string; + constructor(args: Pooling1DLayerArgs); + protected poolingFunction(inputs: Tensor, poolSize: [number, number], strides: [number, number], padding: PaddingMode, dataFormat: DataFormat): Tensor; +} + +/** + * Max pooling operation for temporal data. + * + * Input shape: `[batchSize, inLength, channels]` + * + * Output shape: `[batchSize, pooledLength, channels]` + * + * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'} + */ +declare function maxPooling1d(args: Pooling1DLayerArgs): MaxPooling1D; + +declare class MaxPooling2D extends Pooling2D { + /** @nocollapse */ + static className: string; + constructor(args: Pooling2DLayerArgs); + protected poolingFunction(inputs: Tensor, poolSize: [number, number], strides: [number, number], padding: PaddingMode, dataFormat: DataFormat): Tensor; +} + +/** + * Max pooling operation for spatial data. + * + * Input shape + * - If `dataFormat === CHANNEL_LAST`: + * 4D tensor with shape: + * `[batchSize, rows, cols, channels]` + * - If `dataFormat === CHANNEL_FIRST`: + * 4D tensor with shape: + * `[batchSize, channels, rows, cols]` + * + * Output shape + * - If `dataFormat=CHANNEL_LAST`: + * 4D tensor with shape: + * `[batchSize, pooledRows, pooledCols, channels]` + * - If `dataFormat=CHANNEL_FIRST`: + * 4D tensor with shape: + * `[batchSize, channels, pooledRows, pooledCols]` + * + * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'} + */ +declare function maxPooling2d(args: Pooling2DLayerArgs): MaxPooling2D; + +declare class MaxPooling3D extends Pooling3D { + /** @nocollapse */ + static className: string; + constructor(args: Pooling3DLayerArgs); + protected poolingFunction(inputs: Tensor, poolSize: [number, number, number], strides: [number, number, number], padding: PaddingMode, dataFormat: DataFormat): Tensor; +} + +/** + * Max pooling operation for 3D data. + * + * Input shape + * - If `dataFormat === channelsLast`: + * 5D tensor with shape: + * `[batchSize, depths, rows, cols, channels]` + * - If `dataFormat === channelsFirst`: + * 5D tensor with shape: + * `[batchSize, channels, depths, rows, cols]` + * + * Output shape + * - If `dataFormat=channelsLast`: + * 5D tensor with shape: + * `[batchSize, pooledDepths, pooledRows, pooledCols, channels]` + * - If `dataFormat=channelsFirst`: + * 5D tensor with shape: + * `[batchSize, channels, pooledDepths, pooledRows, pooledCols]` + * + * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'} + */ +declare function maxPooling3d(args: Pooling3DLayerArgs): MaxPooling3D; + +/** + * Loss or metric function: Mean absolute error. + * + * Mathematically, mean absolute error is defined as: + * `mean(abs(yPred - yTrue))`, + * wherein the `mean` is applied over feature dimensions. + * + * ```js + * const yTrue = tf.tensor2d([[0, 1], [0, 0], [2, 3]]); + * const yPred = tf.tensor2d([[0, 1], [0, 1], [-2, -3]]); + * const mse = tf.metrics.meanAbsoluteError(yTrue, yPred); + * mse.print(); + * ``` + * + * @param yTrue Truth Tensor. + * @param yPred Prediction Tensor. + * @return Mean absolute error Tensor. + * + * @doc {heading: 'Metrics', namespace: 'metrics'} + */ +declare function meanAbsoluteError(yTrue: Tensor, yPred: Tensor): Tensor; + +/** + * Loss or metric function: Mean absolute percentage error. + * + * ```js + * const yTrue = tf.tensor2d([[0, 1], [10, 20]]); + * const yPred = tf.tensor2d([[0, 1], [11, 24]]); + * const mse = tf.metrics.meanAbsolutePercentageError(yTrue, yPred); + * mse.print(); + * ``` + * + * Aliases: `tf.metrics.MAPE`, `tf.metrics.mape`. + * + * @param yTrue Truth Tensor. + * @param yPred Prediction Tensor. + * @return Mean absolute percentage error Tensor. + * + * @doc {heading: 'Metrics', namespace: 'metrics'} + */ +declare function meanAbsolutePercentageError(yTrue: Tensor, yPred: Tensor): Tensor; + +/** + * Loss or metric function: Mean squared error. + * + * ```js + * const yTrue = tf.tensor2d([[0, 1], [3, 4]]); + * const yPred = tf.tensor2d([[0, 1], [-3, -4]]); + * const mse = tf.metrics.meanSquaredError(yTrue, yPred); + * mse.print(); + * ``` + * + * Aliases: `tf.metrics.MSE`, `tf.metrics.mse`. + * + * @param yTrue Truth Tensor. + * @param yPred Prediction Tensor. + * @return Mean squared error Tensor. + * + * @doc {heading: 'Metrics', namespace: 'metrics'} + */ +declare function meanSquaredError(yTrue: Tensor, yPred: Tensor): Tensor; + +/** + * Generic Merge layer for element-wise merge functions. + * + * Used to implement `Sum`, `Average`, `Concatenate`, etc. + */ +declare abstract class Merge extends Layer { + protected reshapeRequired: boolean; + constructor(args?: LayerArgs); + /** + * Logic for merging multiple tensors, to be overridden by subclasses. + * @param inputs + */ + protected mergeFunction(inputs: Tensor[]): Tensor; + /** + * Computes the shape of the result of an elementwise operation. + * + * @param shape1: Shape of the first tensor. + * @param shape2: Shape of the second tensor. + * @returns Expected output shape when an elementwise operation is carried + * out on 2 tensors with shapes `shape1` and `shape2`. + * @throws ValueError: If `shape1` and `shape2` are not compatible for + * element-wise operations. + */ + private computeElementwiseOpOutputShape; + build(inputShape: Shape | Shape[]): void; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + computeMask(inputs: Tensor | Tensor[], mask?: Tensor | Tensor[]): Tensor; +} + +declare namespace metrics { + export { + binaryAccuracy, + binaryCrossentropy, + sparseCategoricalAccuracy, + categoricalAccuracy, + categoricalCrossentropy, + precision, + recall, + cosineProximity, + meanAbsoluteError, + meanAbsolutePercentageError, + MAPE, + mape, + meanSquaredError, + MSE, + mse + } +} +export { metrics } + +declare type MetricsIdentifier = string; + +declare class Minimum extends Merge { + /** @nocollapse */ + static className: string; + constructor(args?: LayerArgs); + protected mergeFunction(inputs: Tensor[]): Tensor; +} + +/** + * Layer that computes the element-wise minimum of an `Array` of inputs. + * + * It takes as input a list of tensors, all of the same shape, and returns a + * single tensor (also of the same shape). For example: + * + * ```js + * const input1 = tf.input({shape: [2, 2]}); + * const input2 = tf.input({shape: [2, 2]}); + * const minLayer = tf.layers.minimum(); + * const min = minLayer.apply([input1, input2]); + * console.log(JSON.stringify(min.shape)); + * // You get [null, 2, 2], with the first dimension as the undetermined batch + * // dimension. + * ``` + * + * @doc {heading: 'Layers', subheading: 'Merge', namespace: 'layers'} + */ +declare function minimum(args?: LayerArgs): Minimum; + +declare const minimumImpl: SimpleBinaryKernelImpl; + +/** @doc {heading: 'Constraints', namespace: 'constraints'} */ +declare function minMaxNorm(config: MinMaxNormArgs): Constraint; + +declare interface MinMaxNormArgs { + /** + * Minimum norm for incoming weights + */ + minValue?: number; + /** + * Maximum norm for incoming weights + */ + maxValue?: number; + /** + * Axis along which to calculate norms. + * For instance, in a `Dense` layer the weight matrix + * has shape `[inputDim, outputDim]`, + * set `axis` to `0` to constrain each weight vector + * of length `[inputDim,]`. + * In a `Conv2D` layer with `dataFormat="channels_last"`, + * the weight tensor has shape + * `[rows, cols, inputDepth, outputDepth]`, + * set `axis` to `[0, 1, 2]` + * to constrain the weights of each filter tensor of size + * `[rows, cols, inputDepth]`. + */ + axis?: number; + /** + * Rate for enforcing the constraint: weights will be rescaled to yield: + * `(1 - rate) * norm + rate * norm.clip(minValue, maxValue)`. + * Effectively, this means that rate=1.0 stands for strict + * enforcement of the constraint, while rate<1.0 means that + * weights will be rescaled at each step to slowly move + * towards a value inside the desired interval. + */ + rate?: number; +} + +/** + * A model is a data structure that consists of `Layers` and defines inputs + * and outputs. + * + * The key difference between `tf.model` and `tf.sequential` is that + * `tf.model` is more generic, supporting an arbitrary graph (without + * cycles) of layers. `tf.sequential` is less generic and supports only a linear + * stack of layers. + * + * When creating a `tf.LayersModel`, specify its input(s) and output(s). Layers + * are used to wire input(s) to output(s). + * + * For example, the following code snippet defines a model consisting of + * two `dense` layers, with 10 and 4 units, respectively. + * + * ```js + * // Define input, which has a size of 5 (not including batch dimension). + * const input = tf.input({shape: [5]}); + * + * // First dense layer uses relu activation. + * const denseLayer1 = tf.layers.dense({units: 10, activation: 'relu'}); + * // Second dense layer uses softmax activation. + * const denseLayer2 = tf.layers.dense({units: 4, activation: 'softmax'}); + * + * // Obtain the output symbolic tensor by applying the layers on the input. + * const output = denseLayer2.apply(denseLayer1.apply(input)); + * + * // Create the model based on the inputs. + * const model = tf.model({inputs: input, outputs: output}); + * + * // The model can be used for training, evaluation and prediction. + * // For example, the following line runs prediction with the model on + * // some fake data. + * model.predict(tf.ones([2, 5])).print(); + * ``` + * See also: + * `tf.sequential`, `tf.loadLayersModel`. + * + * @doc {heading: 'Models', subheading: 'Creation'} + */ +export declare function model(args: ContainerArgs): LayersModel; + +/** + * Options for loading a saved mode in TensorFlow.js format. + */ +export declare interface ModelAndWeightsConfig { + /** + * A JSON object or JSON string containing the model config. + * + * This can be either of the following two formats: + * - A model archiecture-only config, i.e., a format consistent with the + * return value of`keras.Model.to_json()`. + * - A full model config, containing not only model architecture, but also + * training options and state, i.e., a format consistent with the return + * value of `keras.models.save_model()`. + */ + modelTopology: PyJsonDict; + /** + * A weights manifest in TensorFlow.js format. + */ + weightsManifest?: io.WeightsManifestConfig; + /** + * Path to prepend to the paths in `weightManifest` before fetching. + * + * The path may optionally end in a slash ('/'). + */ + pathPrefix?: string; +} + +/** + * Configuration for calls to `LayersModel.compile()`. + */ +export declare interface ModelCompileArgs { + /** + * An instance of `tf.train.Optimizer` or a string name for an Optimizer. + */ + optimizer: string | Optimizer; + /** + * Object function(s) or name(s) of object function(s). + * If the model has multiple outputs, you can use a different loss + * on each output by passing a dictionary or an Array of losses. + * The loss value that will be minimized by the model will then be the sum + * of all individual losses. + */ + loss: string | string[] | { + [outputName: string]: string; + } | LossOrMetricFn | LossOrMetricFn[] | { + [outputName: string]: LossOrMetricFn; + }; + /** + * List of metrics to be evaluated by the model during training and testing. + * Typically you will use `metrics=['accuracy']`. + * To specify different metrics for different outputs of a multi-output + * model, you could also pass a dictionary. + */ + metrics?: string | LossOrMetricFn | Array | { + [outputName: string]: string | LossOrMetricFn; + }; +} + +export declare interface ModelEvaluateArgs { + /** + * Batch size (Integer). If unspecified, it will default to 32. + */ + batchSize?: number; + /** + * Verbosity mode. + */ + verbose?: ModelLoggingVerbosity; + /** + * Tensor of weights to weight the contribution of different samples to the + * loss and metrics. + */ + sampleWeight?: Tensor; + /** + * integer: total number of steps (batches of samples) + * before declaring the evaluation round finished. Ignored with the default + * value of `undefined`. + */ + steps?: number; +} + +/** + * Interface for configuring model evaluation based on a dataset object. + */ +declare interface ModelEvaluateDatasetArgs { + /** + * Number of batches to draw from the dataset object before ending the + * evaluation. + */ + batches?: number; + /** + * Verbosity mode. + */ + verbose?: ModelLoggingVerbosity; +} + +/** + * Interface configuration model training based on data as `tf.Tensor`s. + */ +export declare interface ModelFitArgs { + /** + * Number of samples per gradient update. If unspecified, it + * will default to 32. + */ + batchSize?: number; + /** + * Integer number of times to iterate over the training data arrays. + */ + epochs?: number; + /** + * Verbosity level. + * + * Expected to be 0, 1, or 2. Default: 1. + * + * 0 - No printed message during fit() call. + * 1 - In Node.js (tfjs-node), prints the progress bar, together with + * real-time updates of loss and metric values and training speed. + * In the browser: no action. This is the default. + * 2 - Not implemented yet. + */ + verbose?: ModelLoggingVerbosity; + /** + * List of callbacks to be called during training. + * Can have one or more of the following callbacks: + * - `onTrainBegin(logs)`: called when training starts. + * - `onTrainEnd(logs)`: called when training ends. + * - `onEpochBegin(epoch, logs)`: called at the start of every epoch. + * - `onEpochEnd(epoch, logs)`: called at the end of every epoch. + * - `onBatchBegin(batch, logs)`: called at the start of every batch. + * - `onBatchEnd(batch, logs)`: called at the end of every batch. + * - `onYield(epoch, batch, logs)`: called every `yieldEvery` milliseconds + * with the current epoch, batch and logs. The logs are the same + * as in `onBatchEnd()`. Note that `onYield` can skip batches or + * epochs. See also docs for `yieldEvery` below. + */ + callbacks?: BaseCallback[] | CustomCallbackArgs | CustomCallbackArgs[]; + /** + * Float between 0 and 1: fraction of the training data + * to be used as validation data. The model will set apart this fraction of + * the training data, will not train on it, and will evaluate the loss and + * any model metrics on this data at the end of each epoch. + * The validation data is selected from the last samples in the `x` and `y` + * data provided, before shuffling. + */ + validationSplit?: number; + /** + * Data on which to evaluate the loss and any model + * metrics at the end of each epoch. The model will not be trained on this + * data. This could be a tuple [xVal, yVal] or a tuple [xVal, yVal, + * valSampleWeights]. The model will not be trained on this data. + * `validationData` will override `validationSplit`. + */ + validationData?: [ + Tensor | Tensor[], + Tensor | Tensor[] + ] | [Tensor | Tensor[], Tensor | Tensor[], Tensor | Tensor[]]; + /** + * Whether to shuffle the training data before each epoch. Has + * no effect when `stepsPerEpoch` is not `null`. + */ + shuffle?: boolean; + /** + * Optional object mapping class indices (integers) to + * a weight (float) to apply to the model's loss for the samples from this + * class during training. This can be useful to tell the model to "pay more + * attention" to samples from an under-represented class. + * + * If the model has multiple outputs, a class weight can be specified for + * each of the outputs by setting this field an array of weight object + * or an object that maps model output names (e.g., `model.outputNames[0]`) + * to weight objects. + */ + classWeight?: ClassWeight | ClassWeight[] | ClassWeightMap; + /** + * Optional array of the same length as x, containing + * weights to apply to the model's loss for each sample. In the case of + * temporal data, you can pass a 2D array with shape (samples, + * sequenceLength), to apply a different weight to every timestep of every + * sample. In this case you should make sure to specify + * sampleWeightMode="temporal" in compile(). + */ + sampleWeight?: Tensor; + /** + * Epoch at which to start training (useful for resuming a previous training + * run). When this is used, `epochs` is the index of the "final epoch". + * The model is not trained for a number of iterations given by `epochs`, + * but merely until the epoch of index `epochs` is reached. + */ + initialEpoch?: number; + /** + * Total number of steps (batches of samples) before + * declaring one epoch finished and starting the next epoch. When training + * with Input Tensors such as TensorFlow data tensors, the default `null` is + * equal to the number of unique samples in your dataset divided by the + * batch size, or 1 if that cannot be determined. + */ + stepsPerEpoch?: number; + /** + * Only relevant if `stepsPerEpoch` is specified. Total number of steps + * (batches of samples) to validate before stopping. + */ + validationSteps?: number; + /** + * Configures the frequency of yielding the main thread to other tasks. + * + * In the browser environment, yielding the main thread can improve the + * responsiveness of the page during training. In the Node.js environment, + * it can ensure tasks queued in the event loop can be handled in a timely + * manner. + * + * The value can be one of the following: + * - `'auto'`: The yielding happens at a certain frame rate (currently set + * at 125ms). This is the default. + * - `'batch'`: yield every batch. + * - `'epoch'`: yield every epoch. + * - any `number`: yield every `number` milliseconds. + * - `'never'`: never yield. (yielding can still happen through `await + * nextFrame()` calls in custom callbacks.) + */ + yieldEvery?: YieldEveryOptions; +} + +/** + * Interface for configuring model training based on a dataset object. + */ +export declare interface ModelFitDatasetArgs { + /** + * (Optional) Total number of steps (batches of samples) before + * declaring one epoch finished and starting the next epoch. It should + * typically be equal to the number of samples of your dataset divided by + * the batch size, so that `fitDataset`() call can utilize the entire dataset. + * If it is not provided, use `done` return value in `iterator.next()` as + * signal to finish an epoch. + */ + batchesPerEpoch?: number; + /** + * Integer number of times to iterate over the training dataset. + */ + epochs: number; + /** + * Verbosity level. + * + * Expected to be 0, 1, or 2. Default: 1. + * + * 0 - No printed message during fit() call. + * 1 - In Node.js (tfjs-node), prints the progress bar, together with + * real-time updates of loss and metric values and training speed. + * In the browser: no action. This is the default. + * 2 - Not implemented yet. + */ + verbose?: ModelLoggingVerbosity; + /** + * List of callbacks to be called during training. + * Can have one or more of the following callbacks: + * - `onTrainBegin(logs)`: called when training starts. + * - `onTrainEnd(logs)`: called when training ends. + * - `onEpochBegin(epoch, logs)`: called at the start of every epoch. + * - `onEpochEnd(epoch, logs)`: called at the end of every epoch. + * - `onBatchBegin(batch, logs)`: called at the start of every batch. + * - `onBatchEnd(batch, logs)`: called at the end of every batch. + * - `onYield(epoch, batch, logs)`: called every `yieldEvery` milliseconds + * with the current epoch, batch and logs. The logs are the same + * as in `onBatchEnd()`. Note that `onYield` can skip batches or + * epochs. See also docs for `yieldEvery` below. + */ + callbacks?: BaseCallback[] | CustomCallbackArgs | CustomCallbackArgs[]; + /** + * Data on which to evaluate the loss and any model + * metrics at the end of each epoch. The model will not be trained on this + * data. This could be any of the following: + * + * - An array `[xVal, yVal]`, where the two values may be `tf.Tensor`, + * an array of Tensors, or a map of string to Tensor. + * - Similarly, an array ` [xVal, yVal, valSampleWeights]` + * (not implemented yet). + * - a `Dataset` object with elements of the form `{xs: xVal, ys: yVal}`, + * where `xs` and `ys` are the feature and label tensors, respectively. + * + * If `validationData` is an Array of Tensor objects, each `tf.Tensor` will be + * sliced into batches during validation, using the parameter + * `validationBatchSize` (which defaults to 32). The entirety of the + * `tf.Tensor` objects will be used in the validation. + * + * If `validationData` is a dataset object, and the `validationBatches` + * parameter is specified, the validation will use `validationBatches` batches + * drawn from the dataset object. If `validationBatches` parameter is not + * specified, the validation will stop when the dataset is exhausted. + * + * The model will not be trained on this data. + */ + validationData?: [ + TensorOrArrayOrMap, + TensorOrArrayOrMap + ] | [TensorOrArrayOrMap, TensorOrArrayOrMap, TensorOrArrayOrMap] | Dataset; + /** + * Optional batch size for validation. + * + * Used only if `validationData` is an array of `tf.Tensor` objects, i.e., not + * a dataset object. + * + * If not specified, its value defaults to 32. + */ + validationBatchSize?: number; + /** + * (Optional) Only relevant if `validationData` is specified and is a dataset + * object. + * + * Total number of batches of samples to draw from `validationData` for + * validation purpose before stopping at the end of every epoch. If not + * specified, `evaluateDataset` will use `iterator.next().done` as signal to + * stop validation. + */ + validationBatches?: number; + /** + * Configures the frequency of yielding the main thread to other tasks. + * + * In the browser environment, yielding the main thread can improve the + * responsiveness of the page during training. In the Node.js environment, + * it can ensure tasks queued in the event loop can be handled in a timely + * manner. + * + * The value can be one of the following: + * - `'auto'`: The yielding happens at a certain frame rate (currently set + * at 125ms). This is the default. + * - `'batch'`: yield every batch. + * - `'epoch'`: yield every epoch. + * - a `number`: Will yield every `number` milliseconds. + * - `'never'`: never yield. (But yielding can still happen through `await + * nextFrame()` calls in custom callbacks.) + */ + yieldEvery?: YieldEveryOptions; + /** + * Epoch at which to start training (useful for resuming a previous training + * run). When this is used, `epochs` is the index of the "final epoch". + * The model is not trained for a number of iterations given by `epochs`, + * but merely until the epoch of index `epochs` is reached. + */ + initialEpoch?: number; + /** + * Optional object mapping class indices (integers) to + * a weight (float) to apply to the model's loss for the samples from this + * class during training. This can be useful to tell the model to "pay more + * attention" to samples from an under-represented class. + * + * If the model has multiple outputs, a class weight can be specified for + * each of the outputs by setting this field an array of weight object + * or an object that maps model output names (e.g., `model.outputNames[0]`) + * to weight objects. + */ + classWeight?: ClassWeight | ClassWeight[] | ClassWeightMap; +} + +/** + * Parses a JSON model configuration file and returns a model instance. + * + * ```js + * // This example shows how to serialize a model using `toJSON()` and + * // deserialize it as another model using `tf.models.modelFromJSON()`. + * // Note: this example serializes and deserializes only the topology + * // of the model; the weights of the loaded model will be different + * // from those of the the original model, due to random weight + * // initialization. + * // To load the topology and weights of a model, use `tf.loadLayersModel()`. + * const model1 = tf.sequential(); + * model1.add(tf.layers.repeatVector({inputShape: [2], n: 4})); + * // Serialize `model1` as a JSON object. + * const model1JSON = model1.toJSON(null, false); + * model1.summary(); + * + * const model2 = await tf.models.modelFromJSON(model1JSON); + * model2.summary(); + * ``` + * + * @param modelAndWeightsConfig JSON object or string encoding a model and + * weights configuration. It can also be only the topology JSON of the + * model, in which case the weights will not be loaded. + * @param custom_objects Optional dictionary mapping names + * (strings) to custom classes or functions to be + * considered during deserialization. + * @returns A TensorFlow.js Layers `tf.LayersModel` instance (uncompiled). + */ +declare function modelFromJSON(modelAndWeightsConfig: ModelAndWeightsConfig | PyJsonDict, customObjects?: serialization.ConfigDict): Promise; + +/** Verbosity logging level when fitting a model. */ +declare enum ModelLoggingVerbosity { + SILENT = 0, + VERBOSE = 1 +} + +declare interface ModelPredictArgs { + /** + * Optional. Batch size (Integer). If unspecified, it will default to 32. + */ + batchSize?: number; + /** + * Optional. Verbosity mode. Defaults to false. + */ + verbose?: boolean; +} + +declare namespace models { + export { + modelFromJSON + } +} +export { models } + +declare type MomentumOptimizerConfig = { + learning_rate: number; + momentum: number; + use_nesterov?: boolean; +}; + +declare type MomentumSerialization = BaseSerialization<'Momentum', MomentumOptimizerConfig>; + +declare function MSE(yTrue: Tensor, yPred: Tensor): Tensor; + +declare function mse(yTrue: Tensor, yPred: Tensor): Tensor; + +declare class Multiply extends Merge { + /** @nocollapse */ + static className: string; + constructor(args?: LayerArgs); + protected mergeFunction(inputs: Tensor[]): Tensor; +} + +/** + * Layer that multiplies (element-wise) an `Array` of inputs. + * + * It takes as input an Array of tensors, all of the same + * shape, and returns a single tensor (also of the same shape). + * For example: + * + * ```js + * const input1 = tf.input({shape: [2, 2]}); + * const input2 = tf.input({shape: [2, 2]}); + * const input3 = tf.input({shape: [2, 2]}); + * const multiplyLayer = tf.layers.multiply(); + * const product = multiplyLayer.apply([input1, input2, input3]); + * console.log(product.shape); + * // You get [null, 2, 2], with the first dimension as the undetermined batch + * // dimension. + * + * @doc {heading: 'Layers', subheading: 'Merge', namespace: 'layers'} + */ +declare function multiply(args?: LayerArgs): Multiply; + +declare const multiplyImpl: SimpleBinaryKernelImpl; + +declare interface NamedTensor { + name: string; + tensor: Tensor; +} + +declare type NamedTensorsMap = { + [key: string]: Tensor[]; +}; + +declare function negImpl(xVals: TypedArray, xShape: number[], xDtype: DataType): [ +TypedArray, +number[] +]; + +/** + * A `Node` describes the connectivity between two layers. + * + * Each time a layer is connected to some new input, + * a node is added to `layer.inboundNodes`. + * + * Each time the output of a layer is used by another layer, + * a node is added to `layer.outboundNodes`. + * + * `nodeIndices` and `tensorIndices` are basically fine-grained coordinates + * describing the origin of the `inputTensors`, verifying the following: + * + * `inputTensors[i] == + * inboundLayers[i].inboundNodes[nodeIndices[i]].outputTensors[ + * tensorIndices[i]]` + * + * A node from layer A to layer B is added to: + * A.outboundNodes + * B.inboundNodes + */ +declare class Node_2 { + callArgs?: Kwargs; + /** + * The layer that takes `inputTensors` and turns them into `outputTensors` + * (the node gets created when the `call` method of the layer is called). + */ + outboundLayer: Layer; + /** + * A list of layers, the same length as `inputTensors`, the layers from where + * `inputTensors` originate. + */ + inboundLayers: Layer[]; + /** + * A list of integers, the same length as `inboundLayers`. `nodeIndices[i]` is + * the origin node of `inputTensors[i]` (necessary since each inbound layer + * might have several nodes, e.g. if the layer is being shared with a + * different data stream). + */ + nodeIndices: number[]; + /** + * A list of integers, the same length as `inboundLayers`. `tensorIndices[i]` + * is the index of `inputTensors[i]` within the output of the inbound layer + * (necessary since each inbound layer might have multiple tensor outputs, + * with each one being independently manipulable). + */ + tensorIndices: number[]; + /** List of input tensors. */ + inputTensors: SymbolicTensor[]; + /** List of output tensors. */ + outputTensors: SymbolicTensor[]; + /** List of input masks (a mask can be a tensor, or null). */ + inputMasks: Tensor[]; + /** List of output masks (a mask can be a tensor, or null). */ + outputMasks: Tensor[]; + /** List of input shape tuples. */ + inputShapes: Shape | Shape[]; + /** List of output shape tuples. */ + outputShapes: Shape | Shape[]; + readonly id: number; + constructor(args: NodeArgs, callArgs?: Kwargs); + getConfig(): serialization.ConfigDict; +} + +/** + * Constructor arguments for Node. + */ +declare interface NodeArgs { + /** + * The layer that takes `inputTensors` and turns them into `outputTensors`. + * (the node gets created when the `call` method of the layer is called). + */ + outboundLayer: Layer; + /** + * A list of layers, the same length as `inputTensors`, the layers from where + * `inputTensors` originate. + */ + inboundLayers: Layer[]; + /** + * A list of integers, the same length as `inboundLayers`. `nodeIndices[i]` is + * the origin node of `inputTensors[i]` (necessary since each inbound layer + * might have several nodes, e.g. if the layer is being shared with a + * different data stream). + */ + nodeIndices: number[]; + /** + * A list of integers, the same length as `inboundLayers`. `tensorIndices[i]` + * is the index of `inputTensors[i]` within the output of the inbound layer + * (necessary since each inbound layer might have multiple tensor outputs, + * with each one being independently manipulable). + */ + tensorIndices: number[]; + /** List of input tensors. */ + inputTensors: SymbolicTensor[]; + /** List of output tensors. */ + outputTensors: SymbolicTensor[]; + /** List of input masks (a mask can be a tensor, or null). */ + inputMasks: Tensor[]; + /** List of output masks (a mask can be a tensor, or null). */ + outputMasks: Tensor[]; + /** List of input shape tuples. */ + inputShapes: Shape | Shape[]; + /** List of output shape tuples. */ + outputShapes: Shape | Shape[]; +} + +/** + * Constrains the weight to be non-negative. + * + * @doc {heading: 'Constraints', namespace: 'constraints'} + */ +declare function nonNeg(): Constraint; + +declare const notEqualImpl: SimpleBinaryKernelImpl; + +/** + * Initializer that generates tensors initialized to 1. + * + * @doc {heading: 'Initializers', namespace: 'initializers'} + */ +declare function ones(): Initializer; + +export declare interface OpExecutor { + (node: GraphNode): Tensor | Tensor[] | Promise; +} + +declare type OptimizerSerialization = AdadeltaSerialization | AdagradSerialization | AdamSerialization | AdamaxSerialization | MomentumSerialization | RMSPropSerialization | SGDSerialization; + +/** + * Initializer that generates a random orthogonal matrix. + * + * Reference: + * [Saxe et al., http://arxiv.org/abs/1312.6120](http://arxiv.org/abs/1312.6120) + * + * @doc {heading: 'Initializers', namespace: 'initializers'} + */ +declare function orthogonal(args: OrthogonalArgs): Initializer; + +declare interface OrthogonalArgs extends SeedOnlyInitializerArgs { + /** + * Multiplicative factor to apply to the orthogonal matrix. Defaults to 1. + */ + gain?: number; +} + +declare type OutputMode = 'int' | 'oneHot' | 'multiHot' | 'count' | 'tfIdf'; + +declare enum PackingScheme { + /** + * All values in a single texel are densely packed without any constraints. + * + * This is how the shader encodes a tensor with shape = [2, 3, 4] + * (indices are [batch, row, col]). + * + * 000|001 010|011 020|021 + * ------- ------- ------- + * 002|003 012|013 022|023 + * + * 100|101 110|111 120|121 + * ------- ------- ------- + * 102|103 112|113 122|123 + * + */ + DENSE = 0, + /** + * Single texels contain only values from the same batch, and from adjacent + * rows and columns. + * + * This is how the shader encodes a tensor with shape = [2, 3, 5] + * (indices are [batch, row, col]). + * + * 000|001 002|003 004|xxx 020|021 022|023 024|xxx + * ------- ------- ------- ------- ------- ------- + * 010|011 012|013 014|xxx xxx|xxx xxx|xxx xxx|xxx + * + * 100|101 102|103 104|xxx 120|121 122|123 124|xxx + * ------- ------- ------- ------- ------- ------- + * 110|111 112|113 114|xxx xxx|xxx xxx|xxx xxx|xxx + * + */ + SHARED_BATCH = 1 +} + +/** @docinline */ +declare type PaddingMode = 'valid' | 'same' | 'causal'; + +declare type Params = { + [key: string]: number | string | boolean | number[] | string[] | boolean[]; +}; + +declare class Permute extends Layer { + /** @nocollapse */ + static className: string; + readonly dims: number[]; + private readonly dimsIncludingBatch; + constructor(args: PermuteLayerArgs); + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + getConfig(): serialization.ConfigDict; +} + +/** + * Permutes the dimensions of the input according to a given pattern. + * + * Useful for, e.g., connecting RNNs and convnets together. + * + * Example: + * + * ```js + * const model = tf.sequential(); + * model.add(tf.layers.permute({ + * dims: [2, 1], + * inputShape: [10, 64] + * })); + * console.log(model.outputShape); + * // Now model's output shape is [null, 64, 10], where null is the + * // unpermuted sample (batch) dimension. + * ``` + * + * Input shape: + * Arbitrary. Use the configuration field `inputShape` when using this + * layer as the first layer in a model. + * + * Output shape: + * Same rank as the input shape, but with the dimensions re-ordered (i.e., + * permuted) according to the `dims` configuration of this layer. + * + * @doc {heading: 'Layers', subheading: 'Basic', namespace: 'layers'} + */ +declare function permute(args: PermuteLayerArgs): Permute; + +declare interface PermuteLayerArgs extends LayerArgs { + /** + * Array of integers. Permutation pattern. Does not include the + * sample (batch) dimension. Index starts at 1. + * For instance, `[2, 1]` permutes the first and second dimensions + * of the input. + */ + dims: number[]; +} + +/** + * Abstract class for different pooling 1D layers. + */ +declare abstract class Pooling1D extends Layer { + protected readonly poolSize: [number]; + protected readonly strides: [number]; + protected readonly padding: PaddingMode; + /** + * + * @param args Parameters for the Pooling layer. + * + * config.poolSize defaults to 2. + */ + constructor(args: Pooling1DLayerArgs); + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + protected abstract poolingFunction(inputs: Tensor, poolSize: [number, number], strides: [number, number], padding: PaddingMode, dataFormat: DataFormat): Tensor; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + getConfig(): serialization.ConfigDict; +} + +declare interface Pooling1DLayerArgs extends LayerArgs { + /** + * Size of the window to pool over, should be an integer. + */ + poolSize?: number | [number]; + /** + * Period at which to sample the pooled values. + * + * If `null`, defaults to `poolSize`. + */ + strides?: number | [number]; + /** How to fill in data that's not an integer multiple of poolSize. */ + padding?: PaddingMode; +} + +/** + * Abstract class for different pooling 2D layers. + */ +declare abstract class Pooling2D extends Layer { + protected readonly poolSize: [number, number]; + protected readonly strides: [number, number]; + protected readonly padding: PaddingMode; + protected readonly dataFormat: DataFormat; + constructor(args: Pooling2DLayerArgs); + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + protected abstract poolingFunction(inputs: Tensor, poolSize: [number, number], strides: [number, number], padding: PaddingMode, dataFormat: DataFormat): Tensor; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + getConfig(): serialization.ConfigDict; +} + +declare interface Pooling2DLayerArgs extends LayerArgs { + /** + * Factors by which to downscale in each dimension [vertical, horizontal]. + * Expects an integer or an array of 2 integers. + * + * For example, `[2, 2]` will halve the input in both spatial dimensions. + * If only one integer is specified, the same window length + * will be used for both dimensions. + */ + poolSize?: number | [number, number]; + /** + * The size of the stride in each dimension of the pooling window. Expects + * an integer or an array of 2 integers. Integer, tuple of 2 integers, or + * None. + * + * If `null`, defaults to `poolSize`. + */ + strides?: number | [number, number]; + /** The padding type to use for the pooling layer. */ + padding?: PaddingMode; + /** The data format to use for the pooling layer. */ + dataFormat?: DataFormat; +} + +/** + * Abstract class for different pooling 3D layers. + */ +declare abstract class Pooling3D extends Layer { + protected readonly poolSize: [number, number, number]; + protected readonly strides: [number, number, number]; + protected readonly padding: PaddingMode; + protected readonly dataFormat: DataFormat; + constructor(args: Pooling3DLayerArgs); + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + protected abstract poolingFunction(inputs: Tensor, poolSize: [number, number, number], strides: [number, number, number], padding: PaddingMode, dataFormat: DataFormat): Tensor; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + getConfig(): serialization.ConfigDict; +} + +declare interface Pooling3DLayerArgs extends LayerArgs { + /** + * Factors by which to downscale in each dimension [depth, height, width]. + * Expects an integer or an array of 3 integers. + * + * For example, `[2, 2, 2]` will halve the input in three dimensions. + * If only one integer is specified, the same window length + * will be used for all dimensions. + */ + poolSize?: number | [number, number, number]; + /** + * The size of the stride in each dimension of the pooling window. Expects + * an integer or an array of 3 integers. Integer, tuple of 3 integers, or + * None. + * + * If `null`, defaults to `poolSize`. + */ + strides?: number | [number, number, number]; + /** The padding type to use for the pooling layer. */ + padding?: PaddingMode; + /** The data format to use for the pooling layer. */ + dataFormat?: DataFormat; +} + +/** + * Computes the precision of the predictions with respect to the labels. + * + * Example: + * ```js + * const x = tf.tensor2d( + * [ + * [0, 0, 0, 1], + * [0, 1, 0, 0], + * [0, 0, 0, 1], + * [1, 0, 0, 0], + * [0, 0, 1, 0] + * ] + * ); + * + * const y = tf.tensor2d( + * [ + * [0, 0, 1, 0], + * [0, 1, 0, 0], + * [0, 0, 0, 1], + * [0, 1, 0, 0], + * [0, 1, 0, 0] + * ] + * ); + * + * const precision = tf.metrics.precision(x, y); + * precision.print(); + * ``` + * + * @param yTrue The ground truth values. Expected to contain only 0-1 values. + * @param yPred The predicted values. Expected to contain only 0-1 values. + * @return Precision Tensor. + * + * @doc {heading: 'Metrics', namespace: 'metrics'} + */ +declare function precision(yTrue: Tensor, yPred: Tensor): Tensor; + +declare class PReLU extends Layer { + /** @nocollapse */ + static className: string; + private readonly alphaInitializer; + private readonly alphaRegularizer; + private readonly alphaConstraint; + private readonly sharedAxes; + private alpha; + readonly DEFAULT_ALPHA_INITIALIZER: InitializerIdentifier; + constructor(args?: PReLULayerArgs); + build(inputShape: Shape | Shape[]): void; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + getConfig(): serialization.ConfigDict; +} + +/** + * Parameterized version of a leaky rectified linear unit. + * + * It follows + * `f(x) = alpha * x for x < 0.` + * `f(x) = x for x >= 0.` + * wherein `alpha` is a trainable weight. + * + * Input shape: + * Arbitrary. Use the configuration `inputShape` when using this layer as the + * first layer in a model. + * + * Output shape: + * Same shape as the input. + * + * @doc { + * heading: 'Layers', + * subheading: 'Advanced Activation', + * namespace: 'layers' + * } + */ +declare function prelu(args?: PReLULayerArgs): PReLU; + +declare interface PReLULayerArgs extends LayerArgs { + /** + * Initializer for the learnable alpha. + */ + alphaInitializer?: Initializer | InitializerIdentifier; + /** + * Regularizer for the learnable alpha. + */ + alphaRegularizer?: Regularizer; + /** + * Constraint for the learnable alpha. + */ + alphaConstraint?: Constraint; + /** + * The axes along which to share learnable parameters for the activation + * function. For example, if the incoming feature maps are from a 2D + * convolution with output shape `[numExamples, height, width, channels]`, + * and you wish to share parameters across space (height and width) so that + * each filter channels has only one set of parameters, set + * `shared_axes: [1, 2]`. + */ + sharedAxes?: number | number[]; +} + +declare function prodImpl(xShape: number[], xDtype: DataType, xVals: TypedArray, reductionAxes: number[]): { + outVals: TypedArray; + outShape: number[]; + outDtype: DataType; +}; + +declare type ProgramUniform = Array<{ + type: string; + data: number[]; +}>; + +/** + * A key-value dict like @see PyJsonDict, but with restricted keys. + * + * This makes it possible to create subtypes that have only the specified + * fields, while requiring that the values are JSON-compatible. + * + * That is in contrast to extending `PyJsonDict`, or using an intersection type + * `Foo & PyJsonDict`. In both of those cases, the fields of Foo are actually + * allowed to be of types that are incompatible with `PyJsonValue`. Worse, the + * index signature of `PyJsonValue` means that *any* key is accepted: eg. + * `const foo: Foo = ...; foo.bogus = 12; const x = foo.bogus` works for both + * reading and assignment, even if `bogus` is not a field of the type `Foo`, + * because the index signature inherited from `PyJsonDict` accepts all strings. + * + * Here, we *both* restrict the keys to known values, *and* guarantee that the + * values associated with those keys are compatible with `PyJsonValue`. + * + * This guarantee is easiest to apply via an additional incantation: + * + * ``` + * export interface Foo extends PyJson { + * a: SomeType; + * b: SomeOtherType; + * } + * ``` + * + * Now instances of `Foo` have *only* the fields `a` and `b`, and furthermore, + * if either the type `SomeType` or `SomeOtherType` is incompatible with + * `PyJsonValue`, the compiler produces a typing error. + */ +declare type PyJson = { + [x in Keys]?: PyJsonValue; +}; + +/** + * An array of values within the JSON-serialized form of a serializable object. + * + * The keys of any nested dicts should be in snake_case (i.e., using Python + * naming conventions) for compatibility with Python Keras. + * + * @see PyJsonDict + */ +declare interface PyJsonArray extends Array { +} + +/** + * A key-value dict within the JSON-serialized form of a serializable object. + * + * Serialization/deserialization uses stringified-JSON as the storage + * representation. Typically this should be used for materialized JSON + * stored on disk or sent/received over the wire. + * + * The keys of this dict and of any nested dicts should be in snake_case (i.e., + * using Python naming conventions) for compatibility with Python Keras. + * + * Internally this is normally converted to a ConfigDict that has CamelCase keys + * (using TypeScript naming conventions) and support for Enums. + */ +declare interface PyJsonDict { + [key: string]: PyJsonValue; +} + +/** + * @license + * Copyright 2018 Google LLC + * + * Use of this source code is governed by an MIT-style + * license that can be found in the LICENSE file or at + * https://opensource.org/licenses/MIT. + * ============================================================================= + */ +/** + * A value within the JSON-serialized form of a serializable object. + * + * The keys of any nested dicts should be in snake_case (i.e., using Python + * naming conventions) for compatibility with Python Keras. + * + * @see PyJsonDict + */ +declare type PyJsonValue = boolean | number | string | null | PyJsonArray | PyJsonDict; + +declare function raggedGatherImpl(paramsNestedSplits: TypedArray[], paramsNestedSplitsShapes: number[][], paramsDenseValues: TypedArray, paramsDenseValuesShape: number[], paramsDenseValuesDType: DataType, indices: TypedArray, indicesShape: number[], outputRaggedRank: number): [TypedArray[], TypedArray, number[]]; + +declare function raggedRangeImpl(starts: TypedArray, startsShape: number[], startsDType: DataType, limits: TypedArray, limitsShape: number[], deltas: TypedArray, deltasShape: number[]): [TypedArray, TypedArray]; + +declare function raggedTensorToTensorImpl(shape: TypedArray, shapesShape: number[], values: TypedArray, valuesShape: number[], valuesDType: DataType, defaultValue: TypedArray, defaultValueShape: number[], rowPartitionValues: TypedArray[], rowPartitionValuesShapes: number[][], rowPartitionTypes: string[]): [number[], TypedArray]; + +/** + * Initializer that generates random values initialized to a normal + * distribution. + * + * @doc {heading: 'Initializers', namespace: 'initializers'} + */ +declare function randomNormal(args: RandomNormalArgs): Initializer; + +declare interface RandomNormalArgs { + /** Mean of the random values to generate. */ + mean?: number; + /** Standard deviation of the random values to generate. */ + stddev?: number; + /** Used to seed the random generator. */ + seed?: number; +} + +/** + * Initializer that generates random values initialized to a uniform + * distribution. + * + * Values will be distributed uniformly between the configured minval and + * maxval. + * + * @doc {heading: 'Initializers', namespace: 'initializers'} + */ +declare function randomUniform(args: RandomUniformArgs): Initializer; + +declare interface RandomUniformArgs { + /** Lower bound of the range of random values to generate. */ + minval?: number; + /** Upper bound of the range of random values to generate. */ + maxval?: number; + /** Used to seed the random generator. */ + seed?: number; +} + +declare function rangeImpl(start: number, stop: number, step: number, dtype: 'float32' | 'int32'): DataTypeMap['float32' | 'int32']; + +/** + * Computes the recall of the predictions with respect to the labels. + * + * Example: + * ```js + * const x = tf.tensor2d( + * [ + * [0, 0, 0, 1], + * [0, 1, 0, 0], + * [0, 0, 0, 1], + * [1, 0, 0, 0], + * [0, 0, 1, 0] + * ] + * ); + * + * const y = tf.tensor2d( + * [ + * [0, 0, 1, 0], + * [0, 1, 0, 0], + * [0, 0, 0, 1], + * [0, 1, 0, 0], + * [0, 1, 0, 0] + * ] + * ); + * + * const recall = tf.metrics.recall(x, y); + * recall.print(); + * ``` + * + * @param yTrue The ground truth values. Expected to contain only 0-1 values. + * @param yPred The predicted values. Expected to contain only 0-1 values. + * @return Recall Tensor. + * + * @doc {heading: 'Metrics', namespace: 'metrics'} + */ +declare function recall(yTrue: Tensor, yPred: Tensor): Tensor; + +export declare function registerCallbackConstructor(verbosityLevel: number, callbackConstructor: BaseCallbackConstructor): void; + +/** + * Register an Op for graph model executor. This allows you to register + * TensorFlow custom op or override existing op. + * + * Here is an example of registering a new MatMul Op. + * ```js + * const customMatmul = (node) => + * tf.matMul( + * node.inputs[0], node.inputs[1], + * node.attrs['transpose_a'], node.attrs['transpose_b']); + * + * tf.registerOp('MatMul', customMatmul); + * ``` + * The inputs and attrs of the node object are based on the TensorFlow op + * registry. + * + * @param name The Tensorflow Op name. + * @param opFunc An op function which is called with the current graph node + * during execution and needs to return a tensor or a list of tensors. The node + * has the following attributes: + * - attr: A map from attribute name to its value + * - inputs: A list of input tensors + * + * @doc {heading: 'Models', subheading: 'Op Registry'} + */ +export declare function registerOp(name: string, opFunc: OpExecutor): void; + +/** + * Regularizer base class. + */ +declare abstract class Regularizer extends serialization.Serializable { + abstract apply(x: Tensor): Scalar; +} + +/** + * Type for a regularizer function. + */ +declare type RegularizerFn = () => Scalar; + +/** @docinline */ +declare type RegularizerIdentifier = 'l1l2' | string; + +declare namespace regularizers { + export { + l1l2, + l1, + l2 + } +} +export { regularizers } + +declare class ReLU extends Layer { + /** @nocollapse */ + static className: string; + maxValue: number; + constructor(args?: ReLULayerArgs); + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + getConfig(): serialization.ConfigDict; +} + +/** + * Rectified Linear Unit activation function. + * + * Input shape: + * Arbitrary. Use the config field `inputShape` (Array of integers, does + * not include the sample axis) when using this layer as the first layer + * in a model. + * + * Output shape: + * Same shape as the input. + * + * @doc { + * heading: 'Layers', + * subheading: 'Advanced Activation', + * namespace: 'layers' + * } + */ +declare function reLU(args?: ReLULayerArgs): ReLU; + +declare interface ReLULayerArgs extends LayerArgs { + /** + * Float, the maximum output value. + */ + maxValue?: number; +} + +declare class RepeatVector extends Layer { + /** @nocollapse */ + static className: string; + readonly n: number; + constructor(args: RepeatVectorLayerArgs); + computeOutputShape(inputShape: Shape): Shape; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + getConfig(): serialization.ConfigDict; +} + +/** + * Repeats the input n times in a new dimension. + * + * ```js + * const model = tf.sequential(); + * model.add(tf.layers.repeatVector({n: 4, inputShape: [2]})); + * const x = tf.tensor2d([[10, 20]]); + * // Use the model to do inference on a data point the model hasn't see + * model.predict(x).print(); + * // output shape is now [batch, 2, 4] + * ``` + * + * @doc {heading: 'Layers', subheading: 'Basic', namespace: 'layers'} + */ +declare function repeatVector(args: RepeatVectorLayerArgs): RepeatVector; + +declare interface RepeatVectorLayerArgs extends LayerArgs { + /** + * The integer number of times to repeat the input. + */ + n: number; +} + +/** + * Preprocessing Rescaling Layer + * + * This rescales images by a scaling and offset factor + */ +declare class Rescaling extends Layer { + /** @nocollapse */ + static className: string; + private readonly scale; + private readonly offset; + constructor(args: RescalingArgs); + getConfig(): serialization.ConfigDict; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor[] | Tensor; +} + +/** + * A preprocessing layer which rescales input values to a new range. + * + * This layer rescales every value of an input (often an image) by multiplying + * by `scale` and adding `offset`. + * + * For instance: + * 1. To rescale an input in the ``[0, 255]`` range + * to be in the `[0, 1]` range, you would pass `scale=1/255`. + * 2. To rescale an input in the ``[0, 255]`` range to be in the `[-1, 1]` + * range, you would pass `scale=1./127.5, offset=-1`. + * The rescaling is applied both during training and inference. Inputs can be + * of integer or floating point dtype, and by default the layer will output + * floats. + * + * Arguments: + * - `scale`: Float, the scale to apply to the inputs. + * - `offset`: Float, the offset to apply to the inputs. + * + * Input shape: + * Arbitrary. + * + * Output shape: + * Same as input. + * + * @doc {heading: 'Layers', subheading: 'Rescaling', namespace: 'layers'} + */ +declare function rescaling(args?: RescalingArgs): Rescaling; + +declare interface RescalingArgs extends LayerArgs { + scale: number; + offset?: number; +} + +declare function resetMaxTexturesInShader(): void; + +declare function resetMaxTextureSize(): void; + +declare class Reshape extends Layer { + /** @nocollapse */ + static className: string; + private targetShape; + constructor(args: ReshapeLayerArgs); + private isUnknown; + /** + * Finds and replaces a missing dimension in output shape. + * + * This is a near direct port of the internal Numpy function + * `_fix_unknown_dimension` in `numpy/core/src/multiarray/shape.c`. + * + * @param inputShape: Original shape of array begin reshape. + * @param outputShape: Target shape of the array, with at most a single + * `null` or negative number, which indicates an underdetermined dimension + * that should be derived from `inputShape` and the known dimensions of + * `outputShape`. + * @returns: The output shape with `null` replaced with its computed value. + * @throws: ValueError: If `inputShape` and `outputShape` do not match. + */ + private fixUnknownDimension; + computeOutputShape(inputShape: Shape): Shape; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + getConfig(): serialization.ConfigDict; +} + +/** + * Reshapes an input to a certain shape. + * + * ```js + * const input = tf.input({shape: [4, 3]}); + * const reshapeLayer = tf.layers.reshape({targetShape: [2, 6]}); + * // Inspect the inferred output shape of the Reshape layer, which + * // equals `[null, 2, 6]`. (The 1st dimension is the undermined batch size.) + * console.log(JSON.stringify(reshapeLayer.apply(input).shape)); + * ``` + * + * Input shape: + * Arbitrary, although all dimensions in the input shape must be fixed. + * Use the configuration `inputShape` when using this layer as the + * first layer in a model. + * + * + * Output shape: + * [batchSize, targetShape[0], targetShape[1], ..., + * targetShape[targetShape.length - 1]]. + * + * @doc {heading: 'Layers', subheading: 'Basic', namespace: 'layers'} + */ +declare function reshape(args: ReshapeLayerArgs): Reshape; + +declare interface ReshapeLayerArgs extends LayerArgs { + /** The target shape. Does not include the batch axis. */ + targetShape: Shape; +} + +/** + * Preprocessing Resizing Layer + * + * This resizes images by a scaling and offset factor + */ +declare class Resizing extends Layer { + /** @nocollapse */ + static className: string; + private readonly height; + private readonly width; + private readonly interpolation; + private readonly cropToAspectRatio; + constructor(args: ResizingArgs); + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + getConfig(): serialization.ConfigDict; + call(inputs: Tensor | Tensor, kwargs: Kwargs): Tensor[] | Tensor; +} + +/** + * A preprocessing layer which resizes images. + * This layer resizes an image input to a target height and width. The input + * should be a 4D (batched) or 3D (unbatched) tensor in `"channels_last"` + * format. Input pixel values can be of any range (e.g. `[0., 1.)` or `[0, + * 255]`) and of interger or floating point dtype. By default, the layer will + * output floats. + * + * Arguments: + * - `height`: number, the height for the output tensor. + * - `width`: number, the width for the output tensor. + * - `interpolation`: string, the method for image resizing interpolation. + * - `cropToAspectRatio`: boolean, whether to keep image aspect ratio. + * + * Input shape: + * Arbitrary. + * + * Output shape: + * height, width, num channels. + * + * @doc {heading: 'Layers', subheading: 'Resizing', namespace: 'layers'} + */ +declare function resizing(args?: ResizingArgs): Resizing; + +declare interface ResizingArgs extends LayerArgs { + height: number; + width: number; + interpolation?: InterpolationType; + cropToAspectRatio?: boolean; +} + +declare type RMSPropOptimizerConfig = { + learning_rate: number; + decay?: number; + momentum?: number; + epsilon?: number; + centered?: boolean; +}; + +declare type RMSPropSerialization = BaseSerialization<'RMSProp', RMSPropOptimizerConfig>; + +export declare class RNN extends Layer { + /** @nocollapse */ + static className: string; + readonly cell: RNNCell; + readonly returnSequences: boolean; + readonly returnState: boolean; + readonly goBackwards: boolean; + readonly unroll: boolean; + stateSpec: InputSpec[]; + protected states_: Tensor[]; + protected keptStates: Tensor[][]; + private numConstants; + constructor(args: RNNLayerArgs); + getStates(): Tensor[]; + setStates(states: Tensor[]): void; + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + computeMask(inputs: Tensor | Tensor[], mask?: Tensor | Tensor[]): Tensor | Tensor[]; + /** + * Get the current state tensors of the RNN. + * + * If the state hasn't been set, return an array of `null`s of the correct + * length. + */ + get states(): Tensor[]; + set states(s: Tensor[]); + build(inputShape: Shape | Shape[]): void; + /** + * Reset the state tensors of the RNN. + * + * If the `states` argument is `undefined` or `null`, will set the + * state tensor(s) of the RNN to all-zero tensors of the appropriate + * shape(s). + * + * If `states` is provided, will set the state tensors of the RNN to its + * value. + * + * @param states Optional externally-provided initial states. + * @param training Whether this call is done during training. For stateful + * RNNs, this affects whether the old states are kept or discarded. In + * particular, if `training` is `true`, the old states will be kept so + * that subsequent backpropgataion through time (BPTT) may work properly. + * Else, the old states will be discarded. + */ + resetStates(states?: Tensor | Tensor[], training?: boolean): void; + apply(inputs: Tensor | Tensor[] | SymbolicTensor | SymbolicTensor[], kwargs?: Kwargs): Tensor | Tensor[] | SymbolicTensor | SymbolicTensor[]; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + getInitialState(inputs: Tensor): Tensor[]; + get trainableWeights(): LayerVariable[]; + get nonTrainableWeights(): LayerVariable[]; + setFastWeightInitDuringBuild(value: boolean): void; + getConfig(): serialization.ConfigDict; + /** @nocollapse */ + static fromConfig(cls: serialization.SerializableConstructor, config: serialization.ConfigDict, customObjects?: serialization.ConfigDict): T; +} + +/** + * Base class for recurrent layers. + * + * Input shape: + * 3D tensor with shape `[batchSize, timeSteps, inputDim]`. + * + * Output shape: + * - if `returnState`, an Array of tensors (i.e., `tf.Tensor`s). The first + * tensor is the output. The remaining tensors are the states at the + * last time step, each with shape `[batchSize, units]`. + * - if `returnSequences`, the output will have shape + * `[batchSize, timeSteps, units]`. + * - else, the output will have shape `[batchSize, units]`. + * + * Masking: + * This layer supports masking for input data with a variable number + * of timesteps. To introduce masks to your data, + * use an embedding layer with the `mask_zero` parameter + * set to `True`. + * + * Notes on using statefulness in RNNs: + * You can set RNN layers to be 'stateful', which means that the states + * computed for the samples in one batch will be reused as initial states + * for the samples in the next batch. This assumes a one-to-one mapping + * between samples in different successive batches. + * + * To enable statefulness: + * - specify `stateful: true` in the layer constructor. + * - specify a fixed batch size for your model, by passing + * if sequential model: + * `batchInputShape=[...]` to the first layer in your model. + * else for functional model with 1 or more Input layers: + * `batchShape=[...]` to all the first layers in your model. + * This is the expected shape of your inputs *including the batch size*. + * It should be a tuple of integers, e.g. `(32, 10, 100)`. + * - specify `shuffle=False` when calling fit(). + * + * To reset the states of your model, call `.resetStates()` on either + * a specific layer, or on your entire model. + * + * Note on specifying the initial state of RNNs + * You can specify the initial state of RNN layers symbolically by + * calling them with the option `initialState`. The value of + * `initialState` should be a tensor or list of tensors representing + * the initial state of the RNN layer. + * + * You can specify the initial state of RNN layers numerically by + * calling `resetStates` with the keyword argument `states`. The value of + * `states` should be a numpy array or list of numpy arrays representing + * the initial state of the RNN layer. + * + * Note on passing external constants to RNNs + * You can pass "external" constants to the cell using the `constants` + * keyword argument of `RNN.call` method. This requires that the `cell.call` + * method accepts the same keyword argument `constants`. Such constants + * can be used to condition the cell transformation on additional static + * inputs (not changing over time), a.k.a. an attention mechanism. + * + * @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'} + */ +declare function rnn(args: RNNLayerArgs): RNN; + +/** + * An RNNCell layer. + * + * @doc {heading: 'Layers', subheading: 'Classes'} + */ +declare abstract class RNNCell extends Layer { + /** + * Size(s) of the states. + * For RNN cells with only a single state, this is a single integer. + */ + abstract stateSize: number | number[]; + dropoutMask: Tensor | Tensor[]; + recurrentDropoutMask: Tensor | Tensor[]; +} + +/** + * RNNLayerConfig is identical to BaseRNNLayerConfig, except it makes the + * `cell` property required. This interface is to be used with constructors + * of concrete RNN layer subtypes. + */ +export declare interface RNNLayerArgs extends BaseRNNLayerArgs { + cell: RNNCell | RNNCell[]; +} + +declare const rsqrtImpl: SimpleUnaryImpl; + +/** @docinline */ +declare type SampleWeightMode = 'temporal'; + +declare function scatterImpl(indices: TensorBuffer, updates: TensorBuffer, shape: number[], outputSize: number, sliceSize: number, numUpdates: number, sliceRank: number, strides: number[], defaultValue: DefaultValueTypeMap[D], sumDupeIndices: boolean): TensorBuffer; + +declare interface SeedOnlyInitializerArgs { + /** Random number generator seed. */ + seed?: number; +} + +declare class SeparableConv extends Conv { + /** @nocollapse */ + static className: string; + readonly depthMultiplier: number; + protected readonly depthwiseInitializer?: Initializer; + protected readonly depthwiseRegularizer?: Regularizer; + protected readonly depthwiseConstraint?: Constraint; + protected readonly pointwiseInitializer?: Initializer; + protected readonly pointwiseRegularizer?: Regularizer; + protected readonly pointwiseConstraint?: Constraint; + readonly DEFAULT_DEPTHWISE_INITIALIZER: InitializerIdentifier; + readonly DEFAULT_POINTWISE_INITIALIZER: InitializerIdentifier; + protected depthwiseKernel: LayerVariable; + protected pointwiseKernel: LayerVariable; + constructor(rank: number, config?: SeparableConvLayerArgs); + build(inputShape: Shape | Shape[]): void; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + getConfig(): serialization.ConfigDict; +} + +declare class SeparableConv2D extends SeparableConv { + /** @nocollapse */ + static className: string; + constructor(args?: SeparableConvLayerArgs); +} + +/** + * Depthwise separable 2D convolution. + * + * Separable convolution consists of first performing + * a depthwise spatial convolution + * (which acts on each input channel separately) + * followed by a pointwise convolution which mixes together the resulting + * output channels. The `depthMultiplier` argument controls how many + * output channels are generated per input channel in the depthwise step. + * + * Intuitively, separable convolutions can be understood as + * a way to factorize a convolution kernel into two smaller kernels, + * or as an extreme version of an Inception block. + * + * Input shape: + * 4D tensor with shape: + * `[batch, channels, rows, cols]` if data_format='channelsFirst' + * or 4D tensor with shape: + * `[batch, rows, cols, channels]` if data_format='channelsLast'. + * + * Output shape: + * 4D tensor with shape: + * `[batch, filters, newRows, newCols]` if data_format='channelsFirst' + * or 4D tensor with shape: + * `[batch, newRows, newCols, filters]` if data_format='channelsLast'. + * `rows` and `cols` values might have changed due to padding. + * + * @doc {heading: 'Layers', subheading: 'Convolutional', namespace: 'layers'} + */ +declare function separableConv2d(args: SeparableConvLayerArgs): SeparableConv2D; + +declare interface SeparableConvLayerArgs extends ConvLayerArgs { + /** + * The number of depthwise convolution output channels for each input + * channel. + * The total number of depthwise convolution output channels will be equal + * to `filtersIn * depthMultiplier`. Default: 1. + */ + depthMultiplier?: number; + /** + * Initializer for the depthwise kernel matrix. + */ + depthwiseInitializer?: InitializerIdentifier | Initializer; + /** + * Initializer for the pointwise kernel matrix. + */ + pointwiseInitializer?: InitializerIdentifier | Initializer; + /** + * Regularizer function applied to the depthwise kernel matrix. + */ + depthwiseRegularizer?: RegularizerIdentifier | Regularizer; + /** + * Regularizer function applied to the pointwise kernel matrix. + */ + pointwiseRegularizer?: RegularizerIdentifier | Regularizer; + /** + * Constraint function applied to the depthwise kernel matrix. + */ + depthwiseConstraint?: ConstraintIdentifier | Constraint; + /** + * Constraint function applied to the pointwise kernel matrix. + */ + pointwiseConstraint?: ConstraintIdentifier | Constraint; +} + +/** + * A model with a stack of layers, feeding linearly from one to the next. + * + * `tf.sequential` is a factory function that creates an instance of + * `tf.Sequential`. + * + * ```js + * // Define a model for linear regression. + * const model = tf.sequential(); + * model.add(tf.layers.dense({units: 1, inputShape: [1]})); + * + * // Prepare the model for training: Specify the loss and the optimizer. + * model.compile({loss: 'meanSquaredError', optimizer: 'sgd'}); + * + * // Generate some synthetic data for training. + * const xs = tf.tensor2d([1, 2, 3, 4], [4, 1]); + * const ys = tf.tensor2d([1, 3, 5, 7], [4, 1]); + * + * // Train the model using the data then do inference on a data point the + * // model hasn't seen: + * await model.fit(xs, ys); + * model.predict(tf.tensor2d([5], [1, 1])).print(); + * ``` + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ +export declare class Sequential extends LayersModel { + /** @nocollapse */ + static className: string; + private model; + constructor(args?: SequentialArgs); + private checkShape; + /** + * Adds a layer instance on top of the layer stack. + * + * ```js + * const model = tf.sequential(); + * model.add(tf.layers.dense({units: 8, inputShape: [1]})); + * model.add(tf.layers.dense({units: 4, activation: 'relu6'})); + * model.add(tf.layers.dense({units: 1, activation: 'relu6'})); + * // Note that the untrained model is random at this point. + * model.predict(tf.randomNormal([10, 1])).print(); + * ``` + * @param layer Layer instance. + * + * @exception ValueError In case the `layer` argument does not know its + * input shape. + * @exception ValueError In case the `layer` argument has multiple output + * tensors, or is already connected somewhere else (forbidden in + * `Sequential` models). + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ + add(layer: Layer): void; + /** + * Removes the last layer in the model. + * + * @exception TypeError if there are no layers in the model. + */ + pop(): void; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + build(inputShape?: Shape | Shape[]): void; + countParams(): number; + /** + * Print a text summary of the Sequential model's layers. + * + * The summary includes + * - Name and type of all layers that comprise the model. + * - Output shape(s) of the layers + * - Number of weight parameters of each layer + * - The total number of trainable and non-trainable parameters of the + * model. + * + * ```js + * const model = tf.sequential(); + * model.add( + * tf.layers.dense({units: 100, inputShape: [10], activation: 'relu'})); + * model.add(tf.layers.dense({units: 1, activation: 'sigmoid'})); + * + * model.summary(); + * ``` + * + * @param lineLength Custom line length, in number of characters. + * @param positions Custom widths of each of the columns, as either + * fractions of `lineLength` (e.g., `[0.5, 0.75, 1]`) or absolute number + * of characters (e.g., `[30, 50, 65]`). Each number corresponds to + * right-most (i.e., ending) position of a column. + * @param printFn Custom print function. Can be used to replace the default + * `console.log`. For example, you can use `x => {}` to mute the printed + * messages in the console. + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ + summary(lineLength?: number, positions?: number[], printFn?: (message?: any, ...optionalParams: any[]) => void): void; + /** + * Sets the weights of the model. + * + * @param weights Should be a list of Tensors with shapes and types matching + * the output of `model.getWeights()`. + */ + setWeights(weights: Tensor[]): void; + /** + * Returns the loss value & metrics values for the model in test mode. + * + * Loss and metrics are specified during `compile()`, which needs to happen + * before calls to `evaluate()`. + * + * Computation is done in batches. + * + * ```js + * const model = tf.sequential({ + * layers: [tf.layers.dense({units: 1, inputShape: [10]})] + * }); + * model.compile({optimizer: 'sgd', loss: 'meanSquaredError'}); + * const result = model.evaluate(tf.ones([8, 10]), tf.ones([8, 1]), { + * batchSize: 4, + * }); + * result.print(); + * ``` + * + * @param x `tf.Tensor` of test data, or an `Array` of `tf.Tensor`s if the + * model has multiple inputs. + * @param y `tf.Tensor` of target data, or an `Array` of `tf.Tensor`s if the + * model has multiple outputs. + * @param args A `ModelEvaluateConfig`, containing optional fields. + * + * @return `Scalar` test loss (if the model has a single output and no + * metrics) or `Array` of `Scalar`s (if the model has multiple outputs + * and/or metrics). The attribute `model.metricsNames` + * will give you the display labels for the scalar outputs. + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ + evaluate(x: Tensor | Tensor[], y: Tensor | Tensor[], args?: ModelEvaluateArgs): Scalar | Scalar[]; + /** + * Evaluate model using a dataset object. + * + * Note: Unlike `evaluate()`, this method is asynchronous (`async`). + * + * @param dataset A dataset object. Its `iterator()` method is expected + * to generate a dataset iterator object, the `next()` method of which + * is expected to produce data batches for evaluation. The return value + * of the `next()` call ought to contain a boolean `done` field and a + * `value` field. The `value` field is expected to be an array of two + * `tf.Tensor`s or an array of two nested `tf.Tensor` structures. The former + * case is for models with exactly one input and one output (e.g. + * a sequential model). The latter case is for models with multiple + * inputs and/or multiple outputs. Of the two items in the array, the + * first is the input feature(s) and the second is the output target(s). + * @param args A configuration object for the dataset-based evaluation. + * @returns Loss and metric values as an Array of `Scalar` objects. + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ + evaluateDataset(dataset: Dataset<{}>, args: ModelEvaluateDatasetArgs): Promise; + /** + * Generates output predictions for the input samples. + * + * Computation is done in batches. + * + * Note: the "step" mode of predict() is currently not supported. + * This is because the TensorFlow.js core backend is imperative only. + * + * ```js + * const model = tf.sequential({ + * layers: [tf.layers.dense({units: 1, inputShape: [10]})] + * }); + * model.predict(tf.ones([2, 10])).print(); + * ``` + * + * @param x The input data, as a Tensor, or an `Array` of `tf.Tensor`s if + * the model has multiple inputs. + * @param conifg A `ModelPredictConfig` object containing optional fields. + * + * @return `tf.Tensor`(s) of predictions. + * + * @exception ValueError In case of mismatch between the provided input data + * and the model's expectations, or in case a stateful model receives a + * number of samples that is not a multiple of the batch size. + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ + predict(x: Tensor | Tensor[], args?: ModelPredictArgs): Tensor | Tensor[]; + /** + * Returns predictions for a single batch of samples. + * + * @param x: Input samples, as a Tensor, or list of Tensors (if the model + * has multiple inputs). + * @return Tensor(s) of predictions + */ + predictOnBatch(x: Tensor): Tensor | Tensor[]; + /** + * See `LayersModel.compile`. + * + * @param args + */ + compile(args: ModelCompileArgs): void; + get optimizer(): Optimizer; + set optimizer(optimizer: Optimizer); + /** + * Trains the model for a fixed number of epochs (iterations on a dataset). + * + * ```js + * const model = tf.sequential({ + * layers: [tf.layers.dense({units: 1, inputShape: [10]})] + * }); + * model.compile({optimizer: 'sgd', loss: 'meanSquaredError'}); + * const history = await model.fit(tf.ones([8, 10]), tf.ones([8, 1]), { + * batchSize: 4, + * epochs: 3 + * }); + * console.log(history.history.loss[0]); + * ``` + * + * @param x `tf.Tensor` of training data, or an array of `tf.Tensor`s if the + * model has multiple inputs. If all inputs in the model are named, you can + * also pass a dictionary mapping input names to `tf.Tensor`s. + * @param y `tf.Tensor` of target (label) data, or an array of `tf.Tensor`s if + * the model has multiple outputs. If all outputs in the model are named, you + * can also pass a dictionary mapping output names to `tf.Tensor`s. + * @param args A `ModelFitConfig`, containing optional fields. + * + * @return A `History` instance. Its `history` attribute contains all + * information collected during training. + * + * @exception ValueError In case of mismatch between the provided input data + * and what the model expects. + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ + fit(x: Tensor | Tensor[] | { + [inputName: string]: Tensor; + }, y: Tensor | Tensor[] | { + [inputName: string]: Tensor; + }, args?: ModelFitArgs): Promise; + /** + * Trains the model using a dataset object. + * + * ```js + * const xArray = [ + * [1, 1, 1, 1, 1, 1, 1, 1, 1], + * [1, 1, 1, 1, 1, 1, 1, 1, 1], + * [1, 1, 1, 1, 1, 1, 1, 1, 1], + * [1, 1, 1, 1, 1, 1, 1, 1, 1], + * ]; + * const yArray = [1, 1, 1, 1]; + * // Create a dataset from the JavaScript array. + * const xDataset = tf.data.array(xArray); + * const yDataset = tf.data.array(yArray); + * // Zip combines the `x` and `y` Datasets into a single Dataset, the + * // iterator of which will return an object containing of two tensors, + * // corresponding to `x` and `y`. The call to `batch(4)` will bundle + * // four such samples into a single object, with the same keys now pointing + * // to tensors that hold 4 examples, organized along the batch dimension. + * // The call to `shuffle(4)` causes each iteration through the dataset to + * // happen in a different order. The size of the shuffle window is 4. + * const xyDataset = tf.data.zip({xs: xDataset, ys: yDataset}) + * .batch(4) + * .shuffle(4); + * const model = tf.sequential({ + * layers: [tf.layers.dense({units: 1, inputShape: [9]})] + * }); + * model.compile({optimizer: 'sgd', loss: 'meanSquaredError'}); + * const history = await model.fitDataset(xyDataset, { + * epochs: 4, + * callbacks: {onEpochEnd: (epoch, logs) => console.log(logs.loss)} + * }); + * ``` + * + * @param dataset A dataset object. Its `iterator()` method is expected to + * generate a dataset iterator object, the `next()` method of which is + * expected to produce data batches for evaluation. The return value of the + * `next()` call ought to contain a boolean `done` field and a `value` + * field. + * + * The `value` field is expected to be an object of with fields + * `xs` and `ys`, which point to the feature tensor and the target tensor, + * respectively. This case is for models with exactly one input and one + * output (e.g. a sequential model). For example: + * ```js + * {value: {xs: xsTensor, ys: ysTensor}, done: false} + * ``` + * + * If the model has multiple inputs, the `xs` field of `value` should + * be an object mapping input names to their respective feature tensors. + * For example: + * ```js + * { + * value: { + * xs: { + * input_1: xsTensor1, + * input_2: xsTensor2 + * }, + * ys: ysTensor + * }, + * done: false + * } + * ``` + * If the model has multiple outputs, the `ys` field of `value` should + * be an object mapping output names to their respective target tensors. + * For example: + * ```js + * { + * value: { + * xs: xsTensor, + * ys: { + * output_1: ysTensor1, + * output_2: ysTensor2 + * }, + * }, + * done: false + * } + * ``` + * @param args A `ModelFitDatasetArgs`, containing optional fields. + * + * @return A `History` instance. Its `history` attribute contains all + * information collected during training. + * + * @doc {heading: 'Models', subheading: 'Classes', ignoreCI: true} + */ + fitDataset(dataset: Dataset, args: ModelFitDatasetArgs): Promise; + /** + * Runs a single gradient update on a single batch of data. + * + * This method differs from `fit()` and `fitDataset()` in the following + * regards: + * - It operates on exactly one batch of data. + * - It returns only the loss and metric values, instead of + * returning the batch-by-batch loss and metric values. + * - It doesn't support fine-grained options such as verbosity and + * callbacks. + * + * @param x Input data. It could be one of the following: + * - A `tf.Tensor`, or an Array of `tf.Tensor`s (in case the model has + * multiple inputs). + * - An Object mapping input names to corresponding `tf.Tensor` (if the + * model has named inputs). + * @param y Target data. It could be either a `tf.Tensor` or multiple + * `tf.Tensor`s. It should be consistent with `x`. + * @returns Training loss or losses (in case the model has + * multiple outputs), along with metrics (if any), as numbers. + * + * @doc {heading: 'Models', subheading: 'Classes'} + */ + trainOnBatch(x: Tensor | Tensor[] | { + [inputName: string]: Tensor; + }, y: Tensor | Tensor[] | { + [inputName: string]: Tensor; + }): Promise; + /** @nocollapse */ + static fromConfig(cls: serialization.SerializableConstructor, config: serialization.ConfigDict, customObjects?: serialization.ConfigDict, fastWeightInit?: boolean): T; + /** + * Setter used for force stopping of LayersModel.fit() (i.e., training). + * + * Example: + * + * ```js + * const model = tf.sequential(); + * model.add(tf.layers.dense({units: 1, inputShape: [10]})); + * model.compile({loss: 'meanSquaredError', optimizer: 'sgd'}); + * const xs = tf.ones([8, 10]); + * const ys = tf.zeros([8, 1]); + * + * const history = await model.fit(xs, ys, { + * epochs: 10, + * callbacks: { + * onEpochEnd: async (epoch, logs) => { + * if (epoch === 2) { + * model.stopTraining = true; + * } + * } + * } + * }); + * + * // There should be only 3 values in the loss array, instead of 10 values, + * // due to the stopping after 3 epochs. + * console.log(history.history.loss); + * ``` + */ + set stopTraining(stop: boolean); + get stopTraining(): boolean; + getConfig(): any; +} + +/** + * Creates a `tf.Sequential` model. A sequential model is any model where the + * outputs of one layer are the inputs to the next layer, i.e. the model + * topology is a simple 'stack' of layers, with no branching or skipping. + * + * This means that the first layer passed to a `tf.Sequential` model should have + * a defined input shape. What that means is that it should have received an + * `inputShape` or `batchInputShape` argument, or for some type of layers + * (recurrent, Dense...) an `inputDim` argument. + * + * The key difference between `tf.model` and `tf.sequential` is that + * `tf.sequential` is less generic, supporting only a linear stack of layers. + * `tf.model` is more generic and supports an arbitrary graph (without + * cycles) of layers. + * + * Examples: + * + * ```js + * const model = tf.sequential(); + * + * // First layer must have an input shape defined. + * model.add(tf.layers.dense({units: 32, inputShape: [50]})); + * // Afterwards, TF.js does automatic shape inference. + * model.add(tf.layers.dense({units: 4})); + * + * // Inspect the inferred shape of the model's output, which equals + * // `[null, 4]`. The 1st dimension is the undetermined batch dimension; the + * // 2nd is the output size of the model's last layer. + * console.log(JSON.stringify(model.outputs[0].shape)); + * ``` + * + * It is also possible to specify a batch size (with potentially undetermined + * batch dimension, denoted by "null") for the first layer using the + * `batchInputShape` key. The following example is equivalent to the above: + * + * ```js + * const model = tf.sequential(); + * + * // First layer must have a defined input shape + * model.add(tf.layers.dense({units: 32, batchInputShape: [null, 50]})); + * // Afterwards, TF.js does automatic shape inference. + * model.add(tf.layers.dense({units: 4})); + * + * // Inspect the inferred shape of the model's output. + * console.log(JSON.stringify(model.outputs[0].shape)); + * ``` + * + * You can also use an `Array` of already-constructed `Layer`s to create + * a `tf.Sequential` model: + * + * ```js + * const model = tf.sequential({ + * layers: [tf.layers.dense({units: 32, inputShape: [50]}), + * tf.layers.dense({units: 4})] + * }); + * console.log(JSON.stringify(model.outputs[0].shape)); + * ``` + * + * @doc {heading: 'Models', subheading: 'Creation'} + */ +export declare function sequential(config?: SequentialArgs): Sequential; + +/** + * Configuration for a Sequential model. + */ +export declare interface SequentialArgs { + /** Stack of layers for the model. */ + layers?: Layer[]; + /** The name of this model. */ + name?: string; +} + +/** + * Sets the number of threads that will be used by XNNPACK to create + * threadpool (default to the number of logical CPU cores). + * + * This must be called before calling `tf.setBackend('wasm')`. + */ +export declare function setThreadsCount(numThreads: number): void; + +/** + * @deprecated Use `setWasmPaths` instead. + * Sets the path to the `.wasm` file which will be fetched when the wasm + * backend is initialized. See + * https://github.com/tensorflow/tfjs/blob/master/tfjs-backend-wasm/README.md#using-bundlers + * for more details. + * @param path wasm file path or url + * @param usePlatformFetch optional boolean to use platform fetch to download + * the wasm file, default to false. + * + * @doc {heading: 'Environment', namespace: 'wasm'} + */ +export declare function setWasmPath(path: string, usePlatformFetch?: boolean): void; + +/** + * Configures the locations of the WASM binaries. + * + * ```js + * setWasmPaths({ + * 'tfjs-backend-wasm.wasm': 'renamed.wasm', + * 'tfjs-backend-wasm-simd.wasm': 'renamed-simd.wasm', + * 'tfjs-backend-wasm-threaded-simd.wasm': 'renamed-threaded-simd.wasm' + * }); + * tf.setBackend('wasm'); + * ``` + * + * @param prefixOrFileMap This can be either a string or object: + * - (string) The path to the directory where the WASM binaries are located. + * Note that this prefix will be used to load each binary (vanilla, + * SIMD-enabled, threading-enabled, etc.). + * - (object) Mapping from names of WASM binaries to custom + * full paths specifying the locations of those binaries. This is useful if + * your WASM binaries are not all located in the same directory, or if your + * WASM binaries have been renamed. + * @param usePlatformFetch optional boolean to use platform fetch to download + * the wasm file, default to false. + * + * @doc {heading: 'Environment', namespace: 'wasm'} + */ +export declare function setWasmPaths(prefixOrFileMap: string | { + [key in WasmBinaryName]?: string; +}, usePlatformFetch?: boolean): void; + +export declare function setWebGLContext(webGLVersion: number, gl: WebGLRenderingContext): void; + +declare type SGDOptimizerConfig = { + learning_rate: number; +}; + +declare type SGDSerialization = BaseSerialization<'SGD', SGDOptimizerConfig>; + +/** + * @license + * Copyright 2018 Google LLC + * + * Use of this source code is governed by an MIT-style + * license that can be found in the LICENSE file or at + * https://opensource.org/licenses/MIT. + * ============================================================================= + */ +/** @docalias (null | number)[] */ +export declare type Shape = Array; + +declare namespace shared { + export { + simpleAbsImpl, + addImpl, + bincountImpl, + bincountReduceImpl, + castImpl, + ceilImpl, + concatImpl, + equalImpl, + expImpl, + expm1Impl, + floorImpl, + gatherNdImpl, + gatherV2Impl, + greaterImpl, + greaterEqualImpl, + lessImpl, + lessEqualImpl, + linSpaceImpl, + logImpl, + maxImpl, + maximumImpl, + minimumImpl, + multiplyImpl, + negImpl, + notEqualImpl, + prodImpl, + raggedGatherImpl, + raggedRangeImpl, + raggedTensorToTensorImpl, + rangeImpl, + rsqrtImpl, + scatterImpl, + sigmoidImpl, + sliceImpl, + sparseFillEmptyRowsImpl, + sparseReshapeImpl, + sparseSegmentReductionImpl, + sqrtImpl, + squaredDifferenceImpl, + stridedSliceImpl, + stringNGramsImpl, + stringSplitImpl, + stringToHashBucketFastImpl, + subImpl, + tileImpl, + topKImpl, + transposeImpl, + uniqueImpl, + ComplexBinaryKernelImpl, + SimpleBinaryKernelImpl + } +} +export { shared } + +declare const sigmoidImpl: SimpleUnaryImpl; + +declare function simpleAbsImpl(vals: TypedArray): Float32Array; + +declare type SimpleBinaryKernelImpl = (aShape: number[], bShape: number[], aVals: TypedArray | string[], bVals: TypedArray | string[], dtype: DataType) => [TypedArray, number[]]; + +declare class SimpleRNN extends RNN { + /** @nocollapse */ + static className: string; + constructor(args: SimpleRNNLayerArgs); + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + /** @nocollapse */ + static fromConfig(cls: serialization.SerializableConstructor, config: serialization.ConfigDict): T; +} + +/** + * Fully-connected RNN where the output is to be fed back to input. + * + * This is an `RNN` layer consisting of one `SimpleRNNCell`. However, unlike + * the underlying `SimpleRNNCell`, the `apply` method of `SimpleRNN` operates + * on a sequence of inputs. The shape of the input (not including the first, + * batch dimension) needs to be at least 2-D, with the first dimension being + * time steps. For example: + * + * ```js + * const rnn = tf.layers.simpleRNN({units: 8, returnSequences: true}); + * + * // Create an input with 10 time steps. + * const input = tf.input({shape: [10, 20]}); + * const output = rnn.apply(input); + * + * console.log(JSON.stringify(output.shape)); + * // [null, 10, 8]: 1st dimension is unknown batch size; 2nd dimension is the + * // same as the sequence length of `input`, due to `returnSequences`: `true`; + * // 3rd dimension is the `SimpleRNNCell`'s number of units. + * ``` + * + * @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'} + */ +declare function simpleRNN(args: SimpleRNNLayerArgs): SimpleRNN; + +declare class SimpleRNNCell extends RNNCell { + /** @nocollapse */ + static className: string; + readonly units: number; + readonly activation: Activation; + readonly useBias: boolean; + readonly kernelInitializer: Initializer; + readonly recurrentInitializer: Initializer; + readonly biasInitializer: Initializer; + readonly kernelConstraint: Constraint; + readonly recurrentConstraint: Constraint; + readonly biasConstraint: Constraint; + readonly kernelRegularizer: Regularizer; + readonly recurrentRegularizer: Regularizer; + readonly biasRegularizer: Regularizer; + readonly dropout: number; + readonly recurrentDropout: number; + readonly dropoutFunc: Function; + readonly stateSize: number; + kernel: LayerVariable; + recurrentKernel: LayerVariable; + bias: LayerVariable; + readonly DEFAULT_ACTIVATION = "tanh"; + readonly DEFAULT_KERNEL_INITIALIZER = "glorotNormal"; + readonly DEFAULT_RECURRENT_INITIALIZER = "orthogonal"; + readonly DEFAULT_BIAS_INITIALIZER: InitializerIdentifier; + constructor(args: SimpleRNNCellLayerArgs); + build(inputShape: Shape | Shape[]): void; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + getConfig(): serialization.ConfigDict; +} + +/** + * Cell class for `SimpleRNN`. + * + * `SimpleRNNCell` is distinct from the `RNN` subclass `SimpleRNN` in that its + * `apply` method takes the input data of only a single time step and returns + * the cell's output at the time step, while `SimpleRNN` takes the input data + * over a number of time steps. For example: + * + * ```js + * const cell = tf.layers.simpleRNNCell({units: 2}); + * const input = tf.input({shape: [10]}); + * const output = cell.apply(input); + * + * console.log(JSON.stringify(output.shape)); + * // [null, 10]: This is the cell's output at a single time step. The 1st + * // dimension is the unknown batch size. + * ``` + * + * Instance(s) of `SimpleRNNCell` can be used to construct `RNN` layers. The + * most typical use of this workflow is to combine a number of cells into a + * stacked RNN cell (i.e., `StackedRNNCell` internally) and use it to create an + * RNN. For example: + * + * ```js + * const cells = [ + * tf.layers.simpleRNNCell({units: 4}), + * tf.layers.simpleRNNCell({units: 8}), + * ]; + * const rnn = tf.layers.rnn({cell: cells, returnSequences: true}); + * + * // Create an input with 10 time steps and a length-20 vector at each step. + * const input = tf.input({shape: [10, 20]}); + * const output = rnn.apply(input); + * + * console.log(JSON.stringify(output.shape)); + * // [null, 10, 8]: 1st dimension is unknown batch size; 2nd dimension is the + * // same as the sequence length of `input`, due to `returnSequences`: `true`; + * // 3rd dimension is the last `SimpleRNNCell`'s number of units. + * ``` + * + * To create an `RNN` consisting of only *one* `SimpleRNNCell`, use the + * `tf.layers.simpleRNN`. + * + * @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'} + */ +declare function simpleRNNCell(args: SimpleRNNCellLayerArgs): SimpleRNNCell; + +export declare interface SimpleRNNCellLayerArgs extends LayerArgs { + /** + * units: Positive integer, dimensionality of the output space. + */ + units: number; + /** + * Activation function to use. + * Default: hyperbolic tangent ('tanh'). + * If you pass `null`, 'linear' activation will be applied. + */ + activation?: ActivationIdentifier; + /** + * Whether the layer uses a bias vector. + */ + useBias?: boolean; + /** + * Initializer for the `kernel` weights matrix, used for the linear + * transformation of the inputs. + */ + kernelInitializer?: InitializerIdentifier | Initializer; + /** + * Initializer for the `recurrentKernel` weights matrix, used for + * linear transformation of the recurrent state. + */ + recurrentInitializer?: InitializerIdentifier | Initializer; + /** + * Initializer for the bias vector. + */ + biasInitializer?: InitializerIdentifier | Initializer; + /** + * Regularizer function applied to the `kernel` weights matrix. + */ + kernelRegularizer?: RegularizerIdentifier | Regularizer; + /** + * Regularizer function applied to the `recurrent_kernel` weights matrix. + */ + recurrentRegularizer?: RegularizerIdentifier | Regularizer; + /** + * Regularizer function applied to the bias vector. + */ + biasRegularizer?: RegularizerIdentifier | Regularizer; + /** + * Constraint function applied to the `kernel` weights matrix. + */ + kernelConstraint?: ConstraintIdentifier | Constraint; + /** + * Constraint function applied to the `recurrentKernel` weights matrix. + */ + recurrentConstraint?: ConstraintIdentifier | Constraint; + /** + * Constraint function applied to the bias vector. + */ + biasConstraint?: ConstraintIdentifier | Constraint; + /** + * Float number between 0 and 1. Fraction of the units to drop for the linear + * transformation of the inputs. + */ + dropout?: number; + /** + * Float number between 0 and 1. Fraction of the units to drop for the linear + * transformation of the recurrent state. + */ + recurrentDropout?: number; + /** + * This is added for test DI purpose. + */ + dropoutFunc?: Function; +} + +export declare interface SimpleRNNLayerArgs extends BaseRNNLayerArgs { + /** + * Positive integer, dimensionality of the output space. + */ + units: number; + /** + * Activation function to use. + * + * Defaults to hyperbolic tangent (`tanh`) + * + * If you pass `null`, no activation will be applied. + */ + activation?: ActivationIdentifier; + /** + * Whether the layer uses a bias vector. + */ + useBias?: boolean; + /** + * Initializer for the `kernel` weights matrix, used for the linear + * transformation of the inputs. + */ + kernelInitializer?: InitializerIdentifier | Initializer; + /** + * Initializer for the `recurrentKernel` weights matrix, used for + * linear transformation of the recurrent state. + */ + recurrentInitializer?: InitializerIdentifier | Initializer; + /** + * Initializer for the bias vector. + */ + biasInitializer?: InitializerIdentifier | Initializer; + /** + * Regularizer function applied to the kernel weights matrix. + */ + kernelRegularizer?: RegularizerIdentifier | Regularizer; + /** + * Regularizer function applied to the recurrentKernel weights matrix. + */ + recurrentRegularizer?: RegularizerIdentifier | Regularizer; + /** + * Regularizer function applied to the bias vector. + */ + biasRegularizer?: RegularizerIdentifier | Regularizer; + /** + * Constraint function applied to the kernel weights matrix. + */ + kernelConstraint?: ConstraintIdentifier | Constraint; + /** + * Constraint function applied to the recurrentKernel weights matrix. + */ + recurrentConstraint?: ConstraintIdentifier | Constraint; + /** + * Constraint function applied to the bias vector. + */ + biasConstraint?: ConstraintIdentifier | Constraint; + /** + * Number between 0 and 1. Fraction of the units to drop for the linear + * transformation of the inputs. + */ + dropout?: number; + /** + * Number between 0 and 1. Fraction of the units to drop for the linear + * transformation of the recurrent state. + */ + recurrentDropout?: number; + /** + * This is added for test DI purpose. + */ + dropoutFunc?: Function; +} + +declare type SimpleUnaryImpl = (values: TypedArray, dtype: DataType, attrs?: NamedAttrMap) => TypedArray; + +declare function sliceImpl(vals: BackendValues, begin: number[], size: number[], shape: number[], dtype: DataType): BackendValues; + +declare class Softmax extends Layer { + /** @nocollapse */ + static className: string; + readonly axis: number; + readonly softmax: (t: Tensor, a?: number) => Tensor; + readonly DEFAULT_AXIS = 1; + constructor(args?: SoftmaxLayerArgs); + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + getConfig(): serialization.ConfigDict; +} + +/** + * Softmax activation layer. + * + * Input shape: + * Arbitrary. Use the configuration `inputShape` when using this layer as the + * first layer in a model. + * + * Output shape: + * Same shape as the input. + * + * @doc { + * heading: 'Layers', + * subheading: 'Advanced Activation', + * namespace: 'layers' + * } + */ +declare function softmax(args?: SoftmaxLayerArgs): Softmax; + +declare interface SoftmaxLayerArgs extends LayerArgs { + /** + * Integer, axis along which the softmax normalization is applied. + * Defaults to `-1` (i.e., the last axis). + */ + axis?: number; +} + +/** + * Sparse categorical accuracy metric function. + * + * Example: + * ```js + * + * const yTrue = tf.tensor1d([1, 1, 2, 2, 0]); + * const yPred = tf.tensor2d( + * [[0, 1, 0], [1, 0, 0], [0, 0.4, 0.6], [0, 0.6, 0.4], [0.7, 0.3, 0]]); + * const crossentropy = tf.metrics.sparseCategoricalAccuracy(yTrue, yPred); + * crossentropy.print(); + * ``` + * + * @param yTrue True labels: indices. + * @param yPred Predicted probabilities or logits. + * @returns Accuracy tensor. + * + * @doc {heading: 'Metrics', namespace: 'metrics'} + */ +declare function sparseCategoricalAccuracy(yTrue: Tensor, yPred: Tensor): Tensor; + +declare function sparseFillEmptyRowsImpl(indices: TypedArray, indicesShape: number[], indicesDType: DataType, values: TypedArray, valuesDType: DataType, denseShape: TypedArray, defaultValue: number): [ +TypedArray, +number[], +TypedArray, +boolean[], +number[] +]; + +declare function sparseReshapeImpl(inputIndices: TypedArray, inputIndicesShape: number[], inputDType: DataType, inputShape: number[], targetShape: number[]): [TypedArray, number[], number[]]; + +declare function sparseSegmentReductionImpl(input: TypedArray, inputShape: number[], inputDType: DataType, indices: TypedArray, segmentIds: TypedArray, isMean?: boolean, defaultValue?: number): [TypedArray, number[]]; + +declare class SpatialDropout1D extends Dropout { + /** @nocollapse */ + static className: string; + constructor(args: SpatialDropout1DLayerConfig); + protected getNoiseShape(input: Tensor): Shape; +} + +/** + * Spatial 1D version of Dropout. + * + * This Layer type performs the same function as the Dropout layer, but it drops + * entire 1D feature maps instead of individual elements. For example, if an + * input example consists of 3 timesteps and the feature map for each timestep + * has a size of 4, a `spatialDropout1d` layer may zero out the feature maps + * of the 1st timesteps and 2nd timesteps completely while sparing all feature + * elements of the 3rd timestep. + * + * If adjacent frames (timesteps) are strongly correlated (as is normally the + * case in early convolution layers), regular dropout will not regularize the + * activation and will otherwise just result in merely an effective learning + * rate decrease. In this case, `spatialDropout1d` will help promote + * independence among feature maps and should be used instead. + * + * **Arguments:** + * rate: A floating-point number >=0 and <=1. Fraction of the input elements + * to drop. + * + * **Input shape:** + * 3D tensor with shape `(samples, timesteps, channels)`. + * + * **Output shape:** + * Same as the input shape. + * + * References: + * - [Efficient Object Localization Using Convolutional + * Networks](https://arxiv.org/abs/1411.4280) + * + * @doc {heading: 'Layers', subheading: 'Basic', namespace: 'layers'} + */ +declare function spatialDropout1d(args: SpatialDropout1DLayerConfig): SpatialDropout1D; + +declare interface SpatialDropout1DLayerConfig extends LayerConfig { + /** Float between 0 and 1. Fraction of the input units to drop. */ + rate: number; + /** An integer to use as random seed. */ + seed?: number; +} + +declare const sqrtImpl: SimpleUnaryImpl; + +declare const squaredDifferenceImpl: SimpleBinaryKernelImpl; + +declare class StackedRNNCells extends RNNCell { + /** @nocollapse */ + static className: string; + protected cells: RNNCell[]; + constructor(args: StackedRNNCellsArgs); + get stateSize(): number[]; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + build(inputShape: Shape | Shape[]): void; + getConfig(): serialization.ConfigDict; + /** @nocollapse */ + static fromConfig(cls: serialization.SerializableConstructor, config: serialization.ConfigDict, customObjects?: serialization.ConfigDict): T; + get trainableWeights(): LayerVariable[]; + get nonTrainableWeights(): LayerVariable[]; + /** + * Retrieve the weights of a the model. + * + * @returns A flat `Array` of `tf.Tensor`s. + */ + getWeights(): Tensor[]; + /** + * Set the weights of the model. + * + * @param weights An `Array` of `tf.Tensor`s with shapes and types matching + * the output of `getWeights()`. + */ + setWeights(weights: Tensor[]): void; +} + +/** + * Wrapper allowing a stack of RNN cells to behave as a single cell. + * + * Used to implement efficient stacked RNNs. + * + * @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'} + */ +declare function stackedRNNCells(args: StackedRNNCellsArgs): StackedRNNCells; + +declare interface StackedRNNCellsArgs extends LayerArgs { + /** + * An `Array` of `RNNCell` instances. + */ + cells: RNNCell[]; +} + +declare function stridedSliceImpl(outShape: number[], xBuf: TensorBuffer, strides: number[], begin: number[]): TensorBuffer; + +/** + * @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +declare function stringNGramsImpl(data: Uint8Array[], dataSplits: Int32Array, separator: string, nGramWidths: number[], leftPad: string, rightPad: string, padWidth: number, preserveShortSequences: boolean): [Uint8Array[], Int32Array]; + +declare function stringSplitImpl(input: Uint8Array[], delimiter: Uint8Array, skipEmpty: boolean): [TypedArray, Uint8Array[], [number, number]]; + +declare function stringToHashBucketFastImpl(input: Uint8Array[], numBuckets: number): TypedArray; + +declare const subImpl: SimpleBinaryKernelImpl; + +/** + * `tf.SymbolicTensor` is a placeholder for a Tensor without any concrete value. + * + * They are most often encountered when building a graph of `Layer`s for a + * `tf.LayersModel` and the input data's shape, but not values are known. + * + * @doc {heading: 'Models', 'subheading': 'Classes'} + */ +export declare class SymbolicTensor { + readonly dtype: DataType; + readonly shape: Shape; + sourceLayer: Layer; + readonly inputs: SymbolicTensor[]; + readonly callArgs: Kwargs; + readonly outputTensorIndex?: number; + readonly id: number; + readonly name: string; + readonly originalName?: string; + /** + * Rank/dimensionality of the tensor. + */ + readonly rank: number; + /** + * Replacement for _keras_history. + */ + nodeIndex: number; + /** + * Replacement for _keras_history. + */ + tensorIndex: number; + /** + * + * @param dtype + * @param shape + * @param sourceLayer The Layer that produced this symbolic tensor. + * @param inputs The inputs passed to sourceLayer's __call__() method. + * @param nodeIndex + * @param tensorIndex + * @param callArgs The keyword arguments passed to the __call__() method. + * @param name + * @param outputTensorIndex The index of this tensor in the list of outputs + * returned by apply(). + */ + constructor(dtype: DataType, shape: Shape, sourceLayer: Layer, inputs: SymbolicTensor[], callArgs: Kwargs, name?: string, outputTensorIndex?: number); +} + +declare interface TensorData { + values?: backend_util.BackendValues; + dtype: D; + complexTensorInfos?: { + real: TensorInfo_2; + imag: TensorInfo_2; + }; + refCount: number; +} + +declare interface TensorData_2 { + id: number; + memoryOffset: number; + shape: number[]; + dtype: DataType; + refCount: number; + /** Only used for string tensors, storing encoded bytes. */ + stringBytes?: Uint8Array[]; +} + +declare type TensorData_3 = { + values: backend_util.BackendValues; + dtype: DataType; + shape: number[]; + refCount: number; + resourceInfo?: BufferInfo | TextureInfo; + complexTensorInfos?: { + real: TensorInfo_2; + imag: TensorInfo_2; + }; +}; + +declare interface TensorInfo { + name: string; + shape?: number[]; + dtype: DataType; +} + +/** + * A single Tensor or a non-nested collection of Tensors. + * + * An object of this type can always be reduced to `Tensor[]`. A single + * 'Tensor' becomes `[Tensor]`. A `Tensor[]` is unchanged. A `NamedTensorMap` + * can be converted with the help of a list of names, providing the order in + * which the Tensors should appear in the resulting array. + */ +declare type TensorOrArrayOrMap = Tensor | Tensor[] | NamedTensorMap; + +declare namespace TensorShape { + /** Properties of a Dim. */ + interface IDim { + /** Dim size */ + size?: (number | string | null); + /** Dim name */ + name?: (string | null); + } +} + +declare interface Texture { + texture: WebGLTexture; + texShape: [number, number]; +} + +declare interface TextureConfig { + internalFormatFloat: number; + textureFormatFloat: number; + internalFormatPackedHalfFloat: number; + internalFormatHalfFloat: number; + internalFormatPackedFloat: number; + downloadTextureFormat: number; + downloadUnpackNumChannels: number; + defaultNumChannels: number; + textureTypeHalfFloat: number; + textureTypeFloat: number; +} + +declare interface TextureData { + shape: number[]; + dtype: DataType; + values?: backend_util.BackendValues; + texture?: Texture; + complexTensorInfos?: { + real: TensorInfo_2; + imag: TensorInfo_2; + }; + /** [rows, columns] shape of the texture. */ + texShape?: [number, number]; + usage?: TextureUsage; + isPacked?: boolean; + refCount: number; + slice?: { + flatOffset: number; + origDataId: DataId_2; + }; +} + +declare type TextureInfo = { + width: number; + height: number; + format: GPUTextureFormat; + usage: GPUTextureUsageFlags; + texture: GPUTexture | GPUExternalTexture; +}; + +declare class TextureManager { + private gpgpu; + private numUsedTextures; + private numFreeTextures; + private _numBytesAllocated; + private _numBytesFree; + private freeTextures; + private logEnabled; + private usedTextures; + constructor(gpgpu: GPGPUContext); + acquireTexture(shapeRC: [number, number], usage: TextureUsage, isPacked: boolean): Texture; + releaseTexture(texture: Texture, shape: [number, number], logicalTexType: TextureUsage, isPacked: boolean): void; + private log; + get numBytesAllocated(): number; + get numBytesFree(): number; + getNumUsedTextures(): number; + getNumFreeTextures(): number; + dispose(): void; +} + +/** + * @license + * Copyright 2022 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +declare class TextureManager_2 { + private device; + private numUsedTextures; + private numFreeTextures; + private freeTextures; + private usedTextures; + numBytesUsed: number; + numBytesAllocated: number; + constructor(device: GPUDevice); + acquireTexture(width: number, height: number, format: GPUTextureFormat, usage: GPUTextureUsageFlags): GPUTexture; + releaseTexture(texture: GPUTexture, width: number, height: number, format: GPUTextureFormat, usage: GPUTextureUsageFlags): void; + getNumUsedTextures(): number; + getNumFreeTextures(): number; + dispose(): void; +} + +declare enum TextureUsage { + RENDER = 0, + UPLOAD = 1, + PIXELS = 2, + DOWNLOAD = 3 +} + +declare class ThresholdedReLU extends Layer { + /** @nocollapse */ + static className: string; + readonly theta: number; + readonly DEFAULT_THETA = 1; + constructor(args?: ThresholdedReLULayerArgs); + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + getConfig(): serialization.ConfigDict; +} + +/** + * Thresholded Rectified Linear Unit. + * + * It follows: + * `f(x) = x for x > theta`, + * `f(x) = 0 otherwise`. + * + * Input shape: + * Arbitrary. Use the configuration `inputShape` when using this layer as the + * first layer in a model. + * + * Output shape: + * Same shape as the input. + * + * References: + * - [Zero-Bias Autoencoders and the Benefits of Co-Adapting + * Features](http://arxiv.org/abs/1402.3337) + * + * @doc { + * heading: 'Layers', + * subheading: 'Advanced Activation', + * namespace: 'layers' + * } + */ +declare function thresholdedReLU(args?: ThresholdedReLULayerArgs): ThresholdedReLU; + +declare interface ThresholdedReLULayerArgs extends LayerArgs { + /** + * Float >= 0. Threshold location of activation. + */ + theta?: number; +} + +/** + * An implementation of the tile kernel shared between webgl and cpu for string + * tensors only. + */ +declare function tileImpl(xBuf: TensorBuffer, reps: number[]): TensorBuffer; + +declare function tilesFitEvenlyIntoShape(tileSize: number[], shape: number[]): boolean; + +declare class TimeDistributed extends Wrapper { + /** @nocollapse */ + static className: string; + constructor(args: WrapperLayerArgs); + build(inputShape: Shape | Shape[]): void; + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; +} + +/** + * This wrapper applies a layer to every temporal slice of an input. + * + * The input should be at least 3D, and the dimension of the index `1` will be + * considered to be the temporal dimension. + * + * Consider a batch of 32 samples, where each sample is a sequence of 10 vectors + * of 16 dimensions. The batch input shape of the layer is then `[32, 10, + * 16]`, and the `inputShape`, not including the sample dimension, is + * `[10, 16]`. + * + * You can then use `TimeDistributed` to apply a `Dense` layer to each of the 10 + * timesteps, independently: + * + * ```js + * const model = tf.sequential(); + * model.add(tf.layers.timeDistributed({ + * layer: tf.layers.dense({units: 8}), + * inputShape: [10, 16], + * })); + * + * // Now model.outputShape = [null, 10, 8]. + * // The output will then have shape `[32, 10, 8]`. + * + * // In subsequent layers, there is no need for `inputShape`: + * model.add(tf.layers.timeDistributed({layer: tf.layers.dense({units: 32})})); + * console.log(JSON.stringify(model.outputs[0].shape)); + * // Now model.outputShape = [null, 10, 32]. + * ``` + * + * The output will then have shape `[32, 10, 32]`. + * + * `TimeDistributed` can be used with arbitrary layers, not just `Dense`, for + * instance a `Conv2D` layer. + * + * ```js + * const model = tf.sequential(); + * model.add(tf.layers.timeDistributed({ + * layer: tf.layers.conv2d({filters: 64, kernelSize: [3, 3]}), + * inputShape: [10, 299, 299, 3], + * })); + * console.log(JSON.stringify(model.outputs[0].shape)); + * ``` + * + * @doc {heading: 'Layers', subheading: 'Wrapper', namespace: 'layers'} + */ +declare function timeDistributed(args: WrapperLayerArgs): TimeDistributed; + +declare function topKImpl(x: TypedArray, xShape: number[], xDtype: NumericDataType, k: number, sorted: boolean): [ +TensorBuffer, +TensorBuffer +]; + +/** + * Configuration of the Keras trainer. This includes the configuration to the + * optimizer, the loss, any metrics to be calculated, etc. + */ +declare interface TrainingConfig extends PyJsonDict { + optimizer_config: OptimizerSerialization; + loss: LossIdentifier | LossIdentifier[] | { + [key: string]: LossIdentifier; + }; + metrics?: MetricsIdentifier[] | { + [key: string]: MetricsIdentifier; + }; + weighted_metrics?: MetricsIdentifier[]; + sample_weight_mode?: SampleWeightMode; + loss_weights?: LossWeights; +} + +declare function transposeImpl(xVals: TypedArray, xShape: number[], dtype: DataType, perm: number[], newShape: number[]): TypedArray; + +/** + * Initializer that generates random values initialized to a truncated normal + * distribution. + * + * These values are similar to values from a `RandomNormal` except that values + * more than two standard deviations from the mean are discarded and re-drawn. + * This is the recommended initializer for neural network weights and filters. + * + * @doc {heading: 'Initializers', namespace: 'initializers'} + */ +declare function truncatedNormal(args: TruncatedNormalArgs): Initializer; + +declare interface TruncatedNormalArgs { + /** Mean of the random values to generate. */ + mean?: number; + /** Standard deviation of the random values to generate. */ + stddev?: number; + /** Used to seed the random generator. */ + seed?: number; +} + +declare function unbindColorTextureFromFramebuffer(gl: WebGLRenderingContext, framebuffer: WebGLFramebuffer): void; + +declare function unbindTextureUnit(gl: WebGLRenderingContext, textureUnit: number): void; + +declare type UniformType = 'float' | 'vec2' | 'vec3' | 'vec4' | 'int' | 'ivec2' | 'ivec3' | 'ivec4'; + +declare function uniqueImpl(values: BackendValues, axis: number, shape: number[], dtype: DataType): { + outputValues: BackendValues; + outputShape: number[]; + indices: BackendValues; +}; + +/** + * Constrains the weights incident to each hidden unit to have unit norm. + * + * @doc {heading: 'Constraints', namespace: 'constraints'} + */ +declare function unitNorm(args: UnitNormArgs): Constraint; + +declare interface UnitNormArgs { + /** + * Axis along which to calculate norms. + * + * For instance, in a `Dense` layer the weight matrix + * has shape `[inputDim, outputDim]`, + * set `axis` to `0` to constrain each weight vector + * of length `[inputDim,]`. + * In a `Conv2D` layer with `dataFormat="channels_last"`, + * the weight tensor has shape + * `[rows, cols, inputDepth, outputDepth]`, + * set `axis` to `[0, 1, 2]` + * to constrain the weights of each filter tensor of size + * `[rows, cols, inputDepth]`. + */ + axis?: number; +} + +/** + * Logs in which values can be either numbers or Tensors (Scalars). + * + * Used internally. + */ +declare type UnresolvedLogs = { + [key: string]: number | Scalar; +}; + +declare function uploadDenseMatrixToTexture(gl: WebGLRenderingContext, texture: WebGLTexture, width: number, height: number, data: TypedArray, textureConfig: TextureConfig): void; + +declare function uploadPixelDataToTexture(gl: WebGLRenderingContext, texture: WebGLTexture, pixels: PixelData | ImageData | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap): void; + +declare class UpSampling2D extends Layer { + /** @nocollapse */ + static className: string; + protected readonly DEFAULT_SIZE: number[]; + protected readonly size: number[]; + protected readonly dataFormat: DataFormat; + protected readonly interpolation: InterpolationFormat; + constructor(args: UpSampling2DLayerArgs); + computeOutputShape(inputShape: Shape): Shape; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + getConfig(): serialization.ConfigDict; +} + +/** + * Upsampling layer for 2D inputs. + * + * Repeats the rows and columns of the data + * by size[0] and size[1] respectively. + * + * + * Input shape: + * 4D tensor with shape: + * - If `dataFormat` is `"channelsLast"`: + * `[batch, rows, cols, channels]` + * - If `dataFormat` is `"channelsFirst"`: + * `[batch, channels, rows, cols]` + * + * Output shape: + * 4D tensor with shape: + * - If `dataFormat` is `"channelsLast"`: + * `[batch, upsampledRows, upsampledCols, channels]` + * - If `dataFormat` is `"channelsFirst"`: + * `[batch, channels, upsampledRows, upsampledCols]` + * + * + * @doc {heading: 'Layers', subheading: 'Convolutional', namespace: 'layers'} + */ +declare function upSampling2d(args: UpSampling2DLayerArgs): UpSampling2D; + +declare interface UpSampling2DLayerArgs extends LayerArgs { + /** + * The upsampling factors for rows and columns. + * + * Defaults to `[2, 2]`. + */ + size?: number[]; + /** + * Format of the data, which determines the ordering of the dimensions in + * the inputs. + * + * `"channelsLast"` corresponds to inputs with shape + * `[batch, ..., channels]` + * + * `"channelsFirst"` corresponds to inputs with shape `[batch, channels, + * ...]`. + * + * Defaults to `"channelsLast"`. + */ + dataFormat?: DataFormat; + /** + * The interpolation mechanism, one of `"nearest"` or `"bilinear"`, default + * to `"nearest"`. + */ + interpolation?: InterpolationFormat; +} + +declare type Url = string | io.IOHandler | io.IOHandlerSync; + +declare type UrlIOHandler = T extends string ? io.IOHandler : T; + +declare function validateFramebuffer(gl: WebGLRenderingContext): void; + +declare function validateProgram(gl: WebGLRenderingContext, program: WebGLProgram): void; + +declare function validateTextureSize(width: number, height: number): void; + +declare type ValueType = string | string[] | number | number[] | number[][] | boolean | boolean[] | Tensor | Tensor[]; + +/** + * Initializer capable of adapting its scale to the shape of weights. + * With distribution=NORMAL, samples are drawn from a truncated normal + * distribution centered on zero, with `stddev = sqrt(scale / n)` where n is: + * - number of input units in the weight tensor, if mode = FAN_IN. + * - number of output units, if mode = FAN_OUT. + * - average of the numbers of input and output units, if mode = FAN_AVG. + * With distribution=UNIFORM, + * samples are drawn from a uniform distribution + * within [-limit, limit], with `limit = sqrt(3 * scale / n)`. + * + * @doc {heading: 'Initializers',namespace: 'initializers'} + */ +declare function varianceScaling(config: VarianceScalingArgs): Initializer; + +declare interface VarianceScalingArgs { + /** Scaling factor (positive float). */ + scale?: number; + /** Fanning mode for inputs and outputs. */ + mode?: FanMode; + /** Probabilistic distribution of the values. */ + distribution?: Distribution; + /** Random number generator seed. */ + seed?: number; +} + +export declare const version: { + 'tfjs-core': string; + 'tfjs-backend-cpu': string; + 'tfjs-backend-webgl': string; + 'tfjs-data': string; + 'tfjs-layers': string; + 'tfjs-converter': string; + tfjs: string; +}; + +/** @license See the LICENSE file. */ +export declare const version_converter = "0.0.0"; + +/** @license See the LICENSE file. */ +export declare const version_cpu = "0.0.0"; + +/** @license See the LICENSE file. */ +export declare const version_layers = "0.0.0"; + +/** @license See the LICENSE file. */ +export declare const version_wasm = "0.0.0"; + +/** @license See the LICENSE file. */ +export declare const version_webgl = "0.0.0"; + +declare type WasmBinaryName = typeof wasmBinaryNames[number]; + +declare const wasmBinaryNames: readonly ["tfjs-backend-wasm.wasm", "tfjs-backend-wasm-simd.wasm", "tfjs-backend-wasm-threaded-simd.wasm"]; + +export declare const webgl: { + forceHalfFloat: typeof forceHalfFloat; +}; + +declare interface WebGL1DisjointQueryTimerExtension { + TIME_ELAPSED_EXT: number; + QUERY_RESULT_AVAILABLE_EXT: number; + GPU_DISJOINT_EXT: number; + QUERY_RESULT_EXT: number; + createQueryEXT: () => {}; + beginQueryEXT: (ext: number, query: WebGLQuery) => void; + endQueryEXT: (ext: number) => void; + deleteQueryEXT: (query: WebGLQuery) => void; + isQueryEXT: (query: WebGLQuery) => boolean; + getQueryObjectEXT: (query: WebGLQuery, queryResultAvailableExt: number) => number; +} + +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +declare interface WebGL2DisjointQueryTimerExtension { + TIME_ELAPSED_EXT: number; + GPU_DISJOINT_EXT: number; +} + +declare namespace webgl_util { + export { + callAndCheck, + canBeRepresented, + getWebGLErrorMessage, + getExtensionOrThrow, + createVertexShader_2 as createVertexShader, + createFragmentShader, + logShaderSourceAndInfoLog, + createProgram, + linkProgram, + validateProgram, + createStaticVertexBuffer, + createStaticIndexBuffer, + getNumChannels, + createTexture, + validateTextureSize, + createFramebuffer, + bindVertexBufferToProgramAttribute, + bindTextureUnit, + unbindTextureUnit, + getProgramUniformLocationOrThrow, + getProgramUniformLocation, + bindTextureToProgramUniformSampler, + bindCanvasToFramebuffer, + bindColorTextureToFramebuffer, + unbindColorTextureFromFramebuffer, + validateFramebuffer, + getFramebufferErrorMessage, + getBatchDim, + getRowsCols, + getShapeAs3D, + getTextureShapeFromLogicalShape, + isReshapeFree, + getWebGLMaxTextureSize, + resetMaxTextureSize, + resetMaxTexturesInShader, + getMaxTexturesInShader, + getWebGLDisjointQueryTimerVersion, + hasExtension, + isWebGLVersionEnabled, + isCapableOfRenderingToFloatTexture, + isDownloadFloatTextureEnabled, + isWebGLFenceEnabled, + assertNotComplex + } +} +export { webgl_util } + +export declare interface WebGLMemoryInfo extends MemoryInfo { + numBytesInGPU: number; + numBytesInGPUAllocated: number; + numBytesInGPUFree: number; + unreliable: boolean; +} + +declare interface WebGLParallelCompilationExtension { + COMPLETION_STATUS_KHR: number; +} + +export declare interface WebGLTimingInfo extends TimingInfo { + uploadWaitMs: number; + downloadWaitMs: number; +} + +declare type WebGLVao = WebGLVertexArrayObject | WebGLVertexArrayObjectOES; + +declare namespace webgpu_program { + export { + getCoordsDataType, + getCoordsXYZ, + getMainHeaderString, + getStartHeaderString, + getWorkgroupSizeString, + makeShaderKey, + mapToWgslTypes, + WebGPUProgram, + compileProgram, + WGSLDataType + } +} + +declare namespace webgpu_util { + export { + tilesFitEvenlyIntoShape, + computeDispatch, + computeWorkgroupInfoForMatMul, + computeWorkgroupSizeForConv2d, + computeWorkPerThreadForConv2d, + flatDispatchLayout, + GPUBytesPerElement, + ArrayBufferToTypedArray, + isWebGPUSupported, + WorkgroupInfo, + MatMulProgramType + } +} +export { webgpu_util } + +export declare class WebGPUBackend extends KernelBackend { + bufferManager: BufferManager; + adapterInfo: AdapterInfo; + device: GPUDevice; + queue: GPUQueue; + tensorMap: DataStorage; + textureManager: TextureManager_2; + thresholdToIncreaseWorkgroups: number; + private activeTimers; + private currentCommandEncoder; + private currentComputePass; + private commandQueueOwnedIds; + private dispatchNumberInEncoder; + private disposed; + private downloadWaitMs; + private dummyCanvas; + private dummyContext; + private tensorDataPendingDisposal; + private static nextDataId; + private pipelineCache; + private programTimersStack; + private querySet; + private stagingPendingDisposal; + private supportTimeQuery; + private uniformPendingDisposal; + private uploadWaitMs; + private nextDataId; + constructor(device: GPUDevice, adapterInfo?: GPUAdapterInfo); + floatPrecision(): 32; + defaultGpuBufferUsage(): number; + /** + * Dispose the memory if the dataId has 0 refCount. Return true if the memory + * is released or memory is not managed in this backend, false if memory is + * not cleared. + * @param dataId + * @oaram force Optional, remove the data regardless of refCount + */ + disposeData(dataId: DataId_4, force?: boolean): boolean; + memory(): WebGPUMemoryInfo; + releaseResource(dataId: DataId_4): void; + /** Return refCount of a `TensorData`. */ + refCount(dataId: DataId_4): number; + /** Increase refCount of a `TensorData`. */ + incRef(dataId: DataId_4): void; + /** Decrease refCount of a `TensorData`. */ + decRef(dataId: DataId_4): void; + write(values: backend_util.BackendValues, shape: number[], dtype: DataType): DataId_4; + move(dataId: DataId_4, values: backend_util.BackendValues, shape: number[], dtype: DataType, refCount: number): void; + submitQueue(): void; + ensureCommandEncoderReady(): void; + ensureComputePassEnded(): void; + getComputePass(): GPUComputePassEncoder; + getBufferData(buffer: GPUBuffer, size: number): Promise; + private convertAndCacheOnCPU; + readSync(dataId: object): backend_util.BackendValues; + read(dataId: object): Promise; + /** + * Read tensor to a new GPUBuffer. + * @param dataId The source tensor. + */ + readToGPU(dataId: DataId_4): GPUData; + bufferSync(t: TensorInfo_2): TensorBuffer; + time(f: () => void): Promise; + makeTensorInfo(shape: number[], dtype: DataType, values?: backend_util.BackendValues | string[]): TensorInfo_2; + private tensorToBinding; + getQueryTime(query: GPUQuerySet): Promise; + uploadToGPU(dataId: DataId_4): void; + private makeUniforms; + runWebGPUProgram(program: webgpu_program.WebGPUProgram, inputs: TensorInfo_2[], outputDtype: DataType, programDefinedUniform?: ProgramUniform, output?: TensorInfo_2): TensorInfo_2; + getTimeFromQuerySet(querySet: GPUQuerySet): Promise; + shouldExecuteOnCPU(inputs: TensorInfo_2[], sizeThreshold?: number): boolean; + numDataIds(): number; + dispose(): void; +} + +declare interface WebGPUMemoryInfo extends backend_util.MemoryInfo { + numBytesInGPU: number; + numBytesAllocatedInGPU: number; + unreliable: boolean; +} + +export declare interface WebGPUProgram { + atomic?: boolean; + dispatch: [number, number, number]; + dispatchLayout: { + x: number[]; + y?: number[]; + z?: number[]; + }; + isFromPixels?: boolean; + isVec4?: boolean; + outputShape: number[]; + shaderKey: string; + size?: boolean; + uniforms?: string; + variableNames: string[]; + variableTypes?: string[]; + workgroupSize: [number, number, number]; + workPerThread?: number; + getUserCode: () => string; +} + +declare interface WebGPUTimingInfo extends TimingInfo { + uploadWaitMs: number; + downloadWaitMs: number; +} + +declare type WGSLDataType = 'f32' | 'i32' | 'vec4' | 'vec4' | 'vec4'; + +declare type WorkgroupInfo = { + workgroupSize: [number, number, number]; + elementsPerThread: [number, number, number]; +}; + +/** + * Abstract wrapper base class. + * + * Wrappers take another layer and augment it in various ways. + * Do not use this class as a layer, it is only an abstract base class. + * Two usable wrappers are the `TimeDistributed` and `Bidirectional` wrappers. + */ +declare abstract class Wrapper extends Layer { + readonly layer: Layer; + constructor(args: WrapperLayerArgs); + build(inputShape: Shape | Shape[]): void; + get trainable(): boolean; + set trainable(value: boolean); + get trainableWeights(): LayerVariable[]; + get nonTrainableWeights(): LayerVariable[]; + get updates(): Tensor[]; + get losses(): RegularizerFn[]; + getWeights(): Tensor[]; + setWeights(weights: Tensor[]): void; + getConfig(): serialization.ConfigDict; + setFastWeightInitDuringBuild(value: boolean): void; + /** @nocollapse */ + static fromConfig(cls: serialization.SerializableConstructor, config: serialization.ConfigDict, customObjects?: serialization.ConfigDict): T; +} + +declare interface WrapperLayerArgs extends LayerArgs { + /** + * The layer to be wrapped. + */ + layer: Layer; +} + +declare type YieldEveryOptions = 'auto' | 'batch' | 'epoch' | 'never' | number; + +declare class ZeroPadding2D extends Layer { + /** @nocollapse */ + static className: string; + readonly dataFormat: DataFormat; + readonly padding: [[number, number], [number, number]]; + constructor(args?: ZeroPadding2DLayerArgs); + computeOutputShape(inputShape: Shape | Shape[]): Shape | Shape[]; + call(inputs: Tensor | Tensor[], kwargs: Kwargs): Tensor | Tensor[]; + getConfig(): serialization.ConfigDict; +} + +/** + * Zero-padding layer for 2D input (e.g., image). + * + * This layer can add rows and columns of zeros + * at the top, bottom, left and right side of an image tensor. + * + * Input shape: + * 4D tensor with shape: + * - If `dataFormat` is `"channelsLast"`: + * `[batch, rows, cols, channels]` + * - If `data_format` is `"channels_first"`: + * `[batch, channels, rows, cols]`. + * + * Output shape: + * 4D with shape: + * - If `dataFormat` is `"channelsLast"`: + * `[batch, paddedRows, paddedCols, channels]` + * - If `dataFormat` is `"channelsFirst"`: + * `[batch, channels, paddedRows, paddedCols]`. + * + * @doc {heading: 'Layers', subheading: 'Padding', namespace: 'layers'} + */ +declare function zeroPadding2d(args?: ZeroPadding2DLayerArgs): ZeroPadding2D; + +declare interface ZeroPadding2DLayerArgs extends LayerArgs { + /** + * Integer, or `Array` of 2 integers, or `Array` of 2 `Array`s, each of + * which is an `Array` of 2 integers. + * - If integer, the same symmetric padding is applied to width and height. + * - If `Array` of 2 integers, interpreted as two different symmetric values + * for height and width: + * `[symmetricHeightPad, symmetricWidthPad]`. + * - If `Array` of 2 `Array`s, interpreted as: + * `[[topPad, bottomPad], [leftPad, rightPad]]`. + */ + padding?: number | [number, number] | [[number, number], [number, number]]; + /** + * One of `'channelsLast'` (default) and `'channelsFirst'`. + * + * The ordering of the dimensions in the inputs. + * `channelsLast` corresponds to inputs with shape + * `[batch, height, width, channels]` while `channelsFirst` + * corresponds to inputs with shape + * `[batch, channels, height, width]`. + */ + dataFormat?: DataFormat; +} + +declare class Zeros extends Initializer { + /** @nocollapse */ + static className: string; + apply(shape: Shape, dtype?: DataType): Tensor; +} + +/** + * Initializer that generates tensors initialized to 0. + * + * @doc {heading: 'Initializers', namespace: 'initializers'} + */ +declare function zeros(): Zeros; + +export { } diff --git a/types/tsconfig.json b/types/tsconfig.json new file mode 100644 index 00000000..c6b0785a --- /dev/null +++ b/types/tsconfig.json @@ -0,0 +1,49 @@ +{ + "compilerOptions": { + "module": "esnext", + "target": "esnext", + "moduleResolution": "node", + "baseUrl": "./", + "lib": ["esnext", "dom"], + "allowJs": true, + "allowSyntheticDefaultImports": false, + "allowUnreachableCode": false, + "allowUnusedLabels": false, + "alwaysStrict": true, + "declaration": true, + "declarationMap": true, + "emitDecoratorMetadata": true, + "esModuleInterop": false, + "exactOptionalPropertyTypes": true, + "experimentalDecorators": true, + "forceConsistentCasingInFileNames": true, + "importHelpers": true, + "importsNotUsedAsValues": "error", + "isolatedModules": false, + "noEmitHelpers": true, + "noEmitOnError": false, + "noFallthroughCasesInSwitch": true, + "noImplicitAny": false, + "noImplicitOverride": true, + "noImplicitReturns": true, + "noImplicitThis": true, + "noPropertyAccessFromIndexSignature": false, + "noUncheckedIndexedAccess": false, + "noUnusedLocals": true, + "noUnusedParameters": true, + "preserveConstEnums": true, + "pretty": true, + "removeComments": false, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strictBindCallApply": true, + "strictFunctionTypes": true, + "strictNullChecks": true, + "strictPropertyInitialization": true, + "stripInternal": false, + "useDefineForClassFields": true, + "useUnknownInCatchVariables": true + }, + "exclude": ["node_modules/", "dist/**/*.js"] +}