diff --git a/.build.json b/.build.json index 7e8790e1..459b55ab 100644 --- a/.build.json +++ b/.build.json @@ -145,6 +145,7 @@ { "name": "tfjs/browser/esm/custom", "platform": "browser", + "target": "esnext", "format": "esm", "input": "tfjs/tf-custom.ts", "output": "dist/tfjs.esm.js", @@ -154,6 +155,7 @@ { "name": "human/browser/esm/custom", "platform": "browser", + "target": "esnext", "format": "esm", "input": "src/human.ts", "output": "dist/human.custom.esm.js", @@ -162,11 +164,22 @@ "external": ["fs", "os", "buffer", "util"], "typings": "types", "typedoc": "typedoc" + }, + { + "name": "demo/browser", + "platform": "browser", + "target": "esnext", + "format": "esm", + "input": "demo/typescript/index.ts", + "output": "demo/typescript/index.js", + "sourcemap": true, + "minify": false, + "external": ["*/human.custom.esm.js"] } ] }, "watch": { - "locations": [ "src/**/*", "tfjs/**/*" ] + "locations": [ "src/**/*", "tfjs/**/*", "demo/**/*.ts" ] }, "typescript": { "allowJs": false diff --git a/.eslintrc.json b/.eslintrc.json index 570d374e..3f753a3b 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -27,7 +27,8 @@ ], "ignorePatterns": [ "assets", - "demo/helpers", + "demo/helpers/*.js", + "demo/typescript/*.js", "dist", "media", "models", diff --git a/CHANGELOG.md b/CHANGELOG.md index 655406ef..3c364063 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ ### **HEAD -> main** 2021/10/26 mandic00@live.com +- switch to custom tfjs for demos ### **release: 2.4.1** 2021/10/25 mandic00@live.com diff --git a/demo/index.js b/demo/index.js index cdb4f751..053ca929 100644 --- a/demo/index.js +++ b/demo/index.js @@ -415,7 +415,7 @@ async function setupCamera() { } const track = stream.getVideoTracks()[0]; const settings = track.getSettings(); - if (initialCameraAccess) log('selected video source:', track, settings); // log('selected camera:', track.label, 'id:', settings.deviceId); + if (initialCameraAccess) log('selected video source:', track, settings); ui.camera = { name: track.label.toLowerCase(), width: settings.width, height: settings.height, facing: settings.facingMode === 'user' ? 'front' : 'back' }; initialCameraAccess = false; diff --git a/demo/simple/index.html b/demo/simple/index.html index 896be6e3..7d0b5135 100644 --- a/demo/simple/index.html +++ b/demo/simple/index.html @@ -14,7 +14,7 @@ + + + + +

+  
+
diff --git a/demo/typescript/index.js b/demo/typescript/index.js
new file mode 100644
index 00000000..08fc7199
--- /dev/null
+++ b/demo/typescript/index.js
@@ -0,0 +1,77 @@
+/*
+  Human
+  homepage: 
+  author: '
+*/
+
+// demo/typescript/index.ts
+import Human from "../../dist/human.custom.esm.js";
+var config = {
+  modelBasePath: "../../models",
+  backend: "humangl"
+};
+var human = new Human(config);
+var result;
+var video = document.getElementById("video");
+var canvas = document.getElementById("canvas");
+var fps = { detect: 0, draw: 0, element: document.getElementById("status") };
+var log = (...msg) => console.log(...msg);
+var status = (msg) => {
+  if (fps.element)
+    fps.element.innerText = msg;
+};
+async function webCam() {
+  status("starting webcam...");
+  const options = { audio: false, video: { facingMode: "user", resizeMode: "none", width: { ideal: document.body.clientWidth } } };
+  const stream = await navigator.mediaDevices.getUserMedia(options);
+  const ready = new Promise((resolve) => {
+    video.onloadeddata = () => resolve(true);
+  });
+  video.srcObject = stream;
+  video.play();
+  await ready;
+  canvas.width = video.videoWidth;
+  canvas.height = video.videoHeight;
+  const track = stream.getVideoTracks()[0];
+  const capabilities = track.getCapabilities();
+  const settings = track.getSettings();
+  const constraints = track.getConstraints();
+  log("video:", video.videoWidth, video.videoHeight, { stream, track, settings, constraints, capabilities });
+  canvas.onclick = () => {
+    if (video.paused)
+      video.play();
+    else
+      video.pause();
+  };
+}
+async function detectionLoop() {
+  const t0 = human.now();
+  if (!video.paused)
+    result = await human.detect(video);
+  const t1 = human.now();
+  fps.detect = 1e3 / (t1 - t0);
+  requestAnimationFrame(detectionLoop);
+}
+async function drawLoop() {
+  const t0 = human.now();
+  if (!video.paused) {
+    const interpolated = await human.next(result);
+    await human.draw.canvas(video, canvas);
+    await human.draw.all(canvas, interpolated);
+  }
+  const t1 = human.now();
+  fps.draw = 1e3 / (t1 - t0);
+  status(video.paused ? "paused" : `fps: ${fps.detect.toFixed(1).padStart(5, " ")} detect / ${fps.draw.toFixed(1).padStart(5, " ")} draw`);
+  requestAnimationFrame(drawLoop);
+}
+async function main() {
+  status("loading...");
+  await human.load();
+  status("initializing...");
+  await human.warmup();
+  await webCam();
+  await detectionLoop();
+  await drawLoop();
+}
+window.onload = main;
+//# sourceMappingURL=index.js.map
diff --git a/demo/typescript/index.js.map b/demo/typescript/index.js.map
new file mode 100644
index 00000000..ef455df0
--- /dev/null
+++ b/demo/typescript/index.js.map
@@ -0,0 +1,7 @@
+{
+  "version": 3,
+  "sources": ["index.ts"],
+  "sourcesContent": ["/**\n * Human demo for browsers\n * @description Simple Human demo for browsers using WebCam\n */\n\nimport Human from '../../dist/human.custom.esm.js'; // equivalent of @vladmandic/human\n\nconst config = {\n  modelBasePath: '../../models',\n  backend: 'humangl',\n};\n\nconst human = new Human(config);\nlet result;\n\nconst video = document.getElementById('video') as HTMLVideoElement;\nconst canvas = document.getElementById('canvas') as HTMLCanvasElement;\nconst fps = { detect: 0, draw: 0, element: document.getElementById('status') };\n\n// eslint-disable-next-line no-console\nconst log = (...msg) => console.log(...msg);\nconst status = (msg) => { if (fps.element) fps.element.innerText = msg; };\n\nasync function webCam() {\n  status('starting webcam...');\n  const options = { audio: false, video: { facingMode: 'user', resizeMode: 'none', width: { ideal: document.body.clientWidth } } };\n  const stream: MediaStream = await navigator.mediaDevices.getUserMedia(options);\n  const ready = new Promise((resolve) => { video.onloadeddata = () => resolve(true); });\n  video.srcObject = stream;\n  video.play();\n  await ready;\n  canvas.width = video.videoWidth;\n  canvas.height = video.videoHeight;\n  const track: MediaStreamTrack = stream.getVideoTracks()[0];\n  const capabilities: MediaTrackCapabilities = track.getCapabilities();\n  const settings: MediaTrackSettings = track.getSettings();\n  const constraints: MediaTrackConstraints = track.getConstraints();\n  log('video:', video.videoWidth, video.videoHeight, { stream, track, settings, constraints, capabilities });\n  canvas.onclick = () => {\n    if (video.paused) video.play();\n    else video.pause();\n  };\n}\n\nasync function detectionLoop() {\n  const t0 = human.now();\n  if (!video.paused) result = await human.detect(video);\n  const t1 = human.now();\n  fps.detect = 1000 / (t1 - t0);\n  requestAnimationFrame(detectionLoop);\n}\n\nasync function drawLoop() {\n  const t0 = human.now();\n  if (!video.paused) {\n    const interpolated = await human.next(result);\n    await human.draw.canvas(video, canvas);\n    await human.draw.all(canvas, interpolated);\n  }\n  const t1 = human.now();\n  fps.draw = 1000 / (t1 - t0);\n  status(video.paused ? 'paused' : `fps: ${fps.detect.toFixed(1).padStart(5, ' ')} detect / ${fps.draw.toFixed(1).padStart(5, ' ')} draw`);\n  requestAnimationFrame(drawLoop);\n}\n\nasync function main() {\n  status('loading...');\n  await human.load();\n  status('initializing...');\n  await human.warmup();\n  await webCam();\n  await detectionLoop();\n  await drawLoop();\n}\n\nwindow.onload = main;\n"],
+  "mappings": ";;;;;;;AAKA;AAEA,IAAM,SAAS;AAAA,EACb,eAAe;AAAA,EACf,SAAS;AAAA;AAGX,IAAM,QAAQ,IAAI,MAAM;AACxB,IAAI;AAEJ,IAAM,QAAQ,SAAS,eAAe;AACtC,IAAM,SAAS,SAAS,eAAe;AACvC,IAAM,MAAM,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,SAAS,eAAe;AAGnE,IAAM,MAAM,IAAI,QAAQ,QAAQ,IAAI,GAAG;AACvC,IAAM,SAAS,CAAC,QAAQ;AAAE,MAAI,IAAI;AAAS,QAAI,QAAQ,YAAY;AAAA;AAEnE,wBAAwB;AACtB,SAAO;AACP,QAAM,UAAU,EAAE,OAAO,OAAO,OAAO,EAAE,YAAY,QAAQ,YAAY,QAAQ,OAAO,EAAE,OAAO,SAAS,KAAK;AAC/G,QAAM,SAAsB,MAAM,UAAU,aAAa,aAAa;AACtE,QAAM,QAAQ,IAAI,QAAQ,CAAC,YAAY;AAAE,UAAM,eAAe,MAAM,QAAQ;AAAA;AAC5E,QAAM,YAAY;AAClB,QAAM;AACN,QAAM;AACN,SAAO,QAAQ,MAAM;AACrB,SAAO,SAAS,MAAM;AACtB,QAAM,QAA0B,OAAO,iBAAiB;AACxD,QAAM,eAAuC,MAAM;AACnD,QAAM,WAA+B,MAAM;AAC3C,QAAM,cAAqC,MAAM;AACjD,MAAI,UAAU,MAAM,YAAY,MAAM,aAAa,EAAE,QAAQ,OAAO,UAAU,aAAa;AAC3F,SAAO,UAAU,MAAM;AACrB,QAAI,MAAM;AAAQ,YAAM;AAAA;AACnB,YAAM;AAAA;AAAA;AAIf,+BAA+B;AAC7B,QAAM,KAAK,MAAM;AACjB,MAAI,CAAC,MAAM;AAAQ,aAAS,MAAM,MAAM,OAAO;AAC/C,QAAM,KAAK,MAAM;AACjB,MAAI,SAAS,MAAQ,MAAK;AAC1B,wBAAsB;AAAA;AAGxB,0BAA0B;AACxB,QAAM,KAAK,MAAM;AACjB,MAAI,CAAC,MAAM,QAAQ;AACjB,UAAM,eAAe,MAAM,MAAM,KAAK;AACtC,UAAM,MAAM,KAAK,OAAO,OAAO;AAC/B,UAAM,MAAM,KAAK,IAAI,QAAQ;AAAA;AAE/B,QAAM,KAAK,MAAM;AACjB,MAAI,OAAO,MAAQ,MAAK;AACxB,SAAO,MAAM,SAAS,WAAW,QAAQ,IAAI,OAAO,QAAQ,GAAG,SAAS,GAAG,iBAAiB,IAAI,KAAK,QAAQ,GAAG,SAAS,GAAG;AAC5H,wBAAsB;AAAA;AAGxB,sBAAsB;AACpB,SAAO;AACP,QAAM,MAAM;AACZ,SAAO;AACP,QAAM,MAAM;AACZ,QAAM;AACN,QAAM;AACN,QAAM;AAAA;AAGR,OAAO,SAAS;",
+  "names": []
+}
diff --git a/demo/typescript/index.ts b/demo/typescript/index.ts
new file mode 100644
index 00000000..312c4e8b
--- /dev/null
+++ b/demo/typescript/index.ts
@@ -0,0 +1,76 @@
+/**
+ * Human demo for browsers
+ * @description Simple Human demo for browsers using WebCam
+ */
+
+import Human from '../../dist/human.custom.esm.js'; // equivalent of @vladmandic/human
+
+const config = {
+  modelBasePath: '../../models',
+  backend: 'humangl',
+};
+
+const human = new Human(config);
+let result;
+
+const video = document.getElementById('video') as HTMLVideoElement;
+const canvas = document.getElementById('canvas') as HTMLCanvasElement;
+const fps = { detect: 0, draw: 0, element: document.getElementById('status') };
+
+// eslint-disable-next-line no-console
+const log = (...msg) => console.log(...msg);
+const status = (msg) => { if (fps.element) fps.element.innerText = msg; };
+
+async function webCam() {
+  status('starting webcam...');
+  const options = { audio: false, video: { facingMode: 'user', resizeMode: 'none', width: { ideal: document.body.clientWidth } } };
+  const stream: MediaStream = await navigator.mediaDevices.getUserMedia(options);
+  const ready = new Promise((resolve) => { video.onloadeddata = () => resolve(true); });
+  video.srcObject = stream;
+  video.play();
+  await ready;
+  canvas.width = video.videoWidth;
+  canvas.height = video.videoHeight;
+  const track: MediaStreamTrack = stream.getVideoTracks()[0];
+  const capabilities: MediaTrackCapabilities = track.getCapabilities();
+  const settings: MediaTrackSettings = track.getSettings();
+  const constraints: MediaTrackConstraints = track.getConstraints();
+  log('video:', video.videoWidth, video.videoHeight, { stream, track, settings, constraints, capabilities });
+  canvas.onclick = () => {
+    if (video.paused) video.play();
+    else video.pause();
+  };
+}
+
+async function detectionLoop() {
+  const t0 = human.now();
+  if (!video.paused) result = await human.detect(video);
+  const t1 = human.now();
+  fps.detect = 1000 / (t1 - t0);
+  requestAnimationFrame(detectionLoop);
+}
+
+async function drawLoop() {
+  const t0 = human.now();
+  if (!video.paused) {
+    const interpolated = await human.next(result);
+    await human.draw.canvas(video, canvas);
+    await human.draw.all(canvas, interpolated);
+  }
+  const t1 = human.now();
+  fps.draw = 1000 / (t1 - t0);
+  status(video.paused ? 'paused' : `fps: ${fps.detect.toFixed(1).padStart(5, ' ')} detect / ${fps.draw.toFixed(1).padStart(5, ' ')} draw`);
+  requestAnimationFrame(drawLoop);
+}
+
+async function main() {
+  status('loading...');
+  await human.load();
+  status('initializing...');
+  await human.warmup();
+  await webCam();
+  await detectionLoop();
+  await drawLoop();
+}
+
+window.onload = main;
diff --git a/dist/human.custom.esm.js b/dist/human.custom.esm.js
index 32d383da..7989f0c9 100644
--- a/dist/human.custom.esm.js
+++ b/dist/human.custom.esm.js
@@ -5,7 +5,6 @@
 */
 
 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 __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
 var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
   get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
@@ -19,28 +18,6 @@ var __export = (target, all6) => {
   for (var name in all6)
     __defProp(target, name, { get: all6[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;
-};
 
 // src/util/util.ts
 function join(folder, file) {
@@ -70597,19 +70574,11 @@ var collect = (source, prefix, collection) => {
   });
 };
 var GLProgram = class {
+  uniform = {};
+  attribute = {};
+  gl;
+  id;
   constructor(gl, 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);
-      this.gl.shaderSource(shader, source);
-      this.gl.compileShader(shader);
-      if (!this.gl.getShaderParameter(shader, this.gl.COMPILE_STATUS))
-        throw new Error(`filter: gl compile failed: ${this.gl.getShaderInfoLog(shader)}`);
-      return shader;
-    });
     this.gl = gl;
     const vertexShader = this.compile(vertexSource, this.gl.VERTEX_SHADER);
     const fragmentShader = this.compile(fragmentSource, this.gl.FRAGMENT_SHADER);
@@ -70628,6 +70597,14 @@ var GLProgram = class {
     for (const u in this.uniform)
       this.uniform[u] = this.gl.getUniformLocation(this.id, u);
   }
+  compile = (source, type) => {
+    const shader = this.gl.createShader(type);
+    this.gl.shaderSource(shader, source);
+    this.gl.compileShader(shader);
+    if (!this.gl.getShaderParameter(shader, this.gl.COMPILE_STATUS))
+      throw new Error(`filter: gl compile failed: ${this.gl.getShaderInfoLog(shader)}`);
+    return shader;
+  };
 };
 function GLImageFilter() {
   let drawCount = 0;
@@ -71399,43 +71376,43 @@ async function skip(config3, input2) {
 
 // src/util/env.ts
 var Env = class {
+  browser;
+  node;
+  worker;
+  platform = "";
+  agent = "";
+  backends = [];
+  initial;
+  filter;
+  tfjs;
+  offscreen;
+  perfadd = false;
+  wasm = {
+    supported: void 0,
+    backend: void 0,
+    simd: void 0,
+    multithread: void 0
+  };
+  webgl = {
+    supported: void 0,
+    backend: void 0,
+    version: void 0,
+    renderer: void 0
+  };
+  webgpu = {
+    supported: void 0,
+    backend: void 0,
+    adapter: void 0
+  };
+  cpu = {
+    model: void 0,
+    flags: []
+  };
+  kernels = [];
+  Canvas;
+  Image;
+  ImageData;
   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, "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
-    });
-    __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";
     this.tfjs = { version: version_core };
@@ -79049,13 +79026,13 @@ var anchors2 = [
 
 // src/hand/handposedetector.ts
 var HandDetector = class {
+  model;
+  anchors;
+  anchorsTensor;
+  inputSize;
+  inputSizeTensor;
+  doubleInputSizeTensor;
   constructor(model15) {
-    __publicField(this, "model");
-    __publicField(this, "anchors");
-    __publicField(this, "anchorsTensor");
-    __publicField(this, "inputSize");
-    __publicField(this, "inputSizeTensor");
-    __publicField(this, "doubleInputSizeTensor");
     this.model = model15;
     this.anchors = anchors2.map((anchor) => [anchor.x, anchor.y]);
     this.anchorsTensor = tensor2d(this.anchors);
@@ -79130,13 +79107,13 @@ var palmLandmarksPalmBase = 0;
 var palmLandmarksMiddleFingerBase = 2;
 var lastTime8 = 0;
 var HandPipeline = class {
+  handDetector;
+  handPoseModel;
+  inputSize;
+  storedBoxes;
+  skipped;
+  detectedHands;
   constructor(handDetector, handPoseModel2) {
-    __publicField(this, "handDetector");
-    __publicField(this, "handPoseModel");
-    __publicField(this, "inputSize");
-    __publicField(this, "storedBoxes");
-    __publicField(this, "skipped");
-    __publicField(this, "detectedHands");
     this.handDetector = handDetector;
     this.handPoseModel = handPoseModel2;
     this.inputSize = this.handPoseModel && this.handPoseModel.inputs[0].shape ? this.handPoseModel.inputs[0].shape[2] : 0;
@@ -79307,12 +79284,12 @@ var FingerDirection = {
   getName: (value) => FingerDirection.nameMapping[value]
 };
 var FingerGesture = class {
+  name;
+  curls;
+  directions;
+  weights;
+  weightsRelative;
   constructor(name) {
-    __publicField(this, "name");
-    __publicField(this, "curls");
-    __publicField(this, "directions");
-    __publicField(this, "weights");
-    __publicField(this, "weightsRelative");
     this.name = name;
     this.curls = {};
     this.directions = {};
@@ -80463,10 +80440,10 @@ function scalePoses(poses, [height, width], [inputResolutionHeight, inputResolut
   return scaledPoses;
 }
 var MaxHeap = class {
+  priorityQueue;
+  numberOfElements;
+  getElementValue;
   constructor(maxSize2, getElementValue) {
-    __publicField(this, "priorityQueue");
-    __publicField(this, "numberOfElements");
-    __publicField(this, "getElementValue");
     this.priorityQueue = new Array(maxSize2);
     this.numberOfElements = -1;
     this.getElementValue = getElementValue;
@@ -80795,29 +80772,27 @@ async function process5(input2, background, config3) {
 
 // src/models.ts
 var Models = class {
-  constructor() {
-    __publicField(this, "age", null);
-    __publicField(this, "agegenderrace", null);
-    __publicField(this, "blazeposedetect", null);
-    __publicField(this, "blazepose", null);
-    __publicField(this, "centernet", null);
-    __publicField(this, "efficientpose", null);
-    __publicField(this, "embedding", null);
-    __publicField(this, "emotion", null);
-    __publicField(this, "facedetect", null);
-    __publicField(this, "faceiris", null);
-    __publicField(this, "facemesh", null);
-    __publicField(this, "faceres", null);
-    __publicField(this, "gender", null);
-    __publicField(this, "handpose", null);
-    __publicField(this, "handskeleton", null);
-    __publicField(this, "handtrack", null);
-    __publicField(this, "movenet", null);
-    __publicField(this, "nanodet", null);
-    __publicField(this, "posenet", null);
-    __publicField(this, "segmentation", null);
-    __publicField(this, "antispoof", null);
-  }
+  age = null;
+  agegenderrace = null;
+  blazeposedetect = null;
+  blazepose = null;
+  centernet = null;
+  efficientpose = null;
+  embedding = null;
+  emotion = null;
+  facedetect = null;
+  faceiris = null;
+  facemesh = null;
+  faceres = null;
+  gender = null;
+  handpose = null;
+  handskeleton = null;
+  handtrack = null;
+  movenet = null;
+  nanodet = null;
+  posenet = null;
+  segmentation = null;
+  antispoof = null;
 };
 function reset(instance) {
   for (const model15 of Object.keys(instance.models))
@@ -82926,57 +82901,25 @@ async function warmup(instance, userConfig) {
 }
 
 // src/human.ts
-var _numTensors, _analyzeMemoryLeaks, _checkSanity, _sanity;
 var Human = class {
+  version;
+  config;
+  result;
+  state;
+  process;
+  tf;
+  env;
+  draw;
+  models;
+  events;
+  faceTriangulation;
+  faceUVMap;
+  performance;
+  #numTensors;
+  #analyzeMemoryLeaks;
+  #checkSanity;
+  gl;
   constructor(userConfig) {
-    __publicField(this, "version");
-    __publicField(this, "config");
-    __publicField(this, "result");
-    __publicField(this, "state");
-    __publicField(this, "process");
-    __publicField(this, "tf");
-    __publicField(this, "env");
-    __publicField(this, "draw");
-    __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, "gl");
-    __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, (input2) => {
-      if (!__privateGet(this, _checkSanity))
-        return null;
-      if (!input2)
-        return "input is not defined";
-      if (this.env.node && !(input2 instanceof Tensor))
-        return "input must be a tensor";
-      try {
-        this.tf.getBackend();
-      } catch {
-        return "backend not loaded";
-      }
-      return null;
-    });
-    __publicField(this, "similarity", similarity);
-    __publicField(this, "distance", distance);
-    __publicField(this, "match", match2);
-    __publicField(this, "emit", (event) => {
-      if (this.events && this.events.dispatchEvent)
-        this.events?.dispatchEvent(new Event(event));
-    });
     this.env = env2;
     config.wasmPath = version_core.includes("-") ? "https://vladmandic.github.io/tfjs/dist/" : `https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${version_core}/dist/`;
     config.modelBasePath = env2.browser ? "../models/" : "file://models/";
@@ -82989,9 +82932,9 @@ var Human = class {
       this.config = mergeDeep(this.config, userConfig);
     this.tf = tfjs_esm_exports;
     this.state = "idle";
-    __privateSet(this, _numTensors, 0);
-    __privateSet(this, _analyzeMemoryLeaks, false);
-    __privateSet(this, _checkSanity, false);
+    this.#numTensors = 0;
+    this.#analyzeMemoryLeaks = false;
+    this.#checkSanity = false;
     this.performance = { backend: 0, load: 0, image: 0, frames: 0, cached: 0, changed: 0, total: 0, draw: 0 };
     this.events = typeof EventTarget !== "undefined" ? new EventTarget() : void 0;
     this.models = new Models();
@@ -83013,6 +82956,30 @@ var Human = class {
     this.gl = config2;
     this.emit("create");
   }
+  analyze = (...msg) => {
+    if (!this.#analyzeMemoryLeaks)
+      return;
+    const currentTensors = this.tf.engine().state.numTensors;
+    const previousTensors = this.#numTensors;
+    this.#numTensors = currentTensors;
+    const leaked = currentTensors - previousTensors;
+    if (leaked !== 0)
+      log(...msg, leaked);
+  };
+  #sanity = (input2) => {
+    if (!this.#checkSanity)
+      return null;
+    if (!input2)
+      return "input is not defined";
+    if (this.env.node && !(input2 instanceof Tensor))
+      return "input must be a tensor";
+    try {
+      this.tf.getBackend();
+    } catch {
+      return "backend not loaded";
+    }
+    return null;
+  };
   reset() {
     const currentBackend = this.config.backend;
     this.config = JSON.parse(JSON.stringify(config));
@@ -83021,6 +82988,9 @@ var Human = class {
   validate(userConfig) {
     return validate(config, userConfig || this.config);
   }
+  similarity = similarity;
+  distance = distance;
+  match = match2;
   now() {
     return now();
   }
@@ -83054,6 +83024,8 @@ var Human = class {
       if (this.env.browser) {
         if (this.config.debug)
           log("configuration:", this.config);
+        if (this.config.debug)
+          log("environment:", this.env);
         if (this.config.debug)
           log("tf flags:", this.tf.ENV["flags"]);
       }
@@ -83071,6 +83043,10 @@ var Human = class {
     if (current > (this.performance.load || 0))
       this.performance.load = this.env.perfadd ? (this.performance.load || 0) + current : current;
   }
+  emit = (event) => {
+    if (this.events && this.events.dispatchEvent)
+      this.events?.dispatchEvent(new Event(event));
+  };
   next(result = this.result) {
     return calc2(result, this.config);
   }
@@ -83084,7 +83060,7 @@ var Human = class {
       let timeStamp;
       this.config = mergeDeep(this.config, userConfig);
       this.state = "check";
-      const error = __privateGet(this, _sanity).call(this, input2);
+      const error = this.#sanity(input2);
       if (error) {
         log(error, input2);
         resolve({ error });
@@ -83231,10 +83207,6 @@ var Human = class {
     });
   }
 };
-_numTensors = new WeakMap();
-_analyzeMemoryLeaks = new WeakMap();
-_checkSanity = new WeakMap();
-_sanity = new WeakMap();
 export {
   Human,
   Human as default,
diff --git a/dist/human.custom.esm.js.map b/dist/human.custom.esm.js.map
index 09a5f7e5..450e4c22 100644
--- a/dist/human.custom.esm.js.map
+++ b/dist/human.custom.esm.js.map
@@ -1,7 +1,7 @@
 {
   "version": 3,
   "sources": ["../src/util/util.ts", "../src/config.ts", "tfjs.esm.js", "../src/image/imagefxshaders.ts", "../src/image/imagefx.ts", "../src/image/image.ts", "../src/util/env.ts", "../src/gear/gear-agegenderrace.ts", "../src/face/antispoof.ts", "../src/face/facemeshcoords.ts", "../src/face/facemeshutil.ts", "../src/face/blazeface.ts", "../src/body/blazeposecoords.ts", "../src/body/blazepose.ts", "../src/object/labels.ts", "../src/object/centernet.ts", "../src/body/efficientposecoords.ts", "../src/body/efficientpose.ts", "../src/gear/emotion.ts", "../src/face/iris.ts", "../src/face/facemesh.ts", "../src/face/faceres.ts", "../src/hand/handposeutil.ts", "../src/hand/handposeanchors.ts", "../src/hand/handposedetector.ts", "../src/hand/handposepipeline.ts", "../src/hand/fingerdef.ts", "../src/hand/fingergesture.ts", "../src/hand/fingerpose.ts", "../src/hand/handpose.ts", "../src/util/box.ts", "../src/hand/handtrack.ts", "../src/body/movenetcoords.ts", "../src/body/movenetfix.ts", "../src/body/movenet.ts", "../src/object/nanodet.ts", "../src/body/posenetutils.ts", "../src/body/posenet.ts", "../src/segmentation/segmentation.ts", "../src/models.ts", "../src/tfjs/humangl.ts", "../src/tfjs/backend.ts", "../src/util/draw.ts", "../src/face/angles.ts", "../src/face/face.ts", "../src/gesture/gesture.ts", "../src/util/interpolate.ts", "../src/face/match.ts", "../src/util/persons.ts", "../src/sample.ts", "../src/warmup.ts", "../src/human.ts"],
-  "sourcesContent": ["/**\n * Simple helper functions used accross codebase\n */\n\n// helper function: join two paths\nexport function join(folder: string, file: string): string {\n  const separator = folder.endsWith('/') ? '' : '/';\n  const skipJoin = file.startsWith('.') || file.startsWith('/') || file.startsWith('http:') || file.startsWith('https:') || file.startsWith('file:');\n  const path = skipJoin ? `${file}` : `${folder}${separator}${file}`;\n  if (!path.toLocaleLowerCase().includes('.json')) throw new Error(`modelpath error: ${path} expecting json file`);\n  return path;\n}\n\n// helper function: wrapper around console output\nexport function log(...msg): void {\n  const dt = new Date();\n  const ts = `${dt.getHours().toString().padStart(2, '0')}:${dt.getMinutes().toString().padStart(2, '0')}:${dt.getSeconds().toString().padStart(2, '0')}.${dt.getMilliseconds().toString().padStart(3, '0')}`;\n  // eslint-disable-next-line no-console\n  if (msg) console.log(ts, 'Human:', ...msg);\n}\n\n// helper function: gets elapsed time on both browser and nodejs\nexport const now = () => {\n  if (typeof performance !== 'undefined') return performance.now();\n  return parseInt((Number(process.hrtime.bigint()) / 1000 / 1000).toString());\n};\n\n// helper function: checks current config validity\nexport function validate(defaults, config, parent = 'config', msgs: Array<{ 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 inheriance with overrides\nexport function mergeDeep(...objects) {\n  const isObject = (obj) => obj && typeof obj === 'object';\n  return objects.reduce((prev, obj) => {\n    Object.keys(obj || {}).forEach((key) => {\n      const pVal = prev[key];\n      const oVal = obj[key];\n      if (Array.isArray(pVal) && Array.isArray(oVal)) prev[key] = pVal.concat(...oVal);\n      else if (isObject(pVal) && isObject(oVal)) prev[key] = mergeDeep(pVal, oVal);\n      else prev[key] = oVal;\n    });\n    return prev;\n  }, {});\n}\n\n// helper function: return min and max from input array\nexport const minmax = (data: Array) => data.reduce((acc: Array, val) => {\n  acc[0] = (acc[0] === undefined || val < acc[0]) ? val : acc[0];\n  acc[1] = (acc[1] === undefined || val > acc[1]) ? val : acc[1];\n  return acc;\n}, []);\n\n// helper function: async wait\nexport async function wait(time) {\n  const waiting = new Promise((resolve) => setTimeout(() => resolve(true), time));\n  await waiting;\n}\n", "/* eslint-disable indent */\n/* eslint-disable no-multi-spaces */\n\n/** Generic config type inherited by all module types */\nexport interface GenericConfig {\n  /** @property is module enabled? */\n  enabled: boolean,\n  /** @property path to model json file */\n  modelPath: string,\n  /** @property how many max frames to go without re-running model if cached results are acceptable */\n  skipFrames: number,\n  /** @property how many max miliseconds to go without re-running model if cached results are acceptable */\n  skipTime: number,\n}\n\n/** Dectector part of face configuration */\nexport interface FaceDetectorConfig extends GenericConfig {\n  /** @property is face rotation correction performed after detecting face? */\n  rotation: boolean,\n  /** @property maximum number of detected faces */\n  maxDetected: number,\n  /** @property minimum confidence for a detected face before results are discarded */\n  minConfidence: number,\n  /** @property minimum overlap between two detected faces before one is discarded */\n  iouThreshold: number,\n  /** @property should face detection return face tensor to be used in some other extenrnal model? */\n  return: boolean,\n}\n\n/** Mesh part of face configuration */\nexport interface FaceMeshConfig extends GenericConfig {}\n\n/** Iris part of face configuration */\nexport interface FaceIrisConfig 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  /** @property 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  /** @property 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/** 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  iris: Partial,\n  description: Partial,\n  emotion: Partial,\n  antispoof: Partial,\n}\n\n/** Configures all body detection specific options */\nexport interface BodyConfig extends GenericConfig {\n  /** @property maximum numboer of detected bodies */\n  maxDetected: number,\n  /** @property minimum confidence for a detected body before results are discarded */\n  minConfidence: number,\n  detector?: {\n    /** @property path to optional body detector model json file */\n    modelPath: string\n  },\n}\n\n/** Configures all hand detection specific options */\nexport interface HandConfig extends GenericConfig {\n  /** @property should hand rotation correction be performed after hand detection? */\n  rotation: boolean,\n  /** @property minimum confidence for a detected hand before results are discarded */\n  minConfidence: number,\n  /** @property minimum overlap between two detected hands before one is discarded */\n  iouThreshold: number,\n  /** @property maximum number of detected hands */\n  maxDetected: number,\n  /** @property should hand landmarks be detected or just return detected hand box */\n  landmarks: boolean,\n  detector: {\n    /** @property path to hand detector model json */\n    modelPath?: string,\n  },\n  skeleton: {\n    /** @property 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  /** @property minimum confidence for a detected objects before results are discarded */\n  minConfidence: number,\n  /** @property minimum overlap between two detected objects before one is discarded */\n  iouThreshold: number,\n  /** @property 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  /** @property blur segmentation output by  pixels for more realistic image */\n  blur: number,\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  /** @property are image filters enabled? */\n  enabled: boolean,\n  /** Resize input width\n  * - if both width and height are set to 0, there is no resizing\n  * - if just one is set, second one is scaled automatically\n  * - if both are set, values are used as-is\n  */\n  width: number,\n  /** Resize input height\n  * - if both width and height are set to 0, there is no resizing\n  * - if just one is set, second one is scaled automatically\n  * - if both are set, values are used as-is\n  */\n  height: number,\n  /** @property return processed canvas imagedata in result */\n  return: boolean,\n  /** @property flip input as mirror image */\n  flip: boolean,\n  /** @property range: -1 (darken) to 1 (lighten) */\n  brightness: number,\n  /** @property range: -1 (reduce contrast) to 1 (increase contrast) */\n  contrast: number,\n  /** @property range: 0 (no sharpening) to 1 (maximum sharpening) */\n  sharpness: number,\n  /** @property range: 0 (no blur) to N (blur radius in pixels) */\n  blur: number\n  /** @property range: -1 (reduce saturation) to 1 (increase saturation) */\n  saturation: number,\n  /** @property range: 0 (no change) to 360 (hue rotation in degrees) */\n  hue: number,\n  /** @property image negative */\n  negative: boolean,\n  /** @property image sepia colors */\n  sepia: boolean,\n  /** @property image vintage colors */\n  vintage: boolean,\n  /** @property image kodachrome colors */\n  kodachrome: boolean,\n  /** @property image technicolor colors */\n  technicolor: boolean,\n  /** @property image polaroid camera effect */\n  polaroid: boolean,\n  /** @property range: 0 (no pixelate) to N (number of pixels to pixelate) */\n  pixelate: number,\n}\n\n/** Controlls gesture detection */\nexport interface GestureConfig {\n  /** @property is gesture detection enabled? */\n  enabled: boolean,\n}\n\n/**\n * Configuration interface definition for **Human** library\n *\n * Contains all configurable parameters\n * @typedef Config\n *\n * Defaults: [config](https://github.com/vladmandic/human/blob/main/src/config.ts#L292)\n */\nexport interface Config {\n  /** Backend used for TFJS operations\n   * Valid build-in backends are:\n   * - Browser: `cpu`, `wasm`, `webgl`, `humangl`\n   * - NodeJS: `cpu`, `wasm`, `tensorflow`\n   *\n   * Experimental:\n   * - Browser: `webgpu` - requires custom build of `tfjs-backend-webgpu`\n   *\n   * Defaults: `humangl` for browser and `tensorflow` for nodejs\n  */\n  backend: '' | 'cpu' | 'wasm' | 'webgl' | 'humangl' | 'tensorflow' | 'webgpu',\n  // backend: string;\n\n  /** Path to *.wasm files if backend is set to `wasm`\n   * - if not set, auto-detects to link to CDN `jsdelivr` when running in browser\n  */\n  wasmPath: string,\n\n  /** Print debug statements to console */\n  debug: boolean,\n\n  /** Perform model loading and inference concurrently or sequentially */\n  async: boolean,\n\n  /** What to use for `human.warmup()`\n   * - warmup pre-initializes all models for faster inference but can take significant time on startup\n  */\n  warmup: 'none' | 'face' | 'full' | 'body',\n  // warmup: string;\n\n  /** Base model path (typically starting with file://, http:// or https://) for all models\n   * - individual modelPath values are relative to this path\n  */\n  modelBasePath: string,\n\n  /** Cache sensitivity\n   * - values 0..1 where 0.01 means reset cache if input changed more than 1%\n   * - set to 0 to disable caching\n  */\n  cacheSensitivity: number;\n\n  /** Internal Variable */\n  skipAllowed: boolean;\n\n  /** {@link FilterConfig} */\n  filter: Partial,\n\n  /** {@link GestureConfig} */\n  gesture: Partial;\n\n  /** {@link FaceConfig} */\n  face: Partial,\n\n  /** {@link BodyConfig} */\n  body: Partial,\n\n  /** {@link HandConfig} */\n  hand: Partial,\n\n  /** {@link ObjectConfig} */\n  object: Partial,\n\n  /** {@link SegmentationConfig} */\n  segmentation: Partial,\n}\n\n/** - [See all default Config values...](https://github.com/vladmandic/human/blob/main/src/config.ts#L250) */\nconst config: Config = {\n  backend: '',               // select tfjs backend to use, leave empty to use default backend\n                             // for browser environments: 'webgl', 'wasm', 'cpu', or 'humangl' (which is a custom version of webgl)\n                             // for nodejs environments: 'tensorflow', 'wasm', 'cpu'\n                             // default set to `humangl` for browsers and `tensorflow` for nodejs\n  modelBasePath: '',         // base path for all models\n                             // default set to `../models/` for browsers and `file://models/` for nodejs\n  wasmPath: '',              // path for wasm binaries, only used for backend: wasm\n                             // default set to download from jsdeliv during Human class instantiation\n  debug: true,               // print additional status messages to console\n  async: true,               // execute enabled models in parallel\n  warmup: 'full',            // what to use for human.warmup(), can be 'none', 'face', 'full'\n                             // warmup pre-initializes all models for faster inference but can take\n                             // significant time on startup\n                             // only used for `webgl` and `humangl` backends\n  cacheSensitivity: 0.70,    // 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  skipAllowed: false,        // internal & dynamic\n  filter: {                  // run input through image filters before inference\n                             // image filters run with near-zero latency as they are executed on the GPU\n    enabled: true,           // enable image pre-processing filters\n    width: 0,                // resize input width\n    height: 0,               // resize input height\n                             // if both width and height are set to 0, there is no resizing\n                             // if just one is set, second one is scaled automatically\n                             // if both are set, values are used as-is\n    flip: false,             // flip input as mirror image\n    return: true,            // return processed canvas imagedata in result\n    brightness: 0,           // range: -1 (darken) to 1 (lighten)\n    contrast: 0,             // range: -1 (reduce contrast) to 1 (increase contrast)\n    sharpness: 0,            // range: 0 (no sharpening) to 1 (maximum sharpening)\n    blur: 0,                 // range: 0 (no blur) to N (blur radius in pixels)\n    saturation: 0,           // range: -1 (reduce saturation) to 1 (increase saturation)\n    hue: 0,                  // range: 0 (no change) to 360 (hue rotation in degrees)\n    negative: false,         // image negative\n    sepia: false,            // image sepia colors\n    vintage: false,          // image vintage colors\n    kodachrome: false,       // image kodachrome colors\n    technicolor: false,      // image technicolor colors\n    polaroid: false,         // image polaroid camera effect\n    pixelate: 0,             // range: 0 (no pixelate) to N (number of pixels to pixelate)\n  },\n\n  gesture: {\n    enabled: true,           // enable gesture recognition based on model results\n  },\n\n  face: {\n    enabled: true,           // controls if specified modul is enabled\n                             // face.enabled is required for all face models:\n                             // detector, mesh, iris, age, gender, emotion\n                             // (note: module is not loaded until it is required)\n    detector: {\n      modelPath: 'blazeface.json', // detector model, can be absolute path or relative to modelBasePath\n      rotation: true,        // use best-guess rotated face image or just box with rotation as-is\n                             // false means higher performance, but incorrect mesh mapping if face angle is above 20 degrees\n                             // this parameter is not valid in nodejs\n      maxDetected: 1,        // maximum number of faces detected in the input\n                             // should be set to the minimum number for performance\n      skipFrames: 99,        // how many max frames to go without re-running the face bounding box detector\n                             // only used when cacheSensitivity is not zero\n      skipTime: 2500,        // how many ms to go without re-running the face bounding box detector\n                             // only used when cacheSensitivity is not zero\n      minConfidence: 0.2,    // threshold for discarding a prediction\n      iouThreshold: 0.1,     // ammount of overlap between two detected objects before one object is removed\n      return: false,         // return extracted face as tensor\n                              // in which case user is reponsible for disposing the tensor\n    },\n\n    mesh: {\n      enabled: true,\n      modelPath: 'facemesh.json',  // facemesh model, can be absolute path or relative to modelBasePath\n    },\n\n    iris: {\n      enabled: true,\n      modelPath: 'iris.json',  // face iris model\n                             // can be either absolute path or relative to modelBasePath\n    },\n\n    emotion: {\n      enabled: true,\n      minConfidence: 0.1,    // threshold for discarding a prediction\n      skipFrames: 99,        // how max many frames to go without re-running the detector\n                             // only used when cacheSensitivity is not zero\n      skipTime: 1500,        // how many ms to go without re-running the face bounding box detector\n                             // only used when cacheSensitivity is not zero\n      modelPath: 'emotion.json',  // face emotion model, can be absolute path or relative to modelBasePath\n    },\n\n    description: {\n      enabled: true,         // to improve accuracy of face description extraction it is\n                             // recommended to enable detector.rotation and mesh.enabled\n      modelPath: 'faceres.json',  // face description model\n                             // can be either absolute path or relative to modelBasePath\n      skipFrames: 99,        // how many max frames to go without re-running the detector\n                             // only used when cacheSensitivity is not zero\n      skipTime: 3000,        // how many ms to go without re-running the face bounding box detector\n                             // only used when cacheSensitivity is not zero\n      minConfidence: 0.1,    // threshold for discarding a prediction\n    },\n\n    antispoof: {\n      enabled: false,\n      skipFrames: 99,        // how max many frames to go without re-running the detector\n                             // only used when cacheSensitivity is not zero\n      skipTime: 4000,        // how many ms to go without re-running the face bounding box detector\n                             // only used when cacheSensitivity is not zero\n      modelPath: 'antispoof.json',  // face description model\n                             // can be either absolute path or relative to modelBasePath\n    },\n  },\n\n  body: {\n    enabled: true,\n    modelPath: 'movenet-lightning.json',  // body model, can be absolute path or relative to modelBasePath\n                             // can be 'posenet', 'blazepose', 'efficientpose', 'movenet-lightning', 'movenet-thunder'\n    detector: {\n      modelPath: '',         // optional body detector\n    },\n    maxDetected: -1,         // maximum number of people detected in the input\n                             // should be set to the minimum number for performance\n                             // only valid for posenet and movenet-multipose as other models detects single pose\n                             // set to -1 to autodetect based on number of detected faces\n    minConfidence: 0.3,      // threshold for discarding a prediction\n    skipFrames: 1,           // how many max frames to go without re-running the detector\n                             // only used when cacheSensitivity is not zero\n    skipTime: 200,           // how many ms to go without re-running the face bounding box detector\n                             // only used when cacheSensitivity is not zero\n},\n\n  hand: {\n    enabled: true,\n    rotation: true,          // use best-guess rotated hand image or just box with rotation as-is\n                             // false means higher performance, but incorrect finger mapping if hand is inverted\n                             // only valid for `handdetect` variation\n    skipFrames: 99,          // how many max frames to go without re-running the hand bounding box detector\n                             // only used when cacheSensitivity is not zero\n    skipTime: 2000,          // how many ms to go without re-running the face bounding box detector\n                             // only used when cacheSensitivity is not zero\n    minConfidence: 0.50,     // threshold for discarding a prediction\n    iouThreshold: 0.2,       // ammount of overlap between two detected objects before one object is removed\n    maxDetected: -1,         // maximum number of hands detected in the input\n                             // should be set to the minimum number for performance\n                             // set to -1 to autodetect based on number of detected faces\n    landmarks: true,         // detect hand landmarks or just hand boundary box\n    detector: {\n      modelPath: 'handtrack.json',  // hand detector model, can be absolute path or relative to modelBasePath\n                             // can be 'handdetect' or 'handtrack'\n    },\n    skeleton: {\n      modelPath: 'handskeleton.json',  // hand skeleton model, can be absolute path or relative to modelBasePath\n    },\n  },\n\n  object: {\n    enabled: false,\n    modelPath: 'mb3-centernet.json',  // experimental: object detection model, can be absolute path or relative to modelBasePath\n                             // can be 'mb3-centernet' or 'nanodet'\n    minConfidence: 0.2,      // threshold for discarding a prediction\n    iouThreshold: 0.4,       // ammount of overlap between two detected objects before one object is removed\n    maxDetected: 10,         // maximum number of objects detected in the input\n    skipFrames: 99,          // how many max frames to go without re-running the detector\n                             // only used when cacheSensitivity is not zero\n    skipTime: 1000,          // how many ms to go without re-running object detector\n                             // only used when cacheSensitivity is not zero\n  },\n\n  segmentation: {\n    enabled: false,          // controlls and configures all body segmentation module\n                             // removes background from input containing person\n                             // if segmentation is enabled it will run as preprocessing task before any other model\n                             // alternatively leave it disabled and use it on-demand using human.segmentation method which can\n                             // remove background or replace it with user-provided background\n    modelPath: 'selfie.json',  // experimental: object detection model, can be absolute path or relative to modelBasePath\n                             // can be 'selfie' or 'meet'\n    blur: 8,                 // blur segmentation output by n pixels for more realistic image\n  },\n};\n\nexport { config as defaults };\n", "/*\n  Human\n  homepage: \n  author: '\n*/\n\nvar __require = /* @__PURE__ */ ((x) => typeof require !== \"undefined\" ? require : typeof Proxy !== \"undefined\" ? new Proxy(x, {\n  get: (a, b) => (typeof require !== \"undefined\" ? require : a)[b]\n}) : x)(function(x) {\n  if (typeof require !== \"undefined\")\n    return require.apply(this, arguments);\n  throw new Error('Dynamic require of \"' + x + '\" is not supported');\n});\n\n// ../tfjs/dist/tfjs.esm.js\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __markAsModule = (target) => __defProp(target, \"__esModule\", { value: true });\nvar __require2 = ((x) => typeof __require !== \"undefined\" ? __require : typeof Proxy !== \"undefined\" ? new Proxy(x, {\n  get: (a, b) => (typeof __require !== \"undefined\" ? __require : a)[b]\n}) : x)(function(x) {\n  if (typeof __require !== \"undefined\")\n    return __require.apply(this, arguments);\n  throw new Error('Dynamic require of \"' + x + '\" is not supported');\n});\nvar __commonJS = (cb, mod4) => function __require22() {\n  return mod4 || (0, cb[Object.keys(cb)[0]])((mod4 = { exports: {} }).exports, mod4), mod4.exports;\n};\nvar __export = (target, all5) => {\n  __markAsModule(target);\n  for (var name in all5)\n    __defProp(target, name, { get: all5[name], enumerable: true });\n};\nvar __reExport = (target, module, desc) => {\n  if (module && typeof module === \"object\" || typeof module === \"function\") {\n    for (let key of __getOwnPropNames(module))\n      if (!__hasOwnProp.call(target, key) && key !== \"default\")\n        __defProp(target, key, { get: () => module[key], enumerable: !(desc = __getOwnPropDesc(module, key)) || desc.enumerable });\n  }\n  return target;\n};\nvar __toModule = (module) => {\n  return __reExport(__markAsModule(__defProp(module != null ? __create(__getProtoOf(module)) : {}, \"default\", module && module.__esModule && \"default\" in module ? { get: () => module.default, enumerable: true } : { value: module, enumerable: true })), module);\n};\nvar require_long = __commonJS({\n  \"node_modules/.pnpm/long@4.0.0/node_modules/long/src/long.js\"(exports, module) {\n    module.exports = Long2;\n    var wasm = null;\n    try {\n      wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([\n        0,\n        97,\n        115,\n        109,\n        1,\n        0,\n        0,\n        0,\n        1,\n        13,\n        2,\n        96,\n        0,\n        1,\n        127,\n        96,\n        4,\n        127,\n        127,\n        127,\n        127,\n        1,\n        127,\n        3,\n        7,\n        6,\n        0,\n        1,\n        1,\n        1,\n        1,\n        1,\n        6,\n        6,\n        1,\n        127,\n        1,\n        65,\n        0,\n        11,\n        7,\n        50,\n        6,\n        3,\n        109,\n        117,\n        108,\n        0,\n        1,\n        5,\n        100,\n        105,\n        118,\n        95,\n        115,\n        0,\n        2,\n        5,\n        100,\n        105,\n        118,\n        95,\n        117,\n        0,\n        3,\n        5,\n        114,\n        101,\n        109,\n        95,\n        115,\n        0,\n        4,\n        5,\n        114,\n        101,\n        109,\n        95,\n        117,\n        0,\n        5,\n        8,\n        103,\n        101,\n        116,\n        95,\n        104,\n        105,\n        103,\n        104,\n        0,\n        0,\n        10,\n        191,\n        1,\n        6,\n        4,\n        0,\n        35,\n        0,\n        11,\n        36,\n        1,\n        1,\n        126,\n        32,\n        0,\n        173,\n        32,\n        1,\n        173,\n        66,\n        32,\n        134,\n        132,\n        32,\n        2,\n        173,\n        32,\n        3,\n        173,\n        66,\n        32,\n        134,\n        132,\n        126,\n        34,\n        4,\n        66,\n        32,\n        135,\n        167,\n        36,\n        0,\n        32,\n        4,\n        167,\n        11,\n        36,\n        1,\n        1,\n        126,\n        32,\n        0,\n        173,\n        32,\n        1,\n        173,\n        66,\n        32,\n        134,\n        132,\n        32,\n        2,\n        173,\n        32,\n        3,\n        173,\n        66,\n        32,\n        134,\n        132,\n        127,\n        34,\n        4,\n        66,\n        32,\n        135,\n        167,\n        36,\n        0,\n        32,\n        4,\n        167,\n        11,\n        36,\n        1,\n        1,\n        126,\n        32,\n        0,\n        173,\n        32,\n        1,\n        173,\n        66,\n        32,\n        134,\n        132,\n        32,\n        2,\n        173,\n        32,\n        3,\n        173,\n        66,\n        32,\n        134,\n        132,\n        128,\n        34,\n        4,\n        66,\n        32,\n        135,\n        167,\n        36,\n        0,\n        32,\n        4,\n        167,\n        11,\n        36,\n        1,\n        1,\n        126,\n        32,\n        0,\n        173,\n        32,\n        1,\n        173,\n        66,\n        32,\n        134,\n        132,\n        32,\n        2,\n        173,\n        32,\n        3,\n        173,\n        66,\n        32,\n        134,\n        132,\n        129,\n        34,\n        4,\n        66,\n        32,\n        135,\n        167,\n        36,\n        0,\n        32,\n        4,\n        167,\n        11,\n        36,\n        1,\n        1,\n        126,\n        32,\n        0,\n        173,\n        32,\n        1,\n        173,\n        66,\n        32,\n        134,\n        132,\n        32,\n        2,\n        173,\n        32,\n        3,\n        173,\n        66,\n        32,\n        134,\n        132,\n        130,\n        34,\n        4,\n        66,\n        32,\n        135,\n        167,\n        36,\n        0,\n        32,\n        4,\n        167,\n        11\n      ])), {}).exports;\n    } catch (e) {\n    }\n    function Long2(low, high, unsigned) {\n      this.low = low | 0;\n      this.high = high | 0;\n      this.unsigned = !!unsigned;\n    }\n    Long2.prototype.__isLong__;\n    Object.defineProperty(Long2.prototype, \"__isLong__\", { value: true });\n    function isLong(obj) {\n      return (obj && obj[\"__isLong__\"]) === true;\n    }\n    Long2.isLong = isLong;\n    var INT_CACHE = {};\n    var UINT_CACHE = {};\n    function fromInt(value, unsigned) {\n      var obj, cachedObj, cache;\n      if (unsigned) {\n        value >>>= 0;\n        if (cache = 0 <= value && value < 256) {\n          cachedObj = UINT_CACHE[value];\n          if (cachedObj)\n            return cachedObj;\n        }\n        obj = fromBits(value, (value | 0) < 0 ? -1 : 0, true);\n        if (cache)\n          UINT_CACHE[value] = obj;\n        return obj;\n      } else {\n        value |= 0;\n        if (cache = -128 <= value && value < 128) {\n          cachedObj = INT_CACHE[value];\n          if (cachedObj)\n            return cachedObj;\n        }\n        obj = fromBits(value, value < 0 ? -1 : 0, false);\n        if (cache)\n          INT_CACHE[value] = obj;\n        return obj;\n      }\n    }\n    Long2.fromInt = fromInt;\n    function fromNumber(value, unsigned) {\n      if (isNaN(value))\n        return unsigned ? UZERO : ZERO;\n      if (unsigned) {\n        if (value < 0)\n          return UZERO;\n        if (value >= TWO_PWR_64_DBL)\n          return MAX_UNSIGNED_VALUE;\n      } else {\n        if (value <= -TWO_PWR_63_DBL)\n          return MIN_VALUE;\n        if (value + 1 >= TWO_PWR_63_DBL)\n          return MAX_VALUE;\n      }\n      if (value < 0)\n        return fromNumber(-value, unsigned).neg();\n      return fromBits(value % TWO_PWR_32_DBL | 0, value / TWO_PWR_32_DBL | 0, unsigned);\n    }\n    Long2.fromNumber = fromNumber;\n    function fromBits(lowBits, highBits, unsigned) {\n      return new Long2(lowBits, highBits, unsigned);\n    }\n    Long2.fromBits = fromBits;\n    var pow_dbl = Math.pow;\n    function fromString(str, unsigned, radix) {\n      if (str.length === 0)\n        throw Error(\"empty string\");\n      if (str === \"NaN\" || str === \"Infinity\" || str === \"+Infinity\" || str === \"-Infinity\")\n        return ZERO;\n      if (typeof unsigned === \"number\") {\n        radix = unsigned, unsigned = false;\n      } else {\n        unsigned = !!unsigned;\n      }\n      radix = radix || 10;\n      if (radix < 2 || 36 < radix)\n        throw RangeError(\"radix\");\n      var p2;\n      if ((p2 = str.indexOf(\"-\")) > 0)\n        throw Error(\"interior hyphen\");\n      else if (p2 === 0) {\n        return fromString(str.substring(1), unsigned, radix).neg();\n      }\n      var radixToPower = fromNumber(pow_dbl(radix, 8));\n      var result = ZERO;\n      for (var i = 0; i < str.length; i += 8) {\n        var size = Math.min(8, str.length - i), value = parseInt(str.substring(i, i + size), radix);\n        if (size < 8) {\n          var power = fromNumber(pow_dbl(radix, size));\n          result = result.mul(power).add(fromNumber(value));\n        } else {\n          result = result.mul(radixToPower);\n          result = result.add(fromNumber(value));\n        }\n      }\n      result.unsigned = unsigned;\n      return result;\n    }\n    Long2.fromString = fromString;\n    function fromValue(val, unsigned) {\n      if (typeof val === \"number\")\n        return fromNumber(val, unsigned);\n      if (typeof val === \"string\")\n        return fromString(val, unsigned);\n      return fromBits(val.low, val.high, typeof unsigned === \"boolean\" ? unsigned : val.unsigned);\n    }\n    Long2.fromValue = fromValue;\n    var TWO_PWR_16_DBL = 1 << 16;\n    var TWO_PWR_24_DBL = 1 << 24;\n    var TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;\n    var TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;\n    var TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2;\n    var TWO_PWR_24 = fromInt(TWO_PWR_24_DBL);\n    var ZERO = fromInt(0);\n    Long2.ZERO = ZERO;\n    var UZERO = fromInt(0, true);\n    Long2.UZERO = UZERO;\n    var ONE = fromInt(1);\n    Long2.ONE = ONE;\n    var UONE = fromInt(1, true);\n    Long2.UONE = UONE;\n    var NEG_ONE = fromInt(-1);\n    Long2.NEG_ONE = NEG_ONE;\n    var MAX_VALUE = fromBits(4294967295 | 0, 2147483647 | 0, false);\n    Long2.MAX_VALUE = MAX_VALUE;\n    var MAX_UNSIGNED_VALUE = fromBits(4294967295 | 0, 4294967295 | 0, true);\n    Long2.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE;\n    var MIN_VALUE = fromBits(0, 2147483648 | 0, false);\n    Long2.MIN_VALUE = MIN_VALUE;\n    var LongPrototype = Long2.prototype;\n    LongPrototype.toInt = function toInt() {\n      return this.unsigned ? this.low >>> 0 : this.low;\n    };\n    LongPrototype.toNumber = function toNumber() {\n      if (this.unsigned)\n        return (this.high >>> 0) * TWO_PWR_32_DBL + (this.low >>> 0);\n      return this.high * TWO_PWR_32_DBL + (this.low >>> 0);\n    };\n    LongPrototype.toString = function toString(radix) {\n      radix = radix || 10;\n      if (radix < 2 || 36 < radix)\n        throw RangeError(\"radix\");\n      if (this.isZero())\n        return \"0\";\n      if (this.isNegative()) {\n        if (this.eq(MIN_VALUE)) {\n          var radixLong = fromNumber(radix), div3 = this.div(radixLong), rem1 = div3.mul(radixLong).sub(this);\n          return div3.toString(radix) + rem1.toInt().toString(radix);\n        } else\n          return \"-\" + this.neg().toString(radix);\n      }\n      var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned), rem = this;\n      var result = \"\";\n      while (true) {\n        var remDiv = rem.div(radixToPower), intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0, digits = intval.toString(radix);\n        rem = remDiv;\n        if (rem.isZero())\n          return digits + result;\n        else {\n          while (digits.length < 6)\n            digits = \"0\" + digits;\n          result = \"\" + digits + result;\n        }\n      }\n    };\n    LongPrototype.getHighBits = function getHighBits() {\n      return this.high;\n    };\n    LongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() {\n      return this.high >>> 0;\n    };\n    LongPrototype.getLowBits = function getLowBits() {\n      return this.low;\n    };\n    LongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() {\n      return this.low >>> 0;\n    };\n    LongPrototype.getNumBitsAbs = function getNumBitsAbs() {\n      if (this.isNegative())\n        return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs();\n      var val = this.high != 0 ? this.high : this.low;\n      for (var bit = 31; bit > 0; bit--)\n        if ((val & 1 << bit) != 0)\n          break;\n      return this.high != 0 ? bit + 33 : bit + 1;\n    };\n    LongPrototype.isZero = function isZero() {\n      return this.high === 0 && this.low === 0;\n    };\n    LongPrototype.eqz = LongPrototype.isZero;\n    LongPrototype.isNegative = function isNegative() {\n      return !this.unsigned && this.high < 0;\n    };\n    LongPrototype.isPositive = function isPositive() {\n      return this.unsigned || this.high >= 0;\n    };\n    LongPrototype.isOdd = function isOdd() {\n      return (this.low & 1) === 1;\n    };\n    LongPrototype.isEven = function isEven2() {\n      return (this.low & 1) === 0;\n    };\n    LongPrototype.equals = function equals(other) {\n      if (!isLong(other))\n        other = fromValue(other);\n      if (this.unsigned !== other.unsigned && this.high >>> 31 === 1 && other.high >>> 31 === 1)\n        return false;\n      return this.high === other.high && this.low === other.low;\n    };\n    LongPrototype.eq = LongPrototype.equals;\n    LongPrototype.notEquals = function notEquals(other) {\n      return !this.eq(other);\n    };\n    LongPrototype.neq = LongPrototype.notEquals;\n    LongPrototype.ne = LongPrototype.notEquals;\n    LongPrototype.lessThan = function lessThan(other) {\n      return this.comp(other) < 0;\n    };\n    LongPrototype.lt = LongPrototype.lessThan;\n    LongPrototype.lessThanOrEqual = function lessThanOrEqual(other) {\n      return this.comp(other) <= 0;\n    };\n    LongPrototype.lte = LongPrototype.lessThanOrEqual;\n    LongPrototype.le = LongPrototype.lessThanOrEqual;\n    LongPrototype.greaterThan = function greaterThan(other) {\n      return this.comp(other) > 0;\n    };\n    LongPrototype.gt = LongPrototype.greaterThan;\n    LongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) {\n      return this.comp(other) >= 0;\n    };\n    LongPrototype.gte = LongPrototype.greaterThanOrEqual;\n    LongPrototype.ge = LongPrototype.greaterThanOrEqual;\n    LongPrototype.compare = function compare(other) {\n      if (!isLong(other))\n        other = fromValue(other);\n      if (this.eq(other))\n        return 0;\n      var thisNeg = this.isNegative(), otherNeg = other.isNegative();\n      if (thisNeg && !otherNeg)\n        return -1;\n      if (!thisNeg && otherNeg)\n        return 1;\n      if (!this.unsigned)\n        return this.sub(other).isNegative() ? -1 : 1;\n      return other.high >>> 0 > this.high >>> 0 || other.high === this.high && other.low >>> 0 > this.low >>> 0 ? -1 : 1;\n    };\n    LongPrototype.comp = LongPrototype.compare;\n    LongPrototype.negate = function negate() {\n      if (!this.unsigned && this.eq(MIN_VALUE))\n        return MIN_VALUE;\n      return this.not().add(ONE);\n    };\n    LongPrototype.neg = LongPrototype.negate;\n    LongPrototype.add = function add5(addend) {\n      if (!isLong(addend))\n        addend = fromValue(addend);\n      var a48 = this.high >>> 16;\n      var a32 = this.high & 65535;\n      var a16 = this.low >>> 16;\n      var a00 = this.low & 65535;\n      var b48 = addend.high >>> 16;\n      var b32 = addend.high & 65535;\n      var b16 = addend.low >>> 16;\n      var b00 = addend.low & 65535;\n      var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\n      c00 += a00 + b00;\n      c16 += c00 >>> 16;\n      c00 &= 65535;\n      c16 += a16 + b16;\n      c32 += c16 >>> 16;\n      c16 &= 65535;\n      c32 += a32 + b32;\n      c48 += c32 >>> 16;\n      c32 &= 65535;\n      c48 += a48 + b48;\n      c48 &= 65535;\n      return fromBits(c16 << 16 | c00, c48 << 16 | c32, this.unsigned);\n    };\n    LongPrototype.subtract = function subtract(subtrahend) {\n      if (!isLong(subtrahend))\n        subtrahend = fromValue(subtrahend);\n      return this.add(subtrahend.neg());\n    };\n    LongPrototype.sub = LongPrototype.subtract;\n    LongPrototype.multiply = function multiply4(multiplier) {\n      if (this.isZero())\n        return ZERO;\n      if (!isLong(multiplier))\n        multiplier = fromValue(multiplier);\n      if (wasm) {\n        var low = wasm.mul(this.low, this.high, multiplier.low, multiplier.high);\n        return fromBits(low, wasm.get_high(), this.unsigned);\n      }\n      if (multiplier.isZero())\n        return ZERO;\n      if (this.eq(MIN_VALUE))\n        return multiplier.isOdd() ? MIN_VALUE : ZERO;\n      if (multiplier.eq(MIN_VALUE))\n        return this.isOdd() ? MIN_VALUE : ZERO;\n      if (this.isNegative()) {\n        if (multiplier.isNegative())\n          return this.neg().mul(multiplier.neg());\n        else\n          return this.neg().mul(multiplier).neg();\n      } else if (multiplier.isNegative())\n        return this.mul(multiplier.neg()).neg();\n      if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24))\n        return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned);\n      var a48 = this.high >>> 16;\n      var a32 = this.high & 65535;\n      var a16 = this.low >>> 16;\n      var a00 = this.low & 65535;\n      var b48 = multiplier.high >>> 16;\n      var b32 = multiplier.high & 65535;\n      var b16 = multiplier.low >>> 16;\n      var b00 = multiplier.low & 65535;\n      var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\n      c00 += a00 * b00;\n      c16 += c00 >>> 16;\n      c00 &= 65535;\n      c16 += a16 * b00;\n      c32 += c16 >>> 16;\n      c16 &= 65535;\n      c16 += a00 * b16;\n      c32 += c16 >>> 16;\n      c16 &= 65535;\n      c32 += a32 * b00;\n      c48 += c32 >>> 16;\n      c32 &= 65535;\n      c32 += a16 * b16;\n      c48 += c32 >>> 16;\n      c32 &= 65535;\n      c32 += a00 * b32;\n      c48 += c32 >>> 16;\n      c32 &= 65535;\n      c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\n      c48 &= 65535;\n      return fromBits(c16 << 16 | c00, c48 << 16 | c32, this.unsigned);\n    };\n    LongPrototype.mul = LongPrototype.multiply;\n    LongPrototype.divide = function divide(divisor) {\n      if (!isLong(divisor))\n        divisor = fromValue(divisor);\n      if (divisor.isZero())\n        throw Error(\"division by zero\");\n      if (wasm) {\n        if (!this.unsigned && this.high === -2147483648 && divisor.low === -1 && divisor.high === -1) {\n          return this;\n        }\n        var low = (this.unsigned ? wasm.div_u : wasm.div_s)(this.low, this.high, divisor.low, divisor.high);\n        return fromBits(low, wasm.get_high(), this.unsigned);\n      }\n      if (this.isZero())\n        return this.unsigned ? UZERO : ZERO;\n      var approx, rem, res;\n      if (!this.unsigned) {\n        if (this.eq(MIN_VALUE)) {\n          if (divisor.eq(ONE) || divisor.eq(NEG_ONE))\n            return MIN_VALUE;\n          else if (divisor.eq(MIN_VALUE))\n            return ONE;\n          else {\n            var halfThis = this.shr(1);\n            approx = halfThis.div(divisor).shl(1);\n            if (approx.eq(ZERO)) {\n              return divisor.isNegative() ? ONE : NEG_ONE;\n            } else {\n              rem = this.sub(divisor.mul(approx));\n              res = approx.add(rem.div(divisor));\n              return res;\n            }\n          }\n        } else if (divisor.eq(MIN_VALUE))\n          return this.unsigned ? UZERO : ZERO;\n        if (this.isNegative()) {\n          if (divisor.isNegative())\n            return this.neg().div(divisor.neg());\n          return this.neg().div(divisor).neg();\n        } else if (divisor.isNegative())\n          return this.div(divisor.neg()).neg();\n        res = ZERO;\n      } else {\n        if (!divisor.unsigned)\n          divisor = divisor.toUnsigned();\n        if (divisor.gt(this))\n          return UZERO;\n        if (divisor.gt(this.shru(1)))\n          return UONE;\n        res = UZERO;\n      }\n      rem = this;\n      while (rem.gte(divisor)) {\n        approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber()));\n        var log22 = Math.ceil(Math.log(approx) / Math.LN2), delta = log22 <= 48 ? 1 : pow_dbl(2, log22 - 48), approxRes = fromNumber(approx), approxRem = approxRes.mul(divisor);\n        while (approxRem.isNegative() || approxRem.gt(rem)) {\n          approx -= delta;\n          approxRes = fromNumber(approx, this.unsigned);\n          approxRem = approxRes.mul(divisor);\n        }\n        if (approxRes.isZero())\n          approxRes = ONE;\n        res = res.add(approxRes);\n        rem = rem.sub(approxRem);\n      }\n      return res;\n    };\n    LongPrototype.div = LongPrototype.divide;\n    LongPrototype.modulo = function modulo(divisor) {\n      if (!isLong(divisor))\n        divisor = fromValue(divisor);\n      if (wasm) {\n        var low = (this.unsigned ? wasm.rem_u : wasm.rem_s)(this.low, this.high, divisor.low, divisor.high);\n        return fromBits(low, wasm.get_high(), this.unsigned);\n      }\n      return this.sub(this.div(divisor).mul(divisor));\n    };\n    LongPrototype.mod = LongPrototype.modulo;\n    LongPrototype.rem = LongPrototype.modulo;\n    LongPrototype.not = function not() {\n      return fromBits(~this.low, ~this.high, this.unsigned);\n    };\n    LongPrototype.and = function and(other) {\n      if (!isLong(other))\n        other = fromValue(other);\n      return fromBits(this.low & other.low, this.high & other.high, this.unsigned);\n    };\n    LongPrototype.or = function or(other) {\n      if (!isLong(other))\n        other = fromValue(other);\n      return fromBits(this.low | other.low, this.high | other.high, this.unsigned);\n    };\n    LongPrototype.xor = function xor(other) {\n      if (!isLong(other))\n        other = fromValue(other);\n      return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned);\n    };\n    LongPrototype.shiftLeft = function shiftLeft(numBits) {\n      if (isLong(numBits))\n        numBits = numBits.toInt();\n      if ((numBits &= 63) === 0)\n        return this;\n      else if (numBits < 32)\n        return fromBits(this.low << numBits, this.high << numBits | this.low >>> 32 - numBits, this.unsigned);\n      else\n        return fromBits(0, this.low << numBits - 32, this.unsigned);\n    };\n    LongPrototype.shl = LongPrototype.shiftLeft;\n    LongPrototype.shiftRight = function shiftRight(numBits) {\n      if (isLong(numBits))\n        numBits = numBits.toInt();\n      if ((numBits &= 63) === 0)\n        return this;\n      else if (numBits < 32)\n        return fromBits(this.low >>> numBits | this.high << 32 - numBits, this.high >> numBits, this.unsigned);\n      else\n        return fromBits(this.high >> numBits - 32, this.high >= 0 ? 0 : -1, this.unsigned);\n    };\n    LongPrototype.shr = LongPrototype.shiftRight;\n    LongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) {\n      if (isLong(numBits))\n        numBits = numBits.toInt();\n      numBits &= 63;\n      if (numBits === 0)\n        return this;\n      else {\n        var high = this.high;\n        if (numBits < 32) {\n          var low = this.low;\n          return fromBits(low >>> numBits | high << 32 - numBits, high >>> numBits, this.unsigned);\n        } else if (numBits === 32)\n          return fromBits(high, 0, this.unsigned);\n        else\n          return fromBits(high >>> numBits - 32, 0, this.unsigned);\n      }\n    };\n    LongPrototype.shru = LongPrototype.shiftRightUnsigned;\n    LongPrototype.shr_u = LongPrototype.shiftRightUnsigned;\n    LongPrototype.toSigned = function toSigned() {\n      if (!this.unsigned)\n        return this;\n      return fromBits(this.low, this.high, false);\n    };\n    LongPrototype.toUnsigned = function toUnsigned() {\n      if (this.unsigned)\n        return this;\n      return fromBits(this.low, this.high, true);\n    };\n    LongPrototype.toBytes = function toBytes(le) {\n      return le ? this.toBytesLE() : this.toBytesBE();\n    };\n    LongPrototype.toBytesLE = function toBytesLE() {\n      var hi = this.high, lo = this.low;\n      return [\n        lo & 255,\n        lo >>> 8 & 255,\n        lo >>> 16 & 255,\n        lo >>> 24,\n        hi & 255,\n        hi >>> 8 & 255,\n        hi >>> 16 & 255,\n        hi >>> 24\n      ];\n    };\n    LongPrototype.toBytesBE = function toBytesBE() {\n      var hi = this.high, lo = this.low;\n      return [\n        hi >>> 24,\n        hi >>> 16 & 255,\n        hi >>> 8 & 255,\n        hi & 255,\n        lo >>> 24,\n        lo >>> 16 & 255,\n        lo >>> 8 & 255,\n        lo & 255\n      ];\n    };\n    Long2.fromBytes = function fromBytes(bytes, unsigned, le) {\n      return le ? Long2.fromBytesLE(bytes, unsigned) : Long2.fromBytesBE(bytes, unsigned);\n    };\n    Long2.fromBytesLE = function fromBytesLE(bytes, unsigned) {\n      return new Long2(bytes[0] | bytes[1] << 8 | bytes[2] << 16 | bytes[3] << 24, bytes[4] | bytes[5] << 8 | bytes[6] << 16 | bytes[7] << 24, unsigned);\n    };\n    Long2.fromBytesBE = function fromBytesBE(bytes, unsigned) {\n      return new Long2(bytes[4] << 24 | bytes[5] << 16 | bytes[6] << 8 | bytes[7], bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3], unsigned);\n    };\n  }\n});\nvar require_node_fetch = __commonJS({\n  \"(disabled):node-fetch\"() {\n  }\n});\nvar require_util = __commonJS({\n  \"(disabled):util\"() {\n  }\n});\nvar require_alea = __commonJS({\n  \"node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/alea.js\"(exports, module) {\n    (function(global2, module2, define2) {\n      function Alea(seed) {\n        var me = this, mash = Mash();\n        me.next = function() {\n          var t = 2091639 * me.s0 + me.c * 23283064365386963e-26;\n          me.s0 = me.s1;\n          me.s1 = me.s2;\n          return me.s2 = t - (me.c = t | 0);\n        };\n        me.c = 1;\n        me.s0 = mash(\" \");\n        me.s1 = mash(\" \");\n        me.s2 = mash(\" \");\n        me.s0 -= mash(seed);\n        if (me.s0 < 0) {\n          me.s0 += 1;\n        }\n        me.s1 -= mash(seed);\n        if (me.s1 < 0) {\n          me.s1 += 1;\n        }\n        me.s2 -= mash(seed);\n        if (me.s2 < 0) {\n          me.s2 += 1;\n        }\n        mash = null;\n      }\n      function copy(f, t) {\n        t.c = f.c;\n        t.s0 = f.s0;\n        t.s1 = f.s1;\n        t.s2 = f.s2;\n        return t;\n      }\n      function impl(seed, opts) {\n        var xg = new Alea(seed), state = opts && opts.state, prng = xg.next;\n        prng.int32 = function() {\n          return xg.next() * 4294967296 | 0;\n        };\n        prng.double = function() {\n          return prng() + (prng() * 2097152 | 0) * 11102230246251565e-32;\n        };\n        prng.quick = prng;\n        if (state) {\n          if (typeof state == \"object\")\n            copy(state, xg);\n          prng.state = function() {\n            return copy(xg, {});\n          };\n        }\n        return prng;\n      }\n      function Mash() {\n        var n = 4022871197;\n        var mash = function(data) {\n          data = String(data);\n          for (var i = 0; i < data.length; i++) {\n            n += data.charCodeAt(i);\n            var h = 0.02519603282416938 * n;\n            n = h >>> 0;\n            h -= n;\n            h *= n;\n            n = h >>> 0;\n            h -= n;\n            n += h * 4294967296;\n          }\n          return (n >>> 0) * 23283064365386963e-26;\n        };\n        return mash;\n      }\n      if (module2 && module2.exports) {\n        module2.exports = impl;\n      } else if (define2 && define2.amd) {\n        define2(function() {\n          return impl;\n        });\n      } else {\n        this.alea = impl;\n      }\n    })(exports, typeof module == \"object\" && module, typeof define == \"function\" && define);\n  }\n});\nvar require_xor128 = __commonJS({\n  \"node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xor128.js\"(exports, module) {\n    (function(global2, module2, define2) {\n      function XorGen(seed) {\n        var me = this, strseed = \"\";\n        me.x = 0;\n        me.y = 0;\n        me.z = 0;\n        me.w = 0;\n        me.next = function() {\n          var t = me.x ^ me.x << 11;\n          me.x = me.y;\n          me.y = me.z;\n          me.z = me.w;\n          return me.w ^= me.w >>> 19 ^ t ^ t >>> 8;\n        };\n        if (seed === (seed | 0)) {\n          me.x = seed;\n        } else {\n          strseed += seed;\n        }\n        for (var k = 0; k < strseed.length + 64; k++) {\n          me.x ^= strseed.charCodeAt(k) | 0;\n          me.next();\n        }\n      }\n      function copy(f, t) {\n        t.x = f.x;\n        t.y = f.y;\n        t.z = f.z;\n        t.w = f.w;\n        return t;\n      }\n      function impl(seed, opts) {\n        var xg = new XorGen(seed), state = opts && opts.state, prng = function() {\n          return (xg.next() >>> 0) / 4294967296;\n        };\n        prng.double = function() {\n          do {\n            var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21);\n          } while (result === 0);\n          return result;\n        };\n        prng.int32 = xg.next;\n        prng.quick = prng;\n        if (state) {\n          if (typeof state == \"object\")\n            copy(state, xg);\n          prng.state = function() {\n            return copy(xg, {});\n          };\n        }\n        return prng;\n      }\n      if (module2 && module2.exports) {\n        module2.exports = impl;\n      } else if (define2 && define2.amd) {\n        define2(function() {\n          return impl;\n        });\n      } else {\n        this.xor128 = impl;\n      }\n    })(exports, typeof module == \"object\" && module, typeof define == \"function\" && define);\n  }\n});\nvar require_xorwow = __commonJS({\n  \"node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xorwow.js\"(exports, module) {\n    (function(global2, module2, define2) {\n      function XorGen(seed) {\n        var me = this, strseed = \"\";\n        me.next = function() {\n          var t = me.x ^ me.x >>> 2;\n          me.x = me.y;\n          me.y = me.z;\n          me.z = me.w;\n          me.w = me.v;\n          return (me.d = me.d + 362437 | 0) + (me.v = me.v ^ me.v << 4 ^ (t ^ t << 1)) | 0;\n        };\n        me.x = 0;\n        me.y = 0;\n        me.z = 0;\n        me.w = 0;\n        me.v = 0;\n        if (seed === (seed | 0)) {\n          me.x = seed;\n        } else {\n          strseed += seed;\n        }\n        for (var k = 0; k < strseed.length + 64; k++) {\n          me.x ^= strseed.charCodeAt(k) | 0;\n          if (k == strseed.length) {\n            me.d = me.x << 10 ^ me.x >>> 4;\n          }\n          me.next();\n        }\n      }\n      function copy(f, t) {\n        t.x = f.x;\n        t.y = f.y;\n        t.z = f.z;\n        t.w = f.w;\n        t.v = f.v;\n        t.d = f.d;\n        return t;\n      }\n      function impl(seed, opts) {\n        var xg = new XorGen(seed), state = opts && opts.state, prng = function() {\n          return (xg.next() >>> 0) / 4294967296;\n        };\n        prng.double = function() {\n          do {\n            var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21);\n          } while (result === 0);\n          return result;\n        };\n        prng.int32 = xg.next;\n        prng.quick = prng;\n        if (state) {\n          if (typeof state == \"object\")\n            copy(state, xg);\n          prng.state = function() {\n            return copy(xg, {});\n          };\n        }\n        return prng;\n      }\n      if (module2 && module2.exports) {\n        module2.exports = impl;\n      } else if (define2 && define2.amd) {\n        define2(function() {\n          return impl;\n        });\n      } else {\n        this.xorwow = impl;\n      }\n    })(exports, typeof module == \"object\" && module, typeof define == \"function\" && define);\n  }\n});\nvar require_xorshift7 = __commonJS({\n  \"node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xorshift7.js\"(exports, module) {\n    (function(global2, module2, define2) {\n      function XorGen(seed) {\n        var me = this;\n        me.next = function() {\n          var X = me.x, i = me.i, t, v, w;\n          t = X[i];\n          t ^= t >>> 7;\n          v = t ^ t << 24;\n          t = X[i + 1 & 7];\n          v ^= t ^ t >>> 10;\n          t = X[i + 3 & 7];\n          v ^= t ^ t >>> 3;\n          t = X[i + 4 & 7];\n          v ^= t ^ t << 7;\n          t = X[i + 7 & 7];\n          t = t ^ t << 13;\n          v ^= t ^ t << 9;\n          X[i] = v;\n          me.i = i + 1 & 7;\n          return v;\n        };\n        function init2(me2, seed2) {\n          var j, w, X = [];\n          if (seed2 === (seed2 | 0)) {\n            w = X[0] = seed2;\n          } else {\n            seed2 = \"\" + seed2;\n            for (j = 0; j < seed2.length; ++j) {\n              X[j & 7] = X[j & 7] << 15 ^ seed2.charCodeAt(j) + X[j + 1 & 7] << 13;\n            }\n          }\n          while (X.length < 8)\n            X.push(0);\n          for (j = 0; j < 8 && X[j] === 0; ++j)\n            ;\n          if (j == 8)\n            w = X[7] = -1;\n          else\n            w = X[j];\n          me2.x = X;\n          me2.i = 0;\n          for (j = 256; j > 0; --j) {\n            me2.next();\n          }\n        }\n        init2(me, seed);\n      }\n      function copy(f, t) {\n        t.x = f.x.slice();\n        t.i = f.i;\n        return t;\n      }\n      function impl(seed, opts) {\n        if (seed == null)\n          seed = +new Date();\n        var xg = new XorGen(seed), state = opts && opts.state, prng = function() {\n          return (xg.next() >>> 0) / 4294967296;\n        };\n        prng.double = function() {\n          do {\n            var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21);\n          } while (result === 0);\n          return result;\n        };\n        prng.int32 = xg.next;\n        prng.quick = prng;\n        if (state) {\n          if (state.x)\n            copy(state, xg);\n          prng.state = function() {\n            return copy(xg, {});\n          };\n        }\n        return prng;\n      }\n      if (module2 && module2.exports) {\n        module2.exports = impl;\n      } else if (define2 && define2.amd) {\n        define2(function() {\n          return impl;\n        });\n      } else {\n        this.xorshift7 = impl;\n      }\n    })(exports, typeof module == \"object\" && module, typeof define == \"function\" && define);\n  }\n});\nvar require_xor4096 = __commonJS({\n  \"node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xor4096.js\"(exports, module) {\n    (function(global2, module2, define2) {\n      function XorGen(seed) {\n        var me = this;\n        me.next = function() {\n          var w = me.w, X = me.X, i = me.i, t, v;\n          me.w = w = w + 1640531527 | 0;\n          v = X[i + 34 & 127];\n          t = X[i = i + 1 & 127];\n          v ^= v << 13;\n          t ^= t << 17;\n          v ^= v >>> 15;\n          t ^= t >>> 12;\n          v = X[i] = v ^ t;\n          me.i = i;\n          return v + (w ^ w >>> 16) | 0;\n        };\n        function init2(me2, seed2) {\n          var t, v, i, j, w, X = [], limit = 128;\n          if (seed2 === (seed2 | 0)) {\n            v = seed2;\n            seed2 = null;\n          } else {\n            seed2 = seed2 + \"\\0\";\n            v = 0;\n            limit = Math.max(limit, seed2.length);\n          }\n          for (i = 0, j = -32; j < limit; ++j) {\n            if (seed2)\n              v ^= seed2.charCodeAt((j + 32) % seed2.length);\n            if (j === 0)\n              w = v;\n            v ^= v << 10;\n            v ^= v >>> 15;\n            v ^= v << 4;\n            v ^= v >>> 13;\n            if (j >= 0) {\n              w = w + 1640531527 | 0;\n              t = X[j & 127] ^= v + w;\n              i = t == 0 ? i + 1 : 0;\n            }\n          }\n          if (i >= 128) {\n            X[(seed2 && seed2.length || 0) & 127] = -1;\n          }\n          i = 127;\n          for (j = 4 * 128; j > 0; --j) {\n            v = X[i + 34 & 127];\n            t = X[i = i + 1 & 127];\n            v ^= v << 13;\n            t ^= t << 17;\n            v ^= v >>> 15;\n            t ^= t >>> 12;\n            X[i] = v ^ t;\n          }\n          me2.w = w;\n          me2.X = X;\n          me2.i = i;\n        }\n        init2(me, seed);\n      }\n      function copy(f, t) {\n        t.i = f.i;\n        t.w = f.w;\n        t.X = f.X.slice();\n        return t;\n      }\n      ;\n      function impl(seed, opts) {\n        if (seed == null)\n          seed = +new Date();\n        var xg = new XorGen(seed), state = opts && opts.state, prng = function() {\n          return (xg.next() >>> 0) / 4294967296;\n        };\n        prng.double = function() {\n          do {\n            var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21);\n          } while (result === 0);\n          return result;\n        };\n        prng.int32 = xg.next;\n        prng.quick = prng;\n        if (state) {\n          if (state.X)\n            copy(state, xg);\n          prng.state = function() {\n            return copy(xg, {});\n          };\n        }\n        return prng;\n      }\n      if (module2 && module2.exports) {\n        module2.exports = impl;\n      } else if (define2 && define2.amd) {\n        define2(function() {\n          return impl;\n        });\n      } else {\n        this.xor4096 = impl;\n      }\n    })(exports, typeof module == \"object\" && module, typeof define == \"function\" && define);\n  }\n});\nvar require_tychei = __commonJS({\n  \"node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/tychei.js\"(exports, module) {\n    (function(global2, module2, define2) {\n      function XorGen(seed) {\n        var me = this, strseed = \"\";\n        me.next = function() {\n          var b = me.b, c = me.c, d = me.d, a = me.a;\n          b = b << 25 ^ b >>> 7 ^ c;\n          c = c - d | 0;\n          d = d << 24 ^ d >>> 8 ^ a;\n          a = a - b | 0;\n          me.b = b = b << 20 ^ b >>> 12 ^ c;\n          me.c = c = c - d | 0;\n          me.d = d << 16 ^ c >>> 16 ^ a;\n          return me.a = a - b | 0;\n        };\n        me.a = 0;\n        me.b = 0;\n        me.c = 2654435769 | 0;\n        me.d = 1367130551;\n        if (seed === Math.floor(seed)) {\n          me.a = seed / 4294967296 | 0;\n          me.b = seed | 0;\n        } else {\n          strseed += seed;\n        }\n        for (var k = 0; k < strseed.length + 20; k++) {\n          me.b ^= strseed.charCodeAt(k) | 0;\n          me.next();\n        }\n      }\n      function copy(f, t) {\n        t.a = f.a;\n        t.b = f.b;\n        t.c = f.c;\n        t.d = f.d;\n        return t;\n      }\n      ;\n      function impl(seed, opts) {\n        var xg = new XorGen(seed), state = opts && opts.state, prng = function() {\n          return (xg.next() >>> 0) / 4294967296;\n        };\n        prng.double = function() {\n          do {\n            var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21);\n          } while (result === 0);\n          return result;\n        };\n        prng.int32 = xg.next;\n        prng.quick = prng;\n        if (state) {\n          if (typeof state == \"object\")\n            copy(state, xg);\n          prng.state = function() {\n            return copy(xg, {});\n          };\n        }\n        return prng;\n      }\n      if (module2 && module2.exports) {\n        module2.exports = impl;\n      } else if (define2 && define2.amd) {\n        define2(function() {\n          return impl;\n        });\n      } else {\n        this.tychei = impl;\n      }\n    })(exports, typeof module == \"object\" && module, typeof define == \"function\" && define);\n  }\n});\nvar require_crypto = __commonJS({\n  \"(disabled):crypto\"() {\n  }\n});\nvar require_seedrandom = __commonJS({\n  \"node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/seedrandom.js\"(exports, module) {\n    (function(global2, pool3, math) {\n      var width = 256, chunks = 6, digits = 52, rngname = \"random\", startdenom = math.pow(width, chunks), significance = math.pow(2, digits), overflow = significance * 2, mask = width - 1, nodecrypto;\n      function seedrandom5(seed, options, callback) {\n        var key = [];\n        options = options == true ? { entropy: true } : options || {};\n        var shortseed = mixkey(flatten4(options.entropy ? [seed, tostring(pool3)] : seed == null ? autoseed() : seed, 3), key);\n        var arc4 = new ARC4(key);\n        var prng = function() {\n          var n = arc4.g(chunks), d = startdenom, x = 0;\n          while (n < significance) {\n            n = (n + x) * width;\n            d *= width;\n            x = arc4.g(1);\n          }\n          while (n >= overflow) {\n            n /= 2;\n            d /= 2;\n            x >>>= 1;\n          }\n          return (n + x) / d;\n        };\n        prng.int32 = function() {\n          return arc4.g(4) | 0;\n        };\n        prng.quick = function() {\n          return arc4.g(4) / 4294967296;\n        };\n        prng.double = prng;\n        mixkey(tostring(arc4.S), pool3);\n        return (options.pass || callback || function(prng2, seed2, is_math_call, state) {\n          if (state) {\n            if (state.S) {\n              copy(state, arc4);\n            }\n            prng2.state = function() {\n              return copy(arc4, {});\n            };\n          }\n          if (is_math_call) {\n            math[rngname] = prng2;\n            return seed2;\n          } else\n            return prng2;\n        })(prng, shortseed, \"global\" in options ? options.global : this == math, options.state);\n      }\n      function ARC4(key) {\n        var t, keylen = key.length, me = this, i = 0, j = me.i = me.j = 0, s = me.S = [];\n        if (!keylen) {\n          key = [keylen++];\n        }\n        while (i < width) {\n          s[i] = i++;\n        }\n        for (i = 0; i < width; i++) {\n          s[i] = s[j = mask & j + key[i % keylen] + (t = s[i])];\n          s[j] = t;\n        }\n        (me.g = function(count2) {\n          var t2, r = 0, i2 = me.i, j2 = me.j, s2 = me.S;\n          while (count2--) {\n            t2 = s2[i2 = mask & i2 + 1];\n            r = r * width + s2[mask & (s2[i2] = s2[j2 = mask & j2 + t2]) + (s2[j2] = t2)];\n          }\n          me.i = i2;\n          me.j = j2;\n          return r;\n        })(width);\n      }\n      function copy(f, t) {\n        t.i = f.i;\n        t.j = f.j;\n        t.S = f.S.slice();\n        return t;\n      }\n      ;\n      function flatten4(obj, depth) {\n        var result = [], typ = typeof obj, prop;\n        if (depth && typ == \"object\") {\n          for (prop in obj) {\n            try {\n              result.push(flatten4(obj[prop], depth - 1));\n            } catch (e) {\n            }\n          }\n        }\n        return result.length ? result : typ == \"string\" ? obj : obj + \"\\0\";\n      }\n      function mixkey(seed, key) {\n        var stringseed = seed + \"\", smear, j = 0;\n        while (j < stringseed.length) {\n          key[mask & j] = mask & (smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++);\n        }\n        return tostring(key);\n      }\n      function autoseed() {\n        try {\n          var out;\n          if (nodecrypto && (out = nodecrypto.randomBytes)) {\n            out = out(width);\n          } else {\n            out = new Uint8Array(width);\n            (global2.crypto || global2.msCrypto).getRandomValues(out);\n          }\n          return tostring(out);\n        } catch (e) {\n          var browser = global2.navigator, plugins = browser && browser.plugins;\n          return [+new Date(), global2, plugins, global2.screen, tostring(pool3)];\n        }\n      }\n      function tostring(a) {\n        return String.fromCharCode.apply(0, a);\n      }\n      mixkey(math.random(), pool3);\n      if (typeof module == \"object\" && module.exports) {\n        module.exports = seedrandom5;\n        try {\n          nodecrypto = require_crypto();\n        } catch (ex) {\n        }\n      } else if (typeof define == \"function\" && define.amd) {\n        define(function() {\n          return seedrandom5;\n        });\n      } else {\n        math[\"seed\" + rngname] = seedrandom5;\n      }\n    })(typeof self !== \"undefined\" ? self : exports, [], Math);\n  }\n});\nvar require_seedrandom2 = __commonJS({\n  \"node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/index.js\"(exports, module) {\n    var alea5 = require_alea();\n    var xor128 = require_xor128();\n    var xorwow = require_xorwow();\n    var xorshift7 = require_xorshift7();\n    var xor4096 = require_xor4096();\n    var tychei = require_tychei();\n    var sr = require_seedrandom();\n    sr.alea = alea5;\n    sr.xor128 = xor128;\n    sr.xorwow = xorwow;\n    sr.xorshift7 = xorshift7;\n    sr.xor4096 = xor4096;\n    sr.tychei = tychei;\n    module.exports = sr;\n  }\n});\nvar require_string_decoder = __commonJS({\n  \"(disabled):src/node_modules/string_decoder/index.js\"() {\n  }\n});\nvar require_tfjs_backend_wasm_threaded_simd = __commonJS({\n  \"src/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.js\"(exports, module) {\n    var WasmBackendModuleThreadedSimd = function() {\n      var _scriptDir = typeof document !== \"undefined\" && document.currentScript ? document.currentScript.src : void 0;\n      if (typeof __filename !== \"undefined\")\n        _scriptDir = _scriptDir || __filename;\n      return function(WasmBackendModuleThreadedSimd2) {\n        WasmBackendModuleThreadedSimd2 = WasmBackendModuleThreadedSimd2 || {};\n        function GROWABLE_HEAP_I8() {\n          if (wasmMemory.buffer != buffer2) {\n            updateGlobalBufferAndViews(wasmMemory.buffer);\n          }\n          return HEAP8;\n        }\n        function GROWABLE_HEAP_U8() {\n          if (wasmMemory.buffer != buffer2) {\n            updateGlobalBufferAndViews(wasmMemory.buffer);\n          }\n          return HEAPU8;\n        }\n        function GROWABLE_HEAP_I32() {\n          if (wasmMemory.buffer != buffer2) {\n            updateGlobalBufferAndViews(wasmMemory.buffer);\n          }\n          return HEAP32;\n        }\n        function GROWABLE_HEAP_U32() {\n          if (wasmMemory.buffer != buffer2) {\n            updateGlobalBufferAndViews(wasmMemory.buffer);\n          }\n          return HEAPU32;\n        }\n        function GROWABLE_HEAP_F64() {\n          if (wasmMemory.buffer != buffer2) {\n            updateGlobalBufferAndViews(wasmMemory.buffer);\n          }\n          return HEAPF64;\n        }\n        var Module = typeof WasmBackendModuleThreadedSimd2 !== \"undefined\" ? WasmBackendModuleThreadedSimd2 : {};\n        var readyPromiseResolve, readyPromiseReject;\n        Module[\"ready\"] = new Promise(function(resolve, reject) {\n          readyPromiseResolve = resolve;\n          readyPromiseReject = reject;\n        });\n        var moduleOverrides = {};\n        var key;\n        for (key in Module) {\n          if (Module.hasOwnProperty(key)) {\n            moduleOverrides[key] = Module[key];\n          }\n        }\n        var arguments_ = [];\n        var thisProgram = \"./this.program\";\n        var quit_ = function(status, toThrow) {\n          throw toThrow;\n        };\n        var ENVIRONMENT_IS_WEB = false;\n        var ENVIRONMENT_IS_WORKER = false;\n        var ENVIRONMENT_IS_NODE = false;\n        var ENVIRONMENT_IS_SHELL = false;\n        ENVIRONMENT_IS_WEB = typeof window === \"object\";\n        ENVIRONMENT_IS_WORKER = typeof importScripts === \"function\";\n        ENVIRONMENT_IS_NODE = typeof process === \"object\" && typeof process.versions === \"object\" && typeof process.versions.node === \"string\";\n        ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;\n        var ENVIRONMENT_IS_PTHREAD = Module[\"ENVIRONMENT_IS_PTHREAD\"] || false;\n        if (ENVIRONMENT_IS_PTHREAD) {\n          buffer2 = Module[\"buffer\"];\n        }\n        var scriptDirectory = \"\";\n        function locateFile(path) {\n          if (Module[\"locateFile\"]) {\n            return Module[\"locateFile\"](path, scriptDirectory);\n          }\n          return scriptDirectory + path;\n        }\n        var read_, readAsync, readBinary, setWindowTitle;\n        var nodeFS;\n        var nodePath;\n        if (ENVIRONMENT_IS_NODE) {\n          if (ENVIRONMENT_IS_WORKER) {\n            scriptDirectory = __require2(\"path\").dirname(scriptDirectory) + \"/\";\n          } else {\n            scriptDirectory = __dirname + \"/\";\n          }\n          read_ = function shell_read(filename, binary) {\n            if (!nodeFS)\n              nodeFS = __require2(\"fs\");\n            if (!nodePath)\n              nodePath = __require2(\"path\");\n            filename = nodePath[\"normalize\"](filename);\n            return nodeFS[\"readFileSync\"](filename, binary ? null : \"utf8\");\n          };\n          readBinary = function readBinary2(filename) {\n            var ret = read_(filename, true);\n            if (!ret.buffer) {\n              ret = new Uint8Array(ret);\n            }\n            assert3(ret.buffer);\n            return ret;\n          };\n          if (process[\"argv\"].length > 1) {\n            thisProgram = process[\"argv\"][1].replace(/\\\\/g, \"/\");\n          }\n          arguments_ = process[\"argv\"].slice(2);\n          process[\"on\"](\"uncaughtException\", function(ex) {\n            if (!(ex instanceof ExitStatus)) {\n              throw ex;\n            }\n          });\n          process[\"on\"](\"unhandledRejection\", abort);\n          quit_ = function(status) {\n            process[\"exit\"](status);\n          };\n          Module[\"inspect\"] = function() {\n            return \"[Emscripten Module object]\";\n          };\n          var nodeWorkerThreads;\n          try {\n            nodeWorkerThreads = __require2(\"worker_threads\");\n          } catch (e) {\n            console.error('The \"worker_threads\" module is not supported in this node.js build - perhaps a newer version is needed?');\n            throw e;\n          }\n          global.Worker = nodeWorkerThreads.Worker;\n        } else if (ENVIRONMENT_IS_SHELL) {\n          if (typeof read != \"undefined\") {\n            read_ = function shell_read(f) {\n              return read(f);\n            };\n          }\n          readBinary = function readBinary2(f) {\n            var data;\n            if (typeof readbuffer === \"function\") {\n              return new Uint8Array(readbuffer(f));\n            }\n            data = read(f, \"binary\");\n            assert3(typeof data === \"object\");\n            return data;\n          };\n          if (typeof scriptArgs != \"undefined\") {\n            arguments_ = scriptArgs;\n          } else if (typeof arguments != \"undefined\") {\n            arguments_ = arguments;\n          }\n          if (typeof quit === \"function\") {\n            quit_ = function(status) {\n              quit(status);\n            };\n          }\n          if (typeof print !== \"undefined\") {\n            if (typeof console === \"undefined\")\n              console = {};\n            console.log = print;\n            console.warn = console.error = typeof printErr !== \"undefined\" ? printErr : print;\n          }\n        } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {\n          if (ENVIRONMENT_IS_WORKER) {\n            scriptDirectory = self.location.href;\n          } else if (typeof document !== \"undefined\" && document.currentScript) {\n            scriptDirectory = document.currentScript.src;\n          }\n          if (typeof _scriptDir !== \"undefined\" && _scriptDir) {\n            scriptDirectory = _scriptDir;\n          }\n          if (scriptDirectory.indexOf(\"blob:\") !== 0) {\n            scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf(\"/\") + 1);\n          } else {\n            scriptDirectory = \"\";\n          }\n          if (ENVIRONMENT_IS_NODE) {\n            read_ = function shell_read(filename, binary) {\n              if (!nodeFS)\n                nodeFS = __require2(\"fs\");\n              if (!nodePath)\n                nodePath = __require2(\"path\");\n              filename = nodePath[\"normalize\"](filename);\n              return nodeFS[\"readFileSync\"](filename, binary ? null : \"utf8\");\n            };\n            readBinary = function readBinary2(filename) {\n              var ret = read_(filename, true);\n              if (!ret.buffer) {\n                ret = new Uint8Array(ret);\n              }\n              assert3(ret.buffer);\n              return ret;\n            };\n          } else {\n            read_ = function(url) {\n              var xhr = new XMLHttpRequest();\n              xhr.open(\"GET\", url, false);\n              xhr.send(null);\n              return xhr.responseText;\n            };\n            if (ENVIRONMENT_IS_WORKER) {\n              readBinary = function(url) {\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", url, false);\n                xhr.responseType = \"arraybuffer\";\n                xhr.send(null);\n                return new Uint8Array(xhr.response);\n              };\n            }\n            readAsync = function(url, onload, onerror) {\n              var xhr = new XMLHttpRequest();\n              xhr.open(\"GET\", url, true);\n              xhr.responseType = \"arraybuffer\";\n              xhr.onload = function() {\n                if (xhr.status == 200 || xhr.status == 0 && xhr.response) {\n                  onload(xhr.response);\n                  return;\n                }\n                onerror();\n              };\n              xhr.onerror = onerror;\n              xhr.send(null);\n            };\n          }\n          setWindowTitle = function(title) {\n            document.title = title;\n          };\n        } else {\n        }\n        if (ENVIRONMENT_IS_NODE) {\n          if (typeof performance === \"undefined\") {\n            global.performance = __require2(\"perf_hooks\").performance;\n          }\n        }\n        var out = Module[\"print\"] || console.log.bind(console);\n        var err = Module[\"printErr\"] || console.warn.bind(console);\n        for (key in moduleOverrides) {\n          if (moduleOverrides.hasOwnProperty(key)) {\n            Module[key] = moduleOverrides[key];\n          }\n        }\n        moduleOverrides = null;\n        if (Module[\"arguments\"])\n          arguments_ = Module[\"arguments\"];\n        if (Module[\"thisProgram\"])\n          thisProgram = Module[\"thisProgram\"];\n        if (Module[\"quit\"])\n          quit_ = Module[\"quit\"];\n        function warnOnce(text) {\n          if (!warnOnce.shown)\n            warnOnce.shown = {};\n          if (!warnOnce.shown[text]) {\n            warnOnce.shown[text] = 1;\n            err(text);\n          }\n        }\n        var Atomics_load = Atomics.load;\n        var Atomics_store = Atomics.store;\n        var Atomics_compareExchange = Atomics.compareExchange;\n        var wasmBinary;\n        if (Module[\"wasmBinary\"])\n          wasmBinary = Module[\"wasmBinary\"];\n        var noExitRuntime = Module[\"noExitRuntime\"] || true;\n        if (typeof WebAssembly !== \"object\") {\n          abort(\"no native wasm support detected\");\n        }\n        var wasmMemory;\n        var wasmModule;\n        var ABORT = false;\n        var EXITSTATUS;\n        function assert3(condition, text) {\n          if (!condition) {\n            abort(\"Assertion failed: \" + text);\n          }\n        }\n        function getCFunc(ident) {\n          var func2 = Module[\"_\" + ident];\n          assert3(func2, \"Cannot call unknown function \" + ident + \", make sure it is exported\");\n          return func2;\n        }\n        function ccall(ident, returnType, argTypes, args, opts) {\n          var toC = { \"string\": function(str) {\n            var ret2 = 0;\n            if (str !== null && str !== void 0 && str !== 0) {\n              var len = (str.length << 2) + 1;\n              ret2 = stackAlloc(len);\n              stringToUTF8(str, ret2, len);\n            }\n            return ret2;\n          }, \"array\": function(arr) {\n            var ret2 = stackAlloc(arr.length);\n            writeArrayToMemory(arr, ret2);\n            return ret2;\n          } };\n          function convertReturnValue(ret2) {\n            if (returnType === \"string\")\n              return UTF8ToString(ret2);\n            if (returnType === \"boolean\")\n              return Boolean(ret2);\n            return ret2;\n          }\n          var func2 = getCFunc(ident);\n          var cArgs = [];\n          var stack2 = 0;\n          if (args) {\n            for (var i = 0; i < args.length; i++) {\n              var converter = toC[argTypes[i]];\n              if (converter) {\n                if (stack2 === 0)\n                  stack2 = stackSave();\n                cArgs[i] = converter(args[i]);\n              } else {\n                cArgs[i] = args[i];\n              }\n            }\n          }\n          var ret = func2.apply(null, cArgs);\n          ret = convertReturnValue(ret);\n          if (stack2 !== 0)\n            stackRestore(stack2);\n          return ret;\n        }\n        function cwrap(ident, returnType, argTypes, opts) {\n          argTypes = argTypes || [];\n          var numericArgs = argTypes.every(function(type) {\n            return type === \"number\";\n          });\n          var numericRet = returnType !== \"string\";\n          if (numericRet && numericArgs && !opts) {\n            return getCFunc(ident);\n          }\n          return function() {\n            return ccall(ident, returnType, argTypes, arguments, opts);\n          };\n        }\n        function UTF8ArrayToString(heap, idx, maxBytesToRead) {\n          var endIdx = idx + maxBytesToRead;\n          var str = \"\";\n          while (!(idx >= endIdx)) {\n            var u0 = heap[idx++];\n            if (!u0)\n              return str;\n            if (!(u0 & 128)) {\n              str += String.fromCharCode(u0);\n              continue;\n            }\n            var u1 = heap[idx++] & 63;\n            if ((u0 & 224) == 192) {\n              str += String.fromCharCode((u0 & 31) << 6 | u1);\n              continue;\n            }\n            var u2 = heap[idx++] & 63;\n            if ((u0 & 240) == 224) {\n              u0 = (u0 & 15) << 12 | u1 << 6 | u2;\n            } else {\n              u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63;\n            }\n            if (u0 < 65536) {\n              str += String.fromCharCode(u0);\n            } else {\n              var ch = u0 - 65536;\n              str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023);\n            }\n          }\n          return str;\n        }\n        function UTF8ToString(ptr, maxBytesToRead) {\n          return ptr ? UTF8ArrayToString(GROWABLE_HEAP_U8(), ptr, maxBytesToRead) : \"\";\n        }\n        function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) {\n          if (!(maxBytesToWrite > 0))\n            return 0;\n          var startIdx = outIdx;\n          var endIdx = outIdx + maxBytesToWrite - 1;\n          for (var i = 0; i < str.length; ++i) {\n            var u = str.charCodeAt(i);\n            if (u >= 55296 && u <= 57343) {\n              var u1 = str.charCodeAt(++i);\n              u = 65536 + ((u & 1023) << 10) | u1 & 1023;\n            }\n            if (u <= 127) {\n              if (outIdx >= endIdx)\n                break;\n              heap[outIdx++] = u;\n            } else if (u <= 2047) {\n              if (outIdx + 1 >= endIdx)\n                break;\n              heap[outIdx++] = 192 | u >> 6;\n              heap[outIdx++] = 128 | u & 63;\n            } else if (u <= 65535) {\n              if (outIdx + 2 >= endIdx)\n                break;\n              heap[outIdx++] = 224 | u >> 12;\n              heap[outIdx++] = 128 | u >> 6 & 63;\n              heap[outIdx++] = 128 | u & 63;\n            } else {\n              if (outIdx + 3 >= endIdx)\n                break;\n              heap[outIdx++] = 240 | u >> 18;\n              heap[outIdx++] = 128 | u >> 12 & 63;\n              heap[outIdx++] = 128 | u >> 6 & 63;\n              heap[outIdx++] = 128 | u & 63;\n            }\n          }\n          heap[outIdx] = 0;\n          return outIdx - startIdx;\n        }\n        function stringToUTF8(str, outPtr, maxBytesToWrite) {\n          return stringToUTF8Array(str, GROWABLE_HEAP_U8(), outPtr, maxBytesToWrite);\n        }\n        function lengthBytesUTF8(str) {\n          var len = 0;\n          for (var i = 0; i < str.length; ++i) {\n            var u = str.charCodeAt(i);\n            if (u >= 55296 && u <= 57343)\n              u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023;\n            if (u <= 127)\n              ++len;\n            else if (u <= 2047)\n              len += 2;\n            else if (u <= 65535)\n              len += 3;\n            else\n              len += 4;\n          }\n          return len;\n        }\n        function writeArrayToMemory(array2, buffer3) {\n          GROWABLE_HEAP_I8().set(array2, buffer3);\n        }\n        function alignUp(x, multiple) {\n          if (x % multiple > 0) {\n            x += multiple - x % multiple;\n          }\n          return x;\n        }\n        var buffer2, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;\n        function updateGlobalBufferAndViews(buf) {\n          buffer2 = buf;\n          Module[\"HEAP8\"] = HEAP8 = new Int8Array(buf);\n          Module[\"HEAP16\"] = HEAP16 = new Int16Array(buf);\n          Module[\"HEAP32\"] = HEAP32 = new Int32Array(buf);\n          Module[\"HEAPU8\"] = HEAPU8 = new Uint8Array(buf);\n          Module[\"HEAPU16\"] = HEAPU16 = new Uint16Array(buf);\n          Module[\"HEAPU32\"] = HEAPU32 = new Uint32Array(buf);\n          Module[\"HEAPF32\"] = HEAPF32 = new Float32Array(buf);\n          Module[\"HEAPF64\"] = HEAPF64 = new Float64Array(buf);\n        }\n        var INITIAL_MEMORY = Module[\"INITIAL_MEMORY\"] || 16777216;\n        if (ENVIRONMENT_IS_PTHREAD) {\n          wasmMemory = Module[\"wasmMemory\"];\n          buffer2 = Module[\"buffer\"];\n        } else {\n          if (Module[\"wasmMemory\"]) {\n            wasmMemory = Module[\"wasmMemory\"];\n          } else {\n            wasmMemory = new WebAssembly.Memory({ \"initial\": INITIAL_MEMORY / 65536, \"maximum\": 2147483648 / 65536, \"shared\": true });\n            if (!(wasmMemory.buffer instanceof SharedArrayBuffer)) {\n              err(\"requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag\");\n              if (ENVIRONMENT_IS_NODE) {\n                console.log(\"(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)\");\n              }\n              throw Error(\"bad memory\");\n            }\n          }\n        }\n        if (wasmMemory) {\n          buffer2 = wasmMemory.buffer;\n        }\n        INITIAL_MEMORY = buffer2.byteLength;\n        updateGlobalBufferAndViews(buffer2);\n        var wasmTable;\n        var __ATPRERUN__ = [];\n        var __ATINIT__ = [];\n        var __ATMAIN__ = [];\n        var __ATEXIT__ = [];\n        var __ATPOSTRUN__ = [];\n        var runtimeInitialized = false;\n        var runtimeExited = false;\n        if (!ENVIRONMENT_IS_PTHREAD)\n          __ATINIT__.push({ func: function() {\n            ___wasm_call_ctors();\n          } });\n        function preRun() {\n          if (ENVIRONMENT_IS_PTHREAD)\n            return;\n          if (Module[\"preRun\"]) {\n            if (typeof Module[\"preRun\"] == \"function\")\n              Module[\"preRun\"] = [Module[\"preRun\"]];\n            while (Module[\"preRun\"].length) {\n              addOnPreRun(Module[\"preRun\"].shift());\n            }\n          }\n          callRuntimeCallbacks(__ATPRERUN__);\n        }\n        function initRuntime() {\n          runtimeInitialized = true;\n          if (ENVIRONMENT_IS_PTHREAD)\n            return;\n          callRuntimeCallbacks(__ATINIT__);\n        }\n        function preMain() {\n          if (ENVIRONMENT_IS_PTHREAD)\n            return;\n          callRuntimeCallbacks(__ATMAIN__);\n        }\n        function exitRuntime() {\n          if (ENVIRONMENT_IS_PTHREAD)\n            return;\n          runtimeExited = true;\n        }\n        function postRun() {\n          if (ENVIRONMENT_IS_PTHREAD)\n            return;\n          if (Module[\"postRun\"]) {\n            if (typeof Module[\"postRun\"] == \"function\")\n              Module[\"postRun\"] = [Module[\"postRun\"]];\n            while (Module[\"postRun\"].length) {\n              addOnPostRun(Module[\"postRun\"].shift());\n            }\n          }\n          callRuntimeCallbacks(__ATPOSTRUN__);\n        }\n        function addOnPreRun(cb) {\n          __ATPRERUN__.unshift(cb);\n        }\n        function addOnPostRun(cb) {\n          __ATPOSTRUN__.unshift(cb);\n        }\n        var runDependencies = 0;\n        var runDependencyWatcher = null;\n        var dependenciesFulfilled = null;\n        function addRunDependency(id) {\n          assert3(!ENVIRONMENT_IS_PTHREAD, \"addRunDependency cannot be used in a pthread worker\");\n          runDependencies++;\n          if (Module[\"monitorRunDependencies\"]) {\n            Module[\"monitorRunDependencies\"](runDependencies);\n          }\n        }\n        function removeRunDependency(id) {\n          runDependencies--;\n          if (Module[\"monitorRunDependencies\"]) {\n            Module[\"monitorRunDependencies\"](runDependencies);\n          }\n          if (runDependencies == 0) {\n            if (runDependencyWatcher !== null) {\n              clearInterval(runDependencyWatcher);\n              runDependencyWatcher = null;\n            }\n            if (dependenciesFulfilled) {\n              var callback = dependenciesFulfilled;\n              dependenciesFulfilled = null;\n              callback();\n            }\n          }\n        }\n        Module[\"preloadedImages\"] = {};\n        Module[\"preloadedAudios\"] = {};\n        function abort(what) {\n          if (Module[\"onAbort\"]) {\n            Module[\"onAbort\"](what);\n          }\n          if (ENVIRONMENT_IS_PTHREAD)\n            console.error(\"Pthread aborting at \" + new Error().stack);\n          what += \"\";\n          err(what);\n          ABORT = true;\n          EXITSTATUS = 1;\n          what = \"abort(\" + what + \"). Build with -s ASSERTIONS=1 for more info.\";\n          var e = new WebAssembly.RuntimeError(what);\n          readyPromiseReject(e);\n          throw e;\n        }\n        function hasPrefix(str, prefix) {\n          return String.prototype.startsWith ? str.startsWith(prefix) : str.indexOf(prefix) === 0;\n        }\n        var dataURIPrefix = \"data:application/octet-stream;base64,\";\n        function isDataURI(filename) {\n          return hasPrefix(filename, dataURIPrefix);\n        }\n        var fileURIPrefix = \"file://\";\n        function isFileURI(filename) {\n          return hasPrefix(filename, fileURIPrefix);\n        }\n        var wasmBinaryFile = \"tfjs-backend-wasm-threaded-simd.wasm\";\n        if (!isDataURI(wasmBinaryFile)) {\n          wasmBinaryFile = locateFile(wasmBinaryFile);\n        }\n        function getBinary(file) {\n          try {\n            if (file == wasmBinaryFile && wasmBinary) {\n              return new Uint8Array(wasmBinary);\n            }\n            if (readBinary) {\n              return readBinary(file);\n            } else {\n              throw \"both async and sync fetching of the wasm failed\";\n            }\n          } catch (err2) {\n            abort(err2);\n          }\n        }\n        function getBinaryPromise() {\n          if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) {\n            if (typeof fetch === \"function\" && !isFileURI(wasmBinaryFile)) {\n              return fetch(wasmBinaryFile, { credentials: \"same-origin\" }).then(function(response) {\n                if (!response[\"ok\"]) {\n                  throw \"failed to load wasm binary file at '\" + wasmBinaryFile + \"'\";\n                }\n                return response[\"arrayBuffer\"]();\n              }).catch(function() {\n                return getBinary(wasmBinaryFile);\n              });\n            } else {\n              if (readAsync) {\n                return new Promise(function(resolve, reject) {\n                  readAsync(wasmBinaryFile, function(response) {\n                    resolve(new Uint8Array(response));\n                  }, reject);\n                });\n              }\n            }\n          }\n          return Promise.resolve().then(function() {\n            return getBinary(wasmBinaryFile);\n          });\n        }\n        function createWasm() {\n          var info = { \"a\": asmLibraryArg };\n          function receiveInstance(instance, module2) {\n            var exports3 = instance.exports;\n            Module[\"asm\"] = exports3;\n            wasmTable = Module[\"asm\"][\"kb\"];\n            wasmModule = module2;\n            if (!ENVIRONMENT_IS_PTHREAD) {\n              var numWorkersToLoad = PThread.unusedWorkers.length;\n              PThread.unusedWorkers.forEach(function(w) {\n                PThread.loadWasmModuleToWorker(w, function() {\n                  if (!--numWorkersToLoad)\n                    removeRunDependency(\"wasm-instantiate\");\n                });\n              });\n            }\n          }\n          if (!ENVIRONMENT_IS_PTHREAD) {\n            addRunDependency(\"wasm-instantiate\");\n          }\n          function receiveInstantiatedSource(output) {\n            receiveInstance(output[\"instance\"], output[\"module\"]);\n          }\n          function instantiateArrayBuffer(receiver) {\n            return getBinaryPromise().then(function(binary) {\n              return WebAssembly.instantiate(binary, info);\n            }).then(receiver, function(reason) {\n              err(\"failed to asynchronously prepare wasm: \" + reason);\n              abort(reason);\n            });\n          }\n          function instantiateAsync() {\n            if (!wasmBinary && typeof WebAssembly.instantiateStreaming === \"function\" && !isDataURI(wasmBinaryFile) && !isFileURI(wasmBinaryFile) && typeof fetch === \"function\") {\n              return fetch(wasmBinaryFile, { credentials: \"same-origin\" }).then(function(response) {\n                var result = WebAssembly.instantiateStreaming(response, info);\n                return result.then(receiveInstantiatedSource, function(reason) {\n                  err(\"wasm streaming compile failed: \" + reason);\n                  err(\"falling back to ArrayBuffer instantiation\");\n                  return instantiateArrayBuffer(receiveInstantiatedSource);\n                });\n              });\n            } else {\n              return instantiateArrayBuffer(receiveInstantiatedSource);\n            }\n          }\n          if (Module[\"instantiateWasm\"]) {\n            try {\n              var exports2 = Module[\"instantiateWasm\"](info, receiveInstance);\n              return exports2;\n            } catch (e) {\n              err(\"Module.instantiateWasm callback failed with error: \" + e);\n              return false;\n            }\n          }\n          instantiateAsync().catch(readyPromiseReject);\n          return {};\n        }\n        var ASM_CONSTS = { 10072: function() {\n          throw \"Canceled!\";\n        }, 10090: function($0, $1) {\n          setTimeout(function() {\n            __emscripten_do_dispatch_to_thread($0, $1);\n          }, 0);\n        } };\n        function initPthreadsJS() {\n          PThread.initRuntime();\n        }\n        function callRuntimeCallbacks(callbacks2) {\n          while (callbacks2.length > 0) {\n            var callback = callbacks2.shift();\n            if (typeof callback == \"function\") {\n              callback(Module);\n              continue;\n            }\n            var func2 = callback.func;\n            if (typeof func2 === \"number\") {\n              if (callback.arg === void 0) {\n                wasmTable.get(func2)();\n              } else {\n                wasmTable.get(func2)(callback.arg);\n              }\n            } else {\n              func2(callback.arg === void 0 ? null : callback.arg);\n            }\n          }\n        }\n        var ERRNO_CODES = { EPERM: 63, ENOENT: 44, ESRCH: 71, EINTR: 27, EIO: 29, ENXIO: 60, E2BIG: 1, ENOEXEC: 45, EBADF: 8, ECHILD: 12, EAGAIN: 6, EWOULDBLOCK: 6, ENOMEM: 48, EACCES: 2, EFAULT: 21, ENOTBLK: 105, EBUSY: 10, EEXIST: 20, EXDEV: 75, ENODEV: 43, ENOTDIR: 54, EISDIR: 31, EINVAL: 28, ENFILE: 41, EMFILE: 33, ENOTTY: 59, ETXTBSY: 74, EFBIG: 22, ENOSPC: 51, ESPIPE: 70, EROFS: 69, EMLINK: 34, EPIPE: 64, EDOM: 18, ERANGE: 68, ENOMSG: 49, EIDRM: 24, ECHRNG: 106, EL2NSYNC: 156, EL3HLT: 107, EL3RST: 108, ELNRNG: 109, EUNATCH: 110, ENOCSI: 111, EL2HLT: 112, EDEADLK: 16, ENOLCK: 46, EBADE: 113, EBADR: 114, EXFULL: 115, ENOANO: 104, EBADRQC: 103, EBADSLT: 102, EDEADLOCK: 16, EBFONT: 101, ENOSTR: 100, ENODATA: 116, ETIME: 117, ENOSR: 118, ENONET: 119, ENOPKG: 120, EREMOTE: 121, ENOLINK: 47, EADV: 122, ESRMNT: 123, ECOMM: 124, EPROTO: 65, EMULTIHOP: 36, EDOTDOT: 125, EBADMSG: 9, ENOTUNIQ: 126, EBADFD: 127, EREMCHG: 128, ELIBACC: 129, ELIBBAD: 130, ELIBSCN: 131, ELIBMAX: 132, ELIBEXEC: 133, ENOSYS: 52, ENOTEMPTY: 55, ENAMETOOLONG: 37, ELOOP: 32, EOPNOTSUPP: 138, EPFNOSUPPORT: 139, ECONNRESET: 15, ENOBUFS: 42, EAFNOSUPPORT: 5, EPROTOTYPE: 67, ENOTSOCK: 57, ENOPROTOOPT: 50, ESHUTDOWN: 140, ECONNREFUSED: 14, EADDRINUSE: 3, ECONNABORTED: 13, ENETUNREACH: 40, ENETDOWN: 38, ETIMEDOUT: 73, EHOSTDOWN: 142, EHOSTUNREACH: 23, EINPROGRESS: 26, EALREADY: 7, EDESTADDRREQ: 17, EMSGSIZE: 35, EPROTONOSUPPORT: 66, ESOCKTNOSUPPORT: 137, EADDRNOTAVAIL: 4, ENETRESET: 39, EISCONN: 30, ENOTCONN: 53, ETOOMANYREFS: 141, EUSERS: 136, EDQUOT: 19, ESTALE: 72, ENOTSUP: 138, ENOMEDIUM: 148, EILSEQ: 25, EOVERFLOW: 61, ECANCELED: 11, ENOTRECOVERABLE: 56, EOWNERDEAD: 62, ESTRPIPE: 135 };\n        function _emscripten_futex_wake(addr, count2) {\n          if (addr <= 0 || addr > GROWABLE_HEAP_I8().length || addr & true || count2 < 0)\n            return -28;\n          if (count2 == 0)\n            return 0;\n          if (count2 >= 2147483647)\n            count2 = Infinity;\n          var mainThreadWaitAddress = Atomics.load(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2);\n          var mainThreadWoken = 0;\n          if (mainThreadWaitAddress == addr) {\n            var loadedAddr = Atomics.compareExchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, mainThreadWaitAddress, 0);\n            if (loadedAddr == mainThreadWaitAddress) {\n              --count2;\n              mainThreadWoken = 1;\n              if (count2 <= 0)\n                return 1;\n            }\n          }\n          var ret = Atomics.notify(GROWABLE_HEAP_I32(), addr >> 2, count2);\n          if (ret >= 0)\n            return ret + mainThreadWoken;\n          throw \"Atomics.notify returned an unexpected value \" + ret;\n        }\n        Module[\"_emscripten_futex_wake\"] = _emscripten_futex_wake;\n        function killThread(pthread_ptr) {\n          if (ENVIRONMENT_IS_PTHREAD)\n            throw \"Internal Error! killThread() can only ever be called from main application thread!\";\n          if (!pthread_ptr)\n            throw \"Internal Error! Null pthread_ptr in killThread!\";\n          GROWABLE_HEAP_I32()[pthread_ptr + 12 >> 2] = 0;\n          var pthread = PThread.pthreads[pthread_ptr];\n          pthread.worker.terminate();\n          PThread.freeThreadData(pthread);\n          PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(pthread.worker), 1);\n          pthread.worker.pthread = void 0;\n        }\n        function cancelThread(pthread_ptr) {\n          if (ENVIRONMENT_IS_PTHREAD)\n            throw \"Internal Error! cancelThread() can only ever be called from main application thread!\";\n          if (!pthread_ptr)\n            throw \"Internal Error! Null pthread_ptr in cancelThread!\";\n          var pthread = PThread.pthreads[pthread_ptr];\n          pthread.worker.postMessage({ \"cmd\": \"cancel\" });\n        }\n        function cleanupThread(pthread_ptr) {\n          if (ENVIRONMENT_IS_PTHREAD)\n            throw \"Internal Error! cleanupThread() can only ever be called from main application thread!\";\n          if (!pthread_ptr)\n            throw \"Internal Error! Null pthread_ptr in cleanupThread!\";\n          var pthread = PThread.pthreads[pthread_ptr];\n          if (pthread) {\n            GROWABLE_HEAP_I32()[pthread_ptr + 12 >> 2] = 0;\n            var worker = pthread.worker;\n            PThread.returnWorkerToPool(worker);\n          }\n        }\n        var PThread = { unusedWorkers: [], runningWorkers: [], initMainThreadBlock: function() {\n          var pthreadPoolSize = 8;\n          for (var i = 0; i < pthreadPoolSize; ++i) {\n            PThread.allocateUnusedWorker();\n          }\n        }, initRuntime: function() {\n          var tb = _malloc(228);\n          for (var i = 0; i < 228 / 4; ++i)\n            GROWABLE_HEAP_U32()[tb / 4 + i] = 0;\n          GROWABLE_HEAP_I32()[tb + 12 >> 2] = tb;\n          var headPtr = tb + 152;\n          GROWABLE_HEAP_I32()[headPtr >> 2] = headPtr;\n          var tlsMemory = _malloc(512);\n          for (var i = 0; i < 128; ++i)\n            GROWABLE_HEAP_U32()[tlsMemory / 4 + i] = 0;\n          Atomics.store(GROWABLE_HEAP_U32(), tb + 100 >> 2, tlsMemory);\n          Atomics.store(GROWABLE_HEAP_U32(), tb + 40 >> 2, tb);\n          __emscripten_thread_init(tb, !ENVIRONMENT_IS_WORKER, 1);\n          _emscripten_register_main_browser_thread_id(tb);\n        }, initWorker: function() {\n        }, pthreads: {}, threadExitHandlers: [], setThreadStatus: function() {\n        }, runExitHandlers: function() {\n          while (PThread.threadExitHandlers.length > 0) {\n            PThread.threadExitHandlers.pop()();\n          }\n          if (ENVIRONMENT_IS_PTHREAD && _pthread_self())\n            ___pthread_tsd_run_dtors();\n        }, runExitHandlersAndDeinitThread: function(tb, exitCode) {\n          Atomics.store(GROWABLE_HEAP_U32(), tb + 56 >> 2, 1);\n          Atomics.store(GROWABLE_HEAP_U32(), tb + 60 >> 2, 0);\n          PThread.runExitHandlers();\n          Atomics.store(GROWABLE_HEAP_U32(), tb + 4 >> 2, exitCode);\n          Atomics.store(GROWABLE_HEAP_U32(), tb + 0 >> 2, 1);\n          _emscripten_futex_wake(tb + 0, 2147483647);\n          __emscripten_thread_init(0, 0, 0);\n        }, threadExit: function(exitCode) {\n          var tb = _pthread_self();\n          if (tb) {\n            PThread.runExitHandlersAndDeinitThread(tb, exitCode);\n            if (ENVIRONMENT_IS_PTHREAD) {\n              postMessage({ \"cmd\": \"exit\" });\n            }\n          }\n        }, threadCancel: function() {\n          PThread.runExitHandlersAndDeinitThread(_pthread_self(), -1);\n          postMessage({ \"cmd\": \"cancelDone\" });\n        }, terminateAllThreads: function() {\n          for (var t in PThread.pthreads) {\n            var pthread = PThread.pthreads[t];\n            if (pthread && pthread.worker) {\n              PThread.returnWorkerToPool(pthread.worker);\n            }\n          }\n          PThread.pthreads = {};\n          for (var i = 0; i < PThread.unusedWorkers.length; ++i) {\n            var worker = PThread.unusedWorkers[i];\n            worker.terminate();\n          }\n          PThread.unusedWorkers = [];\n          for (var i = 0; i < PThread.runningWorkers.length; ++i) {\n            var worker = PThread.runningWorkers[i];\n            var pthread = worker.pthread;\n            PThread.freeThreadData(pthread);\n            worker.terminate();\n          }\n          PThread.runningWorkers = [];\n        }, freeThreadData: function(pthread) {\n          if (!pthread)\n            return;\n          if (pthread.threadInfoStruct) {\n            var tlsMemory = GROWABLE_HEAP_I32()[pthread.threadInfoStruct + 100 >> 2];\n            GROWABLE_HEAP_I32()[pthread.threadInfoStruct + 100 >> 2] = 0;\n            _free(tlsMemory);\n            _free(pthread.threadInfoStruct);\n          }\n          pthread.threadInfoStruct = 0;\n          if (pthread.allocatedOwnStack && pthread.stackBase)\n            _free(pthread.stackBase);\n          pthread.stackBase = 0;\n          if (pthread.worker)\n            pthread.worker.pthread = null;\n        }, returnWorkerToPool: function(worker) {\n          PThread.runWithoutMainThreadQueuedCalls(function() {\n            delete PThread.pthreads[worker.pthread.threadInfoStruct];\n            PThread.unusedWorkers.push(worker);\n            PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker), 1);\n            PThread.freeThreadData(worker.pthread);\n            worker.pthread = void 0;\n          });\n        }, runWithoutMainThreadQueuedCalls: function(func2) {\n          GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls >> 2] = 0;\n          try {\n            func2();\n          } finally {\n            GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls >> 2] = 1;\n          }\n        }, receiveObjectTransfer: function(data) {\n        }, loadWasmModuleToWorker: function(worker, onFinishedLoading) {\n          worker.onmessage = function(e) {\n            var d = e[\"data\"];\n            var cmd = d[\"cmd\"];\n            if (worker.pthread)\n              PThread.currentProxiedOperationCallerThread = worker.pthread.threadInfoStruct;\n            if (d[\"targetThread\"] && d[\"targetThread\"] != _pthread_self()) {\n              var thread = PThread.pthreads[d.targetThread];\n              if (thread) {\n                thread.worker.postMessage(e.data, d[\"transferList\"]);\n              } else {\n                console.error('Internal error! Worker sent a message \"' + cmd + '\" to target pthread ' + d[\"targetThread\"] + \", but that thread no longer exists!\");\n              }\n              PThread.currentProxiedOperationCallerThread = void 0;\n              return;\n            }\n            if (cmd === \"processQueuedMainThreadWork\") {\n              _emscripten_main_thread_process_queued_calls();\n            } else if (cmd === \"spawnThread\") {\n              spawnThread(e.data);\n            } else if (cmd === \"cleanupThread\") {\n              cleanupThread(d[\"thread\"]);\n            } else if (cmd === \"killThread\") {\n              killThread(d[\"thread\"]);\n            } else if (cmd === \"cancelThread\") {\n              cancelThread(d[\"thread\"]);\n            } else if (cmd === \"loaded\") {\n              worker.loaded = true;\n              if (onFinishedLoading)\n                onFinishedLoading(worker);\n              if (worker.runPthread) {\n                worker.runPthread();\n                delete worker.runPthread;\n              }\n            } else if (cmd === \"print\") {\n              out(\"Thread \" + d[\"threadId\"] + \": \" + d[\"text\"]);\n            } else if (cmd === \"printErr\") {\n              err(\"Thread \" + d[\"threadId\"] + \": \" + d[\"text\"]);\n            } else if (cmd === \"alert\") {\n              alert(\"Thread \" + d[\"threadId\"] + \": \" + d[\"text\"]);\n            } else if (cmd === \"exit\") {\n              var detached = worker.pthread && Atomics.load(GROWABLE_HEAP_U32(), worker.pthread.threadInfoStruct + 64 >> 2);\n              if (detached) {\n                PThread.returnWorkerToPool(worker);\n              }\n            } else if (cmd === \"exitProcess\") {\n              try {\n                exit(d[\"returnCode\"]);\n              } catch (e2) {\n                if (e2 instanceof ExitStatus)\n                  return;\n                throw e2;\n              }\n            } else if (cmd === \"cancelDone\") {\n              PThread.returnWorkerToPool(worker);\n            } else if (cmd === \"objectTransfer\") {\n              PThread.receiveObjectTransfer(e.data);\n            } else if (e.data.target === \"setimmediate\") {\n              worker.postMessage(e.data);\n            } else {\n              err(\"worker sent an unknown command \" + cmd);\n            }\n            PThread.currentProxiedOperationCallerThread = void 0;\n          };\n          worker.onerror = function(e) {\n            err(\"pthread sent an error! \" + e.filename + \":\" + e.lineno + \": \" + e.message);\n          };\n          if (ENVIRONMENT_IS_NODE) {\n            worker.on(\"message\", function(data) {\n              worker.onmessage({ data });\n            });\n            worker.on(\"error\", function(data) {\n              worker.onerror(data);\n            });\n            worker.on(\"exit\", function(data) {\n            });\n          }\n          worker.postMessage({ \"cmd\": \"load\", \"urlOrBlob\": Module[\"mainScriptUrlOrBlob\"] || _scriptDir, \"wasmMemory\": wasmMemory, \"wasmModule\": wasmModule });\n        }, allocateUnusedWorker: function() {\n          var pthreadMainJs = locateFile(\"tfjs-backend-wasm-threaded-simd.worker.js\");\n          PThread.unusedWorkers.push(new Worker(pthreadMainJs));\n        }, getNewWorker: function() {\n          if (PThread.unusedWorkers.length == 0) {\n            PThread.allocateUnusedWorker();\n            PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0]);\n          }\n          if (PThread.unusedWorkers.length > 0)\n            return PThread.unusedWorkers.pop();\n          else\n            return null;\n        }, busySpinWait: function(msecs) {\n          var t = performance.now() + msecs;\n          while (performance.now() < t) {\n          }\n        } };\n        function establishStackSpace(stackTop, stackMax) {\n          _emscripten_stack_set_limits(stackTop, stackMax);\n          stackRestore(stackTop);\n        }\n        Module[\"establishStackSpace\"] = establishStackSpace;\n        function getNoExitRuntime() {\n          return noExitRuntime;\n        }\n        Module[\"getNoExitRuntime\"] = getNoExitRuntime;\n        function invokeEntryPoint(ptr, arg) {\n          return wasmTable.get(ptr)(arg);\n        }\n        Module[\"invokeEntryPoint\"] = invokeEntryPoint;\n        function ___assert_fail(condition, filename, line, func2) {\n          abort(\"Assertion failed: \" + UTF8ToString(condition) + \", at: \" + [filename ? UTF8ToString(filename) : \"unknown filename\", line, func2 ? UTF8ToString(func2) : \"unknown function\"]);\n        }\n        function ___call_main(argc, argv) {\n          var returnCode = _main(argc, argv);\n        }\n        var _emscripten_get_now;\n        if (ENVIRONMENT_IS_NODE) {\n          _emscripten_get_now = function() {\n            var t = process[\"hrtime\"]();\n            return t[0] * 1e3 + t[1] / 1e6;\n          };\n        } else if (ENVIRONMENT_IS_PTHREAD) {\n          _emscripten_get_now = function() {\n            return performance.now() - Module[\"__performance_now_clock_drift\"];\n          };\n        } else if (typeof dateNow !== \"undefined\") {\n          _emscripten_get_now = dateNow;\n        } else\n          _emscripten_get_now = function() {\n            return performance.now();\n          };\n        function setErrNo(value) {\n          GROWABLE_HEAP_I32()[___errno_location() >> 2] = value;\n          return value;\n        }\n        function _atexit(func2, arg) {\n          if (ENVIRONMENT_IS_PTHREAD)\n            return _emscripten_proxy_to_main_thread_js(1, 1, func2, arg);\n        }\n        function __emscripten_notify_thread_queue(targetThreadId, mainThreadId) {\n          if (targetThreadId == mainThreadId) {\n            postMessage({ \"cmd\": \"processQueuedMainThreadWork\" });\n          } else if (ENVIRONMENT_IS_PTHREAD) {\n            postMessage({ \"targetThread\": targetThreadId, \"cmd\": \"processThreadQueue\" });\n          } else {\n            var pthread = PThread.pthreads[targetThreadId];\n            var worker = pthread && pthread.worker;\n            if (!worker) {\n              return;\n            }\n            worker.postMessage({ \"cmd\": \"processThreadQueue\" });\n          }\n          return 1;\n        }\n        function _abort() {\n          abort();\n        }\n        function _emscripten_asm_const_int(code, sigPtr, argbuf) {\n          var args = readAsmConstArgs(sigPtr, argbuf);\n          return ASM_CONSTS[code].apply(null, args);\n        }\n        function _emscripten_conditional_set_current_thread_status(expectedStatus, newStatus) {\n        }\n        function _emscripten_futex_wait(addr, val, timeout) {\n          if (addr <= 0 || addr > GROWABLE_HEAP_I8().length || addr & true)\n            return -28;\n          if (!ENVIRONMENT_IS_WEB) {\n            var ret = Atomics.wait(GROWABLE_HEAP_I32(), addr >> 2, val, timeout);\n            if (ret === \"timed-out\")\n              return -73;\n            if (ret === \"not-equal\")\n              return -6;\n            if (ret === \"ok\")\n              return 0;\n            throw \"Atomics.wait returned an unexpected value \" + ret;\n          } else {\n            if (Atomics.load(GROWABLE_HEAP_I32(), addr >> 2) != val) {\n              return -6;\n            }\n            var tNow = performance.now();\n            var tEnd = tNow + timeout;\n            var lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, addr);\n            while (1) {\n              tNow = performance.now();\n              if (tNow > tEnd) {\n                lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, 0);\n                return -73;\n              }\n              lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, 0);\n              if (lastAddr == 0) {\n                break;\n              }\n              _emscripten_main_thread_process_queued_calls();\n              if (Atomics.load(GROWABLE_HEAP_I32(), addr >> 2) != val) {\n                return -6;\n              }\n              lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, addr);\n            }\n            return 0;\n          }\n        }\n        function _emscripten_memcpy_big(dest, src, num) {\n          GROWABLE_HEAP_U8().copyWithin(dest, src, src + num);\n        }\n        function _emscripten_num_logical_cores() {\n          if (ENVIRONMENT_IS_NODE)\n            return __require2(\"os\").cpus().length;\n          return navigator[\"hardwareConcurrency\"];\n        }\n        function _emscripten_proxy_to_main_thread_js(index, sync) {\n          var numCallArgs = arguments.length - 2;\n          var stack2 = stackSave();\n          var serializedNumCallArgs = numCallArgs;\n          var args = stackAlloc(serializedNumCallArgs * 8);\n          var b = args >> 3;\n          for (var i = 0; i < numCallArgs; i++) {\n            var arg = arguments[2 + i];\n            GROWABLE_HEAP_F64()[b + i] = arg;\n          }\n          var ret = _emscripten_run_in_main_runtime_thread_js(index, serializedNumCallArgs, args, sync);\n          stackRestore(stack2);\n          return ret;\n        }\n        var _emscripten_receive_on_main_thread_js_callArgs = [];\n        var readAsmConstArgsArray = [];\n        function readAsmConstArgs(sigPtr, buf) {\n          readAsmConstArgsArray.length = 0;\n          var ch;\n          buf >>= 2;\n          while (ch = GROWABLE_HEAP_U8()[sigPtr++]) {\n            var double = ch < 105;\n            if (double && buf & 1)\n              buf++;\n            readAsmConstArgsArray.push(double ? GROWABLE_HEAP_F64()[buf++ >> 1] : GROWABLE_HEAP_I32()[buf]);\n            ++buf;\n          }\n          return readAsmConstArgsArray;\n        }\n        function _emscripten_receive_on_main_thread_js(index, numCallArgs, args) {\n          _emscripten_receive_on_main_thread_js_callArgs.length = numCallArgs;\n          var b = args >> 3;\n          for (var i = 0; i < numCallArgs; i++) {\n            _emscripten_receive_on_main_thread_js_callArgs[i] = GROWABLE_HEAP_F64()[b + i];\n          }\n          var isEmAsmConst = index < 0;\n          var func2 = !isEmAsmConst ? proxiedFunctionTable[index] : ASM_CONSTS[-index - 1];\n          return func2.apply(null, _emscripten_receive_on_main_thread_js_callArgs);\n        }\n        function _emscripten_get_heap_size() {\n          return GROWABLE_HEAP_U8().length;\n        }\n        function emscripten_realloc_buffer(size) {\n          try {\n            wasmMemory.grow(size - buffer2.byteLength + 65535 >>> 16);\n            updateGlobalBufferAndViews(wasmMemory.buffer);\n            return 1;\n          } catch (e) {\n          }\n        }\n        function _emscripten_resize_heap(requestedSize) {\n          var oldSize = _emscripten_get_heap_size();\n          if (requestedSize <= oldSize) {\n            return false;\n          }\n          var maxHeapSize = 2147483648;\n          if (requestedSize > maxHeapSize) {\n            return false;\n          }\n          for (var cutDown = 1; cutDown <= 4; cutDown *= 2) {\n            var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown);\n            overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296);\n            var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536));\n            var replacement = emscripten_realloc_buffer(newSize);\n            if (replacement) {\n              return true;\n            }\n          }\n          return false;\n        }\n        var JSEvents = { inEventHandler: 0, removeAllEventListeners: function() {\n          for (var i = JSEvents.eventHandlers.length - 1; i >= 0; --i) {\n            JSEvents._removeHandler(i);\n          }\n          JSEvents.eventHandlers = [];\n          JSEvents.deferredCalls = [];\n        }, registerRemoveEventListeners: function() {\n          if (!JSEvents.removeEventListenersRegistered) {\n            __ATEXIT__.push(JSEvents.removeAllEventListeners);\n            JSEvents.removeEventListenersRegistered = true;\n          }\n        }, deferredCalls: [], deferCall: function(targetFunction, precedence, argsList) {\n          function arraysHaveEqualContent(arrA, arrB) {\n            if (arrA.length != arrB.length)\n              return false;\n            for (var i2 in arrA) {\n              if (arrA[i2] != arrB[i2])\n                return false;\n            }\n            return true;\n          }\n          for (var i in JSEvents.deferredCalls) {\n            var call = JSEvents.deferredCalls[i];\n            if (call.targetFunction == targetFunction && arraysHaveEqualContent(call.argsList, argsList)) {\n              return;\n            }\n          }\n          JSEvents.deferredCalls.push({ targetFunction, precedence, argsList });\n          JSEvents.deferredCalls.sort(function(x, y) {\n            return x.precedence < y.precedence;\n          });\n        }, removeDeferredCalls: function(targetFunction) {\n          for (var i = 0; i < JSEvents.deferredCalls.length; ++i) {\n            if (JSEvents.deferredCalls[i].targetFunction == targetFunction) {\n              JSEvents.deferredCalls.splice(i, 1);\n              --i;\n            }\n          }\n        }, canPerformEventHandlerRequests: function() {\n          return JSEvents.inEventHandler && JSEvents.currentEventHandler.allowsDeferredCalls;\n        }, runDeferredCalls: function() {\n          if (!JSEvents.canPerformEventHandlerRequests()) {\n            return;\n          }\n          for (var i = 0; i < JSEvents.deferredCalls.length; ++i) {\n            var call = JSEvents.deferredCalls[i];\n            JSEvents.deferredCalls.splice(i, 1);\n            --i;\n            call.targetFunction.apply(null, call.argsList);\n          }\n        }, eventHandlers: [], removeAllHandlersOnTarget: function(target, eventTypeString) {\n          for (var i = 0; i < JSEvents.eventHandlers.length; ++i) {\n            if (JSEvents.eventHandlers[i].target == target && (!eventTypeString || eventTypeString == JSEvents.eventHandlers[i].eventTypeString)) {\n              JSEvents._removeHandler(i--);\n            }\n          }\n        }, _removeHandler: function(i) {\n          var h = JSEvents.eventHandlers[i];\n          h.target.removeEventListener(h.eventTypeString, h.eventListenerFunc, h.useCapture);\n          JSEvents.eventHandlers.splice(i, 1);\n        }, registerOrRemoveHandler: function(eventHandler) {\n          var jsEventHandler = function jsEventHandler2(event) {\n            ++JSEvents.inEventHandler;\n            JSEvents.currentEventHandler = eventHandler;\n            JSEvents.runDeferredCalls();\n            eventHandler.handlerFunc(event);\n            JSEvents.runDeferredCalls();\n            --JSEvents.inEventHandler;\n          };\n          if (eventHandler.callbackfunc) {\n            eventHandler.eventListenerFunc = jsEventHandler;\n            eventHandler.target.addEventListener(eventHandler.eventTypeString, jsEventHandler, eventHandler.useCapture);\n            JSEvents.eventHandlers.push(eventHandler);\n            JSEvents.registerRemoveEventListeners();\n          } else {\n            for (var i = 0; i < JSEvents.eventHandlers.length; ++i) {\n              if (JSEvents.eventHandlers[i].target == eventHandler.target && JSEvents.eventHandlers[i].eventTypeString == eventHandler.eventTypeString) {\n                JSEvents._removeHandler(i--);\n              }\n            }\n          }\n        }, queueEventHandlerOnThread_iiii: function(targetThread, eventHandlerFunc, eventTypeId, eventData, userData) {\n          var stackTop = stackSave();\n          var varargs = stackAlloc(12);\n          GROWABLE_HEAP_I32()[varargs >> 2] = eventTypeId;\n          GROWABLE_HEAP_I32()[varargs + 4 >> 2] = eventData;\n          GROWABLE_HEAP_I32()[varargs + 8 >> 2] = userData;\n          __emscripten_call_on_thread(0, targetThread, 637534208, eventHandlerFunc, eventData, varargs);\n          stackRestore(stackTop);\n        }, getTargetThreadForEventCallback: function(targetThread) {\n          switch (targetThread) {\n            case 1:\n              return 0;\n            case 2:\n              return PThread.currentProxiedOperationCallerThread;\n            default:\n              return targetThread;\n          }\n        }, getNodeNameForTarget: function(target) {\n          if (!target)\n            return \"\";\n          if (target == window)\n            return \"#window\";\n          if (target == screen)\n            return \"#screen\";\n          return target && target.nodeName ? target.nodeName : \"\";\n        }, fullscreenEnabled: function() {\n          return document.fullscreenEnabled || document.webkitFullscreenEnabled;\n        } };\n        function stringToNewUTF8(jsString) {\n          var length = lengthBytesUTF8(jsString) + 1;\n          var cString = _malloc(length);\n          stringToUTF8(jsString, cString, length);\n          return cString;\n        }\n        function _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread, targetCanvas, width, height) {\n          var stackTop = stackSave();\n          var varargs = stackAlloc(12);\n          var targetCanvasPtr = 0;\n          if (targetCanvas) {\n            targetCanvasPtr = stringToNewUTF8(targetCanvas);\n          }\n          GROWABLE_HEAP_I32()[varargs >> 2] = targetCanvasPtr;\n          GROWABLE_HEAP_I32()[varargs + 4 >> 2] = width;\n          GROWABLE_HEAP_I32()[varargs + 8 >> 2] = height;\n          __emscripten_call_on_thread(0, targetThread, 657457152, 0, targetCanvasPtr, varargs);\n          stackRestore(stackTop);\n        }\n        function _emscripten_set_offscreencanvas_size_on_target_thread(targetThread, targetCanvas, width, height) {\n          targetCanvas = targetCanvas ? UTF8ToString(targetCanvas) : \"\";\n          _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread, targetCanvas, width, height);\n        }\n        function maybeCStringToJsString(cString) {\n          return cString > 2 ? UTF8ToString(cString) : cString;\n        }\n        var specialHTMLTargets = [0, typeof document !== \"undefined\" ? document : 0, typeof window !== \"undefined\" ? window : 0];\n        function findEventTarget(target) {\n          target = maybeCStringToJsString(target);\n          var domElement = specialHTMLTargets[target] || (typeof document !== \"undefined\" ? document.querySelector(target) : void 0);\n          return domElement;\n        }\n        function findCanvasEventTarget(target) {\n          return findEventTarget(target);\n        }\n        function _emscripten_set_canvas_element_size_calling_thread(target, width, height) {\n          var canvas = findCanvasEventTarget(target);\n          if (!canvas)\n            return -4;\n          if (canvas.canvasSharedPtr) {\n            GROWABLE_HEAP_I32()[canvas.canvasSharedPtr >> 2] = width;\n            GROWABLE_HEAP_I32()[canvas.canvasSharedPtr + 4 >> 2] = height;\n          }\n          if (canvas.offscreenCanvas || !canvas.controlTransferredOffscreen) {\n            if (canvas.offscreenCanvas)\n              canvas = canvas.offscreenCanvas;\n            var autoResizeViewport = false;\n            if (canvas.GLctxObject && canvas.GLctxObject.GLctx) {\n              var prevViewport = canvas.GLctxObject.GLctx.getParameter(2978);\n              autoResizeViewport = prevViewport[0] === 0 && prevViewport[1] === 0 && prevViewport[2] === canvas.width && prevViewport[3] === canvas.height;\n            }\n            canvas.width = width;\n            canvas.height = height;\n            if (autoResizeViewport) {\n              canvas.GLctxObject.GLctx.viewport(0, 0, width, height);\n            }\n          } else if (canvas.canvasSharedPtr) {\n            var targetThread = GROWABLE_HEAP_I32()[canvas.canvasSharedPtr + 8 >> 2];\n            _emscripten_set_offscreencanvas_size_on_target_thread(targetThread, target, width, height);\n            return 1;\n          } else {\n            return -4;\n          }\n          return 0;\n        }\n        function _emscripten_set_canvas_element_size_main_thread(target, width, height) {\n          if (ENVIRONMENT_IS_PTHREAD)\n            return _emscripten_proxy_to_main_thread_js(2, 1, target, width, height);\n          return _emscripten_set_canvas_element_size_calling_thread(target, width, height);\n        }\n        function _emscripten_set_canvas_element_size(target, width, height) {\n          var canvas = findCanvasEventTarget(target);\n          if (canvas) {\n            return _emscripten_set_canvas_element_size_calling_thread(target, width, height);\n          } else {\n            return _emscripten_set_canvas_element_size_main_thread(target, width, height);\n          }\n        }\n        function _emscripten_set_current_thread_status(newStatus) {\n        }\n        function _emscripten_set_thread_name(threadId, name) {\n        }\n        function __webgl_enable_ANGLE_instanced_arrays(ctx) {\n          var ext = ctx.getExtension(\"ANGLE_instanced_arrays\");\n          if (ext) {\n            ctx[\"vertexAttribDivisor\"] = function(index, divisor) {\n              ext[\"vertexAttribDivisorANGLE\"](index, divisor);\n            };\n            ctx[\"drawArraysInstanced\"] = function(mode, first, count2, primcount) {\n              ext[\"drawArraysInstancedANGLE\"](mode, first, count2, primcount);\n            };\n            ctx[\"drawElementsInstanced\"] = function(mode, count2, type, indices, primcount) {\n              ext[\"drawElementsInstancedANGLE\"](mode, count2, type, indices, primcount);\n            };\n            return 1;\n          }\n        }\n        function __webgl_enable_OES_vertex_array_object(ctx) {\n          var ext = ctx.getExtension(\"OES_vertex_array_object\");\n          if (ext) {\n            ctx[\"createVertexArray\"] = function() {\n              return ext[\"createVertexArrayOES\"]();\n            };\n            ctx[\"deleteVertexArray\"] = function(vao) {\n              ext[\"deleteVertexArrayOES\"](vao);\n            };\n            ctx[\"bindVertexArray\"] = function(vao) {\n              ext[\"bindVertexArrayOES\"](vao);\n            };\n            ctx[\"isVertexArray\"] = function(vao) {\n              return ext[\"isVertexArrayOES\"](vao);\n            };\n            return 1;\n          }\n        }\n        function __webgl_enable_WEBGL_draw_buffers(ctx) {\n          var ext = ctx.getExtension(\"WEBGL_draw_buffers\");\n          if (ext) {\n            ctx[\"drawBuffers\"] = function(n, bufs) {\n              ext[\"drawBuffersWEBGL\"](n, bufs);\n            };\n            return 1;\n          }\n        }\n        function __webgl_enable_WEBGL_multi_draw(ctx) {\n          return !!(ctx.multiDrawWebgl = ctx.getExtension(\"WEBGL_multi_draw\"));\n        }\n        var GL = { counter: 1, buffers: [], programs: [], framebuffers: [], renderbuffers: [], textures: [], uniforms: [], shaders: [], vaos: [], contexts: {}, offscreenCanvases: {}, timerQueriesEXT: [], programInfos: {}, stringCache: {}, unpackAlignment: 4, recordError: function recordError(errorCode) {\n          if (!GL.lastError) {\n            GL.lastError = errorCode;\n          }\n        }, getNewId: function(table) {\n          var ret = GL.counter++;\n          for (var i = table.length; i < ret; i++) {\n            table[i] = null;\n          }\n          return ret;\n        }, getSource: function(shader, count2, string3, length) {\n          var source = \"\";\n          for (var i = 0; i < count2; ++i) {\n            var len = length ? GROWABLE_HEAP_I32()[length + i * 4 >> 2] : -1;\n            source += UTF8ToString(GROWABLE_HEAP_I32()[string3 + i * 4 >> 2], len < 0 ? void 0 : len);\n          }\n          return source;\n        }, createContext: function(canvas, webGLContextAttributes) {\n          var ctx = canvas.getContext(\"webgl\", webGLContextAttributes);\n          if (!ctx)\n            return 0;\n          var handle = GL.registerContext(ctx, webGLContextAttributes);\n          return handle;\n        }, registerContext: function(ctx, webGLContextAttributes) {\n          var handle = _malloc(8);\n          GROWABLE_HEAP_I32()[handle + 4 >> 2] = _pthread_self();\n          var context = { handle, attributes: webGLContextAttributes, version: webGLContextAttributes.majorVersion, GLctx: ctx };\n          if (ctx.canvas)\n            ctx.canvas.GLctxObject = context;\n          GL.contexts[handle] = context;\n          if (typeof webGLContextAttributes.enableExtensionsByDefault === \"undefined\" || webGLContextAttributes.enableExtensionsByDefault) {\n            GL.initExtensions(context);\n          }\n          return handle;\n        }, makeContextCurrent: function(contextHandle) {\n          GL.currentContext = GL.contexts[contextHandle];\n          Module.ctx = GLctx = GL.currentContext && GL.currentContext.GLctx;\n          return !(contextHandle && !GLctx);\n        }, getContext: function(contextHandle) {\n          return GL.contexts[contextHandle];\n        }, deleteContext: function(contextHandle) {\n          if (GL.currentContext === GL.contexts[contextHandle])\n            GL.currentContext = null;\n          if (typeof JSEvents === \"object\")\n            JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas);\n          if (GL.contexts[contextHandle] && GL.contexts[contextHandle].GLctx.canvas)\n            GL.contexts[contextHandle].GLctx.canvas.GLctxObject = void 0;\n          _free(GL.contexts[contextHandle].handle);\n          GL.contexts[contextHandle] = null;\n        }, initExtensions: function(context) {\n          if (!context)\n            context = GL.currentContext;\n          if (context.initExtensionsDone)\n            return;\n          context.initExtensionsDone = true;\n          var GLctx2 = context.GLctx;\n          __webgl_enable_ANGLE_instanced_arrays(GLctx2);\n          __webgl_enable_OES_vertex_array_object(GLctx2);\n          __webgl_enable_WEBGL_draw_buffers(GLctx2);\n          GLctx2.disjointTimerQueryExt = GLctx2.getExtension(\"EXT_disjoint_timer_query\");\n          __webgl_enable_WEBGL_multi_draw(GLctx2);\n          var exts = GLctx2.getSupportedExtensions() || [];\n          exts.forEach(function(ext) {\n            if (ext.indexOf(\"lose_context\") < 0 && ext.indexOf(\"debug\") < 0) {\n              GLctx2.getExtension(ext);\n            }\n          });\n        }, populateUniformTable: function(program) {\n          var p2 = GL.programs[program];\n          var ptable = GL.programInfos[program] = { uniforms: {}, maxUniformLength: 0, maxAttributeLength: -1, maxUniformBlockNameLength: -1 };\n          var utable = ptable.uniforms;\n          var numUniforms = GLctx.getProgramParameter(p2, 35718);\n          for (var i = 0; i < numUniforms; ++i) {\n            var u = GLctx.getActiveUniform(p2, i);\n            var name = u.name;\n            ptable.maxUniformLength = Math.max(ptable.maxUniformLength, name.length + 1);\n            if (name.slice(-1) == \"]\") {\n              name = name.slice(0, name.lastIndexOf(\"[\"));\n            }\n            var loc = GLctx.getUniformLocation(p2, name);\n            if (loc) {\n              var id = GL.getNewId(GL.uniforms);\n              utable[name] = [u.size, id];\n              GL.uniforms[id] = loc;\n              for (var j = 1; j < u.size; ++j) {\n                var n = name + \"[\" + j + \"]\";\n                loc = GLctx.getUniformLocation(p2, n);\n                id = GL.getNewId(GL.uniforms);\n                GL.uniforms[id] = loc;\n              }\n            }\n          }\n        } };\n        var __emscripten_webgl_power_preferences = [\"default\", \"low-power\", \"high-performance\"];\n        function _emscripten_webgl_do_create_context(target, attributes) {\n          var a = attributes >> 2;\n          var powerPreference = GROWABLE_HEAP_I32()[a + (24 >> 2)];\n          var contextAttributes = { \"alpha\": !!GROWABLE_HEAP_I32()[a + (0 >> 2)], \"depth\": !!GROWABLE_HEAP_I32()[a + (4 >> 2)], \"stencil\": !!GROWABLE_HEAP_I32()[a + (8 >> 2)], \"antialias\": !!GROWABLE_HEAP_I32()[a + (12 >> 2)], \"premultipliedAlpha\": !!GROWABLE_HEAP_I32()[a + (16 >> 2)], \"preserveDrawingBuffer\": !!GROWABLE_HEAP_I32()[a + (20 >> 2)], \"powerPreference\": __emscripten_webgl_power_preferences[powerPreference], \"failIfMajorPerformanceCaveat\": !!GROWABLE_HEAP_I32()[a + (28 >> 2)], majorVersion: GROWABLE_HEAP_I32()[a + (32 >> 2)], minorVersion: GROWABLE_HEAP_I32()[a + (36 >> 2)], enableExtensionsByDefault: GROWABLE_HEAP_I32()[a + (40 >> 2)], explicitSwapControl: GROWABLE_HEAP_I32()[a + (44 >> 2)], proxyContextToMainThread: GROWABLE_HEAP_I32()[a + (48 >> 2)], renderViaOffscreenBackBuffer: GROWABLE_HEAP_I32()[a + (52 >> 2)] };\n          var canvas = findCanvasEventTarget(target);\n          if (!canvas) {\n            return 0;\n          }\n          if (contextAttributes.explicitSwapControl) {\n            return 0;\n          }\n          var contextHandle = GL.createContext(canvas, contextAttributes);\n          return contextHandle;\n        }\n        function _emscripten_webgl_create_context(a0, a12) {\n          return _emscripten_webgl_do_create_context(a0, a12);\n        }\n        var SYSCALLS = { mappings: {}, buffers: [null, [], []], printChar: function(stream, curr) {\n          var buffer3 = SYSCALLS.buffers[stream];\n          if (curr === 0 || curr === 10) {\n            (stream === 1 ? out : err)(UTF8ArrayToString(buffer3, 0));\n            buffer3.length = 0;\n          } else {\n            buffer3.push(curr);\n          }\n        }, varargs: void 0, get: function() {\n          SYSCALLS.varargs += 4;\n          var ret = GROWABLE_HEAP_I32()[SYSCALLS.varargs - 4 >> 2];\n          return ret;\n        }, getStr: function(ptr) {\n          var ret = UTF8ToString(ptr);\n          return ret;\n        }, get64: function(low, high) {\n          return low;\n        } };\n        function _fd_close(fd) {\n          if (ENVIRONMENT_IS_PTHREAD)\n            return _emscripten_proxy_to_main_thread_js(3, 1, fd);\n          return 0;\n        }\n        function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {\n          if (ENVIRONMENT_IS_PTHREAD)\n            return _emscripten_proxy_to_main_thread_js(4, 1, fd, offset_low, offset_high, whence, newOffset);\n        }\n        function _fd_write(fd, iov, iovcnt, pnum) {\n          if (ENVIRONMENT_IS_PTHREAD)\n            return _emscripten_proxy_to_main_thread_js(5, 1, fd, iov, iovcnt, pnum);\n          var num = 0;\n          for (var i = 0; i < iovcnt; i++) {\n            var ptr = GROWABLE_HEAP_I32()[iov + i * 8 >> 2];\n            var len = GROWABLE_HEAP_I32()[iov + (i * 8 + 4) >> 2];\n            for (var j = 0; j < len; j++) {\n              SYSCALLS.printChar(fd, GROWABLE_HEAP_U8()[ptr + j]);\n            }\n            num += len;\n          }\n          GROWABLE_HEAP_I32()[pnum >> 2] = num;\n          return 0;\n        }\n        function _pthread_cleanup_pop(execute2) {\n          var routine = PThread.threadExitHandlers.pop();\n          if (execute2)\n            routine();\n        }\n        function _pthread_cleanup_push(routine, arg) {\n          PThread.threadExitHandlers.push(function() {\n            wasmTable.get(routine)(arg);\n          });\n        }\n        function spawnThread(threadParams) {\n          if (ENVIRONMENT_IS_PTHREAD)\n            throw \"Internal Error! spawnThread() can only ever be called from main application thread!\";\n          var worker = PThread.getNewWorker();\n          if (worker.pthread !== void 0)\n            throw \"Internal error!\";\n          if (!threadParams.pthread_ptr)\n            throw \"Internal error, no pthread ptr!\";\n          PThread.runningWorkers.push(worker);\n          var tlsMemory = _malloc(128 * 4);\n          for (var i = 0; i < 128; ++i) {\n            GROWABLE_HEAP_I32()[tlsMemory + i * 4 >> 2] = 0;\n          }\n          var stackHigh = threadParams.stackBase + threadParams.stackSize;\n          var pthread = PThread.pthreads[threadParams.pthread_ptr] = { worker, stackBase: threadParams.stackBase, stackSize: threadParams.stackSize, allocatedOwnStack: threadParams.allocatedOwnStack, threadInfoStruct: threadParams.pthread_ptr };\n          var tis = pthread.threadInfoStruct >> 2;\n          Atomics.store(GROWABLE_HEAP_U32(), tis + (64 >> 2), threadParams.detached);\n          Atomics.store(GROWABLE_HEAP_U32(), tis + (100 >> 2), tlsMemory);\n          Atomics.store(GROWABLE_HEAP_U32(), tis + (40 >> 2), pthread.threadInfoStruct);\n          Atomics.store(GROWABLE_HEAP_U32(), tis + (80 >> 2), threadParams.stackSize);\n          Atomics.store(GROWABLE_HEAP_U32(), tis + (76 >> 2), stackHigh);\n          Atomics.store(GROWABLE_HEAP_U32(), tis + (104 >> 2), threadParams.stackSize);\n          Atomics.store(GROWABLE_HEAP_U32(), tis + (104 + 8 >> 2), stackHigh);\n          Atomics.store(GROWABLE_HEAP_U32(), tis + (104 + 12 >> 2), threadParams.detached);\n          var global_libc = _emscripten_get_global_libc();\n          var global_locale = global_libc + 40;\n          Atomics.store(GROWABLE_HEAP_U32(), tis + (172 >> 2), global_locale);\n          worker.pthread = pthread;\n          var msg = { \"cmd\": \"run\", \"start_routine\": threadParams.startRoutine, \"arg\": threadParams.arg, \"threadInfoStruct\": threadParams.pthread_ptr, \"stackBase\": threadParams.stackBase, \"stackSize\": threadParams.stackSize };\n          worker.runPthread = function() {\n            msg.time = performance.now();\n            worker.postMessage(msg, threadParams.transferList);\n          };\n          if (worker.loaded) {\n            worker.runPthread();\n            delete worker.runPthread;\n          }\n        }\n        function _pthread_create(pthread_ptr, attr, start_routine, arg) {\n          if (typeof SharedArrayBuffer === \"undefined\") {\n            err(\"Current environment does not support SharedArrayBuffer, pthreads are not available!\");\n            return 6;\n          }\n          if (!pthread_ptr) {\n            err(\"pthread_create called with a null thread pointer!\");\n            return 28;\n          }\n          var transferList = [];\n          var error = 0;\n          if (ENVIRONMENT_IS_PTHREAD && (transferList.length === 0 || error)) {\n            return _emscripten_sync_run_in_main_thread_4(687865856, pthread_ptr, attr, start_routine, arg);\n          }\n          if (error)\n            return error;\n          var stackSize = 0;\n          var stackBase = 0;\n          var detached = 0;\n          if (attr && attr != -1) {\n            stackSize = GROWABLE_HEAP_I32()[attr >> 2];\n            stackSize += 81920;\n            stackBase = GROWABLE_HEAP_I32()[attr + 8 >> 2];\n            detached = GROWABLE_HEAP_I32()[attr + 12 >> 2] !== 0;\n          } else {\n            stackSize = 2097152;\n          }\n          var allocatedOwnStack = stackBase == 0;\n          if (allocatedOwnStack) {\n            stackBase = _memalign(16, stackSize);\n          } else {\n            stackBase -= stackSize;\n            assert3(stackBase > 0);\n          }\n          var threadInfoStruct = _malloc(228);\n          for (var i = 0; i < 228 >> 2; ++i)\n            GROWABLE_HEAP_U32()[(threadInfoStruct >> 2) + i] = 0;\n          GROWABLE_HEAP_I32()[pthread_ptr >> 2] = threadInfoStruct;\n          GROWABLE_HEAP_I32()[threadInfoStruct + 12 >> 2] = threadInfoStruct;\n          var headPtr = threadInfoStruct + 152;\n          GROWABLE_HEAP_I32()[headPtr >> 2] = headPtr;\n          var threadParams = { stackBase, stackSize, allocatedOwnStack, detached, startRoutine: start_routine, pthread_ptr: threadInfoStruct, arg, transferList };\n          if (ENVIRONMENT_IS_PTHREAD) {\n            threadParams.cmd = \"spawnThread\";\n            postMessage(threadParams, transferList);\n          } else {\n            spawnThread(threadParams);\n          }\n          return 0;\n        }\n        function __pthread_testcancel_js() {\n          if (!ENVIRONMENT_IS_PTHREAD)\n            return;\n          var tb = _pthread_self();\n          if (!tb)\n            return;\n          var cancelDisabled = Atomics.load(GROWABLE_HEAP_U32(), tb + 56 >> 2);\n          if (cancelDisabled)\n            return;\n          var canceled = Atomics.load(GROWABLE_HEAP_U32(), tb + 0 >> 2);\n          if (canceled == 2)\n            throw \"Canceled!\";\n        }\n        function _emscripten_check_blocking_allowed() {\n          if (ENVIRONMENT_IS_NODE)\n            return;\n          if (ENVIRONMENT_IS_WORKER)\n            return;\n          warnOnce(\"Blocking on the main thread is very dangerous, see https://emscripten.org/docs/porting/pthreads.html#blocking-on-the-main-browser-thread\");\n        }\n        function __emscripten_do_pthread_join(thread, status, block) {\n          if (!thread) {\n            err(\"pthread_join attempted on a null thread pointer!\");\n            return ERRNO_CODES.ESRCH;\n          }\n          if (ENVIRONMENT_IS_PTHREAD && _pthread_self() == thread) {\n            err(\"PThread \" + thread + \" is attempting to join to itself!\");\n            return ERRNO_CODES.EDEADLK;\n          } else if (!ENVIRONMENT_IS_PTHREAD && _emscripten_main_browser_thread_id() == thread) {\n            err(\"Main thread \" + thread + \" is attempting to join to itself!\");\n            return ERRNO_CODES.EDEADLK;\n          }\n          var self2 = GROWABLE_HEAP_I32()[thread + 12 >> 2];\n          if (self2 !== thread) {\n            err(\"pthread_join attempted on thread \" + thread + \", which does not point to a valid thread, or does not exist anymore!\");\n            return ERRNO_CODES.ESRCH;\n          }\n          var detached = Atomics.load(GROWABLE_HEAP_U32(), thread + 64 >> 2);\n          if (detached) {\n            err(\"Attempted to join thread \" + thread + \", which was already detached!\");\n            return ERRNO_CODES.EINVAL;\n          }\n          if (block) {\n            _emscripten_check_blocking_allowed();\n          }\n          for (; ; ) {\n            var threadStatus = Atomics.load(GROWABLE_HEAP_U32(), thread + 0 >> 2);\n            if (threadStatus == 1) {\n              var threadExitCode = Atomics.load(GROWABLE_HEAP_U32(), thread + 4 >> 2);\n              if (status)\n                GROWABLE_HEAP_I32()[status >> 2] = threadExitCode;\n              Atomics.store(GROWABLE_HEAP_U32(), thread + 64 >> 2, 1);\n              if (!ENVIRONMENT_IS_PTHREAD)\n                cleanupThread(thread);\n              else\n                postMessage({ \"cmd\": \"cleanupThread\", \"thread\": thread });\n              return 0;\n            }\n            if (!block) {\n              return ERRNO_CODES.EBUSY;\n            }\n            __pthread_testcancel_js();\n            if (!ENVIRONMENT_IS_PTHREAD)\n              _emscripten_main_thread_process_queued_calls();\n            _emscripten_futex_wait(thread + 0, threadStatus, ENVIRONMENT_IS_PTHREAD ? 100 : 1);\n          }\n        }\n        function _pthread_join(thread, status) {\n          return __emscripten_do_pthread_join(thread, status, true);\n        }\n        function _sysconf(name) {\n          if (ENVIRONMENT_IS_PTHREAD)\n            return _emscripten_proxy_to_main_thread_js(6, 1, name);\n          switch (name) {\n            case 30:\n              return 16384;\n            case 85:\n              var maxHeapSize = 2147483648;\n              return maxHeapSize / 16384;\n            case 132:\n            case 133:\n            case 12:\n            case 137:\n            case 138:\n            case 15:\n            case 235:\n            case 16:\n            case 17:\n            case 18:\n            case 19:\n            case 20:\n            case 149:\n            case 13:\n            case 10:\n            case 236:\n            case 153:\n            case 9:\n            case 21:\n            case 22:\n            case 159:\n            case 154:\n            case 14:\n            case 77:\n            case 78:\n            case 139:\n            case 82:\n            case 68:\n            case 67:\n            case 164:\n            case 11:\n            case 29:\n            case 47:\n            case 48:\n            case 95:\n            case 52:\n            case 51:\n            case 46:\n              return 200809;\n            case 27:\n            case 246:\n            case 127:\n            case 128:\n            case 23:\n            case 24:\n            case 160:\n            case 161:\n            case 181:\n            case 182:\n            case 242:\n            case 183:\n            case 184:\n            case 243:\n            case 244:\n            case 245:\n            case 165:\n            case 178:\n            case 179:\n            case 49:\n            case 50:\n            case 168:\n            case 169:\n            case 175:\n            case 170:\n            case 171:\n            case 172:\n            case 97:\n            case 76:\n            case 32:\n            case 173:\n            case 35:\n            case 80:\n            case 81:\n            case 79:\n              return -1;\n            case 176:\n            case 177:\n            case 7:\n            case 155:\n            case 8:\n            case 157:\n            case 125:\n            case 126:\n            case 92:\n            case 93:\n            case 129:\n            case 130:\n            case 131:\n            case 94:\n            case 91:\n              return 1;\n            case 74:\n            case 60:\n            case 69:\n            case 70:\n            case 4:\n              return 1024;\n            case 31:\n            case 42:\n            case 72:\n              return 32;\n            case 87:\n            case 26:\n            case 33:\n              return 2147483647;\n            case 34:\n            case 1:\n              return 47839;\n            case 38:\n            case 36:\n              return 99;\n            case 43:\n            case 37:\n              return 2048;\n            case 0:\n              return 2097152;\n            case 3:\n              return 65536;\n            case 28:\n              return 32768;\n            case 44:\n              return 32767;\n            case 75:\n              return 16384;\n            case 39:\n              return 1e3;\n            case 89:\n              return 700;\n            case 71:\n              return 256;\n            case 40:\n              return 255;\n            case 2:\n              return 100;\n            case 180:\n              return 64;\n            case 25:\n              return 20;\n            case 5:\n              return 16;\n            case 6:\n              return 6;\n            case 73:\n              return 4;\n            case 84: {\n              if (typeof navigator === \"object\")\n                return navigator[\"hardwareConcurrency\"] || 1;\n              return 1;\n            }\n          }\n          setErrNo(28);\n          return -1;\n        }\n        if (!ENVIRONMENT_IS_PTHREAD)\n          PThread.initMainThreadBlock();\n        var GLctx;\n        var proxiedFunctionTable = [null, _atexit, _emscripten_set_canvas_element_size_main_thread, _fd_close, _fd_seek, _fd_write, _sysconf];\n        var asmLibraryArg = { \"e\": ___assert_fail, \"r\": ___call_main, \"x\": __emscripten_notify_thread_queue, \"b\": _abort, \"y\": _emscripten_asm_const_int, \"j\": _emscripten_conditional_set_current_thread_status, \"d\": _emscripten_futex_wait, \"c\": _emscripten_futex_wake, \"f\": _emscripten_get_now, \"p\": _emscripten_memcpy_big, \"A\": _emscripten_num_logical_cores, \"u\": _emscripten_receive_on_main_thread_js, \"q\": _emscripten_resize_heap, \"v\": _emscripten_set_canvas_element_size, \"i\": _emscripten_set_current_thread_status, \"s\": _emscripten_set_thread_name, \"w\": _emscripten_webgl_create_context, \"l\": _fd_close, \"n\": _fd_seek, \"g\": _fd_write, \"o\": initPthreadsJS, \"a\": wasmMemory || Module[\"wasmMemory\"], \"z\": _pthread_cleanup_pop, \"k\": _pthread_cleanup_push, \"h\": _pthread_create, \"m\": _pthread_join, \"t\": _sysconf };\n        var asm = createWasm();\n        var ___wasm_call_ctors = Module[\"___wasm_call_ctors\"] = function() {\n          return (___wasm_call_ctors = Module[\"___wasm_call_ctors\"] = Module[\"asm\"][\"B\"]).apply(null, arguments);\n        };\n        var _init = Module[\"_init\"] = function() {\n          return (_init = Module[\"_init\"] = Module[\"asm\"][\"C\"]).apply(null, arguments);\n        };\n        var _init_with_threads_count = Module[\"_init_with_threads_count\"] = function() {\n          return (_init_with_threads_count = Module[\"_init_with_threads_count\"] = Module[\"asm\"][\"D\"]).apply(null, arguments);\n        };\n        var _get_threads_count = Module[\"_get_threads_count\"] = function() {\n          return (_get_threads_count = Module[\"_get_threads_count\"] = Module[\"asm\"][\"E\"]).apply(null, arguments);\n        };\n        var _register_tensor = Module[\"_register_tensor\"] = function() {\n          return (_register_tensor = Module[\"_register_tensor\"] = Module[\"asm\"][\"F\"]).apply(null, arguments);\n        };\n        var _dispose_data = Module[\"_dispose_data\"] = function() {\n          return (_dispose_data = Module[\"_dispose_data\"] = Module[\"asm\"][\"G\"]).apply(null, arguments);\n        };\n        var _dispose = Module[\"_dispose\"] = function() {\n          return (_dispose = Module[\"_dispose\"] = Module[\"asm\"][\"H\"]).apply(null, arguments);\n        };\n        var _Abs = Module[\"_Abs\"] = function() {\n          return (_Abs = Module[\"_Abs\"] = Module[\"asm\"][\"I\"]).apply(null, arguments);\n        };\n        var _Add = Module[\"_Add\"] = function() {\n          return (_Add = Module[\"_Add\"] = Module[\"asm\"][\"J\"]).apply(null, arguments);\n        };\n        var _AddN = Module[\"_AddN\"] = function() {\n          return (_AddN = Module[\"_AddN\"] = Module[\"asm\"][\"K\"]).apply(null, arguments);\n        };\n        var _All = Module[\"_All\"] = function() {\n          return (_All = Module[\"_All\"] = Module[\"asm\"][\"L\"]).apply(null, arguments);\n        };\n        var _Any = Module[\"_Any\"] = function() {\n          return (_Any = Module[\"_Any\"] = Module[\"asm\"][\"M\"]).apply(null, arguments);\n        };\n        var _ArgMax = Module[\"_ArgMax\"] = function() {\n          return (_ArgMax = Module[\"_ArgMax\"] = Module[\"asm\"][\"N\"]).apply(null, arguments);\n        };\n        var _AvgPool = Module[\"_AvgPool\"] = function() {\n          return (_AvgPool = Module[\"_AvgPool\"] = Module[\"asm\"][\"O\"]).apply(null, arguments);\n        };\n        var _BatchMatMul = Module[\"_BatchMatMul\"] = function() {\n          return (_BatchMatMul = Module[\"_BatchMatMul\"] = Module[\"asm\"][\"P\"]).apply(null, arguments);\n        };\n        var _Ceil = Module[\"_Ceil\"] = function() {\n          return (_Ceil = Module[\"_Ceil\"] = Module[\"asm\"][\"Q\"]).apply(null, arguments);\n        };\n        var _ClipByValue = Module[\"_ClipByValue\"] = function() {\n          return (_ClipByValue = Module[\"_ClipByValue\"] = Module[\"asm\"][\"R\"]).apply(null, arguments);\n        };\n        var _Conv2D2 = Module[\"_Conv2D\"] = function() {\n          return (_Conv2D2 = Module[\"_Conv2D\"] = Module[\"asm\"][\"S\"]).apply(null, arguments);\n        };\n        var _Conv2DBackpropInput = Module[\"_Conv2DBackpropInput\"] = function() {\n          return (_Conv2DBackpropInput = Module[\"_Conv2DBackpropInput\"] = Module[\"asm\"][\"T\"]).apply(null, arguments);\n        };\n        var _Cos = Module[\"_Cos\"] = function() {\n          return (_Cos = Module[\"_Cos\"] = Module[\"asm\"][\"U\"]).apply(null, arguments);\n        };\n        var _Cosh = Module[\"_Cosh\"] = function() {\n          return (_Cosh = Module[\"_Cosh\"] = Module[\"asm\"][\"V\"]).apply(null, arguments);\n        };\n        var _CropAndResize = Module[\"_CropAndResize\"] = function() {\n          return (_CropAndResize = Module[\"_CropAndResize\"] = Module[\"asm\"][\"W\"]).apply(null, arguments);\n        };\n        var _Cumsum = Module[\"_Cumsum\"] = function() {\n          return (_Cumsum = Module[\"_Cumsum\"] = Module[\"asm\"][\"X\"]).apply(null, arguments);\n        };\n        var _DepthToSpace = Module[\"_DepthToSpace\"] = function() {\n          return (_DepthToSpace = Module[\"_DepthToSpace\"] = Module[\"asm\"][\"Y\"]).apply(null, arguments);\n        };\n        var _DepthwiseConv2dNative = Module[\"_DepthwiseConv2dNative\"] = function() {\n          return (_DepthwiseConv2dNative = Module[\"_DepthwiseConv2dNative\"] = Module[\"asm\"][\"Z\"]).apply(null, arguments);\n        };\n        var _Elu = Module[\"_Elu\"] = function() {\n          return (_Elu = Module[\"_Elu\"] = Module[\"asm\"][\"_\"]).apply(null, arguments);\n        };\n        var _Equal = Module[\"_Equal\"] = function() {\n          return (_Equal = Module[\"_Equal\"] = Module[\"asm\"][\"$\"]).apply(null, arguments);\n        };\n        var _Exp = Module[\"_Exp\"] = function() {\n          return (_Exp = Module[\"_Exp\"] = Module[\"asm\"][\"aa\"]).apply(null, arguments);\n        };\n        var _FlipLeftRight = Module[\"_FlipLeftRight\"] = function() {\n          return (_FlipLeftRight = Module[\"_FlipLeftRight\"] = Module[\"asm\"][\"ba\"]).apply(null, arguments);\n        };\n        var _Floor = Module[\"_Floor\"] = function() {\n          return (_Floor = Module[\"_Floor\"] = Module[\"asm\"][\"ca\"]).apply(null, arguments);\n        };\n        var _FloorDiv = Module[\"_FloorDiv\"] = function() {\n          return (_FloorDiv = Module[\"_FloorDiv\"] = Module[\"asm\"][\"da\"]).apply(null, arguments);\n        };\n        var _FusedBatchNorm = Module[\"_FusedBatchNorm\"] = function() {\n          return (_FusedBatchNorm = Module[\"_FusedBatchNorm\"] = Module[\"asm\"][\"ea\"]).apply(null, arguments);\n        };\n        var _FusedConv2D = Module[\"_FusedConv2D\"] = function() {\n          return (_FusedConv2D = Module[\"_FusedConv2D\"] = Module[\"asm\"][\"fa\"]).apply(null, arguments);\n        };\n        var _FusedDepthwiseConv2D = Module[\"_FusedDepthwiseConv2D\"] = function() {\n          return (_FusedDepthwiseConv2D = Module[\"_FusedDepthwiseConv2D\"] = Module[\"asm\"][\"ga\"]).apply(null, arguments);\n        };\n        var _Gather = Module[\"_Gather\"] = function() {\n          return (_Gather = Module[\"_Gather\"] = Module[\"asm\"][\"ha\"]).apply(null, arguments);\n        };\n        var _GatherNd = Module[\"_GatherNd\"] = function() {\n          return (_GatherNd = Module[\"_GatherNd\"] = Module[\"asm\"][\"ia\"]).apply(null, arguments);\n        };\n        var _Greater = Module[\"_Greater\"] = function() {\n          return (_Greater = Module[\"_Greater\"] = Module[\"asm\"][\"ja\"]).apply(null, arguments);\n        };\n        var _GreaterEqual = Module[\"_GreaterEqual\"] = function() {\n          return (_GreaterEqual = Module[\"_GreaterEqual\"] = Module[\"asm\"][\"ka\"]).apply(null, arguments);\n        };\n        var _LeakyRelu = Module[\"_LeakyRelu\"] = function() {\n          return (_LeakyRelu = Module[\"_LeakyRelu\"] = Module[\"asm\"][\"la\"]).apply(null, arguments);\n        };\n        var _Less = Module[\"_Less\"] = function() {\n          return (_Less = Module[\"_Less\"] = Module[\"asm\"][\"ma\"]).apply(null, arguments);\n        };\n        var _LessEqual = Module[\"_LessEqual\"] = function() {\n          return (_LessEqual = Module[\"_LessEqual\"] = Module[\"asm\"][\"na\"]).apply(null, arguments);\n        };\n        var _Log = Module[\"_Log\"] = function() {\n          return (_Log = Module[\"_Log\"] = Module[\"asm\"][\"oa\"]).apply(null, arguments);\n        };\n        var _LogicalAnd = Module[\"_LogicalAnd\"] = function() {\n          return (_LogicalAnd = Module[\"_LogicalAnd\"] = Module[\"asm\"][\"pa\"]).apply(null, arguments);\n        };\n        var _Max = Module[\"_Max\"] = function() {\n          return (_Max = Module[\"_Max\"] = Module[\"asm\"][\"qa\"]).apply(null, arguments);\n        };\n        var _MaxPool = Module[\"_MaxPool\"] = function() {\n          return (_MaxPool = Module[\"_MaxPool\"] = Module[\"asm\"][\"ra\"]).apply(null, arguments);\n        };\n        var _Maximum = Module[\"_Maximum\"] = function() {\n          return (_Maximum = Module[\"_Maximum\"] = Module[\"asm\"][\"sa\"]).apply(null, arguments);\n        };\n        var _Mean = Module[\"_Mean\"] = function() {\n          return (_Mean = Module[\"_Mean\"] = Module[\"asm\"][\"ta\"]).apply(null, arguments);\n        };\n        var _Min = Module[\"_Min\"] = function() {\n          return (_Min = Module[\"_Min\"] = Module[\"asm\"][\"ua\"]).apply(null, arguments);\n        };\n        var _Minimum = Module[\"_Minimum\"] = function() {\n          return (_Minimum = Module[\"_Minimum\"] = Module[\"asm\"][\"va\"]).apply(null, arguments);\n        };\n        var _MirrorPad = Module[\"_MirrorPad\"] = function() {\n          return (_MirrorPad = Module[\"_MirrorPad\"] = Module[\"asm\"][\"wa\"]).apply(null, arguments);\n        };\n        var _Multiply = Module[\"_Multiply\"] = function() {\n          return (_Multiply = Module[\"_Multiply\"] = Module[\"asm\"][\"xa\"]).apply(null, arguments);\n        };\n        var _Neg = Module[\"_Neg\"] = function() {\n          return (_Neg = Module[\"_Neg\"] = Module[\"asm\"][\"ya\"]).apply(null, arguments);\n        };\n        var _NonMaxSuppressionV3 = Module[\"_NonMaxSuppressionV3\"] = function() {\n          return (_NonMaxSuppressionV3 = Module[\"_NonMaxSuppressionV3\"] = Module[\"asm\"][\"za\"]).apply(null, arguments);\n        };\n        var _NonMaxSuppressionV4 = Module[\"_NonMaxSuppressionV4\"] = function() {\n          return (_NonMaxSuppressionV4 = Module[\"_NonMaxSuppressionV4\"] = Module[\"asm\"][\"Aa\"]).apply(null, arguments);\n        };\n        var _NonMaxSuppressionV5 = Module[\"_NonMaxSuppressionV5\"] = function() {\n          return (_NonMaxSuppressionV5 = Module[\"_NonMaxSuppressionV5\"] = Module[\"asm\"][\"Ba\"]).apply(null, arguments);\n        };\n        var _NotEqual = Module[\"_NotEqual\"] = function() {\n          return (_NotEqual = Module[\"_NotEqual\"] = Module[\"asm\"][\"Ca\"]).apply(null, arguments);\n        };\n        var _OneHot = Module[\"_OneHot\"] = function() {\n          return (_OneHot = Module[\"_OneHot\"] = Module[\"asm\"][\"Da\"]).apply(null, arguments);\n        };\n        var _PadV2 = Module[\"_PadV2\"] = function() {\n          return (_PadV2 = Module[\"_PadV2\"] = Module[\"asm\"][\"Ea\"]).apply(null, arguments);\n        };\n        var _Pow = Module[\"_Pow\"] = function() {\n          return (_Pow = Module[\"_Pow\"] = Module[\"asm\"][\"Fa\"]).apply(null, arguments);\n        };\n        var _Prelu = Module[\"_Prelu\"] = function() {\n          return (_Prelu = Module[\"_Prelu\"] = Module[\"asm\"][\"Ga\"]).apply(null, arguments);\n        };\n        var _Prod = Module[\"_Prod\"] = function() {\n          return (_Prod = Module[\"_Prod\"] = Module[\"asm\"][\"Ha\"]).apply(null, arguments);\n        };\n        var _RealDiv = Module[\"_RealDiv\"] = function() {\n          return (_RealDiv = Module[\"_RealDiv\"] = Module[\"asm\"][\"Ia\"]).apply(null, arguments);\n        };\n        var _Relu = Module[\"_Relu\"] = function() {\n          return (_Relu = Module[\"_Relu\"] = Module[\"asm\"][\"Ja\"]).apply(null, arguments);\n        };\n        var _Relu6 = Module[\"_Relu6\"] = function() {\n          return (_Relu6 = Module[\"_Relu6\"] = Module[\"asm\"][\"Ka\"]).apply(null, arguments);\n        };\n        var _ResizeBilinear = Module[\"_ResizeBilinear\"] = function() {\n          return (_ResizeBilinear = Module[\"_ResizeBilinear\"] = Module[\"asm\"][\"La\"]).apply(null, arguments);\n        };\n        var _Reverse = Module[\"_Reverse\"] = function() {\n          return (_Reverse = Module[\"_Reverse\"] = Module[\"asm\"][\"Ma\"]).apply(null, arguments);\n        };\n        var _RotateWithOffset = Module[\"_RotateWithOffset\"] = function() {\n          return (_RotateWithOffset = Module[\"_RotateWithOffset\"] = Module[\"asm\"][\"Na\"]).apply(null, arguments);\n        };\n        var _Round = Module[\"_Round\"] = function() {\n          return (_Round = Module[\"_Round\"] = Module[\"asm\"][\"Oa\"]).apply(null, arguments);\n        };\n        var _Rsqrt = Module[\"_Rsqrt\"] = function() {\n          return (_Rsqrt = Module[\"_Rsqrt\"] = Module[\"asm\"][\"Pa\"]).apply(null, arguments);\n        };\n        var _ScatterNd = Module[\"_ScatterNd\"] = function() {\n          return (_ScatterNd = Module[\"_ScatterNd\"] = Module[\"asm\"][\"Qa\"]).apply(null, arguments);\n        };\n        var _SelectV2 = Module[\"_SelectV2\"] = function() {\n          return (_SelectV2 = Module[\"_SelectV2\"] = Module[\"asm\"][\"Ra\"]).apply(null, arguments);\n        };\n        var _Sigmoid = Module[\"_Sigmoid\"] = function() {\n          return (_Sigmoid = Module[\"_Sigmoid\"] = Module[\"asm\"][\"Sa\"]).apply(null, arguments);\n        };\n        var _Sin = Module[\"_Sin\"] = function() {\n          return (_Sin = Module[\"_Sin\"] = Module[\"asm\"][\"Ta\"]).apply(null, arguments);\n        };\n        var _Softmax = Module[\"_Softmax\"] = function() {\n          return (_Softmax = Module[\"_Softmax\"] = Module[\"asm\"][\"Ua\"]).apply(null, arguments);\n        };\n        var _Sqrt = Module[\"_Sqrt\"] = function() {\n          return (_Sqrt = Module[\"_Sqrt\"] = Module[\"asm\"][\"Va\"]).apply(null, arguments);\n        };\n        var _Square = Module[\"_Square\"] = function() {\n          return (_Square = Module[\"_Square\"] = Module[\"asm\"][\"Wa\"]).apply(null, arguments);\n        };\n        var _SquaredDifference = Module[\"_SquaredDifference\"] = function() {\n          return (_SquaredDifference = Module[\"_SquaredDifference\"] = Module[\"asm\"][\"Xa\"]).apply(null, arguments);\n        };\n        var _Step = Module[\"_Step\"] = function() {\n          return (_Step = Module[\"_Step\"] = Module[\"asm\"][\"Ya\"]).apply(null, arguments);\n        };\n        var _StridedSlice = Module[\"_StridedSlice\"] = function() {\n          return (_StridedSlice = Module[\"_StridedSlice\"] = Module[\"asm\"][\"Za\"]).apply(null, arguments);\n        };\n        var _Sub = Module[\"_Sub\"] = function() {\n          return (_Sub = Module[\"_Sub\"] = Module[\"asm\"][\"_a\"]).apply(null, arguments);\n        };\n        var _Sum = Module[\"_Sum\"] = function() {\n          return (_Sum = Module[\"_Sum\"] = Module[\"asm\"][\"$a\"]).apply(null, arguments);\n        };\n        var _Tan = Module[\"_Tan\"] = function() {\n          return (_Tan = Module[\"_Tan\"] = Module[\"asm\"][\"ab\"]).apply(null, arguments);\n        };\n        var _Tanh = Module[\"_Tanh\"] = function() {\n          return (_Tanh = Module[\"_Tanh\"] = Module[\"asm\"][\"bb\"]).apply(null, arguments);\n        };\n        var _Tile = Module[\"_Tile\"] = function() {\n          return (_Tile = Module[\"_Tile\"] = Module[\"asm\"][\"cb\"]).apply(null, arguments);\n        };\n        var _TopK = Module[\"_TopK\"] = function() {\n          return (_TopK = Module[\"_TopK\"] = Module[\"asm\"][\"db\"]).apply(null, arguments);\n        };\n        var _Transform = Module[\"_Transform\"] = function() {\n          return (_Transform = Module[\"_Transform\"] = Module[\"asm\"][\"eb\"]).apply(null, arguments);\n        };\n        var _Transpose = Module[\"_Transpose\"] = function() {\n          return (_Transpose = Module[\"_Transpose\"] = Module[\"asm\"][\"fb\"]).apply(null, arguments);\n        };\n        var __FusedMatMul = Module[\"__FusedMatMul\"] = function() {\n          return (__FusedMatMul = Module[\"__FusedMatMul\"] = Module[\"asm\"][\"gb\"]).apply(null, arguments);\n        };\n        var _malloc = Module[\"_malloc\"] = function() {\n          return (_malloc = Module[\"_malloc\"] = Module[\"asm\"][\"hb\"]).apply(null, arguments);\n        };\n        var _free = Module[\"_free\"] = function() {\n          return (_free = Module[\"_free\"] = Module[\"asm\"][\"ib\"]).apply(null, arguments);\n        };\n        var ___errno_location = Module[\"___errno_location\"] = function() {\n          return (___errno_location = Module[\"___errno_location\"] = Module[\"asm\"][\"jb\"]).apply(null, arguments);\n        };\n        var _emscripten_get_global_libc = Module[\"_emscripten_get_global_libc\"] = function() {\n          return (_emscripten_get_global_libc = Module[\"_emscripten_get_global_libc\"] = Module[\"asm\"][\"lb\"]).apply(null, arguments);\n        };\n        var _pthread_self = Module[\"_pthread_self\"] = function() {\n          return (_pthread_self = Module[\"_pthread_self\"] = Module[\"asm\"][\"mb\"]).apply(null, arguments);\n        };\n        var ___pthread_tsd_run_dtors = Module[\"___pthread_tsd_run_dtors\"] = function() {\n          return (___pthread_tsd_run_dtors = Module[\"___pthread_tsd_run_dtors\"] = Module[\"asm\"][\"nb\"]).apply(null, arguments);\n        };\n        var _emscripten_main_thread_process_queued_calls = Module[\"_emscripten_main_thread_process_queued_calls\"] = function() {\n          return (_emscripten_main_thread_process_queued_calls = Module[\"_emscripten_main_thread_process_queued_calls\"] = Module[\"asm\"][\"ob\"]).apply(null, arguments);\n        };\n        var _emscripten_current_thread_process_queued_calls = Module[\"_emscripten_current_thread_process_queued_calls\"] = function() {\n          return (_emscripten_current_thread_process_queued_calls = Module[\"_emscripten_current_thread_process_queued_calls\"] = Module[\"asm\"][\"pb\"]).apply(null, arguments);\n        };\n        var _emscripten_register_main_browser_thread_id = Module[\"_emscripten_register_main_browser_thread_id\"] = function() {\n          return (_emscripten_register_main_browser_thread_id = Module[\"_emscripten_register_main_browser_thread_id\"] = Module[\"asm\"][\"qb\"]).apply(null, arguments);\n        };\n        var _emscripten_main_browser_thread_id = Module[\"_emscripten_main_browser_thread_id\"] = function() {\n          return (_emscripten_main_browser_thread_id = Module[\"_emscripten_main_browser_thread_id\"] = Module[\"asm\"][\"rb\"]).apply(null, arguments);\n        };\n        var __emscripten_do_dispatch_to_thread = Module[\"__emscripten_do_dispatch_to_thread\"] = function() {\n          return (__emscripten_do_dispatch_to_thread = Module[\"__emscripten_do_dispatch_to_thread\"] = Module[\"asm\"][\"sb\"]).apply(null, arguments);\n        };\n        var _emscripten_sync_run_in_main_thread_4 = Module[\"_emscripten_sync_run_in_main_thread_4\"] = function() {\n          return (_emscripten_sync_run_in_main_thread_4 = Module[\"_emscripten_sync_run_in_main_thread_4\"] = Module[\"asm\"][\"tb\"]).apply(null, arguments);\n        };\n        var _emscripten_run_in_main_runtime_thread_js = Module[\"_emscripten_run_in_main_runtime_thread_js\"] = function() {\n          return (_emscripten_run_in_main_runtime_thread_js = Module[\"_emscripten_run_in_main_runtime_thread_js\"] = Module[\"asm\"][\"ub\"]).apply(null, arguments);\n        };\n        var __emscripten_call_on_thread = Module[\"__emscripten_call_on_thread\"] = function() {\n          return (__emscripten_call_on_thread = Module[\"__emscripten_call_on_thread\"] = Module[\"asm\"][\"vb\"]).apply(null, arguments);\n        };\n        var _emscripten_tls_init = Module[\"_emscripten_tls_init\"] = function() {\n          return (_emscripten_tls_init = Module[\"_emscripten_tls_init\"] = Module[\"asm\"][\"wb\"]).apply(null, arguments);\n        };\n        var __emscripten_thread_init = Module[\"__emscripten_thread_init\"] = function() {\n          return (__emscripten_thread_init = Module[\"__emscripten_thread_init\"] = Module[\"asm\"][\"xb\"]).apply(null, arguments);\n        };\n        var stackSave = Module[\"stackSave\"] = function() {\n          return (stackSave = Module[\"stackSave\"] = Module[\"asm\"][\"yb\"]).apply(null, arguments);\n        };\n        var stackRestore = Module[\"stackRestore\"] = function() {\n          return (stackRestore = Module[\"stackRestore\"] = Module[\"asm\"][\"zb\"]).apply(null, arguments);\n        };\n        var stackAlloc = Module[\"stackAlloc\"] = function() {\n          return (stackAlloc = Module[\"stackAlloc\"] = Module[\"asm\"][\"Ab\"]).apply(null, arguments);\n        };\n        var _emscripten_stack_set_limits = Module[\"_emscripten_stack_set_limits\"] = function() {\n          return (_emscripten_stack_set_limits = Module[\"_emscripten_stack_set_limits\"] = Module[\"asm\"][\"Bb\"]).apply(null, arguments);\n        };\n        var _memalign = Module[\"_memalign\"] = function() {\n          return (_memalign = Module[\"_memalign\"] = Module[\"asm\"][\"Cb\"]).apply(null, arguments);\n        };\n        var __emscripten_allow_main_runtime_queued_calls = Module[\"__emscripten_allow_main_runtime_queued_calls\"] = 10064;\n        var __emscripten_main_thread_futex = Module[\"__emscripten_main_thread_futex\"] = 10268;\n        Module[\"cwrap\"] = cwrap;\n        Module[\"PThread\"] = PThread;\n        Module[\"PThread\"] = PThread;\n        Module[\"wasmMemory\"] = wasmMemory;\n        Module[\"ExitStatus\"] = ExitStatus;\n        var calledRun;\n        function ExitStatus(status) {\n          this.name = \"ExitStatus\";\n          this.message = \"Program terminated with exit(\" + status + \")\";\n          this.status = status;\n        }\n        dependenciesFulfilled = function runCaller() {\n          if (!calledRun)\n            run();\n          if (!calledRun)\n            dependenciesFulfilled = runCaller;\n        };\n        function run(args) {\n          args = args || arguments_;\n          if (runDependencies > 0) {\n            return;\n          }\n          if (ENVIRONMENT_IS_PTHREAD) {\n            readyPromiseResolve(Module);\n            initRuntime();\n            postMessage({ \"cmd\": \"loaded\" });\n            return;\n          }\n          preRun();\n          if (runDependencies > 0) {\n            return;\n          }\n          function doRun() {\n            if (calledRun)\n              return;\n            calledRun = true;\n            Module[\"calledRun\"] = true;\n            if (ABORT)\n              return;\n            initRuntime();\n            preMain();\n            readyPromiseResolve(Module);\n            if (Module[\"onRuntimeInitialized\"])\n              Module[\"onRuntimeInitialized\"]();\n            postRun();\n          }\n          if (Module[\"setStatus\"]) {\n            Module[\"setStatus\"](\"Running...\");\n            setTimeout(function() {\n              setTimeout(function() {\n                Module[\"setStatus\"](\"\");\n              }, 1);\n              doRun();\n            }, 1);\n          } else {\n            doRun();\n          }\n        }\n        Module[\"run\"] = run;\n        function exit(status, implicit) {\n          if (implicit && noExitRuntime && status === 0) {\n            return;\n          }\n          if (!implicit) {\n            if (ENVIRONMENT_IS_PTHREAD) {\n              postMessage({ \"cmd\": \"exitProcess\", \"returnCode\": status });\n              throw new ExitStatus(status);\n            } else {\n            }\n          }\n          if (noExitRuntime) {\n          } else {\n            PThread.terminateAllThreads();\n            EXITSTATUS = status;\n            exitRuntime();\n            if (Module[\"onExit\"])\n              Module[\"onExit\"](status);\n            ABORT = true;\n          }\n          quit_(status, new ExitStatus(status));\n        }\n        if (Module[\"preInit\"]) {\n          if (typeof Module[\"preInit\"] == \"function\")\n            Module[\"preInit\"] = [Module[\"preInit\"]];\n          while (Module[\"preInit\"].length > 0) {\n            Module[\"preInit\"].pop()();\n          }\n        }\n        if (ENVIRONMENT_IS_PTHREAD) {\n          noExitRuntime = false;\n          PThread.initWorker();\n        }\n        run();\n        return WasmBackendModuleThreadedSimd2.ready;\n      };\n    }();\n    if (typeof exports === \"object\" && typeof module === \"object\")\n      module.exports = WasmBackendModuleThreadedSimd;\n    else if (typeof define === \"function\" && define[\"amd\"])\n      define([], function() {\n        return WasmBackendModuleThreadedSimd;\n      });\n    else if (typeof exports === \"object\")\n      exports[\"WasmBackendModuleThreadedSimd\"] = WasmBackendModuleThreadedSimd;\n  }\n});\nvar require_tfjs_backend_wasm = __commonJS({\n  \"src/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js\"(exports, module) {\n    var WasmBackendModule = function() {\n      var _scriptDir = typeof document !== \"undefined\" && document.currentScript ? document.currentScript.src : void 0;\n      if (typeof __filename !== \"undefined\")\n        _scriptDir = _scriptDir || __filename;\n      return function(WasmBackendModule2) {\n        WasmBackendModule2 = WasmBackendModule2 || {};\n        var Module = typeof WasmBackendModule2 !== \"undefined\" ? WasmBackendModule2 : {};\n        var readyPromiseResolve, readyPromiseReject;\n        Module[\"ready\"] = new Promise(function(resolve, reject) {\n          readyPromiseResolve = resolve;\n          readyPromiseReject = reject;\n        });\n        var moduleOverrides = {};\n        var key;\n        for (key in Module) {\n          if (Module.hasOwnProperty(key)) {\n            moduleOverrides[key] = Module[key];\n          }\n        }\n        var arguments_ = [];\n        var thisProgram = \"./this.program\";\n        var quit_ = function(status, toThrow) {\n          throw toThrow;\n        };\n        var ENVIRONMENT_IS_WEB = false;\n        var ENVIRONMENT_IS_WORKER = false;\n        var ENVIRONMENT_IS_NODE = false;\n        var ENVIRONMENT_IS_SHELL = false;\n        ENVIRONMENT_IS_WEB = typeof window === \"object\";\n        ENVIRONMENT_IS_WORKER = typeof importScripts === \"function\";\n        ENVIRONMENT_IS_NODE = typeof process === \"object\" && typeof process.versions === \"object\" && typeof process.versions.node === \"string\";\n        ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;\n        var scriptDirectory = \"\";\n        function locateFile(path) {\n          if (Module[\"locateFile\"]) {\n            return Module[\"locateFile\"](path, scriptDirectory);\n          }\n          return scriptDirectory + path;\n        }\n        var read_, readAsync, readBinary, setWindowTitle;\n        var nodeFS;\n        var nodePath;\n        if (ENVIRONMENT_IS_NODE) {\n          if (ENVIRONMENT_IS_WORKER) {\n            scriptDirectory = __require2(\"path\").dirname(scriptDirectory) + \"/\";\n          } else {\n            scriptDirectory = __dirname + \"/\";\n          }\n          read_ = function shell_read(filename, binary) {\n            if (!nodeFS)\n              nodeFS = __require2(\"fs\");\n            if (!nodePath)\n              nodePath = __require2(\"path\");\n            filename = nodePath[\"normalize\"](filename);\n            return nodeFS[\"readFileSync\"](filename, binary ? null : \"utf8\");\n          };\n          readBinary = function readBinary2(filename) {\n            var ret = read_(filename, true);\n            if (!ret.buffer) {\n              ret = new Uint8Array(ret);\n            }\n            assert3(ret.buffer);\n            return ret;\n          };\n          if (process[\"argv\"].length > 1) {\n            thisProgram = process[\"argv\"][1].replace(/\\\\/g, \"/\");\n          }\n          arguments_ = process[\"argv\"].slice(2);\n          process[\"on\"](\"uncaughtException\", function(ex) {\n            if (!(ex instanceof ExitStatus)) {\n              throw ex;\n            }\n          });\n          process[\"on\"](\"unhandledRejection\", abort);\n          quit_ = function(status) {\n            process[\"exit\"](status);\n          };\n          Module[\"inspect\"] = function() {\n            return \"[Emscripten Module object]\";\n          };\n        } else if (ENVIRONMENT_IS_SHELL) {\n          if (typeof read != \"undefined\") {\n            read_ = function shell_read(f) {\n              return read(f);\n            };\n          }\n          readBinary = function readBinary2(f) {\n            var data;\n            if (typeof readbuffer === \"function\") {\n              return new Uint8Array(readbuffer(f));\n            }\n            data = read(f, \"binary\");\n            assert3(typeof data === \"object\");\n            return data;\n          };\n          if (typeof scriptArgs != \"undefined\") {\n            arguments_ = scriptArgs;\n          } else if (typeof arguments != \"undefined\") {\n            arguments_ = arguments;\n          }\n          if (typeof quit === \"function\") {\n            quit_ = function(status) {\n              quit(status);\n            };\n          }\n          if (typeof print !== \"undefined\") {\n            if (typeof console === \"undefined\")\n              console = {};\n            console.log = print;\n            console.warn = console.error = typeof printErr !== \"undefined\" ? printErr : print;\n          }\n        } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {\n          if (ENVIRONMENT_IS_WORKER) {\n            scriptDirectory = self.location.href;\n          } else if (typeof document !== \"undefined\" && document.currentScript) {\n            scriptDirectory = document.currentScript.src;\n          }\n          if (_scriptDir) {\n            scriptDirectory = _scriptDir;\n          }\n          if (scriptDirectory.indexOf(\"blob:\") !== 0) {\n            scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf(\"/\") + 1);\n          } else {\n            scriptDirectory = \"\";\n          }\n          {\n            read_ = function(url) {\n              var xhr = new XMLHttpRequest();\n              xhr.open(\"GET\", url, false);\n              xhr.send(null);\n              return xhr.responseText;\n            };\n            if (ENVIRONMENT_IS_WORKER) {\n              readBinary = function(url) {\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", url, false);\n                xhr.responseType = \"arraybuffer\";\n                xhr.send(null);\n                return new Uint8Array(xhr.response);\n              };\n            }\n            readAsync = function(url, onload, onerror) {\n              var xhr = new XMLHttpRequest();\n              xhr.open(\"GET\", url, true);\n              xhr.responseType = \"arraybuffer\";\n              xhr.onload = function() {\n                if (xhr.status == 200 || xhr.status == 0 && xhr.response) {\n                  onload(xhr.response);\n                  return;\n                }\n                onerror();\n              };\n              xhr.onerror = onerror;\n              xhr.send(null);\n            };\n          }\n          setWindowTitle = function(title) {\n            document.title = title;\n          };\n        } else {\n        }\n        var out = Module[\"print\"] || console.log.bind(console);\n        var err = Module[\"printErr\"] || console.warn.bind(console);\n        for (key in moduleOverrides) {\n          if (moduleOverrides.hasOwnProperty(key)) {\n            Module[key] = moduleOverrides[key];\n          }\n        }\n        moduleOverrides = null;\n        if (Module[\"arguments\"])\n          arguments_ = Module[\"arguments\"];\n        if (Module[\"thisProgram\"])\n          thisProgram = Module[\"thisProgram\"];\n        if (Module[\"quit\"])\n          quit_ = Module[\"quit\"];\n        var wasmBinary;\n        if (Module[\"wasmBinary\"])\n          wasmBinary = Module[\"wasmBinary\"];\n        var noExitRuntime = Module[\"noExitRuntime\"] || true;\n        if (typeof WebAssembly !== \"object\") {\n          abort(\"no native wasm support detected\");\n        }\n        var wasmMemory;\n        var ABORT = false;\n        var EXITSTATUS;\n        function assert3(condition, text) {\n          if (!condition) {\n            abort(\"Assertion failed: \" + text);\n          }\n        }\n        function getCFunc(ident) {\n          var func2 = Module[\"_\" + ident];\n          assert3(func2, \"Cannot call unknown function \" + ident + \", make sure it is exported\");\n          return func2;\n        }\n        function ccall(ident, returnType, argTypes, args, opts) {\n          var toC = { \"string\": function(str) {\n            var ret2 = 0;\n            if (str !== null && str !== void 0 && str !== 0) {\n              var len = (str.length << 2) + 1;\n              ret2 = stackAlloc(len);\n              stringToUTF8(str, ret2, len);\n            }\n            return ret2;\n          }, \"array\": function(arr) {\n            var ret2 = stackAlloc(arr.length);\n            writeArrayToMemory(arr, ret2);\n            return ret2;\n          } };\n          function convertReturnValue(ret2) {\n            if (returnType === \"string\")\n              return UTF8ToString(ret2);\n            if (returnType === \"boolean\")\n              return Boolean(ret2);\n            return ret2;\n          }\n          var func2 = getCFunc(ident);\n          var cArgs = [];\n          var stack2 = 0;\n          if (args) {\n            for (var i = 0; i < args.length; i++) {\n              var converter = toC[argTypes[i]];\n              if (converter) {\n                if (stack2 === 0)\n                  stack2 = stackSave();\n                cArgs[i] = converter(args[i]);\n              } else {\n                cArgs[i] = args[i];\n              }\n            }\n          }\n          var ret = func2.apply(null, cArgs);\n          ret = convertReturnValue(ret);\n          if (stack2 !== 0)\n            stackRestore(stack2);\n          return ret;\n        }\n        function cwrap(ident, returnType, argTypes, opts) {\n          argTypes = argTypes || [];\n          var numericArgs = argTypes.every(function(type) {\n            return type === \"number\";\n          });\n          var numericRet = returnType !== \"string\";\n          if (numericRet && numericArgs && !opts) {\n            return getCFunc(ident);\n          }\n          return function() {\n            return ccall(ident, returnType, argTypes, arguments, opts);\n          };\n        }\n        var UTF8Decoder = typeof TextDecoder !== \"undefined\" ? new TextDecoder(\"utf8\") : void 0;\n        function UTF8ArrayToString(heap, idx, maxBytesToRead) {\n          var endIdx = idx + maxBytesToRead;\n          var endPtr = idx;\n          while (heap[endPtr] && !(endPtr >= endIdx))\n            ++endPtr;\n          if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) {\n            return UTF8Decoder.decode(heap.subarray(idx, endPtr));\n          } else {\n            var str = \"\";\n            while (idx < endPtr) {\n              var u0 = heap[idx++];\n              if (!(u0 & 128)) {\n                str += String.fromCharCode(u0);\n                continue;\n              }\n              var u1 = heap[idx++] & 63;\n              if ((u0 & 224) == 192) {\n                str += String.fromCharCode((u0 & 31) << 6 | u1);\n                continue;\n              }\n              var u2 = heap[idx++] & 63;\n              if ((u0 & 240) == 224) {\n                u0 = (u0 & 15) << 12 | u1 << 6 | u2;\n              } else {\n                u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63;\n              }\n              if (u0 < 65536) {\n                str += String.fromCharCode(u0);\n              } else {\n                var ch = u0 - 65536;\n                str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023);\n              }\n            }\n          }\n          return str;\n        }\n        function UTF8ToString(ptr, maxBytesToRead) {\n          return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : \"\";\n        }\n        function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) {\n          if (!(maxBytesToWrite > 0))\n            return 0;\n          var startIdx = outIdx;\n          var endIdx = outIdx + maxBytesToWrite - 1;\n          for (var i = 0; i < str.length; ++i) {\n            var u = str.charCodeAt(i);\n            if (u >= 55296 && u <= 57343) {\n              var u1 = str.charCodeAt(++i);\n              u = 65536 + ((u & 1023) << 10) | u1 & 1023;\n            }\n            if (u <= 127) {\n              if (outIdx >= endIdx)\n                break;\n              heap[outIdx++] = u;\n            } else if (u <= 2047) {\n              if (outIdx + 1 >= endIdx)\n                break;\n              heap[outIdx++] = 192 | u >> 6;\n              heap[outIdx++] = 128 | u & 63;\n            } else if (u <= 65535) {\n              if (outIdx + 2 >= endIdx)\n                break;\n              heap[outIdx++] = 224 | u >> 12;\n              heap[outIdx++] = 128 | u >> 6 & 63;\n              heap[outIdx++] = 128 | u & 63;\n            } else {\n              if (outIdx + 3 >= endIdx)\n                break;\n              heap[outIdx++] = 240 | u >> 18;\n              heap[outIdx++] = 128 | u >> 12 & 63;\n              heap[outIdx++] = 128 | u >> 6 & 63;\n              heap[outIdx++] = 128 | u & 63;\n            }\n          }\n          heap[outIdx] = 0;\n          return outIdx - startIdx;\n        }\n        function stringToUTF8(str, outPtr, maxBytesToWrite) {\n          return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite);\n        }\n        function writeArrayToMemory(array2, buffer3) {\n          HEAP8.set(array2, buffer3);\n        }\n        function alignUp(x, multiple) {\n          if (x % multiple > 0) {\n            x += multiple - x % multiple;\n          }\n          return x;\n        }\n        var buffer2, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;\n        function updateGlobalBufferAndViews(buf) {\n          buffer2 = buf;\n          Module[\"HEAP8\"] = HEAP8 = new Int8Array(buf);\n          Module[\"HEAP16\"] = HEAP16 = new Int16Array(buf);\n          Module[\"HEAP32\"] = HEAP32 = new Int32Array(buf);\n          Module[\"HEAPU8\"] = HEAPU8 = new Uint8Array(buf);\n          Module[\"HEAPU16\"] = HEAPU16 = new Uint16Array(buf);\n          Module[\"HEAPU32\"] = HEAPU32 = new Uint32Array(buf);\n          Module[\"HEAPF32\"] = HEAPF32 = new Float32Array(buf);\n          Module[\"HEAPF64\"] = HEAPF64 = new Float64Array(buf);\n        }\n        var INITIAL_MEMORY = Module[\"INITIAL_MEMORY\"] || 16777216;\n        var wasmTable;\n        var __ATPRERUN__ = [];\n        var __ATINIT__ = [];\n        var __ATMAIN__ = [];\n        var __ATPOSTRUN__ = [];\n        var runtimeInitialized = false;\n        __ATINIT__.push({ func: function() {\n          ___wasm_call_ctors();\n        } });\n        function preRun() {\n          if (Module[\"preRun\"]) {\n            if (typeof Module[\"preRun\"] == \"function\")\n              Module[\"preRun\"] = [Module[\"preRun\"]];\n            while (Module[\"preRun\"].length) {\n              addOnPreRun(Module[\"preRun\"].shift());\n            }\n          }\n          callRuntimeCallbacks(__ATPRERUN__);\n        }\n        function initRuntime() {\n          runtimeInitialized = true;\n          callRuntimeCallbacks(__ATINIT__);\n        }\n        function preMain() {\n          callRuntimeCallbacks(__ATMAIN__);\n        }\n        function postRun() {\n          if (Module[\"postRun\"]) {\n            if (typeof Module[\"postRun\"] == \"function\")\n              Module[\"postRun\"] = [Module[\"postRun\"]];\n            while (Module[\"postRun\"].length) {\n              addOnPostRun(Module[\"postRun\"].shift());\n            }\n          }\n          callRuntimeCallbacks(__ATPOSTRUN__);\n        }\n        function addOnPreRun(cb) {\n          __ATPRERUN__.unshift(cb);\n        }\n        function addOnPostRun(cb) {\n          __ATPOSTRUN__.unshift(cb);\n        }\n        var runDependencies = 0;\n        var runDependencyWatcher = null;\n        var dependenciesFulfilled = null;\n        function addRunDependency(id) {\n          runDependencies++;\n          if (Module[\"monitorRunDependencies\"]) {\n            Module[\"monitorRunDependencies\"](runDependencies);\n          }\n        }\n        function removeRunDependency(id) {\n          runDependencies--;\n          if (Module[\"monitorRunDependencies\"]) {\n            Module[\"monitorRunDependencies\"](runDependencies);\n          }\n          if (runDependencies == 0) {\n            if (runDependencyWatcher !== null) {\n              clearInterval(runDependencyWatcher);\n              runDependencyWatcher = null;\n            }\n            if (dependenciesFulfilled) {\n              var callback = dependenciesFulfilled;\n              dependenciesFulfilled = null;\n              callback();\n            }\n          }\n        }\n        Module[\"preloadedImages\"] = {};\n        Module[\"preloadedAudios\"] = {};\n        function abort(what) {\n          if (Module[\"onAbort\"]) {\n            Module[\"onAbort\"](what);\n          }\n          what += \"\";\n          err(what);\n          ABORT = true;\n          EXITSTATUS = 1;\n          what = \"abort(\" + what + \"). Build with -s ASSERTIONS=1 for more info.\";\n          var e = new WebAssembly.RuntimeError(what);\n          readyPromiseReject(e);\n          throw e;\n        }\n        function hasPrefix(str, prefix) {\n          return String.prototype.startsWith ? str.startsWith(prefix) : str.indexOf(prefix) === 0;\n        }\n        var dataURIPrefix = \"data:application/octet-stream;base64,\";\n        function isDataURI(filename) {\n          return hasPrefix(filename, dataURIPrefix);\n        }\n        var fileURIPrefix = \"file://\";\n        function isFileURI(filename) {\n          return hasPrefix(filename, fileURIPrefix);\n        }\n        var wasmBinaryFile = \"tfjs-backend-wasm.wasm\";\n        if (!isDataURI(wasmBinaryFile)) {\n          wasmBinaryFile = locateFile(wasmBinaryFile);\n        }\n        function getBinary(file) {\n          try {\n            if (file == wasmBinaryFile && wasmBinary) {\n              return new Uint8Array(wasmBinary);\n            }\n            if (readBinary) {\n              return readBinary(file);\n            } else {\n              throw \"both async and sync fetching of the wasm failed\";\n            }\n          } catch (err2) {\n            abort(err2);\n          }\n        }\n        function getBinaryPromise() {\n          if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) {\n            if (typeof fetch === \"function\" && !isFileURI(wasmBinaryFile)) {\n              return fetch(wasmBinaryFile, { credentials: \"same-origin\" }).then(function(response) {\n                if (!response[\"ok\"]) {\n                  throw \"failed to load wasm binary file at '\" + wasmBinaryFile + \"'\";\n                }\n                return response[\"arrayBuffer\"]();\n              }).catch(function() {\n                return getBinary(wasmBinaryFile);\n              });\n            } else {\n              if (readAsync) {\n                return new Promise(function(resolve, reject) {\n                  readAsync(wasmBinaryFile, function(response) {\n                    resolve(new Uint8Array(response));\n                  }, reject);\n                });\n              }\n            }\n          }\n          return Promise.resolve().then(function() {\n            return getBinary(wasmBinaryFile);\n          });\n        }\n        function createWasm() {\n          var info = { \"a\": asmLibraryArg };\n          function receiveInstance(instance, module2) {\n            var exports3 = instance.exports;\n            Module[\"asm\"] = exports3;\n            wasmMemory = Module[\"asm\"][\"h\"];\n            updateGlobalBufferAndViews(wasmMemory.buffer);\n            wasmTable = Module[\"asm\"][\"Sa\"];\n            removeRunDependency(\"wasm-instantiate\");\n          }\n          addRunDependency(\"wasm-instantiate\");\n          function receiveInstantiatedSource(output) {\n            receiveInstance(output[\"instance\"]);\n          }\n          function instantiateArrayBuffer(receiver) {\n            return getBinaryPromise().then(function(binary) {\n              return WebAssembly.instantiate(binary, info);\n            }).then(receiver, function(reason) {\n              err(\"failed to asynchronously prepare wasm: \" + reason);\n              abort(reason);\n            });\n          }\n          function instantiateAsync() {\n            if (!wasmBinary && typeof WebAssembly.instantiateStreaming === \"function\" && !isDataURI(wasmBinaryFile) && !isFileURI(wasmBinaryFile) && typeof fetch === \"function\") {\n              return fetch(wasmBinaryFile, { credentials: \"same-origin\" }).then(function(response) {\n                var result = WebAssembly.instantiateStreaming(response, info);\n                return result.then(receiveInstantiatedSource, function(reason) {\n                  err(\"wasm streaming compile failed: \" + reason);\n                  err(\"falling back to ArrayBuffer instantiation\");\n                  return instantiateArrayBuffer(receiveInstantiatedSource);\n                });\n              });\n            } else {\n              return instantiateArrayBuffer(receiveInstantiatedSource);\n            }\n          }\n          if (Module[\"instantiateWasm\"]) {\n            try {\n              var exports2 = Module[\"instantiateWasm\"](info, receiveInstance);\n              return exports2;\n            } catch (e) {\n              err(\"Module.instantiateWasm callback failed with error: \" + e);\n              return false;\n            }\n          }\n          instantiateAsync().catch(readyPromiseReject);\n          return {};\n        }\n        function callRuntimeCallbacks(callbacks2) {\n          while (callbacks2.length > 0) {\n            var callback = callbacks2.shift();\n            if (typeof callback == \"function\") {\n              callback(Module);\n              continue;\n            }\n            var func2 = callback.func;\n            if (typeof func2 === \"number\") {\n              if (callback.arg === void 0) {\n                wasmTable.get(func2)();\n              } else {\n                wasmTable.get(func2)(callback.arg);\n              }\n            } else {\n              func2(callback.arg === void 0 ? null : callback.arg);\n            }\n          }\n        }\n        function _abort() {\n          abort();\n        }\n        function _emscripten_memcpy_big(dest, src, num) {\n          HEAPU8.copyWithin(dest, src, src + num);\n        }\n        function _emscripten_get_heap_size() {\n          return HEAPU8.length;\n        }\n        function emscripten_realloc_buffer(size) {\n          try {\n            wasmMemory.grow(size - buffer2.byteLength + 65535 >>> 16);\n            updateGlobalBufferAndViews(wasmMemory.buffer);\n            return 1;\n          } catch (e) {\n          }\n        }\n        function _emscripten_resize_heap(requestedSize) {\n          var oldSize = _emscripten_get_heap_size();\n          var maxHeapSize = 2147483648;\n          if (requestedSize > maxHeapSize) {\n            return false;\n          }\n          for (var cutDown = 1; cutDown <= 4; cutDown *= 2) {\n            var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown);\n            overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296);\n            var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536));\n            var replacement = emscripten_realloc_buffer(newSize);\n            if (replacement) {\n              return true;\n            }\n          }\n          return false;\n        }\n        var SYSCALLS = { mappings: {}, buffers: [null, [], []], printChar: function(stream, curr) {\n          var buffer3 = SYSCALLS.buffers[stream];\n          if (curr === 0 || curr === 10) {\n            (stream === 1 ? out : err)(UTF8ArrayToString(buffer3, 0));\n            buffer3.length = 0;\n          } else {\n            buffer3.push(curr);\n          }\n        }, varargs: void 0, get: function() {\n          SYSCALLS.varargs += 4;\n          var ret = HEAP32[SYSCALLS.varargs - 4 >> 2];\n          return ret;\n        }, getStr: function(ptr) {\n          var ret = UTF8ToString(ptr);\n          return ret;\n        }, get64: function(low, high) {\n          return low;\n        } };\n        function _fd_close(fd) {\n          return 0;\n        }\n        function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {\n        }\n        function _fd_write(fd, iov, iovcnt, pnum) {\n          var num = 0;\n          for (var i = 0; i < iovcnt; i++) {\n            var ptr = HEAP32[iov + i * 8 >> 2];\n            var len = HEAP32[iov + (i * 8 + 4) >> 2];\n            for (var j = 0; j < len; j++) {\n              SYSCALLS.printChar(fd, HEAPU8[ptr + j]);\n            }\n            num += len;\n          }\n          HEAP32[pnum >> 2] = num;\n          return 0;\n        }\n        function _pthread_join() {\n          return 28;\n        }\n        var asmLibraryArg = { \"a\": _abort, \"d\": _emscripten_memcpy_big, \"e\": _emscripten_resize_heap, \"f\": _fd_close, \"c\": _fd_seek, \"b\": _fd_write, \"g\": _pthread_join };\n        var asm = createWasm();\n        var ___wasm_call_ctors = Module[\"___wasm_call_ctors\"] = function() {\n          return (___wasm_call_ctors = Module[\"___wasm_call_ctors\"] = Module[\"asm\"][\"i\"]).apply(null, arguments);\n        };\n        var _init = Module[\"_init\"] = function() {\n          return (_init = Module[\"_init\"] = Module[\"asm\"][\"j\"]).apply(null, arguments);\n        };\n        var _init_with_threads_count = Module[\"_init_with_threads_count\"] = function() {\n          return (_init_with_threads_count = Module[\"_init_with_threads_count\"] = Module[\"asm\"][\"k\"]).apply(null, arguments);\n        };\n        var _get_threads_count = Module[\"_get_threads_count\"] = function() {\n          return (_get_threads_count = Module[\"_get_threads_count\"] = Module[\"asm\"][\"l\"]).apply(null, arguments);\n        };\n        var _register_tensor = Module[\"_register_tensor\"] = function() {\n          return (_register_tensor = Module[\"_register_tensor\"] = Module[\"asm\"][\"m\"]).apply(null, arguments);\n        };\n        var _dispose_data = Module[\"_dispose_data\"] = function() {\n          return (_dispose_data = Module[\"_dispose_data\"] = Module[\"asm\"][\"n\"]).apply(null, arguments);\n        };\n        var _dispose = Module[\"_dispose\"] = function() {\n          return (_dispose = Module[\"_dispose\"] = Module[\"asm\"][\"o\"]).apply(null, arguments);\n        };\n        var _Abs = Module[\"_Abs\"] = function() {\n          return (_Abs = Module[\"_Abs\"] = Module[\"asm\"][\"p\"]).apply(null, arguments);\n        };\n        var _Add = Module[\"_Add\"] = function() {\n          return (_Add = Module[\"_Add\"] = Module[\"asm\"][\"q\"]).apply(null, arguments);\n        };\n        var _AddN = Module[\"_AddN\"] = function() {\n          return (_AddN = Module[\"_AddN\"] = Module[\"asm\"][\"r\"]).apply(null, arguments);\n        };\n        var _All = Module[\"_All\"] = function() {\n          return (_All = Module[\"_All\"] = Module[\"asm\"][\"s\"]).apply(null, arguments);\n        };\n        var _Any = Module[\"_Any\"] = function() {\n          return (_Any = Module[\"_Any\"] = Module[\"asm\"][\"t\"]).apply(null, arguments);\n        };\n        var _ArgMax = Module[\"_ArgMax\"] = function() {\n          return (_ArgMax = Module[\"_ArgMax\"] = Module[\"asm\"][\"u\"]).apply(null, arguments);\n        };\n        var _AvgPool = Module[\"_AvgPool\"] = function() {\n          return (_AvgPool = Module[\"_AvgPool\"] = Module[\"asm\"][\"v\"]).apply(null, arguments);\n        };\n        var _BatchMatMul = Module[\"_BatchMatMul\"] = function() {\n          return (_BatchMatMul = Module[\"_BatchMatMul\"] = Module[\"asm\"][\"w\"]).apply(null, arguments);\n        };\n        var _Ceil = Module[\"_Ceil\"] = function() {\n          return (_Ceil = Module[\"_Ceil\"] = Module[\"asm\"][\"x\"]).apply(null, arguments);\n        };\n        var _ClipByValue = Module[\"_ClipByValue\"] = function() {\n          return (_ClipByValue = Module[\"_ClipByValue\"] = Module[\"asm\"][\"y\"]).apply(null, arguments);\n        };\n        var _Conv2D2 = Module[\"_Conv2D\"] = function() {\n          return (_Conv2D2 = Module[\"_Conv2D\"] = Module[\"asm\"][\"z\"]).apply(null, arguments);\n        };\n        var _Conv2DBackpropInput = Module[\"_Conv2DBackpropInput\"] = function() {\n          return (_Conv2DBackpropInput = Module[\"_Conv2DBackpropInput\"] = Module[\"asm\"][\"A\"]).apply(null, arguments);\n        };\n        var _Cos = Module[\"_Cos\"] = function() {\n          return (_Cos = Module[\"_Cos\"] = Module[\"asm\"][\"B\"]).apply(null, arguments);\n        };\n        var _Cosh = Module[\"_Cosh\"] = function() {\n          return (_Cosh = Module[\"_Cosh\"] = Module[\"asm\"][\"C\"]).apply(null, arguments);\n        };\n        var _CropAndResize = Module[\"_CropAndResize\"] = function() {\n          return (_CropAndResize = Module[\"_CropAndResize\"] = Module[\"asm\"][\"D\"]).apply(null, arguments);\n        };\n        var _Cumsum = Module[\"_Cumsum\"] = function() {\n          return (_Cumsum = Module[\"_Cumsum\"] = Module[\"asm\"][\"E\"]).apply(null, arguments);\n        };\n        var _DepthToSpace = Module[\"_DepthToSpace\"] = function() {\n          return (_DepthToSpace = Module[\"_DepthToSpace\"] = Module[\"asm\"][\"F\"]).apply(null, arguments);\n        };\n        var _DepthwiseConv2dNative = Module[\"_DepthwiseConv2dNative\"] = function() {\n          return (_DepthwiseConv2dNative = Module[\"_DepthwiseConv2dNative\"] = Module[\"asm\"][\"G\"]).apply(null, arguments);\n        };\n        var _Elu = Module[\"_Elu\"] = function() {\n          return (_Elu = Module[\"_Elu\"] = Module[\"asm\"][\"H\"]).apply(null, arguments);\n        };\n        var _Equal = Module[\"_Equal\"] = function() {\n          return (_Equal = Module[\"_Equal\"] = Module[\"asm\"][\"I\"]).apply(null, arguments);\n        };\n        var _Exp = Module[\"_Exp\"] = function() {\n          return (_Exp = Module[\"_Exp\"] = Module[\"asm\"][\"J\"]).apply(null, arguments);\n        };\n        var _FlipLeftRight = Module[\"_FlipLeftRight\"] = function() {\n          return (_FlipLeftRight = Module[\"_FlipLeftRight\"] = Module[\"asm\"][\"K\"]).apply(null, arguments);\n        };\n        var _Floor = Module[\"_Floor\"] = function() {\n          return (_Floor = Module[\"_Floor\"] = Module[\"asm\"][\"L\"]).apply(null, arguments);\n        };\n        var _FloorDiv = Module[\"_FloorDiv\"] = function() {\n          return (_FloorDiv = Module[\"_FloorDiv\"] = Module[\"asm\"][\"M\"]).apply(null, arguments);\n        };\n        var _FusedBatchNorm = Module[\"_FusedBatchNorm\"] = function() {\n          return (_FusedBatchNorm = Module[\"_FusedBatchNorm\"] = Module[\"asm\"][\"N\"]).apply(null, arguments);\n        };\n        var _FusedConv2D = Module[\"_FusedConv2D\"] = function() {\n          return (_FusedConv2D = Module[\"_FusedConv2D\"] = Module[\"asm\"][\"O\"]).apply(null, arguments);\n        };\n        var _FusedDepthwiseConv2D = Module[\"_FusedDepthwiseConv2D\"] = function() {\n          return (_FusedDepthwiseConv2D = Module[\"_FusedDepthwiseConv2D\"] = Module[\"asm\"][\"P\"]).apply(null, arguments);\n        };\n        var _Gather = Module[\"_Gather\"] = function() {\n          return (_Gather = Module[\"_Gather\"] = Module[\"asm\"][\"Q\"]).apply(null, arguments);\n        };\n        var _GatherNd = Module[\"_GatherNd\"] = function() {\n          return (_GatherNd = Module[\"_GatherNd\"] = Module[\"asm\"][\"R\"]).apply(null, arguments);\n        };\n        var _Greater = Module[\"_Greater\"] = function() {\n          return (_Greater = Module[\"_Greater\"] = Module[\"asm\"][\"S\"]).apply(null, arguments);\n        };\n        var _GreaterEqual = Module[\"_GreaterEqual\"] = function() {\n          return (_GreaterEqual = Module[\"_GreaterEqual\"] = Module[\"asm\"][\"T\"]).apply(null, arguments);\n        };\n        var _LeakyRelu = Module[\"_LeakyRelu\"] = function() {\n          return (_LeakyRelu = Module[\"_LeakyRelu\"] = Module[\"asm\"][\"U\"]).apply(null, arguments);\n        };\n        var _Less = Module[\"_Less\"] = function() {\n          return (_Less = Module[\"_Less\"] = Module[\"asm\"][\"V\"]).apply(null, arguments);\n        };\n        var _LessEqual = Module[\"_LessEqual\"] = function() {\n          return (_LessEqual = Module[\"_LessEqual\"] = Module[\"asm\"][\"W\"]).apply(null, arguments);\n        };\n        var _Log = Module[\"_Log\"] = function() {\n          return (_Log = Module[\"_Log\"] = Module[\"asm\"][\"X\"]).apply(null, arguments);\n        };\n        var _LogicalAnd = Module[\"_LogicalAnd\"] = function() {\n          return (_LogicalAnd = Module[\"_LogicalAnd\"] = Module[\"asm\"][\"Y\"]).apply(null, arguments);\n        };\n        var _Max = Module[\"_Max\"] = function() {\n          return (_Max = Module[\"_Max\"] = Module[\"asm\"][\"Z\"]).apply(null, arguments);\n        };\n        var _MaxPool = Module[\"_MaxPool\"] = function() {\n          return (_MaxPool = Module[\"_MaxPool\"] = Module[\"asm\"][\"_\"]).apply(null, arguments);\n        };\n        var _Maximum = Module[\"_Maximum\"] = function() {\n          return (_Maximum = Module[\"_Maximum\"] = Module[\"asm\"][\"$\"]).apply(null, arguments);\n        };\n        var _Mean = Module[\"_Mean\"] = function() {\n          return (_Mean = Module[\"_Mean\"] = Module[\"asm\"][\"aa\"]).apply(null, arguments);\n        };\n        var _Min = Module[\"_Min\"] = function() {\n          return (_Min = Module[\"_Min\"] = Module[\"asm\"][\"ba\"]).apply(null, arguments);\n        };\n        var _Minimum = Module[\"_Minimum\"] = function() {\n          return (_Minimum = Module[\"_Minimum\"] = Module[\"asm\"][\"ca\"]).apply(null, arguments);\n        };\n        var _MirrorPad = Module[\"_MirrorPad\"] = function() {\n          return (_MirrorPad = Module[\"_MirrorPad\"] = Module[\"asm\"][\"da\"]).apply(null, arguments);\n        };\n        var _Multiply = Module[\"_Multiply\"] = function() {\n          return (_Multiply = Module[\"_Multiply\"] = Module[\"asm\"][\"ea\"]).apply(null, arguments);\n        };\n        var _Neg = Module[\"_Neg\"] = function() {\n          return (_Neg = Module[\"_Neg\"] = Module[\"asm\"][\"fa\"]).apply(null, arguments);\n        };\n        var _NonMaxSuppressionV3 = Module[\"_NonMaxSuppressionV3\"] = function() {\n          return (_NonMaxSuppressionV3 = Module[\"_NonMaxSuppressionV3\"] = Module[\"asm\"][\"ga\"]).apply(null, arguments);\n        };\n        var _NonMaxSuppressionV4 = Module[\"_NonMaxSuppressionV4\"] = function() {\n          return (_NonMaxSuppressionV4 = Module[\"_NonMaxSuppressionV4\"] = Module[\"asm\"][\"ha\"]).apply(null, arguments);\n        };\n        var _NonMaxSuppressionV5 = Module[\"_NonMaxSuppressionV5\"] = function() {\n          return (_NonMaxSuppressionV5 = Module[\"_NonMaxSuppressionV5\"] = Module[\"asm\"][\"ia\"]).apply(null, arguments);\n        };\n        var _NotEqual = Module[\"_NotEqual\"] = function() {\n          return (_NotEqual = Module[\"_NotEqual\"] = Module[\"asm\"][\"ja\"]).apply(null, arguments);\n        };\n        var _OneHot = Module[\"_OneHot\"] = function() {\n          return (_OneHot = Module[\"_OneHot\"] = Module[\"asm\"][\"ka\"]).apply(null, arguments);\n        };\n        var _PadV2 = Module[\"_PadV2\"] = function() {\n          return (_PadV2 = Module[\"_PadV2\"] = Module[\"asm\"][\"la\"]).apply(null, arguments);\n        };\n        var _Pow = Module[\"_Pow\"] = function() {\n          return (_Pow = Module[\"_Pow\"] = Module[\"asm\"][\"ma\"]).apply(null, arguments);\n        };\n        var _Prelu = Module[\"_Prelu\"] = function() {\n          return (_Prelu = Module[\"_Prelu\"] = Module[\"asm\"][\"na\"]).apply(null, arguments);\n        };\n        var _Prod = Module[\"_Prod\"] = function() {\n          return (_Prod = Module[\"_Prod\"] = Module[\"asm\"][\"oa\"]).apply(null, arguments);\n        };\n        var _RealDiv = Module[\"_RealDiv\"] = function() {\n          return (_RealDiv = Module[\"_RealDiv\"] = Module[\"asm\"][\"pa\"]).apply(null, arguments);\n        };\n        var _Relu = Module[\"_Relu\"] = function() {\n          return (_Relu = Module[\"_Relu\"] = Module[\"asm\"][\"qa\"]).apply(null, arguments);\n        };\n        var _Relu6 = Module[\"_Relu6\"] = function() {\n          return (_Relu6 = Module[\"_Relu6\"] = Module[\"asm\"][\"ra\"]).apply(null, arguments);\n        };\n        var _ResizeBilinear = Module[\"_ResizeBilinear\"] = function() {\n          return (_ResizeBilinear = Module[\"_ResizeBilinear\"] = Module[\"asm\"][\"sa\"]).apply(null, arguments);\n        };\n        var _Reverse = Module[\"_Reverse\"] = function() {\n          return (_Reverse = Module[\"_Reverse\"] = Module[\"asm\"][\"ta\"]).apply(null, arguments);\n        };\n        var _RotateWithOffset = Module[\"_RotateWithOffset\"] = function() {\n          return (_RotateWithOffset = Module[\"_RotateWithOffset\"] = Module[\"asm\"][\"ua\"]).apply(null, arguments);\n        };\n        var _Round = Module[\"_Round\"] = function() {\n          return (_Round = Module[\"_Round\"] = Module[\"asm\"][\"va\"]).apply(null, arguments);\n        };\n        var _Rsqrt = Module[\"_Rsqrt\"] = function() {\n          return (_Rsqrt = Module[\"_Rsqrt\"] = Module[\"asm\"][\"wa\"]).apply(null, arguments);\n        };\n        var _ScatterNd = Module[\"_ScatterNd\"] = function() {\n          return (_ScatterNd = Module[\"_ScatterNd\"] = Module[\"asm\"][\"xa\"]).apply(null, arguments);\n        };\n        var _SelectV2 = Module[\"_SelectV2\"] = function() {\n          return (_SelectV2 = Module[\"_SelectV2\"] = Module[\"asm\"][\"ya\"]).apply(null, arguments);\n        };\n        var _Sigmoid = Module[\"_Sigmoid\"] = function() {\n          return (_Sigmoid = Module[\"_Sigmoid\"] = Module[\"asm\"][\"za\"]).apply(null, arguments);\n        };\n        var _Sin = Module[\"_Sin\"] = function() {\n          return (_Sin = Module[\"_Sin\"] = Module[\"asm\"][\"Aa\"]).apply(null, arguments);\n        };\n        var _Softmax = Module[\"_Softmax\"] = function() {\n          return (_Softmax = Module[\"_Softmax\"] = Module[\"asm\"][\"Ba\"]).apply(null, arguments);\n        };\n        var _Sqrt = Module[\"_Sqrt\"] = function() {\n          return (_Sqrt = Module[\"_Sqrt\"] = Module[\"asm\"][\"Ca\"]).apply(null, arguments);\n        };\n        var _Square = Module[\"_Square\"] = function() {\n          return (_Square = Module[\"_Square\"] = Module[\"asm\"][\"Da\"]).apply(null, arguments);\n        };\n        var _SquaredDifference = Module[\"_SquaredDifference\"] = function() {\n          return (_SquaredDifference = Module[\"_SquaredDifference\"] = Module[\"asm\"][\"Ea\"]).apply(null, arguments);\n        };\n        var _Step = Module[\"_Step\"] = function() {\n          return (_Step = Module[\"_Step\"] = Module[\"asm\"][\"Fa\"]).apply(null, arguments);\n        };\n        var _StridedSlice = Module[\"_StridedSlice\"] = function() {\n          return (_StridedSlice = Module[\"_StridedSlice\"] = Module[\"asm\"][\"Ga\"]).apply(null, arguments);\n        };\n        var _Sub = Module[\"_Sub\"] = function() {\n          return (_Sub = Module[\"_Sub\"] = Module[\"asm\"][\"Ha\"]).apply(null, arguments);\n        };\n        var _Sum = Module[\"_Sum\"] = function() {\n          return (_Sum = Module[\"_Sum\"] = Module[\"asm\"][\"Ia\"]).apply(null, arguments);\n        };\n        var _Tan = Module[\"_Tan\"] = function() {\n          return (_Tan = Module[\"_Tan\"] = Module[\"asm\"][\"Ja\"]).apply(null, arguments);\n        };\n        var _Tanh = Module[\"_Tanh\"] = function() {\n          return (_Tanh = Module[\"_Tanh\"] = Module[\"asm\"][\"Ka\"]).apply(null, arguments);\n        };\n        var _Tile = Module[\"_Tile\"] = function() {\n          return (_Tile = Module[\"_Tile\"] = Module[\"asm\"][\"La\"]).apply(null, arguments);\n        };\n        var _TopK = Module[\"_TopK\"] = function() {\n          return (_TopK = Module[\"_TopK\"] = Module[\"asm\"][\"Ma\"]).apply(null, arguments);\n        };\n        var _Transform = Module[\"_Transform\"] = function() {\n          return (_Transform = Module[\"_Transform\"] = Module[\"asm\"][\"Na\"]).apply(null, arguments);\n        };\n        var _Transpose = Module[\"_Transpose\"] = function() {\n          return (_Transpose = Module[\"_Transpose\"] = Module[\"asm\"][\"Oa\"]).apply(null, arguments);\n        };\n        var __FusedMatMul = Module[\"__FusedMatMul\"] = function() {\n          return (__FusedMatMul = Module[\"__FusedMatMul\"] = Module[\"asm\"][\"Pa\"]).apply(null, arguments);\n        };\n        var _malloc = Module[\"_malloc\"] = function() {\n          return (_malloc = Module[\"_malloc\"] = Module[\"asm\"][\"Qa\"]).apply(null, arguments);\n        };\n        var _free = Module[\"_free\"] = function() {\n          return (_free = Module[\"_free\"] = Module[\"asm\"][\"Ra\"]).apply(null, arguments);\n        };\n        var stackSave = Module[\"stackSave\"] = function() {\n          return (stackSave = Module[\"stackSave\"] = Module[\"asm\"][\"Ta\"]).apply(null, arguments);\n        };\n        var stackRestore = Module[\"stackRestore\"] = function() {\n          return (stackRestore = Module[\"stackRestore\"] = Module[\"asm\"][\"Ua\"]).apply(null, arguments);\n        };\n        var stackAlloc = Module[\"stackAlloc\"] = function() {\n          return (stackAlloc = Module[\"stackAlloc\"] = Module[\"asm\"][\"Va\"]).apply(null, arguments);\n        };\n        Module[\"cwrap\"] = cwrap;\n        var calledRun;\n        function ExitStatus(status) {\n          this.name = \"ExitStatus\";\n          this.message = \"Program terminated with exit(\" + status + \")\";\n          this.status = status;\n        }\n        dependenciesFulfilled = function runCaller() {\n          if (!calledRun)\n            run();\n          if (!calledRun)\n            dependenciesFulfilled = runCaller;\n        };\n        function run(args) {\n          args = args || arguments_;\n          if (runDependencies > 0) {\n            return;\n          }\n          preRun();\n          if (runDependencies > 0) {\n            return;\n          }\n          function doRun() {\n            if (calledRun)\n              return;\n            calledRun = true;\n            Module[\"calledRun\"] = true;\n            if (ABORT)\n              return;\n            initRuntime();\n            preMain();\n            readyPromiseResolve(Module);\n            if (Module[\"onRuntimeInitialized\"])\n              Module[\"onRuntimeInitialized\"]();\n            postRun();\n          }\n          if (Module[\"setStatus\"]) {\n            Module[\"setStatus\"](\"Running...\");\n            setTimeout(function() {\n              setTimeout(function() {\n                Module[\"setStatus\"](\"\");\n              }, 1);\n              doRun();\n            }, 1);\n          } else {\n            doRun();\n          }\n        }\n        Module[\"run\"] = run;\n        if (Module[\"preInit\"]) {\n          if (typeof Module[\"preInit\"] == \"function\")\n            Module[\"preInit\"] = [Module[\"preInit\"]];\n          while (Module[\"preInit\"].length > 0) {\n            Module[\"preInit\"].pop()();\n          }\n        }\n        run();\n        return WasmBackendModule2.ready;\n      };\n    }();\n    if (typeof exports === \"object\" && typeof module === \"object\")\n      module.exports = WasmBackendModule;\n    else if (typeof define === \"function\" && define[\"amd\"])\n      define([], function() {\n        return WasmBackendModule;\n      });\n    else if (typeof exports === \"object\")\n      exports[\"WasmBackendModule\"] = WasmBackendModule;\n  }\n});\nvar EPSILON_FLOAT32 = 1e-7;\nvar EPSILON_FLOAT16 = 1e-4;\nvar DataStorage = class {\n  constructor(backend2, dataMover) {\n    this.backend = backend2;\n    this.dataMover = dataMover;\n    this.data = new WeakMap();\n    this.dataIdsCount = 0;\n  }\n  get(dataId) {\n    if (!this.data.has(dataId)) {\n      this.dataMover.moveData(this.backend, dataId);\n    }\n    return this.data.get(dataId);\n  }\n  set(dataId, value) {\n    this.dataIdsCount++;\n    this.data.set(dataId, value);\n  }\n  has(dataId) {\n    return this.data.has(dataId);\n  }\n  delete(dataId) {\n    this.dataIdsCount--;\n    return this.data.delete(dataId);\n  }\n  numDataIds() {\n    return this.dataIdsCount;\n  }\n};\nvar KernelBackend = class {\n  refCount(dataId) {\n    return notYetImplemented(\"refCount\");\n  }\n  incRef(dataId) {\n    return notYetImplemented(\"incRef\");\n  }\n  timerAvailable() {\n    return true;\n  }\n  time(f) {\n    return notYetImplemented(\"time\");\n  }\n  read(dataId) {\n    return notYetImplemented(\"read\");\n  }\n  readSync(dataId) {\n    return notYetImplemented(\"readSync\");\n  }\n  numDataIds() {\n    return notYetImplemented(\"numDataIds\");\n  }\n  disposeData(dataId, force) {\n    return notYetImplemented(\"disposeData\");\n  }\n  write(values, shape, dtype) {\n    return notYetImplemented(\"write\");\n  }\n  move(dataId, values, shape, dtype, refCount) {\n    return notYetImplemented(\"move\");\n  }\n  memory() {\n    return notYetImplemented(\"memory\");\n  }\n  floatPrecision() {\n    return notYetImplemented(\"floatPrecision\");\n  }\n  epsilon() {\n    return this.floatPrecision() === 32 ? EPSILON_FLOAT32 : EPSILON_FLOAT16;\n  }\n  dispose() {\n    return notYetImplemented(\"dispose\");\n  }\n};\nfunction notYetImplemented(kernelName) {\n  throw new Error(`'${kernelName}' not yet implemented or not found in the registry. This kernel may not be supported by the tfjs backend you have chosen`);\n}\nfunction shuffle(array2) {\n  let counter = array2.length;\n  let index = 0;\n  while (counter > 0) {\n    index = Math.random() * counter | 0;\n    counter--;\n    swap(array2, counter, index);\n  }\n}\nfunction shuffleCombo(array2, array22) {\n  if (array2.length !== array22.length) {\n    throw new Error(`Array sizes must match to be shuffled together First array length was ${array2.length}Second array length was ${array22.length}`);\n  }\n  let counter = array2.length;\n  let index = 0;\n  while (counter > 0) {\n    index = Math.random() * counter | 0;\n    counter--;\n    swap(array2, counter, index);\n    swap(array22, counter, index);\n  }\n}\nfunction clamp(min7, x, max7) {\n  return Math.max(min7, Math.min(x, max7));\n}\nfunction nearestLargerEven(val) {\n  return val % 2 === 0 ? val : val + 1;\n}\nfunction swap(object, left, right) {\n  const temp = object[left];\n  object[left] = object[right];\n  object[right] = temp;\n}\nfunction sum(arr) {\n  let sum7 = 0;\n  for (let i = 0; i < arr.length; i++) {\n    sum7 += arr[i];\n  }\n  return sum7;\n}\nfunction randUniform(a, b) {\n  const r = Math.random();\n  return b * r + (1 - r) * a;\n}\nfunction distSquared(a, b) {\n  let result = 0;\n  for (let i = 0; i < a.length; i++) {\n    const diff = Number(a[i]) - Number(b[i]);\n    result += diff * diff;\n  }\n  return result;\n}\nfunction assert(expr, msg) {\n  if (!expr) {\n    throw new Error(typeof msg === \"string\" ? msg : msg());\n  }\n}\nfunction assertShapesMatch(shapeA, shapeB, errorMessagePrefix = \"\") {\n  assert(arraysEqual(shapeA, shapeB), () => errorMessagePrefix + ` Shapes ${shapeA} and ${shapeB} must match`);\n}\nfunction assertNonNull(a) {\n  assert(a != null, () => `The input to the tensor constructor must be a non-null value.`);\n}\nfunction flatten(arr, result = [], skipTypedArray = false) {\n  if (result == null) {\n    result = [];\n  }\n  if (Array.isArray(arr) || isTypedArray(arr) && !skipTypedArray) {\n    for (let i = 0; i < arr.length; ++i) {\n      flatten(arr[i], result, skipTypedArray);\n    }\n  } else {\n    result.push(arr);\n  }\n  return result;\n}\nfunction sizeFromShape(shape) {\n  if (shape.length === 0) {\n    return 1;\n  }\n  let size = shape[0];\n  for (let i = 1; i < shape.length; i++) {\n    size *= shape[i];\n  }\n  return size;\n}\nfunction isScalarShape(shape) {\n  return shape.length === 0;\n}\nfunction arraysEqual(n1, n2) {\n  if (n1 === n2) {\n    return true;\n  }\n  if (n1 == null || n2 == null) {\n    return false;\n  }\n  if (n1.length !== n2.length) {\n    return false;\n  }\n  for (let i = 0; i < n1.length; i++) {\n    if (n1[i] !== n2[i]) {\n      return false;\n    }\n  }\n  return true;\n}\nfunction isInt(a) {\n  return a % 1 === 0;\n}\nfunction tanh(x) {\n  if (Math.tanh != null) {\n    return Math.tanh(x);\n  }\n  if (x === Infinity) {\n    return 1;\n  } else if (x === -Infinity) {\n    return -1;\n  } else {\n    const e2x = Math.exp(2 * x);\n    return (e2x - 1) / (e2x + 1);\n  }\n}\nfunction sizeToSquarishShape(size) {\n  const width = Math.ceil(Math.sqrt(size));\n  return [width, Math.ceil(size / width)];\n}\nfunction createShuffledIndices(n) {\n  const shuffledIndices = new Uint32Array(n);\n  for (let i = 0; i < n; ++i) {\n    shuffledIndices[i] = i;\n  }\n  shuffle(shuffledIndices);\n  return shuffledIndices;\n}\nfunction rightPad(a, size) {\n  if (size <= a.length) {\n    return a;\n  }\n  return a + \" \".repeat(size - a.length);\n}\nfunction repeatedTry(checkFn, delayFn = (counter) => 0, maxCounter) {\n  return new Promise((resolve, reject) => {\n    let tryCount = 0;\n    const tryFn = () => {\n      if (checkFn()) {\n        resolve();\n        return;\n      }\n      tryCount++;\n      const nextBackoff = delayFn(tryCount);\n      if (maxCounter != null && tryCount >= maxCounter) {\n        reject();\n        return;\n      }\n      setTimeout(tryFn, nextBackoff);\n    };\n    tryFn();\n  });\n}\nfunction inferFromImplicitShape(shape, size) {\n  let shapeProd = 1;\n  let implicitIdx = -1;\n  for (let i = 0; i < shape.length; ++i) {\n    if (shape[i] >= 0) {\n      shapeProd *= shape[i];\n    } else if (shape[i] === -1) {\n      if (implicitIdx !== -1) {\n        throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${implicitIdx} and dim ${i}`);\n      }\n      implicitIdx = i;\n    } else if (shape[i] < 0) {\n      throw Error(`Shapes can not be < 0. Found ${shape[i]} at dim ${i}`);\n    }\n  }\n  if (implicitIdx === -1) {\n    if (size > 0 && size !== shapeProd) {\n      throw Error(`Size(${size}) must match the product of shape ${shape}`);\n    }\n    return shape;\n  }\n  if (shapeProd === 0) {\n    throw Error(`Cannot infer the missing size in [${shape}] when there are 0 elements`);\n  }\n  if (size % shapeProd !== 0) {\n    throw Error(`The implicit shape can't be a fractional number. Got ${size} / ${shapeProd}`);\n  }\n  const newShape = shape.slice();\n  newShape[implicitIdx] = size / shapeProd;\n  return newShape;\n}\nfunction parseAxisParam(axis, shape) {\n  const rank = shape.length;\n  axis = axis == null ? shape.map((s, i) => i) : [].concat(axis);\n  assert(axis.every((ax) => ax >= -rank && ax < rank), () => `All values in axis param must be in range [-${rank}, ${rank}) but got axis ${axis}`);\n  assert(axis.every((ax) => isInt(ax)), () => `All values in axis param must be integers but got axis ${axis}`);\n  return axis.map((a) => a < 0 ? rank + a : a);\n}\nfunction squeezeShape(shape, axis) {\n  const newShape = [];\n  const keptDims = [];\n  const isEmptyArray = axis != null && Array.isArray(axis) && axis.length === 0;\n  const axes = axis == null || isEmptyArray ? null : parseAxisParam(axis, shape).sort();\n  let j = 0;\n  for (let i = 0; i < shape.length; ++i) {\n    if (axes != null) {\n      if (axes[j] === i && shape[i] !== 1) {\n        throw new Error(`Can't squeeze axis ${i} since its dim '${shape[i]}' is not 1`);\n      }\n      if ((axes[j] == null || axes[j] > i) && shape[i] === 1) {\n        newShape.push(shape[i]);\n        keptDims.push(i);\n      }\n      if (axes[j] <= i) {\n        j++;\n      }\n    }\n    if (shape[i] !== 1) {\n      newShape.push(shape[i]);\n      keptDims.push(i);\n    }\n  }\n  return { newShape, keptDims };\n}\nfunction getTypedArrayFromDType(dtype, size) {\n  let values = null;\n  if (dtype == null || dtype === \"float32\") {\n    values = new Float32Array(size);\n  } else if (dtype === \"int32\") {\n    values = new Int32Array(size);\n  } else if (dtype === \"bool\") {\n    values = new Uint8Array(size);\n  } else {\n    throw new Error(`Unknown data type ${dtype}`);\n  }\n  return values;\n}\nfunction getArrayFromDType(dtype, size) {\n  let values = null;\n  if (dtype == null || dtype === \"float32\") {\n    values = new Float32Array(size);\n  } else if (dtype === \"int32\") {\n    values = new Int32Array(size);\n  } else if (dtype === \"bool\") {\n    values = new Uint8Array(size);\n  } else if (dtype === \"string\") {\n    values = new Array(size);\n  } else {\n    throw new Error(`Unknown data type ${dtype}`);\n  }\n  return values;\n}\nfunction checkConversionForErrors(vals, dtype) {\n  for (let i = 0; i < vals.length; i++) {\n    const num = vals[i];\n    if (isNaN(num) || !isFinite(num)) {\n      throw Error(`A tensor of type ${dtype} being uploaded contains ${num}.`);\n    }\n  }\n}\nfunction isValidDtype(dtype) {\n  return dtype === \"bool\" || dtype === \"complex64\" || dtype === \"float32\" || dtype === \"int32\" || dtype === \"string\";\n}\nfunction hasEncodingLoss(oldType, newType) {\n  if (newType === \"complex64\") {\n    return false;\n  }\n  if (newType === \"float32\" && oldType !== \"complex64\") {\n    return false;\n  }\n  if (newType === \"int32\" && oldType !== \"float32\" && oldType !== \"complex64\") {\n    return false;\n  }\n  if (newType === \"bool\" && oldType === \"bool\") {\n    return false;\n  }\n  return true;\n}\nfunction isTypedArray(a) {\n  return a instanceof Float32Array || a instanceof Int32Array || a instanceof Uint8Array || a instanceof Uint8ClampedArray;\n}\nfunction bytesPerElement(dtype) {\n  if (dtype === \"float32\" || dtype === \"int32\") {\n    return 4;\n  } else if (dtype === \"complex64\") {\n    return 8;\n  } else if (dtype === \"bool\") {\n    return 1;\n  } else {\n    throw new Error(`Unknown dtype ${dtype}`);\n  }\n}\nfunction bytesFromStringArray(arr) {\n  if (arr == null) {\n    return 0;\n  }\n  let bytes = 0;\n  arr.forEach((x) => bytes += x.length);\n  return bytes;\n}\nfunction isString(value) {\n  return typeof value === \"string\" || value instanceof String;\n}\nfunction isBoolean(value) {\n  return typeof value === \"boolean\";\n}\nfunction isNumber(value) {\n  return typeof value === \"number\";\n}\nfunction inferDtype(values) {\n  if (Array.isArray(values)) {\n    return inferDtype(values[0]);\n  }\n  if (values instanceof Float32Array) {\n    return \"float32\";\n  } else if (values instanceof Int32Array || values instanceof Uint8Array || values instanceof Uint8ClampedArray) {\n    return \"int32\";\n  } else if (isNumber(values)) {\n    return \"float32\";\n  } else if (isString(values)) {\n    return \"string\";\n  } else if (isBoolean(values)) {\n    return \"bool\";\n  }\n  return \"float32\";\n}\nfunction isFunction(f) {\n  return !!(f && f.constructor && f.call && f.apply);\n}\nfunction nearestDivisor(size, start) {\n  for (let i = start; i < size; ++i) {\n    if (size % i === 0) {\n      return i;\n    }\n  }\n  return size;\n}\nfunction computeStrides(shape) {\n  const rank = shape.length;\n  if (rank < 2) {\n    return [];\n  }\n  const strides = new Array(rank - 1);\n  strides[rank - 2] = shape[rank - 1];\n  for (let i = rank - 3; i >= 0; --i) {\n    strides[i] = strides[i + 1] * shape[i + 1];\n  }\n  return strides;\n}\nfunction createNestedArray(offset, shape, a, isComplex = false) {\n  const ret = new Array();\n  if (shape.length === 1) {\n    const d = shape[0] * (isComplex ? 2 : 1);\n    for (let i = 0; i < d; i++) {\n      ret[i] = a[offset + i];\n    }\n  } else {\n    const d = shape[0];\n    const rest = shape.slice(1);\n    const len = rest.reduce((acc, c) => acc * c) * (isComplex ? 2 : 1);\n    for (let i = 0; i < d; i++) {\n      ret[i] = createNestedArray(offset + i * len, rest, a, isComplex);\n    }\n  }\n  return ret;\n}\nfunction toNestedArray(shape, a, isComplex = false) {\n  if (shape.length === 0) {\n    return a[0];\n  }\n  const size = shape.reduce((acc, c) => acc * c) * (isComplex ? 2 : 1);\n  if (size === 0) {\n    return [];\n  }\n  if (size !== a.length) {\n    throw new Error(`[${shape}] does not match the input size ${a.length}${isComplex ? \" for a complex tensor\" : \"\"}.`);\n  }\n  return createNestedArray(0, shape, a, isComplex);\n}\nfunction makeOnesTypedArray(size, dtype) {\n  const array2 = makeZerosTypedArray(size, dtype);\n  for (let i = 0; i < array2.length; i++) {\n    array2[i] = 1;\n  }\n  return array2;\n}\nfunction makeZerosTypedArray(size, dtype) {\n  if (dtype == null || dtype === \"float32\" || dtype === \"complex64\") {\n    return new Float32Array(size);\n  } else if (dtype === \"int32\") {\n    return new Int32Array(size);\n  } else if (dtype === \"bool\") {\n    return new Uint8Array(size);\n  } else {\n    throw new Error(`Unknown data type ${dtype}`);\n  }\n}\nfunction makeZerosNestedTypedArray(shape, dtype) {\n  const size = shape.reduce((prev, curr) => prev * curr, 1);\n  if (dtype == null || dtype === \"float32\") {\n    return toNestedArray(shape, new Float32Array(size));\n  } else if (dtype === \"int32\") {\n    return toNestedArray(shape, new Int32Array(size));\n  } else if (dtype === \"bool\") {\n    return toNestedArray(shape, new Uint8Array(size));\n  } else {\n    throw new Error(`Unknown data type ${dtype}`);\n  }\n}\nfunction assertNonNegativeIntegerDimensions(shape) {\n  shape.forEach((dimSize) => {\n    assert(Number.isInteger(dimSize) && dimSize >= 0, () => `Tensor must have a shape comprised of positive integers but got shape [${shape}].`);\n  });\n}\nfunction locToIndex(locs, rank, strides) {\n  if (rank === 0) {\n    return 0;\n  } else if (rank === 1) {\n    return locs[0];\n  }\n  let index = locs[locs.length - 1];\n  for (let i = 0; i < locs.length - 1; ++i) {\n    index += strides[i] * locs[i];\n  }\n  return index;\n}\nfunction indexToLoc(index, rank, strides) {\n  if (rank === 0) {\n    return [];\n  } else if (rank === 1) {\n    return [index];\n  }\n  const locs = new Array(rank);\n  for (let i = 0; i < locs.length - 1; ++i) {\n    locs[i] = Math.floor(index / strides[i]);\n    index -= locs[i] * strides[i];\n  }\n  locs[locs.length - 1] = index;\n  return locs;\n}\nfunction isPromise(object) {\n  return object && object.then && typeof object.then === \"function\";\n}\nfunction warn(...msg) {\n  if (!(env().getBool(\"IS_TEST\") || env().getBool(\"PROD\"))) {\n    console.warn(...msg);\n  }\n}\nfunction log(...msg) {\n  if (!(env().getBool(\"IS_TEST\") || env().getBool(\"PROD\"))) {\n    console.log(...msg);\n  }\n}\nvar TENSORFLOWJS_FLAGS_PREFIX = \"tfjsflags\";\nvar Environment = class {\n  constructor(global2) {\n    this.global = global2;\n    this.flags = {};\n    this.flagRegistry = {};\n    this.urlFlags = {};\n    this.getQueryParams = getQueryParams;\n    this.populateURLFlags();\n  }\n  setPlatform(platformName, platform) {\n    if (this.platform != null) {\n      warn(`Platform ${this.platformName} has already been set. Overwriting the platform with ${platform}.`);\n    }\n    this.platformName = platformName;\n    this.platform = platform;\n  }\n  registerFlag(flagName, evaluationFn, setHook) {\n    this.flagRegistry[flagName] = { evaluationFn, setHook };\n    if (this.urlFlags[flagName] != null) {\n      const flagValue = this.urlFlags[flagName];\n      warn(`Setting feature override from URL ${flagName}: ${flagValue}.`);\n      this.set(flagName, flagValue);\n    }\n  }\n  async getAsync(flagName) {\n    if (flagName in this.flags) {\n      return this.flags[flagName];\n    }\n    this.flags[flagName] = await this.evaluateFlag(flagName);\n    return this.flags[flagName];\n  }\n  get(flagName) {\n    if (flagName in this.flags) {\n      return this.flags[flagName];\n    }\n    const flagValue = this.evaluateFlag(flagName);\n    if (isPromise(flagValue)) {\n      throw new Error(`Flag ${flagName} cannot be synchronously evaluated. Please use getAsync() instead.`);\n    }\n    this.flags[flagName] = flagValue;\n    return this.flags[flagName];\n  }\n  getNumber(flagName) {\n    return this.get(flagName);\n  }\n  getBool(flagName) {\n    return this.get(flagName);\n  }\n  getFlags() {\n    return this.flags;\n  }\n  get features() {\n    return this.flags;\n  }\n  set(flagName, value) {\n    if (this.flagRegistry[flagName] == null) {\n      throw new Error(`Cannot set flag ${flagName} as it has not been registered.`);\n    }\n    this.flags[flagName] = value;\n    if (this.flagRegistry[flagName].setHook != null) {\n      this.flagRegistry[flagName].setHook(value);\n    }\n  }\n  evaluateFlag(flagName) {\n    if (this.flagRegistry[flagName] == null) {\n      throw new Error(`Cannot evaluate flag '${flagName}': no evaluation function found.`);\n    }\n    return this.flagRegistry[flagName].evaluationFn();\n  }\n  setFlags(flags) {\n    this.flags = Object.assign({}, flags);\n  }\n  reset() {\n    this.flags = {};\n    this.urlFlags = {};\n    this.populateURLFlags();\n  }\n  populateURLFlags() {\n    if (typeof this.global === \"undefined\" || typeof this.global.location === \"undefined\" || typeof this.global.location.search === \"undefined\") {\n      return;\n    }\n    const urlParams = this.getQueryParams(this.global.location.search);\n    if (TENSORFLOWJS_FLAGS_PREFIX in urlParams) {\n      const keyValues = urlParams[TENSORFLOWJS_FLAGS_PREFIX].split(\",\");\n      keyValues.forEach((keyValue) => {\n        const [key, value] = keyValue.split(\":\");\n        this.urlFlags[key] = parseValue(key, value);\n      });\n    }\n  }\n};\nfunction getQueryParams(queryString) {\n  const params = {};\n  queryString.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g, (s, ...t) => {\n    decodeParam(params, t[0], t[1]);\n    return t.join(\"=\");\n  });\n  return params;\n}\nfunction decodeParam(params, name, value) {\n  params[decodeURIComponent(name)] = decodeURIComponent(value || \"\");\n}\nfunction parseValue(flagName, value) {\n  value = value.toLowerCase();\n  if (value === \"true\" || value === \"false\") {\n    return value === \"true\";\n  } else if (`${+value}` === value) {\n    return +value;\n  }\n  throw new Error(`Could not parse value flag value ${value} for flag ${flagName}.`);\n}\nfunction env() {\n  return ENV;\n}\nvar ENV = null;\nfunction setEnvironmentGlobal(environment) {\n  ENV = environment;\n}\nvar globalNameSpace;\nfunction getGlobalNamespace() {\n  if (globalNameSpace == null) {\n    let ns;\n    if (typeof window !== \"undefined\") {\n      ns = window;\n    } else if (typeof global !== \"undefined\") {\n      ns = global;\n    } else if (typeof process !== \"undefined\") {\n      ns = process;\n    } else if (typeof self !== \"undefined\") {\n      ns = self;\n    } else {\n      throw new Error(\"Could not find a global object\");\n    }\n    globalNameSpace = ns;\n  }\n  return globalNameSpace;\n}\nfunction getGlobalMap() {\n  const ns = getGlobalNamespace();\n  if (ns._tfGlobals == null) {\n    ns._tfGlobals = new Map();\n  }\n  return ns._tfGlobals;\n}\nfunction getGlobal(key, init2) {\n  const globalMap = getGlobalMap();\n  if (globalMap.has(key)) {\n    return globalMap.get(key);\n  } else {\n    const singleton = init2();\n    globalMap.set(key, singleton);\n    return globalMap.get(key);\n  }\n}\nvar Abs = \"Abs\";\nvar Acos = \"Acos\";\nvar Acosh = \"Acosh\";\nvar Add = \"Add\";\nvar AddN = \"AddN\";\nvar All = \"All\";\nvar Any = \"Any\";\nvar ArgMax = \"ArgMax\";\nvar ArgMin = \"ArgMin\";\nvar Asin = \"Asin\";\nvar Asinh = \"Asinh\";\nvar Atan = \"Atan\";\nvar Atanh = \"Atanh\";\nvar Atan2 = \"Atan2\";\nvar AvgPool = \"AvgPool\";\nvar AvgPoolGrad = \"AvgPoolGrad\";\nvar AvgPool3D = \"AvgPool3D\";\nvar AvgPool3DGrad = \"AvgPool3DGrad\";\nvar BatchMatMul = \"BatchMatMul\";\nvar BatchToSpaceND = \"BatchToSpaceND\";\nvar Bincount = \"Bincount\";\nvar BroadcastTo = \"BroadcastTo\";\nvar BroadcastArgs = \"BroadcastArgs\";\nvar Cast = \"Cast\";\nvar Ceil = \"Ceil\";\nvar ClipByValue = \"ClipByValue\";\nvar Complex = \"Complex\";\nvar ComplexAbs = \"ComplexAbs\";\nvar Concat = \"Concat\";\nvar Conv2D = \"Conv2D\";\nvar Conv2DBackpropFilter = \"Conv2DBackpropFilter\";\nvar Conv2DBackpropInput = \"Conv2DBackpropInput\";\nvar Conv3D = \"Conv3D\";\nvar Conv3DBackpropFilterV2 = \"Conv3DBackpropFilterV2\";\nvar Conv3DBackpropInputV2 = \"Conv3DBackpropInputV2\";\nvar Cos = \"Cos\";\nvar Cosh = \"Cosh\";\nvar Cumsum = \"Cumsum\";\nvar CropAndResize = \"CropAndResize\";\nvar DenseBincount = \"DenseBincount\";\nvar DepthToSpace = \"DepthToSpace\";\nvar DepthwiseConv2dNative = \"DepthwiseConv2dNative\";\nvar DepthwiseConv2dNativeBackpropFilter = \"DepthwiseConv2dNativeBackpropFilter\";\nvar DepthwiseConv2dNativeBackpropInput = \"DepthwiseConv2dNativeBackpropInput\";\nvar Diag = \"Diag\";\nvar Dilation2D = \"Dilation2D\";\nvar Dilation2DBackpropInput = \"Dilation2DBackpropInput\";\nvar Dilation2DBackpropFilter = \"Dilation2DBackpropFilter\";\nvar RealDiv = \"RealDiv\";\nvar Einsum = \"Einsum\";\nvar Elu = \"Elu\";\nvar EluGrad = \"EluGrad\";\nvar Erf = \"Erf\";\nvar Equal = \"Equal\";\nvar Exp = \"Exp\";\nvar ExpandDims = \"ExpandDims\";\nvar Expm1 = \"Expm1\";\nvar FFT = \"FFT\";\nvar Fill = \"Fill\";\nvar FlipLeftRight = \"FlipLeftRight\";\nvar Floor = \"Floor\";\nvar FloorDiv = \"FloorDiv\";\nvar FusedBatchNorm = \"FusedBatchNorm\";\nvar GatherV2 = \"GatherV2\";\nvar GatherNd = \"GatherNd\";\nvar Greater = \"Greater\";\nvar GreaterEqual = \"GreaterEqual\";\nvar Identity = \"Identity\";\nvar IFFT = \"IFFT\";\nvar Imag = \"Imag\";\nvar IsFinite = \"IsFinite\";\nvar IsInf = \"IsInf\";\nvar IsNan = \"IsNan\";\nvar LeakyRelu = \"LeakyRelu\";\nvar Less = \"Less\";\nvar LessEqual = \"LessEqual\";\nvar LinSpace = \"LinSpace\";\nvar Log = \"Log\";\nvar Log1p = \"Log1p\";\nvar LogicalAnd = \"LogicalAnd\";\nvar LogicalNot = \"LogicalNot\";\nvar LogicalOr = \"LogicalOr\";\nvar LogSoftmax = \"LogSoftmax\";\nvar LRN = \"LRN\";\nvar LRNGrad = \"LRNGrad\";\nvar Max = \"Max\";\nvar Maximum = \"Maximum\";\nvar MaxPool = \"MaxPool\";\nvar MaxPoolGrad = \"MaxPoolGrad\";\nvar MaxPool3D = \"MaxPool3D\";\nvar MaxPool3DGrad = \"MaxPool3DGrad\";\nvar MaxPoolWithArgmax = \"MaxPoolWithArgmax\";\nvar Mean = \"Mean\";\nvar Min = \"Min\";\nvar Minimum = \"Minimum\";\nvar MirrorPad = \"MirrorPad\";\nvar Mod = \"Mod\";\nvar Multinomial = \"Multinomial\";\nvar Multiply = \"Multiply\";\nvar Neg = \"Neg\";\nvar NotEqual = \"NotEqual\";\nvar NonMaxSuppressionV3 = \"NonMaxSuppressionV3\";\nvar NonMaxSuppressionV4 = \"NonMaxSuppressionV4\";\nvar NonMaxSuppressionV5 = \"NonMaxSuppressionV5\";\nvar OnesLike = \"OnesLike\";\nvar OneHot = \"OneHot\";\nvar Pack = \"Pack\";\nvar PadV2 = \"PadV2\";\nvar Pool = \"Pool\";\nvar Pow = \"Pow\";\nvar Prelu = \"Prelu\";\nvar Prod = \"Prod\";\nvar Range = \"Range\";\nvar Real = \"Real\";\nvar Reciprocal = \"Reciprocal\";\nvar Relu = \"Relu\";\nvar Reshape = \"Reshape\";\nvar ResizeNearestNeighbor = \"ResizeNearestNeighbor\";\nvar ResizeNearestNeighborGrad = \"ResizeNearestNeighborGrad\";\nvar ResizeBilinear = \"ResizeBilinear\";\nvar ResizeBilinearGrad = \"ResizeBilinearGrad\";\nvar Relu6 = \"Relu6\";\nvar Reverse = \"Reverse\";\nvar Round = \"Round\";\nvar Rsqrt = \"Rsqrt\";\nvar ScatterNd = \"ScatterNd\";\nvar Select = \"Select\";\nvar Selu = \"Selu\";\nvar Slice = \"Slice\";\nvar Sin = \"Sin\";\nvar Sinh = \"Sinh\";\nvar Sign = \"Sign\";\nvar Sigmoid = \"Sigmoid\";\nvar Softplus = \"Softplus\";\nvar Sqrt = \"Sqrt\";\nvar Sum = \"Sum\";\nvar SpaceToBatchND = \"SpaceToBatchND\";\nvar SplitV = \"SplitV\";\nvar Softmax = \"Softmax\";\nvar SparseFillEmptyRows = \"SparseFillEmptyRows\";\nvar SparseReshape = \"SparseReshape\";\nvar SparseSegmentMean = \"SparseSegmentMean\";\nvar SparseSegmentSum = \"SparseSegmentSum\";\nvar SparseToDense = \"SparseToDense\";\nvar SquaredDifference = \"SquaredDifference\";\nvar Square = \"Square\";\nvar StridedSlice = \"StridedSlice\";\nvar StringNGrams = \"StringNGrams\";\nvar StringSplit = \"StringSplit\";\nvar StringToHashBucketFast = \"StringToHashBucketFast\";\nvar Sub = \"Sub\";\nvar Tan = \"Tan\";\nvar Tanh = \"Tanh\";\nvar Tile = \"Tile\";\nvar TopK = \"TopK\";\nvar Transform = \"Transform\";\nvar Transpose = \"Transpose\";\nvar Unique = \"Unique\";\nvar Unpack = \"Unpack\";\nvar UnsortedSegmentSum = \"UnsortedSegmentSum\";\nvar ZerosLike = \"ZerosLike\";\nvar Step = \"Step\";\nvar FromPixels = \"FromPixels\";\nvar RotateWithOffset = \"RotateWithOffset\";\nvar _FusedMatMul = \"_FusedMatMul\";\nvar FusedConv2D = \"FusedConv2D\";\nvar FusedDepthwiseConv2D = \"FusedDepthwiseConv2D\";\nvar kernelRegistry = getGlobal(\"kernelRegistry\", () => new Map());\nvar gradRegistry = getGlobal(\"gradRegistry\", () => new Map());\nfunction getKernel(kernelName, backendName) {\n  const key = makeKey(kernelName, backendName);\n  return kernelRegistry.get(key);\n}\nfunction getGradient(kernelName) {\n  return gradRegistry.get(kernelName);\n}\nfunction getKernelsForBackend(backendName) {\n  const it = kernelRegistry.entries();\n  const result = [];\n  while (true) {\n    const { done, value } = it.next();\n    if (done) {\n      break;\n    }\n    const [key, config] = value;\n    const [backend2] = key.split(\"_\");\n    if (backend2 === backendName) {\n      result.push(config);\n    }\n  }\n  return result;\n}\nfunction registerKernel(config) {\n  const { kernelName, backendName } = config;\n  const key = makeKey(kernelName, backendName);\n  if (kernelRegistry.has(key)) {\n    warn(`The kernel '${kernelName}' for backend '${backendName}' is already registered`);\n  }\n  kernelRegistry.set(key, config);\n}\nfunction registerGradient(config) {\n  const { kernelName } = config;\n  if (gradRegistry.has(kernelName)) {\n    if (env().getBool(\"DEBUG\")) {\n      warn(`Overriding the gradient for '${kernelName}'`);\n    }\n  }\n  gradRegistry.set(kernelName, config);\n}\nfunction unregisterKernel(kernelName, backendName) {\n  const key = makeKey(kernelName, backendName);\n  if (!kernelRegistry.has(key)) {\n    throw new Error(`The kernel '${kernelName}' for backend '${backendName}' is not registered`);\n  }\n  kernelRegistry.delete(key);\n}\nfunction unregisterGradient(kernelName) {\n  if (!gradRegistry.has(kernelName)) {\n    throw new Error(`The gradient '${kernelName}' for backend is not registered`);\n  }\n  gradRegistry.delete(kernelName);\n}\nfunction copyRegisteredKernels(registeredBackendName, newBackendName) {\n  const kernels = getKernelsForBackend(registeredBackendName);\n  kernels.forEach((kernelConfig) => {\n    const newKernelConfig = Object.assign({}, kernelConfig, { backendName: newBackendName });\n    registerKernel(newKernelConfig);\n  });\n}\nfunction makeKey(kernelName, backendName) {\n  return `${backendName}_${kernelName}`;\n}\nvar util_exports = {};\n__export(util_exports, {\n  arraysEqual: () => arraysEqual,\n  assert: () => assert,\n  assertNonNegativeIntegerDimensions: () => assertNonNegativeIntegerDimensions,\n  assertNonNull: () => assertNonNull,\n  assertShapesMatch: () => assertShapesMatch,\n  bytesFromStringArray: () => bytesFromStringArray,\n  bytesPerElement: () => bytesPerElement,\n  checkConversionForErrors: () => checkConversionForErrors,\n  clamp: () => clamp,\n  computeStrides: () => computeStrides,\n  createScalarValue: () => createScalarValue,\n  createShuffledIndices: () => createShuffledIndices,\n  decodeString: () => decodeString,\n  distSquared: () => distSquared,\n  encodeString: () => encodeString,\n  fetch: () => fetch3,\n  fingerPrint64: () => fingerPrint64,\n  flatten: () => flatten,\n  getArrayFromDType: () => getArrayFromDType,\n  getTypedArrayFromDType: () => getTypedArrayFromDType,\n  hasEncodingLoss: () => hasEncodingLoss,\n  hexToLong: () => hexToLong,\n  indexToLoc: () => indexToLoc,\n  inferDtype: () => inferDtype,\n  inferFromImplicitShape: () => inferFromImplicitShape,\n  isBoolean: () => isBoolean,\n  isFunction: () => isFunction,\n  isInt: () => isInt,\n  isNumber: () => isNumber,\n  isPromise: () => isPromise,\n  isScalarShape: () => isScalarShape,\n  isString: () => isString,\n  isTypedArray: () => isTypedArray,\n  isValidDtype: () => isValidDtype,\n  locToIndex: () => locToIndex,\n  makeOnesTypedArray: () => makeOnesTypedArray,\n  makeZerosNestedTypedArray: () => makeZerosNestedTypedArray,\n  makeZerosTypedArray: () => makeZerosTypedArray,\n  nearestDivisor: () => nearestDivisor,\n  nearestLargerEven: () => nearestLargerEven,\n  now: () => now,\n  parseAxisParam: () => parseAxisParam,\n  randUniform: () => randUniform,\n  repeatedTry: () => repeatedTry,\n  rightPad: () => rightPad,\n  shuffle: () => shuffle,\n  shuffleCombo: () => shuffleCombo,\n  sizeFromShape: () => sizeFromShape,\n  sizeToSquarishShape: () => sizeToSquarishShape,\n  squeezeShape: () => squeezeShape,\n  sum: () => sum,\n  swap: () => swap,\n  tanh: () => tanh,\n  toNestedArray: () => toNestedArray,\n  toTypedArray: () => toTypedArray\n});\nvar LongExports = __toModule(require_long());\nvar Long = LongExports.default || LongExports;\nfunction hexToLong(hex) {\n  return Long.fromString(hex, true, 16);\n}\nvar k0 = hexToLong(\"c3a5c85c97cb3127\");\nvar k1 = hexToLong(\"b492b66fbe98f273\");\nvar k2 = hexToLong(\"9ae16a3b2f90404f\");\nfunction shiftMix(val) {\n  return val.xor(val.shru(47));\n}\nfunction fetch2(s, offset, numBytes) {\n  const bytes = s.slice(offset, offset + numBytes);\n  return Long.fromBytes(Array.from(bytes), true, true);\n}\nfunction fetch64(s, offset) {\n  return fetch2(s, offset, 8);\n}\nfunction fetch32(s, offset) {\n  return fetch2(s, offset, 4);\n}\nfunction rotate64(val, shift) {\n  return shift === 0 ? val : val.shru(shift).or(val.shl(64 - shift));\n}\nfunction hashLen16(u, v, mul2 = hexToLong(\"9ddfea08eb382d69\")) {\n  let a = u.xor(v).mul(mul2);\n  a = a.xor(a.shru(47));\n  let b = v.xor(a).mul(mul2);\n  b = b.xor(b.shru(47));\n  b = b.mul(mul2);\n  return b;\n}\nfunction weakHashLen32WithSeeds(w, x, y, z, a, b) {\n  a = a.add(w);\n  b = rotate64(b.add(a).add(z), 21);\n  const c = a;\n  a = a.add(x);\n  a = a.add(y);\n  b = b.add(rotate64(a, 44));\n  return [a.add(z), b.add(c)];\n}\nfunction weakHashLen32WithSeedsStr(s, offset, a, b) {\n  return weakHashLen32WithSeeds(fetch64(s, offset), fetch64(s, offset + 8), fetch64(s, offset + 16), fetch64(s, offset + 24), a, b);\n}\nfunction hashLen0to16(s, len = s.length) {\n  if (len >= 8) {\n    const mul2 = k2.add(len * 2);\n    const a = fetch64(s, 0).add(k2);\n    const b = fetch64(s, len - 8);\n    const c = rotate64(b, 37).mul(mul2).add(a);\n    const d = rotate64(a, 25).add(b).mul(mul2);\n    return hashLen16(c, d, mul2);\n  }\n  if (len >= 4) {\n    const mul2 = k2.add(len * 2);\n    const a = fetch32(s, 0);\n    return hashLen16(a.shl(3).add(len), fetch32(s, len - 4), mul2);\n  }\n  if (len > 0) {\n    const a = s[0];\n    const b = s[len >> 1];\n    const c = s[len - 1];\n    const y = a + (b << 8);\n    const z = len + (c << 2);\n    return shiftMix(k2.mul(y).xor(k0.mul(z))).mul(k2);\n  }\n  return k2;\n}\nfunction hashLen17to32(s, len = s.length) {\n  const mul2 = k2.add(len * 2);\n  const a = fetch64(s, 0).mul(k1);\n  const b = fetch64(s, 8);\n  const c = fetch64(s, len - 8).mul(mul2);\n  const d = fetch64(s, len - 16).mul(k2);\n  return hashLen16(rotate64(a.add(b), 43).add(rotate64(c, 30)).add(d), a.add(rotate64(b.add(k2), 18)).add(c), mul2);\n}\nfunction hashLen33to64(s, len = s.length) {\n  const mul2 = k2.add(len * 2);\n  const a = fetch64(s, 0).mul(k2);\n  const b = fetch64(s, 8);\n  const c = fetch64(s, len - 8).mul(mul2);\n  const d = fetch64(s, len - 16).mul(k2);\n  const y = rotate64(a.add(b), 43).add(rotate64(c, 30)).add(d);\n  const z = hashLen16(y, a.add(rotate64(b.add(k2), 18)).add(c), mul2);\n  const e = fetch64(s, 16).mul(mul2);\n  const f = fetch64(s, 24);\n  const g = y.add(fetch64(s, len - 32)).mul(mul2);\n  const h = z.add(fetch64(s, len - 24)).mul(mul2);\n  return hashLen16(rotate64(e.add(f), 43).add(rotate64(g, 30)).add(h), e.add(rotate64(f.add(a), 18)).add(g), mul2);\n}\nfunction fingerPrint64(s, len = s.length) {\n  const seed = Long.fromNumber(81, true);\n  if (len <= 32) {\n    if (len <= 16) {\n      return hashLen0to16(s, len);\n    } else {\n      return hashLen17to32(s, len);\n    }\n  } else if (len <= 64) {\n    return hashLen33to64(s, len);\n  }\n  let x = seed;\n  let y = seed.mul(k1).add(113);\n  let z = shiftMix(y.mul(k2).add(113)).mul(k2);\n  let v = [Long.UZERO, Long.UZERO];\n  let w = [Long.UZERO, Long.UZERO];\n  x = x.mul(k2).add(fetch64(s, 0));\n  let offset = 0;\n  const end = (len - 1 >> 6) * 64;\n  const last64 = end + (len - 1 & 63) - 63;\n  do {\n    x = rotate64(x.add(y).add(v[0]).add(fetch64(s, offset + 8)), 37).mul(k1);\n    y = rotate64(y.add(v[1]).add(fetch64(s, offset + 48)), 42).mul(k1);\n    x = x.xor(w[1]);\n    y = y.add(v[0]).add(fetch64(s, offset + 40));\n    z = rotate64(z.add(w[0]), 33).mul(k1);\n    v = weakHashLen32WithSeedsStr(s, offset, v[1].mul(k1), x.add(w[0]));\n    w = weakHashLen32WithSeedsStr(s, offset + 32, z.add(w[1]), y.add(fetch64(s, offset + 16)));\n    [z, x] = [x, z];\n    offset += 64;\n  } while (offset !== end);\n  const mul2 = k1.add(z.and(255).shl(1));\n  offset = last64;\n  w[0] = w[0].add(len - 1 & 63);\n  v[0] = v[0].add(w[0]);\n  w[0] = w[0].add(v[0]);\n  x = rotate64(x.add(y).add(v[0]).add(fetch64(s, offset + 8)), 37).mul(mul2);\n  y = rotate64(y.add(v[1]).add(fetch64(s, offset + 48)), 42).mul(mul2);\n  x = x.xor(w[1].mul(9));\n  y = y.add(v[0].mul(9).add(fetch64(s, offset + 40)));\n  z = rotate64(z.add(w[0]), 33).mul(mul2);\n  v = weakHashLen32WithSeedsStr(s, offset, v[1].mul(mul2), x.add(w[0]));\n  w = weakHashLen32WithSeedsStr(s, offset + 32, z.add(w[1]), y.add(fetch64(s, offset + 16)));\n  [z, x] = [x, z];\n  return hashLen16(hashLen16(v[0], w[0], mul2).add(shiftMix(y).mul(k0)).add(z), hashLen16(v[1], w[1], mul2).add(x), mul2);\n}\nfunction createScalarValue(value, dtype) {\n  if (dtype === \"string\") {\n    return encodeString(value);\n  }\n  return toTypedArray([value], dtype);\n}\nfunction noConversionNeeded(a, dtype) {\n  return a instanceof Float32Array && dtype === \"float32\" || a instanceof Int32Array && dtype === \"int32\" || a instanceof Uint8Array && dtype === \"bool\";\n}\nfunction toTypedArray(a, dtype) {\n  if (dtype === \"string\") {\n    throw new Error(\"Cannot convert a string[] to a TypedArray\");\n  }\n  if (Array.isArray(a)) {\n    a = flatten(a);\n  }\n  if (env().getBool(\"DEBUG\")) {\n    checkConversionForErrors(a, dtype);\n  }\n  if (noConversionNeeded(a, dtype)) {\n    return a;\n  }\n  if (dtype == null || dtype === \"float32\" || dtype === \"complex64\") {\n    return new Float32Array(a);\n  } else if (dtype === \"int32\") {\n    return new Int32Array(a);\n  } else if (dtype === \"bool\") {\n    const bool = new Uint8Array(a.length);\n    for (let i = 0; i < bool.length; ++i) {\n      if (Math.round(a[i]) !== 0) {\n        bool[i] = 1;\n      }\n    }\n    return bool;\n  } else {\n    throw new Error(`Unknown data type ${dtype}`);\n  }\n}\nfunction now() {\n  return env().platform.now();\n}\nfunction fetch3(path, requestInits) {\n  return env().platform.fetch(path, requestInits);\n}\nfunction encodeString(s, encoding = \"utf-8\") {\n  encoding = encoding || \"utf-8\";\n  return env().platform.encode(s, encoding);\n}\nfunction decodeString(bytes, encoding = \"utf-8\") {\n  encoding = encoding || \"utf-8\";\n  return env().platform.decode(bytes, encoding);\n}\nvar Profiler = class {\n  constructor(backendTimer, logger) {\n    this.backendTimer = backendTimer;\n    this.logger = logger;\n    if (logger == null) {\n      this.logger = new Logger();\n    }\n  }\n  profileKernel(kernelName, inputs, f) {\n    let outputs;\n    const holdResultWrapperFn = () => {\n      outputs = f();\n    };\n    let timer;\n    const start = now();\n    if (this.backendTimer.timerAvailable()) {\n      timer = this.backendTimer.time(holdResultWrapperFn);\n    } else {\n      holdResultWrapperFn();\n      for (const output of outputs) {\n        output.dataSync();\n      }\n      timer = Promise.resolve({ kernelMs: now() - start });\n    }\n    if (env().getBool(\"CHECK_COMPUTATION_FOR_ERRORS\")) {\n      for (let i = 0; i < outputs.length; i++) {\n        const output = outputs[i];\n        output.data().then((tensorVals) => {\n          checkComputationForErrors(tensorVals, output.dtype, kernelName);\n        });\n      }\n    }\n    const kernelProfile = {\n      kernelName,\n      outputs,\n      inputs,\n      timeMs: timer.then((timing) => timing.kernelMs),\n      extraInfo: timer.then((timing) => timing.getExtraProfileInfo != null ? timing.getExtraProfileInfo() : \"\")\n    };\n    return kernelProfile;\n  }\n  logKernelProfile(kernelProfile) {\n    const { kernelName, outputs, timeMs, inputs, extraInfo } = kernelProfile;\n    outputs.forEach((result) => {\n      Promise.all([result.data(), timeMs, extraInfo]).then((valueContainer) => {\n        this.logger.logKernelProfile(kernelName, result, valueContainer[0], valueContainer[1], inputs, valueContainer[2]);\n      });\n    });\n  }\n};\nfunction checkComputationForErrors(vals, dtype, kernelName) {\n  if (dtype !== \"float32\") {\n    return false;\n  }\n  for (let i = 0; i < vals.length; i++) {\n    const num = vals[i];\n    if (isNaN(num) || !isFinite(num)) {\n      console.warn(`Found ${num} in the result of '${kernelName}'`);\n      return true;\n    }\n  }\n  return false;\n}\nvar Logger = class {\n  logKernelProfile(name, result, vals, timeMs, inputs, extraInfo) {\n    const time2 = typeof timeMs === \"number\" ? rightPad(`${timeMs}ms`, 9) : timeMs[\"error\"];\n    const paddedName = rightPad(name, 25);\n    const rank = result.rank;\n    const size = result.size;\n    const shape = rightPad(result.shape.toString(), 14);\n    let inputShapesDescription = \"\";\n    for (const name2 in inputs) {\n      const input2 = inputs[name2];\n      if (input2 != null) {\n        const inputShape = input2.shape || result.shape;\n        const inputRank = inputShape.length;\n        inputShapesDescription += `${name2}: ${inputRank}D ${inputRank > 0 ? inputShape : \"\"} `;\n      }\n    }\n    console.log(`%c${paddedName}\t%c${time2}\t%c${rank}D ${shape}\t%c${size}\t%c${inputShapesDescription}\t%c${extraInfo}`, \"font-weight:bold\", \"color:red\", \"color:blue\", \"color: orange\", \"color: green\", \"color: steelblue\");\n  }\n};\nfunction getFilteredNodesXToY(tape, xs, y) {\n  const tensorsFromX = {};\n  const nodesFromX = {};\n  for (let i = 0; i < xs.length; i++) {\n    tensorsFromX[xs[i].id] = true;\n  }\n  for (let i = 0; i < tape.length; i++) {\n    const node = tape[i];\n    const nodeInputs = node.inputs;\n    for (const inputName in nodeInputs) {\n      const input2 = nodeInputs[inputName];\n      let anyInputFromX = false;\n      for (let j = 0; j < xs.length; j++) {\n        if (tensorsFromX[input2.id]) {\n          node.outputs.forEach((output) => tensorsFromX[output.id] = true);\n          anyInputFromX = true;\n          nodesFromX[node.id] = true;\n          break;\n        }\n      }\n      if (anyInputFromX) {\n        break;\n      }\n    }\n  }\n  const tensorsLeadToY = {};\n  tensorsLeadToY[y.id] = true;\n  const nodesToY = {};\n  for (let i = tape.length - 1; i >= 0; i--) {\n    const node = tape[i];\n    const nodeInputs = node.inputs;\n    for (let j = 0; j < node.outputs.length; j++) {\n      if (tensorsLeadToY[node.outputs[j].id]) {\n        for (const inputName in nodeInputs) {\n          tensorsLeadToY[nodeInputs[inputName].id] = true;\n          nodesToY[node.id] = true;\n        }\n        break;\n      }\n    }\n  }\n  const filteredTape = [];\n  for (let i = 0; i < tape.length; i++) {\n    const node = tape[i];\n    if (nodesFromX[node.id] && nodesToY[node.id]) {\n      const prunedInputs = {};\n      for (const inputName in node.inputs) {\n        const nodeInput = node.inputs[inputName];\n        if (tensorsFromX[nodeInput.id]) {\n          prunedInputs[inputName] = nodeInput;\n        }\n      }\n      const prunedNode = Object.assign({}, node);\n      prunedNode.inputs = prunedInputs;\n      prunedNode.outputs = node.outputs;\n      filteredTape.push(prunedNode);\n    }\n  }\n  return filteredTape;\n}\nfunction backpropagateGradients(tensorAccumulatedGradientMap, filteredTape, tidy2, add5) {\n  for (let i = filteredTape.length - 1; i >= 0; i--) {\n    const node = filteredTape[i];\n    const dys = [];\n    node.outputs.forEach((o) => {\n      const gradTensor = tensorAccumulatedGradientMap[o.id];\n      if (gradTensor != null) {\n        dys.push(gradTensor);\n      } else {\n        dys.push(null);\n      }\n    });\n    if (node.gradient == null) {\n      throw new Error(`Cannot compute gradient: gradient function not found for ${node.kernelName}.`);\n    }\n    const inputGradients = node.gradient(dys);\n    for (const inputName in node.inputs) {\n      if (!(inputName in inputGradients)) {\n        throw new Error(`Cannot backprop through input ${inputName}. Available gradients found: ${Object.keys(inputGradients)}.`);\n      }\n      const dx = tidy2(() => inputGradients[inputName]());\n      if (dx.dtype !== \"float32\") {\n        throw new Error(`Error in gradient for op ${node.kernelName}. The gradient of input ${inputName} must have 'float32' dtype, but has '${dx.dtype}'`);\n      }\n      const x = node.inputs[inputName];\n      if (!arraysEqual(dx.shape, x.shape)) {\n        throw new Error(`Error in gradient for op ${node.kernelName}. The gradient of input '${inputName}' has shape '${dx.shape}', which does not match the shape of the input '${x.shape}'`);\n      }\n      if (tensorAccumulatedGradientMap[x.id] == null) {\n        tensorAccumulatedGradientMap[x.id] = dx;\n      } else {\n        const curGradient = tensorAccumulatedGradientMap[x.id];\n        tensorAccumulatedGradientMap[x.id] = add5(curGradient, dx);\n        curGradient.dispose();\n      }\n    }\n  }\n}\nvar FORMAT_LIMIT_NUM_VALS = 20;\nvar FORMAT_NUM_FIRST_LAST_VALS = 3;\nvar FORMAT_NUM_SIG_DIGITS = 7;\nfunction tensorToString(vals, shape, dtype, verbose) {\n  const strides = computeStrides(shape);\n  const padPerCol = computeMaxSizePerColumn(vals, shape, dtype, strides);\n  const rank = shape.length;\n  const valsLines = subTensorToString(vals, shape, dtype, strides, padPerCol);\n  const lines = [\"Tensor\"];\n  if (verbose) {\n    lines.push(`  dtype: ${dtype}`);\n    lines.push(`  rank: ${rank}`);\n    lines.push(`  shape: [${shape}]`);\n    lines.push(`  values:`);\n  }\n  lines.push(valsLines.map((l) => \"    \" + l).join(\"\\n\"));\n  return lines.join(\"\\n\");\n}\nfunction computeMaxSizePerColumn(vals, shape, dtype, strides) {\n  const n = sizeFromShape(shape);\n  const numCols = strides[strides.length - 1];\n  const padPerCol = new Array(numCols).fill(0);\n  const rank = shape.length;\n  const valuesOrTuples = dtype === \"complex64\" ? createComplexTuples(vals) : vals;\n  if (rank > 1) {\n    for (let row = 0; row < n / numCols; row++) {\n      const offset = row * numCols;\n      for (let j = 0; j < numCols; j++) {\n        padPerCol[j] = Math.max(padPerCol[j], valToString(valuesOrTuples[offset + j], 0, dtype).length);\n      }\n    }\n  }\n  return padPerCol;\n}\nfunction valToString(val, pad3, dtype) {\n  let valStr;\n  if (Array.isArray(val)) {\n    valStr = `${parseFloat(val[0].toFixed(FORMAT_NUM_SIG_DIGITS))} + ${parseFloat(val[1].toFixed(FORMAT_NUM_SIG_DIGITS))}j`;\n  } else if (isString(val)) {\n    valStr = `'${val}'`;\n  } else if (dtype === \"bool\") {\n    valStr = boolNumToString(val);\n  } else {\n    valStr = parseFloat(val.toFixed(FORMAT_NUM_SIG_DIGITS)).toString();\n  }\n  return rightPad(valStr, pad3);\n}\nfunction boolNumToString(v) {\n  return v === 0 ? \"false\" : \"true\";\n}\nfunction subTensorToString(vals, shape, dtype, strides, padPerCol, isLast = true) {\n  const storagePerElement = dtype === \"complex64\" ? 2 : 1;\n  const size = shape[0];\n  const rank = shape.length;\n  if (rank === 0) {\n    if (dtype === \"complex64\") {\n      const complexTuple = createComplexTuples(vals);\n      return [valToString(complexTuple[0], 0, dtype)];\n    }\n    if (dtype === \"bool\") {\n      return [boolNumToString(vals[0])];\n    }\n    return [vals[0].toString()];\n  }\n  if (rank === 1) {\n    if (size > FORMAT_LIMIT_NUM_VALS) {\n      const firstValsSize = FORMAT_NUM_FIRST_LAST_VALS * storagePerElement;\n      let firstVals = Array.from(vals.slice(0, firstValsSize));\n      let lastVals = Array.from(vals.slice((size - FORMAT_NUM_FIRST_LAST_VALS) * storagePerElement, size * storagePerElement));\n      if (dtype === \"complex64\") {\n        firstVals = createComplexTuples(firstVals);\n        lastVals = createComplexTuples(lastVals);\n      }\n      return [\n        \"[\" + firstVals.map((x, i) => valToString(x, padPerCol[i], dtype)).join(\", \") + \", ..., \" + lastVals.map((x, i) => valToString(x, padPerCol[size - FORMAT_NUM_FIRST_LAST_VALS + i], dtype)).join(\", \") + \"]\"\n      ];\n    }\n    const displayVals = dtype === \"complex64\" ? createComplexTuples(vals) : Array.from(vals);\n    return [\n      \"[\" + displayVals.map((x, i) => valToString(x, padPerCol[i], dtype)).join(\", \") + \"]\"\n    ];\n  }\n  const subshape = shape.slice(1);\n  const substrides = strides.slice(1);\n  const stride = strides[0] * storagePerElement;\n  const lines = [];\n  if (size > FORMAT_LIMIT_NUM_VALS) {\n    for (let i = 0; i < FORMAT_NUM_FIRST_LAST_VALS; i++) {\n      const start = i * stride;\n      const end = start + stride;\n      lines.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, false));\n    }\n    lines.push(\"...\");\n    for (let i = size - FORMAT_NUM_FIRST_LAST_VALS; i < size; i++) {\n      const start = i * stride;\n      const end = start + stride;\n      lines.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size - 1));\n    }\n  } else {\n    for (let i = 0; i < size; i++) {\n      const start = i * stride;\n      const end = start + stride;\n      lines.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size - 1));\n    }\n  }\n  const sep = rank === 2 ? \",\" : \"\";\n  lines[0] = \"[\" + lines[0] + sep;\n  for (let i = 1; i < lines.length - 1; i++) {\n    lines[i] = \" \" + lines[i] + sep;\n  }\n  let newLineSep = \",\\n\";\n  for (let i = 2; i < rank; i++) {\n    newLineSep += \"\\n\";\n  }\n  lines[lines.length - 1] = \" \" + lines[lines.length - 1] + \"]\" + (isLast ? \"\" : newLineSep);\n  return lines;\n}\nfunction createComplexTuples(vals) {\n  const complexTuples = [];\n  for (let i = 0; i < vals.length; i += 2) {\n    complexTuples.push([vals[i], vals[i + 1]]);\n  }\n  return complexTuples;\n}\nvar TensorBuffer = class {\n  constructor(shape, dtype, values) {\n    this.dtype = dtype;\n    this.shape = shape.slice();\n    this.size = sizeFromShape(shape);\n    if (values != null) {\n      const n = values.length;\n      assert(n === this.size, () => `Length of values '${n}' does not match the size inferred by the shape '${this.size}'.`);\n    }\n    if (dtype === \"complex64\") {\n      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).`);\n    }\n    this.values = values || getArrayFromDType(dtype, this.size);\n    this.strides = computeStrides(shape);\n  }\n  set(value, ...locs) {\n    if (locs.length === 0) {\n      locs = [0];\n    }\n    assert(locs.length === this.rank, () => `The number of provided coordinates (${locs.length}) must match the rank (${this.rank})`);\n    const index = this.locToIndex(locs);\n    this.values[index] = value;\n  }\n  get(...locs) {\n    if (locs.length === 0) {\n      locs = [0];\n    }\n    let i = 0;\n    for (const loc of locs) {\n      if (loc < 0 || loc >= this.shape[i]) {\n        const msg = `Requested out of range element at ${locs}.   Buffer shape=${this.shape}`;\n        throw new Error(msg);\n      }\n      i++;\n    }\n    let index = locs[locs.length - 1];\n    for (let i2 = 0; i2 < locs.length - 1; ++i2) {\n      index += this.strides[i2] * locs[i2];\n    }\n    return this.values[index];\n  }\n  locToIndex(locs) {\n    if (this.rank === 0) {\n      return 0;\n    } else if (this.rank === 1) {\n      return locs[0];\n    }\n    let index = locs[locs.length - 1];\n    for (let i = 0; i < locs.length - 1; ++i) {\n      index += this.strides[i] * locs[i];\n    }\n    return index;\n  }\n  indexToLoc(index) {\n    if (this.rank === 0) {\n      return [];\n    } else if (this.rank === 1) {\n      return [index];\n    }\n    const locs = new Array(this.shape.length);\n    for (let i = 0; i < locs.length - 1; ++i) {\n      locs[i] = Math.floor(index / this.strides[i]);\n      index -= locs[i] * this.strides[i];\n    }\n    locs[locs.length - 1] = index;\n    return locs;\n  }\n  get rank() {\n    return this.shape.length;\n  }\n  toTensor() {\n    return trackerFn().makeTensor(this.values, this.shape, this.dtype);\n  }\n};\nvar trackerFn = null;\nvar opHandler = null;\nvar deprecationWarningFn = null;\nfunction setTensorTracker(fn) {\n  trackerFn = fn;\n}\nfunction setOpHandler(handler) {\n  opHandler = handler;\n}\nfunction setDeprecationWarningFn(fn) {\n  deprecationWarningFn = fn;\n}\nvar Tensor = class {\n  constructor(shape, dtype, dataId, id) {\n    this.kept = false;\n    this.isDisposedInternal = false;\n    this.shape = shape.slice();\n    this.dtype = dtype || \"float32\";\n    this.size = sizeFromShape(shape);\n    this.strides = computeStrides(shape);\n    this.dataId = dataId;\n    this.id = id;\n    this.rankType = this.rank < 5 ? this.rank.toString() : \"higher\";\n  }\n  get rank() {\n    return this.shape.length;\n  }\n  async buffer() {\n    const vals = await this.data();\n    return opHandler.buffer(this.shape, this.dtype, vals);\n  }\n  bufferSync() {\n    return opHandler.buffer(this.shape, this.dtype, this.dataSync());\n  }\n  async array() {\n    const vals = await this.data();\n    return toNestedArray(this.shape, vals, this.dtype === \"complex64\");\n  }\n  arraySync() {\n    return toNestedArray(this.shape, this.dataSync(), this.dtype === \"complex64\");\n  }\n  async data() {\n    this.throwIfDisposed();\n    const data = trackerFn().read(this.dataId);\n    if (this.dtype === \"string\") {\n      const bytes = await data;\n      try {\n        return bytes.map((b) => decodeString(b));\n      } catch {\n        throw new Error(\"Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().\");\n      }\n    }\n    return data;\n  }\n  dataSync() {\n    this.throwIfDisposed();\n    const data = trackerFn().readSync(this.dataId);\n    if (this.dtype === \"string\") {\n      try {\n        return data.map((b) => decodeString(b));\n      } catch {\n        throw new Error(\"Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().\");\n      }\n    }\n    return data;\n  }\n  async bytes() {\n    this.throwIfDisposed();\n    const data = await trackerFn().read(this.dataId);\n    if (this.dtype === \"string\") {\n      return data;\n    } else {\n      return new Uint8Array(data.buffer);\n    }\n  }\n  dispose() {\n    if (this.isDisposed) {\n      return;\n    }\n    trackerFn().disposeTensor(this);\n    this.isDisposedInternal = true;\n  }\n  get isDisposed() {\n    return this.isDisposedInternal;\n  }\n  throwIfDisposed() {\n    if (this.isDisposed) {\n      throw new Error(`Tensor is disposed.`);\n    }\n  }\n  print(verbose = false) {\n    return opHandler.print(this, verbose);\n  }\n  clone() {\n    this.throwIfDisposed();\n    return opHandler.clone(this);\n  }\n  toString(verbose = false) {\n    const vals = this.dataSync();\n    return tensorToString(vals, this.shape, this.dtype, verbose);\n  }\n  cast(dtype) {\n    this.throwIfDisposed();\n    return opHandler.cast(this, dtype);\n  }\n  variable(trainable = true, name, dtype) {\n    this.throwIfDisposed();\n    return trackerFn().makeVariable(this, trainable, name, dtype);\n  }\n};\nObject.defineProperty(Tensor, Symbol.hasInstance, {\n  value: (instance) => {\n    return !!instance && instance.data != null && instance.dataSync != null && instance.throwIfDisposed != null;\n  }\n});\nfunction getGlobalTensorClass() {\n  return getGlobal(\"Tensor\", () => {\n    return Tensor;\n  });\n}\ngetGlobalTensorClass();\nvar Variable = class extends Tensor {\n  constructor(initialValue, trainable, name, tensorId) {\n    super(initialValue.shape, initialValue.dtype, initialValue.dataId, tensorId);\n    this.trainable = trainable;\n    this.name = name;\n  }\n  assign(newValue) {\n    if (newValue.dtype !== this.dtype) {\n      throw new Error(`dtype of the new value (${newValue.dtype}) and previous value (${this.dtype}) must match`);\n    }\n    if (!arraysEqual(newValue.shape, this.shape)) {\n      throw new Error(`shape of the new value (${newValue.shape}) and previous value (${this.shape}) must match`);\n    }\n    trackerFn().disposeTensor(this);\n    this.dataId = newValue.dataId;\n    trackerFn().incRef(this, null);\n  }\n  dispose() {\n    trackerFn().disposeVariable(this);\n    this.isDisposedInternal = true;\n  }\n};\nObject.defineProperty(Variable, Symbol.hasInstance, {\n  value: (instance) => {\n    return instance instanceof Tensor && instance.assign != null && instance.assign instanceof Function;\n  }\n});\nvar tensor_util_exports = {};\n__export(tensor_util_exports, {\n  assertTypesMatch: () => assertTypesMatch,\n  getTensorsInContainer: () => getTensorsInContainer,\n  isTensorInList: () => isTensorInList,\n  makeTypesMatch: () => makeTypesMatch\n});\nvar Rank;\n(function(Rank18) {\n  Rank18[\"R0\"] = \"R0\";\n  Rank18[\"R1\"] = \"R1\";\n  Rank18[\"R2\"] = \"R2\";\n  Rank18[\"R3\"] = \"R3\";\n  Rank18[\"R4\"] = \"R4\";\n  Rank18[\"R5\"] = \"R5\";\n  Rank18[\"R6\"] = \"R6\";\n})(Rank || (Rank = {}));\nvar UpcastInt32AndMap;\n(function(UpcastInt32AndMap2) {\n  UpcastInt32AndMap2[\"float32\"] = \"float32\";\n  UpcastInt32AndMap2[\"int32\"] = \"int32\";\n  UpcastInt32AndMap2[\"bool\"] = \"int32\";\n  UpcastInt32AndMap2[\"complex64\"] = \"complex64\";\n})(UpcastInt32AndMap || (UpcastInt32AndMap = {}));\nvar UpcastBoolAndMap;\n(function(UpcastBoolAndMap2) {\n  UpcastBoolAndMap2[\"float32\"] = \"float32\";\n  UpcastBoolAndMap2[\"int32\"] = \"int32\";\n  UpcastBoolAndMap2[\"bool\"] = \"bool\";\n  UpcastBoolAndMap2[\"complex64\"] = \"complex64\";\n})(UpcastBoolAndMap || (UpcastBoolAndMap = {}));\nvar UpcastFloat32AndMap;\n(function(UpcastFloat32AndMap2) {\n  UpcastFloat32AndMap2[\"float32\"] = \"float32\";\n  UpcastFloat32AndMap2[\"int32\"] = \"float32\";\n  UpcastFloat32AndMap2[\"bool\"] = \"float32\";\n  UpcastFloat32AndMap2[\"complex64\"] = \"complex64\";\n})(UpcastFloat32AndMap || (UpcastFloat32AndMap = {}));\nvar UpcastComplex64AndMap;\n(function(UpcastComplex64AndMap2) {\n  UpcastComplex64AndMap2[\"float32\"] = \"complex64\";\n  UpcastComplex64AndMap2[\"int32\"] = \"complex64\";\n  UpcastComplex64AndMap2[\"bool\"] = \"complex64\";\n  UpcastComplex64AndMap2[\"complex64\"] = \"complex64\";\n})(UpcastComplex64AndMap || (UpcastComplex64AndMap = {}));\nvar upcastTypeMap = {\n  \"float32\": UpcastFloat32AndMap,\n  \"int32\": UpcastInt32AndMap,\n  \"bool\": UpcastBoolAndMap,\n  \"complex64\": UpcastComplex64AndMap\n};\nfunction upcastType(typeA, typeB) {\n  if (typeA === \"string\" || typeB === \"string\") {\n    if (typeA === \"string\" && typeB === \"string\") {\n      return \"string\";\n    }\n    throw new Error(`Can not upcast ${typeA} with ${typeB}`);\n  }\n  return upcastTypeMap[typeA][typeB];\n}\nfunction sumOutType(type) {\n  return upcastType(type, \"int32\");\n}\nfunction makeTypesMatch(a, b) {\n  if (a.dtype === b.dtype) {\n    return [a, b];\n  }\n  const dtype = upcastType(a.dtype, b.dtype);\n  return [a.cast(dtype), b.cast(dtype)];\n}\nfunction assertTypesMatch(a, b) {\n  assert(a.dtype === b.dtype, () => `The dtypes of the first(${a.dtype}) and second(${b.dtype}) input must match`);\n}\nfunction isTensorInList(tensor2, tensorList) {\n  return tensorList.some((x) => x.id === tensor2.id);\n}\nfunction getTensorsInContainer(result) {\n  const list = [];\n  const seen = new Set();\n  walkTensorContainer(result, list, seen);\n  return list;\n}\nfunction walkTensorContainer(container, list, seen) {\n  if (container == null) {\n    return;\n  }\n  if (container instanceof Tensor) {\n    list.push(container);\n    return;\n  }\n  if (!isIterable(container)) {\n    return;\n  }\n  const iterable = container;\n  for (const k in iterable) {\n    const val = iterable[k];\n    if (!seen.has(val)) {\n      seen.add(val);\n      walkTensorContainer(val, list, seen);\n    }\n  }\n}\nfunction isIterable(obj) {\n  return Array.isArray(obj) || typeof obj === \"object\";\n}\nfunction isRegisteredKernelInvocation(kernelInvocation) {\n  return kernelInvocation.kernelName != null;\n}\nvar EngineState = class {\n  constructor() {\n    this.registeredVariables = {};\n    this.nextTapeNodeId = 0;\n    this.numBytes = 0;\n    this.numTensors = 0;\n    this.numStringTensors = 0;\n    this.numDataBuffers = 0;\n    this.gradientDepth = 0;\n    this.kernelDepth = 0;\n    this.scopeStack = [];\n    this.numDataMovesStack = [];\n    this.nextScopeId = 0;\n    this.tensorInfo = new WeakMap();\n    this.profiling = false;\n    this.activeProfile = {\n      newBytes: 0,\n      newTensors: 0,\n      peakBytes: 0,\n      kernels: [],\n      result: null,\n      get kernelNames() {\n        return Array.from(new Set(this.kernels.map((k) => k.name)));\n      }\n    };\n  }\n  dispose() {\n    for (const variableName in this.registeredVariables) {\n      this.registeredVariables[variableName].dispose();\n    }\n  }\n};\nvar _Engine = class {\n  constructor(ENV6) {\n    this.ENV = ENV6;\n    this.registry = {};\n    this.registryFactory = {};\n    this.pendingBackendInitId = 0;\n    this.state = new EngineState();\n  }\n  async ready() {\n    if (this.pendingBackendInit != null) {\n      return this.pendingBackendInit.then(() => {\n      });\n    }\n    if (this.backendInstance != null) {\n      return;\n    }\n    const sortedBackends = this.getSortedBackends();\n    for (let i = 0; i < sortedBackends.length; i++) {\n      const backendName = sortedBackends[i];\n      const success = await this.initializeBackend(backendName).success;\n      if (success) {\n        await this.setBackend(backendName);\n        return;\n      }\n    }\n    throw new Error(`Could not initialize any backends, all backend initializations failed.`);\n  }\n  get backend() {\n    if (this.pendingBackendInit != null) {\n      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`);\n    }\n    if (this.backendInstance == null) {\n      const { name, asyncInit } = this.initializeBackendsAndReturnBest();\n      if (asyncInit) {\n        throw new Error(`The highest priority backend '${name}' has not yet been initialized. Make sure to await tf.ready() or await tf.setBackend() before calling other methods`);\n      }\n      this.setBackend(name);\n    }\n    return this.backendInstance;\n  }\n  backendNames() {\n    return Object.keys(this.registryFactory);\n  }\n  findBackend(backendName) {\n    if (!(backendName in this.registry)) {\n      if (backendName in this.registryFactory) {\n        const { asyncInit } = this.initializeBackend(backendName);\n        if (asyncInit) {\n          return null;\n        }\n      } else {\n        return null;\n      }\n    }\n    return this.registry[backendName];\n  }\n  findBackendFactory(backendName) {\n    if (!(backendName in this.registryFactory)) {\n      return null;\n    }\n    return this.registryFactory[backendName].factory;\n  }\n  registerBackend(backendName, factory, priority = 1) {\n    if (backendName in this.registryFactory) {\n      warn(`${backendName} backend was already registered. Reusing existing backend factory.`);\n      return false;\n    }\n    this.registryFactory[backendName] = { factory, priority };\n    return true;\n  }\n  async setBackend(backendName) {\n    if (this.registryFactory[backendName] == null) {\n      throw new Error(`Backend name '${backendName}' not found in registry`);\n    }\n    this.backendName = backendName;\n    if (this.registry[backendName] == null) {\n      this.backendInstance = null;\n      const { success, asyncInit } = this.initializeBackend(backendName);\n      const result = asyncInit ? await success : success;\n      if (!result) {\n        return false;\n      }\n    }\n    this.backendInstance = this.registry[backendName];\n    this.setupRegisteredKernels();\n    this.profiler = new Profiler(this.backendInstance);\n    return true;\n  }\n  setupRegisteredKernels() {\n    const kernels = getKernelsForBackend(this.backendName);\n    kernels.forEach((kernel) => {\n      if (kernel.setupFunc != null) {\n        kernel.setupFunc(this.backendInstance);\n      }\n    });\n  }\n  disposeRegisteredKernels(backendName) {\n    const kernels = getKernelsForBackend(backendName);\n    kernels.forEach((kernel) => {\n      if (kernel.disposeFunc != null) {\n        kernel.disposeFunc(this.registry[backendName]);\n      }\n    });\n  }\n  initializeBackend(backendName) {\n    const registryFactoryEntry = this.registryFactory[backendName];\n    if (registryFactoryEntry == null) {\n      throw new Error(`Cannot initialize backend ${backendName}, no registration found.`);\n    }\n    try {\n      const backend2 = registryFactoryEntry.factory();\n      if (backend2 && !(backend2 instanceof KernelBackend) && typeof backend2.then === \"function\") {\n        const promiseId = ++this.pendingBackendInitId;\n        const success = backend2.then((backendInstance) => {\n          if (promiseId < this.pendingBackendInitId) {\n            return false;\n          }\n          this.registry[backendName] = backendInstance;\n          this.pendingBackendInit = null;\n          return true;\n        }).catch((err) => {\n          if (promiseId < this.pendingBackendInitId) {\n            return false;\n          }\n          this.pendingBackendInit = null;\n          warn(`Initialization of backend ${backendName} failed`);\n          warn(err.stack || err.message);\n          return false;\n        });\n        this.pendingBackendInit = success;\n        return { success, asyncInit: true };\n      } else {\n        this.registry[backendName] = backend2;\n        return { success: true, asyncInit: false };\n      }\n    } catch (err) {\n      warn(`Initialization of backend ${backendName} failed`);\n      warn(err.stack || err.message);\n      return { success: false, asyncInit: false };\n    }\n  }\n  removeBackend(backendName) {\n    if (!(backendName in this.registryFactory)) {\n      throw new Error(`${backendName} backend not found in registry`);\n    }\n    if (this.backendName === backendName && this.pendingBackendInit != null) {\n      this.pendingBackendInitId++;\n    }\n    if (backendName in this.registry) {\n      this.disposeRegisteredKernels(backendName);\n      this.registry[backendName].dispose();\n      delete this.registry[backendName];\n    }\n    delete this.registryFactory[backendName];\n    if (this.backendName === backendName) {\n      this.pendingBackendInit = null;\n      this.backendName = null;\n      this.backendInstance = null;\n    }\n  }\n  getSortedBackends() {\n    if (Object.keys(this.registryFactory).length === 0) {\n      throw new Error(\"No backend found in registry.\");\n    }\n    return Object.keys(this.registryFactory).sort((a, b) => {\n      return this.registryFactory[b].priority - this.registryFactory[a].priority;\n    });\n  }\n  initializeBackendsAndReturnBest() {\n    const sortedBackends = this.getSortedBackends();\n    for (let i = 0; i < sortedBackends.length; i++) {\n      const backendName = sortedBackends[i];\n      const { success, asyncInit } = this.initializeBackend(backendName);\n      if (asyncInit || success) {\n        return { name: backendName, asyncInit };\n      }\n    }\n    throw new Error(`Could not initialize any backends, all backend initializations failed.`);\n  }\n  moveData(backend2, dataId) {\n    const info = this.state.tensorInfo.get(dataId);\n    const srcBackend = info.backend;\n    const values = this.readSync(dataId);\n    const refCount = srcBackend.refCount(dataId);\n    srcBackend.disposeData(dataId, true);\n    info.backend = backend2;\n    backend2.move(dataId, values, info.shape, info.dtype, refCount);\n    if (this.shouldCheckForMemLeaks()) {\n      this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1]++;\n    }\n  }\n  tidy(nameOrFn, fn) {\n    let name = null;\n    if (fn == null) {\n      if (typeof nameOrFn !== \"function\") {\n        throw new Error(\"Please provide a function to tidy()\");\n      }\n      fn = nameOrFn;\n    } else {\n      if (typeof nameOrFn !== \"string\" && !(nameOrFn instanceof String)) {\n        throw new Error(\"When calling with two arguments, the first argument to tidy() must be a string\");\n      }\n      if (typeof fn !== \"function\") {\n        throw new Error(\"When calling with two arguments, the 2nd argument to tidy() must be a function\");\n      }\n      name = nameOrFn;\n    }\n    let result;\n    return this.scopedRun(() => this.startScope(name), () => this.endScope(result), () => {\n      result = fn();\n      if (result instanceof Promise) {\n        console.error(\"Cannot return a Promise inside of tidy.\");\n      }\n      return result;\n    });\n  }\n  scopedRun(start, end, f) {\n    start();\n    try {\n      const res = f();\n      end();\n      return res;\n    } catch (ex) {\n      end();\n      throw ex;\n    }\n  }\n  nextTensorId() {\n    return _Engine.nextTensorId++;\n  }\n  nextVariableId() {\n    return _Engine.nextVariableId++;\n  }\n  clone(x) {\n    const y = ENGINE.runKernel(Identity, { x });\n    const inputs = { x };\n    const grad2 = (dy) => ({\n      x: () => {\n        const dtype = \"float32\";\n        const gradInputs = { x: dy };\n        const attrs = { dtype };\n        return ENGINE.runKernel(Cast, gradInputs, attrs);\n      }\n    });\n    const saved = [];\n    this.addTapeNode(this.state.activeScope.name, inputs, [y], grad2, saved, {});\n    return y;\n  }\n  runKernel(kernelName, inputs, attrs) {\n    if (this.backendName == null) {\n      this.backend;\n    }\n    const hasKernel = getKernel(kernelName, this.backendName) != null;\n    if (!hasKernel) {\n      throw new Error(`Kernel '${kernelName}' not registered for backend '${this.backendName}'`);\n    }\n    return this.runKernelFunc({ kernelName, inputs, attrs });\n  }\n  shouldCheckForMemLeaks() {\n    return this.ENV.getBool(\"IS_TEST\");\n  }\n  checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos) {\n    const numDataIdsAfter = this.backend.numDataIds();\n    let numOutputDataIds = 0;\n    outInfos.forEach((info) => {\n      numOutputDataIds += info.dtype === \"complex64\" ? 3 : 1;\n    });\n    const numMoves = this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1];\n    const dataIdsLeaked = numDataIdsAfter - numDataIdsBefore - numOutputDataIds - numMoves;\n    if (dataIdsLeaked > 0) {\n      throw new Error(`Backend '${this.backendName}' has an internal memory leak (${dataIdsLeaked} data ids) after running '${kernelName}'`);\n    }\n  }\n  runKernelFunc(kernelParams) {\n    let outputs;\n    let saved = [];\n    const isTapeOn = this.isTapeOn();\n    const startingBytecount = this.state.numBytes;\n    const startingNumTensors = this.state.numTensors;\n    if (this.shouldCheckForMemLeaks()) {\n      this.state.numDataMovesStack.push(0);\n    }\n    let kernelFunc3;\n    if (this.backendName == null) {\n      this.backend;\n    }\n    let out;\n    const kernelOrScopeName = isRegisteredKernelInvocation(kernelParams) ? kernelParams.kernelName : this.state.activeScope != null ? this.state.activeScope.name : \"\";\n    if (isRegisteredKernelInvocation(kernelParams)) {\n      const { kernelName, inputs: inputs2, attrs: attrs2 } = kernelParams;\n      if (this.backendName == null) {\n        this.backend;\n      }\n      const kernel = getKernel(kernelName, this.backendName);\n      assert(kernel != null, () => `Cannot find registered kernel '${kernelName}' for backend '${this.backendName}'`);\n      kernelFunc3 = () => {\n        const numDataIdsBefore = this.backend.numDataIds();\n        out = kernel.kernelFunc({ inputs: inputs2, attrs: attrs2, backend: this.backend });\n        const outInfos = Array.isArray(out) ? out : [out];\n        if (this.shouldCheckForMemLeaks()) {\n          this.checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos);\n        }\n        const outTensors = outInfos.map((outInfo) => {\n          if (outInfo.rank != null) {\n            return outInfo;\n          }\n          const { dataId, shape, dtype } = outInfo;\n          return this.makeTensorFromDataId(dataId, shape, dtype);\n        });\n        if (isTapeOn) {\n          const tensorsToSave = this.getTensorsForGradient(kernelName, inputs2, outTensors);\n          saved = this.saveTensorsForBackwardMode(tensorsToSave);\n        }\n        return outTensors;\n      };\n    } else {\n      const { forwardFunc } = kernelParams;\n      const saveFunc = (tensors) => {\n        if (!isTapeOn) {\n          return;\n        }\n        saved = tensors.map((tensor2) => this.keep(this.clone(tensor2)));\n      };\n      kernelFunc3 = () => {\n        const numDataIdsBefore = this.backend.numDataIds();\n        out = this.tidy(() => forwardFunc(this.backend, saveFunc));\n        const outs = Array.isArray(out) ? out : [out];\n        if (this.shouldCheckForMemLeaks()) {\n          this.checkKernelForMemLeak(kernelOrScopeName, numDataIdsBefore, outs);\n        }\n        return outs;\n      };\n    }\n    const { inputs, attrs } = kernelParams;\n    const backwardsFunc = isRegisteredKernelInvocation(kernelParams) ? null : kernelParams.backwardsFunc;\n    let kernelProfile;\n    this.scopedRun(() => this.state.kernelDepth++, () => this.state.kernelDepth--, () => {\n      if (!this.ENV.getBool(\"DEBUG\") && !this.state.profiling) {\n        outputs = kernelFunc3();\n      } else {\n        kernelProfile = this.profiler.profileKernel(kernelOrScopeName, inputs, () => kernelFunc3());\n        if (this.ENV.getBool(\"DEBUG\")) {\n          this.profiler.logKernelProfile(kernelProfile);\n        }\n        outputs = kernelProfile.outputs;\n      }\n    });\n    if (isTapeOn) {\n      this.addTapeNode(kernelOrScopeName, inputs, outputs, backwardsFunc, saved, attrs);\n    }\n    if (this.state.profiling) {\n      this.state.activeProfile.kernels.push({\n        name: kernelOrScopeName,\n        bytesAdded: this.state.numBytes - startingBytecount,\n        totalBytesSnapshot: this.state.numBytes,\n        tensorsAdded: this.state.numTensors - startingNumTensors,\n        totalTensorsSnapshot: this.state.numTensors,\n        inputShapes: Object.keys(inputs).map((key) => inputs[key] != null ? inputs[key].shape : null),\n        outputShapes: outputs.map((item) => item.shape),\n        kernelTimeMs: kernelProfile.timeMs,\n        extraInfo: kernelProfile.extraInfo\n      });\n    }\n    return Array.isArray(out) ? outputs : outputs[0];\n  }\n  saveTensorsForBackwardMode(tensors) {\n    const saved = tensors.map((tensor2) => this.keep(this.clone(tensor2)));\n    return saved;\n  }\n  getTensorsForGradient(kernelName, inputs, outputs) {\n    const gradConfig = getGradient(kernelName);\n    if (gradConfig != null) {\n      const inputsToSave = gradConfig.inputsToSave || [];\n      const outputsToSave = gradConfig.outputsToSave || [];\n      let inputTensorsToSave;\n      if (gradConfig.saveAllInputs) {\n        assert(Array.isArray(inputs), () => \"saveAllInputs is true, expected inputs to be an array.\");\n        inputTensorsToSave = Object.keys(inputs).map((key) => inputs[key]);\n      } else {\n        inputTensorsToSave = inputsToSave.map((inputName) => inputs[inputName]);\n      }\n      const outputTensorsToSave = outputs.filter((_, i) => outputsToSave[i]);\n      return inputTensorsToSave.concat(outputTensorsToSave);\n    }\n    return [];\n  }\n  makeTensor(values, shape, dtype, backend2) {\n    if (values == null) {\n      throw new Error(\"Values passed to engine.makeTensor() are null\");\n    }\n    dtype = dtype || \"float32\";\n    backend2 = backend2 || this.backend;\n    let backendVals = values;\n    if (dtype === \"string\" && isString(values[0])) {\n      backendVals = values.map((d) => encodeString(d));\n    }\n    const dataId = backend2.write(backendVals, shape, dtype);\n    const t = new Tensor(shape, dtype, dataId, this.nextTensorId());\n    this.trackTensor(t, backend2);\n    if (dtype === \"string\") {\n      const info = this.state.tensorInfo.get(dataId);\n      const newBytes = bytesFromStringArray(backendVals);\n      this.state.numBytes += newBytes - info.bytes;\n      info.bytes = newBytes;\n    }\n    return t;\n  }\n  makeTensorFromDataId(dataId, shape, dtype, backend2) {\n    dtype = dtype || \"float32\";\n    const t = new Tensor(shape, dtype, dataId, this.nextTensorId());\n    this.trackTensor(t, backend2);\n    return t;\n  }\n  makeVariable(initialValue, trainable = true, name, dtype) {\n    name = name || this.nextVariableId().toString();\n    if (dtype != null && dtype !== initialValue.dtype) {\n      initialValue = initialValue.cast(dtype);\n    }\n    const v = new Variable(initialValue, trainable, name, this.nextTensorId());\n    if (this.state.registeredVariables[v.name] != null) {\n      throw new Error(`Variable with name ${v.name} was already registered`);\n    }\n    this.state.registeredVariables[v.name] = v;\n    this.incRef(v, this.backend);\n    return v;\n  }\n  trackTensor(a, backend2) {\n    this.state.numTensors++;\n    if (a.dtype === \"string\") {\n      this.state.numStringTensors++;\n    }\n    let bytes = 0;\n    if (a.dtype !== \"complex64\" && a.dtype !== \"string\") {\n      bytes = a.size * bytesPerElement(a.dtype);\n    }\n    this.state.numBytes += bytes;\n    if (!this.state.tensorInfo.has(a.dataId)) {\n      this.state.numDataBuffers++;\n      this.state.tensorInfo.set(a.dataId, {\n        backend: backend2 || this.backend,\n        dtype: a.dtype,\n        shape: a.shape,\n        bytes\n      });\n    }\n    if (!(a instanceof Variable)) {\n      this.track(a);\n    }\n  }\n  incRef(a, backend2) {\n    this.trackTensor(a, backend2);\n    this.backend.incRef(a.dataId);\n  }\n  removeDataId(dataId, backend2) {\n    if (this.state.tensorInfo.has(dataId) && this.state.tensorInfo.get(dataId).backend === backend2) {\n      this.state.tensorInfo.delete(dataId);\n      this.state.numDataBuffers--;\n    }\n  }\n  disposeTensor(a) {\n    if (!this.state.tensorInfo.has(a.dataId)) {\n      return;\n    }\n    const info = this.state.tensorInfo.get(a.dataId);\n    this.state.numTensors--;\n    if (a.dtype === \"string\") {\n      this.state.numStringTensors--;\n      this.state.numBytes -= info.bytes;\n    }\n    if (a.dtype !== \"complex64\" && a.dtype !== \"string\") {\n      const bytes = a.size * bytesPerElement(a.dtype);\n      this.state.numBytes -= bytes;\n    }\n    if (info.backend.disposeData(a.dataId)) {\n      this.removeDataId(a.dataId, info.backend);\n    }\n  }\n  disposeVariables() {\n    for (const varName in this.state.registeredVariables) {\n      const v = this.state.registeredVariables[varName];\n      this.disposeVariable(v);\n    }\n  }\n  disposeVariable(v) {\n    this.disposeTensor(v);\n    if (this.state.registeredVariables[v.name] != null) {\n      delete this.state.registeredVariables[v.name];\n    }\n  }\n  memory() {\n    const info = this.backend.memory();\n    info.numTensors = this.state.numTensors;\n    info.numDataBuffers = this.state.numDataBuffers;\n    info.numBytes = this.state.numBytes;\n    if (this.state.numStringTensors > 0) {\n      info.unreliable = true;\n      if (info.reasons == null) {\n        info.reasons = [];\n      }\n      info.reasons.push(\"Memory usage by string tensors is approximate (2 bytes per character)\");\n    }\n    return info;\n  }\n  async profile(query) {\n    this.state.profiling = true;\n    const startBytes = this.state.numBytes;\n    const startNumTensors = this.state.numTensors;\n    this.state.activeProfile.kernels = [];\n    this.state.activeProfile.result = await query();\n    this.state.profiling = false;\n    this.state.activeProfile.peakBytes = Math.max(...this.state.activeProfile.kernels.map((d) => d.totalBytesSnapshot));\n    this.state.activeProfile.newBytes = this.state.numBytes - startBytes;\n    this.state.activeProfile.newTensors = this.state.numTensors - startNumTensors;\n    for (const kernel of this.state.activeProfile.kernels) {\n      kernel.kernelTimeMs = await kernel.kernelTimeMs;\n      kernel.extraInfo = await kernel.extraInfo;\n    }\n    return this.state.activeProfile;\n  }\n  isTapeOn() {\n    return this.state.gradientDepth > 0 && this.state.kernelDepth === 0;\n  }\n  addTapeNode(kernelName, inputs, outputs, gradientsFunc, saved, attrs) {\n    const tapeNode = { id: this.state.nextTapeNodeId++, kernelName, inputs, outputs, saved };\n    const gradConfig = getGradient(kernelName);\n    if (gradConfig != null) {\n      gradientsFunc = gradConfig.gradFunc;\n    }\n    if (gradientsFunc != null) {\n      tapeNode.gradient = (dys) => {\n        dys = dys.map((dy, i) => {\n          if (dy == null) {\n            const output = outputs[i];\n            const vals = makeZerosTypedArray(output.size, output.dtype);\n            return this.makeTensor(vals, output.shape, output.dtype);\n          }\n          return dy;\n        });\n        return gradientsFunc(dys.length > 1 ? dys : dys[0], saved, attrs);\n      };\n    }\n    this.state.activeTape.push(tapeNode);\n  }\n  keep(result) {\n    result.kept = true;\n    return result;\n  }\n  startTape() {\n    if (this.state.gradientDepth === 0) {\n      this.state.activeTape = [];\n    }\n    this.state.gradientDepth++;\n  }\n  endTape() {\n    this.state.gradientDepth--;\n  }\n  startScope(name) {\n    const scopeInfo = {\n      track: [],\n      name: \"unnamed scope\",\n      id: this.state.nextScopeId++\n    };\n    if (name) {\n      scopeInfo.name = name;\n    }\n    this.state.scopeStack.push(scopeInfo);\n    this.state.activeScope = scopeInfo;\n  }\n  endScope(result) {\n    const tensorsToTrackInParent = getTensorsInContainer(result);\n    const tensorsToTrackInParentSet = new Set(tensorsToTrackInParent.map((t) => t.id));\n    for (let i = 0; i < this.state.activeScope.track.length; i++) {\n      const tensor2 = this.state.activeScope.track[i];\n      if (!tensor2.kept && !tensorsToTrackInParentSet.has(tensor2.id)) {\n        tensor2.dispose();\n      }\n    }\n    const oldScope = this.state.scopeStack.pop();\n    this.state.activeScope = this.state.scopeStack.length === 0 ? null : this.state.scopeStack[this.state.scopeStack.length - 1];\n    tensorsToTrackInParent.forEach((tensor2) => {\n      if (!tensor2.kept && tensor2.scopeId === oldScope.id) {\n        this.track(tensor2);\n      }\n    });\n  }\n  gradients(f, xs, dy, allowNoGradients = false) {\n    assert(xs.length > 0, () => \"gradients() received an empty list of xs.\");\n    if (dy != null && dy.dtype !== \"float32\") {\n      throw new Error(`dy must have 'float32' dtype, but has '${dy.dtype}'`);\n    }\n    const y = this.scopedRun(() => this.startTape(), () => this.endTape(), () => this.tidy(\"forward\", f));\n    assert(y instanceof Tensor, () => \"The result y returned by f() must be a tensor.\");\n    const filteredTape = getFilteredNodesXToY(this.state.activeTape, xs, y);\n    if (!allowNoGradients && filteredTape.length === 0 && xs.length > 0) {\n      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.\");\n    }\n    return this.tidy(\"backward\", () => {\n      const accumulatedGradientMap = {};\n      accumulatedGradientMap[y.id] = dy == null ? ones(y.shape) : dy;\n      backpropagateGradients(accumulatedGradientMap, filteredTape, (f2) => this.tidy(f2), add);\n      const grads2 = xs.map((x) => accumulatedGradientMap[x.id]);\n      if (this.state.gradientDepth === 0) {\n        this.state.activeTape.forEach((node) => {\n          for (const tensor2 of node.saved) {\n            tensor2.dispose();\n          }\n        });\n        this.state.activeTape = null;\n      }\n      return { value: y, grads: grads2 };\n    });\n  }\n  customGrad(f) {\n    assert(isFunction(f), () => \"The f passed in customGrad(f) must be a function.\");\n    return (...inputs) => {\n      assert(inputs.every((t) => t instanceof Tensor), () => \"The args passed in customGrad(f)(x1, x2,...) must all be tensors\");\n      let res;\n      const inputMap = {};\n      inputs.forEach((input2, i) => {\n        inputMap[i] = input2;\n      });\n      const forwardFunc = (_, save) => {\n        res = f(...[...inputs, save]);\n        assert(res.value instanceof Tensor, () => \"The function f passed in customGrad(f) must return an object where `obj.value` is a tensor\");\n        assert(isFunction(res.gradFunc), () => \"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function.\");\n        return res.value;\n      };\n      const backwardsFunc = (dy, saved) => {\n        const gradRes = res.gradFunc(dy, saved);\n        const grads2 = Array.isArray(gradRes) ? gradRes : [gradRes];\n        assert(grads2.length === inputs.length, () => \"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns the same number of tensors as inputs passed to f(...).\");\n        assert(grads2.every((t) => t instanceof Tensor), () => \"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns a list of only tensors.\");\n        const gradMap = {};\n        grads2.forEach((grad2, i) => {\n          gradMap[i] = () => grad2;\n        });\n        return gradMap;\n      };\n      return this.runKernelFunc({\n        forwardFunc,\n        backwardsFunc,\n        inputs: inputMap\n      });\n    };\n  }\n  readSync(dataId) {\n    const info = this.state.tensorInfo.get(dataId);\n    return info.backend.readSync(dataId);\n  }\n  read(dataId) {\n    const info = this.state.tensorInfo.get(dataId);\n    return info.backend.read(dataId);\n  }\n  async time(query) {\n    const start = now();\n    const timingInfo = await this.backend.time(query);\n    timingInfo.wallMs = now() - start;\n    return timingInfo;\n  }\n  track(result) {\n    if (this.state.activeScope != null) {\n      result.scopeId = this.state.activeScope.id;\n      this.state.activeScope.track.push(result);\n    }\n    return result;\n  }\n  get registeredVariables() {\n    return this.state.registeredVariables;\n  }\n  reset() {\n    this.pendingBackendInitId++;\n    this.state.dispose();\n    this.ENV.reset();\n    this.state = new EngineState();\n    for (const backendName in this.registry) {\n      this.disposeRegisteredKernels(backendName);\n      this.registry[backendName].dispose();\n      delete this.registry[backendName];\n    }\n    this.backendName = null;\n    this.backendInstance = null;\n    this.pendingBackendInit = null;\n  }\n};\nvar Engine = _Engine;\nEngine.nextTensorId = 0;\nEngine.nextVariableId = 0;\nfunction ones(shape) {\n  const values = makeOnesTypedArray(sizeFromShape(shape), \"float32\");\n  return ENGINE.makeTensor(values, shape, \"float32\");\n}\nfunction getOrMakeEngine() {\n  const ns = getGlobalNamespace();\n  if (ns._tfengine == null) {\n    const environment = new Environment(ns);\n    ns._tfengine = new Engine(environment);\n  }\n  setEnvironmentGlobal(ns._tfengine.ENV);\n  setTensorTracker(() => ns._tfengine);\n  return ns._tfengine;\n}\nvar ENGINE = getOrMakeEngine();\nfunction add(a, b) {\n  const inputs = { a, b };\n  return ENGINE.runKernel(Add, inputs);\n}\nvar device_util_exports = {};\n__export(device_util_exports, {\n  isBrowser: () => isBrowser,\n  isMobile: () => isMobile,\n  mockIsMobile: () => mockIsMobile\n});\nfunction _isNavigatorDefined() {\n  return typeof navigator !== \"undefined\" && navigator != null;\n}\nvar isMobileMockValue;\nfunction mockIsMobile(value) {\n  isMobileMockValue = value;\n}\nfunction isMobile(nav) {\n  if (isMobileMockValue !== void 0) {\n    return isMobileMockValue;\n  }\n  if (nav || _isNavigatorDefined()) {\n    if (!nav) {\n      nav = navigator;\n    }\n    if (nav.product === \"ReactNative\") {\n      return true;\n    }\n    const a = nav.userAgent || nav.vendor || (typeof window !== \"undefined\" ? window.opera : \"\");\n    if (!a) {\n      const navAny = nav;\n      return navAny.userAgentData && navAny.userAgentData.mobile;\n    }\n    return /(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0, 4));\n  }\n  return false;\n}\nfunction isBrowser() {\n  return typeof window !== \"undefined\" && window.document != null || typeof WorkerGlobalScope !== \"undefined\";\n}\nvar ENV2 = env();\nENV2.registerFlag(\"DEBUG\", () => false, (debugValue) => {\n  if (debugValue) {\n    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.\");\n  }\n});\nENV2.registerFlag(\"IS_BROWSER\", () => isBrowser());\nENV2.registerFlag(\"IS_NODE\", () => typeof process !== \"undefined\" && typeof process.versions !== \"undefined\" && typeof process.versions.node !== \"undefined\");\nENV2.registerFlag(\"IS_CHROME\", () => typeof navigator !== \"undefined\" && navigator != null && navigator.userAgent != null && /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor));\nENV2.registerFlag(\"PROD\", () => false);\nENV2.registerFlag(\"TENSORLIKE_CHECK_SHAPE_CONSISTENCY\", () => ENV2.getBool(\"DEBUG\"));\nENV2.registerFlag(\"DEPRECATION_WARNINGS_ENABLED\", () => true);\nENV2.registerFlag(\"IS_TEST\", () => false);\nENV2.registerFlag(\"CHECK_COMPUTATION_FOR_ERRORS\", () => true);\nENV2.registerFlag(\"WRAP_TO_IMAGEBITMAP\", () => false);\nfunction inferShape(val, dtype) {\n  let firstElem = val;\n  if (isTypedArray(val)) {\n    return dtype === \"string\" ? [] : [val.length];\n  }\n  if (!Array.isArray(val)) {\n    return [];\n  }\n  const shape = [];\n  while (Array.isArray(firstElem) || isTypedArray(firstElem) && dtype !== \"string\") {\n    shape.push(firstElem.length);\n    firstElem = firstElem[0];\n  }\n  if (Array.isArray(val) && env().getBool(\"TENSORLIKE_CHECK_SHAPE_CONSISTENCY\")) {\n    deepAssertShapeConsistency(val, shape, []);\n  }\n  return shape;\n}\nfunction deepAssertShapeConsistency(val, shape, indices) {\n  indices = indices || [];\n  if (!Array.isArray(val) && !isTypedArray(val)) {\n    assert(shape.length === 0, () => `Element arr[${indices.join(\"][\")}] is a primitive, but should be an array/TypedArray of ${shape[0]} elements`);\n    return;\n  }\n  assert(shape.length > 0, () => `Element arr[${indices.join(\"][\")}] should be a primitive, but is an array of ${val.length} elements`);\n  assert(val.length === shape[0], () => `Element arr[${indices.join(\"][\")}] should have ${shape[0]} elements, but has ${val.length} elements`);\n  const subShape = shape.slice(1);\n  for (let i = 0; i < val.length; ++i) {\n    deepAssertShapeConsistency(val[i], subShape, indices.concat(i));\n  }\n}\nfunction assertDtype(expectedDtype, actualDType, argName, functionName) {\n  if (expectedDtype === \"string_or_numeric\") {\n    return;\n  }\n  if (expectedDtype == null) {\n    throw new Error(`Expected dtype cannot be null.`);\n  }\n  if (expectedDtype !== \"numeric\" && expectedDtype !== actualDType || expectedDtype === \"numeric\" && actualDType === \"string\") {\n    throw new Error(`Argument '${argName}' passed to '${functionName}' must be ${expectedDtype} tensor, but got ${actualDType} tensor`);\n  }\n}\nfunction convertToTensor(x, argName, functionName, parseAsDtype = \"numeric\") {\n  if (x instanceof Tensor) {\n    assertDtype(parseAsDtype, x.dtype, argName, functionName);\n    return x;\n  }\n  let inferredDtype = inferDtype(x);\n  if (inferredDtype !== \"string\" && [\"bool\", \"int32\", \"float32\"].indexOf(parseAsDtype) >= 0) {\n    inferredDtype = parseAsDtype;\n  }\n  assertDtype(parseAsDtype, inferredDtype, argName, functionName);\n  if (x == null || !isTypedArray(x) && !Array.isArray(x) && typeof x !== \"number\" && typeof x !== \"boolean\" && typeof x !== \"string\") {\n    const type = x == null ? \"null\" : x.constructor.name;\n    throw new Error(`Argument '${argName}' passed to '${functionName}' must be a Tensor or TensorLike, but got '${type}'`);\n  }\n  const inferredShape = inferShape(x, inferredDtype);\n  if (!isTypedArray(x) && !Array.isArray(x)) {\n    x = [x];\n  }\n  const skipTypedArray = true;\n  const values = inferredDtype !== \"string\" ? toTypedArray(x, inferredDtype) : flatten(x, [], skipTypedArray);\n  return ENGINE.makeTensor(values, inferredShape, inferredDtype);\n}\nfunction convertToTensorArray(arg, argName, functionName, parseAsDtype = \"numeric\") {\n  if (!Array.isArray(arg)) {\n    throw new Error(`Argument ${argName} passed to ${functionName} must be a \\`Tensor[]\\` or \\`TensorLike[]\\``);\n  }\n  const tensors = arg;\n  return tensors.map((t, i) => convertToTensor(t, `${argName}[${i}]`, functionName, parseAsDtype));\n}\nvar OP_SCOPE_SUFFIX = \"__op\";\nfunction op(f) {\n  const keys = Object.keys(f);\n  if (keys.length !== 1) {\n    throw new Error(`Please provide an object with a single key (operation name) mapping to a function. Got an object with ${keys.length} keys.`);\n  }\n  let opName = keys[0];\n  const fn = f[opName];\n  if (opName.endsWith(\"_\")) {\n    opName = opName.substring(0, opName.length - 1);\n  }\n  opName = opName + OP_SCOPE_SUFFIX;\n  const f2 = (...args) => {\n    ENGINE.startScope(opName);\n    try {\n      const result = fn(...args);\n      if (isPromise(result)) {\n        console.error(\"Cannot return a Promise inside of tidy.\");\n      }\n      ENGINE.endScope(result);\n      return result;\n    } catch (ex) {\n      ENGINE.endScope(null);\n      throw ex;\n    }\n  };\n  Object.defineProperty(f2, \"name\", { value: opName, configurable: true });\n  return f2;\n}\nfunction complex_(real5, imag5) {\n  const $real = convertToTensor(real5, \"real\", \"complex\");\n  const $imag = convertToTensor(imag5, \"imag\", \"complex\");\n  assertShapesMatch($real.shape, $imag.shape, `real and imag shapes, ${$real.shape} and ${$imag.shape}, must match in call to tf.complex().`);\n  const inputs = { real: $real, imag: $imag };\n  return ENGINE.runKernel(Complex, inputs);\n}\nvar complex = op({ complex_ });\nfunction makeTensor(values, shape, inferredShape, dtype) {\n  if (dtype == null) {\n    dtype = inferDtype(values);\n  }\n  if (dtype === \"complex64\") {\n    throw new Error(`Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).`);\n  }\n  if (!isTypedArray(values) && !Array.isArray(values) && typeof values !== \"number\" && typeof values !== \"boolean\" && typeof values !== \"string\") {\n    throw new Error(\"values passed to tensor(values) must be a number/boolean/string or an array of numbers/booleans/strings, or a TypedArray\");\n  }\n  if (shape != null) {\n    assertNonNegativeIntegerDimensions(shape);\n    const providedSize = sizeFromShape(shape);\n    const inferredSize = sizeFromShape(inferredShape);\n    assert(providedSize === inferredSize, () => `Based on the provided shape, [${shape}], the tensor should have ${providedSize} values but has ${inferredSize}`);\n    for (let i = 0; i < inferredShape.length; ++i) {\n      const inferred = inferredShape[i];\n      const flatDimsDontMatch = i === inferredShape.length - 1 ? inferred !== sizeFromShape(shape.slice(i)) : true;\n      assert(inferredShape[i] === shape[i] || !flatDimsDontMatch, () => `Error creating a new Tensor. Inferred shape (${inferredShape}) does not match the provided shape (${shape}). `);\n    }\n  }\n  if (!isTypedArray(values) && !Array.isArray(values)) {\n    values = [values];\n  }\n  shape = shape || inferredShape;\n  values = dtype !== \"string\" ? toTypedArray(values, dtype) : flatten(values, [], true);\n  return ENGINE.makeTensor(values, shape, dtype);\n}\nfunction tensor(values, shape, dtype) {\n  const inferredShape = inferShape(values, dtype);\n  return makeTensor(values, shape, inferredShape, dtype);\n}\nvar DTYPE_VALUE_SIZE_MAP = {\n  \"float32\": 4,\n  \"float16\": 2,\n  \"int32\": 4,\n  \"uint16\": 2,\n  \"uint8\": 1,\n  \"bool\": 1,\n  \"complex64\": 8\n};\nvar NUM_BYTES_STRING_LENGTH = 4;\nasync function encodeWeights(tensors, group) {\n  const specs = [];\n  const dataPromises = [];\n  const names = Array.isArray(tensors) ? tensors.map((tensor2) => tensor2.name) : Object.keys(tensors);\n  for (let i = 0; i < names.length; ++i) {\n    const name = names[i];\n    const t = Array.isArray(tensors) ? tensors[i].tensor : tensors[name];\n    if (t.dtype !== \"float32\" && t.dtype !== \"int32\" && t.dtype !== \"bool\" && t.dtype !== \"string\" && t.dtype !== \"complex64\") {\n      throw new Error(`Unsupported dtype in weight '${name}': ${t.dtype}`);\n    }\n    const spec = { name, shape: t.shape, dtype: t.dtype };\n    if (t.dtype === \"string\") {\n      const utf8bytes = new Promise(async (resolve) => {\n        const vals = await t.bytes();\n        const totalNumBytes = vals.reduce((p2, c) => p2 + c.length, 0) + NUM_BYTES_STRING_LENGTH * vals.length;\n        const bytes = new Uint8Array(totalNumBytes);\n        let offset = 0;\n        for (let i2 = 0; i2 < vals.length; i2++) {\n          const val = vals[i2];\n          const bytesOfLength = new Uint8Array(new Uint32Array([val.length]).buffer);\n          bytes.set(bytesOfLength, offset);\n          offset += NUM_BYTES_STRING_LENGTH;\n          bytes.set(val, offset);\n          offset += val.length;\n        }\n        resolve(bytes);\n      });\n      dataPromises.push(utf8bytes);\n    } else {\n      dataPromises.push(t.data());\n    }\n    if (group != null) {\n      spec.group = group;\n    }\n    specs.push(spec);\n  }\n  const tensorValues = await Promise.all(dataPromises);\n  return { data: concatenateTypedArrays(tensorValues), specs };\n}\nfunction decodeWeights(buffer2, specs) {\n  const out = {};\n  let float16Decode;\n  let offset = 0;\n  for (const spec of specs) {\n    const name = spec.name;\n    const dtype = spec.dtype;\n    const shape = spec.shape;\n    const size = sizeFromShape(shape);\n    let values;\n    if (\"quantization\" in spec) {\n      const quantization = spec.quantization;\n      if (quantization.dtype === \"uint8\" || quantization.dtype === \"uint16\") {\n        if (!(\"min\" in quantization && \"scale\" in quantization)) {\n          throw new Error(`Weight ${spec.name} with quantization ${quantization.dtype} doesn't have corresponding metadata min and scale.`);\n        }\n      } else if (quantization.dtype === \"float16\") {\n        if (dtype !== \"float32\") {\n          throw new Error(`Weight ${spec.name} is quantized with ${quantization.dtype} which only supports weights of type float32 not ${dtype}.`);\n        }\n      } else {\n        throw new Error(`Weight ${spec.name} has unknown quantization dtype ${quantization.dtype}. Supported quantization dtypes are: 'uint8', 'uint16', and 'float16'.`);\n      }\n      const quantizationSizeFactor = DTYPE_VALUE_SIZE_MAP[quantization.dtype];\n      const byteBuffer = buffer2.slice(offset, offset + size * quantizationSizeFactor);\n      const quantizedArray = quantization.dtype === \"uint8\" ? new Uint8Array(byteBuffer) : new Uint16Array(byteBuffer);\n      if (dtype === \"float32\") {\n        if (quantization.dtype === \"uint8\" || quantization.dtype === \"uint16\") {\n          values = new Float32Array(quantizedArray.length);\n          for (let i = 0; i < quantizedArray.length; i++) {\n            const v = quantizedArray[i];\n            values[i] = v * quantization.scale + quantization.min;\n          }\n        } else if (quantization.dtype === \"float16\") {\n          if (float16Decode === void 0) {\n            float16Decode = getFloat16Decoder();\n          }\n          values = float16Decode(quantizedArray);\n        } else {\n          throw new Error(`Unsupported quantization type ${quantization.dtype} for weight type float32.`);\n        }\n      } else if (dtype === \"int32\") {\n        if (quantization.dtype !== \"uint8\" && quantization.dtype !== \"uint16\") {\n          throw new Error(`Unsupported quantization type ${quantization.dtype} for weight type int32.`);\n        }\n        values = new Int32Array(quantizedArray.length);\n        for (let i = 0; i < quantizedArray.length; i++) {\n          const v = quantizedArray[i];\n          values[i] = Math.round(v * quantization.scale + quantization.min);\n        }\n      } else {\n        throw new Error(`Unsupported dtype in weight '${name}': ${dtype}`);\n      }\n      offset += size * quantizationSizeFactor;\n    } else if (dtype === \"string\") {\n      const size2 = sizeFromShape(spec.shape);\n      values = [];\n      for (let i = 0; i < size2; i++) {\n        const byteLength = new Uint32Array(buffer2.slice(offset, offset + NUM_BYTES_STRING_LENGTH))[0];\n        offset += NUM_BYTES_STRING_LENGTH;\n        const bytes = new Uint8Array(buffer2.slice(offset, offset + byteLength));\n        values.push(bytes);\n        offset += byteLength;\n      }\n    } else {\n      const dtypeFactor = DTYPE_VALUE_SIZE_MAP[dtype];\n      const byteBuffer = buffer2.slice(offset, offset + size * dtypeFactor);\n      if (dtype === \"float32\") {\n        values = new Float32Array(byteBuffer);\n      } else if (dtype === \"int32\") {\n        values = new Int32Array(byteBuffer);\n      } else if (dtype === \"bool\") {\n        values = new Uint8Array(byteBuffer);\n      } else if (dtype === \"complex64\") {\n        values = new Float32Array(byteBuffer);\n        const real5 = new Float32Array(values.length / 2);\n        const image3 = new Float32Array(values.length / 2);\n        for (let i = 0; i < real5.length; i++) {\n          real5[i] = values[i * 2];\n          image3[i] = values[i * 2 + 1];\n        }\n        const realTensor = tensor(real5, shape, \"float32\");\n        const imageTensor = tensor(image3, shape, \"float32\");\n        out[name] = complex(realTensor, imageTensor);\n        realTensor.dispose();\n        imageTensor.dispose();\n      } else {\n        throw new Error(`Unsupported dtype in weight '${name}': ${dtype}`);\n      }\n      offset += size * dtypeFactor;\n    }\n    if (dtype !== \"complex64\") {\n      out[name] = tensor(values, shape, dtype);\n    }\n  }\n  return out;\n}\nfunction concatenateTypedArrays(xs) {\n  if (xs === null) {\n    throw new Error(`Invalid input value: ${JSON.stringify(xs)}`);\n  }\n  let totalByteLength = 0;\n  const normalizedXs = [];\n  xs.forEach((x) => {\n    totalByteLength += x.byteLength;\n    normalizedXs.push(x.byteLength === x.buffer.byteLength ? x : new x.constructor(x));\n    if (!(x instanceof Float32Array || x instanceof Int32Array || x instanceof Uint8Array)) {\n      throw new Error(`Unsupported TypedArray subtype: ${x.constructor.name}`);\n    }\n  });\n  const y = new Uint8Array(totalByteLength);\n  let offset = 0;\n  normalizedXs.forEach((x) => {\n    y.set(new Uint8Array(x.buffer), offset);\n    offset += x.byteLength;\n  });\n  return y.buffer;\n}\nvar useNodeBuffer = typeof Buffer !== \"undefined\" && (typeof Blob === \"undefined\" || typeof atob === \"undefined\" || typeof btoa === \"undefined\");\nfunction stringByteLength(str) {\n  if (useNodeBuffer) {\n    return Buffer.byteLength(str);\n  }\n  return new Blob([str]).size;\n}\nfunction arrayBufferToBase64String(buffer2) {\n  if (useNodeBuffer) {\n    return Buffer.from(buffer2).toString(\"base64\");\n  }\n  const buf = new Uint8Array(buffer2);\n  let s = \"\";\n  for (let i = 0, l = buf.length; i < l; i++) {\n    s += String.fromCharCode(buf[i]);\n  }\n  return btoa(s);\n}\nfunction base64StringToArrayBuffer(str) {\n  if (useNodeBuffer) {\n    const buf = Buffer.from(str, \"base64\");\n    return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);\n  }\n  const s = atob(str);\n  const buffer2 = new Uint8Array(s.length);\n  for (let i = 0; i < s.length; ++i) {\n    buffer2.set([s.charCodeAt(i)], i);\n  }\n  return buffer2.buffer;\n}\nfunction concatenateArrayBuffers(buffers) {\n  if (buffers.length === 1) {\n    return buffers[0];\n  }\n  let totalByteLength = 0;\n  buffers.forEach((buffer2) => {\n    totalByteLength += buffer2.byteLength;\n  });\n  const temp = new Uint8Array(totalByteLength);\n  let offset = 0;\n  buffers.forEach((buffer2) => {\n    temp.set(new Uint8Array(buffer2), offset);\n    offset += buffer2.byteLength;\n  });\n  return temp.buffer;\n}\nfunction basename(path) {\n  const SEPARATOR = \"/\";\n  path = path.trim();\n  while (path.endsWith(SEPARATOR)) {\n    path = path.slice(0, path.length - 1);\n  }\n  const items = path.split(SEPARATOR);\n  return items[items.length - 1];\n}\nfunction getModelJSONForModelArtifacts(artifacts, manifest) {\n  const result = {\n    modelTopology: artifacts.modelTopology,\n    format: artifacts.format,\n    generatedBy: artifacts.generatedBy,\n    convertedBy: artifacts.convertedBy,\n    weightsManifest: manifest\n  };\n  if (artifacts.signature != null) {\n    result.signature = artifacts.signature;\n  }\n  if (artifacts.userDefinedMetadata != null) {\n    result.userDefinedMetadata = artifacts.userDefinedMetadata;\n  }\n  if (artifacts.modelInitializer != null) {\n    result.modelInitializer = artifacts.modelInitializer;\n  }\n  if (artifacts.trainingConfig != null) {\n    result.trainingConfig = artifacts.trainingConfig;\n  }\n  return result;\n}\nasync function getModelArtifactsForJSON(modelJSON, loadWeights2) {\n  const modelArtifacts = {\n    modelTopology: modelJSON.modelTopology,\n    format: modelJSON.format,\n    generatedBy: modelJSON.generatedBy,\n    convertedBy: modelJSON.convertedBy\n  };\n  if (modelJSON.trainingConfig != null) {\n    modelArtifacts.trainingConfig = modelJSON.trainingConfig;\n  }\n  if (modelJSON.weightsManifest != null) {\n    const [weightSpecs, weightData] = await loadWeights2(modelJSON.weightsManifest);\n    modelArtifacts.weightSpecs = weightSpecs;\n    modelArtifacts.weightData = weightData;\n  }\n  if (modelJSON.signature != null) {\n    modelArtifacts.signature = modelJSON.signature;\n  }\n  if (modelJSON.userDefinedMetadata != null) {\n    modelArtifacts.userDefinedMetadata = modelJSON.userDefinedMetadata;\n  }\n  if (modelJSON.modelInitializer != null) {\n    modelArtifacts.modelInitializer = modelJSON.modelInitializer;\n  }\n  return modelArtifacts;\n}\nfunction getModelArtifactsInfoForJSON(modelArtifacts) {\n  if (modelArtifacts.modelTopology instanceof ArrayBuffer) {\n    throw new Error(\"Expected JSON model topology, received ArrayBuffer.\");\n  }\n  return {\n    dateSaved: new Date(),\n    modelTopologyType: \"JSON\",\n    modelTopologyBytes: modelArtifacts.modelTopology == null ? 0 : stringByteLength(JSON.stringify(modelArtifacts.modelTopology)),\n    weightSpecsBytes: modelArtifacts.weightSpecs == null ? 0 : stringByteLength(JSON.stringify(modelArtifacts.weightSpecs)),\n    weightDataBytes: modelArtifacts.weightData == null ? 0 : modelArtifacts.weightData.byteLength\n  };\n}\nfunction computeFloat16MantisaTable() {\n  const convertMantissa = (i) => {\n    let m = i << 13;\n    let e = 0;\n    while ((m & 8388608) === 0) {\n      e -= 8388608;\n      m <<= 1;\n    }\n    m &= ~8388608;\n    e += 947912704;\n    return m | e;\n  };\n  const mantisaTable = new Uint32Array(2048);\n  mantisaTable[0] = 0;\n  for (let i = 1; i < 1024; i++) {\n    mantisaTable[i] = convertMantissa(i);\n  }\n  for (let i = 1024; i < 2048; i++) {\n    mantisaTable[i] = 939524096 + (i - 1024 << 13);\n  }\n  return mantisaTable;\n}\nfunction computeFloat16ExponentTable() {\n  const exponentTable = new Uint32Array(64);\n  exponentTable[0] = 0;\n  exponentTable[31] = 1199570944;\n  exponentTable[32] = 2147483648;\n  exponentTable[63] = 3347054592;\n  for (let i = 1; i < 31; i++) {\n    exponentTable[i] = i << 23;\n  }\n  for (let i = 33; i < 63; i++) {\n    exponentTable[i] = 2147483648 + (i - 32 << 23);\n  }\n  return exponentTable;\n}\nfunction computeFloat16OffsetTable() {\n  const offsetTable = new Uint32Array(64);\n  for (let i = 0; i < 64; i++) {\n    offsetTable[i] = 1024;\n  }\n  offsetTable[0] = offsetTable[32] = 0;\n  return offsetTable;\n}\nfunction getFloat16Decoder() {\n  const mantisaTable = computeFloat16MantisaTable();\n  const exponentTable = computeFloat16ExponentTable();\n  const offsetTable = computeFloat16OffsetTable();\n  return (quantizedArray) => {\n    const buffer2 = new ArrayBuffer(4 * quantizedArray.length);\n    const bufferUint32View = new Uint32Array(buffer2);\n    for (let index = 0; index < quantizedArray.length; index++) {\n      const float16Bits = quantizedArray[index];\n      const float32Bits = mantisaTable[offsetTable[float16Bits >> 10] + (float16Bits & 1023)] + exponentTable[float16Bits >> 10];\n      bufferUint32View[index] = float32Bits;\n    }\n    return new Float32Array(buffer2);\n  };\n}\nvar IORouterRegistry = class {\n  constructor() {\n    this.saveRouters = [];\n    this.loadRouters = [];\n  }\n  static getInstance() {\n    if (IORouterRegistry.instance == null) {\n      IORouterRegistry.instance = new IORouterRegistry();\n    }\n    return IORouterRegistry.instance;\n  }\n  static registerSaveRouter(saveRouter) {\n    IORouterRegistry.getInstance().saveRouters.push(saveRouter);\n  }\n  static registerLoadRouter(loadRouter) {\n    IORouterRegistry.getInstance().loadRouters.push(loadRouter);\n  }\n  static getSaveHandlers(url) {\n    return IORouterRegistry.getHandlers(url, \"save\");\n  }\n  static getLoadHandlers(url, loadOptions) {\n    return IORouterRegistry.getHandlers(url, \"load\", loadOptions);\n  }\n  static getHandlers(url, handlerType, loadOptions) {\n    const validHandlers = [];\n    const routers = handlerType === \"load\" ? IORouterRegistry.getInstance().loadRouters : IORouterRegistry.getInstance().saveRouters;\n    routers.forEach((router) => {\n      const handler = router(url, loadOptions);\n      if (handler !== null) {\n        validHandlers.push(handler);\n      }\n    });\n    return validHandlers;\n  }\n};\nvar registerSaveRouter = (loudRouter) => IORouterRegistry.registerSaveRouter(loudRouter);\nvar registerLoadRouter = (loudRouter) => IORouterRegistry.registerLoadRouter(loudRouter);\nvar getSaveHandlers = (url) => IORouterRegistry.getSaveHandlers(url);\nvar getLoadHandlers = (url, loadOptions) => IORouterRegistry.getLoadHandlers(url, loadOptions);\nvar DATABASE_NAME = \"tensorflowjs\";\nvar DATABASE_VERSION = 1;\nvar MODEL_STORE_NAME = \"models_store\";\nvar INFO_STORE_NAME = \"model_info_store\";\nfunction getIndexedDBFactory() {\n  if (!env().getBool(\"IS_BROWSER\")) {\n    throw new Error(\"Failed to obtain IndexedDB factory because the current environmentis not a web browser.\");\n  }\n  const theWindow = typeof window === \"undefined\" ? self : window;\n  const factory = theWindow.indexedDB || theWindow.mozIndexedDB || theWindow.webkitIndexedDB || theWindow.msIndexedDB || theWindow.shimIndexedDB;\n  if (factory == null) {\n    throw new Error(\"The current browser does not appear to support IndexedDB.\");\n  }\n  return factory;\n}\nfunction setUpDatabase(openRequest) {\n  const db = openRequest.result;\n  db.createObjectStore(MODEL_STORE_NAME, { keyPath: \"modelPath\" });\n  db.createObjectStore(INFO_STORE_NAME, { keyPath: \"modelPath\" });\n}\nvar BrowserIndexedDB = class {\n  constructor(modelPath) {\n    this.indexedDB = getIndexedDBFactory();\n    if (modelPath == null || !modelPath) {\n      throw new Error(\"For IndexedDB, modelPath must not be null, undefined or empty.\");\n    }\n    this.modelPath = modelPath;\n  }\n  async save(modelArtifacts) {\n    if (modelArtifacts.modelTopology instanceof ArrayBuffer) {\n      throw new Error(\"BrowserLocalStorage.save() does not support saving model topology in binary formats yet.\");\n    }\n    return this.databaseAction(this.modelPath, modelArtifacts);\n  }\n  async load() {\n    return this.databaseAction(this.modelPath);\n  }\n  databaseAction(modelPath, modelArtifacts) {\n    return new Promise((resolve, reject) => {\n      const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION);\n      openRequest.onupgradeneeded = () => setUpDatabase(openRequest);\n      openRequest.onsuccess = () => {\n        const db = openRequest.result;\n        if (modelArtifacts == null) {\n          const modelTx = db.transaction(MODEL_STORE_NAME, \"readonly\");\n          const modelStore = modelTx.objectStore(MODEL_STORE_NAME);\n          const getRequest = modelStore.get(this.modelPath);\n          getRequest.onsuccess = () => {\n            if (getRequest.result == null) {\n              db.close();\n              return reject(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`));\n            } else {\n              resolve(getRequest.result.modelArtifacts);\n            }\n          };\n          getRequest.onerror = (error) => {\n            db.close();\n            return reject(getRequest.error);\n          };\n          modelTx.oncomplete = () => db.close();\n        } else {\n          const modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts);\n          const infoTx = db.transaction(INFO_STORE_NAME, \"readwrite\");\n          let infoStore = infoTx.objectStore(INFO_STORE_NAME);\n          const putInfoRequest = infoStore.put({ modelPath: this.modelPath, modelArtifactsInfo });\n          let modelTx;\n          putInfoRequest.onsuccess = () => {\n            modelTx = db.transaction(MODEL_STORE_NAME, \"readwrite\");\n            const modelStore = modelTx.objectStore(MODEL_STORE_NAME);\n            const putModelRequest = modelStore.put({\n              modelPath: this.modelPath,\n              modelArtifacts,\n              modelArtifactsInfo\n            });\n            putModelRequest.onsuccess = () => resolve({ modelArtifactsInfo });\n            putModelRequest.onerror = (error) => {\n              infoStore = infoTx.objectStore(INFO_STORE_NAME);\n              const deleteInfoRequest = infoStore.delete(this.modelPath);\n              deleteInfoRequest.onsuccess = () => {\n                db.close();\n                return reject(putModelRequest.error);\n              };\n              deleteInfoRequest.onerror = (error2) => {\n                db.close();\n                return reject(putModelRequest.error);\n              };\n            };\n          };\n          putInfoRequest.onerror = (error) => {\n            db.close();\n            return reject(putInfoRequest.error);\n          };\n          infoTx.oncomplete = () => {\n            if (modelTx == null) {\n              db.close();\n            } else {\n              modelTx.oncomplete = () => db.close();\n            }\n          };\n        }\n      };\n      openRequest.onerror = (error) => reject(openRequest.error);\n    });\n  }\n};\nBrowserIndexedDB.URL_SCHEME = \"indexeddb://\";\nvar indexedDBRouter = (url) => {\n  if (!env().getBool(\"IS_BROWSER\")) {\n    return null;\n  } else {\n    if (!Array.isArray(url) && url.startsWith(BrowserIndexedDB.URL_SCHEME)) {\n      return browserIndexedDB(url.slice(BrowserIndexedDB.URL_SCHEME.length));\n    } else {\n      return null;\n    }\n  }\n};\nIORouterRegistry.registerSaveRouter(indexedDBRouter);\nIORouterRegistry.registerLoadRouter(indexedDBRouter);\nfunction browserIndexedDB(modelPath) {\n  return new BrowserIndexedDB(modelPath);\n}\nfunction maybeStripScheme(key) {\n  return key.startsWith(BrowserIndexedDB.URL_SCHEME) ? key.slice(BrowserIndexedDB.URL_SCHEME.length) : key;\n}\nvar BrowserIndexedDBManager = class {\n  constructor() {\n    this.indexedDB = getIndexedDBFactory();\n  }\n  async listModels() {\n    return new Promise((resolve, reject) => {\n      const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION);\n      openRequest.onupgradeneeded = () => setUpDatabase(openRequest);\n      openRequest.onsuccess = () => {\n        const db = openRequest.result;\n        const tx = db.transaction(INFO_STORE_NAME, \"readonly\");\n        const store = tx.objectStore(INFO_STORE_NAME);\n        const getAllInfoRequest = store.getAll();\n        getAllInfoRequest.onsuccess = () => {\n          const out = {};\n          for (const item of getAllInfoRequest.result) {\n            out[item.modelPath] = item.modelArtifactsInfo;\n          }\n          resolve(out);\n        };\n        getAllInfoRequest.onerror = (error) => {\n          db.close();\n          return reject(getAllInfoRequest.error);\n        };\n        tx.oncomplete = () => db.close();\n      };\n      openRequest.onerror = (error) => reject(openRequest.error);\n    });\n  }\n  async removeModel(path) {\n    path = maybeStripScheme(path);\n    return new Promise((resolve, reject) => {\n      const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION);\n      openRequest.onupgradeneeded = () => setUpDatabase(openRequest);\n      openRequest.onsuccess = () => {\n        const db = openRequest.result;\n        const infoTx = db.transaction(INFO_STORE_NAME, \"readwrite\");\n        const infoStore = infoTx.objectStore(INFO_STORE_NAME);\n        const getInfoRequest = infoStore.get(path);\n        let modelTx;\n        getInfoRequest.onsuccess = () => {\n          if (getInfoRequest.result == null) {\n            db.close();\n            return reject(new Error(`Cannot find model with path '${path}' in IndexedDB.`));\n          } else {\n            const deleteInfoRequest = infoStore.delete(path);\n            const deleteModelData = () => {\n              modelTx = db.transaction(MODEL_STORE_NAME, \"readwrite\");\n              const modelStore = modelTx.objectStore(MODEL_STORE_NAME);\n              const deleteModelRequest = modelStore.delete(path);\n              deleteModelRequest.onsuccess = () => resolve(getInfoRequest.result.modelArtifactsInfo);\n              deleteModelRequest.onerror = (error) => reject(getInfoRequest.error);\n            };\n            deleteInfoRequest.onsuccess = deleteModelData;\n            deleteInfoRequest.onerror = (error) => {\n              deleteModelData();\n              db.close();\n              return reject(getInfoRequest.error);\n            };\n          }\n        };\n        getInfoRequest.onerror = (error) => {\n          db.close();\n          return reject(getInfoRequest.error);\n        };\n        infoTx.oncomplete = () => {\n          if (modelTx == null) {\n            db.close();\n          } else {\n            modelTx.oncomplete = () => db.close();\n          }\n        };\n      };\n      openRequest.onerror = (error) => reject(openRequest.error);\n    });\n  }\n};\nvar PATH_SEPARATOR = \"/\";\nvar PATH_PREFIX = \"tensorflowjs_models\";\nvar INFO_SUFFIX = \"info\";\nvar MODEL_TOPOLOGY_SUFFIX = \"model_topology\";\nvar WEIGHT_SPECS_SUFFIX = \"weight_specs\";\nvar WEIGHT_DATA_SUFFIX = \"weight_data\";\nvar MODEL_METADATA_SUFFIX = \"model_metadata\";\nfunction getModelKeys(path) {\n  return {\n    info: [PATH_PREFIX, path, INFO_SUFFIX].join(PATH_SEPARATOR),\n    topology: [PATH_PREFIX, path, MODEL_TOPOLOGY_SUFFIX].join(PATH_SEPARATOR),\n    weightSpecs: [PATH_PREFIX, path, WEIGHT_SPECS_SUFFIX].join(PATH_SEPARATOR),\n    weightData: [PATH_PREFIX, path, WEIGHT_DATA_SUFFIX].join(PATH_SEPARATOR),\n    modelMetadata: [PATH_PREFIX, path, MODEL_METADATA_SUFFIX].join(PATH_SEPARATOR)\n  };\n}\nfunction removeItems(keys) {\n  for (const key of Object.values(keys)) {\n    window.localStorage.removeItem(key);\n  }\n}\nfunction getModelPathFromKey(key) {\n  const items = key.split(PATH_SEPARATOR);\n  if (items.length < 3) {\n    throw new Error(`Invalid key format: ${key}`);\n  }\n  return items.slice(1, items.length - 1).join(PATH_SEPARATOR);\n}\nfunction maybeStripScheme2(key) {\n  return key.startsWith(BrowserLocalStorage.URL_SCHEME) ? key.slice(BrowserLocalStorage.URL_SCHEME.length) : key;\n}\nvar BrowserLocalStorage = class {\n  constructor(modelPath) {\n    if (!env().getBool(\"IS_BROWSER\") || typeof window === \"undefined\" || typeof window.localStorage === \"undefined\") {\n      throw new Error(\"The current environment does not support local storage.\");\n    }\n    this.LS = window.localStorage;\n    if (modelPath == null || !modelPath) {\n      throw new Error(\"For local storage, modelPath must not be null, undefined or empty.\");\n    }\n    this.modelPath = modelPath;\n    this.keys = getModelKeys(this.modelPath);\n  }\n  async save(modelArtifacts) {\n    if (modelArtifacts.modelTopology instanceof ArrayBuffer) {\n      throw new Error(\"BrowserLocalStorage.save() does not support saving model topology in binary formats yet.\");\n    } else {\n      const topology = JSON.stringify(modelArtifacts.modelTopology);\n      const weightSpecs = JSON.stringify(modelArtifacts.weightSpecs);\n      const modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts);\n      try {\n        this.LS.setItem(this.keys.info, JSON.stringify(modelArtifactsInfo));\n        this.LS.setItem(this.keys.topology, topology);\n        this.LS.setItem(this.keys.weightSpecs, weightSpecs);\n        this.LS.setItem(this.keys.weightData, arrayBufferToBase64String(modelArtifacts.weightData));\n        const metadata = {\n          format: modelArtifacts.format,\n          generatedBy: modelArtifacts.generatedBy,\n          convertedBy: modelArtifacts.convertedBy,\n          signature: modelArtifacts.signature != null ? modelArtifacts.signature : void 0,\n          userDefinedMetadata: modelArtifacts.userDefinedMetadata != null ? modelArtifacts.userDefinedMetadata : void 0,\n          modelInitializer: modelArtifacts.modelInitializer != null ? modelArtifacts.modelInitializer : void 0,\n          trainingConfig: modelArtifacts.trainingConfig != null ? modelArtifacts.trainingConfig : void 0\n        };\n        this.LS.setItem(this.keys.modelMetadata, JSON.stringify(metadata));\n        return { modelArtifactsInfo };\n      } catch (err) {\n        removeItems(this.keys);\n        throw new Error(`Failed to save model '${this.modelPath}' to local storage: size quota being exceeded is a possible cause of this failure: modelTopologyBytes=${modelArtifactsInfo.modelTopologyBytes}, weightSpecsBytes=${modelArtifactsInfo.weightSpecsBytes}, weightDataBytes=${modelArtifactsInfo.weightDataBytes}.`);\n      }\n    }\n  }\n  async load() {\n    const info = JSON.parse(this.LS.getItem(this.keys.info));\n    if (info == null) {\n      throw new Error(`In local storage, there is no model with name '${this.modelPath}'`);\n    }\n    if (info.modelTopologyType !== \"JSON\") {\n      throw new Error(\"BrowserLocalStorage does not support loading non-JSON model topology yet.\");\n    }\n    const out = {};\n    const topology = JSON.parse(this.LS.getItem(this.keys.topology));\n    if (topology == null) {\n      throw new Error(`In local storage, the topology of model '${this.modelPath}' is missing.`);\n    }\n    out.modelTopology = topology;\n    const weightSpecs = JSON.parse(this.LS.getItem(this.keys.weightSpecs));\n    if (weightSpecs == null) {\n      throw new Error(`In local storage, the weight specs of model '${this.modelPath}' are missing.`);\n    }\n    out.weightSpecs = weightSpecs;\n    const metadataString = this.LS.getItem(this.keys.modelMetadata);\n    if (metadataString != null) {\n      const metadata = JSON.parse(metadataString);\n      out.format = metadata.format;\n      out.generatedBy = metadata.generatedBy;\n      out.convertedBy = metadata.convertedBy;\n      if (metadata.signature != null) {\n        out.signature = metadata.signature;\n      }\n      if (metadata.userDefinedMetadata != null) {\n        out.userDefinedMetadata = metadata.userDefinedMetadata;\n      }\n      if (metadata.modelInitializer != null) {\n        out.modelInitializer = metadata.modelInitializer;\n      }\n      if (metadata.trainingConfig != null) {\n        out.trainingConfig = metadata.trainingConfig;\n      }\n    }\n    const weightDataBase64 = this.LS.getItem(this.keys.weightData);\n    if (weightDataBase64 == null) {\n      throw new Error(`In local storage, the binary weight values of model '${this.modelPath}' are missing.`);\n    }\n    out.weightData = base64StringToArrayBuffer(weightDataBase64);\n    return out;\n  }\n};\nBrowserLocalStorage.URL_SCHEME = \"localstorage://\";\nvar localStorageRouter = (url) => {\n  if (!env().getBool(\"IS_BROWSER\")) {\n    return null;\n  } else {\n    if (!Array.isArray(url) && url.startsWith(BrowserLocalStorage.URL_SCHEME)) {\n      return browserLocalStorage(url.slice(BrowserLocalStorage.URL_SCHEME.length));\n    } else {\n      return null;\n    }\n  }\n};\nIORouterRegistry.registerSaveRouter(localStorageRouter);\nIORouterRegistry.registerLoadRouter(localStorageRouter);\nfunction browserLocalStorage(modelPath) {\n  return new BrowserLocalStorage(modelPath);\n}\nvar BrowserLocalStorageManager = class {\n  constructor() {\n    assert(env().getBool(\"IS_BROWSER\"), () => \"Current environment is not a web browser\");\n    assert(typeof window === \"undefined\" || typeof window.localStorage !== \"undefined\", () => \"Current browser does not appear to support localStorage\");\n    this.LS = window.localStorage;\n  }\n  async listModels() {\n    const out = {};\n    const prefix = PATH_PREFIX + PATH_SEPARATOR;\n    const suffix = PATH_SEPARATOR + INFO_SUFFIX;\n    for (let i = 0; i < this.LS.length; ++i) {\n      const key = this.LS.key(i);\n      if (key.startsWith(prefix) && key.endsWith(suffix)) {\n        const modelPath = getModelPathFromKey(key);\n        out[modelPath] = JSON.parse(this.LS.getItem(key));\n      }\n    }\n    return out;\n  }\n  async removeModel(path) {\n    path = maybeStripScheme2(path);\n    const keys = getModelKeys(path);\n    if (this.LS.getItem(keys.info) == null) {\n      throw new Error(`Cannot find model at path '${path}'`);\n    }\n    const info = JSON.parse(this.LS.getItem(keys.info));\n    removeItems(keys);\n    return info;\n  }\n};\nvar URL_SCHEME_SUFFIX = \"://\";\nvar ModelStoreManagerRegistry = class {\n  constructor() {\n    this.managers = {};\n  }\n  static getInstance() {\n    if (ModelStoreManagerRegistry.instance == null) {\n      ModelStoreManagerRegistry.instance = new ModelStoreManagerRegistry();\n    }\n    return ModelStoreManagerRegistry.instance;\n  }\n  static registerManager(scheme, manager) {\n    assert(scheme != null, () => \"scheme must not be undefined or null.\");\n    if (scheme.endsWith(URL_SCHEME_SUFFIX)) {\n      scheme = scheme.slice(0, scheme.indexOf(URL_SCHEME_SUFFIX));\n    }\n    assert(scheme.length > 0, () => \"scheme must not be an empty string.\");\n    const registry = ModelStoreManagerRegistry.getInstance();\n    assert(registry.managers[scheme] == null, () => `A model store manager is already registered for scheme '${scheme}'.`);\n    registry.managers[scheme] = manager;\n  }\n  static getManager(scheme) {\n    const manager = this.getInstance().managers[scheme];\n    if (manager == null) {\n      throw new Error(`Cannot find model manager for scheme '${scheme}'`);\n    }\n    return manager;\n  }\n  static getSchemes() {\n    return Object.keys(this.getInstance().managers);\n  }\n};\nfunction parseURL(url) {\n  if (url.indexOf(URL_SCHEME_SUFFIX) === -1) {\n    throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${ModelStoreManagerRegistry.getSchemes().join(\",\")}`);\n  }\n  return {\n    scheme: url.split(URL_SCHEME_SUFFIX)[0],\n    path: url.split(URL_SCHEME_SUFFIX)[1]\n  };\n}\nasync function cloneModelInternal(sourceURL, destURL, deleteSource = false) {\n  assert(sourceURL !== destURL, () => `Old path and new path are the same: '${sourceURL}'`);\n  const loadHandlers = IORouterRegistry.getLoadHandlers(sourceURL);\n  assert(loadHandlers.length > 0, () => `Copying failed because no load handler is found for source URL ${sourceURL}.`);\n  assert(loadHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) load handlers for source URL ${sourceURL}.`);\n  const loadHandler = loadHandlers[0];\n  const saveHandlers = IORouterRegistry.getSaveHandlers(destURL);\n  assert(saveHandlers.length > 0, () => `Copying failed because no save handler is found for destination URL ${destURL}.`);\n  assert(saveHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) save handlers for destination URL ${destURL}.`);\n  const saveHandler = saveHandlers[0];\n  const sourceScheme = parseURL(sourceURL).scheme;\n  const sourcePath = parseURL(sourceURL).path;\n  const sameMedium = sourceScheme === parseURL(sourceURL).scheme;\n  const modelArtifacts = await loadHandler.load();\n  if (deleteSource && sameMedium) {\n    await ModelStoreManagerRegistry.getManager(sourceScheme).removeModel(sourcePath);\n  }\n  const saveResult = await saveHandler.save(modelArtifacts);\n  if (deleteSource && !sameMedium) {\n    await ModelStoreManagerRegistry.getManager(sourceScheme).removeModel(sourcePath);\n  }\n  return saveResult.modelArtifactsInfo;\n}\nasync function listModels() {\n  const schemes = ModelStoreManagerRegistry.getSchemes();\n  const out = {};\n  for (const scheme of schemes) {\n    const schemeOut = await ModelStoreManagerRegistry.getManager(scheme).listModels();\n    for (const path in schemeOut) {\n      const url = scheme + URL_SCHEME_SUFFIX + path;\n      out[url] = schemeOut[path];\n    }\n  }\n  return out;\n}\nasync function removeModel(url) {\n  const schemeAndPath = parseURL(url);\n  const manager = ModelStoreManagerRegistry.getManager(schemeAndPath.scheme);\n  return manager.removeModel(schemeAndPath.path);\n}\nasync function copyModel(sourceURL, destURL) {\n  const deleteSource = false;\n  return cloneModelInternal(sourceURL, destURL, deleteSource);\n}\nasync function moveModel(sourceURL, destURL) {\n  const deleteSource = true;\n  return cloneModelInternal(sourceURL, destURL, deleteSource);\n}\nvar PlatformBrowser = class {\n  fetch(path, init2) {\n    return fetch(path, init2);\n  }\n  now() {\n    return performance.now();\n  }\n  encode(text, encoding) {\n    if (encoding !== \"utf-8\" && encoding !== \"utf8\") {\n      throw new Error(`Browser's encoder only supports utf-8, but got ${encoding}`);\n    }\n    if (this.textEncoder == null) {\n      this.textEncoder = new TextEncoder();\n    }\n    return this.textEncoder.encode(text);\n  }\n  decode(bytes, encoding) {\n    return new TextDecoder(encoding).decode(bytes);\n  }\n};\nif (env().get(\"IS_BROWSER\")) {\n  env().setPlatform(\"browser\", new PlatformBrowser());\n  try {\n    ModelStoreManagerRegistry.registerManager(BrowserLocalStorage.URL_SCHEME, new BrowserLocalStorageManager());\n  } catch (err) {\n  }\n  try {\n    ModelStoreManagerRegistry.registerManager(BrowserIndexedDB.URL_SCHEME, new BrowserIndexedDBManager());\n  } catch (err) {\n  }\n}\nvar getNodeFetch = {\n  importFetch: () => require_node_fetch()\n};\nvar systemFetch;\nvar PlatformNode = class {\n  constructor() {\n    this.util = require_util();\n    this.textEncoder = new this.util.TextEncoder();\n  }\n  fetch(path, requestInits) {\n    if (env().global.fetch != null) {\n      return env().global.fetch(path, requestInits);\n    }\n    if (systemFetch == null) {\n      systemFetch = getNodeFetch.importFetch();\n    }\n    return systemFetch(path, requestInits);\n  }\n  now() {\n    const time2 = process.hrtime();\n    return time2[0] * 1e3 + time2[1] / 1e6;\n  }\n  encode(text, encoding) {\n    if (encoding !== \"utf-8\" && encoding !== \"utf8\") {\n      throw new Error(`Node built-in encoder only supports utf-8, but got ${encoding}`);\n    }\n    return this.textEncoder.encode(text);\n  }\n  decode(bytes, encoding) {\n    if (bytes.length === 0) {\n      return \"\";\n    }\n    return new this.util.TextDecoder(encoding).decode(bytes);\n  }\n};\nif (env().get(\"IS_NODE\")) {\n  env().setPlatform(\"node\", new PlatformNode());\n}\nfunction buffer(shape, dtype = \"float32\", values) {\n  dtype = dtype || \"float32\";\n  assertNonNegativeIntegerDimensions(shape);\n  return new TensorBuffer(shape, dtype, values);\n}\nfunction cast_(x, dtype) {\n  const $x = convertToTensor(x, \"x\", \"cast\");\n  if (!isValidDtype(dtype)) {\n    throw new Error(`Failed to cast to unknown dtype ${dtype}`);\n  }\n  if (dtype === \"string\" && $x.dtype !== \"string\" || dtype !== \"string\" && $x.dtype === \"string\") {\n    throw new Error(\"Only strings can be casted to strings\");\n  }\n  const inputs = { x: $x };\n  const attrs = { dtype };\n  return ENGINE.runKernel(Cast, inputs, attrs);\n}\nvar cast = op({ cast_ });\nfunction clone_(x) {\n  const $x = convertToTensor(x, \"x\", \"clone\", \"string_or_numeric\");\n  const inputs = { x: $x };\n  return ENGINE.runKernel(Identity, inputs);\n}\nvar clone = op({ clone_ });\nfunction print2(x, verbose = false) {\n  console.log(x.toString(verbose));\n}\ngetOrMakeEngine();\nvar opHandler2 = {\n  buffer,\n  cast,\n  clone,\n  print: print2\n};\nsetOpHandler(opHandler2);\nvar io_exports = {};\n__export(io_exports, {\n  browserFiles: () => browserFiles,\n  browserHTTPRequest: () => browserHTTPRequest,\n  concatenateArrayBuffers: () => concatenateArrayBuffers,\n  copyModel: () => copyModel,\n  decodeWeights: () => decodeWeights,\n  encodeWeights: () => encodeWeights,\n  fromMemory: () => fromMemory,\n  getLoadHandlers: () => getLoadHandlers,\n  getModelArtifactsForJSON: () => getModelArtifactsForJSON,\n  getModelArtifactsInfoForJSON: () => getModelArtifactsInfoForJSON,\n  getSaveHandlers: () => getSaveHandlers,\n  http: () => http,\n  isHTTPScheme: () => isHTTPScheme,\n  listModels: () => listModels,\n  loadWeights: () => loadWeights,\n  moveModel: () => moveModel,\n  registerLoadRouter: () => registerLoadRouter,\n  registerSaveRouter: () => registerSaveRouter,\n  removeModel: () => removeModel,\n  weightsLoaderFactory: () => weightsLoaderFactory,\n  withSaveHandler: () => withSaveHandler\n});\nvar DEFAULT_FILE_NAME_PREFIX = \"model\";\nvar DEFAULT_JSON_EXTENSION_NAME = \".json\";\nvar DEFAULT_WEIGHT_DATA_EXTENSION_NAME = \".weights.bin\";\nfunction defer(f) {\n  return new Promise((resolve) => setTimeout(resolve)).then(f);\n}\nvar _BrowserDownloads = class {\n  constructor(fileNamePrefix) {\n    if (!env().getBool(\"IS_BROWSER\")) {\n      throw new Error(\"browserDownloads() cannot proceed because the current environment is not a browser.\");\n    }\n    if (fileNamePrefix.startsWith(_BrowserDownloads.URL_SCHEME)) {\n      fileNamePrefix = fileNamePrefix.slice(_BrowserDownloads.URL_SCHEME.length);\n    }\n    if (fileNamePrefix == null || fileNamePrefix.length === 0) {\n      fileNamePrefix = DEFAULT_FILE_NAME_PREFIX;\n    }\n    this.modelJsonFileName = fileNamePrefix + DEFAULT_JSON_EXTENSION_NAME;\n    this.weightDataFileName = fileNamePrefix + DEFAULT_WEIGHT_DATA_EXTENSION_NAME;\n  }\n  async save(modelArtifacts) {\n    if (typeof document === \"undefined\") {\n      throw new Error(\"Browser downloads are not supported in this environment since `document` is not present\");\n    }\n    const weightsURL = window.URL.createObjectURL(new Blob([modelArtifacts.weightData], { type: \"application/octet-stream\" }));\n    if (modelArtifacts.modelTopology instanceof ArrayBuffer) {\n      throw new Error(\"BrowserDownloads.save() does not support saving model topology in binary formats yet.\");\n    } else {\n      const weightsManifest = [{\n        paths: [\"./\" + this.weightDataFileName],\n        weights: modelArtifacts.weightSpecs\n      }];\n      const modelJSON = getModelJSONForModelArtifacts(modelArtifacts, weightsManifest);\n      const modelJsonURL = window.URL.createObjectURL(new Blob([JSON.stringify(modelJSON)], { type: \"application/json\" }));\n      const jsonAnchor = this.modelJsonAnchor == null ? document.createElement(\"a\") : this.modelJsonAnchor;\n      jsonAnchor.download = this.modelJsonFileName;\n      jsonAnchor.href = modelJsonURL;\n      await defer(() => jsonAnchor.dispatchEvent(new MouseEvent(\"click\")));\n      if (modelArtifacts.weightData != null) {\n        const weightDataAnchor = this.weightDataAnchor == null ? document.createElement(\"a\") : this.weightDataAnchor;\n        weightDataAnchor.download = this.weightDataFileName;\n        weightDataAnchor.href = weightsURL;\n        await defer(() => weightDataAnchor.dispatchEvent(new MouseEvent(\"click\")));\n      }\n      return { modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts) };\n    }\n  }\n};\nvar BrowserDownloads = _BrowserDownloads;\nBrowserDownloads.URL_SCHEME = \"downloads://\";\nvar BrowserFiles = class {\n  constructor(files) {\n    if (files == null || files.length < 1) {\n      throw new Error(`When calling browserFiles, at least 1 file is required, but received ${files}`);\n    }\n    this.jsonFile = files[0];\n    this.weightsFiles = files.slice(1);\n  }\n  async load() {\n    return new Promise((resolve, reject) => {\n      const jsonReader = new FileReader();\n      jsonReader.onload = (event) => {\n        const modelJSON = JSON.parse(event.target.result);\n        const modelTopology = modelJSON.modelTopology;\n        if (modelTopology == null) {\n          reject(new Error(`modelTopology field is missing from file ${this.jsonFile.name}`));\n          return;\n        }\n        const weightsManifest = modelJSON.weightsManifest;\n        if (weightsManifest == null) {\n          reject(new Error(`weightManifest field is missing from file ${this.jsonFile.name}`));\n          return;\n        }\n        if (this.weightsFiles.length === 0) {\n          resolve({ modelTopology });\n          return;\n        }\n        const modelArtifactsPromise = getModelArtifactsForJSON(modelJSON, (weightsManifest2) => this.loadWeights(weightsManifest2));\n        resolve(modelArtifactsPromise);\n      };\n      jsonReader.onerror = (error) => reject(`Failed to read model topology and weights manifest JSON from file '${this.jsonFile.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`);\n      jsonReader.readAsText(this.jsonFile);\n    });\n  }\n  loadWeights(weightsManifest) {\n    const weightSpecs = [];\n    const paths = [];\n    for (const entry of weightsManifest) {\n      weightSpecs.push(...entry.weights);\n      paths.push(...entry.paths);\n    }\n    const pathToFile = this.checkManifestAndWeightFiles(weightsManifest);\n    const promises = paths.map((path) => this.loadWeightsFile(path, pathToFile[path]));\n    return Promise.all(promises).then((buffers) => [weightSpecs, concatenateArrayBuffers(buffers)]);\n  }\n  loadWeightsFile(path, file) {\n    return new Promise((resolve, reject) => {\n      const weightFileReader = new FileReader();\n      weightFileReader.onload = (event) => {\n        const weightData = event.target.result;\n        resolve(weightData);\n      };\n      weightFileReader.onerror = (error) => reject(`Failed to weights data from file of path '${path}'.`);\n      weightFileReader.readAsArrayBuffer(file);\n    });\n  }\n  checkManifestAndWeightFiles(manifest) {\n    const basenames = [];\n    const fileNames = this.weightsFiles.map((file) => basename(file.name));\n    const pathToFile = {};\n    for (const group of manifest) {\n      group.paths.forEach((path) => {\n        const pathBasename = basename(path);\n        if (basenames.indexOf(pathBasename) !== -1) {\n          throw new Error(`Duplicate file basename found in weights manifest: '${pathBasename}'`);\n        }\n        basenames.push(pathBasename);\n        if (fileNames.indexOf(pathBasename) === -1) {\n          throw new Error(`Weight file with basename '${pathBasename}' is not provided.`);\n        } else {\n          pathToFile[path] = this.weightsFiles[fileNames.indexOf(pathBasename)];\n        }\n      });\n    }\n    if (basenames.length !== this.weightsFiles.length) {\n      throw new Error(`Mismatch in the number of files in weights manifest (${basenames.length}) and the number of weight files provided (${this.weightsFiles.length}).`);\n    }\n    return pathToFile;\n  }\n};\nvar browserDownloadsRouter = (url) => {\n  if (!env().getBool(\"IS_BROWSER\")) {\n    return null;\n  } else {\n    if (!Array.isArray(url) && url.startsWith(BrowserDownloads.URL_SCHEME)) {\n      return browserDownloads(url.slice(BrowserDownloads.URL_SCHEME.length));\n    } else {\n      return null;\n    }\n  }\n};\nIORouterRegistry.registerSaveRouter(browserDownloadsRouter);\nfunction browserDownloads(fileNamePrefix = \"model\") {\n  return new BrowserDownloads(fileNamePrefix);\n}\nfunction browserFiles(files) {\n  return new BrowserFiles(files);\n}\nfunction monitorPromisesProgress(promises, onProgress, startFraction, endFraction) {\n  checkPromises(promises);\n  startFraction = startFraction == null ? 0 : startFraction;\n  endFraction = endFraction == null ? 1 : endFraction;\n  checkFraction(startFraction, endFraction);\n  let resolvedPromise = 0;\n  const registerMonitor = (promise) => {\n    promise.then((value) => {\n      const fraction = startFraction + ++resolvedPromise / promises.length * (endFraction - startFraction);\n      onProgress(fraction);\n      return value;\n    });\n    return promise;\n  };\n  function checkPromises(promises2) {\n    assert(promises2 != null && Array.isArray(promises2) && promises2.length > 0, () => \"promises must be a none empty array\");\n  }\n  function checkFraction(startFraction2, endFraction2) {\n    assert(startFraction2 >= 0 && startFraction2 <= 1, () => `Progress fraction must be in range [0, 1], but got startFraction ${startFraction2}`);\n    assert(endFraction2 >= 0 && endFraction2 <= 1, () => `Progress fraction must be in range [0, 1], but got endFraction ${endFraction2}`);\n    assert(endFraction2 >= startFraction2, () => `startFraction must be no more than endFraction, but got startFraction ${startFraction2} and endFraction ${endFraction2}`);\n  }\n  return Promise.all(promises.map(registerMonitor));\n}\nasync function loadWeightsAsArrayBuffer(fetchURLs, loadOptions) {\n  if (loadOptions == null) {\n    loadOptions = {};\n  }\n  const fetchFunc = loadOptions.fetchFunc == null ? env().platform.fetch : loadOptions.fetchFunc;\n  const requests = fetchURLs.map((fetchURL) => fetchFunc(fetchURL, loadOptions.requestInit, { isBinary: true }));\n  const fetchStartFraction = 0;\n  const fetchEndFraction = 0.5;\n  const responses = loadOptions.onProgress == null ? await Promise.all(requests) : await monitorPromisesProgress(requests, loadOptions.onProgress, fetchStartFraction, fetchEndFraction);\n  const bufferPromises = responses.map((response) => response.arrayBuffer());\n  const bufferStartFraction = 0.5;\n  const bufferEndFraction = 1;\n  const buffers = loadOptions.onProgress == null ? await Promise.all(bufferPromises) : await monitorPromisesProgress(bufferPromises, loadOptions.onProgress, bufferStartFraction, bufferEndFraction);\n  return buffers;\n}\nasync function loadWeights(manifest, filePathPrefix = \"\", weightNames, requestInit) {\n  const fetchWeights = (fetchUrls) => loadWeightsAsArrayBuffer(fetchUrls, { requestInit });\n  const loadWeights2 = weightsLoaderFactory(fetchWeights);\n  return loadWeights2(manifest, filePathPrefix, weightNames);\n}\nfunction weightsLoaderFactory(fetchWeightsFunction) {\n  return async (manifest, filePathPrefix = \"\", weightNames) => {\n    const groupIndicesToFetchMap = manifest.map(() => false);\n    const groupWeightsToFetch = {};\n    const weightsFound = weightNames != null ? weightNames.map(() => false) : [];\n    const allManifestWeightNames = [];\n    manifest.forEach((manifestGroupConfig, groupIndex) => {\n      let groupOffset = 0;\n      manifestGroupConfig.weights.forEach((weightsEntry) => {\n        const rawDtype = \"quantization\" in weightsEntry ? weightsEntry.quantization.dtype : weightsEntry.dtype;\n        const weightsBytes = DTYPE_VALUE_SIZE_MAP[rawDtype] * sizeFromShape(weightsEntry.shape);\n        const enqueueWeightsForFetchingFn = () => {\n          groupIndicesToFetchMap[groupIndex] = true;\n          if (groupWeightsToFetch[groupIndex] == null) {\n            groupWeightsToFetch[groupIndex] = [];\n          }\n          groupWeightsToFetch[groupIndex].push({\n            manifestEntry: weightsEntry,\n            groupOffset,\n            sizeBytes: weightsBytes\n          });\n        };\n        if (weightNames != null) {\n          weightNames.forEach((weightName, weightIndex) => {\n            if (weightName === weightsEntry.name) {\n              enqueueWeightsForFetchingFn();\n              weightsFound[weightIndex] = true;\n            }\n          });\n        } else {\n          enqueueWeightsForFetchingFn();\n        }\n        allManifestWeightNames.push(weightsEntry.name);\n        groupOffset += weightsBytes;\n      });\n    });\n    if (!weightsFound.every((found) => found)) {\n      const weightsNotFound = weightNames.filter((_, i) => !weightsFound[i]);\n      throw new Error(`Could not find weights in manifest with names: ${weightsNotFound.join(\", \")}. \nManifest JSON has weights with names: ${allManifestWeightNames.join(\", \")}.`);\n    }\n    const groupIndicesToFetch = groupIndicesToFetchMap.reduce((accumulator, shouldFetch, i) => {\n      if (shouldFetch) {\n        accumulator.push(i);\n      }\n      return accumulator;\n    }, []);\n    const fetchUrls = [];\n    groupIndicesToFetch.forEach((i) => {\n      manifest[i].paths.forEach((filepath) => {\n        const fetchUrl = filePathPrefix + (!filePathPrefix.endsWith(\"/\") ? \"/\" : \"\") + filepath;\n        fetchUrls.push(fetchUrl);\n      });\n    });\n    const buffers = await fetchWeightsFunction(fetchUrls);\n    const weightsTensorMap = {};\n    let bufferIndexOffset = 0;\n    groupIndicesToFetch.forEach((i) => {\n      const numBuffers = manifest[i].paths.length;\n      let groupBytes = 0;\n      for (let i2 = 0; i2 < numBuffers; i2++) {\n        groupBytes += buffers[bufferIndexOffset + i2].byteLength;\n      }\n      const groupBuffer = new ArrayBuffer(groupBytes);\n      const groupByteBuffer = new Uint8Array(groupBuffer);\n      let groupBufferOffset = 0;\n      for (let i2 = 0; i2 < numBuffers; i2++) {\n        const buffer2 = new Uint8Array(buffers[bufferIndexOffset + i2]);\n        groupByteBuffer.set(buffer2, groupBufferOffset);\n        groupBufferOffset += buffer2.byteLength;\n      }\n      const weightsEntries = groupWeightsToFetch[i];\n      weightsEntries.forEach((weightsEntry) => {\n        const byteBuffer = groupBuffer.slice(weightsEntry.groupOffset, weightsEntry.groupOffset + weightsEntry.sizeBytes);\n        const nameToTensorMap = decodeWeights(byteBuffer, [weightsEntry.manifestEntry]);\n        for (const name in nameToTensorMap) {\n          weightsTensorMap[name] = nameToTensorMap[name];\n        }\n      });\n      bufferIndexOffset += numBuffers;\n    });\n    return weightsTensorMap;\n  };\n}\nvar OCTET_STREAM_MIME_TYPE = \"application/octet-stream\";\nvar JSON_TYPE = \"application/json\";\nvar HTTPRequest = class {\n  constructor(path, loadOptions) {\n    this.DEFAULT_METHOD = \"POST\";\n    if (loadOptions == null) {\n      loadOptions = {};\n    }\n    this.weightPathPrefix = loadOptions.weightPathPrefix;\n    this.onProgress = loadOptions.onProgress;\n    this.weightUrlConverter = loadOptions.weightUrlConverter;\n    if (loadOptions.fetchFunc != null) {\n      assert(typeof loadOptions.fetchFunc === \"function\", () => \"Must pass a function that matches the signature of `fetch` (see https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)\");\n      this.fetch = loadOptions.fetchFunc;\n    } else {\n      this.fetch = env().platform.fetch;\n    }\n    assert(path != null && path.length > 0, () => \"URL path for http must not be null, undefined or empty.\");\n    if (Array.isArray(path)) {\n      assert(path.length === 2, () => `URL paths for http must have a length of 2, (actual length is ${path.length}).`);\n    }\n    this.path = path;\n    if (loadOptions.requestInit != null && loadOptions.requestInit.body != null) {\n      throw new Error(\"requestInit is expected to have no pre-existing body, but has one.\");\n    }\n    this.requestInit = loadOptions.requestInit || {};\n  }\n  async save(modelArtifacts) {\n    if (modelArtifacts.modelTopology instanceof ArrayBuffer) {\n      throw new Error(\"BrowserHTTPRequest.save() does not support saving model topology in binary formats yet.\");\n    }\n    const init2 = Object.assign({ method: this.DEFAULT_METHOD }, this.requestInit);\n    init2.body = new FormData();\n    const weightsManifest = [{\n      paths: [\"./model.weights.bin\"],\n      weights: modelArtifacts.weightSpecs\n    }];\n    const modelTopologyAndWeightManifest = getModelJSONForModelArtifacts(modelArtifacts, weightsManifest);\n    init2.body.append(\"model.json\", new Blob([JSON.stringify(modelTopologyAndWeightManifest)], { type: JSON_TYPE }), \"model.json\");\n    if (modelArtifacts.weightData != null) {\n      init2.body.append(\"model.weights.bin\", new Blob([modelArtifacts.weightData], { type: OCTET_STREAM_MIME_TYPE }), \"model.weights.bin\");\n    }\n    const response = await this.fetch(this.path, init2);\n    if (response.ok) {\n      return {\n        modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts),\n        responses: [response]\n      };\n    } else {\n      throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${response.status}.`);\n    }\n  }\n  async load() {\n    const modelConfigRequest = await this.fetch(this.path, this.requestInit);\n    if (!modelConfigRequest.ok) {\n      throw new Error(`Request to ${this.path} failed with status code ${modelConfigRequest.status}. Please verify this URL points to the model JSON of the model to load.`);\n    }\n    let modelJSON;\n    try {\n      modelJSON = await modelConfigRequest.json();\n    } catch (e) {\n      let message = `Failed to parse model JSON of response from ${this.path}.`;\n      if (this.path.endsWith(\".pb\")) {\n        message += \" Your path contains a .pb file extension. Support for .pb models have been removed in TensorFlow.js 1.0 in favor of .json models. You can re-convert your Python TensorFlow model using the TensorFlow.js 1.0 conversion scripts or you can convert your.pb models with the 'pb2json'NPM script in the tensorflow/tfjs-converter repository.\";\n      } else {\n        message += \" Please make sure the server is serving valid JSON for this request.\";\n      }\n      throw new Error(message);\n    }\n    const modelTopology = modelJSON.modelTopology;\n    const weightsManifest = modelJSON.weightsManifest;\n    if (modelTopology == null && weightsManifest == null) {\n      throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`);\n    }\n    return getModelArtifactsForJSON(modelJSON, (weightsManifest2) => this.loadWeights(weightsManifest2));\n  }\n  async loadWeights(weightsManifest) {\n    const weightPath = Array.isArray(this.path) ? this.path[1] : this.path;\n    const [prefix, suffix] = parseUrl(weightPath);\n    const pathPrefix = this.weightPathPrefix || prefix;\n    const weightSpecs = [];\n    for (const entry of weightsManifest) {\n      weightSpecs.push(...entry.weights);\n    }\n    const fetchURLs = [];\n    const urlPromises = [];\n    for (const weightsGroup of weightsManifest) {\n      for (const path of weightsGroup.paths) {\n        if (this.weightUrlConverter != null) {\n          urlPromises.push(this.weightUrlConverter(path));\n        } else {\n          fetchURLs.push(pathPrefix + path + suffix);\n        }\n      }\n    }\n    if (this.weightUrlConverter) {\n      fetchURLs.push(...await Promise.all(urlPromises));\n    }\n    const buffers = await loadWeightsAsArrayBuffer(fetchURLs, {\n      requestInit: this.requestInit,\n      fetchFunc: this.fetch,\n      onProgress: this.onProgress\n    });\n    return [weightSpecs, concatenateArrayBuffers(buffers)];\n  }\n};\nHTTPRequest.URL_SCHEME_REGEX = /^https?:\\/\\//;\nfunction parseUrl(url) {\n  const lastSlash = url.lastIndexOf(\"/\");\n  const lastSearchParam = url.lastIndexOf(\"?\");\n  const prefix = url.substring(0, lastSlash);\n  const suffix = lastSearchParam > lastSlash ? url.substring(lastSearchParam) : \"\";\n  return [prefix + \"/\", suffix];\n}\nfunction isHTTPScheme(url) {\n  return url.match(HTTPRequest.URL_SCHEME_REGEX) != null;\n}\nvar httpRouter = (url, loadOptions) => {\n  if (typeof fetch === \"undefined\" && (loadOptions == null || loadOptions.fetchFunc == null)) {\n    return null;\n  } else {\n    let isHTTP = true;\n    if (Array.isArray(url)) {\n      isHTTP = url.every((urlItem) => isHTTPScheme(urlItem));\n    } else {\n      isHTTP = isHTTPScheme(url);\n    }\n    if (isHTTP) {\n      return http(url, loadOptions);\n    }\n  }\n  return null;\n};\nIORouterRegistry.registerSaveRouter(httpRouter);\nIORouterRegistry.registerLoadRouter(httpRouter);\nfunction http(path, loadOptions) {\n  return new HTTPRequest(path, loadOptions);\n}\nfunction browserHTTPRequest(path, loadOptions) {\n  return http(path, loadOptions);\n}\nvar PassthroughLoader = class {\n  constructor(modelArtifacts) {\n    this.modelArtifacts = modelArtifacts;\n  }\n  async load() {\n    return this.modelArtifacts;\n  }\n};\nvar PassthroughSaver = class {\n  constructor(saveHandler) {\n    this.saveHandler = saveHandler;\n  }\n  async save(modelArtifacts) {\n    return this.saveHandler(modelArtifacts);\n  }\n};\nfunction fromMemory(modelArtifacts, weightSpecs, weightData, trainingConfig) {\n  if (arguments.length === 1) {\n    const isModelArtifacts = modelArtifacts.modelTopology != null || modelArtifacts.weightSpecs != null;\n    if (isModelArtifacts) {\n      return new PassthroughLoader(modelArtifacts);\n    } else {\n      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.\");\n      return new PassthroughLoader({ modelTopology: modelArtifacts });\n    }\n  } else {\n    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.\");\n    return new PassthroughLoader({\n      modelTopology: modelArtifacts,\n      weightSpecs,\n      weightData,\n      trainingConfig\n    });\n  }\n}\nfunction withSaveHandler(saveHandler) {\n  return new PassthroughSaver(saveHandler);\n}\nvar math_exports = {};\n__export(math_exports, {\n  confusionMatrix: () => confusionMatrix\n});\nfunction matMul_(a, b, transposeA = false, transposeB = false) {\n  let $a = convertToTensor(a, \"a\", \"matMul\");\n  let $b = convertToTensor(b, \"b\", \"matMul\");\n  [$a, $b] = makeTypesMatch($a, $b);\n  const inputs = { a: $a, b: $b };\n  const attrs = { transposeA, transposeB };\n  return ENGINE.runKernel(BatchMatMul, inputs, attrs);\n}\nvar matMul = op({ matMul_ });\nfunction oneHot_(indices, depth, onValue = 1, offValue = 0) {\n  if (depth < 2) {\n    throw new Error(`Error in oneHot: depth must be >=2, but it is ${depth}`);\n  }\n  const $indices = convertToTensor(indices, \"indices\", \"oneHot\", \"int32\");\n  const inputs = { indices: $indices };\n  const attrs = { depth, onValue, offValue };\n  return ENGINE.runKernel(OneHot, inputs, attrs);\n}\nvar oneHot = op({ oneHot_ });\nfunction transpose_(x, perm) {\n  const $x = convertToTensor(x, \"x\", \"transpose\");\n  if (perm == null) {\n    perm = $x.shape.map((s, i) => i).reverse();\n  }\n  assert($x.rank === perm.length, () => `Error in transpose: rank of input ${$x.rank} must match length of perm ${perm}.`);\n  perm.forEach((axis) => {\n    assert(axis >= 0 && axis < $x.rank, () => `All entries in 'perm' must be between 0 and ${$x.rank - 1} but got ${perm}`);\n  });\n  if ($x.rank <= 1) {\n    return $x.clone();\n  }\n  const inputs = { x: $x };\n  const attrs = { perm };\n  return ENGINE.runKernel(Transpose, inputs, attrs);\n}\nvar transpose = op({ transpose_ });\nfunction confusionMatrix_(labels, predictions, numClasses) {\n  const $labels = convertToTensor(labels, \"labels\", \"confusionMatrix\");\n  const $predictions = convertToTensor(predictions, \"predictions\", \"confusionMatrix\");\n  assert(numClasses == null || numClasses > 0 && Number.isInteger(numClasses), () => `If provided, numClasses must be a positive integer, but got ${numClasses}`);\n  assert($labels.rank === 1, () => `Expected the rank of labels to be 1, but got ${$labels.rank}`);\n  assert($predictions.rank === 1, () => `Expected the rank of predictions to be 1, but got ${$predictions.rank}`);\n  assert($labels.shape[0] === $predictions.shape[0], () => `Mismatch in the number of examples: ${$labels.shape[0]} vs. ${$predictions.shape[0]}. Labels and predictions should have the same number of elements.`);\n  assert(numClasses > 0 && Number.isInteger(numClasses), () => `numClasses is required to be a positive integer, but got ${numClasses}`);\n  const oneHotLabels = oneHot(cast($labels, \"int32\"), numClasses);\n  const oneHotPredictions = oneHot(cast($predictions, \"int32\"), numClasses);\n  const oneHotLabelsT = transpose(oneHotLabels);\n  const product = matMul(oneHotLabelsT, oneHotPredictions);\n  return cast(product, \"int32\");\n}\nvar confusionMatrix = op({ confusionMatrix_ });\nvar browser_exports = {};\n__export(browser_exports, {\n  fromPixels: () => fromPixels,\n  fromPixelsAsync: () => fromPixelsAsync,\n  toPixels: () => toPixels\n});\nfunction tensor3d(values, shape, dtype) {\n  assertNonNull(values);\n  if (shape != null && shape.length !== 3) {\n    throw new Error(\"tensor3d() requires shape to have three numbers\");\n  }\n  const inferredShape = inferShape(values, dtype);\n  if (inferredShape.length !== 3 && inferredShape.length !== 1) {\n    throw new Error(\"tensor3d() requires values to be number[][][] or flat/TypedArray\");\n  }\n  if (inferredShape.length === 1 && shape == null) {\n    throw new Error(\"tensor3d() requires shape to be provided when `values` are a flat array\");\n  }\n  return makeTensor(values, shape, inferredShape, dtype);\n}\nvar fromPixels2DContext;\nfunction fromPixels_(pixels, numChannels = 3) {\n  if (numChannels > 4) {\n    throw new Error(\"Cannot construct Tensor with more than 4 channels from pixels.\");\n  }\n  if (pixels == null) {\n    throw new Error(\"pixels passed to tf.browser.fromPixels() can not be null\");\n  }\n  let isPixelData2 = false;\n  let isImageData = false;\n  let isVideo = false;\n  let isImage = false;\n  let isCanvasLike = false;\n  let isImageBitmap = false;\n  if (pixels.data instanceof Uint8Array) {\n    isPixelData2 = true;\n  } else if (typeof ImageData !== \"undefined\" && pixels instanceof ImageData) {\n    isImageData = true;\n  } else if (typeof HTMLVideoElement !== \"undefined\" && pixels instanceof HTMLVideoElement) {\n    isVideo = true;\n  } else if (typeof HTMLImageElement !== \"undefined\" && pixels instanceof HTMLImageElement) {\n    isImage = true;\n  } else if (pixels.getContext != null) {\n    isCanvasLike = true;\n  } else if (typeof ImageBitmap !== \"undefined\" && pixels instanceof ImageBitmap) {\n    isImageBitmap = true;\n  } else {\n    throw new Error(`pixels passed to tf.browser.fromPixels() must be either an HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData in browser, or OffscreenCanvas, ImageData in webworker or {data: Uint32Array, width: number, height: number}, but was ${pixels.constructor.name}`);\n  }\n  if (isVideo) {\n    const HAVE_CURRENT_DATA_READY_STATE = 2;\n    if (isVideo && pixels.readyState < HAVE_CURRENT_DATA_READY_STATE) {\n      throw new Error(\"The video element has not loaded data yet. Please wait for `loadeddata` event on the